From 9bfb58ad1e482c4d122beb74a0632159d72f370b Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Thu, 6 Nov 2025 22:34:22 +0800 Subject: [PATCH 01/35] Init Web UI --- .gitignore | 6 +- scripts/static/css/style.css | 338 +++++++++++++++++++++++++++++++++++ scripts/static/js/script.js | 242 +++++++++++++++++++++++++ scripts/templates/index.html | 163 +++++++++++++++++ scripts/train_web_ui.py | 231 ++++++++++++++++++++++++ 5 files changed, 979 insertions(+), 1 deletion(-) create mode 100644 scripts/static/css/style.css create mode 100644 scripts/static/js/script.js create mode 100644 scripts/templates/index.html create mode 100644 scripts/train_web_ui.py diff --git a/.gitignore b/.gitignore index aee52b1..8675a0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ +__pycache__ model/__pycache__ out website/ -docs-minimind/ \ No newline at end of file +docs-minimind/ +logfile +dataset +checkpoints \ No newline at end of file diff --git a/scripts/static/css/style.css b/scripts/static/css/style.css new file mode 100644 index 0000000..167b5b0 --- /dev/null +++ b/scripts/static/css/style.css @@ -0,0 +1,338 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + line-height: 1.6; + color: #e0e0e0; + max-width: 1200px; + margin: 0 auto; + padding: 20px; + background-color: #121212; + min-height: 100vh; +} +h1 { + color: #ffffff; + text-align: center; + margin-bottom: 30px; + text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); + font-size: 2.5em; + font-weight: 700; +} +.tabs { + display: flex; + justify-content: space-between; + margin-bottom: 20px; + border-radius: 10px; + overflow: hidden; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); +} +.tab { + padding: 12px 0; + cursor: pointer; + background-color: #2a2a2a; + border: none; + font-size: 16px; + font-weight: 500; + transition: all 0.3s ease; + position: relative; + color: #cccccc; + width: 30%; + text-align: center; +} +.tab.active { + background: linear-gradient(135deg, #4a148c 0%, #8e24aa 100%); + color: white; + transform: translateY(-2px); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); +} +.form-container { + background: rgba(30, 30, 30, 0.9); + padding: 30px; + border-radius: 15px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); + margin-bottom: 30px; + border: 1px solid #333; +} + +/* 参数卡片样式 */ +.parameter-card { + background-color: #2d2d2d; + border-radius: 8px; + padding: 20px; + margin-bottom: 20px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + transition: transform 0.2s ease, box-shadow 0.2s ease; + padding-left: 5%; + padding-right: 5%; +} + +.parameter-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4); +} + +/* 卡片标题样式 */ +.card-title { + color: #e0e0e0; + font-size: 1.4rem; + font-weight: bold; + margin-top: 0; + margin-bottom: 20px; + padding-bottom: 10px; + border-bottom: 1px solid #404040; + width: 100%; +} + +/* 提交按钮容器 */ +.submit-container { + text-align: center; + margin-top: 30px; + padding-top: 20px; + border-top: 1px solid #4d4d4d; +} + +/* 参数内容容器 */ +.parameter-content { + width: 100%; +} + +.form-group { + width: 40%; + float: left; + margin-bottom: 15px; + margin-right: 10%; + box-sizing: border-box; +} + +.form-group:nth-child(2n) { + margin-right: 0; +} + +/* 确保复选框组占满整行 */ +.form-group.checkbox-group { + width: 100%; + margin-right: 0; +} + +.form-group.pretrain-sft, .form-group.lora { + /* 移除100%宽度设置,让这些参数也遵循每行两个的布局 */ +} + +.parameter-content::after { + content: ""; + display: table; + clear: both; +} +label { + display: block; + margin-bottom: 5px; + color: #ffffff; + font-weight: 600; + font-size: 0.9rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} +input[type="text"], input[type="number"], select { + width: 100%; + padding: 12px 15px; + border: 2px solid #444; + border-radius: 8px; + font-size: 0.9rem; + transition: all 0.3s ease; + background-color: #2a2a2a; + color: #ffffff; +} + +/* 确保textarea也适应两列布局 */ +textarea { + width: 100%; + padding: 12px 15px; + border: 2px solid #444; + border-radius: 8px; + font-size: 0.9rem; + transition: all 0.3s ease; + background-color: #2a2a2a; + color: #ffffff; + resize: vertical; +} + +input[type="text"]:focus, input[type="number"]:focus, select:focus { + outline: none; + border-color: #8e24aa; + box-shadow: 0 0 0 3px rgba(142, 36, 170, 0.2); + background-color: #333; +} +.checkbox-group { + display: flex; + align-items: center; +} +.checkbox-group input[type="checkbox"] { + width: auto; + margin-right: 10px; +} +button { + background: linear-gradient(135deg, #4a148c 0%, #8e24aa 100%); + color: white; + border: none; + padding: 12px 25px; + border-radius: 8px; + font-size: 16px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); + position: relative; + overflow: hidden; +} +button:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); +} + +button:active { + transform: translateY(0); +} +.logs-container { + background-color: #0d0d0d; + color: #e0e0e0; + padding: 20px; + border-radius: 10px; + max-height: 300px; + overflow-y: auto; + margin-top: 15px; + font-family: 'Courier New', monospace; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.4); + transition: all 0.3s ease; + border: 1px solid #333; +} + +.logs-container:hover { + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); +} +.process-item { + background: rgba(30, 30, 30, 0.9); + padding: 20px; + margin-bottom: 15px; + border-radius: 12px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); + transition: all 0.3s ease; + border: 1px solid #444; +} + +.process-item:hover { + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); +} +.process-info { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10px; +} +.process-status { + padding: 5px 12px; + border-radius: 20px; + font-size: 12px; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 0.5px; +} +.status-running { + background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%); + color: white; +} +.status-completed { + background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); + color: white; +} +.status-error { + background: linear-gradient(135deg, #ff416c 0%, #ff4b2b 100%); + color: white; +} +.btn-stop { + background: linear-gradient(135deg, #ff416c 0%, #ff4b2b 100%); + padding: 8px 15px; + font-size: 14px; + border-radius: 6px; +} +.btn-stop:hover { + transform: translateY(-1px); + box-shadow: 0 4px 10px rgba(255, 65, 108, 0.3); +} +.btn-logs { + background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); + padding: 8px 15px; + font-size: 14px; + margin-right: 10px; + border-radius: 6px; +} +.btn-logs:hover { + transform: translateY(-1px); + box-shadow: 0 4px 10px rgba(79, 172, 254, 0.3); +} +.hidden { + display: none; +} +.section-title { + color: #ffffff; + font-size: 20px; + margin-bottom: 25px; + text-shadow: 0 2px 5px rgba(0, 0, 0, 0.5); + font-weight: 600; + padding-bottom: 10px; + border-bottom: 3px solid rgba(142, 36, 170, 0.3); +} + +/* 添加滚动条样式 */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.05); + border-radius: 10px; +} + +::-webkit-scrollbar-thumb { + background: linear-gradient(135deg, #4a148c 0%, #8e24aa 100%); + border-radius: 10px; +} + +::-webkit-scrollbar-thumb:hover { + background: linear-gradient(135deg, #6a1b9a 0%, #ab47bc 100%); +} + +/* 添加动画效果 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.tab-content { + animation: fadeIn 0.5s ease-out; +} + +/* 响应式设计 */ +@media (max-width: 768px) { + body { + padding: 10px; + } + + .tabs { + flex-direction: column; + } + + .tab { + margin-right: 0; + margin-bottom: 5px; + border-radius: 5px; + } + + .form-container { + padding: 20px; + } +} \ No newline at end of file diff --git a/scripts/static/js/script.js b/scripts/static/js/script.js new file mode 100644 index 0000000..9d1756e --- /dev/null +++ b/scripts/static/js/script.js @@ -0,0 +1,242 @@ +// 标签切换功能 +function openTab(evt, tabName) { + var i, tabContent, tabLinks; + tabContent = document.getElementsByClassName("tab-content"); + for (i = 0; i < tabContent.length; i++) { + tabContent[i].classList.add("hidden"); + } + tabLinks = document.getElementsByClassName("tab"); + for (i = 0; i < tabLinks.length; i++) { + tabLinks[i].classList.remove("active"); + } + document.getElementById(tabName).classList.remove("hidden"); + evt.currentTarget.classList.add("active"); + + // 如果切换到进程页面,刷新进程列表 + if (tabName === 'processes') { + loadProcesses(); + } else if (tabName === 'logfiles') { + loadLogFiles(); + } +} + +// 根据训练类型显示/隐藏特定参数 +document.getElementById('train_type').addEventListener('change', function() { + const trainType = this.value; + const pretrainSftFields = document.querySelectorAll('.pretrain-sft'); + const loraFields = document.querySelectorAll('.lora'); + + pretrainSftFields.forEach(field => { + field.style.display = (trainType === 'pretrain' || trainType === 'sft') ? 'block' : 'none'; + }); + + loraFields.forEach(field => { + field.style.display = trainType === 'lora' ? 'block' : 'none'; + }); + + // 设置默认值 + if (trainType === 'pretrain') { + document.getElementById('save_dir').value = '../out'; + document.getElementById('save_weight').value = 'pretrain'; + document.getElementById('epochs').value = '1'; + document.getElementById('batch_size').value = '32'; + document.getElementById('learning_rate').value = '5e-4'; + document.getElementById('data_path').value = '../dataset/pretrain_hq.jsonl'; + document.getElementById('from_weight').value = 'none'; + document.getElementById('log_interval').value = '100'; + document.getElementById('save_interval').value = '100'; + } else if (trainType === 'sft') { + document.getElementById('save_dir').value = '../out'; + document.getElementById('save_weight').value = 'full_sft'; + document.getElementById('epochs').value = '2'; + document.getElementById('batch_size').value = '16'; + document.getElementById('learning_rate').value = '5e-7'; + document.getElementById('data_path').value = '../dataset/sft_mini_512.jsonl'; + document.getElementById('from_weight').value = 'pretrain'; + document.getElementById('log_interval').value = '100'; + document.getElementById('save_interval').value = '100'; + } else if (trainType === 'lora') { + document.getElementById('save_dir').value = '../out/lora'; + document.getElementById('lora_name').value = 'lora_identity'; + document.getElementById('epochs').value = '50'; + document.getElementById('batch_size').value = '32'; + document.getElementById('learning_rate').value = '1e-4'; + document.getElementById('data_path').value = '../dataset/lora_identity.jsonl'; + document.getElementById('from_weight').value = 'full_sft'; + document.getElementById('log_interval').value = '10'; + document.getElementById('save_interval').value = '1'; + } +}); + +// 初始触发一次change事件以设置默认值 +document.getElementById('train_type').dispatchEvent(new Event('change')); + +// 加载进程列表 +function loadProcesses() { + fetch('/processes') + .then(response => response.json()) + .then(data => { + const processList = document.getElementById('process-list'); + processList.innerHTML = ''; + + if (data.length === 0) { + processList.innerHTML = '

暂无训练进程

'; + return; + } + + data.forEach(process => { + const processItem = document.createElement('div'); + processItem.className = 'process-item'; + + let statusClass = ''; + let statusText = ''; + if (process.running) { + statusClass = 'status-running'; + statusText = '运行中'; + } else if (process.error) { + statusClass = 'status-error'; + statusText = '出错'; + } else { + statusClass = 'status-completed'; + statusText = '已完成'; + } + + processItem.innerHTML = ` +
+
+ ${process.train_type} - ${process.start_time} +
+
+ ${statusText} +
+
+
+ + ${process.running ? `` : ''} +
+ + `; + + processList.appendChild(processItem); + }); + }); +} + +// 显示日志 +function showLogs(processId) { + const logsContainer = document.getElementById(`logs-${processId}`); + logsContainer.classList.toggle('hidden'); + + if (!logsContainer.classList.contains('hidden')) { + fetch(`/logs/${processId}`) + .then(response => response.text()) + .then(logs => { + logsContainer.textContent = logs; + logsContainer.scrollTop = logsContainer.scrollHeight; + }); + } +} + +// 停止进程 +function stopProcess(processId) { + if (confirm('确定要停止这个训练进程吗?')) { + fetch(`/stop/${processId}`, { + method: 'POST' + }) + .then(() => { + loadProcesses(); + }); + } +} + +// 表单提交处理 +document.getElementById('train-form').addEventListener('submit', function(e) { + e.preventDefault(); + const formData = new FormData(this); + const data = Object.fromEntries(formData.entries()); + + fetch('/train', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }) + .then(response => response.json()) + .then(result => { + if (result.success) { + alert('训练已开始!'); + openTab(event, 'processes'); + } else { + alert('训练启动失败:' + result.error); + } + }); +}); + +// 加载日志文件列表 +function loadLogFiles() { + fetch('/logfiles') + .then(response => response.json()) + .then(data => { + const logfilesList = document.getElementById('logfiles-list'); + logfilesList.innerHTML = ''; + + if (data.length === 0) { + logfilesList.innerHTML = '

暂无日志文件

'; + return; + } + + // 按日期倒序排序 + data.sort((a, b) => new Date(b.modified_time) - new Date(a.modified_time)); + + data.forEach(logfile => { + const fileItem = document.createElement('div'); + fileItem.className = 'process-item'; + + // 从文件名提取训练类型 + let trainType = '未知'; + if (logfile.filename.includes('train_pretrain_')) { + trainType = 'pretrain'; + } else if (logfile.filename.includes('train_sft_')) { + trainType = 'sft'; + } else if (logfile.filename.includes('train_lora_')) { + trainType = 'lora'; + } + + fileItem.innerHTML = ` +
+
+ ${trainType} - ${logfile.modified_time} +
+
+ 已保存 +
+
+
+ +
+ + `; + + logfilesList.appendChild(fileItem); + }); + }); +} + +// 查看日志文件内容 +function viewLogFile(filename, button) { + const safeFilename = filename.replace(/\./g, '-'); + const logContainer = button.closest('.process-item').querySelector(`#log-content-${safeFilename}`); + logContainer.classList.toggle('hidden'); + + if (!logContainer.classList.contains('hidden') && logContainer.textContent === '') { + logContainer.textContent = '加载日志中...'; + + fetch(`/logfile-content/${encodeURIComponent(filename)}`) + .then(response => response.text()) + .then(logs => { + logContainer.textContent = logs; + logContainer.scrollTop = 0; + }); + } +} \ No newline at end of file diff --git a/scripts/templates/index.html b/scripts/templates/index.html new file mode 100644 index 0000000..06a1afe --- /dev/null +++ b/scripts/templates/index.html @@ -0,0 +1,163 @@ + + + + + + MiniMind 训练 Web UI + + + +

MiniMind 训练 Web UI

+ +
+ + + +
+ +
+
+

选择训练类型并配置参数

+
+ +
+

基础训练参数

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+

模型结构参数

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+

硬件配置

+
+
+ + +
+
+
+ + +
+

模型保存与恢复

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+ + +
+

其他设置

+
+
+
+ + +
+
+
+
+ +
+ +
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/scripts/train_web_ui.py b/scripts/train_web_ui.py new file mode 100644 index 0000000..8feaaf1 --- /dev/null +++ b/scripts/train_web_ui.py @@ -0,0 +1,231 @@ +import os +import sys +import subprocess +import threading +import json +from flask import Flask, render_template, request, jsonify, redirect, url_for +import time + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +app = Flask(__name__, template_folder='templates', static_folder='static') + +# 存储训练进程的信息 +training_processes = {} + +# 启动训练进程 +def start_training_process(train_type, params): + # 获取脚本所在目录的绝对路径 + script_dir = os.path.dirname(os.path.abspath(__file__)) + # 使用详细的时间戳作为进程ID和日志文件名 + process_id = time.strftime('%Y%m%d_%H%M%S') + # 构建logfile目录的绝对路径 + log_dir = os.path.join(script_dir, '../logfile') + log_dir = os.path.abspath(log_dir) + log_file = os.path.join(log_dir, f"train_{train_type}_{process_id}.log") + + # 确保日志目录存在 + os.makedirs(log_dir, exist_ok=True) + + # 构建命令 + if train_type == 'pretrain': + script_path = '../trainer/train_pretrain.py' + cmd = [sys.executable, script_path] + if 'save_weight' in params: + cmd.extend(['--save_weight', params['save_weight']]) + elif train_type == 'sft': + script_path = '../trainer/train_full_sft.py' + cmd = [sys.executable, script_path] + if 'save_weight' in params: + cmd.extend(['--save_weight', params['save_weight']]) + elif train_type == 'lora': + script_path = '../trainer/train_lora.py' + cmd = [sys.executable, script_path] + if 'lora_name' in params: + cmd.extend(['--lora_name', params['lora_name']]) + else: + return None + + # 添加通用参数 + for key, value in params.items(): + if key not in ['train_type', 'save_weight', 'lora_name']: + # 特殊处理布尔标志参数 + if key in ['use_wandb', 'from_resume']: + if value == '1': # 只有当值为1时才添加这个标志 + cmd.append(f'--{key}') + else: + # 确保log_interval和save_interval参数正确传递 + cmd.extend([f'--{key}', str(value)]) + + # 创建日志文件 + with open(log_file, 'w') as f: + f.write(f"开始训练 {train_type} 进程\n") + f.write(f"命令: {' '.join(cmd)}\n\n") + + # 启动进程 + process = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + cwd=os.path.dirname(os.path.abspath(__file__)) + ) + + # 存储进程信息 + training_processes[process_id] = { + 'process': process, + 'train_type': train_type, + 'log_file': log_file, + 'start_time': time.strftime('%Y-%m-%d %H:%M:%S'), + 'running': True, + 'error': False + } + + # 开始读取输出 + def read_output(): + try: + while True: + output = process.stdout.readline() + if output == '' and process.poll() is not None: + break + if output: + with open(log_file, 'a') as f: + f.write(output) + # 检查进程是否成功结束 + if process.returncode != 0: + training_processes[process_id]['error'] = True + finally: + training_processes[process_id]['running'] = False + + # 启动线程读取输出 + threading.Thread(target=read_output, daemon=True).start() + + return process_id + +# Flask路由 +@app.route('/') +def index(): + return render_template('index.html') + +@app.route('/train', methods=['POST']) +def train(): + data = request.json + train_type = data.get('train_type') + + # 移除不相关的参数 + params = data.copy() + + # 处理复选框参数 + if 'from_resume' not in params: + params['from_resume'] = '0' + if 'use_wandb' not in params: + params['use_wandb'] = '0' + + # 启动训练进程 + process_id = start_training_process(train_type, params) + + if process_id: + return jsonify({'success': True, 'process_id': process_id}) + else: + return jsonify({'success': False, 'error': '无效的训练类型'}) + +@app.route('/processes') +def processes(): + result = [] + for process_id, info in training_processes.items(): + result.append({ + 'id': process_id, + 'train_type': info['train_type'], + 'start_time': info['start_time'], + 'running': info['running'], + 'error': info['error'] + }) + return jsonify(result) + +@app.route('/logs/') +def logs(process_id): + # 直接从本地logfile目录读取日志文件 + # 获取脚本所在目录的绝对路径 + script_dir = os.path.dirname(os.path.abspath(__file__)) + # 构建logfile目录的绝对路径 + log_dir = os.path.join(script_dir, '../logfile') + log_dir = os.path.abspath(log_dir) + + if os.path.exists(log_dir): + for filename in os.listdir(log_dir): + if filename.endswith(f'{process_id}.log'): + log_file = os.path.join(log_dir, filename) + if os.path.exists(log_file): + try: + with open(log_file, 'r', encoding='utf-8') as f: + return f.read() + except Exception as e: + return f'读取日志失败: {str(e)}' + return '日志文件不存在或已被删除' + +@app.route('/logfiles') +def get_logfiles(): + # 获取脚本所在目录的绝对路径 + script_dir = os.path.dirname(os.path.abspath(__file__)) + # 构建logfile目录的绝对路径 + log_dir = os.path.join(script_dir, '../logfile') + log_dir = os.path.abspath(log_dir) + + logfiles = [] + if os.path.exists(log_dir): + for filename in os.listdir(log_dir): + if filename.endswith('.log') and filename.startswith('train_'): + file_path = os.path.join(log_dir, filename) + try: + modified_time = os.path.getmtime(file_path) + formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(modified_time)) + logfiles.append({ + 'filename': filename, + 'modified_time': formatted_time, + 'size': os.path.getsize(file_path) + }) + except Exception as e: + continue + return jsonify(logfiles) + +@app.route('/logfile-content/') +def get_logfile_content(filename): + # 获取脚本所在目录的绝对路径 + script_dir = os.path.dirname(os.path.abspath(__file__)) + # 构建logfile目录的绝对路径 + log_dir = os.path.join(script_dir, '../logfile') + log_dir = os.path.abspath(log_dir) + + # 安全检查:防止路径遍历攻击 + if '..' in filename or '/' in filename or '\\' in filename: + return '非法的文件名' + + log_file = os.path.join(log_dir, filename) + if os.path.exists(log_file) and os.path.isfile(log_file): + try: + with open(log_file, 'r', encoding='utf-8') as f: + return f.read() + except Exception as e: + return f'读取日志失败: {str(e)}' + return '日志文件不存在' + + +@app.route('/stop/', methods=['POST']) +def stop(process_id): + if process_id in training_processes and training_processes[process_id]['running']: + process = training_processes[process_id]['process'] + # 在Windows上使用terminate,在Unix上尝试优雅终止 + try: + process.terminate() + # 等待进程结束 + process.wait(timeout=5) + except subprocess.TimeoutExpired: + # 如果超时,强制杀死 + process.kill() + + training_processes[process_id]['running'] = False + return jsonify({'success': True}) + return jsonify({'success': False}) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file From e9d2ccbb2d075bcafb38cab45f5d1e6a46acacbe Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Fri, 7 Nov 2025 03:11:22 +0000 Subject: [PATCH 02/35] fix training logs show --- scripts/static/css/style.css | 31 +++++++++++------------ scripts/static/js/script.js | 42 ++++++++++++++++++++----------- scripts/templates/index.html | 24 +++++++----------- scripts/train_web_ui.py | 49 +++++++++++++++++++++++++----------- 4 files changed, 86 insertions(+), 60 deletions(-) diff --git a/scripts/static/css/style.css b/scripts/static/css/style.css index 167b5b0..60b2ea4 100644 --- a/scripts/static/css/style.css +++ b/scripts/static/css/style.css @@ -89,37 +89,30 @@ h1 { border-top: 1px solid #4d4d4d; } -/* 参数内容容器 */ +/* 参数内容容器 - 使用flex布局替代float */ .parameter-content { width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 15px; } .form-group { - width: 40%; - float: left; - margin-bottom: 15px; - margin-right: 10%; + width: 40%; /* 考虑gap间距,确保两个元素能并排 */ + margin-bottom: 0; + margin-right: 5%; box-sizing: border-box; } -.form-group:nth-child(2n) { - margin-right: 0; -} - /* 确保复选框组占满整行 */ .form-group.checkbox-group { width: 100%; - margin-right: 0; } .form-group.pretrain-sft, .form-group.lora { - /* 移除100%宽度设置,让这些参数也遵循每行两个的布局 */ -} - -.parameter-content::after { - content: ""; - display: table; - clear: both; + /* 保持默认宽度,遵循每行两个的布局 */ + width: calc(40% - 8px); } label { display: block; @@ -247,6 +240,10 @@ button:active { background: linear-gradient(135deg, #ff416c 0%, #ff4b2b 100%); color: white; } +.status-manual-stop { + background: linear-gradient(135deg, #4e54c8 0%, #8f94fb 100%); + color: white; +} .btn-stop { background: linear-gradient(135deg, #ff416c 0%, #ff4b2b 100%); padding: 8px 15px; diff --git a/scripts/static/js/script.js b/scripts/static/js/script.js index 9d1756e..1502419 100644 --- a/scripts/static/js/script.js +++ b/scripts/static/js/script.js @@ -89,16 +89,15 @@ function loadProcesses() { processItem.className = 'process-item'; let statusClass = ''; - let statusText = ''; - if (process.running) { + // 根据后端返回的status字段设置状态类 + if (process.status === '运行中') { statusClass = 'status-running'; - statusText = '运行中'; - } else if (process.error) { + } else if (process.status === '手动停止') { + statusClass = 'status-manual-stop'; + } else if (process.status === '出错') { statusClass = 'status-error'; - statusText = '出错'; } else { statusClass = 'status-completed'; - statusText = '已完成'; } processItem.innerHTML = ` @@ -107,11 +106,12 @@ function loadProcesses() { ${process.train_type} - ${process.start_time}
- ${statusText} + ${process.status}
+ ${process.running ? `` : ''}
@@ -128,15 +128,28 @@ function showLogs(processId) { logsContainer.classList.toggle('hidden'); if (!logsContainer.classList.contains('hidden')) { - fetch(`/logs/${processId}`) - .then(response => response.text()) - .then(logs => { - logsContainer.textContent = logs; - logsContainer.scrollTop = logsContainer.scrollHeight; - }); + loadLogContent(processId, logsContainer); } } +// 刷新日志 +function refreshLog(processId) { + const logsContainer = document.getElementById(`logs-${processId}`); + if (!logsContainer.classList.contains('hidden')) { + loadLogContent(processId, logsContainer); + } +} + +// 加载日志内容 +function loadLogContent(processId, logsContainer) { + fetch(`/logs/${processId}`) + .then(response => response.text()) + .then(logs => { + logsContainer.textContent = logs; + logsContainer.scrollTop = logsContainer.scrollHeight; + }); +} + // 停止进程 function stopProcess(processId) { if (confirm('确定要停止这个训练进程吗?')) { @@ -206,10 +219,11 @@ function loadLogFiles() { fileItem.innerHTML = `
- ${trainType} - ${logfile.modified_time} + ${trainType} - ${logfile.filename}
已保存 + ${logfile.modified_time}
diff --git a/scripts/templates/index.html b/scripts/templates/index.html index 06a1afe..1c57c2a 100644 --- a/scripts/templates/index.html +++ b/scripts/templates/index.html @@ -80,17 +80,6 @@
- -
-

硬件配置

-
-
- - -
-
-
-

模型保存与恢复

@@ -129,10 +118,15 @@

其他设置

-
- - -
+ + +
+
+ +
diff --git a/scripts/train_web_ui.py b/scripts/train_web_ui.py index 8feaaf1..8beb5d2 100644 --- a/scripts/train_web_ui.py +++ b/scripts/train_web_ui.py @@ -48,14 +48,22 @@ def start_training_process(train_type, params): # 添加通用参数 for key, value in params.items(): - if key not in ['train_type', 'save_weight', 'lora_name']: - # 特殊处理布尔标志参数 - if key in ['use_wandb', 'from_resume']: - if value == '1': # 只有当值为1时才添加这个标志 - cmd.append(f'--{key}') - else: - # 确保log_interval和save_interval参数正确传递 - cmd.extend([f'--{key}', str(value)]) + # 跳过特殊参数 + if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor']: + continue + + # 特殊处理布尔标志参数 + if key == 'from_resume': + if value == '1': # 只有当值为1时才添加这个标志 + cmd.append(f'--{key}') + else: + # 确保log_interval和save_interval参数正确传递 + cmd.extend([f'--{key}', str(value)]) + + # 单独处理训练监控参数,确保它不会被错误地添加值 + if 'train_monitor' in params: + if params['train_monitor'] == 'wandb' or params['train_monitor'] == 'swanlab': + cmd.append('--use_wandb') # 对于wandb和swanlab,只添加标志,不添加值 # 创建日志文件 with open(log_file, 'w') as f: @@ -118,8 +126,6 @@ def train(): # 处理复选框参数 if 'from_resume' not in params: params['from_resume'] = '0' - if 'use_wandb' not in params: - params['use_wandb'] = '0' # 启动训练进程 process_id = start_training_process(train_type, params) @@ -133,12 +139,18 @@ def train(): def processes(): result = [] for process_id, info in training_processes.items(): + # 确定状态 + status = '运行中' if info['running'] else \ + '手动停止' if 'manually_stopped' in info and info['manually_stopped'] else \ + '出错' if info['error'] else '已完成' + result.append({ 'id': process_id, 'train_type': info['train_type'], 'start_time': info['start_time'], 'running': info['running'], - 'error': info['error'] + 'error': info['error'], + 'status': status }) return jsonify(result) @@ -158,7 +170,10 @@ def logs(process_id): if os.path.exists(log_file): try: with open(log_file, 'r', encoding='utf-8') as f: - return f.read() + # 只读取最后500行 + lines = f.readlines() + last_500_lines = lines[-500:] if len(lines) > 500 else lines + return ''.join(last_500_lines) except Exception as e: return f'读取日志失败: {str(e)}' return '日志文件不存在或已被删除' @@ -186,6 +201,8 @@ def get_logfiles(): }) except Exception as e: continue + # 按修改时间倒序排序,最新的在前面 + logfiles.sort(key=lambda x: x['modified_time'], reverse=True) return jsonify(logfiles) @app.route('/logfile-content/') @@ -219,11 +236,15 @@ def stop(process_id): process.terminate() # 等待进程结束 process.wait(timeout=5) + # 标记为手动停止 + training_processes[process_id]['running'] = False + training_processes[process_id]['manually_stopped'] = True except subprocess.TimeoutExpired: # 如果超时,强制杀死 process.kill() - - training_processes[process_id]['running'] = False + # 标记为手动停止 + training_processes[process_id]['running'] = False + training_processes[process_id]['manually_stopped'] = True return jsonify({'success': True}) return jsonify({'success': False}) From 5bef3f08ababcbec3b7a37f40615478ea2303ff0 Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Fri, 7 Nov 2025 05:13:13 +0000 Subject: [PATCH 03/35] add: rl-dpo --- scripts/static/js/script.js | 109 +++++++++++++++++++++++++++++++++++ scripts/templates/index.html | 16 ++++- scripts/train_web_ui.py | 22 +++++-- 3 files changed, 140 insertions(+), 7 deletions(-) diff --git a/scripts/static/js/script.js b/scripts/static/js/script.js index 1502419..ea9bcd7 100644 --- a/scripts/static/js/script.js +++ b/scripts/static/js/script.js @@ -12,6 +12,14 @@ function openTab(evt, tabName) { document.getElementById(tabName).classList.remove("hidden"); evt.currentTarget.classList.add("active"); + // 当切换到其他标签页时,清除所有日志自动更新定时器 + if (tabName !== 'processes') { + for (let processId in logTimers) { + clearInterval(logTimers[processId]); + delete logTimers[processId]; + } + } + // 如果切换到进程页面,刷新进程列表 if (tabName === 'processes') { loadProcesses(); @@ -25,6 +33,8 @@ document.getElementById('train_type').addEventListener('change', function() { const trainType = this.value; const pretrainSftFields = document.querySelectorAll('.pretrain-sft'); const loraFields = document.querySelectorAll('.lora'); + const dpoFields = document.querySelectorAll('.dpo'); + const dpoParamCard = document.querySelector('.parameter-card.dpo'); pretrainSftFields.forEach(field => { field.style.display = (trainType === 'pretrain' || trainType === 'sft') ? 'block' : 'none'; @@ -34,6 +44,14 @@ document.getElementById('train_type').addEventListener('change', function() { field.style.display = trainType === 'lora' ? 'block' : 'none'; }); + dpoFields.forEach(field => { + field.style.display = trainType === 'dpo' ? 'block' : 'none'; + }); + + if (dpoParamCard) { + dpoParamCard.style.display = trainType === 'dpo' ? 'block' : 'none'; + } + // 设置默认值 if (trainType === 'pretrain') { document.getElementById('save_dir').value = '../out'; @@ -65,6 +83,17 @@ document.getElementById('train_type').addEventListener('change', function() { document.getElementById('from_weight').value = 'full_sft'; document.getElementById('log_interval').value = '10'; document.getElementById('save_interval').value = '1'; + } else if (trainType === 'dpo') { + document.getElementById('save_dir').value = '../out'; + document.getElementById('save_weight').value = 'dpo'; + document.getElementById('epochs').value = '1'; + document.getElementById('batch_size').value = '4'; + document.getElementById('learning_rate').value = '4e-8'; + document.getElementById('data_path').value = '../dataset/dpo.jsonl'; + document.getElementById('from_weight').value = 'full_sft'; + document.getElementById('log_interval').value = '100'; + document.getElementById('save_interval').value = '100'; + document.getElementById('beta').value = '0.1'; } }); @@ -100,6 +129,10 @@ function loadProcesses() { statusClass = 'status-completed'; } + // 设置进程数据属性,用于后续检查状态 + processItem.dataset.processId = process.id; + processItem.dataset.processStatus = process.status; + processItem.innerHTML = `
@@ -122,13 +155,52 @@ function loadProcesses() { }); } +// 存储训练日志定时器的ID +let logTimers = {}; + // 显示日志 function showLogs(processId) { const logsContainer = document.getElementById(`logs-${processId}`); logsContainer.classList.toggle('hidden'); if (!logsContainer.classList.contains('hidden')) { + // 加载日志内容 loadLogContent(processId, logsContainer); + + // 清除可能存在的旧定时器 + if (logTimers[processId]) { + clearInterval(logTimers[processId]); + } + + // 查找进程元素,获取其状态 + const processItem = document.querySelector(`[data-process-id="${processId}"]`); + const isRunning = processItem && processItem.dataset.processStatus === '运行中'; + + // 只有运行中的进程才设置自动刷新定时器 + if (isRunning) { + logTimers[processId] = setInterval(() => { + // 检查日志容器是否可见 + if (!logsContainer.classList.contains('hidden')) { + // 再次检查进程状态,确保仍然是运行中 + const currentProcessItem = document.querySelector(`[data-process-id="${processId}"]`); + const stillRunning = currentProcessItem && currentProcessItem.dataset.processStatus === '运行中'; + + if (stillRunning) { + loadLogContent(processId, logsContainer); + } else { + // 如果进程不再运行中,清除定时器 + clearInterval(logTimers[processId]); + delete logTimers[processId]; + } + } + }, 1000); + } + } else { + // 隐藏日志时清除定时器 + if (logTimers[processId]) { + clearInterval(logTimers[processId]); + delete logTimers[processId]; + } } } @@ -137,6 +209,34 @@ function refreshLog(processId) { const logsContainer = document.getElementById(`logs-${processId}`); if (!logsContainer.classList.contains('hidden')) { loadLogContent(processId, logsContainer); + + // 查找进程元素,获取其状态 + const processItem = document.querySelector(`[data-process-id="${processId}"]`); + const isRunning = processItem && processItem.dataset.processStatus === '运行中'; + + // 重置定时器,确保从现在开始每1秒更新一次 + if (logTimers[processId]) { + clearInterval(logTimers[processId]); + } + + // 只有运行中的进程才设置定时器 + if (isRunning) { + logTimers[processId] = setInterval(() => { + if (!logsContainer.classList.contains('hidden')) { + // 再次检查进程状态 + const currentProcessItem = document.querySelector(`[data-process-id="${processId}"]`); + const stillRunning = currentProcessItem && currentProcessItem.dataset.processStatus === '运行中'; + + if (stillRunning) { + loadLogContent(processId, logsContainer); + } else { + // 如果进程不再运行中,清除定时器 + clearInterval(logTimers[processId]); + delete logTimers[processId]; + } + } + }, 1000); + } } } @@ -214,7 +314,16 @@ function loadLogFiles() { trainType = 'sft'; } else if (logfile.filename.includes('train_lora_')) { trainType = 'lora'; + } else if (logfile.filename.includes('train_dpo_')) { + trainType = 'dpo'; + } else if (logfile.filename.includes('train_ppo_')) { + trainType = 'ppo'; + } else if (logfile.filename.includes('train_grpo_')) { + trainType = 'grpo'; + } else if (logfile.filename.includes('train_spo_')) { + trainType = 'spo'; } + fileItem.innerHTML = `
diff --git a/scripts/templates/index.html b/scripts/templates/index.html index 1c57c2a..63cc1a8 100644 --- a/scripts/templates/index.html +++ b/scripts/templates/index.html @@ -3,11 +3,11 @@ - MiniMind 训练 Web UI + MiniMind Training Lab -

MiniMind 训练 Web UI

+

MiniMind Training Lab

@@ -29,6 +29,7 @@ +
@@ -54,6 +55,17 @@
+ + +

模型结构参数

diff --git a/scripts/train_web_ui.py b/scripts/train_web_ui.py index 8beb5d2..ee80e3f 100644 --- a/scripts/train_web_ui.py +++ b/scripts/train_web_ui.py @@ -43,13 +43,23 @@ def start_training_process(train_type, params): cmd = [sys.executable, script_path] if 'lora_name' in params: cmd.extend(['--lora_name', params['lora_name']]) + elif train_type == 'dpo': + script_path = '../trainer/train_dpo.py' + cmd = [sys.executable, script_path] + # 添加DPO特定参数 + if 'beta' in params and params['beta']: + cmd.extend(['--beta', params['beta']]) + if 'accumulation_steps' in params and params['accumulation_steps']: + cmd.extend(['--accumulation_steps', params['accumulation_steps']]) + if 'grad_clip' in params and params['grad_clip']: + cmd.extend(['--grad_clip', params['grad_clip']]) else: return None # 添加通用参数 for key, value in params.items(): - # 跳过特殊参数 - if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor']: + # 跳过特殊参数和DPO特有参数 + if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor', 'beta', 'accumulation_steps', 'grad_clip']: continue # 特殊处理布尔标志参数 @@ -64,6 +74,8 @@ def start_training_process(train_type, params): if 'train_monitor' in params: if params['train_monitor'] == 'wandb' or params['train_monitor'] == 'swanlab': cmd.append('--use_wandb') # 对于wandb和swanlab,只添加标志,不添加值 + if params['train_monitor'] == 'wandb': + cmd.extend(['--wandb_project', 'minimind_training']) # 创建日志文件 with open(log_file, 'w') as f: @@ -170,10 +182,10 @@ def logs(process_id): if os.path.exists(log_file): try: with open(log_file, 'r', encoding='utf-8') as f: - # 只读取最后500行 + # 只读取最后200行 lines = f.readlines() - last_500_lines = lines[-500:] if len(lines) > 500 else lines - return ''.join(last_500_lines) + last_200_lines = lines[-200:] if len(lines) > 200 else lines + return ''.join(last_200_lines) except Exception as e: return f'读取日志失败: {str(e)}' return '日志文件不存在或已被删除' From 48a81d99bbadf4af1a6804cf672cd741c0d60b67 Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Fri, 7 Nov 2025 09:34:19 +0000 Subject: [PATCH 04/35] update logfile && process --- scripts/static/css/style.css | 277 ++++++++- scripts/static/images/logo2.png | Bin 0 -> 629688 bytes scripts/static/js/script.js | 992 +++++++++++++++++++++++++++++--- scripts/templates/index.html | 13 +- scripts/train_web_ui.py | 57 ++ 5 files changed, 1226 insertions(+), 113 deletions(-) create mode 100644 scripts/static/images/logo2.png diff --git a/scripts/static/css/style.css b/scripts/static/css/style.css index 60b2ea4..9563084 100644 --- a/scripts/static/css/style.css +++ b/scripts/static/css/style.css @@ -8,13 +8,28 @@ body { background-color: #121212; min-height: 100vh; } + +/* 头部样式 */ +.header { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 30px; +} + +.logo { + height: 60px; + margin-right: 20px; + vertical-align: middle; +} + h1 { color: #ffffff; - text-align: center; - margin-bottom: 30px; text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); font-size: 2.5em; font-weight: 700; + margin: 0; + vertical-align: middle; } .tabs { display: flex; @@ -33,15 +48,23 @@ h1 { font-weight: 500; transition: all 0.3s ease; position: relative; - color: #cccccc; + color: #888888; width: 30%; text-align: center; + opacity: 0.7; } .tab.active { - background: linear-gradient(135deg, #4a148c 0%, #8e24aa 100%); + background: linear-gradient(135deg, #9c27b0 0%, #e040fb 100%); color: white; transform: translateY(-2px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); + opacity: 1; + font-weight: 600; +} +.tab:hover { + color: #aaaaaa; + opacity: 0.9; + transform: translateY(-1px); } .form-container { background: rgba(30, 30, 30, 0.9); @@ -56,12 +79,13 @@ h1 { .parameter-card { background-color: #2d2d2d; border-radius: 8px; - padding: 20px; - margin-bottom: 20px; + padding: 24px; + margin-bottom: 16px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); transition: transform 0.2s ease, box-shadow 0.2s ease; padding-left: 5%; padding-right: 5%; + margin-top: 16px; } .parameter-card:hover { @@ -71,13 +95,13 @@ h1 { /* 卡片标题样式 */ .card-title { - color: #e0e0e0; - font-size: 1.4rem; - font-weight: bold; + color: #ffffff; + font-size: 18px; + font-weight: 700; margin-top: 0; margin-bottom: 20px; padding-bottom: 10px; - border-bottom: 1px solid #404040; + border-bottom: 1px solid #e040fb; width: 100%; } @@ -118,14 +142,15 @@ label { display: block; margin-bottom: 5px; color: #ffffff; - font-weight: 600; - font-size: 0.9rem; + font-weight: 500; + font-size: 13px; + opacity: 0.8; text-transform: uppercase; letter-spacing: 0.5px; } input[type="text"], input[type="number"], select { width: 100%; - padding: 12px 15px; + padding: 8px 12px; border: 2px solid #444; border-radius: 8px; font-size: 0.9rem; @@ -137,7 +162,7 @@ input[type="text"], input[type="number"], select { /* 确保textarea也适应两列布局 */ textarea { width: 100%; - padding: 12px 15px; + padding: 8px 12px; border: 2px solid #444; border-radius: 8px; font-size: 0.9rem; @@ -200,14 +225,69 @@ button:active { .logs-container:hover { box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); } +.process-type-group { + margin-bottom: 30px; + background-color: rgba(30, 30, 30, 0.9); + border-radius: 15px; + border: 1px solid #444; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); + overflow: hidden; +} + +/* 标题容器样式 */ +.process-type-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px; + cursor: pointer; + user-select: none; +} + +.process-type-title { + margin: 0; + color: #e0e0e0; + font-size: 1.2em; + font-weight: 600; + border-bottom: 2px solid #8e24aa; + padding-bottom: 8px; + flex-grow: 1; +} + +/* 切换按钮样式 */ +.toggle-btn { + background: none; + border: none; + color: #e0e0e0; + font-size: 0.8em; + cursor: pointer; + padding: 5px 10px; + border-radius: 5px; + transition: background-color 0.3s, transform 0.2s; + margin-left: 15px; +} + +.toggle-btn:hover { + background-color: rgba(255, 255, 255, 0.1); + transform: scale(1.1); +} + +/* 内容容器样式 */ +.process-type-content { + max-height: none; + overflow: visible; + transition: max-height 0.3s ease-in-out; + padding: 0 20px 20px 20px; +} + .process-item { - background: rgba(30, 30, 30, 0.9); + background: rgba(40, 40, 40, 0.9); padding: 20px; margin-bottom: 15px; border-radius: 12px; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); transition: all 0.3s ease; - border: 1px solid #444; + border: 1px solid #555; } .process-item:hover { @@ -261,6 +341,24 @@ button:active { margin-right: 10px; border-radius: 6px; } +.btn-delete { + background: linear-gradient(135deg, #f44336 0%, #d32f2f 100%); + padding: 8px 15px; + font-size: 14px; + margin-right: 10px; + border-radius: 6px; + color: white; +} +.btn-delete:hover { + transform: translateY(-1px); + box-shadow: 0 4px 10px rgba(244, 67, 54, 0.3); +} +.btn-delete:disabled { + background: linear-gradient(135deg, #cccccc 0%, #aaaaaa 100%); + cursor: not-allowed; + transform: none; + box-shadow: none; +} .btn-logs:hover { transform: translateY(-1px); box-shadow: 0 4px 10px rgba(79, 172, 254, 0.3); @@ -270,12 +368,13 @@ button:active { } .section-title { color: #ffffff; - font-size: 20px; + font-size: 18px; margin-bottom: 25px; text-shadow: 0 2px 5px rgba(0, 0, 0, 0.5); - font-weight: 600; + font-weight: 700; padding-bottom: 10px; - border-bottom: 3px solid rgba(142, 36, 170, 0.3); + border-bottom: 1px solid #e040fb; + margin-top: 16px; } /* 添加滚动条样式 */ @@ -309,6 +408,131 @@ button:active { } } +/* 自定义确认对话框样式 */ +.dialog-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + opacity: 0; + transition: opacity 0.3s ease; +} + +.dialog-overlay.show { + opacity: 1; +} + +.custom-dialog { + background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); + border-radius: 8px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); + max-width: 400px; + width: 90%; + transform: translateY(-20px); + opacity: 0; + transition: transform 0.3s ease, opacity 0.3s ease; + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.custom-dialog.show { + transform: translateY(0); + opacity: 1; +} + +.dialog-content { + padding: 20px; +} + +.dialog-message { + color: #ffffff; + font-size: 16px; + margin-bottom: 20px; + text-align: center; + line-height: 1.5; +} + +.dialog-actions { + display: flex; + justify-content: flex-end; + gap: 12px; +} + +.dialog-button { + padding: 10px 20px; + border: none; + border-radius: 6px; + cursor: pointer; + font-size: 14px; + font-weight: 500; + transition: all 0.2s ease; +} + +.dialog-cancel { + background: linear-gradient(135deg, #4a4a4a 0%, #333333 100%); + color: #ffffff; +} + +.dialog-cancel:hover { + background: linear-gradient(135deg, #5a5a5a 0%, #444444 100%); + transform: translateY(-1px); +} + +.dialog-confirm { + background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%); + color: #ffffff; +} + +.dialog-confirm:hover { + background: linear-gradient(135deg, #7a21db 0%, #3585ff 100%); + transform: translateY(-1px); +} + +/* 消息弹窗样式 */ +.notification { + position: fixed; + top: 20px; + right: 20px; + padding: 15px 25px; + border-radius: 10px; + color: white; + font-weight: 600; + font-size: 16px; + z-index: 1000; + box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3); + opacity: 0; + transform: translateX(100%); + transition: all 0.3s ease; + max-width: 400px; + word-wrap: break-word; +} + +/* 显示状态 */ +.notification.show { + opacity: 1; + transform: translateX(0); +} + +/* 成功通知样式 */ +.notification-success { + background: linear-gradient(135deg, #4caf50 0%, #81c784 100%); +} + +/* 错误通知样式 */ +.notification-error { + background: linear-gradient(135deg, #f44336 0%, #ef5350 100%); +} + +/* 信息通知样式 */ +.notification-info { + background: linear-gradient(135deg, #2196f3 0%, #64b5f6 100%); +} + .tab-content { animation: fadeIn 0.5s ease-out; } @@ -319,6 +543,21 @@ button:active { padding: 10px; } + .header { + flex-direction: column; + text-align: center; + } + + .logo { + height: 50px; + margin-right: 0; + margin-bottom: 10px; + } + + h1 { + font-size: 2em; + } + .tabs { flex-direction: column; } diff --git a/scripts/static/images/logo2.png b/scripts/static/images/logo2.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0b3e2c8abee043c416c6964f49a9867794e1f2 GIT binary patch literal 629688 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≷l%&IZd}_wY%a9to`Sud}k6DFv&L$)ss{t)_MFMaE(P!7W_Ii8Ob*0I- zotjQGEu_X`+2v?LjU=LOlMOk<$H#L4O5JDDTj`6VD=8}*{pMUbzVoJ+{YducQGgJ0gctJM&$Bsc6Mgb%`{3@**Uc5K_8{c?54C%hVX?A-74EDgjqj zcmO_>Jgf8V%^~V&7FEJ2DK9_lA+*^$=x0*F=~mOF6R~^H&&t8U!R2+%ZZ?>*cyV?J zR=3_%|3W9K)Ya~f=(g96=(dp=%;maAhK-G_N*ib4yvnuC<@6Ot|Fq*im+b<~fN2bc zR2M{SlCJ5_1ql!~Px>AJj$Z$DX$S35PR0BZ4_*n8Q)2FjA^6|gZ9XAU;6KJu5ICb4 zd}rb82$-RD-ptD@H7*WUU0ody1;L}}sfpu*oKMum&)nUU3JYnT*G@g=RSyc0Ktv~5 z`BbPvBI9=SL3(-jF}NT2__+;BEAS#3ytBx1Pg zk1ntfEO_w%UEq{#kXt^DPpbGcxm0xWJ@vQq3UK&~95FDhI%N|;2ypuDN<$TqHPiL2 znGwkI)hBq0t&C+TSW#2cwN>6ah^@faF2mH^b#}<<5;(5Ic4hq?SbsT~I;w5R(o zZsxyV(h7HRXCWV4Qtx(diPrh`=99VQkVk0?KjyCl%!bk^<;J|uG;PFSl%=EAxnI3{ z1%)A-Jrj|{^+jP}A#tmzXN@FH_oq)drRuN5vma!IRy>u3@yXN~y45NJw9z$RdD>qu z2NW6cY0N6mgH??0taBbsCo68=x<0Y{Kg_gxmX^rNo4*sx|J-qLyZU*erLUi0RP`qM zlXcxY&ofp#B3RqS4)_QX{?KuE)x&T4hz4Pc&>Oqg2Fsp2FtRRYfax5S&N!hD>z%K2 zr42NXpY7I5sP?n9_*g}gcOgX#y z4bD(>qr8fy;sUMW+Ulw2{sk{L3H+t%JL4IN`gKiR-PNBb^XpIN&+mb2*=ijeaFWI@ z2hM3`Xz1&(J~(1sm-~{}pfq>-+fqvQ^tY;t3ZZBn-V2M#ZdM%iXbM2$z0>7LHcrl9 z<*(Su^T-|f6bP58_WXz!L#ysjrGZ&&>-B3{0YRW4F4^}gVnymF@RHu^wRpa{ujlGJ zf0jDG2spETr^oa3v6#~9b#5^w$p_^s^XzgT4pa2XgIU&+LY`FALUQMKv3psx;#nR) z7K^4(EmjL-d8jgNkr_)Kn#DlONM3_f7qyr;Yy&e-hD1Mft=yf(uLV|d$d_&TGnKa3 zSkZb7yTOr7N7usv&a>}ztzI&-k2-fk3C}8Lc2Rz+r#RGovZ|`75v|qE)h<0)iBYiM zUlIcpmaf$nv+&Yo(}kcoI5>P98tT7=u|t6l>w|boXX#vVF(kwYwYermuh)}9gK3rB zkUyiO39gv19W*R$-jwr=F_Lk0J>{dW@a9`p}STrB?D#i|ciUZi?8#c4+lYakV#tqa?s=P#KHTvG1 z3J$!O61dei=UY?XzEi(FJ6liB*Di$`4Me>UqgLE?>FtPOC_ZeofNAS|RoZ+|F2wxm z514#yWS~YfDb$z__~9#f=b{l#*aRq{85v+UbadQ?Dx3MUL6_6LPIRd;Rb+>Bwj(pB zS|#<|yA>xL2-Hpl5qDMhg|m(hzIREi(evk_{)p)I3vIWSxZ?eg>tg)d^dTw+XIHmc z9|EVuP%zt=N&_Rn>tm}3hUz8#Yf0{a#t(ZZ-_Fl@fU(6XyN2&vM9;{0u+zAEFks^y zqoL;(2uubU7I-oW*w0%|XruxkN3tc}q^Ga9`N9Glf?<8;lzXFDf~NcEh+QI*WYt3d z2SG48sW?sGxOSLLAg?gO#a+L)116}^xh;_c0Vn+#M1@4-6Hito>C;&8Xm2iNog0Yx z)z2FGxzwS=5|4ujr?1sr3cp8u-Mn`)>E&K9J)?A0VTDxMx?`g*U@7WQKXCS<&$LQ7 zR@}Qif+X%mHQEf|>h{5+^9fad$r*X(X{039g|~=6(bkH10S|?{Z#9PTKd*?h4_Wl{JU&eu1E>4Fvq?A%lWt6>nP2B#}&4S^ZbMl0q zM|ggkd+2(aM}$lQqZDRfqr4IhAnm>T_Y2jFSKI~x^8@RQE28|%gVmH}w)8U;n8U-v zPg_o5EM0c=9ie;Xc)&7d1lB6UwReUEH5)scofnVS?_`DQwBK!%Pg~b%a15!NbAJVx z=tslJ@mwUzGr`MK$eimkssQ)|5ahh>n5#!p4Gjsolb4?l!bo|apDPurGWY0IKkV1; zU+fHaJ6-(syIt9Px@{)NdtincF#X~YkWoaZ=}^kf+?DJFahQ|aK!m7X@?j;@&rp`s zg2T*t?DDr9m)h)qv+?=SfKW5Y9hzmpj5oaLxZ&JrBtW-aI$I3Y{V5K>%ZVz;s%_ah zT=@8gt?79DspsWkx`f4m2s*!Ge_q}6F5N6+$LXfxWy=*C5Xb4TSJF_|R_|KleP?YI zdTDlXS4ag&4!MR|MpB;(76rb2IH)Oe21JKVy?G!r4-0!n9HWw9xe^Y1vtDGof$f+8 zjU7>SLxVI?Z;F6d5^#T_IQyTOdHV0Ng#~<{^U0zhUu+?}b%`Ym1W5eW9jIvZxE9Eh zuP)e={rYav1lw}r_mKD;jY#kve^P<6vL|R83DIpAJ6xzM=O6Hqx>a551q9;GqST&LZ+FSzyDgAg`a-_s7@~DZ9J%~ z?~No~UugHw#(ei}sNB$95l1YA&n+5iJ3@LR!i} z6*fMTgswg-D((v|Zt_PMpD3VU#lYI;KxISSsK)u9jJqvA7%eO;CYs7m()fmel}Jxd zZws6~bq$SO^mLruzDb71Z-rYLBcIX*jw6_m<193Hej#_An3*+-yV7{kTJGt1z-I=5 z_-9cA^D{%aFsw<%*X zBc$8?g0Sk>h5#zm&RZ}{3Q zuDF5gebS!C9R{J!R+2_!==MKE+hv%^?JbWZk1$%w@soP~!0E$19P>y%g%72T9>=2u zrG95cz00}0eah4?fNN4wqod}*b)X%*+;v@~++$`!W?b12b3BbqM zKSBz~G3FA_koR7Jd*TC=0<|J$uMIWlWPNfZ+E&_J4ChyinnO@;y!G_{l^^NF0-{cf z=ULE0{^f_LKfJO_6ced?x^QJvGMwN@ETdF#Xx_fJeQQw1s}ZKG8Xe&75ZbdsB;|Fx z^syL6MqQ<7dGnLH>Gp=%-9ja8Oo=$f>Vn&@DFc;aK?5o!411?uS2F~8dbc`IDjF{8dGLDj2}$YWM+#}+s)QDhTdqeYSWs6;iUL=> zF$fw}*}kWL>(a}wfR%C;Lx83eE{49pEZLZK#?eHpr>6&j)cf=S)LsxgZAaJC)C7V? zl0~LwRMajoXOygvgV_$Zrkz(N?br}z5SKdNS1$}R^ca+`p6)Np%F1TMKCuXA5l?&H@me4L(hBI}c~~ZB z9IJlp+MY~ZGX%O~7ZzQLJ3v9^S`n1#yt9|HGrmaO)+_G?;h<~B2x@n^><~F8a4vY@ zm*PZ)6sQuaZpEm6jY%vBMGPf}Z@Y)jv%BmU{=UpGEK|F1BqarM(8iL7mX@Jx13U+X zMp3&kmoz>(nr-Cq2HkHM`!7Zbupd!;=CR8q`5I@2M=Y$dn3`YVhL?*ajsiafxC9tR zAiD4%G>bSe&Tv8#M~p)1N!mIQzk4iTyrR!VNOT>}z&aP+FgV-oKlX)k8*d<#S~DMB zB^d^X;*BBKg#%MX&*!I;_wI>zB%9fw&Iz&oF28^K3+KiGpyz-&PF@t2=}S?jSXx&g z_fgSYHcIu;aG${|=I=4ZjWM6HUgRj}bF(RIwMl6s$`7Y-i|Z8L#xTRCR%v$^vE~mv z)@+oGH*5UP=Duq;?(5RdOHqbNsfLrpRcN?G+f%~4Q694nn-b$-)8zcqJ3TiycjTF3 zt}^~vjgE|_lC<6CC?$#83Z}r-+0bF{ z3P@#hi{x@k=@e!=g;mFsqqoqGuRZWGyDujjt4tBcb6n^~g(e^g*`bL0&?$OMQxmdJ zT~mfx9MHhFGWeQTZV}b_8}j&SBcx`Fe|&9a^9B75CMD_;MHsx8-4phU`sR-rb>i{P z(&Yr0nq)c1-0Q$PJU#}N!o-mrzE4_tNl8UzWxE0M0*H*6IXlO@H+zp=?KsEihPbsb z;StPu6QAzBn2(JHhvdCJl3apX|G>R|15Dgg=DW zU~)ScItS*$m%=|!4!APg<42afowafF34DUtedqJ@RQGH#h*1y_7xl_wH2!qRp_W2X zCm*UA#m0N@xxI0&zH1aXx>4|?mRrVajqCUwVu374`zO;qCE{X~j6Eekb(WA<1wR5l z(vHqV=fPfNgwwI^G-0h&iiyV`D>frxtA)hy#JRtEZW3KTMOLVQp|;gU`1m~4WYjyE zoHTYRbUv)=JFnNt&#NZJP`@l{>&>n6p8`F2Uyph671B+Cr?9!XxrNNu>7zgcJnZZp zJWRD6-b=VWiT+~+5D|ignV}SK?ht|a^}zxtoPnbQ+%>+RM`L_vD=|$!zfb?@^i;=> zl~Po~HKC=(U9@x6e?cdnm;YQ=QK<;W$PquJ1V!3Bmg5BiZoI_e$ctMhLJ}BaqIR;S z+Syv=V+9ih8g!~zNUIJ9!U^)HFu8G^)V^2RUfUJlX$-9 zX-5osq>xd>fIJJ65YQWpJQ^dv_c`GGM8O#{wm=WonBGNVO?3d>&IR{UDy71Yhnb@0 zfviDmpM;~&;o?H@i%PW!R1onU)&1*7pHlAH7#!YedB0cI_B7aqWc|*oiYC6F4}FA1L^u z=K>G;TAs}|ah>(Ao_7MwOhI^s)QwK3|4@`B&>@0vNJ~p=aXC_OZF>HaqrByucGlWO z|0Qk1XvZfrmSfn&uQ)tq%gvqdaP(33%3#*pJaBRojZpf!sADqZu&lH9Sa?Vn%2CwC zT*(zN`$QApzZOk$&q^#1nq8r22_EEp&)Yv))0xo>bdq@Mgz4)b>o_uknMGs5+z?uZ zuhoyt2Ye#dW~69U4hzmf47eRLhFhgiRz&GeQ{htaVf5+^a2W-C*v|ocO7vIX>q>}NIfq#zxendv}P!yQF=<3>RXxe(F6?wvE_KDDQqZT z=Ni6SnhH*QM?0hHWg28Aef3-2JPH21yqp|n@4i!D99P7f~P?tiL zkxj@|V>7amdCD@E38>1lV|aMV{0g&VacyW_i6LrXpE0TZS%N01X{VGXUt$JGID8>hOsiD9pFwvBr!UeykA&@hB=|lg&jkKy_Rgr zy_dr-{iezS(NR@wqDWO0E8rgSvZXM~GZmC^zj}MKAn9}|3ovli7ROoAJ?VYDtmo0@xjBY$~)O}nDU#;djx!*x|KNq`lR$6@xEIHiJtOXFwZ#o*4@mwaHUjVUn5M(AqW&t`&K3}A9w&$IP=c_{1 z4c5XTOodc(?mh0MO~jW}Xpka?J+y=q{|bOJM=-0L_#0|ZD;@k0S}J^GI;Yq|VVrnQ zmceH_IYM+{zLV5NuFu~pQ0n(MDtk^upKwY}%b;-F!>`ehM8p>}bWu~4dd`r<*83)r zSIp}iDNg`4FR0UipKI4{aM=q(y=MFwiZ)%?!3MSX1PZQ|pSj&s_xJIQGUJt>x~$dR zD#j0fJ}UYo`5cwD_RiOEDy3$r+;QYfx>Btw;mDdg`ElI`TV+uv3u#JK3F@(+{fX!XSsim~FoPL5VVu3zEyKZ;OPqhl+iwXvgT#8A1u8tRXT zBk%rVNl^l)5YP1z$*y)=yD$j%v!W8JENT|5C;~B!Ckh@j0y%7tpELtwAm2CTnuN`A zy{yK!LO>euNYWs`njV15n1UO417Tl}P)X+#(lHlO?M|W{@5MnwUZ-j5TvpOEOcAFG z-w%}(&S4-3m*V@phGM;jRMr~6)NrIDEU>ZNx4b`RbXTFZTH0fkRVhU=1T`vXQb_fU z=w~XW&*q+1X!_~Frih>QC7d)AXVo0d@MpCid@aR3;WhRraTCa>fFH-@A`J`RL=E%; zX)D%_;~&~D?FOU3|5o%lb?6MW+A}Vrg4iW!TvV?-J9Y^~nd)ZVv0n0nP+?3=O!h8A zUi}Gu@QW+rJ%`--1BDkYz~q9vjyMp5(7w~ckPJ=0qNx$J>&!Mn0gww&X@1hYyT9~` z$$n?%oktT^CN>;#wxe>=dju7=6ovt_!%T^y%iKF|yiN?w3i2#GD$HFIRB+KM}g zi3>bi=8TupU>bY+PSninjd!_7{Io6+uM!@%ij^!Ii$hq?5uX$U%ZfZ@)RjC%nmYD@ zM%oj%6qk0BZaVUETRmYU196&2);mhM@}-ac35hztPgIx(lYa~U_+s}WrYq{W(Q)EF zi?#|&s3y0ONuex(YICSO)$j;APvyq*pfac7+Q(Tv1fLQV!*R3bXq9Zj>sy7RoZpWM z1j<#uZJQ!@ZR84exwmWOHV3beMkbA5XEQ-^qU+Az5H~>%?zjJV5;Pg`jQxF87$T|X zYv9agQFqK5-yYu+(6(4xUuWrgO>svFC#1rD_b_JloM7(?;j$K*Ifs(rG>15;jSih71W2A6Hz4b$@3k_aNXGFVWNT!I<5Mz1CavW&hxtI5x zqKul@H*_DbNn?R1?e=^BtCy_QrG7sOksHDs(u`h1IL8gn__~+O5nh>XGU#VbShKxH zMs~KD=}LU5Z4nXjWtn|lUeW4fMmFuZMTrWIv{C_5F^al5GQ3{!AWCT)U7!X@;9U~> z7Bc&cxOUa#Px)wzRU8~!$~n4KHU8DzJA4wB@>9C`R(HdQg~oewEow$@eUQB+7aj>5 z>bn-?q4jN4x|X%!<)xWP7NY)6vJLW-y1k~vmQ%UZ2$STU_qc&~Ddt-TKWNI8ylfT3 z#Hy2Kcqky2X7s8CN5l9v630(1pwXU0Q#>50(<_IBy)%z8{oy*YzubGanSN=GMjTD^ z#j7hF(fi(MZ*Cj;rtn`9onhZ1x8R^!8QGA?f&tiVP2Z<1nhyHtIGwJ5PX!XuZtJNo zAbon|o-}*fDBd=Z9fdp%N_pa7z8W!H-D8{i%hb0@%r{#K#^C@*G$r zwzf!CdZt-!68Xo;9C40Ij)l#f>mKeiE6LUh;ETq6!Tvgj-CpaT;}6= zq~IR9z)qVr1vdnQqjAGf~ zof43^4=Xu+N}g}XPQ~HOVTWyDWY6XwuA(#Q`xSw9x^0C}^bBD|*K>pkJ~m6| z-Y&9E)N&|J0(ynk{bc6~^ZX<0J0pW)bG>eKOa`kK%Gb%9rDkZ{1SHr&B%i@82Zi@( zG=-tHb;Rnb35nN{5{UOmEDJ5Yt776pxiD)Rie2gxysmhF#*#Rf^6wDSwxUTgRaZC_ zZ}6KZ9ROeC5M-PV!fiYuz0bz>fAFqLj>YPgOXQC|7&@GeZ>jvT@w!jN9P=@np|-?J zst5xDL>4JnlO<+%C6qla^n~LlRp=Rx0n%R+zp{g?Q8<)YT*^EMAsiGKgEA{?12=mFx%VUX+$lalv-hF8FF>TfC zi!8=@Z=1tE6tf|3b#BH1>Fx9wdnDdp*<`-`E^N|hjB(c$l zGt#w)5yj``SMSsmCT)%2+x4Tuci_Cf>HbGEFXoyqRloXZcBQxw1CHV+q2c!N6|kmb zui5KEVy~K78{&-X-{m#6Dz`J&5&b~QW<@ALn`1C1oqqagi=J(=UYQE!TT20!80P05 z9BhY2&pxJ*r6o$JR&;5W+s)Ysv?wbRkVG!dbMf8N)f?~1Ad==)U13&J zaAGwfCpD-RD3h!_Bcnk1HoDBfcQl5w?LPcrm-S#aW z+M?_kxKn}9+q&l;GM;b-C?oHN+77OIZ5zN&Kh4}I#ZY?`LWeq<6Jh?yxcTuxNpLm% zT;mUK<^pPD5L5o??W5ZN6jzJM*qhYNO{i2;_p;6c6&sQCs9ZD zAM%GGTq5s%1}0H&TNPA2yRF`XyS1PY@7Ko!w6ld38L%(6zf?Evb=>vb^_X7cCY-5Yv@_- z`5!jmD0*VZ_CeUU`}av^Bww&*UZ!s2d1+giS>Yal+=P0_{Htl5QhD%autd#{RmfyAei< zP*4yO@x059*o53s=Ruj=YxYMU8t5_|9+4Wn@-%iQM6vb%Pe)aTk4lj?wB2%CgdnRcS$X2#thKvQ&LKnuB6nO91gA z{f=(S72YW^$ejGj=k|*PxaeIX+bZ_i`P`v|dT-rwR zrUqR!j>|QhB0Ne086(U<*BtJvy-;QrK^_l2mM7I3%Yc7k&n;OmG@wT)MGPtN5{k&X z?|U^3$iP00d=z#@ZPK?wf=zLI{l#rT9QB?hhhVJR4RUelu%xccyXen@V5O|6++`wlY=>Av9x7NpNR$zqStO4 zsH{gl+Fa<**9%qG75CY-IY)~8A|OrDdwmN|VGMz+yK;Cg%Iy$|Eu`EdNljlkh1+`B zeAMhww~4!jHQyv=Zj>t>alWr+a7b|I;GlW_tRxG$fhVvK z(U+oVC?o5+_l1XDlbYkY%)-Fv4t#2k2Qg##&MNr}CbF`Bbv8np{7OAkx#`h}8)PzWa}iU^nB zynbt`tfVQc<^P(kR5c(A239GTERF9;bE`PZB$K^rImYyx zg`X-Or|P*p&kZwMN_x zmWtL1rkTd*bl-|286xp~J@xc^%=QMmI8Ds7)m8i;|VGsFwDLeSQb;9SsvO>qpNOFE&e=tD3qx?b_7D2hd`t2O)Dzz z5z0)7!z=qRpY?NIl+%avZx~uLTGMJi_;-!RI}Bdv>HD2isyfBzu!e^a8qyDV#FiN~ zxAX8~33H?;l6*4djOhr*WJa7aN5Rz7AbW05BiyZq(`|Y(R-q?wTFsRl*CN!sFfywD za8}bm(Sk*@oNa?X3VjMvInbe|ptdU!R4=9kG70k06nGG49LXSvaXF-tMt>S7Kw|&@FwM3BlWX(8}5CJc;0^#EgR&<%l1L9i#?;h|tm*!P!j_(QYj8NV!pM`k*{dKPNkE&SyLoVq1bI9jU4%Rjpe_jio|}5mKkF@88(dq zh_Y*Nh$f)mkCDkvTb3CUVt{rqzGWwnohPW>R&D z;MOX)Lu8%Mqs!O+F}@?SaVzndPV~4xaZNbuD-KmrTx1~(x#wc#c<={C)r|mxu~DH+ zH4ODw*j*fh7jPz?FQ?VxY)P#;kfQM2cM}(im7Pl!9ryiFb$r6>r^uzhib|nkYv9$~ z_ZO6jikqXiwnUK=4-6`g15qIQeoz&`i39lQ14w6C*U2>Nt!D;<+Ra{)?2%`$DL%;I zf1w4%wn&hV;}dX;){5|#rf#Xnk$sd37{9{GUL6XzuU;vuV(vhIH8ATkze+fNiZCR2 z#Rtu|^j9U%v2SaY!>d_S#i1>II9-oJd-#A#yxU2(R_s&Cqcq?YI$^Q7g*{th&hv&L z=JY!WVd{Io!br7+08vav)a??@ge5BrE-=pRr%1bdzn8 zvq|L@;RxV;c6Y?{`NGH?-jjBr7CDFBO@Fkp>tCPM7ZG=mqDWARYS*bek|f@$oAl+a z-7Kn3)b7;g*B3>< z+^LHwGRJawq*Rmd%-+Hd4xx&G!=9R=Z(s!mk0I<=;yKklDq*qD!|g_|_S~$VM86K< z9C)4zALn0{{M1{JJ(Acx&+@)<(54{dsiF_@5O!_Mobq{Xm?&CJkEk!Mqv<{qWvRV3tP4p!1B|~5TP`DsvCGNx#n+SKGKs33GOhI4Jc!O`E^WH`*2b?*|I`@Zk}w{MllCO(NXVcirov~O%9%3 z>>Z4c`f`%qW=~f>1g>3fE~UW5o(M21OiTh{5z!ROCv2!oKyf6r*c%kBbAfEKw#8ZZ zJC{?`g-6nMtE~?v>A@=iP)&7$A*dEg+e(#NU&k~UEdCOd9y#))CMOX0xzNWcqaeV7 z+8ejkI1ShH&3tHNfZBPa<}l(tZ6BQfV4vuoc!&jcDx6_}T&8d`9U%LDa{rZ!31ZjU0rQ$hRxjLZmdvi|+^vou#0~0i z^Do2R&OblwWQozPJ%f!W=3O0PzW@T#b?eE6!+2+&uFg1qx6m?uC~w`SnvhQ6NFtxm zavQAbI?0o|h!}}6oKG}50mlUE?Ty3@t~~>8E+ujp@Hjj#HKij%=oV54K2zX*5vPVQ zD+Rjp#nT)Ja7@qgM^WC4%x zr^N1c*yyH6Io|da4l4*^>T8nNlRk%%U^$s~+O6n(uTb*dxLNv+K}`$bw=Nv4_CG9- zH?0P56ijS;+YN$LwR*7~D7H#*AQJF&{iI8+OXm^P>+1t^;Yw4+$3%&F9ax+EK>=J> z4PPc{?j0`>R)YqT-9Sd%Z8@CNT1#_(F2)2O+;CuG0z%S+E~P~%s`VMrmJYj(@`aVj zWz)&2s-h5HI~TbJ=7=mj#QPy#VQ>Z8k~V4smBgJZZch zHYD%<^yf+|?Y2b8iso0Vra7UR_&buKG!i~F_`GYYLo0q#r9(d^+iBmnhHaHERdKZ7 z#S%Yukyn)p%bZIwF}ke&gvKBG#`|R!kHT89@wlQZX#@USr#wsINaXa^w;mBp*nUBC z9PWn}UR?K6MknocBsU5AR0}z9KD5W)gLiWYCm*7&f~RlfZ83V4QZt`f=lrIC#lKKa ziA@cK0GoICt*57V;+225Ut}NN+WujItoPLDXJzCP`8Z)!lSgscN4fZ4opR4gIqQ{m zSO}Uzha3DtkyVXCnmV~;wvj!fg5{}`mkw@mY%L%Vhh8GPxx8s=6rIwe*eZFAI)yX- z;GplZD95e@)#9(bdDPjrTD{`Z+AcfUW<6-#?o!vC1HSnY2eC=)3xYie2uRPvyaAC= zXb!;8<{(a4@yv;)`_jP8?G5L=XUzPM=J{n%9J&q?D(M@3v)Z86!B`7wh9DEGjl|s> z>Ehd8ky_eRN$eqN7)74L%r#hSCbk-m8!f1E0P#8186;gsB?e1^;8e7^c$?)&{1GF+ z9%b?Qcx(>p+IMFsbAjQs6K=ti`djFn5OrSVSU;|ex6T6@vKu8dkeAK13q+F@`%YSf z)9++QS|mrb+Kx5$-Ix;N=X_;};6Y6=)mK;l#il$nTn ztP`^OG*fC1Ivw!&5LB^>^2v$N!U=i4!>NpqOmH_jEF55bNja|EO;#-!Zr=Vd-uBTHAW%=U&?CJ?H#9Y$yIr!$%`4Nz$^e z7uoW0c6Pbjnl!wRo2p$koUx3(JjdJ7#;KqB5w!E8PkZ2mYp=1OBVhWH4@dDW;iq%Lcm=D%M955+I;uWN^WFSF4bAlr zMAStEUxka}XlvPBgN&QiwwJhPGOCLSeRdhNd{Qr`D8rB*KLmTLGULas`4 zu9dIo?a{5u{Py^{MZ@SRcW%(_R|Fxd-qgl!9rc8mdcHjw{nayceMq~bjgrZu{bIpB zUvQr#XTKsbtq|tZq_ie^@I39|a~+}bw1-yuRJ)~0leal{gu665hP^gEuzG%D3SElt zWe;bekm>-w6oOFk=O;8`M7 zjw;2z8EKRWJ}3)^2E3ugDWIr%M_)4OUj+2`wpTD;@4yf7#9+gCvt{oSlT6GFk~ zr?P{B?^g=bGn}^{8LY7xn+AQNTp5Ry-rddf;N*~At^3As!Ej~yoWc>6SFNYT?44Pi zy#Ht8@eEnqtbmoaW%ffdR_+se>rHxpVHb^bghA7sR7zX;2IXD~r!46ht|9|j<tVk(;K~Y%+yWW`to*3FeoC(F1XD#Rna~Jji_*%ev?m zczbz2sx$dciuocPo8p`9PwR!U0z&K#zEeH$mM*?ctw96s^&kt$hm^@dq49+reM6x&*7He{#@m+nID8A_40G*Z*jPxFy^;<$rcfG2pHQO4M%*G? z(zhZBz(6_Ro(^7)1uS$?7{m;f$p5)6%EsddB zR|I`yP&vA1Hwzyc?y$18UNH+lV}PokvwAvUg`-xJr=FhUv{Eh0zlZ%v-V^@uA@}Gh zSs|bjJ`$>zrY8n&iW-g>7h)6V#tPX; zI}67-(iRE`+UuB6ZP(?H!YurEeAHOz5&*M~+?&ORsVs&-4w zzaX%Tw2K{G>5TxIKd$H7AiC_2x>1IQI0?rz=T--E1X@1+p2H7@&NY)?wb?hbnSD&} z#uG_fPZ9J zir)lLn%$0~i{#Njg>MZ$jyZ+|nJ8T^>UCzSUDeDF5BqbwYRCK*5>hs{HhvRbFSYnX zChzI*jWdo3ggZ*DozLK&IXownO(mp>2M^uVqr<}{;5j$SVG|G28wgIb8p@0@O z_3~pbj@X8DTU@H-@?%wviL<;p{(07WHM)v>5ONu}nG{s_CzS^@KRZ7(b?bbsbn>>xYiB8M!=+a+3-h2C( zX|p(Zur8wn5@Vqr{?%qf2hi{^Z|fm1G@~1I!W8NU>LWl%4Wta_LujSVRaHgQ9{Jz; z_K7C?4I=RTf}+xLlm;!~qF@q&XUml{AdadckB)~oquCWf)mtZKDodk0E|xwr5k3>EAo3E{DCKDCof-jhKS87 z(cl+mgq+96?=zMN#Km0MgZ@9F-ZCodrfuIg2th)mTS8Kh?oKIbkZ$SjmTr*l?(S|7 z5RmTf?rwPJyzc+A-nCrvjW5H@Z)T6}z$*8-3BHkKZ_?{HDE@<17bvyxG8~^3yzC;> z_r<@2Fyf51S#6Ro%-HC>L_#Y*b5#zWj-#s>OWK>H>j5WNjENoRJzI@!K^ET*rHcvT zgbL}NdS;cim)X-tl?QlZ$HbEM?~zwl!$EgPidiYZFp)un1{Z#c;JVvf^>RG}b92N} zW?8he#u4}Mxw*MW`s30-%JHr9!XU49XtzQ%<>$u#Tfb}D8Z?Dx5^a%z%A3mRDv;V$ zvuy2wyx$=|fp96M@d-KF?N~}y_$UJzs#?PQqn$eNL+FN_v--0kc`9;gh#xscsh|L> zzSsEMPnJL{Tn_=!D4R`)I=SFbh@wxMC8VLTE(A?)nKJw3{!Hrmx-U~?VPt4&``S8# z^OW|8;`O&M=K=)f+0lE3{=b}@MKcXpTdh5Fc=1cXsVQh1|)^qQoi&kVh4P?=W_JBQ02re zW!ml^CC$eSE+STJ(ky!wA1Y}xj~YtR@luaX)YyF-!`h3AO^onLSo|=Uukqw?q(kN5 zixFffea5(#e=!nZvb!;biT|Vz>)s9O{uBLPp*ch!H@=@k`LD|$nhz2r`-we_?qq7c zY}0N^Gt3U6TNJ^+7wy81BagOgUrm|Bn$!+J1bq-bfZQDM{)CrcUp3}Fn zv9aUbQ@xvX3;RuQ*(0aj`04*W4;#2a{NCZ`Q0!+@K4faqI95^j(;U(O1u}kpTne zNZ=;GQTW^IDizAI9D~Wr3MdR^1n>OdLCc#+^6_Ai?9NTEXi0(>hW^eziv0kef~bH5 zOT&=J-|M2Og2@`xj&)rdKkHoN)n(x;_}y%voe6~C@D&SKBIIU}nmv$a)c(|A?ipY= zF0`gLS7WPK#vZQ+2wBG#jPr@oSB8&@?JA9N@bAG7^niCu@dr;XkLP=9iG>guo)z5`56EFs3j z(FjUnWSD;!;{S5S_j88mw@%R!$6QgIzb^Y*Y2a2*c;I_}lQ>_MSYv+ys$%~uF+nkJ|Avp{_pJ}{k;_I zPL9)zn2lrLQ3Kt_quq1JF6}Jt0Nk>MQ#t!?+HSbhJnoH$)3_y)@*dB@EB<=g z3-^F_E^WWsz|F8lqU)r;NwZdA4n1Qa5+@ltTNM|B)o}jD+HLGy^!k3~~q&P`a zzH@i52^`nLMX-b<(m%!C_jFuS4qT=W`Q}SS>Ny^?v43R32|O!$OoUIt?=|1ihU=F- z`!dw6C4`JYKgSS)`E~T@=C9)g(`i~wvw-WFpbR`XJy22m!m4bk`HM+OFW6*;BZ7#E z9@7a?IUI1H*E!OgdsiOJJqaFI1D2?Y(0(XjYiwFK$nDAqM)o0V(Xx;X2{wTkGI0&g zef2->eOS6^(ZU?lhGhm}%b=EK@nwx%tP=SgjbP#)3?I6W%KB`$<9;nPR#9|zQvMr) z%4O=H*#`pBJHx5X7JUOUKMED7fE<$mNk9=kR1$80BpSm$v(d&6(m8{e4p&!K2OeRz7Iu;MAWVD;A|DecC+((02D)~O9g{nB zSB;;-|1f8?e7Mnx&X)=em(a-t?wu6$#N0d@l`%|tOalxVoPV9_M(aGD*O^O6vA!)K z>*72#QD+3p5T_-|Qyj(CkmJQoQAO7e<(^rJ(Ta^X0gleQLjA5zobS4V3HvFXI6DlN zet(F$@ism*k8%Hq7(E2T2#dt%ylG3yh^!NhEob;mgWrN?7@1WYDFxqPmQMWejCCB{ z;>l2+^QFZ@-bQcpyZZlaJ?jPTD=V{|f~c}8mg|R!!w&|y3gd`}+W5)-!|3rh z70$@X_LWbF=gS<NTX51@sk?bkJC%23=zk(eP1=dPt2g zF)dBjk*DvU&RsZ)%+`g3nX{mr5G{+Zj#z6*1KQPT{9WKrNS_O!! zZcF8r)1ZtAu1vt}NIR(yxuZ+ViYAlY_%ya@oiz=TGW-hT2pZJOYbi9WE-?6tqhfDU zndoE3?O4hL6@-Q1iqI6h{z^1_xO0(1WQ)Vh~8A$LEMoe$`=f^RGs|b6)_P`JI9>sWev!< z$U8BI9#Zlyhn_ZCc-6ye1{cfMlwCZY3Ci|F6sv6IKkf2(kcMg=6>LoXq#C2!`kVMJ zTTcMh(5vt#R(zIvFx5Q~+~7}{OKT8jG!L-Oyn-ITe&cfmt>6d^b2NTC?R8mhMl@mz z!Y2Rue;%>mqBD|a!&IkPK5^tAD_&Vq0X8A5QLXCC(>#sgP~AfymaPV8Z@5vGJv#p1 z21%9TE}K*z@~Qwg)*N3T^Q2^)I3ZQu#-5VL6XH7{(O zpc)$~eEf-or@MWd%@pnix4`wi3|HSTJEP<7Y*tGPr>JSD&vqsqRqvUjTO@z2A^7Hp zL4PFz7uE!^Notn8+uM8urB>0(mQV>s2gchOPEp4#JZpFV26|DF#NGrB4i+pBD{ate zi@4FD`d<9opQ%keQ)nrsV%1W14+mAhH@(ke)_Dt?5N3hczp%250sR>jDGV+`+>{Gu zLr(@ha35=HEJ;osUQ>eh0M&py>ll7)(_sDj&Dp$4RPFm5T;;#_rf4e2rnW8h27Sqo zWf!3S-t(96@F(YYkjV%5gV41b&zGD2s?hZN!t^dITX`+Z&`vBtS+s0@;hbbe27k8G%1&>g5tw+^XbAbVF}4kwyBSMJDe zQ6Vzc>b=A!UFm_e(CR(XY=tZ06-qyeOOy8#iNX1np9+@8$1;sHBEP>7Dj8QgaBXQB zZ|%g6>#8)6YGJs1t(O3#MneQCMZ?MD6|KS*%OJOO@CGyY*63rbBR!VnDu z&`ArYOl&f3Y-@hKfH3Ow>r>zVcU}^mvVyXJtz0lCc>!RkOu$ruJ=@UmH`%hS9}<9Y zJ!ut{MSG~`6VJBu4n8QzkqxHS{ANtLkpbWX(aP2lY8Hl zF#JNsM=L{9a@#A-6o4w0bJ-;PDB|SSh_d*zX0QH%+iam`NuD^q-9IDC;*oiIi7)hw zh=}4yyIBJ5z>so!MAiC*Ex;k59_yqc3A^k4VN}*4VW+#g3%VoWU)NE z+ne_%vBHtU5Q-Y9V*eHoNoKFTiWFT-S(Y3=UsV9)GEzmEuuo+Qd4c=3x1BobmT;Uu zx^r0gwd4Q|Wi?Vf&aK4A8knDzh$IZ|4M z9AELm;~_pSQ6;|mW(Whfo6u+#cR6!t8Gd?mQY}WDOggUs$$ZoNB699 zz}y&dreJLn)qs(`fq~lg9YtzgGWz)3_`DP5b_qq(d_K3`A@a)B^H-Nn3rUjm2YJqS zvZ#TTSn9?N>jQ7s?Tw*^zUyu=Z{>5AyO=-J$KE7&MJzvBD>%zJb4@>dm^qxBrpwBt z6G{C3lS$lflT;&-Z^7q}Fsz1M=k=+Iu|qPll?pQFYzNXjaOKB`8H^p#nT_Q2DW{L* zb)H!0{zvct+oh%DA3%eB!|PM~6LZuRJe{Oe+ymemkVrG0*C2rPLhMtg5!lc)n6 zc62=Y={|$3!92b-$Hk75V`q%yVT_n>6eI7P~gWr{5%hNkS> zH(0#-ilt80ia8>B^`Zx1a|HKgZWq>U`+Rp|SZ-&5kY=3mNScIj^xkexb|)2a?4L1t z4qWY5)N(D-BAEY^SF|hCK#Ud)L|8ejc97fGRCLJ3F{y zz(a^Fe=kx-+>dRQ;pka!&I^xs5)2hJr9JY%85)}s`=24dh@5baxw=9uv!ITD+ zBWAQbQ_0iaqE?=kR$BMUam${@V9G=&aVf$W=<^uF!28^3n<%OfHjo?yl#pY2DDy6{ zC`6r8dZ>LEP+W|7a6uOcT{3jsMg9eAhCQaM*m`4bi1W_+B&=9BVrmw{5pyD? zUl=WKIORNChn}Y2uJ$(JiDz10Z2d65(vw3P&F%P@CJK*_;5MkY7i3-JEk}D>LovGL z6a#C=)1j{+Y5RJD?b~7tpL#oAlXYTAt3oe}V`a~)6Ln)Z>TCf)Yk&b_#6qyZs^`)y z2R*hp14!;WQ?=CQbd`Vq>YgHY_a_u+C(`%+#gcW(K900`a_2+i`%lxprb&l>R_@S> zmpeoPO9gc63xHKR2S_?P@EdK)x5}GdwXm{mn=Q1&;D4C+MT%|kFO<~XuNE2-6pAJf z%=`Y4bth;ac63TC@MFyQT4i$!lW^@;{rH;e9)%ghAX4nCN4MsQ%yySiTb12cg&o zar1qOQbA-!=UYaFyzmT@3A85uH9dHQ>4Vi$20LkNPNw}L+2~fg#ojQx?mR9x2V2(@ z847g25hEWtdTrTWZIcNFbjfXe^|8J@?(ty*b^6)T^t76Kul92k>)N1cfB$hIR067B zMH_*q-3qCZT4IzAMW)VJOMB_}s_WB8Rl{}DSynKGWAyUfIbV3WJPbrq6InfKj+ktPf zeK?=m%ZoVvLA*Q^jGOu$_7^B8LE2p72Uku2@0XCAoUK%>QQbZ18bR+5zzU!j6O?5% z32mEx@#$16Zhhbd-$}U)3K|k&nzek?r7ZfpJ3`)~O&#nFm}6Ck{+QC;-(!(^AAdtW zdYD>nksu>@xLay-a?&ptLr=!P$6yZo3g7nwYGxJ{hj9jVv`|>%@BInzK_q~GrkbL( zWAF+$HF&IqhvVkqZ~P$E#2ndchBIox_=4BUc-%*9UjOL4FkiKIU0+AEARQoESam_3 zLk_LeV+QX=`#zi38FNM}*GP+4i&LWQk?3w;bar@)?%6guR6$BTd!FO(A1_!VJf~m! zHUx^PfA(;o;gtNw2=ga*cOTA33yYh6Uk}qSCP`HnLb>!dvkS!g5@U6$BESd8`3raj zn_?XmjNo-6u~-?$Ur9h48=_cFXgK2yZ|nOYa)c1-ty9hanT+Aj4*VF94Nsa~hMPb6 zEuq1r9Ovh?1Dl0o(Y10q=6;c0m4+KO;f=grs>Oy$+47oe^M~Bh4%aY}1cTzSzoQ8a zSsxYfvhASprM08PvU-UgCplt)?&6r3)h@oQMRHOupMxJ<5-o^o)}N zvX~5InHwP8K#apKk2O#c8R(V^mTvH}vama=ZE11qX4wF277)0NRn}ZfG)!9q_2ZxB z=H`UQz4nwzOdz?0KO;j1cOqkoN-PHIzsA~BG?L~p6I|aW*@P6*MU+(w^xvS*jOKlW z!jWt=w5BMRAX%_J^Q}bue%o^6G12UG)HPr=(WJrGs3>c|tNA6Ka>96-UJ6n|{~1GP7)M z0@L^RxXOW1pt-DDL=#2PNfB7{e!{cBhD>`_C8z9xyZo!~;WT~YvX=RY8_Bz1@yy9< zTF|1B-MY=h;TSe+Q=;@14N>-0`24YEdY7#?fhvz9sFFKtn}6NzZMucbrE=vSjPQJC zp1Ik4PoBp4GmfyQ5Al)Q=96})+U5^(62Y1Kr8EO#E~)t3obRGEZK}5^w#Tg3K3JcPx;0HvI|O9ek@fFnz;-W za3{~58paD)PBvgo(NYIDsR<)#+oakq34|SA$1k;As8I^arRTA`Mipj9jI&trM!sx3YRcXMt$2W&1`B^Nh3i;$^t0D$P7m^C*l}ZBMRs^d=V@ELQU68EDML) z!_m2q^PwVRgWc^8x1Sp5@IKGGh2g+?4#akevkl|;5%p45%x5SLyUe% z2GQf?#xos)U;-!SsXwMM1a9?dkO9P@98b`wqCsVO?2k?sxO2+q(}jI-FUh77Y)7i$ zPtIXVE{*H0Rs5kgxtcir;l}B*-V@y($E`huVy8m>x6n*` z(jIimGOSTGZs|w|hg_s#*D8M4ldmW=Zoh)4uuxH@Oo(%3$DBkX`!f3o(AA(7+oyIM zPQtA2a0v&`oUYGcIC>P9z7g~pm3)ic6QBxx@7K%aLyj~eYR;$Z{U!GcP6!ohlVs#Z zNDPH3>Wy;c6EoG4aMd+>)itrPVI;p{tXTz0ufIAG{ujMX=WyF_CMipCJnZl{rDbIw z`{*I|4e0Z`t-aUMc5%7SL-h`Y+lU)(eBu(x`Ss!?sqU;g%=X_+q@dEeZ9$f{6||XxS|obwU6iB%9zlb9 zC>~=!3v@zQogUK^LPG30mV5h=5dH2FyxOBjyT#W7`!ndyY8>s?If_DwSEn-%jUPXOm)4h4MnB8@mIfRAt`SBA*xNH)bo?-<`bKA8!`41@Kf~shE}L zy92Dq`-d5;>*x@}&I~0)Q4f(es_p`nka~6=bG>HezpTTNG_8HwYf@D`_2BXLcqINp z33eq5^T=h;S9<41YpQDG^#fb9B7ru+H>0;GNOc$wM^4BADgGmwQxbX{)9QuK)7NSN^4S)gH`li@PmK3AYwlFoJnAw0c!?1>y0oAveUGg-wIPFpytykdJyo8}1?qz< zx_cz!3{p59!+|zpb$7m%TA#AzCzZAX@Ydj(;(Sy)1L1=Lyu(6z>4bRp1_y-evO`yE zY-dj#>hGk56R#?R!chhj5d%tc7czm87I>hkm9-8-B`y$C~IS!>&e^1(t-dcZw0FER$LGCj8)GKS2zHRraWt`>Xa0;`K7=BkcKe94u zfK0h65I}PkP!kS6hx`4C{=4w*`RsBoW(W7V!d33Uzft8Pw_YmV>w$dit4n9Ua|1_} z#4l*QVZ<`@3F26|I~?>_3tPb{9-$``SK?q z4BV+H#p#)uo5BL!QCW0IYYrd$BL}s%$)6phzuqSMR8yFbTGJ$qD&>#XQrhMEl}Tnq z!wisWuQT-Yc{8tuoK`w+HCJ*bq&e}{jm$FnDQwV8=;2edI-*VT%xQbhrzX#r1kB^T z#<53?JsTi7fi*m9>oCMO^Yqi*Af5v@l=3pMnoE3^J9hfY@^|!H#Ju?&k5io_(RRM0 zQD7VjHWB3V}}ZK}?Puwbn9J&uAfJYO_h_DAlR zxNJfKTX0Ym&JYPU&=#jPdT3gtm$g>V8P$;WjbV4-*L$$D=1Hwfg~um_P@E2T$HH7D z(ToUv-?o1y+PjxqYkhgd<0(3d9Lbb7-lfm(-Df&KRVsQE+BJjI6ET?_`pBV*FfX)g z5>_Dhxk&os13@pQ(Uy0|5w|eUyUL+dYW*YV^J@^*{S1Sv{Ed@Z-v`NIwsRf7OKF@5 zXpZ>*=^wxq{@8cMT#jAmSRyGUbp{~W<0iEQO2z37wp#>;PIt_!Lcr+>PZ9f{fMWjq zld_15G`E2T67&RR;>T*w>k+5_;j?F2KU7Ww!m4r7vBbq(Mj>fJPLMGHSsITp*Ttu^ zKlG9tuQ(E4>7CNvnys2Ukq<##sKhc2AjMKq75UPlqw899H;>1pqBP-s#<{_15cyZR zvUlPz@3L%}S6#2u%)^C|t3xyYDsS-@N_b?wQ~cUFPhGuurFEp+ojcft-!NBt9LiTi zp3PtO)_W09190I@hg!a2<2}tbMq1o82ehc&+RbGt0m$ z66;?fj!l~zR_SNqm9oyrKB)GHp__1bLc9Sx7i;>8iTinQ4a4}R&_wDq0zksJd zaw<+4+D(cwr%<*Q4d+q2Uh|VJk&A2dGoTP~p2#+Qs-O^1zp%+X+R{&d|6}Zxgg!3tdfw+Op;y&NMP6Ii@omPI&b$ZK z4A+P;Xnrwe;$tcSw|s=>;R|5mgtXs=fawhDapkPX)}C?cIAQ*}Mmc7Y;!m06I2+ZTTh7V%^F%jXZx)^l!sKp%Ry|#+OeeGa(>O<3jO` z?MF?x$7^EnVwgJpUQq26@8j61B_~ROI{!~m;Wd5$#-)wzu_DT{Frx4m)US1LWXln) zTHHUQ8fYqa=H+?PMSjdhFdojZ3?rmcnpAV<;$h2>MBrMry;55ZdChXNHjWs44aCZb z{Lw6%|R~^#hY>yOq_Gq|L+Ci1WGERQ>ZFab_TNSoa_mRN}jBMXa}W^F9`QlLCr6fyLDcyX`au{AO&+%{<@TEr4l9HFO3Gm?5yA{-Sd+|V-e|`Gw zQ%OzuM`q-Vjh|Sr<(ek>1Y&lK1T`FZDDcfK<|QV2tRxSSk`dZzDh-SV`YF8Dw^@6L za~20kl)J%!*d2&r@MhG?_V_)3lL!Y(aL$4Us%4_?6W-jusD3e_tR3xo^)T3dlIpoE z?!H0Y5#t=sY-f{jZU(`N%9Y>sG*0EM%ghSS4pZLMN=MY-aPB;P_r(3_Juo8_fj@wv zsiO#$C!&y^O+daj`;)tBnQE>V-E4Xxb?9g0_)3F!HME#sTmy#~;7Vq5MB1!H-hE0b z82>XJVPAh|?j1~Muz6^JBBiloX|cvUTzr0Ir>-!uMNjxpAJfO#N-4N^dS5PLqmI>$ zP~MQ)ChlbezZK9Gj8rH{#;;iPK`J8~PSTz%@C5Zj!6gK()d0K^R2;#*6QG6U^)<{` z0OxWTW9!72^?d5w<11k?r)`)`HQNqAxJ!Xg8NLIaI3uX?CO06vn>D5f7 z@cKZ>BZ`#O{9k+DjqeMbRSBB1$EW!F|7}y_XFJNG$HS-Vj?&s}m2J}?lI{@rlP9C; zJ3!c7FU(I{2WC2$_~5RBYoH54ojvw7g}$;8I^tC<+Elv@UWHP?AOdg(p&=3>)PVo% zFN;US3^izMAucCM>F5{CAqeB0h==JvG>lw7^~gw`Ez)g?HgMxMpIOAx%NksC_>K{# zU!AJJ&S>>GU{cP%-z+AKE{BrsS#pqtwo}g?=lHW3M5uHAC%)i2VRw%dylzQ^NGjE^ z{~00c`L6ZNStG-7;)X0wj$v4uH$jR#TlSbpc8$ORysUwDZ)SkCFmgqS+v%I9+K^ja zN8Jtc$S8-nxrRsDym3Bd+)1FAMsq~YIAPvXe8JE{V(}xwWTZv0c?rtlOx+1jZPM#v zQ#5uzU>)iV7{NSo-;-wwwL*H+GQQQw7~CB0?UYSohnA@bjn6#RPinpK$$BhvTnqVG z!iPEd|H&s&$W5~)0W|jwB>_VdpXwUk7``uwUdv1cs3kzGq}6Eholg3m-`z*(DGACB zhoIGkDvSbXF_0NFpsI-`Op>`pu%qmi4O$O~?1KOGG8^O{ujCXOzdk8IRvgSIxm`o{ z{5w8AZoiU<9sY_2WY8d!ZpK6j!`u|F6SKU-i+1(1{OjA8ym0ZR}Fg5x$J!w9_<8 zN)FGbThjp2*s84?Jw=$w3`LU!S}F+5U!WcAfM=k!F=qniipZF#DEj_{s4>24Xun>1 zK8rhEs-(7<6;IB~577@w>T`&~#z}kK=~M1b>rlozSi+iR<5yFh5sDs6^Ezlh@+$z6 zK}bD0%X#&640VMMQpRq13Ua@OV^iF+-*9a0MS}QSbmdX9ECzOIw3)#fblA2ISAm`2 z@mrhd6MD5jzGtu2ALP_8IE|)rSF`-_`Sd)LJSO{@N>+Z%MBw5Q$>rw1#|gB?VZtdz zl~h2?+oJ86bV+ba%h_FnASl+VGPyy^Q zns6tueri<__5OVmn%grCr3X!g|3(afn(gVf8&myXO$>}J zvIDO_{0xT`4RIGRqDZ~PDbg_AJH~9sAkdC0_aG`&wtfa>kF4fjM>HED zmn;O-ehl>1?!moY@{;MdABP&{|AZN*gr9bg5uOO{2ve37*i4!+Dh@=zQSU#q=c%P} z@~fU|LQ4tU4Si?W0wB=5m_ABB26U>Sw^-25miWon{SUZkK4BWcI@cuaAhJglW}KBH zf~HKT8c>66Mj2mVqb}@2$oPW*4*EvxWMD`*2wB5?D(>sK9z%>kZ2854RuQ+yq8*+e zahIvz4UBZ?7&;d;nT4(iw5m!Ca-sEd9$-EUH8t=DWHsaY&L4j?c14-c6tGv$Z1<-b z9}nrVyclfq#7+H6Xi#Au7DLKD?`t(KQgF4Vc7}2Zg<} z$it9jI3`~E>Xl{AShSPUoQpHVM&jhpB$1zaknEIN8m^4MQ-ty<$| z=Cci#4epJxLh-aAN4JMumcAPQzK#cNrTu|BPs_9Ab#tt@Hg~Vmk-NUhP*yb9ag)Ak zTrjjLk`h=<_<26NlgM+&hI)aF!upesoK4MzJa$BpH`E@#r}@6}ulZc4xwA)jQ-{D# zz>Njgxo@{_YY&d7J{4&gHdzE$Ff~JqV~LhibV+p!_0PIj&X!@rU9O~47`=ZIa{P-V zwFk}w%Za&AG!-j&;JSh*W}L%N>e{9?U+f?DT@kr|^uEZ2aeU-Ynh(?cv7Nz!UWDVxGh4-Lyc3u-gBd0D4HL>vUxQkdWTT)xE zFSKxSL*M(MkN#zQ9ai@XFpd56uf>30Gy%rSC)ge8vm&& z(gTFApX)om9w!gB)7#eL_MiwP@M@~6t^-2*Ml(RDgJ}n3p!@t#@zyUA(|>%dU_rZB zOppD6fR(ORENfe5y%1Fh0t`h$W!|B`n){TJF*sC+uR&+3(R*0*&Y+hQM`5q9N<-mH z4|AnkibIX{P+6Gl!PN3qxp@b%n+d<4xdzq7iFkYve)lC(GOQ(f@w-fp0)Fj(*E0D5Sk=?_U`nS(*QNV@g)RKlQ16xXH(QzK z<5xQWpxedBq;vWej(kYO0nv67Hm%o&9pUz^I`vP1;zDuwT88Dh%JAqUayZ2wL4?avC6AOFBf)Jm6 zW=+V@eeT~V*b6n~V44l$gD0y?i?Le=ioam~jSZ-AX#()|I$Pe%0RReu;cH1N(xyX@ z2_j(Bf>QC)sf!u%sWQmZp1hIn|9>l}wxtZpC4&!p{9Df7AtR>bOKMqLi~w)~GNk}w zkV6Kxfr!}A#84D}A{6@6sI@(s9v-c|dg384=~QQZCI6v<9R?r~Ox92!TNDpd)2Ss4 zE&oj`X8X5=t)MDSQaEkSV}o0jym-XQ9+lOhz@y6v@nEmvjKe~=9>@LC&g2sXh=5p!W{gY>X#`qq-^OHJR4c{|$Q~wat(mUIVKt7mSHkaT1o&sJF6mqJ0dbHmrBU@Oe zTr+DTrwr|trHS?_N~(VrH&NK2A}ib2fXXjIEAyrjUx*l^m>q@PoL|B=$&aVhDN)+z z$Ocb(<$F`KsGQLSR}P>1`~_lYiO=M zO>|-j;mE>*^B1Y-6R7Z+{Th-_8L|=%uZ12~X?dibJHs*F{p`5?54+_CGCyN(PK7FV z08oH1fB5&-Lo5P_!${S4zAD&$7Vkqd1-)e z8RSUB!XC9~q#!WWvL6P94+!WQf>8qy5W4-#Q+DB>f}EhjAsrJ&09@lJ@?}bA82(}G z!+>r#{)g#jP*MP0m`}ny9^e`Un-&zj$&<8y6@wH+v};4F9b$Yq3U#5%8JRh;_FWUh z#;Y0AK6VJXcg2D%bfV#nr97Y)Zn>*RdXEg2V>z@SWLF;@Eof8w6fz~SUA~(jCp0|& zgIOSj*FlPy!jLOg+C9HozV5z2A;EjL+- zYfgP8-|0?8(OR62cNV6cjlJH2k2z;s{HAr|qE_$6%J&Aw?vNi>a*=Q50fc3jM&m#C zY`X{7NQ`NL;!32W@?TdXbBY7liv_MD9dokYdQLh?bcWvFd6Yo=Q2S?D{)|o-K7s6U z`WEo2A!bhdIdyv%7>4uf#^Y=F+pr6R)%I6NuRW#z-y+TE;oM3O)Rw0aI;T~G+#aM+ z;PFuJnGBW%3@9nP8xFil12d&=9>9PSpuGvp9lD8g_6wlmujQO{oXZLch)J1B4}pI!+yN_7g~jq0#i zI2^x55byagC2;Ae@H+O5!xzbBycb@8UCnZm{?N%ZC-`=pezb`9?iM@ z61M8$AL~){Mhc0PJW%|>&@50>wxDlc+M73_$oMxr3>ldMfU6)(D@x#;RN)OmIPJ>1lL4B<4W+A9e?&yZo>E_=SXr#Ww9L#7QN?<`8Wr`jT!-b@I` z!0QHt%gDwSun2NFr#Rj7OCJ27ERoF2f*0>e?g}2)QJ^Tx*udc^^5Z>l+U&2g&&bC^ z#ClHN5c{y97DaQ`w{Ual5m1KViKrpm&*Laeg&r(EJKxLONW7eB&wE?2hokDV@EqLr|IcfjeyCmru_*1bqp|Go=pk@f$rstSE*H!uCDq0O6M}^g?q7EIXB_QQ9|~yv z7A{2zm^%?k(qaK$TL-3w;6d?2@5k2QL8#q#`BW5JUGdmH(iks(OX%ss z%hLd+{n_n(gp8Q)$rFx}~4)5#HUrF=#r^c7i^6`nf_xffPZO{Vk&;;mez_#0{ZZ%9QU` zJY89pTR&H_td`eAjQK)SC%VFF(c6ci z%!{De0C^q=9n{K#l>>_VE<@sByt#l__`!QS$b0^f#ApeMih{|RvPy*zp~2^vF(#_( zcH#-WCQmZmC9*zQ9uS9H@arIT$>#eh< zjsr3wd7&v4JNLL8`@pPv$uUs#jnxx?~%`Pa z8}!oXxxIFb?OQF_rEAR*%YIUJhF-cyU+(TzfPi_ZO=DN>790+3{xJ$rk6;OPLCn(V zU)rZ4>F1ZZhw2{^QPfh%PjQLOCufrM+us-xzeF)JsVO!r)fazN?Lseu-}N88`qYY+ z69A+7X7c0chsk}FCZFTjPu#l#A3pK_(!}}g`|yeT-BgsSh6c1!WQlGhT8O^Q0IAA9 zdWJm41`Vl1Dp+I{SX>8;Xcj;yR|2lbv$ye9D8m?`j@(3nuL zY|!c3p&919Q~)zDAJ*~y_>Yu|TUz8O-3-F(u#R9=QqqTY`#%59S)RMyU#X_$t8wJF zHUpQ($qFH2cId9V&^p@8yk4uj$o~2wdj{g3J9-I+AA1p^wjH401dVE(=DqXgbr03K zWIW_bj*ayj{<`mAJpH~HbwGRk^a-s5fh~o>!Kle{`uz{e$Gcc%8{byj#mj^q3bw%Cog93+|gehxN0h4s-ReRx z?(2{q{kQk7Gb9aFNpdvV62FV%A~xAtihukIXLmp0ynH|C^jlsZqdJ;snixm85nb?z zv?;Z)tP@!!q--BUWDzBuVA3ty7@Y&Qm#L#2oR&2-8B6LY(qWSZ|alQ;|y=Nu&>sk>c!3CYzS(z)%{Ku z{b&((*4^#g+(H8@)M*n(cJK%YY;KMZ@`fZcPqLSdzAH7scCn8 zE~Gt{FV<9gqjRarK7{u^n|IywIsL^DqHiN1BPU9djl`^`Bp`4$q%bLHer~^{y6Ysb z;FQgnM(ajIpVwb7=N8Y>siwtZ2{JW8k-&))c&}g_rP9d9nrp5#??ox?B(_8+dkDj1 ztQ>`NREJxvDrRobNn;(-JlW?d?tUw{IL8T9|2PM2DqP{5zV>`^*nTT)esO&$Bw^}a;%@BZB|jUs=q)^iTDiiH1RVgfy^g-wnW7obz0* zAr~Nf`X;wUly8F+efkmOTuGnR4M+0~PyexPJD=wZdrrMiJRac}`#>}FbOL_#@(*vI zm`zixhVnlwQOz~ot~P%A`brrmkKah&o{3Lpl7jz@$r~)0O0+s@mZpEdJC+}@l)+Uw z%Em+dHZf6>kjCUBAsyd(liJ1S^)!?}3mu*Z-r?s_A{^BtzD~1nW!5C>qq~nD9NPmJ zB8Aci1$U>7T6LddLNsUIDB~pC8UM+j8|SkmRr9WZaU;r@t-Th9Qe@WDvYGr9{2Cqs zNl)OT5%XDQuyy#VxEVW<8bS0|>C=$rhC3n;YjI}YyrgtpOvA}yvB|h|<|df51=xi* zrD{7rTPZKmko=2^PM6ECP8=K^RlZT05h;L9KNMUvIgR_hm5u3t?FEUX`$5#9jhAU1HC*zkc&b zq?U8+;r-W0je91C8@+_F*xg+cvNxoixdHi=X^W&ar4DKSodVyG-mUS#9p91ObcI}_ z@(F8jrG1vgRj({nB4jzn!jaL+wD2q6@twl9a7e!2G%xBVTphOfP_*YjbT98;i7jmT z?{-|`P~F{cZ7aT_TcQAem8l!r=e@rw5vj~)3MR6zR5tgkLK=*e~V=%)~ z))c^u)rgGnUicR>g0nKAU*$M3aIawG5F$|ib-z?e)9lLS`lXzL$zxfYyVuKHW~?=Z zv7Yr?{V>aR%Kt)Fw@@33D1>E%>{GAqH1RQZfwsV_dZ7WzI*!j@BK~eWo?Va}9$L8I zMGr+3DCggr5G({o<;CQ^$8U5etF$HEL-?#_gb3u5aUO2x6kDVnyy$-4J2#LpYbr}; zniiK=dw#q6$&1?3F+>0pzhYb%Q(EhB4yx#Jdcr}wNc^2wk8WoeF6-^e%gswFq?)iL z%6mUH0bBIRl(T!cI+Ei>xbh7Pqkb#>+%3-a_+WyMv^J7v?;&>twnoq8wcY|U&eazM zy($Wwg+ZI6RRL4Ola_^%C*PmVx|fAzNegd!d&%m8#ky*emFN)(?9tm&)(z_mrI)j~ z+Q2W`|ObB8oM?X5gA6CJ@-x&IiDRVTF6vtQeLcXz^iWI z8?M4wS?tE^2wd|$IzPLz>|aJ-e8Z@S1>yuxR)rmuZa&m$A+eI8o*E|8SV_`$o2MQukEzEEAeyd19Sn>4!_GjUS7Ck-2E*CJaVEcFmXc z?CpfUEaOz>-V8EWd7*f&DmJ}Y{K@02yVpsCeAdv6Y(#|kx{gSDG!bycdR_Z5GT%p; z8{{%OQ3d`Pw0u$0|vL6SO5jq~j(I#OLtZo1(pc+}L3`q)A*Wdc05&~@3v zCdx8OM6ze@R5sEweoI<(>4>RNncYRMD3ueIJn=ERO>3*{pXb&x)X>4H zWpuek)Tz0g+%hx^uCQPJCK|BaUB*1#Oq5isf1KAw@Yo948Y6Q*`Ty!9@I`Cu0^;Wz z7wMX7``*6{+t#4x{}#CQPA^~!G;an8mt-_iFc1yG4~bckw@M`IIs8;vAd@9Ydqc&h z8i7l~DIZmBz}um$?6AFWm!;c(`E)v^p5t}3giCSXr_NIlW*fq&H+Ptfob2EzU1j@H zUN>#meaz1Y-ZMX=eC!&>KLx(U2@rN+IGvt!E{a?+vznlOyvtM@mfi4x{ALI}8tVHko zbuVE1^S;POxX&-wLI+!b2Q|kbhv3an%s2KDK3CL)m&7r zrhmNQ$7Z%EGTARERBut!6WU2|4^N;~eA+1LdJY&H;B~g<{jDl2rb<(Mc){ND!ZEZc z0^YhFt}kW^cYv#V<*wi1#_3UxTE+eDI&I|1+e0>|i^;n4nyFo^H6Fq2ASDRKwg96p zCwvS%pVb^^m^bS`eQ-2r_O|enARyNadAUPrEGig55#%xNvaXMiPmt}VHzUHvOSy~5 zTp)BO%|SJ^|2-wd_F7$lxLPn45JD`!^-cavJVjR*c6upV(UnkP>wpL~G-W_}?dgVh`1 zR|YF8GdLq`EXZ0HULK|&24*KTLp4dN6vxG?H4gCb9Sfs2wpP_x3by;{PZ$QtY%79( zp!?aph@JhH5+EgyR?;DFiO~mAr-)O=qH+$}7-NjVG!V|~iRX42twQAuTeLI&32vNn z{8(FJ4Z*d@D8K2nW=}`+LSpQ)TDci->dU1q`y!HE8-=3*;XIeC3DGO zmScvb5u3YyHx;i46_^wJk++*M+;;TbHrraB7!;S?mA@85YJi`r7Ke&&_zGQIRrg!a z8{>#<%QCpQx55x(1xA-hGiqTRkCXWp|5Br4;u)kW@R>9p|tFLRMsX8+jZG<58R%dz3Tt zGD?wKk{QU;jd~P&-YLzY_Fq`FxQjtbmxUXA8Nz$cy+!ULqj7KXt@Yqwp$jzwoFQT9 z8ricC2rv?nNEk~yy)?;#^!Sx z4b2I{W+onx4i8x?+2ie(N`WKvH?4 zIEQ$50T3DulZEw8L-$?)D?WdGOEJJeNz^qSrl#fR3Tp{l%;q1N{JL`s=WPRV>c>HE8~7KUxN*X#5oC+Qw> zWTSS4L-*alooc5yz4>9$U&j?+#*|DY+7L!Heaqr67-t>xi{Y*@#>6zL`^uH6WNKtT z<%QcrjB^Wn{7qo$mxNl(fS1eF?G$_46Qkz=zr<%WHp!eJ$|V{xnrcVqWx_g%)7(_2 zLE%PMoe0Nt8M6&;6v?bi=TAycTHkebQ#Eeb)O1a6`q>&lO7wUd+Sa^Rx7W!ynI5Wt zv?ivvDO$XV?2%9#Nx|YnpU~zOqEXR(HPuz&h;9Sa`)cuY7fu5HbUpV2AeHJx>lC?Y zpC1|TpO`>$=WB?qm>)H%`btsUkzL>Z{&1wr|BwcM$<3S=93E^FZxb<%S=g^S3`=2- zd6^T&qM9A1s|i&ID%gk4-R#fr4ioi@I(}doYa-J8D_J=&)To&=K=(&R?vq9(DT?i{ zLlq|4cZ=}*ynWX%mFnpzqA%qAl=M;2+~90r16Bf163ivG8#pq7V!oRf1R7 z6{i2g+IF$>l?uj;gRB%J=WnV0C~}z2SpPD<_V?ZYA}G>hP*}y#m}N3X&|+lbkI)C+ zQ(vZbm_XIN6w?*#9MQh}hR-Oj;qsLW@_SmyIKOtR!Hezg_>{fjVY^Xrtm}U5OMtV9 z!ZV>mFK4~|83_k0Ml60Ra~e%c6iig9tnS3+U%|OlqB-l&8o4i-PkStDH?&SJQssCy z&S=%}>^}Ks_k_jv`DWf{8raWlg|ASdBs-EJvRBYT74)W1)$qQiearEcvT*ed{JS=P zXG?3?Gb7c0*Y86|_5Fd()`wj*vJ?_E!Y{L!`1E89Nu zoZGfUpE;OOKudI!SC_Uev#c$5&RJim=XNP_w@bJ471nC=;W>UCz)iYw*yo~v9%}>+ zu$VQNeEbF!WL)JnaL4Fs!|&o>{!2qsQ&V%{U3g>qJ1x7y)>vYvR#7af?om-}e$a~o zq*ma`H%2V2ij%BI|H_abXXnv3PlL zuj4Ey#evP-#8jyk_L0wqk|3E#nSS9DMAGlaI>Uiw^d1ku`B`5X#9_4^1TqjQ~-p=@ZvYl}T5KFIC0UE3>hWXK%f#v<9vDE>1YP$0p z$>yDL1Nmy@uo7BmaL2+vE-#9_6E`mZ{UO!u-XDp1ks7`zl2Ml$zaF>qFXq63&S|HZ z;Uq#&sS&ZrjEW&FU-r~*ecr<}qyD=g;+v?rXWUT-Om1a6Vv1mkE8J%>*=DE7XLj9B zqI>?fNE4r%^m%SuX!X+eF3hKe=AGm_iFk6JnCT6x- z&=53D?OP27tGP9c(i*?42ueW9uEnTMI?oEWHF*Jx`gajOww9M)pSQ;mKojuun71Cp z8ffU63^Ex6#;??VY_9~ciz4ysJ_z||s&H7`TA@2(1=~V-n4n$RPW8J35NYdhu92n| z%?Fj@z0}aZQU?qShx-{LY~5qEEaiXb!hI)yc(<{R0?YVnUlykP2Vhys(dVNnGrPvPR z-1CGrCeeF(9YXD38rIqlb}L_B4J~wQjFag4jWb&B%$_?1^d}V+pOcza_M!UL)?onG z@qT+ec$_N}0Z&e%ZamWyzF0sq|4i#m1MY)?yly-HTUBnZrT`p|H?JgO!EefeXLq4S zA3z>n5dNKidjN>eafgMYpxmiyZtu{lOO!VCi6qxde8!M1ZJTZ}LjprX)m|x`u)Vj? z35-w_$b@bf~=@Q?9EQ(>66IDLBouyAbbJ#R=rjUhk2 zDTeQ0P9DrrY<1B=D@P=?L>2~`R4jmZ*&%OV261W{!Z4*=!gVnL#v&lbrLSJp>a%OM zoonp;5y~+bp-)s`p$JK#oOn3O>j-7DM0BNuSA?8x2)W5+D_t+%rC`_5JTj0_0Ow z_NLk6#$v^JAQ^AF_@&m$#O;9%B^s*(heiFn&@)?5LU-b;9;}X0AD*8#Vh*9fhXW`I zYIa%49XRR+%cJ10baef`PQS_R`;*Po%F%soRyd=^cCL*HP8*^Vi!LFNQHP?r!xlj<3m;KP;;_KvOXI~QSz@gsK zo1QL%NU0W;&4;F|MVYf--$&ss1%L&xvD3&DA)`ErzD!aF`CE41jf!p|e+q>>QkVv2 z_MB&F!bQ-Iku zI*LHqU-$l0_ZP_SJ+~b_gX?{Vd&oVn{J&m$xm!o8x<4hXapVaPtgmkmiSL6TF)iJlSemI27)kBCG8cp}rE`gKR3!O{?Ugbyg-Hx#k*B%8d$c5pUK0{ca8k z*yawO@n$y%?mUw=@JFNMvtp+)z%3Q5jvZO%rz!N1zDb(Kjc9-N(nCF1?Moj! z4h{lB<_)4jeJ(wYItW{z7i-GoM3E_{CjE13yW0CJ2|GPXUN>wOZNtAS++j1-Fy=6+ zMyXjfTrKaq#4?K2+W0laMu?_oh~H^rSqw%WnOiz!Jmu-FZTP_~2^D2t71mxAf4s{7 z3~P>Stl5P!9efGF)bm?)9CcMW!F;;ucoM3%F$k4_XU+WA`a-LTyr>4lBEg)&?Y?f6F~g@Cv+ z4~G^ouW-)6X+a_|r*I(*q9lQypBOt~+8lnmuFtq7dUw<|Ak2C~rKBf(SwdM252nu? z)NTNo_9GIdN3$iX7E&~x74^uEI}z-F@YhyGhuP@bzzDaeNxp$n?R=%6Jhil@CA*Vj zci{_8g&)}=q*C4&R~t>B8erdG^qWP3B)Al>w=i9ubPGgWz{w z)er9)fXVZ}0eN{K^K^)_kcL{$Gqq zDSbp~61b1YN3<(+)OuUwk>kO8lD|yI1iK`70uvk#d`=$(T7D+pd75V@v6!t!FQF_I zLR^;nUW(jSv~uYXG8yyyaJ0qT8v>X3BpQ&rE<170Ab}D))^3Zn!X{AbEKYa|MnGy@ zn&^x`n-zHD7|#ys-^mp%?Rq6ydvW@48i);u2co(&-jOqcwio%m_ZR6sYcU4Zb!avS zLYtsJtKyJXuLkq5YWcG5R>ThbnK(f(*YHb2c}Fck)Il6Tv5Mv0;v2s4Ee1ZmM=lX- zSq9z@KU`1SI{8F2q7tun%X6$zkj1rGab61#6!4LUBOmz9d5|H%;(Reol0fp__~mhp z{fT!~)^j?UwqVhLOZ|Jml!8Se!Lr;N&q*Zh{YS@z)E}Rgwm9bS4NYH&Ppni`ihDh~ zd($}myL%Uzy6O=6hPx!7p!0cXwZmOQ*bW|C36~kF2x>uF$CwvX1v8G9LQghJOs!7q zJLAT0AFZve{qLIc_vdwt_y1X$R+{ZC^zNu*R{~i>n1r{24r{&t8;)qKZ-mJe*Q3@@ zSkc;JvZ1?Ijc1|)2}xsmg4 z!1$kCia;{C9Blr+(fTo=Fd-~kh9hW<7=1hXhrrM&8}{$T8| z1#ib*60ZDZ?eF01tj31_UuEqo9N?!0uuhkQNfM)gTdjXSL{wDNJPYyFDadz>B&hfD z&g1`ZotM+A&%jXKx84uVCS4)ob-Mg_p!Hw&;r}M<+uwZab_35&Nivp`55`!kbBmdF zE$3v3KR@B7^bHqTqSy>t@Z!fZb6U9IiHcG)e?q82D9lNjXPVQ>>=OY=Im2+M_0BD- z{hmu39pVSYn{iT~m|u&ZhNw76E_L0uW53Aw|0o<&)bOk(i7+$kE}V(FdFOrZaec@9 z#LA~a=8pPU{_ra`rHy-%U>c<9ke(?^o9Cv3SxMmJ8#bSN(dhqvQtcF&TF>WCeI^?H z#jIIJq_2ANe<){W{GQ_AYd|d`gYF9m3GmWKMHa0)7oGj$C z{Ez{;rBL7Vr=B)j2ILieQgFSKU!gBG6(tl0mrdb_31ezU=TqHcYY#tw0ri2LaHleV zwUBmFMp8nds#LGb z`C@avbj#7BBZSt?XAbZ=H$c!*`eif}>8gEXnvNe*2#u2bS|YL7D@h)j(?9i@HAdsS zyRmq(PzTwnuwn@QZTU?dnq=j^lHjdULT7co(0)9;qy5nB8 z)IFO=1CAUGsHYRLrVMZ*8s=@4wpP&cGL*II=60*_cPlpYm9QRo8%x8HvCi19RtsM# z@@5DnU|h6o01Fm?`OVu!+~?UZ)?SS<)opbL%{XRKI90#NN||=Nm;V3ty?1r-;oWO% zrO9(^lK-D5dc%7crRTQhbAth^%cQVpL5xA~O5lrn9jFE8I8I zP$Y`PsPD#;V`wPvhB}()n7@yOvfk{YlE@$`D_}nkntW1?LpNXOjiE$eITMlpT!QlQ z1KPR71B0vbh_)gfaG0@8R`Cde@Bd7Yd3?ThNzUz3Y4Am>pE+Fl;jUdBf3TtRuDJLPtHB|3gN6Pwwk00RzkidTR=44AB5saw^BM$ZH>q?1s@-MYa5j_rzgGb|DEl!DY{--`XJ>qWV z@{B~Q7Oj$6ri6=)@9%HfH}`qw7I!8~RI(#VGEOWa%PeK6W6-EGW+*%d1q}wz!TL|u zVJheC@b@cXpTj6lrWW|VP}m2g4s`_VekJb1rt0`;EQmt-Z?AQ_9%UQQI(e4%C?11g%*Q^j)A!#Ugzw-3h{V=czPBP%$q zdqnpNwFVEt`x};lS@jaJM%<`OllR>4)go*E1=j3uD#tYH9t}WkIq++~m8|v+gz7+>s+$Xl=rUnLC}d`1#g|jo+tF3v z$Ndq=)%j}X1_&a7LYu08zs?7CXe=u05W|RD3xy z=F+~;XBNf(QFlc`jJXe4fzJ$fiD`h~2r>IHb&iw|6LEct>%?v8;rSPmq%;byR*9~R zc+)rI?Ew>+HFZ3=IwN^J=@+85BVo<7r=FxnIggY0i~t^*m&~+ZPv`Fs&!qV*h5O7c zp7^nUM`5j#p*s&-rd5F4_YXvyvpKO=;wY>wH*;>zbgKCUw*(t(SYfsN#t2G_V$L`q zHkT@d+ZV2n8l_$g)=^*o9`5ZL`Z&QHnb~tIfB2Scqs7bvp?d@gd$B0MDMZ_=2_J$E z`H!nS%4)}y@K%qozrb4r)DuC=@r(Zvlp;cJ>(G_NLREBPT8o0{iN-6Y^*$jiuom4A z3x6;S5V(67UFI1(V4zjJk5hQ110sw`u?&Fi+5A~B(*YgJ$yinNb_CHa6;X{&A#5D)gd{911hm;+A}Mp!#XyUPMwoD* zvL_Ve{gT)qYq) z{=kL~?1oKFd&2M)(`sbf$U)O-HoP8 zZCTahw>s)nd8wEa5&q#vwDT{xrY`u>HYd{l%D=h80ER>8*j~bL`{bj*Tea2PeolvJ zg?qtR_r1YPbAw*Ogzr+d>;hTxt;~`cydK8cq+z_iaz%#qG(`nyC_ZVJUIKp3Bfe4u zg+&YxY`OLR&8hdjh^YI&m1<4&tsA=XRQQChAJn;F>+L^i2h%{%!dr@OSj5|-v_WKE z4RK-C-@sQ4%2CU3Gw7xae_~MFrEDuYF3$aX%mreVbXSK*MF})duAF|Q)a3jhbb)Vn zEn=ZpP419$(nrs~NjEr{CY}ny?c&1iU-a_| z5({8P{y;qmE-v{U{jXq6{r7h*x-lr|C;g5K5DXyjkUw#DDKM9+7cK_d;@M&=!qo|x z!sO+3-maLhRQt$J&#jZ&spV4`{TBGB7m8v5*@9pH{8HvJj&RIK%llJ>TaZ$S(z(Qd zg-@_U`C{U;xr0o)-gQ7pJ`ooufLWQGsidaF*BDr|JPOdZWzwkj-uagJ$rLOY8U@rg_PW3f3 zm`;D*j0127BlrO`8r&{MBGfEF((4nZ5w;k2NPq*1TwCo-3H5XyOBH%=B~NqwoHG~m zdn;VG3&f@C96zfU&2u3$3IqGU_TRK+zve1YuB|yfE9**3;SJE!yV;-BZxAB~LH zg38c%60Niexh0_c7}V@76vYH5O~rY4K^K0*`5B$_HQ$ukf=OEQQ&6xgN@>n0?HwZK z8fVvj%9+(?qC8VS!j#|^1oxS`=-%R^AZUK+MwXckN-;Q==~$ z*Ujyb|v!s$S#|xvZ51jd}>@q=KSRL?WzxA*d?T@1lG7}?3RthK_*s~lGr zkgl?j7?NP2qX>!2d`?7-Q){LEh32xn8a+C#YOZ4)eFk=2(oxGOF_IZlxMUDdy!%Ca zVjhE0+8TCrVfN&gNf{r%Mh!8GTwft0R}i(?^0Aw3g@U$QmRD>Ax1iyyaxTdLe$}k= zWv%x7b&S=P-_hd8;I4=$X;h5F)JG!Vg?4^A5r8jkx?^zH(9X0!?t!DH_Y)i58>Skb z*UA7kE?(X*c#J76wl@Z8D|8D={$>{a`}|~t!G}zbE3SSPd%CQ_OY#vJIZnMDvll|q zAIrgjZeQ+luBlkJO~+_jmmK}X+)Gl zrMP}{U=3t-yQwLcv+%jh^3fQ4-(_)(FOm7>E4-QO7w=#U<;bCwbwYj=(CBn^m0Vav zO2o)aqpiryEwgixwHO`weYv4uM-lkogau3UNE!tE^5>UXDo07i9w~0^V%+xA_klO- z`kH+cr2e3GzL~oiN0*dHmlQ{jOpjZxzkizlz4SlC!bH?)ZJ&VRr*un>37r=Qn7rjm zM21{?_NllMknUSG5p4M7xSbsQ6$;8)ViK(IEP&GaPuX%PmgZ;HZt%}x;k4N^Ve!$& zUo4F_4O?6Z+dOR>=hp+xuS-`4>k7QXL;T1^4#C!jrq#W_oe%R2JvlP1#I2NVDO-&G z15fZGh%R>Czepkj7Z|Au=81Vbp=f0dBMgZp)A5-KDd%X8wYRFur&0#x<3~AsAhnL3w~Zsow1s$G205{SiH}M7!{gkc{HE!W$(V9SQuqP2&e*-_pkXhVf5T z%eL5IFW0sM-%>jfO5tkmoEL*WN+|{>-AuDG&wDS1 ztC4yp1Aexx=b7A$nED%Wv;f=9 z_0vfm!0Hbih}`r4LuPm=R#6R({u2=zy!ern_ji17!X5aBv;8Bp0Q=K0qV96_25zGW z_A`4MZ1F*nM}1xWE9arHc%)9lu6_7E1yH-XxtL=JJ)o^|;1k+j$26uZ01HZ7x-4?% zqB#og2+@csUgCT$YpW19{9>FZmOi}um%C33K~uiJRbH0|#DxbiSp=u4HJ_$^LppG@ zq3pqs=DW3aGj!3YlBl-{=)^@3Qi}qxlvXtaOX_*6u%$={VJ2PtLsgU1NPF!Djg zgaYomQ1Xe$2JLu|YyO@M(W4mpQmQl;rVa_vD&>FLX1yxTyC#qC?#op+!F9A~w|@x% z5snwWq3@Szz-_e|gt|&pNIOu`2P0XdK!Tm0$ry6jg3}V0J;}@G{=B3@HZs#OMyYRU z!O07&#ZH0HGY0A$fEJe;RSG$~VDEat+`mb(^9*IegEqz@RYQ{0TWo7W2=m$~$T&cL zf&sh1AS3q$D-35w!1a+t1a2Rmc7 zP96f<`?VC0_mOobX9e1ol%_B*@?|(4;5f#|R|0IuuWIyGmC`??LFyxqKAAUe00eoy zL%qtvCJoW4iQn_|`e$bt0wYN{9fW}sxgb0i#LJjECJ7!XN6`?*Kakq9Q=(n>)!Iz| zAlZ%ko?$?A4WxRQdwFFP(J!!ws}S_g1T!g=wa@%ReXin$ekx*D2K@QPNCAx-3-h__ z3Rd)G8|@#v0>=CKAid#xQZtMKQ8c{?U)p;><^P$CzyNsj7Zq4Fpmhg0ynhhvi2;&< z`6GNo7dR!j6F-bI9@Ty2^yj9VQ}l0+Gd9FY#n-_KP5cB)@nd95#dTs2;TG`*zb0ek znw{1bAsW6l*cJhuE$G4n{Bi!tWYxAmxqxDlDJP=&A>R! z3mV0qLx+P0adSn8U(W)6^(ChyDq`r0G9H3P>S|-FZ*et-bld-!2vjTS3sBs70*7H= z-9+i%i(L9!AVIYcbQm zW`&1u;0s(6l}#e0SSklR42W}>m+=ap`s+JpDxnM~->bhn2|QA^-F%S~(Q_bi@z*iFI=OlN(LVaXur&cwnF}?g~=NSSagJ{PwXXbq5d6!vE zQKCGqqHor+UH=2*HyM(U%|HXla6QuFz|rE!x`!HD-F{xV`hh3SlYC zpJmLR>dF|0YoY&}b9oI9+3x3}Cwu||JI|Z%BJX?oFIa&O17xndLns@8&yK+3*F1C4 zUf~nx+zrBVbQ0Qh5uOHewk*ej1A4RAu_8XN>fybeG=i8GL(5A zTW8Xxiol6`K!?eoy*EuUhwbVKn~%umv?4=Q(otV5w%2chCIa z1@uG}GJOu!k_hAos%q^)hTg^|5y}uvZ*PGxR{G)Bl&U4YdjSp`vDG+V>xD`MULazL zjLomk7j@TPMFKtHYBG-2L?76PlI}h6NxMcKp33lz9{Iozj9DlMdvk@hP#^hdXfCr> zD6=p@QzSj5${Mf1Zf=Ey&UlF=a*eMB)ZZOqG2JMtF^$V8y{Y8b=O$`}F)XxPl|)LH zx+fo2QtSf5y=eLt+k9{326=IG`G-dV0%T5Z!@9MWp*ADVm(BdlvYMU;p4LL{dn0-% zMRXpNB3H}V@09=*M*-LKt{Us4q0&6$G-yJ_7OSFYwYV=1X-0qWm$Lfj_Ou&lKayjA zadU?^Nr&d8Ya?*-P!jG|6c+q0(k|}do9*g5=*m%CnLbzhi3l1)P7jLK-pa~m;{3S#@$KAR z`HiaJ;K8#^57Kh9$@Pe@Ep^-iNJoB=UN~HKYV?KNq@>m!Xj30z!J(kjXDC)((V|R&fhlvlv z?+;{u&pR(_Bkak>c?y)j$tA^^AcjsPF}KspL0CjvnE1+xeE2El9)W;UgoDX=Y3blo zp%X3;$^y(!Ks&J??&~5UocOvw|MGPvr(mDD;}4ersfz1Zg}lu*9kUW4(v~V47I`y> z?(}%<;pGyu5muY{c%0i_nj3eAt44Y`xEh}l%y(SR<<}q2^98h0Nzza*7ne2H(Y&A~ z-y0cC&Y0Z8woNS7SnCSP9&dy_Ti9Aphj)^k|9$suDH!IYXxu@{P8oKgRvahw9!moT z5SdSI04o?b?nPk4{@KM2E$?r;N&c~kFeW&udcDMrhmQkc83cxp(B0h!>|bis?MWTe zv=$_qDR8tZ4+@fb%4bg3yfR0d>P^-J;eUh}ga?z`U1r7f{az!x${TS2#?Y|IyN`^H zsCajdD)4N2#OMj+ViAYPtW)sUN

IEF^Yc!j_G?kX3nX2W#52S>5x$680p*ZP%*{a5_IZ#0hDd-Jt<11b;&{v7 zZzD3azUqMtzgeakkq+r%>ME3eqQ#LG=JQr2qoB>n62e3M8aVh8s%Hr7I*R`9(B^{t zO+2-M$v|b63oiiD0AGpG>)j#GhhHp{0$2a;vdAuP8o!p_ zNn%P0bomDzff_gfsO0f|;b?Dfx2k?#?S5Y!sXp1}Y)El(2)^i4lEG0VE0IZHEGUFF z5LGWn{gq{iBHzK2my7JDhENgcxHk=@-Fgnig+FNSmlXHwH@^13}Q%~ zj;F;=DY=k+@YARI{a>kFU`e{VCJ7Y!@^NQH-y51(V$J#sbNlzA!S2ibX~+G7o^vbF zZPIhx_M|}Dqo8B~bX$Fpu2sG(NELq{X@`;$HXMZ%0bQQ!)WSbjU@Nhv(AV|U&@+Zr zft0qB>^3xB$q6&cETZ0pR;FH@Q)|nyLeN1)kitYB5QR_Ls!K$s2t)|qOnYZwQ#F2C z{9xDD`Kwa_OCBZ-XQPU}D?#Io&>Q1OnVepGO86Mmx^w5kb!!=xe5c8r z*&_1H*#@CMJ|o?1$Mvl6GT7QO8u-Q>jnmC0G90xAqhS4*jNiuPoQ(JxIU$#Ytg>i+uBbj{86~=cWMaxHI}>9Pj%b1ii+Hg?b?ScY_R&Dv z^~T=M<{j&v0(BWN71l(WToMIOrUnv)EB=p6WbXHl?PX?X?6!*Vv>J4wQqFn$Cc<^K zeCA#Sk7lyW4r`Ef+y~}!IvrY*Du-@l zQ;On@pj*tqZEa$fA71ARVX+R`Bi)~01ujWklz0DeMsXV!V^;XCnjqB-6FVdbB+FC5 zAxOUG2dQu5chV$47zQ$onzPavnbQ&>B4}gdK2!gh!`y(;VZ*lADhxZRrD;2yuN7CZ z%`e`#gsn=BKtZJfjA&mn@9}5sXrCYR^1U4de z-Q+3I0qYq5HS&HWeFQBG2wvT|LL}EXV|1gN|5;$!z12%7(QmKMlC0*1PgWVi0A_;K zM7b>jS7A0Hf`Djt(g{Cu$eNLm!p{*wrKQe1@b^GIKCOSMikFn3Zj$9e{Y? zHgFTpp^_r?4y z9Au!wRm7WMue26RxU~Q3M`P#3U9khxWR&2dCO`~-6)5-!u;LK4ges{MFYd!hDF`YW zjrh}$Cr%bG8AZ*NK^t={4t+_)j6$bAnSvSov9@Q?l>imp+)}5*3ewa?8$kOZK!JcR z#1@RaCFg$UvsS5{D$_cnS7LuX#qENw5civ%(IevK>KUJ z#w$tv`$M~3_bd2&ZFkAhBlXn&+GL~b#~i;~R`I_pL9~{R&o0*98QtgrwvGud1Boye z3{@99Cr;Cs@7nSz1-IzQ`>f-%VHBY4a3Ai1@f%q#Pu9mP16b(QYHAB>@D(O?3OMf| zWRfFnLaIuTlKXsXfU0gBhsfKuQczRNj~Uzdyl zQ3w3jJ-B+kU|D&kv#ig6?6qtEWfz9M;rO3i6D{wLsQ;Y)LZ*Y_A(R4>39q4c&dDw? z;N`?cWF-^Xesnk_z9#hs-Ypa>UJ!uf|y_U|aSOVb5=RM(ioIrAvcj5VlN9a~$Yo*rEroU>(7$oFky znUW|y;yd!ieP|G_lB}X`AU)bg9Fkp6&{US!#O{8XazlHT?m~A8iDNUy0ogskfg>9@AD6&Z}KPN`TFk zud2qOuAx!E@{0f9O(vrJIS0{2tw0T1={k11>2A2MtwbFVjJS7}L5Tw_*; zJR`|+(~4vuhQ!` zjxg4>$j?GyJu+q@Cu=r|z$oW6EBR#tYc-Tta!l!%A{R}wu6KZ=lfhtH9Nx(b<*}V{z z4YIMBJbc}+o^)r)UFh1Z70_Cus;Eg;hNR57kd%ayuDC`--{*ticWUg#mr$|zcsS5^jLxhUGAH`m5zt!)1*w?l)%4IqCJB|Ot z)FWBCxMkp8;J_F@-D8&MrT&f*Nk}>3j!Q zG5rON-#9Bw;3zm4fjq(>3&lYa>#n95?sHfmgM9BhTqJPsEu5gctOxU6F1t>E9vFo2 zb|-rphi~a1=A=5bHUHmogv@!NNCiB;XIa`hhAHb@R@ft&nVvz>=rmfDwCkFtV+=B> zP7*FT(Hs{YuRS^^j?4g)1(SE&w!Ee#(Bb}TLko%ac;5Hj8yKd@1d{TM*HAo7|GWT?{8_$Q+VnND)Rr?)jK}3kJWaM z&Suum_&n49yue%*4Q5<0gJ-`S&MK_KKJEM6{Sfq1)J(wXI2=A~QV!R$wI{A&k>>KA z7CM*|s^Q`9iUf-=Iz=^g!*rk?3Ru&-V&$l|{!iSYhvRBO z2-0T!a;e<4({HNh;t@yFo8BRPEdIFM4C;4@umxC>4sX-ur~N|;wf8obCt{q&0E-se z#17UZ4`m3x=4UB*a4IBA4&{w_Hf$n?wC@@jgpTrq+wiOJ zARk}U!h+8Fl9@GY(K%VC3$zS6E1N6~>DX$6EG+qWcLryOThF4~4G-Z?uMg(Jk)_ZO zy}gb`Kzaq0JAPB3bl7b7oTx4mB^S&}Ki}owl;pr4xgD!i=P0COGhAQ{8*KT%ybo!! z2OS$3UDTqYx^DGZ6(>s?}dqxKADVB;rgb(DVVTrs)t~7p#yToq`me$&a{w zuC%fjMu;bEuaf9rwE^6pM+BFJ*L%W?QXiMHD`dL)eY}HJj6a{L>SDNKTV?YP+%VMEz1@C0>i9tac>w8I+QY4Cwlkbf z^BB|6<>Q3B4|R?u30F@6#!xJFgZ`}|AlWarV6zk#xlSVH_r+EK7Gwdeb%}I)paU1F z45}8S@T@`;rN-IKc!c+~<)~n8wpZ+3Lkl$O@>rp=v~($&NTetOhRH=VTpnma+%w`h zMj3?*uj`hq-Qhi_+8w})9<&fc1wf?{%cStdNY=LTll9Jw*{%Jv%Q)6V?ZW@@1Zw<% zpQnCQXqb)j7WMf#pz2hUGNx#Gp7|U@HR9<3 zoGdrRkX=BHB>yoUSiQ%(GF&fDB!bTLBBUbwp3u)_n;5QknLz8ccx#_=J;6#NZI8L* ze5fL}0`cqkw~1ESpJ5e?0{Fmry*B6%_Cc_P5?exU$L~a#NC`KHJNkt)?G6+9MHNcY2a8C`_xx5{KUx0GMkdlnefvpLI~a7}9aK((>O zT}PPQW9{ik2B#WH%mxV|7!}II8)ASml@ebXN0ee97Rio@QW|4=xHKU26!D69rjT{ZWzuNluW`jaBcJA18jh$Mw0Dpd(^~l z?v!!BL;CVzu_w5gw%&74G$+36im+i?d|EcN;#5Pk zeH1^*mmRFVHM$#3S&NYRMziF%Qb#T@zx#A*{9x3=@J<@HJh{jz_%lcG<gY zZI{di`5+gyyJ$?|9T_i=5goWls+7Kj0KW1^&E@)So!UGm;Z>Pq&3`4^VY+w=Yx@l# zUuMUUPCt0PVKpA=8%%;f9jB=YXHM+{ix&~n!Gg|Ga7 zq_P=|HVPqP*3qfZ8=0e4&a##F1=PcV{QvzoHTC?t-5&Ddfl2+$vr*U~@dskRFVzT+ zZ7d7{`WM3GNnH(X*>AM0)QT*e?#q;;8R$w3*~Z6MS}!vPXXWoRt-QYm0ZX_uGEH(l zg~}6QvWP_J5+!2>WMcC)b#Fgi`=hu@SPjdZS$Wc&ryo@QY6w6xBC`e?wEZ1G^+N zpHK4CQ$$!98EUG%E)(jekeS}jn|pP)x}=HXFiigjQk8CEd8bjZ&PbzVnBfx$1yJw@ zK-+p+?Y{JW_jS+~g?6a$`5U2(=$ekv^)rsP=dEkXhDY)sg4Wi5Y&UL+@_kEs?6xCg z32VA`` z>z@pmlUkGH^Uiw}dTGA$$zjIOpO0@@X1#B>i5b%MVKYCi?(OgA`U~r6;ghD&z9Ij_ zr~EH?Lx}OWUr_FG-zAxFs3=jCGM*MgSU%!N;sA5Ad)W4S?9uvbc+Wv<(z2s{gMIl! zsqRN(U7c{_GNpoAk}9UewdtewGm1v6_dkg(O~ca%+m(Zzz*~47_oL9iE z`TI8~xb}gG)v18Fpiz@EfhjqDHkN#r$t<>_4k6s66fFm7;JLE9Cw)=oFmWyFV@TQU z+)twv;c`dm2~8)col&rgr#>i+5~zMgee%Rj6uSV2Zsbk9xR*<4vQR}74J7xaRnU#j?EnX$(Xn-nDX71XyQ$dQ)nW|*gsBW^8pVPEu98c#&J zeUkUioP79@tWlEvy3|FKn8-b7<|nd9U0=rJoi5Bz8rdrk;=4Z+d|D~*=cZ;BNA&y- z!YYhP%90(NHHmQd$aDo{V8ML1a zvP>rogjoy@;p^BZ7Qs~y2e>{lqKv0Dm^F23j07DdA@2}+)`l^_*I^e!Vhl0jV<6I} z@^M!?@%G|rjlkNJn+`Zu%of|geFT03N$u7@nVy%ce$n;F$qjz-1N zk=NXg+0s?=`ue#1vEB{{6UhnzTL_oGvP2WLfp(GW1L0V0=lJZDLE-&Lq~p)zg7i2# zGH0$j^{Qf8xhkgm1;qzwrsOCINU^8Q!C>v!iJxn%U<{t_--ZKj-u{|nt8%IoV2)aK z%+MC1RnpHM8Hj`niC>?K<&7e?iekMpCgXKKKnhp9$SPC9mgC?T)6g+h2o-tMDL&j2 zx%s{FEo^)U5Rmxx0~xM@5(f0Bs{ZmxvpjAwrl|(oPmMyQ&Nq1S&Uh?z=45-taXJzg z9DlTu6oX1-v!%5>vFHDeGTIjVjc*w%KVN>3!l1NT|BRDo&PIMkc2f0~fi=)%ma>B$ z4O!g#KG0zSt)HITwC*pqT}NYFSz(Elmpw!q>x4}~wGw-^%)Ea=6l%MOXYZr9u-QN1 zG+|R6v6}`+4uL$$p%@}lW8*;Xm_Q?|R|;s24-&$9jeir)E%~<_<^#>~r4+deh@KRB zg82-XpVzS8?3#cf@%dZpch6Asy?xM#HEq?FZqOGXk7oR@@aS!(6<5++uxeL4R6F{W zsg8%M4%95{%W|{{Zv}B)mMO+oE7<7&VgZsW-vQ0^KDjK{JkKYMF@w83@AstTol>`5 z6zI;LG}n_Zo$&HC?qC>b&8wt-S>uAFhX^@ZjKn6b<)@wR&6hrdj;|LOv8FXraEPF+ zn@Sek=%G8}s(P45K+3U+>95|d49gwTV~cs8=c86S2CD3 zY~qKHWu>^B;Vum;{N#mjuJG9~iqs5 zl?n;wgPYPY7zUg2;geZ;+X6#7uyb}s36RfwUmG?q^yx-7_(tu|{K;cA+acB2NI z6nBdc;}pL{>|Fgx+7_c_FcquHW*sXLgp|q~K}#l) zzu1Bc+^yOjIwxK>y9O?3a@lnChOnM}2#g@9LhqK?uyg%minRlrrqo{Mn_ zwhpdHk<5H=pR(fjv6<{zp2}O+G2h;6%<|eMsq^`eSgEv(FOxVXmt~2nE*Hj<*oL^B zo=h9jEc<#-H7+l?5-0+BpMFAukeABJ+o zV^{H2NVEfC9P;q*fd>#vqLP04ho>_}DnP)yt5O-u({S4P)K=eOOc*!Cs-@B(~DqpZX0L&Bfr?Jsn9d;`+A6 zu^mMe=WD`hQ#tYKq&3)Ivq>OQgr8jE47@#F?Lwu;@xO|NisoNY%X;_7yKGSDKf@~` zc&ZBeSJCQ!;I zaI&y%#($ghmOmjI2$e5y75>UjsG^}3qG6atQ7cBwB~dC`OD4ZrwoF~U$1Xq5UoO4f zJ1oE7sY#xmCL{jv%T6Q}mkBmAju`j{NFUZVJ{?q2vgr5ZY8PAen{l)2DQeT312-(L z;e|BgrihxN8dv&o>Hy}+-G->2ta(RnbYXpB;BgQoR8~Jws~OxMc)`##zBeO6GxLryapI?5%Z!Dv9~IPaODaqIXL?#adP8YDwqz+_Dq zQHQIQw-#RT8ZdK!b4R>pw6>Wye&}8Uf>pt+@8}o@X1UelntV#&kr0Pje`~f_E{oeK zh*HLHoMy4R(rcyA39^d+`uZ}^U)reVjZ$hj9|u2rFhsDWqXSSQZUg?%yVv(W;0$03 zDTwYD`E$rluiVr+e~(}zT)Ewgx{g`51F$u$%`GQuJTWvn_)EScNww7CGHhUpOzwy_ zZR#Vtq;HJ#%a^aSq-6|>3swC2Y){E&mx1?c?RPS$voC2YFG9A8l|n1WP2{qsj4UgP zj>)tls&_ubc+qno32o13_3SMdLB_Q-y}5_M>?3pI4pA92aS-;|N53xL#jH*uj~VIXhTUeUn-(wog-sn}bu7!Jy#!{H z1Z7WwVoh_K1aDE z_kbTu;uqt8K6>i_Va)=@CZmv+peQo_(bW=4;nwu>fWad(igP#*Gyr4WI^sA-keZ@r zG4_Wg#SX%dypj)prJ$^y|B22p>@c?aYI=q?`pg$C-7tqWoC;e~w`a=bw<`{5ikoixLxN z^37Heq<>Hs4T^B*w=yVLyatAbt3ZqNe$71M4%Wm%V(49Ij~k!U*G%PEKmq+b-6_Ik!P>%%@`_HgLD2m zD#QDn(l={Nl~@kteNvRceHK!ZTeiHVHOt7394}G*^3E<1P`e1a|03A})5YYUU}=fB zR}IF2W@2yraL(leo&sz)EIzBeCcXyONq&m>W?;ERSg22E7bQTNnIpVq*fjh4umWx% zG<-NiQ{#8U)3@k(>PYxl$tVh-P*4N*FUClnT-^5$#bOryLV;}2%8MUv2Yy+#ejT~#8>~0la@4BU>F&iT_bu_IMu;d=Ir8Q zFvBob$nlbHO8WSp($}hGoP~R{tgN)~zrGdttu+MZg=)6lGS|EeLY^66SKESe^yovR z{`O>7pP9Cp#*UY?iOE9lt`NJTrKNu+k?@)Zpx4jJ$SZn}f&N`=fq1Y@h*(ALd?*oF z&^oG)V4~w)K`*sKSkPV5;C6L(X(?eO)=rtLel)PVX_1Pj-!8Kc|Fq>O9Nbm&%gk!< zWvwm*hdEn2Pxq>7?iqvL-QV*x5wKdrEcU4k4dcF}*l21b_hRvsSsLj@XD5&$Iv=p- z6WTFQtBexQisp~hm@D|clm>Tiza*kJuo|FyI|IQmDLtFp_!9dlp9SGD716=s!ApI6 z9|f0DikK*1N>iFVAMeD&=2>XN4l`S}xdWm;PuFkwofmRi>ecuu#Y1y20Gi9zHGT4E z+sFyY6A*T;dc~fV`zeN-lLEimG zZC8jR>17q2(6E?q1O@OCO|5Z<_4dmCXD3 zmzR$(<<13?A|F>a?JnDHm@(yMS$(pbou5MsAaw-wTznB{-E+PEyCUkF1xmg z^neDu?G|komUHWR6K$&mhrP%9H&OV0{4fkxRY4H<8C9|-Xv6%8Q zVTbBy{%Np$uabad!YAP;F>}IX+tw>U1=&Jr zFVP+>3+pWh+jbTBlum!wA^d2Ty6C$ReCk}YR3*i0yTa@K5C!mqMF`Vn#1YZo-kD)s-=~Y{;-b;aM`J#qpw7@_? zGiUfa2b6d@vJlb`u+aegUpPOSaitUlVRDLN zW2?Dei)4GcS4|Fl6h4`<{nW2N@J5^dDM?$Skm-|+kh@y*pkYg6S6PgOE}1OwJV+xY zvv!~P87#3F$@kd5Fj5_&`#@<@&Rm|6di!rNs9^BQfaDR@i9zrVB_EHfy>2>1>5mVBjjFKlZy_bEfzLGE=jnomgwz2Gu_(r@;yFskqM-bsJjt zgmKHD-4%6%pnqw8gn1OLVgkDMe^JZl%udj`d{7TCi$vtvbq`cMjmC~QT`s#@8~6d! zN8$Q1Vh6IRU>f9Y0^KSw!Sxs^8z$fPn%$!S&DSUZWMzMUUxP4we&Da=NK=d4QJ1F& z9Ar)C zH}uPUp$Y@esC?nEl(=C9X=!8zW?^UCpVH?{`R|i@%9R1lKwTxyFJo}x6l4h<%V z&MpB32lo-X>OMYw+t%9HH*qWR5{7>(+3StnF!#k?dY$xiA zm7-#-)&P$Oz7|zt5>9=ybl@50=jB^503GuC5{-s?X|8AEOrVTUQ^m>#dfANmoHve? z@QdDL9kYsMk7o?SOI{%UC#$GQJX_NPMZE7HMfy1zUG$-B1jJUmqoC6XX{5z?ccF|{vBw@I~eOL*@jpAO6m zftzMZ#|L_EE^ny0E(D5DA;?AGqw^(q*LOrBe#{R^creOekr0G<4fh1S!r5>eS|wgT zm_Mg6v8{6tx2zi$E#ddv?t{behlhtVggqh8i@Tuv*e5O^pa$e=X#6U;I~jG4e4p2R z#cuab_3xh4<+Zt}j2xcrfXUy#|JRf{55zix9;%+8W>2>>z(J?f-93Fhh6V4#u10Cs6GB0m}u&seqmlP~=L+p9Mc`wuFUyLr6;k#6X z)O>@3pp7B>h|wQNk@KX;nC_lbGPA5)Z7%d77!jYStKOItfYsR&Tm7L^Oa&-AykBEQ z^DD8397X%#Kxi+c3&{VBMQ9#-=BACZf6_@qa7++eo=MFvZMJAVs-OkZ-RPJ^}C z+OCmUt2(5%aD(LhFSs|r^m6f*`@=&e4Fz?*e+s7O#NgR&TfrmOo?P+qdby{%n44X~ zNV;8AC9HM_8u18<8Lv3mq>5E16oOSWL)(TGHBhIAR={;@e&VDAIdb=Zjy;kk^(p-2 z@faYAc@atGI`gF8=?o?7ruu_?VjqDPN9P4gK#!Sy+{OGXaG1Dtqm5GbQt~p9*QhR8 zeL~1J^%Bg=tJVQAZB}xQ(N0!;Tfkn3q=PjoT)|^OrW*(ftTDfwe&IIogCP*t|CIgF z+AXEUkB`Li6H8YaYT?H<`pSQjIO>Mrr298wwVRm3N*BJmo`@wME!oMHze&$yNgQ%7 z-6uST?43_nCC0Y6D$4t?%Jd~A^Z#gAtp z+^39WCmZ2u&5ot0sG(9X5{PUX7sKY|80LEtS{T#62<{NjGO5Q<* z{K}XL!RbzbQ=QC2~ z{jLT#6;s{np(ii@4*t%uV!Xw)MszBrO^9PWe{9et6n#amk0{fA$%S_jF}9{z8oeA; z?AyAWG=gBwef54Kazz(GFT)wQ!}ZZ~J|#7!S{J0jK<;W5age^~EG3=It-Q#tdJGZk*GRUc&1Q#ekVb;w%nU@_Pe@O{^eXZVN6 zOh|pi7qOzFYV*ghlZe{TF5pS}f!4vGH0Dy#KWilb!Jm==ft3Z7D0D_pUgtrP&)_t= z$Sv1#Y2AK>X!Q4j;PntM`!~XMsH9FL-BgcaNI{#5)he>016g9-_@?lu@0vly@G=RZ zOUPN41wY7)g6HqjhosnwSJO)WIz!O}Pf`Efo#e@~ z@Nlf@i&{f;s1QqVdRyjnZ~<4@BIsj1%vDP0OaRxBQXsG=ebyaXYZ~O~_{51513Qm%xs(*YC; z$`}z|m)-B0clcyF2`kV(`*3$*?<#MS6jp*uh)Ngq?~4;I@R@{cr%f#OOa+_fhs$h3 zp`CA~mgAZ-Npy6sQg4(LFwxRQ2xnYiXVdeJkC#rLCGJxky(siY<^YT~gQ7j9h};&O zK6%+28Y*B$A8^Ccs}(K^|5~a=Hf7{ct_dImjmLWyr&sW0#b{MukX%@Lt@3P&K9p`AMY7j_Haq(u*>y^|MCVCC-1-TxANti<)^sPjXad)W7#}^iog$ zR3S$h$1(c2lCe#6P00dhKkg$9x>ke&o2>&@`}ir=KT4ckjk zSVWC)D|Odmr1t8N*i}%pm^4rsKZJ$t(yR)7B3zJ?75n==PYZib&by!mrAdOzBCJcwgD%C`Ccm7%+j;K1J)q zi6G4uu> z{}V%GTEnlnuI7&@Huwyh8r(?=V9e!qUsEThz{I|L(!l91Y25l>{ zj8Zg*Z%1?q^~|V-auBniI>Ixe%6ZC`f>yW996j3nZEa>Bm!J9o(z7*k^-Ampi3en}%~?^aDdE4GQEc_` zOh`OV*9_+6(2h>%5Txin`g?Mv+e7 zpoYo5BJ@JNDeMkua60*n@6#*N7PKBBAJOB>mn$DF)7Z6~crdsysCrWb8B{6i*1iE; z?@OMM5T}L8XJZ!a;?)n>*-r8P!b5^&)o{}YYjU?X(to~HxS`mu?vpdNte;AIvo>pm zJmaEY`GyJMpjy1t@NU1Mnu1HgA8|yVRK8jGZFJm8ym%s*x25~C#?oC%T5K67n4v0I zG@~B)Q+(_4Z&6_As*wI`VVTm%Z@h2OnZt&NW+yn-4@AxngQSAalxtR}R}Y+6dY}|m z<3{SUXU}(e!4suKAf?ra%;OnB9KyquZqlfo+$`eDn)7^0K!mpOG#ESw_Tw$4Q8`w&Toe7#*alvrsToRJw zOdMHw&WIR5SpD>_TDq5X&oTi^J?xkeYyH#ZyDa=lj!ItGBCR-SjSI?smvQoW4lubM9bFsgsVEDd^V9bPLZ04 z`+#jY>y7$v1{epz8|Q>7aa9D%O{{cL+o=Q3fDs{*cgh>DFcV1Lj-ISjW)rP0OXQGC zA}aCr^`z(}+PQwUv&S=1jmSUt*54ODdZ3p6)3)PrI zqpA=S{hY-WCYLW+K9x7;SOcI=o`aQ-H(Sr)O2!=tqrGg5l2fyC>Wk;yxI~F7!F6LN z&5NB050!BDA3qOj++$yyk0#(YkU9sbE*R0;vnTAnw9%@=Z?#K;1jkHK^svh8s~AE2 zWYT>!&}IW$V1_|NU5ZVG2%pNpGto*o)+ym%54=J|Hyu(Nt{892j#KQbOEKLAEa<)I z1&gbZd=7@!99*cR3yfs2rFlNSDs)Pi1~EA0C3Vkdh>mT6%J``YMcN$y9OVP|$wuj{wO_8m<-g+;N{v;UE4qc|S4=Kc|6>Zg9P?-@hYB z%=vW0fStgNI%x;W#A#oob>N+7cqbHzEIxf@CRE?Al)N6EkMP4IOq} zwa#T~EjO)%`BIem^*yG-(>$Bc*bwsaYF^LfMk~TM&Cc?CxO(A>(nx= zPnvCCl$`br7wBixn|+Lz4RbY2Ai6=;akVio8<0WzSKO{z8#C>h(X4W1s^esCochif zO$(9D2Ynq&V(8e%Fm;A{!7#U8su!&X=qr0~oG)6Qxn+00eH?u@P<-_aM@m-9gTbp_OPl;Z5fCizFs1fB~ z5(S~2=mt`kK-r*m%rKEg=Ez@A1X)d)@+nJCPbgp;dFElw)!O=;^pZR?v3^4MpU}O_ z5TeSL&Nnp${+nNbs%1phr}X^Nlmowef~mK{`al3}vh9w`-T{S+S+OQ!8&!!lX<88c zs;XGv(;DM%fwjxXecWRI<$QLWuzEGVW6}zH3)L6JiJu&}axKK2a)uI-42$|c2PP*3 zf0+^_0`WPxtD6yh(qpaQ7o<;N>Sp8H;r-54Nt7_n?VA7lFocurvVnPX0YU6zVbT&0 zTOT3C6)E=T9hV=l^A*Hl+-ducThPhb*sDx2$-fa~jA17Ivuye2WYb}54TS23y~=~#RH@Q5bvGz3lm5-F2gHBOT}N-mFSASmG*lcHUbD)1qCfpkUl)_W_UA?U(* z`f<%=d#OordNH%*zJEJH@R=y_OuVw(iPpF4IKjVN6FM#Am);=zE(ADFAo#|~vwzD= zPFWMcBzU+mV0?j%^stPPcDG<47k*plvWudL`Y%zBk}RYumBwe+$0@-;ja97btvlEac+c+yniFvvYWf%sauAk7bfPVyvZj;imPwj$_Fds zdfXI1=X~JqciMx`R@Y8)B^?{t5W%dmyvTGa+Kavpd~i~VvtU+4%gaS zLQ;`V+?j#tD&RmOhFqi*0;Oy;OYMxH9#;TcxcMvyNd#pLf9E`dD{}%(Brc!UdceRY zoss*|X)68M6}y4f7V%VlD@^{5vY(BE10do8HPI7xytZ+@+MCjSi+AVLCh~cxWw5Ae zW=kX<$&x}uKLQz~CC#s_2&M-os@HzsN7Va`YO z*%?ftFV1;4P<|!OJn<3tTfbQ1lEmp*z`$OgHlJCrLAV>W6IRh8osm&DCwn3r+goaE zjT=%&pVxc6>#l{p(S5VdG>!A}7hz4I{2Y3M@5LPQ7$npQ6*4jOe4NF#E(IKPb{yaO zcse7Et41kWzUHQ5jg%RCpO;Ul^|fJ@ zW<%CLL}<~*m&W7Qi}V1%jL68OXw<(lOq>c(1ig@M?iT~YkJGx;t`25{ejifV%Z$j4 zzP+TCi)ef0C;N>yA*ILR{1Tx9Ci|3$JNx+Hw{LP6cfi?h-UL$S0cGobiBzI*|(_v!^%O66#So1SXg{HRpa; zjQ&p?-=OsCPv0M9JpDA>O*O^h&{X9l^hozzRghLQ5~M$(SL4+jEf!52&~N9pMRmJ3 zLv}TTOQcg8KAi>_31L?K3_B9QC+9O-h&TOrHXPr#d{;5H53l+(g!<_B7gqTf3=|8% z8{oNL!reV_!cIo0zZ>3?;J=XHae^ZJ{R$u7wa`=wL;;w^vDORr3k@9{hsmRk zEieNvB4RCyaZaFcVb|VJ6B{Cx>PVOMXqWFY&X19f?c>u=lxItpBPfY{G~aNS!VPP6 zVQX#OU}XMqrV1ty`}T(rI%k6VSc1k_tAx+q#pzyy;cd-IBGdwBgZ?5=nk<{G6B|i!a?40dXZFNl?mh|% zM8McKrVWPwj_2 z9*)#QQ-=nnPSuZfz+8$_l#GZvV0^8;lXMa58424xmu1U!eHWPff%MRc-47M$idT-J zF=m~5w#DiY(X%gnx||dLeX{~=+`J+b#yaQ(s7FaQWd4yKcVe$5J&z;UgK+nMsyho< zcOj?BsO0?7)gk}=v$0xRqPct1K4l=#w zZr9x9)>lnZotA-EJ03kYv6{(;4fr0LnRn>s5Q>L8kw<#B!zsSf7IS5OT~@cR67pU^ z#OJC_b$`G@-0U})|N2&}8u7l>Yk!r3;}hDWkC5t_Guo0U^9wi>o%HG2TvNaE>c?0H~kl&fFztDBa9UhXaHiS0a7 zPyz`fZ*adp%l&b5=(eL7t7i9+L0wQ*{p;=g*z1R*pt0%cX_F12B}2KEt7n5@0M?`s z7)%mB0BVAh-<8FVc z1L)s7D4l3Cb|H&Gvo>1>QQ!{p^AFC<2wg^I!>&&;dkz@TrT+2$4OLLCGN0Dz^f6nE z8!f`TF3sI*T>0o(QCkJ4N;ZwL zv2MlTyO*xN@c5NJF?8FDSzS}EnKEK8H$q45D8xt%)CqVFf0p7SHQ`evOyO+Kow2>M zJIs5j2?0J*qgq7VRWnXU6TH0UnqBixhnNiO>8Z}he?w6e@LL5U{xQWXVl`APwOrj{ z$zG`%V7ERPIDdZ-Xa%6eeUMU6-)mO{-8{O&_#$3UnO}Yj4}7;rtz(yfi}tVC1N#Go z0JHor1f3C>P-Nb>g0{}JLS?qLdjN3QDzgsV(j*y+<7^DLVt!VUxQQ=< z!UIgLx#ipWKS3deo9I!{ZYz1K0*RdcOJ+3b1;Ku*f__K|!hR9+gjBj6KrCZX)sPGS zgRh^7E!cXNID63s?uZ>Mh))gEW=_)4dWkIk8b(j7#mSpF?lI1Uk;nb!ZWpJeBPh1M zF>tu;YT3%`fI8oi*9-Tj3x$!rkunhQeqduAyQj^pt%{@eLtR6`0K?P<*a@dKjUsD< zJ!9a06;%PPAO8e=)Vuo?f8*W0Sa$vPD-rsh(vEPC^Qo|PkdN=NL;y`mUQxR>PY3(j zgyn=K7j@K_#tp}hpzy8-+-)E<`FN|kPkUFkUka{}l>xxwGMa?DudD))Y9WcA=QvP(?|0VdHH+aRH0d%U4?lUQ)95n<*^0pWQ{QBryAL{W-xtF+MfS-i!%YYu5YEsmHoQJjZpUU zB^hsq*vZ(w+0WB)pVwHm#W2hIuriQ&w5aIb39CgUq5>M}INpSL)ck_Q)qz*}dG_)| zhi7DKi-?y7y;?eN3{`Q!EtYZ>vPR)eH<6%MLhB@*{@c%h5g@6dXO6r2#3aJD|IQ^q z{OSm^{n9+a{-Z*KAnvEHnl6OqDT6k$p9VO_kQJ1&3_ z-pWx+N`IK+c1OJ<+xe$5Bchmm=N-IV1hK@RIX>y1vx;r6;=l=8et`JXtiKf1g zt0k+4$=JE~W^ac3)ODk3v>*dLb^2p4??Zax(GI!wf5Rn(n1mB7qy5@rKe)ZObp_NyG4U1Cx3R)X>4@&Qj0a8cny>#p-nvTiodJNaYCBcY!`PNIH7+Fl6UBl zkd#D~OnP-(NzL+xsex+e{Vw_QL;p_mb$5v4+nFh+N?B&v@~O1z(tDXG0Ow{p6+%r$ z1mx8u%1-p^tDiU}F2LhPlOOBi z>QwdPifB^?lI5r|g4gNS%*J$d$b%|9N3>Mcfk(7Lifgk3A{u02VBvq{GJ$VbhVo7C z)~O^v496cMiqL2UXJ`u|@9COz3Pm>r>#62l(@lJoVg%$U$@G!Dax zL!*g~7-x87=BJlH5za8N~YT7QCy)Nx3{^^f{ID823p>GRE5*v zz%aQ+>9rYR1_TJlmJdo(>N8F_23}+m4RNP*`HJe1nN%q1lSI@N={o#_VpQ=B52Ceo znxsztbd~M0^NT#4#NP|qUTxy%%}>#D!>@b;LP>Qqa7{7@{#}qR$0Gr_|0oJ+2KZNL z8pC$~rOmyUVL?~f;K^^xA!5?Bvl(XqL97x4X}QofHO*)E$^6|yes?@#r*{NK9){Cc zg@-f`1?luoD|}D3&lVZ$p4u|-zOW(ZG?6qDl%7@_1X(y@y6K~86xMy^(()Qup052J z20oY%*i+C;<*KfHt?FyXiDtRIDRfwoUte_yXhIs{Vcl+eWJaR-Pl6+Ql z=}awx@t(9${>3$GmtTfgsUvp0Ebnw9&67a*vTH=8;bC3{vWjq;U$?}+(#@*R20ahk z?{N0a7RO&W;2CgvfJ3 z%~u`DS;w1eD4aWpWXv!`T1j0Uf|Jqg{1T86j1iVKLeI< zn#W&313(UQrpj#VZ@t5_J-iLoRv9vZvp9bQTFR?u5O*cYx3N z7BjHfWOCQe@BAyOfO0> zcO`TYX*S;Kk+r#tp9dlgE+Mx(CHjP)La7#7&sjV8_AWURbI=(7I z9&Y!+@lN_>OhL!n4zc0Ksp1vaDo}PB*{H2se>tTv;TpxH3UI#V=8Xy0SMQ0#-ILm= z0mF#~mi)h8w2WcW$xkb`b!ruHGF`EZS7}JHU-M)%)$kjOUY|YYT+_I9oHu3uU}#4h z)sA>8pkyUOz${&0Wl5Eo!{wuRxk2@L=~j#)=**!Z@XR>OEHIP`3yHugrrK@6E}nzE z)_VgZlCwi$t8mL+^ocD)Ty9#ClzD8H*xFl3A5|L&=PG(VPB;c1oqpN}Zzb>W=)Y+2 zZJo0kmk3Ri8y>W-y(;?daLSU?BP$Ya* zLX|7VDvFEfcq_{Qv_nAtl)EeT-#27FrEGm?5KgNvFV*S_e_wS?O?SFW`(XCdO*RmK z7jRxMcXDD+*`&H<*oN_20r6QX`jn=xG5F_sy}StaD&A$m7=v7imcuk3NoZq*<_j9! zH0lXj(%iYn8{fYdFAY&{znB`5zEPgU$$3m-{7S`GnSpNLyBnX)T#SElnoc zM&+kW21ne&Q^w&Y73!kXkdTsSJG$LKEms3mux)VtEZdg%m9Ej4DT7b|<#Nw6)$xk{ux#SVM5DhVt@;G1(#N_l5h7(!pE+nc#YF8!zcCCZG=>l>M^|dK zu)?hu-~Tz}D3a*3z3EZ#Qb&UC!*61SuO@<8S==%+gR$zbASV(0uPERfI52)*hjH{S zI`m!T-{t|)H3ORr1Siv49xdmU*o_x9Uz1QGf#KHemd+JF(ML6mfk2fbux4tc1|WPe z{(gFwUebnxfs4L0{s)~CqF`@X309H8@1@gJiRwE#XXbC1z4`58__SvRyP0n!TWnXJ zJL(dZB+{g-t2!SDc~$2}P?q@*9V`3vY$7I2m(WQz8kML~*bBtV zL3;4)aHrK1Y8YJML`~e9TvH!1jZmsc`NaHm56bfh@uY%5l6Jni@y2k;u!Z-w-Vd0! z*(SCCSd-s*(c0@l+%SIqesaAS^e%(fzJbJ0+z$%C)F#F6$Um-vY}}$u>IZ>R2uL1Q zC#0NIoPfvZi75iNovQGTOA>~L6%WDDdaYZl_ko&2VwmM?xJmMpxMz~+u6t>KYtiON z8LBQ*go#=Y>EP$;#d)m5AeE!XVyuQE&CUE~F7A4q_)WzG;E+lcPonoN8mX%|>{0)d z7Zoq@9Swet?%YT8SCxf628pLZn43T#lXm~qpv$pGG5~eYtLpRga5cBEKsUB!zP~Ld zyJXws9zM`hkZD!$Hz(hFlezSWr8tn~(T}ENxqjdn3eL(Nthpdqtc(~*f~k{7KUplG z4z$bpt3Du2FPd&f zSX-ae#?dlUwLXl$A=)RsPb(IHQ7M%W6_KU*_dJoR8a1tBIOe!63HE3#2@OE_`sEbb z^8y_o*D1nN=A)$+K_XL#wNSpu6`B7%Geyve0N_gTI{&eZEMg`etVQkwB4_R2HfbGL zn=1DJN*&Idhqv7s$r`n}u~S(G-@m1(A6?DpowvUot7zPI9BFtG*{_Zz_zOnU^)0BL z1+Y5vZ;m_%`>iV2aT?z1l7p>u%E5JMP6PfkQ((8e|6u zV-kGY0DLMYO`pC#-Df}XTpcZE8xy*79ZoLard=QM$w;z-!A7r(P`THHr3yd3#jQP9 z-s)+W?=fA(P-S`CC0-w|dsnOVTE40A0hS~;NkJts{~EP6=Ho4EES2sHw62AQl5eln zC}A$<305-YF}+QSe~duy1xH68IA<4Ie^obL{Apc3$?3oSo~<1vhb15&)C^PH+vQ2Y zEVidMmLf-m+R3nD6fAz#?1cr>zNiA(H#rgH~T+zqSW8+F8i%_ z>0ikSsZN*9Qss%|@wpaDdK_9Gn}D(L?PVmN_U5q~`3L2HHOq3XcahMCRJpjj@b(>k z1}Y>3AH##*x$PpC;pKZoB_r9Cu5G>V)x%JaIm7j{yw{*ZaNg_{!$8t~DTh*|6a~@@ zlk3&7?_tIx=NlpOe?*}G#^bx7Ggkg(zwFfqH1px+c9Kdy#d7JNt=;gmvD)h)WwzF1 z(TQ4;V@CbKG<2(zD5uOvD;VHk=lPLe9Ug!4UZQO$m8c@+0|(*@CcR~L%!TLvoFV;^MmgF^r0N#fb z**^yJ*c2jGlL$8q!1=pHI+<6^C2RA~`Tbjh;BKbamii(Rx&|5!Now- z^D@+HMHS`803AjuSxCD)%}7ve$N{V`?GBFdA@2xBABPwB=iVw&^z!A>Jc3RCaI-S&mfB&*GzEbKH`QS2_^x_=YKG279@M|Qm5_M{~;B6(Q=hQ;8->`D0SBmQ{%y4hITKl zn+m&V0dh|AHGp?V&YZv?2`a!LHgH|iOhSPlS$+0W1n7QDzy3A+c!HTSnCV{XAsGBS z+1sSZFJc_Co{G~usa%?0nF%Q_iRP-ug^gjVS_&yjYjWiyXVR5$Vu#eD5zdi{aOP_t zG0VRR13ayVOTFLee=r#YoOzOyj7}QZ<(C=zW?(O=kA@uu97E>_vRLjSw$)cJS8W>% zI^>xIA6ofdfdOi885S5`Ae@H>ocjX8&wkVjz^4yt^P_m-2RRBq%^*1 z=3G!Ka&l%i^qp=Lq6^YHHqEG*H&Ohgl}Ia_FLRWV@w~!I>e*|?#EYN0(I2#vWAs#9Q*s=BXJw7=E_%U#!yyzAR7KLTMVaNAo7kyGMB_hH_aa|3 z-b*GSKOl@ytgpq3%+X)c>%hIHi@zbm>^FfdUZz@jBBQ$7YB$Pr!19MlbN9{J*0U6! zsb*W`{5TPFRYuLT^`GY?_rzgk8R2OLP~vea`GCiSjg!;;{@V3$v8CURcMbTlHvGJ8 zFG(HC?jE*ymr|z)H>Ll`Vd?SBjsWs9Zw2RRVZus$Uz`kqMz2Gt{BP2U>FC1ZOV}&juPiJB zWWA(x+}nZ-+;}j!B)`63LLMD;)aoJmMl|Q#1E7z#KOq_m{FtQpJjeo`)Yf*F#dC#Q z?)1nekC|BP{Ndr%8Xq=q z=i9b9(o^7lWBEu`{BUV%J>#?W5F_1ID~t|(3Jj|?Mw!X=Bn130=$+}i6PvRMuiG|5y^D6*}! za2o{-E#6j<8y7QnIHnBowiD&b+cA=|X^x-(d=uz5NvKk&7l9f1)_d8)sx+cXq?A0q zc4v(w)JjbT1OcU;7o4A4uK>AGwkmRQQMS(tv^TEscB2vjq>Ny6FD)*6dKGBxFi&LW z2Nw+0hI*-^hzcH^^sUr`oQh>^)yFl+ff66W(5<^jPST31MBKX(zg}Q?YJNHtNs?6) zr*>CzAm36;Y)E@aZG&0xdSppOdYAP~>8KdHKTsBY&3IEFv4C+99ht0{;7kWGAOr&~ z>Epay_CO&xdOX3sVDa6cC-wc5nfnpvBjjLDfYilhtV5Dm7QQt`4`X$$v%c=VMX{JSNDmp zO%hX{CRjKZV|6>H05bZGz43CcKv?Fv0xSwPSbzcPiH}+jrT6)OQ-+c;e)GXXe-!KSZ5O{h_rs(< zzTpXB(xz%SO-Z=+Q|~*UnUf*CK0G=?(-0PGhyIw%E~t55O8TbFO6N&T0pi@H3P4mr6<481Al#0$=^vW4Zi zZyI$F45D%YL}jn{x6FJqfJ@akKkpcL&m}`%McDtm@8d8785+FnS(RNcjCsQP4ZY&# zdh+0tVb(V66qSVbr&iv&TpK`jvRHK3ph`%8#_>vH6g|GdG#s6HZg+96o=$;zr4cA& zT~{CQ6*J*7lS|V|t806AH)2T4@!oQ0kGg)e^&TP%5IYY!`PJ1L}1H8TR1KaU5ox% z{iNKHP+dc||B-YK4tf4<6mQwK&1Edx%hp=9ja6G%^<>+&wQMchwp~l_-S7P$?&o^0 z@43!7pHd}x&V(Qp8OnTU*yzIyNK1-O?USNmiI5g$#KU$9?Mh;h^`!OIZh3SLQ*#BW zLxl8oPQ~Hjuu-rNuvu%iUN=PJPxagf9qw5vo`@-C`^4uL2&)dx&IG{m6>;N1=>6gy zDB_Hvz~5Mgl#i#CwA@)B=j_Zk^0f+b!p{Ro&3CC*=Ca6BrWUmp3#6_Q?bS}*mTrV; zRwQBTaE|JJ@Ef{U^c@+`-~)zDiW!DJm9zw%Jmz3|`k$WAu!~yXsQ`M%XG-)YI!Y>c zxRwZj;aN|t(Xr3 zkE%1DZ~{~$yR|?4b7h*ATxnaE%8ct13+%qARuCCo?<0Rzk zmOjG#VC7X+H)|KZNx8Hh|8D8xNFChOloRo0wy1l}-9ux!EUhC{qd({f5e3p)(ubshI0e{WT$w!Je!HTz9V+omg`>J`XKc zUU}XKGt)5u89YH<<_SD<$&eqvJ8Rt%O2ceZRoy=-=y#p-QEUtfo0HX>B>NR7>0wK2Q zv0ql5eUa~-k~i0oU$?;OHI%4%DrAZ#tM;k4b9XB1jc4VeebB}FWKomR7*RQP8p!Le zCoq(^xu%WVqLdB|@JdinvyTMOqYGnM2ZVhcdo}+)<&hkAlwOnHa9^d}X4}B{_0&V0 z6<3KkfmnVrlXW0$EVto%6P!8uG6@Kl{&4p3jtG(YbLaoh2~0J%(ZWT8+w+Maz3m^P#>DynhbFCSTu=Y5 zsoXwdi-l|%UB-1Pec*kTzc}L1vqAhIE6^wox(nI z?#G_=>=8*_>uj(w^eh_L$+0MzEbDDw--lu3{zcK%ZpAFX$iz;bxmh-?us>vdO=7yb zU$J)vo}fAv*vhv9@huX?RDRXv#7SKvY@3|}VT*4tqq;RhfY;=4|4ZjEurdK*PJ9}L z^v&%acDWc`$kd3GMC$w(-OVlTP|&(+Hm;fX<1W>qWxktM_AXD=8_|d zie#LGTpqo2!xfE{RKJ#p84a8459SUh|K;E+LX-SQS9=uRV(~InwSBroj0RHfax18y zV)RhV!WM;#7ru^mn>!BOtd7C)JU+R9K+!Rz=P(QsIOcc_-+7$R?Wf*~gIk~v^r3g9 zexpO;qhqR$fMeckkz+s-nqb*dwrhJxd6yPGTTSF})}qe?Yy^JMp^Va^T8*YhN?re} zrQ-~o8(a5Yke}dkE3xGX_+#&C<8IOk zJ!b}ZrY5&$v3Okv9%cKT8t64P^xu%Y2Rfz3Jiw$g!s{GNpf%}o$cLkc_59YQ&EYgK zywhnzYDgq?O|NSjm*eevl?j7UM=y|$FDyWk$C#Sz*rT8)vg0*-Ht*cL%6h|#df%PE zU2Xr`*y{ZPr$;z*STW7-7~9ZfU-xf(#l?Q3Pfs99phk3EHice_I&qZ;-mzPS2aFy; zE`j3D$z3o>IjDhET%>D$53k=qm=%BPnqpcKWP z9WvE7f|?h~BEHQWKuu3Z&uC>$@UTSj+x>$5WohE*eH(yb`Smzh$Jy`?bQtj^v!R{c zIhSX&_WuiN;&!~UO)WbJ!544}OG(ZT-w|@tE=?^c5^w`7$!4vjlh> zEQpb?BVz4Pa{mw{{{&(aG}f@&jR{8cj^9tSpX^P~&DuBkOf+Pn;e(yb-dyJ)K3kTD z>d;tndL7Qo#Gdm^pVPS!`*t~;d|I-AIRGW4qN-{1$4&iYn@E-$3~y{Y6!;;2aWB8z zWH;ID1?OXgb=2r6BVK|TL<>J<;n-m^t-tV-TT+7c5Vs7mfVTcBDS`w2$&Hkm*i-ys zSVu2$hgvnC_LaSS)wZvRR@oUmw(1|RV6bJLzLGV%O_?LI^;!9=bP8-Jk_!RlKBQ&; zDJygWWihRPa5PHrVlFqAJ(^~`2_N5S+j|F0ce=y%N~g%dG1l}Q)<&$BCG%F>TYPGk z-LqTR@%o5hBgo+vENoUk;8YvL@H^#`5oQS+hnl#m6o;!^DPm#u?!*^7Kd-DozuQ6n z*L8sE2XrZLh>q-7PpQZnZzt~`^8zrb!*3mZ$6wZST%UQT3T_tT7)-`ESkwboJ-;wB z0AgcU(aEv1qxjt@BRRr`zCGNmzO+WYJ=Q4O$kt>)rj!dxS)&B`g`9>YKDoRlrm2A* z8q}r)WB@suw0ImO!d@Sp5ljr@WFFlqa^%Kg!pz59p09f0Ej!rAUDAiDppzY)r7zTo;lT>D;+(f+t{5Pe=hObYGiPo3aN`LU zrlZv-0l8;2E-ht-l>hRtlp;P7!r9c1_^Is0Z7FW_Gxs-*WhR}xhymQIROVdTI<&ko z?^8kFtgU?kkd4b{&+q+O+TXr?@Qw94eKR`W7T$U7J72kq6f(SKgcIJs7n3E`Kx!l^ zhduQ4JyKV9v=MnfU@3YEdR|jD*{$WS*%^oP6pE@2(X=9R2^BoO5EnWpTAbnYUJs`Z zY;qhb(W(bQ)V^}zilvWbt5FY=kq$ROZ=pylzibg*uP|wq)nET5B(?0YIcWa(FK3e_Fx`%q zzEv_43Ca5xx}|Kzw_6@NZx{i>IPApT5eY?z^9H)y5K)o+%WRNJi1HzAPd}VET&{6C zh&I7}NhxMP0v{)xXHsfuWZ%IwbnGVOEeI!1?Ngr~VQ=R#gK`53GB~PPe<??@gi+HGm25J@AUWzkdhvG)tmQYqhYWvzq2d#IV@V;LRa5+qaCFp|ae~_OGz?fNL3)@$5V{#VL!bJBmm$@^ zhckBmR<5v27;|ymbWu}OhWYIjKJWZZK+U%Qx%R0?OO;dC+^RCJn^wd+VBTK? z+uXT!iaMZ(gnhMb(52barX@?o%BzEbLWqbEl3`1NtAXab&|~eIsQW;-cpxg4!R^S%I%Exf1czi?sJp0e3VF zqIk>x*b)rpjrA}+jLbu@WgYeE2J~d~^6(t3J)HdK`{QWN0g@Tqy1c(J-Bj;W{Z3oIgil*@(yg8tC}WBf;fs ziaB)6Z|r`8xA$Fs*xj8j)4ulpsktmLj^AiLSVl`BUxh}86GiQe>R(BT#H6;|qUU0dIkaQH813Hth{(#Q)X zW&lpTZDBqEjm079wY5ujuoNPR5c$akaV6(jQizRv(%Hkt&F98iN?DauoQXI$9RqTd ztPuAQ6|c%s%H<{ojiOd7#T2J_#ccyu+PxsFgdW(wTxlhah#XTR9c9s(zGRi?tK_u@ z!OJrtzx#vRi**W;h)5yJFr!ok>kt3+*}bjChELdd#fdo1gi7VZ5CJR38K*kDWBj;L zMW>ni^i}*;6roNr@mp6(5k{{CVI2SjkMM9=0zyaH>kuC~t^M&4+%GOQ0 zC}lePGm&YEQuA+j5Pc5nS2}ze`g*Vu{MI8XuY%6)Av=VhR7(5Ahe^&LYIhRDt!uZc!n>3HE)11 zVJvO5W}0kjf6dfzE?b7z;>kUptyAw~Q|*!RQxLuWQ>`&8D$n9=rP7kFwodcw6}1bS z=IzHieM%^TE`c$809sHDh}#N{b0RkVHx>q30n+q6{m1WX*;kwkPYL^J)EyZ;hZeXZ z@P*XH$FcUGGxg77Gw815AB<-&EJ**6&yUHK^Pfjkj*m`(4zk;ncCc_F9HERZlxEMd z=v$-|mEdizArx_Mgw=wP_#^?BGo*Ii?@D?-8nx%8t4t-{dg)x?zqfk&o;Wg~CQLpd zZcUYM6#;puR=3gDAs{UxNK9m{8y!#O**S3@43J#iTX>(+fPejE)9E>4+5n4*fh%-2 zyLmJf4aQiQ`dK36gx8;ggWXoB_!lY|bn@kxbRad$jW^@ALJ%Ec|BbxlgW%3p)(f3t z=R1U(&|6>AJ7Hc(^)x;PO})m#(YH47hhue(&MU5pw1p6+j6A)w*aB8ntW`hC`gbip zLnyE)^SmfrLZTzC}6PPWHW>`2M;*DjAy)PCRh9SNsU3Y*kuPF0Yke;=F%6)YUQ zRN#O(s&2?vvW7&Cy8O6w5AL7}!KFGz0OvY%?|lIjjEXgq2$*o3s>b&-H0WAZ$mj?F zeZv-6z$o3@$amiQVv+7ku)yEjR~WAyngP%Cg*(Y35rmO`cxSOVDL83AhLyQT z9o&PB_zQ6(X`#hN-lEsXIa8CyjTN#ewa+|}g0L-2h5NJ7;Ss6u!$e*D`{<^nX$jz% zLX`$Ql29Xs(H)`7bL$omMxJ_IhR5M>MrTE{PHhe74 zgp|``-FRKbGxFSD@fn)zr#d_%9=CZ+d=mIsuM#GVOQ!(=kSQsBFikG@hIdO(u4l$1yU&*?y+=lBwcmgIvEe zw0@k`70%O)t~UFNsfb=6g7H8Qp*2%}hdYV8J*=3zPpGeW6UrZ5C;1WtUPgO{0027tW{{$8AEM$0li`>8a7}Q$UJ2zst z#Pd*iRQiL^svl-_!~w4S^G?{#_h7i2EGGN@PXSz@k6z)dAJ=fN#)=MPB=$3YF9^By zNW#pvF)qwGayV0P*~;|AR;S&{`y`7v5U4P4br(yx=Hnf*Igyhn7F$^J^`eop8kg2d zzH_(?4d&XMa6HN(7HTDE6=DyeFdFb>{I9%`76UZW^N4HB64R$shvid#*Q^2NS!~O` z+e-|lSJU>bP=%%n4@l+-}a_sNsmfey$lW|Xdyl&w2MO&NIp6h$Z*Sf(-QJ#V?k>6I}R4RvB5@A6rri!;c-R<%B zd}8BZ3Mc@L0uD?^8|`1O*p~ga1NWEV{s2|C_wy^|ZO&o$5oL!6=Cli5yOw?8JcS7b zwOZvji6aQ)cv8rvZD4D~0-vb-8?nE^y5a8|`!?GOtC!&J+&Q6RJ--!&yEP?atCkNj)F5eG ze6i)Qtg@K|KE(4U`$@rPrlaAs$rfp|`5|ZdMDtzGUyN+krno5Zj?@PFmC!G|`sEN0 zzoks6e>-s{RcxN#EZ2-jE00fQID+tf17L27up^Ols?=eVY($_H)o893_2BNFYfxgn=b zuP=IM!Jba#0maF@*BYcL8GqH#Afi)ow~J0=s}zJzQ_Hw#NM2Az&;Vz00h6}pa2wuTQWL6p1ce+8#AS}Q%M5@25ORf@GwjM0Nmt%tGnicHVmR`9 zr4)wkHjj!lxtJ+PYCL)drJ5_}=@uP@HYrZ&;TXg%D4KL_|I?njJB}Y!%4cosAaEDN zvB29t_|R5i7!kY(8FUxIymN+HKt33aw3WZL6#;-2m!C!~91HJYcQ?$dSC@Cm_}@52<-y`MZ| z48O++$kRzrQ;*HVuf-i4+Ue!AJ0=Va$p0NN&38={bsvToGefv;%l-`ChwVHyXH}bx zqjP)wBkxP4%_|!MqJJrFn^Et$<0C=P#F>i&L}~qy)#+Z!7~b<=$Up&GU8~Hr$G=q7 zYD(R76W{e$*3c}aheAilQ6IMZTOE9fV~8wQjAQb(u1dW@z(wJg^41AG0sjU($1_rJQ+wHQ(hARB z!!cbYx}mzeW=TeJ+o##T5}dyz24nEBI((JN`MU}s)3qinKK0S*#sAbMvt_`ylwH*) zv#f~b@J`MTQh{$$S4yNh$3 zb-7j2`QP9Y#Qm6K)QxL7r!I85L~7IGx2Wc42y?-{EjR>y)-r1C zrQM~g2q^0m8$qeJ(Juz~*Fu#tsafpDMP})|;{*>PF<13-&+WNe4pzSfe_h?U!0^(3V*1C=yh}Wn}Ya z3cTO=%K%G)_X)6tY67@1g8)TUR+Wl7q1Y!}#`UqkcDdE>%uz?O z4YsvGpZg25avU97ikCq@@%r1hB{Ldf`~nUg0XcW5wIh+TAXyc1475;GiasV9I!W=B zm0~GH$A_%wjh0b>W`O(Sk#*%kFz5Y+E^Zj?8U9Q_$9kJKca2ZPeuw-+b#nek9dS20 zDfktyO0}3Nj*Yr5vF$Tm7`kR+2tx`{?5xX5>D@(xyV9Eq-zssSlA8Q?$^A(4IOt!8^|M6 z)3u>w94eRV`3-;Z7OP+>ot|K&YC<2AcGpjm=JcRU>HB?B|0ZRr&9Ei@YTy@P+Qu!A zR%FEXRlIL3RE`|IcoCjb)P*3F^t_Kl9whUpZwxC|BZ=FVb=CK;%WBaNs8a!kpQg>N z5-H{;J7_y=-~Obf)sqP2wX{h5Xji;>;nAT{5b=fzE1X30TqU=59sa{$!eA}O$H0QS zNv(QnNPY83t7ZqTQb_b4MY73c$SV^rs68mtr9}PrAUvu@g-A|2s zgv3YE_kkVSUC``u_!~6P~GFqg?!ynguljXT-5!8`(4hhzIx&i#C7AI%IIPXm($ ztwV1nfBB&ZxObD5lL&^PhhYahM#6rT`$gwQ`>~e3MsMvr;Mx1ivJyd31nfYl)8{Pf zR}Fp?Ho6?4|G$XzcQ4tRT@rWXcXNXR604q0EwlL#)xYz{OD9D2H3^fwgf#7TGJ|I2 z({oAC7Wzo)X2l8$hROg54dTKhhd&aOaHxh5 zb1MGZC4YZnSV>Ii+y7pcEZ+YauIAHD{syT_Fd5?xJ4H=9K+^w43@}WXlTybn!(aaO zY&@G$Sy+jbI!+~fk{QNLjuIb}mSG05S#Tud7Nuzg(xT;JiP6Z0PGegF#maTww^=>_ zg@{#xi`Ol!_f=7gb~Jr>2*+c|<*$c#+I{b!3yDDC!!F(0Nm_lCeu3vXc;TF6pK^1u zc<~x*MmJIPMUcr+RbO z5N|e>G|?N!%1uvuT2bw0Hmt(Q;RuK)$1zu`Ji9^|Xs4B*QVt}Q19Y*vqpJoe?XT-3 z)i+a80J}=p>0i}5_8P&0^!!4!0amHQrYwpPT}cC!x^<|ILuJfzYMIHqO&op=vxo9T zlHxu-CbUE@M@i(5=crIidU<;IxIL4oEY^R!#3=8;BJq~jY4Q-)y1R3A)%cDp7N75; zm|?g#qOMW-J@0v*5r2UxXCfo_upy-|23Q|j-?@XG{kgR*%9LTSHG(-c9^|0EHL+Cv z#3F(WOR*-}L&keP;8K{<*Di{23#Ae<_jfkdQ&zFD zj}h5=CLA|}Iw8zMlv?&k+UiSPR#lxQle86i=MC2p zMGv)lwa`48#ZC$}7A`rPITk~S-weNfd1n=vgC^n-eEp@3U~so#ADS|1E4VTH>LK3J zy?J=%x?%kj-IB$PmI&5QN}0nuuXG;g-yeR0qiL!S&rQMCq~;$_Y!Q+>@(z&yXmY6a z20o@SnOtGhFF$)vhA!ORPz)Na@81sqn{nISyzYl@XUjplb3;hb0IJ$ll55$d%`+;$ zL2_9@!oQocO#Dw!F*Irb_^4j8s^9`raYxF6qP$f$yhxldUVP*vuTFL-v0(BRr-nEo z_sK+3*?cIK<6f7G&HIc%woUOOL$1TTVFLA_^$oXebsuG^OzI=X2(4|Lo5JLw9ct0H z_-VvOk{Cs3K||k?P5AiAe8RioB8&mP*6>V0D!(_vJDapy&#VMP$ts8XFA9JjW&b<+pcb6novI1f9tM1AC^HpU*t;husV8$e@K?3>{p(Q-xtpDgG<=EpJ&b(8`r&2 z_)-kQMF_;0&CsDiu581PAb6r^>!4*AlNq zzL8v>0-b!ZO`i7IFDz5?_{bi( zz~6bKjH8)xOxn5hoqA~Bl3psX!gC!olzD?Jf>r(1;fpB5X(;ix&BQ4z(VH}6c&+o- zTw|X*4GylP!rh5G*)A5A(Z3L>U}Kz`1g%^HaaNtx$Bty` zcW%B1ctqHI3&wCRcA;1ibI3LG^$>gtsLU46OGV*dvbIoskms4Zv6_o1! z-Ngq{V?;n%{h+NhZTO~jzBavcEmVHXn>hk(1R=R0wVzoB+A3{@J7GCDr*%9(o7oul))wR1F>#CPbS^WEoswWZgER{-1I8%;{^jD6ixINl9t zV}VYUrb(9ePN%RDZyXRTQQ*6`^^|3V&Gt_n6`ZxzBGcND_@sAr?-7`oC${p^*D2+Q zT|=c6R@|<`Ak`c9^bdmG$v}sq&QJA*QnUQan6T%G4i$F+sxfM)&nPH#N=7!m{;&^8 zE>CRs6#dJ}DZdR1o{h4J@q4QeA-R`3^xp5iQoEae(B z7{@J3ctFT!cMUN%d!s0*95g9uq4F#YR&4f}u9${xU+$-sAP83RXv#K_;5oZcF_{r# zG!P;QZote#YkfG+-G)Wujx%?$U!xSPA@0h$Tu%7D6K{Opm^+7vn$}=-#sJ3<^2ds7 zntdP;IU7i4u=0k?{>COXl@>QH#9PWM3K#4c%@cY9?Yt^RH^aL-c-->{Hvpa~C?@Xrq3{IpHM7=v*#cxgs|Bv#0ns~3u*Y3` zaAzXqBTf8?RC^wxH7hh5Kr{(CAS{6|{#EP~H7Hcq7N3Ek-s>Ch7&Z~i*&3@Q6CmT9 z9~l>-2pT&a__zta24>Ji;YL7zSOw}||Hj^OQ&~11Wps=jKQ(Cy02|wYdhR_mdIMd* z61Th^XUn6|*KYQdKE7u4+y~I6^cU-$wYvRT;>)yk#M_pD@B4_K%^91W)<@hHWt3QG zg(u|U=?#CVL*(P==all%d}dpm{fu#EU76Vc7TTnim@e%Uo-qms&s>rIzbMBu>5^wB3 zKJm+)EU>0u?*@Q1#@N<2!v4n&!OPplyC7g;Jm68x5;Wx|j5U>#55TcWVJEW5y`!Pb zz&Om8m_5u1$UY_XFD4XR9DFQZ_BF}*oE0NtU9_Nrv0Tpe4dV?_<}@dlkQmZw-pDqz z7JJHhU-lcHcuD(y`1L?8*cjS6%HMJz4#F|`W; zV{UzDsA_oVlIIIrUdABij)=ps*VC6y7plDBpC-HoJY$w9?Dzq6mVTm6Ti}1DNa>tX z>2v37rcYg@`G|6lV859}Cv{#wM}z%b<}bpH9CH6RWbiXX&ap87!=8^$r`_Q1Io`za zA#}uY)av;6$Q!mQWbin?dKSwdHZ)$4g}4AZ6gB1c_UFn=(c0QNdDaZ#m1fj~A!vw3 zp|*ewGjW-4F4lHRGP^?Qe4u}5KM;LnL|Y7MJ>!w9_*n3BaJjWb^=x$*cb%==%i5H zn4hjN{0wou_U(EqnoWp*0Hm_+%MWw}@)Av(g>isF3Zbl=acKB<( z6PbH!?i+h3@0Tb~!-~E=8Nk>t`uTYPutDMpKI3N8OY4;NDW9Ub5`oMS$??;TeC_ga z`un+yn;x8tGuZw3zd0Ln_oZv|KX)xnvyU|RF$P6>!S_d&T4w+){6q9h|W(t%DBJc6;4rHAJo5MH%q zG8I!IrNaNUy38w*MnKOe;+jg&KwGxTv)LKevX+*En4S^_YZ#q@V7`qx%o35uv#IVj zB|MaRg%26`&0n_3Bp*~RjEMwNQY4Mwh0o3gBIr9S{@h=KyVhBtXKZrM*Nks>WgHNA zJJ4%!qYnM<=^ow>qkMFu8IJTiWosM3W8jJkvm40EGzOGl|7ee8n=vX>>Q5}p3l(5O z2Pu1vtD(u4a>(0SSc%cY3yjsglC226Sz5e5G3C)j(bXAeGRwv^^0`c8n(tkkYHWCh zosXSxRO$(5tY@D#_&-NcU|h*zS!ItP+^Xp>UzeGUE)eRKWTYebGkyhKLAt@1@cDqc zVbc!uT^?9KY{o2>veQ;*UkGUP=)%&k&bd4-Yj#*yP)M$CyNmdJU+^ZLCveS-L7El| z)9^;dT0G972?!h6-fwC71Wl6}&T>1h;yTT2J)u47c1rAB@;%YTz0poT7cbd5*t*aZ zn)h=Xu+0(ru$yba%%i$Q#z`s{;X4EYkW;SroZ%#({dfM<=Ix0$QW}p zjjV+dgiQ#Iz zY>6|Y2dKQUjSELYZy{Uz5QTXeNeZ?&q+*9FgnUb;|7Ka;paPDP8)nQcD=S2n0f{`G zi_$WHTRwCfw}M0C_4xG!eHpcOIQi(D>GpXYulTbVfyC~CVL}zp({aiPSvV5U;RV7O z4syC={APM~d;w&9?ai(bSFt{V&p9UJfs#&M9A*KMQP9yicE5|0%_fLjij}zT`KYLP zh;-c1i!I0dg!q0@b5G^H)6J<3}Da&h2mS-vW$@TiRktVgQ@Qe)QNa#&@mr2SI5k& z<1uKGmTWQIL}(KIf+^?b`$}5Rh-Mlv5O6v=6kjZ`Il|V_tW>hXf+37`by~Oy&41$U zu+3?gzL`FND`ui1*DA(vhQ_HW&3n=p!K5PvI{g=XC>ND z=h@J-Tug^SC}P(%p)HH;sJ;g|CDNx8CX{1_7NEXtU7627M9w2Wh#Swtlv zTf1Y6FcQ2DT2f$_BQ%bUpVLUoUlA>cS!n4#afEfw$X4-A1clrLQM{edGbVTCegKU3RwYFP9XVzV9#{uLo~FBQ{>A-s-D10R3hwh5n2EWUFVu?zQKl zR^BPsuxjtD@NYm529yF$r9ILC5MdH($*I(*-gIT}ZY&&l-UCwR>bwtU&{7v)h_<&! z&xovb{gti5JWt^atIB@-4%|+LEp*z%lGj_{8-R=9A$v$hVQzI)p}R1dwQT zIqAr_7yL%`u33)naHfv@&*BNa?z}__S%PB~x=kJ@6-^$`XHA|DYwkyPUfc)kkV-*d zr7sVoPtAb&#j!2!ochvFZyf{y?S|?2@7A&dsFJyE1zuwOUbi9q6E*YWkhW3KCTOy0 zF-TeLKknfo#_8g@`gHR0s3m1+*M-pnX&T_B4b2+&&df`zh2NAKy!03;Yl9V|;=8nJ zOplH#O@CR0S!^KJcM|FiFn^a@;IyV^Fhk)g-UQFBhx{R-3?fGdJX@^r#ztyQBJAG) z*Q>O5k%h~`l8;O9)Vb>QkL&4m<2m$Q@UB=zDZm_4bK*2#3&*g7=9nk5HG&80l?;^& zAzQP%6lhWXwXIc*7uTqeXW)0B)DCf@aif@Q%ShO4&1PdWt^A?55>K&vb z*$JX~CGn=1#99t@;;UKuRt2F~nx&XVftpe6=K((8#YWohLd?@5yKWaPk%~y>9I02n(Nvzs$9IOt>gQQD z?`u+EB~zxOYTlpjoIE|gTzy@^SO_?%W>3osa){)TB4THVwCX1|B>gg6yw5m9n(XeTqYK<3l9)K`;jV^L# zTvQFI?t5qT4kkPW!7!e06rm5+edL0RKsg zjukUxj8;-tt`R69|Hqnl1{1$@ICLLO?_R-Vj0iv_KNL~xg~}@!ze||aKdxbRO<&9A zz&%u5)Zgevv9mv}wZD}YmOZRydZ(p(@`AE2zqF_P=>M!PX2fB&z<1KDoqB7%W+l3gG`hzvas_7@I`=o zDxf=i$|Bs(DAhK$SnP`xdI8b4S=1wtKjXSkl^fL3?WkAdbAj5_lZlBKb~8BsoJU@? zbe==1_+@LPg zQ3`3Babs*~RzNrq#`X5KL9_t6KnK?~w$PcjV$yQEBDuk=twn|v&(l3@$K!2WIg$qP zd_#(cHJh6=W4hHR?(kM7R(gvg)97;?lka-91mT);{B_b1jJy0!UIQzB#IXEj7w#_SAKEbIXckZ+caciOOnaHct7 z;cgLkcOul1OOHc!ue7C&GRx@&3;r#zgvWCYg4)o3f~HdI=knaQ`5B6;YQ65h$S8J( z>9mOEc$qL!F-HLDDmknTc;2QZjctEOFDjLjtZ}C=g5_(Tj$N9O!rSRMl}MYQ1p!|F zh3vb(pX_poq+Fp}qcIYTUgEr5kAN8L3*&x>6 zlrmB^-b17q+Fj#?&kg&|)C0;>RbPjoPNfd1?( z_Nqd}nZ?w1yIRYptfdd$O7X(>P@tj!GWh!344(m8Gx1RN)i*JDoGkNIJEWSQ@!3C6 zo>8#sU&+p?jXva;y3>0am0XT-Pw4_gb0vKFKr%KEw=G(hbZ8v5GA4!ubcAv9YoHBV ze*Inzb^^>V!f|cTaI`343WKG&KrHts!X+0_!(NVR*;n1%LW*mVtO0`%V)Mh*+;V2M zGA@jbW3CHXp+oZ$3c7FDckXJOylO-iWg?E~;@{@l(o5?W<5?#|q+P>8kd_A?C!o48 z(Ih7rpG)0|Ldw*#f!YHM3gJfc%+c6Hb zTQ8Bza5_c2&KI(sL&J==AHH~ zI_sz^Zx;-kz}3M5MW64-d7FE1e$jjDH5k%h<*)-^LU2R5{gR8(rSHLh;f1cZIHxahQbj zP7nC``<+PENCt2S|1z6xP)@Oe_iU z2;{;RQNpHBqwkp31yduN^`8(!mg;CayT~lMbHsDv7ZfME_3x^KMNA{N%iW=!?%e2U z*uTy7tJ%R75=uH&EL#68amW?+bf-H*1mZvN0oY=AIsx!Vtlzfh@$k*RZgb?U=^7tg z4W0@<1$OUKT$3X-{$+k>-+#hfaF6$tB&4yZpuG+!pRi8M309x=Hjn+m(svKTl4)=a zZc8-cNkd&Ui#X!K{1bL=6b~JS^8E(G%C8Euxyxh*zkn#0BNlhsE(}thy`J=#dmta~ zI4`-oH#mN27J-FW6>w(*)O62F8b4Vc{GD3=`vwMaa|O{RsFBU^?tb2%QcTT`kK5g} z6B;s;9O5xLWUh%?fyK0j?nAdzs&0O7#EKmc0-0}{Fmi5g)%~nE3$ih8e_SRq%=eDf z=K*J7bOAxtWn@%Mc+j^Ex1YW5nbm$OA%&n79K~nQ;Pl$?k1ET4Nkq35NENG0oj`!)$dqqb+*n`Zf0 z9+?%6kR4*)fiNd4qQL&}4KOG_l@85_T51tZR;?GIlSyck9(B4xlI=__xI&!?of<9{ zjr1F-7&d0&#Kn=SOzAmxz7$8Q(l|rKi;N|gFv-vXo-8&pd`9>)%mVCkkVC1&GQWhA zN(=`tWky^+K*X!>bvR*-yE^~cWQuM6YK{6eM#`e1rmn{A5n`ApI76i%m7 zX}#Kl4I6Vjb7|(}xL^*lW$oEhO~SJn<5m)VjQ%8dtO5S+ob)kOnT3#$y3OPnw3%_l zZ%8!Zylz}2&{duJZr-QL&rwG$e4ydv?to_tW7HFF9{edLd$jNTQsNlq98BP*9K0-Q zdRo}>{c14|+F#>!Z#_UOcr5MiS#N;V6i71-&3j+4`o1ArpVhEBgUQ9l)-T^O>6zRO zAZY-)qw@{^aFFv*sQQS8D6u6QRx&-e>?*lx0e$frd2ufGK&TETf)L1G+-j_(_WPKa z*>*z?Bbo%IzoS1BA^m8~6f7U1O8D;(#;8pyFVcP<=6Sm99-ZrJA3w}!O8IHGqy*I@ zZ2|AN^&}8728xxi1HZWJ&OK(D z?(;uDfB2u3+SFh4>R+Q%c_h!5IA?P!M_!&8u=5a>OolMPY(!Ysjjmsq03#^-`oC~; z0^%q9l6dk+W8RGagh7IhN9fMimCi9B&J5T`g~iQ~g#nMASmGc058p_Y+6&Gny{88t z8}bg0{P*)JlU{Szzkj>~$-cb1{w4J>Kx_sAO=FBl*}`3UcsErclT4e3 zAq!Pqlyl34rWlmFl%RLKatdz|c|e3GU24}Sc4V|eflzIk`{?)-E$Tt8jh z7wwjc%Oj$il0CI;R*5~HxSO|i^$Ud@bLZnqqoTkrPDdGe$Vot}O*KtQ-%W{%CtspI zNpMZ76;6&Ff*=*2Q0(~I24#pu!0_@dnE!nX#q%xhBl}FrZA|ptqC#ecXqmuVtKBVN zZlwue{YW}(eNNZvcf;S6jG-H%`bl34Tl#kyA^op51ACWxyRenWSk?wv>;GsvtEjlT zu36&*5AG1$A!u;dhT!h*?(PJ4cXxMpcMBxATW|;(w@Kd(Ty~>Zy&{ zY;)ey$;{*@wVfnkCVx62m>7bx0pXOr5%e?n;7r+=p-oLuZ!7WU)?NrrS{0%MQMmI> z?u|rj_1;IuZYR6>)wT%fU*jsF1I0k**k1U=x=uNzeNnEs68)k(;{keBsO3P{o3kv! zvwv613rm)O)}MB{J$+`$p!f4Erv@)Cdb9gB@07rH8aU6 zASdlZ{+Jb@#J43{TeXYIU$J%scGH`lrwqPFZoZ+Wja)qH9zp)e@0367C)FY7Cf!4J zb&<56fS|_pZiqLqQ*rI|@xC+Eh>LCg-TkhV6ceU-N-l*>*!-0Q*G2MJs@9T?P?k!j zPM71hqP^$#^ow-~neu0#5%pVNt?uDdB6IHXnnnW?`}Gh7*MTJM4CJ_gN;J(0yNz|G?E2s6)vj3*?u%g1_lY zf?;mtKr&$~LZx9athTUxkK`*CEA;OVN@y61DZ27eNLoqSNtC$4-Wpwjpb$R&V=|SF zG-V0trf*m-G%ww+CmD?VdALixzOJfKWLOC`nu@Dc3{#=JJHcwX z2so4p44ZWp-OK5$m%1BFYcw@IT3MjuvA+#`cQoc4h#mz@qnGEBsg4P5J+$r`4r)tbq@D}nlpQ-H~rr$mP zL>l^8v-pV4%O~;|aRz~z9bhMXkwOEuad2xrBzY6DBImAlTst2Q2;J^SGT!VnV&Dv| zT^D$(O=I2f(Z<=NKc(bR5f&WMZWM_WA$G(+A|;MZE>~>B6e-&yWK{M~%Cxn#NH5bA zEEOwnq(8;oSO^V0pzfUsTLr(+F72@BrpZqywsqUeHy`Hx*;ijWOCJnRZe>?Z0u_dJ zHAcB|W(=L+jdzq_m!^qF7A=_`jZ-1E5HS;3&z=E}x;aqR@BtUgbRK>8PCJJ_;*2{L zx_ua9H{Ev|MF!r)K~wATBjiu-XakMu=~yba^V4SCBJ!*Gq6T8TNZ#UbzmD02Pbo9l z@$&ghU4cGNcdJBiHs0lyJV$PW$4AuXBW933aJjiyqGOxMp*(S!tEQxtIxOny+mFlJ zP_RB{@woEe;32Mmy6rUtY?SHNwx0I`%rQsQQoxc{l~LF9Zuz^a-9~}W9_@Gt>oI!e zeswS}hfH!@q`SP>p*1E-1%Y*C)uH1^&ueMV9I*r;X{3LI(Iy0Wzo`apG)Fvaw>?fV z>S>)uOs0(e;#4d6_-VJAIfhi@cdG;Pjb_%WoKCUJzwDY;*mKn`*6W4#G)jPni#jXc zS%0HI-$AF&bLaOywB@k$!UT!!z#p)zhL(5Gs|F$XmlT~iCkBjMWl{gBEW+E8LE zfT6Vgr}PP`x(lp4c=tDgxvDiLdK$gc-a)!>7c#!hlBRODJb@w6x#>XKQuA-4Ub{;j zLplkt25;mr3R}65+RxYv)RQv5WwTn%v6j9_VLGhmrE*AV5hkd{Qrr4}O1$?1fnS;jlb3t#P;Yj&AJgba0sh$FEPqgy|1}0{MnVkB zRJhB6ZYrnzuup5GzKs+!QR4Yof`G@!)n4q1?>k@1h4a(kw=xJ2xz z7Zw6tps`e@7mNWS;f*J)?FDyZTH%@9tH#LW7}*iA^1y7UvASQ#7gp7r*8o8vB` z&!d)~fu!S(aF7ZNXIo9lIWUs;lhWsN4>@_lQG?Cr2u)Z2<)?NId#dSCZCP?uu}oU# zU2oNV&%m~-hshcvDMAo03X>?>l<+A5py!8o=uA-&v%1^oc5RIk7ADFvr+;<-`?&Q&!`vNit>y-4Tg(3Z;w6G=Ie;L6_LUC^oM`7&ut6sLrrTr;cyO z)$X3dddhk}jDs=o$*qFPC|{w61vfTfqm7Z53YJBe$@x#!*A+A7hIcZ6_IlV-+aI(gb` zsF(~_mRXKNN;a27M<84ZU$<`_Yk!YquiEU4-(%>0FZ7JxZ=kI=+UXug42LX1Hg#kb z4>&muj<=M6>)ArLThjZ2Ela)7x)h_HFAF| zZc-55Us)Z~yBDph9KXo>5%z@(3+KYfL3wpC+mLl(U_E0F@7e~^ZX z=^=z%9JqffvpD9_*S$>Y^Z3t4pUR3Ay)GH#RGSe5WkZ%OWdmIjF)WWJ6%&t`jS_dl zu~^!x|9Dl3Nc5WJ-4srD%j9Q=Y?5QX%UQById9D&l>k+YVWQDPQvX*YqW@K&JKM7~(+EP1k_Tm8K{$ymJP}5m zP6p$j&OGyJcJg**-q+^E#E5Fe&N-)&357E$h_;Lo_*>uIKPKUthXE2O6;n}edY>xX z2So4OzOmK_1z@67Jzf{_qQZqlCJ~2P5pr)R4RtS;HSJlP#9n+EtTu8}=K8aqK6fuX zwgf}6?eA775p3O z9BgP41y7it3Ie3406wDbDaxFaWD_^R`XT(AtHU%F$RdKpjQ4nP%X?s^QR3`^*DNc# zuFWVjR?`Zw-rScjI@f9&oS(NI_qZe;-qEG8;*V*f{IXRLkI+WI6=qCX(5zbIv_i#} z%^IExw#3}knx)NO0INI0*J4j4g80qn6t|*<=)(-bza{dg^v-}lmAg&xA4`+jpRzGX zI)wzZQ6$4`Gz8Jz(QLHqYB#X}_0A*q9vG{}g`sGy>I zdz^x#4B|Y73qgb+kw}rq>>%2G(FB7toOD~oi%qkaN4_6&zWwh18kzDd9n!=CYkN0W=6- z5T1{#Qih@BDVju~D5Do{3v8LswMgkk({V12zH`==lR8n0S1A42ehFL%yU!qyMU=%Y zD2t5w_0=;ZhE2XhX#KeEcAM`gJXT3GAbnl9yp*eG&|)|)ee?R#a*yv)?6Je7w%B(yg(-r| zmYoEe8!|UkhHzNDwh^S`E0E1>S}IsFpa0411DjZVWV{IHaYe-aXD6;R!Iwi&ptrwKAIHN5dE{;y-JYmfyg}yNT-wa7Qu6Wu&p$EO7b7Z=SC?12&wQPP_Qcwup9n zn6-1m#U#>*v1GEszj+Z!>es_*zqen|hb)snc`m<^u`W+^4W5CGM5r<5petkD*S81F z?pCirE}Rk8EU8yD6Xank4qm!ISBb(94g)3-Hrs?hlr(VR@K`I9H-oKBk{0nsSm^vW zUBWaO=ZxKpzW~AqBi*kznCivW`3NOj4);UTCY6Ue`IEt*jR*c$*`0uTb)2XILr>%4ybKA@N=TlUDstTG8) z`ROvn$@*hlI>mp-*+Tp4r@IM{QU(048ogfG*0qCdx6Kbz#Q)J2v$L~}X#WJW;4=eJ zwZ|tafM6=Mmew*zjwK_R(7YvI9b;CCN!#=$nfK#))~{b`q*gl!#-8H1QrWP)xjVc4 zRgZI5gGDWd_P~oo_KGyplpqhP)H~i(fwd%vGrH}Ql@TJUW&jHecdA8JfJ)-$Vul3q zOsRLS6=OjSV?8g*-cOvTaSNW=$qnT2yK{JZc9|`0V zG7nl0)n(1}^Pazr|{UfVs>9<`e~yFiqBA3^sQ z>)~C@Bi=GniEGdMuSsUujjq;1`83Rm`s9Och-BzdgoTqN2itHf%Y5Rq7hhL=B$>~N z>B>SpNr=(Yt+|4M6DYeIKz) z2gQ@aeK^K=JrX_~xWKzIv4qC$a?^yDDDh~tkZK1|DRIAU`U?I$PH0k{8qwL-Xg zM0Vwfvk4_G-bc>+&Fg5Xr3_>+TKh?nd6Kr2`4T+Qasoz! z8r|**Ams%(T1S^--V=89f;Inl%4&spkOiC41mvPwbd2E?D2P70=G%1iWOg_iG&L+1+Wf}CO!Etv>T;gP;A@pV?<3l zy3%EjP04D;7`Td2XK)v+{i*Bl3|sqn4{Dk>^^Zo<#3 z;tED5;tpD<3e&jsxtE=smGNcpAf&Ac6-wRvO-K4Cr$cHFPb7HYTb>_KUtejHf94_S zkJp!S2Dr517RnsMNU%w>8~`UF!OlhrS)#4$arFXaWT+^b!@?^hIXco=PN&f458nJU z(s5Ry%<_1Vl!7^kyiT!eG8RhC#xA@D+ol;iXT|Z>`{|$gcfBw?hq{XyOy>^rud2xC z8X8~dEe~!x^fl|u)wi{hq6CWwP@%<3aJ~trLarMp8eRp@H^$=d{R5Q(a}gfujh8R4{w`W9|nKd&hHr|tkKETo;K180?6#Y_YT%IKU8aj>3)o`(1UolMHf){V-+aUiQN69}%UYvqdq)z4PZItqbyXT0rIbri4t~k%wB%_bfZ7Yj zwVTB1dR=J=?}wKUuJNmmOBtvG(rJRBuR63<3vL45R$WnAayvIvf?K_mf{ z9@%}wCqu#mcbWSauDyRKlB%kJdzd@ha9K6Z6tanl==*0VWfj%x^wSJ#EKP@^Ky^!G zoq~HU*MfT?%AM<jd6CNViC8nkgQpJ36phSDlqFGUpzLks zeJ*s;vUwavA{b2@$m8T!Fsdc}@|!Qoi)#e8Q~}2%tT32bHmqO_ zFu9}gWG5iO$TXR*r?HTz(@IO7z*o_IRuev1gH4h|;()78LJ+RE+*~hx0HgJCc00WP z0$YUw>X9#W+GN=ul^Y(ah$SrN`dpr26^|97idX2Almmfx3dKX9U~R|T^A9(1mguX` zOH#qs=;2d6*EOMT&-QS2=DCVyWvNANcCp(bR<+VEsbxlz>BXcH2_cYykz*LsqKAvCnhM!n`LmE>u>h6OSPI#-R?W$ubS@a?Y2HJ ztZaDE(6C>s?@m|Y|0nlv{^;Q+6M?(C!v;>^sD#$(o&DAjN#KH7~YvRokjwL_n7MlotsCfAOok;7&j(Jke>*JPsNG;k3;lSJ_znvgSfRj8aKL5?2s^^i%`~{k>^e7 ztsy0;{ZEMB)(n@O7(by%uUvimINJ{?4$}qMG-YJL8PBVF`uK$cP^c>)wN;eFvqJ9C zQk8L?ks|cLM=}Vx)QKVE3Fj{Ax_-{D=1@Idol^AKJ}l_iHRjk90~*_k(Y1B;-CW0W z1xk!Wn%(TfJzapMn&{QCtI+HY1x=neH#&c-S=ek7{`Z$*w|VmTo(6uSI4QV5 z8KZ!PkVxARbNhtXS@o9)X7kbbSZc^@ssjQ3N#Kul0_}J(;fbpBNx~gzd1_i4zAa(u z)i0v_?@BP$P}LaXL*Hsa0S!tM)}dYRY1fB3BWt9 zIzNPO(?%(RQM*9MIdXs6cSo-L|CS?L0RBv4`@N+LGcvQUT&eVNxwS_OnBjpV_i~c^ zM&tKa!cSBqg|%cvK}^F`CN%T-=wZ$wvdt$@)d)J#IgA<=Bws90Zoe$eMjLnoXeKbDlK_rpkC&JDZX8{ApZhBkKbmD4b-l%CDH` z#oV~H&B!V-n5_O3pVlMhKTDKxmdKD=V;CjpHwkl1jJt^!$+^v;WxjdOU(bTTvmr2xEjKp<<9uPm^6vtdmN z3FX?^SD{09dUjOk?lGA_+qM#~kJJm>pc|}Y%GsOti?~|u14R}NyA@NOp~?6QZx5cK z<|kVY@M470N0XB|kMO8bj5VHp@HPS;*WByE(fuI)7U~|3)6(TRa}Em^xjAjV?`C^2 z(}~|Ce=!xRF&g6IV{}N6z_qht1h&dy9bL}KWYQBvK&2!kP?+Di;6ln9q0gjj^<8BU zIuj1xDmx8A*c`%|Eg59QKuWI|4C#yJCyTTrj)xk*Qbn~~Fnhl-FZMfG`+DbrfNt8K zbcFnw10iR`zBP>67f#|Q~Q4l+UY$3lQxRuQ{@tOUdLXEo%-|3mor&6RTJB;b)v!4Jjp2;v z7%Cq*PWurPNGC4SxT4>+q2Kf`>BLwx=P2oZiK#uC0cbjOr~OS&wRO(wc@<}Dlk8rM zP)*5(CrPju1^>AeR?S-9T7{xm7mSm3Bn)BThgYx|-F67K{Qv?EomYefm$@yAS$)~7 zpyq3&=%HCv0aziQ6-D@*LohpP2**BhLzO;D7TP(YLT2aKEdvk}qb%g#VWV|vf6~295FZeVy&`@*mOX6 z7>3jYNi)-ge(PO6SPr*$k6(O>`0nMT=MFGe<-}fI;(|(vZf)-7ga`$wM0~&T@Jh>5 z3W=evnn$Ucm(I%;YKKosU<`gA$;^GWdVn+Ghl_EQ$d&$<`5j0)e9Sw)fIefOe4*=h zhDW>IF(f%T88_}FW7Kb2vC8#BM2HTz;Z5+wdemdI1ImG-VSsen=^YMo=z6zTDhmIj zzi+SKJ~B0FjCVuig#hJhm&7_>v=q>_cAC}(z4~xtm4z)>^f#n#Ac&4tUTivq8O5$u z`%IAYk&qsCjt(^vNx!i{+mc_1g~v+dC(-E=Sd}`aF}OTuF`vkwXpap!C=94mwaBP1 zNyftqrwqp!%r-*|g(RQ!Hn;|D(e@`pKh2#Q?Z1N0FP4g)b10NX+j7W9!_a;Y{9ezL zlEqouz5k-4%=+V#7nJZ(2bEL)oQIVxQuq!ucM5C}wYLzK9@Er4MP0J7DGq`rNxb+j zHTfTyYId%#44^4CiP(~|ejMDGx;?mIXJOsL{TY~t{BI_v9#$tZ^a*lfKZKQy(@s9a zXkB%MTS2EJ!p$%(d(^Mm(;Ugm%FALct2Lvb@tIpBL-sfL3<~j^Jt~92N7{%fHa^|s z=|t{Mu#lBNZ4a9_En|QRufYE{Y6qNwr~RqEHVOA1tn+Zl z%e^|8wa<>;Zglq$CHZp~ohAa3mJ95zmfPp$Pm zVfa+cP)8=sOjzjVHt!G&N_fJI_|Al8#aFhw?(3HPYKVCYs+i&beLCW(Z`$*4+dIVF z^u@kI?^;Dznj{|F$oo=6#VHl*1}#FrHY-(9!!uv?^z&wwYMvz#oW71!O7y(gkBJ{& z!xSu{$l-?K?dmIf`aMSiE1EcrQQ}n1pnXqPNPG8J<=uGWL+(k-*#v&}r(87JE#XCB z^XIged;;{v0zu#iIN4Qer#SIwKK!{vsGny`NLyMWI>k5B;Bv{iAGaDhRh!$0Op0za zo|l4e6h6toU@ZA8c0y202bqVq`fj?Yh1I{js_r>|raM5%#0pn+FG|QldjP)QVc$z% zvpKeNsLcv96;+*3AQKUhQC0@$5Ev6Rss&~OT~EP*|MgtJ`09-8M`mt9v}=s>`;z8t zlOiBx1O6X?di}pU)%)9)nUPTtAXx)4qys@OT;Wk@ev79aSNzAwvf1@WJP2`>yDesu z+TXRs_fdj6g2>BRQ+JT${Woi;k>|Kb=;zs-V#IF~z#*&u*`(ewf)aAPPSKyPFIiXn zCT!LI57mZcehzOK8Hw~tvKpA_ib!5sE%$t`3It8?rZ7wpCq(s?Kci)7 zEikSwU1&+(V^28x@6D=7Na@PcU%qy6x9O|n;IP9oouB8MPzKWK`_Q2;KR=vWUg+B$ zN9EL31!C5w2GS{r!6@;;mPTQJ9u06@@;v4@BT?1^`|(2CHxcQZN+3VZ&@=hUB-Z7d zsvy*-KK(GZK)Sp(Yk0a!TI&mV#&*+WJI6t-gW*c08UjA?7v<9AR;dabk-tZ9DG#Bz zD#M!UIr5!HT46!qNS?Hq|I7?}{6dZ>V9#8IiE;o{Uq% znAiuABtb8C)K35YeAFclQV5(e+s%Xb#vdJ!`YRMG;+Ks0_9+09%N=7Jd>b_V=T{K5 zE!Rnpy(~=K_%1kgL`GT_a_H7Xs}0f57N;*-Vm{z?q!L|aV@FZv{ymK9;i3QZdvo^0 ztVA$|ow;q6f2naf7-lD$%`^foscLlW`EIA*BQPFK;*2`>3`N%4+QBOD(#4epe5Z1U zHY%)r6(xR!J%91u3=8W_2;O@->n3KJoMI*(_}XGmK82%&DJriI4IwFK6_B2H_M#?D zJ1p|MUXiQQZJ9K<efos{xSmg)QhEZPPd2O8TEQ(TGxhymlwW$ znE>Kokq1#4fK;JAA^;@|{=RdgIyI;XU=!7?97cUs8B-j)h96f5n*aa^YO+tpA2fx^ z$mMvy?<~UWVFd*FlW-MN@-0`kf}t=lD%FVnJ4FpEN!?;Xd`c=#umcn$j#2fgGPy<1P=hTx4ytj9-ViEAh?DYja7@t9LU9Bif|O4dXtE!g}4c*VT&b9RBIqG1mQuH4w3y zCrIPAO)?}z^)zr~0SqK#Epr_{9vj&R>_@0e!{b0}uffdMkgZggGcEsJN=gef3MA)* zyl9v#yJ-SGvaRQ|@x5FY_p8*XoDC9un;mVBqE^}%qt)||tVtHXPX+=u7RXJs<0Z2CXS2{SbR$F4M)!U{p!_UrA!y!~FdWC;k|BWYyVwHvMV9SMdF)8)QOSt$Xf_xM83`@iO&ygW=bVr*PM^!J<)xzcloy`3J#n*nAiZlok~mBRW!B> z`6>1Pea;%zdluICeea$gJYT*m{V#{hhKEF%I9|`Hrkx%i%Ykd>`72qrQizq~ z3!gKF(fUvjZ33!PKne@a2~okwgiQK$5N#c7TY1^+pS}$@4FNw}VJ*4gpG?c|3FqQH#W)6%w1nA`MxN>;$vL+T{BI7U1vx)l{aMK`kq}NExjfS~O27i${%4 zCa96pW*yil;z+1KJ^SD`v!fmU8_GJk0q=kS@ATJXg^4^302~mGoceVVCm~rUu!T_d zQ*8JE%)Xer^AV&Ko8fbGWFFpy3pUC0kMV)sBK#LRT7Br2V<83zHz|CcawIKn42KjF zl|nr~>*7n$C`KkRi_f#uh}f2QeDsMl%D`wL?gfh{ zB#6VDbA)N>Br(hnfomMy_xF{l`!hT(k1 zK$J3;+!vRRqNWmQxDKPwRK(geRDr`Oo&!0tEldEud!|xJYhcJwp*N`} znMkqa6zuXZpT(Urw*O(7uQaZZkb+gP!9ZezQvhpGpmmmic2P%P)`I#Pu=80}kg6?% zu<=tEuyBMR?I_tJX@*34T2Jt6M4quvz|;4u~o4Wda}Hb>7d{Df{nY7@SJ zlWk?qKXAcMy7dw~A4JUJ`BzP*^6k*w0eiX^;{$Ea_Vxnc}(xk zicJ4~bM&SE&%q{kZPw=p^&;Tky0wo#Z_d_czXRd-aQUX=yZ6l(2-IBO781XPb-G>N z0I;wG@n)P;%1?kQ>~NrkVRK=(I$z`f%Ge_`}ZVxw(Hz`{Rq`O7s}KN)0DT*X}YLgi43F zGpog>eIMsvtwhFkMiC1aAU4iXS52qMzzj)6g`<6CmSqR}+!UL~zQ+nb)OASXKG-W@ zV>W+PK*waC;}#NQ)|4=}Ikd9j?8as$k|}57hL|JW6~dC3_Mco@3t2xyi(lo|JZ;^$ zeKVe|xqj-LLHqFp!gm=~g^RJ+UEew60p))WW=4%y#ZfVwAhEnb9B-kKm>tjAGI{xn zyf=Cof9@^LwIOEhz}qTl3{%y#W&;d6=0N*f$^=j|*oAFbETAPD_CLdz!b@wPr#hQ# zclkGx7$X22@W|tLbXnKfIN0s=VCqxI!^5-h;cGpGc{D`j+c|5|#7#{|pTEel3l%bu z_6eOTjaulG8e=*Xs_L_6csAsbMeU!w2i@80eW!*l6N0R%if*iICQ_TzFInc^nXwD3 z*%-x`$rn}g`c29gwK#-=m^R)GdKNX3_I&^j3tBj)5q-iicv^g{2_;eI%ozXMMu2x{ z6+!;_r@=JI|GEUwB7t7lLkth0oCD*@MPk z%#d1}pGzi`wgr%z7l5Pm(e_Zhn+r*GHI@9$F^jqwV3Yl~wQ=s$Szs$(vaD}z9^UA5 zOP4Jjz4x4GFlND<+w$H;FlT1#q?&iwO(#`|3SYFRC^Li)wf9uO)#fyFXcNPWdFOC|K`tT{KH^a(0S6jNg_zl? z8q^GJ#?nejG6_KU>bgJp?@?86r-z=U9>FsDosZ5L4>yVfh!V4=Ho^DIaRTiSVY2;f zUoBG0+CdB2WG6YKe{w`ye}%7}icYJLE(u96Bv}+7=Izz>SV0|iT4n2J%WH~R2!V8* zuoKeZ)pX<#4ql%57VkLwGu`0Br~SGSSFNFMwqN5 z9-%Wvev*&`9Hs0$Wrjj53LV^CNP`@yy^6p!k-eY~wDrzut_NXS*33E115%mKcG#-d zTUZ*fbZ!89^Ac_GrI+A(#LPYpz$;bQ}!3ji~k>3`? z>1U*gglG1^A~4GPDy!-}${P4blSmFy{qPV~q9Sheg-;~=wEs#jxHW34wnl1wlu6f% ziuNb3jKPXP;o0hhr5?;)Rbx6x+5u5GhlLT24oN%6ANXY#QZkop3w&_ZDor|rY#qmK z(Gi&e{f1?$UQp6B$e2xyh^SZq(SzH!JN1k7MZXiKASMO;G!gM-x{myYPMN2GQ>67u ztJHbxtm+>mh`y!B_kM)I#xZInSTsXvZT)K^N;5H<18DtZku^A(*1AQ)2x}RRRnrE* zu5eG*04Tf6eBRgVOkh=zy0Gp0{Xh6M)!;y5FKaYP0**z1(VM77Z?jj0U;Z&n5-#$KGfXl zn^_gqpGt=Ag9h)-lho(+{R6soysicRiO6@Ad)H=ZBsK;3=$r#{6^Kd|!tCEpAk{?` zRKXZ6S%fR;P%EvkL6w!L{)gb17x}_X`>QC(0Y%Rwb5SUJUWxbpa4wWlo;yU3?DTm{sjmgyXA11Sxyd7-=xWC_u4s7SOHKMD zbmI;Y4ZshpQxf#OgeP_^bS-J+QQe8g2od1H{U?(z$H55y8o0o z!4VC`Lcp@93{CfsxTRvP2~MweLZUB2H{PEv#{NYC{Q$v`{JTonAZR39F+W5+5<9b+ zfTBV*TR*5Otx;JtgdCU2@i-azm32PJoF<%{ti?!%S-6vVCWhuLcpZyV%TPosm5$Z= zb4l|e|ABj`_d+R-jn|I}cR_w!1!JWMialf8k4KZKmA8eosQBEh{Zky^!sqt}bv25w zpBZRYrio)G0z5~AL^khE+kG47=9teLg3jpGnxY-iWt4GwlJeZ*UlF_l0c@RfbcmwQ z{!0%%qj|eBvPgxaySVeTv3dW9#wDa$&&b?(EppcsBNvW2D!AISwDoW71A9IH$3c`- zIhthsTjnS8OzSo={tKo3^sVRElNR&p5BN@}j;fj(m){#N(9~`0<3ni0ppgR1O1f&* z$$qGo`EQN~TL1k3YVjT{fsMxQ_g-A!9{mxf_3C}_T5od*I{j6vgaQ4*@3FEv#Yy1m zUk&8NPyGHPjT-5vah(Z~dAVa-Qk(`5{!q=zHZx<*+`?-pu%zN)BHVrK+CQ-Oi|pEV zlXPh*Lv;FGap21;Abt4ztA&>?LylbY-4$J)s#m_QvtR(Rsz zSR0USby&1HYl>xHnP4fUmzE1^<*J!N&D;T9z8T%paNrv?!inW5VL>l*r8G4D_ljUf z33cCDARXnBNH^PG`NaBri2OSs8x&v=7E>qY?O~u(q;Zl&D9Nl}1-72RbL#|*aC2)= z#CWE)1*Ku7VH5|g<;DaGwrAX8m|PsIGAzu%akL?DsWB5AdCf=dkF9?(#~u;ZIGy9GHAASRj^(#Npl0FdXz1UH}f>@^t$F4FL)q91bQhflFHW-lI$Q;ro_6Q4N)}prl3ga$iK3_~*mMR#5Q|^dZAZ)sKouR!!_6HAmn8Lt5%g7d~5~ly1*KDGL zgrW|1cU=~#2!*+EWycf}l>S?_|y%v!Cm9 z<1PX*t9Yyg_+9i$AMtA4wM7i)l{eJa_XCyM@9$@?8dVG{9$Rp4JM2YkVy*;L+rR zLR{Apq!Vd0FeoCVXwyN5&PQIeb){kIA_7&I^+vf~Gt&VcD3_o09G!AIXY1TVtD1NJ zy`8?lzI*Q==xr~l=^Z>Bg;zRZhwJ6__R3&}-dt zT_%I0yPbEO=ekm@_Ef~eyt!DYTEc^qZYf3tN}?^LR+pJxCo<^k~AXEP3+%w%MD5T_ungw@>6^6 zKd!e0y=UntaWa5a;gLf|Dp%Mu;bt^_d%6MtOANNk`MPXZEkFuNt%mOwomvWb=X)Q} z>Fog3K!7(m^wQ_j3;3MnQ|dQ%QNvb$WY+X6OHU-j8#WXSUWnKCWze1#csJPLd9@Tm z^werFD_NnG{YvF21h zcVbaATg6iJ$GJ=I60Ul%5gqVW+|)O=M5cex--tmP3bjs!mV-NCJZ<-j^ByWmpk-c?I6l^W`lQH)74&&JNA!qdO8 zwTW_!2{HE$gM`j@ffKNj9D*l!+ERjS1#I~S%JRCvwoNw#OA$?w%v`ijQon=E)k(1x zlcwnWW_cO?+V}P`3h%fQtbyD zsR zZE6gw{j6sAJ)lzcw_`X>s=Lzm6q=pdqa!YXkE(=nW6OxMZ?6LO+ipmd&XKCaG{RRAqeBb8T zjxDRlZ?jIECzhA7uo<=$SicmETXI%IxND3%yZp-j$unL^g zI@vvi&%=&ZrG0ne(nu^#Oibhl3t=Ll0qyeKD`!hV(ewDO<&S zi(kzTIQTUgxYp2aA99a1u`~l{yI`4BI8`=7yu9}&9>+r!Bj_iAFJSlPV6y9RH?r$~ z)yn(ADc8u&EtOm3-K5V%N6M4Wk< z1>ux86iWVvER-m{$ytmKy_s-lflbQSxl9O}y zS?jac{^K2RB{wjsJjXgpO1byJ*9EhoRnE~nb#Iz1W!Q}tUkbN^Nc{&&w>A2tI1BYD z?j!!rW6&*pJ5P-$CuqlI8vBoubYF&Oe~$h;@4$u>_VPFvJtvHkz82Qvw(wMq0F~Gs zC)hTK(%L19vWv2sN6$6McUk^3;RgrLW`Xotstj(9>zff*@8<(t zO4d=R*?^YYr1=A+dXPs>C3m6Fa-Pt70r&EUtm6X2_Jehd1pB;1WG14`IjADfQV{0$ z0XXU#v09yeY39%h91U?t%(xuIi9aK`NG%o(GKSdEQU{$66KC32tL_P85iYlRpDe_0 zb+1Xy1(?zGnNyAzjidpP9@(cSPN#(>N$XSSoAEtsEAl-!BaNC6f+dQ4)VM^8U_mD#W4quE`d&46&47m9AN^10Xag;% zQL5&*VXe2X;?wU2317a|G2iec#PX%>7F3cdaB7`(a9{mgaS*h@a`mU!`}-bcT4tv> zu+$>)?>mCS=hvN0A_^mzM-8L!;I#vEJ^3YXk=;s#Cr;J#-H7TuDG4!#H>R50M?d~=`Ei6q1L9wWmC6Xv{)K-pBDiIGaE7y-_@t8E% zG*8zb34Tg?9ZZwAbqAf=<~^-|*gnXFVd)~1AYs&6fJ@FbOawLytBh7`8adqbsg>{4 zoAN#>)@$rW$uxh6KJpo-p5#Nl92p;uP13A2%ayG7vOmE`kRTNoBoMcfWnh=Q&ztjd zZ2n;FcT!W=&@gNBPVmzEmWJTXr}B&0+UV?mWnW@UhNB2Elwap3GLb1)9#SskpP#|d zPo^9FoYfqH&AIoj26M;f_tLN_vpQcV#fY%-pj zF8!=&e5x|?AJ zL>XvqjboQnuZzn$oA*8xFP?90auJ%pHu7)S|K6_*NqGtCiLhS@Zhr07qxNCg8&rKa z%6^m!$)MF`2i4zK_GVxkFgna(YgSQ0efd@El**2R*_~Ia9n_hpM+t=pJ}Q_I1QAin zKuKiT(!O9G>yKHsZ&J*%TL(2aSPtvgD0VTvGX4!PJ_QYYr10G7v?U2$rk zHkE-OtTN^-kzy4@VV4-~_A_(^6vSA+#pGKXauz$KO;L5#qn`jrLzIo?jp>c)$a~Mh zgX&=!P%k(d^AIZ0z?@wr1GO#l37{vdYhc!@+-I^V5?3$|O2|9$^fj=WxeI zpz)f|++jUy_LwJ3m#vv$-(%gP@;8RaXUC^sLJ^$f6HM)Y^I*%W)f^g%F-WNsl)a!I?W zelGn7H2&ax2-ir{Wp{%Dz1l$;#*^o0@}{PHch3*1D1n|8BIDFeS#R7-Cv`xsmrA;N zQX3PCc=)iloo4JSUzY~-sVmyt8Wnti0e@4J0V4YHJy5@XvirOHWISkcqrV!Zy z+T04|cYUfA&u`9O;pa9mdSa{2=U@!Tb}D$gAX~Oj?+O*N5^l9po4q_L2=~PUe2u5> zQzk0xtqH{68H-8nfPP*o2PCVGz9cdO=dCFethEE4O_%ridqHlz~kEE0>y0Hfd)W zaXj&S_L*3}wiYgO9KAZaSZn;jwKL)KzE-8-c_7E`^?8TkFk{oKN(46m&)mT=>+e%e_gUoD#)-t@QLRM*(&TRNojf-Y*=)weD!#RaKN`1(v2D z1ViftGCO?4C9c*5Fn~)W19BByMBIu`wH-JS16BbI)a%P>{_2M4lSzx^>V#@|#pNu` zPUjw4!0dAIQYIr-o*d2?otJu5ACr6S^|!WHI( zvu@e87q*de$^%?`^y>7Tv7JTZIw+Df?C2mhQgS_>s3cDvX_h_(Aen?U6*z94ZmTH@huBl&xw_hCtSZv4$we1+)kfYubs|b?ARjf{7=Z?ufC`P_7~J&c37o9uQCBr;2db%tJ7l0MydVjMc}%wM|4f;J@rjX zb;)N8uM|B$6E{RaTlnX9?)x~6k)_SiPzPDP+Jls!&)C=?r1uduv%Dna*o{h}yd)@O z>Sv*!aI|R5@U#&2SXD@=#>BM94O7AvzgX;-Z8vC>hmfi3NVIvDV|`e2o3e}vH+I=&8T4qD zLzOKmwGjvIN?H0;8y??GzY;ZKoa(8gk20RmfkAug0rxI2H5^B-@0##KizTY87*v)_ zTQZ0K^5K~+{r+?>KD-9oBU@#?HuDl!e8^NyR6R&uwoPop)eB?U@-RI^^3{mkgQN%X zTP6Fn0{y#biNPaKCJ}RZg-Eefjna+C;Ks;R&|QgcKMvz(+m{for_w=TNThCisnJgV zy_J9R2R@SgdeUj)3-X4vK%{Dj5?NPt;R}AQiz0S^zKoa2gPjMw@FpC4K;JeN3Ir=Ewadp zzYYbx(6x0-uq}Q(v@dwnDedKIZ%KUotxERpNIfo_JMh?+88eTFsXbx2DWHB_dX3y?8st##;YUbwK=_5bWE% z(fGA{36#Az~!xS4A-=Gi+&bjne`w0@r3_@+Je&F0nf=x!I+aL_5C413M%?^%QxZ&1GY z0}3NX2x`p^tkSM6oO(oVr1Io>h1lv}sP48{oz?!yQv{!+2cL)~pNKuyK`TXde6p+E zVWvtD3@~R-wf;5f^%~|Si~hQ~W@e*H(*B9}a*N4QP#kXjZ#akoE@RXxgbp9L!TD-Z zo;rZD@@7S7#Y4RccLb!V2AAD+)wf5nHIuQl>grlGGSnWIZ*~ev5MI^7cYC$3L`Ke$ zjedUyd-&!${SkkXCE-vy>XWcILwiER`#uR_eZ8>8D7C6AH! zq1^ui_es)y%5(W?_7mC5i1h~FM+ksE6XXg?O z6rwY}zgKxSxS*0vcY|ytKmB6;acw!2Dk$c6#CCwIT1}fORXE%t4Q!*Gbl?+s7UAG} z-OzbCHyF03LOq@AS}$(@s^O3uigIL4Xv_4tKd|-daW*W2m@V2p6r`Sb5STGP@fK$kcV`H|@JaIZy$unUbOQHn)B2cG-9&KO8e;ogU z)AxoguUyDTK~Z`BzHIg*5DCi5FM@Fc$NiVO>@?6#5G@JVaceNUoqp+1DfWYpyWDLy z6_FTPhubpW3}8Kb{1Be68?=C?1F^2>J?4Lqq}^(3@7C6bvAu+PhMe(%aVbM;lweQm ze4XGGd5zV_qNejBU|8(Yx$GVfJb5$@bj|k66gB{f z{BR)&?3}?Ky!jcFdjXqUZ0)Q)&o%O)1`zQ1Nde|oD zmQF9$ZFh}6^Lu;hc=(g?@3GqLM`4o9fI9Y($R%I`%Nc!@?*{={!YibsnOe!sbLF%2 zC3hF|OgYYcyK-P82LDaXgT`Bfo$tmNpA5>kM2XsfJY!8-rzmi2++U<}DjScesz2^H z5cW#OI`ygoYz_*WA3e!{+ux5Lnfs>1=-4C~!AfXd_o_PThr8Qb-b%+`BV(#mjq%+2yLY5g?2?61mz_7&|@yiH&!Yl5~hxrn%GZt-3d(Lf6 znFK2B*g~P9sM~{IXDSRBr5fzz-*#!vG8D<^FtA{<+ylmK z1THJq#!vrSjVe17u)ODQQ2M?p82n>w|NH_#S?x>he*WTncIO+r@mRHy&mi~b>H!C_ z@^?{&{q?(L*?W=M_cm-l?p-RRtrl=>&7(qJb&hBTvV8ucAJ^(YKJn0dPYqRFkrhE= z#FgtP7LX=A&w4dz8-z#2OtmA&*86KtO*9b~DQi{ae+;B!n~WN|*r4jFZz{O+sBX*8 zfz&2-I&SjpN%^9aW)rxu8nF|^3ugJX+CK7vNBR`aes?MHiBJ>qO~?SBWnm|lrC+3J zZP0b`)XLDl&b@PlTyrhkz!Tcp-?c%sWb~2Y_9)jH74nTdo;EyxRvig~5~)ajPt{G0 zJ65SPm9;nage|5vA^0UJZwl-=W6cLn(rq8Y8XEY#0&=CqT5cvm<*NfVK7N|lQ|;Vg zD!6y#5tB3ixvwA}8A#$Md=-62O-(pPLP%Z63O@bCh8@G z2K$L3%YfgQQ1ltLsMdSw(GqM2k4yL;=Sp8XJXl_7-&?Y=X5j0uWQGAVDL;%M2-u`e$TP2f_1focYb*+tr^&Ar` zpJP>T8c;JjX)e~SS(`-gLBqLj0DkBxa`IR3;gbRvp*8A@(Y7}*Ci1n-j4_U5?X3^!$HzXa7wD_cT&^DP zu+NM`0k4P7*q|#Ka{)>^AWv0wWMTM3M}nBF^invhLj31dk_`(bg}e-+PT>oqnmu+S zNrEtrCXjHPP-|3RDPnM|AdJj5M0>TM?Ww<3t^!A#y0BO@nps2;u4(xNcf@XMwAjrWK=$Q;-|6M5q&X&wF|au~3C;dEXT0eJN{DDErpSQm*Wgz%m2H zH~Hj5Y#LXb-un^xB>cryjh~jV^k35v#u20y;PRLIvbIRuw4S*{y9)h>R>BQQYKJxn z?rMj*Y3+SdFaJ=eu6vLb++0fQMoxv!NpM$GWa zo|RViK|=0$^QCBm#S==c8x{B<2^o0JkS$%)3PPO0fr(}C0`C3SZ}etqd(dVc!XDnK z#=gRJnaXO=hKI%ig$&S`7?+&*ju>^t@Y^zQl=B+flw0ehP`AP2=Ft3S(bAr(*T5~O zE0|nQTrzd~1y#B$dXy%dTr^!A`Y}#3c(s4CsL#lul1S1HR!Ns#n@XZ~usFI(Xri1l zx?0nAjtMN`Y+-~F_1(cn)M8`c2h`LLngy#LcG}$l1)cNwyX2nxZNe{++3#WOpS{O` z+LLxij;B+ev*{kzqxKNCCjY;^60&{P(vvLrOWbiu^r2~f*JF~P>m2?y+HYrL6KIU@ zczrwq+*L&DocHQ6o-M_Bi^IYC)VZ@RF%)_Z^Lqi-C+~;*^1hH9kvvv4av3d1#9!hq zYto`Edn6GI0QA)d=p48|fllr^n`0(gtNmo%u>$Uqe>WM+3y##Tywdj2RPoe`2Nto- z$(jdyE*jxOKQG;!2`6FF#^K5&B<{gJ?$Es)3U(e+UtUPeObdF}M$00`-M-6`nx3}^ z(`$hr%o1Y;xP?2q6jHgEc=CA~cM^zI=9T+i-=92LVb6ng{Fjpoc@v#fH+;Yhh6t#j zn#B$$qn0lzh|?vZM3H7vJK}S;p=o2P1-kd@pf;nKG*gGRk~?8GKiR|xz4dg@8)O#O zU8bS!ayjj&;VX2KXEM!s@d?)*B5dni-ND`^zI=W*bNoAuRL^|rpxGF`lZxP1K~~T) z6CU~AVC}QEwajn%vOVZO=Vaq++_ZMDSc4~L%Ii<;;HAR?ij0H%KFQj%>N_X~EFkeh{KetpQm{rfY3--io1HlnwW7QT{FALhm}6=q zz0|Hg;UX?*ldrxPXbVbTE76)@Rlnd^neeSFYu8Wrrou+&irI;9%`jRUAm9?W68Wl- z&z=CHIYF03z)9%EKfLChsUnd6$lP-eW?K~bq5P9kJcPUHi}Nn)#kzupBUP^){<6Gv z>n@1!J@(2QCHy@7ZedotVjhB;a}0=1f6mW93S}+5ZoAWuAtf%>Gq&1k=HnKG40FMr{PGr#GC_c3@V8mavG#qQSiKPANW;tt7s@(s83oFUsEC^9cm zyU$UdHxY$;c*C4xf`VWHQ(x2}xhdH^aayjCLqo`Viny1}YhB`BZ=J5)s^b*^Qi3@F%{AV}AJmC7BxAC7 zLOixci%qDYP>EA1$HLTqj~hAkPSSi-a*mA&Kihf-bg2A-}UIttso zgUsH_n4tC~6kLyKjJ=$(E1{>vQjcLFO&sUAJ-|{$h78g~7)+g^Ve8%CwT!o!b zpx~F@gMNQM!iQ+f6=C0m*kl{DD;6M!9yW3`G_#^(`G-z1#K{Krc$?|ZCgbR*je^!2 zfl)7e6*7b2l(F{*FVeAE($1p}M=-OI%&eWymYzDAN-vC+*R-9*4%vNtVEekJ&`<(g z;?MXpD9HH?;Svj#l2!9)aBHsNsK;#OcwPJ$!$RG1Y_0yMXZc=dVvposoimI*!r22R z+*N1}D)Vj_dRZ{}RBh3E{yd$iGjKdI1|7u(GR%Rr6$O0|x!XfF1bUL$ogJ~(GAL!p zYjWN*v3>FGv@F2l(Er+jR6TztY9HZWu}Dc9%vC_lQ2M5b+kVFfoAp5kLndN@uMPLG z6uE>rz~;@}NSiFO{Bx`0qDfvxL)Ovx5{ht$I_Gfue%EW#Xvp=c)xP);$6ds3Wqv9Q0i zw?=>JQgm^~VgHoN7CH*Aw3q3_l)X69tkH(l9&N*hMtnsrLQN;LPIIUr9oAmBLtmI! zQMe-qTr6$=Bz7iGD^nTbRmlv?d+$W>f}Dz%qOY|w@3bxmt%!`tve!Hjmm^Uz&#-FV z<@o=N|DrlWC*RSZfvv-I-fUn$!W`^`UfSL`{4pNQIlYMc&}+0@!~6nVd}c_p3T z+oOPtL+&L;h=e!1S-|&=!nQjx4el;6$0L`~9g;=km`{k@RiH5s%$VyE_wc^w;>ZiI3 z42=?I9E;Y=&9n~~Iwv|mV)Pfd(Z$*;F`gP}3_~}zsN3Kbag_utlJ7h(kF>WB^PBoa zVSa$wFQR6pkMhXL*NP|I`0(S2%c?eVwB*3XfAsMHBt~P2J23HKLIhFsLsb|w)U@?o z1*CSK3%_N z7~nG6+uM&%PcJXWn4M0RIbB^{v$>S^m;ye$xwRAh4-{)0-iX;8^@Fhyl0&Qp(v;4w z{#Mk~x3`Z0aK^#i(|-emHy$S4$nE*R?EF9wGk$AOIRdZB$m=Ke@YG@8xut>Xwf+W9 z?HJQ5F|uhl7=vr&1{jp)SXIcjMyb3xQF~;((~M*200KEQ`_bxK1%B(-P-gRhKY9!f zUqT`ol9{$%9H{MKOtB%Wvug2QB0$riZ&u={5+!lhaW=u%&GE0~*UayO##ma>9x%8z z`u1?5$a4=1Y(gnTGOb8uItV&6x3&_5UB8waxoBg~qfSb-_C7%g2P+39vvjE)2O&Z; z?tYJxH_~DX%2s6U{~j@T{7UsJD9bI)I8>-3rqD;tUY2bYbCL)mHWT~UBv?DMVs4-q z2rl7y&iq63C_ddJV15VlK;e}9*n0MqR@F>nfrVKQyL|jj)#k{0W${s{Y|DDVAKb;$ zL*6ara;Bi+_LlV36;*XSqel? z5Wn+OY7-9fQJWDf;^iBWsVA2a1dT`nnlE2Y?j=^CDkvj=7CC{~+gSKU)T>Md7>W_= z@$=8AKMjjs2gp5n+l9EXHX*HyQrWOr@vCA3pWkzQGO);iIcurR27f{b^f!xA^|$2= z99)W4q{OAy{%W7=y=*Fp;HUU}f%wPkyAN_jXD~{o#yh0nu2#{hrI|Zus+JV(t z&)~5W&8=0X5!=+XMy!j>$deadb;CMu5Q?5>SVgaxCq9qtbG2w=R9c1B8Qm8+M>=Xk zi{V)Dbib!JeknM&O}@8H4%Dtq{Q2NNy>%t0ovsM!DJUcm3BLX8Sh#YF_o`E$aXY(= zS$-0tu|2*-b)?3d@$!wuI|s`Zr`eEXoEX)kCLO|;JI8{ThDxy%Z_dGD-hpb!qaNbg zN$%qE?1uApibrdPq&&=d)TOR{7n}#ROb}*lx`i- z2mSD7dI^8YFvGk4v)yTe#)8bK&cR>uwzk-`ot|qt)QJ2-T5w8a!eEEt4_YlIw6U43 zs*=B_yc8(9jsttu40&K9*2t4VFwbxqT#>5tJk?3Gj3-Y07C8U`7IrJlY>31Nlvk8O5K+w$6WA5Wm4msyA7mP|tB6z%8Hn;bZonLB0MtPd{>YZckSJ z)mfYWCbcyz9oH%N^T&U!c22CM$65wmHyc^J%jTpt_)v`mp*P41NA zRj2J}N-gevXy)l-I8`Cr$j{s;&Ri=7>U)hbs8SvRc(6`~&D$o1U+Staj}kTXSM+}U zKGRim4l?#^#qV~}L<*s3QevL{STcfr#i|>G3dQOVDrW=Lv)`|w^H5%fsZx2sCHCN!x zJwC@!SLc89*kLg96?WX8*bI!vP?o{W+6CxJ0y45H=c7ex$f~UK@TIkRBnJ7hSy^S4 z0+(L4DXhFmK3TP*$tQX29z1?yjm0I#(RRPl%Rg>(r=20%>$*Fm(R*aSL801eTBtsRuGal8i=~#K{rU_UT zgbYhX>VH5|{KP3d;@`*(?Gm8N#IANnR4(@T>OW4F2UPBLrcJu_nKe9ue1GoG!*}{k zVooXINGFscvF&@E*>7P3lF`SfaQubpD)s8}iF!np{&L9zf;ruiVVHBR0@pGP$!R=V zvkbyY?+h;m;=J6lSON#kf>GzqL66D@tATImn=xv_*aikPoW0jShoyd-D>Ksc4?m;a zJ^3`ZwES>AA@;kec~$SaA7p0BQv5FevCuLihOzv!JE@e?p1mvk|C|Kv=r^YIw$~kV zbX_d0#`)vp z4A$_o7=0@|}$T8I={i0n>SGVRz2qYt7(fgmF= zN$xe$7@@7CG-sbCtZuT2ZD>%tjFo!ljQ&9~I(ped#+S zuJ@XnpwQfN63RYU`sH}PHOPsDH|_X;QBhLG-;P-=gXbh(kR7D@gc}3 z=~N04bPhfq31f7h=cqswPFCel+~Y_)mI=7ZF1mYRDJr(Xxcq}7bl+xg@S0vUqcvm& z$N*~7$O)z*%p*Fhm*jh$+*%z^PYm|Y$a~Y#PSEPWD3uME zXr(r?ha5weQK&XekX28g#pMB1W3PL1h#-wW0#!#9{xYjwAVhkxGtn|>8$Yg2H2BVW2;U9uW1ucVDe#xN6X z`!#sO$aDOFINt(%#k?;h(T>kUg5L_nL4mu2fuZS+P@{$_;;H z6Qn)>*v(rhS`C|$NCo^{7zoNyR49BgKQKcBclIu=C$OBXgj{T1cBdl=1mw2NCIJB5 zKW$dh`UP-r zcqalRY}O~YR+l6EtB2=07!7Y+4;;pD9$dW9R13`yA6wbobtFi}OlV^q005Hd+$^9$ zu2zmk&bz7SJF)b4BLMu+G8{W+*+a3GmH$y#?pF;7am`^O=d1pkWoyY$*^i;KIDxSp zlaC9r#4eIiRbc*gh>3s}iW533Ah|+t5bXwBQw6rVe$q=vJC~%>L>hY{hANM0U15&U zN{)(K`9&46wu0H5u++6`e+!qgpfu)}Tr*zO-gFdGas+Qjp3WWgYva4Nu`=gbJ;)Ok zvrR03HEn!wkZ6OM_;NFQ zV4f|BKj`U9sj_)dTz+1HlKwpTol^@EL{FDL)1xKR*Kmm-ACRS2(t5);cK7PPeVSvG z61M-<8AA71z*wBBZ|r$;e18sqwny|TZG zj301^4zouEwMSBS{nG}Af&;ScGa1nb4pBx9aDVhtB~of{h1nTX8W{NU%+zDf!ZnC3oYDoe-_n`4GFN;}XT-d7EHqZH@Yu zQ^IZ;9keyDqdBt|{PRZhBh5*5p#f90<8qY#`P18EcRz`JM{i5_i>>dTrf(YMr)EVUOWBk!rrL_@ z6mghCrZ32c4v3tKz1JTZE|JHa;mX5Wan<3_abo*CCBEQjNGhlQRJ0U+w=h+bp|{lb zg`W1eq<>)(`;Tu`9P&qqOAIGenD7aA5$-WZ$@ni8t zVTwgweIH7+8&Q!mX$5W-0<9y@Sx{msp?7m%T~7%+sQa_McaEutbTf}(Ynn1sYSI@G z^<+X-qiA$H*NM(*G)&d)a>~ZRbQEiFWu#52U5`*}HD3^?96y521SKqN(#%D6YJLI_ zV!a?hi8OqW;Sx75Kx&MN_l8*_yd*2^j=XkLGNV`{DM;YAXjW(M_)b-gbn>Ok=gmW2 zBiN#ZpA=(hWyN~c?;o}QUoVQmeTab}zi+w9F^1aVKNsp?`@?1g;wx3Qh{(#c#Q=Rx zN8jlwla7uK&{GL}Cb03een*~@lFH}jfIp5+hZ#3#D^9Ai>#n*TX#(61%sdF%JHm9< zF>CO`TIaBu(@n;Rs&(N60M(D3zOrgtQJ>NHZ^llwgxmrjST7S!tx-{WhJPye$s}Q& z_G1jyKReiiwz^TWEEqIxk(@gl1yblgGt1kgAu+CJ{YVzF#xKw_-JbzxGsUPJAF$my z%-72knAJq3D@IdF%R{gHUc#GEb&+GnkA^@&YqbXT3$8rTe`xu$$$zz zzv<)Hqm6-2$RVmhvEN?g{T3crpxA*ZIcOAl2q7iHNhE1`m{Sa59g^9kbkBax^!$yv z!yY+)sHtqLR+{S3NI(s2(V`})HAmUglwm*d@v8TWj9NgUs(5kSX|JIoS9;zUyvL7x zFjc8B`Ve1cQ$W+Ue5;#=grP%q4C^4Pna3(pV}?}-t2&fZn}tNxFSCO7U!L)mE=uB7 zH0>OLQM`O7i1>1R!saGw_7S5r2fa+5wXx)r?acaqZ%Q>9@&#|<1s_?jy6mg1hWtVvSqK7u(Uz4 z@466Pud-KWFHbP*zkZa8YF+OLgN< zd_uo5*6sl?h;eyfy{^C`-LAmi1!D)@)KZ#htsGEZAD-o_$Am|uW8pitL1X(+O_MN= ze3IV-!XMJ`i3ohxBHqg)8aZa=JL5B0HJ}y2_o^_SDXl)^nEBn3jBh+?CJl4*P>=@$ z+1`?~KF!%rl>PJu;5V=>_wfhPSGQ{lLREV^yuN?8wjGF|Z0NLi z;2b_Ve6SwuTnmtgGpsxHcESYmfSs-?w^OX_l&W(EeKoys}oJxI9chiUQI+7ooh)zfv6^v z6ldyF-<#wO%nJJ<-sO_KehnV6hy@(#$zgy?Rur3_gW&Pc_s`hac&6U^WV)E?k_0U`D4)>ep z_~rT!ybzfLw&nJrQ@I*e?=ADVlT^CjNqwMzqU~M?#h{*c5ZHF(M)Lac_{IT;kGG)K z&bRdySq^=?90`faA5YhY&iRH}W#1w2Duu-3OPN-P)fXI@hMlRB>X+~Uzn**G1NSf2HOxHG@Q-D6>OkGs9xzsbA0#b` zQ67QjJ5jwkjhnDHLHyMEps;E|!M!T-#V50hrNU(Vn9J2Ayg@FLonKJ_a+9ezn*^+h zf0+r+eAEiFB_TyH4yltWKmJ$Q#NztVoAJM4Ic$9gr%|&YCxAr6$(c3Z@1Ga+6B2f8P(?%r7Z=_Y5|ANQwb36%2B`J!zVi1RnUl)mK) zDwOCwMX87QI{hA7MwV7H%!C&x>QPg+jF1)8(RO(w(^%*p+d6tfy>jc4;OzEM#1Iag zp(}VvUG#kA{K)+3@q2zO&6EadjxX=4GC^aCe)&x*6JGX_!AfW+ls|$d#!o zzYgT*H!(EYST!~Xc+d2+Tyv1VQg`C*}XvPCL;KCrrnQ4icL#M*Ted!^B=>j>H z#o>J_-I@LhIA&``sI!yh0Lr$T)&u@6%9pi#2SFaE`#&Y#zq4*KDpR%af1?rdY8N)5 zP;Jyd#glX&C*6uR0OHD2ZI7ql`V4^s5Cf1H)mJ0YmU`#|(Yw6w9 zL2q)zTqnhr0+x;NEcA;vYJw4M67&~F44k!q)qadFG0p6NKo@Q%uz zQI_?HUkd@$MuXHkTShzXIqu^=KpkZZX__>kZ zPB&gBzc-q0xUDf9O3t>Jp%OL!W@zynZWn^PAPDOG!Vu_`ga-jg`tfzh30M47W9PIS39qwRLEW5b@(0kb0EP)om5FtJ#!>3mXs50rjCN3iT=_PVz*rn8+P2Uzx_24H zT(k=(jX8E7vT7zIv~_`To&)VyLsIm=-|w^g#hpJmke*ox6|u6(jO{xMDTYh}2=qBt z0t@dkG0Tm|{GF;{x+ibj08fkS)#1?Tl79q{S}3_pl7QYkGVHaxgIXA*m++5GM{YOe zL!CrGmwktdG3}mgl!(Rj-EfwUi)iZx>gR_*a6PnLD?XG8EW>mH;XD*-Q)#~a9Pevz zd*}x3xuR)F1|LH7SXt)Go!VQ4#IF4h@EBr}hD#Z2#xjbnhC;*eao>VSgoKh}UWX`+ zC|~F3^$%txMvU4)(gyya<-gNG1nWEHf!pUkyIC7j&XeK6&!g4{7s;ErAmXt1)600Q zjx8M-MxW^oFE>doee?<{OQ%%w6KFLuB$WnL$+|u}zI^8KeDO2BxV2X$(*tZ0-fwfa zp;5O6hEGKcgnF+qBlo;fWFnRG(^dpF?CX$|(2{&=%wAq}_O zO%by&p{=1k3vTizcaK)23@v6JWDHA^oME}63Ga8ScCRU$GVeU4DUpyNhnttbbMnU} z29n)vem7akJbEIoZ%(jT41@IJhUaCo1WNDGM#Eke8$%) zdNpI=xV2V>JQEFW{;@`vDRN}xZ6^$zFw0iJlI6X65$%(6s&omM@jel#cExjqUaf-} zLLQ=Hh-hq4@VkR=u3j(Zch4EjYN1PMsHO72DC?-uz`c7#JD)yvA`ocvmsNQe;znMF zSBe6l?2KMZVR~U<1o?XWG5(_?3yM=re{Zpp;ZPlu;Ud2<((bWb5e-H!e1AEtVf8yQ zP+IppT3z<*8^-bMXB;BXH+)>J*j-t0c;K4>NWbZONF%pUwfBWdr zhLYGwY%91tC1h>8#Q%oUjX>#b3rq+l_BaPe1aiZy&%m&lqVpjpTM-j#{jC=~fY5P7 zpiKvcWAYJcV=9Dbh}fehZ%VYR=88q@?{f3_YCWjwJZ+z^iR=Fp3d;T7TtoaL#Pl_=Z@lN2?O03y+DxYhX-MAQ z(ISl}=lG^$aww?&V^ZaqI|u$f04bA)pWjq4M@ZkeSuZoIn0q?`TgQU~Qd0O3=gdM4 z$oij|5`lUviYYJb3FtC0h1FdiJ|b17J1A{|v5v;YBl}3&TNlOvTEH?qZ^}l&ID?I& zjP6;7_}^Y%Zuh=GzDfA=6`ZS9ZKO&81r-GpNv3z|Baing_buGJzJqFSnFKB4ikfeua|7T=9IaAhf2)hobs$4TuDIXehil$q$6v1(SQ<$7QGmM& zb{5N8`?&KPG0?sxE!bO1YK<(9cjP#aI27y_T~*J4_Ad4j>8Q^`7uB-Lg{G)J<90|R zOzDZ6!jQyPV_>T$a-aYs_j}EaMm}dFRd2a(?eC%O;HJ*z0|WuXdHjnzTDw4~{YlRx~Z%8gJi%tYuP+9U1n3nai@6Iqb|U#)w6Z zsWU4SI0#kRp5zjliDXkfFtR)BptK|p^3A&z@rI}4{(X!zHdOF(_V21eilER@iqo3pWgluXRVZTFuedS|cMr*NQ>H#u@shsxe$B(MkaiIr?%h_f>_ ztA2c0lnu+5dZ+lm+jz&@Q1ZRyd?kIqKiROFcswDNzG7I_PWaa(+H?mW7{O_xZ8I(^ zMTH2W5a>Wn&Tw4rLn2%+kTgh?Cp?3ywZTLnUJ&m(Wc(OmFN?zA`Q`1~V61QA-vhml zs!11x@rI~r_rBX#JU}a#_7sbv&BVN7I4FlxcI~d?`Y{Aw+M6Ia;GP_N86EbQ|0(SG zyMlw!OGT9eMmKVY3B@x|ErCVIl5*Q)Ufg%pu`NVR#y%H^%yTz|Ib>OoSaM?)p)=UC<9P(y#MgXgYD^|8khwBGW>igWN|63ULZ@2bTl;itOz!Ncb^)>1HZ%I4>UrBlrag$9CKtZ7BPd|zH zWP;WM6sP$lN_?ETMDIQx^paaSU~w)6tuqy>db9OVirT)VNIH)^?@<}Zf5Mt+vvbF+Ox6*rM`kjP=B3}>yl#x|rnPo& z0=%O=o$JI8o<|;2eBp_0o7f=A_jw1})ii;}9ZYd|YpD7uQ>d4Ece;_$!oSAiXBr2@5<4M)iV; zn=r%t#X=U&rcA87xwG1G*y1=&$S2^EVxxV}~9u>$&?9z=b`oDn}4^MHF#M{gWOA1`=qixt})g-~Tle8eQmob?LZ> zvSZ1Rm!7$n<}dR@7fCWWuCV{tJK4wV#OY3Y1G|q9=)2*MMa;kCi1A2PCC)~JxwZ7l>bAcXP zG!xanpl@8MoiBWVjzH|-5Xo~Tpgi^u4SE}P;I-<>@*gh$LZ-~`YG!LPG}7T998m6b z6^<(6$jXMv#e60E)684Q(ZP!ov>JpR#6VE+OFJVI{~iC%n$Hj{*1XaK#17W@QCHx3 z1Gp+hO&J#B(?jU*lbHUXtD>Nmq8FmK>WKiM9lLwf`~3P)Em`jd+hdD3J#X2KevkSo zLkeFxO$&eQVsRVtD<#U0A7t1PPsx{XN;)OAiAZ;mNF6N=kGJC_yJ5(2|f9Etvn34X&9|fG2IMMJExKdb-c` zN`Fs6QowM<2Ez8V-RFC135r|lW?Xmz(q?~0)*qCmZ?8JJE}cv;=?WT`zbZ-O3SEfr zuwWY%qS96TGAQXzQ28BB%#dyzwjGFFTW{EwqYM)?sqlDR#7B|B)N_RL%>xV;@p)P~ zW9E}nVfL>LV~-b9#di1-F3P1h!jeuz-ZlPgoX^EPRTV=XJ>W_63-uM@v(`!c{CVed zgpF--4lf4PEw8Xxck6v>S5B?3qJ||%%0_lxeIXHEx=r36IDXd1D3?{MCaUTiWxyPx z<93^L9zsymz=&`K%&4oxzS$3j3t=AI-ybJ={~$RhIY&X|B`j|b&VP|?v)>-l(d|u^ zvO_L$?;M_wFpsc{A;r?CZOaGOl@9%p0nGUupn-5;E;*f?E0i-C-TIy+#MO5zU>6fA z&Hi1FiGy%6f4(-6$q42AlI;l(tgtw(IN&?uC%#&Bnz&fDs=OGp^G(pu_Xq(JmIsWN zyxu74Azoyl)H>$$cK>t3GWoJyFpA1fLfjuKTm{@d`MkfbG&&#uJE>dGI!3KIO{z6N zAUK>dx1|%)^!-+a-EQxB^w%#F@&r@C&AUN{dO+EeU%9lBQPbHuczep!Z#WbVWx}7tuG-PV z8ye%%c<*|w;FZB+71^*1zhVN3#y9GbpUR59d>`TgSN#c)THs~fv* zBXL{VcMY|e(P5WFPMHISi$s;MWtl6Nd3b0EHGozPe59>X7B^n`Z4A;piK> zea~46{Bi)=Vvf$AeqHF#^Ajv>l%6+eQagbH-XpUX0KfqVMvvVj4fm7!h5IYN*Y}8H z>G4o z5aL&+PG5HNH%7==pMj1lwWMAJUtc3viI-HGJ-$qVGc`Wyc1QwO>iZK#FCy>(>PGRb z3i^XN^q9@wCi4rUizhcabZ}`?bf;}oF`y9e*@f8!k&jnK81It=@}^_`EXSOW*+aYH zF4BALeU0UR?#fq#YCxk8Oel<508hlAldj?wpC;}dPWw<1?_N^3XzhXhYoM<~HSVSTbI_6X2_6ZG^*r6?~M_QCtmR zGF!}REVlJdyPVH5{MI=BlCXzgm=}rYMb4zxF*N=v7<7>e*gO*ydBiP3MxZlH&ps1m zij~LScs@_zlD|Re_LF!)ThDXxxQtzOK=&=qPwM}PvSW~ z9*q0d>;t!Bz2E4YLopwukd;a4%ryv)|W3A*p5 zolStfR(>{d+a(^eq)9V)3jMJ)UoKLA-W;w`_KF!7y{&{Eid}XO5~OTewt&Niw(pJz zVSpV*n}f{Ab4E>yQe2A77s}yU&(kJS#+Hqw4T4OxtK}kESG%{2X8hJP$54m&lg#{V z(m|6LM=P22=NCXep*-_?6=mlg1h8sZ@sNJu4y zzNEp{^>dETO#qO5ic4U_1F?3{xLMZWV}-Fu=hKi`0dqzv%pE3c@iUye7TWb~c1z2` zs>-Ho9b3c@@%N$Ks3ftwLNEQ-66E5tpd9GNSzqb$U<1;1BcH$<+N24Z!>wz7YZfDb z5`5}7Y~8W#-q6>Cp`$rI9Q;9p5fr^%)OI6KGX*_;L76xb=Zvuy5a=pe`^N*@CbgAq z7oM=bOvfKfDo_eTi;k|0zCu(tAgw*7`R%>*F-*C;IDJmvt`p9rq1qATYt{Ly-`3^s z6`IfWjZ#1+OX&eiHv9^H+@dT+aU{a3TJ0Gh4U5Oc)XP)y;zLby(Je;3(sshU1ofZ- za>?w5D*^M4+Lg|hE#|n-$7Z;|@DnqU`9u8IEoL_cEQYdRdWy~ zGLh^ec!W`su>J!-!E(z^P4?Yb1{+zgS^?L6p|){GOd6VAdh*j;!^pef*eUCYFzfAk z-{WC7WlCEp%s(9Z_4q#3MWgB8tZ0z^TW~`*u!;y@vX+O_DBe93@2V_-2R(g!gI`_4 zG*4TIBUMK=2K%+w#&ahke`b^-q4eN_QdJN+x0W}ewU9}WtWqp+F>6MkjCk`Jtmr%U zhwb5W`N7~hva*n;qZ$EC@`b<}-vnKZ1OtnLrdM(ng_iq+MP=^V5^#0G5|0KrY4A>^kS%Jlr&*v zLuBqNF#9d;ml9>4~CWPuXyd z51>yKve2rCtJ^4h2LivRyb|v=a(Fw$o0}BW%0OR292zXhkBr-M8rs{(fIIQwy-Hzz znP$EKj0J!?18;^KN`TY>?pdSDZ$@wJ-=52iytmV22XM7fu%JZ1UhX zCG--Zr~xM(HIICaB8&T4-S%wu7v!?p;+#qgdd7wC19yd#pN?PPx0Y0{4r01AJ=A3) zqJRO|=*-@6f}k|&whp*Ct6)wQkJE?vA0l=A`v~nx?6jD-qruariKk3+TdV_1PT=hA zwW<9+;jMN+r37*Y%T-D!rJ3uck4n+3;a&NmevfGbsRub}qD#=2lqw#ABTkg+l#7uF zw+PYL6w-WGgthP%yM2mUoD9otHh!}6&0@fu*T~E-t-TZwN}dxAUz3$u$Nc>3VBVm) zNLnyjtsNNlz$^Ro(u6kx`LGx`O7G8{_b1N6+l^nw`#bjJ#HMaO z>S_WL;|xuc&aWtK@_)CY)`gpY9$ba@mW6;+0bqhGL%cVGl(8r#Ldea{&YLz@GB1~^ zr&7T5d?9V0!dY^U@jj+oy1hCW2Ik=$c=`joEBDU9DjqaoW!*~{cIxgbQ0Rik_VQKw zMn3j8@VS1LCySd_l9}2ScF1L7eS2FO0`7fTG!F`SI_W<(8=k|nrnYBCwS39aR6RPC zzTOvdj6#mn%cQV1zGOq^U{Ub2cl&#DnT_T%j0B74XjU+c8i!Ty5n}kpa8T|}xg@@t z#CM~V2qDMlf7h_Ua~Ox(`vqs!o>jr-6R*w{CNG@(Ne1A+(CZ3c6D~xE$TAb zWWWhJD*0uoLHV%K?L)c6jseMY{!r3OY#zM<*B+HUz!)vlj zWFlF)b+*!xc^NuReD9r6(8@UghW^>z2P7D4JG)xonnPr6>w2#>-XA@jqV)=k-5GNFeWf7-7pb)40V1ZBUkvuc%bscKr zxnpxVMSS=N!_yJ^JMKl0o^=QEAr95y4$xcKOdJgBRobL+P~N6cPRNL{6=W<5@;46< zbNk8raAQ-tIWM1QM>&GZ{p=m9WTrvrCst;fw|5@pI|lh}dh0h|473bJEb+Q!`UtCM zpQ2qHQc?bsN}+4dG>YaDl;0c5Xg}$Ex`KmMI8W)*S#~Ahmd^q_7?Tzx&e515DWDq_ zT!{`VMlZ+YdK%4A=PFfo3v+0hX|S>;gxVHKk2?jewkI!!vv%=%UjEKN=HVgF&kaoc zgX?p+OCF~l(`!~(y@T=4=0bN$rwxKAW;Yn*d-+ z_&jF``vSnZ>gy+L#|p&OA=Z?cH z5~AK#T8*{L#BPO~{LB6%?fIr#Y{Bkp^`!|owceC&7R+0K8OWzXFVBwLw){a`Nhj8_ zY^3;itSMVgQBi&#Xz?S2_xY-L*{CD0QqAit)N zJOtN=*SF|9t{1+Pc$)MU`1zL+H1 zK5iJqSJr}LFmumvxsYB(e1=`6e3nM}($15OUwX#!Wg$|kAP~fun|BdAV1d1iZY3NG zbrI+o$S!!W>lw-&af_makg-b+x_GhIwq-$i z0JOS+hV6vV8~?jY%HUx{V{v1n2yhg8Y+xo{y-Wn(J{z3vnf+_tDM&u^+M|*9y;$&8 zeUbw<=~u1q%11v9E1;srtDXuHpfU=9vOoE5*z=vr)J8%Q#H!^d7LPh9{T(-iJG7Bf zU0pLvNh<{1KG$A;i!k74V6>*Ry&igX&gE@(8^DYWF3d7F`EYAwQs65ZI3c9i<7(Q+ zlZadN8f@*}1Y`J{)Sa3eOa9Y59QH44Q3ZvA0+s2*;NN$t_leW+Nwmcy(1n`m5%VE# z-yL1k<}$d325_Y%aFrhLKD@W+!k6Kq>rWh^&Y!<$xZw&l$1OR&g&k`_mYJ{l(;eev z^W5IU^aIZr+c*F1O@T7T35#~@Y3nX~&w!H%X7=_=gooE6)*X6=8&25;GgC|%#DW{u zd86`}&kPVLHihf(My3nA>eU*$oX1?!e;|&@~`%*{&LLrYWh-&6GEirG@1x>coA2`!PQ-uM=4wThmnn zJwgv6;BZcH^kH|*9zZ!;9Q`lcM-(I)l1 z)3-Ebg>1wojN{trH*%#Cnk7D^l;sgw*CYEAn(zf<>S3s1k=T?RSa=#q=CDjt0yI?> z5X)N`&~^^%+uk8f2xhqMZjnxd?oR$rlB%u}#wc-@cp3~rh2b1ZRh)rz1pYx~-RVU) zkM1!}C0+pCnc_{|Hzgt?z}saQ0+-iU2hK- zsgM97dBXR$_W6?ejqN=RapLvw#QpkR#~_d;#yY^CggYg92X{s^u3d&FCL7(ew5ODIN#)C*Q40?03e@?V7Tx+X3q*f4s{1DdVJE+r2cP7rF@ z3nVOfXEj%=rC%yuK0WMa^+aYC&GMC5`yrR4c5PnG*V}*Xobse1sY-UCUxUr~;4w66 zcJs_HHmfWD+&lWKn9Qg)5dRDMiZEk|krp~Q4(_rkyg&ZW-6#$ELu znhud-s!3g1-d_eymK1uxp+cvjDlVc{MiYTu$iPzn!yBv8rg2p;%E-q2?D*~pxYq!` zmUR3dX$Uo>^S8+C5hX6a)^~nWfnND%7Pmom8$ zZt0NKU%sI95d5`HA@la#dH^$q=7?;ce~xj@7)%~xgE59e`T7#=-d+d|nrZD0so&j2%fPW?H^}6W2 zMdo);@(TMpEc8IFa99vwjSZ1St7iG56G zKSY7W&!|k<-@QOvf+MFnUYHaFx!yS8*_wphXXoqR16LlXNU^a{q9S|_JCLJ6$>SlF z-Prw95xXL&X-wm8Uu-hHNGg;3o!pU7SUU6qDSoVzrFHa4@e@b5K&!Euu%>N&xj7K3 zXHTrOQbYC#O801R1YW_@|c8_G$L>zA^ zd?Bw(bFmSM*=RzHL2d|=I`(R@kp3**5Ds-(aEa3WQ8Ur4no)|>ypI}gN_oXAy*$=3 zpmJ{r(7*fQHa111t@VuC86~?_mqO}#M6x5M)1Ei`|M{P zU8q6QdSr5yizrBWGr#L}(*8jv^!U>*?tt09AIbd#^#xd>GEIS0eDHtC(>u7nTewX= zPn>q`H#lb^G{izGzq6=XL?BkeIyN>pZnbjb225=zq62$MB#J@65Z^>QT z18NyzwzeNg4O1_SLy{uL!j##n{-3>9L`bnJqAB)3q{FKEix>AA*x}V=u%ZR6{*+W zUPaX!KQ&qNI4D=e8eE7w_WN-Z1<2SkV@QeeRPkdNC=SRFDlIPp)dRLyCZ>^-VjAh{ zGyhya%-5(&NG6AmlO3c%XJ8ZBx@29B6EJMN`Rtu}M*xe*(jS>%yck1PH~;m)A3#H} z`Mh#`pJ<1f!7ZL9QfJCzGmPw4XVRSH!xhFR2{#GLnrhrr#U%k^=1|>Vt~U~snPv|W z)57n>EKZ|3IuvA1z_4_E#hhn2DY)yn03ULP*b_pCc-Uv_m)46dMsCPC1OvjYaLB*U zIIgY)e668B*9x^)3$%$9u?H6|1K26oe+~&dlzTlregskrfsytN{}{fbR&rdSMZ$_S zRQZwa9&6MFS>3C%>&X8q@12WMsJ)Rl_DO78f^rubSZ@aDUTo-wI&-O9-ogrT# zRi|SD<4GT`>w`imwnXqRmCDc2buEU@l&y67l0Tj;6okTU>;1Jez-_P^7+oqCAwjBf zzSt7M)-K^ryIojMvwxweN=jG83tTh@!d;27oy1#?KP3MLtKG&^si-Qw0_PYzN}XG4 zgg~@v3eD6f{a~fa3y!^6w+?q0^0q$&a0Dn_oZM6=gd zOcADX4&agE+t~?T;(kVArnsx&|Auovb}I8v=sE>`@!cM_3HjMB>pm=lqV4gh^jYU^ zzOx@l#J(Tfc$Vw9$~ddiF2^^jGZP4KnOEc?cx)-9^mGaSwMNR*B0o)#0C=TC`SOE^ zoc%Dar_^t_#EeGDbxZ_?vtRM8k{zaHgjPPBFdcDdZpUl$`!WUxic84 zS??2_lh1&-po89r1iY)~`?dWs{yo?)o=+ozYNDp1qJLfFlTUNq1VRjF0c=w$zeFx{hR6#I){9l%Aop3JSYT>@C34M%ytd62MohH9+?8k=6G7?xc^ zorC}yjt`Sg(UvbLRs+aFSfNLw4R`SPP<#k+~o}9eTdRg(K7MGTc%*;Z$*4=~dHvF=7c6LrJC3&ms zQT7?;6Q!EF%AzN)ybhLZobANoV|K16z?hc6GEk@f8_qA`4G&21iWXo}WWbOL0c{hU zcwNR#4msH{gB9uTW=jWs=1{7D($x&Rg9Gj((a>dBAidS1jOCGsPxMY_hS**!n0Xs+ z`f1$WQ$Anv#TB%gnsO37PAC`4ess5JC*`A1KLpBEI^uKbChSUdj%N!r1r0L_8tK!x-q*g8y6H@ ziAm`Z_czl*X77;U2tVTbs}EmVWG&cb2!yds1m*$aCOSp*7wj{9Me!E#1N2A=55thV zq5wLV6@{-~U?f{P=9NttWR6%rfF)JID>e$_+d~`ggO1Q>QFHkF)CTXj@ifK(jK4qa z9EJ*0bw2|beW}S82f|l9hN?LPTq2*qQU$YHUp9joZT6pE7FSkwfN(+Y6DxzA+N>7_ zjSAf@Kn(X)>y{fr>3f&*gB?6mnx6B&)$50JAi3{EPaJ!T>6)Xy5q^9T1b!X}iHrc! zjQ|y0*6WPlh-Lkee-fs&Rh5nFkMb&PnxA> zbq-!RTNqNyB|LI8300G+Qev&NS0qc5YK2yxl8 z5%+M0^mvPrg7G@=4wsPxri!Y}=3Y>Ja3r)ZWVgY43b0c?YT@BQ$N(-C zlzmS{)s;@7n{U_U8X%N;ZKOq6A4uEQ6)cx$t9cC`PMTnEzQy)T>5xh~Q(?<43m$0! z6P5gkZ)dWiU|2TGC@dEtUAlU&??&c=&g&F+V7i|Ah3bz7%6SuTtaUz^!t0#Sz|o66Gg( z#i;?yW85E~>37$f`1A(V2mOy9^h8l_mGS^`u8(SEgROk8fg8#`BTmFk<}YDp)XCvElStw2s7IH`MT$`@x%uE#{29}tL=v1x8LEolS^BoC|3yHK z#EFuW90*s(FA!D*dm_RH1jD6IO%IH#&s4Vu0Kfxg?ipq7-B9-faM)RfaEKe`X$IB8 z*sX}xSp_WF^6>Co@|yws<(>ckp1Wr7SYWVyG*=3Y(Si8K%O(nG;uOwoKcGJFo7HRo z7YEjIPjeCDPXO3?Hu#IX!smYh9E2o#jr#$vj_#MI_b{+OfQ|{Pzt`<^dA+99yZPgU zeFj%Ah(79E`YZkqI0@(}?SfC*)CZrarM&{W|LYolB+~nsrXK?2PfYnvwhe_kn4u@$ z!hREXwZV1lUPP}tq@8SEO#>gsO%cvbI$E@}g1ePn{c8gRx?i4It`IV9)NQl40Y; zXXHt!NBzo$U^A~>dXnITrTJRRRsWgprG4V#iw~V6T@edTG>H#RkhTcW-Ey|&}; zBi_j7^^Q3@;N9H<7-%}G5kW(WT1GY@jWD<;aTi96-t%eRb@O98LBeQf0y4Bf`|4eg zvhlpf_3)4dq`Cooi^mt=ydvd@c|oe|kvA-0G3Uqr{C|tdeKA4SAlx7p74yZT@LJYcxibEom?AuWbkL~-T8PfIv+nq7$ z#;)o`4_E)jijg^Oz=)=8d%_%0JJbmO?US`YNKKv}2|F5E*q`OIM+l8@j3M3;(1uDv z8luAeVBi^I2`GEceQ+cjS^F=if^Yya>7C}*@uRrX%T4{8{te}$P z5>P~5k?xBTm%+@OWK?&W$dpDQ;6JM85g!pYVY|8}T;3ittiPlHpE&(%T=xA_50MT^ zpigE^UQxrl8hCn-gqBS)YCe&eWzbeW)>@G*{7pl@B2FA@ctl#1F2J)1a^&_I48;{0 z;Toayq@J|q??Sm7EFF#>?INzamqHOtW&0}88pUXWW@3V$LVE+b79BsVd7UZ}w#mL{ zq5x^8c`H~EkYB3dmU)R5JuPVp03FMobM)yKVoy^}GS>vHKp}4&llL ztFq*kheZ>#H-U35|1%ej)_-AdOup&H|MdC&d89un|ZGvB+`=UTtpiTkM-Uok*B{KGtioc97h=t@$vHlG1SYs@xo^$i_xWLsCg zOAm+h&TTk_3m~Onq}ap`jqGiu2R5IwJ-df>^wNtgs$=Pk+fO|C&lEp$uh^;*ZQgDn9O4iZSd9KC`G7xhW)de zz@P+Tr<5+d6@KCX6xSgzl{rx!hxRMoXP5e_Y4rp;(P($@3Scs zxjE7a>wOd^duW_>`uZx^yH#az;(=EMbjUV0{r?4H_Ef$-R$fv2T~e=^bJv$4>?4|0 z&nqU$&TfMx-A)1zQRFGDtWN|I=&PHb@;xyRPBx!fLF>eH8xoiBGN@=t%S~LX08GR)%%*K)g)?3YNcpKfJzGofm(JrmQVWna=hhzAiHgjoNe3AvMY zirm_Plark+{v|*}=r)ksY&)ok9|tv+V}q6<0gDq-iIbXloOtIu^gQ940rUZL+wRPo zEQzmW$Bn#;f@pVMQkGgCJtT02KJ%`2^RN_lEn|glwhd^7-7iZ|S#Pv7I;XsD-NEpH zm!y*k%OZn7$(#xiFcgAtlQNT1Q)EBl>ysS6(s-IVRP?k$ccgDcm}stdGuWA^yIu5y zS8xxgMPw%_k5`+bWpV8C!%eEo>Z(Br_iO9!|GAnRs);NwXJj(y`29X&1%~JVb%Sqa ztO!OOpiTj!JU|`lu+;+{PhpWt7bE@50s&0YTY-B1--^;~pP^w*y$NilDQtsZKlwbq zpenSyt9~^q_4~C)fy|5dK8?7NVYv?t&6PFPq@e(}37Uy;at@auj;h1ax$!N zH=~JJm#lb0=OrSiqgJ8S7J}u4hxS|3hskMjyGgYtve+d@B?4XpSV|YqCETG7i-2qY zKWr3ZGC<7eUn9xXc|y%q zUw&-*yHGt;!K2417zN9*MD@`<>2fU2fFzgwn5gV(a_!;G4R7dac99huN8W#UG4Bm zb6fZLm%dC)ESOlMO^rIvlkPO}dvj4r43e3kiu8~JMg=GFi2HzmM()?w{2&|8ga{yj z25_h66l%l`i>vwtj)#Ksam%#S0wpEW#UO^Zv5ARfpTM?1ZH9wlX$IQ}m{}ccu`$W0 zUGrL1AM^Ats&WW9sMC8Rx|IyQ;m70ML*^mlw*+@0T7Ke6Hu?&)wnjAWPwMXz&28}! zcHSJjGkm_dz7&kNBd3EbSHjTZLRW?FNi0F9J}FBT0>wtR(8-YVLeTRH z)0}x{z1w9TbUH;`-XxnYpO^jOt)=YRCdRJ}zCDfL9w;z>X6usqeu2M3IFHQ@t{NSi zGa2>rR9hYR#_cZ?653Wr@3g!}=R0RFF&F z6`RjVotGN-K#s@IS2hc0b>dqtvEWZ~zy}8r=JKN$iVmoST zuT5jNxa(80la?rX2Jn_+ks2o3Sph81G%?*FxiqRO0-dCEv^tLzsuGX-^hbYs>4WCG zV`Ju6)FZB2f~?YYqBWMmYwAoL|IsDoLXyN(p)lx&54UqYke-;`9o#=ec)F58y(YafM>V6y(T{=3*|53rpY5Jh5okJd;17}B+VeW$hv{=MZ2>z zI21rnP9#B+OJ4bANqs%LU8EV~1Tm3W$rjo+q}CMdcw2ir9J-KufGGy_tr75?Dv#T$ z5N;Hvk|^7Oi&PfcHKwxjm#AKhjOC^;7tAZNb&L5FD8{m? z5mz5M)5sP@F_F=PxxT}cfH{wujC)+6unvB>U4M0u?~7`4vHPZ;bGdgdP=6b)!?p8G z!rNhcVCn3k<4(X~8!ATdk;ZI1eQUAWL`vPw6-iS8-T7`xBHiU)Gap@En(b9dpGzfNzN1(a&f)JmUwh>* zUKq%6D-&P1K8pzFO&PknCaaf5O5xWyYC9gUR8)6q8q2!CT^avgW= zXBY2K(n`OVW6T*{qm-^~20^)@DF=Vy7)Q(E+`r@4<7YEUY9JdY``sww%|b5$NRZZ)KRnyp;~(<`=I2iMNu=6o*?1+ zbAE2|%Khu?*{H)le9IT7*6J&$GnQS=808u5)hMd^b=;hjd%_c#gSrTrR+i;1l*%2L zv_C;sUxVZ>l|uOsQ@+)bTPGXNC{1<8$5eTQ*M|f&;3}CK)XmRYa^T?N@;Ls13q>I^ zwy+4}j<%yM`-G32>3KvecoC*BY5wVS0pr=0w&XdP5IOK;PxwbbtAoRrLGO1f;uAlB zhaUxVhiuW9evaqC7 zG)VSAAPKZaILoWxD9WBay26g&;>v8Rh=VG4BV=sVb2c5 zQ67=UqJgq7om%W6FNl=;mVWe^*83hw7v=%&QZSO!A;?A7FQd)tXPH-&b(PW&I_VUC z0vz%XkLX&S^`(qmn+G>RxXSsA0_9>BA)$$>JjsU;gL~-lbe`VT)m1q@g@J7u!a+>Z zZ`M*?Sr-Hapvyo)_rWufAROG`ywRUXy0AliZp8-IAR9+{x34&hZ@DoY}=Up%6poZwXS z#5DG&91wHy>1ezK&nu9iT)8W&@Pv0pRdXChg_^c4kKFmiX%o|M)CP8#_>9B-&T5;s zM%yXzI_>VS+G#rf-j{&FK!5DcHB#|Al>xnCGNihtF1wltG>S@E5w8~<-%--ZBl#u& z5~ccDj>#C+*B6&~U_n&1q3V0g#21pg#X=MfWv)!r_P#XNcv+BDg;nJakP8>whrx#z zjIz?DZO))P>=ArjFd$v=#LPlQ{fll{5LU{F?<5IgCM30F%E{$b9}LMB6+VSzAe9f{ zE+~q$e5ttGe=)Xh-#CkXDaesde?f*gBwmt~Im1x@G?JophZ&Q2_%-W7K;RognIY>k zZeTN=u2s4lcbdp@Z%l(jo}Bd^o7NMV);@;x6ItG=%k&l}Cz0V5);{BUE0K`nmXBAG zdAS8=8UquP;j0M0x&%TiR0|Qxpb0uiHv=L zVNGOb{b3H3^C9LIBcDDJVG+}F_Qr4yubjo}zpw%aXwwvD({mTGp=w4Br(5dYhy@+H z)xii-bM$c7a9C9$G5v1xMjln>Lc+nCz~DMDXpQ^KA?hcwm$HhVV{dwr9JSpt}&!>KeowD9<0|5l3R zK1x~lp%bF>QSnS*Bq6%Fndg0qN4gN_ z3aO~%+%7Zgp3+n=!(S^it4&%qfjiJBJ}T?6Ru?$q;yo$)6JJJSikGgU zBSk~kW$9Jlxi->-r)Xt?)<>L%@5AC!zhzrq)VI}B=D$u55{C;Oo*eLe*>+lm1` zHt{W0!QU=$CH7_7tqFV7xxE_g-s(1;mb3#vxLFvoaq?I!y zJE|@HgrlIS!yQn}ywyXct~R6^sfMl|(hnEQ)>Ld8xji{UvwMoE)W5MOa7%n~k+3g# z>dwN|mNKVFq1N9N`-?5(MrEMim!Xgwc06c8(G|+}$3!dlO82thJyvKhz5RSL)x1s3 zt!ey;EJa2sMTX0?QQD^yT=e1bVLsc=u`g(frE}(-X?5C+C38o}+e3BttfzrQi1b!g zR{U4L*}ZRTvrK^-@FU#mU|i^(B`q@ELN%Yr3f{ z?(i-4*`&SVK+R&RS=1$;CaHuEt5_P5kDBa>ahZkrL!-?Ul^_d@6Qf7y&vxX*s;4g3 zx7wMQzdaehvG@`u{MdJh8CgsL{#_3y-S-O@1>~>0IhBr>G~OhP#92*|e#;a8pr+x2 zaIJ7H1?$1@6D-QS9)i(nvi2WUVM`+!%A1gUzx<51sYF~dt6boS)Pyxg-SvdzBN?x2 zhSeS}q-J|*YF4>l)vOyLq8cP}+Q><)V{O_7&ZklF^!zf)I+Y~GHy*U1sVFKwfhLFw z8|)*^Z_zr~LOER6)JU^1)c9dE7E9LMzk<9j>R$ly%IkMdtoAF+y zpldE^Nk~UC2e?Kuq|e&rIP~=NWo2b7TmUjjf8(h>3!fP!(0^`DEz@J~L#EH|(y;ji zr01`5Tv?@EA|B)a?L-gQ`_8285kDmUOU1VycnBOEoYb_m)*CJVyFVV|#VSRhg=63w zz~FzQ6O9%&1kqf7KV54wyCQ7hM}XO9j+s+0l7>dqcK`|~X2ke}iq5$J_bpsU&mu<+ z(wUVwkTc;hM)b>t`${6)=pPp$rCncQWJfOBrXo(Cih~y; ze!4_@NIKzTI1|xGPSu*=Z_~^J5SK`RH9b}?=`NF>h_&q&qmWm2QClPwy`&?Osw?SR zn!d$Alx)I2*9)%@@W)(sv3{gwj_TQLWJ#UJD_0T>s*`nniNVu-7Hq%TAV1OVFARb_ zY+|R`wv5<&W<8QE`mrCKdo=n-Btlnh6g?YE(*Gtz;fLhL_a7Jja7J7|Si=d7Jyk8X z1$N`u1jdW7&36$YwUH$}t|@rNl6ss1N1yKVLy2^$&-4dem=o%l7D0nw4`v$hMK;V?{U zO&uMtjaP;{bO3ild7kpe932W>9coKtlNsDDaeIVW=r^^n5>|U9vO&B4{$Wv8;llBh zZKK0@bw`KqC}#G>aH13HM)4tc#}aSEh>Fzrgwn&3FWySLU8z5^9m7Db0ib%(RX&JX zN%*4(&?7`4ZzzHl=%d8X>~l2Xt+s*3i^T{gE;0nJTf$UxYFA0S#Rp><^Pjh$Qcu4& zV`3Y{$jyb;o3?5t9!AlUp-`bOhE&@~RX{+Lvz7u!s9_iMhus$2%v@vpSkAthM;rcF5-uwF9{jDa|XvHu}6e;de5KjZc z>l>Hv^C5+35)Lh#+jcTlE3X-d%nZRi7@%WH??2*I@8>4j zY#(@-RxoW$ZC;^1j82_@)DcX$ySrQc`|6qUgU#jb;wnqVjjj*7{iM10;dF1h^1aaSm7aU-{k{sY?`U?L+A$gaA5Ui$mSxvF(~9 zZlsZJZo0dqyO9nl=~Nowzwr6qf5TmlLoU`@bB=kAF^e&QR%7SD|NP*sNdUM+b8f=T z>%Czf$y74{0?9c*$>tg#V698X2ok9Fqy30$pLDl0`n2Tu*G=~o-^c}eNr%*y5kt*f z*{LvMj{{9VJg@J1mpuIuS2^h%i|fT3y>?sKfAyWq*bJIm|In1;FL{6WemS>5vgi!c zvY27&p{3RzrY2msHjc@HTnLr4;ve3Z)Jw5vD$Bx{{^hiCz*quy-W0y)G0&QmTE&^g zc|ldp?jK+iuUAuIn&cms(scgFl#}K$=zRVK7ykN*NV=Gr2QPjW;_#iBh$|{qUlcs) zg;56%p56;-@CPBo#w!?3BEpFa*^e_})+S#bpOt}Q2=_VsGR2E^{(HGK%VXih0MyeE z|7IC-{Z-g&V9WiBg?DL%z~+i75ojr|APb8*^2b3B5 zN`j&fgt^rBwtMM@M3|V2Ojgj;@S~hH%pPb+Z*R2|D z(Hx#2S}az)?~%~R4qMgA2Bc_-w+Tv5g#ql7l^JB zi@#B~`bP9Tvv#K?tp!UbjwT8APkJah_+H+jXr!4Zi;8AT|=>^s*_w%~UDCgQF6D;u_C&>zPOdz;?> zu}H^iMu$hhC z6U7w2Sfd8cp896dVd9Hyj1chbp&E&!0tUm-$Ym|v2Q$#<%*cQgvfJB; zIc_bE?w&et7C-+3KY$caTU%SH@)=?RsT0D@VlA7xqX^gKp+D6aYWPqo=1v4lEJjEe zT+B}IiCUObv|Zhhcko>KqY*3+M0M4B%PgshhT~O3?J+fmKt#X`$jG-Ey%p(`ErXLm zjG@x9Zo82!Z$wIW>Iwn2+6F(DAAV3ulGiY@BnT`ofMiAz?@XR;)V2yaI&4`&8FJ|D z5YcUWfuXf7D5T;bLS^KaQToO-p=lS`0^`6|i??a9-@SMdb+B>5(YnONY#sl~Bq`J~h1xr8pN}?Edj-vKL|>ZMrbhDyg*fm?MQq;_qw8 zJa0jI{{VlDD_~K<<3wsd z+tdhyF+0PUeBfPdY#i9xAp;6YKy4|YS^XU}(rQ8(XOb~VmHWI$?e%;$e0S>ZHF9qa z0zWqss{eN)<(@e&tpUxnUk(0l;X$+oqO9w5y3jr9g9quRDM>6SH0 zX>`ypV(u|hQVZo3I6yNCdPg*nUW@BCBP@sd1C9TF~F&+4rl{QCG zlA*I~S6<83@z26YJW~<$h5GiDl6NzWE86a9uVRe-#?*Crg#U(3PiaXgmdCE3ljh=R zuifNdB;&F31Ox;8jkrwyP9|ULWDPL)_X%(7F_Q+eAfB_9QQI&+IHQ@*Kq1_3!;~Kk z2(4f8cx9Dxp)rCuT01-Y;vo;Bmk>WA7~WYdjlGzB5`V7NgjgK_=N+oC7zM&(js4pD zTM<*;`RO9tfu;4DO#5Q>3$cTfTE1Y1#P7>pHI1nP^SH#}4|@Z9P~3?2zMUzrXAD6P zqgOsQvqu(w3tT)BLweNycnrTG z5sRxQi4}n8%$wu%Z;d0U#*t|3vN8RObiK{_P#Y`nUA*ENG?_?-&7)Yy+5g!GC#>vT zsBsZW_*2D?ox|C}EJ44FLdkemK0euE6;M*+=F`J@7d4_NAeQAmOju~?>iVWLWqJNw z0_sx^p7MY7sVA;itTFpxii$1|HD%l2(Y@W22wic+ZhC{oG`cw2!E`R*TDt<`+GWuk zoXwkEAlCA)5pCmS!j*4glzVY(l}H{f-$z%cQ#y>i{)mqV%o0Y9MQb=mT~7kMfV}%M zNb=RKh8PS+#})N^V2>>%DRka5VRlL6*QZ$GsHB6!I`PmAjJjKni;ueQ5XTM(jQ4-O zIMOSK%JHs|i+wmP9+h*;&STfl1hK7N#cRuC+QnSso&ghctQwiJQLKW9X_(d*m};NM zN759-Trn-5c}Soj8X6kJ4{-Uxqk>$!`zmS=glcRNGzFAPrW-62ztJUmm&f%P@sX7Us|h7Q@zX zRTHipC-V3Loogw=A|7>;kkq!ifZzkv4{TmIVVp9NMH|Af^>9m)mPe237YICWR!Zf=8 zvrMuF^S6KVP!S%e5(*kcY(n7?sSx2HL&qNXx{w|(e8bN(dn8}`?nb;duiRY?|^Bkhw;>5_z@{oga(_%-|ntZ9YZ0b;Hggx{(a%KN&3_VeSrHMBIMYfG;cE#RC zMeC;e^C{ZGDSmq$oU(2S0yGU)P?U1H&iXNe%mZ0>YG5{4RS#FeyGi!&GHG&K!5coQ zVqhws>+}Av@h1YVC+o+8JK_y`|8~k>{mY!OlKIb!`I7QS;^pg`$8&Z{+Z<3o%z{Fb z+s9>rkYq1T+AhBH=hUgS5YrRAM)+Cb2zbaCcsTR;-4qZ%-&iD4Da}w@NzU~7uxE`e zV5LVHdm>U*Eyg?~%h9z7okb`loiWrE+3b>W-Z%4h@C$wky-2X{h87g6JusA$DsGc= zxnZ%kQAD2-3aVf3%e$s`K)U5Zg+Bx$>LVX}`vH4BuoVFVYf ztGv@-m(Zdf@zl6leO(p%8*PGNmK2##nPL%CD2!f{npTrHdd}R!Li_XQ-P4r@LLTQ3 zohk|3Fkpixe~~K<3M&e~EV;>O~J@sOTCsdmi+* ztC*&5eo9T4-kt1PZF1?3%r9>@*+uoiZGYTQp2yS!RimnRMqReYl~toNdS|o^@`O&R zB)-6K3Vp1bKA<@JaL?tBGRKI>Wtsg*@8pM6B|1Y~AuKN!aii8h)^)~Q*FtnXr4^|R zQzauj_zBGLg#Z{cO1}bzhQE(ohX(he^|ym6YCP!&<;f+S0WpiS7M4UlsfOEx)$Kt) zIGnMtyg2=BMfn6bhhS!^Elt`AYhwGhL=-aP$RsO9J%-Q=Gdh!oN9A_Y22TeJ6bmMz zEwm3M1}|Xu8OErFjZdqaWvflNuCrpniVddc=0ZZ~f&jmCQpPqqyl}ni=r6m_uUuVaAd|U)U&2Ac~6%Ss3XW zhHtkGbAq_}$hpzdEqd`BKjOXQcy#$)3=88&B*BNqIN#*Qgm^TD?BG=dPD?{|H8I-w z;Q+&(zbr?W_|bGvf}35E?h6bd$=RQ8axNYOE=sBWY4w#Q_;IL4LTio3vvPKXsxWnU z8m|qbuIP&=#n_!Uck}>-XU8w$=Bf}VjKnv4qD~BYkrwNM<#p$VO8$zd)rB5aPS5oP zaw?9@&wXuX&%?4;z!b;GP2L@jci9_3)6mo`dlL!FbacPHc-z~@iH0LPJ^r!Msaovk zopb4Uo&?_1FUcbR9oE|iVNm5W<~_<6Rh7itSnDR4CY`Rcr<&^O`sQYdjtz4cmn0xp zD#2_e=PLeUWmur-2nzX&?&b(5)b)k7XD*T{0#OO7=TwyF?N{rru2<45H86NleSGi{$H5T_h zj}nwyC&RV}7#CV8@7&3Q1$%Z+{=jkQ$1gllgolwx!L*9HR}@Y_N9jI1?pM?CeN?vZj1y@ z%kC(+qI40`#ZDE(pJ`*~@Xa9Q4B;TfP5BefzB=?sJMRzw(SOD7`XEHQ((Rjf!BmXo zhsQGvIok;(P52JC>Jva;;#|*hu5n55SI#+5waFN zA^E+B^XAvc+Dz7^S?rF>O5D}C(reGt7+rmc7<@Fxx;#Wr-W5j+&F(XYuyTv|DpA{3 z&1%WkTA^4-?n&buoaX%M^fjQ z5%YKkJilTK>7{M%scjg!dCkt)^IE;op~_V^2qzvx^qqHdtKs+Bf7KS`^~rBGFOJI0 z^G5kB)`c~yoz6f73n@%yj46d({r80OaktpPl0MEUYe1Qmg^jL7Nu z7peYMJn`&9(OMd=8^Zfl`lH?Td(S_r(t=N6c0#T@V~u#H@>>#SlYkBcoLfM3xJs$< z4J`!{$$^hs{(}~{xgECzxX6S*VTzN1Pp5?#pi^pOK>wN>RDX9s5~LG?c~Sh{nY?GH zz}(NgHG(}B43ILm|`fA-`C7ZHX+`g#VQ-X}Lg)!vxius3KN z-8Lt&)bDzh)7>$<)8kuho1B&b1$ZjI03V7)2G%Uo(`l|o{vDM>CT_7v7Q!s;KsjzP zmIibvXMtMXml8Ebs;6-$&B3V@Um+(Zbqs;QEir!OjuwNLA>y61EEThZ= z;SDe-guU9K<3xhfz5AY;5r+51YKYe$qmxfX$pnoA0iqsJ5JZ@0OSJFol&A)vNQEsU zAZ3|#hV6Ug?k2ZPo~kb9x}SMR9RoWe73afaInjiRgrdn2Il~%l{!30zlQ669VE^t>ACRE(T7(zvOxTG&; z1qWN9&Qu$xXS9-Kd(FhTbU}+=2UNcr_TV{>z9MmsJONc|#o)0%HPKDf6>(ZXUjHwn zPd4(XP-+$GJKWvH%PiOz!1sNVZ5PT^`5zAp-{zh&#n;`E-lkB80=AH^>TLsg8votd zqI+bQx$=>8xoL@n6Qkx;8oRTSB-!ap`kkIm({zrz+Rio%8}@0ju}Hw2df@Sqcf(#Y zsx1u;x|M(M7ak*laT4-_V{o2JWFBvD+-DjL93na@TCOfMVJ*rCf^?Y=s#f`Z2t#Vh zB|&q@`&fsl#r*ogbn{{hTFh6-`z3#=b*%!A9BQY0FQ~>Z;3!Yog)loLS{kO;PY|kB zyZndy!~{*!5vi2hv-G&CEj|`&j1AIcz!m_O(G8gfl0jb!F@t%G(+y-pdrT3X(}0JH>zdzG(_*T-c;w zLzcn1?dXJ($Xb=C5bK>X);O)ri>+nF%~ia@-}~V8qGapmgYOi%;boY)PE$XUmsvIR z)$q)!WO7rk>#R;@OhduO;g(!t9cW|4gBRhAxW7l|1v!aQhy7JtEA~K)Cnl11r(pTj zEh-|{kwn2Zw}?i+Xe8mcu_!PGGXXB|e@d`r)!lO^LHr$n2E`EzjJ3HO0CGiVzN+~B z_h)^e2Gjdr4VJxo0m+oQGxmxGS4`oNv$CT7Hhojb<`vH9$`G#;g z_?>)K8OTJS&*4|RdM}%UJlk~w9yRBBM}$d^FD!+s!Qzw+<`rGgqOfPc0F-0eP}IVH z7+R>a_gM&zyaV6LD)JSu1d+#r={m8poVhQqWVW9bGGB_oOiw7hu`6CS`l6T(a_5O{sQlY3*`?-!*|2wVSS$X*q1Tf*PXgU=KVD>a++V5WBE=RQOs^KeE?ce@VZHR-N{Cf-&3kG9Tr5tyi2I zS@}9L&>#W2U>qS&A256a8l%ElOT(CzhFxdhtU;%V-FTrXpy`pV_>m~`Vr%+6Krf1x zNt)-stNNUu3F4LIQUp}ZPe<9-5Mm?+v{HUMmR0*B3FHeWZW4uPZ~6BC=7ku(!`D*N zy5nc$dqTelZ|x0m*(jEFN+tDmB3ZhSCf`)U;zrHSu^;K<`;ZZ*aD`TUZ)PFkm$kS!ahtHJC zLJv;o_2NxJG?} zA7=*8LYh&!+`JuLg;&b15&DJ0pWjJ7CL_-ng|7C&>)0GvRtZR$xdT%8B|_GuqaY|} zd_c&OA9>G#-Qd=Gj>J_o)ZyMa&0(x{(o{!GV_sUQV>35qH$jhQYIkN2_hMWumvwX) zvrN{KD?!}}?;h&(T}rc2V!WN1{XW7M|U=2`QTCb60}bO$!876G{KE zkDAIQSUj*}JEKm5y=|4x`hjto0}P4`<0JDxpFLb_awYv*g2zb0xw!vlO>=uEe)bAc zc)bW+vuuJG#z9H&=S>{YXJSrqV|@zx1>$?d~}E?$+OxSonlW_Tcv*6)PL5NP&|XHfo}`${^at&KDp1fa1ftb5Y@{U z?}B|WN0y}(A3iEa>Kc<2I3$_0I*h9&FH3uY)%=X)ol9%b;*=JZlRk@GsGip;o=~{H zOh?HiZz*gO+$|iFWj*OEI^uI*8BAbj?4vpAvm~{ehTFu%a$KDRz_bz@k(yB+wPCckY_)InYH=ldcw?)^E>a;}>W!S9 zeb?pQfhxk=(>ueNBCwkUzE&f=ShL5}Qw`oVb}z}c%p0SuanIT9(~Wl@w9y#O*qkqz z^$XQP;4#~+!4o{dlWHz{8JFK9l8TIce=~w-XJGm?>5$)KK2^&8=l9_;D{o~WLxEG3 zhNqr8pQq{+Pg~bs6N-3NE6Zxj`ZEqs*C2ZoWEFqHm*r2DgpEwho_8ItoA*>_9zD~w zF8kj*h?C*V*flLH`DI+rSjvA7GpFDs!#e_T^!?toQ^unRyQ?Cx?-6|li7zNj&Z=k6 zrS`JP8*sO`VFECV5tR^3Ej#f)(C3h$(heK4Fp95143%1%u^^}sV_t|7rDk)6zT2CJ zuwUp!YLVtklWLx3vo&U%#y+7Xa+(sdN=*rvqbl&l{YP$1kh(ODxIPYSE=x5g;@8=lQ z6+m?Siquim&*}8aEA00rk25&(m<9tAU~_#|uRMbgu7r`WIA`+7;gB+LOM3}oxr%Fp z2!^XLVaTih)O}CM!QLfKz21(US6s%MY~7am`{!>7XLGr)tk1UpDXW6p3LY^~d7+N2njGr0g6LV~JMr z^9bP}86GsDl7S+<6g7Vo7Q@v&k2|A$cX-;}si?VmQ7eukb5>qzCHT5&I7v~tdhyqd zi+Qh;wZ^Rn;=)_;>pzCWcgdUsla$BN)RtA*#exCJwSwUYJH{hJ!Rk4LBePokQ#iws zOu02G<;)p6Qz`bj!`Pje&cVJ^EAJ+kum2ZRY zRqzrGG`dl$U-Q-?13yDLasAJ6j!G1;=Xq!dM(ANw5v)f0W>3(sq0Xk`>h+42ecD?= z%|w=#)JuHvP9Vg57uzlG4FG2`;vn1 z>n@F=<*V*mM{m^>pZPoIRM&nGT^X|eDHvlfiv+WtO{&BYc=1mK-wnbnmZ4S{J zgs0|pf8tQAJ^IRjmK4{%Cyin;{~oiQ-fOkE=LP?Z^8hWmu~;j+nC4O-Trt)+#t9RK z@=M)()UQL++VW%;&w@nQKF{;2iQkL5M2;e7n6ckQE%nSmK%Pao%81EiQG$E1fa&^S z&x4Qa7LY@Gvs8DKcPPXANqH~?tDLQ30ViJ7fLmc9eKq8ecB= ze)Z~g)+f!j9a#>jV!4{Q_Ec({h5iL4DTxK zV6t(_7?utQ5a@Tkjr`ZN$N;9=niAKBMW!(L9afB_ly4oz9kOIX-;QtGZ=THq8iPM6 zn48$`$*@s+rCTZK^&JEz!+%uINHJns>Pvjr_rtWjW{~&YNEa-l5ePzVpvzrEuZtuF z@tG|Rs0iFH8Tm$V0{MwpmwnS1oFUgN%sper#!S-3NMpX4Se6&j=<+Z&k%zTjzY@)p z(;oY|(Vn_ioQC{8cdewUQo@h^8T4C{a*qiXGhx z$TP*DvRnL6agb&dJ$BXgTt5x$*88mZbADd``E(K>RG3_#QBemd`T(5d`Da#=$M2CHXj?O4-k&Ml;t@<*S840% z?O$&9LkT+uOGaPj|0V#qYNG#jG=KX&Xr48@QJzUqFH$ZO{Mj{*mLsvi=OJ!I2qeFCEf%9j+Zwr@v zEPxwamn{w^j7Sjy8r+GBGPb9K!Q0p(HW_2h`aLd8oGZe^wBH@*Q5Qb^l# B*2Ln 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 Yj@(}Cnv0o9_YU|n(mRKLu6r^3f12%zZ2$lO literal 0 HcmV?d00001 diff --git a/scripts/static/js/script.js b/scripts/static/js/script.js index ea9bcd7..02a726c 100644 --- a/scripts/static/js/script.js +++ b/scripts/static/js/script.js @@ -100,6 +100,147 @@ document.getElementById('train_type').addEventListener('change', function() { // 初始触发一次change事件以设置默认值 document.getElementById('train_type').dispatchEvent(new Event('change')); +// 页面加载时启动进程状态轮询 +window.addEventListener('load', () => { + startProcessPolling(); + + // 加载初始进程列表 + loadProcesses(); +}); + +// 在进程标签页切换时也触发一次检查 +const tabLinks = document.querySelectorAll('.tab'); +tabLinks.forEach(tab => { + tab.addEventListener('click', () => { + // 给标签页切换一些时间完成 + setTimeout(() => { + const processesTab = document.querySelector('.tab.active'); + if (processesTab && processesTab.textContent.includes('进程')) { + checkProcessStatusChanges(); + } + }, 100); + }); +}); + +// 添加定时轮询机制,每5秒检查一次进程状态变化 +let processPollingTimer; + +// 开始进程状态轮询 +function startProcessPolling() { + // 清除可能存在的旧定时器 + if (processPollingTimer) { + clearInterval(processPollingTimer); + } + // 每5秒检查一次进程状态 + processPollingTimer = setInterval(() => { + // 只有在进程标签页打开时才检查 + const processesTab = document.querySelector('.tab.active'); + if (processesTab && processesTab.textContent.includes('进程')) { + checkProcessStatusChanges(); + } + }, 5000); +} + +// 检查进程状态变化(特别是错误状态) +function checkProcessStatusChanges() { + fetch('/processes') + .then(response => response.json()) + .then(data => { + // 遍历每个进程,检查状态变化 + data.forEach(process => { + const processItem = document.querySelector(`[data-process-id="${process.id}"]`); + if (processItem) { + const currentStatus = processItem.dataset.processStatus; + const newStatus = process.status; + + // 如果状态发生变化,更新进程项 + if (currentStatus !== newStatus) { + updateProcessItem(processItem, process); + + // 如果状态变为出错,显示通知 + if (newStatus === '出错') { + showNotification(`进程 ${process.train_type} 已出错`, 'error'); + } + } + } + }); + }) + .catch(error => { + console.error('检查进程状态时出错:', error); + }); +} + +// 更新单个进程项 +function updateProcessItem(processItem, process) { + // 更新数据属性 + processItem.dataset.processStatus = process.status; + + // 更新状态类和文本 + const statusElement = processItem.querySelector('.process-status'); + if (statusElement) { + // 移除所有状态类 + statusElement.classList.remove('status-running', 'status-manual-stop', 'status-error', 'status-completed'); + + // 添加新的状态类 + let statusClass = ''; + if (process.status === '运行中') { + statusClass = 'status-running'; + } else if (process.status === '手动停止') { + statusClass = 'status-manual-stop'; + } else if (process.status === '出错') { + statusClass = 'status-error'; + } else { + statusClass = 'status-completed'; + } + + statusElement.classList.add(statusClass); + statusElement.textContent = process.status; + } + + // 更新停止按钮 + const stopButton = processItem.querySelector('.btn-stop'); + if (stopButton) { + if (!process.running) { + stopButton.remove(); + } + } else if (process.running) { + // 如果按钮不存在但进程仍在运行,添加停止按钮 + const buttonContainer = processItem.querySelector('div:last-child'); + if (buttonContainer) { + const newStopButton = document.createElement('button'); + newStopButton.className = 'btn-stop'; + newStopButton.onclick = () => stopProcess(process.id); + newStopButton.textContent = '停止训练'; + buttonContainer.appendChild(newStopButton); + } + } + + // 处理删除按钮 + const deleteButton = processItem.querySelector('.btn-delete'); + if (!process.running) { + // 非运行中状态应该有删除按钮 + if (!deleteButton) { + const buttonContainer = processItem.querySelector('div:last-child'); + if (buttonContainer) { + const newDeleteButton = document.createElement('button'); + newDeleteButton.className = 'btn-delete'; + newDeleteButton.onclick = () => deleteProcess(process.id); + newDeleteButton.textContent = '删除'; + buttonContainer.appendChild(newDeleteButton); + } + } + } else if (deleteButton) { + // 运行中状态不应该有删除按钮 + deleteButton.remove(); + } + + // 如果进程不再运行中,清除日志定时器 + if (!process.running && logTimers[process.id]) { + clearInterval(logTimers[process.id]); + delete logTimers[process.id]; + } +} + // 加载进程列表 function loadProcesses() { fetch('/processes') @@ -113,48 +254,186 @@ function loadProcesses() { return; } + // 按启动时间倒序排序,最新启动的进程显示在前面 + data.sort((a, b) => new Date(b.start_time) - new Date(a.start_time)); + + // 按训练类型分组 + const groupedProcesses = {}; data.forEach(process => { - const processItem = document.createElement('div'); - processItem.className = 'process-item'; - - let statusClass = ''; - // 根据后端返回的status字段设置状态类 - if (process.status === '运行中') { - statusClass = 'status-running'; - } else if (process.status === '手动停止') { - statusClass = 'status-manual-stop'; - } else if (process.status === '出错') { - statusClass = 'status-error'; - } else { - statusClass = 'status-completed'; + if (!groupedProcesses[process.train_type]) { + groupedProcesses[process.train_type] = []; } + groupedProcesses[process.train_type].push(process); + }); + + // 定义训练类型的显示顺序(可以根据需要调整) + const trainTypeOrder = ['pretrain', 'sft', 'lora', 'dpo']; + + // 创建类型分组并添加收起/展开功能的辅助函数 + function createTypeGroupWithToggle(trainType, processes) { + // 创建类型分组容器 + const typeGroup = document.createElement('div'); + typeGroup.className = 'process-type-group'; - // 设置进程数据属性,用于后续检查状态 - processItem.dataset.processId = process.id; - processItem.dataset.processStatus = process.status; + // 创建标题容器(包含标题文本和切换按钮) + const titleContainer = document.createElement('div'); + titleContainer.className = 'process-type-header'; + titleContainer.dataset.expanded = 'true'; // 默认展开状态 - processItem.innerHTML = ` -

-
- - - ${process.running ? `` : ''} -
- - `; + // 添加类型标题 + const typeTitle = document.createElement('h3'); + typeTitle.className = 'process-type-title'; + typeTitle.textContent = getTrainTypeDisplayName(trainType); - processList.appendChild(processItem); + // 添加切换按钮 + const toggleButton = document.createElement('button'); + toggleButton.className = 'toggle-btn'; + toggleButton.innerHTML = '▼'; // 向下箭头表示展开 + toggleButton.onclick = function(e) { + e.stopPropagation(); // 防止触发标题容器的点击事件 + toggleGroup(titleContainer); + }; + + // 将标题和按钮添加到容器 + titleContainer.appendChild(typeTitle); + titleContainer.appendChild(toggleButton); + + // 添加点击标题也可以切换展开/收起 + titleContainer.onclick = function() { + toggleGroup(titleContainer); + }; + + // 创建内容容器,用于容纳进程项 + const contentContainer = document.createElement('div'); + contentContainer.className = 'process-type-content'; + + // 添加该类型的所有进程 + processes.forEach(process => { + addProcessItemToGroup(contentContainer, process); + }); + + // 将标题容器和内容容器添加到类型分组 + typeGroup.appendChild(titleContainer); + typeGroup.appendChild(contentContainer); + + return typeGroup; + } + + // 切换分组展开/收起状态的函数 + function toggleGroup(headerElement) { + const isExpanded = headerElement.dataset.expanded === 'true'; + const contentContainer = headerElement.nextElementSibling; + const toggleButton = headerElement.querySelector('.toggle-btn'); + + if (isExpanded) { + // 收起分组 + headerElement.dataset.expanded = 'false'; + contentContainer.style.maxHeight = '0'; + contentContainer.style.overflow = 'hidden'; + toggleButton.innerHTML = '▶'; // 向右箭头表示收起 + } else { + // 展开分组前先重置样式 + contentContainer.style.overflow = 'hidden'; // 确保计算高度准确 + contentContainer.style.maxHeight = 'none'; // 临时设置为none以获取真实高度 + + // 获取真实高度 + const actualHeight = contentContainer.scrollHeight; + + // 然后先设置为0,准备动画 + contentContainer.style.maxHeight = '0'; + + // 强制重排 + contentContainer.offsetHeight; + + // 展开分组 + headerElement.dataset.expanded = 'true'; + contentContainer.style.maxHeight = actualHeight + 'px'; + + setTimeout(() => { + // 动画完成后,设置为真实高度并允许溢出 + contentContainer.style.maxHeight = 'none'; + contentContainer.style.overflow = 'visible'; + }, 300); // 动画完成后显示溢出内容 + + toggleButton.innerHTML = '▼'; // 向下箭头表示展开 + } + } + + // 首先显示有明确顺序的训练类型 + trainTypeOrder.forEach(trainType => { + if (groupedProcesses[trainType]) { + const typeGroup = createTypeGroupWithToggle(trainType, groupedProcesses[trainType]); + processList.appendChild(typeGroup); + + // 从分组中移除已处理的类型 + delete groupedProcesses[trainType]; + } + }); + + // 显示剩余的训练类型(不在预定义顺序中的) + Object.keys(groupedProcesses).forEach(trainType => { + const typeGroup = createTypeGroupWithToggle(trainType, groupedProcesses[trainType]); + processList.appendChild(typeGroup); }); }); } +// 获取训练类型的显示名称 +function getTrainTypeDisplayName(trainType) { + const typeNames = { + 'pretrain': '预训练 (Pretrain)', + 'sft': '全参数监督微调 (SFT - Full)', + 'lora': 'LoRA监督微调 (SFT - Lora)', + 'dpo': '直接偏好优化 (RL - DPO)' + }; + return typeNames[trainType] || trainType; +} + +// 添加进程项到分组 +function addProcessItemToGroup(parentElement, process) { + const processItem = document.createElement('div'); + processItem.className = 'process-item'; + + let statusClass = ''; + // 根据后端返回的status字段设置状态类 + if (process.status === '运行中') { + statusClass = 'status-running'; + } else if (process.status === '手动停止') { + statusClass = 'status-manual-stop'; + } else if (process.status === '出错') { + statusClass = 'status-error'; + } else { + statusClass = 'status-completed'; + } + + // 设置进程数据属性,用于后续检查状态 + processItem.dataset.processId = process.id; + processItem.dataset.processStatus = process.status; + + // 检查是否显示删除按钮(对于非运行中的进程) + const showDeleteButton = !process.running; + + processItem.innerHTML = ` +
+
+ ${process.start_time} +
+
+ ${process.status} +
+
+
+ + + ${process.running ? `` : ''} + ${showDeleteButton ? `` : ''} +
+ + `; + + parentElement.appendChild(processItem); +} + // 存储训练日志定时器的ID let logTimers = {}; @@ -250,16 +529,266 @@ function loadLogContent(processId, logsContainer) { }); } +// 显示右上角消息弹窗 +function showNotification(message, type = 'success') { + // 创建通知元素 + const notification = document.createElement('div'); + notification.className = `notification notification-${type}`; + notification.textContent = message; + + // 添加到页面 + document.body.appendChild(notification); + + // 显示动画 + setTimeout(() => { + notification.classList.add('show'); + }, 10); + + // 自动关闭 + setTimeout(() => { + notification.classList.remove('show'); + setTimeout(() => { + document.body.removeChild(notification); + }, 300); + }, 3000); +} + +// 自定义确认对话框 +function showConfirmDialog(message, onConfirm, onCancel = null) { + // 检查是否已存在对话框,如果有则移除 + const existingDialog = document.querySelector('.custom-dialog'); + if (existingDialog) { + document.body.removeChild(existingDialog); + } + + // 创建对话框遮罩 + const dialogOverlay = document.createElement('div'); + dialogOverlay.className = 'dialog-overlay'; + + // 创建对话框容器 + const dialogContainer = document.createElement('div'); + dialogContainer.className = 'custom-dialog'; + + // 设置对话框内容 + dialogContainer.innerHTML = ` +
+
${message}
+
+ + +
+
+ `; + + // 添加到页面 + dialogOverlay.appendChild(dialogContainer); + document.body.appendChild(dialogOverlay); + + // 添加动画类 + setTimeout(() => { + dialogOverlay.classList.add('show'); + dialogContainer.classList.add('show'); + }, 10); + + // 绑定确认按钮事件 + const confirmBtn = dialogContainer.querySelector('.dialog-confirm'); + confirmBtn.addEventListener('click', () => { + if (onConfirm) onConfirm(); + closeDialog(dialogOverlay); + }); + + // 绑定取消按钮事件 + const cancelBtn = dialogContainer.querySelector('.dialog-cancel'); + cancelBtn.addEventListener('click', () => { + if (onCancel) onCancel(); + closeDialog(dialogOverlay); + }); + + // 点击遮罩层也可以取消 + dialogOverlay.addEventListener('click', (e) => { + if (e.target === dialogOverlay) { + if (onCancel) onCancel(); + closeDialog(dialogOverlay); + } + }); +} + +// 关闭对话框函数 +function closeDialog(dialogOverlay) { + dialogOverlay.classList.remove('show'); + const dialogContainer = dialogOverlay.querySelector('.custom-dialog'); + dialogContainer.classList.remove('show'); + + setTimeout(() => { + if (dialogOverlay.parentNode) { + document.body.removeChild(dialogOverlay); + } + }, 300); +} + +// 删除进程 +function deleteProcess(processId) { + showConfirmDialog( + '确定要删除这个训练进程吗?此操作不可恢复。', + () => { + // 确认删除 + fetch(`/delete/${processId}`, { + method: 'POST' + }) + .then(response => { + // 检查响应状态 + if (!response.ok) { + throw new Error('删除请求失败'); + } + return response.json().catch(() => ({})); // 即使没有JSON响应也继续 + }) + .then(() => { + // 从UI中移除进程项 + const processItem = document.querySelector(`[data-process-id="${processId}"]`); + if (processItem) { + // 添加移除动画 + processItem.style.transition = 'opacity 0.3s, transform 0.3s'; + processItem.style.opacity = '0'; + processItem.style.transform = 'translateX(-20px)'; + + // 动画完成后移除 + setTimeout(() => { + // 获取内容容器和类型分组 + const contentContainer = processItem.closest('.process-type-content'); + const typeGroup = contentContainer ? contentContainer.closest('.process-type-group') : null; + + if (processItem.parentNode) { + processItem.parentNode.removeChild(processItem); + } + + // 检查内容容器中是否还有进程项 + if (contentContainer) { + const remainingProcessesInGroup = contentContainer.querySelectorAll('.process-item'); + + // 如果内容容器中没有进程项了,移除整个分组 + if (remainingProcessesInGroup.length === 0 && typeGroup) { + setTimeout(() => { + // 添加分组移除动画 + typeGroup.style.transition = 'opacity 0.3s, transform 0.3s'; + typeGroup.style.opacity = '0'; + typeGroup.style.transform = 'translateY(-10px)'; + + setTimeout(() => { + if (typeGroup.parentNode) { + typeGroup.parentNode.removeChild(typeGroup); + } + + // 检查是否还有进程项 + const remainingProcesses = document.querySelectorAll('.process-item'); + if (remainingProcesses.length === 0) { + const processList = document.getElementById('process-list'); + processList.innerHTML = '

暂无训练进程

'; + } + }, 300); + }, 100); + } else { + // 重新计算内容容器的高度(如果分组是展开的) + const headerElement = contentContainer.previousElementSibling; + if (headerElement && headerElement.dataset.expanded === 'true') { + contentContainer.style.maxHeight = contentContainer.scrollHeight + 'px'; + } + + // 检查是否还有进程项 + const remainingProcesses = document.querySelectorAll('.process-item'); + if (remainingProcesses.length === 0) { + const processList = document.getElementById('process-list'); + processList.innerHTML = '

暂无训练进程

'; + } + } + } else { + // 检查是否还有进程项 + const remainingProcesses = document.querySelectorAll('.process-item'); + if (remainingProcesses.length === 0) { + const processList = document.getElementById('process-list'); + processList.innerHTML = '

暂无训练进程

'; + } + } + }, 300); + } + + // 清除日志定时器 + if (logTimers[processId]) { + clearInterval(logTimers[processId]); + delete logTimers[processId]; + } + + showNotification('训练进程已删除', 'success'); + }) + .catch(error => { + console.error('删除进程时出错:', error); + showNotification('删除进程失败,请刷新页面重试', 'error'); + }); + } + ); +} + // 停止进程 function stopProcess(processId) { - if (confirm('确定要停止这个训练进程吗?')) { - fetch(`/stop/${processId}`, { - method: 'POST' - }) - .then(() => { - loadProcesses(); - }); - } + showConfirmDialog( + '确定要停止这个训练进程吗?', + () => { + // 确认停止 + fetch(`/stop/${processId}`, { + method: 'POST' + }) + .then(() => { + // 立即给用户反馈,设置为手动停止状态 + const processItem = document.querySelector(`[data-process-id="${processId}"]`); + if (processItem) { + // 先设置为手动停止状态(即时反馈) + processItem.dataset.processStatus = '手动停止'; + const statusElement = processItem.querySelector('.process-status'); + if (statusElement) { + statusElement.classList.remove('status-running', 'status-error', 'status-completed'); + statusElement.classList.add('status-manual-stop'); + statusElement.textContent = '手动停止'; + } + + // 移除停止按钮 + const stopButton = processItem.querySelector('.btn-stop'); + if (stopButton) { + stopButton.remove(); + } + + // 清除日志定时器 + if (logTimers[processId]) { + clearInterval(logTimers[processId]); + delete logTimers[processId]; + } + } + + // 显示通知 + showNotification('训练进程已停止', 'info'); + + // 为了确保状态准确,仍然获取完整列表并更新单个进程 + fetch('/processes') + .then(response => response.json()) + .then(data => { + // 从完整列表中找到特定进程 + const updatedProcess = data.find(p => p.id === processId); + if (updatedProcess && processItem) { + // 使用updateProcessItem函数更新进程(如果需要的话) + updateProcessItem(processItem, updatedProcess); + } + }) + .catch(error => { + console.error('获取进程列表更新单个进程失败:', error); + }); + }) + .catch(() => { + showNotification('停止进程失败', 'error'); + }); + }, + () => { + // 取消停止,可选的回调 + showNotification('已取消停止操作', 'info'); + } + ); } // 表单提交处理 @@ -268,22 +797,46 @@ document.getElementById('train-form').addEventListener('submit', function(e) { const formData = new FormData(this); const data = Object.fromEntries(formData.entries()); - fetch('/train', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(data) - }) - .then(response => response.json()) - .then(result => { - if (result.success) { - alert('训练已开始!'); - openTab(event, 'processes'); - } else { - alert('训练启动失败:' + result.error); - } - }); + // 立即显示加载通知 + showNotification('正在启动训练...', 'info'); + + // 延迟1秒后发送请求,确保两个通知之间有间隔 + setTimeout(() => { + fetch('/train', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }) + .then(response => { + if (!response.ok) { + throw new Error('网络响应异常'); + } + return response.json(); + }) + .then(result => { + if (result.success) { + showNotification('训练已开始!', 'success'); + + // 延迟1秒后切换到进程标签页,确保进程信息已更新 + setTimeout(() => { + // 获取进程标签按钮并触发点击 + const processTab = document.querySelector('.tab[onclick*="processes"]'); + if (processTab) { + processTab.click(); + } + }, 1000); + } else { + // 显示错误通知 + showNotification('训练启动失败:' + result.error, 'error'); + } + }) + .catch(error => { + // 显示等待通知 + showNotification('启动训练中,请耐心等待...', 'info'); + }); + }, 1000); // 1秒延迟确保两个通知之间有间隔 }); // 加载日志文件列表 @@ -302,12 +855,11 @@ function loadLogFiles() { // 按日期倒序排序 data.sort((a, b) => new Date(b.modified_time) - new Date(a.modified_time)); + // 按训练类型分组 + const groupedLogFiles = {}; data.forEach(logfile => { - const fileItem = document.createElement('div'); - fileItem.className = 'process-item'; - // 从文件名提取训练类型 - let trainType = '未知'; + let trainType = '自定义训练'; if (logfile.filename.includes('train_pretrain_')) { trainType = 'pretrain'; } else if (logfile.filename.includes('train_sft_')) { @@ -323,43 +875,305 @@ function loadLogFiles() { } else if (logfile.filename.includes('train_spo_')) { trainType = 'spo'; } - - fileItem.innerHTML = ` -
-
- ${trainType} - ${logfile.filename} -
-
- 已保存 - ${logfile.modified_time} -
-
-
- -
- - `; + // 为日志文件添加训练类型信息 + logfile.train_type = trainType; - logfilesList.appendChild(fileItem); + if (!groupedLogFiles[trainType]) { + groupedLogFiles[trainType] = []; + } + groupedLogFiles[trainType].push(logfile); + }); + + // 定义训练类型的显示顺序(与进程显示顺序保持一致) + const trainTypeOrder = ['pretrain', 'sft', 'lora', 'dpo', 'ppo', 'grpo', 'spo', '未知']; + + // 创建类型分组并添加收起/展开功能的辅助函数 + function createTypeGroupWithToggle(trainType, logfiles) { + // 创建类型分组容器 + const typeGroup = document.createElement('div'); + typeGroup.className = 'process-type-group'; + + // 创建标题容器(包含标题文本和切换按钮) + const titleContainer = document.createElement('div'); + titleContainer.className = 'process-type-header'; + titleContainer.dataset.expanded = 'true'; // 默认展开状态 + + // 添加类型标题 + const typeTitle = document.createElement('h3'); + typeTitle.className = 'process-type-title'; + typeTitle.textContent = getTrainTypeDisplayName(trainType); + + // 添加切换按钮 + const toggleButton = document.createElement('button'); + toggleButton.className = 'toggle-btn'; + toggleButton.innerHTML = '▼'; // 向下箭头表示展开 + toggleButton.onclick = function(e) { + e.stopPropagation(); // 防止触发标题容器的点击事件 + toggleGroup(titleContainer); + }; + + // 将标题和按钮添加到容器 + titleContainer.appendChild(typeTitle); + titleContainer.appendChild(toggleButton); + + // 添加点击标题也可以切换展开/收起 + titleContainer.onclick = function() { + toggleGroup(titleContainer); + }; + + // 创建内容容器,用于容纳日志文件项 + const contentContainer = document.createElement('div'); + contentContainer.className = 'process-type-content'; + + // 添加该类型的所有日志文件 + logfiles.forEach(logfile => { + addLogFileItemToGroup(contentContainer, logfile); + }); + + // 将标题容器和内容容器添加到类型分组 + typeGroup.appendChild(titleContainer); + typeGroup.appendChild(contentContainer); + + return typeGroup; + } + + // 切换分组展开/收起状态的函数 + function toggleGroup(headerElement) { + const isExpanded = headerElement.dataset.expanded === 'true'; + const contentContainer = headerElement.nextElementSibling; + const toggleButton = headerElement.querySelector('.toggle-btn'); + + if (isExpanded) { + // 收起分组 + headerElement.dataset.expanded = 'false'; + contentContainer.style.maxHeight = '0'; + contentContainer.style.overflow = 'hidden'; + toggleButton.innerHTML = '▶'; // 向右箭头表示收起 + } else { + // 展开分组前先重置样式 + contentContainer.style.overflow = 'hidden'; // 确保计算高度准确 + contentContainer.style.maxHeight = 'none'; // 临时设置为none以获取真实高度 + + // 获取真实高度 + const actualHeight = contentContainer.scrollHeight; + + // 然后先设置为0,准备动画 + contentContainer.style.maxHeight = '0'; + + // 强制重排 + contentContainer.offsetHeight; + + // 展开分组 + headerElement.dataset.expanded = 'true'; + contentContainer.style.maxHeight = actualHeight + 'px'; + + setTimeout(() => { + // 动画完成后,设置为真实高度并允许溢出 + contentContainer.style.maxHeight = 'none'; + contentContainer.style.overflow = 'visible'; + }, 300); // 动画完成后显示溢出内容 + + toggleButton.innerHTML = '▼'; // 向下箭头表示展开 + } + } + + // 首先显示有明确顺序的训练类型 + trainTypeOrder.forEach(trainType => { + if (groupedLogFiles[trainType]) { + const typeGroup = createTypeGroupWithToggle(trainType, groupedLogFiles[trainType]); + logfilesList.appendChild(typeGroup); + + // 从分组中移除已处理的类型 + delete groupedLogFiles[trainType]; + } + }); + + // 显示剩余的训练类型(不在预定义顺序中的) + Object.keys(groupedLogFiles).forEach(trainType => { + const typeGroup = createTypeGroupWithToggle(trainType, groupedLogFiles[trainType]); + logfilesList.appendChild(typeGroup); }); }); } +// 添加日志文件项到分组 +function addLogFileItemToGroup(parentElement, logfile) { + const fileItem = document.createElement('div'); + fileItem.className = 'process-item'; + + fileItem.innerHTML = ` +
+
+ ${logfile.filename} +
+
+ 已保存 + ${logfile.modified_time} +
+
+
+ + +
+ + `; + + parentElement.appendChild(fileItem); +} + +// 删除日志文件 +function deleteLogFile(filename, button) { + // 显示确认对话框 + showConfirmDialog( + `确定要删除日志文件 "${filename}" 吗?此操作无法恢复。`, + function() { + // 用户确认删除 + const processItem = button.closest('.process-item'); + const contentContainer = processItem.closest('.process-type-content'); + const typeGroup = contentContainer.closest('.process-type-group'); + + // 显示加载状态 + const originalText = button.textContent; + button.textContent = '删除中...'; + button.disabled = true; + + // 发送删除请求到服务器 + fetch(`/delete-logfile/${encodeURIComponent(filename)}`, { + method: 'DELETE' + }) + .then(response => { + if (!response.ok) { + throw new Error('删除失败'); + } + return response.json(); + }) + .then(data => { + if (data.success) { + // 从UI中移除日志项 + processItem.remove(); + + // 检查是否需要移除整个分组 + if (contentContainer.children.length === 0) { + typeGroup.remove(); + } else { + // 更新内容容器的高度 + const headerElement = contentContainer.previousElementSibling; + if (headerElement && headerElement.dataset.expanded === 'true') { + // 临时设置为none以获取真实高度 + contentContainer.style.maxHeight = 'none'; + const actualHeight = contentContainer.scrollHeight; + contentContainer.style.maxHeight = actualHeight + 'px'; + } + } + + // 显示成功通知 + showNotification(`日志文件 "${filename}" 已成功删除`); + } else { + throw new Error(data.message || '删除失败'); + } + }) + .catch(error => { + console.error('删除日志失败:', error); + showNotification(`删除失败: ${error.message}`, 'error'); + // 恢复按钮状态 + button.textContent = originalText; + button.disabled = false; + }); + }, + function() { + // 用户取消删除,不执行任何操作 + } + ); +} + // 查看日志文件内容 function viewLogFile(filename, button) { - const safeFilename = filename.replace(/\./g, '-'); - const logContainer = button.closest('.process-item').querySelector(`#log-content-${safeFilename}`); - logContainer.classList.toggle('hidden'); + // 生成安全的文件名,用于元素ID + const safeFilename = filename.replace(/[^a-zA-Z0-9_.-]/g, '_'); + const idSafeFilename = safeFilename.replace(/\./g, '-'); - if (!logContainer.classList.contains('hidden') && logContainer.textContent === '') { - logContainer.textContent = '加载日志中...'; + // 查找对应的日志容器 + const processItem = button.closest('.process-item'); + const logContainer = processItem.querySelector(`#log-content-${idSafeFilename}`); + + // 获取内容容器和头部元素 + const contentContainer = processItem.closest('.process-type-content'); + const headerElement = contentContainer ? contentContainer.previousElementSibling : null; + + // 确保日志所在的分组是展开状态 + if (contentContainer && headerElement && headerElement.dataset.expanded !== 'true') { + // 如果分组是折叠的,先展开分组 + toggleGroup(headerElement); + } + + // 切换日志容器的显示状态 + if (logContainer.classList.contains('hidden')) { + logContainer.classList.remove('hidden'); - fetch(`/logfile-content/${encodeURIComponent(filename)}`) - .then(response => response.text()) - .then(logs => { - logContainer.textContent = logs; - logContainer.scrollTop = 0; - }); + // 如果是首次加载,获取日志内容 + if (logContainer.textContent.trim() === '') { + logContainer.textContent = '加载中...'; + + fetch(`/logfile-content/${encodeURIComponent(filename)}`) + .then(response => { + if (!response.ok) { + throw new Error('获取日志失败'); + } + return response.text(); + }) + .then(logs => { + // 保留空白格式,使用textContent而不是innerHTML + logContainer.textContent = logs; + logContainer.scrollTop = 0; + + // 更新内容容器的高度 + updateContentContainerHeight(); + }) + .catch(error => { + console.error('获取日志失败:', error); + logContainer.innerHTML = `

获取日志失败: ${error.message}

`; + + // 更新内容容器的高度 + updateContentContainerHeight(); + }); + } else { + // 如果不是首次加载,直接更新内容容器的高度 + updateContentContainerHeight(); + } + } else { + logContainer.classList.add('hidden'); + + // 更新内容容器的高度 + updateContentContainerHeight(); + } + + // 辅助函数:更新内容容器的高度 + function updateContentContainerHeight() { + if (contentContainer && headerElement && headerElement.dataset.expanded === 'true') { + // 保存当前的maxHeight设置 + const currentMaxHeight = contentContainer.style.maxHeight; + + // 暂时设置为none以获取真实高度 + contentContainer.style.maxHeight = 'none'; + + // 获取真实高度 + const actualHeight = contentContainer.scrollHeight; + + // 检查是否需要重新设置高度 + if (currentMaxHeight === 'none' || parseInt(currentMaxHeight) !== actualHeight) { + contentContainer.style.maxHeight = actualHeight + 'px'; + + // 短暂延迟后再设置为none,确保高度变化正确应用 + setTimeout(() => { + if (headerElement.dataset.expanded === 'true') { + contentContainer.style.maxHeight = 'none'; + } + }, 300); + } else { + // 如果高度没有变化,恢复之前的设置 + contentContainer.style.maxHeight = currentMaxHeight; + } + } } } \ No newline at end of file diff --git a/scripts/templates/index.html b/scripts/templates/index.html index 63cc1a8..7d5b342 100644 --- a/scripts/templates/index.html +++ b/scripts/templates/index.html @@ -7,7 +7,10 @@ -

MiniMind Training Lab

+
+ +

MiniMind Training Lab

+
@@ -26,10 +29,10 @@
diff --git a/scripts/train_web_ui.py b/scripts/train_web_ui.py index ee80e3f..aa5c3b7 100644 --- a/scripts/train_web_ui.py +++ b/scripts/train_web_ui.py @@ -238,6 +238,28 @@ def get_logfile_content(filename): return f'读取日志失败: {str(e)}' return '日志文件不存在' +@app.route('/delete-logfile/', methods=['DELETE']) +def delete_logfile(filename): + # 获取脚本所在目录的绝对路径 + script_dir = os.path.dirname(os.path.abspath(__file__)) + # 构建logfile目录的绝对路径 + log_dir = os.path.join(script_dir, '../logfile') + log_dir = os.path.abspath(log_dir) + + # 安全检查:防止路径遍历攻击 + if '..' in filename or '/' in filename or '\\' in filename: + return jsonify({'success': False, 'message': '非法的文件名'}) + + log_file = os.path.join(log_dir, filename) + if os.path.exists(log_file) and os.path.isfile(log_file): + try: + os.remove(log_file) + return jsonify({'success': True, 'message': '日志文件删除成功'}) + except Exception as e: + print(f"删除日志文件失败: {str(e)}") + return jsonify({'success': False, 'message': f'删除失败: {str(e)}'}) + return jsonify({'success': False, 'message': '日志文件不存在'}) + @app.route('/stop/', methods=['POST']) def stop(process_id): @@ -260,5 +282,40 @@ def stop(process_id): return jsonify({'success': True}) return jsonify({'success': False}) +@app.route('/delete/', methods=['POST']) +def delete(process_id): + if process_id in training_processes: + # 确保进程已经停止 + if training_processes[process_id]['running']: + # 如果进程还在运行,先停止它 + try: + process = training_processes[process_id]['process'] + process.terminate() + try: + process.wait(timeout=3) + except subprocess.TimeoutExpired: + process.kill() + except Exception as e: + print(f"停止进程失败: {str(e)}") + + # 从进程字典中删除 + del training_processes[process_id] + + # 可选:删除对应的日志文件 + try: + script_dir = os.path.dirname(os.path.abspath(__file__)) + log_dir = os.path.join(script_dir, '../logfile') + log_dir = os.path.abspath(log_dir) + + if os.path.exists(log_dir): + for filename in os.listdir(log_dir): + if filename.endswith(f'{process_id}.log'): + os.remove(os.path.join(log_dir, filename)) + except Exception as e: + print(f"删除日志文件失败: {str(e)}") + + return jsonify({'success': True}) + return jsonify({'success': False}) + if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file From 9b27e8b7166455ac3e2d866de3fc04e31413572f Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Mon, 10 Nov 2025 14:55:23 +0800 Subject: [PATCH 05/35] update web auto port --- scripts/train_web_ui.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/scripts/train_web_ui.py b/scripts/train_web_ui.py index aa5c3b7..d60fdcb 100644 --- a/scripts/train_web_ui.py +++ b/scripts/train_web_ui.py @@ -3,6 +3,7 @@ import sys import subprocess import threading import json +import socket from flask import Flask, render_template, request, jsonify, redirect, url_for import time @@ -317,5 +318,31 @@ def delete(process_id): return jsonify({'success': True}) return jsonify({'success': False}) +def find_available_port(start_port=5000, max_attempts=100): + """查找可用的端口号 + + Args: + start_port: 起始端口号 + max_attempts: 最大尝试次数 + + Returns: + 可用的端口号,如果没有找到则返回None + """ + for port in range(start_port, start_port + max_attempts): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + result = sock.connect_ex(('localhost', port)) + sock.close() + if result != 0: # 端口可用 + return port + return None + if __name__ == '__main__': - app.run(host='0.0.0.0', port=5000, debug=True) \ No newline at end of file + # 尝试使用默认端口5000,如果被占用则自动寻找可用端口 + port = find_available_port(5000) + if port is not None: + print(f"启动Flask服务器在 http://0.0.0.0:{port}") + # 使用0.0.0.0作为host以兼容VSCode的端口转发功能 + app.run(host='0.0.0.0', port=port, debug=True) + else: + print("无法找到可用的端口,请检查系统端口占用情况") + sys.exit(1) \ No newline at end of file From 768f0708e3ae302fc123782daa703678ae559ca9 Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Mon, 10 Nov 2025 07:24:38 +0000 Subject: [PATCH 06/35] add default model para --- scripts/static/js/script.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/scripts/static/js/script.js b/scripts/static/js/script.js index 02a726c..0d0ceb3 100644 --- a/scripts/static/js/script.js +++ b/scripts/static/js/script.js @@ -63,6 +63,11 @@ document.getElementById('train_type').addEventListener('change', function() { document.getElementById('from_weight').value = 'none'; document.getElementById('log_interval').value = '100'; document.getElementById('save_interval').value = '100'; + // 模型结构参数默认值 + document.getElementById('hidden_size').value = '512'; + document.getElementById('num_hidden_layers').value = '8'; + document.getElementById('max_seq_len').value = '512'; + document.getElementById('use_moe').value = '0'; } else if (trainType === 'sft') { document.getElementById('save_dir').value = '../out'; document.getElementById('save_weight').value = 'full_sft'; @@ -73,6 +78,11 @@ document.getElementById('train_type').addEventListener('change', function() { document.getElementById('from_weight').value = 'pretrain'; document.getElementById('log_interval').value = '100'; document.getElementById('save_interval').value = '100'; + // 模型结构参数默认值 + document.getElementById('hidden_size').value = '512'; + document.getElementById('num_hidden_layers').value = '8'; + document.getElementById('max_seq_len').value = '512'; + document.getElementById('use_moe').value = '0'; } else if (trainType === 'lora') { document.getElementById('save_dir').value = '../out/lora'; document.getElementById('lora_name').value = 'lora_identity'; @@ -83,6 +93,11 @@ document.getElementById('train_type').addEventListener('change', function() { document.getElementById('from_weight').value = 'full_sft'; document.getElementById('log_interval').value = '10'; document.getElementById('save_interval').value = '1'; + // 模型结构参数默认值 + document.getElementById('hidden_size').value = '512'; + document.getElementById('num_hidden_layers').value = '8'; + document.getElementById('max_seq_len').value = '512'; + document.getElementById('use_moe').value = '0'; } else if (trainType === 'dpo') { document.getElementById('save_dir').value = '../out'; document.getElementById('save_weight').value = 'dpo'; @@ -94,6 +109,11 @@ document.getElementById('train_type').addEventListener('change', function() { document.getElementById('log_interval').value = '100'; document.getElementById('save_interval').value = '100'; document.getElementById('beta').value = '0.1'; + // 模型结构参数默认值 + document.getElementById('hidden_size').value = '512'; + document.getElementById('num_hidden_layers').value = '8'; + document.getElementById('max_seq_len').value = '1024'; + document.getElementById('use_moe').value = '0'; } }); From 095a656cff2350dd544d1ab46d0b9d8ec8dbe62c Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Mon, 10 Nov 2025 10:00:44 +0000 Subject: [PATCH 07/35] support ddp --- scripts/static/js/script.js | 113 +++++++++++++++++-------- scripts/templates/index.html | 72 +++++++++++++++- scripts/train_web_ui.py | 159 +++++++++++++++++++++++++++-------- 3 files changed, 276 insertions(+), 68 deletions(-) diff --git a/scripts/static/js/script.js b/scripts/static/js/script.js index 0d0ceb3..287f7c0 100644 --- a/scripts/static/js/script.js +++ b/scripts/static/js/script.js @@ -533,6 +533,10 @@ function refreshLog(processId) { clearInterval(logTimers[processId]); delete logTimers[processId]; } + } else { + // 如果日志容器被隐藏,清除定时器 + clearInterval(logTimers[processId]); + delete logTimers[processId]; } }, 1000); } @@ -541,11 +545,33 @@ function refreshLog(processId) { // 加载日志内容 function loadLogContent(processId, logsContainer) { + // 显示加载状态 + const oldContent = logsContainer.textContent; + const isScrolledToBottom = logsContainer.scrollHeight - logsContainer.scrollTop <= logsContainer.clientHeight + 10; + fetch(`/logs/${processId}`) - .then(response => response.text()) + .then(response => { + if (!response.ok) { + throw new Error('获取日志失败'); + } + return response.text(); + }) .then(logs => { + // 更新日志内容 logsContainer.textContent = logs; - logsContainer.scrollTop = logsContainer.scrollHeight; + + // 如果用户之前滚动到底部,则继续保持在底部 + // 否则保持用户的滚动位置 + if (isScrolledToBottom || oldContent === logsContainer.textContent) { + logsContainer.scrollTop = logsContainer.scrollHeight; + } + }) + .catch(error => { + console.error('加载日志失败:', error); + // 只在内容为空或之前不是错误信息时才显示错误 + if (!logsContainer.textContent.includes('加载失败')) { + logsContainer.textContent = `加载日志失败: ${error.message}`; + } }); } @@ -815,7 +841,32 @@ function stopProcess(processId) { document.getElementById('train-form').addEventListener('submit', function(e) { e.preventDefault(); const formData = new FormData(this); - const data = Object.fromEntries(formData.entries()); + const data = {}; + const trainingMode = formData.get('training_mode'); + + // 处理表单数据,特别关注训练方式相关参数 + formData.forEach((value, key) => { + // 对于GPU数量,确保只有当选择了多卡训练时才添加到数据中 + if (key === 'gpu_num') { + const multiGpuSelection = document.getElementById('multi-gpu-selection'); + if (multiGpuSelection && multiGpuSelection.style.display !== 'none') { + data[key] = value; + } + } else if (key === 'device') { + // 处理device参数,根据训练方式设置正确格式 + if (trainingMode === 'single_gpu') { + // 单卡训练时,格式为cuda:序号 + data[key] = `cuda:${value}`; + } else if (trainingMode === 'cpu') { + // CPU训练时,固定为cpu + data[key] = 'cpu'; + } + // 多卡训练时不需要device参数,会通过torchrun自动设置 + } else if (key !== 'training_mode') { + // 排除training_mode参数,保留其他参数 + data[key] = value; + } + }); // 立即显示加载通知 showNotification('正在启动训练...', 'info'); @@ -1131,36 +1182,32 @@ function viewLogFile(filename, button) { if (logContainer.classList.contains('hidden')) { logContainer.classList.remove('hidden'); - // 如果是首次加载,获取日志内容 - if (logContainer.textContent.trim() === '') { - logContainer.textContent = '加载中...'; - - fetch(`/logfile-content/${encodeURIComponent(filename)}`) - .then(response => { - if (!response.ok) { - throw new Error('获取日志失败'); - } - return response.text(); - }) - .then(logs => { - // 保留空白格式,使用textContent而不是innerHTML - logContainer.textContent = logs; - logContainer.scrollTop = 0; - - // 更新内容容器的高度 - updateContentContainerHeight(); - }) - .catch(error => { - console.error('获取日志失败:', error); - logContainer.innerHTML = `

获取日志失败: ${error.message}

`; - - // 更新内容容器的高度 - updateContentContainerHeight(); - }); - } else { - // 如果不是首次加载,直接更新内容容器的高度 - updateContentContainerHeight(); - } + // 读取完整日志内容 + logContainer.textContent = '加载中...'; + + fetch(`/logfile-content/${encodeURIComponent(filename)}`) + .then(response => { + if (!response.ok) { + throw new Error('获取日志失败'); + } + return response.text(); + }) + .then(logs => { + // 保留空白格式,使用textContent而不是innerHTML + logContainer.textContent = logs; + // 默认滚动到顶部,显示完整历史 + logContainer.scrollTop = 0; + + // 更新内容容器的高度 + updateContentContainerHeight(); + }) + .catch(error => { + console.error('获取日志失败:', error); + logContainer.textContent = `获取日志失败: ${error.message}`; + + // 更新内容容器的高度 + updateContentContainerHeight(); + }); } else { logContainer.classList.add('hidden'); diff --git a/scripts/templates/index.html b/scripts/templates/index.html index 7d5b342..a49c4de 100644 --- a/scripts/templates/index.html +++ b/scripts/templates/index.html @@ -133,8 +133,21 @@

其他设置

- - + + +
+
+ + +
+
@@ -146,6 +159,61 @@
+ +
diff --git a/scripts/train_web_ui.py b/scripts/train_web_ui.py index d60fdcb..f640e12 100644 --- a/scripts/train_web_ui.py +++ b/scripts/train_web_ui.py @@ -7,6 +7,38 @@ import socket from flask import Flask, render_template, request, jsonify, redirect, url_for import time +# 尝试导入torch来检测GPU +try: + import torch + HAS_TORCH = True + # 检测可用的GPU数量和设备信息 + if torch.cuda.is_available(): + GPU_COUNT = torch.cuda.device_count() + # 获取GPU设备名称 + GPU_NAMES = [torch.cuda.get_device_name(i) for i in range(GPU_COUNT)] + else: + GPU_COUNT = 0 + GPU_NAMES = [] +except ImportError: + HAS_TORCH = False + GPU_COUNT = 0 + GPU_NAMES = [] + +# 训练方式支持检测 +def get_supported_training_methods(): + """获取当前环境支持的训练方法""" + methods = { + 'pretrain': True, # 预训练总是支持 + 'sft': True, # SFT总是支持 + 'lora': True, # LoRA总是支持 + 'dpo': True, # DPO总是支持 + 'multi_gpu': HAS_TORCH and GPU_COUNT > 1 # 多GPU训练需要PyTorch和多个GPU + } + return methods + +# 获取当前环境支持的训练方法 +SUPPORTED_METHODS = get_supported_training_methods() + sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) app = Flask(__name__, template_folder='templates', static_folder='static') @@ -28,25 +60,41 @@ def start_training_process(train_type, params): # 确保日志目录存在 os.makedirs(log_dir, exist_ok=True) + # 获取GPU数量参数,如果存在且大于1,则使用torchrun启动多卡训练 + gpu_num = int(params.get('gpu_num', 0)) if 'gpu_num' in params else 0 + use_torchrun = HAS_TORCH and GPU_COUNT > 0 and gpu_num > 1 + # 构建命令 if train_type == 'pretrain': script_path = '../trainer/train_pretrain.py' - cmd = [sys.executable, script_path] + if use_torchrun: + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] + else: + cmd = [sys.executable, script_path] if 'save_weight' in params: cmd.extend(['--save_weight', params['save_weight']]) elif train_type == 'sft': script_path = '../trainer/train_full_sft.py' - cmd = [sys.executable, script_path] + if use_torchrun: + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] + else: + cmd = [sys.executable, script_path] if 'save_weight' in params: cmd.extend(['--save_weight', params['save_weight']]) elif train_type == 'lora': script_path = '../trainer/train_lora.py' - cmd = [sys.executable, script_path] + if use_torchrun: + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] + else: + cmd = [sys.executable, script_path] if 'lora_name' in params: cmd.extend(['--lora_name', params['lora_name']]) elif train_type == 'dpo': script_path = '../trainer/train_dpo.py' - cmd = [sys.executable, script_path] + if use_torchrun: + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] + else: + cmd = [sys.executable, script_path] # 添加DPO特定参数 if 'beta' in params and params['beta']: cmd.extend(['--beta', params['beta']]) @@ -59,14 +107,14 @@ def start_training_process(train_type, params): # 添加通用参数 for key, value in params.items(): - # 跳过特殊参数和DPO特有参数 - if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor', 'beta', 'accumulation_steps', 'grad_clip']: + # 跳过特殊参数和DPO特有参数,以及gpu_num参数(因为已经在torchrun命令中使用) + if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor', 'beta', 'accumulation_steps', 'grad_clip', 'gpu_num']: continue - # 特殊处理布尔标志参数 + # 对于from_resume参数,需要正确传递参数值 if key == 'from_resume': - if value == '1': # 只有当值为1时才添加这个标志 - cmd.append(f'--{key}') + # 确保传递参数名和参数值 + cmd.extend([f'--{key}', str(value)]) else: # 确保log_interval和save_interval参数正确传递 cmd.extend([f'--{key}', str(value)]) @@ -126,7 +174,8 @@ def start_training_process(train_type, params): # Flask路由 @app.route('/') def index(): - return render_template('index.html') + # 传递GPU信息到前端 + return render_template('index.html', has_gpu=HAS_TORCH and GPU_COUNT > 0, gpu_count=GPU_COUNT) @app.route('/train', methods=['POST']) def train(): @@ -176,20 +225,62 @@ def logs(process_id): log_dir = os.path.join(script_dir, '../logfile') log_dir = os.path.abspath(log_dir) + # 查找匹配的日志文件 + log_file = None if os.path.exists(log_dir): for filename in os.listdir(log_dir): if filename.endswith(f'{process_id}.log'): log_file = os.path.join(log_dir, filename) - if os.path.exists(log_file): - try: - with open(log_file, 'r', encoding='utf-8') as f: - # 只读取最后200行 - lines = f.readlines() - last_200_lines = lines[-200:] if len(lines) > 200 else lines - return ''.join(last_200_lines) - except Exception as e: - return f'读取日志失败: {str(e)}' - return '日志文件不存在或已被删除' + break + + if not log_file or not os.path.exists(log_file): + return '日志文件不存在或已被删除' + + try: + # 使用高效的方法读取文件的最后200行 + # 这对于大文件特别有用,可以避免读取整个文件 + last_200_lines = [] + block_size = 8192 # 8KB blocks + + with open(log_file, 'r', encoding='utf-8') as f: + # 尝试直接定位到文件末尾,然后向前读取 + f.seek(0, os.SEEK_END) + file_size = f.tell() + + # 计算需要读取的块数 + position = file_size + blocks = [] + while position > 0: + # 后退一个块的位置 + position -= block_size + if position < 0: + position = 0 + + # 移动到计算的位置 + f.seek(position) + + # 读取这个块 + block = f.read(block_size) + blocks.append(block) + + # 如果已经收集了足够的行,就停止 + combined_text = ''.join(reversed(blocks)) + lines = combined_text.splitlines(True) + if len(lines) >= 200: + # 获取最后200行 + last_200_lines = lines[-200:] + break + + # 如果文件内容不足200行,或者上面的方法没有收集到足够的行 + if len(last_200_lines) < 200: + # 重新读取整个文件(对于小文件) + f.seek(0) + all_lines = f.readlines() + last_200_lines = all_lines[-200:] if len(all_lines) > 200 else all_lines + + return ''.join(last_200_lines) + except Exception as e: + return f'读取日志失败: {str(e)}' @app.route('/logfiles') def get_logfiles(): @@ -220,24 +311,26 @@ def get_logfiles(): @app.route('/logfile-content/') def get_logfile_content(filename): + # 安全检查:确保文件名不包含路径遍历字符 + if '..' in filename or '/' in filename or '\\' in filename: + return jsonify({'error': 'Invalid filename'}), 400 + # 获取脚本所在目录的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) - # 构建logfile目录的绝对路径 + # 构建logfile目录的绝对路径,train_web_ui.py在scripts目录下 log_dir = os.path.join(script_dir, '../logfile') log_dir = os.path.abspath(log_dir) - - # 安全检查:防止路径遍历攻击 - if '..' in filename or '/' in filename or '\\' in filename: - return '非法的文件名' - log_file = os.path.join(log_dir, filename) - if os.path.exists(log_file) and os.path.isfile(log_file): - try: - with open(log_file, 'r', encoding='utf-8') as f: - return f.read() - except Exception as e: - return f'读取日志失败: {str(e)}' - return '日志文件不存在' + + try: + # 读取完整的日志文件内容 + with open(log_file, 'r', encoding='utf-8') as f: + content = f.read() + return content + except FileNotFoundError: + return jsonify({'error': 'Log file not found'}), 404 + except Exception as e: + return jsonify({'error': str(e)}), 500 @app.route('/delete-logfile/', methods=['DELETE']) def delete_logfile(filename): From d66a7945dba439ac5a6cd12608f392432c8df775 Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Tue, 11 Nov 2025 07:40:38 +0000 Subject: [PATCH 08/35] support ppo and Training web code refactoring --- trainer_web/start_web_ui.sh | 40 ++++++ {scripts => trainer_web}/static/css/style.css | 0 .../static/images/logo2.png | Bin {scripts => trainer_web}/static/js/script.js | 38 +++++- trainer_web/stop_web_ui.sh | 24 ++++ {scripts => trainer_web}/templates/index.html | 39 +++++- trainer_web/train_web_ui.pid | 1 + {scripts => trainer_web}/train_web_ui.py | 124 +++++++++++++++++- trainer_web/training_processes.json | 29 ++++ 9 files changed, 287 insertions(+), 8 deletions(-) create mode 100755 trainer_web/start_web_ui.sh rename {scripts => trainer_web}/static/css/style.css (100%) rename {scripts => trainer_web}/static/images/logo2.png (100%) rename {scripts => trainer_web}/static/js/script.js (96%) create mode 100755 trainer_web/stop_web_ui.sh rename {scripts => trainer_web}/templates/index.html (84%) create mode 100644 trainer_web/train_web_ui.pid rename {scripts => trainer_web}/train_web_ui.py (76%) create mode 100644 trainer_web/training_processes.json diff --git a/trainer_web/start_web_ui.sh b/trainer_web/start_web_ui.sh new file mode 100755 index 0000000..9279e4a --- /dev/null +++ b/trainer_web/start_web_ui.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# 获取脚本所在目录 +SCRIPT_DIR=$(dirname "$(readlink -f "$0")") +cd "$SCRIPT_DIR" + +# 检查是否已经有实例在运行 +if [ -f "train_web_ui.pid" ]; then + pid=$(cat "train_web_ui.pid") + if ps -p "$pid" > /dev/null 2>&1; then + echo "Web UI 服务已经在运行 (PID: $pid)" + exit 1 + else + echo "删除旧的PID文件" + rm "train_web_ui.pid" + fi +fi + +# 创建日志目录 +LOG_DIR="../logfile" +mkdir -p "$LOG_DIR" + +# 生成时间戳 +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") +LOG_FILE="$LOG_DIR/web_ui_$TIMESTAMP.log" + +echo "启动 MiniMind Web UI 服务..." +echo "日志文件: $LOG_FILE" + +# 使用nohup启动服务 +nohup python -u train_web_ui.py > "$LOG_FILE" 2>&1 & + +# 保存PID +echo $! > "train_web_ui.pid" + +sleep 2 + +echo "服务已启动! PID: $(cat "train_web_ui.pid")" +echo "访问地址: http://localhost:5000" +echo "停止命令: kill $(cat "train_web_ui.pid") or ./trainer_web/stop_web_ui.sh" \ No newline at end of file diff --git a/scripts/static/css/style.css b/trainer_web/static/css/style.css similarity index 100% rename from scripts/static/css/style.css rename to trainer_web/static/css/style.css diff --git a/scripts/static/images/logo2.png b/trainer_web/static/images/logo2.png similarity index 100% rename from scripts/static/images/logo2.png rename to trainer_web/static/images/logo2.png diff --git a/scripts/static/js/script.js b/trainer_web/static/js/script.js similarity index 96% rename from scripts/static/js/script.js rename to trainer_web/static/js/script.js index 287f7c0..6cfcf54 100644 --- a/scripts/static/js/script.js +++ b/trainer_web/static/js/script.js @@ -32,12 +32,19 @@ function openTab(evt, tabName) { document.getElementById('train_type').addEventListener('change', function() { const trainType = this.value; const pretrainSftFields = document.querySelectorAll('.pretrain-sft'); + const fromWeightFields = document.querySelectorAll('.from-weight'); const loraFields = document.querySelectorAll('.lora'); const dpoFields = document.querySelectorAll('.dpo'); const dpoParamCard = document.querySelector('.parameter-card.dpo'); + const ppoFields = document.querySelectorAll('.ppo'); + const ppoParamCard = document.querySelector('.parameter-card.ppo'); pretrainSftFields.forEach(field => { - field.style.display = (trainType === 'pretrain' || trainType === 'sft') ? 'block' : 'none'; + field.style.display = (trainType === 'pretrain' || trainType === 'sft' || trainType === 'dpo' || trainType === 'ppo') ? 'block' : 'none'; + }); + + fromWeightFields.forEach(field => { + field.style.display = (trainType !== 'ppo') ? 'block' : 'none'; }); loraFields.forEach(field => { @@ -48,10 +55,18 @@ document.getElementById('train_type').addEventListener('change', function() { field.style.display = trainType === 'dpo' ? 'block' : 'none'; }); + ppoFields.forEach(field => { + field.style.display = trainType === 'ppo' ? 'block' : 'none'; + }); + if (dpoParamCard) { dpoParamCard.style.display = trainType === 'dpo' ? 'block' : 'none'; } + if (ppoParamCard) { + ppoParamCard.style.display = trainType === 'ppo' ? 'block' : 'none'; + } + // 设置默认值 if (trainType === 'pretrain') { document.getElementById('save_dir').value = '../out'; @@ -114,6 +129,27 @@ document.getElementById('train_type').addEventListener('change', function() { document.getElementById('num_hidden_layers').value = '8'; document.getElementById('max_seq_len').value = '1024'; document.getElementById('use_moe').value = '0'; + } else if (trainType === 'ppo') { + document.getElementById('save_dir').value = '../out'; + document.getElementById('save_weight').value = 'ppo_actor'; + document.getElementById('epochs').value = '1'; + document.getElementById('batch_size').value = '2'; + document.getElementById('learning_rate').value = '8e-8'; + document.getElementById('data_path').value = '../dataset/rlaif-mini.jsonl'; + document.getElementById('log_interval').value = '1'; + document.getElementById('save_interval').value = '10'; + // PPO特有参数默认值 + document.getElementById('clip_epsilon').value = '0.1'; + document.getElementById('vf_coef').value = '0.5'; + document.getElementById('kl_coef').value = '0.02'; + document.getElementById('reasoning').value = '1'; + document.getElementById('update_old_actor_freq').value = '4'; + document.getElementById('reward_model_path').value = '../../internlm2-1_8b-reward'; + // 模型结构参数默认值 + document.getElementById('hidden_size').value = '512'; + document.getElementById('num_hidden_layers').value = '8'; + document.getElementById('max_seq_len').value = '66'; + document.getElementById('use_moe').value = '0'; } }); diff --git a/trainer_web/stop_web_ui.sh b/trainer_web/stop_web_ui.sh new file mode 100755 index 0000000..df01186 --- /dev/null +++ b/trainer_web/stop_web_ui.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +SCRIPT_DIR=$(dirname "$(readlink -f "$0")") +cd "$SCRIPT_DIR" + +if [ -f "train_web_ui.pid" ]; then + pid=$(cat "train_web_ui.pid") + if ps -p "$pid" > /dev/null 2>&1; then + echo "正在停止 Web UI 服务 (PID: $pid)" + kill "$pid" + sleep 2 + # 检查是否成功停止 + if ps -p "$pid" > /dev/null 2>&1; then + echo "强制停止服务..." + kill -9 "$pid" + fi + echo "服务已停止" + else + echo "服务未运行,但存在PID文件,已删除" + rm "train_web_ui.pid" + fi +else + echo "服务未运行(未找到PID文件)" +fi \ No newline at end of file diff --git a/scripts/templates/index.html b/trainer_web/templates/index.html similarity index 84% rename from scripts/templates/index.html rename to trainer_web/templates/index.html index a49c4de..2da4064 100644 --- a/scripts/templates/index.html +++ b/trainer_web/templates/index.html @@ -33,6 +33,7 @@ +
@@ -60,7 +61,7 @@
+ + + + + +
diff --git a/trainer_web/train_web_ui.pid b/trainer_web/train_web_ui.pid new file mode 100644 index 0000000..b7ae382 --- /dev/null +++ b/trainer_web/train_web_ui.pid @@ -0,0 +1 @@ +2100766 \ No newline at end of file diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index b8dcdf8..146e302 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -130,14 +130,40 @@ def start_training_process(train_type, params): cmd.extend(['--update_old_actor_freq', params['update_old_actor_freq']]) if 'reward_model_path' in params and params['reward_model_path']: cmd.extend(['--reward_model_path', params['reward_model_path']]) + elif train_type == 'grpo': + script_path = '../trainer/train_grpo.py' + if use_torchrun: + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] + else: + cmd = [sys.executable, script_path] + if 'beta' in params and params['beta']: + cmd.extend(['--beta', params['beta']]) + if 'num_generations' in params and params['num_generations']: + cmd.extend(['--num_generations', params['num_generations']]) + if 'reasoning' in params and params['reasoning']: + cmd.extend(['--reasoning', params['reasoning']]) + if 'reward_model_path' in params and params['reward_model_path']: + cmd.extend(['--reward_model_path', params['reward_model_path']]) + elif train_type == 'spo': + script_path = '../trainer/train_spo.py' + if use_torchrun: + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] + else: + cmd = [sys.executable, script_path] + if 'beta' in params and params['beta']: + cmd.extend(['--beta', params['beta']]) + if 'reasoning' in params and params['reasoning']: + cmd.extend(['--reasoning', params['reasoning']]) + if 'reward_model_path' in params and params['reward_model_path']: + cmd.extend(['--reward_model_path', params['reward_model_path']]) else: return None # 添加通用参数 for key, value in params.items(): # 跳过特殊参数和DPO、PPO特有参数,以及gpu_num参数(因为已经在torchrun命令中使用) - # 对于PPO训练,跳过--from_weight参数 - if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor', 'beta', 'accumulation_steps', 'grad_clip', 'gpu_num', 'clip_epsilon', 'vf_coef', 'kl_coef', 'reasoning', 'update_old_actor_freq', 'reward_model_path'] or (train_type == 'ppo' and key == 'from_weight'): + # 对于PPO/GRPO/SPO训练,跳过--from_weight参数 + if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor', 'beta', 'accumulation_steps', 'grad_clip', 'gpu_num', 'clip_epsilon', 'vf_coef', 'kl_coef', 'reasoning', 'update_old_actor_freq', 'reward_model_path', 'num_generations'] or ((train_type == 'ppo' or train_type == 'grpo' or train_type == 'spo') and key == 'from_weight'): continue # 对于from_resume参数,需要正确传递参数值 elif key == 'from_resume': diff --git a/trainer_web/training_processes.json b/trainer_web/training_processes.json new file mode 100644 index 0000000..d91960d --- /dev/null +++ b/trainer_web/training_processes.json @@ -0,0 +1,13 @@ +{ + "20251117_171339": { + "pid": 2060245, + "train_type": "grpo", + "log_file": "/root/minimind_web/minimind/logfile/train_grpo_20251117_171339.log", + "start_time": "2025-11-17 17:13:39", + "running": false, + "error": true, + "manually_stopped": false, + "train_monitor": "none", + "swanlab_url": null + } +} \ No newline at end of file From 52b7b88ec2640178e022e0e51e98ebc5fff423b3 Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Tue, 18 Nov 2025 21:21:13 +0800 Subject: [PATCH 16/35] update web --- ...成 GRPO 与 SPO 训练类型的前端与后端支持.md | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 .trae/documents/完成 GRPO 与 SPO 训练类型的前端与后端支持.md diff --git a/.trae/documents/完成 GRPO 与 SPO 训练类型的前端与后端支持.md b/.trae/documents/完成 GRPO 与 SPO 训练类型的前端与后端支持.md deleted file mode 100644 index f62b0d7..0000000 --- a/.trae/documents/完成 GRPO 与 SPO 训练类型的前端与后端支持.md +++ /dev/null @@ -1,66 +0,0 @@ -## 目标 -- 在现有 DPO/PPO 基础上,新增 GRPO 与 SPO 训练类型的完整前后端流程。 -- 选定对应训练类型后,仅显示该类型的特有参数;隐藏不需要的参数。 -- 参数默认值严格对齐 `trainer/train_grpo.py` 与 `trainer/train_spo.py`。 -- 保持原有 `trainer_web` 逻辑与交互不受影响。 - -## 代码改动 -### 前端模板(index.html) -- 在训练类型选择框中新增:`RL - GRPO`(value=`grpo`)、`RL - SPO`(value=`spo`)。 -- 新增两块参数卡片: - - GRPO 参数卡(class=`parameter-card grpo`): - - `beta`(浮点输入,placeholder=0.02) - - `num_generations`(整数输入,placeholder=8) - - `reasoning`(下拉 0/1) - - `reward_model_path`(文本输入,placeholder=`../../internlm2-1_8b-reward`) - - SPO 参数卡(class=`parameter-card spo`): - - `beta`(浮点输入,placeholder=0.02) - - `reasoning`(下拉 0/1) - - `reward_model_path`(文本输入,placeholder=`../../internlm2-1_8b-reward`) -- 保持现有 DPO/PPO 参数卡结构不变。 - -### 前端交互(static/js/train/form.js) -- 在 `onTrainTypeChange` 中: - - 为 GRPO/SPO 添加显示/隐藏逻辑: - - `.grpo` 与 `.spo` 卡片只在对应训练类型显示。 - - `pretrain-sft` 区域显示范围扩展到 `grpo` 与 `spo`(需要 `save_weight` 字段)。 - - `from-weight` 区域在 `ppo/grpo/spo` 下隐藏(这三者均不使用 `from_weight`)。 - - 新增默认参数设定: - - GRPO 默认值(严格对齐 `trainer/train_grpo.py`): - - `save_dir=../out`, `save_weight=grpo`, `epochs=1`, `batch_size=2`, `learning_rate=8e-8` - - `data_path=../dataset/rlaif-mini.jsonl`, `log_interval=1`, `save_interval=10` - - `hidden_size=512`, `num_hidden_layers=8`, `max_seq_len=66`, `use_moe=0` - - 特有:`beta=0.02`, `num_generations=8`, `reasoning=1`, `reward_model_path=../../internlm2-1_8b-reward` - - SPO 默认值(严格对齐 `trainer/train_spo.py`): - - `save_dir=../out`, `save_weight=spo`, `epochs=1`, `batch_size=2`, `learning_rate=1e-7` - - `data_path=../dataset/rlaif-mini.jsonl`, `log_interval=1`, `save_interval=10` - - `hidden_size=512`, `num_hidden_layers=8`, `max_seq_len=66`, `use_moe=0` - - 特有:`beta=0.02`, `reasoning=1`, `reward_model_path=../../internlm2-1_8b-reward` -- 保持 GPU 选择与提交逻辑不变。 - -### 后端启动器(trainer_web/train_web_ui.py) -- 在 `start_training_process` 中新增 `train_type=='grpo'` 与 `train_type=='spo'` 分支: - - `grpo` 使用脚本 `../trainer/train_grpo.py`;显式拼接:`--beta`、`--num_generations`、`--reasoning`、`--reward_model_path`(若前端提供)。 - - `spo` 使用脚本 `../trainer/train_spo.py`;显式拼接:`--beta`、`--reasoning`、`--reward_model_path`(若前端提供)。 -- 在通用参数拼接的跳过列表中新增:`'num_generations','beta','reasoning','reward_model_path'`(防止重复添加),并与 DPO/PPO 现有跳过策略一致;同时对 `grpo/spo` 也跳过 `from_weight`。 -- 其余逻辑(多卡、日志、监控)保持不变。 - -### 进程显示名称 -- `static/js/processes/list.js` 的名称映射中补充:`ppo: 'PPO', grpo: 'GRPO', spo: 'SPO'`(`logfiles/list.js` 已有,无需改动)。 - -## 验证步骤 -- 前端:切换训练类型时仅显示对应参数卡;`from_weight` 在 `ppo/grpo/spo` 下隐藏;默认值填充正确。 -- 后端:提交后查看日志首行的命令拼接,确认包含对应特有参数: - - GRPO:`--beta 0.02 --num_generations 8 --reasoning 1 --reward_model_path ../../internlm2-1_8b-reward` - - SPO:`--beta 0.02 --reasoning 1 --reward_model_path ../../internlm2-1_8b-reward` -- 保证 DPO/PPO 流程未受影响:分别发起一次 DPO/PPO 以回归测试。 -- 多卡/单卡/CPU 选择与日志查看、进程管理均保持工作。 - -## 兼容性与风险控制 -- 所有改动均为增量更新,不修改既有字段与 API 形态。 -- 默认值与训练脚本对齐;占位符仅用于引导,实际以默认填充值为准。 -- 若未提供特有参数,后端不拼接该 flag,训练脚本使用自身默认值。 - -## 交付 -- 更新上述 4 处文件:`templates/index.html`、`static/js/train/form.js`、`trainer_web/train_web_ui.py`、`static/js/processes/list.js`。 -- 提供端到端验证记录与示例日志片段,确保功能闭环。 \ No newline at end of file From 66dcb40db7620ae27a0d3c964dccb4ec8f935de8 Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Tue, 18 Nov 2025 21:35:26 +0800 Subject: [PATCH 17/35] init sdk --- .trae/documents/训练SDK化与注册鉴权实现.md | 52 ++++++ minimind_sdk/__init__.py | 1 + minimind_sdk/client.py | 65 +++++++ trainer_web/auth.py | 49 +++++ trainer_web/dispatcher.py | 81 +++++++++ trainer_web/static/js/services/apiClient.js | 3 + trainer_web/static/js/services/authClient.js | 29 +++ trainer_web/templates/index.html | 41 +++++ trainer_web/train_web_ui.py | 178 +++++++------------ 9 files changed, 387 insertions(+), 112 deletions(-) create mode 100644 .trae/documents/训练SDK化与注册鉴权实现.md create mode 100644 minimind_sdk/__init__.py create mode 100644 minimind_sdk/client.py create mode 100644 trainer_web/auth.py create mode 100644 trainer_web/dispatcher.py create mode 100644 trainer_web/static/js/services/authClient.js diff --git a/.trae/documents/训练SDK化与注册鉴权实现.md b/.trae/documents/训练SDK化与注册鉴权实现.md new file mode 100644 index 0000000..5ba6df0 --- /dev/null +++ b/.trae/documents/训练SDK化与注册鉴权实现.md @@ -0,0 +1,52 @@ +# 总体架构 +- 服务端统一暴露训练服务与进程管理接口;引入客户端注册与鉴权,训练仅对已注册客户端开放。 +- 训练能力保持原子化:按 `train_type`(pretrain/sft/lora/dpo/ppo/grpo/spo)分派脚本与参数,保留现有脚本接口。 +- 提供 Python SDK,封装注册、发起训练、查询进程与日志等操作,客户端只需少量模型参数即可启动训练。 +- Web 端保留现有操作界面,新增注册流程与鉴权头注入。 + +# 服务端改造(Flask) +- 新增注册接口:`POST /api/register`,入参:`name`、`email`;生成并返回 `client_id` 与 `api_key`,并在服务端保存(`trainer_web/clients.json`)。 +- 新增鉴权中间件:校验请求头 `Authorization: Bearer `;解析出 `client_id` 并附加到请求上下文。 +- 训练相关接口全部鉴权并按 `client_id` 隔离: + - 保留并保护现有接口:`POST /train`(trainer_web/train_web_ui.py:247-266)、`GET /processes`(trainer_web/train_web_ui.py:267-286)、`GET /logs/`(trainer_web/train_web_ui.py:288-374)、`POST /stop/`(trainer_web/train_web_ui.py:466-485)、`POST /delete/`(trainer_web/train_web_ui.py:487-520)、`GET /logfiles`、`GET /logfile-content/`、`DELETE /delete-logfile/`。 + - `training_processes` 结构增加 `client_id` 字段;`training_processes.json` 持久化同步该字段(trainer_web/train_web_ui.py:540-607)。 + - 在读取日志、停止/删除进程时先校验归属(仅允许操作本客户端的进程与日志)。 +- 抽象原子训练分发器:新增 `dispatcher` 模块,统一 `train_type → 脚本路径 + 参数构造`,内部直接复用现有命令拼装逻辑(trainer_web/train_web_ui.py:59-175)。脚本与参数名均保持不变。 +- 安全与配置: + - `api_key` 服务端按 `sha256` 存储,避免明文;可选 `SERVER_SECRET` 用于签发/验证简易令牌。 + - 新增布尔配置 `ALLOW_ANONYMOUS=false`,默认禁止匿名训练。 + +# 客户端 SDK(Python) +- 包名:`minimind_sdk`;类:`MinimindClient(base_url, api_key=None)`。 +- 方法: + - `register(name, email) -> {client_id, api_key}` + - `start_training(train_type, **params) -> process_id`(保留与 `/train` 相同字段约定) + - `get_processes() -> list`、`get_logs(process_id) -> str` + - `stop(process_id)`、`delete(process_id)`、`get_logfiles()`、`get_logfile_content(filename)`、`delete_logfile(filename)` +- 简化封装:按训练类型提供高层方法:`train_sft(...)`、`train_dpo(...)`、`train_ppo(...)` 等,只暴露核心参数,其余按当前脚本默认值填充(例如 SFT 参考 trainer/train_full_sft.py:83-105)。 +- 错误处理:统一抛出带有服务端错误信息的异常;返回类型标准化。 + +# Web 端适配 +- 新增“注册”入口:表单提交到 `POST /api/register`,成功后将 `api_key` 保存到 `localStorage`。 +- `apiClient.js` 在所有请求中自动注入 `Authorization` 头(trainer_web/static/js/services/apiClient.js:1-73)。 +- 进程与日志列表仅展示当前客户端数据;保留现有 Tab 与交互(trainer_web/static/js/app.js:1-24、train/form.js:1-127)。 + +# 接口保留与兼容 +- 现有 REST 路径与请求体字段保持不变;仅增加注册接口与鉴权要求。 +- 训练脚本 CLI 接口完全保留(`argparse` 参数不改动),通过分发器集中调用。 +- 对历史脚本/工具的兼容:如果需要,可保留一个仅本机可用的“匿名模式”开关用于调试(默认关闭)。 + +# 数据与安全 +- 客户注册数据文件:`trainer_web/clients.json`;字段:`client_id`、`name`、`email`、`api_key_hash`、`created_at`。 +- 进程记录增加 `client_id`,日志操作前进行归属校验;多租户隔离。 +- 不在日志中打印敏感信息;不落盘明文 `api_key`。 + +# 交付与变更点 +- 服务端:`train_web_ui.py` 引入鉴权与 `client_id` 归属;新增 `auth.py` 与 `dispatcher.py`。 +- SDK:`minimind_sdk` 源码与示例;示例脚本:注册→发起 SFT 训练→轮询进程→查看日志→停止。 +- Web:新增注册 UI、`apiClient.js` 注入鉴权、列表隔离逻辑。 + +# 验收与测试 +- 未注册请求调用 `/train` 返回 `401`;注册后可正常发起训练。 +- 用 SDK 完成一次 SFT 训练,能看到进程、日志、停止与删除操作均正常并隔离。 +- 多客户端并发训练与日志隔离验证;重启服务后通过 `training_processes.json` 成功恢复状态。 diff --git a/minimind_sdk/__init__.py b/minimind_sdk/__init__.py new file mode 100644 index 0000000..4f9b7ed --- /dev/null +++ b/minimind_sdk/__init__.py @@ -0,0 +1 @@ +from .client import MinimindClient \ No newline at end of file diff --git a/minimind_sdk/client.py b/minimind_sdk/client.py new file mode 100644 index 0000000..d104e1c --- /dev/null +++ b/minimind_sdk/client.py @@ -0,0 +1,65 @@ +import json +import urllib.request +import urllib.error + +class MinimindClient: + def __init__(self, base_url, api_key=None, timeout=10): + self.base_url = base_url.rstrip('/') + self.api_key = api_key or '' + self.timeout = timeout + + def _request(self, method, path, body=None, expect_text=False): + url = f"{self.base_url}{path}" + headers = { + 'Content-Type': 'application/json', + 'Cache-Control': 'no-cache' + } + if self.api_key: + headers['Authorization'] = f"Bearer {self.api_key}" + data = None + if body is not None: + data = json.dumps(body).encode('utf-8') + req = urllib.request.Request(url, data=data, headers=headers, method=method) + try: + with urllib.request.urlopen(req, timeout=self.timeout) as resp: + raw = resp.read() + if expect_text: + return raw.decode('utf-8', errors='replace') + return json.loads(raw.decode('utf-8')) + except urllib.error.HTTPError as e: + msg = e.read().decode('utf-8', errors='replace') + raise RuntimeError(f"HTTP {e.code}: {msg}") + except urllib.error.URLError as e: + raise RuntimeError(str(e)) + + def register(self, name, email): + res = self._request('POST', '/api/register', {'name': name, 'email': email}) + self.api_key = res.get('api_key', self.api_key) + return res + + def start_training(self, train_type, **params): + payload = {'train_type': train_type} + payload.update(params or {}) + res = self._request('POST', '/train', payload) + return res + + def get_processes(self): + return self._request('GET', '/processes', None) + + def get_logs(self, process_id): + return self._request('GET', f"/logs/{process_id}", None, expect_text=True) + + def stop(self, process_id): + return self._request('POST', f"/stop/{process_id}", None) + + def delete(self, process_id): + return self._request('POST', f"/delete/{process_id}", None) + + def get_logfiles(self): + return self._request('GET', '/logfiles', None) + + def get_logfile_content(self, filename): + return self._request('GET', f"/logfile-content/{filename}", None, expect_text=True) + + def delete_logfile(self, filename): + return self._request('DELETE', f"/delete-logfile/{filename}", None) \ No newline at end of file diff --git a/trainer_web/auth.py b/trainer_web/auth.py new file mode 100644 index 0000000..62b3910 --- /dev/null +++ b/trainer_web/auth.py @@ -0,0 +1,49 @@ +import os +import json +import hashlib +import secrets +import time + +CLIENTS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'clients.json') + +def _load_clients(): + if os.path.exists(CLIENTS_FILE): + with open(CLIENTS_FILE, 'r', encoding='utf-8') as f: + return json.load(f) + return {} + +def _save_clients(clients): + with open(CLIENTS_FILE, 'w', encoding='utf-8') as f: + json.dump(clients, f, ensure_ascii=False, indent=2) + +def _hash_api_key(api_key): + return hashlib.sha256(api_key.encode('utf-8')).hexdigest() + +def register_client(name, email): + clients = _load_clients() + client_id = secrets.token_hex(8) + str(int(time.time())) + api_key = secrets.token_hex(32) + clients[client_id] = { + 'client_id': client_id, + 'name': name, + 'email': email, + 'api_key_hash': _hash_api_key(api_key), + 'created_at': int(time.time()) + } + _save_clients(clients) + return {'client_id': client_id, 'api_key': api_key} + +def verify_api_key(api_key): + clients = _load_clients() + target = _hash_api_key(api_key) + for _, info in clients.items(): + if info.get('api_key_hash') == target: + return info + return None + +def get_client_from_request(request): + auth = request.headers.get('Authorization') + if not auth or not auth.startswith('Bearer '): + return None + token = auth.split(' ', 1)[1].strip() + return verify_api_key(token) \ No newline at end of file diff --git a/trainer_web/dispatcher.py b/trainer_web/dispatcher.py new file mode 100644 index 0000000..092f7b5 --- /dev/null +++ b/trainer_web/dispatcher.py @@ -0,0 +1,81 @@ +import sys +import os + +def build_command(train_type, params, gpu_num, use_torchrun): + if train_type == 'pretrain': + script_path = '../trainer/train_pretrain.py' + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] if use_torchrun else [sys.executable, script_path] + if 'save_weight' in params: + cmd.extend(['--save_weight', params['save_weight']]) + elif train_type == 'sft': + script_path = '../trainer/train_full_sft.py' + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] if use_torchrun else [sys.executable, script_path] + if 'save_weight' in params: + cmd.extend(['--save_weight', params['save_weight']]) + elif train_type == 'lora': + script_path = '../trainer/train_lora.py' + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] if use_torchrun else [sys.executable, script_path] + if 'lora_name' in params: + cmd.extend(['--lora_name', params['lora_name']]) + elif train_type == 'dpo': + script_path = '../trainer/train_dpo.py' + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] if use_torchrun else [sys.executable, script_path] + if 'beta' in params and params['beta']: + cmd.extend(['--beta', params['beta']]) + if 'accumulation_steps' in params and params['accumulation_steps']: + cmd.extend(['--accumulation_steps', params['accumulation_steps']]) + if 'grad_clip' in params and params['grad_clip']: + cmd.extend(['--grad_clip', params['grad_clip']]) + elif train_type == 'ppo': + script_path = '../trainer/train_ppo.py' + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] if use_torchrun else [sys.executable, script_path] + if 'clip_epsilon' in params and params['clip_epsilon']: + cmd.extend(['--clip_epsilon', params['clip_epsilon']]) + if 'vf_coef' in params and params['vf_coef']: + cmd.extend(['--vf_coef', params['vf_coef']]) + if 'kl_coef' in params and params['kl_coef']: + cmd.extend(['--kl_coef', params['kl_coef']]) + if 'reasoning' in params and params['reasoning']: + cmd.extend(['--reasoning', params['reasoning']]) + if 'update_old_actor_freq' in params and params['update_old_actor_freq']: + cmd.extend(['--update_old_actor_freq', params['update_old_actor_freq']]) + if 'reward_model_path' in params and params['reward_model_path']: + cmd.extend(['--reward_model_path', params['reward_model_path']]) + elif train_type == 'grpo': + script_path = '../trainer/train_grpo.py' + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] if use_torchrun else [sys.executable, script_path] + if 'beta' in params and params['beta']: + cmd.extend(['--beta', params['beta']]) + if 'num_generations' in params and params['num_generations']: + cmd.extend(['--num_generations', params['num_generations']]) + if 'reasoning' in params and params['reasoning']: + cmd.extend(['--reasoning', params['reasoning']]) + if 'reward_model_path' in params and params['reward_model_path']: + cmd.extend(['--reward_model_path', params['reward_model_path']]) + elif train_type == 'spo': + script_path = '../trainer/train_spo.py' + cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] if use_torchrun else [sys.executable, script_path] + if 'beta' in params and params['beta']: + cmd.extend(['--beta', params['beta']]) + if 'reasoning' in params and params['reasoning']: + cmd.extend(['--reasoning', params['reasoning']]) + if 'reward_model_path' in params and params['reward_model_path']: + cmd.extend(['--reward_model_path', params['reward_model_path']]) + else: + return None + + for key, value in params.items(): + if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor', 'beta', 'accumulation_steps', 'grad_clip', 'gpu_num', 'clip_epsilon', 'vf_coef', 'kl_coef', 'reasoning', 'update_old_actor_freq', 'reward_model_path', 'num_generations'] or ((train_type == 'ppo' or train_type == 'grpo' or train_type == 'spo') and key == 'from_weight'): + continue + elif key == 'from_resume': + cmd.extend([f'--{key}', str(value)]) + else: + cmd.extend([f'--{key}', str(value)]) + + if 'train_monitor' in params: + if params['train_monitor'] == 'wandb' or params['train_monitor'] == 'swanlab': + cmd.append('--use_wandb') + if params['train_monitor'] == 'wandb': + cmd.extend(['--wandb_project', 'minimind_training']) + + return cmd \ No newline at end of file diff --git a/trainer_web/static/js/services/apiClient.js b/trainer_web/static/js/services/apiClient.js index 0da4516..c269d60 100644 --- a/trainer_web/static/js/services/apiClient.js +++ b/trainer_web/static/js/services/apiClient.js @@ -1,8 +1,10 @@ +import { getApiKey } from './authClient.js'; const defaultTimeout = 10000; export function fetchWithTimeoutAndRetry(url, options = {}, timeout = defaultTimeout, retries = 3) { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), timeout); + const apiKey = getApiKey(); const fetchOptions = { ...options, headers: { @@ -10,6 +12,7 @@ export function fetchWithTimeoutAndRetry(url, options = {}, timeout = defaultTim 'Cache-Control': 'no-cache, no-store, must-revalidate', Pragma: 'no-cache', Expires: '0', + ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}), }, signal: controller.signal, }; diff --git a/trainer_web/static/js/services/authClient.js b/trainer_web/static/js/services/authClient.js new file mode 100644 index 0000000..18470c5 --- /dev/null +++ b/trainer_web/static/js/services/authClient.js @@ -0,0 +1,29 @@ +const KEY = 'minimind_api_key'; + +export function getApiKey() { + try { + return localStorage.getItem(KEY) || ''; + } catch (_) { + return ''; + } +} + +export function setApiKey(k) { + try { + localStorage.setItem(KEY, k || ''); + } catch (_) {} +} + +export function registerClient(payload) { + return fetch('/api/register', { + method: 'POST', + headers: { 'Content-Type': 'application/json', 'Cache-Control': 'no-cache' }, + body: JSON.stringify(payload || {}), + }).then((r) => { + if (!r.ok) throw new Error('register_failed'); + return r.json(); + }).then((res) => { + if (res && res.api_key) setApiKey(res.api_key); + return res; + }); +} \ No newline at end of file diff --git a/trainer_web/templates/index.html b/trainer_web/templates/index.html index d6eb535..788819b 100644 --- a/trainer_web/templates/index.html +++ b/trainer_web/templates/index.html @@ -11,6 +11,26 @@

MiniMind Training Lab

+
+
+
+

注册客户端

+
+
+ + +
+
+ + +
+
+
+ +
+
+
+
@@ -271,5 +291,26 @@
+ diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index 146e302..38f560e 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -7,6 +7,7 @@ import socket import atexit import signal from flask import Flask, render_template, request, jsonify, redirect, url_for +from flask import g import time import psutil @@ -55,8 +56,10 @@ PROCESSES_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'train # PID文件 PID_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'train_web_ui.pid') +from .auth import register_client, get_client_from_request + # 启动训练进程 -def start_training_process(train_type, params): +def start_training_process(train_type, params, client_id): # 获取脚本所在目录的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # 使用详细的时间戳作为进程ID和日志文件名 @@ -73,113 +76,11 @@ def start_training_process(train_type, params): gpu_num = int(params.get('gpu_num', 0)) if 'gpu_num' in params else 0 use_torchrun = HAS_TORCH and GPU_COUNT > 0 and gpu_num > 1 - # 构建命令 - if train_type == 'pretrain': - script_path = '../trainer/train_pretrain.py' - if use_torchrun: - cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] - else: - cmd = [sys.executable, script_path] - if 'save_weight' in params: - cmd.extend(['--save_weight', params['save_weight']]) - elif train_type == 'sft': - script_path = '../trainer/train_full_sft.py' - if use_torchrun: - cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] - else: - cmd = [sys.executable, script_path] - if 'save_weight' in params: - cmd.extend(['--save_weight', params['save_weight']]) - elif train_type == 'lora': - script_path = '../trainer/train_lora.py' - if use_torchrun: - cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] - else: - cmd = [sys.executable, script_path] - if 'lora_name' in params: - cmd.extend(['--lora_name', params['lora_name']]) - elif train_type == 'dpo': - script_path = '../trainer/train_dpo.py' - if use_torchrun: - cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] - else: - cmd = [sys.executable, script_path] - # 添加DPO特定参数 - if 'beta' in params and params['beta']: - cmd.extend(['--beta', params['beta']]) - if 'accumulation_steps' in params and params['accumulation_steps']: - cmd.extend(['--accumulation_steps', params['accumulation_steps']]) - if 'grad_clip' in params and params['grad_clip']: - cmd.extend(['--grad_clip', params['grad_clip']]) - elif train_type == 'ppo': - script_path = '../trainer/train_ppo.py' - if use_torchrun: - cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] - else: - cmd = [sys.executable, script_path] - # 添加PPO特定参数 - if 'clip_epsilon' in params and params['clip_epsilon']: - cmd.extend(['--clip_epsilon', params['clip_epsilon']]) - if 'vf_coef' in params and params['vf_coef']: - cmd.extend(['--vf_coef', params['vf_coef']]) - if 'kl_coef' in params and params['kl_coef']: - cmd.extend(['--kl_coef', params['kl_coef']]) - if 'reasoning' in params and params['reasoning']: - cmd.extend(['--reasoning', params['reasoning']]) - if 'update_old_actor_freq' in params and params['update_old_actor_freq']: - cmd.extend(['--update_old_actor_freq', params['update_old_actor_freq']]) - if 'reward_model_path' in params and params['reward_model_path']: - cmd.extend(['--reward_model_path', params['reward_model_path']]) - elif train_type == 'grpo': - script_path = '../trainer/train_grpo.py' - if use_torchrun: - cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] - else: - cmd = [sys.executable, script_path] - if 'beta' in params and params['beta']: - cmd.extend(['--beta', params['beta']]) - if 'num_generations' in params and params['num_generations']: - cmd.extend(['--num_generations', params['num_generations']]) - if 'reasoning' in params and params['reasoning']: - cmd.extend(['--reasoning', params['reasoning']]) - if 'reward_model_path' in params and params['reward_model_path']: - cmd.extend(['--reward_model_path', params['reward_model_path']]) - elif train_type == 'spo': - script_path = '../trainer/train_spo.py' - if use_torchrun: - cmd = ['torchrun', '--nproc_per_node', str(gpu_num), script_path] - else: - cmd = [sys.executable, script_path] - if 'beta' in params and params['beta']: - cmd.extend(['--beta', params['beta']]) - if 'reasoning' in params and params['reasoning']: - cmd.extend(['--reasoning', params['reasoning']]) - if 'reward_model_path' in params and params['reward_model_path']: - cmd.extend(['--reward_model_path', params['reward_model_path']]) - else: + from .dispatcher import build_command + cmd = build_command(train_type, params, gpu_num, use_torchrun) + if cmd is None: return None - # 添加通用参数 - for key, value in params.items(): - # 跳过特殊参数和DPO、PPO特有参数,以及gpu_num参数(因为已经在torchrun命令中使用) - # 对于PPO/GRPO/SPO训练,跳过--from_weight参数 - if key in ['train_type', 'save_weight', 'lora_name', 'train_monitor', 'beta', 'accumulation_steps', 'grad_clip', 'gpu_num', 'clip_epsilon', 'vf_coef', 'kl_coef', 'reasoning', 'update_old_actor_freq', 'reward_model_path', 'num_generations'] or ((train_type == 'ppo' or train_type == 'grpo' or train_type == 'spo') and key == 'from_weight'): - continue - # 对于from_resume参数,需要正确传递参数值 - elif key == 'from_resume': - # 确保传递参数名和参数值 - cmd.extend([f'--{key}', str(value)]) - else: - # 确保log_interval和save_interval参数正确传递 - cmd.extend([f'--{key}', str(value)]) - - # 单独处理训练监控参数,确保它不会被错误地添加值 - if 'train_monitor' in params: - if params['train_monitor'] == 'wandb' or params['train_monitor'] == 'swanlab': - cmd.append('--use_wandb') # 对于wandb和swanlab,只添加标志,不添加值 - if params['train_monitor'] == 'wandb': - cmd.extend(['--wandb_project', 'minimind_training']) - # 创建日志文件 with open(log_file, 'w') as f: f.write(f"开始训练 {train_type} 进程\n") @@ -204,7 +105,8 @@ def start_training_process(train_type, params): 'error': False, 'train_monitor': params.get('train_monitor', 'none'), # 保存训练监控设置 'swanlab_url': None, - 'next_line_is_swanlab_url': False + 'next_line_is_swanlab_url': False, + 'client_id': client_id } # 开始读取输出 @@ -246,6 +148,9 @@ def index(): @app.route('/train', methods=['POST']) def train(): + client = get_client_from_request(request) + if not client: + return jsonify({'success': False, 'error': '未授权'}), 401 data = request.json train_type = data.get('train_type') @@ -257,7 +162,7 @@ def train(): params['from_resume'] = '0' # 启动训练进程 - process_id = start_training_process(train_type, params) + process_id = start_training_process(train_type, params, client['client_id']) if process_id: return jsonify({'success': True, 'process_id': process_id}) @@ -266,8 +171,14 @@ def train(): @app.route('/processes') def processes(): + client = get_client_from_request(request) + if not client: + return jsonify([]), 401 + cid = client['client_id'] result = [] for process_id, info in training_processes.items(): + if info.get('client_id') != cid: + continue # 确定状态 status = '运行中' if info['running'] else \ '手动停止' if 'manually_stopped' in info and info['manually_stopped'] else \ @@ -287,6 +198,12 @@ def processes(): @app.route('/logs/') def logs(process_id): + client = get_client_from_request(request) + if not client: + return '未授权', 401 + cid = client['client_id'] + if process_id not in training_processes or training_processes[process_id].get('client_id') != cid: + return '无权限', 403 # 直接从本地logfile目录读取日志文件 # 获取脚本所在目录的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) @@ -374,6 +291,10 @@ def logs(process_id): @app.route('/logfiles') def get_logfiles(): + client = get_client_from_request(request) + if not client: + return jsonify([]), 401 + cid = client['client_id'] # 获取脚本所在目录的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # 构建logfile目录的绝对路径 @@ -381,6 +302,7 @@ def get_logfiles(): log_dir = os.path.abspath(log_dir) logfiles = [] + client_pids = {pid for pid, info in training_processes.items() if info.get('client_id') == cid} if os.path.exists(log_dir): for filename in os.listdir(log_dir): if filename.endswith('.log') and filename.startswith('train_'): @@ -388,6 +310,8 @@ def get_logfiles(): try: modified_time = os.path.getmtime(file_path) formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(modified_time)) + if not any(filename.endswith(f'{pid}.log') for pid in client_pids): + continue logfiles.append({ 'filename': filename, 'modified_time': formatted_time, @@ -401,6 +325,9 @@ def get_logfiles(): @app.route('/logfile-content/') def get_logfile_content(filename): + client = get_client_from_request(request) + if not client: + return jsonify({'error': '未授权'}), 401 # 安全检查:确保文件名不包含路径遍历字符 if '..' in filename or '/' in filename or '\\' in filename: return jsonify({'error': 'Invalid filename'}), 400 @@ -411,6 +338,9 @@ def get_logfile_content(filename): log_dir = os.path.join(script_dir, '../logfile') log_dir = os.path.abspath(log_dir) log_file = os.path.join(log_dir, filename) + pid = filename.split('.')[-2].split('_')[-1] if filename.endswith('.log') else None + if not pid or pid not in training_processes or training_processes[pid].get('client_id') != client['client_id']: + return jsonify({'error': '无权限'}), 403 try: # 使用二进制模式读取文件,可以更可靠地保留原始换行符 @@ -442,6 +372,9 @@ def get_logfile_content(filename): @app.route('/delete-logfile/', methods=['DELETE']) def delete_logfile(filename): + client = get_client_from_request(request) + if not client: + return jsonify({'success': False, 'message': '未授权'}), 401 # 获取脚本所在目录的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # 构建logfile目录的绝对路径 @@ -453,6 +386,9 @@ def delete_logfile(filename): return jsonify({'success': False, 'message': '非法的文件名'}) log_file = os.path.join(log_dir, filename) + pid = filename.split('.')[-2].split('_')[-1] if filename.endswith('.log') else None + if not pid or pid not in training_processes or training_processes[pid].get('client_id') != client['client_id']: + return jsonify({'success': False, 'message': '无权限'}), 403 if os.path.exists(log_file) and os.path.isfile(log_file): try: os.remove(log_file) @@ -465,7 +401,10 @@ def delete_logfile(filename): @app.route('/stop/', methods=['POST']) def stop(process_id): - if process_id in training_processes and training_processes[process_id]['running']: + client = get_client_from_request(request) + if not client: + return jsonify({'success': False}), 401 + if process_id in training_processes and training_processes[process_id]['running'] and training_processes[process_id].get('client_id') == client['client_id']: process = training_processes[process_id]['process'] # 在Windows上使用terminate,在Unix上尝试优雅终止 try: @@ -486,7 +425,10 @@ def stop(process_id): @app.route('/delete/', methods=['POST']) def delete(process_id): - if process_id in training_processes: + client = get_client_from_request(request) + if not client: + return jsonify({'success': False}), 401 + if process_id in training_processes and training_processes[process_id].get('client_id') == client['client_id']: # 确保进程已经停止 if training_processes[process_id]['running']: # 如果进程还在运行,先停止它 @@ -552,7 +494,8 @@ def save_processes_info(): 'error': info.get('error', False), 'manually_stopped': info.get('manually_stopped', False), 'train_monitor': info.get('train_monitor', 'none'), # 保存train_monitor - 'swanlab_url': info.get('swanlab_url') # 保存swanlab_url + 'swanlab_url': info.get('swanlab_url'), + 'client_id': info.get('client_id') } with open(PROCESSES_FILE, 'w', encoding='utf-8') as f: @@ -579,6 +522,8 @@ def load_processes_info(): info['error'] = False if 'train_monitor' not in info: info['train_monitor'] = 'none' + if 'client_id' not in info: + info['client_id'] = None if info['running']: try: @@ -650,4 +595,13 @@ if __name__ == '__main__': os.remove(PID_FILE) except: pass - sys.exit(1) \ No newline at end of file + sys.exit(1) +@app.route('/api/register', methods=['POST']) +def api_register(): + data = request.json or {} + name = data.get('name') + email = data.get('email') + if not name or not email: + return jsonify({'error': '缺少参数'}), 400 + creds = register_client(name, email) + return jsonify({'client_id': creds['client_id'], 'api_key': creds['api_key']}) \ No newline at end of file From 25cf74eec1acce9ab14eebbf036280da3c868b5a Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Thu, 20 Nov 2025 15:54:08 +0800 Subject: [PATCH 18/35] update sdk --- trainer_web/static/js/services/apiClient.js | 3 -- trainer_web/templates/index.html | 41 --------------------- 2 files changed, 44 deletions(-) diff --git a/trainer_web/static/js/services/apiClient.js b/trainer_web/static/js/services/apiClient.js index c269d60..0da4516 100644 --- a/trainer_web/static/js/services/apiClient.js +++ b/trainer_web/static/js/services/apiClient.js @@ -1,10 +1,8 @@ -import { getApiKey } from './authClient.js'; const defaultTimeout = 10000; export function fetchWithTimeoutAndRetry(url, options = {}, timeout = defaultTimeout, retries = 3) { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), timeout); - const apiKey = getApiKey(); const fetchOptions = { ...options, headers: { @@ -12,7 +10,6 @@ export function fetchWithTimeoutAndRetry(url, options = {}, timeout = defaultTim 'Cache-Control': 'no-cache, no-store, must-revalidate', Pragma: 'no-cache', Expires: '0', - ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}), }, signal: controller.signal, }; diff --git a/trainer_web/templates/index.html b/trainer_web/templates/index.html index 788819b..d6eb535 100644 --- a/trainer_web/templates/index.html +++ b/trainer_web/templates/index.html @@ -11,26 +11,6 @@

MiniMind Training Lab

-
-
-
-

注册客户端

-
-
- - -
-
- - -
-
-
- -
-
-
-
@@ -291,26 +271,5 @@
- From a794898a18ea962813ba6ac5cd07fa2071232c85 Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Thu, 20 Nov 2025 15:58:31 +0800 Subject: [PATCH 19/35] update check web server health --- trainer_web/start_web_ui.sh | 47 ++++++++++++++++++++++++++++++++---- trainer_web/train_web_ui.pid | 1 - trainer_web/train_web_ui.py | 7 ++++++ 3 files changed, 49 insertions(+), 6 deletions(-) delete mode 100644 trainer_web/train_web_ui.pid diff --git a/trainer_web/start_web_ui.sh b/trainer_web/start_web_ui.sh index 1702227..633a41f 100755 --- a/trainer_web/start_web_ui.sh +++ b/trainer_web/start_web_ui.sh @@ -27,6 +27,24 @@ LOG_FILE="$LOG_DIR/web_ui_$TIMESTAMP.log" echo "启动 MiniMind Web UI 服务..." echo "日志文件: $LOG_FILE" +# 依赖预检 +python - <<'PY' +import sys +missing = [] +for m in ('flask', 'psutil'): + try: + __import__(m) + except Exception as e: + missing.append(f"{m}: {e.__class__.__name__} {e}") +if missing: + print("依赖缺失或不可用:\n" + "\n".join(missing)) + sys.exit(1) +PY +if [ $? -ne 0 ]; then + echo "启动失败:请先安装缺失依赖,例如 'pip install flask psutil'" + exit 1 +fi + # 使用nohup启动服务 nohup python -u train_web_ui.py > "$LOG_FILE" 2>&1 & @@ -45,10 +63,29 @@ for i in {1..20}; do done # 如果仍未获取到端口,回退为默认提示端口(与后端起始端口一致) -if [ -z "$PORT" ]; then - PORT=12581 +# 健康检查:验证端口响应(最多等待10秒) +if [ -n "$PORT" ]; then + for i in {1..20}; do + if curl -s "http://localhost:$PORT/healthz" | grep -q '"status": "ok"'; then + echo "服务已启动! PID: $(cat "train_web_ui.pid")" + echo "访问地址: http://localhost:$PORT" + echo "停止命令: kill $(cat "train_web_ui.pid") or bash trainer_web/stop_web_ui.sh" + exit 0 + fi + sleep 0.5 + done fi -echo "服务已启动! PID: $(cat "train_web_ui.pid")" -echo "访问地址: http://localhost:$PORT" -echo "停止命令: kill $(cat "train_web_ui.pid") or bash trainer_web/stop_web_ui.sh" +# 启动失败处理:打印日志并退出非零 +echo "服务启动失败,请查看日志" +tail -n 50 "$LOG_FILE" || true + +if [ -f "train_web_ui.pid" ]; then + pid=$(cat "train_web_ui.pid") + if ps -p "$pid" > /dev/null 2>&1; then + kill "$pid" >/dev/null 2>&1 || true + fi + rm -f "train_web_ui.pid" +fi + +exit 1 diff --git a/trainer_web/train_web_ui.pid b/trainer_web/train_web_ui.pid deleted file mode 100644 index b7ae382..0000000 --- a/trainer_web/train_web_ui.pid +++ /dev/null @@ -1 +0,0 @@ -2100766 \ No newline at end of file diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index 38f560e..725475a 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -146,6 +146,13 @@ def index(): # 传递GPU信息到前端 return render_template('index.html', has_gpu=HAS_TORCH and GPU_COUNT > 0, gpu_count=GPU_COUNT) +@app.route('/healthz') +def healthz(): + try: + return jsonify({'status': 'ok', 'gpu': GPU_COUNT, 'methods': SUPPORTED_METHODS}), 200 + except Exception as e: + return jsonify({'status': 'error', 'message': str(e)}), 500 + @app.route('/train', methods=['POST']) def train(): client = get_client_from_request(request) From a95568644b370b84e541e6efb4f12ce1ee3b9fba Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Thu, 20 Nov 2025 17:21:10 +0800 Subject: [PATCH 20/35] update import web --- trainer_web/train_web_ui.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index 725475a..8413c8b 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -56,7 +56,13 @@ PROCESSES_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'train # PID文件 PID_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'train_web_ui.pid') -from .auth import register_client, get_client_from_request +try: + from .auth import register_client, get_client_from_request +except ImportError: + import sys as _sys + import os as _os + _sys.path.append(_os.path.dirname(_os.path.abspath(__file__))) + from auth import register_client, get_client_from_request # 启动训练进程 def start_training_process(train_type, params, client_id): @@ -76,7 +82,13 @@ def start_training_process(train_type, params, client_id): gpu_num = int(params.get('gpu_num', 0)) if 'gpu_num' in params else 0 use_torchrun = HAS_TORCH and GPU_COUNT > 0 and gpu_num > 1 - from .dispatcher import build_command + try: + from .dispatcher import build_command + except ImportError: + import sys as _sys + import os as _os + _sys.path.append(_os.path.dirname(_os.path.abspath(__file__))) + from dispatcher import build_command cmd = build_command(train_type, params, gpu_num, use_torchrun) if cmd is None: return None From 102a7c0199a861965e0a3a3f1dbfa843207006ff Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Thu, 20 Nov 2025 20:47:00 +0800 Subject: [PATCH 21/35] update web ui --- trainer_web/start_web_ui.sh | 2 +- trainer_web/static/css/style.css | 626 ++++++++++++++++++++++------ trainer_web/templates/index.html | 92 ++-- trainer_web/training_processes.json | 13 - 4 files changed, 552 insertions(+), 181 deletions(-) delete mode 100644 trainer_web/training_processes.json diff --git a/trainer_web/start_web_ui.sh b/trainer_web/start_web_ui.sh index 633a41f..ef0741e 100755 --- a/trainer_web/start_web_ui.sh +++ b/trainer_web/start_web_ui.sh @@ -66,7 +66,7 @@ done # 健康检查:验证端口响应(最多等待10秒) if [ -n "$PORT" ]; then for i in {1..20}; do - if curl -s "http://localhost:$PORT/healthz" | grep -q '"status": "ok"'; then + if curl -s "http://localhost:$PORT/healthz" | grep -Eq '"status"[[:space:]]*:[[:space:]]*"ok"'; then echo "服务已启动! PID: $(cat "train_web_ui.pid")" echo "访问地址: http://localhost:$PORT" echo "停止命令: kill $(cat "train_web_ui.pid") or bash trainer_web/stop_web_ui.sh" diff --git a/trainer_web/static/css/style.css b/trainer_web/static/css/style.css index c0e6a15..c16ec39 100644 --- a/trainer_web/static/css/style.css +++ b/trainer_web/static/css/style.css @@ -1,29 +1,43 @@ :root { - --bg: #121212; - --card-bg: #2d2d2d; - --panel-bg: rgba(30, 30, 30, 0.9); - --text: #e0e0e0; - --accent: #8e24aa; - --accent-grad-start: #4a148c; - --accent-grad-end: #8e24aa; - --danger-grad-start: #ff416c; - --danger-grad-end: #ff4b2b; - --info-grad-start: #4facfe; - --info-grad-end: #00f2fe; - --success-grad-start: #11998e; - --success-grad-end: #38ef7d; - --border: #333; + --bg: #0f0f15; + --card-bg: #1a1a24; + --panel-bg: rgba(22, 22, 32, 0.95); + --text: #e2e8f0; + --text-secondary: #94a3b8; + --accent: #8b5cf6; + --accent-grad-start: #7c3aed; + --accent-grad-end: #a855f7; + --danger-grad-start: #ef4444; + --danger-grad-end: #dc2626; + --info-grad-start: #3b82f6; + --info-grad-end: #2563eb; + --success-grad-start: #10b981; + --success-grad-end: #059669; + --warning-grad-start: #f59e0b; + --warning-grad-end: #d97706; + --border: #2d3748; + --border-light: #4a5568; + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); + --radius-sm: 0.375rem; + --radius-md: 0.5rem; + --radius-lg: 0.75rem; + --radius-xl: 1rem; } body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: var(--text); - max-width: 1200px; + max-width: 1400px; margin: 0 auto; - padding: 20px; - background-color: var(--bg); + padding: 0; + background: linear-gradient(135deg, var(--bg) 0%, #1a1a2e 100%); min-height: 100vh; + background-attachment: fixed; + font-size: 14px; } /* 头部样式 */ @@ -31,95 +45,138 @@ body { display: flex; align-items: center; justify-content: center; - margin-bottom: 30px; + padding: 2rem 0; + margin-bottom: 2rem; + background: rgba(22, 22, 32, 0.8); + backdrop-filter: blur(10px); + border-bottom: 1px solid var(--border); + position: sticky; + top: 0; + z-index: 100; } .logo { - height: 60px; - margin-right: 20px; + height: 48px; + margin-right: 1rem; vertical-align: middle; + filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3)); + transition: transform 0.3s ease; +} + +.logo:hover { + transform: scale(1.05); } h1 { - color: #ffffff; - text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); - font-size: 2.5em; + color: var(--text); + font-size: 2.25rem; font-weight: 700; margin: 0; vertical-align: middle; + background: linear-gradient(135deg, var(--accent-grad-start) 0%, var(--accent-grad-end) 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-shadow: none; } .tabs { display: flex; - justify-content: space-between; - margin-bottom: 20px; - border-radius: 10px; - overflow: hidden; - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); + justify-content: center; + margin: 0 auto 2rem; + max-width: 800px; + background: var(--panel-bg); + border-radius: var(--radius-lg); + padding: 0.5rem; + box-shadow: var(--shadow-lg); + border: 1px solid var(--border); + backdrop-filter: blur(10px); } .tab { - padding: 12px 0; + padding: 0.75rem 1.5rem; cursor: pointer; - background-color: #2a2a2a; + background: transparent; border: none; - font-size: 16px; + font-size: 0.9rem; font-weight: 500; transition: all 0.3s ease; position: relative; - color: #888888; - width: 30%; + color: var(--text-secondary); text-align: center; - opacity: 0.7; + border-radius: var(--radius-md); + flex: 1; + margin: 0 0.25rem; + position: relative; + overflow: hidden; } .tab.active { - background: linear-gradient(135deg, #9c27b0 0%, #e040fb 100%); + background: linear-gradient(135deg, var(--accent-grad-start) 0%, var(--accent-grad-end) 100%); color: white; - transform: translateY(-2px); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); - opacity: 1; font-weight: 600; + box-shadow: var(--shadow-md); + transform: translateY(-1px); } -.tab:hover { - color: #aaaaaa; - opacity: 0.9; + +.tab:hover:not(.active) { + color: var(--text); + background: rgba(139, 92, 246, 0.1); transform: translateY(-1px); } .form-container { background: var(--panel-bg); - padding: 30px; - border-radius: 15px; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); - margin-bottom: 30px; - border: 1px solid #333; + padding: 2rem; + border-radius: var(--radius-xl); + box-shadow: var(--shadow-xl); + margin: 0 auto 2rem; + max-width: 1200px; + border: 1px solid var(--border); + backdrop-filter: blur(10px); } /* 参数卡片样式 */ .parameter-card { - background-color: var(--card-bg); - border-radius: 8px; - padding: 24px; - margin-bottom: 16px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); - transition: transform 0.2s ease, box-shadow 0.2s ease; - padding-left: 5%; - padding-right: 5%; - margin-top: 16px; + background: linear-gradient(135deg, var(--card-bg) 0%, rgba(26, 26, 36, 0.8) 100%); + border-radius: var(--radius-lg); + padding: 1.5rem; + margin-bottom: 1rem; + box-shadow: var(--shadow-md); + transition: all 0.3s ease; + border: 1px solid var(--border); + position: relative; + overflow: hidden; +} + +.parameter-card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 2px; + background: linear-gradient(90deg, var(--accent-grad-start) 0%, var(--accent-grad-end) 100%); + opacity: 0; + transition: opacity 0.3s ease; +} + +.parameter-card:hover::before { + opacity: 1; } .parameter-card:hover { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4); + transform: translateY(-4px); + box-shadow: var(--shadow-lg); + border-color: var(--border-light); } /* 卡片标题样式 */ .card-title { - color: #ffffff; - font-size: 18px; - font-weight: 700; - margin-top: 0; - margin-bottom: 20px; - padding-bottom: 10px; - border-bottom: 1px solid var(--accent); + color: var(--text); + font-size: 1.1rem; + font-weight: 600; + margin: 0 0 1rem 0; + padding-bottom: 0.5rem; + border-bottom: 2px solid var(--accent); width: 100%; + letter-spacing: 0.025em; } /* 提交按钮容器 */ @@ -133,17 +190,16 @@ h1 { /* 参数内容容器 - 使用flex布局替代float */ .parameter-content { width: 100%; - display: flex; - flex-wrap: wrap; - justify-content: space-between; - gap: 15px; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 1rem; + align-items: start; } .form-group { - width: 40%; /* 考虑gap间距,确保两个元素能并排 */ margin-bottom: 0; - margin-right: 5%; box-sizing: border-box; + position: relative; } /* 确保复选框组占满整行 */ @@ -157,43 +213,45 @@ h1 { } label { display: block; - margin-bottom: 5px; - color: #ffffff; + margin-bottom: 0.5rem; + color: var(--text); font-weight: 500; - font-size: 13px; - opacity: 0.8; + font-size: 0.8rem; + opacity: 0.9; text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.05em; + transition: color 0.3s ease; } -input[type="text"], input[type="number"], select { +input[type="text"], input[type="number"], select, textarea { width: 100%; - padding: 8px 12px; - border: 2px solid #444; - border-radius: 8px; + padding: 0.75rem 1rem; + border: 1px solid var(--border); + border-radius: var(--radius-md); font-size: 0.9rem; transition: all 0.3s ease; - background-color: #2a2a2a; - color: #ffffff; + background: rgba(45, 55, 72, 0.5); + color: var(--text); + font-family: inherit; + box-sizing: border-box; +} + +input[type="text"]:hover, input[type="number"]:hover, select:hover, textarea:hover { + border-color: var(--border-light); + background: rgba(45, 55, 72, 0.7); } /* 确保textarea也适应两列布局 */ textarea { - width: 100%; - padding: 8px 12px; - border: 2px solid #444; - border-radius: 8px; - font-size: 0.9rem; - transition: all 0.3s ease; - background-color: #2a2a2a; - color: #ffffff; resize: vertical; + min-height: 80px; } -input[type="text"]:focus, input[type="number"]:focus, select:focus { +input[type="text"]:focus, input[type="number"]:focus, select:focus, textarea:focus { outline: none; border-color: var(--accent); - box-shadow: 0 0 0 3px rgba(142, 36, 170, 0.2); - background-color: #333; + box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.2); + background: rgba(45, 55, 72, 0.9); + transform: translateY(-1px); } .checkbox-group { display: flex; @@ -207,36 +265,64 @@ button { background: linear-gradient(135deg, var(--accent-grad-start) 0%, var(--accent-grad-end) 100%); color: white; border: none; - padding: 12px 25px; - border-radius: 8px; - font-size: 16px; + padding: 0.75rem 1.5rem; + border-radius: var(--radius-md); + font-size: 0.9rem; font-weight: 600; cursor: pointer; transition: all 0.3s ease; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); + box-shadow: var(--shadow-md); position: relative; overflow: hidden; + letter-spacing: 0.025em; + text-transform: uppercase; + font-size: 0.8rem; } button:hover { transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); + box-shadow: var(--shadow-lg); + filter: brightness(1.1); } button:active { transform: translateY(0); + filter: brightness(0.95); +} + +.section-title { + color: var(--text); + font-size: 1.25rem; + margin-bottom: 1.5rem; + font-weight: 600; + padding-bottom: 0.5rem; + border-bottom: 2px solid var(--accent); + letter-spacing: 0.025em; } .logs-container { - background-color: #0d0d0d; + background: linear-gradient(135deg, #0f0f15 0%, #1a1a24 100%); color: var(--text); - padding: 20px; - border-radius: 10px; - max-height: 300px; + padding: 1.5rem; + border-radius: var(--radius-lg); + max-height: 400px; overflow-y: auto; - margin-top: 15px; - font-family: 'Courier New', monospace; - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.4); + margin-top: 1rem; + font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; + font-size: 0.8rem; + line-height: 1.4; + box-shadow: var(--shadow-md), inset 0 1px 0 rgba(255, 255, 255, 0.05); transition: all 0.3s ease; border: 1px solid var(--border); + position: relative; +} + +.logs-container::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 1px; + background: linear-gradient(90deg, transparent 0%, var(--accent) 50%, transparent 100%); } .logs-container:hover { @@ -298,18 +384,37 @@ button:active { } .process-item { - background: rgba(40, 40, 40, 0.9); - padding: 20px; - margin-bottom: 15px; - border-radius: 12px; - box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3); + background: linear-gradient(135deg, var(--card-bg) 0%, rgba(26, 26, 36, 0.8) 100%); + padding: 1.5rem; + margin-bottom: 1rem; + border-radius: var(--radius-lg); + box-shadow: var(--shadow-md); transition: all 0.3s ease; - border: 1px solid #555; + border: 1px solid var(--border); + position: relative; + overflow: hidden; +} + +.process-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 2px; + background: linear-gradient(90deg, var(--accent-grad-start) 0%, var(--accent-grad-end) 100%); + opacity: 0; + transition: opacity 0.3s ease; +} + +.process-item:hover::before { + opacity: 1; } .process-item:hover { - transform: translateY(-2px); - box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15); + transform: translateY(-4px); + box-shadow: var(--shadow-lg); + border-color: var(--border-light); } .process-info { display: flex; @@ -318,12 +423,13 @@ button:active { margin-bottom: 10px; } .process-status { - padding: 5px 12px; - border-radius: 20px; - font-size: 12px; - font-weight: bold; + padding: 0.375rem 0.75rem; + border-radius: var(--radius-lg); + font-size: 0.7rem; + font-weight: 600; text-transform: uppercase; - letter-spacing: 0.5px; + letter-spacing: 0.05em; + backdrop-filter: blur(10px); } .status-running { background: linear-gradient(135deg, var(--success-grad-start) 0%, var(--success-grad-end) 100%); @@ -414,24 +520,24 @@ button:active { } ::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.05); - border-radius: 10px; + background: rgba(255, 255, 255, 0.02); + border-radius: 4px; } ::-webkit-scrollbar-thumb { - background: linear-gradient(135deg, #4a148c 0%, #8e24aa 100%); - border-radius: 10px; + background: linear-gradient(135deg, var(--accent-grad-start) 0%, var(--accent-grad-end) 100%); + border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { - background: linear-gradient(135deg, #6a1b9a 0%, #ab47bc 100%); + background: linear-gradient(135deg, #6d28d9 0%, #8b5cf6 100%); } /* 添加动画效果 */ @keyframes fadeIn { from { opacity: 0; - transform: translateY(10px); + transform: translateY(20px); } to { opacity: 1; @@ -439,6 +545,64 @@ button:active { } } +@keyframes slideIn { + from { + opacity: 0; + transform: translateX(-20px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.7; + } +} + +/* 加载动画 */ +@keyframes shimmer { + 0% { + background-position: -1000px 0; + } + 100% { + background-position: 1000px 0; + } +} + +.loading-shimmer { + background: linear-gradient(90deg, transparent 0%, rgba(139, 92, 246, 0.1) 50%, transparent 100%); + background-size: 1000px 100%; + animation: shimmer 2s infinite; +} + +/* 状态指示器 */ +.status-indicator { + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + margin-right: 0.5rem; + animation: pulse 2s infinite; +} + +.status-indicator.running { + background: linear-gradient(135deg, var(--success-grad-start) 0%, var(--success-grad-end) 100%); +} + +.status-indicator.stopped { + background: linear-gradient(135deg, var(--danger-grad-start) 0%, var(--danger-grad-end) 100%); +} + +.status-indicator.pending { + background: linear-gradient(135deg, var(--warning-grad-start) 0%, var(--warning-grad-end) 100%); +} + /* 自定义确认对话框样式 */ .dialog-overlay { position: fixed; @@ -566,40 +730,238 @@ button:active { .tab-content { animation: fadeIn 0.5s ease-out; + padding: 0 1rem; +} + +/* 增强现有样式 */ +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1.5rem; + padding: 0 1rem; +} + +.section-actions { + display: flex; + gap: 0.5rem; +} + +.btn-primary, .btn-refresh { + background: linear-gradient(135deg, var(--accent-grad-start) 0%, var(--accent-grad-end) 100%); + color: white; + border: none; + padding: 0.75rem 1.5rem; + border-radius: var(--radius-md); + font-size: 0.8rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: var(--shadow-md); + letter-spacing: 0.025em; + text-transform: uppercase; + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.btn-primary:hover, .btn-refresh:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-lg); + filter: brightness(1.1); +} + +.btn-icon { + font-size: 1rem; + line-height: 1; +} + +.process-type-group { + margin-bottom: 2rem; + background: var(--panel-bg); + border-radius: var(--radius-lg); + border: 1px solid var(--border); + box-shadow: var(--shadow-md); + overflow: hidden; + backdrop-filter: blur(10px); +} + +.process-type-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1.5rem; + cursor: pointer; + user-select: none; + background: rgba(45, 55, 72, 0.3); + transition: background-color 0.3s ease; +} + +.process-type-header:hover { + background: rgba(45, 55, 72, 0.5); +} + +.process-type-title { + margin: 0; + color: var(--text); + font-size: 1.1rem; + font-weight: 600; + border-bottom: 2px solid var(--accent); + padding-bottom: 0.5rem; + flex-grow: 1; +} + +.toggle-btn { + background: none; + border: none; + color: var(--text-secondary); + font-size: 0.8rem; + cursor: pointer; + padding: 0.5rem; + border-radius: var(--radius-sm); + transition: all 0.3s ease; + margin-left: 1rem; +} + +.toggle-btn:hover { + background: rgba(139, 92, 246, 0.1); + color: var(--text); + transform: scale(1.1); +} + +.process-type-content { + max-height: none; + overflow: visible; + transition: max-height 0.3s ease-in-out; + padding: 0 1.5rem 1.5rem; +} + +/* 按钮样式增强 */ +.btn-stop, .btn-logs, .btn-swanlab, .btn-delete { + padding: 0.5rem 1rem; + font-size: 0.75rem; + border-radius: var(--radius-md); + font-weight: 500; + letter-spacing: 0.025em; + transition: all 0.3s ease; + margin-right: 0.5rem; + margin-bottom: 0.25rem; + border: none; + cursor: pointer; + display: inline-flex; + align-items: center; + gap: 0.25rem; +} + +.btn-stop:hover, .btn-logs:hover, .btn-swanlab:hover, .btn-delete:hover { + transform: translateY(-1px); + filter: brightness(1.1); +} + +.btn-stop { + background: linear-gradient(135deg, var(--danger-grad-start) 0%, var(--danger-grad-end) 100%); +} + +.btn-logs { + background: linear-gradient(135deg, var(--info-grad-start) 0%, var(--info-grad-end) 100%); +} + +.btn-swanlab { + background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%); +} + +.btn-delete { + background: linear-gradient(135deg, #dc2626 0%, #991b1b 100%); +} + +.btn-delete:disabled { + background: linear-gradient(135deg, #4b5563 0%, #374151 100%); + cursor: not-allowed; + transform: none; + filter: none; } /* 响应式设计 */ @media (max-width: 768px) { body { - padding: 10px; + padding: 0; + font-size: 13px; } .header { flex-direction: column; text-align: center; + padding: 1.5rem 1rem; + position: relative; } .logo { - height: 50px; + height: 40px; margin-right: 0; - margin-bottom: 10px; + margin-bottom: 0.5rem; } h1 { - font-size: 2em; + font-size: 1.75rem; } .tabs { flex-direction: column; + margin: 0 1rem 1.5rem; + max-width: none; } .tab { - margin-right: 0; - margin-bottom: 5px; - border-radius: 5px; + margin: 0.25rem 0; + padding: 0.75rem 1rem; + border-radius: var(--radius-md); } .form-container { - padding: 20px; + padding: 1.5rem; + margin: 0 1rem 1.5rem; + max-width: none; + } + + .parameter-content { + grid-template-columns: 1fr; + gap: 0.75rem; + } + + .process-item { + padding: 1rem; + } + + .process-info { + flex-direction: column; + align-items: flex-start; + gap: 0.5rem; + } + + .logs-container { + padding: 1rem; + max-height: 300px; + } +} + +@media (max-width: 480px) { + .header { + padding: 1rem; + } + + h1 { + font-size: 1.5rem; + } + + .form-container { + padding: 1rem; + } + + .parameter-card { + padding: 1rem; + } + + .card-title { + font-size: 1rem; } } diff --git a/trainer_web/templates/index.html b/trainer_web/templates/index.html index d6eb535..20818b2 100644 --- a/trainer_web/templates/index.html +++ b/trainer_web/templates/index.html @@ -5,6 +5,9 @@ MiniMind Training Lab + + +
@@ -27,36 +30,36 @@

基础训练参数

- - -
+ + +
- +
- +
- +
- +
- +

e00EIb7wQQF7WlKecws3Raa&;YaBerIPn;Db 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%0DIagCxjE@eO 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 +Zg!ca1*^L;=;V#4dZ`gSB&*Ynjn0$y=i`PgX zfn`Zw#jdFK-!4)scezk+`wOqB{a;%_>&^WOftB6$e0=&T=Iw1kfX0puYlzW95Hv_9 zvl?-dVT(=jtw(I`KSt^iVKyezO4L-!+}DUvY3iEE#Sw1!9J}!XYj=qZ!E9kNliFJ{ zgSFrgY_OQ9L}`g(N~lNpYD8O4h|%9q7%&3PCRDyiFOy|hjhNUjMb#IFm@aJVATdtn z9zWXMDCnHa%yr>enKN2en#kj#XiN&|rW5|OQL(Bx4det$3FH!!h@TJWtR`Gu(Y`*W zdH$02$LCD`_7AT9{tqUvUNSj3rMemsV_4tp-q|je8^_V7IMv{oeUchwSwo&&LN5{?h%d>-l^8+P=l|^$pJ(S%N7G z5n6eZbz)ZT6;`ch%_@YU%a)1D(5)r@I1!M9Tg6>_7cM|t0X@TsmCdCOOHU0(f~lT#zK4YUo_bJJ>@uL5nQ8R<)6)P0mDZ2+2ZNz)8|RS+tLLEkNm` zF3-MIU}c`0zGZ{Yy{qD!fu$z>eRHdFBN%5B6GsiES0H5pd4^hh=ZuvFU=<_2nGxy< z+D@^wIIEB+hf9yaM@79sqI6xwEuo$euTGhrJ!f+Ioax0eO+z1Uy9QQ1^1|hg zpoeaE6OMT2^*)hvvaDmDZY*O3arf4zo(;fDBt;H4vw#XB}G8fBJSy&w} zSe7fGN@VrsVrkf<^TbbN1w={Wd(wS0X6bGqA`4)K7`vN^NERZQ4`iXmYL&ECy4!u7 z&hQtPG)E`QetgE{A3rep@flaopD{jqO25aTN(mpo zkeC)aa0Nn$Os7iIDi>AY^)&EwT=MOv^#fl&Wxt<&4Y8l(w1@!VF?XGN%8z(Lg`pr(?TUSEP&J3|NyK7-RJK5ZCeX4o=552I6Ey zUC(I7S5&WFG5q^?41fPS2EYH7@~bCghr5`q4Ww6MP+W{ejpR;<-DP9u9MR6*ALsvo zb|SY)gmx};JExq+)pKyc{FFtJz1lvj^9$J(trcqoXD!w`44s~lGf3tToAmweXWo<$ zT7s{Mp~7fOZWUWtoRhT20|XJYRitSN^%ddj2!HxLSFirc`1nU=<4Z#D_r8Y399;1UNSWJcv&{A7-d5o|?AJb&UEdm5S&vVz&bvV+ zTcFkvmC*e}vQ&#=Q8&cqhm_`D(DsUIbi{b_lqOWP_goJ~jY&xA;)v+}M#y$3&49ez z$Cf)dQ;_A5mmRRu3ZbzC0~!OtHw52wY?b>7nI?0%ejig5h_MN{xPCW&y}w`{zgF6N z78+5)^@eiO-LQ3zJ~9`iHR+%-VixW{md;H@BUS^}2kflDjc0H*p}Lw7uf~MQgy!;+ z=B#t~d3{Xv`iScEjOplt*=$PCuuhWh22;U`p>&SY734N2s-+6b%m-TE5_K+W_$8#K zb8scmZDWL{QJUD&hMH+za51sGx`e-%fgRVdZEH46O=%*T5u9@vSCG4mGArr30UIu` z=~}jI%eHH=uEm&uF)hekn`OmGAx4NMS)E7ezLt;_jVo;ldfiywJ@mKuG_P}# zPj9upZC|hBQlZu?RcW~iuyn6z&?tmxnR&w`7{=Z* z_QEs>l@C;{r}myU1gZd4^jrqz)JINR&#NZm`BZs5^;}MCnz{m?0F@NCzLd*`xj;<@ zWQZhD(tc(s9ppBkv7z=gv$m!Vfw0~bzy5R#0S$qv4}`j+K0jxAbWHi(cN7PE_(r`Iikr4&Je8WlzkHT5@ICANKE}ZN!WIN;6<|nw5$jk zt(M%f+I%9{z&7as7Fl4Io#2_Xh|3n%$M;evL{AJY(KiSIYaq`oHt*tzhbAha@kBo* zOpa;Ke`NOhFI*je&vbM|^8s9d09;nm-#%op_YK9)6HIRpPoLnEW{i)45T#?Q%xj6b z0901<2)VCCxK32=9az~}&&O|&xqW~m^V+WvSM*kxyUYkG4qOkiJ#6+nit3!<`E$yX zGiFUo)!cuQ;e$sfm#93&^bU}67q|I@Y~v6oJ#v>(=01z(HMTE9obI- zD>-h^NAe=s&xP*rT97AM0KwO!DCUO{ot0Y0ZefL`qO!C~p0if02*#M?`a@zuI3&GP zu~9LtVyYG{r|9u1?aL#o7cZH;d_{F}PIZ1pb8(5k8WYA-!fb|bDw^n5l`7Wb*X}bB zGGpmy1)D{me%43TGV#h~;~7)a_^Ml;UrN#*Ni_N{5^03CrH(V2)-j$6$64e%7bvBr zl$HWdZXmagJS)iyVNhml^$T`;Ifs4A!yY^=JV;IMYNXR<5vc%=s87s14M_;0a}-)w z2uXrX7MNz2U|7BWt6nRrZ(N+~TM`rb1%>;UeJK9+>P_ny`1ZMwpZhZ_GGaH&GFfr- znS&~_iny#={LH}>Sy=vnn2y0_iN+G6rSgsumQ!zdJriEfBB!&!*(`8T1;%yDto2ku zsiI*VJ(Jil4Hc7U8GD$uNxy;crMmgdAAkc&oGr<-ob57WBZtBUT0di4r-IyftcUf! z`Sp7(0&Qr~@rZUjVS0Xsd-emiSCVaQQSR+h?(Wfl@PPiKN0g5ql07~oHxBXw%>|Fc zi=h?8Bea_G%b*~Va{Xvb0zqO-QbTHzYo(;Nay6PRA?6^-wW?lj{NAz@S!IP0YAupE zjC1z~=xXf1m6Y!rQ8EiQlLZc|b%0o-&4_mVit7AF#>f9)a`}>GI{F}>iinVvJqFu{ z^mZPR4IU)6isp&MY}>@X5kApP zBRAl>02)xxL{U`@o%X{0jLbUnUXN^Z3n@#YG5Fx|-V;O#nr;f>0(tJ(C(yO?EWwqu z9At4bkbswEyU(1JVv(euf|9(EA~`}9!POo!t&q`}aC%Pj>NV3Jo^tiw_l&;(fvXoU zsHbCmlZ0pq0SV~_UsbQwgzE(94nQ|a^w>e(W2d*tPC3MiV-}RNy5)E}ErTaG-v}&tN1E1PDK8s8`M!@MJz@dBn$LPVPlZ7GbnhpS@O+B&hG}wMQoW+ zbCB0;yBU2mL!<#|lDkmw$-dcylr&1mppg!Ek);5xA=MTOVNA1pOxMbPd6SU#7K~** zepU(p@kOCETjkxU%-fuO<|LCn7UtNlQ z8+deI;s zX7PPYHR@*wtZc96<4Ztu6d^9+YGSPzqF6jaqZVT}$@^bnAJlA(FKL2dHmjM;ro?#9 zH#w@rwx%Av#`S)n*gT-Od5H82>_&<61FR9$d!((Poq?aBp-nALcbudP$?c@*4=A^` z$#-^;UJq{!8d_T4(pc~sSQssLj2cnFn0Y%-2cEEOXN_}I zHA&RZ==GKbUC1`-5=_yhbjwZ9W%c`S+hh7ZA^K-T^N$@WS$(bZw%_hq{L(+LLb|+$ zf!t)GtP0e!@@I@(KX+FDTju(R$yYD2Q8WWA8j}F6b~;M|ORJ71IxbtwNn<&#Eib0< zbgVodN1l#bUXE){rVZ1&q3YUz-rRw6JLKEM89%3!@!i6c^Og=Lmcm*J=h*364u*~g z{hXb$Pi8DWCXw(-+hA>#n1SN&l^y)0?bB6}TMe=6qHXa&i{Pu8wyJ0^E@@BC7`}W( z@6khwhYxTEd$^rVWZ1(L88)*R1C1!2Wznu8%gcfe@l0!=gD|^8ZlTShk)YRIECY%s z(!_wMqCO%qX*5b%k_|SV)W<5AsZn2pgN5Z0{ek`QTgZ@Bty)qS1m@UCKJdq9UmHB+H=Jg6?{I9dft4=_TTvERw4f`(j>)FXM?)O}DN(mav84>Yno!pjPuP8oZVZv>29lekZ_-Sm9-++@+D;)hZv>}136g-bmSSUrVtbo> zdmDNs-U>c=+St;F>8#Uq(b6Mx(y}pFYcbX$#&!aA!f|3O# z_kn!YVka}Wyuu%yP`!M`_{V2l{qQ}LSFf48e$DjqlBTV0WY8 z>%f(gt)jq*vKuX%d1NDN8CcIn6&cr&s)Z1JS_dp0c2uuBV!Zn)ehL$`0;>G1KjR@* z_{QK{VcNi`37l3nug8`bJ;RTE;Ym;Vwl93scN~<$c4iq`M_~d^JQh!C5ekU5SZ#2m zwmK^wGj|tS6n>su7c&&%_h zkLf*mM1FXH+1tf!4Us_!WrjF|F_JD0jHDJIAdoDP7v=~?uuHAy1YCrq)55AwizLS& zuaQOrs!E6f(Ll5YdOfnu4T`~l#%0vLy?by)lcu7!6|o+p)g?N+1Y;2_rmkUnM7(-V zd+|Nh`HwWC*Z6w!fk2g{`LeyU!}h@=`g>o~_V#G(fF@>mwW$>dAxi9=LgzJE{D@ZI z`XF8dE9->uXCA@vIyS0G41pFpki`;h59~h0-hX1~0}s5X4gYtp&R$W^ruRQxp(V^N zsLy|-KHjIv9c>1AxI%4)`kHX{f;c@w>kHJ+Ao^7eu3tS*0yyg^%K`oUeaZ(9uzS12 zK@VRzyh#*JkJ1PPBd8T5noi6VGGnnW!#anx7U}Hhw0jCML^K4nX%QbVK9Uj10~9`z zH7#~pVMbHhlQU+=r_`@rGkx)r>CtPZuU;`dKB1mYXzB_d{1??7{;`ax&<3ajv@ubu zOJmu{Av1x)!tqs+bJoi_p9Rh<7&V4z8<+*9ib>JF3D87nqTsvRqott7O}cvg%n!ji zAX9Z#3LYP)jN6=QYB|pg&vVOe4u?JAao=!I3J0aITL_!EW0*PmR>_Q#n@A>}Txv?G zDQPHZDa0px^3J6dBP%6Ja>O8ZFAWRyM0NRbu8A90Af($$H{o`&?-zAfB)8Rq@|!N> zbsG88fQn_wLYcqj6qLlsyg^5qztk+BZ%oc4LBU68RcK>kqj+_+YH8Hcs?bEsELbMN zaM1{7jdD_ZUQU%4lgR5?GMp4 z(m~(B(7{0|Jm^IZdMyY2hRw1e&st_0IBhZ}!O*Iuj+Q2-_9^{jqE(s?V@zk4YfU=O#yi`g3D`UN(37?<3(j0n*g zunx&HOy)4wq*kD)NQg;Twe|R}ZN{TSL$Y-?(tQpsN+yamg5(*xIV9iTBOL7GPfpOw z3);59-)VeR2p(-G==6jzdP(T@kop3};OiOw~3judhDXO6%vA{hc0< zzW$cMqd#DV51F|kjpnr7-U(5OQI{7l9~DOVIRVZe2e7iWo{xJ+G=AfZaTQLP`;7{! zkq{zL>HO6VnmHuvV~a!bea}wxwABP-EN3sjBlvJ{?mOu>RYEhRy*i>g{u_l=3aPQx z2{tRx7-&Yv_{-;n*%{hS5^H7Q0sreCmlH$L>(krYqyOkJ#iNJV2m6GrA--SIut&n5x0fY8cN5msj}n3;gjZ z)yr2@$0y8=j+vdF(u_wm<1x)_MhHvh!+QJ%zzRwel}Q`9Y69anvQsL#f!$mv3xkwG zGcZgV%c#j1)rPA!GHPMu4Ogu&YK1GGUSkhaue3gaZ>d=D-7Bno{Jdv2>9Z)PM?*!Z z9icU})=*i)rG?|n@H7*)^7-wnWutIx<{2Bgqn9~)PUyRWzAG6z&!+Wkxxh{q*m8kE z7BMy=R=exF*ook_=>|MBEP`b0+S6mFg}ZutuWwINbTyB9i}3BIxQF#U3Us;owYP{P z{#M8Hmk>MUJ-)YS+hN71=f+DqFa=}M4T6~Nzh$KdXs+F16Sxv(flp4nG7d2IFlvQ~ z@7#Sn%z`kBF!hnER=H}G^9Igq<)Tr}s=!4ZxoRUbA810vhuDeNe`(hCb3nxb4l$O( zS$fXUbHczu-$H4iwCVG{RkpIob{^QyJr8=3{W7pqc!q^RY(YcA%ev*Paa7(iZX*+~ z%mVl*NpSO1SnqRYhIJSbRFxP*a^(5M0G5c-Mo*}d%iwG}VS07W)$wbJ;gJ5$F1>?& z%7X)n$B%G_2bjHW+|~vROH7%gWr6k`6giR?okeozn&$(kCxl2VOV*|cv?56`+FGKs zsIvqSf`BVC+(sX_yF>o?Av(Guo?Q?_gz*S%n>#W}(DZwTnplnSn8W_=fG6L6#okx{gzSIIG~dC;0v`+^C_csns>HZp z*vm&E;=UetHn!%#N^cFUe4az!nN@YXi5Q9Vn^+^n#1q7rj4a!rKYYxFi|Fi}SkIVU z95bC>-MbJ}^eujRL4E#|nFKPekl6_~?}I=y9noH$5vFHdJ5YOPbUG2ixr}14L2v&7 z<)cUBj}9>hyR_RI_(4fiX86n|rb<)@4x?Zqokoh1tKgKy%g_l18=K&xm|CCIE6iH- zVnRH>K+i5|PtFOik7$lgn7w+%Mh=rkVBKx_rX&?te6sp!TZVlrWE*isGV>#`#15RthNi7`J!f72D*MWwX7#q;0 zJH{Kn457sv8ZBxdSO`M&LM2cMT#0ZZLg5UhGxRb?Kg$^w1;e7GpA`&>oI#$kQ5d!h zVXuIPJ>{_t1PK@$klbT!0PzUE163LbCT(oLauXh}V*-nUGhQ#&7k%_{{qt)ML$?7h zpJ73N8+fF@^)K}q0xj|mfa|T#=B6GBH_UogOnXG;po&d&h`FPkS^c3@@M~A}YcRAb z)KNH#%5fVx{r|J~U)_-;SDG&TY%_Be5*mqArC20;`kU!Dy0<8>1Sy4?UR9o8&kB+FGK1~dkC;O=V9g3|fYI_UO1(brI zQ#7)YG_}TLr0RV{`M93P(lTs%uGfZO4AJNWR4GBK0zDogd)t_!Lu9rfo?YUWHKAvb zJyeQRjDhGnLUWCsy{AlMK(eW51BmsGrpbC&ChuMxUBicW&p*jnPUhKm{D^qlbKnCAN* zSp4vs`S(AveE**I`igEj!*(6PIfD1Z@R>s@cUP%@rTXW82nY;;+FCA}nzxH310(Ea z8eaq|aqJhKoh+av_WES#ys&hdYnyRlGmg8Aw~gUVqxoSe{J4m`tvzSUj#=9hY(oq+ zA0}ADpMB^53R>F#&e836VIAQd*Y1~zF(eV^gry|Pvr+~v2CWN>s?gbxEFUtchHQ^Y z4o3xFOf-M+!XL!*g>oFKjxFghxedpGK?vhlsP+9#i;^tMi811w!`cqpHaOei zgZpg9P#+_~J6ye>=^AF2XXI~QQ~ZBp%B?L1PoFaW;w8hEFUViMKtHvJbzm*A%!x*) zdeS+9b!cmm(6cE7#Ark*tTsrN;q#2BvOX3aWSIH}6{W9nJ6LEcr1P|fXaQnZ0s9#NyxGUlvg+p)(O@a zLN=n9K4tpkE9})9mRIixuBC21ozr#%eDJhQ4Z#y^O}D(j6a~r{LICG1ZQJ6SCEnTI zlj4^RQlbI zBIM?C#n=m@R=@UrymFrcB+4TuVwP~a6yDduahr3}XpU>)%|LijDGqYQ$Y@GsFr@fO z9V046Q~(_`I@apjM*VU@F)dbt8s!p39#2Vt|14)j0$<6nF> ze%9NOj}RtB{+qA*@H3+P3*Ny$d~D-A;Ltsv;ckMDk~_w;Y#7eco6O!Zpk0}tuD^@v z2?0Y8lOBU6qKQHE*R7CR28D|X8x(EOG+uGhDNZ}#q!nH*;D>qS)jaZQ7C2uxmQ73N z+hpi{YvJIx+;rTxLL5JO!jl=WLW#oYj9h0_#;{f991b#`4h=7cif02jECUAx>}0~& zLLbz;d8ru@R<8x$5ic(}*PFW2x zChO~ufNhqv%LTSsV!ICS-P&;VbNZB#NDQ73JkElx8=B>U#pMO<`33&;9RKcw>fJHf zvqSX3F0!|cOh(9{Ox}M85+j;4NGPpPxj}1%Rv9MCv00AOIe`pBqfwZmz))gTfr*;v z193hlzrG@CYRr6w^*%9ff8i00G2m@WS6`!Ihp(?_O}6%lbhe{uYPzn)+79o-CucwB zMaK5-nEjVuv-SK>WZPe}Ps=%KgqBe3!> ztCIe8Q~4@IEj1*uk3UVapy(q(0^SR5wPzWFYRX{i3EPLyx%_cTySS!lx=;4eRw4lF z1F>oFwxMeln9QKE3=xG75$gl4a|HK55r9e|MULK@q7U{k&z_)O9HEX5iF>=4tRnP2 zDXO1>C0eu*jF)7TDGn3Bv>x5I{R)92I8Stz(6)rd0)KgpJ3ga(^_KSCdzv@zSRS9U zxVm7myvFnSmz7%SB&!+>Da!#_k;rk*TH3nlfwQnSOZ%LG6{4ecEf;mo&C z4;~kM|Ck~YeN0VGh?~XxUH<|98y{F#BS_NIM=#(7-$835*Vb{}>zs7 zB#`2sSHMtwfFtlRe$qd)e!9hoko*64I#P1$t4|A|#E;L5pV1Y5pHchW`gjedY=A2& zO>sAAF)Ku6E%D*QWQyW zX)By}DKh=-(s8`(I9+x$Z3nLFfzaQ&Z`6HP-iGlkE7?`-zm7ei0!HceUS%1R!mwRv zo(>EzhQiZf;8_(pEMYf?tt>5_4s=8tk1`I717njB+!|CNjgNryk!9yOZ#quv$Z0Js zn#Al#Y{Ab9SXoJZl-A^V!C*KdFA9`a__m>)&uC^d>gy}oW=UsTYz%8Rv(Itq!4Yw` zrL`?_u^`Upxbt(C$M4C1+$Y=LK_Bj8cDK>f31(2C@&aWtB+t-gfhu#9(&${!%Aj?I z(K%LfJQ-k6qRBL5RY{hY7!=W3!qpY#Lob)i|g|cJl;jR#)E6II)RMD z#H8}x(>agxab<<}Nzb2%q8tpE9vm`$@-@ZoSNQ4)ogLBH3>UzMko*r)mexRLR6p6+_08Ek@hh3`QfevcNgVa5T$rnJ!fJDDhq_TE1%|+PKio6h}S~$vjgU69@(J9V5#Yw9;Yc$u+Ftfta zL1QCJm-dBEhL6`avb3pCCanIS-PnIGmYu5uY=JrrY_=wZjF~mqh2km`e#ipTEHKF; z<18{XP-#V>C7D5HIhDzoWH8NOJA>^4whGeE^5kWZniU7Kk`gr=rnm8S-xzKh;HbDE zwZt3Y)6ex?iNC_>W|KMb_b0}GR%v-VmT2|qjW8_~ zy9MkNa9CRQioi}DnC2ldR7^6h&HF^49z98t#^94@RFo9)5=p*Q*0AV=(>Cya*>Svd zT-FiiT8Ird-d>-_d5RH2j5y~BJ|YNJIbgcI&2T)%D8V-k-F(L4_=MT%3A2lHX3aGV zZ>d>Zr+>Da#WP=A)3i0_@)Z5!06iLDCKJr|7WwuT#r8Jk);7gti+pPfv$K^J7Ij9J zgO7>~h3j`uVyb~512QzZHmIq>TZf)qq2Inmotz-kF>-y4v@OwxUwl4&2t=FYTxxBy z+uIt1xb7DspVq!wL>LZ-Om?3#efICj^bfT85uG2gbQ!Ia#8&ZPy@+z#sP=}7`Ut4} zHi4DV<8k=C0zN%b8iiE|un>@bg*65txQMfsE;{lksC>wH=aBmHl=|v|>(*gI{N&7) zKmt!BM3nE797Wb3c!)d*up(NcstU8ajXBsQJKQ7N-o^|@h{`a4BcNlVUP^GNU@@*k zFI)7iMqMw77uST-bGrA(bjK$&@7}X`|DO8llJ@EfH=pC`8eiA=rX_SXd8iORdrML+ zioz6(2NSk-_SoJ#V6?SOF{nVna=CyQX_pIBA3^&6m%OAJk4%-=#*e+L8IM!FC-fgMrdgQD&P zt0FTMIZ-h&Q#52sk!eMy44KI(vYax@8J9WRWyV33aWpg>4Rwlp){#RK7>FZRElM>I zm;JT9(*D@qh-G83YU5NWx$$O^n<4rqMG^7mG~V%k0OsdZbn@T2-#&y)RzHXzTzRsV zqI^nt<@W1td?&Y~p5?>Sa&K(*&z-yektc}!^n1Ven8w?Ge+yKR8{d?*3`lLVRC?1{ zQ8y;ETCL(#65tXue8_My(Dx6grUgV2a+5fUSL^h_~rZq7tfWHC>l+-Dysm$Vp?lY9e*F zl5upm7Xu#T2q=_Ni0HmKPC*Lsfy_= zH=MtD!^!(ssM!U<)~sgg&vo-a2#&6EDAys&1#)FjCnxB#L{}yGXv|=Hhr#w9!>7-v zo*j`tIUw@^?IW7R&NkNL3y;^Hs53-o7&43~vZzs}#1F@?w@bFai`m^mjYmkHrLo2T z(zAI}=X-iK*F7nGpSr3Mr7>B-^xy?sPya}H@b5I)a~i)*+ZHUWqIIOSvfi~`?!3zz zX#ZCLt~??;550{ZftBA6it^!?@ixGcBF+2?>L+?3_<*w=o$J7XQ5A!&L#8{&)aUPM z&u2;7`HA2C3Se1%BO8XN@_>V>XpJrlvgw$7drCf?Pz(kblOZt~>FL;^d`oZ^u@=>J z=%zs}8svHbm)H2S3%a-OS^n@N%hzvM{O|*_H?OH@*R=JLU@am3#tKOhlv0$YWHOkr zxA%noCr{Zuc*0;jMzo@JEx`w7N+)e_jGxq*e-)jb>73jYD6I(+>0Hv`Iv*Zz683$8 z2%QVe+sI`LS2knmQgTr4`{=0HOGJW8D~SCPivXEGrf=V?F$y7ST*&A`P8$oF08KD7 zUNiSOGn;Ygg!hf&$6EO7Jn~=HjvrP_RYhDf%MoRT(Bw^zwjD0dpFhpl)Y{slpoVAgQ*0Qk4|Lg`-@ec-o zC25nw=p3W7G&)C*bsa7|T#^jLRKK=Kb{t$srZkhmko~b;Dz;qU69lC9hVTm4= z_&kHWK#CHhD~!s?M5EF8tboyod^#bUOwglYlI|;c_;LJSbV{_&D2G#~hhH&1{1bZX z4=mLlwj0r+X}!?;c*CNPvcZPD%~X*`RO1m?dE9=%Xz;6^>tm0qhMvJfGFbKCtfvi$ zs_UbsP*bw4FBl!p*`A-XsQ-rZH7@+?4(UT4UQr5@7Zig5Rar4KIRh_f?}#d5+Zw4C z#KjC>H^jPyy1_4M{JbV!&2Sf2*ppN0H*cAL{{xG+Z&|#5N4=cmoK0RfzZFoWU;RwS zEu*T2>~8IIxc`(Vhfmqxd%|>U3#AlwTjQ=QuIp%)OBTyHZC8I%SAK&qGzF7t!gx4A z=NUFSt{2x_FRxkD4{Z#bfQlFbork$qES%7IjSD@iD#Vn_yP{^_r~8sSI}wE=ixESh zjDZQg;b}}Oz)kQhyyDyne`tko$MDTa_|I$2t3}ECh2pX?Sl8e}MhGoFT4L}U088NK ztUD8Rrh_jKl5#~$9Sq&#Oys0BU%r&n^!mB~xX(8R#KbWgDN-K%par+#oOS?X87z!bED!1j}l9NhSDw;iS|a$eYg8uW5w~d-PY>KL8as~m(e=I+zQt=GVdInYq{~g z2|OfQMI)3tV^~xSiUEjVonv0lsBNT;54hkFJ+7;%7mDTV3Rf@DJ}@duc6RnC#uEmI z4YIp~-QD4OR5AZ<#PaQH?9~~uUSMsvQMdheuHOiF=cunQarFY%wsf-@&G|XQ^E2|p zJ+i$WWIBRTmG(i23@X%cfF4cAhGWWVjM0VwXfkYG(NqJnszP#;m~g+5t*C}7Oa~zQq>LScU2}6f=7Jk!GV?G<8k;W&b_}PjOW(s zqO5NI~ntCy3IlE$cb;;Gm8CO^5 zEao%1t|fdT<5~rjV%Vw19PK_~XLlc6WGrpX`!j?0mZqs6kb1n?L^yn~w9eA{4BIDX z#7#}a--~{c+xS&_Obx#l2ekdn?Fp)-iiUxPk%k>39At1*D83vReq1VEFNF8YoQ2ga zY)g_F(X=OhK6Nszh9PffD zF-a&wykVonn!3ZS6l39+UgV zwj+4gM~KExbX0zg1>FY#6+!C0S2pX2 zT0o0nl%Pe(lp@!PTxm*Us4~MKGi>FWz0$B>X`T(>S!H=r1r7?&b{-g-NU2k#t6FOZ zSIm)37D>Dx8@>a+Zcb0@YhNXwl^7H*C|Vz>eWddaA6LFy4?o6dq8McbyTb|7@ivIi zb}c3bVsO}CAN0REXQ`Vd^Xm)d7iZKL7jW2+AymU5c6&lT9gyvg$R;`2lPSfUL&}qP zaCJ$xSP+{Qx~@0;vqa~J&ZYDj?+M-$KEnzx#)$Kd;2rV&1n+Dz^}V_vf4fb#vxS}v zQ9YOX z!f1#d4XCD5rdvB4?CkSm=YW^fJ@!mR=>mQ>r=4BV%x7GkpKx(@!u91jO}$8<$|qv) zC=>%-us7P~#gk_o937!D!_{(zbC%isic3iz01toVrU+yg0@kOro_H6ai19X75!Z{$ zH{G!MpbFw9TBhs$2`qxfAc#aV149Md2KIB!i_-9ZnDcg&^S;Ts=nR*g=BmrN?i};Z zvg|C4_v^iOk=h3u2Y%hW-*L6SMGX(X;em7&-P|94Z}Dx$(i>W9SS*E$On8&QNJmCG zncohLFv)~zu9)P8-Lhb}h-~Gat=uy;j!LKIDVOB$Qm8;Ci9sad60>Cm48V;uU+m>% z!QVOsQ8rWG?i=rKUt=GrLO*c}x(O1lVEmiQKYk*bcU<3YH<9EkP~!H2-On`%mcKi% zew+amWy9t|?%L_z04aI}tjHbH*_-H?8##}t54Ax(B`A1>Mbkx1LzY%ngQ4+?+C>&F za@7USo4|P!xoAD-ZQ!ztTz0~>Q!Kn<>0xOjOY5nvr*-Zh1XX@3Mb&Lv;FU*^k`%%&$aPcHFwlb$ddAX^pe4v1Shax_IBA5y%3k2*UeT+fi} zIWk`&bxm9@34PsXn-PoCrR zT^a^-QRo8Lki7dgC$crmNq(hZ$|J(_2&_DApXR=b>sh%E5soPxD4>!&SF#iyAQ7!{ z%F2-K8n(V#(m7!fk#gQro?ek>$LRN0gs#P1U(&umW^r=N)$u## zm*=$g0^2rtX9?C3It!h}w=KSF)6c`_drUNtn~c01QcS1hJ3C~1yU6Yq>}?~vTbS($ zqwO7bws$!iZS%64@LZQn79HXAoa^&*mRA>CynoB_n^&BlzGFF`rHJfLcugCnm<-1} zdGeGmzxkHKXHSVrI5|JzdO73x{1~G&Hil2q7latG0jy7^jj5Qu>veReFlM6=mXFMV zJxe9_a+S@FONbaEMj+RbQWO)d*~<(s%7QCfF!MRr)^P1K3!Aa98A}&wT;SS9F1x^K z8+qSEj_bfx8)$5bG+ad(ug!N^C3^gpQ-2=Y)k48XdWm*qcU1G9_f9 zC`?9`WeoD1Ntv--W$ctC`<3Fb(i~L6ei_*>0#oIgD96ZHv{*!JN*7uISu3qih{>DB z(|1YXW>svXXFyv$4%Ezv3 z`5ASpeB?Dm?tjjv`RuBFSDT2-t^8yS%Jiu|{j=AgtgQDo8W!HL2!<#WYupj4;X-qb#Ofdq&1H(2k+D478e^W2GIy>PkA8@|4%Xn)Wvo)oilys9JT~%VYbKKJ@adw2hyhL4IW3CruS2N7j z9DThYUR>fYuCQ0vw3k;jmzOkG*R=B)o$YX+=|V#Uthe~3$JrKjd5J1g46|ezD$6lN zK~Yu=h7)A}fb8&y!Si$C;UQ`;Kmof-V4S@f1=p`7GLaR zWkl;uKSsthPDWXeiR$+jboRKdftA7Iad-q)ZVjzbZYE|C0*V+l5)~>45)DyjP-SF? zE#ua)vs}`C|9_|#bA0%GM-$~Es>M88 zoTbTNc>0dAtk7B`!F>|ejE_PWggPjips`UAaD4-$)~kkhO-92eb0yx_pr&Rzz2$Jr zOkth=(RbHM2}Xoc6eHcSlQpy_>d`$uH);c1`M{)h?QpCTsG{=z(X9WX9|h=w&;-S~HJo&s zvrh4L32&Bx_Y2Rvh2>X2M<}>=(jrF60jxpT?fy^rJV>pk9`5AXQ%Y`&V@>>;i|v`=$JlbO6Q7>pV3?lFD(l=0Csv{q#E zIg@72aB)d7yQK3LAH#!=1D&&6&#pL;*Ss5VQ;sKu;Sf8@S&kIlWP}?`@Y4!!w~0-S zUN&TP!(hIoxL%T7FOiE&!s!L>{DS8Al=}TK%i|Lk$H&OkCDcoN@SkP<7h}XnPizBN zi?l19szQ`TYfWo1Y*wP)pQ7KMQ668C9UT#;Q%q41XV=KdC2HQFZAgILXS`*3#b9fn z@zI~D4*p0S9MSclO6L_WCh2XAtMONQmT9~-`~GUnn@85lLv8~DRFB8upK#&+%K?** zJV)-%&6_%OA*!BgjK&6q1eFZWREk?Gr;+N&vQy8QU7q2crC!l1Kf^Lhe1N9KpI>5w zqPbiUY{&BYn%U_ov(po1vrA^nE0(_D^L0)6*fB`SKAFiVii&D$i@}p844yxue0oIo z>?O`@q(>yzhU%;FDbUSk;NR-&dJ6jOj)9p=`#QxehU#=4|PaU$&FWpm|Qi| zJ$1XdkEF@ja|c}EK1oHq`762Il(8WlP`wGNQJzd3mFnYD9i8n6UiV`}B(jQ3{d=l-`H6-meg=d1s*${h?r{f{poe1c zmKFtcAQqHIOr$6k<3YymLU`WfeAQ*V9KzSZ(_%TIWm^oDXha+$H-0M-mm*SQ=u_Mh z=prlqwxmd1wR&VTk>GaMB^$mhw+JyCbHaV{oOoB&#z%g~hfUdfqS3MIV0V|)T z2<<_YxT%;}Ay6yFmyeG~AG314Px5m&Hu{!73b!BAv68i&;cEO9K*hKQQRAI|5_{%E z#H2=_JTWNH#Hdqq>=iSsxac&m8^x=o@VbWYuPr~!Ja6Y6r;C>Bx@BowytnB-{!L5z z?m`WB&t&|`vo4}gVla8muqc@nIeVq%NvSv}h36GKts;j-WUq*9Wu8$MsZ=0W9xVa2 zGA$>h`1PLgXYlDxxbs#5HxaY9uD^SXpW{8WtJ~g2d_*I-@;XYpkJ5vk4}a7(Laq&i z$&}&#A=T3(iYJF?t%-{{gV_bu#R{bA{&ipyB2$ONti9cx?8cxpIuEXntV8A za`-i)!#|O2eTmDqXnpcku|D1e6Wsd4UfjB2OdcN@EWd}XdIVM;x7%~|I|F_2}4EFXY4-crG9#KAfia9($9qqy4E^c?5usub_ zlRk1UL-$~T?KgtllTmBgeq>+5fr{`x&I?aXEY`cuo7$mBjYFDxLfLNK1 zt^k%bA*FB7RvLM^)7Y*SvTql$w>v)}qI<*C*k_hUStZnTpfp1?)0j*Z_lk^zGUMsM z@TAiGXO;1KsW@$gc_&y8-baED#1M(TPty4Sxm85b2@L30a_-Np`CRU%|AqnX267fd zp!FWtI%c)ybZL1tt9Ujt{5Tfgj)kuViWjBkATyLY$%`V%@5Tp1@EQpU9StV7WOxb* zSDM#Um%STX+7Mm*V& zR>V&Ju*0(Z|W%F?Kh*$DDiz!4bXuQh^k`u)c#1NGsps_*Ic*SL> zIB8U3p3NiQ&mFH9p4YRMlO9lUuETrVo0R@ud{Q=ps5iY*R!GDO_}KK160}lOnPHe` z><$a|2L*do&QYm&Rz;pvfv06}Jevh3#!+aGmSh>6Ad7Sl#+dxK0*)9Rf?xBD;I@;M zkK6(T?*lXA#&b3iOm*klyMK6+HPC5;qVa*ogN>gCVl#P8HJmVb_Kf_C=g7;axPyIy zQuxIHwYVg|Jf*rk#n^_CiIoL!!>XqTV-xQS9^qY>jTzF_-5{wLM{`XBgjzu@ZW4s)RP zOD@MH&166rjnLHqX_oK_q)9Ho(!*&BZ))LnZP>~)a$^{nBn6TWz>kf>`p$uho2!uV zLz%$l^EXmfZ<&V5x-4@2Hvz==&7JBc8j4&L8civNi81VDhUb;xZ7ZC%aODK+GrV8P z-vsdrf=v!AQF_BnLme^}UbC=@xsBA;6TOA7@@M%yGHK?-r`}pBp0=L;xw{gtGZfc$G zuNlR)g~s22s}FYMwV{}7F+6%o_05;aH!o;k9x~tFMwH-}1AH^b%r2?s*A#6{cj2)Q zSVu+@+hP$tr}Y);~W!~1bO^x@TUnY>!8Cf}I``Q0s>*fE&@ag}8!4Xc4XuZOEa6WnI#r|eo zOMl``t^EkHJOV3^+wXdd_h@ieDM2Z6BJ{w@icYO1Lz@v8!asX%jZj&7KBV^6y=a=cZcd=pYmXjd^{o_kI05Y z)Od&*k5Q8`j7KmX6Su~=$q2tS#%+xWg8|BvfazD(Jl54LF3xeUUlIQL7cT$nKRN#X zJKi6^<$5`z4fd1U9I7m%+TUmT?Ke#SxRF~)ChE@LZx-1h-m_Y{ zZtzw{wDdk5YQ1{7vS=J?p(uob((Gi0=T*j~&A9YAvtY1MLC8=sq9aKr7!58$8x_lt zF$*PUHs`o8ysP2e(s8=9bZv{ba^sl)*{|XK+)~utoP^*Zba-F0u$tvkxSR#v7|%#q zM%pt}fl>>($uOowWhGgbQREflB4@WWJSl~vLF7f|KwGx8r8F&CbwGzi+k+_%yt;j% zh`(vXHZDG`J{;uY?S5>1y~cQ3{)9V{JJb4E+5lGieZ}rV6QaQdO&b)~QE_VFw2r)8 zc-}8Pr;X>L@yx7c=>naPG$Da7jTh=3WSP6j!UY-|2+nUXGB#NmzlTjWfRzF$K^3T? zpel2QWyX_Ab6CNC?%B;6c1+Dww~Vx7U;>qnRN65xj!Fvy?HTI8KnE%vC?%4~4fpE< zenMPTPBHml#hYgcw@6Cdw*Vgb5LAJmFrStWF1wAtPvD*PnuSxGw~F%)F1twU;sdL2 zB$=M>?lAb`CE3?6i7%g0AMIf$BSaLT>9Admnq5&`Uy)y(qnqV}0xR?*a06WW2AQ4V z-Wcru4udB<=z}R7j4`8%JkJsQ%@LL)Ip$q>mD3`+E5$l!1fnJr4vF4Sv3$yS}2kykha@9rHKuSR5bIc6E~BeWn@_+bC!PXJmFa8&k7ym)A^9_v}V?&Ph3K!C1a|p4Y17h+)i(w<{?*4^`U)`|y zxIH+qQam1qe?rIpS(P7~2|?>>G|~NKWd)du)#RgR$jp$zFypOS5FVa7vLRS=EF z8-q6*YcyS%W2+KBDsjUcpBoUhwo3E_d{@(6U%;EUT>aPIX#U^-&DnqbCueVe;9_yX z+;`Yd{rQX`AC1}m!ynlGpZ`wv?|;O9am4lZl$aSTjy6{`rC~81;HMMxbc^ir0^7C^ zZm8>GWN9O3P2k5x;BXE*g<)(m24bkR#;j&t*;v31H>{NS4^GOfJ9lk5DYqNNTdVKV z%T!`O!iUS55>pE@F;HpYAlG!UprgV{36k}(unMEHK2k9wAhf|y`-}@$@V3eMacTHr z4u73FzPq*@&oq}yq3+_1YwB;_-(h`rR-+BjrH^eR(M8(MWAR)`ObKlC9vx(e>cDtR zuF1=S(Ll2|C^#DBylfTkUF1ACUR0LD*f7mnGHDT7P#uJ>mwfd;Sz>RZLN@78s}^)a zqPDVPfICU8_W=vsur+R7Qt|84-hv8B3pWs2{K_LI^hS!lSAB(57WXY{;@{J1YHvPE2@H^YfG!72M-@-T zCC^7WUyl`E4hK& zv;hwPVC{Gx7`Z7)`vBzZ-$V$Ch1HxihSxQ`t>LUqOv{I4tcX$+(xY!ZuIeERLyf`Ia%xUYI=x zA}dOY;fTS`9^t4K46}_fHF9C25f0(D_sT8lk!%(KoBw+S^rXj3zzCE$ zB7q<=QP@?E64fudhoodsNw4pt!g}GrMfOV1ehE)X;joN6ErnMD&AVB~>7roS35^pv zzltnOo)S0d7V+~(t3PO&!tI~;bc$qA8*v{4Wt1STLbt+Y6S=58$F<{qWq7wxydJ^J zf$(yW@w9|#rWu)xQgvv$)EowbM2pZNvkB0IPDDY8^v*xl6+n-Ja6Zgck_5ixGS^3cMVobgrGuGtiz~ zc~lHY@WkMV&VjSZGb4r%Oi;oG(s-X8Zesjy$_MU0D{Fi){(UE^TL!hOg$B8O*~!M~ zk3k4gv+$bJR`aS>{J8MEt0R|PVn02UO`a%?DGI9X9jd2KC|PfZ8{agjwxc{bp}4rDxw^zI=IOXU;7II%WpIRUiM~8Tj^88i56RDu$Padq$qX!W=d#@7BbmS?Y-9lv7Pxd+$l{xc?v&ow|&L?J4r`zWn3SxzuJ7{X$#Wn5w z6RzI8<^0VXF3(R{)(g5m&*W3`5tJy((U|GcQ>M?KQym?`_JpP=Xp~R~M=JrZA(RHj z1K6G>VC8s9cXfqbE_hhQb22Ket>dh5yjnQ+%bdePbC740V#q|Jl)o3?kiNN%+)f+0 zTZrG9xZ@2-x&~wJ17%j#kMu2W{4iB0ZumjS+StY3AU)!fj6o~VaotU)*YRXZ7$~Te zXQ&igTG%!4q=>wzB0pA&*E7R;9l2~GvrcG3pbN=m--XzlwZ`6WAZ}2mKlb=*-vU3K zKJrt4XCXAiAUGFs)=_s2S53)9VK`kF-p&<2RKm+4d@+QhN^?-aR;DPFrVver!C=v3 z=xETfLB$T;M`lZ(CUj#ldw02e(=%ej+hOxMi}yqeuR)fTaqLFCYmE2YdGP_pLqT!l zWfbF`{~{YnN*e~CVV$aVH_K{c4N}Dqz#_S)u@8NRoMN6+#B>ZjsDh!58Ffhewa+-S znzK&xriRxG&-*&?Zs|CwJI?EltGZ*+bXfb3coh8>*eSO-7$1JVRl<{i66u*kf)VhdO#Iz)V;6~-Hn zqSdezVgd@|9dIPxN_C32$rl^Xi5vINU8&CpcZGZ;nd;6QvKjXsdjuu~MHe;KPV>H1 z{IC>$TqZA`S?B3|e6R!)r8QYmP;5;p_V>w-4q$&5yEVoROI&7p7M;NW(pgk%Dc(M( zdi$38{abuf|vgtr%1l`OY@^-VWuPeHQQDvV8ZJ`uv=3Hp6!v z!8u~^1Rs9&jE~-c$r{2+q7Z zwf#h8=1r+7D3f8zf^0M*pNuIcQ?ki~YHy$F@CntE1B!z^%&V~XxkynCI0e?`s9rH$uUYBa=Zp%KplsIhd>6O15Lftilc`@0lJPZ*w_<1Q|-*VnY(;^RX> zK>fYr9rLE;mCl)F!hRk&EHopPQz=I-n>i5SHfu%hG^~H8<@Ednn8JP1j2lp8lPP29 zS3K`l_R^DoSHMc_B@A)XP@;d87$69F6t;CF&tM4b>BtvFLXp>=6EIRax~s*7$2(GTgj3{ZroNjy<=|`!5jZqsk`q* zZb$mu9e~%y#A+i+FM)$$-Ea#oXgr$68*0>iySwRv&M7P zdgj)%>>RaoSnGT5vfq>O>}HbBYQKrhMhjXCnHDOe7#Lw_6vIrVM_c&xv*7q z>{X8aG69c!MPw@vZ0W!dPwqVu`m{9Z(zPC3@~!rkPaJ20?pfGQu1 z41Y%r7k^G|5bs>F{Wmdc+K@5xhIh5$ySeaxt^?oC9LKd|W&yxPAQ^FlDsHFwlhV!K>6hh25;U_zj;k}b(zv-KEX)rBh<~3#pMOn z=?R1LOY-Xly0-YjVHAjSL~9Ao;+)@TsFTDlh{6ddl{^St6xxu?i$w%c9+e4F8T4d? zLNJ4p;qHX|`4a}0m$b(xG-s!D7Z+>UP=L4 z$EfAs7qF5)9*4*6b_EFyrOMNRM?`#7*X=$X=h5rbKQDT5*T)|6s*n{0QRd~c6@ zcZX~;CYwyirc=ylgc=Wt!wOdxxH3=j9*OwqlO~q5>gI@830O(egwQhvR1B!-&>^B7 z=w%I83*6Zi&B-Z?^K+Jq8P?lR?wTP8c~&w#dd~JAzGd?5AISE1@kK`KEwyW?MNyL& zI4D7vH^54EIVYZ+(Vd*qoSx#Ev_kZ7YHkl$I@fVs*SyLjPb$S11I1yUvz-M7QBaan zI%3~IuNWtC52EsO*7f7xxx;Tox^i2izuI-Up_AVxE%YX=D)t7fDdShvhEa@2AMKl7 zCyx2_&yuw?d)52T{7e;uK38PFg&JEK%W0Yk~ii~MtQo>1AFv>DU zI%i@mQ{$Lqfvp^-S~1o_VIoHNAQ}$nAa)R%9yklBGucefzRy!+6IkhYji93REprkE z$(_}{Upzka>;=6xlZ_Z6MmCg9F@6|EwD}p7+@$ubTxsRbj_N@b4PLN8XuVL!$kIaX zBMV0Y44rV*DK0Hs*}z2`Id2^oUF52ZT-#(eJMUs|N*k~t;Cx7usSq|m#ovqh?8j+7E9 zLrgAFVI>M)0g36D$2DS-uK8P1o&HyT^UTDL%ZTGoG+yyzfcQ_1?edX@7XjIbnT{CR zkTbJ6uWQ9$=aK)scD!0xE?P(D9sU7jdCC|}RbeI*%+>@o9TNu?p~!Jsa1seUD4{Xv zVTsuplRrD8dhwLuk4G%uzQHaQYl+Omf-4bgTblWdx(73gt2z0iMVCbaM4U(YfP^If zA*>`X=>!J?t~W^YDxg%Kwx@aqm5(SqN`om4CYG37qsA54_5{-$P<;7<;cSkZ&v0j# zwC|2--@T`K`<~|PjCOX7T`sV8WuyDJJ$Nlyj+pGdU~=#!gRLVl6)r?E%qf-hu{TgE!I0s5KOs6H9cUm zbHMfKG1j)&M`Yyz%S^#2O_>iUha-xe?UeBI>}vkJ9@PfEVx*`^UsPRxzT3M|p=Ppu2#Y*TlkIK4Poulb{r{X{W>ZoWVvm{hCY<*Z z2>JvUQAh}&BC={Sl}cYnN%D#qQ8AK5j}}j%15rhSfmjFujVGgvLK8L1pqP8Zl~tT~ zn$uQs)+yfC!rMCXcIkP)u$^5HoDZn7fR3wc`7E;JcaUxbB#Ds|1(uVCPPZNsAey0eUn*1|=cS30f26##bs5 z@k$Z%42Bii-ZsV2A=T3-WdGj?eQ|;7x=(V2d1vYBCH2)M-T5W{YKANt)UZTFjfx%> zKu1Bxlx8O(rnxUh0)itDmEgo9s|fWTSdjoa1T+zEgisoy5lqO@;{iH?LBM09r++uq86{FqfWW!y8WH=YF zSbR_fuQvddoAFqF3yt36_6V#zZvWh3enX|+r;G$v3Wn%~;Gm^LltmCKHN=b#7$1De z*4Z)6dAiGaui}5)eleh6at6Z*)1zk$pFL&x#S6+8N950sFi-Z0(-90SD2qNj6+#I3 z5OFbL1)PG8Ko>mD1zbn~N-`&vWMZomO&67%3Ur7V7ckDDeMFWW@%$41{)Fbu8)B6h)t$aNDqTf%8uvh*1)LR>>xuJ>W!Uir`8o4S9g zN!q4oOCU8Fo{uXt#7B_CGLVqGeGrAHoAE-{V@2}g(J`QJ$uA@s;YuJ#Ac`a4@RHL7 zLmh-g&|Evi`&RS1*8DIJ{Po)Mx2ufzbHmwExUTyyH2xk|@HbmI|IyAY0xk%_wRD|g zA)0f^(W*e{0&Oa?Y(P~F*cz1Vj|#pR8@>&iYY|?k$dU2vhK@ov=%{ZbSivR6ObBac z(!Cv_;zMf;r4h-qbUwF=I$E@pUtfTWD z9|9q+5{p)g;2-n2_$^%9@(+HNO;BZs%Ey>;$j*4ci)qOhOL62wE#lkz=X~U6!ak!|T;?Ow!KK zOZ5`a5{O!%$0LfveTFYyFxcIrJw5wmz)Fk}-!`<@SJbCx3{KA}&##GPj*Lr`j{T7n zL?n&6v5(jF$;gxlK?$N#lzLn-H>GFh#fT0mMKNdyO5sr$Q3+_)8tLmS+1n<6dO$w^ zlIrAw(W|#~KfY%9m+zQ={{yqPZWJUS8ayiGnJEr^L70d5`pgumvF6POw@e@ykMNu(+@|5j=`!l0&zs5X&f}f7)a!sqD z2`F3*v+c_8lQ>NR?DcnmlfsjXqr<+zYy zR+SiJ)v!giZk9I}|9_6A{-KWe=DU`SW!8IrTVeu9)Y`E$rU=`0Ya9^?C_<8Ytbti> zR(ZrH6h|eX1{H}aG9WSrY>ad9r#@3oiq5d(hh$zgl%2#3-E)4*jdoHm-XMsd+9&RgMa4Nt4c zehwooRHDeyWMpKqz{G%#3KcyMGKS)MjA%F??#p>RBk{rP$mt0;?})nOamY>YC_cbUO4BF`&EgM#TG^#s0}c>XX7yck#x@{WONDWt(jgYq>hG>C7K zgw1b&2H_^oeg%YVsC?FZm2k%yd^4Ckt{*>sSH@q#I3fL<8AYK)6Vce9xM&^cO~-Z9 z;{07udJ74to z&BGs6*LAelGwS1Gnm6w#4i1QAhNyt4GIG6IVpMpEMCk#y5Q#n+nx+*A=@%Jf4Zwz8 z_89y564h7GN)ePoD~&e>(FV~vJ!L#VwzrU-t;9S&IzS&DppOnPKm34s^@{rZjBY;1 zwoNj-_5N1v^61I(b81ONmKTh6pD{lCnri@_XH~)iTWE_PG81rcLhTviC+!F@U!qDj*t^(r8^F**0eKoZ;a)?Q+5L>Xi0s zL2&*NW&g?YQ_xDK)eEgtVUiiLydWPA8SL&eIC{e1itX4>`d|FAz_f? zweDk+BQbcQ6QYVKE{=c$YycZWnlxg(aj8(L_!SY9R_k;S6NL=OLnP}wW>FK*udr|4 zv;5%|^B-T)oSk9o=F=Y|t*ItcCNEwv{nNJ;Up#}|Eo@cLY3T5@(b2gSj~AjrMFUv^ zSVX4?PO%=fvxVNCCR4ehK(vMjOCZ>E^bE<^&RIH_zE+}8N+Trw?k`=bmtXk%k2VE& z5?}5P4k3pA>xe|vr^+Nnzv>w&>h7!G;;aWYU3AwqDUnP(0~|xGnQG0p7It*xFpIn` z1FtIK%|LTr=gd1z?Gt$0g-Gk6_Ru(JeY)m-h$$*@ZGh|Hljm0bT7a0|^fV@vDFo;& zbT+c+0`o3s-Wo1z#p^0^SbBDI$3$Dk+A&m-N-2htQ7OnJBUheG1#*E>38jKkAeVqv z9*jkdPvD9+pmKzQ%x9EAQ|T4364zcR4^@+DfkH`dUMdVS!DJfA45$oLesk@uddi>( z7+f^iXlQ-PQ1WPe6l{MTwLVgNShytRx#&C>7S1f3behvvc;Cy`PU?fKp@hfGpR2ZIl+7{3EjfR0T2}VWwlM-6`tHKH0%O z%U7>yj^9&XUgDMuLfa90fF*{I78zoE1Xq4)j_3_*N4w7%?7hTHjtF{+iv>0)Y*4th z5qYZHHZJcw{m^GRG(T<+xtT{`<)2m0e)eTi+?e=f{kdXD#$!$(#$=2JlA1-MP(w|5 z&@paX+Qk)3`xnBprhPPUD9tNcNyg5Auj26HSIt1jv0L?>h9= zjQIAL`oF$o_Md;@>boCUUS8mA`$>;6` zLYT9#!keYy;tKw1U}Pc#6R1?A(vivtl_r_uW+kIsG0qf|TrtfR+qtk)z>b0)aZFT) z(jAxD%s9;n#Ul4L+bBaAYk$`m>SvV6l-LnZbKF%67S zQ+vbA8|Kb%?KCqd%q?8Cp362R^;~z3Sr?ew$jk~e3kxSKyk;4M#tTaqscoROp5T8^ zCd>C#?bG!&X1iUB3*Lp|v$&`7;YYZN|b0}lTrV}QA_!@sb zBQ`DPfBg&f?CQb&MZ9-(ZO#1nJ=u5Pqemk~TVwRFA}cb2(vT&ok5iyR#7XQ~ERxKP zR|wrEuq83EfCa*8VCxqiT>mpK(w~!FTo%Lnq7*!m35;@J3pL0vPj;Dn{gTni8UFMP zdwhyJJI7vK(Oq8AUR~48<}|Zwx~|1W&*OIgmQ_P02VXKg_=bG@CFDE!SmC@*5O@!& zxXlRk7;i6s$!CmDJet=&0xOT(zW~gXyZ2vYEePs;7(x_+>J9v2L=#b}#ORW2D^j#I zqxl8H`3xJ6=@#`Pihj536h&DL8Eo$|Iyz$b>>1_$F2(*X+13O#8Nzr-7!B~l3O5|k zRRu0LxLgrbq7KC_tdlEbWwI4QGDhoT<5s%@MRbYqp&p@B?7eO+E?D3OT4Cv;I^rQi#r-zHXL0eWUL?M~rRuM79GVo^MdB3z=EIXD>OYm}!!~bu23mf2y?`0B-5J<7s z4J=gTOeMotBVbfA%+8di$TF%dXOJ5vWx-Ziuv29m3=Bt==BR?_IG*Z;iEb!pP;@;= zmLrn)U`7&#Df&5shh?m=dc769a^)-sIoct#Ply#P21{K+4j0^|FJj2C^ z^PZskxZ0J3rI*wANb-Ag9<3C5G^Bd|3_n{C>V|HS7%R@d@?2W0vnvn7w|*{Pcu4yT(WVSaaV6 zRf+-CvZ@WyYl-GZoq>%yvz6c+TMBn5ONh>lPOtJ}XfmVSPuqqOwBRUUWtye_U#w4FiCQ>mILhOy>)@Sh6xmelU zWqmoE$Fvtdl64L}ud!#B30V2z6^r9z+IsQH&!>n`jK@q~zGV3AH)LNt!*5UMs+`6M ztwh>BD*C2KUM)4mTd|q32UjG|P{RS)WQrLKP+9h%o+Tfa1YTq%y5XA zPLM%GFgisO2bbb&qffFG=fDS|PxFHd;9N|`w^fPR+hy?b1)*+OynjzKpV8He2VcaA zK-bnR&(1J;!RYl%%BN4r4)!pkDwPi^9W}p+QmrIbADn|t$Ea1Z*D72-d9$Q7m9+S^ zx^~wF%5futNj7JvC0 z^VhFwXIK9eP$ka`#!rvf{-6JY>W^Q;(LVLCpwU7jfi?y#9=C4eSr;y;sq3Xt!KY?F zMzk^L;gEcLi)=hb7ey*?K2hP}qtFG-!fR>|At;neNQ$V43W++bWL;0)&42mT4Q021 zpW7ynD*#EMZUB-HZ!y)^;Gb+*LB@?&iEGScqiRjZE6LYg?|PYj9#zChAd8+VYNlTE zq|!Va7@iM=mqYk+p!sf?@c{ln0l#Vn7q#NL(JVSc<2< zKh@-a%x$L!CVfn+$`;yAxNhNO32&G1dI&!b6mLh7w*&aH5}p;pK_LvYl*%I->KJ(6 zc}^PP$~u~!P4|$=PA;Sv zOxL^Q3*rJHq;x_Rp+ljKMrQ^kitO1TVHg58ED;y-3v->M6OHhnQ`=Wm)sb>$GCAp211mzOjbfzM>xfPLJaiDjP&!I zBtJHkAWGwu#%O~TgBFd}hCD<}=P(ERl!yDs(Gz5QN`AP<;MFUZrzbR5mvoB-UDM#Y zu9qkN{x+pE^1+zV!B>n9|3tp~6;ua!J;739qwdAQfe<}DaaPu5&bQ23zffpOcRw)y z;Rl+_3vAbZ^5bZXVSISV^qX%O{`rrnXNTCykS0?!Bv7S`9v^R{PALbmUp4AMm6a?i ztc-nCGRey)6SDCbQ-8@#xBgqty6ELZDG*a9Fb73ciky@PQ%1!| zgk2>(FW_`6T(ySl4rZ-p)&*vrXJ!Kn8<^Wb?E_uUuCO8AXs*Lb`m`x3_>CnCeeitW zpVO8Yg+o*JNW{Q3nas|0o6h<+~45K_}kmU@Ef-=u3GsCzD>{T^~<&qaw z@Ds<>wE4@@qa* zn@J@i{bGWq@rt=iUQ{7I{3lSN$g-SrdzWH=AHBOns7iuXcmmctJd(WKe9v0(o)A)! zn~ljhUu%WZ2BkD6Ovs3g|L_gV(=+O`GyK~(1pn}|UGFUIa?aw_YewJy$nfY1W_yAR zOJb(!Hacoi>4K3B&HPWzYq8hD#*Y|uMCpM+5kiXFLv8#l_DoH$6;3HyrHMvk5p<^0 z3>!Vc2t_Way)CM*U(%kP(Vm~vU0l*!T+m!y(aq-AdWo+aeA^Lz2XZ0NhJ3KaaQ6kH z!#`8*{{c0AhR?V0YJd$HE()%f%C8J-WBdq!`MHBDkEqZ?Z~Bq3^0+-fL4LEwv(kln zFE}T(D$y1LWAfsVZ08%Qwqab)uw9d6DT{03Z%`H_eSx8sLYa(gFd&;uD7Uv6?CnwQ z?@>KDq&hkz+ukPInj*siVNl{m740Cy8&ZZ(UnRzvsEN0wE}N%eL-NvRM{ZJ{Z=Wye z7fO2BkO*1?g-Y2CA(A=Y`>R9>7ch&4aCVJ-{g(QN*VOOc(JdE=Uiv8^V5KO^ipldA zjQ{Wr#g{K}+tcK)p#p74po)!Y)jNdbiocc@tSar0BvCZZ+3k;IfTe zG?9xoaNb4EyU5J;dly)^NaK>kB!sXL8_MsX>AnG1Qu;~+=Lx=}@fmHWscT`LM@}=( ztIV;RId+S{R-u^Wj$skO2(7@i_nbC?S!d~753D>8plN;JsM8m4lgu>kj5UuvS}-b-us8Jij+N&+Rmyte1jmlvWrcj4~K!!Y~s?2Bx`U zl53`gVOkm{g<+fl) zqkN)=?K9%9?rhx+v`&qD`mObfrPEwlXnm4QK6q!L4S6x3+}$PL+e5ad__9b~06i0s z5`fZ{9I~{g(Rj0@pSVz5o)5IA^I(PpDtL zp?md~{P|O4dx|cL+g+1dA#ti_+i_dcxF$QsjdSr4uG@-|sZtd4D!zHmINtC(41}JU z>+x|VISND_P?bh+4au@66gyj#^$UiJ1@7V!cYaCz{y4=-pPo~nozk40(_LQUx(4rT zn$v!ZqnRj7KBSl&FgpArgM)9$x4(pHAFoGP3T)JA;c{Id1`Z|Fna3@nKi5F$C)!*mQ)K`3&9Hdw9bGDRaE>swsoL8-KI zAAyhx5g$A;cqD{mfYviK;s&U4V`C1tmilD{)ZFNUQ$mfxh{i<7BIGWTM@JSQYaN_j zV}E?d^1r@k`Qs~^iwlDN^o*l&IA-_d7wrGX|6=rSeENFeNtz~XLp(mnl zmp&VSqXZ%Ei{Q){M#kWxCZN*_YEY@!_CoD7b1Pg~;jB}fw!*vK0QYzqIIcbCjb&jS zU1tfd+j#fCb&2DqI4uAcq5`LhL1-PEw~?6yPF0}Nfq{t(GQ}{@85W*0k0=ueDr0E_ zmvu+8W~@9Auo5Ek&ha+FqVv3)cNBf9sq~DMHbCd0@%`5!ecgpVV$;Vp1^o9B%l*Mj z#yZVM6_Aw_MaHx=Y!`|r130Q8hb8P4k(~mjS!A3?1_nwU$W==w0WEa!R{W_(G#-6J>u3FUuIYhF7`3NAuSZGjB68cmQp5B zDWI!Uq|9^y!2lKd=z!|0FPNO1vUvXvyR32T!?RXmj5Jr5EMC86`Iqk)eEk)AZwFPC zs0>iC$5YaR$ZCF;egQ`|=YVi$W|MmmK~^ua0#X9f7XfnTn)e>i5w8MD6piXwEo_Q& zXaZTT$fY8yN{kOE?`%{)bzG3<5HOp6Ts83F4XIDLF^BWq; zl*Z&Gqum#bpZpt>7ym(d@F(>6DL&u9hMdkTtWC9H2%gwWKGVpOMwj1Q!~B>E^x&7; zBV*;CHS7K6kl)oR`bux;Z;)M|G|xUp2!an85rftviqfR`#7w6(Fq1)W%uip_)C+?9 z{578%NrlC9i{a4`)zJ~dmoKQkctLTvN4~d%8V@1Q3Aw>%2Cr3$AtYjfPDR?_u{Pj> z1yKng=)FRc`B-nX8RHsAQLFFQV)2a@c7rdy)}XJdFQq{1M7b439)&zaG8f6M$FvT) zTG0LYmihnr3)g@7D~sb}T-Wy8nNPPF5k@<^?EU%Q*!my;hI#p%W;mc#iq0oLl@uG< zvjBE}yj_2g2&+kpb&`Odca-(x! zgDN*b@M_CYC~@RyqS7FJ{I)0p3Xj4^g^h|PXck_$vYO*Y^QO_fTELHsz^jGhcxgFZ zv|KF})^&u?@%vz{Y=R9dDVC)1zb6+siF8Ef5-}=bl#m-wkp;>ukmnAgb9{u>SsLpS zVEjPGF2qRd0zNnz7r0b%6XzV$$mQ3u^Sz1b#$)^dnEqVZD*qinpcSZ6f>fw%NLdaU zRuu=MjAtXw^8tK03_Kq=4olB=<`@}Ar2~aHjCgcRca%g2(V?P6hYlSrI{MT=(kBb{ zz{-lb$I1&V#@ln*hNtxkYYFjFXD-P{?gRd%*TgMP6>j7|vi74^M6a+>Q+v(ZTJggI zzF!0`x=8DJun9&1c~&so+G70d8RgLv)ZQ*}Jj4|lP6>{P3;xEO)u#oJ)%gwm`}P7> zdN!g67$Jxvn+`Eg4;g*)6{GLIqr1Mwoz$P?*mllRUtTc(@fG9OZz&IUVOSyqgUS-C zMnv5l?}L$DtPI8qlQG=h zVe;||#((^l;a6WU{Q66Z7f(^!6J%83jKamVdShe2g@})db>WCu5>4I3v}zi;VO^-z z>iep)Ts4mCPIa`v`JxV2tx6&Ad%tvzX$(%#a8^ZAg^>?qh`al20 z?8hHzt}aPVC7*DF5~0Wn#s>#%|M8Cuzxo2Vw~NaSmXMBD^hu{3{0+#oDo$37H?dCx z3Mpcg{C9w5y-8x<^EW2gSlPY7!rriSd*8xwUq3XWaP5+m;@$U7uRnEKKFb1a~Dkx}|;IBx7E^?64%<^5Pcr9>ULuWl9^z6HMpY5&u ztnu~pml2>jEUr#C(j&Ogcv=}*#xY_hXZRvjC9`9`LJ;f z#E<%G{05gn_)r`Y@0khi0HUH0azvFVJ)|6r*&dHL7!UYnE92WSd_4?&J?c0rBip%S zpgfs4G!_Y#=pC$9eplZ|i{O#y*T6|2fpPI3etitGZZ=nMZS(55YdHJQVVuNY)jhj; zhHrx^={GJImfmn-4X>BNcZv(lSL+{OkPybI= zM$MAs!YdU~T-D*RKW>tayH*&LVU!|9ArrxfkUw#hM^6|&drq~tN4d4lY%<0C*MBlU zJs~V+{eso!%U=-zotIS8{bX4C0B;DX@L1PxM-$hD!Mh3*7W11@K4{8KR?1eIe_gkp~`WYN#Ke1Snm?s z!u#Y)gWy5}T3la%g!QUj-=c1SDmOBT56elpr?rj!ETdNK(276YN7Tj*=1Qi8A~=k1 z;Od(CyYIRDfB!dU|NDP)eSS=9n@`GB5x{7}^zewCufJjRhp$n4JA^@jH*#a%+k++1 z`*r7?qKbRnag0dM(@jy+f|J`PP%@1SD$MRS<-q~Ny*;|wHNNd|@qxj<=&`QjbW!tN zX4oqg`?+SCl~lR{Jh=o!{B3|hxMlkKS+1K)?3r#KmjivQegEidhWqP-yD6h9dc2a= z&*H7ZDUsN3H2!N+y>=*ZlvpxjnB+P8MaHu#nPU{!J}^EP^<1I#Em2z{~5RXKkt3V7;xU=L&Q4Ivg^=Fqa;9dc<(+@B3JxysQlf4 zDyy7={+gEl#*xJFNXs7qwesFl8j%cR22|ycQ90ybGT_;y;Kf+;?F7CVI=-kn_RE?< zR%29)>H!sr7NSSQ!~dVX|NN5U$hLgJ-!U^6AyYyN5){R{Rkyp}o7J=C|6gl9%)FkN zzN(6v&?JK?gSkgUCIE`6Odvsq-4z!}fJJzin>c5mefAayAqvq3u|zt(Ka)GQ zKcBZeUf9vEfT(S*x*l(yb7w#m1Rpdm7-lx%urje*E z19~^E)Bofi>h=xn_9nKQ6B2`0YQY3swClFu$>MxymAGOHSO9_!_{L5phC;_)-|pRWWCBxXg-VQu|$ z7q&Wga>`pTzR(6Vai6sBS6Wy*3fit(?71fTsa5RIbXu@lVT{ITO`=pRdMb_S1azKa z`aSynF6s6r-P%y8?LV#*R+WDl$8_H;h>Uyt=z11sxs35QjC5wiRtEQPsz2|!M-NtVAaoq^2)H*7TTUgM~U1M0|Vm+d<3SM#WX)=Npf=U$n`vpb5Ps zB28a#Q|A&{UXl_MOKmi1BB>n`t?mLcu{EpLumsG_JcgYnDV^aDXTkL%CCBr{` ziMewF+s&vI4Ns;m&BWepS&7om1e-yc;4K0x&V!e*l!sLyMj@RHy|qDh<2wCYw<)tyWN% zegD5LO!+xu;CBH{XEa(GaOF+$+$KC-WZlx}IW$#!FQ64Or4-kb zz^7d}nj22$X#=b{N*5@7bl;dc#ndV0PBC-B%mrq(r>HHqT6H}6BUsRTLa;a&z+0SB zs78G!1h?W0v>yNbXoY9f_|YjOhHfehlEAE zMt9E5PQjgy<5pU8U03v^#Do%j-O%P6p%L`VD>hRlwSj? zh`f*U@x!E7Zv&858F|tqk^zkkhRP?5ZNgq@csv!pKXv>#u6a4FnAUX^jJ?1FHtqMx zuJ6*hdy8;whcFzV@|4(V*|IqN(xES$qmDIgdcg<0#5N%B13@VQ3Z(_rNl{xv@=x#4 zfBt}CZ;$ZgG38_&i+dM1tg}pK6OJA|gzX`+y@B57k@j*zmPVHzX%AtE1tE^%J1?1eUD#j$ysR`5mD}-N#<3nC%H^o zLLXexr}i z5^6Fd`b7gCxq=GRidbZ!#DPKvhoR>Wpv1D zOGpqx)1NG%S*cCXh5}_2I!jQ)KFReRy0>o9eg1-Sbc`)$c)|sxyR8sfjdzN1sd+Iq zJezg6-_zX5Q@WCnh(U`x!|FKC?)Yeqm6py-OOgILMU{*FZs)rw!PZ*($4 zYynyXs*PAk`~1WbVB!@63|bp{xnU>KeA?5@Ybb0&X@$xK3I~N(%$(+=HXK!&qgruL z!G7V{pIMG(B@-`rSFH%;{Sij1Mc@cdt$gc0lIzauk{UgdT=Lq z+(=5clZp*pktvH(fM}FXNVOt2o^&UEKBtw%!Sp(q+c)Sv zxKI81HP!J6ZeCE^>OxNs7Xr>!@cJd@(I(mTYYgt)BH7s_^t%hbW7PMGtVCG>58tLZ zChvNY;a8*(VWp5DOBVC;A6RI%uf~-DA9ajEbP-Y>RPg8kN$?nng12VaMX6mnc}9Bs zI-T(Y%Fzk+=@@%F!kwIAM`P^hl=A3=;^c(+$uXfSnl{cWdUiKpUGQPSloDALdTuz* zvI?aLKVJk|pG@oVW?*C15zKqM{eHK&Q46dnyhKd`Q3fRm!6ay-FdB>sC?5z_i7k$) zPM$M4ddl?pCFOjKv-Op1aY&RV@Am0!Y}37Yi{9k#J&(+H|e9zACC^a-=k$$J4+Qk^ioev51W?Y}Yjm#@&bZ%}0kr35N(v5R0L z>Zqu5&W7@?(4^^m4upm18$@8m|yba;DH+Ao7E7jeA4jjrs^{mrVy zetZPlWF=7vZUrb_ac&492KXH`i8l02f|Dfv*BZuGAmD>wy{2rc#z$4ker-Z8p4CV z<6bsrH<>dq1*ud~s4;|?_l6omg~p;oWTzydB6abOK!vsfaAw1;GAma>74MgC+{p_5 zB4=b&ewKx~ULj}aqrKLZG-9e~LP+o-q4p_bYj|Af!I%`mriNd!9163Ut|o8ym9 zaYrNU>wTtAUNC+Bobl7An1elv$(XV%uH63gK47bYa&pN0Wm}2&f;?>uTo`1{e^<(DaV{BDkkw`_MltPEFIX@7_J~ zdw1!4dY9z(4fOT~(y&szB3k`cHNL8FRZZm`HBh>mvT|6buv+2ON|TOn1l(LBu(~Qv z+sw6`JI`a{Cuf3=cLFM_e=L!<8o`w2yNbl`D+-NZ0vKyi)0*n}9;e^^$kF#dFd3at z+sjpm7a-A^;qG;|zxa~P|M9P+5ANc(29!pq8d2Z6^&)C353Nw`FXV5b3F=UdMR)@! zSy5PtDg&~!MSABZy?b}4_V+1|4{*pJ?9%&oL9^%&EY)ZpvV|inj%Z^q)}r< zYQQ4Fe^e>O8~Q1$SjF91aks0u*VWwb3HQ42u%~!A(Hu-Qr*lnV zD=KHPKDt)@c5RUG(cLWT@mrw7pE(O80xF^sl%%9dk8awfpLMx5%(*u-+#3pC3>^>p zaIfpQmU{ZelWC6<-ZpT)|+yVQLizW#GlsaXhb>*Co)pmtB;4t$@Jtr%xF^dP;Wd2HEZoqBW9gRDh~sJ-QY|T-;`1dGGz)8kV0~ z=x5|wWOD6s2{1SCxgy z41Y4l?HwY!yO`@cn5`k{^G#+42h5I-sEZP3>&8@|5x!j&RC?dHONhYA{Ny#0*FT`r z0g?_;!y08aFk~1VNQ}Z8LvT%zB}l_n_Gdx9Uy4aS_UmOm{wW;K5KCjpdM?)Ex9-Me zoiX;l1~fq$wu(*=lb{kqk|VcF`HgGTSbYGW;w&#ci8yq3%Xx@j@;U%>gSX?Pz6uz19b>7 zm|ryKhqqL4&dpmB!3X6DK}8UYI0ud>|AW?1`%g#oM(g@l9JX=M6{c-fG;H*{f zZBYe1A1p~&vAtYbn=D0e8xt)QZuuXT2C$2Nu+nO$&^S_Y^ps;$J2p+qPHMQ>5pH)3 zcYDIqvG8=PcyX#YE;Qq^Vs7iW-hF7?!J0t*4M+92RnyjB#qT5PRVzQsB9o3k`4y+D zMoT~`L?sxVk(i8Or^B^w&W(P`r$fbqf#rVBbEg})+41b8o?cR6bP3WX+zn&OwUDHX zzaOfor6T?eIO5KLBjIQFrJ57S;w1CDDD5X#gh=*z+BMGt#Dd-j*6OD zRpDF&>@PZwLTgkfM|C@>ZjMS*RH9MVH~L_!pvnru*4zinE4u;VyetmlHumr|E;mZ! z^9;ScMOHa__wUhp_z?3X!`9`cxY*eFoZ0?9v!~DKe|n$(-MgqPi|%okIJgpS5*-)JK=gh3Y_ z5P}4pfK!4Ef_06UZ!19SmjbfB0R_~`gvtf4p)0JUWi}$q5M50}x1}7@oIrh8gYuluEZjs*DMfH1x(a|Mr~wLb(6uEYdGPg0al=wyZsrMa03U-pH)jf7WI*q>_-<_SlI<+O5)YtOXyR9>iq zP8Pw%?Qcg{M8X++Af+P6f`AQy(pgGZ;X}=(=r}1A6YxBTEF%~LTCFf^ zTaoZsL|Sz^l=Cg23%#q>GOE>RY21!P;Z?vJP3UIG_6GUA+jQ^Vq4VS^_2C}ADlR@_ zay8{_%;f1a29KUHxP6DDlf}YZ(lBpAEc}EOW~4vsxO}OstCp=2A9yLC>*a0DERpH! ziH=LQ2}He$MhYr8#Kv|pQ7s!PAelyn9dKKa2uYrzwl_)c+@f=EKs7q0nobv=dNQFJ zol;LGxY-<66yV-(yziW)oR1mrKf(tEDnU@B&SC~aN(V2RV8Dus+J}ua6y7$Vm0wxQ zzoR5>4G>-A@aE!S>-Bj1N%#B2io&WyXrodqN@27jHIOBN%viE8#+0wHN8d7i@gE#N z`FBRIe_}p9rmD&h;{u@+y4xk+-llW&Cf!>%$hWu1x3@@pJxr&I>Gn{=K4H+qZw#=5 z9pa3NMznm+R20yK7Q!8?2ijqs@unxI03R;Mkzk$;Bp4%PpEcvQ`r;W?b@_d>3dlD$+4$mf`hWcs`ty5K z*ET2=%w0_pEVT>R;Bl=^N(-!nRaQiJOK{#!dRs#Bi^&L0vVskzcQr0?$uSSnXBuWM#D#RZVIazs-lk`Ub+!^e1>gtsJ5t(a|VgZ=*T?VocKI!~)U zgORW_4T#mgxc4Ja;}^+Hv+Y*$g(!S0XiO-{LxPfo)EEX@b3GOA=7G~5oK~8XN;oME zqsntq22ShHxCyDnuVV|RRp7LAOe#xJS%SAw7lV48qJGq)(MKTzaxf_>P3YyqRt8&X zV8eL&+LLQXM+G`Y=o(=oRcxffF!AhWMFdieqi;MN9b4D30I7?NNt`E0HVf^ge@U z&nb#2wyrLmwGu+W)t1?-SB!spNblM;hW#$aX!3p@kNDshZFCV6ie7Y%v+Tma(xpx= zVKts9A~k{KSwlWq-Hvz>ERA!bbJVIvDi6+r))72XstGGSl7Q~#XxTs|1~u%H-MB_J zy-O&fYmhAp%99br!6CC3ub94gLAk$Ad0=DA@89PM5b&<1oE(EZMwG@R8GWFWWSC@| zOgaQ@5Wog$^wd^u5EQK>u&hCe^?3WRYhYzP{^4Nb4P#r04nSH#q64Y+2=9(UT5R0FWLC=bGo-~l3&}#bh=;+K`E@! z(Tyh2)LBBEYOL}&Zx>Y;yo+|fjrA|B5N)fOa_(YO@6f^eN6+Z+3;&VT{4QP(f|4bu zk_90Tkk<|~no>M_$@tsv89n-m+40e(2fzXtlhC`i%f`R_iR{Yay{~t*#dB^8w`@1X;?+ zEF@*lmh9u3G$?8k3|b7i7=~Km6NSs8J#%S=nbnMI&8QYmtuS?piB*i9=EQ0aOW}19 zcr~@WnpPZ5E2^r**$CLJr9MC2`!zCEGN6a(J|^#w^-^vQH1~ReyPd$z)Ulmd`r6V{ zmaca6jAtY9478=MYr3kUBQ=S*Sb-M5(t0X*-?S8kr3`&I2adFEaSO)fN(+ydm6jfP z$DVqZUiCZvm5<>pyD}@K!Bdvt3M*}h@sVpEnV!+L<#L#8VhpO&K{_2mnqWn+Aw;rM z69+{{mbM+}9NM-}E?z$Og302S+~^>lpxS~}pjMzVjlQ-;cJB`TPe0-G)vL&qxCGXU z51#qSF_R}x8E}lsHrmJ9nh)vBCQ6a?`gCvK zX7jKA!uJ38Z**_pBHi8ut*M=*s4Hw;QF%)d9F>Mz0@k}_>r#l~v*LUdpOoMG9kuclR)9))^4qVj+Cwa>gwk_-n(c3ey z$qJackWva~189i}f?(02(V`ogb!7aZg^&n7C_D;_!eX$ZD16Gq8BS`$t3vT~29L*% zpGFCfN1DB{Fq(Phb+q+f11nc4YW+3uLM=fR>4NEzbO-DVyWHBy_-a%0=MDI*=eUccD2?SIGqD{^*SO?D>81$60CN zN~|o!BG+BA<79bCg`jXjC|sbhp3+4?;xdNLGSbZrWYEXvDTVU5;HZP(8WHZ*R_E0_ z>|JqBSY3F&X*^T15N5UFDG`De@{IxM-CGR4`jWwm7gVze^?q?F-?gqwCVQ_)|CZ3X zzKb68$h$cvPf4^yqK(m@nxBJP*h|09n0Iw9_0O!@cAg!r{)seV?oFeXQt_i3U`4f} z|6me@Qz;?OP|6@lN}A=QIz=mu8;{9vyhL}q_^QB8#uP7KFXbvjrORj>ix0+-}+Sq-RY3+Y}5PXF8$9R(Am9?>GY@ttgCSK zjCwwytP0Ayq6$&p!#UruRl*Wj@lj!YaqO-{o~udK8SzZ{ZDIK@hIn%B$JKvs=(joq zk^o5%QiKde?jS8{$DD#i6s#PB;d1HYHVbS8Z6h>B2r%W=G z?vf@sS(dWZSKQr%Plt{_ZwCG}fKPg!-HxM|SW@NC!J=G+xC-1HToq~j&YuCHLs)i1 z`V|dPzw+AOaG{d7um7{+=x^Cb@-ZhKa%E1=w>{OuW_fjmH5Y?4h^|Lbdd1W_W-d^+ z0LO*j;fAEwC*Qq>Y!0dOBr;2a!}`cv@eQaDL6ufOb@?r2MR?~tD_~)j&@9y8JzjZi zaErp8%2V{UZ91QQ!r;kg6eq`&<1w}>8vUt@8$JYz@tDzzr*yylmSk&#WMhcl*(B}d zNUD(}!E2$G=$sXWpu-uKZFmnWZnfb@WEJ{9i<-7iv@ra1%OEle-wMGALFF6Zs zRRmtdB$zbEXFW)IXq}QNMaX-IHn_TC_To9SXV1`CO07QN{t5wCm&{LIlH`3ln>R7t zA*snwojh7Ci{PYfZj7In&$oash4=Oz-$Q7&9v29#)a!Y8&o|>o`}k+;3JW&^2`C9D z@fZmt5=et1^_IlVQS;Z>(NpFJ51Agnq@0dFJgCxSJt|E|`aRO^Ez;d>%*F;vG5}mK z*u+zXlA4;@3)Tgk54ctPxCU5J9=s24&XlaU&4#mK_eCv}@D5wPRW*493t+{Bfbo!u z#4dgtFp~nicgXaoM~ojoW_oxSD;SqNk}RjcyUWI(zNGWzXM`KORGo~u1Pbr)KH%HL zaACf<0;;TV){5-(IJJ#Ha>_JR~T5D$lO2uDw@QA1;DQa|o zlz?`K*6~;Iq7(f(^c4&h>}b!e)bpYP&$@<}lZ=y6GpQ`4bJ!5D9%?U?iw{^2 z)-`)9w5l0?4X*stE2(9k=mo$ME4`p~AW`v?sz53Mqd=okk|H`INppHx!my*b)wg^y znDc30@mU`}>B7xCkf#o9YETwJ5nX*+XP;0-!gZ9zd3j3S5zZBU7($`a~Mj#HiJ5Q?DklyqpxuI-X;Z({mARASD=Y9A^d zDQ6?*Coh@q|3r7|Hd%Lzq_;%~(rC^^est3}iGNGveqK*XKB{wWJuYF?Cf>m7@j;^X zj~ZZEsxvByx++Em66MI0C6|)S&oT28>Z6Cu_J3r&|Ab;X$69}7UW-~-|9QOk*boQ; zbD$tl;3=C=-I4*@>R%)17eSTP9#**$?|rEa5%pA}Y$lihi3?;Qkf}iC1L>^7y*^;} z-H#l9`yJ!Gy~cUxa)%MkVD|>Q|Lwms_}70y-@Qedn%H(_ee75Ep5UWR-}%D2gtvoK zzvkU9Dq#&swy*)THrfFDn9wHO4oRM)OoG28XCxb7?qF04$F*isL+vz1t3@yR8Ro-E zlI}k0)8vm4frOR!<<9}DpB)KLVt>5EGo417Ro=;v@#3tw~; zCmV{BN;9q$Q=2lkfzrd=2{WfTwZcg)9M{5e88|K+r=_K=E#B6R_^tbBSJ&0JU0RKl zG=7qVB-Qj%&2|TNGS7C>h{|eDM}tNhr#4NNDtbxHAgS0&96On3ClBlx*bG8e#dsg> zoBlw%v_tlxQIzGaw6;|@pHc6>aKWowDSDe* z3~t?`d-o2qwLzVwI6@RdZUk#vot3tD@n%flg>)%De2tF+(7x~O12onxmnLbt@_hB=;@uc8}` zv((Pve5;ufq8msEQJpSc932^xYAc;|4o#(JV1pfM!<0oh=KBs;hi%jp0(FHEg)Si#Feu~!P$ z>V!eiq#|cTYga*)z{e*~D!=4ydx{FFW^m{qGy_B1M&4WIC(skVKSay<{fwttzHzKm}*F;rhQjtnU zM_F>^$W3uCYg0jWuG@t6W`!iu`kXK|UUg;vG*eAH_Mk z+6uG;VikBpt!e#~4eXWg8urs}Z%>YR>HBHPeG9B*Oj1*keEQK zgiL!r z@ps=dIoPKvFITWuiI8VG+xPCX`{zG1`17BrukT_zDHR^;h<(}OV{f+ei*_CPl}d>} z2VyPQxGO!fAw*!MmKyB>;v6AKNQOhQjZM;Sk7_zzIuc#ra3L^rfrAoW%!QYQ=2m4$ z&}gOOyKH)-+g1`e9|V0oDZxjXD*r?OLipu`)U(2jZ`~NelIGt+wPz^D%|3|!LX9!6 zfEa10*?ytP5=0syK7|dM3d779j%&?cp?Nk{{CMiw&Mgm5HP5tgI2CLS&V@#kA)HAD z*6fCNEdc@12nk4zQe8~eBklCKwb9|hX2xe5n!gSLUk)sHyCvIcMORr8u@Ef5RRnKQ zzChdz@kMm=@qP)qxrU%3s3tQy#gqD>vCCDE!4!@e9ioE0g zT6|V@9)f^Zcy!$3m1eI99F{Py1C_ft@zm(#XUMuey4SDMxqXZ5)(z@mpO7S2h%8Wv z+HPv0@zX|;@6JBodUuCq8%=Z=a%aqhv?#3BxWtfL-$8wHkFbBp`0*p=C&!e<>{8Ax z7d*3*WAwux*?Rqod@@D1u3J8~UTc;OmggfuxdJObcBZZ}t>3)3mH5I@->QO093mKRU2duIJ%BArl|@S2&x?MsJ%S8c`Z;gfvxT+LMcr z+6r49Gdq03XzvlHqa)^Zcq@hOgMBCO@$&*d8sqklv4&aTD)@v zzhtPyK;hki&sBIwz7ge6N+DXKCAJQv1XAZoYfmyM@Oy`hzxke{zkki~<408U`K3Q= zmga2kUgz4s{F%+ae1*Axi)xr-jfz6GA>f_I(}?XYm_dFaTKi82B(ijJX-ad9TqO8kkTX~^?SYT#7uM5YcN#IsjxRx1INC=6cqcoa;YQDE> zk|MccYw(xDIQbR-&hIxcS#=dsEQLf{fTa~RRpI<>w3Xho36)|gklR{*iE^>ZrX@12 zb)+*Z2^az?p02lSB%14q;YO;snJMmdga>`Y!+yroQ#hCkr-foxE3C7);P4?*zvGsa zr7lN!`z`VNOSo6*{44rm2uf7*$x*t4HeGt1KHI%6yZxL`hnmlZp3erJFMF0d-I}eu z!X!0HSp*kbzFbML1>)x5N^lmj&73+GeLPVg#WyWI@=l?OGY&rIoP2y(rvM-Gs%#55 zi+3Cp&KoKcj!MJJx#HQ(v0nzJb;G#5pf|37G|TC3??h1L_D#(7UG$)fq^4nF`Ud=n zV2HE{{OUpY8xK%VXp&lK68y+qaSFUvc&+i>oaDw1{VyIceDsjn!9MfDgG*~~wpGdO z_=L&R7xbRJB)fA5-OovMw7Pb_WeUln1@C8(vnv4N$+>s^hW)w^c!{4NP0O~mP?Z!) zqfH=DHDOkuMkCze2zPRdpUffv&x6B08ZsOYX0LV|Nq z&u2;dItyTblw#fM9;S;P{a_6|=#dykfY?q;an zZMt{wVD}HHkB$i^N0e2;1w$)T&T~>)o=j_Y$C~X-Fp{81*)|Ee3K(%qH=T2!iu|q) z!QY9W^v?)=`gb@Aofo-Y{j*hV1+^+zDQ88TW9Ds_*>ngoaYs;*#zKN3RT`5h@{VRh zDQ;xKy*%)ur`ew+92GDw6-8ZBI!EmTb%4?drB_h^*9oPM)$rOmtaA-x!hgg-%VL%R z4WdD5v=&k&q$-f>_{nr+YNlFabV8yt5|fiA8Jiu$Zr5|YQ*x(UaJ%cdnR{+0HJi$k zdmCF0+xZGMYNUiR>f8j!+XPZt-SoEK-?wt!^6s@4-oc&<|L7K7j}LZwHdlM2p%x<$ z9~3qu%zeVx8J^4(52x^G>NzYNg}vDJ3nhxQ+oN-Bm(Hylq}O+m;Q-Z15#5|O3pcX1 zP3@fR{I9qlmMp3j#*1(Er^JFt02)E%z7QekC~ofvSOuonCAoQx!GlkkK6}CR)hnjc zG0tAR5vuo|sw$a0eNO*}hjg#sMBlki+Rw3yhUFR$Y}>xPGuq(cEVJxAZ^<)&N;n@W zv0z7@i8EJ){#V+mopsbzNo75iFVLq`)Zr0s{|I+@f*(%^RR!Vd+zTND%IS#7;WI`r zz9#Dq(Me8{_VG&NLxK-!bZzs2AdVm{`>W+4Eqs+eayPW~xCmgSSkJ?H{5%q{6x<4J zuqg_pwE@*Atw|C^sx^rX*m6X1y2tqN71QaAvT|21ybb|Zme|u%>it9P-Vw4fz;$zc zFU9K+Rqa&{<0xLmCONS{f^Swh(zyFcL z@4w^p^($(3x$f(Nkm!`|)(*o@KP9_;3)vdtvjlIN%9f8nM_6_2Y3!_d>*fE;Q!Xn3 zsGRA8T?T93duku8omKE?C1jn9YDKk>w`JfJ@Xv@4-B^NlJ<7!3~pew!b^hn8BylUHy~elYrGP8hcjsS7!H^9xPVct87u4Y zE0chgTB$56c%pPv`qqL`3ZpETO8hx^Pcdo|?`eZUnZ^~s3h)hqHBFVTZ8 zp_>tW4>BFUW-Hd!a_$vP#pLQGeeENL76g)}B|vMGNiac3oh1ns{&d3l$rE1x{qG#V zdPy;xUVge_H2vM{Y&`gk{-3@;ZtPHZQY!H{k#nv;P2l7sTV)YUUci*E3bN6NkU2ay zIPijmfYE~PbjWvvY+e!ejwqkLpg1|EDrPwAE^u9Y2sO@?9L;7tG|)|QHWR~UlCxnf zsR|@YP}nH4Ah9(lyam$x_`#Jw&e{65e}2~tIF?oF)dX8X6x3!3tcYq@UajcusyyV9 z)`kf}j$lO7(S|{0xSnXruA=f#d$3+pIYsGUW`(g;jI80fHXK$_AoHN`?9VOx^NMj% zGA&EWy25+=5rHexfGQcN4(N;|>(I+{HaZD6JHqXb=VtD>m07N(j;+MeHA1EZqoeDE z7K@gOj&gKV9Y0c&i6!+86FlPHW^2|upZKMtieLVA`_5axCbw#r{43YkI*z{RUHkr5 z=qjipXhJZ!kT7!@2X(@enda*g&o?JEkH#gZrNv&TV5p$elyo>GyK#+VcLy~b;PMnP zg7Tnii*4AZA*|4>F6b4Ak2bii6C zfE0XSw!hEm4?of!ZjuZJm^2|XL#zfTDoWr;Ou~J0dM}USkE<_F79JMSMqV}gH_Cgk z6~1!VX^GuC!M)nYzI;WwzmFZA66(4+(5}{~iy7mCr<}b0k)*#vXXhR!-Nb8y@@c#b z#h#^#wk-Z%2u!auxUwD>IZ8uxmR*l^uyFRLMNwZhVyKZ4Eku@zh(;-m(t=j8impP1 zFUORp`Slfq=6$)%cX+)hmi;&q)S77<54gR6j>&hM=OYA1Zd5 zO7IH=BZPMas_&sW;|w`Q;=wKPS5Z+^SSy8=_%TY81VQ^K*gJjpoZ}yV;^^@sipe;N z^Ij&XqBMD@&&H>pGWhCCk_Y#(TSIKBDe+h@OG`%Y5f_;%OZxCzyq13B6u;3!+)`MZ zzHQ$)U`c#ne8(Unnfw_aJ6~?vVs5b0ZhS#O=a^`t4OL;v_*q>?+ zXTr3E%GQf^$}0`3NCJ|PCOy)uN1k=q>~^`{OSsw9eA@MV(zV>qYi?w)l|s)zq61op zmHH4xXvJG}s4-NSP@!?C5M6&b2Q{7jb=hLNS}|^m^o#et0;+^72?4CfMFA=2M{EO% zx;`QrNbo+T^eM-c;n__1;necvwB&eJQrnh2c5z9y&U2E@4bp2nsLdgCb1<8d2Zz|IWO{sf zDJOMZ%$U4<$?@0U(7kzs{;*Hl?@)IPP6RIsryB9y0HJ9Cj3mNk=6w~x&ok|VP0>yo zMzn7GQbkZcpeu*WO2WyQdhdYn;uY1i7nJ*lRFetb+7IB2^edt;XQ}2>PWK;^4X)9< z{uybugEE3@z@tScmwHok3zm+RVFdua(pTSFW96d9d=0F8h{*UOc(_%TO4Kxu?LX4= zn@i(IZxk5qF*vXj?EHZ0@HwOX=bWA#QWWKtJyaq?-crwI6bFaQU%Vu24l%o%s9uUO z3U6ZI;*@H{C4B^|Rfx80LC#vPU3P>Oe&%2lSyT^D@zPTwC!=Ieq+? zlgE!3AM9amed+UUl9cYoHp2%G=zjhga{C5lze8mdRdCb`V5MQGw9ZQ{wNlRDNdI)8 zy8709Bd+JXC#dLlrIaF=1X6>l!R&66UfU%Z4$%7E4wp*gKJ zrB889TSbKV93pP1sSrMvLr{L^ZO8%?SXXv_#o5(NnWG^-gyr6dPkeou417x=tWalhlZkp(tWPuF-7?Hfd^Vb?iJ zu$JIz@D<`~B-9K0;}#TgOI-Ku4I1YH-UX<_IV~-Iv5EILC+_QUH35}XFf=B3(S?d& z2qaYAFsc-<=7DFEii3F+;D-xljftT195WnXwlgP)wJonaSepu zw)!F=;#_ehNOShJz)HaS#vv<27d^Te=Eg3)*#m~pUs8-tn4g~D-Nm!$oU;@sN1Q%< z$mWAj$!}jLy|F`@_M$MqNYq@RjW-&Hoz`hkE{2hNp?A&OWCI%o{bjtVV!Rn5!`oPg zo|lBvDR%!5`*M%s0cSg^iVQqcs)dK;t;gI2j2MoUYlI+1f z+|DMY2^1<&d5;5Z@KMtyghll|T>5H{$)fks-Z`L93PdYN45*Ya2&kPcvYXe*cD6Au zyU6Hx$X# zB$-5oxCX_qfPIao){0uDMxneT@s4id*>-^&F6DM7;eJ=~tebKp4{Ri!Ts%*LXMg7L z-d))_H6~%u>9F1Jb9-~htwE3L-JE+}#l4Q@PF8a_o3oV`bWMRaHA=hKgVnb0h;Q2T zEJ7XUvK63R>GJWbsctw6u)Ou9%G(8J*E{JCjJmW;;zsXI(9}*bt^)gW%W+XMuS=lf zqJ^YI1k>-5Y!1*{LqaFR8y&&Ig%x}RHx_B9zqqfy$YK2galzwpixzDaflL8XL%O{| z8ie7&pD9j96elOlPmXYPb>Xk3D&~xj_Bi?J2RgT})46p6(@9BFLycgRL^qvAZzjeZ zd{BLr-+K4NB3=Wgv4@?E zQ;weg9o@f0Mv7zs?KK8)5R=2$59p0P$@N{b>(@v(hUkMmY+YUO{5AG{LE(H!<#K9o z2%*t3Y7$)W4K4L!1O-;#={w4EEjww=T={J)XZ3&(eg;@s$;_o`DUoJF#COs-)C2{- zVXU+^sjaqySd^+UQj_YMG~{%XjIAtTCliK7ld6>9ErqpAYsMa{gfu)bxh zTr8-fO+q>xVm3FC;Q*JVI0Y{F1sg*`w2k*+X&(>&1hgLB7FLJGc_6GqQpEEo@qBuIlemBRBE*@C%!BbZS<7dz4|M-yJ&6_0s4kk-TJ85J;OTZz` z`Jke{iju}gJzUB1Ls$V-+83atE#SrYSOdlfjPpoU;U_cf{yy{9ub3R{Q)@AUzpA|gSsZa_9wI+l91t*MjF;3A=)v^La@)DS?OVY^8O)#mDze8)~L_h zz!e&Ol}Pskr3Br8Dn@%U9mrKh8pf#kYbLM1Esme+?D_KO??*cESwx; z4i4xY9?_W<=+dHWh=s_oaG6Ge;6x$fmzVf^09N9q7S3LBO`szUsG?d*rYI88q$u(r zWVOSbPO(p(Gx_>Ej{f#{CNEx4y$8Wsr45~pEe7{LVfg1iVea0-Zw;vP1nWF??Wt|7 z;DlDJw$WOVOPSMi8Xlo7CC9)V?&DpZBtq8@-&*Hah%eE8(+2 z;AU2_qoxdHN-i_Bnjut?h2mBOwpz23){V(G;=0X-YC2qBn+wUJsXOtO(9W z5%{p;nkeBN2l_v8*vXmuBNie;>-i^*q z<(v;p4-ObVe#+q1EjDgl!wmbRd4?5*RgIgQsD|a%o~7ZevVORv%i*7mo1|&CYJe5h zw3_P>NCFt=pt9Kc9D96Bd3;1M8R0%6n4vBvj9>jok`I7Dl6KJjy9Bd=Q+c!IWT|}> zIOFuR3TMkzKl;|=BFD@C)Ac;Ow>;t_d+b%4VWLQ_jy>g>@#MzQl?i(On(FWeP9FUm zCog{dXh4q?%2rM59zBC0PNm4dGxzFaG|3vRkpAoKYW4jrZ0V^8k z9oDt;*|Y&QpZ7PRVNvpLH7C>}xe2j%JWo-Z1CndIq}!XAP6sIqF2nLF5UswQbA;fd zz^FvYizrwdqVs|*^%_3z!*PAPf2ecBufBm0J6ojvhgQ5LNNf{YAbKmFuPU~_pkiB$ z5}~Iuww>WduGmgBgG7_-sQGji(JT>#(VA|e*~%1mI)P8SmYZ2g$|=T=QDF+90>1*7 zET~mN>m)0!o7t+P4`=O>*EP)b_@}@XRB2B(Y*KXiNTkjV{Toe?BsDsB6a1!0C zeG94(-jjgaS$?t*P%9K>MNE={5Ao788tLYktqszxO_F{eH69at*f09g0^SE)h@U{y z)7&mD35W{l6{7|JGi&8zNb=A0&acO%UNbAE8Y?YvOU)ILl|Ljzm!X9YOQXfoIuke6 z-*H_=hZ2IuIiYk=xIpdO^(j|!=0Xrk7noFzQBhOY3Kbk(U8AHzLIJLbpo(jd%$B9n z+ynlM=}9Hw1sc5=?WJz*B1;mG_3nnz8sIE!!F8(l8 zMq|1i%;p9%?Bnxvsuc zal=`K_0p{Mc3#fLu?bOi;6z%np9! z^!e9Jj$TvFKkm*l?;Nfw2~`EoHi3*<=vzcx3;)J7_x|ecvUpFeMPF#eYE=}nQ%YlW z(*|TAo!8jCBZ{9MG5+Z%X8U_sXWz?wW`hC4`}f%R@^d=(@4!YMo9GyXd53E>ReXr8 zK!RUks>r2I;rRq8itWWMpxTQu#43dM;FTa*iXQYxHijhq0m|%OS^(n%)ILyqp$-Zc z6alsDw{HS$y;9w3leLfWB45WI7my0dub=C7zE$%ZKCIX_pZiaWG#E;gtOVU)C@r|s z82^Ug2;Navo>Ad=J%fY7aawyS-x`ZvwS^ZoA*Pk%U|#WjQt)~zjJi-~fi#Qf65_zF z*!i^JiVu-BwxXG``Yu*MtTPVE!j(&${jQx189j1mf#$rtngJ$a33$H*1L*wa>V%ckMys7O4{Eh z>+j&Tjs@2cqE}-$|DM`5wSVY}z5>C-di*oM%49tce{gK&+%9YPnHCyrF;60pD(L7y zuK`ukVxQ^Ww~SwW&FIx5%BuW`TN0YNunu1o_;~@9jmdRmT^xIviMKRYpx;#hr3hL@ zOH`#1V`5LSXfg|VQKR>dnLT{W=<9Ddeg2eka{6AL&?rrR_ZmBY`4{@1Kfvs6QES0E zi*>%~#r6c(YO5@17w@}4M4ALECYntfQX^>Vor^B2fEb19cS$xk$Tv4IX^N5A36U0(DU6%#mi~Uq;?lCM|4qh;RCa>;^lab53peZT}j9V?r$XY z(btsI^exvB5`hu_;EpA?kivtu5#2jw?<RzX$%nJ zJ<{s_tj8aAOxD249|bXyv&eT?Ii5o}TeXSQzJOK%BLSl@<{KVf=0dM~Xdmp#0-*x4LEnG)tD;vz>tn#(U%7E}zJ&l+XCFXSuYIxAogT7l7^ z6-q~al{6^QszM)+s2@LN^4$-Ne)@^|=?S&H+)GXXlcWrZN}u> z5H$FNS!sARQT*qT=l^@)_}_2n2=onz_}CEljOY zdRd9k1U;L6^?`dkhZ_s79x_pMGR^I*Jy^7kaV;thJoJdP(QUpUAIYBOmloMo9WO zsRBe{n^x!mv5iWWLf0SWj5ueVcn;}XbzNE(9VN;J1dysGOy}6q2s@kMKhjp9MPA@6 zRWado|0zj#i|)oXI@c3)rocp3AOZyC5nKdUBrID$gS=%r!__$V*Y&M6u(Hk*F78p5 zw#qE~B~c4nsn#B&JedllswP*KTq;sOCd~FJ4j*&+`XS@vJ&Ll%{|;VN3#_>DlrSrh z+M_~)(689cu?nn6t9*a%+Lw!YV{aM`3!wp2MC+AbHKHOVGx4Bj1%B_4*-sBS{plx8 zU%sF$ic6>CYi;Os`)q&ufSoV@#Nhrt81%6U>bk}Ti^n(312G7Tx+dWRw6MJ8CAAr( z_XO{7O|am-#|x+|MfZE8!y!qQqqK%gXsvQVm|EDc;MrWbJvVG7hOROsq9TQOWvQu^ zV%Ri3)G{1Bp6MIB%>HFQjeP6A2=lqx`5&<%~PG4@#4BCmYQw=L^+`_Gk! zGOo<&d8Yk`v!F@{QJgHGsA|o)(i~TTkyRA-Vg=2k#j_&objUZiNv~hW4+r=>#pwuI zI6OW`1I~t};0Y}cI=q)R*0N8<`{wU;cmaz;tc~|&CnLFagZ_gD*wL8T@e%cWPFWQf zA5#X;?D&Y&Cr{~Y@1Sn%qWc}v)Zh{WMxm5M;olHe3=)>DP4b}^AuCKgSvpdM6&2+c zSW(``7NF^rdUT5W9RMp3aIRuo7J@gy5MJ!ow4oIp`&Ql+MXb!cIq#DFbQ_ zx(4kcC`^=^X=D=O{#`Gj^|+uts8;si5>!!yV5qF-xKccuDW1+8dj(8fWISHfS*k^m znUulqbq05Cli#_8-xy-E6sIH#(6@RLjWd?4T4G&(-oLo>T4%19`~5VRIguM%H!6yWU}`P^S7_bZeC|F9FTRpFjS~SQ!9;x*bd}G zor%xosx3$zh225}s4P4)Lx?Rvl_gAPxY3yM=!AMU$6NdHZ^q!MW+Ntt&p3M4r@t{| zXoTK|0-dAL7{CUFb&A>xYQ^B9CkjZK0d)7pTJ~_R2Jnt zV$>o`@v;;{6IpV;CHz9p_#5BLn_yUgrY%XdMkPu77=!X)YL6~!I2=1sp;@Pwhh-aO(p^|M|4RD zZZSt~>}-GLLRtsYS3ZNfGJCTXs#PllSRZ2Rog<+pVPq4Y%rxIm;D<@z#oRNl{e|fn zDIiT!y1gNT+qdZ5yGwHGCdF_-NE4h=IBD-pzXVo7ShS_SeM;q0&ank!B}6MS2h^)4 zkQPKG=p;qmyhg`+HeSA@7@bm#$J9lE_ZQpN9zvj)oHBaxgy9cAl3(8?-`Pg;6v;D0 z6pqknt;FJ4@U0Z_*>~}wmS?;d6ux;zL?W2x8#hM>QdwkH;*LkuheuS$$GEb*(D{@P zxMPDWDJDmpy!wgZ#(>0lwlYOO*(TLp3X@W}gwhJZDnf{HT#)l@?C>)-%Alup^>kXJ69b$v$ zqC2#$bDR_vNJ&3Y>}HBvc}gxRh7?g1Ml4GFvUViAC%fv)NoeGa6|e?cE(=U~*9@(@+Qy~Z8xHA2VC}xz#_7xLj$lxv0_gY zp##bqCi4ia934}QMmSqt$SzuCZ=J6QoM+)*-f-0Agz?cUj-PkwWWwe~PIueWNq5N5 z=sE#}+AFL`vv=F9pNq{E@1sirR!)HmNZ0f6ySkfyb|pm|54qOG#lnlv$_ zNk*yyi7!#dBc@+}%hA982M6DO$8#%7G*zUmI#G1 z6yhkc)IMNaV~w__7~XUdc+YoBSefzGvXbBl4K>#jEtiAQm`;vtZ<61>Meo%f_0ci& z`Iy?-3j(lO>WszKC1Vs%$HJ{V<3ZQ3p;J04LsOAyA;ki2@f}u3RKF7_U=6N(h*@6+ zRb-LjX&?bIoXipgxw_s1QA>9CP?FiP>4 zK6J!mS}QIrfckp1YVZ*PYaYbG%@@8Uz?FdqXg9}^px`8 zkm}WIlB0Xbpo{9Hpd9$-TQ~D13mY51a;0As_|_cB4Fx}_2r9MA9UUMELPr#N@W^;Z z`RqBTUw_TX!=IR(o?yMb^lR9p8NKamY<%%K-7g*xZtha_GD;)NH56W`jH2?9^6LCA z&yl>RJ7m zwpyW#Q0W*;L5jMuL;m0sHV%)N?!Trk3hLSH5{{HWF&Z&>@q*dIM|R=_4vJv5imC^|F8yD{(xbE$O^EcI18%ifL0z&g)c`Gqdi7@ zPdPn4U_PI{7hM%CLXxI*`W?E%P13xJNitmU)Kv-d88(cmeSz4Eah>qNQ_p6UM@N*e z_Q(&8kgW}*-;LB6Y5IsoA=0o_e52&Pu(kfJWy*6vLs&Ldx9=w?X{@jXB~eP(gh1j0 znf2sFjXOGF`sfMc?|)$O`X#lyd^L6vA?ptq+_}f#%P&ao-=QA%C=;O&PYF~CYDMhF z_EDvO6)2ahwpZFf1`k2urO|}Zf+QN<%}F+gWH)aRZr`SQ`I>Szp{h!3eNn)Qhej4U z_`s~voRo&6(r{WU3YXwQy7X5Pkl+ys%i!y(V-lfR1#j@U*PzOW-UN%b%eEasDH;kR zK{Be);h@g>X$t>&T=V@&#p`KBX&XD@_lm|{)*6X!K}9)d|1{yhI$d_VeQtC!HcU;H zSW;!ddqhPxV{Fz~#?gMgg4bZmKe5asq_U!ahiO`YG!v^iECa9SmRGZiX;tA|MJvR7 zA&eCzNSdH~UG&BfwK0Hx4{bnsi?SYR|2iLH3>21HC+~gQR$Icu5>!D1rxczV>X>2MS(A?3y}u+xnZ4UHW_j9(lUL$L$}u>&38!XVI)JT zG!`R7HJ5>`6lGUppKvzz|M2FB>)Yy|1XgH)m6P>+yyrOZgFVEGhPp(j8`U@g1*Om$ zj1Cy>NfacZK*|%!5*+-r+e)_z3n@sc^{=Tww@rf z6WnMIWnUxq7^M2A^RO5j1nP25aeU0|>2o?yUt)#>=y#!GkVK&u)sCj^Lc$UrX@sg4 zZK?n0u_oSwBCjO68Z;Nml>%25;qndv|D0ng|I4vsh z7njt%@l;KlDvLJORxs1W&xQWIOV${!z!jP&#~uDHPZ{PpTj_vITdtY9$>t&$s_>{* zu}sd!(ChIr1ZG!&ts*P!KuT!;&$rHvXlk#RxxlD&oXjf5^8)J%A{g&4^kF11NVkLZ zd#GNI(Cs4P5DUuJad(DBMIwZig8X|{P(R~jdp2S9%~|GF9L@rQ6Crdn^z|L`;xqbR ze8KGX9@D+OOL@dPcqYe39DM&h>HWL(Hv6bvj@j&z_Mw2lph)k>sd)SI>o+tP5JOKv*#};Mk8#aD{>)2DOB1a>2Hy5UZd0B zB=7VAaCJpBKSdqAL{1KHqeEP6qpM=zz!-dP%>=2a6F`M^EZ+=C3`(H_SA7IiB3Xh-ep-x{QE`?bM^8#dc zA!%d)Y;cs53A2~4={|W*zO?~cL)2Cu)6MWYiG8Mvzs=)Uc`7T_rtoXTMBkM+HW`kr ze2gd(6ls9m1@fxIObYA|PniDKw~W92fpRp$xyu)hG$vtq`wm-w{R1ghY$E`n7qL?O9_rXFt!v&sA3AYr-Q!s-eL602|cM$FmcgG5kBDaZ{``9ce62Va=t+N-GZvTC`m%E&)+JvyW zGS(OWWo?DGIj=1p*rL61&?!iVN!{VuJmGI6&)<(K9-kDP7A4NrmjLA{kOZYubdqCC zj#dVt5gT_E))hEcf~z6e3;z2ZP=Qy>remHS=lt)y!zcZet*p;5sY%44qy}mPPg~Gk z>_u6+$*sr70Ipn-r<2uIpa`z0#*MJ)zF=B8=5rD2R-zS9r91_(|z=q?(-Lv(+Tc^t%3tk z6f;H#ugSmrjWFT%s3fZ0k4~0Rn&K0J$uzHmt^Gi*?ulE7G>N=!Wg? zF||XcbKKqm?%4~bj~+8S+^3vRxyXi45sjD(-Pt7BxI?yelkV^u%A|N#Q_V*B>>*x1 zrm~)Te1iAYGLdZ5q?(Cp?T@uyDNP<>+!7}$g7UWtP>V=Kmn%B4n zR@UR=Nl|zwxUy_9QLS!=7L0~eJ2Gua!xUBQQ62uo=;_}$dHDmAlLKt(EP9S)X4}K}; z7&up5x_Wyjv^;+0!7GAzLSsdaNfD#bUZHljNO!g{{XQy5F71f|7VBz?x~6an8)DF_ zMWLI0+_vxjD(9E0ho`);BV=9XztlTH-U6&F+J9J9&EpRmREC$Fk;`~A(|mJM@zbc} za5`^-*bA8_4tG12ffNYyCJ_>pglNCalCk2?z@%4vKmOr&#)tb`WP}C^vkm-zi?~wBO3nnj~Garwr>heNYV-SVt z49N!Q{x#Cg`{cX#(OH+^J!U?lmYm8f=Cdiqe2%SaF4MEr0do)g#|1$jU^+js+4%%f z+a%pxjAR&L zrlV%0)hnvQZ#jMVzc_gKADkY&elMU3fJz4>Tc45M`ky4X{_n`m|4!H%;*ADtagyOn zhszFerjJu8{sIps4^*~hHXSi}{tUIViN1Y}WTS`fcd?@J+F%>-AgG8&M}DbafF#1N ztt^D4)?0I#MGcomPeln@bOcqDCKW{<6y4gPk4~w7e9GwG{>Jh5KQK8t!oCN#O4c8+ z^~nQv{`yx2UpzqV4sqR#S_Nt^R6axt;#RQBN7n#Zp$A_@jTH%k^57&i6#q6ulIQ>> z68DVB(4t{;h}qgi_j*W@T+%fj;XWH`3Rh8igA0+Rq8q{K2*O1iXjR|g<7uM#rH*m= z;EB-hajdqDsioZ3S$k!rKqYv|nEITjGsC|hI{xcm&dc#EvPGzyQ1fD+PN|eM?X%I_ zV!OY^)?kxvngLMSnv>atqe;ri6pG++-d!-TvbYg|8S`?)-m&5DhZ&#rJKXCH`9#m? zt7#PXRW%ag{I&nfa1K9QuiiDl^7FCU%HEU}fFlSR)tv8v+IuSJu)zVBBp9t!Yz4{^ zFebXeunM3wch8wG5k9zB#Das`ioW{D{0Pp+w(0<0Mb-)-vTC&!(rY^mKL4ELc!D2K z7?maE1#8s>zzAZIJtV(zgN@ra$%aEnQ_xMDJ^?39yOL5k@r!v4mlQjNl@ss$ zMWK`;5sgs>qjY5HS&tu2DPF!{`s^v=*RLq5l8cT&Lx3O}F&#{28#BB`vi%vRvl&e| z$|-rs>3U5un^8ph~UcG1Zl65YkBlsf1|2oFEKg;iD9It_uKV%54mK#Xo&q|_=abg0ww&XG=w?~ANpD14bo#Ur}V|=nt zSzY_^L_HgT#$SS;m>Ok+J|T{1q{ zL%)1U`sxmyySGSPz#D_r2~}`-=WuTvNpc2U`7HreXe;+CZCaufN;Fz&Ql-g>Y?b76 zhJE&m$=Ba;^8NRWU%#TZ_2s(&nS}oJ8*Kmi&kVkJKyqUjml>P_D^Zc%1)}>;@QC+F z2uRy6%oPDv89WK4&v-sFe0}2hkApeS zMl&YGya81%0dyCQF&Vv1kL!aW_qH~y;;0qoj z-cBjzhDS$z{?<>p+fC^VIvADHRVnDYN$LWch|PMxa=wQ(u=3&KpsNY0oCiAP+;6sw z6%d?#SXn>Uv z97aL5Iiz#{F8O%Q?AbG_`IPG9=)z|=0M&fXbbp`8!$63Oi@cK&(%71>BpSI3 zvVhI}%6GeTeU)=FD7{B%S%+Q-@wJKDSSHRpg?WjQ#WknFv}_g*pBIKgxVBq|{lg($FI zuqxoaZ`djys0HW^IXn3k=i_?(R$%35Js*FRfa2_x-2#?cL8^QNR@{W7++%j|1JhUE zF?!wTs`&R{o2N9UvlVH6*Z+dq`V8q`BjhPQZ5eb5XS#Sj!0A3gG6MR-k0%e*&M`Y3 zkscncccvdW?kPpBS0 z=k(j}7(IK&e0+N8$Fx$4tlML7>o!||`V*Zyw~#@PTEOBLRNFxFYr|9__(c!)l|RN; zpHqm8o1l=;IDRw^S{RMwDXQB+bvnqU0xMCcru3e|1!~Wdiml|#WXe^Z+g}sS$tuVt zXTZv}-pVE23bJIWs8+akfvy-VDW_G!PhOFFn${rEg7mv2H?Co36~p`YnI7yj z86D%o#W$6>;3-Z=OrAYs^Z84%TQ^8Hhj^6|lDG;M4BwW4`i>Ur%W?=>!PpiIYNHfc z6O&r+si!mQqa(`GQ>x2yqHJR_r4W-LX&2HyA?@HLvMK4_Ko4f5+ehTbk%IP7_ z`Ac`Gs$F0*uQ@qBCfPiobK?j}wlGOfB8HaP6&rwTb4Q$q%Xmw?^C1GUb))J(IF8o9 z%7;i8KG-;SRm;-iR1q-ZNtLA|bJF?%fASNP7k}sU^%JJ!X*`(T1E`W@eY)4bqI2_q zkX`#Lx_=$Xx&+mP?yc(_3a=7^=Z#eko8>XknSnn?P z9RbFqY~H@h_7`8!|NH@JXPY`psDqC}wKNL$J}hmEgGYSRkQP1;?F?zap}3|LqC66s zoz!+Wg@Do;)y*;e9y-raO5-l6g6MnGSOb6Zp@LU*3 zE9d^9X)$hNT%{CRDH3f+ltx^D>5OW0dMOswOJFB7V823?0ZH&;@a<_E6xIv~-5Z## z&*C1-kAEPBh?K%0%bwV{pByT95=s&`g6S)YgCCjfKV~*Q zq;~%DSrDQ~IveC$pU}Pa-^gzKnPlTGD(!{oe6vclt!fsVturk6a+FvC7czlTZ^d|h3N)t?P8vz}2E7}dhmYHDxrA&SYx`!c-Y z>hf{dAKt=HSuNv+HMsK6q?K>jD=*Y*6{r-ix|F`dld0kVdR_6qUQYSxcuZN%RxFM$ z{6+v0w9Xi$DYtuy&-#up`vsr(pqs@O)_LN|yrnK`MiV&74P%p0kT%a%U&8an@9ga< zM`O)*0{__?ayK*F=?oZ1iBh())Ld3d#lIWeT8}lj@;0z@dDO+t8G^zG&D?8FEgY4B zaqX!t;jYn2k)#=&on1P+yClOQVhrAUd|l&};Ju41kZ{gs`9saJyxk<=tm9wft|P=4 z3k9NMyS37Q#`ki<_K@t8yY!ykr~l$P^{eN&;^N!kZCz2EjyQevi0-W$bZ=ZoX9=k> zgw({d#(}q(fFWZ zA)mdi=@T|DXkO*D=*U4Xhll=i_Q5a+ebTEZcqpt!-}< z#*!xR6JMk39I?mLr!SZtJZ5^bM=_sq*<2Mt&?Y78U!!;9D>^s+g=G6vRCk-86M~lj z_&^80=%CqXPz4L#y6Cl|G-47&8$_w5U-se;1n(?$F^?BV2#8kkT`OvXwW(f_<-{c+pus#nqUS4l70`9r8s9Bn)C$+VLmW- zfl(DWu7pvoDV(8e8ek>7B|!fe6S!Y0zpX`9E;f-1tHrFPSZz=_PCAV0oF7N$_#hA@M*W=UJlpO0+mMSr6-Wofmyd^zvp?;RqUq;Cn_U& z+khaKaWZ;f&a8-l^4ABNF9u!yw9zNc<``WeSO^uO+`@8sbuTK`tw8JX4p8N-YeMj7 zESjm+j4IDb6`0s?;lPR@m?R_b4d`9F9)Xp?0MQMwVr>+$4NJz#)t}&S4uls73M4GS z0<8(6aT(Ztj=p`J&b>Pf?%ZK~azu3rz)J9*x-1w!e@^e=6Z&`V(cju2?RLNzd;seL z&P4!A5S)OQfCP!H*XP#EMG=Np-6>b>;m%B{SWhTxLT%v^feTTM*@lV?T_2#f0at+) zsA{OaB1jI|2FdU?l*feGYwF1X-WK@T^wPu7x|%Vc95Ft8M(_Fornig9HzNTwfc6&W zU9)9WlV3%*$<>lrtI{a%`xFY{f|0sE)HqxNEAR8h{Ll~3lp;kMbY3KqN+qDgp zg!1$$v)2zfdHsaxcurNn2eyjVbcWaI-~5XHz5hva{VSw@3z8fsf_DL`XeAr7%K+9Q z!K1WBXB~9bL75D1i%U5Vf_M13!c`^S+SujN>dvovAj(pF_Kc|8&&Wb7v{c$Ev5p_n z3TY}Sf}n$7tjCO|)K6Y=`d?pj{NwkG5BD#nE_-GLiI65K!y7l*{mWk&eEB)a&1={^ z#VV-r)FF!2`b7)PSqGqxcJsCs=diSt^xjc>0q0|YlO~vr4YJKG(oUbcDDjujB4I;d zYCZd<=fxae6q;*!N-s%BWJNpaV+B;+nri%76lOhs>&z-*$In7nWd&5hNZuN%@t_|sA9xY38Pn1J7PC<L1KQ}K}?FrM7B!lupvZX#eug1L8DZT>F$ti-9^{O zxamIPDttM^E|?;hx4`OR!sOr?ll@2N&X8Vr10@}_R~YY>U<$21o+7kvtrrZA{iZW< zeG#pJmGx!+OLxbTUM3CQ5oKWELGRHLFe)Inz|Qw6UjM-O)k8)Hd(6uk>n?Y%DS;$O z>1^MnbNwsw8-GP@+#{r$IF-bHQs-lCYa3+_=Ljx3FX$v8=?wARO(3d)T|UBn8CLXQ!XgN=-ceb>JC7$|5(9%i>DD%#t!=8w7*~}SFQ^;>h4mbjj_32h z7b30sjo3BE&>rvvdNALMsML3cAZ_ z-Qm$V<^R1`^X~@*uf{V6JVfjOVEAp1TdA`FjAcUX^!7#T8$CcrAA-pOA2c=`~JQpQ_7taJm z*6Y!`euLqI2lPI@PkQ4Tq1V9~O--P74okp?vs!A%6`t*I?&n5$OaN)X+92QrtO62^ z47$k8Yh<6@r}zC`%E^S;(f*~JCbq7a?(K2>%{O#!-@pt9WSyK;gHus|&uUGjRg4)M zOZm_M9kDg2NzI!W;8)Mb$_r~_(ilI)f~;2>uM}PyMO?D(%nkM)tF><+c2M2;D z&*I%xGcr9hE4wQzG9vqncY9ZQWxBhny1O!~k_G`M&fPCJGgUqNLG2QEID%yOMFt|= zLR{b=0oXNDa`ZhfNl6<$q`8i7_6Xx6oUia#OidLZkTL=*GM>V;ghYdcI=WBIjb~98 z4&uviL)2UqdoEsi7OQMEScA4UvTnx4sQ!rQ)8`Dn_=3~Nj~I^!R4X>D)k=|M z8QojA>3#4)G_2iPr)*@DCW0!i{;ES5mz2Nq)f@bGa?W0;!j@8Mf&_dBRLa+}c|x!n z-D+Uh*Jy5TGd(!KjmK2tulTlvDg@3d&#P(R$rx@nEo(_it`agViK?)(W14zb7fki1 zE~?kpSJY6mzSzvHcA+|)G3G2{GMviUFEW08qWI^7l21>jjEfRhDh`cz*vt}cc2a({ zVfpD=;DeT9Bbkyi1y@8zSQS%)kc4KEajTg#T}wEbD)z>fVUaL(mda^XyORlJIp)dP z5V0*j=ylm_G+E0$)|BWF{Z^C~RFGwIW8}2S>i5~}>)l|hoKsxP>VpvLH-}~9EJvl~ zG~Q;DSmvsdk998-yjlM z+s+XNBf?-n7!0EnXa&HEs%ub_q?n|IvTeM|31SIVEt66+kS|uC8U;E50i!vZt z<*IXCQ(eu~ud$Rluu=jC*TBkm1#nqG89kE%X^qhaqZJ0hh+slNn4C}?KjC!$F@v)s z##QX7t+p=-N!lRq?vSkC$8>Ka=^A3PxadegypKk;K_N=lOMpiQAH7GC2DZ5g-J3AF z1CtX92}p6p-Y_8`MTzu>$msw%8z2V6#vNJ|3&zT8nqzh8tDk`?GIw5&8eeTKI!V!5 zlc32wq~b863I6#jPXFz<9De#oP7n8}oLfCxCCzAVY_az7$87?~Cf zMyFSN3>AWSMwR2$*zsB4vymmVj3p&w&1AHVs}qdsqW7Jos$5^IDxsF6m5r_?Kr`Bk zwxBYcG}xcy{OU;YA72#w`e4GrxM0=UQc;FrxzkDb_q!?o)3)O0YmVK(O{IR4!p0EUzY($0Nm~QQ+m+aaQ^|YWa%pLo0NW zkaasWcD88Uxk-9s8@JxWH7pgLN(mJ+P=zQ9xd80E6XSVqMn3~pJU-~Uc~S!i29kCI zdt-;*k3Pa5ALEXW81zqYD==!Us)AAfgp)t~o~+j;?Q}@qyG_zqCu9*|sf>#CXcf~I z5rtZu$G=tD*rGYe9B~&NW$Dx&ZsI*sIl`!*Iyj=-KcYH0BNVGK?AHnst4JGNY;yyZ zZs2tr2`SDAPPtfPDNy22I7EfmOg1?tU&E~5L?#Cm$4{6H�<`RR^7h5E!5CVUwIR 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

@@ -160,21 +163,21 @@
- +
- +
- +
@@ -186,27 +189,27 @@
- +
- +
- +
- +
- +
- +
@@ -220,9 +223,9 @@
@@ -237,8 +240,8 @@
@@ -250,21 +253,40 @@
- +
@@ -104,7 +109,12 @@
- +
+ + +
@@ -130,7 +140,12 @@
- +
+ + +
@@ -152,7 +167,12 @@
- +
+ + +
@@ -189,7 +209,12 @@
- +
+ + +
@@ -234,8 +259,10 @@
diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index ab0f3a2..22b236b 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -6,6 +6,7 @@ import json import socket import atexit import signal +import re from flask import Flask, render_template, request, jsonify, redirect, url_for from flask import g import time @@ -28,6 +29,120 @@ except ImportError: GPU_COUNT = 0 GPU_NAMES = [] +def calculate_training_progress(process_id, process_info): + """ + 计算训练进度信息 + 从日志文件中提取训练进度、loss、epoch等信息 + """ + progress = { + 'percentage': 0, + 'current_epoch': 0, + 'total_epochs': 0, + 'remaining_time': '计算中...', + 'current_loss': None, + 'current_lr': None + } + + # 如果进程不在运行,返回空进度 + if not process_info.get('running', False): + return progress + + try: + # 获取日志文件路径 + script_dir = os.path.dirname(os.path.abspath(__file__)) + log_dir = os.path.join(script_dir, '../logfile') + log_dir = os.path.abspath(log_dir) + + log_file = None + if os.path.exists(log_dir): + for filename in os.listdir(log_dir): + if filename.endswith(f'{process_id}.log'): + log_file = os.path.join(log_dir, filename) + break + + if not log_file or not os.path.exists(log_file): + return progress + + # 读取日志文件的最后1000行 + def read_last_lines(file_path, n=1000): + try: + with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: + # 使用更高效的方法读取最后n行 + lines = [] + for line in f: + lines.append(line.strip()) + if len(lines) > n: + lines.pop(0) + return lines + except Exception: + return [] + + lines = read_last_lines(log_file, 1000) + + # 从日志中提取进度信息 + current_epoch = 0 + total_epochs = 0 + current_loss = None + current_lr = None + + for line in reversed(lines): # 从最新日志开始 + # 提取epoch信息 (格式: epoch 3/10) + if not total_epochs: + epoch_match = re.search(r'epoch\s+(\d+)\s*/\s*(\d+)', line, re.IGNORECASE) + if epoch_match: + current_epoch = int(epoch_match.group(1)) + total_epochs = int(epoch_match.group(2)) + + # 提取loss信息 (格式: loss: 4.32 或 loss = 4.32) + if not current_loss: + loss_match = re.search(r'loss[\s:=]\s*([\d.]+)', line, re.IGNORECASE) + if loss_match: + current_loss = float(loss_match.group(1)) + + # 提取学习率信息 (格式: lr: 1e-4 或 learning_rate: 1e-4) + if not current_lr: + lr_match = re.search(r'(?:lr|learning_rate)[\s:=]\s*([\d.e-]+)', line, re.IGNORECASE) + if lr_match: + current_lr = lr_match.group(1) + + # 如果已经收集到足够信息,提前退出 + if total_epochs and current_loss and current_lr: + break + + # 计算进度百分比 + percentage = 0 + if total_epochs > 0: + percentage = min(100, max(0, int((current_epoch / total_epochs) * 100))) + + # 估算剩余时间(简化计算) + remaining_time = '计算中...' + if current_epoch > 0 and total_epochs > current_epoch: + # 假设每epoch时间大致相同 + elapsed_time = time.time() - process_info.get('start_timestamp', time.time()) + time_per_epoch = elapsed_time / current_epoch + remaining_epochs = total_epochs - current_epoch + remaining_seconds = remaining_epochs * time_per_epoch + + if remaining_seconds > 3600: + remaining_time = f"{remaining_seconds / 3600:.1f}小时" + elif remaining_seconds > 60: + remaining_time = f"{remaining_seconds / 60:.1f}分钟" + else: + remaining_time = f"{int(remaining_seconds)}秒" + + return { + 'percentage': percentage, + 'current_epoch': current_epoch, + 'total_epochs': total_epochs, + 'remaining_time': remaining_time, + 'current_loss': f"{current_loss:.4f}" if current_loss else None, + 'current_lr': current_lr + } + + except Exception as e: + print(f"计算进度时出错: {e}") + return progress + # 训练方式支持检测 def get_supported_training_methods(): """获取当前环境支持的训练方法""" @@ -107,6 +222,7 @@ def start_training_process(train_type, params, client_id=None): 'train_type': train_type, 'log_file': log_file, 'start_time': time.strftime('%Y-%m-%d %H:%M:%S'), + 'start_timestamp': time.time(), # 添加时间戳用于进度计算 'running': True, 'error': False, 'train_monitor': params.get('train_monitor', 'none'), # 保存训练监控设置 @@ -187,6 +303,9 @@ def processes(): status = '运行中' if info['running'] else \ '手动停止' if 'manually_stopped' in info and info['manually_stopped'] else \ '出错' if info['error'] else '已完成' + + # 计算训练进度信息 + progress = calculate_training_progress(process_id, info) result.append({ 'id': process_id, @@ -196,7 +315,8 @@ def processes(): 'error': info['error'], 'status': status, 'train_monitor': info.get('train_monitor', 'none'), # 添加train_monitor字段 - 'swanlab_url': info.get('swanlab_url') # 添加swanlab_url字段 + 'swanlab_url': info.get('swanlab_url'), # 添加swanlab_url字段 + 'progress': progress # 添加进度信息 }) return jsonify(result) From a0013eae8fc1af7079f38ba49fb2f87bf0b07305 Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Fri, 21 Nov 2025 10:41:05 +0800 Subject: [PATCH 24/35] update web dataset file --- trainer_web/static/css/style.css | 226 +++++++++++++++++++++++++++++++ trainer_web/static/js/app.js | 187 ++++++++++++++++++++++--- trainer_web/templates/index.html | 27 ++++ trainer_web/train_web_ui.py | 111 +++++++++++++++ 4 files changed, 530 insertions(+), 21 deletions(-) diff --git a/trainer_web/static/css/style.css b/trainer_web/static/css/style.css index dc9fd50..3a68d21 100644 --- a/trainer_web/static/css/style.css +++ b/trainer_web/static/css/style.css @@ -366,6 +366,232 @@ input[type="text"]:focus, input[type="number"]:focus, select:focus, textarea:foc font-weight: 600; color: var(--accent); } + +/* 文件浏览器模态框样式 */ +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.8); + backdrop-filter: blur(5px); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + transition: opacity 0.3s ease; +} + +.modal.hidden { + display: none; +} + +.modal-content { + background: var(--panel-bg); + border-radius: var(--radius-lg); + border: 1px solid var(--border); + box-shadow: var(--shadow-xl); + width: 90%; + max-width: 600px; + max-height: 80vh; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.modal-header { + padding: 1rem 1.5rem; + border-bottom: 1px solid var(--border); + display: flex; + justify-content: space-between; + align-items: center; + background: rgba(139, 92, 246, 0.1); +} + +.modal-header h3 { + margin: 0; + color: var(--text); + font-size: 1.1rem; +} + +.modal-close { + background: none; + border: none; + color: var(--text-secondary); + font-size: 1.5rem; + cursor: pointer; + padding: 0; + width: 30px; + height: 30px; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--radius-sm); + transition: all 0.3s ease; +} + +.modal-close:hover { + background: rgba(239, 68, 68, 0.2); + color: #ef4444; +} + +.modal-body { + flex: 1; + padding: 1rem; + overflow-y: auto; +} + +.modal-footer { + padding: 1rem 1.5rem; + border-top: 1px solid var(--border); + display: flex; + gap: 0.5rem; + align-items: center; + background: rgba(22, 22, 32, 0.8); +} + +.modal-footer input { + flex: 1; +} + +.btn-secondary { + background: linear-gradient(135deg, var(--border-light) 0%, var(--border) 100%); + color: var(--text); + border: none; + padding: 0.5rem 1rem; + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.3s ease; + font-size: 0.8rem; + font-weight: 500; +} + +.btn-secondary:hover { + transform: translateY(-1px); + filter: brightness(1.1); +} + +/* 文件浏览器导航 */ +.file-browser-nav { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; + padding: 0.5rem; + background: rgba(45, 55, 72, 0.5); + border-radius: var(--radius-md); +} + +.current-path { + font-family: 'Courier New', monospace; + font-size: 0.85rem; + color: var(--text-secondary); + flex: 1; + margin-right: 1rem; + padding: 0.25rem 0.5rem; + background: rgba(22, 22, 32, 0.5); + border-radius: var(--radius-sm); + border: 1px solid var(--border); +} + +.btn-navigate { + background: linear-gradient(135deg, var(--info-grad-start) 0%, var(--info-grad-end) 100%); + color: white; + border: none; + padding: 0.5rem; + border-radius: var(--radius-sm); + cursor: pointer; + font-size: 0.8rem; + transition: all 0.3s ease; +} + +.btn-navigate:hover { + transform: translateY(-1px); + filter: brightness(1.1); +} + +/* 快捷路径 */ +.quick-paths { + display: flex; + gap: 0.5rem; + margin-bottom: 1rem; + flex-wrap: wrap; +} + +.quick-path-btn { + background: rgba(139, 92, 246, 0.1); + color: var(--accent); + border: 1px solid rgba(139, 92, 246, 0.3); + padding: 0.4rem 0.8rem; + border-radius: var(--radius-sm); + cursor: pointer; + font-size: 0.75rem; + transition: all 0.3s ease; +} + +.quick-path-btn:hover { + background: rgba(139, 92, 246, 0.2); + transform: translateY(-1px); +} + +/* 文件列表 */ +.file-list { + max-height: 300px; + overflow-y: auto; + border: 1px solid var(--border); + border-radius: var(--radius-md); + background: rgba(22, 22, 32, 0.3); +} + +.file-item { + display: flex; + align-items: center; + padding: 0.75rem; + cursor: pointer; + transition: all 0.3s ease; + border-bottom: 1px solid rgba(45, 55, 72, 0.3); +} + +.file-item:last-child { + border-bottom: none; +} + +.file-item:hover { + background: rgba(139, 92, 246, 0.1); +} + +.file-item.selected { + background: rgba(139, 92, 246, 0.2); + border-left: 3px solid var(--accent); +} + +.file-icon { + margin-right: 0.75rem; + font-size: 1.2rem; + width: 20px; + text-align: center; +} + +.file-name { + flex: 1; + font-size: 0.9rem; + color: var(--text); +} + +.file-info { + font-size: 0.75rem; + color: var(--text-secondary); + text-align: right; +} + +.directory { + color: var(--info-grad-start); +} + +.file { + color: var(--text-secondary); +} .checkbox-group { display: flex; align-items: center; diff --git a/trainer_web/static/js/app.js b/trainer_web/static/js/app.js index 6606144..1fae11d 100644 --- a/trainer_web/static/js/app.js +++ b/trainer_web/static/js/app.js @@ -17,37 +17,182 @@ const hooks = { window.openTab = (evt, tabName) => _openTab(evt, tabName, hooks); -// 文件夹选择器功能 +// 文件夹选择器功能 - 支持远程文件浏览 window.selectFolder = async (inputId) => { + try { + // 检测是否为远程连接(通过检查主机名或端口) + const isRemote = window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1'; + + if (isRemote) { + // 远程连接:使用服务器端文件浏览 + openRemoteFileBrowser(inputId); + } else { + // 本地连接:尝试本地文件系统访问 + await openLocalFileBrowser(inputId); + } + } catch (error) { + console.warn('文件夹选择失败:', error); + if (error.name !== 'AbortError') { + // 降级到远程文件浏览 + openRemoteFileBrowser(inputId); + } + } +}; + +// 本地文件浏览器(兼容模式) +async function openLocalFileBrowser(inputId) { try { // 检查是否支持 File System Access API if ('showDirectoryPicker' in window) { const dirHandle = await window.showDirectoryPicker(); - const path = dirHandle.name; // 使用目录名称作为路径 + const path = dirHandle.name; document.getElementById(inputId).value = `./${path}`; } else { - // 降级方案:使用文件输入模拟 - const input = document.createElement('input'); - input.type = 'file'; - input.webkitdirectory = true; - input.onchange = (e) => { - const files = e.target.files; - if (files.length > 0) { - // 提取相对路径 - const path = files[0].webkitRelativePath.split('/')[0]; - document.getElementById(inputId).value = `./${path}`; - } - }; - input.click(); + // 降级到远程文件浏览 + await openRemoteFileBrowser(inputId); } } catch (error) { - console.warn('文件夹选择失败:', error); - // 如果用户取消选择,不显示错误 - if (error.name !== 'AbortError') { - alert('文件夹选择失败,请手动输入路径'); - } + // 如果本地失败,降级到远程文件浏览 + await openRemoteFileBrowser(inputId); } -}; +} + +// 远程文件浏览器 +let currentFileBrowserTarget = null; +let currentBrowsePath = './'; + +function openRemoteFileBrowser(inputId) { + currentFileBrowserTarget = inputId; + document.getElementById('file-browser-modal').classList.remove('hidden'); + + // 加载初始路径 + loadQuickPaths(); + browsePath('./'); +} + +function closeFileBrowser() { + document.getElementById('file-browser-modal').classList.add('hidden'); + currentFileBrowserTarget = null; + currentBrowsePath = './'; +} + +function confirmFileSelection() { + const selectedPath = document.getElementById('selected-path').value; + if (selectedPath && currentFileBrowserTarget) { + document.getElementById(currentFileBrowserTarget).value = selectedPath; + } + closeFileBrowser(); +} + +function navigateToParent() { + if (currentBrowsePath !== './') { + const parentPath = currentBrowsePath.includes('/') ? + currentBrowsePath.substring(0, currentBrowsePath.lastIndexOf('/')) : './'; + browsePath(parentPath || './'); + } +} + +async function loadQuickPaths() { + try { + const response = await fetch('/api/quick-paths'); + const data = await response.json(); + + const quickPathsContainer = document.getElementById('quick-paths'); + quickPathsContainer.innerHTML = ''; + + if (data.paths && data.paths.length > 0) { + data.paths.forEach(path => { + const btn = document.createElement('button'); + btn.className = 'quick-path-btn'; + btn.textContent = path.name; + btn.onclick = () => browsePath(path.path); + btn.title = path.path; + quickPathsContainer.appendChild(btn); + }); + } + } catch (error) { + console.warn('加载快捷路径失败:', error); + } +} + +async function browsePath(path) { + try { + currentBrowsePath = path; + document.getElementById('current-path').textContent = path; + + const response = await fetch(`/api/browse?path=${encodeURIComponent(path)}`); + const data = await response.json(); + + if (data.error) { + alert(`浏览失败: ${data.error}`); + return; + } + + renderFileList(data); + } catch (error) { + console.error('浏览路径失败:', error); + alert('浏览路径失败,请检查网络连接'); + } +} + +function renderFileList(data) { + const fileList = document.getElementById('file-list'); + fileList.innerHTML = ''; + + if (!data.items || data.items.length === 0) { + fileList.innerHTML = '
此目录为空
'; + return; + } + + // 先显示目录,再显示文件 + const directories = data.items.filter(item => item.type === 'directory'); + const files = data.items.filter(item => item.type === 'file'); + + // 渲染目录 + directories.forEach(item => { + const div = createFileItem(item, '📁'); + fileList.appendChild(div); + }); + + // 渲染文件 + files.forEach(item => { + const div = createFileItem(item, '📄'); + fileList.appendChild(div); + }); +} + +function createFileItem(item, icon) { + const div = document.createElement('div'); + div.className = 'file-item'; + div.onclick = () => selectFileItem(item); + + div.innerHTML = ` + ${icon} + ${item.name} + ${item.type === 'file' ? formatFileSize(item.size) : '文件夹'} + `; + + return div; +} + +function selectFileItem(item) { + if (item.type === 'directory') { + browsePath(item.path); + } else { + document.getElementById('selected-path').value = item.path; + // 文件被选中,可以高亮显示 + document.querySelectorAll('.file-item').forEach(el => el.classList.remove('selected')); + event.currentTarget.classList.add('selected'); + } +} + +function formatFileSize(bytes) { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]; +} window.addEventListener('load', () => { initTrainForm(); diff --git a/trainer_web/templates/index.html b/trainer_web/templates/index.html index 4b94e02..4390001 100644 --- a/trainer_web/templates/index.html +++ b/trainer_web/templates/index.html @@ -319,6 +319,33 @@
+ + + diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index 22b236b..5d9043d 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -11,6 +11,8 @@ from flask import Flask, render_template, request, jsonify, redirect, url_for from flask import g import time import psutil +import glob +import pathlib # 尝试导入torch来检测GPU try: @@ -320,6 +322,115 @@ def processes(): }) return jsonify(result) +@app.route('/api/browse') +def browse_files(): + """ + 浏览服务器文件系统 + 支持远程文件选择功能 + """ + try: + # 获取请求的路径参数 + path = request.args.get('path', './') + + # 安全检查:限制访问范围 + script_dir = os.path.dirname(os.path.abspath(__file__)) + project_root = os.path.abspath(os.path.join(script_dir, '..')) + + # 解析请求的路径 + if path.startswith('./'): + # 相对路径,基于项目根目录 + full_path = os.path.abspath(os.path.join(project_root, path[2:])) + elif path.startswith('/'): + # 绝对路径,检查是否在项目目录内 + full_path = os.path.abspath(path) + else: + # 相对路径,基于项目根目录 + full_path = os.path.abspath(os.path.join(project_root, path)) + + # 安全检查:确保路径在项目目录内 + if not full_path.startswith(project_root): + full_path = project_root + + # 检查路径是否存在 + if not os.path.exists(full_path): + return jsonify({'error': '路径不存在', 'path': path}) + + # 获取目录内容 + if os.path.isdir(full_path): + items = [] + try: + # 列出目录内容 + for item in sorted(os.listdir(full_path)): + item_path = os.path.join(full_path, item) + + # 跳过隐藏文件和系统文件 + if item.startswith('.') or item.startswith('__'): + continue + + try: + stat = os.stat(item_path) + items.append({ + 'name': item, + 'path': os.path.relpath(item_path, project_root), + 'type': 'directory' if os.path.isdir(item_path) else 'file', + 'size': stat.st_size if os.path.isfile(item_path) else 0, + 'modified': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(stat.st_mtime)) + }) + except (OSError, PermissionError): + # 跳过无法访问的项目 + continue + + return jsonify({ + 'current_path': os.path.relpath(full_path, project_root), + 'absolute_path': full_path, + 'items': items, + 'parent': os.path.relpath(os.path.dirname(full_path), project_root) if full_path != project_root else None + }) + except (OSError, PermissionError) as e: + return jsonify({'error': f'无法访问目录: {str(e)}', 'path': path}) + + else: + # 如果是文件,返回文件信息 + stat = os.stat(full_path) + return jsonify({ + 'name': os.path.basename(full_path), + 'path': os.path.relpath(full_path, project_root), + 'type': 'file', + 'size': stat.st_size, + 'modified': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(stat.st_mtime)) + }) + + except Exception as e: + return jsonify({'error': f'浏览文件时出错: {str(e)}'}) + +@app.route('/api/quick-paths') +def quick_paths(): + """ + 返回常用路径快捷方式 + """ + try: + script_dir = os.path.dirname(os.path.abspath(__file__)) + project_root = os.path.abspath(os.path.join(script_dir, '..')) + + quick_paths = [ + {'name': '项目根目录', 'path': './', 'type': 'directory'}, + {'name': '数据集目录', 'path': './dataset', 'type': 'directory'}, + {'name': '模型检查点', 'path': './checkpoints', 'type': 'directory'}, + {'name': '日志文件', 'path': './logfile', 'type': 'directory'} + ] + + # 验证路径是否存在 + valid_paths = [] + for item in quick_paths: + full_path = os.path.join(project_root, item['path'][2:] if item['path'].startswith('./') else item['path']) + if os.path.exists(full_path): + valid_paths.append(item) + + return jsonify({'paths': valid_paths}) + + except Exception as e: + return jsonify({'error': f'获取快捷路径时出错: {str(e)}'}) + @app.route('/logs/') def logs(process_id): # 直接从本地logfile目录读取日志文件 From 249d1c08fec6511cabd087f24782132d76645c4f Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Fri, 21 Nov 2025 12:09:05 +0800 Subject: [PATCH 25/35] update web dataset file --- trainer_web/static/css/style.css | 59 ++++++++ trainer_web/static/js/app.js | 246 ++++++++++++++++++++++++------- trainer_web/templates/index.html | 12 +- 3 files changed, 258 insertions(+), 59 deletions(-) diff --git a/trainer_web/static/css/style.css b/trainer_web/static/css/style.css index 3a68d21..988ccc9 100644 --- a/trainer_web/static/css/style.css +++ b/trainer_web/static/css/style.css @@ -472,6 +472,37 @@ input[type="text"]:focus, input[type="number"]:focus, select:focus, textarea:foc filter: brightness(1.1); } +/* 模态框底部样式 */ +.modal-footer { + display: flex; + gap: 0.75rem; + align-items: center; + padding-top: 1rem; + border-top: 1px solid var(--border); +} + +.modal-footer input { + flex: 1; + margin-right: 0.5rem; +} + +/* 改进模态框关闭按钮 */ +.modal-close { + background: none; + border: none; + font-size: 1.5rem; + color: var(--text-secondary); + cursor: pointer; + padding: 0.25rem; + border-radius: var(--radius-sm); + transition: all 0.3s ease; +} + +.modal-close:hover { + color: var(--text); + background: rgba(239, 68, 68, 0.1); +} + /* 文件浏览器导航 */ .file-browser-nav { display: flex; @@ -483,6 +514,11 @@ input[type="text"]:focus, input[type="number"]:focus, select:focus, textarea:foc border-radius: var(--radius-md); } +.nav-buttons { + display: flex; + gap: 0.5rem; +} + .current-path { font-family: 'Courier New', monospace; font-size: 0.85rem; @@ -519,6 +555,19 @@ input[type="text"]:focus, input[type="number"]:focus, select:focus, textarea:foc flex-wrap: wrap; } +.file-browser-help { + background: rgba(59, 130, 246, 0.1); + border: 1px solid rgba(59, 130, 246, 0.3); + border-radius: var(--radius-sm); + padding: 0.75rem; + margin-bottom: 1rem; + font-size: 0.8rem; + color: var(--info-grad-start); + display: flex; + align-items: center; + gap: 0.5rem; +} + .quick-path-btn { background: rgba(139, 92, 246, 0.1); color: var(--accent); @@ -542,6 +591,7 @@ input[type="text"]:focus, input[type="number"]:focus, select:focus, textarea:foc border: 1px solid var(--border); border-radius: var(--radius-md); background: rgba(22, 22, 32, 0.3); + margin-bottom: 1rem; } .file-item { @@ -566,6 +616,15 @@ input[type="text"]:focus, input[type="number"]:focus, select:focus, textarea:foc border-left: 3px solid var(--accent); } +.file-item.disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.file-item.disabled:hover { + background: none; +} + .file-icon { margin-right: 0.75rem; font-size: 1.2rem; diff --git a/trainer_web/static/js/app.js b/trainer_web/static/js/app.js index 1fae11d..aa5d778 100644 --- a/trainer_web/static/js/app.js +++ b/trainer_web/static/js/app.js @@ -17,53 +17,50 @@ const hooks = { window.openTab = (evt, tabName) => _openTab(evt, tabName, hooks); -// 文件夹选择器功能 - 支持远程文件浏览 -window.selectFolder = async (inputId) => { - try { - // 检测是否为远程连接(通过检查主机名或端口) - const isRemote = window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1'; - - if (isRemote) { - // 远程连接:使用服务器端文件浏览 - openRemoteFileBrowser(inputId); - } else { - // 本地连接:尝试本地文件系统访问 - await openLocalFileBrowser(inputId); - } - } catch (error) { - console.warn('文件夹选择失败:', error); - if (error.name !== 'AbortError') { - // 降级到远程文件浏览 - openRemoteFileBrowser(inputId); - } - } +// 文件夹选择器功能 - 直接显示服务器端文件浏览器 +window.selectFolder = (inputId) => { + // 直接使用远程文件浏览器,不尝试本地文件系统访问 + openRemoteFileBrowser(inputId); }; -// 本地文件浏览器(兼容模式) -async function openLocalFileBrowser(inputId) { - try { - // 检查是否支持 File System Access API - if ('showDirectoryPicker' in window) { - const dirHandle = await window.showDirectoryPicker(); - const path = dirHandle.name; - document.getElementById(inputId).value = `./${path}`; - } else { - // 降级到远程文件浏览 - await openRemoteFileBrowser(inputId); - } - } catch (error) { - // 如果本地失败,降级到远程文件浏览 - await openRemoteFileBrowser(inputId); - } -} - -// 远程文件浏览器 +// 远程文件浏览器 - 支持文件和文件夹选择 let currentFileBrowserTarget = null; let currentBrowsePath = './'; +let selectedFilePath = null; +let currentSelectionMode = 'auto'; // 'file', 'folder', or 'auto' function openRemoteFileBrowser(inputId) { + console.log('openRemoteFileBrowser called with:', inputId); currentFileBrowserTarget = inputId; - document.getElementById('file-browser-modal').classList.remove('hidden'); + + // 根据输入框ID确定选择模式 + if (inputId === 'data_path') { + currentSelectionMode = 'file'; // 数据路径需要文件选择 + console.log('Mode set to: FILE selection'); + } else if (inputId === 'save_dir' || inputId.includes('reward_model_path')) { + currentSelectionMode = 'folder'; // 保存目录和奖励模型路径需要文件夹选择 + console.log('Mode set to: FOLDER selection'); + } else { + currentSelectionMode = 'auto'; // 自动模式 + console.log('Mode set to: AUTO selection'); + } + + const modal = document.getElementById('file-browser-modal'); + if (modal) { + modal.classList.remove('hidden'); + console.log('Modal opened successfully'); + } else { + console.error('Modal element not found!'); + return; + } + + // 重置选择状态 + selectedFilePath = null; + const selectedPathInput = document.getElementById('selected-path'); + if (selectedPathInput) { + selectedPathInput.value = ''; + console.log('Selected path input cleared'); + } // 加载初始路径 loadQuickPaths(); @@ -74,14 +71,31 @@ function closeFileBrowser() { document.getElementById('file-browser-modal').classList.add('hidden'); currentFileBrowserTarget = null; currentBrowsePath = './'; + selectedFilePath = null; + currentSelectionMode = 'auto'; } function confirmFileSelection() { - const selectedPath = document.getElementById('selected-path').value; - if (selectedPath && currentFileBrowserTarget) { - document.getElementById(currentFileBrowserTarget).value = selectedPath; + console.log('confirmFileSelection called'); + console.log('selectedFilePath:', selectedFilePath); + console.log('currentFileBrowserTarget:', currentFileBrowserTarget); + + if (selectedFilePath && currentFileBrowserTarget) { + const targetElement = document.getElementById(currentFileBrowserTarget); + console.log('targetElement:', targetElement); + + if (targetElement) { + targetElement.value = selectedFilePath; + console.log('Value set successfully'); + closeFileBrowser(); + } else { + console.error('Target element not found:', currentFileBrowserTarget); + alert('错误:无法找到目标输入框'); + } + } else { + console.log('Missing selection or target'); + alert('请先选择文件或文件夹'); } - closeFileBrowser(); } function navigateToParent() { @@ -92,6 +106,13 @@ function navigateToParent() { } } +function selectCurrentDirectory() { + // 选择当前目录 + selectedFilePath = currentBrowsePath; + document.getElementById('selected-path').value = currentBrowsePath; + // 可以关闭模态框或让用户继续浏览 +} + async function loadQuickPaths() { try { const response = await fetch('/api/quick-paths'); @@ -116,9 +137,15 @@ async function loadQuickPaths() { } async function browsePath(path) { + console.log('browsePath called with:', path); try { currentBrowsePath = path; + selectedFilePath = null; // 重置选中的文件路径 document.getElementById('current-path').textContent = path; + document.getElementById('selected-path').value = ''; // 清空显示 + + // 更新帮助文本 + updateHelpText(); const response = await fetch(`/api/browse?path=${encodeURIComponent(path)}`); const data = await response.json(); @@ -129,6 +156,7 @@ async function browsePath(path) { } renderFileList(data); + console.log('File list rendered successfully'); } catch (error) { console.error('浏览路径失败:', error); alert('浏览路径失败,请检查网络连接'); @@ -154,17 +182,29 @@ function renderFileList(data) { fileList.appendChild(div); }); - // 渲染文件 - files.forEach(item => { - const div = createFileItem(item, '📄'); - fileList.appendChild(div); - }); + // 渲染文件(仅在文件选择模式或自动模式下显示) + if (currentSelectionMode !== 'folder') { + files.forEach(item => { + const div = createFileItem(item, '📄'); + fileList.appendChild(div); + }); + } } function createFileItem(item, icon) { const div = document.createElement('div'); div.className = 'file-item'; - div.onclick = () => selectFileItem(item); + + // 根据选择模式添加适当的CSS类 + if (currentSelectionMode === 'file' && item.type === 'directory') { + // 文件选择模式下,文件夹只用于导航,不能选择 + div.classList.add('navigable'); + } else if (currentSelectionMode === 'folder' && item.type === 'file') { + // 文件夹选择模式下,文件不能被选择 + div.classList.add('disabled'); + } + + div.onclick = (event) => selectFileItem(item, event); div.innerHTML = ` ${icon} @@ -175,14 +215,54 @@ function createFileItem(item, icon) { return div; } -function selectFileItem(item) { +function selectFileItem(item, event) { + console.log('selectFileItem called with:', item); + console.log('currentSelectionMode:', currentSelectionMode); + console.log('event:', event); + + // 检查是否点击了被禁用的项目 + if (event && event.currentTarget && event.currentTarget.classList.contains('disabled')) { + console.log('Clicked disabled item, ignoring'); + return; + } + if (item.type === 'directory') { - browsePath(item.path); + // 文件夹:根据选择模式决定行为 + if (currentSelectionMode === 'file') { + // 文件选择模式:只能选择文件,点击进入目录 + console.log('File mode: navigating into directory'); + browsePath(item.path); + } else if (currentSelectionMode === 'folder') { + // 文件夹选择模式:可以选择文件夹 + console.log('Folder mode: selecting directory'); + selectedFilePath = item.path; + document.getElementById('selected-path').value = item.path; + // 高亮显示选中的文件夹 + document.querySelectorAll('.file-item').forEach(el => el.classList.remove('selected')); + if (event && event.currentTarget) { + event.currentTarget.classList.add('selected'); + } + console.log('Directory selected:', selectedFilePath); + } else { + // 自动模式:点击进入目录 + console.log('Auto mode: navigating into directory'); + browsePath(item.path); + } } else { - document.getElementById('selected-path').value = item.path; - // 文件被选中,可以高亮显示 - document.querySelectorAll('.file-item').forEach(el => el.classList.remove('selected')); - event.currentTarget.classList.add('selected'); + // 文件:选中文件路径(仅在选择文件或自动模式下) + if (currentSelectionMode !== 'folder') { + console.log('Selecting file:', item.path); + selectedFilePath = item.path; + document.getElementById('selected-path').value = item.path; + // 高亮显示选中的文件 + document.querySelectorAll('.file-item').forEach(el => el.classList.remove('selected')); + if (event && event.currentTarget) { + event.currentTarget.classList.add('selected'); + } + console.log('File selected:', selectedFilePath); + } else { + console.log('File clicked in folder mode, ignoring'); + } } } @@ -194,6 +274,60 @@ function formatFileSize(bytes) { return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]; } +function updateHelpText() { + const helpText = document.querySelector('.file-browser-help'); + const modalTitle = document.getElementById('modal-title'); + + if (!helpText) return; + + let text = ''; + let title = ''; + switch (currentSelectionMode) { + case 'file': + text = '💡 请选择文件:点击文件选择,点击文件夹进入目录,使用📍选择当前目录'; + title = '选择文件'; + break; + case 'folder': + text = '💡 请选择文件夹:点击文件夹选择,点击文件无效,使用📍选择当前目录'; + title = '选择文件夹'; + break; + default: + text = '💡 点击文件夹进入目录,点击文件选择文件,使用📍选择当前目录'; + title = '选择文件或文件夹'; + } + helpText.textContent = text; + if (modalTitle) { + modalTitle.textContent = title; + } +} + +// 添加模态框键盘事件监听 +document.addEventListener('keydown', function(event) { + if (event.key === 'Escape') { + closeFileBrowser(); + } +}); + +// 添加模态框点击外部关闭功能 +document.addEventListener('DOMContentLoaded', function() { + const modal = document.getElementById('file-browser-modal'); + if (modal) { + modal.addEventListener('click', function(event) { + if (event.target === modal) { + closeFileBrowser(); + } + }); + } +}); + +// 将文件浏览器函数暴露到全局作用域 +window.selectFolder = selectFolder; +window.openRemoteFileBrowser = openRemoteFileBrowser; +window.closeFileBrowser = closeFileBrowser; +window.confirmFileSelection = confirmFileSelection; +window.navigateToParent = navigateToParent; +window.selectCurrentDirectory = selectCurrentDirectory; + window.addEventListener('load', () => { initTrainForm(); startProcessPolling(); diff --git a/trainer_web/templates/index.html b/trainer_web/templates/index.html index 4390001..701611e 100644 --- a/trainer_web/templates/index.html +++ b/trainer_web/templates/index.html @@ -323,23 +323,29 @@ @@ -379,7 +424,8 @@ export function updateProcessProgress(item, process) { } if (progressText) { - progressText.textContent = `进度: ${progressInfo.current}/${progressInfo.total}`; + const stepText = progressInfo.step ? ` (${progressInfo.step})` : ''; + progressText.textContent = `进度: ${progressInfo.current}/${progressInfo.total}${stepText}`; } if (remainingText) { @@ -390,7 +436,8 @@ export function updateProcessProgress(item, process) { // 更新指标 - 只更新有变化的值来减少DOM操作 const lossItem = metricsContainer.querySelector('.metric-item:nth-child(1) .metric-value'); const epochItem = metricsContainer.querySelector('.metric-item:nth-child(2) .metric-value'); - const lrItem = metricsContainer.querySelector('.metric-item:nth-child(3) .metric-value'); + const stepItem = metricsContainer.querySelector('.metric-item:nth-child(3) .metric-value'); + const lrItem = metricsContainer.querySelector('.metric-item:nth-child(4) .metric-value'); if (progressInfo.loss && lossItem) { lossItem.textContent = progressInfo.loss; @@ -398,6 +445,9 @@ export function updateProcessProgress(item, process) { if (progressInfo.epoch && epochItem) { epochItem.textContent = progressInfo.epoch; } + if (progressInfo.step && stepItem) { + stepItem.textContent = progressInfo.step; + } if (progressInfo.lr && lrItem) { lrItem.textContent = progressInfo.lr; } diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index f1cea06..4589d40 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -40,6 +40,8 @@ def calculate_training_progress(process_id, process_info): 'percentage': 0, 'current_epoch': 0, 'total_epochs': 0, + 'current_step': 0, + 'total_steps': 0, 'remaining_time': '计算中...', 'current_loss': None, 'current_lr': None @@ -110,6 +112,26 @@ def calculate_training_progress(process_id, process_info): total_epochs = int(match.group(2)) break + # 提取step信息 - 支持多种格式 + # 格式: step 150/1000, Step 150 of 1000, [150/1000], step: 150/1000 + step_patterns = [ + r'step\s+(\d+)\s*/\s*(\d+)', + r'Step\s+(\d+)\s*of\s*(\d+)', + r'\[(\d+)/(\d+)\]', + r'step\s*[::]\s*(\d+)\s*/\s*(\d+)', + r'第\s*(\d+)\s*步\s*/\s*共\s*(\d+)\s*步', + r'步数\s*(\d+)\s*/\s*(\d+)', + r'batch\s+(\d+)\s*/\s*(\d+)', # 也支持batch格式 + r'Batch\s+(\d+)\s*of\s*(\d+)' + ] + + for pattern in step_patterns: + match = re.search(pattern, line, re.IGNORECASE) + if match: + progress['current_step'] = int(match.group(1)) + progress['total_steps'] = int(match.group(2)) + break + # 提取loss信息 - 支持多种格式 if not current_loss: # 格式: loss: 4.32, training_loss: 4.32, train_loss: 4.32, Loss: 4.32, 训练损失: 4.32 @@ -157,10 +179,29 @@ def calculate_training_progress(process_id, process_info): if total_epochs and current_loss and current_lr: break - # 计算进度百分比 + # 计算进度百分比 - 支持epoch和step双重进度 percentage = 0 if total_epochs > 0: - percentage = min(100, max(0, int((current_epoch / total_epochs) * 100))) + # 基础epoch进度 + epoch_percentage = (current_epoch / total_epochs) * 100 + + # 如果有step信息,在当前epoch内计算step进度 + if progress['total_steps'] > 0 and progress['current_step'] > 0: + # 计算当前epoch内的step进度 + step_percentage_in_epoch = (progress['current_step'] / progress['total_steps']) * 100 + # 将step进度加到epoch进度上(每个epoch占总进度的1/total_epochs) + step_contribution = step_percentage_in_epoch / total_epochs + percentage = min(100, max(0, int(epoch_percentage + step_contribution))) + else: + # 只有epoch信息的传统计算方式 + percentage = min(100, max(0, int(epoch_percentage))) + + # 更新进度字典 + progress['percentage'] = percentage + progress['current_epoch'] = current_epoch + progress['total_epochs'] = total_epochs + progress['current_loss'] = current_loss + progress['current_lr'] = current_lr # 估算剩余时间(增强计算) remaining_time = '计算中...' @@ -398,7 +439,7 @@ def add_test_process(): process_id = f"test_process_{int(time.time())}" - # 创建测试训练命令 + # 创建测试训练命令 - 包含step进度 test_command = [ 'python', '-c', ''' import time @@ -416,23 +457,28 @@ print("2024-11-21 14:30:02 - Model initialized with 108M parameters") sys.stdout.flush() time.sleep(2) -for epoch in range(1, 6): - print(f"2024-11-21 14:30:{5 + epoch*5} - Starting epoch {epoch}/5") - sys.stdout.flush() - time.sleep(1) - - loss = 4.5 - epoch * 0.3 - lr = 1e-4 * (0.9 ** epoch) - print(f"2024-11-21 14:30:{6 + epoch*5} - Loss: {loss:.4f}, lr: {lr:.2e}") - sys.stdout.flush() - time.sleep(2) - - remaining = (5 - epoch) * 15 - print(f"2024-11-21 14:30:{8 + epoch*5} - Epoch {epoch}/5 completed, remaining: 0:0{remaining}:00") - sys.stdout.flush() - time.sleep(1) +# 测试单epoch但多step的情况 +print("2024-11-21 14:30:03 - Starting epoch 1/1") +sys.stdout.flush() +time.sleep(1) -print("2024-11-21 14:30:35 - Training completed successfully") +total_steps = 20 +for step in range(1, total_steps + 1): + # 模拟step进度 + if step % 5 == 0 or step == total_steps: + print(f"2024-11-21 14:30:{4 + step} - Step {step}/{total_steps}") + sys.stdout.flush() + + # 模拟训练过程 + loss = 4.5 - step * 0.1 + lr = 1e-4 * (0.95 ** step) + if step % 3 == 0: + print(f"2024-11-21 14:30:{4 + step} - Loss: {loss:.4f}, lr: {lr:.2e}") + sys.stdout.flush() + + time.sleep(0.5) + +print("2024-11-21 14:30:25 - Training completed successfully") sys.stdout.flush() ''' ] diff --git a/trainer_web/training_processes.json b/trainer_web/training_processes.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/trainer_web/training_processes.json @@ -0,0 +1 @@ +{} \ No newline at end of file From d9dddccd7166a6da37efdf3ae7927c5ed6e878ff Mon Sep 17 00:00:00 2001 From: wangyuzhan Date: Fri, 21 Nov 2025 18:43:41 +0800 Subject: [PATCH 32/35] update process step --- trainer_web/train_web_ui.py | 120 ++++++++++++++++++++++++------------ 1 file changed, 80 insertions(+), 40 deletions(-) diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index 4589d40..0be35ee 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -47,9 +47,23 @@ def calculate_training_progress(process_id, process_info): 'current_lr': None } - # 如果进程不在运行,返回空进度 + # 如果进程不在运行且没有日志文件,返回空进度 if not process_info.get('running', False): - return progress + # 检查是否有日志文件,如果有则继续解析 + script_dir = os.path.dirname(os.path.abspath(__file__)) + log_dir = os.path.join(script_dir, '../logfile') + log_dir = os.path.abspath(log_dir) + + log_file_exists = False + if os.path.exists(log_dir): + for filename in os.listdir(log_dir): + if filename.endswith(f'{process_id}.log'): + log_file_exists = True + break + + # 如果没有日志文件且进程不在运行,返回空进度 + if not log_file_exists: + return progress try: # 获取日志文件路径 @@ -96,8 +110,9 @@ def calculate_training_progress(process_id, process_info): # 提取epoch信息 - 支持多种格式 if not total_epochs: - # 格式: epoch 3/10, Epoch 3 of 10, [3/10], 第3轮/共10轮 + # 格式: epoch 3/10, Epoch 3 of 10, [3/10], 第3轮/共10轮, Epoch:[1/1] epoch_patterns = [ + r'Epoch:\[(\d+)/(\d+)\]', # Epoch:[1/1] - 新格式 r'epoch\s+(\d+)\s*/\s*(\d+)', r'Epoch\s+(\d+)\s*of\s*(\d+)', r'\[(\d+)/(\d+)\]', @@ -108,13 +123,18 @@ def calculate_training_progress(process_id, process_info): for pattern in epoch_patterns: match = re.search(pattern, line, re.IGNORECASE) if match: - current_epoch = int(match.group(1)) - total_epochs = int(match.group(2)) + if 'Epoch:\[' in pattern: + current_epoch = int(match.group(1)) + total_epochs = int(match.group(2)) + else: + current_epoch = int(match.group(1)) + total_epochs = int(match.group(2)) break # 提取step信息 - 支持多种格式 - # 格式: step 150/1000, Step 150 of 1000, [150/1000], step: 150/1000 + # 格式: (74/44160), step 150/1000, Step 150 of 1000, [150/1000], step: 150/1000 step_patterns = [ + r'\((\d+)/(\d+)\)', # (74/44160) - 新格式 r'step\s+(\d+)\s*/\s*(\d+)', r'Step\s+(\d+)\s*of\s*(\d+)', r'\[(\d+)/(\d+)\]', @@ -134,8 +154,9 @@ def calculate_training_progress(process_id, process_info): # 提取loss信息 - 支持多种格式 if not current_loss: - # 格式: loss: 4.32, training_loss: 4.32, train_loss: 4.32, Loss: 4.32, 训练损失: 4.32 + # 格式: loss:8.896761, loss: 4.32, training_loss: 4.32, train_loss: 4.32, Loss: 4.32, 训练损失: 4.32 loss_patterns = [ + r'loss:([\d.]+(?:e[+-]?\d+)?)', # loss:8.896761 - 新格式 r'loss[\s:=]\s*([\d.]+(?:e[+-]?\d+)?)', # loss: 4.32 r'training_loss[\s:=]\s*([\d.]+(?:e[+-]?\d+)?)', # training_loss: 4.32 r'train_loss[\s:=]\s*([\d.]+(?:e[+-]?\d+)?)', # train_loss: 4.32 @@ -143,7 +164,7 @@ def calculate_training_progress(process_id, process_info): r'训练损失[\s:=]\s*([\d.]+(?:e[+-]?\d+)?)', # 训练损失: 4.32 r'损失[\s:=]\s*([\d.]+(?:e[+-]?\d+)?)', # 损失: 4.32 r'\s+([\d.]+(?:e[+-]?\d+)?)\s*loss', # 4.32 loss - r'\s+([\d.]+(?:e[+-]?\d+)?)\s*训练损失', # 4.32 训练损失 + r'\s+([\d.]+(?:e[+-]?\d+)?)\s*训练损失', # 4.32 训练损失 r'(?:loss|损失|training_loss|train_loss)\s*=\s*([\d.]+(?:e[+-]?\d+)?)' # loss = 4.32 ] @@ -158,8 +179,9 @@ def calculate_training_progress(process_id, process_info): # 提取学习率信息 - 支持多种格式 if not current_lr: - # 格式: lr: 1e-4, learning_rate: 1e-4, LR: 1e-4, 学习率: 1e-4 + # 格式: lr:0.000549999999, lr: 1e-4, learning_rate: 1e-4, LR: 1e-4, 学习率: 1e-4 lr_patterns = [ + r'lr:([\d.e+-]+)', # lr:0.000549999999 - 新格式 r'lr[\s:=]\s*([\d.e+-]+)', r'learning_rate[\s:=]\s*([\d.e+-]+)', r'LR[\s:=]\s*([\d.e+-]+)', @@ -208,8 +230,9 @@ def calculate_training_progress(process_id, process_info): if current_epoch > 0 and total_epochs > current_epoch: # 从日志中提取时间信息 for line in reversed(lines): - # 格式: remaining: 1:30:45, ETA: 1:30:45, 预计剩余: 1小时30分钟 + # 格式: remaining: 1:30:45, ETA: 1:30:45, 预计剩余: 1小时30分钟, epoch_Time:332.0min: time_patterns = [ + r'epoch_Time:([\d.]+)min:', # epoch_Time:332.0min: - 新格式 r'remaining[\s:=]\s*(\d+):(\d+):(\d+)', # remaining: 1:30:45 r'ETA[\s:=]\s*(\d+):(\d+):(\d+)', # ETA: 1:30:45 r'预计剩余[\s:=]\s*(\d+)[\s小时]*[\s:]?(\d+)?[\s分钟]*', # 预计剩余: 1小时30分钟 @@ -221,30 +244,45 @@ def calculate_training_progress(process_id, process_info): for pattern in time_patterns: match = re.search(pattern, line, re.IGNORECASE) if match: - groups = match.groups() - if len(groups) >= 3 and all(groups[:3]): - # 小时:分钟:秒格式 - hours = int(groups[0]) - minutes = int(groups[1]) - seconds = int(groups[2]) - if hours > 0 or minutes > 0 or seconds > 0: - parts = [] - if hours > 0: parts.append(f"{hours}小时") - if minutes > 0: parts.append(f"{minutes}分钟") - if seconds > 0 and hours == 0 and minutes == 0: - parts.append(f"{seconds}秒") - remaining_time = ''.join(parts) - break - elif len(groups) >= 2: - # 小时和分钟格式 - hours = int(groups[0]) - minutes = int(groups[1]) if groups[1] else 0 - if hours > 0 or minutes > 0: - parts = [] - if hours > 0: parts.append(f"{hours}小时") - if minutes > 0: parts.append(f"{minutes}分钟") - remaining_time = ''.join(parts) + # 处理epoch_Time格式 + if 'epoch_Time:' in pattern: + minutes = float(match.group(1)) + if minutes > 0: + if minutes >= 60: + hours = int(minutes // 60) + remaining_minutes = int(minutes % 60) + if hours > 0: + remaining_time = f"{hours}小时{remaining_minutes}分钟" + else: + remaining_time = f"{remaining_minutes}分钟" + else: + remaining_time = f"{int(minutes)}分钟" break + else: + groups = match.groups() + if len(groups) >= 3 and all(groups[:3]): + # 小时:分钟:秒格式 + hours = int(groups[0]) + minutes = int(groups[1]) + seconds = int(groups[2]) + if hours > 0 or minutes > 0 or seconds > 0: + parts = [] + if hours > 0: parts.append(f"{hours}小时") + if minutes > 0: parts.append(f"{minutes}分钟") + if seconds > 0 and hours == 0 and minutes == 0: + parts.append(f"{seconds}秒") + remaining_time = ''.join(parts) + break + elif len(groups) >= 2: + # 小时和分钟格式 + hours = int(groups[0]) + minutes = int(groups[1]) if groups[1] else 0 + if hours > 0 or minutes > 0: + parts = [] + if hours > 0: parts.append(f"{hours}小时") + if minutes > 0: parts.append(f"{minutes}分钟") + remaining_time = ''.join(parts) + break if remaining_time != '计算中...': break @@ -269,6 +307,8 @@ def calculate_training_progress(process_id, process_info): 'percentage': percentage, 'current_epoch': current_epoch, 'total_epochs': total_epochs, + 'current_step': progress['current_step'], + 'total_steps': progress['total_steps'], 'remaining_time': remaining_time, 'current_loss': f"{current_loss:.4f}" if current_loss else None, 'current_lr': current_lr @@ -439,7 +479,7 @@ def add_test_process(): process_id = f"test_process_{int(time.time())}" - # 创建测试训练命令 - 包含step进度 + # 创建测试训练命令 - 包含step进度和新的log格式 test_command = [ 'python', '-c', ''' import time @@ -457,23 +497,23 @@ print("2024-11-21 14:30:02 - Model initialized with 108M parameters") sys.stdout.flush() time.sleep(2) -# 测试单epoch但多step的情况 -print("2024-11-21 14:30:03 - Starting epoch 1/1") +# 测试单epoch但多step的情况,使用新的log格式 +print("2024-11-21 14:30:03 - Epoch:[1/1] Starting training") sys.stdout.flush() time.sleep(1) total_steps = 20 for step in range(1, total_steps + 1): - # 模拟step进度 + # 模拟step进度,使用新的格式 if step % 5 == 0 or step == total_steps: - print(f"2024-11-21 14:30:{4 + step} - Step {step}/{total_steps}") + print(f"2024-11-21 14:30:{4 + step} - Epoch:[1/1]({step}/{total_steps}) Processing") sys.stdout.flush() - # 模拟训练过程 + # 模拟训练过程,使用新的格式 loss = 4.5 - step * 0.1 lr = 1e-4 * (0.95 ** step) if step % 3 == 0: - print(f"2024-11-21 14:30:{4 + step} - Loss: {loss:.4f}, lr: {lr:.2e}") + print(f"2024-11-21 14:30:{4 + step} - Epoch:[1/1]({step}/{total_steps}) loss:{loss:.6f} lr:{lr:.2e} epoch_Time:{step * 5.5:.1f}min:") sys.stdout.flush() time.sleep(0.5) From aee1913d3d5bbdcd933c5705e34dcbe41c1df0b8 Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Tue, 25 Nov 2025 03:28:56 +0000 Subject: [PATCH 33/35] update para from_resume --- trainer_web/templates/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trainer_web/templates/index.html b/trainer_web/templates/index.html index 701611e..301874c 100644 --- a/trainer_web/templates/index.html +++ b/trainer_web/templates/index.html @@ -234,7 +234,7 @@
- +
From 0ebf835006ada0879b82bfc50951dc62b24c732d Mon Sep 17 00:00:00 2001 From: yuyu5333 <1812107659@qq.com> Date: Fri, 14 Nov 2025 07:40:47 +0000 Subject: [PATCH 34/35] update start bash --- trainer_web/stop_web_ui.sh | 3 +++ trainer_web/train_web_ui.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/trainer_web/stop_web_ui.sh b/trainer_web/stop_web_ui.sh index df01186..9ed66ae 100755 --- a/trainer_web/stop_web_ui.sh +++ b/trainer_web/stop_web_ui.sh @@ -14,6 +14,9 @@ if [ -f "train_web_ui.pid" ]; then echo "强制停止服务..." kill -9 "$pid" fi + echo "正在保存进程信息..." + echo "已保存到 'trainer_web/training_processes.json'" + sleep 1 echo "服务已停止" else echo "服务未运行,但存在PID文件,已删除" diff --git a/trainer_web/train_web_ui.py b/trainer_web/train_web_ui.py index 0be35ee..d145a84 100644 --- a/trainer_web/train_web_ui.py +++ b/trainer_web/train_web_ui.py @@ -1046,7 +1046,7 @@ def load_processes_info(): def handle_exit(signum, frame): """处理程序退出信号,保存进程信息""" - print("正在保存进程信息...") + print("正在保存进程信息... save at 'trainer_web/training_processes.json'...") save_processes_info() # 删除PID文件 if os.path.exists(PID_FILE): From b3069d47432df82588f7e65b245eb91b96b745c0 Mon Sep 17 00:00:00 2001 From: yuyu5333 <77156718+yuyu5333@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:52:43 +0800 Subject: [PATCH 35/35] Delete README_web.md --- README_web.md | 87 --------------------------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 README_web.md diff --git a/README_web.md b/README_web.md deleted file mode 100644 index 4ca3bd5..0000000 --- a/README_web.md +++ /dev/null @@ -1,87 +0,0 @@ -## 总览 -- 目标:将当前单文件 `static/js/script.js` 的所有逻辑拆分为职责清晰的 ES Modules,并在不改变既有后端接口的前提下,优化交互与视觉表现,使界面更专业、易用。 -- 范围:仅前端(HTML/CSS/JS),保持与后端 `train_web_ui.py` 的 REST 接口兼容;可选提供后端小幅辅助(如 SSE)但不作为本次必须项。 - -## 现状拆解 -- 导航与标签:`openTab`、页面切换与进程/日志刷新(script.js:2–29, 23–29)。 -- 训练类型联动与默认值:`train_type` 变更、分区显隐与各类型默认填充(script.js:32–154)。 -- 轮询与请求:带超时/重试的 `fetchWithTimeoutAndRetry`(script.js:200–248),进程状态轮询 `startProcessPolling`/`checkProcessStatusChanges`(script.js:182–199, 251–279)。 -- 进程列表与项更新:`loadProcesses`/`updateProcessItem`/`addProcessItemToGroup`(script.js:467–667, 357–465)。 -- SwanLab:链接检测/打开(script.js:282–355)。 -- 日志查看:进程日志自动刷新与容器滚动(script.js:669–788),日志文件列表/查看/删除(script.js:1126–1462)。 -- 全局通知与确认:`showNotification`/`showConfirmDialog`(script.js:790–885)。 -- 训练表单提交:数据整形、模式分支、启动训练后切到“训练进程”(script.js:1052–1124)。 - -## 拆分方案(ES Modules) -- 采用原生 ES Modules,无需打包器;在 `index.html` 将单一脚本替换为入口 `app.js`(type="module"),其余模块按需 import。 -- 目录结构(`static/js/`): - - `app.js`:应用入口,初始化标签、轮询、首屏加载。 - - `services/apiClient.js`:`fetchWithTimeoutAndRetry` 与接口封装(`getProcesses`/`getLogs`/`startTrain`/`stop`/`deleteProcess`/`getLogFiles`/`getLogFileContent`/`deleteLogFile`)。 - - `ui/tabs.js`:`openTab` 与标签选中态管理、切换后触发对应加载。 - - `ui/notify.js`:`showNotification`(success/error/info)。 - - `ui/dialog.js`:`showConfirmDialog`/`closeDialog`。 - - `train/form.js`:训练类型显隐与默认值、`submit` 整形与发起训练;合并现有 `index.html` 内联 GPU 选择器联动。 - - `processes/list.js`:`loadProcesses`、分组折叠/展开、`updateProcessItem`、状态 chip 与操作按钮逻辑(含 SwanLab)。 - - `processes/logs.js`:进程日志区域展开/关闭、自动刷新定时器管理(`logTimers`)、`refreshLog`/`loadLogContent`。 - - `logfiles/list.js`:日志文件分组、查看全文、删除项与分组高度更新。 - - `utils/dom.js`:通用 dom/help 方法(`qs`/`qsa`/`el`/`setVisible`/`setText` 等)。 -- 现有函数到模块的映射: - - `openTab` → ui/tabs.js(script.js:2–29)。 - - 类型联动与默认值 → train/form.js(script.js:32–154, 1052–1124)。 - - `fetchWithTimeoutAndRetry` → services/apiClient.js(script.js:200–248)。 - - 轮询相关 → processes/list.js(script.js:182–199, 251–279)。 - - 进程项增/改/组折叠 → processes/list.js(script.js:357–667, 467–602)。 - - SwanLab → processes/list.js + services(script.js:282–355)。 - - 进程日志 → processes/logs.js(script.js:669–788)。 - - 通知/确认 → ui/notify.js, ui/dialog.js(script.js:790–885)。 - - 进程停止/删除 → processes/list.js + services(script.js:887–1050)。 - - 日志文件列表/操作 → logfiles/list.js(script.js:1126–1462)。 - -## 加载与初始化 -- 在 `app.js`: - - 绑定 tab 切换,首屏激活“开始训练”。 - - 初始化训练表单默认值与 GPU 选择器显隐。 - - 启动进程状态轮询,只在“训练进程”栏激活;离开时清理定时器与日志定时器。 - - 首次进入“训练进程”时触发 `loadProcesses`,进入“日志文件”触发 `loadLogFiles`。 - -## 交互优化 -- 表单 - - 必填项校验与错误提示;失焦即时校验;数值范围与格式(学习率、小数、正整数)。 - - 将“强化学习参数”块 Default 折叠,仅在选择 DPO/PPO 展开;提供字段级 tooltip(问号提示)。 - - 训练命令预览:在提交前显示将要执行的命令(只读文本),便于核对。 - - 记忆最近一次配置(localStorage),一键恢复。 -- 进程列表 - - 顶部筛选:按训练类型/状态过滤;关键字搜索(按时间/类型)。 - - 操作区对齐与悬停提示;SwanLab 按钮仅在链接可用时亮显,否则显示“生成中”。 - - 进程项采用更明显的层次:标题(时间)、副标题(类型),右侧状态 chip;按钮组固定顺序。 - - 自适应展开动画与内容高度回流优化,减少抖动。 -- 日志查看 - - 自动滚动可开关(“跟随最新”开/关);复制按钮;加载失败重试入口。 - - 大文件懒加载:初次只读尾部 N 行,支持“加载更多历史”。 - -## 视觉美化 -- 主题变量:在 `style.css` 顶部引入 CSS 变量(背景、主色、强调色、阴影、圆角),统一渐变与阴影。 -- 表单栅格:更稳定的两列到单列响应式断点;标签与控件对齐;hint 文案灰度提升。 -- 状态 chip:统一尺寸/色阶,添加图标(运行/停止/错误/完成)。 -- 按钮规范:主次区分、禁用态与加载态;滚动条与日志容器对比度优化。 -- Header 与 Tabs:粘性头部、Tab 选中态对比更明显;移动端竖排布局间距优化。 - -## 兼容性与无后端改动原则 -- 保持与现有接口一致:`/train`、`/processes`、`/logs/:id`、`/stop/:id`、`/delete/:id`、`/logfiles`、`/logfile-content/:filename`、`/delete-logfile/:filename`(见 train_web_ui.py)。 -- 轮询频率保持 5s,可配置;进程日志刷新 1s,仅在“运行中”且展开时。 - -## 可选增强(后端协作,非必须) -- SSE/WS 实时日志:新增 `/logs/stream/:id`,前端以 EventSource/WS 订阅;减少轮询负载与延迟。 -- 进程持久化与重启恢复优化:后端提供简易查询缓存 API,前端减少初始闪烁。 - -## 交付内容 -- 新的 JS 模块文件(上述结构),`index.html` 改为 `type="module"` 入口加载;移除旧 `script.js` 引用。 -- 更新后的 `style.css`(保留既有风格,加入变量与状态样式优化)。 -- 无后端接口变更;提供 README 片段说明模块职责与使用(如需要)。 - -## 验收与回滚 -- 功能对比清单: - - 单卡/多卡 Pretrain/SFT/LoRA/DPO/PPO 启动 - - 进程列表与状态变更、SwanLab 链接打开 - - 进程日志展开/自动刷新、日志文件列表/查看/删除 -- 若出现问题,可通过 `index.html` 切回旧 `script.js` 引用完成快速回滚。 \ No newline at end of file