From 1ba78992a62299d3c758a25e0d2d88bdba80ebff Mon Sep 17 00:00:00 2001 From: Gerd Date: Mon, 17 Aug 2026 16:10:11 +0200 Subject: [PATCH] =?UTF-8?q?Initial=20Commit=20f=C3=BCr=20das=20Grundger?= =?UTF-8?q?=C3=BCst=20der=20Anwendung,=20bestehend=20aus=20der=20Dev-Conta?= =?UTF-8?q?iner=20Konfiguration,=20der=20Docker=20und=20docker-Compose=20D?= =?UTF-8?q?efinitionen=20sowie=20der=20Verzeichnisse=20App=5FServer=20f?= =?UTF-8?q?=C3=BCr=20die=20Backend-Programme=20sowie=20Client=20f=C3=BCr?= =?UTF-8?q?=20die=20browserseitigen=20GUI-Komponenten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .devcontainer/devcontainer.json | 31 + .env | 20 + .gitignore | 6 + .vscode/tasks.json | 103 ++ App_Server/.dockerignore | 4 + App_Server/Dockerfile | 59 + App_Server/root/approot.py | 45 + App_Server/root/auth/model/__init__.py | 258 ++++ App_Server/root/auth/model/applications.py | 73 + App_Server/root/auth/model/checkdb.py | 86 ++ App_Server/root/auth/model/errors.py | 38 + App_Server/root/auth/model/roles.py | 50 + App_Server/root/auth/model/users.py | 179 +++ App_Server/root/auth/routes.py | 235 +++ App_Server/root/config.ini | 7 + App_Server/root/db.py | 10 + App_Server/root/debug | 2 + App_Server/root/requirements.txt | 6 + App_Server/root/routes/general.py | 33 + App_Server/root/runserver.py | 20 + App_Server/root/settings.py | 26 + App_Server/root/templates/index.html | 54 + App_Server/scripts/init.sh | 16 + App_Server/scripts/inittypescriptdev.sh | 25 + Client/Components/auth/applicationpage.ts | 616 ++++++++ Client/Components/auth/appmanagementpage.ts | 40 + Client/Components/auth/authmessages.ts | 76 + Client/Components/auth/login.ts | 117 ++ Client/Components/auth/models/applications.ts | 18 + Client/Components/auth/models/roles.ts | 8 + Client/Components/auth/models/users.ts | 24 + Client/Components/auth/userpage.ts | 364 +++++ Client/Components/header.ts | 74 + Client/Components/kunde.ts | 18 + Client/Components/mainlayout.ts | 50 + Client/Components/projekt.ts | 18 + Client/Components/widgets/Modal.ts | 71 + Client/Components/widgets/Treetable_V2.ts | 231 +++ Client/Components/widgets/base.ts | 7 + Client/Components/widgets/form.ts | 112 ++ Client/Components/widgets/inputs.ts | 127 ++ Client/Components/widgets/tab_view.ts | 39 + Client/index.ts | 149 ++ Client/inireader.mjs | 42 + Client/package-lock.json | 1299 +++++++++++++++++ Client/package.json | 13 + Client/rollup.config.mjs | 42 + Client/tsconfig.json | 10 + ...npassungen an DevEnvCreator-Strukturen.bak | Bin 0 -> 2424 bytes ...npassungen an DevEnvCreator-Strukturen.cts | Bin 0 -> 2549 bytes NGINX_Server/Dockerfile | 4 + NGINX_Server/certs/wildcard.mylocal.crt | 22 + NGINX_Server/certs/wildcard.mylocal.key | 28 + .../configtemplates/kbp_crm.conf.template | 38 + NGINX_Server/html/static/Google_Symbols.woff2 | Bin 0 -> 247404 bytes NGINX_Server/html/static/KBplus-Logo.png | Bin 0 -> 79383 bytes NGINX_Server/html/static/app-theme.css | 22 + NGINX_Server/html/static/symbols.css | 23 + NGINX_Server/html/static/w3.css | 235 +++ docker-compose.base.yaml | 32 + docker-compose.dev.yaml | 19 + docker-compose.prod.yaml | 10 + docker-compose.save.yaml | 26 + 63 files changed, 5410 insertions(+) create mode 100644 .devcontainer/devcontainer.json create mode 100644 .env create mode 100644 .gitignore create mode 100644 .vscode/tasks.json create mode 100644 App_Server/.dockerignore create mode 100644 App_Server/Dockerfile create mode 100644 App_Server/root/approot.py create mode 100644 App_Server/root/auth/model/__init__.py create mode 100644 App_Server/root/auth/model/applications.py create mode 100644 App_Server/root/auth/model/checkdb.py create mode 100644 App_Server/root/auth/model/errors.py create mode 100644 App_Server/root/auth/model/roles.py create mode 100644 App_Server/root/auth/model/users.py create mode 100644 App_Server/root/auth/routes.py create mode 100644 App_Server/root/config.ini create mode 100644 App_Server/root/db.py create mode 100644 App_Server/root/debug create mode 100644 App_Server/root/requirements.txt create mode 100644 App_Server/root/routes/general.py create mode 100644 App_Server/root/runserver.py create mode 100644 App_Server/root/settings.py create mode 100644 App_Server/root/templates/index.html create mode 100644 App_Server/scripts/init.sh create mode 100644 App_Server/scripts/inittypescriptdev.sh create mode 100644 Client/Components/auth/applicationpage.ts create mode 100644 Client/Components/auth/appmanagementpage.ts create mode 100644 Client/Components/auth/authmessages.ts create mode 100644 Client/Components/auth/login.ts create mode 100644 Client/Components/auth/models/applications.ts create mode 100644 Client/Components/auth/models/roles.ts create mode 100644 Client/Components/auth/models/users.ts create mode 100644 Client/Components/auth/userpage.ts create mode 100644 Client/Components/header.ts create mode 100644 Client/Components/kunde.ts create mode 100644 Client/Components/mainlayout.ts create mode 100644 Client/Components/projekt.ts create mode 100644 Client/Components/widgets/Modal.ts create mode 100644 Client/Components/widgets/Treetable_V2.ts create mode 100644 Client/Components/widgets/base.ts create mode 100644 Client/Components/widgets/form.ts create mode 100644 Client/Components/widgets/inputs.ts create mode 100644 Client/Components/widgets/tab_view.ts create mode 100644 Client/index.ts create mode 100644 Client/inireader.mjs create mode 100644 Client/package-lock.json create mode 100644 Client/package.json create mode 100644 Client/rollup.config.mjs create mode 100644 Client/tsconfig.json create mode 100644 Dokumentationen/Anpassungen an DevEnvCreator-Strukturen.bak create mode 100644 Dokumentationen/Anpassungen an DevEnvCreator-Strukturen.cts create mode 100644 NGINX_Server/Dockerfile create mode 100644 NGINX_Server/certs/wildcard.mylocal.crt create mode 100644 NGINX_Server/certs/wildcard.mylocal.key create mode 100644 NGINX_Server/configtemplates/kbp_crm.conf.template create mode 100644 NGINX_Server/html/static/Google_Symbols.woff2 create mode 100644 NGINX_Server/html/static/KBplus-Logo.png create mode 100644 NGINX_Server/html/static/app-theme.css create mode 100644 NGINX_Server/html/static/symbols.css create mode 100644 NGINX_Server/html/static/w3.css create mode 100644 docker-compose.base.yaml create mode 100644 docker-compose.dev.yaml create mode 100644 docker-compose.prod.yaml create mode 100644 docker-compose.save.yaml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..f2b53f9 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,31 @@ +{ + "name": "KBP-DevContainer", + + "dockerComposeFile": [ + "../docker-compose.base.yaml", + "../docker-compose.dev.yaml" + ], + + "service": "pythonapp", + "workspaceFolder": "/usr/opt/pythonapp", + + "shutdownAction": "stopCompose", + + "customizations": { + "vscode": { + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ], + "settings": { + "python.defaultInterpreterPath": "/usr/opt/pythonapp/env/bin/python", + "python.linting.enabled": true + } + } + }, + + "remoteUser": "root" +} + diff --git a/.env b/.env new file mode 100644 index 0000000..e1cd840 --- /dev/null +++ b/.env @@ -0,0 +1,20 @@ +# Parameter für NGINX-Server +NGINX_VERSION=mainline-alpine +NGINX_HOST_PORT=443 +NGINX_SERVER_NAME=kbp_crm.mylocal.de +NGINX_STATIC_DIR=/home/schoschi/Entwicklung/Projekte_Runden/kbcrm/NGINX_Server/html +NGINX_CONFIG_TEMPLATE_DIR=/home/schoschi/Entwicklung/Projekte_Runden/kbcrm/NGINX_Server/configtemplates +NGINX_CERTS=/home/schoschi/Entwicklung/Projekte_Runden/kbcrm/NGINX_Server/certs +NGINX_CERT=wildcard.mylocal.crt +NGINX_CERT_KEY=wildcard.mylocal.key + +# Parameter for Python App-Server +PYTHON_VERSION=slim-bookworm +PYTHON_APP_DIR=/home/schoschi/Entwicklung/Projekte_Runden/kbcrm/App_Server/root +PYTHON_DEV_DIR=/home/schoschi/Entwicklung/Projekte_Runden/kbcrm +PYTHON_DB_DIR=/home/schoschi/Entwicklung/Projekte_Runden/kbcrm/App_Server/data +# PYTHON_ENV_DIR=/home/schoschi/Entwicklung/Projekte_Runden/kbcrm/App_Server/env + +# Parameter für Dev-Mode (Development-Container für VS-Code) +NODE_VERSION=lts +NPM_VERSION=latest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb63d26 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +__pycache__ +env +node_modules +tsout +kbp_crm*.js +App_Server/data/ diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..08d0eb6 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,103 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "typescript", + "tsconfig": "Client/tsconfig.json", + "problemMatcher": [ + "$tsc" + ], + "group": "build", + "label": "Typescript: Compile", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": false, + "clear": false + } + }, + { + "type": "shell", + "group": "build", + "label": "Rollup: bundle", + "command": "npx rollup --config rollup.config.mjs", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": false, + "clear": false + }, + "options": { + "cwd": "${workspaceFolder}/Client" + } + }, + { + "label": "Build Complete", + "dependsOrder": "sequence", + "dependsOn": [ + "Typescript: Compile", + "Rollup: bundle", + "ShowTime" + ], + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "shell", + "group": "none", + "label": "ShowTime", + "command": "date", + "presentation": { + "echo": false, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": false, + "clear": false + } + }, + { + "type": "shell", + "group": "none", + "label": "Open auth.db", + "command": "C:/Daten-GGG/OneDrive/GGG-Workspace/Projekte/Sqlite3/sqlite3.exe auth.db", + "options": { + "cwd": "${workspaceFolder}/App_Server/data" + }, + "problemMatcher": [], + "presentation": { + "echo": false, + "reveal": "always", + "focus": true, + "panel": "new", + "showReuseMessage": true, + "clear": true + } + }, + { + "type": "shell", + "group": "none", + "label": "Open app.db", + "command": "C:/Daten-GGG/OneDrive/GGG-Workspace/Projekte/Sqlite3/sqlite3.exe kbp_crm.db", + "options": { + "cwd": "${workspaceFolder}/App_Server/data" + }, + "problemMatcher": [], + "presentation": { + "echo": false, + "reveal": "always", + "focus": true, + "panel": "new", + "showReuseMessage": true, + "clear": true + } + } + ] +} \ No newline at end of file diff --git a/App_Server/.dockerignore b/App_Server/.dockerignore new file mode 100644 index 0000000..9c7fbde --- /dev/null +++ b/App_Server/.dockerignore @@ -0,0 +1,4 @@ +*/node_modules +*/tsout +*/env +*/data \ No newline at end of file diff --git a/App_Server/Dockerfile b/App_Server/Dockerfile new file mode 100644 index 0000000..e1d0023 --- /dev/null +++ b/App_Server/Dockerfile @@ -0,0 +1,59 @@ +ARG PYTHON_VERSION +ARG NODE_VERSION +ARG NPM_VERSION +FROM python:${PYTHON_VERSION} AS prod +RUN ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime +RUN apt-get clean && apt-get update && apt-get install -y locales +RUN echo "de_DE.UTF-8 UTF-8" >> /etc/locale.gen +RUN locale-gen +# Das Verzeichnis /usr/opt/pythonapp/env wird als Python-Umgebung (venv) verwendet. +# Es wird bewusst außerhalb des Verzeichnisses /usr/opt/pythonapp/App_Server erstellt, +# um die Python-Umgebung von den Anwendungsdateien zu trennen und das Virtual Environment nicht auf dem Host zu zeigen. +RUN mkdir -p /usr/opt/pythonapp/App_Server/root /usr/opt/pythonapp/env /usr/var/pythonappdata +WORKDIR /usr/opt/pythonapp +RUN python -m venv --upgrade-deps /usr/opt/pythonapp/env +COPY root/requirements.txt /usr/opt/pythonapp/App_Server/root/requirements.txt +RUN /usr/opt/pythonapp/env/bin/pip install --no-cache-dir --upgrade pip -r /usr/opt/pythonapp/App_Server/root/requirements.txt +# COPY scripts/init.sh /init.sh +# RUN chmod 552 /init.sh + +# # ENTRYPOINT [ "/init.sh" ] +# ENTRYPOINT [ "sh", "/init.sh" ] +# CMD [] + +FROM prod AS dev +ARG NODE_VERSION +ARG NPM_VERSION + +# --- 2. Systemabhängigkeiten (für Python + Node.js) --- +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + git \ + curl \ + procps \ + build-essential \ + libpq-dev \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libxml2-dev \ + libxslt1-dev \ + sqlite3 \ + && rm -rf /var/lib/apt/lists/* + +# --- 3. Node.js + npm installieren --- + +RUN curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash - && \ + apt-get install -y nodejs && \ + npm install -g npm@${NPM_VERSION} + +# --- 8. Arbeitsverzeichnis für TypeScript --- +# In dem Entwicklungsverzeichnis (PYTHON_DEV_DIR) existiert dies schon als Unterverzeichnis "Client", daher wird es hier nicht erstellt + +# --- 9. TypeScript + Rollup installieren --- +# Das Script inittypescriptdev.sh wird in der Entwicklungsumgebung ausgeführt, um die TypeScript-Umgebung zu initialisieren. +# Daher ist es nicht notwendig, es hier zu kopieren und auszuführen. +# COPY ./scripts/inittypescriptdev.sh /usr/opt/pythonapp/App_Server/scripts/inittypescriptdev.sh +# RUN chmod +x /usr/opt/pythonapp/App_Server/scripts/inittypescriptdev.sh +ENTRYPOINT ["sh", "/usr/opt/pythonapp/App_Server/scripts/inittypescriptdev.sh"] +CMD ["/usr/opt/pythonapp/env/bin/python", "root/runserver.py", "-D"] + diff --git a/App_Server/root/approot.py b/App_Server/root/approot.py new file mode 100644 index 0000000..e40516f --- /dev/null +++ b/App_Server/root/approot.py @@ -0,0 +1,45 @@ +from flask import Flask +from flask_login import LoginManager +from settings import Configuration +from db import dbauth +from db import dbapp +from auth.model.checkdb import checkupdates as checkupdatesauth +# from model.checkdb import checkupdates as checkupdatesappdb +from os import path + +login_manager = LoginManager() + + +def init_app(): + app = Flask(__name__) + + config: Configuration = Configuration("root/config.ini") + _projektname = config.app_projectname + + app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:////usr/var/pythonappdb/{}.db".format(_projektname) + app.config["SQLALCHEMY_BINDS"] = { + "auth": "sqlite:////usr/var/pythonappdb/auth.db", + "appdb": "sqlite:////usr/var/pythonappdb/{}.db".format(_projektname) + } + app.config["DEBUG"] = path.exists("root/debug") + app.config["PROJEKTNAME"] = config.app_projectname + app.config["APPVERSION"] = config.clientapp_version + app.config["SECRET_KEY"] = config.flask_secret + + # Initialize Plugins + login_manager.init_app(app) + dbauth.init_app(app) + #dbapp.init_app(app) + + with app.app_context(): + # Include our Routes + print("before auth.routes", flush=True) + from auth import routes + from routes import general + checkupdatesauth() + # checkupdatesappdb() + + # from maintenance import init_cli + + return app + diff --git a/App_Server/root/auth/model/__init__.py b/App_Server/root/auth/model/__init__.py new file mode 100644 index 0000000..8d04abd --- /dev/null +++ b/App_Server/root/auth/model/__init__.py @@ -0,0 +1,258 @@ +import sqlite3 +from typing import List +from sqlalchemy.engine import Engine +from sqlalchemy import ForeignKey, event +from sqlalchemy import Column, Integer, String, DateTime +import datetime, decimal +from db import dbauth + + +SYS_ADMIN = "SysAdmin" +APP_ADMIN = "AppAdmin" +APP_USER = "User" +APP_DOZENT = "Doz" + +BINDKEY = 'auth' +#c = Connection() + +def columns2dict(record, excludefields=[]): + if not isinstance(excludefields, list): + excludefields = [] + attribs = dict() + if hasattr(record, '__table__'): + if hasattr(record.__table__, 'columns'): + for col in record.__table__.columns: + if col.name in excludefields: + continue + value = getattr(record, col.name) + if isinstance(value, datetime.date): + value = value.isoformat() + if isinstance(value, decimal.Decimal): + value = "{0:.2f}".format(value) + attribs[col.name] = value + return attribs + +@event.listens_for(Engine, "connect") +def set_sqlite_pragma(dbapi_connection, connection_record): + # Dieser Trigger darf nur bei einer Sqlite-Verbindung zünden. + # Bei einer VErbindugn zum MS SQL-Server darf er nicht ausgelöst werden + if isinstance(dbapi_connection, sqlite3.Connection): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON") + cursor.close() + +class Systeminfo(dbauth.Model): + __tablename__ = 'systeminfo' + __bind_key__ = BINDKEY + id = Column(Integer, primary_key=True) + version = Column(String(20), nullable=False) + lastupdate = Column(DateTime, nullable=True) + initialinstall = Column(DateTime, nullable=True) + +# diese Tabelle enthält für alle Apps diejenigen Rollen, die in der App notwendig sind +# Da die Rollen nur einmal in der Tabelle "Role" definiert sind und mehrere Apps die gleichen +# Rollen haben können, handelt es sich im eine "many-to-many"-Relation, die in dieser +# Hilfstabelle verwaltet werden +apps_roles = dbauth.Table( + 'apps_roles', + Column('appid', Integer, ForeignKey('applications.id'), primary_key=True), + Column('roleid', Integer, ForeignKey('roles.id'), primary_key=True), + bind_key=BINDKEY +) + +# diese Tabelle enthält für alle Apps, in denen der User eine Rolle hat, die Rollen, +# die der User in der jeweiligen App hat. +# Da die Rollen nur einmal in der Tabelle "Role" definiert sind und verschiedene einem User +# zugeordnete Apps die gleichen Rollen haben können, handelt es sich im eine +# "many-to-many"-Relation, die in dieser Hilfstabelle verwaltet werden +userapps_roles = dbauth.Table( + 'userapps_roles', + Column('userappid', Integer, ForeignKey('userapps.id'), primary_key=True), + Column('roleid', Integer, ForeignKey('roles.id'), primary_key=True), + bind_key=BINDKEY +) + +class Role(dbauth.Model): + __tablename__ = 'roles' + __bind_key__ = BINDKEY + id = Column(Integer, primary_key=True) + roleid = Column(String(80), index=True, unique=True, nullable=False, default=None) + name = Column(String(80), nullable=False, default=None) + level = Column(Integer, default=0) + beschreibung = Column(String(800)) + + def to_dict(self): + if self.level is None: + self.level = 0 + return columns2dict(self) + +# Die Tabelle "UserApp" enthält für jeden User für jede App, in der der User eine Rolle hat, +# einen Datensatz. +class Userapp(dbauth.Model): + __tablename__ = 'userapps' + __bind_key__ = BINDKEY + id = Column(Integer, primary_key=True) + userid = Column(ForeignKey('users.id'), index=True) + appid = Column(ForeignKey('applications.id')) + userapp_roles = dbauth.relationship('Role', secondary=userapps_roles, lazy='subquery', order_by="asc(Role.roleid)") + application = dbauth.relationship('Application', uselist=False) + + def get_role(self, roleid: str) -> Role: + """ + Die Methode gibt die Rolle aus der userapp zurück, die mit der roleid (nicht id) angegeben wurde. + Gibt es keine Rolle mit der übergebenen roleid, wird 'None' zurückgegeben + - roleid: str + - die roleid (nicht id) der Rollue, die gesucht wird + """ + for role in self.userapp_roles: + if role.id == roleid: + return role + return None + + def to_dict(self, withrelations=True): + result = columns2dict(self) + result["userapp_roles"] = [] + if withrelations: + for userapprole in self.userapp_roles: + result["userapp_roles"].append(userapprole.to_dict()) + return result + +class User(dbauth.Model): + __tablename__ = 'users' + __bind_key__ = BINDKEY + id = Column(Integer, primary_key=True) + userid = Column(String(80), index=True, unique=True, nullable=False, default='') + username = Column(String(80), nullable=False) + password = Column(String(40), nullable=False) + email = Column(String(120)) + telefon = Column(String(800)) + # Jeder User kann mehrere "User-Apps" haben. Dies sind die Apps, in denen dem User Rollen + # zugewiesen wurden. Es handelt sich um eine "one-to-many"-Relation, da ein User zwar mehrere + # User-Apps haben kann, jede User-App aber genau einem User gehört + userapps = dbauth.relationship('Userapp') + + def get_userapp(self, appid:str) -> Userapp: + """ + Die Funktion liefert die userapp mit Hilfe der appid (nicht der id) zurück. + Wenn der User keine userapp für die Application hat, wird 'None' zurückgegeben + + - appid: string + - Der Kurzname der Application (nicht die id) + """ + for userapp in self.userapps: + app = userapp.application + if app.appid == appid: + return userapp + return None + + def get_userapp_by_id(self, id:int) -> Userapp: + """ + Die Funktion liefert die userapp mit Hilfe der id (nicht der appid) zurück + + - appid: int + - die interne Record-ID der Application (nicht die userid) + """ + for userapp in self.userapps: + app = userapp.application + if app.id == id: + return userapp + return None + + def get_userapproles(self, appid:str) -> List[Role]: + """ + Die Funktion liefert die roles zurück, die der User in der durch die appid (nicht id) bestimmten Application hat + + - appid: str + - Der Kurzname der Application + """ + userapp: Userapp = self.get_userapp(appid) + if userapp is not None: + return userapp.userapp_roles + else: + return [] + + def has_roles(self, roleids: List[str]) -> bool: + """ + Die Funktion liefert 'True' zurück, falls der User in irgendeiner Application eine der Rollen hat, deren roleids + übergeben wurden, ansonsten 'False' + + - roleids: List[str] + - eine Liste mit roleids (nicht ids) + """ + for userapp in self.userapps: + for role in userapp.userapp_roles: + if role.roleid in roleids: + return True + return False + + def is_SysAdmin(self) -> bool: + """ + die Methode liefert 'True' zurück, wenn der User in irgendeiner Anwendung SysAdmin ist + """ + return self.has_roles([SYS_ADMIN]) + + def __repr__(self): + return '' % self.username + + def to_dict(self, withrelations=False): + result = columns2dict(self, excludefields=['password']) + result['userapps'] = [] + if withrelations: + for userapp in self.userapps: + result['userapps'].append(userapp.to_dict()) + return result + + def to_relationaldict(self): + return self.to_dict(withrelations=True) + + def has_permission(self, appid:str, allowed_roles: List[str]): + """ + Gibt an, ob der User in einer bestimmten Anwendung eine der gewünschten Rollen hat + - appid: string + - Die appid (nicht id) der gewünschten Application + - allowed_roles: List[str] + - Eine Liste mit den roleids (nicht ids) der erlaubten Rollen + """ + userapp = self.get_userapp(appid) + if userapp is not None: + rolleerlaubt = any([role.roleid in allowed_roles for role in userapp.userapp_roles]) + if rolleerlaubt: + return True + return False + + + + # Die nachfolgenden Properties werden für flask_login benötigt + @property + def is_authenticated(self): + return True + + @property + def is_active(self): + return True + + @property + def is_anonymous(self): + return False + + def get_id(self): + return self.userid + +class Application(dbauth.Model): + __tablename__ = 'applications' + __bind_key__ = BINDKEY + id = Column(Integer, primary_key=True) + appid = Column(String(80), index=True, unique=True, nullable=False, default=None) + name = Column(String(80), nullable=False, default=None) + minversion = Column(String(20)) + beschreibung = Column(String(800)) + roles = dbauth.relationship('Role', secondary=apps_roles, lazy='subquery', order_by="asc(Role.roleid)") + + def to_dict(self, withrelations=True): + result = columns2dict(self) + result['roles'] = [] + for role in self.roles: + result['roles'].append(role.to_dict()) + return result + +print("########## auth/model importiert") \ No newline at end of file diff --git a/App_Server/root/auth/model/applications.py b/App_Server/root/auth/model/applications.py new file mode 100644 index 0000000..72f5bc5 --- /dev/null +++ b/App_Server/root/auth/model/applications.py @@ -0,0 +1,73 @@ +from . import APP_ADMIN, SYS_ADMIN, User, Userapp, dbauth, Application, Role, apps_roles, userapps_roles +from .errors import AutorisationError, ApplicationError +from flask_login import current_user +from sqlalchemy import delete + +session = dbauth.session + +def get_applications(): + apps = [] + for app in Application.query: + # Die Application wird nur zurückgegeben, wenn der current-User SysAdmin ist oder wenn + # der current_user in der zurückzugebenden Application AppAdmin ist + if current_user.is_SysAdmin() or current_user.has_permission(app.appid, [APP_ADMIN]): + if not current_user.is_SysAdmin(): + for role in list(app.roles): + if role.roleid == SYS_ADMIN: + app.roles.remove(role) + apps.append(app) + return apps + +def updateapplication(data): + if not current_user.is_SysAdmin(): + raise AutorisationError(allowed_roles=[SYS_ADMIN], user_roles=current_user.get_userapproles(data["appid"])) + currentapp = None + if data["id"] == -1: + currentapp = Application() + currentapp.id = None + session.add(currentapp) + else: + currentapp = Application.query.get(data["id"]) + if currentapp is None: + raise Exception ("404") + currentapp.name = data["name"] + currentapp.appid = data["appid"] + currentapp.minversion = data["minversion"] + currentapp.beschreibung = data["beschreibung"] + session.commit() + +def deleteapplications(appids): + if not current_user.is_SysAdmin(): + raise AutorisationError(allowed_roles=[SYS_ADMIN], user_roles=None) + for appid in appids: + app: Application = Application.query.filter(Application.appid == appid).one() + if app is not None: + # Die Datensätze in "apps_roles" müssen gelöscht werden + app.roles.clear() + # UserApps löschen + q_userapps = dbauth.select(Userapp). where(Userapp.appid == app.id) + for userapp in dbauth.session.scalars(q_userapps): + userapp.userapp_roles.clear() + session.delete(userapp) + session.delete(app) + session.commit() + +def updateapplicationroles(approles): + # Änderungen an Applications darf grundsätzlich nur der SysAdmin machen + if not current_user.is_SysAdmin(): + raise AutorisationError(allowed_roles=[SYS_ADMIN], user_roles=None) + + for appidinfo in approles: + app: Application = Application.query.filter(Application.appid == appidinfo["appid"]).one() + if app is None: + raise ApplicationError(f"Die Application mit der Appid {appidinfo['appid']} existiert nicht", ) + for roleidinfo in appidinfo["roles"]: + role: Role = Role.query.filter(Role.roleid == roleidinfo["roleid"]).one() + if role in app.roles: + if not roleidinfo['isChecked']: + app.roles.remove(role) # hier kann das remove einfach so verwendet werden, da nicht über app.roles iteriert wird + # TODO: die Rolle muss auch aus allen userapps für alle User gelöscht werden + else: + if roleidinfo['isChecked']: + app.roles.append(role) + session.commit() \ No newline at end of file diff --git a/App_Server/root/auth/model/checkdb.py b/App_Server/root/auth/model/checkdb.py new file mode 100644 index 0000000..869767e --- /dev/null +++ b/App_Server/root/auth/model/checkdb.py @@ -0,0 +1,86 @@ +from datetime import datetime +from auth import model +from sqlalchemy import text +from sqlalchemy.exc import OperationalError +from datetime import datetime +from db import dbauth + +session = dbauth.session +BINDKEY = "auth" + +def _db_V01_00(): + # "bind_key=None" bedeutet hier, dass bei "create_all" nur die Models mit + # Default-Bind erzeugt werden sollen und nicht die anderen, insbesonder + # nicht die zum MS-SQL-SErver + dbauth.create_all(bind_key=BINDKEY) + systeminfo = model.Systeminfo() + systeminfo.id = 1 + systeminfo.version = "01.00" + systeminfo.lastupdate = datetime.now() + systeminfo.initialinstall = datetime.now() + session.add(systeminfo) + session.commit() + +def _db_V01_01(): + u = model.User() + u.id = 1 + u.userid = 'System.Admin' + u.username = 'Systemadministrator' + u.password = "geheim" + u.email = '' + session.add(u) + + sysmgr = model.Role() + sysmgr.id = 1 + sysmgr.name = "Systemadministrator" + sysmgr.roleid = "SysAdmin" + session.add(sysmgr) + + appmgr = model.Role() + appmgr.name = "Anwendungsadministrator" + appmgr.roleid = "AppAdmin" + session.add(appmgr) + + usermgr = model.Role() + usermgr.name = "Benutzerverwaltung" + usermgr.roleid = "UserMgr" + session.add(usermgr) + + application = model.Application() + application.id = 1 + application.appid = "Project01" + application.name = "Project01 (Name ändern)" + session.add(application) + + userapp = model.Userapp() + userapp.application = application + userapp.userapp_roles.append(sysmgr) + session.add(userapp) + u.userapps.append(userapp) + + _updatesysteminfo('01.01') + session.commit() + +def _updatesysteminfo(versionnr): + s: model.Systeminfo = model.Systeminfo.query.get(1) + s.version = versionnr + s.lastupdate = datetime.now() + return + +def checkupdates(): + systeminfo = None + curr_dbversion = '_db_V01_00' + try: + systeminfo: model.Systeminfo = model.Systeminfo.query.get(1) + curr_dbversion = "_db_V" + systeminfo.version.replace(".", "_") + except (OperationalError, AttributeError): + _db_V01_00() + + versionen = sorted(filter(lambda f: f.startswith("_db_V"),globals())) + + for v in versionen: + if v > curr_dbversion: + globals()[v]() # https://docs.python.org/3.6/library/functions.html?highlight=globals#globals + + print('########## Database updated') + diff --git a/App_Server/root/auth/model/errors.py b/App_Server/root/auth/model/errors.py new file mode 100644 index 0000000..d31110e --- /dev/null +++ b/App_Server/root/auth/model/errors.py @@ -0,0 +1,38 @@ + +class ApplicationError(Exception): + def __init__(self, *messages, htmlstatus=400): + self.htmlstatus = htmlstatus + Exception.__init__(self, *messages) + + @property + def error(self): + error = { + "status": self.htmlstatus, + "messages": list(self.args) + } + return error + +class AutorisationError(ApplicationError): + def __init__(self, allowed_roles=[], user_roles=[]): + self.allowed_roles = allowed_roles + self.user_roles = user_roles + + if user_roles is None: + userrolestxt = "NoSysAdmin" + else: + userrolestxt = ", ".join([role.name for role in self.user_roles]) + + ApplicationError.__init__(self, + "Sie haben nicht die passende Rolle für diese Funktion", + "Ihre Rollen sind: " + userrolestxt, + "Erforderliche Rollen sind: " + ", ".join(self.allowed_roles), htmlstatus=HtmlStatusCode.Unauthorized) + +class HtmlStatusCode(): + Bad_Request = 400 + Unauthorized = 401 + Payment_Required = 402 + Forbidden = 403 + Not_Found = 404 + Method_Not_Allowed = 405 + + diff --git a/App_Server/root/auth/model/roles.py b/App_Server/root/auth/model/roles.py new file mode 100644 index 0000000..9f1997a --- /dev/null +++ b/App_Server/root/auth/model/roles.py @@ -0,0 +1,50 @@ +from . import SYS_ADMIN, Application, Role, dbauth, User +from sqlalchemy.sql import collate +from flask_login import current_user +from .errors import AutorisationError + +session = dbauth.session + +def get_roles(): + roles = Role.query.order_by(collate(Role.roleid, 'NOCASE')).all() + return roles + +def updaterole(data): + if not current_user.is_SysAdmin(): + raise AutorisationError(allowed_roles=[SYS_ADMIN], user_roles=None) + currentrole = None + if data["id"] == -1: + currentrole = Role() + currentrole.id = None + session.add(currentrole) + else: + currentrole = Role.query.get(data["id"]) + if currentrole is None: + raise Exception ("404") + currentrole.level = data["level"] + currentrole.name = data["name"] + currentrole.roleid = data["roleid"] + currentrole.beschreibung = data["beschreibung"] + session.commit() + +def deleteroles(roleids): + if not current_user.is_SysAdmin(): + raise AutorisationError(allowed_roles=[SYS_ADMIN], user_roles=None) + for roleid in roleids: + role: Role = Role.query.filter(Role.roleid == roleid).one() + if role is not None: + appq = Application.query + for app in appq: + if role in app.roles: + app.roles.remove(role) # remove kann hier einfach so verwendet werden, da nicht über app.roles iteriert wird + userq = User.query + for user in userq: + for userapp in user.userapps: + if role in userapp.userapp_roles: + userapp.userapp_roles.remove(role) # remove kann hier einfach so verwendet werden, da nicht über userapp_roles iteriert wird + session.delete(role) + + session.commit() + + + diff --git a/App_Server/root/auth/model/users.py b/App_Server/root/auth/model/users.py new file mode 100644 index 0000000..838cf57 --- /dev/null +++ b/App_Server/root/auth/model/users.py @@ -0,0 +1,179 @@ + +from . import APP_ADMIN, SYS_ADMIN, Application, Role, User, dbauth, Userapp +from .errors import ApplicationError, AutorisationError +from flask_login import current_user +current_user: User + +session = dbauth.session + +def check_login(userid: str, password: str): + """ + Hier wird ausschließlich nur festgestellt, ob Login und Kennwort vorhanden sind bzw. übereinstimmen. + alles Weitere muss in den Funktionen erfolgen, die 'check_login' aufrufen. + """ + user:User = User.query.filter(User.userid == userid).first() + if user is None or user.password != password: + return None + else: + return user + +def get_users(): + """ + Hier werden derzeit alle User zurückgegeben. + Allerdings werden die userapps eines Users wie folgt gefiltert: + + Wenn es sich bei dem current_user um den SysAdmin handelt, wird nichts gefiltert + + Wenn es sich bei dem current_user um den AppAdmin handelt, werden nur die userapps zurückgegeben, auf die auch + der current_user Zugriff hat. Außerdem wird die Rolle "SysAdmin" innerhalb der userapp.userapp-roles auch nicht + mit zurückgegeben + + Bei allen anderen Arten von Usern werden keine userapps und somit auch keine Rollen zurückgegeben + """ + users = [] + user: User + for user in User.query.order_by(User.userid): + # Wenn der current_user kein SysAdmin ist, soll diese User auch nicht sehen, dass es einen SysAdmin gibt + if not current_user.is_SysAdmin() and user.is_SysAdmin(): + continue + # Wenn innerhalb einer For-Schleife Elemente gelöscht werden, muss auf einer Kopie der + # Liste iteriert werden, da die For-Schleife sonst mit der Nummerierung durcheinanderkommt, weil während + # des Durchlaufs Werte durch das remove "verschwinden" + # Daher wird hier für die For-Schleife mit der Funktion list() eine neue Liste der Origonal-Liste erzeugt + for userapp in list(user.userapps): + # Rollen für bestimmte Application, in denen der zurückzugebende User Rollen innehat, sollen nur zurück- + # gegeben werden, wenn der current_user für diese App SysAdmin oder AppAdmin ist + if not current_user.has_permission(userapp.application.appid, [APP_ADMIN, SYS_ADMIN]): + user.userapps.remove(userapp) + # Wenn der current_user für die Application keine SysAdmin-Rolle hat, soll eine evtl. SysAdmin-Rolle auch + # nicht zurückgegeben werden + if not current_user.has_permission(userapp.application.appid, [SYS_ADMIN]): + for role in list(userapp.userapp_roles): # s.o. wegen remove in for-loop + if role.roleid == SYS_ADMIN: + userapp.userapp_roles.remove(role) + users.append(user) + return users + + +def changepassword(userid:str, oldpassword:str, newpassword1:str, newpassword2:str): + """ + Die Funktion ändert das Kennwort des Users + + -userid: string Die Userid (nicht id) des Users + -oldpassword: string Das bisherige Kennwort des Users + -newpassword1: string Das neue Kennwort des Users + -newpassword2: string Die Wiederholung des neuen Kennwort des Users + """ + if newpassword1 != newpassword2: + raise ValueError("Die neuen Kennworte stimmen nicht überein!") + if newpassword1 is None or newpassword1.strip() == "": + raise ValueError("Es muss ein neues Kennwort angegeben werden!") + user:User = User.query.filter(User.userid == userid).first() + if user is None or user.password != oldpassword: + raise ValueError("Der angegebene Benutzer existiert nicht oder das alte Kennwort ist falsch") + user.password = newpassword1 + session.commit() + return True + +def updateuser(data): + """ + Die User-Daten werden nur geändert, wenn der current_user entweder SysAdmin oder AppAdmin ist + -data: Dict Ein Dictionary mit den Feldern, die beim User geändert werden sollen + """ + if not current_user.has_roles([SYS_ADMIN, APP_ADMIN]): + raise AutorisationError(allowed_roles=[SYS_ADMIN, APP_ADMIN], user_roles=None) + currentuser: User = None + if data["id"] == -1: + currentuser = User() + currentuser.id = None + currentuser.password = "" + session.add(currentuser) + else: + currentuser = User.query.get(data["id"]) + if currentuser is None: + raise Exception ("404") + currentuser.username = data["username"] + currentuser.userid = data["userid"] + currentuser.email = data["email"] + currentuser.telefon = data["telefon"] + session.commit() + +def deleteusers(userids): + """ + Hier werden die User gelöscht, deren userids übergeben werden. Gelöscht werden kann aber nur, + wenn der current_user entweder SysAdmin oder AppAdmin ist. + Wenn der zu löschende User Rollen in Applications hat, auf die der AppAdmin keinen Zugriff hat, + Wird der User ebenfalls nicht gelöscht. + - userids: string[] eine Liste der userids (nicht id) der User, die gelöscht werden sollen + """ + # Wenn er schon mal nirgendwo Sys- oder AppAdmin ist, fliegt er schon mal direkt raus + if not current_user.has_roles([SYS_ADMIN, APP_ADMIN]): + raise AutorisationError(allowed_roles=[SYS_ADMIN, APP_ADMIN], user_roles=None) + # ansonsten: hier dürfen nur die User gelöscht werden, die in denjenigen Apps eine Rolle haben, + # in dene der current_user entweder SysAdmin aod AppAdmin ist. Wenn der User noch eine Rolle in einer App haben, + # auf die der current_user keinen Zugriff hat, darf nicht gelöscht werden + for userid in userids: + user: User = User.query.filter(User.userid == userid).one() + if user is not None: + for userapp in user.userapps: + currentuser_userapp: Userapp = current_user.get_userapp(userapp.application.appid) + if currentuser_userapp is None or len(currentuser_userapp.userapp_roles) == 0: + raise ApplicationError(f"Der Benutzer {user.username} hat noch Rollen in Anwendungen, in denen Sie kein AppAdmin oder SysAdmin sind.", + "Er kann daher nicht gelöscht werden.", + "Der komplette Löschvorgang wurde abgebrochen.", + htmlstatus=404) + session.delete(user) + session.commit() + +def applyuserapprole(data): + """ + Hier kann einem Benutzer eine Rolle für eine bestimmte App entzogen oder zugewiesen werden + + ### Parameter + - data: dict + - parentuserid: integer + - Die id (nicht userid) des Users, für den eine Rolle geändert werden soll + - parantappid: integer + - Die id (nicht appid) der Application, für die eine Rolle geändert werden soll + - roleid: integer + - Die id (nicht roleid) der Rolle, die zugewiesen oder entzogen werden soll + - ischecked: boolean + - 'True' bedeutet, dass die Rolle zugewiesen werden soll, 'False' bedeutet, dass die Rolle entzogen werden soll + """ + user_id = data['parentuserid'] + app_id = data['parentappid'] + ischecked = data['ischecked'] + role_id = data['roleid'] + + user: User = User.query.get(user_id) + if user is None: + raise Exception("Den User gibt es nicht") + app: Application = Application.query.get(app_id) + if app is None: + raise Exception("Die Application gibt es nicht") + role: Role = Role.query.get(role_id) + if role is None: + raise Exception("Die Rolle gibt es nicht") + + # hier darf nur zugewiesen werden, wenn der current_user entweder SysAdmin ist oder AppAdmin in der App, + # für die die Rolle geändert wird + if not current_user.is_SysAdmin() and not current_user.has_permission(app.appid, [APP_ADMIN]): + raise AutorisationError(allowed_roles=[SYS_ADMIN, APP_ADMIN], user_roles=current_user.get_userapproles(app.appid)) + userapp: Userapp = user.get_userapp_by_id(app_id) + if userapp is None: + userapp = Userapp() + userapp.appid = app_id + user.userapps.append(userapp) + userapp_role: Role = userapp.get_role(role_id) + if userapp_role is None and ischecked: + userapp.userapp_roles.append(role) + if userapp_role is not None and not ischecked: + # eine SysAdmin oder ein AppAdmin kann sich selber nicht die Rolle als SysAdmin oder AppAdmin entziehen + if current_user.userid == user.userid: + if ((userapp_role.roleid == APP_ADMIN and current_user.has_permission(app.appid, [APP_ADMIN])) or + (userapp_role.roleid == SYS_ADMIN and current_user.has_permission(app.appid, [SYS_ADMIN]))): + raise ApplicationError("Sie können sich nicht selbst die Rolle als AppAdmin entziehen, da Sie dann keinen Zugriff auf das System mehr hätten!") + userapp.userapp_roles.remove(userapp_role) # remove kann hier einfach so verwendet werden, da nicht über userapp.userapp_roles iteriert wird + session.commit() + + diff --git a/App_Server/root/auth/routes.py b/App_Server/root/auth/routes.py new file mode 100644 index 0000000..b9c2492 --- /dev/null +++ b/App_Server/root/auth/routes.py @@ -0,0 +1,235 @@ +from approot import login_manager +from auth.model import ( + APP_ADMIN, + APP_DOZENT, + APP_USER, + SYS_ADMIN, + Application, + Role, + User, + applications, + roles, + users, +) +from flask import current_app as app +from flask import jsonify, request +from flask_login import login_required, login_user, logout_user + +from .model.errors import ApplicationError, AutorisationError + +print("auth-routes") + + +@login_manager.user_loader +def user_loader(userid): + user: User | None = User.query.filter(User.userid == userid).first() + return user + + +@app.post("/auth/checklogin") +def checklogin(): + """ + Hier wird nur die Authentifizierung überprüft. + Evtl. Autorisierungen anhand der User-Rollen und App-Berechtigungen müssen später bei den + Funktionsaufrufen erfolgen + """ + data = request.json + user: User = users.check_login(data["userid"], data["password"]) + if user is None: + error = ApplicationError( + "Login oder Kennwort stimmen nicht!", + "Anmeldung wurde verweigert", + htmlstatus=403, + ) + return jsonify(error.error), error.htmlstatus + if not user.has_roles([SYS_ADMIN, APP_ADMIN, APP_USER, APP_DOZENT]): + error = ApplicationError( + "Sie haben nicht die passende Rolle zur Nutzung dieser Anwendung.", + "Der Zugang wird verweigert", + htmlstatus=403, + ) + return jsonify(error.error), error.htmlstatus + login_user(user) + result = user.to_dict() + result["isSysAdmin"] = user.is_SysAdmin() + return jsonify(result), 200 + + +@app.post("/auth/changepassword") +@login_required +def changepassword(): + data = request.json + status = 200 + result = {"Message": "", "Success": True} + try: + users.changepassword( + data["Userid"], + data["OldPassword"], + data["NewPassword1"], + data["NewPassword2"], + ) + except Exception as ex: + error = ApplicationError(str(ex), htmlstatus=400) + return error.error, error.htmlstatus + + return jsonify(result), status + + +@app.get("/auth/logout") +def logout(): + logout_user() + return jsonify({"logout": True}), 200 + + +@app.get("/auth/getusers") +@login_required +def getusers(): + """ + Die Rückgabe wird in 'users.get_users()' (s.u.) anhand er App-Berechtigung und der + Rollen gefiltert. + """ + userquery = users.get_users() + result = [] + user: User + for user in userquery: + result.append(user.to_relationaldict()) + return jsonify(result), 200 + + +@app.get("/auth/getapplications") +@login_required +def getapplications(): + """ + Die Rückgabe wird in 'applications.get_applications()' (s.u.) anhand er App-Berechtigung und der + Rollen gefiltert. + """ + appquery = applications.get_applications() + result = [] + app: Application + for app in appquery: + result.append(app.to_dict()) + return jsonify(result), 200 + + +@app.get("/auth/getroles") +@login_required +def getroles(): + rolelist = roles.get_roles() + result = [] + role: Role + for role in rolelist: + result.append(role.to_dict()) + return jsonify(result), 200 + + +@app.post("/auth/updaterole") +@login_required +def updaterole(): + data = request.json + try: + roles.updaterole(data) + except AutorisationError as ex: + return jsonify(ex.error), ex.htmlstatus + except Exception as ex: + if str(ex) == "404": + return jsonify("Rolle nicht gefunden"), 404 + else: + return jsonify(str(ex)), 400 + return jsonify({}), 200 + + +@app.post("/auth/deleteroles") +@login_required +def deleteroles(): + data = request.json + try: + roles.deleteroles(data) + except AutorisationError as ex: + return jsonify(ex.error), ex.htmlstatus + except Exception as ex: + return jsonify(str(ex)), 400 + return jsonify({}), 200 + + +@app.post("/auth/updateapplication") +@login_required +def updateapplication(): + data = request.json + try: + applications.updateapplication(data) + except AutorisationError as ex: + return jsonify(ex.error), ex.htmlstatus + except Exception as ex: + return jsonify(str(ex)), 400 + return jsonify({}), 200 + + +@app.post("/auth/deleteapplications") +@login_required +def deleteapplications(): + data = request.json + try: + applications.deleteapplications(data) + except AutorisationError as ex: + return jsonify(ex.error), ex.htmlstatus + except Exception as ex: + return str(ex), 400 + return {}, 200 + + +@app.post("/auth/updateapplicationroles") +@login_required +def updateapplicationroles(): + data = request.json + try: + applications.updateapplicationroles(data) + except AutorisationError as ex: + return jsonify(ex.error), ex.htmlstatus + except Exception as ex: + return jsonify(str(ex)), 400 + return jsonify({}), 200 + + +@app.post("/auth/updateuser") +@login_required +def updateuser(): + data = request.json + try: + users.updateuser(data) + except AutorisationError as ex: + return jsonify(ex.error), ex.htmlstatus + except Exception as ex: + if str(ex) == "404": + return jsonify("Benutzer nicht gefunden"), 404 + else: + return jsonify(str(ex)), 400 + return jsonify({}), 200 + + +@app.post("/auth/applyuserapprole") +@login_required +def applyuserapprole(): + data = request.json + try: + users.applyuserapprole(data) + except AutorisationError as ex: + return jsonify(ex.error), ex.htmlstatus + except Exception as ex: + return jsonify(str(ex)), 400 + return jsonify({}), 200 + + +@app.post("/auth/deleteusers") +@login_required +def deleteusers(): + data = request.json + try: + users.deleteusers(data) + except ApplicationError as ex: + return jsonify(ex.error), ex.htmlstatus + except Exception as ex: + return jsonify(str(ex)), 400 + return {}, 200 + + +print("########## auth.routes importiert") diff --git a/App_Server/root/config.ini b/App_Server/root/config.ini new file mode 100644 index 0000000..bd44b9a --- /dev/null +++ b/App_Server/root/config.ini @@ -0,0 +1,7 @@ +[DEBUG] +debug=True + +[APP] +projectname=kbp_crm +version=00.00.01 +flasksecret=Hier_muss_ein_sicherer_schluessel_eingesetzt_werden \ No newline at end of file diff --git a/App_Server/root/db.py b/App_Server/root/db.py new file mode 100644 index 0000000..f9f255b --- /dev/null +++ b/App_Server/root/db.py @@ -0,0 +1,10 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy.orm import DeclarativeBase + + +class Base(DeclarativeBase): + pass + +dbauth = SQLAlchemy(model_class=Base) +dbapp = dbauth diff --git a/App_Server/root/debug b/App_Server/root/debug new file mode 100644 index 0000000..cd8004f --- /dev/null +++ b/App_Server/root/debug @@ -0,0 +1,2 @@ +Wenn diese Datei vorhanden ist, dann startet der Python/Flask-Server im DEBUG-Modus +Wenn die Datei nicht vorhanden ist, startet Python/Flask nicht im DEBUG-Modus \ No newline at end of file diff --git a/App_Server/root/requirements.txt b/App_Server/root/requirements.txt new file mode 100644 index 0000000..1d81997 --- /dev/null +++ b/App_Server/root/requirements.txt @@ -0,0 +1,6 @@ +SQLAlchemy +Flask +Flask-SQLAlchemy +Flask-Login +waitress +# pyodbc \ No newline at end of file diff --git a/App_Server/root/routes/general.py b/App_Server/root/routes/general.py new file mode 100644 index 0000000..ea28741 --- /dev/null +++ b/App_Server/root/routes/general.py @@ -0,0 +1,33 @@ +from flask import current_app as app, render_template, jsonify +from datetime import datetime +from flask_login import login_required + + +@app.route("/") +@app.route("/index.html") +def index(): + scriptfile = "{0}_{1}.js".format(app.config["PROJEKTNAME"], app.config["APPVERSION"]) + if app.config["DEBUG"] is False: + scriptfile = scriptfile.replace(".js", ".min.js") + return render_template( + "index.html", + apptitle = app.config["PROJEKTNAME"], + scriptfile = scriptfile + ) + +@app.route("/xhr/health-check") +def health_check(): + zeit = datetime.now().isoformat() + result = { + 'result': "success", + 'time': zeit, + 'server': "n/a", #_server, + 'projectname': "n/a", #_projektname, + 'clientappversion': "N/A" #_version + } + return result # https://flask.palletsprojects.com/en/3.0.x/quickstart/#about-responses + +@app.route("/xhr/getinfo") +@login_required +def get_info(): + return {"info": "pustekuchen"} \ No newline at end of file diff --git a/App_Server/root/runserver.py b/App_Server/root/runserver.py new file mode 100644 index 0000000..3ea7615 --- /dev/null +++ b/App_Server/root/runserver.py @@ -0,0 +1,20 @@ +from waitress import serve +from werkzeug import serving +from approot import init_app + + +def run_server(): + try: + if app.config["DEBUG"] is False: + _server = "waitress" + # serve(app, listen='nginx-proxy:8080') # Funktioniert aus unbekannten Gründen nicht. Der Hostname wird im Docker Container nicht korrekt aufgelöst + serve(app, listen='*:8080') + else: + _server = "werkzeug" + serving.run_simple("0.0.0.0", 8080, app, use_reloader=True) + except Exception as ex: + print(str(ex)) + +if __name__ == '__main__': + app = init_app() + run_server() \ No newline at end of file diff --git a/App_Server/root/settings.py b/App_Server/root/settings.py new file mode 100644 index 0000000..cba5e8b --- /dev/null +++ b/App_Server/root/settings.py @@ -0,0 +1,26 @@ +from pathlib import Path +from configparser import ConfigParser + +class Configuration: + def __init__(self, configfilename:str|Path): + self.config:ConfigParser = ConfigParser() + self.config.read(configfilename) + + @property + def debug(self) -> bool: + return self.config["DEBUG"].getboolean("debug") + + @property + def clientapp_version(self) -> str: + return self.config["APP"].get("version") + + @property + def app_projectname(self) -> str: + return self.config["APP"].get("projectname") + + @property + def flask_secret(self) -> str: + return self.config["APP"].get("flasksecret") + + + diff --git a/App_Server/root/templates/index.html b/App_Server/root/templates/index.html new file mode 100644 index 0000000..dbd41d6 --- /dev/null +++ b/App_Server/root/templates/index.html @@ -0,0 +1,54 @@ + + + + + + + + {{apptitle}} + + + + + + + + + + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/App_Server/scripts/init.sh b/App_Server/scripts/init.sh new file mode 100644 index 0000000..c7583ad --- /dev/null +++ b/App_Server/scripts/init.sh @@ -0,0 +1,16 @@ +# Python virtual Environment anlegen +cd /usr/opt/pythonapp +# Wenn es die Datei pyvenv.cfg im Unterverzeichnis env nocht nicht gibt, muss das +# virtuelle Environment angelegt werden +# if [ ! -s env/pyvenv.cfg ] +# then +# echo "Creating Python Virtual environment..." +# python -m venv --upgrade-deps /usr/opt/pythonapp/env +# echo "Python Virtual environment created." +# fi +echo "Installing Python requirements..." +env/bin/pip install -r root/requirements.txt +echo "Python requirements installed." + +echo "Starting Python-Server..." +env/bin/python root/runserver.py \ No newline at end of file diff --git a/App_Server/scripts/inittypescriptdev.sh b/App_Server/scripts/inittypescriptdev.sh new file mode 100644 index 0000000..97c907e --- /dev/null +++ b/App_Server/scripts/inittypescriptdev.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Prüfe, ob node_modules bereits existiert und ob es nicht leer ist +# Das ist wichtig, da das node_modules durch ein bind mount in den Container eingebunden wird +# und daher bei Start des Containers bereits existiert +if [ ! -d "/usr/opt/pythonapp/Client/node_modules" ] || [ -z "$(ls -A /usr/opt/pythonapp/Client/node_modules)" ]; then + echo "node_modules nicht gefunden oder leer. Führe npm install aus..." + cd /usr/opt/pythonapp/Client || { echo "Fehler: /usr/opt/pythonapp/Client nicht gefunden"; exit 1; } + + # Prüfe, ob package.json existiert + if [ -f "package.json" ]; then + echo "package.json gefunden. Installiere Abhängigkeiten..." + npm install + echo "npm install abgeschlossen." + else + echo "Fehler: package.json in /usr/opt/pythonapp/Client nicht gefunden!" + exit 1 + fi +fi + +# Führe das eigentliche CMD aus (z. B. python src/mein_skript.py) +# Zuerst wieder in die Python-Umgebung zurück, da von dort die Anwendung gestartet wird +cd /usr/opt/pythonapp/App_Server || { echo "Fehler: /usr/opt/pythonapp/App_Server nicht gefunden"; exit 1; } +echo "Starte Anwendung..." +exec "$@" \ No newline at end of file diff --git a/Client/Components/auth/applicationpage.ts b/Client/Components/auth/applicationpage.ts new file mode 100644 index 0000000..ea672f8 --- /dev/null +++ b/Client/Components/auth/applicationpage.ts @@ -0,0 +1,616 @@ +import m from "mithril" +import { Treetable, iTreetable, iTreenode, Treenode, TopbarButton, iTopbarButton, changeTreenodes } from "../widgets/Treetable_V2" +import {ModalType, ModalView, iModalView} from "../widgets/Modal" +import { iApplication} from "./models/applications" +import { iRole } from "./models/roles" +import {gridMountpoints} from "../mainlayout" +import {WrongEditSelectionMessage, iWrongEditSelectionMessage, showServerError} from "./authmessages" + +const MOVERIGHT = "Die markierten und nicht markierten Rollen werden den markierten Anwendungen zugeordnet" + +const localDataModel = { + applist: [] as iApplication[], + rolelist: [] as iRole[], + appnodes: [] as iTreenode[], + rolenodes: [] as iTreenode[], + loadData: () => { + Promise.all([ + m.request({ + method: "GET", + url: "/auth/getapplications" + }).then((result) => localDataModel.applist = result as iApplication[]), + m.request({ + method: "GET", + url: "/auth/getroles" + }).then((result) => {localDataModel.rolelist = result as iRole[]}) + ]) + .then (() => { + localDataModel.appnodes = [] + localDataModel.rolenodes = [] + localDataModel.applist.map((app: iApplication) => { + let appnode: iTreenode = new Treenode(app, false, []) + app.roles.forEach((role: iRole) => { + let newChildnode = new Treenode(role) + newChildnode.isChecked = true + appnode.children.push(newChildnode) + }) + appnode.children.sort(sortRoleNodes) + localDataModel.appnodes.push(appnode) + }) + localDataModel.rolelist.map((role: iRole) => { + let rolenode: iTreenode = new Treenode(role, false, []) + localDataModel.rolenodes.push(rolenode) + }) + localDataModel.rolenodes.sort(sortRoleNodes) + changeTreenodes(localDataModel.appnodes, true) + }) + }, + updateRole: (role: iRole) => { + m.request ({ + method: "POST", // Hier muss POST verwendet werden, weil GET keinen Body hat und Parameter nur im URL transportieren kann + url: "/auth/updaterole", + body: role + }) + .catch((e) => {showServerError(e)}) + .finally(() => localDataModel.loadData()) + }, + deleteRoles: (roles: iRole[]) => { + let roleids: string[] = [] + roles.forEach((role: iRole) => { + roleids.push(role.roleid) + }) + m.request({ + method: "POST", + url: "/auth/deleteroles", + body: roleids + }) + .catch((e) => {showServerError(e)}) + .finally(() => localDataModel.loadData()) + }, + updateApplication: (app: iApplication) => { + m.request ({ + method: "POST", // Hier muss POST verwendet werden, weil GET keinen Body hat und Parameter nur im URL transportieren kann + url: "/auth/updateapplication", + body: app + }) + .catch((e) => {showServerError(e)}) + .finally(() => localDataModel.loadData()) + }, + deleteApplications: (apps: iApplication[]) => { + let appids: string[] = [] + apps.forEach((app: iApplication) => { + appids.push(app.appid) + }) + m.request({ + method: "POST", + url: "/auth/deleteapplications", + body: appids + }) + .catch((e) => {showServerError(e)}) + .finally(() => localDataModel.loadData()) + }, + updateApplicationRoles: () => { + interface iApplicationRole { + appid: string + roles: {roleid: string, isChecked: boolean}[] + } + let applicationroles: iApplicationRole[] = [] + localDataModel.appnodes.forEach((appnode: iTreenode) => { + let app: iApplication = appnode.nodevalue + let approle: iApplicationRole = { + appid: app.appid, + roles: [] + } + appnode.children.forEach((rolenode: iTreenode) => { + let role: iRole = rolenode.nodevalue + approle.roles.push({roleid: role.roleid, isChecked: rolenode.isChecked}) + }) + applicationroles.push(approle) + }) + m.request({ + method: "POST", + url: "/auth/updateapplicationroles", + body: applicationroles + }) + .catch((e) => {showServerError(e)}) + .finally(() => localDataModel.loadData()) + } +} + +export const applicationpage: m.ClosureComponent = (vnode) => { + return { + oninit: (vnode) => { + localDataModel.loadData() + }, + view: (vnode) => { + return m("div.w3-container.w3-content", { + style: {'max-width': '80%', display: 'flex', 'flex-direction': 'column', height: 'inherit', 'overflow-y': 'inherit'} + }, + m("div", {style: {flex: '1', 'overflow-y': 'inherit'}}, + m("div.w3-cell-row", + m("div.w3-cell.w3-padding.w3-mobile", + m("h1", "Rollen"), + m(Treetable, + { + treenodes: localDataModel.rolenodes, + startexpanded: false, + onRowMarked: (node: iTreenode) => { + //alert(node.nodevalue['roleid']) + }, + columnmapper: (node: iTreenode) => { + let role = node.nodevalue as iRole + return [ + m("span.w3-button", + { + style: {padding: '0px'}, + onclick: () => { + node.isChecked = !node.isChecked + } + }, + m("i.material-icons.w3-theme-light", node.isChecked?"check_box":"check_box_outline_blank") + ), + m("div", role.level), + m("div", role.roleid), + m("div", role.name) + ] + } + } as iTreetable, + m(TopbarButton, + { + onclick: applyRoles, + tooltip: MOVERIGHT + } as iTopbarButton, + m("i.material-icons", "keyboard_double_arrow_right") + ), + m(TopbarButton, + { + onclick: () => {m.mount(gridMountpoints.modalhook, { + view: (vnode) => { + return m(RoleForm, {role: {id: -1, level: 0, name: "", roleid: ""} as iRole}) + } + })} + } as iTopbarButton, + m("i.material-icons", "add") + ), + m(TopbarButton, + { + onclick: () => {m.mount(gridMountpoints.modalhook, DeleteRolesMessage)} + } as iTopbarButton, + m("i.material-icons", "delete_forever") + ), + m(TopbarButton, + { + onclick: () => { + let roles: iRole[] = [] + localDataModel.rolenodes.forEach((rolenode: Treenode) => { + if (rolenode.isChecked) { + roles.push(rolenode.nodevalue) + } + }) + if (roles.length != 1) { + m.mount(gridMountpoints.modalhook, WrongRoleEditSelectionMessage) + } + else { + m.mount(gridMountpoints.modalhook, { + view: (vnode) => { + return m(RoleForm, { + role: roles[0] as iRole + }) + } + }) + } + } + } as iTopbarButton, + m("i.material-icons", "edit") + ) + ) + ), + m("div.w3-cell.w3-padding.w3-mobile", + m("h1", "Anwendungen"), + m(Treetable, + { + treenodes: localDataModel.appnodes, + startexpanded: true, + columnmapper: (node: iTreenode) => { + let cols: any[] = [] + // Hier wird "Duck-Typing" genutzt, um den Typ von node.nodevalue zu ermitteln + // Je nach Typ werden die Spalten der Tabelle dann anders befüllt + if (node.nodevalue['appid'] != undefined) { + let app = node.nodevalue as iApplication + cols[0] = "enabled" + cols[1] = app.appid + cols[2] = app.name + } + else if (node.nodevalue['roleid'] != undefined) { + let role = node.nodevalue as iRole + cols[0] = "disabled" + cols[1] = role.roleid + cols[2] = role.name + } + + return [ + m(cols[0] == "enabled"?"span.w3-button":"span", + { + style: {padding: '0px'}, + onclick: () => { + if (cols[0] == "enabled") { + node.isChecked = !node.isChecked + } + } + }, + m("i.material-icons.w3-theme-light", node.isChecked?"check_box":"check_box_outline_blank") + ), + m("div", cols[1]), + m("div", cols[2]) + ] + + } + } as iTreetable, + m(TopbarButton, + { + onclick: applyRoles, + tooltip: MOVERIGHT + } as iTopbarButton, + m("i.material-icons", "keyboard_double_arrow_right") + ), + m(TopbarButton, + { + onclick: () => {m.mount(gridMountpoints.modalhook, + { + view: (vnode) => { + return m(ApplicationForm, {application: {id: -1} as iApplication} as iApplicationForm) + } + } + )} + } as iTopbarButton, + m("i.material-icons", "add") + ), + m(TopbarButton, + { + onclick: () => {m.mount(gridMountpoints.modalhook, DeleteApplicatonsMessage)} + } as iTopbarButton, + m("i.material-icons", "delete_forever") + ), + m(TopbarButton, + { + onclick: () => { + let apps: iApplication[] = [] + localDataModel.appnodes.forEach((appnode: Treenode) => { + if (appnode.isChecked) { + apps.push(appnode.nodevalue) + } + }) + if (apps.length != 1) { + m.mount(gridMountpoints.modalhook, WrongApplicationEditSelectionMessage) + } + else { + m.mount(gridMountpoints.modalhook, { + view: (vnode) => { + return m(ApplicationForm, { + application: apps[0] as iApplication + } as iApplicationForm) + } + }) + } + } + } as iTopbarButton, + m("i.material-icons", "edit") + ) + ) + ) + ) + ) + ) + } + } +} + +function sortRoleNodes(node1: iTreenode, node2: iTreenode) { + // es soll zuerst nach Level und dann nach rowid sortiert werden + let v1 = (node1.nodevalue['level'].toString().padStart(6,'0') + node1.nodevalue['roleid']).toLocaleLowerCase('de-de') + let v2 = (node2.nodevalue['level'].toString().padStart(6,'0') + node2.nodevalue['roleid']).toLocaleLowerCase('de-de') + if (v1 < v2) { + return -1 + } + if (v1 > v2) { + return 1 + } + return 0 +} + +function applyRoles() { + let checkedApps = localDataModel.appnodes.filter((appnode: iTreenode) => { + return appnode.isChecked + }) + if (checkedApps.length == 0) { + m.mount(gridMountpoints.modalhook, ErrorMessage) + return + } + + m.mount(gridMountpoints.modalhook, {view: () => {return m(ApplyRolesWarning, {applyroles: doit})}}) + + function doit() { + checkedApps.forEach((appnode: iTreenode) => { + localDataModel.rolenodes.forEach((rolenode: iTreenode) => { + let approle: iTreenode = appnode.children.find((child: iTreenode) => { + return child.nodevalue['roleid'] === rolenode.nodevalue['roleid'] + }) + if (approle != undefined) { + approle.isChecked = rolenode.isChecked + } + else if (rolenode.isChecked) { + let newapprole = new Treenode(rolenode.nodevalue, false, []) + newapprole.isChecked = rolenode.isChecked + appnode.children.push(newapprole) + } + }) + }) + localDataModel.updateApplicationRoles() + } +} + +const ErrorMessage: m.Component = { + view: (vnode) => { + return ( + m(ModalView, + { + title: "Fehler", + type: ModalType.ERROR, + width: '33%' + } as iModalView, + m("p", "Es wurden noch keine Ziel-Anwendungen markiert!"), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", {onclick: () => {m.mount(gridMountpoints.modalhook, null)}}, "OK"), + ] + ) + ) + ) + } +} + +export interface iApplyRolesWaring { + applyroles: Function +} +const ApplyRolesWarning: m.Component = { + view: (vnode) => { + return ( + m(ModalView, + { + title: "Hinweis", + type: ModalType.MESSAGE, + width: '33%' + } as iModalView, + m("p", "Wenn Rollen nicht ausgewählt sind bedeutet dies, dass die Rollen in den ausgewählten Anwendungen gelöscht werden!"), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", {onclick: () => {m.mount(gridMountpoints.modalhook, null)}}, "Abbruch"), + m("button.w3-button.w3-theme.w3-right", {onclick: () => {m.mount(gridMountpoints.modalhook, null); vnode.attrs.applyroles()}}, "OK"), + ] + ) + ) + ) + } +} + +const WrongRoleEditSelectionMessage: m.Component = { + view: () => { + return m(WrongEditSelectionMessage, {elementname: "Rolle"} as iWrongEditSelectionMessage) + } +} +const WrongApplicationEditSelectionMessage: m.Component = { + view: () => { + return m(WrongEditSelectionMessage, {elementname: "Anwendung"} as iWrongEditSelectionMessage) + } +} + +const DeleteRolesMessage: m.ClosureComponent = (vnode) => { + let roles: iRole[] + return { + oninit: (vnode) => { + roles = [] + localDataModel.rolenodes.forEach((rolenode: iTreenode) => { + if (rolenode.isChecked) { + roles.push(rolenode.nodevalue) + } + }) + }, + view: (vnode) => { + return ( + m(ModalView, + { + title: "Rollen löschen", + type: ModalType.MESSAGE, + width: '33%' + } as iModalView, + m("p", "Sie wollen die folgenden Rollen löschen:"), + m("ul", + roles.map((role: iRole) => { + return m("li", role.roleid) + }) + ), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", + { + style: {'margin-left': '4px'}, + onclick: () => { + localDataModel.deleteRoles(roles); + m.mount(gridMountpoints.modalhook, null) + }}, "Löschen"), + m("button.w3-button.w3-theme.w3-right", {onclick: () => {m.mount(gridMountpoints.modalhook, null)}}, "Abbrechen"), + ] + ) + ) + ) + } + } +} + + +interface iRoleForm { + role: iRole +} +const RoleForm: m.ClosureComponent = () => { + let form: HTMLFormElement = null; + let currentrole: iRole + function reset (e) { + form.reset() + } + function unmount () { + m.mount(gridMountpoints.modalhook, null) + } + function submit (e) { + e.preventDefault() + let formdata: FormData = new FormData(e.target as HTMLFormElement) + + for (let element of formdata) { + currentrole[element[0]] = element[1] + } + localDataModel.updateRole(currentrole) + unmount() + } + return { + view: (vnode) => { + currentrole = (vnode.attrs.role === undefined) ? {} as iRole : vnode.attrs.role + return m(ModalView, + { + title: "Rolle", + type: ModalType.MESSAGE, + width: 'max-content' + } as iModalView, + + m("form.w3-padding-16", {oncreate: (vnode) => {form = vnode.dom as HTMLFormElement}, onsubmit: submit}, + m("label", "ID (intern)"), + m("div.w3-padding-small", currentrole.id), + m("label", "Rollen-ID"), + m("input.w3-input.w3-border", {name: 'roleid', type: 'text', value: currentrole.roleid}), + m("label", "Name"), + m("input.w3-input.w3-border", {name: 'name', type: 'text', value: currentrole.name}), + m("label", "Level"), + m("input.w3-input.w3-border", {name: 'level', type: 'number', value: currentrole.level}), + m("label", "Beschreibung"), + m("input.w3-input.w3-border", {name: 'beschreibung', type: 'text', value: currentrole.beschreibung}), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, type: "submit"}, "Speichern"), + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, onclick: unmount, type: "button"}, "Abbrechen"), + m("button.w3-button.w3-theme.w3-right", {onclick: reset, type: "button"}, "Zurücksetzen") + + ] + ) + ) + ) + } + } +} + +interface iApplicationForm { + application: iApplication +} +const ApplicationForm: m.ClosureComponent = () => { + let form: HTMLFormElement = null; + let currentapp: iApplication + let isDirty = false + function reset (e) { + form.reset() + } + function unmount () { + if (isDirty) { + alert("is Dirty") + } + m.mount(gridMountpoints.modalhook, null) + } + function submit (e) { + e.preventDefault() + let formdata: FormData = new FormData(e.target as HTMLFormElement) + + for (let element of formdata) { + currentapp[element[0]] = element[1] + } + localDataModel.updateApplication(currentapp) + unmount() + } + return { + view: (vnode) => { + currentapp = (vnode.attrs.application === undefined) ? {} as iApplication : vnode.attrs.application + return m(ModalView, + { + title: "Anwendung", + type: ModalType.MESSAGE, + width: 'max-content' + } as iModalView, + + m("form.w3-padding-16", {oncreate: (vnode) => {form = vnode.dom as HTMLFormElement}, onsubmit: submit}, + m("label", "ID (intern)"), + m("div.w3-padding-small", currentapp.id), + m("label", "Application-ID"), + m("input.w3-input.w3-border", {name: 'appid', type: 'text', value: currentapp.appid}), + m("label", "Name"), + m("input.w3-input.w3-border", {name: 'name', type: 'text', value: currentapp.name}), + m("label", "Minimum-Version"), + m("input.w3-input.w3-border", {name: 'minversion', type: 'text', value: currentapp.minversion}), + m("label", "Beschreibung"), + m("input.w3-input.w3-border", {name: 'beschreibung', type: 'text', value: currentapp.beschreibung}), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, type: "submit"}, "Speichern"), + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, onclick: unmount, type: "button"}, "Abbrechen"), + m("button.w3-button.w3-theme.w3-right", {onclick: reset, type: "button"}, "Zurücksetzen") + + ] + ) + ) + ) + } + } +} + +const DeleteApplicatonsMessage: m.ClosureComponent = (vnode) => { + let apps: iApplication[] + return { + oninit: (vnode) => { + apps = [] + localDataModel.appnodes.forEach((appnode: iTreenode) => { + if (appnode.isChecked) { + apps.push(appnode.nodevalue) + } + }) + }, + view: (vnode) => { + return ( + m(ModalView, + { + title: "Anwendungen löschen", + type: ModalType.MESSAGE, + width: '33%' + } as iModalView, + m("p.w3-panel.w3-red", + [ + "Vor dem Löschen muss sichergestellt sein, dass es noch mindestens eine App gibt, in der die Rolle 'SysAdmin' ", + "vergeben ist und in der ein Benutzer diese Rolle besitzt!" + ] + ), + m("p", "Sie wollen die folgenden Anwendungen löschen:"), + m("ul", + apps.map((app: iApplication) => { + return m("li", app.appid) + }) + ), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", + { + style: {'margin-left': '4px'}, + onclick: () => { + localDataModel.deleteApplications(apps); + m.mount(gridMountpoints.modalhook, null) + }}, "Löschen"), + m("button.w3-button.w3-theme.w3-right", {onclick: () => {m.mount(gridMountpoints.modalhook, null)}}, "Abbrechen"), + ] + ) + ) + ) + } + } +} \ No newline at end of file diff --git a/Client/Components/auth/appmanagementpage.ts b/Client/Components/auth/appmanagementpage.ts new file mode 100644 index 0000000..715dbfa --- /dev/null +++ b/Client/Components/auth/appmanagementpage.ts @@ -0,0 +1,40 @@ +import m from "mithril" +import { get_menustack, menubar } from "../header" +import { userlist } from "./userpage" +import { applicationpage } from "./applicationpage" + +let mountpoint = null + +function close_page() { + get_menustack().pop() + m.route.set("/blankpage") +} +function show_userlist() { + m.mount(mountpoint, userlist) +} +function show_applist() { + m.mount(mountpoint, applicationpage) +} + +export const appmanagementpage: m.Component = { + oncreate: (vnode) => { + mountpoint = vnode.dom + }, + oninit: (vnode) => { + get_menustack().push(menu) + }, + view: (vnode) => { + return m("div", m(userlist)) + } +} + +const menu: m.Component = { + view: (vnode) => { + return m(menubar, [ + m("a.w3-button", {onclick: show_userlist}, "Benutzer"), + sessionStorage.getItem("CurrentUserIsSysAdmin") != null ? + m("div.w3-button", {onclick: show_applist}, "Anwendungen"):null, + m("div.w3-button.w3-right", {onclick: close_page}, "Beenden"), + ]) + } +} \ No newline at end of file diff --git a/Client/Components/auth/authmessages.ts b/Client/Components/auth/authmessages.ts new file mode 100644 index 0000000..cb2e0b6 --- /dev/null +++ b/Client/Components/auth/authmessages.ts @@ -0,0 +1,76 @@ +import m from "mithril" +import { gridMountpoints } from "../mainlayout" +import {ModalType, ModalView, iModalView} from "../widgets/Modal" + + +export interface iWrongEditSelectionMessage{ + elementname: string +} +export const WrongEditSelectionMessage: m.Component = { + view: (vnode) => { + return ( + m(ModalView, + { + title: "Falsche Auswahl", + type: ModalType.ERROR, + width: '33%' + } as iModalView, + m("p", `Zum Editieren muss genau 1 ${vnode.attrs.elementname} ausgewählt sein!`), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", {onclick: () => {m.mount(gridMountpoints.modalhook, null)}}, "OK"), + ] + ) + ) + ) + } +} + +export interface iServerErrorMessage { + error: { + messages: string[], + status: number + } +} +export const ServerErrorMessage: m.Component = { + view: (vnode) => { + return ( + m(ModalView, + { + title: "Fehler", + type: ModalType.ERROR, + width: "33%" + } as iModalView, + m("div.w3-panel", + vnode.attrs.error.messages.map((message) => { + return m("div", message) + }), + m("div.w3-small", `(HTML-Status: ${vnode.attrs.error.status})`) + ), + m("div.w3-bar.w3-padding-16", + m("button.w3-button.w3-theme.w3-right", {onclick: () => {m.mount(gridMountpoints.modalhook, null)}}, "OK"), + ) + ) + ) + } +} + +export function showServerError (e) { + let servererror:iServerErrorMessage = {error: {messages:[], status: e.code}} + console.log(JSON.stringify(e), e.message) + if (e.response != undefined && e.response["messages"] != undefined) { + if (!Array.isArray(e.response["messages"])) { + e.response["messages"] = [e.response["messages"]] + } + servererror.error.messages = e.response.messages + } + else if (e.response != undefined) { + servererror.error.messages = [JSON.stringify(e.response)] + } + else { + servererror.error.messages = [JSON.stringify(e)] + } + m.mount(gridMountpoints.modalhook, { + view: () => {return m(ServerErrorMessage, {error: servererror.error } as iServerErrorMessage)} + }) +} \ No newline at end of file diff --git a/Client/Components/auth/login.ts b/Client/Components/auth/login.ts new file mode 100644 index 0000000..a379855 --- /dev/null +++ b/Client/Components/auth/login.ts @@ -0,0 +1,117 @@ +import m from "mithril"; +import {ModalView, iModalView} from "../widgets/Modal" +import {iUser} from "./models/users" +import {showServerError} from "./authmessages" +import { headerdata } from "../header"; + +export interface iLoginscreen { + setnextpage: string +} +export const loginscreen: m.ClosureComponent = (vnode) => { + let form: HTMLFormElement = null; + function reset (e) { + form.reset() + } + function checklogin(e: Event) { + e.preventDefault() + let formdata: FormData = new FormData(e.target as HTMLFormElement) + let user: iUser + m.request ({ + method: "POST", // Hier muss POST verwendet werden, weil GET keinen Body hat und Parameter nur im URL transportieren kann + url: "/auth/checklogin", + body: Object.fromEntries(formdata.entries()) + }) + .then((result) => { + user = result as iUser; + // global.appglobals.currentuser = user.username + // global.appglobals.currentuserid = user.userid + sessionStorage.setItem("CurrentUser", user.username); + headerdata.username = user.username + headerdata.userid = user.userid + // nur wenn es sich um einen SysAdmin handelt, wird der SessionStorage gesetzt. Will man später wissen, + // ob der aktuelle User ein SysAdmin ist, braucht man nur auf das Vorhandensein des Schlüssels abzufragen + // und nicht auch noch auf den Inhalt + if (user.isSysAdmin) { + sessionStorage.setItem("CurrentUserIsSysAdmin", "1"); + } + }) + .then(() => {m.route.set(vnode.attrs.setnextpage)}) + .catch((error) => { + sessionStorage.removeItem("CurrentUser"); + sessionStorage.removeItem("CurrentUserIsSysAdmin"); + showServerError(error) + }) + + } + return { + oninit: (vnode) => { + m.request({ + method: "GET", + url: "/auth/logout" + }) + .then (() => { + sessionStorage.removeItem("CurrentUser"); + sessionStorage.removeItem("CurrentUserIsSysAdmin"); + // global.appglobals.currentuser = "nicht angemeldet" + // global.appglobals.currentuserid = "" + }) + }, + view: (vnode) => { + return m(ModalView, {title: "Login", width: '33%'} as iModalView, + m("form.w3-padding-16", {oncreate: (vnode) => {form = vnode.dom as HTMLFormElement}, onsubmit: checklogin}, + m("label", "Benutzer-ID"), + m("input.w3-input.w3-border", {name: 'userid', type: 'text'}), + m("label", "Kennwort"), + m("input.w3-input.w3-border", {name: 'password', type: 'password'}), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, type: "submit"}, "Login"), + m("button.w3-button.w3-theme.w3-right", {onclick: reset, type: "button"}, "Zurücksetzen"), + ] + ) + ) + ) + } + } +} + +export const changepasswordscreen: m.ClosureComponent = () => { + let form: HTMLFormElement = null; + function reset (e) { + form.reset() + } + function changepassword(e) { + e.preventDefault() + let formdata: FormData = new FormData(e.target as HTMLFormElement) + m.request ({ + method: "POST", // Hier muss POST verwendet werden, weil GET keinen Body hat und Parameter nur im URL transportieren kann + url: "/auth/changepassword", + body: Object.fromEntries(formdata.entries()) + }) + .then(() => {m.route.set("/login")}) + .catch((e) => {showServerError(e)}) + } + return { + view: (vnode) => { + return m(ModalView, {title: "Kennwort ändern", width: '33%'} as iModalView, + m("form.w3-padding-16", {oncreate: (vnode) => {form = vnode.dom as HTMLFormElement}, onsubmit: changepassword}, + m("label", "Benutzer-ID"), + m("input.w3-input.w3-border", {name: 'Userid', type: 'text', value: headerdata.userid, readonly: true}), + m("label", "Altes Kennwort"), + m("input.w3-input.w3-border", {name: 'OldPassword', type: 'password'}), + m("label", "Neues Kennwort"), + m("input.w3-input.w3-border", {name: 'NewPassword1', type: 'password'}), + m("label", "Neues Kennwort"), + m("input.w3-input.w3-border", {name: 'NewPassword2', type: 'password'}), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, type: "submit"}, "Kennwort ändern"), + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, onclick: reset, type: "button"}, "Zurücksetzen"), + m("button.w3-button.w3-theme.w3-right", {onclick: () => {history.back()}, type: "button"}, "Abbrechen"), + ] + ) + ) + ) + } + } +} diff --git a/Client/Components/auth/models/applications.ts b/Client/Components/auth/models/applications.ts new file mode 100644 index 0000000..c36cc6c --- /dev/null +++ b/Client/Components/auth/models/applications.ts @@ -0,0 +1,18 @@ +import {iRole} from "./roles" + +export interface iApplication { + id: number + appid: string + name: string + minversion: string + beschreibung: string + roles: iRole[] +} + +export interface iUserApp { + id: number + userid: number + appid: number + userapp_roles : iRole[] +} + diff --git a/Client/Components/auth/models/roles.ts b/Client/Components/auth/models/roles.ts new file mode 100644 index 0000000..a41777d --- /dev/null +++ b/Client/Components/auth/models/roles.ts @@ -0,0 +1,8 @@ +export interface iRole { + id: number + roleid: string + name: string + level: number + beschreibung: string +} + diff --git a/Client/Components/auth/models/users.ts b/Client/Components/auth/models/users.ts new file mode 100644 index 0000000..c92aad6 --- /dev/null +++ b/Client/Components/auth/models/users.ts @@ -0,0 +1,24 @@ +import { iUserApp } from "./applications" +import { iRole } from "./roles" + +export interface iUser { + id: number + userid: string + username: string + password: string + email: string + telefon: string + isSysAdmin: boolean + userapps: iUserApp[] +} + +export function hasAppRole(user: iUser, appid: number, roleid: number) { + let userapp: iUserApp = user.userapps.find((userapp: iUserApp) => {return userapp.appid == appid}) + if (userapp != undefined) { + let userapprole: iRole = userapp.userapp_roles.find((role: iRole) => {return role.id == roleid}) + if (userapprole != undefined) { + return true + } + } + return false +} \ No newline at end of file diff --git a/Client/Components/auth/userpage.ts b/Client/Components/auth/userpage.ts new file mode 100644 index 0000000..4ff0aa5 --- /dev/null +++ b/Client/Components/auth/userpage.ts @@ -0,0 +1,364 @@ +import m from "mithril" +import {hasAppRole, iUser} from "./models/users" +import {iApplication} from "./models/applications" +import {iRole} from "./models/roles" +import {Treenode, iTreenode, Treetable, iTreetable, TopbarButton, iTopbarButton} from "../widgets/Treetable_V2" +import {gridMountpoints, maingrid} from "../mainlayout" +import {ModalView, ModalType, iModalView} from "../widgets/Modal" +import { iWrongEditSelectionMessage, WrongEditSelectionMessage, showServerError} from "./authmessages" + + +interface iTabelrow { + rowtype: any + col1: any + cols: any[] + info?: { + parentuserid: number + parentappid: number + roleid: number + ischecked: boolean + } +} + +const localDataModel = { + userlist: [] as iUser[], + applist: [] as iApplication[], + usernodes: [] as iTreenode[], + startexpanded: false, + loadData: () => { + Promise.all([ + m.request({ + method: "GET", + url: "/auth/getusers" + }).then((result) => localDataModel.userlist = result as iUser[]), + m.request({ + method: "GET", + url: "/auth/getapplications" + }).then((result) => localDataModel.applist = result as iApplication[]), + ]) + .then(() => { + localDataModel.usernodes = [] + localDataModel.userlist.map((u) => { + let userrow: iTabelrow = { + rowtype: 'user', + col1: u.userid, + cols: [u.username, u.email, u.telefon] + } + let usernode: iTreenode = new Treenode(userrow, localDataModel.startexpanded, []) + localDataModel.applist.forEach((app: iApplication) => { + let approw: iTabelrow = { + rowtype: "app", + col1: app.appid, + cols: [app.name, app.minversion], + info: { + ischecked: false, + parentuserid: u.id, + parentappid: null, + roleid: null + } + + } + let appnode: Treenode = new Treenode(approw, localDataModel.startexpanded, []) + app.roles.forEach((role: iRole) => { + let ischecked = hasAppRole(u, app.id, role.id) + let rolerow: iTabelrow = { + rowtype: "role", + col1: role.name, + cols: [role.roleid], + info: { + parentuserid: u.id, + parentappid: app.id, + ischecked: ischecked, + roleid: role.id + } + } + let rolenode: iTreenode = new Treenode(rolerow, localDataModel.startexpanded, []) + appnode.children.push(rolenode) + }) + usernode.children.push(appnode) + }) + localDataModel.usernodes.push(usernode) + }) + }) + .catch((e) => { + if (e.code == 401) { + m.route.set("/login") + } + }) + }, + updateUser: (user: iUser) => { + m.request ({ + method: "POST", // Hier muss POST verwendet werden, weil GET keinen Body hat und Parameter nur im URL transportieren kann + url: "/auth/updateuser", + body: user + }) + .catch((e) => {showServerError(e)}) + .finally(() => localDataModel.loadData()) + }, + deleteUsers: (users: iUser[]) => { + m.request({ + method: "POST", + url: "/auth/deleteusers", + body: users.map((u: iUser) => {return u.userid}) + }) + .catch((e) => {showServerError(e)}) + .finally(() => localDataModel.loadData()) + }, + applyUserAppRole: (tablerow: iTabelrow) => { + m.request ({ + method: "POST", + url: "/auth/applyuserapprole", + body: tablerow.info + }) + .catch((e) => {showServerError(e); localDataModel.loadData()}) + } +} + +export const userlist: m.ClosureComponent = (vnode) => { + return { + oninit: (vnode) => { + localDataModel.loadData() + }, + view: (vnode) => { + return m("div.w3-container.w3-content", {style: {'max-width': 'min-content', display: 'flex', 'flex-direction': 'column', height: 'inherit', 'overflow-y': 'inherit'}}, + m("h1", "Benutzerliste"), + m("div", {style: {flex: '1', 'overflow-y': 'inherit'}}, + m(Treetable, + { + startexpanded: localDataModel.startexpanded, + treenodes: localDataModel.usernodes, + columnmapper: (node: iTreenode) => { + let row: iTabelrow = node.nodevalue + let isChecked = hasCheckedChilds(node) + if (row.rowtype == "user") { + return [ + m("strong", row.col1), + m("strong", row.cols[0]), + m(isChecked?"div.w3-text-green":"div.w3-text-red", {style: {display: 'flex'}}, + // m("div", {style: {padding: '0px', height:'24px', width: '24px'}}, + // m("i.material-icons", isChecked?null:"dangerous"), + // ), + m("div", isChecked?"aktiv":"inaktiv") + ), + m("div.w3-small", + m("div", row.cols[1]), + m("div", row.cols[2]) + ), + m(EditUserButton, {userid: row.col1} as iEditUserButton), + m(DeleteUserButton, {userid: row.col1} as iDeleteUserButton) + ] + } + else if (row.rowtype == "role") { + return [ + m("span.w3-small", row.col1), + m("span.w3-button", { + style: {padding: '0px'}, + onclick: () => { + row.info.ischecked = !row.info.ischecked + localDataModel.applyUserAppRole(row) + } + }, + m("i.material-icons.w3-theme-light", row.info.ischecked?"check_box":"check_box_outline_blank") + ), + m("span.w3-small", row.cols[0]), + m("span.w3-small", row.cols[1]), + m("span", ""), + m("span", "") + ] + } + else { + // rowtype "app" + let isChecked = hasCheckedChilds(node) + return [ + m(isChecked?"span":"strong.w3-text-red", row.col1), + m("div", {style: {padding: '0px', height:'24px', width: '24px'}}, + m("i.material-icons", isChecked?"check":null) + ), + m("span", row.cols[0]), + m("span", row.cols[1]), + m("span", ""), + m("span", "") + ] + } + } + } as iTreetable, + m(TopbarButton, { + onclick: () => { + m.mount(gridMountpoints.modalhook, { + view: (vnode) => { + return m(UserForm, {user: {id: -1} as iUser}) + } + }) + }} as iTopbarButton, + m("i.material-icons", "add") + ) + ) + ) + ) + } + } +} + +function hasCheckedChilds(parenttreenode: iTreenode): boolean { + return parenttreenode.children.some((treenode: iTreenode) => { + if (treenode.hasChildren) { + return hasCheckedChilds(treenode) + } + let tablerow = treenode.nodevalue as iTabelrow + return tablerow.info.ischecked + }) +} + +interface iUserForm { + user: iUser +} +const UserForm: m.ClosureComponent = () => { + let form: HTMLFormElement = null; + let currentuser: iUser + function reset (e) { + form.reset() + } + function unmount () { + m.mount(gridMountpoints.modalhook, null) + } + function submit (e) { + e.preventDefault() + let formdata: FormData = new FormData(e.target as HTMLFormElement) + + for (let element of formdata) { + currentuser[element[0]] = element[1] + } + localDataModel.updateUser(currentuser) + unmount() + } + return { + oninit: (vnode) => { + currentuser = (vnode.attrs.user === undefined) ? {} as iUser : vnode.attrs.user + }, + view: (vnode) => { + return m(ModalView, + { + title: "Benutzer", + type: ModalType.MESSAGE, + width: 'max-content' + } as iModalView, + + m("form.w3-padding-16", {oncreate: (vnode) => {form = vnode.dom as HTMLFormElement}, onsubmit: submit}, + m("label", "ID (intern)"), + m("div.w3-padding-small", currentuser.id), + m("label", "Benutzer-ID"), + m("input.w3-input.w3-border", {name: 'userid', type: 'text', value: currentuser.userid}), + m("label", "Name"), + m("input.w3-input.w3-border", {name: 'username', type: 'text', value: currentuser.username}), + m("label", "E-Mail"), + m("input.w3-input.w3-border", {name: 'email', type: 'email', value: currentuser.email}), + m("label", "Telefon"), + m("input.w3-input.w3-border", {name: 'telefon', type: 'tel', value: currentuser.telefon}), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, type: "submit"}, "Speichern"), + m("button.w3-button.w3-theme.w3-right", {style: {'margin-left': '4px'}, onclick: unmount, type: "button"}, "Abbrechen"), + m("button.w3-button.w3-theme.w3-right", {onclick: reset, type: "button"}, "Zurücksetzen") + + ] + ) + ) + ) + } + } +} + +const WrongUserEditSelectionMessage: m.Component = { + view: () => { + return m(WrongEditSelectionMessage, {elementname: "Benutzer"} as iWrongEditSelectionMessage) + } +} + +interface iDeleteUsersMessage { + userid: string +} +const DeleteUsersMessage: m.ClosureComponent = (vnode) => { + let users: iUser[] + return { + oninit: (vnode) => { + users = localDataModel.userlist.filter((u: iUser) => { + return u.userid == vnode.attrs.userid + }) + }, + view: (vnode) => { + return ( + m(ModalView, + { + title: "Benutzer löschen", + type: ModalType.MESSAGE, + width: '33%' + } as iModalView, + m("p", "Sie wollen den folgenden Benutzer löschen:"), + m("ul", + users.map((user: iUser) => { + return m("li", `${user.userid} (${user.username})`) + }) + ), + m("div.w3-bar.w3-padding-16", + [ + m("button.w3-button.w3-theme.w3-right", + { + style: {'margin-left': '4px'}, + onclick: () => { + localDataModel.deleteUsers(users); + m.mount(gridMountpoints.modalhook, null) + }}, "Löschen"), + m("button.w3-button.w3-theme.w3-right", {onclick: () => {m.mount(gridMountpoints.modalhook, null)}}, "Abbrechen"), + ] + ) + ) + ) + } + } +} + +interface iDeleteUserButton { + userid: string +} +export const DeleteUserButton: m.ClosureComponent = () => { + return { + view: (vnode) => { + return m("button.w3-button.w3-bar-item", { + style: {'min-width': '24px', height: '24px', padding: '0'}, + onclick: () => { + m.mount(gridMountpoints.modalhook, {view: () => { + return m(DeleteUsersMessage, {userid: vnode.attrs.userid} as iDeleteUsersMessage) + }}) + }, + title: "Benutzer löschen" + }, + m("i.material-icons", "delete_forever") + ) + } + } +} +interface iEditUserButton { + userid: string +} +export const EditUserButton: m.ClosureComponent = () => { + return { + view: (vnode) => { + return m("button.w3-button.w3-bar-item", { + style: {'min-width': '24px', height: '24px', padding: '0'}, + onclick: () => { + let users: iUser[] = localDataModel.userlist.filter((u:iUser) => { + return u.userid == vnode.attrs.userid + }) + m.mount(gridMountpoints.modalhook, {view: () => { + return m(UserForm, {user: users[0]} as iUserForm) + }}) + }, + title: "Benutzer bearbeiten" + }, + m("i.material-icons", "edit") + ) + } + } +} + + diff --git a/Client/Components/header.ts b/Client/Components/header.ts new file mode 100644 index 0000000..552087f --- /dev/null +++ b/Client/Components/header.ts @@ -0,0 +1,74 @@ +import m from "mithril" + +export var headerdata = { + date: new Date(), + version: "", + username: "Nicht angemeldet", + userid: "Nicht angemeldet", + appheader: "Der gläserne Kunde" +} + +export const header: m.Component = { + view: (vnode) => { + return m("div.w3-row-padding.w3-theme", + m("div.w3-twothird.w3-padding-16", {style: "display: flex; justify-content: space-between;"}, + // Beschreibung des Bildes + m("img", {src: "static/KBplus-Logo.png", height: 80, alt: "KBPlus CRM Logo"}), + m("h1", + m("div.w3-cell", headerdata.appheader) + ) + ), + m("div.w3-third.w3-display-container.w3-small", + m("table.w3-right", + m("tr.w3-hide-small", + m("td", "Datum:"), + m("td", headerdata.date.toLocaleDateString()) + ), + m("tr.w3-hide-small", + m("td", "Version:"), + m("td", headerdata.version) + ), + m("tr", + m("td", "Benutzer:"), + m("td", headerdata.username) + ) + ) + ) + ) + } +} + +export const menubar: m.Component = { + view: (vnode) => { + return m("div.w3-bar.w3-black", + vnode.children + ) + } +} + +let menustack: MenuStack = null + +export function init_menustack(menubarmountpoint):void { + if (menustack == null) {menustack = new MenuStack(menubarmountpoint)} +} +export function get_menustack(): MenuStack { + return menustack +} + +class MenuStack { + private menustack = [] + private menubarmountpoint = null + constructor(menubarmountpoint) { + this.menustack = [] + this.menubarmountpoint = menubarmountpoint + } + push(menubar) { + this.menustack.push(menubar) + m.mount(this.menubarmountpoint, menubar) + } + pop() { + this.menustack.pop() + let menubar = this.menustack[this.menustack.length - 1] + m.mount(this.menubarmountpoint, menubar) + } +} diff --git a/Client/Components/kunde.ts b/Client/Components/kunde.ts new file mode 100644 index 0000000..a193151 --- /dev/null +++ b/Client/Components/kunde.ts @@ -0,0 +1,18 @@ +import m from "mithril" +import {Form, iForm} from "./widgets/form" +import { Input, iInput} from "./widgets/inputs" + +export const kunde: m.Component = { + view: (vnode) => { + return m("div.w3-container.w3-twothird", + m("h1", "Kundenstammblatt"), + m(Form, {showButtons: true, onsubmit: (null), oncancel: (null)} as iForm, [ + m("label", "Kundenname (ganz neu)", m(Input, {name: "kundenname", value: "Musterfirma GmbH", type: "text"} as iInput)), + m("label", "Straße", m(Input, {name: "strasse", value: "Musterstraße 1", type: "text"} as iInput)) , + m("label", "PLZ", m(Input, {name: "plz", value: "12345", type: "text"} as iInput)), + m("label", "Ort", m(Input, {name: "ort", value: "Musterstadt", type: "text"} as iInput)), + m("label", "Land", m(Input, {name: "land", value: "Deutschland", type: "text"} as iInput)) + ]) + ) + } +} \ No newline at end of file diff --git a/Client/Components/mainlayout.ts b/Client/Components/mainlayout.ts new file mode 100644 index 0000000..1b75f8f --- /dev/null +++ b/Client/Components/mainlayout.ts @@ -0,0 +1,50 @@ +import m from "mithril"; + +export var gridMountpoints = { + header: null, + menubar: null, + main: null, + modalhook: null +} +export const maingrid: m.ClosureComponent = (vnode) => { + let gridstyle = { + 'display': 'grid', + 'grid-template-rows': 'auto auto 1fr', + 'height': '100vh', + 'width': '100vw' + } + return { + view: (vnode) => { + return [ + m("div", {style: gridstyle}, + [ + m("div", { + oncreate: (vnode) => { gridMountpoints.header = vnode.dom }, + style: {'grid-row': '1'} + }), + m("div", { + oncreate: (vnode) => { gridMountpoints.menubar = vnode.dom }, + style: {'grid-row': '2'} + }), + m("div", + { + //oncreate: (vnode) => { gridMountpoints.main = vnode.dom }, + style: {'grid-row': "3", 'overflow-y': 'auto', 'height': '100%'} + }, + m("div", + { + oncreate: (vnode) => { gridMountpoints.main = vnode.dom }, + style: {'overflow-y': 'auto', height: 'inherit'} + } + ) + ) + ] + ), + m("div#modalhook", { + oncreate: (vnode) => { gridMountpoints.modalhook = vnode.dom} + }) + ] + } + } +} + diff --git a/Client/Components/projekt.ts b/Client/Components/projekt.ts new file mode 100644 index 0000000..8e46d82 --- /dev/null +++ b/Client/Components/projekt.ts @@ -0,0 +1,18 @@ +import m from "mithril" +import {Form, iForm} from "./widgets/form" +import { Input, iInput} from "./widgets/inputs" + +export const Projekt: m.Component = { + view: (vnode) => { + return m("div.w3-container.w3-twothird", + m("h1", "Projekt-Stammblatt"), + m(Form, {showButtons: true, onsubmit: (null), oncancel: (null)} as iForm, [ + m("label", "Kundenname", m(Input, {name: "kundenname", value: "Musterfirma GmbH", type: "text"} as iInput)), + m("label", "Projektname", m(Input, {name: "projektname", value: "Musterprojekt", type: "text"} as iInput)) , + m("label", "Zweck", m(Input, {name: "zweck", value: "Musterzweck", type: "text"} as iInput)), + m("label", "Verantwortlicher", m(Input, {name: "verantwortlicher", value: "König Dickbauch", type: "text"} as iInput)), + m("label", "Startdatum", m(Input, {name: "startdatum", value: "2023-01-01", type: "date"} as iInput)) + ]) + ) + } +} \ No newline at end of file diff --git a/Client/Components/widgets/Modal.ts b/Client/Components/widgets/Modal.ts new file mode 100644 index 0000000..226a609 --- /dev/null +++ b/Client/Components/widgets/Modal.ts @@ -0,0 +1,71 @@ +import m from "mithril" +import {BaseView} from "./base" + +export enum ModalType { + 'MESSAGE', + 'ERROR' +} + +export interface iModalView { + title: string + subtitle: string + topposition: string + width: string + type: ModalType +} +export class ModalView extends BaseView implements iModalView{ + title:string + subtitle:string + topposition:string + width:string + type:ModalType + + constructor (vnode) { + super() + this.title = super.getattr(vnode, "title", "Modal") + this.subtitle = super.getattr(vnode, "subtitle", "") + this.topposition = super.getattr(vnode, "topposition", "10%") + this.width = super.getattr(vnode, "width", 'max-content') + this.type = super.getattr(vnode, 'type', ModalType.MESSAGE) + } + view (vnode) { + return m("div.w3-modal", {style: {display:'block'}}, + m("div.w3-modal-content.w3-card-4", {style: {width: this.width, top: this.topposition}}, + [ + m(modalHeader, {type: this.type}, + [ + m(title, this.title), + (this.subtitle ? m(subtitle, this.subtitle) : null) + ] + ), + m(modalContent, vnode.children) + ] + ) + ) + } +} + +const title = { + view: (vnode) => { + return m("h1", vnode.children) + } +} +const subtitle = { + view: (vnode) => { + return m("h3", vnode.children) + } +} +const modalHeader = { + view: (vnode) => { + let color = ".w3-theme" + if (vnode.attrs["type"] == ModalType.ERROR) { + color = ".w3-red" + } + return m("header.w3-container" + color, vnode.children) + } +} +const modalContent = { + view: (vnode) => { + return m("div.w3-container.w3-theme-l1", vnode.children) + } +} diff --git a/Client/Components/widgets/Treetable_V2.ts b/Client/Components/widgets/Treetable_V2.ts new file mode 100644 index 0000000..7bc46b9 --- /dev/null +++ b/Client/Components/widgets/Treetable_V2.ts @@ -0,0 +1,231 @@ +import m from "mithril" + +export interface iTreenode { + nodevalue: any + children: iTreenode[] + expand: boolean + hasChildren: boolean + isChecked?: boolean +} + +export class Treenode implements iTreenode { + nodevalue:any = null + children: iTreenode[] = [] + expand: boolean = true + isChecked?: boolean = false + constructor(nodevalue: any = null, expand: boolean = false, children: iTreenode[] = [], isChecked: boolean = false) { + this.nodevalue = nodevalue + this.children = children + this.expand = expand + this.isChecked = isChecked + } + get hasChildren() { + return (this.children.length > 0) + } +} + +export interface Columnmapper { + (row:iTreenode) : any[] +} + +export interface iTreetable { + treenodes: iTreenode[] + columnmapper: Columnmapper + onRowMarked?: (node: iTreenode) => void + filter?: (row:iTreenode, searchvalue:string) => boolean +} + +export const Treetable: m.ClosureComponent = (vnode) => { + let onRowMarked = vnode.attrs.onRowMarked === undefined ? (node: iTreenode) => {} : vnode.attrs.onRowMarked + let expandtoggle: boolean = true + let searchvalue:string = "" + function setSearchvalue(v:string) { + searchvalue = v + } + return { + view: (vnode) => { + return m("div.w3-border-theme", {style: {height: '99%', overflow: 'hidden', 'border-style': 'solid', 'border-width': '1px'}}, + m("div.w3-bar.w3-theme", + m(TopbarButton, { + onclick: () => { + expandtoggle = true; changeTreenodes(vnode.attrs.treenodes, expandtoggle) + }}, + m("i.material-icons", "unfold_more") + ), + m(TopbarButton, { + onclick: () => { + expandtoggle = false; changeTreenodes(vnode.attrs.treenodes, expandtoggle) + }}, + m("i.material-icons", "unfold_less") + ), + vnode.children, + (vnode.attrs.filter != undefined) ? m(SearchField, {setSearchvalue: setSearchvalue} as iSearchfield) : null + ), + m("div", {style: {height: '100%'}}, + m("div", {style: {height: 'calc(100% - 32px', overflow: 'auto', width: '100%'}}, + m("table.w3-table", {style: {'overflow-y': 'auto'}}, + vnode.attrs.treenodes.map((tn:iTreenode, z) => { + if (vnode.attrs.filter == undefined || (vnode.attrs.filter != undefined && vnode.attrs.filter(tn, searchvalue) == true)) { + return m(Treerow, { + // ACHTUNG: Änderungen hier müssen unten beim rekursiven Aufruf der Treerow-Funktion ebenfalls eingebaut werden + treenode: tn, + level: 0, + columnmapper1: vnode.attrs.columnmapper, + onRowMarked: onRowMarked, + isEven: ((z % 2) == 0)} as iTreerow) + } + else { + return null + } + }) + ) + ) + ) + ) + } + } +} + +interface iTreerow { + treenode: iTreenode + level: number + columnmapper1: Columnmapper + onRowMarked: (node: iTreenode) => void + isEven?: boolean +} +let Treerow: m.ClosureComponent = (vnode) => { + + return { + view: (vnode) => { + return [ + m("tr.w3-border-theme", {onmouseup: () => vnode.attrs.onRowMarked(vnode.attrs.treenode), + onkeyup: () => vnode.attrs.onRowMarked(vnode.attrs.treenode), + class: (vnode.attrs.isEven ? "w3-tablerow-even" : "w3-tablerow-odd"), + style: {'border-top-style': 'solid', 'border-top-width': '1px'} + }, + m("td", // Zunächst wird ein td-Element für die erste Spalte der Tabelle erzeugt, damit dort die + // Einrückung in Abhängigkeit vom evtl. Vorhandensein von Kind-Elementen erledigt wird + m("div", {style: {width: 'max-content', 'margin-left': `${(vnode.attrs.level * 25)}px`}} , + vnode.attrs.treenode.hasChildren + // Wenn der Treenode Kinder hat, dann soll der "expand_more/expand_less"-Button + // angezeigt werden + ? m("span.w3-button", { + onclick: () => {changeTreenode(vnode.attrs.treenode, !vnode.attrs.treenode.expand)}, + style: {padding: '0px', + 'margin-right': '8px', + width: '24px', + height: '24px'}}, + m("i.material-icons", vnode.attrs.treenode.expand?"expand_more":"navigate_next") + ) + // Wenn der Trennode keine Kinder hat, dann soll kein "expand_more/expand_less"-Button + // angezeigt werden, allerdings soll durch 'margin-left' der entsprechende Platz des + // Buttons eingerückt werden, damit die Einrückungs-Level auch bei "kinderlosen" Treenodes + // denen der Trennodes mit Kindern entsprechen + : vnode.attrs.level == 0 + ? null // Wenn der kinderlos Treenode allerdings sirekt auf Level 0 ist, soll nocht + // eingerückt werden, da es bei Level 0 keine Eltern-Nodes mit Kindern und + // demzufolge mit "expand_more/expand_less"-Button gibt. + : m( + "span", { + style: {'margin-left': '24px', + 'margin-right': '8px'} + } + ), + // Nachdem die einrückung auf Grund der "hasChildren"-Abfrage erledigt ist, wird der Inhalt + // der ersten Spalte des Column-Mappers angezeigt + vnode.attrs.columnmapper1(vnode.attrs.treenode).splice(0,1) + ) + ), + // Dann werden die übrigen Spalten ganz normal als td-Elemente eingefügt + vnode.attrs.columnmapper1(vnode.attrs.treenode).splice(1).map((column) => { + return m("td", column) + }) + ), + // Falls der Trennode Kinder hat und expandiert werden soll, wird rekursiv die Trennode-Komponente für + // die Child-Nodes aufgerufen, ansonsten wir null zurückgegeben und die Einrückung hört auf + vnode.attrs.treenode.hasChildren && vnode.attrs.treenode.expand + ? vnode.attrs.treenode.children.map((tn: iTreenode, z) => { + return m(Treerow, { + treenode: tn, + level: vnode.attrs.level + 1, + columnmapper1: vnode.attrs.columnmapper1, + onRowMarked: vnode.attrs.onRowMarked, + isEven: ((z % 2) == 0) + } as iTreerow) + }) + : null + ] + } + } +} + +export interface iTopbarButton { + onclick: Function + tooltip?: string +} +export const TopbarButton: m.ClosureComponent = () => { + return { + view: (vnode) => { + return m("button.w3-button.w3-bar-item", { + style: {'min-width': '32px', height: '32px', padding: '4px'}, + onclick: vnode.attrs.onclick, + title: vnode.attrs.tooltip?vnode.attrs.tooltip:null + }, + vnode.children + ) + } + } +} + +/** Die Funktion kann aufgerufen werden, wenn eine Treenode-Struktur hinsichtlich + * "Expand more/less" geändert werden soll. + */ +export function changeTreenodes(treenodes: Treenode[], expand: boolean) { + treenodes.forEach((treenode: Treenode) => { + changeTreenode(treenode, expand) + if (treenode.hasChildren) { + changeTreenodes(treenode.children, expand) + } + }) +} +function changeTreenode(treenode: Treenode, expand: boolean) { + treenode.expand = expand +} + +interface iSearchfield { + setSearchvalue: (v:string) => void +} +const SearchField:m.ClosureComponent = (vnode) => { + let inputfield: HTMLInputElement|null = null + function oninput(e:Event) { + if (inputfield) { // ✅ Null-Check + let v:string = inputfield.value + vnode.attrs.setSearchvalue(v) + } + } + return { + view: (vnode) => { + return m("div", {style: {display: "flex", border: "1px solid black", margin: '1px'}}, + m("input.ggg-inputfocus", { + oncreate: (vnode) => { + inputfield = vnode.dom as HTMLInputElement + inputfield.focus() + }, + type:"text", + style: {flex: '1', border: 'none'}, oninput: oninput + }), + m("button.w3-button", { + style: {'min-width': '28px', height: '28px', padding: '4px', border: 'none'}, + onclick: () => { + if (inputfield) { // ✅ Null-Check + inputfield.value = "" + vnode.attrs.setSearchvalue("") + inputfield.focus() + } + }}, + m("i.material-icons", {style: {'font-size': 'medium'}}, "clear") + ) + ) + } + } +} \ No newline at end of file diff --git a/Client/Components/widgets/base.ts b/Client/Components/widgets/base.ts new file mode 100644 index 0000000..1494a9f --- /dev/null +++ b/Client/Components/widgets/base.ts @@ -0,0 +1,7 @@ +export class BaseView { + + getattr(vnode: any, attrname: string, defaultvalue: any) { + return vnode.attrs[attrname] === undefined ? defaultvalue : vnode.attrs[attrname] + } + +} \ No newline at end of file diff --git a/Client/Components/widgets/form.ts b/Client/Components/widgets/form.ts new file mode 100644 index 0000000..05ced96 --- /dev/null +++ b/Client/Components/widgets/form.ts @@ -0,0 +1,112 @@ +import m from "mithril" + +export interface iForm { + + onchanged?: (e:Event) => void + onsubmit: (form:HTMLFormElement) => boolean + oncancel: (e:Event) => void + showbuttons?: boolean + /** Die Funktion gibt das HTMLFormElement zurück, welches in der Form-Componente angelegt wird */ + onformcreate?: (form:HTMLFormElement) => void +} + +export const Form:m.ClosureComponent = (vnode) => { + let form: HTMLFormElement + let isDirty: boolean = false + let showButtons: boolean = vnode.attrs.showbuttons == undefined ? true : vnode.attrs.showbuttons + function canCloseForm(typ: string = "") { + if (!isDirty) { + return true + } + let text = (typ == "reset") ? "zurücksetzen" : "beenden" + return confirm (`Das Formular enthält noch ungespeicherte Eingaben. Wollen Sie das Formular trotzdem ${text}?`) + } + function onchanged (e:Event) { + isDirty = true + if (vnode.attrs.onchanged != undefined) { + vnode.attrs.onchanged(e) + } + } + function submit (e:Event) { + e.preventDefault() + if (vnode.attrs.onsubmit(form) == true) { + isDirty = false + } + } + function registerFormElement (f:HTMLFormElement) { + if (vnode.attrs.onformcreate != undefined) { + vnode.attrs.onformcreate(f) + } + } + function cancel(e:Event) { + e.preventDefault() + if (canCloseForm() == true) { + isDirty = false + if (vnode.attrs.oncancel != undefined) { + vnode.attrs.oncancel(e) + } + else { + history.back() + } + } + else { + e['redraw'] = false + } + } + function reset(e:Event) { + if (canCloseForm("reset")) { + isDirty = false + // Hier passiert nichts. + // Da mithril nach jedem User-Event (wie z.B. einem 'Click') ein redraw() ausführt, wird hier die Form + // neu gezeichnet und zwar mit den ursprünglichen Daten aus den zu grundeliegenden Datenmodel, das ja + // ohne submit noch nicht geändert wurde. + return + } + e['redraw'] = false + return + } + return { + onremove: (vnode) => { + let message = "remove" + if (isDirty) { + message += " isDirty" + } + console.log(message) + }, + view: (vnode) => { + return m("form", { + onreset: () => {console.log("reset")}, + onsubmit: submit, + oncreate: (vnode) => { + form = vnode.dom as HTMLFormElement + let elements = form.querySelectorAll("input,textarea") + for (let index = 0; index < elements.length; index++) { + const element = elements[index]; + element.addEventListener("change", onchanged) + } + registerFormElement(form) + } + }, + vnode.children, + showButtons == true ? + m("div.w3-bar.w3-padding-16",[ + m("button.w3-button.w3-theme.w3-right.w3-mobile", {style: {margin: '0px 0px 2px 4px'}, type: "submit"}, "Speichern"), + m("button.w3-button.w3-theme.w3-right.w3-mobile", {style: {margin: '0px 0px 2px 4px'}, onclick: cancel, type: "button"}, "Abbrechen"), + m("button.w3-button.w3-theme.w3-right.w3-mobile", {onclick: reset, type: "button"}, "Zurücksetzen") + ]) + : null + ) + } + } +} + +export interface iFormBorder { + maxwidth: string +} +export const FormBorder: m.Component = { + view: (vnode) => { + let mw:string = vnode.attrs.maxwidth === undefined ? "600px" : vnode.attrs.maxwidth + return m("div.w3-border.w3-border-theme.w3-container.w3-content.w3-margin-top", + {style: {'max-width': mw, 'box-shadow': '3px 3px 3px darkgrey'}}, vnode.children) + } + } \ No newline at end of file diff --git a/Client/Components/widgets/inputs.ts b/Client/Components/widgets/inputs.ts new file mode 100644 index 0000000..437fd12 --- /dev/null +++ b/Client/Components/widgets/inputs.ts @@ -0,0 +1,127 @@ +import m from "mithril" + +/** + * Der Vnode der Komponente 'Input' akzeptiert die folgenden Parameter: + * @property {string} name - Der Name des Feldes + * @property {any} value - der darzustellende Wert + * @property {string} type (optional) - der Type des Input Felds. Möglich sind alle Type des HTML-Elements 'Input' + * @property {string|number} width (optional) - die Breite des Input Felds. Möglich sind alle Längeneinheiten, die bom Width-Attribut möglich sind + * @property {number} min (optional) - + * @property {number} max (optional) - + * @property {number} step (optional) - + * @property {boolean} autofocus (optional) - + */ +export interface iInput { + name: string + value: any + type?: string + width?: string + min?: number + max?: number + step?: number + autofocus?: boolean + readonly?: boolean + required?:boolean + onchanged?: Function +} +/** + * Diese Komponente stellt ein Html-Input Element dar. Der darzustellende Wert wird einfach mit dem Attribut + * 'value' übergeben. Der eingegebene Wert muss dann später explizit aus Value abgefragt werden. Es findet also kein + * sutomatisches Binding statt. + */ +export const Input:m.Component = { + onupdate: (vnode) => { + if (vnode.attrs.autofocus != undefined && vnode.attrs.autofocus == true) { + let e: HTMLElement = vnode.dom as HTMLElement + e.focus() + } + }, + view: (vnode) => { + let attributes = {} + let width:number|string = '100%' + attributes['name'] = vnode.attrs.name + attributes['type'] = vnode.attrs.type == undefined ? 'text' : vnode.attrs.type + if (attributes['type'] == 'number') { + if (vnode.attrs.min != undefined) { + attributes['min'] = vnode.attrs.min + } + if (vnode.attrs.max != undefined) { + attributes['max'] = vnode.attrs.max + } + if (vnode.attrs.step != undefined) { + attributes['step'] = vnode.attrs.step + } + } + if (attributes['type'] == 'date') { + attributes['value'] = toDateInputValue(vnode.attrs.value) + } + else { + attributes['value'] = vnode.attrs.value + } + if (vnode.attrs.required != undefined && vnode.attrs.required == true) { + attributes['required'] = vnode.attrs.required + } + if (vnode.attrs.readonly != undefined && vnode.attrs.readonly == true) { + attributes['readonly'] = "true" + } + if (vnode.attrs.width != undefined) { + width = vnode.attrs.width + } + attributes['style'] = {'margin-bottom': '5px', 'width': width} + if (vnode.attrs.onchanged != undefined) { + attributes['onchange'] = vnode.attrs.onchanged + } + + + return m("input.w3-input.w3-border", attributes) + } +} + +export interface iTextarea { + name: string + value: any + cols?: number + rows?: number + autofocus?: boolean + readonly?: boolean +} + +/** + * Diese Komponente stellt ein Html-Textarea Element dar. Der darzustellende Wert wird einfach mit dem Attribut + * 'value' übergeben. Der eingegebene Wert muss dann später explizit aus Value abgefragt werden. Es findet also kein + * automatisches Binding statt. + */ +export const Textarea:m.Component = { + onupdate: (vnode) => { + if (vnode.attrs.autofocus != undefined && vnode.attrs.autofocus == true) { + let e: HTMLElement = vnode.dom as HTMLElement + e.focus() + } + }, + view: (vnode) => { + let attributes = {} + attributes['name'] = vnode.attrs.name + attributes['value'] = vnode.attrs.value + if (vnode.attrs.cols != undefined) { + attributes['cols'] = vnode.attrs.cols + } + if (vnode.attrs.rows != undefined) { + attributes['rows'] = vnode.attrs.rows + } + if (vnode.attrs.readonly != undefined && vnode.attrs.readonly == true) { + attributes['readonly'] = vnode.attrs.readonly + } + attributes['style'] = {'margin-bottom': '5px', "width": '100%'} + + return m("textarea.w3-input.w3-border.w3-mobile", attributes) + } +} + +export function toDateInputValue(date: Date): string { + console.log(date, typeof(date), (date instanceof Date)) + let result: string = null + if (date instanceof Date && date != null) { + result = [date.getFullYear(), (date.getMonth() + 1).toString().padStart(2, "0"), date.getDate().toString().padStart(2, "0")].join("-") + } + return result +} \ No newline at end of file diff --git a/Client/Components/widgets/tab_view.ts b/Client/Components/widgets/tab_view.ts new file mode 100644 index 0000000..3f31086 --- /dev/null +++ b/Client/Components/widgets/tab_view.ts @@ -0,0 +1,39 @@ +import m from "mithril" + + +interface iTabDef { + tabname: string + tabview: m.ComponentTypes +} + +type TabDef = [string, m.ComponentTypes] + +export interface iTabView { + tabviews: TabDef[] +} + +export const TabView: m.ClosureComponent = (vnode) => { + let tv = {} + vnode.attrs.tabviews.forEach((item: TabDef) => { + tv[item[0]] = item[1] + }) + + let currTab = "" + function changeview(e) { + currTab = e.target.value + } + return { + view: (vnode) => { + return m("div", {style: {display: 'grid', 'grid-template-rows': "auto 1fr", height: '100%'}}, [ + m("div.w3-bar.w3-theme.w3-border-bottom.w3-border-theme.w3-theme-action.w3-small", + Object.keys(tv).map((key) => { + if (currTab == "") {currTab = key} + let c = (key == currTab) ? ".w3-theme-light" : "" + return m("button.w3-bar-item.w3-button" + c, {value: key, onclick: changeview}, key) + }) + ), + m("div", m(tv[currTab])) + ]) + } + } +} \ No newline at end of file diff --git a/Client/index.ts b/Client/index.ts new file mode 100644 index 0000000..737dda8 --- /dev/null +++ b/Client/index.ts @@ -0,0 +1,149 @@ +import m from "mithril" +import {gridMountpoints, maingrid} from "./Components/mainlayout" +import {header, menubar, init_menustack, get_menustack, headerdata} from "./Components/header" +import { appmanagementpage } from "./Components/auth/appmanagementpage" +import { changepasswordscreen, loginscreen } from "./Components/auth/login" +import {kunde} from "./Components/kunde" +import { Projekt } from "./Components/projekt" + + +function healthcheck () { + m.request({ + method: "GET", + url: "/xhr/health-check"}) + .then((result) => { + data.success = result['result'] + data.time = result['time'] + data.server = result['server'] + data.projectname = result["projectname"] + data.clientappversion = result["clientappversion"] + }) + return +} + +function getClientappversion(): void { + //let version:string = document.querySelector('meta[name="clientappversion"]')['content'] + const meta = document.querySelector('meta[name="clientappversion"]'); + const version = meta?.content ?? ''; // leerer String als Fallback + console.log(version) + headerdata.version = version +} + +function check_currentuser (): boolean { + let result = true + const cu = sessionStorage.getItem("CurrentUser") + if (cu != null) { + headerdata.username = cu + } + else { + result = false + } + return result +} + +let data = { + success: "n/a", + time: "n/a", + server: "n/a", + projectname: "n/a", + clientappversion: "n/a" +} + +function logout() { + m.request({ + method: "GET", + url: "/auth/logout" + }) + .then((result) => { + console.log(result) + sessionStorage.removeItem("CurrentUser"); + sessionStorage.removeItem("CurrentUserIsSysAdmin"); + headerdata.username = "Nicht angemeldet" + if (result['logout'] == true) {m.route.set("/blankpage")} + }) + .finally(() => { + location.href = "/index.html" + }) +} + +const hello: m.Component = { + oninit: (vnode) => { + healthcheck() + }, + view: (vnode) => { + return m("div", + m("h1", "Health-Check Python App-Server"), + m(hello2), + m(knopf) + ) + } +} + +const hello2: m.Component = { + view: (vnode) => { + return m("ul", + m("li", "Result: " + data.success), + m("li", data.time), + m("li", data.server), + m("li", data.projectname), + m("li", data.clientappversion), + ) + } +} + +const knopf: m.Component = { + view: (vnode) => { + return m("button", {onclick: healthcheck}, "Aktualisieren") + } +} +const menu: m.Component = { + view: (vnode) => { + return m(menubar, [ + m("a.w3-button.w3-bar-item", {href: "#!/kunde"}, "Kunden"), + m("a.w3-button.w3-bar-item", {href: "#!/projekt"}, "Projekte"), + m("a.w3-button.w3-bar-item", {href: "#!/routename"}, "Gesprächsnotizen"), + // m("a.w3-button.w3-bar-item", {onclick: healthcheck}, "Aktualisieren"), + m("div.w3-dropdown-hover", + m("button.w3-button", "Optionen"), + m("div.w3-dropdown-content.w3-bar-block.w3-card-4", + m("a.w3-button.w3-bar-item", {href: "#!/default"}, "Tags"), + m("a.w3-button.w3-bar-item", {href: "#!/default"}, "Datenexport"), + m("a.w3-button.w3-bar-item", {href: "#!/default"}, "Datenimport"), + ) + ), + m("div.w3-button.w3-right", {onclick: logout}, "Logout"), + m("div.w3-dropdown-hover.w3-right", + m("button.w3-button", "System"), + m("div.w3-dropdown-content.w3-bar-block.w3-card-4", + m("a.w3-button.w3-bar-item", {href: "#!/login"}, "Login"), + m("a.w3-button.w3-bar-item", {href: "#!/changepassword"}, "Kennwort ändern"), + m("a.w3-button.w3-bar-item", {href: "#!/usermanagement"}, "Verwalten"), + ) + ) + ]) + } +} + +let mountpoint = document.getElementById("body") + +m.mount(mountpoint, maingrid) +m.mount(gridMountpoints.header, header) +m.mount(gridMountpoints.main, hello) + +init_menustack(gridMountpoints.menubar) +get_menustack().push(menu) + +getClientappversion() + +if (check_currentuser() == false) { + m.route.set("/login") +} + +m.route(gridMountpoints.main, "/blankpage", { + "/blankpage": hello, + "/usermanagement": appmanagementpage, + "/changepassword": changepasswordscreen, + "/login": loginscreen, + "/kunde": kunde, + "/projekt": Projekt +}) \ No newline at end of file diff --git a/Client/inireader.mjs b/Client/inireader.mjs new file mode 100644 index 0000000..c8ef556 --- /dev/null +++ b/Client/inireader.mjs @@ -0,0 +1,42 @@ + +import { readFileSync } from 'fs'; + +var result = "" + +// https://stackoverflow.com/questions/55409195/reading-ini-file-using-javascript +function parseINIString(data){ + var regex = { + section: /^\s*\[\s*([^\]]*)\s*\]\s*$/, + param: /^\s*([^=]+?)\s*=\s*(.*?)\s*$/, + comment: /^\s*;.*$/ + }; + var value = {}; + var lines = data.split(/[\r\n]+/); + var section = null; + lines.forEach(function(line){ + if(regex.comment.test(line)){ + return; + }else if(regex.param.test(line)){ + var match = line.match(regex.param); + if(section){ + value[section][match[1]] = match[2]; + }else{ + value[match[1]] = match[2]; + } + }else if(regex.section.test(line)){ + var match = line.match(regex.section); + value[match[1]] = {}; + section = match[1]; + }else if(line.length == 0 && section){ + section = null; + }; + }); + return value; +} + +export function getIniValue(value){ + return result["APP"][value] +} + +var inifile = readFileSync("../App_Server/root/config.ini").toString() +result = parseINIString(inifile) diff --git a/Client/package-lock.json b/Client/package-lock.json new file mode 100644 index 0000000..4cb290c --- /dev/null +++ b/Client/package-lock.json @@ -0,0 +1,1299 @@ +{ + "name": "Client", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "mithril": "^2.2.2" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@types/mithril": "^2.2.7", + "rollup": "^4.21.2", + "typescript": "^6.0.3" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "26.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.3.tgz", + "integrity": "sha512-2BJcolt43MY+y5Tz47djHkodCC3c1VKVrBDKpVqHKpQ9z9S158kCCqB8NF6/gzxLdNlYW9abB3Ibh+kOWLp8KQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^10.4.1", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true + }, + "node_modules/@types/mithril": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@types/mithril/-/mithril-2.2.8.tgz", + "integrity": "sha512-FN9Tv1+Nlr0LNPGnIL/xOxLJfu5WW2n8HAFeo4yxF+/O0per/8g080xlXoo+xj8baowAcfsNI3k80DxyLY34gQ==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mithril": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/mithril/-/mithril-2.3.8.tgz", + "integrity": "sha512-za/Yo7qXEckjm5syrSfaaI9Utf4tCUT3T1IOIYqH6Lrj7G0OZuYYLAY9SV4ygoaAf0+CNqU92MBt+7pmo53JVQ==" + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smob": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz", + "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==", + "dev": true, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/terser": { + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/Client/package.json b/Client/package.json new file mode 100644 index 0000000..ab198a1 --- /dev/null +++ b/Client/package.json @@ -0,0 +1,13 @@ +{ + "dependencies": { + "mithril": "^2.2.2" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@types/mithril": "^2.2.7", + "rollup": "^4.21.2", + "typescript": "^6.0.3" + } +} diff --git a/Client/rollup.config.mjs b/Client/rollup.config.mjs new file mode 100644 index 0000000..020ae3a --- /dev/null +++ b/Client/rollup.config.mjs @@ -0,0 +1,42 @@ +// Die Config-Datei muss ab Rollup Version 3 die Endung .mjs haben. (s. Rollup Dokumentation "Migration to Rollup 3") +import {nodeResolve} from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import terser from '@rollup/plugin-terser'; +// import json from '@rollup/plugin-json'; +import {getIniValue} from "./inireader.mjs" + +var version = getIniValue("version") +var projectname = getIniValue("projectname") + +export default { + input: './tsout/index.js', + output: [ + { + file: `/usr/opt/pythonapp/NGINX_Server/html/static/${projectname}_${version}.js`, + format: 'iife', + name: `${projectname}` + }, + { + file: `/usr/opt/pythonapp/NGINX_Server/html/static/${projectname}_${version}.min.js`, + format: 'iife', + name: `${projectname}`, + plugins: [ + terser() + ] + } + ], + plugins: [ + nodeResolve({ + // Der folgende Eintrag ist erforderlich, weil das tsout-Verzeichnis und somit das Input-Verzeichnis für Rollup, + // welches die Typescript-Kompilierten Programme enthält, nicht als Unterverzeichnis des Projekt-Verzeichnisses + // (...\UWSGI-Server\vassals\timesheet\client\src) angelegt ist, sondern parallel dazu. + // Ohne den folgenden Eintrag findet Rollup dann nicht das "Mithril"-Modul und es kommt zu Fehlern ("global nicht gefunden" usw.) + // Zusätzlich verwirrend war, dass der Fehler nicht auftrat, wenn das commonjs-Plugin mit der Version 21 eingesetzt war. + // Erst nachdem ich herausgefunden hatte, dass der nachfolgende Eintrag im Node-Resolve-Plugin den Fehler behob, konnte + // ich das commenjs-Plugin in der aktuellsten Version einsetzten. + modulePaths: ['node_modules'], + }), + commonjs() + // json() + ] + }; \ No newline at end of file diff --git a/Client/tsconfig.json b/Client/tsconfig.json new file mode 100644 index 0000000..3302fad --- /dev/null +++ b/Client/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "allowJs": false, + "outDir": "./tsout", + "module": "ESNext", + "target": "ES2019", + "allowSyntheticDefaultImports": true, + "strict": false + } +} \ No newline at end of file diff --git a/Dokumentationen/Anpassungen an DevEnvCreator-Strukturen.bak b/Dokumentationen/Anpassungen an DevEnvCreator-Strukturen.bak new file mode 100644 index 0000000000000000000000000000000000000000..39c54c0739c6e02079e0ba0cd0de9aaec266ccef GIT binary patch literal 2424 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 q#fQm$eN0vsz-Wc3o~+IQ literal 0 HcmV?d00001 diff --git a/Dokumentationen/Anpassungen an DevEnvCreator-Strukturen.cts b/Dokumentationen/Anpassungen an DevEnvCreator-Strukturen.cts new file mode 100644 index 0000000000000000000000000000000000000000..50fd8332484a9a3f8e46ea67f3fb76e504a7fffc GIT binary patch literal 2549 zcmV<2cy0qRpJ325#Tlt`~g)}0jdxJ<$+4@kiPYShYBGI zMMB}$rnJI*-dw-cRkb@UG2FeQjcVwo-j=wlX&PwAS(*ss%>NgSVwsU4Gp%=4~*G z<}>dqo#%^7+KBJZ)+t+{EXjJ{uMz7WCIsH&6P4=hbJfZE*u?nLhi)W4mX#BySCTM8 z-+M3%=3#`XT}+~MKa~|3jN)NtyDx$N_b@_tE5)No zecfa8fv+3%oM)S`oq(c+0n2@X6L)Lv9-$6oK5(Y3M*Iiveh0TP~NP9};#58r1bwpHa>&h_~3jTNq}d z%tHJCzT5mn9#E(vQfx4j&gr4e$FOjq^pw?f-pY z@4_VOw=aAqYiELZXYQ5kEx+qait8x`XiF8?2>2NKO{SZa;39=>O0uJayRt026CM|C z{S@N6X9zs~`mT-H91q87#p7=m!Y)A^d<7V1Oj?&njR>JH;RHueDq?4T$Wf|+?#T5-62)i zq^VuF`@sG3F?XiTTc)Xi+8Mfms9?|tmQv#0rkT0-0dc|+O`n<4zVzok@^d7fLPS*o zGCvuq6BwFOdXhl)TNtM)>0!|&h(E<}Tt>!$n@L1(2h{#AS$`QxOIJAf` zJ0C-${tSxydul*8A@qMig_5QoiKVQ__T= zj|i{&w0Y{J!b8^Zq-l3Yw2O{?QkrH@OcU7rgftPR=ir(RZvBMRdYl8mQ<(#0VvcAF zI@5rs2EGS>14zt|Nq`*bgxC{mJ9;3FT;FLsFU(#LXHxMbhR%`6^CWeCcjC096A8-1 zk(~rxaiU#G(7Bblpnie0IQN6HrkS*%x}Z_uh0LHTM4Se*Ug*!J4-{9_Me;4u(4qDy z_l*3$?ZtuY$VVB#sCm#mAlURKtWT6CZpJgI%2R$yp}!LUQX~aGxMM6JocH`lv(Pn>;c_S#0)~X1-)whvs+R2Q)@hp2ZFEof?@1~l#6(Y9 z*6zwS%`@HVjTm*15JE#Pq^9{!g}=PDyeDjb%i)a*_f6LiEno{luNAjk>Sh;d~%Bp^_ zDm`~#)0Pk?bpYo6Wi_YA&bl(`@yu7h-Sy1AhueGCduGo>ar4nTt2y@!u``m=`1!H% zOK}=05%8xu%G|W0TsrdiE%Na@Pu-OdXY9bmJ%AachOR;7AFCT`NAQ5JOk^@c8#=?% zv1U1nWfK;6w5NiU0z)5fKmqi%D7MSJ17jPfhXRj=puj^>)L~v_6w4qf2{Cdu`0bg0 zW=TJg2$s|?PW($ge;)2h1<{rHN=680vFHI)qvi(Sre13LlY~FPK`~ONdw|{o*5G&y zS$DP4Ut}>|rhZLB`uw^k2j@Wg*EIqr|K~M1_RGr?gICt%^ThFVk{zkl@{;Vji->Ho LkW=A*@ad@yeQOLT literal 0 HcmV?d00001 diff --git a/NGINX_Server/Dockerfile b/NGINX_Server/Dockerfile new file mode 100644 index 0000000..c4da972 --- /dev/null +++ b/NGINX_Server/Dockerfile @@ -0,0 +1,4 @@ +ARG NGINX_VERSION +FROM nginx:${NGINX_VERSION} +RUN ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime +RUN mkdir /etc/certs \ No newline at end of file diff --git a/NGINX_Server/certs/wildcard.mylocal.crt b/NGINX_Server/certs/wildcard.mylocal.crt new file mode 100644 index 0000000..631b1aa --- /dev/null +++ b/NGINX_Server/certs/wildcard.mylocal.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDmjCCAoKgAwIBAgIUIDBuHg1o+s/XylnF+ZGrpcD1PDIwDQYJKoZIhvcNAQEL +BQAwWzELMAkGA1UEBhMCREUxDDAKBgNVBAgMA05SVzERMA8GA1UEBwwIU2llZ2J1 +cmcxFjAUBgNVBAoMDVNjaG9zY2hpc0NsdWIxEzARBgNVBAMMCm15bG9jYWwuZGUw +HhcNMjAwNTIxMTAzNDEzWhcNMzAwNTE5MTAzNDEzWjBdMQswCQYDVQQGEwJERTEM +MAoGA1UECAwDTlJXMREwDwYDVQQHDAhTaWVnYnVyZzEWMBQGA1UECgwNU2Nob3Nj +aGlzQ2x1YjEVMBMGA1UEAwwMKi5teWxvY2FsLmRlMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAoSgsxm7iNqNK6MVwXebTCUDCW3hxqd4bmG/HR9VxfIp8 +eQDBbJNe/q+sOmEG2D6CNNPMuOlerqGJQnqzG83nNhEdVjMFdkgIEs2XjS+CgNjX +P442tYAibLxX/9UBQCYODA1RNv65dRNPxMCRQrMke2b6nU2+5EwBTFoxIQ5otarN +PPDRu19u5yqJQwxcC6zZ3sNmq/jOLkTy9g+JDrMRydtArV6Y6LUsZBTUPT5cKO+m +fQGe7D7b5+YBdu9TI4YpzG6/7Z3dlEehBJiWpLSdKD2FlN/jidiNr/uslpTIxdEV +mK7342LZuXOlwEdVSsP8lafnzV3WtH/nRZxZ7rpDNwIDAQABo1QwUjAfBgNVHSME +GDAWgBRyi8YbpjAj5TN2v2vRGfVcnM4kBjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE +8DAXBgNVHREEEDAOggwqLm15bG9jYWwuZGUwDQYJKoZIhvcNAQELBQADggEBAAdz +t0/rhsV+91BfkO1yUUm0m4H5vLsY4YLjoxhXqGRGwfp7CAV7n5iS4akMzVrs+y+4 +Q8AbVeGsrv3AHWZ+ZKL64AGjFnTVXEeI1YN6cdwPkAvmnLi4QuXCRlJdDTEzJ6pf +4mHgHWNIT3H3GkGGLJLrBdz1NBn4QHt+7UHkBtYcWiGB9JOp0ungEdNmzA9fOPNo +eLtkKe1QuvlafUhKxGmnIiQyDZ+DI8EvDAX22qakcLyNeP5gxptDEf6nx2GUupVt +A+qxI+Rfg64KtiK6J2lVKbu6/fkvh82Dtv7aHiP7jXQSLkxaDyfZFQY7ZAEwyOS9 +NqTHZcSqDB4E8TuDu2Q= +-----END CERTIFICATE----- diff --git a/NGINX_Server/certs/wildcard.mylocal.key b/NGINX_Server/certs/wildcard.mylocal.key new file mode 100644 index 0000000..2153e55 --- /dev/null +++ b/NGINX_Server/certs/wildcard.mylocal.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQChKCzGbuI2o0ro +xXBd5tMJQMJbeHGp3huYb8dH1XF8inx5AMFsk17+r6w6YQbYPoI008y46V6uoYlC +erMbzec2ER1WMwV2SAgSzZeNL4KA2Nc/jja1gCJsvFf/1QFAJg4MDVE2/rl1E0/E +wJFCsyR7ZvqdTb7kTAFMWjEhDmi1qs088NG7X27nKolDDFwLrNnew2ar+M4uRPL2 +D4kOsxHJ20CtXpjotSxkFNQ9Plwo76Z9AZ7sPtvn5gF271MjhinMbr/tnd2UR6EE +mJaktJ0oPYWU3+OJ2I2v+6yWlMjF0RWYrvfjYtm5c6XAR1VKw/yVp+fNXda0f+dF +nFnuukM3AgMBAAECggEAHvMCNlGRLAEMH8vbGo17tekz6jElUwQOtKWy1b7N/qbx +5KMagmmC8tJ19vgvQlQu2UpbpJ9cyZjILXY2834Fi0KaKbW+tMp8km/dTQX0wB3k +qJX9N7oV4mABXmZfyRwF0pa0JCWjJDLDPPvmabLRrMlIE/GcWWenUCx6Buknfsuy +bT0z0SG3b9fiQYp5o+vUknsHeW6NOJP9cvS6yLw8nH2keO97ldqQw074xs0IFlHo +5Vecoeuv+Kr+EPxJpWovWHRVoJrXDsH95wQ+eqR15H9PMrzWKE5ilzT54/V3tJ+V +840865hndaSF0LaF1huNAc088FyrgLM6MnOTFc5nAQKBgQDTxAI6cwsLfFwyed1f +XRAWj6XBlCwAdh+rIzz2WTS5XQnN0bBof5cjY3pgZW3guG2cKs5TtW4iZKYvgQel +nmO+DTiIMBJFmnTeT7PLdszvbtgncrABc5h92BRFuCdJOTyxVyo+RH4mUWvuUgzl +fOzGCMgTDj997ayCOtJQ9V38QQKBgQDC0eguxL0rNMvv1hBz8ri9pe9u5c252C1L +QxiWv0bUkOVxldVk5sZwNdvntGLKX0J5JiIrAUYWyPSWcizxdj+8XKZ+Qrj1d4tQ +Fxex27ZINTOprPI8DFAxk1N3coQ0XtQ1ANAYgqzTVt0N2ceV6JR5mrNaRFAuxFRV +GiFYEZ3BdwKBgH1aR59lviH8aW8PqDTtF7rjKVFfbnSPd8uMPmftAkK/ijAlcfFJ +paOzHRu2rsYZJfkNdbkjaqA9SApSrL4i9hPoK5CiNA6zkX6PW3STTFhnGtivEPSr +ApdrswRaMBcuJHktibn2PV5dUDBwrWWi/11ykUyGYJsgd79XJmv58rqBAoGBAJ7k +ajSyuwJhJi9u7K5UeT4b9wMApGB9ortudsCEMrWtk6SnKosH+TKNitQYeDZLqUB7 +zIQ8nrh4n5uQdX1eDy+GdTgnHQj+vf3NR8MEyk9sLL2nU02MUV+NpBaYrKC18udj +yVUkRuZ7QwFH7JMkROxFMyBc9PSfpZRfInDctUiTAoGBAK5NmzGicDEqcyD4U2Dx +nxc5t0KP2DtqfMDWAL/hTZsV1hCq1QsQ5jmzbVq3tM1BUDDMoNwxm47ycQaD8vhb +SByA8660UEmMYX3C1Dx6N+N768ca6GSM1sOGCngl9ldObhdX0xIUYZXcn33EIq4e +/NhzHj/po4W1yBVlRUhaVPT2 +-----END PRIVATE KEY----- diff --git a/NGINX_Server/configtemplates/kbp_crm.conf.template b/NGINX_Server/configtemplates/kbp_crm.conf.template new file mode 100644 index 0000000..99bdb89 --- /dev/null +++ b/NGINX_Server/configtemplates/kbp_crm.conf.template @@ -0,0 +1,38 @@ +ssl_certificate /etc/certs/${NGINX_CERT}; +ssl_certificate_key /etc/certs/${NGINX_CERT_KEY}; + +# Zunächst wird ein Default-Server definiert. +# Das Standardverhalten von NGINX ist nämlich wie folgt: +# Wenn im Request ein Server-Name reinkommt und NGINX keinen Server-Block findet, in dem dieser +# Servername definiert wird, wird einfach der erste definierte Serverblock genommen. +# Dadurch, dass ein expliziter Default-Server definiert wird, wird dieser verwendet. +# Falls jetzt also ein Servername übergeben wird, den es nicht gibt, gibt NGINX den Error-Code 404 zurück +server { + listen 4430 ssl default_server; + return 404; +} + +server { + listen 4430 ssl; + server_name ${NGINX_SERVER_NAME}; + resolver 127.0.0.11 valid=30s; # notwendig, damit der Upstream (s.u.) nicht direkt den nginx-Server stoppt, falls pythonapp noch nicht soweit ist + # https://sandro-keil.de/blog/let-nginx-start-if-upstream-host-is-unavailable-or-down/ + + location /static { + root /usr/share/nginx/html; + } + + location / { + # Variable muss benutzt werden (s.o. bei resolver Direktive) + set $upstream pythonapp:8080; + proxy_pass http://$upstream; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /health-check { + add_header Content-Type text/plain; + return 200 "success $time_iso8601"; + } +} \ No newline at end of file diff --git a/NGINX_Server/html/static/Google_Symbols.woff2 b/NGINX_Server/html/static/Google_Symbols.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2116f5e4c57646aec968a03e5434a7ba2fafc30d GIT binary patch literal 247404 zcmV)3K+C^(Pew8T0RR911IBCs4gdfE3$LsI1I7yg0RR9100000000000000000000 z0000ShLJP|U_Vn-K~!)6&`J>q3Zu{fpN?TbcT3W=GRzQn<6bs7dPQ9OZCp4YtNy6JK zSxOfY;?hrsPPup)5=bl(VpBtAh%!^7K9W3{FCCHGuV&gIF6fE@>FGQgDkf?wKAyP!X+W1ER=UDsdKnm zUX;z$RolGD0$skJuY5IMNQ+Bz*6L!aj)!3whMDTBx0v;<)Cax4>ifP|xrV^3?<1UC zmr_bBq{X>9s}tYA8N06Qq)5P9Hs|_v%V72l*~7;tw%k21y~J zynG*?C#O>t;ol-^`#C}q@()N;Pe)R+t9}&`QTfjro*@ZIx&CYXQA*pZ{_lu@eT9FT z^m3R?%GI*Ud-%XWmu8TJd~3i)gGRKcQGc-~_g49@5)RxxCiJfrf4Ef<{rIZgi`?87 zi3sGWmg5ig{H*`{65TZaZZFA!sYgJWpjWSZRL?{d60BKq(EknUm+W|6Pg{zarWgS+ zg+i*Li>X$(^&Gb6aFdu!7VZfd5ycD{ky}cDmg&AfX&o93?aUwvN!U`1nk4nkOueH^ zsc?4d7e%cqY$3Oh4LH4p|2J<3!ySZpgCC_6>IvMlLb*`8D%bb~&IzD$n5_VS-#8*f zp_EHC&2$FNtO^SeaW+i{ak@MB7wTb)CeDgS1Eg^RJNudKGHuc#`4&o*yiuvfik!L(H+Z(U#s5=h|D8~=iSzGOcX^xmMB97aiF3bWsCcN z1;n*+?T?zNrHN^&Eu#gEWo;`f>bkD$w6d|Tt}^SoZkJx;y3w6}H13JE8Er zPjxtjUm#IN&&Y)Wk$MkuWEG@xVUuPVf$g?t55_Sjo>GS{jJnJn=Kr1V zl;b$caWsS&A-pItA}{8sRekK#Ve0kvPB|A9)fZhXn)<6cB`^7m!zG4sWQAo}f(rtY zL}I#>|4r+w>;HF)`d>#F9zjHc1m_kJ3GxsT86-%MA$#0MQEyS7P{i1pPAQaPJz9ho zpz3=A-@Tjf5HpVdqBNkHuF%sX06yk?q4~YbhWDprLa zzFr6HO3%AnFX-TJ2}!QSK?w{{u_i)9M3i%LEGd0Tsgi*+JNHdm0HtI@5GelNQYq!` z5*}IH`h3PMI)`vIrn17QD%t19SV;;&-dusE6-0p!$4Z<5R|aX$?%;~vr!4h<0^ zA|etJp*nW_NR4(^z&Sb2>}r2-`_F%>+CB4#E%(kNqHJ#}>E3h^Osg_6c<5g35R&Q%629a$Jyn0{(UNHASq^bvkK1D?YbFVb} z9zOVXFsO$b#LB)Bee5K}oCX^jb12cLq@$jObTvmp6iw3zxR_>|9tM>(qfRnZU`_)` zT5Zza`{`eu|36C#x6DXz?|rnKbAZ%$j7@1tz^G78fv&wZvz7`F$&#fMT1x-1f92oZ zB)LG4x(fui5(3?%TlQb+>}yr+se5Mr&rU)j3I&iHBqR{Q0jEg!dmuT0G?>ZEAOGyy z)84LIdkZnxGrQ1BYr?RHscTQyO;b9ir+XgM@>a7_eRunDisuL z##?68wHdD_iv4bwhoZFX)=WV{pWj8BQ{A%LeK~WV6}OLKQw{f_(-83(lg1C_NUZwL z=d`bLpX8pId*73Xa7DNRs;YtIhwe^45ZJM#CtFGE$oY2QcX=akQ`?5B0c>J`Oi=x%|NmDV1CmfjV>`QfuOGIFlk8^rN265&En{7S#F0cC_IUK~ z<5$hv8;*~jV7-S~?`6pSL3B6iIn1iL1wP_?dyRQbuz%tU`Iy%v!(%Y-#P_h8=peo% zy)o@cCS<^)-b$C2HT-Vc6isH0*3nH4tt>eFfF2v-!T+XO1=v*=z$(w|eguLunL!dK z=FJJfCkfjk2}-m}Wz*A|F7-Zcx*YQ16ptZ<)8{&l!bQTF zMeAIKSf~fZa_tyPHcvYc*?4-S>-H zph(TB0;qFDqd7pKsI#pxHj4Ia6uKziFxvm$EUnMYC_w_~?*BoKVt>t*JzojGfadTE zC9JiSmwDfN@iN|v7f}_Fkp)C%7Jw`PA`6ODAlWRCoOltDkuP3GW@Q#Yc2$u?7tmrz zHhTtSE3&6|J_(B1mUE`X3TdtO*09*~XN8uAzvmQJqQ5okjrrGHZ`WJj{D!&a`u&?} z@6XnNyP%A;ahFlDW+?@f|3_$LFkX&QChdMgl4IUkk za@>{UH#XX%NXovo3SvdU4?+cbqSgWfSELF5)lK*BzkArEuxdBKLRr9t5K6wkOZ#FO zPchDVuQRSN>NY|6+0KSnT(si%EiN?eI562c3-vooa43ocz7whT_k2AGFKQM^Zex_zMjNG-5+x!cA|lG#`F>yD$k}~&eeI)X z=H5eLLMTEJf-%MzBaAS@2q8rLIQDg;&(`g4cxnit(jMdd{|$Ce+$l6Re-NETtsx|n zG84@}Fa#TH+$0xTXw6`E$(CG_yDtG)_EYFDVTh}ZMvE;{MTp*9ziYiQ$Z35NtJ_~t z-D0OTTZ)Dw)c+uB*8j(&wY}fC``cNk({U6?fPe@H2nc}$a)M4{YG-!)bEMr-Ktx1Q zKxK(&`ad6Q+CPlu=q7D{(>Cc^lNd!94h2O81?3u;8Rq2J|Krd3e}kiArQ$913Qoq! z0-}Hk!vczE`_|tZVov`*Mw8uMqAey8M`YY&C@3h%SjX1BPoZv`X)V?x3|xNL&&5~w z=HQmCZCK$11Yrv|KK}B5f6e~Tc4poi+v%4JOMs}TSQk)HK$Zj&NTB`ryZ7Z3fJ}F* z8J)WX<4&IatI3@p09;{{*TJf|^T0u`kuKAXhafS)dlMU1JVgo0=P^gozczr4o#`N)Z@~K8@b6nVEV|#To0Tc_PqXZD1BAqqLFi==I1EV)f0SA|^!bWN- zD0y<>FTd16XO&L4aJLwa*-GB7-;oiK zza7&pAioC{#EI`AToDz`bs$NL0`CXuk;#DsV}mmv%>HDp3Fu5#!$ zp^k{}&CmnlhvGGsFBaK0dk zD@H2B{$!qSNnOKzayS0OD%&?ckCX_tX_5>+C)ZI+GrA>&v05CxN<-uS1xhhgZMNFh zoktuO^>qnq-&oFwLWCxv?BVV zLRukPaRx{``Z1`izfYON94U_au_>X?$9x|XpibjIx6u~65?W8B z-;{4KddP|-eK;?d(UnU1KU@a4Goj(cGGg@HwW&$`pZzZg9 zST{44sC1VjiM_Q=5jD*Qk>3umuHCGx=9OGv)E|t4$j5nz zjJ0IMp;;N?4D>2qS7BL+CXK}h$en?WXkyk4cehOg`3hHu={Q1Bw^tf02%LqXmzgrI zCf_1#+6{=ajT?t`uG?}_^$irVuLiP;XAta2eugSfh%bSr)*nyc2wt#iqNk!xVy6Nd z6P+YJe+J=B_$Ryk-U~l>dXn&UqET!viI8N>#+@m$?jbimM`nI*mx>Z9^QTaATu;gz z8-A!{N@^jlb(;^dE+5>NYyO-P1*PK1N<=Rsi?op_<5#j;duMr2=6Vem7%$%>S4r8mimiVH5({g%B^M|$np}t$i-(uXtiqWlV#R4pF~kj6p!4pIxkJu%t+Y(sN*qi9;HMVCS;2P=y{clwHMH z0Rej)-T_k;e_R-cj2T!`<0dLS(3((8FMnJee zJb_f1y)ZO}Y!-hFu&0qWWm0I_y~q$4yK}HvW$InxUDK2}U@p9glrT^y>KYufOb8p} zsMsRLVw1+xd>_vnI1`HsD}6IW272H=W|hff1|n2>30(W&;>+C61*6TS=nfI96n{Om zU{En;bVo4ARv5KH@6S8_nRGLFJ0De}mCrfVl z$33!FL1vOB;!gkHtkEk(3H-O*LwXM3 zds6s!vnl+IlcLPC0COmdLNtSp!En(UAqUauAOQsze(;{>+~+#yIl)2pwwvwp3KfP- z{-)=Rr^Je}?9dx(3u?M7^811C68^b)a_*o#?KD)=@4Qx3X0DYUOLO3#<8VosLzb>Sr29z7Zi~p8zX!wU@xf zsF%1ZVCl=-!WXQ&1fF`xF}{$u7|03&&{_J!ON6N)1{@W?o{?BCLAjdPRmGc{>qJuG z6LYvmoTb@a4QAM<=$EUVLLXv7am^2aJ4M)46IWhf&{G1wFALa6vas6ONbzqfM=AX3 zDrW04pARd*_JS18^xuUDb)v9H+bF(FhCQTz9u;8czt((5>^wa>Wx41`-% zPa{ivBl%Y=ETa=KN$j*NDCmi~9s?GAEYN@g`Mwa!2FW6kea4V-p%kKg5Lx*h;ts?| z1gv1wC;@~g#M#JxX%5x9bG*2; zYl_yxxS!a*Mn$-75EwJ3OsZ+QT^<^XGcKJDO@(KzrbK6M#(ZF^m)oN7zffO7D+js$Vk!hS<@i8R zqR{)Vi?Rp2Pb^CJaLuBGsF&W4jx3v*VK+|bYHD(~geVfDZ|1A2tdBX!J)5c9K4>Dt zKQoi$q>A^V!gxO4H=Lt{emM&F`@AOly7z;{Xsv-KC4$YCM6^`xy^7}kb!&^3jg^fw z{w(3;H6L<#;!!87Q4on!!*6#Ir>7pMbhJmn?_A?aT-}!-%8LwKk-%!(*9Qqai3dcc zqMPIaZ9ao^M&I!YT3x#gh@TmNtkmu(z$W%UNcIe#UX_!&3Cw-sV zS$u+{6Yo=yZ6QCIk`$NN?3R50Un`I|X@O$3dWa>?c@G%L#9Rvq-s50N1S2YxGdCuX z1s^GI3dvQsJnXW@_0RB#Hr~ zIrVv|`du{rJa#YwBm-V^f1fTjq|DqtWLX{q?7gx;G*jHr6r*@sRNWC;(G83kM)O5> z8a7~1t;s4y4fDGWfNI;Q)aiq{F5> zfS!%1j_Fm58~}z+jdTLw#tBC9Cg}>;#U|_v9}7)*)8+(b@gesomC{O`+@_=XCD2&K zSU4qi7sK-?b-iNSum?WH>ZNzlf=hpm-jb8%=e83>5)0GU*w^ADd?pkc+MF_TTj~{h z#?vBHbt%MtQc912e6G`Jc+{knY6X$K)`$X?F5VgYnf?GlE>(-k9|P__{)|x3ApA7b zeI4shPzWP}l4#7QUN9ITjx6f$(gd2PO$t93w$)3eX^jR&Wz*+twqLU%H6AMYD5e2R zhO0Wfi?=IC;ApH=Q>!)j76v-yOe#RHpG9hJi`EbTF1Jx3urwM|`6nuOBraXZ%mMUD zs1zEM;S}5atJZ+(Q2tNr7SP65L4F=1YomX~Ae32<(bW3XEygjq-L=1{d%Ozd91Jcj z>c`8^ZJWck(c@=iF+6gdx+4>+xB6mUz6S!_vzq;qfh7eVfHEt^Vz@S|mZAk(@3pOg$!E9hT<7B|`9J+YP)G>r~ zp@onlITLoVV1S)|3xOd|jcQhuq7=Bk4 zqz35A^9w8J5nROd%zH#g?O5DK(-D)#`V~~&ZPrbkHOBDRdx|qj<5^f7FfkX&;b()K z%5o9GEvDdR_fyX;A>;uP?}Kyjn+@GgWW4r*$=i--sym)xvOMCgc!Wgl1-8;KnbQXw zMt>VpJ%2UWT_(+E&@3BP?Xpw$ri{XY2ojip#M@Tc^~2(@f8rAYbXZ`FWT9?Jcj~#h!WB{&_7>PjW_n|Cs+N82Ag_=C?Z##XyPI4pj{`JUXSbdM*svo^k2QVn^JWJ4 zPqdZc(Sf_jUfIY5d2kOv3pII|^gN%W23MjS2$b0q$1l#&IN#4Dsq z-mz5aCT0?MLd2{&zsy$Ma4^l;bkM_B?4B`ko0)I#7jzkk7X$5CU^u4m_9gZ^eGOng zG>pKhhXb?`Ze5CCJP%xNe&bbsqS+^7ziC*7@HS(Xfyxhxqy(H5rUmA(oB8VkLA_?I z;-qR1Zf+*)O6<*gaJ)F%L}u^sg=K}&m*@%}wf(|Oz5s?2FduIxuQi=+nqkl4uiBh; zrdVZ4WRT#wlYTIaoK5fw{!NSi2y*lmA zr2J*P#$w+M-XIzOtDF6~<%dsO-PS_yHK~nmGZ6B7-BSD3+ckJks*=jFTIAX9`=u-^ zUCZ?nK`)AiBCt>_dIA@T%~Nypd^XU2(2uMx3(SUTp8lDP z6o=b`Km4P9z~ku9`&D1)GS}Ia4awmB3FrLO=h-O++kl0C|M8>W{puGUyYJUL^6(3mop+55*8Q-ATGK6M6Q`wp4>3CB$B^PRV~$pnqn7wPmazQ8rXi;2ITvcB#aN*sQ{6a3g023A=A#3z7G?AXosg5D9u>t z+A3MEG}FqQf!3BYU>;zMO8)BDcnc8FRkKlEP^@A&h{%cpaS-)bK^_Qu(2(K?fDTo< zJBc*{;!_Me<39xxUZn;=8ksF1FMJwSExq;EiI@=9j8DZtG?jcB2CNn$M2s_-|1;|~ z;vjP|k5f|28kxN~$}G&9PZ>k?gOnwL?m}51I0M`&^p;JVCLJR4rEP*9avY_NKtN&( zO&GJuwBTrPgmzAP%(OhdTMxA^?<3-FgJz&!!T)`C1a<2Nm7(@c%rWmQF3>#j*v9NK zIo=EX>|}q}lz;Vq4DVkw(~1(CuKp3vjoX_Trw*f92XdSen>*Qp+uUte#6?NC42zwS zkMiD>Q3Iyj-mc0bac-xKqiHFTg^mmpxxDQ0aHV?IoS>hA?rXB^%iBxyy&xm&b}ETM zY*~yrtnrcH zEOUd%C|V->OZh>h2z4|SAwxe88LVZw0-5%OvP9Sr#7X@ts-2O1>04S$=*u@=ZYDqZ zW-o_7Oqg#tKFlgpk~6PKyFe;?a$%N{yBB3m{N{|v*pi9-%~>f;nygD*KgZP&OzPZU zIXJaX32hrxWJA7p2yQtQq(){1d)m6n3i9fdSoXsblVW3cB3t6ByL??T)e$FV?_7Vx zWh%_R5eW{Gn&F+*UQSI->opp);q{=Z{3OdkJGS-R`5RVb)ZZHLaWytXr0pj!8|#3E z$ulbgLRmbAdAyyCjB@?K(7ze-xyp=rQ^JH;TucemPIwg*`H#3uVmjvLNAIiZegGw| zHnuwRn7=)|GO8LZ?Ph*Fix!o%$^QIGOGvMll{fKJd-Fz7ZY=esLo85>khe~+j7q4M z(MB9NYS>|0+R2> z(xRb^2oRQ+7&WJXXk04GswRq(tNOZ$O$p{x|LkkYpw6d?C zJG7rxs8yWWZ@)O0pLb#>VqT5ZMx&SE%v%56=4+MpvkVW{%9y3mZhq)g-v zGDisRIWIRfK#$G}e9pmOVxE!}!)UJ~y;zt}$BTG{JpiDgf`F}Q@GM#XbxOr+0B`>W zL4I3FLtYwlY#qdba?{7i0v+|lyiY)Lq3zuv?AjMB&W%ayeHupU$N|D%JNmvx?a>Ds zDb1ilO20$Cze{RzP$7r@&|=gcF zt60wH=mBFqROc4zpnp9Ggl*qt2z1l@;bY?rgltx{5D!Jh>>xr~7NP!qlLQ}mvPzFs zh{9I5I8=7P1j(k+RMl%0D6S3kQeGJJM#NJZk;Y91&MfYga{_!)fg)PmERhj$&lpDbq61M1fpK;fPmn^hcaRa^jfp2Dr49Zg znnytP9sx~5;gZr+g?(=bkZ^DC^`VD_e3B|yQOvFXA($SGcoeZoiJRzP%$49{Xj3#$ zr^kS?gu%XbIjK7py>x4$O9?=D4qt@uAYf+Mvm3}wMLEbED14|q#93#;Ux(nIMUeKy z)ZB#hIs+M9ZepGMeg{}{RPb?O2*6+`NaUgL!=R~pu$fA~`iTxi>_q~F&inh3l-Iw$ zfaelRxbqBY{zgcScx^)O6*wj^A|YE$~d>nu^za!%DEABk$BEcR;pV zF~wos{Esn`+flfS!>L0V7G{^ou7QP+k+qM>{KUY(&0C?)O+u7ye90gZ6N30_bZEx= z%E=_{u@o=Cpb5qs>;!B97kw2^ILyL<2h)|~kA_r$t>^tUEKEp)yk9;DhqU@MYoB?3 zIS2?XNEPv3STAS8h(qd;e*|+bJyf>guE*jT0r!XWCwEmbtt>f$RDD(7TqfIn>Nh(x zcoPl~JMC~>3?YqJ*kz|~ShYG_G$beW@B?LC4+wYiR4(z8l~=y<#!}>)y{m}k()`R@ z$oMDg_Y&^1zXtLzIM&veHJ$OZG5fPL<7*;C^A<1t^Ebqn?HcUV4vp~qFv^h-Ubr9f`7E~BHPtHkOAvpuQ6%?fW z2mN~r2}sZ;2+gvH6H!YrNQ@(5{H-`Za02}JHPX40A5OifeEUSeZSc#Ac?6qP`>TLi zt#FNHN-~n>#Q<dLe^QA{GI`G;EZ&nwsHB+n@wQem@6bgF7rt}lGW|}`me?M_Y5*i^ikw04s zAR%*v&gx2>fTcQuYsx8;oe-`-jSxZx5r)nL~>j|XR<+XDhhppwx=F*wLR#{`&8@!0sNa|9*y zSTXwOMp^20p~6(9G+4M^;0B+`=%RO*RA(#XOzm2cattd->Injy%ldBO)jwhr6}zBg zGrz58pg@{yEZctFcA{uR7ZUU{+go&}bd6&GaqW0^ixpj_GQSx= z#O&gl+BWb?3d$<@gsMVaRCz83q)#Auh!~BKQfvp2d z<{nm&|7LSaiA!ROFsCw|geQ?VXf1&S()QZDf;6o7Z78hdc{-iXao=-}hZcttXf5az zWAEpWuu-5@C#Zsn)e(jVFfQ3&bzWe#H`hG-o+FQFTg5-ubJ$*cWkYJr*AeWhPFEWf z!&IMdQYT$Zg-ObzIU{!?E<2AEI4q1}%q59K*Y|4Fxo|IFsIoS7lqny^8`Qi;Z`o5xhq6&H zX8{3gy8xCXYx3uH0e2#7=PT%fNg2hh z!6994hc*iMIUQo{t}8!SZ8M+4)}~ib3tX6B^mFXff~=WvSnyot@H76sB4lfX3a#lb zuvoqV!x_}gQ1sKn7&=Ekb&3!jz3z7)W)a?u1(>@%zM8)-R>*w8$AwraI1x0Cs!7yp(lFZFM_{laAQ(d0}@N0!S)JP?iuUSw*~5b97jTi~GVErap)7+$(3@K3kW1hwiW2o#g#> zy5sM!>pO|aZ3tPeVJ)gP+^k0pLCgS={N6aPhqzW#w>tYv^^i2J0d0JwkHC^50c_Bs zv-drADr}fQLCKd+TSav!^}ZCXm4lnU(A}bq{zpHeOVxM>r`{>Zl1bKd2ZxiVIu7N< z9Hn%R3iSJV9>q-e+(TXZMf*cw{hWMU~x_}18BU^4JU_6wmpk4^P?w1`1E zN?38;S0yjh6v`sIaN)m1Ol~$<=sJCnbSXv-U#ig{EI66q%5BC^1<9Og9^HNa8?TYB z`#hD)un(?@ynCq;!b6f$ry=XB@PfTCZ`TP^xSr42opPuwd|x_c!VVd&zck6~cj)>- zrr<`%Dqhcu4D-k~?E@GO;UHg9JY!p;cON_@1b~*%v+U`twhX%?c9_AeB+lPv6v27a zP8Qnw4st&5XPf!SpqX_+hQtbr534;5EMng4Z%9vNW`tBNB0$G)Jw3Ggb#_|Bg~WzT zb2v8{?JK*{7KfUXlmQWQj!}06uh{~hE>uOMNoU{N^6Tgfbm`d z+5a3CgsDj{%0UPz7HTgOUT7@4?ahqMkExj-(fgoR1%lxN+ERipo6h6r^|p!k&1T=s zS}u#)a5aP43Y5mA3SgE2p3O3j4E{n)2cTMYs8PM#)goRA6IB~h1HUbAl6bw|tlAiqT>n$%P)_Z*2@*SYzE zttd1TH$D_Jje2d~S*i(HU+=<-h2*W~#c&icmCCJfh|+Ipv1+D>VV{T(#j_g=Gx$PY z4oR~umwnNxhOSNE(>TQLB~+vUG#&^3hw45BW(-PmGwb3iFbAA%#R*W#ZQ)tpS7k3y zpY^q;f>}G}1boB!E}_Hd@EDGTnfDCzYx!yt4~cgMcd0l@`x3apDpPBg1k(%F!JP1> z^cMa7f^Q(nU>*ION^^IF<1Gf2i+?nY$6cG#Y;x@|44HP_o=hMl zd`{4q7(#UFaS{RjYD+TDc~ghLYy?2K;U_>`T;Pal%qwUh9}9A>(xq((88pXJ&7Go- zC!v#CcVBy;hlSZ)u@win(Yd~R&m~sgF~dHJU~WamU`mM>ENRay*v7U-=+xNIq3G#h zPS6XkN6smc%}whC&Yz|_2y@Yg>_y-aIl<+R(e-n80zmj=7)}ULtDA{yo~VFJ0D13J zAo?wmFONZoW_Xa5->kuk;l$gdrIa5ioYg zfWzj6RPRGkY`8EB%|djl$gM`7lDlSTn+xa< zaESXk}uAAk)ve}fQaX*fP%nKpZOix25Dbb4Pk)F{rw@a+yGJpQP@`RGw1+~Y2Pm#Bd! zbf~Cr>w4+ox*Oxan>*w#GfszsG<*U5Euwbyk=FFU5gWE)gG9am?Rd*Wu5ya~>|zsZ zSgsQr`!OwXmH_$wcyNMm%)Q^@CaArN=1In*-M|@QewFLlP#7(u+n+UUvyuVXe1z)t z)&aFwB|)|g`385@hfHCruhgdY3K(2k+3j*;z{I3>3H*$@Mobc1Y2U(6Ltyho zp5n2B5&0|mvtlpg8ND0zv(t#@0lbI~n-7nmrx4|?R0K75Q&f9)&$mw|^HCcfmz z!qsme%=*pa@8*)fflv$v|2CK*Q=_J8CAA-JspwgegD78+@R%Skt=!^v)rz&Vi-Y`E zd420bkJ@{hkYFH?K);>L>`km4YgtT2eMyb0kS_k`E;S1!$5}GsG6p;l92hE4Sbncd zH6)u1id9c)2$?ic5|V(=!?2(p;dBUsiw|a?=^`yg$UkT4({<3N2|Icw1ESPzq%F#N z#32+FqDIk02p{<>#hX*1o&ykX!Ggb61}ntrWKx$hDoh+kL#CZ6eLm>qM}&^UjRNVE zj>dTsDccT`-E5PtX*`=~HK;}R`qsO?e0$%XUD(#MR>Oq96li&+$FA!+N^8Nmno;65 zwZK@Uxj|sRUPGCO+H)ym$lfPWWx)QXC{*Pm+VAQm`TuT+;8vrSt{Ea=;pN60MO(<59FktB6)t~^#2<`_k#Q5%=&`*jNvFWv_Q=Wrko`US zKmj&W^lb+>r*lk8>Nrt;l?D5?Uqrs~?RH7O{$aul5Ei6{Jd4 zv2x5q29sEESTb^@=?ox`If+_%+5PL^z?9f?InD$;fQx;0Do73u;>;UY3&skE)Jjc#hWYIY7S70oZ9fHEUICIZY|msRj#2fu;co$zJN*f*IeN4aGOKC zG#x(UC8`>8#YVf0y#VHdBnsb-?WisQ^8L`N0j(ovrvh%uV20xtE;$u4R;Q`|U>Dlx z^+yGDYU56%PP$WSIQdRVb;_eeco%wojnElm?e=BCso9KPxqd%e(A?I;^93x=;TS?+ z8d8eOUM_jnfzX1JO24bX>DkjFXiFk>pRN!uJL;yI3s(+?as^+c_EVnMB;|tecwz-^ zV@qAq$OSnJiBarX0vsT#yck|VDa=J@>T9Ikv2(Vgg4y$1Nr|dG<>vd6mg9>8xLNi? zORqVauNa1C1tGFaBapIF+~j#Q7cGM_>b01SW-0h#L>u?N$zjCGHN~kySIPIcV1&~V zHAVF)qmkg8VX5$xnXok>AYidkR$dz6-Q*DTVt5&r%ua*P^#wW@-1SFc&sohZib!wE zVw!ki-K)amPf!g(AeF%*fqY=0cbciN|G`9L?!figZ-%!hYd#CS2ZAJo(C9d)+XKqK z7-3*<0-rHY<2A=H=dh>z$PG{piL@7^J)t3P;B0}!XCrc=#I%3 zKD#;kP{*de$0wA=0BQy@M8yRtA7YFzZ z62uOxM1WAg1?Tz(4iyETK|xi2aJAEH4EFyx6p~Hb6F&8_^{)* zE@m4Q*2KkfOAz`;Pm#ZWI-nL zy|gP35!a5>L%iVSn`U`FsVxnS*u#_-$WFkR!@s2Kx6?9;pu&-qwXeVla%+Ct%(G*LR!a1Qucn(HZWxto(8lChCS8vh_Srms_~MNK{h=7 z&Wh*G-B+iCp)5b0*#DSJ$zY59)Wh6VQ-No<^lIa~d;h`l!qLJQM&2@wisO;~5sq)r_E*{_N`hy1|w>o{L5xR}$Fc@|j!E)hVZ8e79r@7GTQ|2BRi{z^_%c^P!guz5*+C3K?cCtJj4G<@||=6GF}x9 zxHm{+|Jt{WsSlM4)|ve#-igOfYoEw**?Ko|P?*Xr+qx=W)gCm1m$6TzYEr?RWV78V zglZF@xriIn3AWZ8ti%KZaUQ>{g`Gh59LaCsNeBsS$p0fFL}-AVUer+>T$b6arfiX5vJ7t@Wk$3z?Z(dEM1Nk1w-NnjExwo1KlJJE+m?$^>JDpgCN3wc{2$L=k zQNI8dNW_7&^Z#U}7XkiF${9;;#Et?r7$}GOH9`BirbR%Id^8xGNBTmjty`<9zpG=_ zHM~iW#wl^92b1uZGK0AT3uvA#U63>=Iv8ax*fH8uoVQMf9@B**7mi9P^_w-fw6dAq$kxpLOuf1T97OP9!_Md3leFF zM6$>l`0G2(5|`fg-$AvS|}% zD36&DO{r}*d*G#DfaQxZE$lnS%WM1g5n#c(`nKhu&!KR>XU8zTUuI8^h&qhqY{Q`; zTH{JmVyYO!0gCeg1jrcb@9~qv5<=mfiQWwrTtjXX&OjN%RIP4DPlvlJ6QM_#u#*%_9a`rsDd<8AspHqqZZp$f`*RcUUO3{fb9@V)04}`=fkl{l zo{TH**M`~fVPW)|Wu#)UzB+ii6A~IQr#gGS0jq-c`tgjh|JV@yVWsV?;f8kkuvi8= z884@M|sl$e-sjE**w`YNz4)#^4ImiX;_MY7|znnqzetk{`2;LfI z>Ex5Sz40w-#1{K9*EYRx(6p|$9Rnv46uj55p;_xxoSBUx-UKUBwp_YH{KFQ5Dk>P+ zskjGLj=@hz^x9|hTlNz^WX?q#Ck?IY&31^~sEL3~p$I_eXOKuE-$@yIlH zwopHT@Pk$A%6$34siIzHF_WK{E1iE%*UcyE16!}l#HUC20wSG@Ih{#38GkU01Oijv zS2V9oE@8{}mi`cvrlTRB^A11$Ug*7!cn^s+`GsAG5)BrQ!(H(Jwtw3`;GqQ)Fg9IU zB3=cQ;e02_{=*p`+eB}(I{}qVKpH5PLP%hvQ*1Otw51oVZZmJp<#%8yG{a&^b(`fp z4EpG_msE`scJOO5Ea?IAOGHLTB2wi}K~G@8fqOXgA>e>e%vYiiNfz)eVLU>KP&x>) zbZr1cK)iStatlC6;5k@A^a0gQ$VqDyK@;?_(6u&fPSE0lQTJlJ8Ln6`Pbnap>wfNShV+2q-Qf-3*y0n)_4vVQQ^H^fanbN)+fpT+YQRVWJ_IXgS%+3TbN7rMtMW zDbwo45rK>6jkzwd7WRVb1L2l+QDi@I;7a+}t4=^ebrz$4gLmU(44doQRGyE&ud7>5 zouc%ky1cvAz5%Mwqe~LR$_@gm{Eu#9&6 zNZ{s!LY}1vrPN_=PwMms)H5!vq^OZEDlt=8~yPXQuZt9sL=Vo+$U%n{+e_1$vO0;sKi%od{D@dKz3m>Ze>3u;!ULtA(8+A}i4 zAwAjRg^1`2WfWT8%3TdpSKM~c0vQ5pWXn5n)x_)iCj&s1z+LhB`-nOMd6X&d-a*$d zO4FHJ$O}}Ds@)Y<$z#!DK$)7{*C6!j&`YxQCBDij8aiF2ktP($Vx1)k#HvXD=4%2%I&pf)IQjCtw zym8ZaSNwKWGUh?tE@iBk-2*HxDgv7(2_qHlB(W&OMzt-ZA}TXk=evD9F`%Lmm{Y z>h-i-=Yyr75R&6(BR~3-$McIr8lenVcxCG|lm%q*Qav&0J%1M2mXJN~b3&>e6Lc7J=N^(p z@UF!XPURezwr5A(M8z5L4F@oUjry8FBgWLz7*l~WZy;IrL0SHG{QTax|mF6LF%8B#XL15DX zYMT_eKqL{n#b+z{ufUSAtunW}4(x!t`&ry%%?IE<4J8reIL4j4cYH~%DEG=_L24#o znB*OvP?C)j4(Xe8gBWs}fN__k_5c%2FhSn8ox(^}pb)@PJZJ3@;wJiyRXPzEbf*iITjGs5X*(zjDGQ1@aZ>Am}pvSkZHIOjib z1PtbgKO^GqLY~ zM|8JXDiI<6z#%y$_u~=@9u+w1bB~8r2?^J%f>24RRWMe5)@FF1e7*?rjCe$~l<&Ra zzr-V|m4KtG%yAk9qzHKjpkqJ-(1QtGvte_Rju_=VP@u<5Uo+_YQcJbKyt;e4~;|h>uZ=XRxLDwtKeZWYY+H!YV57+2E^h@-Nq{I z1CQ0%%dm#pu>+ayLOo)&%*1;?S=}n^G-$c%xu>%78m(?rV^%EB&(9w$ z4UwA{q_NE26yfE-xWH9QB%=FM!p}k^GhzwnR)RjyaERg3D9(Ur;iYpy)~6)JBW$IG zk6bt6w1DH|^e(x@==SBB7!qzx#T&OK+3T-Ju(Np`W_$7=OL~4nujU(V*I26ZO>aPr zg$n2q8iHf%Z~~Z**oymv3}HC21KtBsH@|rhDhu>>Ex=M&at?tA4=Xtuw*9D zV!a{xfQahK%}o>dy{6t+soft}bu z+nDX0rqcG~Xh6M~WNTt>V77O~Log>f=3*l9K^u7X=Oi#6WfB{p!mRv0%GDTCQ_nDL z_FCiqg7s?F{MXDr$aEypCnFu~v{D>O*Us$r&}41i-6w-HZNFpb7>oGFdjr89kp*x= zEou_jrUZ$cOTH)%h0(jwaZ#IpCm*pmD(qCnK<-pDLA5&85P6^l(Mha^YO~FPovSXz z71c%hnRyQNBjv*Du@|>iJ}W;P`Pg|ueGTR;M}3q?^Q@r5&}Q#($)}l?)Wm6V7S752 z2@K_-hLH6SgvOSXs0#LA?;YTT+pH}Bb}6Fh&FjWNeizEHudj2!=^GHC@Q+CBnE9T3IqYk6w2Sy`xh>7I#%<&Qka1(dN$w|MttNE^$x*af3J)^6PI zc_iumU8rqBM(FAtQvVua65^H0?bcCB4un`+rAxv;S^|E}Ws)7RO}XO~4j1n-9^k^g z^sQXzUVTEoQr&UBI+ zj@82`fse=peGe@=bx!6|_R?uy<8tYw4Dnj}~Ck!`qFdflB2WBMQH zYsrFTAI@{j`g$p%T9(4_~vJY4WEcgXncLDTLC_3^juaVDkD zCHucXX#2svVt+VoOe_T_<M1*t1-b#-A{7BW<)Nc^Wq2LSo~NaG3Z;dlVbD2ZLE!&19678UA_vVO9Z;_7Ss&Y*_s|Ea z5KZsNX#7`R#* zA7tk*nhZ;WJ62@xxw$5L(4RuOO$Oz&ER&$+Fc|AApPGY&g9QvW^b^9$p9zU@h#(MQ zzj)OqlQGXKUyua)@@SGrb>QBG#qs>LiX;-2EG#zf{;7%7&4}y|o3K$0j?GsvUsbbb z<{O|#3R*yEW``K8*o@s`0D5yih$1sty>TpG{qb&e7an~+m2vb82~DhN75XmoGpaU6 zF~uD99T2xj(zccv7<1YdC_hfb>-fS37^95)XAtiqH1Diar>k+zUnK3w;N^?tip+uA z;Clt$qO5`@*CJKCsxCS81aW_{8pwLAu#xjg+M6>AdSY?RmT3QeQ@9qEF$VEha{so` z#aJ7DcDx{#yKBJlKMKj-;z=^fXUU5LfI9^>LrO zG0?R1fH@TDzviIB8(7JA0e9qaJA?}bvfm%~Q%ao`_KCYu=iLr`s0(R+NL8im(rY$L z-AvQ7U~;Og?RU^BwN^B%$2U&ViUK6MX}-_x%1iG(G6q`ds4ZZF{ALz3Cv$?Y7$?~- zLi4H>I8h`F+D+D)p03NP$v1kt4~ToR=K#=lvXJyB7yLfHfSv!tJ=?o3Z}5PvpM&&U z_8EPr zV;OTAnPwkr^1Fs^%j84uVG!7yPfip9xSWBcC?T;0@eQY2Rz~u)MGLG4402n&x$i4tu2cX5PT(-U$59ImE% z!mfg&)%u>GOW`QBjzzxI+MdvhPWCDjE7qdwOa*=u-#kOQJx(VajWpw@8ooaYok`td zCb!?svWXT#W92orn%2D5mz||5{o+}CNsDrgS>@DhpLHJ1V8&varJ06; zC_+bnMWOK;qm|>oaKe=9-ChQch;NEbH_QJ zo7@&6i`))|vo)#b`dtgx0FsE)mTjQYU+MAh2WUHQ6PtS(-6o~g4Q3-jY66@%%`tv- zWs0b9v-cpgU7>mpMsr0_4tkR*gp{D;RCNMmjtqI1rhYr+TU>0Bf^c@f^edAI6Khib z%`}arUmDfMet;z>^5#qSV+ha?mm9}Mmw~%5!CRe=M@6V{Hbk^ECFb956y>NvosVjxtUJ@!b&g}BH5l}lq4@co7 zlu3-pWfiQY=b$=4I)CL1bd(`-;qq9LP=Xi*pX3@;>MHMM%6^JM&~!i`3ae56EQ4D& zQvzFf?YDSb3+@Bx`W(k~l)YJy`=~9{h*zWb$A!9^@^bq;LX~914#_>fSS9R9V(Df* zBeY%(b0(7mHwDaR59{zBZvL zo%WPmUZ~K^G}L4W-M~2F4{l(@#Qhqf4Y%Ch0^GqI?n{XZg>RP?D{e&OafFKxt3k^$W%uaE7N2so>`!lVJ~ znLX=S2Y$1pPXEoOhBJP%Np1jCc%%hJ9@NnzrV!`93tDf|?tJ|40E&sFwdTI*sZiSF^n&eHccEN+@+0)La|@{HTvFqDC1CNV)wP{u}5^KDJJwWzdsn~XuTZdS*l$0 z4^Pmi%)lAhWmgD|aOqC>*<_7Td!QdVERyM&qYvJ_S0J7u@Ri&(w1bPSDdJF`&#yl- zj4NDkK-s}Cp*eUgOQ_mX!{p%;E<}o;$Y%4dwK}`rffS5~o7RxUGi~>-3RqW-X~$ck z7c+D%JA+Sd?4;taF*$S4(++?&-}HkXoOqFkCWI~eJ;Q4xj*&NOX5n~-pWVpmD|VD|~Z*H6+} z%7EZ=>*I0K`g*80LZPTru!h`yg!)pPM$C%o{=Z>q`g=cDXX*=t;hTn^c)+;)hQn_V z`D`s>YH+58HD>=21Bcv!w3IL$BPLDdbjOQz@M&li*i2r1YdTL|hAp z#}XDbG!SaD2jP58KBnMPRw|T=6jLu?87}C0Qk1uZ&KJ&OEcB7^gv8!6Ov&Ap>A(a% zNAQ%O9TM+_p;wZEX23jW=(90`+{*DzNxCwUF3L!8Tpd3+e&y`(>rWjyJa!Z>&yB4N zCpOGYY+&F`4RqffQ;eco^PS1#o0kHwbkY~3;`R24M&TXo^<%)VPp}fPa%grIArnvYV*5!fkUMn9zR(>C`JR3isWcfO=72W8UtuYGQv)bPs%fY|U6Pg(N?H&F_d+b*bVmr1VPBnypCiv}!m5_-g0c<%I zGaoTgM^DmMSIDs1n<6vErE#vnv^ApPkf%0CW0vA|AsA*i{Ny3&NxDKs!pgOCp`;w$ z{g^!%dc-R(Mw0AQ>@Mf=1s@2nbAtNmNLF$>bv3Qk@9!PoXounF8*QV0yV3T;ubLg} zUh7vz-!=bbz!t9)ZQDs>I@`wyC;{ZW;r@u&8ayV_+u*Q>;}e{~oM(fwker7ZG@Ivs zOCVPu@@C@*+GfG&-CZAnCI=2s#n?zrRxkYU0LTwbE+RSIy~r3(Z+Nf*1J3@@JfNdk zRA;R*f87DBZoTIu($SUNdm#|?0j-S#@<3)xF#qZ%iwu>t4qWva;=Mi_2hz?fZ z;5CuF!C+s$vmi$I#>=$$pc%r=Qy#UdOm{d+Z5%AnD>mSfM9T@`MxoGX*nRoifupdPz!dgETmG<}IdHeAVklp-uxn1>n%O?iRuy{ePox?nvlTvZNP?{dZ~(`Ae~~^} zX)=?L4lViuCiYbTzW&yo{UNm-846(=21ei*_q4#gWg9mF-lGb zy`RER#5rErlTUxiy|Gtw|7NQ1K!=|BeK%`Q^k0{T<#3jqZZlIpxc zfKu*4V4PGUxO_VmcaV8I^3%~C(6B{`0V#NjIqM>dDV(b(LrHao&!8vD9gFHPL;sD#7 zwCLmU@uBKrwL14Xxbr{oH zg1YfWI3F~sbPz+77YPA%P`4=QrgKihH7fd(1_PgdtT&&D^&O-ETFzIbL0)+%8w#8{ z3{CGmGYd8+)s#k78w)2xIk%x63>c7TtsuTjx7whcHQc-65zARN)I*1;Jv$)=hjhAu ztK-{TS-&!ddn8_n&?tSQz5uF-+O&J#hZfbK`!Y+|@Xcpw2`zh`wS!Y|qg%ugPHMib zw&;szD9;0e?oZFX^`PztwK5q>FHCsflAyHbA~Y|4n{c(EoZ-qTUd;cpU}%-Rm{DQw zKJoNL0pYmh#NpExhb#@hnzn?t*MZrATUDHC`-JF68uMIQ-Yc_42t*2ved0(t;i<1P zY6I=Aw@IW{e1ftL;7Y?M-5Rcca$Q<^abmXsA?T_yq_txLy^W`35kE} z8g3%2s;ov=<0@)x*)xyUX&7i28}1c`W7ZV5s?KxsP_ zz}F~(mJ3s%d!1$>cS5Y?G$3z}b*Yy|4^`2V9}jR$(2?T2z_j+-`&~LW*|tnF^&GfB zx-Q77?jv(_CJ!^x9RrAF=_`a`(YatTs7Wvdm1#H1CJ3|P_ke==QkVWys_gux6m7~s z*pkVXP-#(In??r^D!T3J1>A*M%g2y}Xm9>XLokWI?-36vQuj;2Xs>r-f-kE{Y3VUPAXHtLxgmv2*CvdLfj&Ge%Ke};IeZgJRc~HK%;iJ|1 zbr^~p1vC9yr4Kg;ps6craQibOtK+*|*#S2Tl-ePJ1aE|dw1vOlZVx3l2PD*AJ0B4;5b-rDWaB5&N*t+TJDrX5|lKL$Chvg_;OG zn}COFQ@=+9wU0pwOF!t)C9)$(r)yX>h<--A^iC~V_R#%sYm^p^jdb&%w(q@`^mkGT zS``r2f?kKzkyxi|dmzA!<(bV(hNcK3*yA|^ZR@1+GQjil7yr{*{W-Zi?wKTN&0Rl>jdpF! zX5D=s*h5Yh!O!TSv3t&tLQ*xC^d{Wh2sS&bFN`1 ze}1K}*pUwt10p=9>B2Vjw)!74;SfqiYDyPze0(JhcnMBrT3Po$>!>+ig z-<|4gSLgZUD$i^K(#^+n?+9}mO8sD4(E4P_}QPAK5W*agR%TsJ@ZkY#qsRWR41dYtY0Qi_2FEHSTzNl1Sfng?4$1OqJMQ1q?{X^&U@E! zms$M2qEWf7aFm5eBm8>;(FH6ZI@WaU$)tr`ttG@kn7q<=usrh48P+d#hMRf}auI0E z^wpXO#6xQ}3PM9v*=PuiYV~z7WI~~}vi%T68B1rS>;iOXYaw?Npy>BvW)VcNmJiPu?=n!{-iJ2ia40Y3KyjP+k1LT&8Vr_kcp zPlmc5PS^)jmHls)2vxC!W^U3E&%m3x1SKDazZ!Ns+609(f2B=1c4+SaL9UJGBHJ)D= ztiZ3ZF;Poy&vXf{B5;e`g1N8VXw{yIaY^lrQ$da{9BzE&B;8kZkTyHb(ZoBWw%x(QtKY=Ehw z)9c(_tS1xm)E-zUUgW@y01ZYvx;A|k11`!@?E+sNtbq^E z8B+d^1g*P?R;{;AaiQ^QeLe>QH!aiTb|@K%k5LOz60s7V400Ry85)Rkz~|u5y!-KF zN`ZO9MG9sq(Fz_zg;t4lvgZB z0?y{WlpA_Th9Vt*SS)eiY=aHW;VX-F_1SxWJtzYz!M4g?85SxQvN8z?8RYp?e+Al+ksXU+1&^-X;7-KjfALjk%=FK8hFyJyLYL zO@g~<3tN%!<_yGxb7vT&24}XuxxxiDhc3T8JP}oRuxELj9u?9)DY6@5Mtj;qtw$4` z>CsVlD~%cALg)B@ph3(*z(sTxSl89Vt9V>&Pt(`7P#Uj)IJB$6* z1|;8%@SgH4UD)mw$o*E81f@>Q3c9OXvnRDrWxByN)HN210|G?o$&{#gWb|JA_9|;2Wbp{1jEHb=FyRUY;2rbEM38Yw5`!@ZvX+s}0&sEjmYD!h0zY{Z$OcShQoGcwptsJVUS`nc@ zpa7;!Wb`CdjLLv*DD)7hK}(xM+%F8zjm|EOMvsQ#y3*RF-e{2!92b@<)J)&qS$VMZ zq`{+F6&DE0tC1Iz;7?|j+|sb7C1JxSwqY=Z1w{phmi*g(Rj81t4?;?OGGor+S_K2t z3wb;&7v&{G4 z;#LW}-~u{w8dyklU0~(G1q-c}NIv8{N6xgqDEL${zenp-*K(2tmiU?VJhUkXn#isCsdg~k zZOq`aG>yWvmY){DoD7PMlAAn!E-a@egM);0InW8b{S+wi0xkF%N5-Quv&E}-Kw&Hf zB@I)p4eV1PtCnJr!)x!gbatz}p%Yo=@P_2GZ0~Ape;DqQogb|CK2tg<@H2mnU&!)y z>kGXc6)E}ru^Y^*^0fiesJWSkwMb9FPd*5hd&R&?i!RkmR`4^f zZTNlz@06f^tFAv#-2r+|M{ur_llC<{x{b_6c}niy~7L0_?)xA^m%Y<{g9 zf3gf!x&Tsjfh#Kljdu@>mNMho^oigquN}GFKxdA%Syw-$&2PwrqHh(~%50Ksp zpn=xlFNg_N?k}mnc4|F0IT1Rmd|w_p0Om6;0K0eJQ)-!i`N6j+aWk>|qS^pya|u$Jz>VW(EkeW|%YYg!6X*3#qT@Vu zmMo4+0`-FT)bfSD2Ns>3tYFLuA%`3K@N;mDZ%y!vQ@(Z*esI0-?cqn)`NFlnDZw7t zVWOaR>z@RwiTlC+G|sjDA5c<~yh&C>Sb{R+qo6rU!FY3C5Ys9MLJigh!DSX#)%#0; zSl@_$0#iX`t)O4gmC>bYw=yy%t{t9XE6`iO3ixnmU|aHecoDXb zpsNv|5lbo)rQPYsQDKF7YE_$Jy2QU=WQQ6f=+R}EP?~(zeMc zAkk%1qt-X-XR&W_eb@=4BZ>ekHS4y+;`6L2z2 zlrp3Y^`tMp&m04hoJzk%lQR3%l2xA+ob?!#A+-SDkuy+G3VUJ=VOlu2UU&?FhQQ{3MN3DYdAalLV-V~jSEwYd0 zBhW&cn6Zou)<8MYN%eIIOub~!70{-s9hf>!MsIV(!z;REGAy`BA63}c_XLotkhjUb zEU;%cOOTH3zz~>*=a&O0(}Ky9#$^W*gqfNb$k!nX^g<&lK60^?-_mGIF)Nm|k>na&gemiaWliC%_Xk{3EZlsIoAE@8Qc^qX zl8dcAbH>MhC5~=32R``ndKMTtL18jE8Bkm_?~EMbrO_yTxY2GD0w}-SK-mHhr_FBR z7cM%r9q}o#k0gIJm=a8t5|3wM+Xb^elQOdio5Km;Y?fbp6eLrYsqT#j9Dug!1W>+> zZpOEw8^j;zi=y;x+l?9cWV>ON?b{iaQgKb*4nRaa{>LH1+XEUi+q3unEG{P&MPAk) z1KUu{*}1T%>S-YnMrz^_rt-u70ylL9DMzM7ADg1UqaNK%P)Bzwaap;>Vu4pUFiFs& z#EgAM`fNdIQxXxaBZ^jEs;+Ot9o_rB&tx>LvIgY=Vk&52)Nu4xQ5KZd!OoV0<#!Cjj12(QTG#=Z8NQ#6fcP=vC72uKK_7;u=sPivU@Pum}7K_w1>rdY`Cz zuaecfRA0S2>K>7V6t(1WyyS{$^zhK`x$p!xk_&;U!$y&^d@;r@x?A(a1(XP;POvnd zj7ne4vJ-&n|zltJ!l>k+I78DrNaykjeA*}P|DQ?DQ0*o*lh=5vY>NI zOY9>FCMcayP#GGblyvOE;;Otn}BI0K)9FvbB?ALO0fw>^5jaSDe>UT&}fVyIP}qkQA6y--zv6J}yM~@E09oi8dUo zp6#NTL_bS9GN?(wp;I_gxGT-rDZLWraa=)~rC`xT6q-9+t~Su9MbXjjYYmL$+HST; zm!OJR*?4snD+@`|8rOnrY1ayK#zPYf1^C7c(LhF zUIRhqv_}5*pABm(|1u35X=8`zkt0e)em$QtWIA^IM!K1fL;2LE#nJz|*a;<$c>P1p zEa^EV$}2=t7*?{U^;kqr6qzxdPM>8Q%-_=XW9ToQs?LXDzaKI7czO{$y--c^y1^dn z8f$$pvqX6Joj|2L$D_j*^Ph_^G2u4LWGKjILVkKMPW?94p7r`XF`fUmffAe5a?aNv zz;Uci{Y|-K>EkS8-by2KU;Omr=2ZIm=A`)HrG)vGlesKk_KR!bkg@L~CgMrDsRQcS z2^MzSI?_+p58Yc6HK3SSbfZlwR!L5q!J+dwYRO5cN%8L8B_jQ$*Kc}1uJ64H#JRj_ z^z@JrNftfcgTpKE^?1hSe0v&oi(3$vQ`6tXP?PlBy38C%Bl|pNRlc1bB=8pl#WU5D zpH|MUz&)Zyzu-a*t~6W4{etC)eaw9aN$<~*D(&ROlSE)&41Id!q#B^hVh_IN0YN`g zjzSoogudX;#1>eO# z5sh-XonAeQMwHHy3X-hNV%GHXu$kvT6VvU`ReLwe~Y*s6*b&< zzc2?Sg=LZ}zlzEva+$mkuyWIoX9ALA@UCD!G%#ApAd zh@P#GWBrV=Edf~+53B3)99&AgT(f3_@eh$qca!~!L*fOEhew2X{R7a!o(<@SBMdrj zs#X@}?19m{XiAt4i+r2X-;k86)hJFSEM_kk>*IH7?!D>`-Fw}g)V7(!wuEA>&~D+l}a^wCrJ>1AA>Mq&r0LN#l*B);vb zOLQK2RHQ@BD^_=5fV!}c9ki6NwDodvXJFm4EEmGTkf*GNsY#P3R}_-K+#R&(X~jeC zo;@(2&_-SWB)$R_#3ne;3c7tXFAf)~Q;<(}Kl|BS!%kE>gh3GdKR67PyLOk5L{y%i zK}#@;pMRS~W`rbLuC2jdKU7K*+W#uof0vbry>CUu*VHVw5{iHC;f^F8rJjGy?r!Qm z|7|YTr@Lje1tUxBMX9%FD7q4UuyPw3P}9LjU};+C5Vq6ix4%%*7`2Xc9)V6z&0`e9 zV6W-?NzZ*dQ2{ltS*7dUn_7&6(qFC+J_BNpoIJWY68tPX_jmpMr2lGdOO=0>Mh`28 zA;pl6J5T8cU|(LHt282=it1)vlxzSeEV(%cRuXdu?!6UhJ;=*Y^@|i$+Gg;Ak^){q zEk3=)mHFz`gERCM$U73Wq88bvQpkg!jj+Fkw2sL$I5##v>-HnNbiZ47Q}?@RxBh-N z@7CS#ww**P+n|*j=KhNO#ks#7A~Nw9p}P9g@J4uoxjozJPE49%fqO+!b*lS7ss5p7 zSfHEIqGVq?a0jHubya=2iqz1Uv-tY6P~8W<$+2p{hyxE27EP~uGNxjs~e|3 z^-xDTcG0v8J2vOVtE;2JhU!O9WPA_?w?Y@-Dh4917-Y4!p0KvZyG@Z!`0&v!gsTN-1NNxs241lsmL-)sab&;{TEOMuEN-&VWTlAqzu!{MNYJ7mkT| zGpoGgmn*6edjXt@)Co_#;ovhIS;@2rl=QO(^k+yEjo(>dEKkc?2Z z9y}R5Ze__oUA4g@E7`k#3IYycK*w(q^$3Vk+m-=T%iT2sJ%oHT4yxnPOXOm>XT>S> zAJK2TEH%bO!c>mG&ah2<>RmF`E_&a!5)(9wv_~l%10hSuSqqLLpfXam`(_Dr_$!R7)i4#Mhjx!MtK~@@wihPSTVt+PO zmpoD05;Zq*T8r0~Ge(o$+uiRg;tV~%`%I+(GIf637ZzGS^g?Z!IxN%4sBbp`@{oV) z*kAbR=@2x#k(K?jW@L&ng_FM#O?vAeaEBOuGC8^I;jRVBd{J{M7? zA~59F82)XN;Sjrzg>vYmxo`0S>(=fpAz9$w)Uhul_3V5reFUnfkK6!!d@@D221PIl zFFJ?cNe@1Ji|1pxq_cO%ecvBrBVqgOE@11K)9{11sL?p{y%;Kul#kaNI3yWUo3hL~ ztI@DB$?oF;^kmRTefa9T`2Cetm>*)%=PfaA-6Sf917j@5{Bf7jFz zl>)Wimc5H!6XMGOJ7=Y%D?|7c&Wq{->*--I@pO+Vegt=6&~6Q{2((5t)ivO559gXK z=7Rbq7Fpllj^N=}@YKfN1tN7E(n&hzccN;v_cu<|{J~eKq;#428P5uA@mPSpqoESj zpC`oI{Q#5f;DVdQ#~F!Ah#!!+A%BmWETNpb!#0iRF$yKtv{URL3){cgs z%& z(uJfQJvs9xfHV}+I)5ktQHYvkUH%cUsDV>ISJIzit0A|6D>od-@cDEc0uvi&X6y(K z^gWGDf6ye_ls_7zb(03*hCNfvkFI|ELL+g&bJbGld`DPs-?QzIpN7xu zZEMYzhzQvffc5*H0E`tA78LhilJR?PAryIOED5MRK$JPb{*R39Z4CfAvK3zzUm{D; zZ)pv6GY;#mFN7PwfI7$8J!#ZGIWZz;!u0H%(}~hY z3Q~O;o}$Jo72lxanFCO|L*K;O z%Z<*;yI4nc4=`@9dy8Hdb2M5D)7_9H z?2QiARC$%QxE%*;i9u520_{?$r6$Y_csya+%2C)=B+LsQd1@6;7+)0&_^uN9Z*(n% z+fNrH=!#ZfCyA;Dk`(4b6lLre_dUi5)eAlC6~gU-Id~VZ-hp%F?MkOgD=dKAc$OZ2 zV@R_^=u0*WdOHRg{t`X)DWlfaO&z3v>El^vsn+9aZPa_2?uJWn@@^G68Y2qj8Dwu+ zgN-lFi1NJq9S$SRPKYqQkZpR>&3S?RT+tt(dJrvys0N+>V%+gw1tQHZ$3wuYK#bXo zKZ$DKsb6~U__9QqdrgTgpPKjG(8hv~%mPpAS5Wb&TQ=DYYZnmktB6SeO{(V+%P04$ zBak3)CB*FTKz0LYwpn?0A8(T%1O6BC7Xrd+1!XLbfB)L@ zKJ0yKT?rXG5;xyUV0g4Y`CP)rHDJ0&F{s8U{}bR|qh;v&XRRBUwXQ(`;0fad-l~2) zX62uquH6Fg$2vfXpODVPbn+_p9N)-W;pEiQi+iF1!bgf0BTmwsa?RH~z$m$b?B{S)MY(Fd=1W(7&rfnQY3c)k0M6>K+%(tN($UBANz{6r7e z_=5rs#z=6lqDHTn{KOe$6|-uZx;AXPtEm=R>8P*%21!WEDro3gICJSA>QgNhD$=`4 zc{K@)kmM4q4XFC(>^`z~(@}G8wniEHl`^G5M@oU0nA3`l?Kx z1m`sBSYc{Kf4PUeevIE>CB_!0O8P!Wk`1*sc)}|}^mc^DC6)iHy@S_h|M*SKl!KCj z%};xP;`KXvEs3cKBOpzTQr}9DJePdIZ+MPBEfym`?rbwHM=sTG*iDtg7Jj(WrQiaE zyO{9EkB}*#sqU@8(1FR35h>-4_xueA^n3i^O>cYV`%mt-xa8r=WFBk_s=VXsf_-n| z)O{7WR{4voiZ`tF4KTQ765by9CEnvJ-eTR_s0AbbI54N_RwJ9PYN&auo!;Srl#Hh8 z;!6F#o=`?D_E4W!C)Fr*sL4iy)a~c)owQ-gar0FT@z_jEGO}&a3^yyYqjIBsxy%Dl?Vy|IgS@YOIX=lKJjX zt0#wE@VyH`%a9|R=LIDqJRJrTLIu#D}m$BkkOy!W4-VJ|lP zz23i-S`K*qdV-;a?E8%R+v+^8N6^aY6Ghyi9-{l6&xa5~-9v3-8mX1kCF)i;4r?a5$cn*bsR(TwcNLU-(2^>}PK+rO1`ivYmx$4Ax| zdnR@7Zr`=pZyjuIwu!5>_hry&j;fRX<;0uKfEL3myN^2F1>BIYt=Xo<(q>lysN;Hn z6VF@5Ps{309xA^{m84s6?eU9T^K?p2?v+#PQ)vJIK!yN!mkxlA>UZ;>#{M*Pw@yy_ zCH%8w$|k<;c*OfoWS?-frAx_H9Y%Hl#rZ+_<}#oWf87K8ru^Ul>WGC-PhaS(*Z6bX z^mO4r>20>u*BbJjo%X&d7|tM_$jS zY{|C%;9M!ZU=mxsu-+b}Jy-VnE=P8M(oa^beeZbl^K1~?(Lld#>+<6-ZQo7AFZVOH zC!oeXx&7={wzqocV1Lc{m3^|YDru@CDOJ}u(opQ5fp;wp@W!K{4!q?M5BZ6B_hB}$ z>heY(JJKUN?vpy12H?-9&j37fg^&1n4Ty`D@tSXa#ddJ3yoNCJ6=a`j$4P&Q zi$&mG`slMxcGg`@>eHf@baSVsn>F^w%v5gDfrQ?mvv%^SmD)3<; zf|q%fl9rBMYh{%qt?2DR-fO(&pZ+(L|Guw9q0^m;<=a048mMqtjdeY-&I6NZ2JUyu zXVh*DDd|(k_q+vP^Fxn*>z}^LL#spCvDOPM>Zv$E1A`_TEpHrl20v?AI$r_q09DX#^(ZUTFSy1W@mP0cWlNgN~0+L z4s|S>?|fJ-74v9yR8~TiW*o3QV!EcsDW+qd=fzRy6Uji1l5rTv8J&@tnDO}V`TWM9 zlR3GQIp4c z#86qfv+%cy=r#0hA{D0hgXezrzHG%NGJ}MI=Vu=)eFh)DZ~I?6f^WU`HFTZ~6t)qk z;kuylE~4AA);~?9UVD z!wW?2$eUo=A@aNr>!W$8zG3DTItXZ7wpXpSwx%4Wk>JRVZ2ua{jot_)GFPH6-zwe- z4|u@CTfCK9y5->*)?pZCSI0k6Vn>+55SFlnA*v-^wxGj(`H+y%qJa#t1!_Bp#>iUD z!GwhG9lMLaRMat~;JzHox$Gu))r{TlX7E|x-HUmh6FHWh*_A`t<0lA>#&ZpKnBYvC2WO+_n zeT^D3cTS&42q`~V|hF$SioW@qn_YGh~A{0$cbQKY!lMWn<|o$m?W>Q~_seX~)@(>86vQS1;g@D6G|l2DrEHCa>hw750)cu(*|kMY?4i@#$t z{R8Ekd{{nxj4N~R@~-SMoJI!HBF`sx<`|vZIh-?4nyrseFz)Bt&(Z*$KcuDtG@=*F!iu@n+vGxTCCT4 zuKRkveAB<-Bkaq*x)G2A_0_$iTCUbtJ|OmRYWnvPKCihKQ#2(I_~uKxyZ5GdHf7S>wm%2$9!D@)TlGk^T* zsD-hMJqumwPOd!6c)5Q z%l6niF(^Xk#(bk!d%S0QcCkBifqa))1++M#eTY=QUEd8YL;gyg+SS-B?DZY!Dlj1M zz`k|QU=ve5h}J#U{jpb+(^yYigEkT)*^oxDTiUrw$LD!ef`@ppc~Ck>b23N!a$AAeo}F-49siP^x1EgUb3ZC4 zyzrK9xt%$n|AtzQ>?n@zXtx9Vc=nSB+1ZGSh=`1EXBfmtrwwiTy=k1@bu7SkB3*g0 zXMA7=D{*Y>svwKQJxOfm5ud>mf8wx@HA9v*veLmETOLW|8?>IzMJ`a^5{j5{bflvz zCVIwDp9a*Y7v!TaNfSNcuqpOX7_LiAc)tqLtXlfGoanh8fBTN$u#7X;b7(k|Z#awX zTOFwO&#mGyUR1E!b3gZUH@ET1%DGyLIiNTt$WBf8=KE2bP66q-51Q1hWfu`r_B=;xtakZD?H@S(a1| z24&&2SH$B@+_;t|ztjT=gA?6W-&`{{T3loNL@z@V;p}Rzn&K%|(~Rx!i`pZ}UDkrI z1QbuaU_v8xV*`E$X8p7U@JBN#tFqEk$-10yF-qZXpjO}IPyWl_{4Z#v8?{J5aw}cz z%1BYV8-qX2AVletzB+B)*QsHCv087o1G|FG%$xhcB8--CvP!dcUTioPPNJW(nPqJq zxr7KmZjQdRr|-_TRtkHN4#62*GgUVMDNYV3Sk%z$yI#TeL9?5UANesBG=BYjAl#!6 z^4l(M!HKsb2UF9I=x}n%1VTv_H4{eY62*<4UWqG4C}c2}v0~o5^Ux-?kf7%AfVZ>u zf?e!f+zGG?J=i-{!aUhd_w+h8jmMu!F7?LQzteRrJ>t zmva_Gwtm4}C$~X>ghjS5Zd;=`{{_GfVr^Otp05dWF?n9o17^)n1*| z{bc0-9<%plDIjKE=42~LiMjJ0a(8i#-1oM8!d7fTk2GJMFW)vEzfqa3*^+Hn)lYq2 zh|XN_{_jGtnV9T{{A0c?Bzq~8g44CV*%$fY?3=dfRHZuAs6kPRQJxA^0;@^3Xp8OC zY47CrrmyB|spjjVrYe0)Yqkcc2*HF2$4pX!_0?s@Nf7uTM(LP2qd+x;aB?6R=R$XNnsHq;8{<68)( z%Aoq*>_nAXDXUZ^*igONR97D=Mo`*?y#A_1t!h_oy{l5yX`A+{QI(1+=D1dOaw`au zN!A%xQ>g1Jk$T%d;rwuV-TN;bVt!3rzBKUnz z?m8VdfM0rleAOm^gG?;0)mo`77alJ&7Ez6m!p^@X>{AG8h-`tk^LCs6KuzO2Z1(18 z&JG%$pl`0`Y3>$#dvE_8IT-w%&puw{c(q)O`YFr(9M9s!x8Ft1;MZh)+1b`Hx5x#g z{^|_rV;hp?YDBjp(`bz7X_`hXO}ga_b}+ZBr9?LJ=e29$pBZ6w-I%fRNUfn$*tSrL|`eec9N0S#{lrB4Yx9>3=>4uddy;q`+BZtd*iRY^|#UPR%>`gF{M*ZfI#7zGl-=J(CTj- zIa5Mjl(owYW-?2-!Vz{+6?Hz9bjg)W$xqQ#lorm-t0Owx%%fD|jewUIP0{X2hSc8~ zn!yK@KlRYy*luA248%-FcCdGnrV(Sw-6URnF2%@PttJCmp+$C?u38zD;jX#4^TV!; z35EaSg)kzBhlzZ_+hzuN_x|`E%eQ>Xu?(@}E1)3J8#WaEZ;r+|R`5a?5%7~y8`Wbw z_QEeb*o_>}$9Y^q*%hw0cC1-(V@1QJv}O3!unw^)G_+k46EJ+CRS zr?sB5En`i8sQEVf^D-MKPBBI+vWHEZrQ~Xcrn3r1a@$s6>%xVl_~9oLQ)d@Hz|clM z^}Wwh`AgTY3>K4(0kE84(cT^N#oKY}-;kZ@s;{PX;2m#AYTz8XBN)YK#*FBQ4fpVm zp#86nai}If0-=roXf8Ay9J;7X1k1w}*Ati*-x{wTMK2KPfzGx|zJvxdrT6b7Pv&G# z`W?U37~b6N(o`hItZ|@#|GHOZhbTltEao8&QHZ%TIkQ=vYO3J*zkmzfz1AUZ&F<=M zleg)+ydw3eO9Sdxw}v#R-ue4#U-HW^>B6q^s(3Xo{iVIRci)UdcKjz0s~(!_Me3IdnsdqPbC6Y z&w`(9for7&Ki3V=hz3-mqL_=R7>l9ki*D>g!=lXL<_i-3b>(j9=0~6RdFL~}<(u{* z98qgnBg)P0Cv6WHAS#6LT=C5Mtf3PfXaTGwe!#x%tE;S~MTon&inBNbt3Qhl7&?sJ zzu1bswjr^OXuj*Io*LayuQ&G6uz@1R`}(O$7~M&soUG?R8w_reTRfn(wX14z^6VVZ|ZMt8uVnh&&6DBCR6YP_c)BBxC%|qah@}r6=nE8Xfxy`zIb=L zY~PQ&xQ~ap_3dbgl>Wc@BV1KBE%U0jveOFf(3-5h-MhVS^&RNMPI4L{PoY`#NuM42 zvE7yK`lVl8+$F4+zR@1tKI{YchLpcHy!*))W`22=d%3Lt>Alt3qrG15aJ}x=_Xb`+Xx`B4d4oG&Hm8GD^kd+nwtxG!_vnv- zA`}K9kbq!L8Laxcf}I|^09Q{GP+RRZ_wQ`|Hf_T;I|~@V^iWtdA#6XEp;03ZPoZl# zR`F3_=s*A>ki<8c9S7y86CPjqI+%;$5bE(&7&fM(Nni!qXXpQ-12E^EIFH(+iPf1#aNYBIuJKF#}ZIBWJnDHL8OoNLMi-;cNenpWI4#f8O?( z1CBW1j0>)2?8-qN6o8Ol>q3_{mD5odltBf6TqO$`%1D+nmWfPdCUaxr;H(f5Q57{& z?*Dqr`WdLzXzgujMpHEBW=f=FN~Ltl_kI^nHd{ug>-2Mz{4upw+QeX#?85$&xKsfrCd(yw91ZLX`DK#&luejHw=pv6y}~&+NH8=V$dy zpVM=E4$uBsKJ#bsOh^v5Dkv}bU|!JplMBAz0m$?vM`b z0Q==pySAydM11>JOzdc3>0&6>1{n?`F&Q|c}cs9kgEmv%^pd?;spCTDtP zXTD$ieQ_6iF}t_>dvKA7eCSnsAbL?S1Y;D|B~9K_1PF=6ESmaH-ickWjuPg>{=W#& z4)cMf>%qKjb4cC)(C%j*#K%1JNWN$VV?t2ag%p@V3G)Fz<{maK$62vykWl#gL2J1$ zORL}a&!Szm?=eI0K+_tS`KiSHd_w0wwhHdn8`aO)ft<-In$e)QQ?bc0X@)w#4*%Noq> zO%Sa!K|9qJePN}nb#1}u(ey9L#jPvs!Wn5FOZ+`deb#Od-KH3poHwNxzKIOO<{?ZQ zN=#8kF7{bCS`e9E;Tfy}J$dn3uWbm0k8mV_dZ@g4on06^G{D+b^t85Uf6|#6a%QHp z3&WY<6u-b5&wN+vU?Js$bx3B>o|IsMY%f8Stq7Qy@%{(J**1yY;Fenf{fzKoR!Zm% zP31Cn&D*S7&{a6b(bTsytS=H9ZiVLE0$|8wF|ApKo-7uJnFzpWz`;jYuQEVLc&$?u z4h5|<)eU^8HE@+ztaq}|QL48c`b`BRN^*WcdO@qo4Xnkl+`P&`|JUuc9uND^cS%D> zQD3gGu-w~L)|?2~%|MU)f`;TfEoti31YUGDr7gtycC5o5uyqP=MJb++7Jo9Wuy!A? zXkMA=6Y=L=r+9QYo95^hyn8td$~Ynv5W{gtEQ8AMogr&3+-NOfrqaZ+3{hCw@1jyS#zyP1WW8M>5L_va zUcJHBGluC80%zBc#7U!rxX9=9`ce1ULGcnD8GRBYl+mmK|K<26MUQ}ZQe?wF?d)^* zRU_@;zw-V=Ha?}_>CvUtD^QU>A7{6%!C+mM{mpf{AS&|Q!*a_2oQAK`bVULL+#0{} zdcb%T#hRz9ybcyEtrNbXR>AkevQ5q-f$ z;8N|4v(9C5%9a#d7V%fP>BpJa_ zUOY_8Ad#UOQ_Ju>ABo4^VNtXi3r>$x=`7KL4fJ9tFo2U6E89pwNIu(Wa2-JqA`lL^ zxz&482>2gnP>Hez`81tP_mvscF^9%(JEhQt9vG?cO~WVGh(Ry_A#RGjWodmZ8hkg+ z%z-x*fGS%=h&egORE_8~1?dU5!$6ltgjH*__6#*`HWG#pV*3*1ENPF{Vi4#G9w6fx z4N*AvEacv7YYc^m;%|t+WB@_YdxrdPevlLraoh~P0v)| z%rEr_Fm>-7Ezqmj6S4|0sw@wo9$pow1GQJcgK_TLF}KcW(P@t=ZYUL_M-QSdF(20C z8b|ai$O84+@y*w^hIoISCRszzyC+{_;s2Y{Zx=4RLUJ1!W@P0RJ%}i z4+RxE;>sbnI>ksXqbG(+{YkBXo|>fQ*X(kd~qjm}81qSRhOwZmv%GKnpH} zB9(gNmYOXyhw_>r1h*0_pZT0?)E6766HfRbnvfP^SRXIbTo+okc6?3eEtS7j4a5O!8w8#)a*y*cbq;TD9Lh)m_Bk`Jvu7h6H$+Z$miUOYaDi)YXbNP zg5a6t+!k3nCBy~}&RpC|nf!w7=3+QhQZE9V(K1r#YhY&aIz0&4#(uhrw4bZ!;E=|xa)OZt#Z8~ek0|JpX z0I?cqQWLI%mBjrC2p?eDTt7OTourDb@AKKg%CU+f-fkjL8&6* z)K_Fkrg|q=E(RooilAV;f_>^CE*`Ixlv1<2({Hck6}fYF&-*mvIb<;8=)}j^9F|%2 z=4z!%RdA;%I#t%`W=aTa*>V1m_o0ZA=HpYLhF9mOm@>wQ8Ju{dEqu9LW7^_Il6_w$ zkibH2Foh}>gci36usJk*g-YocGyBw)?0DE0c90Jx3GP?sSMs&IP77IlmlD*L`Qset z#$K3*5+;ThN%SUAF*R_Y!+Vek<4U=ZX_W^t9T2X<7m^hL)U~RroNz)_RT60wwnwqq zQX+XO&LWi{qJ=E334NvAqp|NTYtejH%&H@~a>>3hZQ`jCtEXF?gZDyeeC{@0?)b`icaqMcs56Z$F+G9- z*rD(vR=mi$3(cd+N;#BAMe(9%K?!){#?)Q56e*DHcvMEUC`C<^C4y6dnTnPh9Ic3G zdXObr+KzD}#V#^sBn-7E$pncC5k(`6aY(&lrY%BX43x>zr5UIv2A&Mo-D8M>F)#+k zz(~D7>_e(lSV1V15$j(rwlh|Vvz@te>>jMjDy6DUMHSU%%3`YiMXm)GuzmZo$H5C1 zpLVi_tm;=UtKcPa^P2&nDI)HjLPc&VbJ2JaCQbKrfdGdOYj5smDXnQroe)WvB}%wd z&Xaf$Hc1|+WJlp^O%OTX0?5NovWw-{^NCAG;R8kPy!ai`;-BLlVK@_8SE#Xv5XX%> zUBB}vWFI>wRfuE8Q|xFOL12>^+*88VmE%c(*9-I^_*AjxIg+5HYO^k0sK|i_on!`a zcUn~&E%_oIcn(F+9%(|&g6m7rBW+T7-osrL6rfn&$36n@r8V!ouxDI>>UvMV23rt4 z4dq;*i0H(OB`RESth=$ARPcClIKQdf_J z5ll_rSrg_(K5^-|i$<^ict5AmL^3TY=~#x%OORr=ETwRUqIVuLdXs8yyFXL5ZYqsD zB?-E^cVR51<{nwg=)Kr1D#sQey(a*nQ&@V4D5L~A~rno!YxpJhKJdyIo_{72|E>8rKT8HvNnzoqmbk5|Fjax>e8@aIqslMId zv3FbH1mV&v0vluf1hF$&i_%O&$W+f{QlVtaw1d&I!9nYQxDHYHHt)$&F11I{<%R?! zZ)T}sNiSlP%+iYnu}-r9hp9zGCTDAf-g4ll2e>OBq1f2-0$L%IDrVp3frxHYKmr7wB}s zqm|ey;!CiqoV3a?A=Mt<6Ha|EJrI~$g|We*XqI%HVM$K3zZ`WHEy~!D9d4{|y%;__3?!70Sb?jT!G{ zoRbMn@RW0H8kPEK+jy)o33wiy15<5Be@z4ZAiKkZx4ZO_b3;KcITw}l-O0K2aDjKy zA-Yl>l11mze0Bnfb#nbAyvE2~9}3Gdkz6kKBze9ZVs>{A+&k6VsBc%pvkRoSz%%5G z4O*H#OJh0MT*jrtgqGA|q2KX&&}g`5nN&lraM41A&B!S?^n%h_VaGyW(x#t1A6epk ztY&#v2?%%r#?7D$TJLPv!9CELMH-)(&+)r+T^5n8Cq!|9+KQNt3mcOZ8K>pl``#8Si<3F_8*CR0MXW?M*lEIe}o ziVNp<->i0#dT6W}Bsnsoi&<@qz{Vtzt5ZxxH05Q;sW;>{d8B?fuddu5Z*;p8m zRrbAI`ZZ3ymb;OwF*mNE;MAc2# zRViL1iqPx2JmArQcJd$!(lHAXwP zx7azVj22%g3;8&-<;JSY5Z@CES4KACM~cRgO4YG#+bL0EfDLWSwkH;_;wVfeUS5MF ziALKj+@aSoYNZU`oN~JAOo6WNN)uoD4WSS)VjOdxc;c74^3m1prUqX2mxZ zQsqHCffevEQJ2^tjvV-yCp}&0vPe%nDNAyDf3C0;amuu-aK})kuEedR6g3h)XVe4^ z<;V~~st#uxR*0)vgvub9qhD`|)#KWTFxlLVKHbxvv;;be_es_Qe3@iQJ)Q|4ZULF8w zxw!M$DEmhh03~(Ql;IB)&s_D9NA?wvNxXMGTISgG=wRoj9683`w0t89**TSXMUjyE zDAY#hKJg~OTNH*wyxeK#xOc$y5{&L)I5$OvYTliwPy)y{U&Rpp3(1MfAX7kZvjDc% zbLMupcVXX$A;zxj`*memBOHb}&o3|i$`k>~2lI;5b}U6o7qxO)49#r}#+sf0_&P8U z6$ve&IW9e3zHcMEb$x{vXnF%9B$Ha^ioZtpImUs*C_`Mw&Zx`q;mkmL#_q%3>dQs! z@zSm6mP?ISe#Cf`cwqtP~E=qf@e$&^IRWW-hL+Dd zg!dkk#nlT`(db!$urZpd587!0wDW_h=N@lLFxD#J9lNrQqMIq?LO?@euiau{GZGY8 ztaxqp2~l32A{uSYWsT@5d5&Tbwpbw;bR}jcB}rUA3KM|!q?&nS>&Lyn^HbZRZ6zS| zeT)%TS@fPe_Ot_wYfO~CQa}a-1l6+QF~d5hF;RGMVdBEM`*&ya&>kZa(S4SbLsO;@ zu2+#5MG)&k0A{AOWh0@3Jp^v03}%usIu>MB;3k1Y?(X8o$*W{wxB`tc_St}g7^*`_ zfHqCEV{tYW1fHD1LWV_|0KAZ|-^>2h9B=0Q5aU_i`!T+^@o_N|F}OS?=5E?(xbX3u z&g|rJp0D9b04>B3=VCgyID`-`_1lAjMQ~ujVpwb7%5Mcdb4A?qBT^Dx!V*|7Cg+bh zgNc2Dk30*Ah*A9vV=HE*Dk(-6eoZPFil)lStd*S5D#oFhHGjO0(H#oA^i}^DA)y$S z@&10ntp@oG7FmTP{X)6FBZQ#{L!hR6l0Xg}6kW)g7f;n&sF`IY$P!8@0L(6`-m2Aa zza=h92w)J^bFZchl+fLDH?o|rKouLPGnH#^4Esck ztos92!R1Ulr#uXS;v!uKG%L_YA3Fd|bdF>!&UGC;MQyZ0c)zc9v~ z76Gn+{YPnweQ(KS6?vbU24}_f+%)Frt`f2^YyX5B| zfBZk>byB?}$zkKbZBOarbS(frradCYxb-=I+-DNlj;)@*dVsa2X*wp6x$^YQQcr0j zKDEClrY9Ok>JH9wwcg~-SZucQ^gY@H$%s*Ci;eb#Xv`{qV5WTBi}4>D|6g(c_^b6S zmhCmwEmfw(g+D)s1y%jNOQ}=9I&=$-tmNlq`StRzmUTV8t#3Q`ov-`XUwwG_`or6oFJJ!ZU$p>!AIFE!-=(k9V*lJe zeEc|^8uIiH&Pr9~`A^OBJkH}d{hcH!|ClqfR1YcJaR28XmQI1QdjV}m5(j2A{a!#b zRYkP~<$59t6hnLCBDI?;_%<^%nZwXw)&iv6_pYug`u?tZjb6Q`gcuF+j08j+N~l&* zkS_^O-g`hiCjelr_160r`jnCLqioauE z4DXW9kuf_3oZjuK=HZE^VcRHr^xhBhkV6e20!@LUv~BVp0Gfs*n{T||$gQrTP8i~; ze+LRsNc`4fuE|F!o$pDKi=rIJdUtN_&?6Ze%8-j?(oRWD+bw3^&QvR#hPu8s`nK%3 z)?=wKQfxxNSgfuN!Ri2zkH)czJDAi`_mKRI_`dS9>iC@lZ6v30M+X~q{DX7i+*WMy01=-FT=-*pEAB(H zZ)QL0Pk6cmyZ0KqZ{IOY-`D=sV2S z1HLL0zz*Hjqw6|f8G<5&ixcd?6sKQ+WcGodk^${5=8icUZ|uyi2O2Y&?&jI5Jq!Yf z1KbON^30{VfJy3UT(Gt!(LOqoT7(xkVDzypeLQx2c=fyd5CT@`7IgTTFIVO>cd<_| znKFU70_A#qJrT=H!Lud;+huLPRsy2<+%u(}HStpuL$J%YSub_gNqmfal+dMxg(xl~ zVe4+@*(MtO5?Kk_)H!;z%^q$%*EAaR!P3no)egQ^D?{FL(m-6Rn>3J zeU*nve5uz-@r==Pf;*#CMN>&tS=AnH+?4cY)D6>~_em{RonWRF$)Ze5>8GhD=tOWf zjtg0;-TLgwSL2B@i9}W=RK78cH63yG7#Al9tXfpE@#cUsfg;FRRM$$ zax7S4LQ09DYWO{F5-I!^c}ib`AAZ3m&i{4a;ZI?U`lq(|W=`PSwFLHI{fwFGpYxoZ zB_>(g)`{4aYN6GhOIf`1&vK$AC%mZ13yn%yU$2 zBS{{={`%{uS2E`#uQQ9PuFP%bClwWuzE7#|7j533zI77qNEI(X2RM5qBlmK(-uJ=# zfUpT$wvx8fJo9OuFR5vxB|pB8+oH_wFj?Y1UkB^U6bc(k&ApS77D;eI(2y8iHKjRD zrIe{~;!;YV^T|}x{(1s%w#;MBV`y^cL!(LUb?=1LrE9ICBM37pE~|_Lwx6w(Bmu}F zop|uf2}jywe~Gos0ZDwg>xO0bq`NJ-Ew)qTz=v+{^h4H(+I3o@Hbjb zn8Q;zVywz}fl40#A8Q_VjwGLwpoc7F$#il7wFkreT-JBFrAM8xy=R?7eAD96fY-Rd zz_~2*a{Xl*8U}OBV;o3ctzn#kYFk7(_qkm)(uG2BdEb*Q>qq#e&XBCbJ=h0Q;9|XA z6(TK@F@1HxTFr{~&fk>RkWKPUm{~TmoK!>N7eF(J!swSkbmby}6<65rdJwJ0o znv%EuN25BI8pl7zpGx2P%vYYv)IL9XcucGJ&DU+)wtueTGxiG9{gfqqN9m81yJp&& zA`Tj9_eNOG$tq*h-2+;(Qy1_z^TREbC&R2C(YDsMBA=H|G|@eimCzK+=9NM~7yY9~rPQYo$G(|` zlQYJlVhP;pf-Ks2@ z688|)5ms1261mMy)lc;;yCYCidnUY&YMWF-NSQ%z$>B3{3i!-P!>dWV-08&NM&}YN zN>)26!dXIO2w#XAjY+Uah;;Z$=!!m}vpx?oO_Oz5XLG#{1BcwOrEl*!5WHHfAv1RX zwmCR7Td&|YYXIki3u~<*gw}0OA3D?2R*7{rhC$-Ooi%;;20VFZjcP@8h_CESf zZxd2o+Pbq8#u#JP@edjOsNF=NA!bJJ-B<94oZE#|&DypUU&@6d8l8wcOO!~_-Hy($ zuuf2W;xzS+xG%}8+I)XWs>O|(uY%ythXdfcaxIpHvBkD#n zj2kebBum5wpJU9_a{HFux9zAaXpQu@Dfx)&3H2biOBXB2?PE@Dj8He*Sv&2zg`b;V zgdN5Ud$jvZ5~(EV-3SJG_Niyc+w}ml<2{bn=Vk95K+;JL7L8B9K(IiIqAVIM*Z(t!}m)wq59_D8g zto=8>_ae$xva8Hqo?y0WfC(Y!Vms#&WG>=ni6JDua;{7{;|G4jKd@$8f;cyKUH?4s zW4PwEa^v8ILA&+=FvdrN=wwJd>ACV-?_bT+beWVzpad2zueaidcP9Ge{}rBUmZW7@%)v>`1+=NeHY^Oi}3nr zgMkA#Rwg!$nQEcb?c2}(eJMY;K8ssLTlCI0 z^4#}Oq~)}y6DA>nfYWitCOSQ`)ErsbisM2Yd(0hKN=KG@j5-tH_kve02OECn`$!pM&AtOW1)Q&e_kGB+zeoo7?#LI+AV0Wi2!SgARCX~&Pi~z?J zj4cEuJZcDrz+pAc7(KR1b|&slnAAgeJ?LGaG$MK&&S-Qcp;LH|<3tzRwlH?iBCuiu ziO9m!_5j53lOS&@79~Vo?}&({&8<_Nu=EX~d=u_j6gTs1NAsJwYVnxb(V#CngxqI# zZcRDG2=BCmvi+%R@5*eRH1v@f89OJq*m+~G!4Gk)uf=K^mG%ise_l-6?VJQf zVC%-s4j^x1WEA|A`Vb8a2@=PCLhQpbxw8d9ih7S*>vw|t+r$L&-Jv{Wl zDRs}W(Mfh6&wWqp`|2jyqCQk>5v&l}dt?ZrWX8rfWAir1D))4>^r$!Yuw&B&ap05! zl3PY%Ub@~M7sZQ)tizBghy&6TJsBE&i5|Oe+PtszQ(DKkw89;SLHJyBQqxmifUY%z zFdXeV7GjsKpyxUFJC4-kxn_KF^;AL=q!tEoS)VqEUMBXjYEl#iXJCp?Sni-WS+ych zcDwIgG4sI_t1YQ#`npyja1y${a`M45NXPT&*zoD#L`}J)C1Dk$Q)uEAx;nh*=;3dW z5PGIX6W2<+i>Yj_4H`RRaH}sU?pc}E?&1l^xMk_xXnIvDFM6Y?OZlu&h}RWZgC3g9 zaw|Ox*WK0CAZ&g#@9$A;Zil2qIT zZ2Kki9UoF;gIar{QA)*XaK#aPJ$P|GgsHXtH`iTr77#W1EV~bBa*P}`>1ruT&Z`xG^rvpL6NNCet!G*maQSOG|Mo*`p~x&`rPtC*;v1%4-B2$tYpuFpi+s9R z?9aB6m3%N1RL?yMxQlLJhyPPIUFso1X9YuvOEd&Y`!7?=Bz4%V3|JhrMQ%iV?i??e z8eylU98xa;{uWd$b)~-W&#Q*zN4y{!c&1_$;x^ zgP$@9G@KqBXVkGmbNUUhU+DBDP2PTcKQ)gwtCwQWAUY82oJ7N0elV|?_h7<_Zk-aw z3HnVEteNP7t1JgZY&9hfRK2UVE&Y28e6G6C0>Oq%Mfm1tyh=lD9#9{ns<;I(NX+m8 z=F$in$R3sX9lk$HYVg=rjp-Pedfj{eLKMMYVD#rAW0pKvl@Wdl&xp@)+04o6Ad7S+C&+~4q zx$C&Md@M0e3wLMxY*lup++IHlM`e2WZ@fXAD42W;;D!BLqw0JS%5W;BwVAZUTrKFi zX}v`2u0XDf`Fk{}55U!u*HxXS&L@1Ura)D)QEw!8ew6e{b|0C5+y#*&-4FD--HF}r zqd!yb>65=J*WQB(QRMRTz^1G3;HTdWDgD?dq%ChKb!trYyFT5yMV~>_KCpt}FS;a+ zFf&XA?d$Fi^kv*aD3E1Q&%slZOHt5Ws;2WZ^INl@`kZQJy-2$(xa_2YT4H$p3CPFb zVE7w4?)#iK)mq5Vq79IQaTY_%GgVs<@23PhX_Af2!_aJQI1sWtFq9|b#bH=wwRAV# zm$hj?M>22IKBZZr3x)QECsY5;ENFzG%b#G6)QGwfe2ne3KepBu&kQq9i8l1lznY?H zGDQlBYv8dfq+bsn60>av#S{(OYv6(r5%?!q<^7;1IvV2-@c~ScRF}9hsoIC(rFej+==#SSJd zpVi6P!B-79Y2yD%_S}7bA!Eg+H$@ISJ&uy>^&~i2kr}N$2f5$Gklp3i&bw5l zljx}7ovgv3b;1A7CB8%QVgRdnhjz4Kkh`Cx9iBn&ioQg**()$`4|0?58cxX50+Co> zQwiO%S?0=57o(lN`}004h2!P6s=-eP{zMbMhimfU4KYC7iv-2Jd#nw0i*tGzbaD8^=WU}wPY5*_2vZn&@3dId2_WH_y;w7(( zK9!6ej~nAtUc|y z9xlZP2Iz8a{NUcZ!auZ2oHILlx_VIjWCH*s#&{T%n6)&SHl1HawaJyT5pA2F!MSFL z0u555!XQXOAO_Gd?Dk@_P^R;yZ<6H7;vN*pd+65&o86DW)6T;!o^9nVtubWq=4WKX zTIf0Mwe=q%&&S1$^taq|ZOPyJQ6CLGGYFQnR=iFt@TxMTZSEIVmF6UKb6VGV_Y$k; zG6&h!)okW|*)su_e0Asa*JZ z+`V6;lP*a7TfFnM&1T~Um^QWgCsT}3A&t3hp`54WRrsxq4^7!|Ou zh(4Eam1@zT!>6d?VB(*1L4ZL7wn{L-d9{{em(B9?o8%<52&({bE*7gNTkL zapIU5uy<^xIY<9w2+c-?#3xWe8E!Vkm81akNirI29VEM?MN+kDFOfMj=k4W)>zP=ZP+7Z>iw;NfLsxP9f2A&Y;zgG0)fA9SjH(MkVuf_JR zK_16eMJuG=*((SZE1pts&tR-86%_Pu=*?ClT{(8PuNdZLtoWfXPrMb@yu?$#G4a+& z6Zqc9mp|HJa_LyQjQ4MVpSyNs-!@if&%SIKF0Fes3!;ghR$yHI-tPjMkzQ~DPUcYb zR)UP-VNAh+UkjDaSqA^Bcj+j1mH+*) zQcll5XPSK3@*YNGZy%qrm<0RMV!12W{|Msr1KE=k&&dY%#1AjT{ge++4YT$&2VL2* z5Xbj!^ovm^$2Bv2#cy~Lo)pZVg_rE~!}KrdCNz|V^%Z#Cy-iu7Zet}9`nY5!p;6GE z!3!8=Sq`6Ac)BJ{<}MhEriOxMahwc$;HOpf*#s@4#hI2J$gEt#uf{8!W-l^Wx|Fk2 zq8PTbROAyi4z7+*Fw|5YhtlB;^2Z&^mhy3tq-Jog8iu6@5=Q@GDhSOc_N|4S%fkjV zYd6!7EDQ6P5gAhYM<&2@uJiQgJJY=E5*HP@JCSdYmmz*(ePr2#{WG;;iU?6k6}w^6 zs<0mm>2a`RWVY5CCRUuj4c$SKMnAnmz?_#kP6N>4=rH?|lE`NhWW~{(50RwYLvPh* zgS6f$(d+@`ruqnrn3F*LZdaXlAJhq))$0srJm#xw2uJCM`F)Pvgb|qhF?^CbW_Hdn zhXaB3Q^wOB@Xz(HA=M|-iNvM?8AUvoQw1WM$`J7HG8hsynwvk|988Qra$;sfC%dsV zk)T-xHacUKSzm*JA9ud+WklXg0?PkX(9uS}rF@XbusN?($-lk5)2KYnuV8gwW~KZV zcgj+gHdmFRfbzC<8LLsMYO{7fEU4aXWFZ9oRYr-#qLm8gBTfk{2Az0Zra+QV{hF6T z16O8_e#5uD7f)$Iw?XK`&&;Vp!=@D(>mMup`S{QOJY!Ov2^2O|f0>F9v<2Rz)HLDU z-#@FCO7$nwSWgepeP$Gil#&3uKEvgm=%3a^Ax1)KQfvnTkzP!==a19KTu@d1AvbN2<}m7)VgO@DiSxe3vlQXUUJG#k4 z5Z`{z2*ZjrsX~~*S-$WwF~dH5pcs#+m5m`!&e()0|a`Jz=-XRHiiRiGm#ef7tycDou}C&FGA`cB9fyb?2Gb)r19i zQva39w$yK^5MGjYa>%$F1ZhBhwrRWU-&4P6rap=xP93qI_eYiZJ5^@73?& zmLmKdOjGLsVSNm@k0beg5UEzFv*8(2u2)C6ntL=6u!|R@9V8zt2?`IA?Qis7;{(+J zs&2x~ayrqU9dFKmS1!+zpRh|Q`3Q>S7zou}Wjf%^fvl;hvqG1*#{pp}78YT!`S10_ zYRX<@+Z{c-Edv}yt6SKtRtxQ5$T9^&>)WV9d%@nmS zU=1WmAwTOwm!}fxS}q%=LTY511mC`K5?8a`5i$ifSf z*gy84yxL19IY|z#%<18`t1Vt+*_eJlO#^qLb5xDWF}dUqU@0TT(HLfu zjSfG6ipTvyay>LZlW2W0I@gtl=d->d<+g$R<}V7#Yi&AV!>rcctUG$Y@%x1pMcyGk zg$JHLmS-&oOHh`2FA+0K_3dpf;x)bmGr*s{tvADQ5#`fvWB+i}z#;sE~P zzt*c|$qZqqL)1|<7|ard29`z~=cup7;UY&gDsS2H{acMDuzFd;UyQxpuju#7<9lg@ z>*y(R;ybFJjP_@SaoEvnu%_#iTiP`6&bug5db20;kgxS}MuP0|B96crj`G`tQmnh> z(;~zw3w%(MivoLReI-E#Z$*QHvfFyof9zEL-+y02A%pha?eOm+9nh()(DJ$%M@4jf zGL`uth6C7~eZ~Uq<`NPCd}r?BcAcd*5O`DxyG*7l3&;ltql{U^0A-6C(X?PW`X((1 zqF7Up-1n816;i2NgN0q<8c{$mf7a4WRSaA)g4nv9Xm^=)g&zs%5-3!ex6=3u=AsIr z44Xl6wHPVQ@U<*jz6Ej3H-JpzKEHm}Z_oOg9i^J%!&NIZ;d~&HsMG|iN99}z=6}w3 zi)eG4-V{rddP81k1%K(besYv4G&4y|XI#sLtz#rEiu$(G(9qa4pMsDO?ajHSuT70i z%uUsYeSt?ki?4cfp1GS@&qQUca+|oH0qJ^KVOZIJfz6JSQGO&IP--_LqE~{GrZdlt zi3M4Wi0Lf*`9us1mqDs{f3eY;T95|{<|kqP!%0s#hzNZP2IToEidH+QmMHLz6#fd5 zTRo6l1)FG+M_Bb3Pvy;|l((PCNigRls1laIl2N~O-v|kjL*G@8b55Sjf~E?gd-KrR zX>;;NDwx5Tn6XF`eQbx!YOpJ9OD~QkOZK&laTsBAzZ+CFr z3Pi@297SGwY+7V0l9*R?gsietab(AoRIMZC?#op>iY>=MgJ8)xhy1#pwdR)My~QrP zbO-n+5A@#*JD1q`r*duAh*^F?B(apgJP5Fz_X6I~AL5+w09ob5r1#7stY!QnR{KhSa|}j-dEuPxxLmd< zWpxT?V1kB%3lE+BO^R768n;@}GX3m>3j@RJowIs7o=@DJdBq(AFGMrOiVXe?X^}a+ z4I}ehK_K!_waGWXJXU!2`-0eZAjA&@T(2z1xb$3Q_r=OP58k+QEL7g=O}YEd{O7iO zV9Q-ucSRKo`6K9|6AgSi4gjmfk5|JS;9iwp13ka0)Le?ioCZQtysm=$)HZ3;5C7lB z)hqW?<1S`6ce^RpRojQggiFVj|7m-?^-caqDWBcU5iY~_Zr3Ya6&Ky>nj#uZPgpu! zZ$L)*V;uOL%k?*UDk_ zTd`u6TH5QSj;OX}Ou~+zRKJ-N|%{{)IR8|{GQi`Q;5r;xd=gFYjX0ofsZL$65K6Iwed`!YHW5G13 z#QUQU*)b>|&K5h|y50UX zLHN$-Ix{%AOM52YjW8%dEnL7bq69~0R#%`04n9jS46ESe2^urDKc!3p><$6A77n-P zq@QSxDRh)LqI9Y;T{`vb#hT|j+3{>KW1G^YCqJ1k>hb7Nx#2yt;}FY~PNZx-rcChU z7gJhCxp#DxrgGHS?`DTtaUvZc@^Ym!BONxO;_W3ma`xPYB57!Oz7&ntL2OWWW0GY{ z;JQ2i_OXwBQ#zZ&THz5|ixKpkY zdbHRS*2R`MHt(4gcd$;m8D~eqc-kjkr)G)vflW0uk>L{TQ#S>t+$LpUVCxUya;x<1 zf>tQ!_^XA3pS2*mRN};don7_ObE(JuDn6 z%rRjQW$m z5p_M2eV7)aIK|XwUb6Uz{_L?2I;}Lw6x|?^gApn&ox6^U4X4*JGd?_$19w&Dy+hi4 z{r3jC%nLm);?EBzA*yR0=^eS7T9kS7POEx0tuA=C>yvKh4t3Akw7S=OZruxl2$LLM>~KiV5cQ#BW#>!vp7Wkq$n zb*SUj%)Z^qa$~PS%k2WlsBB@af0>EB+M2 zzE=WtyZ==I#YGju{udsq7WVgc|0{=hVJgx{i~XN3(Ee`8DfZ*Li@j8_yer=CXGwGW zpEyU~NV0Ai>^dJyw%TiV1Rw;LFBnlj3I$P`_vPo@q+=^<-j5=nsk)EGo1*Q&`6~8 z0@cj^gE@D@-^0#{q#L|q9d1s;b02Z0=(=k@iXMKNL<`q41b<8D2BLD9N>r~pF%D2( zt~gQbMlTNes+vdHRfz1cing;)XoLW*wvyv0q|A^h-Y=288RZ|dceu%rJc-C?hoK2pip_UY-{IW(0Qh|dPKC~sLAPuVZnHPe z7nzDMyWJi*WA;GYcSlAt>!t&rPI_pxi}Nxii&FaN2S?d}nTh-20La=w=f$GFlVdG7 z`jXy5J6vGmA<`@~=`r=7crLOCpGdcZDF#cF>qT(0NzFM@9%R;M2$ih}p+D0dFyo+# z+O+eO^iV0XPF%?9{!`!b1L{Zn1sb;!f>!iqo<+eMisCY!%fGoST7C!r)&r0GPU#<< zSyV#bnjZ(r8$AWKaU>w)k0MbXN4E5za=e1OxR5(4bD|JWiNR^loR`(-=$XA9`6E{3 zPy#zDBhEHlGsW#SEh^u?^d$_FSlj$aZEgV`YpFDn+PqqtVOON8H|Y^T%8L%Q`TGj^ z4@80;`$!5=?09Nuv%6JsX#k#T?{Y)Onlv&cCh#uvgU6YntN;(_8pmgDrNZQ1FlB0F z3K93{)gZ)&@>nVdO&fz-DjpPk+m0~~hbc$E0A0>OC^WO~{_Xb^8 zcCxJ>MRQp5?4$-J)k7cFHzj6K(m5_P(Bzd!kIz4ggOI`05Wm5bDQX9>H0d=I=(2U? zHC53iOW|4{jdW#ObceHMo4TIbva6*2pGo;M+f%10V6!rarz}^#!Cy0MI3xWABYf(t z=?KW}^hU{+6f5QuJb5$Z8ux+!_Z~*Jr@h2YW4IxCIt3@N&B${dRG51MyU#db_|T%% zha2+FY-?hf=kU0~zOPFW>OOx_*=FV{7T){3Eby!`4~!T;dfdB^@BL?Po!BTAm4&v! zRbx89(4FB(DdP0hF~?GGO+jhd%iJ-k;XmA~^4o*4!qnI!)u=C9HgKywaitSjl^pQr(M-*nh^x za!3RRQw+`mkhd)0O|ityAA_`jpwU%2>$S18?F?x5vnUVJ4hqu*}nev?${$sPwG6N83uoWlud`mG7$FP_N`F{O9AjT^M0&%6jp!YT+?lCiN zn?j;L&38iLcQG^xZKm`5iMuMXwITm`WmPsSnApfvC{OrjE-A!hYc|{wKrM%}`N4W} zW67H!mn*y!zpY~T&9>2@Hb^X_-p-}o?Ux1mhwbi^ z+&r1)djnW-*wTg$XtwzL6?qzJev1Hl#;l%^ZkukzWnt)9WVv4wLK&H)5ocvexwJ#O zvXV{Son&g7kh(53AB)e4sG0iZe71LCM<9A|K|}H?F{`7sN16q4*yxwk8WVzi2WF>) zG)QV-!D{LlwPIB3`EvHV`2M<&juT_$f`AjIJ*z32Nlu@(XbTU>czE(KXlRk&1bmE( zF1Y7tg4DwUD=n4_lL82KD&X2|`KjadXBdt{x z>4Sbu!-ern0dP?~uu%KjtzB9D=vLDiiY=wdCM;I&OS05=F0cA3nXt3E)PLN_8=QuF zVfSMiI6G}-DHsnIn~66GG363!qY-OjI%?B{ot$Q<*KU$)uvjF` zM<@aa-N7EzH#boOt?|N=qTBG}aN@7?hbyukNalG;aL_6VsL*nrJm69aY=;fzrE=^x zG4<-W)O1$Eh8~8}3$vPL#9~-f6n+yml@r`0mq8yw8!-uMniX_{Xl8@&=QS_RNT(J_ zQ;hhQw*_OA7X8 zSz`RA#0J;?d+ZPl+T|1A*n}5L{PtH?ZFm`;$va|U&mi|$H;}d|3E+bTSWeSq!Vj_( z_sHD&@7YpLjb~k5zPDU45%~}K-$-aKQ*zad`y}GAiuFcO1;)sY0r^@Xo%VMxt^L&0 zHS;>(PCB4p zKE4DKh6jd^o|4Q(fAa=e*#{P4dwJwEsS31l?TD-G#)rg(d>42 zFnHXS|J?W4;&xSY(NYx7iMunWQcJc1e?st{lSc(!#h?wolyFIZ!B#$PL{V7 zi>LPZIQrcs{6#t!uo3L+^vN~iY{&8lQwy?!p`L{%Y3EQ|-M5B1vwzq_FF3AA8!``# z5oiD7b3|$_Xsj^ES7@8a!Y{Ww^B?%7Y)Q2Pupw_YGNP2Q+S?$Ly}#z%CQv+y=tL`n zF*sBnr1O+&H>XAqUBX$$Cjd!11weE@BYPg^_gu@+dP^+@w+z7mCt*r~3L+>bM=Mkzw!ozO zAFzR1j<)NdHfd5`wgw<@Qom-`>g;9{Wj3=gf^=d(_hV^^1kD`q+TDSJR%rU-RI5tT?N&~Nd*Z|VT#Q}BYY zhkc{=rle7!Uvik8x^bazl|Ut7I40e~sa9uU#KLO7XPRuWJ%so~NO4(DCpf*ANvotR zkoxHymmyX3GgNs#$u{BG{2|^qb~I&sLiv(ja{eM9I}&C95r{Mj{Tp|7`Dv;X(z#!1 zR4s7NPmhA?9jTt|N}*c<$TwNkeFh^;9v55H|2g^8Jol|d_IqfF|KC2u&lVi@mi%!({GhqzXn0SBlaY%)mEcmWYw@<=E7@8PFV^Q~)QTCQ{I(5uf zNwW4?s<~eON z#T0xf@oPUFtR%=%ki&qxJ*OaGxe1dzzPv!X6iq!e-on_y{^2LB#6GCdJC61S96!i=w_xBM5uQfd||Rc zO4hQ;@fnG%qTIAmH@%hFsa?GW1Or{;R5DCjeMHx<8O#|=a4!qhLrb|@?ob`;eTyoQ z9*2xcjR|{F+0?gPzYr}wL%+9{C1EhE!!D>7_AISTg4Q}z%MUJ}P|{L0k-sNNZtfkE z!N%+@QEJuR;ARw?$&WF`eDn+kqNwhj?GINuT**A--t{nKGV`7p$XpSfOHdmzi$!`+ zxj#o92kmP!&H_sSXlL6+l-%U2Tswxpd;#JQyHgV{l3jOWYQW~737F7!N{s`$aY=Ux zoy{&rES8FSoq)BW0}cwmuDv8`5>sbDrQWtoBsKZZr_YRG6jN|18I`ItVvD<*K|6>x zGkf}Sz^yKaM2j!xp54;|5&^tH3nDsuv-?@1ZufW2?h-Mv`{yhUQQIQpBAS&0AoRnm z!MHD62Wd0dJ}n8UhI=Tw#uj>rwIAGxqUeeL*0cLc18*9#Nh6W+YuEbz&AVyO_w-(~ zW;8j%7A1O|kj*~n5q2kJ6l2@e%8nKs5cS&7KMvI5qK?fr;9;3xI0@bUq}*NsZQbe! zNUE@KT5RtnWlyxHY=41 zqiwbBN!?*t0ur&9&d`FXA6u4hk=%<`zg>5DI1WL^Dp3nMTq1x(4d_^r=mmK=ez|h# z9;N6k0~A}0%G56M$o7c9=NbEh@zv_Ml0VR1$GP#-4%Bld{_PSL7U zBTsB}6(+~RXo$T(v3a4YrJSpGO1(cZMUXR? zWAVe&UgaC7r%&zv>?&M=Zv8y#!&#PkP_a2Q9kdTBR-P+G!M<{xsuJ!z z1NvQq-su?1mDrqkPk7TBQv69Bp>l!84u5mAJ#*R*P*SDz`H_dVeerT3b3Bnj7j58_ zGF2Dmx@z2ibmgIo8P5aIT#$k`%K%dDLNu|m;Pw8b=#e$K@v4a16ta-qL<3=K-I3u&n;)*s1_BAyNXm>QzWY!^L)kf%0`XppY>7(!=T#$ac&KW-Xr zXq%Z_dF>S>r}%_Jl}7%jOPEL4!I`O*^6*jKblgz->VBJ6Xg8r?HgLjVb)UQG=8=*K zySW;k-#>P>Gfbt$y>R4yZX2B+Yu;p`vSbFR{MU#I*3s#;Y zdlk=2Sc6~M%am6Ck&A-82d(NJH7bKND_oK147ctyA~>{t3i}84-qety@8&`s#g0@R|&Kvc&YNHpwg1))?v# z#9uWd42&VZYkDD;qB`4OiqJND=9}O6*hfx%-LAQc+e+!-48f#!@=lpbLs=3u2SL7H zaW?F_GywSGA1e!wjeX`1dm$l4?2a{M+_Gy%bu&A4xuK~dryzhtJ_4I2M$|)&Nje zxz6+5x6bZoM2#Ic|2Cl7J9DPPga~&g5sFG)BlFQ8UQQUnj}g!m%L&ny1hD&f+ZnP> zJLrP&!krSa7#69Q;gGfx2ue8M95)XSa@Aa{KXQH>r~LOw>>m|^!MO%VyAJrtbx*_C z?ND(A(zFb{a8`Q?_)>_}fj~iOwq6^j+hF~nf+>F*gye-S$w%imCPeC^XGt0o?3g!v zgD=vZwkc&?9r1V_iWcybNAE$I@@)PPqI?O!{M~$u|9liXc-M!l)@L|mC&AT}PWbRZ z%Sys>!^i&UqVCJ5)@1uPt8 zeuQ*w)}*Ks((nYDHh9%+=*Orf38eJ|81B82HNAmNr~U7Dh*lN$u_xX?M6b2eTJ6P7Gbyrj>Y!O*d~cA;mh6CS=uuhq-M_LS-5rf z=$c&;nOc&i`FGQ-h0FJY)F!g6H~gF`hdkK-;=Hbg`Cw>+3zr$GSUlAxKJD79-lMG0 zFEt3)t4t3?iqbOs3x-0Eqp6bm(&!)RgE-sqvR83^G{xBHA zE-?8?yPE?t_L{zt`8ViVaPlZ%z)#_r&7y}1&!N7N(NE$|o=Q^t8e6NT? zk04O!v>X(}Hy9`)4hj-Ey{4w0meQ|GODBhwhjycz=3a63L~`*#zL~=&CG2%iP8z-7 z*Ql)prcu`sYysxAuxO79Z~CO+S7qk`VZ*yc;*0&1T6@8yfnnF4C_cGR4~SxAV8lTy zl`fYjoqtujC+EVDf>IKkF|xx?mY1FEdVHw|Z9ViBafkRa(9moFYg}gY)$#UK*+a2dt2(P@}MjrK(Zmm(ZUg{(Rt#4 zr1ot%>F#cJ+0=!s#CJQxVPJp~()xJj&T3CP|;k7ged)GBHw zi@1{P99TvmES2Sag1k+z2Yb{hiB|V!pEBwu1KY0iaB#x6w&md(zXe_$Kt?N=#9i6% z4&RaCuM#r~T$sUdNHg4FNe1jJ4$Jv5u-{%>$qKwjyNA!wVQ?!+k{GY>oIyG4k3C=S zd}5GuGo{?ATs25sIw*G?v8^VMn`ozP?cA!iuTmN$@reUJQGCTsAY<3eC(C@xcrCHg zONoB&P=`WtVcM8kl(TrK5;?2|L;Dv=EiI@4Vbuoo6#`b6r&O7ZL69a;z6{6T))N}z zJPU*6!%`+MjynqQyg)Q1Z)#~&^3)P&PpxRXXtxz#nWhu9@{|9<-T3N9`qhO_;(n+{ z*5X?b(U!K8?N#RQf+OJIQIUko!`5=8vj=%;ixg}WxnI_3I*_{Qp}D8{=A$)DKmAFQ zW$5V+<8_mVE6K?mwe0|V2dkYVaV{U}89xs&JSIU6EXu;PiC*f(+P^hl4{Ub!Hv3FT z79R&HR9xv?w)6WS;uhk3SQ~mrdAd_pX9aW6l@(=N={K>ZH?lmnh1Bq3Y%dDlI%n$g z2HT?eWT7d*pryVzr#FQ1uk$|qFl>|8es1|4mmWO@l{SS?(#NRe*NkB7jl-Q35B?{J zp>H;w>Pk?sAk||`7*f}K(uedM zm?ZMu;n!#kua0PY(cnR)G{I&_*P)53#F^|%F|)%ui}yp)Jx!M6O&c^dv%utuCddXu zEL$hS&dG{z-6Ya%yO&fqge@x{Ml;ieN0q%uiO-7EBmzawOM7qsoT(f{ZU8UTtn?U7-Hngj z%!lk@fcji*no@HA@YJt1CJ`Sm;Tj!Xs>sR?Iw-#JW4UTBG%#^erZbcq3%KeUvh+l- z?Y4nR6ur@vSB5-fh-Vu48wz<9YSqJ%qd`J2T5>WA7V=`VY^0sUOZrB`ks4Q|9F_@~ zoVBV31AZ{XAqr)iL*1W`_!=bJ5#^E{g?-(esY2PMz#?nIr!4{9Aa@lCl`qCY ziD_o`csOm@xTa=1lGnhW;+p@H#;Vs(3FZOg$s3JBeI^GsrL^Rd$i2=e*=R8QFdws} ze#D$BiMz)MX=&p5nDGHnUg6~0Y)(tnKPK1bXkZ^|N_(gYab#>LM;Mqt!N##pEWNr>ZQqP1QfT&Ebo zpS@+=lDPqQ22uJuZmIoxx%8E%-U4lRa#J2uXYnJ(+kMa_S%uy(!?bb2M9-rWt=ZP{ znJCH*-~9$|QIY7x`*O83Tl=FS9H<$6eU1}m=zpTdp>56-4yraZ|7D6JyJ&11669G? zY!EdI6V5VF!UBh&S0t)qe`Knn9FNUYBa|f9T5{uq@(&Tj4jZL`{Agm#y*WVX>MA{% z6V5_>sb%3ujwVveLgMJh7N3SmmKM#;U(|$)uW4 zIYlPXH##sXO+Of2-5rk(?Xy)sq)#_RTS)7E?e|#1hOXPD2k|hqSMAmN71hTdu5>Q1 zLfmkOpkc)DVMwjW&U;h7-I~@!Q>cF2q~QNCUZ*5+M|Ai*T~L z0Irc)9?OMn@IK1Te>}%y;xv6}_`Gp%jRnK$Jb$+63y*B?EGL44vBp| z78P0(vv&EoY=E{u`S)(+XB5(eotkxHR_BM{Jc!-eC9LEHZRcfVBVjV|b!IUw8hm8`R z%esW1eR*S|#1&nYl%iW`4jDKDYTIhqmju6SZ!6M3<)4AwvpwmL4Cv4^3 zym9+SeX@)d1mk>Wbi@$(?0>kv=Q=@)$;89RmDBlNT|GdTENW5W2RM!IJWPY}#JwJE7(xz$(E8?~pod8}`@UsB6l!>_nMB~3fy7nIBB%?w{Kn=`| z3(Pm>xo;uzK@W4i6yT!%3mV_!t0ue6C~{5m25h>GNz_(B1AO0&MC;>6akL1Cs(c|PF=V*en zY3Dl*g!I-{Oosm!ILf9$v|}=Ry%;Vr0pCqG`gY9Sx*jdAVqAV(63P^VM?+d;OmWR2Yqh(sA)`{yf9?ya&yCzy0@peuUW*LtZ^t%xDr+F;dT*o7D1 z5^dPZ4hVwI`f*JFGeFG0C6k`H^J9soM2UvpcRf{=&uqcZ9A31-nmIbj_`Ixv$o=?- zK2KPv2bAW#tsL*Y1wJzc!xIv-^_x>f%-=_~D0{w<;d&$ORJ>0^U)3>#+PqLtQ`f;< z&mIDLAvl16P5+7^VBRT7txfqe6oM;89|O{FV%DD`HZ9CC`RQ8#t-moooMrRYADwhA zuZjSiQR90<3I0u>(}iE$jxf|wN4zYayu}qgMVug<4?l^WEDuh9<2fDRx>ciKgvT!lohfvz?d0FO%}luv{zDBX1`DHB(p!-Xl9w-`LQiSqAb-+iu@~N<_%P_&7;cpRoz;R< z@W$&~0id1+xmLx`fD|XYjUK|2e$zVpl4j$}dQPmb+h@@weP-xA?ztbkbxk2Tf*U53 z31WbG@4(Oy=d^RgP?S;#j-8bVGp-n$ry*n*FUPy?tnxn|yypcuX35WA5r1k)@-QB? zSk*~KY`HJQy`ng(4*vy?$WBA(B8d!UZgF-OPdYWgY81fv*N>q~#bj@>eZhd~rm)-# zDEzz>G5m`mFu(;W4s*sJR4`B6_-^NgD>3m7F(u4xT?X_gOgB!a-kmJ!Cr>?^9PX+-%fm=3M?5 zv4SPU^tqNSonJyMntqf??n-$@CnMCI-QX@{keitU*|eCM^f2c|_a8w4=Z)QU*=*Wu zjs|nw7H0|vDi-?P4rea}C9KW6F@8ijkQAXdojjCY05?~n;}|pEw&YE3!lC=~n$t=Y zC|()PzLRq^FXZg%o(=w{j^K2cIyUzVQA~@^I^)V-9J=fQcNg9nH%d=KA@w;e8lemf zrKkh$tPm+0y~Qt`K@9~gZwMA9Og5E6`=&jBg^NWGOf+%?sbz!QB?565-*c%a!Z%gx zdypZ7UV)(Zy1j}8qBsx#RwnQ4L-6&7#T{Bj?@l?p4??^wv%G8A+vx(jJ*%mBxn__Z z^P18Ce518rb7bTa_QrPlk5&tY>jF9pt}%}uJ!DE zzL3re7uzat+pNx=lnQ5vy1m0Cnw8|tSZZxf2dD4=BRL}6+XWc&Q?(Rg{77>~Y>zK- zkCR^XibZTf4U3+sHGTkm&9x@U!WT2O9o_x$$d9%*lXKyfy}LNUp#}feU(ls_10kLi zP)9*8EoFB(R&TY|Ce76`Ja%|9O*{=+CEan*hx3{!V2096f~#h@NLb)oTij3SF{>bW zdvaO53mNtnTC51sfpm#cNb9aqUum$T#qsMDAV0CLg_dnKH|;e=c;_ZvjI^40Y+wxi zZzVm{m94Ee>>wMwoR%u~U^fy%teqgbZIazYyXn{*e9KpYX9PUDT6r_KTxXA8Eq5Nf@N<(oE#IM`LLMY+Pnw3m97z#|NT z*4w+>0Rq2pMt(_Xo3*IUxMsH-{S{3zy^a|i7eTVB<>eG=Yxa+^&y&LQm8~fvAtj? zUfW^@fZg&|5}9?1`;0|tBvRW<&tdt!F|q44l$40L7v}9HYj#r_#`6TMg}0%mX|JK1 zuHokFS-hqCZScK%VYAR%>I*u z7*ECwG>mj6=?#D=k!!~cP8{^!!u9MZwexQN@EQ%%?YD7?Ql}(j8jhbgxRt~aVMzV< zRpOIQz=oJ~RR(ptFBlRmKDH1^l7DF|{4+H`ceE|JUx7w2*A&!X!stKFur zfothoiG67R4D|yF7rvOX5@s1Zr7s9PB#jFCb3O(xG3~YduXLv+zmd=jD5l%(__2jC zF2UML6_rz@A=+-M4<@#hDC|TQ;$Xc7e|rVItTlcu=!l{=Iu8{?rZ$$y1ALZRHn?2* z;$92T19=7VDh9Xc7T$T%Z7K6KEBnNOUH^5(Z7zEP&(x0K^PwjP^D-UC5G>$Tv9Zxj zv7IjRUk(hSzedNv61%nW%(>CuIc=kM+g63EkP;~)F}=5KZz+fVP8^=Rdqu4KYW}9= zr6_ie%2_V`Jb7cJoc^`y=Y0}*IK~rXI;2L1oJs+ED0^P3*B`(=U8$mU(6vTs1CIF{ z9l%iyO)<{!()zF+JI_yqaDB3J(xGmpJYIVxxoB40F- zOa9ohYq0Qt)G;KX#Tcap7*EfWl{qT4nFPRQ1gO&zkJzEuz!nMtbk={o(wyPYa+snA z^Cak*v3E6LeyuD@Pxw^Y(Qe)|_lkV!l333BCg5%GKZo~_dA4OUUEnii7Ep=tv;!#z zM3Upup9!@Eg*k-Do~GPA=o>WUGwHqiAWK=?HY;gFOrUaDlOYeg2=SEboC33~64@(# zhsdLpKIy8$h(HNJDc98wGf0)ax~xhWU!=sUA3#Irj?n<#`X0A#j~?PbS6eOt;K z^U>=bmem_&v%=C5eNu^4=F%trD-2vixR;F~x*5+^dwM2hmSZjC`CWJJpqFe|2i>)q z6yBS^X<#2m(p#_YJ%p|5Wm7sUxSeoGom;_C#HePkGoK`1zve z+xgaqMChPK%?0Ha@h=dW=S-x<-EX8|ehF^xiY8gma)c|LgQSdR{x&^gIvgQ%I&=8O zE?KFWN^)&Z7mEe0uUmq}-TREX_6I+SKmt zXT0cT5j@^!q-UN8Y=ai;;~w=}?-DL?b3ckTm~!wSwn%Pv2v)8K0p|Y`UGPX(*M@Nd zIq0k}P8JamE{@N1!XWI>C(+Is|hxyf-4~;Gox>U|;@-Jt1Pe#&njA;09ZBsky zsZ~$nJcK^EVoAqSK*hDV+z-0R;0aX5TW)+NtbIZ&g3+&5H%UaWzp@XYSeZJb_~|m! zpZ!YveY+|v@z!thA>K-mpjXcr<34CNvQkU^@7ivry;`IO@9UB zctlj)IpY;&@sm+dWuG5gNGlhp5=Ud@w( zU2{vOpW+l9?TPI0ZQ2+OC`{#9zP4Ej!ouYwau;&9jS*r?Ba-(<+kNW0U5TZcNY(VQ z$P~3YUrJ+%I>9axv8$v;fY^7GPoY>xZ;DzK!e9wcYkz<|qGNT_c^2y5{CDIK=ngf^ zeN6MGMo>BQY|}rmlE<%Qdc`{Amqt$Dp#tPibbnI$iN-6Oa zG;y&|rUG)Lsn%;o8d`BPfqU;5MH<1uuXz#2Gw4Aee=sVEl|W2+XV7D@cRSba=O+@v z|94ga6M^O~DkpXX_~*}IQn)5-vE%y|%a@A{U*kllhY0H_$$eJ>RuOEkQ+%LLsyS+nryR7jHJNVrD{wHRoHnL^~grUmS{;758t>u9r6bm zF5bN8Wn!UiFDMDm2)M0X?%xvFN9k{8`#&lH^5?W^&akTb91%AR?eS*u0v-Knju56-kxolEthC!5! z9M~bU3#MO-tFTG0>t zwL+GAXPM2n*ORUr@nFgDKuZ5Y=}>$br4=qT|KXBkUX(IxLU)G%%(p(?0weefdq%Pf z-K}W|JY$v}e`leihZcF+uJ&?wC{;E0Zvg>{} zuj17y-9yc39QcnMm523%UFCw+rfxvg$E{aszxKr;1JYJS>jy;(PzM^|%M=;kEJKB7tcN z?&TH!t0cuz<~b&F(9Q3gqo=qtp*^EEi&+Z;u3pTp-_`wx`*QKv?L=1xk=p$Qg9-05MFk8IyY^XM zS2>H}r&t%Ah2g1tIwh9UyTul7MeJd`E+rvZX59nkYdwMouJ?=er==AC(GZ)}(*iyR zl5+R`*CSp^_DDm?+e~&b|J{6QR8+At(0Agg+=$RmJ5ZgD3Q5d?v4dx~?T?&?{(}m5 z;CNhBi8JxXX6a2;=Js(FPOeb^4pC`jAAdaXA8qP89$}E-cbMNnyVKf{D3`rOTe*iN z*$OQPLGX?ndOZ{tX<#DU4MWXa$cE_ci;NQS+Z}vrN>*kS8N8fN8uh@aNd0*RM(Ru4 zjns_mk?`_WN*Kk$teWmt*YMOCj8xo{itHFC&Bt`_)5gKi+2h9_Fwl2vGDZ5qxx*aY z%oN33XQaCQscG5+q}`dKh`GV=m{f;)!Cn{YtPFJsN>V{CUSq3FAxRQKsii^7h*D2? zv*ndMS#^-V!A)Gd4m4v~b=!E__~#a`Si;@klPxvkq0MZ-6$noy7!N-)b)}`LUUH$S z0B`8H9y4r1U)fvf)pEaQXx)|-^YbECPbv1kG9K6T2S(n$b$iQZS5(lAf~+F-(`HW+ zYqg=~Lv*awz=i5LYAJZVFML$=Bokw8c{=z5$zJ|DZQq5RmeJhWnHK%I24}olB+p|D zSb>ld$H<&LU1V^y^!;0QRCpS>6mD~a=c+;&fOjJGv8pxCrkIO#hpWiB7v?syCD3$g zR2@KKsI6iJ47kzGZpLet^?-&Du29tVW2T7c%iBgp8Uw4oKc3PE1{n;{?MvJy(Ea%mbbmPs@pr|zJVu4<~& z`h(vc{YF#KkyE?*;EkJ`qIgD@^%Ulc3Jt&rV;OcNiu6>Z}!)g5oJciEyn`Fvc z(t&8)6HXzwg_F2RI?vwTK*K;QPFN+A52Wi~DENio_cG~dG&1>UXI+JPm@|8coV?Ze zn=~})(}&ZmG9-&0>oABMv3+5i&v@3Ta&^ijg`-V`!+u~^=R>5C8;4+xHMWis8z8N3H z%DoM@rr05_xr8(!x}cyDk>;v$rc%~Dfp_{5B)PP)6t9v7nLjZ7oBEfxDoG5lq^Xs% zvAK5v(9}qctkHuR<`2@r8>EDR67cHUcMn%FdG(s{H}1*#?7~fcv80*#bCvY^<#Oir zKljle%u9E>H|gFiOKx@jcJQ*GbRyz3`gwhz}KnnaSmHpJPDYD--bEQ6eNxhsE+0SOKHbf`N z{j$8Gh_M>90-TEtNqv4T2H7{>00j%!KllPlVxB-dC_K5D)=z+T6pN5-6|cuCtbUQKLU;w!B_++;e|t(mR} z->8uMMHr+}QT_fAaI>7NNI3l%w1<>R5pHM3`{HL}ft6o2!+Z)Y64M&yK*cdvO1<|N zLe093o7r`BJ|a^E=CWcTM+J2BHt4WB=c}nfJxxjyQ(c3!D&s~!s zOM9E$hQ9k{Y35jjOBT6u%?v=uVxW3?sk`$TmvR)F=7dZ>&w{8eGCFarewDge zp7%do_V^!Yt!;SkPquR6PPodtUh}IvE1zLZ8oxAn%zRnoU01?m&@ZwoFmt6I{OUtn zBncgK9D9l&pCpsYufBqMZ3k^nrPT&AuQD}qBXlcSq}D(U=Xk7oJIv+)mFn*Zwf4)m zB^{Mf@9e(d80u~6X*Bqswc3DW=_37eh8}ddv4xcWOy7z}_otapxohS*J+MW(8!M)d zl0YTYNJWNhW`-hG?U`OhsI{xez92ap+HH}ya`;j1nR}a3oh!2R-`#3sCD+U##oZT_ z(AD<>N(#$iO48v-I(((N#_Y$0CU#$ibu>hcQr0{2oXtzhz1wT-zEFn-#Rs5P{p*`u zHJZrMu%IyJ;`F@~HA4JoG~PZm8`-SUOm`5tr^Ke>6Xoln&V9-BeN9~F3Ky9t0)0Q6 zvj|J3p67L{A!*>-NVG_n7>dMGO{B78Gf3$w8bWm9Hn=u(ac^K>G|)=c2DIFWH(9Js zq=q>YUcb`q;Q_&n?27eRKalVFAet+7tOH2hW(hI*g9+OW8Rqh=BmM1^9%2p$(LKi+ z?SrPSuXaOppbfKj1g}T|N?SnLIZ9tTkrHNC+j4r+iO7h#F8|47N3(tsC0dm6t`3FIZ@~Z zudl7wGV!YiP>l;QGcA2s5sR$1tHxjhuutYmzuLUO#lR_&%H4pces@p>Z!9i!B19u3 zdLd`mvUhM^=d@$QJX4{Gg>pJcWY&e%K>bu4k`gFATDq`pkN~La@&}CW`h1tqB{cm(a@?I#MSBipH=z(H2WMaEP*vSY_`0 z-sy8gi{?Gom$C(lK9fhyFDrU5XJQN)!@rd*-+%iWyr#)G6@HbXC*53FokD~H)enZZ z5`M?_jKQPKm64YrT;K8%oFQ4sFF}fM!dn_QsrO~*z)!hVN4!ER7ru`)`S*8KVBQxi zukT5~6fNh9eVz~emG?Fm`#OeQJ+x7k%)hL&eC-!Mzi?2!Wcq3mRySFhVKWfLNG(we zkKSyBW^F-mZhv6je7PP|sK!d6d?IeZ&j>CFECV&)_DH8-9nDwD#;fmolRX(+3KrFc zsV}nms1pCJjnFS?vlQNf1HCB)Jsk|szOw!Z*Q2>M4}fUMR6cd9OD)JM{QZrQ-iW-g z8&IT%`8>onqS4$MX81zPw%8hU-3>#1!hQ%xEa>J0&a9*6Z>w6ME9+R$o?{s`Cq}%{ z#_K8Lp=MoT`s(%{*R!n1CY6NOPM^Er5I{S#iLSNUSX6y-gnc>R+-sa%|6=%Bm9^l7{x$mZ^?6KV{txP0HL_m2hI9m#Jz zA+0}AH3KPz5gM|*8Anp?)#QZSkLw<3?%S|^+|s%5?yx6qzS57KGB#1j(hX=C)HI)> z_=p*(;II|#y}g<|oqFdvU1FBOM)eKwj|DvqCg1|(O-{X6SL+0L-3d=ySIW4S97qZT zrSq&e*hq9~TxY?p>pd|ZWj;(_t8r_(#)$K4I#ccYR=cj)&bI1%y))(`hHf9n?f3Ph z2($|o{Jzh-9uHf~G;!++6hhb0dqTgFz!BRHn$B7DhxHhqm!)3TX~WjcLp-x@f7QzF z+mHe$T|^p#A#5*#VY$loHYdvdJEth&1s+Sjm7nm015MkB(jlmoF8DAo_q>H<>zc+E zN%62P9}~6)(B5sbsfv~&g}-1HS=vUiugCnZ$67EDeVXJ2? zU$G6R)5Bqfoh*+8w7KS1frO@W=EV?{VYfwL&R|!TcX<48WX@wX7C$S9b^kU!13LRF zHmd9H`x)6(O5UdJzC0`xv!8Yg_D=8RXs8@6!=X&s>XlEG=C{B}#%nwGWEIaTE>-&f&3LWPxL&vYxT3&=rwozy-^tTT1zCjOxA#b&V&o)e4=%wQ zqAFpIku$d_;zGRR+k~XOsw$GN8`rh%I?G=y5B1Kv`mt{DSx^jO>V+8gtq(X>L^0F$ zcR2#lle4+p=F3PYUkqXTMd>BV))sR86gV1{9GF=R_?f2*+a=wi zlM4AUF)o8pLoXa8b-2L~jhW#Ib&op&S>n2;VEPdBO!tom!R)F*;`rfnI`uOEwnDOf z1sKUlw7jAPBo?EIz`J|-cq!{B-u#&gxxHtzP>2xMeBU=)^oLfRF<98&7c_&QcZ$Mr z6^KJi-g|07n;&wb{=_^up#=9UCR_nDkAPL(((IB1{N!VUaOPeCPs|XXsB&<_ArNP3 zBg&K4rz0`mgx>8j7o6Tx#0HJ?V@1UcvLt}AcJIl%Q-*AUPYyCalp_V6snH(Dr|Q&$ zJKRVS1B(x1e*r7UOL zYqTV>rpdG#Xc030gg^DML%;*xk;ZMNYDg-HsOXqpqTwkxn8h>>Y$w?^#yolN$#@PQ zaEM-JEdXHl^Jw>326pihoyTHcX#H7Egx)`Fh~h;P!xZM*t%l>0VAvhF1vl_B*Md8A zKQU$^r`F&E=d4XQ&WS#IgYqTncCix;rq|=9>DpWrxV3|ZYhL-DId4p7FIeHld^Xd; zbO~y~4W{6uu>{O)6l^z!ci8W#MGQR4(OVqeXRG=Fzq!Y(M|Wq?7JrV|;0~*5>2r9a zElz8?iY_H%^@%l}B%{t=H)0@bYTJR~vNOHTH7R>~xt-qT=P~{FI}2vh#NO#;>I@9D z2X5)1(5>qDcP;DuX5!(YJ?S68PsV03rXuTtfL1t&eP$Ev%dS!8@I6qb@${iEjMH(< z2tG99FVcud!D zs`-YOGLN0jzAU*Uwg3P{H1fRIjikrQ^v<|VSS+&;9(BbDCr~q! zxJrD5WuIg*`~f{gBl8C~R`lA8r#_#jlQNH~0&3jiYMc&w4JVnK8M2CAs|@3rQQq*% zxnAM#p=q1D+Z2yq^g*$j--`sU{G0JG-@z|rfh}d>}^zMPWKr`&ZlM^Wf1eA6W zJ$gTRHxEBcM>pSI7UH!CGJ=ZdoJPjVPy%BAI8h*76R2Y!hU;w6KC9J+bzSDjI(A}n zqweMvu~S`03<+-!&oBJkHAX-UXDG>u(dmx4iw|lMKFIShz-W+80`jXb5%J+7#w#jMht#cZlql-$$zh=mHu%ekS--c(iRd0H{&PIZD zmBl)iQn|ywX4d@D;n)!988iL{dcFtk==HNK*or$CJA8F+wM6u&6o&y0BJe_js#C}I zE2)VES*-N?-zW#)QR}H)oK9&R6=LpYT$(j6=z^^Z(aZcP3ddB%=Q6PRX;(747?kR7 znJJA5MJXeYx+NzVQgbQ*hkAJ`$!f7iu?a=WxVkdoRm$=uYZXJ5xr;_+m{tUK_bY-^ zo^aZ~LA5U%C194|H;9VWsvT<%v#I0xjq|&4`t`dCBj2;`t0a7sx zIM3mSj5c4?#Xh_O(SpT7?nukGr(#=V8}90M%c&>88qnOznE`oZ*m?wwvUO9nFv47e zGajcGPJW9iy7>9pcM5nr0J)-3M#0Sm)pui~A`qg%7Icz%p zvF?e#D@_k1+)T4cMPqv_UJ0qliP;sz4r~NmzF{iSZ8D$e6jVczfAHbuNDXOK&ft4a z^Z|9XB0mcmEthADDa^x893=?x2ewIn;pw!(kRh%;&fU>CKd4g&Ie-;LuuRb#b~Eqn zgm&ItS6f_|)t@sdu=hVGtE)&1bD&VtD_o?Io5KuhH*c3C?A<0V7PQ_l_e}T=q4tWj zbTOxkg_DC+6{HOD?}}6vJPLij5(UA}XylnHY(r9%1K^BkuQspDX=r)$?H%O$G5+oB z8OcG||4j>xzmpd2Adv(00Cz>E&()H1HjBdiC#*hPnTVK@i7suTo*`l1baOe@^52b& zQG^WRt7Xm0ikg&}6q*@}SuHHfDZ~Jl#n1B%NwfFS>D~c6Mly}mgy-_;0_Q4M=os?= zXTxv=Z)4(XI<^(|3h-#HJ@I2Yn7t*$2ds*Eq6iCGKl&I9iUIW>O+!opY%f09 z?0$j!D24mvtecsz-_)Uh712xBrK>#JUY9bcrgs1_W zv?B>P;sk=^GKNRh0H5BVljgsGNd#kehgtmiRbmaRhi$S8!`~lN?dP7HHZFQZJiQBl-iJlAg z%P=uR>92X@Ya}8tMukGTt&nV2Sn)<*@(d-vDA(ffW^7zx- zGOqWEqZl7Nr)!JT=#;F_WK(%<28m*mEs8Eouhz<aBDY33K#?o4ecy0)88n@)E_ zYNI?`7~Q&2-#~wicBmoQO{95ln+goCsd6-IovbV|v8a3|Vdo6IQ5ELCvXC+gjG!v^ z=lXm^m}CPed*5&yQ7RyL&IMf|NP#Z0lsQo|8w*_llclG4e+JR)Ur#-F^Qf^+TiTEO zJLOi%-rp&&lB@{!**eGds}HVEr&`k~MKNPR>*mnsEBBoJ7L&lp5*$dkBp0$i$hGY- z&ghXk9m~~CC!=v>t<_Bv&93->>lejAdQb~CePFUo_Bc%@PZ5WlcJDWg-!WIliK_qK zb7${=SZ+*7Xa4wOr3@07+}`xPWw%k|Wv=}rLC^MYjXHLG6F6mJi$!5-hHB&2EZwbQ zS4tAD@(kk6lgyj$T65jpW+f2$&hy6a>9vUof%8_W&89lS1$7m4v_L|qX59*GKloWC z;9q^v95A`G=N~VeMU6|eX5Sb{+5~pBynuEZgW-Ql=CAX0$HFXDLU&^BfnH!2B-weG zy8=d94c*{)j@V?K07mpN3%#D3Yu=&fzP+M8(pcZGaXnrcC5~eam^ucNg+(&U5DcL_ zKVI#Bb)m%grtA+4eyFjrjp=0N$S0oF57c_~W@r$9TGD$)c^aK;CGO~%w*AIP zG08WByO#7#S_u73gWn#59}#15y`UW6jg?9DrO~BVhvToqb6J0jc~c{vPH3MrEjG$< zAqOh;YFadG+U}T-x6I&J0lD=PIrR&_DN-zw^Fo@yyJ9tym9w)2r92y-l^V25I0);6Oa!S%)b8!y4S^0_YKb-Hz%TROKKC->I+pdmlRT@;_8*1OF$7rlV^>@2p|fI5uV zb?n85cJ_UK?GMj__Wowuq3FYlN9SB?My2BScQShUFSd7!S^AC>+x^rW%_m8>hn2pt zG`UvvE0PtTpB0QB%jC#~7xXtktCv(SQ3;;(br8x?mzFPgL%fZ&W z!7ut6JOu^#fU3DXb3TLb{D#q)g3uRZvtqrC00{Jg81^Pr5x|={4lLgn4^oHR!fgpd z1tz6?-HbZN0(fYpr&W@@rmsr|KxW&hZOeDJ7Yc;MZ*y*WtCs;sFmq~6 zWWdIqN?c*S(mIId8b7#M3g%U@AtL&hf#a99*tErl-23|-g3!`b#Ua7?`a&-sOLCGl zroqMPx!hPO3c5NM)zW$#r6m-*zhbzS2s=wJzlCOXMZRNSOp#@^1XfGYRx7AG;*`5{ zd^~ojo~?-;zSzvwOm2YPzA@)dO6u#@GrQaQ;0 ztXV2VY3bYmTDN>^W<&#&=ZRBYV|K>=E5G}}rysC@!npKY7ytd;+1iiG*V%CHg5_?2 zx}+b3g5OIM9iXgZtA-__aDIcIx4zHH1irwGb&e@CV)J4baufzeNu3P(++s}Odpcx0a_4pN{T48#e=$(eXI_dna=aY zmFQ;X3V45943f~W=vu?6smHmk3xj6LILifrOf)Dma+bA8q3+SOCgP>PzBr>KY5RGj z9L#Z|l?tG2)M&#fmSE>K+Aq|ll^UO`63j2v5Ld_HmLU-|7QaT?i^Lgi*_93TIczOp zWu&uL{(XZZO>l^td2GirwSx7R=YiFLL!);hEHTY%)H)n-uaM&;|UJe_mBOf%?M(% zx$Zk>5=f^b;axk&nuY^5tM3Y@KoA?Z2IWK_h5^Db5M5{*-=Ot3OX+i>3u#1(bgma78Ug)(5A~;I-$~mhb<*i>A0z^D4Lgg zG5wZ_o-vrevH}nJ@_s)q(^eY3f>0}PMv|~qwmdY<&K^1b%fr2ws7zan(`K7>+Tw6* zpy$6(4#EjK;gvV5OLr^Qy0%1&+_v!!hmVHAuR0n#Jp3oew2MxT9Rb1g>xW2QbL6lf z{;74QS06sgY>PDgV^)v*tJ8H{YOE!4Vng2HB~qu??&|Ti-+xAy_#Osl^V`NH3gYYZ zJ#<9SdK{F7-iZ!#3j9l<)@P%AJB;bvh@`q*UW=j&lsTyJn5?vR=~QAOzv^?VCa8DK zuKWuCl8J^#GyQp24uTn9bD)<)2kdNf9?NwZsi-y~nG-x_b)Z1UqL$mH3iyGjB(gTg zFOQgfNSaj1B6pzeZ1Nia#c^I82FZNVw26>yPZrAH*rxZm5}Eb=HLqP?aAy}AlFOA@#0`t@0bEL&MIzy$MGHZjMQsAFaMRB@)3hE7wU}#hxl78{a$Se(5Gd5;2B~lbXhlTf11+abiDL zC0jvi-H`EB1;mPPq~btJgr?iTHU^vV&gS41&Fn!#!nfk{4IxuF0R!%B0o}G$7V=Mitrm&?J%?I}IszFna?gqljM3 zJ1F7bHX47j5qdW;}$Jf+|kJekCmaZcreo2mlJhRf7FNoq73g2VxrDZ&0rrc2c+E?v5g?pNxo?zcz9AW}4Z`=P+Vnj>8p>LIWa&QQ@nl)j=7+BV>044#5&j;n>ledS;V$Z&Ca&A}OxF zLt?kbP?HW%s-wFoUao!))j1^0@)ri<5Mwr6fO#75@AxI7J`G2V>=vGSy?)@&cfOK+ zfMCPlUshpXFI-t@Og7hZ%1M*b=PYjmFyU3vjMEjKxnQ|{Yn61wQG=%|!m@3(f$fII z@}3Dd?zoHC4NT&B6OyNz4}0BlKl8%E@VCnd-3e9T8c8^yrRhWx6V~y*C|=V5qEKas zbrcWu$|%{CMiW^@tM_Nsy+mcxnXApbcV%a-oj9objF{m}HiPQ|;*Zs9+Wlu0L|CI! zDg69nx2`GF&!-@dLtDN9rX+yl*u$e;?Kl7?+Y(jbMz`@_^ za>wp`YgyjOE`s*cm{S+c>b6yhe#qa|ISpw6h;SBeaf7q+d`r~Cq00AC6Pjc_mBh_|aY;;E}JVg<7 z47K5gH`qbCW8AZIt_t~LE;W(4?Y#8V)U-V_V)tC~=UG-Do^4XGyyqkm-wh0I8j0Ug zcIOL1G#}XjhoU`qeFn6BMr6!6Pdaa_D~%0w1eHu*;d~O*Ib~>lzNR#VMhOBXjhNXX zsI7U<-Ak18A5%|}=fLlMgGC5FjWYA|iXdb!O*avzh%P3_IadQ+$gfk;Loap@j*Y4L zNnUCQYvxmXzEy8Nyo?`qj)o(hg}BtIwZ7T4!Wt!<>2ZxA za?t^JrCB$+zl#`zW!{+GK67RJVDG)r+e?sKtiW8KO;XN)-9o(NatX4yPAqe<8__gB zLWYC8HGKUtZAcRdl7+EU^oFc#Lips0*8PShlbiH^`?qwF#R-(%TX|1R(l~Jm8|UPA zsv{5*q-!>^#q|1Rok16hxuSA{knbTb)+?9Ro+ttf%N?#3_^$G()UaVTGjzXA99bVD zNG^X6SH@Bn$-gvrr*i*FMhWZ-qrDMuf#*PEc_9+C1nCzE0*<01vdj2HAJUB9T~O4@ z1`HrGl!XL$qaXey{({gJ1&1+1>^xJ7sG}a6Du^JV1;|F85V$`JnoQWKZc4qFq{)K< zu7IZ#WX#_YUzKjpPeeJeH=oKCreB-i>e&>a&?a+Y%xdHvW0B2w4%ZX`J+PSZTyt%o z?&ueHP31K{IXY94I@k{GV>Yl!Zhy?jUW>%;$vg8$`(Kl)&$F*k^cKia zfIR}-RVYt(5|gQIiQbwipm=YFG(iuSAE2d^UM*dfjMXD04W7TsEV>ShFzJG}3w|bk zy}g$%-+2a6&0S_jUpmST)9Mj@wCJX z(fnnL;n`_t^?i+v2gkRmE1|0MANXIt>K?QXmG*w>aFVNjhtnxrU5%UYmfINr7C>4% zj1$OYJ>je_)tjij78Gv_dlri!=D7ui6t#s38_w(Uw+>oiYzo2rC?)K-JbKCS23ni- zpK*rzO3MT+VoAj3a4`#yYw49LPO5)>e9JgRJ8Oki_&lH=#kfezn$=7FMt@p66hCgk zH(WD7A|i3JiE!%tL->4&wicjS1HM*a40ZK9V_VY7XLQ*P`NM`n=8<-|c*`a=v<|(& zR^cW;BAH=R3Pg2yq~500K@W{=$=YqWh(1?7U)GZDS1yhf)S)!pVhS`u zsBx?`^j~J+JcS8Z{z>-1#gf#;Jf_#~1}tcA6B^!0qCF=$q9{}JpFficzbu&AIG;=i zpiH_&ua+uPh(OdjA<;)6O025j*AQz2I#)A%4vD?Ri zdlH_}Q4yRD+JO)c36LV|MfQ80l|vIiD7~(BFznL2&faIhh=8__c&We0%6>hkC|1ha zH}Qc!MZ~XEO@A?6U^u248l`pdMZlgh^f_cP_o0In${_}DQw;`nFBib`R$!wkw7b9b z5^maoR!~OKYnHf5kaVVAgbk(K&n;y$>hbDczuFaoFvh1mau=ZAzqaa2-XQ5<9V%&a z4^C1kgY}#nh5$z1iZGq^8cJDxt_ILeqh(kIh_R|MUm#B03x!8~^~O~E5a?>N=Q#N| z6#T!S0+U~6%^9y_eLZ#On04fj(ExzDF!ag+96c-)S2y^35N!}r8vTdkO*YFO0WwCKmxEB$!aVHk z2hHA&Bt$LAYT{A6eDwS)70w!-&PG19wRyK@Tq4Y#j9N-7Y~ajCWImUPiR)8ZXim7@ z!|@)8z>-DNG!V>pmzT$Gq${ZaN(6GI_QNf^G8Lc?L8qM6n?TbPX-?y-RT{ZS)G2J$ zM@eyQ9b(VCwwNXFQjg%bnBwZRakvoNr|=iW6c;E#e1i5(;%ijgUFst6I|xFfECWv? z{n-ID=N>_&@+aKw-r(Sx!CimkAb1SSma=qa87`l?j~zW7)1oMMMDSg7G$XV~z^E`f zgzeT|?P(HWQix?Q=Czkk+6(rZ;q}hS{eD}US-+nej}v2)7v@2aApq@WqZcHukFXVb z)6gD}qy<;lOuibwYoa+HGcMtVT>Zj5LP8xJH5&B5CEYGDyMMUPwFK0Ih1H5+~t zwtWMWEJat?Vt*!6EIInsydt6G=bz-tqS7?h_6|6a*UGe-!`zzx(}4*VEJ61clv%QO zYQ9)XD~-YC?wd7y4XTlX&!^}pU;8De$_!U7CeEnW&NXE@Q)_rMDvePzg(<4kVo?~v z-&XsV#lzy7Q+2MIgz&frKYF?{VktTxjT14hLbImRDJr?<8cB3i`og&Sv5G_avn$BZqjr3W^`j&~@ioP6fd z%@XBYbR425O+QwNBUL};J7|M1-yYUX6C6KVfp1Or(y$w#n$KO5J6&Es%4lpQOj<|TGzDlcMMm1U?)AY(; za97F6F#2>qj%l5}RUqyguzDJ#)U274c;%Clv=8!3+=#{`=p77bDOfASTOhvC{UY~i z?dnd+8Pzvem+Gdn8Z1@mYDS|f|WdEvBN3~$kv{y&_3Ace`Rgly>;3Y*TX`& zRoe<2d+=WFK8^u1+jf_-d7}z~*JM7S5oz6n1D7 zY8D?7QMD40Fzs?Acv?I|M>_TE<$mZRvU7!_KR=2UmcpgmMd90kGeJv|2O4`R?G17% ztZ%%V3l<8gNn|V^SSpb1*0Rg;$OcA&MKF`?lqrh+o%wg=WqtkK9Dy8m$Qm^E3`n~> zmdgNJ+4}}RqxnK#;KevJiSV-ra``S-|G0*Kj8v9$7QpIq+g!YEowxqOM zzq$_@;ED-BAA8xOE7bOOub=`|d1cXaeolXnAI*e*9Bq%6HrH% z{V1y}eL}}Q+E8s}ydV?9{V7b!zv(cVs6s2xT|i~TNL&&(Ji%Q2o$c^xl}mG+2xsWmVG8B?92E3M?283;452jgwyM6ZoD_2U3N+ELzkKGdf|Wy$J@eJp`J1uG@n zYuxNWb$Sa^N1TJ!1&>W1o9#dwu2iD+ww#_-dDGdt0yUPjr}g0Kz_5Byh&wvT55&KB zl!)PLCnz8z zDxWp-q7l`*GC;j}T9 z^OZy<35^6rT1dim22sMg&b*oITz;&|W$)wXB)#kWevT+`alnvf>q9;(_hbq~ch4xx z7Zhs2*1CKf@%+I!EsZro69=aRsLr*a26FRUu2NiTUK{gS$BjVn*m0QUuJd_Ab+1Twfy$L2d_*Y_4bu)hO`5rk^RhgHx+^aM4NL zm~FUuJ_>q4G-+3P=kz*WnVL$6h%=K51La*I5vtids|Kh36A4F=s z8Mrs!7Oy{JcPJ&GC)TCN3vPGz;MM{0VyF1JJo^9p(T)Sfe@nYa-aL*bB*lGTCk%k2 zjPS0%8dFrYKr}08t0LQIw;J&CrW?gOu@J~IIk((XKICZlgUxeIRw23B0f)BGa-VW> ze^0(#UETO!t5g@srWKRg@yB#XSQ$w&WfZB2=0hlF6*!!iN`3X-1EZ)G6%REX>m13M zMJ-b&TkVc~8hbV%)s}2CrdA9>RBp{WHAJCGaF*{#b|EKiSC%hCUae5zGb1+FM$=;p z)BN9ih}TA!);-jd|jpu5Z8+^T0#;YOv2!blh}! z6=tFu9qWWYnUaZ#)Caka{*eEWdp7IZKk za_5he?KxQ!2<`!lW_YTRXzm+`7Q5xJ7vifIj0zcaxhITXktE9{Z`9=24z8=|A%Qo_ zaclzYv2~>M;f__o{|LlrwHBg-ebogc&yL$QP;sSYZ&lP8bvAxb4u#?{1kLMgn$!IG zv3+*GT9!{kz%`S;`@)VPS{#nOczqa{%5+0Jvn_vZA<5&&acfk?SOaxDSn#!$w_B3r zh5&!N3%7blVySxgxzt2MH5om(Mbqlg+VZ)|D#(U;6|k4MY0{0e&_E)KUUr!!uqH@^ zg)T)Uu1d1}e8^XPOMz&>-B9dk{`XB)Kxup1FNx|2`Tht=lP^KofV`*t3gEAR1Hz_R z0cW;B#F6rKk}SZ4e?|D{$&{k{cN2Vo3Q33&vn@jK}tEP4y`+qYpDDdP{zXRb|`Y==;i z;RWDR%@oR0a-bP|a7iq_T&=~JNngvF_-%#ZkY%N}dsES}hz|tQt}ah7H*M>qD%0s)lI%e8 zEXyD;tzxj_=*Q@sg6^cj0}fd~Q$AkNKLo|wHa7t_q!dHW75hn&5JCW_*aa+)Qp*ba zvW^K=*c*8`EK>6bzV((3aKK-B`v&SLsAJrVEm2G8wa( zX{#A8Uc3%9OBSd7Eua5K-*~|ax9rGL>ll)EjX{d|(%5#bRdvW)fVS_pSA_)3usVrB*#FZR>TJAg<$wBRA|9;nH zyRy3OUN;TUx3^;BygB;CArIS|R-^As)wdBmBwEP_6YKD?kO`0GTqM>yV}+pwF5GU< zv#72?*s)PXYhLWJAlcVx&Z~zNz#5O&;#$4i)a(6*=wRTwc7xc3{o|o}81&i!sy<+N zFmhxz3?D!GV3uZ}6Dq3OissB)wHayN`Dn<8&Re#mGXZCUwh*4hpbB#9^7+hn+Yu|2 z%gJLQKcGgLdectjhz68mOHcmOp0s)2)y*DurzS-55=Q{;SP3r6phMz)I=w9_X1v&_ zE>df}tx}`6hOBh0K|KZC*goFRNfEjzze1-LQjO3WSjV zN`$`QEWvcM$uhjnpQTCWyP^jVCy6}>M+@P|;_N1KR3bqsh94+azB-VyXNhHF$3$&e z`non~abL|Ce=T)!_js~nKo&!c;z=VYE##&Xfog}(56$LmKc7h42>p+DyHTFc?y3=X)}KyI@bT74(DmAT zdm}Ps=$1)k*V@vr-v%1_>e{i`iUd-{+-B0;V<@4}b^R$SB^%;5vg}gR%I$Mn4suL& zJcXiPg8(98I$Nw4fz|`0Se<2Zn`|${w zj%~<$^w+mHZbgPDh-bSA{u3%_b8inSeDo#)yn*o+N@L1Re0TE~ph5VH5;=F<`g9XY1vw zTB>+QZFFGXy4>RvldFg2g?q?_$=4Zz_It=y0+r~>BU#$T{B%~a9(QTuWFAY!n$OVCr#M%zRa-AZjC^;Rblq3^Rx)er?1MM-vH&0x;vi=^5 z)3UzMqFbZBiJn1u%roZ%e=XUGqEC-zKd~ZF3pw&$D!R@XOA$8d{RiV9&{nnJTE4hZ zUTlf##PauY8Wk9cmG=Lvm?+Q8>{$5|Z=h;IRGaS``0kRgPZ(U@?R8SzxQ8HiyZTpx z;$Yhtq{1;bb@Kya=7WD&$V;>+Cnc(ISi;&SnV_hb7@fUH1k-8WO6fTx2(rlPp zuG%zkpu<6o{#6sAsEClerlVmRz2ZUw!+4Tk%{X0myQE!A_>v-OCd{v9peCjsEg?(L>#aDAhZA4SOwM)nd8(s~S^e)jZ4lGbSqZf;;l zo(2fH@$qj_@(jEf{lw^VaY7uP1QQi-vU4xSqm?|KM!6s!?W2cjW@0Nq{fBx)jX{ zr6J%rv{l71+mbcJswkGI52^H!WCB~ZoF;+>7(zpv>ZmGRL&W0RTQ)dxHfGvrG$6{V zgEVQTTeJkHXkkGlc;ynV*&sFQ&l}^QgR!$#KgB6qp6RsfD9*&IoVBqqrU)^JL8*G7 zosCH-fnoEjy0T228UZ7iT3W1#`$^SWf43!yn143MM#L>2|1l}%PfdGsWkbAO8DiBo zgIl#ObOWQ4C;<05y{}?r9dSDP-h%I3{vntWokT5%eX4cJ^AeGJx3ZxO=WYJ%G{jsv z>RUl{U2Z6a7xG?N=nE+(e6O+GS1&NR?H?h8>r8$^z;z;6Q7a1LR3oPt1OjjnQRQt> zseC(^ltnJL$VQ!5+K3UEQg_}U68!lp6s$GFVCkyXbzd$tv`OOno3y@>etzs~kX#>F z2)AMB9nZ~=s9oHM`@Pl%4vt1)%7~%O;Hz32ovL|fa^vT;)YMHbvs>RP#el`AE-E7X z65xq*8Na#!<{ZM?2tH7su-6}~qPTG*30-(gyB1c!95h%ZK>w*M%r*H-v`KZ?Yv#9A z*=o;H?u3|^(?H0)23DJqJ!z(Ct!3F!+W8X&%`H#np%Lm1Wf1?Evr{R_Ogr`!);>ri z)_`%l@ja9Is%yg0zQ;t%+}iZJm2pbZJ@MP@Zi|9Sr}9cU+TWo-s1a%vIi=shrK12^$d`E|VlB^WY>$gc=M8{|4|38c1j>XF$!^)h) z9bZi}MbNnjX(yE8$E^YHHI=j@6^y|wdgVOn!;Qitj5XZ9*h9wUTXmFN_eQu)go9@7 zqqsCi6`16b3~0Z-cuVWjAv^7PoPlhDRl047`qgZ<6cg>Zxj!blGQ0Q!RtNW$4TE5z za`=38^!A(~I6p9Y+%6uzELK_1JGAB{%m12`0@FdQ5BNku6}^%sM-9-v4HD`%>8yHJ z4AdIIb3-Pnc-_d4jhj+wN!N&zcs|GQT$aJbDs1_Rf=i{JmYfq-E>p=gI;uQX`EW;s z2E2w>u_Qz;=#myQk>aiT1pNw5zLdNUfPBOM5&~@f6^?5Z1*mQS6i5t9g!Z~d24AF` zC!vQgvYL9KCI!V~0f?tOKVnwBJV_hNz=!m6H`A!H+1-=>+YiC*l&oFodwKSTP^n?O ze$+gnYn}1ZM&oo{AdaOz&Ac!+HSX5sTqqb_9iY&AI9Gwf<)5qPMa!E^RF1`3C|x6d zzYxPq$Pg{L)SXI_<4}xTH$YWWav@CGc2#_;G_8e( z5pQm_$rHEx(`Z!tGCl*jvtSvQM>a{Xlj)W835@GDc-pN8fP06 zx9VN%(?(ijJVy-3Q|UCDFeVm*lw8lpqQ?C5rEk6u7iZ0dAHP(@Um!_qkHH>hO*i6} zq#%&?6Szc0mzyo5F*O=5hc{4}KPS&SbJjp=AcOhsCjnOnlH~+pD!vi}2@8vx*#wKn z&tXHTM`|Z7R^ONgZS6|trS(EmB;kt5{LI<~eY!aicbe1NmC&Oqr^Rc6W<~0k_*%0l z>xG_6DU+|P)1uX{^UJPc?};;j41t@lf9t~geqk}MD%?vb^}t@lO;95SZBVgBRLlSe z1Hv>)zYXolGD}=UaT{PZdl%tX+omPFL#6O0Hjp;}ZBK;l7N?USX>LT?|A*06*1T6Y z0IIL19lY_i9ZeVijDBuLP!>2B9}VyMgbss zgHRgiEq8aATCW@^>Wvgg&$S(!)-BiUlqdsg8h+z71Q<#W8@DeRk8Y zmD30dkUbBN-@le9-Vv`J6}#!AXvimM18?>Dz<)=2epe!VwpPvmuS0pT^DU--sRY2#pJ-5YFFLGt>fTJ|5JT6KNd78=W3iPxx zi&rBWFs3LA(o#Ms2E?w)Enm)gX<8F*Y@dv}1;; zJP|=%{bT^ioB&%OTIxqR^d4pG3o1k8pm@juVnApTgkmfo_07R{AhK5|3bei7BC;CD zQxk}R2)xpeF1}u^^sjc|24~)NESQ~xWemQU zXk<3w)J_qK3*ATvP`?@%{LESNYk#ZwA6`0lxuRQ1Lz-k8u=<+MRBo-%uaFc1do+Bd z?8{5y`I|{qmj0r=tKJvqQ%v378Nk!H~EAoS^#Y;}pD%(7x%;dYyZ@w-8w( z5Zn3-d8S>cMNQ#T*CE9k_amCzDjI1;DXO|-G6CVOnX`tvnwbgC*Qe}qWPNq0ynxV& zBBg^wxGnm|EQQjkCiBE=buRmULQk&qpxpoHH|}9U>;X$!JDRjvXVNIRh%b_ZoC6|J zbO6Fem{BO2OC7%-beq3SpMQP-&M01cO_nLT9$RkR*_fepjLl zq;QzcdJh0s{S0-L9Z_#lSn7tL&xnyI)ZkmB0H{zipQcJJ_Mli2GCT#xcb? z=^9le1F{xIS#m2wxps$A5l)sGMD~HjqoGXH$xYH^8EB3{X9VJ*k2C=-SpHNgT1J`P z1XUBt1Zl)=RV419)0Hm~7KyjkgO?|>c`(`}DNV!%CJDXB5r&{jQARs0O^(vm;fB8q z3Wl3N{)7wtX%ZNh8^HK&aP*3xJmM;}@H9)xWxp$*AgV>N}D{5vpZc zKCMo5x5~BC385Q`sveybDrfkH%p@^x`WFlk^@}g0Mdwk!pD*-{D3H*^ahvsvkMO1J<-)_Dv)0d zue}zi1+)Z)bU|Vh#V^swEy?dZZw8N3nHJ8WI(s(2Q%4&nvI3LB!Wx$K?>3K}%zO|M zF?^(o)RtOD@Cdsr-*(~#@9=07y}4oE;K+$}C%SWYLukglGSGH2^bVWBA zmH3)3WjxnVN{5!V7TRq1u+KQbZ_M?z@||V*!DV#)X~m{Q$-kOkjJ6O+zA4V1`CS4< zHAE01BzZ+F+)kp!AWL6FUnFQ>RYI?J zblv4oztbw~LBV4Jj7M4<*LPqN>1}k6?T192balFa_CM+rDfjkOQiX#|HK&+K3mKW& zh~emlGhrv;ULRmMuGCGBOU(JvXnv1$3Xr`a-^|4HVv78g7K70kxdLdj?BpuO6L7%! z04Z;aREbZ-4M(7|491_ltbrnuZ5CoVRc!I;jlHg3&p2IllH$4Egrh|QxD=w;r-#69 zkEt@pNxo6FmY7eEk{vNLDOa@2q=H&1t;pp7W_SN?oa@JoUi4_x!$4rbgfcFJ>BG<{%|t(7ZqjKgE^5bVU( z*HG%;bQRgvSie=RdH$fof``Z2tL#nw|G60MabQ~`w9oa&^l*RCw;+qkYLTL~I(*cQ&}*z&v(}|nprxUR|86$=>|D z)_ORj!+K0Is}RMep%xMfI*=HCTs>pz9)a(HP z8VCZd&LMP~lNEY+hgBG4^8EEmEw<}CA7s5dt?Ksh5+`u_2}*f=)yDB`#HAyh=jOd3 z>!h=Eb*Z*7ctrBHqXpMycqV_x?=hxYf@9D`EXY*mgX7^%BF&{KAu~oUYE&yU$S5JN znYitg!=R|#lypE6DRAu5GjuXR9d(LnRer4x9wj$8)us=8awTOwcvLE3nKzKGZL~9w zkcO|FsFaOBRflB&s$k2T^0m_8%rnA-NjXgU-Xyr>MW)wrBolO@J379Q!m>^l+DkU5 zIGPBC1cqU?!4*jq9A1m6h@s_;I&MlDOE8wGc{IC2^(nw{E77H!i-gkPCwa6J6bhZm zx~z-!tEKD2dA0I<3F5OciaQs~Mw>>gY#}R6_0PeBlcdYh5uZ&gDWE#|jiTA*DD2T5 zTxHhI#m8_*Llk{lDe#n8zRb|{KVkzMrFTNfP{6GPC#dkve3cMH;B2ki;=WWzJz`c0 zuLkVpKhT_lNhn*?y6De2nu)w+ORTFP!?%LKk#<_Q_t-Tw4w*s<>B&-$R5nLCd#YhN zGnUG4ZeD`>c4Oo?QE2Gx)6m_M<<#xAR!1GQ=K}70q_VfCqrkFTn=XK8QsTH@+7BC6 zAEzFi5i4~N6+_LDyYod=FSIwZc!>i43gnth#g0c zGIA)=wngYfLQuM_Y(9#IV>oKP|UN7B>Qn|J`cDc zVd&l<8UK*dOmM`tFq`HNuZKIO9hjaXtBG?}jYZT3jfCO);K!6w>sK%oP$CI|g%@UI z+`@^K;+n?cnKX9k_kQcGP~5M6&+P#f9(v_V#eO!LZeA7q@$Kc?H%hlsbTZ>#EWD*x zO&b#*(#9diarX9nh^_VuNkbje9|0+b=o8eNUtTd309T+&JL+DN;IXX>!SGeax?m#5 zADD3d5sS1t4)>I_Y3AT7Vtsayk>DIpEC*~=B=!0+uilm&KO=iCNE1aWQ#oW2kxxJQ zk&vQ4(6YSAgocmOsKx-B*c_5pC-X25ortnDkaz+UbGbaD?3b~&eo*W1j;l1S97>?U< z|HbBi8Yz*o$c_EegX)T*oT?Z+_tPhjk0h*Vf73kwaIwsHZW*KXBeK)VVdIgqsdtS; zH@Nsuf9?}Ix;zdfI&n34| zR;26O$mI=h(0$m^B!V5>uQNQRdcxN+moU6zA65vhEjfBI549`eN(;Wd?q6(%Xdd4Crsrd_1}p< zI8fI8Q6krv1NQRfR)CZhcbGFsI5ErCh{Vxc#x@qI^T<^@9TexyeAPGDmgK6a`x_AA z7plRI2Vcfe<$%xbVj0H;RtL6`S=aIgjJ&57TE=K4$%x3Xh$q)~Ucs^N=i?!VHkX zLKFQmg%TJybNrAi%H#7Zfkh>SWp&1R6N$%{COY;ID4v4iT_}T(=3Hoa=cb*|xW&eN z7HIt$RC$Z$bqoiIVYRQxR{~+&t<3#W?#gsr?T_K9n{8iDvO|}V?4Ptc1CQk_ExNOv z^$U0by=OJQr2|TN`_6be#+q6OSz6x()E;4rCH$oi1q$-d?GHx?eC@00!QIPHWV|kK zKSqwy?!%XmPb78p!Wk_V9tR5I)A;``Q8cqtUJxVsgPNF`WOAJnw7Qk|@QSdzp6??0 zRW2p31v+SRw&h-K+22@Hqx32FJq(}8@?y+`EE$WAwiH27#ai2Q^9jW~kWTa%=8Z72 ztB5s2!AK250Z4VW4-#?Oq;j?G8G#`~8|RMN#4FmoZOGEC2E&0&z*|bOj!9^0T;j88r@R<4P5BF#%ULpgri9Anh~rJC zMlSJ}6fRhrYCR_IvMv9$x7|{lU-nR$CM4px2s^seZefc`MZMPAT`;k+nm25A0SfE* z!*WBAXg_zo9}Oi%>+s$uzP`Joy9ALC?%p*~+f*@%H)o^FuN%rA1{Mue5 z!s62uZB^@PaO`y?lwia-M04}^(i!^B0FL2fYv|ovx3*3EoMu0o%0>hRI}t25#_G-= z=tGD8_R;2O?Typ9&p0H%s@0bs;VjoOqse(13ZzC5R>HJeUrTYL6hzN)9nvQ$0umRV#kXR?IMCiHgN#_NF2!ia_eu5$1s*>u)#aF! zii_xcGnoK#KficO)wRz3p5!JR+5PT?b{nZ*#QR8hGQ|$?=VsRfFlZ(l)Ghv@;_c83$0bx8l}0Nb^+B4NqeNSsRhiR` zYOu;bWV0~o4dPs^;ULewOnBDPsGG7v(UGNwHWG$w6jf`I4q}T(xiyLA4kP{*14wWV zq6`>z8bnedb=#AXQq2((6anIf$ToYUxkmnAO(Skwx}3tQoWjGO(uWbiX+R-+EKr<$ z!{(vKJm<4U{$Y`e?2aGV`PJF2HM4UA)dSVw4v*eMD6-&Boz+&;oStf`DhkFA7TE5F zcr-~G@1#CtBGQIY4JYm5kxt?;?j|-ecZg9{F$V8p=sLpVnrRrB?wK?<~5cb6&;ir7z zCUvH4lEx|6eooF6{A_qNOs(pulrwr^#TmcChC#fxr_t141M2#^q>;MggGpUXb1xe+ zYZjZSF0uXMEJ}&1&bB8OLU8nNqu=-sjl+e3Dln{Lr}dRJ(i?5tHGMiXGIA^UKX}zzWslrhPnMrTX`TkhAugU~r7rK61_X;M zroOJJCiN=j#4Ubv*~aZRooi&N093z~-briV_r-kzoTSz)KM$+1<7FA@tP{(% z{u?kZWh0eZN42%WLJJmblew;^v%cXxhbjy`$C#lqF$xmXINYg(%k57*eaXnhH&p6B zc&SdAcJ-r=?ioJqman!!#I+C%eAUSAhf0k;_EX>k!LXmO_BG}iqAn5sy!|;xO=sjz zyYJo@9!cU{ZfKK7&Dtfup}L#R29lP}T%jwU(9C-DeMA z)@dG(HeD8IGTP_eG9X@R6Nqexe3A#ZaEPTc>UJP?XM-xcRg70yojkt$+dQU%bgK7> zwLw7|$Eb|NmTl|dAZSTWT=DWw;F@2{0;H4eOKz8L7JgCDCPN%d$y|z+GC(NR5b7Cw zYfRMy!SlS;AIV>q!wbljJ+HV{p2Kl>dx)k;Os3JO6up0D|9|J3J-swtxzZf(e_J&& zlvt4MX_cFe+3GaO8(G48w`9O)YxLj1@_k3C{ztn_bZs(sGE0Xd#q3cPoP^vIGfvvd zF_K~5;tc~L&}ULRT%FpqPX*A79e{3eX;0EAuilSp+mV!PCtH^W!=#5el?wR(8LPQ3 znWC~aS@^D|nC6^+rrKzh1coZ|A8YOBnh@5tJqxT=Aij=NO!jGUUREPIX)^q-W(WiL zbju57w!IbzN;k{vyJW?_JXZ;ft0;U0BWAeSCql}FJCY=o#nzq&utoOZX;JPmG{HYo zowpM1-4;c8Iodr$intbPG&21DWRry6{kVFdmAd3~GD)nH;dBNv0*xvqc7d}nm$|zB zw8~flP!?(9n!cYrA>$>&`dGxWHd}-v-DY(OMnr9WPOiecq7~u=ReJSoD}iX=$k!IR zTOMjxPev%9?9-ATh{e*E*G)8~v zCsjfy!Mp0#Ew=k4A9GBoX1ZB=k`r+QW3CrbjE$U$^neNh$N5ICg-8v-3!^)GZFy7Emmci#YZUKk!-$4{bjD2u?4xv-N51 z?y!e?^}}~}m*xHM+i?t3QP?*djU^+~+?)PsglRSj%Uf9NjkhM89ogBw+_Pu4s_d?0 zM(T5$INzAwr1RTSDc1e73HF8Ae6rcFc{tr^)hyjROtR~pvD@Bo}{$i|+_$q}{0C|o{l{ahp>SDv!ZL-W^sJ?^@d0;?O=s<90O!W917_>U)hD2vV|9Wsfmj z|5=H5;c_t=GDi8PGQzx2_L|M$xoK4hOl|=$WqY{Qt2Q-$mxJi~9`M&kNEo;_z_ciH z=5{DExzWqg>g!wl&3`m+9#=|FF1P5N50@r9HAvs=oPhRL`;V9uW7|ge<_$RfdgWM# zm*PK_4q{^^SSoyR_jHriH}ktsD(Yy1E_=Vz(nf2!_4Yo*iYOw?u@er50!!$LAw4mU zmZnrgj-QItnQW#&gf{^~)3=)Fi;pky6D=jL+Ae)Z74{9)oGrwK70t!)fj%l6cdDu|Mv(ib)K`*cG@*Id9Z8QbLCbtyTv(=oWrD|P^VO#G-P>HCVM)Rp_ z)Izn}jiPLuCN*oCp~8Qt2$0I@3^6qQXoGb1%2$R8Bbp|Ff$>QxwWUe5C(-QgU5 zCZnd}{Y5P3ga`cda9==d!c1c@j4^xnOLLUTmvYM?H}g%a@5%a)Wb0k?DlJX_`{og5 zIBs9^i14eJZBV#w5PI0&Pd#v+f1RZjBF?z062uvwYhu2ixD*`MR4 zoumeBB-1gznKG1K#sg`|8fI7RO`pXcrJY6MjM3fhvcC1QOZT9;fQxrw?^a^AX74%T zH|!cl7~wy?w~BeWh9(m#Q8-3uETd9O9!DaE<9kNA6K&>a^bg;4%m^_7LuaQ@-3@

B5Ojw0^gKIm%1f|lVELpKzL?y;mE0q-NrH{$rWPxw-&!?sn! z$slVn;c$Ye>!kxi`jWkLiEgOJgr+U4b|>F`OChDV%d|4csu@6f9Y-z9CuY)if9pBTLW757pw@&BVXyZr!^JfoP^s4 z*YNvCWAZlnMU}1m(S5){jTz9HxCzeU{xB&rTbB0-r}JTEbB7iZL~`7w?jrAQj_fwo zTjQ^+HP-{_dD+yMX^)OsSmQ17E3gv0xj4dAUHqUQb@grI&CSi(Xm*`RBp`zB^Xj9W zXmJoINyB8V#zEc*#?gRTPtwl`zAGETOYjF@o4K8K|JzjexmYJnO%v0QUd-_Vl;%#= zXR2RupS)onuK0|DN?g0r*&nimMNsmuU(M1<(!f!olq&s!y}i<&TfnhY6IYet`uwuY zI7XOF|DgM+Iys6u+3=*L9TZPpa*`oO8+Ong&9P2`hG4f34c@Y27MB42X`JN-zDpdX zx!O)aerGkooqM+Ag2?X<{k!;JGH_fzl7!Wa44ydZ+>)=v>~(@#&d^VmPG+1B0Ar(& znq%E=?OhvihFIEbmRhjCQ)=?EDUF!SQpau;HA)R<3#wef9o)hHxWwZF9{`*I+`<2@ zK=7T1WJu2p>qxDzYf9x%BRk;^fY4 z)@66SY_9xYa(DXx^Na2!3sU<4V4(>WA!%n|{E+>XaCbK&iN*;h(DnLDgahvO37h3s&vL}>aCtM;TWp!SoNWHMDb= zl_GnaRGj&^4byOoO_Eh6{)IY|KPDPEf&mdMB{vwGb8aDcl-Aj*ce1szt;LWK0lnmp znUiEIErPHrx!D|WT0qxc77?}z8>+bIa;qjR`wJr{V_dP(4XnI#dbF}^*so8D#1&js zq?va+IK3j^Hc=z*scO#6jFPKCk|Ka)su7)KI~9w`Ku!p0merzokdT!2&uUnGh>{Pe z=Ba19bEnFS@4X4mqRIf$mcN&5GtxfS6$oT~%7aFYuT1xe%}ed$)GWc@6+ebSk34QU zsuYC;hZhP1!;P(=@xc?V?bn2!2Q<;IEZv>yqtu%hSE4+H2;*1_r3w_NRw|Ovc-z2wRr_=>kMm$qlyjRyse#pXCpJr&S9N+Y$Ytu92q@EemRhS7L;n))FgiqD^av% zdusKV6%V=NAVo@mxk2))EYn;TN}p!t2=Sul%s;2FGCTtJin|~bDkG!#NrP%;P%qof z#pdU9fw=9%_TXPFEn0JEcIngDW&aj!!LBS-X`O$Xm%Xw5Z%;m^Gh2N$6)Qz`R?pO) z((WT!>QE%QBR_-9J>AIq^I>kj8RgNIqNwY>x+C3@aX4<2$IO3Qv?-Y$;k zsZm__{Y}ykfpv*uc+oMsQ)pNWWA}agGvCleh7M6wp5q33g$q)0ZpPk3-+-4i)`V$w zUy{Xj2r*OaC*()I_VtfGbM_mRQ7>Q?Rn`jtJvlNix1E32s_(;wIosno6Et&POg z6?+9*62lVH2lRMjgha>5oerl`Tgo;NPPPRAd@A7+=~uQSfY3HI)-!p%v`ZlRv_0co z>3ZoWoUMi0#U%mMbW4@Q;%`i=&bWIbpf)0I`L?V#ZsWeh}_LZnHz;{Wn8&&6LPDWOM6BNm`7iR9RL*Ace5@vio_2g zwA^0x5jVjoctuBce$jf*{gQ1q|2+2PSu8c(Lay7Ef`0MvGUPJ{d;n2EuD=#559dPr z;pr|ZJh}WRL?Ma0I?DJ~=KN>Twq*jDq`@~c0#lZ7GW3sq=GHF2rkO}a(aFkq*{wQz zx=Fz(aOxZyq(Q>gwGK)PxRk3n3(o^>iqi95FEnG%eY_g{bSuKC0E}_o*0Obi74z2& z=rbAy7aq{u>dv#n_|C#&F@-r?T(8aPB+uW$QPdwt;(mJc-r2t+H(jG z$Z6al-Q}RJf=hpCV{|{+*r-4wg!a7TVP4fW7M5DbumkcX3X>g=3vS|_{1fXaEYJeI zvfx8OW~$fYN43AlY^n0Fptr+Ijd=z*$wN)(wxZJNGet{Od0wb=`juwbDxzYj^bfBWCdy@Pa%eCaLwTIt= zSeKTG>PBTLDCuWYDotcU8M0k*7-Q7VOm92j?k$CcAI)j-Q8H}_VWHqWC#L;EGf|#*7Ri+kD7AkiU~nx?u)z* zDIotg2OAnp38%UpwuT{pQdx(AVkRdUzAVOAoZdIo!ESvSj-Uonl`^!3A@0Z2Z_<;z z@gA=HKekgZ8?`*_G%p804~;1q-sUv-wFbV5MB>@yj`O03Rf~+IFk0jga?b44sNI+6 zZ{|29ZK@wjaP$bPo-H*G{c1#)4~*;tx_{GPHhsfYdw49en-^WNPhraeNFEj86gPg& zA=f#_b}m%X#Xd0;iam6 z8l;8JYZ5QbYnnKBGvx}){EW1$UYSKRfaX@>;2TCej#>xZk%4qL{VwlXEE7tBQ81`J ztRNEvUD*}vcO*>166%ro8N>hhk^o2HgDVs3#^#AX6kO$8rVWdf;FslGMhQ!i^e_4( zE4>WOonZS;L`a8>;hGN#tB!P1w#n;~Y?zr?1S8S2EJgMt2ySh096lt=Fl?zAR3zGD z(UsUCC#Lh`T$Rpi!wm=;6m!D8_(NP zNU2Vw**efBg2l_unNvbfH4R?zww%^EH+*BITJUk{0hW^{w91>z@<412cqxwcw1#v_ zE;zvKSF-dH4((~eF2FOfk~?dvI$gd1Tu}iy`&ze8eo)kMBHej2cJiCc`zftmfC>Bg zTuRR8{}U-sPWnJD^nx(U8lP3L*JCh%H^rM*(F1-$eCgHfC?6`vd|<=c%1E*ta_~hy zCYBgcNEQb>5G}A$Lm`^WbG3@qnMA-<@8%hL+Sn242-@W_ogY+b;E+BMIZ@yN=O^4X zz`;_zYMEiwb`?w=ikDwh2En;AJhC`vB}876XPcWT)h0=CW=QyxwSFmbzovgLk*?_I zl2XWyL*N`J&_+*t#B3+am$>{`4TZpTI%Tt+)=1lWWtfj0;cjc-nhKpV6_Qq_I+5v? zBrd~lv%#6Jtvmaep?+Juu9toY+cI60fBu8M)5EO}6y8aJhOIK&$Cjz8=3OS|_Tu`# zDJ0CP1txJ?-VnX}RaGJa$H}TTaJi>sx%40Aw|yL-(5q!S2fcYH=1?}3RA#{2HG8m9 z2nzj=QoLFY1zhQs0G)%u72pB>fn(u&7&m;kywuo|{=yp1Zy7n#X^fT7l6yTJ*UC7D zTwklb9&&9N@4>4rV((zvC|DrK1el3;Pk;LVQY6kF{%mGIUd$pGe!VGjgoH*|_vJO4ZKsaIYtslB1VEk)wV$%ujHJ3Kx7gf6vWiq+XVq* zl@+{{nPG{v)lccVQb%$;aU6&ckkSIyVVuIvhd)@Z1#etL-wSHvAwXKuWl3+Hea*1k zh4~8<3TA~X4rAtTbh(Gg06KICQ9@i%g{(Sn`!yB4q!bajK6Ni%ZOS_96#fmCYFjht z@7b?jaME^*!4Vs3vq_K+AM{dOKTARE^n@ z_P^i}5B56H!(9diV%T}Bs44nnABDbU5|d;!j#r!dSO>y%n*u*r`h>ls!ReN%t08+> z$nwgWPBdBkSHh(c7G=o1#CeXu(m70YyNC?hn)}F-W^UTFWms*W?0SZlV%)8Q zQJp9o{zPebA+rJgQ1{|e)c3T2h`Oltm-iB(1J(2!L(fY04uYKVd=rYP6;pz`kx?nW%2unac%^B=GQ; zzl+w0MU=V029ABMWE;P<+HCyVJM@iia+fr0r8YFTcA3OCdWZ?QCr8qDARkiWD)6H>7f(}+QYPU>o8I#%dZkr6PgUWSJa2wn1g97>rR;q>%toU1 z5{R70StDuvN zn+MJL6*EBhnts3WP@vt#iusG%LmtqP*?OVl6Fz6Wt~#0U7iZto)QzfipMI+GYQC0W zu%DFg1>|yEG@ftbP0znSCogoX13S9(!8M0!94Z+6!fDW7pwf8M@MYKtx7hO3Kb$<^ zp2{}Q24ekskxd)z_4ahgku^P(L0l`E@-xGf7)giHO0>Ztlu zt~b;m4SH^i%1L|x8*d$ROL*n}n^|uAA3~Pk0UPaN&00fUE}o5Ufqt&@-;bp+{Kzes zkkC^xx$Zk@w*vHJ2FJ|2D)60jwSENUt&5U6{o&mxV@at}B>PiGmht&?he();paG_0 zs&Q9F+Zn)C8Ex@=0JJP=fx3NhRog-&CD_<@R;l5-`R8yPdHoP0QBo9AUo!$?s zN42r>VqaP6m#-1!$f;WAl19OeOOhck9$hk`G{4+}i2Tl@xitN+Og(9IO4>h7l}fHeJ+0Ey;sxQxk!#(L=%CQ=9S2B5^CN$B?3@ zL_kN)v77axw$uT;nLb7b?|1mVx5)6?$AJq0t0><}dPu;Fi4j2km=29<}_Zg6lT$B@__=XhB)#lX#3^ zF8Qy9kk4_+6=2p&ZK@ZKOoip0kcS<#G+ZZiDSx%J?g_=Z3&N@zjJKr1{5b{&WEDu8d;+FX%EZf zo(!4x7*B`HTST!c5-%jzAy`=2nC8857tU&9*8bH=b=yy8_@6f2pMF-9aN^JZooe5` zpeqCQxZEyYhdmP%!r0LH{Q!@f7Q)Tc;L3;W?m326VS81l_r9-88uw>spKEK{s1y~G zmpjZLol$OPWYI8FZn>SE-$>XEV!Fxz9on=sc`Jo)x1K&t`t)|8UC4S;TooJ^BD!}> zdUtM@>tI9=SFt3E2KJMq)>cbYI4Li8#c;SdqlaTl1!oA>R#5LP3lu(sQKlxo{9#5H z0AEWk;gQMSa|VT{+0!C-V_Bq-z(2kfW7_} z5tl4T{;ca<_6eKpb5W|GJ4PP6*>g(ji=T}Y;F#N&=Ro82t3S*qMvO(MO@%u{z5^-g z`#vJX)*pbEXrnkDub=NVHY!geadiwBewHl}d=T=rRz6f7_DfJ-L6iEE$nc^oWOGC} zI)np+vU#y9O%6HRQk!s?q^V6)OS?Fuh~d6+Yj+3};1d`kPY@g|3_xUVpR|Soz2-IP z{Wln&eRGuTonyh^#J^B^J^J23JagF2FS9Qn+{1V6FKG)dYdBBa;Tm44Ba&zB26eDNdX;U3n zqOAAT@Xp4Wgy{@V$!jvCPpxz9O}jm8tZi;`^Qxx`15>HF9QivcF-Aay#pDFMoc(H9 zc(-u4eyj>@vU*l7cm_U1e0Ica;I0jfI?2&0D6jV?lIXoBzagduOsrImZ8lD)eIaGEoiRIqlLA&r@aWg$k>!YQHo}RqR{R9=0FMI$;>Tr8ujNMT^T|> zAU?;lTm{r?!)k9^k)G=iv40ema1#;F_RKP(&TnQPslTL=M?qCF_lz09g}yHxNXR_~ zEtYK~6!~r+y~#C({X@o){G_XcEoe@3pa_t1H_|<(+861MMGc&Xfmst5r%2|@@mIbz)KN9PUxiu_qN{K=wN zCkWLLtlcmz_8xCQWnln$3vK0ms^iP4BYT*_XgInpL3~f6lW+fufW#9+&d^B&4VGiL) z&(}&)cwWm4GX5}+Gyb-L+*)|M!G*K*@sKVD?`JuRrY!Z1e0M|300}ea9eB&nqjE!M6M`=Rl@-dkTfFb8O zjZg}ovr_dkvotq-f6B`e-aV;N)EAt^=PLSgL9=8+&? z^6u|tC>>DPT=F-Km5=vxj+imb^Ms~VJ?;-#&{6$C^Mfyip2eJEGT91f#P|a9PHElp zG>uQ|7ILbPu1o_u)=-N=3XacJ6eKQL?{q&Ok5sY)T@_BHl^WqR^(s$dA{qlc=OaCX zMs0`_hF;XX$`rc>5xH))2Pef2qz+u)Z^tpKGCEuLlJ;}azJPb{fm_PtL_k^V>*kwt ztWun&|Dh^3A_zg5M$4Ehc2_xVNuIggoUTT2hx&dbbKaGTQjMnvkmbD&_V-@$yfqMY zSNY4(?ZVQE(vJ$KLnPBTnX1f83hDtoAwg}l8ewVKLezUQw?3BITI+d#K^>&CDD>uTq76LrlMHdy*kxr5&1RcxzjE`YB!r(@ftth@4Cl2Tc8 z-|352kKK@_&|vC@0ds!?GK$^Uq_{VMu5~C^y7crkh;I-= zEbPvJbNzqVhpZqD2V>`V?Zo265n)^Z*px6h_L~lFR~h#}hQ}*d_awyNkqY-uVn@1< zx-LXpQj9^P@RhdI+y80T7BKQb-B(l#v~Qv%*-+|*`$>6140{+7x*CFnKJzOIyVF+c z;DsVIb8C8F{p^z{o(qn5vLy7_kAt-ZZ;dLavL>H$=Jcu{D z{&%f=ZBNG+@919S<&XWVc-0ie#999A+Rw+MW4&FTSQgT9hh|7X^maTR#SLxl@<36W z;rqMuzSwUfad$Haqqawm{za+M0z*qdL|Kx!2l>PD@-^Y57PmVBoAV8G5(|| zRnRb(6csfMGd|VN4 zfA|JILV99_?>0|Fd)wRTw~uOE*qdxF>R8g->)h929f0W`TY6)_0(iWyUPV6iPkZOv z0DtY4ee0T{3>4Qbk?41Jho2at=l}`gRByI~q@Z?PybkRS2~EQvt}22)Dg&R0HjsJe_#npxiEQD)*I-J>)ZYJFX?J^_SR??lV!9 zcs+|U3hxoF%)6Al(J^<}R=?Tt@~#DzhT?cK<1|t)L{5`ItX@prGiDZl{O>YnOE^iC zUaIT9gti;xvL*Q*F(_n)q!4giW_7hxtu3x?E0cR8ZK||wwJ#S}5c)j$;V-)GUpX^u zSE|9?y@XHYDv>&;YKIZZE&ECf7~07?94=K-tK}yS!ZDolGuFdUORibRjMEJ4CW-Ro zg7-EKgWHhUvl@C0uyR-hBgkN~g5H=+5jm7^GDXX=NFAh`IQ7cNg6#llODwaE>q{|d zdgD;u4_=)-?$~+gH2@aqfL&T%d#LxbiTB-O6l8f=cXTf!KTZ*G57$hF1hvgY3Tq3} zm+yx2!m9r-cU|!9XD(bka1NMW{K)xp`!C+yFeHoXGOL}z_)a&*>|e#JA>H%$A0>E$ zzMn9^T<6Zt!X}aNplLsDih^#`9`@<yh)FHShm?2 zOZ`K0u*zKQ0UcVD@0Y1&k#|D4zGL!v;)Su3EG|5L(5_LMK>b0AH@^EW%fk0zE#KwI z0Cu`9aKQ+@hNVOLc-g=Z8=6=m1lt^8D_Pe>UYK1Xl~d*Nr-b!As@$2^8hN34ogywb zvm2k5;_WGYJ>1asX7IUM{k&2zd@$u!f4g{VnE|{t^;uPgoQ}@@`trboiHh1H0?~Kj zxLlPi@JL*G+;aVb+tiWCKzJ)Vk2En;kMS$-1+7Pb=m3Ys&f`!E2NmY6>&`W?Z-+Vq ztN9qfvsy0!!8WcsVCC_xAc^ePB#qAOXor~524th0F# zZAU=hDhRi&N53eo^q6KERtm~5Nfo{pas>Ley}Lh^c!yL*xTT9?NTDe13{NM16cC~;> zP(#r{b8R)DQgQg;56qsA!Zi$kBUQ{)ucreIa!JhhlD5r0B|KN2%BLcDe`+n;fJ8}B zJz>v}t>0enPndJ@f7DySVAc^e;~hfS5TJ+ol-Zve$+JJ|sn~Ob?W^s@CbLfY_twW$ z{2=_ad1E@=6lP&8PBxx~A`CD8J03)zie zMVUM!o=64o)mUDJ2+4{Sz+)_)Cja}o8>k(SPHNeY1VNXzpXA@TiENhMVlS{ zx4!j^B^JQ-@O*z=$PB+WjSb}>+qO=nk1Df64LHvkdjPm^`vdxps6UlX#u)WEkD~nz zmTP>zj~bvTho4iMtD|AAv{am*uBs+wQGAVSYDp0nv(w4G&ss7r=0v^OSMfJ_!d7ZN zq$q@p&Az-LA6VudT4x}a4GWHheweqNzC?av@>TAXXO!>)Cem6)mC3hb{RDb_Jg2(q z?Z)g&f(G4XjtWXgTw6ptGk;T|R(6gepArSfV13kulCaIuHe7B^KP{-&(bN>@8^sv3tq z6-$Z>G>!aSY_$uuY>B@qn+B>jOnku%m3S{vbt?3g=?69hf=cqWU++hoYEuh-jt3Rd zly_BB)kKfRnpL#?7$iNOjXP#u4;x(%ZOt(mtoyI)y=R)&V!Z(Rlcw8hS%gm;GyZMx zH0xRaRd9yd+2q9@(4nHC)12SYwPpB`YEo7zg|I-zP+$Ft!qTTJ`E|TOj%ztXtx%$M z8#_^(^4%@lIWQxDnmSkv^NE0*_q?4?yc;yzcP*%XsTqvf_zvKwoG1bjhXI7Wn5%G^ z49T0{;ERXR^GE-1--`E%w$-ArGeuVvtQqSl^9JRV7C5e@GCC6tOXP=7`!k=^<4Ap& z+PD)Mbuz-x2Wc`XKw7H+LP?PB2+9EeOjUCSy#@(=nbGN|@*GKh4zx%NM1XFpN8usY zOoYkt;WTY+CC!6j^$s+25JB1+$M_dyxnWzS11CixTfGKNq{Bzf>{M1nFQ zbu&2l*JQ~Q;Mb!25!_q}T*^jC1|;)q;5#4gVKpDI{>4g~c%i-Gs3#Y$CSS8iK6g=O zV9(HhJNc(#pU6-DR^4Dnaa?pE3y406&B$EA67epg`LXJ!R(u~eP|t~y6K1wBsYtk- zvC#sxu1)PCCy7XP=};jhY(p&jUJoW27^p>~oXU+5dOeB_M`E6SOYiAt={fnp_(&Y! z!oxvj2nD^+j|^ObeyP%`v2Sx`T}xNmY7HhouRG2J-+$P)rzKJC>7y=WIR^Yh`$U+~ zcYJN&Fcv$%&R0;nK_QbLLs;)vkP3)o6)U!ET@);^;i5iTNuW|7o%||mDrvScNe+sd zFU41;_&q@>91tKvzv$02N*hyO9 z55mFghD*CAJBx4^YJ%CK#rRgu5t5f~M2Ts~yiW%{>2K|bG1;<4(LQFx8`t_heq6AO zbzHy*Z4xs(>&=8Zl{+ij>%jN>&8DaYsfH$t$~mK!vWisFCXElh(T7M^uV#uq-(_>u zp#ZXZ7y1K+NfbdgW!kER5RjKoE0LNqq>E`M}$thcCT9q>y1La4Sc6DB25ldZ#__3 z39R(LbJRHyf`Nu4n2GFIRv;tY1e)`{Tlf{cpScp}X@@5>#<;0Dz)03r*B?l%` zjfvFUBu8G=5Z;K5wu2Ve2(30hnkaORQ%7cwduUgrrwWPL}VRLLaB zHU^tKiJDN_8QwPijS$19s0GohnS(CZyS#NI6n1Lc|fm@n*GRY$Tu z5(FX-vQ`xdpj8cj5$81=z0Gpyw%E)7QENxBjq28s@u&NsjCPiwUxjO#(v19m!f!hj z78prh{}p`ZRTT8fsE=QaLN!f4sq(zpXM+_6ko&?uuNns$dyoXJ;XZS&1nf^cL3nxNys_cma$148r(5PCFI zk5{yKmz8zgvG6P!{F~y-Y;qPA2!(ST2&eV)8>CUFW7RWwQSvRvora zxI{BSGRdZ6TNR;(tPDiOfo^TnmKUxXBYSb{w2|M*8LCkZXz<2ta0?_=o__HQI2o&h zo%ubzF|j0(expBx<|+JARYLVLFSGnU-B#

(%Ik`FTb6YfnxCW7NemLuxZi&wLqj z?uLbRZ8X_!rV0DHWIS65m4LPNYNJI+uRWgt9D761Eo+TyM`39Z-8gaD&?}raajN9z&JC{>*dAl}# zdIn_)Kg)0{_Zm*#=5dgQpm}Gb=hWlGQ@q4rL{y@hf6CnNy1K#oG~do6$X_-LSSMxK zA&9Ke<1KKMTGSooJ(V612><%!id{`^mJwdms*V*I-G+fJ_^y|1-86Z%_$q8mjmmY8 zl^r2leogV;t1I;|Bc4VZ#Qt)+af<=Pw?)zIpY7^?vA^y*wMaIoMg?$} z*q!5?QflcfR8u^O|GQrxIP@w2)KE{+kJ#w z?!>quB;7=A4{aD;@{Jm}K5=Q9D~gqXD$6eUzu?1)6jxZxnrkgi^6dA;Ca7P^{r#KS zAj&ZF$&m|(d|qda{Zv2bwF?Xsb_AO&yvg|y^*#Ql8xt7*a#(y(J%uzxg6Gwh_ zE;n9{*)>`pIk1V?Inb0|0IMCP%1J6d)OaXzZ$L!H8VBDVR#(u~Iv=uJKoZJ$;1R3k zY2r*-{uGe$&&4mo`wteq2zAaZ_;l$|ovNzjDD$xBFL65@$Bg$?C1et0D|XPUz`0_7 zPWPEIw;zH{{X13jMXt)qmId-qkv+O+jfpkx^*XZ!O<@!?|g?(CT@6>aV znuax8?yU6R!fSO8MSHTO0>)fRo#0&bPn7t9^hfqYB{S=zpg)K*`D@c7jsb)RnK|JH z=U~zM1A%H_DEYSgeaY!<6ZwA+qV@NDO j{=P@by}0Xbit!fPROQ4jkztl(!QG~M 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 E04F*Nf&c&j literal 0 HcmV?d00001 diff --git a/NGINX_Server/html/static/KBplus-Logo.png b/NGINX_Server/html/static/KBplus-Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2221b708696c7657463a8fc39b68f8567e0c3d81 GIT binary patch literal 79383 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 literal 0 HcmV?d00001 diff --git a/NGINX_Server/html/static/app-theme.css b/NGINX_Server/html/static/app-theme.css new file mode 100644 index 0000000..ff934d6 --- /dev/null +++ b/NGINX_Server/html/static/app-theme.css @@ -0,0 +1,22 @@ +.w3-theme-l5 {color:#000 !important; background-color:#f9f9f9 !important} +.w3-theme-l4 {color:#000 !important; background-color:#ececec !important} +.w3-theme-l3 {color:#000 !important; background-color:#d8d8d8 !important} +.w3-theme-l2 {color:#000 !important; background-color:#c5c5c5 !important} +.w3-theme-l1 {color:#000 !important; background-color:#b1b1b1 !important} +.w3-theme-d1 {color:#fff !important; background-color:#8e8e8e !important} +.w3-theme-d2 {color:#fff !important; background-color:#7e7e7e !important} +.w3-theme-d3 {color:#fff !important; background-color:#6f6f6f !important} +.w3-theme-d4 {color:#fff !important; background-color:#5f5f5f !important} +.w3-theme-d5 {color:#fff !important; background-color:#4f4f4f !important} + +.w3-theme-light {color:#000 !important; background-color:#f9f9f9 !important} +.w3-theme-dark {color:#fff !important; background-color:#4f4f4f !important} +.w3-theme-action {color:#fff !important; background-color:#4f4f4f !important} + +.w3-theme {color:#fff !important; background-color:#9e9e9e !important} +.w3-text-theme {color:#9e9e9e !important} +.w3-border-theme {border-color:#9e9e9e !important} + +.w3-hover-theme:hover {color:#fff !important; background-color:#9e9e9e !important} +.w3-hover-text-theme:hover {color:#9e9e9e !important} +.w3-hover-border-theme:hover {border-color:#9e9e9e !important} \ No newline at end of file diff --git a/NGINX_Server/html/static/symbols.css b/NGINX_Server/html/static/symbols.css new file mode 100644 index 0000000..79cd371 --- /dev/null +++ b/NGINX_Server/html/static/symbols.css @@ -0,0 +1,23 @@ +/* fallback */ +@font-face { + font-family: 'Material Symbols Outlined'; + font-style: normal; + font-weight: 400; + src: url(Google_Symbols.woff2) format('woff2'); + } + + .material-icons { + font-family: 'Material Symbols Outlined'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; + } \ No newline at end of file diff --git a/NGINX_Server/html/static/w3.css b/NGINX_Server/html/static/w3.css new file mode 100644 index 0000000..fd89e8d --- /dev/null +++ b/NGINX_Server/html/static/w3.css @@ -0,0 +1,235 @@ +/* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent}a:active,a:hover{outline-width:0} +abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px} +.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} +.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block} +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} +.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:1205px){.w3-auto{max-width:95%}} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important} +.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} +/* Colors */ +.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} +.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} +.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} +.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} +.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} +.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} +.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} +.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} +.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} +.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} +.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} +.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} +.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} +.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} +.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} +.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} +.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} +.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} +.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} +.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} +.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} +.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} +.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} +.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} +.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} +.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} +.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} +.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} +.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} +.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} +.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} +.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} +.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} +.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} +.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} +.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} +.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} +.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} +.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} +.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} +.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} +.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} +.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} +.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} +.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} +.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} +.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} +.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} +.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} +.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} +.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} +.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} +.w3-text-black,.w3-hover-text-black:hover{color:#000!important} +.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} +.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} +.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} +.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} +.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} +.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} +.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} +.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} +.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} +.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} +.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} +.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} +.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} +.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} +.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} +.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} +.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} +.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} +.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} +.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} +.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} +.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} +.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} +.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} +.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} +.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} +.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} +.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} +.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} +.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} +.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} \ No newline at end of file diff --git a/docker-compose.base.yaml b/docker-compose.base.yaml new file mode 100644 index 0000000..2142ece --- /dev/null +++ b/docker-compose.base.yaml @@ -0,0 +1,32 @@ +name: kbpbase +services: + nginx-proxy: + build: + context: NGINX_Server + args: # Übergibt die ARGS an das dockerfile + NGINX_VERSION: ${NGINX_VERSION} + + ports: + - ${NGINX_HOST_PORT}:4430 + volumes: + - ${NGINX_STATIC_DIR}:/usr/share/nginx/html:ro + - ${NGINX_CONFIG_TEMPLATE_DIR}:/etc/nginx/templates + - ${NGINX_CERTS}:/etc/certs + environment: + - NGINX_CERT=${NGINX_CERT} + - NGINX_CERT_KEY=${NGINX_CERT_KEY} + - NGINX_SERVER_NAME=${NGINX_SERVER_NAME} + pythonapp: + build: + context: App_Server + # target: kommt aus dem prod oder dev dockerfile + args: # Übergibt die ARGS an das dockerfile + PYTHON_VERSION: ${PYTHON_VERSION} + volumes: + #- ${PYTHON_APP_DIR}:/usr/opt/pythonapp/root + - ${PYTHON_DB_DIR}:/usr/var/pythonappdb + - python-venv:/usr/opt/pythonapp/env + # - ${PYTHON_ENV_DIR}:/usr/opt/pythonapp/env + +volumes: + python-venv: \ No newline at end of file diff --git a/docker-compose.dev.yaml b/docker-compose.dev.yaml new file mode 100644 index 0000000..d139892 --- /dev/null +++ b/docker-compose.dev.yaml @@ -0,0 +1,19 @@ +name: kbpdev +services: + pythonapp: + extends: + file: docker-compose.base.yaml + service: pythonapp + build: + target: dev + args: # Übergibt die ARGS an das dockerfile + # PYTHON_VERSION: ${PYTHON_VERSION} + NODE_VERSION: ${NODE_VERSION:-18} + NPM_VERSION: ${NPM_VERSION:-8} + volumes: + - ${PYTHON_DEV_DIR}:/usr/opt/pythonapp + # - ${TYPESCRIPT_SRC_DIR}:/usr/opt/typescript + - node-modules:/usr/opt/typescript/node_modules + +volumes: + node-modules: \ No newline at end of file diff --git a/docker-compose.prod.yaml b/docker-compose.prod.yaml new file mode 100644 index 0000000..381dc04 --- /dev/null +++ b/docker-compose.prod.yaml @@ -0,0 +1,10 @@ +name: kbpprod +services: + pythonapp: + extends: + file: docker-compose.base.yaml + service: pythonapp + build: + target: prod + volumes: + - ${PYTHON_APP_DIR}:/usr/opt/pythonapp \ No newline at end of file diff --git a/docker-compose.save.yaml b/docker-compose.save.yaml new file mode 100644 index 0000000..2a9d2b1 --- /dev/null +++ b/docker-compose.save.yaml @@ -0,0 +1,26 @@ +services: + nginx-proxy: + build: + context: NGINX_Server + args: # Übergibt die ARGS an das dockerfile + NGINX_VERSION: ${NGINX_VERSION} + + ports: + - ${NGINX_HOST_PORT}:4430 + volumes: + - ${NGINX_STATIC_DIR}:/usr/share/nginx/html:ro + - ${NGINX_CONFIG_TEMPLATE_DIR}:/etc/nginx/templates + - ${NGINX_CERTS}:/etc/certs + environment: + - NGINX_CERT=${NGINX_CERT} + - NGINX_CERT_KEY=${NGINX_CERT_KEY} + - NGINX_SERVER_NAME=${NGINX_SERVER_NAME} + pythonapp: + build: + context: App_Server + args: # Übergibt die ARGS an das dockerfile + PYTHON_VERSION: ${PYTHON_VERSION} + volumes: + - ${PYTHON_APP_DIR}:/usr/opt/pythonapp/root + - ${PYTHON_DB_DIR}:/usr/var/pythonappdb + # - ${PYTHON_ENV_DIR}:/usr/opt/pythonapp/env \ No newline at end of file