From 7fdea66d03f841087591e404d1b0970f4e5e905b Mon Sep 17 00:00:00 2001 From: BarsTiger Date: Sat, 12 Nov 2022 19:29:31 +0200 Subject: [PATCH] Init repo - gui can launch and first pad list generates from list in pads settings! --- .gitignore | 7 + KotoPad.py | 15 + gui/__init__.py | 0 gui/gui.py | 246 ++++++ gui/gui.ui | 661 ++++++++++++++++ gui/images.qrc | 13 + gui/images_rc.py | 770 +++++++++++++++++++ gui/img/collab.png | Bin 0 -> 979 bytes gui/img/collections.png | Bin 0 -> 1382 bytes gui/img/download.png | Bin 0 -> 771 bytes gui/img/explorer.png | Bin 0 -> 568 bytes gui/img/kotopad.ico | Bin 0 -> 41662 bytes gui/img/menu.png | Bin 0 -> 310 bytes gui/img/pads.png | Bin 0 -> 1093 bytes gui/img/settings.png | Bin 0 -> 1358 bytes gui/img/stream.png | Bin 0 -> 1456 bytes gui/modules/__init__.py | 0 gui/modules/core/__init__.py | 0 gui/modules/core/blur.py | 133 ++++ gui/modules/core/popup.py | 26 + gui/modules/handlers/__init__.py | 0 gui/modules/handlers/register.py | 15 + gui/modules/initialize/__init__.py | 0 gui/modules/initialize/setup_ui.py | 24 + gui/modules/initialize/styles.py | 593 ++++++++++++++ gui/modules/menu/__init__.py | 1 + gui/modules/menu/handlers.py | 11 + gui/modules/menu/menu.py | 41 + gui/modules/pads/__init__.py | 1 + gui/modules/pads/fill_pads_from_settings.py | 33 + gui/modules/pads/handlers.py | 16 + gui/modules/pads/initialize_pads_settings.py | 18 + modules/__init__.py | 0 modules/config/__init__.py | 1 + modules/config/model.py | 8 + modules/config/settings.py | 42 + requirements.txt | 9 + 37 files changed, 2684 insertions(+) create mode 100644 .gitignore create mode 100644 KotoPad.py create mode 100644 gui/__init__.py create mode 100644 gui/gui.py create mode 100644 gui/gui.ui create mode 100644 gui/images.qrc create mode 100644 gui/images_rc.py create mode 100644 gui/img/collab.png create mode 100644 gui/img/collections.png create mode 100644 gui/img/download.png create mode 100644 gui/img/explorer.png create mode 100644 gui/img/kotopad.ico create mode 100644 gui/img/menu.png create mode 100644 gui/img/pads.png create mode 100644 gui/img/settings.png create mode 100644 gui/img/stream.png create mode 100644 gui/modules/__init__.py create mode 100644 gui/modules/core/__init__.py create mode 100644 gui/modules/core/blur.py create mode 100644 gui/modules/core/popup.py create mode 100644 gui/modules/handlers/__init__.py create mode 100644 gui/modules/handlers/register.py create mode 100644 gui/modules/initialize/__init__.py create mode 100644 gui/modules/initialize/setup_ui.py create mode 100644 gui/modules/initialize/styles.py create mode 100644 gui/modules/menu/__init__.py create mode 100644 gui/modules/menu/handlers.py create mode 100644 gui/modules/menu/menu.py create mode 100644 gui/modules/pads/__init__.py create mode 100644 gui/modules/pads/fill_pads_from_settings.py create mode 100644 gui/modules/pads/handlers.py create mode 100644 gui/modules/pads/initialize_pads_settings.py create mode 100644 modules/__init__.py create mode 100644 modules/config/__init__.py create mode 100644 modules/config/model.py create mode 100644 modules/config/settings.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0fd54a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/.idea/ +/venv/ +/build/ +/dist/ +/tests/ +/data/ +*.spec diff --git a/KotoPad.py b/KotoPad.py new file mode 100644 index 0000000..2e239c1 --- /dev/null +++ b/KotoPad.py @@ -0,0 +1,15 @@ +import sys +from PyQt5 import QtWidgets +from gui.gui import Ui_MainWindow +from gui.modules.initialize import setup_ui + + +app = QtWidgets.QApplication(sys.argv) +MainWindow = QtWidgets.QMainWindow() +ui = Ui_MainWindow() +ui.setupUi(MainWindow) +setup_ui.on_load(ui, MainWindow) + +MainWindow.show() + +sys.exit(app.exec_()) diff --git a/gui/__init__.py b/gui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gui/gui.py b/gui/gui.py new file mode 100644 index 0000000..1ddffdc --- /dev/null +++ b/gui/gui.py @@ -0,0 +1,246 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'gui.ui' +# +# Created by: PyQt5 UI code generator 5.15.7 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(815, 500) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/img/img/kotopad.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + MainWindow.setWindowIcon(icon) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.centralwidget_lay = QtWidgets.QHBoxLayout(self.centralwidget) + self.centralwidget_lay.setContentsMargins(0, 0, 5, 5) + self.centralwidget_lay.setObjectName("centralwidget_lay") + self.menu = QtWidgets.QListWidget(self.centralwidget) + self.menu.setMinimumSize(QtCore.QSize(64, 0)) + self.menu.setMaximumSize(QtCore.QSize(64, 16777215)) + self.menu.setFocusPolicy(QtCore.Qt.NoFocus) + self.menu.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.menu.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.menu.setAutoScroll(False) + self.menu.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) + self.menu.setTabKeyNavigation(False) + self.menu.setProperty("showDropIndicator", False) + self.menu.setIconSize(QtCore.QSize(32, 32)) + self.menu.setTextElideMode(QtCore.Qt.ElideRight) + self.menu.setResizeMode(QtWidgets.QListView.Fixed) + self.menu.setObjectName("menu") + item = QtWidgets.QListWidgetItem() + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(":/img/img/menu.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + item.setIcon(icon1) + self.menu.addItem(item) + item = QtWidgets.QListWidgetItem() + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(":/img/img/pads.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + item.setIcon(icon2) + self.menu.addItem(item) + item = QtWidgets.QListWidgetItem() + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(":/img/img/explorer.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + item.setIcon(icon3) + self.menu.addItem(item) + item = QtWidgets.QListWidgetItem() + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(":/img/img/collections.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + item.setIcon(icon4) + self.menu.addItem(item) + item = QtWidgets.QListWidgetItem() + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap(":/img/img/stream.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + item.setIcon(icon5) + self.menu.addItem(item) + item = QtWidgets.QListWidgetItem() + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(":/img/img/collab.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + item.setIcon(icon6) + self.menu.addItem(item) + item = QtWidgets.QListWidgetItem() + icon7 = QtGui.QIcon() + icon7.addPixmap(QtGui.QPixmap(":/img/img/download.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + item.setIcon(icon7) + self.menu.addItem(item) + item = QtWidgets.QListWidgetItem() + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap(":/img/img/settings.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + item.setIcon(icon8) + self.menu.addItem(item) + self.centralwidget_lay.addWidget(self.menu) + self.content = QtWidgets.QStackedWidget(self.centralwidget) + self.content.setObjectName("content") + self.pads_page = QtWidgets.QWidget() + self.pads_page.setObjectName("pads_page") + self.pads_page_lay = QtWidgets.QVBoxLayout(self.pads_page) + self.pads_page_lay.setContentsMargins(0, 0, 0, 0) + self.pads_page_lay.setObjectName("pads_page_lay") + self.pads_content = QtWidgets.QTabWidget(self.pads_page) + self.pads_content.setTabPosition(QtWidgets.QTabWidget.North) + self.pads_content.setTabShape(QtWidgets.QTabWidget.Rounded) + self.pads_content.setMovable(True) + self.pads_content.setObjectName("pads_content") + self.pads_collection_1_tab = QtWidgets.QWidget() + self.pads_collection_1_tab.setMaximumSize(QtCore.QSize(16777215, 16777215)) + self.pads_collection_1_tab.setObjectName("pads_collection_1_tab") + self.pads_page_1_tab_lay = QtWidgets.QVBoxLayout(self.pads_collection_1_tab) + self.pads_page_1_tab_lay.setContentsMargins(0, 0, 0, 0) + self.pads_page_1_tab_lay.setObjectName("pads_page_1_tab_lay") + self.pads_collection_1_widget = QtWidgets.QWidget(self.pads_collection_1_tab) + self.pads_collection_1_widget.setObjectName("pads_collection_1_widget") + self.pads_collection_1_lay = QtWidgets.QGridLayout(self.pads_collection_1_widget) + self.pads_collection_1_lay.setObjectName("pads_collection_1_lay") + self.pads_page_1_tab_lay.addWidget(self.pads_collection_1_widget) + self.pads_content.addTab(self.pads_collection_1_tab, "") + self.pads_collection_2_tab = QtWidgets.QWidget() + self.pads_collection_2_tab.setObjectName("pads_collection_2_tab") + self.pads_collection_2_tab_lay = QtWidgets.QVBoxLayout(self.pads_collection_2_tab) + self.pads_collection_2_tab_lay.setObjectName("pads_collection_2_tab_lay") + self.pads_collection_2_widget = QtWidgets.QWidget(self.pads_collection_2_tab) + self.pads_collection_2_widget.setMaximumSize(QtCore.QSize(16777215, 16777215)) + self.pads_collection_2_widget.setObjectName("pads_collection_2_widget") + self.pads_collection_2_lay = QtWidgets.QGridLayout(self.pads_collection_2_widget) + self.pads_collection_2_lay.setObjectName("pads_collection_2_lay") + self.pads_collection_2_tab_lay.addWidget(self.pads_collection_2_widget) + self.pads_content.addTab(self.pads_collection_2_tab, "") + self.edit_pads_tab = QtWidgets.QWidget() + self.edit_pads_tab.setObjectName("edit_pads_tab") + self.verticalLayout = QtWidgets.QVBoxLayout(self.edit_pads_tab) + self.verticalLayout.setObjectName("verticalLayout") + self.edit_collections_label = QtWidgets.QLabel(self.edit_pads_tab) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.edit_collections_label.sizePolicy().hasHeightForWidth()) + self.edit_collections_label.setSizePolicy(sizePolicy) + self.edit_collections_label.setObjectName("edit_collections_label") + self.verticalLayout.addWidget(self.edit_collections_label) + self.edit_pads_collections_widget = QtWidgets.QWidget(self.edit_pads_tab) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.edit_pads_collections_widget.sizePolicy().hasHeightForWidth()) + self.edit_pads_collections_widget.setSizePolicy(sizePolicy) + self.edit_pads_collections_widget.setObjectName("edit_pads_collections_widget") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.edit_pads_collections_widget) + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout.setObjectName("horizontalLayout") + self.edit_first_pads_collection_widget = QtWidgets.QWidget(self.edit_pads_collections_widget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.edit_first_pads_collection_widget.sizePolicy().hasHeightForWidth()) + self.edit_first_pads_collection_widget.setSizePolicy(sizePolicy) + self.edit_first_pads_collection_widget.setObjectName("edit_first_pads_collection_widget") + self.edit_first_pads_collection_lay = QtWidgets.QVBoxLayout(self.edit_first_pads_collection_widget) + self.edit_first_pads_collection_lay.setContentsMargins(0, 0, 0, 0) + self.edit_first_pads_collection_lay.setObjectName("edit_first_pads_collection_lay") + self.edit_first_pads_collection_label = QtWidgets.QLabel(self.edit_first_pads_collection_widget) + self.edit_first_pads_collection_label.setObjectName("edit_first_pads_collection_label") + self.edit_first_pads_collection_lay.addWidget(self.edit_first_pads_collection_label) + self.edit_first_pads_collection_list = QtWidgets.QListWidget(self.edit_first_pads_collection_widget) + self.edit_first_pads_collection_list.setStyleSheet("font: 15pt \"Segoe UI\";") + self.edit_first_pads_collection_list.setEditTriggers(QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed|QtWidgets.QAbstractItemView.SelectedClicked) + self.edit_first_pads_collection_list.setDragEnabled(False) + self.edit_first_pads_collection_list.setObjectName("edit_first_pads_collection_list") + self.edit_first_pads_collection_lay.addWidget(self.edit_first_pads_collection_list) + self.horizontalLayout.addWidget(self.edit_first_pads_collection_widget) + self.edit_second_pads_collection_widget = QtWidgets.QWidget(self.edit_pads_collections_widget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.edit_second_pads_collection_widget.sizePolicy().hasHeightForWidth()) + self.edit_second_pads_collection_widget.setSizePolicy(sizePolicy) + self.edit_second_pads_collection_widget.setObjectName("edit_second_pads_collection_widget") + self.edit_first_pads_collection_lay_2 = QtWidgets.QVBoxLayout(self.edit_second_pads_collection_widget) + self.edit_first_pads_collection_lay_2.setContentsMargins(0, 0, 0, 0) + self.edit_first_pads_collection_lay_2.setObjectName("edit_first_pads_collection_lay_2") + self.edit_second_pads_collection_label = QtWidgets.QLabel(self.edit_second_pads_collection_widget) + self.edit_second_pads_collection_label.setObjectName("edit_second_pads_collection_label") + self.edit_first_pads_collection_lay_2.addWidget(self.edit_second_pads_collection_label) + self.edit_second_pads_collection_list = QtWidgets.QListWidget(self.edit_second_pads_collection_widget) + self.edit_second_pads_collection_list.setStyleSheet("font: 15pt \"Segoe UI\";") + self.edit_second_pads_collection_list.setEditTriggers(QtWidgets.QAbstractItemView.DoubleClicked|QtWidgets.QAbstractItemView.EditKeyPressed|QtWidgets.QAbstractItemView.SelectedClicked) + self.edit_second_pads_collection_list.setDragEnabled(True) + self.edit_second_pads_collection_list.setObjectName("edit_second_pads_collection_list") + self.edit_first_pads_collection_lay_2.addWidget(self.edit_second_pads_collection_list) + self.horizontalLayout.addWidget(self.edit_second_pads_collection_widget) + self.verticalLayout.addWidget(self.edit_pads_collections_widget) + self.pads_content.addTab(self.edit_pads_tab, "") + self.pads_page_lay.addWidget(self.pads_content) + self.content.addWidget(self.pads_page) + self.browser_page = QtWidgets.QWidget() + self.browser_page.setObjectName("browser_page") + self.content.addWidget(self.browser_page) + self.collections_page = QtWidgets.QWidget() + self.collections_page.setObjectName("collections_page") + self.content.addWidget(self.collections_page) + self.stream_page = QtWidgets.QWidget() + self.stream_page.setObjectName("stream_page") + self.content.addWidget(self.stream_page) + self.collab_page = QtWidgets.QWidget() + self.collab_page.setObjectName("collab_page") + self.content.addWidget(self.collab_page) + self.download_page = QtWidgets.QWidget() + self.download_page.setObjectName("download_page") + self.content.addWidget(self.download_page) + self.settings_page = QtWidgets.QWidget() + self.settings_page.setObjectName("settings_page") + self.content.addWidget(self.settings_page) + self.centralwidget_lay.addWidget(self.content) + MainWindow.setCentralWidget(self.centralwidget) + + self.retranslateUi(MainWindow) + self.menu.setCurrentRow(-1) + self.pads_content.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "KotoPad")) + __sortingEnabled = self.menu.isSortingEnabled() + self.menu.setSortingEnabled(False) + item = self.menu.item(0) + item.setText(_translate("MainWindow", "Close menu")) + item = self.menu.item(1) + item.setText(_translate("MainWindow", "Pads")) + item = self.menu.item(2) + item.setText(_translate("MainWindow", "Explorer")) + item = self.menu.item(3) + item.setText(_translate("MainWindow", "Collections")) + item = self.menu.item(4) + item.setText(_translate("MainWindow", "Stream")) + item = self.menu.item(5) + item.setText(_translate("MainWindow", "Collab")) + item = self.menu.item(6) + item.setText(_translate("MainWindow", "Download")) + item = self.menu.item(7) + item.setText(_translate("MainWindow", "Settings")) + self.menu.setSortingEnabled(__sortingEnabled) + self.pads_content.setTabText(self.pads_content.indexOf(self.pads_collection_1_tab), _translate("MainWindow", "Pads collection 1")) + self.pads_content.setTabText(self.pads_content.indexOf(self.pads_collection_2_tab), _translate("MainWindow", "Pads collection 2")) + self.edit_collections_label.setText(_translate("MainWindow", "Double click row to add path to file")) + self.edit_first_pads_collection_label.setText(_translate("MainWindow", "Pads collection 1")) + self.edit_second_pads_collection_label.setText(_translate("MainWindow", "Pads collection 2")) + self.pads_content.setTabText(self.pads_content.indexOf(self.edit_pads_tab), _translate("MainWindow", "Edit pads")) +import gui.images_rc + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) diff --git a/gui/gui.ui b/gui/gui.ui new file mode 100644 index 0000000..5fd7132 --- /dev/null +++ b/gui/gui.ui @@ -0,0 +1,661 @@ + + + MainWindow + + + + 0 + 0 + 815 + 500 + + + + KotoPad + + + + :/img/img/kotopad.ico:/img/img/kotopad.ico + + + +QWidget { + background-color: rgb(30, 30, 30); + color: rgb(255, 255, 255); + font: 10pt "Segoe UI"; +} +QScrollBar:vertical, +QScrollBar:horizontal { + border: none; + background: rgb(30, 30, 30); + width: 10px; + margin: 15px 0 15px 0; + border-radius: 0px; +} +QScrollBar::handle:vertical, +QScrollBar::handle:horizontal { + background-color: rgb(139, 139, 139); + min-height: 30px; + border-radius: 5px; +} +QScrollBar::handle:vertical:hover, +QScrollBar::handle:vertical:pressed, +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:horizontal:pressed { + background-color: rgb(149, 149, 149); +} +QScrollBar::sub-line:vertical, +QScrollBar::add-line:vertical, +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + height: 0px; +} +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal, +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} +QPushButton { + color: white; + border-width: 1px; + border-radius:6px; + border-style: solid; + border-color: #303030; + background-color: #2c2d2e; +} +QPushButton:hover { + border-width: 2px; + background-color: #323232; +} +QPushButton:pressed { + background-color: #262728; +} +QPushButton:disabled { + background-color: #434343; + border-color: #0000; +} +QLineEdit, QTextBrowser, QPlainTextEdit, QTextEdit { + border-width: 1px; + border-radius: 5px; + border-style: solid; + border-color: #303030; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QListWidget { + border-width: 1px; + border-radius: 15px; + border-style: solid; + border-color: #303030; + padding: 10px; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QListWidget:item { + background-color: #242424; + selection-color: white; +} +QListWidget:item:hover { + background-color: #323232; +} +QListWidget:item:selected { + background-color: #777777; +} +QComboBox +{ + border-width: 1px; + border-radius:6px; + border-style: solid; + border-color: #303030; + background-color: #2c2d2e; + color: #ffffff; +} +QComboBox::disabled +{ + background-color: #434343; + color: #656565; + border-color: #434343; +} +QComboBox:hover +{ + background-color: #323232; +} +QComboBox:on +{ + background-color: #434343; +} +QComboBox QAbstractItemView +{ + background-color: #434343; + color: #ffffff; + selection-background-color: #777777; + selection-color: white; + outline: 0; +} +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + border-radius: 6px; +} +QTabBar::tab +{ + background-color: #2c2d2e; + color: #ffffff; + border-style: solid; + border-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-color: #303030; + padding: 5px; +} +QTabBar::tab:disabled +{ + background-color: #656565; + color: #656565; +} +QTabWidget::pane +{ + background-color: #a0a0a0; + color: #ffffff; + border: 3px solid; + border-radius: 15px; + border-color: #1c1c1c; +} +QTabBar::tab:selected +{ + background-color: #262728; + color: #ffffff; + border-style: solid; + border-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-color: #303030; + padding: 5px; +} +QTabBar::tab:selected:disabled +{ + background-color: #404040; + color: #656565; +} +QTabBar::tab:!selected +{ + background-color: #262626; +} +QTabBar::tab:!selected:hover +{ + background-color: #323232; +} +QTabBar::tab:top:!selected +{ + margin-top: 3px; +} +QTabBar::tab:bottom:!selected +{ + margin-bottom: 3px; +} +QTabBar::tab:top, QTabBar::tab:bottom +{ + min-width: 8ex; + margin-right: -1px; + padding: 5px 10px 5px 10px; +} +QTabBar::tab:top:selected +{ + border-bottom-color: none; +} +QTabBar::tab:bottom:selected +{ + border-top-color: none; +} +QTabBar::tab:top:last, QTabBar::tab:bottom:last, +QTabBar::tab:top:only-one, QTabBar::tab:bottom:only-one +{ + margin-right: 0; +} +QTabBar::tab:left:!selected +{ + margin-right: 3px; +} +QTabBar::tab:right:!selected +{ + margin-left: 3px; +} +QTabBar::tab:left, QTabBar::tab:right +{ + min-height: 8ex; + margin-bottom: -1px; + padding: 10px 5px 10px 5px; +} +QTabBar::tab:left:selected +{ + border-left-color: none; +} +QTabBar::tab:right:selected +{ + border-right-color: none; +} +QTabBar::tab:left:last, QTabBar::tab:right:last, +QTabBar::tab:left:only-one, QTabBar::tab:right:only-one +{ + margin-bottom: 0; +} + +QSpinBox { + border-width: 1px; + border-radius: 5px; + border-style: solid; + border-color: #303030; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QSpinBox::up-button { + border: none; + background: none; +} +QSpinBox::down-button { + border: none; + background: none; +} + +QToolBox::tab { + border-style: solid; + border-width: 1px; + border-radius: 5px; + border-color: #303030; +} + + + + + + 0 + + + 0 + + + 5 + + + 5 + + + + + + 64 + 0 + + + + + 64 + 16777215 + + + + Qt::NoFocus + + + +QListWidget { + border-width: 0px; + border-radius: 0px; + border: none; + padding: 0px; + background-color: #191919; + font: 10pt "Segoe UI"; +} +QListWidget:item { + padding-left: 12px; + height: 60px; + background-color: #191919; + selection-color: rgba(255, 255, 255); +} +QListWidget:item:hover { + background-color: #323232; +} +QListWidget:item:selected { + background-color: #262728; +} + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + false + + + QAbstractItemView::NoEditTriggers + + + false + + + false + + + + 32 + 32 + + + + Qt::ElideRight + + + QListView::Fixed + + + -1 + + + + Close menu + + + + :/img/img/menu.png:/img/img/menu.png + + + + + Pads + + + + :/img/img/pads.png:/img/img/pads.png + + + + + Explorer + + + + :/img/img/explorer.png:/img/img/explorer.png + + + + + Collections + + + + :/img/img/collections.png:/img/img/collections.png + + + + + Stream + + + + :/img/img/stream.png:/img/img/stream.png + + + + + Collab + + + + :/img/img/collab.png:/img/img/collab.png + + + + + Download + + + + :/img/img/download.png:/img/img/download.png + + + + + Settings + + + + :/img/img/settings.png:/img/img/settings.png + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QTabWidget::North + + + QTabWidget::Rounded + + + 0 + + + true + + + + + 16777215 + 16777215 + + + + Pads collection 1 + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + Pads collection 2 + + + + + + + 16777215 + 16777215 + + + + + + + + + + Edit pads + + + + + + + 0 + 0 + + + + Double click row to add path to file + + + + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Pads collection 1 + + + + + + + font: 15pt "Segoe UI"; + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked + + + false + + + + + + + + + + + 0 + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Pads collection 2 + + + + + + + font: 15pt "Segoe UI"; + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gui/images.qrc b/gui/images.qrc new file mode 100644 index 0000000..e50b2c4 --- /dev/null +++ b/gui/images.qrc @@ -0,0 +1,13 @@ + + + img/kotopad.ico + img/download.png + img/stream.png + img/collab.png + img/collections.png + img/explorer.png + img/menu.png + img/pads.png + img/settings.png + + diff --git a/gui/images_rc.py b/gui/images_rc.py new file mode 100644 index 0000000..d0984ba --- /dev/null +++ b/gui/images_rc.py @@ -0,0 +1,770 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2) +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore + +qt_resource_data = b"\ +\x00\x00\x02\x38\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x01\xed\x49\x44\x41\x54\x78\x9c\xed\xd9\xbd\x6a\ +\x15\x51\x14\xc5\xf1\xff\x56\x8b\x80\x22\x88\x16\x82\x3e\x41\xaa\ +\x08\xa9\xb4\x13\x04\xb5\x14\x3b\x6d\x7c\x06\x8b\x20\x04\x44\x90\ +\xd8\xfb\x0a\x36\x82\x90\x4e\xfc\x80\x80\x85\xd8\x88\xd8\x58\x88\ +\x44\x92\x26\x70\x05\x31\x22\xdc\x44\x30\xba\x2c\x4c\x11\x2f\x23\ +\xcc\x1e\xce\xcc\x91\x9b\xf5\x83\x74\x7b\xef\xb3\x67\x85\x39\xdc\ +\x9b\x80\x99\x99\x99\x99\x99\x99\x59\x2b\x92\x66\x25\x3d\x90\xb4\ +\x26\xe9\x4b\xc3\xcf\xaa\xa4\x87\x92\xe6\x6a\xef\x5a\x9c\xa4\x0b\ +\x92\xc6\x6a\xe7\xa7\xa4\x3b\x92\x0e\xd6\xde\xbb\x08\x49\x87\x25\ +\x8d\x5a\x3e\xfc\x5e\x2b\x92\x4e\xd6\xde\xbf\x49\x64\x8a\x25\x5d\ +\x05\x1e\x75\x3c\xeb\x13\x70\x1b\x78\x0e\x7c\xed\x38\xa3\xc9\x76\ +\x44\x7c\x2f\x38\xef\xdf\x24\x2d\x74\xf8\xed\xf7\xed\x97\xa4\xd7\ +\x92\x2e\x75\x79\xa6\x03\xc9\xfa\x43\x5d\x0e\xe9\x59\x00\xf3\xc0\ +\x63\x49\x37\xb2\xcd\xd9\x00\xfe\x67\x01\xdc\x97\x74\x3c\xd3\x34\ +\x4d\x01\x00\x1c\x01\x52\xaf\xc2\xb4\x05\x00\x70\x3a\x53\x3c\x8d\ +\x01\xa4\x3e\x73\x64\x2f\xb5\x65\xe0\x43\xb2\x67\x68\xef\x32\xc5\ +\xd9\x00\x66\x80\x63\xc9\x9e\xa1\xcd\x64\x8a\xb3\x01\x5c\x06\xee\ +\x26\x7b\x86\xb6\x08\xbc\x6d\x5b\x3c\x8d\x77\x40\x8a\x03\xa8\xbd\ +\x40\x6d\x0e\xa0\xf6\x02\xb5\x39\x80\xda\x0b\xd4\xd6\xc7\xd7\xdb\ +\x0d\xe0\x29\xf0\xb9\xf0\xdc\x13\xc0\x45\xe0\x54\xc9\xa1\xa5\x03\ +\x78\x03\x9c\x8f\x88\x6f\x85\xe7\x02\x20\xe9\x28\xf0\x02\x38\x53\ +\x6a\x66\xe9\x57\xe0\x5e\x5f\x0f\x0f\xb0\x3b\x7b\xa9\xe4\xcc\xd2\ +\x01\xac\x17\x9e\xd7\x64\xad\xe4\x30\x5f\x82\x7d\x1f\x20\xe9\x2c\ +\xdd\x2f\xae\x8d\x88\x78\x55\x72\x9f\x49\x43\xfc\x91\xf3\x26\x70\ +\xa5\x63\xef\x32\xd0\x6b\x00\xfb\xfe\x15\x70\x00\xb5\x17\xa8\xcd\ +\x01\x24\xeb\x77\x7a\xd9\xa2\xac\x1f\x99\xe2\x6c\x00\x1f\x93\xf5\ +\x35\xac\x66\x8a\xb3\x01\x3c\x01\x46\xc9\x9e\x21\x8d\x80\x67\x99\ +\x86\x54\x00\x11\x31\x06\xae\x03\x5b\x99\xbe\x81\x6c\x01\xd7\x76\ +\x77\x6c\x2d\xfd\x41\x28\x22\x56\x24\xcd\x03\xb7\x80\x73\xfc\xfd\ +\x7f\x82\xa6\x3b\x62\x0c\x6c\x66\xcf\xd9\xd3\x3b\x69\x67\x62\xde\ +\x26\xf0\x92\x3f\x5f\xc4\xde\x77\x3c\xc7\xcc\xcc\xcc\xcc\xcc\xcc\ +\xf6\x95\xdf\xae\xe1\x7e\x3b\xac\x1c\xda\x2f\x00\x00\x00\x00\x49\ +\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x03\x03\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x02\xb8\x49\x44\x41\x54\x78\x9c\xed\x9a\x3b\x6b\ +\x14\x51\x18\x86\x9f\x2f\x78\xc1\xc2\x42\xc5\x4e\x7f\x80\x06\x24\ +\x90\xa0\x2e\x49\x21\x01\xb1\xb5\xb0\xb0\xd1\x4e\xb1\x0b\x88\xbf\ +\xc2\x80\x45\x22\xa2\x20\x36\xda\x58\x88\x45\xda\x20\x48\xc0\x4b\ +\x50\x10\x35\xfe\x01\x25\xe0\xb5\x89\xc5\x1a\x93\xbc\x16\xbb\x42\ +\xdc\xcc\xee\x5c\xf6\x9b\x39\x63\xf6\x3c\xd5\xe6\x30\x67\xbf\xe7\ +\x7b\x39\x73\xc9\x99\x85\x48\x24\x12\x89\x44\x22\x91\x1c\x48\x9a\ +\x94\xb4\x24\x69\x43\xe1\xd9\x90\xf4\x5e\xd2\x64\x91\x5e\xac\x40\ +\xf3\x87\x81\x25\x60\x6f\x91\x82\x25\xb2\x02\x0c\x9b\xd9\xc7\x3c\ +\x93\x86\x0a\x14\x9a\xa6\x7e\xcd\x43\xcb\xe9\x7a\xde\x49\xb9\x56\ +\x80\xa4\x71\x60\x21\xef\xbc\x8a\x39\x65\x66\x4f\xb3\x1e\x9c\xb9\ +\x11\x49\x43\xc0\x22\x30\x5a\xc4\xaa\x42\xde\x00\x63\x66\xb6\x9e\ +\xe5\xe0\x1d\x39\xbe\xf8\x32\xc9\xcd\xbf\x00\x6e\xe4\xf8\x1e\x4f\ +\xae\x02\x27\x3b\xc6\x46\x80\x4b\xc0\x6d\xb7\x2a\x92\xf6\x49\xfa\ +\x9a\x70\x05\x5e\x97\x34\xe6\x56\x28\xbf\xd7\x88\xa4\xb5\x04\xaf\ +\xef\x92\x0e\x78\x16\x9a\xed\x72\x0b\xf2\x4b\xb9\xb8\xdb\x9d\x2e\ +\x6e\x33\x5e\x05\x8e\x4a\x5a\x4d\x28\xf0\x43\xd2\x41\x97\x22\xfd\ +\xf9\xed\x97\xf4\x2d\xc1\x6f\x4d\xd2\x31\x8f\x02\x73\x5d\x12\x9e\ +\x72\xf0\x77\x41\xd2\x54\x17\xc7\xb9\xb4\xb9\xa9\x77\x01\x49\x4d\ +\x60\x77\xc7\xf0\x0a\x70\x05\xf8\x5d\x4c\xd9\x9d\x9d\xb4\x2e\x7a\ +\x9d\xcf\x27\x4d\x33\xdb\xd3\x6b\x62\x96\x00\xd4\x87\x58\x70\xcc\ +\xac\x67\x8f\x45\x9e\x04\xb7\x15\x31\x80\xd0\x02\xa1\x89\x01\x84\ +\x16\x08\xcd\xc0\x07\x90\xe7\x9f\x21\x6f\xd6\x80\x97\xed\xcf\x27\ +\x42\xb9\x84\x5a\x01\x2b\x40\xc3\xcc\x26\xcc\x6c\x02\x18\x07\x7e\ +\x86\x10\x09\x15\xc0\x8c\x99\xbd\xfa\xfb\x87\x99\x2d\x02\xb3\x21\ +\x44\x42\x05\xf0\x2e\x61\xec\x6d\xe5\x16\x84\x0b\x60\x23\x61\x2c\ +\xd3\x0e\x8e\x37\x03\x7f\x17\x88\x01\x84\x16\x08\x4d\x0c\x20\xb4\ +\x40\x68\x06\x3e\x80\x2a\x76\x84\x1e\x03\x8f\x80\xd5\x4d\x63\xcf\ +\xcd\xec\x53\x47\x9d\x43\x40\x63\xd3\xd0\x2e\xe0\x1c\x70\xb6\x9f\ +\xe2\x69\x3b\x42\xa9\x74\xd9\x6c\xcc\xca\xbc\xa4\xc2\x02\x92\x4c\ +\xd2\x93\x7e\x04\xd2\x6a\x94\x7d\x0a\x2c\x98\x59\xe1\x15\xd4\x9e\ +\xfb\xcc\xd1\x67\x0b\x65\x07\x70\x46\xad\x77\x8a\x85\x68\xcf\x3d\ +\xed\xe8\xb3\x85\xb2\x03\x68\x00\x77\x8b\x84\xd0\x3e\x75\x6e\x02\ +\xc7\xdd\xad\x72\x8a\x78\x70\x2f\x4f\x08\x6a\x9d\xfb\xb7\x3c\x0a\ +\xd7\x25\x00\x29\x63\x08\x72\x6c\x5e\xaa\x57\x00\x52\x4a\x08\x72\ +\x6e\x5e\xaa\x5f\x00\x52\x97\x10\x54\x42\xf3\x52\x3d\x03\x90\x3a\ +\x42\x50\x49\xcd\x4b\xe9\x01\x84\x7c\x37\xf8\x10\xb8\xd6\xfe\x3c\ +\x0d\x9c\x2f\xa3\x48\xda\x93\x60\x7c\x39\x5a\x95\x48\x5d\xc9\x12\ +\xc0\xff\xbc\x02\x92\xf6\x1e\xff\x21\x4b\x00\x5f\x1c\x44\x42\xf1\ +\x39\xed\x80\x2c\x01\xcc\x3b\x88\x84\x22\xd5\x3d\xcb\x45\x70\x18\ +\x78\xcd\xd6\x9f\xc9\xd4\x9d\x26\x30\x6a\x66\x1f\x7a\x1d\x94\xba\ +\x02\xcc\x6c\x09\xb8\x08\xfc\x72\x12\xab\x82\x26\x70\x21\xad\xf9\ +\x5c\xa8\xf5\x73\xb9\x07\x92\x96\xcb\x78\x60\x71\x62\x59\xd2\x7d\ +\x49\x47\xdc\x1a\x8f\x44\x22\x91\x48\x24\xb2\x6d\xf9\x03\x83\x15\ +\x47\xb9\xdf\x18\xff\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x01\x36\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\xeb\x49\x44\x41\x54\x78\x9c\xed\xd8\x31\x6e\ +\xc2\x50\x10\x45\xd1\x3b\xe9\x91\x10\x69\x53\x53\x86\x32\x4b\xc8\ +\x96\xb2\x8a\x78\x1f\x28\x3b\x80\x3a\x3d\x2d\xa4\x4d\x8b\x14\x67\ +\x01\x9f\x02\x17\xd6\xe7\xd3\xc1\x88\x84\x7b\xca\xb1\x8b\x37\xd6\ +\xb8\x79\x20\x49\x92\x24\xe9\x1e\x45\x6b\x58\x4a\x79\x02\x3a\xe0\ +\x15\x98\xa4\x26\xba\xbc\x5f\x60\x05\xbc\x45\xc4\xae\x7e\x78\xf2\ +\x01\x86\xe5\x37\xc0\xec\xfa\xd9\x52\xed\x81\xe7\x88\xf8\x1e\x0f\ +\x1f\x1a\x2f\x76\xfc\xbf\xe5\xe1\xb8\xd3\x7b\x3d\x6c\x5d\x40\xcf\ +\xdf\x3f\xfb\x73\x7e\x22\x62\x3a\x1e\xb4\x2e\xa0\x24\x85\xb9\x09\ +\xad\x0f\xb0\x4e\x4f\x91\x67\x55\x0f\x5a\xbf\xc0\x1c\xf8\x04\x1e\ +\x33\x12\x25\xda\x03\x2f\x11\xf1\x35\x1e\x9e\x5c\x40\x44\x6c\x81\ +\x05\xb0\x04\xfa\x9c\x6c\x57\xd5\x03\x1f\x34\x96\x97\x24\x49\xf7\ +\xcd\x3e\xa0\x1e\xd8\x07\xd8\x07\xd8\x07\xd8\x07\xa4\xa7\xc8\x63\ +\x1f\x60\x1f\x20\x49\x92\x34\xb0\x0f\xa8\x07\xf6\x01\xf6\x01\xf6\ +\x01\xf6\x01\xe9\x29\xf2\xd8\x07\xd8\x07\x48\x92\x24\x49\x12\x70\ +\x00\x67\x69\x63\x5e\x7b\xf6\xed\x1f\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +\x00\x00\x03\xd3\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x03\x88\x49\x44\x41\x54\x78\x9c\xed\x9b\xcf\x6f\ +\x15\x55\x14\xc7\x3f\xa7\x8a\x45\x4d\x88\x06\x89\x06\x1a\x2d\xb5\ +\x44\xaa\x60\x63\x62\x8d\x5d\x68\x52\x03\x09\x3b\x03\x1b\x70\x23\ +\x0b\x13\x36\x54\x53\xd6\x24\x24\x24\x4a\xba\x20\x60\x52\xbb\xd1\ +\x7f\x40\x16\xc0\x92\x85\xae\x8c\x58\x5d\x18\x7f\x44\x4a\x5d\x50\ +\xda\x40\x42\x15\xd1\x14\x9b\xda\xa6\xa4\x5f\x17\x73\xd1\x47\x33\ +\xd3\xbe\x99\x77\x66\xe6\xbd\x74\x3e\xc9\x4d\xe6\xdd\xde\xf7\x3d\ +\x67\xbe\xef\xdc\x7b\xe7\xcd\x9b\x42\x45\x45\x45\xc5\x3a\xc6\xca\ +\x4e\x00\x40\xd2\x0b\xc0\x69\xe0\x45\x47\xd9\x45\xe0\x3c\x70\xd2\ +\xcc\xee\x39\xea\xfa\x22\x69\xa3\xa4\x6b\xca\x8f\x13\xab\xc5\x2f\ +\xbd\x02\x24\x0d\x02\x23\xe1\xe5\x57\xc0\x6f\x4e\xd2\xfd\x40\x07\ +\x70\x17\xe8\x32\xb3\x3b\x4e\xba\x7e\x48\x6a\x97\x74\x23\x7c\x52\ +\xb7\x24\x3d\xe6\xa8\x7d\xb0\xa6\x0a\x3e\xf4\xd2\x75\x45\xd2\xfb\ +\x35\x49\x0e\x39\x6b\xb7\x49\xfa\x39\x68\xff\x2d\x69\x4b\xdc\xb8\ +\xd2\xa6\x80\x24\x03\x26\x81\xce\xd0\xf5\x35\xb0\xe0\x1c\xe6\x79\ +\x60\x7b\x38\x3e\x65\x66\xc7\x9d\xf5\x1b\x43\x52\x9f\xa4\xe9\xfc\ +\xd6\xbf\x07\x98\x88\xcb\x61\xcd\x0a\x90\xd4\x06\xec\x04\x1e\x75\ +\x3a\xef\x65\x60\xd2\xcc\x66\xef\x9b\x00\x5c\x06\x36\x38\xe9\x27\ +\x31\x6d\x66\x9d\x6b\x0f\xab\x41\x52\x87\xa4\x5f\x72\xf8\x34\xe6\ +\x25\xbd\x5b\x13\xe7\x6c\x0e\x31\x56\x32\x15\x77\x8e\xab\x56\x80\ +\xa4\xf3\xc0\x81\x54\xae\xd5\xcf\x02\xb0\xc3\xcc\x6e\x4a\x7a\x86\ +\x68\x3d\xf0\xaa\xb2\x38\x62\x2b\x20\xd1\x00\x49\xbd\xc0\x0f\x61\ +\xcc\x17\xc0\x67\x4e\x89\x74\x01\xc3\xe1\x78\xd4\xcc\x06\x43\xbc\ +\x33\xc0\x31\xa7\x18\x71\xa4\x36\xe0\x02\xb0\x1f\x10\xf0\x8a\x99\ +\xfd\xe4\x95\x89\xa4\x31\xe0\x75\xa2\xcb\xd5\xee\x84\x2a\xf8\x3e\ +\xbc\xce\xc2\x53\xc0\xc0\x8a\xbe\xfa\xd7\x00\x49\xbd\x92\x96\xc3\ +\xdc\xb9\x24\xe9\x49\xe7\x76\xa8\x66\x6e\x7e\x52\x13\x77\xa4\xa6\ +\xff\x48\xc6\x93\x47\xd2\x1b\xf5\xae\x01\x49\x02\xe7\x32\x2f\x35\ +\xe9\x59\x90\xf4\x74\x88\x3b\x50\xd3\x5f\x88\x01\x6d\x09\x1a\xaf\ +\x65\x0d\x9e\x81\x76\xa0\x37\x1c\xcf\x14\x18\x17\x48\x36\xa0\xe8\ +\x2b\xc4\xa4\x3c\x72\xe7\xe1\xb2\x02\xd7\x41\x8f\xa4\x3d\x19\xdf\ +\xbb\xbb\xde\x81\xcd\x6c\xc0\x50\x68\xb9\x52\x5a\xe9\x35\x0b\x69\ +\x2b\xe0\x02\xf0\x79\xc6\x58\x5b\x80\xd1\x14\xe3\x3f\x05\xbe\xcc\ +\x18\xab\x07\x38\x99\xf1\xbd\x20\x69\x2a\x61\xcb\xca\x7c\x63\x41\ +\xd2\x73\xab\x6c\x85\xfb\xc2\x98\x9e\x66\xd9\x06\xd7\x0d\x95\x01\ +\x65\x27\x50\x36\x69\x17\xc1\xb7\x24\x0d\xaf\x3d\x2c\x96\x4d\x29\ +\xc7\xef\x97\xd4\x95\x31\x56\x47\xbd\x03\xd3\x1a\xd0\x1f\x5a\x11\ +\xec\x0b\x2d\x57\xd6\xfd\x14\x48\x6b\xc0\x47\x96\x11\xfe\xbf\xfb\ +\xdb\x54\x54\x15\x50\x76\x02\x65\xd3\xaa\x06\xcc\x01\x7f\x79\x08\ +\xb5\xa2\x01\xb3\x40\x37\xb0\x0d\xb8\xda\xa8\x58\xda\x6d\xf0\xa8\ +\xa4\x77\x0a\x8a\x95\xc4\x1c\xf0\xa7\x99\x2d\x49\xba\x4d\xf4\xc5\ +\x27\x33\x69\x93\x7a\x22\xb4\x32\xd9\x06\x5c\x96\x34\x0b\xbc\xd9\ +\xa8\x58\x33\xdf\x10\x59\x8d\x3e\x2f\xa1\x56\x5c\x03\xee\x23\x0f\ +\x91\x56\x34\x60\x1e\xd8\x05\x6c\x05\xa6\x1b\x15\x6b\x45\x03\x7e\ +\x07\xc6\xcd\x6c\x06\xf8\xb5\x51\x31\xcf\x35\xe0\x1b\x60\x1c\x38\ +\x4c\xbe\x3f\x75\x77\x02\x17\x25\xfd\x01\xec\x6d\x54\xcc\xcb\x80\ +\x45\x60\x8f\x99\xfd\xa3\xe8\xc9\x8f\xf7\x9c\x74\x93\x78\xdb\x4b\ +\xc8\x6b\x0a\x3c\x02\xbc\xac\xe8\x21\xa7\x97\x9c\x34\x0b\xc1\xab\ +\x02\x0c\xf8\x96\xa8\x12\xda\x9d\x34\x0b\xc1\x7b\x11\x6c\xa9\x93\ +\x07\x5f\x03\xae\x11\xdd\xc7\x77\xd9\x9f\x8b\xc2\xcb\x80\x25\xa0\ +\xcf\xcc\xf6\x92\xfd\x87\x93\x52\xf0\x32\xa0\x0d\xd8\xac\xe8\x89\ +\xb2\xcd\x4e\x9a\xde\x7c\x17\xd7\xe9\xb5\x08\x3e\x04\xfc\x08\xdc\ +\x01\x9e\x6d\x40\xe7\x3a\xf0\xaa\x4b\x46\x0f\x72\x0f\xb8\x12\xf7\ +\x07\xcf\x0b\xa1\xc7\x43\xcb\x8c\x99\x2d\x10\x3d\x1b\x54\x18\xad\ +\x78\x29\xec\x4a\x65\x40\xd9\x09\x94\x4d\x65\x40\x42\x7f\xd1\xff\ +\x63\xb3\x54\x70\xbc\xff\x48\xda\x05\x3e\x06\x3e\x20\xda\xde\xf2\ +\x66\x02\x18\x2b\x20\x4e\x45\x45\x45\x45\xc5\x4a\xfe\x05\x1d\xf3\ +\xed\xaf\x60\xc7\x60\x1b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x04\x45\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x03\xfa\x49\x44\x41\x54\x78\x9c\xed\x9a\x4d\x88\ +\x56\x55\x18\xc7\xff\x67\x34\x1d\x52\xca\xd4\xc9\x9a\xa2\x32\x50\ +\x17\x8a\x09\x42\x28\x58\x18\xcc\x46\xcc\xd9\x0d\x81\xa0\xb8\x8a\ +\xa4\x0f\x03\x17\xa2\x50\x04\x12\xcc\x26\x42\x5b\xb9\x30\xa8\x95\ +\x54\x9b\x98\x45\x41\x0b\xc9\x5a\x85\x0b\x4b\x67\x91\xa5\xe2\x07\ +\x65\xe8\xa0\x82\x33\xc3\xa4\xf6\x6b\x71\xce\x85\x3b\xaf\x77\xde\ +\x7b\xee\x7d\xcf\x7b\xcf\xd5\xb9\x3f\xb8\x30\x1f\xf7\x3c\xcf\xf3\ +\x3f\xf7\xdc\x73\x9e\xe7\xdc\x23\x35\x34\x34\x34\x34\x34\x34\xcc\ +\x56\x4c\x2c\xc7\xc0\x6a\x49\xaf\xba\x18\x7e\x34\xc6\x8c\xc6\x8a\ +\xa5\x32\x80\xf9\xc0\x10\xf0\x03\xf7\x73\x12\x78\x13\x58\x10\x3b\ +\xce\xe0\x00\x2b\x80\x61\xe0\x5a\x86\xf0\x56\x6e\x02\x47\x80\x35\ +\xb1\xe3\xee\x08\x60\x0e\xb0\xcd\x3d\xed\xff\x3c\x84\x67\x71\x12\ +\xd8\x09\x3c\x12\x5b\x8f\x37\x40\x3f\xb0\x0f\xb8\x54\x52\x74\x16\ +\x7f\x63\x47\xd0\x0b\xb1\xf5\x65\x02\xf4\x00\x03\xc0\x57\xc0\x9d\ +\x80\xc2\x5b\xb9\x87\x1d\x51\x43\xc0\x9c\xd8\xba\x05\x3c\x01\xec\ +\x01\xce\x75\x51\xf4\x4c\x5c\x01\x3e\x02\x9e\x8c\x21\x7c\x3d\x76\ +\xa2\x9a\x88\x20\xbc\x95\x29\xec\xc8\x1b\x00\xba\xb7\xac\x03\x8f\ +\x61\x97\xa9\x5f\x63\xaa\xcd\xe1\x77\xec\xfc\xb3\x38\xa4\x70\x03\ +\x7c\x0c\xdc\x8e\x2a\xad\x18\xb7\x81\x83\x78\x8c\x88\xdc\x1b\x80\ +\x41\x49\xdf\x06\xe9\xcd\xea\x19\x34\xc6\x8c\xb4\xbb\xa1\xc7\xc3\ +\x48\x7f\xa0\x60\x62\x90\x1b\xbb\xcf\x08\x58\x2a\xe9\x17\x49\xcb\ +\x43\x44\x54\x21\x17\x24\xbd\x6c\x8c\xb9\xde\xee\xa6\xdc\x11\xe0\ +\x0c\xac\x95\xf4\x8e\xa4\x33\x61\x62\xeb\x2a\xa3\x92\xde\x95\xb4\ +\x36\x4f\x7c\x29\xa8\xd7\x12\x98\x50\xcd\x52\xd8\xd2\x11\x8b\xb0\ +\x49\xd0\x9f\x11\x85\xc7\x4b\x86\x52\x1d\x51\x55\x1a\x9c\x50\xaf\ +\x74\x38\x0d\xf0\x34\x36\x11\xb9\xd8\x05\xe1\xf5\x2e\x88\xd2\x60\ +\x4b\xe1\x01\x60\x84\xf2\xa5\x70\xc2\xcf\xd8\xa7\x5d\xaf\x92\x18\ +\x9b\x21\xce\xf5\xb8\x6f\x05\xf0\x09\x30\x56\x40\xf4\x98\x6b\xb3\ +\xd2\xc3\xfe\x5c\xaa\x9a\xf8\x9c\xc3\xc7\xb1\x35\xc1\x19\xe0\xaa\ +\x1b\x96\xb9\x39\x02\xed\xb7\xc3\x12\x92\x6d\xb1\x47\x3d\xec\xa5\ +\xf7\x1d\xfe\x70\x3f\x2f\x0d\xa3\x32\xdb\xe1\x06\xe0\x0b\x60\x32\ +\x23\xf0\x7b\xd8\xe1\xbe\x15\xc8\xcd\x2d\x80\x75\xc0\x61\xe0\x94\ +\xbb\x3e\x03\xd6\x79\xb4\xeb\x71\x3e\x46\x80\xbb\x19\x71\x4c\xba\ +\x18\x37\x84\x51\x6d\x9d\xf6\x02\xdf\xb7\x1f\xb1\xd3\xb8\x00\x1c\ +\x00\x96\x05\x8c\x61\x19\xb0\xdf\xd9\xf6\xe5\x3b\xa0\x37\x84\xf3\ +\x9d\x05\x9c\xa6\x99\x02\x8e\x01\x9b\x29\xf1\x8e\x62\xe7\x98\xcd\ +\xce\xc6\x54\xc9\x18\x76\xe4\xf9\xf1\x29\x86\xca\x32\x4f\xd2\x1b\ +\x92\x8e\x4b\x1a\xc5\x26\x4d\x8b\xf2\x1a\x61\x13\xac\xf7\x64\x53\ +\xda\xe3\xce\xc6\xbc\x92\x31\x50\xb2\xdd\xb4\x80\x7a\xdd\x70\x0a\ +\xc1\x38\xf0\x39\xb0\x85\xd4\xf0\x74\x3e\xb6\xb8\xff\x8d\x07\xf2\ +\x15\xe6\x15\x48\x05\xd9\x6e\x12\x2c\xcb\x55\x77\x85\x62\x12\xf8\ +\x12\xd8\x18\x4c\x78\x46\x47\xa4\x97\xc1\xba\xd0\xfd\x65\x70\x86\ +\xce\xd8\x84\xad\x01\xfe\x8d\x20\xfa\x2e\x36\xa7\xd8\x46\x95\x89\ +\xd0\x0c\x1d\xf1\x94\x7b\x02\x45\x96\xa9\xb2\xfc\x85\x4d\xbe\x9e\ +\x8b\x2a\x3a\x0b\xa6\x57\x86\x59\x89\x4a\x59\xd2\x15\x60\x6e\xfa\ +\x5d\x0b\x80\x67\xb0\xb5\xfa\x3f\x1d\x08\xbf\x01\x1c\x02\x5e\x8c\ +\xad\xe7\x3e\x80\x3e\xfc\x6b\x80\xed\xc0\x89\x02\xc2\x4f\xb8\x36\ +\xf3\x3d\xec\x2f\x07\xfa\xc2\xa8\xf2\x80\xe9\x5b\x62\x85\x86\x26\ +\xb0\x0a\xfb\xfe\x66\x55\x86\xb7\x9c\xdd\x97\x3c\xec\xb4\xbe\x6a\ +\xdd\xdd\x12\x03\x16\x02\x6f\x03\xa7\xdb\x3c\xb5\xcb\xc0\x87\x40\ +\xee\x56\x34\xb0\x00\xd8\x05\x1c\x75\xd7\x2e\x60\xa1\x47\xbb\x7e\ +\xe7\xe3\x72\x9b\x38\x4e\xbb\x58\x73\xed\xf9\x8a\xef\xa3\xd8\xec\ +\x7e\x07\xf8\x26\xd4\xd3\xc0\xd6\x04\x03\xce\x66\x91\xe5\xf6\x3c\ +\x21\xf2\x02\x60\x77\x01\xa7\xad\x9c\x05\xf6\x02\x4b\x4a\xf8\x5d\ +\xe2\xda\x9e\xed\xc0\xff\x5b\x21\x3a\x60\xb0\x83\x00\x12\x92\x3a\ +\x3d\x37\x45\x05\x36\x12\x2e\xe5\x7e\x3d\xcf\x9f\xcf\x97\x21\x23\ +\xe9\xa0\xa4\xf7\x25\x85\x38\xc0\xf4\x9b\xa4\xaf\x65\x2b\xbd\x8b\ +\xee\x6f\xcf\x4b\x7a\x4d\xd2\x90\xec\x47\x98\x4e\x99\x90\xf4\xa9\ +\xa4\x0f\x8c\x31\x9d\x57\x84\xd2\x03\xf7\x79\xbc\xf0\x2b\x57\xb4\ +\x33\xea\xf4\x75\xa8\xfa\xaf\x42\xa9\x8e\x88\x7d\x44\x66\x18\x78\ +\xb6\x52\xd1\x33\x74\x44\x8c\x43\x52\xf5\xac\x09\xe8\xce\x31\xb9\ +\x64\xfb\xbd\xfe\x5f\x85\x12\x98\xad\x07\x25\xb3\x60\x36\x1e\x95\ +\xcd\x82\x1a\x1e\x96\x8e\x79\x5c\x7e\x8d\xa4\x57\xdc\xaf\x3f\x19\ +\x63\x1e\x84\xd3\x27\x0d\x0d\x0d\x0d\x0d\x0d\x0d\x0f\x11\xff\x03\ +\x5f\xf3\x27\x33\x6c\xb2\x97\x13\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x05\xb0\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x05\x65\x49\x44\x41\x54\x78\x9c\xed\x9a\x4b\x8c\ +\x15\x45\x18\x85\xab\x07\x79\xc8\x63\x00\x11\x14\x70\x20\x01\xa3\ +\x40\x06\xd8\x88\x22\x8a\x31\x2a\xc2\x42\x23\x18\x13\xd4\x18\x16\ +\x6a\x74\x21\xc6\x9d\x8a\x31\xc6\x68\x22\xca\xce\xa5\x41\x45\xd0\ +\xf8\xd6\x88\x46\x21\x12\xe4\x11\x71\x23\x02\x0e\x20\xe0\x60\x10\ +\x1f\x80\x46\x03\x8a\x8a\x93\x00\x9f\x8b\xee\x61\xfa\x9e\xae\xfa\ +\xfb\xf6\xbd\x3d\xea\xa2\xcf\xae\xee\x9c\xff\x9c\x53\xd5\x5d\xdd\ +\x55\xd5\xe3\x5c\x85\x0a\x15\x2a\x54\xa8\x50\xa1\x42\x85\x0a\x15\ +\xf2\x00\x8c\x02\x9e\x07\xde\x03\x66\xfe\xd7\x79\xba\x01\xcc\x4c\ +\x32\x2d\x07\x46\xf5\x96\xc9\x70\xa0\x83\x1e\xfc\x02\xf4\xeb\x15\ +\xb3\x62\xb9\xfa\x27\x59\xba\xd1\x01\x0c\x2b\xdb\xe4\x6c\xe0\x53\ +\xb2\x18\x59\xaa\x51\x63\xd9\x46\x79\x72\x6d\x06\x06\x94\x69\xb2\ +\xdc\x63\xf2\x72\x69\x06\x4d\x02\x78\xc5\x93\xef\xb9\xb2\xc4\x17\ +\x7a\xc4\x37\x94\x3a\xc2\x4d\x02\xe8\x07\xac\xf3\xe4\xbc\xa3\x59\ +\xe1\xd1\xc0\x31\x11\xfd\x0a\x18\x5a\x52\xf6\xd2\x00\x0c\x03\xf6\ +\x4a\xd6\x63\xc0\xf9\xcd\x88\xbe\x2a\x82\x27\x80\xe9\x25\xe6\x2e\ +\x15\x40\x3b\xf0\x57\x29\x53\x15\xb8\xd2\x73\x4b\x2d\xce\xa9\x69\ +\x01\xa6\x00\xad\x0d\x99\xda\xda\xad\x89\x76\x4b\x0e\xef\x01\xc9\ +\x7c\x1a\xb8\xa2\x11\xc3\x8f\x45\xe8\x73\xa0\x8f\xc1\x1f\x02\x6c\ +\x4a\xb8\x47\x81\x4b\x0a\x9b\x86\xb5\x67\x24\x9a\x24\x1e\x43\x0c\ +\x6e\x1f\x60\x9b\x64\x5f\x5b\xd4\xf0\x52\xcf\xd5\x9f\x65\xf0\xfb\ +\x02\xeb\x85\xbf\xa2\x90\xa9\x9d\x67\x95\x68\xaf\x03\xce\x32\xf8\ +\xb3\x3d\xf9\xeb\xbf\x20\xc0\x4b\x52\xbc\x3e\x87\xbf\xcc\x63\xf8\ +\x58\x81\x3e\xe6\xe5\x79\xdc\xa3\xff\x74\x4e\xcd\x06\xe1\xbf\x58\ +\xaf\xd9\x20\xe0\xb8\x14\xcf\x35\xf8\xb3\x88\xe7\x59\x1a\x5f\x00\ +\x03\x0b\xf6\xd3\xca\x34\x90\xec\x6d\x7d\x0a\xb8\xdc\xa8\x99\x27\ +\xfc\xdf\xea\xca\x04\xdc\x2e\x85\xdf\x11\x78\xf0\x00\x11\xb0\x5d\ +\xf8\x87\x80\x0b\x9a\xe8\x6f\x28\x57\x1b\x70\x58\xbc\xb6\x01\x51\ +\x80\xdf\x02\x7c\x2f\xfc\x85\xf5\x18\xe9\xed\xbf\xd4\xe0\xce\x27\ +\x8b\x6b\x0d\xfe\x04\xe0\xed\x64\x90\xb6\x03\xf7\x62\x3c\x58\x3d\ +\xf5\xd7\x79\xfc\x6e\x32\xf8\xcf\x08\xf7\x85\x7a\x4c\x0e\x4a\xd1\ +\x55\x06\xf7\x13\xe1\x7e\x68\x70\x47\x02\x47\x3c\x1d\xe8\x00\xae\ +\xc9\x0d\xd6\xa3\xf3\x91\xd4\x07\x9f\x4f\xc0\xd5\xc2\x3d\x90\x27\ +\xde\x26\x05\x7f\x02\xfd\x03\xdc\x71\xc4\xf3\x30\x8d\x69\x86\xf6\ +\x83\x9e\xce\xa7\xf1\x2e\x30\xa1\x8e\x01\x98\x2e\x75\xa7\x08\x4c\ +\x39\xe2\x9d\xa2\x2e\x8c\xc6\xa6\x39\x3a\xb7\x27\x4b\x7b\x47\x14\ +\x45\x5d\x81\x2c\x73\xa5\x7e\x67\x14\x45\x1d\x46\x76\xd5\x56\x2c\ +\x70\xce\xed\x06\x9e\x02\x06\x87\x48\x51\x14\x7d\xe9\x9c\xdb\x95\ +\xfa\xa9\xc5\x39\x77\x7d\x80\xdb\xe5\x9c\xdb\x61\xe5\xd0\x01\xb8\ +\x48\xda\xfb\x8c\xc0\xb3\xa5\xbd\xda\xe0\x3a\xe7\x5c\xf0\xbd\x9d\ +\xc2\x00\xe7\xdc\x12\xe7\xdc\x3e\x60\x11\x81\x07\x9c\xc7\x2b\x38\ +\x4d\x5d\xb6\x0f\x35\x7d\xd4\x01\x18\x27\xed\x4e\x43\x78\x8a\xb4\ +\x37\x1a\xdc\xa2\x18\xe3\x9c\x5b\xe9\x9c\xdb\x04\x9c\xe7\xf9\xbb\ +\x7a\x69\x96\x34\xf6\x4b\xbb\xa6\x8f\x3a\x00\x7a\xeb\x1d\x33\x84\ +\xc7\x4b\xfb\x47\x83\xdb\x28\x66\x3b\xe7\x7c\x2b\x4a\xf5\xd2\x2c\ +\x69\x1c\x95\x76\xcd\x32\x5a\x07\x40\xd7\xd8\xc7\x0d\x61\xe5\x1e\ +\x36\xb8\xcd\x60\x1e\x70\x8e\xfc\x76\x48\xda\xd6\xe6\xeb\x77\x8b\ +\xab\x03\xa0\xed\xd3\x86\xb0\x72\x4f\x1a\xdc\x66\x10\x39\xe7\xf4\ +\xec\x51\xbd\xac\x1d\xa2\xf6\xa1\x25\xd8\x70\xd9\x2b\x1e\xdc\x75\ +\x79\xb8\xa3\x0d\x6e\x33\xd8\x1a\x45\xd1\x11\xf9\x6d\x4c\x4e\x96\ +\x34\xf4\xee\xa8\xe1\xea\x00\xfc\x91\x53\x9c\x86\xce\xc3\xde\x18\ +\x80\x83\xce\xb9\x45\x9e\xdf\x75\x00\x7e\x30\x34\xf4\xf4\xaa\x66\ +\x4a\xe8\x00\xe8\xdc\x9a\x68\x08\xef\x95\x76\x70\x63\xd2\x00\xba\ +\x9c\x73\xcb\x9c\x73\xd3\xa2\x28\xda\xe3\xf9\xbb\x7a\x69\x96\x34\ +\x74\x71\x55\xd3\x47\x1d\x80\xaf\xa5\x7d\xb1\x21\xbc\x45\xda\xc1\ +\x35\x79\x41\xac\x76\xce\xb5\x47\x51\xf4\x50\x14\x45\xfa\x00\x0b\ +\x79\x69\x96\x34\xb4\x0f\xda\xc7\x1e\x00\x17\xca\xb2\xf1\x28\x81\ +\xcd\x0a\x30\xd9\xb3\x24\xd5\x75\x44\x9a\xbf\x34\x67\x29\xbc\x0b\ +\x98\x63\x74\xa4\x5b\x67\x3c\xd9\x25\xb8\xf7\x42\x11\x9f\x0e\xe9\ +\xa1\x6e\x78\xb9\x4d\xbc\xbd\xfd\x59\x0a\x82\x27\x29\xc4\xfb\xfe\ +\x34\x82\x87\x0e\xc0\x24\xe2\x43\x55\xc5\xaf\xc0\x62\x8c\x13\x1e\ +\xd1\xd1\xdd\xea\x56\x83\xab\x27\x5b\x47\x08\xaf\x2e\xcf\x14\xbd\ +\x29\x45\x8f\x18\xdc\xbb\x85\x7b\x12\x98\x6a\xf0\xe7\x00\x9d\x09\ +\xf7\x38\xf0\x2c\xd9\x77\xbc\x95\x6d\x1a\xd9\xab\x7f\xa7\xc1\x7f\ +\x54\xb8\xaf\xd5\x63\x72\x8f\x14\xed\x36\xb8\xfd\x80\x6f\x85\xbf\ +\x13\xe3\xd0\x32\xa9\x1b\x01\xf4\xcd\x0d\x53\x5b\xd3\x4a\x3c\x4d\ +\xd2\x38\x60\xe9\x00\x7b\x84\x7f\x57\x3d\x46\x23\x80\x2e\x29\x9c\ +\x61\xf0\x6f\x26\x8b\xf7\xc9\x39\xbe\x2e\x02\xe2\xd3\x9d\x0f\x3c\ +\x3e\xf3\x8d\x9a\xcb\x84\xfb\x37\xf5\xde\x6d\xc4\x7b\xf3\x34\xde\ +\xc8\xe1\xbf\xee\x09\x77\x5f\xc1\x7e\x5a\xfa\xf7\x7b\xf4\xcd\xdb\ +\x19\x78\x4b\xf8\xef\x14\x31\xd4\x03\xc5\x53\x04\x9e\xb4\x09\xbf\ +\x95\xf8\x93\x59\x1a\xab\x0a\xf4\x31\x2f\x8f\x7e\xfc\xdc\x8d\xfd\ +\x6d\x60\x0a\xd9\x67\x45\xf0\x60\x37\x24\xb2\x55\x04\x82\xc7\x5d\ +\x09\xbf\x8d\x78\x4e\x42\xfc\x30\xbc\xa1\x90\xa1\xad\x7d\x63\xa2\ +\x49\xe2\xd1\x96\xc3\x5f\x2b\xd9\x83\x6f\x0a\x4b\x64\x01\x59\x2c\ +\xc8\xa9\x19\x0a\xdc\x02\xb4\x17\x36\xcc\xcf\xd3\x9e\x68\x9b\x1f\ +\x66\x13\x8e\x22\xf8\xac\xc8\x33\xd5\xaf\x3d\x3f\x01\xba\x0e\xff\ +\xdf\x00\x18\x4b\x76\x1d\xb3\x91\xbc\x77\xbf\x21\x38\x99\xec\x1b\ +\x61\x03\x75\x2e\x5a\xfe\x4d\x10\x7f\x9e\xdb\x2c\x59\xbb\x80\x49\ +\xcd\x0a\x2f\xf1\xdc\x52\x2b\x1a\x1e\xd5\x5e\x00\xf1\x0a\x76\xa5\ +\x27\xe7\xc3\x65\x88\xb7\x90\x7d\xa8\x00\x3c\x51\x42\xf6\x52\x00\ +\x3c\xe9\xc9\xb7\x86\xb2\xd6\x22\xc4\x1f\x35\x3a\xc5\xe0\x24\x65\ +\xff\x37\x56\x63\xd9\x86\xd3\xf3\x86\xe8\x46\x27\x70\x6e\xd9\x46\ +\x13\xa9\xfd\x36\x77\x02\x18\x54\xaa\x49\x63\xb9\x06\x53\xbb\xc9\ +\x3a\x4c\x1d\x1f\x58\x1a\x35\x9b\x0a\x6c\x01\xf6\x03\xb7\xf6\x8a\ +\x49\x03\x00\x6e\x03\xbe\x01\x3e\xc3\xd8\x8c\x55\xa8\x50\xa1\x42\ +\x85\x0a\x15\x2a\x54\xa8\x50\xe1\x0c\xfe\x01\xa9\x0d\x76\xe3\x5b\ +\x28\xb0\xb7\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x05\x4e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x05\x03\x49\x44\x41\x54\x78\x9c\xed\x9b\x5f\x68\ +\x96\x55\x1c\xc7\xbf\xc7\xb9\xb4\x3f\x0c\x1b\x92\x66\x13\x49\x88\ +\xc8\xa1\xdb\x72\x53\x23\xd2\x61\x60\x61\xd9\x4d\x66\xdd\x48\x97\ +\x29\xbb\x29\xba\x51\x2a\xa8\x8b\xea\xa6\xa2\x2b\xc5\xae\xd3\x9c\ +\x48\xd4\x65\xac\x6c\x4d\xb3\x36\x4c\xd6\x9f\x0d\x89\x22\x67\x53\ +\xca\x70\x4b\x42\x9d\x95\xfb\x74\x71\xde\x57\x9e\xde\xde\xe7\x7d\ +\xce\x79\xfe\x9c\x6d\xe6\xe7\xe6\x85\xf1\xfb\xbf\xe7\x79\xce\xbf\ +\xdf\x91\xae\xf3\xff\xc6\x84\x74\x06\x2c\x96\xb4\x59\xd2\x0d\x31\ +\x22\x17\x25\xed\x35\xc6\x8c\x85\x8b\x2a\x20\xc0\xe7\x24\xf3\xde\ +\x54\xc7\x59\x08\x40\x1d\x70\xc9\xa1\x00\x3f\x85\x8c\x6b\x56\x40\ +\x5f\x4b\x25\xcd\x75\x90\x5b\x02\x34\x14\x1d\x4c\x99\x90\x05\x58\ +\xe6\x28\x67\x24\x35\x17\x19\x48\x94\xe9\x58\x00\x49\x5a\x5e\x58\ +\x14\x15\xa4\x2a\x00\xd0\x06\x1c\x04\xb6\x7a\xa8\xdd\xe3\x21\xeb\ +\x5c\x00\x60\x2b\x70\x00\x68\xf5\xb0\x9f\x1e\xe0\x5e\xe0\x5c\xe4\ +\xa3\x75\x10\x68\x74\xd0\x3b\xe6\xf0\x01\x2c\xd3\xeb\x60\xaf\x01\ +\x78\x37\xa2\x33\x0e\xac\xca\x27\xcb\x78\xa7\x95\xc9\x97\x39\x05\ +\x74\xd6\xd0\x33\xc0\x1f\x1e\x05\x38\x97\x10\xc7\x6a\xe0\xc7\x2a\ +\x7a\xc5\x15\x01\xe8\x28\x39\x88\xe3\x6f\xe0\x55\xa0\x3e\xa2\xd3\ +\x00\x3c\x0d\x7c\xe4\x91\x7c\x99\x0f\x80\x27\x80\x1b\x23\xf6\x66\ +\x03\x2f\x97\x7c\xc5\x31\x06\xac\xcc\x3b\xf9\xf6\x84\xe4\xa3\xf4\ +\x03\x6b\x80\xd7\x80\xf3\x29\x12\xaf\xe4\x57\x60\x27\xb0\x02\x38\ +\xe2\xa8\xe3\x5c\x84\xc4\xa9\x30\xd0\x22\xa9\x57\xd2\xbc\xac\x85\ +\x0c\xcc\xb8\xa4\x4e\x63\xcc\x37\xb5\x84\x5c\x46\x81\x2e\xcd\xbc\ +\xe4\x25\xe9\x56\x49\xdb\x93\x84\x5c\x0a\xb0\x4f\xd2\x64\xe6\x70\ +\xc2\x33\x29\x69\x7f\x92\x50\x62\x01\x8c\x31\xbd\x92\xde\xce\x23\ +\xa2\xc0\xbc\x65\x8c\xf9\x2c\x49\xc8\x69\x39\x0c\xcc\x91\x34\x20\ +\x69\x45\xd6\xa8\x02\x31\x24\xa9\xdd\x18\x33\x91\x24\xe8\xbc\x1f\ +\x00\x34\x4b\x3a\x26\xb7\x05\xcd\x54\x72\x59\xd2\xaa\xa4\x8f\x5f\ +\x19\xe7\xa9\xb0\x31\x66\x48\xd2\x4b\x69\xa3\x0a\xc8\x0e\xd7\xe4\ +\x25\xcf\x1d\x21\x60\x96\xa4\x1e\x49\xeb\x7d\xa3\x0a\xc4\xc7\x92\ +\x1e\x32\xc6\x38\x7f\xb4\xbd\xb7\xc4\x80\x0e\xd9\xef\xc1\x74\xe4\ +\x6e\x63\xcc\xf7\x3e\x0a\x69\x56\x83\x4f\xa6\xd0\x09\xc5\x46\x5f\ +\x05\xdf\x57\xa0\x51\xd2\x88\xa4\x5b\x7c\x1d\x45\x38\x2a\xa9\x5b\ +\x52\x9f\xa4\x5f\x4a\x7f\xbb\x5d\xd2\x5a\xd9\xe2\xde\x97\xc1\xf6\ +\x69\x49\x77\x1a\x63\xfe\xca\x60\x23\x1e\xe0\x99\x0c\x73\xfa\x93\ +\xc0\xc3\x0e\x3e\x36\x62\x57\x97\x69\x79\xb4\xa8\xe4\xeb\x80\xbe\ +\x94\x41\xf5\x03\xb7\x79\xf8\x5a\x00\x0c\xa4\xf4\xd5\x0d\x38\x3f\ +\xd9\x55\x05\x81\x45\xb2\x5b\x58\xcd\x91\xdf\x56\x49\x37\xbb\x1a\ +\x8e\x30\x22\x3b\x2e\x9f\xf5\x51\x02\xe6\x4b\xea\x97\xdd\x4c\xf5\ +\xe5\x4f\x49\x3f\xc8\x4e\x88\x86\x23\xbf\x27\x8c\x31\x57\xe2\x1c\ +\x36\x61\x97\x9b\x13\x29\x2b\x1f\x47\xe2\x63\x1f\x07\xf0\x48\xce\ +\xb1\x5c\x02\x0e\x03\x4d\xd5\x9c\x75\xe5\xec\x0c\xe0\x48\xda\xe4\ +\x23\x71\x1d\x2d\x20\xae\xae\xb2\xfd\xe8\x30\x58\x5f\xc5\x7f\x56\ +\xba\x73\xb0\x71\x20\x07\x1b\x95\x5c\xcd\xb5\xe8\x6d\xf1\xcc\x4f\ +\x80\xec\x70\x59\x18\x45\x17\x60\x34\x07\x1b\xa7\x73\xb0\x11\x4b\ +\xd1\x05\xc8\xc3\x7e\xa1\x27\xd8\x45\x17\x60\x51\x0e\x36\xee\xc8\ +\xc1\x46\x2c\x45\x17\x60\x6d\x0e\x36\xd6\xe5\x60\x23\x96\x68\x01\ +\x2e\x17\x60\x3f\x8f\x85\xd3\x96\x1c\x6c\x54\xf2\xdf\x9d\x22\xa0\ +\x11\xd8\x0f\x8c\xe4\x3c\xe6\x7a\xaf\xd0\x22\x31\x6d\xca\x39\x96\ +\x93\xd8\x1c\xaf\x1e\xe5\xc5\x4d\x85\x1b\x24\xdd\x25\x3b\x05\x5e\ +\x29\x3b\x1d\x6e\x95\x34\x3f\x45\x1e\x67\x24\x75\x18\x63\xce\x78\ +\x26\xbf\x50\x76\xdf\x61\x71\x0a\x9f\xe7\x65\xa7\xc2\xc3\x92\xbe\ +\x92\x9d\x0a\x7f\x6d\x8c\xf9\x2d\x85\xad\x7f\x05\xe5\x7a\x32\x53\ +\xc9\x00\xb0\xc0\xc3\xcf\x42\xfc\x0e\x53\xa3\x24\x6e\x85\x67\x29\ +\xc0\xf6\x94\x41\x81\x7d\xb5\x12\x5f\x07\xec\x63\xff\x73\x06\x3f\ +\x5e\xcb\xe1\x34\x1b\x22\xa7\x94\x6e\x55\x58\xe6\x0b\xd9\xe9\x6d\ +\x9f\xec\xeb\x21\xd9\xe1\x72\x9d\xec\x47\x73\x75\x06\xdb\xa3\x92\ +\x96\x16\xb6\x21\x22\x49\xc0\x9b\x19\xfe\x3b\x45\xf3\xac\x6f\x3e\ +\x69\xe6\x01\xef\xa7\xd0\x09\x45\x8f\xaf\x82\x57\x01\x80\xd9\x92\ +\xde\xf0\x75\x12\x90\x3d\xa5\x18\x9d\xf1\x7d\x02\x5e\x91\xb4\xc6\ +\x53\x27\x24\xf7\x4b\x7a\xd1\x47\xc1\xe7\x68\xec\x01\x49\x9f\x4a\ +\xaa\xf3\x0c\x2a\x34\x93\x92\x1e\x2c\x1d\xea\x26\xe2\x7a\x38\x3a\ +\x4f\xd2\xa0\xa4\x25\x19\x02\x0b\xc9\xa8\xa4\x16\x97\x9e\x63\xd7\ +\x57\x60\xb7\x66\x4e\xf2\x92\xd4\x24\xe9\x1d\x17\xc1\xc4\x02\x60\ +\x7b\x01\x9f\xca\x1a\xd1\x14\xf0\x38\x0e\x7d\x8c\x2e\x4f\xc0\x63\ +\x39\x04\x33\x55\x6c\x4a\x12\x70\x69\x92\x6a\x95\x74\x48\xb6\xe7\ +\x66\x26\x31\x2e\x69\xbd\x31\x66\xb0\x96\x90\x4b\x8b\xcc\xa0\xa4\ +\x0d\x25\x83\x2e\x1c\x92\x5d\x41\xbe\x2e\xbb\x2a\xcb\xca\x59\x49\ +\x3b\x64\x57\xa4\x9f\x38\xea\x8c\x4b\xda\x90\x94\xbc\x17\xd8\x5e\ +\xc1\xb1\x1a\xd3\xd0\x09\xe0\x79\x6c\x0f\x41\x59\xa7\xdc\x28\xd9\ +\x93\x62\x5a\xfb\x21\xb0\x19\x98\x1b\xb1\x67\x80\xe7\xa8\x7d\xef\ +\x60\x0c\x68\xcf\x2d\xf1\x8a\x22\xb4\x51\xbd\x55\xf6\x3b\xa0\xad\ +\x86\x5e\x1d\x70\xd1\x23\xf9\xdf\xa9\x71\xbe\x07\x2c\x03\x8e\xc7\ +\xe8\x15\xde\x2f\x1c\x2d\xc2\x24\xb0\x07\xb8\xc9\x41\x6f\xd0\xa3\ +\x00\x87\x1d\xec\xd5\x63\xdb\x66\xaf\x04\x4b\x3e\xe2\xbc\x05\xd8\ +\x45\x8d\x06\xe9\x2a\x3a\x7b\x3d\x0a\xb0\xcb\xc3\x6e\x27\xb0\x1b\ +\x98\xde\x1d\x6c\xc0\x0b\x1e\x05\xd8\x16\x2a\xae\x90\x37\x46\x86\ +\x3d\x64\xbf\x2d\x2c\x8a\x0a\x42\x16\x60\xc8\x51\x0e\x0f\xd9\x99\ +\x03\xee\x23\xc1\xb5\x79\x6d\xae\xd4\x99\x71\xdc\x41\xf4\xcb\xa2\ +\x63\x89\x12\xfa\xea\x6c\x93\xec\xd5\xd9\x39\x31\x22\x17\x24\xed\ +\xbb\x66\xaf\xce\x5e\x67\x1a\xf2\x0f\xac\x40\xde\xa1\xce\xa5\x28\ +\x34\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x08\xba\ +\x00\ +\x00\xa2\xbe\x78\x9c\xed\x5d\x5b\x6f\xd4\x56\x10\xf6\x12\x92\x08\ +\x35\x69\xd2\x90\x54\x42\x3c\x04\x09\xa4\x34\x4d\xb8\x88\xab\x10\ +\x21\x01\x2a\x2e\x42\x21\xf7\xd2\x2a\x4d\x02\xa5\x20\xc4\xf5\x01\ +\x10\x14\x84\x9a\x4d\x94\x2c\x9b\x80\xe0\xa1\xd0\x2a\xad\xa2\xb4\ +\x7d\xea\xcf\x80\xd2\x56\xfd\x0d\x6d\x1f\xa2\x52\xa0\x8f\x48\x0d\ +\x34\x40\x58\xf7\x7c\x5e\xaf\x63\x8f\xcf\xae\xed\x5d\xdb\xeb\xf5\ +\x9e\x41\x1f\x30\xf6\x9c\x99\x39\xf3\x79\xcf\xf1\xdd\x92\x14\x61\ +\x7f\x8e\x1f\x97\xd8\xdf\xab\xa4\x1f\x7f\x90\xa4\x77\x25\x49\x7a\ +\x8f\x81\x2d\x92\x7e\x93\x92\xcb\x21\x51\xb6\x6e\xf9\x5b\x49\x08\ +\x11\x22\x44\x88\x10\x21\x42\x84\x08\x09\x9e\x44\xa3\xd1\x8a\x89\ +\x89\x89\xbe\x1b\x37\x6e\xdc\x8b\xc7\xe3\x0f\x19\x9e\x32\x3c\x67\ +\x90\x8b\x04\xe8\xeb\x53\xd6\xff\x9f\xd8\xbf\x77\x59\x2d\x7a\x6e\ +\xde\xbc\xe9\xfb\xde\x2b\x8b\xdb\xc8\xe2\xcf\x30\xcc\x05\xa0\x26\ +\x41\xc3\xbf\x0c\xd3\xac\x46\x0d\x5e\xf3\x10\x8b\xc5\x96\xb3\x58\ +\xdf\x30\xbc\x09\x40\xbf\x83\x8e\x37\x8c\x93\xaf\xd9\x6f\xe7\x1d\ +\x2f\xb8\x98\x9c\x9c\x6c\x63\x31\x1e\x07\xa0\x9f\x85\x86\x47\x0c\ +\x2d\x6e\x72\xc1\xfc\x0d\x31\xbc\x4a\x13\xef\x6f\x6c\x07\x0c\x1d\ +\xe3\xe3\xe3\xcd\xf8\x0d\xb9\x19\x3b\xc8\x82\xbe\xa2\xcf\xac\x06\ +\x9d\xa8\x41\x86\xed\x15\xb5\x1b\x70\x23\xa6\xca\x45\x82\x13\xe3\ +\x0f\x86\xc3\xb2\x2c\x47\xdc\x88\x13\x06\x41\x2d\xd8\xf8\xf4\x11\ +\xab\xcb\x9f\x9c\x7a\x25\x72\xe5\x84\xf9\xde\xc5\x7c\xbc\xa6\x7e\ +\xd9\xf2\xd1\xa9\xa9\xa9\x52\xb7\xfa\x11\x36\x61\xfb\x9d\x65\xac\ +\x46\x63\x9c\xed\xf8\x55\xb6\x63\xd7\xad\x5b\xb7\x6a\x59\xdb\x27\ +\xc4\xdf\x0b\x16\xe7\x43\xb7\xf3\x0f\xab\x60\xfc\x40\xcd\xe8\x7c\ +\x92\xcd\x1c\xcf\xda\x4d\x73\x7e\x6f\x1f\x7b\x91\x77\x98\x05\xc7\ +\x24\xf4\x77\x82\xb9\xc6\x89\x0f\x36\x4f\xbd\x1f\x37\xef\xd3\x8e\ +\x78\x95\x73\xd8\x45\x1d\xbb\xf4\xb5\x5c\x70\x72\x7c\xc2\xda\x7f\ +\x47\xda\xff\x2e\xe6\x8b\xec\x05\xf3\x09\x67\x8e\x9f\xb6\xd9\xb6\ +\x22\x9e\x3c\xc6\xd4\xda\x8a\x39\x23\x77\xc1\x58\x4f\xf8\x98\x43\ +\xad\x6d\xb4\x3b\x4c\xe7\x1f\xb1\x4f\x9b\xbb\xa0\x86\xf4\xf8\x04\ +\x73\x8b\x55\x3b\xf5\xb8\x46\xff\xdb\xb8\xe7\x47\xbe\xc5\x20\xb4\ +\xb6\x0c\x77\x6d\xb4\xf9\x59\xdf\x66\x72\x72\xb2\x3d\x9d\x2d\x7e\ +\x6f\x8c\xaf\x6e\xf8\x65\x78\xa0\xee\x1f\x17\xd3\x39\xc6\x39\xb5\ +\xcf\x0f\x58\x1d\xbe\x64\xb5\xeb\xca\x34\x06\xe1\x1c\x06\x69\xff\ +\xd0\x8a\x8f\x78\xf2\x9c\xb9\xbe\x4d\x13\xb5\xc1\xfe\x17\xf3\xfd\ +\x6d\x91\xd5\xde\x09\x47\xdf\xe0\x1c\x38\xad\x9b\x7a\x6e\x45\x6f\ +\xfb\xd8\x06\x1f\x86\xe3\x97\xdb\xb7\x6f\xd7\xa4\xd6\xe1\x38\x86\ +\xc5\x99\x62\xcb\x17\x02\xd0\xef\xa0\xe3\x35\xc6\xa7\x3b\x77\xee\ +\x54\xa7\xea\x87\x5a\x12\x9b\xe7\x36\xf8\x30\xf8\x4d\xcd\xe5\xea\ +\xf9\xdd\x47\x01\xe8\x67\x41\x81\x71\xf2\x17\xfb\xb7\x15\x35\x54\ +\xe7\x74\xc3\x7a\xa7\x7c\x60\x19\xf3\x39\xc8\xfe\xff\x32\xdf\x7d\ +\x2b\x60\xbc\x64\x35\xfc\x24\x5d\x7d\x9d\xf0\xc1\xd0\x1f\x17\xd7\ +\x9f\xdc\x40\x82\x71\xf2\xa9\x0b\x7c\xa4\xbb\xee\x21\xe0\x1c\xa6\ +\x5a\x66\xc1\x87\x80\x87\x08\x0a\x1f\xcd\xcd\xcd\xf2\xca\x95\x2b\ +\x0d\xb8\x76\xed\x9a\xef\xf5\x40\x4c\x9a\x07\x72\x2b\x36\x3e\xca\ +\xca\xca\x90\x8b\x01\x97\x2e\x5d\xf2\x9d\x0f\xc4\xa4\x79\x20\xb7\ +\x62\xe3\xa3\xae\xae\xce\x54\x87\xcb\x97\x2f\xfb\xce\x07\x62\xd2\ +\x3c\x90\x9b\xe0\x43\xf0\x91\x4f\x3e\x96\x2d\x5b\x66\xaa\xc3\xc8\ +\xc8\x88\xef\x7c\x20\x26\xcd\x03\xb9\x85\x91\x8f\xd5\xab\x57\x1b\ +\xb0\x6f\xdf\x3e\x6d\xdd\xe9\xd3\xa7\xe5\x13\x27\x4e\x18\x80\x79\ +\x94\xb6\xf1\x1a\x88\x49\xf3\x40\x6e\xa9\x3c\x91\x33\x6d\x53\xa8\ +\x7c\xd0\xed\xce\xaa\x2f\xbc\x39\xde\x6b\x58\xcd\xdd\xc8\x99\xb6\ +\x09\x0b\x1f\xeb\xd6\xad\xcb\x68\x5f\x53\x53\xe3\x3b\x1f\x88\x99\ +\x29\x27\xe4\x2c\xf8\x10\x7c\xf8\xc1\x47\x53\x53\x53\x46\xfb\xda\ +\xda\x5a\xdf\xf9\x40\xcc\x4c\x39\x21\xe7\xb0\xf0\x71\xea\xd4\x29\ +\x03\x3a\x3b\x3b\xe5\xfa\xfa\xfa\xb4\x58\xba\x74\xa9\xa1\xdf\x4b\ +\x96\x2c\x91\x07\x07\x07\x4d\x7e\x52\xd8\xba\x75\xab\xa9\x56\x58\ +\x96\xce\x1e\xbe\xe0\x53\x6f\x8f\x98\x99\x72\x42\xce\xd4\x4f\xa1\ +\xf2\x41\x31\x34\x34\xe4\x68\xdb\x2d\x29\x29\x91\x63\xb1\x58\x5a\ +\x7f\x1d\x1d\x1d\xa6\x36\x58\x96\xce\x1e\xbe\xe0\xd3\x49\x0e\xc8\ +\xd9\xcb\x9a\xe4\x93\x8f\xfe\xfe\x7e\xc7\x7c\x5c\xbd\x7a\x35\xad\ +\x3f\xec\x8b\xd2\x36\xfa\x7d\x6a\x0a\xf8\x72\xca\x07\x72\x16\x7c\ +\x2c\x8e\x57\x6e\xf3\x41\xc7\x2b\xc1\x87\xb3\xf9\xf6\xca\x95\x2b\ +\xae\xf1\x01\x5f\x4e\xe3\x17\x1b\x1f\x8d\x8d\x8d\xf2\xd9\xb3\x67\ +\xb9\x38\x77\xee\x9c\x3c\x3e\x3e\xee\x1a\x1f\xf0\x05\x9f\xe9\xe2\ +\x21\x97\x62\xe2\x03\xe7\x22\x68\x7f\xb7\x6f\xdf\x9e\xb5\x3f\xec\ +\xfb\x50\x7f\x58\x96\xad\x3f\xe4\x42\xfd\x21\xe7\xb0\xf0\x81\xfd\ +\x4b\x3d\x5a\x5b\x5b\x4d\xfd\xdd\xb4\x69\x93\x23\x9f\xd8\x47\x3a\ +\x76\xec\x98\xe2\x6f\xc3\x86\x0d\x26\x7f\x58\x86\x75\xb0\xc9\xb4\ +\x6f\xc6\x03\x72\xa1\xfe\x90\x33\xed\x47\xa1\xf2\x41\xfb\xc6\x83\ +\x53\x3e\x46\x47\x47\x6d\x8f\xfd\xb0\xcd\x95\x0f\x1e\x04\x1f\x46\ +\x3e\x2a\x2a\x2a\x2c\xfd\xc2\x46\xf0\x21\xf8\x28\x74\x3e\x1a\x1a\ +\x1a\x1c\xf9\xe4\x5d\x3f\x4a\x07\xa7\xd7\xb7\x90\x4b\x31\xf1\x51\ +\x5d\x5d\x2d\xaf\x5f\xbf\xde\x80\xee\xee\x6e\x47\x3e\xc7\xc6\xc6\ +\xe4\x6d\xdb\xb6\x99\xfc\x50\xc0\x06\xb6\x4e\x7c\x23\x17\xea\x07\ +\x39\x87\x95\x8f\x2d\x5b\xb6\xb8\xda\x17\x3f\x80\x9c\xc3\xca\x87\ +\xd5\xf5\x8f\x20\x22\xcc\xd7\x3f\x04\x1f\x82\x0f\xc1\x47\xee\x7c\ +\x5c\xbc\x78\x51\xee\xeb\xeb\x33\xe0\xcc\x99\x33\x59\xe7\x81\xb6\ +\xd4\x1f\x62\x08\x3e\xec\xf1\xb1\x7f\xff\x7e\x53\xdb\x8d\x1b\x37\ +\x66\x9d\x07\xda\x52\x7f\x88\x21\xf8\xb0\xc7\x47\x57\x57\x97\xa9\ +\xed\xce\x9d\x3b\xb3\xce\x03\x6d\xa9\x3f\xc4\x10\x7c\x08\x3e\x0a\ +\x91\x8f\x03\x07\x0e\x78\x3e\x5e\x21\x86\xe0\xc3\x1e\x1f\x27\x4f\ +\x9e\x54\xae\x45\xe8\x31\x30\x30\x90\x75\x1e\x68\x4b\xfd\x21\x46\ +\xb1\xf3\x81\x6b\x13\x6e\xfa\xf7\x03\xbc\x6b\x2c\x61\xe1\x63\xed\ +\xda\xb5\xca\x35\x53\x3d\x9c\x5e\x33\xf2\x12\xc8\x85\xe6\x87\x9c\ +\xc3\xca\x47\x69\x69\xa9\x5c\x55\x55\x65\x40\x4b\x4b\x4b\xde\x79\ +\x48\x01\xb9\xd0\xfc\x90\x73\x58\xf9\xe0\x01\xdb\x5f\xbe\x79\x48\ +\x81\xf7\x5b\xe0\x21\xcc\x7c\xf0\xae\x47\x5d\xb8\x70\x41\x3e\x78\ +\xf0\xa0\xdc\xdb\xdb\xab\x00\xff\xe7\x1d\x9f\x9f\x3f\x7f\xde\x64\ +\x87\x65\xd4\x0e\x6d\xa9\x1d\x62\x50\x3b\x71\x3d\x8a\xcf\x07\xea\ +\x45\xed\x36\x6f\xde\x6c\xb2\xe3\xdd\x1f\x81\x65\xd4\x0e\x6d\xa9\ +\x1d\x62\x14\x1b\x1f\x78\xd6\x45\x0f\x7a\xbf\x74\x3a\x3e\x78\xf7\ +\xf1\xf0\xe6\x99\xbd\x7b\xf7\x9a\xec\xb0\x8c\xda\xa1\x2d\xb5\xe3\ +\xdd\x17\xc4\xe3\x03\x39\xd3\x7e\x14\x2a\x1f\xd7\xaf\x5f\x37\xa0\ +\xa7\xa7\xc7\x16\x1f\x76\x8f\xcf\xed\xde\x0f\x67\xf7\xf8\x9c\xc7\ +\x07\x72\xa6\xfd\x28\x54\x3e\x28\x8e\x1c\x39\x62\x8b\x0f\x1c\xbf\ +\xd9\xa9\x33\xae\xaf\x52\x3b\xde\xf5\x5f\x1e\x6f\xbc\xe3\x4b\x1e\ +\x1f\xc8\xd9\xcb\x9a\xe4\x93\x0f\xde\xfd\xa2\x7a\x3e\x30\x86\xa0\ +\x76\xbc\xfb\x36\xf1\x2c\x06\xd6\xe9\xb1\x66\xcd\x1a\x93\x1d\x96\ +\x51\x3b\xb4\xa5\x76\x88\x81\x75\xfa\x71\x8b\xc7\x47\x98\xef\x17\ +\xb5\xe2\x83\xae\xf3\x0b\x82\x0f\x3e\x1f\xf9\x7e\x7e\x50\xf0\x21\ +\xf8\x08\x1a\x1f\x3b\x76\xec\xd0\xd6\xf3\xde\xa1\xe1\x35\xf4\xef\ +\xc6\x40\x2e\x01\xe4\xe3\x3f\x3f\xf9\x58\xb1\x62\x85\xbc\x7b\xf7\ +\x6e\x05\xf4\x1d\x1a\x78\x96\xa9\xad\xad\x4d\xb9\xb6\xea\x06\xe0\ +\x8b\x3e\x1f\x85\x98\xa9\xf8\xc8\xc5\x67\x3e\xec\xbc\xcf\x92\xbe\ +\xef\xd5\x53\x3e\x32\x01\xcf\xfa\xb9\x9d\x43\xc0\x9e\x1f\x7c\x62\ +\xc5\xc7\xc4\xc4\xc4\xaf\x41\xe2\x23\xd3\xf3\x83\x4e\x11\xc0\xe7\ +\x39\x2d\xdf\x87\xcc\x79\xa7\xb5\xe0\xc3\xa3\x7a\xd8\x79\x17\xbb\ +\xfa\xfd\xa3\x40\xf0\x01\xb8\xf9\x4e\x2c\xde\xbb\xae\xf2\xcc\x47\ +\xaf\x15\x1f\xd1\x68\xf4\xed\xb8\x47\xdf\xd8\xb4\xe2\x63\xcf\x9e\ +\x3d\x72\x7b\x7b\xbb\x86\x43\x87\x0e\xb9\xfa\x4e\x2c\xf8\x82\x4f\ +\x7d\x0c\xc4\xcc\x13\x1f\x73\x6c\x2c\xaa\xb4\xe2\x03\xc2\x6c\xbf\ +\xcf\x07\x1f\x6c\x7b\xf1\x6c\x5b\xcc\xb0\x8d\xe6\x8b\x8f\x19\x3b\ +\x5c\x40\xd4\xef\xa1\xba\xfe\x0e\x64\x2b\x3e\x82\xf2\xbe\x3e\x1f\ +\xf8\x40\x6d\x4d\xdf\x29\xb0\xf8\x8d\xcc\x08\x3e\xbc\xe1\x03\xdf\ +\x24\x70\xc2\x05\x24\x16\x8b\xd5\xc5\x5d\x3e\x16\xc1\xb5\xd2\x4c\ +\x7d\xb7\x7b\x8f\xb3\x9b\x40\xcc\x4c\x39\x21\x67\x97\x63\x3e\xce\ +\xf6\x1b\xa6\x8c\xc7\x0f\xe2\xe6\xef\x41\x0a\x64\x8f\x57\xf8\x4e\ +\x44\x36\x5c\xe8\x38\xc1\x3b\xe0\x79\xdf\x4b\x15\x70\x06\xd4\x70\ +\x28\x17\x2e\x74\x9c\xe0\x7b\x13\xe2\xbd\xfa\xd9\x03\xdf\x1b\xfc\ +\xcc\x0d\x2e\x74\x9c\x60\xec\xf2\xec\xdc\x56\x88\xf1\x04\xdf\x01\ +\x76\x93\x8b\x94\xa8\x73\xfc\x4c\x5c\x8c\x5f\x76\x80\x7d\xda\x69\ +\x7c\x07\xd8\x0b\x2e\xf4\xa2\x7e\x97\x0a\xc7\x8c\xf4\x5b\xb9\x02\ +\xf1\xf8\x73\xf5\xfb\xa6\x8e\x8e\x2f\xdc\x10\x9c\x5b\xc1\xf9\x2e\ +\xf5\x1c\xe4\x2f\x0c\xff\x14\x19\x47\x2f\xd4\x3e\xa3\xef\x5f\x31\ +\x1c\xb6\x7b\x0e\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\x88\x10\ +\x21\x42\xf2\x2d\xb2\x4e\x9e\x49\x11\xf7\xf5\x44\x2a\x52\x79\x52\ +\x9f\x4f\xe9\x91\xa4\x3e\xab\xa5\x32\xac\xe8\xf7\x35\xbd\x4d\xd1\ +\xa3\xe5\x49\x67\x09\xa9\x5e\xd1\xa5\x61\xd5\xfb\x6c\x15\xf4\x44\ +\x24\x15\x6d\xbe\x1c\xfa\x42\x79\x4a\x4f\x94\x28\x7a\x95\x96\x8e\ +\xa2\xcf\xd7\x6b\xfa\x08\x4f\x7f\xd6\xa6\xe9\xf7\xb9\xfa\xb0\xa6\ +\xcf\x2a\xfa\x17\x5a\xff\x92\xfa\xe7\x5a\xff\x92\xfa\x51\xad\x3f\ +\x47\x15\x7d\x97\xa6\xaf\x52\xf4\xa8\xa6\x57\x2b\xba\x8e\x9b\x9c\ +\xf5\x88\x44\xd6\x13\x7d\x58\xb2\xb0\xb7\xf0\xe7\xb4\x3d\x8d\x6f\ +\xb5\xde\x2a\x9e\x53\xfb\x5c\xfd\x99\xf2\x77\xa8\xd3\x78\x56\xf1\ +\xad\xd6\xe7\x6a\xef\xb5\x9e\x6b\x3e\x79\xe0\x7b\x7e\x51\x8d\xc0\ +\xde\xa0\x4b\x95\xd2\xc2\xa2\x5e\x82\xf5\x06\x9d\xfd\x95\x58\xd4\ +\xcb\xa1\xcb\x8b\x7a\x15\xec\xe5\xa8\xa6\xd7\x2b\xeb\xef\x6b\x7a\ +\x9b\xa2\xcf\x6a\xfa\xb0\x62\x6f\x18\x2f\x2b\xc9\x78\x5a\x49\xc6\ +\x5b\xff\xf5\xff\x01\x71\x48\x74\x75\ +\x00\x00\x05\x66\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x05\x1b\x49\x44\x41\x54\x78\x9c\xed\x9b\x6d\x88\ +\x15\x65\x14\xc7\x7f\x7f\x75\x7d\x5d\xac\xb4\x5a\xcd\xb2\x4c\xc2\ +\x4c\xcb\x34\x7b\xb7\x37\x7b\x91\x8a\x84\xe8\x45\x11\xa4\xf0\x4b\ +\xa4\x99\x18\xb2\x82\x16\xf8\x21\xa8\x24\x83\x20\x10\x03\xd1\x3e\ +\x98\x91\x20\x48\x16\x5b\xd8\x87\x22\xfc\x60\xa4\xc6\x56\x66\x05\ +\x65\x5a\x5a\x7e\x28\x59\xdd\x15\x73\xfd\xf7\x61\xc6\xdd\xd9\xeb\ +\xdd\x7b\x67\xee\xcc\xdc\xd5\xf5\xfe\x60\xb9\x73\x9f\x39\xe7\x3c\ +\xe7\x39\x33\xcf\xdc\x73\x9e\x79\x16\x6a\xd4\xa8\x51\xa3\x46\x8d\ +\xf3\x16\x75\x77\xc2\xf6\x95\xc0\x0d\xc0\xc0\x48\xf3\x1e\x49\xdf\ +\x85\xe7\x67\x02\x03\xf2\x75\x2f\x13\x8e\x03\xdf\x4a\xfa\x3d\x96\ +\xb4\xed\x3a\xdb\x6f\xd9\x6e\xf7\x99\xbc\x1a\x91\x3b\x5c\xe4\xfc\ +\xd9\x4a\xbb\xed\x55\xb6\xeb\x0a\xc7\xdb\xa7\x48\x0c\x5e\x01\x16\ +\x77\x73\xee\x5c\xa5\x0f\xf0\x12\xb0\xbc\xd8\x89\x0e\x6c\x0f\x02\ +\x96\x54\xc9\xa9\x9e\xa0\x31\x1c\x63\x07\x85\x57\xf9\x0a\x60\x10\ +\xbd\x97\x41\xc0\xe5\xd1\x86\xc2\x00\xf4\xad\x9e\x2f\x3d\x46\xbf\ +\xe8\x97\xde\x34\xcf\x2b\xa2\x5f\x79\x91\xdc\x38\x00\x7c\x0e\x6c\ +\x07\xf6\x02\xfb\x81\x56\xa0\x0e\x18\x02\x8c\x05\x26\x02\x77\x03\ +\xf7\x02\x83\x73\xf7\xc8\xf6\xf8\x32\x3f\x27\x69\x7f\x06\x4f\xda\ +\xfe\xc0\xf6\x3d\xb6\xbb\xcd\x41\x8a\xf8\x55\x6f\xfb\x19\xdb\xbb\ +\x2a\xe8\xb3\x90\xf1\x51\xdb\xd5\x9c\x02\x4d\xc0\x04\x49\xb3\x25\ +\x7d\x21\xc9\x71\x15\x25\x1d\x95\xf4\x1e\x30\x05\x78\x02\xd8\x97\ +\x95\x53\xd5\x08\xc0\x31\xe0\x59\x49\x0f\x4b\xda\x9b\xc6\x90\x24\ +\x4b\xda\x0c\x4c\x00\xd6\x65\xe1\x5c\xde\x01\xf8\x03\xb8\x3d\xbc\ +\x7a\x99\x21\xe9\x98\xa4\x79\xc0\x7c\xa0\x3d\x8d\xad\x3c\x03\x70\ +\x00\x98\x26\xa9\x39\xaf\x0e\x24\xad\x06\xe6\x02\xa7\x2a\xb5\x91\ +\x57\x00\x8e\x00\x33\x24\xfd\x96\x93\xfd\x0e\x24\x6d\x24\x48\x73\ +\x2b\x22\xaf\x00\x3c\x2f\xe9\x87\x9c\x6c\x9f\x81\xa4\xb7\x81\x0d\ +\x95\xe8\xe6\x11\x80\x8d\xe1\x55\xa9\x36\x0b\x81\xbf\x93\x2a\x65\ +\x1d\x80\x36\x7a\xa8\x98\x92\xf4\x0f\xf0\x72\x52\xbd\xac\x33\xc1\ +\xb5\x92\xfe\x4c\xa2\xe0\xa0\x46\x9f\x0e\xdc\x0f\x5c\x06\x9c\x00\ +\x7e\x02\x3e\xae\xe0\x01\xba\x9e\x20\x08\xa3\x13\xea\x75\x38\x93\ +\x36\x13\x1c\x97\xb0\xbf\xc7\x6c\xff\x52\xa2\xbf\xad\xb6\xc7\x24\ +\xb4\xb9\xac\xa7\x32\xc1\x1d\x49\x12\x1d\xdb\x4b\x81\x2d\x04\x39\ +\x3f\x80\x81\xbf\x80\x96\x88\xd8\xa3\xc0\x0e\xdb\xb7\x26\xf0\x63\ +\x43\x68\x2b\x16\x59\x06\xe0\xd3\xb8\x82\xb6\x67\x03\xaf\x11\xac\ +\x49\xb6\x00\x8d\x40\x83\xa4\x11\x92\x86\x02\xd7\x03\xef\x87\xe2\ +\x17\x03\x5b\x6c\x8f\x8a\x63\x5b\xd2\x3e\xe0\xc7\x24\x8e\x47\x1d\ +\x4b\x33\x05\x1e\x8a\xd9\x47\xbd\xed\x43\xa1\xce\xbf\xb6\x6f\x2c\ +\x21\xbb\x24\x62\x3f\x76\x36\x69\x7b\x4d\x4f\x4c\x81\x3d\x31\xe5\ +\x66\x01\x0d\xe1\xf1\x62\x49\xbb\x43\xa7\xc7\xd9\x5e\x6e\x7b\x81\ +\xed\x21\x00\x92\xde\x04\x3e\x09\x65\xe7\xd8\x1e\x9e\xb1\x2f\x5d\ +\x49\x71\x07\xb4\x3b\x66\x79\x6b\x7b\x53\xe4\xea\xd7\x85\x6d\x93\ +\x6d\xb7\x46\xec\xed\xb4\x3d\x20\x3c\xf7\x48\xa4\x7d\x56\xcc\x3e\ +\x1e\xaf\xf6\x1d\x70\x34\x41\x79\x7b\x55\xf8\xd9\x2c\xe9\xbf\xf0\ +\xf8\x45\xba\xae\x45\x4e\x06\x1e\x08\x8f\xbf\x29\xa2\x5b\x8e\x96\ +\xf2\x22\x01\x3d\xb1\x24\x76\x3a\x50\xd1\x3b\xa6\x58\x31\x53\x4c\ +\x2e\x6e\x90\xcf\x58\xff\xef\x8e\xac\x02\x50\x1f\x77\x0a\xd0\xb9\ +\x98\x31\xd1\x76\xff\xf0\xf8\x1d\x82\x2c\xf2\x34\x3b\x81\x6d\xe1\ +\xf1\x94\x22\xba\xe5\xb8\x24\xa6\x5c\x66\x01\xe8\x43\xc1\x72\x73\ +\x09\x9a\xc2\xcf\x0b\x08\x4a\x59\x24\xed\x02\x26\x11\xbc\xb8\x58\ +\x00\xdc\x25\xe9\x44\x28\xb7\x30\xfc\x3c\x49\x67\x50\xca\xd1\x50\ +\x5e\xa4\x08\x29\x1e\x82\xb6\x3d\x23\x66\x1f\xf5\xb6\x0f\x86\x3a\ +\x47\x6c\x4f\x2e\x21\xdb\x18\xb1\xbf\x3e\xc1\x38\xd6\x55\xfb\x21\ +\x08\x30\x2d\x8e\x90\xa4\xa3\xc0\x22\x82\xf9\x3c\x14\xf8\xd2\xf6\ +\x52\xdb\x97\x46\x06\x30\xc9\xf6\x46\xe0\x8d\xb0\xe9\x10\xb0\x2c\ +\x81\x2f\xb7\x25\x90\xed\x24\xe5\x1d\xf0\x75\xc2\xbe\x1a\x6d\x9f\ +\x2a\xb0\x71\xc8\x76\x4b\x41\xdb\x61\xdb\xb7\x24\xb0\x7b\x4d\x99\ +\x31\xe4\x76\x07\x4c\xb5\x7d\x6d\x5c\x61\x49\x2b\x81\x99\xc0\xcf\ +\x91\xe6\x06\xa0\x3e\xf2\xfd\x23\xe0\x66\x49\x3b\x12\xf8\x31\x27\ +\x81\x6c\xe6\xe5\xf0\x42\x82\x87\x58\x2c\x24\x6d\xb5\xdd\x04\xdc\ +\x47\x50\x0e\x8f\x22\x28\x87\xf7\x12\x94\xc3\xdf\x27\xe9\xdc\xc1\ +\x8b\xcf\xf9\x49\x74\x0a\x0d\xa4\x2d\x87\xdb\x6c\xc7\xfd\x35\xc8\ +\x1c\xdb\x8b\xca\xf8\x9f\xeb\x14\x80\x60\x37\xc9\xaa\x8c\x6d\xc6\ +\xc2\xf6\x08\x60\x45\x52\xbd\x3c\x32\xc1\xa7\x1d\x33\x67\xcf\x0a\ +\x07\x49\xd8\x1a\xe0\xc2\xa4\xba\x79\xa5\xc2\xef\xda\x9e\x98\x93\ +\xed\x62\xac\x20\x78\xa0\x26\x26\xaf\x00\x0c\x05\x9a\x6c\x5f\x9d\ +\x93\xfd\x0e\x6c\x3f\x47\xb0\xad\xa7\x22\xf2\x2c\x86\x46\x01\x5f\ +\xd9\x9e\x94\x57\x07\x0e\x96\xd5\x56\x53\x62\xb7\x5b\x39\xf2\xae\ +\x06\x47\x02\xdb\x6d\xcf\xcb\xd2\xa8\xed\x61\xb6\x37\x01\xaf\x93\ +\x62\xf0\x50\x9d\x72\x78\x30\xb0\xd6\xf6\x67\xb6\xaf\x4b\x63\xc8\ +\x76\xdf\x30\x98\xcd\xc0\x93\x59\x38\x57\xcd\xf5\x80\x07\x81\x66\ +\xdb\x1f\xda\x9e\x6e\x3b\x76\xdf\xb6\x87\xdb\x7e\x81\x60\xe0\x6b\ +\x09\xde\x1f\x64\x42\xd2\x4c\x30\xd5\xed\x46\x10\xf0\xa7\xc2\xbf\ +\x83\xb6\xb7\xd1\xb9\x45\xe6\x00\xc1\x4a\x4e\x7f\xe0\x22\x60\x0c\ +\x30\x15\xb8\x03\xb8\x33\x6c\xcf\x9c\xa4\x01\xb8\x29\xbc\x72\x63\ +\x81\x61\x29\xfb\x1e\x49\xb0\x1e\x30\x37\xa5\x9d\x54\x24\x0d\xc0\ +\x0c\xe0\x57\x60\x38\xbd\x64\x87\x59\x61\x00\xe2\xec\xb6\xa8\xec\ +\xbd\xdb\xd9\xc3\xc9\xe8\x97\xc2\xab\xb8\x9f\xae\x6b\x73\xbd\x8d\ +\x56\x82\x31\x76\xd0\x25\x00\x92\xda\x80\x95\xd5\xf4\xa8\xca\xac\ +\x94\x74\xbc\xa4\x84\x83\xed\xf2\xab\x5c\x7c\xbb\xfc\xb9\x4a\xb7\ +\xdb\xe5\x4b\xfd\xc3\xc4\x68\x82\x95\xda\x81\xdd\xc9\x9c\x23\x1c\ +\x07\x76\x4b\xda\x5f\x56\xb2\x46\x8d\x1a\x35\x6a\xd4\x38\xbf\xf8\ +\x1f\xdc\xa4\x61\xd1\x24\x69\x26\xe9\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +" + +qt_resource_name = b"\ +\x00\x03\ +\x00\x00\x70\x37\ +\x00\x69\ +\x00\x6d\x00\x67\ +\x00\x0c\ +\x05\x5b\xb1\x87\ +\x00\x65\ +\x00\x78\x00\x70\x00\x6c\x00\x6f\x00\x72\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0c\ +\x08\x1a\x9d\x27\ +\x00\x64\ +\x00\x6f\x00\x77\x00\x6e\x00\x6c\x00\x6f\x00\x61\x00\x64\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x0c\x58\x59\x27\ +\x00\x6d\ +\x00\x65\x00\x6e\x00\x75\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0a\ +\x02\x78\x1b\x27\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x6c\x00\x61\x00\x62\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x07\xb6\x59\x87\ +\x00\x70\ +\x00\x61\x00\x64\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0a\ +\x0b\x73\x00\x47\ +\x00\x73\ +\x00\x74\x00\x72\x00\x65\x00\x61\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0c\ +\x0b\xdf\x21\x47\ +\x00\x73\ +\x00\x65\x00\x74\x00\x74\x00\x69\x00\x6e\x00\x67\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0b\ +\x06\x93\x99\x5f\ +\x00\x6b\ +\x00\x6f\x00\x74\x00\x6f\x00\x70\x00\x61\x00\x64\x00\x2e\x00\x69\x00\x63\x00\x6f\ +\x00\x0f\ +\x04\x04\xab\xc7\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\ +" + +qt_resource_struct_v1 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x03\ +\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x06\x7d\ +\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x22\x61\ +\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\xc6\x00\x01\x00\x00\x00\x01\x00\x00\x19\xa3\ +\x00\x00\x00\x78\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x54\ +\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x02\x3c\ +\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x0e\x9d\ +\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x14\x51\ +\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x43\ +" + +qt_resource_struct_v2 = 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\x01\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x09\x00\x00\x00\x03\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x06\x7d\ +\x00\x00\x01\x84\x66\xd4\x57\x1a\ +\x00\x00\x00\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x22\x61\ +\x00\x00\x01\x84\x66\xd2\x44\x59\ +\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x84\x65\xfc\xcd\xf8\ +\x00\x00\x00\xc6\x00\x01\x00\x00\x00\x01\x00\x00\x19\xa3\ +\x00\x00\x01\x84\x66\xf8\x27\x00\ +\x00\x00\x00\x78\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x54\ +\x00\x00\x01\x84\x65\xe2\xd8\xcb\ +\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x02\x3c\ +\x00\x00\x01\x84\x66\xd7\x6a\x2f\ +\x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x0e\x9d\ +\x00\x00\x01\x84\x66\xd6\x3f\x63\ +\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x01\x00\x00\x14\x51\ +\x00\x00\x01\x81\x68\xf5\xcd\x75\ +\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x43\ +\x00\x00\x01\x81\x68\xf5\xcd\x75\ +" + +qt_version = [int(v) for v in QtCore.qVersion().split('.')] +if qt_version < [5, 8, 0]: + rcc_version = 1 + qt_resource_struct = qt_resource_struct_v1 +else: + rcc_version = 2 + qt_resource_struct = qt_resource_struct_v2 + +def qInitResources(): + QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/gui/img/collab.png b/gui/img/collab.png new file mode 100644 index 0000000000000000000000000000000000000000..06853b9750a71090e71c7778d5a73b766766accb GIT binary patch literal 979 zcmV;^11$WBP)H7 z3lla}Q`RITBucs-XTI;;d*{uYLPbSI#X82yP5?mC3&3gMMMv31;5=~B%;xWlI`3s*(#&S>n*dw}HaO`gF>Pj@YY(eIQir5pa`-gnCB0h{ z=WGr!Rx%ZLj;mIHr1QXmRIb&}0Xt`2a=`{;!E8qg~ zdB#{vb6>#+HLTtq<0F6mBbwIrN4RLskOMPQGa{iEo~kN2E(lX%-p$ZHBb0=%r~A*Yv|Gz-D20u1<;s1n+p zGz-Cd5p1cG2VVoO5#7gk*`JHT%YY@I&&>9c{fCoM@G_tc*sSP@vdvDK-h3C=>9q(x z1pElx0iJC@=Q{AJOGXcJ54aNd2hR(k$3x4EnJo}K8&nvrcq!~kWkA^pluczoLVwZ! zW3yCny#Gkr1wIBoAllyYW&#*1AWlU^MMcF*{skTL?XO_RU>g7c002ovPDHLkV1l0$ BzpnrQ literal 0 HcmV?d00001 diff --git a/gui/img/collections.png b/gui/img/collections.png new file mode 100644 index 0000000000000000000000000000000000000000..39bff942123bbad6e68db209914a4c3cfeb2633d GIT binary patch literal 1382 zcmV-s1)2JZP)Nu{iiGGz5v1@- zq?s79f)@B8s3e0R5ChRZn2{hz7F*bdBK%;a##UwpWm;N(C|TVVbN%;W#@*TL-Fs*5 z%-q%W{$ROtpE>6|=Q%Ua+;g6J7HZU}QKLqU^A>e?!uFNG4Zy%i^Bzgxh397i1M+n* z6OIGlO8PyPwCy_EZ`p45nYW0DKN? z2lfK{fmWan7y^t1CIWW@_X2}+_sI76GCwD2e+Ez5{=oJ&^d2w;cmmj$l~dISz%k%iNe@ffo5qkNOWF)f0M=#U zT;2ir1GqiBdYK{Vn522Ye4ssztvmy80GKAJIj;^Rtp?@-rz*9PR{)LxGbH_%ll=}P zZ6ru@DUB7iHWM6|u)oJ_|5BpAt+vM`w7IOO zGQk~55*^!1fh`0%KY)S1fR>2ZqreW^wtkBVbk(mvqFB#uWNOEU!?irGiK?L(o?zqW5IA-g1EKXx{0drePF zfju$hW&sW1@nT84L#M~tUT%AV?I8e?-UL1gW#`x)p0O`oNpT0XJ7#%ndsF1<*M)79 zZMR13?X*20JoiYXeOAmq9!hqFauZ@*)8} zu_SgnP|-W4STR#fE^d&|SpV;itO8IUcM8zCm@(0I|M2)7f-LehJArNC@suLE<+voK zTxJ32L&0)$37W#s3kXVCB<%tw5xlrq0Nf?%L@2i~{5(l#P|DFzUZe;q9)h+#BW54< zwhx9nM{G|nA=?Zo<2rw;&=V zKJxt|;ATlX68JGEfo$gG@Ir!zSS%!MwcP~VM^FxrA}ELV5|qQ=C+Xb5i_iH^8DtGJ)8 zYjeGgR)R5h&?Nwp+JKeS^r*_LlytnLgoEw!t6Y4${JBcE+vQ9B!^CKUmD+*b$($n` o2X;%^Uske4jT$v-)HuKRAKav2(Ijam=>Px#07*qoM6N<$g8n*^8UO$Q literal 0 HcmV?d00001 diff --git a/gui/img/download.png b/gui/img/download.png new file mode 100644 index 0000000000000000000000000000000000000000..4c314eea26163e1579173c21e9b333e5464a95e8 GIT binary patch literal 771 zcmV+e1N{7nP)YU~iFvC9(nxo7u-alZFZunx=lu zL(A!U-buMufTVF?A@973Ib~)~vmTte5lKV9A~0ISszTlXV`jFV<=`DTzW6f9&A$L{ zt^y}J#zufkz-_lGlJ-gZns5bPmo(;9D8JW;q_qUE?~)F97MksH3-U|3xZ9mB zZZlp5j!IfhDDXqlL6;)^`R$kVEx~V1(lL($b6paia`1OS(o`46xwN^dcL7OFV0Xvx z3UCGZT};`XowP1`ozEvtGuzW^VwM2ZhgfjTtY?o!o&>iQF@Vqlp@{*676{G22axBV zA#c`zm+j9dLb-%m0V_bm%qGli0vHE=h7buAz>Jx_`um5OEdsM4L_!7dE@A9#^(vyA!(rT1_3M`me;T6=L`^?d23uOmzMy+>>g=o(`?dY?G zvIA%UcZ-D3K6P#a$K9=Rig<7@PY7zA`?ov_*ChZcV+e9=UaD6BQc4JNZeFTi08*C_ zR6_GoJp+(BLQqM~OX&fGd^h+IxYqtW4V*8dNZONNd^uW`NL|Si!2i4glJ*||Axi*X z97IC#IqiTf0n9sygd){F%SCV)c+J+I$<&=DFluHWdL5Ly0?cd)xCs1m603qHa3QVv zT&VSPxd)P#%XnaMVp-CCNk`lok3=GoNF=gt`2&L$N4eh^|LFh#002ovPDHLkV1nA; BRonmo literal 0 HcmV?d00001 diff --git a/gui/img/explorer.png b/gui/img/explorer.png new file mode 100644 index 0000000000000000000000000000000000000000..c506f242710992718d8065a136760775e458fe3c GIT binary patch literal 568 zcmV-80>}M{P)H6Oc5_5%pT6nk(>2{bbIf!XN5W3n}C^_ znVFfHSu2ueB|VU|Ch1GV&#I({lICjfTAZW{lE!N1r=&ZQ4%Xhg2uX(}jaokZUMrGL z*51EKWQrwS1s-)g>l1Jrcn*B+IHSpSM0_te@82XXbolM}?U$t2k}h?5rUS|PLtPH( zSpf6EV@Wr%&Dj9{X93)obUf2EO#uKL0aCBRv;_cgI#WE20i-^2WG}U4;6t)!Xzwz` z*#KsMW67SO&18zR0bB;|CVPgq2)u1uJdJliiUX*FK`0_tB+Uc2fOGu) ze}bkvVhn6%&)L&EX=h^ICh(F!U&P*bJjcw;%*@Qp_LbkR;eI=;9NI4c0000;VP~|To#D92*Cmi!4`qVAx4Pn10V}#WMFh1xXJyP$4OOV*S&l9W}@$N!Nu3`^Rs&7Fdl6Jy8|d+3k;tE zL+3djHXaH)6x%O}wY^sm zK#y}!#09pW`g7VW)Uw-&A+U^nKH=Pw)su6L&IgW-PqO;>_IwCPY=QH~Sv}F`&pIEt zPO>wt505wSwU>5LzChvmaVuS8WUkEl3*hh@V7JFM2BEzdy877jWg51s9{RjyuJ>7> z+SHooU$Ff<=(Q5|IwrPlV)7aA=~j5Db>-TM-uIbmOIyQM?DNb0`}b!kUF-wzz|RPD z-k|7q{dN+M?|{{(4<0<|RQM4~f!iz9mbMo9n1;&Nrz+QXd9Bi8?|=a~`4=$TK)fq+ zdJMlb9#p-=oAt1H81>)CHZSMiH@^XfKPQ$FGuGJ_sSo)eiu|k|7L ziIt5Dwn=@+Y4<%m=1I)6FiBup1s_>He7id@5oXQ8$HIjR!#Q*2#LAT`SE4u#$7x;K z=u^hQ*c#=(S@@Vdd2)zYV&%ex3k}0T;Z2`14#uY1>%DFkK4#6DmB8WR#fuHYLE%iF zk`KnF+Uvdce8kUDJs)K}rcRxj*e{2Mh8nhCs{Nim;nIEv-6c=2K@A2Vjmi0RAz^^ob)mIGs!er@`$ZLn=!TvSD`o3?0^daBT;EhfgS z+u*h>XV*3>8EAC1=c3==-yh+i@UX4h+uK9ji%iYGx3@Q8k9BD=(H3pme9AV)oMx|x zdib+0Mfgawaq!?lCoG8F<;#~-@!+{Al8F`loLa^~TdsUCW@)EL*-8c)i}WRJx$?oW zrD#6ncqRFivgaedzhAm^DRuvJJw9kl;+-Y88Xw)=-Qnrer;X*znKL22lTjESv_+d~ z{uqnoXFT)4>k=~GHEY(S;w{HJDf8S%+GCy6%PTV$X^%1I?O%-^{8^W3Y^L?$`K4Yq zY}k;FCj;CA&+PE=|~D9eq;Ac5Y^hnXv$zSYgb14%{~Nt+vie1{$li zYw9O+Gs&)eT)TEHhL_2vs-vzcuCzK6AIg@#PU~MyJ?vVSYHX(Uful_9s^MeWv}u`k zspI*GU!U=O#PKlgx7LFLjix@;*5%=2{`~n)V~XkiQJNpu`&*19&6ZwYEgq(RuxnjR zeX6a4qgZ~Oot@#5B}-yu@7}#md|bbNJzTwdb&U z8ngPlw97nJu3YJakBhH*=`v=SN0Gk9l8>zWA4TR_l&x02A5|2FMcVOvWS^51iFcMQ z&&P0h{`~oH|Ni~4a_ZEns^=c|mG+qNa<&}GY(<-*T|G5g9nnLbRq zvd;4{9PZh(CxPGk_3LxtC-J1rzLF36FzL!V&xhwjKL?ikM=i44C%LcXvA2Eu_Qd{N z^ms)dd1CR$$8dQ3`0y-vuM$x(*0N7H&w;;o>7tUNn4CX#iiDaS&qB1UoEnU1HG;m+p@3BW74Ea zVMj+ttgKtNu4#@L#v0vCG#`gA3S&NT)1P$j&R?;eWk)})93TEXU`_|SSNE}Uulm%q@KTD8-yl4h@IqZ z#flXP{7m1EV4cL7eWgA6kb2{t5B}CgFY^1+#K^>l>3ck;d1lL&EeV`iCvj$9$%pBC zK_)&Jvz|lN?{}o{EE#cGm#qFS?N_f}4fWF3*O$P>#7ExiC3(M}nD=^#i4VrC=fG_j z46<~sWS}vte=Y4tjvUFw2S2|dlvpu+Pn!2vrJm{juZcI)=SveGjJcMav-*xDAExh9 z>&FMj5MpQg-X?#e!8X0jn>R1P2kUelZnLlCjXv0>k6R`_#`E_@v-pshHA+_du;(K_ zpO5wLIXxeqk7k=c)~;O}&6lQUn$&yD(w|krSfsxum_Pof#?zwLruk#`?AhU_O`A$Z zK0|}QW$NkaDc!&2{nc6vZOPw9(WmmySQ^Ynp66N0=e{{8_>lSQGJoq=t54a# z$$mfh9Qj%oJmc@LGKZq%YWT4Ie$X|pCj32T=JSxjN9=jwt~uNEJsftH*XGi?%Wxb zUAuOLuD=eU1?ykMeLq z9q`8Yp%(rO^<7*{*-|{^X zru{!}9XR1L;A8L4D_|dKB@R@s#IQdv?lwJe!uL%io(1oD$^AKv?;HH34P)1~%Gg!t ze9|I(KF2xrMpwM^=vU_WN5IjKU)k3%cuxC}?*Yz(Z7n+ZZY$sU&CiUncTGW7V`VF^ zU*UN899TGgzNm!{)tA>+;QM`yWxNLY7nJ{?v=T?ml{qu_-=Z7<7P+p0C=C7DBj6G6 z2zUfM0v-X6fJeY1;1Tc$j1>ZWVX#_W1Z{lhZL}03kE+b3ge7~gmE2aApC~yPD78P1 z$2JQ_AwMl-yR9KU8w?VM%{uB)?aZ2P3(&Bu8Qp)GW8r#@mJ4F?m49 z34P@MwtMhGw!8M1{)w+{U$$rYbJefap7iG`OT45k?PayssxSK&ExX1q{b%*h;xnsV z`h$KnJOx493;2)8!Svt_`c#&7w#Q^NM8jPWU_2_{?5*f`P(K{3NCC$)$d4l#;~nHD Zkvve+j{@L$IXws?2OLi!Ys*;3{|9kMbaem# literal 0 HcmV?d00001 diff --git a/gui/img/menu.png b/gui/img/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..0300e8c75312d56b4a05debea6eb133bff8938f7 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt_yJzX3_ zD(1YsVVHL)K*05)^~;F@nZdzrM&2i;ZR)C!*RXD|vejMU+bxpLIG;)U+Vjf?J6ftw zZR|F`wxd$PbCSwSIoIq6uSzDX2ck2UsO{PlpTN4u^~k!qicgGfPt6a!`E@hsZR7Kf zA9DQiQu<|o_CI~N<8rlaPOQWE`}V(!>y(nL2V{P* z$QcW%-eT4l{AemSFUG+or;&97%da^(;a8dEO{Ps(@%(<)Zh_nlb_iUu{6w;Rf;`Yc tCL8!yuzzEOz?YhzK=K}wR6KCl?Qs8!PC{xWt~$(695`4d}#mx literal 0 HcmV?d00001 diff --git a/gui/img/pads.png b/gui/img/pads.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4011ad7738518bda69ebdd1bb58d2325559dee GIT binary patch literal 1093 zcmV-L1iJf)P)nH8eCdG&D5KR!l6%z-mdax)^>m#*D^_r80o|z!2~Q z_j3|>6Ic*C&fowmfMMWThVWKy0!M%~vE%LtU=Fa&J?;NIglBOQ*axyp<{J$QuBCNgHG{%gyyP?O!NPnPUVvrlV&j?s5=@&`MLqt>|7bLxGjJe+KrrZ(W46K#(j-)eT zV(TiSlHQfHHcxyhsMivhP|Z@<(h-ZWNzk7Wg~v;VQXNrM8k|tCbT|$0G&T{r*ahMB zE{M`#OW^@vgz}|u!q3>JU9XZDn<38ixNimU2{2Yb^q6b2(!>5-s+#zm!^g2T!5QGH z8;0s_fBk+6J;l35f%`Jd+z+vE&yFLTf zd9>?sK1P7M8F5Uy7&nAbZJqW4-?tyJ)3^W}0G0)eVHvRB+4ki-pf`l`odukxnF5Xh zn*V&|C6&c;;97F` zu(kR>9SFYx90Fd9t>->~KKyHd?ZAlw!cVw1^F8b@2l~RO@_^}EVugk#unPPBW>to_ zoZXi^?6kgW-Q5xc76NYrr`tTW%fN>~?p8Fg0N4c_b=NLnp+~!Z=i_plI8M7*bM5(x z@1xl4eh2s_)YHJ$1Ov`yk>&P0A@TxXcLArZoCWp*OG@}%;@Y0=!2eqzI$*Ga01}cq zJvT)KHWDu7em&2h&zB)1>7b_?bRnUM6Uqz{ZS zomYg?1NV8n@GDoeGwSqpsQRx$sg8(!L}nOxwo=hEbVQ6pQuV9}=*}^@Wc$7TUxgBw ztp_EuU^X6=&4L;pmX3K`evPD8+^;_wV;+RlCk+h^4Gj$q4-x+ZU-Kt3Y_gXV00000 LNkvXXu0mjf7|RIW literal 0 HcmV?d00001 diff --git a/gui/img/settings.png b/gui/img/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..818221433a29f8b69afc491bdf52696ceca55cf0 GIT binary patch literal 1358 zcmV-U1+n^xP)KMWg^W)n$>$f4VEQzO!0U}4!!X5C1a zDZ44UQ7Wj5>ZYPA#jewwNYrJlY)!K^OxB+bi6UoH%5Y0Uot67^ao$&+-rnbZ&UyZv zZRY3Zh4K5p=XuV*-;u8K|Hg!L1}v7eS<($LA{Qm?HO7pEiz*<%=OpvqRL5BeKpk+& zp#VRHjB8dvUrQy;b&y*EG!z|7nUDoo<|t<*H5VC3l<8OiNm^c56cwZ@0MG^;1h#sp z-QywaTmWDzZ~$oau%8~_Uf^8hqjeBybkIBI@Bu8->tL?|csHUm4y?*2%Xp`i$(K0= zbk@)_z#kq3IF}H|YT(Bzdc_q1=qNde<8R!05nTFCbtF6RB~C;s-%x!8Rx06F=j~8OKGDD$PU-! zCC?opV3wpFN$Y*13dF~f9x}!_f3&@~#DEUj@418gHNW=3B^WV1>aYo zQPPN{TYMcwI4Y@IQlF$>N`Jdu(puT#-j~7lX-Rh)WB$ruBOc(H40HOEz{3tcHey$o zX?e7$-{~;7Ho! zBXJ!qAg->m{pc`QU&Vh`x^u8`AO{5g9Bfqb-<=|$5!erm8lh_=u9_7VNg&QQ@B|8OPDLWl*l{7y^9%m$V7-P_>BT2HT^OmKL@lB1yoT8U8y(^Q><^Y32d% zr_c#SkFSDP0f5<(-tcu2kUgaso$-AFUXirMQzs<%OM1~q!RKh~0ZE@qs`CsgG?S7Z zEFJ15;(9nbPtu^IB^d$>$*80jm!4zSS75hhPV$n}BFN?IRrCRY)TSvX_9J{bV#=6W+pK%X}vLKu$GWZi_D;;4JCsv9Fko@zAn2e%gR|v zJ7ia+pE&A_OWKf>ycgJB!Lb_C&)R}SILG;U_V~G;_>THwj)!8{QA{Qj>yJoM>US}He53E4mq0Xf! QGynhq07*qoM6N<$f_N5kF8}}l literal 0 HcmV?d00001 diff --git a/gui/img/stream.png b/gui/img/stream.png new file mode 100644 index 0000000000000000000000000000000000000000..9d755ff4a2a18943907d8b6238213f41d1c98415 GIT binary patch literal 1456 zcmV;h1yA~kP)Y~rC?wtReQ`KGFRn_BMg$flaRH#s)LWK$y@&Jqio(J9oX8zZCx&h2gGA##2^_IzS zpo1R#0`%(@vtqgWCt14D0SqhKJo?=m)IxXi-5yOu~=yRZt!5;!_O1MXX zOA4EYwPz%nBpyQyZXaNqWM5m<@KVp!pJnj-0_%mpqL8VbXO(EL1I{w|vpxCizaYR% zQoKHgzszI!Sb;v~<$2tr|8!2x2I0S0uh}5rxD?Md__K)TSsGse0}J-k$~2JdZG8&3 z+^Cr+{NL)z1l%r#-w}B501>cV_=kWCn&@vRR~v9xytV;RfZqaqFZ_k|80qc5)Zor1 zi)#)31mNvtkhTN&Vmw$q_1Ag)ZZi1K2=|40Ob$xXRR;GH;eKdvM*>GY9q0hA$qm+{ z^O4jCpHINm!aa~D-X;Zq0{sKram4d5jcJDVgPzW(@h&i-jsci1b*BhSIpUq7E{w*e zIXbr|OM6EYMO}d`bESS~6h$3IcGXraaL(-po&pAkNKq7h>73h@`l-b^cYT1{<(%7L z<j+Tc3pT=2b}!T{&o66f4LU=e`_oX0CTO73gHoagzwdTEw4_Dj2_k2(N)>m4(M$4mQ1gWD)(JLh~WO7+q#X&jYy z%`#dCK-bvE4PoUTHn`1T9&nEQc1YUR=IeKhs{^3z(}u8ePa5225IN`c>`}d}9isN3 zCD?G;D<0f+dAOquZZp^#MbQ!YZA?yDtMV{Yv0Ddqu z^z^D`O6UOS+?r?z@0E6NW6}V+oO8>ZbJLyhYl< zHF-g-cFwg&QS?w0Mfv~>d1;n3v=7?H9sn20vhgT^%?dEtvn17ZM4G=eXDPf3m}7LL zTW37kCAjxO5uXm}p>BA&O}xGRSqg$DDa8B!G=hf?z$D^BRmHEsVvG|W(b3)NR)ec2 zTSo}5F3%LbDMgPM+`EN)5}0c6=K!4v_c-t@*>}8^Z5r9Df2YBJRJgCzV{(ra?KZgm zfNzDr6XVb_sT%?G%?(pq(@H!|(l}u00DFXgS3O1}fG#PVVeoGzi}%SnzAggd)141I zKJ$&5%Y^$k_1qXd-ToQ8F)+h?-ViA1I1GWp0o+SmH3lc z8mkKQF)xpP{M?QGZD0!7XGQQ}HzcxE1cJw13BQeaPD1=JyrGbxt$kynN#fC#!(S`e zgKr8;WC2+$$f+3$+yb;0Hq6h{o@kpNW)qGg_^ik?)vrB20lE(V-vAg(b{(^kym!AL zIGOAlVFPt8TK-KCf1cYcS-XHq%?dB^+)^tV9@Sm|@d|dOC+EXuh_{e^r~o`sLiSPs zJn6}|hO*Wo#2+;}#o#1m|2I}+*@n~ehUi8oaBkT~6RG_+cLEqxs!3zH22;DqI!qlO zSQ<5(3Ty%P1Gn~yNdo|G1HJ)1!`O^fs8FFog$flaRH#tl4E_PB4R+&OD6qEx0000< KMNUMnLSTZCRl1=7 literal 0 HcmV?d00001 diff --git a/gui/modules/__init__.py b/gui/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gui/modules/core/__init__.py b/gui/modules/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gui/modules/core/blur.py b/gui/modules/core/blur.py new file mode 100644 index 0000000..44af303 --- /dev/null +++ b/gui/modules/core/blur.py @@ -0,0 +1,133 @@ +# source: https://github.com/Opticos/GWSL-Source/blob/master/blur.py, +# https://www.cnblogs.com/zhiyiYo/p/14659981.html , +# https://github.com/ifwe/digsby/blob/master/digsby/src/gui/vista.py +import platform +import ctypes + + +if platform.system() == 'Windows': + from ctypes.wintypes import DWORD, BOOL, HRGN, HWND + + user32 = ctypes.windll.user32 + dwm = ctypes.windll.dwmapi + + + class ACCENTPOLICY(ctypes.Structure): + _fields_ = [ + ("AccentState", ctypes.c_uint), + ("AccentFlags", ctypes.c_uint), + ("GradientColor", ctypes.c_uint), + ("AnimationId", ctypes.c_uint) + ] + + + class WINDOWCOMPOSITIONATTRIBDATA(ctypes.Structure): + _fields_ = [ + ("Attribute", ctypes.c_int), + ("Data", ctypes.POINTER(ctypes.c_int)), + ("SizeOfData", ctypes.c_size_t) + ] + + + class DWM_BLURBEHIND(ctypes.Structure): + _fields_ = [ + ('dwFlags', DWORD), + ('fEnable', BOOL), + ('hRgnBlur', HRGN), + ('fTransitionOnMaximized', BOOL) + ] + + + class MARGINS(ctypes.Structure): + _fields_ = [("cxLeftWidth", ctypes.c_int), + ("cxRightWidth", ctypes.c_int), + ("cyTopHeight", ctypes.c_int), + ("cyBottomHeight", ctypes.c_int) + ] + + + SetWindowCompositionAttribute = user32.SetWindowCompositionAttribute + SetWindowCompositionAttribute.argtypes = (HWND, WINDOWCOMPOSITIONATTRIBDATA) + SetWindowCompositionAttribute.restype = ctypes.c_int + + +def ExtendFrameIntoClientArea(hwnd): + margins = MARGINS(-1, -1, -1, -1) + dwm.DwmExtendFrameIntoClientArea(hwnd, ctypes.byref(margins)) + + +def Win7Blur(hwnd, Acrylic): + if not Acrylic: + DWM_BB_ENABLE = 0x01 + bb = DWM_BLURBEHIND() + bb.dwFlags = DWM_BB_ENABLE + bb.fEnable = 1 + bb.hRgnBlur = 1 + dwm.DwmEnableBlurBehindWindow(hwnd, ctypes.byref(bb)) + else: + ExtendFrameIntoClientArea(hwnd) + + +def HEXtoRGBAint(HEX: str): + alpha = HEX[7:] + blue = HEX[5:7] + green = HEX[3:5] + red = HEX[1:3] + + gradient_color = alpha + blue + green + red + return int(gradient_color, base=16) + + +def blur(hwnd, hex_color=False, acrylic=False, dark=False): + accent = ACCENTPOLICY() + accent.AccentState = 3 # Default window Blur #ACCENT_ENABLE_BLURBEHIND + + gradient_color = 0 + + if hex_color: + gradient_color = HEXtoRGBAint(hex_color) + accent.AccentFlags = 2 # Window Blur With Accent Color #ACCENT_ENABLE_TRANSPARENTGRADIENT + + if acrylic: + accent.AccentState = 4 # UWP but LAG #ACCENT_ENABLE_ACRYLICBLURBEHIND + if not hex_color: # UWP without color is translucent + accent.AccentFlags = 2 + gradient_color = HEXtoRGBAint('#12121240') # placeholder color + + accent.GradientColor = gradient_color + + data = WINDOWCOMPOSITIONATTRIBDATA() + data.Attribute = 19 # WCA_ACCENT_POLICY + data.SizeOfData = ctypes.sizeof(accent) + data.Data = ctypes.cast(ctypes.pointer(accent), ctypes.POINTER(ctypes.c_int)) + + SetWindowCompositionAttribute(int(hwnd), data) + + if dark: + data.Attribute = 26 # WCA_USEDARKMODECOLORS + SetWindowCompositionAttribute(int(hwnd), data) + + +def BlurLinux(WID): # may not work in all distros (working in Deepin) + import os + + c = "xprop -f _KDE_NET_WM_BLUR_BEHIND_REGION 32c -set _KDE_NET_WM_BLUR_BEHIND_REGION 0 -id " + str(WID) + os.system(c) + + +def GlobalBlur(hwnd, hex_color=False, acrylic=False, dark=False): + release = platform.release() + system = platform.system() + + if system == 'Windows': + if release == 'Vista': + Win7Blur(hwnd, acrylic) + else: + release = int(float(release)) + if release == 10 or release == 8 or release == 11: + blur(hwnd, hex_color, acrylic, dark) + else: + Win7Blur(hwnd, acrylic) + + if system == 'Linux': + BlurLinux(hwnd) diff --git a/gui/modules/core/popup.py b/gui/modules/core/popup.py new file mode 100644 index 0000000..33678e7 --- /dev/null +++ b/gui/modules/core/popup.py @@ -0,0 +1,26 @@ +import ctypes + + +def qtpopup(title, text): + """ + Popup using Qt + :param title: Title of popup + :param text: Text + :return: None + """ + from PyQt5 import QtWidgets + QtWidgets.QMessageBox.information(None, title, text) + + +def popup(title, text, style=0): + """ + Styles: + 0 : OK + 1 : OK | Cancel + 2 : Abort | Retry | Ignore + 3 : Yes | No | Cancel + 4 : Yes | No + 5 : Retry | Cancel + 6 : Cancel | Try Again | Continue + """ + return ctypes.windll.user32.MessageBoxW(0, text, title, style) diff --git a/gui/modules/handlers/__init__.py b/gui/modules/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gui/modules/handlers/register.py b/gui/modules/handlers/register.py new file mode 100644 index 0000000..a574c85 --- /dev/null +++ b/gui/modules/handlers/register.py @@ -0,0 +1,15 @@ +from gui.gui import Ui_MainWindow +from PyQt5.QtWidgets import QMainWindow +from gui.modules import menu +from gui.modules import pads + + +def register_handlers(ui: Ui_MainWindow, MainWindow: QMainWindow): + """ + Register all handlers + :param ui: + :param MainWindow: + :return: + """ + menu.register_handlers(ui) + pads.register_handlers(ui, MainWindow) diff --git a/gui/modules/initialize/__init__.py b/gui/modules/initialize/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gui/modules/initialize/setup_ui.py b/gui/modules/initialize/setup_ui.py new file mode 100644 index 0000000..ef1e939 --- /dev/null +++ b/gui/modules/initialize/setup_ui.py @@ -0,0 +1,24 @@ +from gui.gui import Ui_MainWindow +from gui.modules.core.blur import GlobalBlur +from gui.modules.initialize import styles +from gui.modules.handlers import register +from PyQt5.QtWidgets import QMainWindow +from PyQt5 import QtWidgets +from modules.config import Config + + +def on_load(ui: Ui_MainWindow, MainWindow: QMainWindow): + """ + Setup all UI elements + :param ui: + :param MainWindow: + :return: + """ + ui.content.setCurrentIndex(0) + + MainWindow.setStyleSheet(styles.centralwidget()) + ui.menu.setStyleSheet(styles.menupage()) + if 'acrylic' in Config.get().theme: + GlobalBlur(MainWindow.winId(), acrylic=True) + + register.register_handlers(ui, MainWindow) diff --git a/gui/modules/initialize/styles.py b/gui/modules/initialize/styles.py new file mode 100644 index 0000000..833f139 --- /dev/null +++ b/gui/modules/initialize/styles.py @@ -0,0 +1,593 @@ +from modules.config import Config + + +centralwidget_b = """ +QWidget { + background-color: rgba(30, 30, 30, 0.1); + color: white; + font: 10pt "Segoe UI"; +} + + +QScrollBar:vertical, +QScrollBar:horizontal { + border: none; + background: rgba(30, 30, 30, 0); + width: 10px; + margin: 15px 0 15px 0; + border-radius: 0px; +} + +QScrollBar::handle:vertical, +QScrollBar::handle:horizontal { + background-color: rgba(139, 139, 139, 0); + min-height: 30px; + border-radius: 5px; +} + +QScrollBar::handle:vertical:hover, +QScrollBar::handle:vertical:pressed, +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:horizontal:pressed { + background-color: rgba(149, 149, 149, 0); +} + +QScrollBar::sub-line:vertical, +QScrollBar::add-line:vertical, +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + height: 0px; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal, +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} + + +QPushButton { + color: white; + border-width: 1px; + border-radius:6px; + border-style: solid; + border-color: rgba(48, 48, 48, 0.5); + background-color: rgba(44, 45, 46, 0.3); +} +QPushButton:hover { + border-width: 2px; + background-color: rgba(50, 50, 50, 0.7); +} +QPushButton:pressed { + background-color: rgba(38, 39, 40, 0.7); +} +QPushButton:disabled { + background-color: rgba(67, 67, 67, 0.7); + border-color: rgba(0, 0, 0, 0.7); +} + + +QLineEdit, QTextBrowser, QPlainTextEdit, QTextEdit { + border-width: 1px; + border-radius: 5px; + border-style: solid; + border-color: rgba(48, 48, 48); + background-color: rgba(36, 36, 36, 0); + font: 10pt "Segoe UI"; +} + + +QListWidget { + border-width: 1px; + border-radius: 15px; + border-style: solid; + border-color: rgba(48, 48, 48); + padding: 10px; + background-color: rgba(100, 100, 100, 0); + font: 10pt "Segoe UI"; +} +QListWidget:item { + background-color: rgba(36, 36, 36, 0); + selection-color: white; +} +QListWidget:item:hover { + background-color: rgba(50, 50, 50, 0); +} +QListWidget:item:selected { + background-color: rgba(119, 119, 119, 1); +} + + +QComboBox +{ + border-width: 1px; + border-radius:6px; + border-style: solid; + border-color: rgba(48, 48, 48); + background-color: rgba(44, 45, 46, 0); + color: white; +} + +QComboBox::disabled +{ + background-color: rgba(67, 67, 67, 0); + color: #656565; + border-color: rgba(67, 67, 67); +} + +QComboBox:hover +{ + background-color: rgba(50, 50, 50, 0); +} + +QComboBox:on +{ + background-color: rgba(67, 67, 67, 0); +} + +QComboBox QAbstractItemView +{ + background-color: rgba(67, 67, 67, 0); + color: #ffffff; + selection-background-color: rgba(119, 119, 119, 0); + selection-color: white; + outline: 0; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + border-radius: 6px; +} + + +QTabBar::tab +{ + background-color: rgba(44, 45, 46, 0); + color: #ffffff; + border-style: solid; + border-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-color: rgba(48, 48, 48); + padding: 5px; +} + +QTabBar::tab:disabled +{ + background-color: rgba(101, 101, 101, 0); + color: #656565; +} + +QTabWidget::pane +{ + background-color: rgba(160, 160, 160, 0); + color: #ffffff; + border: 3px solid; + border-radius: 15px; + border-color: rgba(28, 28, 28); +} + +QTabBar::tab:selected +{ + background-color: rgba(38, 39, 40, 0); + color: #ffffff; + border-style: solid; + border-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-color: rgba(48, 48, 48); + padding: 5px; +} + +QTabBar::tab:selected:disabled +{ + background-color: rgba(64, 64, 64, 0); + color: #656565; +} + +QTabBar::tab:!selected +{ + background-color: rgba(38, 38, 38, 0); +} + +QTabBar::tab:!selected:hover +{ + background-color: rgba(50, 50, 50, 0); +} + +QTabBar::tab:top:!selected +{ + margin-top: 3px; +} + +QTabBar::tab:bottom:!selected +{ + margin-bottom: 3px; +} + +QTabBar::tab:top, QTabBar::tab:bottom +{ + min-width: 8ex; + margin-right: -1px; + padding: 5px 10px 5px 10px; +} + +QTabBar::tab:top:selected +{ + border-bottom-color: none; +} + +QTabBar::tab:bottom:selected +{ + border-top-color: none; +} + +QTabBar::tab:top:last, QTabBar::tab:bottom:last, +QTabBar::tab:top:only-one, QTabBar::tab:bottom:only-one +{ + margin-right: 0; +} + +QTabBar::tab:left:!selected +{ + margin-right: 3px; +} + +QTabBar::tab:right:!selected +{ + margin-left: 3px; +} + +QTabBar::tab:left, QTabBar::tab:right +{ + min-height: 8ex; + margin-bottom: -1px; + padding: 10px 5px 10px 5px; +} + +QTabBar::tab:left:selected +{ + border-left-color: none; +} + +QTabBar::tab:right:selected +{ + border-right-color: none; +} + +QTabBar::tab:left:last, QTabBar::tab:right:last, +QTabBar::tab:left:only-one, QTabBar::tab:right:only-one +{ + margin-bottom: 0; +} + +QSpinBox { + border-width: 1px; + border-radius: 5px; + border-style: solid; + border-color: rgba(48, 48, 48); + background-color: rgba(36, 36, 36, 0); + font: 10pt "Segoe UI"; +} +QSpinBox::up-button { + border: none; + background: none; +} +QSpinBox::down-button { + border: none; + background: none; +} + +QToolBox::tab { + border-style: solid; + border-width: 1px; + border-radius: 5px; + border-color: rgba(48, 48, 48, 0); +} +""" + +menupage_b = """ +QListWidget { + border-width: 0px; + border-radius: 0px; + border: none; + padding: 0px; + background-color: rgba(25, 25, 25, 0); + font: 10pt "Segoe UI"; +} +QListWidget:item { + padding-left: 12px; + height: 60px; + background-color: rgba(25, 25, 25, 0); + selection-color: rgba(255, 255, 255); +} +QListWidget:item:hover { + background-color: rgba(50, 50, 50, 0); +} +QListWidget:item:selected { + background-color: rgba(38, 39, 40, 0); +} +""" + +centralwidget_g = """ +QWidget { + background-color: rgb(30, 30, 30); + color: rgb(255, 255, 255); + font: 10pt "Segoe UI"; +} +QScrollBar:vertical, +QScrollBar:horizontal { + border: none; + background: rgb(30, 30, 30); + width: 10px; + margin: 15px 0 15px 0; + border-radius: 0px; +} +QScrollBar::handle:vertical, +QScrollBar::handle:horizontal { + background-color: rgb(139, 139, 139); + min-height: 30px; + border-radius: 5px; +} +QScrollBar::handle:vertical:hover, +QScrollBar::handle:vertical:pressed, +QScrollBar::handle:horizontal:hover, +QScrollBar::handle:horizontal:pressed { + background-color: rgb(149, 149, 149); +} +QScrollBar::sub-line:vertical, +QScrollBar::add-line:vertical, +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + height: 0px; +} +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical, +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal, +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} +QPushButton { + color: white; + border-width: 1px; + border-radius:6px; + border-style: solid; + border-color: #303030; + background-color: #2c2d2e; +} +QPushButton:hover { + border-width: 2px; + background-color: #323232; +} +QPushButton:pressed { + background-color: #262728; +} +QPushButton:disabled { + background-color: #434343; + border-color: #0000; +} +QLineEdit, QTextBrowser, QPlainTextEdit, QTextEdit { + border-width: 1px; + border-radius: 5px; + border-style: solid; + border-color: #303030; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QListWidget { + border-width: 1px; + border-radius: 15px; + border-style: solid; + border-color: #303030; + padding: 10px; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QListWidget:item { + background-color: #242424; + selection-color: white; +} +QListWidget:item:hover { + background-color: #323232; +} +QListWidget:item:selected { + background-color: #777777; +} +QComboBox +{ + border-width: 1px; + border-radius:6px; + border-style: solid; + border-color: #303030; + background-color: #2c2d2e; + color: #ffffff; +} +QComboBox::disabled +{ + background-color: #434343; + color: #656565; + border-color: #434343; +} +QComboBox:hover +{ + background-color: #323232; +} +QComboBox:on +{ + background-color: #434343; +} +QComboBox QAbstractItemView +{ + background-color: #434343; + color: #ffffff; + selection-background-color: #777777; + selection-color: white; + outline: 0; +} +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + border-radius: 6px; +} +QTabBar::tab +{ + background-color: #2c2d2e; + color: #ffffff; + border-style: solid; + border-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-color: #303030; + padding: 5px; +} +QTabBar::tab:disabled +{ + background-color: #656565; + color: #656565; +} +QTabWidget::pane +{ + background-color: #a0a0a0; + color: #ffffff; + border: 3px solid; + border-radius: 15px; + border-color: #1c1c1c; +} +QTabBar::tab:selected +{ + background-color: #262728; + color: #ffffff; + border-style: solid; + border-width: 1px; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-color: #303030; + padding: 5px; +} +QTabBar::tab:selected:disabled +{ + background-color: #404040; + color: #656565; +} +QTabBar::tab:!selected +{ + background-color: #262626; +} +QTabBar::tab:!selected:hover +{ + background-color: #323232; +} +QTabBar::tab:top:!selected +{ + margin-top: 3px; +} +QTabBar::tab:bottom:!selected +{ + margin-bottom: 3px; +} +QTabBar::tab:top, QTabBar::tab:bottom +{ + min-width: 8ex; + margin-right: -1px; + padding: 5px 10px 5px 10px; +} +QTabBar::tab:top:selected +{ + border-bottom-color: none; +} +QTabBar::tab:bottom:selected +{ + border-top-color: none; +} +QTabBar::tab:top:last, QTabBar::tab:bottom:last, +QTabBar::tab:top:only-one, QTabBar::tab:bottom:only-one +{ + margin-right: 0; +} +QTabBar::tab:left:!selected +{ + margin-right: 3px; +} +QTabBar::tab:right:!selected +{ + margin-left: 3px; +} +QTabBar::tab:left, QTabBar::tab:right +{ + min-height: 8ex; + margin-bottom: -1px; + padding: 10px 5px 10px 5px; +} +QTabBar::tab:left:selected +{ + border-left-color: none; +} +QTabBar::tab:right:selected +{ + border-right-color: none; +} +QTabBar::tab:left:last, QTabBar::tab:right:last, +QTabBar::tab:left:only-one, QTabBar::tab:right:only-one +{ + margin-bottom: 0; +} + +QSpinBox { + border-width: 1px; + border-radius: 5px; + border-style: solid; + border-color: #303030; + background-color: #242424; + font: 10pt "Segoe UI"; +} +QSpinBox::up-button { + border: none; + background: none; +} +QSpinBox::down-button { + border: none; + background: none; +} + +QToolBox::tab { + border-style: solid; + border-width: 1px; + border-radius: 5px; + border-color: #303030; +} +""" + +menupage_g = """ +QListWidget { + border-width: 0px; + border-radius: 0px; + border: none; + padding: 0px; + background-color: #191919; + font: 10pt "Segoe UI"; +} +QListWidget:item { + padding-left: 12px; + height: 60px; + background-color: #191919; + selection-color: rgba(255, 255, 255); +} +QListWidget:item:hover { + background-color: #323232; +} +QListWidget:item:selected { + background-color: #262728; +} +""" + + +def centralwidget(): + return centralwidget_g if Config.get().theme == "Dark gray" else centralwidget_b + + +def menupage(): + return menupage_g if Config.get().theme == "Dark gray" else menupage_b diff --git a/gui/modules/menu/__init__.py b/gui/modules/menu/__init__.py new file mode 100644 index 0000000..d7ed779 --- /dev/null +++ b/gui/modules/menu/__init__.py @@ -0,0 +1 @@ +from .handlers import * diff --git a/gui/modules/menu/handlers.py b/gui/modules/menu/handlers.py new file mode 100644 index 0000000..dd517ab --- /dev/null +++ b/gui/modules/menu/handlers.py @@ -0,0 +1,11 @@ +from gui.gui import Ui_MainWindow +from .menu import handle_menu_click + + +def register_handlers(ui: Ui_MainWindow): + """ + Register this module handlers + :param ui: + :return: + """ + ui.menu.itemClicked.connect(lambda: handle_menu_click(ui.menu.currentItem().text(), ui)) diff --git a/gui/modules/menu/menu.py b/gui/modules/menu/menu.py new file mode 100644 index 0000000..0dad797 --- /dev/null +++ b/gui/modules/menu/menu.py @@ -0,0 +1,41 @@ +from PyQt5 import QtCore +from gui.gui import Ui_MainWindow + + +def open_menu(ui: Ui_MainWindow) -> None: + """ + Animates the menu to open and close, using animation from config + :return: + """ + width = ui.menu.geometry().width() + Ui_MainWindow.animation = QtCore.QPropertyAnimation(ui.menu, b"minimumWidth") + Ui_MainWindow.animation.setDuration(300) + if width == 64: + Ui_MainWindow.animation.setStartValue(64) + Ui_MainWindow.animation.setEndValue(200) + else: + Ui_MainWindow.animation.setStartValue(200) + Ui_MainWindow.animation.setEndValue(64) + Ui_MainWindow.animation.setEasingCurve(QtCore.QEasingCurve.InOutQuart) + + Ui_MainWindow.animation.start() + + +def handle_menu_click(text: str, ui: Ui_MainWindow) -> None: + """ + Handles the click on the menu and changes the page + :param text: + :param ui: + :return: + """ + index = { + "Close menu": [lambda _: open_menu(ui), None], + "Pads": [ui.content.setCurrentWidget, ui.pads_page], + "Explorer": [ui.content.setCurrentWidget, ui.browser_page], + "Collections": [ui.content.setCurrentWidget, ui.collections_page], + "Stream": [ui.content.setCurrentWidget, ui.stream_page], + "Collab": [ui.content.setCurrentWidget, ui.collab_page], + "Download": [ui.content.setCurrentWidget, ui.download_page], + "Settings": [ui.content.setCurrentWidget, ui.settings_page] + } + index[text][0](index[text][1]) diff --git a/gui/modules/pads/__init__.py b/gui/modules/pads/__init__.py new file mode 100644 index 0000000..d7ed779 --- /dev/null +++ b/gui/modules/pads/__init__.py @@ -0,0 +1 @@ +from .handlers import * diff --git a/gui/modules/pads/fill_pads_from_settings.py b/gui/modules/pads/fill_pads_from_settings.py new file mode 100644 index 0000000..fd730ef --- /dev/null +++ b/gui/modules/pads/fill_pads_from_settings.py @@ -0,0 +1,33 @@ +import os +from gui.gui import Ui_MainWindow +from PyQt5 import QtWidgets, QtCore +from PyQt5.QtWidgets import QMainWindow + + +def fill_pads(ui: Ui_MainWindow, MainWindow: QMainWindow): + ui.first_pads_dict = dict() + ui.second_pads_dict = dict() + + first_pads_list = \ + [ui.edit_first_pads_collection_list.item(x).text() for x in range(ui.edit_first_pads_collection_list.count())] + + for i in range(len(first_pads_list)): + item = first_pads_list[i] + if item == '': + continue + ui.first_pads_dict[os.path.split(item)[-1]] = item + button = QtWidgets.QPushButton() + button.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, + QtWidgets.QSizePolicy.Expanding)) + button.setText(os.path.split(item)[-1] if os.path.exists(item) else "File doesn't exist") + button.clicked.connect(lambda: print(ui.first_pads_dict[MainWindow.sender().text()] + if MainWindow.sender().text() != "File doesn't exist" else None)) + print(ui.first_pads_dict) + ui.pads_collection_1_lay.addWidget(button, i // 4, i % 4) + + for i in range(16): + item = QtWidgets.QListWidgetItem() + item.setFlags( + QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled + ) + ui.edit_second_pads_collection_list.addItem(item) diff --git a/gui/modules/pads/handlers.py b/gui/modules/pads/handlers.py new file mode 100644 index 0000000..f6ece1f --- /dev/null +++ b/gui/modules/pads/handlers.py @@ -0,0 +1,16 @@ +from gui.gui import Ui_MainWindow +from PyQt5.QtWidgets import QMainWindow +from .initialize_pads_settings import * +from .fill_pads_from_settings import * + + +def register_handlers(ui: Ui_MainWindow, MainWindow: QMainWindow): + """ + Register this module handlers + :param ui: + :param MainWindow: + :return: + """ + fill_settings(ui) + fill_pads(ui, MainWindow) + ui.edit_first_pads_collection_list.itemChanged.connect(lambda: fill_pads(ui, MainWindow)) diff --git a/gui/modules/pads/initialize_pads_settings.py b/gui/modules/pads/initialize_pads_settings.py new file mode 100644 index 0000000..47321bd --- /dev/null +++ b/gui/modules/pads/initialize_pads_settings.py @@ -0,0 +1,18 @@ +from gui.gui import Ui_MainWindow +from PyQt5 import QtWidgets, QtCore + + +def fill_settings(ui: Ui_MainWindow): + for i in range(16): + item = QtWidgets.QListWidgetItem() + item.setFlags( + QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled + ) + ui.edit_first_pads_collection_list.addItem(item) + + for i in range(16): + item = QtWidgets.QListWidgetItem() + item.setFlags( + QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled + ) + ui.edit_second_pads_collection_list.addItem(item) diff --git a/modules/__init__.py b/modules/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/modules/config/__init__.py b/modules/config/__init__.py new file mode 100644 index 0000000..b8ab3e1 --- /dev/null +++ b/modules/config/__init__.py @@ -0,0 +1 @@ +from .settings import Config diff --git a/modules/config/model.py b/modules/config/model.py new file mode 100644 index 0000000..9337379 --- /dev/null +++ b/modules/config/model.py @@ -0,0 +1,8 @@ +from dataclasses import dataclass +from dataclasses_json import dataclass_json + + +@dataclass_json +@dataclass(frozen=True) +class ConfigModel: + theme: str diff --git a/modules/config/settings.py b/modules/config/settings.py new file mode 100644 index 0000000..ecfab38 --- /dev/null +++ b/modules/config/settings.py @@ -0,0 +1,42 @@ +from modules.config.model import ConfigModel +import json +import os + + +class Config: + @staticmethod + def default(): + return { + "theme": "Dark gray" + } + + @staticmethod + def fix() -> None: + try: + with open("data/config.cfg", "w") as file: + json.dump(Config.default(), file) + except FileNotFoundError: + if not os.path.exists('data'): + os.mkdir('data') + Config.fix() + + @staticmethod + def get() -> ConfigModel: + try: + with open("data/config.cfg", "r") as file: + return ConfigModel.from_dict(json.load(file)) + except: + Config.fix() + return Config.get() + + @staticmethod + def update(key: str, value: str | None) -> dict: + with open("data/config.cfg", "r") as file: + settings = json.load(file) + + settings[key] = value + + with open("data/config.cfg", "w") as file: + json.dump(settings, file) + + return settings diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7b1f91d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +wheel +rich +PyQt5 +pyinstaller +dataclasses-json +requests +python-vlc +sounddevice +numpy \ No newline at end of file