From de172cfca7b85f34d2885670e3e70914f0f0820a Mon Sep 17 00:00:00 2001 From: spm81 Date: Sun, 24 Mar 2024 23:36:40 +0000 Subject: [PATCH] Update Firmware(s) --- .../my_calibrationUV-5R_PlusSN28910.bin | Bin 0 -> 512 bytes .../my_configUV-5R_PlusSN28910.bin | Bin 0 -> 8192 bytes .../changelog.txt | 60 + .../firmware_IJV_V3.bin | Bin 0 -> 61326 bytes .../useful links.txt | 8 + .../uvk5_IJV_V3_28.py | 2667 +++++++++++++++++ .../Custom_Firmware_by_Matoz_V0.34.0C.bin | Bin 0 -> 60946 bytes .../MCFW_V0.34.0.C_ModVer1.py | 2060 +++++++++++++ .../Matoz Firmware CHIRP MODULE V0.33.0C.py | 30 +- .../README_MCFW_V0.34.0C.md.txt | 228 ++ .../Não confirmado 624603.crdownload | Bin 0 -> 15501 bytes .../cec_0.3BB.bin | Bin 0 -> 61122 bytes .../cec_0.3BC.bin | Bin 0 -> 61174 bytes 13 files changed, 5046 insertions(+), 7 deletions(-) create mode 100644 Doc/My Default Calibration/my_calibrationUV-5R_PlusSN28910.bin create mode 100644 Doc/My Default Config/my_configUV-5R_PlusSN28910.bin create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by IJV (Indiajulietvictor)/firmware_IJV_V3.bin create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by IJV (Indiajulietvictor)/useful links.txt create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by IJV (Indiajulietvictor)/uvk5_IJV_V3_28.py create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/Custom_Firmware_by_Matoz_V0.34.0C.bin create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/MCFW_V0.34.0.C_ModVer1.py create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/README_MCFW_V0.34.0C.md.txt create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by phdlee ( CEC )/Não confirmado 624603.crdownload create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by phdlee ( CEC )/cec_0.3BB.bin create mode 100644 Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by phdlee ( CEC )/cec_0.3BC.bin diff --git a/Doc/My Default Calibration/my_calibrationUV-5R_PlusSN28910.bin b/Doc/My Default Calibration/my_calibrationUV-5R_PlusSN28910.bin new file mode 100644 index 0000000000000000000000000000000000000000..ed598f8c1d7c6990ee36d545a56d86164fe98122 GIT binary patch literal 512 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 +# +# based on template.py Copyright 2012 Dan Smith +# +# +# This is a preliminary version of a driver for the UV-K5 +# It is based on my reverse engineering effort described here: +# https://github.com/sq5bpf/uvk5-reverse-engineering +# +# Warning: this driver is experimental, it may brick your radio, +# eat your lunch and mess up your configuration. +# +# +# 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 of the License, 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. If not, see . +# +# Adapted partially to IJV firmware v2.9 by Julian Lilov (LZ1JDL) +# https://www.universirius.com/en_gb/preppers/quansheng-uv-k5-manuale-del-firmware-ijv/#Firmware-IJV +# +# Adapted to IJV Firmware by Francesco IK8JHL +# FIX: QRA , Beacon/CQ CAll Message, Selettive , TX Enable, PTTID, Squelch A/B, Band TX, Band A/B TX , Singol Band enable, Satcom , Upconverter etc etc +# eliminatte funzioni non attive nel FW IJV +# aggiunta impostazione Tono custom , Hz = Valore /10 +# +# Modificata struttura per renderlo compatibile con la versione 3.00 by IJV +# jhl> fix inserimento frequenze con punto decimale + + + + +from re import A +import struct +import logging + +from chirp import chirp_common, directory, bitwise, memmap, errors, util +from chirp.settings import RadioSetting, RadioSettingGroup, \ + RadioSettingValueBoolean, RadioSettingValueList, \ + RadioSettingValueInteger, RadioSettingValueString, \ + RadioSettings + +LOG = logging.getLogger(__name__) + +# Show the obfuscated version of commands. Not needed normally, but +# might be useful for someone who is debugging a similar radio +DEBUG_SHOW_OBFUSCATED_COMMANDS = False + +# Show the memory being written/received. Not needed normally, because +# this is the same information as in the packet hexdumps, but +# might be useful for someone debugging some obscure memory issue +DEBUG_SHOW_MEMORY_ACTIONS = True + +MEM_FORMAT = """ +// -------------------0x0000 +u8 call_channel; +u8 no_used1; +u8 max_talk_time; +u8 no_used2; +u8 key_lock; +u8 vox_switch; +u8 vox_level; +u8 mic_gain; +// -------------------0x0008 +u8 beep_control; +u8 channel_display_mode; +u8 crossband; +u8 battery_save; +u8 dual_watch; +u8 backlight_auto_mode; +u8 tail_note_elimination; +u8 vfo_lock; +// -------------------0x0010 +u8 flock; +u8 scan_resume_mode; +u8 auto_keypad_lock; +u8 power_on_dispmode; +u8 no_used3; +u8 no_used4; +u8 beacon; + +u8 no_used5:1, + bl_mode:2, + micbar:1, + bat_text:2, + dtmf_live:1, + tx_enable:1; + +// -------------------0x0018 +struct +{ + u8 val; +} agc[7]; + +u8 no_used6:2, + upconv:2, + satcom:1, + signal_meter:1, + single_vfo:1, + no_used6:1; + +// -------------------0x0020 +u8 alarm_mode; +u8 reminding_of_end_talk; +u8 repeater_tail_elimination; +u8 bands_tx; +u8 back_type; +u8 no_used9; +u8 no_used10; +u8 no_used11; +// -------------------0x0028 +struct { + u8 side_tone; + u8 separate_code; + u8 group_call_code; + u8 decode_response; + u8 auto_reset_time; + u8 preload_time; + u8 first_code_persist_time; + u8 hash_persist_time; + u8 code_persist_time; + u8 code_interval_time; +} dtmf_settings; + +// -------------------0x0032 +u16 custom_tone[1]; +u8 no_used12; +u8 no_used13; +u8 no_used14; +u8 no_used15; +// -------------------0x0038 +u8 ch_list; +u16 no_used16; +u16 no_used17; +u16 no_used18; +u8 no_used19; +// -------------------0x0040 +ul32 fmfreq; +ul32 no_used20; +ul32 no_used21; +ul32 no_used22; + +// -------------------0x0150 +#seekto 0x150; +char logo_line1[16]; +char logo_line2[16]; +char qrz_label[8]; + +// -------------------0x0178 +struct +{ + char dtmf_local_code[8]; + char dtmf_up_code[8]; + char dtmf_down_code[8]; +} dtmf_settings_numbers; + +// -------------------0x0190 +u8 key1_shortpress_action; +u8 key1_longpress_action; +u8 key2_shortpress_action; +u8 key2_longpress_action; + +// -------------------0x0198 +#seekto 0x0198; +ul32 custom_upconv; + +// -------------------0x0200 +#seekto 0x200; +struct +{ + char name[8]; + char number[8]; +} dtmfcontact[16]; + +// -------------------0x0300 +struct +{ + char name[8]; +} list_name[16]; + +//------------------------------- preset +// -------------------0x0380 +struct +{ + // ---------------rec 1 + char name[8]; + + // ---------------rec 2 + ul32 freq_low; + ul32 freq_up; + + // ---------------rec 3 + u8 rxcode; + u8 txcode; + + u8 tx_codetype:4, + rx_codetype:4; + + u8 free:1, + writeprot:1, + enablescan:1, + modulation:3, + shift:2; + + u8 busylock:1, + txpower:3, + bw:3, + reverse:1; + + u8 compander:2, + ptt_id:5, + dtmfdec:1; + + u8 squelch:4, + step:4; + + u8 scrambler; + +} preset[12]; + + +// -------------------------------------- Memorie +#seekto 0x0500; +struct +{ + // ---------------rec 1 + 2 + char name[10]; + u8 code_sel0:4, + code_sel1:4; + u8 code_sel2:4, + code_sel3:4; + u8 code_sel4:4, + code_sel5:4; + u8 code_sel6:4, + code_sel7:4; + u8 code_sel8:4, + code_sel9:4; + u8 group:4, + band:4; + + // ---------------rec 3 + ul32 freq; + ul32 offset; + + // ---------------rec 4 + u8 rxcode; + u8 txcode; + + u8 tx_codetype:4, + rx_codetype:4; + + u8 free:1, + writeprot:1, + enablescan:1, + modulation:3, + shift:2; + + u8 busylock:1, + txpower:3, + bw:3, + reverse:1; + + u8 compander:2, + ptt_id:5, + dtmfdec:1; + + u8 squelch:4, + step:4; + + u8 scrambler; + +} channel[200]; + +""" + +# flags1 +FLAGS1_OFFSET_NONE = 0b00 +FLAGS1_OFFSET_MINUS = 0b10 +FLAGS1_OFFSET_PLUS = 0b01 + +# flags2 + +POWER_HIGH = 0b10 +POWER_MEDIUM = 0b01 +POWER_LOW = 0b00 + +BANDWIDTH_WIDE = 0b00 +BANDWIDTH_WIDE_PLUS = 0b11 +BANDWIDTH_NARROW = 0b01 +BANDWIDTH_NARROW_MINUS = 0b10 + +# bandwidth +BANDWIDTH_LIST = ["W", "N", "N-", "W+"] + +MODULATION_LIST = ["FM","AM","USB","CW","WFM"] + +# dtmf_flags +PTTID_LIST = ["off", "DTMF CALL ID", "DTMF BEGIN", "DTMF END", "DTMF BEG+END", "ZVEI1 BEGIN", "ZVEI1 END", + "ZVEI1 BEG+END", "ZVEI2 BEGIN", "ZVEI2 END", "ZVEI2 BEG+END", "CCIR-1F BEGIN", "CCIR-1F END", + "CCIR-1F BEG+END", "CCIR-1 BEGIN", "CCIR-1 END", "CCIR-1 BEG+END", "ROGER Single", + "ROGER 2Tones", "MDC 1200", "Apollo Quindar" ] + +# power +UVK5_POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00), + chirp_common.PowerLevel("Med", watts=2.50), + chirp_common.PowerLevel("High", watts=5.00)] + +# scrambler +SCRAMBLER_LIST = ["Off", "2600Hz", "2700Hz", "2800Hz", "2900Hz", "3000Hz", "3100Hz", "3200Hz", "3300Hz", "3400Hz", "3500Hz"] + +# squelch list +SQUELCH_LIST = ["Squelch 0","Squelch 1","Squelch 2","Squelch 3","Squelch 4","Squelch 5","Squelch 6","Squelch 7","Squelch 8","Squelch 9"] + +# channel display mode +CHANNELDISP_LIST = ["Frequency", "Channel No", "Channel Name", "Name_S Freq_L", "Name_L Freq_S"] + +# Beacon +BEACON_LIST = ["Off","5 Sec","10 Sec","30 Sec","5 min","10 min","20 min"] + +# battery save +BATSAVE_LIST = ["Off", "50%", "67%", "75%", "80%"] + +# compander +COMPANDER_LIST = ["Off", "TX", "RX", "RX/TX"] + +# mic gain +MICGAIN_LIST = ["+1.1dB","+4.0dB","+8.0dB","+12.0dB","+15.1dB"] + +# Talk Time +TALKTIME_LIST = ["Off","30s","1min","3min","5min"] + +# Backlight auto mode +BACKLIGHT_LIST = ["Off", "5s", "10s", "20s", "1min", "3min", "RX/TX", "ON"] + +# Crossband receiving/transmitting +CROSSBAND_LIST = ["Same VFO", "VFO A", "VFO B"] +DUALWATCH_LIST = ["Off", "On"] +BANDS_TX_LIST = ["A","B"] + +# enable scan +SKIP_VALUES = ["", "S", "P"] + +# steps +STEPS = [0.05, 0.25, 1.00, 2.50, 5.00, 6.25, 8.33, 9.00, 10.00, 12.50, 25.00, 50.00, 100.00, 500.00, 1000.00] + +STEP_LIST = ["20 Hz", + "50 Hz", + "250 Hz", + "1 kHz", + "2.5 kHz", + "5 kHz", + "6.25 kHz", + "8.33 kHz", + "9 kHz", + "10 kHz", + "12.5 kHz", + "25 kHz", + "50 kHz", + "100 kHz", + "500 kHz", + "1 MHz"] + +AGC_LIST = ["-98", + "-96", + "-94", + "-92", + "-90", + "-88", + "-86", + "-84", + "-81", + "-79", + "-76", + "-73", + "-70", + "-69", + "-66", + "-63", + "-60", + "-57", + "-55", + "-52", + "-49", + "-47", + "-44", + "-42", + "-39", + "-36", + "-34", + "-32", + "-30", + "-28", + "-26", + "-24", + "-21", + "-18", + "-16", + "-14", + "-12", + "-10", + "-8" , + "-6" , + "-4" , + "-3" , + "-2" , + "0" ] + +AGC_CORR = [18,26,26,26,18,18,18] + +# ctcss/dcs codes +TMODES = ["", "Tone", "DTCS", "DTCS"] +TONE_NONE = 0 +TONE_CTCSS = 1 +TONE_DCS = 2 +TONE_RDCS = 3 + + +CTCSS_TONES = [ + 67.0, 69.3, 71.9, 74.4, 77.0, 79.7, 82.5, 85.4, + 88.5, 91.5, 94.8, 97.4, 100.0, 103.5, 107.2, 110.9, + 114.8, 118.8, 123.0, 127.3, 131.8, 136.5, 141.3, 146.2, + 151.4, 156.7, 159.8, 162.2, 165.5, 167.9, 171.3, 173.8, + 177.3, 179.9, 183.5, 186.2, 189.9, 192.8, 196.6, 199.5, + 203.5, 206.5, 210.7, 218.1, 225.7, 229.1, 233.6, 241.8, + 250.3, 254.1, +] + +# lifted from ft4.py +DTCS_CODES = [ + 23, 25, 26, 31, 32, 36, 43, 47, 51, 53, 54, + 65, 71, 72, 73, 74, 114, 115, 116, 122, 125, 131, + 132, 134, 143, 145, 152, 155, 156, 162, 165, 172, 174, + 205, 212, 223, 225, 226, 243, 244, 245, 246, 251, 252, + 255, 261, 263, 265, 266, 271, 274, 306, 311, 315, 325, + 331, 332, 343, 346, 351, 356, 364, 365, 371, 411, 412, + 413, 423, 431, 432, 445, 446, 452, 454, 455, 462, 464, + 465, 466, 503, 506, 516, 523, 526, 532, 546, 565, 606, + 612, 624, 627, 631, 632, 654, 662, 664, 703, 712, 723, + 731, 732, 734, 743, 754 +] + +FLOCK_LIST = ["Off", "FCC", "CE", "GB", "430", "438"] + +SCANRESUME_LIST = ["TIME: Resume after 5 seconds", + "SLOW: Resume slower after signal disappears", + "FAST: Resume faster after signal disappears", + "SEARCH: Stop scanning after receiving a signal", + "LOG"] + +WELCOME_LIST = ["None", "FW Mod", "Message"] + +RTE_LIST = ["Off", + "1*100ms", "2*100ms", "3*100ms", "4*100ms", "5*100ms", + "6*100ms", "7*100ms", "8*100ms", "9*100ms", "10*100ms", + "11*100ms", "12*100ms", "13*100ms", "14*100ms", "15*100ms", + "16*100ms", "17*100ms", "18*100ms", "19*100ms", "20*100ms"] + +MEM_SIZE = 0x2000 # size of all memory + +PROG_SIZE = 0x1E00 # size of the memory that we will write + +MEM_BLOCK = 0x80 # largest block of memory that we can reliably write + +# fm radio supported frequencies +FMMIN = 76.0 +FMMAX = 108.0 + +# Custom Tone f max +CTMAX = 255.0 + +# bands supported by the UV-K5 +BANDS = { + 0: [15.0, 107.9999], + 1: [108.0, 136.9999], + 2: [137.0, 173.9990], + 3: [174.0, 349.9999], + 4: [350.0, 399.9999], + 5: [400.0, 469.9999], + 6: [470.0, 1299.9999] +} + +SPECIALS = { + # "VFO A1(15-108)": 200, + # "VFO B1(15-108)": 201, + # "VFO A2(108-137)": 202, + # "VFO B2(108-137)": 203, + # "VFO A3(137-174)": 204, + # "VFO B3(137-174)": 205, + # "VFO A4(174-350)": 206, + # "VFO B4(174-350)": 207, + # "VFO A5(350-400)": 208, + # "VFO B5(350-400)": 209, + # "VFO A6(400-470)": 210, + # "VFO B6(400-470)": 211, + # "VFO A7(470-1300)": 212, + # "VFO B7(470-1300)": 213 +} + +VFO_CHANNEL_NAMES = ["F1(50M-76M)A", "F1(50M-76M)B", + "F2(108M-136M)A", "F2(108M-136M)B", + "F3(136M-174M)A", "F3(136M-174M)B", + "F4(174M-350M)A", "F4(174M-350M)B", + "F5(350M-400M)A", "F5(350M-400M)B", + "F6(400M-470M)A", "F6(400M-470M)B", + "F7(470M-600M)A", "F7(470M-600M)B"] + +DTMF_CHARS = "0123456789ABCD*# " +DTMF_CHARS_ID = "0123456789ABCDabcd#* " + +DTMF_CHARS_UPDOWN = "0123456789ABCDabcd#* " +DTMF_CODE_CHARS = "ABCD*# " +DTMF_DECODE_RESPONSE_LIST = ["None", "Ring", "Reply", "Both"] + +KEYACTIONS_LIST = ["None", + "Flashlight", + "TX Power", + "Monitor", + "Scan on/off", + "VOX on/off", + "FM radio on/off", + "VFO Change", + "VFO Swap", + "SQL +", + "SQL -", + "REGA Test", + "REGA Alarm", + "CW Call CQ", + "Preset", + "AGC MAN", + "CH LIST"] + +GROUP_LIST = ["No Group", + "Group 1", + "Group 2", + "Group 3", + "Group 4", + "Group 5", + "Group 6", + "Group 7", + "Group 8", + "Group 9", + "Group 10", + "Group 11", + "Group 12", + "Group 13", + "Group 14", + "Group 15"] + +UPCONV_LIST = ["Off","50", "125","CUSTOM"] + +EMPTY_MEM = [0,0,0,0,0,0,0,0,0,0,0xEE,0xEE,0xEE,0xEE,0xEE,0, + 0,0,0,0,0,0,0,0,0,0,0 ,0 ,0 ,0 ,0 ,0] + + +#-------------------------------------------------------------------------------- +# nibble to ascii +def hexasc(data): + res = data + if res<=9: + return chr(res+48) + elif data == 0xA: + return "A" + elif data == 0xB: + return "B" + elif data == 0xC: + return "C" + elif data == 0xD: + return "D" + elif data == 0xF: + return "F" + else: + return " " + +#-------------------------------------------------------------------------------- +# nibble to ascii +def ascdec(data): + + if data == "0": + return 0 + elif data == "1": + return 1 + elif data == "2": + return 2 + elif data == "3": + return 3 + elif data == "4": + return 4 + elif data == "5": + return 5 + elif data == "6": + return 6 + elif data == "7": + return 7 + elif data == "8": + return 8 + elif data == "9": + return 9 + elif data == "A": + return 10 + elif data == "B": + return 11 + elif data == "C": + return 12 + elif data == "D": + return 13 + elif data == "F": + return 15 + else: + return 14 + + +#-------------------------------------------------------------------------------- +# the communication is obfuscated using this fine mechanism +def xorarr(data: bytes): + tbl = [22, 108, 20, 230, 46, 145, 13, 64, 33, 53, 213, 64, 19, 3, 233, 128] + x = b"" + r = 0 + for byte in data: + x += bytes([byte ^ tbl[r]]) + r = (r+1) % len(tbl) + return x + +#-------------------------------------------------------------------------------- +# if this crc was used for communication to AND from the radio, then it +# would be a measure to increase reliability. +# but it's only used towards the radio, so it's for further obfuscation +def calculate_crc16_xmodem(data: bytes): + poly = 0x1021 + crc = 0x0 + for byte in data: + crc = crc ^ (byte << 8) + for i in range(8): + crc = crc << 1 + if (crc & 0x10000): + crc = (crc ^ poly) & 0xFFFF + return crc & 0xFFFF + +#-------------------------------------------------------------------------------- +def _send_command(serport, data: bytes): + """Send a command to UV-K5 radio""" + LOG.debug("Sending command (unobfuscated) len=0x%4.4x:\n%s" % + (len(data), util.hexprint(data))) + + crc = calculate_crc16_xmodem(data) + data2 = data + struct.pack("HBB", 0xabcd, len(data), 0) + \ + xorarr(data2) + \ + struct.pack(">H", 0xdcba) + if DEBUG_SHOW_OBFUSCATED_COMMANDS: + LOG.debug("Sending command (obfuscated):\n%s" % util.hexprint(command)) + try: + result = serport.write(command) + except Exception: + raise errors.RadioError("Error writing data to radio") + return result + +#-------------------------------------------------------------------------------- +def _receive_reply(serport): + header = serport.read(4) + if len(header) != 4: + LOG.warning("Header short read: [%s] len=%i" % + (util.hexprint(header), len(header))) + raise errors.RadioError("Header short read") + if header[0] != 0xAB or header[1] != 0xCD or header[3] != 0x00: + LOG.warning("Bad response header: %s len=%i" % + (util.hexprint(header), len(header))) + raise errors.RadioError("Bad response header") + + cmd = serport.read(int(header[2])) + if len(cmd) != int(header[2]): + LOG.warning("Body short read: [%s] len=%i" % + (util.hexprint(cmd), len(cmd))) + raise errors.RadioError("Command body short read") + + footer = serport.read(4) + + if len(footer) != 4: + LOG.warning("Footer short read: [%s] len=%i" % + (util.hexprint(footer), len(footer))) + raise errors.RadioError("Footer short read") + + if footer[2] != 0xDC or footer[3] != 0xBA: + LOG.debug( + "Reply before bad response footer (obfuscated)" + "len=0x%4.4x:\n%s" % (len(cmd), util.hexprint(cmd))) + LOG.warning("Bad response footer: %s len=%i" % + (util.hexprint(footer), len(footer))) + raise errors.RadioError("Bad response footer") + + if DEBUG_SHOW_OBFUSCATED_COMMANDS: + LOG.debug("Received reply (obfuscated) len=0x%4.4x:\n%s" % + (len(cmd), util.hexprint(cmd))) + + cmd2 = xorarr(cmd) + + LOG.debug("Received reply (unobfuscated) len=0x%4.4x:\n%s" % + (len(cmd2), util.hexprint(cmd2))) + + return cmd2 + +#-------------------------------------------------------------------------------- +def _getstring(data: bytes, begin, maxlen): + tmplen = min(maxlen+1, len(data)) + s = [data[i] for i in range(begin, tmplen)] + for key, val in enumerate(s): + if val < ord(' ') or val > ord('~'): + break + return ''.join(chr(x) for x in s[0:key]) + +#-------------------------------------------------------------------------------- +def _sayhello(serport): + hellopacket = b"\x14\x05\x04\x00\x6a\x39\x57\x64" + + tries = 5 + while True: + LOG.debug("Sending hello packet") + _send_command(serport, hellopacket) + o = _receive_reply(serport) + if (o): + break + tries -= 1 + if tries == 0: + LOG.warning("Failed to initialise radio") + raise errors.RadioError("Failed to initialize radio") + firmware = _getstring(o, 4, 16) + LOG.info("Found firmware: %s" % firmware) + return firmware + +#-------------------------------------------------------------------------------- +def _readmem(serport, offset, length): + LOG.debug("Sending readmem offset=0x%4.4x len=0x%4.4x" % (offset, length)) + + readmem = b"\x1b\x05\x08\x00" + \ + struct.pack("> 8) & 0xff): + return True + else: + LOG.warning("Bad data from writemem") + raise errors.RadioError("Bad response to writemem") + +#-------------------------------------------------------------------------------- +def _resetradio(serport): + resetpacket = b"\xdd\x05\x00\x00" + _send_command(serport, resetpacket) + +#-------------------------------------------------------------------------------- +def do_download(radio): + serport = radio.pipe + serport.timeout = 0.5 + status = chirp_common.Status() + status.cur = 0 + status.max = MEM_SIZE + status.msg = "Downloading from radio" + radio.status_fn(status) + + eeprom = b"" + f = _sayhello(serport) + if f: + radio.FIRMWARE_VERSION = f + else: + raise errors.RadioError('Unable to determine firmware version') + + addr = 0 + while addr < MEM_SIZE: + o = _readmem(serport, addr, MEM_BLOCK) + status.cur = addr + radio.status_fn(status) + + if o and len(o) == MEM_BLOCK: + eeprom += o + addr += MEM_BLOCK + else: + raise errors.RadioError("Memory download incomplete") + + return memmap.MemoryMapBytes(eeprom) + +#-------------------------------------------------------------------------------- +def do_upload(radio): + serport = radio.pipe + serport.timeout = 0.5 + status = chirp_common.Status() + status.cur = 0 + status.max = PROG_SIZE + status.msg = "Uploading to radio" + radio.status_fn(status) + + f = _sayhello(serport) + if f: + radio.FIRMWARE_VERSION = f + else: + return False + + addr = 0 + while addr < PROG_SIZE: + o = radio.get_mmap()[addr:addr+MEM_BLOCK] + _writemem(serport, o, addr) + status.cur = addr + radio.status_fn(status) + if o: + addr += MEM_BLOCK + else: + raise errors.RadioError("Memory upload incomplete") + status.msg = "Uploaded OK" + + _resetradio(serport) + + return True + +#-------------------------------------------------------------------------------- +def _find_band(hz): + mhz = hz/1000000.0 + + B = BANDS + + for a in B: + if mhz >= B[a][0] and mhz <= B[a][1]: + return a + + return False + +################################################################################################################################ + +################################################################################################################################ + +@directory.register +class UVK5Radio(chirp_common.CloneModeRadio): + """Quansheng UV-K5""" + VENDOR = "Quansheng" + MODEL = "UV-K5" + VARIANT = "IJV_V3" + BAUD_RATE = 38400 + NEEDS_COMPAT_SERIAL = False + FIRMWARE_VERSION = "300" + _expanded_limits = True + +#-------------------------------------------------------------------------------- + def get_prompts(x=None): + rp = chirp_common.RadioPrompts() + rp.experimental = _( + 'This is an experimental driver for the Quansheng UV-K5. ' + 'It may harm your radio, or worse. Use at your own risk.\n\n' + 'Before attempting to do any changes please download ' + 'the memory image from the radio with chirp ' + 'and keep it. This can be later used to recover the ' + 'original settings. \n\n' + 'some details are not yet implemented') + rp.pre_download = _( + "1. Turn radio on.\n" + "2. Connect cable to mic/spkr connector.\n" + "3. Make sure connector is firmly connected.\n" + "4. Click OK to download image from device.\n\n" + "It will may not work if you turn on the radio " + "with the cable already attached\n") + rp.pre_upload = _( + "1. Turn radio on.\n" + "2. Connect cable to mic/spkr connector.\n" + "3. Make sure connector is firmly connected.\n" + "4. Click OK to upload the image to device.\n\n" + "It will may not work if you turn on the radio " + "with the cable already attached") + return rp + +#-------------------------------------------------------------------------------- # Return information about this radio's features, including + # how many memories it has, what bands it supports, etc + def get_features(self): + rf = chirp_common.RadioFeatures() + rf.has_bank = False + rf.has_rx_dtcs = True + rf.has_ctone = True + rf.has_settings = True + rf.has_comment = False + + rf.valid_dtcs_codes = DTCS_CODES + rf.valid_name_length = 10 + rf.valid_power_levels = UVK5_POWER_LEVELS + rf.valid_special_chans = list(SPECIALS.keys()) + rf.valid_duplexes = ["", "-", "+", "OFF"] + rf.valid_tuning_steps = STEPS + rf.valid_tmodes = ["", "Tone", "TSQL", "DTCS", "Cross"] + rf.valid_cross_modes = ["Tone->Tone", "Tone->DTCS", "DTCS->Tone","->Tone", "->DTCS", "DTCS->", "DTCS->DTCS"] + rf.valid_characters = chirp_common.CHARSET_ASCII + rf.valid_modes = ["FM", "AM", "USB", "CW", "WFM"] + rf.valid_skips = ["", "S"] + rf._expanded_limits = True + + # This radio supports memories 1-200, 201-214 are the VFO memories + rf.memory_bounds = (1, 200) + + rf.valid_bands = [] + for a in BANDS: + rf.valid_bands.append( + (int(BANDS[a][0]*1000000), + int(BANDS[a][1]*1000000))) + return rf +#-------------------------------------------------------------------------------- + # Do a download of the radio from the serial port + def sync_in(self): + self._mmap = do_download(self) + self.process_mmap() +#-------------------------------------------------------------------------------- + # Do an upload of the radio to the serial port + def sync_out(self): + do_upload(self) +#-------------------------------------------------------------------------------- + # Convert the raw byte array into a memory object structure + def process_mmap(self): + self._memobj = bitwise.parse(MEM_FORMAT, self._mmap) +#-------------------------------------------------------------------------------- + # Return a raw representation of the memory object, which + # is very helpful for development + def get_raw_memory(self, number): + return repr(self._memobj.channel[number-1]) +#-------------------------------------------------------------------------------- VALIDAZIONE MEMORIA + def validate_memory(self, mem): + msgs = super().validate_memory(mem) + + if mem.duplex == 'off': + return msgs + + # find tx frequency + if mem.duplex == '-': + txfreq = mem.freq - mem.offset + elif mem.duplex == '+': + txfreq = mem.freq + mem.offset + else: + txfreq = mem.freq + + # find band + band = _find_band(txfreq) + if band is False: + msg = "Transmit frequency %.4f MHz is not supported by this radio" % (txfreq/1000000.0) + msgs.append(chirp_common.ValidationError(msg)) + + band = _find_band(mem.freq) + if band is False: + msg = "The frequency %.4f MHz is not supported by this radio" % (mem.freq/1000000.0) + msgs.append(chirp_common.ValidationError(msg)) + + return msgs +#-------------------------------------------------------------------------------- IMPOSTA TONI + def _set_tone(self, mem, _mem): + ((txmode, txtone, txpol), + (rxmode, rxtone, rxpol)) = chirp_common.split_tone_encode(mem) + + if txmode == "Tone": + txtoval = CTCSS_TONES.index(txtone) + txmoval = 0b01 + elif txmode == "DTCS": + txmoval = txpol == "R" and 0b11 or 0b10 + txtoval = DTCS_CODES.index(txtone) + else: + txmoval = 0 + txtoval = 0 + + if rxmode == "Tone": + rxtoval = CTCSS_TONES.index(rxtone) + rxmoval = 0b01 + elif rxmode == "DTCS": + rxmoval = rxpol == "R" and 0b11 or 0b10 + rxtoval = DTCS_CODES.index(rxtone) + else: + rxmoval = 0 + rxtoval = 0 + + _mem.rx_codetype = rxmoval + _mem.tx_codetype = txmoval + _mem.rxcode = rxtoval + _mem.txcode = txtoval + +#-------------------------------------------------------------------------------- LEGGI TONI + def _get_tone(self, mem, _mem): + rxtype = _mem.rx_codetype + txtype = _mem.tx_codetype + + rx_tmode = TMODES[rxtype] + tx_tmode = TMODES[txtype] + + rx_tone = tx_tone = None + + if tx_tmode == "Tone": + if _mem.txcode < len(CTCSS_TONES): + tx_tone = CTCSS_TONES[_mem.txcode] + else: + tx_tone = 0 + tx_tmode = "" + elif tx_tmode == "DTCS": + if _mem.txcode < len(DTCS_CODES): + tx_tone = DTCS_CODES[_mem.txcode] + else: + tx_tone = 0 + tx_tmode = "" + + if rx_tmode == "Tone": + if _mem.rxcode < len(CTCSS_TONES): + rx_tone = CTCSS_TONES[_mem.rxcode] + else: + rx_tone = 0 + rx_tmode = "" + elif rx_tmode == "DTCS": + if _mem.rxcode < len(DTCS_CODES): + rx_tone = DTCS_CODES[_mem.rxcode] + else: + rx_tone = 0 + rx_tmode = "" + + tx_pol = txtype == 0x03 and "R" or "N" + rx_pol = rxtype == 0x03 and "R" or "N" + + chirp_common.split_tone_decode(mem, (tx_tmode, tx_tone, tx_pol),(rx_tmode, rx_tone, rx_pol)) + + +################################################################################################################################ +# L E T T U R A M E M O R I E +################################################################################################################################ + +#-------------------------------------------------------------------------------- + # Extract a high-level memory object from the low-level memory map + # This is called to populate a memory in the UI + def get_memory(self, number2): + + mem = chirp_common.Memory() + + if isinstance(number2, str): + number = SPECIALS[number2] + mem.extd_number = number2 + else: + number = number2 - 1 + + mem.number = number + 1 + + _mem = self._memobj.channel[number] + + tmpcomment = "" + + is_empty = False + # We'll consider any blank (i.e. 0 MHz frequency) to be empty + if (_mem.freq == 0xffffffff) or (_mem.freq == 0): + is_empty = True + + if is_empty: + mem.empty = True + # set some sane defaults: + mem.power = UVK5_POWER_LEVELS[2] + mem.extra = RadioSettingGroup("Extra", "extra") + + rs = RadioSetting("bandwidth", "Bandwidth", RadioSettingValueList(BANDWIDTH_LIST, BANDWIDTH_LIST[0])) + mem.extra.append(rs) + + rs = RadioSetting("frev", "FreqRev", RadioSettingValueBoolean(False)) + mem.extra.append(rs) + + rs = RadioSetting("pttid", "PTTID", RadioSettingValueList(PTTID_LIST, PTTID_LIST[0])) + mem.extra.append(rs) + + rs = RadioSetting("dtmfdecode", _("DTMF decode"), RadioSettingValueBoolean(False)) + mem.extra.append(rs) + + rs = RadioSetting("scrambler", _("Scrambler"), RadioSettingValueList(SCRAMBLER_LIST, SCRAMBLER_LIST[0])) + mem.extra.append(rs) + + rs = RadioSetting("compander", _("Compander"), RadioSettingValueList(COMPANDER_LIST, COMPANDER_LIST[0])) + mem.extra.append(rs) + + rs = RadioSetting("squelch", _("Squelch"), RadioSettingValueList(SQUELCH_LIST, SQUELCH_LIST[1])) + mem.extra.append(rs) + + rs = RadioSetting("writeprot", _("Write Protect"), RadioSettingValueBoolean(False)) + mem.extra.append(rs) + + rs = RadioSetting("group", "Group", RadioSettingValueList(GROUP_LIST, GROUP_LIST[0])) + mem.extra.append(rs) + + rs = RadioSetting("busylock", "Busy Lock", RadioSettingValueBoolean(False)) + mem.extra.append(rs) + + # actually the step and duplex are overwritten by chirp based on + # bandplan. they are here to document sane defaults for IARU r1 + # mem.tuning_step = 25.0 + # mem.duplex = "" + + return mem + + if number > 199: + mem.immutable = ["name", "scanlists"] + else: + _mem2 = self._memobj.channel[number] + for char in _mem2.name: + if str(char) == "\xFF" or str(char) == "\x00": + break + mem.name += str(char) + + tag = mem.name.strip() + mem.name = tag + + # Convert your low-level frequency to Hertz + mem.freq = int(_mem.freq)*10 + mem.offset = int(_mem.offset)*10 + + if (mem.offset == 0): + mem.duplex = '' + else: + if _mem.shift == FLAGS1_OFFSET_MINUS: + if _mem.freq == _mem.offset: + # fake tx disable by setting tx to 0 MHz + mem.duplex = 'off' + mem.offset = 0 + else: + mem.duplex = '-' + elif _mem.shift == FLAGS1_OFFSET_PLUS: + mem.duplex = '+' + else: + mem.duplex = '' + + # tone data + self._get_tone(mem, _mem) + + # mode + mem.mode = MODULATION_LIST[_mem.modulation] + + # tuning step + tstep = _mem.step + if tstep < len(STEPS): + mem.tuning_step = STEPS[tstep] + else: + mem.tuning_step = 0.02 + + # enable scan + mem.skip = SKIP_VALUES[_mem.enablescan] + + # power + if _mem.txpower == POWER_HIGH: + mem.power = UVK5_POWER_LEVELS[2] + elif _mem.txpower == POWER_MEDIUM: + mem.power = UVK5_POWER_LEVELS[1] + else: + mem.power = UVK5_POWER_LEVELS[0] + + # We'll consider any blank (i.e. 0 MHz frequency) to be empty + if (_mem.freq == 0xffffffff) or (_mem.freq == 0): + mem.empty = True + else: + mem.empty = False + + mem.extra = RadioSettingGroup("Extra", "extra") + + # bandwidth + bwidth = _mem.bw + if bwidth > len(BANDWIDTH_LIST): + bwidth = 0 + rs = RadioSetting("bandwidth", "Bandwidth", RadioSettingValueList(BANDWIDTH_LIST, BANDWIDTH_LIST[bwidth])) + mem.extra.append(rs) + tmpcomment += "bandwidth:"+BANDWIDTH_LIST[bwidth]+" " + + # Group List + group = _mem.group + if group > len(GROUP_LIST): + group = 0 + rs = RadioSetting("group", "Group", RadioSettingValueList(GROUP_LIST, GROUP_LIST[group])) + mem.extra.append(rs) + tmpcomment += GROUP_LIST[group]+" " + + # Frequency reverse - whatever that means, don't see it in the manual + is_frev = bool(_mem.reverse > 0) + rs = RadioSetting("frev", "FreqRev", RadioSettingValueBoolean(is_frev)) + mem.extra.append(rs) + tmpcomment += "FreqReverse:"+(is_frev and "ON" or "off")+" " + + # PTTID + pttid = _mem.ptt_id + if pttid > len(PTTID_LIST): + pttid = 0 + rs = RadioSetting("pttid", "PTTID", RadioSettingValueList(PTTID_LIST, PTTID_LIST[pttid])) + mem.extra.append(rs) + tmpcomment += "PTTid:"+PTTID_LIST[pttid]+" " + + # CODICI SELETTIVE + + codesel = hexasc(_mem.code_sel0) + \ + hexasc(_mem.code_sel1) + \ + hexasc(_mem.code_sel2) + \ + hexasc(_mem.code_sel3) + \ + hexasc(_mem.code_sel4) + \ + hexasc(_mem.code_sel5) + \ + hexasc(_mem.code_sel6) + \ + hexasc(_mem.code_sel7) + \ + hexasc(_mem.code_sel8) + \ + hexasc(_mem.code_sel9) + + rs = RadioSetting("codesel", "Code PTTID", RadioSettingValueString(0, 10, codesel)) + mem.extra.append(rs) + tmpcomment += "PTTid Codes:"+codesel+" " + + # DTMF DECODE + is_dtmf = bool(_mem.dtmfdec > 0) + rs = RadioSetting("dtmfdecode", _("DTMF decode"), RadioSettingValueBoolean(is_dtmf)) + mem.extra.append(rs) + tmpcomment += "DTMFdecode:"+(is_dtmf and "ON" or "off")+" " + + # Scrambler + if _mem.scrambler < len(SCRAMBLER_LIST): + enc = _mem.scrambler + else: + enc = 0 + + rs = RadioSetting("scrambler", _("Scrambler"), RadioSettingValueList(SCRAMBLER_LIST, SCRAMBLER_LIST[enc])) + mem.extra.append(rs) + tmpcomment += "Scrambler:"+SCRAMBLER_LIST[enc]+" " + + # compander + comp = _mem.compander + rs = RadioSetting("compander", _("Compander"), RadioSettingValueList(COMPANDER_LIST, COMPANDER_LIST[comp])) + mem.extra.append(rs) + tmpcomment += "Compander:"+COMPANDER_LIST[comp]+" " + + # Squelch + if _mem.squelch < len(SQUELCH_LIST): + sql = _mem.squelch + else: + sql = 1 + + rs = RadioSetting("squelch", _("Squelch"), RadioSettingValueList(SQUELCH_LIST, SQUELCH_LIST[sql])) + mem.extra.append(rs) + tmpcomment += SQUELCH_LIST[sql]+" " + + # BusyLock + bl = bool(_mem.busylock > 0) + rs = RadioSetting("busylock", "Busy Lock", RadioSettingValueBoolean(bl)) + mem.extra.append(rs) + tmpcomment += "Busy Lock:"+(bl and "ON" or "off")+" " + + # Write Protect + wp = bool(_mem.writeprot > 0) + rs = RadioSetting("writeprot", _("Write Protect"), RadioSettingValueBoolean(wp)) + mem.extra.append(rs) + tmpcomment += "Write Protect:"+(wp and "ON" or "off")+" " + + return mem + + +################################################################################################################################ +# S A L V A T A G G I O M E M O R I E +################################################################################################################################ + +#-------------------------------------------------------------------------------- + # Store details about a high-level memory to the memory map + # This is called when a user edits a memory in the UI + def set_memory(self, mem): + number = mem.number-1 + + if number > 200: + return mem + + # Get a low-level memory object mapped to the image + _mem = self._memobj.channel[number] + + # this was an empty memory + if _mem.get_raw(asbytes=False)[0] == "\xff": + _mem.set_raw("\x00" * 32) + _mem.code_sel0 = 14 + _mem.code_sel1 = 14 + _mem.code_sel2 = 14 + _mem.code_sel3 = 14 + _mem.code_sel4 = 14 + _mem.code_sel5 = 14 + _mem.code_sel6 = 14 + _mem.code_sel7 = 14 + _mem.code_sel8 = 14 + _mem.code_sel9 = 14 + + # find band + _mem.band = _find_band(mem.freq) + + # mode + + _mem.modulation = MODULATION_LIST.index(mem.mode) + + # frequency/offset + _mem.freq = mem.freq/10 + _mem.offset = mem.offset/10 + + if mem.duplex == "": + _mem.offset = 0 + _mem.shift = 0 + elif mem.duplex == '-': + _mem.shift = FLAGS1_OFFSET_MINUS + elif mem.duplex == '+': + _mem.shift = FLAGS1_OFFSET_PLUS + elif mem.duplex == 'off': + # + _mem.shift = FLAGS1_OFFSET_MINUS + _mem.offset = _mem.freq + + # name + tag = mem.name.ljust(10) + _mem.name = tag + + # tone data + self._set_tone(mem, _mem) + + # step + _mem.step = STEPS.index(mem.tuning_step) + + # tx power + if str(mem.power) == str(UVK5_POWER_LEVELS[2]): + _mem.txpower = POWER_HIGH + elif str(mem.power) == str(UVK5_POWER_LEVELS[1]): + _mem.txpower = POWER_MEDIUM + else: + _mem.txpower = POWER_LOW + + # enable scan + _mem.enablescan = SKIP_VALUES.index(mem.skip) + + #extra + for setting in mem.extra: + sname = setting.get_name() + svalue = setting.value.get_value() + + if sname == "bandwidth": + _mem.bw = BANDWIDTH_LIST.index(svalue) + + if sname == "pttid": + _mem.ptt_id = PTTID_LIST.index(svalue) + + if sname == "frev": + _mem.reverse = svalue and 1 or 0 + + if sname == "dtmfdecode": + _mem.dtmfdec = svalue and 1 or 0 + + if sname == "scrambler": + _mem.scrambler = (_mem.scrambler & 0xf0) | SCRAMBLER_LIST.index(svalue) + + if sname == "compander": + _mem.compander = (_mem.compander & 0xf0) | COMPANDER_LIST.index(svalue) + + if sname == "group": + _mem.group = GROUP_LIST.index(svalue) + + if sname == "squelch": + _mem.squelch = SQUELCH_LIST.index(svalue) + + if sname == "busylock": + _mem.busylock = svalue and 1 or 0 + + if sname == "writeprot": + _mem.writeprot = svalue and 1 or 0 + + if sname == "codesel": + _mem.code_sel0 = ascdec(svalue[0]) + _mem.code_sel1 = ascdec(svalue[1]) + _mem.code_sel2 = ascdec(svalue[2]) + _mem.code_sel3 = ascdec(svalue[3]) + _mem.code_sel4 = ascdec(svalue[4]) + _mem.code_sel5 = ascdec(svalue[5]) + _mem.code_sel6 = ascdec(svalue[6]) + _mem.code_sel7 = ascdec(svalue[7]) + _mem.code_sel8 = ascdec(svalue[8]) + _mem.code_sel9 = ascdec(svalue[9]) + + if _mem.freq == 0: + _mem.set_raw("\xFF" * 32) + _mem.code_sel0 = 14 + _mem.code_sel1 = 14 + _mem.code_sel2 = 14 + _mem.code_sel3 = 14 + _mem.code_sel4 = 14 + _mem.code_sel5 = 14 + _mem.code_sel6 = 14 + _mem.code_sel7 = 14 + _mem.code_sel8 = 14 + _mem.code_sel9 = 14 + + return mem + + +################################################################################################################################ +# L E T T U R A S E T T I N G S +################################################################################################################################ + +#-------------------------------------------------------------------------------- + def get_settings(self): + _mem = self._memobj + + basic = RadioSettingGroup("basic", "Basic Settings") + agc = RadioSettingGroup("agc", "RFGain Settings") + keya = RadioSettingGroup("keya", "Programmable keys") + dtmf = RadioSettingGroup("dtmf", "DTMF/Selcall Settings") + dtmfc = RadioSettingGroup("dtmfc", "DTMF Contacts") + lstn = RadioSettingGroup("lstn", "Memory Group") + preset= RadioSettingGroup("preset", "Preset List") + roinfo = RadioSettingGroup("roinfo", _("Driver information")) + + top = RadioSettings( basic, agc, keya, dtmf, dtmfc, lstn, preset, roinfo ) +#-------------------------------------------------------------------------------- + # helper function + def append_label(radio_setting, label, descr=""): + if not hasattr(append_label, 'idx'): + append_label.idx = 0 + + val = RadioSettingValueString(len(descr), len(descr), descr) + val.set_mutable(False) + rs = RadioSetting("label" + str(append_label.idx), label, val) + append_label.idx += 1 + radio_setting.append(rs) + + append_label(keya,"_" * 30 + " Programmable Key " + "_" * 274, "_" * 300) + + #********************************************************************************** SEZIONE TASTI PROGRAMMABILI + # Programmable keys + tmpval = int(_mem.key1_shortpress_action) + if tmpval >= len(KEYACTIONS_LIST): + tmpval = 0 + rs = RadioSetting("key1_shortpress_action", "Side key 1 short press", + RadioSettingValueList(KEYACTIONS_LIST, KEYACTIONS_LIST[tmpval])) + keya.append(rs) + + tmpval = int(_mem.key1_longpress_action) + if tmpval >= len(KEYACTIONS_LIST): + tmpval = 0 + rs = RadioSetting("key1_longpress_action", "Side key 1 long press", + RadioSettingValueList(KEYACTIONS_LIST, KEYACTIONS_LIST[tmpval])) + keya.append(rs) + + tmpval = int(_mem.key2_shortpress_action) + if tmpval >= len(KEYACTIONS_LIST): + tmpval = 0 + rs = RadioSetting("key2_shortpress_action", "Side key 2 short press", + RadioSettingValueList(KEYACTIONS_LIST, KEYACTIONS_LIST[tmpval])) + keya.append(rs) + + tmpval = int(_mem.key2_longpress_action) + if tmpval >= len(KEYACTIONS_LIST): + tmpval = 0 + rs = RadioSetting("key2_longpress_action", "Side key 2 long press", + RadioSettingValueList(KEYACTIONS_LIST, KEYACTIONS_LIST[tmpval])) + keya.append(rs) + + append_label(keya," " * 40 + "| | " ) + append_label(keya," " * 40 + "| | " ) + append_label(keya," " * 40 + "| | " ) + append_label(keya," " * 40 + "| | " ) + append_label(keya," " * 40 + "| |___________ | |" ) + append_label(keya," " * 40 + "| _____________ /" ) + append_label(keya," " * 39 +"|| | | |" ) + append_label(keya," " * 30 +"PTT |" "| | | |" ) + append_label(keya," " * 39 +" | |_____________| |" ) + append_label(keya," " * 21 +"Side key 1 |" "| / / / / |" ) + append_label(keya," " * 21 +"Side key 2 |" "| / / / / |" ) + append_label(keya," " * 41 + "| |" ) + append_label(keya," " * 41 + "| |" ) + append_label(keya," " * 41 + "| |" ) + append_label(keya," " * 41 + "|_________________ |" ) + + + + #********************************************************************************** SEZIONE DTMF + append_label(dtmf, "_" * 30 + " DTMF Setting " + "_" * 274, "_" * 300) + + # DTMF settings + tmppr = bool(_mem.dtmf_settings.side_tone > 0) + rs = RadioSetting("dtmf_side_tone","DTMF/SELCALL Sidetone",RadioSettingValueBoolean(tmppr)) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings.separate_code) + if tmpval not in DTMF_CODE_CHARS: + tmpval = '*' + val = RadioSettingValueString(1, 1, tmpval) + val.set_charset(DTMF_CODE_CHARS) + rs = RadioSetting("dtmf_separate_code", "Separate Code", val) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings.group_call_code) + if tmpval not in DTMF_CODE_CHARS: + tmpval = '#' + val = RadioSettingValueString(1, 1, tmpval) + val.set_charset(DTMF_CODE_CHARS) + rs = RadioSetting("group_call_code", "Group Call Code", val) + dtmf.append(rs) + + tmpval = _mem.dtmf_settings.decode_response + if tmpval >= len(DTMF_DECODE_RESPONSE_LIST): + tmpval = 0 + rs = RadioSetting("dtmf_decode_response", "Decode Response",RadioSettingValueList(DTMF_DECODE_RESPONSE_LIST,DTMF_DECODE_RESPONSE_LIST[tmpval])) + dtmf.append(rs) + + tmpval = _mem.dtmf_settings.auto_reset_time + if tmpval > 60 or tmpval < 5: + tmpval = 5 + rs = RadioSetting("dtmf_auto_reset_time","Auto reset time (s)",RadioSettingValueInteger(5, 60, tmpval)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.preload_time) + if tmpval > 100 or tmpval < 3: # se leggero' un valore maggiore di 100(x10) o meno di 3(x10) + tmpval = 30 # il valore verrà impostato a 30 + tmpval *= 10 # moltiplico per 10 + rs = RadioSetting("dtmf_preload_time","Pre-load time (ms)",RadioSettingValueInteger(30, 1000, tmpval, 10)) # 30 minimo 1000 massimo ,con step di 10 + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.first_code_persist_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_first_code_persist_time","First code persist time (ms)",RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.hash_persist_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_hash_persist_time","#/* persist time (ms)",RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.code_persist_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_code_persist_time","Code persist time (ms)",RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.code_interval_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_code_interval_time","Code interval time (ms)",RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings_numbers.dtmf_local_code).upper().strip("\x00\xff\x20") + + for i in tmpval: + if i in DTMF_CHARS_ID: + continue + else: + tmpval = "103" + break + val = RadioSettingValueString(1, 8, tmpval) + val.set_charset(DTMF_CHARS_ID) + rs = RadioSetting("dtmf_dtmf_local_code","Own ID (1-8 chars 0-9 ABCD)", val) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings_numbers.dtmf_up_code).upper().strip("\x00\xff\x20") + + for i in tmpval: + if i in DTMF_CHARS_UPDOWN or i == "": + continue + else: + tmpval = "123" + break + val = RadioSettingValueString(1, 8, tmpval) + val.set_charset(DTMF_CHARS_UPDOWN) + rs = RadioSetting("dtmf_dtmf_up_code","Up code (1-8 chars 0-9 ABCD*#)", val) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings_numbers.dtmf_down_code).upper().strip("\x00\xff\x20") + + for i in tmpval: + if i in DTMF_CHARS_UPDOWN: + continue + else: + tmpval = "456" + break + val = RadioSettingValueString(1, 8, tmpval) + val.set_charset(DTMF_CHARS_UPDOWN) + rs = RadioSetting("dtmf_dtmf_down_code","Down code (1-8 chars 0-9 ABCD*#)", val) + dtmf.append(rs) + + # append_label(dtmfc, + # "_" * 30 + " DTMF Contact List " + "_" * 274, "_" * 300) + + val = RadioSettingValueString(0, 80, + "All DTMF Contacts are 3 codes " + "(valid: 0-9 * # ABCD), " + "or an empty string") + val.set_mutable(False) + rs = RadioSetting("dtmf_descr1", "DTMF Contacts", val) + dtmfc.append(rs) + + + for i in range(1, 17): + varname = "DTMF_"+str(i) + varnumname = "DTMFNUM_"+str(i) + vardescr = "DTMF Contact "+str(i)+" name" + varinumdescr = "DTMF Contact "+str(i)+" number" + + cntn = str(_mem.dtmfcontact[i-1].name).strip("\x20\x00\xff") + cntnum = str(_mem.dtmfcontact[i-1].number).strip("\x20\x00\xff") + + val = RadioSettingValueString(0, 8, cntn) + rs = RadioSetting(varname, vardescr, val) + dtmfc.append(rs) + + val = RadioSettingValueString(0, 3, cntnum) + val.set_charset(DTMF_CHARS) + rs = RadioSetting(varnumname, varinumdescr, val) + dtmfc.append(rs) + + #********************************************************************************** SEZIONE GRUPPI O LISTE + # S-LIST + tmpmax = _mem.ch_list + if tmpmax >= len(GROUP_LIST): + tmpmax = GROUP_LIST.index("none") + rs = RadioSetting("ch_list","Memory Group in use",RadioSettingValueList(GROUP_LIST,GROUP_LIST[tmpmax])) + lstn.append(rs) + + # LIST NAME + append_label(lstn, "_" * 30 + " Memory Group LIST NAME " + "_" * 274, "_" * 300) + + val = RadioSettingValueString(0, 80,"List Name") + val.set_mutable(False) + rs = RadioSetting("list_descr1", "Memory Group ", val) + lstn.append(rs) + + for i in range(1, 17): + varlist = "List Name_"+str(i) + vardescrl = "Memory Group "+str(i-1)+" " + + cntnl = str(_mem.list_name[i-1].name).strip("\x20\x00\xff") + + val = RadioSettingValueString(0, 8, cntnl) + rs = RadioSetting(varlist, vardescrl, val) + lstn.append(rs) + + + #********************************************************************************** SEZIONE AGC + # AGC + append_label(agc, "_" * 30 + " RFGain Band Setting " + "_" * 274, "_" * 300) + + val = RadioSettingValueString(0, 80,"RFGain Value (dBM) (** READ ONLY **)") + val.set_mutable(False) + rs = RadioSetting("agc_descr", "RFGain Band #", val) + agc.append(rs) + + for i in range(1, 8): + nagc = "agc_"+str(i) + dagc = "RFGain Band "+str(i)+" " + vagc = _mem.agc[i-1].val + vagcd = AGC_CORR[i-1] + int(AGC_LIST[vagc]) + temp = RadioSettingValueString(len(str(vagcd)), len(str(vagcd)), str(vagcd)) + temp.set_mutable(False) + + rs = RadioSetting(nagc,dagc,temp) + agc.append(rs) + + + #********************************************************************************** SEZIONE PRESET + # PRESET + + for i in range(1, 13): + append_label(preset, "_" * 30 + " PRESET " + str(i) + "_" * 274, "_" * 300) + + #----------------------------------------------- name + varlist = "Preset_Name_"+str(i) + vardescrl = "Preset Name "+str(i) + + cntnl = str(_mem.preset[i-1].name).strip("\x20\x00\xff") + val = RadioSettingValueString(0, 8, cntnl) + rs = RadioSetting(varlist, vardescrl, val) + preset.append(rs) + #----------------------------------------------- freq low + freqlow = "Low_Range_"+str(i) + lowdesc = "Low Range " + # flow = _mem.preset[i-1].freq_low + + # rs = RadioSetting(freqlow,lowdesc,RadioSettingValueInteger(0, 130000000, flow, 1)) + + flow = _mem.preset[i-1].freq_low/100000.0 + if flow > 1300.00000: + rs = RadioSetting(freqlow, lowdesc, + RadioSettingValueString(0, 10, "1300.00000")) + else: + rs = RadioSetting(freqlow, lowdesc, + RadioSettingValueString(0, 10, str(flow))) + + preset.append(rs) + #----------------------------------------------- freq up + frequp = "Up_Range_"+str(i) + updesc = "Up Range " + # fup = _mem.preset[i-1].freq_up + + # rs = RadioSetting(frequp,updesc,RadioSettingValueInteger(0, 130000000, fup, 1)) + fup = _mem.preset[i-1].freq_up/100000.0 + if fup > 1300.00000: + rs = RadioSetting(frequp, updesc, + RadioSettingValueString(0, 10, "1300.00000")) + else: + rs = RadioSetting(frequp, updesc, + RadioSettingValueString(0, 10, str(fup))) + + preset.append(rs) + + #----------------------------------------------- step + step = "Step_"+str(i) + stepdesc = "Step " + vstep = _mem.preset[i-1].step + if vstep >= len(STEP_LIST): + vstep = 10 + + rs = RadioSetting(step,stepdesc,RadioSettingValueList(STEP_LIST,STEP_LIST[vstep])) + preset.append(rs) + + #----------------------------------------------- bw + sbw = "Bw_"+str(i) + dbw = "BW " + vbw = _mem.preset[i-1].bw + if vbw >= len(BANDWIDTH_LIST): + vbw = 0 + + rs = RadioSetting(sbw,dbw,RadioSettingValueList(BANDWIDTH_LIST,BANDWIDTH_LIST[vbw])) + preset.append(rs) + + #----------------------------------------------- Modulation + smod = "Mode_"+str(i) + dmod = "Mode " + vmod = _mem.preset[i-1].modulation + if vmod >= len(MODULATION_LIST): + vmod = 0 + + rs = RadioSetting(smod,dmod,RadioSettingValueList(MODULATION_LIST,MODULATION_LIST[vmod])) + preset.append(rs) + + #----------------------------------------------- Squelch + ssq = "Sql_"+str(i) + dsq = "Squelch " + if _mem.preset[i-1].squelch < len(SQUELCH_LIST): + vsql = _mem.preset[i-1].squelch + else: + vsql = 1 + + rs = RadioSetting(ssq,dsq,RadioSettingValueList(SQUELCH_LIST,SQUELCH_LIST[vsql])) + preset.append(rs) + + #********************************************************************************** SEZIONE SETTAGGI DI BASE + append_label(basic, "_" * 30 + " Display settings " + "_" * 274, "_" * 300) + + # Single VFO BIT 1 + rs = RadioSetting("single_vfo","Single VFO", RadioSettingValueBoolean(bool(_mem.single_vfo > 0))) + basic.append(rs) + + # Channel display mode + tmpchdispmode = _mem.channel_display_mode + if tmpchdispmode >= len(CHANNELDISP_LIST): + tmpchdispmode = 0 + rs = RadioSetting("channel_display_mode","Channel Display mode",RadioSettingValueList( CHANNELDISP_LIST, CHANNELDISP_LIST[tmpchdispmode])) + basic.append(rs) + + # Backlight auto mode + tmpback = _mem.backlight_auto_mode + if tmpback >= len(BACKLIGHT_LIST): + tmpback = 0 + rs = RadioSetting("backlight_auto_mode","BackLightTime",RadioSettingValueList(BACKLIGHT_LIST,BACKLIGHT_LIST[tmpback])) + basic.append(rs) + + # BLMode + rs = RadioSetting("bl_mode","BLmode (TX/RX)", RadioSettingValueBoolean(bool(_mem.bl_mode > 0))) + basic.append(rs) + + # Inversione display + rs = RadioSetting("back_type","Display Inverted",RadioSettingValueBoolean(bool(_mem.back_type > 0))) + basic.append(rs) + + # RSSI / S Meter BIT 2 + rs = RadioSetting("signal_meter","SMeter (instead of RSSI for dual VFO)", RadioSettingValueBoolean(bool(_mem.signal_meter > 0))) + basic.append(rs) + + # MicBar + rs = RadioSetting("micbar","MicBar", RadioSettingValueBoolean(bool(_mem.micbar > 0))) + basic.append(rs) + + # Power on display mode + tmpdispmode = _mem.power_on_dispmode + if tmpdispmode >= len(WELCOME_LIST): + tmpdispmode = 0 + rs = RadioSetting("welcome_mode","Power on display MSG",RadioSettingValueList(WELCOME_LIST,WELCOME_LIST[tmpdispmode])) + basic.append(rs) + + append_label(basic, "_" * 30 + " Audio settings " + "_" * 274, "_" * 300) + # Beep control + rs = RadioSetting("beep_control","Beep control",RadioSettingValueBoolean(bool(_mem.beep_control > 0))) + basic.append(rs) + + # Mic gain + tmpmicgain = _mem.mic_gain + if tmpmicgain >= len(MICGAIN_LIST): + tmpmicgain = MICGAIN_LIST.index("+12.0dB") + rs = RadioSetting("mic_gain","Mic Gain",RadioSettingValueList(MICGAIN_LIST,MICGAIN_LIST[tmpmicgain])) + basic.append(rs) + + # VOX switch + rs = RadioSetting("vox_switch","VOX enabled", RadioSettingValueBoolean(bool(_mem.vox_switch > 0))) + basic.append(rs) + + # VOX Level + tmpvox = _mem.vox_level+1 + if tmpvox > 10: + tmpvox = 10 + rs = RadioSetting("vox_level", "VOX Level",RadioSettingValueInteger(1, 10, tmpvox)) + basic.append(rs) + + # Tail tone elimination + rs = RadioSetting("tail_note_elimination","TX Squelch Tail Elimination",RadioSettingValueBoolean(bool(_mem.tail_note_elimination > 0))) + basic.append(rs) + + # Repeater tail tone elimination + tmprte = _mem.repeater_tail_elimination + if tmprte >= len(RTE_LIST): + tmprte = 0 + rs = RadioSetting("repeater_tail_elimination","RX Squelch Tail Elimination",RadioSettingValueList(RTE_LIST, RTE_LIST[tmprte])) + basic.append(rs) + + append_label(basic, "_" * 30 + " Key Lock settings " + "_" * 274, "_" * 300) + + # Keypad locked + rs = RadioSetting("key_lock","Keypad Lock",RadioSettingValueBoolean(bool(_mem.key_lock > 0))) + basic.append(rs) + + # Auto keypad lock + rs = RadioSetting("auto_keypad_lock","Auto keypad lock",RadioSettingValueBoolean(bool(_mem.auto_keypad_lock > 0))) + basic.append(rs) + + append_label(basic, "_" * 30 + " RTX settings " + "_" * 274, "_" * 300) + + # Crossband receiving/transmitting + tmpcross = _mem.crossband + if tmpcross >= len(CROSSBAND_LIST): + tmpcross = 0 + rs = RadioSetting("crossband","Cross-band receiving/transmitting (Tx VFO)",RadioSettingValueList(CROSSBAND_LIST,CROSSBAND_LIST[tmpcross])) + basic.append(rs) + + # Dual watch + tmpdual = _mem.dual_watch + if tmpdual >= len(DUALWATCH_LIST): + tmpdual = 0 + rs = RadioSetting("dualwatch", "Dual Watch (DualRX)", RadioSettingValueList(DUALWATCH_LIST, DUALWATCH_LIST[tmpdual])) + basic.append(rs) + + # Band TX + tmpbandstx = _mem.bands_tx + if tmpbandstx >= len(BANDS_TX_LIST): + tmpbandstx = 0 + rs = RadioSetting("bands_tx", "Bands TX", RadioSettingValueList(BANDS_TX_LIST, BANDS_TX_LIST[tmpbandstx])) + basic.append(rs) + + # TX Enable + rs = RadioSetting("tx_enable","TX Enable", RadioSettingValueBoolean(bool(_mem.tx_enable > 0))) + basic.append(rs) + + # VFO open + rs = RadioSetting("vfo_lock", "VFO lock", RadioSettingValueBoolean(bool(_mem.vfo_lock > 0))) + basic.append(rs) + + append_label(basic, "_" * 30 + " Beacon settings " + "_" * 274, "_" * 300) + + # Beacon + tmpbeacon = _mem.beacon + if tmpbeacon >= len(BEACON_LIST): + tmpbeacon = BEACON_LIST.index("Off") + rs = RadioSetting("beacon","Beacon/CQ Call",RadioSettingValueList(BEACON_LIST,BEACON_LIST[tmpbeacon])) + basic.append(rs) + + # QRZ label + qrz_label = str(_mem.qrz_label).rstrip("\x20\x00\xff") + "\x00" + qrz_label = _getstring(qrz_label.encode('ascii', errors='ignore'), 0, 8) + rs = RadioSetting("qrz_label", _("QRA (8 characters)"), RadioSettingValueString(0, 8, qrz_label)) + basic.append(rs) + + # Logo string 1 + logo1 = str(_mem.logo_line1).strip("\x20\x00\xff") + "\x00" + logo1 = _getstring(logo1.encode('ascii', errors='ignore'), 0, 16) + rs = RadioSetting("logo1", _("Logo string 1 (16 characters)"), RadioSettingValueString(0, 16, logo1)) + basic.append(rs) + + # Logo string 2 + logo2 = str(_mem.logo_line2).strip("\x20\x00\xff") + "\x00" + logo2 = _getstring(logo2.encode('ascii', errors='ignore'), 0, 16) + rs = RadioSetting("logo2", _("Logo string 2 (16 characters)"), RadioSettingValueString(0, 16, logo2)) + basic.append(rs) + + append_label(basic, "_" * 30 + " Other settings " + "_" * 274, "_" * 300) + + # TOT + tmptot = _mem.max_talk_time + if tmptot >= len(TALKTIME_LIST): + tmptot = TALKTIME_LIST.index("3min") + rs = RadioSetting("max_talk_time","Max talk time (Tx TOT)",RadioSettingValueList(TALKTIME_LIST,TALKTIME_LIST[tmptot])) + basic.append(rs) + + # Battery save + tmpbatsave = _mem.battery_save + if tmpbatsave >= len(BATSAVE_LIST): + tmpbatsave = BATSAVE_LIST.index("80%") + rs = RadioSetting("battery_save","Battery Save",RadioSettingValueList(BATSAVE_LIST,BATSAVE_LIST[tmpbatsave])) + basic.append(rs) + + # Satcom + rs = RadioSetting("satcom","SATCOM", RadioSettingValueBoolean(bool(_mem.satcom > 0))) + basic.append(rs) + + # Upconv + tmpupconv = _mem.upconv # sposta il bit di 4 posizioni a destra + if tmpupconv >= len(UPCONV_LIST): + tmpupconv = UPCONV_LIST.index("Off") + rs = RadioSetting("upconv","UP Converter", RadioSettingValueList(UPCONV_LIST,UPCONV_LIST[tmpupconv])) + basic.append(rs) + + #Custom Frequency Upconverter + custom_upconv = _mem.custom_upconv/100000.0 + if custom_upconv > 999.99999: + rs = RadioSetting("custom_upconv", "Custom Upconvrerter Frequency (max 999.99999 MHz)",RadioSettingValueString(0, 9, "999.99999")) + else: + rs = RadioSetting("custom_upconv", "Custom Upconvrerter Frequency (max 999.99999 MHz)",RadioSettingValueString(0, 9, str(custom_upconv))) + + basic.append(rs) + + + # Scan resume mode + tmpscanres = _mem.scan_resume_mode + if tmpscanres >= len(SCANRESUME_LIST): + tmpscanres = 0 + rs = RadioSetting("scan_resume_mode","Scan resume mode (Sc REV)",RadioSettingValueList(SCANRESUME_LIST,SCANRESUME_LIST[tmpscanres])) + basic.append(rs) + + # call channel + tmpc = _mem.call_channel+1 + if tmpc > 200: + tmpc = 1 + rs = RadioSetting("call_channel", "One key call channel",RadioSettingValueInteger(1, 200, tmpc)) + basic.append(rs) + + # #Custom tone + custom_tone = _mem.custom_tone/10.0 + if custom_tone > CTMAX: + rs = RadioSetting("custom_tone", "CTCSS Custom Tone (0 ~ 255 Hz)", + RadioSettingValueString(0, 5, "255.0")) + else: + rs = RadioSetting("custom_tone", "CTCSS Custom Tone (0 ~ 255 Hz)", + RadioSettingValueString(0, 5, str(custom_tone))) + + basic.append(rs) + + + + + #********************************************************************************** SEZIONE INFO + # readonly info + # Firmware + if self.FIRMWARE_VERSION == "": + firmware = "To get the firmware version please download" + "the image from the radio first" + else: + firmware = self.FIRMWARE_VERSION + + val = RadioSettingValueString(0, 128, firmware) + val.set_mutable(False) + rs = RadioSetting("fw_ver", "Firmware Version", val) + roinfo.append(rs) + + # No limits version for hacked firmware + val = RadioSettingValueBoolean(self._expanded_limits) + rs = RadioSetting("nolimits", "Limits disabled for modified firmware",val) + rs.set_warning(_( + 'This should only be enabled if you are using modified firmware ' + 'that supports wider frequency coverage. Enabling this will cause ' + 'CHIRP not to enforce OEM restrictions and may lead to undefined ' + 'or unregulated behavior. Use at your own risk!'), + safe_value=False) + roinfo.append(rs) + + return top + + + +################################################################################################################################ +# S A L V A T A G G I O S E T T I N G S +################################################################################################################################ + +#-------------------------------------------------------------------------------- + def set_settings(self, settings): + + _mem = self._memobj + + for element in settings: + if not isinstance(element, RadioSetting): + self.set_settings(element) + continue + + # basic settings + + # Single VFO + if element.get_name() == "single_vfo": + _mem.single_vfo = element.value and 1 or 0 + + # BLMode + if element.get_name() == "bl_mode": + _mem.bl_mode = element.value and 1 or 0 + + # Inversione display + if element.get_name() == "back_type": + _mem.back_type = element.value and 1 or 0 + + # RSSI / S Meter + if element.get_name() == "signal_meter": + _mem.signal_meter = element.value and 1 or 0 + + # Beep control + if element.get_name() == "beep_control": + _mem.beep_control = element.value and 1 or 0 + + # VOX switch + if element.get_name() == "vox_switch": + _mem.vox_switch = element.value and 1 or 0 + + # MicBar + if element.get_name() == "micbar": + _mem.micbar = element.value and 1 or 0 + + # Tail tone elimination + if element.get_name() == "tail_note_elimination": + _mem.tail_note_elimination = element.value and 1 or 0 + + # Auto keypad lock + if element.get_name() == "auto_keypad_lock": + _mem.auto_keypad_lock = element.value and 1 or 0 + + # TX Enable + if element.get_name() == "tx_enable": + _mem.tx_enable = element.value and 1 or 0 + + # VFO open + if element.get_name() == "vfo_lock": + _mem.vfo_lock = element.value and 1 or 0 + + # Satcom + if element.get_name() == "satcom": + _mem.satcom = element.value and 1 or 0 + + #--------------------------------------------------- + + # call channel + if element.get_name() == "call_channel": + _mem.call_channel = int(element.value)-1 + + # TOT + if element.get_name() == "max_talk_time": + _mem.max_talk_time = TALKTIME_LIST.index(str(element.value)) + + # Beacon + if element.get_name() == "beacon": + _mem.beacon = BEACON_LIST.index(str(element.value)) + + # vox level + if element.get_name() == "vox_level": + _mem.vox_level = int(element.value)-1 + + # mic gain + if element.get_name() == "mic_gain": + _mem.mic_gain = MICGAIN_LIST.index(str(element.value)) + + # Channel display mode + if element.get_name() == "channel_display_mode": + _mem.channel_display_mode = CHANNELDISP_LIST.index(str(element.value)) + + # Backlight auto mode + if element.get_name() == "backlight_auto_mode": + _mem.backlight_auto_mode = BACKLIGHT_LIST.index(str(element.value)) + + # Power on display mode + if element.get_name() == "welcome_mode": + _mem.power_on_dispmode = WELCOME_LIST.index(str(element.value)) + + # Repeater tail tone elimination + if element.get_name() == "repeater_tail_elimination": + _mem.repeater_tail_elimination = RTE_LIST.index(str(element.value)) + + # Crossband receiving/transmitting + if element.get_name() == "crossband": + _mem.crossband = CROSSBAND_LIST.index(str(element.value)) + + # Dual watch + if element.get_name() == "dualwatch": + _mem.dual_watch = DUALWATCH_LIST.index(str(element.value)) + + # Band TX + if element.get_name() == "bands_tx": + _mem.bands_tx = BANDS_TX_LIST.index(str(element.value)) + + # Battery save + if element.get_name() == "battery_save": + _mem.battery_save = BATSAVE_LIST.index(str(element.value)) + + # Scan resume mode + if element.get_name() == "scan_resume_mode": + _mem.scan_resume_mode = SCANRESUME_LIST.index(str(element.value)) + + # QRZ label + if element.get_name() == "qrz_label": + _mem.qrz_label = element.value + + # Logo string 1 + if element.get_name() == "logo1": + _mem.logo_line1 = element.value + + # Logo string 2 + if element.get_name() == "logo2": + _mem.logo_line2 = element.value + + # Upconv + if element.get_name() == "upconv": + _mem.upconv = UPCONV_LIST.index(str(element.value)) + + #Custom Frequency Upconverter + if element.get_name() == "custom_upconv": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 999.99999*100000.0: + val2 = 0x00000000 + + _mem.custom_upconv = val2 + + #Custom tone + if element.get_name() == "custom_tone": + val = str(element.value).strip() + try: + val2 = int(float(val)*10) + except Exception: + val2 = 0x09F6 + + if val2 > CTMAX*10: + val2 = 0x09F6 + + _mem.custom_tone = val2 + + + + + + + + #--------------------------------------------------- LIST + # list name + if element.get_name() == "List Name_1": + _mem.list_name[0].name = element.value + if element.get_name() == "List Name_2": + _mem.list_name[1].name = element.value + if element.get_name() == "List Name_3": + _mem.list_name[2].name = element.value + if element.get_name() == "List Name_4": + _mem.list_name[3].name = element.value + if element.get_name() == "List Name_5": + _mem.list_name[4].name = element.value + if element.get_name() == "List Name_6": + _mem.list_name[5].name = element.value + if element.get_name() == "List Name_7": + _mem.list_name[6].name = element.value + if element.get_name() == "List Name_8": + _mem.list_name[7].name = element.value + if element.get_name() == "List Name_9": + _mem.list_name[8].name = element.value + if element.get_name() == "List Name_10": + _mem.list_name[9].name = element.value + if element.get_name() == "List Name_11": + _mem.list_name[10].name = element.value + if element.get_name() == "List Name_12": + _mem.list_name[11].name = element.value + if element.get_name() == "List Name_13": + _mem.list_name[12].name = element.value + if element.get_name() == "List Name_14": + _mem.list_name[13].name = element.value + if element.get_name() == "List Name_15": + _mem.list_name[14].name = element.value + + # S-LIST + if element.get_name() == "ch_list": + _mem.ch_list = GROUP_LIST.index(str(element.value)) + + #--------------------------------------------------- KEYS + # Key 1 short + if element.get_name() == "key1_shortpress_action": + _mem.key1_shortpress_action = element.value + + # Key 2 short + if element.get_name() == "key2_shortpress_action": + _mem.key2_shortpress_action = element.value + + # Key 1 long + if element.get_name() == "key1_longpress_action": + _mem.key1_longpress_action = element.value + + # Key 1 long + if element.get_name() == "key2_longpress_action": + _mem.key2_longpress_action = element.value + + #--------------------------------------------------- PRESET + if element.get_name() == "Preset_Name_1": + _mem.preset[0].name = element.value + if element.get_name() == "Preset_Name_2": + _mem.preset[1].name = element.value + if element.get_name() == "Preset_Name_3": + _mem.preset[2].name = element.value + if element.get_name() == "Preset_Name_4": + _mem.preset[3].name = element.value + if element.get_name() == "Preset_Name_5": + _mem.preset[4].name = element.value + if element.get_name() == "Preset_Name_6": + _mem.preset[5].name = element.value + if element.get_name() == "Preset_Name_7": + _mem.preset[6].name = element.value + if element.get_name() == "Preset_Name_8": + _mem.preset[7].name = element.value + if element.get_name() == "Preset_Name_9": + _mem.preset[8].name = element.value + if element.get_name() == "Preset_Name_10": + _mem.preset[9].name = element.value + if element.get_name() == "Preset_Name_11": + _mem.preset[10].name = element.value + if element.get_name() == "Preset_Name_12": + _mem.preset[11].name = element.value + + + + if element.get_name() == "Low_Range_1": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[0].freq_low = val2 + if element.get_name() == "Low_Range_2": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[1].freq_low = val2 + if element.get_name() == "Low_Range_3": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[2].freq_low = val2 + if element.get_name() == "Low_Range_4": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[3].freq_low = val2 + if element.get_name() == "Low_Range_5": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[4].freq_low = val2 + if element.get_name() == "Low_Range_6": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[5].freq_low = val2 + if element.get_name() == "Low_Range_7": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[6].freq_low = val2 + if element.get_name() == "Low_Range_8": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[7].freq_low = val2 + if element.get_name() == "Low_Range_9": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[8].freq_low = val2 + if element.get_name() == "Low_Range_10": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[9].freq_low = val2 + if element.get_name() == "Low_Range_11": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[10].freq_low = val2 + if element.get_name() == "Low_Range_12": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[11].freq_low = val2 + + + + if element.get_name() == "Up_Range_1": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[0].freq_up = val2 + if element.get_name() == "Up_Range_2": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[1].freq_up = val2 + if element.get_name() == "Up_Range_3": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[2].freq_up = val2 + if element.get_name() == "Up_Range_4": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[3].freq_up = val2 + if element.get_name() == "Up_Range_5": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[4].freq_up = val2 + if element.get_name() == "Up_Range_6": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[5].freq_up = val2 + if element.get_name() == "Up_Range_7": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[6].freq_up = val2 + if element.get_name() == "Up_Range_8": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[7].freq_up = val2 + if element.get_name() == "Up_Range_9": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[8].freq_up = val2 + if element.get_name() == "Up_Range_10": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[9].freq_up = val2 + if element.get_name() == "Up_Range_11": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[10].freq_up = val2 + if element.get_name() == "Up_Range_12": + val = str(element.value).strip() + try: + val2 = int(float(val)*100000.0) + except Exception: + val2 = 0x00000000 + + if val2 > 1300.00000*100000.0: + val2 = 0x00000000 + _mem.preset[11].freq_up = val2 + + # ####################################################### + # if element.get_name() == "Low_Range_1": + # _mem.preset[0].freq_low = int(element.value) + # if element.get_name() == "Low_Range_2": + # _mem.preset[1].freq_low = int(element.value) + # if element.get_name() == "Low_Range_3": + # _mem.preset[2].freq_low = int(element.value) + # if element.get_name() == "Low_Range_4": + # _mem.preset[3].freq_low = int(element.value) + # if element.get_name() == "Low_Range_5": + # _mem.preset[4].freq_low = int(element.value) + # if element.get_name() == "Low_Range_6": + # _mem.preset[5].freq_low = int(element.value) + # if element.get_name() == "Low_Range_7": + # _mem.preset[6].freq_low = int(element.value) + # if element.get_name() == "Low_Range_8": + # _mem.preset[7].freq_low = int(element.value) + # if element.get_name() == "Low_Range_9": + # _mem.preset[8].freq_low = int(element.value) + # if element.get_name() == "Low_Range_10": + # _mem.preset[9].freq_low = int(element.value) + # if element.get_name() == "Low_Range_11": + # _mem.preset[10].freq_low = int(element.value) + # if element.get_name() == "Low_Range_12": + # _mem.preset[11].freq_low = int(element.value) + # ################################################### + + # if element.get_name() == "Up_Range_1": + # _mem.preset[0].freq_up = int(element.value) + # if element.get_name() == "Up_Range_2": + # _mem.preset[1].freq_up = int(element.value) + # if element.get_name() == "Up_Range_3": + # _mem.preset[2].freq_up = int(element.value) + # if element.get_name() == "Up_Range_4": + # _mem.preset[3].freq_up = int(element.value) + # if element.get_name() == "Up_Range_5": + # _mem.preset[4].freq_up = int(element.value) + # if element.get_name() == "Up_Range_6": + # _mem.preset[5].freq_up = int(element.value) + # if element.get_name() == "Up_Range_7": + # _mem.preset[6].freq_up = int(element.value) + # if element.get_name() == "Up_Range_8": + # _mem.preset[7].freq_up = int(element.value) + # if element.get_name() == "Up_Range_9": + # _mem.preset[8].freq_up = int(element.value) + # if element.get_name() == "Up_Range_10": + # _mem.preset[9].freq_up = int(element.value) + # if element.get_name() == "Up_Range_11": + # _mem.preset[10].freq_up = int(element.value) + # if element.get_name() == "Up_Range_12": + # _mem.preset[11].freq_up = int(element.value) + + + if element.get_name() == "Step_1": + _mem.preset[0].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_2": + _mem.preset[1].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_3": + _mem.preset[2].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_4": + _mem.preset[3].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_5": + _mem.preset[4].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_6": + _mem.preset[5].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_7": + _mem.preset[6].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_8": + _mem.preset[7].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_9": + _mem.preset[8].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_10": + _mem.preset[9].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_11": + _mem.preset[10].step = STEP_LIST.index(str(element.value)) + if element.get_name() == "Step_12": + _mem.preset[11].step = STEP_LIST.index(str(element.value)) + + if element.get_name() == "Bw_1": + _mem.preset[0].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_2": + _mem.preset[1].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_3": + _mem.preset[2].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_4": + _mem.preset[3].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_5": + _mem.preset[4].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_6": + _mem.preset[5].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_7": + _mem.preset[6].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_8": + _mem.preset[7].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_9": + _mem.preset[8].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_10": + _mem.preset[9].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_11": + _mem.preset[10].bw = BANDWIDTH_LIST.index(str(element.value)) + if element.get_name() == "Bw_12": + _mem.preset[11].bw = BANDWIDTH_LIST.index(str(element.value)) + + if element.get_name() == "Mode_1": + _mem.preset[0].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_2": + _mem.preset[1].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_3": + _mem.preset[2].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_4": + _mem.preset[3].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_5": + _mem.preset[4].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_6": + _mem.preset[5].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_7": + _mem.preset[6].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_8": + _mem.preset[7].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_9": + _mem.preset[8].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_10": + _mem.preset[9].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_11": + _mem.preset[10].modulation = MODULATION_LIST.index(str(element.value)) + if element.get_name() == "Mode_12": + _mem.preset[11].modulation = MODULATION_LIST.index(str(element.value)) + + if element.get_name() == "Sql_1": + _mem.preset[0].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_2": + _mem.preset[1].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_3": + _mem.preset[2].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_4": + _mem.preset[3].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_5": + _mem.preset[4].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_6": + _mem.preset[5].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_7": + _mem.preset[6].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_8": + _mem.preset[7].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_9": + _mem.preset[8].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_10": + _mem.preset[9].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_11": + _mem.preset[10].squelch = SQUELCH_LIST.index(str(element.value)) + if element.get_name() == "Sql_12": + _mem.preset[11].squelch = SQUELCH_LIST.index(str(element.value)) + + +# @directory.register +# class RA79Radio(UVK5Radio): +# """Retevis RA79""" +# VENDOR = "Retevis" +# MODEL = "RA79" + diff --git a/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/Custom_Firmware_by_Matoz_V0.34.0C.bin b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/Custom_Firmware_by_Matoz_V0.34.0C.bin new file mode 100644 index 0000000000000000000000000000000000000000..0bba78f79bd9f5bd264ca6ed29909bb7db235237 GIT binary patch literal 60946 zcmXuKg}+DPQnjP(zo-a}<~m{8R9->|?Ap;nJrqm>K^$>lb%5;= z6m7Y~whPH-Yh(OWt`XsHajsjyb0@1k2Rld?W{I;Ph%A?7L{s0zBAJ?u2^x$9d)8xB zTxm0G9efEl$X26FL?(nPb6s;J)(5mNva#y?h9*W=(RXV=bmWtb;P|<4{C9Bt0XTj; z9A6fW{|1h)0>=l!@w;{84qMM9o6U^yQ_qKmzrA7E0uDr`BO1j5zcg>htx3O{bniBn zq^i1YzT$8P{#gYSPdW)pw`I~Hm8h(*Om5z3t^9)i9X*D-p+huU!F6@&P_F>2HOKt- zgZp=_oJy>v`T1teuL57<2inq8tlt3C$y-aut*`#*LTKj=&Lyha15IMD??(S9*dt35 z-s&!VvJ-0w$P!~?^%Bg%xRk>f2r>MsDAOQma^=M%EVO7ou4k9RG%Svxi_$gvdG3%P zwY^UIg&o4*)}YTwTD~1xqi*GaE63R&TupwrX}?7sf>@+jF-AQHUTfnLzoT$97H~U2 zxBHnY<#_|hbX;0*3$UMmDGlvXEBAI|dC5GuUp-Y+{Xv0<6o_$IT5gJWZsO-<4+&FN zewCWE`|@b@_=9p3d&=>UOFv`5``r>ri(IxO?Lr>!#NWT#pGPW!B~z`pF`IEY#fo=& zb{xke?FY4DP4YfTN&*yL^U$vwjnxg^miWoIBk4y0`j|@@hHWOXuu0whNGDf@=#m!c z4g>U?U(a3~tX}lc#L6M00dhG`!oLM{772_y^UP%Txx?a>e@fx;XPn2Vh58Vmz|hR3 z67tt=Z?iYjx6XPH06zv7zLMSTlv z!<9^*kz5Jy%NV7l{tlIwx!Id{PJ{RVyT=g|8A631mn(L1K^e`F2NROO5}yW_GWLmY;aw@1eBBv_r>A6=gRgEZmS*Q@)< z*AYh4US3P4rsw0Q-i-(sQ=lHA5E**K(XlpKr;T5DxBr$+u_M-#Y%L}Kh=~4;ei{D$ zb(C#}*=|SU@!2wz*W{7OZChg;RxnSc7briqT}pCvApKY&WvzHJ*aY-$k@B}$5k}Og zdoA>Vt^2@Q&ZvgTMv#IH^2_E53|Jl+E!`qnu1Bg(`8he&JSzNc zOUhf`;>WG+0VY4T$vGn|I`AK+U<##Rh(4?+W~kMj)g&K!6+8pr*?d=KpY@6eL_ z22Fb7Qi;K#t+WK$XWwNk-dAgFx85$GkDYbuww7xuKgy(u*LTT+g?tj@!aPWm9_rV_ zp5^XcUYCW7H5s-XMVYEk{Xk|vdctjeI~d+tW8)KW7j`=u3oZuJ&&!)wm#qXDe!07O z>8mmPL_5>-y@2fQS+PDK$Ac1$g#wxc@gw?8Zx4`f$uO~dknH`U%)q(qr$bD$>As|> z5<069@GP1743WfP4+D%H9Bca=w#_&t9g|ZOx4eo__9mO)kotYVSH7sXq^O1o9~BEM~Hv4XOJ)iI-2k!$pzs5L>%@pU-3Q^F;S}`a(M!4;&?*#zcu% zC^5arO91VH2>|HTB7CmZ4JQc)ddgzzS^ z?>PDG0gx@Bi~d;;gYZ%DfFah8H|vj}o~vZtc@5FcFZ1648DhUc6sB3wUI=|U0j_!e z&M6@89B;*3roL)9$d#6r$ z&Ca|8>`yNyPh$@1+AoP8N8hio71XqI0h*WY_d@HG*04?&+QA8=mRlyP5vAj@Zgkb) zPOe=JciKQUvF4{gVad^&GOgV{#u2uQVD`Z%`v7H)l}yjF_eBqzF5eNhNeVRQL;Zu_ zfawCZ+Kv=IL22UKx+LnceTm9O@AjBKqcfY@4(KoK^=~`v(se+nsmVh8pA}a=e@;e{ zdOInC6{advme7k!<4CRE9}aY&B$jz2Q8RTz)rsIAB?3r+$bze)WtzE~40YriA1qB^ zA9j=tR#lx8F#tpwdjqD@%K)Z*CsI^_A9H`3AA3ws%?9maG_L>B!RF5;Ydx z9WFOeLdTFguZu6$d`SL{0*UsCTie?82Q0m7UD$7wlF86`_?VKWW5QDzk~NJ5_%HE-K;y{bA)_X3&c{&={K-?&Ub2r zOPF!PABLXSw(~iGf2~EXsS`zG7P#}gIJsA;!seQ6?T#a>7A<0kf(1((wx#`8dI3pZ zb$2Ey9FAz~BGfCuh2oAR4hM0*e=k{=v|r&4B6$qYLf7E?GK2S6aFB|rso_CH6~JbG z&z%}={Bz2?Ivkc*+DP`|JgHv-Qc2e5a!1%yQ9#_Hc_g7eB&}>~xx`s$9NpH6P?2-y zIe5A@h@oaicef}&!9q*@IAq>XU{ssL7$8njUmx#EVJ&UwpiB{Z`5ZQbzo-$E9M^6O zp^FU;QScM^wo5;4`ezRF+h@Zpq55|dwDR<0vZUQ(_R2`H)bz>7PCdt>iy0?iF0Y&W z3sI&(Ac{fF0eT=`!ySf6!#9mM_d1!wPCK(yi$Pp0oj8&Ds-Ck){$=Z-qMk~(@UILrVUdmW;8ZDlWqz|-_uTE4N)#wzQ_p0dF`Xr}v9sYjG_7E*2J zq82B?@jeIP0WPdA^Dt_RQpcb?L-kRbhVpj*m}@dZ^#*6C)3g6v(+4+i;6$@V&+JzG zqmm};Grk@k`jXiiR>(rIl`nCKOWvhkPHI<{udqbdWf7`nsW4p7>vDBfU93rNFGK<%9(GEI;>}t zZJvO)oZz~1H}cjxD&*pqL{&a+<6HsCw@AwvAQ?Vb%Q(kX{2i$?vHplvCbhFKdD+6# z>*ZjC{q1oWtY4NO|v6?w|r@pIm1OHKoLB#t?1vBS-6I zZsU*(FHlsKmxH&Rb_VGbiXMG^Eg1m+?@j~>iW~v))Rk6h^wQPSkPaDRZSzyQ-pN~B zjb-P1fC7dXAf^7;i(d51P!2fPY6{8<)P85c^2^oz{P53T1B<)S&OvSZNzYVR5*iXL zQ@5vlOZ2rOGrHOr8cB=9bdKwxC`W4;20#Bv+*Xj(;;yld}T-YlHDuEf)5(qjCDZ9~Dl46^M`F0@m8I$Wc9u+wL zs5|!V>e( zb)DVw3-goa;o^ttDs6xNru&i;qv+NpWs}}F9FWCr?Nieu44B3tN2>zdJvqaevbxuQ zlxcvHd&>p}DJme5Gp%kWFtul8|CcY&XznwnO|Jojz>d{_{NGEl8+e5?@`p+kqnv7_ z@#imzxA|Jlk3oHI9!tL*`Is{ZM^jGo#!uqMSNECG&-lGHx=*_!CO!2UU7ou* z(g;Oiz61ztX#=x5ZHQiN(k>@B<=s}9BNuMztGs;M9{~+L#erE7Y>$k>@%;`luSKb` zQ(rd3tiX=V|MHD-w>ipl&q-V*Ey6 z+CJ0&^bb2Unn9PgSAOX&??Q?3%|*}C`?8N$IQoAo4n+&pNt>pmZchKo!Shekx1GNb z$DGrydYiT5cJ&V(eFVSh)YocO`1vXK5{9Xycs9PWA*Ody54gvc`h(E7P2lkJy__)7MNANUAW)S~|>_Kq)L!>hi9Lg4Se zJD+slO8x9U3CEY)zNBA*PP*M$T~(}N0x=izIaot@vlP2ERJMKK=O1PUbX0rd zfiuN-`1xOI8q~rYb;xn)j9%f=GA9+*36FmkznKor&oS5i@48|?*^xB|w0pGvJHLa! z`x=59j#p1IFzp93m{>4$_)e~ZR+qGU0ABwPskIoF;PH=@L@CS7e-JXggHmyH1#JE* zCz~05*yq-?Lfsk!&K}^mn|cz^a2}F5`)?8JG>fl_2a7DkJPhf>bIHavQ>I}S_lr+M zNA0on3*lWQ*EOQ2xp0>!6Pec<9gU|I{W(1TdTe{v(j4t}9QhXMV=nTnnMMOKX+N&# z8&Gu%w(50~ylIgHZ0q%m=@n8Oj;-EPk-^iPWn75)sM9Jfu=aqh?!#V*->CIwDhq?A zTJW|#4cYl=pSWuW0|+efQQB*rH#ZKd7O^kmn&_tI?C5Nw(oU$r>bXWI>JG_kB}|3f zL!0U~Rx{<}qqyN+YG?t%HN1oF_7Y;Zu52Edn=^gRHU+tNzULsJyo+8t? zH>9lG3^;cQ1xl*&5_%>Pu2i|`|M+JQ9f0f=`t>FU(a7v_CCRWcc|9Ed{#(fK_|p-% z#<52KdLF>`fD6xm&wu)(#7MreXWn52w9^nh)5KdLKE|=#!1)^5P^qgN?30tFpAf6i zEl4HGS0O#pwkByUXMAp&!Y4HT4h{bPNhUSMIhRrb8sYt;aQ?fOq~${RhK3B|Z7`Cn zs2=NAXYX_b>Dud$&RG%o!cl60U#7P?ZFy4iL3}QX}F! zr+p&rb{RNu8rz-z4CzzV8lr{wKU@76K%{^v>7U{YIKBoPpXF(J!v+%(-v0*pkxJ`+ z)pEpK$Fk-S)>%Z#{E->L0(iDT9sK83g!~^a8!PUvK1)tuQ;2`q~b5eSTTgdlf9j|bN-#H6NZI5VZ$sJx?NjBRX;=?sC2RE_ZgDN??XGsuN9UR}eM^La!bwpE*C-ItwAD7PO z9w|k`G$Sih#BvYO#nsBq-BW?!w!?WrIZ`G~;zRNQAw4wt_s@B;>cXlPP{F)&T41>o z@si!ZZ=#rG(i8?-()tPmnGwBICDn{|L~eoZ0&;B~IRBAKO)nd;_d2FJ!C*PU6;zc8 zhx0!fC>g}RjV#^zPjPV^&}nPm^~R+IP`{C0+0Z)fKXf|KG-Km031Z30@L#i+ouQfK z!(#QqNKL9?lI-m<81h{QW5}<3Epnh_`K9Or8AFSVUBVVl+wrm_8And2yEcZ|mhI>s z!sCw*+kD+#4_E3|lVk|c*vm}DVp$rBmEI+wao+tiIFEX2OLwQPb9lt{w!@CUS=KBj zD?&uG1{P7ZVeS7GL~tAImZ+?~Y!9PWSjd;*NFb2ITnO-y8-`UBMdI#}T68(V#2O079) zZ$rFwX2^;N@4vJQ7c0JJS=^C66~x|@0vC$wC( zq4arAutE%~?t3rZJO}^nwK;MluaX$*8C`h&n+Y9(=RfFeNsr8mfN%$#|M?F%LF<8t z^}xTbyo_}bwXSgg*IEY?iqYKXC$zN%tn9Mf%kG7A`QkbYE??%d$mr_3wAya%Z(jr> zF}(g?{dXO_g7+WK?OBFXI-`j>=17?&nT@Q4{1H|Me}h$1`2E+|1)0dNSQ60&vHUvm z5Lci7tO`L1>zU{{bR1@oRCZ<__!w>;MGaUjcFSS?>~}0F4_DV1a|ooOnPV1s-p;f7gA{- zekSLrFPU`5ZM8ha-P=55I0?LD->Lx<#A~Y_W!WA>(_qOhJ$Nk?t?N&+qDXxs58AT7 zGrNCDT;_jDg^qBvgeGs=qdCbe80QF!@0Y0Izp2PW6*4Oh{{&(o>)pqMAV2G4H66)R zkP8fk7iJT1xY8w9#3Ev^AgRc;Q?q$n)?2i+$s+s!7Una86lu(#i1VlIB_tQ9{|g9v ziYpZe{IFwmV>C#-RR3JP*9c&5zSkZ)gdmk-JV$*_sTsnUD$&lJZ8#8zw74x1ps{uyD)RTYv5KT( zkmKMc&V}P%sZ(1DHD~lAdif6Dw#E~;^_ZeRsaB$Wb0ZbK0!A}vbgC^5vWT2H?oEat zZ|I%Szf#<=hnzR|e`YEW=TRfp99yyvq>ueS|A8iNMU_$6pZ0YoTJ(fxQ~6%puzgkm zb!YT0HOY~FxW;bt(3;Nlu>PmglOq9oKE^{fqNuDiry*WXM35b!Fe9CozRX#`(l(s` zdE`)&Jk|^Z@f&Q>~~?O9Yta9SZMSl@-j`MJ%V0szof#eb0hLO zkOp3VDMiIwXjJ&CF7TrO1f zz#Ac?W$M&h6H_21g0 z)Hp{~d=EZ<@EyxzdE-*l&t0df)sTClL3b!X`s`}G)2$?Y#X*oChi(s6v{t-v zLthe*$(MM7r?TQwxPL(jn4yA1El4T)TH8uJkKdar%cqd`@Ex!#3^a8h{vZ*aulgzd zONp*v8^6hvSG9`J_hfwMz7((-&jw5)W2J)1;~R=j$dBk6B6GrLy{#MaOoUKn_XS$t zA@ny@riyKvPQ-TC3Tyc}PUdpLQ;N{v{7K6+%KQj<;y9I$Y^SLpZxGJPMfmnekC8;V zq_pS?P!EGQo@mnRINY-FzJe~ z0u!b5oHfUmPvp60ZCERm%Av}%THe?n9sU8AQa@$_yRKmv9> z{Vr)r`m3ktW#=^wQzs77qW|_DCIdhb+a5}1bRiSF36U~!QbQ95gm$xul@3m!#8_V5 z`E%+h$GY(OyUs8)+Si_G6K4)Na8jE_VN|fLhYnK8~vssx!>ItAae#>7u2+pfSdrh&(TBR{Wo#CVI{)Jr4v>etfB?a|LG4g zTq872qkc&u_wV8QkKNUZ{@GmTgKB3(ofVw_JcT_g9(PhCzyA%yK!@|6r>7CY3jI0~ z)R~6gM{xXof`|dD2?sYhxjT6LT`jdbk};<2MC{=AQWVG74yE3@7ZoLWZ7Fv?h9a#OF;4S7%?Em9QaliQVY$gGGgU?^Pl zMpg1Gt&pOyl!(aj$f=NyW2Y9fd|pxgyT&&~-AerdhdoU+@WOPGPq+kxM$?L)U^R5F z2$a9oM~JA$&P89c(07?DrY6hO4o31S(_AZUrRE5JW~{#i{STF!L{M55g1N z&3aD%;7Oy(OX7Z;Y+LYqSOS1jbhw-Z?tdHsWsSw)^)K4zpZ?5D`vmttIOQ(j{ukZm z1l<4Vi<)fQI?KB9lXq)q zD9R^`nwhL5&@20wy`B$#I>FoYI|87K6xhulP&6`BQRBwf@otj$c>bhb!jn#wHNG%i z=IeD6UV1`(r}8x}UpC9Bf6q?uJ3RkMYb5z0bJU;C(Gcl=J}ZI9Y`_1jKYso2`V;et zlvm??jo@MSoaN8PO>B8$X3x9 z<+_H|y8wRZc+2-K2Ni*e7{P_>vfxB~H{sv;|M}nl+kZfq+SjMVj4?Mo$Z+B@=vn1a zJhl(xE`(qpsw$!+OC5$Jyz6EY0zw3$un0WD7(|G^&3E^$|_LI z_dR(1lR2AMd1GxT@Rph6y=Suf>|60n$Bf~&fRo{u@PGaz1uh|UBW&Nq3vAe~PcBHw zP!lwmqoz(^95LK-Y@%prMT8a#>1Xp-B3UN=&P*GayQ4)rDwsnDHL@6O%sgwI7Uf+2 z5v&nvMhUpRJ<*1UYA0M>!S^o?oFI7<&G7jvM!NOiJzpRMqD8Y;?O9>%t~y-!{GGw16?hvNF$%5PmCmt~|$O5@Pc=Bwb8UPe#yB z-ua3;g!xmqmV`1i+%B=zgW2{lr=@Fl(v!BE)LP9+ge>D(Q^;ID&EXofcCMOBzUgB}%Cga5~c6AJtRBCIdDxUTPBm z&KSlhy0iaL#c0ns$3k{U*vPkyJLZmG)7K@Z^ds9=O|&o0NC;a~5u1U3*yBL(r)i0_ zI!JQ$)ik-v61C%r%1 z-in6E;k;Xa+!`ryAV0vDGFuCx)Z{DBP``=TsVd!A*wzg~O^|DJ7QzVx$ zs8^`$IQZXr@3rwKe@b^;k_v3hXK}}5(IU-rs&7T;&}*ve`Tux&eX|~J~x{s zW>Y|mwNIf;jn#gMH(4B84GU3GcARtzbp#!D@8+N237p%#7TVPdL_Gbo+%AjX)AvubP<=*hl53b? zzy|olen?yCux(Y<%Gw{H`EQU(6C(2t-q^>JwqBdQgmj8B^!~e-Y-kb)V6fe~T>J~^u*g*_t4xGWwu_>d+ zITxI%_)-BhY2d66kvD?ZAHg&wf^r-fV1bI4>f|R$o3zI3$r;UB*1ZS^Mbkm&XRu9m zn_XE~Wtyqvl+h(A;GKqB>q1U0v`E5bKyaSwDTH5gYL&CTTba{=OpeAkF3Qt-oV>4LU5*j(~ zquPizPx>-XN;Wz5Z~v)yzNUwt(X7fB3tu^k9pW$dYGexN)K6$i-lak^r(@w=SHR0j zTQJNzJ<$d?stvd?XhJbqfklDOwS{F_5pNk$lOX7V6q`AJ=J z^k#7Vzf@JM+b*51_lTA(Z~5%{MWR<|237nuKVkZ-JyGl#o!R6KzV(aI@BInZ09rI~ zMXn}MlYtlbk3~eNcDzH9rP=)*N_`E>$H6S*($1a#LNU6$VhS8@DIehTrx6*sk$?LC zgD!sazw?8Vwj2Z%ohr&{+wO{>N%Dv3>*c$}hj9fh6E^y$bzc|C_&>Cl#n%;pnMRR;5(DC4yhs{&K`R6QL-ThuJxi7K%4}U1meP>tASP$TvHE)_Gzbxp!HbWbW?!4~TTSS#<9 zA~Md{p!u z{$LWJYwYtp>3A%-3GRQW{ypKDhU1@Mc1Tzkqpo9$+WSL#C_n@07F45l2>FPdmv`<H6i4Q^4<^aKzuslSW|eSY9~U5YHJ$}Os!h>4m#O7` z`gKyjAw`|8>)SuBWGDc4Zb&*=`p~8-2Y)IRWG?hUrAa6JFL`QcAl7-OjlWsF^_{L> zoeH(kQh|vt>y{>B0#ZXDUftqraJ|}qE7NQKu)-LZOHP290A>(vaIJ4Om9QoeFJ1ZH zU{m&imqKYH7va0;2?_;j$AXE^U4j`beTvRRUnOwp{Y7G13pj&%+E^u1RXI7%xVD82 zDNw(QWsrL9rR#si?T&Wd@e=%`>QUas3j!a<;A?p79WEcoX;bHURWy`nA<96R zgw}I!6ZCkywFjW1sOhwAmT7ewwQNy0hEjdrqw-PtY z!#`3>Ym{c~1Gu_CD6n&xQm)MJ$Cq+y&XDhbovQ?5)UxQ_FN4U;^aTs^qGc4XJC4XS zW~%RqBD(V0VSdveN^~Ia_4Oe#_26}F9hScvvZk%e(iL<Z8ERcEg!koq5skejd>6yD&Y>Fo)kXLSTL%L=^HchuFTqd8Cb?Xj_1G332ZxI5 z<;cYdaQ$}_8nffhb##$j19oKm-7>d}xv%|e>}Uv>tZi(ahAFz|&FwThSohvqEQ&5^ z`Rp$(-f~6@=p(fVPD8U3VjHwv37-FRSEV^5Qt_O*ec2jt{Au<$u1ve=1kvyRsjn&e zE`-3X#UAIP{3n|{vcMZBK`Fgw#l%kPY!;w2j61LdUjKoE4hj&J=Ms8=Uvy8b+;HZ_ zRJhef+u880upu3CAF#&IEmfPSD`C*zo05a$r%t8UPiOBKCVoE){~Kv!rj(_%wt%X| zmvEGLHA)(ko@q_E{the%$Vy{o)gc&2th{>Ptzir2zXE|KD|y=cTyE$$(e@i6>A!7} zpb62RQ_NXXuUd?SV9I~Larb;x;s2?hG%3d&H+M@wwM{m-^QVyHv{<*kj_EvJXuEw6MC zKqFMAJXy;mekEZ?C168o?K{(7;Vsl9g}}mX50retcXlaGjE`{?lEVSo-wvHGlA8OB z%F+ym6T>Q4=u`z&80v!lUNc97mN zBqB1eDyOD~Hi6_zA& zqL*)nKumYZQX8TJ8W$=*FQS4iD$8)GP@F*p&d8JyNlf+&p_1TU(XoowgdFwEGAX-v zoL_&7$kXtzMl#oiqO=b)Nor|@>AVW0zHyX|-JN}f{`{pNwF9+HJg{Ofq+1RDQ{(B1 zM3tA;Dz5bVb3GtxcmhMfWEg4G%Z7mE7-IXF_wJ!~4aMfoH6oWiaR^?mb8TgMPOKtB z8zU}z8neY@H2Y@jKJy-4{DotvG`DE#YHJJ(fI{7>m@2ndpg0#dF;9;7?X{AH&#Eys z?GaTcXqZ&WAbNH(DmnL~-i4BB%Dk&97Y{|L+EDk5XChfVsXjjBV@C5Iq_@^h8kF{r z5Y16xvnrc6y8#OJLPdyiE~i=Pd9hX>+t$()k`Soi^G7Pt$6BkypR>#nR)MH{xz9r8 znzaA-|DntWk~diG>HBa0;EhYMT9YupCyW^vcC9hgJeQfB&nL zde~(OQTPyj7#wSNvaU|qXu7dyTckpy$3TV5eC{H+vA$ zx~sFG8bK}#poq~02r?zx%~`bl)I6nQe32gJKe!wIT=n6Dn;%xq4AQQFSBAG89~*@= zeNAGK&gCq+ooBiLjoQSfL{y7leZ5BmPz7@B#?N%Yv1Q+MMn?Od)_(hur$ul zAPG7DxBuETDO@}YkH4{HYtIhFy7cK&8|Na6xVQQQ__k?L@4#0ol;Xl4^07k_du8?p z^>VL?d6PAwx5l}-e(|AScqnl|Idrg~dA%&A!-Z;Pv9XYQ^%eYl>6ntnmn5xzCK1+$ zm)_1fwU4K7RofuIYsyy4?Zd5HxkDMeUr~WY=eE})9Na|A%$D9QlC}1{UAg;zJc%N@ zbMaY1_4G@msd!G&f>}v8gffFy+T67$wOklS zn;I&l2GClFThj4M8S<2`puM^g(}+BhxMALow9K=2czXwg+d#v z#?0j-f7B4ZH}rln91=wo4wtF`Bz*&m`KU$2ch$9;+&lHmO^hfuy-rdz(Wt`mv0H0B zJuuePlcYN!qm$X5jcOgIK$Q7Wz^B|7fS0LDP;zGl zF5THP{k-7=SiIdNXr1VjHK!VP-puJ`JQr31BsIa{Lv{%TB6Q-XvEHq(VO+R-D|nRo z%Z`_Sx?*Cq`N`K!)+JEj^bRv>uHXr1(lHXo3ve1y*Pc7{x@c+6GR94N8P5II$*cfO zaQeMRV29l0QZg!tPG-ciq?zLqm^@C#2vtUU{}jrqymDdqY0xGdkUd6uf_x2?POmB;f|jkP}Ya2??buXdlg!_(iGKF<2^c22tgt(U2g$I?z_Tv;<=|cK58K@*4~x z2H8R5i6qqo*I1Ri=>Z8i^lofw&J~1zNSj9{OThUIXLREetyRe|2?fMXo`nI+z-6`Q zkO?#zld=w)&-;dqV?V`4Q3Z$Bqmt$#_;W7=uz4BCvh9 zqHT1jOk(z;@08$j7>w8$)bolagsuhUi>JA?cx6U)Z|V^ zCS3bg>(<*8JhuunRhs4g<()@~@p(U;+r(9;;yXAd<^5CBkh|2{vB^Qi``z{|N!#^4 z+Y{>!%8d|bFv%R9+bCuMm4!}s6+?LP)8r)rkiT|MC( zKYafgedHT%(r43|OdTowSi1aYTKydSm}#gw_)_c-y5B|uyoIWfojk)vF;9ccg|OD1 z!}Nmi`o8ax3&t{$5yvU-xT~5W;Rx)X>^=-NAnfPvR9tHJ=B|j(`q#9A&^d8ji}9Lf zzucO7;HzF9!{Geere@npWYgR7I=gyr*5uN+0x1Y!)bj{fxPMijX^K`|e(OvP^sl#4GaPmU`}8NCs%L>ln&bj=rd;T`kOMVyY%Sy zrtXTy!?F2^Wc??3kIFlXrVDy}CrsW7T%Qq572$Ke0l#_rk9< z9;bPQK`(g$2K4vw9)f+6u}@dI#H{_b_?feI8~)+91!uYGar>Z~xf(BevCWae-(ntj z`rWsB!bMSbCo^CXkw=_BoXl~XST_1whB?HBY7!f<-Bed*9ZdCvhYG{2zt7qsRhSeY zsjQ`A(kv&Nhr&WMwp}aM(xiG-jbUd89iWJE+8ZX@0HwV_B*hNA7)IBLEX2~HGR@R# zs(aQV7HsoCWbM}r-VFSoRDPk+cUvU(vACPojDWL3XAHA_Bp zGFbs5xB8@GEJfdSGx48`A@6qjo$#L5gR;|7K4qakG5zU@yT_leZ>lvgZZA-MWWr$p zZrKl|f2B&tLe_;6Sh$p0XJg}q=&2v>=?PX;ft5@;2Laf95D|-`zdBi`#G)V{&6JNw zPM?IQgO&GY_>UMKll0_}Sehc(6gxE_rWY|h?O98X&>}8jrhc``z4VrIEvA3}AM;iH zfpucg&>L#4;HjRG8+S40)XP@lZ+p|x&DadRu_1O@vGZ$ggl#=dEPMcDmp>)Ol6AKM zH{X!NBw8EfDjdXKO22|6{@}vrkD5bHv)^UrB{48@sn_Yy-QObZQWWGbf$AjGU`fP1 zp%2J=m17iDH1-KkktS5U_756%*|1dH&E@3CnO+c>$f!L z8iO2PiNY~8sdlc^y9^aQy$%aLs;SZA)iCJa;1s!N~*D2FxJsCn^ZNC<(DO(x{T#5thsV)9C zpluIM43f(cjl=59BYy)wKY6o|3QNt9LFiC#O1%o3Ue+CX;FtWEHK@hao`NR}?%oXe zE-1!gduZ6}z*ddWoA9Z0^A<-O7Ni_EU*=An8yO|5I7(>DC*RZ~p3PxOscaZz$L=pk zL`yKu^cwj@`I+$q0Ln&BV1zBO@6`1KN(d}vx`YL=;C0-RixeMg$}th@YUJk2es@|r zp}?*)$;J5)s;8pPymR)6(~p*ZNya2Pk;8CX{PH~3U;Wd_Eb&Xx<~2&Vxj$I+fx~|i zJ-iQ1x7$xHf&;R)=_O=2q@w#9VWrzDiEfrX6X&B@@?`|^_=hBwj5*{wp`#Izg8xX` zre$7-*h6+N1sDTCS(L3EX;p{^_K-Y0`2R~+xc~TX|M@(Xn(T5tLh|4L$A9xjcelgw zrEN7{%^CE(Da0o&uS|DPsSfK`M)ceA&vts#AZvwPh{Qv6V0kvuqS?IO$FXHnY-WO9 zrW~yggvVEkt<3Y@ZVo%g`n1h>4DphAQE?Q_SE0q|?}^Vvha*e#ZQ%HEMgRBz^NqN^ zI%&&kwM8alJ(5Q#D|tp~{CTu?f0T5;MxTTTny{~hBc0jlO*}{>0^Q1t7iurA^f|Cj zxfLuf`O-2Fw^lXyTWYU|OFn&A5@cF%ZEj!0q%e z$puX^H*v^^8|Cy%Q%hbruOxKV;0vgE)GsvY(W8eku}sDqCp?M5F)+T0(j0H;&yH#zzSP?N<%8FI8GR*^JcA7z651K@33FuTge zdR`OE%EqCGd!EuhJka%D9P7GvziS@hW6dVkikhll=GjE##xRs9iON=fGf!2nv*qW1 ziC<>qQ2zBF?hQsa@}ywvpQD;G4LwgHPd5}kWd9`^rokR73_Q z`_N}i+CD+wu(Il4%%;Ua>45V`4LE-)Ojm8r6%GCM7OHbz0RPY3`B=};kc#QoaQL?8 z+$I6N==&L7=fj>5$+YZ>LWj>0x@W@lW4;(fR-*+?`8|qf=mMwA$N_r5`!}$q;J*dV z-wqgk)XY`sDmlLA^3cwjKby~gZtLFovHAh$pY%Mt4n`Ve^y6i(hlx+Kg;|d7YBGU+ zFk|gO4EB#@qHsDNu8~TA#9Fj8{0U|9cBK=e_uHbnA)y!DV$y}qUqxFfGC{3eoLL^0 zUbb&$ioU-umNG!dYMx=ecWg$Ouo+mmpn2nrE);(q%M6cq*;dwM zdFO^YSJ2Fyh9?Ob1@b@0%}VKK49=gF4@PBwj>rPz57Kc2Ne~p@y_qOZjdniAxI35` zJ=2yRkw$V?P&VmlHh)2X{6@5_LgwO<*JRu9xUtU%l0Lgy?PRr;4uVkhh4OZMW?$8Z zX+(P>q>Vj@e5_Zt#N;B}EtjR!@W~0XC;Q03?pL2&jCd)oXcz#msGLqkn@r#xvWM_D z1_bDTiWdm=u~nixJL2hLe|yd`igrhv`vNfeQ#;@%Y`o=UJd4U6<}r%XPz(d}3dG}_ zT^Nbmz6zU9$<=vr#T`?8xInJsMT*czC`FU5lIDYRqcZi?QlzCy)fhgTik4E6;A><2 zM1_=8-9C?3r+LuMl)%We$}lTQ|F)~&`@;``N-#TeSYhq)_N}`^4m25kwOWHhM6}kR z{0*T*T=~hB88y#W3pi);j-lkLUfgervb4HQYi9gC$g>*2{JRM7ZRH329Yk6|k6Edq zSfv)}4U5$_eD&YF@-JTduO9>$eVjy-VzA%#x~Br`ugk`C)k#Cq|1NYP=6Ql{Gk6Uq zhe#U!oFe-{ko4UQvRix7K#6sU~N zao@U`5;HEO<2WiVHj#>eb1Sy_t-uKnRn`4=i|HNBddJNqNWl`4Otf!G7^guY`9eq2 z2IsevnH{RRSTMvRx)~x8tl=o?OOB$NE^gj~)&^!8D3T|T;b^#+o~s4;8~;y#dG#MP zH-LMl0$l}^YUgd$D5=oEh@`}GH6ctaY`Q4RNitQGB7tRt3mO#W4xrRd)m;p(JHc~y zF>y=g)X+cDFe@~L1;Qgx)SGU8t6YRI+@y7f+Ws?8aItuwMvE z6!u((ev!y$kHf;a-4WCzMNU+v_F346x)%yi4sUgSB{rL4sR?jnC=fLjza-$niTK1E zvI3y`s^UtM`He;|Lqq9Mv zF$ro33W}Q6On(rEX9G*NFi#s2J&0JY*%v@P!+qXiHQ%aOqX zCt)ts)&3;rtR5>TSDRv_l1wC(L7NTzsKfu|n^t{^bhe__UiKU==7wm(wF6p^7{SuR zAzm6ZodS~-EHc?~L}EM=b@3^TlA8MT=1))VKuQL&z;y<$K}vHE|2OBO_Rv}C}|w(z~_ zHL!r&=!YtM7)(BO=|KpG&kYytd0Iom=*z4A_4@o<&TWAIUpeU8qKPVtE%ySe${edt zvh){t53OKH_O8{$ZZW`bQBIoIdLr9R=YwzXACb7FKOYT3dd6Q5ven_t8RcmOBnaO#dk>U*J4(Y*(L%vOu|=lAc8LU_PzG}h zgVwqyj-p-;ES**@hApo=nm9e%vA1wb9Y5$}u%L4Qf2ShbZU*wt0w3tVz4C|tU;SBC zo9>Lmgu?x2USE*LvR~|N+Yo7H<&Ko)e*K=mgY@PnD!e?$rrpHX`=1Zs|2vvWs@6#t zE+wp$*kD4ZZnVl$)Sk*__9r7^s{pf`M)d&s54^spg%&!^hz71VBtnH6_{#rRe{CBS z4SyY9Va2yP#{M{VW6cAUX)B$diWl zeL?x?dgox8XIK5C@4wYyZ4{0hkw#(R)!oFEBaq?7Rok-b!g_jcSj zT}tfXQ;!~!;xN34Y1Y?}@K`q%m2lk(VD8$He=(+6G{}Z{hJF7PZ%Vd2Ykj#6> zr6aho-a&*vHKWBK*Bk@Xzmz5Nnp4@6F#=_FQ_6b8L6Clg_rK+BV%y%5hc^KGf0otw z@TPZcJFVU580*#l1I)j$qxJr4|A`Z4->rvO%z#kCz_>vY@&2+dgqem_X>|UHh2Z*I z^W*%+2;u-YPItL3_G*@FK(go^eJkyGRZRQ5Z>^!X5>WrWr9GHO=BS1)G;*~VJ%#S6s>pS%`s6Qf5_t`iwGOdrG2sAjlatG83XU; zp(BSHhx9t}5J%}5ja+b$R7ItReOyO#p6-1Rt15r3zcFBi zqOUQS&Tz0-e<<>22{2hu+GfmOh?q6XXIbeUH^`cz9mA_gW@{>sY5sJs!^|cT<@gtf zb$l9xZC_L#)LWKW7zJXoZpT&C{yl0i(g7J5h2 z3^5lgcAC=?rR^g3;#xxe*^Z)Tl2BED$u?-LlC6e0+`xNDazfEbQID;hmQ$f+`!i-l zlLTqYr8i@qxCj_O-M~XcZKBg+o~iJ?rC* z=CI35wA8)yYyLNrF}+#_Ua%BY(PUASZ~9;0ys)}45EkzZgQFw#OkWSa4UcH z8A(PUMuGj$kseGts=cxw7N(H~G+kEvoW=rKyO5o%V)T_HEXY=cMWhm z79lH2!|sVc_sJY?5ys-VV^~1-z2{3vB+gqKg8o3=cVto{4KqO28F(Sm!5?0zr!Gyp zW_+LeD3FabwjAi`-x9AZL|&RA`!bFusY_b$4)}*uAZesGZ2cs4A9%h^=7pAWF?!R{ zSGZXL{2ePD70d7}wp8j$-^Vn#e)z!R!XgJ07{ji)diTS!^s7uCiLe~$U*o+#?o}xg z;>lD5_|FSp{YK!Vw-!>?wo1NrG~|VzS*e$~;#nebyAHgIchav(cLO7X+!?w15FwTa zhPldqPFij}xhdsaf6=~t4`4tvW%OjbNbVuUA8#yUl*Z}QV9EA<3XSgzl;Nu<6wkMgXIsCJ6RIY^8CE89u^C=7oQ%Gjmy_>k z?L-8*JGix4PHp|piTL2Q>x&9b{A!fXDH0F{wICCN2bfaC*N>iBmIITXb|=}vfWRW ztoGp5|371@_LBEq6izrQ?WU~{i3WFC5#VnnvFIJOrN|%{piJp|PDo{8X5}b1|MT<- z)k{Qf4I?^@3fHin z=2pETxW{`Ur3x1^=mVj_Y;u))GwqeC^-hRO7UB9>h2NYNFOchroV0}PqD4=@(wNL( z=6^joj533VRKlSW4A>9|G1`xH-7O229_G73=`QR3Sid9lx;w|MF*ifd2H#zwiO>->31v#0jmM-3gn4-FJ?gMRo0-I#N+6V*GJS+DwQKQ)Ku?ZUw)npw-cuGBAYO;4`1 zL(A1Zc&^~w)bygvCXWQ93*XNbWHWB@nmhIec}4lAfW;C1I3+h3fib2#K9HdkSKMI+ zrtb(#yqR!IY&XDdAgl0+`4HuEm^9m!Zs3AqeZ)EJvA%5PJe+YuQ7^A3t6=0#I%Ax% zh+10^sp|0KC2h0W{U?ZDE$Q6*TNYEM^qQ_)Kkt=m7{jDw@w9xTxgF;DHVzU%7W$i zs!<4m9k<5q0xUQp;&Ux(W=golfyqtPG@q3l3nB6q(y*p#W}v+YIu;4>X2C-je8EN_ zBT@=1jRw5Sh*Hh6t^Ym8XheoxUAr)tTa*4b=@*A|=WiWn29wV(^d*kaWoZ}d0c^+( z$!q>(_j!EAqn?qm!DcADbFD|f>Tc#H9kVZynd7}#O7lHl%X7m5%e}MJRzX}tii~P#pilAa8!dUDX z+devW*D3hgOMK+yg)YOLE8IqmNs`YpqdjLXBC9(T>v`0qmj7m}#QKYr#}?NGa-_mr zOvHsCA*hR4JS&eIkpB~W)gM1xV`OOuK*uH+b!NC;`HSDxmkzX3pyR&9raLn8KjeR1 zark3yDk&hvmym1a9pWZH)x0olz$|57$CU`StbTVPq#0us!1|3uaEoki@IP327oXET z4SRZhl`m~ELG)Fr0HcY}vRHnVo!M2h&Rrpu+TFM*iEymma?2pu)@Jm7@A2rBna9Ci zKE;xRFHMB3P_&ook=bCnT7IHvNcFND^Y)l_Q*9Y3-jd?C%;`>o`~}}WV`cHpVxLuBn7k3ee}Y z9cf>ga1U2a`?7enL`NIzz!}#rZsi;CqR!c{IujFAYYQI1CJ+v0<&~NB5KbAmhZpDe zYfns4ETM)tDj13E%cXQk7FC2kTmo9xNs8Z7L2+3`9nweK^Sa7Y3%9VeqT6iNL2BtV zTFrX-iZOt9j3{!|9v7%rOK-I}nr&uAH~_bxx^GcM0V0#ZEk zexk5y#ClyJG8c2)HnTkVDYVXblE5yM$4DdH*_i0yt!0{Kv8s?Mnv~nFR}mkt5Yf?V za~xK>d~y?r^!SYU_F+$hSY*1=3gFN3rmL7>!=Z>k{C17%k%C=Ho*R*$Z%#|UPCyPW zkwC)+>K(1T0RQIp$)Pz-Bk}e*R&i*(q$o%G*!5W_I|Ff5(fHk9(mi1~Lz- zGYV3d{A%`OXVYitzqZ5XZ-hthD<_d44Cc~hI3!INXw5r9Zs1!PozjL-e8LpZ`y7WU za^5UdZG5}=`AVYaLyCQL%*g`Mdtw2AOzS#gfd}xu+2Lhb}qwS8+*u-=&08$!v~m zul>f%m6YlsUTF~6w5(DVzBMnABKaj_{8gTW`cV+wAYV|~=2r)(A)H(Mqd+KQwh1Uu zudrv0__qyn100>EIdM7*bKy@w|EC41kqIK;-e>{*vseCg{uZMS6?amM|Myv@2ElTs|3iJoQ(?+a`V$~jArr$ zXrl-N;=cra_{o8Dx0Nm)yJvfV|8W1BKba1pnUS5&NW4glwLDwY4(*xHI8||}8I#90 z^2w34FEPgz6)GdX4n{cw^uG)TR1%A;Ph5;f$}qP7VAgpveibSRwe%we{Dxa&toBaX z;jEY%J=d1{B!l!(-o^(*=I`(Ce{s@que6xdat1u=CkxNrD7bWp?B812z|I#6!FKVg zFiz4HY$P$LL97nKuLVv`cyw2Z=ugLZ>^}hf`ArqcA}y0Dm3|@aMMy{`?NWpHBw(_wHC-a+wugP9NA2jx+U^{ZH0RM~a%j zxt)u{YblJGCZv`H18qGN!2E~0)2^B0%i67?z-;7<(;Pc98F;v6S2HG%_#~)}TUx>~ zbaFOdOTqT}n?%XAH7Q%6DW)jt1|uKcYb}o;*OtR-cX4UcqbXX%Hp<+xtmyVcm%OdS zB8eBzwTW|en=EX8n8(^m7mG%Cu@P^uQCq`Yg9yeMle&w!DOw!wU_OV;DuV<9wuKCo>{k(+(5~KVJ+jITgu+3>mIgs8xm-9h}JWW`DRZc!ciwPDvea5 ztU?>#gefxOcQ9SrCaCOLH)h|eGHdMXvBH$3Lq={aGF`-Gdij(wOY*I4^8fSibAbFC zu>Ng$uQ5cM1F}Uo8Flp6lBy4mdevKkWm8I_rmI9}iiUo0?!#OObYq67u*Q^iT+Y49 zB}QR{Q5_xQK_La!Qi+gNF`EZGhGSHb;K04<_YHzFR=hL6lw{%c@nXY?%Wzp(40IbM zch6MVL#T1TjaqfA#yVMdKi6a`eIk?O0@cYWTqFBfoEnHA^G7k>LJ-7eQC(C+Mrf79)_*iQr}?cB-j`q$Spi4-JzyO?|itChtiVrG%~b4rp|>EOA z8o}K>Ad?o4Ux!A@$-iX1oQz@3wP=Oub^h^#m+clRT_=D_K>j7#o{~q|P24soKJ^Ae ze}DV1gFXcnI%UzH`}Xjpd{l&h6lE`ePmylu-d=}-KkM5*N0C<@GG+tcTd2-kfL3pzT;)Uo<= zk4*h+nggA^wvPL2*2_7EQc(X1BdOD7$RL;CqmX*^_oSB`R8Ux8n!Lr)-kedc?2k{| zg|L~>*gVelz)#&qnnc_<#&xhkdHanw_uLOGiy0=#)qhRmP$XLJq>C!smr5>W^k5x(kL7RXbSC2JRa7>E3wIjCR-W$U=7q z^@BdXDXXrzX~DnAMHTFjQh}K=G8XS13^a=C^5hg-OP{H{_ViC_L|bqeky31U0z$$xH(9{kPOwjI79UC5ycl zW}^$p)AGm&FwYzyT*byh>ap7faXNSoQvxd{d4oFgR*QE9Dz$ zQno}wY+ER3<>`<1PyxiuyfwEX-0|kOP&sMalq03GG?2dsOA4#61NYBAj&KZ2!n4t% zHkbDyGy23qj1{LTbk?c~H-LtE-~|u&T(uQp<-fAuCHjckLj5}d*G}CXM>EnTC0b{# zSY}eTWH~5q;9JfHkrNGdP~^-;z%gzrG(!r5cITxtoQX}k4?<<2C5VIBeM{_aLyEPP z7x2|{q@d|a|EAPy?E8K{9l4s9M`@ZRh;7ashWo{mxpjHegnh6o+$B$l0uEM{#h;6o zeKCRcvYzP^NHFpgs_#D5f=7X$aww3=ibgK$e{Q{?O@ThBuJizRAVKi&@i&%v>^YtD zNQL?KW?!TemIM-xtc8ha+RY1j_(=+JM`yzRhz_()S5!T87)S;&P!@N@C#K*KFXV?` zdcoUTR-}XiJ7gjf0=)k(*U#_j2(PiF6D*;WOpJYN)HiNt@+BU+3_=AgWp|F(8Z(f_sotPJ=Mn`i%b|0evN?(n+*@5#3hr(Rv*C3wuvV$^c7r_FdZ!b_4XJrDmymxK1@eiJu1MC)QKwFu6P_6;hHOCgP@D4Ae2 z=>=niZ%yyF2`WktSIGwV3~|Iy3~%u`vzn`-HuP|gCTy2}rkVbH&!qlfmHm7l`B1Ia zhfb@O^8S;*vyZJ8R2q%VW^I3LWE?)yT(>;j?p%iQ<)L!SREbEYAG03Z^6?vjN==V~ z^s{ri0@d5FmZq;?ANsAOCtHWb=$$86y)zDnJbrBC*`mL*{MR84w)qu>3Ua9m2f5>1 zsqU4K{#IiNWuRHl$s$UAOZkiNm}MOd+_-x#uY+(ClNFU@UY8zn|G4Hj z;$jlZw~5Z4Tl{HyE_rTdKnrv4@N8SqRw92&Y$i z-5CSIyBnX~PRo^+z&U57MbVJxZic;*!Y^$YyJvpy!roYn(`4cln zOV~qwFqV}CTSC^9Ef1js{Sngd2={NEXzGq{r7Q6%S?aJsk@5X&u7uE0vnjd?3paU- zxE)Mt=)H`O2>ELA#zr0|LSSged&k&oYPK;*0&bWVsGl8)DQ=A#;wt^7oVKJu(e}!= zADTjd6HMI|2lziwQ<~U8;Y(SX%)kHG=9H#l4(dON7v7U^RCh7a{#3>Nn5L9eA0C== zsGW_iS*M@-S%yY@NpT>ut(;|PIn`8I5Gm^t_QJm$ zLbDEEx~Mk?36R8ojvUWc6_VJ;T?m`MX8ouW0Da{z*bOCBzuv!G8)Z{IIh#KGv{LeC znD`!p!$P-d_zV-&JAXur%K_-$CIfP5&O7_qQJSNH?d@W@<>akA!9yM=>*vn*^f|cd zNn?2n5nm@XH=~fSJPIQX9Ci3q^8Nk}B2uHUC4H=l6hU-bGq)r2p*^M+pD-DZle+!b zyDnafP@h^YgV7giXxC1kh-)B}M$jL{&=u{*_2UHbFBKP z7sp|2*_>nk-x|dSCEy9@e~fPnn3XuxGKq?a@ehTDsnMLOo0<6^Hz?Ym4QI5(FoDGf zMoEV$f%%VU9H_k<8%|Tm0Ns%pdpm_`6SQ&SeT9m(mzv&UiQs*@G}^Ke?as%|Pgjt= zH_lq))5r(%7m|1i77N?BoXM;-Z!;$gS9@x8gl!_l%@em9pQaf3Io{8-Dt1aeFV^XB zF7(B`(0o*1*4a%FHa%NKp7TJcgIg#e5~AJwc<(FJG;c*t-_S|d zA0Nbpn&ytlPbD;WZiq15zks&%2YMxZC6LzTtiGdT9suJL1LH@t*@&pQieNsMewlcG zklRT-x|?>fB5c{;bNm;|#DX&nmJ!RPIH?4ow4GuS{73^CN2I8!P_|G)6x_60>Eo^_N2O^tt zIGJ#HepA@W^R}0_fS4;P zsroXa{{$w?kTML+xkWtVEnXmj#4kr1C_bM&bqN+R-t?oOjDw{B>ff$1SAjlI9>W`X z1GhvR3St4ke--*(pYd=C5^$aQ5(!^*DxfijyD)_$kM{cg&97(DdF5|O!#)alS~wkl z#TCw$Pi~CCY`KZym^7V|FT@SPR;#$A=}VVr=()u3-V2^uWT5VpMEW9^ex$YP|B2{{ zi2g>I|HWbg@E_$1sONn@)3!up(!k=UO3BX~*~|P)Gp~CWe?McZ-1=PgLkUI=#4Au& zPkQtCMT+SozMdsWb_a4LgEkOaR>11qATD3cSjQlD!L?AtEwoM~PYYw1l8mGD2k@U3 zcdN95`9})-JQmZ&V>-kzN;o(EbtpcAkjXm`l5B>Ia&@IoOWnu*?o`_yz8n6~&_g#e zkQe4hyXbV6EM4WQN_bH{qom4hG=uvu0>~f4O6f@pq99OWWIaKp)&E%=JKOEn2b)U= zO-j`)*$>qcm%~)1)H*3gOliG8kdG&o%gjJZ)QNrk!!9%6LoJ?e9Ynv6AtLgLr2WG5 zxyPm-N*DWM;!SWAgvaU@o}3Z88JU9n7AY)?3wZvloenP-it`_jbyAkDX}AwDn>Q^s z*@h19aaaR|u#?J5FM9*JBITRq(;*B^2+Dh-9*afC@9BPIp~9#-a6N7p0{xd){sHj+ z!NV_VGNV{G|M&kZK>zc%!IqU!k7XcO9PENEo&Buuzs$2wgX!bHbbxFPxWtC7{gbIDkZnxmRWT$ZBpHL{0!l%m5lqfbY^ z{*#k#udim*fBAP7C}~?vRMSE=ao*dh-Re~CylhR@)1!3BhHgysfNc^HVL<=L3h`*w z1HS*a+wV0=Q8)7h@{1{qb91C_OI=CAnNoE)nGN)dB`H2!Aq8LNApWv}HVrUbcObgW zSo2xAvfv@bas0)`5Az-uMS-P!rKpN2XJ`YKoFarEDp>hyHc#w%M_CggX=I8hM*a_sleB^_Y z`!5YGeyp=)!I#a5`sigsAx3J{k7P-$K|joxsF74b*H3s_0V#NQjDCd3p_RnWdjcZ_ zPSgx%|?2=20p}`_4-&{OtOs-Zo@a77$bc4u)8ZVg*@e#$B^ZXodN$h*jZW94XRI&rXrmD>w{4CG$|>>EazyqOp5{l(Y%Jf$hzOM7r2 z!Y)4*Yq4wQh(vpN`5c!K;@!z8m5baWKNkj(9~HnKbw@bJmX8d(i4=Gu%iR9v7`4M6 znG{gAugEeC`57SLhWaJLu9u9QNhXwxg8LLXLS^q4Be}oOXHwRI=Q4j8)&KP013>@k z0ram||M%dn@x8LJ+=GG(wbH`;a{A+;8jel@-T?z zQnvkFN!!D2)j_@=3WV1kn78V}n4DSdQNN$Wp!goW7>8Co+WnQqy>8?1Fgt%liAmOE zdgr}aur7t(7xsZh9;xY>;I~+sqTY9bO-C*-y3qtwMz}8DA2Kz6(q(}CH>_2W8Z|J< zwGs1$Y20EG9sA}&xUEfNdwp-s@+TC!`>o}aLZzNKw~N$tz|Qp#JMj%Y<&#odN>-Bi zkjvQ+dmdt6pq$IQ8my6kzr?G9o7MQII)kg%1% zVTV544TceqGRw9D{EdScHATZ%fAMFSj`yi#HI13^J23B$1a^!<3q<(B=BCiDM2x;* zf7;+RuNQOf4{pAI^iC@aDswFu<$@)QBwR^TwA*wXfc))ScQPTQa{OJjaARotIV2pF zc0V%8k!sr$etaRD^PG`Pg;3gzS&x-UF{w!Ia>~~z@|$O;JO{eV55=1J`h{{1VK+qO zI|?rCB!ta-9LuHxXQY8Pt^?ffW$;AcxzArP@4M0_M#+Kti?ZV;MHjw6y1`{gt6~uH zA@7#0)z0l(8J6kgbLh-3wCAbr>Xde?J(U;N6V>-_vt{MMA7@70QZ&ZNelU5FE;IuD zAHwR7jnOmrHl`0mr;3KJ_itZ-|8|T66O_-aiTE2-=Wxl&3h-a3I7XUeh9K0E8a5u- zGS{ra1!p>2HvBzVxU;E>1_Pq5IQ65o4D_brs104DBQH0f{#wE5qjXejc1-m=SAAC0 z7jYN8v?LQ#GM5RDKbxFPptLG*@kd!>ZE@D|EUzFoy|m{RH>B$F_vDzwPRJJqBlV1H z&gZVZp8pu=Iigx`2|5&5qM12NN z{b!2f1&czV6AVW(a@xu!+iE&SJm+qq>6u(mhd*pGqaBp-Lw6cXu~`JvAN`@l1-g#R z;d+4n(Hvvd`q2er1t&xC8m5jDxpeyvuyI?YF=#@b_W6~o#SU99)LLZ=q|(|)h0AE@ z`;>b#&?wg88nRwWRRyN>t)_yi*-{&z6eA&AA?!4)%s&!d$*gXyg_ zx03G449&ku(pnH%5}Zld4gn9;Cl^11;$z#U&i2kz)J+0(Ny^&Fn_c?$DE%)9OfAwA zg)LHoankTme8f>1@dCa8%Q&}~jK0>@@!AK6Nmt$I>IWRYtHtM%7PTL-*LQ63coR0D z5S#Jd_3;|U+oGOxjeTa(cl?WczNWWOZcYD$&r?@vbw}Jvciddv8z>wFs8G^MiYc-@ z&Gym@ZPI1P7yK&Mc=GOT;`eo+2a1k|6idG!hQVJwF5FNy{ZlYW!%8BNUHFKvZf|(> zN1b%R)lyYs!Z&rPO8>09naHv02_C~&2mBS57GXqT7Vu$IATj2p1>LqGNS_h~vy@er zvzYwLh(eH6mN6u))#OMFCySQoTtMt%8Um4RPF0)=<`+u+g|JVFy4eaIw9bupY!LpiZ|K5 zD(%VMUctuca&VOXWcb>Bqq$Zli51IUHdx%)J)8KTa37p$WzqaP(ierso}cl4I}nje zd?pPwJ+LeR%i)hw&|oExqBE;j`Fzq#vy-3Rd+!aLgCWglL~rv@#nsska;~}rApfxy zY8YfM)g*C}WSOiKtJZiO{M^d@Wm29IcTimucd3i=%gLs(#X@q2b2_6tVspEhO=0OI zJUDHyuIH3t;^HO~pH6YC_CuO#k8A$y-^t|F;{G*^0_s1}d;JEQe@Xg`gMHqFAh?wi zEv4e@ByfyGWBDc|`Olalj7nzgj3MBEN{9Z7#vUTj{eas)A=B?j1@}OY>smbWf^+>& zo4lhvJqvd&_5Aia#9bgnt>R7Elp<_^2hj9|gfR2cBY{GTE4)34o-0EY>;LH81Nql2 z^i?%k$KW5j%x;)j$xRH>r!++cTF%j?A6L@}+#_FVZek`#X~_jeVN`p#J$DWX)1i=P z9P*~fv%TK~J~y-DZ(g3$oIL7O4Rfuigsc>@~_tEw_e74qHrW z_XnyCSHS*nI6mQu`Us+>fi z8b;kk=1EnuM#M({672-iqCX@}V#uTj_?cu+E`nbFKmN-r|FdWEfBc;X!2h{r4}KXc zbp?e3`ma>0fg7hA;D5dz<**yp zRY}DJ3t1qT&$IIvE1cj9XeP-%p=VG8>LGqsxJ>G8pyR!^s3Dkl&Mmt;te;)o3Ftq` zL1J@hTG-r&)FG23<6ewTi6ZBV1$4}zF_8{~MIyC&DFvo(tARU4{-g54G1SLAn?}ph zLE+nk2*rY^_DxCekQ(0akcbpw;Xu|TY%(h3T_i)P?m%dpd4n0T0{z#X=jDwBOVCH0-=vHwJQpyK)YtLP*eYTIY0lNl z3KCq{na}I_)0+UN-a-kd&jE+qyhT9$FD>PY2OTk++OD1z{QY13(K%ZQEtQ8rk}V4t*28r^CCc=$$$3oPWy7 zuCT8P&4p=(hXh&erHv)!aM)foa206|r!C??{QW76tw<@JL+~U`umG(8c}K8B*)Q zYIcwFtE2Z{sa2^+{HMP&j&|p$IZ!zjZM>x+rLi7*BrndX{8RO;onH$ps^OFQ*}>1k zk%D?R4U%qz&K5w=vX^8kzG^e2(z^QP_rUChzBRzx|$EOne=R>oY z6*EX8#gY`>VK?3UMfuBQdkMlK&BV=10_P73#Z18O<|7l26+|M~a;vZBhjP&W_zLj1 zvsjVa*8gsvMLnp(i|)0`{&>>~L-y3HcLAoou8y&x5iIqtX|t%!FniG6!4kQXXY<+_k-PGRCY?tQ@>`trL&gHBKT_54xe~5KNa#D^h{}ojcu> ztX9u(uA|lvoiF!c{#WSbDf&%W*M(K9==J*-6R#?yF^ao@-TIeRv?U-r?+2sKYyMD% zrq_Mhez6L^OOdOdNz81^oGtlS)jkdIJ@retglOblc1UeoZx(wb-y@T=EoE2cy}+twnuE z{FW-5oG?b^#E!SmReU)mB)rc$s9<#i((jSEyt9x-=Q&vqE$CS+RY8N8t`p+3yyky+ z?l1p^%wmxlpqf@mR-y5qMfTU~TAIUa9EdI2o4H1%4T{3iMg@)}muo-tx@q|o@367S zH=Pt%lhJpDcydm%4b3GUp>)USOP}f6N}iQ3QH~lIKqPnhmKQ>(ES{Duagt-5ze^3ZW*)1tyLsT;XbhLl zA&mwk3EVSzEK&b(bx;>6m8cLo$;ZiK^&(R;r0eo_pCsj=RC*+U8?NA!ibV~hh#p?zZASstv)9&Wkccx$( z>1IKj?BWG`!&cauP{q1GypOnl)rMPUiS8t!E*c93ZcMiTf2;TNEB|;ppXtOPTTyj2 zi_IUFkgh+lQl0Z)-Xh@e%`#LrlM_My zZjQvDXp|C^PpD+8q$BQf$v~%iyByG8iSH8bW_UNiFK6L3hMuUDCvA2>{<83Ugks(t zip~mkif23gle(;@Y~z=JoMEkCn>vzoO*POD;_JF~8tnbN{^jDk*`pI$} zr^PFuqff{+nSTEP=0D*A!*Uy#{|c4E*YiKKLf-b~LZAlpLfPS$XhnFN>U!^}8~@#K z&urM&z>DmFxPy{(_1(oic-jPIzw;xxqY}pX@3woXg=lP zjVV1D33ts)Pt^JeVlbVI+uVJ6aOIOW@&yGuTvo4DQV8&0$~nm=^-;nL+UU}`i2TCa z9GMK=n>9X8Pq9j!$=|-d8D*yVsV7jV)8iWzWFZ6eb@m;QyeEsxs!SX0WAm>H69FPrpfDp7o6-Z3`fbeZ~z(sXFw#{Y7;# zz6A9D1F}RgDSK&79)_8m`-Y7B6yY0h(X#e-6#iz~&f>pzaVyX)vI<%%<&)c~i85|{ zy4-30dTv(8DnXo&BF!F2MVCCCBveIy6@mcwAN>WW^X`Uc0jK`RHHr5kPlFVO;Fs(0 zbb1Wc>7vyge24Dm>P00AEuR3K$C|BMZSMphD!$gvm$XO;Wh$*R>gW`W79r{Hm8|^u zg_ix-Nv``P_+b;W5WA;T7fRg{PEYZ(TCc`(7Cur`88qv)iB%M1HD3ODLrz+Ev_F(e zOO`|5K>I1)(WZ@e>e_(p-1XDvVb|xNu(LimEtI&c)-PtyHx=PZ>U3mO1WMJ#7oE0= zE_jZkti8otDTLdmwqazR^5`E}sB6?_6m?g}G@p~u7zUNMN`->djN%UPXxrlGP|V6q z-C~@hln(0b-an<6E;yU8b1`u{k1F@4?oi~(W##-hGC^~ZBr(JG)yoSlo+!7D+mZAs zH6Tqok^9_F^;8tqX%OkCfFq8wv}2_Z?%6K_ixWk(Sl*f#2jD|rMK>C5-{o!RSyW9s zm6b70a+WHH!ya^di}K=6wk8P2PIUgmAN`xZ2Lb#+6Tlyc3=0)9@NGHe1pGh$*$mX5 z|MY)ULH#*P77Az7q0guy+-4L`^Azdqt4j8-|D*8#9cj+|zMo!|O@v82F<op-2>2^UT348{X9IBs!sIrFk^84|o?+-({74*KpA1r_4#V9N71@m=?tj5>E z>w&TE>h-q_68ITTYe`~rELjRiY7ES*PXi5Y!sE*PIb}r0Ds3)z*B0dZ^M;J(LiJPZ#XF8oY~b8nVc9QdRiwkHc$Odo+u)uhBwt*6 zmBs2tVzP+F+d5Eoq;2)YH}WmG$ri_dvGQhERK|Q(Br=eKqMjlfMkWdx+rD2cSBZi>hR7z>4-{l zq#Heu=&s;}8e;%0VnQha{Llz8g)E$6N*4`NpY#kwjz?-bct z6;!il^=%WOycit8>2FOycnI}UU4)zhcW*|QB~r7Gy^eK?*S)kI%-^CL$wj_wa1dqv zT=QrDz(Sr^kV9_v;YmBp&s^KmuV$o*yz1hs)Umio24hJDv!xTf?m(lFyN^3m(HhOt zPe}^zX1?UjyYJ&JFvy1AdNq@ORmPnxe#Bb(Fix>O9;-6mHmyW%S%YJHV8z8w^n3d= z=}#}~l2d5bIED_X%<=RFw?-g;o#oT+%3>@WY=hqS0ftZ`>!G!8v9C)G!yky1@>4G` zRTD!LU(Ya*h~(T{%YS-P)LJUr)F);uYOVl{VQB1i;Gfj$QQ`uYEYQD7pUq}yOEYlAF(fBCAC`#wyiG=ZqnhzY%oGn!f(%*^q zgZ*31+m3>#Z)I&+A>{n$myylXPWosCw*^L4v2d;q7CL$70Dn;KCqi3UzhA(QCO}Ag zL^N(3G=?Js&p-DMe?Xxv8?Yd+Gs?xsv?;e-`L0`-wgu%QL|!HB*Nb{~e0IJaiG#*d zohDzCFY|Xq%|j#)Ps+T`GljX$GH@bkD9jE_m))}`0cLnijAICkdn1RYl(8k=qmXD*3l?h%rF|O>oy1$?LG^m} z@{q2j_U+RlTZky&U-1JK6SwNfBL8l)DJ=$!D#I8Ny;y+&^tW~X`zqg!Fq~T4%V9OV z8DTKBycu(^)pdQSiLwIsDg31k5 zFfNI3CSxmpFSTP8@Y{~5G;ADy_VL%V3Zz-ab6Z}7iin}8UYQLg(+-ZcGrp*{yyXu% z?A2e42rBv+r@mA{qIA2^?u!r6lYjPeaEM2%`WY7gj!svTDbRc~4zXs%DzN%_#~zNM zDk4tBd#wTb|IItUei1~rDByosHfw)oZd|fwno6RRxpy>2(5^v!@Sp(hbHT2`oSJ9O<(r4jaS<+}>(0 z2HGcCxs!ZSe7VHrK_iva0-7rqXD{WN#*s|cWODkfTDPQ_?WTaTTw&EW9Wk2hyuXuG z_o>wGO~iivI@OjWmP2!E`uzu?`9eT5h?5?Q)VjU`yGL_-JuzvD%0xufLlU5y_qf7j zdUpGD?iCcrtgAlE$cB$Tpgq%=?6o{D{r1=}t7qNYv+OBG53KX0{trP1>N?%^qStLAC!`4Z zf-R&)2?Ae2zC6t5tfy%;sbpx_3A9XPKF{XF*ikR(-~JKWX|vef88280@^I#~NaAA* z8FzX%J;fJm(y9Npy3afad=tr(9}rF3`hvbNXN{RO<)%=O>u|5Do(TFW~>g1OB^riHl$iX*RFagqzyCjZ0RL21E}{o{C*^D6yYDQmu_FRi+R zQ9bTx8p$f$ro`Ou+=&H^Q#s@alblHJQ$^Y)KWlu8zfk3KpTp)dSX8%Jzqgqaf@h10 z$w|zUx_eJ*Xw~V~IFiDuLf(?TZY$egQ$qcb?6;rL(hDO7cXu?(PDJaL8K!V{<5zm| zZ5ztgx7ctEQ=|D4CWPBvED)3ZDp}U+6o~s6bO*sP$W7@s6!Pj98%Hf%jfyZz0?Xe* zl_A@2uSKD0`r>a3a_4xDnF_t4Q5en$2BryVp)DmphurGn~G z*IFVK&7J-oQ}+}}Xm|1}0j<@%Px2D{?^F4oOtbE!8x@XJb^Z_r=ACbd80ma&0dxJi z0x9yQc(AJC082qe!>(>wGfeL}XFo5ea2za{Khi7yNq}UaLomKWqxbH52l>Z8PD_8W zxIQ<7@RB?b5pA0CHKSKV<3f{HJY9*~W76Q6FF`@&PTFNb}p)~wmJ=UaE4ZEB`GuXh1uvaZ)3 ze^S^v65uDa@6*t1BO@|5^#=Lyx6ew@nL1!0oSsP(Ga>Em52yN&=w|hZe*^DN``ax9 zHa9{6B@6N0?Tb=4dM&;0->JgzC3m};qh8k>UOmg7R%8!oD%S-ma85Is!~HC{m&P9n zE{#-Zo)Xsq`HwbZ2xf4Hdze;0@tJ_4JSI?ihbZN9t;!F%#yWCgpQ=;L_9gj5n*f)F z!C&uiN$dCag>}<$0^=2WU}FQfDPf^bBU>iR(iVF=Cjftoy=KrAuiSN+%EcX6Jm-Mm z@#dt=mRRG$E4&%yZ74eV0+pwWG;D9LzNIWuqrsKXFyKFn#xKS&a?)+iiNFMtAZQ}U ztfkmvd_=!Tde|N<0`)I7n|PD43RaWyGVoub+H$&!w%%`PhIS)}y9hQ>WFxI;8mJ)v z{|$a{|4vEu8K+muPOuR-|XdtmoK2Q&3(L`53t;O!V7&}d6<2}v)JkT2;*h% ze8z{z5iU!N_Yl7OOVVi0xp%$o`HTW4w`t zjeRRe=HP5gJQ)dmKLUqP#GC#tWwcM$`>GppXVOtFq&%ff48#R!AAd9)9Jez+(ewW> zw#7(mi;x+LDo!gwHd&>X+OO={o;QC8NQXs3bxDq!jghQVP}g%%K)0LSNekw83Rr@l zr5Pp_CRMtDF)Z%Yg#1aklUGd3gpvER#yhg#tXbFX*OY{|*Y~t3WQax|g)C^CT=)LF zgKli23&}ZhHWFEbf$Mz)IX|4mh;sghK1%H>(;pkYo8ZAESxYyTmzckOE;YR~g6)NY z{@^LcOs~3rPq0`N>PjS$>4i6sW5A94_p*R>_Ed}m1f>u&K`_}{NZ$2=84F&jHcPgCAoDY}CIw^N(@7h@g=p|E#EZ(mOKI5xjRKi%*E0yVy zWl>-B(tXbT=$QDDA~?oVWyCuQt?r7gHqCEKbDmGawW!_v-dh9}eZ7qK2*IHjg9gi| zx(KdlBYe_IU&JLwX63D@P~OFBmuX1g?AuyD(L{wDUKvwD-MZf7_xSpkMw@j_+y{$$-@3I}61E&yst||(eNC}UL)Z_0=mfS9+_N=jk z=z~bbvTQ23E19n^7N3dV4A21mC6R8&;>x!6XJKp?a;QiP1BHg6K+^`2)ctehiba;seJx8$vD;CH<9GTkQ3sk$VlJo;nM(T2D-$YYb^N0<58J{)Y z@&wawrhT`wft0KAbx^n4*FB=$*9z?DiJANUXa8a2swDmA&~8}7`N%=ZTW9~HU7gA& zeKEmi!7c_ubG^`Ody2QKiv@6$Rt6NAznh(RB9?V_+JngOU7CtyC2rBYnB-&MlJJ{x zZzmE-HLtiEj_I#u5HY9v-CG50%kRfGv4C)4SfWTMoi~y)9s`FsmLOgUdiV9KPa#l`mb5u(i_3dIBPlO>6&2-haGr!x5r4=?Z%)TeJ&FP?=J(XTF#&R6j?40={-t=zh*-dGCu9oU1Cnf zRo^ew3$yfGbMf9vIS7Tx#b#};V~g+Vw&--Q5Oej-2iU3=kGrQ>ua)MvJW{4c1QQ%^Ef z5?Sal`20D&kP>NAANaqtRMGH16~(m4k)c!BXKM_9oOetN2L8jFHHOz$K>zebxsRu8 zW16Wsi{UE~o=2Ud81W*E&31O;sIES1gk$uSJE#({mLkFTf0s9olRjjb8UyejvxmU{ zbMYRk!GKj$fLjL{^dxd`?oR?*v^%6`Y#ibQo$Ie^or7Ux}`iQ zrWwLR__u#;X-g3spqn?nd1<@>D}3osiZJIO4ER^MkBYLlMmX#GBH4(!8rTB$meYHi z7ojxlTDsqL>Cffq9NLYexg#oq_;ug|&|c}WV@$Ia8L zm5a`=wBdPif79<%yg^^;^3sgQoxFwQE26J-)@=%ySC|)kZpGv0AQMhL8x{6=Sf5k& zWwlcZaIXz3tzZlM_bdD!Ic|?<5ziTdWU^hgZG5# zRA+E5(m9tq%#={73A3yoL?H_!pVCF^+@osTD}UY3>GOjygZ}2DAgO}VA9<%ty~N;G z4?us_2h=|>0Dr5miq(V!_=oJhTgnpV)UO>L1oUoW-9@7p(Ol{}cfJgDqD=%vbRK;DP?*Pn79u@PJ}K9q2zA(C9Xo zg<*m_f&Ruzpg*4bzwh6!z{x%80P}C4Ke1dZRIYusZR*m^TXs$pyL1Kc&n7$73shyMaYRf4{B<7aGmksKBmOxxqk((5C%)ax7`r+Y$yI z`?hOq(5m&9cRCgmb4d+be$05>n7c`dymNx-_IpY2|Fd^0c%GnPm0HL3(bX&Dp9K%F zf3B5!#hk41*Q~$z)a7n}5OYuMK{G&Gi&}TcH2q^te6hR4a3!2LAsqK>s=iRw!Z){Qop9 z*83h`pxrc}{xt>fZ$Hq#R(B&Of&uUED0u%Z!T%3&=bU6@MfEteAL**sE0_AUYC5+o z$}z|yJzJ(&zj9~fr3;gL<)#?mqWt-w3Ac~`NN^f6FAB*$QygjCx5_zz4d&j>y!Ww~ z-Q+kkTK#g6;WY%Wmb8(eX%>UUo-wNyy-KIzcS1R;xWn zG1SOu>kK!%MItO94PO*CXurXe&YLa4I+B=5GMQAneR4$UnQlaqg`=E8mD zUYP$O%%aU5uGjlkSP$Lb=k^j6drEDoz?t9#(9@z{Xolj+s3#k`mhrwi%em|3vL|HT zG#e`yEXOS*s9R`zc95DYV&->1Un5m57jieegWqZkz?FLApLrtctVkK<={k}& zYCrRSuay~jBoM1q6#2fkVDbE*{eGFid}?~U$ih)xtB-2FOe#9v$qmCY0hM)(H;~m$ zT7oy&>0TnIz|V@g=%i!kOds~+vP-J9 zpwZqU!7mB8G#Bh(f1hlN&vYbmu4TxOS?itQh80v+yQbjW)ogZ;yR$jchdT?5qE783 zYIP4z@Z&wqc09YwEZnQ?bYR*|3cFGN?(W6fS}xH^JclG3i4t?)S2S)uiBO5|AvWt0 z#Yw!Mz8>y7hlwT@py~}!t}$(l?n!D^Qg9CYif^JG?6UJl;FoVC@7kxJ$ij-;^P`RV zlFDQqhkFv?l~U0SH2uWEd|U=L281<|1X1Qi+T{Fz+@|GLA{8B4!W{=a)W8+x5csvnsnO| z_!N1$;EY|`cYoGsNO`}QVYRxqvIUN5=QL-kIVjVhe#c=NHuPZ9#HFU8VW9t(F(}o# zM{Q^+mtU=5hAOGi(cAYkHUSQ@ox_*LjivOD|IL`9Q1%{ubuhRu|J*9)(@6GO2;hTqvl&985e2l}7)jyNLn)H{gGOoarZDuVmaF+U^&a_4UP=?+jUh z(fgOvsodY_HBYsdMbL}h(Cy?Ldc%u)ml1cahQJuqXH-!8uA=@qM2`R%*mNNZrOFby zX?08bGIrjKXt(`Ok9@YF;pcK4Rzb8^8+rYWudKeYFHyx*K;Vq7fA2}^e{pfMqrtYr z!DxKta`e6N1$`DZdRP6Kk>Q8M{nCpj^&|!AG$_nQE<=}oQx5_1!K$@CXJZ@?x>ZSfhQGoR5 zd)!imHrWsA+Gxxgnh>SiCT^6{AV(9g5XLK3nv5F1!MqvIyFKhn(?yv#SY6k|Z>%fq z;FuyZnch>RZE#A5co4_EB8PkV_F5oj3E$_ui$uA-%Rn}zKAPO77{%4cR9$F6exGV( zY);Y$Ds$6~jQWNeIIZqF#Hbs;3An&xH#^pi`O6iIvUNxj;kl_a3!~M||8dvbE60tU z0Rs(Y@91x@o5aLeyyxN%TfqzX(wIFGSf3YIm|n5`R7_Vv`=cIJc@c4Q!^!Xs}4!--pSlx$ThewP~m#;QulcT=zL$RkJF@v zsZhb+L0LHDjvy>hZiOez&sDQ}Ptk0j=5UA3wckIwrCm!tgyEUIO>k@Wm6yDT4Uw=_ zB{2<0Ah9e*<|uM2coun#q)mEGTOOE%YBrGpV>b+t)qTqG$^Fr|<+cVMCyf54; zo3clSl8DhesX8hFY8KWx?>!MLlBw-iQnneJwpX9)sa%sVy;$v{W<8$c6fKRHG7q>$zI?9jS*Ua@XK5%?RDixH=%ZzfXQgaP4$F=MM zHiYYhj)G_3>to6$;t!Xd)qr6?fWLwvYw~r1nPQgXlqZ#WIA5 zPB~{|(0`7<8Nj3ajmcy0Se$Fu^!(3%vJE-aMt|ABwf6N(T@0q6OCz+RB_~Fyd`syk z<;3hn(*6RHWRtjOhj3i4d!A?-LT0bDaf$w(I=yR&`4e-~Rp&WHp*6q7aZXK|+}F!6 zBHdpp#n1}VK z%m0*xXyux&7V;KQ)R56_5`BRQ{wSe|01M_H(5Lek{Q&(}8N#N?)OHHpED9OY0}b&up5?0{QZRGsG#b6W^0^#FBteaPw7~9+Ui@2A(PLs@ z!BJdINMouw77)jB^F)GHosh3{*5ela%5-;5)V(4N=s!_+Qo6mKSSO^Qd|@JmAM`{p ziIwO}$$y{4J_Pu;(gJO;feLx}gnzHLgtV9jcCFtw$-T%+4-o%bV$2UAk);z+4R&`~ zVe@&xBP!?j(|-yF;4fBVpS=(*Dh^F=YBCeyc7Xm>pncisMs72!RY2)?QTJVvv$b^O zzpD-fHe}!JI0S}BuZb1!DtJ*VL>YMUP~z(lBo~d!oY~ct=Sn*@nLZ_^;g^4~LS8h8M{g~kPI!sc**l_iA)j=Z zFM-Z{c>im+H*yXo<5V%i>>AVhH{Y;3bgfTWQb}f?hZ^V)8@hq|yPF|~G&l0jk>u@{ zi(I&>#=MPrYRU3fA}Fqz*3wMZN|arZZaI(M$=BzjKT@l)?`-s|k)~bpy~Kr}aS%Ey zdD=jZP9L}WLJqlh_VUPgs)VBu#99r4F$PLJ+ah{&=Z~0Q#_MA&Zl4AwO4t+os5KKr_pjxCJoXX)|>ZA z_Rb_@Vt+Qe0RCr9J%h!$uN~S)EN-xS6^)jEERv0rsu9WE1siqu@hIU=x+f~9;ls)N z8R6v1yT`sJC`*j-MG@H;VJ$wIxou)ma!`r0myumCDp*%KzW9OSKc5TDy(O92z#&?+MI{lC4X@PGO}bapzr? z|8b64+?lV4a+XtJuf?VOG32mL42?Nb?XGn;NJfAfM;t=T}k{nM^HC3AKY=MbhhL!@Hr z41zoLWlM#pJtn4!j(A&bt@x_?AkBY!K@!xiRYj=qf_(;4%|1|NHIuU;o=X^lT(;(0@FG`CljKKd8y{N8+2UO;~~c z-aq`MdpJq5>IT|eup{9AqGRfC1O3x~{I@`2S;!Yt(|h$DMMGB5|Iojn+qC3@2@ZV$ z^bcR9*oU~I--n-VkLm&c?KWcZCPL8vJW~lpXo3Fc1>5`md~p6b@So}f^M7$Le-sDj z4}$q;KG^>!C`Gn8{yj2@ZBU)S-L1?nlf8g*G51c7uz(QJ{IV91P@h3EWiW+ErwGyt zzi5t0tT*prgiwwI!k{kYC6=Gv4V=rtQ6rkFy48Qu#W&<{pJ^1M&dpt2ZWSRRLGH^z zRZ;6lr+; z5Gg&$0#iDMw_I&8-Ghs>+6*S{wW8UqqU04BGDy$ooP(5Hvq{uQ-J@Cy*ptoitTeRY zwcOjpJ&kLH@zG*g(qEG{?rVig5wCpUhzYGHTH6?}2iIM2YDQ6No5$0jOr*mTzkT~67jRLvFWoKr_gI5g|AM`7d@9H59E;TsDq}lUXdvp z-w8gR^9;Y_6o{LE?f&Mo;N+Hs2bH8{nNqt4{%02a!ky+*Hr^aE!=qADmSBzXhEQQK zA2;z~Vc+_&Pb12N!cQ(w)`IqDbb21(UmM@F7PNU<5yH5No2rVy$#EC|@QpIH?DHBY z(=()?s!qsNIIAa80+ELI% zF8kq0rzoggm{BEUF&6rLit||u;ICLCSE;1k1K)2@<3TYucA0z%tTJQ+CQyL0VwG1_ zjXe`m_n6wkFKkE~RNfF;Wp^+dOX?Kg_TAE&36J^j)h@XfG1;aiZL{^jAyxUeyQ2W{ zE`twO8l=X=*?GJ`{|qvV{pbz+AKJV<2*<|qchz{^=a9Lyu$#=J?uFa&%cvPBccJ$> zgFU{Tky3zvWqF^BpAa%#^`{>F!QNtZ`mzG|->> zdgtVPwGn zj&wp_odNG}ADBN~0sm1OaQ|Kc{`VS~f71g0n@eYC&M=ri9RUAp=70Ae?B8&wL#YXX z|C}c9f3NO&Dpm*h&o;1sGY0yjMc{l1aQ*-|KLwmWO{Q@KRnSMfd{ok2O)%=?htQ2+ zAb)z(nW4!6`AtsUN`OAwK5iGD*yM*GkIY0Y^k>eL-- zn}bFY#++Q=LOznr`K+QGuKyw)b+6sy=TpJWJgc^gy<M@Y||m5dBydMfBbJjeU41`3dUc=Sh_E4 z5p32|WGK6(Yjc7Al2RmQ{`Ob#?BlP>Yx}jrog`T1$!}B=an2$2ZN}xUxNReQJ!uWc z>UYaBL}wRc%4mU*DO=XvJR8dK$@E=SUhi3LaQ^iRZ;Ke?p&$Ac3p@#>0IR>G%+T0; z$|_#){HQ7XJtNW)tH`QUG!GuBAXjrCcdd-Ng8+T0cC47=mfSzTJz5{!e=6z84? zE)+h)1SYKAa5D6B*$4P+%#&JJOB~fId_uG8r4TuRTe$y@MmMU6jGmU8sK)W@&^fa< z{$*{E`OaQ%loXaIBAJRWA@V*d>qFlU5Pt_iUCIIMpYTBb9|G|w3i5wz6gmIdP?Y!) z*guJZ_|yJh{N;l9^Zy_J`jUgu`w+xm6Yzg)1^!!6;QgTi`!_tWf13gE9|Pk5H;Dgc zp#OFR`u~6N9}D8Y1=OE!K>T0Sp4E^(^H%s1mQI1Cpnm^{kCTM^*)KxKU0_+3`2hd5 zVz#~3M-_6K`S~H%W-JW+{_e9GeEP$7b2{Gw6NPT0SHul$0y@^HS&ah4B`I0X65KN+ zU#y|b>W`9klLakvDpe#_o^khQsX&!OpnMuna-;Mz<8h%Q_lgWyo!3OKZ8+%PBcd8u zWQXEH696`3rHw1|>Zma5bMkJM`WDbXU|@4%EI7`fv%2PcU2wFQ;KtW(`Kk$HRaxoZ z`TAQcR4pEKkXCY968obOMzddviM*Vr-1FynkkFCv%jwW!MhtD((1l4=>oQ*iI z^SJQaBs#=UOK5TjYK4H526d%2y;E$We#7u^wEN+ndaTh-Va3PaD{Q9MkArhQ4eB8N z@4mps%s+)UX-s^%*kiB3SvP$7WCZdre$*P3kE;yq4z*o##qU~$_h=$zuXx9~*Uo8b z=(z|Ih(Z3)GD0lFmOzLao)S2 z-nQ_ZjY$%=nk-|XzqeHUxJNT{a_h`GR@6^5_Y_jAI>EY4n;tED3D;{OaEYqM=tqrs z`X0eHoLrGZzO$*eN6TSXwrcu)@*qNla&B;|2w!uCCfmWG+ovQa;i(Ms!=2vPMCABr z#Vni14e#gQsH42fvl!S|s-;QW(1c-6SER400p%pV`gzdmhpb=eC4Mw>+P7VC1$36j zSK47ksnz!GI8T*Z=&OHKOwI-L;7E|G6Y}KG4#@pCWZPPxW_xRD&JW+sX7z_juSqWkZmvm{FhKL ze@-=Ctl)g0$xQ+Ae+u;fTS5Hq0sQ$r@PA?l@!z&4ZC!#-@b_|4NNad#d+x0`C*Q5S zlbsvx44c`aR+esKfyvf43hFfQXg#{>G&=fW(?2>zy(`l3x1*HdRYQa` zBlnciVf5K5)I2{4C3jKN;l(77ZIbnRER}o=&4WsOLa6r*>6}P&{44zQ+b1Jevcg&E z*i5{eEBPvp)EK3i9&!zT@`S0pp{y6tlTSJAGsX-Pj$c!F% z+VS_hv|#`1&9l75E?bdf&EdbEQ`XBhNz-FccKLCD!W-`BI7NPp8g(_!j!?L+TwzoN zkzC2-6_$(>hfonQB7W;vh~iKG6UhRnUULvzq^a9q~!o<)FWj*<T+z_(h%4#oBB{=#VzJjI9AkEuAzDJ#QCf8JrY zjPjVs1)1c#*3QAOR5kf2)E-bEX+d`5E(urecir?5|DJK}^T@l4a6>|vq$8r~)V zZ-c*Rwi0$tGG&A+9UnW?g;47=w}5m{E4y82a#>X184jd9+DW-y_KyR%fs5Ga_$kM4 za|#Tg|H5nWcV@o6Kb7EB8nu+Hipht`sJ%y|&FS&BzuqV`2v(MW;$WdMu z*3S5QY>M)6cFJBOdYkJRrIlcM;cg`OPpobDYkVE4O}DPdkSdoEo=*Q!N?649Q8NRk zrW(Ojc33^*ON$~$eY4v|OmCD5R(i+#ADzJej}_n_c44=a{r#z3UsmA#=>YYQJ9vLa!Trks^-nl>f2zUz6Aj)U zeDMBIj?--xj>DMTplKppg8TO;68(M-^gmnIq6age|FKa)S=3>fWleCn=6fq91N;}K z#fBoTT?=f9?L}A&453n+$3aXl6tRK+cnVs(O@qhORd|EiVn*N_LHoV1st_eE!+KZJ%N z9+w);G>mV>xmuSp;QE^0zeL+3wOvVG_OK?IeF`gWsNSZex#HveZWtzIDfUv08Q3`I zR>0fy7O7MjHSc{eeKv`y*Jtbe?d?*C5{Diq#{E=kp>iw_QRpJ4jH$A_Y!%8QCe$Ec zPEIIIa=w@pQq${QMY^{y{{4$7`f5mvWLTg)y}`DjP$Rs7QSHh2Lz=+8!DEv2vh>f0 zXT#b|Su!`?pO#gyLvT?RVeyr>Sj31q#ph!45eCGcIH-U0k+(-@TxAYs1;m>e6tJ2;0Q_q>cz;5u zG_!L>JDmd#MbTkYkA=AvG&EZCc8)vQ^EiP192#{(Et{B}!bDh^wB>3oms&OX#p8{- ze>?1Z?3X-9%`t(52h8WMU?6t^oBe&|Hs~Ckx$eXe`cXv~cC08ce?1x$ru#sEzF0RV zAGXXc(>qSJ_u$2V)tye1KE`gmWx?HTv#Rht{M%5h$KjozkTdDqF>dHZxAt&#D2FfW zomG25tG5lI*<{A9+H1;{uQ_>~QzVjOfpMI-4gcvs70(RF>^WrHnrh898`M*T3K0= z0}(DHO2@_DsWtRer7f6$jxG9LJ|pTQ6U2RD+xZ+dl5u3}VBwyU&Eb2k>C+b&$A7C! z&RU&ZBze~BV5KA1R@b6b;4q~O^uJgFNO5$_4f9}hfJc+^iFk^5aTi9PZ|PlYZ;&>> z1Y*82B97qSbKpNhLb_?e(?nPa#f7Hyc}7lR>=!fqEY$h@V*|^W^#vEDg1?k~=9 zz|hbTl+4B9(*+viqu-vUSBAGeY96njIwnM)%65j?C`ewaQ8byg=@k*z7575XyLU1b zn&A8x@e5n2>!~J5(Thxlmm27=?LAP(1%&*}@O_C}yfP9R zmlR;~RiQy9<&I8q$3>+F@Si!~VZ^;(ekY#<`oF#3P4=-SaN)JD_lSFJ8w_eg#j~tp zd48<5zP%8p|KX1V<{!E3%=*JQc^?yPLH!s04H6H*6s+41Jv)G%pNzkWUYGkg1xPx@^_?i$2$MS+t~5-Un6%;~Svt9V(!~mDxkku{wvP z6u!B%lSYt}#?%Q?2xpgLqFVv{-E$aLa`&oGp$>?D4KV+j1^NFU{w)UV-`7F?r3Ui< zKmYZ9(0{Cf{2vMM7yss8{haP>fe|!f0$18CE&H(;(e8q1clZpy!w8*C%`YEk} z#9u#`WSuzr?4)vs(b|ACLpI0Lf?y)@D#V`5Kb=69!h3~PMkC)zWsGHJS>OOGOK&}wFRva zotM3Hlto{x4Z==y|LDF-y{_7rAs$cXs6Aa(p)@Vv zn{l`JTlTNBVVzQlFcDP%5oT)Xs^vnRk()AXhC&po4Tt=(JMyd=_XJI#a=QJyRu^Lk z@A@@c>$Or#C{63kFKuPN+GwouU=xw*r>!X?0^@RZ9dS{)e>_PDV@8q~kXZD^ z+mWn!&#>@!B&J+?fJa8d3CvB>%g-ggO17B0cfPdK$vW6A`5DaR()t{bDq z9T-6WUoY00z%j9;+os4yaFzI(-d|nNr5F-SoVc_JFY)k}DRT9|5Mekc%083pl_k8( z(iGPYD^`w*z3L0bNQXBk#WLq#>XkfZmzoVwt{iw6)t1v&D(Y%H_LR_Jjd^qD>1+if zS(YU*SQg$)67>eZ;BR@CQ1A9>IP_FgfPlF1*Zhg8^V1e{1M}b;*RrX<37ok@uTisEB6;<1X9p zCgfm^{;Ku{dke&!DlkfRzfN8PQsHFnawy!Fra`A(t?UY2-+knIvJpPv=;zf#D5x(K z!l@v8`UtXU@kUkvTvVIcc27z1O6n{2H`ZVlKZYD9+DV#C2=;|3&nJUPG2~k5zBFe} zeH%}WbwVRlT2?7ZwBvejO~zk`$+CY~k!)t+`)YfGqy^~fwQYU|P$WO7Zbk4|f6(N6 zRxB)NYo(X}>9W&Al=*_lOO~q}>9zhIQav2YD+4k&p+hlyox#Y04&4tP*{$)p<(h9? zS)K}t?N`21pYx2$oKDIaS_ps1^3__kftNb2*M5i*38oJ82H#IuXpp*{kMHt}2Ys$- z>==B1sX)D*0;{zpRtGr|Hwh{7SvHQd8RCgoE5~DzDoI^vT5CDJ`r*u1qR_1=BGG9& zeN4`@wphD$jhwGA>UZiicuD2?yC~jq9@O+Wtix0?apcm_k!+)Za<~2fYdOuGpnwzk znV0;YNhR_!7^%%YM>~haR9|{lVVYA&U?opXX`Md-{U@id%*n$KK!4Vlu$2>%HU;!I zGtL%ZqFU8A7~)afVP|po|KmSQ5AxrZQ~-)>+t7g4%40JP15(!;2%&WQB9=6j7_)PN^EfHn zR9EC!rk=DQd`?2;=LmZbMD)jZM0qCpi=;6sej)O!I0}r?^toBiy;vR^$oaZFd)4`P zsPLYz^RO3xbCEHnc4A!%>K>B_dng~4Du}fmy~2>%Tjh-my4se4vIXSf~xiAXpj7vywE_0BU#b1BE&15Lq88U(%Q zDE|O8*m^MiQgTU|iQ?w}M`wGYXKa930oyR5AL8oAoz8kVEWDhS6?1asorlp6Q`J?3D0v(3 zll4#R&_(T7MNFTxjNn~8@GuEXoWAI39^$*)mV~l-@EXbrbj?$^b8_h?TqLTGnhGuw zjQcO);gxk8-xIBbe7RbBvPMlxe0d{=jbO?3nvd@Msjk7EDWYsiJ^rOdxWVE}Ihi}N z+}?NjDxMn1OS*6W?A?*4_Itn1(^{k!)N$SB_W2Baol&BU*=AivlrpeKSAbD_9H^Q2pRQa0| z;qKOZ-45EkN)bB>efE6aIrF@Fa-y@vP&iG#Cq^7>a-#%suE=oW9J0Z1q9teOBU^8W zed{xWu-5$7lV};AeAUCC56P}_Rm;ZP4bihi}UZRn_X=AJ?i9ue{}=+SCoK%HSYJb1EbQqS-giGmwQcJnNfaa~AW6wh6C{e{C`lw|fhOlhpovNlB#E{np$P&aAOfOD zP7M+zDJlpwNy#=epok>30q%3n0mFGD0ku|;<{c(~= zd2s&>BcF+^1pB8(;7eftl{O(^UA@lCo-Vx;#9tKPp8)t70Du39pL`5Ut^m7UV zC+h~tKiK{i;gqo!JBRN5`0^@WrIU{SxHsl0BJ>lCP3GzvmWB;`Xc^NgZb2SpOg9T_ z{>8TehzC?@=)kAWGt|kKBDYFdC<+6|kTWWFC7%sz`qF97R$~Fa0OQ4U8A^*-n@m*$ z_MtI6*OqH*cY>Ni$$qW?S*;DK9N2Flb(54F+<$8Y_8WowZ!rZ72uXD@T)98m8|)t& z_qpbH)&*DbnihG_0bytxpU3GpsZ(@J?qL9~_WBd=r{UvAXzTEn6a<B0RYX>kAU1-O5-0Q~*Danm#7ojZ8LsbY*lf~ zu9qpOVe#_GU8&nQ%0iC)ctN)}HGD;T9y_a3=WKp9XRq^IBB#KnzI3SHk0*iUrTxzw zg`XTtlBLtq2&~DXrugz9_mtAAiEQqx7OgPc*9UPih9|vGkc?GGZ}a#(cd8RqP_pCg zOO3Tu>e02<(Lk5FgpCEvn0vl4@5z!}I=7DKCcW`;LxX8aHUm}Ue~R#u`P<}M4Xe+2 zi&`a4ru+#@Z@6M9Ve39HKd;TopuGIvCLh@%#=F9NYL*d?OG(+jbv&Ztn$v;Z?5ff9 z8k@^ZPEu#HIYZsscz#VO9l-xrApgd6acJ>X{u!`; z_pkg%R)GA2&OhKE0u+D9{}BKDGylQ+bMjb_e_;Rc-{+qP)qcT-cB$)=5~Vo zQ?SkJ zPnJD7_S>T$mCf!|59Rk8aRibx;L1f_8(yf2_+@+gyd}?WV#ZaTF`)(Gcj ze&(-*&-B82+kSTJiK)|slk^POeYmJhq`a*Rw}kVKmTew&YQ3uN0pCoFv@f(DlDb%~ zG!>(r&9inspYGaJ$_bqp*E1O3i|G?9Sn%zG7qm-=iAr@yW16&|UE!~6-12D^yd7uq zyrR19uF+CHXVaMu)Hmv(6(qTMVyZ!Z|LG^}E7=I9j+=C73w7=D9Ozm8~9 zH-lS})_vFxqi4?_E+H+?6&P$RGYn5ynqzKGOK2bcfmoFrjp;3D&(VxC6RhC1h z6|T9~vQGKq98*wHZ{4*v8`!jXm>A303$uagAI}Ul?!aeQ!_QsxeE*$Zt04ZjqUwDT zx6#Qe=To-;|Kx~4@6Tk6(e8?b)u0|rf&G8r{p*ALCxi0e&Eb>pyp?)?Uyw1frj$AY#E7tiC!)ol9fhBs!yp0CxST{SrjO{)$DE=r#OIT6n)%(A<)5IypY0|}L#ci** z=diM*-s;tMY__%>$igCAU;Ro<-8JHnRQCawOSeP=s+5S4o*t)pM$+zS^UP2lBNNBG z394&UUmofLj!YnG!sG3n6EIz#o+Oo}*fD^&vaKUVkz z9PnS1gCU`1L#xI4zvVxY4t0+M{_`q@^iOXqDNm=y0spyx`rGN9XB)F&jC&@w0{1Ap z-efqKH&$j)fL0Uj^>Vc`#0-)+Os?^Ygtuu8BuH#3&FFdlsP8cyroi*x3T;Jk5G&1;c;$@!~v9v66?{42&j`M=w>w2meIE9Z-jUB@fiH^8p_=2K) znSWC&LC1YUGzG22+kR19=L+Uh=91|mQX_o8q&u5?Lulr?VCIgDvl(Q6SRRUu_>^?H z{n85+P=9QnLio2NYG_iYk^z43HiTb?_)#S};{)M4KFwx@^tY4xVf``o0R9K|ho6G% z7hez$1Nuuvup~nrAC1=L?KCqsw8BWt%-F0s_lJKp_;4SrDVfph6X%Qs_ynQ*?sZpB z5W#E4YR5!Fp!!!94)9OQi7=vZM2wm! zJ?5bPZ^+NoaQi)qWPeVv&7Xm+M4dXoA1^9~@QWgisM3E+ygKl|u;2ARoc`qB9Eg9(LKrm^{}n0sf`}%=zNOJa{%<$7zG4RSkH=63 zJEVWQv&A;R{-t)>Yn4O|NdNzv{`pl&x-GzIh}-E?Ktui4U;3l_vv_D|X08CEo~}a+ znijHOeJ;Wp#J~0+{$#fFwo;wRxI8hC|D{1qDo>XVow6}b)G(E#}WPyEH_oS^gf z$9|~)bmEVOCpTGtT9CU5#h+uN(-?}snBNOmkpEoe69@J0(Eq5sJezWW58{u3;!ndG zrShA1n1aBcfUE%VhwyKv_Yi8oniPeolBCxkYkmdcHzhp?hR&ast9YpV*c251Sp#G) zOBM5x4kx9FgZy{t2K#sZ*k3HTsO_v zX4Y|qn?;hjU40Jl-|e2~20?&-VmJm?si|2({5N?$3a&!@CuV(E|Mk@&{`2s7{0N-? zG3#!O3edl{?NsjNMBBgPU%%=$XmCq(*XNVrut6D%D{%f{y$rMw%6U(J5QA4 zH(B}x3{6Q-;bmT@$RH3p0fwdQ=YNF)#DlL=s+9(rQ?QW+a^#rpmu1EKl z>cgxvd8ECgK@#wDnCfIKEvIIPL*d>suUbC0Ah18VKXlT*+A@4hee}+eNu4(GhO72_ z(ejQ^{yY3WO*Ag}+1GBWxr}}#md+1;uSzXN?D&HGUug`*)BBdSc9)?P(C0Renn+$S z-q`XBhw_hfI}~o{n1yiZ+>NU$S5lNf-Kc+Knr2T1_;)mw%JTTlYP7acyQ#M;f6dP$ zCy3{wd03$SBa@kAX7dLuvK4PZIY#~K@^=pBtdZ+6*jmtk%uTq~$=rpf@3bq$S-Je< z{DJ2iC^XM%8{WO!Vb$p^_Pr4lw;mR5mzp~Ev7b&*s#-}V!GI{ zeW3r&aFAnA6q1v^c!S6XyoJyF?_G}dzVFNYG2V$4=B`Tk*eTqd^DXCQ_1}<0u10gY#asT1f4Cn> zFNK~MuXop{OMjB5JL`G+U-lPXZB(F2HG{F++xX4zc|=4l+$8<0|BCn9kFCTTpY^9> z7|kTfP_z8Sf#XD8lGECrLf;}aGI~floL=egFljX;#_)r*9#8*5BN6^nCo;0G_bA~C zm1l($4RKGm2!BtGDIu#16$kZy(??3;J1+(6DLA;{=jD@9@OV3~5wB&F2uT@K&`=>; zZlnSU_jhZ-_VgtLW?MIlz0 zfri3VAfC~);`rMqJ%ZSREP;G`oBn3Z6!~|i9MXk(>)FJ~U}qPq_IQ&HqxT|YJtgH! zXp!gVB3z>cdlPuhUqwIOYp*G=$P=!<-8vr2VUQeuNp4u`tj&Bw5m|!x%nR&tw~mKF zG97Wxytc2Mowf|Se*8DrX}a`=`=PPo;QTRz`OlijHmLu8bXiEE2AipuTJmC8*!P7> z9^*_ocph=|{PFJnn#b#M{sClmnNa?L`OAU*Xyp|2_Uks2S@8ZeKbU{@QR{_g&?KRc z;238j<|QK&$K5H$NFF0^n#mEPxQ6?_dHWI2Z$j%VTrV8p1OJ~05QR6+dTs37S`oVj z_5TJOHj?`oeFSv=UCKGHgZ}rd$gK(x|FZ~XEs*~=Y8@pXC^QAQ`Lgh2xA$xFq@Q5` z{Id^(9nK$UQ{SQ*J!|yF^~G17lUP0r%7Fcrzc~3>x32Fl>#3rwC&BUVCsjKd2p-MC zumXor9=i`|UKMM%333h_S8@fcB4`D2^7U-KXSW$4tDyPA4y(YQ{L|BODm8v5^u2Lm zQM-K<#-GdT>eoE2Tvkw`gIR=$O^TM2gcHK?O^7o68NC%r!~2O$S0Vo61Mfd6fd8Ki zTeJyq@c+}ddb)HZxc`BDH){|m$aOIPi^5AC%s;L$AD;hO%whh0LhnbMM?a6xSGr?9 z$?f48T_O}Ki?Y+PPErd>ZiIb^sv6)ard+!B4JMUj_`%5_RX1rYtpDUdIGDfutl;GT zL|1&EKNj@fM{foniR#Uf9%Yi}t!rq!vaH}7CtyfT_K1-x0 zX`)LFxYz^Df9`6s9O$ou`R5Mxdxn7QL1_MSLFPd;!TQB?`S0MJKD}Lc>-%t9nxnVc zyeg*aMs#=zNMNJOQZ}fk&tV=ZwR1sdI<*e^p9RXZ+hIU|1dyHRtq}fl-uEr(D*-`x z`Gn~4Q`1NP1zyh_32XQ2Nkg}u$6b5y(I%6xAU`x0}Z zJ2yMlV>M=;0oOtnbD3e7yhzoqsL_0!U$8z;xOqm zR}(R22KH}#6`t3dB6(D|XG!L%kP*`O>%?yqo70Dl0_`so>jlMW3UpbceKfV4Cuh~E zS-pBn!mFxreA^RMet zP$;7QJ~!DAw{l9VdwEQU_4MVtgRptCB%;1Qi{~h{ZzTV!-s_{SGYn?O2vQDZiySl? z64_5*zu?oHmH#$aKPEz%71Em>`#E??y~(EqKgCl~-Cf8b|J*E>o6U#=)jEBa?K`}U z^!W>G;pEO=h-Z1qw_;+GIOw(4N6WbapL;0pH>t3eV7T9nptaT8&LQ5M$5e97Ec>Q~ zhL61#T^7F&`rmQ7R+YzA6a*}0W$?vuVkOXj-*FlQ>`nE$h)1;PJ0r5OOctR2IlADB zEP(%u{N-aU%w^8x=6ER_%Re?cem zF#fZhhx5<;n8W#}V%XvQKg9cR{^>OEr~iKUXZ{(^a;X2$79Yl6{^f!Gwz*w}p=1R7 z_lsw*Kp@$wNz1O0{@|*(1{D~*m>=g9tBq*WwXy8YuFQ4p^qg;w z7{iW+Nv$GQ^%hAUwah<1PN+=>=YMmv^7A~HzqaDBv={3f?N4XzTu_QV1L3c_Evl_C6BK@5ZA<<(ome))SfDy4$O+`TEc zv=`b<5SM`dz2(5}`{i!<*a;j`e64Fy&-%#w*22Q$gs$|BI)+^cU!q&^0N=pD{e9Ms zi4yr4!C8HUK+u1BiZ^r@K=WUKZ)St4$4oIp{Lib|GPRL@;`adq5i5t9o9cz?nC|WWeed0 z{qcX!zgJVZ9pbM1M$WT&qM`YBn&@e8$y>ZmTHx|XA(($(vMXS_rs#&>Jh{1>2K47w zhfe`lNNiA_SB-763vZGJ$1xe~lwc9C;-tCFt@9jQ4$k!*CYd7AJ+vL+u5e4omiA={ z?KTt63yM7h%oLMy&lwNq@Ba6+&|DRPk;HUq&nEQ@WmF)V?E3R@_%p~t=eu2(4S9|hVjcr9O6jx z){m;2BH&@o9V6X~mZ;jHHQrNgCbZ{|eH$@xm{hDkc7X5HOi|5}LlXJ@j?6*-bJM^u z>r?PtUkaOO);lnNJAcaUbIcFLSRJnfB}0T8{u{;A_u39W`K6Gb>K;J} zhjwT{mGIWOM1Jo)?Gk5^fm~n~>5Ubd>$??99Y3C>UMD3WR@n1XG1kzoJ&f8O@_*8P zX`i1wA#7DEgjpI@k;=}nje8ziroc~*giJkqmv+!Tv>~E}o9UVq zPufJ0)5(ns2-Y)Wdk&f})VjkjmFaFYTwFaqLp9H3{koGon7}!As^aqX5sc7i^X#Hi z4rbUt_T+gwfe+1=u{vZJ0}l)R&JpX1tb#bkYojbfT0V;0#yK_m5mA*(S4k@rZ1+pD z{4~;&H+Kj!5uCgX(XVZjFH;QBXP-Q#%4<Bd=rm0Z^V_n_r zaJGHpw{BLPXHk1ZzsL{q8}7!5q14IuM(amo-|^bt%*R!Jr-@Voc-4Z3$} zhlbaEz;YBSP`3M=WxLp!XBc(2`jHW5AIp%_C6co$+k<*6Nw`8(#NKJ-=-n)8v!%CH zWzSD>NE=8H@4HnwTkf42)e>~QPMSU1b&_<(KO)4VCRtULX#dt*x=y4KeWZip3A`fE zel(EJQXsl_$BldoZK;VaD^NsP+9pannA|4TChFOHaRDdUh*5_;d-Ofa#|+ zyDiZF9KB|)r9NkTAF$e|RczeGE65WJKC$c2Q}Z|Ho)!4;c+FEU<(yV!U7x&0Uh?MG zJwBxX6^V_H;>C`9iB`Rmyl_3aw{5))ZvV31u+!W2hu8Kq`hJQw?{R6v@AJ;mh4Mu< z@w_yzW5mk)zBz>yVmtlgh3r+wcJ5v8uns6=QxJj|&%w4@4f-De!2gVZe_oHI25LzRnHXs3U?lz<{{Qp+|KH|+ z|1aM^|Jnckv;X?*`_upL@2~&C|JVHCKmPw$|No!-`=9y$;eW&VGjNzW(7zqK{{>Nn BIf(!O literal 0 HcmV?d00001 diff --git a/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/MCFW_V0.34.0.C_ModVer1.py b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/MCFW_V0.34.0.C_ModVer1.py new file mode 100644 index 0000000..59a4e38 --- /dev/null +++ b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/MCFW_V0.34.0.C_ModVer1.py @@ -0,0 +1,2060 @@ +# Quansheng UV-K5 driver (c) 2023 Jacek Lipkowski +# +# based on template.py Copyright 2012 Dan Smith +# +# +# This is a preliminary version of a driver for the UV-K5 +# It is based on my reverse engineering effort described here: +# https://github.com/sq5bpf/uvk5-reverse-engineering +# +# Warning: this driver is experimental, it may brick your radio, +# eat your lunch and mess up your configuration. +# +# +# 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 of the License, 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. If not, see . + + +import struct +import logging + +from chirp import chirp_common, directory, bitwise, memmap, errors, util +from chirp.settings import RadioSetting, RadioSettingGroup, \ + RadioSettingValueBoolean, RadioSettingValueList, \ + RadioSettingValueInteger, RadioSettingValueString, \ + RadioSettings + +LOG = logging.getLogger(__name__) + +# Show the obfuscated version of commands. Not needed normally, but +# might be useful for someone who is debugging a similar radio +DEBUG_SHOW_OBFUSCATED_COMMANDS = False + +# Show the memory being written/received. Not needed normally, because +# this is the same information as in the packet hexdumps, but +# might be useful for someone debugging some obscure memory issue +DEBUG_SHOW_MEMORY_ACTIONS = False + +# TODO: remove the driver version when it's in mainline chirp +DRIVER_VERSION = "Quansheng UV-K5 driver v20231101 (c) for MCFWF" + +MEM_FORMAT = """ +#seekto 0x0000; +struct { + ul32 freq; + ul32 offset; + u8 rxcode; + u8 txcode; + + u8 unknown1:2, + txcodeflag:2, + unknown2:2, + rxcodeflag:2; + + //u8 flags1; + u8 flags1_unknown7:1, + flags1_unknown6:1, + enable_usb:1, + enable_am:1, + flags1_unknown3:1, + is_in_scanlist:1, + shift:2; + + //u8 flags2; + u8 flags2_unknown7:1, + flags2_unknown6:1, + flags2_unknown5:1, + bclo:1, + txpower:2, + bandwidth:1, + freq_reverse:1; + + //u8 dtmf_flags; + u8 dtmf_flags_unknown7:1, + dtmf_flags_unknown6:1, + dtmf_flags_unknown5:1, + dtmf_flags_unknown4:1, + dtmf_flags_unknown3:1, + dtmf_pttid:2, + dtmf_decode:1; + + + u8 step; + u8 scrambler; +} channel[214]; + +#seekto 0xd60; +struct { +u8 is_scanlist1:1, +is_scanlist2:1, +unknown1:1, +unknown2:1, +is_free:1, +band:3; +} channel_attributes[200]; + +#seekto 0xe40; +ul16 fmfreq[20]; + +#seekto 0xe70; +u8 call_channel; +u8 squelch; +u8 max_talk_time; +u8 noaa_autoscan; +u8 key_lock; +u8 vox_switch; +u8 vox_level; +u8 mic_gain; +u8 unknown3; +u8 channel_display_mode; +u8 crossband; +u8 battery_save; +u8 dual_watch; +u8 backlight_auto_mode; +u8 tail_note_elimination; +u8 vfo_open; + +#seekto 0xe90; +u8 beep_control; +u8 key1_shortpress_action; +u8 key1_longpress_action; +u8 key2_shortpress_action; +u8 key2_longpress_action; +u8 scan_resume_mode; +u8 auto_keypad_lock; +u8 power_on_dispmode; +u8 password[4]; + +#seekto 0xea0; +u8 keypad_tone; +u8 language; + +#seekto 0xea8; +u8 alarm_mode; +u8 reminding_of_end_talk; +u8 repeater_tail_elimination; + +#seekto 0xeb0; +char logo_line1[16]; +char logo_line2[16]; + +#seekto 0xed0; +struct { +u8 side_tone; +char separate_code; +char group_call_code; +u8 decode_response; +u8 auto_reset_time; +u8 preload_time; +u8 first_code_persist_time; +u8 hash_persist_time; +u8 code_persist_time; +u8 code_interval_time; +u8 permit_remote_kill; +} dtmf_settings; + +#seekto 0xee0; +struct { +char dtmf_local_code[3]; +char unused1[5]; +char kill_code[5]; +char unused2[3]; +char revive_code[5]; +char unused3[3]; +char dtmf_up_code[16]; +char dtmf_down_code[16]; +} dtmf_settings_numbers; + +#seekto 0xf18; +u8 scanlist_default; +u8 scanlist1_priority_scan; +u8 scanlist1_priority_ch1; +u8 scanlist1_priority_ch2; +u8 scanlist2_priority_scan; +u8 scanlist2_priority_ch1; +u8 scanlist2_priority_ch2; +u8 scanlist_unknown_0xff; + + +#seekto 0xf40; +u8 int_flock; +u8 int_350tx; +u8 int_unknown1; +u8 int_200tx; +u8 int_500tx; +u8 int_alltx; +u8 int_scren; + +#seekto 0xf50; +struct { +char name[16]; +} channelname[200]; + +#seekto 0x1c00; +struct { +char name[8]; +char number[3]; +char unused_00[5]; +} dtmfcontact[16]; +""" +# bits that we will save from the channel structure (mostly unknown) +SAVE_MASK_0A = 0b11001100 +SAVE_MASK_0B = 0b11101100 +SAVE_MASK_0C = 0b11100000 +SAVE_MASK_0D = 0b11111000 +SAVE_MASK_0E = 0b11110001 +SAVE_MASK_0F = 0b11110000 + +# flags1 +FLAGS1_OFFSET_NONE = 0b00 +FLAGS1_OFFSET_MINUS = 0b10 +FLAGS1_OFFSET_PLUS = 0b01 + +POWER_HIGH = 0b10 +POWER_MEDIUM = 0b01 +POWER_LOW = 0b00 + +# power +UVK5_POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.50), + chirp_common.PowerLevel("Med", watts=3.00), + chirp_common.PowerLevel("High", watts=5.00), + ] + +# dtmf_flags +PTTID_LIST = ["OFF", "BOT", "EOT", "BOTH"] + +# scrambler +SCRAMBLER_LIST = ["OFF", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"] + +# channel display mode +CHANNELDISP_LIST = ["Frequency", "Channel No", "Channel Name", "Name+Freq"] +# battery save +BATSAVE_LIST = ["OFF", "1:1", "1:2", "1:3", "1:4", "1:5", "1:6", "1:7", "1:8", "1:9"] + +# Backlight auto mode +BACKLIGHT_LIST = ["OFF", "5sec", "10sec", "20sec", "1min", "2min", "On"] + +# Crossband receiving/transmitting +CROSSBAND_LIST = ["OFF", "Band A", "Band B"] +DUALWATCH_LIST = CROSSBAND_LIST + +# steps +STEPS = [0.01, 0.5, 0.10, 0.25, 0.50, 1.0, 1.25, 2.5, 5.0, 6.25, 8.33, 10.0, 12.5, 15.0, 20.0, 25.0, 30.0, 50.0, 100.00] + +# ctcss/dcs codes +TMODES = ["", "Tone", "DTCS", "DTCS"] +TONE_NONE = 0 +TONE_CTCSS = 1 +TONE_DCS = 2 +TONE_RDCS = 3 + + +CTCSS_TONES = [ + 67.0, 69.3, 71.9, 74.4, 77.0, 79.7, 82.5, 85.4, + 88.5, 91.5, 94.8, 97.4, 100.0, 103.5, 107.2, 110.9, + 114.8, 118.8, 123.0, 127.3, 131.8, 136.5, 141.3, 146.2, + 151.4, 156.7, 159.8, 162.2, 165.5, 167.9, 171.3, 173.8, + 177.3, 179.9, 183.5, 186.2, 189.9, 192.8, 196.6, 199.5, + 203.5, 206.5, 210.7, 218.1, 225.7, 229.1, 233.6, 241.8, + 250.3, 254.1 +] + +# lifted from ft4.py +DTCS_CODES = [ + 23, 25, 26, 31, 32, 36, 43, 47, 51, 53, 54, + 65, 71, 72, 73, 74, 114, 115, 116, 122, 125, 131, + 132, 134, 143, 145, 152, 155, 156, 162, 165, 172, 174, + 205, 212, 223, 225, 226, 243, 244, 245, 246, 251, 252, + 255, 261, 263, 265, 266, 271, 274, 306, 311, 315, 325, + 331, 332, 343, 346, 351, 356, 364, 365, 371, 411, 412, + 413, 423, 431, 432, 445, 446, 452, 454, 455, 462, 464, + 465, 466, 503, 506, 516, 523, 526, 532, 546, 565, 606, + 612, 624, 627, 631, 632, 654, 662, 664, 703, 712, 723, + 731, 732, 734, 743, 754 +] + +FLOCK_LIST = ["OFF", "FCC", "CE", "GB", "LPD_PMR"] + +SCANRESUME_LIST = ["TO: Resume after 5 seconds", + "CO: Resume after signal dissapears", + "SE: Stop scanning after receiving a signal"] + +WELCOME_LIST = ["Full Screen", "Message", "Voltage"] +KEYPADTONE_LIST = ["OFF", "Chinese", "English"] +LANGUAGE_LIST = ["Chinese", "English"] +ALARMMODE_LIST = ["SITE", "TONE"] +#REMENDOFTALK_LIST = ["OFF", "ROGER", "MDC"] +RTE_LIST = ["OFF", "100ms", "200ms", "300ms", "400ms", + "500ms", "600ms", "700ms", "800ms", "900ms"] +ALL_TX = ["DEFAULT", "ENABLE", "DISABLE"] + +MEM_SIZE = 0x2000 # size of all memory +PROG_SIZE = 0x1d00 # size of the memory that we will write +MEM_BLOCK = 0x80 # largest block of memory that we can reliably write + +# fm radio supported frequencies +FMMIN = 76.0 +FMMAX = 108.0 + +# bands supported by the UV-K5 +BANDS = { + 0: [15.0, 107.9999], + 1: [108.0, 135.9999], + 2: [136.0, 173.9990], + 3: [174.0, 349.9999], + 4: [350.0, 399.9999], + 5: [400.0, 469.9999], + 6: [470.0, 1340.0] + } + +# for radios with modified firmware: +BANDS_NOLIMITS = { + 0: [0.0, 107.9999], + 1: [108.0, 135.9999], + 2: [136.0, 173.9990], + 3: [174.0, 349.9999], + 4: [350.0, 399.9999], + 5: [400.0, 469.9999], + 6: [470.0, 6500.0] + } + +SPECIALS = { + "F1(50M-76M)A": 200, + "F1(50M-76M)B": 201, + "F2(108M-136M)A": 202, + "F2(108M-136M)B": 203, + "F3(136M-174M)A": 204, + "F3(136M-174M)B": 205, + "F4(174M-350M)A": 206, + "F4(174M-350M)B": 207, + "F5(350M-400M)A": 208, + "F5(350M-400M)B": 209, + "F6(400M-470M)A": 210, + "F6(400M-470M)B": 211, + "F7(470M-600M)A": 212, + "F7(470M-600M)B": 213 + } + +VFO_CHANNEL_NAMES = ["F1(50M-76M)A", "F1(50M-76M)B", + "F2(108M-136M)A", "F2(108M-136M)B", + "F3(136M-174M)A", "F3(136M-174M)B", + "F4(174M-350M)A", "F4(174M-350M)B", + "F5(350M-400M)A", "F5(350M-400M)B", + "F6(400M-470M)A", "F6(400M-470M)B", + "F7(470M-600M)A", "F7(470M-600M)B"] + +SCANLIST_LIST = ["None", "1", "2", "1+2"] + +DTMF_CHARS = "0123456789ABCD*# " +DTMF_CHARS_ID = "0123456789ABCDabcd" +DTMF_CHARS_KILL = "0123456789ABCDabcd" +DTMF_CHARS_UPDOWN = "0123456789ABCDabcd#* " +DTMF_CODE_CHARS = "ABCD*# " +DTMF_DECODE_RESPONSE_LIST = ["None", "Ring", "Reply", "Both"] + +KEYACTIONS_LIST = ["None", "Flashlight on/off", "Power select", + "Monitor", "Scan on/off", "VOX on/off", + "Alarm on/off", "FM radio on/off", "Transmit 1750Hz"] + +# the communication is obfuscated using this fine mechanism +def xorarr(data: bytes): + tbl = [22, 108, 20, 230, 46, 145, 13, 64, 33, 53, 213, 64, 19, 3, 233, 128] + x = b"" + r = 0 + for byte in data: + x += bytes([byte ^ tbl[r]]) + r = (r+1) % len(tbl) + return x + + +# if this crc was used for communication to AND from the radio, then it +# would be a measure to increase reliability. +# but it's only used towards the radio, so it's for further obfuscation +def calculate_crc16_xmodem(data: bytes): + poly = 0x1021 + crc = 0x0 + for byte in data: + crc = crc ^ (byte << 8) + for i in range(8): + crc = crc << 1 + if (crc & 0x10000): + crc = (crc ^ poly) & 0xFFFF + return crc & 0xFFFF + + +def _send_command(serport, data: bytes): + """Send a command to UV-K5 radio""" + LOG.debug("Sending command (unobfuscated) len=0x%4.4x:\n%s" % + (len(data), util.hexprint(data))) + + crc = calculate_crc16_xmodem(data) + data2 = data + struct.pack("HBB", 0xabcd, len(data), 0) + \ + xorarr(data2) + \ + struct.pack(">H", 0xdcba) + if DEBUG_SHOW_OBFUSCATED_COMMANDS: + LOG.debug("Sending command (obfuscated):\n%s" % util.hexprint(command)) + try: + result = serport.write(command) + except Exception: + raise errors.RadioError("Error writing data to radio") + return result + + +def _receive_reply(serport): + header = serport.read(4) + if len(header) != 4: + LOG.warning("Header short read: [%s] len=%i" % + (util.hexprint(header), len(header))) + raise errors.RadioError("Header short read") + if header[0] != 0xAB or header[1] != 0xCD or header[3] != 0x00: + LOG.warning("Bad response header: %s len=%i" % + (util.hexprint(header), len(header))) + raise errors.RadioError("Bad response header") + + cmd = serport.read(int(header[2])) + if len(cmd) != int(header[2]): + LOG.warning("Body short read: [%s] len=%i" % + (util.hexprint(cmd), len(cmd))) + raise errors.RadioError("Command body short read") + + footer = serport.read(4) + + if len(footer) != 4: + LOG.warning("Footer short read: [%s] len=%i" % + (util.hexprint(footer), len(footer))) + raise errors.RadioError("Footer short read") + + if footer[2] != 0xDC or footer[3] != 0xBA: + LOG.debug( + "Reply before bad response footer (obfuscated)" + "len=0x%4.4x:\n%s" % (len(cmd), util.hexprint(cmd))) + LOG.warning("Bad response footer: %s len=%i" % + (util.hexprint(footer), len(footer))) + raise errors.RadioError("Bad response footer") + + if DEBUG_SHOW_OBFUSCATED_COMMANDS: + LOG.debug("Received reply (obfuscated) len=0x%4.4x:\n%s" % + (len(cmd), util.hexprint(cmd))) + + cmd2 = xorarr(cmd) + + LOG.debug("Received reply (unobfuscated) len=0x%4.4x:\n%s" % + (len(cmd2), util.hexprint(cmd2))) + + return cmd2 + + +def _getstring(data: bytes, begin, maxlen): + tmplen = min(maxlen+1, len(data)) + s = [data[i] for i in range(begin, tmplen)] + for key, val in enumerate(s): + if val < ord(' ') or val > ord('~'): + break + return ''.join(chr(x) for x in s[0:key]) + + +def _sayhello(serport): + hellopacket = b"\x14\x05\x04\x00\x6a\x39\x57\x64" + + tries = 5 + while True: + LOG.debug("Sending hello packet") + _send_command(serport, hellopacket) + o = _receive_reply(serport) + if (o): + break + tries -= 1 + if tries == 0: + LOG.warning("Failed to initialise radio") + raise errors.RadioError("Failed to initialize radio") + firmware = _getstring(o, 4, 16) + LOG.info("Found firmware: %s" % firmware) + return firmware + + +def _readmem(serport, offset, length): + LOG.debug("Sending readmem offset=0x%4.4x len=0x%4.4x" % (offset, length)) + + readmem = b"\x1b\x05\x08\x00" + \ + struct.pack("> 8) & 0xff): + return True + else: + LOG.warning("Bad data from writemem") + raise errors.RadioError("Bad response to writemem") + + +def _resetradio(serport): + resetpacket = b"\xdd\x05\x00\x00" + _send_command(serport, resetpacket) + + +def do_download(radio): + """download eeprom from radio""" + serport = radio.pipe + serport.timeout = 0.5 + status = chirp_common.Status() + status.cur = 0 + status.max = MEM_SIZE + status.msg = "Downloading from radio" + radio.status_fn(status) + + eeprom = b"" + f = _sayhello(serport) + if f: + radio.FIRMWARE_VERSION = f + else: + return False + + addr = 0 + while addr < MEM_SIZE: + o = _readmem(serport, addr, MEM_BLOCK) + status.cur = addr + radio.status_fn(status) + + if o and len(o) == MEM_BLOCK: + eeprom += o + addr += MEM_BLOCK + else: + raise errors.RadioError("Memory download incomplete") + + return memmap.MemoryMapBytes(eeprom) + + +def do_upload(radio): + serport = radio.pipe + serport.timeout = 0.5 + status = chirp_common.Status() + status.cur = 0 + status.max = PROG_SIZE + status.msg = "Uploading to radio" + radio.status_fn(status) + + f = _sayhello(serport) + if f: + radio.FIRMWARE_VERSION = f + else: + return False + + addr = 0 + while addr < PROG_SIZE: + o = radio.get_mmap()[addr:addr+MEM_BLOCK] + _writemem(serport, o, addr) + status.cur = addr + radio.status_fn(status) + if o: + addr += MEM_BLOCK + else: + raise errors.RadioError("Memory upload incomplete") + status.msg = "Uploaded OK" + + _resetradio(serport) + + return True + + +def _find_band(self, hz): + mhz = hz/1000000.0 + if self.FIRMWARE_NOLIMITS: + B = BANDS_NOLIMITS + else: + B = BANDS + + # currently the hacked firmware sets band=1 below 50MHz + if self.FIRMWARE_NOLIMITS and mhz < 50.0: + return 0 + + for a in B: + if mhz >= B[a][0] and mhz <= B[a][1]: + return a + return False + + +@directory.register +class UVK5Radio(chirp_common.CloneModeRadio): + """Quansheng UV-K5""" + VENDOR = "Quansheng" + MODEL = "UV-K5" + BAUD_RATE = 38400 + NEEDS_COMPAT_SERIAL = False + FIRMWARE_VERSION = "" + FIRMWARE_NOLIMITS = False + + def get_prompts(x=None): + rp = chirp_common.RadioPrompts() + rp.experimental = \ + ('This is an experimental driver for the Quansheng UV-K5. ' + 'It may harm your radio, or worse. Use at your own risk.\n\n' + 'Before attempting to do any changes please download' + 'the memory image from the radio with chirp ' + 'and keep it. This can be later used to recover the ' + 'original settings. \n\n' + 'some details are not yet implemented') + rp.pre_download = _( + "1. Turn radio on.\n" + "2. Connect cable to mic/spkr connector.\n" + "3. Make sure connector is firmly connected.\n" + "4. Click OK to download image from device.\n\n" + "It will may not work if you turn on the radio " + "with the cable already attached\n") + rp.pre_upload = _( + "1. Turn radio on.\n" + "2. Connect cable to mic/spkr connector.\n" + "3. Make sure connector is firmly connected.\n" + "4. Click OK to upload the image to device.\n\n" + "It will may not work if you turn on the radio " + "with the cable already attached") + return rp + + # Return information about this radio's features, including + # how many memories it has, what bands it supports, etc + def get_features(self): + rf = chirp_common.RadioFeatures() + rf.has_bank = False + rf.valid_dtcs_codes = DTCS_CODES + rf.has_rx_dtcs = True + rf.has_ctone = True + rf.has_settings = True + rf.has_comment = False + rf.valid_name_length = 10 + rf.valid_power_levels = UVK5_POWER_LEVELS + rf.valid_special_chans = list(SPECIALS.keys()) + #rf.valid_duplexes = ["", "-", "+", "off"] + + # hack so we can input any frequency, + # the 0.1 and 0.01 steps don't work unfortunately + rf.valid_tuning_steps = STEPS + + rf.valid_tmodes = ["", "Tone", "TSQL", "DTCS", "Cross"] + rf.valid_cross_modes = ["Tone->Tone", "Tone->DTCS", "DTCS->Tone", + "->Tone", "->DTCS", "DTCS->", "DTCS->DTCS"] + + rf.valid_characters = chirp_common.CHARSET_ASCII + rf.valid_modes = ["FM", "NFM", "AM", "NAM", "USB"] + rf.valid_tmodes = ["", "Tone", "TSQL", "DTCS", "Cross"] + + rf.valid_skips = [""] + + # This radio supports memories 1-200, 201-214 are the VFO memories + rf.memory_bounds = (1, 200) + + # This is what the BK4819 chip supports + # Will leave it in a comment, might be useful someday + # rf.valid_bands = [(18000000, 620000000), + # (840000000, 1300000000) + # ] + rf.valid_bands = [] + for a in BANDS: + rf.valid_bands.append( + (int(BANDS[a][0]*1000000), int(BANDS[a][1]*1000000))) + return rf + + # Do a download of the radio from the serial port + def sync_in(self): + self._mmap = do_download(self) + self.process_mmap() + + # Do an upload of the radio to the serial port + def sync_out(self): + do_upload(self) + + # Convert the raw byte array into a memory object structure + def process_mmap(self): + self._memobj = bitwise.parse(MEM_FORMAT, self._mmap) + + # Return a raw representation of the memory object, which + # is very helpful for development + def get_raw_memory(self, number): + return repr(self._memobj.channel[number-1]) + + def validate_memory(self, mem): + msgs = super().validate_memory(mem) + + # find tx frequency + if mem.duplex == '-': + txfreq = mem.freq - mem.offset + elif mem.duplex == '+': + txfreq = mem.freq + mem.offset + else: + txfreq = mem.freq + + # find band + band = _find_band(self, txfreq) + if band is False: + msg = "Transmit frequency %.4fMHz is not supported by this radio" \ + % (txfreq/1000000.0) + msgs.append(chirp_common.ValidationWarning(msg)) + + band = _find_band(self, mem.freq) + if band is False: + msg = "The frequency %.4fMHz is not supported by this radio" \ + % (mem.freq/1000000.0) + msgs.append(chirp_common.ValidationWarning(msg)) + + return msgs + + def _set_tone(self, mem, _mem): + ((txmode, txtone, txpol), + (rxmode, rxtone, rxpol)) = chirp_common.split_tone_encode(mem) + + if txmode == "Tone": + txtoval = CTCSS_TONES.index(txtone) + txmoval = 0b01 + elif txmode == "DTCS": + txmoval = txpol == "R" and 0b11 or 0b10 + txtoval = DTCS_CODES.index(txtone) + else: + txmoval = 0 + txtoval = 0 + + if rxmode == "Tone": + rxtoval = CTCSS_TONES.index(rxtone) + rxmoval = 0b01 + elif rxmode == "DTCS": + rxmoval = rxpol == "R" and 0b11 or 0b10 + rxtoval = DTCS_CODES.index(rxtone) + else: + rxmoval = 0 + rxtoval = 0 + + _mem.rxcodeflag = rxmoval + _mem.txcodeflag = txmoval + _mem.unknown1 = 0 + _mem.unknown2 = 0 + _mem.rxcode = rxtoval + _mem.txcode = txtoval + + def _get_tone(self, mem, _mem): + rxtype = _mem.rxcodeflag + txtype = _mem.txcodeflag + rx_tmode = TMODES[rxtype] + tx_tmode = TMODES[txtype] + + rx_tone = tx_tone = None + + if tx_tmode == "Tone": + if _mem.txcode < len(CTCSS_TONES): + tx_tone = CTCSS_TONES[_mem.txcode] + else: + tx_tone = 0 + tx_tmode = "" + elif tx_tmode == "DTCS": + if _mem.txcode < len(DTCS_CODES): + tx_tone = DTCS_CODES[_mem.txcode] + else: + tx_tone = 0 + tx_tmode = "" + + if rx_tmode == "Tone": + if _mem.rxcode < len(CTCSS_TONES): + rx_tone = CTCSS_TONES[_mem.rxcode] + else: + rx_tone = 0 + rx_tmode = "" + elif rx_tmode == "DTCS": + if _mem.rxcode < len(DTCS_CODES): + rx_tone = DTCS_CODES[_mem.rxcode] + else: + rx_tone = 0 + rx_tmode = "" + + tx_pol = txtype == 0x03 and "R" or "N" + rx_pol = rxtype == 0x03 and "R" or "N" + + chirp_common.split_tone_decode(mem, (tx_tmode, tx_tone, tx_pol), + (rx_tmode, rx_tone, rx_pol)) + + # Extract a high-level memory object from the low-level memory map + # This is called to populate a memory in the UI + def get_memory(self, number2): + + mem = chirp_common.Memory() + + if isinstance(number2, str): + number = SPECIALS[number2] + mem.extd_number = number2 + else: + number = number2 - 1 + + mem.number = number + 1 + + _mem = self._memobj.channel[number] + + tmpcomment = "" + + is_empty = False + # We'll consider any blank (i.e. 0MHz frequency) to be empty + if (_mem.freq == 0xffffffff) or (_mem.freq == 0): + is_empty = True + + tmpscn = SCANLIST_LIST[0] + + # We'll also look at the channel attributes if a memory has them + if number < 200: + _mem3 = self._memobj.channel_attributes[number] + # free memory bit + if _mem3.is_free > 0: + is_empty = True + # scanlists + if _mem3.is_scanlist1 > 0 and _mem3.is_scanlist2 > 0: + tmpscn = SCANLIST_LIST[3] # "1+2" + elif _mem3.is_scanlist1 > 0: + tmpscn = SCANLIST_LIST[1] # "1" + elif _mem3.is_scanlist2 > 0: + tmpscn = SCANLIST_LIST[2] # "2" + + if is_empty: + mem.empty = True + # set some sane defaults: + mem.power = UVK5_POWER_LEVELS[2] + mem.extra = RadioSettingGroup("Extra", "extra") + rs = RadioSetting("bclo", "BCLO", RadioSettingValueBoolean(False)) + mem.extra.append(rs) + rs = RadioSetting("frev", "FreqRev", + RadioSettingValueBoolean(False)) + mem.extra.append(rs) + rs = RadioSetting("pttid", "PTTID", RadioSettingValueList( + PTTID_LIST, PTTID_LIST[0])) + mem.extra.append(rs) + rs = RadioSetting("dtmfdecode", "DTMF decode", + RadioSettingValueBoolean(False)) + mem.extra.append(rs) + rs = RadioSetting("scrambler", "Scrambler", RadioSettingValueList( + SCRAMBLER_LIST, SCRAMBLER_LIST[0])) + mem.extra.append(rs) + + rs = RadioSetting("scanlists", "Scanlists", RadioSettingValueList( + SCANLIST_LIST, SCANLIST_LIST[0])) + mem.extra.append(rs) + + # actually the step and duplex are overwritten by chirp based on + # bandplan. they are here to document sane defaults for IARU r1 + # mem.tuning_step = 25.0 + # mem.duplex = "off" + + return mem + + if number > 199: + mem.name = VFO_CHANNEL_NAMES[number-200] + mem.immutable = ["name", "scanlists"] + else: + _mem2 = self._memobj.channelname[number] + for char in _mem2.name: + if str(char) == "\xFF" or str(char) == "\x00": + break + mem.name += str(char) + mem.name = mem.name.rstrip() + + # Convert your low-level frequency to Hertz + mem.freq = int(_mem.freq)*10 + mem.offset = int(_mem.offset)*10 + + if (mem.offset == 0): + mem.duplex = '' + else: + if _mem.shift == FLAGS1_OFFSET_MINUS: + mem.duplex = '-' + elif _mem.shift == FLAGS1_OFFSET_PLUS: + mem.duplex = '+' + else: + mem.duplex = '' + + # tone data + self._get_tone(mem, _mem) + + # mode + if _mem.enable_am > 0: + if _mem.bandwidth > 0: + mem.mode = "NAM" + else: + mem.mode = "AM" + elif _mem.enable_usb == 1: + mem.mode = "USB" + else: + if _mem.bandwidth > 0: + mem.mode = "NFM" + else: + mem.mode = "FM" + + # tuning step + tstep = _mem.step & 0x7 + if tstep < len(STEPS): + mem.tuning_step = STEPS[tstep] + else: + mem.tuning_step = 2.5 + + # power + if _mem.txpower == POWER_HIGH: + mem.power = UVK5_POWER_LEVELS[2] + elif _mem.txpower == POWER_MEDIUM: + mem.power = UVK5_POWER_LEVELS[1] + else: + mem.power = UVK5_POWER_LEVELS[0] + + # We'll consider any blank (i.e. 0MHz frequency) to be empty + if (_mem.freq == 0xffffffff) or (_mem.freq == 0): + mem.empty = True + else: + mem.empty = False + + mem.extra = RadioSettingGroup("Extra", "extra") + + # BCLO + is_bclo = bool(_mem.bclo > 0) + rs = RadioSetting("bclo", "BCLO", RadioSettingValueBoolean(is_bclo)) + mem.extra.append(rs) + tmpcomment += "BCLO:"+(is_bclo and "ON" or "OFF")+" " + + # Frequency reverse - whatever that means, don't see it in the manual + is_frev = bool(_mem.freq_reverse > 0) + rs = RadioSetting("frev", "FreqRev", RadioSettingValueBoolean(is_frev)) + mem.extra.append(rs) + tmpcomment += "FreqReverse:"+(is_frev and "ON" or "OFF")+" " + + # PTTID + pttid = _mem.dtmf_pttid + rs = RadioSetting("pttid", "PTTID", RadioSettingValueList( + PTTID_LIST, PTTID_LIST[pttid])) + mem.extra.append(rs) + tmpcomment += "PTTid:"+PTTID_LIST[pttid]+" " + + # DTMF DECODE + is_dtmf = bool(_mem.dtmf_decode > 0) + rs = RadioSetting("dtmfdecode", "DTMF decode", + RadioSettingValueBoolean(is_dtmf)) + mem.extra.append(rs) + tmpcomment += "DTMFdecode:"+(is_dtmf and "ON" or "OFF")+" " + + # Scrambler + if _mem.scrambler & 0x0f < len(SCRAMBLER_LIST): + enc = _mem.scrambler & 0x0f + else: + enc = 0 + + rs = RadioSetting("scrambler", "Scrambler", RadioSettingValueList( + SCRAMBLER_LIST, SCRAMBLER_LIST[enc])) + mem.extra.append(rs) + tmpcomment += "Scrambler:"+SCRAMBLER_LIST[enc]+" " + + rs = RadioSetting("scanlists", "Scanlists", RadioSettingValueList( + SCANLIST_LIST, tmpscn)) + mem.extra.append(rs) + + return mem + + def set_settings(self, settings): + _mem = self._memobj + for element in settings: + if not isinstance(element, RadioSetting): + self.set_settings(element) + continue + + # basic settings + + # call channel + if element.get_name() == "call_channel": + _mem.call_channel = int(element.value)-1 + + # squelch + if element.get_name() == "squelch": + _mem.squelch = int(element.value) + # TOT + if element.get_name() == "tot": + _mem.max_talk_time = int(element.value) + + # NOAA autoscan + if element.get_name() == "noaa_autoscan": + _mem.noaa_autoscan = element.value and 1 or 0 + + # VOX switch + if element.get_name() == "vox_switch": + _mem.vox_switch = element.value and 1 or 0 + + # vox level + if element.get_name() == "vox_level": + _mem.vox_level = int(element.value)-1 + + # mic gain + if element.get_name() == "mic_gain": + _mem.mic_gain = int(element.value) + + # Channel display mode + if element.get_name() == "channel_display_mode": + _mem.channel_display_mode = CHANNELDISP_LIST.index( + str(element.value)) + + # Crossband receiving/transmitting + if element.get_name() == "crossband": + _mem.crossband = CROSSBAND_LIST.index(str(element.value)) + + # Battery Save + if element.get_name() == "battery_save": + _mem.battery_save = BATSAVE_LIST.index(str(element.value)) + # Dual Watch + if element.get_name() == "dualwatch": + _mem.dual_watch = DUALWATCH_LIST.index(str(element.value)) + + # Backlight auto mode + if element.get_name() == "backlight_auto_mode": + _mem.backlight_auto_mode = \ + BACKLIGHT_LIST.index(str(element.value)) + + # Tail tone elimination + if element.get_name() == "tail_note_elimination": + _mem.tail_note_elimination = element.value and 1 or 0 + + # VFO Open + if element.get_name() == "vfo_open": + _mem.vfo_open = element.value and 1 or 0 + + # Beep control + if element.get_name() == "beep_control": + _mem.beep_control = element.value and 1 or 0 + + # Scan resume mode + if element.get_name() == "scan_resume_mode": + _mem.scan_resume_mode = SCANRESUME_LIST.index( + str(element.value)) + + # Keypad lock + if element.get_name() == "key_lock": + _mem.key_lock = element.value and 1 or 0 + + # Auto keypad lock + if element.get_name() == "auto_keypad_lock": + _mem.auto_keypad_lock = element.value and 1 or 0 + + # Power on display mode + if element.get_name() == "welcome_mode": + _mem.power_on_dispmode = WELCOME_LIST.index(str(element.value)) + + # Keypad Tone + if element.get_name() == "keypad_tone": + _mem.keypad_tone = KEYPADTONE_LIST.index(str(element.value)) + + # Language + if element.get_name() == "language": + _mem.language = LANGUAGE_LIST.index(str(element.value)) + + # Alarm mode + if element.get_name() == "alarm_mode": + _mem.alarm_mode = ALARMMODE_LIST.index(str(element.value)) + + # Reminding of end of talk +# if element.get_name() == "reminding_of_end_talk": +# _mem.reminding_of_end_talk = REMENDOFTALK_LIST.index( +# str(element.value)) + + # Repeater tail tone elimination + if element.get_name() == "repeater_tail_elimination": + _mem.repeater_tail_elimination = RTE_LIST.index( + str(element.value)) + + # Logo string 1 + if element.get_name() == "logo1": + b = str(element.value).rstrip("\x20\xff\x00")+"\x00"*12 + _mem.logo_line1 = b[0:12]+"\x00\xff\xff\xff" + + # Logo string 2 + if element.get_name() == "logo2": + b = str(element.value).rstrip("\x20\xff\x00")+"\x00"*12 + _mem.logo_line2 = b[0:12]+"\x00\xff\xff\xff" + + # unlock settings + + # FLOCK + if element.get_name() == "flock": + _mem.int_flock = FLOCK_LIST.index(str(element.value)) + + # 350TX + if element.get_name() == "350tx": + _mem.int_350tx = element.value and 1 or 0 + + # 200TX + if element.get_name() == "200tx": + _mem.int_200tx = element.value and 1 or 0 + + # 500TX + if element.get_name() == "500tx": + _mem.int_500tx = element.value and 1 or 0 + + # alltx + if element.get_name() == "alltx": + _mem.int_alltx = ALL_TX.index(str(element.value)) + + # SCREN + if element.get_name() == "scren": + _mem.int_scren = element.value and 1 or 0 + + # fm radio + for i in range(1, 21): + freqname = "FM_" + str(i) + if element.get_name() == freqname: + val = str(element.value).strip() + try: + val2 = int(float(val)*10) + except Exception: + val2 = 0xffff + + if val2 < FMMIN*10 or val2 > FMMAX*10: + val2 = 0xffff +# raise errors.InvalidValueError( +# "FM radio frequency should be a value " +# "in the range %.1f - %.1f" % (FMMIN , FMMAX)) + _mem.fmfreq[i-1] = val2 + + # dtmf settings + if element.get_name() == "dtmf_side_tone": + _mem.dtmf_settings.side_tone = \ + element.value and 1 or 0 + + if element.get_name() == "dtmf_separate_code": + _mem.dtmf_settings.separate_code = str(element.value) + + if element.get_name() == "dtmf_group_call_code": + _mem.dtmf_settings.group_call_code = element.value + + if element.get_name() == "dtmf_decode_response": + _mem.dtmf_settings.decode_response = \ + DTMF_DECODE_RESPONSE_LIST.index(str(element.value)) + + if element.get_name() == "dtmf_auto_reset_time": + _mem.dtmf_settings.auto_reset_time = \ + int(int(element.value)/10) + + if element.get_name() == "dtmf_preload_time": + _mem.dtmf_settings.preload_time = \ + int(int(element.value)/10) + + if element.get_name() == "dtmf_first_code_persist_time": + _mem.dtmf_settings.first_code_persist_time = \ + int(int(element.value)/10) + + if element.get_name() == "dtmf_hash_persist_time": + _mem.dtmf_settings.hash_persist_time = \ + int(int(element.value)/10) + + if element.get_name() == "dtmf_code_persist_time": + _mem.dtmf_settings.code_persist_time = \ + int(int(element.value)/10) + + if element.get_name() == "dtmf_code_interval_time": + _mem.dtmf_settings.code_interval_time = \ + int(int(element.value)/10) + + if element.get_name() == "dtmf_permit_remote_kill": + _mem.dtmf_settings.permit_remote_kill = \ + element.value and 1 or 0 + + if element.get_name() == "dtmf_dtmf_local_code": + k = str(element.value).rstrip("\x20\xff\x00") + "\x00"*3 + _mem.dtmf_settings_numbers.dtmf_local_code = k[0:3] + + if element.get_name() == "dtmf_dtmf_up_code": + k = str(element.value).strip("\x20\xff\x00") + "\x00"*16 + _mem.dtmf_settings_numbers.dtmf_up_code = k[0:16] + + if element.get_name() == "dtmf_dtmf_down_code": + k = str(element.value).rstrip("\x20\xff\x00") + "\x00"*16 + _mem.dtmf_settings_numbers.dtmf_down_code = k[0:16] + + if element.get_name() == "dtmf_kill_code": + k = str(element.value).strip("\x20\xff\x00") + "\x00"*5 + _mem.dtmf_settings_numbers.kill_code = k[0:5] + + if element.get_name() == "dtmf_revive_code": + k = str(element.value).strip("\x20\xff\x00") + "\x00"*5 + _mem.dtmf_settings_numbers.revive_code = k[0:5] + + # dtmf contacts + for i in range(1, 17): + varname = "DTMF_" + str(i) + if element.get_name() == varname: + k = str(element.value).rstrip("\x20\xff\x00") + "\x00"*8 + _mem.dtmfcontact[i-1].name = k[0:8] + + varnumname = "DTMFNUM_" + str(i) + if element.get_name() == varnumname: + k = str(element.value).rstrip("\x20\xff\x00") + "\xff"*3 + _mem.dtmfcontact[i-1].number = k[0:3] + + # scanlist stuff + if element.get_name() == "scanlist_default": + val = (int(element.value) == 2) and 1 or 0 + _mem.scanlist_default = val + + if element.get_name() == "scanlist1_priority_scan": + _mem.scanlist1_priority_scan = \ + element.value and 1 or 0 + + if element.get_name() == "scanlist2_priority_scan": + _mem.scanlist2_priority_scan = \ + element.value and 1 or 0 + + if element.get_name() == "scanlist1_priority_ch1" or \ + element.get_name() == "scanlist1_priority_ch2" or \ + element.get_name() == "scanlist2_priority_ch1" or \ + element.get_name() == "scanlist2_priority_ch2": + + val = int(element.value) + + if val > 200 or val < 1: + val = 0xff + else: + val -= 1 + + if element.get_name() == "scanlist1_priority_ch1": + _mem.scanlist1_priority_ch1 = val + if element.get_name() == "scanlist1_priority_ch2": + _mem.scanlist1_priority_ch2 = val + if element.get_name() == "scanlist2_priority_ch1": + _mem.scanlist2_priority_ch1 = val + if element.get_name() == "scanlist2_priority_ch2": + _mem.scanlist2_priority_ch2 = val + + if element.get_name() == "key1_shortpress_action": + _mem.key1_shortpress_action = KEYACTIONS_LIST.index( + str(element.value)) + + if element.get_name() == "key1_longpress_action": + _mem.key1_longpress_action = KEYACTIONS_LIST.index( + str(element.value)) + + if element.get_name() == "key2_shortpress_action": + _mem.key2_shortpress_action = KEYACTIONS_LIST.index( + str(element.value)) + + if element.get_name() == "key2_longpress_action": + _mem.key2_longpress_action = KEYACTIONS_LIST.index( + str(element.value)) + + def get_settings(self): + _mem = self._memobj + basic = RadioSettingGroup("basic", "Basic Settings") + keya = RadioSettingGroup("keya", "Programmable keys") + dtmf = RadioSettingGroup("dtmf", "DTMF Settings") + dtmfc = RadioSettingGroup("dtmfc", "DTMF Contacts") + scanl = RadioSettingGroup("scn", "Scan Lists") + unlock = RadioSettingGroup("unlock", "Unlock Settings") + fmradio = RadioSettingGroup("fmradio", "FM Radio") + + roinfo = RadioSettingGroup("roinfo", "Driver information") + + top = RadioSettings( + basic, keya, dtmf, dtmfc, scanl, unlock, fmradio, roinfo) + + # Programmable keys + tmpval = int(_mem.key1_shortpress_action) + if tmpval >= len(KEYACTIONS_LIST): + tmpval = 3 + rs = RadioSetting("key1_shortpress_action", "Side key 1 short press", + RadioSettingValueList( + KEYACTIONS_LIST, KEYACTIONS_LIST[tmpval])) + keya.append(rs) + + tmpval = int(_mem.key1_longpress_action) + if tmpval >= len(KEYACTIONS_LIST): + tmpval = 7 + rs = RadioSetting("key1_longpress_action", "Side key 1 long press", + RadioSettingValueList( + KEYACTIONS_LIST, KEYACTIONS_LIST[tmpval])) + keya.append(rs) + + tmpval = int(_mem.key2_shortpress_action) + if tmpval >= len(KEYACTIONS_LIST): + tmpval = 2 + rs = RadioSetting("key2_shortpress_action", "Side key 2 short press", + RadioSettingValueList( + KEYACTIONS_LIST, KEYACTIONS_LIST[tmpval])) + keya.append(rs) + + tmpval = int(_mem.key2_longpress_action) + if tmpval >= len(KEYACTIONS_LIST): + tmpval = 4 + rs = RadioSetting("key2_longpress_action", "Side key 2 long press", + RadioSettingValueList( + KEYACTIONS_LIST, KEYACTIONS_LIST[tmpval])) + keya.append(rs) + + # DTMF settings + tmppr = bool(_mem.dtmf_settings.side_tone > 0) + rs = RadioSetting( + "dtmf_side_tone", + "DTMF Sidetone", + RadioSettingValueBoolean(tmppr)) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings.separate_code) + if tmpval not in DTMF_CODE_CHARS: + tmpval = '*' + val = RadioSettingValueString(1, 1, tmpval) + val.set_charset(DTMF_CODE_CHARS) + rs = RadioSetting("dtmf_separate_code", "Separate Code", val) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings.group_call_code) + if tmpval not in DTMF_CODE_CHARS: + tmpval = '#' + val = RadioSettingValueString(1, 1, tmpval) + val.set_charset(DTMF_CODE_CHARS) + rs = RadioSetting("dtmf_group_call_code", "Group Call Code", val) + dtmf.append(rs) + + tmpval = _mem.dtmf_settings.decode_response + if tmpval >= len(DTMF_DECODE_RESPONSE_LIST): + tmpval = 0 + rs = RadioSetting("dtmf_decode_response", "Decode Response", + RadioSettingValueList( + DTMF_DECODE_RESPONSE_LIST, + DTMF_DECODE_RESPONSE_LIST[tmpval])) + dtmf.append(rs) + + tmpval = _mem.dtmf_settings.auto_reset_time + if tmpval > 60 or tmpval < 5: + tmpval = 5 + rs = RadioSetting("dtmf_auto_reset_time", + "Auto reset time (s)", + RadioSettingValueInteger(5, 60, tmpval)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.preload_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_preload_time", + "Pre-load time (ms)", + RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.first_code_persist_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_first_code_persist_time", + "First code persist time (ms)", + RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.hash_persist_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_hash_persist_time", + "#/* persist time (ms)", + RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.code_persist_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_code_persist_time", + "Code persist time (ms)", + RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = int(_mem.dtmf_settings.code_interval_time) + if tmpval > 100 or tmpval < 3: + tmpval = 30 + tmpval *= 10 + rs = RadioSetting("dtmf_code_interval_time", + "Code interval time (ms)", + RadioSettingValueInteger(30, 1000, tmpval, 10)) + dtmf.append(rs) + + tmpval = bool(_mem.dtmf_settings.permit_remote_kill > 0) + rs = RadioSetting( + "dtmf_permit_remote_kill", + "Permit remote kill", + RadioSettingValueBoolean(tmpval)) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings_numbers.dtmf_local_code).upper().strip( + "\x00\xff\x20") + for i in tmpval: + if i in DTMF_CHARS_ID: + continue + else: + tmpval = "103" + break + val = RadioSettingValueString(3, 3, tmpval) + val.set_charset(DTMF_CHARS_ID) + rs = RadioSetting("dtmf_dtmf_local_code", + "Local code (3 chars 0-9 ABCD)", val) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings_numbers.dtmf_up_code).upper().strip( + "\x00\xff\x20") + for i in tmpval: + if i in DTMF_CHARS_UPDOWN or i == "": + continue + else: + tmpval = "123" + break + val = RadioSettingValueString(1, 16, tmpval) + val.set_charset(DTMF_CHARS_UPDOWN) + rs = RadioSetting("dtmf_dtmf_up_code", + "Up code (1-16 chars 0-9 ABCD*#)", val) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings_numbers.dtmf_down_code).upper().strip( + "\x00\xff\x20") + for i in tmpval: + if i in DTMF_CHARS_UPDOWN: + continue + else: + tmpval = "456" + break + val = RadioSettingValueString(1, 16, tmpval) + val.set_charset(DTMF_CHARS_UPDOWN) + rs = RadioSetting("dtmf_dtmf_down_code", + "Down code (1-16 chars 0-9 ABCD*#)", val) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings_numbers.kill_code).upper().strip( + "\x00\xff\x20") + for i in tmpval: + if i in DTMF_CHARS_KILL: + continue + else: + tmpval = "77777" + break + if not len(tmpval) == 5: + tmpval = "77777" + val = RadioSettingValueString(5, 5, tmpval) + val.set_charset(DTMF_CHARS_KILL) + rs = RadioSetting("dtmf_kill_code", + "Kill code (5 chars 0-9 ABCD)", val) + dtmf.append(rs) + + tmpval = str(_mem.dtmf_settings_numbers.revive_code).upper().strip( + "\x00\xff\x20") + for i in tmpval: + if i in DTMF_CHARS_KILL: + continue + else: + tmpval = "88888" + break + if not len(tmpval) == 5: + tmpval = "88888" + val = RadioSettingValueString(5, 5, tmpval) + val.set_charset(DTMF_CHARS_KILL) + rs = RadioSetting("dtmf_revive_code", + "Revive code (5 chars 0-9 ABCD)", val) + dtmf.append(rs) + + val = RadioSettingValueString(0, 80, + "All DTMF Contacts are 3 codes " + "(valid: 0-9 * # ABCD), " + "or an empty string") + val.set_mutable(False) + rs = RadioSetting("dtmf_descr1", "DTMF Contacts", val) + dtmfc.append(rs) + + for i in range(1, 17): + varname = "DTMF_"+str(i) + varnumname = "DTMFNUM_"+str(i) + vardescr = "DTMF Contact "+str(i)+" name" + varinumdescr = "DTMF Contact "+str(i)+" number" + + cntn = str(_mem.dtmfcontact[i-1].name).strip("\x20\x00\xff") + cntnum = str(_mem.dtmfcontact[i-1].number).strip("\x20\x00\xff") + + val = RadioSettingValueString(0, 8, cntn) + rs = RadioSetting(varname, vardescr, val) + dtmfc.append(rs) + + val = RadioSettingValueString(0, 3, cntnum) + val.set_charset(DTMF_CHARS) + rs = RadioSetting(varnumname, varinumdescr, val) + dtmfc.append(rs) + + # scanlists + if _mem.scanlist_default == 1: + tmpsc = 2 + else: + tmpsc = 1 + rs = RadioSetting("scanlist_default", + "Default scanlist", + RadioSettingValueInteger(1, 2, tmpsc)) + scanl.append(rs) + + tmppr = bool((_mem.scanlist1_priority_scan & 1) > 0) + rs = RadioSetting( + "scanlist1_priority_scan", + "Scanlist 1 priority channel scan", + RadioSettingValueBoolean(tmppr)) + scanl.append(rs) + + tmpch = _mem.scanlist1_priority_ch1 + 1 + if tmpch > 200: + tmpch = 0 + rs = RadioSetting("scanlist1_priority_ch1", + "Scanlist 1 priority channel 1 (0 - off)", + RadioSettingValueInteger(0, 200, tmpch)) + scanl.append(rs) + + tmpch = _mem.scanlist1_priority_ch2 + 1 + if tmpch > 200: + tmpch = 0 + rs = RadioSetting("scanlist1_priority_ch2", + "Scanlist 1 priority channel 2 (0 - off)", + RadioSettingValueInteger(0, 200, tmpch)) + scanl.append(rs) + + tmppr = bool((_mem.scanlist2_priority_scan & 1) > 0) + rs = RadioSetting( + "scanlist2_priority_scan", + "Scanlist 2 priority channel scan", + RadioSettingValueBoolean(tmppr)) + scanl.append(rs) + + tmpch = _mem.scanlist2_priority_ch1 + 1 + if tmpch > 200: + tmpch = 0 + rs = RadioSetting("scanlist2_priority_ch1", + "Scanlist 2 priority channel 1 (0 - off)", + RadioSettingValueInteger(0, 200, tmpch)) + scanl.append(rs) + + tmpch = _mem.scanlist2_priority_ch2 + 1 + if tmpch > 200: + tmpch = 0 + rs = RadioSetting("scanlist2_priority_ch2", + "Scanlist 2 priority channel 2 (0 - off)", + RadioSettingValueInteger(0, 200, tmpch)) + scanl.append(rs) + + # basic settings + + # call channel + tmpc = _mem.call_channel+1 + if tmpc > 200: + tmpc = 1 + rs = RadioSetting("call_channel", "One key call channel", + RadioSettingValueInteger(1, 200, tmpc)) + basic.append(rs) + + # squelch + tmpsq = _mem.squelch + if tmpsq > 9: + tmpsq = 2 + rs = RadioSetting("squelch", "Squelch", + RadioSettingValueInteger(0, 9, tmpsq)) + basic.append(rs) + + # TOT + tmptot = _mem.max_talk_time + if tmptot > 10: + tmptot = 10 + rs = RadioSetting( + "tot", + "TOT: Max talk time [min]", + RadioSettingValueInteger(0, 10, tmptot)) + basic.append(rs) + + # NOAA autoscan + rs = RadioSetting( + "noaa_autoscan", + "NOAA Autoscan", RadioSettingValueBoolean( + bool(_mem.noaa_autoscan > 0))) + basic.append(rs) + + # VOX switch + rs = RadioSetting( + "vox_switch", + "VOX enabled", RadioSettingValueBoolean( + bool(_mem.vox_switch > 0))) + basic.append(rs) + + # VOX Level + tmpvox = _mem.vox_level+1 + if tmpvox > 10: + tmpvox = 10 + rs = RadioSetting("vox_level", "VOX Level", + RadioSettingValueInteger(1, 10, tmpvox)) + basic.append(rs) + + # Mic gain + tmpmicgain = _mem.mic_gain + if tmpmicgain > 4: + tmpmicgain = 4 + rs = RadioSetting("mic_gain", "Mic Gain", + RadioSettingValueInteger(0, 4, tmpmicgain)) + basic.append(rs) + + # Channel display mode + tmpchdispmode = _mem.channel_display_mode + if tmpchdispmode >= len(CHANNELDISP_LIST): + tmpchdispmode = 0 + rs = RadioSetting( + "channel_display_mode", + "Channel display mode", + RadioSettingValueList( + CHANNELDISP_LIST, + CHANNELDISP_LIST[tmpchdispmode])) + basic.append(rs) + + # Crossband receiving/transmitting + tmpcross = _mem.crossband + if tmpcross >= len(CROSSBAND_LIST): + tmpcross = 0 + rs = RadioSetting( + "crossband", + "Cross-band receiving/transmitting", + RadioSettingValueList( + CROSSBAND_LIST, + CROSSBAND_LIST[tmpcross])) + basic.append(rs) + + # Battery save + tmpbatsave = _mem.battery_save + if tmpbatsave >= len(BATSAVE_LIST): + tmpbatsave = BATSAVE_LIST.index("1:4") + rs = RadioSetting( + "battery_save", + "Battery Save", + RadioSettingValueList( + BATSAVE_LIST, + BATSAVE_LIST[tmpbatsave])) + basic.append(rs) + + # Dual watch + tmpdual = _mem.dual_watch + if tmpdual >= len(DUALWATCH_LIST): + tmpdual = 0 + rs = RadioSetting("dualwatch", "Dual Watch", RadioSettingValueList( + DUALWATCH_LIST, DUALWATCH_LIST[tmpdual])) + basic.append(rs) + + # Backlight auto mode + tmpback = _mem.backlight_auto_mode + if tmpback >= len(BACKLIGHT_LIST): + tmpback = 6 + rs = RadioSetting("backlight_auto_mode", + "Backlight auto mode", + RadioSettingValueList( + BACKLIGHT_LIST, + BACKLIGHT_LIST[tmpback])) + basic.append(rs) + + # Tail tone elimination + rs = RadioSetting( + "tail_note_elimination", + "Tail tone elimination", + RadioSettingValueBoolean( + bool(_mem.tail_note_elimination > 0))) + basic.append(rs) + + # VFO open + rs = RadioSetting("vfo_open", "VFO open", + RadioSettingValueBoolean(bool(_mem.vfo_open > 0))) + basic.append(rs) + + # Beep control + rs = RadioSetting( + "beep_control", + "Beep control", + RadioSettingValueBoolean(bool(_mem.beep_control > 0))) + basic.append(rs) + + # Scan resume mode + tmpscanres = _mem.scan_resume_mode + if tmpscanres >= len(SCANRESUME_LIST): + tmpscanres = 0 + rs = RadioSetting( + "scan_resume_mode", + "Scan resume mode", + RadioSettingValueList( + SCANRESUME_LIST, + SCANRESUME_LIST[tmpscanres])) + basic.append(rs) + + # Keypad locked + rs = RadioSetting( + "key_lock", + "Keypad lock", + RadioSettingValueBoolean(bool(_mem.key_lock > 0))) + basic.append(rs) + + # Auto keypad lock + rs = RadioSetting( + "auto_keypad_lock", + "Auto keypad lock", + RadioSettingValueBoolean(bool(_mem.auto_keypad_lock > 0))) + basic.append(rs) + + # Power on display mode + tmpdispmode = _mem.power_on_dispmode + if tmpdispmode >= len(WELCOME_LIST): + tmpdispmode = 0 + rs = RadioSetting( + "welcome_mode", + "Power on display mode", + RadioSettingValueList( + WELCOME_LIST, + WELCOME_LIST[tmpdispmode])) + basic.append(rs) + + # Keypad Tone + tmpkeypadtone = _mem.keypad_tone + if tmpkeypadtone >= len(KEYPADTONE_LIST): + tmpkeypadtone = 0 + rs = RadioSetting("keypad_tone", "Keypad tone", RadioSettingValueList( + KEYPADTONE_LIST, KEYPADTONE_LIST[tmpkeypadtone])) + basic.append(rs) + + # Language + tmplanguage = _mem.language + if tmplanguage >= len(LANGUAGE_LIST): + tmplanguage = 0 + rs = RadioSetting("language", "Language", RadioSettingValueList( + LANGUAGE_LIST, LANGUAGE_LIST[tmplanguage])) + basic.append(rs) + + # Alarm mode + tmpalarmmode = _mem.alarm_mode + if tmpalarmmode >= len(ALARMMODE_LIST): + tmpalarmmode = 0 + rs = RadioSetting("alarm_mode", "Alarm mode", RadioSettingValueList( + ALARMMODE_LIST, ALARMMODE_LIST[tmpalarmmode])) + basic.append(rs) + + # Reminding of end of talk + # tmpalarmmode = _mem.reminding_of_end_talk + # if tmpalarmmode >= len(REMENDOFTALK_LIST): + # tmpalarmmode = 0 + # rs = RadioSetting( + # "reminding_of_end_talk", + # "Reminding of end of talk", + # RadioSettingValueList( + # REMENDOFTALK_LIST, + # REMENDOFTALK_LIST[tmpalarmmode])) + # basic.append(rs) + + # Repeater tail tone elimination + tmprte = _mem.repeater_tail_elimination + if tmprte >= len(RTE_LIST): + tmprte = 0 + rs = RadioSetting( + "repeater_tail_elimination", + "Repeater tail tone elimination", + RadioSettingValueList(RTE_LIST, RTE_LIST[tmprte])) + basic.append(rs) + + # Logo string 1 + logo1 = str(_mem.logo_line1).strip("\x20\x00\xff") + "\x00" + logo1 = _getstring(logo1.encode('ascii', errors='ignore'), 0, 12) + rs = RadioSetting("logo1", "Logo string 1 (12 characters)", + RadioSettingValueString(0, 12, logo1)) + basic.append(rs) + + # Logo string 2 + logo2 = str(_mem.logo_line2).strip("\x20\x00\xff") + "\x00" + logo2 = _getstring(logo2.encode('ascii', errors='ignore'), 0, 12) + rs = RadioSetting("logo2", "Logo string 2 (12 characters)", + RadioSettingValueString(0, 12, logo2)) + basic.append(rs) + + # FM radio + for i in range(1, 21): + freqname = "FM_"+str(i) + fmfreq = _mem.fmfreq[i-1]/10.0 + if fmfreq < FMMIN or fmfreq > FMMAX: + rs = RadioSetting(freqname, freqname, + RadioSettingValueString(0, 5, "")) + else: + rs = RadioSetting(freqname, freqname, + RadioSettingValueString(0, 5, str(fmfreq))) + + fmradio.append(rs) + + # unlock settings + + # F-LOCK + tmpflock = _mem.int_flock + if tmpflock >= len(FLOCK_LIST): + tmpflock = 0 + rs = RadioSetting( + "flock", "F-LOCK", + RadioSettingValueList(FLOCK_LIST, FLOCK_LIST[tmpflock])) + unlock.append(rs) + + # 350TX + rs = RadioSetting("350tx", "350TX - unlock 350-400MHz TX", + RadioSettingValueBoolean( + bool(_mem.int_350tx > 0))) + unlock.append(rs) + + # 200TX + rs = RadioSetting("200tx", "200TX - unlock 174-350MHz TX", + RadioSettingValueBoolean( + bool(_mem.int_200tx > 0))) + unlock.append(rs) + + # 500TX + rs = RadioSetting("500tx", "500TX - unlock 470-600MHz TX", + RadioSettingValueBoolean( + bool(_mem.int_500tx > 0))) + unlock.append(rs) + + # ALLTX + + tmpalltx = _mem.int_alltx + if tmpalltx >= len(FLOCK_LIST): + tmpalltx = 0 + rs = RadioSetting( + "alltx", "ALL_TX", + RadioSettingValueList(ALL_TX, ALL_TX[tmpalltx])) + unlock.append(rs) + + # SCREEN + rs = RadioSetting("scren", "SCREN - scrambler enable", + RadioSettingValueBoolean( + bool(_mem.int_scren > 0))) + unlock.append(rs) + + # readonly info + # Firmware + if self.FIRMWARE_VERSION == "": + firmware = "To get the firmware version please download" + "the image from the radio first" + else: + firmware = self.FIRMWARE_VERSION + + val = RadioSettingValueString(0, 128, firmware) + val.set_mutable(False) + rs = RadioSetting("fw_ver", "Firmware Version", val) + roinfo.append(rs) + + # TODO: remove showing the driver version when it's in mainline chirp + # Driver version + val = RadioSettingValueString(0, 128, DRIVER_VERSION) + val.set_mutable(False) + rs = RadioSetting("driver_ver", "Driver version", val) + roinfo.append(rs) + + # No limits version for hacked firmware + val = RadioSettingValueBoolean(self.FIRMWARE_NOLIMITS) + val.set_mutable(False) + rs = RadioSetting("nolimits", "Limits disabled for modified firmware", + val) + roinfo.append(rs) + + return top + + # Store details about a high-level memory to the memory map + # This is called when a user edits a memory in the UI + def set_memory(self, mem): + number = mem.number-1 + + # Get a low-level memory object mapped to the image + _mem = self._memobj.channel[number] + _mem4 = self._memobj + # empty memory + if mem.empty: + _mem.set_raw("\xFF" * 16) + if number < 200: + _mem2 = self._memobj.channelname[number] + _mem2.set_raw("\xFF" * 16) + _mem4.channel_attributes[number].is_scanlist1 = 0 + _mem4.channel_attributes[number].is_scanlist2 = 0 + _mem4.channel_attributes[number].unknown1 = 0 + _mem4.channel_attributes[number].unknown2 = 0 + _mem4.channel_attributes[number].is_free = 1 + _mem4.channel_attributes[number].band = 0x7 + return mem + + # clean the channel memory, restore some bits if it was used before + if _mem.get_raw()[0] == "\xff": + # this was an empty memory + _mem.set_raw("\x00" * 16) + else: + # this memory was't empty, save some bits that we don't know the + # meaning of, or that we don't support yet + prev_0a = _mem.get_raw(asbytes=True)[0x0a] & SAVE_MASK_0A + prev_0b = _mem.get_raw(asbytes=True)[0x0b] & SAVE_MASK_0B + prev_0c = _mem.get_raw(asbytes=True)[0x0c] & SAVE_MASK_0C + prev_0d = _mem.get_raw(asbytes=True)[0x0d] & SAVE_MASK_0D + prev_0e = _mem.get_raw(asbytes=True)[0x0e] & SAVE_MASK_0E + prev_0f = _mem.get_raw(asbytes=True)[0x0f] & SAVE_MASK_0F + _mem.set_raw("\x00" * 10 + + chr(prev_0a) + chr(prev_0b) + chr(prev_0c) + + chr(prev_0d) + chr(prev_0e) + chr(prev_0f)) + + if number < 200: + _mem4.channel_attributes[number].is_scanlist1 = 0 + _mem4.channel_attributes[number].is_scanlist2 = 0 + _mem4.channel_attributes[number].unknown1 = 0 + _mem4.channel_attributes[number].unknown2 = 0 + _mem4.channel_attributes[number].is_free = 1 + _mem4.channel_attributes[number].band = 0x7 + + # find band + band = _find_band(self, mem.freq) + + # mode + if mem.mode == "NFM": + _mem.bandwidth = 1 + _mem.enable_am = 0 + _mem.enable_usb = 0 + elif mem.mode == "FM": + _mem.bandwidth = 0 + _mem.enable_am = 0 + _mem.enable_usb = 0 + elif mem.mode == "NAM": + _mem.bandwidth = 1 + _mem.enable_am = 1 + _mem.enable_usb = 0 + elif mem.mode == "AM": + _mem.bandwidth = 0 + _mem.enable_am = 1 + _mem.enable_usb = 0 + elif mem.mode == "USB": + _mem.enable_usb = 1 + _mem.bandwidth = 1 + _mem.enable_am = 0 + + _mem.flags1_unknown7 = 0 + _mem.flags1_unknown6 = 0 + _mem.flags1_unknown3 = 0 + _mem.flags2_unknown7 = 0 + _mem.flags2_unknown6 = 0 + _mem.flags2_unknown5 = 0 + _mem.dtmf_flags_unknown7 = 0 + _mem.dtmf_flags_unknown6 = 0 + _mem.dtmf_flags_unknown5 = 0 + _mem.dtmf_flags_unknown4 = 0 + _mem.dtmf_flags_unknown3 = 0 + + # frequency/offset + _mem.freq = mem.freq/10 + _mem.offset = mem.offset/10 + + if mem.duplex == "off" or mem.duplex == "": + _mem.offset = 0 + _mem.shift = 0 + elif mem.duplex == '-': + _mem.shift = FLAGS1_OFFSET_MINUS + elif mem.duplex == '+': + _mem.shift = FLAGS1_OFFSET_PLUS + + # set band + if number < 200: + _mem4.channel_attributes[number].is_free = 0 + _mem4.channel_attributes[number].band = band + + # channels >200 are the 14 VFO chanells and don't have names + if number < 200: + _mem2 = self._memobj.channelname[number] + tag = mem.name.ljust(10) + "\x00"*6 + _mem2.name = tag # Store the alpha tag + + # tone data + self._set_tone(mem, _mem) + + # step + _mem.step = STEPS.index(mem.tuning_step) + + # tx power + if str(mem.power) == str(UVK5_POWER_LEVELS[2]): + _mem.txpower = POWER_HIGH + elif str(mem.power) == str(UVK5_POWER_LEVELS[1]): + _mem.txpower = POWER_MEDIUM + else: + _mem.txpower = POWER_LOW + + for setting in mem.extra: + sname = setting.get_name() + svalue = setting.value.get_value() + + if sname == "bclo": + _mem.bclo = svalue and 1 or 0 + + if sname == "pttid": + _mem.dtmf_pttid = PTTID_LIST.index(svalue) + + if sname == "frev": + _mem.freq_reverse = svalue and 1 or 0 + + if sname == "dtmfdecode": + _mem.dtmf_decode = svalue and 1 or 0 + + if sname == "scrambler": + _mem.scrambler = ( + _mem.scrambler & 0xf0) | SCRAMBLER_LIST.index(svalue) + + if number < 200 and sname == "scanlists": + if svalue == "1": + _mem4.channel_attributes[number].is_scanlist1 = 1 + _mem4.channel_attributes[number].is_scanlist2 = 0 + elif svalue == "2": + _mem4.channel_attributes[number].is_scanlist1 = 0 + _mem4.channel_attributes[number].is_scanlist2 = 1 + elif svalue == "1+2": + _mem4.channel_attributes[number].is_scanlist1 = 1 + _mem4.channel_attributes[number].is_scanlist2 = 1 + else: + _mem4.channel_attributes[number].is_scanlist1 = 0 + _mem4.channel_attributes[number].is_scanlist2 = 0 + + return mem + + +@directory.register +class UVK5Radio_nolimit(UVK5Radio): + VENDOR = "Quansheng" + MODEL = "UV-K5 Matoz" + VARIANT = "V0.34.0C" + FIRMWARE_NOLIMITS = True + + def get_features(self): + rf = UVK5Radio.get_features(self) + # This is what the BK4819 chip supports + rf.valid_bands = [(0000000, 620000000), + (840000000, 1500000000) + ] + return rf diff --git a/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/Matoz Firmware CHIRP MODULE V0.33.0C.py b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/Matoz Firmware CHIRP MODULE V0.33.0C.py index 635ad9c..1ea7eb2 100644 --- a/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/Matoz Firmware CHIRP MODULE V0.33.0C.py +++ b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/Matoz Firmware CHIRP MODULE V0.33.0C.py @@ -64,7 +64,7 @@ struct { //u8 flags1; u8 flags1_unknown7:1, flags1_unknown6:1, - flags1_unknown5:1, + enable_usb:1, enable_am:1, flags1_unknown3:1, is_in_scanlist:1, @@ -909,6 +909,8 @@ class UVK5Radio(chirp_common.CloneModeRadio): mem.mode = "NAM" else: mem.mode = "AM" + elif _mem.enable_usb == 1: + mem.mode = "USB" else: if _mem.bandwidth > 0: mem.mode = "NFM" @@ -916,7 +918,7 @@ class UVK5Radio(chirp_common.CloneModeRadio): mem.mode = "FM" # tuning step - tstep = _mem.step & 0xFF + tstep = _mem.step & 0x7 if tstep < len(STEPS): mem.tuning_step = STEPS[tstep] else: @@ -1936,21 +1938,35 @@ class UVK5Radio(chirp_common.CloneModeRadio): if mem.mode == "NFM": _mem.bandwidth = 1 _mem.enable_am = 0 + _mem.enable_usb = 0 elif mem.mode == "FM": _mem.bandwidth = 0 _mem.enable_am = 0 + _mem.enable_usb = 0 elif mem.mode == "NAM": _mem.bandwidth = 1 _mem.enable_am = 1 + _mem.enable_usb = 0 elif mem.mode == "AM": _mem.bandwidth = 0 _mem.enable_am = 1 - elif mem.mode == "NSSB": + _mem.enable_usb = 0 + elif mem.mode == "USB": + _mem.enable_usb = 1 _mem.bandwidth = 1 - _mem.enable_am = 1 - elif mem.mode == "SSB": - _mem.bandwidth = 0 - _mem.enable_am = 1 + _mem.enable_am = 0 + + _mem.flags1_unknown7 = 0 + _mem.flags1_unknown6 = 0 + _mem.flags1_unknown3 = 0 + _mem.flags2_unknown7 = 0 + _mem.flags2_unknown6 = 0 + _mem.flags2_unknown5 = 0 + _mem.dtmf_flags_unknown7 = 0 + _mem.dtmf_flags_unknown6 = 0 + _mem.dtmf_flags_unknown5 = 0 + _mem.dtmf_flags_unknown4 = 0 + _mem.dtmf_flags_unknown3 = 0 # frequency/offset _mem.freq = mem.freq/10 diff --git a/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/README_MCFW_V0.34.0C.md.txt b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/README_MCFW_V0.34.0C.md.txt new file mode 100644 index 0000000..f59e0e3 --- /dev/null +++ b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by Matoz ( spm81 )/README_MCFW_V0.34.0C.md.txt @@ -0,0 +1,228 @@ +MCFW V0.34.0C + +[Português] + Novidades: + + * Resolvido o Squelch no MENU + * Resolvido o começo do ScanList + * Resolvido coisas menores + + * Adicionado ao MENU BatSave 1:5, 1:6, 1:7, 1:8, 1:9 (Maior economia de bateria no rádio) + * Adicionada Encriptação ao Messenger + * Adicionado o MENU MsgEnc ao Messenger + * Adicionado o MENU MsgAck ao Messenger + * Adicionado o MENU MsgRBN(Roger Beep Notification) ao Messenger + * Adicionado o MENU MsgMod (AFSK 1.2K / FSK 700 / FSK 450) ao Messenger + * Adicionado ao MENU SList o LIST1+2(Faz somente a busca aos canais +memorizados da lista 1 e da lista 2). + * Adicionado o MENU LCD Inv(LCD Inverter), inverte as cores ao rádio + * Adicionado o MENU SATCOM ( Nota: Fazer busca com OFF e ON, pois algumas +frequências funcionam melhor em OFF e outras em ON. + Ao selecionar ON ou OFF terás que mudar de frequência/memoria para fazer efeito.) + * Adicionado o MENU PTTHOLD, ao pressionar 1x o botão PTT ele ficará ativo +até carregar outra vez no botão PTT ou seja carrega 1x para ativar e outra para desligar. + * Adicionado o MENU M CALL, ao ativar o M CAL quando recebe uma chamada ou o RX é +ativado (Somente quando entra em SAVE MODE), o LED ficará a piscar e fica um icon de +chamada não atendida no LCD. + * Adicionado mais Rogers Beeps entre outras coisas menores + + * FM RADIO só tem VFO, ou seja busca manual + + * MENU Secreto para alterar permissões relativamente ao TX - POWER+FN1 + * MENU Secreto MCFW para apagar Passwords de LOCK e do Messenger - POWER+M + + + + + + + + +[English] + News: + + * Squelch in MENU resolved + * Resolved ScanList start + * Resolved minor things + + * Added to MENU BatSave 1:5, 1:6, 1:7, 1:8, 1:9 (Greater battery saving on radio) + * Added Encryption to Messenger + * Added MsgEnc MENU to Messenger + * Added MsgAck MENU to Messenger + * Added MENU MsgRBN(Roger Beep Notification) to Messenger + * Added MENU MsgMod (AFSK 1.2K / FSK 700 / FSK 450) to Messenger + * Added LIST1+2 to MENU SList (only searches for channels +memorized from list 1 and list 2). + * Added MENU LCD Inv (LCD Inverter), inverts the colors to the radio + * Added the SATCOM MENU (Note: Search with OFF and ON, as some +frequencies work best in OFF and others in ON. + When selecting ON or OFF you will have to change frequency/memory for it to take effect.) + * Added the PTTHOLD MENU, when you press the PTT button once it will become active +until you press the PTT button again, that is, press it once to activate and once to turn off. + * Added MENU M CALL, when activating M CAL when receiving a call or RX is +activated (Only when it enters SAVE MODE), the LED will blink and there will be a +missed call on the LCD. + * Added more Rogers Beeps among other minor things + + * FM RADIO only has VFO, i.e. manual search + + * Secret MENU to change permissions regarding TX - POWER+FN1 + * MCFW Secret MENU to delete LOCK and Messenger Passwords - POWER+M + + + + + + + + +[Français] + Nouvelles: + + * Squelch dans MENU résolu + * Démarrage de ScanList résolu + * Problèmes mineurs résolus + + * Ajouté au MENU BatSave 1:5, 1:6, 1:7, 1:8, 1:9 (Meilleure économie de batterie à la radio) + * Ajout du cryptage à Messenger + * Ajout du menu MsgEnc à Messenger + * Ajout du menu MsgAck à Messenger + * Ajout du MENU MsgRBN (Notification Roger Beep) à Messenger + * Ajout du MENU MsgMod (AFSK 1.2K / FSK 700 / FSK 450) à Messenger + * Ajout de LIST1+2 au MENU SList (recherche uniquement les chaînes +mémorisé dans la liste 1 et la liste 2). + * Ajout du MENU LCD Inv (LCD Inverter), inverse les couleurs de la radio + * Ajout du MENU SATCOM (Remarque : recherchez avec OFF et ON, comme certains +les fréquences fonctionnent mieux en OFF et les autres en ON. + Lors de la sélection de ON ou OFF, vous devrez changer de fréquence/mémoire pour que cela prenne effet.) + * Ajout du MENU PTTHOLD, lorsque vous appuyez une fois sur le bouton PTT, il deviendra actif +jusqu'à ce que vous appuyiez à nouveau sur le bouton PTT, c'est-à-dire appuyez dessus une fois pour l'activer et une fois pour l'éteindre. + * Ajout du MENU M CALL, lors de l'activation de M CAL lors de la réception d'un appel ou RX est +activé (uniquement lorsqu'il entre en mode SAVE), la LED clignote et il y aura un +appel manqué sur l'écran LCD. + * Ajout de plus de bips Rogers, entre autres choses mineures + + * FM RADIO n'a que VFO, c'est-à-dire recherche manuelle + + * MENU secret pour modifier les autorisations concernant TX - POWER+FN1 + * MENU secret MCFW pour supprimer les mots de passe LOCK et Messenger - POWER+M + + + + + + + + +[Castellano] + Noticias: + + * Silenciamiento en MENÚ resuelto. + * Inicio de ScanList resuelto. + * Cosas menores resueltas. + + * Agregado al MENÚ BatSave 1:5, 1:6, 1:7, 1:8, 1:9 (Mayor ahorro de batería en radio) + * Cifrado agregado a Messenger. + * Se agregó el MENÚ MsgEnc a Messenger. + * Se agregó el MENÚ MsgAck a Messenger. + * Se agregó MENÚ MsgRBN (notificación de pitido de Roger) a Messenger + * Se agregó MENÚ MsgMod (AFSK 1.2K / FSK 700 / FSK 450) a Messenger + * Se agregó LIST1+2 a MENU SList (solo busca canales +memorizados de la lista 1 y la lista 2). + * Agregado MENU LCD Inv (LCD Inverter), invierte los colores a la radio + * Se agregó el MENÚ SATCOM (Nota: Buscar con OFF y ON, como algunos +Las frecuencias funcionan mejor en OFF y otras en ON. + Al seleccionar ON u OFF tendrá que cambiar la frecuencia/memoria para que surta efecto.) + * Se agregó el MENÚ PTTHOLD, cuando presiona el botón PTT una vez, se activará +hasta que presiones nuevamente el botón PTT, es decir, presiónalo una vez para activar y otra para apagar. + * Se agregó MENU M CALL, al activar M CAL al recibir una llamada o RX es +activado (Sólo cuando entra en MODO GUARDAR), el LED parpadeará y habrá un +llamada perdida en la pantalla LCD. + * Se agregaron más Rogers Beeps entre otras cosas menores. + + * RADIO FM solo tiene VFO, es decir búsqueda manual + + * MENÚ secreto para cambiar permisos relacionados con TX - POWER+FN1 + * MENÚ secreto de MCFW para eliminar contraseñas de BLOQUEO y Messenger - POWER+M + + + + + + + + + +[Italiano] + Notizia: + + * Risolto il problema dello squelch nel MENU + * Risolto l'avvio della ScanList + * Risolte cose minori + + * Aggiunto al MENU BatSave 1:5, 1:6, 1:7, 1:8, 1:9 (Maggiore risparmio batteria in radio) + * Aggiunta la crittografia a Messenger + * Aggiunto MsgEnc MENU a Messenger + * Aggiunto il MENU MsgAck a Messenger + * Aggiunto MENU MsgRBN (Roger Beep Notification) a Messenger + * Aggiunto MENU MsgMod (AFSK 1.2K / FSK 700 / FSK 450) a Messenger + * Aggiunto LIST1+2 a MENU SList (cerca solo i canali +memorizzato dalla lista 1 e dalla lista 2). + * Aggiunto MENU LCD Inv (Invertitore LCD), inverte i colori alla radio + * Aggiunto il MENU SATCOM (Nota: ricerca con OFF e ON, come alcuni +le frequenze funzionano meglio in OFF e altre in ON. + Quando si seleziona ON o OFF sarà necessario modificare la frequenza/memoria affinché abbia effetto.) + * Aggiunto il MENU PTThold, quando si preme il pulsante PTT una volta diventerà attivo +fino a quando non si preme nuovamente il pulsante PTT, ovvero premerlo una volta per attivare e una volta per spegnere. + * Aggiunto MENU M CALL, quando si attiva M CAL quando si riceve una chiamata o RX è +attivato (Solo quando si entra in MODALITÀ SALVATAGGIO), il LED lampeggerà e ci sarà un +chiamata persa sul display LCD. + * Aggiunti altri Rogers Beep tra le altre cose minori + + * La RADIO FM ha solo VFO, ovvero la ricerca manuale + + * MENU segreto per modificare le autorizzazioni relative a TX - POWER+FN1 + * MENU segreto MCFW per eliminare le password di BLOCCO e Messenger - POWER+M + + + + + + + + + + + +[Русский] + Новости: + + * Шумоподавление в МЕНЮ устранено. + * Решенный запуск ScanList + * Решены мелкие проблемы + + * В МЕНЮ добавлено BatSave 1:5, 1:6, 1:7, 1:8, 1:9 (Большая экономия заряда батареи при использовании радио) + * Добавлено шифрование в Messenger. + * В Messenger добавлено МЕНЮ MsgEnc. + * В Messenger добавлено МЕНЮ MsgAck. + * В Messenger добавлено МЕНЮ MsgRBN (звуковой сигнал Роджера). + * Добавлено МЕНЮ MsgMod (AFSK 1.2K / FSK 700 / FSK 450) в Messenger. + * Добавлен LIST1+2 в MENU SList (поиск только каналов +запомнил по списку 1 и списку 2). + * Добавлено МЕНЮ LCD Inv (Инвертор ЖКД), инвертирует цвета радио + * Добавлено МЕНЮ SATCOM (Примечание: поиск с помощью ВЫКЛ и ВКЛ, как некоторые +частоты лучше всего работают в выключенном состоянии, а другие — в включенном. + При выборе ВКЛ или ВЫКЛ вам придется изменить частоту/память, чтобы это вступило в силу.) + * Добавлено МЕНЮ PTTHOLD, при нажатии кнопки PTT оно становится активным. +пока вы не нажмете кнопку PTT еще раз, то есть нажмите ее один раз для активации и один раз для выключения. + * Добавлено МЕНЮ M CALL, при активации M CAL при поступлении звонка или при приеме вызова. +активирован (только при входе в РЕЖИМ СОХРАНЕНИЯ), светодиод будет мигать и появится +пропущенный вызов на ЖК-дисплее. + * Среди прочих мелочей добавлено больше звуков Роджерса. + + * FM-РАДИО имеет только VFO, т.е. ручной поиск. + + * Секретное МЕНЮ для изменения разрешений относительно передачи — POWER+FN1. + * Секретное меню MCFW для удаления паролей LOCK и Messenger — POWER+M + + diff --git a/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by phdlee ( CEC )/Não confirmado 624603.crdownload b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by phdlee ( CEC )/Não confirmado 624603.crdownload new file mode 100644 index 0000000000000000000000000000000000000000..177dcf2a20eac00560e32be3677b4d3c42ddb4e1 GIT binary patch literal 15501 zcmZ{LV{j%+&~0qnwr$(o*wz!<#>Td@v27s0lh>6)&Z z>7ybK4uJsz0s;fl0`H|=I(Xl8!2e$u1pW zTIDUvwm5InC8ex+du{!Z-8|mo$XPR_w%HW0rFL#!|6`+1ZNJH3SFYm;-1@tn#rpz@ zrnIz0{PFaGMR7bkoyBf7o6GAu+lfsw7T+Hu8_SB{W8@pxD2*F?}|ZS?8*^AprKyE8=nm)<&4iJ5xdm(k6L(z6H*xYH|s0n97g z!onQG zvr+)@5o~$h`oPh{2#EQ%Wp?b3JA$aHk2=EoyXgsHi#}Bw#fOTxZ@k40!{*r$HT#O& zJsf8}4y|@=3BWaC7R0(YYvp6OD5S$L5CWB`KwOX0e2yJ-5cAm8j0;@crPug0gX-^$ zF5rCKru$Ze>JNW~=KOXJ-O(Ktwz&1z_}pQA{RZx}J5&GeO8F;S7l}@INM+nPI?snw zFmveo+h8nGzY~3b_&EK7z!XMe3lqBG;zq1&2{k0?)O{-cG=aO{FmHB8e{6!ql9FJf ztu09HTFjTwdQmb=bee?lTa7zgI+q_jY=1YMG2lY~#pbVJvtjA~wQH&+WTKao>6*tJ=yp_|c7ZBM{$ zf2fFCImRckQ!kozPEyE^g!a;O3x*%=g2RZ)5V= znM}ME<#Dw(q#aw_U%P7DII3p6Z9G9j#~{Y91~Zuz0w|*IM}#3Btv0E;+hH+6E0Ku&*K#TBub9F++IhuZV1hOd z+wSZu$NForcvP5<8PS+yag(p+NWrcGun@&F8a%ku2N`-#_PSIC=9)Ct;>8*TwoB}3 z7ubs@l|gNd7ljQjMT6ulC<M+`S16` z#4@R&zLtS`mESuF-vv}LH;!00h#!PJ1EP?igIryG`Uo1Ev?EhRMutZYk{p^`A1~lF z!XrGPpWtL z&qCz6MGBIR+mr5XALi8?EOOi~!o$jw$9Vk9s$IYuxPX-nGg8N}u)#^jZ_QA7e7s3xYt(v{BzdKC2M}cW-~;J5L#9x7qt7r|p1Q%%@n`eY}lP1ra;sUQ_9Dw$1u-m=AXf z;=B%2brhPD`lQp8&=2Q2^I3>X&a$8t%9UE-#2>ytA~~|PjRxozA05a9c(wzVoMdhC zT-{^GjlPE}=q?StHYkyh5_fArg$qWx`C`QE`?Vt21OV4=V}p=C1o%8I z9Mv>tVuQKyntrU6@EMEGfX2KZ@z?Vx+kbP;S$N-`z)`#>@8BxRa}A`1wWcA#Q}=(I z?4L?KGD^@42{g=!ZY;pCe-GVysz&)!pn z4o44;W|T|3BPctM7bmgjPU|AzXM3_iDPu@5)kC}-8XAc~S=`eyP+=UK8sUdf`!Wi%vGiE8#=8G41kNWdFU&IGZuPq8O4@^4FH zCfOj;8&55%)rFtc#nC|9qGAWgN?;d6 zIh|*r@P4C;_#Pq_-5L;3lspD@eP&46P}x4H`?L1A-W6xRpg6eko!=PLU3L1(k!Y_u z(T48?sg?bYoWH2zD{}=V4-bx8kET|q`mxcFwP6onV0@r6<~*-l^{?tzt45`*UTIaW z?n+DDlycXn#{ceWw>PbG7l^x-04~dyg4!E*o8?Bn>#UtY(a@zdWgEIY34Mo>^CESg z5|cT5wLYyp-X!95{Na!CJefD3^mC50L1uj;REnPffvq zYN8)GL3)1J=*igiO0cSZSQw+$jWtiX~C^mVGV;2j8uI4+aM#jmu4+ zk>d-JdT&h0qSqI?LFM5`#BbQ)U3H8C!?RabNt-2mArFG7PpS2m;ugJ-MWq~rdIbD9 zaW|HNRpevCNHS=T$9B3V=0%XuxIZ5wy-U3w#M-UH^!#0x7;gaMmvx(yN7{OJ6>0B( z7i#)KqeRwOAJ3elN6q%d-ci`KWrGvsH9jRUPbt1cmH9v>6j-hk#8`7nFHH$UNJD!UdPu_YyIiGS< ztd24J8a?05V?mW(?cbsMs+)4~+J_P7#d?*{+V#urk_BNbHcoGCTeZue)k>A{%U41# z|Lp1^iI;0PULR*7?C|{&d#U}lS2gPq@=ggMx_vi9oC&#QY@X(F-`mr`1OBgiM`zL`sHGKi_ zhkT)5=Wh5twPo{i!}8?DVc<@mhoMp!5|XfpVfoxoWA_6sD{W6@E9wN*^=L!49xmkQ zFr9UlhbLj9t+i5Is!@}#Ls{vi3NV~GZbCA`4U52#t24h<$?(5FIf&YF3sMBuz zdR^o-VlWtbdG}lFoavBzF|im5fZ@KBJ?P~fUZm5j2U-ft!v3Z9#~bAeQX7wH@pMuj zkC>T%Ip#E&H15j>OtY5*S+Eo$XHlB{D8iE~Qbq=EW-0@CQ6&riW zZ(7AYoWt!wGl22z)w87{#q*Xi{JZfzQR=m*RQ;x*5Kf8(CeecTuH&>$(XNo^yCWxX z%l!2wYPX%K?;^u3t3N&!MT&1C%7@g&^e89L{PhSGrnyS`!J?xs0<8SI?opovN@nl& z8O#m6>!`Y+c)6>D=GfF2k;;4Ai(J)nIp{GvKNkk>$3cv3b4~5fd)s__jR(%k{HnV> z?(mNaAkV8F{*Ly=?m|x7sbW$sZ}X8Xf}1%h!OLDMcEw2!2lFHRZ?-fTgJCf4an*Yehto!Sg!5lmpTy#@sDQRv#*Y zDW{+>AbUt{^-(yPV)3+$D|Fmm37mY!8t(qtdd;1w12%o@b-OoaKlbUj#L%BW_8_G^ zUy&9G37QAy;2l!hyhdYKpaFX4udOXXY-$zbuV0e<9}k5dfsOiL+k`X}>DZ`O6pxw` zcMhH7oT(b-Zt6O?3m`?95}{OGs}jJhQy=s#W3HB@c}fZHET8u5CjYQ}akrQW#4J1? z1-E9}dAr7U0k+d;<2SJ44HyF{4%^}{Dm?auhTlk;GprG=gui32J=>ta}RLe2$Na71S)DA!wf z7U|Fi3$r7BC&L|^)Cy`Aoox%bK6uaXi>VBi%cjBSv~6R}PCX8XC6C2a-xA3>t%mk6xBl|8=qIlbiuMKjE^4jz?Z_v)=~jF=BnuxBs-_4){U51DF+7I3~*aZ3j1 z(Y5exd`48Fd0V^IODBIC;it{UAj-#LXb*eG$05I}!=O{Hw^*mgR;3ft{<)CMI?)1B z8v2^r@(;{M!fCt(XOAK1RTEmloCk5BJt_EU9DXSlQ7eYVjgmYoXUt5)@=C^83A z_G(SN3F6(V^(vr2yLr%bCPJg+k6!bix8uBjG+%wAbTya^_4lZPn%*NVaAyNDtr{a2 zi#0=-)bqc5B1IvH#Y^pK<<3+W)XNs*q{7_vo|3D$Vho?^Db2tDEeb(#eneeb6yTHY zpTTH?H~}Ye4h>Y?DkF>p7w0}Yy=FEb7HI+&E zQRW3&e=i<(#|B(fMjco&ykdeQ2VnOarIjYu%5jz0p!r&Br2n(E&pv;(|4U-uilA0N zssF*S_phB!|7FdqgQ(@sNznFS&u7Rof_@c_$;8}UH%_XJ&k=7+i@f(qXV^VvR5S|u z2hF!*whDdyJh{>p{^&@gSK|cBF1rx!rY>N);zhvx%-dSypO;!rg%ObI9G_88%7*7s z!yViET(Hch2yY8f$5kr9-GdDE6ZgGgr3z#H{Hsi@%GLF0`LdD9vg+2`b=jApWP7;W z@*=vjbKMpiZ7|T1{z|0n9lMP17qyZ7nB|3-J8e_u1Q_$nz*k)lZ570PHU1-cmC`}Qu?Svxm z(9+hW+tx+e)+N%`r5$)^Xq3`jLgi_tc#X)}`5)n_<*F6N(X{+@%tN6W;kNHC&L=AV z393F5RATG)n7C~Q3po<%X(9vED*;_Uhh2jE1OEHmnq-@b5wBt>WSt1f<2GMo!_eF_ zm59aZiK!X!54e9rYg0=jkk7ti$ak7+F+G5UXia?!_OS9L2QhJ4+nqY9UDPg!&Tkq3 zQo_Qby9K`A*}_CpBxKnp5-wfUEh6AQCTPlvdsk;0lT;cow;ag<;H_ey+UAQ9dMYm) z6`yW0kR*GRBml2(O(K<}v?Ql!dsmUKTD84W$>X!q;D3*Ik7DK{r1z-dS$QO+|MAFI-E=J&8rL20PB}4g&g_pBL6#w(E6q{d6=dZ>=`Z( zmHA)ojl4|)8E6kJY3#d4^~;K^r-dohi*OOMP~qKn6^5@JW!Mz}uFaa9R@_K{9fZkC2sb?a z(`8AE&ABLF1M_bC`MMRMYSpda(yD*@V{<}z!7S$4iIhCbrZsE`{*R()&|>gkk>(Yj z!^*j=RdT{l@c_Na#bEqe6JblF>p#35Sl7Q4uYNwlt<@ud{b;d@Fs_n&N;%HYH; zT~8Nwdt)6SwI9j&S!zqMD3--7$$y=sd`hL15>_?q*qsE8x{ZKyYaYRvS5m4U1>cA-0r);OOGlQt31uoAx%CQ%dRMT}m3MOD^cbXiswWr5Rf*YFNC~yI>{;%_ zu-wm26hc`?Vg;em?7;k2p%P1lOt^yFoHAr+cNU>47j70*2&V!L5-o;^_tE=&N5cvl z6kcJc!V2c8{c?o%`cID0iIk1sB??Hot8?QS{;T0Fbj~KhJ1$!(WvAhg2oq#7UqUnC zZA4?wrccsBabl@5;YZY-`P!;N8ru|_M^*EPSAsZv*I#A;y@^x(i8XVU&!WiNefTfw z0B;=T^ZFw8qHeD@Vze>6^6oX_cO1ikZ@#VX`7zG;o!!r*h4}hM*yb5!JgD>x}gys-Ay9S<;uU8C~SJl?4(MRUbvCL8u9@FOAr_K$?`R0?8WT-?MwOAm{WH#UO}5YxrhMhmJ<=mdHte{F;O%-+2VMoKTePLLFavds@eeufeJ5I~Q-Exh=( zjX}Dv3B#)%AM6Yom_FiqN9=&c5AsjFdbR)u@cSPSs1kDr+~++zEv|IS@2+&SLeGp? zkyan_CobE%d~+jlxH});Xi4FxM?{i=Si3gj&^?pv$ zGX&Xu7h{|%G4~7;i>HL#@{OgH*eR|>d_(CEDVTAW2I_gI^ z;5uGBP8YBRtlvCkPo&SW{n_kLP^^T)$b-0>wFtJ1_oN5f9iDm59l5=a5o=Ggr1kP4 z^9o*s;e}pQwkUL(;%cHr>w80BK)sXfK~K%TW|)V(z6e`=dqddf#2LBa+el78QF)0e ztV>wm1!9vDzWzLo`Vi;TjCEz`(|9L@v^qQ#Qxdz7e)^x(_Xs_!&`)-3jeEyRRfX^V zLEqC&?(Zj}^!%rKU$R_+juhrdnH5SA7*2M6^_^kNa1H)r2Jw>(rdwD*^^CLwOrzM# z2%~yF$*-r^S~q#;@<#s!qpFkc|%z0 zGp7XctqxS$i*Po2M;t^4v{1@bU4I0!Kp(q=k`a%m|;T5GpxhA+l zKcy~Yg90H{OpF@mz_z#ekQ-(^;Rif7ra*f89zcv-wxMnbiAFZ?QC4X^!3apQY9Z=b z!cal?)FI%>hF(wup`H6AZc&5S|y+stMr$20|kvAphPYtM$RNZv>|hxq$hTlqBR#Hc}Cbt58%%z z14cZ;NVkYYVa(j5J?G+Hkx{p#A%TNLpszR|47!vgpM;Q{!e^p_Clbq_;-GugZ2x|! zhB5@A66k0iERx^I20hU~sY4QYRgX8q;LS& zALWi+%?$LziZ0Zs&8pH}A@P|0_PFUM)Y#`v&7EVD~8s0Pe#nD#PAsd0jVa zZMgF0pB})zX0-6XXO{JFB11>nHOr0hGOmXvbg{hJ41c+j0Fc_3#vET>PO8h6r)Ffk zWkoqL^#!$REFq`Rp4vvk2iERKdL{qudbr+o%1ZhRrI+c+PgY<$^&)c)5ZX zNTwppJ6mF`eBr%8@$u%&Zb-FW?*(tqpPf@G`wvs**RyJwx)J90!U9B=dU?QJ$Ck%P zVZP^QiCaz8_Fa_^x7G^3s>V&~D!GGvdZ$D2cO(Crp1scG#kLPRk%rTcOW3Vr3rSBS zZc%hMk4GWu-PWX>EPXzeUm+@EMMhHduY}xipF^*^ocKhIO3CD&(cn-13Z{LsiHqa~ zs7<}zpdH**^Y7HGR+UAmWRK)j*~KE+{9+G$1DZ~eWXHxOB}DFP!0^SI@fCb~xe{sr zhU##N&~ii3V9UwVr}60BoL&?lgyD@V;3Cl<81wnUt0~uaDNeAFT)~LnYEi$SS@qU# z|5cuThpC%HT;x&EexYJM3I#xwhkTx0O-mL)Ls?D!G_H;r%`rhV#WA@8*{XpyMu$fy zAj_oSk-J41G=pdc(bLJl)q`b1_seYAq9f6VS{r0S{{|T#$;C!-Bz=YOU27-YozwGZ zqz-%dMwkX11{!&d^3LR=_Z?({_w)wfJ>%RR$AB~|_D^BliT-r2gAcrc??Mm|n|p&= zt&-PN-W>pHy}EClSINJtj;4b8*MTF3#>6QF79mc5P)!ED{IRfJT7;l)v)=p7#P@;c z#8$FF%xbk6q6zaf@XD~nPu#G12%N+rSllp-fbt%7uQ30`@Mp&e!7>t(e9VHo(y*S_ zD8~d67$f&V7?>M?=qs@v63B_!_wdlx{y|+%IKAm&7A6tMC&O+3H2^Ft$E3VRGqx2D zB=FP#iwJAu;s&j0|3PT^R`W(L%%};w#}S(d)pJrStQG7&aN>LMftQq_@JMh!@c>>- ztp+_GCEs|CGeDh(YML`p`L*Y??kD&*Onc{(V7Jy`#7He4{I%+yJtz?THq)v8#aHFR z?&$}S=d`+8vhG0^a?j1bdX3x%PfaWV$L0*=6Z#1>1b?J_#Gp1u^74txx%PD_-AeS^ zNFbs4WQ4iv@5qUavi4_`r<@K?BB-x+C2fd2CeBNe<Yel0iKOHtmk^Z@0=av}Eu3##C8nveN1z5qnCQGPUGMH!nU{>u<{jZ3 z?BYCAYMw9%!IgIigSVJI1mac5{ujRWQP`(RqqIoQ1KR9T>;B3+c2MZ*GmN!;LQ6B~ z!JcMf52m>xS_Y-nlrX5k@oTGBR$R#J)McDfj$0Puo8I8CAcQB^3TQbn(u;e!clz3X zD1h*JFKRkytWNG>+w!c6WBnZbwXTd)E%Vb`(yuzO){T1?D2t4KVse&o&qec9#!dP( zAoO0{Cd6aVPh6NG2;qe2yxQCkvNjcfz#@0+6GFRxV-^VSl+448nrl%H))O9n>0g7u z|GMQw);%mF_pXfkE%og23>9=kMZinExVy2Q@=OgAn7r!)x<`v&lji}d%-O(>e#)G) zGWet!;mK;OJay|ZJBXc6&N%Gd*uhbaQ;njFzsV&?a9oU-bvrUy|9`v zr%RTTGHd*0UMQS|8(j{C*7&_QDC1+!BbYiF_5mFc0TubqPTshz!jMOR8!f^9)%dGM zI8XL3)cblozNK=$!pT%j_@zr#B4Y;mLdt+*29-;5=V#|;l&)@v$uY(4aZ}pm_^(TI z?P0W_ILl~xcwSC^_3=Eo=C3ywNTz0ZR};;N*;uO+SCd+NnR2<&XkD-#gfAVs1HpPp zlE3n{kaTHSmU6?T@FraK>FHRo2O8vnDmSkd?cY)Xq4Yy{Q6|PCEG$D(>Cw&QWB@iT z*^`rpGyo~0q(nK^vDETrtyyVjlmo+wm6}I~Yo;C$h!tcQS#uoFkFoCI1@u(c%(xECKA z*qSk$5L+g0ER{5yIQd?15)93}VyyF&X^k2krnMiHO~o_0XAm}0gN{2F0rkP2nmpSq zW$P3P#0bJ`i2CoH-I+mBCiW4Jfd&Rl7w!ha1KV%?wq$$*ZH7ZE7s(nOx-!=^K%Yuq zFe25`aAokc3|~?_(zCQQlv?F?FpPvBM+$C)4DmF==z!6l6CH0Z4ldE}(a1<>D71<3 z0Tmw}T*anu9xoO&qS)9GljlEVAdyQ8=03(=PUhAWNh3v3@gwXD<1&8&SrQg{bt*O#w%AtoV_x5DyP~{O3tOhQFt^K@6(s7ZfQ%ov^ zP>5wMBgn|-V**&Hxu(&6|KdO}K~)wNhEn^zEECAU27!vHBqoA5R!GB#qWDKGks>*1 zFc?(^D$7j(RauHGX>FGU9$7LnV*j^5lIvr zf;?<6qIj}@7s>auT}W8xiHT&8*)QD$gp#9T|15%w@0J8BP@ob|hYi#4fHd-;5hH|# zPdL$WW)jGZ?Hl8qB8&|+P8&x{MnDffC6QJT#7n4WQN-gvk|c-N{thnsew;V9bs|ZE zl|B#`x4{9DHc+L29>a#5Tx&!R>JjQMnwIiXELEzK*ON5^?E`i+`H` zb;hF_qo#6hQa+A$)sEK*PFvCGn*9}x-g!x|M~&S)^&yYP+N?i;%9cTIeU>zSxw$#9 z*%_TydWJHr zY_`G}pYyjzzao{ zT@^@~ql+rz0Y@z(OF?z6Lf*v8Hkj9XhYwh{v=iu-YoV>)e?{1xW?>&1sSy6Isggk%nd6d zumxsH5!Lz>O6I8I=}@hdgExoqFp52+p!@=3Zf>O-L_T=QsX3-K?{KZLGtAE z@G?s;V$fm07=~(I(3;y5Lp}`)tJ#*x)g*l>i|qAI|16yVe|F|12G4=15`ckytd`}( z@gdWfEA3}msXf7bD0SaCw7Cs%o;BYivB?$Wovi5yvdi5|=F3noIh&YlDr2cl$66|V zkW3l2P{13Tn3T7}mMR;?q@AL*ckdWAHQ;*r~l?R=8w5Fqm&pq=fb@tYoWM%2$N}gxYREO0f}y69tiFK0G87fzwp! z{&P>|razM=FMkeDDv!*dOH*^^(Tgb3*Jn7ivN;N#AIM}x52X8V4zP|yK!XPK@BotX z{N78G(T-_`NtEW-xD)h)>swhP@6QiU1qzvk3-wJs4j(;f42S9bY_2i_-)`epO#_0CN(&E8Rl?8&P63slVgBfkmVLLhGNHqk_- z1y0^dcp|9s$w|g9yq=ZOGktHYXQq|#&Cp+FWLo2fBsD!k6Bp$GU5KHb?uzuzrvRq+)FKw4eCI0+;NtByj2 zp|GXUh=0V4#QG2zX6A07RLV_>1t%0zkmZFpo0JxR{uaipY6OM7WN?JIAY5A}vV1yB z@bkGU7jdL89y%UOFYe1`!eDap+offV=dHE{D!7((lGb>nhX*--g+8$+P+;6<);S$jXh{saSSX@exCdF`XscCL01yPyN`*;}DGdY{F(0Ig}j)8+>S71sz z+CzMKg z6H8=DoEf~TQOO>Q$v1gee>1H_$Vp&pWz(oKcFAVMJej0l;<4YAk4fQu(huNjuhPDG zt8$t7?~iEig9I^%o$gJ49phBpE;@U`0=3~%>A_V5DCfKC(x(+X3ZcGpku~&sHoQN@ zb}(Fm+F*OOp%K&n_g+#vzY-(kv?*O%8gBiKZRsUSz&4rAv_0gVjY);Q6bx80?$nk?#2zZhnRhpD=P5hNmeu zg)Sv{oB1@hikvN;+L==v>5$I9$7~bfAJbuQ5Us_oz)C9C6Bs%$gGhoj5oG}*f#_1a zJe`z&hAHi?B6XH2!x>IoZUqgM{w}5yLw7nvQ$rtef(NQQ33k&ViP6_JEI$40kD`+7 zLkdaWMT@^CX=GkN8tKj7+4};A?sQ}C0bViApR)aY!;}*E{c>@3{s3UfUPT6dJ3BAS2;=Z=* zu(M~#L`4h4O2%Zv+RW7)6M1-^&bZBpmy#eNX_@M~5b{s=cuyM^UQ99N&V?1Hzp}&- zwA=}99k@?OxnfzP;K8qzMdjRky4i^bC(D{Th3)x6#pT$5KHwDg1N^Q_=&T`&^}k8f zVnTy;qAR54fS_UZ4{O}j0gHYAw)e@`I~|3;|}XS1aVMsT`U(8#Yg4 zMCS%bP7E^|>q1Z*J{<71M~{t{SzyA4!T8I&7_u6g6YMtpJ06w z&@A#oxg-}Zg=Ylo#_0_n=*UebwLgE_L0yo$MGUhe*Rmmf9ZX8*uLBZkLzJ0Vu(<9> zS_aILechn8A-%L{>aYs|NUiTypamvAfA9{D;Vv3a@l2iLS0qXMObLMJh@qco*4gu) z<9|fGka3S}_N_#b^de~7Eh^?DqXS~ik5?GS)f^Xujx$Y92FX@utzdK`zp4f@T?@|M z7xZwdBfd4SFEAwKRb#+bJ3^jk)hQTMXVARp6+8;1tNr?B=(7)`UK%%gINPikQYo8!ky=e@J4)3aAH!!#JI)TeJSD1PRTlw1^P`;|AhFu~x@R z|30$n4u5b!E%LPSL{d#e?)GZ3Be@ejOTG-@R*C!TgdSl|^{_q=JVcu4n*rbtO8Ub8 zcJxOJYmX*~I+970j8?zVAL2g+*s-_uDyXW0;!ko!oE}NG^fZFFK-x#-lJD4L_IH`X z*{b|`HibwXr|!y^jd}ixNEmFMU9Xm?12&sUa{$n6jBbTW~*GT$RH(JLD$z>EQ_In_@iN;HhIi{8_ z2H#>q!vb7N$6P~anFhX|jvcUYAET7j8~G(dXu0svBb|;mt^Aj7WBki{9*Y;pvA!?B ztZqTmsW!rJh$2b{)|_&_J3_A{K`ZS=OF}(Wv(IAEoHucQy+#Z-yY|T5d^d7#2{Qdp ztN03;F7XuXKgem^#<6B;O+5>_WuJ-Z*SO6H3LWmstF!2q?nUov&6g@|sOm5E!kNu= zoPe`^E^1n$Df-r$JsncSi}5PKh3xZe&8+j)!KpghTiomAM|b3_d=9NhD7)E3pn^fO z&I`vpd_#O`B~Z8TiWA70J7aBNs2A$R?9}%%OoX!9OK}Z~rFCWZ-g2i)0q0428ZMMf zzw}<6Ea0COE%^1i6!=h@@pHIqHt|8P?03;`WZ70o!ejElxCW|oV%+)@>345NcybMjL^3~*WhIzDDza^s|VbpD%lEd6hFwdu-YpwAB+fv#*gYU*+ z5)WW{%*GWi&TrQEYMavFL z=cSLN_W)&;(fbxgPs1n5dFsXv+YQ#QWM%ho6leMXyRbnKMTVjm?jY6UKxN9UROoCd z&>1Af;veOEajz60`!93%kq7tD>{qA2v9T$&G0{4yyLT>;FUlofZ1PM7=B)+x2?6*H zKmQfd#Gczfg5qJ?Nsn92jIC>wB5^S{Us#uDL|6Z>3JGS8zNwf zA+84ld{U?2XX2rB+SC=HfnbIxlFBIv4rfiig#_?dNZo{>(Lr#L<+G%|U0#C7HtClN zx5h7nn7jlwDiTsg#~IwN)LX-q^q(%6quqSG&cgiyB1C>`!IU!@&AD&VpZ75Reo#+9 zpzHp_=RHKfU${|z@@_6%#1I6?d@e=aoH38ju3X6*!)J)uh|VL#0yDB$gUtvU&tsd<&)_8Z-Q>{sEER0n|2j8nG%#$646C41grUoyEO}G zpx1eb$6_!g4=0C)R9F0{A+Pn-#dN!fZHMbs@V{s2~a;nxAs;S*~i z^_0KL5*s-+`fu%PCHrfl1_M=#OK4?wO=cG9j(XxioDK4Z_&)F~ z+5^-}tgEwarB7RWoO2u2=oVzO{jEi+8gvf15LSG=c0J>TG|%53w@MD3j!nhs(GTGk zeh$Lr*htJr@UFZos7tlHR1N-SZ#u2NnDXi#&tB{^j_*r_zDe*fY+j6(c>TOm)Dizu z1c@OPVB5|0$yc!h9?=b7m5uwJPM8B=8Atm^jI=GP;`bQaa=R!i0)4FHRXn3D&(aH@ zCCsf@+kdGxhcgb|m1cKirPO# z<1CR1VaT+{O-4x*B#B8$SranaaUTUXA)gFmR|lgo4=;d$uI1-}Z-iE()wBge14?Pq zzSpoPT;wtC0c*d{Hqf?l8A3BvyagJDIFbpzya733a{6Zf4$91tCRBxlS;244j8QzX zEKP%js|7+R-MfYhn}qj;!jV3}KgjA9Wmvet7Y`7fAK}$Q$^0(S;_7^lvauL~L-Z*! z)-7JaVE8+Dv9@s5v~m+7-ZqguWBG0n)XpI5A^Oq{K&LdGIQ7n2H%W=Pj%XhyomvUV zprK;npxER7i`<2JM8g&oI!p@tSZfD*0HyjBvU4aF-p?AK`2xPphS)}gkA$N%K{bU$ z1>ZE|AboI!fI>C?)Anj&`DqM_7$mYlwuj7g3U(rgqZ}&-L5E>fPJE-|^RP>I{L`Ev z6If0*zE;ZB5nunV{2*|N#`*fHJIHZ3*AxHAJ)m{-PGZJS(QF6rnj^3reA{dC5sAt$gK?rj8$UJ_wBk77X5HCLwQ zo%%DYHk-haNo%-R%d z>v0#|>2}OxWCYBmW53Ua10hY=GlcW#wc@omz%2#~ivVs+(A|@hE@_Id%}m;1?0;w7 z&8E_ot)DEgv4Qpncy#A#ogu^u?~GT!Z_|q`dAYm8kXeySfp9UfT9uu!Th7CbZCtZN7KpcGoZ2d`UD-(4@#N1h|N#0uZKjwOfc5X}U z8tZ*#IeQR=o`9u1AMg+1z}}c2|B~{^Z)Ug8A7K9m@CQmo9uy1%YGMAEBwPd;w9n}p%eqV+zGm>Pk>`gD-a;}SYTFDx(EF$r0OZzHLpCT5|qKvSY3c#GU-?y(XmNX^5 zZvT#l@Lb~f)CFWoU~y90{Tv*@)#?F^GiU7-yducv-c~anRe@Cslm=#~UtrYiWW47- zK1@}qXT}R+btwDR!z5T;eI}F2Vu0UtbI3DB>d4M@L}EL;#h%ywddBq?WUyZpi#Zw> z{EKGrVn^GXVb#o%yuyuBu<5xt{+QOt7Mbw+ui*dU^IM5>&_87vQHyo?>%=NGw@Q1| z*p{0S>tIeh@JtjOwkoG8ZVcC&_>h*0r zrvdAsh4Fnt0a#+CA|iB8PY~hPaf>5I5G9FXB<8~))vwR_m?>)fne~C}%h=W0-}IGd zV$4coP5@{#DU|^k^!O^%buj_MrkFpe-I-a3P6gI)L)X;e4u23Jv* z0^^1lA&|Cpi=C@oaA(msC2o{52zz)dq{U^>w70&{XCfP_aXQ(3O z)F(d2^@#y=_51boHfYr5KG`T61h07B?rHas1S~)7LgJbtMz!E3dAJuwps<5_9qH2N z@E!ake6MZgl026s#K_34wuwY%(<;kDD8+$1q!8lV>3RDzLQPA|+=GJIab!EeC*i9x z2OF!;D=Sh_g}6~|V}0}Frg$G(#Vx5A#0FRy!Pt)WOcqAL`_9ks_=*iGW1dt(Z^S`-Gl;?YE7}`brIFw&o8mTWZEji2V|k zNlYW^7%!1tlyWUkB5A77r6^ahds5U8(EFg|OuxyZ=E6=tT12njdNUi#rT?iUQ%<@G zU?8IKa*~Kb(}D-?q#FF2o#;cq+G>_?OU8=6G=FTc^^wwpl@JZfaE{X`*rq2HNjy#< z$5(jGXhB7vSsPj}ZOieS>`r1S^S8ef0b`F#C8Aj)k?-?9S)o}HHAo@BZLhq)gp4pV zQ%*rLuWbfECOjdm?kfmDdCtgJZq~RnN?oZ2j`*3E$U8RYofVOXNhn~KQAa6;d6!*w#e4?>9Ry4yUulAS@ zJ=EOnC5ZET+u zyplbvUMmXb4QFl_n|`sd+Rj13pg7jDZ;`LEbv9biTXeRh!xQLdjqcvXw~t$IZP`Yl zYjOLL#nyJ2>jZoKRniCs1LYPk(PZ%-xD7hWX#FbUv910 zoo4M?P)I|Msu!r)p6rRzPk~|9yEjx{ag?o1*x#XZ6N+;NoO#kqkXvxG!wTwwSl3bd z-n~i>hXefhl*w_a`YwA|2uL*3($L-m#jS4hygVf*fLdc zWtNTEC$XNcAGSPPdi@R0Z?Z{i50spW&qW#bnfk^?vQRX8V)3U5??86MMot_hArcyFj5qa-c^zt6_?@CZJ^G406CN~_sL7xi zB7L8ZHlb1V%Vy359X*Pg^zV_2Hv_>!~;@0s7ADd#q1~mFah~mw}%gpDNE%>)@fUwIVtqLCL*!Bagjua z)+^#rFyAH_Rjtzj;U8I-j{zn#*N0+7M4h`+=5PA*Bkc?D1;~8ETg$@D=|r)8TBZ9c zuH_=q=^PB&67C?Q*1D_~Ntwk%``}I9Sl&xc)A|62IF=|Wt9*Q!iTQqru_F+@R@Q=8 zev4FMa=I<;)RaD8I~Qxab5M6iaXH~M(HYGy@qX)Y!&}3(-HGgS0Dy^8G%G?XB_4<~ z*lg1$!CLFm2+5&u5zWQy31xM%@pucMTKWxxAn%z-wEEz`lW)SQY7d|&1 zoPM_wu4naZNKQ1k6k=4N1G^=+mOChY@|F5CZ!u@cJMpDJQ3@x}^FeoKAFqk1RuPxu zjR6H1`mwjFK?9P|+7SXVe_#tj?t)A*AxAH-B zNGsalRJjeB<={)o^@tIaKhj%xHALFZJ{G_{393E~iHUS-weJ2d{ZSdbS{)Z9XQJM%^is5U|vkJfiYb-@`e1;i#t5d0@3x^Wt*NhU*V!Hl+8{gq2f%`n5bz-$WD=DAsXr!(sy zu{N$zX1REPK4MpwiKh~JYfY!PGt>rjtFrn^&{g%3G%HUiYU};x1_kZ+I*nE;>6#6& z%C7W5ySYowyI5oJ&AQlo8o~r^5ui=q0c%C4%9bC^ujs6XC44V~bvbI@JG31+h9R=M zWJMUY?tNx1J=gp1?mXmA(i`XaZ_doFsmxzl)>^kkx6E4Bcqdfw^J3BCk-Ic3Aaom(8*g9t z#&N~c0}^#iP znEZeBmmi{(9IUB%^n#@ZQZIx>SD-Sj|8m3$6w%>fd=yD=_?1hJpepJxG*+_qD(XzV z$%zEn=AKVrjEs2^C^C>ixRI7nSo+O%Ye_g4g-0i`r&f$?e~&e+Zb~ZCnb!njGRplN zp46$WXX!wm@=G(!!Kc9gfg6LJinoJoP*=?Dn0s5aVu8&+~}^o;jo#h z1@(m{Z_8Rg$5C~pve1(Vc~B)J@Fe_hBBaC+WRFaEIffWd6ToLXqT#$xX!$#_@?ZZ6 zAeEiTpY=)lldGn;n8gPAOZ3jfAQ92DaEpg`Pz7jIOG5C#V;J(Z!K|MT8I*-tcwqo9 zw?s|I(04p5xKU=am72}E;yxc9p=G1S6REg0G=Vr;Qi6Dd0)i$I?&h6y=_H^%S(;-1 z_-CB!i=%$h=TlKDUkUc)cq0We=;xwvp=p9$izOE;MKRi!v0kQQ(RIBfQBugXqWqL$ zgi;y(s4|hqZM1lV{xBAl0oEt*dIlRH@g3u12p5N1Z(JLzn)6V&o!_Fb#pFoUl6Lgt zSHMO}nd;~ zAzp7#23av})Aj6_zhAj;EGjji8;}Rv9I9wKlc&EjwsU5dFR)g)>c3#q5)Ra$%#JZ= zz_C6zU4pKTma(SiMOVj5xtaJV=L6F=8UN18X}!tPD|;38Wy36!fo8%qS@xhUn?ob` z0tJU`^WgWEdT}kpVwEM35;jxb<1xRm;Q~=}-YuckP%1V&B};ehW5y)#CCq1AH9gmh zl396GJjc1v7GS-1Id;J|;_j!RoHAsfFE_h*a@TX0qYh3^)P7~2rJAe(g@IcLY(QJ> zS^xA0Ee;bx(>=j3;}(tr$(T=a-Zb8Va?Re*kgLLYS-ZvRCH(x^{$e$VPdknP^sC}@ z`=m8t?O%N@BJCRVI!b(rmm7Zt*+OX%Q!H7L(&tPROI}()4#!)$V8UDV4V(mzc++W4 z`;l7u{^XI`v@RbrFZ20kbJ=>uEnCS4_N%Seg-wMntuK+3lrv1j+NG=%Z@9C7f6N5> zJVC*UXIfXrl8(A+v+LAgC zQypYNIOJ0(eGST|4ygGX(at&%p9Cr53Lzf4Bco7-3(qj?p(goJG6D7Lke_DEnTjIBS7>4lU4*+a1)@~BtO?S zBb#m;9_9UT(Bt8^u%QYuw;f-FM40Uq(_rSC=i-cn`nq+MqMDySsZS$38Dc*ll)q8v zk8g-S))Mo(Na6U$e`VqPmknzKk^V`-2=x;M_xNiuxq8)ptaxIbaQ~lI(b8)V=&p%b zsGWl+v%@0W29+c@lPJT`p)RktOXb1lO+-$VyFDScw-mS=KWZa02!+#n8$`)*k0WNMXc=*55Qr1;M+Z6hv8xptODJgjgU#i#lj0@j8_edh$g(Jek9vBd6 zEfiToJ(A2x4g#{&^zJe*qZL;L)7391t8=zQ1n*Vq9D0mcLczS7fI6`1kUUzEk}U{7 z$)}(6k{oX%S3APYJ~Q)oc=$MV ziTq+s!sAZrB>xb#DbPZ_g>SKHGf*`9@BO*V4*`4A1puK)*pEAXUvR%w|g$=_5b-V|CFAHE@KRqIk(TSA(YB&b}MvwUT5*pfX;B`24I>RlXH&? z@e=0M(F6rDHSmFfv?|Z%;~%m{*(v%Q_wW7xbxlDkSX0T#S^7mH(A(Yz2*V^mVmP6bn3&;=l#f>6 zPTnV!bPbQzPwUl&PiF4GDjwJ_UFuRu+>JwyKe@{k5-r3#3UjE|-F8(E-o(rw0yut0 z8n#f6;Avyq1fE*Zzg@G!hwBf9qzp14%i7K*WNVQ+QRhSouhp)46sm6*@}U_L&7bTN zl-l}kfTgj}Wh+y?sUW@PfXilsIRxn%KrnbmRKy~TcmmMzY_`Kr;o z0R~>j1y{+4q{?%JzBHvQYCQA9SL=q*F@-6JrA$s!EEY4mr|5*Hjr;hYNRpCtat$RD zL)U!G7gGyz9V4ycWNM*%?JrN-O2(|&OKqPA!=6np=**?v=}+j8CawU%@15}Y+1T{S zuAM-@6^r$cKFwAQKR!GF|JFw@H1-S7exO_DyL*Ymqt^hRD!or?ONe=cd-?@{9n)lhKGs}&tu-0-phvyd9AKR4NP64mjX9ThzsCd(w9=t4ZzGf0tJ}W1!O{3pUcoo96{5| zwST|MDkcBR|3E!8lVy80&>ay|mj?X&esKN2=@zld%89~IE4q6ik^ex_HYuH&Ue^5S zk}WWu?1s8^HQw7OPqpEPu=Z*nMA#X+<8qS1N75AN$Oe9RqJxvoPtWz3dv&fav?UR|L~PS-|UyWCnzYWRqrqbq==m#1|@%} zwpv}_gl+eXNV@~Kb1zg<6(~r)8d}{|SH4tR}U)l-|Gi|F*?% ze+pD))#tM+u9W!~{|cqXV5uLRRn#EkMPxQm9N{|?*?xpTps_CMG5r2H2yrGGhPU>+ zyj!TH@!O@t@@P2z@jvXON$1{lA@Txc)<;EBX?XsLEn=N;^fn}O!||t|nV$?%)3EBk z+F6QcW=#GKz3xPbXwIYD7W zC3j0FCZN^4`I|7!A#X{13HWF5U7y!lg{Z6tJpL9Ad!Bp6*hx_5bC(Rlfwbfw1IKY= z3p=ry9}|t-^67v=7eBsSeMV480h_m(czWE70k(AneWwU-DhRNbPSmb4G2!|Di6gN> z0ZFoWw7l6$_lK*^1AP88_!3^pTf9i>#z@fpV_p~aE-r$Fhy;JKY-DSHNDnUT@o85b zNGMZ_^N5?Vf%gLZ>L*2c^%dXON>9lujmprG35vq2KhX%^Tz|PzL@r)aV60d_?SC!- z6+BS6BD?-E`1%K3)7~WXC5wnsWPG|_!4T^9-bXISVd^r&L{#m=l9RY_RW-G6Jy&;7 zOxZ9f1OyTca>kjg9bOy)ziy!(!fKa3&2x-2j+W5nV5V->Otzht|6bo2k^70zr7MSp z-A>!ENR3)-^Rhr$WJiM_z7T9O5S|K+U-nRP7bLzn*bo{CsM~wcc3~&=4NYqK+PCg! z5U#bxMz+2bPmB@4eFG~a?&ae#OCk*XHihxQ$v3L)(RihFTx9c5-Arz!`E0)8oQ5ei zGp=Jm+G9OnW2Lu9xAm1l)fO43+-^+&8^e-LQ|*l1UFon#S8l~Hw*QCeZ3R~kAJoLp#dEjo_{@5e8w#8>#i6RxLq@ui17HcGm(t_ zP0O361cr+o21(?kgrtzK{ zuxa%bX$30}mhd27u`TpmdI8Tr+84r`Xn6dEfa+Od=J5ElCzdK)NEREE8L(;On=b|G zfs7a6`HxTV&ZLPPA+SbIm+>$B{qZKDVnf%dB%I1ysNci$e=YCSB9BKBj$c>X1tjS& zx6@GC`VcqvanEA1@2BdhG+leyg+hpkMJLiH;iF$aQ6*mTL))%3Evnr+Ee%}#w> z0vOKa{b3WT)QH}tE6j8MgeYa>o1oO39r9ouC_pdQ_f}b)U-oz^rp( zA(@X&3bDVtv<(mPmfvUNq=GFsVXI&Mrn>$9BTAv_xS-hiuVc=h5Zt1*FHS6i4-br8J^%tR% z;l>jF{Fk1^c}bEcC=@C0v=B}8^OBoM#zNE5tw&pGMd|$|@|9n= zO^U(aKPo)_GVuG~s}ltR`pt6cWQ)h9v^U(s6nBa;z9%xC6kn)^u<>zf1c}{u{u~!R z<9gHn{&@D071oxHwN$OH2H^>Y<=wE2IV!Yzd6~ia?@`2uCB-e}7`4XdXi-WJiu!wi zWQCG0ix(*Qq5h_G%f8GbdMHX^6=7A{*7ggz7;{d56)H1oxjmo!gkIa^-9Q@HS@R_q zsZNcIe`A)so-8Ve;qy}_&;OoZEg%e>KX$fFpk76B^5mUl3_pKRmEe~Qf18CaZKaoH zD}yYHd#RrKXnF7ggD53Gh57>ioD^}?^FGD2szydG!obs(c2@vU2r>zRpZ}}VriGv< zU}YW1HGqhie-4fq`0l#3`tk#f)}ttV*o9R1`OBB995f@$N_hU0iXU-BI{w;qM@IRg zIUqIXorDI*m#Sj8DXdKELm(c4&wmlWnJ+mMs)!9@O^y&$G32RbphF&VyZ>p#f zI1e%Z=|9199%3<=lI0JN_-6x)tcV^|34>!wsR#XVr*0unA zw-)9%)B;)=tpD!#ro^zKY*z=7uP~BWISGfs_dl|HO_~FvGynR(BpVm$3Z0W@%Yx)j z^-Y8Me0JG-=N>b$2X;0PDKT24bP}RjRiV#ElCkC_9(ArHd-5~5{!oDHA4A|C=*{!- zAol<{S~pj3x;J(0oaN zey78c^PF<+H%bZea_ivyODQXxUdGvLLz-hD#~~mqw|uy1&KId(2{%NGitGk*-|u<6 zU?$i7>?&m5b_=C~`aDvNuVcIGms(;5QtnML278XWQ=w{6Fpg3Br>{oVDl3G(g31jV zX`_sPq0Yp}Dt&`QF^teUuA-pqXfus{@-U7hymK7Roh_~2-Dcg4424He8qVuiT=4k| z%OReqgHwrFj)v5K=ijoJ-`uql|F$abdIL+8VOaUBj`L zs8MIS)U|3{R&WX4N}-=7{HX76sgZ`ms1|J_u;AG@f^n?0?$UZaCQU4Gj}n4uJ) z9nz0QvDc6Wae>LjRzkg); zJZH$u836^T1Ar{jGhGx;ZJ!J0e-BSGPnns{oTCLAKv?)Zv$nWFC>itQ5cX27nhM%P zHlse+rl8yDQK`>kBM4*R3~jAHU!ULQYm5Do|9-#=`hK9>q> zU-zlN^`B+9ksCN0V1Qfx<*Dh(5Cajr)x^O0Ib8CsCMD4UA?#G-k~2^vM2;JeRi9xd zF&d2)s%`vQDVbL$-dTKWWOUwPG8(ani=dMBC9;ZY29B?sQVhJnvEN?bhdyhNDPy)v zE9F~H-X6UkBaa33zf*N0d7ZR^%0`+K`P(#;7!hxsKSqs)lf*iOmVVhND3imtNMZ4& zB2@l^gbrZR`k-OEI1^Dt$jV^w5W51Kv!cbLg4zBb$Q*O zAdk^rYw8Cl8dZI?bh8hf|4UN`EU*SP6R|##jB%$zr?G*}d>gNascaSteyU;Hf<8_% zwj7osu+ZsgvhC`A_5tSzYZvtWHkCJh?NMZCEQf|d2FL$*{}#>=lOylU>R9zSF-JPm zz`wlMOT+4x>5{l?y$tHSLu$_xn?DaXeyOzEc-RyDj#%AX_IDxL)h>`gn=$KDP@R31 z1vyn9f1RsJ_X zaEmjaSR8QMFM#`(3Hr-XRzN_`S5=sNW=y=f#qB2|*6=O9nLKpyKJ9w0vY?JR-8VOfrK+j4 zjx9)*`$yeVJp7Cpdo_Z6BK090I*p9O8oePX-q7Qvd1Cqlpb5nxjoW zk9%#Wq?)S;I(aTSW~-4~(-&$$ADsVlZ+*TcyrnaK4BOC+?hrPNx%|yq`YOlXtj=4N z?>B3p0GbnsdDYy#AkX?!g8dIp1?sACmiAL`!10?dRW`mLDLAVoBA>GdW>lbum%ai4 zccuK;+7ua;9ABT@4^>Z4HEmdnc2uH?5*9NmA>Sznv;W!bicuPF9F|EgRYY&x9TFquVczagOK|Hgl&f{w zjld^s6E0yP?=lH?a%@Doln>9K8#F>rz(#1d-g_w0Ycr_zt0Ys5YSTM<&@ae-5tHR3X09457qU5sUWT*(5@|{0g*xQEW~h-dgBtY|yxkQYh?jBZ{?*S5 zMfK+B<0Coot%QiN|L6xuQYTbW3Ul413972$N8F4Xq4t|Mn3mB-l{F~o*UuG+2ddC! z-7)VB5m*P$z4gNTfDB?bVSTP#QO9Zc{)mib+m@5H+0iR z+QY=f@qF3jn61ys4(vujj4n@nNBl4R029OfunDI9Y3~HK- zi9#;tGXjY)T$Xl24|41nq#&s!yI;T)u@I1p%C2J?oc*anxEmIBK7(qEop9Fy((S+XZm_-=2UQX? z%MO0}=nGJXbg%Z87hEP*tk@41aF$CogD-5>y|;Kx_f@9-#R*@p3uvVX$Ph<9{3T0K zsO`X+2Me|BpXo`Hm1D|e`NiVZ-knI6vM~<=DO_w^i!-OCu8Ivsq5&N&4)(y+1iu`thiw$8SdF;h~ORsgJ& zTn5#umMf(yl!_eJ>$p-w*?LSF*+f2N(8d=KO7(R%&);;rdRr02MtJ zO++i5kS?`0LBi9S0;Xv`X;Cw#Rnxc%z@fW&{<+%4nyN%-ll7D_7>=(g=@n0^R+Po! z>Otp~F4)H5$svzY$?SljU6?0gCn1fHw7XRo-Pklmz&pUgqjZi?lZxblIwe!$;P45D zJN^L@ESXRCI^#?>c+W9@1{EMmrQ}T0>YS9-TXa?zHoNC~Sa8?MLdRk6W}ieox+yrS zvW!JJQ?~@M-@dZwbyL@gaA$puE==%*+gul_2AJg@x5#w_xv%yPnK~+Wf?Lf+l(u|O z4peYsc!X9E+!CH6(`kHA_i;%LxH+HM>w-5o`yvJhV_HX=GRj`tKWmG3zG~d~Skj@m z8*0xJySzfrmuL5bIDxPruN9Am{$4JawT9EUF8<)xgw^r0o)}1z*Jqk6z_aZ!+&j2h zcm|W{*>cVahGDI93|6(n23FQZv(?9x6O_h5VP!9oxil5$Sp7juQqy7&)S|n> z_~jbIZI&`A`ev_FFZP8!H&=cG?}LV{ zobzn~M4ZpzkKUS;RzAuESXk&U(_Op% zMq2gA(QmRk$@+4y0zZE!c(8(~Xo-}9p4v30vf{k0>zhhE9RGRaaeobte}-k8<`2iO z<)be~g5&!p`wle2@$XD`$%}+dS+`|0=7Li!to-%rL+Es)=t6g2x*L-OX zMGiO*Pt==3OWKMDW#=+Y@rU@e=tm;O;`SaI0CdvgdbX6Sojx>-3|HcSSKdmziI>!( ze_%lg3@b%z>GZ)S3e}(9`i5hf(#jC1U3u(rdIy2n#F0277>*K4DlevefX%=ru&l)c zRh}7db)bI|@A1U#YJRftpTj=+N#F3cY1ZFQ#>8ja<8c0kjcKv!^qM7g`y0)67HSW3 zp0ihRC>9VN1W!VPp&x`a0f%|k9`OA$EJDVR)sWTst$cx}2cjFZmF!!ODMW{AU#z7; zm1yIC{Cm-=1e$Hs^%)q~Y{mG);^os;lkq;HUi6!=CDIK#C-2O{x72KrIr4R#_)BMq z^!~y}PDO3ApPE!0iBEK+3E%Jjwgro*OVxxkLFQ(6{SAX%zkl2fHPr{#l88*^WLbVl zk$w{e%aa}md)Cblst|J**MfgX>lIh#W5C2i%uZZ* zf9aF)-k!;vpNhTXRgJvGFyE4wvKWK;rjc*CstNh`sR-ZDVOTF2H%)iW*lq10A-o z_ut|3A1ZG@)T7^JWB@Z!hs*q<_7Bo>Yvh^E2?A~H=KUz47i@Zzv6r(PS)eOC-8$uK zd2&7$OxRP4v7ym>>|27T1n-{UYc;|&Y@(~Keu2TYjO_I zDkkO0U39xWGvG2xuUOnpRx9la@O!-o_cIEsv6+O_Y?)rMcIP;-xM1G30{)Dw=z1K7 zTz;viH{=$1Iid=yai(r{Oq;3--Q+06i#Uqh2jG4L1XXIYCyS?(Tyv=ktg(_MEXr5V zNxYPVIp(fwM-!aa5MV7ys0XP*XE{gFVex<##GWn_KP7qYp!GYK?!RxR+Cc7;aQ(5m zkT3WHXnLj6BSyr{h%*Tu2?#Z%v65Cq(^Rto;Wqyn0&r5pup9c*GbxIcYBO5HT`9OU za~o+2`=hfdO_|KBQy8$GH0NOq@BUgJJnQj;3?ya1gz`UMy>LF=`>HlhXDR7C<>;s* z?`!Lp?m7suZGKW!1xJh4mnLH$b9R4qV4Q0sI(a#uI;8D3!L(}#$`~@lIj#iL`ZfVb zI3%zn&I2lhHk{t7*XV|IH)>d!x#89ddRcWI}H z<9kCgF3&kS`sNx||4iEw*rwC-`=vgaHUC=_%5a7~3gI}UFaVW) zcMQYSW`+Ten!$ogX3rRfDiu%$QO#OQFZGx(w=TXfEwug{oPUKY49TIDDOvU6qF%!J z7c_ZuMO4m4pyRu`QuGIh6^Ll)NAggK)F5VZj&u1CTDbq&Jek9#NQmydGDKaAsbL%W zp?c$)s^Pt3>eDT~a}IAprD=ggF=cs_M~k{Fvj0GR^iWe@A+IedIdmXR zQMQwy@x93O(8iOo#UPZs2?rNH4MV~m#LnD}CT*HQc#s&}$?)|YyN%3Z@aW(< zgHI1+(@6S5n(;4NG~5wR*M$C>LLL|7>~R?v){*k+vXU5VKFf5eUTw2T<@DhH_rGY$ z!J>r-7is3<{0nJAmq}MRO_ena=Yb2Ze{A6T#}2N4VDS1c!ypz`GP(i0|7x?lZd>1J z!{8=zPLj(aDmsbx4gUY-@(Hp8_x~Hm?`LpNv_1a}RVTlPC`HxOP+UIp={lq@2f}#{ z+S!>LCN#tnTzLRiHOJCL{d+TS0W(C$if!LHM<|IwC1B3{4DzUO{xVc(8FYW=m|~O{ zyuW2t;Fn~StB=+| zP$D<&ZL$iLhEEL2h87aKnNp__^K&wXt|7L!@k518Oaz`i_tNCpes|D37R_QmS`OJjDn zRGfc2;ZIb^)kZg}CufFIf2GH1P1b(CEh48O$o~o)Lq+ONm=49&$GkPt zWIG1ze`OENpaigHN~tr?o1-}#@Z8Iu?S2Z zh6(q7^{PKT*F(1^1ZCXwJNP56sRj*Y?3u};PoIL|`DX%2mC7;^nI8*Z2pYpxT@ernSVSVT%G2h_y`Fj(H?7ngDKorcPJanfYTWfSQ8jC?+Oyi^b}x_o&XBBzfO=oIb}(gx z2X6rq+oa*G^KHjK^D5)p2s~ACcbM~4W#MU)8ynZHKz+Rioji%768>zc_9(|p$A!gX zBT9_Os4A>-0%vkZP3X!G{{N1N@Nb#})C1??-~Q>}{H=Le##X%@1M&jc9>s{GX?0D= zA_ONlXwaD*uR`7hUAw*Z&|!~3Fuzq_XQO8n#mkcZ)t~73vo8uwQ+%I-SRS9qg)^d} z`IH`eUxR~r*UK5Lp zw&}q>q2UfYvMP&yx!H3~VG=2c(-om-D`@=yPfmYWzkB`u)IuGH>|)oP7~pU`lmYR{ zbRL5-o@plTh%3-xcT*FYAJ#~?5#}LtA@^P@j9T!EGw67EOFK~Cud!&*n&X&Kb?;s! za*$K8{SNJxArL~ub&o9bmcF?E6o+}cYiLW4VX)?df&xY!0{s06>xR4RIhL^K&Xs4% z$@EIN61ES9qf^)+^U<$i3iFMFt^!d^un2G4Ku599#1W3tTd|iuoHegzaXs06Raa+P zDCyKNhRp6KwS~Q1 z$94g4C%bT5G5zS7ZGoH8%D0S0BC}Fg23}IfGs_4a;}5z#+?VN8A1r5e30Tt{(K=5f zA80LT$aExS;+6e`>XLtKa!zXAWhg*Ewx-B#9TxA5{j*N!R!1INJ9Gn5-`&yr(W1M6 z)RxQ|bp4d%-h}6HhEdFB(tnz*5(}(FLr+k9%aX6Vb|zA+)M$D!a_~WBKfwk_c86=7 zY}HE@b9H_%z?Zy$#{v?lW;zVr0WZ{z=Z zbHJf@L=VFpzEzLN#&|+;NSA5@C9ZCdM>$rn`_a+Cipw$Kdlq8|KHF?w0(%|&{{d^6 ziKi5L=YxZi3)J{;ehrLF^ccB&QUWSG@vMvbum9mX;w*W=`yV#E|JlR)-;XH#)b3%i zqV0ZS)j#n5_tw9*6U`{DPhr<$o<-kCD|qE~=nD){5bLX^=I^CnCJhs}eLs&8gsm#I zCR`j#IK9q5k?%gR*%Ul|HXQETCC|(I;v^A~%^68nA8lF74jLj^B)w-qG|i3<5P+|n z$?v&HqJe)j_)qi{N7DLrn#@>mY(RWsRTMWy6$qrGFZC1@hdae?fH;mYeNNjC+QY8m z_UBiY-YZx`Qy=acNih3k8twZ{_34lo$KQt7I(u7$s5MSuJkni9W4F$Bml=CFB?Hs8 zXg`%{?Do))9&KRml(?-Sn7y3nqXxkJ2Q5h#D8=ylGe9L(SRwae_39m7)1Pt?&o2vG zaQ|5Y&AJQ5oSzA!9NpKok$Ep~5KqFs z$XF;+vtf7{?gcRbr(o6B6n0JV=Jp;wQ}Qu$O*hd9<5a(G+%V&sXwHFCf3OTNJ2+1cFh^=_lS!}3B)+pKA9IT0fz{LWsUrN-8k zcUM4+ATvpJC7IiRaGRM**sLXaF0Zn48x}JWf8QC9!3zrra0uV!XE> h~J9Obk*x zoW#&yqxJfgUezWHv{W30Z#kH&}v|{qufVkdrJbMm><}zvn3zb6_SL{;w{m!xsvOKE7e2MMiE2TSubT1Z3@2u5YDhePhs1A6 zHZOvq@SCa*&C; zCaKS^Izqc8y$t8+<@AvGqbP~>)*CrHlW5I+JTyP=l|vhcxpYG;Okyf=hJbgC#Y0>I zb-VrZ#0TdU1^EBlUCLS!YKemKDm)oRnI@WV`2X#{;^6*gW16dNGew5>{125Pjd$`a zc-lrQaMmv>x$xWm&}BVik4-`W7Wn=-`XT_*wa=>mVejg#QWj5g~Y-qJWVyUQ-uG%J>9u<>s zjVs+JG#&3*NDKqEAhuQ#e^y)xTL*K|Dm_es`<-aS&mY33ma+POJ9Fk1X7WOPgKIIz zzF%H&RAao&^~%(?l*D=6jI;CYLJ_k&)Y!{y?MsB^DHflt^8 zYKv|wgkj9N59~;-C0(A!(U2+SJ~cDC;yBqcaXy3u zh;HsazTnUeJ95kUdbQ3P)Bpqj z%KcJu#r`;=@N?ebcf9~5Kbc;_V|Z6{~146VXUSFDK)c9*ts{K zVH*I;XrOS>PApJs7uu2Gr!Q{tIJRFM#um}=Bk7ZV;-3^p{4?u%? zBNad9vnDLIn|ThLM6hKeQL-cZ!A5z)IC1J8Ak}OQ`jIgD=pA|+?F0RVlynQ=BI71= zK%{DPlec`;Qc&gEacV2cWb3=4jKGG~S`5uO}=34R$B$ z?G?N3cA3%#Ay#q}rZTM*kHFMP^8X?0Etu+vwx(g+9TME#HOPVB?he7--Q6VwNO1Sy z1ULtG4;q}{?iv!@d53$STlH0azhG+5>{-&QyO+?MEYznaQR(9Z3U-;n*WyM%|KPG? zmD^|(XYJS%kddP+*{qg(&}*cq&lE=|+bs#s1Lpr-*-g;%RZL;>Rqv}1zKxQ1ZHK$Y z!>`b$#b`bso|KXr9Tn!|Me~rP((Lu~U8!jcR&Xl8RkzwzO(&#K`%+ZKu_jU{LI=6y zfogIyU<8uU2>UW9&b@wJ-;SK6Jo-{f=QeSii&KWP-IZj63@gfXA6|YY5z6S0lvZN6 zSFOUq^7YAww+^Gy_tdj_h2p_!(H{{<+bd^&MZkNm3|rwR%_4pe_Z(n%fkqswr=GNjUk+p6DaSM{Chhk_vCZLfDyn@!-p!ry9b%5$ zHDZR@q~P4d!&@30AUS>1^Jil$%akBIncyNpAec7Tm=B*$Y_ouZ7hV;!v?JdE4cLPW< zGCiE2RQG@R_f7u}0r>wYP@yoqPkKmt2?gA>@fMd+{+T+qj*GziXCV#jEB;KU#%Nie zlBcFkHCmTXqW<8{?7Px5BaH^-J9)`D-%!*APl%}rf2e#3y89Fo(_9Z0qy$sYOD~&9 zTt7>*;@usOl!d>y0*N`Xd?>Lbs~^Rc=yfgh8W4!VIT18Fn0hhJ&35?K6r!j55&L~m zxz_lnqm+jgS=1Ip|3A9Jnk#>4W&Gt@()oHMu!(3TJWn_3G}?Zw!k_Z>(LBeJY=|US zE_CEcI{*q z?@1*PBNyKIz1F(o#2@&oK*&W-^CopjmViC%u^k&#;dn>N>K^r4VHb*2JWA5QAgjQ8aAHr z_tP?db7#kNI11?7$2$-17xWnoP>Vo09xSz4; zq13V1V*}z}Zi0!^9`(^!2$w&J80^PAmPhYD9=<`oATt}Yk1dJ*Nvk62gwDe$2EIFC zQdtz4iopEe<%G6JcM-}sAE)Z!Xx%1dGyf89`h=9%w7BKHI&`PpLhWB$KK_1x^93@< z7{TSPZU?wqxy=Q1ftW{cw=e&3<_`(?148%(DvUl-IMUl@ zCr=QM6Xyy;X)17KZNK?{yv-j9YyX6d6a7lqtjE5k4xFP2X!+PIYuTnvfc7)vKlwjx zRx#5q50T_M^yl{GkJ;PyVv=SLdPtE#{!MW&8be}vgf0)j0{G{lzhb3gr9_bD3XB+3 zEBRnXR0|6bY!uUNsD-M)v9{pIKCxd*_{g+RpSwulmEMhuBr0akz`tlDAAKwgd?$_2 zAj^V(X==ya<37B&<*cBRh5aopB>(Ga+<4;dyuGiWhj`^F5%(2hB@EewG;-|smv^ST z1HOA#<|GCjC^gln*N7H&+U>AJ-0W1(Y5MKIAF52r8_Wl?4F1SuLt^9WnF5gC(e`;H z`6-qpYtgHie3J^Hp({bE zMkyW?H9tC}n|ydVSKplx;J+mQ#fVe>yj)zDqt;-~MM%dneuWk*6(%i$!T2a)RCg); zPN*d5hhjmCN;-=3P;fw-{C11;ud6ntv!~Ai1R9JaC$ZFunM}}?8tuUOpK%IWyTp7- zteb0q=a;Yj_xzZN;Jmy@jI|oIOvL@-%P&Q1kk_~R(@j{9A%3sTaQEdkO1oT@B)$)O zUJ&pfT5S((H|_`K?|}c#a6ykc{(@}EKS%Qw|7}Hsg53F7tRmV?nrW!ud;@LxDB*Pb zhZnTRGQp&PX(E|X-AwB>1Z2#PzXbRZAKpFi^3itgySY)%ri|!<#LgX7xVYV2>n-B; zW;(+!YM|fl|6z&ao*{g5xh}n`yQ%$~{}HBTVEbf_JyDre>$NoU#g`@(oMUG)!D2^O zrSpC0@k{PtdVj?WjN0&WTe%zYbjkEC^tq$a-jP0!pyh&4|K~^^YM}lUDnLivbO88A z)%QZ#y#@zZ{yvpIoO#Xlk^jZ5SN^4gysZ7!yN9f#zn8tuelx~#jJ?l~-+uPEwgLLnH~$@WK>w5q;D0n{ zK>Pvz|4D5%_yf>4dayJKbE)dT1}aLK(TWI)ss;vhE3^+}5yS{RwD^W+nF!?HC+C6Z zSK9EQy^CGv21|bQQ)>vic80M5_&*hgqVnF1&huD@kK&K>wUt zOZZCE`XM<_znZo_?`6dmrS33dg-gQ>F(hT{T!S%$GBilt9IdK7NTvbDG^|sXBFpplwMY(Ad1XcR)b?= zL9V4+0=u()oRawSP{Ry(+6xi?6i zm%Rxh!Vjd!Jgab~x+K;r`|Ug-VJa5c%#P*HX8Dg}h?ldr5k|9Hka7Ej$TlZ2-ID~u zxk=dXxtlxjULtjX+1E80`2PVdOvQImE8)@jI$-`91XwJXO`%rlsWn(c?I&^G6LUVh zGpO0NR8I;)*Mut}K3<7oBR(!5YDHGYpOY~1(@|fQ0rUSpS9>7--$%=>I0O0@(uRc! zj&b&?KYE#%jpcB>m-0X2{@S9gyx~8sp)yB)zNK>XZdHlR{xCi?a)l~_fd3E=Fn^sX zb|H!;&O@Y8)mKaWKnUo+qLf)T{1_4+P8=P0y8;VyR7G$(UA8+!7YyF?56lb<-n_YC z!iH3ZCMxXuix7Ep6wE0dxJA=d{Ym1VOq1aeS5s|*GIiiP{814QlVP%_(h_Id}WD|>0AH(rhmNv_!sK3s~JhmMrAC2(v4yr z;`TtWx$`_6_AG~W9qs3g|8!pGbH9{Q(W;|rSEoFitgndd5CnwDhsHXbs%#1^c?I|H z9K$<+-rFxaMLZT0BaN_V*B?p#Yi!CfMo)hnW{ZTSe^8-uk~)a8&+IxYHWZ8{tfpg8 zw{W>m)gtU(ID)ZzLSg*53}*-j`2Vcsejp`=@n7iUjAVtXM`@E~FxJ*y;O$w{{aJVG zd9qQ3;4L^_u8rUW&F+v;_L|uwoX@kD`F-2N)h~{jiv96`@eY#7CUXLwQonYtU2^jF zC)p-VOT4V5mfFAh#56><7P7{y*-5WxB8GHycJ&&NRRrTP(W53;WYl&ZzZ*24Z`Wd(^_j9Zr7FXjU$;4VElJ#L@j-qkMd+8BwA(~mui~E}H9!8aw z1y$kKUBBERzjH~ak>Di3d*+~d#F4*j*u8ZKEOKQ< z2)9CL<=S|QwnKk8e;#m>7eOmR!J#T&s4L+O#HfKQ-Fyll5R#(8OxsA0?oVs1;IbTO zQRkaDpvR2vt!A-^GQg<0=`F)QcL+2eiL3naB_G;FJ+ff%K2c9B;tcx&qqKg?kqQOl`m z6n`_v7hT;&A6w|X#5#zsMWuId3^2QMCMZ*@`ZBbyq&d-}cS?rnXso+js<7AMfbnkY zgtvo9IoV-qiAH2D;TsGrMGM;H(@|RC<3Jfo|Be4|{JS^*Gwf4KmfK>OydniiS;5NQO^L$p#lqheQm1!}##DJP9@@LQO6C%(G+NyBIb#E**v4kV|Re zIXMvpc}XlPA873z?Er|+&?D!B%B*$;6J`f)((^D5z%JHCpY`kC2-9Ph=?kQ27326m z=6ZW@sj(TeQ~KSFb~J z8$UM+P$|;F085CLN^-zGK`hHlu8tzg&yS6t9s*=^Qo>%yj&b=!{p zshV{j?dSb`n8hxU1w+DJjAtAEzh6Z;qHbca*ptp-*Q;|%LG3-z`%x*Jkk}tTU(|QN zvdsq3qj#16H-DT4_|O0Q{uLkpTmMTw;Q!)lsymg!=p6Ar{%Z=wC-ej5<`ABXHaMq9 zzHoHn+!PeYn5IMQCJzf~LUgbxi;(mAQo4~#U%BZr^im2Wr~ml>yw#uHiRc(U782BL zDe3yqPCM$n|KXp?pu%M;=}cs&4B?)V&gv9GY1VLS(w>ffNCL~UKZX)5Km0KJl$jGM zD*d_4;{0a&qb9ZEtFXdMCbn~O^i^+KrBoZ2&n=dVpX>I58{>Vc+1?t;%Y5QxU3@mD zuJ4Zpc?);O4+u3lH3r)1_8D^k|9}F)Cg5m|vyqoouDcN;u>$*_`~$16pGq^Pj0|O% zU#{#q3~I2SHii$M2I6mTur`0&ik7uifJ@O_t56xVgPXA0d+T3?ZKc=0f4dSU+EwCk zQvXSVbPYxQv&6BfK|p(N#c(PMhX@^q!i|s;=JA5aqOJYTwK|AdmbuRh#qF< znI>k;7I%e7CCHa~gi-9W-F09y=0O5{J_Jx)4|6K*m@G2PHy8pwkTTj;Yu@siREybg!W~5Ys=beoB1svtq%izULYAO;V+*R zWKE3&@gXC5NVws}QD)9O8Wn*5BQcD@i8zYw8s)~t3RlvXRZCjF&66eGAxh^YS9hkF}{|Fx9jnbzN^y=}tJo&}U$ zIR)}hiHvhaB?jZYPBIC~@t~OX^}$l)OoyeR0R9=kP<9qedmH;w8?I#etQ(B|T)XvW z+&d{);e49W8@DFGKXzG}P@28DyB=b4w_9P1wq$!1JDW?}?{|WWnUbz`?KF_4(3mF# z0}+63ks>8Yee-{F@A_xj!OLoCnG9igNu^$ZY!F{FfM`SW7(|?O=OtqxST7vza)Lx|)-+Myzl3sd}k6 z0R5qQCzqSDFmgODSP7XpN%h~zh-FS%QorhiwF{BV?SYWyYR{%~7O~ZET{}2o&=b6x ztqxB=qR>OYI9vR(my-m8Iw7Xoeq_*QarmOc<=66P0{g^SOMdmVsu`Fnau))jxaNG_ z9_V$|A=Te=jWWHnuE{~YTk4f4nM8~zI;{DdYc*ZAk%m0h>S-&Cki8I-?XP&6 zyAftn^Mp|GoBwGo(0?p;g1gmsTtLSwdGteo|A?Ff83A@}C?geX#6;W5lv7aG%a2G! zRbg9qf$Q&n^gljJeG?ZYfd%lNM1Ap@xGF;r^W7$9&2#T;<+$2r#&Vug-h{estjxLz z&EM!75?^V6`Umj82IB8)annEBCIoJ<@!CYogbbi=o%) z#+H^}&94eWv?ZIT$I1*&sIz2NrRr==_WNT#+OT(M)19N+$G?I^1=jzWUmIHw((w87 zdt|H;J0g)J>Vw6>R`8PEqtiRz0R5G`Ye5Po!OnaF3^!1JhOGD-)(=tv{@b{uBQUiK zwS@am-g%k!EoN?PR8MYtWJW#y#?j+zCwO*M&V5Qo(89m&$BAW$@`a%^I=QvzQ(P(H zeo-Gp1O8itN=*V~m3@tqicIKMFCQc)IhCJ<%dsZMqw7}se|{Z3SqBLEUi3&P4-1p# zCeV$~WuU^!RS#x$UY%8YJ>$Mw24z%&;Be!OJ0+J@~a?rTmR&g@0&b% z&V5pV|H~rG+$7bb)XbksV=tE!aKZttSgb>UbMJX9CkccIB}wK(z~hk2+4eLA0}C|u zjXKp#kEeG`VhEfX6&`AubL<~OL^{q2AL?@Gd@3>Bp@pa%iY8r*d&(rE25mQN^P>Z`ig*59JlqF}kE9jXi==TVL7 zMXPx|T2z`ojifBpirxv0BdqAQV;r<;$k-vnQDieH5LktI#D8+N{Phy<1IB$$I0T$qLeLzTr=A{IfUy$J_n?N4k9^4Ag&-QJ_zAh0IEI`^24j}@d4oV6=8d2B1Wk<8i=g`??VkXVR%eZ)p^A~Lf zKUEI*nO2T!Tp3-{#II)}FbvV*9ECfE3SS6SMC3afS|2h!Kq{KO*)!$bXiY^68TubP zrm*BrKy~&D0rht?^pyZIWAThuX#*8RwI7%A`FI)L5?NPc5)o9vAa0FptdS14V6gcv!mG` zXb&3)4+iiqb{<}>|NsC0D#PeOmuURl zA<|M9n7K5rD+C_%z@(siMvu^<1b>{xal0o%xsH+++(zeN!?J19Z5^1?cMFCm3(Q?p z^yWL*DQytNG_ZqBONTD0^jJZtm9~{1U)r?*PtaG#Ct)OKH~@bGr#yS$NMq@>-V*rg z7jAgq@dxK@d$~r9Y0PA7Nm-m_YuD%Sv$*@mq_po0vUtVd#b}WW(&Lx@yO2g64L2^+ zbK+puxpd&hko;@2@STI_cVF74+rB>uoUTc(zp%hka?IgGUmj=K)~X(;T$-#btcrJA zKbE;-%?R&*ws^0R+>*ZFfh*n3E&D?7J^nM;;tufNAc&D(hp|s!#w$Sr`tR^=ZkvW( zocUtZTSPB=rDUc%1!jt87IhiuVs{Zz=FM$l=8Ue4b;Kq2_+-$y^Y?|`?D6-*#%m2O z5$MD*mYuHUJLZCgx7ck<(pJ_14%^qq`F|sNH|O}3;eUN^f<#SzbJrF{Urg{|Z+?8iJZ)%j_!%5g!s2AXf zNi(<}x)H-QlmvdG(vB)3yJU2aYR*NhRntP01RrBnLtf0NG&4hE#B+nbqFa6C;OHR2 zI05*lT0aUEc1EvCaFrLC@<~vs8SuB=*)$db{SWH%a#jNKuM&$t?{r4})lXR-NdD9i zoL+m1(~A>X;09A5WY$ZeRDa=Ol5L*_n_ls9DI3>|%=x3^(__I?2EJ)bUX^pw{Lnq!?5b$eB+`fxbSjheXr%{)J&%KEX zhN0R}APidpds-4*HD*NV!imGqhL!t7$yY(u;Ys+6YkX5E%tK2;M2B8H%k8bd_ey zSw7F{+sCxqW1}V$jSFF2VzjBkPvMhI5`Kj3wC<_+7Q*nOz1}YkxgBn;A$qV0D5916 zpziV6T8;-bSlV48u>%9m9_g{s35Gx_gi}Wu)ShrUh+H8ao*DBdv6!R_(y9i0sn=J< z3xwisF3`>)^ZrW$ zZ)$=5pRX}6dnkt*m_LPmmw7y|*DsT{FEDXk3ED9X7?B@}r99=?G+e?C4&4D*2p|jl zAI?+{*~HsBhtV=Uxs)?^n#TOV{NZCQ@2xrrlwU+xBr9~a`Wsf7Q7`Hxfj~gw^xV#& zELGpPHA){xs2?267m1t4#&*wX1@zxvIaXP`#S^8_7_m%=_r5&3sq>#31~y1RCj`Opgu*iCNs%(jTMwZL5Xb=9Augs~~$qZ>@} zS?zHWF)#!4d`Zh6l;tl5p6a_vCMNefQ<`Wa^4bC%B&}r5O9F~z$=Y-sE<)tr$nz&&h;8%C@mj7$0saLksqK>~;YqRI~Y`v}J5U-=QX$k4nQsK18k&hnN8+~*$*uOGb ziH|2X=9%P7UQ_9LOhl1mYJXOKDmC7t-tcFLS&^uO7N|1~>w+`d|Oeq6N%9f%#j8wmR3Eyyah^Q`#|6WGDmh zfQn)(YP|gyw%sy8>4F$$80lrY`UWR-Lc+Dn!;dVVOFv8uWoQzG+GPOu-)IooJP!>s zTvIhU1y|#8dzzD>Q`-hLx)2I2gypC1hPnfXyMIEN|6g?SD>lLYb>XVt_Q~a}7TH+J z3vKQYApWKECMERV#1WL@4dP+u=q1kYyRAu=Leq1N1k zMjTE7(0@VrFTz&nbc)*hbqDbYCZ}8g|BpnV|EdG}uNVOTl?M2~ya4|<6VTsr1M?Rz zVE$4D=pXTc`9B4~zk>n%S9$^e!Fu5T4?#4|q&H(6x&!!!q^1jmLn?C31%ZwlPW~gp zgBdK<)Wvo-I=$J!4v%Q@f9rHy5S*kodq3?83{*)RCH+%*MI=GCLi+HSOVl-`tj}Wd z{ygn-Sy8;p!8*T57O{!3XjAv#$i+oW~}R`PvrqtX?Er&;Nc z2%vwa%Z=HQu$kpz#ZugmjV{Q2^Z(5O=AY$2{&}l^YqiysFT`y`8@iAnOhla1dLK7x zDiy>21_AY#J+4p$G5qu+NMTF6=)Rt%kJqyzUn4@L1xpM&u?f!SwyQ{%FPB`jKC$-W zR?X_Kw5J3Qbvfv!>hj-K)-yrW;)~JSiY2!>j ze`<}yuMAIdyw{7Pu0vpJRT{kupB9$#t;`go^X5ZE*eeuxpAC0UC%_UARUlXQ4)3|e zto;j#C3%>!cwzS;aQ>(|98rBFJ0U+}i}%-q`HK1m_OnE3?VGO-)@ELhxcAifCiVhgOTpD`H)u<``b>b1%R|=-v z3vjE0j-TL3k59N|O{cqAz;t>ieEXN3|gWKHbQ+b>-8Jplt>zp!mtLA;wzVG7h)Rx_-@2@ zbdW2X2>7pk#}&LArCY0_1nb^N8ZQ9+2c14qqisvUCaa&}WGnZEYi`(Wy?Jl~bR2y4 zr|57uPoXPx>jH)kxrH=VXD`NK-SsvEQu4Ls#8=lIiR%-Z&h>1gH_2d9lVn_BYU&v~ zLgd^J&l?{X71k?~GuH9TsO<%cv*Xx~cJySE$*eo=%s|_{-@c44g);sXqAvyJ??Pq# zI$w||-cJJO2j`T`y`4XTp2{?)zqyO7SLB+?O|BhUEp{c$xyj@1N4Qk3NES8Wm7-{_ zop*hdV#KTjHuY7^rJ)%WC8Dv$oBzeV;!ZYzzjcn=r!b5uLctp3?ilcal%80b-$PG9 z`nQjFw4DL}amK$L^f18l`O5_8h65PL(F@vfJ5vS&TnIA=8r~sObMPIXk#JvNhEVo? z=5#_SYPS-Os2(Z|4Ywzd8m;{SoZmB%y!6ya44didzQ5ylQ~4)P%9%w5E9NeOQiCa* z?s1N@b$oi@{JYu8@O4m+V&G;Lq7{S35e+uwDUNz^$DpnR;Q36JjA&bF3}0pT{q@@? z_ey>s7uejI;<&;J$eXKgXC^HBQOxW8OS~fh%vDl*2zK@O+?TPhm00QZNv=x!g<%-J zQeC?~uvn}x8wAKIK_tXi!ur#c$ADUqe}ZfU$Z9S8ptke$_h`0b+DOtU$fcJXtSCucm>NT&(C%R3W++x^ zDwNujxyvJRB!-1?jaufc`QiPurJABgOG>f^DPc0U7I6Mt23Ug>ypG6vwDC)>AzA^& z2WsTG63jqSqBPZG7UQ-VhnR1AY;3ikqTk*>W_n7OP9K!?HHAV-Yl-^M-n^`Je zY>hLpJ}6VD$NUcRp@8{gh#5Hl3E&?@0s4P>VE$j3O2%(nyFvo#5Hbs^nkMeAez38H3t##{ zboK1@IUw8Ego<7~CpJvlY?=zu2!E}f!mf(5V!?9^2zEYPE^D46<$z7-v#*oTNl@r zUM5OY;~rV*29#eT#65vCv<}}>E>J_h*ucW!%yHRcY41mjfS+V4Wbdw{W04XGBku=g8T3N zrv>i61>raKcpcYwJxDFxWW5*Hb+VlCoKEsZ^oEO@nuTCkEXAna#KF&kTJ3gu7~d z@20o=|LH&XzuoV^08^{;85)>>5CQWK7wR523vJnkI#ZL!Wq|+mS!X_05Xip@K>lq8 z@TW}xe`*8xho1oagBkGO)Bya)M8q-EYG;HZ+y%Fkvw-@;6sSL%uslG`1o;>wv3mNA zQe*<#yU`c)h)k(Dsa3&RgX>Y_)!L^?54ewdM>p7hQNC#+S1fLnw;RJ$0{_$lb>y4= zsF@$w;^stpAW`VeqVAPW!M^zq>&iKQ$+d?#p=&6gvG8sSD}QgBQoE59!4TR%)+pYd zR;zDUl>GW={~hqZc=LY%{O4y?IhFml4#LbC87Ns)Ow*ZNirwgReuODWXvOZr4bT=ba4sYs$T zHE9U4^;n1&*hn;~Q8i$uwNeR12m|$37I6P>L&4pd$}XVI%QydVdC+AFF*9?82AJ-7 z%q|SogvsL1olaOs<;meA=e*XC=$cO|fcq z3srCX&m5+qjH7`0<38~Io0O0tHbnJ_qIlAr+Y(&=tSs&%Z;uAe%l>UCv(miRD6#A4 zHa@UCsZq;Vcvq$2O4gW8a7zdOY}NG%YbJA>#O~X2UR93PDbf>Z_OW~72je<)1YxMz z=*4T~*maYhP;6s{&zv(9W6C>dmTPTY9v-z&n+1UW?qyRGo|PN$-&#T2XeJsO8FTeM z>W0RV+abk}+87xSVDO*z++1@W*R30W8cJlPHmY>#+1}T6C9WkVc$rU!pGSIk+-R9NJ>{FI;G$<)o+9Q1krYrkaZ%Sa7gEP96jf}TD&1rmR3B5kSL2znbnt_ zmfs20)o$_~kdEXR^m58TQI7fVh#w`ZoZCa+{=d*K8Yu(i2$yJadvE+lv7@@a%#j#p zgWpK^LXj)Ni^}b5IoOS<`&S$#VP-VY&&pKHqJ+OrZCsRUh(%fH2ka6NSvs#bn!ggQ zs}8>Ii2UMXig11@_fasJhf>+LXzR9C{|Wg2*{0<9$O7{(2PLXbeoul^xJ`p2XhRV- zZywxn*VGIr*2hGqofENLt3^?S99b1(wzQ%9kEPiuKZAQSzyzP|61$^PT?s&y9q%`b zQ@>>b`oE(65Q-v|U_yJAfbWj`hFRg5@#a%x*iz#xbQ%@oY*p5FR9@6l>HY?5GMhTy zv?(oONEvpxy5ahFt5wpcEWJWmP^WFUx(|m1cuOcOm`vagJ6Qd;clvGi3s)9j-P&)k z(=vz~g3$!JvWE-mV80Iu;n3MTcYwxeTpcG`$$I0jD98@Ka5yE3m;WX{e=&aQ;)HJX zpdM8vySo0Iuv&U;#HFzIoTT0YMXel70qcI`N8W>9@X@NG`cJF`aR1--|8?h7!E2oX z`s)><$3~*_kw_1j;cn;*IUVD_reS>K5$_x(1F6XeEW_-;Ip^uK-Q>>kI%KY`*U2gG znG%|1MUW-~Wck|jgn;-ru)gL_BF=$U`VH_u_EthiSYu_-*{n$1kwzK|GY*uLY+}01 zbOsp*tV2nSa0v5mPPV%6fBZ5@O1$gtN(Z37Cnv@eoW^_$R9I=4^@TSNg!T<3uPJsRk5z)6@ z2%7R6^-G9`C}OXlVYD0sBAU%IM{bz2W;UhIGce1keE;|vja-XjYdKA!{wwl&9Tz6S zmUagjF1k#zit&x9Ew2X<|3>O~l&wn`7w_^#)JcX25%Lg-eT>SdVzm(L)8pjqyCrOX zJW5mw3dWcE*^2}EPrYGY*Ii7nuX}d}_8#w<7m|l366)QG3lMDI{6{B%Wu)#V^RdEZ zw8N4}1egcOTJ(FaiMlp~P~a-Nq_0Ck68x>RdV?R?F=`OlcqUNvx2*ZQuJZYX8}r%4 zizGw=|0Ose|0m{<@wWl}=Ue}m@OXsh;eP!mtX4mON_K24SmsWW{*L_a*~W)BBqc(_ zkZRZ@o7*nrfA<-|diBsA`7(>oxQwc8A8opI^iZtF;kQ26RXoS?EA{HlA?p=~^U0u~loM~|HY8FL->67?!2U(_iWzk=+?X{oV zo5qI7Euwhsm?_y;FF-g4uLSfGP;R?NGJo&XrKwS^BKSi%XbEOXA~3dr`GbrOX486V zy|jGZtAZque;9!LD*^QX!a)Cz2=xD*K>xo8ynlW`e>Acp;%7EdkO*e&s7kfx=zV4qJ-w}7|{2C#`GKWkl@pa z`bMrzRK}A3(M6fnUfRE&phqw|5x4$GmfkOy4efqN^&C~$>!QbTwR62LCI(!;{i%>4 z+9=?a2ZKCLKflTax0E9>9L#9{g&(+~WP$`{OrByojYB53CX9Y$pX2_SWU-Ku+wu8u z&Q<)qf~r7UdiXp~?gih66os4Q#0Jh~2!F^zu_~+xW&Z0Ncy0RQgH9hYVhdKUV$Oh| zoqw4jei4XK4~YM69DJ&{k*4F%p(_OIJ`B^q{w2&1+Sj;d)t~+ps@rj*QkXyL8@|IK z7w)Z4in{RRL*WG)%QpB1nXIq___y(=`B;M!+D$OPzkl7;q!s%B?BB3LTY-PKJu+(~ zGeXBK-gGVs>^}|=ip)+qa!_Xk;(r>LewYC2TQ@-hJ(0g(Ap}fhqmh!cRH@>_0A7)* z#0D7+q$-v$Nx%>T`d5#WUNdS5jU8PT0@`Li$nYsmfiECs$io#` zP07u#FW9w$pygf9%)B3%YC|8{iDka<+r~pwK!d{gx&L$cHx7)ITDkYn^!g`zYtIpS ze=z#L{3S_>rzPn4s<`8!;sJ#&a029?`B3NsQM~te+h45bbp`RhXgsr@Q9`8Lif=qx zOj*k`yFc*6d6yEA#d=OcvHDYD3_==|MO(a0_XX`nE>aRw=V%CTRKm9PC#HQ#Hl zRGF-e)`XK@2UhfKIfhApSfNu9r~IsyYaNB!SbritWZ`VD&E)L0KMM4Jt*6YORmPuz zm>Qa@)5WA24?!?~Zj%x=OMePA0if|FbXQf#jmZw78u=O?+Kwnu<}Z_uCT~NmG}N7i zqD~hbd$hy~>LPvstj744DkDmFIl%wq9k)09G_vASlT-!OwNTENBI47(ySdV|Z~3Q> z%V=UT1*H6)Z@##y&b%ydyvL_=tcHFq*tonAC5WxxDCim&fehn315XmKNT)JV%A5q3 z1IftP5OqaeE`D7YvQUuABv>Z?&_5cW<6oTVlg|PnMKb=5{4tsFl+KS5!2g=3Ur3K| z)7$yJqMIEC`}~L`HArk*mb0dI@c2zKZFQvUd_ia8O>}AWC zWW(yVRN+Q#S+YS)QP!r|%+KMV~FO|E{~P z1@WIPNYQAuGOCR~X9F?t@~-T$hh2Ko-N3!V$#AsY?$~@5;E7AEI9gi=qSpqt@?JZ? zI}xTNcT#%91?LKUbv-U5A7C(Yq2MZCB7hK1Tmbubjlh}rqLo`hcjUt%>f=^&+w;6O zU`)q4#Jf~ZUv65Jh+c_$H7tX#hU-li#2I0a3J2Wm`3{^TA2uyAkub}4;L&^h?(`vK z?;gLCx(rrYD`igfiKl#T(Yn0RkT=(-+;XA-;vWgXKhXyJAy(AwuW% zKs4*tVhD3m_Z1yV@A;miD;#sB#xm&jWUW(Y-T&be7n@Bf(&e~%7E?Ms&RIKl`*)h8 zrr37KPu@5E8Mi|gSNG3g_yOcN+`2yYSRxbnqawN=$p)cYgNih4X>%<)uf+6WA_;gu z(_`(juNBk?KgYK+ z%zLQ-$-zgj4r_msazKA2g_Uk#P*?bwMh)=)UEqA|{LNJEPrnmmM=rL4mRx2E`yr-3 zIcFlXwt_j>a!Ms|RKYRFHiiB%p799^GiRRTCUw%G(qC{ggl1mkN(AZR9r#ejn)a=Xz8% za(R8Mg?beWAvyD|9$9}CTuv>TJJ0n4ak6ycLFua=NfN{ZcN{&jMUnO~k?25xZW7kUstM%i*KOWPd1vPJ4Uxi+2zU) zu{TPQ*$0FI0ESZW(Cs~;sE|f9Kb(a2JqL2|I7cA!$QR@ z^jl6a!2SPj56lVsJ#V+*Z=c94B3Z8nDOp<`LnLZEiCzpW&66}&b~ zm~y%$lLa%++pR#z^%;Y)s0%~2oM>jm2&NOD?Mh}@g(I&W=A@RBzHI&$l(ggvv8%rk zP~ZRAUG9`s3!Fd8hl~K;JP(HQ*^F4;w!_eM@UD7IlGunzoa}nX&BnPau`!&6;g^cp zLR0ci!U>26TNaTBS#-t81^EB#JI3`>;Wv#d?BSYc5k33FI&rF;$y-(oTw9N|y_O4O z%0~i>NPg#jJHO(f8&gI#aGGn!G3!|?-Ue0ZH_&sN${{b#pzANrR|5Rw<*fdd3Nnn4 zv)l3m0V> z%2fCr+5C0$&kR4JW6HgD@gz*B~icxYAW!C@>NAHRqj{ z_a!r91jh{v&tov|(7JRDMNn3`3{+3Av6o7%a{2|0VzwL4lIfT_dYN#B;sxQG{!ryY zJQDZB34JL(8=(uW(S!f`WxB12sYo@!7Kh@O;oxS}js;ewCr#G2sVXwbO^7 z`>ay6x>&)6xk@fc+CB#X+7DTkQN|}p&N&t7>m&(gJDb10S{Af?l93)PV_RD~qPlL^FMWyv$G>$N9sN>z#pAh=4JX#arinod9k z>hEdb|I_bd(D?%BKM#s~)qi%#ru4^}tgHk0n-?(u$_MZ_RT!vXA|y@tA^`tEiv;|K z0sJivz~B4`0slV$f4T$kr*Z&)l8&(2X9e&lF#vxWtxmBc({Mp<>c;K4c#fQ9+E7IX zR)bd43ZGR*EBae7k_(nr`%(BH0{Sl^p#BdB@IP;0|Bs8C%4!n}+DUx3Wx$Ndfd+$i%4-19OAs)p(B-F4x-kKI#fhp=*~Y5t)^H6UMw%>@*lLW|Q@ z&7vCuUBFO}ib@v7rY9Kf1bXa}vzLOio^3ef^O)A$lIs^@c}1b79imvVW48IKFO1^3 z=HD2;LU6JtgAQbm+dxhB1pcn&$-Crl{=;sVq`_t|neCAldn~3= zUG7@0RqyCHCJpjpq+rDbP!IPg0%I?v3B|CCBJEQKH2kV+;gqCN?x-9%fc=-c$`}npa?h{ksu(eh#FV1_AcT>2Kr&eh11~-6zQC8Rr=D&52|3|_89RbYWIUxU=fagbm`(G1yzCU>W2$=t(nh1`9_>u%2 zZ$das_&7hSa5TpU(<7}cTB)GbU0-CmiL~|n`iU?@-HXhtc8pk4FeW|yTkNwIT!EIM zRD9whk=UTHZc?zuz`Qo@M06mKoq5lN&+PkkNw&PqUY5z=26+5CPCx-p*gRNxeQ@^whtKIFt;?R$E;snvkvcT&uuPYeu+v?cAs zrq{#qVoGc)FXs?mLfZAy?fgH&nK^MFQ52`c-b9LmUBG|l{Q)j6NzilH#`tp>$znPp zzPoCcdnrOd%e(F8G{w6KU5jL7De2M2i3sF;DazEewp6__;mAHzXwubb9{adB=Jls- z;&V-v5OpunSTUrPS3jDq(F!d8^26~4?taO(qB-`|NXeK8YmfC{dc=4AM=#SRpurb};7hlygc4t7}cE;zmlYI~4tV5?2J5f)O=HN1K zaPLhrb^RbL7}=~f7Wm>Xg!9K)vu`YOgCv}D^oI@JaLq}Nt(kwNf(5vL2T7;}+bYjM z-vj@XHW!r8`gK{FQ#i+OS)+yj~ zufA-*Az}gHIr#qO)M&^stv?_M-MwN>0Qr|t>}7wHhT(I5>9esKlyo6UI8t$UPLILf zkK}$o`X?_;e44F&3qJmLe`S4;69@i#{;)#E% zHc~P!KO5urb16{wH2ObQkr%}Y+zAB8$r2c+-4l8V@Y5{Qi1B}a2NAe4Zp#GuuSab3 zKBD5K)bAHqH53d;W`on)3a z?dsL4KKSO7p`7K7q;Wtm`0kAmUnkOZHO~(`^INvkzoo~ zra#)^9`k9HWCAl{NSk+gtOoNTrWFHRG0VAz)X2yrv-AS7JZ5z|t-2g8`gT)$Z>1TO zv_OlEg=c79;4g=Pyg zj7-9BeX*$Y52{Sg{%ftkb*Xx*j-KtI+8jo3Ro>c6Dsrq44zcePwuqlEHdR|f^eD6# zxFJ)<>g*4=9HqG;IcAj6v1^?%NtKK1|HN3S?mf+cp5ha)JjK%?=qo4>!5^nbFzn*D z+}Neg(0u2Lp>=}t02>LC7eQ!{bF*_M**d>}-dt=$Tp%K6Cn@%>Idve|kET`fj%Q!R zSf>G<=J}CAI5$0~=5VS^=efi(j$mYy*4V>}>uDYV)_jaw0DgosBzh?BeUZ|QGHiwT zh2q}x&?7hTp@RAG+2(=MxKF8w7X|PhXAP)V0&ZRKKHvs&$H_kQwyQM5NPf~4Jkb_v%$AnPK%p|CoA8%e3I?Rb!O_~V>3gMJJqp>TR8W7jm?Waw3Rg7B zK>b~AlWu;TKc&I_XD!;qqY?C<(s|iV^fM+`bScg7>4c2xSZQq*R^+|}gn-Ktns>}? z2VOBWOnlci^ZRQfjzVvFHDR(zI6SI6!5xNVG zu%&$!e$qYH6xGW4_hL;%4-V#!NBv{|IF{4-F(a|gov`^>3iI$X2O)5Op?JZJ<2zYD z-(q@~c+KtYytNWU_xS&xc6m_*hIKC;SF@iTRQMq4QkeFugZ`@?l0+mM_Q!J~p06K6 zeOK&@^o_i&c9%v0Z&Ae6kEGV{9V>U*|b+waKVEuxC7`fM$;oJwU3xDzVq0kuSCPpRXk{X*5kuHRCuIF z^Rc`D_%B9<(&4V>^BUTIuc@B{^Pf9G-O#xkrN2qh%mRt{`_u4b{Dqf>bNSBS zWN;Q1C7fn)eGfS2Y^=e0C4yx|GlrBI22_;aJ+EN02l$W7Ks_l7uS34bAegPoZ@ah>HdYu`UJLmCx&usO z8a$5JvLqdQ9ECTL$JUV-eTzFJ5KQxH6;QwF6sWT<9AmGo^b~a)H0VDb^{1;(^I3wrOg#RE(vUGc z4@Y|3|HuD^hd6WH$6UE zZAq_^a=4j4`B$<0MpjP~oi7rr|FU=<`F}sYw>HREs*5k)N9Sq@yH7S|r5T-~t2zV_ zlE};yqHrY9y)x>*HVsx*;AVBW#P4}y`fKiI-49Af@}DWx=v{z+l(*oJE0BgX2^)FO zb7Zhw*ojD`X=sj+VHGCgJ+$;&L)7i~zvuUu=>q(3-bDtPBKfP?6VmI`1_pXJk7rxE zoo9k{KVn{T>ovYVE#*d;y~R^V4PlkSs-bDgM}l8?9VzF#6F8#MdD@JwiO|`iI~;1ApcFK zLB(F*UbrBL^N2B|MI-EWXl*Gqv0BDA!2N7UIITnj_zkI4u{vugPLCQ42#+NxR~ka| z-mddF>gWt;YF}bSi6voH8WJT0;lxK`ctW|8C`l(L5>e%s`XG}`)TzxP<#A)SOGi}1 z40q%%1T=#{f46%v+D+2UV5=nCMhQgt+a=NLSzV~V$IfDI<*{6J^JMTip%6G8d6U)YlGaL>iSA~HM071eq<>B`dvbYJ6M>=wZdf% zB{7$hTJ4`$vvXs9IWjDMe0Wb1vCxsk^NybQ>HSc|KDI6K^}tg%$J64^1H%~|+1?DqJEI1FlX58!T8_ih{1;c6W?^=m(j_jN;U$rH zR?poqq&H>-rqbb|S>9?X9c!I>&0ng)sC6svzEi&6<27UkTSJ&}~AhDoCE-Bz|n zKkm~ODmUcLmU^Tp{4-vpTIU#TYa(S#N{@QMpkKZGhh884vhTjE4#YpsKY|(dg;P$0 zD;(TM`~xjo{eSu2EY@(jlFZ`JSU`vOhJUsY@wo`}k$;}T&&xzJ2Fc)6`*E{Q<`Lf$ zZT?AYNv zo_jHDL0U$=@$`Q)!#SO>gr}Wzic=nj{XW!jwApqb-*y1~fk*v`8lZo)5AY|SK>u?H z_7CsC{_za#A57!H{>MY*{A1mr>2HFds@2s`YF$EnRr!&Ic?(^>*SL2ub;c_}Puf*zY7(Uxf^sL^%{8^M<4 z{01JFe^h3m-7oi{^Ny70T|+8U-0uD4>RDTee%e>Co)9h3Q25L5_TE%Vn34-1{xV(o zHA-p>5k=FWkw$*Oq5ftXEez+s|EBQzLlpV)ur6{_>-Ge=A+Vj9*e@zp9B9h=q*wD zon_H{Yc)jVasPFy?|uU1z<`{I>l}LP4D~h+Y(bnVI-Aj85Q^MweU9J2{VQitv z!4tU)X2I>aAosAg2K}d)yq)CE`@y5LF@S&VUhJmu;Fjp0FO@&Oi=61{GCoU~Z*$w& z$1sfSfatlO9I)0BMcEtF+x0yI{Aa_>_@vO#;T3AN_*o}E{~Xg1wW2>x>lJk8Ogd^R zSfP7ReLm7Lt2AEO9rg+B$)Y()X0ZR)$g@uz^NzZ<&DX(OO+9{Z_oEQzXPW)bN{2ml z(FRjI#~Jpe==w6UH=RU78?iTfO1Ty? zzs^%yl`@S?8wRH!CDXA$NH8A>1hB{|^t;4{Hw!%y2j(1>Ca6Dz zWi##$Xb)Uf&RjN_B7zX-0P?w^L%zHH!R?nLt)GAI>x5h=7}7?*@Uvz;h);P{_x>+ zSb|u9nFoFBBPW?19pl|_h#N&+m4>Xd} zr6*8`nbw8n<-I#meDXC?Z}bH&J-sC+QJfYL)L@Y;3*0~EMK9mp&?Yzk zkx1@DV|ilTEOLBVXD3ho6`QTjGOlC!SX->jn&cu>qyV213j*yM{Gjotq9>P%(x0%r z6^~Zn7@c>Gepxj#9@;T*3wQ00RFAlwQBIy|MBW!n*D-C&wcz+n3H0w}8!Rc!K5w}d zjakh*`P&35BGUzr6Es7A=HPuU>@%y#X3q4iQw#a6d2lM!;q# z-n3JshxL|GKTST8Zo(&_l|+=R51>T(>Za`Ft6`SsFC#0fB{rpt(fwUg63Z z@}d0Y>+b%y?(4S?1yB8S>-yR-DC0lnAqov_2C~kibcJr5FEod_9IyB?r>$ub#N#a; zhi1{T@sUE9nf+uCd)&~})N!3AtpA-A71!KWF9H8aCf;wNK_q3_Mm0Xc7hEw+j6>1m zGf#d?%D>BKl_{`|b@};b_;kTl?3;$T`u(6;-la@8@V{sq%E88oAk~4@KW!W@3*!ra zZ%$ZW*)d?hy>+{}-{eB<`II?nL?U0f9_Zh)#rPt9cL{b`xDnfynxFYx_u|s+tMtzx zv8fiqJo+HbOEUDVRDK^k)gy|Ad{%^j@=wEm419L6e_GXKmD4&L>U_SZ#M#KlceCrK zc~J)ZzkT~VBBNhD&c9tA&&ZBXl^6uR)Q!4|YZ_^?-^Y-G{tF8FuQ+gjc;x@Bg7}vL z^OwnOw~kD_a@u44Ex=R@P6YGUF9fC)41oVdTG3;=p2~Fo1nv)UUg_L@AxgXo#4_pj zp|3VDBy~d9dT0E^;Sl6qxn`@@XkXwzhf;+oj>YehU?_TY`sQp5t$O)4LuBit{&!?Y zVZ{?or#zmgQ=G?0HX{;qOI61I#b0+sZ?kmMAe+%2&2`NLQdn`f!Y9d(q|T4}&$Y)+ z-I;QAT}hPP+DTErx&QXU*ji<1O7S`m$?&dyoY!qdnsKYdovc644;hKIi=DY{l!zv% zTKlf8oP@I@a8~H0Ua!bq#E#w=acc>AO;XMXvhw7=uD`gHL}rcE7dq~tb)H~14N+ED z2ow3rb+_>RqiTN}-FMVWb>Ke=pTiLR^Nk>>j~M%B^S8#ZNpFIpmTnnEU^LlK9Kmw? z`2NMzvT>`Q_(H8WTnMYS6JctsRg`WM#YWwuP(8k1xV^tafH`V+m@3bZp&jja$e8oOwQD)@?D zurEI)|0+@MPYXFMsh^VI+S?$!6JFi14NB5EQ6X!s!v^nP>4{5(ER9A}sdm3adJn&5 zU$1;T&tcOibxc;lLg&5aaj_HChWs6*cNC66rGAQmt%wwwcKz=eXTl^o55`}ADSJyc z-Lj^pO!(5(tA#8#ald3Pjvn|=YEFgIOM?4z!sGpc>^`Of+#du${rLyJzc90qHX`u- zZ2+QoC5f}5Y#nBz<7}@mZMHmHNmtLqp@y6U?``NIaVb)oi)9(K~x08Ahe{qWBI3 zyi}O(Z4=*csT+eFv>#wJrCr8RaUVTiov=`(*Qnxi-#5LwS;k=?TCWm%`+<4&>7tk1 z>>)+eudS`u5=O3zL$D0Qjpzl4l=+~!;*N}$TdMv~T^# za2-fDE-&C;eOk*nUHHncSfHDa^DJ^+xBOO(;xawQsxaK&I{7H+{l>=j-|>87b4P3Z zQy!u}_Kr6^S4=7lQWj=UVi%Yv3CuY-Gm33wbAk&$pc^?wCD#3ADKyW7JP>rx#9fZqC$RlQA@tsw4}L z_X*M5UzndIe-_F#s*ZvG3Q{=5JTIo^T*-~;SZlOS-VBBF=`dT`ux>sjld{>%A^{KLdWn5f*CeqNy%shYcUAL{C z<0;hJ--xsc5hJ0e)_GfXhv>&DcQx19%D4?{R8RSL5A#YeE(hPB7r@sIl0_GrmA-VM z=uB#?-_8Blf~vE5rrCRAD{93*H$}m`$sBTo2$X^Q--5S0$)};1_ErMpBAgkV;pCw( zZZ0nM`qb@8KWCD)m^6TYGoQe{F51b!)6wyHY8t|3eaZJBUaR$IKy}PbN<|~trTY)P zQfKuP6FxtL6%AFS4f7iknqATgc=Op~{#n=Qc8)x0b26@-r{-7K3K$iYL%p|JY<5*^ zkb=d}y-Qw;6VG`61kG5XrsZq*g?cy}GnXG$mPZAK?J<|-VUG5&5#1JFuCVBpVe*Gp zl9(8N%$mu>R2J^UudGz?ph5h--9=p`zg#?qd8H_C)MZcXQBXWk$rcN`VY(Zi>qNJ- zdWWc>m`#V;w&si(v%4bHWG&iH#7rg;yOxu4tJZ^kD;yK`DIWFTHs3qafBq!Eyv*;K z!ttt9Vc@!?q*}Mp{p5(diy+r2QGrQ;E^UXP6C)-5@%~As>9DVu8OQ84qVaj|jo0wt zbA8iB7c_AH(u3>}=D=HAZ?N~bCt5}KU^MgCvKdL`FP+ctP);Ax;wM z7zf)#9DnN8SR&`7`EsH#=*;I*BZY6W1ZuBOC z=uLP5I|R9HFeClCzsPgL-(J5;W^AZ_-PnSMbGbHUx}PIs5Bx{_Pa%~*BxMzdnubGw zU4^ul_TO2APk9)1V($s8M|$Ndlb@4Xw$&4ixig;BUV7o>JJ*M>;$fm2dZe$lGWS~Ud3T#Q|Q9BnPs95I;XbZ-Pn_^SV=7cQ2If~D&ws%gEndVC5)f-JpYb>l=RN#Sb>tePs@ zJA7#5%b>ZvGrkIe(7i;ZB0GP3Q#Z{E9jwEEv$aMPDV96%^@<4r{ac)sr8%TTV=7{f z>%CZwI<<}M38jzi%P}p=#%`0apbF)SJt^JT@NeaUI`1Mox>o#u2*!I3p$8uk>RJ%1$uapk* z1$+GbhSku-UKoa|FC$7S2jrj@qFcPCEp_y~YG{s*85`fULI15=9rMO*=U)gXTy+XF zX)^0#J6e9=);G>dg^*QGb?(;sh%-#VQ4SkCKa0yIxM}f#0$O`!uiMKF3@-0;X{*Bj|BK1PRCC;$cdmfYvBFk*Hjkvx_n~I;Cw|kYW@xR{kxa7`G( zGOlRHcGEhUud&lsi6pZtl)iRC8f89|;WZ&jt_D(~C%cY)oS{fkZ9eDKSr}0JcmB%> z@c&^%tJ|N5!;z#+G*}U_T1~Uj?_<2!Rt@}+k!sk(HePvVxj2a-62wkHRDF~XT*#GJ znyr_ztuEZensYBzr-J+la90rLRNlZx^cE<8r{^T5V&0rm6c6zlH0>4~$>oK9z-w@b z&iyW;A%nomqY#t-ifnB#DP~M`Egf?`qB^F`HDCN^=Wk@b&H&}4D|(VQO%Hal%@w1* z4Xe&#L8lm8Km0yQVtW$7@-T262^Q#QsPs4JID(;BMEMci9TwgM`=~2$?hg?{>;nJ2zkO-C@YI?o>Vt?L05R0{S10d>B(a zgqv=zM=x@Qmu{{{-Ht05fUpP=@JN z?#uE)KAoZ7O#OUJD)9fay3mO9mie8rAf5eS*N1;EP<|k8A=F94NFX?>Dqhg@%T9J4 zTFS4Tf<*Wz!Mj6DVy*Y#a-3%CLQu_?j<$^&vZ_eMl}(5GYezKmBelO3u$kv*V4 zv5))z@pqvj+`lnQ1N#iK+iC~*znD+%6xsOs=v@GRSq|dQ3E)qwK>t4t`hV}$`xvZ5 zEvkg)@Y&}8|5OS54;YSF4IyCv{sQ#>OJM&lGkuo1qw7Yr_)~h-u z%ppUx|J?7a2fYw4`MND6g>NP>0{)LGlwlh}H+;k?d#rvXa>eRPcWx7$@#|6t3jF_M zfd0BxA3UC*uDDx$^vR@t5$&t8Vit|V0LxswG@ewb*W~rABz&akoy>c0YFwr42*_=N z6lv>es=|k4@czYgYzDL3^UK81*m^RA$U%j6+DbQTTL(hH+gj$dpbmtUH3~G-WL68e?Wm8+$RJ7^~dk;57<9E z^6v!x5X_W;`O|_wq)mXE)esK$AI9MOGXnk_JXRL-MZIdlQyMezoWe{iVT%Z%KMeSk zkrW^Gr&{JFwCjfFXOu>M!Hot`iHQGRtc&X(nZJ-S0sep8bVbX9u}-RRu^tx$1{ATn zG8Bg=5R8Y=CKRi7P8vFd^nI1F0dG*{5<>K-rCpZ;Ic8-$6^bFd_^EAMj3)IQNDlF7i3G)!?-cU=VsY$d1Vqvi zQ760wIR&c(0RA`g-@5-p&yUyPFEGXFXUuwz&a>BEH)C32_3_f0(!xf`qG%1mH;i*v z16&2~4%MwZts6Ama)VqD9b*4`enu->^63q#&^zYZ2$>h^du@#!xIy)&lnPq(XI zj$1txzl4&kQyK88QvU$|1-gV*d0d8JQCJ)|tn8cRQH?f>5nj_gnExrj{`nH{&mZ;A zBf$PS4e;O4K>lF^`KP|Z?{?AMfUO$f4_*TO>vq8(Tk5q!GwC4zC?^rh6=CBVih}$j zqS#ScZ0?g52ln5GJ9)wO-Y}NSs2uO5LwB=#rgzHNDVq7k&)io5=58b922g zqDIKbeEu{DMR!gkD$RWBk$=((_V17R4-TGx2lNj-!T$ZvQgxngdY7p|O=%4IlF@fB z$ar22{y%xeaQl(&rJBlVXP!ZM%RmjH5gB#mD=jgkIMGQR~N)8NfgIlGf+F{2%^0JZesBGYE6paZs+MP#2!@0!2`=(AqK&`X63rb0W@9Bn9qKazLUxSv@1dZ zS%D9QHMT;ipot#20*bbES>DE<&op5cNtnU4@PdXA<^p zkG1=Ct_fR%tXo~zm8F^h-oC$*>@#usPr`l35wk>HXdcBDX(-zGJp!2OyZ@FsQrOcu z&xevOv;7CZd>H$98e|qU8I)&FP@`v<67q3qsjG(mWX6Td=~<~$MVVKFiRIyectiYR zBdnV}O%|$lB2>$m&95nGmnmP@$wZ}e&?z8TR7~7D-Y64WcGeub`z+?~xGrq$BPR7R zq^Dqck=|q7ga$=MJH_$x6m07is5kl?$6E;*+?vlZW%0=*jRH1gG9? za&8I84K!UnNZSh%SW{DciXLjMck*p1t&*TKgSM%-3hO1*G8FKs7JJjFR~F2KK8w|&-`O3;&0SHP>o z)CU*+i~g^~>qB@Wx;8qb^ll0hK5ow`Qu>z;!$Z;5|AqtLe;)mZX5k?@!T^8H2=ebZ z$iLEt%8ilW{{DJJEqEN@-=8M$t;m7-t3Xy4^)I+TJ?c-uFgM;={#4uz0R8`C{O##i#Ru)iEl~6C@Uw zwmmAQhpK0H{8Z{>i&CftCH#6!-R?2MY=D0s&c3pPxKW1N)}x%C@*%OYYIs`+!*)QgPo5?zLluhSSaK7}9gHVWGyqDE0DZepIVoLu7W zO;(!|l3=`M0mlZmSmL-)VPuvHP)n7Qq-34_NcxYID1&J4j(-Sa~bAg`g(IhEx|OZACw;h(@X zsANx&dW*V%DN!0(sxd?T9=V>IB&Wg?C$f*&^qn5O`aVRMI&-s|c>_`75NDPtGzNwQ zdzk&|Nm=P`NkWOQO7L=#$bIEkDhg}f7N%dyj;TuxkY~F!^3GI2%=oO8fSq>ZF)8lE zD9qg%Gx9W6S!%TLc?Bg^ z?&q2;-*Ydi>EF{uxc#DvA}DJR&kt$rCCd|I+5u4iPP9?l0P?n33IBuB&rXe{7=dN7NRTu^g(_0LP*9wKTa(|3&?g@SE=83|ZgNywu#UZ@Sim@c8 zr57?_AI!O()>3eGX=wSHnzlPbkpebLT^bb7>ifJEm!HX0HbOe58riHMS4Ww98Xt?r;phH3~pRh<;F_cjm#bDj8GQi|1dxYaD?eP;SAJ^wabSrYxp)RGcoL8s+@06pYiAo!ly%%P3EayGT6wJHN=xRmGMIh z3msK6KQg}V4Gw1PAok)LW$CHo?uwNsTDaK({dah#P(v?8+LeQ9>`~ibtBhS4RtpkY zn++lJDsFp_?`>UNow?|RpBVfsf6xx}KN>kSJI6C|vWs`dvm|5+pDYH>1}1W~$b$g? zvQP?(GpOG8hKG%TlzujAq-9mA+Eia|3TEw`6Nu`R~tEqK6Ps63A)g)jrXJ`m02 zXmmnv!*!z;8a7m`s6SCTcYB30^DrjdPszNED{gO5Rv6gy@O?8Vu*?YDAGAz7G@Ms= z&NJd<>F-R~l5=3xwqNgKBEkK^D-zrvG_fZA9`6qWv*l|@sqypR{z*NeoCedf$Z?)j zlemz8f7%N2?{>C)nsv&6~Zta9jEMNB2!b#>KBI~6a zKdDxF|4czrcd$vU8YWCb9P{gq8QO+LxH0cnMqY~)GQ6nxAIOP+^E7zXuz%<1tc&JC z+i8}c$fc8o;5GjYmmt_4C;uX%M&4ieBK=~3H(~6>dOp&>l7DZL>-YYJ@OYm+pjt|Q z%7VYgW4tfUpDNv}yJomCUfsrZx!NAte97t~l81p8*ehK6t=3_q*}^|Ho9I4z&f#F) zc~j`q0mj8!K}y5)8&9iT(o8%H9-~0AQR=xYn{es$(Ru0?JF@3xhvMR*tZsXVMK53p zy0Ue_0|0+WS#RQjok1hAEe`fy_{OZ^w{TNuFn>MrpLEp;W{d{Yrfjlzoh0g6gB#HG zzJ|MuK?D3l4}z-U4i;XZe+uiO9#+cB4y2zkysV#xhiaT{oCi5` zt_3pugT##;Vkan^D1KeKtcU{jUXy^5>+$)cVM73aq7M8&-t<8C&o48-d=yb6!oT

8%rs;a(P`XdbUDgQ$#n@yhfE)y6}TL$Y$K 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 Q$>I2@5C^@ri<0;Ie`W{pmjD0& literal 0 HcmV?d00001 diff --git a/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by phdlee ( CEC )/cec_0.3BC.bin b/Firmware/UNIVERSAL FIRMWARE ( All Radios - UV-K5, UV-K5(8), UV-K6, UV-5R Plus, etc...)/Custom Firmware by phdlee ( CEC )/cec_0.3BC.bin new file mode 100644 index 0000000000000000000000000000000000000000..568dc2d624eb5afac825c2a49d5c1741920764a2 GIT binary patch literal 61174 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