diff --git a/.gitignore b/.gitignore index 82f9275..7b6caf3 100644 --- a/.gitignore +++ b/.gitignore @@ -159,4 +159,4 @@ cython_debug/ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ +.idea/ diff --git a/gbx_extension.py b/gbx_extension.py new file mode 100644 index 0000000..51bbdc5 --- /dev/null +++ b/gbx_extension.py @@ -0,0 +1,58 @@ +# coding: utf8 +from PySide6 import QtCore, QtWidgets + + +class ExtensionModesListModel(QtCore.QAbstractListModel): + + def __init__(self, modes_info: dict, parent=None): + super().__init__(parent) + self.modes = [] + self.display_modes = [] + for k, v in modes_info.items(): + self.modes.append(k) + self.display_modes.append(v) + + def rowCount(self, parent: QtCore.QModelIndex = ...): + return len(self.modes) + + def data(self, index: QtCore.QModelIndex, role: int = ...): + row = index.row() + + if role == QtCore.Qt.ItemDataRole.DisplayRole: + return self.display_modes[row] + if role == QtCore.Qt.ItemDataRole.UserRole: + return self.modes[row] + + +class GbxExtension(QtWidgets.QGroupBox): + + def __init__(self, extension_info: dict, parent=None): + super().__init__(parent) + self.vly_m = QtWidgets.QVBoxLayout() + self.setLayout(self.vly_m) + self.setTitle(extension_info["name"]) + self.setCheckable(True) + self.setChecked(extension_info["enabled"]) + + self.lb_desc = QtWidgets.QLabel(extension_info["description"], self) + self.vly_m.addWidget(self.lb_desc) + + self.lb_modes = QtWidgets.QLabel("安装模式:", self) + self.cmbx_modes = QtWidgets.QComboBox(self) + modes_model = ExtensionModesListModel(extension_info["modes"], self) + self.cmbx_modes.setModel(modes_model) + self.cmbx_modes.setCurrentIndex(modes_model.modes.index(extension_info["default_mode"])) + self.lb_update_url = QtWidgets.QLabel("更新链接:", self) + self.lne_update_url = QtWidgets.QLineEdit(extension_info["update_url"], self) + + self.hly_modes = QtWidgets.QHBoxLayout() + self.vly_m.addLayout(self.hly_modes) + self.hly_modes.addWidget(self.lb_modes) + self.hly_modes.addWidget(self.cmbx_modes) + self.hly_modes.addStretch(1) + self.hly_update_url = QtWidgets.QHBoxLayout() + self.vly_m.addLayout(self.hly_update_url) + self.hly_update_url.addWidget(self.lb_update_url) + self.hly_update_url.addWidget(self.lne_update_url) + + self.id = extension_info["id"] diff --git a/gbx_search_engine.py b/gbx_search_engine.py new file mode 100644 index 0000000..b1a954f --- /dev/null +++ b/gbx_search_engine.py @@ -0,0 +1,34 @@ +# coding: utf8 +from PySide6 import QtWidgets + + +class GbxSearchEngine(QtWidgets.QGroupBox): + + def __init__(self, search_engines_info: dict, parent=None): + super().__init__(parent) + self.vly_m = QtWidgets.QVBoxLayout() + self.setLayout(self.vly_m) + self.setTitle(f'搜索引擎:{search_engines_info["number"]}') + self.setCheckable(True) + self.setChecked(search_engines_info["enabled"]) + + self.gly_info = QtWidgets.QGridLayout() + self.vly_m.addLayout(self.gly_info) + + self.lb_name = QtWidgets.QLabel("名称:", self) + self.lne_name = QtWidgets.QLineEdit(search_engines_info["name"], self) + self.lb_keyword = QtWidgets.QLabel("关键词:", self) + self.lne_keyword = QtWidgets.QLineEdit(search_engines_info["keyword"], self) + self.lb_search_url = QtWidgets.QLabel("搜索链接:", self) + self.lne_search_url = QtWidgets.QLineEdit(search_engines_info["search_url"], self) + self.lne_search_url.setCursorPosition(0) + self.gly_info.addWidget(self.lb_name, 0, 0) + self.gly_info.addWidget(self.lne_name, 0, 1) + self.gly_info.addWidget(self.lb_keyword, 1, 0) + self.gly_info.addWidget(self.lne_keyword, 1, 1) + self.gly_info.addWidget(self.lb_search_url, 2, 0) + self.gly_info.addWidget(self.lne_search_url, 2, 1) + + self.rbn_default = QtWidgets.QRadioButton("设为默认", self) + self.vly_m.addWidget(self.rbn_default) + self.rbn_default.setChecked(search_engines_info["is_default"]) diff --git a/gbx_setting.py b/gbx_setting.py new file mode 100644 index 0000000..dddf0a9 --- /dev/null +++ b/gbx_setting.py @@ -0,0 +1,33 @@ +# coding: utf8 +from PySide6 import QtWidgets, QtCore, QtGui + + +class GbxSetting(QtWidgets.QGroupBox): + + def __init__(self, setting_info: dict, parent=None): + super().__init__(parent) + self.vly_m = QtWidgets.QVBoxLayout() + self.setLayout(self.vly_m) + self.setTitle(setting_info["display_name"]) + self.setCheckable(True) + self.setChecked(setting_info["enabled"]) + + self.bgp_radios = QtWidgets.QButtonGroup(self) + self.bgp_radios.setExclusive(True) + + for i, name in setting_info["values"].items(): + value = int(i) + rbn_1 = QtWidgets.QRadioButton(name, self) + self.bgp_radios.addButton(rbn_1, id=value) + self.vly_m.addWidget(rbn_1) + if setting_info["default_value"] == value: + rbn_1.setChecked(True) + + self.allow_recommend = setting_info["allow_recommend"] + if self.allow_recommend: + self.cbx_recommend = QtWidgets.QCheckBox("设置为推荐", self) + self.vly_m.addWidget(self.cbx_recommend) + self.cbx_recommend.setChecked(True) + self.cbx_recommend.setLayoutDirection(QtCore.Qt.LayoutDirection.RightToLeft) + + self.name = setting_info["name"] diff --git a/images/browsers/brave_32.png b/images/browsers/brave_32.png new file mode 100644 index 0000000..551243e Binary files /dev/null and b/images/browsers/brave_32.png differ diff --git a/images/browsers/chrome_32.png b/images/browsers/chrome_32.png new file mode 100644 index 0000000..f00d8a8 Binary files /dev/null and b/images/browsers/chrome_32.png differ diff --git a/images/browsers/edge_32.png b/images/browsers/edge_32.png new file mode 100644 index 0000000..f8507c4 Binary files /dev/null and b/images/browsers/edge_32.png differ diff --git a/images/policies_gen_128.png b/images/policies_gen_128.png new file mode 100644 index 0000000..3b5d0e4 Binary files /dev/null and b/images/policies_gen_128.png differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..7a3e47d --- /dev/null +++ b/main.py @@ -0,0 +1,19 @@ +# coding: utf8 +import sys +from PySide6 import QtWidgets +from mw_policies_gen import MwPoliciesGen + +import rc_policies_gen + +version = (0, 1, 0, 20240627) + + +def main(): + app = QtWidgets.QApplication(sys.argv) + win = MwPoliciesGen(version) + win.show() + return app.exec() + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/mw_policies_gen.py b/mw_policies_gen.py new file mode 100644 index 0000000..96840e3 --- /dev/null +++ b/mw_policies_gen.py @@ -0,0 +1,166 @@ +# coding: utf8 +import sys +from PySide6 import QtWidgets, QtCore, QtGui + +from wg_browser_page import WgBrowserPage + + +class BrowsersListModel(QtCore.QAbstractListModel): + + def __init__(self, parent=None): + super().__init__(parent) + self.browsers = ["Chrome", "Edge", "Brave"] + self.browser_vars = ["chrome", "edge", "brave"] + self.icons = [ + QtGui.QIcon(":/images/browsers/chrome_32.png"), + QtGui.QIcon(":/images/browsers/edge_32.png"), + QtGui.QIcon(":/images/browsers/brave_32.png"), + ] + + def rowCount(self, parent: QtCore.QModelIndex = ...): + return len(self.browsers) + + def data(self, index: QtCore.QModelIndex, role: int = ...): + row = index.row() + + if role == QtCore.Qt.ItemDataRole.DisplayRole: + return self.browsers[row] + if role == QtCore.Qt.ItemDataRole.DecorationRole: + return self.icons[row] + if role == QtCore.Qt.ItemDataRole.UserRole: + return self.browser_vars[row] + + +class AppStyleListModel(QtCore.QAbstractListModel): + + def __init__(self, parent=None): + super().__init__(parent) + if sys.platform == "win32": + self.styles = ["fusion", "windowsvista", "windows11", "windows"] + elif sys.platform == "darwin": + self.styles = ["fusion", "macos", "windows"] + else: + self.styles = [] + + def rowCount(self, parent: QtCore.QModelIndex = ...): + return len(self.styles) + + def data(self, index: QtCore.QModelIndex, role: int = ...): + row = index.row() + + if role == QtCore.Qt.ItemDataRole.DisplayRole: + return self.styles[row] + + +class UiMwPoliciesGen(object): + + def __init__(self, window: QtWidgets.QWidget): + self.vly_m = QtWidgets.QVBoxLayout() + window.setLayout(self.vly_m) + + self.hly_top = QtWidgets.QHBoxLayout() + self.vly_m.addLayout(self.hly_top) + + self.cmbx_browsers = QtWidgets.QComboBox(window) + self.hly_top.addWidget(self.cmbx_browsers) + + self.vln_1 = QtWidgets.QFrame(window) + self.vln_1.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.vln_1.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.hly_top.addWidget(self.vln_1) + + self.pbn_export = QtWidgets.QPushButton("导出", window) + self.hly_top.addWidget(self.pbn_export) + self.pbn_about = QtWidgets.QPushButton("关于", window) + self.hly_top.addWidget(self.pbn_about) + + self.hly_top.addStretch(1) + self.lb_styles = QtWidgets.QLabel("主题:", window) + self.hly_top.addWidget(self.lb_styles) + self.cmbx_styles = QtWidgets.QComboBox(window) + self.hly_top.addWidget(self.cmbx_styles) + + self.sw_policies = QtWidgets.QStackedWidget(window) + self.vly_m.addWidget(self.sw_policies) + + # ============== Stacks =========================== + + self.sa_chrome_page = QtWidgets.QScrollArea(self.sw_policies) + self.sa_edge_page = QtWidgets.QScrollArea(self.sw_policies) + self.sa_brave_page = QtWidgets.QScrollArea(self.sw_policies) + + self.sw_policies.addWidget(self.sa_chrome_page) + self.sw_policies.addWidget(self.sa_edge_page) + self.sw_policies.addWidget(self.sa_brave_page) + + # =============== Page ====================== + + self.wg_chrome_page = WgBrowserPage("chrome", + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Google\\Chrome", + self.sa_chrome_page) + self.sa_chrome_page.setWidget(self.wg_chrome_page) + self.sa_chrome_page.setWidgetResizable(True) + + self.wg_edge_page = WgBrowserPage("edge", + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Edge", + self.sa_edge_page) + self.sa_edge_page.setWidget(self.wg_edge_page) + self.sa_edge_page.setWidgetResizable(True) + + self.wg_brave_page = WgBrowserPage("brave", + "HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\BraveSoftware\\Brave", + self.sa_brave_page) + self.sa_brave_page.setWidget(self.wg_brave_page) + self.sa_brave_page.setWidgetResizable(True) + + +class MwPoliciesGen(QtWidgets.QWidget): + + def __init__(self, version: tuple[int, ...], parent=None): + super().__init__(parent) + self.ui = UiMwPoliciesGen(self) + self.setWindowTitle("浏览器策略生成器") + self.setWindowIcon(QtGui.QIcon(":/images/policies_gen_128.png")) + + self.version = version + + self.ui.cmbx_browsers.setModel(BrowsersListModel(self)) + self.ui.cmbx_browsers.currentIndexChanged.connect(self.ui.sw_policies.setCurrentIndex) + + self.ui.cmbx_styles.setModel(AppStyleListModel(self)) + self.ui.cmbx_styles.currentIndexChanged.connect(self.on_cmbx_styles_current_index_changed) + # 手动触发 + self.on_cmbx_styles_current_index_changed(0) + self.ui.pbn_export.clicked.connect(self.on_pbn_export_clicked) + self.ui.pbn_about.clicked.connect(self.on_pbn_about_clicked) + + def on_cmbx_styles_current_index_changed(self, index: int): + model = self.ui.cmbx_styles.model() + idx = model.index(index, 0) + style = model.data(idx, QtCore.Qt.ItemDataRole.DisplayRole) + QtWidgets.QApplication.setStyle(style) + + def sizeHint(self): + return QtCore.QSize(800, 600) + + def on_pbn_export_clicked(self): + reg_text = ["Windows Registry Editor Version 5.00"] + pages = [self.ui.wg_chrome_page, self.ui.wg_edge_page, self.ui.wg_brave_page] + for page in pages: + reg_text.append(page.get_recommended_settings()) + reg_text.append(page.get_settings()) + reg_text.append(page.get_extensions()) + reg_text.append(page.get_search_engines()) + + filename, _ = QtWidgets.QFileDialog.getSaveFileName(self, "保存", "..", "注册表文件(*.reg);;所有文件(*)") + if len(filename) == 0: + return + + with open(filename, "w", encoding="utf-8") as f: + f.write("\n\n".join(reg_text)) + QtWidgets.QMessageBox.information(self, "信息", "已导出注册表文件。") + + def on_pbn_about_clicked(self): + ver = f"{self.version[0]}.{self.version[1]}.{self.version[2]}" + msg = f"一个用于生成以 Chromium 为内核的浏览器策略的注册表文件的工具。\n\n版本:{ver},{self.version[-1]}" + QtWidgets.QMessageBox.about(self, "关于", msg) diff --git a/policies_gen.qrc b/policies_gen.qrc new file mode 100644 index 0000000..95621d6 --- /dev/null +++ b/policies_gen.qrc @@ -0,0 +1,8 @@ + + + images/browsers/chrome_32.png + images/browsers/edge_32.png + images/browsers/brave_32.png + images/policies_gen_128.png + + \ No newline at end of file diff --git a/policies_gen_128.ico b/policies_gen_128.ico new file mode 100644 index 0000000..5567485 Binary files /dev/null and b/policies_gen_128.ico differ diff --git a/rc_policies_gen.py b/rc_policies_gen.py new file mode 100644 index 0000000..7464ac0 --- /dev/null +++ b/rc_policies_gen.py @@ -0,0 +1,935 @@ +# Resource object code (Python 3) +# Created by: object code +# Created by: The Resource Compiler for Qt version 6.7.2 +# WARNING! All changes made in this file will be lost! + +from PySide6 import QtCore + +qt_resource_data = b"\ +\x00\x00$\x86\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3>a\xcb\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00 \ +\x00IDATx\x9c\xed\x9dwx\x15U\xfa\xc7?\ +g\x82@\x0a\x09\x97\x16\x8a\xa4\xd0Q \xc1\x05T \ +\x01\x14\x90\x1a\x05\x16WA`]\x7f\x16\x10\xd4\xd5]\ +V@\x10\x95\xa6\xee\xae\xae(\xd8p]\xaa\x05\x15!\ +\x04D\x90\x12\x14\x05\x95\x04\x02\x02\x814\xa4$\x10\xd3\ +\x0b\x089\xbf?\xa6\xdc\x99[\x92\x9b\x90\x84\xa0\xf9>\ +O\x9e\xc9\xdcy\xe7\x94\xf7\xbc\xe7{\xdeSGP\x15\ +\x1886\xc0\xeb:\xaf1\x0a\xa2+\x82@\x10\x81\x08\ +\x02\x11\x22P \x9a \x84*\xa7\xa8W!\x14$ \ +\x840\xae\xe6\xe7\xaa\xbc\xb0<7\xe4\x84\xfe\x1c\x10\x8a\ +&\xee g\x09\xc7\x85\x9c\xe2\x10\xaf\x16\x9f./\x84\ +@\x0a\x17\xe9\xd3\xc2AK\x87\xcb\xf4\x99\xc2\xb1\xe7\xd7\ +QN1\x9eK\xc9y\x04\xe9@\xba\x22\x94\xb3\x12\xd2\ +\x81\x84\xbc\xcb%\x9f\xf0\xe2\xd39\x15)\x8e\xd2 *\ +-\xa4;\xc66\xf2\x92\xe2.!\xc4\x1fA\x0cT\x14\ +q\x9d\x91Ia\xca\xa4\xb0\x16\x86U\xb9\xc2\xa1\x10L\ +r\x8aYi\xcer\xd6\xe7n\xe2s*$\x87pL\ +\xc6d\x0e\xc7\xbdQZ\xc3qml.\x8c\x5c8\x1a\ +\x9b~\x15n\x8dM\x22~\x15\x82\xadR\xc8\x8f\x85\xe2\ +\xf5y\xee\xdc'\x7f\xf1\xb8lJ\xc1\x95\x1b\xc0\xc01\ +\xdd\xeb\x08\xaf\xe7\x84`\xa4ke\x0b\xa7\xcc\xd42\x80\ +{\x060\xa7\xd3\xa5\xb1j\xf9\x95\xc8\xf5\x97\x85x\xa1\ +p\xee\x93\xdf{RL\xeePq\x03\xe8?\xb6\x9d\x97\ +\x97\x5c(\x14\xc6\x08\xa1\x08\x975\x1b\xb3\xf2j\x19\xe0\ +J\x18\xc0IN\x11\x94\x80T\x84X[\x22/?\x93\ +7\xf7\xa9c\xa5\x15\x97;\x94\xdf\x00\x22F\xb7\xf0\xba\ +N<\x87\x90\xf7+\x8aW\x1d\xb7\x89\xace\x80*e\ +\x00K~\xe0\x92\x84\xf7.S\xe7\xb9\xc2\xb9\xd3N\xbb\ +,77(\x97\x01x\xf5\x1f5Bx)\xab\x00\x7f\ +\xabr\x85S\xa2j\x19\xa0\xea\x19\xc0\xc9\xd8$\xb9%\ +\x8a\x1c\x9f7\xfb\x89h7E\xe8\x04\xc5C9Q\xa7\ +\xff]s\x11\xacGJ\x7f\x00\x89T#\x97\x9a\x84\xfe\ +\x8fvU\x9f\xa3&\x0e\x81tx\x8e\x94 49\x84\ +~k\x95\x13jH\x08\xfd\xd6\x85\x9c\xf1\x5c\x8d\xc9.\ +\xa7\xa5\xc3\x1c\x0e\x8er\xf6\xe7\x12\x87\xf4K49\xa9\ +\xcaY\xe2\xd1\x05\xec\xf97\xf2k\x8e\xd7\x88VX\xe2\ +1\xa7_O\x0f\xc6\xc5\xfe\xbbUN\x0d\x07\xedb~\ +\xdf\x9e\x0f\xe1\x0f\xcaz\xffy\xaf\xcdAJ\x8f*w\ +\xd9B7\x0f\xf5\xf7\xf2\xae\xb7J(\xca\x08pG\xaf\ +\xb5\x0cP#\x18\xc0$'\x85\x12\x9d{\xa9d)\xbfd\xb3\xf7\xe4i\ +\xcd\x07\xb0\xeb\xcb~\xb5\x1a\x954\x95\x87]\xce\xc4\xc8\ +\xf6\x82\x19\x1ap]\x93\x059\xf0t\xa9I5\xc3\xab\ +o\xd4X\xe1%>R\xe9\xc6\xda\x96V\xc4\x07\x10\x8a\ + \xb2\xeb\x0d\x8c\xee\xd3\x8b\xd1}z\xd2\xaca\x80k\ +\xc5\xfd\xce\x91\x9eW\xc0\xfaCG\xf9\xe4\xe0\x11\xbeM\ +;E\x89\x13\xe3\xe8\xd7\xb2}\x00\x14k3\x87\xe0\x9e\ +\x9c\x19\x8f~\xe8\x18\xa7\xb3\x01DD\xf5\xf1\x12|\x89\ +\x10\xde\xa5:\x22\x1e\xf8\x00>\xf5\xea\xf1\xc8\x88\xc1<\ +>j(-\x1a\xd9\xae@5\xbf?\x9c\xca\xc9c\xe9\ +\x9e\x1fx\xe7\xbb\xfd\x14_\xba\x5c!\x1f\xc0*'\x8b\ +\x84\xf0\xea\x93=c\xf2~s\xef<\xf9\x08s&\x8c\ +\xa5\xeeun;\x16\xb5\xb8B\xd4\xad\xe3E\xd4\x0d\xed\ +i\xd3\xb8![\x12\x93\xb9\xac\x8d\x06\x96\x87\x01\x80\x16\ +\xde\xdf\xec\x8f+\xde\x1a}\x04\x0c\x06\x18\xeb\x85\xa2\xcc\ +6\x02+\x07\x03\xdc\xd4>\x94\xef\x97\xbe\xc4\xb8\xdb#\ +\xaa2\xef\xb50\xe1O\xdd:\xb3\xf3\xa1\xf1tj\xda\ +\xa8\xdc\x0c\xa0\x96o\x89\xc1\x02\xaa\x01\xdcZ\xdc\x1eh\ +\xa3\xbek\x1f$\xd1\xfb\xa3\xe8\x81b\x1a\x83F\xa2(\ +\x0a/\xdc\x7f/m[6\xaf\xfa\x5c\xd7\xc2\x82\xce\xcd\ +\x1a3oP$X\xe6\x0c\xf4.\x9fp./\x93\x9c\ +\x10\xe2\xa6\x06\x0b\xdf\xee\x08\x9a\x01(\xca\xe5\xbb,\x96\ +\xe2!\x03\xbc\xfc\xf0D\x06\xf7\x08\xaf\x86\xec\xd6\xc2\x15\ +\x06\xb5\x0fa\xee\xc0\xbe\xe5f\x00\xa4\xc4\xcb\x8b!\xa0\ +\x19\x80\x10\xe2.\x8b\xa5x\xc0\x00\x0f\x8e\x18\xc4c\xa3\ +\x87WC6kQ\x1a\x9e\xe8\xd3\x83\xd17\xb4/\x17\ +\x03 \x04%\x94\x0c\x01\x10\xdc<\xd4_\xa9\xa3d+\ +\x8a\x22\x5cO\xb48\x8f\x034m\x18\xc0\x89\xd5K\xa9\ +_\xb7nu\xe6\xb5\x16n\x90S|\x81\x9eKV\x90\ +QPX\xfa8\x00vF\x90\x88\x8b\x0a\xa2\x99\xe2\xe5\ +\xa5\x0c\x13B\x88\xf20\xc0?\xc6\x8d\xae-\xfc\x1a\x84\ +\x80\xfa\xf5\xf8k\x9f\x1e\x94\x87\x01\x10\xd4\xbd\x8c\x18\xaa\ +H\xc4-\xea;\x9e\xf9\x00\xa1-\x02yh\xc4\xa0j\ +\xcb\x5c-<\xc3\xfd\x7f\xe8B3_o\x8f}\x00\x01\ +(J\xc9-\x0a\x944W\xdf\xf1\x8c\x01\x9e\x990\xb6\ +\xb6\xf6\xd7@\xd4\xafS\x87\x19\xfdn\xf1\x98\x01$ \ +\x11\xcd\x15\xa1(\xcd\xd5w\xcaf\x80\x06>\xde\xdcs\ +[\xdf\xea\xccW-\xca\x81\xf1\xe1\x9d\x09\xa8W\xd7c\ +\x06@\xca\x86\x8a\x94\x9e3\xc0\xd0\x9bo\xa2\xeeu\xd7\ +Uk\xa6j\xe19\xeazy1\xb0m\xb0\xc7\x0c \ +\xa0\xb9\x02JC\xf0\x8c\x01\xee\xecss\xf5\xe6\xa8\x16\ +\xe5\xc6\xc0v\xc1\x1e3\x80D4W\xa0\xa4!\x94\xcd\ +\x00\xd7yy1\xa4W\xf7j\xceN-\xca\x8b\x01\xa1\ +\xad=f\x00\x84l\xa8\x08\xa1\xd4\x83\xb2\x19\xa0e\x93\ +F\xf8\xfb\xfaTonjQn\xb4h\xe0G\x90\xbf\ +\x9fg>\x00\xa2\xae\xe2\xd2R\x5c0@H`\xd3\xea\ +\xccG-\xae\x00A\xb6\x00\xcf\x18\x00P\x5cZ\x8a\x0b\ +\x06\x08n\x11X}9\xb8B\xec\x9b\xc1\xfc\x0f\xd6!\ +\x81eO<\x04@\x5cR*\x0f\xbe\xfe\x1e\x07\xd3~\ +\xe6\x8b\xb9\x7f\xc7\xe6\xe7\xcb\xe7{\xf7\xb3d\xf3W\xda\ +J&\x8c=\x14\x80y\x1e\x9c\x7f\xac\xf9\x8cnA\xad\ +\x08\x0f\xbe\x9e\x97\xef\xb9\x8b{\x96\xbc\xcf\xca=?\xf0\ +\xc1\x94I\x844iDPc\x1b\xd3\xd7F\x13\xd2\xb8\ +\x11Sn\xeb\x83\xcd\xc7\xfbjd\xfb\x8a\xd0\xcc\xcf\xc7\ +y\x1f\x87y\xff\x80\xa2\x94\x9f\x01\x0a/\x5c\xac\xd6L\ +d\xe5\x15\xf0\xc2\xeaO\xb9\xf9\x89\xd9H\xa4Q\xf8\xcb\ +\xb7\xc52x\xce\x8b\x1cL\xfd\x99\xfb\xfa\xf5\xa6_\x97\ +Nd\xe5\x17\xf0\xf0\xd2\xff\x99\xbb\xbf.\x19\x00 \xa7\ +\xa8\x98G\x96\xad\x01 \xea\xa6\xaeDth\xcb\xc1\x93\ +\xa7\xe8\xfd\xc2\xab\xec\x80\xbdjU-\x9ezk9\x83g\xcc'-\ +#\x93.\xa1A\xfc\xeb\xa1\x09\x00\xfco\xeb.\x1eZ\ +\xfc\xaef\xc9\x92\x09\x03\xfa\x10\x12\xd8\x94\x94\xf4\xf3\xbc\ +\x11\xb3\xcd\x9e\xee2\x18@o\x1f\x16~\xbe\x05\x80~\ +\x9d\xda\xd1\xb7C\xa8\xf1\xc2\xe4\xe5kY\x1f\x97\x80\xcd\ +\xd7\x9bMO\ +\x10\x80\xc5\x1b\xbfD\xdf+\xe7)\x03\x80 5\xf3\x17\ +V\xec\xde\x0b\xc0\xa3\xb7G\x1a/H)yd\xf9Z\ +\xe2O\x9e\xc6\xe6\xe3\xcd\x07\x0f\x8d7^[\xb0y;\ +\xf7\xbc\xbb\x86\xac\xc2\xa2*\xd5E\xa5\xe0Zb\x80\xb8\ +\xe3\xc9\x0c\x9a\xfe<\x07\x92R\x8d\xdd\xb1\xcb\xfe\xfa\x08\ +\xa1\xcd\x9b\x91|6\x83\xbb\x17\xfe\xc7\xa8\xb9B\x08\xba\ +\x04_Ox\x9b`\xb2\xf2\x0bX\xb9s\x0f\xfa:\xf9\ +\xf20\x80@0\x7f\xfd\x17\x00D\xdd\xd4\x85\xd6\xda\xd6\ +5!\x049E\xc5\x0c{\xf5]\xb2\x0a\x8b\x08k\xdd\ +\x92\x19C\x06\x18\x8e\xe5\xc6\x84#\x0c\x7f\xe3\x7f5\xdf\ +\x08\xae\x15\x06\xd8\x7f<\x99A\x7f\x7f\x8e\xf8\xa4T5\ +\x1a$#o\xf9\x03w\xf6\xee\x09\xc0\xd8\xf9\xaf\x92S\ +Pd\xd4\x5c)%\x13\xb5)\xe9\x0d{\xf7\x93SP\ +X!\x06\x90HNff\xb3\xf3\xc8q\x00\xee\xeb\xfd\ +\x07\x8b\x1e\xb2\x0b\x8b\x98\xbcb-\x00\xb3\x86\xdfN\x9f\ +\xb6!Z>\xfcSk\xf7\x9f_\xf5\x09\x07\ +SN\xa2Uq#=\x13\x06\xf4\x01`\xfd\xde\xfd\xe8\ +\xd6Z\x11\x06\x90HV~\xbd\x0f\x80\xfb4\x833\xeb\ +!\xfa\xc0O\xac\xd8\xa3\x8e=\xbc8f\xa89\x19$\ +\x9cIg\xdc{\x1f\xd5\x5c&\xa8\xe9\x0c\x90\x95\x97\xcf\ +\xd8g_\x22[\x1bt\xd1C\x9fv\xd7P\x83\xfa_\ +_\xff\x05\xf63t\xd4\xeb\xf0\x9e\xe1\xd8\xfc|\xc9\xca\ +/ \xfa\xfb8tk\xad\x08\x03\x08\x04\xd1q\x09\x00\ +\x844iD\xebF\x0d-z\x00\xf8\xc7'1jS\ +p}K\xc6\xf5\x0a\xc7\x9e\x1cIZv\x0e\xc3\x97.\ +\xaf\x99FP\xd3\x19`\xd0\xdf\x9e%5\xfd\x1c\xe6\x0a\ +\xeb\xef\xe3\xcd\xb4\xbb\x86\x020o\xf5\xa7Z\xd7N\xab\ +r\xda\xb5_\x97N\x80J\xff\x9aI_\x11\x03\xe4\x16\ +]0\x9a\x81\x91\xe17Z\xf4\x00\x90[\x5c\xcc\x82\x98\ +\xaf\x00\x989\xd4\xee\x0b\x08-\xde\x83g2\x98\xfc\xe1\ +\x86J\xd5M\xa5\xa0&3\xc0___F\xfc\xf1\x14\ +5X\xed7\x09<6j\x18\xb6\x06~$\x9f\xcd`\ +\xc5\xb6]\x96\x1d/z\xd5\x8b\xd4\x0c`g\xc2\x11\xbd\ +j_\x11\x03H$\xd1q\x87\x00\x88\xe8\xd0\xd6\x89\x01\ +\xa4\x84\xa5;\xf7\x90\x92\x99EHc\x1b\xf7\xf6\x083\ +\xe2\xd3\xe3\xdfx\xf8\x18\xf3\xbf\xd8Yi\xfa\xa9\x14x\ +\xc8\x00upa!\xf6\x9a\xa4\x1e;\xa2\x09TZ\xda\ +^\x99\xfa\x00\x8f\x8d\x19Aj\xfa9\xb2\xf3\x0b8\xa0\ +9\x80z\xed_\xbf\xe7{\x82\x9b6!\xf5\xfc/&\ +\x06P\x08j\xda\x88\xf06\xc1\x00D\xef\x8bS\x0bY\ +\xd1\x18@\xd1\xd2\xad\xefw.\x93\x01\x14\xcd\x08\x14b\ +\x8f\x9d\x00 \xaa{\x17kM\xd1\xc4\xbb\xb4lN\xf4\ +\x81\x9f\x98:\xa073\x87\x0e \xb8\xb1\x0d\x84 B\ +s\x0c\x83l\x0d\x09i|u\x86\xca\xdd\xc2U\xb9b\ +b\x00\xed\xde\xe3\xb9\x80\xca\xf6\x01B[\x04\x12\xaaM\ +1\xdf\xd5\xd7\xba\xd4\xec\xf1Q\xc3x|\xd40\xa7w\ +\xe24C\x01\xf8p\xfa\xa3\xf6BE\xf5\xda\x0f\xa4\x9e\ +\xc4(y\xd3\xb3Yw\x0dQw\xcd\x22@@D\xa7\ +\xf6N2:\xbe\x9e9\x8d\xb0\xa0Vn\xd3\x1d\xd2\xd8\ +\xc6\xac\xa1\x03\xca\xcc\xdfU\x87\x87s\x01\xd5\xca\x00\xcf\ +\xfdw\x0d\xf3V|L\x80\xaf\x0f\xe1\x1d\xda\x10\xe0\xeb\ +Kx\xbbP\x10\x82\xd9\x13\xc6\x02\x10w<\x85\xe0\xc0\ +&\xd8\x1a\xf89\xbd\xaf\xd7~\x80\xfe];;=\xbf\ +\xd3\xcd\x92\xb5g\xc6x\xbe\x85\xcd]\xe1\xa7df\x01\ +\xaa\x01\xa4df\xb1\xfa\xfbx@\x10\x9b\x94\x0a\x08\x12\ +\xce\xa4\x93]|\x81E#\x07\xf1hD/\x8f\xe3\xab\ +2\xd44\x06\xc8\xca\xcbg\xf1'\xd1H)\xc9)(\ +dg\xdc!\x10B\xa5\xfb\xc0\xa6\x86\x01\x8c}\xe1_\ +\xa4\x9e\xcb\x04\x01\xfa\xf9\x03amCh\xe8\xeb\xc3\xcb\ +\xff7\x9e\xf06\xc1\xbc\xf0\xc1:v\x1d:J\xbf\xae\ +\x9d@\xab\xd5\x96\xab\xa6\x00\xbd\xe0\xe7\x7f\x1aca\x00\ +\xc7wb\x8f&1\xbew\x0f&\xf4\xe9\xc9\xce\xa3'\ +X\xb8q\x1b\xd9E\xc5$\x9c>\xabz\x0a\xda18\ +][\xb7`\xcf\xf4)\x844\xb6\xf1\xfa\x8e=\xe4]\ +\xfcU\x8d\xcb\xd8\x86\xa5\xb0pk,\xe3\xfe\xd0\x0d\x9b\ +O\xfd+\xd2\xd7\x15\xa3\xa61\xc0S\xaf/#'\xbf\ +\x00a(\x0b}i2QZ\x1f<\xeex2i\x19\ +\xe7A\x08\xcc\xe7\xe9\x1dHN\x05\xa1\x10\xdc\xac\x09\xa0\ +:\x80\xbb\x7fJ$\xf6\xf01\xbb\xf2\xb5L\x19g\x16\ +)v\x03\x98\xf7\xd9&\xcb\xefj\xfc\x8a\xfd\x04S\xa1\ +\xf6@&\xf4\xe9IC\xef\xfa\xc4&&\x19\xbf\x9b]\ +\x87\x83?\x9f%\xfe\xe73\x84]\xdf\x82\x91];\xb3\ +\xfa\xfb\x03V\x1f\x04I\xee\x85\x8b,\xfdz\x1f3\x07\ +]\xe5\xf3\x12j\x12\x03$\x9fNg\xf9\xe6\xaf\xec\x16\ +\xa8\x19\x19\x9a\x11L\x1c\xdc\x1f\x80\xe5_\xee\xc48'\ +O\xf7\xd2\xa5j\x84\xfe\xde\xf5\xb1\xf9\xf9\x02\xb0\xfb\xf0\ +1{aK\xa9}iC\xda\x1dA\xcdo4t\x01\ +\x96|\xf8\xfb\xf8\xd0-\xa8\x95\x9a\x0e\xcd\x08\x02\xb4\x1a\ +\x1b\x16\xd4\x8a\xbe\xed\xd5\xc9!\xd5H\x85\xe9 ,H\ +\xfd%\x9b\xb0\xeb[0\xbeg\x18\xa9Y\xda\x07^o\x19\x893\x8f\xb0\x01D\x86\xdd\x08\xc0\xce\ +\x03\x87\xd5\xdf\xb5\x98\xad\xe7\xea\x0b\xc3\x0143@y\ +F\x02\xfbth\x0b\xc0\x81\xb4S\xe4\x14\x15[F\x02\ +\xedu\xdd}:\x1d\x06$]\xc7o\xe8\xcb\x9e\x10c\ +\x04\x0ek\xc2\x8cX\x8d\x9f]\x8f\xd8\xadIp{\xd0\ +w\xe9\xa8)s\x01\x07O\xa48\x8c\xac\xd9\x19\x00\xa0\ +\x7fx\x17\x00c4\xd08-\xdb\x81\x01\x82\xb5e\xe9\ +\x07RNb\x9c\x06\xae\xf3\xa7td.\x5c0\x80E\ +;F\xe1\x9b\x88\xd8I\x0f\xe6t\xea\xcd\x8a\xfd\xea\x22\ +~C_\xf6\x84\x185\x0fk\xc2\x9c\xe8\xdfE\x8dE\ +Jr\xf5\xaefy\xe1\xaa\x5cM\xe1\xea\xd1V)\x03\ +d\xe5\xe5\x13\x97\x98\xe4\x96\x01\xcc[\xcd\xcc\xeb\x01\xf4\ +\xab\x99\x01\xf4\xf8\xb3\xf3\x0b*\xc4\x00\xd6\xe4[\xe7\x02\ +j2\x03T\xd8\xf7\xaa\x09\x0c\x10\x9f\x98d\xb5<\xcb\ +U\x1d\xe0\x01\xd5\x01\xb4\xd7\x0f\xd7\x0c\xd0\xbf\xdb\x0d\xf6\ +\xf4\xfd\x8e\x18\xa0\xa2\xcc[#\x18`\xe7\xfe\x83V\xcb\ +\xb3\x5c\xed\xbb\x8dR\xcff\x98\xea\x87\x1b\x06\xd0\x90\x9a\ +q\xbe\x96\x01<\x81\x87\x0cP\xa5\xbd\x80\x943\xe9\xa5\ +2\x80\xbe\xdb\xc8\xba.\xc0u/@G\xda\xb9L\xbb\ +\x97.)G/\xc0\xa2\x1d\xcc\xb3\x81 \x991b0\ +\x11\x1d\xdb\xb0\xfbX2\x0bb\xb61s\xf8\xedDt\ +\x08%61\x99\x85\x9bw0\xfe\xe6p\xc6\xf7\xea\xce\ +\x81\xd3\xe9\xc4\x1eO\xe1\xd1~\xb7\x90\x9a\x95\xc3\xd3\xeb\ +\xb7\xd0\xb5esf\x0e\x8e$5+\x87\x19\xd1\xdb\x08\ +\xb2\x05\xb0h\xe4@r\x8a/\xb0t\xcf\x0fL\xee\xfd\ +\x07@\xb0h\xfb\x1e\x10\x82\xa7\x07\xdc\x8a\x00\x16\xee\xfa\ +\x8e\x939y,\x89\x1aD@\xfdz,\xda\xbd\x8fo\ +N\x9e\xb12\x80\xde\xab(/<\xec\x05T\xe98@\ +\xea\xd9s\xd6\xfe\xa7\xe5j\x92K?g\xaa\x87\xea\x7f\ +\x8e\xe3\x00F\xd1i\xf7\xe5\x1f\x07\xb0h\xc7(|\x89\ +dDX\x17\x9e\x89\x1a\x0c@\xbf\x8e\xed\x90\xc0\xac\x11\ +\xea\xaa\xe3\xc8\x0em\x09\xf0\xf1f\xaa\xb6\x0c-\xb2C\ +\x1b\xa6\xf6\xbf\xd5\x08)\xa7\xa8\x98\xf1=\xc3\xec;\x88\ +\x04D\xb4\x09&D\xdbI5\xf2\xc6\x0e\x86l\x90\xcd\ +\x9f\xb4\xec\x5cFvn\x07@\xd7\xe6M9\x90~\x9e\ +\x11\x9d\xd4\x1eJ\xd7\xc0&\x84\xbc\xb2\xcc\xae'E\xb9\ +2\x06p,WS\xb8\xd5\xc2\x00\xba\x0f\xe1\x96\x01L\ +\x1bN=e\x00{[[y\x0c\x10\xe00q\xf3\xcc\ +H\xeb)hz\xe1\xbb\xc2\xd4~\xb7X\xee'\xf4\x08\ +s+\x1b\xd6\x22\x900\xd3.\xeb`[\x00\xc16\xeb\ +\xd7S\x9c|\x80*f\x80*\xf5\x01v\xc5\x1f*\xdd\ +\x070m8-\xcd\x07\x88\xb8\xb1\x93]\xce\xdc\xd6V\ +\x92\x0f\xb01\xeep\xb9\xf2\xa5O\x0d{$\xfbK\xb6\ +\xc7\xb2\x1b\x8f%\xff\xb6|\x80K\xb1\x9e\xad\x95\x9b3\ +\xf1n\xe6L\xbc\xdb#\xd9\x0b\xeb\xde/w:\x0aW\ +,v\xf8\xc5\xca\x009EE\xac\xdf\x9f@T\xf7.\ +e\x86\x15\xff\xf3\x19V\xed\x8d\xe3\xa5\xd1C=\x8a\xfb\ +\xd1\xcf6\xb3\xf1\x81{<\x92\xddx,\xf9\xb7\xc5\x00\ +5\x17\xce\xbd\x80\x0d\xda\xea\xe0\xb2\xb0\xf2\xbb\xfdl\xf4\ +ptn\xc3\xa1c\xc4&\xa5\x11\x7f:\xbdL\xd9\xec\ +\xa2bb\x12\x7fc\x0cP\xa7\xef\x08\xd3<\xbd\xe3\x18\ +\xb9`\xcb?\x9f\xa3\x7fx\x17\x9e_\xfe\x11\xf3V}\ +\x02\xc2:\x16\xae_#\xbatb\xeb\xc2Y\x00\xd4\x1f\ +u\xbf\xf5K\xa4\xa5\xac\x07(Z\xb5\x04\x00\xef\x09\xd3\ +\x88\xe8\xdc\x8e-3\x1f\xd7\xb5\xe3\xd4\x0b\xd8\x18w\x98\ +\xac\x82Ble\x9c\x83\x14s\xe8(i\xbf\xe4\x18\xeb\ +\x02JC\xf4\xe1D\x84\x10\xac\xda\x9f@X\xcb\xd2O\ +X\xd9x,Y\xcd\xc7o\x89\x01\x22\xc3\xbb\x96\xea\x03\ +\xc4\x9fH1dK\xf3\x01b\x0f\xd9k\x5cU\xf8\x00\ +\xa0\xee\x0e\x8e\xd6&\xa4\xdcaWb\x12\xa9\x99\xd9 \ +\xe0\x0d\xd3\x09$\xae\x90UT\xcc\x9a\xfd\x09H)\xd9\ +\xf4\xd3\xf1Re\x016\x1e=a\xca_\xf51@\x15\ +\xcf\x05\x94\xde\x0b\xc8\xce/0$\xcd\xbd\x00\xfdZz\ +/\xc0\xc5H\x9c4%\xb3\xcc^\x80\xf3H\xe0\xaa=\ +?\x98\x85\x98\xbe\xd6\xfa\x11\xee\x95\xdf\xc5\x19]\xcc\x98\ +\x84\xa3\x96\x0d!+\xf7\xc5[\xee7\x1e>f\xa47\ +5;\x97]I\xf6cl\xe2\xcfd\x10m2\x8a\xd4\ +\xec\x1cb\x12SL\xf931@\x15\x8f\x04V\xe98\ +@p\x8b@v\xc5\x1f*s\x1c 8\xb0\xe9U\x1d\ +\x07\xd0\x9b\x81\xd8cI\xcc\xdf\xf0%\x11\x1d\xdb\x12{\ +,\x89%\xdb\xbf\x01\x04#\xc3n 61\x99\xd5\xfb\ +\xe2T\xad(j\x9b=\xee\xfd\x8f\x989\xb8\x9f1 \ +\xb4t\xf7>\x16E\x0d\x22-;\x97\x19\xd1\xdbL\xe9\ +\x15\xcc\xd8\xb4\x9d\x19\xb7\xa9\xdd\xc9E;\xbf%-;\ +\x0f!\x04\xfe\xf5\xeb1\xf3\xcbXK\xbf\xfd73\x0e\ +\x10\xd2\xbcY\xa9\x0c\x90zV]:\x15\x1c\xd8\xd4\xe3\ +q\x80\xe0fMH=\x9fY\xa9\xe3\x00Z@\x00,\ +\xdc\xb8\x8d\x051\xdb\xd0\xe7\xef\x97\xec\xf8\x86%;\xf7\ +h\xe9P\x0b_\x8fo\xf7\xf1T\x86%\xad\xd0~\x17\ +\x1c8\x93\xce\xf0wV\xabQ8\x9c\xd7\x9fp\xf6<\ +\xe3\xd7|\x8ey=\xc0\xb8\x8f\xa2\xd5p\xf5?\x87r\ +\xb8\xe6}\x80~\xddK\xf7\x01R\xd2\xcf\x01\xea\x90p\ +i>\x80\xb94\x83\x9a6\xae\x12\x1f@\x7f\xe1\xf76\ +\x17P\xa5>@X\xbb6\xa52\xc0\x01\xcd\x09\x0cm\ +\xde\xacL\x1f`\xc7\xc1\x9f\xec\xe9\xab\x22\x1f\xc0Q\x0f\ +\xe6l\xebDd\xbf\xba\x88\xdf\xd0\x97=!\xbf\xeb\xd9\ +@\x9b\xbf\x1f]\xdb\x04\xbbe\x80\x1c\xd3ql}\xb5\ +\x8d\x1ee\xad\x07\xa8e\x00\x0fQ\x13\x18\x00\xa0\xdfM\ +\xdd\xdc2\x00\xc0\x0e}{\xb66/\xe0\x8e\x01R3\ +\xce\xabr\xcd\x9a\xfc\xae\x18\xc0\xbf^\x05?\xceQ\x13\ +\x18\x00`\xe2\x90\xdb\xdc2\x00\xc0N\xad\xef\x1d\xa9-\ +\xf8p\xc7\x00\xba\x01\x04\xf8\xfaT\x88\x01b\xb5-\xe0\ +\xdd\x82Z\xe1\xef\xed}\xcd0\xc0\xbd]\xec\xb3\x89\xe5\ +\x82\x87\x0cP\xe5\xab\x82\xbbwhK\xeb\xc0\xa6\x9c\xd4\ +\xce\xea5\xd7,\x89\xdd\x0f\xe8\xa7-\x0eu\xd7\x0b\xd0\ +\x0f\x92\x08\x0b\x0d\xa2\xa2\xab\x82\x17o\xde\xce\xb4!\x03\ +\xf8\xe9\xe5\xd9\x1cH;\xa5\xc9\x98\x04\x859~\x9c\x9f\ +;\xe9A8=v\xd2\x93\x9b{\x01\xf6\xedj\xa6\xe0\ +\x1c\x03\x8c\x08v\xbfQ\xb5Tx\xd8\x0b\xa8\x96}\x01\ +\x8f\x8f\x8d\xe2\xa97\xde\xc3i\x1c@\xd8W\x03\x876\ +oFP\xb3&\xa4\x9d;\x8f\xa5\x8d\x96ja\xeb\x8b\ +F\x83\x9a5\xb1\xff^\xce}\x01\x0b>\xff\x02\xa1\x08\ +\xa6\x0e\xeeO\xbf\xce\xed+\x9c\x9fk\x02\xae\xca\xd5(\ +\xdfj\xde\x19\x14\xd5\xf7\x16\xfe\xb6\xe4\xbfFV\xe1\xbd\x819E\xc5\ +\xec:z\x1c\xf3&\x90\xe1\xda\xa2\x90\xf8\xb4S\xc4&\ +&\xa9\xb9\xd7\xbf\xa2n\x9a`Z:~\x14\x00+\xf7\ +\xc5\xb1[?\xaf\xc0\xb4;X\x0a\x981\xb0\x06|H\ +\xbb&1\x00\xc0cc\xa3x\xed\x93hr\x8b\x8a\x8d\ +\xe0\xf4\xb6v\xc3\x9e\xef\xf9\xf7\x94\xfb\x09o\x17Jp\ +\xb3\xa6\xa4\x9e\xcb4\x18 R?\x07@\xa8\x8e\xa0\xcd\ +\xcf\x97\xfbn\xebc\x1c\x15cv\xd3\x03|}\x08\x0b\ +i\xad\xdd\xdb\xe3\xde4c\x9aQ\x83ug\xd0\xea\xde\ +CD\xc7\xb6\x86|\xdf\xf6\xa1\x08\x04\xd9\xc5\xc5$h\ +S\xb9B\xc0\x8d-\x02\x09i\xac\x9e'\x18\x93p\xd4\ +\x99\x81\x90\x04\xd4\xf7fr\x9f\x1eW\xa4\xabJAM\ +b\x00\x00[\x03?\x1e\xfb\xe3H^X\xfe\x11am\ +C\x08h\xe0GX\xbbP\x1a\xfa\xf9\xd2P\xdb\xf5\x0b\ +\xb0\xe5\xc5\xd9\x84\x96q4\xfd\xa4\xdb\xcaW\xc3\xfa\xdd\ +`\xf7\xa4\xcbj\xfb\xc3\x82Z\xb9\xdd\x1c\xaaO\xf6d\ +\x15\x1619\xe2f\x10\x82\xb4\xaclR\xb3sI\xfb\ +%\x87\x9fs\xf2X8\xf2\xf6\x9aq\xc2xMc\x00\ +\x80g\xef\xbf\x97g\xef\xbf\xb7T\x19W\x85\x9f\x9c\x9e\ +AZF\xa6z\xb2\x88\xb6Kxq\xf4\x97\xda!\x91\ +\x0e\xe3\x14\xa6\xabq>\xc0\xa71\x86\xef\xe1J.\xc0\ +\xa7>S\x07F\x02\x10{,\x09\x09t\xbd\xbe\x85S\ +A\xea\xf76\x1f\xef\x9a\x7fLLMc\x00G\xecO\ +L\x22\xb7\xb0\x88\x94\xb3\x19\xa4e\x9cG\xa2\x1e\x12e\ +k\xe0\xc7\xf3+\xd72o\xcd\xa7\xe8'\x84\xe8\x8bI\ +\x02\x1a\xf8\x91\xa1-\xf2x\xfe\x83u\xe4\x15\x17\xa3\xb7\ +\xcd\x966[\x08\x8b\x01,\xf8lS\xa9\x1bA\xbb\xb6\ +n\xc5\xd4\x81\x91d\x15\x142\xe4_o9\x87\xa7\x08\ +\x96\x8e\x1f\xcd\x84[nR\x8f\x87\xd9\x17\x0f@\xb7V\ +\xcd\x09\xf0\xaeO\xebF\x0d\x8dU\xc05\x065\x91\x01\ +t\xfc\xf5\xf5e\xbc\xb1.\xc6RXz\xf8s&\x8c\ +e\xc2\xc0H\xe6\xaf\xf9\xcc\xd2\x0b@(\xe4\x14\x14\x10\ +\x97\x94Jx\x9b`\xfau\xe9\xa4\x9e\x14V\x09\xa7\x84\ +Evl\x03\xa8\xb5\xdfy\xee\x02\xfc\xeb\xd7cD7\ +\xd5\x17Y\xb8y;\xab\xf7\x1dp\xda\x1d\xbc\xe8\xceA\ +<\x1aQ\x83\xbe\xab\xe8!\x03\x5c\x955\x81\xafL}\ +\x80\xae\xa1*\x95\x9b\xc7\xc7\x16\xaf\xdbDV^>\xa1\ +\xcd\x9b1\xfe\xf6\xbe\x96\x91@\xbd\xdb\xb0+\xe1\x08\x00\ +#{u\xd7\xdd{<\x19\x09\xb4\xe6\xc3:\x17\x10\xd1\ +A]\xa7\x1f{\xec\x84\xcb\x91\xc0G\xfb\xf7\xc6\xe6\xe3\ +MJf\x16\xab\xf6\xc6\x1b\xf1\xe9\xf1\x0f\xbb\xb1C\xcd\ +*|\xa89s\x01\xee\xb0\xf5\xdf\xcf\xd3M\x9b(\x02\ +5\xbe\x9c\x82B\x16\xaf\xdb\x04\xc0\xecqch\xe0\xe3\ +mb\x00\xf5\xbaK[\x1e\x16\xd5\xab{9\xe7\x02\x1c\ +\x19@\xf3\xda\xbd\xbd\x89\xbaI]\x0d\x1c\x1d\x7f\xd8\xa2\ +\x07\x80\x00\xefzL\x19\xa0\xee\xcf_\xb0i;\xf6\xe4\ +\xa8\xf1vi\x19\xc8\x9b\x7f\x1aY\xa9\xba\xa9\x14\xb8*\ +WL\x0c\xa0\x89]\xb5U\xc1\xb6\x06~\xac}n:\ +\x0d|\xd4E\x98z\xe8\x8b?\xdfD\xf2\xd9\x0cB\x9b\ +7\xe3\xb1;\x8781\xc0\x86\xef~$%\xfd\x1c6\ +?_F\xf4\x0a\xbfb\x06\x18\x11\xae\x0eA\xc7\xa7\x9d\ +\x22-3\xcb\x89\x01\xde\xbco\x0c6\x1fo\xe2O\x9e\ +f\xf5\xbe8\xcb\x5c@\x97\x96\x81\xc4L\x9eX3\xbc\ +~G\xd4t\x06\x00\xf5\xb0\xc8m\xff\x9a\x8b\xbf\x8f\xb7\ +a\x91\xb9\x05E<\xf8\xca[\x00\xcc\x19?F;\x1a\ +\xc6\xce\x00B\x08\xd6\xef\xfd\x11\x80\xa8\x9e\xdd\xaf\x98\x01\ +\xee\xeb\xa3\x9eP\xb6R\xfbT\x8cY\x0f\xc3\xbbv&\ +J3\x90\xa7?\xdbdN\x06][5g\xcd\xfdw\ +\xd7\xcc\xc2\x87\x9a\xcf\x00:\xc2\xdb\x85\x92\xb8\xe2\x0d\x93\ +O \xd9u\xf0'\xd6}\xa3\x1e\xe3\xfe\xf1\xac'\xf0\ +\xf7\xf1\xb1\xd7\x5c)Y\xb9\xfd\x1b\x00&\xde\xd6\x17\x7f\ +\xef\xfa\x15f\x80\xa0\xc6\x8d\xe8\xd7Im\xff\xf5\x15\xc1\ +\xba\xdc\xf5\xb6\x00\xde\x9c\xa8\x0e\xe7\xce\xdf\xb8\x8d\xd8\xc4\ +\x14\x83\x88\xba\xb4\x0a$f\xca$cP\xa8F\xe2Z\ +`\x00\x1d\xb6\x06~l}y\x0e\x11];\x1b\xb3c\ +\x0f\xbd\xfa\xb6\xd1\x14|<\xf3q\x0b\x03\xc4\xa7\xa4\x19\ +\xc7\xc6N\x1b>\xb0\xc2\x0c0S\xdb\x10\xba\xfe\xc7\x83\ +\xa4ef\x1b\xf9\xf7\xaf_\x8f\x0f\x1f\x99`P\xff\xc2\ +\xcd\xf6\xb6\x7f|\xaf0b\x1e\xfds\xcd\xad\xf9:\xae\ +\x15\x06\xd0ak\xe0\xc7\xb6\x97\x9fe\xd6\xb8\xd1\x00d\ +\x17\x14p\xf7\xfcW\xc9\xca/\xa0\x7f\xb7\x1bx{\xda\ +\x03Fz\x04\x82\xc5\xd1_\x020u\xf8@\xfc}\xbc\ +\xcb\xcd\x00\xd77n\xc8\xc4\xbe\xea\x91\xaeK\xb6\xed6\ +^\x90R\xf2\xd6\xa4\xb1\x84\xb5nIVa\x11\xf7\xbc\ +\xbd\xcaxm\xd1\xa8!\xbc5~t\xcd/|\xb8\xb6\ +\x18\xc0\x8c9\x13\xc6\xb2e\xe1,\x82\x9b6!>9\ +\x8d\xbf\xbf\xab\x16\xc0\xa4\x81\x91\xbc=\xed/\xe8+o\ +V\xed\xdcc8\x83\xd3\x86\xdd^n\x06x\xe6\xce!\ +\x00\xec\xc4\ +\x84\xde\xeaD\xce?>\x8e&5\xf3\x17\x16\x8e\x1e\xc6\ +\xe6\xc7\xff\xaff\xb7\xf7\xaep\xad2\x80\x19s\xc6\x8f\ +!\xf1\xbdW\xf1\xf7\xf5\xe6\xc9wV\x020\xe9\xf6\x08\ +\xb6\xde\xbc\xf5\x80:\x1f\ +\xb1|\xf7^v\x1fM\xa2o\x87P\xf6\xcc\xfe+\xfd\ +:\xb6#\xab\xa0\x90\x07\xff\xf7\x11\xc1\x8dm\x1cza\ +:\xd3ns\x7f6@\x8dFe3@\xeeU\xfa\xa0\ +\xb2\xcd\xcf\x97\x7f?8\x81\xd9\xf7\x8e2\x96\x86\x87\xb7\ +\x09f\xcb\xf3\xd3\x99u\xf7H\xfe\xf6\xdf\x0f\xc8\xca/\ +\xa0\xdf\x8d\x1dy{\xf2\xa42\x19\xe0\xa5{G\x11\x1e\ +|=)\xe72Y\xb0~\x0b\x8b\xfe4\x92/\xfe>\ +\x85\x90&\x8d\x00H\xcb\xcc\xe2\x9dIw3k\xc4\xc0\ +k\xa3\xadw\x81\xcc\xc2\x22\x8f\x19\xc0\xe3\xb9\x80Tm\ +\x13\xc7\xd5\x82\xcd\xcf\xd7\xf2\x8d\x00\x9b\x9f/\xb3\xfft\ +\x17S\x87\x0f\x22\xf5\x5c&6?_&\xf6\xefM\xea\ +\xb9L\x16|\x1a\xe3\xc4\x00\x01>\xde\xbc4n\x0c\x13\ +\xb5!\xdb\x03'O\xb3\xe7\xd9'\x9dv\x03\x97\xf6\xb1\ +\x88k\x05\xe9\xf9\x85\xb8,W\x9c\xe7\x02<\x9e\x0d<\ +[\x8eS1\xaa\x136?_\xe3\x14q\x80\xd9cG\ +2\xb2g8\xafo\xfa\xca\xf8\xed\xbe\xbe\xbd\x985z\ +\x18!\xdag\xe6A\xfdp\xf4o\x15\xe9\x05\x85T\xfa\ +l\xe0\xd9,\xcf\x8f:\xb9\xda\x08\x0fi\xcd\xbb\x93'\ +\x19\xf7\xef<<\xe1*\xa6\xa6\xfa\x91\x91_\xe01\x03\ +x\xec\x03\xc4'&Uw>jQA\x1cL?_\ +\xf9\xbd\x80\xd4\x8c\xf3\x1c=y\xaa\xfarQ\x8b\x0a!\ +13\x8b\xb4\xec\x5c\xcf{\x01\xb2D\xa6\x83g\xe3\x00\ +_\xec\xdd_}9\xa9E\x85\xb0\xf5D*\xe6\x01\x91\ +R\x19@\x92\xa1 \xc4Y\xf0l\x1c`g\x19G\xa8\ +\xd4\xe2\xeac\xeb\x89TLN\x5c\xa9\x0c \x90g\x15\ +!\xe5Y\xf0\x8c\x01v\xc6%p\xa1\xa2\xc7\x97\xd7\xa2\ +\xcaq\xe1\xd2ev\xa5\xfc\xec9\x03\x08R\x14)\xf0\ +\x98\x01r\x0a\x0aY\xbee{\xb5f\xaa\x16\x9ecu\ +\xfca~\xbd\x5c\xe21\x03H\xc4Y\x05\x89\xc7\x0c\x00\ +\xf0\xdc\xfb\x1fR|\xf1b5f\xab\x16\x9e\xa0\xf8\xd2\ +%\xe6\xef\xf8N\xab\xd9\x9e1\x80\x90\x9cUJ\xa4\xf2\ +\xad\xfa\x8egs\x01\x19\xd99\xbc\xf6\xe9\xc6j\xcbX\ +-<\xc3\x9b\xdf\xc5q\xbe\xb0P-7\x0f\x19\x00\x88\ +S\xb8X\xb4]\x22/x\xca\x00RJ^\x5c\xf3\x19\ +9\x05\xf6#\xdejqu\x91{\xe1\x02\xff\x8c\xdd\x07\ +\x08\x8f\x19\xa0DrQH\xb6+\xfc\xb05G\xc0\x0e\ +O\x19@\x08AnA!S\xff\xf3n5f\xb1\x16\ +\xa5\xe1\xb1\x0d\xdb\xc8\xff\xf5W\xd4\x95Nx\xc6\x00B\ +n\xcfz\xfa\xe1\x1cE\x93\xdf\x5c\x1e\x06\x00\xf8`{\ +,/\x7f\xb8\xaezrX\x0b\xb7x\xe5\xeb\xefYw\ +8\x11}\xf5\xb4\xa7\x0c\x00b\x1dh\x87\xe3\x95\x94(\ +\x9b\xcb\xc3\x00\xa0N\x14\xcdZ\xb6\x9a\x98\xef~\xac\x86\ +l\xd6\xc2\x15\xbeLL\xe1\xf9m_[vPy\xcc\ +\x00%r3\xe8\xa7#\xee\xd9p\xa4\xa4D\x1eU\xdf\ +\xf5\x8c\x01\xf43o&,\xfc\x0fGj\x87\x88\xab\x1d\ +\x89\xe7\x7f\xe1/\x9f\xc4Pb\xae\xd9\x1e2\x80\x14\x1c\ +\xcd\x9e19\x05t\x03\x00\x84\x22\x9eV\xdf\xf5\x9c\x01\ +\xa4\x94\xe4\x15\x15\xd1\xe7\xb1Yl\xdb\x7f\xb0\xaa\xf3\x5c\ +\x0b\x0d;\x93\xd2\xb8\xed\x9d\x0f\xc8\xbdp\xd1Z\xb3=\ +d\x00\x81|Z\x0f\xcbK\xffG\xa6\x1d;\xa2\x04u\ +\x18\x08\x04\x99w\xd9:/\xa8\xd4\xae\x02\xf4\xdd\xbb\x17\ +/]\xe2\x83\xafvS\xaf\xeeu\xf41}\xdd\xa3\x16\ +\x95\x8f\xd7\xbe\xfe\x9e\xc9\x9f\x7fA\xf1\xa5K.\xa6|\ +\xf5\x13O\x5c\x94\x97&W\x02\xdf\xe4<=e\xba\x1e\ +\x9e\x979p\x19\xd4!\xd9KQ\xfel\x14\xbaV\xc8\ +\x8e\x81X\x22\xd5e\xe0\xa2N\x00\x00\x044IDA\ +Tv\xc7J\xe0\xab\xfd\x09$\x9e>\xcb\xf0^7\xe1\ +\xe5U\xc13nk\xe1\x12\x17/]\xe6\x81\xb51,\ +\xf9\xf6G\xb5\x82+.\xdav\xd3\x15\xa7o5\xabr\ +R\xc8{.n\x8d9\xa9\x87k1\x00\xd2\x8e\xa5\x88\ +\xa0\xf6\xb7\x0aE\xb4+\x0f\x03\x98\x9f'$\xa7\xb1\xf2\ +\xabX\x84\x22\xe8\x12\x12D\xdd:u*]\x19\xbf'\ +\x14^\xfc\x95e{\xe3\xf9\xcb\xda\x18\xf6\x9e<\xa3\xb6\ +\xcd.j\xb6g\x0c\xc0\xe7\xb93\x1e}\xd9\x1c\xbe\xc0\ +\x11}F\x04)\x8a\xb2OQ\x84z\x80\xaf\x0b\x06\xb0\ +\xac0\xd1\xf7\xc9\xbbHTC?_\xa6D\xdd\xc1\x9f\ +\x07\xf5\xb3|!\xac\x16e#-+\x87\x15?&\xf0\ +\xf6w\xfb\xc9.*v\xd0\xaf\xe9k\xe5\xee*\xa9\xc3\ +i\xe5\x08\x91qAx\xf5,~\xfa\xe14s<\xce\ +\x06\x00\x10\x19\x15\xa9 \xb6+\x8aP\xca\xcb\x00\xd6\xe7\ +v_\xa2\xc3\xf5-\xb9\xa3G\x18w\xdc\xd4\x8d\x88.\ +\x9d\xa8_\xf7\xba+T\xd1o\x0b\xc5\x97.\xf1u\xf2\ +I\xb6&&\xb3-1\x85#\x19\xe7\x1d*\x9b~\x98\ +\x06\xe5f\x00\x09%%\x92\x01\xf9\xcfL\xdd\xe5\x18\xaf\ +k\x03\x00\x94\xc8;\x9fV\x14\x16^\x09\x03\x18r.\ +|\x89NA\xad\xe8\xdc\xba\x15\x9d[\xb7\xa4S\xeb\x96\ +\xb4\xb05\xb4/\x91\xa3\x15E1\xa7\xb2\x96\x01\xaa\x89\x01\ +\xa4\x10\x12\xe4\xa7\x92:s\xf2\xe7>V\xbeO\xa0k\ +\xa8\xb8\x01\xe8\x188\xa6{\x1d\xa1\xcc\x15\x8a\x12\xe56\ +\xf1\xc2\x94IW\xf4\xe5`,.\xe5<\xf0\x01\x5c*\ +\xd5\xa5Q\xba\x09\xc7\xa4\x5cs8\xee\x8d\xd2\x85\x91;\ +\x19\x9b\x0b#\x17.*\x83\xd9\xc8]\x1a\x9b\x83q*\ +b\xfd%\xa5dn\xe1\x9c\xa7\xaeh\xb7\xce\x95\x1b\x80\ +\x8e\xc1\x13|\xbd\xc4\xc5\x81 \x87(B\x19\x8a \xb8\ +\x96\x01*\x93\x018!P6K\xd8\x9cW\xc7\xef\xab\ +\xb2\xbc{OQy\x06\xe0\x88A\xe3\xda{)\xb2\xbb\ +\xf0\xa2\xad\x806\x08\xa5\xad\x10\xa2-B\x04\xa91\xd7\ +2\x80\xb3\x9c@@J\x89 I(\xe2\x04\x92\x13R\ +\x88$\xe5r\x9d\xfd\xb9\x8b\x9e,\xfb\x0b\xd4\x15\xc0\xff\ +\x03\xacS*H\xf17=\x8e\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x05~\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x02\xbePLTEGpL\ +\xd7`*\x17\x0a\x04\xa0G\x1fO#\x0f\x04\x01\x00\xf7\ +q4\xf6n0\xdfd,\x00\x00\x00M\x22\x0f\x14\x09\ +\x04\x02\x01\x00\x9eG\x1f\xd8a*\xddc+-\x14\x08\ +Q$\x10\xb5Q#\x22\x0f\x06\x06\x02\x01\x17\x0a\x04\xa1\ +H\x1f\xf7}E\xdbb+\xf6n0\xf5n0N#\ +\x0f\xafN\x22\x15\x09\x04_*\x12\x02\x01\x00\xa9L!\ +\xe4f-X'\x11}8\x182\x16\x09&\x11\x07\xe0\ +d,\x9fG\x1f\x09\x03\x01\xe3f-\x0c\x05\x02b,\ +\x13\xb8R$m1\x15Q$\x10b+\x13z7\x18\ +\x04\x01\x00W'\x11\xf8}E\xf4\x85S\xf7\x86R\xa1\ +H\x1f\xa7K!\xbeiB \x0e\x06)\x12\x08\xd5u\ +I\xd3_)\xd5`*W'\x11\xcdrH\xc6mD\ +\xf2\x82O\xf7~G\xa0G\x1f\xf7x>\xb6e@\xcc\ +\x5c(\x98D\x1e\xf8\x7fHK!\x0e\xe6|K\x97R\ +4\xf7w=\xcf])\xf6\x83O\xf7|C\xf7v;\ +\xf8\x80I\xee\x82Q\xf7|D\xe8\x7fO\xf7\x7fG\xd0\ +tI\xe4~O\xe8h.\xddxI\xf7u:\xdf{\ +N\xe9i.\xf7y@\xf7y@\xf7o1\xff\xff\xff\ +\xf8}E\xf6n0\xf5n0\xfe\xfe\xfe\xfe\xf0\xea\xea\ +i.\xf7p2\xfa\xf0\xec\xfc\xf6\xf3\xf7x>\xfe\xf3\ +\xee\xe3{K\xdfg0\xf8\x8d\x5c\xfb\xbd\xa1\xf6\x7fI\ +\xfc\xce\xb9\xf8\xeb\xe5\xfe\xfc\xfb\xf4m0\xe6\x83V\xe3\ +\x81T\xe3\x81U\xfb\xf5\xf2\xf9\x9cr\xe2\x89`\xfb\xf5\ +\xf3\xfb\xc9\xb2\xf1\xa8\x86\xefm1\xf0\xd4\xc7\xfc\xf5\xf1\ +\xe5r>\xfd\xf9\xf8\xf9\xf0\xeb\xe6\x82U\xe5\x90i\xfc\ +\xd8\xc8\xf6o1\xe5r=\xf6n1\xf1\xd6\xc9\xf9\x9a\ +n\xfd\xfa\xf8\xf1\xa5\x82\xe4\x91j\xf0k/\xe2\x89a\ +\xf0l1\xfb\xc7\xaf\xe9\xba\xa4\xf0l/\xe3\x97t\xe2\ +|M\xfc\xd6\xc5\xe4g/\xf7\xe8\xe1\xf8\xeb\xe6\xf9\xc2\ +\xa8\xe2}N\xf8\x81K\xe4\x9ay\xf7v<\xf8\x85Q\ +\xe9\xb8\xa2\xe4g.\xfe\xfa\xf8\xf7v;\xfe\xf7\xf4\xfc\ +\xf7\xf4\xf8\xbd\xa3\xf7\xe7\xe1\xfe\xfa\xf9\xe4\xaa\x8f\xf8\xec\ +\xe6\xfa\xae\x8c\xf7o2\xe5\xac\x92\xfe\xf9\xf7\xf7{C\ +\xfc\xcd\xb8\xfa\xa6\x80\xfa\xb7\x99\xfc\xd2\xbf\xf7zB\xf9\ +\xa3|\xfd\xea\xe1\xf5\xe3\xdb\xfd\xec\xe3\xfc\xd7\xc6\xfd\xdd\ +\xce\xfa\xaf\x8d\xfe\xf2\xed\xfc\xd9\xc9\xfa\xae\x8b\xe1\x96s\ +\xe3\xa9\x8e\xfe\xf2\xec\xdfxH\xfd\xfa\xf9\xe1\x97t\xdf\ +vF\xf6\xe7\xdf\xf9\xa4}\xe3\xa8\x8d\xfa\xf1\xed\xfe\xee\ +\xe7\xe2\x8bc\xfa\xb5\x96\xfe\xfc\xfc\xe2\x8ce\xfe\xed\xe6\ +\xfd\xfb\xfa\xf2\xad\x8d\xfd\xdf\xd1\xfe\xf8\xf6\xfe\xef\xe9\xe2\ +\xa5\x8a\xed\x95l\xf1\x82O\xf4\xc2\xab\xf9\x95g\xf8\x8c\ +Z\xed\x97p\xef\x98q\xe2\xa3\x87\xf8\x8c[\xe0\x89b\ +\xfd\xe0\xd2\xf1\x81N\xf2\xac\x8c\xf9\x96i\xf4\xc3\xad\xfc\ +\xcf\xba\xef\x99q\xfe\xf9\xf6\xe0\x89a\x19\x07\xe4\xa6\x00\ +\x00\x00_tRNS\x00\xe1$\xb1c\x08\xfc\xfe\xe9\ +\x12a#\x07\xaf\xe2\xe2\x03d\xa0\x02\x05%\xb2\xfe\xe1\ +\xfd\xfdb\x94$D\x08\x93\xebC\x89\x06\x05\xea\xb0\x02\ +\xea\x028\xa2CeB\x87\x056\xfeY[\x88\x89\x11\ +\x01\x01\x14\xd7\xd9-;\x13\x5c\xcc~\xe3\x10\xce|\xcf\ ++2\x01\xe4\xcf^\xc5\xf6\xcd9\xc37\xca<.\xe0\ +1\xf7-\xdf\xe8\xe7\xfe\x08\x05\xdf\x00\x00\x01\xfbID\ +AT8\xcbc`\xa0\x220\x11O\x84\x02cSl\ +\xf2!\x01\xf1p\x10\x15\x84.\xeb\x1a\x16\x1d\x17\x8f\x04\ +b\xc3\xed-\x90\xe5\x1d\x02\x97d\xc5\xa3\x80\xac\xf9\x1e\ +\xd6H\x0aB\xe3\xb1\x00'$\x051\xf1\xf1[\xb7\xef\ +\xdb\x9f\xb7mcvv\xe1\x89\xbc=\xbbwn\x88\x8f\ +\x8f@\xc8G\xb2\xc5\xc7oI@\x01\xbb\xd6\xc6\xb3y\ +\xc1\x15\x04\xc7\xc7o\x02\x0a\x16\xa7@e\x8f\x00\x19k\ +\xe2\xe3\xfd\xbd\xa1\xf2\x8e\xe9\xf1s\x97&\x1c?\x9a{\ +\xecdQBB\xd1\xc1\xc3\xb9\x07v$,^\x10\x9f\ +\xee\x07U\xe0\x12\x1f?\x1d\xa4\xf1P~\xc1\xe3\x84\x84\ +K\x05\xf9{A\xbc\xb6\xf8x\x1f\xa8\x02\xb7\xf8\xf8\x06\ +\x88\xd9\x0f\x0b\x13\x12\x9e]\x86\xb03\xdb\xe3}\xa1\x0a\ +\xdc\xe3\xe3[\x9b\xc0\x82O\xaf&$\xa4\xde\x043{\ +\xfa\xe2\xe3\x9d\xa1\x0a<\xd9\xe3\x93\xab*@\xa2wA\ +\xc4s\x10Q=!9\x9e\xdd\x0e\xaa\xc0\xd2&>>\ +\xa9\xac9!!\xe5\xc6\x83{\xd7^>:\x97\x90\x90\ +Q\x9e\x14\x1fok\x05\xf3\xa6\x190\xdc\x92Z\x80\xfa\ +R\xef\xc7\xc7\xdfN\x052J\x81\xf2\xf1\xe6\xf0p0\ +\x02\x85l7\xc8\xe4\x17On]\x01\xd1\x95 \x11m\ +\xb8\x02a\x09 w\x12H\xa2\xf8\xce\xf5\x8b \xba\x06\ +(\xc0/\x80\x08k\x05 \xbf\x17(~\xea|I\xc9\ +\x99\x0c \xa3\x16( \x83\x14Y\xfa@\xfe\xc4\x85\xab\ +\xd7\xe5\x9c\xbdpzs\xce\xaaY\x93\xeb\x80\x02\xbaH\ +\x0aT5\x81\x02S\x16-_\x0f2~\xe5\xec\x19\xfd\ +@\xae\xa2\x0ar\x8a\x11\x029*i\xde2p\x10N\ +\x05y!^\x07%\xc9)I\x81\xc4\x92\xe7\xacHH\ +\x989-\x19\xc4\x96\x94CQ\xa0a\xc0\x0e6\xa3\xa3\ +\xbe\xab\xb1\x13\xc4bW\xd6BM\xb5\x86,\x1c\xe0t\ +\x96\x96\x06\xa6\xd4\xf4D0\x92\xbd\xac:;,5\xb2\ +\x8b\x89b\xcb\x18\xf2\xd2\x10C\xe29\x04Yq\xe4-\ +n^\xa0!\xec\xccL\xb8s\x1f\x0f\x17#\x1f\x0b+\ +\xde\x0c\xca\xc9Ij\x96\x06\x00\xfd\x98\xe6y\x07\xbeQ\ +(\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x05}\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\ +\x00\x00\x02\xe2PLTEGpL\xfc\xceI\xfc\xce\ +I\xec\xc1D\xdcJ=\xdcJ=\x0f\x93S\xfc\xceI\ +\xfc\xceI\xfc\xceI\x9e5,\xdbI<\x0f\x98V\xf4\ +\xc7F\x0cvC\x96{+\xdcJ=\x0buB\xf6\xc9\ +G\x10\x9dY\xdbI<\xcf\xa9<\xdbI<\x10\x9dY\ +\xdcJ=\x9f\x82.\x0ac8\x86-%\x9e5,\x10\ +\x9dY\xbc\x996\xdcJ=\x0f\x99V\xbd\x9b7\x10\x9d\ +Y\x0d\x81I\x0f\x98V\x10\x9dY\xb7=2\xdcJ=\ +\x10\x9dY\xb7=2\xf5\xc8G\x09]5\xdbJ<\xdc\ +J=\xb6=2\xdbI<\xaa\x840\xf0\xa0D\xdaJ\ +<\xb6=2\x0bk=\x10\x9dY\xdcJ=\xc3A6\ +\x5c9(\xdcJ=\x10\x9dY\xc3A6\xdcJ=\x18\ +\x98W\x10\x9dY\xdcJ=\xdcJ=\xf1\xc5E\x0f\x9b\ +W\xf9\xcbH\x10\x9dY\x9d4+\x0ac8\xdcJ=\ +\xd9I<\xc3A6\xd9I<\xc3A6\x9d4+\x10\ +\x9dY\xfc\xceI\x0d\x82J\x0e\x91R\x0d\x80H\x0e\x90\ +R\x0e\x95T\x0ah;\x8f\xcc\xae\xeb\xed\xee\xfc\xceI\ +4\xa1hE~L\x13\x9bX\xa5\xa2\x8c}gC\xa0\ +\x83.`rG\xa8E3\xbdA3\x1d\x96V\xe8\xbd\ +C\xd1\xab<\xa7\x880\xcd\xa8;\xea\xbfC\x0f\x9cX\ +\x0f\x9cX\x94y+\x09\x5c4\xbf\x9c7\xdc\xb4?\x0c\ +wC\x10\x87L\x9a\xa6D\xd9\xb1?\xdcJ=F\x87\ +\xf3\xfc\xceI\x10\x9dY\xfb\xcdH\xc7\xd7\xf1\xe9\xb5\xb0\ +\xddTH\xde\xe5\xf1F\x87\xf2\x0e\x94T\x0f\x9bXG\ +\x85P\xed\x96?\xeb\x94<\xb9WA\xee\x9aB\xdbI\ +<\xf6\xde\x97\xf9\xc9D\xdaH;\xf6\xde\x99M\x8b\xf2\ +\x15\x9e\x5c\x9b]A\xb4\xda\xc8\xdfcX_\x96\xf2\xc1\ +\xd3\xf1\xf6\xc2>\xc0\xd2\xf1\xcf\xdc\xf1\xf8\xd9\x81\xef\xef\ +\xf0\xea\x91:\xe5\x96\x8f\xfb\xd0S\xf8\xd8|\x84\xc8\xa7\ +\x16\x9f]\xd9G:\xcc\xda\xf1/\x8eS\xe9\x908\xe8\ +\xae\xa9\xaa\xc5\xf1\xe8\x8e7\xf2\xba7\xe8\xb0\xa7`\x97\ +\xf2\xcdA5\xe1\xe7\xf1\xf1\xef\xea\xfb\xcfO\xe6\x91I\ +\xe7\x8b4\xad\xc6\xf1\xc2\xd4\xf1\xf0\xef\xed\xef\xd5\x9b\xee\ +\xb45\xe8\xa5\x86\xd8\xe2\xf1\xd0\xdd\xf1J\x89\xf2\xd8F\ +:\xdb\xe3\xf1\xf0\xb73\xf4\xbf>\xe7\x8c5U\x90\xf2\ +\xa1\xbf\xf1\xe6\x8a3\xed\xd2\xd0\xf6\xe0\x9f\xef\xb41\xf8\ +\xc7Bn\xa0\xf2x\xa6\xf2\xf0\xe0\xbd\xc66-\xd7E\ +9\xcc<1\xde\xa6\xa2[\x94\xf2\xd9\x8b\x86\xbf\xd2\xf1\ +G\x88\xf2h\x9c\xf2\xe7\xed\xea\xa0\xbf\xf1\xed\xee\xf0\x1e\ +\xa2b\xf1\xee\xe5\xd9^T\xdd\xa3\x9f\xc6\xd6\xf1\xc99\ +/\x91\xb4M\x1c\x95Q\x0e\x95T[\xb8\x8b\xe8\xc9I\ +\x15\x8cSy\xc3\x9f\x0f\x98V\x10\x8cN\xe1\xe9\xe5\xb7\ +\xcd\xf1{\xc5\xa1\xd2\xdd\xf1\x0d\x8bN\xdf\xe6\xf1L\x9b\ +L\xf2\xdc\x92Z\x93\xf2p\xb4\x93o\xa9M\x0f\x9cX\ +R\xa8~\xd2\xc2J\xb4\xcb\xf1~\xa9\xf2\xda\xe3\xf1\xb4\ +\xb8J\x0e\x8eP\xf7\xcdJ\xbf\xd3\xb3y\xa6\xf2\xf6\xcc\ +I1\x9fS\xb3\xbdMN\xa9TT\xbb$\xa6\x00\x00\ +\x00qtRNS\x00\xb4\xf6l\xde||\xa5\xcc\xdb\ +\x09aZQ\x11\x04\xbe\x10Q\xe6e\x14j\xd6\xe6\x04\ +\x09\x02\x0c\xd5\x0b\xeaa\x0b\xb0\x1be\xb4\x17\xb4\xe1\x11\ +U\x06\xbe\xc4\x17k\x06\xe1Z\x10\x0c\xea\xd6\x22\x02\xd5\ +\xc4\x1b\xb0k\xfc\xc9\xfcUk[\xc9\x11\x11\xfdkH\ +jE\x14\xfd\xb9HkEj[\x14\xfe\xfe\xf8\xfd\xfe\ +\xfe\xfe\xfe\x07\xfe\xfe\xfe\xfeZ8\x096[\xb9\xf8\x07\ +\x096l8\x5cmZFt#+\x00\x00\x01\xd9I\ +DAT8\xcbc` \x05\xf8xz\xb0\xb2zy\ +\xbbb\x97\x95\xd1\xb7w/\x04\x03\x07]\x11.\x0ci\ +i1\xf9B$ \xc1\x8d&\xaf&P\x88\x06\xd45\ +\x91\xe5\xcdY\x0a1\x80\x995B^\x0f\x8b|a\xa1\ +\xa51L\xdeB\xa7\x10+\xb0\x81)\xb0mh\xc2\xae\ +\xc2\x08\x22obZ\xdb\x0a\x15\xe9\x9e2w\xe1\xba\xe5\ +;Wl\x9b?gr}]\xa3\xa1\x01X\x81SI\ +I\xe7L\x90tE\xf9\xa4\xb2y+7\xac^\xb3v\ +\xcf\x96\x05}-\xa5\xa5\xc5\xce`\x05.%%\xb3\x17\ +o\x02\xca\xef*\xeb)\x02\x82}\xeb\x0fl\xdd[Z\ +\x0c\x02~ \xf9\x10\xdf\x92\x92\x92\x98\xc3\x87\x0a\xcb/\ +n,\x02\x83\xed\x9bw\x17C@x\x0aP\x81?P\ +\xbe$1\xe1\xd2\xf93G\x8b\xa0`\xff\xd2\xa9P\x15\ +\xc9@\x05\x01 \x05%q\x07\x8f\x1d\x87\xc9\x17UU\ +N\x84*H\x03*`\x03+\x88\x8a?r\x1a\xae\xa0\ +\xa8\xbf\x0d\xaa\x80\x19\xae\xa0$\xf2\xc2\x0e\x84\x82\xdef\ +$\x05A\x10\x05%\xd1\xab\xe0\xf2'\x96L\x83*H\ +\x02*\x08\x84*\x88\x08[\x04S\xf0\xfa\xdc2\xa8\x82\ +T\xa0\x027;\xa8\x8a\xd0Y\xed\x10\xf9'\x0f\x1fC\ +\xe5\x99bA\x01a\x05U0\xa3k\xc2I\x90\x17>\ +V~x\x0fU\xc0\x08\x0eI\x15\xa8\x82\x92\x8e\xe9\xa7\ +\xee\xbf\xba\xfb\xe6\xce\xd3\xb7P\xf9b-\xb0\x02)a\ +\x98\x8a\x92\xb3\xd7\xee\xdd|q\xe3\x11L\x9eS\x12\x12\ +\x9d\x0a%H\xe0\xd6\x83\xdb/a\x0a\x84`\x09B\x15\ +I\xc1\xd5w\xcf`\xf2\xec\xf0$\xc7'\x8ePP}\ +\xe5:T\x9eC\x11\x91(\x95ea\xf2\xcf\xab/\xc3\ +\xe4E\x91\x93\xb5\xa0\x12TA\xcd\xe7OP\xf3\xe5\xd0\ +r\x06\x8f\x06D\xc1\x17\x88\xfby1\xb3\x9evpz\ +FI\xc9WP\xf81:\xf2c\xcf\x9eY\xb9y\xf9\ +9\x05\xd9\x99$\xe5x\x00\xfe\xa1E\xc6\x0b}\xa2(\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x06v\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ +\x01\x95+\x0e\x1b\x00\x00\x03\x00PLTEGpL\ +C\x96\xbbs\xdeB'W\x9e#[\xa70\x81\xd51\ +\x84\xdb!U\x9f9tr%H\x8c)E\x8c*G\ +\x92`\xbb>'H\x8f.~\xda(E\x87f\xc5D\ +1\x83\xdb5\x83\xbcP\xb1\xe20WuV\xc0\xf03\ +}\xb0 J\x8a N\x94s\xdeBS\xa4Rs\xde\ +C/\x80\xd2,z\xdar\xdaD,E\x901\x84\xd8\ +\x22C\x86o\xd7K+s\xcfX\xc2\xe4,x\xdaY\ +\xb9\x95h\xce{h\xd2\x83d\xcd\x97g\xd0\x8b-y\ +\xc9Z\xbe\xad#O\x96'L\x95P\xb3\xe4$K\x92\ +p\xdaU_\xc8\xbeZ\xb0NU\xa48e\xc39$\ +O\x99d\xcd\x9e,y\xcd0\x81\xdbq\xdaG\x22Q\ +\x9at\xdeAt\xdfBq\xdbO^\xbaZo\xd9Z\ +`\xc2yk\xd4v'K\x92b\xcb\xab-y\xd1V\ +\xbf\xf3(P\x9f!J\x8a)>~t\xdeA(G\ +\x8bV\xbf\xf2'I\x8c+P\x9b*r\xc8\x22J\x8c\ +)H\x91#Q\x9d)H\x91/}\xd1'g\xa6&\ +d\xb4/|\xd1(i\xb8a\xc5~-M\x9f&c\ +\xb1,v\xce0J\xa26\x85\xba&U\xa2^\xc7\xc4\ +!\x5c\xa2V\xbf\xf1?\x90\xa1c\xca\x8e+t\xc1+\ +u\xc1\x5c\xc3\xb9E\x9b\xafV\xbf\xef^\xc3\x9c.|\ +\xdaF\xa1\xcb1j\xb7=\x90\xba-v\xb8V\xbf\xf2\ +K\xa6\xba<\x8e\xc1m\xd6jU\xbb\xdcK\xa8\xd3W\ +\xc0\xed.w\xbaX\xc1\xe71}\xbb,x\xd4W\xc0\ +\xeb>\x93\xc6V\xbc\xe0Q\xb4\xd9 P\x960{\xba\ +T\xb4\xbc$a\xa0n\xd7cY\xc1\xe3%h\xbaS\ +\xb8\xd9[\xc4\xd47\x87\xbfq\xdbM-/qp\xda\ +ST\xbb\xe9Z\xc3\xd83\x86\xdaW\xc0\xecW\xc0\xe9\ +Y\xc2\xdcP\xae\xc3L\xab\xcc;\x8e\xc00~\xc74\ +\x82\xbf,y\xda%Z\xa9(m\xc4!S\x9a'g\ +\xbe'h\xbe+x\xda*r\xd1+x\xda+w\xd9\ +2\x86\xdb3\x88\xdb0\x83\xdb3\x87\xdb\x1fK\x8c2\ +\x85\xdb\x1fN\x93/\x80\xdb\x1fQ\x99t\xdfA L\ +\x8f M\x91\x1fI\x8a\x1fO\x95q\xdbPX\xc1\xe5\ + J\x8b1\x84\xdb\x1fP\x97.\x7f\xda R\x9an\ +\xd8dq\xdcLo\xd9\x5cp\xdaV-|\xdar\xdc\ +J\x1fK\x8dY\xc2\xe1Y\xc3\xddk\xd5tl\xd6n\ +g\xd1\x8aa\xcb\xb0b\xcc\xabd\xce\x9d_\xc9\xb8i\ +\xd3\x82h\xd2\x86m\xd6jc\xcd\xa5`\xca\xb4s\xdd\ +Cp\xd9Y3\x88\xdap\xdaSs\xddFX\xc1\xe9\ +/}\xc8,z\xda3\x87\xdak\xd5rj\xd3|j\ +\xd4xi\xd3~W\xc0\xeff\xd0\x91g\xd0\x8e_\xc8\ +\xbcf\xcf\x94m\xd7ge\xcf\x96c\xcd\xa1s\xdcG\ +^\xc7\xc1n\xd8an\xd8_W\xc0\xea]\xc7\xc7\x5c\ +\xc6\xcc]\xc6\xc9W\xc0\xec\x5c\xc5\xd1\x5c\xc5\xce[\xc4\ +\xd53\x86\xd5Z\xc3\xda[\xc4\xd3/~\xceZ\xc4\xd7\ +1\x83\xd12\x85\xd8e\xce\x99s\xddD R\x9ca\ +\xcb\xa7_\xc8\xbf0\x80\xcd,w\xc4^\xc7\xc4/|\ +\xc5-x\xc01\x83\xd53\x88\xd9.{\xc2|7\x1f\ +\xe1\x00\x00\x00\xa1tRNS\x00\x16\xc1\x1a\xfd\xfe\xfe\ +\xfd\x04\xc12\x8d3\x80\xf8I.\xb7\xfd7\x09\xfd\xfd\ +\xfe\xfc\xcd\x0d\xa8g\xa0\xd9g\xbe\x0fX\xfd\xc9\xfe%\ +H\xfcXhG;\xd8\x9f?\xe3\xf7\xa5B\x1b$\xcc\ +\xf4B\xect\xe7\xb0\xec\xf4P\x84\x91\xe7\xae\xb8N\xac\ +\x91\xf5)\x80_\xe4v[:\xf4\x9a\xdf\x87\xfdF\xfd\ +\xfd\xfc\xf7o\xfc\xfdh\xfd\xbb\xf3\x12\xf2\xf9\xfd\xa2`\ +\xfd\xfc\xec\xfd\xe3\xfdm\xfd\xfd\xb6\xfd\xfd\x89\xfd#\xcd\ +\xfe\xf3\xfd\xfdz\xfc\xfe\xfd\xfd\xfdC\x1f\xf0\x86.\xe8\ +y\xfc\xca\x1f\x9b_\xa2\x9d\x93\xb6\xbdG\x8a\xbc\xcf\xd5\ +\xf5\x99Q\xfd\xba\xfc\xb2\xc9\x8b\xc8u|\x80\xe1\x00\x00\ +\x02oIDAT8\xcbc` \x010\xf6\xf4O\ +PQ\x99\xd8\xdb\xde(\x82MZ\xbf@\xf4\xc5\x85\x0d\ +{\xf7}x\xf7\xeay\x82\x91\x0e\x86n7\xd1\x1bO\ +\x80\xd2o_\xbf|\xf6\xf4\xe1\xed\xa3\x87\x5c\xd4P\xe4\ +\x85}n\xc0\xb5\xff\xfa~\xf4\xd4\xa1\xc3'\xcd5\x91\ +\xe5\x93P\xb5\x1f>y\xff\xc8\xbd\x9bZp\xf9\xd2L\ +t\xedG>\xdf\xb9uPC\x1d*\xcfQ\x86\xac\xfd\ +\xd4\xe1o \xed\x07\x8f\x1f\xbb\xea$\x05QP}a\ +CIN\x91\x90P\x5c^a:H\xfb}\x90\xf6c\ +\xd7\xaf\xed?P\x0c\xf1@EmM\xf9\xff\x8b?~\ +\xfc\xb8\xf8'?\x03\xae\xfd\xda\x95\x03w\x9b\xc1F\xb4\ +\xd4U\xfe\xfe\xf8\xe6\xdf\xbf\xb3\xff>\xfd}\xffS,\ +\x0b\xa8\xfd8H\xfb\x89m\x8fv(\x81\x5c\xd0\xd6p\ +\xf1\xcd\xd9E@\xb0d\xc9\xc2O\xac?\xc5R\xa0\xda\ +\xb7=>\xb3\xb3\x1b\xa8`R\xc7o\xb8\xfcBA\x99\ +\xb4\xd4d\xb0\xf6\xbb\x8fv\x9c9\xb7\xbe\x13\xa8`\xf2\ +\x9f\x8fg\xa1\xd2\xac\xb9 +C#\xc1\xdaw\xec<\ +\xb7~\xb7\x1c\x90?\xe5\xe2'\xa8|H<\xc4W\x8e\ +`\xed;\xd7o\xdf}^\x12\xc8\x9d\xf6\xe3\x1fXz\ +\x19+{\x14D\x81=D\xfb\xf6\x07_NK\x03\xb9\ +S?^\x06\xcb/\x8b\xde\x1a\x0bQ`\x0c\xd1\xfe\xe0\ +\xcb\xaaU _(|\x02Ko\x0a_\xf9\xd5\x1d\xa2\ +\xc0\x01\xa4}\xf7\xf9\xd3\xabV\xc9q\x00\xb9}\x0b\xc1\ +\xf2\x8b#V~\x0d\x02\xf1\x19\x04\x0c\xc1\xda\x81\xf2\xb6\ +\x02 \xbe\x0cHz\xd3\xe2\xc5,[\xb7n\xf5\x03\x09\ +\xf0\xd8A\xb4\xafb2\x05\x1b\xd8\xc4\x06\xd4\x0e\x04\xec\ ++\xb7n\xb5f\x06\x89\x98XI3I\xdax\xf1\xc0\ +\x22[\x01,\xbf\x02\xa8`\xe5J3E,\x89Q\x9b\ +\x0d(\xbdb\x05\xcb\xe6\x95+7o\xd6\xe5\xc2\xa2B\ +\x10$\xbf%l\xdd\xe6\xcd\x9b\xd7\xad\x93\xd0\x83)\x11\ +\x91\xe7\x86\xb2\x98-\x81\xf2[b\xd6\xac\x03\x82\xe5\xcb\ +\xd7\xac1p\xe6\xe6\x0d\x0e\xe4\x0c\x10\xe7\x87\x19a\xc1\ +\xb7e\xcb\x96],k\x96/\x07\xc9\xafY\xbdz\xcf\ +\x9e\xa5\x1b7\x8a\xfb\x22,q\xe5\xdb\xb5kWU\xfd\ +\x9a5\xcbA\xd2\xab\xf7,\x05\xc9\xf3\x22;\xc3?\x1b\ +\xa8BYb\xcf\xea\xd5P\xed\x1b=\xbcQ\x1d\x9a(\ +\xbb\xeb\xd2%e\xf6\x8dKA\x00\xa8\x9d\xd3\x13\xc3/\ +\xad\xb2\xd3UU\xe7\xcc\x12_\xbbv\xad8'?\xd6\ +\xcc\xab8s\xfe\xdc\x05\xf3f\xcf\x90\xef\x22%\xcb\x03\ +\x00/\xab\x8c\xa71\xf3a\xb4\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +" + +qt_resource_name = b"\ +\x00\x06\ +\x07\x03}\xc3\ +\x00i\ +\x00m\x00a\x00g\x00e\x00s\ +\x00\x14\ +\x0e^\x13\x87\ +\x00p\ +\x00o\x00l\x00i\x00c\x00i\x00e\x00s\x00_\x00g\x00e\x00n\x00_\x001\x002\x008\x00.\ +\x00p\x00n\x00g\ +\x00\x08\ +\x09n\x91\xb3\ +\x00b\ +\x00r\x00o\x00w\x00s\x00e\x00r\x00s\ +\x00\x0c\ +\x0fTN'\ +\x00b\ +\x00r\x00a\x00v\x00e\x00_\x003\x002\x00.\x00p\x00n\x00g\ +\x00\x0d\ +\x01\x97\x91\x87\ +\x00c\ +\x00h\x00r\x00o\x00m\x00e\x00_\x003\x002\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x02\xb2\x0c'\ +\x00e\ +\x00d\x00g\x00e\x00_\x003\x002\x00.\x00p\x00n\x00g\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00@\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x90\x5c\xbe[\x16\ +\x00\x00\x00t\x00\x00\x00\x00\x00\x01\x00\x00*\x0c\ +\x00\x00\x01\x8dk\xd3\x84\x86\ +\x00\x00\x00\x94\x00\x00\x00\x00\x00\x01\x00\x00/\x8d\ +\x00\x00\x01\x8dk\xd3\x84\x87\ +\x00\x00\x00V\x00\x00\x00\x00\x00\x01\x00\x00$\x8a\ +\x00\x00\x01\x8dk\xd3\x84\x84\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/templates/brave.json b/templates/brave.json new file mode 100644 index 0000000..f3bcbc1 --- /dev/null +++ b/templates/brave.json @@ -0,0 +1,225 @@ +{ + "SingleValues": [ + { + "name": "AutofillAddressEnabled", + "values": { + "0": "禁止使用“自动填充”功能填写地址", + "1": "自动填充地址信息" + }, + "default_value": 0, + "display_name": "自动填充地址信息", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillCreditCardEnabled", + "values": { + "0": "禁止使用“自动填充”功能填写信用卡信息", + "1": "允许使用“自动填充”功能填写信用卡信息" + }, + "default_value": 0, + "display_name": "允许使用“自动填充”功能填写信用卡信息", + "allow_recommend": true, + "enabled": true + }, + { + "name": "DefaultGeolocationSetting", + "values": { + "1": "允许网站跟踪用户的地理位置", + "2": "不允许任何网站跟踪用户的地理位置", + "3": "每次网站尝试跟踪用户的地理位置时都询问我" + }, + "default_value": 2, + "display_name": "默认地理位置设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PasswordManagerEnabled", + "values": { + "0": "禁止使用密码管理器保存密码", + "1": "允许使用密码管理器保存密码" + }, + "default_value": 0, + "display_name": "允许将密码保存到密码管理器", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PaymentMethodQueryEnabled", + "values": { + "0": "始终告诉网站,没有任何已保存的付款方式", + "1": "允许网站检查用户是否有已保存的付款方式" + }, + "default_value": 0, + "display_name": "允许网站查询可用的付款方式", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxAdMeasurementEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 广告衡量设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 广告衡量设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 广告衡量设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxAdTopicsEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 广告主题设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 广告主题设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 广告主题设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxPromptEnabled", + "values": { + "0": "不向用户显示 Privacy Sandbox 提示", + "1": "允许 Google Chrome 确定是否显示 Privacy Sandbox 提示" + }, + "default_value": 0, + "display_name": "选择是否可向用户显示 Privacy Sandbox 提示", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxSiteEnabledAdsEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 网站建议采用的广告设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 网站建议采用的广告设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 网站建议采用的广告设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "TorDisabled", + "values": { + "0": "开启 Tor", + "1": "禁用 Tor" + }, + "default_value": 1, + "display_name": "Tor", + "allow_recommend": false, + "enabled": true + }, + { + "name": "BraveRewardsDisabled", + "values": { + "0": "开启 Brave 奖励", + "1": "禁用 Brave 奖励" + }, + "default_value": 1, + "display_name": "Brave 奖励", + "allow_recommend": false, + "enabled": true + }, + { + "name": "BraveWalletDisabled", + "values": { + "0": "开启 Brave 钱包", + "1": "禁用 Brave 钱包" + }, + "default_value": 1, + "display_name": "Brave 钱包", + "allow_recommend": false, + "enabled": true + }, + { + "name": "BraveVPNDisabled", + "values": { + "0": "开启 Brave VPN", + "1": "禁用 Brave VPN" + }, + "default_value": 1, + "display_name": "Brave VPN", + "allow_recommend": false, + "enabled": true + } + ], + "ExtensionSettings": [ + { + "id": "cjpalhdlnbpafiamejdnhcphjbkeiagm", + "name": "uBlock Origin", + "description": "一款高效的网络请求过滤工具,占用极低的内存和 CPU。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "cfnpidifppmenkapgihekkeednfoenal", + "name": "TrafficLight", + "description": "Bitdefender TrafficLight adds a strong and non-intrusive layer of security to your browsing experience.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "ghgabhipcejejjmhhchfonmamedcbeod", + "name": "Click&Clean", + "description": "当浏览器关闭时,这款应用程序删除你的浏览历史,防止他人跟踪你的网上活动。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "aapbdbdomjkkjkaonfhkkikfgjllcleb", + "name": "Google 翻译", + "description": "浏览网页时可轻松查看翻译版本。由Google翻译小组提供。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": false + }, + { + "id": "mlpapfcfoakknnhkfpencomejbcecdfp", + "name": "IP Domain Country Flag", + "description": "Shows country flag and other IP / domain information in the location bar.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": false + } + ] +} \ No newline at end of file diff --git a/templates/chrome.json b/templates/chrome.json new file mode 100644 index 0000000..5f35e1b --- /dev/null +++ b/templates/chrome.json @@ -0,0 +1,181 @@ +{ + "SingleValues": [ + { + "name": "AutofillAddressEnabled", + "values": { + "0": "禁止使用“自动填充”功能填写地址", + "1": "自动填充地址信息" + }, + "default_value": 0, + "display_name": "自动填充地址信息", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillCreditCardEnabled", + "values": { + "0": "禁止使用“自动填充”功能填写信用卡信息", + "1": "允许使用“自动填充”功能填写信用卡信息" + }, + "default_value": 0, + "display_name": "允许使用“自动填充”功能填写信用卡信息", + "allow_recommend": true, + "enabled": true + }, + { + "name": "DefaultGeolocationSetting", + "values": { + "1": "允许网站跟踪用户的地理位置", + "2": "不允许任何网站跟踪用户的地理位置", + "3": "每次网站尝试跟踪用户的地理位置时都询问我" + }, + "default_value": 2, + "display_name": "默认地理位置设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PasswordManagerEnabled", + "values": { + "0": "禁止使用密码管理器保存密码", + "1": "允许使用密码管理器保存密码" + }, + "default_value": 0, + "display_name": "允许将密码保存到密码管理器", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PaymentMethodQueryEnabled", + "values": { + "0": "始终告诉网站,没有任何已保存的付款方式", + "1": "允许网站检查用户是否有已保存的付款方式" + }, + "default_value": 0, + "display_name": "允许网站查询可用的付款方式", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxAdMeasurementEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 广告衡量设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 广告衡量设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 广告衡量设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxAdTopicsEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 广告主题设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 广告主题设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 广告主题设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxPromptEnabled", + "values": { + "0": "不向用户显示 Privacy Sandbox 提示", + "1": "允许 Google Chrome 确定是否显示 Privacy Sandbox 提示" + }, + "default_value": 0, + "display_name": "选择是否可向用户显示 Privacy Sandbox 提示", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrivacySandboxSiteEnabledAdsEnabled", + "values": { + "0": "为您的用户停用 Privacy Sandbox 网站建议采用的广告设置", + "1": "允许用户在其设备上开启或关闭 Privacy Sandbox 网站建议采用的广告设置" + }, + "default_value": 0, + "display_name": "选择是否可以停用 Privacy Sandbox 网站建议采用的广告设置", + "allow_recommend": true, + "enabled": true + } + ], + "ExtensionSettings": [ + { + "id": "cjpalhdlnbpafiamejdnhcphjbkeiagm", + "name": "uBlock Origin", + "description": "一款高效的网络请求过滤工具,占用极低的内存和 CPU。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "cfnpidifppmenkapgihekkeednfoenal", + "name": "TrafficLight", + "description": "Bitdefender TrafficLight adds a strong and non-intrusive layer of security to your browsing experience.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "ghgabhipcejejjmhhchfonmamedcbeod", + "name": "Click&Clean", + "description": "当浏览器关闭时,这款应用程序删除你的浏览历史,防止他人跟踪你的网上活动。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": true + }, + { + "id": "aapbdbdomjkkjkaonfhkkikfgjllcleb", + "name": "Google 翻译", + "description": "浏览网页时可轻松查看翻译版本。由Google翻译小组提供。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": false + }, + { + "id": "mlpapfcfoakknnhkfpencomejbcecdfp", + "name": "IP Domain Country Flag", + "description": "Shows country flag and other IP / domain information in the location bar.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://clients2.google.com/service/update2/crx", + "enabled": false + } + ] +} \ No newline at end of file diff --git a/templates/edge.json b/templates/edge.json new file mode 100644 index 0000000..f8bcce8 --- /dev/null +++ b/templates/edge.json @@ -0,0 +1,271 @@ +{ + "SingleValues": [ + { + "name": "AlternateErrorPagesEnabled", + "values": { + "0": "不会调用 Web 服务,并且将显示标准错误页", + "1": "使用 Web 服务针对网络错误生成 URL 和搜索建议" + }, + "default_value": 0, + "display_name": "找不到网页时建议类似页面", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillAddressEnabled", + "values": { + "0": "不会建议或填写地址信息", + "1": "使用以前存储的信息自动填写 Web 表单中的地址信息" + }, + "default_value": 0, + "display_name": "启用地址自动填充", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillCreditCardEnabled", + "values": { + "0": "不会建议、填充或推荐新的付款方式", + "1": "允许用户使用以前存储的信息在 Web 窗体中自动完成信用卡或借记卡等付款方式" + }, + "default_value": 0, + "display_name": "启用付款方式自动填充", + "allow_recommend": true, + "enabled": true + }, + { + "name": "AutofillMembershipsEnabled", + "values": { + "0": "无法在使用 Microsoft Edge 时自动保存其成员身份信息并用于填写表单字段", + "1": "自动保存其成员身份信息,并在使用 Microsoft Edge 时用于填写表单字段" + }, + "default_value": 0, + "display_name": "保存和填充成员身份", + "allow_recommend": true, + "enabled": true + }, + { + "name": "ConfigureDoNotTrack", + "values": { + "0": "不会发送请求", + "1": "始终向要求跟踪信息的网站发送 Do Not Track 请求" + }, + "default_value": 1, + "display_name": "配置 Do Not Track", + "allow_recommend": true, + "enabled": true + }, + { + "name": "ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled", + "values": { + "0": "无效果", + "1": "启用来自其他商店的允许扩展" + }, + "default_value": 1, + "display_name": "配置“允许来自其他商店的扩展”设置的默认状态", + "allow_recommend": true, + "enabled": true + }, + { + "name": "DefaultGeolocationSetting", + "values": { + "1": "允许网站跟踪用户的物理位置", + "2": "不允许任何网站跟踪用户的物理位置", + "3": "每当网站想要跟踪用户的物理位置时询问" + }, + "default_value": 2, + "display_name": "默认地理位置设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "DiagnosticData", + "values": { + "0": "关闭", + "1": "必需数据", + "2": "可选数据" + }, + "default_value": 1, + "display_name": "发送有关浏览器使用情况的必需和可选诊断数据", + "allow_recommend": true, + "enabled": true + }, + { + "name": "EdgeShoppingAssistantEnabled", + "values": { + "0": "不会自动针对零售域应用价格比较、优惠券、折扣和快速结帐等购物功能", + "1": "价格比较、优惠券、折扣和快速结帐等购物功能将自动应用于零售域" + }, + "default_value": 0, + "display_name": "已启用在 Microsoft Edge 中购物的功能", + "allow_recommend": true, + "enabled": true + }, + { + "name": "EdgeWalletCheckoutEnabled", + "values": { + "0": "用户在 Microsoft Edge 上购物时无法使用电子钱包结帐", + "1": "可以选择在 Microsoft Edge 上购物时是否使用电子钱包结帐" + }, + "default_value": 0, + "display_name": "启用电子钱包结帐功能", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PasswordManagerEnabled", + "values": { + "0": "无法保存并添加新密码", + "1": "可以在 Microsoft Edge 中保存并添加其密码" + }, + "default_value": 0, + "display_name": "允许将密码保存到密码管理器", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PaymentMethodQueryEnabled", + "values": { + "0": "禁止检查可用的付款方式", + "1": "可以检查用户是否保存了付款方式" + }, + "default_value": 0, + "display_name": "允许网站查询可用的付款方式", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PersonalizationReportingEnabled", + "values": { + "0": "禁止将浏览数据发送给 Microsoft", + "1": "允许将浏览数据发送给 Microsoft" + }, + "default_value": 0, + "display_name": "允许将浏览数据发送给 Microsoft", + "allow_recommend": true, + "enabled": true + }, + { + "name": "PrimaryPasswordSetting", + "values": { + "0": "自动", + "1": "使用设备密码", + "2": "使用自定义主密码", + "3": "自动填充关闭" + }, + "default_value": 3, + "display_name": "配置要求用户在使用密码自动填充时输入设备密码的设置", + "allow_recommend": true, + "enabled": true + }, + { + "name": "RelatedMatchesCloudServiceEnabled", + "values": { + "0": "可以在受限网站上的“查找页面”中接收相关匹配项", + "1": "可以在所有网站上的“查找页面”中接收相关匹配项" + }, + "default_value": 0, + "display_name": "在“在页面查找”中配置相关匹配项", + "allow_recommend": true, + "enabled": true + }, + { + "name": "ResolveNavigationErrorsUseWebService", + "values": { + "0": "使用本机 API 尝试解决网络连接和导航问题", + "1": "使用 Web 服务执行网络连接测试" + }, + "default_value": 0, + "display_name": "启用使用 Web 服务解决导航错误", + "allow_recommend": true, + "enabled": true + }, + { + "name": "ShowMicrosoftRewards", + "values": { + "0": "禁用 Microsoft Rewards 体验", + "1": "开启 Microsoft Rewards 体验" + }, + "default_value": 0, + "display_name": "展示 Microsoft Rewards体验", + "allow_recommend": true, + "enabled": true + }, + { + "name": "TabServicesEnabled", + "values": { + "0": "不会向选项卡组织服务发送任何数据", + "1": "用户创建选项卡组或激活某些“组相似选项卡”功能时,Microsoft Edge 会将选项卡数据发送到其选项卡组织服务" + }, + "default_value": 0, + "display_name": "启用选项卡组织建议", + "allow_recommend": true, + "enabled": true + } + ], + "ExtensionSettings": [ + { + "id": "odfafepnkmbhccpbejgmiehpchacaeak", + "name": "uBlock Origin", + "description": "一款高效的网络请求过滤工具,占用极低的内存和 CPU。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx", + "enabled": true + }, + { + "id": "dacknjoogbepndbemlmljdobinliojbk", + "name": "Click&Clean", + "description": "当浏览器关闭时,这款应用程序删除你的浏览历史,防止他人跟踪你的网上活动。", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx", + "enabled": true + }, + { + "id": "mhjnajgcbhkdhnfgcfjimgdddjjondoc", + "name": "IP Domain Country Flag", + "description": "Shows country flag and other IP / domain information in the location bar.", + "modes": { + "blocked": "阻止安装", + "allowed": "允许安装", + "force_installed": "强制安装", + "normal_installed": "默认安装", + "removed": "移除" + }, + "default_mode": "normal_installed", + "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx", + "enabled": false + } + ], + "SearchEngines": [ + { + "number": "1", + "name": "Google", + "keyword": "google.com", + "is_default": true, + "search_url": "{google:baseURL}search?q={searchTerms}&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchboxStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:prefetchSource}{google:searchClient}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}", + "enabled": true + }, + { + "number": "2", + "name": "Bing", + "keyword": "bing.com", + "is_default": false, + "search_url": "{bing:baseURL}search?q={searchTerms}&{bing:cvid}{bing:msb}{google:assistedQueryStats}", + "enabled": false + } + ] +} \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..c226dbb --- /dev/null +++ b/utils.py @@ -0,0 +1,10 @@ +# coding: utf8 +import json +from pathlib import Path + + +def read_template(browser: str) -> dict: + filepath = Path(__file__).parent / "templates" / f"{browser}.json" + if not filepath.exists(): + return {} + return json.loads(filepath.read_text("utf8")) diff --git a/wg_browser_page.py b/wg_browser_page.py new file mode 100644 index 0000000..d377178 --- /dev/null +++ b/wg_browser_page.py @@ -0,0 +1,98 @@ +# coding: utf8 +from PySide6 import QtWidgets, QtCore +from utils import read_template +from gbx_setting import GbxSetting +from gbx_extension import GbxExtension +from gbx_search_engine import GbxSearchEngine + + +class WgBrowserPage(QtWidgets.QWidget): + + def __init__(self, browser: str, pre_path: str, parent=None): + super().__init__(parent) + self.browser = browser + self.pre_path = pre_path + + self.vly_m = QtWidgets.QVBoxLayout() + self.setLayout(self.vly_m) + temp = read_template(browser) + + self.gbx_settings = [] + self.gbx_extensions = [] + self.gbx_search_engines = [] + + if "SingleValues" in temp: + for setting in temp["SingleValues"]: + gbx_set = GbxSetting(setting, self) + self.vly_m.addWidget(gbx_set) + self.gbx_settings.append(gbx_set) + + if "ExtensionSettings" in temp: + for extension in temp["ExtensionSettings"]: + gbx_ext = GbxExtension(extension, self) + self.vly_m.addWidget(gbx_ext) + self.gbx_extensions.append(gbx_ext) + + if "SearchEngines" in temp: + self.bgp_search_engines_default = QtWidgets.QButtonGroup(self) + self.bgp_search_engines_default.setExclusive(True) + + for search_engine in temp["SearchEngines"]: + gbx_search_engine = GbxSearchEngine(search_engine, self) + self.vly_m.addWidget(gbx_search_engine) + self.gbx_search_engines.append(gbx_search_engine) + self.bgp_search_engines_default.addButton(gbx_search_engine.rbn_default) + + def get_recommended_settings(self): + recommended_settings = [f"[{self.pre_path}\\Recommended]"] + for wg_set in self.gbx_settings: + if wg_set.isChecked() and wg_set.allow_recommend and wg_set.cbx_recommend.isChecked(): + recommended_settings.append(f"\"{wg_set.name}\"=dword:0000000{wg_set.bgp_radios.checkedId()}") + if len(recommended_settings) == 1: + return "" + else: + return "\n".join(recommended_settings) + + def get_settings(self): + settings = [f"[{self.pre_path}]"] + for wg_set in self.gbx_settings: + if wg_set.isChecked(): + if (wg_set.allow_recommend and not wg_set.cbx_recommend.isChecked()) or (not wg_set.allow_recommend): + settings.append(f"\"{wg_set.name}\"=dword:0000000{wg_set.bgp_radios.checkedId()}") + if len(settings) == 1: + return "" + else: + return "\n".join(settings) + + def get_extensions(self): + path_head = f"{self.pre_path}\\ExtensionSettings" + extensions = [] + for wg_ext in self.gbx_extensions: + if wg_ext.isChecked(): + extensions.append(f"[{path_head}\\{wg_ext.id}]") + mode = wg_ext.cmbx_modes.currentData(QtCore.Qt.ItemDataRole.UserRole) + extensions.append(f"\"installation_mode\"=\"{mode}\"") + extensions.append(f"\"update_url\"=\"{wg_ext.lne_update_url.text()}\"") + if len(extensions) == 0: + return "" + else: + return "\n".join(extensions) + + def get_search_engines(self): + # 只生成推荐的 + path_head = f"{self.pre_path}\\Recommended\\ManagedSearchEngines" + search_engines = [] + i = 1 + for wg_se in self.gbx_search_engines: + if wg_se.isChecked(): + search_engines.append(f"[{path_head}\\{i}]") + is_default = "1" if wg_se.rbn_default.isChecked() else "0" + search_engines.append(f"\"is_default\"=dword:0000000{is_default}") + search_engines.append(f"\"keyword\"=\"{wg_se.lne_keyword.text()}\"") + search_engines.append(f"\"name\"=\"{wg_se.lne_name.text()}\"") + search_engines.append(f"\"search_url\"=\"{wg_se.lne_search_url.text()}\"") + i += 1 + if len(search_engines) == 0: + return "" + else: + return "\n".join(search_engines)