From e6aa7f7be8da0fc6cf82b05aac302430b0f3264c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Thu, 18 Sep 2025 21:34:36 +0800 Subject: [PATCH] config --- .DS_Store | Bin 6148 -> 6148 bytes doubao/.DS_Store | Bin 0 -> 6148 bytes doubao/README.md | 37 ++ .../__pycache__/audio_manager.cpython-37.pyc | Bin 0 -> 11856 bytes doubao/__pycache__/config.cpython-312.pyc | Bin 0 -> 1470 bytes doubao/__pycache__/config.cpython-37.pyc | Bin 0 -> 1276 bytes doubao/__pycache__/protocol.cpython-37.pyc | Bin 0 -> 3339 bytes .../realtime_dialog_client.cpython-37.pyc | Bin 0 -> 6294 bytes doubao/audio_manager.py | 385 ++++++++++++++++++ doubao/config.py | 63 +++ doubao/main.py | 20 + doubao/protocol.py | 135 ++++++ doubao/realtime_dialog_client.py | 180 ++++++++ doubao/requirements.txt | 4 + doubao/whoareyou.wav | Bin 0 -> 94252 bytes 15 files changed, 824 insertions(+) create mode 100644 doubao/.DS_Store create mode 100644 doubao/README.md create mode 100644 doubao/__pycache__/audio_manager.cpython-37.pyc create mode 100644 doubao/__pycache__/config.cpython-312.pyc create mode 100644 doubao/__pycache__/config.cpython-37.pyc create mode 100644 doubao/__pycache__/protocol.cpython-37.pyc create mode 100644 doubao/__pycache__/realtime_dialog_client.cpython-37.pyc create mode 100644 doubao/audio_manager.py create mode 100644 doubao/config.py create mode 100644 doubao/main.py create mode 100644 doubao/protocol.py create mode 100644 doubao/realtime_dialog_client.py create mode 100644 doubao/requirements.txt create mode 100644 doubao/whoareyou.wav diff --git a/.DS_Store b/.DS_Store index 5da4b23321c72c6cd30b6b8a8b0287fdc56524b6..a3aa95e72e0682f9f19c6ea699d66e012c09a01e 100644 GIT binary patch delta 210 zcmZoMXfc=|#>B)qu~2NHo}wrR0|Nsi1A_nqLn1?dPP$=ma(-^X=8cTY8S6n(Yz!$3 z`3$8DNyySbaTq|6&&_vnNy^Dj0!nh&EvekCV0YXR$VO9>LQqXX2FMwcwHTE)t1w2h gZf57;=K#7G=&J9`lles~Ie-oZA_j)d0U}$N0Z#%iG5`Po delta 86 zcmZoMXfc=|#>B`mu~2NHo}wrV0|Nsi1A_nqgDyiZLq09N?kfK<`p_2won~U(52f!uZRwEr>qzvW*a?w9MPJ$9D%=IL|GV_Q|*L%W3qiMlvlK3;ugz59lBw|}37CxhT2!9Xw& z3wd)35}Q?d&6>cperQ+kk9BM&{<2+Cpl)v-ViGg zHCLdys+SmQ?wC(*mmPaUa~JjELw)C$;zi5uh@XnNXf}*K7zhT23`}ge;QfD%UuLw( zAG*XS7zhUb83Q`4*3}9h<#+3c&*NR2&~DHuwCkxrpbs7a81Ni9FN?OGsKYKh_J)kY S`Qi?Yhd?1Dx?tcJ78m9 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 ON8~S+zf|ss1^)+DsAa|g literal 0 HcmV?d00001 diff --git a/doubao/__pycache__/config.cpython-312.pyc b/doubao/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13dd3b3f8ab01ccd7e23ead846a4ffcb4cb327ff GIT binary patch literal 1470 zcmZ`&O>7%Q6yCMHcI-Hg?fj=n`g6iUjw!8L384Zas?_qMf&{99&}y?YiMQR|S$1X< z?34RTi$VobrJ!PHN{U)2O)l_uuOYEYSvCp*y^n(-rA0+keJo%%$xVU zpKsoqUphKs0*s$;{*?c~f$dN^I4+@Kz{k-D77xWA3)b4A&1Gpk(!wMFll&h{v>;}-tozDWi@Rqi zeI}P97B;Dcv6>&9C@_o^Q^lhyF>;Ef<)(M!Y^>-^GjI-RicY2+%!Oiln&|3i%c^*SXNvet|&Ax;S#Z>d;bxet4t2nz4 z6+8Yl@ewVX7l~s0V;B6BM#j<1TJd(!>!Zzg+ewWz_@5UyQsX++K%QKpZ$c$`I z?Y<-ke59C{4MoRt!7+<@;>d>_OJmrUC$uTX=(=Am9<)?L`|)i-$OL&r%_|U8=iy0W z8w%s?R52`YU@Htm77?JY9L6?}D-P0#tP*oln{xb)Si64Gn?2z?2iw&<^Q(7$sGhxC zS^mCqW2JiJ8}I$g)pN(aFK&1X*Zy9at&}cR=2yIxQl&fxV)fY7>Z$A1v*!W-pmcP@ z2Ux5vEw3$oy1sA*;MK)aW%)?u<1?$bPlD0f($)3S`SsG#)mvAa;@Y)iYwvwkJ$@5> z@Q|vpLL)J6c5e0d*L$6(AhXKZrONCPZ}IcWsc!-6EuLHb?zFdf+BEwftz*z-EgTvHWT7;%4|(#vM)29Xe_dgsYOhRdECb8wCuMHaTt$krsXi% zASfe2^$3$q#lUc(1<=GdOr6Cg{I9JgytPBH%3&)z$T-)NvxBN)0ct1o_&*OD!e@6OeiGR?66U*@Tl!s zxJyUJd+Z!I^jnwShhHryisC(?{hpAhwF#;H;$QuP?$C%kyxkpm^3S2o^RfBRrPzho zLj3okY`s044A-S-PvAEpRT~tdNjJW2eykP@q+_*UC?2lGh3=i;r+>ih-Q;fCQjdfN zV)bYgG`&L4u-kXg9ek@67TQxEJ^@xeF~AOQb4L#NAqTe9qf$CnPbE6T^{tzmLB>QO uk#-YZZZhR|^}ETwxz3L|A&*{2Aze%VNBKu`>)qs5Q1=Dy3SD*<2>t`Sa1XWs literal 0 HcmV?d00001 diff --git a/doubao/__pycache__/config.cpython-37.pyc b/doubao/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52a32acad2ea0075f839f3fe30afdb09d5356a12 GIT binary patch literal 1276 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 BWCH*I literal 0 HcmV?d00001 diff --git a/doubao/__pycache__/realtime_dialog_client.cpython-37.pyc b/doubao/__pycache__/realtime_dialog_client.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2f60c70e270e283ae931d78d5a2d4044be3e93f GIT binary patch literal 6294 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 yrSb`Nilsws pyaudio.Stream: + """打开音频输入流""" + # p = pyaudio.PyAudio() + self.input_stream = self.pyaudio.open( + format=self.input_config.bit_size, + channels=self.input_config.channels, + rate=self.input_config.sample_rate, + input=True, + frames_per_buffer=self.input_config.chunk + ) + return self.input_stream + + def open_output_stream(self) -> pyaudio.Stream: + """打开音频输出流""" + self.output_stream = self.pyaudio.open( + format=self.output_config.bit_size, + channels=self.output_config.channels, + rate=self.output_config.sample_rate, + output=True, + frames_per_buffer=self.output_config.chunk + ) + return self.output_stream + + def cleanup(self) -> None: + """清理音频设备资源""" + for stream in [self.input_stream, self.output_stream]: + if stream: + stream.stop_stream() + stream.close() + self.pyaudio.terminate() + + +class DialogSession: + """对话会话管理类""" + is_audio_file_input: bool + mod: str + + def __init__(self, ws_config: Dict[str, Any], output_audio_format: str = "pcm", audio_file_path: str = "", + mod: str = "audio", recv_timeout: int = 10): + self.audio_file_path = audio_file_path + self.recv_timeout = recv_timeout + self.is_audio_file_input = self.audio_file_path != "" + if self.is_audio_file_input: + mod = 'audio_file' + else: + self.say_hello_over_event = asyncio.Event() + self.mod = mod + + self.session_id = str(uuid.uuid4()) + self.client = RealtimeDialogClient(config=ws_config, session_id=self.session_id, + output_audio_format=output_audio_format, mod=mod, recv_timeout=recv_timeout) + if output_audio_format == "pcm_s16le": + config.output_audio_config["format"] = "pcm_s16le" + config.output_audio_config["bit_size"] = pyaudio.paInt16 + + self.is_running = True + self.is_session_finished = False + self.is_user_querying = False + self.is_sending_chat_tts_text = False + self.audio_buffer = b'' + + signal.signal(signal.SIGINT, self._keyboard_signal) + self.audio_queue = queue.Queue() + if not self.is_audio_file_input: + self.audio_device = AudioDeviceManager( + AudioConfig(**config.input_audio_config), + AudioConfig(**config.output_audio_config) + ) + # 初始化音频队列和输出流 + self.output_stream = self.audio_device.open_output_stream() + # 启动播放线程 + self.is_recording = True + self.is_playing = True + self.player_thread = threading.Thread(target=self._audio_player_thread) + self.player_thread.daemon = True + self.player_thread.start() + + def _audio_player_thread(self): + """音频播放线程""" + while self.is_playing: + try: + # 从队列获取音频数据 + audio_data = self.audio_queue.get(timeout=1.0) + if audio_data is not None: + self.output_stream.write(audio_data) + except queue.Empty: + # 队列为空时等待一小段时间 + time.sleep(0.1) + except Exception as e: + print(f"音频播放错误: {e}") + time.sleep(0.1) + + def handle_server_response(self, response: Dict[str, Any]) -> None: + if response == {}: + return + """处理服务器响应""" + if response['message_type'] == 'SERVER_ACK' and isinstance(response.get('payload_msg'), bytes): + # print(f"\n接收到音频数据: {len(response['payload_msg'])} 字节") + if self.is_sending_chat_tts_text: + return + audio_data = response['payload_msg'] + if not self.is_audio_file_input: + self.audio_queue.put(audio_data) + self.audio_buffer += audio_data + elif response['message_type'] == 'SERVER_FULL_RESPONSE': + print(f"服务器响应: {response}") + event = response.get('event') + payload_msg = response.get('payload_msg', {}) + + if event == 450: + print(f"清空缓存音频: {response['session_id']}") + while not self.audio_queue.empty(): + try: + self.audio_queue.get_nowait() + except queue.Empty: + continue + self.is_user_querying = True + + if event == 350 and self.is_sending_chat_tts_text and payload_msg.get("tts_type") in ["chat_tts_text", "external_rag"]: + while not self.audio_queue.empty(): + try: + self.audio_queue.get_nowait() + except queue.Empty: + continue + self.is_sending_chat_tts_text = False + + if event == 459: + self.is_user_querying = False + if random.randint(0, 100000)%1 == 0: + self.is_sending_chat_tts_text = True + asyncio.create_task(self.trigger_chat_tts_text()) + asyncio.create_task(self.trigger_chat_rag_text()) + elif response['message_type'] == 'SERVER_ERROR': + print(f"服务器错误: {response['payload_msg']}") + raise Exception("服务器错误") + + async def trigger_chat_tts_text(self): + """概率触发发送ChatTTSText请求""" + print("hit ChatTTSText event, start sending...") + await self.client.chat_tts_text( + is_user_querying=self.is_user_querying, + start=True, + end=False, + content="这是查询到外部数据之前的安抚话术。", + ) + await self.client.chat_tts_text( + is_user_querying=self.is_user_querying, + start=False, + end=True, + content="", + ) + + async def trigger_chat_rag_text(self): + await asyncio.sleep(5) # 模拟查询外部RAG的耗时,这里为了不影响GTA安抚话术的播报,直接sleep 5秒 + print("hit ChatRAGText event, start sending...") + await self.client.chat_rag_text(self.is_user_querying, external_rag='[{"title":"北京天气","content":"今天北京整体以晴到多云为主,但西部和北部地带可能会出现分散性雷阵雨,特别是午后至傍晚时段需注意突发降雨。\n💨 风况与湿度\n风力较弱,一般为 2–3 级南风或西南风\n白天湿度较高,早晚略凉爽"}]') + + def _keyboard_signal(self, sig, frame): + print(f"receive keyboard Ctrl+C") + self.stop() + + def stop(self): + self.is_recording = False + self.is_playing = False + self.is_running = False + + async def receive_loop(self): + try: + while True: + response = await self.client.receive_server_response() + self.handle_server_response(response) + if 'event' in response and (response['event'] == 152 or response['event'] == 153): + print(f"receive session finished event: {response['event']}") + self.is_session_finished = True + break + if 'event' in response and response['event'] == 359: + if self.is_audio_file_input: + print(f"receive tts ended event") + self.is_session_finished = True + break + else: + if not self.say_hello_over_event.is_set(): + print(f"receive tts sayhello ended event") + self.say_hello_over_event.set() + if self.mod == "text": + print("请输入内容:") + + except asyncio.CancelledError: + print("接收任务已取消") + except Exception as e: + print(f"接收消息错误: {e}") + finally: + self.stop() + self.is_session_finished = True + + async def process_audio_file(self) -> None: + await self.process_audio_file_input(self.audio_file_path) + + async def process_text_input(self) -> None: + await self.client.say_hello() + await self.say_hello_over_event.wait() + + """主逻辑:处理文本输入和WebSocket通信""" + # 确保连接最终关闭 + try: + # 启动输入监听线程 + input_queue = queue.Queue() + input_thread = threading.Thread(target=self.input_listener, args=(input_queue,), daemon=True) + input_thread.start() + # 主循环:处理输入和上下文结束 + while self.is_running: + try: + # 检查是否有输入(非阻塞) + input_str = input_queue.get_nowait() + if input_str is None: + # 输入流关闭 + print("Input channel closed") + break + if input_str: + # 发送输入内容 + await self.client.chat_text_query(input_str) + except queue.Empty: + # 无输入时短暂休眠 + await asyncio.sleep(0.1) + except Exception as e: + print(f"Main loop error: {e}") + break + finally: + print("exit text input") + + def input_listener(self, input_queue: queue.Queue) -> None: + """在单独线程中监听标准输入""" + print("Start listening for input") + try: + while True: + # 读取标准输入(阻塞操作) + line = sys.stdin.readline() + if not line: + # 输入流关闭 + input_queue.put(None) + break + input_str = line.strip() + input_queue.put(input_str) + except Exception as e: + print(f"Input listener error: {e}") + input_queue.put(None) + + async def process_audio_file_input(self, audio_file_path: str) -> None: + # 读取WAV文件 + with wave.open(audio_file_path, 'rb') as wf: + chunk_size = config.input_audio_config["chunk"] + framerate = wf.getframerate() # 采样率(如16000Hz) + # 时长 = chunkSize(帧数) ÷ 采样率(帧/秒) + sleep_seconds = chunk_size / framerate + print(f"开始处理音频文件: {audio_file_path}") + + # 分块读取并发送音频数据 + while True: + audio_data = wf.readframes(chunk_size) + if not audio_data: + break # 文件读取完毕 + + await self.client.task_request(audio_data) + # sleep与chunk对应的音频时长一致,模拟实时输入 + await asyncio.sleep(sleep_seconds) + + print(f"音频文件处理完成,等待服务器响应...") + + async def process_silence_audio(self) -> None: + """发送静音音频""" + silence_data = b'\x00' * 320 + await self.client.task_request(silence_data) + + async def process_microphone_input(self) -> None: + await self.client.say_hello() + await self.say_hello_over_event.wait() + await self.client.chat_text_query("你好,我也叫豆包") + + """处理麦克风输入""" + stream = self.audio_device.open_input_stream() + print("已打开麦克风,请讲话...") + + while self.is_recording: + try: + # 添加exception_on_overflow=False参数来忽略溢出错误 + audio_data = stream.read(config.input_audio_config["chunk"], exception_on_overflow=False) + save_input_pcm_to_wav(audio_data, "input.pcm") + await self.client.task_request(audio_data) + await asyncio.sleep(0.01) # 避免CPU过度使用 + except Exception as e: + print(f"读取麦克风数据出错: {e}") + await asyncio.sleep(0.1) # 给系统一些恢复时间 + + async def start(self) -> None: + """启动对话会话""" + try: + await self.client.connect() + + if self.mod == "text": + asyncio.create_task(self.process_text_input()) + asyncio.create_task(self.receive_loop()) + while self.is_running: + await asyncio.sleep(0.1) + else: + if self.is_audio_file_input: + asyncio.create_task(self.process_audio_file()) + await self.receive_loop() + else: + asyncio.create_task(self.process_microphone_input()) + asyncio.create_task(self.receive_loop()) + while self.is_running: + await asyncio.sleep(0.1) + + await self.client.finish_session() + while not self.is_session_finished: + await asyncio.sleep(0.1) + await self.client.finish_connection() + await asyncio.sleep(0.1) + await self.client.close() + print(f"dialog request logid: {self.client.logid}, chat mod: {self.mod}") + save_output_to_file(self.audio_buffer, "output.pcm") + except Exception as e: + print(f"会话错误: {e}") + finally: + if not self.is_audio_file_input: + self.audio_device.cleanup() + + +def save_input_pcm_to_wav(pcm_data: bytes, filename: str) -> None: + """保存PCM数据为WAV文件""" + with wave.open(filename, 'wb') as wf: + wf.setnchannels(config.input_audio_config["channels"]) + wf.setsampwidth(2) # paInt16 = 2 bytes + wf.setframerate(config.input_audio_config["sample_rate"]) + wf.writeframes(pcm_data) + + +def save_output_to_file(audio_data: bytes, filename: str) -> None: + """保存原始PCM音频数据到文件""" + if not audio_data: + print("No audio data to save.") + return + try: + with open(filename, 'wb') as f: + f.write(audio_data) + except IOError as e: + print(f"Failed to save pcm file: {e}") diff --git a/doubao/config.py b/doubao/config.py new file mode 100644 index 0000000..d3196cc --- /dev/null +++ b/doubao/config.py @@ -0,0 +1,63 @@ +import uuid +import pyaudio + +# 配置信息 +ws_connect_config = { + "base_url": "wss://openspeech.bytedance.com/api/v3/realtime/dialogue", + "headers": { + "X-Api-App-ID": "", + "X-Api-Access-Key": "", + "X-Api-Resource-Id": "volc.speech.dialog", # 固定值 + "X-Api-App-Key": "PlgvMymc7f3tQnJ6", # 固定值 + "X-Api-Connect-Id": str(uuid.uuid4()), + } +} + +start_session_req = { + "asr": { + "extra": { + "end_smooth_window_ms": 1500, + }, + }, + "tts": { + "speaker": "zh_male_yunzhou_jupiter_bigtts", + # "speaker": "S_XXXXXX", // 指定自定义的复刻音色,需要填下character_manifest + # "speaker": "ICL_zh_female_aojiaonvyou_tob" // 指定官方复刻音色,不需要填character_manifest + "audio_config": { + "channel": 1, + "format": "pcm", + "sample_rate": 24000 + }, + }, + "dialog": { + "bot_name": "豆包", + "system_role": "你使用活泼灵动的女声,性格开朗,热爱生活。", + "speaking_style": "你的说话风格简洁明了,语速适中,语调自然。", + # "character_manifest": "外貌与穿着\n26岁,短发干净利落,眉眼分明,笑起来露出整齐有力的牙齿。体态挺拔,肌肉线条不夸张但明显。常穿简单的衬衫或夹克,看似随意,但每件衣服都干净整洁,给人一种干练可靠的感觉。平时冷峻,眼神锐利,专注时让人不自觉紧张。\n\n性格特点\n平时话不多,不喜欢多说废话,通常用“嗯”或者短句带过。但内心极为细腻,特别在意身边人的感受,只是不轻易表露。嘴硬是常态,“少管我”是他的常用台词,但会悄悄做些体贴的事情,比如把对方喜欢的饮料放在手边。战斗或训练后常说“没事”,但动作中透露出疲惫,习惯用小动作缓解身体酸痛。\n性格上坚毅果断,但不会冲动,做事有条理且有原则。\n\n常用表达方式与口头禅\n\t•\t认可对方时:\n“行吧,这次算你靠谱。”(声音稳重,手却不自觉放松一下,心里松口气)\n\t•\t关心对方时:\n“快点回去,别磨蹭。”(语气干脆,但眼神一直追着对方的背影)\n\t•\t想了解情况时:\n“刚刚……你看到那道光了吗?”(话语随意,手指敲着桌面,但内心紧张,小心隐藏身份)", + "location": { + "city": "北京", + }, + "extra": { + "strict_audit": False, + "audit_response": "支持客户自定义安全审核回复话术。", + "recv_timeout": 10, + "input_mod": "audio" + } + } +} + +input_audio_config = { + "chunk": 3200, + "format": "pcm", + "channels": 1, + "sample_rate": 16000, + "bit_size": pyaudio.paInt16 +} + +output_audio_config = { + "chunk": 3200, + "format": "pcm", + "channels": 1, + "sample_rate": 24000, + "bit_size": pyaudio.paFloat32 +} diff --git a/doubao/main.py b/doubao/main.py new file mode 100644 index 0000000..985cbd0 --- /dev/null +++ b/doubao/main.py @@ -0,0 +1,20 @@ +import asyncio +import argparse + +import config +from audio_manager import DialogSession + +async def main() -> None: + parser = argparse.ArgumentParser(description="Real-time Dialog Client") + parser.add_argument("--format", type=str, default="pcm", help="The audio format (e.g., pcm, pcm_s16le).") + parser.add_argument("--audio", type=str, default="", help="audio file send to server, if not set, will use microphone input.") + parser.add_argument("--mod",type=str,default="audio",help="Use mod to select plain text input mode or audio mode, the default is audio mode") + parser.add_argument("--recv_timeout",type=int,default=10,help="Timeout for receiving messages,value range [10,120]") + + args = parser.parse_args() + + session = DialogSession(ws_config=config.ws_connect_config, output_audio_format=args.format, audio_file_path=args.audio,mod=args.mod,recv_timeout=args.recv_timeout) + await session.start() + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/doubao/protocol.py b/doubao/protocol.py new file mode 100644 index 0000000..5b5b06c --- /dev/null +++ b/doubao/protocol.py @@ -0,0 +1,135 @@ +import gzip +import json + +PROTOCOL_VERSION = 0b0001 +DEFAULT_HEADER_SIZE = 0b0001 + +PROTOCOL_VERSION_BITS = 4 +HEADER_BITS = 4 +MESSAGE_TYPE_BITS = 4 +MESSAGE_TYPE_SPECIFIC_FLAGS_BITS = 4 +MESSAGE_SERIALIZATION_BITS = 4 +MESSAGE_COMPRESSION_BITS = 4 +RESERVED_BITS = 8 + +# Message Type: +CLIENT_FULL_REQUEST = 0b0001 +CLIENT_AUDIO_ONLY_REQUEST = 0b0010 + +SERVER_FULL_RESPONSE = 0b1001 +SERVER_ACK = 0b1011 +SERVER_ERROR_RESPONSE = 0b1111 + +# Message Type Specific Flags +NO_SEQUENCE = 0b0000 # no check sequence +POS_SEQUENCE = 0b0001 +NEG_SEQUENCE = 0b0010 +NEG_SEQUENCE_1 = 0b0011 + +MSG_WITH_EVENT = 0b0100 + +# Message Serialization +NO_SERIALIZATION = 0b0000 +JSON = 0b0001 +THRIFT = 0b0011 +CUSTOM_TYPE = 0b1111 + +# Message Compression +NO_COMPRESSION = 0b0000 +GZIP = 0b0001 +CUSTOM_COMPRESSION = 0b1111 + + +def generate_header( + version=PROTOCOL_VERSION, + message_type=CLIENT_FULL_REQUEST, + message_type_specific_flags=MSG_WITH_EVENT, + serial_method=JSON, + compression_type=GZIP, + reserved_data=0x00, + extension_header=bytes() +): + """ + protocol_version(4 bits), header_size(4 bits), + message_type(4 bits), message_type_specific_flags(4 bits) + serialization_method(4 bits) message_compression(4 bits) + reserved (8bits) 保留字段 + header_extensions 扩展头(大小等于 8 * 4 * (header_size - 1) ) + """ + header = bytearray() + header_size = int(len(extension_header) / 4) + 1 + header.append((version << 4) | header_size) + header.append((message_type << 4) | message_type_specific_flags) + header.append((serial_method << 4) | compression_type) + header.append(reserved_data) + header.extend(extension_header) + return header + + +def parse_response(res): + """ + - header + - (4bytes)header + - (4bits)version(v1) + (4bits)header_size + - (4bits)messageType + (4bits)messageTypeFlags + -- 0001 CompleteClient | -- 0001 hasSequence + -- 0010 audioonly | -- 0010 isTailPacket + | -- 0100 hasEvent + - (4bits)payloadFormat + (4bits)compression + - (8bits) reserve + - payload + - [optional 4 bytes] event + - [optional] session ID + -- (4 bytes)session ID len + -- session ID data + - (4 bytes)data len + - data + """ + if isinstance(res, str): + return {} + protocol_version = res[0] >> 4 + header_size = res[0] & 0x0f + message_type = res[1] >> 4 + message_type_specific_flags = res[1] & 0x0f + serialization_method = res[2] >> 4 + message_compression = res[2] & 0x0f + reserved = res[3] + header_extensions = res[4:header_size * 4] + payload = res[header_size * 4:] + result = {} + payload_msg = None + payload_size = 0 + start = 0 + if message_type == SERVER_FULL_RESPONSE or message_type == SERVER_ACK: + result['message_type'] = 'SERVER_FULL_RESPONSE' + if message_type == SERVER_ACK: + result['message_type'] = 'SERVER_ACK' + if message_type_specific_flags & NEG_SEQUENCE > 0: + result['seq'] = int.from_bytes(payload[:4], "big", signed=False) + start += 4 + if message_type_specific_flags & MSG_WITH_EVENT > 0: + result['event'] = int.from_bytes(payload[:4], "big", signed=False) + start += 4 + payload = payload[start:] + session_id_size = int.from_bytes(payload[:4], "big", signed=True) + session_id = payload[4:session_id_size+4] + result['session_id'] = str(session_id) + payload = payload[4 + session_id_size:] + payload_size = int.from_bytes(payload[:4], "big", signed=False) + payload_msg = payload[4:] + elif message_type == SERVER_ERROR_RESPONSE: + code = int.from_bytes(payload[:4], "big", signed=False) + result['code'] = code + payload_size = int.from_bytes(payload[4:8], "big", signed=False) + payload_msg = payload[8:] + if payload_msg is None: + return result + if message_compression == GZIP: + payload_msg = gzip.decompress(payload_msg) + if serialization_method == JSON: + payload_msg = json.loads(str(payload_msg, "utf-8")) + elif serialization_method != NO_SERIALIZATION: + payload_msg = str(payload_msg, "utf-8") + result['payload_msg'] = payload_msg + result['payload_size'] = payload_size + return result diff --git a/doubao/realtime_dialog_client.py b/doubao/realtime_dialog_client.py new file mode 100644 index 0000000..92a92ba --- /dev/null +++ b/doubao/realtime_dialog_client.py @@ -0,0 +1,180 @@ +import gzip +import json +from typing import Dict, Any + +import websockets + +import config +import protocol + + +class RealtimeDialogClient: + def __init__(self, config: Dict[str, Any], session_id: str, output_audio_format: str = "pcm", + mod: str = "audio", recv_timeout: int = 10) -> None: + self.config = config + self.logid = "" + self.session_id = session_id + self.output_audio_format = output_audio_format + self.mod = mod + self.recv_timeout = recv_timeout + self.ws = None + + async def connect(self) -> None: + """建立WebSocket连接""" + print(f"url: {self.config['base_url']}, headers: {self.config['headers']}") + self.ws = await websockets.connect( + self.config['base_url'], + extra_headers=self.config['headers'], + ping_interval=None + ) + self.logid = self.ws.response_headers.get("X-Tt-Logid") + print(f"dialog server response logid: {self.logid}") + + # StartConnection request + start_connection_request = bytearray(protocol.generate_header()) + start_connection_request.extend(int(1).to_bytes(4, 'big')) + payload_bytes = str.encode("{}") + payload_bytes = gzip.compress(payload_bytes) + start_connection_request.extend((len(payload_bytes)).to_bytes(4, 'big')) + start_connection_request.extend(payload_bytes) + await self.ws.send(start_connection_request) + response = await self.ws.recv() + print(f"StartConnection response: {protocol.parse_response(response)}") + + # 扩大这个参数,可以在一段时间内保持静默,主要用于text模式,参数范围[10,120] + config.start_session_req["dialog"]["extra"]["recv_timeout"] = self.recv_timeout + # 这个参数,在text或者audio_file模式,可以在一段时间内保持静默 + config.start_session_req["dialog"]["extra"]["input_mod"] = self.mod + # StartSession request + if self.output_audio_format == "pcm_s16le": + config.start_session_req["tts"]["audio_config"]["format"] = "pcm_s16le" + request_params = config.start_session_req + payload_bytes = str.encode(json.dumps(request_params)) + payload_bytes = gzip.compress(payload_bytes) + start_session_request = bytearray(protocol.generate_header()) + start_session_request.extend(int(100).to_bytes(4, 'big')) + start_session_request.extend((len(self.session_id)).to_bytes(4, 'big')) + start_session_request.extend(str.encode(self.session_id)) + start_session_request.extend((len(payload_bytes)).to_bytes(4, 'big')) + start_session_request.extend(payload_bytes) + await self.ws.send(start_session_request) + response = await self.ws.recv() + print(f"StartSession response: {protocol.parse_response(response)}") + + async def say_hello(self) -> None: + """发送Hello消息""" + payload = { + "content": "你好,我是豆包,有什么可以帮助你的?", + } + hello_request = bytearray(protocol.generate_header()) + hello_request.extend(int(300).to_bytes(4, 'big')) + payload_bytes = str.encode(json.dumps(payload)) + payload_bytes = gzip.compress(payload_bytes) + hello_request.extend((len(self.session_id)).to_bytes(4, 'big')) + hello_request.extend(str.encode(self.session_id)) + hello_request.extend((len(payload_bytes)).to_bytes(4, 'big')) + hello_request.extend(payload_bytes) + await self.ws.send(hello_request) + + async def chat_text_query(self, content: str) -> None: + """发送Chat Text Query消息""" + payload = { + "content": content, + } + chat_text_query_request = bytearray(protocol.generate_header()) + chat_text_query_request.extend(int(501).to_bytes(4, 'big')) + payload_bytes = str.encode(json.dumps(payload)) + payload_bytes = gzip.compress(payload_bytes) + chat_text_query_request.extend((len(self.session_id)).to_bytes(4, 'big')) + chat_text_query_request.extend(str.encode(self.session_id)) + chat_text_query_request.extend((len(payload_bytes)).to_bytes(4, 'big')) + chat_text_query_request.extend(payload_bytes) + await self.ws.send(chat_text_query_request) + + async def chat_tts_text(self, is_user_querying: bool, start: bool, end: bool, content: str) -> None: + if is_user_querying: + return + """发送Chat TTS Text消息""" + payload = { + "start": start, + "end": end, + "content": content, + } + print(f"ChatTTSTextRequest payload: {payload}") + payload_bytes = str.encode(json.dumps(payload)) + payload_bytes = gzip.compress(payload_bytes) + + chat_tts_text_request = bytearray(protocol.generate_header()) + chat_tts_text_request.extend(int(500).to_bytes(4, 'big')) + chat_tts_text_request.extend((len(self.session_id)).to_bytes(4, 'big')) + chat_tts_text_request.extend(str.encode(self.session_id)) + chat_tts_text_request.extend((len(payload_bytes)).to_bytes(4, 'big')) + chat_tts_text_request.extend(payload_bytes) + await self.ws.send(chat_tts_text_request) + + async def chat_rag_text(self, is_user_querying: bool, external_rag: str) -> None: + if is_user_querying: + return + """发送Chat TTS Text消息""" + payload = { + "external_rag": external_rag, + } + print(f"ChatRAGTextRequest payload: {payload}") + payload_bytes = str.encode(json.dumps(payload)) + payload_bytes = gzip.compress(payload_bytes) + + chat_rag_text_request = bytearray(protocol.generate_header()) + chat_rag_text_request.extend(int(502).to_bytes(4, 'big')) + chat_rag_text_request.extend((len(self.session_id)).to_bytes(4, 'big')) + chat_rag_text_request.extend(str.encode(self.session_id)) + chat_rag_text_request.extend((len(payload_bytes)).to_bytes(4, 'big')) + chat_rag_text_request.extend(payload_bytes) + await self.ws.send(chat_rag_text_request) + + async def task_request(self, audio: bytes) -> None: + task_request = bytearray( + protocol.generate_header(message_type=protocol.CLIENT_AUDIO_ONLY_REQUEST, + serial_method=protocol.NO_SERIALIZATION)) + task_request.extend(int(200).to_bytes(4, 'big')) + task_request.extend((len(self.session_id)).to_bytes(4, 'big')) + task_request.extend(str.encode(self.session_id)) + payload_bytes = gzip.compress(audio) + task_request.extend((len(payload_bytes)).to_bytes(4, 'big')) # payload size(4 bytes) + task_request.extend(payload_bytes) + await self.ws.send(task_request) + + async def receive_server_response(self) -> Dict[str, Any]: + try: + response = await self.ws.recv() + data = protocol.parse_response(response) + return data + except Exception as e: + raise Exception(f"Failed to receive message: {e}") + + async def finish_session(self): + finish_session_request = bytearray(protocol.generate_header()) + finish_session_request.extend(int(102).to_bytes(4, 'big')) + payload_bytes = str.encode("{}") + payload_bytes = gzip.compress(payload_bytes) + finish_session_request.extend((len(self.session_id)).to_bytes(4, 'big')) + finish_session_request.extend(str.encode(self.session_id)) + finish_session_request.extend((len(payload_bytes)).to_bytes(4, 'big')) + finish_session_request.extend(payload_bytes) + await self.ws.send(finish_session_request) + + async def finish_connection(self): + finish_connection_request = bytearray(protocol.generate_header()) + finish_connection_request.extend(int(2).to_bytes(4, 'big')) + payload_bytes = str.encode("{}") + payload_bytes = gzip.compress(payload_bytes) + finish_connection_request.extend((len(payload_bytes)).to_bytes(4, 'big')) + finish_connection_request.extend(payload_bytes) + await self.ws.send(finish_connection_request) + response = await self.ws.recv() + print(f"FinishConnection response: {protocol.parse_response(response)}") + + async def close(self) -> None: + """关闭WebSocket连接""" + if self.ws: + print(f"Closing WebSocket connection...") + await self.ws.close() diff --git a/doubao/requirements.txt b/doubao/requirements.txt new file mode 100644 index 0000000..63f83ff --- /dev/null +++ b/doubao/requirements.txt @@ -0,0 +1,4 @@ +pyaudio +websockets +dataclasses==0.8; python_version < "3.7" +typing-extensions==4.7.1; python_version < "3.8" \ No newline at end of file diff --git a/doubao/whoareyou.wav b/doubao/whoareyou.wav new file mode 100644 index 0000000000000000000000000000000000000000..024d5a2274aa718007ddbb1bb9a9bd46f178eb36 GIT binary patch literal 94252 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∓`+<&RZ8`ol&L5kbFF4`LEX8LGOu&|#CO1;5tqZ}`Tr|zja z12e{(UJgCoBK`hm7P$ z^V3OJT`we`J#db2x%;yG(yG+uXTwiUKQ=XqdFa-`;C=UYRct@MY0{>+9m@`ruf%8M z{m803*1V+cuHhJ|+#Lx=ML+2CJcQ~!Q1+Vpol{0n#`&P_c7gt>uEgwaskQw^zaj;( z4vEIO4+zQ&Uf_Gj^MkjKIF6HAC!7Bi?Wlxg?Wr|kM)nI z;Ihe`#2JExt{c5S`_1yEdQDTid)#u%RNRr3Ll1mfaYIg3sr=}@sS)m>HU784ya!{( z1x`6I85yIEA^Asnq9RK6E{`+G5co&`jBEppHHN%lMLmFmAR?67~lY%nL1 zlxGu~*Vy!?Y@L^3rOw`&*IlneY4&tPcQD#Q8}3$JC@cSM{k|wG_U*~1{q8-v@%_T4 zvu97gICue7Qiv$Zj`2MlMX(185HzdcXT4!F@u}a_4!m>M+NsS(z!*pAEQVcA;$QqZa{9_{uOr7q3}o_--GDjiUH*cJk+P2XfAH z`!l=93mAdIA_-j@A{!!GCJ7YY<|T6av3)pqh5Owzd%qbparlKnwSAU_Rz%?j3>`RY zKu_QF(9c0zdnJTqhMW%i=0o%v;(aUVeq?jZ#QqCnUWF@y!hLA!YPTfiAn{S|LDmA+ zVO9uZ2xS`16}8NH4gCVoAdMgm#wJ>FyGJ+0RvC*Zd3V1xeTx2Y_|2ae!=L3ontg9| zy77kn>WNFC7f+i@2b}XC6vznu9(Aej_`bQ( zbE1o*3M2c32ZcNf$`23(xCf~HFZql8LjoibvY}tbe;XY$L^^;QeW~w^VeYdqQ&QtT z_pc5=6=3$e?yYyvQRTSyC{}w(f`8%+(`OeLh`2xM%tUBj;O}#}$aCt6|liZSsT)S0$6c_lT znX^fsoi}W)Hm-fY{g)l-#4tD6S3Bt_9H6UH)HD(Ud zjvdU17yc9cV2&jiZ0~!PYfpAqT2?l;*U@SgmOm+S{#1OUeBStF!1tcwA@$zvL)zxl zvWw5;Sl^s|q`#GXCH4aT!r05W8=G!^xJJFW?o{;AJIPsxUnXT7nV)=h|DS}ctxX%g z#vh+0of0rBX!V+tX|HDeeWKwygw$wmhOpahqIb3X8;@6kPl6x&)4Ylmt62RU$90>v zi;Vq|aKdfjeeYdCLnFKgjTyKuVq?goUIG3?{Udufg`E!i=N}kgP_I<1k%kISunXCf z1pi6Y$|Se1N>^Elbgu+2Zje?fzAF<{JH6cfX9unfiV7U+>-3!FzDSkf_Sn_rmgSKd z$nN9S&m5f|>KB;iH^S?;@2qf_ehd1)?!OI^9%l#Fsyh^;B^>@}k*k}(UsrE^_`k5$ zpljYysua;|<`YUMVI=k~dNR7$p53#gb96&XC9cw1JG!}~OKq$(`WZUAI+}##A9Cls z?|vM2OP)69=EWPkZYEw;U0|p5KSMa_aU|vN+kL1#)?I57&tN$~9fR+V5{~Vq{`ed-RPMUf5z^ zzN&;DNt;a);VdXS^359EGpft8J-Mx>ZC{sN-`{lKdc^VAR$>^{_NkovQ}@C8EcS8f zgQfRn_fpg2Z?s=dPJMbtaC~ZVTGGHHZ;n1X)+f1Q&+jeT)zsDRwjNFze~tWf^tY-C zUCSDi5j`9X?mVm;aR-h?XlGnt)YBgk5>O8bdTcuSGeJa}h9{8HxmfXh*(P`fSDC!^L@`BZ|qYFt;79*A#Na zH+h*{=TQKkU*h}ISM8hWbKZNE#{#z=w>EV`=;i?xL!S;`Gei`3FZMvx_^5_H+Q`bN zAN^8eiuyG62?{s(7kCl9XZp?vXbh1?Xd=f)i6S3{O!dlF778&`R~#2tkB)%+j3<#% zCZ&Fbj?+bKoz^m~?P{l1H=`#~H?_mo^t9$m@$$U;S?}KFy~=<2`?>SkyGK#?qSFUo zRb0M!DK>R;it^N`Bijz$I?%j#;jX*83TcV{F=>vJ_ z5(v+ko`OZvSY@dso@=Hl2`^EPZFxv9%sKK@;Z@fv-xmKt{5g`@M=>A2F%-;V5dfIA(K9cO)<5 zhIf){it4X=xw^?K#;3yXX5dyox>qkZv-|}woqU9{gpx&U#>G3B)^~fThS zD)v>D)m&}DwO{MBw|g`#tR7Z^%e(bH=8=E;gq!@EcW%_(nwa+C+UP6Yscq-ePLDcn zOD@_A>sJ5UmAGjuc>`g?^{tlOttqP?EPlH-e`AGDBhr*#alJ6(mq%{T&uz7TI*h3K zd?xphJXdbwHnHzIT6(T)&vdV~yu!YwIk_`j0#s7fB9Fd`sp3G+e_XT3U*zVR>z=OG zs9(BXR=tuq*deU`lw}km)67%DU9?-SfvQY(foiaOsH?x^qP$x+Q@&UwQ7Kg)Jx;0* z`ep?B_+1Ot$MzY}FtlInh{)N|N#Q#q^brq3cSYQe=n4;xjEm|Y>KQoAyN~)mpDN!C z0cV18dJPX-7}h^@U(f|ltZSjzhi8L(aHrXRu-5lAC6rj~Tx*`G#dg%St!N+7{m`(| zLa}%nqBU`CbL-##;}nj~TbjKwdtJ`;Z!f+GGK*f3pK|X%NFQ}Wb$R-gqi}Qb(e~%?^11IbhCsopkAvEfW0^z7-r2 z%#t)niWCD~Zp+B>G|6$vOsPb2MZtGj?XuQAS(UAt zU9skv;}MRad_Sn1ZaCLTp`E#GvnyBa!6ba$*rF*FL7IfFfw zZpM$cyL8hUmX=li+WOP?DMnFJfDc3x;&rr zY}C^Q&#E)BUJd)OJoDDqG5L{yF8uvlF}D6j)3!Qk?Si_zu9-b}OBmvZoy(T;hVu6D zQ+XAVF%mB>tgWe%i#MHXCv>fV5n%e@c00m?_94yRiiu2)k|?zP4dkS zY>!yqS22_}a$x_U$Z(&RE}oKJ^mN)(_6yN{_aOoKppJ=V!iLZm&9e}!+P zJYW)eDr{9^IB`~|tIzWw_A;xjj^?JM#7nOtQa^;gml@z23O=KZ+y)9=^E z-&qBTzt8+yQ1GrWr*vket-PvgYJFZkx%EdAy*Z%$M(f|Mbo*{%4?`e`mHtuAceyNz z=5*5*5w74j5*6fjcD!_q(g?Bmn);K+O;?hlOnyL-Df_1!;Yoxl;k)#|>=&EnCVEIOJ^JIq~T1}iN7yO@{3LtWHh8qU+Eq=SQ`K91h_vns$t*e@O&E8G3nwGYhnwlFIHmK`X*UqbMuMGT0D|=b2 z{nPRLX@2kD!aqlfUzUBWdQjgN@;EN9nO6CxVr|LYqQ`~n3VCHndD*`;)zXGoo@reT6Uvw;MAH7mrOu<54r6OK`1}6;vH_ zApfa!rAw#sk?Tukk#d)8zi7E6OMFS5DZi{d?Wy(L;z{@Lb-Sm0FOiCRgeRpY`8$`V zs_h;(z0P@@aMj2Wkw}!l+X~NBz2zSkofD^vnG&fWkwv1W5WZmcqxL!i97gmhoSrz3 z5=<77#^RWn{4CaMrP+m^&B*+79vw!XX?Dw;K!hTJSp|qw!QKmR3Z2P7R_wpeB-E zkvhme6vUPdl8QzelJEO zLdjoor}z;6J1dDPVY2Dt=%tKL>`b9rtQ2pSf0nVteu5obf8H6c7v~Olm(WE*k*tu^ z2_N$Pxoxn0SC*LlihoPILv~uxS20aW5Kd&zrljL&s4VFF?jV~{1biH6HWfqPM(s~I zO^U^xb!1xmnuoypFSYTZ*=f6LueYy7?6w5U-5!o^xJJ-b-m#1!2UajkBB6S}h%o zT^lu3x^8`dAzAOO7a095pCDOk8G=I6Hs{h=R)U&+Wyp-OMD8Nvc~_KwH;r(OSN(Oc+FqP5PYKRy(UK+rEf6iT3r#nLyg`BYDGVElQSH>920=^ zAl)ZRsBX+Jtf$N|tkJAF%%|`*i-qBQ;(p}c6ClEGk_qzT@`luc*$6oN3+!o3 zf3zLtijKxoaXpwx*jDgQ0x&8x3RRA5LH;M@`k+prC!=m*Lh&}-ExZPof-A*y2!VtR z#3*71p*P7L)-&?ScZqexQKUPhL*y_@0=0m;fL2b|(JHAcsQHxJl!@dYWIQ#Eyq%Iu zJwp4;aKdbK0yB_NLvLbCr~RU;8NrOn%sAF3mYkEo*08p41RODI72K`40IzK3pg9|X ztr^Ar$w}fAb6@jD@VJ6_h}yHoy`?P@n#@)9LlQ4(6zvfj`5SpBc$2x&oZV1oQhBR+ z;rxsI1H4l1W_A~I7sEvHA=eX+6QT*J_*{rJiFhh54}(UJbsV&$UZV8uJ_L z8#grEtZ%3fuP>_`Ri~<(T+eE>Hx6ptQ9riMx9(U?PL)d)zA~@kZ{_EzP1XL@*y`3Q zGOV<6sj^m%s}8Q6QQuQvQGdIhSMRJ}*>Iu$SVL0N*OpW58#^a=U(&>A&*}Q=@-=HU z+1+cp8avl^{e~5y)NZHds4h+yu5Z+T)2n+zVC^%?YOsYkjyngU|7YJcqdhPuu_3tE z*ep16gNQ9;Ds={R5$!iUkST)a$z|NNyc+_mXuRa1%%Yg$lI2QQ&3Aw5Ua#8Xe%_|q$#)=PPGl)L+)yAEo;QqDXNE7bd)bHUsJxKoLO!y3o9)x`Bq$47+N@~@KE7~ zLUFONbk*O3s-?uTYN5K)=P`K<-*T zL9mF&<27)Xa)xnca`F6Wf;^!`vO?A+^HfyHtdc&Gt74L94?mszp2Ov$xi2|#PA+Ra zt1oK@^Ci^OB3cRUCOw0ur7of_rx3~WiO2D8u^TZqbSHWg<|kOQHP}tqcUU@>iT>jB zfM}9rw}7}j3YiMV@V@`KV#o^{!>Y2_&4sY4)Moi@d1pOudt?1$;aUEg(vAO&X{Oz# ze&)>y4XCXN^l?MY_LXg8qp9k>Os?+@420Q;p1?0E5z?*O9ah znhePBYtX*Zh3W6=Vs*!LhjkY1KB~~${)yvNh`$h;xfpk%oj(9Cy5(`I|TRmL2P->VAqh^#j$7%BIFplPKHBJ4kKBd}1omhxCQipZtV!p1O~kLanEUQ%&UKyBpmG5&9Nrz9-Qss1J^Jh!DxQZL%G(`PhC~k6Qz+ zo|Y0*iLqbLYQ3laoerzBY3sDFwUe~zni$O(&3~F-nkm{q-3omUWC8!Ad#PKgjn+14 zrfCuF0qrjxqVHvp_1x<@YTRymYFcPsXjx?$WZ7#jhPrUe#5Z}FIHp)wQ(kDcTRvD9 z+pgNjAY|}+9wY8xc>5qY7-Z-dw@NM3KF4YXuWIbvgxWpqcgRmbUoBkHu zJKQ|nKU@L68;{^;5RMb>5h%nF#JeyrFqvc_Eg-L_(h4W@0N4WWstugU$%H%b1)e1a=6mUxwTomfkVBBbC(Vt8mHxJj9y?Mwrq zh5+I=&GFPe71meVt--bc+a>F2tI#U5h|E3403!$T#h)^K)LZqR41)|PLoYp1pP<8P zGokD{x?gGzYs4Cw#@szdGpu`2cXxMnR{_Mnncd&J-*l5TTupCHxMoFnRabJ?`%X(hXLj7^IM7+s`K0q&S6%n3Zjwd-*$&-xYW;LW zxgpCi%!q<4+bhg3EI%ySmflvKb-&HS?zGDtf1E2o&WgvZ!Uo|waDfCe@hRawVFEFZ z7(qCXe}qrK55xE1I|-W!bi#DPGyDsjA5H^hjRl{z3hRr_z^ueP06%ggDg;EYP>9L@ zFyU|}Y*-~O33~~%74rjp)O=9I{J_Z?hv|=50oqs*IvrgJ>dq0&c&rxt9h(7;>sZWW zbTZ^-dkJRIUJ!y}!D3qK(137@M=I^L_J#IA_8sZ0`DjT#H0g`y^dOBKQbQ4w;#5b*iPCo_CR~6eU+VrNRcYLH^N3{!SVjE zrPy5UJMCZWm3B`Ai*W2`Y>iew>j;Re{h=L^%u=)1yxmk_{A83v#5!#3Wi<9Y@2N9v zGWZ!{^p(0e{SVzBXqifVwr+^-sIEX4qicj3Qmx&gy`U}Ce$;kppF%v`qkFFVtP9Z< zYklB-6Lhb1LqYC2VfbdKH$?PI=o#7b5ExWlkH7J+(c84gc-`n>>SI(H=NkJM9~z$+ z*O-#cyUc&hiy-zpEKQaS>vG$2TaxXIZLDpQ?JC6a5%%HskM=%@2=Rv_zl`LAM9%~# zGY~xLRUmsEb({nxD+}8CJ5Up!Iek&zP;B%RaOh;1c+5pi4YnQI7nh8`g^wY;Bm@#~ z5ve3GX)Gz4yqLU*>?EI|=qN(y!4jy6)SJ|1Y8>r4&4(UIKS?j9C(+C3Z|P&`a_~ad z(#FtQ!3jyC_NLCK_M$$btfL_0XXH#WLb^?QMjA|#k)lYApyY5!+ld6Cg7}v3mC%nE zL!3m+Am)ItkxO(T9U|HZYT^&V0m4~ACLssfNdnI!4OLUqcqgv zK+Yg`dyf5y{g3^YeF(I?DEo4#l^db`9keIfU%{VU_OXZn2|)j`U?waw}cKeJe`z?kMKY$pdsH)YmZE7~@~w%b-|quM)cI-8e0 z-p;dsu)Tx(ba}RowoA6BwzJSGe%V~?L3XJfZ}+!Pv!~k6+3(u>BYluSWB|02zEIBd zk!Q$iGZXxN&9EdFI z5D$cdxFJj6wSCAYX zYh4cSOMubgMiAq^gWQG&ZSDv-t%ySgUiowod_On>z#G&%9B&6w;sIC|Cz2o zoby3Y90`K*JLsjD5I@!6fgzwpPCy?-KLe-o8k&w_Vye+Mz+pTIX68vyp{ST1bP>3i zc#IQ05QBksAjUMJ8_^`pbj%fSG})LKa4)Z+SE5tVYtY^xI{Kl1prS#l^#&`o8jMyw z$hK3!{|yBPZ#9^OcvKNcqO+V_5Reaoa%u%xaUXbfA3+DZ0A6SU7@s}hC8JQ+KnKQy z1ic7)vK_G3`QRfnKy*Zb<2VLA5FLm11T!5CqUK?=5IoCB=nT=Z%55qPCPSmis>qruvH3P<$^twD1z?ieY?fewJbf1`Pr zI5;nN(c$o064A%tY@*PGU|`+^L9-VKts$Ujet|mj0OFLv@eS(McZbc<3_f=|)WB@V z52!oS!T;R@TI&uFyB2`03(5T;6Y>f$|6)NyJP3ZE!{H8&EenX4=0177y?>rCY;>}u!A3gkGLIN$YWp;?gq_ukkbzYLM)6>mVw+% z0;#$W{2LA4VlZqg1m67;{MmG{a7$qeGO#YCP#f-pv3&qk(Ayx=XMl&Bfl2`#bs@?h zr2`A`8i#f7&_zBwdZpQ?WB;6eS!II2J6ks*xB2s9Py`jgg z1e5VKc+j6=OzR1y6$23u?L&>XaMW3Zkn49My@S z%$@}UH5uf(*-$?wg171c^&kjc0-r5MwL)2KgKeaNLY)iRF&TbJh8pUEjz;%E8&D6x zc|DC<1Hy45w8LxQonL}lav9XeRd9~y!T3`&JK+(Zpje`1=k19YRC^eb^zk`70 zgTm?yH8vRC3F2xd2(mXot9^!g0s8Pg)KBO&W8v&YgG)XR1m)GJL{u%Pk?v?Msv5Ny zy&u{}3e@bGP-k)M6JL18Sw!-$#z)FT*Cp7YepY}5d9fGc^W>o3%0rzwoZiKYJi&51nOo9 z)H@rr6B(4?9N5bsIO<#Ac0UIF28*tOZKXh&XQG;5-0%#}M+O|d4SqfVy$HP+wBSw9 z_J_e4vBJ6OfzOt}NF(L{yxz6oyAOnst{a%Q8mN`4z>7tJp6w2fawOEJ;Sk?-Fv4Sk z?C1wkHw;R6ENT!)$kFh94_ePp@CP?Q>l_3k_!>}_$G}%#XpI9v07V?}P|xpyV%qA6 z0!j2Rw6aeSAx=Y-&Vv$d0rxWpqVq5KKMECxvO8ViJi3BBy9Y{XJnY$jP_BERC9MD# zxD>St-0T#12N~rHPH!J@;ID$EI20{_IJN~M**G)_V&Xs;OMOEJpKV)X*>pY#O|!#5r!f|eWv5_S$`9IE|4Eqg0C;Aj8;k!FIXdjeY1aFAzRp#;>>2gX1<4}*xc z9b(dKD5E~0Y`ZvX;HqG{V*}h%+2eQ)t@D3Uv>TM13}TGGv)XYEUN<{@ps$RDt!#p$ zzYD)F4;qqiwDJ(1tR$3|8u}6z}X##`UG`<1I)@L{$Fj*gn0BG>gPw$ zxi3R05aF!4fFJn-UcUupH4y6691xT5!C8NT(xd#*)1gj>Ku@s-eHq@l6ncViaD6XA zEucfhrlTXFw|E3wKMtjI7|Q7+YCh^9l<|6~4e=n#j)c8oLhUPdO5rT{LaX3`I_?MZ zwkxUzN=E|wJrY{kL)eFWR58@KbMT4jP=^AcCsx3D2?nqEf0q0V_;(^W;fYY&@1Z(S zc2qQ+FA~(nDG(R(poa|vH@P0RbQ$Vn3A9-Uxal2GKZBrG?bAUj@SQPW|DDCO;_U(QHqcPuy;?%{~Ue6SW3L2_Il=uowLm9fZk& zUek_lf$;+cQwaaw1-*11h-pv2$DRvkW+)ihQ^1TKjV^;x#%nYd(~U-BlHvVW7#*cU z^gRucYz0Kb3vk9iLb-ys3atT!DsleLa^D2?Wfa684={m^5MSp&ziHXtzJIFS2j9U$PHIwj&#m z|6rz#=CFZs@&IbiN3&n+_9|2#3(DCRmaMj%j<033ZjNyTpz8-TOvj`0Ie9TwO zJ4rI zoYQA8ez*(rbU(Omy#T87Q4ppNIg%aQkyN|UE<(ge864#@`*7P}tB3WSWvOMpWvxYG zxoAFOj)$xDk){cz7a%I3O&d+uOe0N8O+<4)^Gx$5bCEe1)Qb0(16DWNK-)o^-d>0h z;OLLSm}VmCEh+#s?HaTSMzi-IhtGHHblexX=d}Q@!6y>1;JSW*t4b{CA!KCmBsY;S zP#kb)D~CFWwwHF1#)hY0Z_#t;9dv~Lluo7>(00H)#XRZ_%5$=bw4HR1SVj1Szk}oB z`eMT{Ty&+g9CYhK`(s@JZ{TWxlg&hxpO#o*q>QM)@9}y##B&cL#cSm zUea*l4njO$jMHHVm^&yRXC5-guCV>Jd@y^NN_#2{b^2#IwU(eM?!t9ZAosbteP-L? z)-5epn~R&CG@fp_QvbH@Uae>Cf|_&HsnzvW1FIsd-dBcK$*RXz_pNzd8&l70q`-{Y z?Y8TkE!z9W{Z^Cxyz>j@40zEKiFK593^!I3CkN(m8hFk8-9oh}M>Ij41)^h*Xo#33 zJ|t`toEL-&rt=r^+<6PQ{Wug3hcg0ZjYhJzvocuKtV3)9*TLP$E91rRoA{;tAb5W- z!AQXl0bUTtkLFYOb9f+wbPnt4{3R{ZSX|*cX&oa3L@qM{uRM+QD5>>^Z72kLe3-hV0H`ZJ+q4OgfWV~g!+;4kQ_^jBTfYG*BAQ{ zqCN_h?RbHZkx|fgXIX1442#}WZNwQj^_((n)4S>RYe?Pko%oJ_ZRxEYEvd~Tn_L>N z*4yhA)|J#Qt3}s7uF0;3^q|$kYE(6^+P6BTD!J-y)w-&ERY+BC_5Pa4b)2JSd{~Q6 zNZ&^PMq5plQZ|#m5ticT;0|H8V`if7IE4;_onSu>cSqjB{hjTWvF0+PzK7Q1XGqf* z>uzgTXn5T#JLw&Uw(?eVE2jnBe7-%B_tLT8!DJXqY3u!-?bc<}|U_u-(}S zY&rWLOT{|C{KfQVZD94VuCpO81xLm?04ttHaKm{2_$J{C@d}AeJVks-v|fk^h6oFU z2H{KLWZ@RUQqX8|-2XUjYzq4V^AKYPeGcsn)sOmy@`qeR`b-=~IEuqzM`KdZIP^r6 zuQSGR5xHZ}u${IovQ4)RvYa=!o7Nf|dgdD@8CL5C>O`6;%@rn9=h>Q%-5cAPjZ5p@ z+x9ikYjh2TbxAd^>Xz0=)>>;sb>nLyst?pO*7UA^Q1zzTUUjN6z0$90b>;m^pPHYw z=W1Wq^=f$9aJ{jh`DNSf&PST*dYO@LA=?7s5h)|)4E{MWid;ZBPV1rnU`%2~aymFl zZZPi=znDLQe*oqXbNFq%k-QeJh})a9l(+*7r)z4uE_C+mIMg<_wYcR~^P{Garpb-f_4Re{>x%07)UB;W zYQEL%uQ^pc8zl1C)mN)#R{2!#t6ErPsajISslHMjUMq$<>4}Z#=7g5*ZOksUcB1~K zG0QR>o;w+VI)S|ePiAJ23u%|>(;3OE0GJD)b64`@{OP=f{L_L7{BJye{%ZbVo-gz? z6`X18*(`)LhrO7EX02p-v1H8u7=t0x#2Us;#s=nErVDcilgaX6Jz<8kqFHTB2E_6Y z?62%7&Jyl!o}1vVpjyxZ@jHQc5qgHhyyp-R3!tr+vE$h1SjQLw#v;a3dK4|5%Au;L zhbaBPbB-t7C!8eI;i@oi;flEttolskq215MwLY=Tgoy4i?J>PKh8ZJ!1{<#E55s+Z zH*HC`p|i0=(_Y>7uXSk4wq}0w=EnUE?XZf?Qg^I2uBM{8vx-&~RModKt>SsbtO{x6 z-OAe)=t@adeHF1rT9;YBvq9RN+On-ZynD6Q-*Bv_)_mS(v*$Q3V@Bcz6P}anDHPf! zMjUfKYc{8zRXzg7DI1`+35$gSG0+=6Eqjb3u+oX0qiN3xd}0G;ydc= z>Tt>Me@RcPq3GB0?F$@Ylf!~LAksQxXVc_sm@)edhE)auIL+}W4 z7F~qJIM!R$h|?Zu=`_ADZ#9k8f6zZOH0iY(cK1lFuKT}^T^%hQq3zD*_Le)XMU6QP zBO4brXrOk*)CSdPtB}f7RX?kOD?a`^QxWs;?cdJ7ndO;fsIu9A??e88yuZ^b)>quB zVAM3$ovz>7$ZDr_=X4J-q?%K04*MTx2rd!gw1`|t@5KmV6tmRe=RSaTG(d2lhvCHt zKJcr#?OYEYntPSKn?+`SVNRuQqTA>y+8pX)DvpY!+#w4nM)F|tUb2<4l+sL|4l~2` zl#|p{>K5t-m;rXBKB0W0T%ewURVzBGnOaR-2W{WZ9Lik63}6RwM#9+1m7B=f&Te7n zaS--O_AriwLuHR)wKF4`N9jh|GP)lv7W&BrWDH46JU~$4Q?WEmUs&1m9_eL=TLRYK zX06H7w5R8RL95@O56~-hd$mE@{V=;J=pNDay0f@rOoz3d&_1U1W6SwwO7jI6MY%V0 z)W5HbsI%7|sAbh8R@YQ3tLIl2RjI3^svcD7t4&q!s=BJPYsS^ysejwpt9fDTleWLz zM|Dy9d8RYgIrd48i!#PPz0dq9#BCMOsg&Fm3Y67i+`hfb3`jc{s@(o79Jlb&DKk8UoFik>> zq%%RCe?vpj1|3BYg)zu7ShM5>&mHz+2XKaPtGE}r3f?u&4o(V}&z-?u&c4Zh z%ORh|eK4&8=AVKok>ok#A*2Sv8dyub0QU>7K$>9nX*+V?POu%d-nI-h2bqo; z=NP~C^zFHB7;KmWQSOvhr@f<_t-*BP*Pt|+o##7mcV@R&wc*>Rw@F%2truI|nq8WE zn!TE(O}eInCSuc^#*dA!8?zho8%T{&4Vm=;4Yy$JO*HhmMfFn}SkNbETRyg=v|s8x zrHwR*dRS(o<)3Y!qZ*xsS&w~*Pa~b79;3dZtzh`%<^j28M(Mld~}rlCHj^rd{Eh^TAHX(R_}G&zkNNB&FhBsY_mQ^Fut zSt$o7!>FIAC#gT6O=rQ}TNv{%!%nYeoMnt)?PBeNo}`BPgHZ}AcW}%RjQNag`gXdK z#-+7Wapd*nEtCU9F_A^8fop>|I40H~y8|P0FdcCJ2}!kP*_v&gCJ)PD%W)&x^suMX z*b4c3u{|%0h#^Zu)t2=%X|{Fx>IP`8bxhPe>dt6uZlBPlY5UhQuRXb)-1f0W+_tIR z-Z~mabFW(ew4ZG8Z&}^8zvW}|)7E*dqngT__O%+DpEWISF*V<70;{}5-qPCA)B34B z1sv)r-73vZt>8em+%i#d<6lrfTVf_{K@gtm*Srjn?3%00?a@+`6!Wjw`$a+so| zpeZuS5LoR|OCCdMpsb^wp$()TrG22zp>JlCz_na5eGy|0eH4sDQt0h;J>?TkMVm+c zMVHWS5DUr8G#bfHID}`DkB|pp`{VtHBe4O_TI_7f3TM4#K3oGwTJ|C}D5d$Uc{Jv> zHM56@vY2YM-)+;JON=AC>89njJ35Ts&2Y(hR$ton(oooQTAKmpJ5$?bXw%{KQ@Ude zYYdM%=>{+3Qf+Y8QtdMRUVVVBwflg^slyw1+Si(Jodf#rvD!-Qea#__pT3{g(X~#0 zOkdc2tQ-1u-A-MgvCOc|xY;n-#7ENXjmS7h0V)rp#)aei5Tc0P#J*%7I+s3;J{DT% zF=j9;gcT1Ni8ir6{XdG%GOo$K4Z|?j-JQUa(GAi_sE8;Eihw94irs7N;_6FjG_>A&`*g@#X8Ke^&2R)6zqx)e_2zxXWrU`qA zXhMMyF(4Sq5)~!i=iZ0qAY!2_U@z!6tO8g7*#px7jDnI8BBci_1CT~g;2KadSkYUF zx74^Y2NBIbS&UO)EQ)2ys~(`YQ+ubbDs5Pvn^~NhoV~4(zxaLP{B*<8#KOuHc}^^| znpvJZG|iamoO?a1ICE+WH9IALU0%(Z`r50r)W0$|A{f6m?=_P$W;%C!+Hov>=F9ZA zsb8a8W@Z+vMt+Z;pWQb{8xJ3`k$s;&IZm6rGQDLAJl-(jJSmwOn@S!Jm(|Z}%k*cn z=Z-JVFF#mCEFD|32dc@Z#}fHj_z3V97zMq9{115%mItpyO`)EnLosJj_LynxcQhTl zh-IUN@>QEBJ^;HFWrqWxbm2IRCkl!X!fntd=nn8P$X!GUaus3;{{ZoU)}m^F+0Zob zN2och5_Sltu{MN2p-UjMkiXE~D3D?%a1%{I;lk=D;U@4Uh%1+4Tm5p~gx1`i5$=qRQq8zW-&dI{7~ShU_H9jPPWRgac6u4u9waUT_nu-kxED{#UVT+u}G zsFHGqpsbTV*+(wJ8-k9?&QCB=$#}Kdno&allfHSjY%&XYc@a7JZCZ!s`k#Wr(2tJ(rRt@w+Pexj6uDiky`6mybLjEfLEKPxpJ+CGeCzbY zSnd=UactGN_ckb;bU_gXxrm5FJ%hK=vD`_N5p0~cUuOfu0#>U0OlyHz0YmfSbV_L9 z*mb-K)n|lX%u&sNDBfMF=G2#}3%0QDX=10ld{!c~Co&`{#His+TA zyi!dgMzbQ8I3(^-DU~w@zjMLdT$OJWJwh7e4hexyhTdkH3OXSsi!$hU%xeq>aRm~O z+yFA1KD?j=ezP<=yl37Nc4El6^CpIbC@8;No-`S~+Pm88qL+FhQYF@ zZGhUW`k0oh&7TU-q_37ocV8^li97ReuA{a!;d6diOaANLu)GH!9>y8uuh!S+up-=k zg|(b3pGtiDv!(EE2X5ulP+`{Fwru!KNP$do>64-kN=_)kWTW1bqo{u|&+zHo3i>U& z5v^O^Fzp#5jd7bj=(X+F+>;o3> zvYu@ZfBX>{QOtNG%mU z*m&uH@6px$fZgrhCl2EL8ht8VPMXf~52~JJ&Y=!Me<`iX_Vt;xU^)!t|MuYB;$~*c z;(+gh7IH6MgtA8OBs4LGR4=Jt)211`7A&f4)90AIUZ*Aej8dD*9HX!4K~zDzmYCy) zeS_`1dWDXV`6IHDQTMUlAs3kz!ky*DGNoS^Ia)+-pE_{z#I=j9fv4|TKL7io@jm9N z-j$>)=&REKFRtG|^>I&>`_=8tT`9iz4&r?q_PFd)_DJ5-?DlcPd#hW9CF;vkcd41G zE$0KZ27N_=Kds+=s!Ejq;g2+V-S-XACtgM_gSvf=^&g9aCaL;u z;s8_RD}e@qvy8@LU6CO>DZVOm+W`a*jr>z(>%gfFPy6$ASQO1J;f zikHUdeI&oX{BGvs*H4f)aZj#1N`5Vg%Sr!HvaR{d;E#Fv<`z()papmh$wX<$n?l*- zZ`1|?ANqEA%S_Lh^H57yK+8gtLg%CYsR3r+a+i7!b#U+4)>-VT0(6G3m0hdqE0ohF z_%!7SrYdtI`>bk|UadLV&c%AOF-m(%7%F%#=Ij5k2)8|HMKwMpP2u3lbLex3RkRyv zfic9|&2nZy=mjKaOfsl?xq2ErzBFz!(K7aIc(FgIBeXuV{C0`3NG110hW+2?zt1QA z{;vKx|3l!*caP$44_x_nuItREvz#*vCl4Ke<+o|i?A8W{3$9jY%HNDr_@i|_nT1RtfesVjq@hW1ZhS}X=-BAHlkQWOU- zJR|S0zmc9Y-R9u#yluO)`O;aks<+ux=1=Aq7L2}3qT~HA{uoyb z0B=UY^1P+J+8=e#>kZ4TWn!aMgU1H*21AB}MlvI;QK|kN-AT>Q>L5*!;gB_H<3p#f z8`n9_Y|-C-ef#p3tsAs#-*YP;+HRKZH(b8FI@eqz5X#29?adG{kM^ZBiN|E}G;xOm#^7=3?( zN8|SGE_xgFt@j!5_3-xa{bskzKP}}!WC{#z1M-%#eKUS;zMgKZErYhdwc~|bR0HTc zkS~{>kGi*;mpK(!6u&O^DsO9gGyG>I4#uYV$XN)U91~TZU@w1z;I@dRUMkwB{Eer@ zOu;HbV-#ZNuTInsf0z)>w9opl90#6+bRyWe)8zg1XvSvVqHwc#T=GC8S-VM>pc5j; zLcW$13laQ#oMZ-%Ho;gFH0!*zG;nmi1M5n5UbAa7UD2gz6Exj4pQ`6c zUWy(Gwus~;Bgub~4Qh`?pOib8DhcQ9qhbJ%~dzT2|R zpq5c6NZ*`zFXsMxPMB#(7{?H$6tEL%oFJH&9=bURog&ymPCQht>KnHGdCwvCvHz#PQ07VQgp*vv+cxm z{RCr~$wspv^R1@O^ikTMq~H1R+}*rVUI#OiEW>|A1%p2+#sD73n>YHPap((-BALQ@ zEhxwFkAnY}wn=)vVodYczZLF*FvtoubVC!uz6PFG%L^Ro>0^q29r-!&IZC zm~)65AeubY6)fN1hRAap^28Y60pv3>6lYGgVrTLERXF@pBEH&jX{)-u)_QFR%|L0M z__Z*fpP>Ah3*{ft7}7T}S~egVo0$E!yl0bWTe#laKGbf^y3XvG(QVzm>MTJ&caB}b z$xxnBA@Qlg9KlJI05*)ehJ6JcTE)y(51aKK>+EUGZqjJZYJb@Cu@BMT(l^v2>gcI= zDNW6ENJ;*>^OM;d?UymnmV>(QKDoJaoqH|eQt(-h|CxgYdvm;-ywZKIUR(~|@_F`G zcQLK!+ky~2Nlh2g43C=ET9%o6nVRdjNRDx7lo7-?g?n?~rjN;YZrQWn=IM*RE2n^8 z;M>pv_@fjS;}7cr=P<9GXQa$lZsMTm4TR&E0HhXd6J!)51AYWyA)la6;j73-%pmSF z@h*kKaOD^%-{Zd(tE)d#pH_RV_Dz~7eJZ}q*WvdGwKQKDlo@90pU~GbF*i>zU$DGw zbHK{o&kPL{UxV-ep^Hl$E;#8j^gqt?JIwP?3r1Jnsva&!FQ?poR(&bI38X zURG;E{Y>qphNQNDp2LGJBhh2;M>h@Z?r5k>C;?_(O4;?jC&oPTZG_6(@|PE%bp_eq zW#4EI$i237CE(JRvnr?VpUOUw=HGfI{oaZ9Z{p&9*%tA-mt~fqhv?7bNtTt0TxTj+ zQw1n5F`@}q;5z~Lmkbsx7p~1+lI@#+yPUP=ukaD*g{YFZJhNe|h(`GyZ7((lGlIE^ zQy{hzhj2U5cvKsL4?ZF9!JSg{1iS-f!V54NcquuL-oa5+<%&Ed*`iE-kl>d1vf3s! zEA@PhN1CICfwt|Ng)YyxWNx{+>GX!j&N%mbyLER-cj!8!>{=~0tTQy8GrVQsXfR-U z%J%EVMwdocC6{bFAJZ6}ogyJ~1K|<$^kUUmN8h>5_Lk)418pZem-^Tfc?;4tPlfku zx+|-5Gh<7Az^?l(v$dEi+lv26))fG9A7oCX<|Veo>BiQ6sroYf6&Cy8i~Fap@W;X3 z5AIz5d^P&si#Og0Cvse>gF3$Tl?-){c#MCYa*-*@=YWoDuRtFmJD~-NFINPziZSIO zQs1tgw9b6_#J{F(u;X?&zjvx{cW+#8cz^0p@JRZI_vDXR=G^9NTZ|7dJ_Mqf!Zd-bKYUi(tl##?I3D&aCT!~O(Da}yJ5|>I^HSKk1nl)E~C=UPf`e4|lcatBsN0_`Xe3SBu7t$Ua@zUmvUPN#7=J>gkf!`0) zdj5@NQSxt;?P(ZoNA$x+J*L0T-kpnI#L3fYNy|`qGs>MUn2Xt81W-)g$TfZ};M z!|Cm^JpH_KX^Fi|Uq&t%&biG27fR+|&Epq-&705u93LIA93hS5jQksQne?2ppN?Lr z0j?*WWd?ALFce8G$lpLT@FVOfp_T|f z|6XPcWabntmjH4m|Ncn5kbL+@%TIXLvBHUp>MBBcPA>OX+SiExV&W|SQVJK!Jj=1w z1~rN0jip_c>D9%R=@p&jS(UDp<<${=yB0tS2Y}xdEoTG!?sOjQx14zh)nFFzFYvd} zonU$j3CpXBsu&Mi7<-+ZBZc7P(`=|Os6MnCjA7Olb_`>T{)wT>Y2)K1NO@$?lUvFH zvsD?2G$Cu5dyMyqtItlS4-uZBcEU5E-q1aWV2mR6B?^Q*f%<|J011nT6=U!<1PS*P zYX^G|SX$V+5(&|P>;->^uR%RQ-vHOATSu?1e8Uyu_NrQP+@ZChH5Y7nK?Wr#f6wAWd7h1-iLMNe|? zq=u)RDYC6}ukbBWE{HGED>_y{EB31pH+VGpHmtR2^+`KTYm)2#8~d%u0bE%AEXx=< zJoMkd(BP-V07M52x_WR$5m=_wy3jCMzjPUQ4s#xchmak~M3X5C3_RwhGcv3>WA z^?}&;peS*(x-##L#x4B>>sX5toHzI(D@=!@-zvJTvAk*4fDH7*)ZlV(rJ_*dTaJyJ z)dXM0`+IUR0UAF=jk+Y8aNX6F*@-LQ`v?(e2cU=wQDxB7;2NVf4V`V9CvCAIhQ_94*_qru`9n< zZ3p!jmGF!);et_Kgu>48u<9)L_h6N25iy+Y6wSxrzAZbeRu-q7s3Orxo}M8x${Rcbj;N`xzHew^l;iMf8siQclHa<58 zTcViTTb|Z2m$K2kR_ywv=j(GT@#lJ%&^gzk7a(VINp zlMJ*5+-bTnp*z6><`iA~TZ*5pb!Y%rJ~Y+#09x**D1E259Uin8^&4^e8~^3xC;h1M z)~A#CgQ%L|y2f1gck`IcBH+l|=E#MSo)1xjX`#(#UnUdI40R0;4z!N^sBZk;m#IFu zuah}(l=UC&>`F>H=A}jTH+eGk-^KH#xSKk@u(DQc+cKJtpWOX z?&Mq<#+VhrnX*Ohi*w$Ii^*>9Ixn!(dATL%dcDUjjxu&#qv@Et#tWxvC!h5ZZl~0M zI8C4;pj;THiO@|o_jh{3jsTb&x)|6}*~B5e0`>){t8SS^iS9g$X=bYCIF228LZ~s5 zDW?)H89&!rLfSxx_;idCGm!iQw0*Wac06V@2rFHYAkh`GE zD(59M!l|Wwuw%e`VA_Jx$`GRjV$I6oXf1hE4ir@~qTxYHGOVKX06{<5si+^h8D%*h zjnE{pDGqDBwaiu3ku`vkVI}@Ww`spFc>kjETsF$hAIx z>dVH%nl+?0yg)Lb9;GpAw$1OnX9%Z>5qg&0=O*UALWb71t;%RAs>bXx zK;YQLmB^{>+U1Efw)MimQE;3bp54(>83IAy5X}4(hXIM*g zW;bm>(}Al4xx3&8*pAXr8U=bN#VTbl)(j;h8gRjK!;bsR%FM3zH$#5V76s`_Q#Y-z z80;daC7ha>9IWU;REQfTQyD8Ckzbch2h0Z|n}LH*7yeBFdlGt)b7hn7#?=+NK!xLW z^|$N&o1EHz^(~D&oQNDU?e`j-?r3j%)#=}0HQ+un*gdtBG;7~MZl*SBk2sGSw`^-m z>8CI59a?MoHtj7>aU7ZG?%Xk|Hf!DcW!!c8`N+Ve^9mSzah5mMGN@7)SSuX3I82`k zSiXbo0<3g*by;`2_g?7L?g<*(CQmRN9lSgH2)P3SnkJ5T4(WAVA7~rCG?+hJ+WUHZ z-HI^`gB1ewR)iqx+R25>(|e}el!hRg&?53pEO~yrVjvC$JqP#uy{Z5>#DG z*J|bEmXn=LEtImkqz8XOl3B5ve-`Jcm4k|^{ys|W{I)yl)K_34G&SVs&R^l_f&T*k z9nDqGjQ*RKex+cc&^X_|B)qP+cgH*l)yk7-AJGfY&J|9uX!LYWpX7lN$-!l~O+Fir>qymKNt<+M+6OyGZK%d=I-?rFTK|kXEgsoj+UUIb zi?g*$rVDY~)b=~uY@O2VURazouGKZw>o($>JvAp9nMl|1e2AU!CFFH{D8>i10hNmh z#QV$l{b$ycX7^024tVz5Z+58;sa7i7nOl-$l|7x6`gQ}yOEk zz)OIf9{{z(MbmV7lfpDk=Ceomrk2a}HyKtxtyn2bD2uJ()v>Ggl?@ktDay@T$l#^RqvR>a z;ya>uMjU&?3)}i4I+zr8JR0kUkSfNR~7R`<2Q8QLglkrlwx2G0-~Fp>gA@jit6V z>soXhB)gQY=$7~+$Q5Wfn5GoEdVFE~ticp-Ts$HhEbTeiVpj9IEV7_IH!`<6$0MgJ zzp#i{n4KS!bv~W*cjNE7i4VSaf3b?Z|BfH#`BFP1Ir!7lg$E(GGp}b~9y<5u)XAfk z2WIw+dtLQ$J96P-(|zKb`R|cAPE848&j4`JDb-O;d!r0yPx~TG&-y>)jAca06FA+~D5qb&{0yWiJ%1EA&t;R$#yBU*ATXs9koVl4HWz})G zDg%Nu;y96y&_?7ZeXGqkP&EoO3N_T%pVR5oh!KS;zhE^`HAo2jvV3>;4A=`uQnXY! zxEi)dpV>NUGHBm-t7}$Hw|iZ0R_|8ZTD76Fs-nE2zI?fSqj| zRdGR|m!s}~dK97a-tgVUH=UuUgUz1qdf0el$CalSvd_C-qTa}V01EaE-yiLs;+nUm zA$V}Z{A&OfnL!eA?D+qQ>LoqWB@I`tX)Ran%bHTDgQQ-KA)OOD3Z5u;v&yI}(gng+ zY&(1kWUO=;pbh8&r%C5Z`{p)S>)U2Y(@=e4EwjeAQorm)adm-D-qoDfnXP}-{}6x2{5+PTo1_{a z@C6=a8nOC*?R{57VdVa3&{sjc&M)W8PetczI30sS2d7Uj`6+?nvFKPrE3J+_$$2EF zDVqr_gbCtv(xd8=YG);?5y?O;Xdb|_DN z#>S(B=)dSr3;@@UKSR7jiXz{mT%b%+;%PWWE#oiaCw&t=h8|D%Vn~=H3<5of>PEdm z1JQ5G?Qb$Fm)b_vV1%&Ga#mT}Sl?K6tV1j|tB~PM%c6u+A}MMV4f1iK3?GE2;tylX zQJ>)XkU3x^;FLo7^4L6ic6BmjLNZY>{$WgE^o5+?a&V|)&~rf4_q+S1JOioUeyR0C z6QRMsPOTPEZC){63M<)K@wdJ z{8#>?-mmlhP~A9Kc5{^l(L_yQcamr6+nIM*w|V`1pzxZYUWk)$B@W_3v5WYT@E<=$ zwOBcy^NzWmew1>BxPT*K-XJv*pWzSTMQ|>{1aTEHhcHC}G2Ylb+)X@_u#ebIeoA$q z4bU$$UNDjwZH!|~U#1!p&OFEDux_#pSPWK?oQImtUXoM9Z8%qWs&d28BrlV@hx3p< zz+v%RI6~HYrigilF-5myoTeY4mXg~@TZlIJEX)!z1vUbX0;Vh8TFqS2SO}IW%yMRm zr_N69nHU_qIodkXJls3@yMMCRpr@_#OnYprU5j_qi~79U_?r4EOvU{&MyXqoZ@ym6 z`OM|?8)=_^A4(ZXcoARuJue=Y^f^T@_2Ivrd7H|->ZdxqhR#prFML#7f*-{769*~7 z3~P=LZ%xHRa6z~%zza*{j#e%4oXA>~Bg6@gsA{O#aF>`n=xUT2!X%~=1x9AU!lCD& z_42kw8RQ+z0)a;ELWRkbQY*MNf*t84c?+e6@{MXtJ5KAOeWOun5mY7G1G)d`7EObG zj&YuOll6jS$^x5la8G_2e^ z^pDg?=*2l>S`fdWM?t-c@vBiwN9TuUd!~<1ai>(LUQ9liP#&)uWsG7*vWLinfd0as zcU{(L_7R8!H)A9ywSa~`IU4a+8+rAe6-?uv>FKT7aNd|Ztzxgq*4G87*ay%3rT zNrL}WGLu_59GfkgdiDzKgs3S;ccp)SgYy;7OzL2y3LJ$VXX#@mqkJBQw6Ld*Q zl;m75Od&Mf*<6q}j{ADFSAle5TyPo#6ddxy?T; z2o*R9V)=Ykx(ZnN23N$1Wc_1A(V8gkl!s&+(rrQ=?jEL1&h`8as{qV|%0hg8~!DJAJK>sK+B_FXMN}1SE=AbMRc_o4KJ-Q?KB;b?mq2y%>fMu^$ba=uu*l6 zcbuclN@TpDog**dZ(tWtTM>L{IdG=}Wr;YaKP?)2GZ@ut(bd^L)RxpX+j}#eGP63l6*X;^}ki zX9~~So)?E=Km3jfO3clutC;O5nHW&y5Rg0rwe7kh(@mBqtZrC-H{WQ|rh8t~RLU2w za_kt*6bZ?fupU2;eTxyJvr(RC33?ss8*)4HFrrgVS-d7s8#^Es(GV;X|5Sd3GHChq zRputHigGD$g1f}k=Qhdd{CDXGDK`ltSPtd|N)6cnZ-uqMeBfTluV_Vl7&((M&RZ4y zkgn>)7zLW0v3_G0>tNxKYxl^u*V5lKMSouNlh{T@%HBn%QF4g42q*Bju-TYA%xO#o zY6yNBqM($svVQ*JlwbtV_p@`l?P&|7Ik*Ylys>$EGqKsJsjcC0okz8>{8-UoPTW7W zRIMan+(gW`$m<`P-zdIL3witWcTmE;%v&qhJTA{((z|l=`r=(d$cc!=cwUxg{rb@j zfDP0=YGKB0HiaA4ZN2MS=~A$9o$WDGh;D)eqWqTTfloqxfs0|cp$_mKL^G0!4#YYU zeiCX33dAV_gkVniOH?8Ik|)Tav}xu$&O2U-N*do@@J?VZXji2vi#aEl_ozZ*AT|g! z2iJ$~mEXxeKx5${$WQ1D?0y1;{E>E+d7rmabXpT;gtoYB*R`p8tDV~!_X}>XU7MV- z4$bB_^*kkbm9=mUkLw$wm|x5(F0k*Hxk{c1~yy6m)UV9b%KFe`8`Fiw7!R8u4ajsuOL&d7M|KO&x{Bfoq9WP5TnxC^`i z{;-<0j<0cn6>7sD=Y}2kcAxR$d%<=qxjk}%T1yS-QWf5PS{ET4jYi%<(Qz8&bjC+c z81IyF5zmTqhM55#`j9H+hTcf07@5 zEr_`FI{SHL(3QJ&H&brxyn(n;d%gFX^zyT_+fFPV9QL{G6XtvPXwrG5N9r-jxhj1W zn1y(+?Nu+(sn(0X&uu;~JSfl%08hi&Q~TLbyiV?J zP7vb=^@_HYZ!C-bVgjsw(<}{6B{=avZZl9^*KP&TCd_M`~`9z*UTB{>Uqv7i-t~|SF zdN$BMWdHcC>@9`PdfTFRZ8-eun&(@uY`tM;98VAD66jZXP5;)%8`saN`-)v}TgfCe z(yY>+Ma6l8Ioh%YFb%pDv!9$zTc#hSohBkM8Bjyu38jaCZ$Nc~F20x1Aq>#LnM|7{ zSx79CP1|)JOA1&m*b;E!YV-V?*+a9O1@u}Bn1uDE+-AynIjUu5_h**Q~qO8etRX(DkBrI3U z)*xz`Y1OJ*i-9Va7*@oc@Y2=&(hH4^#}$r5_(Ht4?D*j1Z_{9+VZOXxZ(IBRi0fw2i0Zei zBw_J}=KX=!#vjw34?mz?VjY~??qIbjo+i!!3KufwZ_arwhRZqSCt+2{baXVv9&G~m zf;a(R0c#)?aJZa9+X&}fJE40?hu$5TJLJ7@a(CE{ zNau^Tw~c>m|5Gy+gGByv20UKaDPFHG(VWoC)l6683g>wznbRaFDg^Lp?#T$PTcKr3 zExX*Xs5lRldpx@}1C_q`Ycf$Y{`=SEs1xrqLzA9nKQO*M5RiT0$%*HOkMH~H@!9pp zrVQ&uLocnP`kq#zZLLR4AI2v}bQmEjv@5ph9uwbCe4O%F;hxpGO+H!9Ze}&20`eH7 zT`@|ber0&A9`Fvh0Wt$N0xBu}S@V`t{D4ctE4sjV_%q^JwvO<$cAF8|{D@VJS-nBL z<_>`odzsh){|kkPO3Gszi#|mSq&}sJX)X*D>kW5Yd{6h5 z`JiK4zBJC@`P+(+O)@3Xl7)1Q~R;HpX8pXLNq4!loYEyk*cUa zmL3rk1!s7Q41dCD_{lZ3*|S4w9UYCQs&&df6k!X}bBD9DMjx#(TXPN$+_wLk*zitir~2V7 zv3|9IxX1pFpWH1!zr{Cr>#9|XmY7?LJB(~X(BQw|m*8R0I4})luIRh6EbE@(%>++v zpLJbM1Gb{0sI|Nzweva-hDF9!hC6k>NgwhraC&JFA_i-XCZKO&a#-EtlE z3Hi6Y<^Ka8i(A58#OqVQj9VPI=$vl9CC}-;+lp8IUgCb`gSrQ$`%mvJ^Ne>ty)|ef zbN!O}36m6qMQx_KOr$3;hekv)pbHryr~9 zt7E8hQ-`FH!@tgIrGW5;h+HKHIW_9If=CGmx4_?|C2I$& zCwwIYiSMbYNte~0$g^_l8nMz^@tQzc#hJ5%70FPe?WGjR``#{8CHg<+LAhz(L(-z5 zVKBUoV%23E;UINnJ3MgwwF&0ru*t;f@urXVFl%LVW#c>AWfBWMfa^n7BwG?1unlNa zq$1Q6aAn10VQ~gDad617N3GSjZoDG5q_!xw(7PZZzdr9wE-*VI-8c1g%GV#KW3|52 zMC1Oeh%ESYAVTq-R=CmYqL-IL?4Q4Q@+D~9!!Hl+%V9?QZ&U8uJ=y&V7;T^Wqr|*j zeOedto$4cepnuXT%3);Fh|2}HogNBa$=)*WH7|0F<-D7kDk)IC>GD1%@b1teG#LlxICmr@BUkgJ*hz+WndZ z4dPmOjZgKZDp}Q@>WfwCm96EyWj3Y$MZ@{1yoKzntY=x&teK2U|ETHGG{sc%FF=ZN zA|U=^?2a#U{~e0l9dYEH^1FQ>mLlK8UjB7C)41qV&F{9;{l_PQ7Xy?O;nf&p@;_#! z3PHMF2W9ZiD9Ciptkt~Qe1o~&xcmqpACQ{J zQTQKdDkKAv0ND-ogFDF^Kq06bm>bv`tTn!#aDWIR1`+wBPU0_OAQ4CGlJgTjVK-vj z&}_6J#uWFP@QPeSEu~$h7ckhYE|!Rc=l;j;W5DP&G%xxzy^HaZ`G>KIeuYM&-JrfB zml8z;49*pkj2c9If`x$ZDP<{KUddPx$w*V$V+q3{L#!e2Ahdt5C#@^2!=PQOEv{vE z6RW|cPNU{q6{pIzGO9ehG@t}qytm*(-rL;w+5H)A>7{9pQYTY3B*_x+KN`OK{%B9U z{`2%-&+H=wDrGh`m5qrq9?hsol8W;Q;^H(Dk6d2&YWN)l-H@AR>i0)srIU* zsCcV9RtZy?;jy?x&MfPLoS=`QoFTR2*3i?aJ|q*d2AhB>!Hz?^!99>=NQRuz*$ch` zxd7>hv_rLEAbC>}3|EJn!p-0?_y-sn_7z$KRfXBY0^upB{kXFvOL{)*9IJ{^AfLjS z(#EMtbQ!}#K9l3JZg7maCpZnPO^gH7DsnS^X`<<38&CKS3M(c*EI{n&#a@M@`Sy8+xgj~nvZFHf{-vi?{$Zt&(<3q;=7khDmmR1&Uw^aZSBFzy?nuid zMs{W?K+y<-N44U+DLRZHW-$8{7poklQlP5M4^wqjeZfx`Fa_^bcdESPC9r8sFNTP5 zj8;S*B(4(v;cKxJtQ6aYu0)z6naDqgWW*X`Bl0<70B$00bZa7sNGqfk5{Vp@zu${I zgxn=>cYi>;VV~o7lLu*Ae8^u1uN@At4Hn5JdlGtY4RBjwMh}$K%>@>>f zbWC~{HHu6l)e>lUbKDoqe&l`VBM=X;W7S)Jr3Pg-vvJctQ*9G=ga7Rc#jA=ymcyeAR^aDC`mR1wj121RH<-c zxp&@1_I&2*^n#r9>pf{Z7CroP&~@XB$3MlJ;*AMiZZo}cXgcFJC$EbpO*v{@5>+0D*EUC_jg)hn%19&Uv(*fB=vZ5 z?Dwyn&(i<;qEbKO;}8DK{;QqwIjcIaq|~)evwf`3cU5Qn%*_NXJnw)rCG18q3$K^5qAnMDR;6==!T?Ow5OcVvQADdZUxtXN`aS@ zhLqL=AIW)2`$44;5OOEx8ZL<7Ol%^0lHQY6NrB{W$|7}5?)K86t|yxiDa5VvYt~O_ zBZ27qIgP3<;yCG``eyYIwX13`HFoIi)r;1XY2R1x5GnAJRbo}PsvhQZ_)O&!tO6Q? z5=%-WEaJkjr;*#B4#1eT6H5nX-N&*9cztobYJH&I_uZ$vf?G`MTB-}GEo+o(Y-%E_ zGm9%L=1Z-A*Zf-fqxwgfs`_W!Z}-HMxYU^2kw-tOM`%Vkei(bR8oD>Q?(xv$>X5oO zCQ(P?&ZMOLam*?#R%saR;*46&eOE|;myyKWJ(5DL4>~vWFPreq`z+gS9UU&)*I7H5 zJDT9-20(zewsx!fKjAo+%6Loi!}VjjFeLO{gc4#E?u*zj?**Smm80rWKx{tYJNYop zo4Lj*<89#`P)=5*^F#S}g?6GvfrBbbd6;{PZNjo-88d0L91?_hh#(?=VOMEWz^0oGh9a`2+qVrX6`1 z<_2_GRhdf}tLXFS1hjo?nP^3|MK*t^v#h8u1{IwwS}2Yz(Jb=H8_x9poBUgp(vk#D za{VES{qSW^%HY>A!;P`b@`^LWx_w1T&?ACc1{?$9LeOohD zLR9gmr{iDB*-Om`21rBES7Du!7_tp=25b(x2WBAs@HfcUsHyZ2PJ=2{d|izyC8_&p zuG1OUoz$_^-lF+T{hIWcWJ=(z(#Nf3-)FkhaO8``GD0W8h#XAcDd6hYt(!ByX!hAm z&*sF&xb6Er-|ar`-o8Cz%ehUmjXO8)-?U{zqHU`s%JiaMjh2?$K|V(LD(4@^jrE9d z4%V#jeBt-J$%4A<+QhkjVHc`nZ)S-{sZ0#J`NlMUjyy{Bm(r5

q_H4Pu-unl=E?~ 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