From 74645ca1ff00162e940695692e16cedab7fdf57e Mon Sep 17 00:00:00 2001 From: mdiment Date: Mon, 15 Nov 2021 20:25:44 +0300 Subject: [PATCH 01/13] try.drawio --- Untitled Diagram.drawio | 1 + 1 file changed, 1 insertion(+) create mode 100644 Untitled Diagram.drawio diff --git a/Untitled Diagram.drawio b/Untitled Diagram.drawio new file mode 100644 index 0000000..9f886d9 --- /dev/null +++ b/Untitled Diagram.drawio @@ -0,0 +1 @@ +UzV2zq1wL0osyPDNT0nNUTV2VTV2LsrPL4GwciucU3NyVI0MMlNUjV1UjYwMgFjVyA2HrCFY1qAgsSg1rwSLBiADYTaQg2Y1AA== \ No newline at end of file From 08808ac0c34eafb53d9116028f165325742cd7ca Mon Sep 17 00:00:00 2001 From: mdiment Date: Mon, 15 Nov 2021 20:26:13 +0300 Subject: [PATCH 02/13] try1.drawio --- Untitled Diagram.drawio | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Untitled Diagram.drawio b/Untitled Diagram.drawio index 9f886d9..5547a34 100644 --- a/Untitled Diagram.drawio +++ b/Untitled Diagram.drawio @@ -1 +1,16 @@ -UzV2zq1wL0osyPDNT0nNUTV2VTV2LsrPL4GwciucU3NyVI0MMlNUjV1UjYwMgFjVyA2HrCFY1qAgsSg1rwSLBiADYTaQg2Y1AA== \ No newline at end of file + + + + + + + + + + + + + + + + From 2246109bd6fefd16a1fba0ddce928002d41009bf Mon Sep 17 00:00:00 2001 From: mdiment Date: Mon, 15 Nov 2021 20:26:42 +0300 Subject: [PATCH 03/13] try123.drawio --- Untitled Diagram.drawio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Untitled Diagram.drawio b/Untitled Diagram.drawio index 5547a34..1b2348d 100644 --- a/Untitled Diagram.drawio +++ b/Untitled Diagram.drawio @@ -1,4 +1,4 @@ - + From c0b827fdb5843822d7b03b0c0cb6b1649a72c1d9 Mon Sep 17 00:00:00 2001 From: mdiment Date: Tue, 16 Nov 2021 00:12:57 +0300 Subject: [PATCH 04/13] Delete Untitled Diagram.drawio --- Untitled Diagram.drawio | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 Untitled Diagram.drawio diff --git a/Untitled Diagram.drawio b/Untitled Diagram.drawio deleted file mode 100644 index 1b2348d..0000000 --- a/Untitled Diagram.drawio +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - From ffc5437c5d5e583e36fd8a94fe432454271caa1b Mon Sep 17 00:00:00 2001 From: useless XIV Date: Wed, 17 Nov 2021 17:05:23 +0300 Subject: [PATCH 05/13] added .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d163863 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ \ No newline at end of file From cf06cf58f5ab206f1ca7bfb97275d12eccb62977 Mon Sep 17 00:00:00 2001 From: Maxim Kirillov Date: Thu, 18 Nov 2021 18:01:40 +0300 Subject: [PATCH 06/13] Design Initial --- inputpanel.cpp | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 11 +++++ mainform.cpp | 42 ++++++++++++++++ mainform.h | 38 +++++++++++++++ toolbar.cpp | 59 +++++++++++++++++++++++ toolbar.h | 41 ++++++++++++++++ unputpanel.h | 56 ++++++++++++++++++++++ 7 files changed, 374 insertions(+) create mode 100644 inputpanel.cpp create mode 100644 main.cpp create mode 100644 mainform.cpp create mode 100644 mainform.h create mode 100644 toolbar.cpp create mode 100644 toolbar.h create mode 100644 unputpanel.h diff --git a/inputpanel.cpp b/inputpanel.cpp new file mode 100644 index 0000000..234bed3 --- /dev/null +++ b/inputpanel.cpp @@ -0,0 +1,127 @@ +#include "inputpanel.h" + +const int TEN = 109; +const int SQR = 108; +const int SQRT = 107; +const int EXP = 106; +const int LG = 105; +const int LN = 104; +const int COS = 103; +const int SIN = 102; +const int LOG = 101; +const int POW = 100; +const int DIV = 10; +const int MUL = 11; +const int MINUS = 12; +const int PLUS = 13; +const int INVERSE = 15; +const int DOT = 16; +const int EQ = 21; +const int BKSP = 30; +const int CLR = 31; +const int CLR_ALL = 32; +const int GRID_KEYS = 20; +const int X = 110; + +void InputPanel::initVector() { + btnVector.push_back(BtnDescr("lg", LG)); + btnVector.push_back(BtnDescr("7", 7)); + btnVector.push_back(BtnDescr("8", 8)); + btnVector.push_back(BtnDescr("9", 9)); + btnVector.push_back(BtnDescr("/", DIV)); + btnVector.push_back(BtnDescr("^", POW)); + btnVector.push_back(BtnDescr("ln", LN)); + btnVector.push_back(BtnDescr("4", 4)); + btnVector.push_back(BtnDescr("5", 5)); + btnVector.push_back(BtnDescr("6", 6)); + btnVector.push_back(BtnDescr("×", MUL)); + btnVector.push_back(BtnDescr("10^", TEN)); + //btnVector.push_back(BtnDescr("sin", SIN)); + btnVector.push_back(BtnDescr("log", LOG)); + btnVector.push_back(BtnDescr("1", 1)); + btnVector.push_back(BtnDescr("2", 2)); + btnVector.push_back(BtnDescr("3", 3)); + btnVector.push_back(BtnDescr("-", MINUS)); + btnVector.push_back(BtnDescr("√", SQRT)); + //btnVector.push_back(BtnDescr("cos", COS)); + btnVector.push_back(BtnDescr("e^", EXP)); + btnVector.push_back(BtnDescr("0", 0)); + btnVector.push_back(BtnDescr("-/+", INVERSE)); + btnVector.push_back(BtnDescr(".", DOT)); + btnVector.push_back(BtnDescr("+", PLUS)); + btnVector.push_back(BtnDescr("X", X)); + btnVector.push_back(BtnDescr("<-", BKSP)); + btnVector.push_back(BtnDescr("Clear" ,CLR)); + btnVector.push_back(BtnDescr("Clear all", CLR_ALL)); + btnVector.push_back(BtnDescr("GO", EQ)); +} + +void InputPanel::setBtns() { + for (int i = 0; i < btnVector.size(); i++) { + QPushButton *button = new QPushButton(btnVector[i].text); + + button->setMaximumHeight(50); + button->setMinimumHeight(40); + if (i == btnVector.size() - 1) + button->setMinimumHeight(150); + button->setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Expanding); + + QFont fnt = button->font(); + fnt.setPointSize( fnt.pointSize() + 4); + button->setFont(fnt); + + connect(button, SIGNAL(clicked()), mapper, SLOT(map())); + mapper->setMapping(button, btnVector[i].text); + + if (iaddWidget(button, i / 6, i % 6); + else + if( i < GRID_KEYS + 7) + bccKeysLayout->addWidget(button); + else { + button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + mainKeysLayout->addLayout(gridLayout); + mainKeysLayout->addWidget(button); + } + } +} + +InputPanel::InputPanel() { + //QPushButton *q = ui->pushButton_3; + //q->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding); + //initNum(); + initVector(); + + edit = new QLineEdit(this); + //m_pLineEdit->setReadOnly ( true ); + mapper = new QSignalMapper(this); + gridLayout = new QGridLayout(); + bccKeysLayout = new QHBoxLayout(); + mainKeysLayout = new QHBoxLayout(); + layout = new QVBoxLayout(); + + setBtns(); + + edit->setMinimumSize(200, 50); + QFont font; + font.setFamily(QStringLiteral("Nyala")); + font.setPointSize(18); + font.setBold(true); + font.setItalic(false); + font.setWeight(50); + edit->setFont(font); + + connect(mapper, SIGNAL(mapped(QString)), this, SLOT(clicked(QString))); + layout->addWidget(edit); + layout->addLayout(bccKeysLayout); + layout->addLayout(mainKeysLayout); +} + +InputPanel::~InputPanel() { + delete edit; + delete mapper; + delete gridLayout; + delete bccKeysLayout; + delete mainKeysLayout; + delete layout; +} \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..bbfaafd --- /dev/null +++ b/main.cpp @@ -0,0 +1,11 @@ +#include "mainform.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainForm w; + w.showMaximized(); + return a.exec(); +} diff --git a/mainform.cpp b/mainform.cpp new file mode 100644 index 0000000..e8b8684 --- /dev/null +++ b/mainform.cpp @@ -0,0 +1,42 @@ +#include "mainform.h" +#include "./ui_mainform.h" + +#include + +MainForm::MainForm(QWidget *parent): QDialog(parent), ui(new Ui::MainForm) +{ + ui->setupUi(this); + + QSignalMapper *signalMapper = new QSignalMapper; + toolBar = new ToolBar(signalMapper); + inputPanel = new InputPanel(); + + QHBoxLayout *mainLayout = new QHBoxLayout; + QVBoxLayout *rightLayout = new QVBoxLayout; + QOpenGLWidget *glWidget = new QOpenGLWidget; + glWidget->setMinimumSize(1000, 500); + glWidget->setMaximumSize(2000, 700); + + rightLayout->addWidget(glWidget); + rightLayout->addLayout(inputPanel->getLayout()); + mainLayout->addLayout(toolBar->getLayout()); + mainLayout->addLayout(rightLayout); + setLayout(mainLayout); + + connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(stdClicked(QString))); +} + +void MainForm::stdClicked(QString name) { +// QString str = toolBar->edit->text(); +// str.append(name); +// toolBar->edit->setText(str); +} + +MainForm::~MainForm() +{ + //delete signalMapper; + delete toolBar; + delete inputPanel; + + delete ui; +} diff --git a/mainform.h b/mainform.h new file mode 100644 index 0000000..4008c28 --- /dev/null +++ b/mainform.h @@ -0,0 +1,38 @@ +#ifndef MAINFORM_H +#define MAINFORM_H + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class MainForm; } +QT_END_NAMESPACE + + + +class MainForm : public QDialog +{ + Q_OBJECT + +public: + MainForm(QWidget *parent = nullptr); + ~MainForm(); + +private: + Ui::MainForm *ui; + ToolBar* toolBar; + InputPanel* inputPanel; + +private slots: + void stdClicked(QString name); +}; +#endif // MAINFORM_H \ No newline at end of file diff --git a/toolbar.cpp b/toolbar.cpp new file mode 100644 index 0000000..c63d154 --- /dev/null +++ b/toolbar.cpp @@ -0,0 +1,59 @@ +#include "toolbar.h" + +ToolBar::ToolBar(QSignalMapper *sMapper) { + mapper = sMapper; + arrButtons = new QPushButton[7]; + //edit = new QLineEdit; + //edit->setMaximumSize(300, 35); + //edit->setMinimumSize(250, 30); + layout = new QVBoxLayout; + vSpacer = new QSpacerItem(5, 600); + +// QFont font; +// font.setFamily(QStringLiteral("Nyala")); +// font.setPointSize(20); +// font.setBold(true); +// font.setItalic(true); +// font.setWeight(50); +// edit->setFont(font); + //layout->addWidget(edit); + customButtons(); + +}; + +void ToolBar::customButtons() { + if (arrButtons) { + + arrButtons[0].setText("Add function"); + arrButtons[6].setText("Close"); + + QFont fnt = arrButtons->font(); + fnt.setPointSize( fnt.pointSize() + 4); + + for (int i = 0; i < buttonsAm; i++) { + arrButtons[i].setMaximumSize(300, 50); + arrButtons[i].setMinimumSize(250, 40); + arrButtons[i].setFont(fnt); + + //QFont font("") + //arrButtons[i].setFont() + + if (i == 5) + layout->addSpacerItem(vSpacer); + layout->addWidget(&(arrButtons[i])); + } + connect(&(arrButtons[0]), SIGNAL(clicked()), mapper, SLOT(map())); + mapper->setMapping(&(arrButtons[0]), arrButtons[0].text()); + + } +} + +QVBoxLayout* ToolBar::getLayout() { + return layout; +} + +ToolBar::~ToolBar() { + delete[] arrButtons; + delete layout; + delete vSpacer; +} diff --git a/toolbar.h b/toolbar.h new file mode 100644 index 0000000..6b2a3c0 --- /dev/null +++ b/toolbar.h @@ -0,0 +1,41 @@ +#ifndef TOOLBAR_H +#define TOOLBAR_H + +#include +#include + +#include +#include +#include + +#include +#include + +class ToolBar: public QWidget { + Q_OBJECT + +private: + int buttonsAm = 7; + QPushButton* arrButtons = nullptr; + + QVBoxLayout* layout = nullptr; + QSpacerItem* vSpacer = nullptr; + QSignalMapper* mapper = nullptr; + void customButtons(); + +public: + ToolBar(QSignalMapper*); + ~ToolBar(); + + QLineEdit* edit = nullptr; +// QLineEdit* getEdit() {return edit;} +// QPushButton* getButtons() { +// return arrButtons; +// } + QVBoxLayout* getLayout(); + +public slots: + +}; + +#endif // TOOLBAR_H \ No newline at end of file diff --git a/unputpanel.h b/unputpanel.h new file mode 100644 index 0000000..c82157f --- /dev/null +++ b/unputpanel.h @@ -0,0 +1,56 @@ +#ifndef INPUTPANEL_H +#define INPUTPANEL_H + +#include +#include + +#include +#include +#include + +#include +#include + +class BtnDescr { +public: + QString text; + int id; + BtnDescr() { id=0; }; + BtnDescr(const QString &str, int i): text(str), id(i) {}; +}; + +class InputPanel: public QWidget +{ + Q_OBJECT +public: + InputPanel(); + ~InputPanel(); + + void initVector(); + void setBtns(); + QVBoxLayout* getLayout() { return layout; }; + + +private: + QVector btnVector; + QLineEdit *edit = nullptr; + QSignalMapper *mapper = nullptr; + QGridLayout *gridLayout = nullptr; + QHBoxLayout *bccKeysLayout = nullptr; + QHBoxLayout *mainKeysLayout = nullptr; + QVBoxLayout *layout = nullptr; + +private slots: + void clicked(QString name) { + //QString sId; + //sId.setNum(name); + QString str = edit->text (); + if( str == "0" ) + str = name; + else + str.append( name ); + edit->setText(str); + } +}; + +#endif // INPUTPANEL_H From 4ca95f2436999ab739fc5d7d90cd331e0551d542 Mon Sep 17 00:00:00 2001 From: useless XIV Date: Thu, 18 Nov 2021 18:12:48 +0300 Subject: [PATCH 07/13] added empty drawer stuff --- drawer/.gitignore | 2 ++ drawer/2dDecart.cpp | 0 drawer/2dDecart.h | 9 +++++ drawer/3dDecart.cpp | 0 drawer/3dDecart.h | 9 +++++ drawer/CMakeLists.txt | 24 +++++++++++++ drawer/cylinder.cpp | 0 drawer/drawer.cpp | 0 drawer/drawer.h | 8 +++++ drawer/polar.cpp | 0 drawer/polar.h | 9 +++++ drawer/second_dim_drawer.cpp | 0 drawer/second_dim_drawer.h | 9 +++++ drawer/spherical.cpp | 0 drawer/spherical.h | 9 +++++ drawer/tests.cpp | 67 ++++++++++++++++++++++++++++++++++++ drawer/third_dim_drawer.cpp | 0 drawer/third_dim_drawer.h | 9 +++++ "drawer/\321\201ylinder.h" | 9 +++++ 19 files changed, 164 insertions(+) create mode 100644 drawer/.gitignore create mode 100644 drawer/2dDecart.cpp create mode 100644 drawer/2dDecart.h create mode 100644 drawer/3dDecart.cpp create mode 100644 drawer/3dDecart.h create mode 100644 drawer/CMakeLists.txt create mode 100644 drawer/cylinder.cpp create mode 100644 drawer/drawer.cpp create mode 100644 drawer/drawer.h create mode 100644 drawer/polar.cpp create mode 100644 drawer/polar.h create mode 100644 drawer/second_dim_drawer.cpp create mode 100644 drawer/second_dim_drawer.h create mode 100644 drawer/spherical.cpp create mode 100644 drawer/spherical.h create mode 100644 drawer/tests.cpp create mode 100644 drawer/third_dim_drawer.cpp create mode 100644 drawer/third_dim_drawer.h create mode 100644 "drawer/\321\201ylinder.h" diff --git a/drawer/.gitignore b/drawer/.gitignore new file mode 100644 index 0000000..634bbfe --- /dev/null +++ b/drawer/.gitignore @@ -0,0 +1,2 @@ +build/ +tests.cpp \ No newline at end of file diff --git a/drawer/2dDecart.cpp b/drawer/2dDecart.cpp new file mode 100644 index 0000000..e69de29 diff --git a/drawer/2dDecart.h b/drawer/2dDecart.h new file mode 100644 index 0000000..7b4e20a --- /dev/null +++ b/drawer/2dDecart.h @@ -0,0 +1,9 @@ +#include "second_dim_drawer.h" +#pragma once +class SecondDimensionDecartDrawer: SecondDimensionDrawer{ + private: + double **values; + public: + SecondDimensionDecartDrawer(double **parsed_data); + ~SecondDimensionDecartDrawer(); +}; \ No newline at end of file diff --git a/drawer/3dDecart.cpp b/drawer/3dDecart.cpp new file mode 100644 index 0000000..e69de29 diff --git a/drawer/3dDecart.h b/drawer/3dDecart.h new file mode 100644 index 0000000..35ff301 --- /dev/null +++ b/drawer/3dDecart.h @@ -0,0 +1,9 @@ +#include "third_dim_drawer.h" +#pragma once +class ThirdDimensionDecartDrawer: ThirdDimenstionDrawer{ + private: + double **values; + public: + ThirdDimensionDecartDrawer(double **parsed_data); + ~ThirdDimensionDecartDrawer(); +}; \ No newline at end of file diff --git a/drawer/CMakeLists.txt b/drawer/CMakeLists.txt new file mode 100644 index 0000000..6ef1a2f --- /dev/null +++ b/drawer/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.16.3) +project(drawer VERSION 0.1.0) + +include(FetchContent) +FetchContent_Declare( + googletest + # Specify the commit you depend on and update it regularly. + URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip +) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(LIB_SOURCE_FILES drawer.cpp 2dDecart.cpp 3dDecart.cpp cylinder.cpp polar.cpp second_dim_drawer.cpp spherical.cpp third_dim_drawer.cpp) +add_library(drawer STATIC ${LIB_SOURCE_FILES}) +target_link_libraries(drawer) +enable_testing() +find_package(GTest REQUIRED) +include_directories(${GTEST_INCLUDE_DIRS}) +add_executable(tests tests.cpp LIB_SOURCE_FILES) +target_link_libraries(tests ${GTEST_LIBRARIES} pthread) + +set(CPACK_PROJECT_NAME ${PROJECT_NAME}) +set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) + diff --git a/drawer/cylinder.cpp b/drawer/cylinder.cpp new file mode 100644 index 0000000..e69de29 diff --git a/drawer/drawer.cpp b/drawer/drawer.cpp new file mode 100644 index 0000000..e69de29 diff --git a/drawer/drawer.h b/drawer/drawer.h new file mode 100644 index 0000000..9989523 --- /dev/null +++ b/drawer/drawer.h @@ -0,0 +1,8 @@ +#pragma once +class Drawer{ + private: + double **values; + public: + virtual Drawer(double **parsed_data); + virtual ~Drawer(); +}; \ No newline at end of file diff --git a/drawer/polar.cpp b/drawer/polar.cpp new file mode 100644 index 0000000..e69de29 diff --git a/drawer/polar.h b/drawer/polar.h new file mode 100644 index 0000000..847de8b --- /dev/null +++ b/drawer/polar.h @@ -0,0 +1,9 @@ +#include "second_dim_drawer.h" +#pragma once +class PolarDrawer: SecondDimensionDrawer{ + private: + double **values; + public: + PolarDrawer(double **parsed_data); + ~PolarDrawer(); +}; \ No newline at end of file diff --git a/drawer/second_dim_drawer.cpp b/drawer/second_dim_drawer.cpp new file mode 100644 index 0000000..e69de29 diff --git a/drawer/second_dim_drawer.h b/drawer/second_dim_drawer.h new file mode 100644 index 0000000..36c137d --- /dev/null +++ b/drawer/second_dim_drawer.h @@ -0,0 +1,9 @@ +#include "drawer.h" +#pragma once +class SecondDimensionDrawer: Drawer{ + private: + double **values; + public: + virtual SecondDimensionDrawer(double **parsed_data); + virtual ~SecondDimensionDrawer(); +}; \ No newline at end of file diff --git a/drawer/spherical.cpp b/drawer/spherical.cpp new file mode 100644 index 0000000..e69de29 diff --git a/drawer/spherical.h b/drawer/spherical.h new file mode 100644 index 0000000..ff3b9b3 --- /dev/null +++ b/drawer/spherical.h @@ -0,0 +1,9 @@ +#include "third_dim_drawer.h" +#pragma once +class SphericalDrawer: ThirdDimensionDrawer{ + private: + double **values; + public: + SphericalDrawer(double **parsed_data); + ~SphericalDrawer(); +}; \ No newline at end of file diff --git a/drawer/tests.cpp b/drawer/tests.cpp new file mode 100644 index 0000000..60d7c17 --- /dev/null +++ b/drawer/tests.cpp @@ -0,0 +1,67 @@ +#include +#include + +#include "polar.h" +#include "spherical.h" +#include "2dDecart.h" +#include "3dDecart.h" +#include "cylinder.h" + +TEST(BINARY_TEST_1, binary_search_test) { + double a = -1; + double b = 1; + int dpi = 100; + + EXPECT_EQ((abs(binary_search(a, b, dpi, f) - (-0.541)) < (b-a) / dpi) ? 0: -1, 0); +} + +TEST(CALC_COUNT_TEST_1, clac_count_test) { + int n = 2; + double a = -1; + double b = 1; + int dpi = 100; + string mode = "count"; + double ** values = new double*[n]; + for (int i = 0; i < n; ++i){ + values[i] = new double[1]; + } + Calculation calculation(a, b, dpi, f, mode); + calculation.calc(); + calculation.get_table(values); + + EXPECT_EQ((abs(values[0][0]- (-0.541)) < (b-a) / dpi) ? 0: -1, 0); + EXPECT_EQ(values[0][1], 0); + + for (int i = 0; i < n; ++i){ + delete [] values[i]; + } + delete[] values; +} + +TEST(CALC_SIMPLE_TEST_1, clac_simple_test) { + int n = 2; + double a = -1; + double b = 1; + int dpi = 100; + string mode = "count"; + double ** values = new double*[n]; + for (int i = 0; i < n; ++i){ + values[i] = new double[1]; + } + Calculation calculation(a, b, dpi, f, mode); + calculation.calc(); + calculation.get_table(values); + + EXPECT_EQ((abs(values[0][0]- (-0.541)) < (b-a) / dpi) ? 0: -1, 0); + EXPECT_EQ(values[0][1], 0); + + for (int i = 0; i < n; ++i){ + delete [] values[i]; + } + delete[] values; +} + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/drawer/third_dim_drawer.cpp b/drawer/third_dim_drawer.cpp new file mode 100644 index 0000000..e69de29 diff --git a/drawer/third_dim_drawer.h b/drawer/third_dim_drawer.h new file mode 100644 index 0000000..3c7a958 --- /dev/null +++ b/drawer/third_dim_drawer.h @@ -0,0 +1,9 @@ +#include "drawer.h" +#pragma once +class ThirdDimensionDrawer: Drawer{ + private: + double **values; + public: + virtual ThirdDimensionDrawer(double **parsed_data); + virtual ~ThirdDimensionDrawer(); +}; \ No newline at end of file diff --git "a/drawer/\321\201ylinder.h" "b/drawer/\321\201ylinder.h" new file mode 100644 index 0000000..7206527 --- /dev/null +++ "b/drawer/\321\201ylinder.h" @@ -0,0 +1,9 @@ +#include "third_dim_drawer.h" +#pragma once +class СylinderDrawer: ThirdDimensionDrawer{ + private: + double **values; + public: + СylinderDrawer(double **parsed_data); + ~СylinderDrawer(); +}; \ No newline at end of file From a64fe8d02e0d4861808a35c8b91faf65f56c44c1 Mon Sep 17 00:00:00 2001 From: useless XIV Date: Thu, 18 Nov 2021 18:16:56 +0300 Subject: [PATCH 08/13] without tests --- drawer/.gitignore | 2 ++ drawer/.gitignore | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 drawer/.gitignore delete mode 100644 drawer/.gitignore diff --git a/drawer/.gitignore b/drawer/.gitignore new file mode 100644 index 0000000..d87c627 --- /dev/null +++ b/drawer/.gitignore @@ -0,0 +1,2 @@ +build/ +tests.cpp diff --git a/drawer/.gitignore b/drawer/.gitignore deleted file mode 100644 index 634bbfe..0000000 --- a/drawer/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build/ -tests.cpp \ No newline at end of file From c5e5186e938e91702eb1eb7c77653ad311a53743 Mon Sep 17 00:00:00 2001 From: Nikita <44447798+NikKarasyov@users.noreply.github.com> Date: Thu, 18 Nov 2021 18:42:00 +0300 Subject: [PATCH 09/13] added uml charts --- umls-Main.png | Bin 0 -> 124704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 umls-Main.png diff --git a/umls-Main.png b/umls-Main.png new file mode 100644 index 0000000000000000000000000000000000000000..76075ebfc62be00c1d3b9a4877b19451b17437f3 GIT binary patch literal 124704 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Ðy<`0HQT*FN^b{Zr9=O}XB@ ztcVtG{l(-2v<~syl>5eyqi`i5Pjh3WcRyH`N(tn}Hd#=yX0Mjx%$6fh{L3!AJm7Dys zomFD!R9s)+6$`OH3#AxaVXpuU*^12kOW@Oiep5H=FBGMMXAM2M*^-uSklL6?0MNB4 zx4s^1?VHFQ2Nw@&Ay&cW+wD+FcQQACdwt>+oV;3jiG zOLDVfW!ElfFp@kk?N$Q!gxTexw9kI;77}eBRUw?z+sVl32!W>Ry5QoEcnH)MI(F&T zBf(L@FOT^P!Oj~`XUal3!WvhZz8-M^kSVO2#91Xfit}Bf#yH|kG`f{`WPDyMzrn@W zwm_=T!ukOl1TF_Oy^u-RM>JYTxC;YeKs@mrT~dp2xbZ}G!nCKR4yv_2d)E?jgAYhXqz9iz z#t7mOq(8pEy|W^BulvFN)XYU~RRqEp12%{%kS>T z3A+f@O;IeWyBekU7P<q;dZOk}LeO;hk{c*DcP@gzumY{nJ}B1iBX> zbMn{6^CAA-*2|Ql%C0K5-^em7JdN3UAZy}fJ&>ahi!)bxsMUtBUvmsMXa^ls<7;8j zPe;Pzezh42?`nU{dQwa1GD(u$nmbd!mud_dv`nHe49K@w*eW*|U9{ob^PABP$-DKC|B)VM##hTM>xaJEHCUbBLx-=1VCF)3HJJM?2l zdJ|A(*zCega`m~s?#P#9Kmrha_~#tp|C12>=j7k7&jgV?$s}p$>hB4q2@3!PpMRAy zUMvko-12IgyqxB`TFhoGi=K1G!GzHD_eI67pOP8 zYJGPmYyeN}o$+9}J85NbfIb+-g28{;xUCF;RtD2a%hN1XTRV;X&8(yl&3&bE1{@Ni z5(~&*rVF7zy6-1*7m&Zbp`9(%L;33~8Bt0Kx1zvoQJC;&hRFijtHJM!B6G4E^Ftn_ z8(n~rf5$OISgFCUBKt)Q1ZG^I^dCiv@FgMOOVxh*JYTI|CRcPY9}$8~C^$Z^xXXn^ ziy-l+OJhY{q7NqQHJyh*e7GtrWFQSC)m7C0Dh=g{sdF=z!;oq{HcP5l;|uK1_A|zo z6}!-YC*L-0nG|&s8OL`t25RIwPvx-_b*35scbK^);xj;j_IXH4C|rFu671U(Ou2m2_an%azcRR&0m16xi2@HIa8_+X&^Ypp=< zj7{Z13Y^dRVnnaLp8tS*%3?W3$_emROiPST9psjoU&oEKqccG9 z3Lq^pfV&b1`jAztV)7^YZR#zuaYuO=|ApCE>JvTi1=4EBb&87w{baD1Y{URG5QCAH zx-`|hh}YfC+V4yr-PO0&1|AsbcLx6$g9?p5bqS-?6qKG-p6i8ttT8V{$jK*}{X5Yz zamYcgcRIp3gWyi-%C-lW_RF6ty1 z1;9cEOR}17_S}HWU997rvsi(NvyZIzKZSg82Eg-}){YE8E^vYdziDN&fdU>1SW6wk z+ybBmM)g5c<}uwbLdR-GX$#*X{2iX}Pz?Q-SlK&yzV24ZQR$nbkw>EQ!Kb}NSmC4D z(lyx^jgR$p9{VV@rRq=u_LVJVp>Zgz$Q;fUC}csOgdKlmAiAuK70jgcd*!n0FBBNH za632QNmzRreHK9cTiq} zpJ;muCw@yawyCuO$Qyv@oqYcSC9JG13$5(?d>^Q=0kC35bfi*IMNA4T9TUCNoIVe{ z{wO>LAXxxV)xt^fCrJWc=`w^WM<;wPwfh5T};S*rlJ4ujC`G9ji8 zl!@R~pN8!MpK(>ffWUU~hXCP$i|hErI%Te+GI~Sbb<=D?B7Ozx!HC>j?>eZHa;x>^ zcZ#hLLSTfXt?Cy0?kEMM(x>R!hYCZc(S# z8zvU+gYbLU*S~l?ak&pZ(=1{UrpjbOdroHQE_&He;Z&`6F7=dQcRST*UN zj5H6)m@e}|`6{lhI&jA08~4DHFjOeiGoSL_^Emad1cBR|S=I!^_JxAxWXy5q@BT~Z zI5H{PenOIFTjoIJBqHYZM=-1Vd)hQczTg)OUL`aceSq`Y50)>QPU(>m34$0Gt!>#n z{xqQJK=g2Dr3g8O@(0I!>-${=QOuZ>f>&>6JiJ>UH1nQn2@mq}#S-M1smm2S@F4>#*{gpFL%v$u#hZHlscxaQAet?zkKj$(^f9vo^ovRa7r!G# z0GO!0beTsI*rLKvps=MI{C+^6Qlo|-I#l=TW!Q_M!g?Fb0d$@Kjn0^H?o^y%4Z~=< zO}CULOcZP#M!F6H%?e@F4R3`Y}lfxt%(28E2X(@pqiI17Qrs$UrM(1|fF6y8ghJ_6?m5xRc zjWEW*d2mb+Wr(}X8ud5EAx?LK_VK9Qp-8`x+zpeOT!xkpAU#kCUypPrqI&8|yFbUl zSFeGPs~Z9Aou`BClMgAi&OO+XY)K91##PkKSPH zFR%mg1@Djdv(D(6_D-jI{c<0VvlZPeT6nTnKvY*q@gZTd^CRHfSaIs{&xc4m9qreo z7%ULFUA4IVCZ%bpPaP)F4-X_GsX6Y)3~Eb!z5rl=gN@Nj zY#oJ**?1E(A}SBjx)5lygMBT84FOq?4rA%6?5G_|}DIX|V- zC+lp-=Z<*HxhJ?Fs{vJ|A+ncOXP(486jQi-5XoNMeL(=GY+%=XLDNYhMm$6-28Z}k z^h^Kn zr$c^>cgDN!8LWn$Bm+)0e{sFz8-nph;Rxa4pE(6YU~R#pE}4MTeQs8B!U3Uk204>Y z$b3gl)m1TVg*WWab&l&p3IGj)ttx@&z)XL~O5M&(O$a>lILs!|nFFLGmd~$Fey%@_ zdN7PJt!TB%8$V8i6-1px7~FYd_9G+%>|-W@|2v*Dzc%Vpa9Wn0NAG?B4GZ3JI;}WI zAe>gKnYCU8_8RKKnD?eYnKnpLLEC1VZB=&?oOa)7r&JQQzMW!l}E2 z3khQ_@H29&iU=u(i%?aP7Rdqgd|Htmo|r4ZVGzaFh&zNVvM^8@642zCAf!lC+L-WR zl?1si*^WLr{H%x4Q~?=VmH~ESrL0QtHjZYYsop-v-f}g=vl^So=80gjB&T#|g_%QZ zw)?TQjc+alWRC0U$4gr|$jPKAnf{`Oh4usvr1qR9dO+MkH0S0jWL3C2o=y61rC!_( zp#PkrLBikB7Srz>1X$C>J2vu(5K`*sg)z6PEM03~u!>}0I!!0NX)!&qscm9jLd$3R0=XOcnBPm%e3iniQK71|5r9e;W#3)At@4};bVLH9s zCr`k3bgE)+q$PEM>kC1xO5-vaHvmB~L-aY?}XSHxJ}u zRTV9`oax1AV|@x|eG+a*duakl4}%K>`EVE=6-_Wm!2V@S%#!Uw zw7E9_NS|&(i0s*q4`hs?JT_LT(+_)-g0TSxD z;g9c3!1|YUt|xNhJ%nzNylKOm319$nL)-2@hrNnlljs75`} zMaiegXh7^<`QVb%>C$VFYn`roj9)#)`~v@jVd)vHQ469q?zD|J`{BA~@Pozny;rmj zwq4!%h(RuhULBl(FqZ1EAMa6sh?@qN+v2D{UAv>zi`ZPB?Km)#Y3tOG%s{z6= zJTBe$Bmi(hu#YGM5il{z*nH6XWD6M&G;s!=c^=?oE=yCCCgg(_jn>=?RmyT8xMA)F z)rUZ|pjD}oi*{w0FY6Kp=iD757%ar=9;u7SCcw<$Rj8gQja}@ZM^4Egr6K$D(*bfr zIP7O3H{zGC-&vNr=AK4~!}s~ys{N!Hr%c&~0FubUfq!1@a!<(=d0HyZf_s$Bq3;!{ zlO2~u0qeW)!O~XUi-pJax_+Sq-zj$m z+2OU&Aaf1UVePW;#!w&#VAj6yC(HnM6E(W$S8sW5c<2}~6b47UU(Xl^vw?2_M(-O{ z+C?@c6%5~C>3o&!GXr1-Rm%e5)Av~c+_Z5JDYIy6y9x)~g1Nb_rd|+M+ivjc1rRry zv+x5xrDB&c{uDmDeD~>bfB-VQI_A~zMZ$udyfe+@>Kx4)qX(u}bNUND8z}Ms`Ui|; z+h}dUJbMF>32Z3AB*p@s=J;AetS7&uQDb;cnAIc<69z<5_))titSYR+Tm%#8Spu{v zj0{uye>zEvBma{cy%D=jOfk1xgU>9g&v0i_@yJsdt z`1OE(hMb07&$QmBr`;dyKNzmx1*o-n!SWc-VZ!IPIxIk#8CZ165AeR`g9G2dYyYIe zF~aJbivZ0V!jQ&9T-(CDsJS`a%!k?@?+twb(Nq40us~U{?5eDHRge+XL$F0`&BeP9 z05kn!@!DYltyxHi6Y5$c8PUpfsSdEII}9ww>1mt-3??%YL7CgFpOPyKuzIvCQnT|! zkAP8h75_>INkl~74{&~?g||z~jxlUv$!=r6ex%&&pk0fkXu2r`mH8+Lfa!G2Z-c1Fo?hy%ihi!I z19OaCeV&4*;WnMBDQQ+f7j!6TN)b@iky3w>W5l)_sZX&JL5L0z=o!2K;{!zL?KMOI zN$xdWQXs8cO?{~oIWs8(%7f9Et+0rhiDAjqem@mG&U3ab)dJ*RaGKG?x6Fvq48v}} z&zvbKcj7CG6c>{V&0N1Y*wXi$MB41GLAnm`60QAJOL}DF$!!qEo~K{S)V@AnT;Xrl z3hkX<>Hh~VU#!|(LV+6z_JK9+@9{zbJp%U8zbIGYRv^~Es{I9*LHQ9ip)Xtpu`2vT zkuRX(NT9(?d0|9e{cr4=l3=0IE;*wakt!1amNC}ryGF`&euUykgOfwVOwWQR@`HTm93GB2adEY zNWt|B5tq(E)9U2$L>`-%h`Q!%uhfp$y(>Ld1s#W^1()xorJw_b*Cz$VVddZ(85J;A zPZzNS3d_KFr@ejG;6PrGsHX&_Q}5<3Y7z5-&R9DGs1$k_F$k!MP7 zh`^o%MEt{+jIoAgNL9q6qeA5pHn|06j3D=v6i5kr9Z`m2x#yPpJziX>3^u^UA3mK0 z{AV_L?^1{=tok_%Z`q_RYJktd-mll|m8|TffiF%A77LTB09qfYMLHl!9sw;{YENth zY&)^Pas{{#28nGKxZ1m`;HFu~rbNWxo#LRg-y|5*{bq!zk+X1WCkH{dFGIvgl&6O8 zx*)Bz=Ecm{wiBw?F9mz19@bk)b-E`J7(af@FT^~+yI#K&1M~hPko;~ylJuloA{thB zVT3{ZNx7~&e3Im%qp-r#6$r4zX9R5^DODYHqtT=GTVLacw%9nDCfej-?BJofzN# z@m2B(eP>EWA-B5K~ov zj0vu^p3uTxE(kcWJ-H=Jq7fE;hKX%>gzBwt|aY;2-Foi-FjhMtkQ6~t-gXA>1$=APe4S>D|I`7pauQ|NBn~!FV4zR^c&t9c#L6he_P9s+E*8{~gJo_gxQYyYpO1fX0 zfz5$~B3wm|#Rdw>S&n>(m+)jaeZv|FbO0)U84gqL5c4tldBKhM&WSeHx43=7b*+!v z`gCQnldQBT^E)ph4e4Vk+NVUFn)Ce(O$T>-d++*jwd6@8>BpcGE824&u+r?4uI129 z&A4JLZTI<^Q}~$nfX9h_mrwQjoCzPj>V63H8B{69W_iUxKD}lldjK3s7CEsAl|(`L zf}H2gY!$Zy{|_AdiIpEGAT|2{s)n~bNrg&2fG1s*bMS*o%|K&NL4G!oYJpo?5G~JZtS(LwjGxmXf?f_o^wrVXXVb9A9~oG z$)Bn$SQo+Fv9w)p1Pnjlpa8Mps2HFRP&0P-!s8>K=$s#F^m&#CBpo*1I|E|%ME9;NN`)0ezdM1qhp){lB_-~IeO9{j888Yl{GMeG!6pO zLGFm%vF{))<+@7(D3C@WTP*kNgzksV5m%PQa%5WKcXJ z@%MOppvsI|$!x}r?=Nyc=z2kP&`dPD@Cn_3c$PlhyI1EJsL`hn+OAX^P;VRC9NdHg zWzvnFAjJzPGt(Pz(Bapj07CrP239^xEq{R*+}=kBZKF?eAe~8>0I>)JNOgk7-q$b; zcRAw#9Ft|yJWU0}aYec|zvGp>vUx@G0#5#fAF->{?+bwXeouH)jGq{&2V|bfk-Bv^wqX9TA4!TP$|PoxLu*x4Ch4U270r$Pm99sBB^&FoO&}Nn-a}$%4|w zf$%^9E|z{y76x$mw-o6(#?88AKez7EO~pD26b5G2@6W<-=AmnHqGAO!C9Um~j!@Rg zgC)#tKs!SC+RX|OxG^Ji`xdySH8EtO%RL9E;0mf`#5vWI*zhL@`g0~9+G zJ+IQhCQhktX0Loi;Ll2RKqmZ$1SYro2W0IPh#8(a2p%QZx0)Y?y+BzD3T@W{s@aXQ z+(!!1B04!+RQ!Z5++x`3g<#hQjgF@#cu9FOp0j;5mFO4Tta8?oX);qdoVz>GeOzdY zK|Gd=Pa6SoXq&=r2<@W%2Nk1U0mo6mr?T5Vq?h8Ec5XbB-#AEj)YR&mY3&s@g{r*D zNqjHE6D_pW3wYe*n^Em!b}n@U8}P%YiH~c*P5+b9;hYjEP0jMn93m0%()wk>3f&4z zJ(AzT*w7I0%oiHBr)E}W`%@;lSdu;tYCV6@$=m?Ola7Y1P*ig!$Q&casrsM`hnp}W z%X?uyKpl~lA1r4y#1zsI3(IU&$NUH$1;8sHP&j@^j3;1sBTcU;0$TZ{IL=;X2$+nf z1N!3P>0UYbG%+6CK?ELVTt=cJx**$z2^#WLrdmuDoJH+3jklH=D^Rbcenpr3d8i|O z#EdXqRoTFN2z0ZtgC?9Rv~4y=0Aff1>`jpRsJn8wrI4cKU<+W5$cGB1Z_UgcJl7%x zsE)SG0Td=4vHcUN(7#%bs<#x#_rrJuJ=1niBYX^Y5yKRE6pdOJ&Xm{FGS1X^D}Di{ z6lCy>heoYST@{*K*0WVa@$QG&a9TSIZ+;RPTEF)vA6IAaFT6v)>F#iB@~v?o(i+%W z9OiZJhW$it88Met9P7Z*5Jpw~x!T~*@?o*4kXU4p6RIw;fplE-`8N<4ag{aqo_KjYID z03<}e15`=C!3mBILC(GC(|ug+)w-KX`8z8T>TlxkgM!~aghoRJ*kG<*bG;orB;^4c zHTrA?w)vWO9v~owl;sJY*b#J~rokuQVWICGJ2bu^>NGduq`;IruY(G zy7Ct%SxBxDno4HOnHLTqleV=2%3JxyTsMhaxQ1gbEw;*@W1G~IQ_Oq1=!w)-GeK5T zc~$HBI(IUD60QNVY9yX4Pi61-Wj@9sY_z^YdB>H;sZ)SN5ow?Giv}onc8U;M zOeABV5KZubr3maZhyd3ygZOF$Bu!C8tHW0G!nEIf155?&E8U)cC>%FeRo^f-q4J=bf^x_Y@47HD6vu>T_5 zH2nE=9O!KJdOAQT59DL_6cBFzIRG^$fc*Mr0E!u7%`})kL}rL!LA`qd9!?S)8@Z~L zBFv2!cenFy2aIx{ay!DdNj{(jk85`}f&lsR*rn@k)}DNIt({g#M!|CiygIaAoA9o2 zoV6brThADL_chH0tcC%SO};a_cs*?xyZ9HO3yQ2Xpj0$zs(3j=ie-18+Ic|uhT6?-U`P9=<z=1IEmVDxjBkk0Jn;RN$Cc z0yY-|U)SUuV6^4jDk!K{IkE>FF0kXe4W=%mH(^$PX9k=0uU}!%7hScS-b$>rBztmN zszkB@F+>8m4fnB2k$aM`1ge(=LsXjNn=Ekc(>bVwH4I2}^4WzO6I6Psz+p-h8T5XQ zddec(Je(H3!KQf=t&m^qNYYc4-)C7V0WVg*~ zJ_0=0JN?l=o(GlC+apys&jtG6*56o3>eDHzlM{rhd!h=^DZaDWBkn9g95b5@)58<) z@9yvdTf(KCMh1pn!y?Rws#y&|LdIE=uPXsd#>9T@3QK#)I{pOg5cJ?tM60MaJjkdB zJS@5x{Xy6(_PH}6Q_HlU1eD#n4mQn!4S@&bz#t0)EeUuY(g|(yj6KOH4P1^jz>)jE z?7at6lUdh4ift^2Z3ILR6f8)U7C@>Zp@Z}$AiX8@&;wW~0s$$40)k2tloEj;T}23p z5Gj&C1Vp-k^iV>`|3uMo9Orw#b?;qw-L>xPnl*&v;d##4XP4jp?R`!})Syb|bU`^+ z38AZZ(NMxm!@4Z+)n`kiMFtj-i6Ho1cgp==jyqumUN)&_%dC z&9T`TOIRtWIg9y-L!ru=#=eTa9&Ya1&MKg$vK&sF~;hM$JZDS5ezdOVQFq#0jFS0RbGw zWiJOUJuiD#u=CZ$=YqY8mXN5V1Bi=IaS<048~uwKt}uNi8#gt6JHMiOTooH65>JlaWyf7hr5BdhzSI2De$qe_486TR<(lCKn=v!7a{KNPK(0eKM!#OSAR7F zTJsK6)Yj0$*4|50+*_TNSh=gK3keH@TVAxZ^KlpPQ?LiLo{FWFCFqV*2XWtBOTp3E z*#sz^f`Tgz$r*`)3jHO2HxXNyij@oP?&2DDBKGzomY|{dg1?rpkcgM0leV*^m#42H z0G+P-zB(!<-hQBWNEc=e0qnRp#0Km}*D(^;ft%QfDT1C!WhYmOb3$OS7p*lNZNW|x zFH1{ZZ=lqg%7z~PZs$DJJggM#A<8r|5^=#t)lCP1xD4^uaIqHmx3LiubJ0^%wz5A5 zC^}tm4{sr`lf=Z!)r3~-0tHwXbuZxy3Vs)K?7;5;nHbp8cpec1IDJIj#?lYGhB*4T zU2->qL$y?tF6hD}JYZlSw*ojp#r2|z-#I;y3)0eALkGk;A#D|R4SxekAsaX-!a`Mz z-27}n2a}V#w;l}$s(D#^iWz!oYbe-TiAaJiq!JDWw0bqv7WBRQ*?Sp?f=F#*C8}Zx zHZu6SUGfo@w1?@ds;k@hf&HzvDhA?TcO~kAJ%Y}@$~Gc8KKcftAm4z(AkH2%H!W%D ze-S3?DT&b3khDhFUbY5@Y=E~x2~$JT$9nj|tnIx0Ty2ev?awLu+d24Z(6Sr_P;~-_ zgm{C4*u>9yX^MmRMVpL~gfKYF0+4%_)`s4a=X}M$du|tKPZ3pe(UepXcaZQ>y(A{& zdd^1ul99HynxBiWkpDM~rKqp3g?nPfQAHIAAZ4I(Z|LR z#6qZ=wGK^>VTzW*CJ1#}ZlNLWCaELjBdKNYsUSi-{KZpENXu6k?hO<7aB{J;x1kls zFG>1bRskr>P{Q6-~_{9-hpRHSa({WE39Cp-%df0Y9pN{R+J(9~G1m#@0uCDVaKJj{` z^v>h`YT2(jCK?%pz!^Jb;Ml=$|3vh%eZIe@^JR!ceg7rI_%Q31@4u9AL$-c@ZKn;} z?v7BwvIAvZvsTJRRSn+Av zB%d7a%Ib-nx1D&aSYG`mVB6-0vBO{_+LuLIf4l=0C;EDdV?Q{S^6NjaY&K!#r%R0Z zn4%i2(BFO-Kcjs%Co#11{2yC@a)gu}u?KI2+)bO?cI-w7c=^I4S_J%%S8rRn7IQ%! zyu8Za$O3*GKW)D*k3D`IyewuK+6#UhNDv8nV13{Kcxe>nPCE!QqM1eRozO0tPCRXp zppEtQa5TsGk?k}M>b6RwsiT!g<9@HbTWQ+pEYt@6PbVb#-{JgMI{)`{hx9O?Cn|e< ztLL2<{iq#AP${5aKeU>Bd_XsTWr+P#X#8sqzT9I#4ZrJm2=eyKS(SD7{c{&pKJ8EH zi~;)iUDIF4HZ3Qf+;|@D`|#x4&K5@{@Y#2rzsfNjpn53ygF^M?_>~(YrCi{%?=vXg zKQD9YmfV*U=G-dlFFkr`hW_0S2s>BP!623o2!cCbm7J!T%6E&Hx)G?Q@+meTf*IVo zIL(`8G~aE5bfGr)-D=_tiW7clG|?Q_lMIc?t-aPx3z}fv8R?bWG{T zjV)9Z!fC);lw*Ozgi=!**tpU|M~p#TZT`1tlld55A*p z7!+16`vsJjuiQ|2_jh}nIyJx%i`|b+v8a|~kFAMX#15h1DLKo8LAMn*ba1p)<|@e} z?WwiaoCmLccE-Z>CJdZdSs38wysrVeFm-n0qxLVB7|^_I&D^1@jT`ZB#Ep5H;t|VL zIgY0}Sk3Qh$>ka=&JSe6vpBDn)&$md#ItM3jS*v<1n02lNrwf?Jq-NYiV57oZRZRb z>{V42RjeDJs|)j3*OAgD(&6A)?!Q}hxXduwS!Bn1M4#DHt#V~GDu--Rw@~#t3p_%c zs9bqBBPf}9Th_&_K-PMEU+;j!*O>^;35(mK7+JHi*gag>J+Y0E@r@pxM%Oyea+>q<;0k@JXB%SjK+%ooepLqDmR^I8%@#rLYauL_9ig!piiy0a_rqGpl>LhGd30x4+L+=a<9bQR(^>02 ztB`%+3Nx<)WffE^Bjm(Nl=T86HM`N@9^e6xY>AzvbBbLl!QpvKVy8}jWm4xOqVD?3 zOozXFd{W{}r{cnTlI_I6u&*>}PgEm2P$O3&#?-!3wB}yiJTV((b{Ds7Z*-|R9A~#5 z+vHDT0&3LVRd6K1vQTvg^z1;^b*!@_d}XB|jj5;q(|+~~zk2d=t*XoE0$&#H(Bjod zpFv~*DXH^!QH$eDD^t9n>DfbsJ+!!>W*mTX{BH#NZ-Cyl>;K>QBj_G=HG_J#hF(yE z2J48*^+Pn+6DlT=pWaXmzR@p!5f}r63M{dkghPkD1`r9 zoBT=B*s+2c4gedYL=HT#zPyz#hXQUkT|N**+@Q<^yVg-irX`_tsi!Qqm|CV?Q^v64 zOb6ru1ZA>6E{}b%olZRLm)uvaH28rluN52K4Qo9xNT4GxqOeVd&HW&b3zBc)gm5 zy*ZARaJE=%zi0RkwbdDcWVIP|pbWshv7er98$S|37gC#NeDM$vk?9E_A{!tgSzTD7 zToP4|k=;xnxsbrkco_Wb$Arn@5tN4^XA6R#p4&}F_wnFnM*GeOo^<;)?8FPECc_s@ zEcVCaB>|Ukig8DFPk6kZd?GVz_SkS8t17NF+q8_q{yfMVd{1s>x`7DiuYW7=2qdl# zBt9%6!a5RG4o&5OI1!5!73+Hy>^M?lAN6(U*CxN!4)3l`xXiEfO1wwoP zrNDmUG~HC6{pKG>1@5S(Spa7`SnmF_kgfiEQ|O9)f+>?0MAzEY97<=#hG@k)xsFPH zKM=goDn4yNUBh>TZ{2>zVoTABf84l7j=G8?aZp#Vt=akc#yIkr9MyR3cF2Qa-jDi6 z?2jLs13bg5Ci>tz>v!AfTskeb7G12}s+tfUaY-8JeYGxZ`{EJNEg{6k0oB1ds)A6FaPuxKR@u%YfpWBrl^rOTW3G3j%i0V2-jZH)xTrK_3=r>t$lRe zIdwP3+WR+|p}0%8#<;OtVjm#s4mQ~q%N!(TTX8)&WA$iTNZEwopkJx@H!A4TN$pRP zZ`@ySIdI5t_h5l(z4p!{>>9sycbx7jd`-=leH!(R+B&F`=o{m~HoL2L=YeZi{viH| zHsb+qn)CE|I-}H$L+NKs0zjVFhwP2TS}(86`A)IR-PbJXcAxai?VPBu8FZ})t96*$ zc?x`e$e~l|nQS|yuamZ1I-dNJbP1LW;z9b4Io#^*pSQ{c@f(|(V_b8bo00YGxwY#5 z_1}V^W`?H~89-uA#7xU1Mc$b2iJ8B5d;T6sU-yUChmV=@LMpEa)F3i&WBo&ZbDaYl zr1Jg5$CLhEsqL4dlbzdQ1~BK=TTX?-g8fB_Ntz1I&*DC?w9@f_>)^~O9|Yqe2L7b7%TwYK*U%?g@%=| z90MTdE!3KvR^%hGEy0TGYP9!%TGVuhX@0>El5G3nKvE#H2T3Mp`eL=$`s&mL&q$O& za?9{rX#J-LfjOCjPnA|>bCzO z4n!-`?5NV}l(%b*ENb8>TBDo!pL)^~bz}Zs_X!x0!@nv@fglPsObJRUTT43B00oMQgM#q=r%?Nr7rl$gv(oLorsiykRK*Xg zf$aPcRp$IJHK^V)t4zxa+8ak3pvd-5`&Hk?M4VKWR+5b2KT>!J z7y_;!LupO(PST*y^T7f{Zg;(KzY6+dXteXXD>mIkTvjh zmRgNgE5}H#Zz~mrB*qG%3nQj=ei;<8SmJTv zfT7gNX6%>)bb*Vr96-(8%TZ_~J6S-8q-4LkytkWi4ypgM#{T7iHYLy$RUTflWiLH? zAu4Rb>LX!C!$Y*`qpYaJ`laHuZxWw0k-INv|5?m$5NA}EE;nX?Zcm$GULBectEXrU zoGOGTBNTrz-d`LLdPljPKQ?0(|0;L6=bYP{jUlqr6AnhJ1XN_Xo z0EGt(z`IWvw}my+d=43FEgoF=_x=X}!L*lg_!*;unXQI7GPa%*v33Fmn^CyQ8C0i0HQrHT%-ivqUmba@P<7da+vv-@pkSkwgdk0|_{flsX`S52J2{w6j76Q` zUW){(3(Vp$tBm>oRZsqlH2&RD|FYKq9&Bo<8{~eO5&k550g(G5Cr;A|7Uc)Ja>o3_ z$v(|jMIW5i|F^{sQF=!+0bxS=e-P%sI__W0V4v^yuj_eZ`W8We5#%ff|2#(b6d?GY zg88jOIPI8i>=(#%oVQ!92K-O@xUdZ77i9Uu3LR)fn{xpm^z~wr?RN!a3V<0wHSr7@j#_9 zfWHN~XAl*X<;6%y!T;S2xd2;hjGTX!nm5qLLttUrabGjH-=9Xl`q4OEj=}(##k|!6 z{%JD%)P&I>;OaU5!>T-Q_l5iL&N&bNB4s-m1zjVQ?;o4G?qE%NWT zT&TecRku2&Xt+Ob3sh+YWj(yhnJP@d)J`IE_Wf;S%*kZ_=|6K_95bk2L?&^rLUJTR zS?vZ3d1v{h^_Yi0qrUWlHkc@zuPW{s(+JGnF4KN0;PAW*C~(qHVC|TM&WZWiCBK*2 zK~nfZ=TY;OfKu91&S-}0;$&n6fCN)GNph1Y)#xnE?Q~oe0^!>1^~{mKp*-Uf5E01C z^&J)yxdU31FX=tk!fu#qbUxLAEjp3eLj(7Nx+u*b&q&6g>0MTrujkQw>+3JsT>_mP z0cIP=xC-Pbav3$kf>%|GG-9=of-G$vzM!f=@f!}x!q2S*#>j799)8vpK0>kRUml}4 z`LFkK_@I`u^W@lhN1O3-Vx#9sm3hR*+@6>)5s@5YG@c+wkZ?v|_ znA?M?-kF>~iW>!N%BJz0_ZL^X-d^y`TB`n3t8{#z9@JuKn63ir4i5`iJoXU8?%<|6 z-RJ@?O7PTm^Ps^Zc%Aw2x66_>0%mM%L4qviD=oo6qd~L1k4inS4t#00wGOUMY&_sX zvFrqx1q46LF+rVL%*MlNIW2083}n4O9(-x$0KQl5F0a)(Xa)HTdH>DQ$Jmv4q}dZ_ zbAVE zQI|mOGtyp|B{#@~l|RZj-=;&}d9cp<-=CQq!&P^`Y0&MiOiBA?|GwFaefCj-jgjdt zjEpjm#wXG#9}$XF>Gqo!jR9t*{yBF8&+qgx`_KC2%Yb1K_n<94GL5|i6FfORKK3HM# zTw9C(&o>t3l_%C(JO;d@xbCQnT)eS87y-mjcaRJ zjwzr1(>P>eyxfKAkWI4?PV4fsEE_H=aauvV3C@bLtJ9WY%-cCCIQ%UCEGp<4lYl8O zwV2S8y=Lq)K4m+m0KeM4QIfw#aoV6<%_lglRHBVT=a;nl9xe3`IS`9>Kpku9d!mx2 zGJ-O25l2My^#RFN8~HuWOUIR#D-Cp5tuT97Z>yXT9A>w4dNWgjGwWm;h!Si5?)>}; zhPcHtac+NP>V%Q!nr5V>weq~#Pt_Ike{!k|B*o?qjG6zMX_{vf9E_&owaRKR)h|YU zrM-32#Wfa+;hH@i0du>4c$J{CA!Q1(Hj&$_vW!FEeB%QGNU`4stxj=h)!}M>4Z3{% zkfW*WQhoDW6akH88OSLTfnT)4v(w^PEMpZQnq8#oO=GjRuinm{9p;neQh zvT1U(d_Cv=K#TdUkMfqCKoRuQ&(r#vGDo5!E?t>U#rfuxE3rd! zU$&+W#^a7G-b1pwWWwwEW2Vx#rlPGfYigM@PW*5)UlaT9^0E8}B2h0ZU-ve3grp7k zTV+=78ZFrY!AF|Sn=2Y95r+AB<%C`yO<8eWb{T!?oM>f8&Q1-wy zUZ*|%TNJU!!9>%9>>aPQ&c4FSl&p3kkV`A0$AU%=6`> z0+4HvhbNn(!q~N8hgWM>_O7yn793jghm(n^rh?i6$J%;nR*)}2FgK&qCpu47s@3SO zoH$&NBGAlHN9qG6WsdgPNRiy3VvQBImGHFo$A!&cKMbiCwPZ+@wK-#xx`UnNI&mO7 zoUz`Jfv?o?W>|_+Ve>uQ3o}uk14Zk;^VUd61N0JSA!#xlw_y;BEWp)?)fQ)Qv}i0* zv)A^lL`R_W|1K~_R+O3gQS)^crhzPE72+U|*;AEmFi*R^Z(@VnK7J@z{*-Q&`FN(m z{s$iM`{EAtz3}d^n}ioL>2u{5cCCSfjdrSR0sVUD_F@NainPHn&3j1+Lf$MRoa9Dp zwaRO)_X>K9%EdCWwo0}wR*Ld!2f;l1hXSc%Q}*Tu(l_KtX3j=wvY491%EkL0zU?c$ zK_@jj58t1=h&~t>@q|)2R#Mk(G4Oez2qnljjSa(!bW`hjZ{1D!8-!kHB6-7|W@_fl zqkov(!iOOVkW+2VM1LAttg80){p^R2M1_g4MYpD%(|=CuvZO~fx*SZx5xiPu8lavo zjGj36eHlbi4FJ{x>Z-h9^~87PL>w@R!GQ zs6lG^iu@HFSQlUmUW$RpuCFcOHx#<+(vtCO-)%H$Pel<aA#H1sZ z0Vve0>Z3HZ;Z5iwzuWqZDpOSU`m4#gitnr>u=8a$C4K#xPqFbLtQw53_68@<%ow$| z%3y)i+gUC{vII;{y20y197O6e zbz|TYyja82^G%5zq_Ui&#cYx~c;}L2a+AJ(HeuHa4`3*{FUW>Yw+mP#;C|vB0qRW2 zVX3)#H}V3&*TW4Bm4#K0G8U`FfcB6f1`(nkVh8zTJtHGVrClX5wR#8EsTur`H}pA$ zHCSD2Qk@~5k zsA9~B_ErGEQ0-vd<}Fi;f~FkF6RSWZ3Lv*C8vhLLke1f!SQr?r6W9K=WV_g@H4Ws7 zap;2)Wu|9Mf@R*1<-)V7Gwj$+N;uRC|FOLDXJN74t0{pl-|6T_uNP#naRTfy1zh~~ z*Y8B9TE0}@SlBPO{*L#>>R>pB|0GKQ(%*a@2&o@Yg*FvoMKShWk|0?Gt!4*I6NF+I zjr*SD^C&{4z&9aRbX#bROm*Q6^u>%}rN8x#s<*W)14>))i#<3v>^2Y8`8j$^;X_fk zq>ZD3EM$7BkS8Wi&h`1*ngf{E_Ab1_%g;G)i-RV}%}gu8seo7yI>Z4;xpV zT(_}Q)I(lv5v&X3ey0+8wr*o>GW^w@>IY*6FI(ND>JetCw%itBq33m77+I04^V!Q} z2dugNdk5|IqPmUBaRVn%wXEv}+*aCz&aW$9avO89php-z%v2sCo zwa*%x0B<)W!b({N{`3)I{wS#n&kOma{})&PVEgJ}j8avg2Cex$!&{0P%maCodqD1M zuUL&$X5i=9z|&c1_;6=LF1?(m0QblwZW+{KU2?J)t3{E1z5Q-Z3&Xv874a?!mUdhp z*}pT(TViJ;NO6&<#>nU-n7H7jRbYqy!I7&R8@rvY- zTr|Pb0M!LmgAL}v3927jyEa{qAj0>iISO=$jgW=)VTmNm=Nn$qtL~#j<+?gd>tf1@ z2I$N%!_QO*&4;v#4@5Ju@b|b>?l1((;xmB6r=B=NH3J^k>i&ASh1|x9H5u4UnMG}& zV;%4j6get#9=w6P`;v!oXnk$6h$BcGOEaT@R)V^$wW2t19jmgVGYYk>XwD}AsA)Bx z^J_yKRKf;6n1X+_RATn~DLK+NKpi2O786giG8KBa6UZ%2~+Tx_zDK zm<4OVih70z&gc)A@m~=2XP*L+UqSZDa?ta!k`={~M{w}9bZ&kN#sBf?Ele-$hiKG} zVV^Lv-to^!3dA2}VgT(S#tl*czNEu7-MhGC9uXeDUV8vvK4ut+I?VdA`_kLyP0Hhk zv1Cv_bifoUK^I_u2H%CJoKI*-61ZP42Oa2|pxwurFndGc4* z381{;2I7R2a&1iM-a6;K!I~x8G?2l{1L*m&oavE)x_QcxHaE$2^Da@44!Jz9^Q@&u z9UHhiD1?(qTC7~Jn5d~0E77iXtsl$9cA|5q&(yO>cFxS>vzLYkoWscpIN_9F*;U!$ z0gmt-5|>=#Iw9Th3#nVcDk9#3z~o+Lu^dP$Uz>CWXi6xiy6DK{P-Ay+f&4`8+DFDq z(fXSV{pIU{dx)84wK=CUOl1$;v50me&P7SA4#A0npdzE$5n>d?TIO})G=pz8y(gG) z_OhkK^W|{>fTubUCvO-Y5;_Bl zM>HPjhxM&~_^JGxH`HVwsxC6x^-mOAw~1m40E(@UUj^;Y>s!Cr(~y)~0l{I4qRi}t z=Z3to-_aUNHF58BlZzL1*4^z%tROy~+e2bAbai!oQr>AOTwVmy0NljFSX+PKbk(Z@ z*)^aKcYdSyvOkrZSJQ`-nJGGhO3k3~6L~ePu4UQh>BrG@>)=sfa{XA`Vb&2vD?AA) z!P}l`52?g(H1ocNm3qt4R53{g3j!6q6(-t^ZJo|6`d_RMpp9}Ip@Os77jJh?i2Avs z3nvT5&&ap}G&op`V&r64wwAboE8u*DrW`E+C04=6qX8U61yn#)fUoReJUK$;0Q`@6 zvTN{j!FuazZ+A(!U=7}p6#W(G10}k*#3FOuii@*{=5kV~JrF^rR}OH zewN9}@pP2^+4r)gYU~%l{nKU1_RD|H8vjKE{T9#zW<+hT{jQ?|_4fi?WM)c;!HxV^ z!y2Swg-Pap0fA!+s|wdT(j!rPNlJVHBoe8+W`FQ%i$x`tI-gv3GdNHyqsEHMT=BKH z@sA#eA8z(%b^F@g@D|SDJOE|zjRyUcW*9@H%+HMu-y^}_ta>vHK0LO?^t95?O$z`1 z5WtXf-p>5FLiF7qp3eB*;Q?xW>yL+?f8Pd~{^3j4OwxG(n!YwH7{l)a9!OumEWF;b z3?UE~Bjf`r6hm{q%aie@89gb0ej$ps)|Zzg5+83l__o#7lYGq?*-XH=7R=nE?1w2P zdfrOg?DP1o&;<}|MFz0aGF*V~!)1?(w>rxiO!x%m0dMhtzsV)VkdqMIUU+&I;gTP)K%;ynLzLhKnkL?cdE_J=DN5_G{P z4qu*)W_nv4?N-7<4seKy3KL^!&fL0a#XQa`b8?il4Q~fY`8?CP z*1;F(XE6U?K4~N?ixtO4!k|PNPrevAK3zQg~nhvWA61t(lb; zK0R*_+*^}SRO)Io>V0@lD zcYMyFB1`UM0_-&B^V}i}9hg@^9S83v9oXx1#q}=_HtDk8nk;bidUq2d6;wg-N}pR~ z-K@6GT2XSDjcgxI@)JIz=;?_voUVCcM@zb0?&Ob{xaSg!FPK*t{~(xF;@*ER;54 z-`3EIlb!)#L{VOMM%Q1XH&@iO6L4CN$C}+n9|BZ%cY!)!3KRV>CMwcc3}QZwWP`1J z@&HAQYS5ldv~~Yj5{UxsM0Hw4IQo#>T9Fs*Kb7kKRS3I8FaRdf-v|p;0KP<{Q=RGF zTYegqy#tyzdy4T8LzF{DLmQfMtiRj&&4;K5jvSpHlgKyAf~{;~fXK42Al5Rk4`bs8 zj@p0r{K^Edg9eUGCZJBt^uw8t3!rPq$F+T;%O5C9H5j{3SOIBgF($&j@PAsOOg3yk zfXyHg=OnU!j~2YnM3)k|kTUo~vqG?w`D=gAch~bbrK4rKVI>C{ zk_VseD^E9kQ|vpY-Pj)<5K9S^4d%Yw`>DYeRQ9jZSE!>8F8(j>_Pb7iA36BXG|RtK zZvSPFUvF#W2YT%X`ukO98atc+){OUCC%xHb_xcfG+_Oj~1D6p*0ljQb@|^@hW7dpp z$p+Xa2TJN+#=r)(I@gpO+DZ=+;g#$bP!k&*vD21LjC{7mvlurxw~O*UmiO^= zYiVM7a%5NsX`a%u^A!-V^$vMQ*5sCKu*fw%H#*3|B!U~=Wba4gUTE#iYJd=A_D+x{ zF@0^aIv#HLi=@9!3{)XeB3bBgFLPN^RrQfklZWa&4$at;VPh2Q$vT9zpSJqOirdtv z!9g5>){ewDG8}yOPAo6OvghQ?U{?S{T7aGRlh58?^S3e(R9HMZs0)C|d0+>d1>c>S zC|3k`WoFf25J2@c@(n=OC|&YK8&otgeuN0>p5OK*LZow?w;8RHle;ta#LdH_83ISh zRqw9}{zOoHGqkHN0<5epcX@gpiAC1*o_lQP7goH~me+lB%MCdCV}e$8>fmGiT+rbB zg+|gDIg)6S=!XnL-~F8%`>7%PasupvzZrEN4lePhwn^AFo;<+5+jU_mJ%Jq`wOpJ+ z?Azoo*Je$dv0iyYJ32W`X}(ORYQ~NPwn^MAL~r-^#ozNw}^+3AWR?p4>ggVLJpp_xLxO zCl>`j-;1NFF|m$xs4LY|{6d${Sx~#&=Y0PvrT+lg1t2xws9toHEzu4lJ}V8(A%Jhz z%XGe>=FG&}dcOy3)<85Uu0|{5?Q-;We(oI1?<1R`6qOcs17W?*V)-!Zoue!9Khd4E z#uA!4#mhJwqz_JZNYtlsK57|x2KLJ6P3c-Gah-yE_QZxY zx-7|JT&;)B*CS|~c6_0-VZtP=k!jHW1>>jSD2;R0I(eq}8I9j~3pKg&YCzZoujM%w zfQI2R0yo?l=H{pZREL}pBP3H^INASEKPbAM^MPJSVl=~54Tkg)qH^c6Tx8nOl@wE$ zp2zQ;hIn$eaYSm)s@uMFoKBit`apkB{$)E*R%Z#AU)qlqh!_2Hp}<;svZl-xFcTAF zrF-$g@L03&*ht$?(2@wpvcADy3(>{8aB{kh&1+9HP zY4CV^hgBvZwgZcKIEvrc?|ftLo8mv!OV{l-%U5UCTMTA7wYm|*@DWwxn%%_uYeQ1I zN6(1I>bbBv^?DYt-3ezBhSmSfL<%@qV1_9GeZj~7R$7^^4EW=DA>+k@vx2iG`NRBO zy$0(qkN&-JD&lU7Dr&!aAA9YhZ-b6CHk&Yx{;LxIS8_vyXYYI-))_sJGU!;Cx24AZ z>nQ_2bxR#+0mkxm3!8Ylrohk5cK=g|rRnesgWpij|48o~IDocsUFH32aElDCo>u7U zwP$Ct2b`m_^*$(^{WL=@@tF}SF+)(Wx!E$y>FMm2hfn1kVb@Wp) zK{wNeJJLP#cD~!Owljpy>lmc>%uUoeCdtLz1D0HLrzF3O(ok zaylpC5MUJdG;<5?M|TvrJC!-v`lUVCPd(!9NqBM z1Y{4`oNs<4J9u(6uG!{Utwf7?U^X?Q)ov0`SYTK)sgXkjy_PL(>5O{)%C>ht)RHsc zWpYxptcykN$U8ip*&8(KAY|+1_@S76@+=fK$+_P+*i1i!WFoHGN9=*sCvl`>HbeX-QqL63N~fVOOQdFF8r zdGmey_6>jhcy-)rv2dc6PnzQ@6~o0kL0w`~_#7C~)ZodD;afW|V;{eVbwbz+nP&^i zi%YBfk?P4T0qVGt*X-NY;;jR?VA~&@#2z~qBD^N)@u@&2;E7=4sj=d?VbOSlp4DD7wVq=b76sL*fd+)0te{oaFzpP2=AJ068NJwxqgMg2)+Zlbr$6qY*b>3c%g*E}0l9GC91 zy9J|0;P&R@i?lihiP;f3B_vwyZoVDaJSXzU?^Mp3o>dIl7AR|x@wy|y$^TJH`eKLe zc%8QmmlXV7KV~=Ud$Y5TUnSU>g`pbHZGCwcJ+Q-DN$#R1ICh~bsI~)JfBP*AA|-5M z{duQ`lm=|Yn0GHyh@DJc{*%xiLXV^L&^_c>~0f3kvznPGpwfm-40MRb2R#`*R@1B*j?#(GPv6U?=0# zW6U||b5qN)U)+XI=Oimx{M-2M)*3E)sNymI}h9KA@-1c=Oz>U31*$v7a^6u(Zdq zOY~|MoSQ8@0AC!}Eh4RgaVBs>?kGRkB%fz%@ZR!W12jHsFQ-+;(dl%)Ym^-zaGaR- zAtuy^Ths$*>xpDI=MQh=O8F3mTFgp2cGN)YJj9O=QeJut zsi-9yX32%D5fH4-N2{<*4Gl7jyn+V#J}FX`h8<3S>@aTx{LtRhIcs^f-7#Jw-3ce* zT(Hs%E4ku^Ahw|_6SnF7gkzLllFivN<=U~QExBxSA2QU75ANDI7!l>|BrJ8v)@ggw zyTZ;!nll{BnypgFhnXa4KO=|D(M|%1!2Of0`B|`Svc~Y}sAMT&{0O zDP#{zwzBOci{Fbk%#!}3!vnLyH|ss`yPCSSX$x8SYM{qd^3UpseFfFnDg}uyrYRK4 zL;_aDpz!*QJ&@?gDcEp0ZBRhDk3UeZC^C>?qGt^)ubg0a2}5m-J{@`&nYLGnMWm{coNqzMC~PGd&_vNvr2H>~R09CxT1Jh&v|?YTZ=Nu*Mw! z_Ry?)XfG9JQQ-e{LevSP)v)F$;U5n|^~ZyME!CJ#>=A||4LPXRIPAVZA#f|P}zv2#4DApC{d&MzS5dJuW@s7cTw+trIARpc8)N^df`UVydha* zf#kBxM86L+Tj870?8@gYUe`9Z43B*LC=a4+m;iK!ki2Cm!Mg6`PYN8^Ssb?!0aKv2 ze17%({V!~gj;psfnoOA?ds;4w@g$t-?=ATzb^WE#9Lh;1$g^0(CEZt0a$Ud1E9lyX zbA(K6q(;5C83_2Dp*NT4iJ(l%Pk~$LmLolM#cLvS;aj{y|AusKGXr@va$UMqJ=ye%6@w=gxJBGpz2Sv^Li+!l2Qu# zC92CB#9`kO3go@kZq{j>fBnRn`dOnRN1l;=;I5Y3N*cMHT$wBl*OdmFE?5#Cb4PY4 zt7!Bhj2e4j2EA15D=qJu%BSaMvxrSD9LW2mYevXvp>s?hOR(K;_Yp0-lpLN>1f=aI zy(9Q@ors^U&$2I9$rHaRKF}~avj@R+e!w2C^8KvHP`TIzHbRg6SJ_!zA)SR~ok$`K z3^vI?F5A?@HK6?YdsxB9mV|6&Gg<&-3=Og?F+MB(C$EwjOZ~L27*8C3Y*@GzR=O&B zmT-3uYr`9u1#_5v{j_1(-hy0NJ0-?0yrZOUOI|OgQbuP++* zY27@R%r7OG9XKnZ%b(J zJ4|lJ#yn#F17(H7yIt020s9>tZL%7ywAZ9C(&Q`TZ4YFDIZjksFEMbGEbT4V1%F}+ z?enbXSeP2nx4i|A%FpZi32FiNZ8?5gdV|CdS%SUS%O^SLW(O64%@6WAU-?;EFKhNb!jywDre@YnYNY7&=OzXJd&Ye3w+}yx1&HmW`VYKAKkUdJ> zXgT#zxhD18PQ>_`^|+>(mCVtFRsWtmfPPG=MMb-}i4N}985~z5q4j{uW*SnRS98E_ z5-f(0=wx}>fmp2ld|ypRaB6W}N8D~8{r7NFGjFHuyrin{fkRS1R`1jm2DZ z4$n_x_9CBtUXV8<5b{%a#I9)a1Xj1`IU#iWa^Bcw7?$zxVr2-Q-VN~gFM;i+l;oL~ zC0E?Ms5APisxM;I#zW#g^oaEC+`-7uyH=K5QUy?+>OZUA$Sh@==SQQ@UUO#WWGZ|qyu>wN5z?(dQZXOcZk!)nt5j4Jzwe>xe(v@>hJB0l1Usgo1aUf#GU;oA z>SrKdJ-Dp@Afi~CN=OH=xuuq`+Bbh>n^iMBF#%J3LwSG}EcH5i(hv zhkpOW$&bhvkbqOsNGhKUxHDwG_eZSC%;5Uw{jIL-VnyKvbVIyONDK80Uur+_IcV46 zhm^%r^QtJ!7Vog6%Y71L(0@KW&E^aUU8;~}%Kq3}-WL!Rw=De5Q z8}9GR_E)5iK!)LuHz4AM%dCy& z5q0p*CuNVhK85+$$rd^F8cDtRic0@#%5JuKe)FV0MOnN+p8RU*h0uewFn)2<3W>cESdDe3o3ts#)$3j=q!>JW25 zGn9T=HDMvC#dajXnW)+cf4EEpM)|q)*1r=8Ecul7FG44KIllWQkSC|^QsO&8Y`P71 zoLAt=_nYF7Z~H50c1bPP?mVu@ci=EReGlDqplosv45LlpE=$jM?1CBb7+~Bkz3Re% z@HKHh|8q`;BJ5nH$}xx^M}BmTxqeHOjNo3@(3ZlZJ=|sdkUVfO-0#yXdP^?fOXO|e zfqg}nweHb#PQrIS*K)#2rHUxqniwrJpSg*$NqMLxoPDbEF!pq3AcUdN;UiZWXxQU6 z2x5@dFA!h9a=^5$a55rPFY?iCaLjO3AI#xNGx_#2!6j9G!KLcTWeiW3UK#)A&!s3J zqyyif>rWPbk+6%sedAZkX8t0+LH(7FDs@FMhdj+;V zeRjqzfCe?XvMSRm5u$mi0-a%@R)}}Dulr*wmmhxDQjjz1!=p4lm*)MO+{p^58-pAh zmgAgsvc~5lF?N zCtdCIGeP>?>OD$X?N_7zxU7>|J3cV@_~p^5yXvQ#f&BeTgVri%pF7}Ll1?!~Qd;el zptyG1!-^*qwYv&4Rr&xvdIrlI2_JDr`Xh}z&?LK z(r-TNga2fK0`m^}{nZ?Dx03%2~{!+n32_i|m=`?_Bi|dV+IO_?;cCIPEJg(Ob zVmB_6Y`pz~5vsq7>(aT|sg1F$DJ4+fu&3k4JMJKnHP($nvB$sOjKK~)o!)S_WAi`? zO_0eP8-G`%fr;Kx5a;DvT>gY4k(+zer6?=C-yh5G$ohhJ>VNQcSb08dbtd91wVVhv z*Ul4Px!7P(A>|qdbNxI!yugj4E51jE51l&JD-KV7E?wl)rIZH7?)CN(ePW8C?M$1bfC z=6A>T?Ug>ZXM2rbBAfrZNYXqTKVK`6T&dgt3QzQ>WO#k<%)Hd&;pBZlt8J3f?=h1x z-d*UU(U|4TH=6JmdOJ&Bc%7*-Ri&HvpFJeGIL;tu%Twf{i1Qtq@hSE@)I;C{wV}&> zv5yJ}EzW+`j{~cYidD;#!X4dX+*HFrPmR5*nbD*XAc`XkXQh_w6kN&@!kTwc#uSR@ zWlRD^$nCh%<4o*)U4?RINQR~Zc}NB`N$Ivg_F>26zBj}< zN7Pju4UmPpd;B3ReEylJy@#6+rHINqe9j%w`1}c zXxb)9`WNqkR#~5BZ*;3@e3Lr!NR-b+52>#X8^y^CMX)^uchXr3-2V6V5HOF5_A!+? z^0*xDh={(Z4XhtVAJ?}}4PXznR@0ILtT+RA;|QVthf!%~h^a$Gl&?2MXWD0U-E#Qf zmf3krXIsCc=7sd@hq%!M8<~6qep3|bMG$;<`=qQ|w&4*XNT z!}(;5sC27~MIK3>J({6+2Ze_QKZR4^W)+mu3j2|RSES)E4Lw1#>g@@#TteQ}gq>bt4rKFhL(bP3g8TJ_ z?6b(t+b9tk*2F*C)M5>lP$X9>D(#Tsfoprt4^0iEA855a^OE$baVp8U=aC8)eu`G2 zPhnrt++?0Hwl~%(oBxPXv62q$5@sZ%C)ePWgHB&UAMpsdK4|~o*KeMNl$-h+9Ch3U zD%FSQ!r|M_(l6)6d_RMW7O!NLj$ZUwpg0~p=({}ZD`9|i(;t0zn@T#d7}K{HlMqzw zAvFK4E?fQ4Hpf)0xJYBia<`F#>qj2df%6k_*}Jz`h*2HMLLog4+%MlR!oF1Jb1HwH z(mou0H?&2n(?8f1N&ha!G^CoS_i!TnOTwqtZ)L7z3>R}DGBVBDq$r3UntBE1`DK-P z2kPVisWB@2;lmAbr%v(WdCL=nWlq+{KP`{fQQ1CP^WMGqevaRVgT}EhPdHS+%rjN> zOLzGLrivUJcJF?BoU0F%luVqDVJ4rCV$s(OF70z6Y`3a7-^zd2S~zfO>4uSPDP z80pjVjG_^6DHI)=7wfgF$N~IccyyH-UL(-Q%(6@nS3Ft?R?lMG29$E)>D*%v9L@V$ zto+7X9AvB1O2MT&cdlYUp+Xp+TRQms@*uFLoNBHi^W%Elqu(fbBkh?>Y$+?0#^f}BZZX6kytq%dDqOn5(FNyLLN6twSLL!YFD z`I~l+&?EHH>xL^%8#^lV}81)V&rQu{J+D7%d`>min zQ~G3u^1vWTQUqero~}Z{KnTb2rWuwQ)*GQtBA%Kt2FQ3=wwlI`n zCQBDz>2dH2b|22J?71@#4D!=r>qYkRm{YgU3IXduPUOe(>GzwJkK+Z$$4OXA=Ye3^ z9Y{Tx;FSB)>0ZEJl(Z*m=nKo^k{xc|lRz6+PGzhVr`qomW~d9*E-QzW-<1Oq=P2S} zqM$z(^ivt}Plfu%J;$fs*r66r(0%wHVCQA!i1wdWDyQ1IIqZlOkd9aF&G;4`Nr>M3A+9 z-_~3mE;+@mIaY^J?K`ws;~U@$_e{J-lOy_Hp0sYNH(Q~ZaU$DWm=9GJ9^SM$T88`` zzz=S)d6fz-VALvMSDI%qM9H2|I75|*E;CK46jLZpHxqRa<1!bf2K^33)HIUZ`*u0q zuvQ1Fxgr zO_x=OSMT-ez`Ie$KlG;J+Vi3TTtvsQzLjW@M9aGJNxPlg%oC@$nO9#MX?5%z!j8A7 zkwlAgQfNg4IQdr{6A%k{l#7;y>;%Rsdbdue00?_bK%SC^4l5%Wx5`hNEVS4GBStMg*_U0>lpf7-fu+ zLpiN8A!tYZdD9U1)PdhD@62)f{B7z`^>SjcU+IHw%p;5NlZbWMyVW%+v zcs|E@iI6*Rw#N`0)F&TDT>1!?br5oly^|^Vjq7h(_j@v{XJvW5Z=|&9Q@F?w6s`j# z=p#$BDk}v7Dn55JC(VWlaZ%nACDtQHU^b7V1~%WVPgWY%;f&ut7pk}xDFD#4AK*=@ zJc%BK*mt9@_#N>hX(QM$0D3BTm4=Kts=MQatAbvrQ#n)>G_os0 z?H$ny)CfAyQUPE)GjGcejBmuASg@9yJ|;Qgi%H(i5dzF1T+`5y!HIbBUIrir)(ibX zlnZtDX~^~*nlB+>5Zh|OLz~1d4T^9g=UNuQA>ROM^TBK8iI*ix&M8mb=VV82f{9N% zE!~5Iu&F%8ReDM3m};EL1p9$9BV~jPM%0Z9)v;xx8yT;GjH+Hfed@*U@~q;`PQ=*@ zq1f}<0$Za=mU-oULe;uwUQM}S2i_tp0&blx=sLFe5*Z?a%Rzz0Y+2CfNAr+Dgf%$$ zscvm<-GsgAUMVR^d*jve^=h^8%G5Qp_riapoqx^K=iw{UaOWWt)vm&GI7ZdL z+%>11-W`k^!dli1dJ?>Qo6m1F!4+`RTEt(PKZ;H>|3an4Umw( z$35h;bWakj?qS-NILp-R=A&)nE|i>eI0FJDf|8!DDt$ANz>(``(0}0!Ls*--ZSipK z?h@XVt-1Kn4*f|YanE^duSCBn49loZ*@~sK61!%`IvDO4cVl8ld5%v*#bzTm0@<1@R+^GI4~Vh3SFd;-LrwQ?XpnFZKZv zQuiV~Px-tLU26(ofhK8kC)6Y%KZMjK_Q|2{s8#0H#YO?yLq6?f-m>6!Ie*l= zGxC@#1bdsSYVe?r50NL?dD1foGjzo#0qz#V`WAg0bDrtXv@#~r8R^HrS*}cE3iQ7? zhG|HS^TvJhkav__c<;>t)yp%+b&*R)*a~ZY9=Sv`)3fbBCFRHN-t%KO2M-gpVg{oL z!%{JtR;xv{aff9%EkUri7#+ou?ey^&Zv*U)drUVcrBJZSHgUyZA3!Z-<`_(8&?9*y z?k%Z@-+g-q{qg1`5Wi*x8|Bn&FduVI2WE>_SWnWE<1h3F{tJ& zchGsU8#g!nMW3zk34F9kt18T1$6VOEl0}vf+57Bq@UHebw|?u1j5-u@e9QTR>ba3- z$GATcR{A}1rj(lNz^hj=YKq<37|F#K({i2JQ>9Ld>~R^#ySuzoMXQ`H|D_}ENsLW6_gLNJrfez06HNo|p!EHPa)eIG9Cw$a zH#%ajea^KwZT#z2q{PW8ohY^?T^Jm>+MRCxsfem?p4gs8)ku*ksD27OA%qiVkur>2F_`F180;7gC>_ zA`KU}@Hoz94}#G&xzv;pgqMXPT0?xx?${~6grF_)!m%OndNYY}PXNgGTC46?4MDxw zhHv)|&M-BQ&DS0~_?9GPY0j5j=Uj3u_|YNfg%V_?uwnnm#dMm?;zTFlf3Eg;>`_Bh z@lGq(dVZDg3&vYYzKFi^+6-mv@xcsC>mjMc+C4E|PmLs^S}bLsJs(hhnaA}j3MZl& z(3JoLv5Z{*9*L9m4at$2V}nD*{c#yHu2^MM6EHB%U#Vq8#ePNaLOh9y2c8F~iksS9 zqWzp+FOkBGd?Kdg^i{6;`G%&)Mz_n=>iT+vKrIaLgG_e57&#ZU-kC@oJF>m}cAcO{ zJxI2ReAHdw#sJ4Zg2{hhD>!i3fr4LjJN&=VO61X4j441Z@=%~7#u7&va|+Kx zxHCe#Cbh8IfmM^R$e3=U>I?43eth+Kms)*lj*ojeT_LIbLPD zyu-IkcOu3Dly+n+-t852l0HXD6VL3(*mImuN+5_8{?EnGQ^Dy@_^Il9oXFSixLB$8 zEn)2PxsE()DPY}(MlCR;H^55HY9)Kj%uVEpt}0bl?t?(IDJmSkB|~k6OHMwx8i;Aa z=Jd9M$F@wj9xJ!2GWPZEEQpPG!=QkM*}2D!$N@_7lRtxHGTIYd6wm1(Gey@H&?1vT ziwu<5j>eq)FSkae;*Rs~VGBGQUM&`=YyO;M56GRcpfd+pCgi!Z58El{fDNeSftMuf zQIf~KE|mLVf%_?$0tbRq#^{uS`T|MfKpdXYHB;A1tY}CW|I8M{fEq(^F+#?_tB22f zMbU3m*Y>me>%aBOHD(aD^eW-skv@42REK;ufscO5hO$qgg46SJmCq+E=5A)( z;2)(3noJlEoFF~xJ2>taoRQJY`cRfTbm#VYtA$B0&PRoVxuw%g&=R_ZrQ zS_+VBLIEbGq0aqe(*q0h1I*|Lnne7?HRfPU?H0SbWmfks)sWgi)_>j$rf2wpN)Ldd zHEs#C%x3Ni=ZnNdO=;eRQApp;?z`Eu>vf+6dHzD^FK z4Hh@8lRPsK@EvGmD^B6e{qYwy8OJ*954#|K7)qK9&+jri>S0u{B`SDV< z%2IXn`E|`3asdS(_ILmBel47IkIRYiH9hWum!5JA4-2jumi5FO5!kbxAFYrd7Qzh& zz?F2wKO)N?#cquY)4M@8_F(v@b3%;fz#YgJ$L`KX_qq1O!W>5?A+gb#=3?;vY7RSq zYUkjXA+-bpHdg-W?tn+GAE!w5=lVs@944I*^24lgrIftn`6Nl z)cVK6Kyd>;Srp(o#~s2*`~c_R@K4-qds=;^GrDzW^G&IXK%Ll`NInBp9Enu<>U=;< zfnu*5RVu(V+5cA^9Y`9}`m=rivlA<4#mKu|Qf7^6aU!3hzEVu*pXY+FE(qvIB9(DoZYpLijNup1*k<-%d5P3i| zQ(AXx!#RkVBW>4uU>n`j`LasQjTM^La^CWoZrm3BB1(I@?o5rO&+QQl*vS2PfU5j0 zgZ3Obib|qnM5}2K#78`N%lAtq5!$RM`0icCo&MW-fI#|m&b#m1Jco{&b#>!wAt59r z?Q;j3nYoX5Pvsss&Q{{Ow8H9JLC=+$jBVeKCi@5}q>%5OU9cimH2I`=T8-G#g52K; zu%rapURPz_lV<1I&cFA(wvibC$n&&&@~IK$yv` zE7>jyOlPu|YHp|uTCaQIsp7LAG=|p9#TWdt4(g61 zUvxz%Iv|+plIb@r23(r&4-^EzWiI#jIZ5!8$WTPM+mQJOwaJ_c6()X*w~ zgeDIU&sAC8xZ=Dd5ysB1ad;egvC>4sUR^9tWYELyiwv#~Ql&A||0M@91%< zn@Ie3z^hoT6is?A_@C~AQoK$;K}x3wPu@1`*JoRMtwK3? zZ9!ayo3KjjL?A|$r~4#~8h8STsRf5b?|u$h7BVJENSM6a5AugZ$>1)}_Zx)vS59rO z%##QdTpa%PZGR)Pd|$P7WJR@F|NFzA)BLdeR4Y-&R;0A-qodV%+IIUQL)v$TsJQ?r zxZ$Q$7$v9F0h8AZdm3`X(oy4~I=!f0-mOre;KSS8(&<|Mp{2#y!YPBK)gAw7DETv&6MJc|9>@$vNB7OSrLzV5>)SKw3@rFM4PQ2Vsm^b-T9 z?k6TB@|1nsG?T7{$(Vcd23%l?4gz{VNpnTG_3q6V&%hPt&NGkCGXZrXmzaM7dgMUS zUGL8=Gh@S%c&jeS8S~R3^q1v~`d+FfKsD(J5=ek5j^S6v`ud}$^TfLmJB=%ffikN8 zOghady*O(qPh>|%XU}<(&C?-D8*gK~NR`?+qu7yIJh*8mZ00*_;eJ_j?7AB&g(a0c zeEZ%2p{y`(d6wXgN2M>*j+sKHt<0hlVE5~0J#_XcE@-(M#c_HSP4rNRs!S$BNxXF&pu8)Wa8NEy zCKEvg);bRIo!zKAL23Sl13+C3F5x7BpG7h`s$wp=bv(#y$zqi5FL^h?l}WW$ISRs& zxS*e8`J9d?Fd&nJ0xu@10ya~KR>8$>l5V#2-3hRXmV}Gd+KTS`xOaN)Gx(R;5|T z>)VO-YL>^$;(ld9%!ErE&0{CbbJl0+w5bgNmIv?dH4EhN^dDZ2+9J%2*d@o8)a1srikUaKNW+sUBip zlF1<0T*mDd(G)0&QS{7rRd5^A8wEhgs4xy9D9R_?B<0+xhUunJNcUG?Cw=C_4JsKO z*P-bs&}q@`NIKsUAWBvsj_+JX(vsgR6MZiB4Q{@}szUBXY)f_82B_o4ZR(y`-dCdF znwR%(7n8=?l59S^jXwDqng_o#1^7LW$>fJ!U?i!YDl*JM*L3EhjEft0Y;eZ9*_Tw0 ze(eStxb(XiKFe1O&?h5-1zn#+8~~LSjD4a-2G>z*nV>^WP}=a`=Z3E!4_Sgw9uMe) z!HC?uL$KttJUW>D?B%0qtYN(cR&>)-i^@rgWxszGcDSY@s;4M z6=y}nxB$Y=>n}_PXCULD`V})U81%Yy0)MnLuLVIPp9d>kA)()!Q>9k2ur#b9Sr-a7 z^SyJ*ZS2Jx6<<@I$$1|~)@l@Si1HCCU0=uM>AGkRyFNJL1Zb!nz)6M$sZ3C!;z?2b zK=62AA5cu%xixOfy^=rlSc#j=W^R}o^!LG>H$$qQ+G{*^=-ikbcKMdNN`b*>7wg^y zym-)s8E;iok9iFGWnD#z=DSHg<3)ya@yuLso_6U3=u#U*l&2qSM#jjetm6%UN}jXc zZ1-62m*sQpN=@E5CDc8Sx7T2tK315>vprzAQ#|Hkyu`+vgzXs_+o`YF9iDq(^hu(M zgstp<)miG=n+r$qna58AR=3yo0Ihxi>h%>QcYxpPfZJ4xL)mm~gKc{bSS6j8KR_Uf z`gBt#<8rujN@SNbs_-JKxTA)?r{vUIZM#djoK$VHhvc0P+dGBfNVg9C8Q@v7RPW-P zA$jke1YlmI>RSf?$ zSbsrIj4lHrCUUgMTn^QIzVRgJAYa?($n7%1(za}ng5so%F zEsK%;f^&dBVuSnh%XKSNJQe$)s|C@?d{R0k?L4Quc^M@>JGSKN@CLnEFE7{e*Ddz( z60P1bdw<<$!Cy#?L^i^>R#HqJm+*wiTu&dXX9gRJ$toBsh`B#K^*bVw%<8bnB@(^7 zvu|m9esmPDKvdGKS-;JomS}dlbOIw$ZKQL;fK*lrg0fA+I!yczqbL4qZts) zC^pLOY&$~D1gl`5$n^jr*ij#?flIA-H&4Xd&et}pbUU?a$jZESl#ODnzwn1*wG3B@ ztX6yaP8X7kHmWPngf&GH+}UcY|GcJk?$eg!d81URAaTjEdq>#Ubq()5AI8q`<2jfK z9!IZSS%CD>VKau~c#;75n@yG4L8jb`E|87(_9S$a3`H8-sY(c;OO+x*MsBJf!Gr&B zDN*^lytr`$b}qEyUz#}u4^3re7h$4I;Oz0hiec{xb>+DPPPgK_#V3yo{jTmdFewmZ zE!0PGx)FZdBR)}Lo$4p7S;!I8#;0Nb*0-rc0f|}OcND(#ZL@;0GI<{_C)Bq2)7fFn z`z$wr^>F4+7Oi$_UVgSv=LVQaFc|a))gRXwT_k7b!fV)kyxOkFs82Tf%cbfl2cu5xW;B?Zg#_qIWQhS~)WZY8 z*@{R?{t6g+YVAvx>t=Skk!;Ayik;&f$zLf3fgt7xExg~{P`OO0+<|0=DgEa;{8r9Z zE3!Iu@~hWwDP}3s2hx_Oa{J%v@v0Hi36g+ilrJ@5d4mEDg|HVW+^UXhIiL-`lEt6} z)x4F~%fR@&^T`fnmD(kxkVekA`-yNIAmyENAm0#O&EkDi7+fxpfl=y;#3`&J9m`Z_ zi^LTY)2%06`MKRgtknpsxC}_%^fdYRWbm1PrYrEL2~g-`0Dj?y3jWPXBWGqR=F1&_ zw~4=ECcqdr1El`vJke3!Pg;}VDRtXgTdHuVxBsp#WL*oahn(AIHX57f6nUm@QQ z(cxy}&>fdFsRQ2?+0X__YVqax!R$(Z zFm2f1{1Co$!xNyB3a%$$bMOD-rX_~X zv)}}?;^05120ayGiwAWCZbu9Y2BXtDDk-x2I_fm_lVlYhJYwzIX&lP2u8^znvA+WN zTj%cIFB9BCOn%_hed}E7IAD5?KTX3e-mSO|gb?gK*U)~!*D@o(1)^1oS$3Hsp{(T> z-0e1AL~QWxosIoxOSu+wGxod%R;W6TZ5%h#iMLTaDv+FJw$4lW`ry=?$ll!k-TY6n!#UN%H4nrQdT$f> zlydhP2V9tirXMY>I3#P)MxpJ9%nX+v_snhl<2suBpVRS#OXc%!lzxlh-thHzw$S(2V#wh?vH~!>WnRIKd_Qqh!(TGgIR*Kz@2)fHc1kC>mpjNGj2r2^7j?UhqFR*VzlGX4 zhvn=wEwipUE0JDj$-@>P%rf|*7;lxve?1*YBuhxRU}pzmTCZ$ZY_w_F*PAKq5oA3( zxrv8=@~g>lfo5vb?{BC~jRu}8@8bOCc7|WP@22z1Ufd@)4s}wr53CbTp#_DpZe)LW zLUM18MpkB9o_d$7p#(9YBdHSRjQgnB7(uy z_Pr7!#q8yk*?D0c_Q?$@k>eeIIkLoE0bjC)nuG-h0yF2CCXWi2e+JZ@K4!z*DujD? zWju4MhezaYdP~T0b9WtD+65+h6%7q{c=sxneHosu73TMEa~>VQ4qxjK)(;>#3S#AD zyBq*?gKQ`XCVBVW^agt3O3!VbCG|m{p;AV}PPW?&zAl?KXNRMAC!-w*crX&;oKj`^6eSJxZ@<&5=h$%n z+zrfD^~3w5T#vUSMuJl5$D~X!E*u2czlh^QAc{jUCBV(X6(-(U{<&Px1CR;FoM-t%G`zrP#SDtMEv1r1En79%sq z-gGDg`!I4;3qx+b#$rwuLGK$Q%r z&lL!Py%&hYLLu{g03i-bugDk^AUho7saBVNef1cs@Uk3^%X^YioErI;e%xX5$)eyn zx8ez=1c+3B2u0rhJrY%hQ-RXLG<@Z@XPrXti9b^w>>eghGVXd+3%b^!$OuS~Re7rY zowmscj@!nKU#|SR5pXd73cy2!oXTRjiWmfQ{v(TmA9=hJ?7-RJ@-8kX`WfB_XP6M~ zzLU>9@irJp|0UD0iSls(4bp)V)mDMkZUHXL0JFpHth46BOM+)n6*iecM^9R)rlceV zz~_bK&!PNLm8MBmU;lnVzVo-s5@A(qPDZJ;29P;nX@l zM61`ATPJ~{D^Dtb4D7CNxefWRw&JoVeo)z!?u3j^Yzxakm#_y2^yelk*3z)oTq0Z? zC|}9H2mopn#MMNmD$~-T0fg(vxFL)kJ9i4eq%i6RN8OC6i zuT*IEWnDcPd;|5@xhH9@%t)>rtXv4H6di7g36FNbUxYx0ceP0Yz2r=9IoTd z9{XolgpSf5(KcgDdFNW3KNfZoOS2je|H{ii9u-l^$gJeU^TNEEY10D*aV#pMvx5a^ zji?VL!dW(>SoCBiD7r4sQ!wbSzRYo4Blrr01oZdDl`9jalaaXcar8_vt~|Sd**6s+ zThHG+#RipW;IHXq$Eaw>it7#)i$8)Vpf3eTg0Ex@41Ioe5{MJOEzj31)&e7Z`y@ydR zq=0&LR21<*M}N^0h+`0iWI1*)uASrNfDaD%v5Ikb40j`T2iQZm)qS^pG?q>()UfwN z^S5h<%q^!h>YUfEzpI>kH!DX4)lDZ)P*gi>IzJSw0{`GU=?Ot$!F5U#w`X{Kr+HQ{ zAk{huj3?1pd|yelW#|Q)ViZKcNuW@dGjl79aw-^hC5u0zJt|fXaC%-CU6w8D=a_jG zsF)PNgfG^sHweQQFL+k-_ck+Fj^1SQ;B=^Ond0(v=p=QS-{IXEhj;yKo@8=wCxZn( zeo?A8EJp|%27mJRthA>p>kHA+)IW{3r4Ici>G_yRP=&!jf`7FMntdJukol6`rW^LF z>eggNNen&hqUiZ?`TQ_eze2GPYuej9y36KIgIPk#UM&ifCEh;K)#P_WJr?h zG8n2+=82fJpzMd%pu(m3i71}wWpv_xb%F1F7~eLlh!XD9o*bMTZJQwjO&O(y!z1(SaIi@?jF zYhHXwLFT&#ir>HXcx%||&G*0>zBp@jgu0>hDXP6t0}w|6)~FjzkqHjh^=Vt+nPZ&5 zE(d`0#XDjlQge6Q!a2`I<6fy>IfOZ+3THf11YFq*NCxc4>U0!*buAQh^Dz3lxa;?( z0UGez)}ss5mFm4a<(5v|m5&kH%7X@4dEbTN#L1Btnv92K90H_a1OH&CyrhlfSHs6F zDLW`B)6Ukt(iln$1athBIltCDNkr*l@6r!h&b99Qy^kloAWmG;t0idg zWZdGFx!ZuTfsr<^-MPQ*A4&nK1RoJ+UoQgFxYe&wT~lZ?dj zoa*I;oclo}`c|S~XAfWq?O)sQolZNlB4I9E`qeOI+?$K6=8n%H8uDA%<@==Xn zxo(wZ`nP8W;)w&PE!~{}&()|4NTi$ddnz~tV^;!%O*yjdyedyzVc{NQJ8F!5w?msu zV0|Tg;s=7*UvYeu$@@o&`Zc?_*do^I)LwxSb{zL)r*%BLjM|uVg4g)8HIHRxBX4)# zGpJ1aq~(*pG#a-&`YRKzqCNj|KK_`U{a((39z{2HW={#N)A%2)>_5`?n$6CC6=6_p z0OiSI`2YJ${Py9h@n%8`o2oQ!J5%SoRQLb7uwYyfjDaom_ZvgatPcti4MdRQO1>o~ zIYeu-R9uH$k=yl@wsg?5WSdnUHO9%imu6i%3INi46N%Cz-CWTx-1-KMa$gjW8FxgT zZ)Ig>)A`A8J#hng0VTAE;sh_ey!bkcz&}Z=gdqAV|Lv+g!u(pkjJ6>+z)$?gf}R=s z3Yh7y0l@rL>J^wscG6z8o+8shG2=5>6#l8^*@NYsju8280*Mbw5EqWe5j?iBQB_G7 zD5oHuz&22p_yrq9+L!Ber#T|cxJN5|(cPOZ2)J>1P#Z{?HL=pfCTSvInXDBD_RVw? zE8L;-`wUNADE?bvj;y;5ZtP|6ur&?)Vng)wvgZ~U_-7AfHStDz-3$(`lFOJzZcu|T zmA8G%BjDrH?#?~Syzzu0h@RKkQ{#n9KYeCl;2~QqDBHbCf@&--E1kog zn^J%iLRDp*UMFS{nPiZTEi*hUvLK8+~K zh?(SDPCuf>LurhdXY2+S71Tp0&yGw}87MKte;H73`&I~K-f`AdlgH?u(Hk?zDbibB zFz&*cr3B}ArCt@zb>Io_LH<;J;fGHz>#)9>irJ@9ciH;r^ev;+f3(nQfii5pPXSqlu=| zmB5ziTC7B8)X|@(6{-uIXTSUm_%^f9o@Wz+{qrmj#7)h9PWdp_ZgVM}$&}dKJ-~v> zEf`D`vX?kzyME9S%sW-D1Ad60%$}?Bh`E$4`efw7fomQ02m9wx5b>F;*-q)hzd2qn z{Slx)YtIGbrgPKyimzbUho*YNFrZz&Tc}G^Uq}sM*W}IG3IZb$%pwdyA4XaYZ-t&q zq``xaNR%o|M)83-!;y3ez4r4Xw&Bk4g8#K%U=~e&eQ16E)(PP7Ab&k)?wltz$;0lZ za9A~bv$S5K!GXGz-35f)XznwE-}h`|$RmrzFWdDPO*qNpiox26|6DtCJMN-cuMBFB zMD_CfRN4hVn-}%#9ViX(&1h(=VK@(#FGE!d7^F5Z1p)weC|iOHqs{Zi^cZ*Y=$i;1 zZeHhe3GGt6T{gb|eeM9RqRVAt^FcEzg|a2pq9AvB?pUx=T>xxug&w$p;{qu4&z+Tx05WCO}OmvJW%XI1;zkVXlfF@}tU8zoOn@ zo-=+4KMePKMLi3R5z0O?m>60k!97wSU=uhG)toR`JZQ^B`;)dlQz5Vv-?*bb)6=t5 zXMP$}f;5IJ7Ba&7yR=cNr=hk|iojvk0JEFbNSjRgC1;1j^Nq!U%PfV9EfmXJhxjnibjL11~&u*C}X+C0$Wi@5NkID zAE9dmPwxngA9hkye3ssscn(F(;EClqEmHp|$tIy@=BK3a=74^#SA-%U7loj1`rmf8 zcC<-h@&%NlBOxP$Pc4U=-pC1aVn$Sl!0<_$3HKi(fIkaGNE71;B>JoQ=Y89>s`|&C zTX=iwW-SO^fx$A?&ixG&0KaH`YKx^y%RwRpdAE#~J+eTV9tJg(fR0-}iof#rOxs#T z2$aMsFRXzgaCI9L1y#224-s^K-l!vxDWFs9M&3}U!PSga6a$hQ^d6~gj*$7n>W3=B zhFbr2#$CIqKuR3}RZy!xk-oTKo=S+lau{eekHqBy^@^ZJT$@9pH}h*Olqcgge*KbO zG_L1xA5igBy4BbB=9JA`Dp_GoN;(3sd17Pge_ltg9*U_5R4uLsMC$CcCEyC3OZJ2X zeMrpE4w6Rc?eTx~=vdTcHTj0m$~b_G!C*GK*NU}(*?vx6LqNTI$$3ne42ZQMwhDso zJ~W&Y0nga;OAFvL^>EJRX3bA)Qy|QRA_*v+eUE8*cee#V3>1|zEzG_}=G8%sxWsjT zae=}GDD6D1Y0lZ3kwK3IgB1dL2`W?;+HS@BlP7SE5~W#DRvSvDeuqe?6^L8<6j#q7 z`xSVC!RBtng~DeSm+I#;fQFnYP^ISCH4OEfFc|vv6%ekDpR)bVIk|Y}?m{&@vQF{G ziR>$J+`XDH@_&W;%q8yY+S0XV47}E7WaD~|Xn8j1{(j&$>(S&e5EG!%y{R$Chidh<-#L#P`rCOd>fBxv@PWOoS1XHEM0dIHn`3RC6D|7@6pS*wDNP}Mp zt)>~HH43;jBEZOl>?gu9m9QFW>%rS4@_dLg`MJNSwL)~E+PeZiQ8ugTNvak)4DQ^; zfTs{3#Oc-i5E?22_xitxs;;E3H*{o@zA03BZaZ0x*Z2_!|IX_SmITZ}O48mZIjU3L6* z$gJSo)&19&n^Bh4Y7F17>bz!&Gbws$qTFZC&ac6X<+N>!9eiWE`r^nhv z&7(D;i#g5Xdq8FOq{_)(_zk231F!TR09#P83ocEGO4+KN)K@E#4KTq`-`;xlnR2XG z)~9+kch`f=cgPTc#Jo$(5rPJZ&m|bIHC4-FxyzS?n54S@m2AQ8PjLR+-_$Yw5Z)wQ zd;Mv1@TEj$qhs8`LIq$%{uVLp$U{&y%YknUxHDu@bSS^7E?gyReCB1H;;nyDJ%4V6 z3%HVy{dh?xnB^F4I=4f82Vk`$LV;PX1`&*EC7LGzIiNfTKLZ%%tkOr&^;K74wEQ2d z&aD1<-m$n7XpG`w-*7d{lj6`#x)=YQtmZqvD&r%Km1saeTdc}ia7hsM*so` zLuT%VlByfjynOB2g}K6jg{T+0p6so{){9$&M&*A_Ce+s|^iJHN)S_Seg{=G;vY`K&XnVj2`phGBMT`IIVv|P$WPkF1E$iqJAhbQPU>TR1xPJ7}dAb`QHNbIz9KZ3)`25EL zAt8I%B2mECBy-RC+evpvLUEXvIEIDEPeRX&Slas+r#Gp3HEFHtJg~MEC4d_UhESk) z;9tIsqemodVYQZ0=271`z|~HlR}?sK!LdJ08T_te(t85j&+T|92jHOr$eK1$1g%@_ zBzTY~^;W?U_y!k+D^lm>CA48L-5lBJ0lx3UG)BTNJl-^4MV4qgQOoEBUMQO0k9vMF zUh}1W;!u(H3#|izr7)Oa0K13%_GsgcV9s<9$Czz{O1WN5K-tNEn1n#-$v8iYN%_LY z`#MXQ+X85ylM+P|e8Dfow99sScwE;+?U4$rt|++tOlzbh4iQbg z$A29=5SELl7q`KVa|?vQvZfDoz@H*i5QImpThi3wlW{i>mQbYAFqYT))5Wr^#)YXvN8z0g=`*I*X%6yMU zBXCT6_G?$6dP4y+<^d?zqb;CrViQ>hZp(b?m;GmfD1eu@dAM7w+tu|gh&-37x42mW zr+~ZpjV<@Id7q_$n>18^c_b2tAzd|3gan5jwxad)WRj%@5MUlMK+?W~0%L$_Ls?)@XM-A_nvIm# z^B!(`5#1B7sdjartRq=Pzt2f8J`ZUOptwC7ftyQmOUdiG7(JCBrCX54Hm92)_`u&u zjAq*?$G+QH81M)qA0O|Y0Wx8$5sRAxm`U$A#gQ|dzuGgXPKBM$S*Yc_5gdMRb*G8m zv9F)l_JQ7}b>t}b{eXT?av-2sfOVPK{6&uS0Uu)WCIf^YfswZ*Fb_UtsgbJPMza|? z&Mu7RN3d)Oi5zGg>aqN%Zr%JMM!Cuu4f4>1gjD{mVO4|YN z>OCPkDFluU=k{LXF|@sh*r1%5w*jr#lBJPReQV7o0T~lKn#9!pz@)IMjKRTnN75u0*(kUaEbU_S6w{W*00m1b1hlEgu5>cP_Z|ojI!+&H~ z=<8q{j{2#$#;I0dor5qp?B7D_-CXJ0J{W!(yy4Q z42Zo()`UmpABP)l$tMGQZ#WeUf6upewLW=QpiA@q|HW#D4dwn;EpAP>3L0+gW@Q44 zF6`fNlmSY-1Hjm;PwrPy1TE{`iuJIko74}%?C)Nn1jv)+@P`+@sO;{UaC5Z+wcZk*K_+y+^$v&>b9hPw;V%wH8v#XC{1R9Axxg zxeP2$ckS>|@ODn;*5}m*>Orf2v3$5+^mP9t)lOG=B`KX|@G%rHw4RV~yinMg_w&{$ zt_lfm#5PCwxkH(@T~%&27@nZ>>0cX%oRz9{w&|w35y;9}p^RFFwP8Sxsw>uq6hKl| zo!@}YIoUZ6kOAlJ8VpqZguqoK=D)fSnrrH7p}EmUXhh@xTy|@q_LJUu=peI70P^AV7otj|5r)k-1+hEZz|=g)%>;fBye-ovD*^#u2hajM99PuTVHd%^cibCx zn|<8z0))%}Sfg?V-A70Nu^KQ~{ocNXby>G}HLu3*ShZ~6579qz1^}tlc2x9>>?7xH zHkKP@1FUgl*?4tvdM;f&EK!%O`*aLFInQ^jPyY4wo-}o@g4|%5OjzRm)8eViXr^IS zmRBXR2?*7L+ix*%EEtt)VJU^W;JP3R_ zXCv?A>QhdFnqspR;9Ky0kh>`h%pCi#vm^u+*^?bz^>Pn0*IBLXU^-@G;Wer-kAZ!P zfj{`HjOaP{n11C3iPVg*_>d#aGP9|lnn)Tj3es$fRr)Qt`PUc#eX@l=9r%PEV&^7> zUC8h$B;E@Ph2(?i>5Em#tWOT}Efg#S#~x>CbD$DKzW}^a+1#;C~7>v?qdrH4G$I-Gw-hVpnWTC*2lma%vDx!$t0CdKQt!}k`B-gF_5f5ZN?uaeh@z|4--gU9IXGk{wy388?4=17att|v_ z67CuCp%)=lj!FoG14amSR}#%FzKfhUhjpv3R4*#^eZJPx=+d!z;wy#%GRPB&uk*M2 zx%XI=v{8bjHl{WZvvSFXhyJwxXs8g{^zl%#oxV%(^ClxW4Q26W8Rc|i#;aaBXo$rP zDJO=FE$>#FnO9%Zm5WUN5^0`lub0lS6W$^adcvWLp9;JBP%TFIPO&=B{c%qV6s-u2 zcL4O%s!oo;1Nj3PP0)c=ezomX9kS)}Up2P5P0jOc32b5SF5Cw$uX=vCE4%5E^q0qm zc9HhCqH~7o(nyL)RZR>z*fL*8ohNRn&+E9XLQ*>5qGw));4w|T*}dnhTWq(Uz~ATl=`6F4Sl({+MoqoI)U*nKbS@{?SUYN^qsZc z&a`97gm}DJtvBqcYkpSeVx6g6yw{I7hC+jiip#}EhIWtCsnscQADr;SeT|fa3-A>8 zsqVGCJ!epa}u(umPcjb^eRh%LF~s4$Di zu}&6UL+VLR5jM6bE`d)S-D<8!X|kzK3o1_|raAq1SYbqHg;ybK<)M@$R zAq>3p*eEq!7=e|}s@(3IJo~N`uRn)9+cogRx+IwALsU}M7J3TDKJ}B|pVU1G<&_Q6 zh?buNhm)0|Js*JJc=Ri&;MRN}dV`A@`G#y<3gDyi5cxzMDc)cB zH%>|KBpeNhN~pm+bE4@Sm#s~Ebz~>(F}&|d`-_uXOA}rQ$P$|0tJbx)R^^%kU7A|} z!fy_3SZIlV{wa!>_UW0T-6|7?!0|f9hDWs>%K8z%&|T)D!3vLny!^#9J;-RPJ5G?d ztbF_+tXkK!{El35&5w$>J#qrFr;|w0>|zZcKc>}Y$t056yu!nxhQZ3CG;xM)-L?hxm0J`u?#jZsgZqVR)L=wJpDnm;)Wq~6T^=e5vBN?A;`F@k1TZGl%l2* z<#$?`l#R(c+tvPFLA`H%WODontPT(yFi!i;)WePt{^-qlUt-QSvx^M;p2ca1C+ zV>vhe{#42|q6j-QB!o+6-pAzHx+REvS$7h0Yxmtb7ZhSq-J9GdV`-V3wmF~-W7*XM zXNE0TY_TXv-TXRbvsr~}11`bBF?vD2ZCmrrE2Z&P7(BkerYW1Yt$=XG!@Mr+*-$k` zKcbh49&Q%tFxNAP7_pikwF3Jvbsw~*@CO~L*kpzvoJ*V_QHiVxvRD80k_#KzzzC3v zWR%IyIgJ_HYSZwmcRNJJs)^ZvMr_T(o4Vw^)?y5an*GrT*^ZQM)Q6g#&wNaA2L7u9 zGJV_QG=h)I+&PzeTF03)E{%~nA=Eh}mz)y=J|lfT;U5s^<1P%;-7~m2sUJp%O~ya! z0L%O$J%n+NpcKDj8>!ebC}Ydxo*<}M#5|Q1s)H(q%bsHrov>$Z3ZG8-oD%FK!Ym%$ zZo5i_Xkw|1AP39y*hLm@TXwJIDJmR3rlkQD_R6GQ-0jF-hGun4HkwUAtBmkBS<`JU4z@@YYsqlv5_p5VK?0kMkqZ;#|J*j{U=T9H^lVQTv6QE}*lz2lH)D8Crt& zzcH)WW)Iw@0cKIwzraLj7j442Lb{oyShH%#nM{CgK+&>f_!VfQL#lIMi9ycmc$j{ zu6v0rHs{AKll{G8uDIi_0d!9glqaLGkfd<8+Rnm?`cVDP<00#X0USa91gkb$yo26uy+;mcxzn@unEfuE@q%h1bhMdt63&V5hebTsswK zG5+vh5A2ZculwCnkaA(o;gLtfE0Lp@eBBR=rh*v%*k8^0^<&g0Q83Av9&KeAi1rUv zpz6LH!+|`wI0g0VD=)$Hog>g2U4Xk;EEVlG5FL$fPso(wzZzvZ6r+a;x%_w${(y#%Zaf$+(!m!Dh zw&b#&HWDhOqg*(&1$pvuEnA?530Q+E^Ib}H)fo6wc<@gab8q@E#Rg7k*hZOdQ{JXG zGQfKHFD2p5iR`slh<%K(h>hg$8250d%r~T919Ryvc@8Xky`RP$c!%7s&=#n({r+xF165GT{ZC2w5K^6%pS8SLwE!)_dHqbIHLGG- zDtmQDig7no5oRYrwon63ATgaW|EHd6v|iY5wL{fTLIWK}Uh3!zL$yiZfuP&bPGcB& z!Q|=bb9(L6&Smg{!GuUuN#qPvCTWnn)ydK`ICpE=`g3D1I5&rTlr=bzmEfUY>5ouV zN9QL0R1?_ciT%2Y3>o*u|oOU=)%CsH49&GfXJW9ovzA*e8A+L)JWe(t^|t6n+hXuu{9#o&%; z48b|Nb^T}03gPLF3&5NWSCxs_g4S&v`56ZU8kV@xvk9K^_@S8)0xeU zi{&U$x%9PFpgt@L!V;)Qq7mIMoC`~}AaiTHJ@A`~79%sbv~q9|wuS1kvyr|M)!Qap z1b)3XHH~DpTfM=iDyo;^R4jz+`(g`l7CMd8TcZbMY{7ow#ePDyhSYED$fiSMKFe>h ze*CeI)`XuGo5^CMk$F5jQ1Q%!Q^@I<0wBQCVvpkbwNkj+zD1+L1)Yrf!w zq#$QhT|##y(w~a=T@`1l@WS0-|5&PXt)14o%I(+N@9YBSU8`15mY{YnW+(^9^xNGx zu@60JR9(Gs(jj!P;QNzKcWoCr8W5B*!Cf(6}&^5)eErQGJ6G^i7z_DoLQ8dEgR6%&sn*erTm~(OUD9%GT3A4E322| zcxJ1XsEpRO=i>A(5PG(J3)~l8+?pI_{U)F5N5nUdr^Fn6JYWfK$&81*xefj2a-md2LgQh1O6#R z7B5*+zDTd{)x?7=?7vo>eL|^&LO_>MMWU6)tj~{O-09Dukl`s6mfro7=g=)_yM2ZG zeOb>I3B;&E{uK}i}C;PWx#Wk z2kEeJQ<;Zbp9hQb6L`f}A$EfaEFv)~E$0@5e22DPI^HI5jS#H;wZRsSvfF&OpYvM^ zFh8JjVHT0QTVWl6uSxlJWO?zaB$AWelOAVmlM`*FFDP#uGcIXdN*<)UV#pa+wYut? z7{W~HT`Cao2oHfBGIVJQmK+(G<5*?Xw zXIQ`q&LfiX{TZpPJA|re#FDuQ6=$BBazfBVxZ(Ln>&$vWnI^>VT0%+;g5elxwM*L7 zF^p>G9L(}LwP`_RQKZ`AHpvQF%T-~oZeq_Wu=KzbXlNs<#*AryJ#T>6v#jUmiwR~a zG$+^(Ta6j}d!irF{t4_syg);9&a!K5QlmNv-5F66V6?Cziiyw`rWi~t#HJ~*J7r|| zUJ;|rvtbLHpfty8#Ikjxr}Q_7Egrvku;q3_bx;K3?0IX}Orj##g4%@%JvT{tE=!fJ z^Mdx?8bK_s#yWvvmmGOoZc~aWjFunDH*Z3oL?bD;LdQIIfg13N*OiT5tyoQ?iz8ZU zh`8Qyv7KaTPscsls94c>=UL8%Q(dQN5v%8z?A7@Y^_+MSGTl@Q-@+aH1{$7hWfC8@jUq>)OEs7= z0#utJ5*iT0`OSElgw{63rQ`CoY1Yf^_&y93pJG}75Dqsr)ci671XJdV1wUb3B#>YZasYzpXfS^Ec52=$md60Xh^VS6)X~+jW+z_U={TB2&ku^u;K3L zStXTG^-?#f9QOQ;uWYTypGi0_px35K%zK*|zO=>R?n@|hgce}`!LUZyvdM+T)8k$# zYDfH!eMo!$$%|9KN@_ydP*y9qRbU3ZrqJr=+SCv_L~3sbjf4@YfWw{wI)i037+47) z-?e0Q!$Ys2q&n(S*{@F~T0@h?LLNF zqrSNGO{2=@QF`_UC8+rx@632?0X0Kur-L4A(qX=%aTeOukXFJwo8{>0Z8EFC;wPGfDw22+i$IcIh z;xPkJLD;L}Ez<(C0##tLJegpNb!)nHg!q@qg;@|3k=1 z`9O^C?643jhP-Cz(b1u?ZjCGHQK5$z)MM2t5&_x+FcZ|lA6W+o#{DHLGCrzUrrcu1 z+`z>8nxN>74RPn69fqV&^PLU{%kT zUL`i@99#-z#&@fnm)?D|cH3`vwaK7Rjb(#%oVV4Vd`jL1bpLRE3Rf~Xp(ZVUu;=^> zHBeoVwq5!Wuo|k>1roMe9Q)gPoK0gcX>;EG0#XVKzcRMY0MR8?0F^p!deyQ;7~XgS z@TIEFPB$T@AGb3*8FEn}@uxP&VoTeh2H;I>5rJx=T!o=SVwViZ^49@VyxJYkVY`#!H#>XzN(SCU2 zrWE5tX-zNMGizm)EI|vOk}*y_{hdZmd-3qJBB)1bP3-P;|JCtST}(q@_vEU6@i z#Jfm;!M9UNGG%Xg5$t63^xy=yXT^KDCcQqvSwD7~Jt%9cyk!p|2E3cE#E}SW``w%1 z1*bmrve-52D_eCA;kO8&nD$H9#@7|N(6NN)<0Cfh>N2n_PC8VBc-<=qzmte21)rTi zIjNZ`j(0Vzl5t7dv!{eE2C31seYI&M)4Wnhd-t5&xuPQbI7A5SFGe&82B%q@=E=Uu z*vOL2@en#Q474Gr$2k;AE((jx!hiD{7oTadpS>xY{{RNnFfUgXY#&!Z|3I22Bb!MI zXu_C`S_GD~P8r$BCy(A;ux>hu25=t0siQaa49cCr_iF5Ecm_FJF!jUE050QVhfYSE zaiC<=^H=~RZZMeh+mjBPI-^S5uu1AcICP**9zX!_=h@$ws&SIMMnbWc2&`?GU2X>c z2)Ov-WJqkDzzzueMCV#4Qw3VK{Q>0~* zmHV;I49X#XwW`oQAKiKBep%Klaaxxx$L@x%^b<=>l=I{rA{afk3MEunjBAX+Q)>xd zo)kK5p`{Q>*F9t_8!`LoJ!v;Cqg~k*I$9;+>Rn<`B40~1ZLPNtGbf!3zMD(DYZg%j zDRF`Hi+8)T=ECyGQ&Zq7U?f8PXR|ZgV&wPJFYVq69!rTqLsEKZ-hy7Ug%Q#|=4bR{ z&g?N@Np0xqW2pad>S8p5P=`rsdZ7;f2*c9jvMg4%VIVz+)KzK~fp18$KGN0WlxjAx zm0*v>2ZxcX(;l9lT}_^>iCG=D85V(+k{b^`!%BzywNrxGmCfZA3h3Bgj4-E~ld@ZS z#Q0y;tZ*jOfW9(H53CafpNQYA>;yOk+-I{aSXOTec*Vm0g|*rIpTzVdEKVBL9o(bC zyWoY{!V$BDJ<=WKsi#AoG(UXbZn?@Kg077EK)Npekf%@Dl`ghL0Qj=IV48k2xqW)z zYz-`%30wFu<-`h;B#{c8p=fz}6hBm90V^7@?+C{D7|J|u3IQE|IJ6-t7>W}*++bS( zx(rB3seVKu#7;Mx**3~lLwOKvuUpp_G)0R{0#RD1pT|v+zH(n+u8G)7B~lv6c=wKy zPm3d@lPU!_hjNcdQ=8|71^qmd6=h*wmnLeeoQC>H*cuq`gT|E-CYW^lOU)1|tV`S_ z_qj5m?MZlCyF6&mw1)I4ADv>UA8|scu+SVf3H-rBh~Kdf_B?QL^D;jZ6Zs7XX18@Z z@>=%BN&nFr+Y=XSQ{s-Uzf&Fcol3)sSeQd;$v02)D3q zO*j-&(ct6&=M=#8*8t%k0odswr2lGV{C}Hhe(zp?;j08eIU+Cx+ZrxIH(1#8Mv-G8 zPq97p5BTlziY|bz<9gXv3to2DDhA9pF1Jts2@k4lZbH}fjwLQd;J-)iIKgzXGQ8-v zBM;8Qdddj|95@G!sUDOBpgWFr4vVgY-~K^QSRu>e^&;@#UwmUc1C1`vj|_lmo$xR= zvP}$u<=d1W04@8Edcu-7sRiTXnE8$I%qFxoN{;b(PT&C*`0*bQbJm`)#N#mg_&8>M zV+P45T$aD5_3vr@Pm@;ljmtd>zA%FW%zwPk&qt8&&7&nvz}#?&?10c5S~M{F=Nu!n zSOV7hkNyb`!`^BTA9e*rML_~{Lmb3i3PM_l$YWl}OSEjWbou~M7Pxq>qpS}Hh9k&T zc}2y;Xqo5$A&Ef)V-#4x-R-6D_2HE&s&TH~L8j9)4yq+O6wo>I2!8 zaze&r@o0+(;tR_s5fvUf+0BgrZB!b1ZoZ8}D`Bl*?X|Gx%Lx6J4cQ2}4Ja-{k`PqIHn-DA`mH{763@FXZ_7 z%3#l*f9_IHP&l|bvb#wxPaZAW3mbc5quCs^z#Tz2n}7b4fXc{_fyOiBfvPKU=-|&? zVrnax3S_y5ogS+e0R0y1)dAZ$kNywzIBYJ)j<~xg>gEJ_`}jay2=2IxFasXUF?<~D z0+iOHuUri{JXkJFq%2b5ViH;nn!YO zGWtK(*m*uy#-Awf?ChM;Q+9s6a9HoPuW%r3O`#k{jsH6Fr3~ zTfDgJ(4bJo1J2kVA*N>T8#B4HSD=AUu5aiuJ8)$Ed?#u09 z;Icb7ROU>UwXvQc`I}iB{g8kg8u+*YCi*TaQ0Ns?fu>W(Cj0V)oSD4j1ukktM|n9J z{ieucPz$!Uwon!WuX)y|nv&3;GnkFDxEHH$#lI+!0p6C*IQlcij>y*AbKl`1bN!!k%Z_V>5- zC;&B5bd%CCX&?IGEQ1@l4o4Xk>_`QiI|$00$tdn8pWN_*Py%>V;P%2okVjB=Uf4l9 z9S!|{4!eoK{7>n8T;+8OC@X=WIe1{;gm*Y_?4u*; z;h=83iF8WLACeOx10B6CKQJTNbejkTW(>`K0fr5c9OW7W`J;89r)`fv4=mPGhnQbv zcj7sXo%!Y1XR9|Uh?_|VmuMZ_3;{kVpHPS4#3uR8k%M``Xe~%rCM~nq z&KaAKqwuK&&IFb}2f?QPM8M%{5ND zafJ{b4gmogQtE^{kIBI3V|5x zCGaYy>ZT*9hKrs9CqOtXHeb`_?(<%H@Xw>kK_8>Qw{{9XuJn86+*8{7&n%ZPDa|u} z7}?cG^lCNBBVr4*5S6X}^JEKE9V{iD|8}y3qsQR2{QP+tO%;yRWEmXapV+k|-+(h# z*6>e>$fHZEE#6C8q%D8?(}?r!(?-kZ>{t)CEoy7Zo}MYQ2uiVDdU*@4ed?PV+seY+ z^u4$9mo%$6v_JE1Qe48Nd+0=2=KdhMXCuR49ukn*$8PiVIv3df&wV~r;4*(Y67%N#(#0MHIUa0CJ_i#ea3zr1 zeo}mt8(sL|k>U_krqfa3cjwB%GGtu``#Kv7;Lf=wh}fbx|C!i0|7K@S!9C=WY!=)(gNHs}cJ z52AW#dv`Cb?kAiD=CTBgw|n53Bog!H=xd`^6c*+)&G`0icrk`Q(pLp|8tA$Xy^S1xm#%^S>AuQpmCWbg>S(=< zd!Xq*$D1~Jaq>F20w@)Ks*KMgR81oJ31fd6zP?!De&!ho&fh{1i!qEKvF=zT4XjYU zt!o>T-vXARw~?rCtPy8;@?XA7vv=uO15KYBZ#wnl)>mIHXV4{Jf<%~ogtu;>jP?2W z*q>5gx0~c|o6LgnNPur#S?^pJsY0$D(>@oEqBHGZ3CrO&P~fa8cgCB4Vea8!_uUf{ zK2Dsrp3^9ugU4u7tai+p0bi0>&6+eOt=%{GvnVVUF|Yo7Rzsr;@U9{sbNFb}kfj0- zt6d48i_mBvlR<~>K6b1K4So(4Tcq#o4w3I9%dn(dN!$n`4%-s~3$z@84*mQIvA$EB(E>Z}=sz98xn-MYp1m1m z>^(x}MR(BAhcNM=Te-AoI^>rcFKeU4MS54K@Qeqb40jI_@7LRZhVY5CE?V}cNENG` zTu0L=b+3>v`E1@GCGch>DeiYLD}Ibxqf>YEW9@n3u=AoE86Q^#0;H6H2+tTL^7mxf zrs4U7?u6s*1E^(0dPC#lZFZJ-lgQixm3CM~%2CB+t?VT1<}|*&CV8rKt61_%WUVPo zB{Dj9?jC71X7h;M%M122+|yt@+ud;ah+Z`mnF`@Wburs?6+pGE7JpN6mA?uAr{sFAbMvm zZeh(D-7eUE$(za>qk!EXDL|I(ej83)0BFW0;F#?}5 zo$qL!3PctUoj0oRk#h%`VwBHYrBt9rf2N8^+(cQV+9I8f?uWTV6;;S^Jw5^$3~C8b zmFzx$O!$!_n^11IK-C0X66=_fkfXZ@g~aGicW}9{iv1@#kf~P8{<+ygTif(t+*ZL~ z0ZW~&Zpd_ZbokcE^^zs(7px7v~ zfmR+LL7N?gGvhWX%VE@2`#)yXHd0bSd3pH+qJuBaDjJ>b4Lg|<`hRMzd%zcCp{#$5 z53*h88viNg^FKJ1M;^z;nJvj?L(YD61dKIioaX+TA5-)_hXc_PL{-Bm0DG)5jPzt= zJ0L1|rs_O@e!#HnpZ`MdA^C@#hX(8%ot+7zScOmlsS1%R51Gv&x^T!1fakKvd5Amv zf@g|i9jlRhOx)6#<08rg@V2pR$YT|~?a#H2Ro0}P70at`Bcg8fy(t|WC^!B`Og6`8w@FY_-&yoG!A?o_ z@{nwc`me<9oT>!Je8h1v# zeU_~0&aH}I%1PnCFr%XYmU)ic;MwgsO0b1+9;)&yJk&?-^x=ZLSVuiI)ookKM7jpxW^_8*NASrGpxuTOrs>m~ zt58Zlx)VXGFvPA^HbOFcS<#o%BA6oge8WB>FoS5Ucg5Rm-bGHKvuk?TCe zaL_LqkmjjRavW;fn^D#Z+6ZiNo#z#lsuRKY6WKCgh#3D47-)rBInywgwgj_1jeUUf ztvVAV?})aXcP~nd9Z|U=tqw0EpF?t2sRT`Y2ywUhyOFO?p(kS2lDG;=)4Je$*&N!%$H!yN4|Yf;GU2K_gMKxcm3Wa$XkCqei8LZ zRKSgcz(KLeW-It1jNB7%lb$3dQB9572)v?1rf1 zJ}aLjhyg(qZa%{i#NG8&G+Wsp2f<|Di&}t4$P@`k6c4i@{WCfqW(f*7F0NFzserLy z%6&hpf#E*?x_JoQP{}!$5B2woz<-pCmin4AXUYfO?Z_nRwNp4Ab5%u9+ZGAX?6Zy> zJ63HbTf{IxV&me#%Y^fG6&45=6^VnFM~_HsL+{h}7`IHHCGOi#`h<1V!U-PIMm}DDKIyITs3nqe^T6Q>^aMY*vsg{?xwNh9hQjHD zy%17Q6{mNy9hukmsY?fTPZ9GkV$}I7FZ$A5c4^I^eeV;nmFY$2jt+K!$DPG>hQXzV zO?uZgecrZfw0HS4`jAc6dYbzOUa4Y@R+-FqBN%M}N3nL-lipQcUpG_?ghf~$ex)j2 zFm1m4tgP{Q^+oelRz2HKB*8kppr#$s{;cAt*1$M>Dc%`S+iH z`tWiZe@q$1n{%2DZH;8^;R>*Yy-ysSQep&DS{Z@%n_{uB>C8WRdFc$!o7D2Z%T0i2 z90JJRs<|`d;oXj=B)k*b;}QZgL*P~w4faThBPkGA$--L^4L{hy`O5UheQfS*$0GCC z?mZbZXoZq)L&b{_^Z#J;r+8;73`#&Au4%5jY#aMb@(Om5h}pnV4!s|4Gz%}^oRz5CmYbdgKRVl#CVYjEN(#Qr#Dmjv?@@P%*UT5SREy!+7kCcB^ zMK6C9rt2uzds|2Wjrfdsx9KzNK$d9KycI`4M;Q@$cXI}pMA3g7?sPB)8R4Z-n;AnM zh0BUQ4(C9yM#s7SV+Lh}WQXmf@-;aMPSX{h^2tXTK0y%o=*#F8{*59mNM~Sw$$za` zJrI^0Kg8eg{HSYtyRdj0VKG4A!S+3FD%sNFcxAW69pt zZBmcb(A{u<`^U|&J6@s{4bhe}tDq0+_=hF!Z0zOB3jf-t*g*9X^NQ@qg+z?MkUzfz znek~@{-(Up{Aolrc%|Cub5F7lqG#UpH_F|q9Lglc{ahnw70!H$BwfOLg%3enheI#M zTIyolh6N!b)Hl$UQ~(KVK&T5L8g5U#DrGwl-zSJoC)ur*4OZ{?{_$ozsO;2&9e_vy zh+FHCzrXt0l^*%->x~3JgUErsyZ#7E>M*J^H6`<9q5ZUiD3h2{dyrL8oi_2Ed=X`; z&01vy`>VJ#T}4qn_Z#K++;d$CSHk;>YWqSOsK!~{{0)qog{$4#gPe>#JYjLR$Io(2 zMj(pOK%UHBd(;!N%dD1fb(827%d~rRG6U)T-?3rw220?;V9e z|B*+ruT&e7TeB+yy$C*c^&<$0etAWa)GXWHCtz~OU4{77{2x{r$r23f*M#V8FNKI7 zWhU1w5O{-Vk^{ZI3eVAlv(PKV%W_LR~@-?Um=jxJU>Vey{gS*)F+8$bu`0!b|*ETKv z1S2-k`ag1aG=dkiY||ZL-LQ^Fp%%DJJy}JZ{#@v!q!)dn+i)cxp9&2wgdFPfUnuZK zStPAMxj{sWYfJXGKrgWzRr->rG!ZSvi&&!iG5O@B*MH^>eK1VUfho+g6W6aA%Cygq zTAjNZra_qG@aRcz7k#cJIvFF2KEEzn656xr`sH7O4b%f(8yba(YL4pF&1ICEg$=mF zt<+}vGC)5P+>`LkDr(svTKWy$7&%#+`{2}I;2|RKD|7vba8mQ472HGm$;LtP)JSn# zm>J_%DI2XaYE5K8#<2s?k|O_+=C#u{SbzcvjtMXpwG?rDAaeChfaV)20k zc1id;@v)<%d%aE2j#QfMs%w=msJ=wy{4|3Rb4ui zWV;S@w=D9UBji8uDx^=bUc5J16Rzou0g$e0j;qrvD zJLHLaq@H8xI;O=Z6JONPc9%>0DbjOd=u>qz+grbZ;*jh=s?l6R{c)0=?3D;e_ejq1 zgMAPo*Fa4&4uZszv!zS>j%ZW|%UAT=s&JX+!!W6q*smCkixM|WLBl*D%qS8O@&V4o z>lKU3Z1*SvXkRZ~fpZ-U%q0Pi7Ny)J3h1Q^m+QJ#XxyTQF0R?-$93+m!!H+n`3><=Q|SUsT}(NQA=`G zE@j+AoA}AWg==AIf!vzw$;tgG*Tk|K#47Ao@9rb7x_$muRAQT-)CL_` z1x;EDByIs6ern{Q!hJS`2SLtD zrnqd&-4$br#qazTlRrfsvP$g$bhIX%Z~L7QVSG{+6taLp+@vP8VqWXbn__SvMjkm5 z3|t0&UFiWA3$YSf0;pjt`;LxWIxSgSNn!S3fwiQ4*3d(m%Qj?x1&8J0JIE=@-_?{; zsh|^R)ZC&mGa7ECe1eNDmD&_!74=G$LozaY z)pFAdd?}4~pIs4seSjbo8AllX6w^YgfWloZa-iq=9iqBoVi*UP`p(?mRsLU13zO%k z?oq^|r6WM3E^lf zpCeaWwA?&DAZA&GZLpAt8amy1_yDj*P}5eya$I9CP11FRTORb4ZiO{cBG@i?dFG8( z3U`UQ!`3}{nkFGMas4M4<=i8gByA4H*JjbqJFj|<=srm9e7^@d9}pPE|Wropo_Q;f1%Z-e}R}X){)T* zl?&|1Jtgu7WIUvSD)rBiZ<6_Q+(sH_Zz4M--I9D$&ax2#t&UwyUda$*UEilWDJThZ z!Xdsntg^YlW67H9JOIo-|A3Urf?WTJP$nu-`G-vKm7A>X*TDi%SMf<9Q5fVE|1zcc zquSf~cv zTHb&=1MJA<)kW&#!()X93V!6}&+N-scm@E^+^8pzA3IxQwR}7Rwn~)V{{ia?POA9K zL9+r+H*4Hx8_YZGu(hx-;H*W5_hH$P3~$QD@etZrCE_gllK@mX8+`-vvK^ICOgY=67VGI|3!{i~Hu5%!i#IMo@#HLXD%j=E+c6(Sle19Q zyZ^&o`ZWMo^JbaSqQUQP7=Hqi%VcB#6ZYdp?NPzi~J3H zb97-=-GnNVKT^I9S>62;UqM0d^+FucM;%PFPuoqeo8Z~mL5k>tuK$PcB{nWCLw$q& zHjX31*uH)$-V&#qF~4WFi3x#XU`gBMdv<0uwDU>dVGFUpMGY!?!*kU2tczf$mE@6% zTyad|>cxZ=vV`u8Lk2AjY?#f>=v+Fbi%Qhb(e+5m8&=46?m1X}%Oe~!+Z;*ltKM|e ztoBQYy?cxcS;nU=>{QHMq7Gb@+6-bRl=Q(V-V(vj6<)sV1S3!+HFS21=Xw_~Y6JzEU8HF_dhlqujR4WX)hN zZV=8%|yXXh1CGqd#tPR&8YF2~ur|Uy>imsP0rh&gL^;;^3B8_UQ7xio? z!~T}&&3go&MPC#L%W=7mdJcow0U;9aCKI1XCA@lhy<#-2Xg@Z59c0`uqpfb6qGbh} z#8(cl>I#v(1xdor;sf$+F3Ppx5wLIq@{32Z1-)T3LRY3}!Npy2FqzlM?5h5yyB|ax z>L{WT@dXTe2h_W4(p_8x7Q!cgvOWgk{T@W8Kv+)i+}_R3o}LmP&xnlm#Qj6X0THbwh)9X^f(a8i+WoUp z8tlH#2x44yXu@VNwHn9g?RLv7sphePMA z?Lm;Te|2bo9J~0zjN@Fu%>FMx9uyFkOdr+Xzq0aOe^X~P@AqFt2kp4HR;WyO5u`rc zqMuK2myDGvv~2P;%?Rw3i2d!?Tz11njaOd2%f4}7WnJd#!-|VO^YT@uzczeP@nq9| zyRi8pu4Id$2Y2i=WET5u_9&3F*_+-oxKr@VYDDl_2=@_DZKxVhxw8>@_71~w@oRw~ zkDuL=%YxRjDxrs=PJwN65b}H@gX_WVB{nLDtCaGs-qs*?+o2d?&eKcm`9VLVj%>sf zvq_$!BSmYBI4a&jRRYhwCkqhMmqeAoK8g9SFEnrndi>w{kg+D?Fv+f<#dg5nR!6Sh zBK?c40yo(Ax~{SgIEO*I!v=%*fX!s;JLq3II1v%q zw;ZWTDZ&~i)@+hl|IMK~fPjR#C3fog{<>SC&0A4UETwi`;Mm2#hY*7UlIaKJEjow` z$F?VX;!iL_v^$3UNWyN7vHgdX5ApVN5%1&U2QyoGvJwRdiNT>hvGn@8O5QEyRbkhx z))iND9OT~O#Pu{aV?E~E!pyZx8PhqZmV)UjCdH`h+!H37uRFjyP{f<@4uCeS1? z7}|21BLsocdP3m)wRm11be2Fph*;+4f&|{uaaCHmLh80926@J86Hoc z%teEgPA`E4QT&{Rdg2d!oLYPE<|1#Y;v)wmVms}129Gck)UrA4;p3BY+^NNs8 z>uhk1YIpB48GN_W%H~G({2hzs1s-ceL0yIW3U%aUxez_jK~8|XfU;U9N=(G`O0&+qSF<)hy!8QK5QEX5KZ zaIKSc<-5a{-xGrM`-C|9`JFdlZthCFw`G`56e$w_?d&rAyY!jN!55224 zEf;Qb4|wJ>ofT`09v^lM;5h%XeY$M?w|%JF8{1^7fZYiy=PM}(s##iW`P=C(oet@B z=DY?vYexhR6*^=!3^x2UY|{3=x9DfHRacO9rM2RMv-lrb!rL3M)d~7-X*s@v2UDnk9>Qb&JJO@Mc+m= zMz9!sUYLKQQJk-c+fZ!NweA3`b$|A|3W2tk;3~MBqbu6McORokrt5WC!7>M-onhC? z9LuV^h_WO#iLei4eC2sriNRPwVwXdJpd^>|-n}zr)l_ELQ+)KIZ#pDw)=9kFqGFk4 z-B@L=0?OPT_*g}of1!fKdOp3knj@h;QaSVt-!-d7Tr3o|^MXy+_qFgvhxsXcQ~P%w z_U0Qo?0sw3kLkuYHihWf;dqoFwcpt*79X7?6f_VQQPvT~zu?!R5iEHLn8z;;+Irl7 z4Ae%%5+8`Q`iQ@z8muDAUubU&ZYq@O$u@#VsieY_jID}9vcC0o!KHpP6@h5`>Fsv< z*m@oblG;7J!7$VHn`Af-d&OQDOx+);dR3n3%JrDgMT2xBb?g z=b2#=PRIM6bDi(y(2#mzFuOwSqg_KeKD|Os!olc%tm@VJz88_5+0cxu7=D!j&5GHt z*A)TZZ}r}up>1;v@PUNB2D^p=ojt$YqLcIv@}_oCqj#Er^O{5La^kyLbeBTecx`Zt zZy63Dubube{}s6QpR7gyBLFn2 zyye^F9fsb`X<=?22Jsy322)M-zkz=IZ&Sqo$sYo_lMmG(d!t(!f65_#w_XKm^IL~T zbou4123;JDF@y=xhz1qdXy=Ac8bAcm!0*hgVcHZn0X^ z*#B;p)`&l(Qi~4DECZ(@>26y~9wT?eIRVz&JNf$!uI=w*9|HSwiSsS&2O`y@3n#bg zySCVsGrYwUsY$^&jL@Osj&5>G>aYF)f}^rb`-@nrms=Gm4aU>{kl;FqEaIbOOCh8D zGpjSxvc=N>5#~euH%|HUtz9Kv$u|V8u1m82w4CZGK*!67mg#k*H$#Jx{c}5Qzc6rl zsJd=@MTgF0oCIW^*M930e8r8*`{_`}!(e9%oE2^`EBn;BL|+jZ`ETkgw0TFO3qubP z-xXncl3g)iV@cT$n|ejP=0sXGQ33|&5`$T*E|lzyaJ>)eg;Rd5q4!K>{5wsGvQzIt z`w?G&q14y~B6-g-Tm|Vn?Y{B8fDVFkmf&)$H(#$K(m`ndBDRT`ePY;|LVsVRY-gq9 z)_~fNyHu8`v7zAJI9ik$Z7QK9d(E+-gfJ9hzHQR;>*jLvc(>Ge(0cDPK@|8*Me5z} zvK|#UrOKxb8J(x@%iyvi`03drh5sah=yfH0o&5wDk<;h-#E`qiq8thtoA#zsZYntcBeTBS-X1u2TE?V@Gt;4^D?|PLEI(Esc|3 zdwdouIu~K2Dp5<8o^{q!V8MM*?>KxAXIU4N?UF+G{UT|01nMT)dOV2Ddhm2nM@#(U zGE*u=Bkw~;)cr=OhE?nHRFv%`-RdtK;it!!)kl&7g6ld@9>g12gpk_oUP>A$Ms2_w zYocuacB!Pz^_ez0i+@2=Zm&`6R~#WfRLqddn^?q~9i2`{nksV8wfOdScznS7!MY~^Uw``_6pi>dFmL~Dft)BAdf=Esx6exG721EliGs_s zRC;iLVq*u(nnCsTWOc%EkLmoaq<}IpoP#LYdF6|wd>n0qVKv!(*v`~oFP6|X`_rOYG|x8 zU3In!%Psqsr|IwzwH(CNHNac>szYpWZFC-upmM61N2L-Zdo#(e15zb#Sc(A^!|Wn%+5$ky7z*#CPJu zdSd<_H+{P?U{oXz=V;>A48jh$L#N;U;a5<G*NyN$253F_#A3L^ zC>L`nZu9yaVxJL3@@dhxkzCy*JzgrrcR((EblVDon;fT_3 zYm`y@%cBDgTfF8Z;cnLI94h2yvoX-58q}Zk9kF;{UmeZA;2_1(F1sa<+8)zY%;%xc zH;kTqP)GIF0O$1nBc|dNo1z5EclHJju7wkwbrXEg4MO_!mmT%apbZ3&Y}f5_Hghh? zB=M8itk0=RrVJj~ldp-{V?6Bf#V3jLz496U6EJk{6)js{{IWSVplD!Y04!Y5borfQ zk=GpX8L?jFQU-$axaVu5aDuOvh+>fN6$@mT9f5;(`4pYh%15-G&230fdG(U*6*BAsc5pMk;s9TzpSrKRTOax+UMI z7pT*E$xE>YZs*K{Ns6|40QxfFlg*w$BxeBe$oBesxy4te+x}poC^yy zN2;AUFF+Kgx(r<%nBc+lXhv}TAG;jLd02BfEE%F9>LAB{(`~3tuK=pIo7z>8BjFbF zCZhK|1+Z@UCK<;t?}Ok`)gCt4UPedW5;$3DL~;<8a-LZ-7qM4w;F<{5J;t^qs=|(T zBQ5Q!JZA~AN>j)CiW$&-p&$WQwf~%dKT>V zB?H?1>lb*Ys3UKL=~HOB4V3?kRvt3$gM%G~hU?(7pLg0xO@v6@Wrv13+=PeGlWM>0 z051jCi1 zkb8ymo5EBscMX!6Pg_P-nPa_rl86iTVlgE_*X(awim?AZ3`o6!?)ZB){$?u3w5$9r z8~=Z4s-;Yg{^jzI?#J6oH&55DyZ2TpnH}QNI&Yp*B!6SN!o2mC;9-7y*TH9Ay*r|3 zsPd(!=+C!Fs@+cgBt%^?T|2K?+a{E@VczB!vbB_u-P7&H-U|%{X|F{#RH?dzXiql< z*Ka*@seZ)w^mXkeADe~KwL6cm-IBUx*B+b{pjl~zPq#a3U$*O?Ie%}NX@t_>gZ+DE zN2><@X5(@A^|#EjidOzsP~#~6Z*9zS|Ns9pJ^!n{FAr<-TEC5BZI70URgoanqgGKw zkr1d%RVymUpixm|5D}2sh=>G2Z0o_Q1hg_pKvG3OM8Xgm0wht9ph8R;BV&XJDMSoY z2qc8uH_ij}-22?;Ip=rpBY!Eze0%S2@3q(a?zP@s*gxag8!f=3d#+C4OQ{g@Yi#$? z=b|U~_KGTTpYGd-7Y%+*vxc`)=ZZQ$Wd)U&&G*?* z=RS}2SlU+pDI1B?BjhA`EPbNIwkSRSDKXG-8$b91+akxDL_E3hQ$n(zHFozHiFlBJ zLiX!^$_?@&M}O@^A@7bKL3cP!(l;;kFY;>N`z4=pp@-|c0@S1oEjViCLJf@wSG5Qz z?yEclz|j{dWGf(F4{ECju!`{Y+C-8wdTGDn|MVRyhU4Bvguq?1ops~OMG9||c<0Tx zUYwbv`)ADvkQRjutXu}SDx*zGQVnX&($%wHcCZCuHGVD7)|0rIN>k28mF{=7u~Jj{$^ zwgS%>Gp(_=Z}l%cBS_AO7%z| zli+#gVQJ(j{Z(v>?9eX%jb(jm)6CD7G?CZ@vf*&dj`G^oY>Pud_^m$ZM;v-t`^oVq z)GPt3{YWPwZtm8%d5pXr&qhN9SBNZY70jG17^de|=dlIm2Up!>Z)Go$B;p_V(C9>Z zv`W;E8h4L%%zB$7ihDUf2~M}PBHFKRJmN*I9tqCa|DD47`tg2qLK~HB0U7-(Oxnzd zI-`qB#X6HVYxl9sLmSK&d+vtGtM8l=QnsVb?vg?`nw?Q3>n1JcZPYdxdd93|runY= z_m9^j5KvREFKs=md^CLf#lxUW0A(nT=8@8`H!d$q_yeY}@wI0n{n@-k^)$`FOIVB4 z#=nBJby;jwh;J${)hM&P)waR6TiC>6o0Qo_rDu37%`G-%Tl~qGWME$+R<(?nctZ5jkrKRz+(J!6%=f2HIy@n+lBhDgS3dR}A4bkeFDia{E>ePAIGD6>pN+=b936m}N?fh)bXiK{Urzwh z>@jyBn+_txS3(*OvLwnQr8FZ$6e{qj7!LOzHe=X6!8mq?xZCm%B?nHeJiGL5lI}g! zUEEv*vu|!H>r}tf_FeO8iW>g{7;9UsZE9|?@H$t`Q0rN?p*TqF2laVnBLHGg?L|PmZ0+C)8G(;G)5TPpb;gAc43B}wL0VGSy93t z*q?sMBPH1A$|IMQxEDIVzfk+#rIajH&##+)AqskT^oxtn8oPcS`+-wh0k_SL;CT`i zHl};<`pk%$);%NsA}m$XkKeS0($zp{yMr0<4O1!eVOwn|ZE zS1<>|&vv)0sB=m>d0SG{C>t?rZ}dpX5S#n!RLN0{Gwt~vOZyq7*y)qL;g(j@WIDCF zNV_{0{$okhGfqNi^q7QioOC^VHwi~f>iRY0C3=YFd1DO<#|N{mk)V}V*-UTTRw}wQ z;i^%thbTWvh*0mf_Lq6THM%EaaErUQ<|FW=2yd9q)ewH-8Hx z35iU&^0Lfj=tsGJ8|tQNh?;hhTl*5DP{Vd}*qM+-;R)y7#(g)e8u z(^((&Ex`d(_C^q$IHSSaTg^OOSRBAtT*qR{G6OR*Toq=mzRPr7R_OBo^qsW-Rkn%h zH8X}wmn>nf-d6mZxxeEB#g%bcm>I!zEuFI)vl#@f#BaLw_-PTam>qTFfoTE9vT36) z!zVLD%&rdboSK|4`69Lddai)%N6BzCiBHu_BLq7c%8UxALC}+L)7j}`a05(e#QRH12j^hvVF(ugzGMRcu~2iolJ|I6ubkI!#N9 z7~3@Fh$$P{#{LT9wrUY!1_r0d$R?{ZUx}#IHN%g65&Kd^-CJs`au&LF?0_8K*CUgL z&J2HrQg`QmjKJo8-fBFyTi8ZyZf{>2}^ zb2?v&oO^whlcan(57xr9+)Xc?M3 zbK%5j8rGNg?Z9lVk>GPPV3L@jbg%b6BNw8QDME%BhIAe}9rhwwDd+a}6nZShYU_?d z_;LFcdVJcM{IrPvozk1vk3S>M=)M<@YugRO6@m%2f9OK!Ssh*D*2SP`JB`_9UnI>- zgDyq;^aKf5m%_mf^QT0<8ME0>*UGJm>=LTcJaYWyJgobhUMj;CvM+jSa?0d$RT*&o zM*(GSA`wVHAwSG)ZFuW@a$0apoX~4nKETO699GzDt*N*`=TM6laCJP}Tt6V9uOmF$ zI*$~gSlUOW2p70KcgfUt9ZQ0jLR4I0S$~=RI5q7wr%`5d-UrJ**0uPPT}}y*x1ad# z4y~&D*U<5wO#)Uv5cOQty%&vC0lB@xjLdQ2Sc&xOV=geqcQ4(Ht18lN4>JQHtGil+ zE9kH;1#4|5r^BWxl=43@k7% ziMyq(yD^*Eeu8;*6l@^jhGK)wso8cU>5hzz2gB}~X;qHsE(>&-VE|7PnAXNzFlVA! zO`fhax+uQG!I9e1#@7J;{wd|Fg^R?VyR?V*?Jy@v-CFsM42jy{zx#ReVd%1p<8+u4VV& zU482>xAP?BX{TZS{dw{N>k^@@=43HNCf(ts+eK0xpoPBo@Gr3J%wbJ|a+`h^=Ojqg zr=BV6AKdJ?K|^L-01(Ji1TDDYV$tc&f1;5aQIiB>?>NoB4-%Fh;k7Ag^{?>8a*`&Pe~_!06cOLX36t)o z|3QQrQ9N(8juJk|U1zuE4ta&j(?9#3vy0}eIqke{TGRQxeGNd2hP zI_unR5tcghFU=PqHraQdnVlDNxAg9j-+N)d4u#3e;Yy3VOo4szXBFs2Ar2}1$jh!D z$s@|YXjY>35%e$QY%#VL2ON$y*Vj{H%6+ATXxp~x!$_G*0fbMz)xOisU4;BJ@yOFz zkxQREHk$gI(z|@&!nKF!VJ%-J2LWskXEan;3;XZRRoj|#1v~wlmwKNiTQ2!A4k@nK zq^m@O1a3w({)(#_%T>+81wuML@T`zV@T!@>pLn~6W069amiHxuAc-bNfs7U5?GME zD!}E*k9%ik0Kt-t3*jb2M_nq1t}ZAcsk5;3kY_7oJtl`8)#F_r7MZYcY|p2I4qAp; zkb5|&arXpk?vFc^md(@OS{HOtj-N=i@w2pGk*ujRNOK8r8jcvsmn^c`Ip)x z-$6=R#K4#sM>kZj6J^*wj=$6g!>JL`9oXnAA1|D|`R?y6@GH+9wT0Dgo zKX>~C@$WfcHhUG_KyK(#pWD?ziRIMga!l<-@Rq`O0amhMed{?^*amEs+$>7rwYEm8yR2BDhT66bQmW^C07gT|asNATS^u2b+?9D7t2k&3Ni@yBS(0vwyC)#;WlADG75Ly= zZfimk4LiMg(N=_>(q*o?3)RRP|Mew0uSX+a17m3j&Bd#C_$&mkrOw%F*UCX@A8!uH`bL2>anQ;7OMX$?SpTIr-x=fnH{WTV+qe?P zam3sM*dgCoYc9bPTpD2N&<|PS@8NNIpgA@{EvzH26(twQQ;y6>HVGMx%m@ioU@f$%^w7NL)%I_X1W>8+2$J0zYq&>zkLV<<3~H> zVP?E+3b?)G0_o|onqu!ja+d9otxG0SrGcbsS@u)wg_n>VoE4T9g?~ZA5t29pS@?mb zLb8|TzH`(lw-*xZSb*C@cfp|K78we$BR@3*Iyb{F@I z2yE)OmH0I6t7da~61marvN9hZEb~xtz$3IyZ?k8jYD0%(N&fDO?QvFFT5E|ue4Nyb zFNIAD*xmcv)$6&MOs?@AN|2a@&WOoBFkF`%PqxzE=w-2z8Q*EGRkrT5^_NyFTH;AF z)7Ue7tiKcwXBjN7Dwm(jv+coC3j)lWV{*O~42ipW48}ROZN0R=rU*?*Z+3GeI17P# z-+6!Yeai*@V)o1%3nWgpT5$9nvX zrmx@#{C`C`iH4@*=#*nyVriUVyrO*>j@}|2t+{Sj5J1s(mC|UL zDKO+WRk!+i@oe1oHzlupj58LHR;|~ta^P9O)6tZ|$|81O{X|QAQ6kX+qShCM{vGtZ z7VnIgRLZYulhCiHz(+j!c&{tZA&f#$Dry z5bOVrPbLPx0I)_U+obp7=nTKbTXzkE_odl5W`8Yn58f&g@_6mwbCP@|*2J6*whDtK zoq>f?0f2Z5-9{~0of17=W`nI}Jg3HYIxl?^(rP`2C)j2^2W|sspFZBg%M}*)gMY~< zGT#eRhKi#Ilf8XU7G$_;XdzA0a>JJM2V`pTF2WVjm7YL{MYR*NWwyR-Ezb4_?XV43 zfW5w0@d8peVqxc33zanhsQeM(GsTc#L-N4Np3XXZ&Pp=yF0BR(Ic6={ErkHIUe}ul(tDqV62r7>W-Q$^iMw{y@FQW|rbwV|)a^s&!8BEccBU%hq zQOmJM#g*&h4(Tw1oeHIl4U7!fSbz-I6oo|w^ki0aQk|Vd&i(f;PR2;)Lp#6hJeC&% ziA!8w$(Xa@{975wxe=}>jr5!vFmZb-))gj8ua5yx{VoW2U^dmm2k?P#~&|e9MSSW8%(+TOkdA}a0b{%Kip(Hl9QaRq^n{dmOB!T z3Sjq>-JY1UQg18L>@V&sZYm!-eH3qX4U$*V`zPfx{lfL6k}RA3oFSUm>`qg$2!^(8 zC73=>(w)uoZ`pS^p6jgl+t;iJ#Kw4>r}=3UqJ?4{leA6VG_=#D-$Q%2d(V!B;r7h_ zxEVJr;a=8PcLb0HB=sK7Ry~X6UEr<&PljSFhrsw9SnL9pyYb&Qb+BsuKq%O+6HKR! zJ6X>uA6oDu2Q?jh&M>KDgcSFBJspFPTjjI`m6^>s1&Z|C2KFqgIn#Y$uvXtNp(EU+WDmUZS z<$PNKgF)s}UJUMttd^ZK&GsF79{O_j)cH@lMVaMuGcA8czq=JsHg1a5m=A7FKq1P90+gx$s8)1Xpxq)a@ig!BrI($e}K;LaWu1{ z&J80^!a@sPFuP+nrP)_LrMJ-(@itFAgXqo+kroa<==Hi1cgJwDNaJtEMj4{}WHru$ zlZeUQ=Nm5gzd=Y*Nck@R-e9^juOMovwk)N-*~&(-SKK=aT%4iZexk%Q=@eOJ427V8 zfd&wB(SDYfSv5he7~+>CqFF^z_+dvvmMJT!^^^f|#)t9!Yl<;AFOhgn5_72-NU}28 z?Z7w1*fE_ccFI~ZX2wxWn>Jelg|8ib&DjPoK0g2lrem(A;_c#r(R_Czf8-lQ%h|qs zBP$*8`kr|$*}i2>Hc5s!x*Z9!|UiF+O2e*%qUlXWhLICG{#sKT!)OQBb2!Y)!HNVETWWprxhj&H?l{sqtInb#~9aaztDc~M~GZdxly z(~FVRF~M9bJ3CGhvLNl4;Z9c-?9$2he>Hw6t13UM(NHKKA*=tfhnp5HJ!fE*Yn#0( zuRz6xSU6_Fjj zDCYT>&qdyrE7J=5Lb^_m_nttOP)Zbr4tp1u?YhKzyK52DeOhfh4YRze~I|>Tre7GN{u|WX(Y^ynFWL}0T_n;-5Z4| zB3XK(>Z8!g_1riEdegT34ODD+8ttjR65D`S_eS*it;RwMDS)-Ikb6_H*Q!}Re}Qah z8R51{;eBI2OAr@@TisALfoBW(WsgOyAdPe^z6I+_DMt9wDzY!$Ut!ATm?jc? znxBPj!EC}`!{KU*$DB2{{1D=3V*}U0SAQu#=5wW~CXdz6-L4qew_&IGLIHJ-D!DZx zRqi4Z;Ar^+VLXW&Pa^64fy_}6IW;%rKM_z)srHuHcVwAkG*g!>IhQ*=RwD~n$R#S+ z+f~4BiNcePwvzJQA1xqdW9$XXT};Ud&h5W^h_x7@;_G!3!UDdO4q5y^@1vr6KZ?ZQ z1rB>d4A$+2%l}84@QRGkJ>8^NVSJ~^49%CyV3w9!P(I@G$_ba{*f?wbkqIOBDF_ER zIcC^Sm2H%4Fa)m7Q~zW@F?b$d>F?}UjEfX3<^7u!|LJ2# zCitk*X*<@;8%IY$#M>J{2n<^KbgRDkj5kSS<-iT9o+^mVRF{JdSgiu9q3Dk$6cx|y zOGzM4eUpx!jyUqKkS~91?#Wc2uYAFOlx4A=@JylkSrlD+t+-D3Nyjq&+ zwcTZba0x1N`0M#ktv+d(vLwonGr_(0CSUw|z@eV!Vek!p*o)5}es#p~>YaWbjnAV2 z(DZqwygX<6j2oX(wE8nJe%>^pO7JVr_WuVkmUkZ?=z|}lKc_uSza)ICM3{=WGdH1P zDnjJJnDUN`BBCCcEI^zz9GvqWkvsZRS1#gCNkRbP9i2M0bba&;L>oJ7+B@!s(6|_) zgXr_`LcYgapZ-?mHsw^XJ`eGZcp|nQ*8B&eG;wt1JKBaY`sd(2#M9O)!_Q6pJc>)8 z=)`|9gqRz5eT8i+9_|uJ5v!kDue5WpTXs$dKFghEs*DBCXuG2<5PaD>Q{Yl zImp(jxY;rYh;IT*r@x#0cg(8Fo?H@XA@2XjzB;-=;QC7Mqoo;I4tmx=?BWFc%#VAK zA`aQ-)w3v~ecX{JDY=i|aK#LT%>RaavC-v|J~)uiunoiz&G#SQKvbT_NCuz`s+O6H zrubNd>t#Hg>7rDuwVb&B!m`)!Pn4{o3_>-yu{FgMq%A0g=+0WsaLLm7=91fwgXYYHh>0-RTyD*io4d$LtHnB$p9Op7ko^Q1K1 zV9akcGHXk_1tnrZY>8XsBh;u+IMbmLr)+TfIL^4CAXxjw-}SO5b96`c5GFGq5p5uE zu}2}lH6NsJ<<0qwcjpB(PBBK(Rqn3p$oX z_F8JQxN@jxlTYEv1Lr+o1aeTwdUEuk$b!`6HDceb8jLKLqFq4 zzjYmQSWh=-+C{Af$x6e4;kyndR>W;&THelY-EOa0(=S4NvNS}>T&uev6TVLF=!Nbn ze$n0Qfv0h#*7gkuh0tnsi={iV3U67Oa(;+ zaq!B22YBzK;2aQ$1zWcNv~jocDi9^1`)}a;{}FQc&mYWrt%hNKSDdXsy9{(-&wVD5 z2ZE*r_hSEnLm@2C*FyF6I?oALmjTiV3gZfjDL!fKe?h5X^xfMHU=;jF3&^$rEnuBN z#RSX7L|^56n?Bd~INez^$LOs9nrgr4Ceka-+C=FC_qs727Q$&M27~wJFn5|ey>@02 zj@CKqr6U$~3i58@2vr6nRpq7z5?VLN5?i^LVL=lk%bZzYx-$t(Po-#iGr_}OG{Mqp ztM}cV4AMEt%s-^2LA5))qG+xD0Nj$U%RtBew1XR}MD}bzfbqcABh*(~=b6c%b>3X< zK;7we`X(}~Oa1hOT4%P!JFT-?=y1>W36RpwOA`%6@oV<@K3d-)WDlF)Nt z2dM`QvoGp>4Kua+jfS~r_gux-h>w|1KgA=Z80$%ya-?^GbLTmW&Vs{$Z;s`jO+TUv z+i;Dcj*Um8v>M;rAdj=0XGaf6KCADI#-Sh6@Li99cIAJ(OvZYb2N6IT% za>~wEvSgL|*RteuH7&7`mVq`jC&$-nypCO<#>3gQ-q+{$>HGcUFrh5Djl>#yjvft0 zd>pJO*?~ie!4t=6c3!_|&siH3Sb1C9^dkMptgcz=&RPkVyly6CD2m)O53Jj|z?1^y!+Th$L_GV7x;&>76( zpzrpDfO4&Ufe+__l5np1@H79@@%sPG4Xo`4l@b60xc?}dD{OASE^{Yd-P_w-(!d8 z5TPD4{xG}3U)|*@o*xba+YI3V84?uX2FW;M&^8x0-Y6~93G~}vn>j1i-4rSCBt@7} z=UB-I8iZDKR$GB86eE{>pLwjgR2q*wuI-zCJF_Ac{!}dE}Nc#Z&jOCz5Pd0*_+0am2@bI!D1gqf8vY zcBs{cY_;&yK4A|bQtyW_6rG(6Va0fvM0!(BC~0MZ<@~#AK@)9zLK9!y47e)eUo38j zU|cK06;cycaTD_D|9sRuF{`RjrkbCKryy>9knlnv5Mf{)e;4P&FGjYt&VDabhCuXP zgeuu@&+y?BPnSaZ>o<-o_&egxRw&;6#>_DVesL-q3U9y5&B1T9AZ&k^qK03X!Buqc zGH>vU|0xX_Q=EAI$IMgT&HDN2h&_Jl6OE}iEOYLpO!?h^=AR*OEUmVT1g%BL2G?yvy&SOXiBpazgBxb%+3%JAeBrqMsmEa2y7L_ze8JD>hkqXS&lB$RQu_=t zpW*fM#`1Yf{Y)l4)2ROnfeiNac=HoIrB5`i>F75D$PE_xN|L&Li_K4zO$UGZUk{0f A2LJ#7 literal 0 HcmV?d00001 From 4836b4c527d122f3df0af68586246c92dce0bae7 Mon Sep 17 00:00:00 2001 From: Nikita <44447798+NikKarasyov@users.noreply.github.com> Date: Thu, 18 Nov 2021 18:46:52 +0300 Subject: [PATCH 10/13] Revert "Design Initial" --- inputpanel.cpp | 127 ------------------------------------------------- main.cpp | 11 ----- mainform.cpp | 42 ---------------- mainform.h | 38 --------------- toolbar.cpp | 59 ----------------------- toolbar.h | 41 ---------------- unputpanel.h | 56 ---------------------- 7 files changed, 374 deletions(-) delete mode 100644 inputpanel.cpp delete mode 100644 main.cpp delete mode 100644 mainform.cpp delete mode 100644 mainform.h delete mode 100644 toolbar.cpp delete mode 100644 toolbar.h delete mode 100644 unputpanel.h diff --git a/inputpanel.cpp b/inputpanel.cpp deleted file mode 100644 index 234bed3..0000000 --- a/inputpanel.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include "inputpanel.h" - -const int TEN = 109; -const int SQR = 108; -const int SQRT = 107; -const int EXP = 106; -const int LG = 105; -const int LN = 104; -const int COS = 103; -const int SIN = 102; -const int LOG = 101; -const int POW = 100; -const int DIV = 10; -const int MUL = 11; -const int MINUS = 12; -const int PLUS = 13; -const int INVERSE = 15; -const int DOT = 16; -const int EQ = 21; -const int BKSP = 30; -const int CLR = 31; -const int CLR_ALL = 32; -const int GRID_KEYS = 20; -const int X = 110; - -void InputPanel::initVector() { - btnVector.push_back(BtnDescr("lg", LG)); - btnVector.push_back(BtnDescr("7", 7)); - btnVector.push_back(BtnDescr("8", 8)); - btnVector.push_back(BtnDescr("9", 9)); - btnVector.push_back(BtnDescr("/", DIV)); - btnVector.push_back(BtnDescr("^", POW)); - btnVector.push_back(BtnDescr("ln", LN)); - btnVector.push_back(BtnDescr("4", 4)); - btnVector.push_back(BtnDescr("5", 5)); - btnVector.push_back(BtnDescr("6", 6)); - btnVector.push_back(BtnDescr("×", MUL)); - btnVector.push_back(BtnDescr("10^", TEN)); - //btnVector.push_back(BtnDescr("sin", SIN)); - btnVector.push_back(BtnDescr("log", LOG)); - btnVector.push_back(BtnDescr("1", 1)); - btnVector.push_back(BtnDescr("2", 2)); - btnVector.push_back(BtnDescr("3", 3)); - btnVector.push_back(BtnDescr("-", MINUS)); - btnVector.push_back(BtnDescr("√", SQRT)); - //btnVector.push_back(BtnDescr("cos", COS)); - btnVector.push_back(BtnDescr("e^", EXP)); - btnVector.push_back(BtnDescr("0", 0)); - btnVector.push_back(BtnDescr("-/+", INVERSE)); - btnVector.push_back(BtnDescr(".", DOT)); - btnVector.push_back(BtnDescr("+", PLUS)); - btnVector.push_back(BtnDescr("X", X)); - btnVector.push_back(BtnDescr("<-", BKSP)); - btnVector.push_back(BtnDescr("Clear" ,CLR)); - btnVector.push_back(BtnDescr("Clear all", CLR_ALL)); - btnVector.push_back(BtnDescr("GO", EQ)); -} - -void InputPanel::setBtns() { - for (int i = 0; i < btnVector.size(); i++) { - QPushButton *button = new QPushButton(btnVector[i].text); - - button->setMaximumHeight(50); - button->setMinimumHeight(40); - if (i == btnVector.size() - 1) - button->setMinimumHeight(150); - button->setSizePolicy ( QSizePolicy::Expanding, QSizePolicy::Expanding); - - QFont fnt = button->font(); - fnt.setPointSize( fnt.pointSize() + 4); - button->setFont(fnt); - - connect(button, SIGNAL(clicked()), mapper, SLOT(map())); - mapper->setMapping(button, btnVector[i].text); - - if (iaddWidget(button, i / 6, i % 6); - else - if( i < GRID_KEYS + 7) - bccKeysLayout->addWidget(button); - else { - button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - mainKeysLayout->addLayout(gridLayout); - mainKeysLayout->addWidget(button); - } - } -} - -InputPanel::InputPanel() { - //QPushButton *q = ui->pushButton_3; - //q->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding); - //initNum(); - initVector(); - - edit = new QLineEdit(this); - //m_pLineEdit->setReadOnly ( true ); - mapper = new QSignalMapper(this); - gridLayout = new QGridLayout(); - bccKeysLayout = new QHBoxLayout(); - mainKeysLayout = new QHBoxLayout(); - layout = new QVBoxLayout(); - - setBtns(); - - edit->setMinimumSize(200, 50); - QFont font; - font.setFamily(QStringLiteral("Nyala")); - font.setPointSize(18); - font.setBold(true); - font.setItalic(false); - font.setWeight(50); - edit->setFont(font); - - connect(mapper, SIGNAL(mapped(QString)), this, SLOT(clicked(QString))); - layout->addWidget(edit); - layout->addLayout(bccKeysLayout); - layout->addLayout(mainKeysLayout); -} - -InputPanel::~InputPanel() { - delete edit; - delete mapper; - delete gridLayout; - delete bccKeysLayout; - delete mainKeysLayout; - delete layout; -} \ No newline at end of file diff --git a/main.cpp b/main.cpp deleted file mode 100644 index bbfaafd..0000000 --- a/main.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "mainform.h" - -#include - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - MainForm w; - w.showMaximized(); - return a.exec(); -} diff --git a/mainform.cpp b/mainform.cpp deleted file mode 100644 index e8b8684..0000000 --- a/mainform.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "mainform.h" -#include "./ui_mainform.h" - -#include - -MainForm::MainForm(QWidget *parent): QDialog(parent), ui(new Ui::MainForm) -{ - ui->setupUi(this); - - QSignalMapper *signalMapper = new QSignalMapper; - toolBar = new ToolBar(signalMapper); - inputPanel = new InputPanel(); - - QHBoxLayout *mainLayout = new QHBoxLayout; - QVBoxLayout *rightLayout = new QVBoxLayout; - QOpenGLWidget *glWidget = new QOpenGLWidget; - glWidget->setMinimumSize(1000, 500); - glWidget->setMaximumSize(2000, 700); - - rightLayout->addWidget(glWidget); - rightLayout->addLayout(inputPanel->getLayout()); - mainLayout->addLayout(toolBar->getLayout()); - mainLayout->addLayout(rightLayout); - setLayout(mainLayout); - - connect(signalMapper, SIGNAL(mapped(QString)),this, SLOT(stdClicked(QString))); -} - -void MainForm::stdClicked(QString name) { -// QString str = toolBar->edit->text(); -// str.append(name); -// toolBar->edit->setText(str); -} - -MainForm::~MainForm() -{ - //delete signalMapper; - delete toolBar; - delete inputPanel; - - delete ui; -} diff --git a/mainform.h b/mainform.h deleted file mode 100644 index 4008c28..0000000 --- a/mainform.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef MAINFORM_H -#define MAINFORM_H - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE -namespace Ui { class MainForm; } -QT_END_NAMESPACE - - - -class MainForm : public QDialog -{ - Q_OBJECT - -public: - MainForm(QWidget *parent = nullptr); - ~MainForm(); - -private: - Ui::MainForm *ui; - ToolBar* toolBar; - InputPanel* inputPanel; - -private slots: - void stdClicked(QString name); -}; -#endif // MAINFORM_H \ No newline at end of file diff --git a/toolbar.cpp b/toolbar.cpp deleted file mode 100644 index c63d154..0000000 --- a/toolbar.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "toolbar.h" - -ToolBar::ToolBar(QSignalMapper *sMapper) { - mapper = sMapper; - arrButtons = new QPushButton[7]; - //edit = new QLineEdit; - //edit->setMaximumSize(300, 35); - //edit->setMinimumSize(250, 30); - layout = new QVBoxLayout; - vSpacer = new QSpacerItem(5, 600); - -// QFont font; -// font.setFamily(QStringLiteral("Nyala")); -// font.setPointSize(20); -// font.setBold(true); -// font.setItalic(true); -// font.setWeight(50); -// edit->setFont(font); - //layout->addWidget(edit); - customButtons(); - -}; - -void ToolBar::customButtons() { - if (arrButtons) { - - arrButtons[0].setText("Add function"); - arrButtons[6].setText("Close"); - - QFont fnt = arrButtons->font(); - fnt.setPointSize( fnt.pointSize() + 4); - - for (int i = 0; i < buttonsAm; i++) { - arrButtons[i].setMaximumSize(300, 50); - arrButtons[i].setMinimumSize(250, 40); - arrButtons[i].setFont(fnt); - - //QFont font("") - //arrButtons[i].setFont() - - if (i == 5) - layout->addSpacerItem(vSpacer); - layout->addWidget(&(arrButtons[i])); - } - connect(&(arrButtons[0]), SIGNAL(clicked()), mapper, SLOT(map())); - mapper->setMapping(&(arrButtons[0]), arrButtons[0].text()); - - } -} - -QVBoxLayout* ToolBar::getLayout() { - return layout; -} - -ToolBar::~ToolBar() { - delete[] arrButtons; - delete layout; - delete vSpacer; -} diff --git a/toolbar.h b/toolbar.h deleted file mode 100644 index 6b2a3c0..0000000 --- a/toolbar.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef TOOLBAR_H -#define TOOLBAR_H - -#include -#include - -#include -#include -#include - -#include -#include - -class ToolBar: public QWidget { - Q_OBJECT - -private: - int buttonsAm = 7; - QPushButton* arrButtons = nullptr; - - QVBoxLayout* layout = nullptr; - QSpacerItem* vSpacer = nullptr; - QSignalMapper* mapper = nullptr; - void customButtons(); - -public: - ToolBar(QSignalMapper*); - ~ToolBar(); - - QLineEdit* edit = nullptr; -// QLineEdit* getEdit() {return edit;} -// QPushButton* getButtons() { -// return arrButtons; -// } - QVBoxLayout* getLayout(); - -public slots: - -}; - -#endif // TOOLBAR_H \ No newline at end of file diff --git a/unputpanel.h b/unputpanel.h deleted file mode 100644 index c82157f..0000000 --- a/unputpanel.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef INPUTPANEL_H -#define INPUTPANEL_H - -#include -#include - -#include -#include -#include - -#include -#include - -class BtnDescr { -public: - QString text; - int id; - BtnDescr() { id=0; }; - BtnDescr(const QString &str, int i): text(str), id(i) {}; -}; - -class InputPanel: public QWidget -{ - Q_OBJECT -public: - InputPanel(); - ~InputPanel(); - - void initVector(); - void setBtns(); - QVBoxLayout* getLayout() { return layout; }; - - -private: - QVector btnVector; - QLineEdit *edit = nullptr; - QSignalMapper *mapper = nullptr; - QGridLayout *gridLayout = nullptr; - QHBoxLayout *bccKeysLayout = nullptr; - QHBoxLayout *mainKeysLayout = nullptr; - QVBoxLayout *layout = nullptr; - -private slots: - void clicked(QString name) { - //QString sId; - //sId.setNum(name); - QString str = edit->text (); - if( str == "0" ) - str = name; - else - str.append( name ); - edit->setText(str); - } -}; - -#endif // INPUTPANEL_H From 2c59f8a1e6c2f5e85c4a405d76095fb309ca7c42 Mon Sep 17 00:00:00 2001 From: useless XIV Date: Thu, 9 Dec 2021 17:26:24 +0300 Subject: [PATCH 11/13] testing drawer --- .gitignore | 9 +++++++- drawer/2dDecart.cpp | 6 ++++++ drawer/CMakeLists.txt | 43 +++++++++++++++++++++++--------------- drawer/cylinder.h | 9 ++++++++ "drawer/\321\201ylinder.h" | 9 -------- testing_ground.cpp | 0 6 files changed, 49 insertions(+), 27 deletions(-) create mode 100644 drawer/cylinder.h delete mode 100644 "drawer/\321\201ylinder.h" create mode 100644 testing_ground.cpp diff --git a/.gitignore b/.gitignore index d163863..1ce6b0d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ -build/ \ No newline at end of file +build/ +drawer/testing_ground.cpp +drawer/build +drawer/main.cpp +drawer/glfw +drawer/shader_utils.cpp +drawer/shader_utils.h +drawer/main diff --git a/drawer/2dDecart.cpp b/drawer/2dDecart.cpp index e69de29..1fc9a4d 100644 --- a/drawer/2dDecart.cpp +++ b/drawer/2dDecart.cpp @@ -0,0 +1,6 @@ +#include +#include +SecondDimensionDecartDrawer::SecondDimensionDecartDrawer(std::vector> values){ + + +} diff --git a/drawer/CMakeLists.txt b/drawer/CMakeLists.txt index 6ef1a2f..c52a520 100644 --- a/drawer/CMakeLists.txt +++ b/drawer/CMakeLists.txt @@ -1,24 +1,33 @@ -cmake_minimum_required(VERSION 3.16.3) +cmake_minimum_required(VERSION 3.0.0) project(drawer VERSION 0.1.0) -include(FetchContent) -FetchContent_Declare( - googletest - # Specify the commit you depend on and update it regularly. - URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip +include(CTest) +enable_testing() + +SET(SOURCES + 2dDecart.cpp + 3dDecart.cpp + cylinder.cpp + drawer.cpp + polar.cpp + second_dim_drawer.cpp + spherical.cpp + third_dim_drawer.cpp ) -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(LIB_SOURCE_FILES drawer.cpp 2dDecart.cpp 3dDecart.cpp cylinder.cpp polar.cpp second_dim_drawer.cpp spherical.cpp third_dim_drawer.cpp) -add_library(drawer STATIC ${LIB_SOURCE_FILES}) -target_link_libraries(drawer) -enable_testing() -find_package(GTest REQUIRED) -include_directories(${GTEST_INCLUDE_DIRS}) -add_executable(tests tests.cpp LIB_SOURCE_FILES) -target_link_libraries(tests ${GTEST_LIBRARIES} pthread) +SET(HEADERS + 2dDecart.h + 3dDecart.h + cylinder.h + drawer.h + polar.h + second_dim_drawer.h + spherical.h + third_dim_drawer.h +) + +add_library(drawer main.cpp) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) - +include(CPack) diff --git a/drawer/cylinder.h b/drawer/cylinder.h new file mode 100644 index 0000000..aeec799 --- /dev/null +++ b/drawer/cylinder.h @@ -0,0 +1,9 @@ +#include "third_dim_drawer.h" +#pragma once +class CylinderDrawer: ThirdDimensionDrawer{ + private: + double **values; + public: + CylinderDrawer(double **parsed_data); + ~CylinderDrawer(); +}; \ No newline at end of file diff --git "a/drawer/\321\201ylinder.h" "b/drawer/\321\201ylinder.h" deleted file mode 100644 index 7206527..0000000 --- "a/drawer/\321\201ylinder.h" +++ /dev/null @@ -1,9 +0,0 @@ -#include "third_dim_drawer.h" -#pragma once -class СylinderDrawer: ThirdDimensionDrawer{ - private: - double **values; - public: - СylinderDrawer(double **parsed_data); - ~СylinderDrawer(); -}; \ No newline at end of file diff --git a/testing_ground.cpp b/testing_ground.cpp new file mode 100644 index 0000000..e69de29 From 392687b8e8f94c92b01f804bd823d132334d766c Mon Sep 17 00:00:00 2001 From: useless XIV Date: Thu, 9 Dec 2021 17:35:10 +0300 Subject: [PATCH 12/13] adding main.cpp --- .gitignore | 1 - drawer/main.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 drawer/main.cpp diff --git a/.gitignore b/.gitignore index 1ce6b0d..b0992b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ build/ drawer/testing_ground.cpp drawer/build -drawer/main.cpp drawer/glfw drawer/shader_utils.cpp drawer/shader_utils.h diff --git a/drawer/main.cpp b/drawer/main.cpp new file mode 100644 index 0000000..46c8502 --- /dev/null +++ b/drawer/main.cpp @@ -0,0 +1,68 @@ + + +// Demo of vector plot. +// Compile it with: +// g++ -o example-vector example-vector.cc -lboost_iostreams -lboost_system -lboost_filesystem + +#include +#include +#include + +#include "gnuplot-iostream.h" + +int main() { + Gnuplot gp; + // Create a script which can be manually fed into gnuplot later: + // Gnuplot gp(">script.gp"); + // Create script and also feed to gnuplot: + // Gnuplot gp("tee plot.gp | gnuplot -persist"); + // Or choose any of those options at runtime by setting the GNUPLOT_IOSTREAM_CMD + // environment variable. + + // Gnuplot vectors (i.e. arrows) require four columns: (x,y,dx,dy) + std::vector > pts_A; + + // You can also use a separate container for each column, like so: + std::vector pts_B_x; + std::vector pts_B_y; + std::vector pts_B_dx; + std::vector pts_B_dy; + + // You could also use: + // std::vector > + // boost::tuple of four std::vector's + // std::vector of std::tuple (if you have C++11) + // arma::mat (with the Armadillo library) + // blitz::Array, 1> (with the Blitz++ library) + // ... or anything of that sort + + for(double alpha=0; alpha<1; alpha+=1.0/24.0) { + double theta = alpha*2.0*3.14159; + pts_A.push_back(boost::make_tuple( + cos(theta), + sin(theta), + -cos(theta)*0.1, + -sin(theta)*0.1 + )); + + pts_B_x .push_back( cos(theta)*0.8); + pts_B_y .push_back( sin(theta)*0.8); + pts_B_dx.push_back( sin(theta)*0.1); + pts_B_dy.push_back(-cos(theta)*0.1); + } + + // Don't forget to put "\n" at the end of each line! + gp << "set xrange [-2:2]\nset yrange [-2:2]\n"; + // '-' means read from stdin. The send1d() function sends data to gnuplot's stdin. + gp << "plot '-' with vectors title 'pts_A', '-' with vectors title 'pts_B'\n"; + gp.send1d(pts_A); + gp.send1d(boost::make_tuple(pts_B_x, pts_B_y, pts_B_dx, pts_B_dy)); + +#ifdef _WIN32 + // For Windows, prompt for a keystroke before the Gnuplot object goes out of scope so that + // the gnuplot window doesn't get closed. + std::cout << "Press enter to exit." << std::endl; + std::cin.get(); +#endif +} + From 3bf4541c0463aa98d1529db650f1e95ba5719391 Mon Sep 17 00:00:00 2001 From: useless XIV Date: Thu, 9 Dec 2021 19:01:37 +0300 Subject: [PATCH 13/13] added 2dDecart.cpp realization --- drawer/2dDecart.cpp | 27 +++++++++++++++++++++++++-- drawer/2dDecart.h | 8 ++++++-- drawer/drawer.cpp | 0 drawer/main.cpp | 18 +----------------- drawer/second_dim_drawer.h | 3 +-- 5 files changed, 33 insertions(+), 23 deletions(-) delete mode 100644 drawer/drawer.cpp diff --git a/drawer/2dDecart.cpp b/drawer/2dDecart.cpp index 1fc9a4d..776a343 100644 --- a/drawer/2dDecart.cpp +++ b/drawer/2dDecart.cpp @@ -1,6 +1,29 @@ +#include "second_dim_drawer.h" #include -#include -SecondDimensionDecartDrawer::SecondDimensionDecartDrawer(std::vector> values){ +#include +#include "gnuplot-iostream.h" +#include "utility" +#include +SecondDimensionDecartDrawer::SecondDimensionDecartDrawer(auto *f, double &scale, std::pair &size) : size(size), scale(scale){ +} +Gnuplot SecondDimensionDecartDrawer::Drawer(){ + Gnuplot gp; + std::vector > graph; + double left_border = this->size.first * -1 / 2; + double right_border = this->size.first / 2; + double bottom_border = this->size.first * -1 / 2; + double upper_border = this->size.first / 2; + for(size_t i = left_border; i != right_border; i += 0.001){ + if (i * this->scale > upper_border || i * this->scale < bottom_border) continue; + graph.push_back(boost::make_tuple( + i * this->scale, + f(i) * this->scale + )); + } + gp << "set xrange[" + std::string((-1) * this->size.first / 2 * scale) + ":" + std::string(* this->size.first / 2) + "]\nset yrange [" + std::string((-1) * this->size.second / 2 * scale) + ":" + std::string(* this->size.second / 2) + "\n"; + return gp(graph); } + + diff --git a/drawer/2dDecart.h b/drawer/2dDecart.h index 7b4e20a..6da6464 100644 --- a/drawer/2dDecart.h +++ b/drawer/2dDecart.h @@ -1,9 +1,13 @@ #include "second_dim_drawer.h" +#include "gnuplot-iostream.h" + #pragma once class SecondDimensionDecartDrawer: SecondDimensionDrawer{ private: - double **values; + double &scale; + std::pair &size; public: - SecondDimensionDecartDrawer(double **parsed_data); + SecondDimensionDecartDrawer(auto *f, double &scale, std::pair &size); + Gnuplot Drawer(); ~SecondDimensionDecartDrawer(); }; \ No newline at end of file diff --git a/drawer/drawer.cpp b/drawer/drawer.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/drawer/main.cpp b/drawer/main.cpp index 46c8502..344eef7 100644 --- a/drawer/main.cpp +++ b/drawer/main.cpp @@ -12,30 +12,14 @@ int main() { Gnuplot gp; - // Create a script which can be manually fed into gnuplot later: - // Gnuplot gp(">script.gp"); - // Create script and also feed to gnuplot: - // Gnuplot gp("tee plot.gp | gnuplot -persist"); - // Or choose any of those options at runtime by setting the GNUPLOT_IOSTREAM_CMD - // environment variable. - // Gnuplot vectors (i.e. arrows) require four columns: (x,y,dx,dy) std::vector > pts_A; - // You can also use a separate container for each column, like so: std::vector pts_B_x; std::vector pts_B_y; std::vector pts_B_dx; std::vector pts_B_dy; - - // You could also use: - // std::vector > - // boost::tuple of four std::vector's - // std::vector of std::tuple (if you have C++11) - // arma::mat (with the Armadillo library) - // blitz::Array, 1> (with the Blitz++ library) - // ... or anything of that sort - + for(double alpha=0; alpha<1; alpha+=1.0/24.0) { double theta = alpha*2.0*3.14159; pts_A.push_back(boost::make_tuple( diff --git a/drawer/second_dim_drawer.h b/drawer/second_dim_drawer.h index 36c137d..d52aa1e 100644 --- a/drawer/second_dim_drawer.h +++ b/drawer/second_dim_drawer.h @@ -1,8 +1,7 @@ #include "drawer.h" #pragma once class SecondDimensionDrawer: Drawer{ - private: - double **values; + protected: public: virtual SecondDimensionDrawer(double **parsed_data); virtual ~SecondDimensionDrawer();