From 195bc64b460730fb23f03d2f203ea246df8b5574 Mon Sep 17 00:00:00 2001 From: ValueOn AG Date: Thu, 8 May 2025 14:06:19 +0200 Subject: [PATCH] prod azure 1.1 ready internal --- modules/agentEmail.py | 20 +- static/40_email_preview.html | 42 +++ static/41_email_template.json | 6 + static/42_gatewayInterface.py | 526 +++++++++++++++++++++++++++++++++ static/43_defAttributes.py | 123 ++++++++ static/44_email_preview.html | 42 +++ static/45_email_template.json | 6 + static/46_email_preview.html | 42 +++ static/47_email_template.json | 6 + static/48_email_preview.html | 42 +++ static/49_email_template.json | 6 + static/50_LF-Nutshell.png | Bin 0 -> 52108 bytes static/51_PowerOn NDA 2025.pdf | Bin 0 -> 39612 bytes static/52_email_preview.html | 42 +++ static/53_email_template.json | 6 + 15 files changed, 906 insertions(+), 3 deletions(-) create mode 100644 static/40_email_preview.html create mode 100644 static/41_email_template.json create mode 100644 static/42_gatewayInterface.py create mode 100644 static/43_defAttributes.py create mode 100644 static/44_email_preview.html create mode 100644 static/45_email_template.json create mode 100644 static/46_email_preview.html create mode 100644 static/47_email_template.json create mode 100644 static/48_email_preview.html create mode 100644 static/49_email_template.json create mode 100644 static/50_LF-Nutshell.png create mode 100644 static/51_PowerOn NDA 2025.pdf create mode 100644 static/52_email_preview.html create mode 100644 static/53_email_template.json diff --git a/modules/agentEmail.py b/modules/agentEmail.py index 3c843ddc..0a6482ab 100644 --- a/modules/agentEmail.py +++ b/modules/agentEmail.py @@ -489,7 +489,7 @@ class AgentEmail(AgentBase): 'Content-Type': 'application/json' } - # Prepare email data + # Prepare email data with proper structure email_data = { 'subject': subject, 'body': { @@ -541,15 +541,22 @@ class AgentEmail(AgentBase): logger.info("Encoding bytes content to base64") file_content = base64.b64encode(file_content).decode('utf-8') + # Calculate actual size from base64 content + try: + decoded_size = len(base64.b64decode(file_content)) + except Exception as e: + logger.error(f"Error calculating size for {file_name}: {str(e)}") + decoded_size = 0 + # Add attachment to email data - logger.info(f"Adding attachment: {file_name} ({content_type})") + logger.info(f"Adding attachment: {file_name} ({content_type}, size: {decoded_size} bytes)") attachment_data = { '@odata.type': '#microsoft.graph.fileAttachment', 'name': file_name, 'contentType': content_type, 'contentBytes': file_content, 'isInline': False, - 'size': len(base64.b64decode(file_content)) if file_content else 0 + 'size': decoded_size } email_data['attachments'].append(attachment_data) logger.info(f"Successfully added attachment: {file_name}") @@ -561,6 +568,9 @@ class AgentEmail(AgentBase): f"has_attachments={bool(email_data.get('attachments'))}, " + f"attachment_count={len(email_data.get('attachments', []))}") + # Log the full email data structure for debugging + logger.debug(f"Full email data structure: {json.dumps(email_data, indent=2)}") + # First create the draft message response = requests.post( 'https://graph.microsoft.com/v1.0/me/mailFolders/drafts/messages', @@ -573,6 +583,8 @@ class AgentEmail(AgentBase): return response.json() else: logger.error(f"Drafts folder method failed: {response.status_code} - {response.text}") + logger.error(f"Request headers: {headers}") + logger.error(f"Request body: {json.dumps(email_data, indent=2)}") # Try fallback method with messages endpoint logger.info("Trying fallback with messages endpoint") @@ -587,6 +599,8 @@ class AgentEmail(AgentBase): return response.json() else: logger.error(f"Messages endpoint method also failed: {response.status_code} - {response.text}") + logger.error(f"Request headers: {headers}") + logger.error(f"Request body: {json.dumps(email_data, indent=2)}") return None except Exception as e: diff --git a/static/40_email_preview.html b/static/40_email_preview.html new file mode 100644 index 00000000..67062963 --- /dev/null +++ b/static/40_email_preview.html @@ -0,0 +1,42 @@ + + + + + + Email Preview: Terminverschiebung: Neuer Termin am Freitag + + + +
+ + + +
+ + + \ No newline at end of file diff --git a/static/41_email_template.json b/static/41_email_template.json new file mode 100644 index 00000000..842f4c72 --- /dev/null +++ b/static/41_email_template.json @@ -0,0 +1,6 @@ +{ + "recipient": "peter.muster@domain.com", + "subject": "Terminverschiebung: Neuer Termin am Freitag", + "plainBody": "Sehr geehrter Herr Muster,\n\nich hoffe, es geht Ihnen gut. Ich schreibe Ihnen, um unseren geplanten Termin um 10 Uhr zu verschieben. K\u00f6nnten wir den Termin stattdessen auf Freitag verlegen?\n\nBitte lassen Sie mich wissen, ob dieser neue Termin f\u00fcr Sie passt.\n\nVielen Dank f\u00fcr Ihr Verst\u00e4ndnis.\n\nMit freundlichen Gr\u00fc\u00dfen,\n\n[Ihr Name]", + "htmlBody": "

Sehr geehrter Herr Muster,

ich hoffe, es geht Ihnen gut. Ich schreibe Ihnen, um unseren geplanten Termin um 10 Uhr zu verschieben. K\u00f6nnten wir den Termin stattdessen auf Freitag verlegen?

Bitte lassen Sie mich wissen, ob dieser neue Termin f\u00fcr Sie passt.

Vielen Dank f\u00fcr Ihr Verst\u00e4ndnis.

Mit freundlichen Gr\u00fc\u00dfen,
[Ihr Name]

" +} \ No newline at end of file diff --git a/static/42_gatewayInterface.py b/static/42_gatewayInterface.py new file mode 100644 index 00000000..ea5aa542 --- /dev/null +++ b/static/42_gatewayInterface.py @@ -0,0 +1,526 @@ +""" +Interface to the Gateway system. +Manages users and mandates for authentication. +""" + +import os +import logging +from typing import Dict, Any, List, Optional, Union +import importlib +from passlib.context import CryptContext + +from connectors.connectorDbJson import DatabaseConnector +from modules.configuration import APP_CONFIG + +logger = logging.getLogger(__name__) + +# Password-Hashing +pwdContext = CryptContext(schemes=["argon2"], deprecated="auto") + + +class GatewayInterface: + """ + Interface to the Gateway system. + Manages users and mandates. + """ + + def __init__(self, mandateId: int = None, userId: int = None): + """Initializes the Gateway Interface with optional mandate and user context.""" + # Context can be empty during initialization + self.mandateId = mandateId + self.userId = userId + + # Import data model module + try: + self.modelModule = importlib.import_module("modules.gatewayModel") + logger.info("gatewayModel successfully imported") + except ImportError as e: + logger.error(f"Error importing gatewayModel: {e}") + raise + + # Initialize database + self._initializeDatabase() + + # Load user information + self.currentUser = self._getCurrentUserInfo() + + # Initialize standard records if needed + self._initRecords() + + def _getCurrentUserInfo(self) -> Dict[str, Any]: + """Gets information about the current user including privileges.""" + # For initialization, set default values + userInfo = { + "id": self.userId, + "mandateId": self.mandateId, + "privilege": "user", # Default privilege level + "language": "en" + } + + # Try to load actual user info if IDs are provided + if self.userId: + userRecords = self.db.getRecordset("users", recordFilter={"id": self.userId}) + if userRecords: + user = userRecords[0] + userInfo["privilege"] = user.get("privilege", "user") + userInfo["language"] = user.get("language", "en") + + return userInfo + + def _initializeDatabase(self): + """Initializes the database connection.""" + self.db = DatabaseConnector( + dbHost=APP_CONFIG.get("DB_SYSTEM_HOST"), + dbDatabase=APP_CONFIG.get("DB_SYSTEM_DATABASE"), + dbUser=APP_CONFIG.get("DB_SYSTEM_USER"), + dbPassword=APP_CONFIG.get("DB_SYSTEM_PASSWORD_SECRET"), + mandateId=self.mandateId if self.mandateId else 0, + userId=self.userId if self.userId else 0 + ) + + def _initRecords(self): + """Initializes standard records in the database if they don't exist.""" + self._initRootMandate() + self._initAdminUser() + + def _initRootMandate(self): + """Creates the Root mandate if it doesn't exist.""" + existingMandateId = self.getInitialId("mandates") + mandates = self.db.getRecordset("mandates") + if existingMandateId is None or not mandates: + logger.info("Creating Root mandate") + rootMandate = { + "name": "Root", + "language": "de" + } + createdMandate = self.db.recordCreate("mandates", rootMandate) + logger.info(f"Root mandate created with ID {createdMandate['id']}") + + # Update mandate context + self.mandateId = createdMandate['id'] + + def _initAdminUser(self): + """Creates the Admin user if it doesn't exist.""" + existingUserId = self.getInitialId("users") + users = self.db.getRecordset("users") + if existingUserId is None or not users: + logger.info("Creating Admin user") + adminUser = { + "mandateId": self.mandateId, + "username": "admin", + "email": "admin@example.com", + "fullName": "Administrator", + "disabled": False, + "language": "de", + "privilege": "sysadmin", + "hashedPassword": self._getPasswordHash("The 1st Poweron Admin") # Use a secure password in production! + } + createdUser = self.db.recordCreate("users", adminUser) + logger.info(f"Admin user created with ID {createdUser['id']}") + + # Update user context + self.userId = createdUser['id'] + + def _uam(self, table: str, recordset: List[Dict[str, Any]]) -> List[Dict[str, Any]]: + """ + Unified user access management function that filters data based on user privileges. + + Args: + table: Name of the table + recordset: Recordset to filter based on access rules + + Returns: + Filtered recordset based on user privilege level + """ + userPrivilege = self.currentUser.get("privilege", "user") + + # Apply filtering based on privilege + if userPrivilege == "sysadmin": + return recordset # System admins see all records + elif userPrivilege == "admin": + # Admins see records in their mandate + return [r for r in recordset if r.get("mandateId") == self.mandateId] + else: # Regular users + # Users only see records they own within their mandate + return [r for r in recordset + if r.get("mandateId") == self.mandateId and r.get("userId") == self.userId] + + def _canModify(self, table: str, recordId: Optional[int] = None) -> bool: + """ + Checks if the current user can modify (create/update/delete) records in a table. + + Args: + table: Name of the table + recordId: Optional record ID for specific record check + + Returns: + Boolean indicating permission + """ + userPrivilege = self.currentUser.get("privilege", "user") + + # System admins can modify anything + if userPrivilege == "sysadmin": + return True + + # Check specific record permissions + if recordId is not None: + # Get the record to check ownership + records = self.db.getRecordset(table, recordFilter={"id": recordId}) + if not records: + return False + + record = records[0] + + # Admins can modify anything in their mandate + if userPrivilege == "admin" and record.get("mandateId") == self.mandateId: + # Exception: Can't modify Root mandate unless you are a sysadmin + if table == "mandates" and recordId == 1 and userPrivilege != "sysadmin": + return False + return True + + # Users can only modify their own records + if (record.get("mandateId") == self.mandateId and + record.get("userId") == self.userId): + return True + + return False + else: + # For general table modify permission (e.g., create) + # Admins can create anything in their mandate + if userPrivilege == "admin": + return True + + # Regular users can create most entities + if table == "mandates": + return False # Regular users can't create mandates + return True + + def getInitialId(self, table: str) -> Optional[int]: + """Returns the initial ID for a table.""" + return self.db.getInitialId(table) + + def _getPasswordHash(self, password: str) -> str: + """Creates a hash for a password.""" + return pwdContext.hash(password) + + def _verifyPassword(self, plainPassword: str, hashedPassword: str) -> bool: + """Checks if the password matches the hash.""" + return pwdContext.verify(plainPassword, hashedPassword) + + def _getCurrentTimestamp(self) -> str: + """Returns the current timestamp in ISO format.""" + from datetime import datetime + return datetime.now().isoformat() + + # Mandate methods + + def getAllMandates(self) -> List[Dict[str, Any]]: + """Returns mandates based on user access level.""" + allMandates = self.db.getRecordset("mandates") + return self._uam("mandates", allMandates) + + def getMandate(self, mandateId: int) -> Optional[Dict[str, Any]]: + """Returns a mandate by ID if user has access.""" + mandates = self.db.getRecordset("mandates", recordFilter={"id": mandateId}) + if not mandates: + return None + + filteredMandates = self._uam("mandates", mandates) + return filteredMandates[0] if filteredMandates else None + + def createMandate(self, name: str, language: str = "de") -> Dict[str, Any]: + """Creates a new mandate if user has permission.""" + if not self._canModify("mandates"): + raise PermissionError("No permission to create mandates") + + mandateData = { + "name": name, + "language": language + } + + return self.db.recordCreate("mandates", mandateData) + + def updateMandate(self, mandateId: int, mandateData: Dict[str, Any]) -> Dict[str, Any]: + """Updates a mandate if user has access.""" + # Check if the mandate exists and user has access + mandate = self.getMandate(mandateId) + if not mandate: + raise ValueError(f"Mandate with ID {mandateId} not found") + + if not self._canModify("mandates", mandateId): + raise PermissionError(f"No permission to update mandate {mandateId}") + + # Update the mandate + return self.db.recordModify("mandates", mandateId, mandateData) + + def deleteMandate(self, mandateId: int) -> bool: + """ + Deletes a mandate and all associated users and data if user has permission. + """ + # Check if the mandate exists and user has access + mandate = self.getMandate(mandateId) + if not mandate: + return False + + if not self._canModify("mandates", mandateId): + raise PermissionError(f"No permission to delete mandate {mandateId}") + + # Check if it's the initial mandate + initialMandateId = self.getInitialId("mandates") + if initialMandateId is not None and mandateId == initialMandateId: + logger.warning(f"Attempt to delete the Root mandate was prevented") + return False + + # Find all users of the mandate + users = self.getUsersByMandate(mandateId) + + # Delete all users of the mandate and their associated data + for user in users: + self.deleteUser(user["id"]) + + # Delete the mandate + success = self.db.recordDelete("mandates", mandateId) + + if success: + logger.info(f"Mandate with ID {mandateId} was successfully deleted") + else: + logger.error(f"Error deleting mandate with ID {mandateId}") + + return success + + # User methods + + def getAllUsers(self) -> List[Dict[str, Any]]: + """Returns users based on user access level.""" + allUsers = self.db.getRecordset("users") + filteredUsers = self._uam("users", allUsers) + + # Remove password hashes + for user in filteredUsers: + if "hashedPassword" in user: + del user["hashedPassword"] + + return filteredUsers + + def getUsersByMandate(self, mandateId: int) -> List[Dict[str, Any]]: + """Returns users for a specific mandate if user has access.""" + # First check if user has access to the mandate + mandate = self.getMandate(mandateId) + if not mandate: + return [] + + # Get users for this mandate + users = self.db.getRecordset("users", recordFilter={"mandateId": mandateId}) + filteredUsers = self._uam("users", users) + + # Remove password hashes + for user in filteredUsers: + if "hashedPassword" in user: + del user["hashedPassword"] + + return filteredUsers + + def getUserByUsername(self, username: str) -> Optional[Dict[str, Any]]: + """Returns a user by username.""" + users = self.db.getRecordset("users") + for user in users: + if user.get("username") == username: + return user + return None + + def getUser(self, userId: int) -> Optional[Dict[str, Any]]: + """Returns a user by ID if user has access.""" + users = self.db.getRecordset("users", recordFilter={"id": userId}) + if not users: + return None + + filteredUsers = self._uam("users", users) + if not filteredUsers: + return None + + user = filteredUsers[0] + + # Remove password hash + if "hashedPassword" in user: + userCopy = user.copy() + del userCopy["hashedPassword"] + return userCopy + + return user + + def createUser(self, username: str, password: str, email: str = None, + fullName: str = None, language: str = "de", mandateId: int = None, + disabled: bool = False, privilege: str = "user") -> Dict[str, Any]: + """Creates a new user if current user has permission.""" + # Check if the username already exists + existingUser = self.getUserByUsername(username) + if existingUser: + raise ValueError(f"User '{username}' already exists") + + # Use the provided mandateId or the current context + userMandateId = mandateId if mandateId is not None else self.mandateId + + # Check if user has access to the mandate + if userMandateId != self.mandateId and self.currentUser.get("privilege") != "sysadmin": + raise PermissionError(f"No permission to create users in mandate {userMandateId}") + + if not self._canModify("users"): + raise PermissionError("No permission to create users") + + # Check privilege escalation + if (privilege == "sysadmin" or + (privilege == "admin" and self.currentUser.get("privilege") == "user")): + raise PermissionError(f"Cannot create user with higher privilege: {privilege}") + + userData = { + "mandateId": userMandateId, + "username": username, + "email": email, + "fullName": fullName, + "disabled": disabled, + "language": language, + "privilege": privilege, + "hashedPassword": self._getPasswordHash(password) + } + + createdUser = self.db.recordCreate("users", userData) + + # Remove password hash from the response + if "hashedPassword" in createdUser: + del createdUser["hashedPassword"] + + return createdUser + + def authenticateUser(self, username: str, password: str) -> Optional[Dict[str, Any]]: + """Authenticates a user by username and password.""" + # Clear the users table from cache and reload it + if "users" in self.db._tablesCache: + del self.db._tablesCache["users"] + + # Get fresh user data + users = self.db.getRecordset("users") + user = next((u for u in users if u.get("username") == username), None) + + if not user: + return None + + if not self._verifyPassword(password, user.get("hashedPassword", "")): + return None + + # Check if the user is disabled + if user.get("disabled", False): + return None + + # Create a copy without password hash + authenticatedUser = {**user} + if "hashedPassword" in authenticatedUser: + del authenticatedUser["hashedPassword"] + + return authenticatedUser + + + def updateUser(self, userId: int, userData: Dict[str, Any]) -> Dict[str, Any]: + """Updates a user if current user has permission.""" + # Check if the user exists and current user has access + user = self.getUser(userId) + if not user: + # Try to get the raw user record for admin access check + users = self.db.getRecordset("users", recordFilter={"id": userId}) + if not users: + raise ValueError(f"User with ID {userId} not found") + + # Check if current user is admin/sysadmin + if not self._canModify("users", userId): + raise PermissionError(f"No permission to update user {userId}") + + user = users[0] + + # Check privilege escalation + if "privilege" in userData: + currentPrivilege = self.currentUser.get("privilege") + targetPrivilege = userData["privilege"] + + if (targetPrivilege == "sysadmin" and currentPrivilege != "sysadmin") or ( + targetPrivilege == "admin" and currentPrivilege == "user"): + raise PermissionError(f"Cannot escalate privilege to {targetPrivilege}") + + # If the password is being changed, hash it + if "password" in userData: + userData["hashedPassword"] = self._getPasswordHash(userData["password"]) + del userData["password"] + + # Update the user + updatedUser = self.db.recordModify("users", userId, userData) + + # Remove password hash from the response + if "hashedPassword" in updatedUser: + del updatedUser["hashedPassword"] + + return updatedUser + + def disableUser(self, userId: int) -> Dict[str, Any]: + """Disables a user if current user has permission.""" + return self.updateUser(userId, {"disabled": True}) + + def enableUser(self, userId: int) -> Dict[str, Any]: + """Enables a user if current user has permission.""" + return self.updateUser(userId, {"disabled": False}) + + def _deleteUserReferencedData(self, userId: int) -> None: + """Deletes all data associated with a user.""" + # Delete user attributes + try: + attributes = self.db.getRecordset("attributes", recordFilter={"userId": userId}) + for attribute in attributes: + self.db.recordDelete("attributes", attribute["id"]) + except Exception as e: + logger.error(f"Error deleting attributes for user {userId}: {e}") + + logger.info(f"All referenced data for user {userId} has been deleted") + + def deleteUser(self, userId: int) -> bool: + """Deletes a user and all associated data if current user has permission.""" + # Check if the user exists + users = self.db.getRecordset("users", recordFilter={"id": userId}) + if not users: + return False + + # Check if current user has permission + if not self._canModify("users", userId): + raise PermissionError(f"No permission to delete user {userId}") + + # Check if it's the initial user + initialUserId = self.getInitialId("users") + if initialUserId is not None and userId == initialUserId: + logger.warning("Attempt to delete the Root Admin was prevented") + return False + + # Delete all data associated with the user + self._deleteUserReferencedData(userId) + + # Delete the user + success = self.db.recordDelete("users", userId) + + if success: + logger.info(f"User with ID {userId} was successfully deleted") + else: + logger.error(f"Error deleting user with ID {userId}") + + return success + + +# Singleton factory for GatewayInterface instances per context +_gatewayInterfaces = {} + +def getGatewayInterface(mandateId: int = None, userId: int = None) -> GatewayInterface: + """ + Returns a GatewayInterface instance for the specified context. + Reuses existing instances. + """ + contextKey = f"{mandateId}_{userId}" + if contextKey not in _gatewayInterfaces: + _gatewayInterfaces[contextKey] = GatewayInterface(mandateId, userId) + return _gatewayInterfaces[contextKey] + +# Initialize an instance +getGatewayInterface() \ No newline at end of file diff --git a/static/43_defAttributes.py b/static/43_defAttributes.py new file mode 100644 index 00000000..731ecfd9 --- /dev/null +++ b/static/43_defAttributes.py @@ -0,0 +1,123 @@ +from pydantic import BaseModel, Field +from typing import List, Dict, Any, Optional + +# Define the model for attribute definitions +class AttributeDefinition(BaseModel): + name: str + label: str + type: str + required: bool = False + placeholder: Optional[str] = None + defaultValue: Optional[Any] = None + options: Optional[List[Dict[str, Any]]] = None + editable: bool = True + visible: bool = True + order: int = 0 + validation: Optional[Dict[str, Any]] = None + helpText: Optional[str] = None + +# Helper classes for type mapping +typeMappings = { + "int": "number", + "str": "string", + "float": "number", + "bool": "boolean", + "List[int]": "array", + "List[str]": "array", + "Dict[str, Any]": "object", + "Optional[str]": "string", + "Optional[int]": "number", + "Optional[Dict[str, Any]]": "object" +} + +# Special field types based on naming conventions +specialFieldTypes = { + "content": "textarea", + "description": "textarea", + "instructions": "textarea", + "password": "password", + "email": "email", + "workspaceId": "select", + "agentId": "select", + "type": "select" +} + +# Function to convert a Pydantic model into attribute definitions +def getModelAttributes(modelClass, userLanguage="de"): + """ + Converts a Pydantic model into a list of AttributeDefinition objects + """ + attributes = [] + + # Go through all fields in the model + for i, (fieldName, field) in enumerate(modelClass.__fields__.items()): + # Skip internal fields + if fieldName.startswith('_') or fieldName in ["label", "fieldLabels"]: + continue + + # Determine the field type + fieldType = typeMappings.get(str(field.type_), "string") + + # Check for special field types + if fieldName in specialFieldTypes: + fieldType = specialFieldTypes[fieldName] + + # Get the label (if available) + fieldLabel = fieldName.replace('_', ' ').capitalize() + if hasattr(modelClass, 'fieldLabels') and fieldName in modelClass.fieldLabels: + labelObj = modelClass.fieldLabels[fieldName] + fieldLabel = labelObj.getLabel(userLanguage) + + # Determine default values and required status + required = field.required + defaultValue = field.default if not field.required else None + + # Check for validation rules + validation = None + if field.validators: + validation = {"hasValidators": True} + + # Placeholder text + placeholder = f"Please enter {fieldLabel}" + + # Special options for Select fields + options = None + if fieldType == "select": + if fieldName == "type" and modelClass.__name__ == "Agent": + options = [ + {"value": "Analysis", "label": "Analysis"}, + {"value": "Transformation", "label": "Transformation"}, + {"value": "Generation", "label": "Generation"}, + {"value": "Classification", "label": "Classification"}, + {"value": "Custom", "label": "Custom"} + ] + + # Extract description from Field object + description = None + # Try to get description from various possible sources + if hasattr(field, 'field_info') and hasattr(field.field_info, 'description'): + description = field.field_info.description + elif hasattr(field, 'description'): + description = field.description + elif hasattr(field, 'schema') and hasattr(field.schema, 'description'): + description = field.schema.description + + # Create attribute definition + attrDef = AttributeDefinition( + name=fieldName, + label=fieldLabel, + type=fieldType, + required=required, + placeholder=placeholder, + defaultValue=defaultValue, + options=options, + editable=fieldName not in ["id", "mandateId", "userId", "createdAt", "uploadDate"], + visible=fieldName not in ["hashedPassword", "mandateId", "userId"], + order=i, + validation=validation, + helpText=description or "" # Set empty string as default value if no description found + ) + + attributes.append(attrDef) + + return attributes \ No newline at end of file diff --git a/static/44_email_preview.html b/static/44_email_preview.html new file mode 100644 index 00000000..053e9b7c --- /dev/null +++ b/static/44_email_preview.html @@ -0,0 +1,42 @@ + + + + + + Email Preview: Anfrage zur Terminverschiebung und Dokumentenanhang + + + +
+ + + +
+ + + \ No newline at end of file diff --git a/static/45_email_template.json b/static/45_email_template.json new file mode 100644 index 00000000..b0a9f641 --- /dev/null +++ b/static/45_email_template.json @@ -0,0 +1,6 @@ +{ + "recipient": "peter.muster@domain.com", + "subject": "Anfrage zur Terminverschiebung und Dokumentenanhang", + "plainBody": "Sehr geehrter Herr Muster,\n\nich hoffe, diese Nachricht trifft Sie wohl. Ich schreibe Ihnen, um zu fragen, ob es m\u00f6glich w\u00e4re, unseren Termin von 10 Uhr auf Freitag zu verschieben. Anbei finden Sie die Dokumente 'gatewayInterface.py' und 'defAttributes.py'.\n\nIch freue mich auf Ihre R\u00fcckmeldung.\n\nMit freundlichen Gr\u00fc\u00dfen,\n\n[Ihr Name]", + "htmlBody": "

Sehr geehrter Herr Muster,

ich hoffe, diese Nachricht trifft Sie wohl. Ich schreibe Ihnen, um zu fragen, ob es m\u00f6glich w\u00e4re, unseren Termin von 10 Uhr auf Freitag zu verschieben. Anbei finden Sie die Dokumente 'gatewayInterface.py' und 'defAttributes.py'.

Ich freue mich auf Ihre R\u00fcckmeldung.

Mit freundlichen Gr\u00fc\u00dfen,
[Ihr Name]

" +} \ No newline at end of file diff --git a/static/46_email_preview.html b/static/46_email_preview.html new file mode 100644 index 00000000..6e7a2e58 --- /dev/null +++ b/static/46_email_preview.html @@ -0,0 +1,42 @@ + + + + + + Email Preview: Wichtige Dokumente: gatewayInterface.py und defAttributes.py + + + +
+ + + +
+ + + \ No newline at end of file diff --git a/static/47_email_template.json b/static/47_email_template.json new file mode 100644 index 00000000..b61972e1 --- /dev/null +++ b/static/47_email_template.json @@ -0,0 +1,6 @@ +{ + "recipient": "recipient@example.com", + "subject": "Wichtige Dokumente: gatewayInterface.py und defAttributes.py", + "plainBody": "Sehr geehrte Damen und Herren,\n\nanbei finden Sie die angeforderten Dokumente 'gatewayInterface.py' und 'defAttributes.py'. Bitte \u00fcberpr\u00fcfen Sie die Anh\u00e4nge und lassen Sie uns wissen, falls Sie weitere Informationen ben\u00f6tigen.\n\nMit freundlichen Gr\u00fc\u00dfen,\nIhr Team", + "htmlBody": "

Sehr geehrte Damen und Herren,

anbei finden Sie die angeforderten Dokumente 'gatewayInterface.py' und 'defAttributes.py'. Bitte \u00fcberpr\u00fcfen Sie die Anh\u00e4nge und lassen Sie uns wissen, falls Sie weitere Informationen ben\u00f6tigen.

Mit freundlichen Gr\u00fc\u00dfen,
Ihr Team

" +} \ No newline at end of file diff --git a/static/48_email_preview.html b/static/48_email_preview.html new file mode 100644 index 00000000..9b11e454 --- /dev/null +++ b/static/48_email_preview.html @@ -0,0 +1,42 @@ + + + + + + Email Preview: Resending Requested Documents + + + +
+ + + +
+ + + \ No newline at end of file diff --git a/static/49_email_template.json b/static/49_email_template.json new file mode 100644 index 00000000..c34f0e44 --- /dev/null +++ b/static/49_email_template.json @@ -0,0 +1,6 @@ +{ + "recipient": "recipient@example.com", + "subject": "Resending Requested Documents", + "plainBody": "Sehr geehrte/r Empf\u00e4nger/in,\n\nanbei finden Sie die angeforderten Dokumente 'gatewayInterface.py' und 'defAttributes.py'. Bitte lassen Sie mich wissen, falls Sie weitere Informationen ben\u00f6tigen.\n\nMit freundlichen Gr\u00fc\u00dfen,\nIhr Team", + "htmlBody": "

Sehr geehrte/r Empf\u00e4nger/in,

anbei finden Sie die angeforderten Dokumente 'gatewayInterface.py' und 'defAttributes.py'. Bitte lassen Sie mich wissen, falls Sie weitere Informationen ben\u00f6tigen.

Mit freundlichen Gr\u00fc\u00dfen,
Ihr Team

" +} \ No newline at end of file diff --git a/static/50_LF-Nutshell.png b/static/50_LF-Nutshell.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec8cd9402f034bca1753b0c347d2c93a67760da GIT binary patch literal 52108 zcmeFZX;hO}`!5`At*zQptAecxRT~9lazsHutB3|rnG6UaR78Y;C=d{m0IgN4sA!mH zWfYJEWHJl^>wpmf5h2V`2q44|8A1qQIM+CP?-%{D2!%p@f9T+TOBCuGF$(qd;cvfzD>H$P-^2gr`B<9#j-u7A9)KTTyY4mL zi$djxEuQ*g0sQ{%>_Iyp6zYdZ$ba*yz3!ewp=#D1+P~NOyyN@n>2OUEZsYm7;Jn5& z7vk;FMlT=f=r`279D7-oPsrEbW3PbCJb4Y(7$O+c-fB?LvdsyP_ed*c`;ESg>Uesj z<-q`I*YO+gzCDSxi@G*d74BK8``4X$tJ?o^`188pRDT9&26n+m9c9+lbi#Gwwx z;7D&xb(e@KnkRdbFtX2RY+uu8lBj&JPG4|uW~zR+9LL5*ccJmP50v3h{MWJvcf5If zS%t>zwP(8g(ZJ5(hMM@+oho32%kH9h!b`g4cP1aIOg$VlnyH>`q48JNf8dX8|uSNg&9&_5#H9I3xnH3S9H#9VKOuo7|Iq6+ZTmzgXXrfhs zzVM~9)1_r)_KEubLwf!7$#iAPSOY_tE`I7Y^_0ObekU}3DC+1p^dE}(K&TuiTm|-4 zsv)nMJ^o5zw~lW5GUec@VMbA2ZUlL>8j-_oGeib4A#CP&QPcOj9Xg_Kg8rHP_2}5< z6&R-2If9Hr9o--uA%v=MSXJB?W-&4kwI>$2p)(I-c({@0C@LKsZ}*~~Drn6w8!F8S ze4k(4*POTj&6(Pa46YiE2zSFCR<&DT*JzS1R)_L-F+RrLU-3VPK%rGK(Th_1clYn| zSrASY_#y;4>3y22Ce(2(h4GU)%Rf+hZH<(46q=)yvrzf`n~6&Mj1R}_EhQF-#D{5I zecA0Fq{LTcqw&j~waIT6=d^nGB~~kwJkHG4L~C!XKiBSAVk4jkNCo}2B@g;GVQDAn znTqKqD?#jm%E3}%RQ5>EKu z)rd5-eVf4F{(b9AfO{y#t8#k$oHq?5HGPLZy@ki`3-kX{?UNjUL z31b68ZwS;yiUXyhoS{{uzUTSIXwH`Yse$B~fr|@Vo^R>@7DvxCN5C(i=bd`^F-`Fg z3JT$P``@t3zi$vuP7bQaAB!xbJy-~Tty^+yrbV2}Jl|clRBhqUBHF7gy2Gx> zP2!ZiP`BqU!5PtNlb4t@!+uKuL6uBD^SxcHY}2`mhga6wWc2->t?^4XZ~J(pdcvh= zIIDz>Hrs?kaeZ*mkb`-q-AHd;6Lv63LGy=4{e~h2gRSU|=G+tA0IcWbh#Yb(9 z#u@k3?j0Zb{+4>^rNO}K76+S?=at-zap*51;u?PprESKRYwBqw5Ls;EOyB0=iWiaI zxQoYV+*RsW^>G8Q>9|ryZ1NWa;#?Z_Fih3pZi~yq-_}ofT~K0vxVX5c(BZAl{!wCc z*mBRx;`8R`D2#Pzo0GZOJZ4G#&tZaVBrK=0LwM0|b92zDK7^NX&i` zm5mF|aHyc=+N~o}9C7Yfa}9$>J8(~4r`*pqJTkRgw{jzc-AweXCA^3{%^2})l^nI2 zBfHY)8Fv5~6Eq*cHM;v91d*GteOK>BIAksLc6oMRvGW4${+Wh+T-f{FwN$#AD5jRi zZf&+XL#*igkv$W~F5h4uauGDIzMw6o$GiW%de`slif87dy|jFu!yMbYouf0T-mVx) z4#gzXMz!?(8cS)K*h?BYywz`KBm#lPQEwOAJN0t!Y9XWFSxa1cwUFt3(Vmis<4A01 zo~Qqe+Qjz;qxP>TzQg_&{L%MPtJ;HY-Im7X>G?GTD6KdU4{S2FoV3IBzq2CuVhUc` z{CI}I!U|Rx`7_wegIHF{-Is&vkG#>x**rU6=FPG$hpfAZ4GbJbB=WUyq&dzQhh_PL zMWRhFF{`!JuQj7-cf?|^;hpsp?nq{~k@!l{qn}7i4b=3x3F zg^07l9?~6~cxB4W!|aOM#GHKJZu8f6P5YGIW`#&nE(27dJ=f0y9jkzjw6}G2bsf8o zMQ+*`)kNf!VM^~*d+lQ>Ma8}&B<1iVncVnb^Dh*rpI|ST`rZ*BR&~(%;paGc+i&E9b@k*MJQHK z6MGxul6!orX{p>ChWCy_0mO!H`N=wt9>J#%xj`f@#ON>Qm#;qprB zel*5o&nZ>onPhRBGVV#cIy>`AraU#p?iS<5cFVo3f@NmOX4|~_-hjz_uofh&7-_ew zR;{u_nK;0XQ0KWbyazRa`_W?2yU|H+x@Qv)aZ?}TJTCnR3ypskxh!=5z^zRdh;J$# zB4H1e+~_G&Ze<)C>KYR#<$8A+LJ%rll z!R(@BFu#|=$+ouSrf79tDRnf01wvhFc|e^{(pG+%ulUz`ppdJtULKp3#%5 zpJo(jh~4)&IwxfEd=_CDhKN^-ID|yaWk0$!bai!gxW-+C47VZ?%~_0}_?O|VxTb{G z6K#>aNyH!t|2|%pc9rBK;g{h3J>j-e-#FgbUC_tFTPH0sU{)NVb(HdGWr3a1E_IC4 z?zx6uk@O$Fa{vIUR6*~V6|rTYE=nx-!`5VMJ{N4KVe>iWp<;RHqJgO zL!ox`bqWH_iM(3fV-ks^38_XorpV(?cHtW0?&GO%2$k~|qVf*ucI4T264|(`(mMK^ z_>(LpEAoa3R7j)WK=;ML5tl|tpHQeJNNn1Pwiw~_YmtNsu4G8BAVC3zYIdQbIlVQ} zkz`a=mVR)Jzcth&O+8^oh9c22!9oe9?xpNP}G${b&H4u#_RKKi~){%+2pX!65t zD!_^CLd)N*Xz5_)0irTTEB;ViH_}&dn%;mPxu`mcjLP$yi4xpBwbe?>$Gv2#AQZow z=?9Ef>BY*P4v!$?o#PZxwwW>A?HrEo6Ql)EbwE}8%ZWGvlSF?}aR`KWE%2&fuqnqU zm;-l#?4u*wWBR^AH9uSqK?sG4&)^cSxETV+dD$>bd%M*KDKi!rW>idHS#L&veZ?OO zQ7=u*hC!RwVMa3(9h|Mmn@+e0@^^?tY#d6@-)U=)my^{4mp9ic8RI3_^-&>OpgV$0 zVpey!HUFg4gB)H)t4TF-IGn2e2>Hz};|Sy2{n;{_GEG=)L|iYc#rDk9xLPx*e9uBP zz8E3BG)Bt*8x2*lqE78XlWP1ROpEZs3tB9S(3 zJg8LqLXhDejM;F2*+zs7*S#!uxSJvBwpzx-`1ttl3FCW1RdJLPNd4PrEyug#+*Qiu4 z^OSd6K`HG$Q<}QRK63r^5UXUv@TB?ZyedB(8BSZ&#LdruG>^+t^kSv3(>ab|ZVz>1 zN`@-7h)%6V9laz+?`#qR?vVVWBe}6|hA7o|86lY4-1d-|KC7{Ldjd{e_44wf>*?vm zNksaHtgc<5dVK|^5EY+fBzn3QrE_NU6aTYkon+iLSdDo8gA7%Z9;%dGQ6bmQRT%MR zOkZdUefpbqD4oNf;d??=yyNtactmjXWrDoD4a59?3ozRw8uG_w`T6_Hly`JFnsdpx z!4)L-lm}u^KEjEYLiYA=7^W2>$fqnB($g(R66XURbq;TSQc_t-e}ka(_D*=}r$#b( zyOm)d`R_t{)gk#-BZ+VarK2T-ooXyqupFW2+&^l}ii(QCckfOQao7m=N9UtCYFFKu zs*`PA+vcM(H)TvfS4K{t2HZomDnAAXQOy#vkp zS!TEi%=2db9&)^lsEO-BK!Q6df*^LJyT5<6Y!v&wEdK-G!>R_h$W*<WEc(43pfUG=9-kxzd^>AV;kIz#-Zdp_Lz4hYI~ zl#g)=!@Pxz!5jTTk$FWCDJ%9TW(ChsfrK00Am{S`9cP)qa)XC%|?wI z*g@-;p&oS2l>u}^u6KCsK;*eb?sJSm3drw(FZCIo%H6bQIR&A#OKg8;cT%7{)Vx*| zFZu(}Ommf)l$zDZihqF$2W@brBGC$I=rRMB`>WI;hh)lKnLrxkL1y^9hz!58l0BG6 zrR%^XG2q`J4&~gqaied>K-!0g$g#;x#>b;&sEl=UpseGDVa^8&aLU%gl^=z`FXtuT z<7KeQoC{ycrnt@BWG!VR<|o;O58KfAJ3xaD`b(C{*Qsanw)|3`+INm`}=tYF@Ck>?^bDg}eVLpffh~v6DzsmOg(9khR)MPf| z^c{xzT?{Bhj9Q77=`imXH0SG>zMgxJU4MUC?-*WxQU9zNA z-=^x~k*S#q9|9rzr~Xi%^c#nAYgt3*hSAmZbFQv4F@5>7eb~q#568Kx_!G#3=suhg zB)N{YEm@1kPdpa%FMd!Q{ud#LbG(eJ-#XjnDDjW%j#n3-;JlvZz3S?ja8N3%sfe)2 z{Q6Fq6tml8`u<8yyg|L|nLu63X^kbiX$u-ZIH83zYRsZ~#ZLQ>yt28bxppVdgsoV_ z99PaejOh2&$6UbnD>P?6u(&M^Q|N+W+HeNqL>S~y|4D9j{ zRP~Fhc!S1OW{2-j_x5G)Kc3DFb&fO2!G+y_F>U4_N!~Z!WzAwov;|xI99>3xeJ;P4 zX~ZCe+>t9U5Xc4h7$2oxa}0Wk$wkrX`Ig2G&mzenDEf=sT0X^FlO65E*pgd8bMru} zc(j#qh={$(@l8nM#_wz-d%S|ie#hiZ^`XPh@BcyAH^n$jSKw1Muo=CJ%Fg}*9rg#z z>VNeTD|-*fv3Uw(c!M+MRk?OCFYg9bdnSP7=^5L7Cbmc@eEf>(F6_FU2`hTj+kdw_!MXEOk|oxMnhj6AKy%VVwGSyqdY&8V za5nwpt`vl#n8S$6u-%GQsqVf$;}``Sc-lZ_l^J`v>A zTWhN~z)G8FHzR6Qe>3Qer{{V#C5(7gjrr)&J~;!h_C~v+JJG)2n&GW87`*fouGqi}w^8tC*Tb!A8izcu2*TfiJ zD)k-yefvjGSM`mW_`wY~!{)5NsoFMAdow0Lqcl}hKFNE{s1=z}LCBg`T5;|i?#^_5 zyCu8ewAZ_z!Uj4%sdQBa*ZJ^r3gfT&Q5L_muqsy3Cx#0+Gl81A2GQzoEhQO4CO&)s z_CH%_U1eRBU8!0sJ;@irD~w*m58X;+u)m`ueA4sTMG@o|;2uiTFu9wf$Q0kmv$!Wt zc$@@({KTvui#-#l!r+A%%i%a+F>>ol$ z_hAedsO)?F$?0V7W0^#`8D7dZ+DKCqZC#OWP4cAu=-@Kzz+xNvPZ!ZDN?((<*INlz z^g32(Vampdx|K;kk*aym_`&5SscAVz3OYnH_PM-8GBlhmjUfBFE3Q3ypGH+!xj|Ym z$$3(<9BF`p=|o%R^d+r`1FVJd5Y8@NzAVGro8@X^+k-#e>chT8q%DRB5mWiEdc?!QB4Y+JrA!i=?$C(ATYbvLMCj%K44dT5n<>@q=x zC4Wekl7|$ea8pZECnMHHVBm3BvRh>?tsbj>1_JHLVdkS2>hMySEClT&VGN^A#D!TR zIodA%_B}>(^6-$YX9Vw+y-#C$;%!zs{=b=?LL6)Vn<_oX5^1F|h%gXed9zOh2Mj&$e!hWQb za4M6>)M1N}%}}^N^~R}y+Dl$~>FmH5egnhiRh+31%e{}z?-;{oNXV+jfw;uPH4CH_ z|FxUcup&ry^C;3>mE)|36#PzqN09G<;X(*6z964l7p+2o27?o6Zq!B=`Ux&^3b)D9 z++41Z17@u1<4?BXms9w<*XF5K4-FkAek`?6$jvs$(Nx(;snsg4A5aGl%P-5j0jd|M zVb`T~#vZ%ROdS0dt+ER8quUyyPEvYXtK1`}A05fx3|YYQxz?ikH;e$OicXMld9tjU z*t08w>=6Ot8r~`kUA-0~`RAnh=t`t-(%vq=ei6A213r}%N;1^!`6Ggyu&9xY>X9ba zQ2j~kxRCj3;+-pGO^)wRq3Y_sV0Td(x99caLPSUBWcfMD#cJf7JES_-9?2368F==v zVDxNhzb7Hr-iz5FbBD`8E?HNTm%+5I@{-D9A?#VG15LJqCZX3M(>_2YImW9wwV(1cV;D;fh>I^ND??g*a?8_9;r6_cR=rMJ<;LM>IdZNK$nbb7&#TCa zQV4piMXRJj9qcp>dVboY23`vZULGoN8C2~=iL)Z}IVH%oJ>m%RwM!sMp^S4mKk0B4 zBSq^aXpkVKLQuW5LDIgLRecxo;+0S#%X&Ge;&^IU!)5@ytgw({@W4h{a((Xm zsuN&#^4K^Z#-_rIy|}rK%IVW(IR>DB+I(Ev;(6EK9PcI1jFzQvoeP2GF(1S_6F*uf z8YZg+{hg5d7cZHBH|%FszXQ8?mLq2&SjK{>{IVRGjcMG}Z>5NRAj{~~WO?~t5#;62 zCaWr!W@ZVJL}}UKVT4wB0_Odp&{Rp=x}a5_+M7jC!%jSw8EEOejMJa0b+Z_1Sjywq zSKSPq24!l4rR=LG;uK;^p$lWle=k>Wmeq(wf)uM(NXJ&z4MRncBQ^##1HV?XwkYbZ znphQt=X6!(Tx5v8%}sRxYq8Sg>pq-UYys7iukSXIjQe_QE6kAoSdK`*r@5a&ot{)e+Y>+~Ar$}EmiWZCl?$4v(3$D+ufy<#X zcwhU<gfHA`EoN3)@egLGy@tE7-NXH_@D>mRGGmzQCRlW_{F z7DyshyIfigSAp*?wv^SpU#)R^0cC79wA~pTH)IHuC)|a|e)~6R5RrF@_ZWS=DnoLJ z3$Wxah3M0v&k)rx2J%5x*E;7qBUBAIKp|+-S=Qb`*CYu6yl`P6^R`vt8M4$@m0F2^Vi*-nWQu zkD6x}?lk{oks*5{$Yzl0z0r`F9;z9PoC`)?_xuYE9;u0A(xed0T}fWGtxK zP1cY?-3zCNu>f-k8PeQY*3Ljl9|W+((A+A2R>(UH-5O*`La-JgImAX)9J37>L+;Y= zfmdOLBAxR*H6#-1%5h3a=Q@vk>N@VO(vt?yw;cjy=`gU<0~}w=O({&}Jx8bM2=a#_ z8A@M%wIsi+%vt6jS|Ik3&5@2p2vLqw=wK@_pKeph)A}MDdfcEY`~u43o&9W^J0Jtn zgjd(f%{p_h{P&5gf{_`f45dz~5#*cFHieVjM}}8ODJ5Et?EMQsy+RHqC~Ge)0Re20 zHd-^Jbqeb6MXCbmUApKYMu8w8eC!mJNq1m6EsG$(1PAr9dajm{HoolY(9jJT4R5T~ z#7=)o6}M|R=CI7gS3y1ga6XWqFxL&C4#T#GKtN@h%q^knuEK9nf zQ9EEyngO`hxVgN(F;f*gK@|^+0|*cGvdkx>AeDOo>D~VhJ#uB`y6GFz5q3hwVGEut zrg*NZ-gp410A1HWC6QFR(PxD8!RwPZgvXr0UbO1%+6 za+Muq&wF5qvNcDBaXVz`&b3ggLi4XkH&vSNd3nhdcK|jA5B;f0m7~ z2}X!u!Bvd)>$j;LEz{ARf{9e=t}xzSB#rK-1J%j%!-dh!=Yg{?Uk ztRRj)eIg5jN4KC=64t?ZKgjJY*$N>)M0<5Ve}ry(GwUh$^Ib zLb~>@vJAC<#zUGeMC@lRbOoR#T$hJFIjp2%ar`bJPlXZkLhz>6U@40GX?N?OkS`+ z_gUo{G~{fNASm~(W`9u?4yYnYL04)o>&Kc1TI~vpmLkg)=i}tw{dolW=(mmJ z4}}2D6Ee8QY(uLoe++neApBSyqrx+|7ygaua~^~Rn$*-(hLJQMM?v3RcKHiV)6~Sb z_aI)>`KsJv6ONAT{nKo8vyI&UyGnuSTErFo4!8{flP*ehF>GXB;h=e${_ zjM9*0zz*18MmMq|^|3^Rj{AkbV*8vIb#G3T!3{;r1ey?3hI#sZj&-LkM)tln8_k!u z!BIe?6D$@x+do;3pCZeXlm|&vh2p>642#V__SsM|FdB5pzd&uY585nj(if}#cWGZ^;yP=QxZu1* z&ioPxYe*w~Wrx3Dh0JtN&`owaVK#cM`EyW^Ui%BK9UJ^u9YPDF5Q{70Tw4RHDxX%NKxuCY(e=*6F3u%w5{YTI;duFp34-aotniz z+m?KWqYz^0W1zcH3r9Y*U0(O2Y(XhzV7ohNWn!+Hgaw5jWML(KPU6)9Ck&jRd;0*~ zsT{RCU>>C5T8iM&K^`M*fr+!%p@o_LNj)Br2t0uFjwd%(r-BG_6%lbO)j!V7GCgj> zbC42Wk~V7}F_JYAX`q@Rsv~_!SPYv(bqiR$j;z#G+L`yP?xTkfv4S0{)DyqdY*VR` zg9*vb_CVGXbq>PzN9$gPR=K$XaVwK^TtiM0z{11k+$Jsm+n*RsfPyXWrkkPn$4OwT_e)a*ho^xhSdRZoy1nqt5>;{W9>4>rk$`TdXsu&|NaaJD997wg;yM8ZCtm`>bh)iCY+=B zA2R+&8vnnsk!8x9@P7+uMzRwV69+pOKBy+olFnmbk%Rfw%JC8jvLDQ2{U-$PXDNAg zn=nLSGnZYD8I62Ze>Z4kRve7lFof0)dO9q)P&vyn$SLI)kHQugIP$Rf6S6Hvnig=5 zOwmWZ#=hzp!`0s#D&^G;O1H0tL8>0&neq|yajIgb(0=B|UkdMh9}O|!B;X1PLWS-e zDn#pzK9ux#y{`9V@IE2}KD{)vwPqyJL z6KvFJ)fcb#-alO1O~w_e8JG0Qm~z&6Un5ArbN4Blto6D6c7 z8Kt%fWfR_NT8mXXz8D?4!20^K8-Cy;KRF&-o89-f z&OGWLu2xBwNVdaZ5eMfEW+Qv2_{(=9V0Wlkj;8;9=b!T@GwXX{ZfJjgo#__i7`?&}ogFBG`Qb{u)!a#=pZtdbDzQbn3O$ zk)r6U|GY3}ExdO@M&$R>A+GEDb144WR*6nlBbw2qA%^RatE>+_e?)2c@INQ);-Aw{EofT`PR@g^h1|vM34Tizi_^ITC2ttCjr2qQ4c^jSJcNo7 z85OXj2BG3mBspuK{CuG^3CEuFJXBsh&g;BH)n+F1e?QZheq2I+E2IZghDDZXn?Rt6 zGBcB&gqW#APH#KQxf!q@G4?jbyHlnLGW-UEmHX+Mn8BFi4(;lP`0Ne>7}#{&qZFPy z{YYny!w{oCi7UKp++Sy|T1-zTgt-(9!3iWG-O{#LMCghRtTz;`Z}#ncG#;Rc8@yu*cBbSXDTitQSR_>HRNxLJvW9y8-ko5Xc?vX17Z5J_Gl<{jnp^LQY!qqb@ zpV+Z0uBBb28~2(=7-scYwy{fJf7YcZU4 z8fZL*Ck#$1vMQQwsHH>37wz@L84_JjVl;Z0aVD zV`>lL*m0#yV{bY!GL2S|qd{`f zhk0(JO8>u;?`bhtA^RGZHXs@Rj3%Vdt-B2_B`4zHTH74epwDPbT%& zCAJmtNKLy<*rF4WLgD(oQl-ZKh~^~v$HDep6m)%%%nTTIySXXDlCaO+U8|%x;Koi` z^WnjXj(UstO^)`-sfpI}BJAVab+JQfhGGnj7Bj9qq^;Xv6Ii&o*g<^X!!E);S-rcB{qnH;thHTuo4)^=P->Y% z)+lXjmQM!ep0y>tlGkFrw7DqAB8uV4C}Ie(gU7LU$)$?2+0L^o&Twccw8Llq(y}@KdcenwMjlW%v6S>ZkG5VKS!P6>bf{NncSaHgY~3uM zam_BvYCoJ;_P0C|%^GH^xp$r0?2q$upVTg?Oz;HPknx4L;()p89FPmy;b*o9_Rq++ z5<&e#_3Di04_;~k$8>jRg_lOYICxQg%jNO=9K7JEO{FDx*mUcFsYZOTeRc; z`^kT(^aMn1a)$=H6r~O=-t&0 zYoeQt|0ud!m>u5c{|uP~4n2E6IRdZ<*FV5wC%)cQf1hh#&CDW2wPRVjwW{KGBhNB} zQzzfAuk=YQsdS?Uio<52eF$s8Zz5K3<)anc)l|=zJo${7<*YQlB=`8pMH*GjrmCs?^TLpnRrQK*PcV4c*xC(8H`^md0IN2e%pJdk!vM1%ctpeY%LFO7Yv)2ezk0zi6caJ>Zd)AdrcInJ+owW zUVa_Gj(xpL!o0M$I^+I(1KU%SGr3f+IE#_qWfwWxGyi(Lx(G87|1t5KbU;!^*#9k$ zAI{(gIZHZqZ34MB>dlAKpFeOJzn<2dIewjsDSO>^&|Pp-o#0LIA+fKJ8tc^4U+Gcx zTsbL2Nu;4e%AEcd>!^x_41uRR<%}1avn`ctpP&}}O(M)S@!9EqEpxhcFSlq#-;wlX zh}%eyXOs1?2P2gk_cJQI*ln<{MijT6QL%5Z)CY}qFeOnU4xFpAO)hJG?U?nirp-^Z zIA*_@ODvmXwpvNFZd-l$re;faxW50vME#NyDW}4kO^(H#B2^Pswcdn`Nok=6L2|{( zEKB#+d(Ir|;RY#5|6E~d~+BQexE&PiurhlI38`vjy;_PCMSt!Oc$^^^?m-+hF8_ledmT9HJ4yrjG$feB~F z6`M#!i(_cro3JfuuNzPBgS%{+?^&Al(u(R0-suIkrqT3mn3|Ym-kF-jOo5|Nl!l`r z!b^tzumF%%Or{$4r{=7U-%1os^YP0M;7A8fa1e{=x@d_zZxA`*6HLC2m#qF5HaU*B zg=&-fi2Z>htc^5DU}88)GFI=DETkB1+`OnH=9NdVQTsrFs{?!45wftfr)#)R$+4{e z9PRb?*@0y8djd%$>GIeV_8wXix4)MAPGaOa{yh@sb&&b6&_#4)g+~^_lWuQKHg;lBQL8=DzW~$=fx5|ygc({xX>Zlr-@A= zd*-gwj4r9%MOh;xcqn;Oeqtv`m}%p?1Fjb^*hv_6m(_lIrt%mMy>fghpBveynVaPNKyT8b8vv^c#v5@oHmA;xJHT%r*bLUkv`MbCaSij zk+OHg`gK+pot}Y5TvU8K`?ta491~KT_A9OC-)Rm6B{F-wb~yzJEJB92CN;i})O|&} zB)Tq=0C}Ci;Go04GoEGw9JzIC|9D-+(>rX~yLU1Z=`Mxjf0Ai!gelXIwSv4BJJOpm z^LzHqP+#*=O={a#n~`4Srdaj6?pfVhHf_Dl88qj&lP@Y-_OtxU1=xNOE`!U9dm(v| zX-J*uN;7?!g?yl)y{|ubraz}r;y-%^KL4{TPNYh9HoW?IY)3CWFf{a5uxKpsK=)jY%>=|>5 zmy|buCJ#_%n}NOzv19D{)$f*FjH$f?F#eO7aA~5W<|%V^4k1yX#5!*$E<=| z6G@=JhW=}+V)z`6BnMg7sSNuH74cif#EjQ0+bi2~(kOkFwm9#Z?lhKjbQ(U!)YTzS zs!RIR705U~QdIL`V{(GFm!kQou(d=J+f`)BgxsimwSv)vPhwa?f;a3??pentMaPf9 z2Kr|NRXj+ZVJHZK4^8Qw))F z%8c0&*HOf!I}f{#csjF0v5!kT+In~sgVF7#(duII2E38QNbM=*rteV5hB%!Fs@G@0 zr*cVwxNMD3u5x>TGb|~le1C*qi5CBoX*&{Ny-|9gr|Kw% zIoCG{CW{#BG_V~8v8t4H{Q4GNTUo`95-po0z0F!yU`(yC>I&-_U`(fboBNvk7ZvpI zem*)<#BTBq8+XXyhNg`lF&{QARTeOEcV{m{wZNWGCsj1({2Zz4RvKbE(m_U>>eijR zAx+@eoY{h=WO83gKkbfVBlAW_lEt=}ZtV^~2SekxV}C9T+Q87Fs*8Wmwhi4z-@ZFC z=IFifO+%KXexM=q`TgT?HuXH`agXl$+HNh8T>vpkQ@n2T9VJfcgJ4EQ=FTTd|KGGQ zb55F?JM}h;4w0^EbCtg;HG>cJ3>O(P+KQT4EBv!wX_f3KF|=uGnv5ccE-Lryb}SO% z(z(2FwZp>~SNYZ3h&XgO;ahwewj*O$x{h-kLoHnaB!wMIugh0uRFu{wW0t$|vzQLx zdqk4S6%_Ej+EgnFB292jzzL@8I0ud|Y@sDNc|`vOF(&4P1hVx;9x1Z4S?$B!!_WbQ z)t)=hWl2Y}PFd%jGd0-;a9BbKW%N1gwv)D{)5;P{_Y;!Ka=7};<^{(1@)&M>)EXAvp zE!voz#3`d(=SyC~&UWQ+#*2#MeiVtGVlF-G%6;E8^n9RFJgIrbXL{;nO+}p4dJnP| zE=lLE(*ESqAn(6Gw6z}DT%W2pFT^vQ`_(0=f}%gU3E0pRM)eAi+9hnI_)ojM0IQod zp~&~rh7lnmweEiiQ3Vbj*&p7W?c*nc z!u5!O(3-@!_G_i2tkRx8G^8Ay44>^%vN>WXK1sUbu@htX&V*Hx5YObr8ipyLT8@7n ztq?xmhJ0O4d!M(c(;vS{XaA*)>4Mm;&HEpg6clX5erPfr&ktKeFYCFXe`9u*T{$DX zTDcuPM42*NG%UG0Qz@B(Q^0kGvME-F4Z>;J*v|;eE#v0YlrXzHLc6~8+SsfsvK>Ev z%WrTbCu}12d*V62W;Z3W#ha!DR=AzUca&y>eG;i&wrwJV%$a~golt$WLg#H-RXjP0 zNUQxb_`w=ACvTt-%}25O{l9e z58ZARdT^$)@n|+Sf+f!nO|40ha%`v=L^Jh^i`v&$q}CdfOZhJ}iFldMx>w zTZUan+VdE{xCMs`-VgY^*DLT~ZG7~qoU?X&Vu=|X?}UxMd1rLrC*=%P;$el%L;Evo zeu2*uUD2(NzsTBBeRWCgeKbCCe7(+*vUh~2!*|Ar)2$|STA5g9F-!=DBk z&)s$v*iyQDY7HsZIn3O}id}rg;PNR*h+b(;Mj061AFQ|`gbqM%U@qexsnR@S+LnE1 zz-r`4+yh* zCLCi$mvQnl1oha&mQ6JM5`2fin$cqB;5zNo;LuJ?JQp0rs5{6Gs$mW>5iM~o68B^& zlRrG{5q*R5RwljACsc0zEH7kfbCl?Enx*8%WW;ZZj3am-T4A~?bZ9T9qI7(q%;Z^T znT^1!;3%uJ(P7|Kls@zD^acur!eFoIZ+{#=o^$dvi>IBVT{w9RitMvL=I z%eXwB>wH!fv)>d)P^XC6t+TfNRx23QqtW3z5eD~WXSEnvm8arJqTznTG%{WDz)ZhF^fmRQe@b7tBH zC6%+1NOIM$vPgRR8X8~V@tof zKEXZOBda1#GB(Y8(iM8cEvamJ(vqz>s}X&Q#b$O*CO18$!bj86>@2zCrxiWdVs4IC zoQZbgR}3aI`s#5*Gdn7e)cS}t#c`7ASq?D~%CAhyixdM%)c(v!zn_~*T3)2vJ$^#S z711`bPt5jJxXr%z?TjDq8XkSwL9cMdo@*g@=F`MmUv>FEBaXKg@bs`(s0y}9;7>3= zEx<>RIMcJ|Pf1fx!M2d%#YPj?1}kTaU2V$BHoCwz$d$j#BHs0UF0a63T6pt$3SD=Z z*Sh|n@PwhrvLu>Dfk|>vE!`hSN<3u|ew;HEI7lYOaiVXMdYE><30wV_*!e^D797_< zpl&pI_}UXuL4D~#AJ1eey`H#3O zbCl9QJIwdb?;mk8_+kCz=OtSq;L`Sl*B>h%OS%}4_dZk3ZqH)PxOoSB5d>Y0Hl z!PXE%=5PQ+jg_(tYTHw2rVm>O8>HQT$D_RJ*HcV4h-K^6I$MhJ1xcZf`wBwdTRjzu zXNpZze)5LHfTKLhqC18Qo@GFJ#Qxc?P_V&KVz*()MbeN`SeL?XSd4Y*PCnAn1*!9G9x9JeGOz!s)weg`xkJ88de~+nYTt0lRa)uU>@pn z$}Up9ns}!boftgZ2tztL(pYq^fz8uUACAKdMlS^l)*1%K@wB zo~7KHTsPMSW=;pkctOL;ErsuSR(}^Y?#`&^a#BFEcC_B+v{yDx!Xd)FH`7Yn{y(L@_i#AG!&nj zTx|tkj(DC_6NPt;rQN6VB=<25Mb9@g9y?MNl^YT)2h@9y1+2+gU7(6YYs3&>p#YMN zPca4#*VP($vzy7w45Ck2G%qKOtMQvHMsiE5Q^2FXQ`Tr(?;jj>OI%k+dF5k=xG<0uITi@2ZMV6^u4HhZ*b;i9A9!%ZU4!(Y#z~$~?6> zs;sy#z9RG|uL)g|$55wDdG7I-+Y1Jj`SZ0vH-Qa|_I_LA!P*(~NHXJ4mNC0=BLF+@ z;zg=pKt@<*{jPRSDlrpxBAsbeqv&^wSzTD4yo~gk=Pe;d5^)21G=Z>}OCz=-$<&|; z(NOv=p89WAu9rsAPucMG3a)9S)h(cg(r7cDj-b}1$slfl!_Z_Lp-mLn+T(0KHCuym zxr)Yjgr54Np(|A^e4uTiQzYnJm$gmg8Li4Mq^~V0u8;F8z2TPZkE2&?s`csfDCLGi zlkXPuB5o_?hMUsqb3+qrmeKiey5N|?0- z+-c7>2DE$!3Xr_0xTce;NIE1(!uS2G!-s>GA{gqqIt_k^v=Gj zcigM1nzju;TiSIp`8bQMG zO#cnJHTplm0!c(){#xBX72Rm7s5Bmb@;Ik3^fA*d$`>bEYe~fYVR4q{4T4C7O`N5LXbgG@zvuH0A1UuFt>n@9WK>%%ES8(&4=I z#-p%J>kEM+tFh$J8=kZ^)KhDt^!oMc3SRK8YS=H?A;6uC{p)O#0E^AAhPpqDHgaZJ z*hUR_fjQn0=lLRq)RpN(aD}5(RIi5m{b>xtB7EAkPnRplurWA(Vr#w!s5%>Q6OmuK zi8=s_?!)#4_+*|NO@(TF(RQ?L(gCZ^XP2nf5(a$~+C}AtOo4C*J-1%0=&}f)n0abo z>14$68bx%dC5EMBCn6YyrUjXBksQ(nrLF$n($4qAmM3;)<)-}T<4Tsi!NSZ5?`0SH z6eXNs1Eg)oR)h_f^LGH^;C#_s0f65N)h%uBPA&-0+mK{IBCp=4M zY$$P^F7+1O$0=q&*!LBdGToG|W;qmri^Pyi)3&UvvyCQgWsXs`pT~66dq^CiHeJTI zTt8%yJ$2=ATdCO#{u*|3$xAmH-|8tb*DbStb4~g9WK#8HM_j?d<=Atb!lKNXgl+T+ z@o_7Wi^U(&&r_V+M7u;j7W7bqL1ET(9D%o8cyr|xxL`9JH?$7=-JUeG1^wt zzXkM~16eOD%p$ct!kV-R(smNg&@y3S6Y zrqnP)J&`{F`Cbj;x<7eGs9=P?ukX7J-NMjxPKWx4)Z9*(CmSeLL>Y=)8!JBJeJQ#Yh=h^pOnQ{a4ha%csf9{RX6 zAxl$lN91He)^rq0Z~Szoz`!no#%^&H5OLLR83DDp=EOT9z56eUgaMkA=EAMqn6>oj zd#}pJ@32*Rk5%9~-PwZ8!qUmj(M98%L&r_Qi}ZB!EM7igTS~OUTMERsb%FIaN!R*s zg2T4i&k`kxIs`!1t^cA6+6u*+7*wxSKzdX!JTma*Bhr0^G}t7Vq=@Et^uYtLGh;4q zpC3SO%HKXVoKZGwA!Hem^JGhq_#jDW4tA!6U7PC)bnv`A`V0l{K>q;S-N? zQ?6D|;Yw;MCywxEHRwS?dFe? z{j_8-I(T?tcIYy-2NC3L|1sg&lra+`d>NdctA%Gebe?_meRXByp95EQ`ysQ>hT)(? zT|4z$KlmiChUuv-?(!A+W4%Z{VuGXC8E;f_Df7PuSohi5xtc2)5P5kOo1o;+c>ScTmcKUH$2ebVIvIk}YT3<6F0)3#wa4KrB$%vs} za^s8P(HN#aY%rbRtWc4(RDS3L0yX z$&>W{W~O*3*m}ANKNH+$8dfm44WBS8?Eq?5^pXN2Pg#^!%)WU(yjgf|V=}sAq9vg( zi9d}|6`xoqm|hsYO2jo@Y=oy9JW;Y3(af0JB?6%uc3UKtmGx(vs8D=|1g~JZaGtr; z=@ugZjb0*(anomyEvapP>-3J*z`k&$Q*_REjMF zq5T=nnd$D~iARkjCnPm2s^A0L(Pp|fdM22k-b8Sm4o=Yb=PS&Vh>qbs%?}z*GG?(v z_NLjPj<$>ocv923JEHW*;ll!Gs;5827?*PIir3VClRaakQ>cQS4|F+nbT1%Vj!+qM!noT@5cfS=)hvJB6I5a$X;G$CMs_$nu-rNRD_dfFacH$O zc2slhi5=DQJT}=A-yd70mmAfzqeuG*us7Ng7XSn;l6TEM03BX3bR-!^q~e)_C5qPDvGO^dTrhR7 zQJV@25E0E=0Q8YOjU6;<9o-mQ*9*F#R5AttGJv}kX!unH?;0b0$wp_LY+S1769!}$ zItmG_cr-h))AA&CDwXZ_>6$Wy8Y#^VAbJYhhSNY73!pkK06glO{+mpxT~P_Jie+Tb z$_9burMy{(Jod=zsfS3$vy^*9HTK*kTguBM-u0k?q-9{Bn;jJ})&FsY6nVHWUo8_* z+_957;@fICQEHsrCuA6Jjtroo3b+MF8Z-CZ=Qe)@3)Ra%Jof{zT&-{Q3t%xHy(+n| z0(24*&sO+Xj_@F$gy*+V$Ra4ya&WDIrcZZzjwAVBnf=h`=?V`!pQjgr2pdNIpwBCBNwxZaK;l=44;mZe9p+)_Rd zzHSgSd=lKn)2F$&5h!S71}gdz53nckGuNhF9n6I3NFwNim30dWaTR$;9?2sEMh(C< z%kJ_Ot<)Y&!xTIIGu5tOF#~0RfR%8i!%rApFPFVe>>Myfzc1gZZskTy3;*YISAoKduI;w6EA-s6Bg{y7it?K^kE!Tm!?DIA)+j@ zD{bz2C8r1|?S0H!Q2D18UJGGm9Bu0J=RoRSxk=Y{w#MB29M_#|NSqBEnp#00JX?G+ z1$?~^GnC+vj#)~Zdi>cwVNp21aub|jM$}Q5VDL*Ft zK-smmJNE1z$0^F^onhdpm=lZ^(vh67E}fVWKCi_5#!CmeFzyxttSXf?KM`YEuIvDs5dIyi z`6fSIAhZ6s2KQX4s=ey8_^s448#2-r^_$Ofs>#m5p1IAV$MAEnmzpY3O*A5AlIXXi zzZ#oUc2zO5WDT>tp(wFA^dWVEC9jkX0s^5qxNaFb??J4m^vE{!P=1YcoXAF-t=#NX z=&@~jW3=LzL({qP+!H%biDKIUTsTT`rUiZm=TJh?3VIV4BU{-h6UbauhCq+4U(ZD0 zZ{HeU%1g%ok>vWbp61)V%01TzdjHP{Omc5aya=)e#wqaV9&4~zC2C2IO=FmQ8}>r% ztudtYVLNKSVt@6({xWw~Hr8;kd){N3w*k6>MP}d~t{v4~zkC3_Fq zApi6LjFfrYHwz7X^ySJ&NbCVE%A_fuYY!)LrCbg3G~Lf#OFSNP;b}wa9(3C)D(|-j z#)wDhF&5~Q-lOZV!mQSwY+egi!vr(h<2z}H2A(^R3>g|vaowrjC`mS=jn71zh0okY z;@_*_%K#Ei*)^Li_^?wwuUm&XUtHd+KP`n$-idYwZe{bj3*NgV2ghcs+D?sk1mjy+ z$Iblq7w2ghI+HCSqL;k*jN zQ;%!m)(RbgfTaZ~tGnNkMp;+SA#B#h^Lvb%%BD5kA6dxg8q~2ccbQvQC0pO)`0~oQ zp($K2u~HA9Qv8|1a*P9+TOBP}%9~2&WY@uERd=Of>(CAw)4d&1Wj&3UfWArIe#ub^ zAd*XK1!e8(w22HA?U_w~_aGHD4NL5(&zCAAOsB7l^1(nJ%#%oZb|BvRLlL(d;NZ^z zp~C2qHua{CBzO%P6(e(vVOm@&d5W|@CMGd5VQ44yA$G&@W8z$phgQtVSj*P@VspR6 z>fZqFuU`Zx>L!j;D5-pPRJX!GeKs3&Rt`vDHb52kuK5nMGF8}hkOVtc3BZH3h^fw% zz)a3fse}oNxg6w|2=yOS2W3V3&n^IiiGa3`9!nZUJ!{#{hWA|*hotP8d%JWDbR!7{ z;R2&8*rwNkHeifKb_dh-ewGXbMU2`8ku`*sATN~Cgp~K00s919gSVebRi>6!J@?Ws z;=(}%+IJ6;xPkVNGH)M;Pp%QNGxXF z@`>2i_d2Fc6j;eaXOV|PqwD&=(k*`$^8w|MnE?bSr9bf*e-AK!zxIP#1P4H8$mePS z)q;U_DxS9Euwn^@1BCjT$r!=%xa&QG8#Sgm3v92s zLa4)7N8Uhj3XU;|L@??!x?2Yv!1>nSg3e7MWNy;8u|DqjMMTD3^0DY0Y{d4a>XVJU zJ(7A5Q~Z-S@YSm-guq3GOu&UhtUWOby6Kh4NG6p(r1i|6w3xV3U94b6_Nb#OMJ0DS zb($L6t4@Nhc&(PQ5&C1-`LYSh3j92GX>k$Er#qi@6HH6FD>V-fFO2*`RJ$~E$}%Wm zY!ms)Ehq|ZM=kF`J5L%R?ph+EW}y#6ZSSM2(NPu@0Vb#%cnjzm?1e{d0U(|c-qnzsHpX}Ys}(|E_&6S67JV#U6IIw6;{tqD zRh+1`JX#>!3uYsM!7xS;V8zwL1@k>x=d?!KN;1IB;BVY?cx&n_D z0ZL~{{s;(~?zQqi-7ecDal(W4cfw_@RS!=nWcG_obpL@wvn3z8V^rM)gAy_99#?>C zkgCW4t&z5>AX85^syL-gCGN#hcP-|GAp-=8U*MZn5`xEa1FJb*f>a~6_$r6(5TZRp zWDBpMY2LwwXVG_wee_F;$o3n#;LjQ`#odNIehyT((-Jp7?Bnszc2OxM7pix?{LGLj z_?qy&T$Xxy`-jhS|zXCD2975(!t73Li>A~e2Q0(Z4hInd308WB!_ZxKs@Udd!~dN^^p?hvva~J;RhO^ zn1L}x!Z>lt2lq7hBVT;;F8kY!YL+&CB_#ju-GE4-2m5I;QDEMY@pGS3tZQ!jEV^IACKRd&<2_H zOCIzo^BsVA%9;SUF^Fu%QyGO^;4Y+{5UB~m7{_+T=o!#x`8TB>mwM9L@u03K8-Guw z3r}JJcWPl9KYU;XTikC*Xc1WZZ8QuhAo4@D^4 zR088u6g?XO+I#td{NKL{n8J9tj^~b;BEoIfQ(meD*MT`e&TDqHywWWX1T8V0>OKNj zq__5S5e#SDDuF!S5eb2;2ih=H`@T*jhkQGja)#s1Br^Jkn|`A zLG~`dTtovV4B+|zo%!!y2wW1jL5cmd@z0fkpF11&De6C*2R+y!SZxW|l#BmGd{BvC zQk#!E+dBi&94!4=()4vf|E}afaQG_!Q4QIBV;B<IvAP6zZ^v z>*v(mW^fq@NT4c>xY6KAmMRlZf@pqls_j?snWiN=^JLH(>+fLsx9WaHqMk$!XE?3cHuc=dJ#Mj%dUbiu2=P`4?J((vP!-8{VH^A^I(9`bUy(67_TqO@Y zMJ0iv5k1Z;8$4~t%4^AoOv1p#G7g13PNLwC3S@kN{KLpRpcxY!KCoi&%D&T*w;9YU&;oa(g-M{jNs%hknXM!q<(TNNjN0u4==hz;Tsa;>awtsaZ{>U8uiFf_o z0sEH8{I@MqB>5D#>tCh+k7V!vzVIJBYDK{N|KXORU#~P$^!o)mpxCBy`l?_q60}7b z84^UFo4hIjvlT(>^o3U7m69---B)(#w308N#6CpxT1m8(nwpyMT(+#2O;EJ@|1w@8 zYSo$S8U>sbFhAxCu8%iJfRE)Bdrn!(Gtr2}pE#TG(l8DGJ9@*|z4I<$Sh7C~;2LEgo_w7xqWOXxF^0y&WpAg=t==tFjcP5U z^@lH~gPwd(;E3@zpUK?;C3&(DUstw74FNj$p6-%l&xeL|qo5DxKc&o{AEUuR-(f|^ zlH4GH<-9PZoVH!Dh})pbyQm6qPS;{y+y{-j%<}hJ#PQ>3h!0DhrxgV>fIY=~EFY6k z=*kx__&syi^nfGHaU46e2mk2H@MM6uWvA?%jUJD}_s8sApu2XkuTijS2|Ek$zf}Um z>kCX5p2-FU1}N4#jBAOzah@L=)Q7{BPUMSu3|GZ)TB6j$73BL!ptP>2|3P-ZV+&z| z!<)&~iE&^a!sIqQJ@iI=19^u<9CQcM`&M8~3@vg_NKa9s?wa-`W@3b zJhP(NJb@(db2DN-SlSG}3H%i0#mp$n`-PVf)kPmiz%#6!?pmv8y`nGtR2A-@t8KCB z!%*#BHkb?@DAm~eWuA7!E|G(L*plEW`|O%Mv>9ZPuYA?`p!ya2BR<|gO7TzdWANZV z^5(1V9Q@x)e>xKXzupazJW${ngF5p0Rgzre^=O=t-twBa;a1k~%H0pffB)Tq_&x8o zET3um&c^1zxwmJ}RQ%xRDQT^>K9Jh{Q^W2zzl=L<(cjT`rsDW@`)4tdyd!G-_L9#f zo>2r!acE2)Hz7DQBqW3wGS&BJZ8bvQ9pTQ{3zmsmcqU zx>{Q-i24P*5tMkZ)?`=Qz^wThlyptqXjpni8GHr!IdqV_*)=urppC_X7oMvm3q}@# zH-eTLhvPAvpGC(Wf@kQ|(bTwXzU50_qzyl$2D;l&e^>{eA}fe$zj3Iq^r!fs+KO$M;{d{utH6Q4ec2rioikZI*sq{gZ?&tOK(!M-(NR zki3DObg6Nj#bxuYKq0O{%(i8=%BUilAcm%T{m4vtjI_K=F@WCJa-L%ujYCMgSWWj9 zTu%6=G6iNn+|QFHwNJyLY4mkfFCtAmMYl3@OxaQUc?6C{Z8+O=S{(a+i-;g*#mHDj z(JytNPq?5ob$;l>D45$k_3@grI!4diGOQF?a470W1|tOlMe2nH+VXQ@21y&uvOw@cK2!kW6zJcu~7b(LQ;^~XE3ItN+1 zLvFTwt#p;-Vh7OoB|3_itNSKP$^;mm>ENXeH^Kb4GQ4aAO}qz$7p?V&31UYyU4F|C ziN~n3A|&nVtjf6a+eK%;v!;q`3k*1!qd4nF75tKEM1#ia7Z!2}12JQWe@whKO|I(qUS+f@ep!+*deBhKTY77 z3nF-)mcaN79s0u}QN?Ks@3Hu+Uk?bk3-jVRm3s8OCPA%Qk%j2!cR1FbEnlBVRp;>J zZ`8cEF5(UMih27}O7Xw@A}H#}W1T8M%J}s*ixCC~+2u6ZXmDgsyrOul-0a9bBaw|N zrkC#-#tAB(?u!Z(=W8uEqyEj*nmTO!>D5|9M&gOZzo*Pdo#xf-GQ##fxapb<(7uby zG}#2*x`*+h0wAre3Rk}jis@G}@~GkmLJoIKxz@jA7MMlpErU1$F40sqIm0R;OL9dS z^Kk@-qTCos&u9%X-j^sA$Zil6TeQah3N*hr3X}zJ4wLa{L`AHG3gEoU&9sV8L3C~g z#+If0&G5E5*T;^xFN6*`c&1@Wyx)X5CQ~w;RoU7@y2g`p#`GSRPfqr&E{|w>6qttiX33lbt7wvgR(n=rPllNxd|Mwwy-u zqM^%JUcGI+X)I?mdskebCNn*Hy&6YjnOYR}*0O*L^LcDzkq}O9))ovXLHCH#=@%c% z0?f-HdPvHGi>JQb_^>xi9PT0W1jA{liyv-5$&07I(;gdvTuju7{Aq2P-Cn&{Go)cttUi8~A_xcH$ow&l!A<-RQ9iu^+T zKuBxG+=PRC0@970u4Yptq)u0q<#0*8Xfhy4ne$_E@LV5ox7<}=VM4+ZsHqLA7z7Rl`%h3DN%I9Dg)%biHu6-`IdF{YBz+Y{4Pd0TS{S94^BS_RwH3CGCqRl zlWd(R8wGDg)8YmJ6_H3SEg`Yteo~aAHH<3Gz};9?ohR+# zN_(cxK9MUlz-P0Uide1p+30I!ON9OtaV$RkJGVS**Ga;mGgstHBD>x{D|7^Zo@ujun`F8H{bBF^<|B~_gK{?S_J z0n(!-nZZ<8mNtD`6SgpjWb9WGo7WeS;eMBvDcb*M9e)Z*znen$j>pJtN3VWhW-+U_ysKLFZjHpxn_NqQl1P7973y&0XhdLlfiZi5MSMI9l61 z-CJ3|h)f1Ty^kDPW3Q(MKY=qx=6SUizBt*M>E)Z>H`1yeIk7m-Jiu@4HX zYy4jBh^1N$!3#p4NP@oH@$y5c82I8-d^5rw_7T@-mx_9B+2123VuEsn#COe{z{-%h zHrUj4V5dyp0_^NJBBZon{n)D+3%B{6he=7Y$@xTgC2XAa)2A!Y2?nCVQrZlT79NoN zbUp7!59bKhnG;dgyt^t%7=jR45=#aDqxv&h^-GQ*xNGyA2r3s1Lc zf7_%RicN|;U9kScE3;tIltzrF>4UBu!n7@F#3l39G04Pyl$T5x14o{Zr7|UlyYELd z6Co{ba9?Ed(?ng;#dZ@Y39IHM=ovJDAyE|kkA=Pvd)+0?`{njTv}86d%~6k{oY|Lh zmjBAnnC-J6<-VIqJ#ZY%59zE%CBX?1P1WLHSod@HyTx&^lg%k*GAt^%Q2$nWcWUWH#eyOEc1zQsA} zS6}4FdZbV%{``lk&AZ77_+nHDKFB0FYSk2+VANpD|%eZg*}zubYEE$SI6A|&(l4ZG4~>d6`E6gQ=#gIQ14 z!~BpBTU6RLZTOvj-f%ICdGm?KF99}pgZq9r3^NvJ53TS!@c3LLzP87_-=9y_JU&Q_ zLG}G=9LDcyS4X(PU&A(Z+o3cFXs3ept$s*Cen|RJUJ70FlR>xEj_}7^fh$OYBpj>~j~!x_Yk$VmO-_Nl8JZ>7#Gd@b(*t9;5sP zyVv}EkNc2GF1miXV&)7i{%87g<_TOJLB@L3n^9`dfzw@Z8gMNK$ggSQfZQ^2Ul;#G zw$X<*&VG&$NhM4wjDtkS4OTv?D}kV=RC(+D=pSGXM@CP-V#c;Ot2#jHNkdPPRwBc? zJD8CTbA(c0S)&qNwtNVFsq5%@e;M+fb`ePqK~J2(VMw;Om`rq{jP-D|*hob3I?X>` z)#VYRVqOBPK*o}~I-jmz0$&)!pJD!SZGQ?Xn4(Ydt6z#RVPEnMhArgo>?Z zdhbVynOD1H^RYR;GX(-nvj_$O&`~`A3TI|&kxOO zM!P844rb-#8DHzFIU9KRQEax$Tfb4{a8DYV#dJ~f25)u~+-pxR3)6s?_Xdwp+L<}l0i#U1$XbphmD)?$Ce+YXWKsr2VFZ56F%fmV^3V~bztbz) z7q*eBS)WdK>W(=sS=Q1u&h?i8v-yEXj+p6>YrfY}2|uv= ze2d2+DzhTXbiUsgIl5rC>3;|gY}a!5R^5knWia=zqJt!`YRCfb#A9jt+jSS8f>iw$ z^y2{15Q)@gd|(GgJyP=(Son3< z3p0p;0TE_r8L@BYD7WBImKi)VN8Ck1=>gQ7({o(>DRp++3|OT3A;{iX0?yUGT~C*^ z$PGy|MCzB2u%liL8CyCx!Lz6H+mp{~|2hcVz#M)YaA+0b)WMD}{`)F1bZ6@kf4RbW z9nvy;4UB3m3HBVBw9=20*?MdgquWB;2~t3;E2*07wu05jg~Xkrx~v(>{kadhBb8#} zI!RLyJicMQRQ@*3;!?9BZ!#Z_{+84B)6z*DmyClp#f1Myw3*j^ZyvbF6B(DT! zgG(l!*2E*q4nfw&+P5z{fSM0JigZU&naJqJr3nW6exsxY7Duc#smn=#oqU{xEZu%r z?HMt6?CJVcKTebW0o2MtWVoXr(9W&akgIB5{DbFfK(~_lyCk%FI};8lW%=tzVd$kK zp(b0d*rL%^(nX}|g}PE0=)g)aY~JFU4UA_C!TXvh|I}&IWLz7}l@Xf*`_8o1g^RO2 z(-%Zn<1x$6={)HGA2)F>e;?H_Y>SAb@amSrUZRj((|XW1Ckf;8%M+V=D_xEUL_~Vk zy*en<^S2t&af%^aTGiCxTCD>uGV1H7Pe(RfAOJ;wU^F$i&wmL_6>+N)e(X<6 zB^riNnR)ugBy4$~2E2YpQ|C_^S3a#hFt!%G!|#Bfc2!#9Y6*69?#$#3Or|1OHF>){K;Z-K!xCxdxjNT88b?xzQyW@6!CDduHJr+ad1y`@&8r1)PPn zLf+lLkQg73qvEQ*#_3rQEcQ$dx(iKTP^SA#dpIV(DVPKP;wlzptS5p{xmS6?o6G+= zrGi7$-}g}m+sqE2N)#?#C~E$Tq(bWp8NcvDP_3r}D_ibvCv73E^{_j10~3THVW0cA zpdI~?U*z;|9U0EHG$u{zs>Pr%NPiSXlRfywCAkU&iF9UNhKi*h$L~rBsU*Ya=+XA6 zu!nF)<0cZx1H?;YWs8}Ql?2XOFR;VsOAt2$%f?(u0=bizzCMFeru)nKmFEW7;=X>pfKQu{e2l{1w0XH zY(PiLec&cAN#T+?(of+G^XVM(*-r)KZ%FB2O-v6A;U^;)m#>yt=9Ar=h)E!Imiy=} z*s$`iFxvB?a?~QXB$vx@FMBf`o&(1(Ol$H)cNkyhxVanVo1eJyECgIkLJQ>(q{jVH z>+kynPM5SF*^pd*c|2Nd2y`;#IW>4*G*;f6?{3Qo+Tq9BQ_~RJ0*goHzCP1D({(yk zAo@u%pTg8K%^Yw$4snSkRr6uqaFrvG2N5Vs`|d+4qU2IG?GxxgU3wum?u4m|y(6S( z@@_i5v^jmPrar+On}+UuFjJI?jjpRSj{c!YiAL!*;^EtTXUYgFs+>+fge z+aH10k*>O+5QI{|O=HeBneJi@nQvDdc&G)O?yg0K(mTLpVk$vOY=L}HJcM?=$k^dk zHwogCN~apTVpCjlV9RgVOHWrt5l9{=4?{nd=!~iI^sZUGO_E5K%EITEW97e*l%vP5 zbxa>cVo(98f-f7g)31M9;#(E@vG=o7_HxWwerpY|)hOp`E9eN&YT>6>ceCm}z^`no z37pJDz{oWFT_LP{t?-2F_1ni*n4jX}f(XW|^&f=Boi|ol@a9iI1w?2SaY4ze?r z$^Kp8{q?crkuO5h3qv5)2Bo`Vpy|Ak(?BB|le~|h+xr6bEs}Lm&Ys^92s?FoexpWD za>c)Jt6|nu_ywDSUu%oH18K4m00OfIaswKfy&>k(BhqD=^*i8ai)&7&4+VNG(7j+& z(KpIE-$Dy5-RYeNBC%HAqY7@ z+9vn(^1!pT)EVsd=aB;_1K_m|yODo-~Yjq?)WGvF3z|lmLHJu>~AU2t|U>mxg5t*IV#$iY-DP*E^ zxvxt9P0kx_fnASZ#Hxw6=-Y5p-j#+hQapy|rgV`)&W8`2mNr7BKY)l<$AWpDP*yV& zybA=WL5YKPHJ(VR+l?>^`4tS(mGIT{xOs-o@JAysM1W zd;eq#DVe;E@V~dh8gB6AXkiadmZC~`_;a}-3(bXs->1q27JH;Xi zlBg#wZeO(yJbO=3;>v!fEhZB)8O$IM(l?y^Lz-^>Ax%K#bipD~EfETv*l2SQF{*hU z#1Dznmns2a?@`MagNVp=>HJJeL_z$n@bibH0WIvR4bBDYmPe%oC3S5=3Q-AG2qH7u zFNok{T_t*T5-8ZAbrQX$ijb9?zc2tYzJ!FW%?%~7SNdgyy-auCHlb!JS^__aP=(Kp zv`m*jC-zk~8^cQdwV$f3o`t0h9|iiprw%v>|K}`qc0o$F=hfj^_0zCccy{sR{KF&& zPY2we3Sc7Q4M|u?#0_H*LH)5%ChR~l`O9%mx6S$?KX{>9t@d;GBWwBY*~ms_<#5vV zVTx;BGqXmM-JvNWB~+}VUCMm-YvVG6Fuo8XAi}sXgF2E6rkUQZm!&Ft*wSTomY?4W zf-d%rKzr5M$PUlqzG{in?>hAIzn}5y)DaR9i()Ydzt&P_us&cD2n{MU%aXcE(u>S^ z@0nb-B=;Eo?OkbpD)dt&M{kt2A`B_LAw&uZIR)#QGZw+0Zl8ekzRcXPT~v7uY~^1H zwpOygwu^VWaG7hBH7YxJYzE{T_SYJ?cT9OCA8D`8;OlDBr~PjqKC7pjqD3epG1t?x z_IMqSIEqXK*&*ymS?D`-bEma+NpN;B*5{^4dtvAESgT}o!dj_UUU19VyD_7b&bviq zs%S$KIuEoPRp&chx)IULy2PLHrW|K2ObyIkn=(*_YP#$cdH5G4FAbqYizMUX8Lr>o zz@Q3Ck73T8k?=^2M{upNG*hPgc2cGH=wRv8vx&$-{G*w-R?3hP^Pz+VZmqXHQ|3aF z8!|Pl_(2a>^*5nAH*NM;LzH-<=JFJVD$HpFCyk=GX$Of|4C3|Pnv7*9OEW}zlrHyGOUg%dhN2Z|d2bAAerD+}5&N6z zyn4$-|0U#{=h%&HZSydd-S&Os*NyyPR>)pb^^)dN0;yhV_YnjS-+ax$<4uQGmDD|) ziL6Xwsgq3G2e6KZigTE1!2_$#S#eEsm|B|3E3pfX#{tYEu5>*}ufI6^?Rpw%kg8{x zW53v?bw`Xk;zB4d3)U}~U~ zFYIYWrWlAOuUB=cT^{4U_K(M?6!6f(1@7hmpH~H$v;{9N{Q003eyM?@p!gS6-DkQW z2&=7y=$xIa$gwJ43~>4C{RDdGa_o!!03x`!L4ocU{V7qBhjmrEJ?ZhGmHMF<%*K<$ zYB)V=5yP@o!h)%2za$mA-5?DU^waF+QV@=O+^qoVkN=s0M6V{gZFD1l*0b2=_bvdp zNaLIh*HnGgtRkINrm#9Wz?1wPy~2I#zdW+%k1Mg}DO0u7_>b_YxpOHNamstN{-7WH z=kfwHTPJF%8??sGCiQh@_Bp&-cFy(>&cJ_e-sHVGGm8{Xt<5gBeV;=`GFbB$0z{m! z5Q-iC0`D1vl72y^)xrfYzW;{P{Ergx|H9{p;>=40v|)YYj+*^yni?51Jv@srv0%c7 zW?K@>u85Auys(hW@hoG+zKx1@38H3z;Jf}Ab^=&R5KcE;uLZ}92Bk#xd;l|sLOD_F zQoTI9pJ&ecRAtD#B7Zv~Oo^FGqP-7{k#=VXZL3$4noqcbax`Cu@KCz`;GM zE_RjVGFGHzDbg~E&Zzlh12u^P?Sq@3i(eE9ffvCWd5@n5RCb!QS7g5+^v1Waigj(- z3Zcn$&=J;E;&asQyW((jXEVEczN$*P!?6)d3Na(mF!|zAxWjq=M)b0xyDCLC+-kFd z*5~`#!f6hGfz0;rvpyNsXzv-^AHn>TfC)P4fEie$LRY=o5a$g9mp%wu&Kpb95t4K? zZ4Iw}TEM^z?QxA%$!##Q5JXQ`GomNKa(bjYr%{1X-ARIeq33MhG}ZNZDSQlsg`0VL zGQA7{{~^Ms62M1ud7q7fTkTE zZs$$h-%MoKTFyG&Q+~1Xn@m@$*CMmzUN}j@3zvFITg3}()BaT|ZOzz{je@%7Wj76* z&@R7J&p(h-eR*>$~l051uoT@p+vW`#oLA4Mw=|oJSD$}N?Zo0k5VzLLr+Af;xYgFO&uOo)nB~@$2{_=75 zPb_P$7Fsr(`NFK~jHl=YNX(QZUM^a`Hi8T9vW+~+^ZCAE{RIf*_&UyUL+Ei_Ls+Hz z-WxWT?P3_m0Z99{nz_tdI4#dYRyH-LsMIG%xN6n|>Q%D6x@4f_ao6-PBW7M~6m3y6 zQ3$1MU*>u4(;7+r&J>J%mMDkGBnkwvFC1DY)l)tlwE`QYmnTXq>e)YEQ7i;5^C4qy zy|-D+_|lm1`mE+;OxzeW1p^I#sTA;iDSx%(>i&9{9{c+nJ_T5w(fHGlS!$2e$&;!n zZO|-mAh-KYr!6JHmYIDIlA=4=LqBV>H&J+DI)7Xlcaf>^Rafkj?RtD*j{>=-OI+7U z2GFPhX;wp+>?bf)v2Beccwo=mJX^NgpC3fb7e-J;3&KA2h9K`_tvl_JCYNG{9dlRB4A8a{y}A5;H%25giL)N) zhCl6SPg?yMqL?)oYrFBPgKTTqyS9r5<)c2@z(#`(hxt9-a} z1Q&;d#`T$JvFoN8@;Qc)x^Wd9NM8R1hp4Xqe60J`Gp{D%U(GRo+&YwiaI()-zjFH7 zUV28vRZPjH@&TstRd2$hp81=`8Cm9{CFZHn+%gD{;G0d-mq>b7b2L4fp3}AW!~=e- zBzkx&&IcxFiL>^Jj53O)M6vFGejihBHe1)~u+jo!4g=U-I3!I3kFsAL-4%ryEX7Wh z;Ya({7kydk)>NooPZ0_%#7wjYi%7y>6YkkcwVd|fth!nv!tQv__^nSiRKxcWm`s-q zzXc(S>+I2Tm%S$I;;gBzR8hK7`2`#5L_7mRZ!bHx$vN75Y_~2Vdw#hOx4dd{!!iY5z z-jog3Ud$ttTOvT{8Z}1QfS&ZvKFo)dYxAfe8fr~i_%`L6c1JraMGBh_&6dr`qZ-TM z22&epAyIt+P_z!Cyhh6IvN7EGG3VspnPkmGp4%B7+aP+SExtcP(xA( zp_g!*32HhN-B$`L2he@gNkU+Hc5b4xHFa6gFi9Zmp<=T4FD2PF4SBakH`C*oBObs2 zq(U{`&-PHgZ)zgUyu^Hjd=?TEV1F7@zbEfqPSH-04MuuTWA+}JXKpk!4@e2rP4}J7 z}o5=GuHjp!gAf1RPUQ$Is>-J*FdtD_w z!fq9Ae_>8hSP21Lizn$_ow^lQXmB;1?`D#sG6<4wYpTyBU`Q`mk)xcDPq`|bEh3MV z5|0S;peNIgxuh2=ocHVxB7wM#nxZCYZb6HII#fR81bDF1sM{y#X05+j-x7P}`x>rvyV4@tAFx z(h^ZV7U_XR+x-4Bw9R&b9ePln^~u1B{UjASlq3(;TZ}L%l1O@XHk0w$Q)iQeX!Sdtjl}1xIx8nx4Fe0ypbn6c#QP6e66Gj ztLuit=-bXO>&6@-kxF7K4Me0xh?&$B%&&%<7M=goXw=m5GomYZ6~NUSn~3S$(%nyD zOSaV4Ss)RXK#mQ(I_jqqe~7HFb-&<2!evH$f@N#ftLsz^A|19qNjy%uGIHX_1dMsg zs@$!j$sGQ~-J;62&cX=&^&q-^yXI{$+3fM2c`J*dL;;Hw(fm{Atg<-Ia0)=6^&MXD zH|fcH7P*=9b#>V_*cW_&8aLkl%Oz0Hoy_$irP!Yg5p28chJw3k2qi@#HZqr75 zpr%q_LQk0!4=mRvRBE27Qyum_i+ZEIf18K^FyW0Hn98SMV4^qNW_onnCMMB#MvO>5 zyV4??v#c(})`%EUR^9gif-&i9fB*N)6am0RJ{B*jS$0M^y-V3c(Fih|CLhw*i+$Bq zbAU0whR~3Cn^C^k_4vjauWHx}9jjiaPtElDiaB`-yZn7r-P^c770E4IQWrnd zmgYq96#LAW~S6{$0{p@yIjv^uM1$k2#~0#u@n-@(Cj&;z^O zZ(LpQqwTjOukmn#p9H$yUR6t^=AHbz(Ti;vUgs=aB_z*eeY(vqj-v_GUMSAurb4H> z4G@Tm^>v3*Fy`KNqFtTUD@)W<1)o19oIfBaFe!gqCdktV8co?Bxm9mS4_Uz4da^DS(M+jeJw)27d3>X zcCHuSSDG?U>3_rF*i3ad1B5zy-b3dpNZj)8m?F@O83=cwe#FKgCS8RT_N)V2zav{r}pC z#@BYZ!UY-cO#>3V->jN2`>gMKffo1M-CLOC@tej!7OtOp)we5jg@{!^KMi-_s+o&W zSdH%`{EoXSoUI}cHS<-FPSL|w&&UCH#%$zJqulV4!!ji>NY61qNn!#Q1EdB{U%G0^ zd*jIum`q&5Qq@c|kZ(+;NWv-LJQcJgC zuY10MN98Kt3)#umw!B8Xzg{A;RHlj2i9OGbweHCiCVrj*2Zq{Q(p#4ajuD&{CYxFC zi^D33sCot#HrNr)EXxZK_jFir0Qm<#^!?L6agrge=noFGi@KChNrl1XbgsVk(8v#l z+v#})yn~-$PmQPU{+R2n%yK;c72dMw8rPvR7p$qF6(W%1^2hm>;~U>S9^C z%Eo5n@)GUyE$=qRke$YKY@Ui*sfGJP8*MS>v6tq>Yc zaI-FhrXT)DR4(BUU zN0&LzwgXcHKQ7rAwd%WO!97DU{W3HE4UF4-?U=wqT)jq7!xn~xrf}@TjL1We>+o}_ zxxgf@mWmowQrNnz6MJaLfcp)s8-d$1S4m*reyV`{a0RM-elQnHs94WUk+>^ewFe0C zJc((Naj>tAwJ24f&m3z&mQFRal8B4<0|faGm%?_|W=A3`pb_Igx3qb6(AlRwJ4U@x z-PXwD=kme|7u*Fn!Q&wU<~%29ySo~RcHee?FfFV#o&J9FtVo|koCa&z-ekxmuaWFt z4ou#yxaY81Q_v(|-*>L2QLYYk!=W$aZPY|mo$rb&tu$maNkgfEpT6xxo4BHN?MK)Z z$QOo`63{s8t$H@pIlUV7%mIgJIwHVfyjg=15udqH0!!h)v5X_~gb6G|QDMX@m>K^E zY{agbPmvj#Y^R5C+$H<&?~&a=(Quhm&jR1gsmj0nbqh43-#O44RK1k#5AaWy5)Y{# zdDR(RY_D=TlesoV9f9yhC4)}Eq8T{d>Ckh7TWWjuse!l*lQcLB{vZ)qpNvbq6Wyed zIIHs4AZ_hoE}?lcp!sS*k(j;Njtsj~H%*?HCavc+Rl>XhL_5fdOet3^HzQ1xZkfVL zR2mqRyc$*<|1DdpL$v62hoBgYPG_{dEuVVWY9O+y`I#12;#Qw{#-3~XD;^BeU{`tv z)={!7qrV@t#EXIeL!x(O=iTac3NdgjGP`c*-ABSFsNCbd`(2Ue2)s_sJ0GT|g@~T+ zZ8JmO6PyNNn0;#CFc2PAlWoZN$kagOie@*ZU~~PFUs0`qj?qV;Zx<~T|LF_4*CNxS zQ?=!b@B3`hATNR^#jn@5U|WoqXYRGFOrBv6+DtYlZX=v7-`-ZII>^y3Z%qXTG~51O zV6zz#7^V)-=2R`j$KzBPa4gLUS>#DQDh6Zh+6c>0g7KT&vVD>J?I*0MqT^M}iY*9R zWDgJrsX%tr!W|^IF1mw2)cVofk53Af>LR!RBDLxSY>0QiDh+ZBIl`bBTs*4BqO!i!5wS`3qF*L zf%D95xNx{uJ%H?z?H#yEyfYj zOL30#4_iT+sdzAx;i!a__(C$mSZc2Txuv%yb1C4AVP0wjHYUxx(yQJ}NuT?2yfg&VyZgW@!d(5RZ$f)VQWD)rjXm(?ab;vZ?RLn^bbW zkzA#wx0&6h^wnB6R8sZgYb4oJa-$YP5Ha#a=_MUdpBNZ$(U~K4MzYvodC99JS1+yF zsteV8-XOSDyyQ6{>|FxpOQK;jc%^i|`*JXtN8&jz%4C}*7m_A#vg=f&@akVQxM8Q% zHpN_>3!sPssB^-5=KaEF!%3Kz@AIafXVWX!3V=f$VeP-9<_^HYuT!};%vAJYE?g=6 z03*wcNvcn?Ry``XcN#q^R*Uj-Z#-o~jSrH{^ljKFS_lG~Ka%-o_YniH2&$X_>K5fB zq{=$DZcEUUkbv#%z`%CxMy>X(Xzl@m5oQSp7JQ`Je@wziLP;M(4*vv#%TIU8ecyEX zE@ysn(*R8J&DRVb4&t}6){Fx0*z6W*z`gQ8R~8|aXmlNbYJ?UQki(M9j03MJDAL;E zV}(EP8+!qseN~uIJs$~z5PA=f39Mt6So58aHWz|LeFtJwv)WjI4ydo@cuJaF``m4j z*;Yd<0Re!i&bs5QgoTq4UJ%ieK`m3~9C+7*og&mquLIN;Pc6i6twolyVI#(YQDA_U zy8org4@58R*-CVcQ0cp;yQIo9V`vx4En0R`HCV-?(T2Cn+e1*A*&Rzc>z8DuiBNwB zX3dtf7c;r7u=r(I17&cjXTQYZXP9iak9P`vbzFOemtY7zp zb+t7E0Hb*gD*opCzFu3foZoo?RD@j+2d> zWn!hM6mS|vx(zXTqW-m?3#wKNSP zGY**9em%FE-N6_qfnMdd90H?y;)95lt={Y`j7PoLWw^!vZ4j(yxOzXoW; z@-R=QU9SPD)9sqz*aBi=!dZRR%VZ#GcB(b_jKAohQxKPy{PdlwmI-Oq)+`+=NyrWFhw>-r?T(72m9k6i8WR^Sw zdP?0)^{D_@&CY-+9G6A zbB6_fTv~pDAb-e_W|vmgK_K^7g#k3}VQWEKP*@iFDE}F!99IlqceJw*MP;C{?6523mAts15;`nI(k&*rCEY$=#ZTX*En;vSNB>+(ok}jG&7lfPi>I#tNfLkhbJXXbHhX{5ye!m8 zL}^>pqnOTNA|46{LT=BF0r$&m?=EW#+}kY4s1Yk^0nR>|XG?RY5_4x0;3+)!<(SEb z0sX%g6WHaPuF#~&G1B1o{6zh7jp8yIh+^WDvC>_|8_9@xnAU=xxHmp5Kg15LMJnr<@!hn=ejq!*`oM6(HBzp42XRx^kqPG0KfaRBut4oxyQa$jt)8Q zc|3tEQWhR9Gkr=RJNx*`iyo^wYCd#SCyCP=*Tq>nuCMp(HVCPXqkF@rO|tjnaNosU zd4rDWZ|f+fN?fyXRsjKZQux)fa&~+lOZxm`Iut>_OOpPLtE+*t!7(Wt0s)v%0r>KM`ta#xQ&w2r{_M-POut9 zeixEyzqTq2R6siYq0A^vQTBL)G1H4ZXg;%=dLr1Gugt}gFp5bK1Vxgh8QK#b40EjA zt|Ki~>ock1tntIJ%CS2;F7LJrhrbWb8PA&J&M+?2uGI{qIt^0DW*6kY@3dg_Vrde+5T-3AM`O}!TZ(#~I0kT?O1@n-|a z!HQe(dkSZ>?@MH&QA6P!(e1df_?dcVvEW&0m&fuuHj**v^9x>VslV6#3C;QXZjC_d zu7-BrP~~d(ms(qr8&|aKn}(`S;=ivoY7j(uHrVzSSVrt~dlRS0^Y{s|rZD7opOL7+ zy|cOiC33BmdA;+K+%fGtwaKcvYov0&1XjskI5b&Q?Oq3*bZrf=!ZMh^WnsUwsCfRI zWrsvz1$rvMVDI1y$6t%8;ww>FiK0~v8lu6xK@{*GMfT*~&{x7xaIpC?>1F_fSuCtR zOQriux&up!4@+_t|HZ2;X>Ba2ocwPREwLr|n(+!{Bn&p#qx!1@dgvXXWYz<64_B-c zInY?+XYuYprhtu2UI``}%;{D-l%h#UNl=d>Q?$qEgRg)rOtcpps5(4?w!mPO75V}| zccN~@CPh7L#u4-*U?m8!TdDg9xNzhcfaQ-CECXW=9@2tuTvY!v%0tSXL%18#!zlPe zLY;WK5a>GrScwCwAs8)2lti=vL1&IwO*B^QUynfIOG! zdIwL%yM6ei&e!@Ogi~Q=2~PLr=hy0Z3VYu?`$Rw5^uO+}f-XBM_r(-x(l6-&4&S_5 zsyG&@0cWc=_`X+IvO^R6!*h)8`AzVl9-4`n{}BAV>F_k5HC7A{e3l96hns(iPAZL{dov{Ytoq^s=9Sqz@0 V%NfG5ZtC5-@1Ff$CA*HN{s!nsTTcK0 literal 0 HcmV?d00001 diff --git a/static/51_PowerOn NDA 2025.pdf b/static/51_PowerOn NDA 2025.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1af40e6421812482e11cb9676788365ae855c27d GIT binary patch literal 39612 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�f5}ug7O3CVzWHnf;Wj_yEE%qz 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�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 literal 0 HcmV?d00001 diff --git a/static/52_email_preview.html b/static/52_email_preview.html new file mode 100644 index 00000000..cd1c4ae6 --- /dev/null +++ b/static/52_email_preview.html @@ -0,0 +1,42 @@ + + + + + + Email Preview: Anfrage zur Terminverschiebung und Dokumente im Anhang + + + + + + + \ No newline at end of file diff --git a/static/53_email_template.json b/static/53_email_template.json new file mode 100644 index 00000000..d47ed786 --- /dev/null +++ b/static/53_email_template.json @@ -0,0 +1,6 @@ +{ + "recipient": "peter.muster@domain.com", + "subject": "Anfrage zur Terminverschiebung und Dokumente im Anhang", + "plainBody": "Sehr geehrter Herr Muster,\n\nich hoffe, diese Nachricht trifft Sie wohl. Ich schreibe Ihnen, um zu fragen, ob es m\u00f6glich w\u00e4re, unseren Termin von 10 Uhr auf Freitag zu verschieben. Anbei finden Sie die relevanten Dokumente.\n\nVielen Dank f\u00fcr Ihre Flexibilit\u00e4t und Unterst\u00fctzung.\n\nMit freundlichen Gr\u00fc\u00dfen,\n\n[Ihr Name]", + "htmlBody": "

Sehr geehrter Herr Muster,

ich hoffe, diese Nachricht trifft Sie wohl. Ich schreibe Ihnen, um zu fragen, ob es m\u00f6glich w\u00e4re, unseren Termin von 10 Uhr auf Freitag zu verschieben. Anbei finden Sie die relevanten Dokumente.

Vielen Dank f\u00fcr Ihre Flexibilit\u00e4t und Unterst\u00fctzung.

Mit freundlichen Gr\u00fc\u00dfen,
[Ihr Name]

" +} \ No newline at end of file