diff --git a/doc/浇筑系统对接接口文档-20251020.doc b/doc/浇筑系统对接接口文档-20251020.doc new file mode 100644 index 0000000..010fe5b Binary files /dev/null and b/doc/浇筑系统对接接口文档-20251020.doc differ diff --git a/doc/郑少宝-生产信息接口文档-20250911.doc b/doc/郑少宝-生产信息接口文档-20250911.doc new file mode 100644 index 0000000..e9cc5fb Binary files /dev/null and b/doc/郑少宝-生产信息接口文档-20250911.doc differ diff --git a/hardware/RFID/command_hex.py b/hardware/RFID/command_hex.py new file mode 100644 index 0000000..3448350 --- /dev/null +++ b/hardware/RFID/command_hex.py @@ -0,0 +1,536 @@ +from .crc16 import crc16 +class command_hex: + """ + 命令十六进制转换模块 + 提供将十六进制和RFID参数的转换 + + """ +#region RFID 工作模式(可设置主动模式推送信息) + @staticmethod + def build_set_mode_command(address, read_mode=0, mode_state=0, mem_inven=1, + first_adr=0, word_num=1, tag_filt_time=0)->bytes: + """ + 构建设置读写器工作模式的指令(命令0x35) + 工作模式中可设置主动模式下的起始地址,推送的存储区,以及标签输出间隔时间 + 参数: + address: 读写器地址(0xXX格式) + read_mode: 工作模式选择 (0=应答模式, 1=主动模式, 2=触发模式低电平, 3=触发模式高电平) + mode_state: 输出方式和其他设置 + Bit1: 0=韦根输出, 1=RS232输出 + Bit2: 0=开蜂鸣器, 1=关蜂鸣器 + Bit3: 0=First_Adr为字地址, 1=First_Adr为字节地址 + mem_inven: 存储区选择 (0=保留区, 1=EPC, 2=TID, 3=用户, 4=多张查询, 5=单张查询, 6=多张TID询查) + first_adr: 起始地址 + word_num: 读取字数量 (1-32) + tag_filt_time: 主动模式下标签输出间隔时间 (0-255)*1s + + 返回: + bytes: 完整的命令字节串,包含CRC校验 + """ + # 验证参数 + if word_num < 1 or word_num > 32: + raise ValueError("Word_Num必须在1-32范围内") + + if mem_inven not in [0, 1, 2, 3, 4, 5, 6]: + raise ValueError("Mem_Inven参数无效") + + # 构建命令帧 + length = 0x0A # 命令长度 + cmd = 0x35 # 命令代码 + + # 构建数据部分 + data = [ + read_mode & 0xFF, + mode_state & 0xFF, + mem_inven & 0xFF, + first_adr & 0xFF, + word_num & 0xFF, + tag_filt_time & 0xFF + ] + + # 构建命令帧 + frame = [length, address & 0xFF, cmd] + data + + # 计算CRC16 + crc_value = crc16.cal(frame) + + # 添加CRC(LSB在前,MSB在后) + frame.append(crc_value & 0xFF) # LSB + frame.append((crc_value >> 8) & 0xFF) # MSB + + return bytes(frame) + + @staticmethod + def parse_set_mode_hex(response)->bool: + """ + 解析设置工作模式命令的应答数据 + + 参数: + response: 读写器返回的完整应答数据 + + 返回: + bool: True表示设置成功,False表示失败 + """ + if len(response)<=1 or len(response) != response[0]+1: # 0x05 + 2字节CRC = 7字节 + raise ValueError("应答数据长度不正确") + + if response[2] != 0x35: # 确认是0x35命令的应答 + raise ValueError("应答命令不匹配") + + if not crc16.verify(response): + raise ValueError("CRC校验失败") + + return response[3] == 0x00 # 0x00表示成功 + + @staticmethod + def build_read_mode_command(address)->bytes: + """ + 读取读写器工作模式参数的指令 + + 参数: + address: 读写器地址(0xXX格式) + + 返回: + bytes: 完整的命令字节串,包含CRC校验 + """ + # 构建命令帧 + length = 0x04 # 命令长度 + cmd = 0x36 # 命令代码 + + # 构建命令帧 + frame = [length, address & 0xFF, cmd] + + # 计算CRC16 + crc_value = crc16.cal(frame) + + # 添加CRC(LSB在前,MSB在后) + frame.append(crc_value & 0xFF) # LSB + frame.append((crc_value >> 8) & 0xFF) # MSB + + return bytes(frame) + + @staticmethod + def parse_read_mode_hex(response)->dict: + """ + 解析读取工作模式参数命令的应答数据 + + 参数: + response: 读写器返回的完整应答数据(包含CRC校验) + + 返回: + dict: 解析后的参数字典 + """ + if len(response)<=1 or len(response) != response[0]+1: # 0x11 = 19字节 + raise ValueError("应答数据长度不正确") + + if response[2] != 0x36: # 确认是0x36命令的应答 + raise ValueError("应答命令不匹配") + + if response[3] != 0x00: # 检查状态是否成功 + raise ValueError(f"命令执行失败,状态码: {response[3]:02X}") + + if not crc16.verify(response): + raise ValueError("CRC校验失败") + + # 解析参数 + params = { + # 韦根参数 + 'wg_mode': response[4], + 'wg_data_interval': response[5], + 'wg_pulse_width': response[6], + 'wg_pulse_interval': response[7], + # 工作模式参数 + 'read_mode': response[8], + 'mode_state': response[9], + 'mem_inven': response[10], + 'first_adr': response[11], + 'word_num': response[12], + 'tag_filt_time': response[13], + 'reserved1': response[14], + 'reserved2': response[15] + } + + return params + +#endregion RFID 工作模式 + +#region RFID 功率设置(距离远近) + @staticmethod + def build_set_power_command(address, power_value)->bytes: + """ + 构建设置读写器功率的命令(命令0x2F) + + 参数: + address: 读写器地址(0xXX格式) + power_value: 功率值(十进制,范围0~26,单位dBm) + + 返回: + bytes: 完整的命令字节串,包含CRC校验 + """ + # 验证功率参数范围 + if power_value < 0 or power_value > 26: + raise ValueError("功率值必须在0~26范围内") + + # 构建命令帧 + length = 0x05 # 命令长度 + cmd = 0x2F # 命令代码 + + # 构建命令帧 + frame = [length, address & 0xFF, cmd, power_value & 0xFF] + + # 计算CRC16 + crc_value = crc16.cal(frame) + + # 添加CRC(LSB在前,MSB在后) + frame.append(crc_value & 0xFF) # LSB + frame.append((crc_value >> 8) & 0xFF) # MSB + + return bytes(frame) + + @staticmethod + def parse_set_power_hex(response)->bool: + """ + 解析设置功率命令的应答数据 + + 参数: + response: 读写器返回的完整应答数据 + + 返回: + bool: True表示设置成功,False表示失败 + """ + if len(response)<=1 or len(response) != response[0]+1: # 0x05 + 2字节CRC = 7字节 + raise ValueError("应答数据长度不正确") + + if response[2] != 0x2F: # 确认是0x2F命令的应答 + raise ValueError("应答命令不匹配") + + if not crc16.verify(response): + raise ValueError("CRC校验失败") + + return response[3] == 0x00 # 0x00表示成功 + +#endregion RFID 功率设置 + +#region 接触模式中的读卡间隔设置 + @staticmethod + def build_trigger_delay_command(address, trigger_time): + """ + 构建主动模式触发延时设置命令(命令0x3B) + + 参数: + address: 读写器地址(0xXX格式) + trigger_time: 触发有效时间(范围0~254,单位秒;255表示获取当前设置) + + 返回: + bytes: 完整的命令字节串,包含CRC校验 + """ + # 验证触发时间参数范围 + if trigger_time < 0 or trigger_time > 255: + raise ValueError("触发时间必须在0~255范围内") + + # 构建命令帧 + length = 0x05 # 命令长度 + cmd = 0x3B # 命令代码 + + # 构建命令帧 + frame = [length, address & 0xFF, cmd, trigger_time & 0xFF] + + # 计算CRC16 + crc_value = crc16.cal(frame) + + # 添加CRC(LSB在前,MSB在后) + frame.append(crc_value & 0xFF) # LSB + frame.append((crc_value >> 8) & 0xFF) # MSB + + return bytes(frame) + + @staticmethod + def parse_trigger_delay_hex(response): + """ + 解析触发延时设置命令的应答数据 + + 参数: + response: 读写器返回的完整应答数据 + + 返回: + int: 当前触发有效时间值(0~254),表示秒数 + """ + if len(response)<=1 or len(response) != response[0]+1: # 0x06 + 2字节CRC = 8字节 + raise ValueError("应答数据长度不正确") + + if response[2] != 0x3B: # 确认是0x3B命令的应答 + raise ValueError("应答命令不匹配") + + if not crc16.verify(response): + raise ValueError("CRC校验失败") + + if response[3] != 0x00: # 检查状态是否成功 + raise ValueError(f"命令执行失败,状态码: {response[3]:02X}") + + # 返回触发时间值 + return response[4] + #endregion 接触模式中的读卡间隔设置 + +#region 接触模式中的读卡间隔设置 + @staticmethod + def build_set_readinterval_command(address, delay_time)->bytes: + """ + 构建设置主动模式读卡间隔命令(命令0x42) + + 参数: + address: 读写器地址(0xXX格式) + delay_time: 读卡间隔时间(范围0~254,单位毫秒;255表示读取参数) + + 返回: + bytes: 完整的命令字节串,包含CRC校验 + """ + # 验证间隔时间参数范围 + if delay_time < 0 or delay_time > 255: + raise ValueError("间隔时间必须在0~255范围内") + + # 构建命令帧 + length = 0x05 # 命令长度 + cmd = 0x42 # 命令代码 + + # 构建命令帧 + frame = [length, address & 0xFF, cmd, delay_time & 0xFF] + + # 计算CRC16 + crc_value = crc16.cal(frame) + + # 添加CRC(LSB在前,MSB在后) + frame.append(crc_value & 0xFF) # LSB + frame.append((crc_value >> 8) & 0xFF) # MSB + + return bytes(frame) + + @staticmethod + def parse_set_readinterval_hex(response)->bool: + """ + 解析设置主动模式读卡间隔命令的应答数据 + + 参数: + response: 读写器返回的完整应答数据 + + 返回: + bool: True表示设置成功,False表示失败 + """ + if len(response)<=1 or len(response) != response[0]+1: # 0x05 + 2字节CRC = 7字节 + raise ValueError("应答数据长度不正确") + + if response[2] != 0x42: # 确认是0x42命令的应答 + raise ValueError("应答命令不匹配") + + if not crc16.verify(response): + raise ValueError("CRC校验失败") + + return response[3] == 0x00 # 0x00表示成功 + +#endregion 接触模式中的读卡间隔设置 + +#region 获取读写器信息 + @staticmethod + def build_reader_info_command(address): + """ + 构建读取读写器信息命令(命令0x21) + + 参数: + address: 读写器地址(0xXX格式) + + 返回: + bytes: 完整的命令字节串,包含CRC校验 + """ + # 构建命令帧 + length = 0x04 # 命令长度 + cmd = 0x21 # 命令代码 + + # 构建命令帧 + frame = [length, address & 0xFF, cmd] + + # 计算CRC16 + crc_value = crc16.cal(frame) + + # 添加CRC(LSB在前,MSB在后) + frame.append(crc_value & 0xFF) # LSB + frame.append((crc_value >> 8) & 0xFF) # MSB + + return bytes(frame) + + @staticmethod + def parse_reader_info_hex(response): + """ + 解析读取读写器信息命令的应答数据 + + 参数: + response: 读写器返回的完整应答数据(包含CRC校验) + + 返回: + dict: 解析后的读写器信息字典 + """ + # 根据文档和实际测试,有效应答应至少包含基本信息部分 + if len(response)<=1 or len(response) != response[0]+1: # 至少需要包含基本部分 + raise ValueError(f"应答数据长度不正确,预期至少13字节,实际收到{len(response)}字节") + + if response[2] != 0x21: # 确认是0x21命令的应答 + raise ValueError("应答命令不匹配") + + if response[3] != 0x00: # 检查状态是否成功 + raise ValueError(f"命令执行失败,状态码: {response[3]:02X}") + + if not crc16.verify(response): + raise ValueError("CRC校验失败") + + # 解析版本号(2字节) + version_main = response[4] # 主版本号 + version_sub = response[5] # 子版本号 + version_str = f"{version_main}.{version_sub}" + + # 解析读写器类型 + reader_type = response[6] + reader_type_desc = "UHFReader2001" if reader_type == 0x89 else f"未知类型(0x{reader_type:02X})" + + # 解析协议支持信息 + protocol_support = response[7] + support_6c = bool(protocol_support & 0x02) # Bit1 + support_6b = bool(protocol_support & 0x01) # Bit0 + + # 解析频率信息 + max_freq = response[8] + min_freq = response[9] + + # 解析频段设置 + max_freq_band_bits = (max_freq >> 6) & 0x03 # Bit7-Bit6 + min_freq_band_bits = (min_freq >> 6) & 0x03 # Bit7-Bit6 + + # 根据频段设置位确定频段 + freq_band = "未知" + if max_freq_band_bits == 0x00: + if min_freq_band_bits == 0x00: + freq_band = "保留" + elif min_freq_band_bits == 0x01: + freq_band = "Chinese band2" + elif min_freq_band_bits == 0x02: + freq_band = "US band" + elif min_freq_band_bits == 0x03: + freq_band = "Korean band" + elif max_freq_band_bits == 0x01 and min_freq_band_bits == 0x00: + freq_band = "EU band" + + # 解析实际频率值(忽略频段设置位) + actual_max_freq = max_freq & 0x3F # 清除Bit7-Bit6 + actual_min_freq = min_freq & 0x3F # 清除Bit7-Bit6 + + # 解析功率 + power = response[10] + + # 解析询查时间(已作废) + scntm = response[11] + + # 构建返回数据 + reader_info = { + 'version': version_str, + 'version_main': version_main, + 'version_sub': version_sub, + 'reader_type': reader_type, + 'reader_type_desc': reader_type_desc, + 'protocol_support': protocol_support, + 'support_18000_6c': support_6c, + 'support_18000_6b': support_6b, + 'max_freq_raw': max_freq, + 'min_freq_raw': min_freq, + 'max_freq_value': actual_max_freq, + 'min_freq_value': actual_min_freq, + 'freq_band': freq_band, + 'power': power, + 'scntm': scntm, + 'reserved1': response[11], + 'reserved2': response[12] + } + + return reader_info + +#endregion 获取读写器信息 + +#region 解析18000-6C协议,用户区数据 + @staticmethod + def parse_user_data_hex(response)->str: + """ + 解析18000-6C协议的读取数据应答(命令0xEE) + 当读写器支持18000-6C协议,Mem_Inven为0x00~0x03时使用 + + 数据格式: + Len Adr reCmd Status Data[] CRC-16 + 0xXX 0xXX 0xEE 0x00 Word1,Word2,… LSB MSB + + 参数: + response: 读写器返回的完整应答数据(包含CRC校验) + + 返回: + - loc_string: 将数据转换为ASCII字符串 + """ + + # 寻找连续三个0x2C的情况 + for idx in range(len(response) - 2): + if response[idx] == 0x2C and response[idx+1] == 0x2C and response[idx+2] == 0x2C: + response=response[:idx] + # 验证响应长度 + if len(response) <= 1 or len(response) != response[0] + 1: + raise ValueError("应答数据长度不正确") + + # 验证是否为0xEE命令的应答 + if response[2] != 0xEE: + raise ValueError("应答命令不匹配,预期0xEE") + + # 检查执行状态 + status = response[3] + if status != 0x00: + raise ValueError(f"命令执行失败,状态码: {status:02X}") + + # 验证CRC校验 + if not crc16.verify(response): + raise ValueError("CRC校验失败") + + # 提取Data[]部分(不包含CRC字节) + # 数据部分从第4个字节开始(索引3),直到倒数第2个字节(不含CRC) + data_part = response[4:-2] + + # 过滤掉null字符(0x00),这些字符在ASCII解码后通常不可见但会占用字符串长度 + data_part = bytes([b for b in data_part if b != 0x00]) + loc_string = '' + if data_part: + try: + loc_string = data_part.decode('ascii') + except UnicodeDecodeError: + print(f"无法将数据转换为ASCII字符串: {data_part}") + return loc_string + +#endregion 解析18000-6C协议,用户区数据 + +if __name__ == "__main__": + print("\n测试解析18000-6C协议数据响应(示例):") + # 假设的18000-6C数据响应(长度为0x0C,包含4个字节的Data部分,2个字) + # 示例数据:Len=0x0C, Adr=0x00, reCmd=0xEE, Status=0x00, Data=[0x12,0x34,0x56,0x78], CRC=计算值 + # 构建测试数据 + test_data_6c = [ + 0x21, # 长度 + 0x00, # 地址 + 0xEE, # 命令 + 0x00, # 状态成功 +0x53, 0x48, 0x52, 0x32, 0x42, 0x32, 0x2D, 0x31, 0x32, 0x2C, 0x42, 0x32, 0x2C, 0x36, 0x36, 0x30, 0x30, 0x2A, 0x31, 0x35, 0x30, 0x30, 0x2C, 0x31, 0x2E, 0x39, 0x31, 0x30 + ] + # 计算CRC并添加到数据末尾 + crc_value = crc16.cal(test_data_6c) + test_data_6c.append(crc_value & 0xFF) # LSB + test_data_6c.append((crc_value >> 8) & 0xFF) # MSB + + test_data_6c_bytes = bytes(test_data_6c) + print(f"测试数据: {' '.join(f'{b:02X}' for b in test_data_6c_bytes)}") + test_data_6c.append(0x2C) + test_data_6c.append(0x2C) + test_data_6c.append(0x2C) + try: + parsed_6c_data =command_hex.parse_user_data_hex(test_data_6c_bytes) + print("解析结果:") + print(f" ASCII字符串: {parsed_6c_data}") + except Exception as e: + print(f"解析错误: {e}") \ No newline at end of file diff --git a/hardware/RFID/crc16.py b/hardware/RFID/crc16.py new file mode 100644 index 0000000..6f99c02 --- /dev/null +++ b/hardware/RFID/crc16.py @@ -0,0 +1,69 @@ +class crc16: + """ + CRC16校验函数 + """ + @staticmethod + def cal(data_bytes): + """ + 计算CRC16校验值(不包含最后两个字节的CRC) + + 参数: + data_bytes: 要计算CRC16的字节数据,可以是bytes、bytearray或整数列表 + + 返回: + int: 计算得到的CRC16校验值 + """ + PRESET_VALUE = 0xFFFF + POLYNOMIAL = 0x8408 + # 初始化CRC值 + crc_value = PRESET_VALUE + length = len(data_bytes) + + # 处理每个字节 + for i in range(length): + # 获取当前字节(确保是0-255范围内的整数) + current_byte = data_bytes[i] & 0xFF + # 与当前CRC值异或 + crc_value ^= current_byte + # 处理每个位 + for j in range(8): + # 检查最低位 + if crc_value & 0x0001: + # 最低位为1,右移后与多项式异或 + crc_value = (crc_value >> 1) ^ POLYNOMIAL + else: + # 最低位为0,仅右移 + crc_value = crc_value >> 1 + # 确保crc_value是16位无符号整数 + crc_value &= 0xFFFF + + return crc_value + + @staticmethod + def verify(data_bytes): + """ + 验证数据后两位的CRC MSB和LSB是否正确 + + 参数: + data_bytes: 要验证CRC16的字节数据,可以是bytes、bytearray或整数列表 + + 返回: + bool: True表示CRC验证通过,False表示验证失败 + """ + if len(data_bytes) < 2: + raise ValueError("数据长度至少需要2字节以包含CRC校验值") + + # 提取数据部分(除去最后两个CRC字节) + data_part = data_bytes[:-2] + # 提取接收到的CRC值(LSB在前,MSB在后) + received_crc_lsb = data_bytes[-2] + received_crc_msb = data_bytes[-1] + received_crc = (received_crc_msb << 8) | received_crc_lsb + + # 计算数据部分的CRC值 + calculated_crc = crc16.cal(data_part) + + # 比较计算得到的CRC值和接收到的CRC值 + return calculated_crc == received_crc + + \ No newline at end of file diff --git a/hardware/RFID/rfid_service.py b/hardware/RFID/rfid_service.py new file mode 100644 index 0000000..6eaa2b3 --- /dev/null +++ b/hardware/RFID/rfid_service.py @@ -0,0 +1,513 @@ +import socket +import threading +import time +import binascii +from typing import Optional, Callable, Dict, Any, Set +from collections import Counter +from .crc16 import crc16 +from .command_hex import command_hex + + +class rfid_service: + """ + RFID读写器服务 + """ + def __init__(self, host='192.168.1.190', port=6000): + """ + 初始化RFID控制器 + + 参数: + host: RFID读写器IP地址 + port: RFID读写器端口号 + """ + self.host = host + self.port = port + self._thread_signal = False + self._receive_thread = None + self._callback = None + self._pause_receive = False + + self._data_buffer = [] # 收到推送的数据 + self._last_collect_time = None + self._data_lock = threading.Lock() # 用于保护数据缓冲区的锁 + + # 需要过滤掉的数据(字符串) + self._filter_value = None + + self.check_time_seconds = 60.0 # 采集数据时间(秒) + # 超时设置 + self._connect_timeout = 5.0 # 连接超时时间(秒) + self.client_socket = None + self.connected = False + #链接失败次数 + self._error_count = 0 + # #30个字(读卡器工作模式中设定)+2字节CRC+4字节 len+0x00+oxEE+0x00 + self._buffer_length=66 + #设置读取命令设置时连接最大次数 + self._max_command_count=3 + + + def CreatConnect(self)->bool: + try: + if self.client_socket: + self.client_socket.close() + self.connected = False + self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.client_socket.settimeout(self._connect_timeout) + print(f"准备连接RFID读写器") + self.client_socket.connect((self.host, self.port)) + self.connected = True + print(f"成功连接到RFID读写器: {self.host}:{self.port}") + self._error_count = 0 # 重置错误计数 + return True + except Exception as e: + print(f"连接RFID读写器失败: {e}") + self.connected = False + self._error_count += 1 + return False + + def connect(self) -> bool: + """ + 连接到RFID读写器 + + 返回: + bool: 连接成功返回True,失败返回False + """ + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + sock.settimeout(self._connect_timeout) + sock.connect((self.host, self.port)) + print(f"成功连接到RFID读写器: {self.host}:{self.port}") + return True + except Exception as e: + print(f"连接RFID读写器失败: {e}") + return False + + def _send_command(self, command_data: bytes) -> Optional[bytes]: + """ + 发送命令到RFID读写器并等待响应 + + 参数: + command_data: 要发送的命令字节数据 + + 返回: + bytes: 读写器响应数据,如果失败返回None + """ + for i in range(self._max_command_count): + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: + sock.settimeout(self._connect_timeout) # 设置连接超时 + sock.connect((self.host, self.port)) + sock.send(command_data) + response = sock.recv(1024) + print(f"收到RFID响应: {binascii.hexlify(response).decode()}") + return response + except socket.timeout: + + if i==self._max_command_count-1: + print(f"RFID命令响应超时,已达最大重试次数: {self._max_command_count}") + return None + else: + print(f"RFID命令响应超时 (超时设置: {self._connect_timeout}秒,)重连中.") + except Exception as e: + print(f"RFID命令发送错误: {e}") + if i==self._max_command_count-1: + print(f"RFID命令发送错误,已达最大重试次数: {self._max_command_count}") + return None + +#region ======= 配置命令封装 ======= + + def set_working_mode(self, address: int, mode_params: Dict[str, Any]) -> bool: + """ + 设置工作模式 + + 参数: + address: 读写器地址 + mode_params: 工作模式参数字典,包含以下键: + - read_mode: 读取模式 (0x00-0x03),0应答模式,1为主动模式,2触发模式(低电平有效),3触发模式(高电平有效) + - mode_state: Bit1=0时韦根输出,Bit1=1时RS232输出,Bit2=0时开蜂鸣器提示,Bit2=1时关蜂鸣器提示. + - mem_inven: 0x00:保留区;0x01:EPC存储器;0x02:TID存储器;0x03:用户存储器;0x04:多张查询;0x05:单张查询。0x06:多张TID询查 + - first_adr: 第一个地址 (0x00-0xFF) + - word_num: 字数量Word_Num不能超过3 + - tag_time: 主动模式下标签输出间隔时间(0~255)*1s,对同一张标签在间隔时间内只输出一次 + + 返回: + bool: 设置成功返回True,失败返回False + """ + try: + # 构建命令 + command = command_hex.build_set_mode_command( + address=address, + # wg_mode=mode_params.get('wg_mode', 0), + # wg_data_interval=mode_params.get('wg_data_interval', 0), + # wg_pulse_width=mode_params.get('wg_pulse_width', 0), + # wg_pulse_interval=mode_params.get('wg_pulse_interval', 0), + read_mode=mode_params.get('read_mode', 1), + mode_state=mode_params.get('mode_state', 2), #开蜂鸣器提示1为不开 + mem_inven=mode_params.get('mem_inven', 3), + first_adr=mode_params.get('first_adr', 0), + word_num=mode_params.get('word_num', 30), + tag_filt_time=mode_params.get('tag_filt_time', 0) + ) + + # 发送命令 + response = self._send_command(command) + if response: + # 解析响应 + try: + return command_hex.parse_set_mode_hex(response) + except Exception as e: + print(f"解析设置响应错误: {e}") + return False + return False + except Exception as e: + print(f"设置工作模式错误: {e}") + return False + + def read_working_mode(self, address: int) -> Optional[Dict[str, Any]]: + """ + 读取工作模式 + + 参数: + address: 读写器地址 + + 返回: + dict: 工作模式参数,如果失败返回None + """ + try: + # 构建命令 + command = command_hex.build_read_mode_command(address=address) + + # 发送命令 + response = self._send_command(command) + if response: + # 解析响应 + try: + return command_hex.parse_read_mode_hex(response) + except Exception as e: + print(f"解析读取响应错误: {e}") + return None + return None + except Exception as e: + print(f"读取工作模式错误: {e}") + return None + + def set_power(self, address: int, power_value: int) -> bool: + """ + 设置读写器功率 + + 参数: + address: 读写器地址 + power_value: 功率值 (0-26 dBm) + + 返回: + bool: 设置成功返回True,失败返回False + """ + try: + # 构建命令 + command =command_hex.build_set_power_command(address=address, power_value=power_value) + + # 发送命令 + response = self._send_command(command) + if response: + # 解析响应 + try: + return command_hex.parse_set_power_hex(response) + except Exception as e: + print(f"解析功率设置响应错误: {e}") + return False + return False + except Exception as e: + print(f"设置功率错误: {e}") + return False + + def set_trigger_delay(self, address: int, delay_time: int) -> bool: + """ + 设置触发延时 + + 参数: + address: 读写器地址 + delay_time: 延时时间 (0-254秒,255表示读取参数) + + 返回: + bool: 设置成功返回True,失败返回False + """ + try: + # 构建命令 + command = command_hex.build_trigger_delay_command(address=address, delay_time=delay_time) + + # 发送命令 + response = self._send_command(command) + if response: + # 解析响应 + try: + if delay_time == 255: + # 读取模式 + current_delay = command_hex.parse_trigger_delay_hex(response) + print(f"当前触发延时: {current_delay}秒") + return True + else: + # 设置模式 + return True # 如果发送成功且没有异常,认为设置成功 + except Exception as e: + print(f"解析触发延时响应错误: {e}") + return False + return False + except Exception as e: + print(f"设置触发延时错误: {e}") + return False + + def set_read_interval(self, address: int, interval_time: int) -> bool: + """ + 设置主动模式读卡间隔 + + 参数: + address: 读写器地址 + interval_time: 读卡间隔 (0-254毫秒,255表示读取参数) + + 返回: + bool: 设置成功返回True,失败返回False + """ + try: + # 构建命令 + command = command_hex.build_set_readinterval_command(address=address, delay_time=interval_time) + + # 发送命令 + response = self._send_command(command) + if response: + # 解析响应 + try: + return command_hex.parse_set_readinterval_hex(response) + except Exception as e: + print(f"解析读卡间隔响应错误: {e}") + return False + return False + except Exception as e: + print(f"设置读卡间隔错误: {e}") + return False + + def get_read_interval(self, address: int) -> int: + """ + 设置主动模式读卡间隔 + + 参数: + address: 读写器地址 + + 返回: + int: 当前读卡间隔(0-254毫秒),如果失败返回-1 + """ + try: + # 构建命令 + command = command_hex.build_set_readinterval_command(address=address, delay_time=255) + + # 发送命令 + response = self._send_command(command) + if response: + # 解析响应 + try: + loc_suc= command_hex.parse_set_readinterval_hex(response) + if loc_suc: + return response[4] + else: + return -1 + except Exception as e: + print(f"解析读卡间隔响应错误: {e}") + return False + return False + except Exception as e: + print(f"设置读卡间隔错误: {e}") + return False + + def read_reader_info(self, address: int) -> Optional[Dict[str, Any]]: + """ + 读取读写器信息 + + 参数: + address: 读写器地址 + + 返回: + dict: 读写器信息,如果失败返回None + """ + try: + # 构建读取读写器信息的命令 + command = command_hex.build_reader_info_command(address=address) + + # 发送命令 + response = self._send_command(command) + if response: + # 解析响应 + try: + return command_hex.parse_reader_info_hex(response) + except Exception as e: + print(f"解析读写器信息响应错误: {e}") + return None + return None + except Exception as e: + print(f"读取读写器信息错误: {e}") + return None + +#endregion + + + def start_receiver(self, callback: Optional[Callable[[str], None]] = None)->bool: + """ + 开始接收RFID推送的数据 + + 参数: + callback: 接收数据的回调函数,参数为收集到的RFID字符串数据 + """ + if self._thread_signal: + print("RFID数据接收已经在运行") + return True + + self._callback = callback + if self.CreatConnect(): + self._thread_signal = True + + # 清空数据缓冲区 + with self._data_lock: + self._data_buffer.clear() + self._receive_thread = threading.Thread(target=self._run, daemon=True,name="RFID_Receive") + self._receive_thread.start() + print("RFID数据接收已启动") + return True + else: + print("RFID数据接收启动失败") + return False + + def _run(self): + """ + 接收线程的主循环,用于接收RFID推送的数据 + """ + while self._thread_signal: + + if self._pause_receive: + time.sleep(1) + continue + # 重置数据收集时间 + self._last_collect_time = time.time() + while time.time() - self._last_collect_time < self.check_time_seconds: + # 持续接收数据 + try: + # 使用缓冲区累积接收数据,正确处理固定长度数据包 + received_data = b"" + remaining_bytes = self._buffer_length + + while remaining_bytes > 0: + chunk = self.client_socket.recv(remaining_bytes) + # 检查连接是否关闭 + if not chunk: + print(f"[连接关闭] 接收过程中连接已关闭,已接收 {len(received_data)} 字节,预期 {self._buffer_length} 字节") + if not self.CreatConnect(): + print(f"[连接断开] 重连失败,已累计失败 {self._error_count} 次,等待1秒后重试") + time.sleep(1) + break + + received_data += chunk + remaining_bytes -= len(chunk) + print(f"[数据接收] 已接收 {len(received_data)}/{self._buffer_length} 字节") + + # 只有接收到完整的数据才算成功 + if remaining_bytes == 0: + print(f"[数据接收] 成功接收完整数据包 ({self._buffer_length} 字节)") + data = received_data # 保存完整的数据包 + self._error_count=0 + else: + continue # 没有接收到任何数据,继续下一次循环 + except (ConnectionResetError, ConnectionAbortedError, BrokenPipeError) as e: + # 明确区分连接断开情况 + print(f"[连接断开] 网络连接已断开,错误类型: {type(e).__name__},错误详情: {e}") + # 尝试重新连接,但避免频繁重连 + if not self.CreatConnect(): + print(f"[连接断开] 重连失败,已累计失败 {self._error_count} 次,等待1秒后重试") + time.sleep(1) + continue # 继续下一次循环 + except socket.timeout: + # 明确区分超时情况 + print(f"[超时] 接收数据超时,当前时间: {time.strftime('%Y-%m-%d %H:%M:%S')}") + # 超时不重置连接,继续等待 + continue # 超时继续下一次循环 + except Exception as e: + # 记录其他类型的异常 + print(f"[其他错误] RFID数据接收错误,错误类型: {type(e).__name__},错误详情: {e}") + # 判断是否可能是连接问题 + if isinstance(e, (OSError, IOError)) and '远程主机强迫关闭了一个现有的连接' in str(e): + print("[其他错误] 错误原因疑似连接断开,将尝试重新连接") + self.CreatConnect() + time.sleep(1) + continue # 其他错误继续下一次循环 + + if data: + loc_str = command_hex.parse_user_data_hex(data) + print(f"收到RFID推送数据: {binascii.hexlify(data).decode()}") + if loc_str: + # 将数据添加到缓冲区 + with self._data_lock: + if self._filter_value == loc_str: + continue + self._data_buffer.append(loc_str) + + self._pause_receive = True + self._process_collected_data() + + + def _process_collected_data(self): + """ + 处理收集到的数据,过滤掉指定值,并调用回调函数 + """ + with self._data_lock: + # 如果缓冲区有数据 + if self._data_buffer and self._callback: + try: + + # 统计数据缓冲区中各字符串出现的次数 + # 这里self._data_buffer是字符串列表,Counter会统计每个完整字符串出现的次数 + counter = Counter(self._data_buffer) + + # 处理空缓冲区情况,避免IndexError + if counter: + # 获取出现次数最多的字符串及其出现次数 + # most_common(1)返回[(most_common_string, count)] + most_common_string, count = counter.most_common(1)[0] + print(f"出现次数最多的字符串是: '{most_common_string}', 出现次数: {count}") + + # 使用出现次数最多的字符串作为结果传递给回调 + self._callback(most_common_string) + else: + # 空缓冲区情况 + print("数据缓冲区为空") + self._callback(None) + + print(f"收集了{len(self._data_buffer)}条RFID数据,过滤后数据为{most_common_string}") + except Exception as e: + print(f"回调函数执行错误: {e}") + finally: + # 清空缓冲区 + self._data_buffer.clear() + else: + print("未接收到数据") + # self._callback(None) + + def __del__(self): + """ + 析构函数,确保在对象销毁时关闭连接 + """ + if self.client_socket: + self.client_socket.close() + self.client_socket = None + + def stop_receiver(self): + """ + 停止接收RFID推送的数据 + """ + self._thread_signal = False + if self._receive_thread: + self._receive_thread.join(timeout=2.0) + print("RFID数据接收已停止") + # 关闭连接 + if self.client_socket: + self.client_socket.close() + self.client_socket = None + + + \ No newline at end of file diff --git a/hardware/__pycache__/__init__.cpython-39.pyc b/hardware/__pycache__/__init__.cpython-39.pyc index e381e61..c70084f 100644 Binary files a/hardware/__pycache__/__init__.cpython-39.pyc and b/hardware/__pycache__/__init__.cpython-39.pyc differ diff --git a/hardware/__pycache__/inverter.cpython-39.pyc b/hardware/__pycache__/inverter.cpython-39.pyc index a132243..d3fae76 100644 Binary files a/hardware/__pycache__/inverter.cpython-39.pyc and b/hardware/__pycache__/inverter.cpython-39.pyc differ diff --git a/hardware/__pycache__/relay.cpython-39.pyc b/hardware/__pycache__/relay.cpython-39.pyc index 97fbb3a..174afd4 100644 Binary files a/hardware/__pycache__/relay.cpython-39.pyc and b/hardware/__pycache__/relay.cpython-39.pyc differ diff --git a/hardware/__pycache__/transmitter.cpython-39.pyc b/hardware/__pycache__/transmitter.cpython-39.pyc index ad49bac..bbd5444 100644 Binary files a/hardware/__pycache__/transmitter.cpython-39.pyc and b/hardware/__pycache__/transmitter.cpython-39.pyc differ diff --git a/resources/resources_rc.py b/resources/resources_rc.py new file mode 100644 index 0000000..cd54c61 --- /dev/null +++ b/resources/resources_rc.py @@ -0,0 +1,6258 @@ +# Resource object code (Python 3) +# Created by: object code +# Created by: The Resource Compiler for Qt version 6.9.1 +# WARNING! All changes made in this file will be lost! + +from PySide6 import QtCore + +qt_resource_data = b"\ +\x00\x00\x02\xd6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\ +\x00\x00\x02\x9dIDAT8\x8d\xa5\x95MH\x14a\ +\x18\xc7\x7f\xb33;\xbb\xa3\xe3\xba\xdbA\xed A\x04\ +\x19\x1a\x16\xa1`\xa1Q\x04}@\x9f\x97\xeaP'\xef\ +EHu\xf1\x14\x18u\xc8C\xd7\x0e\x1d\xa4\xae\x15A\ +EH\xa4\x19\xdeZM\xa3CFl)e\x98\xee\xba\ +\xba\xdf3\xf1\x8c3\xb6\xc8j\xea\xfe\xe1a\x9e\x99y\ +\x9f\xff\xfb\xbc\xcf\xfb\x7f\x9fW9r\xec\x0c\xab \x02\ +\x9c\x07N\x00\xbb\x81:\xf7\xfb/`\x14x\x09<\x06\ +fK\x05\x97\x22\x0e\x027\x81k@\xd5j\xb3\xbaH\ +\x02\xbd@\x0f\x90.\xfe\xa1\xad\x18\xb8\x0dx\x02\xec\x91\ +\x97\xfd\xa9$\x1d\x898\xbb\xfe,\x10Nf\x9d\x01s\ +\xa6\x9f\xcf\x11\x93\xb7\xd5\xd5\xbc7L\x13\xe8\x06\xce\x02\ +'\x81o\xa52\xae\x07\x86\xe4\xd9\x98Ms\xf9\xf74\ +\xcdS\xf15\xd3\x1d\xdd\x1a\xa2\xaf\xa6\x86Q\xdd\x90\xd7\ +\x1f@\x9b\xfbD\xdd\xbe\xa3\xc1[~?\xb0\xb3-\xb3\ +@\xf7D\x8c\xfa\xf94\x8a\xaa\xaciu\x8bY\xda\xe3\ +\x09b!\x83\xef\x9a\x1e\x02\xda\x81> \xefs'\xbf\ +\x22\xcbo\xca\xa5\xb9\x1e\x9b\xa4\xc2\xb6\xc1\xef[\x97\x19\ +\xb6MWl\x92\x86|FxZ\x80\xab\xe2\x08q\xb5\ +\xbbY\x5cH\xccRi\xd9(\x9aoCfZ6\x97\ +\xe6f\xbc\x0a\xdd\x00\xb6\x08\xb1\x149\xdc\x96K\xd1:\ +7\x0f\x9a\xb2)k\x89'9\x90[\xc4M\xf4\xa2\xa8\ +\xe2\x94\xa3\x80\xcc\xa23{98\x94Z`\xc8_!\ +\x0c\xc7\x85x\x9fx{\xd3)(\x93\xb81\xb3,\xe5\ +f!\xae\x15/b\x15\xca&\x8e\xd8\x96\xe7\xd6\x0aq\ +N\xe4V\xd0T\xb0\xac\xb5#\xff\x07EY\x1e \xc4\ +S\xa2\xdf\xd9\x80\x1f#\x97+\x8b7\xae\xaa\x9e;-\ +k\x1f\x17o,`\x80\xaa\x94e\xe3A\xc3#\x1e\x11\ +\xe2g\xe2\x0dkAP}e\xd9\x9b%E\x08^H\ +)\x9eK\x97\x1aD7%\xeb\xa6\xa5\x13\xb4a|\xf0\ +\x07\x19D\x97\xb0\x84\xb4S\xc9x\xc6m}<\xd4L\ +\xacMd-1\x8f\xd4J/\x97\xbb\xc2\xe9\xe9\xeb6\ +\xf0q\xc4\xd6\xb8\xa5\x87)8\x01\xeb\xab\xb7\x90\xf6\xe8\ +a\xa2\xb6\xd3\x81e\xbf\xeeQ\xd4\xdd\xf2\xc0k\xe0\x5c\ +\xccVCcj\x80\x1aU\xae\x0ckIB\xabXT\ +\x0d\xd0\xabT1l9\xa4?\x81\xa3\xa2\x08V4\xfa\ +/\xc0A\xe0i\xd4R\x9b\xa2\x98t\xa8y\x0e\xfb\xb2\ +4\xday\xc22\x894z||R4\xfa-\x9d\x81\ +\xc2r\xb8dz\x1a\x98(\xd6q1\xbe\x02\xad\xee\xb5\ +\xd45P\xd0\xc2E\xc1\xa50\x0f\xdcq\xf7\xc8\xe9@\ +\x1e\xbcR\x14C\xca2\x08<\x00b\xee\x0f\x11\xa8\xec\ +\x8e\xed\x1e\xa8w\xc0}\xa0\x13x\xe5\x9e\xde\x7f\x00\xfe\ +\x02\x95H\xc0\x85\xb6\xb2\xe2\xab\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x01\x0f\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x15\x00\x00\x00\x19\x08\x06\x00\x00\x00\xde\xd5e\xed\ +\x00\x00\x00\xd6IDATH\x89\xad\xd51+\x85Q\ +\x1c\xc7\xf1\xe3&\xa5\xd8\xdd\xc5$/\x81QVYy\ +\x152\xca\xcab\x10\xd3\xcd\x0b\x90YVy\x0b\xb21\ +\xdd,2#!\x83\xfb\xd1Q'w0y~\xdfz\ +\x9e\xf1\xd3\xd3s\xce\xf9\x9f\x82\x13\xbc\xe0\x18\xb3(]\ +\x9f\xfa\xfa\xf2\xdb#6\x13\xe8_]a1\x8d\xd6>\ +\xb1\x8f\xe9$\xda\xba\xc7z\x1am]`>\x8d\xd6\xde\ +\xb0\x8b\xa9$\xda\xba\xc3j\x1am\x9d\xa1\x9fFkO\ +\xd8\xc6d\x12m\xdd`\xb9\xa2\x13~\xe8X\xa3R\xca\ +A\x1a\xad\xbd\xf7\xc2`\xfd\xd2\xa3\xe4?\xbd\xc6Rr\ +\xf5\xb7\xd0K\xac\xfe\x08\xa7\x98K\xed\xd3[\xac\xa4N\ +\xd4+v\x92g\xff<9\xa5\x86XK\xcd\xd3\x0f\xec\ +%'\xff%\x16\xba\xdcQ\xe3\xb7\xe9\x036\xfe\x8b\x8d\ +\xa3\x03<\xe3\x103]A\x94o\xc3o\x5c\xc2\x8c~\ +
\x14o\x95\x00h\x04\
+\xb6L\x81\xf7:\xe0\x9d\xccM\xea\x81G\x80\xc2)\xde\
+\x07\xeb_\xf1VJ\x82T `\xbaaS\xa9\xc9\xe9\
+\x9f#\x0c\x0c\xc6\x94\x87\xae\xc1\x8e2\x8b\x07\x96\x18\xca\
+\x9e*\xb1\x09\xe8\xe8\x8d\xd0\xd02\xael\x91{\x17\x19\
+\xac(2\xf8\xa4u\x9c\xf1\xb0:\xbaM\x07V\x88U\
+0\xdf`e\xb1\xc9\x9e\x8d),^\x10g\xe3\xbe\xc5\
+.\x96/uc\xe8:\x9a6]\xe5\xec\xc1\x22\x93\xa2\
+\x02\x97\xf2-\xcc3\xd8\xfd\x94W\xc5Xt\xe7$\x9b\
+\xcbu\x87\xf3\x81\xbe\xcbQN\x9c\x0ec\x99:{\x9e\
+N!;C'\xc3wk\xe0\x99\x9a\x99\xae+\xdf\xdd\
+\x15)\x0a{\xfcT\x98\x81\xc1\xe8$\xcd\x92\xc0\x06\xa4\
+\x98|\xf9\x9d\xcd7\xe7\xc2\xa4xu\xd6\x94X\x08+\
+\x9a\xae%W\xe0\xb1\x12Ka\xda\xba\xc24\x7fo'\
+n\xff\xe2\x81\xd7\xd3\xa3.\xe7\xc7 \x10\x02RF\xae\
+OHT\xdcn\x0d4M\xd9IE\xd3\xf0X\xba\xf2\
+S\xd8\xb8\x04\x80!9\x13t6\xd0&\xc1\x1f\xba\xdf\
+\xa2bM*\x13\xe8\xb4\x9f\x1f\x17\xf4\xac\x14\x89\xcf\xb7\
+\x9d\xb6\xc2\x08ve\xb1\xa5\x8a\x0b\x9c\xdc\xf6\xc65\x9f\
+x\xbc\x0b\xe4.[j\xb1\xb5\xcc'\xbd\xc3\x07M\x01\
+~\x1d\x8a\xa8\xdbiR\xe0$*>\x17\x87#\x1ch\
+\x0e\xaa\x84\xdb\xca}\x14\xdfcJ\x92\xbb\x80\xfd\xba3\
+\x18lz\x22\x0d\xdd\xd0il\x09\xf0\xc3\x858\x8fq\
+\x86\x92'\xd0\x9c\xf6=\xd3=\xc6\xc1\xe3\x01\x15\xe3\xd9\
+\xf5\xbe\x04U\xab\x13\x14\xe1Kua\x875\xce\xf5\xd9\
+S\x18wj\x90L\xb99 ]\xbd6vD#-\
+5QZ\xb2\x13mJg\x9f\x8d\xd7kP\xfd\x9c\x1f\
+\xaf\xc7)\xec\x1c)\x12\x11\xcc\xcb[\x05k\xd0u\xf3\
+\x92\xed\x12\xe9\x0b\xb1>n\x1e\xe5\xca\xefa\x0a\x16Z\
+\xbc\xb4\xc5\x8f\xcb\x90\x02\xcfMM\xb7Fue\x16\xf9\
+\x0b,.\x0d\x879\xdc2\x9aHpL\x12\xbc\x07\x1c\
+\x09\x8d\xc5x\xaba\x84\xa1\xbf\xa2,\xc9\xf7R\xba*\
+-\xfe\x88\xd9^\x00\xac}\xd8G\xe1\xdd\x1e\x85}\xbb\
+a\x04\x89%1\x0f\xbd\x99W\x9fhrYj\xad\xff\
+\x04c4}5\xaa\xba!o\x9e\xe5\xdc~\xb6i\xd6\
+X\x98k*\xfbh\xeb(\x81\x90\x0a~\x12\xd8\xae9\
+s \xf2)P\x9a\xe3w\xb3\xb9<\x0bt\x9d_\xae\
+\xd8q~\xe5\x96\xc9T\xd3\xe8\xbfd+\xbbrC\x16\
+\xd9\x99\xaa\xc0ke\x8d\xcb\x99$\xd8\x0b\xac\xcbLw\
+\xf1\xea\xaey\xf8o7\xe9\xb8\x10\xa2\xed\xec\x8d9\x0f\
+\xda\xd7gn\xd0\xd9\x13R\xd8\xbd\xbb\xe6\x93\x91\xae\x92\
+\xac\x7f\xa6\xfa\xe2k\x93s\xb0\xbd\x22\x87\x1c\xbf\xc9O\
+}!\xf6\x1f\xbeJ,\x06\xd7F#\xb3\x16\xf9\xef\xeb\
+\x11&&`\xdf\xa1\xabt\xf7\x87\xc8\xcd2\xd9\xb9\xf1\
+\x8eis\xb0L\xac\xfc\xff\x8e\xc3;\x8d\x7f\x10\
+\x89\xc6w\xca\xf9\xbe \x1d=A\xd5\xef\xb7\xb6\xa7\xce\
+\xd9\xee \xdd\xfdA\xe5+\x18\xc1\x0e\x5c\xb6\xe9\x19\x90\
+\xb5\x16oS\xf9\xe0\x1c\x056\xcc\xd8g'\x80\xe1\xff\
+\xf9E\x93\xfdP9\xe3\xbcD\xc8z>\xf1\x1c\xc0\xe3\
+\x0c\x9e\x9c\xfd\x06\xf4\x03\xe5\x09\x1ag\x88\xaf\xc9\xe5\xa6$H\x06\x06\x06-\
+\x0eCV\x0c\x0cZ\x03\xa4^\xac\x96\xcb*\xf9y\x0f\
+\x80e\x00V\x02X*I\x093\x7f\xafH\xd8J\xd2\
+\xa6\x18e\xb9$,7\x00\x5c\x01p\x1d\xc0E\x00\x97\
+\x00\x5cV>Gf\xf0|\x0c\x0c\xe6=`\xc8\x8a\x81\
+A\xd3@&\x96u\xbee=\x80\xb5\x00\xd6H\xd3\x8b\
+As\xc1$\x09\xa4eW\xc4\x91G$\x899\x07\xe0\
+\xac\xfcT\x971\xf3w30h,\x0cY10\xa8\
+\x1f\x88\x90l\x94\xa3z{\xd9,?\x17\xcf\xc4u\xe6\
+m\xed@\xae\x03\xbc\xad\x03h\xeb\x10\xbfy\xae\x03\xc8\
+\xe5\xc0\xb3\xed\xe2\x13\x99l\xf9{6\x07\x9e\xc9\x02\xb9\
+v\xf0t\x1a\xc8\xe4\x80T\x0a<\xd7^\xae\xcc^\xa7\
+\x82\xa5\xca\xc7\xa8\x006=\x05p\x9f\xcbJ1\x0f\x94\
+J\xe2+\xcbO\x01\x96%\xd61Z\x97\x9f\x02+\x16\
+\x80B\x1e\xac0\x05\xd0\xf7\xbc\xfcN\x9f\xf9\xc9r\x9d\
+\xd3\xf49\x09\xd8\xbf\x1b\x03\x22\x92;\xe4\xa2\x03\x99\x9d\
+N\x018)?\xed\xe5\xb4!2\x06\x06\xf5\x81!+\
+\x06\x06\xc9A\xc4c;\x80-\x00\xb6\x01\xd8*\xbf\xaf\
+j\xf4\xb5\xe4]\xbd\xee\xd2\xd1\x0d\xde\xd1\x05tv\x83\
+\xb7w\x95\x97\x8e\xf2\xa7XG\x04\xa5E\xa0'4\xae\
+\xaf.\xafS3\x05q\x99\x18\x03\x9b\x1a\x07\x9b\x1c/\
+\x7fN\x8d\x97\xd7\xd1\xef\xc91\xb0\xf1\x11g\xa9\x13\x16\
+\xcb\xe5\x11MudF:\x0e\xe0\x18\x80\xa3\xf2\xfb\x11\
+Ip\x0c\x0c\x0cb\xc2\x90\x15\x03\x83p\xf4\xc8\xd1\xf4\
+Ni&\xd8)I\xca\xa2\xba_\xb3l\x1b\xac\x9e\x05\
+\xe0\xdd\x0b\xc0\xd5O\x22%\xdd}\xe0\x9d=\x82\x9c\x80\
+\x19\x97\x95(8\x0aR\x1c!\x8b\xf32y\x99\x18\x05\
+\x1b\x1b.\x13\x98\xd1!\xb0\xb1!\xf7\x93\x96\xfct\xe5\
+\xba\xc2\xb1J.o\xf4\x95\xb8#I\xcb!\x00\x07\xe5\
+rDF;\x19\x18\x18\xf8`\xc8\x8a\x81A\x19\xe4\xcc\
+z?E\xd5Ib\xb2K\xfa\x97\xd4\x87\x1dds\xb0\
+\xfa\x16\x81\xf7.\x14\x8b\xd5\xbb\x08\xdc\xfe\xdd\xd3\x1f\xcb\
+\x94bPg0V&\x81\x9d=\xc0\xc0\x8a\xd0\xba\xc9\
+\xbc\xc4F\x07\xc1F\xee\x82\x0d\xdfAj\xe4N\xf9\xfb\
+\xc8]\xa4\x86\xef\x08SU\x15 \xc2\xfb\x1a\xb9\xd8\xe0\
+\xd2\x0f\xc6&//\x01\xd8/\xfde\x0c\x0c\xe65\x0c\
+Y1\x98\x8f \xc7\xd6\x07%9y@~\x0e\xd4|\
+\x1d\x04!\x19\x00\xef_\x0ck\xc1\x00\xf8\x02\xfa\x5c,\
+>yg\xb7\xb9\xd1f)\x84\x9fO\xdbr``\xb9\
+\xf6\x04\x18\x99\x98\x86n!5tK|\xb2\xc1\xdb\xe2\
+{j\xf8vR\x22\xc3\xe4\xbdI\xcb\xf7*\xeboK\
+\xd2\xb2O~\xee\x95\x8e\xbe\x06\x06\xf3\x06\x86\xac\x18\xcc\
+u\xf4Hb\xf2*\x00\xaf\x04\xf0\xb0\x0c\x01\xae\x1a\xc2\
+/d\xe12X\x0b\x97\xc0Z\xb8\x0c|\xe1RX\xfd\
+K\x84\xd9\xc6`\xfe\x81\x88(-\xa5\x15\xeb\xca\xe7\xee\
+8\xe0paNJ\x0d\xdeDj\xf0\x06Rwn\x80\
+\xd1\xf7\xbb\xd7\x85\xffL\x02\x10\x91~\x93\x5clP\xc8\
+\xf5s\x00\x9e\x07\xf0\xac$0\xc6\x84d0ga\xc8\
+\x8a\xc1\x5cBJ:\xbb\xda\xa4\xe4a\xe9\x00\x9b\xae\xf6\
+\x1c\xadek`\x0d,\x875\xb0B|\x12I\x11N\
+\xad\x06\x06\x91(3\x16\x22\xb0%Z\xee\xd9\xec)L\
+d\x85HK\xea\xf65\xa4\xee\x5cC\xea\xf6U\xa4\xae\
+'\xb2\xf6\x10\xe1~\x87\x5c\x08%\xe9\xc0\xfb\x9cBb\
+\x8ei\xb2\x06\x1b\x18\xccJ\x18\xb2b0\x9bA!\xa5\
+\xafV\x88\xc9C1S\xbf\x07@~#\xd6\xe2\x15\xb0\
+\x96\xac\x92\xc4d\x85\xf0'1\x0e\xad\x06q\xa0\x88)\
+\xf1\xcawt\xa1\xb4r\x83X\xdc\x95\x1c)\xf2\x85!\
+\xe2B$\xe6\xe6e\xa4o_\x15\xfe21\x90\x96\x0e\
+\xe0\xb4\xfc\xa4,NS\x11\xbc\xa0\x10\x98\xef\x98\x04w\
+\x06\xb3\x15\x86\xac\x18\xcc&,\x96\xe4\xc4vL\xbc\xaf\
+\x1a\xd5D8\xb8.]\x0dk\xf1*XKW\x89O\
+\xa3\x96\x18\xd4\x0fU\x06b3\x86R\xdf\x22\x80\x96\xf5\
+;\xdd\xd5\xa4\xc2\xdc\xba\x8c\xf4\xcd\xcbH\xdd\xba\x82\xd4\
+\xcdK\x82\xd4\xc4@\x9f\xcf|D\xea\xcb\xcb\x00\xbe\x05\
+\xe0\xdbr1!\xd4\x06\xb3\x02\x86\xac\x18\xb42(b\
+\xe2\xb5\x00^'\x97\xad\xd5D\xe7X\xcb\xd7\xa2\xb4j\
+C\xd9\xa4\xb3lM9\xfa\xc3\xc0\xa0\xde\xa8W\xb2\x18\
+_=\xbc\xa3S\x98\x91TS\x12\x85[\xa7\xaf_D\
+\xea\xc6\x05\xa4/\x9fA\xfa\xfa\x8585\xa7e\xb4\x1b\
+-\xbf \x8fD\xa6\xa2o\x00\xf8\x9a\xfc\xbcc\xee\x0b\
+\x83V\x84!+\x06\xad\x84nIN^/\xc9\xc9.\
+\xe9\x87\x12\x1b\x169\xbb\x12)YN\xc4d\xad\xf8M\
+YX\x0d\x0c\x1a\x85zq\x94$ \xc2]\x5c\xbf\x1d\
+\xa0\x85~[\x96p\xe2M_\xbb \x88K\xfa\xc6E\
+\xa4\xee\xde\xa8T#\x93>]\xb4\xfc\x8c\xf4o\xa1\x90\
+\xe9\xaf+\xe4\xc5d\xe05h\x09\x18\xb2b0\x93\xa0\
+\x97\xe5n\x00o\x01\xf0f\x19\xb1\x93K\xd2\x1e\xa1\x9a\
+\xac\xd9R&'K\xd7\x98|%\x063\x8c\xea\xa9K\
+\xb5{\x8a\xfdR)X\x8b\x96\xc3Z\xb8\x1c\x85\xed\x0f\
+\x8b\xf54\x85AY}9\x8f\xcc\x85\x13q\xd4\x97\x94\
+|\x1ei\xf9E\x00y\xe9\xeb\xf2E\xb9\x1c\x98!n\
+f`\x00\xb6\xef=\xdfe\xae\x82A3A~'\xdf\
+%\xed\xe8o\x96\xb3\x0a\xc7\x86\xb5b\x1d\x8a\x1bv\x89\
+Or\x865\xaa\x89\xc1LC\xf4\xdeI=l5\xf0\
+\xd6\x13\xbf\xbe\xca\x87\x96\x1b,\x0b\xe9\xdbW\x90\xbez\
+\x0e\x993\x87\x90\xbev>i\x13iV\xea/)\x8b\
+\xf1w1\xa8\x0a{\x9ex*\xf1n\x86\xac\x184\x1a\
+\x19\xa9\x98\xbcI*(\x0f$1\xed\x08\xe5d\xe3N\
+\x94Vn,\x93\x13\x13\x9dc\xd0B\x08\x12\x85\xea\xc8\
+J\xf8\xee\xd1\xf5\xf1\xd0\x1f\xd1\x1b\xca\xc4\x88#}\xf3\
+\x0a\xd2W\xce {\xf60\xd2\xd7\x13\x91\x17K&\xa9\
+#\xc5\xe5\xcb2\xd7K1I\x05\x06\xf3\x17\x86\xac\x18\
+\xb4\x0a\x16\x02x\xbb\xcc\x01\xf1\xa6$\xe1\xc4\xd6\xb2{\
+PZ\xb7\xa3\xec\x10\xbb|\x8d\x98\xd5\xd7\xc0\xa0U\xe1\
+%\x19u0\x01\xc5c\x1f\x15\xf6\xab\x5c\x87n?\xce\
+-\xa4\xaf]D\xe6\xea\x19d\xcf\x1dA\xfa\xe6\xa5\x8a\
+\xc7W0,I\xcbg\x00<\x09 V\xb8\x92\xc1\xfc\
+\x84!+\x063\x89u\x92\x9c\xbc\x13\xc0cq\xfd\xa1\
+\xf8\x82\x01\x94\xd6lEi\xe5:Xk\xb6\x80\xe7\x8c\
+\xcf\x89\xc1\xec@\xbdT\x154\xc3\x04Ta\x1f\x1d\xe9\
+\x22\x9f\x97\xcc\xc5\x13\xc8\x5c;\x8f\xcc\xc5\xe3\xe5y\x90\
+\xe2\xa1(\xc3\xa2?-\xc9\xcb\xb9\xb8;\x1a\xcc\x0f\x18\
+\xb2b\xd0L0\x19\x02\xf9NIR\xee\x8b{l2\
+\xed\x147\xde\x07k\xcdf\xe1\x14h`0\x1b\xd1X\
+U\xa5r\x9d\x95E\x98\x04\xaaJdC\xca\xbf)\xe3\
+n\xe6\xd2)d\xcf\x1cB&^\xa8\xb4\x8d\x97%i\
+\xf9\xb4\x9c\x9c\xd18\xe9\xcesTCVL4\x90A\
+\x12P\xa4\xce\xe3r\x92\xb5\xef\x01\xb0:\xce\xbe\x94\xa6\
+\xbe\xb4n\x1b\xac\x15\xeb\xcb\xb9\x22RUg\xbf70\
+h-4(\xb7J\xa2\x8akl\x03\x8f\xf8\xa5\xa2\xb4\
+p\x99X\xa6\xef{\x0c(\x95\x90\xbd|J8\xe9f\
+/\x1cC\xfa\xce\xf5\xa8C\xdc'\x97\xdf\x00@\xb6\xa5\
+\xcf\x02\xf8\x17\x00\xdf\x94\x11G\x06\x06\x15a\x94\x15\x83\
+J\xc8\x02x\x03\x80\x1f\x94$%\xd6l}\x94\xeb\xa4\
+\xb4qW\x99\xa4P\xae\x13\x03\x839\x849g\x02\x8a\
+\xac\x8c\x07\xb7\xf8\xf6O\xdf\xbd\x81\xec\x85\xe3\xc8\x9e;\
+\x8c\xcc\x8d\xd8s\x1c\x0dI\xd2\xf2\x0f\x00\xbe\x0a\xa0\x10\
+wG\x83\xd9\x0d\xa3\xac\x18\xd4\x0bi\x99\x98\x8d\x08\xca\
+\xbb\xa4\xc3l$x\xae\x0d\xa5\xf5;a\xad\x5c\x87\xd2\
+\xfa\x1d&K\xac\xc1<\xc2\x0c\xe5V\xa9C\xcd\x95U\
+\x95\xcaD\x85P\xea_*\x96\xa9\xdd\x8f#51\x82\
+\xec\xf9c\xc8\x5c?/\x1cuYa:\xec\xf04\xf0\
+\xf91\xb9\x90C\xee?K\xe2\xf2595\x80\x81\x81\
+\x03\xa3\xac\x18\xd8H\xcb\xf9v\x88\xa0|\x9f\xcc\x87\x12\
+\x09\x9a\xfc\xaf\xb4a\xa7\x98\x1a\xbf\xb4a\x871\xef\x18\
+\xcc\x0b\xcczUE\xf9Q\x0fU%\xb2\xfdV\x09\xd9\
+\xf3G\x85\x93n\xee\xfc\x11\xa4F\x87\xc2\x1a\xac\x82\xf2\
+\xb7|J\x12\x97o\x19\xe22\xf7`\x1cl\x0d\x92\x22\
+%'\x06\xfc\x01\x00\xdf\x1f'A\x1b9\xc4R\xde\x13\
+\x8bf\x8c]\xbd\xc9\x5cp\x83y\x87Y\x9d[\x05>\
+\xa2\x82P\xc6\x11[U\xa9\xd4 \xb5\x96\xcc\xe53\xc8\
+^;\x87\xdc\xb9\xc3\xc2t\x14\x03\xe4\x0c\xf3O\x00>\
+!g\x8d\xb6\xe2\xecd\xd0\xda0d\xc5 .\xb6\x00\
+\xf8\x11\x00\xff\x1a\xc0=\x95\xf6!\x9f\x93\xd2\xc6\xfbP\
+\xbag\x93 )\x06\x06\xf3\x19\x95\xd5\x88xh\xa6\xaa\
+\xa2\xdb\xaf\xe1\xaa\x8a\xaf\x06\xee+\x9b\xbdz\x0e\xd9+\
+\xa7\xcb\xc4e\xf0f\xd8\xc9\xa8 g\x98\x8f\x01\xf8[\
+\x00\xc7\xe3\xec`\xd0\x9a0d\xc5 \x0a4\x83\xf1{\
+$Iy\xa8\xd2\x95\xb2\xfa\x97\xa0\xb4i\x17\xacU\x9b\
+\x8c\x82b` 1W\x1ck\xe3\x85]\x87\x93\x95j\
+T\x15?YQ\x8bg\xaf\x9eF\xf6\xcaY\xe4\xce\x1d\
+Bz\xe8vH{\x1fGE9%s\xe7\xfc\xad\
+TT\x0c\xe6)\x88\xac\xdc7\xc3d\xe5eCV\xe6\
++\x96\xc8d\xa3?\x195\xc1\x22!\xbf\xe4\x1e\xa1\xb4\
+Ll\xba\xbf\xf1\xaa\x8a\xf2\xb3\xae\xaa\x0a\xeaEV|\
+\xadjq\xd3R\xee\xeeu,|\xe9Kh\xbf\xa9\xf5\
+\x91\xfcS\x00\xbf\xa8F\x0b\xa9de\xa5\x8c\xeax\xc4\
+\xbf\x17\xcd\x92|\xe7\x95oo`\xb3\xe3\xa1\xded\x05\
+!u\x06I\x8cZ$\xec\xb8\x95\xc8\x0a<\x84\xc5&\
+>~u\xc5>\x06S\xcb\xc9\xef\x81HR]\x14\x91\
+\xad\xdaL\x8d#w\xf4EdO\x1f@\xfa\xf6\xb5\xa8\
+K@qe\x9f\x91J\xda\x97\xe7\xbe\xf5\xd4 \x0e\x04\
+YYY]\xa4O\xbd\xf0\xf2\x95\xdb\x86\xac\xcco0\
+\xe9\x94\xfb~\x00\xef\x90\xa9\xff\xb5(,\x5c&\xf2\xb6\
+Llz\x00V{\xa7S\xc4\xa8*\xad\x8f\x81\xe7?\
+\x87\xee3\x07t\xed|\x86\xc2\xdf\xf7<\xf1\xd4\x15(\
+\x0e\xb6\xaf\x91N\x93\x01\xd9\x84\xb2\xd2Q\xda\xfc\xd6C\
+%'\xd6j\x10]g\xa5\xadjB6Q\xd6\xfdG\
+_\x83\x9a\xb1Vz\xc3z\x5co}N\xb6\x81\xe3\xdb\
+\xfb(\x8e\xb9\xe9[W\x90;w\x18\xb9c/Vr\
+\x98\xbd\x0a\xe0\xafd\x94W\xac,o\x06\xf3\x0b\xb3\xe9\
+\x85g0'\xc1\xe5\xa4\xa6\xb4\xac\xa2\xa8\x11\xa9\xb6\x04\
+\x92\x91f\xef^\x17K\xd7\xd1\xe7\x85\xca2\xb5f+\
+\xf2\x8b\x94bU\x11\x02\xfd\x1e\xa1\xf5\xcc\xe8\xf32{\
+\x1fV\xf2\x7f\xa5\xf9\x85\x16\xbd\xf0y\xff&\x12N\xf6\
+\xbe\xf4\xde7\x93\x1f\xcb\xb7HYy\xbf\x9ci\xd3c\
+#\x9c^\xbcZLR\x94_P9\xd7B\xb3\xa07\
+\xd1\xd4\xc9\x1c\xe47\x9fDT\x1d\x9euV\xaf\xae\x04\
+\xd2\xe7\x07T\x15\xd5\xc4d\x1f\xdb\xa7\xae(\x02\x0c\xd3\
+\xd4E\x04%{\xe5\x0c\xda\x0e?\x1bu\xaatG\x7f\
+]Jl\x9f1\xbe(\x06a ee\xd7\x8a\x99U\
+V\x0e^5\xca\x8aA\x00Y\xa9\xb2\x90\xab\xc2\xeb\xa2\
+:\x80\xf1-\x0faz\xf9zA\x5cZ\xd9\x04T\x9f\
+A\xc1\xecTUT\xe4\x86nb\xd1\x8b_@\xdb\xad\
+K\xfeM\xd4O\xfd\x5cF\xce\xeb\xe0!*\xe3k\xb6\
+\xe3\xd6\xa3\xef\x9a\x89\xf6F\xa2\x11Z\x0a<*\x88\xbb\
+F\xe8\x1d\xd5\x1c\xd0\x1b\x1d,U\x12\xcd|?j\x09\
+]$\xb3=\x09\xa1\xad\xbe\x84\xa4\x9dm?\xf2,r\
+'_B\xe6f\xe0\x0f\xacbTN\x22\xf5'fn\
+\x1e\x83z\xe2\xd9K7\xaa\xaa\xedU\xab\x97\x9a\xbf\x83\
+A5((3Bo\x06\xf0o\xa5\x7fK\x8f\xbf\xae\
+\xae\xe3/\x88%\xbfx\x15&\xd6\xef\x12\xe4%>\x12\
+\x12\x95jQg\xa22\x9bA\xc2\xc8\xb57\xfd(\x16\
+?\xfd\xcf\xe8\xba\xe0I\x80N\xfc\xe4_\x11Y\xf95\
+9\xd7\x8f\xd3\x15Nj\xe2\xd9[\x17\x8d\xa20\xe15\
+'\x9d\xd3'N\x01\x97\xd0hv\xf6N;\x04\x14\xa6\
+\xd1~\xf49\xb4\x91?\xca\x9d\xebQ\x07\xa2i\xb9\xff\
+H\x9azL^\x14\x83D\xa8zF\xda\x18hd\xdd\
+\x06\xf3\x06\x14\xe2\xfas\x00~C\x9a\x88\xfe\x1d\x805\
+\xfe\x93\xcf\xdd\xba,\x96\xae\x93\xfb0\xb9~'\xc6\xee\
+}\x05x\xb6-x\x8d\xeatK&RU\xeasH\
+\xb7\xbe9\xf0X\x11\xff\xf0\x91\x15:\xab_\xcb\xc8\x94\
+\xb7\x9f\x90Iz\x04zN\xef\x17\xb9Tf\x0fj'\
+,:\xfa\x10\xe9\xa1\xa2\x9d\xef'\xa8\xa1\x84\xcf\x0b\xe4\
+\x93S\x14\x05E\xf5c\xe1N\xf83Gjl\x18\xed\
+'\xf6\xa1\xfd\xc4^\xa4\xc6\x86\xa2N\xe7i\x99\xcc\xef\
+S\xd2\x81\xd6\xc0\xa0!\xe8J\x87\xfa<\x1a\x184\x0b\
+4\x10\xa3\xb9f\xfe@f\xc7\xfd\x05\x00\x8f\xfa\x8f\x9d\
+\x1d\xbc\x81\xec\xbe\x1b\xe8:\xb1\x17\xe3\x1bwcb\xe3\
+\xfd(u\xf5y\xde\xc8\xfeo\xfe7v(f\x8c$\
+\xcc=\xd2\xdfsf\xbf\x7f\xd5'\xf7<\xf1\xd4^\xdb\
+\xc1\xf67\xe4\x8c\x88\xc2\x1c\xd4v\xe7\x0azO\xbc\x88\
+\x91{\x9b\x9fO\xa5\x12\x1c\x0a\x11\xf46\xad\x9d\xb0h\
+2\xbe\x86\xcfb\x5c\xe1xA_\xda@s\x1dR\xe2\
+7\x07\xf9*\xca\xdc\xbd\x81\xb6\xb3\x87\xd0q\xf4Y\xb0\
+|h\x82?\x92G\xffQ\x86\x9e\xbfX\xe9\x5c\x0d\x0c\
+*\xa2\x91\xefA#\xac\x18\xd4\x1f%\xf9\x0e\xa4\x85:\
+\xaf_\x04\xf0\xfd~7\x87\xf4\xd8\x10z\x0f|\x03\xdd\
+G\x9f\x13\xa6\xa1\xc95\xdbD4Q(\xb4\xf7j\x1d\
+\x02\x8d\xcd3\x10\x00\xf1\x8e\xb6\xdbW\xd4\xd5E\x9a\xf0\
+\x10\xca\xcc\xc9\xa7\xa4\xa9\xc0A\xcf\xe9}\xf3\xf2j\xea\
+N9\xec2\xc4\xbd<\x5c\x13\xff\x1fZ\xd6q\x03\xe3\
+\xc8^?\x87\xee\xe7\xbf\x88\xfeO\xfd!:\x0f|=\
+\x8c\xa8\xd0\xdc\x0a\x1f\x02\xb0\x1e\xc0{\x0dQ100\
+0\x10\xefAz\x1f\x92O\xc3\xef\xc9\xf7\xa4\x07\xa9\xfc\
+\x14z\x0e~\x0bK>\xfb\xe7\xe8\xdd\xfbe\xb4\xdd\x08\
+\xcfC\x15\xb7'L\x94[\xa5f\xcc\xae\xbc*\x15\xc1\
+y\x99wx\xf1W{\x9ex\x8a\xf8\x89CV\x08\xbf\
+E\xbe\xb5\xf6\x8f\xec\xf0m\xf4\x1d\x8b\x8c,iA4\
+\xe2\xaf\x15U'\xd7\x93\x9b\x90]\xa3\xc5E\xd7\x83\x8b\
+\xa2zz\x9e\xfd,\xfa\x9f\xfc0:\x0f};\xec\xe0\
+\xe4\xd9\xf8\xeb\xd2F\xfb+&\xfc\xd8\xa0\xde\xe01\x96\
+j\xd1\xc8\xba\x0d\x0c\x14\xd00\xfdW\xe5{\xf2\xd7\xe5\
+{3\x80\x9e#Oc\xf1S\x7f\x83\x05\xcf?\x89\xb6\
+kg+\x5c\xbfX/\xf6\xe8\x1a\xcc\x0d\x1e\x00\xf1\x0d\
+\xe2\x1d\x0a&$/\x11P\xc9\xca5i\xf3s\xd0{\
+\xfc\x05\xa4\xa7'f\xae\xf5U\xa1\x11\xf2\x9c\x9e\x94\x84\
+\xec\xad\xfd\xa9\xdd\xdf\x17N\xd7v\xe5\x14z\x9f\xfd\x0c\
+\x16~\xf1#\xe8<\xfa|\xd8\x01\xce\xca\xb0\xbd\xb5\x00\
+~\x97\xe6\x88\x8a\xdb2\x03\x03\x03\x83y\x8a!\xf9\xbe\
+\x5c+\xdf\x9fZF\xd2}\xe2E,\xfe\xf2\xdf\xa1\xff\
+\xb9'\xd1~\xf5\x8c\xfa\x0a\xaf\x88\x99TUf;\xbb\
+'\x9eA|\xc3\x87\xdf\xdf\xf3\xc4SNF\xd3\x94o\
+#\x99\x13\x1cj\x93\x9e\x1aC\xcf\xc9\xbd\xcdkqL\
+\x84)\x17u=Fl\xc2RA]\x89\xb1\xbe\xed\xca\
+i\xf4>\xf3\x19\xf4\x7f\xe9o\xd1y<\xd4\x8as@\
+\xca\x9a\x14\xae\xf7g4\x03B\x9c\xf300\xa8\x16t\
+_WZZ\xb1n\x03\x83\x08L\xc9\xf7'\xbdG\xdf\
+#\xdf\xab\x01t\x9d\xdc\x8b\x81\xaf|\x14\xfd\xcf~\x0e\
+\xedWO\xd7\xf5z6\xe2\xde\x9e\xed\x8f\x0b\xf1\x0c\xe2\
+\x1b\x0ah\xf2\xba\x0f}\xf5\x87\xdf\xec\xac\xf1\x93\x95a\
+\xc9>\x1d\xf4\x1dy\x1a\xd9\x91\xc8I\xefZ\x10\xad\xf1\
+\xa7\xf3\x93*\xee\xbbK\xdb.\x9fB\xdf\xd3DR\xfe\
+\x0e\x9d'BI!\xa5\x1c~+\x00J#\xfc\xf7&\
+\xba\xc7\xa0y0\x86 \x839\x0bz\x8f~\x5c\xbeW\
+\xdf*#(\x03\xe8:\xb5\x0f\x8b\xbf\xfa1,|\xf6\
+\xb3h\xbfr\xaaE\x14\x8d\xb9\xf5l\x10\xbf \x9e\xe1\
+\xc3\xef\x0c2o\xba\x0d?Y\xc1(\xc3\xe7x9\x89\
+\x98\x00\xb3J\xe8>w\xb0)\x8d\xae/\x1ac\x0e\x0a\
+\xf3\x0cO\xc2\x96s\xd7\xce\xa1\xef\x99\xcf`\xe1W>\
+\x8a\xce\x93\x01\x87\x22\x1b\xdf\x96\xf3bP\x08\xde\x17\xcd\
+\xdb\xdb\xc0\xc0\xc0\xa0\xee\xe0\xf2\xfd\xfaj\x00o\x94\xef\
+\xdd\x00\xbaN\xbf\x84\xc5_{\x02\x0b\x9f\xfb\x1c\xda\xaf\
+\x9f\x0blo\xae\x09\xa8\xb9\xd57\x1a\xc4/\x88g(\
+\xb8*\xb3\xac{\xe0!+\x83\x0co)\x02{'\x98\
+7\x1b \xb1\x9e\xb6\xdb\xad\xe5\xbf\xd9\x0cS\x90\xbe\xfe\
+8\x84E\x13\xb1\xcf\x81\xdc\xed+\xe8{\xe1\x8bX\xf4\
+\xd4\xdfD\x91\x94o\x02x\xbd\x9c\xaf\xe9+\xb56\xdf\
+\xc0\xa0j\x18a\xc5`~\xe1\xab\xf4\xde\xfd\xec\x91\x0b\
+\xb8=\xae\xb7\xb2w\x9dzI\xf8\xb4,\xd8\xfb\x94x\
+\x9f'\x851\x01yA\xbc\xc2\xaf\xaaL0,\x1cd\
+x\xad\xbf\xac\x9dg\x85\x88\xcaZ9\x99a\x0f\xcd\xc9\
+\xdc\xee\x9b\xe2\xb2\xfb\xdc!L\x0f\xacj\xd69\xc4\x82\
+6-I\x83\x8fQ\xfe\xed\x9ba\xb0\x022\xc3\xb7\xd0\
+y\xf6 z\xc2#{\xc4\xc3\xf1\xcc\xb9\xebX4\xd0\
+\xff8\x80\xaf5\xf2\x9c*\x81N+\x93N#\x97M\
+\xa3-\x9bEwg\x1bz;\xdb\x91\xcbfj\xab\xd8\
+`V\xa1\x15\xd2\xacL\xf6\xf6\x19\xda2\x87\x91/\x14\
+121\x85\xb1\x89iL\x17\x0a\xc8\x17J(\x96J\
+3\xda\x01_\x1d\x1e\xc7\xd3\xe7\xaec\xa0\xab\x1d\xf7.\
+Y >\xfd\xe89\xf6\xbcXFv\xbc\x1a\xe3\xebv\
+\xa2\xd0\xb7\xb8I\xad\x9b[\x8e\xb5\xdd\xe7\x0e{~\x93\
+\xbe2]\xa6\x1f\x94\xa8v\x17\x00'\x9e\x5c\xed}(\
+\xed~\xaf\xfdc\x92\x01\xdd\xca\x85\xe89\xb5\x0f\x13+\
+7ar\xc5\xc6F\xb7?\x11\xa2\x09K\x9d\xe8L\xec\
+j\xbcI\xe4\xd2\xe3\xc3\x82\x89\xf7\x12I\xe1\x96v\x0f\
+\x22)\xc7o\x0e\xe1\xce\xf8\x14\xae\x8fL\x10Y\xa9\xbd\
+\xbdU\x22\x9dJ\xa1\xa3-\x8b\x8e\xb6\x1c:\xdb\xb2\xe8\
+\xeah\x13d%jf\x01\x03\x03\x03\x83jA\x03\xa0\
+\x81\xben,\xea\xed\x16de|r\x1a\x13\xd3\x05L\
+N\xe719]@\xc9\xd2\xbf7\x9b\x01z7\xdf\xa6\
+\x01dW;\xb6\x84\x90\x96\xde\xc3\xdfA\xef\x91\xa71\
+\xbc\xe31\x8co\xbc\x1fE%#n\x19\x8a\xcanh\
+\xb7\x07\x1dWO\xa3\xe7\x94\xd7Ws\xd2\xedkzd\
+\xc8\xf9O\xdb+T\xb2\xf2Vu\xa7\x82L\x1d\xa7\x16\
+ \xdbR\xab\x91\x95f\x80\x07&:\x844\x07\xe9\xd5\
+\x15nYB\xda\xea>\xf2\x8cH<\xa4\xc3\xd0\xe44\
+\x8e\xde\x18\xc2\xad\xb1\xc9\x19=7j~{[\x16\xdd\
+\x1d\xed\xe8j\xcf\x09\xb2\xd2\x96\xcb\x22e\x18\xca\xbcG\
++(+\x06\xf3\x03\xf4\xbai\xcfe\xc5\xd2\xcf9\xa6\
+\xf2\x05LM\x170>\x95\xc7\xd8\xe4\x94\xf8>S\xf7\
+\x0c\x0d$IiY\xdc\xdd\x81mK\x17`A\x87o\
+^!\xce\xd1w\xe8[\xe89\xfe/\x15\x95\x0b\xfe\xfd\x03Y\xbe\xfa\
+\xb9(\xf4~\xcd\xb1\x06\x00\xfc\x00%\xb4\x15;\x8e\x0d\
+\x89Y\x12\x87v\xbc\xba!'V_\x84\x8d\xb9\xe3\xa1\
+\xfd\xe6\x05a\xf2\xe9:\x7fX[\x9e\xe2\xf1\x9f=\x7f\
+C$\x13\xf2\xa0\x81#TzI\xb5I\xf5$\x9bI\
+!\x9bJ\xc9\x17\xaf\xael\xbc\xdfL\xf3\x9a\x0e\xeb\xcc\
+u\xfbBy\x95\xeb\xde\xb9\xba\xef) \xf8\xd2\xafp\
+\x1c]\x9f\x1e\xd6A\xf9\x8f\xab\x1b\x95\xeb\x08\x98\xb6}\
+\xcc\xfbf\xb7\xdf\xb3\x95\xde\x1d\x01\xe2\x03e\x85\xef3\
+\xf4Z\xf0\xe0OU\xbd\xe6\x5cs\x1c\xcd\x89\xa9D\x8b\
+\xa9\x7f*\x9d$\xd1\x22`v\x0f\xab^{\xdd\x1f:\
+N_\xe3c\x16\xaa\xaa\xa6\xae\x0b\xea&\xf0\x91}\xd5\
+\xff\x07\x1e\x13\x86Ji\xb8S\x9fjz\xe3\x8e3\xb5\
+\xe7\x0f\xe6Q\x17\x02\xbc\xc4\xdb~\x16\x5c\xa5#\xea\xf0\
+\xdfK\x11\xcfe\xd8\xe5\xd2=k>\x9e\xa1\xbde\xec\
+\xb63\xdf}\xee\x92\xbd\x90\x8e\x98\xb9d\x9e\xfb\xce\x93\
+\xc3\xfb7\x0cPM\xb9_\x861d\xda\xb2\xe8\xccq\
+\xa1z\x10a\x11\x8aK\xa1\x04\xcbw\x5co\xbd\x9eF\
+V\x0d\x1a\xb0~\xe1\xd8E\xac\xe8\xeb\xc2\xab\xd6.\x0d\
+\xe4h\xa1\x01\xef\x22J\xdd\x7f\xed\x1c\xc66?\x80\xa9\
+%k\x12\x1dj6\xf2\x15\xe2\x0b\xc4\x1b\x14\x8c\xe4\x80\
+7\x8c+\x93'G!IJ\xd2\xdbrV\xe6\xdfv\
+\x0e~\xecY\x11\x19\x14L\x843\xf3\xa8\x87\xbaB\xa1\
+ht\x8e}!\x99g\xc9+\xfd\xf9\x0b7D\x94O\
+=o\x1e\xddX\xcfF\x9a\x91\x1fJF,\x99T\xca\
+QQ\xa2\xeaB\x82\x9b;\x8c\x04\xf0\x88:\x92\x88\x0b\
+\xfe\xb2q\xdb\x15\xa7\x1d\x95\xda\xa2#%I\xfen\xde\
+H\xa0x$\xc5\x7f\x0c\xae\xbc\xec\xfde\xe1'D\xcc\
+=\xaeS\xae\xc2\xf0\xd7\x1f\x1de\x8fp\xed\xf5N\xfb\
+}'R&1v\x8f\x1f\xf3\x04kA\x92\xba51\
+\xa5\xcee\xf2\xf7\xc8:k\x83\xef\xb7\xbdN\xbdFz\
+\x92\xabR\x18(D\xc4\xfd\xc5\x94\xb2\xde:\xb8R\x8f\
+K\x8a\xca\xbeH\x9a\x1b\xc0v\x81ve\x08w_\xe1\
+\xab\xc4\x9c\xefa/\xb6 \xc1\xe5\x9e\x01L\x94f\x14\
+\x06O+m\xc2\xcb\xbc\x95q\xdf\xbdd\xa7\x08p\xaf\
+?S\xfc}\x5cf\xcd\xb8\xffF\x0d\xbe\xfc\xfc\xc1j\
+\xba\x88L\xe6\xf9\xbb*\x05\xe4\xad\x9c\xcbd@\xbe\xaf\
+\x94\xa6\xa1X\xe2\x98,\x141\x91/\xa0$\x12u2\
+\xcf\xdf\xb7\xde#L\x1a\xc0~\xea\xe5\xb3\x22j\xe8\xa1\
+5KD\x1bTP\xf8.-\xc3;\x1f\xc3\xc8\x96\x87\
+a\xe5TR3wT\x95\xcc\xf8\xb0\xe8K}\xf8\xbd\
+A\x16\x8f\xa8 !Y!\xfc\x01\x80\x9f\x05\xb0\x1c\xb2\
+3\xef>s@\xd8\xe0Z\x11\xb5\x10\x16\xf2X\xa6\xcc\
+\x84t\x91\xfd ;\xe8\xe1kw\xb1\xef\xf2m\xe4u\
+\xe1s5B\xd7\x99\x131\xa1h\x1e\x0a9N1D\
+\xaa(\xba\xce\xb1Z\xc4!(q\xcaTC\x0e\x1a\x09\
+U-\x09\x13\x15\x02\xd1H\xaa\x00\xc1\xc2\xbf;\xe5\x14\
+\x07E\x7f\x08\xb1\xda\x19\x06\xc6\xc6LvZ6\xc1`\
+\xf0\xfe\x15}\x9d\x10\x9cW\xae\xd7\xec\xe6q\x87\x08\x0c\
+\xe3=;+k\x92\xd0\xb1Z\x10\xb3n\x8d\x92\xe0\xb4\
+L\xcf0\xdc\x9au\xa4-p_\xba#|oG\xee\
+UMt\xd7\xc3\xb3>\xe0 \xcb\x95c\xbb\xde\xe2\x5c\
+\xd9\xdb\xff\x10q\x1f\xb1p\x8b*\xeb\x19\xf3\xb53\xf4\
+.\x92\xf9\x92\x82\x97\xcfS.\xe6\x0b\xc2C\xb0\xb9\xfb\
+\xdbO\xbc\xcb\xe2\x84z\xee\xf0\xf8W\xd9\xbeW\xaa\x03\
+\x92\x9f\x8bz\x88$\xf3\xfeMl\xf3\xa6\xe7*0\xf5\
+\xef\xe4\xfd\x9b\xa8\xa7\x97\x16\x83;\x22/)\xf4\xb4\xe5\
+0Y,`l\xaa\x80\x82\x13\x00Q_\xa2b\x83\xda\
+@Y\xca\xcf\xde\x1d\xc5\x03\xab\x06\xb0c\xf9\xc2\x80?\
+\x0b\x0d\x88\xbb\xce\xbc,\xd2\xf7\xcf\xc5\xe0\x15\xe2\x09\xc4\
+\x17\x14\x5c\x97|\x226\x92\x92\x15\xb2s\xfc\x96:#\
+\xe2\x82\xc3\xdf\xc6\xc4\xea-\xc8\xf7\x07r\xca\xb5\x04\x92\
+\x12\x96\xf6\x1b\x17\xd0s\xe2\x05t^:\xae\xdd~a\
+p\x14\xcf\x9e\xbb\x81\xe1\xa9|\xc3O\x8f\x1e>\xf2E\
+\xe9i\xcf\x09sO\xd8\x80\xb7\x12q\xf0\xbf\xa0\xa1y\
+\xd1\x85\xd5\xe7Y\x1f\x9a\xdf\xc2\x97g\xc5}7E\xb6\
+\x19\x8c9N|j\x87\xe2\xb4\xdb\x1e\xa5q\xef\x88V\
+=\xae+\x0b(5\xcb\xb0g{\xff\xe0\x05\xf1F\x18\
+\xa8uy\xc7\xb4\xf2\x15\x18\xd2\xe9\xab$\xc2O\x06\xbc\
+\x87\xf5\xff\xf6\x5c\x05\xcd\xef\xb0\xf2\xdeF\xf8;\xd7\xd0\
+NK\xfd-\xdf\xfe\x9e\xeb\xedg\x94-\x0e\x06\x9d\x82\
+\xc4\x1c\xa5\xc3OD\x82\x9eS^Z\xe7\xfd\xee\xbd\xce\
+^%K\xe9]\xa1$\xd2\xf3\xb0 7$\x1c\xd0\x04\
+\xbd\xf8\xff~L\x7f\xd9\x99\xe6\xb9U\x09\x7f\xd8\x9d\x03\
+\xffa\xfcj\x92\xf2L\xf9\x9f\xb7\xe0\x05p\x0f\xe6\x92\
+\xf1\xf25\xb5y\x99\x9aR%\xa0\xba\xd8\xbcE'_\
+)*\x89\x8e8z\xce\xc3\xa9\x8f\xbb\xbf\xc1\xbd\xeb\x00\
+\xef\xc9J&\xe6\x90'\xe5\xa20\x11\x02\x0dt\xa7\xb3\
+\xe8\xcee\x85B>:=\xad\xcf\xdbRG\xd0\xc0\x96\
+\xdc\x05\x8e^\x1f\xc4\xc3k\x97b\xedBO\x1c\x0b2\
+\x13#X\xf8\xc2\xe7\xd1~\xed,F\xef}\x10SK\
+\xd7j\x0f>\xdb\xc4\x95\xdc\xe0\x0d\xc1\x13|\xf8\xcdA\
+\x86\xf1J\xfb\xaa\xa8ff\xba\x0f\x03\xf8E\x00\x9b\xec\
+\x15\x94\x86\xffn\xff\x9b\xaa\xa8\xaa\x99\x88\x1eB\xb0b\
+\x01}G\x9f\x11i\x93u\xa0\xf4\xf8\xcf\x9c\xbb!b\
+\xeb\x1b\x09z\x94\xc8\xb4\x93\xa3\xe4mm\x19\xf1\xe9\x8c\
+\x0a=\xa3wo.\x12\xb5\xaft:%p\xe77W\
+_^v\x9e\x0eO\xb26\x04_\xf3\xba\x1c\x0bj'\
+\xef\xfc\xeb\x8e\xf4\xb9g\xd4\xaf\xd6\x17r\xdd}\x92\xb7\
+w\x9b\xb7\x8c\xbe\x5c0\xeb\xaaSg\xf8A\xb5\xb5\xb1\
+@\x87\xef\x0f\xdcTv\xb7CH\x03W\xcf\xd7V\xdf\
+\xb0\xd1_\xbe\xea\xb1\x1cS\xde\xd7Q\x1d\x98\xd2a\x05\
+\x22@\xfd\xbf=\xce\x90\xc9\xb3n\xbe\xfb\xd1m\x91\xdb\
+?\xf1\xf4Q\xf7P5\xbdqmB\xa0\xfa\x8d\xf8\x94\
+\x0ce\x1d\x94-\xc1oaw)\x0fa\x12\xee\xdf\x93\
+\xa9e\x114U\x85\xa6E\xf5=X:\xf5\xc3\xff[\
+\x7f\xc7V\xb8\x87\x02\xc7\xb5\x0f\x1fq\xf1\xfd\x83\x11\xb5\
+v\xfbyT\xb3v\xdb\xd7BaV\x81\x8c\xc9a\x8d\
+\xd5\x14a\x15&\x88\xf5\x13,\x1e\x18`x\xebV\xc9\
+\xa5\xdb^\xef9\xb5\xe7\xd2h\xcfu\x09216]\
+\x10cr?q\xaa'h\xa0\xfb\xd4\xf1KX\xbd\xa0\
+\x1b\xaf\xd9\xb0\x5cD1\xa9\xa0\x812-d\x1a\x1a\xde\
+\xf6\x08xFn\x9fm,E\x82\xf8\x81\x0f\xa7%\x8f\
+H\x84j\xc8\x0a\xfd5\x7f\x03\xc0\xc7\xed\x15\xbd\xc7\x9f\
+\x17\x93\x1c\x861\xc1\x99F%u\x85\xa2|\xfa\x0e?\
+\x8d\xcc\xd8``[\xd1\xe2\x22\x86\xfe\xe0\xd5;\xf1\x93\
+\xba9\x88\xdf\x15\xd9\xb2`7\xcd\xcf\x93\xcd\xf8b\xf5\
+\xfd\xa3u[\x11\xd0\xd4\xef\x97\xf4\xfd\xcf>s\xbf\xa8\
+D\xc7\xdf\xd1\x86\x8d\xee%5\x09\xef\xa0}\xb1\xb8\xfe\
+\x11\xa2g\xe0\x15\x92\xce\x5c7\xa2\xf4w\x1aq\x94\x01\
+m\x99\x0a\x07c\xbem\x81K\x10\xf6N\xf4\xefk7\
+@\xa7D\x05:\xbbx\xf0\xbc\xeb5\xd7-\xf4\xfc\xd4\
+}\xfc\xe7\xc5B\xd6'\xc4x\xa9\xf2\xa8\x94\xcat\xa5\
+\xd3\x09k\x0e\xde3\xf6M\xa3\xaa)^(w%\x83\
+\xc2\xc2\xb8\xf3S\xed]\xfd#w'\x8f\x8d\x9a\x85U\
+w\xb1<\x84\xdd{\x99\x01[\x85\xd09\x03\xeb\xcd3\
+\xdas\x0f\xbbwc\xee\x1fU\xaf.Q\x1c\xe0%\xab\
+\xb6\xef\x89_U\xf5\x92\x06\xb7\x91n\x91\x90\x94\xf8\xb6\
+\xda\xe9\xf9\x1b\xc0\xbd\xae\x81\x13\xf2)Y\x01\xf3\xa7\xe6\
+\x0ap\x7f\xdb\xf4\xdb\xdd\xf3,\x7f\xc9e\xd2X(\xd3\
+=t\xb7\xe5\xca\xe1\xcf\x96U\xc5{?\x1eh\xe0\xfb\
+\xf53\xd7\xb0aQ\x0f6/^ \xd2N\xa8\x10\xa6\
+\xa1s\x871\xbc\xe3Q\x8cm\xd8\xdd\x9064\x1a\xed\
+7\xce\x0b~\xe0\xc3\x07\x07\x99\x7f\x1a\xa0\xca\xa8v\xce\
+\x7f\xca\xc5\xf2\xef\x01\x97x`L\xbf'\x94\xaeI\xcb\xe5#s\xb5\xa9\
+(\x83\xbb\x01\xfc\x02\x80\xbf8\x92\x93\xcb\x1d\xa9d\xc5\
+|c^\x04\xe0\xff\x02\xf0\xd4T\x01CR>f\x94\
+\x94\xd5i,\xe8\x0e\xfb\x12\x13\xcd\xa8xU\xf2\xd7\x99\
+q\x14%\xc2\xc2\x7ff*8\x06\x16\xaa\xe7V\xef\x09\
+\xe9\x8d\xe4\x00\x11\xf9\x08\x17Iv\xa6 \xf2o\xa9\xbd\
+fD\xca}\xa5\xfc\x9aA\x15\x8b\xfa\xb1\xb9W\xb8C\
+ox\xed\x0e\x02\x7f\xb8:L\xb3\x1b:\xcc(a\xc7\
+\xb2E\xa3\xac\xb8\xfev\x94\x1e;1\xdc\x99\xf1\x14U\
+\x85\xef7\x88\xed\xd27\xdaq\xa0:\xcf\x81\x92\x85\xc4\
+8'\xa7\x8b\x83AL$\xfa%\x22m}\x12g&\
+\x9dje\x06U\xf6}\xf7\xf3w\xbau\xcc\xd4\x13\xf9\
+s\x05\x93\xaf0\xfdX\x1f\xb2@e\xf1\xaa\x8a3&\
+\xb1\x15\x89\x9d\xea\x22\xa2~d\x7f\xfb',\xe9qt\
+\xd9y%a\xa8\xfb\xea6\xd9U\x99\xcc\x11|\x14\xdd\
+0a&\xbf\x8a$\x14\xd9v\xb2\x0d\x1d\x9f\x10e\x88\
+\xe0d\xc6~v\xc8\x5c\x87\xb5\xc19V\xab\x94\xcf\x92\
+\xbc\x80\xd5\xc4t\xf0\xb9\x99m\xe3|{EMZ\xe6\
+\xdbH\xcb\x17H\xfd\x7f\xc7\x0e\xf8\x91m;\x8eD\xb2\
+r5Ik\x97\xa4\x0e\x9a\xe8\x9e\x0f/\xefjH\x0a\
+e}\xf5\xf0\xeaA\x90\xde#RPbr\x1d\xab0\
+*85\xb8\xbd\xb2\xc4m\x9e\xb0\xf0\xe3a\xbd|\x1d\
+3~\x9d\xaa\x8a\xef\x85)\x13Q\xa3\xbcT\xe2\x8eA\
+\xeb\x06Y\x93\x10\xdd$md\x91u\xdaUP\xc1\x8d\
+<@\xa5||$\xd8\xdd\x8a\xf9\xd88XB#\x88\
+\x9f/#' 9rr\x92\xe4\xd7\x03\xbb\xfb\x0c6\
+\xdf\xa7\xa6\xb3Tk\xb6\x1e9E@NY\xa9\x96\x0e\
+\x8a\x9d\xac\x98l\x14\xfd\x10\xad>\xa1\xe1\x7f\x9du*\
+\xf6\xb43Y\xe0\xa6\xd2C#\xd3\x96\xe4\x07\x8f\xf2\x82\
+\x00\xb1'\xf2\xba\xd5\xac\xac\xa5\x0b\xbc\xce.;f\xdf\
+\xfbd\x92!I\xe99\x0a\xe2\x9cp\x0c\xed[jE\
+P6\xce\xcc\xeb\x8f0\xe7T\xa9\xc2\xe8\xd4U\x18\xf1\
+\x90DP\x0ep\x17\xd9\x1ei^>\xa8C\xbbnH\
+7\x1b\xcf}\x9a\xcf\xa9\xbe\xe7\xd5e\xa4\xd0\xa1\xc2\xbe\
+'F\xb6m\x9c'\xc8
*B\x05\x10\xe1\xb8\
+\x16\xf6{\x9cTR\x9c\xfa\xc0\xce\x97JJ\xf0Pb\
+\x95\x80x\x92c\xdek\xa4f\xf2E\x09\xc1\xda#\x19\
+x\x8c4a\xe1\xec \xf5\x9e\x97$\xda\xa4\x95\xcf\x13\
+\xc5&{O\xf2d\xa4T.g\x8a\xd8A\xdc\xcb=\
+\x0bvE\x1d\x89\x96\xfb\x8d8Q]\x98\xb1\xdb\x9f\xdf\
+\xe5\x8d\xa3A\xe5m\x07\xffX2\xde\xba\xa1(2\xc0\
+o\xb5\xf5cJ\xb2\x97\xa0=\xcf\x1d\x9b\xc3\xd5c\xf3\
+uf\xdc\x04\x0c\x93\xf9\x03J,\xf7p\xff\x8d\xdaY\
+8T\xc9\x8a\xb1\xcf\xbd\x85<\xa0gR\x05\xde\xb7<\
+\x8d\x8f\xadL\xd6a\xc8!\xec\xb7!&\x08\x8d\x07\x86\
+\xf5\xd7\x90_fN8\xac\x84\x11O\x82\xd9U\x83\x13\
+o\xc2\xa2y\xc2\xe2\xce\x0aL\x22a\x9b\xc26\x88s\
+\x99\xea\xc3\x17Y\x8c\xdb\xab\x1c\xa1\xb2\x96\xad.e\xbf\
+U\xecxx\xbe\x8f\x0c\xaao\xa1NM\xe9\xd2-5\
+q\x0d\xfb\xf4%\xc8\x8cR\x88\x88`\xaa?bT2\
+\x90\x84\x05\xe23m\xdbf\x843\x1e^\x0f\xbe\xa2@\
+\xdeO\xd0\xc1(\x1d\x86|\xec\xc5\x12\xf6\xe8e\xcc`\
+9x\x1d>r\x93S\xeeX\x18\xb3\xd3cj\x14\x8f\
+c\x04\x8f\xc1\xbf>R\x8da\x9f\x1e&\x83\x19)\x97\
+\xeb\xdd\xf0K\xc0\x14\x12m\xcd\xb1)\xb2\xc2MH\xc1\
+|%\x09J\xacG(F\x00\xfc\xb9\x9eX\xb5)'\
+\x11\xd7\xe2\xcaH\xc0\x0c\x04\xa3p\x93\xbe\xe5\x11\xcc\xf7\
+\x86f\xcf0\xdcW\x84h'\xfa\x16\x1ea\xe7\xf2N\
+G\x96\xb1\xb4\x16\xe3\xbb\x11\xf7\xdf{\xcfh\xbe0\x81\
+o\x91$S\x96\x09\xca>$H\x96\xad7\x1f[\x94\
+\xed\xb0\xd8\xd4T\x1f\x1bhv]\xcd\xfa\xde\xa0\xf9\x8c\
+v\xab5\x5c>\xba\x88\xeb\xc6\xb3\xcb\x09=N\x91\xb1\
+\xff\xf3PL\xdf\x7f(\x92\x95\xebi9\xed\xb3S\x07\
+?\xb62Q\xff\xdd\xbb>\xd22\x99\xc9\x09:\xde\xeb\
+\xdf+\xa4&\xb0 \xacV\x89z\xf8\xfbd\x13R\xa4\
+\xa2bK\xa2\xe7\xda\xa1\xd3\x93\x7fF\x02\xe0\xc5\x5c\x06\
+[\xba\x19q%H\xd9\xc8\x22Gh\xacj\xd2\xad\xc9\
+\x88\x0bJ\xd2Z$\x87\xf33\xb8q\xb8\xed\x92\x0b\xa2\
+b\x0d\xd0\xce\xb7\x85g\xb2\xed\x8a\xb5\x00\xaa\x9eA\x11\
+qdP\x1b\xfa\xd5:x9\x1d~f\xd1\x13\xa0\x8a\
+\x8a\xa5\x8a*\xf2\xf58Z/\xe1h\xbd\x88\xa3\xb0\x84\
+\xbdz\xb9~5\xef\xb7\x19\xe6\xe6\xf4\x18\xbd\xcam\xb3\
+\x14\xfd\x02m/\xd2\xdfc\xf4\xbaD\xcey\xb3\xd4\xdc\
+\xfd\xf4t\x06:gy\x13\xba1jr`\xd1\xb6Q\
+E\xa7i{W\x1dbf\x5cn\x80q\x00{\xe8u\
+\x9c\x1eL\xcc9S\xb4=C\xc7\xe5\xf6\xb6\xe1a\x8c\
+\xe1\x115\x86G0\x8a\x87\xf5(\x1eVc\xf5\xbee\
+\xbe\xc8\xa9f\xbf[\x99\xb96\x9aM\x83\xd9\xb8\xc7\x94\
+\xee\x99\xb2\x0a\x04\x87n\x5cU\xaa\x86\xf0R\x0d\xdc\x17\
+:\xe3W\xc2\xee\x05p:_7tz\xe5\xf5\xb9\xec\
+\xb5raE\xed\xae\xa7\x03\x81EG\xb73\x97\x82%\
+\xb8vx\x19\xdf'\x9f\xe4!\x9a\xe8\xd9\xc8%\x15\x19\
+i\xd2\x83h\xb7PS\xd2\xc3\x9bz@J\xb2\x9a\x1e\
+\x15\xa52\x013\xdf)w;\xb2u7\xcb\x14\x98.\
+\x9c2\xb4Z\x93\x16\xf3\x97\x81\xc9\x84\xfbV\x00\xff\x92\
++\xb0\x13q(\x91\x95o\x02\xf0\x9b\x00^\x98:x\
+\x0f\xf9\xa5|re\x92\xfdl\xdb\x94\x08\xae\xb0 T\
+&\x88\xd5\xca\xef\x96\xcb\xa7`\xc9J \xbe\xa4\x16\xe9\
+\xb3\x93\x1fK\x9e\x14\xd4\xc8yNj\x82\x8d\xf7E\xe2\
+J\x82x\xc9 \x05\x97g\xa5J\xfc\x06\xa8\xb0\xf7y\
+\xf5\x84\xc5G*(w\x9e[c( p\x95\xbf\xf7\
+0\x15\x86\xdfR\x944\x099u\xca\xa7\xd9\x0dL\x1c\
+\xe2\x09\xd5\x9b\x87z\xc9\x1d\xb2L\x0e\xa9\xa7\x9f\xe0\x03\
+M\x83\xb5\xcb8\xa2\x1e\xa3\x17q\x9c^\xc4\xd1X\xc2\
+1z\x01\xc7\xe8\xa5\xda|\xb3\x85x\x90Ve\xfd\x86\
+q\xc7b\xdb_\xa7c_\xa7\xf7\x0f\xd6\xc2\xc0\x91\x07\
+\xa3\xba\x1ekRT\xd0\xa2\xa4\xc7\xd2\xebq\xb4\x92\xfa\
+\x09l\xfb\xd8\xad\x1a\x9d}\x18\xa9I\xcb\x83h\xc8\xcb\
+70\x86\x870V{\x12\xb9o\x98T\x11\x99R\xc0\
+\xbf\x91\x92\xb2\xe8\xf0\x1f\xf7o\xec\xbc\xa9\x12\x8aF\x88\
+
1\x9a\xdaG\x9f\xc7G\xa0\x8d\x0eO\
+\xbf|\xa2\x83_/Q4Ga\xa4\x13\x00\x8e\x038\
+\xc6\xdbGY\xe0\x08\x82\xe0\x11\x11+\x82\xe0L\x03\xff\
+6\xbd\x85\xc3\x04[X\xa4\xb4\xf9\xfe\x9d\x85\xab\x90h\
+hF\xb2\xbe\x19I\xe3;\x89\x92\xfa&$k\x1bt\
+q\x02MRV\xdc\x98v\x90\xbc\x18Y\xc9dJ\xbc\
+\x8c\xdd\x8462\x94\x1207o@\x1b\xb91\xf3N\
+\xaf\xe8d\xe6\xb6\x9cY\xcc\xafWY\xce\xb8\xc6\xa2\xe5\
+0\x80C\xfc:\xca\xb3\x9d\x04A\xb0 S\x97\x05!\
+\x05%\xb3n\x03p\x1b\x0b\x93\xad\x9c_\xe2\x8f:\x08\
+G\x90hjC\xb2\xb1U\x7f%\x1a\xdb\x90L\x7fn\
+h\xf1\x14J\x11f\x07\x0a/i7\x07\xa1\x0d_\x87\
+6t\x0d\x81\xe1k\xa9\xed\xe1\xeb\x08\x0c]\xd3CU\
+>\x91\xe4<\x98\xb4x\xd9\x0f\xe0E\xce\x97\x11\x849\
+\x8d\x88\x15a.B\x89\xad\xb7\xb38\xd9\xce\xef\xedy\
+\x7f\x0f\xba iG\xb2\xa5\x03\x89\xe6v$\x9b\xe9\xbd\
+C\x7fO\xd6\xd6\xcb_\xb4\x0aE\xa3\x10\xd3\x8d\x01\x04\
+n\x0c\xe8\xef\xda\xe0U};0t\xd5/!s\x95\
+E\xcb>~\xdf\xcb\x89\xbe\x820w\xfe\x9d\x89X\x11\
+*\x9c\x06\x16&w\x03\xb8\x13\xc0]<\x058g\xf4\
+\xbc\x90\xd6\xf9H\xb4v\x22\xd1:\x1f\xc9\xd6yH\xb4\
+t\xeaa\x1ba\xee2\x9dwc\xd8\xa0pR`\xb0\
+\x1f\x81\xc1+\x08\x5c\xbb\x02\x8d\xb6\xaf_\xd6\xf3g\xf2\
+\x84\xa6\x5c\xef\x06\xf0<\x80],`$\x84$T,\
+\x22V\x84J\x22\xc0\xc9\xaeiQr\x17'\xc0\x06s\
+}\xc6\xc4\xfceH\xb4/@\xa2}\xa1\xfeN\x22E\
+Oj\x15\x04\x0bf\xb1\xe2\x9e2Lb\x85DK\xe0\
+\xea%\x04\xae]B\xe0\xeaE\x04.\xe7\x15\xed\x89s\
+\x02\xefn\x83\x889\xae\xa8\x1a,\x08e\x89\x88\x15\xa1\
+\x9c\xa1)\xa5/3\x08\x93\x1d\x1eK\xbf\xdb\xa0\xbc\x91\
+D\xc7B$:\x17\xb30Y\xa8\xe7\x93HB\xab\xe0\
+\x05\x95\xab\x925\xc9$\x02\x94\x0bC\xc2\x85DL\xff\
+y\x04\xaf^\xd4\xf3er\x84\x96\x22\xd8c\x100\xcf\
+J\x81;\xa1\x5c\x11\xb1\x22\x94\x13\x1d,N\xee\xe5\xd7\
+-\xb9\xb8&z\x82\xeb\xbc%Ht,Fb\xdeb\
+\xfd]\xdc\x12!\x1f\xb2qU\xdcPi\x1d\xdd\x85\x19\
+8\x8f`\xffy\x04\x06. \xd0\x7fN\x1759@\
+\xee\xcbA\x00O\x03x\x86_2\x85Z(\x0bD\xac\
+\x08\xa5\x0cM\x11\xfe)\x00\xaf\xe0\xd7\x86\x5cf\xe7$\
+\x16,G|\xf1\xaaTHg\xfe2}\x1a\xb0 \xf8\
+\x89Y\xa3\xe4)Vl\x97\xdb\xdb\xa3\xe9\xd6\xc1\xcbg\
+\x11\xb8r\x06\xc1\xf3\xa7\x10\xbc|&\xd7\xdbQ\xa8\xe8\
+'\x00\x9e\xe0\xf7k\xb9\xf5\x5c\x10\x0a\x8b\x88\x15\xa1\x94\
+\xa8gqr\x1f\x8b\x93\xad\x9c\x87\xe2\x99\x04%\xbb\x92\
+(Y@\xc2d\xb9\xfe\x99\xaa\xb0\x0aB\xa1\xf0%\x04\
+d\xbc\xd2\x83X\xb1\x9d\x91H\xe8I\xbc\xc1Kgt\
+\xe1\x12\xbcr\x16\x81\xebW\xb2\xbd}\x82\xa7L?i\
+\x10/R\x81W(\x09D\xac\x08\xb3\x09\xb9$\xb7\x02\
+x-\x80\xfby\xc6N$\x9b\xfe\xe8\xae\xc9\xb2\xf5)\
+q2o\x99\xd4+\x11\x8aN!C@\x0e;\x9c\x8f\
+\x1a\xc3G\xd1\x09v_\xfa\x10:s2\x17\xf7%\xca\
+\xb9.\xdf\xe7\xd7\x01\x1f\x8b\x0d\x0bBV\x88X\x11\x8a\
+\x0d\xe5\x9d\xd0_\xbaW\xb3@\x99\x9f\xcd\xfd\x13\x0bW\
+ \xb6j\xab\xfeN\xc9\xb0\xe2\x9a\x08\xb3M\xb1C@\
+\x8eg8\x9e\xca\x07\x12\x09\x04\xaf^@\xf0b/B\
+\xa7\x0e#x\xa9/\xdb.\xd2\xaa\xd4\x8f\x1b^\x92\xef\
+\x22\x14\x0d\x11+B\xa1\x09\xb1c\xf2jvP\xb6g\
+\x13\xda\xd1\x9d\x93\xd5[\x10_\xb4:%Ndv\x8e\
+PB\xf8\x15\x02\xf2\xdbU\xc9\xd4FJ\x18%\x11\xec\
+\xbf\x80\xe0\x85S\x08\x9f>\x82\xe0\xe5\xac\xc4K\x82\x8b\
+\xd4\x91\xe3\xf2C\xae\xf5\x12\xcb\xa6\x01A\xc8\x06\x11+\
+B!h\x05\xf0z\x00od\x91\xe2y:qb\xfe\
+R\xc4WlN%\xc4.X\xa6\xaf\xea+\x08\xa5J\
+aC@>\xba*\x1e\xaeK&\x13\x08^:\x8b\xd0\
+\xc5S\x08\xf7\x1eE\xb0\xff\x5c\xc6\xfb\x1b\x18b\xd1\xf2\
+ \x80G\x00\xe44]I\x10\x9c\x10\xb1\x22\xf8\xc5\x0a\
+\x16'o\x02p\x8f\xd7E2\x93\xcd\xed\x88/\xdb\x80\
+\xf8\xa2\x15H,[\x8fdDrN\x84\xf2\xa0$\x12\
+k3\x9e\xea\xe0\xaaX\x0e\xa9D\x17\xe5\xbc\x84\xce\x9e\
+D\xe8R\x1fBgO\xa4\xd6A\xf2F\x8c\xa7E\x7f\
+\x8f\xc5K\xaf\xd7\x0b\x05\xc1\x09\x11+B\xaeh\xbc\xe8\
+\xdf\x9bX\xa4\xdc\xe2\xb5\x1d\x0a\xed\xc4V\xdf\x82\xc4\xb2\
+\xb5H\xb4-\x90?\x00\xa1,)\xd5\xc4\xdaL\xd7;\
+\x8a\x15\xc7\x8e\xa4>S\xc5\xdd\xd0\xb9n\x84O\x1dF\
+(\xbbd\xdd\x83,Z\xbe\xc7\x8b3J\x92\xae\x905\
+\x22V\x84l\xa0\x99:/\x07\xf0f\x00?\x03`\x89\
+\x97k\xa9L}|\xc5F$\x16\xaeD|\xe9Z \
+\x90s\xf5{A(\x19\xca&\xb16\xc3u\x99EW\
+\xd2\xdeZ<\x8e\xf0\xf9n=I7|\xe68\x82\xd7\
+.g\xec/C\xb1\xa5\x87\x00|\x17\xc0S<\xe3H\
+\x102\x22bE\xc8D\x18\xc0+\x01\xbc\x83E\x8a\xa7\
+\xd5\xfa\xa8\xd6I|\xf5\xd6\x94H\xa1Z'\x82PA\
+T\x5c\x08\xc8\xb51\x85X\xb1\x5c\x1f\xbc~\x05\xe13\
+'\x10\xee=\x82\xd0\x15\xcfk\x1c\xdd`\xd1\xf2\x0d\x00\
+?\x060\xe5\xf5Ba\xee!bEP\x11\xe4\xc2l\
+$P\xde\xc2\x09\xb3\xae$#U\x88\xaf\xdc\x82\xc4\xa2\
+\x15\x88\xaf\xdc,Ub\x85\x8a\xa6RB@9\xb9*\
+\x8e\xb9.)\x02c\xc3\x08\xf7\x1dG\xe8r\x9f\x9e\xa8\
+\xabMM\xba=J\x1aJ\xc8}\x80\x85\xcb\x13\xbc4\
+\x80 L#bEH\x13\xe4\xf5vH\xa0\xbc\x95\xeb\
+\xa1\xb8B\x8b\xff\xc5WmA|\xe1\x0a\xc4Wm\x96\
+\xf0\x8e0'({W\x05\x16\xb1\x92\xa7\xab\xe2\xda\xff\
+D\x1c\xe1\xbecz\x92n\xa4\xef(\x027o8u\
+\xd8\x08\xd5o\xf9\x0e\x0b\x97\xa7E\xb8\x08\x10\xb12\xe7\
+\x09\xf0\xc2\x80o\x07\xf06/\x05\xda(!\x96\xea\x9e\
+$\x16\xadB|\xc9\x9a\xb9\xfe\xfd\x09s\x90\xb2\xae\xad\
+\x02\x8bP\x81\xa3\xe2\xc8\xc9Uq\xbeo\xea\xff\xa1\xf3\
+\xa7\x10\xbe\xd4\x8bH\xef\x11=t\xe4\x01J\x86\xf96\
+\x80o\xf2\xaa\xd1\x09/\x17\x09\x95\x87\x88\x95\xb9\xc9z\
+\x00\xbf\x04\xe0\x17\x01,\xcd\xf4\x0dP\xceI|\xf5-\
+\x88/]\xa3\x8b\x14A\x98\xcbTTbm!]\x15\
+K\x0bI\xcb\xb9\xe1\x8b\xbd\x08_\xe8I\x09\x97\xc1~\
+\xa7\x871B\xc90_\x03\xf0\x15\x00'\xbc\x5c T\
+\x0e\x22V\xe6\x0e\xb4\x82\xf1;Y\xa4\xec\xc8\xf4\xd4\x89\
+\x96N\xc4\xd7lEb\xf1\x1aqP\x04\x81\xa9\x94\xc4\
+Zo97\xceb%\x17W\xc5*V\x8c\xa7\x87/\
+\xf6 |\xe14\x22\xbd\x87\x11\xbcq\xd5\xa1?&\xf6\
+\x00\xf8\x0f\x00_\x97\x95\xa2\xe7\x06\x22V*\x9b*\x00\
+?\x0d\xe0W\xf8=\xec\xf6\xb4T\xa0-\xb6\xf6\xd6T\
+\x88g\xe9\xba\xb9\xfe\xdd\x09\x82\x8d\x8aJ\xac-\xb0\xab\
+bl\xc5M\xa8X\xaf\xa3)\xd1\x94\xe3Ru\xea\x10\
+\x82\xc3\x19u\x08\xcd z\x94\xdd\x16\xaa\x9c\xeb)\x9b\
+W(?D\xacT&ws\x88\xe7\xe73\xcd\xe4\xa1\
+$\xd9\xd8\xfa\xed\xfa\xc2\x80\xf1\xe5\x1b\xe6\xfa\xf7&\x08\
+\xae\x94c\x08\xc8\xaa\x0bJ\xcdUq\xebs\xe4l\x97\
+>\xab\xa8\xba\xe7\x00\x02#\x19\x93siF\xd1\x7f\x01\
+\xf8*\xafU$T\x10\x22V*\x87N\x00\xbf\x0a\xe0\
+\xdd\x9c\x93\xe2L0\x88\xd8\x86;R+\x18\xaf\xbf]\
+\x16\x07\x14\x04\x0fTT\x08(cC\x19\xc4J\x16\xae\
+\x0a\xacb\xc5\xa3P\xb1\x9eW\xd5\xf5\x22\xc2W\xfaP\
+\xdd\xf5\xa2>\xcb(\x03\x94\xd3\xf2o\x00\xfe\x15\x80\xa7\
+\x84\x18\xa1\xb4\x11\xb1R\xde\xd0\x5c\xe1\xfb\x01\xbc\xcfK\
+\x98G/\xd4\xb6f+bkoC\xb2\xde\xf3\xda\x82\
+\x82 \x14<\x04\x94\x85Pq<=s\x08\xa8X\xae\
+Jjo~\xae\x8a-\xec\xc4\xff\x0f\x8c\x0e\xa3\xfa\xd4\
+ADz\x8f\x22\x9cy\xb1\xc5t\x98\xe8\x0b\xbcB\xb4\
+L\x83.SD\xac\x94'4\x83\xe7\xd7\x01\xbc\x07\xc0\
+B\xb7'\xd0g\xf2\xac\xb9U\x0f\xf1\xd0\x8a\xc6\x82 \
+d\x8f\xb8*\xaa\xeb3\xdd7{\xb1\xe2\xd45[\x8f\
+Xx\x85\x07\xce#r\xee$\xaaN\x1fA\xe8FF\
+\x03\xe5\x22\x80/\x01\xf8\x22\xcf,\x12\xca\x08\x11+\xe5\
+C\x90\xdd\x93\xf7\x03x-\x7fV\x92\xac\xa9Cl\xe3\
+\x8e\xd4Z<+7\xcd\xf5\xefM\x10\xf2\xa6\xb0\xaeJ\
+\xe66\xcb\xcfU\x81Z\xac\xe4\x14\x02r\x16+\xc6\xa3\
+UT\xee\xff\xf2\x19Tw\xefC`bL\xd9/&\
+\xce.\xcb\xe7\xd8u\x11\xb7\xa5\x0c\x10\xb1R\xfa,`\
+\x07\x85B=\x8b\xddzKa\x1e\x9a\xcd\x13\xdf\xb8\x03\
+\xc9\xaa\x9a\xb9\xfe\xbd\x09\x82oxs$2SLW\
+\xc5z]\xc5\xb8*\xa6vm\xb1\x22h\xd1\x09\xd4t\
+\xedG\xd5\xe9C\xba\xf3\x92\x01:\xe1\xf3\xec\xb6\x5c\xca\
+t\xb20{\x88X)]hu\xe3\x0fr\xe9{\xc7\
+\x5c\x94dS\x1bb\xeb\xb6!\xbet=\x12\x8bV\xce\
+\xf5\xefL\x10|\xa7\x12B@\xde\x9d!\xb5X)u\
+WE}]\x12\xe1+gPu\xbe\x1b\xd54\x0d\xfa\
+\xe6\xa0\xb2\xbf\xcc\x14\x97\xf8\xff\x0c\xaf\x06-\x94\x18\x22\
+VJ\x8b:\x9er\xfc\x9b\x006\xbb\xf5,\xb1`\xb9\
+>\x93'\xb6\xe9N}v\x8f \x08\x85\xa1bB@\
+EpU\x8c\xad\x14\xdeU\xb1v\xd0z\xad\xe1X\x22\
+\x8e\x9a\xae}\xa8\xe99\xe0%)\xf7(\x80\x7f\xe2\xa2\
+s\xa3\x99N\x16\x8a\x83\x88\x95\xd2`\x05\x0b\x94_\x03\
+\xd0\xec\xd4\xa3dc+b\xeboC|\xf9F]\xac\
+\x08\x82Px\xca1\x04d24\x92\xc6\x9d\xd9\xbb*\
+\xeaK\xb3tU\xe0\xfe \x85pU\x9c\x8e\x85\xfb\xcf\
+\xa2\xea\x5c\x97>\xa3(\xe8^\xbb\x85\x0e~\x99\x85K\
+\xaf\xdb\x89B\xe1\x11\xb12\xbb\xdc\x07\xe0#\x00\xde\xc0\
+\x8b\x0a*\x89\xcf_\xaaO7\x9e\xdat\x17\xb4H\x04\
+R\x15E\x10\x8a\x83_!\xa0\xc2\xb9*\xea\x03\xb3\xed\
+\xaa \x8b\x10\x90[\xd7\xac\xbd\xca\xc9Uq\x226\x85\
+\x9a\xae\xbd\xa89\x951\xb7\x85\x16O|\x18\xc0?\x00\
+x\xc2\xedD\xa1p\x88X)>\x94\x7f\xf2\x0e\x00\xbf\
+\x0d\xe0V\xa7\xbb'#U\x98\xda\xf2R\xc4\x17\xadD\
+|Y\xba\xc6\x9b\x06\x8d\x0a\xb8\xa5\xfe\x13\x04\xa1\xc0\x94\
+\xa3\xabb\xdc[Q\xae\x0a\xdc\x13kg>:\x1fS\
+\xde\x97\x0a\xce\x9d\xefF\xe4r\x1fj\x8f\xef\x816\xe5\
+Z\xb1\xff\x00\x80\xbf\x05\xf0\x0d\xces\x11\x8a\x84\x88\x95\
+\xe2\xd1\xcc\xd3\x8e\x7f\x03\xc0\x12\xa7\xbb&\xda\xe6#\xb6\
+\xe6V\xc4\xd6\xdd\x86D\xa3\xaaR~\x00Z@\xc4\x8a\
+ \x14\x1a\xbf\x5c\x158j\x85\x02\x87\x80J%\xb1\xd6\
+\xda\xa9\xcc\xbb\x95=R\xba*\x8ak\xbd\xb8*\xe6\xa6\
+f>QX\x88\xc2C5\xbd\x87\x11r_\x09\xfa<\
+\x87\x87>\xc7\xe1\x22\xa1\xc0\x88X)<\x94\x8f\xf2a\
+.\xe2\xd6\xe0t\xb7\xf8\x82\xe5\x98Z\x7f;\xa66\xdf\
+\x95A\x88\xa4\x94\x8a&\xee\x8a \x14\x14\xef\x03\xbd;\
+\x85\x0b\x01\x95\x8e\xabbl\xc5\x0fWE\xd5+?C\
+@FWE\xed\xe8\x00\xb5'\xf7\xea\x09\xb9\x91~\xd7\
+\xfaq7\xb9\xd0\xdc\xa7%\xaf\xa5\xb0\x88X)\x1c;\
+\x00\xfc\x0eO=VO\xd7\xd14D\xb7\xbd\x1c\xf1%\
+k\x10[\xc2\xab\x1cg\x14!)\xa5\x22bE\x10\x0a\
+\xcb\x5c\x0f\x01\x95\x92\xabbn\xd7\xc7\x10P\xd2\xa1O\
+\x06\xaa.\x9e\xd2_uGv*\x1en\x9a8O}\
+\xfe\x1b\x00{\x9c\xef,\xe4\x8a\x88\x15\xff\xa1\xea\xb2\xbf\
+\xc7uR\x94$\xea\x9bS.\xca\x9a[\x91h\x9bg\
+\x10\x1d\xa9\xad\xcc\xeb\x0aJ\xee\x8a \x14\x92r\x0f\x01\
+y\x17*PK\x03[b\xae{;\x8eb\xa5L]\
+\x15\xd5E\xa1\x1bWP\xdd{\x04\xb5=\x07\x10\x1c\x1d\
+r\xbeA\xaaN\xcb'\xb8J\xae\xe0\x13\x22V\xfc\x81\
+f\xf2\xbc\x05\xc0\x1f\x00\xb8\xcd\xa9\xc5x\xfb\x02L\xad\
+\xd9\x86\xe8\xa6;\x91\xac\xaa\x9d\x11\x1a\xd3\xa2C\xb3|\
+v\x82\xdd\x15O\xe7\x0a\x82\x90-\x85\x0d\x01e!T\
+\x1cO/\x1dW\xc5\xd8J\xd6!\xa0\x12rU\x5c/\
+K\xce\xb4\x1e\x88N\xa4BD\xbd\x87\x11\xbe~\xd9\xf9\
+F\xc0~\x00\xff\x1f\xc0\x03<\xa3H\xc8\x03\x11+\xf9\
+A3{\xde\x05\xe0w\x01\xacwj)6o)\xa2\
+\xebnG\xd4\x98\x8f\xa2\x8b\x0c\xab8\xc9F\xac\xf0\xf5\
+\x22V\x04\xc1W*\xc6U\xb1}pn'\xb3X\xc9\
+\xc1U\x81\xe3\x17\x90\xbf\xab\xa2\xb8\xb6\x90\xae\x8aI\x0a\
+\x19\x9e\xa9\xb6k\x9f\xee\xb4D\x06\x5c\x0b\xcd\x9d\x00\xf0\
+W\x00\xbe&3\x88rG\xc4Jn\xd4p\xc2,\xe5\
+\xa4,sjar\xe3\x0eL-Y\x8b\xa9\x15\x9b9\
+t\x03\x8b#b\x90\x19J\xf1\xe2B\xba\x1d\x11,\x82\
+\xe0+\x85uU2\xb7\xe9\xcd\xcc\xf0#\x04\xe4\xaf\xab\
+\x02\xab\xb0\xc8\xc1UQ\xf5\xcaK\x08\xa8\xd0\xae\x0al\
+\x8fc>\xbb\xfa\xecqT]\xe8A]\xd7>\xe7\x9b\
+\xa7Vz\xfekN\xc8\x1dw;Q\xb0#b%;\
+\xeay\xea\xf1o\x01\xe8t\xbar|\xeb=\x98Z\xb6\
+\x01S\x0bV\x18\xa6\x19k)\xc1\x12\xb0\x86o\xd4\x82\
+\xc5[\xde\x8a\xa9!\x11,\x82\xe0\x03\xe6\xb1\xa8<\x5c\
+\x15\xe3\xde\xa4m\xc3\xbd\x9dRvU\xcc\xed\x16\xceU\
+q\xbcT\xe9\xaa(\xfa\xc8\xefUW\xfaP}\xae\x0b\
+\xf5G\x9fs\xee\x08@s\xa2?\xc5S\x9fG\xdcN\
+\x14f\x10\xb1\xe2\x8d\xb4H!'\xa5]yE \x88\
+\xf1[\xeeAt\xf9&\xc4:\x16\x99B:\x81\xb4\xa8\
+\xe0\x1d\xba`1\x09\x0c\xa3\xa3\x92m(\xc8\xba-\x08\
+B\xaeTL\x08\xc8\x93+d\x97\x06^\x9d\x11U\x0b\
+Y\x89\x95|\x5c\x15\xdb\xe6\xec\xba*\xaak\xc3W/\
+\xa2\xe6\xecq]\xb4h\x89\xb8S\xebWy\xf6\xd0?\
+\x8bh\xc9\x8c\x88\x15wH\xa4|\x88EJ\x87\xea\xcc\
+dU\x0d\xc67\xdd\x85\xc9\xd5\xb7\x22\xd1\xdcn\xf17\
+4\x83X\x81Gw\xc5k\xe2\xacU\xa0\x88`\x11\x84\
+|)\xfd\x10P\xe9\xb8*\xc6V\xfcpU`\x15\x1e\
+\xd9\x86\x802<\xf2\xf4\x13\xe7\xea\xaa@\xfd\x5c\xaak\
+\xd3\xfd\x0e\x0d_E\xed\xe9C\xa8?\xf9\x02\x02\x93\x8e\
+\x91\x9f\x01\xae\x8a+\xa2\xc5\x05\x11+j\xeaX\xa4|\
+\xccI\xa4$\xea\x9a0\xbe\xfevL\xae\xbb\x1d\x89\xba\
+F\xbbpH\xbf\xf3~M%X\x94\xd7\xc0\xfb\xb4d\
+M\xb3\x89\x15@\x04\x8b \xe4J9\x86\x80\x94\xceH\
+\x0eb\xa5\xd4\x5c\x15s\xbb\xb3\xe1\xaaX\xee\xa0\xe8\x8b\
+\x9bP16\x14\x1c\xbb\x89\xba\x9e\xfd\xa8\xeb~\xd1m\
+\xda\xf3\x00\xe7\xb4\xfc\x8b\xac\xf6lG\xc4\x8a\x99\x8c\x22\
+%^\xd7\x84\x89\x0dw`|\xd3\xddHF\xaa\xcd\xc2\
+@\xe5\x94\xd8\x04\x8b6\xb3O\xd3,\xaeKzS\xb3\
+\x08\x1c'\xc4]\x11\x04\xbf\xf0+\x04T8WE}\
+\xc0\xf7\x10P\x96\xae\x8a\xcd\xac\xa8 W\xc5\xdeo\xef\
+\xae\x8a\xea\xac@t\x12\xf5'\xf6\xa0\xae{/\x82\xa3\
+\xc3N\xdd\x15\xd1\xa2@\xc4J\x8a\x08\x80\xf7\x01\xf8C\
+\x00\xf3U'\xc4\xeb\x1a1\xb1~\x07\xc66\xde\x85d\
+U\xf5\xf4\xb4a\x18e\x86R\xac\xa8\xc4G&w%\
+-fr\x08\x05\x99\xfa!\x08\x82W\x0a\x1b\x02*\x8c\
+\xabb\xdc[LW\x05\x06\xa1P\xce\xae\x8a\xe3\xa5>\
+\xba*\xaa\x8fZtB\x0f\x0d\xd5\xbb\x8b\x96\xcb\x5c\xa7\
+\x85\xd6\x1f\x8a:\x9d4W\x98\xebb\x85\x8a\xb9\xfd\x22\
+\x80?\x03\xb0\x5cuB\xbc\xb6\x11\xe3\x1bv`|\xc3\
+\x9dHT\xd5L\xe7\x93 \x1d\xaea\xecy&n\xb3\
+|\xa6\x1b\xb0\xb8+\xb08/\xd9\x8a\x15s'D\xb0\
+\x08\x827\xfcrU\xe08(\x176\x04\x94om\x15\
+\xbbX\xc9\xd1Uq\xb8\xbf/\xae\x8am3\x1b\xb12\
+\xfb\xae\x8a\xf1czo@\x17-{P\xdf\xb5W\x0f\
+\x159\xd0\x07\xe0O\x00|u.\x17\x97\x9b\xabb\x85\
+\xc6\xf17\x01\xf8\xbf\x006\xa9N\xd0E\xca\xfa;0\
+6-R,\x22\xc0P\x94\xcd\xb8o\xe6\xcd\xa1\x86\x8a\
+I\xe4\xcc$\xdb\x9a]\x17x\x17,\xa6\xbc\x15\xd3\x0d\
+E\xac\x08\x82G\x0a\xeb\xaadn3\xb3\x09Sj\xae\
+J\xea\xff\xb3\x95X\x9bt\xd8\xef|\xdf\xec]\x15{\
+\xbf\xdd]\x15\xf5m\xec\x82J%y(\xf9\x96\x04K\
+\x06\xd1r\x8c\xdd\xff\xef\xe5\xf5\x97\xb4L\x99\x8bb\xe5\
+\x95l\xad\xedP\x1d$a2\xba\xe9%\x18_\xbfC\
+\xdfN\xab\x90\xd4\x9bA\x86\xa4\xf7\x9b5\x89K(\xc8\
+\xe8\xaeX\xf2S\x9c\xdc\x95\xf4-]\x85\x87\x83\xbb\x82\
+L\xd7\x09\x82\x90\xc6<\x16\x95\x87\xabb\xdc\xeb\xafX\
+)\xb6\xabb?\xe8o\x08\xc8\x0fW\xc5|\x85\x1f\xae\
+\x8a\xeaSZ\xb44\x1c\xdf\xed6{h\x0f/\xed\xf2\
+c\xa7\x13*\x91\xb9$V\xb6\x01\xf8$\x80W)\x8f\
+\x06\x02\xb8\xb9\xe5^\x8c\xa5g\xf7\x98rQ\xd2\xf2\xc3\
+\xe0\xa4\x18\xac\x14\x8b\xf6\x989\xd7\x88E\xc4X\x05K\
+@\xd3,\x09\xb5^\xc3AN.\x8a\xb8+\x82\xe0\x05\
+\xb7A)[\x8a)V\xb2\x17*PJ\x83rK\xac\
+\xb5=\x81\xab\x08\x9a\xe9\xab\xf3q\xeb\xce\xe2\xba*\xaa\
+v\x82\xe37Q\xdf\xb5\x0fMG\x9e\x05\x92\x8e\x91\x9f\
+\x1f\x01\xf88\x80\x17\x1d\x8eW\x14sA\xac,\xe5p\
+\xcf\xbb8G\xc5\x06\x89\x94\xf1U[\x11k\xee0\xb8\
+(\xa9\xb3\x8c\x8e\x0a\x0c\x82\xc5\x18\xb6Q\x89\x15X\x05\
+\x8b\xcdq1\x5c\xc7\xee\x8a*\x09w\xfa:G\xe1\xe1\
+&JD\xb0\x08B&\x9c\x06\xa5lq\x1e\x94\xbd\x0c\
+\xfen\xa7\x96\x9a\xab\x02\xd3\xc2~\xea\xc6\xac\xe7{\xed\
+\x91\xdf! \xb5PQ^\xea\xab\xab\xa2\xec\xb4g\xb1\
+\x92&