From 72c7c15cd41defb62f97212802c37391077d0948 Mon Sep 17 00:00:00 2001 From: solderercb Date: Mon, 8 Jan 2024 02:05:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B0=20=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=B8=20=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=82=D0=B5=D1=85=D0=BD=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D0=BE=D1=80=D1=83=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=D0=BD=D0=B8=D1=8F=20(=D1=80=D0=B5=D0=B4=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=20=D0=B5=D1=89=D0=B5=20=D0=BD=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appver.h | 2 +- global.h | 1 + lang/snap_ru_RU.ts | 503 +++++++++++++++------- mainwindow.cpp | 18 + mainwindow.h | 2 +- models/slocalsettings.h | 2 +- models/spermissions.h | 2 + models/stablemodelscommonmethods.cpp | 5 + models/stablemodelscommonmethods.h | 1 + models/stabletechreportsmodel.cpp | 21 + models/stabletechreportsmodel.h | 21 + models/stechreportmodel.cpp | 293 +++++++++++++ models/stechreportmodel.h | 92 ++++ schema-updates/schema-updates.qrc | 1 + schema-updates/script000021.sql | 36 ++ snap_crm.pro | 12 + styles/light/1F890_32.png | Bin 0 -> 275 bytes styles/light/1F892_32.png | Bin 0 -> 281 bytes styles/light/21B9_32.png | Bin 0 -> 498 bytes styles/styles.qrc | 3 + tabprintdialog.cpp | 25 ++ tabprintdialog.h | 3 + tabrepairs.cpp | 2 +- tabtechreports.cpp | 127 ++++++ tabtechreports.h | 36 ++ tabtechreports.ui | 271 ++++++++++++ tabtechreports.ui.bak | 316 ++++++++++++++ widgets/spagesettingsdoctempateeditor.cpp | 8 + widgets/spagesettingsdoctempateeditor.h | 1 + widgets/speriodselector.cpp | 319 ++++++++++++++ widgets/speriodselector.h | 65 +++ widgets/speriodselector.ui | 142 ++++++ widgets/sreportscommonfunctions.cpp | 90 ++++ widgets/sreportscommonfunctions.h | 12 + widgets/stableviewbase.cpp | 11 +- widgets/stableviewbase.h | 4 +- widgets/stableviewtechreports.cpp | 39 ++ widgets/stableviewtechreports.h | 21 + 38 files changed, 2345 insertions(+), 162 deletions(-) create mode 100644 models/stabletechreportsmodel.cpp create mode 100644 models/stabletechreportsmodel.h create mode 100644 models/stechreportmodel.cpp create mode 100644 models/stechreportmodel.h create mode 100644 schema-updates/script000021.sql create mode 100644 styles/light/1F890_32.png create mode 100644 styles/light/1F892_32.png create mode 100644 styles/light/21B9_32.png create mode 100644 tabtechreports.cpp create mode 100644 tabtechreports.h create mode 100644 tabtechreports.ui create mode 100644 tabtechreports.ui.bak create mode 100644 widgets/speriodselector.cpp create mode 100644 widgets/speriodselector.h create mode 100644 widgets/speriodselector.ui create mode 100644 widgets/stableviewtechreports.cpp create mode 100644 widgets/stableviewtechreports.h diff --git a/appver.h b/appver.h index 481dd42..a9c7f55 100644 --- a/appver.h +++ b/appver.h @@ -8,7 +8,7 @@ #define APP_MAJOR 0 #define APP_MINOR 0 #define APP_PATCH 0 -#define APP_COMMIT 284 +#define APP_COMMIT 285 #define FILE_VER APP_MAJOR,APP_MINOR,APP_PATCH,APP_COMMIT // обязательно запятые! #define PRODUCT_VER FILE_VER diff --git a/global.h b/global.h index e420a2d..c37d938 100644 --- a/global.h +++ b/global.h @@ -44,6 +44,7 @@ namespace Global invoice1 = 17, invoice2 = 18, invoice3 = 19, vatinvoice0 = 20, p_list0 = 21, w_list0 = 22, new_cartridge = 23, sticker_cartridge = 24, issue_cartridge = 25, slip = 27, move = 28, buyout = 29, repairs = 30, cartridges = 31, + tech_report, not_impl = 256}; Q_ENUM_NS(Reports) enum ThrowType {Debug = 0, QueryError = 1, TimeError = 2, IntegrityError = 253, ConditionsError = 254, UserCanceled = 255}; diff --git a/lang/snap_ru_RU.ts b/lang/snap_ru_RU.ts index 7673485..bf5b6f2 100644 --- a/lang/snap_ru_RU.ts +++ b/lang/snap_ru_RU.ts @@ -219,168 +219,173 @@ - + Принять - + Заправка - + Прайс-лист - + Групповой редактор ремонтов - + + Акты технического состояния + + + + Ремонты - + Приход - + Продажа - - + + Документы - + Менеджер закупок - + Управление складом - + Групповой редактор товаров - + Выгрузка товаров - + Выкуп техники - + Переучет - + Товары - + Новый клиент - + Вызовы - + SMS - + Клиенты - + Приходный кассовый ордер - + Расходный кассовый ордер - + Перемещение/обмен - + Счёт - + Счёт-фактура - + Товарная накладная - + Акт выполненных работ - + Заработная плата - + Финансы - + Проверить обновления - + О программе - + Сменить пользователя - + Выход - + Настройки @@ -3194,433 +3199,505 @@ p, li { white-space: pre-wrap; } + + SPeriodSelector + + + Form + + + + + + + + ... + + + + + + С начала месяца + + + + + С начала текущей недели + + + + + С начала текущего месяца + + + + + С начала текущего квартала + + + + + С начала текущего года + + + + + Day + День + + + + Week + Неделя + + + + Month + Месяц + + + + Quarter + Квартал + + + + Year + Год + + SPermissions - + Разрешение %1 не объявлено в классе %2! - + - + editGlobalSettings Изменять служебные настройки - + receptDevices Принимать устройства в ремонт - + printStickers Печатать ценники и стикеры - + issueDevices Выдавать устройство из ремонта - + saleGoods Быстрая продажа - + incomeGoods Заносить товар на склад (Приход товара) - + viewClients Видеть список клиентов и их данные - + createNewClient Создавать новых клиентов - + writeOffGoods Списывать товар со склада - + editGoodsPrices Редактировать цены на товары - + editClients Редактировать существующих клиентов - + createReports Генерировать и смотреть отчёты - + viewFinancialDocuments Просмотр финансовых документов - + createCashRegisters Создавать ПКО/РКО - + createZReport Создавать Z отчёт (выемка средств с кассы) - + viewCashOrders Просмотр кассы - + editGoods Редактировать товары (наименование ячейки, etc) - + readSMS Читать SMS - + viewAnyRepair Открывать карточки ремонта других пользователей - + useTelephony Использовать телефонию - + advEditRepair Администрирование карточки ремонта - + repairRecepted Статус: Приём в ремонт - + repairDiagnostics Статус: Проведение диагностики - + repairNegotiation Статус: Ожидание решения клиента - + repairConformed Статус: Согласовано с клиентом - + repairInProgress Статус: Выполнение работ - + repairWaitingParts Статус: Ожидание комплектующих - + repairReady Статус: Готово к выдаче - + repairReadyWithoutRepair Статус: Готово к выдаче без ремонта - + repairIssued Статус: Выдано клиенту - + repairFaultNotDetected Статус: Неисправность не проявилась - + repairOfficeChange Статус: Смена офиса - + repairRefused Статус: Клиент отказался от ремонта - + editWorksPriceList Редактировать прайс лист услуг - + editGoodsCatalog Редактировать каталог товаров - + syncGoodsWithShop Выгружать товары в интернет магазины - + viewPrice1 Видеть цены для СЦ - + viewPrice2 Видеть розничные цены - + viewPrice3 Видеть оптовые цены - + takeGoodsForRepair Брать товары со склада - + giveGoodsForRepair Выдавать товары сотрудникам - + manageWarehouse Управление складом - + removeGoodsFromUnissuedRepair Исключать товар из не выданного ремонта - + paySubsistence Выдавать аванс сотрудникам - + remoteLogin Удаленный вход - + addCustomWork Добавлять работы не из прайс листа - + undoOutInvoice Распроводить расходные накладные - + makeSalaryExtraCharge Делать дополнительные начисления сотрудникам - + repairDiagnosisConfirmation Статус: Подтверждение диагностики - + viewForeignOfficeCashOrders Открывать кассу чужого офиса - + setNotificationState Менять статус информирования клиента - + undoInInvoice Распроводить приходные накладные - + beginUnengagedRepair Мастер может брать свободный ремонт - + handleOnlineOrders Принимать заявки из интернет магазинов - + changeOffice Менять офис при входе - + setRepairEngineer Назначать ответственного инженера - + setRepairColor Менять цвет ремонта - + startVideoRecording Включать видео запись если она не активна - + sendSMS Отправлять SMS - + repairIssuedInCredit Статус: Выдано в долг - + handleCashlessOrders Работать с безналичными счетами - + createDatabaseBackups Создавать резервные копии БД - + createTasks Создавать задания - + veiwAllTasks Видеть задания других пользователей - + addGoodsFromWarehouse Устанавливать детали со склада - + enableSparepartRequestManager Использовать менеджер закупок - + createBackdatedDocuments Проводить документы задним числом - + moveRepairToOffice Изменять офис ремонта - + createQuickRepair Проводить быстрый ремонт - + viewForeignOfficeRepair Редактировать ремонты другого офиса - + useCashRegisterEquipment Работать с ККТ - + setRepairManager Назначать ответственного менеджера - + viewAnyWorkList Видеть работы/детали других сотрудников - + viewRepairLog Видеть историю в карте ремонта - + editCashRegisterEquipmentSettings Изменять параметры ККТ - + editCartridgeCards Редактировать карты картриджей - + sentEmail Отправлять Email - + editRepairIncomingSet Уточнять комплектацию устройства в ремонте - + editAnyComment Редактировать комментарии других пользователей - + advEditWorkList Административная правка списка работ и деталей - + viewClientPassportData Клиент: видеть паспортные данные - + viewClientBankData Клиент: видеть банковские реквизиты - + editPaymentSystemInCommittedCashRegisters Изменять платёжную систему в проведённых кассовых ордерах - + viewEmployeesSalary Просматривать заработки других пользователей + + + workWithTechReports + Работать с актами тех. состояния + SPhone @@ -4802,6 +4879,89 @@ p, li { white-space: pre-wrap; } Заработок + + STableViewTechReports + + + Num + Номер + + + + Created + Создан + + + + User + Пользователь + + + + Company + Компания + + + + Client + Клиент + + + + Device + Оборудование + + + + InvNumber + Инв. номер + + + + SerialNumber + Серийный номер + + + + ProductionData + Дата выпуска + + + + PurchaseDate + Дата приобретения + + + + InitCost + Начальная стоимость + + + + ResidualCost + Остаточная стоимость + + + + Fault + Неисправность + + + + DiagResult + Результат диагностики + + + + Conclusion + Заключение + + + + Notes + Примечания + + SToolboxSwitchPanel @@ -6156,152 +6316,152 @@ p, li { white-space: pre-wrap; } - + new_rep квитанции - + pko ПКО - + reject акта отказа - + rko РКО - + sticker1 стикера - + sticker2 стикера - + sticker3 стикера - + rep_label стикера - + warranty гарантийного талона - + works акта выполненных работ - + diag акта диагностики - + pn ПН - + rn РН - + lost акта утери квитанции - + price1 ценника - + invoice0 счета - + invoice1 счета - + invoice2 счета - + invoice3 счета - + vatinvoice0 счета - + p_list0 товарной накладной - + w_list0 наряда - + new_cartridge квитанции - + sticker_cartridge стикера - + issue_cartridge акта (заправки) - + slip слип-чека - + move накладной перемещения - + buyout закупочного акта - + repairs списка ремонтов - + cartridges списка картриджей @@ -7648,6 +7808,49 @@ p, li { white-space: pre-wrap; } + + tabTechReports + + + Form + + + + + Компания + + + + + Период + + + + + Создать + + + + + Обновить + + + + + Печать + + + + + фильтр + + + + + Акты тех. состояния + + + windowsDispatcher diff --git a/mainwindow.cpp b/mainwindow.cpp index 2d5cb33..af317aa 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -17,6 +17,7 @@ #include "tabcashmoveexch.h" #include "tabsettings.h" #include "tabsalary.h" +#include "tabtechreports.h" #include "widgets/slineedit.h" #include "com_sql_queries.h" @@ -165,6 +166,11 @@ void MainWindow::createMenu() workshop_editor->setEnabled(false); // workshop_editor->setVisible(permissions->) // TODO + QAction *techReports = new QAction(tr("Акты технического состояния"), this); + workshop_menu->addAction(techReports); + techReports->setVisible(permissions->workWithTechReports); + connect(techReports, &QAction::triggered, this, &MainWindow::createTabTechReports); + QToolButton* workshop_button = new QToolButton(); workshop_button->setMenu(workshop_menu); workshop_button->setPopupMode(QToolButton::MenuButtonPopup); @@ -685,6 +691,18 @@ void MainWindow::switchToLastUsedTab() ui->tabWidget->setCurrentWidget(tabList.last()); } +void MainWindow::createTabTechReports() +{ + tabTechReports *subwindow = tabTechReports::getInstance(this); + if (ui->tabWidget->indexOf(subwindow) == -1) // Если такой вкладки еще нет, то добавляем + ui->tabWidget->addTab(subwindow, subwindow->tabTitle()); + +// QObject::connect(subwindow, &tabRepairs::doubleClickRepair, this, &MainWindow::createTabRepair); + + ui->tabWidget->setCurrentWidget(subwindow); +// subwindow->setFocusSearchField(); +} + void MainWindow::createTabSale(int doc_id) { if(!permissions->saleGoods) diff --git a/mainwindow.h b/mainwindow.h index fc16af7..041d405 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -96,7 +96,7 @@ public slots: void createTabSparePart(int); void createTabSparePartReserve(int); void switchToLastUsedTab(); - + void createTabTechReports(); private slots: void reactivateCallerTab(QWidget *); void reactivateTabRepairNew(int); diff --git a/models/slocalsettings.h b/models/slocalsettings.h index c4edf5c..e385a52 100644 --- a/models/slocalsettings.h +++ b/models/slocalsettings.h @@ -27,7 +27,7 @@ class SLocalSettings : public QObject EmployeesReportGrid, VisitSourceGrid, StatusChecksGrid, EmployeeActivityGrid, FFRSalaryGrid, TasksGrid, CartridgeMaterialsGrid, - ClientsMatchGrid, RepairsMatchGrid}; + ClientsMatchGrid, RepairsMatchGrid, TechReportsGrid}; Q_ENUM(SettingsVariant) enum Operation {SaveFile = 0, ReadFile}; static QString appSettingsPath(); diff --git a/models/spermissions.h b/models/spermissions.h index cdbc669..a05ab91 100644 --- a/models/spermissions.h +++ b/models/spermissions.h @@ -117,6 +117,7 @@ class SPermissions : public QStandardItemModel, public SDatabaseAuxiliary PROPSTRUCT_FIELD(int, viewClientBankData, dummy) PROPSTRUCT_FIELD(int, editPaymentSystemInCommittedCashRegisters, dummy) PROPSTRUCT_FIELD(int, viewEmployeesSalary, dummy) + PROPSTRUCT_FIELD(int, workWithTechReports, dummy) public: explicit SPermissions(); QStringList list(); @@ -391,6 +392,7 @@ inline void SPermissions::translateNames() tr("viewClientBankData"); tr("editPaymentSystemInCommittedCashRegisters"); tr("viewEmployeesSalary"); + tr("workWithTechReports"); } #endif // SPERMISSIONS_H diff --git a/models/stablemodelscommonmethods.cpp b/models/stablemodelscommonmethods.cpp index e257119..8c19066 100644 --- a/models/stablemodelscommonmethods.cpp +++ b/models/stablemodelscommonmethods.cpp @@ -52,6 +52,11 @@ QString STableModelsCommonMethods::dataLocalizedFromDouble(const QModelIndex &it return sysLocale.toString(derivedModel->data(item, Qt::DisplayRole | 0x0100).toDouble(), 'f', comSettings->classicKassa?2:0); } +QString STableModelsCommonMethods::companyFromId(const QModelIndex &item) const +{ + return companiesModel->getDisplayRole(derivedModel->data(item, Qt::DisplayRole | 0x0100).toInt()); +} + QString STableModelsCommonMethods::userFromId(const QModelIndex &item) const { return usersModel->getDisplayRole(derivedModel->data(item, Qt::DisplayRole | 0x0100).toInt()); diff --git a/models/stablemodelscommonmethods.h b/models/stablemodelscommonmethods.h index 0fd4841..d0a7162 100644 --- a/models/stablemodelscommonmethods.h +++ b/models/stablemodelscommonmethods.h @@ -16,6 +16,7 @@ class STableModelsCommonMethods QDateTime timestampLocal(const QModelIndex &index) const; double total(int column, int sign = 0); QString dataLocalizedFromDouble(const QModelIndex &item) const; + QString companyFromId(const QModelIndex &item) const; QString userFromId(const QModelIndex &item) const; QString warrantyFromId(const QModelIndex &item) const; QVariant data(const int row, const int column, int role = Qt::DisplayRole) const; diff --git a/models/stabletechreportsmodel.cpp b/models/stabletechreportsmodel.cpp new file mode 100644 index 0000000..565bd8f --- /dev/null +++ b/models/stabletechreportsmodel.cpp @@ -0,0 +1,21 @@ +#include "stabletechreportsmodel.h" + +STableTechReportsModel::STableTechReportsModel(QObject *parent) : STableBaseModel(parent) +{ + +} + +QVariant STableTechReportsModel::data(const QModelIndex &index, int role) const +{ + if(role == Qt::DisplayRole) + { + switch(index.column()) + { + case Columns::Company: return companyFromId(index); + case Columns::User: return userFromId(index); + case Columns::Created: return timestampLocal(index); + default: break; + } + } + return STableBaseModel::data(index, role); +} diff --git a/models/stabletechreportsmodel.h b/models/stabletechreportsmodel.h new file mode 100644 index 0000000..2a2d5fd --- /dev/null +++ b/models/stabletechreportsmodel.h @@ -0,0 +1,21 @@ +#ifndef STABLETECHREPORTSMODEL_H +#define STABLETECHREPORTSMODEL_H + +#include +#include "models/stablebasemodel.h" +#include "global.h" + +class STableTechReportsModel : public STableBaseModel +{ + Q_OBJECT +public: + enum Columns{Id = 0, Num, Created, User, Company, Client, Device, InvNumber, SerialNumber, ProductionData, PurchaseDate, InitCost, ResidualCost, Fault, DiagResult, Conclusion, Notes}; + explicit STableTechReportsModel(QObject *parent = nullptr); + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; +// Qt::ItemFlags flags(const QModelIndex& index) const override; +private: + QVariant clientName(const QModelIndex &index) const; + QVariant dateTime(const QModelIndex &index) const; +}; + +#endif // STABLETECHREPORTSMODEL_H diff --git a/models/stechreportmodel.cpp b/models/stechreportmodel.cpp new file mode 100644 index 0000000..4ba6171 --- /dev/null +++ b/models/stechreportmodel.cpp @@ -0,0 +1,293 @@ +#include "stechreportmodel.h" + +STechReportModel::STechReportModel(QObject *parent) : SComRecord(parent) +{ + i_obligatoryFields << "created" << "user" << "company" << "client" << "device" << "diagnostic_result" << "conclusion" << "notes"; + i_tableName = "tech_reports"; + i_idColumnName = "id"; +} + +STechReportModel::~STechReportModel() +{ + +} + +void STechReportModel::load(const int &id) +{ + QSqlQuery *record = new QSqlQuery(QSqlDatabase::database("connMain")); + record->exec(QString("SELECT `id`, `num`, `created`, `user`, `company`, `client`, `device`, `inventory_number`, `serial_number`, CONVERT(`production_date`, CHAR) AS 'production_date', CONVERT(`purchase_date`, CHAR) AS 'purchase_date', `initial_cost`, `residual_cost`, `fault`, `diagnostic_result`, `conclusion`, `notes` FROM `tech_reports` WHERE `id` = %1;").arg(id)); + + if(record->first()) + { + QString productionDate = record->value("production_date").toString(); + QString purchaseDate = record->value("purchase_date").toString(); + + i_id = id; + i_valuesMap.clear(); + m_num = record->value("num").toString(); + i_createdUtc = record->value("created").toDateTime(); + m_user = record->value("user").toInt(); + m_company = record->value("company").toInt(); + m_client = record->value("client").toInt(); + m_device = record->value("device").toString(); + m_inventoryNumber = record->value("inventory_number").toString(); + m_serialNumber = record->value("serial_number").toString(); + m_productionYear = yearFromString(productionDate); + m_productionMonth = monthFromString(productionDate); + m_productionDay = dayFromString(productionDate); + m_purchaseYear = yearFromString(purchaseDate); + m_purchaseMonth = monthFromString(purchaseDate); + m_purchaseDay = dayFromString(purchaseDate); + m_initialCost = record->value("initial_cost").toDouble(); + m_residualCost = record->value("residual_cost").toDouble(); + m_fault = record->value("fault").toString(); + m_diagnosticResult = record->value("diagnostic_result").toString(); + m_conclusion = record->value("conclusion").toString(); + m_notes = record->value("notes").toString(); + + m_clientModel = new SClientModel(m_client, this); + + fillEmptyField(m_serialNumber); + fillEmptyField(m_inventoryNumber); + } + + delete record; +} + +const int& STechReportModel::id() +{ + return i_id; +} + +const QString& STechReportModel::num() +{ + return m_num; +} + +void STechReportModel::setNum(const QString &num) +{ + i_valuesMap.insert("num", num); +} + +QString STechReportModel::created() +{ + return utcToLocal(createdUtc()).toString("yyyy-MM-dd hh:mm:ss"); +} + +const int& STechReportModel::user() +{ + return m_user; +} + +void STechReportModel::setUser(const int &user) +{ + i_valuesMap.insert("user", user); +} + +const int& STechReportModel::company() +{ + return m_company; +} + +void STechReportModel::setCompany(const int &company) +{ + i_valuesMap.insert("company", company); +} + +const QString STechReportModel::client() +{ + return m_clientModel->fullLongName(); +} + +const int& STechReportModel::clientId() +{ + return m_client; +} + +void STechReportModel::setClientId(const int &client) +{ + i_valuesMap.insert("client", client); +} + +const QString& STechReportModel::device() +{ + return m_device; +} + +void STechReportModel::setDevice(const QString &device) +{ + i_valuesMap.insert("device", device); +} + +const QString& STechReportModel::inventoryNumber() +{ + return m_inventoryNumber; +} + +void STechReportModel::setInventoryNumber(const QString &inventory_number) +{ + i_valuesMap.insert("inventory_number", inventory_number); +} + +const QString& STechReportModel::serialNumber() +{ + return m_serialNumber; +} + +void STechReportModel::setSerialNumber(const QString &serial_number) +{ + i_valuesMap.insert("serial_number", serial_number); +} + +void STechReportModel::setProductionDate(const QDate &production_date) +{ + i_valuesMap.insert("production_date", production_date); +} + +void STechReportModel::setPurchaseDate(const QDate &purchase_date) +{ + i_valuesMap.insert("purchase_date", purchase_date); +} + +const double& STechReportModel::initialCost() +{ + return m_initialCost; +} + +void STechReportModel::setInitialCost(const double &initial_cost) +{ + i_valuesMap.insert("initial_cost", initial_cost); +} + +const double& STechReportModel::residualCost() +{ + return m_residualCost; +} + +void STechReportModel::setResidualCost(const double &residual_cost) +{ + i_valuesMap.insert("residual_cost", residual_cost); +} + +const QString& STechReportModel::fault() +{ + return m_fault; +} + +void STechReportModel::setFault(const QString &text) +{ + i_valuesMap.insert("fault", text); +} + +const QString& STechReportModel::diagnosticResult() +{ + return m_diagnosticResult; +} + +void STechReportModel::setDiagnosticResult(const QString &text) +{ + i_valuesMap.insert("diagnostic_result", text); +} + +const QString& STechReportModel::conclusion() +{ + return m_conclusion; +} + +void STechReportModel::setConclusion(const QString &text) +{ + i_valuesMap.insert("conclusion", text); +} + +const QString &STechReportModel::notes() +{ + return m_notes; +} + +void STechReportModel::setNotes(const QString &text) +{ + i_valuesMap.insert("notes", text); +} + +void STechReportModel::initDemo() +{ + QString productionDate = "2008-00-00"; + QString purchaseDate = "2008-04-01"; + + i_id = 123; + m_num = "74"; + i_createdUtc = QDateTime::fromString("2024.01.05 12:00:00", "yyyy.MM.dd hh:mm:ss"); + m_user = 1; + m_company = 1; + m_client = 456; + m_device = "Кондиционер Аkira"; + m_inventoryNumber = "212.72.20941032"; + m_serialNumber = "SN7890AA24"; + m_productionYear = yearFromString(productionDate); + m_productionMonth = monthFromString(productionDate); + m_productionDay = dayFromString(productionDate); + m_purchaseYear = yearFromString(purchaseDate); + m_purchaseMonth = monthFromString(purchaseDate); + m_purchaseDay = dayFromString(purchaseDate); + m_initialCost = 0; + m_residualCost = 1900; + m_fault = "Не охлаждает"; + m_diagnosticResult = "Узлы устройства находятся в исправном состоянии, внешних повреждений при обследовании не обнаружено; в охлаждающем контуре отсутствует хладагент. В процессе обследования производился внешний визуальный осмотр, съем защитных кожухов, исследование внутренних элементов, а также проверка его работы."; + m_conclusion = "Для восстановления работоспособности устройства требуется заправка хладагентом Жы-123; рекомендуется заменить теплоизоляцию на наружных трубках охлаждающего контура. Требуется очистка радиатора внешнего блока от пыли/грязи."; + m_notes = "Проверка герметичности охлаждающего контура не производилась. В случае нарушений герметичности рекомендуется заменить все соединительные трубки между внешним и внутренним блоками."; + + m_clientModel = new SClientModel(); + m_clientModel->setParent(this); + m_clientModel->initDemo(); +} + +void STechReportModel::fillEmptyField(QString &field) +{ + if(field.isEmpty()) + field = "—"; +} + +/* Форматирование строки даты производства/приобретения +*/ +QString STechReportModel::dateToString(const int &year, const int &month, const int &day) +{ + if(!year) + return "—"; + + QString ret = QString::number(year); + if(month) + ret = QString::number(month).rightJustified(2, '0') + "." + ret; + if(day) + ret = QString::number(day).rightJustified(2, '0') + "." + ret; + + return ret; +} + +/* Извлечение года, месяца и дня из даты в виде строки, отформатированной по правилу yyyy-MM-dd + * Класс QDate не допускает ноль в поле месяца и дня, MySQL же допускает такие значения +*/ +int STechReportModel::yearFromString(const QString &date) +{ + return date.leftRef(4).toInt(); +} + +int STechReportModel::monthFromString(const QString &date) +{ + return date.midRef(5, 2).toInt(); +} + +int STechReportModel::dayFromString(const QString &date) +{ + return date.midRef(8, 2).toInt(); +} + +QString STechReportModel::productionDate() +{ + return dateToString(m_productionYear, m_productionMonth, m_productionDay); +} + +QString STechReportModel::purchaseDate() +{ + return dateToString(m_purchaseYear, m_purchaseMonth, m_purchaseDay); +} + diff --git a/models/stechreportmodel.h b/models/stechreportmodel.h new file mode 100644 index 0000000..5820f10 --- /dev/null +++ b/models/stechreportmodel.h @@ -0,0 +1,92 @@ +#ifndef STECHREPORTMODEL_H +#define STECHREPORTMODEL_H + +#include "scomrecord.h" +#include +#include "models/sclientmodel.h" + +class STechReportModel : public SComRecord +{ + Q_OBJECT + Q_PROPERTY(int id READ id) + Q_PROPERTY(QString num READ num) + Q_PROPERTY(QString created READ created) + Q_PROPERTY(int user READ user) + Q_PROPERTY(int company READ company) + Q_PROPERTY(QString client READ client) + Q_PROPERTY(QString device READ device) + Q_PROPERTY(QString inventoryNumber READ inventoryNumber) + Q_PROPERTY(QString serialNumber READ serialNumber) + Q_PROPERTY(QString productionDate READ productionDate) + Q_PROPERTY(QString purchaseDate READ purchaseDate) + Q_PROPERTY(double initialCost READ initialCost) + Q_PROPERTY(double residualCost READ residualCost) + Q_PROPERTY(QString fault READ fault) + Q_PROPERTY(QString diagnosticResult READ diagnosticResult) + Q_PROPERTY(QString conclusion READ conclusion) + Q_PROPERTY(QString notes READ notes) +public: + explicit STechReportModel(QObject *parent = nullptr); + ~STechReportModel(); + void load(const int &id); + const int& id(); + const QString& num(); + void setNum(const QString &num); + QString created(); + const int& user(); + void setUser(const int &user); + const int& company(); + void setCompany(const int &company); + const int& clientId(); + void setClientId(const int &client); + const QString client(); + const QString& device(); + void setDevice(const QString &device); + const QString& inventoryNumber(); + void setInventoryNumber(const QString &inventory_number); + const QString& serialNumber(); + void setSerialNumber(const QString &serial_number); + void setProductionDate(const QDate &production_date); + void setPurchaseDate(const QDate &purchase_date); + const double& initialCost(); + void setInitialCost(const double &initial_cost); + const double& residualCost(); + void setResidualCost(const double &residual_cost); + const QString& fault(); + void setFault(const QString &text); + const QString& diagnosticResult(); + void setDiagnosticResult(const QString &text); + const QString& conclusion(); + void setConclusion(const QString &text); + const QString& notes(); + void setNotes(const QString &text); + void initDemo() override; +private: + QString m_num; + int m_user; + int m_company; + int m_client; + QString m_device; + QString m_inventoryNumber; + QString m_serialNumber; + int m_productionYear, m_productionMonth, m_productionDay; + int m_purchaseYear, m_purchaseMonth, m_purchaseDay; + double m_initialCost; + double m_residualCost; + QString m_fault; + QString m_diagnosticResult; + QString m_conclusion; + QString m_notes; + SClientModel *m_clientModel; + void fillEmptyField(QString &field); + QString dateToString(const int &year, const int &month, const int &day); + int yearFromString(const QString &date); + int monthFromString(const QString &date); + int dayFromString(const QString &date); + QString productionDate(); + QString purchaseDate(); + QString reportInitialCost(); + QString reportResidualCost(); +}; + +#endif // STECHREPORTMODEL_H diff --git a/schema-updates/schema-updates.qrc b/schema-updates/schema-updates.qrc index 27c9e27..e992673 100644 --- a/schema-updates/schema-updates.qrc +++ b/schema-updates/schema-updates.qrc @@ -20,5 +20,6 @@ script000018.sql script000019.sql script000020.sql + script000021.sql diff --git a/schema-updates/script000021.sql b/schema-updates/script000021.sql new file mode 100644 index 0000000..ab7afd8 --- /dev/null +++ b/schema-updates/script000021.sql @@ -0,0 +1,36 @@ +CREATE TABLE `tech_reports` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `num` VARCHAR(50) NULL DEFAULT NULL, + `created` DATETIME NOT NULL, + `user` INT(11) NOT NULL, + `company` INT(11) NOT NULL, + `client` INT(11) NOT NULL, + `device` VARCHAR(255) NOT NULL, + `inventory_number` VARCHAR(255) NULL DEFAULT NULL, + `serial_number` VARCHAR(255) NULL DEFAULT 'нет', + `production_date` DATE NULL DEFAULT NULL, + `purchase_date` DATE NULL DEFAULT NULL, + `initial_cost` DECIMAL(11,4) NULL DEFAULT NULL, + `residual_cost` DECIMAL(11,4) NULL DEFAULT NULL, + `fault` VARCHAR(255) NULL DEFAULT '', + `diagnostic_result` TEXT NULL, + `conclusion` TEXT NULL, + `notes` TEXT NULL, + PRIMARY KEY (`id`), + INDEX `FK_tech_reports_users` (`user`), + INDEX `FK_tech_reports_companies` (`company`), + INDEX `FK_tech_reports_clients` (`client`), + CONSTRAINT `FK_tech_reports_clients` FOREIGN KEY (`client`) REFERENCES `clients` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT `FK_tech_reports_companies` FOREIGN KEY (`company`) REFERENCES `companies` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT `FK_tech_reports_users` FOREIGN KEY (`user`) REFERENCES `users` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION +) +COMMENT='акты технического состояния' +COLLATE='utf8mb4_general_ci' +ENGINE=InnoDB +AUTO_INCREMENT=1; + +INSERT INTO `doc_templates_snap` (`id`, `name`, `description`, `data`, `checksum`) VALUES (31, 'tech_report', 'Акт технического состояния', UNHEX('3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0A3C5265706F72743E0A20203C6F626A65637420436C6173734E616D653D224C696D655265706F72743A3A5265706F7274456E67696E65507269766174652220547970653D224F626A656374223E0A202020203C6F626A6563744E616D6520547970653D2251537472696E67223E3C2F6F626A6563744E616D653E0A202020203C706167657320547970653D22436F6C6C656374696F6E223E0A2020202020203C6974656D20436C6173734E616D653D224C696D655265706F72743A3A5061676544657369676E496E74662220547970653D224F626A656374223E0A20202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E70616765313C2F6F626A6563744E616D653E0A20202020202020203C6974656D496E6465784D6574686F6420547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020203C7363656E6552656374206865696768743D22333037352220547970653D2251526563742220783D222D3530222077696474683D22323230302220793D222D3530222F3E0A20202020202020203C62737054726565446570746820547970653D22696E74222056616C75653D2235222F3E0A20202020202020203C666F6E7420706F696E7453697A653D223922206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A20202020202020203C736F72744361636865456E61626C656420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020203C737469636B79466F63757320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020203C6D696E696D756D52656E64657253697A6520547970653D22717265616C222056616C75653D2230222F3E0A20202020202020203C666F6375734F6E546F75636820547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020203C706167654974656D20436C6173734E616D653D22506167654974656D2220547970653D224F626A656374223E0A202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E5265706F727470616765313C2F6F626A6563744E616D653E0A202020202020202020203C67656F6D65747279206865696768743D22323937302220547970653D2251526563742220783D2230222077696474683D22323130302220793D2230222F3E0A202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E223E0A2020202020202020202020203C6974656D20436C6173734E616D653D22506167654865616465722220547970653D224F626A656374223E0A20202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E50616765486561646572313C2F6F626A6563744E616D653E0A20202020202020202020202020203C67656F6D65747279206865696768743D223531302220547970653D2251526563742220783D22323030222077696474683D22313835302220793D223530222F3E0A20202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E223E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D353C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2235302220547970653D2251526563742220783D22313230222077696474683D22313235302220793D22323838222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E50616765486561646572313C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E24447B636F6D70616E792E736974657D3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223334222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313022206974616C69633D2230222066616D696C793D22417269616C2220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D343C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2235302220547970653D2251526563742220783D22313230222077696474683D22313235302220793D22323238222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E50616765486561646572313C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E24447B6F66666963652E70686F6E65327D3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223334222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313022206974616C69633D2230222066616D696C793D22417269616C2220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D333C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2235302220547970653D2251526563742220783D22313230222077696474683D22313235302220793D22313638222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E50616765486561646572313C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E24447B6F66666963652E70686F6E657D3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223334222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313022206974616C69633D2230222066616D696C793D22417269616C2220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E546578744974656D323C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D323C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2235302220547970653D2251526563742220783D22313230222077696474683D22313235302220793D22313038222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E50616765486561646572313C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E24447B6F66666963652E616464726573737D3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223334222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313022206974616C69633D2230222066616D696C793D22417269616C2220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22496D6167654974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E496D6167654974656D363C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D223333302220547970653D2251526563742220783D2231333836222077696474683D223333302220793D2238222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E50616765486561646572313C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C696D61676520547970653D2251496D616765223E3C2F696D6167653E0A2020202020202020202020202020202020203C6F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C64617461736F7572636520547970653D2251537472696E67223E636F6D70616E793C2F64617461736F757263653E0A2020202020202020202020202020202020203C6669656C6420547970653D2251537472696E67223E6C6F676F3C2F6669656C643E0A2020202020202020202020202020202020203C666F726D617420547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7363616C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6B656570417370656374526174696F20547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C63656E74657220547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C7265736F757263655061746820547970653D2251537472696E67223E3C2F7265736F75726365506174683E0A2020202020202020202020202020202020203C7661726961626C6520547970653D2251537472696E67223E3C2F7661726961626C653E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C75736545787465726E616C5061696E74657220547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D363C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2238302220547970653D2251526563742220783D22313230222077696474683D22313235302220793D223130222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E50616765486561646572313C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E24447B636F6D70616E792E6E616D657D3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223334222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313422206974616C69633D2230222066616D696C793D2248616E64656C476F746869632220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A20202020202020202020202020203C2F6368696C6472656E3E0A20202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A20202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E5265706F727470616765313C2F706172656E744E616D653E0A20202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A20202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C62616E64496E64657820547970653D22696E74222056616C75653D2230222F3E0A20202020202020202020202020203C6B656570426F74746F6D537061636520547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C6B656570546F70537061636520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020203C706172656E7442616E6420547970653D2251537472696E67223E3C2F706172656E7442616E643E0A20202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A20202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020203C7072696E744966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A20202020202020202020202020203C73686966744974656D7320547970653D22696E74222056616C75653D2230222F3E0A20202020202020202020202020203C7072696E744F6E46697273745061676520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020203C7072696E744F6E4C6173745061676520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020203C2F6974656D3E0A2020202020202020202020203C6974656D20436C6173734E616D653D22446174612220547970653D224F626A656374223E0A20202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E4461746142616E64363C2F6F626A6563744E616D653E0A20202020202020202020202020203C67656F6D65747279206865696768743D22323335302220547970653D2251526563742220783D22323030222077696474683D22313835302220793D22353630222F3E0A20202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E223E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D35363C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2235302220547970653D2251526563742220783D2231323330222077696474683D223536302220793D22323330222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E4461746142616E64363C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E24537B64617465466F726D61742824447B7265706F72742E637265617465647D2C2022C2AB6464C2BB204D4D4D4D207979797922297D3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223334222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D313C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2235302220547970653D2251526563742220783D223130222077696474683D22313833302220793D22313030222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E4461746142616E64363C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223ED182D0B5D185D0BDD0B8D187D0B5D181D0BAD0BED0B3D0BE20D181D0BED181D182D0BED18FD0BDD0B8D18F20D0BED0B1D0BED180D183D0B4D0BED0B2D0B0D0BDD0B8D18F3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223336222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D35373C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2238302220547970653D2251526563742220783D223130222077696474683D22313833302220793D223130222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E4461746142616E64363C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223ED090D09AD0A220E2849624537B64617465466F726D61742824447B7265706F72742E637265617465647D2C20227979797922297D2D24447B7265706F72742E6E756D7D3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223336222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313622206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223735222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D35383C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D2235302220547970653D2251526563742220783D223530222077696474683D223536302220793D22323330222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E4461746142616E64363C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B636974793E3C2F636F6E74656E743E0A2020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A2020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020203C6974656D20436C6173734E616D653D22564C61796F75742220547970653D224F626A656374223E0A2020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434303C2F6F626A6563744E616D653E0A2020202020202020202020202020202020203C67656F6D65747279206865696768743D22313130302220547970653D2251526563742220783D223230222077696474683D22313831302220793D22333432222F3E0A2020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E223E0A20202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22564C61796F75742220547970653D224F626A656374223E0A202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434323C2F6F626A6563744E616D653E0A202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D223837342220547970653D2251526563742220783D2230222077696474683D22313831302220793D2230222F3E0A202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E223E0A2020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A20202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34333C2F6F626A6563744E616D653E0A20202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2237392220547970653D2251526563742220783D2230222077696474683D22313831302220793D2230222F3E0A20202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A20202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D33222F3E0A20202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434323C2F706172656E744E616D653E0A20202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A20202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A20202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED097D0B0D0BAD0B0D0B7D187D0B8D0BA3A266C743B2F753E2024447B7265706F72742E636C69656E747D3C2F636F6E74656E743E0A20202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A20202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A20202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A20202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A20202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A20202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A20202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020203C2F6974656D3E0A2020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22564C61796F75742220547970653D224F626A656374223E0A20202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434333C2F6F626A6563744E616D653E0A20202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D223734352220547970653D2251526563742220783D2230222077696474683D22313831302220793D22313239222F3E0A20202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E223E0A202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34343C2F6F626A6563744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2236352220547970653D2251526563742220783D2230222077696474683D22313831302220793D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D34222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434333C2F706172656E744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A2020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED09DD0B0D0B8D0BCD0B5D0BDD0BED0B2D0B0D0BDD0B8D0B520D0B8D0B7D0B4D0B5D0BBD0B8D18F3A266C743B2F753E266C743B693E2024447B7265706F72742E6465766963657D266C743B2F693E3C2F636F6E74656E743E0A2020202020202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A2020202020202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34353C2F6F626A6563744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2236352220547970653D2251526563742220783D2230222077696474683D22313831302220793D223635222F3E0A2020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D34222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434333C2F706172656E744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A2020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED098D0BDD0B2D0B5D0BDD182D0B0D180D0BDD18BD0B920D0BDD0BED0BCD0B5D1803A266C743B2F753E266C743B693E2024447B7265706F72742E696E76656E746F72794E756D6265727D266C743B2F693E3C2F636F6E74656E743E0A2020202020202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A2020202020202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34363C2F6F626A6563744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2236352220547970653D2251526563742220783D2230222077696474683D22313831302220793D22313330222F3E0A2020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D34222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434333C2F706172656E744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A2020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED0A1D0B5D180D0B8D0B9D0BDD18BD0B920D0BDD0BED0BCD0B5D1803A266C743B2F753E266C743B693E2024447B7265706F72742E73657269616C4E756D6265727D266C743B2F693E3C2F636F6E74656E743E0A2020202020202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A2020202020202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A2020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34373C2F6F626A6563744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2236352220547970653D2251526563742220783D2230222077696474683D22313831302220793D22313936222F3E0A2020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A2020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D34222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434333C2F706172656E744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A2020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED094D0B0D182D0B020D0B8D0B7D0B3D0BED182D0BED0B2D0BBD0B5D0BDD0B8D18F3A266C743B2F753E266C743B693E2024447B7265706F72742E70726F64756374696F6E446174657D266C743B2F693E3C2F636F6E74656E743E0A2020202020202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A2020202020202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A2020202020202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A2020202020202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A2020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A2020202020202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22564C61796F75742220547970653D224F626A656374223E0A2020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434373C2F6F626A6563744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D223438332220547970653D2251526563742220783D2230222077696474683D22313831302220793D22323631222F3E0A2020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E223E0A20202020202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A202020202020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34383C2F6F626A6563744E616D653E0A202020202020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2238332220547970653D2251526563742220783D2230222077696474683D22313831302220793D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D33222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434373C2F706172656E744E616D653E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED0A2D0B5D185D0BDD0B8D187D0B5D181D0BAD0BED0B520D181D0BED181D182D0BED18FD0BDD0B8D0B53A266C743B2F753E266C743B693E2024447B7265706F72742E6661756C747D266C743B2F693E3C2F636F6E74656E743E0A202020202020202020202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A202020202020202020202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A20202020202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A202020202020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34393C2F6F626A6563744E616D653E0A202020202020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2238332220547970653D2251526563742220783D2230222077696474683D22313831302220793D22313333222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D33222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434373C2F706172656E744E616D653E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED0A3D181D182D0B0D0BDD0BED0B2D0BBD0B5D0BDD0BE3A266C743B2F753E20266C743B693E24447B7265706F72742E646961676E6F73746963526573756C747D266C743B2F693E3C2F636F6E74656E743E0A202020202020202020202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A202020202020202020202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A20202020202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A202020202020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D35303C2F6F626A6563744E616D653E0A202020202020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2238332220547970653D2251526563742220783D2230222077696474683D22313831302220793D22323636222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D33222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434373C2F706172656E744E616D653E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED097D0B0D0BAD0BBD18ED187D0B5D0BDD0B8D0B53A266C743B2F753E20266C743B693E24447B7265706F72742E636F6E636C7573696F6E7D266C743B2F693E3C2F636F6E74656E743E0A202020202020202020202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A202020202020202020202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A20202020202020202020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A202020202020202020202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D35313C2F6F626A6563744E616D653E0A202020202020202020202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2238332220547970653D2251526563742220783D2230222077696474683D22313831302220793D22343030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D33222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434373C2F706172656E744E616D653E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2232222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E266C743B753ED09FD180D0B8D0BCD0B5D187D0B0D0BDD0B8D0B53A266C743B2F753E20266C743B693E24447B7265706F72742E6E6F7465737D266C743B2F693E3C2F636F6E74656E743E0A202020202020202020202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A202020202020202020202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A202020202020202020202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A2020202020202020202020202020202020202020202020202020202020203C2F6368696C6472656E3E0A2020202020202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D31222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434333C2F706172656E744E616D653E0A2020202020202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020202020202020202020202020203C68696465456D7074794974656D7320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020202020202020203C6C61796F757453706163696E6720547970653D22696E74222056616C75653D2235222F3E0A202020202020202020202020202020202020202020202020202020203C2F6974656D3E0A20202020202020202020202020202020202020202020202020203C2F6368696C6472656E3E0A20202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D31222F3E0A20202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434323C2F706172656E744E616D653E0A20202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A20202020202020202020202020202020202020202020202020203C68696465456D7074794974656D7320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6C61796F757453706163696E6720547970653D22696E74222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020202020202020203C2F6368696C6472656E3E0A202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D31222F3E0A202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434303C2F706172656E744E616D653E0A202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A202020202020202020202020202020202020202020203C68696465456D7074794974656D7320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C6C61796F757453706163696E6720547970653D22696E74222056616C75653D2235222F3E0A20202020202020202020202020202020202020203C2F6974656D3E0A20202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22484C61796F75742220547970653D224F626A656374223E0A202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E486F72697A6F6E74616C4C61796F757434303C2F6F626A6563744E616D653E0A202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2237362220547970653D2251526563742220783D2230222077696474683D22313831302220793D2231303234222F3E0A202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E223E0A2020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A20202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34313C2F6F626A6563744E616D653E0A20202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2237362220547970653D2251526563742220783D2230222077696474683D223535302220793D2230222F3E0A20202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A20202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D31222F3E0A20202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E486F72697A6F6E74616C4C61796F757434303C2F706172656E744E616D653E0A20202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A20202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E24447B636F6D70616E792E6E616D657D3C2F636F6E74656E743E0A20202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A20202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223333222F3E0A20202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A20202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A20202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A20202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A20202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020203C2F6974656D3E0A2020202020202020202020202020202020202020202020203C6974656D20436C6173734E616D653D22546578744974656D2220547970653D224F626A656374223E0A20202020202020202020202020202020202020202020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E546578744974656D34323C2F6F626A6563744E616D653E0A20202020202020202020202020202020202020202020202020203C67656F6D65747279206865696768743D2237362220547970653D2251526563742220783D22353530222077696474683D22313236302220793D2230222F3E0A20202020202020202020202020202020202020202020202020203C6368696C6472656E20547970653D22436F6C6C656374696F6E222F3E0A20202020202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D31222F3E0A20202020202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E486F72697A6F6E74616C4C61796F757434303C2F706172656E744E616D653E0A20202020202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A20202020202020202020202020202020202020202020202020203C636F6E74656E7420547970653D2251537472696E67223E24447B636F6D70616E792E6469726563746F727D3C2F636F6E74656E743E0A20202020202020202020202020202020202020202020202020203C6D617267696E20547970653D22696E74222056616C75653D2234222F3E0A20202020202020202020202020202020202020202020202020203C616C69676E6D656E7420547970653D22656E756D416E64466C616773222056616C75653D223334222F3E0A20202020202020202020202020202020202020202020202020203C6175746F576964746820547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F6E7420706F696E7453697A653D22313222206974616C69633D2230222066616D696C793D225365676F652055492220756E6465726C696E653D22302220547970653D2251466F6E7422207765696768743D223530222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A20202020202020202020202020202020202020202020202020203C666F6E74436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020202020202020202020202020203C616E676C6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F726567726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A20202020202020202020202020202020202020202020202020203C756E6465726C696E657320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C6164617074466F6E74546F53697A6520547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C7472696D56616C756520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C6C696E6553706163696E6720547970653D22696E74222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C756E6465726C696E654C696E6553697A6520547970653D22696E74222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C20547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C616C6C6F7748544D4C496E4669656C647320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F726D617420547970653D2251537472696E67223E3C2F666F726D61743E0A20202020202020202020202020202020202020202020202020203C76616C75655479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F6C6C6F77546F20547970653D2251537472696E67223E3C2F666F6C6C6F77546F3E0A20202020202020202020202020202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020202020202020202020202020203C74657874496E64656E7420547970653D22717265616C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C746578744C61796F7574446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2232222F3E0A20202020202020202020202020202020202020202020202020203C66696C6C496E5365636F6E645061737320547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C77617465726D61726B20547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C7265706C616365435277697468425220547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C686964654966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020202020202020202020202020203C666F6E744C657474657253706163696E6720547970653D22696E74222056616C75653D2230222F3E0A2020202020202020202020202020202020202020202020203C2F6974656D3E0A202020202020202020202020202020202020202020203C2F6368696C6472656E3E0A202020202020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D222D33222F3E0A202020202020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E566572746963616C4C61796F757434303C2F706172656E744E616D653E0A202020202020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A202020202020202020202020202020202020202020203C68696465456D7074794974656D7320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C6C61796F757453706163696E6720547970653D22696E74222056616C75653D2230222F3E0A202020202020202020202020202020202020202020203C6C61796F75745479706520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020202020202020203C2F6974656D3E0A2020202020202020202020202020202020203C2F6368696C6472656E3E0A2020202020202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A2020202020202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E4461746142616E64363C2F706172656E744E616D653E0A2020202020202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A2020202020202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A2020202020202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C6974656D4C6F636174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A2020202020202020202020202020202020203C73747265746368546F4D617848656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6974656D416C69676E20547970653D22656E756D416E64466C616773222056616C75653D2234222F3E0A2020202020202020202020202020202020203C68696465456D7074794974656D7320547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020202020202020203C6C61796F757453706163696E6720547970653D22696E74222056616C75653D223135222F3E0A202020202020202020202020202020203C2F6974656D3E0A20202020202020202020202020203C2F6368696C6472656E3E0A20202020202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A20202020202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E5265706F727470616765313C2F706172656E744E616D653E0A20202020202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A20202020202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A20202020202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020203C6175746F48656967687420547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020203C62616E64496E64657820547970653D22696E74222056616C75653D2231222F3E0A20202020202020202020202020203C6B656570426F74746F6D537061636520547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C6B656570546F70537061636520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020203C706172656E7442616E6420547970653D2251537472696E67223E3C2F706172656E7442616E643E0A20202020202020202020202020203C6261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A20202020202020202020202020203C6261636B67726F756E6442727573685374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A20202020202020202020202020203C7072696E744966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C6261636B67726F756E644D6F646520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020203C6261636B67726F756E644F70616369747920547970653D22696E74222056616C75653D22313030222F3E0A20202020202020202020202020203C73686966744974656D7320547970653D22696E74222056616C75653D2230222F3E0A20202020202020202020202020203C64617461736F7572636520547970653D2251537472696E67223E7265706F72743C2F64617461736F757263653E0A20202020202020202020202020203C6B65657053756264657461696C546F67657468657220547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C73706C69747461626C6520547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C6B656570466F6F746572546F67657468657220547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C736C6963654C617374526F7720547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C636F6C756D6E73436F756E7420547970653D22696E74222056616C75653D2231222F3E0A20202020202020202020202020203C636F6C756D6E7346696C6C446972656374696F6E20547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A20202020202020202020202020203C73746172744E65775061676520547970653D22626F6F6C222056616C75653D2231222F3E0A20202020202020202020202020203C737461727446726F6D4E65775061676520547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020202020202020203C616C7465726E6174654261636B67726F756E64436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223666666666666222F3E0A20202020202020202020202020203C757365416C7465726E6174654261636B67726F756E64436F6C6F7220547970653D22626F6F6C222056616C75653D2230222F3E0A2020202020202020202020203C2F6974656D3E0A202020202020202020203C2F6368696C6472656E3E0A202020202020202020203C7A4F7264657220547970653D22717265616C222056616C75653D2230222F3E0A202020202020202020203C626F726465727320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020203C706172656E744E616D6520547970653D2251537472696E67223E3C2F706172656E744E616D653E0A202020202020202020203C626F726465724C696E6553697A6520547970653D22717265616C222056616C75653D2231222F3E0A202020202020202020203C697356697369626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020203C736861646F7720547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C626F72646572436F6C6F7220547970653D2251436F6C6F72222056616C75653D2223303030303030222F3E0A202020202020202020203C67656F6D657472794C6F636B656420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C626F726465725374796C6520547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020203C746F704D617267696E20547970653D22696E74222056616C75653D2235222F3E0A202020202020202020203C626F74746F6D4D617267696E20547970653D22696E74222056616C75653D2235222F3E0A202020202020202020203C72696768744D617267696E20547970653D22696E74222056616C75653D2235222F3E0A202020202020202020203C6C6566744D617267696E20547970653D22696E74222056616C75653D223230222F3E0A202020202020202020203C706167654F7269656E746174696F6E20547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020203C7061676553697A6520547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020203C677269645374657020547970653D22696E74222056616C75653D223130222F3E0A202020202020202020203C66756C6C5061676520547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C6F6C645072696E744D6F646520547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C7265736574506167654E756D62657220547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C6973457874656E646564496E44657369676E4D6F646520547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C657874656E64656448656967687420547970653D22696E74222056616C75653D2231303030222F3E0A202020202020202020203C706167654973544F4320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C7365745061676553697A65546F5072696E74657220547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C656E646C65737348656967687420547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C7072696E7461626C6520547970653D22626F6F6C222056616C75653D2231222F3E0A202020202020202020203C7072696E7465724E616D6520547970653D2251537472696E67223E3C2F7072696E7465724E616D653E0A202020202020202020203C756E69747320547970653D22656E756D416E64466C616773222056616C75653D2230222F3E0A202020202020202020203C7072696E744265686176696F7220547970653D22656E756D416E64466C616773222056616C75653D2231222F3E0A202020202020202020203C64726F705072696E7465724D617267696E7320547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C6E6F745072696E744966456D70747920547970653D22626F6F6C222056616C75653D2230222F3E0A202020202020202020203C6D6978576974685072696F725061676520547970653D22626F6F6C222056616C75653D2230222F3E0A20202020202020203C2F706167654974656D3E0A2020202020203C2F6974656D3E0A202020203C2F70616765733E0A202020203C64617461736F75726365734D616E6167657220436C6173734E616D653D224C696D655265706F72743A3A44617461536F757263654D616E616765722220547970653D224F626A656374223E0A2020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E64617461736F75726365733C2F6F626A6563744E616D653E0A2020202020203C636F6E6E656374696F6E7320547970653D22436F6C6C656374696F6E222F3E0A2020202020203C7175657269657320547970653D22436F6C6C656374696F6E222F3E0A2020202020203C7375627175657269657320547970653D22436F6C6C656374696F6E222F3E0A2020202020203C73756270726F7869657320547970653D22436F6C6C656374696F6E222F3E0A2020202020203C7661726961626C657320547970653D22436F6C6C656374696F6E222F3E0A2020202020203C6373767320547970653D22436F6C6C656374696F6E222F3E0A202020203C2F64617461736F75726365734D616E616765723E0A202020203C736372697074436F6E7465787420436C6173734E616D653D224C696D655265706F72743A3A536372697074456E67696E65436F6E746578742220547970653D224F626A656374223E0A2020202020203C6F626A6563744E616D6520547970653D2251537472696E67223E3C2F6F626A6563744E616D653E0A2020202020203C6469616C6F677320547970653D22436F6C6C656374696F6E222F3E0A2020202020203C696E697453637269707420547970653D2251537472696E67223E3C2F696E69745363726970743E0A202020203C2F736372697074436F6E746578743E0A202020203C73757070726573734669656C64416E645661724572726F7220547970653D22626F6F6C222056616C75653D2230222F3E0A202020203C7472616E736C6174696F6E20547970653D225472616E736C6174696F6E222F3E0A20203C2F6F626A6563743E0A3C2F5265706F72743E0A'), UNHEX('6D056953B45C4E57DB2AC034BC6DA9E907D38468')); + +INSERT INTO `permissions` (`id`, `name`) VALUES (108, 'workWithTechReports'); +INSERT INTO `permissions_roles` (`permission_id`, `role_id`) VALUES ('108', '1'); + diff --git a/snap_crm.pro b/snap_crm.pro index 6285f52..11ea62f 100644 --- a/snap_crm.pro +++ b/snap_crm.pro @@ -104,6 +104,8 @@ SOURCES += \ models/sstandarditemmodel.cpp \ models/sstoreitemmodel.cpp \ models/sstoresaleitemmodel.cpp \ + models/stabletechreportsmodel.cpp \ + models/stechreportmodel.cpp \ models/suseractivitymodel.cpp \ models/susermodel.cpp \ models/susersettings.cpp \ @@ -124,6 +126,7 @@ SOURCES += \ tabrepaircartridges.cpp \ tabsalary.cpp \ tabsettings.cpp \ + tabtechreports.cpp \ widgets/salarytabwidgets/spagesalaryextra.cpp \ widgets/salarytabwidgets/spagesalaryitems.cpp \ widgets/salarytabwidgets/spagesalarypayments.cpp \ @@ -166,6 +169,7 @@ SOURCES += \ tabsale.cpp \ widgets/spagedinterface.cpp \ widgets/spagesettingsdoctempateeditor.cpp \ + widgets/speriodselector.cpp \ widgets/sreportscommonfunctions.cpp \ widgets/stableviewbase.cpp \ widgets/stableviewbaseitemdelegates.cpp \ @@ -188,6 +192,7 @@ SOURCES += \ widgets/splaintextedit.cpp \ widgets/ssetcombobox.cpp \ widgets/stableviewsummarybase.cpp \ + widgets/stableviewtechreports.cpp \ widgets/stabpage.cpp \ widgets/stextedit.cpp \ widgets/stoolboxswitchpanel.cpp \ @@ -272,6 +277,8 @@ HEADERS += \ models/sstandarditemmodel.h \ models/sstoreitemmodel.h \ models/sstoresaleitemmodel.h \ + models/stabletechreportsmodel.h \ + models/stechreportmodel.h \ models/suseractivitymodel.h \ models/susermodel.h \ models/susersettings.h \ @@ -293,6 +300,7 @@ HEADERS += \ tabrepaircartridges.h \ tabsalary.h \ tabsettings.h \ + tabtechreports.h \ widgets/salarytabwidgets/spagesalaryextra.h \ widgets/salarytabwidgets/spagesalaryitems.h \ widgets/salarytabwidgets/spagesalarypayments.h \ @@ -336,6 +344,7 @@ HEADERS += \ tabsale.h \ widgets/spagedinterface.h \ widgets/spagesettingsdoctempateeditor.h \ + widgets/speriodselector.h \ widgets/sreportscommonfunctions.h \ widgets/stableviewbaseitemdelegates.h \ widgets/stableviewclients.h \ @@ -359,6 +368,7 @@ HEADERS += \ widgets/splaintextedit.h \ widgets/ssetcombobox.h \ widgets/stableviewsummarybase.h \ + widgets/stableviewtechreports.h \ widgets/stabpage.h \ widgets/stextedit.h \ widgets/stoolboxswitchpanel.h \ @@ -378,6 +388,7 @@ FORMS += \ tabrepaircartridges.ui \ tabsalary.ui \ tabsettings.ui \ + tabtechreports.ui \ widgets/salarytabwidgets/spagesalaryextra.ui \ widgets/salarytabwidgets/spagesalaryitems.ui \ widgets/salarytabwidgets/spagesalarypayments.ui \ @@ -406,6 +417,7 @@ FORMS += \ widgets/scomments.ui \ widgets/sdevicematch.ui \ widgets/spagesettingsdoctempateeditor.ui \ + widgets/speriodselector.ui \ widgets/sphone.ui \ widgets/sphones.ui \ widgets/stoolboxswitchpanel.ui \ diff --git a/styles/light/1F890_32.png b/styles/light/1F890_32.png new file mode 100644 index 0000000000000000000000000000000000000000..196040c182c884c2640d2a40faf108d241d84ec7 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a)(xWd!LF(ktM?KML#CPx96i?(~k1utH35nvYN zF}ZQzfP>*jwO`WZ2@~j_z>#cTQ@$k@A+bbDo*UDZ=IK7nj%8XB+(*m6D?=WeX3ceHNz`HFb z+Nt;2ooGj1amBR@kNHMKFOf@-olwh_8;>~H*pYrHGjBhJ5k`}N<##0uv6q|VF9 Tt8}jd-OS+W>gTe~DWM4fD>`d{ literal 0 HcmV?d00001 diff --git a/styles/light/1F892_32.png b/styles/light/1F892_32.png new file mode 100644 index 0000000000000000000000000000000000000000..875464569dc87b92e9e3084614acc02d2e2ddabe GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSK$uZf!>a)(xX#nXF(ktM?X`_uha3c29#;R_)6p@_tSN%! zpi{Sqm{?bDzEHXe_i;lp#&Z5Abw4_m&D5P7wRWcMvh=NPE2>!d7ySMm-};7O*C*GK zpNu7q7fvx}G;FxSSkg4%$_~q>>MV=v&DmL7wyaW&hZiF3~xlY8n>R z6rE+To$30O6_L%=Su@N8CQ03QjClHk(dqQ@^EHBVd)w>TBV_j1)?IsPX&b$^UUR9q Y&D74zmFA0dfG%h7boFyt=akR{0KuSYApigX literal 0 HcmV?d00001 diff --git a/styles/light/21B9_32.png b/styles/light/21B9_32.png new file mode 100644 index 0000000000000000000000000000000000000000..686e56e46954a5bded58a2c0e93a95d3ff0af95d GIT binary patch literal 498 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TSiw+U%=YJ#=^piEZIoJMp<}ST1u9Z@(C2eMtSKf3)Ygn{r@x1 zaLk=^=ETf(7x!1co|kT&=giDK=OlIhn+A!735jGyVwx^^tJ63_hf9 zRTYq;527J>4ZBqp5Z3_D5^Z?#cb(?aB+;f{!_b_KWjLwRO3ZU0v|FjXDu>V} z^E<-cf|A7FVz#RnuCoC);27lHliV!`!5}otz0HQ;+=3X~Ltf}mRo^%Vh;arw;3?!v oc!@E<73|Y#ZP6musU?!+6RZY>nzL}I(*OVf07*qoM6N<$f=)r(UjP6A literal 0 HcmV?d00001 diff --git a/styles/styles.qrc b/styles/styles.qrc index 6709af0..4a5c0da 100644 --- a/styles/styles.qrc +++ b/styles/styles.qrc @@ -15,6 +15,9 @@ light/1F6E0_32.png light/1F50D_32.png light/1F589_32.png + light/1F890_32.png + light/1F892_32.png + light/21B9_32.png light/25BC_32.png light/232B_32.png light/2716_32.png diff --git a/tabprintdialog.cpp b/tabprintdialog.cpp index 037f5bf..ea189da 100644 --- a/tabprintdialog.cpp +++ b/tabprintdialog.cpp @@ -528,6 +528,17 @@ void tabPrintDialog::setRepairsList(QList list, bool takeOwn) i_listSourceDataCallbackHandler->setRepairsList(list, takeOwn); } +void tabPrintDialog::setTechReportsList(QList list, bool takeOwn) +{ + if(list.isEmpty()) + return; + + if(!i_listSourceDataCallbackHandler) + i_listSourceDataCallbackHandler = new SListSourceDataCallbackHandler(); + + i_listSourceDataCallbackHandler->setTechReportsList(list, takeOwn); +} + /* Чек-квитанция о приёме на заправку и чек-акт отличаются только выводом на печать списка работ и деталей */ void tabPrintDialog::printCartridgeWorksReports(QList list, bool takeOwn) @@ -563,6 +574,20 @@ void tabPrintDialog::printCartridgeWorksReports(QList list, bool delete client; } +void tabPrintDialog::printTechReports(QList list, bool takeOwn) +{ + if(list.isEmpty()) + return; + + tabPrintDialog *tab; + + tab = new tabPrintDialog(MainWindow::getInstance(), Global::Reports::tech_report); + tab->setTechReportsList(list, takeOwn); + tab->startRender(); + MainWindow::getInstance()->addTab(tab); + +} + void tabPrintDialog::on_labelPrinterSettings_linkActivated(const QString&) { // initPrinter(true); diff --git a/tabprintdialog.h b/tabprintdialog.h index c963479..fcd7779 100644 --- a/tabprintdialog.h +++ b/tabprintdialog.h @@ -11,6 +11,7 @@ #include #include #include "models/slogrecordmodel.h" +#include "models/stechreportmodel.h" #include "widgets/sreportscommonfunctions.h" #include "reports/sprintposreport.h" //#define PRINT_DEBUG_PAGE_INFO @@ -34,6 +35,7 @@ class tabPrintDialog : public tabCommon, public SReportsCommonFunctions static int findPrinterIndex(const QStringList &list, const QString &pName); static void printRepairWorksReports(QList list, bool takeOwn = 0); static void printCartridgeWorksReports(QList list, bool takeOwn = 0); + static void printTechReports(QList list, bool takeOwn = 0); #if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) QMap PageSizeMap = { @@ -107,6 +109,7 @@ class tabPrintDialog : public tabCommon, public SReportsCommonFunctions void updateProgressWidget(); bool isPagesPrepared(); void setRepairsList(QList list, bool takeOwn = 0); + void setTechReportsList(QList list, bool takeOwn = 0); void translate(); #ifdef QT_DEBUG void randomFill() override{}; diff --git a/tabrepairs.cpp b/tabrepairs.cpp index c0ea255..2780891 100644 --- a/tabrepairs.cpp +++ b/tabrepairs.cpp @@ -181,7 +181,7 @@ void tabRepairs::refreshTable(bool preserveScrollPos, bool preserveSelection) else matchFlag = FilterField::Contains; l2.fields.append(STableViewBase::initFilterField("t1.`id`", matchFlag, ui->lineEditSearch->text())); - l2.fields.append(STableViewBase::initFilterField("t1.`title`", FilterField::Contains, ui->lineEditSearch->text(), Qt::CaseInsensitive)); + l2.fields.append(STableViewBase::initFilterField("t1.`title`", matchFlag, ui->lineEditSearch->text(), Qt::CaseInsensitive)); l2.fields.append(STableViewBase::initFilterField("t1.`serial_number`", matchFlag, ui->lineEditSearch->text(), Qt::CaseInsensitive)); l2.fields.append(STableViewBase::initFilterField("CONCAT_WS(' ', t5.`short_name`, t5.`ur_name`)", matchFlag, ui->lineEditSearch->text(), Qt::CaseInsensitive)); l2.fields.append(STableViewBase::initFilterField("CONCAT_WS(' ', t5.`surname`, t5.`name`, t5.`patronymic`)", matchFlag, ui->lineEditSearch->text(), Qt::CaseInsensitive)); diff --git a/tabtechreports.cpp b/tabtechreports.cpp new file mode 100644 index 0000000..25ca632 --- /dev/null +++ b/tabtechreports.cpp @@ -0,0 +1,127 @@ +#include "tabtechreports.h" +#include "ui_tabtechreports.h" +#include "tabprintdialog.h" + +tabTechReports* tabTechReports::p_instance = nullptr; + +tabTechReports *tabTechReports::getInstance(MainWindow *parent) +{ + if( !p_instance ) + p_instance = new tabTechReports(parent); + return p_instance; +} + +tabTechReports::tabTechReports(MainWindow *parent) : + tabCommon(parent), + ui(new Ui::tabTechReports) +{ + logUserActivity(); + ui->setupUi(this); + ui->comboBoxCompany->setModel(companiesModel); + + this->setAttribute(Qt::WA_DeleteOnClose); + + tableUpdateDelay = new QTimer(this); + connect(tableUpdateDelay, &QTimer::timeout, this, &tabTechReports::buttonRefreshClicked); + tableUpdateDelay->setSingleShot(true); + + m_tableModel = new STableTechReportsModel(); + ui->tableView->setModel(m_tableModel); + connect(ui->pushButtonRefresh, &QPushButton::clicked, this, &tabTechReports::buttonRefreshClicked); + connect(ui->pushButtonPrint, &QPushButton::clicked, this, &tabTechReports::buttonPrintClicked); + connect(ui->lineEditSearch, &QLineEdit::textChanged, this, &tabTechReports::lineEditSearchTextChanged); + refreshTable(); + + ui->widgetPeriodSelector->setMovingInterval(SPeriodSelector::Year); + connect(ui->widgetPeriodSelector, &SPeriodSelector::refreshButtonClicked, this, &tabTechReports::buttonRefreshClicked); +} + +tabTechReports::~tabTechReports() +{ + delete m_tableModel; + delete ui; + p_instance = nullptr; +} + +QString tabTechReports::tabTitle() +{ + return tr("Акты тех. состояния"); +} + +QList tabTechReports::reportsListFromSelection() +{ + QList list; + QList *idsList = ui->tableView->selectedReportsList(); + STechReportModel *report; + + for(int i = 0; i < idsList->count(); i++) + { + report = new STechReportModel(); + report->load(idsList->at(i)); + list.append(report); + } + + delete idsList; + + return list; +} + +void tabTechReports::buttonRefreshClicked() +{ + refreshTable(STableViewBase::ScrollPosReset, STableViewBase::SelectionReset); +} + +void tabTechReports::lineEditSearchTextChanged(QString) +{ + ui->tableView->clearSelection(); + ui->tableView->resetVScrollPos(); + tableUpdateDelay->stop(); + tableUpdateDelay->start(350); +} + +void tabTechReports::refreshTable(bool preserveScrollPos, bool preserveSelection) +{ + ui->tableView->setQuery("SELECT t1.`id`, t1.`num`, t1.`created`, t1.`user`, t1.`company`, IF(t2.`type`, IF(LENGTH(TRIM(t2.`name`)), t2.`name`, t2.`ur_name`), CONCAT_WS(' ', t2.`surname`, t2.`name`, t2.`patronymic`)) AS 'client', t1.`device`, t1.`inventory_number`, t1.`serial_number`, CONVERT(t1.`production_date`, CHAR) AS 'production_date', CONVERT(t1.`purchase_date`, CHAR) AS 'purchase_date', t1.`initial_cost`, t1.`residual_cost`, t1.`fault`, t1.`diagnostic_result`, t1.`conclusion`, t1.`notes` FROM `tech_reports` AS t1 LEFT JOIN `clients` AS t2 ON t1.`client` = t2.`id`", QSqlDatabase::database("connMain")); + ui->tableView->setUniqueIdColumn(STableTechReportsModel::Columns::Id); + + FilterList l1; + l1.op = FilterList::Or; + + FilterList l2; + l2.op = FilterList::Or; + + l2.fields.append(STableViewBase::initFilterField("t1.`num`", FilterField::Contains, ui->lineEditSearch->text())); + l2.fields.append(STableViewBase::initFilterField("t1.`device`", FilterField::Contains, ui->lineEditSearch->text(), Qt::CaseInsensitive)); + l2.fields.append(STableViewBase::initFilterField("t1.`inventory_number`", FilterField::Contains, ui->lineEditSearch->text(), Qt::CaseInsensitive)); + l2.fields.append(STableViewBase::initFilterField("t1.`serial_number`", FilterField::Contains, ui->lineEditSearch->text(), Qt::CaseInsensitive)); + l2.fields.append(STableViewBase::initFilterField("CONCAT_WS(' ', t2.`short_name`, t2.`ur_name`)", FilterField::Contains, ui->lineEditSearch->text(), Qt::CaseInsensitive)); + l2.fields.append(STableViewBase::initFilterField("CONCAT_WS(' ', t2.`surname`, t2.`name`, t2.`patronymic`)", FilterField::Contains, ui->lineEditSearch->text(), Qt::CaseInsensitive)); + + FilterList l3; + l3.op = FilterList::And; + + l3.fields.append(STableViewBase::initFilterField("`company`", FilterField::Equals, companiesModel->databaseIDByRow(ui->comboBoxCompany->currentIndex()))); + l3.fields.append(STableViewBase::initFilterField("t1.`created`", FilterField::MoreEq, ui->widgetPeriodSelector->periodBegin())); + l3.fields.append(STableViewBase::initFilterField("t1.`created`", FilterField::Less, ui->widgetPeriodSelector->periodEnd())); + + l1.childs.append(l2); + l1.childs.append(l3); + +// query_group.clear(); +// ui->tableView->setGrouping(query_group); + + ui->tableView->setFilter(l1); + ui->tableView->refresh(preserveScrollPos, preserveSelection); + +// if(!preserveSelection) // при обновлении модели сигнал QItemSelectionModel::selectionChanged не генерируется +// updateWidgets(); +} + +void tabTechReports::buttonPrintClicked() +{ + QList list = reportsListFromSelection(); + tabPrintDialog::printTechReports(list, true); +// tabPrintDialog *tab = tabPrintDialog::create(Global::Reports::tech_report); +// tab->addDataModel(m_tableModel); +// tab->startRender(); +} diff --git a/tabtechreports.h b/tabtechreports.h new file mode 100644 index 0000000..7216d36 --- /dev/null +++ b/tabtechreports.h @@ -0,0 +1,36 @@ +#ifndef TABTECHREPORTS_H +#define TABTECHREPORTS_H + +#include "tabcommon.h" +#include "widgets/stableviewbase.h" +#include "models/stechreportmodel.h" +#include "models/stabletechreportsmodel.h" + +namespace Ui { +class tabTechReports; +} + +class tabTechReports : public tabCommon +{ + Q_OBJECT + +public: + static tabTechReports* getInstance(MainWindow *parent = nullptr); + explicit tabTechReports(MainWindow *parent = nullptr); + ~tabTechReports(); + QString tabTitle() override; +private: + static tabTechReports* p_instance; + Ui::tabTechReports *ui; + STableTechReportsModel *m_tableModel; + QTimer *tableUpdateDelay; + QList reportsListFromSelection(); +private slots: + void buttonRefreshClicked(); + void lineEditSearchTextChanged(QString); +public slots: + void refreshTable(bool preserveScrollPos = STableViewBase::ScrollPosPreserve, bool preserveSelection = STableViewBase::SelectionReset); + void buttonPrintClicked(); +}; + +#endif // TABTECHREPORTS_H diff --git a/tabtechreports.ui b/tabtechreports.ui new file mode 100644 index 0000000..7df3cd8 --- /dev/null +++ b/tabtechreports.ui @@ -0,0 +1,271 @@ + + + tabTechReports + + + + 0 + 0 + 1197 + 632 + + + + Form + + + + + + + + + + Компания + + + + + + + false + + + + + + + Период + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + + + + + Qt::Vertical + + + + + + + QAbstractItemView::SelectRows + + + + + + + + + + 0 + 0 + + + + + 0 + 70 + + + + Qt::NoContextMenu + + + + QLayout::SetMaximumSize + + + 15 + + + + + QFrame::HLine + + + QFrame::Raised + + + + + + + QLayout::SetDefaultConstraint + + + + + QLayout::SetDefaultConstraint + + + + + false + + + Создать + + + + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + Обновить + + + + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + Печать + + + + + + + + + QLayout::SetDefaultConstraint + + + + + true + + + фильтр + + + true + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 70 + 20 + + + + + + + + QLayout::SetDefaultConstraint + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::MinimumExpanding + + + + 70 + 20 + + + + + + + + + + + + + + STableViewTechReports + QTableView +
widgets/stableviewtechreports.h
+
+ + SPeriodSelector + QWidget +
widgets/speriodselector.h
+ 1 +
+
+ + +
diff --git a/tabtechreports.ui.bak b/tabtechreports.ui.bak new file mode 100644 index 0000000..fe3e650 --- /dev/null +++ b/tabtechreports.ui.bak @@ -0,0 +1,316 @@ + + + tabTechReports + + + + 0 + 0 + 1197 + 593 + + + + Form + + + + + 10 + 500 + 1181 + 83 + + + + + 0 + 0 + + + + + 0 + 70 + + + + Qt::NoContextMenu + + + + QLayout::SetMaximumSize + + + 15 + + + + + QFrame::HLine + + + QFrame::Raised + + + + + + + QLayout::SetDefaultConstraint + + + + + QLayout::SetDefaultConstraint + + + + + Создать + + + + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + Обновить + + + + + + + true + + + + 0 + 0 + + + + + 0 + 23 + + + + Печать + + + + + + + + + QLayout::SetDefaultConstraint + + + + + фильтр + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 70 + 20 + + + + + + + + QLayout::SetDefaultConstraint + + + + + + + Qt::Horizontal + + + QSizePolicy::MinimumExpanding + + + + 70 + 20 + + + + + + + + + + + + 350 + 10 + 841 + 481 + + + + + + + 160 + 40 + 81 + 22 + + + + QAbstractSpinBox::NoButtons + + + true + + + + + + 70 + 40 + 81 + 22 + + + + QAbstractSpinBox::NoButtons + + + false + + + true + + + + + + 10 + 43 + 47 + 20 + + + + Период + + + + + + 250 + 40 + 25 + 19 + + + + ... + + + + + + 280 + 40 + 25 + 19 + + + + ... + + + + + + 310 + 40 + 25 + 19 + + + + С начала месяца + + + ... + + + + + + 10 + 10 + 47 + 20 + + + + Компания + + + + + + 70 + 10 + 261 + 22 + + + + + + + 339 + 10 + 5 + 471 + + + + Qt::Vertical + + + + + + diff --git a/widgets/spagesettingsdoctempateeditor.cpp b/widgets/spagesettingsdoctempateeditor.cpp index b9c9c1a..64feef2 100644 --- a/widgets/spagesettingsdoctempateeditor.cpp +++ b/widgets/spagesettingsdoctempateeditor.cpp @@ -194,6 +194,14 @@ void SPageSettingsDocTempateEditor::initWorksDataSources() SReportsCommonFunctions::initWorksDataSources(); } +void SPageSettingsDocTempateEditor::initTechReportDataSources() +{ + if(!i_listSourceDataCallbackHandler) + i_listSourceDataCallbackHandler = new SListSourceDataCallbackHandler(); + + SReportsCommonFunctions::initTechReportDataSources(); +} + #ifdef QT_DEBUG void SPageSettingsDocTempateEditor::randomFill() { diff --git a/widgets/spagesettingsdoctempateeditor.h b/widgets/spagesettingsdoctempateeditor.h index 80a1661..a27c184 100644 --- a/widgets/spagesettingsdoctempateeditor.h +++ b/widgets/spagesettingsdoctempateeditor.h @@ -29,6 +29,7 @@ class SPageSettingsDocTempateEditor : public STabPage, public SReportsCommonFunc void removeReportDataSources(); void translate(); void initWorksDataSources() override; + void initTechReportDataSources() override; #ifdef QT_DEBUG void randomFill() override; #endif diff --git a/widgets/speriodselector.cpp b/widgets/speriodselector.cpp new file mode 100644 index 0000000..0f44b30 --- /dev/null +++ b/widgets/speriodselector.cpp @@ -0,0 +1,319 @@ +#include "speriodselector.h" +#include "ui_speriodselector.h" + +SPeriodSelector::SPeriodSelector(QWidget *parent) : + QWidget(parent), + ui(new Ui::SPeriodSelector) +{ + ui->setupUi(this); + initIntervalSelectionMenu(); + connect(ui->dateEditPeriodBegin, &QDateEdit::dateChanged, this, &SPeriodSelector::periodBeginChanged); + connect(ui->dateEditPeriodEnd, &QDateEdit::dateChanged, this, &SPeriodSelector::periodEndChanged); + connect(ui->toolButtonMovePrevPeriod, &QToolButton::clicked, this, &SPeriodSelector::movePrevPeriod); + connect(ui->toolButtonMoveNextPeriod, &QToolButton::clicked, this, &SPeriodSelector::moveNextPeriod); + connect(ui->toolButtonDefaultPeriod, &QToolButton::clicked, this, &SPeriodSelector::setDefaultPeriod); + connect(ui->toolButtonDefaultPeriod, &QToolButton::customContextMenuRequested, this, &SPeriodSelector::intervalMenuRequest); + connect(ui->toolButtonRefresh, &QToolButton::clicked, this, &SPeriodSelector::refreshButtonClicked); + + setMovingInterval(MovingInterval::Day); + ui->dateEditPeriodBegin->setDate(QDate::currentDate()); + ui->dateEditPeriodEnd->setDate(QDate::currentDate()); +} + +SPeriodSelector::~SPeriodSelector() +{ + delete ui; +} + +/* Преобразование даты с локальным часовым поясом в дату и время с UTC + * Возвращаемые данные предназначены непосредственно для передачи в запросах к БД +*/ +QDateTime SPeriodSelector::dateToUTCTime(const QDate &date) +{ + QDateTime time; + time.setDate(date); + + return time.toUTC(); +} + +/* Дата начала периода + * Возвращает QDateTime в формате UTC +*/ +QString SPeriodSelector::periodBegin() +{ + return dateToUTCTime(m_periodBegin).toString("yyyy-MM-dd hh:mm:ss"); +} + +/* Установка даты начала периода + * Передаваемое значение преобразуется в локальное для корректного отображения даты +*/ +void SPeriodSelector::setPeriodBegin(const QDateTime &dateTime) +{ + setPeriodBegin(dateTime.toLocalTime().date()); +} + +/* Установка даты начала периода + * Передаваемое значение должно соответствовать локальному времени для корректного отображения +*/ +void SPeriodSelector::setPeriodBegin(const QDate &date) +{ + ui->dateEditPeriodBegin->setDate(date); +} + +/* Дата конца периода + * Возвращает QDateTime в формате UTC +*/ +QString SPeriodSelector::periodEnd() +{ + return dateToUTCTime(m_periodEnd.addDays(1)).toString("yyyy-MM-dd hh:mm:ss"); +} + +/* Установка даты конца периода + * Передаваемое значение преобразуется в локальное для корректного отображения даты +*/ +void SPeriodSelector::setPeriodEnd(const QDateTime &dateTime) +{ + m_periodEnd = dateTime.toLocalTime().date(); +} + +/* Установка даты конца периода + * Передаваемое значение должно соответствовать локальному времени для корректного отображения +*/ +void SPeriodSelector::setPeriodEnd(const QDate &date) +{ + ui->dateEditPeriodEnd->setDate(date); +} + +/* Установка дат начала и конца периода + * Передаваемые значения преобразуется в UTC +*/ +void SPeriodSelector::setPeriod(const QDateTime &begin, const QDateTime &end) +{ + setPeriodBegin(begin); + setPeriodEnd(end); +} + +/* Установка периода по умолчанию по дате и интервалу + * Передаваемая дата будет преобразована в локальную +*/ +void SPeriodSelector::setPeriod(const QDateTime &time, const MovingInterval interval) +{ + bool backup = m_isPeriodAjustable; + m_isPeriodAjustable = 0; + setMovingInterval(interval); + setPeriodBegin(time); + m_isPeriodAjustable = backup; +} + +/* Установка периода по умолчанию + * В соответствии со значением в переменной m_movingInterval + * производится установка значений в виджетах QDateEdit + * Если m_isPeriodAjustable == 1 период устанавливается относительно текущей даты, + * в противном случае относительно даты, которую выбрал пользователь +*/ +void SPeriodSelector::setDefaultPeriod() +{ + QDate date; + + if(m_isPeriodAjustable) + date = QDate::currentDate(); + else + date = m_periodBegin; + + ui->dateEditPeriodBegin->blockSignals(true); + switch (m_movingInterval) + { + case MovingInterval::Week: m_periodBegin = date.addDays(-date.dayOfWeek() + 1); m_periodEnd = m_periodBegin.addDays(6); break; + case MovingInterval::Day: + case MovingInterval::Month: m_periodBegin = QDate(date.year(), date.month(), 1); m_periodEnd = m_periodBegin.addDays(date.daysInMonth() - 1); break; + case MovingInterval::Quarter: m_periodEnd = lastDateOfQuarter(m_periodBegin); m_periodBegin = firstDateOfQuarter(m_periodBegin); break; + case MovingInterval::Year: m_periodBegin = QDate(m_periodBegin.year(), 1, 1); m_periodEnd = QDate(m_periodBegin.year(), 12, 31); break; + default: break; + } + ui->dateEditPeriodBegin->setDate(m_periodBegin); + ui->dateEditPeriodBegin->blockSignals(false); + ui->dateEditPeriodEnd->setDate(m_periodEnd); +} + +void SPeriodSelector::intervalMenuActionClick(int id) +{ + setMovingInterval((MovingInterval)id); +} + +void SPeriodSelector::intervalMenuRequest(const QPoint &pos) +{ + if(m_isPeriodAjustable) + m_intervalMenu->popup(ui->toolButtonDefaultPeriod->mapToGlobal(pos)); +} + +/* Установка интервала по умолчанию + * Значение используется при перемещении между периодами и при установке периода по уполчанию +*/ +void SPeriodSelector::setMovingInterval(const MovingInterval interval) +{ + QString toolTip; + m_movingInterval = interval; + switch (m_movingInterval) + { + case MovingInterval::Week: toolTip = tr("С начала текущей недели"); break; + case MovingInterval::Day: + case MovingInterval::Month: toolTip = tr("С начала текущего месяца"); break; + case MovingInterval::Quarter: toolTip = tr("С начала текущего квартала"); break; + case MovingInterval::Year: toolTip = tr("С начала текущего года"); break; + default: break; + } + + ui->toolButtonDefaultPeriod->setToolTip(toolTip); + if(!m_isPeriodAjustable) + setDefaultPeriod(); +} + +void SPeriodSelector::setPeriodEndWidgetEditable(const bool state) +{ + ui->dateEditPeriodEnd->setReadOnly(!state); +} + +/* Скрытие/отображение кнопки установки периода по умолчанию + * Если кнопка скрыта, подразумевается что период равен интервалу +*/ +void SPeriodSelector::setDefaultPeriodButtonVisible(const bool state) +{ + ui->toolButtonDefaultPeriod->setVisible(state); + setPeriodAjustable(state); +} + +void SPeriodSelector::setRefreshButtonVisible(const bool state) +{ + ui->toolButtonRefresh->setVisible(state); +} + +void SPeriodSelector::hideRefreshButton() +{ + setRefreshButtonVisible(false); +} + +/* Включение/выключение режима жесткой привязки периода к началу недели/месяца/квартала/года + * +*/ +void SPeriodSelector::setPeriodAjustable(bool state) +{ + m_isPeriodAjustable = state; + if(!m_isPeriodAjustable) + { + setDefaultPeriod(); + } + setPeriodEndWidgetEditable(state); +} + +QDate SPeriodSelector::firstDateOfQuarter(const QDate &date) +{ + switch (date.month()) + { + case 1: + case 2: + case 3: return QDate(date.year(), 1, 1); + case 4: + case 5: + case 6: return QDate(date.year(), 4, 1); + case 7: + case 8: + case 9: return QDate(date.year(), 7, 1); + case 10: + case 11: + case 12: return QDate(date.year(), 10, 1); + } + return QDate::currentDate(); +} + +QDate SPeriodSelector::lastDateOfQuarter(const QDate &date) +{ + switch (date.month()) + { + case 1: + case 2: + case 3: return QDate(date.year(), 3, 31); + case 4: + case 5: + case 6: return QDate(date.year(), 6, 30); + case 7: + case 8: + case 9: return QDate(date.year(), 9, 30); + case 10: + case 11: + case 12: return QDate(date.year(), 12, 31); + } + return QDate::currentDate(); +} + +void SPeriodSelector::movePeriod(const int direction) +{ + QDate newPeriodBegin, newPeriodEnd; + switch (m_movingInterval) + { + case MovingInterval::Day: newPeriodBegin = m_periodBegin.addDays(direction); newPeriodEnd = m_periodEnd.addDays(direction); break; + case MovingInterval::Week: newPeriodBegin = m_periodBegin.addDays(direction*7); newPeriodEnd = m_periodEnd.addDays(direction*7); break; + case MovingInterval::Month: newPeriodBegin = m_periodBegin.addMonths(direction); newPeriodEnd = m_periodEnd.addMonths(direction); break; + case MovingInterval::Quarter: newPeriodBegin = m_periodBegin.addMonths(direction*3); newPeriodEnd = m_periodEnd.addMonths(direction*3); break; + case MovingInterval::Year: newPeriodBegin = QDate(m_periodBegin.year() + direction, 1, 1); newPeriodEnd = QDate(m_periodBegin.year() + direction, 12, 31); break; + default: break; + } + ui->dateEditPeriodBegin->setDate(newPeriodBegin); + ui->dateEditPeriodEnd->setDate(newPeriodEnd); +} + +void SPeriodSelector::initIntervalSelectionMenu() +{ + m_intervalMenu = new QMenu(this); + QAction *action; + m_signalMapper = new QSignalMapper(this); + QMetaEnum intervals = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("MovingInterval")); + + QObject::connect(m_signalMapper, &QSignalMapper::mappedInt, this, &SPeriodSelector::intervalMenuActionClick); + + for(int i = 0; i < intervals.keyCount(); i++) + { + action = new QAction(tr(intervals.key(i))/*, this*/); + m_intervalMenu->addAction(action); + m_signalMapper->setMapping(action, intervals.value(i)); + connect(action, SIGNAL(triggered()), m_signalMapper, SLOT(map())); + } + + ui->toolButtonDefaultPeriod->setMenu(m_intervalMenu); + ui->toolButtonDefaultPeriod->setContextMenuPolicy(Qt::CustomContextMenu); + +// QAction *workshop_new = new QAction(tr("Принять"), this); +// workshop_menu->addAction(workshop_new); +// workshop_new->setVisible(); + // QObject::connect(workshop_new,SIGNAL(triggered()),this,SLOT(createTabRepairNew())); +} + +void SPeriodSelector::translate() +{ + tr("Day"); + tr("Week"); + tr("Month"); + tr("Quarter"); + tr("Year"); +} + +void SPeriodSelector::periodBeginChanged(const QDate date) +{ + m_periodBegin = date; + if(!m_isPeriodAjustable) + setDefaultPeriod(); +} + +void SPeriodSelector::periodEndChanged(const QDate date) +{ + m_periodEnd = date; +} + +void SPeriodSelector::movePrevPeriod() +{ + movePeriod(-1); +} + +void SPeriodSelector::moveNextPeriod() +{ + movePeriod(1); +} diff --git a/widgets/speriodselector.h b/widgets/speriodselector.h new file mode 100644 index 0000000..f9731c7 --- /dev/null +++ b/widgets/speriodselector.h @@ -0,0 +1,65 @@ +#ifndef SPERIODSELECTOR_H +#define SPERIODSELECTOR_H + +#include +#include +#include +#include +#include +#include + +namespace Ui { +class SPeriodSelector; +} + +class SPeriodSelector : public QWidget +{ + Q_OBJECT +signals: + void refreshButtonClicked(); +public: + enum MovingInterval {Day, Week, Month, Quarter, Year}; + Q_ENUM(MovingInterval); + explicit SPeriodSelector(QWidget *parent = nullptr); + ~SPeriodSelector(); + QString periodBegin(); + void setPeriodBegin(const QDateTime &dateTime); + void setPeriodBegin(const QDate &date); + QString periodEnd(); + void setPeriodEnd(const QDateTime &dateTime); + void setPeriodEnd(const QDate &date); + void setPeriod(const QDateTime &begin, const QDateTime &end); + void setPeriod(const QDateTime &time, const MovingInterval interval); + void setMovingInterval(const MovingInterval interval); + void setPeriodEndWidgetEditable(const bool state = true); + void setDefaultPeriodButtonVisible(const bool state = true); + void hideDefaultPeriodButton(); + void setRefreshButtonVisible(const bool state = true); + void hideRefreshButton(); + void setPeriodAjustable(bool isPeriodAjustable); +private: + Ui::SPeriodSelector *ui; + MovingInterval m_movingInterval = Day; // Интервал по умолчанию + MovingInterval m_movingIntervalOverride; // Изменённый интервал по умолчанию + QDate m_periodBegin; + QDate m_periodEnd; + bool m_isPeriodAjustable = 1; + QMenu *m_intervalMenu; + QSignalMapper *m_signalMapper; + QDateTime dateToUTCTime(const QDate &date); + QDate firstDateOfQuarter(const QDate &date); + QDate lastDateOfQuarter(const QDate &date); + void movePeriod(const int direction); + void initIntervalSelectionMenu(); + void translate(); +private slots: + void periodBeginChanged(const QDate date); + void periodEndChanged(const QDate date); + void movePrevPeriod(); + void moveNextPeriod(); + void setDefaultPeriod(); + void intervalMenuActionClick(int id); + void intervalMenuRequest(const QPoint &pos); +}; + +#endif // SPERIODSELECTOR_H diff --git a/widgets/speriodselector.ui b/widgets/speriodselector.ui new file mode 100644 index 0000000..64a0961 --- /dev/null +++ b/widgets/speriodselector.ui @@ -0,0 +1,142 @@ + + + SPeriodSelector + + + + 0 + 0 + 270 + 24 + + + + + 0 + 0 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 2 + + + + + true + + + QAbstractSpinBox::NoButtons + + + false + + + true + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + true + + + + + + + true + + + ... + + + + :/icons/light/1F890_32.png:/icons/light/1F890_32.png + + + + + + + true + + + ... + + + + :/icons/light/1F892_32.png:/icons/light/1F892_32.png + + + + + + + true + + + С начала месяца + + + ... + + + + :/icons/light/21B9_32.png:/icons/light/21B9_32.png + + + + + + + true + + + С начала месяца + + + ... + + + + :/icons/light/1F5D8_32.png:/icons/light/1F5D8_32.png + + + + + + + + + + + + diff --git a/widgets/sreportscommonfunctions.cpp b/widgets/sreportscommonfunctions.cpp index 6b5899b..2b0f032 100644 --- a/widgets/sreportscommonfunctions.cpp +++ b/widgets/sreportscommonfunctions.cpp @@ -198,6 +198,7 @@ void SReportsCommonFunctions::initDataSources() // case Global::Reports::slip: ; break; // case Global::Reports::move: ; break; // case Global::Reports::buyout: ; break; + case Global::Reports::tech_report: initTechReportDataSources(); break; case Global::Reports::repairs: case Global::Reports::cartridges: initRepairsDataSources(); break; default: notImplementedReport(); return; @@ -321,6 +322,19 @@ void SReportsCommonFunctions::initRepairsDataSources() QObject::connect(repairsDS, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), model, SLOT(reportCallbackData(LimeReport::CallbackInfo,QVariant&))); } +void SReportsCommonFunctions::initTechReportDataSources() +{ + if(!i_listSourceDataCallbackHandler->isTechReportsListSet()) + { + i_listSourceDataCallbackHandler->initDemoTechReportsList(); + } + + m_reportDatasouces << "report"; + LimeReport::ICallbackDatasource *techReportDS = m_report->dataManager()->createCallbackDatasource(m_reportDatasouces.last()); + QObject::connect(techReportDS, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), i_listSourceDataCallbackHandler, SLOT(techReportListCallbackData(LimeReport::CallbackInfo,QVariant&))); + QObject::connect(techReportDS, SIGNAL(changePos(LimeReport::CallbackInfo::ChangePosType,bool&)), i_listSourceDataCallbackHandler, SLOT(techReportListCallbackDataChangePos(LimeReport::CallbackInfo::ChangePosType,bool&))); +} + /*************************************************************************************************************************************************** */ SListSourceDataCallbackHandler::SListSourceDataCallbackHandler() @@ -358,6 +372,26 @@ void SListSourceDataCallbackHandler::setRepairsList(const QList m_repairsListItem = m_repairsList.constBegin(); } +void SListSourceDataCallbackHandler::setTechReportsList(const QList &list, bool takeOwn) +{ + if(list.isEmpty()) + return; + + if(takeOwn) + { + for(auto *repair : list) + { + repair->setParent(this); + } + } + + m_techReportsListSet = 1; + m_techReportsList = list; + m_techReportsListOwned = takeOwn; + m_techReportsListItem = m_techReportsList.constBegin(); + +} + void SListSourceDataCallbackHandler::initDemoRepairsList() { SRepairModel *repair; @@ -378,6 +412,27 @@ bool SListSourceDataCallbackHandler::isRepairsListSet() const return m_repairsListSet; } +bool SListSourceDataCallbackHandler::isTechReportsListSet() const +{ + return m_techReportsListSet; +} + +void SListSourceDataCallbackHandler::initDemoTechReportsList() +{ + STechReportModel *report; + report = new STechReportModel(); + report->initDemo(); + m_techReportsList.append(report); + + report = new STechReportModel(); + report->initDemo(); + m_techReportsList.append(report); + + m_techReportsListSet = 1; + m_techReportsListOwned = 1; + m_techReportsListItem = m_techReportsList.constBegin(); +} + void SListSourceDataCallbackHandler::repairsListCallbackData(const LimeReport::CallbackInfo &info, QVariant &data) { switch (info.dataType) @@ -432,3 +487,38 @@ void SListSourceDataCallbackHandler::repairWorksListCallbackDataChangePos(const (*m_repairsListItem)->BOQModel()->reportCallbackDataChangePos(type, result); return; } + +void SListSourceDataCallbackHandler::techReportListCallbackData(const LimeReport::CallbackInfo &info, QVariant &data) +{ + switch (info.dataType) + { + case LimeReport::CallbackInfo::IsEmpty: data = (*m_techReportsListItem)->id()?0:1; break; + case LimeReport::CallbackInfo::HasNext: data = (m_techReportsListItem != m_techReportsList.constEnd()); break; + case LimeReport::CallbackInfo::ColumnHeaderData: data = (*m_techReportsListItem)->metaObject()->property(info.index + (*m_techReportsListItem)->metaObject()->propertyOffset()).name(); break; + case LimeReport::CallbackInfo::ColumnData: data = (*m_techReportsListItem)->metaObject()->property((*m_techReportsListItem)->metaObject()->indexOfProperty(info.columnName.toLocal8Bit()) ).read(*m_techReportsListItem); break; + case LimeReport::CallbackInfo::ColumnCount: data = (*m_techReportsListItem)->metaObject()->propertyCount() - (*m_techReportsListItem)->metaObject()->propertyOffset(); break; + case LimeReport::CallbackInfo::RowCount: data = m_techReportsList.count(); break; + } + return; + +} + +void SListSourceDataCallbackHandler::techReportListCallbackDataChangePos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result) +{ + if(type == LimeReport::CallbackInfo::Next) + { + m_techReportsListItem++; + if(m_techReportsListItem == m_techReportsList.constEnd()) + { + m_techReportsListItem--; + result = 0; + return; + } + } + else + { + m_techReportsListItem = m_techReportsList.constBegin(); + } + result = 1; + return; +} diff --git a/widgets/sreportscommonfunctions.h b/widgets/sreportscommonfunctions.h index 6183787..1276806 100644 --- a/widgets/sreportscommonfunctions.h +++ b/widgets/sreportscommonfunctions.h @@ -19,6 +19,8 @@ #include "models/sfieldsmodel.h" #include "models/ssaletablemodel.h" #include "models/stablerepairsmodel.h" +#include "models/stabletechreportsmodel.h" +#include "models/stechreportmodel.h" /* Класс для обработки callback-сигналов объекта LimeReport::ICallbackDatasource * Необходим как прокладка, поскольку класс SReportsCommonFunctions не заявлен как Q_OBJECT и не @@ -31,18 +33,27 @@ class SListSourceDataCallbackHandler : public QObject explicit SListSourceDataCallbackHandler(); ~SListSourceDataCallbackHandler(); void setRepairsList(const QList &list, bool takeOwn = 0); + void setTechReportsList(const QList &list, bool takeOwn = 0); void initDemoRepairsList(); bool isRepairsListSet() const; + bool isTechReportsListSet() const; + void initDemoTechReportsList(); private: bool m_repairsListOwned = 0; bool m_repairsListSet = 0; QList m_repairsList; QList::const_iterator m_repairsListItem; + bool m_techReportsListOwned = 0; + bool m_techReportsListSet = 0; + QList m_techReportsList; + QList::const_iterator m_techReportsListItem; public slots: void repairsListCallbackData(const LimeReport::CallbackInfo &info, QVariant &data); void repairsListCallbackDataChangePos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result); void repairWorksListCallbackData(const LimeReport::CallbackInfo &info, QVariant &data); void repairWorksListCallbackDataChangePos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result); + void techReportListCallbackData(const LimeReport::CallbackInfo &info, QVariant &data); + void techReportListCallbackDataChangePos(const LimeReport::CallbackInfo::ChangePosType &type, bool &result); }; class SReportsCommonFunctions @@ -76,6 +87,7 @@ class SReportsCommonFunctions virtual void initItemStickerDataSources(); virtual void initPKODataSources(); virtual void initRepairsDataSources(); + virtual void initTechReportDataSources(); virtual void notImplementedReport(){}; private: STableRepairsModel *m_repairsDemoModel = nullptr; diff --git a/widgets/stableviewbase.cpp b/widgets/stableviewbase.cpp index bd0cbca..d065a52 100644 --- a/widgets/stableviewbase.cpp +++ b/widgets/stableviewbase.cpp @@ -633,6 +633,10 @@ QString STableViewBase::formatFilterField(const FilterField &field) result = "%1 = %2"; break; } + case FilterField::More: result = "%1 > %2"; break; + case FilterField::MoreEq: result = "%1 >= %2"; break; + case FilterField::Less: result = "%1 < %2"; break; + case FilterField::LessEq: result = "%1 <= %2"; break; case FilterField::StartsWith: case FilterField::EndsWith: case FilterField::Wildcard: @@ -673,6 +677,7 @@ QString STableViewBase::formatFilterField(const FilterField &field) case FilterField::Contains: escFilterString.prepend("%"); Q_FALLTHROUGH(); case FilterField::StartsWith: escFilterString.append("%"); break; case FilterField::EndsWith: escFilterString.prepend("%"); break; + default: break; } QSqlField f; @@ -686,12 +691,6 @@ QString STableViewBase::formatFilterField(const FilterField &field) escFilterColumn = QString("LCASE(%1)").arg(escFilterColumn); escFilterString = QString("LCASE(%1)").arg(escFilterString); } -// if (m_filterFlags & Qt::MatchStartsWith || Qt::MatchEndsWith || Qt::MatchWildcard) -// { -// escFilterString = escFilterString.replace("", ""); -// // if (m_filterFlags & Qt::MatchWildcard) -// escFilterString = escFilterString.replace("*", ""); -// } result = result.replace("%1", escFilterColumn).replace("%2", escFilterString); return result; diff --git a/widgets/stableviewbase.h b/widgets/stableviewbase.h index 7dd25ca..d98db3e 100644 --- a/widgets/stableviewbase.h +++ b/widgets/stableviewbase.h @@ -24,8 +24,8 @@ typedef struct FilterList FilterList; struct FilterField { - enum Op {Equals = 1<<0, Contains = 1<<1, StartsWith = 1<<2, EndsWith = 1<<3, RegExp = 1<<4, RegularExpression = 1<<5, Wildcard = 1<<6, - NoOp = 1<<7, Null = 1<<8, + enum Op {Equals = 1, Contains, StartsWith, EndsWith, RegExp, RegularExpression, Wildcard, More, MoreEq, Less, LessEq, + NoOp, Null, NotMark = 1<<9 }; QString column; Op operation; diff --git a/widgets/stableviewtechreports.cpp b/widgets/stableviewtechreports.cpp new file mode 100644 index 0000000..3401b04 --- /dev/null +++ b/widgets/stableviewtechreports.cpp @@ -0,0 +1,39 @@ +#include "stableviewtechreports.h" +#include "models/stabletechreportsmodel.h" + +STableViewTechReports::STableViewTechReports(QWidget *parent) : + STableViewBase(SLocalSettings::TechReportsGrid, parent) +{ + readLayout(); +} + +QList *STableViewTechReports::selectedReportsList() +{ + QList *list = new QList(); + STableTechReportsModel *model = static_cast(this->model()); + foreach(QModelIndex index, selectionList()) + { + list->append(model->unformattedData(index).toInt()); + } + return list; +} + +void STableViewTechReports::translateNames() +{ + tr("Num"); + tr("Created"); + tr("User"); + tr("Company"); + tr("Client"); + tr("Device"); + tr("InvNumber"); + tr("SerialNumber"); + tr("ProductionData"); + tr("PurchaseDate"); + tr("InitCost"); + tr("ResidualCost"); + tr("Fault"); + tr("DiagResult"); + tr("Conclusion"); + tr("Notes"); +} diff --git a/widgets/stableviewtechreports.h b/widgets/stableviewtechreports.h new file mode 100644 index 0000000..40e8899 --- /dev/null +++ b/widgets/stableviewtechreports.h @@ -0,0 +1,21 @@ +#ifndef STABLEVIEWTECHREPORTS_H +#define STABLEVIEWTECHREPORTS_H + +#include "stableviewbase.h" +#include + +class STableViewTechReports : public STableViewBase +{ + Q_OBJECT +public: + enum Column{ID = 0, Num, Created, User, Company, Client, Device, InvNumber, SerialNumber, ProductionData, PurchaseDate, InitCost, ResidualCost, Fault, DiagResult, Conclusion, Notes}; + Q_ENUM(Column) + enum ColumnWidth{ID_w = 40, Num_w = 40, Created_w = 120, User_w = 110, Company_w = 110, Client_w = 150, Device_w = 120, InvNumber_w = 80, SerialNumber_w = 80, ProductionData_w = 80, PurchaseDate_w = 80, InitCost_w = 60, ResidualCost_w = 60, Fault_w = 120, DiagResult_w = 120, Conclusion_w = 120, Notes_w = 120}; + Q_ENUM(ColumnWidth) + explicit STableViewTechReports(QWidget *parent = nullptr); + QList *selectedReportsList(); +private: + void translateNames(); +}; + +#endif // STABLEVIEWTECHREPORTS_H