diff --git a/Implement_resolution-based_auto-sizing_multi-version_deduplication_handling.patch b/Implement_resolution-based_auto-sizing_multi-version_deduplication_handling.patch deleted file mode 100644 index 4fba2e875c243875dff665e213001f865949a302..0000000000000000000000000000000000000000 --- a/Implement_resolution-based_auto-sizing_multi-version_deduplication_handling.patch +++ /dev/null @@ -1,2518 +0,0 @@ -diff -Naur com.deepin.upgrade-1.1/CHANGELOG.md deepin-upgrade-tool-a/CHANGELOG.md ---- com.deepin.upgrade-1.1/CHANGELOG.md 1970-01-01 08:00:00.000000000 +0800 -+++ deepin-upgrade-tool-a/CHANGELOG.md 2025-07-31 14:23:49.898509455 +0800 -@@ -0,0 +1,11 @@ -+# Changelog -+ -+## [1.2] - 2025-07-31 -+- 窗口拖动功能:支持在标题栏区域拖动窗口 -+- 动态布局系统:响应式布局,适应窗口大小变化 -+- 自适应窗口大小:根据桌面分辨率自动调整 -+- 包去重功能:多仓库环境下的智能去重 -+- 最小尺寸保护:防止窗口过小影响UI -+- 增强光标反馈:智能光标变化 -+- 屏幕边界保护:防止窗口移出屏幕 -+- 详细日志记录:包去重过程的完整追踪 -\ 文件尾没有换行符 -diff -Naur com.deepin.upgrade-1.1/com_deepin_upgrade/dnf.py deepin-upgrade-tool-a/com_deepin_upgrade/dnf.py ---- com.deepin.upgrade-1.1/com_deepin_upgrade/dnf.py 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/com_deepin_upgrade/dnf.py 2025-07-31 14:10:05.873984014 +0800 -@@ -91,7 +91,97 @@ - # 获取可更新的软件包 - logging.debug("get update pkg's list") - self.available_update_pkgs = self.query.available().upgrades() -+ -+ # 记录原始包数量 -+ original_count = len(self.available_update_pkgs) -+ logging.debug(f"Found {original_count} packages before deduplication") -+ -+ # 去重处理:对于同一个软件包只保留最新版本 -+ pkgs_dict = {} -+ duplicates_removed = 0 -+ -+ for pkg in self.available_update_pkgs: -+ # 使用包名和架构作为唯一标识 -+ pkg_key = f"{pkg.name}.{pkg.arch}" -+ -+ if pkg_key not in pkgs_dict: -+ # 第一次遇到这个包,直接添加 -+ pkgs_dict[pkg_key] = pkg -+ logging.debug(f"Added package: {pkg.name}-{pkg.version}-{pkg.release}.{pkg.arch} from {pkg.reponame}") -+ else: -+ # 已经存在,比较版本号,保留较新的版本 -+ existing_pkg = pkgs_dict[pkg_key] -+ comparison_result = self._compare_package_versions(pkg, existing_pkg) -+ -+ if comparison_result > 0: -+ # 当前包更新,替换现有包 -+ logging.debug(f"Replaced {existing_pkg.name}-{existing_pkg.version}-{existing_pkg.release}.{existing_pkg.arch} " -+ f"with {pkg.name}-{pkg.version}-{pkg.release}.{pkg.arch} (newer version)") -+ pkgs_dict[pkg_key] = pkg -+ duplicates_removed += 1 -+ elif comparison_result < 0: -+ # 现有包更新,保持现有包 -+ logging.debug(f"Kept {existing_pkg.name}-{existing_pkg.version}-{existing_pkg.release}.{existing_pkg.arch} " -+ f"over {pkg.name}-{pkg.version}-{pkg.release}.{pkg.arch} (older version)") -+ duplicates_removed += 1 -+ else: -+ # 版本相同,记录但保持现有包 -+ logging.debug(f"Found duplicate with same version: {pkg.name}-{pkg.version}-{pkg.release}.{pkg.arch} " -+ f"from {pkg.reponame} vs {existing_pkg.reponame}") -+ duplicates_removed += 1 -+ -+ # 返回去重后的包列表 -+ self.available_update_pkgs = list(pkgs_dict.values()) -+ final_count = len(self.available_update_pkgs) -+ -+ logging.info(f"Package deduplication completed: {original_count} -> {final_count} packages " -+ f"({duplicates_removed} duplicates removed)") -+ - return self.available_update_pkgs -+ -+ def _get_package_version_string(self, pkg): -+ """ -+ 获取包的完整版本字符串,用于比较和日志记录 -+ """ -+ try: -+ if hasattr(pkg, 'epoch') and pkg.epoch: -+ return f"{pkg.epoch}:{pkg.version}-{pkg.release}" -+ else: -+ return f"{pkg.version}-{pkg.release}" -+ except Exception as e: -+ logging.warning(f"Failed to get version string for {pkg.name}: {e}") -+ return f"{pkg.version}-{pkg.release}" -+ -+ def _compare_package_versions(self, pkg1, pkg2): -+ """ -+ 比较两个包的版本号 -+ 返回值:1表示pkg1更新,-1表示pkg2更新,0表示版本相同 -+ """ -+ try: -+ # 使用dnf的版本比较功能(最可靠的方法) -+ if pkg1.evr > pkg2.evr: -+ return 1 -+ elif pkg1.evr < pkg2.evr: -+ return -1 -+ else: -+ return 0 -+ except Exception as e: -+ logging.warning(f"dnf version comparison failed for {pkg1.name} and {pkg2.name}: {e}") -+ # 如果dnf版本比较失败,使用字符串比较作为备选方案 -+ try: -+ pkg1_ver = self._get_package_version_string(pkg1) -+ pkg2_ver = self._get_package_version_string(pkg2) -+ -+ if pkg1_ver > pkg2_ver: -+ return 1 -+ elif pkg1_ver < pkg2_ver: -+ return -1 -+ else: -+ return 0 -+ except Exception as e2: -+ logging.error(f"String version comparison also failed: {e2}") -+ # 如果都失败了,保持原有顺序 -+ return 0 - - def get_latest_changelogs(self, package): - """Return list of changelogs for package newer then installed version""" -diff -Naur com.deepin.upgrade-1.1/com_deepin_upgrade/qss.py deepin-upgrade-tool-a/com_deepin_upgrade/qss.py ---- com.deepin.upgrade-1.1/com_deepin_upgrade/qss.py 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/com_deepin_upgrade/qss.py 2025-07-21 11:31:19.296270500 +0800 -@@ -17,32 +17,78 @@ - from com_deepin_upgrade.config import PIXMAPS_PATH - - qss_style = ''' -+/* 标题栏区域样式 */ -+QWidget#title_bar -+{ -+ background: transparent; -+} -+ -+/* 主窗口样式 */ -+QMainWindow#pkgs_upgrade -+{ -+ background: #FFFFFF; -+ border: 1px solid rgba(0,0,0,0.10); -+ border-radius: 8px; -+} -+ - QPushButton#close - { -- border-style:none; -+ border-style: none; - background-image: url(%s/window_close_normal_light.png); -- background-position:center; -- background-repeat:no-repeat; -+ background-position: center; -+ background-repeat: no-repeat; -+ border-radius: 6px; - } - - QPushButton#close::hover - { -- background-color: #E6E6E6; -+ background-color: #FF5A52; -+ background-image: url(%s/window_close_normal_light.png); -+} - -+QPushButton#close::pressed -+{ -+ background-color: #E04B44; -+ background-image: url(%s/window_close_normal_light.png); - } - - QPushButton#hide - { -- border-style:none; -+ border-style: none; - background-image: url(%s/window_min_normal_light.png); -- background-position:center; -- background-repeat:no-repeat; -+ background-position: center; -+ background-repeat: no-repeat; -+ border-radius: 6px; - } - - QPushButton#hide::hover - { -- background-color: #E6E6E6; -+ background-color: #E6E6E6; -+ background-image: url(%s/window_min_normal_light.png); -+} - -+QPushButton#hide::pressed -+{ -+ background-color: #CCCCCC; -+ background-image: url(%s/window_min_normal_light.png); -+} -+ -+/* 标题和描述样式 */ -+QLabel#title -+{ -+ color: #333333; -+ background: transparent; -+} -+ -+QLabel#desc -+{ -+ color: #666666; -+ background: transparent; -+} -+ -+QLabel#logo -+{ -+ background: transparent; - } - - QPushButton[name~='btn'] -@@ -57,48 +103,80 @@ - - QPushButton#cancle - { -- background-color: #E6E6E6; -+ background-color: #E6E6E6; - } - - QPushButton#cancle::hover - { -- background-color: #C0C0C0; -+ background-color: #C0C0C0; - } - - QPushButton#update - { -- background-color: #0091FF; -- color: #FFFFFF; -+ background-color: #0091FF; -+ color: #FFFFFF; -+ font-weight: bold; - } - - QPushButton#update::hover - { -- background-color: #0081FF; -+ background-color: #0081FF; - } - - QPushButton#update::pressed - { -- background-color: #0000FF; -- -+ background-color: #0070E0; - } - - QPushButton#update::disabled - { -- background-color: #C0C0C0; -- -+ background-color: #C0C0C0; -+ color: #999999; - } - - QPushButton[name~='select_btn'] - { -- border-style:none; -+ border-style: none; - } - - QPushButton[name~='select_btn']::hover - { -- background-color: #E6E6E6; -+ background-color: #E6E6E6; -+} -+ -+/* 复选框样式 */ -+QCheckBox -+{ -+ spacing: 8px; -+ color: #333333; -+} -+ -+QCheckBox::indicator -+{ -+ width: 16px; -+ height: 16px; -+ border-radius: 3px; -+ border: 1px solid #CCCCCC; -+ background-color: #FFFFFF; -+} - -+QCheckBox::indicator:hover -+{ -+ border: 1px solid #0091FF; - } - -+QCheckBox::indicator:checked -+{ -+ background-color: #0091FF; -+ border: 1px solid #0091FF; -+ image: url(%s/checkbox_checked_insensitive.png); -+} -+ -+QCheckBox::indicator:disabled -+{ -+ background-color: #F5F5F5; -+ border: 1px solid #DDDDDD; -+} - - QTextBrowser - { -@@ -107,18 +185,65 @@ - border-radius: 8px; - font-size: 12px; - font-family: Droid Sans Mono; -+ color: #333333; -+ padding: 8px; - } - - QTableWidget - { -- background: #ffffff; -+ background: #FFFFFF; - border: 1px solid rgba(0,0,0,0.10); - border-radius: 8px; -- alternate-background-color: rgb(244,244,244);text-align:right; -+ alternate-background-color: rgb(248,248,248); -+ text-align: left; -+ selection-background-color: rgba(0,145,255,0.20); -+ gridline-color: rgba(0,0,0,0.05); - } - - QHeaderView::section - { -- border-width:6; -+ border: none; -+ background-color: #F8F8F8; -+ padding: 8px; -+ font-weight: bold; -+ color: #333333; -+ border-bottom: 1px solid rgba(0,0,0,0.10); -+} -+ -+QHeaderView::section:first -+{ -+ border-top-left-radius: 8px; -+} -+ -+QHeaderView::section:last -+{ -+ border-top-right-radius: 8px; -+} -+ -+/* 滚动条样式 */ -+QScrollBar:vertical -+{ -+ background: #F5F5F5; -+ width: 8px; -+ border-radius: 4px; -+} -+ -+QScrollBar::handle:vertical -+{ -+ background: #CCCCCC; -+ border-radius: 4px; -+ min-height: 20px; -+} -+ -+QScrollBar::handle:vertical:hover -+{ -+ background: #AAAAAA; -+} -+ -+/* 状态标签样式 */ -+QLabel#rpm_status -+{ -+ color: #666666; -+ background: transparent; - } --''' % (PIXMAPS_PATH, PIXMAPS_PATH) -+''' % (PIXMAPS_PATH, PIXMAPS_PATH, PIXMAPS_PATH, PIXMAPS_PATH, PIXMAPS_PATH, PIXMAPS_PATH, PIXMAPS_PATH) -diff -Naur com.deepin.upgrade-1.1/com_deepin_upgrade/window.py deepin-upgrade-tool-a/com_deepin_upgrade/window.py ---- com.deepin.upgrade-1.1/com_deepin_upgrade/window.py 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/com_deepin_upgrade/window.py 2025-07-21 14:39:14.262044750 +0800 -@@ -41,24 +41,90 @@ - - def __init__(self): - super().__init__() -+ # 初始化拖动相关变量 -+ self.m_drag = False -+ self.m_DragPosition = None -+ -+ # 初始化按钮区域矩形(稍后会被更新) -+ self.hide_button_rect = QRect() -+ self.close_button_rect = QRect() -+ - self.init_rpmdata() - self.initUI() - -+ def calculate_adaptive_window_size(self): -+ """根据桌面分辨率计算自适应窗口大小""" -+ # 基准分辨率和窗口大小 -+ base_screen_width = 1023 -+ base_screen_height = 768 -+ base_window_width = 640 -+ base_window_height = 561 -+ -+ # 获取当前桌面可用区域 -+ desktop = QDesktopWidget() -+ screen_geometry = desktop.availableGeometry() -+ current_screen_width = screen_geometry.width() -+ current_screen_height = screen_geometry.height() -+ -+ # 计算基准比例 -+ base_width_ratio = base_window_width / base_screen_width # ≈ 0.626 (62.6%) -+ base_height_ratio = base_window_height / base_screen_height # ≈ 0.730 (73.0%) -+ -+ # 计算当前分辨率下的理论窗口大小 -+ theoretical_width = int(current_screen_width * base_width_ratio) -+ theoretical_height = int(current_screen_height * base_height_ratio) -+ -+ # 设置最大比例限制(不超过基准比例) -+ max_width_ratio = base_width_ratio -+ max_height_ratio = base_height_ratio -+ -+ # 计算实际窗口大小,确保不超过最大比例 -+ actual_width = min(theoretical_width, int(current_screen_width * max_width_ratio)) -+ actual_height = min(theoretical_height, int(current_screen_height * max_height_ratio)) -+ -+ # 确保不小于基准大小(最小尺寸保护) -+ actual_width = max(actual_width, base_window_width) -+ actual_height = max(actual_height, base_window_height) -+ -+ # 确保不超过屏幕的80%(安全边界) -+ safe_max_width = int(current_screen_width * 0.8) -+ safe_max_height = int(current_screen_height * 0.8) -+ actual_width = min(actual_width, safe_max_width) -+ actual_height = min(actual_height, safe_max_height) -+ -+ return actual_width, actual_height -+ - def init_rpmdata(self): - self.rpmpkgs = get_available_update_rpmpkgs() - - def initUI(self): -- # 移动到屏幕中心 -- self.center() -+ # 计算自适应窗口大小 -+ adaptive_width, adaptive_height = self.calculate_adaptive_window_size() -+ - # 无边框设置 - self.setWindowFlags(Qt.FramelessWindowHint) - self.setAttribute(Qt.WA_TintedBackground) - self.setObjectName("pkgs_upgrade") -- self.resize(640, 561) -+ -+ # 使用自适应计算的窗口大小 -+ self.resize(adaptive_width, adaptive_height) -+ -+ # 设置窗口最小尺寸为基准大小,不允许缩放到更小 -+ self.setMinimumSize(640, 561) -+ -+ # 移动到屏幕中心(在设置大小后) -+ self.center() -+ - self.setCursor(QCursor(Qt.ArrowCursor)) - self.setMouseTracking(False) - self.setWindowIcon(QIcon(LOGO)) - self.setWindowTitle(_("rpm upgrade window")) -+ -+ # 添加标题栏区域用于拖动 -+ self.title_bar = QWidget(self) -+ self.title_bar.setGeometry(0, 0, 640, 101) # 覆盖logo和title区域 -+ self.title_bar.setObjectName("title_bar") -+ - # 左上角logo设置 - self.logo = QLabel(self) - self.logo.setGeometry(15, 25, 80, 76) -@@ -89,17 +155,22 @@ - - # 自定义隐藏按钮 - self.hidebutton = QPushButton(self) -- self.hidebutton.setGeometry(QRect(542, 0, 50, 50)) - self.hidebutton.setObjectName("hide") - self.hidebutton.clicked.connect(self.hide) - self.hidebutton.setToolTip(_("hide")) -+ # 确保按钮在顶层 -+ self.hidebutton.raise_() - - # 自定义关闭按钮 - self.closebutton = QPushButton(self) -- self.closebutton.setGeometry(QRect(592, 0, 50, 50)) - self.closebutton.setObjectName("close") - self.closebutton.clicked.connect(self.close_event) - self.closebutton.setToolTip(_("close")) -+ # 确保按钮在顶层 -+ self.closebutton.raise_() -+ -+ # 设置按钮位置(相对于窗口右上角) -+ self.update_window_buttons_position() - - # 全选按钮 - self.select_all = QCheckBox(self) -@@ -117,8 +188,6 @@ - - # rpm包信息展示 - self.rpm_table_widget = QTableWidget(self) -- # self.rpm_table_widget.setGeometry(QRect(10, 125, 620, 226)) -- self.rpm_table_widget.setGeometry(QRect(10, 140, 620, 211)) - self.rpm_table_widget.setObjectName("rpm_table_widget") - self.rpm_table_widget.viewport().installEventFilter(self) - self.set_rpm_table_widget_header() -@@ -126,13 +195,11 @@ - - # 输出口 - self.output_console = QTextBrowser(self) -- self.output_console.setGeometry(QRect(10, 362, 620, 103)) - self.output_console.setObjectName("output_console") - self.output_console.setReadOnly(True) - - # 状态栏 - self.rpm_status = QLabel(self) -- self.rpm_status.setGeometry(QRect(19, 475, 601, 20)) - font = QFont() - font.setPointSize(12) - self.rpm_status.setFont(font) -@@ -142,12 +209,14 @@ - - # 更新按钮 - self.update = QPushButton(self) -- self.update.setGeometry(QRect(220, 512, 200, 36)) - self.update.setObjectName("update") - self.update.setProperty("name", 'btn') - self.update.setDisabled(True) - self.update.clicked.connect(self.update_rpmpkges) - self.update.setText(_("update")) -+ -+ # 更新所有控件的位置和大小 -+ self.update_widget_layout() - - # 安装rpm进程 - self.process = QProcess(self) -@@ -158,6 +227,9 @@ - self.repo_tray() - self.setStyleSheet(qss_style) - QMetaObject.connectSlotsByName(self) -+ -+ # 延迟更新表格列比例(确保窗口已正确显示) -+ QTimer.singleShot(100, self.update_table_columns_proportion) - - def output_display(self): - cursor = self.output_console.textCursor() -@@ -226,26 +298,19 @@ - self.rpm_table_widget.horizontalHeader().setFixedHeight(36) - # 设置表头显示方式 - self.rpm_table_widget.horizontalHeader().setDefaultAlignment(Qt.AlignLeft | Qt.AlignVCenter) -- # 四列数据 -+ -+ # 设置列数 - self.rpm_table_widget.setColumnCount(5) -- # 设置头 -- # header_checkbox = CheckBoxHeader() -- # self.rpm_table_widget.setHorizontalHeader(header_checkbox) -+ -+ # 设置表头标签 - self.rpm_table_widget.setHorizontalHeaderLabels( - [_("Install"), _("Software"), _("Version"), _("Type"), _("Size")]) -- # 设置表头显示方式 -- self.rpm_table_widget.horizontalHeader().setDefaultAlignment(Qt.AlignLeft | Qt.AlignVCenter) -- # header_checkbox.select_all_clicked.connect(self.select_all_action) -+ - # 设置表头,不因点击而变化 - self.rpm_table_widget.horizontalHeader().setHighlightSections(False) - -- # 前三列固定宽度 -- self.rpm_table_widget.setColumnWidth(0, 60) -- self.rpm_table_widget.setColumnWidth(1, 236) -- self.rpm_table_widget.setColumnWidth(2, 165) -- self.rpm_table_widget.setColumnWidth(3, 80) -- # 最后一列自适应宽度 -- self.rpm_table_widget.horizontalHeader().setSectionResizeMode(4, QHeaderView.Stretch) -+ # 初始化列宽将在update_widget_layout中设置 -+ # 这里不再设置固定宽度,改为在update_table_columns_proportion中按比例设置 - - @staticmethod - def convert_type_to_i18n_str(type_list): -@@ -493,24 +558,222 @@ - qr.moveCenter(cp) - self.move(qr.topLeft()) - -+ def update_window_buttons_position(self): -+ """更新窗口控制按钮位置(相对于窗口右上角)""" -+ button_size = 50 # 按钮大小 -+ button_margin = 0 # 按钮与窗口边缘的间距 -+ -+ # 隐藏按钮位置(右上角第二个按钮) -+ hide_x = self.width() - (button_size * 2) - button_margin -+ hide_y = button_margin -+ self.hidebutton.setGeometry(QRect(hide_x, hide_y, button_size, button_size)) -+ -+ # 关闭按钮位置(右上角第一个按钮) -+ close_x = self.width() - button_size - button_margin -+ close_y = button_margin -+ self.closebutton.setGeometry(QRect(close_x, close_y, button_size, button_size)) -+ -+ # 同时更新拖动区域检测中的按钮位置 -+ self.update_draggable_area_rects() -+ -+ def update_draggable_area_rects(self): -+ """更新可拖动区域的矩形范围""" -+ self.hide_button_rect = QRect(self.width() - 100, 0, 50, 50) -+ self.close_button_rect = QRect(self.width() - 50, 0, 50, 50) -+ -+ def update_widget_layout(self): -+ """更新所有控件的位置和大小,支持动态调整""" -+ # 获取当前窗口尺寸 -+ window_width = self.width() -+ window_height = self.height() -+ -+ # 边距设置 -+ margin = 10 -+ -+ # === 固定位置的组件(纵向位置不变) === -+ -+ # 标题栏区域(保持固定高度) -+ self.title_bar.setGeometry(0, 0, window_width, 101) -+ -+ # 左上角logo(固定位置) -+ self.logo.setGeometry(15, 25, 80, 76) -+ -+ # 标题(固定位置,但可以调整最大宽度以避免与按钮重叠) -+ title_max_width = window_width - 113 - 120 # 留出按钮空间 -+ self.title.setGeometry(QRect(113, 26, min(396, title_max_width), 25)) -+ -+ # 描述(同样调整最大宽度) -+ self.desc.setGeometry(QRect(113, 61, min(396, title_max_width), 40)) -+ -+ # 全选按钮(固定位置) -+ self.select_all.setGeometry(QRect(34, 110, 99, 26)) -+ -+ # 安全更新按钮(固定位置) -+ self.select_security.setGeometry(QRect(150, 110, 141, 26)) -+ -+ # === 动态纵向组件计算 === -+ -+ # 固定的组件位置定义 -+ table_start_y = 140 # 表格开始位置(固定) -+ console_end_to_status = 10 # 控制台到状态栏的间距(固定) -+ status_height = 20 # 状态栏高度(固定) -+ status_to_button = 17 # 状态栏到按钮的间距(固定) -+ button_height = 36 # 按钮高度(固定) -+ button_to_bottom = 13 # 按钮到窗口底部的间距(固定) -+ -+ # 计算状态栏和按钮的固定位置(从底部向上计算) -+ button_y = window_height - button_to_bottom - button_height -+ status_y = button_y - status_to_button - status_height -+ console_end_y = status_y - console_end_to_status -+ -+ # 计算可用于表格和控制台的总高度 -+ available_height = console_end_y - table_start_y -+ -+ # 定义表格和控制台的纵向占比(基于原始设计) -+ # 原始:table=211, console=103, 总计=314 -+ # 占比:table=67.2%, console=32.8% -+ table_ratio = 211 / (211 + 103) # 约 67.2% -+ console_ratio = 103 / (211 + 103) # 约 32.8% -+ -+ # 计算新的高度 -+ table_height = int(available_height * table_ratio) -+ console_height = int(available_height * console_ratio) -+ -+ # 确保最小高度 -+ table_height = max(table_height, 150) # 表格最小高度 -+ console_height = max(console_height, 80) # 控制台最小高度 -+ -+ # 计算控制台开始位置 -+ console_start_y = table_start_y + table_height + 11 # 11是原始间距 -+ -+ # === 应用动态布局 === -+ -+ # rpm包信息展示(横向跟随窗口,纵向动态调整) -+ table_width = window_width - 2 * margin -+ self.rpm_table_widget.setGeometry(QRect(margin, table_start_y, table_width, table_height)) -+ -+ # 输出控制台(横向跟随窗口,纵向动态调整) -+ console_width = window_width - 2 * margin -+ self.output_console.setGeometry(QRect(margin, console_start_y, console_width, console_height)) -+ -+ # === 底部固定组件 === -+ -+ # 状态栏(横向跟随窗口,纵向位置相对底部固定) -+ status_width = window_width - 2 * margin - 9 # 额外调整对齐 -+ self.rpm_status.setGeometry(QRect(19, status_y, status_width, status_height)) -+ -+ # 更新按钮(横向居中,纵向位置相对底部固定) -+ button_width = 200 -+ button_x = (window_width - button_width) // 2 -+ self.update.setGeometry(QRect(button_x, button_y, button_width, button_height)) -+ -+ # 更新表格列的比例 -+ self.update_table_columns_proportion() -+ -+ def update_table_columns_proportion(self): -+ """更新表格列的比例,保持当前比例同步缩放""" -+ if not hasattr(self.rpm_table_widget, 'horizontalHeader'): -+ return -+ -+ # 获取表格当前宽度 -+ table_width = self.rpm_table_widget.width() -+ -+ # 预留滚动条宽度 -+ scrollbar_width = 20 -+ available_width = table_width - scrollbar_width -+ -+ # 定义列的比例(基于原始设计的比例) -+ # 原始宽度:Install(60), Software(236), Version(165), Type(80), Size(自适应) -+ # 原始总固定宽度: 541px,剩余给Size列: 620-541=79px -+ # 计算比例 -+ total_original_width = 620 -+ column_proportions = [ -+ 60 / total_original_width, # Install: ~9.7% -+ 236 / total_original_width, # Software: ~38.1% -+ 165 / total_original_width, # Version: ~26.6% -+ 80 / total_original_width, # Type: ~12.9% -+ 79 / total_original_width # Size: ~12.7% -+ ] -+ -+ # 应用新的列宽 -+ for i, proportion in enumerate(column_proportions): -+ new_width = int(available_width * proportion) -+ self.rpm_table_widget.setColumnWidth(i, max(new_width, 30)) # 最小宽度30 -+ -+ # 确保最后一列能够自适应剩余空间 -+ self.rpm_table_widget.horizontalHeader().setSectionResizeMode(4, QHeaderView.Stretch) -+ -+ def resizeEvent(self, event): -+ """窗口大小改变时更新按钮位置""" -+ super().resizeEvent(event) -+ self.update_window_buttons_position() -+ self.update_widget_layout() -+ -+ def is_in_draggable_area(self, pos): -+ """判断鼠标位置是否在可拖动区域内""" -+ # 标题栏区域,但排除按钮区域 -+ title_bar_rect = QRect(0, 0, self.width(), 101) -+ -+ return (title_bar_rect.contains(pos) and -+ not self.hide_button_rect.contains(pos) and -+ not self.close_button_rect.contains(pos)) -+ -+ def update_cursor_for_position(self, pos): -+ """根据鼠标位置更新光标""" -+ if not self.m_drag: -+ if self.is_in_draggable_area(pos): -+ self.setCursor(QCursor(Qt.OpenHandCursor)) -+ else: -+ self.setCursor(QCursor(Qt.ArrowCursor)) -+ - # 实现窗口拖动 - def mousePressEvent(self, event): -- if event.button() == Qt.LeftButton: -+ if event.button() == Qt.LeftButton and self.is_in_draggable_area(event.pos()): - self.m_drag = True - self.m_DragPosition = event.globalPos() - self.pos() - event.accept() -- self.setCursor(QCursor(Qt.OpenHandCursor)) -+ self.setCursor(QCursor(Qt.ClosedHandCursor)) -+ else: -+ super().mousePressEvent(event) - - # 实现窗口拖动 -- def mouseMoveEvent(self, QMouseEvent): -- if Qt.LeftButton and self.m_drag: -- self.move(QMouseEvent.globalPos() - self.m_DragPosition) -- QMouseEvent.accept() -+ def mouseMoveEvent(self, event): -+ if self.m_drag and self.m_DragPosition is not None: -+ if event.buttons() == Qt.LeftButton: -+ # 限制窗口移动范围,避免移出屏幕 -+ new_pos = event.globalPos() - self.m_DragPosition -+ screen_geometry = QDesktopWidget().availableGeometry() -+ -+ # 确保窗口不会完全移出屏幕 -+ new_pos.setX(max(0, min(new_pos.x(), screen_geometry.width() - self.width()))) -+ new_pos.setY(max(0, min(new_pos.y(), screen_geometry.height() - self.height()))) -+ -+ self.move(new_pos) -+ event.accept() -+ else: -+ # 更新光标状态 -+ self.update_cursor_for_position(event.pos()) -+ super().mouseMoveEvent(event) - - # 实现窗口拖动 -- def mouseReleaseEvent(self, QMouseEvent): -+ def mouseReleaseEvent(self, event): -+ if event.button() == Qt.LeftButton: -+ self.m_drag = False -+ # 根据当前鼠标位置设置合适的光标 -+ self.update_cursor_for_position(event.pos()) -+ super().mouseReleaseEvent(event) -+ -+ def enterEvent(self, event): -+ """鼠标进入窗口时的事件""" -+ self.update_cursor_for_position(self.mapFromGlobal(QCursor.pos())) -+ super().enterEvent(event) -+ -+ def leaveEvent(self, event): -+ """鼠标离开窗口时的事件""" -+ # 重置拖动状态 - self.m_drag = False - self.setCursor(QCursor(Qt.ArrowCursor)) -+ super().leaveEvent(event) - - - # 更新设计,暂时不使用自定义表头 -diff -Naur com.deepin.upgrade-1.1/com.deepin.upgrade.spec deepin-upgrade-tool-a/com.deepin.upgrade.spec ---- com.deepin.upgrade-1.1/com.deepin.upgrade.spec 1970-01-01 08:00:00.000000000 +0800 -+++ deepin-upgrade-tool-a/com.deepin.upgrade.spec 2025-08-05 11:26:23.423203271 +0800 -@@ -0,0 +1,94 @@ -+%global pypi_name com_deepin_upgrade -+Name: com.deepin.upgrade -+Version: 1.2 -+Release: 1 -+Summary: Deepin upgrade tool -+License: GPL-3.0-only -+Source0: %{name}-%{version}.tar.gz -+BuildArch: noarch -+BuildRequires: python3-devel python3dist(setuptools) desktop-file-utils gettext systemd -+Requires: python3 logrotate python3-PyQt5-base python3dist(psutil) dde-control-center -+%{?systemd_requires} -+Provides: UnionTech-repoinfo -+Obsoletes: UnionTech-repoinfo <= 1.0 -+ -+%description -+Deepin upgrade tool, when the user logs in, an updatable application pop-up window -+will pop up. Through the pop-up window, you can open the Software Updater and select -+the software to update. -+ -+%prep -+%autosetup -p1 -+ -+%build -+%py3_build -+%{make_build} -+ -+%install -+%py3_install -+%{make_install} -+ -+%find_lang %{name} -+ -+%post -+%systemd_post pkgs-upgrade-info.timer -+systemctl start pkgs-upgrade-info.timer >/dev/null 2>&1 || : -+%preun -+%systemd_preun repoinfo.timer >/dev/null 2>&1 || : -+%systemd_preun pkgs-upgrade-info.timer -+%{__rm} -rf /var/infomation -+ -+%postun -+%systemd_postun_with_restart pkgs-upgrade-info.timer -+ -+ -+%files -f %{name}.lang -+%{_sysconfdir}/logrotate.d/%{pypi_name} -+%{_sysconfdir}/skel/.config/autostart/pkgs_upgrade_notify.desktop -+/root/.config/autostart/pkgs_upgrade_notify.desktop -+%{_bindir}/pkgs_install_tool -+%{_bindir}/pkgs_upgrade_count -+%{_bindir}/pkgs_upgrade_info -+%{_bindir}/pkgs_upgrade_notify -+%{_bindir}/pkgs_upgrade_window -+%{python3_sitelib}/%{pypi_name} -+%{python3_sitelib}/%{pypi_name}-%{version}*egg* -+%{_presetdir}/98-pkgs-upgrade-info.preset -+%{_unitdir}/pkgs-upgrade-info.service -+%{_unitdir}/pkgs-upgrade-info.timer -+%{_datadir}/applications/pkgs_upgrade_window.desktop -+%{_datadir}/polkit-1/actions/org.deepin.pkexec.deepin-upgrade.policy -+%{_sharedstatedir}/pkgs_upgrade -+ -+ -+%changelog -+* Thu Jul 31 2025 zhouyuanyuan <2535682878@qq.com> - 1.2-1 -+- Update 1.2 -+ -+* Wed Jan 05 2022 weidong - 1.1-5 -+- Delete reminder desktop -+- Optimize DBUS judgment -+ -+* Tue Dec 28 2021 weidong - 1.1-4 -+- Bugfix bug-view-109558 bug-view-109559 -+ -+* Mon Dec 13 2021 weidong - 1.1-3 -+- Update installation dependencies -+- Update readme package name -+- Add pkexec reminder configuration -+ -+* Mon Nov 22 2021 weidong - 1.1-2 -+- Support internationalization -+- Optimize security selection window -+- Optimize directory structure -+ -+* Thu Oct 21 2021 weidong - 1.1-1 -+- Update 1.1 -+- Add update window -+ -+* Fri Aug 27 2021 heyitao - 1.0-2 -+- modify the title of the notify tip -+ -+* Thu Jue 3 2021 heyitao - 1.0-1 -+- display repo infomation -+ -diff -Naur com.deepin.upgrade-1.1/.git/config deepin-upgrade-tool-a/.git/config ---- com.deepin.upgrade-1.1/.git/config 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/config 1970-01-01 08:00:00.000000000 +0800 -@@ -1,11 +0,0 @@ --[core] -- repositoryformatversion = 0 -- filemode = true -- bare = false -- logallrefupdates = true --[remote "origin"] -- url = git@gitee.com:openeuler/deepin-upgrade-tool.git -- fetch = +refs/heads/*:refs/remotes/origin/* --[branch "master"] -- remote = origin -- merge = refs/heads/master -diff -Naur com.deepin.upgrade-1.1/.git/description deepin-upgrade-tool-a/.git/description ---- com.deepin.upgrade-1.1/.git/description 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/description 1970-01-01 08:00:00.000000000 +0800 -@@ -1 +0,0 @@ --Unnamed repository; edit this file 'description' to name the repository. -diff -Naur com.deepin.upgrade-1.1/.git/HEAD deepin-upgrade-tool-a/.git/HEAD ---- com.deepin.upgrade-1.1/.git/HEAD 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/HEAD 1970-01-01 08:00:00.000000000 +0800 -@@ -1 +0,0 @@ --ref: refs/heads/master -diff -Naur com.deepin.upgrade-1.1/.git/hooks/applypatch-msg.sample deepin-upgrade-tool-a/.git/hooks/applypatch-msg.sample ---- com.deepin.upgrade-1.1/.git/hooks/applypatch-msg.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/applypatch-msg.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,15 +0,0 @@ --#!/bin/sh --# --# An example hook script to check the commit log message taken by --# applypatch from an e-mail message. --# --# The hook should exit with non-zero status after issuing an --# appropriate message if it wants to stop the commit. The hook is --# allowed to edit the commit message file. --# --# To enable this hook, rename this file to "applypatch-msg". -- --. git-sh-setup --commitmsg="$(git rev-parse --git-path hooks/commit-msg)" --test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} --: -diff -Naur com.deepin.upgrade-1.1/.git/hooks/commit-msg.sample deepin-upgrade-tool-a/.git/hooks/commit-msg.sample ---- com.deepin.upgrade-1.1/.git/hooks/commit-msg.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/commit-msg.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,24 +0,0 @@ --#!/bin/sh --# --# An example hook script to check the commit log message. --# Called by "git commit" with one argument, the name of the file --# that has the commit message. The hook should exit with non-zero --# status after issuing an appropriate message if it wants to stop the --# commit. The hook is allowed to edit the commit message file. --# --# To enable this hook, rename this file to "commit-msg". -- --# Uncomment the below to add a Signed-off-by line to the message. --# Doing this in a hook is a bad idea in general, but the prepare-commit-msg --# hook is more suited to it. --# --# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') --# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" -- --# This example catches duplicate Signed-off-by lines. -- --test "" = "$(grep '^Signed-off-by: ' "$1" | -- sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { -- echo >&2 Duplicate Signed-off-by lines. -- exit 1 --} -diff -Naur com.deepin.upgrade-1.1/.git/hooks/fsmonitor-watchman.sample deepin-upgrade-tool-a/.git/hooks/fsmonitor-watchman.sample ---- com.deepin.upgrade-1.1/.git/hooks/fsmonitor-watchman.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/fsmonitor-watchman.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,114 +0,0 @@ --#!/usr/bin/perl -- --use strict; --use warnings; --use IPC::Open2; -- --# An example hook script to integrate Watchman --# (https://facebook.github.io/watchman/) with git to speed up detecting --# new and modified files. --# --# The hook is passed a version (currently 1) and a time in nanoseconds --# formatted as a string and outputs to stdout all files that have been --# modified since the given time. Paths must be relative to the root of --# the working tree and separated by a single NUL. --# --# To enable this hook, rename this file to "query-watchman" and set --# 'git config core.fsmonitor .git/hooks/query-watchman' --# --my ($version, $time) = @ARGV; -- --# Check the hook interface version -- --if ($version == 1) { -- # convert nanoseconds to seconds -- $time = int $time / 1000000000; --} else { -- die "Unsupported query-fsmonitor hook version '$version'.\n" . -- "Falling back to scanning...\n"; --} -- --my $git_work_tree; --if ($^O =~ 'msys' || $^O =~ 'cygwin') { -- $git_work_tree = Win32::GetCwd(); -- $git_work_tree =~ tr/\\/\//; --} else { -- require Cwd; -- $git_work_tree = Cwd::cwd(); --} -- --my $retry = 1; -- --launch_watchman(); -- --sub launch_watchman { -- -- my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') -- or die "open2() failed: $!\n" . -- "Falling back to scanning...\n"; -- -- # In the query expression below we're asking for names of files that -- # changed since $time but were not transient (ie created after -- # $time but no longer exist). -- # -- # To accomplish this, we're using the "since" generator to use the -- # recency index to select candidate nodes and "fields" to limit the -- # output to file names only. Then we're using the "expression" term to -- # further constrain the results. -- # -- # The category of transient files that we want to ignore will have a -- # creation clock (cclock) newer than $time_t value and will also not -- # currently exist. -- -- my $query = <<" END"; -- ["query", "$git_work_tree", { -- "since": $time, -- "fields": ["name"], -- "expression": ["not", ["allof", ["since", $time, "cclock"], ["not", "exists"]]] -- }] -- END -- -- print CHLD_IN $query; -- close CHLD_IN; -- my $response = do {local $/; }; -- -- die "Watchman: command returned no output.\n" . -- "Falling back to scanning...\n" if $response eq ""; -- die "Watchman: command returned invalid output: $response\n" . -- "Falling back to scanning...\n" unless $response =~ /^\{/; -- -- my $json_pkg; -- eval { -- require JSON::XS; -- $json_pkg = "JSON::XS"; -- 1; -- } or do { -- require JSON::PP; -- $json_pkg = "JSON::PP"; -- }; -- -- my $o = $json_pkg->new->utf8->decode($response); -- -- if ($retry > 0 and $o->{error} and $o->{error} =~ m/unable to resolve root .* directory (.*) is not watched/) { -- print STDERR "Adding '$git_work_tree' to watchman's watch list.\n"; -- $retry--; -- qx/watchman watch "$git_work_tree"/; -- die "Failed to make watchman watch '$git_work_tree'.\n" . -- "Falling back to scanning...\n" if $? != 0; -- -- # Watchman will always return all files on the first query so -- # return the fast "everything is dirty" flag to git and do the -- # Watchman query just to get it over with now so we won't pay -- # the cost in git to look up each individual file. -- print "/\0"; -- eval { launch_watchman() }; -- exit 0; -- } -- -- die "Watchman: $o->{error}.\n" . -- "Falling back to scanning...\n" if $o->{error}; -- -- binmode STDOUT, ":utf8"; -- local $, = "\0"; -- print @{$o->{files}}; --} -diff -Naur com.deepin.upgrade-1.1/.git/hooks/post-update.sample deepin-upgrade-tool-a/.git/hooks/post-update.sample ---- com.deepin.upgrade-1.1/.git/hooks/post-update.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/post-update.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,8 +0,0 @@ --#!/bin/sh --# --# An example hook script to prepare a packed repository for use over --# dumb transports. --# --# To enable this hook, rename this file to "post-update". -- --exec git update-server-info -diff -Naur com.deepin.upgrade-1.1/.git/hooks/pre-applypatch.sample deepin-upgrade-tool-a/.git/hooks/pre-applypatch.sample ---- com.deepin.upgrade-1.1/.git/hooks/pre-applypatch.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/pre-applypatch.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,14 +0,0 @@ --#!/bin/sh --# --# An example hook script to verify what is about to be committed --# by applypatch from an e-mail message. --# --# The hook should exit with non-zero status after issuing an --# appropriate message if it wants to stop the commit. --# --# To enable this hook, rename this file to "pre-applypatch". -- --. git-sh-setup --precommit="$(git rev-parse --git-path hooks/pre-commit)" --test -x "$precommit" && exec "$precommit" ${1+"$@"} --: -diff -Naur com.deepin.upgrade-1.1/.git/hooks/pre-commit.sample deepin-upgrade-tool-a/.git/hooks/pre-commit.sample ---- com.deepin.upgrade-1.1/.git/hooks/pre-commit.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/pre-commit.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,49 +0,0 @@ --#!/bin/sh --# --# An example hook script to verify what is about to be committed. --# Called by "git commit" with no arguments. The hook should --# exit with non-zero status after issuing an appropriate message if --# it wants to stop the commit. --# --# To enable this hook, rename this file to "pre-commit". -- --if git rev-parse --verify HEAD >/dev/null 2>&1 --then -- against=HEAD --else -- # Initial commit: diff against an empty tree object -- against=$(git hash-object -t tree /dev/null) --fi -- --# If you want to allow non-ASCII filenames set this variable to true. --allownonascii=$(git config --bool hooks.allownonascii) -- --# Redirect output to stderr. --exec 1>&2 -- --# Cross platform projects tend to avoid non-ASCII filenames; prevent --# them from being added to the repository. We exploit the fact that the --# printable range starts at the space character and ends with tilde. --if [ "$allownonascii" != "true" ] && -- # Note that the use of brackets around a tr range is ok here, (it's -- # even required, for portability to Solaris 10's /usr/bin/tr), since -- # the square bracket bytes happen to fall in the designated range. -- test $(git diff --cached --name-only --diff-filter=A -z $against | -- LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 --then -- cat <<\EOF --Error: Attempt to add a non-ASCII file name. -- --This can cause problems if you want to work with people on other platforms. -- --To be portable it is advisable to rename the file. -- --If you know what you are doing you can disable this check using: -- -- git config hooks.allownonascii true --EOF -- exit 1 --fi -- --# If there are whitespace errors, print the offending file names and fail. --exec git diff-index --check --cached $against -- -diff -Naur com.deepin.upgrade-1.1/.git/hooks/prepare-commit-msg.sample deepin-upgrade-tool-a/.git/hooks/prepare-commit-msg.sample ---- com.deepin.upgrade-1.1/.git/hooks/prepare-commit-msg.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/prepare-commit-msg.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,42 +0,0 @@ --#!/bin/sh --# --# An example hook script to prepare the commit log message. --# Called by "git commit" with the name of the file that has the --# commit message, followed by the description of the commit --# message's source. The hook's purpose is to edit the commit --# message file. If the hook fails with a non-zero status, --# the commit is aborted. --# --# To enable this hook, rename this file to "prepare-commit-msg". -- --# This hook includes three examples. The first one removes the --# "# Please enter the commit message..." help message. --# --# The second includes the output of "git diff --name-status -r" --# into the message, just before the "git status" output. It is --# commented because it doesn't cope with --amend or with squashed --# commits. --# --# The third example adds a Signed-off-by line to the message, that can --# still be edited. This is rarely a good idea. -- --COMMIT_MSG_FILE=$1 --COMMIT_SOURCE=$2 --SHA1=$3 -- --/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" -- --# case "$COMMIT_SOURCE,$SHA1" in --# ,|template,) --# /usr/bin/perl -i.bak -pe ' --# print "\n" . `git diff --cached --name-status -r` --# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; --# *) ;; --# esac -- --# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') --# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" --# if test -z "$COMMIT_SOURCE" --# then --# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" --# fi -diff -Naur com.deepin.upgrade-1.1/.git/hooks/pre-push.sample deepin-upgrade-tool-a/.git/hooks/pre-push.sample ---- com.deepin.upgrade-1.1/.git/hooks/pre-push.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/pre-push.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,53 +0,0 @@ --#!/bin/sh -- --# An example hook script to verify what is about to be pushed. Called by "git --# push" after it has checked the remote status, but before anything has been --# pushed. If this script exits with a non-zero status nothing will be pushed. --# --# This hook is called with the following parameters: --# --# $1 -- Name of the remote to which the push is being done --# $2 -- URL to which the push is being done --# --# If pushing without using a named remote those arguments will be equal. --# --# Information about the commits which are being pushed is supplied as lines to --# the standard input in the form: --# --# --# --# This sample shows how to prevent push of commits where the log message starts --# with "WIP" (work in progress). -- --remote="$1" --url="$2" -- --z40=0000000000000000000000000000000000000000 -- --while read local_ref local_sha remote_ref remote_sha --do -- if [ "$local_sha" = $z40 ] -- then -- # Handle delete -- : -- else -- if [ "$remote_sha" = $z40 ] -- then -- # New branch, examine all commits -- range="$local_sha" -- else -- # Update to existing branch, examine new commits -- range="$remote_sha..$local_sha" -- fi -- -- # Check for WIP commit -- commit=`git rev-list -n 1 --grep '^WIP' "$range"` -- if [ -n "$commit" ] -- then -- echo >&2 "Found WIP commit in $local_ref, not pushing" -- exit 1 -- fi -- fi --done -- --exit 0 -diff -Naur com.deepin.upgrade-1.1/.git/hooks/pre-rebase.sample deepin-upgrade-tool-a/.git/hooks/pre-rebase.sample ---- com.deepin.upgrade-1.1/.git/hooks/pre-rebase.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/pre-rebase.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,169 +0,0 @@ --#!/bin/sh --# --# Copyright (c) 2006, 2008 Junio C Hamano --# --# The "pre-rebase" hook is run just before "git rebase" starts doing --# its job, and can prevent the command from running by exiting with --# non-zero status. --# --# The hook is called with the following parameters: --# --# $1 -- the upstream the series was forked from. --# $2 -- the branch being rebased (or empty when rebasing the current branch). --# --# This sample shows how to prevent topic branches that are already --# merged to 'next' branch from getting rebased, because allowing it --# would result in rebasing already published history. -- --publish=next --basebranch="$1" --if test "$#" = 2 --then -- topic="refs/heads/$2" --else -- topic=`git symbolic-ref HEAD` || -- exit 0 ;# we do not interrupt rebasing detached HEAD --fi -- --case "$topic" in --refs/heads/??/*) -- ;; --*) -- exit 0 ;# we do not interrupt others. -- ;; --esac -- --# Now we are dealing with a topic branch being rebased --# on top of master. Is it OK to rebase it? -- --# Does the topic really exist? --git show-ref -q "$topic" || { -- echo >&2 "No such branch $topic" -- exit 1 --} -- --# Is topic fully merged to master? --not_in_master=`git rev-list --pretty=oneline ^master "$topic"` --if test -z "$not_in_master" --then -- echo >&2 "$topic is fully merged to master; better remove it." -- exit 1 ;# we could allow it, but there is no point. --fi -- --# Is topic ever merged to next? If so you should not be rebasing it. --only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` --only_next_2=`git rev-list ^master ${publish} | sort` --if test "$only_next_1" = "$only_next_2" --then -- not_in_topic=`git rev-list "^$topic" master` -- if test -z "$not_in_topic" -- then -- echo >&2 "$topic is already up to date with master" -- exit 1 ;# we could allow it, but there is no point. -- else -- exit 0 -- fi --else -- not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` -- /usr/bin/perl -e ' -- my $topic = $ARGV[0]; -- my $msg = "* $topic has commits already merged to public branch:\n"; -- my (%not_in_next) = map { -- /^([0-9a-f]+) /; -- ($1 => 1); -- } split(/\n/, $ARGV[1]); -- for my $elem (map { -- /^([0-9a-f]+) (.*)$/; -- [$1 => $2]; -- } split(/\n/, $ARGV[2])) { -- if (!exists $not_in_next{$elem->[0]}) { -- if ($msg) { -- print STDERR $msg; -- undef $msg; -- } -- print STDERR " $elem->[1]\n"; -- } -- } -- ' "$topic" "$not_in_next" "$not_in_master" -- exit 1 --fi -- --<<\DOC_END -- --This sample hook safeguards topic branches that have been --published from being rewound. -- --The workflow assumed here is: -- -- * Once a topic branch forks from "master", "master" is never -- merged into it again (either directly or indirectly). -- -- * Once a topic branch is fully cooked and merged into "master", -- it is deleted. If you need to build on top of it to correct -- earlier mistakes, a new topic branch is created by forking at -- the tip of the "master". This is not strictly necessary, but -- it makes it easier to keep your history simple. -- -- * Whenever you need to test or publish your changes to topic -- branches, merge them into "next" branch. -- --The script, being an example, hardcodes the publish branch name --to be "next", but it is trivial to make it configurable via --$GIT_DIR/config mechanism. -- --With this workflow, you would want to know: -- --(1) ... if a topic branch has ever been merged to "next". Young -- topic branches can have stupid mistakes you would rather -- clean up before publishing, and things that have not been -- merged into other branches can be easily rebased without -- affecting other people. But once it is published, you would -- not want to rewind it. -- --(2) ... if a topic branch has been fully merged to "master". -- Then you can delete it. More importantly, you should not -- build on top of it -- other people may already want to -- change things related to the topic as patches against your -- "master", so if you need further changes, it is better to -- fork the topic (perhaps with the same name) afresh from the -- tip of "master". -- --Let's look at this example: -- -- o---o---o---o---o---o---o---o---o---o "next" -- / / / / -- / a---a---b A / / -- / / / / -- / / c---c---c---c B / -- / / / \ / -- / / / b---b C \ / -- / / / / \ / -- ---o---o---o---o---o---o---o---o---o---o---o "master" -- -- --A, B and C are topic branches. -- -- * A has one fix since it was merged up to "next". -- -- * B has finished. It has been fully merged up to "master" and "next", -- and is ready to be deleted. -- -- * C has not merged to "next" at all. -- --We would want to allow C to be rebased, refuse A, and encourage --B to be deleted. -- --To compute (1): -- -- git rev-list ^master ^topic next -- git rev-list ^master next -- -- if these match, topic has not merged in next at all. -- --To compute (2): -- -- git rev-list master..topic -- -- if this is empty, it is fully merged to "master". -- --DOC_END -diff -Naur com.deepin.upgrade-1.1/.git/hooks/pre-receive.sample deepin-upgrade-tool-a/.git/hooks/pre-receive.sample ---- com.deepin.upgrade-1.1/.git/hooks/pre-receive.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/pre-receive.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,24 +0,0 @@ --#!/bin/sh --# --# An example hook script to make use of push options. --# The example simply echoes all push options that start with 'echoback=' --# and rejects all pushes when the "reject" push option is used. --# --# To enable this hook, rename this file to "pre-receive". -- --if test -n "$GIT_PUSH_OPTION_COUNT" --then -- i=0 -- while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" -- do -- eval "value=\$GIT_PUSH_OPTION_$i" -- case "$value" in -- echoback=*) -- echo "echo from the pre-receive-hook: ${value#*=}" >&2 -- ;; -- reject) -- exit 1 -- esac -- i=$((i + 1)) -- done --fi -diff -Naur com.deepin.upgrade-1.1/.git/hooks/update.sample deepin-upgrade-tool-a/.git/hooks/update.sample ---- com.deepin.upgrade-1.1/.git/hooks/update.sample 2022-07-25 09:59:12.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/hooks/update.sample 1970-01-01 08:00:00.000000000 +0800 -@@ -1,128 +0,0 @@ --#!/bin/sh --# --# An example hook script to block unannotated tags from entering. --# Called by "git receive-pack" with arguments: refname sha1-old sha1-new --# --# To enable this hook, rename this file to "update". --# --# Config --# ------ --# hooks.allowunannotated --# This boolean sets whether unannotated tags will be allowed into the --# repository. By default they won't be. --# hooks.allowdeletetag --# This boolean sets whether deleting tags will be allowed in the --# repository. By default they won't be. --# hooks.allowmodifytag --# This boolean sets whether a tag may be modified after creation. By default --# it won't be. --# hooks.allowdeletebranch --# This boolean sets whether deleting branches will be allowed in the --# repository. By default they won't be. --# hooks.denycreatebranch --# This boolean sets whether remotely creating branches will be denied --# in the repository. By default this is allowed. --# -- --# --- Command line --refname="$1" --oldrev="$2" --newrev="$3" -- --# --- Safety check --if [ -z "$GIT_DIR" ]; then -- echo "Don't run this script from the command line." >&2 -- echo " (if you want, you could supply GIT_DIR then run" >&2 -- echo " $0 )" >&2 -- exit 1 --fi -- --if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then -- echo "usage: $0 " >&2 -- exit 1 --fi -- --# --- Config --allowunannotated=$(git config --bool hooks.allowunannotated) --allowdeletebranch=$(git config --bool hooks.allowdeletebranch) --denycreatebranch=$(git config --bool hooks.denycreatebranch) --allowdeletetag=$(git config --bool hooks.allowdeletetag) --allowmodifytag=$(git config --bool hooks.allowmodifytag) -- --# check for no description --projectdesc=$(sed -e '1q' "$GIT_DIR/description") --case "$projectdesc" in --"Unnamed repository"* | "") -- echo "*** Project description file hasn't been set" >&2 -- exit 1 -- ;; --esac -- --# --- Check types --# if $newrev is 0000...0000, it's a commit to delete a ref. --zero="0000000000000000000000000000000000000000" --if [ "$newrev" = "$zero" ]; then -- newrev_type=delete --else -- newrev_type=$(git cat-file -t $newrev) --fi -- --case "$refname","$newrev_type" in -- refs/tags/*,commit) -- # un-annotated tag -- short_refname=${refname##refs/tags/} -- if [ "$allowunannotated" != "true" ]; then -- echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 -- echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 -- exit 1 -- fi -- ;; -- refs/tags/*,delete) -- # delete tag -- if [ "$allowdeletetag" != "true" ]; then -- echo "*** Deleting a tag is not allowed in this repository" >&2 -- exit 1 -- fi -- ;; -- refs/tags/*,tag) -- # annotated tag -- if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 -- then -- echo "*** Tag '$refname' already exists." >&2 -- echo "*** Modifying a tag is not allowed in this repository." >&2 -- exit 1 -- fi -- ;; -- refs/heads/*,commit) -- # branch -- if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then -- echo "*** Creating a branch is not allowed in this repository" >&2 -- exit 1 -- fi -- ;; -- refs/heads/*,delete) -- # delete branch -- if [ "$allowdeletebranch" != "true" ]; then -- echo "*** Deleting a branch is not allowed in this repository" >&2 -- exit 1 -- fi -- ;; -- refs/remotes/*,commit) -- # tracking branch -- ;; -- refs/remotes/*,delete) -- # delete tracking branch -- if [ "$allowdeletebranch" != "true" ]; then -- echo "*** Deleting a tracking branch is not allowed in this repository" >&2 -- exit 1 -- fi -- ;; -- *) -- # Anything else (is there anything else?) -- echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 -- exit 1 -- ;; --esac -- --# --- Finished --exit 0 -diff -Naur com.deepin.upgrade-1.1/.git/index deepin-upgrade-tool-a/.git/index ---- com.deepin.upgrade-1.1/.git/index 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/index 1970-01-01 08:00:00.000000000 +0800 -@@ -1,83 +0,0 @@ --DIRCb --gb --g (=Y=YLnl6hfF`aV(pLICENSEb --gb --g )=Y=Y⛲CK)wZS MANIFEST.inb --gb --g *=Y=Y\bEZQ[![Makefileb --gb --g +=Y=Yz|IKsr)J9Y:9R README.mdb --gb --g ,=Y=YYԺ* 1658714353 +0800 clone: from git@gitee.com:openeuler/deepin-upgrade-tool.git -diff -Naur com.deepin.upgrade-1.1/.git/logs/refs/heads/master deepin-upgrade-tool-a/.git/logs/refs/heads/master ---- com.deepin.upgrade-1.1/.git/logs/refs/heads/master 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/logs/refs/heads/master 1970-01-01 08:00:00.000000000 +0800 -@@ -1 +0,0 @@ --0000000000000000000000000000000000000000 b4ab154a09617e803fd6cd3b65744f74f024f1e1 loong_C 1658714353 +0800 clone: from git@gitee.com:openeuler/deepin-upgrade-tool.git -diff -Naur com.deepin.upgrade-1.1/.git/logs/refs/remotes/origin/HEAD deepin-upgrade-tool-a/.git/logs/refs/remotes/origin/HEAD ---- com.deepin.upgrade-1.1/.git/logs/refs/remotes/origin/HEAD 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/logs/refs/remotes/origin/HEAD 1970-01-01 08:00:00.000000000 +0800 -@@ -1 +0,0 @@ --0000000000000000000000000000000000000000 b4ab154a09617e803fd6cd3b65744f74f024f1e1 loong_C 1658714353 +0800 clone: from git@gitee.com:openeuler/deepin-upgrade-tool.git -diff -Naur com.deepin.upgrade-1.1/.git/objects/pack/pack-2412f4a6ef675a425c2fd93234799390a6881b56.idx deepin-upgrade-tool-a/.git/objects/pack/pack-2412f4a6ef675a425c2fd93234799390a6881b56.idx ---- com.deepin.upgrade-1.1/.git/objects/pack/pack-2412f4a6ef675a425c2fd93234799390a6881b56.idx 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/objects/pack/pack-2412f4a6ef675a425c2fd93234799390a6881b56.idx 1970-01-01 08:00:00.000000000 +0800 -@@ -1,57 +0,0 @@ --tOc !%'+++-.1568<>@DGJJKKLMOPPPPVYYYY[\]]_abcchknnqssssvx|| -- !$$%&'*+.001355:;>>@@BDEGHJKMMRUX[^^bdhjlnrrttttvxy|E{"~gqrv65.O7ɬ#2/UK.%,͜Z_OU_:_@N\8vp :Տ9sra nNeh3{t qڛ* ^*>Ht'MY5}"6֋ --4 b;tݾX$bCb`O #]xս7EVs͓YZ&U?+Wcf,>]"SD݇AkJH9 9I;Ām;t #'5kKuQd=ԟŻ@.=s[&5@r8-mjeRH}Y!1K\!-5ƨj Иf[RhRD_ 7 `w'tFu --eErxf1[Nː --x` < --hC6N$D @<#)&.LX,A sSpBBZV6#q tLZ4Y 7bp)YѢC7 3I3з6@ c!wp/! /x~bVY.U+oB @UeZi`DJxa>1 ƋI{_Stכ4?*urmc{Y_^rLZ{L὏lwtyiօx霿ÄXkenPJQB>eԅs3ZIZV5d#gb:f _>G}Zs|کČN@±a?8?]Yf+8cP&~nTnl6hfF`aV(p%F6>^.>0Z\r"RNR=ΰRJ /# u^ --@Vw;S= RdXRvpFoi^̿ktIX+fa'+%{_]D2-t>j3 uN~x^S --*#4?970dHfBJ,f'W0ҏVz)Ȃ9֝9}5 --╯!snS.}VDMODnmNc#h> aV2MOͰ --?vƵ5 )u9z?AR1fDž9 ˚5omx@N=V50S- =Hm0VDc`Gd#r7}|pa7pΦa[c&D~LQf --d.;UTiL,^Ԉ9LyҳԽͅ uŁd"8E-.3{)#[+*OaUfx&$BaEf D$T!n&l, )%@uyJ:)x* --YA6ꡍX!)1"4hlMm)NUruEhTP&)a3QA{ J[w)Ǽ*]>nE[)땗FS'4N.=Ȣ/*LE+}|L$_ --*cJ62RnjwY*%XoB"i,.g&d ݓ;C.q+VnC*^-m/װ!NpI>w0k&^|mG깺2Ln{2⑀G/[B-^53twzB75Dry`?@}7FozU ԎC7]FSzH\1*?< sB0fRg -"@[Q{٣f9@@dz#3Ty@sI[Kmo kLA6ɖGm6V9:lAu|y l79T*e#B)0Kael%\4Bb!\`Z&)[BqHʾc1*B*#6Q"gJD{f.Fͩ#HILUD2?NlyIaD¶;T73\jZD{ǎ)YqTR%MtEx;=vPJ1FyV9; --F| RߒL/|GZ@9"YTGG.y\Gˋ( ]UOHSK7m8rRIi;aD1lAOFIU03XgaM"j"mLax'N9=LTOᇘ?Sb N[怍elMOO19(UЉxIcOb&($vUP IGnhrGQknFAKOϜMrs|ASPX. ExEzSr ݱTpĨrϵsS^tܐjO{B-@S!A?0'!|%V< d⋑F˖#Vv$`̺h'ZbB --ݳ\c/U[.2J n*z3.na[:^NotdEbz=[@VWSxsk[!"U}@6CKb[c$@(NEd --X[MN凖w9uoA"\R\:W6[IƝ6VV\bEZQ[![^+r0VW ;A]z]^|Ws*M!i Rts^ $Ǣ:,8 _(}cm_E?=S;EL 㠐#`"!1wUo޴}a|y74k*g Cap V!^Z!r^aPrXa+Ahܮ/'O9jו29~H\lt86TI --SAvm@!|]cRFJUmscBk_BOPvgqWan"a%G*rM^>xff&o%Ԫ䋟wP|p5fn}22 \iVpQD!7bSp?qIJ5t-sBi@<WS]sZ{GdCaLRRHsxJ0R)Mgt>B&uedLi~u4]C$!X-X:wIsݗO`{ --9g?|KTIG,L~Htv3$cYGUj.$q:?v"7JV x{ BzE+Dzd2 dCGڈ=\\\M)PQ/ϲSog߀QWy۠Fw*&뫁3|҉yxדө& Eҳ~|0>|0/"oӵȟ3Y&SГ[aH$-yyÔYԺ* ]ZUɧܕ `4cFl"k!v]p`-io_3}kp[6Mjyud4>_woLja{V)t(OQwI͉c]Vz#y̔ciYx80v6j/ %+p9UVW ;/{SP1S EZ An5%ƃ#Oo0z C|-ȉ0w"KOr{^x['.W2?v%|():& =5Q& 酪9DGt ecz+^tc-xɥV`ulN-KX~ o}Ua#:c6?XOP@|)n<*~C:MdbBjVфhZa୳){D`9^ --F$P<J a~?;etOt$N #K1Otе`wD.V)o&w}22b*cbu=ZO 8xƊaguJ˸)~A e ICv 0F STp Б6"TMYƻ 5'ݠBQNR --&bN,-av2}:3D(URV 1ّ:IO:˴fI(4˝=v\HکR =R N\u_sJ -z~U' m;{Lo}]Hg̽1g: =F_[,?je rviflB??׾ոzS,jA'Ծ SvsѶ8W 4M(GaҶR%uR";:}۷[4\I#SX[ܵmU0;O2!SPE Dmt --m0SdtgjBx`UT1.ߣxlw --~tX<;Tjv e7D-4tssDW Y1f)> --@≕)\q8>̴mrZ%)G޳NFHX@xщ ã;>j45gTV<,rFl lvF0JT7⛲CK)wZS??]A%{O5g6 --v߮)Ahu-jܿUTEb'-ZX^8MKm$}(bVJ.'=B)^=}Hӂ` @E sCG9뷁{e{v햇)*6J{o&t +Pwj+>PsӐddۭYd+.<2Lj~$'\|)y4}C>W&*^nզ0qx>4VNI9PH>-pfHo( zS- n^O --5uqͻ⊰Rtd7mQ(џT̋xHPCVGV9WK#0 B67]aZ׿Wqb%{T6gl-o ---EJFNilCW4\ ) =)V)mcTr+BO#zV=Lz [ 5 B̜Z -- ŋ0Mj `OVbCg?^w/2.; 6t·-}NlPr|I:E3 |L%Ԁ[ KPk%pi}ZRu#@`x`uH|Q>ɰ6=Fh4KKo/I|qebKmt,iu2ReQ7W&{WWḟB]d#dFBPC6+X|F+Z?2=HE[*0KDNmk%tLD`Z(s.kX5?D&]܀ TGuK儙x 4܏ +iW=V`( P,穥U@q:zc&8(%r=O|`ShM*N8,q=;+T;n ϡ YVN`/y:[S_a~uXTČze5a\KC ZfĥT͡ Docp*h_,ɕoUlGu<$=h25Í]߅qaGZ1y87$}0|1b)n*d;?1j0}3SuȱL:BX& Ө.JĤw˱qQܓ6hchC%5p,XpsgqqLkmf vo"?ѫ@; jޒFHmY>{%# >`gN<_{dIC ,9^ --o !~Dڃ=AtiݪӭBןQq5IRoĖ"0{S4~=`j/b.БnȺ6@ !%rnvnME#lz[[T$PQwU(co'Pai})v --K%_Zty} ~Ů9|u}E}=V{ kRmȈ/I pvQ*jsZf' IU KLѰcsq iLF Pwaz*C%RWhӨǞy rэI 5:w=d”REvH\~+B0: 'NfHhwzu\qNt/X4:J4Q]N `;/5r/.n2.wvQB Y)}'IBBYP4e!tZO=Au@˺(_@[必^$cv|z7oчzsoa5w --WDy_W"s0!w=ț\^6Ȩa)$[_k7 P\G~kD]t%% ?&*Ԓ6vrPJ --\ږzB9MZJ&%7'1&|ZȒp_M۩W>Q#^-:-%^|敯{2&̠fuNK|)5y$4Ο;Bא&XmmVnUEnv) --9:CwH^|)v?Cuʤ Sv &Q^8*=ƽTcQ1fl20`9E+#d m}Eq2phkNFѶ`ǐ-s+{D:\txѦ~(*:KtsB-/g!Lt)),(J#!c)CmhAp-i\%,(jJ"e^eCseq$L5S% .VM;%*^d~D PI-rn|tpT'+xy;Wpn^j&gO$iPM r!"Dΰ2&|f[Oc;_b+sKt{<}=]X[S}p;? Mes0 ْjS?%-o<pc-W &,-d7IAQ=;lw1-xBc pHmyr+mMqE@QRW TCAnTXM V̉\4*wxNtEz,M=lt*$fîmneW PEg~Q~}*˫Co)Tt(nj&(kL$6) }g; @` m{` --cJm E5Qwnp${|9#4H@eWCsP(q5 BUslRq;>pX:{KOmr {a^qynwD.s}q!= J/3jU;ϗb --%r%Uvpђ--h .WNaiv&Q@/(I$gZB\/24yVNCLa~6DRr --& -\ 文件尾没有换行符 -diff -Naur com.deepin.upgrade-1.1/.git/objects/pack/pack-2412f4a6ef675a425c2fd93234799390a6881b56.pack deepin-upgrade-tool-a/.git/objects/pack/pack-2412f4a6ef675a425c2fd93234799390a6881b56.pack ---- com.deepin.upgrade-1.1/.git/objects/pack/pack-2412f4a6ef675a425c2fd93234799390a6881b56.pack 2022-07-25 09:59:13.000000000 +0800 -+++ deepin-upgrade-tool-a/.git/objects/pack/pack-2412f4a6ef675a425c2fd93234799390a6881b56.pack 1970-01-01 08:00:00.000000000 +0800 -@@ -1,649 +0,0 @@ --PACKΚJxuIVflCѻ`3KcLk0(K I&u/2IrfUTGӵ < yFĂ0Hs4a:"Ӽ D@$D Àx:IAc)Z`y(ǂ(I2 EQ1Yb1t!O}V-j\۷0{ | 3(7ͷaU|H}p %Ep {yRV-{YRR',oMS3k{m/N ued;u6~*irݜ-?s{. --v$B([˥PMi4tZ= 8p^U^d<ՊR|M,cnep61kMz58jl4 };{(M[MdoJ\UڴGFqW&Ar*UBkVb HpgcOBő-Oq{:4%dvf&;?+w]wV2ӭgM`X{2Q`iJ4[AW^fNcz.1bRrbgS>V5H}9p5X%ȏ&NƹI.(m5tSnW.["(SҮ2wEA`B>mZY*/mw.]N816c#eGң$6ZѹDe߰>~_>~P۪Hag'YTI~% Wq֟{cx1N0ݧ^8~~n2A#Ćبԡ3b@bBX^Y:F5j<"@X+7pi"1(=pVy4@b 7^}y}z*M]\Ř>eչ}<׺Ay@˙ e^vB\va87m~`KxuFsSbk׌6B"! f ܙ)W9vUq<ֵˑ퓝?ӷy(b,q9@.X@%0dL"-zI9K!|r$ #(1/2~1J?{CE#Eb00±$!*nA}%JҾ%{AfIi{y --'}OZUݒkxM״S.U[wY[zn9Uϫ`Pq[q3UUp ~/ BFVM9V.qUljߤYDcΤDžO_{+uaH csU{۩OGRmae\2^v(.=SXAl\u?+8%sem?YTMl'_$z3 --A=;UvũŸ?* OӶZ̔m$oT~Wf:9֒3z6_i53$W,Y\jEOG'61'IE7[ tuEjqp&ӓ"YǮըS[Y\avћNfք/q6mȎJХ3q=*(1-e1{߼ w$"JIF~FY?q5{;`FfŠ3Y>wl!^>3拒$ҍv :&RL*"I3ϙ{b[0d,=m%Mnj1&BhΫ3P ) mxLe~CTumW=#~8ɶjYL9@y+]t|6eYwf.?(ߛѶZ 㧯?ӯ_>Բ/߁q_ P6d$Kx$*=rz:I 4xMJ1@9EҒI' ?_:hF tWw --R\ DĶ ]3u3YUd22e;Dy-ey']D.9ۂ>JxuSɒFbfmp6bÍY"6-_4vd;oUQ9Œ\.( D,ˑiJtLfh:41#f@"%q0PL y֔gi[H4p:Q*!*U.q,#dq g7WLI%J --JB*Fid9݂#%[a|Os?XO?ɷO}_<7~?_y+Lm{~ǻ`NƮ1HK4x<7)b19pa8rҌalW] Pշ$p.zEVзz{ mi\,Po]Eii]8ĖLK\eOz#U!5ZҐ5N6G&!|vN82(ca$:U,E [f0F GY<. --Q<i  ̬RGѭ$JR3OR'>4O6e۹:6&bXu-}}u0AȦ ^!fJӓNLw3{-^r־g%8h>8ۣQ0d dMZLY --'Mس؋`ȠL2k[COA8Zט|wG6ߺydA_Ԓ1l2r1։i9ثfh:B- n:\x[U]+RK2O{}_=_!j  ЗO/ןx^~_ȺoqE,8$pw{caTe(b'Qy0oQ x=J1>H/+d"akM]zBa$MjKTAl#'-aDYN}VWTn(EO%rѼ$׎XdMğ2![N3@YU/$UQQsVːm&|>j_*Vmz݋_St4*PVVb(uK#G,iJ2iG")vhCjO6ߣUޏmUٜ,BPy-sWw=;ʞjVmox|ف"NJ?@5䐉6hM9Rk4LG]?7^*wt>Mָ?DOO|N:VDWAC6O#儾Ve9LyPn˫dO9T.`)ДfK,-ZsqUL|Wz, 32F?(2(]1'̨_h>ӯˏ>Lm|%cF&J1K_?\x=J1>H/+/ɼLF;xL3vc*""b+iX _偈D2&%C0 U>ZځR^ @DZ @QD~sږ=ͻ7P,E4 f]؝YߣYUYί:<|Pu l %cS$QD,%ΚȾxClt RI]Za=R4+kf hQlEd@њdì[v"ncY/Y&qN(8h ABVo+ig`S5 --^fekˢrU ded6TRZ(s2rV唦6'c*Bf+H0.nu*_i --[`滊A+kU&jqq;Q}ʕq1,5p]QK!hH7tbd<O3I5CHmPvݕXkЈ-]<^. ˛~}~_߾x~廷/?})mU|izR9hЄCxHQ29fIyU'QxAJ@bRy̤ MEĝX\F (.wAL&[~_qCVM@VSD*FkE$"i'H(qZQ9HRQŐtDBYPUƂXZxX~~>kyi1=úfX8V"`u{OXmr8z|up݄Eha Owӂtnd6e?,uJxuIFY1ٻ9Zo͎ 3vd;oUVE!i@"R JO) !9aQI0/$ܗ3%Y9$!(Dc^$F/HD0QbHO+a@PTDϦ=?'K,P`|24n&_~Tug=QJ<VGcc[[ϚjzVk=w9*M2msŕs|E)M}pH7+/܎c4ɺBxmiIhEXh:J66xʀ-u5y>X`[ʫi,5Qerw̅j^iX]wv3AѡohJ#MBUPBqqLwҞyjCjB+YY)U8Odgȗb>sQoP {vKZv"t ޚE᜹ +nj\!gZ2{Zy!]9bT~Et!M{3\5+Efp3KGMby8 p3Hg3i3*& --9=12X.g^֧X%f?^(^{ y.鮁ۺWjwof_0 St&T2|֫~џ̹A9 \Vv-1`t/V-izڵzIC](m3: 9ɘ$<뾉fE|n[w s0jIk w[ş Fݙ07YuCqL4ΣJ'`yZ}:I`*ux=n0ݧcب@O 8UvFڭS@1*or#רCX"` XƗKD2gDRT$ --*LjkJ[Cn_>ݸyϸ|S !]7S߭i9 --$ 6xwĖ+wCS[powLxuST~{^tJev^ݶIB !DEy;k8\>Ѭ5t Bd --cN1P V -- QbA18᱀0X@d%0bxO?* 1̇B2 Y!#D.-Pg"imhPBa.UӽG,m6H2~Q0mj]ǥڕPnv2TH]HұZma:܆ 2S9,WkYȑnav\nN3z6~=܅6{x1b֜csalL } 2Pevƍu/ڲ ҽ+9 ~7R +-778r[f x;+U _DhC_KNjN4kQ>YH\{JM1S1p^,1zE.fnRXeHG$kE _[%se 2wϟ~ۯF쏷w|Wo?~z/~!&My|3 SP_Xe$eIKUxMJ0@9E2kFD'H%.&"э0(FAq%i&^A\=xBc-5*0IQi^8!ǂ99Pqre}XR@*!`T h@P 뭛vCwgtPA}4d&C: V0F;BϞV{VbN"&^WQHmmJ~DKKxuV{bF;\m``laX`l\E#IDJ"E(oD|3K#w(љ2t"DzBqy!EA>DG%U CIPdE:f`q0 <"%taLK4 i82p$b( HOcFcBC;P7Cx9=x'H@$I}0O?B r"Z=^ϛUur~?7g) t{`cꮼ ֋80ݴ"ˊ˕[Xyj$fHڍ0IW|n"KI+77ˁ *)QuMn؎p-0E06ѦӤju&dxyGG-co&ip(ޢ]5yDÒoR̅-,E 4cեs-4l^zն'ԅņ C2T SN?d_ `dW7PhGOp_o eqWrlIJ$Bia*y --S Z@tډ ػ=W=!R4Pq$1s.9}X((5{vĢ.$VKYNsvK=I<*,b&/# M,zn3.3Bj=eWoF(` Bт6^FZ {-Jߟ):;g.HڳY)o2+Te[k;oU_ǵ}5VKL1RA .QqU ǙنfCCK!]\}RRbڭzg9wYrsqmyYHZx;"}_ |LJ~?~闟 _i^n'@X /3EZWĦȫ'_? yȟx?J1>H/+3IޓE'Hfv،f;ADA- AaOD^Al>Fn --B%IF)Gƀ*-A`}LkAF$D*'C+Jz>=t*34_6֐.X7um&@[m+x{T^n)&$mm~4kJxuSFXx}k,/IQ$fG[U>H'r >=߇U#إk%-ҮC ؤ2ӇjPϟ<5nS ޾o'`nL`o7'\o80"ˊRvqګ|7>|M~lΥY|['z;%\\IYYyW<ƣ|{iaA"L+6cwd8HKG }q7صܦ讶svrZ5 [/IVX}+R>)p.3N3;s|q^b6; Lu#\o,WJ --UV f&E涮epM *'e)G/bgliK/;w:=E8|)Vrj:d>v]Sx)lxۤA%YlW v0d ѶICETQVf4+[,f*R_Mfd֯Ἱ!plXCeA2>/>}LoMvȎ=i$GR~uw٠HM>7vQ2 u~̝2s.xk~. --nFs> gAlm\>Į- ǣP&)PKv%O};' NY|$3ʽ&˕F=G|zOm '/}/?J|MqACFWQUv_Rwx=JA~N1$"aE,$H"(ZxwIn\A~<SH; Fqi%zYV9(`!(" bL`7 }iAH[MVu~NgGA{ʒ$+T˶Y=Nqm sYw'_F10xsv?m$%$iYU4#/eAJ77eQ;4}Ο5pȳ)/7l-"V --ǺXR<̗IOt/9S oϝukeuue mQ$ź j0|.49͌젛G⌊Y(W,w΋mgۙ{*eJkq7CtZm~pWd-Bj<W+\Вɧ*d}o-C䎓zﴝ@}ut9e~F$A^CWCN#2䰽CE.BxQxp --CRc>%?-iI\0)0/O~?%Z\؈dƜ/~W`YM}'ɯi\\Nvh!w:z&>¾;yjjGA7})Hi~>moEqq_z%NxuKTuk|A-/I8s/؉WlDU.@n TuЮ VwFͼe1! --X_ --B Y`1! iJ,BO%/AT'BfBm,} ӒD sH "Ą_qS\p~ +2|~fƱ@AqǤ,q r|:4EH"p6>[3ҧr @v,+j$LƸS>UNJ>K;WkT`oOVճ 2?hH`F]^"[dSJU --˗=rqQ.-s=s٩# Pxɔ6Fó3:ÅTrabgX*TH0/ q›@i^0 yhNKeθta@7cT+QOֻ| R ̭Вa \V6TIEm0<0:)r1Io&#գ;Me?( 2^ώ:Kۇwˎ5k% Sjk̸uꭋKkg --YoljZtN8&]{YStge2Bh8yIG&huUJr\(/kWFq؂2s;KM/ەi뱻Ķkmztfj!UΧr"YZ)<J^ޠ4 OqsR{&m0ev m&?Ͽ.rIR5}{7_?~|<~o~?=i" n0 ڷ'(KN7J^-xMJ@@sKe/6"<|fщ)ŝ EBQXbKW0W "JK4@{X7h0xU4!NvE6U!TC@#hVけ "6gŃ;luF+ --h7;6E\WqkV@pꌑ4 7DYv#n>k7}w4]}>/vG.geb:}OD S{#*JxuɮT~:x8P7jN;q!ZDlYTubtZҵ} y;p0uGo'^{ʒ$+WV~7^H]3큟n0u2G|%ǫ-=v$nfreVZ1FI({/b[;zBo;^dZ5p1d3|karv/˛q3|pxfXX2x;R7'9$34Yr32I2r !Mܰ-)ms)c:3fn%y2iAf_8ǞuymyՎ ŷOe: f՞YlSͨ n fTv7}J2XQva΍K))*- Ur٪?q?`O]Ȗe7Fu\Q$JHjߞY;9eϿ/~%.y~3@xx񌓷hJq^__?9yxxMj@@sL'"<̌‰ ZYPw.Zn[iB{h `d_<0uEyAR04$;F=Ōϗ^I 3Eтy^ě 04 j8ccxu11yAR).W/]R`jryIʞ%J2JZAxAIёZ<(vfx!Ԯ*x#Ndaѐ)Mk --D ΨuB~NxKC <͎IO:P{DC#,VHy%\׷i0)Ƣݑ4TX^EcGOb\ك-v^QL{1` דjuUD@2AHs\ԤxaŒŦ"AcPDyXd8Ě'kQJtE+NuTt/'}M7ԉ|פt\͉k(P^]:,I5&ZP^}=2!G`ͩ|o'TB<%ԤZʳ^Vݒ3ymsyqt`I|/В(Q]\:餌h-٩DQg|3[MA! ᷯ?_][߁i޺ pL) ޼ Ӡ*,JWQџzx;N@=Qw~lwy/v52k!::4)ib+Hfrȝ !F)[؃0e5mo0 O(؉Λ?f0N[>oŽRKxuID:Ev<4DK`ْ,[wTuKbM7qt8=p؎o ;]4}k~ئ^nk~lBnǙ|xQs{,<<<,UV5r е .t84iքb+\=^ժ$  ݦ+{['S{Fz &.A<Ǻ{+;)-8#u\*NǙrUΰUl)Vȸ{c3tnz;NU/߳MaV9@"a[_ŴÝi$2`qZwȂ9u"+_[4i`N[=,n$yܤe6e|j$-^=9I~Ẩx[2gU1 -`EXzY磣9 v#1E8yM`N 4siv.lxW&n{ ֩VaU(gEϾ%f.aQW׵KǓ̞\ޢ;?b`6ءH[kݯ 6lL>ce".L bd'o$ev/\9LS6 .ܪXDNzPSRc1o5.1`qt^%_r*RudszY)V ȩk^<ۧI5/,gG|ϗ)| 1c ~ bZq_0otHHK84%u`i\=qE* cx1N0ݧN^B܁8~%#ԹbAtkՉ!Ċ\Fۯ@$-ڠ Ά2ij@gCi. hXah*. -hN+A1wieZO?_Oy~w>x9>L; i~!uLiՅ?D\hD]>``\Y(ªVc, --{bv%SZ$VYW Y3rz>~MWf0ݿcsCR}G\RJ߃ --tL;q\?v45۟򃱓T/R wq|LxuSˎT+.k'Amqq׾~$gg54 b5h!&_jUuNբΩK+4Es,BDAЧHs}xbDc+qV!E!O(X<>y,!_Y( --A֓(Q 9 JHzekTS3qy'wT" x_C@! HGӤq I";8?vѻ<ܽ e4X`1^dlɫ= 'J* #9S䠏+;p_X3>pok5L.7rAYVFj'e;F^Ӝ+r42Z%$|)}zUo --jش(T!"ݺh*RLיZ fF|d3^*U9IZYhl_v OZלHl΃M3l^љ #,SBhء95*iJ=ƨװZ,-L2GYm-|wNJvV|J?[9ggS #crnCHærpsqUW~R-U0мl& zm :!'XCQE[ΰ״0a☑ZFB6t2 {կ;lijnXCcI ȧE6,`2 1]6\e+Ɩ^\7Xl 游%ƛfC\G<)M[N!$gFgݫQJv*7{Bzec3mvSgk --V Npȡ/eYKmruaJėxY"C홑cX --~׷O<}?߾~O_'~y?Soas[ܡ_2>Ῠ?WxOJ0F9E2&MwM˴i;eat܈@QčbWs^A}-p(u@@J阰Hhd; WTݤX EHhibFT IRJjvW˯7?<ޮ,,l]-cTRF$!Zww蚱MݧIWp^cw2o_͢nҘ: Z=JxuIFY1[8s BHtYXŪ_fv򫪈C= Blii>ٔ `̤QpSMcDQ! --@h@LLFLNŘi琐0ILb##K1@&18Mx|q3,- --];j?AcEbpbnz>Qf"ߒU`[w,ruտ80oYd%j1Rߍ] --vDO%e\́o7dښ&$)xHRm --mw\$Gu3āoYrN"Z4D#/*[SA*R }Wl%|gcF`LU^-'jR/+" $֥JO$tn Q4iA0ۗWyzF q4^K3pa. Vّ{ --JvEgXnEgRFp>vn֘E`0J1>HQZʗf0,Ӏln6:oVCjCu/f&at]7xVG}5nQ}qxՊ{ 8\^AmgU."MgWuYĊc8ۡ)_>-uP=3FׯFIDB_7 1`C}C\曊f_-Jy˘bsb:f1FuH ~ϧy3wgTk_!~cD % PQ7 9+8o /ܤFmzx=N0@ާp!gx!8jDQRp6&fdс9.L)%tH'.Mhަ4WIAf0^\KK])osD1 = * e=''TV]6qd6}$~FRN%fvCpQIR3sH}Q{ !i --ًjW6ZK إ>̑1-Ⱥqb۳Kʍo23zHq6٭LZFGn\Ѱ> e5wھvVo YܕLкW^%Kyܨ gNu5h#.mj --1=F[ʎMl3#{y!WaX6~nD,d\Aۭj/o -#'_|PZsiV+ --$Z.tf{20׍!!g\H]\}jS,=BSzW86eU'{a=0+(O>~o釷?Jhmun.PݿPT$ "O\Jqڒx=JA~N1Dί`~nY"vX(VD<;[+SoP|:u9!Ja -- --@:8#-9Lz.0Rii hNDTGb\nޟŪl_qyS˺?SӦ2)*YUt1^>z^rIĝB~`Kxu˲F E|EgL 4I]06Y4y4o>>Iedϴ$T&KN%"|DTEB(AQ(%E 8B0Rb9  ,*TU T$% s --eSÓ*#DR,s1YRPV ]NN²?Nť_qP KĠӶ%iGQRR;J4_t_̺D+tN_^VOr詛ªo]ɭ[[}Ǻ 4wm=!Z j;w]sH+س{m ?eq솇Ic[s{V(DP -fLW0lu_,2WFmw1O ݸIGU elgx;h(]^ZZ&bBBKmqɌnR ---SP͗HcwMٳN,D{OJK܆W>SϩfՎg7+NGsIODžx8$g$pv^:Kڕb[g0TM1f!Xq[@ehC/p\?@?U˹WV;7v#$6 --BɜenR lYx0[7Kz/bReɯǽ-7p$Ia};Gp+ԛ?OYs%ȍlPxꙮ)J]SQLQIvYW&F k(%as++^a$ϱ?\VL| X_:Y;} M:JP5e9a0Z?ajID_MIEsJ8WO~x1N!SЛ5 0XyO f,6vi-q'ýo@RtLHbʡ:.qx.Zd@iJ; --K*pncm[￿^?2lt.Fa< us;(%z&FYa֒򚸟P(jJ+s n|,KxuSd?utvѱė8$o;5鑐@m ͊,<Y073FSL10K%Fcdq>Hp GꠍDpE\sE0=Ԉdd0&$˜ 9' B# p$CZPq׸}+X8O$C`YڸޞY4a]z멐zYZkm1K<)GL&PpְRTǓuc,<%vXuڠ%{3+c_A>"O/߼{˗󻗷_|7?EmU|iz1>lL+@YZ>*I% Ğx?N0ݧދc; '&C!fT   C+8Mmz b:8G\',t$Ҹc<"YE-#ӹ&p23RIhKIF9td6Lv|Mg4KY o vQIP| --[GuK0|Wq2^"?<]=Gahz?;eKxuSIT4_e$[4σ-`ˎfi:!XˬEeV=@ą4ӁEҐDJ@ A z\ b "I8f0x~3@9pC %m2d x8pZ;_:p,+j" --U_ u'AzyGnr7 --E=ZkZ ˚'$FnV9"M4u --VcP}wRɡeGKB!HV>+W0)s?/GFmVt ðr2BN##L]MڮUWY۞"sDV! f(ȼFg6k`r!Wof*5Eҍ 'i93"ye#y .͊yEmBR/2JJf9r~ Ys;3730̷ʰKR8d~e秓괥N GdD{ee!)î钶go̶j*&Tn{w/"m |/d>tkS4d90s tdZHԜqxqL*?@żeTexfrn`#/pvDۿg֕)0̱*PJ|n<ރe=Һ$sjkCLe#}cWļI]7|~j+zv v@uHRDzėjFQ $}}P`ù3>ς$}_AOoIJoo2-wgQS'E SOIx=N0@w;*/P'3bg+b@D1t .^>=8HIҒ(}RY[bA^3ۇ6qyb"^$;zwo~4=mX6]}<FH?lOMJ!_|^q c͢ լq.`/WMxuT{?Ŧu͠c;\;N8l;K|!CC@̜S --䀨[Z_L( 0D"@ 舎AH^P(9^iND CD`Q!)C !d})Dg8r KxM}K8A5x%R1H|^? s@C,(]ĝq]hq}U"Em^p!V*]Yõjn;}c --2qGi{nΉP15|; 2qv{;cvBrbtf} 2+ۃd(W3oo=F --],RcK ZcvZ's*l'j< Th/lO@p3p]J++.iz,"d?D7Kܫh(uJI7i{3. Ֆhi@gq[oȣH&-?1zsy#{ڒswSCR8C%33D 'kZVMQ#-zdU;fۮdz~~%F^q6ҙ2[&J̨C|ro?>Uq':Gu7~w÷?=?7o?>==񎘔yx:bw^(y%@qqj 񒛔xKJ@bRdIFxO042). "H.).|2ЮBq->~G+TL9Ip͵2h**47*Q4"R@3TAvYYatOw/񹰓YV6/Ŕ0)> )!hW9?~1Tkl}{tgw߬?a\o_u zT3дDKxuTs=UZ[v۲6+rX.9' #*Ixfg;K9C!}bD1O QcaߡjAHӌFalc!  --O=GG<1B | `@dB!#:B1CZwxݠ --)m[d!O8̆u Uub}NӔ4I%I?'_Q4-Cc8ϽzDQ&b%,S3텛nJ[k3m K!Qµyl48^gdo!,&Y(uvB×OՍY%{Ugk5饸Yð$ϼ%B ]z Owc --;^k/(W?R\W&j;.k&kq'DŽUc Â~8PCQ遯-siRa3z>:د=lJ_i#Vl9zCwk'fr>ߎzu6հ5r1W4O}_>GLy>1MQ_(ʢJ.YR=pJ ([x?J1>H/+/o&D 3lSl X,{+WIPySDآ#dJ7E%(GQEG6Ig =`Xk*Y1pDbi= --?xy|gb^w9;|YCtmޭžTF)*@Exu>)8l-I< '{[‚UKxuTs=%V5vjjf[d-˙{XvK(H©e.xPDw"ؐa!Dc1 !EQC̄b2'8:hѥXBw]@S,i˜ĘQy^!^!O Y E{81ØHCV-jtACڇ({)V`$>6QU~ hcx --V2{=?T-5N,oVcYV|Qevyr~N=DNS*}1zT"@:ey2&Y.ڍ[Sw-oBVoJ,^h&k2V5>mM 2oԻNICTuƃ3 ZWBdX[-(L$-yr,,kfL?Ph; [ڋTUNE,2qMZnҞD؛BpT_An9j]AcoGΓW|K۴&+@Rśk_{vSal3X{[6FSI*(pTc<Hj̺mx>6h'XMWV*nu;?6xi%vCN'En\xip@YtVWUwue`st#+x ---i,4j!p%gƌϔ~BMLjp3f>bXM= 1z1yjHfd:gy>Z,+j׺ 9<_QLm9E=G9li /#k'`L,"85T}'8;6q=9ZêeFߊ铚USD:(}KIߞQ7r ?|SW菏_ˏ~嫏޽}@hmU~q|R@l5C#W$,qJ*yx=JA~N1D̊H~"a3ؘtQ b'XFJLvW+[u),BQXE -#-ӫn >dYhv+2ArV`mX+m `p3G]iUf^\,yFqM{Uvs}@u̖=fw#nq"^;,ݥƖ_C{Ti7:FV  i ., z%yTآi"NzJ}HW2"Z4W^j)7MˢsMz:\z =OmU{g(VGA ͑ol2@^?Qhn~A̹i69<DH ѧÚ=}D$mtXϫhrv?!ɺ1%r#X|קz|Dž¥ --e] $B2+`J-Utjmƀ^v GL.ݱ1_4#ŢٖCX__|gI1f[70>ǞxMJ0@9E2$͗DD'oEۡkfF :\z --{/vc FSF9= T)eUmj|.nX>;?Mq\}SMܵm} pr!N& mi]B0Oi~7j}{nh!Lߎ/-lJxuIңFV --BAİc(BLzxa_5#vzB"!b --<1 36G^\1p!VH8!,$9a9b!2$(&l&#$q8E*sۃ#W26K˷1봽|2AAyzK9 z9~pm{5ŗx"Y-;p0_S$ySHWٵZM$nLo展f.ƪ!man#ގ)@Ǿ%kqO=ѓtݜLUij䭉=on>JOdr09n,}-:xSͪ?3GzN8_S`d&Gic,A2myfeԲyPw<ӫuNnlUͺmXa~`HJΏZ܊3Vnj˵  JP5^.c70&ɡB1vN[ٴȶ-4RtI鷦]I4f> Xӹϟ4w H)Բ|9]{G=QmM݌xRãqU5ֹA&0wE-5?.hh1VuRMV~6LSaaloCS)Q%*wCHX[sf}M&SdQSw3ˮGϴOn#&. O#v4.qɡQ>`aœWOKƜo)-;3VP_q ?矒|>v?jO${K_()Z eq}6yx1N0@ާpy&8AqN$:(8BԈ@ЭD@b&p r/,hEp%$qNYut5h-uUAE@ 9mvo~ؿOç k'I&~ĝ3+vAOn"*`sfhk0Hx*ᅐB!B D,qEe`$HFaB("bh=]pG24dHHstDQ$DĂKT5*QBª/JSX?$ )FvgYסYwEY>?EI\<|YQuXjJIce9ɒ$wFVt6%Ϫ{k~ RYݖZAn ggv€$oMR5\.mu7܃bq:>Mǧ*aGY|$;%=ߴqƥ…:өOQJyyIElV)dB5@"4igirU'Of͚nh<ªa-^IےQF)M --]Kxy\llI]$pQ:OrtM-E+2׭ b}o94v[^kHn/$ZQ*[\f `6.1.rԱYy(t IoL94L6iϵ< UYpbMF,b.YC[<* ˍM׈ IjLJX}Yiu֫^ }J) wJ(%_:{lnc}{R{PF5Mlb5L]&0^bbc>D˟}o>_zw_>?x[38 %fh@C8~`QUeRϒNWq_x=N0@w;*rvB܁5TbDC lH Z& --N\zoh`Ds(,)c"QR@F)f*RE2A.hy&SfuCn^qx|s?} ϋuesBʡ|P#d (ϛJxuSIFsSAv|h c$f1yu0#v2_Fc --p IA(~yPCsėC?, T>,=9'.N\O]3^\- Op1R=!0^(nn]{@>j^Ek5xIѥ!= --]00饽0[}X6KX +y --4E9=zKdf1-yzaSafd --sԛߘ<"HVMow73dR VFoDv5K[cըyKeN8,lǖ܏9ζQy،,lF4Q\`)U洣34 &uwV%+|WOxk+S~o߿?^%u]d^1l%x7dqyLuJ| Bzx1N0ݧ\;B܁7T#Č؊eBbc@ 4$p ̒4VqH`B)N =$ --="Ԟ 1YKZ[XLT;t?oz^݇ yn!].-33U+%tٖ'Gbz99Wii֥4û~JxuSIVb3`0`Lg{Fs`ְ/%( *,'6H$Y:tJ3t%qi bOb X '!$ C!$)D crbL"A1Ԏ("wqņ(M,c)${݁ ؽE[X4{~hU -auӧ`S,G?I,o$ ,:#s/~L%{HьQkS W3х@.ڔҜƍ8,#NUxuCoʆb9;Q詶ؗ]UQjJ;Bs^Ga%̋uiz7궇Œ*9qQ!z.'g1Ƀ{Ek}QgxFtIJkÄ'm=V)C9ܝJj2VT>JsZd#`dmi]Ã)RKmʹ0HFj_/wBdK*72D$X.UEw \0 Wq;YUpܮf+9r>V4YpO]bUSu-s --i!w6NT|vd˓ydR/o=A+Zφiŕ- GhS mJi&=XWe^OV}|>Spa+s+7ﱹvNt3ŗ/KJcKmҽVZsJdk4 a!'tDbqLQ7i³ix/1)pVO=~rɳ>U]x\ϨT3s8 +o_~gD>[ 0~ fq] vV/N_|^x=N0@ާpَc#If6)Aъ-QЮAhI Clc #:oQlcFg%4<XPճCn^?jzCobZ7ɐ.eê[/vPBV@y\moH?ts]%8.~UX|LxuSɮT+.6Fq'Ia^$~˖@, jH i5ApvuΑJ4g0- IFq˂e1+,yLU~ --P$CId刧a>y?b<GHD"'cI `!dedHR6Pj!( x!ѼȳXe1`AԝSBPwzQ Nc\(63F>[[j/)@K;y)Hbӣԃ.W9HiuC["p }evwz X ZbMՑ=?ddks$"=8' --1KμuؙSt묶v/`ќtdwGC*Cbfmvi}us --M? ar֕0Gn4=kҬ.`iqى{c)C4YS./qV@s{GdЋ<[[IϢvrV,~u9B"3H[LF,Z3]Pűu`%j$Vd! IXki2M 6ha@/ !ЯO깵]L\4 --%;[PMpJ;CZH*ɪfs9#p:w pXFE8K]'**TہT#[F*2d --x㣸uevfoXH?k3B.áP48سubQ٪uQ5)JT/<;.y]ic@˂b --E@/ 䐋!Ha"ZB6&eX --((8Dx!Ƞ2/a --a1/H,!Zz$>h$b*DDӪUK-`Ճwʼn#K*K2H%Eq Z\ߧɧ:}ҍ=ptxW/NzVET]3ԏ SUMsq_z10Ո,>H dv6}G\Q}pZ8}z''BӤv2â '@l$48uhr ܔBz|9RyUf?3+G@OC=[FwcS%#S+$zhC ^l'?N-@0EդjK|.5,E[gdh|q=}:A --F`Sz,f,$ T)_InH=P^شN r-&?S(wHx`ܴ˩mtֹn:g$s[MAK>kA^dXpzc0^}J߭k> --lsصˢ.[Gk[Lfm Pnm>j]12Šjy1qY$~6GҼX֫(PtlLַqreaZnX({1ep\CEnGnvj 8L5x.Ou]^!WkdRg>AxH3>/??wĺ/qߺ"1L2M -- --" ("DxRX0<Һu+8{~O % --muT߿$M2p؋޳v@>UuryO>YJo-`6%O~%IV#+ --Wnn1Tզ=;r٥1ƀ$Zr:rfN? 7I}g»gC^̋s'܂ ^8c-yUB`wMȮ3IjTp&M./Q~OGT:m09d[0ݦeawhH>w^Z.B^UÐg"ɹk䜌D0Tx]4Rm]lbnV)w"~ikӹf%?]-BeSxTl?n%:獳4Rļ8e!=͊휰Y匳6amw/I| kn\- 5904ZH_dOdުRqseBW=J࠭v)SL2%AJR/Ը{OU&ЙOԹg'V ---#$jcKȫ⬽YqΨ-[N'/S.)/-`⇺[_4 mK]EϤM9f10phM/݀螋bv=)3B HBMUG1ٝHoh_/?w}߿?`뮾ާizSpp0*)JyYRpпZU}x=JA@9wgH &Eff:؈"baX^&-$^)lIFHM"c G%URh]lzPh|,!a*7B1sv||8޿ ~4_OM2ߟPCoɪv;h?_X*o6ojˇVA%\vJ:OﯨS.?2 --.'dſ[c"ml6[PTpɰ=DO+_ ۍ^窅 --T1/ϕgdQLDR@ +;F=:??.e2n Opd)\a Z$v5xtV23y{!l@S[eAliS#w(]e&T~԰TѥhڝOT/E6U&\ c"S-rnk5SCDs/Uɪ,ťZ¯{hbo-uCz8z~x-\CIسN@)}/L˕m=-{)2yuNk`݆zov4)[Uaę"@R݉Vca~lUFޛCяK?aݬz2h*Yڀ1iZ!Qpga+^źaT`I8y󇌩|^ur~),W;$c|]KGq}~^TOqkq~!F u"d:JGd 0n8+:IY'~^oF7)'v}S>e --@x.ӏMq6ux+ 7Y/tx1N0ݧ8Q:qNdRGbbf@ z61^&G --"ۚB#x.9zaZQu~oѾp{Rń2UNаW㵉g%|6aaXm燜ՃM`o \yDJ5Rǁؒ^lou3J1;$ָ~ <*)Ȍ BdTU<'v8IEA)exhm p$(jI΁3jj\I1ؙ y%xO"- --ڇrM=Cm|rG8s`N(TOu[~wƓk_1y{9Gr= ^ڲdk󕖳HfQ.{ #37g&Vm1*sj׮<;fja[EYκ^ tYf'!e06AƩvGIYi`[@wp' 鰉),48/v --5`VN --_wEgTmvr:Zw*,7?x@iy6*qq#toIl-@u|K6F*ܛ!%W]\B"1Nju?,=7QCCPO+ܪ?8 pGHGfiN*wM׌KMv{ x;n@=`(r.EZQ(]@T6EN#BD;IMEmX3!TVTI t&-ڐcFi.u(Tڀܦ^޶߯1^>t]+إɷ ֏FYUK+gP&`&Sk"ybF{JxuSGӣV+g#v] @$IeܦgkfzK ݌Ic --Y?Wza]>< f?im H --7 ?](㵎CeF_vJwPcmg9ɡ=ZH0pK hZJrDfFYBN% wEBr acHue8S# --A؉ׁYU"DJZVϦGYiui.zmN#d2tp&)8IܘyiA+Me? ߙ;Awc-7KF*q ngJֳ^.N&ҳޤ~\J5PM6|x `9$EW0gRdg@ q{tZ}>l87 -êRbT}?=*킁EǪM|yQ(h꺵)=?y`J4+BQU|-j,W'>Isȕx=N0ݧZ9AqNg?7uFlbbviڈc7|ud80u:[O"虃x#*sj(BLѧFef(qkQYCEj7{>~/|׃y --eMwSR9v8oFgj F^F)Vw$BJa#}*C \-?VqxJxuKFΘ:7MTPAt7Eޏz(ɚo?Z}K!eeTVL`#Qb^JC!%#ZRq"E9 --!'ˬq(`P $'I, IBb$c$H$L>/1<DECU-jR ?? #ϦU?+ijyzWF޿QV-3.g).OǷc8z7q --P`궋ezޜz@'(ӌSi6+> z9k~sm CUխ]Y00hiH;CPI}\JKp jgO]ެ  o.Ō\DBV6]MOjsT-\&Y{lU9k{u&JWGxeqT+)+z^.E}pkN}r,wL$dėb,X&Ë! ݏz[S=C{YūVJjnt{c\tCv"\9+P:eCi}A --$DU뤘Ln°uêr7UO1Lw0y|]x;i2@ɘx$U> @yyZq$j0vx;N1ާpǟ('-bG^!jDQRppDƔ$y}DZFcv`s4s#42* 6kHq8 ykuvy|^^Nr{Ee?\ZZa'E3zZK(c4MB\7xJxu[FgjpR6 --F rA_I)z믻kUzJFh&d2xi"a --a+*)d s$#5B $DjbsjP$+a)R$IhCNJ@J>oq[ E --xyӺڃU9=hڞvY|TtŽ,Ƿ kx_ pVF{/LucQ荱s('=qygcma'1= 50[sYbs|ݬŔ{g:3n\ςlVRXxJ" O|+%5*Z^/$W˭s~N<-3!K,wskqCgrctl2EFF}O;%0`<LMDQ;ǒ'hLA*ٷRt4$2gL^ͤm/wT",j%Hk\ryX1࢘M]?қt#qY,[n~x --pdM J}2IG2Yڌo+Nc~ -- --C`ɫ`]c<60 cNT+vwjpѶGV=[6+hS<"S٣ҹVCOPyv|^.s-M'Am@ u%=^,.!7ΐ>R/fuZ\vrR d(h;Vu#N},GiXhcu3YB2]HD΃O6g,a~40v$(Ym~̞>J:Qߔmk,7n__Uwx=N0ݧgǮ?MQ`113 VNC#W@𵉈ZG -ElI+QdB'* 0Y*<ڔP, v:IM1Ntܮow__|rF?uɅ(pX5wĖ1F|jyfzJ&ykJxuSɒF31V=ǰ#ZtkPwIOcOVYQUC1 --wC j`^Bkj"<F1aj1''oFF &[#I(<'J8XOx&r*`H7^Pa8uWx,qdq=*϶=NY `=7;7Iц0lw[w Kw<{g6t0^UV5yیIW T^AKSo1Ѕj.K#'8YVNt '(aӉ6z}i~*= kvȀlڌUOi^M]})M2a,<2q,7s:Q=vY1kPnυΒL!܆}G#D$/Tp AnOaH- w7F1SDs!*7FXFEC#kl-bPk`t+1]^6M7% M.֧ǂ|w94Pv:]O67nBjn}*XuϏ>L~G<}8-J3Z隐~v˓x;N1ާpoB;p=nox]ҁS )rd1 --D< YfTڀUE!Y a,l#!.J_6JL)%'1HFpj09?_c~_^ꡛQiXrvZxB_]ѿ#6m26b_UʋE|[~ --wPJxuɒFE|Eyh @B U$1?^پ<7#sqc 0)d I8Me f8/BdQmzi0d@XH4" L%LD?2T%!edY$H)!V@opaJtiq;>P6!ќAY|<~GM'`C~zӪ?g])oǷ6i;3=ۦX6QsDzQb\7[[ȏ!ݠUſ((J%'ζ9ӆWDw9?2'þ|m/bkq>7؂KN`%Ҙ2|tޛt7keKEyc8F8Vuz:э`㽩q2\y3e/!MV[3؊p5abipヘdvt$:Zhihuڒ[,1'wtFz)V׽t=x?iA SsMe(ǯBw^ﭔQsu۵áYof"vcs…Ngyn%0p%֮5{\TL=9=i$m9}i,z'HܹQW*y_ݹ}yL1z,wDtg%-=\Hc=@ɛwftGP1",0etM飿ꄟp).ow@E^qCȿZ s٘x=N0ݧ?+TqN`dh\G3b ̀X8 8b}Nt:5QR`" +'M9}0V)m579ց<3a2Ys$O?o~<?!~ǡ]ޕFjg[*[eUfEEd B f Ň`HTB"!xH$d(!9!d ;T )r8J ("p3y*gXL)HI@~B>MäI7hZTBG\|D~@m{<$Mp ;bbPŰn:Vg](k7$}Y?Dwտx ``oI%9k12]X\:|c.7xdw66he83Ci8 YًPYhȚ*pWeÿh\ypϣܖUm<׻EICm][5}ӿK ũ@ QID/q1~GšѡqlriqPjix>j/p³m_K$+WV&i$jmⴱ@ȳ,@Xy,~> 8U|S֧𼗏iX]1 yZ^R*oŲϴLWIΔ8`:='i<.{Ssa`ټ<যWVzGm O^vh&tՀTLn߳Io俉6 [ -- a~q>j1 VsbGkFTlqK 96Eօ@/p *@ώN}0Fk.Q!P3SgmiCu4aˤ3rܵq"Xw]TdN'wZ3F}'~&M`$:iw9GESf|D75++&Mtx*x=N0ݧ' QČ`113 VNC#AXk#O\FAPI.G2H*t]0;J)PN:EP9|v SOO?o~<?few짫 4Je-ju/κZGl:`h`]B9o=]A{LJxuSIϣV+^1Xh{˯f[]RU 8mH --CW|e ˳(?2l9p - ͓C Pn(TeW?KqI ~@Wt`o㲓>CMRœҫ>M~L{hũv յ'uH&>] yаCgc^ȧ9'NҐx$@`EsY@Utr4 [L]BuEE.+銽#+ha8iIòݯBnp~J:onUjwÎ(c0ip3R,ΐyd>e{?AȪqaCAx9|RMM{X [AB%Ͻʖ@+-K%وrO&ԶXwYJW) `u 5okjh9cUtqGz<>"mqnsBy' `O;dR]7hr< guGxMw.͖%ӼIYol{V+݌[?!aֽީgnΜ]kÒoYB @>4)aVȯjUs88uuЭ\R'X0I%#^k4IXS1=m7zg+f*w{PW;.Wb?Uw!,ı)q7 4$hDW0BQEf0XQ? zQx1N0ޯpNBlvחgGjDQR.D;YDEj31z)$a>2Ya5,jN)Q8%A㛄ΐuhЊPTԡxܮow_]1orcUh8&xlZVwe*cNEq7%M8ۯ~{KxuIFY1{=ǀ@ h@7j}׿;|P}1e$aMU($Nʋ O80AS=@ HO1ϲb,)J,Tb@ ~Jd6M8I„% K8*q4UKۻe}~=<~kh۹_.VF4/tV;\ D!+;Ė1!m&:cWu0oR6.}_JxuSɎH 1gTþG dUDRE&dߒ[`϶,#@$ Hgy24ieFSd<%6+RA#83Tp/ ZA/8Цg<݈OSٗS]_M6=rd|ijЩz %Bi|J3PX"|2m!]RTqc&umK0Eᕆ&H sIAެ͆N;]N#8gjܰ{!_|lt{?vn4gQ:\ЫOr/ODlfݠOj놪Ep][e 1M:]4R2 FmC.EonN]o-}ezی -Et5뎊[%>q --f*ָ|jVkXX&U.䱸T Cꊖ}'UtqN(n0Ʈ ضeqk7/yז ºl+~sMx;N0ݧ~;#! d]G֪Sgih1 --:1k\z1HhE]h6M6ٵ$ b״3DCθJsʤOqy{<.]_ޥ9%WJoVAPkG*鉷eRיiUDVryJxuSˮF5M4 c_Ƹ1/c>RvY|N&U)9URa d>ò 82J)2$"ǩB. --O]|IP0URQ(湊rS,fx$, --y-4O9c --*`.BQe*cӁ kܽK --ʧ5D^Q>A=ipi:|wkٟJr\N"m۳iQjD_{-MF|QwAN<q]tHg_3L1] 툱[>2qurO~G[A].S4Kux9 --I'-˒[ ;A[|DRE rqrhcy c' 3 *%@ں%.يSe -- 7ܸ  9nu__D{6']dfu?1o(9KnB/Vx¡tyTPqh_}-„ =J;ffU !Ƴ$kfzM3\˾*,X7KSok[@ +Ql%Z%'sK몍V۬'a{.k KCRK7(#=?W=iFڮLꊢ&a6-2Tut&}V(8F]j<8vlӵDIj/sb^D߫7gNjR`0ͽe~̀LgVu{ARms}h|9!$ysp׻T/: --Iڱʁd5/7F --a础\M n"wX{ 1d|c1HsoPA/|?~?Qv\~iz鏀 O8,> )5SItS|ߜx=J1>H/+/#xO|3fd̰XحS ba={z-qЁC^zEA}U6ٙ)nL@bADRҊ4]Ǜzz[゙Ǘ|^7ɐ.J9?N˶7Ħvގ撱v)κfo>ęJxuSIϣV+^ٗh&0`~x唤n]%u! (h fbB0"=G@"BlABQĄ(fa(0g8dxy2ȀQ(ÀYH18iӃE5JWЌ@|(æKs4[ezgӷQ[?_6|3t;_<0 &KOZYKz\)\~0u>t<ːCb֜ $IoIN\{vLre;9hpvf)c7u]=;)A1 --ѹℼkZL.Ȥ ԎSHq/2oKsbL!CV --ʴD(u]Ymcֵ Q[(![R<ɥW呚jÌY.YjraW:]aAnĿ"_CY?) x}YjגsOYΘ2*ƄynRдzdb1USp AM z4+9uS=]4Y͢FׂYN^:hA_n{6E{u?90 3[ĉ{b --P l2 --]zcCM.$V\5zFyA,;Z:u]':|17̨gF n -- l"i}S~,5sМE_EkuRsMxxx1N0ާp{l,ށx<$EUpFtЁ)Rp6cl(_|zub"yZgTv --$9'b&U+[ኵOMHh֖PeǗ>AeX6B Y0qOhqiQa4+~vaS <4dv< 72Q 3|ɐ%[8kgp5K;W/ÑJ(.ǬPav 0/?4>tޅ]ayB3Dqk&T/ucBBH{e jN7y"@%/&3t)n:_ىlBe"2\#hxp-Z&.V@8`fnWoϴOEYI۳Jtr,2؟iȣ3];u\65:+:Օ䧠!m?wZ2 hҬ׀nPvxj:\74LO:QQDMԤiϗ6p2f --QˆWT&FZ)Wk2SN0l 3Gg{g-jI\/Ym7>T Ǖ0}y!doKѓJ6̙vWw=={O0!I:j[&XNe)8k/?QUuvvO6Lahz5-] !Hn*WM}'DTev_>jՙ0w.ӅGMZ35py.!}iBk^uQi\یKsj}`Zzͬѷkor)U]CΡ٢i3~'1m)=f3/PɠIU?5˲|π -- ./eג P~r@x1N0ޯp묝ExY')AAQQS --Z --^E<h:f0@&0 h%pg)UKbKKQad%ARiևv}|^^tϥS4ztZKLkX;Rqx6SΛx}V4vKxuɲH56㚼v}ٵPKW| u;]:}>f~^o[yk)s_DL} %83m|yT!N]ʕF .䛠|JWK#p,5I2Bn)|dӽ)Ϛn|.Lɬ8Q@LM]"j!/s>q\c>ci ]gjŃagofC!C|}*++RTa][8P.24#TU< @]|Gx=N0F{=ljZ='3%bGъA@8yWHZ\Rk b6mUcQ-=#NT6I\ݔ%0e:OyG ^4r{,ϯ?b0ǐb&o]eѨY< u9ӿE"u;93I^&S9 "+2t&1oo;քjKxuSɒF31=bц M7  ;|ȬCUT! \dċ$|XI2BOTIеϾWdQy,VhnE;lɀY|*Q|VoKg2 ô --5몶صu5a+-Mwz 'tumB.? 0 \<م+FJva99nxR7$X  tD  ޶b>LfNܯB^NyAQvq_2`.[ɶ>c)㱜DF_wk?O= εMx*F(f@cZSkbKvbEͼldѲ>ٖX~ٺN*$rRp}=gMX2j yt#O:Km a iT: q:g{x+лߦ~u%sY_nT3%VޥjdΎ:7ju'žDnkSJOTQmOfG=x\%\ ˬG'Ѽ znV̀hstݴ ' --m [hu8HpĀ-|, --eXǤXaCR9](;ae 9۽P5\ g:,>0UG)>HГa{%J~1W6 6wfl_a~S?~<(xqr>yx T[EUNڢnUE j 7~x1N0ݧZW8d%Έ 63b`e44p_GfieЄ bl y 4 ZH15k@#&k|0Jevy|^^Nrwy?ʡ=V#8y6Jw!qUKQer --c7IW%~KxuIH񆥨:'PAAQo,¯#43Y2#ס#XD"b!%ҘVb,%jŽTp8Beń8apQ!iAQl&q"DH!dRb""@)y --!;P7"tq.2sm/b1Yfje1 Z15}4gK"Di ԧ|ʜRp`VǡT9Qy ex-ǔ4f-Nt :_kGE9 "w!t/mFq/8M>mO<fuU5&P$t8Β?{5;ƚT@_ڧz>|Kf-~-`}F --*#y aCEWƲn}vx8&?THQ>`jәm۞bre֯\s]Z$3/|ut[;w .q4|VhTNu{SrLS۞'U*>: 2/5͹dһnX+urS]Q't:?(:k@o"AShwu u&_HͿ()ʞ/@yEVNwjnxȻ 0QP bM(qF>,cΰ9/Ԃ:ņzhP Wn|S{FraA3tuR&cz"KxuSɲXk橢@A;2^fį/_u.O!N&A2Q@ B, $QK1q*$+bLde UN1ƺ J --^䐢@<&*8B,$:x`cКTd(HH{]$UtghYTxI5`l=iW%u1L%uҥ iَ3S~a.27͗C=&T=Lۯ6g ٫wDRݰ800`~±KVp{Vl#2Kp3R3b,+1Oͥ`r,][w`NY >!k1RޠRיw/KJ25Ero --:RDWr&ɱ^T@;s}an@'ب{' P-o&YYPx"']כ;(O4rΩ&xw(^i1gjc"87UU --o 0]Bל^9Ýך3;Gkc춊6C/'=Ga|/XV[Ya=cnruT++MM\>Hӗep^,6x͒`CQ6Ω5Ntoѹ]:ASCmx˕Gue?_gK|6De'O2Y ͽ+ )e/Eusgjc]R%toD/(RjH;X3]t-Ѳd/vaK4,@[_M̀ts7vC&Z?y PdFǛ?a~g1@Je--4}tɘ8$ŴJ0aToRj~x1N0{=:7vrB{N"t)8:]QQS --Z --^E<f,lv(I'QlĹʤMG&Bる-m :ru(<<<|-wzxg;aXreNlΥ --[ZqVwH\~-i8,׽$g*{_>{LxuSɲF7q [w, --[cGbnU95q,+I --b+H2 --L)"TRLڌBAšWD"dTBXa% --o?DHY b*"M1X]HҌCPAXh;FR~vV|+Ͼ%AާXbżѺG:ߞ7@ge>~fZ+cyj|< `|߼4U\mp[Vzӯ%&GBϡ4y׭FVi0@UxF;5◤K --/I$(-{N5֦kT{ $tOl= Il'3W匝`3N0MK-nFP|+Hx[I߿k:Tn~T3 tDN1ʶz\VMb/V!9~xUXmiEV̗07t;tc1 G --?W;w|@h^E߾ykud.r;+^Xl(f7"Wm _a9>NS)X\8YC)I'zZ+TfsWʹu u͈K㚪dɒ'|oɪGmIrSݿκˠ{S.ۄq!.uɳlg>M[c['yْ5LN//j_'vC3}\sܪHjXV%$PW);"-h0`] --lՓ>D;qX;m3EtOX!J ݷ a_=wfL0 mo)hڱ̞eۀޫt9ǽ́>J:?L&nʼymbx;N0E{=lF#cDhQh45DEM(h)X  D{sέ"akDp$u6! --@|l̕& m *z-NDڕ~>ۻe~~==~v즫)%Wy,KހQhτ-뮯-bҮOR{:F_r1xS˞O#]mƴ*Dp\-~LxuIV5zaZQf3xp2>e:%Jg!dɒ<aNq/d˲  -- pI"[J.\6: !SJPRCb29 eXhay ,E|IV`iI9MP<I,ɷ7u30}pLX/M >~I 29:_x,KeEAUkUo܊)`Nm1LVj+sdY5ATY}@7ՇZ|k"pRe_+Zl83r츘 `IYHddU. --w}" A.ZȻ/sz-aÊhc|lb{tH|  Kuy5~VO\h8Z+ 8o|g;Mu7۷Fu1j\BSs3^I&-ctQ%uWZ%D[1L4ghLHh)Icw=)Dy2)z@?E=msϕ#-I"UG".4j!M --S3yªu{‰bDeUZF?;ُy=Rc\wSi<@%;\8"Y#$eJ0U#38iFH%~xB؟n_iw6eHZGp26+d7Oy) XiJ;>=շCNw^$֑RK?%ߙќ%flcVY A3T`(lJ4m7FU֟+|+x;N0{h֬t~N,v(qA@8b:kDNh4gGtB)kk$)H z(W od1z" jm=ڵ p]6_/۱.JS_v F(-9p9[.Jn z7 ;0c[ڔNm*1a3ǒKxuSKϫT+cɻ{ --Oh)evR^=3MtD߰WH]Y{c@stP71͋\ l3A#B$, --(Q9D< g\ |c7G g|\E!bBYxY$0>+<@1ZԠ(q /A xxv_ @OO4 2i?ˋjG#'؂rlc'K'6ɒ$+ˇUrSx/۠.U^r:FVr@ޅ\8В: ;JC\v,|ͷw0ӇQQ4aHe7l+n?Xb(ᯤk&ΐ&Iطﴩ9T7ݘmTT.݁Hts `qPp-oUQ]^B~I%Ϣ7f&Tmۑ;W.MyxNCyG[X;C&gFxu"#@)m(Z+P_6kS)MLMou~te%=Y/^ĮT &Z^V-L&q WU݂#hdF`N<[}wր&RC-i^aZpF-^USYSzasC+Uֶ#I)Qbu?w1QynoBA"jמNZm|N%{ؠAjQQ6yξV44&%"@d]1`+W~<<-iξo{炱BЩآX1~2ww%1ķnR xIҌ6ՓEwܧˣ'B*Dz!|bQ~O>= ҕ'U](JQA|-zg?7}Yf/9-\]vb!q i| 0hlRM=2喞z챪- ef2r~"g7\,3C/b*(C x340031Qtv veQ7SYFڵ_n a%~n!zy >5gnuQ7= S3eVFގV=&U/7j5Wn{6B#d]v霥YV<3/%˄I!Z9*ISX ʮx340031Q(N//-H/JLI/LKI-./`h-a.;o --ǎYlzXgõyv48(!=+)x340031Q(K//L+KgXtfMS',u;7lx340031QHύOIM-̋/-H/JLIeg?#VGt ֛s/dx340031QHHMNʯ3RS3S3K2R --,Âtɶ9qxp7= fV`鿨{%F --ӷ咟,eo[n 3Lvz_ޕϷPy)9ũyE99%`,/sPTy<{O;9rVTۘv ̤x340031Qʈw+g)|]sߵ~]9ˊjV{Z~x340031Quts cx6M9{wk+qIODCԴ̜T -3'|5J,vP5A.z) ]S>xo* --s --cye͑.X / a*IKIM-+-H/JLI+.HMfJ@Ce_xhcb --@P w~e)~ͮa: DqJbI"uҞǴWUk̬5P ry/=<ⶹs --DA>ÝsC ZY^Q fp.N-)-+d(؟t³umZT"Ux340031Q,+dx6M9{wk+qIODCt")^gJˬ{)PE)yi iAs.Wh!꾃_M @!37!Q@Dw7I^H?"[pgPVkFE\ *!w̾!E3Zk?kp(*Qm[\N --TanjPZ^ --rZ>HVGlg\z.a0y%i ŇN]{Ҟ: --$3ܕ%;e;?P^US_RüS9Ϙ'Hcxr8 --eErxf1[NːL""100644 qss.py{E8j --y$f'fr7}|SG3Ӫ x31 --'sJiW^sN0Lc!Uqyؤ?@sӋKKR<3MQmu{4O/QPZT v|A|*!Nx餩[Oxi¦u-Z{nmՍ;k^21Ԃ̼҂ĔT>uWLfYib P mgxV ']dQ\\YPR̰Xħ^LҎIdGaoH-*LNesvﻬJ̷ԒJ6q2\A,߃@L)I-«_Q)lMPQNd܊Hx340031QHHMNʯ3RS3S3K2R --,Âtɶ9qxp7= fV`鿨{%F --ӷ咟,eo[n 3Lvz_ޕϷPy%i`Us;߬ѵiʞ%ny&̼Ĝsj~K͍u(m>jQ]^ S_VZ]_0dۯ tt͚sm4l3Rڜ:N+M WjN6mf>Ox8qBn]OyK=m Yx340031Q(J-Kgjfꕆw/`F/%8$mqTɉlߪB,xy3& x340031Q-J-K+(J-N-aȟ^U*'<]P8,39Qa& vOm`_5Et%E ow,nz{cuj޲X-6[xxkalaP cnφ[Kv_>b Hx340031Quts cQR,D^>3( rutuMa;kmʯ[CC2}tB2BR3tR 3 RW]p쉼qb}{8kL @8(bJWm,?d *R2S޳(-*T2(=sȝ3V͗9(r0Ĕb-uID-~//-P_#x}qکx340031Q,+dx6M9{wk+qIODCt${W;bÞ-PE)yi ׸kg PMg8n㐐`BXw҇fBg*MòT|zO075U(J-K)d9^ HGW {PR_V Ra݌|w<~SX R9*9$3m>'JN_P5y) |GU]h͏Osc. --h`x3MWw,Ln[,>ga1V< d⋑F˖#\xN8.g&d ݓ;CL~ iiH1`f|X̑2lt86TI --SAvC&/p x[ôi$Ie"Uf2_pfי u xK8woLjLzx 5|]j, IW3{t q&x3f="1)_+;s1ܘd>pa7H}xKZhu-jܿUTEb'n|Ćbn!77Wgl #7݃k&XZxK_@N\8vp<)1"4hlMmWgQaAAFp$ux[ôiȱFO[]mǦ x7DPeFrqax340031Q,+dx6M9{wk+qIODCt׬>~ϟSתoqZ@䥁T<(ͺ}蕃;B\YdM @!37qCB bI~ _X\ ҿDō3͔FvM]t T( ?3/-lA,V 0 u5jHY^~IfZ%H.C-{ܩk('LaA.Hߏ/o;ZDvd]x{iC(VUՓ5WEʰ>0޴i -- @xiy?“䟋g> 1x{iC(̾&.պ]]6N6"w8#x[ôigۘ11rK5L d~S(g3عF,HsC%=x{qBDaMz <GCx3w<N̆Տڗ wls}4WxpN+( --_yx340031Quts cQR,D^>3( rutuMa;kmʯ[CC2}tB2BR3tR 3 RW]p쉼qb}{8kL @8(bJWm,?d *R2S޳(-*T2wٲݭpVCx&K!mY*jawy6 ȗ\`͡~Of',H.q o x{xqBDaM/2,wx7Z߆Kt#W܆yn Иf[RhRD_ 7D%[Rlmx{ϸqB&":x[ôig{-ikI|f:JL @( ?3/-7h?.jF!x7Z9R"ɐ5snH>-pfH-)~XХ+g&\AExLD{ǎ)YqTR%Mt<7]FSzxrkz ^x\'100644 MANIFEST.inYy[mVt:|21pp'DM"j"mLax'ѰǸ.2sR;^M0Z(;xO8RMT:t];LC9/װ!NpI>w 5ŠlN5CW(7Ix[ôih2{j-Z-z-EQ&@PZRZ0u]ͬgCݳ&6ox^fhkx[X5!zb<<px[ʴi N^-]n --]ǥ=%"q x340031Quts c{7#ĪÂeA.z) r[~wqM}^uhHTQh^f~^HjrnQjA~f^Z^qAj2iJYJ>'&SR텉(d37qHH`^vBY;O3!E% eǶ>ho\SeչPEeɩ YEN_w^|PGT2|6-!旍ŰeEAL)I-sfB Eސ>%*_Z57<<|()100644 window.py|Q>ɰ6ZP,KhxP'^img3\@``;x#bMT)NUruEhTP&1x^S --*#4?9:@"x340031QHKL+d޷֪L+LN4ZžE(%/ eۏ>)b=9.)V --sSSԂ̼|2&:aZ/>Wh ̴J•RiǢm,0KK2sAjnRjsk@Քg䗃=&Q39 le/z]x/x[̴i©kSvmsK+}j-a=5DJRK<|<8Β=Mc6ҒԂ̼| ~SxG|nI Z)hx[4xb< x340031QHKL+d޷֪L+LN4ZžE(%/ b6y28]fT( ?3/-IoκsFio5,/$3p)/{Z:nKE4ҒxL_$j&zawrÁmwe03uggw%۳u^x340031Q/L+KgXtfMS',u;7ix340075U(J-K+dPb;z"շ4OdU;{`rn3ӃS'UvjLx[tqBDsÆڕ3ښM]29 P(.Jf٘yD6Ғ+mQ Rx340075U(J-K+dx̛SvWB64g540031+/L)|wfNlQ!@ xxq/;9'sJxP sx340075U(J-K+d'e'{cBN4M-lm340031+/L)|wfNlQ!Dx340031QrutuMa;kmʯ[CC2}tL @!4/3?/$59C( ?3/-_PπaPyHn0*TgC: R|?NSbR=?q7m/_i4x31t -+Mg5s=^qiAlqrQfAI1dٱڛ5ה>ziYuTEjQYfr*vV{>%1>ETEQ2×du%]gziYuTEjQYfr*'ߴE&Na UQ`rHM&?N-;D9 x340075U(J-K+d81=zro/}c,/$3ƉUVE8NX,%* mx340031QrutuMa;kmʯ[CC2}tL @!4/3?/$59C( ?3/-_Pπ- פȬhѬ}ޛk !b+.HMfxi?f\8=8 Xxk`L('ȒbA9Eŷk[ x340075U(J-K+dX$Ⱦh=k'dU wN^;Wq9R"%x340031QrutuMa;kmʯ[CC2}tL @!4/3?/$59C( ?3/-_PπAKfXYB EY=" !b+.HMfIuەKK]s%M3x31̂bo';gx=?$X",39a-ceCvYX>MIPE kK|əz jvE*k&x340031Q(J-KKI-./`>z_U7m|^ D Zx340031Q-J-K+(J-N-aȟ^U*'<]P8,39!^h/?n' --0ڒ"D ƚ[6dk8:e5Sx340075U(J-K+dZ$x340031QrutuMa;kmʯ[CC2}tL @!4/3?/$59C( ?3/-_Pπa&*ۑ,Jw"C: R]ǜc%{3Y5#5x31̂bo';gx=?$X",39oⷧS_^mbUZ{5Cd~5TEQ23s¦XZM.gN &6x340031Q-J-K+(J-N-ahܒ;V86Z!D5\iqjQYfr*CF_Iю_~NWa$!&>x340075U(J-K+dX6o:/08?w,/$3礅.Nsڹ+ =8"x340031QrutuMa;kmʯ[CC2}tL @!4/3?/$59C( ?3/-_Pπ᫿r;amE}~Wg!TLz W~y-탴<]<6x31̂bo';gx=?$X",39hNSL?3'h7TEQ23s¦XZM.gN%Ϭx340031Q(J-K+N-*LNe+)qˏɹ3?* d+x340031QrutuMa;kmʯ[CC2}t !R 3u Jҫ겯:&@[Zkg*Ij0/ NqCMԡW\ӓxO耄`yW>W\h7@nx340031QrutuKMa`8CcYA? QE;.ͩGLҟ wx][sƒ~_⋥*Xs=q*UL#KZI$" E4o=ڗMֱ$`7$\J]WW˄v}?3Gmu&?#ɏ?1e7K.^u򬣷d^-/]իUWdd}Mmͦ:'],i$$/ڮ)}gzvAm¶&WI7bi&y7҄Oz,Ǥ|UwIVqfEi --leLn\鎴n)C\UYՍi2p[&VTy wup[-^K6u%G6ٲ+௹m憰e]Ou0`y>۵[b qV!H{ꚬR鉋U.gMF?`GB>8cm^6nr )6[Z@BħI3yT8 `ɶےvnk+z@Zڬ2@@bf}Ưu,W߰ --cK)VɎ7 xxR k6 h08OAfЙhZiT P߭iٓHDB' --u7B&)VX2<[x}ĒMG1fGE?F♈:n`[ --tXJ*3 g7}_7& Wƫ]vB,Z --}"#%pYS^YM7 XS,k\<ĥm: B_%F*EYt E[bb --$ϋH, ,gd̼l-i h:pIfmgt-dB*wBOMNJ&d{PC,^򕳪,l"*QsfUm6k:wxgW$ --"=X8HÄJ *C&Rtd&HM&p~[ɂ+<di-z(*lwU~Ohy^ݨHwgĮxΙLKZ!#??=y@ b#ӵCpiv˂ SQpE˧%?w6;y7WS&:V B _ 19rƇI,TSȞdPx7[v1PZB$V+Z._铸2;[&GOvLSZ ,luiWoz>P26^^3֋P|L)ȍÂ~mawsxCi = *deYhrl= V &G;1u '^^&;VӨЦ,kpH{Y~@n %;XzިWIzB_(Df:pea)X5x ZHe#uT؝^>_q+iV VC|H"s[Ad8O ""WXN,cCmh &%y INUő --?or[–1A),˲`{- =LլɓCZx=BFi;L]æ ɔ#<=@.[H*X~V;$fe_f>ڶJJ3{1ƲMM͒Uŋ["=7DP&PvTQ>T[)1uiϲs۹CBECrA[(Bc_KWuYT --&mq9i [K`u & ?9$0, --@$PD"(ـj;J́Gac_2gK%D|VPC)i< -KJX6g`,= --Tl_qn!h/n#!Ѕ0^֍r'f NLT4XPo!( %bjf])UIrˎ|E]^k --uV[EkH;]]  Tvۨ7U C#& --2%J_Ce --h!HlO("j6pڋ/;NgĚZAU\28SYBi$C4.+LN0D<5BΆeA¯p2xJr%s 'ֶ 9\aҹȉ#U聾F.$D:PC3do4+{̚D lm)bKC\P5p\ X`GC,ƥVl9ȵ)@Z;2h-.{0W(T aXϒUN&^7_(Nz ֲ;uӻ%>R#qx z[ahC 4 - --%̇a(v}aW&biPw40tXW wRsc --Χp"5TFI!"Hg --D)LG4򶅃4ߵQ:|ܸfd*N/<,,D_!N82H=U>22ˆ%!b!>b9֩d:}OsB%G^02A$TQBoCIP,FFMJ'R~Q0 r{H۰ eX˼x8B){mV.$Rx.J}#3,($WYцr@ŠzLZ+0MXꋵGzL 6k$t="3?9cr+ڪkLddJ`I(dN :NVK#Ɣf2 W.mEǗ)@!R;d1=NrF_eHrW-@Fzm]i$ݞ✆3!b*$Vu~ܙ $SGU ,8H괢#Cz --'Z0EJ(ˬeLQԑ@`A*,bWK؏/:3#$?/]t1;)%3qzIq;ǹn WJ2l|2R6g --UV}#AQTNR`2WnGh^N<3$a%=$) I埰wrJL"C"X!?5Xxk+B(_q"uq~n{ mƫJ5 BR'K(l!$`g_O7 nFї1/4JԲ*#[Pdہ7*ؓ\s\pkm_˗9 :$^ @E%#anK(bŠ]kl\#1+!k"(?I8Qh,$I --z]Dv>̦¨ xaС%\;q2J'ӡWOMŽ4<3K̠&֫aҥن4n6uM';wɫ6h@9)oVe $ Ģ+.CQA8 ܢRCfz(opuV}Rm:y=\ȖGm --*jE%Vp{d2@Ԡt-ۊTy2""em.oކ$Pp3zԠA)Wd#Ϛy+LʎC7#}h D &PykZP(@+^mrE@5㠦ͬ0: p%\vAŢ -- 9iz"yAGڶo $ޗEg!*dvf4UaW,G e8 -$Rk)]V*sIi6a>@&"jDDeuB_=>l'i*gݴ A/[$mqVhha`p(kHyN뫶nR#4 o!lY9Od [sTɹmT%.lS<^HqDGz8c9T᮫ZHow &I!{F4Mby0΅{,;]Pts_Q~XKۑ] ",a lDG[t*)xj.lQ( --ej"PT\B --!ˬCbqR"}FSQ܈LJK)zƕ*PU-mㅴD^p58yy3_1eܘH2>]0lƅss$!zц(fL}'[\$Ӑy.:~hkl\zzk;j=tTH VV~^H]@Ιf4&$'lF4ir d6K3M\\N;yBUk(F"߮J=y[ml:ǁlʇ|qM`M*yI" <sܱdA VZeoY-JsAR_f8-qvJy.jv5_T zNάc88CNPL5wq9aݨiVkNW~qAʸ"8ԱG]j8e`Giyp[YA1,S?;-Hboҕ_ Έ1)W5"6yw6KBvSv['B O~/{ԨOdݝ;[<ȶ"qu9YA`ydl]~y5oD)`ǢmY?tܞQ#0㶽60K(9]^6uJ\a*?$ϳ.>8ldQFX --2lrfpLٲBxFYZ[5ѱc%QR>f 3x۸`q3g|>P|/`R.! hPp3$!uvY\2EdP6 +zQ3d]á6*xr6W3{-k#'H4kq5@J vPJq0 jts0@dL{J:,Z0]醶]7"NSHLqW]Vhր%\0[DXo@lLJ(w?CvZ3#%`1"/|n* e s@9說r?ƞ d@jtqf4g)t̠m+c4 CU&ÓGmk /!DHtp$mtgI VEʖbcLN5~G+AqCnpz?kqDkE_uDi7O~BHew*x-;^5ィ[n]ƨ?HGۨ]N]6$.̥\JIqZ-InfRr4MfBd.E0N?I,ÛX{pac)jy衸Z8rX~|LH j'x2p'}7R\pq~Ǝ --LS-`BV˸!-+ptűJP HE<1.J pҹ8Ǒ`n"v)*N&#xr=3;wU]Pru`6 sąj]M }sԒ} hu --MXLm}VjJ{+2l}|bLL 9R "ZJ{J>{tN u}8IJ^HnXK7rcL\dO.qGJ:L7s&pr(ַa6ahp% -- --&qc {HOa815K6!chGONCR)M9t;PbߦNS`xg --o 7%ӫ1qpPz5-6FJjQe'AJ[8āW>PE$ | .sFwfIȮG| TI{g:22kzؔ9jyRf \H ¸02҂pR\.,ƾTgL]~0$?Q-B:uѧ"$ zjtJE'7/Cq@K*Tveg~\V>uJ{G{U&^D<{\N'~A ? SgKˑFrBPsW`)6xut,N 7$bXF)g`MO[W۞Wm2jyJ $!`:PEp4*}u b'Jg@ӑuPd8BGEV$|luD~{~;D2A"n)c{D9&7Gf4$2Fdir1LVᛢ}zh$5#%:hZFH|ϝ]` --9}C.E3)YT(rXTGzL/Zd[4 vwCi|-zB=uuClUoB M=o:B% hG!l!e `8W^n!9SG:#`HSJ=w'y:G2<_ڱ"uzy bGgT䭗P4,G=\ rTi$C1IRsFsM XZD9N>!Vl::$tT --M:$p/*VF3km^TH;xM-)&餇Ra؉7iVwΤ~Ѿ/ɨ\8Jgڳ~Mu2GX)r JAX:.s?[1k4W_.h(;5x\Q;(D偟lr|f0W\ SHyqǙNwPl 1 2W^o6'!\%g?qv=OtFd?`bCC^,}YXm"n ~"'h*uk-kM_vNTL܈)H= .@|ÌCEN& 9q]'߮K=F8?M ߂-g-0HQ)v$Ɵѕ.X.8'V X3]ڰy,f Tt+ߥƒ<)7Hqph O=YgOLl4rY7x 2" --.-tBָZWk}hӥ'~zml/.bIAEǥJoɝ&?Kt[R٪]M? c\0}ꋅgHp_pH8BۍÄmW}ԋ@)Ex!GGIБϙFbQɑ'F&jDc2\k@5KaGWfu<?p)!b<'>+r|b (Ѝ tsXmv!FwBr],[O>s j!<@{"ndy=CXB ]=?~j0eX5L4%Qީ;A p>FB>j$Pk~oD\Bײ@G*\2) > --a2 JvBJ_8\D܇,'7ɗkHnn~LyCr;8xK~5۫,~u9}H|]'7X~?L:r7_ ^~|z7/Tvz0wd2''ɗÇOxss~.Mfs^hۻ=@k?3;%M --7՜NF=ܤnuC]~oWs>~pM[0姫靹tw{s?H!n~τNOSa8ă M|s_ %fgϳO6>^]%׳Kwz5}_2ftyswUn~rrU"1AAϠOW?>YA%ɐJ#: eNϙur8 --G_."$&Xy;b`9 P~|Hm>eaҼ"YpRR"l`ڝ@{p_ T])۩ώqL˲NP4|o$1E[b~F/2H$B!7(4 ڝ%zP~GIۏǺNSFs=Pyd*mA/ _%v i͐9ϱ%]koGfFNfpou_y3Og9ğDhT'1/9}$kRUg k򖿫 sV8 oodQIEevELF3áļ/eMcgm e $ۚ:/9vO6U ݌/Zn'ҥMaWȠd~8/~שD:k%gІ6|ܘBagsqUk\{buTZ\q&W  ~a%mWcˋ{Juo --.!n|DL׾yXYwza+" w6mu__vUQ7\ǫ )Jt6O{(|+$ۢr+mju[R'V2(ƕ FvmYM/shfէؓywיt{"/^\Tr[b L؛WnM>&n"zEӅ --ao+ǝÁ'IrbC't[ _&Y8j?>cs!DtO|ݤ̵(]-uGEƫWls5]oIp8 H2̑K&!ǺcŠ{S2|9Xhz՞mbRL*g$H[<,D|?29lKF\P cZ^d/uG"H A [Î*4 ] b3 GoQ#R##?|heKn(rq؞tY_[Tvb,#8}~R}sy(3 [[lcQ#1ǥU(Ouvt^[2Tk nTd-G82;xzeecHtבI\ --\eW''&UtS|}2&v?ݻ!ŋb !5C8XI/._8%pMvqDR؛ ^՛f-i<{%ٷ{ݝ)V'!_גKxTMOAv1J䣘M0 qАfٝvg&;r;^dg^&nyyg}57OXsB#hG0zZt{`W\YA[qQy@jzY=\rv1%.Dy.bI}uzkdkCXbZ.5 b#X]%pw`p 1&>k& iۍFb%+AiSr[&naǔѥ]$2iAQwA]TO&~ .2Ij-lMjoй6k:jƚ+QmDG*?W oF nN*͡|ʆJTLHT-!qWt˖ +]#I#DjʇnT6D̰#d^SSlj!yxn&CT 9l9V ,vȫtx>h:̠F\NdMZU3ۿRQ[ +ȆsI4iF:|!98"nR"5<0vZCsS_ #x["\lCBAeIF~qJfqFAqiIfǬZi -- --i --JeEyi%yz%%J --%y\X26` --x["L/17j"WPjNjbq!WpinnbQp# s'^ʝ(1ٝQZ$#?X!'?($dr7Meʓ *.5 yRZYW!% 'R( _!3/-?7$3? Sa+? xS[kA&^tJDQ yYH[b(Lvn,1 2џP|7+ 8o8og|wμ/:VD0|x^B=Nb${YIz\h}.)ҎRv(KqJ˅s/>pR.l񝻸T—?Xtkg,SECVkxGhe!^ z4.k5Lg G֨8!C(+R-^/[}ϓ2nH7DQBirNA𐙓D6QG~8һ<%DkTar<W?}ƿ --P4?M^J0PO޶]:@U跥Y4ds<EFPe\3*'3w C&W!7D*)gz]NͶK@nl|0sɬ%fc, )2͞d|\?͹[E!,۵|9[uΊ`)*xP=o@AǢPDHNAqls H4"Xgguq,(iV"PFt+E @lܹ }B_ d\&̊˙b&W(edU+@,X|e d;vIEHfqMeC3xɳojܔ̢ډr%)EU'_` \Ϩ8d)4IL0 [ZgA*L.`F?ٖYks'*ƂԢT..U<$u .̀3K2~*.I,´dX''JL`5Cr(_&'NdɷXԸvfx嗘jE8TS2Kj'x+3$1'GA7Daf&\&3Ob%K59#1/=5'?KksV+̢Ԣ<.!*Qx[ͷ &FE&;0Nb|I( l,TZWZP)Z?22M~* --&Y#Qxf_3AhtY*ŕyi)E٩9z nf~biI~qIbQ>WfkfbP\YPR_ZZ]_ZOxf3 075U(.J_V9YI d҈LSVMQ//`X뒌<.΢\4=9)x t(pϢryL̒d<:$T3Ssӹ|JS'0q*8(SZZїXW̥0فK"ǫNxTmOP_Ѱ%f_j3h 0Y --ކm1d|cYͲLov̲99)T43hS;酛#̨,EݡE*mGTl ^/ t&E̜!RT)i6yqe/qmW⛽K$WTi+1EL"n89F{pt32k~FE0G;'Xf2:k,Rdީ5*F ĻyEp)[aZ6NJg8i1$b\rԽeMKԹ]6f㗽~HZͻ0tF,3K}a j*$X<>->cv3ᠥў --{SW(SvXp H+XSZQ? Ki KtS C<2uorYtNsL3Y;d --kOJfȌ#v\E9NX`^ !1 NmcB*BlɌyX)ʼ5jV6gYk-i~R67[2a: --'~> G?x{cPJjjAf^|iAzQbJ^N~dwFFlyiJ'162$$$dgW%*&hmC8 E]`uD< ZN'[JJv --ֵrv (UXi5.4X)B)>] --P)rgjn|?y0kȑͯw-GuG20Tr4;{kq QK912u8 : 4kH6?2_X( mntxiJc6aVN  --B )-pzë?=?q"=SA~޽?{~2e:mNYǒ֣#BAHmf3[BŚ8{)IGMt\jeS$g;?<5rep-`Yy& H~m~ɫל_6Zci)&xٙU~&f/ûO=; Cq2 K ˋ[h}rfQLL[J$Ҙ1ZֵOryE4 --x% --hX|6y R. G-J`I  Ct5'.Y2Ι l!kͭ2`7Bwź"4VAp]%P!,D#EVZ4ׇ=jIBLk Sv5'Wk^s *QPk`}G1b^9h3ufRbaWdʃX ԳhHꪏSSj)Dǩ~%0 Vn?2>\6l`4A6j9;giI:SuD<" -J)c>OSàC j)KJgG8$zb\.7[^VNzͭAsL ܪUF5m2nLop ̇IP&:iT)Z¢VchGo fD0HIr5dBǤz6 --}ӚzXuc\S8znrN/׆ۻ{AWBb"ɩ#OVMt%^GQ$ :WiJ8|5JLG8a?R@+|tqbN(ϓp;T ^9JW --QNƈJ*-g) Ek/9ʼnsY$ԇ>ojli0I* lrkxKd03D䴊U`'5="r%Dɤa :ی,#C3z2p61*Pz ׶*cۨ`x0y0U8P('"1s'm 2~ !6'zlQND+3H‡^ixmJ@) --ʞTDbD,ԃx$]nB"=y||>giS[p.?WӗL;㉟D18H 7>(q(ڱSޭݽ'0rY35 |s/Kc#*;7WMC)+|MՔF1]=cBOYլ݂hMF ^(PJ --qC6 --TweoW۔I/?mе+ϏN >L BmZWXǒ_x[frd7QļF*9Ĵ@jEfdo*Q `Bx[frx0AS&4$3@frPsB & M֚<H_6!b1Eo4DXl1-xm1o0w.p --vbu YFNHʆ&zRHNO}'I0MgeYy|X|f6AK=ea )Q0AVҡϝ9:"r鼕yd,膝Vd+'[;g1p;,w --`מ̰iG1츊r~5 --X~Cxx_|9WaJ"‰:*Z5BĢ VJ/OL)άB,V6y 3PvmNFxqQA.\Cq~iQr*P,'VZĂ|Kss*:!|@iQ\ȆLNC2LI-NF8),(y3+o2+f)1wxJ@1BQЀmBK!\D&bklO$>ssHٝ}80gWXo?bv2UdB$[SDUIȗN/xGvíB,&DP&IX81ÜA64M+Rq:F Zu72\ZՈPtWig{OrhWݰ$YYbRB{V՞bѻZQD:vY.տih"Hhb'͟kOq}`—\d~y6cU9xk-1AlzfN. HIMS,);uVF9w3 --x\sGok ^8LLfj4w,lpƱan91umg4#eVUwuO$Nh++2++_U^DZuc{ לA:2t& ^u^đLZWqc/h[G뢲p$X HuRU~mG#8.9D;!L1-AK߹Z͍t{O%O/>}o͟$-މV0;ٓs"t‡'fb}8ڱ3#nea> jo]Jg EF؇ [Z1Xdltx"?#e[YO~$z$m^6龁lAL4C[/֒g6 툸i$XH^$ui:yE1&LcBdDBcikn`׶P>L3c&Dr#DGh<:mSӑS!8i 7"ir1 --}+qi{0mCGze#WRNiC)>A)d@W n҃R9p2#vd26I)ϐHv'yy|tnB,SoQFh[ --zvg>1R%exNL('_! zQwWVF|j㉅QwWoo޹ݹ^+PѦX\ Im%7)(29%s^_Ƥ8:;IE,,@X --d˂șf_& ("ճf]A=ȁ(1yG(ոJSt Q;rdȃ:jFLWf_]qҘbp$)le/>|X[#I ZOZ,ҹ|+_*b"M &>cК86սm/~e˷:!nrF4qZ7,@y)9&)(`wP^^sPLðUMpb%H1Dqq]Xm%[5CÖ[^dN2UiŁEL4_c&ܢ 5j(E} *ݸٹN 'ݛגQ'`p'J;: ]]!ZR --ۺ{X;k7o~VӭτQNA;i$e~u>d9͂8C+4& X-^eS(ec^γտ7;r"EP=2&69Wb^_68Z/+j(s#{jߋ֬)yV WIxc{/X N{l-^yU(w --2E>cR>8ya|appGh@ed38mA@,81NAK@™KcLONK7oHKk+ )b:%i ]"` Rk&iC |2bi$[@s --Kz D.2\lim~UfΣw^˂@gK8j(Ub >kt,'f@αq&7hނX(kx%zQ=լb@Э :^V;deA8q+`ZT]SYN~vnA ,l`6ZrZT]PSYtN?Sz0Φ+V%$,16&Y:&bCa$l 7xp/Ś.pyF8Oty ΍YvתIBEýFp7V5ZA$_,ܴ!z\:0Kls,Z8B% F_1QLӑA%"=*#I_h20>.>c[aQt3{q y%44rBPpbFo)j:a?yg.9D}D0?<$(,xt*V~~Ȅ˄,7'hFă#ke5T)Hƙ'eV244|'c'L*)8%ZY --kɋ|._QӰh 0rk\y4ٟ}_r;T sԜWdj1 --zkҏ.X* {z`i'jK/1l @#CC1fPJFSEEI;C4:RB@i'ln,`c%mTSi_4NqݎV3@3O@ ٤kwܖc'A] g]C*KLg mH3iHa U+f5%ȘM,ˋ̪`ޜ-\ANo&c`1ˑHMpg.cIfe;пy --D1)M9jIE(8/ձiy&7"jng#֦FvW o̤lc[G6e^vy39\+TҺy{'L*-T p.YC)F7wY͐X˽Jœ@ǯml:Upd\#qN?]|C-) --pFe01ab4ؒgRb\Gu'u6eD.2EGvX鈸D޿,MWAdLj --x1.hRy&3NJ wR2W~JD^BZ-a?]TvJw~SBf.RlKVM^3rrkB&$TQ?Ѓ*Coa~xpvwtȳ=衴N?+$ Z^pB ώ_XUO 1$u(WCw+ިchW<&)1 M% -B'oo )ٲ{霁)43[İup}8ӓ --אC؜eSJe"Vͮ,v9SP3ۙ/N --e}'rZŒL[bw?{{g'Ĺ| o:бqHR H{J --IչwN}O^!GbY{P`B-X}|ͱ`᭟ˁ_Z׺}չ}g_Y5^<p ]+~l<,Wֺ?߼z} -uUOow?fb|pV,#AiyFaʘ,reZ`rY%~p 'GxqJ \KSSRl  91/9'&fhd-/K/H,../JAȚsm>ɔ $YԖW\_47[85'MjEd1ɼړD&z؀\`L՜$7䙢r`WO' (d*eg(''$d)iأlg6<]Ŗo!39DT)5d8*̠YV((,IMOEQB].kP%izc >RyŌQL[4io]!F=?YO#4,an;&ƨ<9BidIatݹ&sXHr%%fC4y:j*R ,dZ**U(-HI,IU(K/WOhfFnuxB Y6 >72xq Y6 n^%ġ8 l4xo&?L'& nq&oǺg*^bJ , --Y=eQ5400дRe̼ԢS}6c}nMϤ#)xq" Y85'M8$<3/%39?O#Lkjn~Ͳ[\Y!MHzrW1x[o>&~ xOנ0GL̓eY7c1ټ) ?Mtx[xu>Ӭ*6LR --x[u&#WfnA~QBqeF)}F>Ĕ|Ғ͞M,̚\e71N89ٔK`s2'KD&_P$E IS9:AZ!˞^Jd`G٬Cie:^G|un'FOU(ecV(q ߖH 2675pr --(>VX0;X7X`Wu:4e/xcH2mifb.%s{EHh],TttHzŭ"gRB\-Cf`ym!ah:ƷЎ޷쭢 --fK6C74M.\\rTIѡ"qoէ{)4ŗBęf7]Wg?Ӯr*o#8"3,l٦8=qV,"lFv>#B7]0eRCV1,$́*ʚa#Rkϋ'/'|N<>6W=,8+r1 No:|W8uZ]Dtw?mI&bURQϤ3nxjy/({`qB@eA,.^[[:L wO< |Eiǖxt6(.JC7}߆S,6c?պvE679O΋XaWbP#nc&%&~~N|40]h]+  xX}lI5ۃۉ |ہ"=:NCC iBi.81CT--j% --ZRPg?Veڮr{373o޼lK&!(GTABTU8Nכ`ijn E q˒W%};IWG]{w<غNv9۷u^;r~k$~U+d7wAƲt~p/+\JG4u]Gy/#-I v%}Nؤ$Hmf7"Ęf3^%f+?e&((n^^9G|c̹a#$!YEe@y7ֲԲ1ӊ0hx"EPл0~/ f%~uL( Ȁ>l0S-oWcPZ*ێl?$(ӝYV}]!NRr(@Y$č>t-ko\kL,e)H<9?Ul|>nIȏ3WGΌϟ:]TÇsbdpx[PΫЗ|nX, TШ!<6m9jx vt=hE>Ukv‡%5EmY2MZT)t2rR䥋qeIEݔTo91[:-nRkk4 0_ٛ#G/h/M@AEU7O1@mdF;|ts] ;r WzDŽJ9P'#i}Z1 X!hFU2Q TVp8Qx،G/tEĴ#*Ayݻ|K_4-zЩ=0~J\>5z%9`P<:\~[n%hLJMν&wϿ6^}E{igkhWn,IpWai̩1NͼQ#6Izm_?="f]@uUv˰[K}gϕ --xau$;]36;E\H03(zW[9\k&K+'枹;?4=|TTSv --zSvίm΍M^^- jfx@Cb/j>\ n/U5.8W.(jq|!_1?ucTb7KiW7q@)-xlJn~NjnC!'Up*;;V%Lq~r-da~&XF{H9FNЎۑJϥhP koϋ.MR%^w2z dJTMTA}z:(i/ߐ h"3vD8Re9a:e>AؖNW?&yʅz( XVb(җEVLzu:j^prX<0v i8qxpPUzLĻ'_9mUӸ`z熧\#0lGc --]EgMVJpާMz?$Jazme@9Bi5Mb --̽u6F6r|6vuaEm7t8-_q &ހOfvH3yf^Trw qWz˶Ec:BT[K {@AE{*Sj7muO;bL2.wS;vi u}M`fCU"Qj --:0v'paaeX'&g9]>!O͊{5ZU儏65\ǍH:mW6o5֭LXj0'}`ĿF{v%x{;A]NpIOb@GHXZ(M-RҝGV!I9)L!L?.ɂryM7?dW,HUQPάJU()2YCaq̆f(Ona1Q0|L6d\#{ PRM\\E ͻ8*@/U$&[٫oγINzx{;qBK|݃]\C=}u&2&geƗT'eMgRI+U(-)J-K+*U-/*QHO-ON̉ --dO.aZ?YLp~[hv5Pɥbآ9}rY2ӐTGgF+%*Nv7-JIM,NJ@JJ @+J/KȜ|WOpˣc\ZT_䜘%tO +O6Y^R`r:|/ L^Y&dfiɧy$'I L4yo+ӱ,Vl69rq1Axmn0UOqP+VwQ ;چ,#p7:(R )J::Qi"&׏7d20ࠥYV(S0־AkMmYYYDp̡7pb)y21NKG80:€'ܣFT$#pUy2=_Jz.LK4wJ sXujJCi8B/ ȦUˈ ,Ӿj.lG 3VYY.͋lqX9n_ưG|[!%z&#G*A3Rd2Ew1W]ʨ --g}>%rk։zUXFٺyd$O}p>xqf Q3Xx&|SQjr --kQ~yN  --px -- Z7m%ksu&fM+,MnPWT[^lť %hhpE+J\?htO״[ӑYYn-R7U2M眜eC%N*E屚W8]v>Q&xxqd&UԒIJ̜Ĥ҂Ē܂Lj1£`Of6V.G tx͸i3/-_Cst.#+XtₓHL~9ydyܺk^רJr㢜+wN%wLX#qx"dZE5j"'&bAD > --u&Iɝ ua~~ٙoDMs CC Y#eS"~Չk#éWZ̴(?u=r=kjFn`VWtҫ9v%jl:{\kk(R ܟb7>:cb i`XST|iJQ8M/#ݮWaC S5 rѥX\A{e'H{y7|8ak7dԋ*v5#7|XrH]caXRqH6Tt4rrre 3І`pg 44)R4Ǒ#k>N},kn.#".%/ ]'&#l"4 !Ia@ --8L5kYdOVք $T#Sg^*OCk XEsF~ Wӽ}ݠ/K*Ssdn@]T%&ٮdԷm LzK 䅺6@^lH'JZ"g%C9UG+y~o "c$!˼i D4c2TB V֪ϐNKFݮ>Riĸ6`NRu5k[\6=={҃; ^XʾVיSم"GEdS)y%BE~ @[+7Y[6BvDLj2'V׺ZSpM5іmV?.!9!50H2Y؁#Wgw-͕(HkO=HW&r_JI8Cr0|YۼuE+3 --ZX=KTB0 0Hh=@AJG0̈:V|>0T$U,n2MiB8f16a --`d4cSH)5NEG z%a'91j󬦹/G+ؓ `QoXa*ؤl&EG,Eq[Д()Us]BdK/HY0Eg.l)`%&qK-́VYTWfbZ() WMzB?ٿ:6o}C42Z/؂CHPV HY`yhiRBq6yEĆIUk?J`AORcOdqQPLjvX\c5|4tcd.\̷"ff=7$1)zͲwE޹bꘙ` --ز5x>}f_J>9g2w\>f # xX;bC7WZQ~BiIQjA~f^Z^J^BfnA~QBhSbq)“Ek7k{N^r­<$*XdYq) ^iAJbIj|QAnAvzFqjNjr Y\Y]-K/xUqw:F9.ʜT[uuu ҒOD*WR$RK4KK --JKS2 r+'WC+Ӵە\ZT_`;IP$DS__YsKPWZT4IH+`7;hh$$T MM1Ŵ%ERKR!,LI'*7YZ[ fRqIbQRAvjEjBRi 0$(()(egM'D3v, |"|xUq|mwm'3y2nfa1dgk+,x;3A%=~k6`( p Q4g]x;{wK{F)l" Fc --~lx;kU*%  pxkM+UHύOIM-̋/-H/JLIKKLW-/*Qu ?xfvN+ԔI@f59Y*%81)"l\/021Pxm1o0:Q7937}bs{|cB[jxUj0}WC) {a]}YB=vՕ%#MK-q݋ A93,Xό~vTհ,/k,75/yTVFb _o>[~mϕɅl6˕p]Qֹ)&66Q@I?*8Pe>ѹ,tR;/t lH.&'Ăo&?:$żlq9^7O"L;Ӥ04bdKukx)$E  --"6.kQ:/P4oBmN܍Ux̡fة]@+=RT}ut'e!Z0X9:,G2N7OSn>: --A.!!Pgo;,\QO]?ـ1 ;8~rV\ --P_Yjg"9i9%%}|f$dh off Y_0ƫ ^yeZV3&/f.N~ --jx;}{B^Bkcc|c$;qu+cd z5 X/7;%H0r!Yb rgXʬ+5CkXx;}{YX  ox;ͽs쉫&1&'kLgΥ% --yAA.n>: --JJ -- --iV`U W^Y1/f_&wFd3Xsrd~69d %%M!E%EySX< ~Cxx>=_ --H}^ijT --{BԘ qdwmx}2M׆O@md*IEVhjޤ;?_Ef̓ly`JcY2.m^mnBl܆rpհڂʱgIŁ8e --'?c2:+KS$%1}V "EU>^Wa!Sc&rAKh{'saU(hjX<[X;kI{ZxX[o~篘Rl> *Bu1$;A!%wHOvwiGAȱc'T1m(M Jz_wffKV"-ݝ3g;^7c%x5nԋ9^o+nS*uDȭSt{vH,<b̸(SW-%Fvy#pgT0ǝ`']WMoVo:UPkɭ;鳵;DA|hERL\&"d7s惬7^FXYZo#Fý;7[;GGoHU-X &BeK<4*8\vhz;, PJ..F#S ђr1&:sYsY|qNA=\I(;ܻ5™ܤ>v$O_BhD&" xN 纒t-"?WɽD()8Q|KЌ]?~d~2Z%!;px)UEJ˚eEʢʮt#71VˈͰSX| G V,"JH jx;1Ac7[i^N~rfq͜s1+))m^S/K/(NKI-Q(.I,)-QHI,IԴR4hPGjzDda) (V1#xmn0EwMp.a'\ǐeiI"@I_'Ii"&gxL&´UqlF{kL2^iLca)־ CkMeE,-ܟ;sC.4,y+'HX4SȲv:] l`J:ݰN6{<&+TmwT2ZA0ưj*p&`e ~+ x6-|gQ٩)9qƛ0B_>M$CX}?L\%$;X%fa"6Nd_)t[ ay!c1*Pq9/\et5*ks$%1G|+݅VzࢪU_۰T%19 mcR*BlɜyX)ʽ5V6g=yg-i~R͘67[:a& --'~} x;xQRRK Vi}ؔշ'*X/ձx}N0Ewz``JC*rWJe*a/Dߐ&bcs b P/ج OVL9D~MP]տ:g ᥽gcr0ɩҥ2'p <UC_Vjv{6-&(|ք/4~$ǃ&ЩrxhMhry-aN=lѰ^Urņerx;4aijҶeE9IE)yK'x02 --Name[zh_CN]=更新工具[F3windowaZntx`8H/175*#/-Ϧmx}!,.׊dۂ҂Ĕ̼ǜn yx}?0Ft0Bp2TQ/PEܽFmx Q\^jxu#xB- --T rV:3 --j->|]?"qvK?ͱ5R$INj;@BLa\q --M^ =_-VP --QQz9fLx{7QAKPT5VUUU[RTծMjVAjGk^}ysyYO"T[S25*22*됑"R-䦣|mLr_A>Eg2(tQ1퐼mllUf2|=kL^=dT`4j --8hdH=Ίj8ϸzź݄s}/x\7^i=KrCҴfM{ 6ZNHEKD)wOL U 0c=5!<Û`Gezڍ}̓'G vhvSOyJxcpۅ.*?dl|2@񞓂1d --8=:N&mY'R|{bZK&GڏKO ٍDeC+ټm&{&U/kW ^!7} fCdC ,Sv|pzwUz-Q(mڇʏ42x!^89agn[E37Yg@{RO!X,6'1)5#sv5WM7&h5A JEs3,@ݠXb --!Y$U̴*b,B(sD^ьW>w+yr)*6s;# 3@|@vJAo!a _ Gnي c/ ))rn jM0یtq{:~ 'EfiDJ4wʲy^fgԕgM0FXYtb'f=^/`> ȀoP{3}qh=Avh2\ia.'|j|r֠-RH$0kO #@VnROTlY*t[p*8f'ޚu\ة9Ɩ06U by<0}Yi᧸;t&9d70Oџ:}C3 K$n ESJ,V?s6wDq@vşb=-Jd|3uRf>4%y_rٴwID RW(K~?DF3kO2O"G9jš+hR'ԤCUr(B[h<*Tw1dz6,[\D@Pm`| --[%]h4v)F_KDFNHd4Q/<1pMj :T؛ým ԣL[$bx`L_t =WMdu(Aǩ nZbmͧ(,{xTҧ;Gf}EmHjgi (YB()*V2HGp!À8n<[9u+X3c*]RG;j+1VDWޣZɟDmguik8.h{K4ɴh{j --"f)@cL)qPo>GBߘX`VӉ\Ze>3 M@ >v2!h%1ԻS=8ũ?!D{c1xBG* --+%T^ --S^~GxpF]ZGJtZ}Ծq6':N3o5j$H{2:HB罙W\9>bTQc'1wHɫEHo| ю˿>^t9y4Iԉ2[UTrʠoǖe P2|,O_Ts4^嬁lԈv\7W)WGć#=UP|ZU34fI!hOQ^.9HYjѼ8θf"eNۘL?3u6s9$w \='.l6w@6H!ƏX[\,1Yw` 4S2Ov򻆫L9Wb>)']oDl qt oj81Bs\̌7O+F?oø$ΘaL,ֽ'@"m*y#/k+6?tMv:ZGɍ$? $:er?sKzH/KBD̗ gknTMC,JSt9 ޑ͕5F%:siy>,*)6pʈo<:O$Q/!;= ,? mPx^{q&Cˀ.Tϛa3/8aTf-h9mʂq B/=z8; U$<ǸkQ:"Ԯ3aC^M/[!8Й1u# *0fJ.нÐ-%_upeԄزC4Qs&Jo&Q,YG# ꗱ.20u:eLξذ  H}rPSZ0h&sTV/е"Y!|B~N?irxEl{yܬGv+ --l,̵>ve_T% 8H!ގ7U7R $O002+gZ~- --YѪ+TPݹȺ|!'۠Yus_&yc '۷KpvJv_t4 Gh@H"^Lk!"u] e0#VqǙf3RCWΩca#7|n)+eq DSK,LxI&WǾh3 0z{R`fPo!ڙ''W>ˀ)Ȓ2+~݄TMT;XD`F8 [Gc)C`TgV/Bą頟1{SS"t-#dSD 7y\[nb<m --z޶򔚼7'w4U3*r'}l" ---gF;6w0/T-eB2d 7ŝڇm.Mg@`rZ7z9bR6AfS!{)Y}To`ͪ> Oۛ|vXL{팠)=X1.n&lJ(--H!d|ɬ;6^ĭWGZh!4b]v]'T --1_*񝠝ga`nm?$lzB.~.RɌq:e0s7WC!z4[nbsƌe3^qp{ 'ö[Nto|$Ҩ") --gzey`7FзwtmHPNI[_ hnyiXw c+2h8" --EL z>mRN$j~^NCx~YyV܃SP奛XK7 Y5wᦆS*>c6,2o=Բ,p̅<_oL ҂ vq%LYlweco1D! xD”"HHeEr?J1COS_ZЋ [:[^ 篖{Ah= [^ ^s`ѥ񵜜4/T2c־|JτC9X,tYX,K&d_V(i?^[f = Bvmxµ5SsWX?-OXtEO0N[O?(5wYcl7kw@UF5_wWxIOTʁOa nٖ76lVx@L2>mi"ж؂¯9N/\`IgOJ` --?`Jo=]oѬ UֈskjWsI#_)ӵ!&09pbG Z --r+"cFpbJTH-Cna!uOTO^O6voTRw9xvL-VpFB7^\3R4?!{. d<0kV`WAT0&`MUBmMMO@tώXrcqW9W)?⁘0QP)u79}~.[: yvu/Qܤ=n\:tCfoADEe\vg=Ѝ§™â$RM[IkI9@y3Ȩyk^~Zv; --U9=;E*x͚pnBuǚ,G;{dAZk7>~<,pF=/~/Gn?)J`6<6U" Rub2S+^2Fh2Ys]- c9): m9s!,4A`1h!Sxi --"MTUG`[ǚ7Q$~ --OB{eƠz_7Jnt+޹sV$vJ)nTF%;U-w޷ej|ɍA!IMBpooM_tun-CγIμV(밌!/^9獷#{*#Yf-by6sUKV>#  }]X&;}WGoIWVdqȹM9O?ޫXiBl]2=GIWj"eCܦ#Esqt )ϟOH٢-u:81-*viqhJHr{16M{#Ƥ..'-[>e.N{f0ZՖ+h]$R`[~%7,O& oYNtNP*=ۯW*)=wݧt?;r|u}4S\ .(̊bpA-˓B Xō%e-CjpC:?ӵO%0 --9͙] /&m/d9gkE)h:eh}1奦d׮~ --˥zP5m\Ft>7lI{ȿ*s!drAm=vf(l#Sg'`Ͳi @Ke#Ì}fv~RN!p;4RzJ EWuUS󲊭Vµ+QEUqUI66;:$pA9EEEn}J̢ɷwH(*z;-~ƺ]: JFx; OsP ȩ֊lɿyɩD!Qߜ\K* ~{{X&g :v'g5\EW,P |k,~`ȗʿjo.pw& --qw~LHSAjި~#x5R AϺUΩSvou6bx¢ T1p --w{Jii|_Ӆ[KŖEtչ'ky y]F2:(̸"z8χ?]a\;l΅!+?\Tʛ&WXEIs[ؕl>u;bm!fSbu qꎩ&Gy z0GMiBrG_3>.>%Kom8P:mYݘCɧ}8eU> --g.SPR2}W2Į?֋0g籭o^=b66j˥9bj=>*)@ϘL)=r$M8<h4i_`Dkv*ʴ#x5&pz׺x,8z-śr+&2MO[Qq vSrL!S3쯜B۷Z@Rup[v --MUo?uX --Kn8c nD{A ]a7YھF?"fZl兼ƯOWwuh-ܯX6 Zҁeɂ,ljl8Nt/>33(6vG-uzJB1{6! --!Hl_RN^ 1zErEP-ĿwwdSؼ$+YzyJb`h"S4{{sPz(nü _++~)LGSB&i\3̽xh Ne?{6uy |olОn+ ^^t6ѱɞ)*3^ 3+TZufLۡTt8w$Pbv9U* 6ug]Ӓv#E>ߓ]OѽbcH>%vŃZ=u ٻg;Sfu-{E^ F\TFqCn2eZLj#Fu9=ڃ#LkN'-o³6ӎz.끃RI_ZxBھ2|( F۴QRZ<Օ?g3*ݠVGdnvJ/h%#o( 8lM$/9zi.u#5Yau gctʲ]EHDgJ% -- K~9H_kVި]r)fw4O%K((^ m=AZ[JOZI5-ZO[H=~FvED<'~ȿ3 ZR,2cdm-~+FiDTџ"/{ Kp\X7:pg[6^ U8|ScnXGϩ(Hɫ])H`6dՅ"G:\~Tlԫ%}NCbJwfw_@[ "(8{&mf]ZiP{4Z)[j _Uײ --uwps=_[{MwbxE$`wci6v`e6-~˞ԹNͷk~1H_!@Zڅ;\{W_#^HDco/37f**NfjMf>P&Jy.}?X1cs sDɸBb%#OLQO=XSlֱ1 G^ʵN3xbA ezVXbq9L+{k;C?w%6ou\i֪w%F*#cє\{k{˔#*/YB3/ӻ뤔r׽ --c[$1Dj(1na]>h.H?^qmf8*lQ+0鳨4. K)ɢuH{{MW~x'dH7d q3O@5UʫXUlI AnGh֚2 --wᔯasM?Nk[S/td.wrm+@tTMдͭ/'LXYX|"!hܸfbV喜zq8$Ji*ݦAa Pv2F<֞࿸)YMxI{kɄ-efҹ!rK6W%&a~B~ |懇}0m BpI?n4TiČޣVYo择GeYtNH]N̊ѷ*[Uv ¾k>S`lqpSkSSSSRFꋽY"wiVzpd1-*o?~sP6H@J=De Z9 1-lZl:nԉb8NBX1@Eƫ(՘e%Oϵ)L|Ae --oep6U^b n\Cӓd0z_|9q)OILRxOV|E#]@rq$_on)DUm+^C^Tx1?Zÿ.䨑{S{4 Ì*!GƑIO{a@_*?L^M[{,6A|HfjբĈƿcL$o5gw:L,j l+;=#F --]3EDUkb3 -Elj%iSTQJnTMgxx>F$hx,/K,O/N/ȟCհxPNG -- -- IHDRagAMA aIDAT8S1kPRTn-.ƹ8:8(tA --\DбH.ִ}|w{#-JQ+1FEta:Db[ I,f/ øm;:A,_`^F1L@l67`𔊼EirZ=p m& 5MA8џzE<`5z*_c>t:d2N8==`@k * --HRv*BeYP,CV;s7& Z-0Mq<4 Bn6D\@ v۩+ --H8O`{t]\.{ --y $X,>EQ|A8f[+򆉥)`+rlB?G̾P;sQ>hIENDB`&x sb``p  $?OR,鎾 ${<]C,8}5fTcK[!?=z^Y99Z -- --[lz %TXXYw:6~.NXU7rlsڴ˸aR+޽s1FefԴ QZ ֓'0:&XؽxMPNG -- -- IHDR4.sRGBIDATH c`!0"C_5HHHhx zCC&IIIulrjYXX hp&<"x Pl-8.6Q>{99M//`122:?5. 9fffTw#9R,MT0qԩ@&E^@#~,#0́!P\4і!љ3gN9-H4,@ G#Xl`yL4Y#g- --CVVVG&&0Qz4FC#}Es叺IENDB`k8{)x sb``p @,$) w'ud^9f.!  S ڼ<<<u,aYJM3k"9Ոrkqf:oϲ㔨B*wO;[쟓tkOQ.JDǴ1p }D]+EhT --r\\ ws ; +@,FMH 8)S 6KE;ץQW`j !y#8j:m"U9br0,aՐ0P$_l; ;1:"r#{`񨽳T%#Z9Phq8?W3 DN&p/|$xk.oK$jSս*Z=hڣ1MhGv$G5[׽zlN n_Iɏgrw5l\ ASg ?΅Jx! Ow#*ʵ *@Mk^lF!huLdoKL1QT~xrg@s0t]A[G־~Qυ[k?ߖh n|~wԜܦUXV&ߨ=RͿxKKLIU(N/--H/JLIK+M-B xmα --0=O)b*޶MHnľ --.S_ 9.gtr$A" Nj/@2nReF`!hD5{P NEN/ ,Őݑ2?h'c_MZ#tyyJlmCK x- --0E,K'-%CHaoN{8ef#f( --#b$Jܒ]G[7B;:}>y[ablr}Cc:~E --}tZ8wO˂վBT6jH88k x8q5DhxKo0WC])8 ULa= --)qD(ͣjzfefRVTQM;Pxh" 񸇥#IHo&t3 3N@v=y)_S)4j_2F#u~2%btu Eq%Ⱥp_CIpfS5?ZgO"ޮ<·:Rb2Jh[6}e}!߾LxVnGSLu1µ7ĪGޱ=tkͮB2!si&q0 w\:\X7?c 0  :6ŦHH|c9N1`&6~<ٙsԙ)LeI&Gt --A  --FyPyR@EN}53WT.ς,;́SL&J'9&h/"52v.-T2訾 ^ .Bx,2Ę,˧?D.kVn^)VLr --Qc DT0Hd;v0sHe0LJIbԑLO6 --bNNp LΦ`:NI/.2 j gf4Nӧp-?0vgB( 5"W5CIPpX,;IEݲz%)F,J<1- [cN&%\c@D$0"lO##c10D^bcfp --2x?{INk]m92 O5A @ۤ\7o#ue[{Jvk֢ω ѼTRuO1AKXoP ȰXHYsuA+ )HL$FFkXC$o΃[CՈqK|n]߻󠻽M/2n5 mgE{D}Z[|74R4iu_^f^xt)]$Ymzæx --z}k4:A(thY!tC-Y6 uW&#EÞmf@C]Tc\P_ۋvVUXyuY1(kw42a4G( #?BͲJL!wJQ}$\@<EH^$ua"Dt?.u6ny~U\5m9R[k --F\;A)QV8淚ݧ>ro!6#6i3>)/߫OnںW0qalj pi7 <k --BssEHHT9ttbQ+'Ex|9kg1IrTʮEs Af6>neb!f@];NrP8'c,-www}\]q3kRٓeWɼod>΋J =1L{%{}xXB'wGl> --~]P܄Gk6=WoA= mٗ\09,jI{ڃC/ ke]B\B轷zxoʂ0S)b,ڃbEUvDX^UW;OV1Q#A ۗ'A0$4lfߵ 4=hx,JnI-~xV[E~_QtGfā]4n%zweAʂH4EWW>e ?'{z.@a:;*f\($3y"-Z Tk.H\ھ^]R(s &ZDXC⾝{n#, -- `Ŧ++5,tE*[#^k4\A_iHmbbwiU<r&A[;׍=>9xS=^<_p#9SMdO:ށVHU*jt@DF7D<(W&u"-n׵[+.ZmVsi^t6̾D]h޺pG_&o0fD|7a{FWG5 jFx.ոˀhL/K*1]0[h< --` k;ѽgr9YԞꄕ[1OlDH`\!p`)iDј!NSx$[9q1sLOȈ o@-n$y%5 3/ (1%yD&]}_ƤD!SKV̔y{,'Qy]w>eg9Bxti7Yi+O3bi\E x-/*Q(*JIMSHO-ON̉dkhZq)~ѷigs f=&狩]}Ąc:>ӞqBm[&c(ix7ܠ>k[xTMkAhf@+EF C !S3;dlA 9(<%9(kWNkfz%j0 Uޫ..5RD9UԤ l¹;7{{qr$| xHY9Fקo8+To%',CI!pbTAT߉,ᄤ$:w2& --2xkF7&!$4>ek4Ogn?^ 8A)Lp;Jĸeey㆜R --L%@&[`& rkj`PeYǚڽT*hUb= PiǾ$ ܲJ!guG_hlB~5V!yN'[~7Y4W״B_/N:Og(1QQUFAh`z\h1)E T$V*>|(R +‡lG!|k_휾?+ $M`rxwgϏzov'Gv78kcW`IK ah+7"':|h؈LNdvX)Zd+H,KIDhȤ{ur 6Kf h@%5 3/ (1%UIKR3l '.v+R*R(ϙ,øKӀWdK2*m1TL^”֓W\r (g5zs̼rl34@$'`S8e;{Hx!~kxcY._x}}Ԓ҂b̼b M. +.Iɉ/J-,,J- R@e`D],J+)/+)Ô4yr-,)&2 xs8|j˹&odR/-)*--HI,I-K/gADr3A'/`8! Ex;cF?e̼Ĝ̢bh. P --J%J:PX#3/94%5 19;1=5>%$64u,BQjA~^~IfZˆY/}:qK&2%(+BmUxV4d)tZ=],CmbFd!G[SE* --CShT0;WIx{Q 3 D!( 8k"M< M.P axTn0 +`ʹvـ CoEa06h%Wy}dI\b>D9zLKg2 --u hx%ӰCe!-V6ѣ /BΔ!;pH}-u[ƪ5rf<+iB/zKMƽ2kav8x7;CZfa#HTX%EUhCDWN --tRZ bs(p}$[j4Ef͡ʟ'hlbF<4'_xCp?JN;WsgxUAo +>K,8[.EBj 8^6ph9TZ,x? Ӧl6p+L)\UxzŅad'#.NKQj --}~aA;JX]ZIN@ZFd`m6{4u!iJHUu!(hQ6t,-.QQ*FZGs2_j@Mrjv --ߖ0'BZ/dGգ⹖]?.;Jܘ*-Z^31u^t}E_sgl?p]Qas7uUC$)< K!za#<L=ƕ1?6OӻwS݅s>bO3Z#ψwT\h#d1##́ Qv§_M {S~Ma0Ag:g3umFbxSMo@UH tjr\D*AB8 U*n%{MJ_DdnPE/H\qaN܄+ͼ}3kg׳|,13-. pa@}h]N'l*z~@{~ϳ֓O'6Z)1QIg&FlIY0Ng3A x-/*Q(JJ.K/JMOPrs 2sR51)&`RǼVIS$$$V ČsˬPpN s52025653SHKA04TLSۧWX7LӊK --2J4ԟ|ګɕS"dG/\Cbx-/*Q(LKʄJ2sSRR@Ғļ" 2TM+. (J,NU*t-*/*)BLՃP @;=}|u TPPVxn_I=Og{igS7탚XaE!4WIg`Ey%%@?5A} Vr^qNjj D%9'1lZP`v/ڛZZP& -- --  1TP)irmlxkgd ȵQ2PDx3kpQD!7bSp?a+_mmCx3kR --&bN,-av2ƊaguJ5ohx[ôi",/B) sx[ôilL~|~rJ}[AP&x[ôiHmMϾjʊ --4:J vx[ôiKu+D=<6- E x+JM.-*,KK)MIU(-)J-KW x90 >6` ǎYyLn.{Jsa(s@=w!Ut(-h * q&)B!x%A }wA㇈AZUƿKpO;k&͘x蕄Ss"j5zE3F,J Ƥ8K4W&*^nզ0qx*C'xjו29~H\kux68b#ϽKwwC5ӄAL>o( zS- n^knWx{iC(ϫ K+o]x࢜X M;xSKo@WX%M.q@PT^7RN06QFQ *(Q%m*B3^N PZ|7(J"f; --i!\P3H"r!bܺ?F#\0%=$ѻɜ" ɸ+ujhq/f\nghl(M(W5QO)yu6{INVi޿6o%`oebvWL.)#7h0Q/x%Zߨv3Uj~[MGWC~. b[L=k= ,+ -1s3EFcI$^Ly7&EZqA,rCka-^-9 M`!<疱t|h$\"P"i8?Kė?Zyx>c^pe';v?_5i>ٽ+?T QԐ$,=k1i* r'@FNԿsfƗMCk{9swc H0}G_1[a8oB en+W8v;J"fN҈7jc`Z͏ki |dA; --/H --DPk3 xQ aXE v`E<#Pa'm-ZqڂZQ g:|mX NY#cFdt|x\Zjc#cCǬC#c01Q2!SEҷ4ھGZΉ߁EaW)<|7xc-AvDZEߛ 7@ZlRP+l --clٜ9:<]4L=IfFO~,fsli)O5}:F.Z~{(erȋ8Pߙ3zGգ96>q2XwחgOW[ҥ7.,&Kߧ/WqcB0lNj)X0 bؐ(Y0сٕڻ_+mvLVuV2zC)% {SL^jm6o7]y`,G l_ `nȂ2j7 =2],]ڊ;R& =T4 (E2y1du譶zIɁU5w Ng Boa/kxrfj T0tPCk58s!黮|Z6WTp")922D!uP*]k.aZ" *wP[al07N?STđUe --v.aOw{'VO}dbrGP06 & 7-BW%[;N3hcL=XL8^mjUj'J* Tv EbQrxG@E;L;r ̈́{PG'g?.5_[y~\{<,- wr#xeczrHm`K& --.p`O!Xp" | uۊ6Dҵh|t2bk|٨@Qr[ 8ɨhp#Jdc3e@Ou|֦*C$:]5!ԴvI\T!TF$hTT|TnS{z 0͎MAL9LBۙ;^UKrswBi a-h!K_4_$ѵw7^|y&f7dRqeJBn)H[*tOǜHQ N^[3 --+J__7l(srIJ{ųIGqlHp$9'ǡ8_? 5j['o7wcf PfaUNtM8}62 --sDt${f zS&q^!" p Ğڴ gp!p6G0e[osڱ'SQL|war+Oד u&N --+ep70A,'jƐZeQȈ\ iǾxsc(VpڶC R$>IUlKȧdRb ]Zٗ,O(k \FlF*>Knꖅ$US[T xۭZiRɯ'oc?y',d]V!1cTvI-I)VQPq4uSsRGYؠLo6{=dg'O`lĪ[`ZRZQeh(d*d+T*$NU|YqBQAnAvzq|^iu<=@&փͺ|}MJxۭ|HzEK'^Z"U_:y+ۘ<602N6c|HMق} 2J4K244(?9X/ 5OXBzy񅥙%Tp J5Ts 2Slc'X6?g2z}۟O{ڱ(Ovt?TlZ% +܁gL⭝|7j'eMvV05Y4? %$5>/$3RchFF^`Kr!QPPVHNIJLVH+ --ؗřy9y>@:ɷ -- lV"/xmQK@x(K-Tb=!C늊VʲٝIH&L*PxMUB,/-x\}}=^u9^=˫|ߊ%Ynp`cˤչ0I-0]iR$D$`Lb.|6PZ\s'Ks3 7bQ;*\ܚ),\;4:_`Ԑ,vk!uZF N5 y΢lTN> Rmw/BDP}zQHAbŌqPC2:T{?^<_9(1Vw)%~(IҌz1nB}z*6 8+1/,pJ?L>[ƎL(HȊHv񀵈rA 2tȤ$>”$ ʟL=4ui[U%7_m:/x;$}W%3 D!= JI*-SKJR+J6H1:ǻy(Y\iE --%Eyizy) --Py --`:"ŵ&9',J-YfLRȃ$1MzJr҂Ĕ̴J ĢbMɑqN)h Ҧiť --g~9YmOYc[MF3Ms,^ ]_j0xuAkAY5Rh q=[CiMaYe2;M-䤠sѳ'/^Ù&Me1W?-z`, 0, ?8TNkYskN4m"St$d{ǔ 1iƅD) ICdT > I8j_~ZVEOR?*H}SX=>z__fC"7PI䑁GER[7sgaªl/Y\=U[XnԐ> cbteXŎH -- K#Hu '6!SRݙsǘor" ,] 7Fs8#|:kLgǧ 9aO7Ltʚ=e*e&[8p8t\x3Lfq@aV?1! Bp-g.nߋz>'w4x̻oC܂Ҥb.(@%'h'e闖$g䗫ku)o~F* e --x˙[_T9Qtan>: -->~}02̺J)%J=X]s344 '?==3/]/)839?/-3]#-3'5/17hԜԲ[ZO?7SYO^˦b-$ x1K1"tsZ)Wn}wIIrB""-BP("Tpp?I[/ݵu0KBy|_)ZO'L(gBTh[`Fx-lgQa?Kͼ>,T|I\ԫWUfy=ܚMVа6j_ n꣋aap: YLtiN_ZOJ+6Q  b޴rQvPUʆKO5L\Vg aUD9 } --(Q)9aHh*\C֑S"82L,!}ITIO`§| R&)) =Y;@\c8'l&S,"BVq@x:ԟf,\Mx[(;LzjI|bYbfNbRNj|iAJbIj|QAnAvz73zCliј~^6#K x[(w#dyFJ婙)y.%Eyy! nf^6!]C=t̴Jt2Nfg-LSKMWUPM̋WWk1&L.dW˞ ⸗d4hLæ:Y9U C?Dx˻wY#;3yf/櫌X_0+*Ld 8xw#f>FA --/l&s}k,x˻w/fQƹ,?2:Cx{w+WJjBnbft`F .4x[[x||@sQgxTMk0WCO{ --Pa?nf/KBǎd$i);cqlÐ [޼jc=3n"Ճ3_+SRk.9U?=ڗNjA{)d8XՔ's;?4gӏ|gm} --*SaAG]J:v(^H iQAjAH0\@%эб'EzѠ(tK!?릺GkV!ϝ'g؜1畐I{'m(x3wG^inRjd 6Ue ((+рkrDRKJ B};hdx3gBcBPo{kO,7?b W5^uXR'@>Mx3gBhgoB+1 !39),Pkx˳sDӌ͏C7{3_bIy --&x3uDSMF͏C'{3?UcOTEx̹g*fnA~QBJbIjIfnDb܂ --׼"<=`?pbiNFqjNB~RT223KS5r:p` $ P_ZRZ2H( DC]5RW5WW5EAJJ5X]+55hVTZуC362($ۢ䇌X%6;03.Fvx:Y93 D83=/1 +M'갧)LQc"dHiҒԂ̼|= A!Tx<߄w'+3F$sa;"xke"[_T_eeMT6a[_^Y"tJRJ4<$C! 5*TX4=0\\\)i -- *󓲐rD2[\lSRJs 4tt2RؚhN?H1Wx{iC(HC؛w+E~65 -- lPx{iC(HqT*Ή>} --Z! 3 qx{iBRݬ;߇^9#ĕE6Q}boi6sx{iBC'6ʚjȉE\ҙ817 ,x{ii?2qat!*a. xX*~C:Mdb29H>-pfH --?WP]`, W"x}Qn0+OAp@$J=Un Ĥ~;Qk\ V=ޙS&EAT,}28g?V --Jy# i!t(7'D;[![ .H>Ny|n Søبw/RB!IuFfwT.(St(è --I^Z:e&c§&@P\YPRZ1Zƶn}^2$.!#L1tbQsh#x[ôigKuH/QZnv{u&@PZRZp󓥓6o`پEIIfx['100644 MANIFEST.inYy[mVt:|21ppD¶;T73\jZ1u4]C$!X-X:"$Lx.)Eĉm4x[ĸqBȱrlݺ;'ky x+I-.,.VJLTQJJR*(+PRP() xK)MIUrutuMʄds --x[ʴi 95'NT'a}Sa) UxUn40000 img3\@``;x#bMn<FyV9; --ݑ5 0F STp N$nx}Hӂ` @Eٞ _xTn0+X`C恢i8) Zɬ)R Fcmpjc=5򲂝]Jf6NzcVv|8RXSEU\jeLJ%W˹и/Ȯ5x~qyi=sI]{itV>!$/mH6:}L@%~Ѱ8f3~ؒKbj׃H Y$;R_tn;(uE:辍!̭,OAlЄQ!TRjKW+~ L1 ('" <"' q܋Ne*Ԡ9uc A7szv҆z[X&quQʈ e늋Mu Nezg/C?:Kx#(?j|xj[’4󥓥jiA|W׈RC|⶜zCDp9uvW@Fp|"LDXi4bsN=_\-҈=!ɋ-{Z'a9!VCdx{F̔Լ̴Ԣ96gbd +x{}{BsQi$Fq%.(P --J-WK,t, 1x;{GF"ĢTԂ̼|̴Jt%.(Ptl,?x{{BsYb~[FѢ\҂ĒT̼ĒXWoxU]n0~)Lf H.UBQ[#7$V;;7\!k0&-yY{|{PZh"p/ }H囏g%w?A>?Y^.! ʂ}6N[.d5 bz7,j&cw 2-yH9{/6QbpH6b@tτ]>5eL1<SPF.՜ZERmL+Ta{~Z]+Hzr'%BgT~%wMM, --Ɣ x$4_Zuc\X`qF>j5#Ԝ8U(حBM{oB6n )'3Lk`94"5~8O۠b,Nu!-Z3tkokdR(`BQ+8ρƦ: &=K"8%aA8Pݓ)VH+n^q!rʲ/b@OXa'ڢv 5ߑ卢h{"%Oo&;$s<&hiFa=Y1,Pkg8I>KR:]~_:o@x{wC!V6[\3x;wN?XKS5 8V/\ 19;1=jMFɶl=1?x{w;VЂĔĤT?Y?ԧ +xwqĢނɻ@׌ن %x̻g4S~Dsى.A -- --JeEyi%yJ\AA.n> t%)f)($dVdk@u Ԝ|UAIS!X!͊K --ʋ2KR5JRJ6293MRٝUqt2*xijwڸbĒ < Wg  t%M̼tdt̜ԼT[w7OWԲ[ZWPw͉'0jNa B>y?#$~F}L> -- --o3ٰ(dnfCưf60m 6oe^(ԤZ^PZl0x2ִl -- --Ey%02MY!7eM.Mh x=̽ --0 ]OCtЖq"p +}p6*Qy6΍D --0V 8*4w?_-#0Te+SK@'vpV̕)ǵِ1bBZjN*ҥdVhGGRV||%aXCۊ^Kf`)ZϏ)I &ƕZI>a88g ^_cD<0\ 5^CakR,, C&*^ ixh%_!~̑!jU$tDr=HUY0/r4 ZFwzԇt֫O,aO/҃;e^U~D\2Կ66C"$ --1 2 W-ySai֔j9&eԽ]N(qs%;1J sa] --/`LѺ.dի+KLFPDH"5>I(iVˤ濝R-\o5Z-‘/s4KFHni4Mk_D 揆7ms --+ e8p"(Gd --/[THilOB2<5񟁸cN<.40Ѻ4'Rm^>L RG΁/Re;`}sd:ΎD&i42[JݭR B+6.θ* R'Sؼ~ :҆B5oݐC#=!݀0 P};FNi CDד!Q}::yN_ 1v@šUH-6*^C]c6!83e^5_Oh|4/k_J[c1rv&Pj@*p`mG3 ) m]DNҫz:0XfmH-6 'DmrIQR$2Sg>FޅDH޽S*STɮY1`;̂Qտhkwi~m'm;mosv1FpO_pbc8akk9[z%4\|Q?~R͈| 䁿miK[Җ7>> (ux4acBQjA~f^Z^Ib^zC5nOo2]{S;rd^3V'T`Ye$4xRn0+%b}r+z ڢpE%].Ӥ_ߕd[ ggf T k.s .09n Xi+,#|`״N29\XZ<27Dzvz}MA-~E A`Z!~kF+WߩJ5ߚxBvdΘ^kS?!7଎/mf*$#@n u53 l:0pu`L[zߗu,u?NWx1w=PIt> --G_EgQ>?͜U} nocChq}¼?'R2tؕ B&lyGhg0Hxpw`WYn6γN*G#/E=d& d}#Q6(ʎPC/Pu5SL3E{_$<y^x6ŸmwڝΠ3鳆YӘaoqO-nMlmȃ%ۺ>?8^pe[KN+ƞWeE$F#FB(8!a1eY-6kY-hZ} ҶȔ0*ʇSͪ[-uL撄 츪TTr^4DA*g^V;$Z'w(X3&Hٞ"xy( --g،=BHDž__?BI --• R;=)V“l$brbt:J)CJkmBTlS% x]߼>;YE)kƬQ,+PP‹xpB»<FsMlB dN6W^u5["ePh>jʚoB$9Euklh5VwU)$Z^]v|+SWNQ?%*Y%yY+%GV,r1k:I|"B~T=Drυ dUzYʨҌYYU2,.rsRgXQ,B ) 2t,1X!2%8RKk.(VN)[`9G*'pjlU6Yg@:mز!^I~۵v R-#=7F#mh(:Tb(@U9x]oAWLIצm0$h 4.x4-iJ@)FFawi̜ʿర{ylxJ$ --*BkbajQ@OmX>5~bՋտf"cZvzλ90 w->]\Gծuc[%DVag#(Tw$9Lr坨*'~!:n@I̢ dW8Y*`@muMCiˢ#5+1/dev/null 2>&1 || : %changelog +* Thu Jul 31 2025 zhouyuanyuan <2535682878@qq.com> - 1.2-1 +- Update 1.2 + * Mon Sep 08 2025 zhouyuanyuan <2535682878@qq.com> - 1.1-6 - Implement resolution-based auto-sizing - Implement multi-version deduplication handling