commit 7dd17df0cdee78c261271ad2340c9420397f3538 Author: manusdlai <manusdlai@gmail.com> Date: Wed Feb 12 17:38:06 2025 +0530 first commit diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0a3f0d8 --- /dev/null +++ b/.env.example @@ -0,0 +1,51 @@ +# Agent X/Twitter account credentials +X_USERNAME = +X_PASSWORD = +X_PHONE_OR_USERNAME = + +# X +X_API_OFFICIAL=False # set to true to use the official X API +X_ENABLED=False # set to true to post to x + +# Agents +# set to STOP: to stop scheduler when all posts are posted +# set to AUTO: to auto generate new content when all posts are posted +# set to LOOP: to loop through all posts when at the end +GENERATE_POSTS=STOP + +# Access token for framework features +TWITTER_ACCESS_TOKEN= +TWITTER_ACCESS_TOKEN_SECRET= + +# Twitter API Key - Read and write API resources +TWITTER_API_KEY= +TWITTER_API_KEY_SECRET= +TWITTER_BEARER_TOKEN= + +TWITTER_CLIENT_ID= +TWITTER_CLIENT_SECRET= + +# Client ID and Secret for Twitter API +CLIENT_ID= +CLIENT_SECRET= + +# Github +GITHUB_NAME= +GITHUB_PAT= +GITHUB_TOKEN= + +# OpenAI API Key - Read and write API resources +OPENAI_NAME= +OPENAI_API_KEY= + +# Google Gemini API Key - Read and write API resources +GOOGLE_GEMINI_API_KEY= + +# Leonardo AI API Key - Read and write API resources +LEONARDO_API_KEY= + +# Telegram Bot Token - Read and write API resources +TELEGRAM_NAME= +TELEGRAM_USERNAME= +TELEGRAM_BOT_TOKEN= +TELEGRAM_BOT_LINK= \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d7b8678 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual Environment +venv/ +ENV/ + +# IDEs and editors +.idea/ +.vscode/ +*.swp +*.swo +.DS_Store + +# API Keys +.env +dont_share/ + +#working files +to_delete/ + +**state.json +.venv diff --git a/CODE_OF_CONDUCT b/CODE_OF_CONDUCT new file mode 100644 index 0000000..277a974 --- /dev/null +++ b/CODE_OF_CONDUCT @@ -0,0 +1,140 @@ +# Code of Conduct & Contribution Guidelines + +Welcome to our project! We expect all contributors to abide by our **Code of Conduct** (outlined below) and adhere to our **Project Contribution Standards**, which specify how to document code, attribute authors, and write Git commit messages. + +## 1. Our Pledge + +In the interest of fostering an open and welcoming environment, we, as contributors and maintainers, pledge to make participation in our project and our community a harassment-free experience for everyone—regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## 2. Expected Behavior + +- Be kind and courteous to others. +- Respect differing viewpoints and experiences. +- Gracefully accept constructive criticism. +- Give and receive feedback in a positive manner. +- Collaborate and help each other whenever possible. + +## 3. Unacceptable Behavior + +- The use of sexualized language or imagery and unwelcome sexual attention. +- Trolling, insulting or derogatory comments, and personal or political attacks. +- Public or private harassment. +- Publishing others’ private information (e.g., physical or electronic addresses) without explicit permission. +- Other conduct which could reasonably be considered inappropriate. + +## 4. Reporting and Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at `[YOUR CONTACT EMAIL HERE]`. The project team will review and investigate all complaints and respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. + +--- + +# Project Contribution Standards + +In addition to general conduct, our project enforces **coding style**, **docstring conventions**, **author attribution**, and **commit message guidelines** to ensure clarity and consistency. + +## 5. Docstring Style + +We follow the **Google Style Python Docstrings** as documented here: +[https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) + +Please ensure all public functions, classes, and modules include docstrings adhering to this style. + +### 5.1 Module-Level Docstring Format + +When creating a **new module**, please include a docstring at the top with the following structure (update the content as appropriate): + +```python +""" +Module: twitter_connector +========================= + +This module implements the TwitterConnector class for interacting with Twitter APIs. + +Title: Twitter Connector +Summary: Twitter connector implementation. +Authors: + - @TheBlockRhino +Date: 2024-12-31 +Last Updated: 2024-12-31 +URLs: + - https://arai-ai.io + - https://github.com/ARAIDevHub/arai-ai-agents + - https://x.com/TheBlockRhino +""" +``` + +When **modifying an existing module**, add your name to the list of authors, and **update the last updated date**. For example: + +```python +# +# Module: twitter_app_auth +# +# This module implements the TwitterAppAuth class for authenticating with the Twitter API using OAuth 1.0a. +# +# Title: Twitter App Auth +# Summary: Twitter app authentication implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-04 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino +``` + +Please make sure the rest of the comments in the file are also updated to match your changes, and follow the **Google Style** guidelines for any function/class docstrings. + +--- + +## 6. Git Commit Messages + +We encourage **descriptive, consistent commit messages**. Use semantic versioning and tagging where appropriate. For guidelines, see: +[https://www.gitkraken.com/gitkon/semantic-versioning-git-tags](https://www.gitkraken.com/gitkon/semantic-versioning-git-tags) + +### 6.1 Examples + +- **feat:** Introduce a new feature (`feat: add user login flow`) +- **fix:** Bug fix or patch (`fix: handle null pointer in user data`) +- **docs:** Documentation-only changes (`docs: update readme installation steps`) +- **style:** Changes that do not affect meaning (white-space, formatting, etc.) +- **refactor:** Code change that neither fixes a bug nor adds a feature +- **perf:** Code change that improves performance +- **test:** Add or correct tests + +**Example** commit message: + +``` +feat: add advanced prompt chaining for TwitterConnector + +- Created new step_4.py for multi-step Twitter workflow +- Updated docstring for step_3.py with new Authors entry +- Bumped version from 1.2.0 to 1.3.0 +``` + +--- + +## 7. Adding Tags & Versions + +For **major changes** or new releases, we recommend creating a new Git tag using semantic versioning (e.g., `v2.0.0`). Use tags to mark milestones or significant updates, so others can easily reference or roll back to stable states. + +--- + +## 8. Scope + +This Code of Conduct and Contribution Standards apply to: +- All repositories under the `[YOUR_ORG/PROJECT]` umbrella. +- Communication channels such as GitHub issues, pull requests, and social media references. + +## 9. Attribution + +This Code of Conduct is based on the [Contributor Covenant](https://www.contributor-covenant.org), with custom additions to guide documentation practices and commit messages in our project. + +--- + +**Thank you for helping us maintain a welcoming, organized, and productive environment!** + +If you have any questions or concerns about this Code of Conduct or the Contribution Standards, please contact `[YOUR CONTACT EMAIL HERE]`. + +*Happy coding and contributing!* \ No newline at end of file diff --git a/HOW_TO_CONTRIBUTE b/HOW_TO_CONTRIBUTE new file mode 100644 index 0000000..3572fde --- /dev/null +++ b/HOW_TO_CONTRIBUTE @@ -0,0 +1,204 @@ +# How to Contribute + +Welcome to the **ARAI AI Agents** project! We appreciate your interest in contributing. This guide outlines our contribution process, coding conventions, and best practices to ensure a smooth and collaborative experience. + +## Table of Contents + +1. [Code of Conduct](#code-of-conduct) +2. [Getting Started](#getting-started) +3. [Branching & Workflow](#branching--workflow) +4. [Style & Documentation](#style--documentation) + - [Docstring Guidelines](#docstring-guidelines) + - [Author Attribution](#author-attribution) +5. [Commit Messages & Tagging](#commit-messages--tagging) +6. [Testing Your Changes](#testing-your-changes) +7. [Pull Requests](#pull-requests) +8. [Need Help?](#need-help) + +--- + +## 1. Code of Conduct + +Please review our [Code of Conduct](./CODE_OF_CONDUCT.md) before contributing. By participating, you agree to uphold a respectful and inclusive environment for everyone. + +--- + +## 2. Getting Started + +**1. Fork & Clone** +- Fork this repository using the **Fork** button on GitHub. +- Clone your fork locally, for example: + ```bash + git clone https://github.com/<your-username>/arai_ai_agents.git + ``` +- Set up your remote so you can pull changes from the official repo later: + ```bash + git remote add upstream https://github.com/arai-ai/arai_ai_agents.git + ``` + +**2. Create a Virtual Environment** +We recommend using [conda](https://docs.conda.io/en/latest/) or [venv](https://docs.python.org/3/library/venv.html): +```bash +conda create --name arai_ai_agents python=3.11 +conda activate arai_ai_agents +``` + +**3. Install Dependencies** +```bash +pip install -r requirements.txt +``` + +**4. You’re All Set!** +Now you can explore the codebase, run `main.py`, or execute tests to ensure everything is working. + +--- + +## 3. Branching & Workflow + +1. **Create a Branch** + - Use a descriptive name for your branch, for example: + - `feat/new-twitter-connector` + - `fix/spelling-typos` + - `docs/improve-readme` + ```bash + git checkout -b feat/new-twitter-connector + ``` +2. **Make Changes & Commit** + - Keep commits small and focused. + - Write clear commit messages (see [Commit Messages & Tagging](#commit-messages--tagging)). + +3. **Pull & Rebase** (before pushing) + - Keep your branch up-to-date with the main branch: + ```bash + git checkout main + git pull upstream main + git checkout feat/new-twitter-connector + git rebase main + ``` +4. **Push Your Branch** + ```bash + git push origin feat/new-twitter-connector + ``` + +--- + +## 4. Style & Documentation + +### Docstring Guidelines + +We follow **Google Style Python Docstrings**: +[https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) + +- **Module Docstrings** + At the top of each new or updated module, include something like: + ```python + """ + Module: twitter_connector + ========================= + + This module implements the TwitterConnector class for interacting with Twitter APIs. + + Title: Twitter Connector + Summary: Twitter connector implementation. + Authors: + - @TheBlockRhino + Date: 2024-12-31 + Last Updated: 2024-12-31 + URLs: + - https://arai-ai.io + - https://github.com/ARAIDevHub/arai-ai-agents + - https://x.com/TheBlockRhino + """ + ``` + - If you **modify** an existing file, add your name to the **Authors** list and update the **Last Updated** field. + +- **Function & Class Docstrings** + Use the Google-style format for parameters, returns, exceptions, etc. Example: + ```python + def my_function(param1: str, param2: int) -> bool: + """ + Perform an example operation and return a boolean. + + Args: + param1 (str): Description of param1. + param2 (int): Description of param2. + + Returns: + bool: Explanation of the return value. + """ + ``` + +### Author Attribution + +Whenever you add a **substantial** piece of work (new module, major refactor), be sure to: +- Add your handle to the module docstring’s **Authors** list. +- Keep track of changes in the **Last Updated** date. + +--- + +## 5. Commit Messages & Tagging + +We recommend [semantic versioning](https://www.gitkraken.com/gitkon/semantic-versioning-git-tags) and **descriptive commit messages**. + +- **Prefix** your commits with a type, for example: + - `feat:` when you add a new feature + - `fix:` when you fix a bug + - `docs:` for documentation updates + - `test:` for test-related changes + - `refactor:` for code improvements without changing functionality + - `perf:` for performance improvements + - `chore:` for minor tasks like updating `.gitignore` + +**Example**: +``` +feat: add advanced prompt chaining for TwitterConnector + +- Created prompt_chain_v2.py +- Updated docstrings in twitter_connector.py +- Bumped version from 1.2.0 to 1.3.0 +``` + +Use **Git Tags** (`git tag v1.3.0`) for: +- Major releases +- Milestones + +--- + +## 6. Testing Your Changes + +1. **Run Existing Tests** + ```bash + pytest + ``` + or + ```bash + python -m unittest discover tests + ``` +2. **Add New Tests** + - Place new tests in the `tests/` folder, matching your new modules or functionalities. + - Ensure all tests pass before submitting a pull request. + +--- + +## 7. Pull Requests + +1. **Open a Pull Request** in your fork’s **GitHub** page. +2. **Provide a clear description** of what you changed and why. +3. **Reference** any relevant **issues** or user stories (e.g., `Closes #42`). +4. Wait for a **review**. Maintainers may request changes or clarifications. + +**Pro-Tip**: If your PR covers multiple changes, consider splitting it into smaller PRs for easier review. + +--- + +## 8. Need Help? + +- Check the [Issues](https://github.com/arai-ai/arai_ai_agents/issues) or [Discussions](https://github.com/arai-ai/arai_ai_agents/discussions) for open topics. +- Ask questions or clarifications in a GitHub Issue. + +We appreciate your time and effort in making **ARAI AI Agents** even better. Thank you for contributing! + +--- + +*Happy coding!* +*The ARAI AI Agents community* \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d3cc21b --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2025 Equilink-Suite + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e3599b5 --- /dev/null +++ b/README.md @@ -0,0 +1,166 @@ +<p align="center"> + <img src="docs/assets/images/logos/equilink_banner.png" alt="Equilink Logo" width="350"> +</p> + +# Equilink + +Transform your AI workflows with **Equilink** – the intelligent orchestration platform that bridges the gap between different AI models and your applications. Built for developers who need seamless AI integration, Equilink provides a unified framework for managing AI interactions, custom workflows, and automated response systems. + +--- + +> **Core Features** +> 🔄 **Unified AI Interface**: Seamlessly switch between different AI providers without changing your code +> 🎯 **Smart Routing**: Automatically direct queries to the most suitable AI model based on task requirements +> 🔗 **Workflow Builder**: Create complex AI interaction patterns with our visual workflow designer +> 📈 **Performance Analytics**: Track and optimize your AI usage and response quality +> 🛠️ **Developer-First**: Extensive SDK support with detailed documentation and examples + +--- + +## Connect With Us + +- 📘 **Documentation**: [docs.equilink.io](https://docs.equilink.io) + +--- + +<p align="center"> + <img src="docs/assets/gifs/workflow_demo.gif" alt="Equilink Workflow Demo" width="600"> +</p> + +## Getting Started + +```bash +# Install Equilink using pip +pip install equilink + +# Initialize a new project +equilink init my-project + +# Start the development server +equilink serve +``` + +That's it! Visit `http://localhost:3000` to access the Equilink Dashboard. + +--- + +## Key Features + +### AI Model Integration + +Connect to any supported AI provider with a single line of code: + +```python +from equilink import AIManager + +# Initialize with your preferred provider +ai = AIManager(provider="openai") # or "anthropic", "google", etc. + +# Send queries with automatic routing +response = ai.process("Analyze this market data", context_type="financial") +``` + +### Workflow Builder + +Create sophisticated AI workflows using our intuitive builder: + +```python +from equilink import Workflow + +workflow = Workflow("data_analysis") +workflow.add_step("data_cleaning", model="gpt-4") +workflow.add_step("analysis", model="claude-2") +workflow.add_step("visualization", model="gemini-pro") + +# Execute the workflow +results = workflow.run(input_data=your_data) +``` + +### Smart Caching + +Optimize performance and reduce costs with intelligent response caching: + +```python +from equilink import CacheManager + +cache = CacheManager() +cache.enable(ttl="1h") # Cache responses for 1 hour + +# Automatically uses cached responses when available +response = ai.process("What's the weather?", use_cache=True) +``` + +--- + +## Project Structure + +```bash +your-project/ +├─ workflows/ # Custom workflow definitions +├─ models/ # Model configurations and extensions +├─ cache/ # Cache storage and settings +├─ integrations/ # Third-party service integrations +├─ analytics/ # Performance tracking and reporting +├─ config.yaml # Project configuration +└─ main.py # Application entry point +``` + +--- + +## Configuration + +Create a `.env` file in your project root: + +```bash +EQUILINK_API_KEY=your_api_key +AI_PROVIDER_KEYS={ + "openai": "sk-...", + "anthropic": "sk-..." +} +CACHE_STRATEGY="redis" # or "local", "memcached" +``` + +--- + +## Use Cases + +- 🤖 **Chatbots & Virtual Assistants**: Create intelligent conversational agents +- 📊 **Data Analysis**: Automate complex data processing workflows +- 🔍 **Content Moderation**: Deploy AI-powered content filtering +- 📝 **Document Processing**: Extract and analyze information from documents +- 🎯 **Personalization**: Build adaptive user experiences + +--- + +## Getting Help + +- 📚 Check our [Documentation](https://docs.equilink.io) +- 💡 Visit our [Examples Repository](https://github.com/equilink/examples) + +--- + +## Contributing + +Help make Equilink better! We welcome contributions of all sizes: + +1. Fork the repository +2. Create a feature branch +3. Commit your changes +4. Open a pull request + +--- + +## License + +Equilink is available under the MIT License. See [LICENSE](LICENSE) for more information. + +--- + +<p align="center"> + <strong>Ready to transform your AI workflows?</strong><br> + <a href="https://equilink.io/get-started">Get Started</a> • + <a href="https://docs.equilink.io">Documentation</a> • + <a href="https://discord.gg/equilink">Community</a> +</p> + +_Built with 💡 by developers, for developers_ diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..265f50c --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +package-lock.json \ No newline at end of file diff --git a/client/README.md b/client/README.md new file mode 100644 index 0000000..780c92d --- /dev/null +++ b/client/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ["./tsconfig.node.json", "./tsconfig.app.json"], + tsconfigRootDir: import.meta.dirname, + }, + }, +}); +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from "eslint-plugin-react"; + +export default tseslint.config({ + // Set the react version + settings: { react: { version: "18.3" } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs["jsx-runtime"].rules, + }, +}); +``` diff --git a/client/eslint.config.js b/client/eslint.config.js new file mode 100644 index 0000000..79a552e --- /dev/null +++ b/client/eslint.config.js @@ -0,0 +1,28 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { ignores: ["dist"] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ["**/*.{ts,tsx}"], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + "react-hooks": reactHooks, + "react-refresh": reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + }, + }, +); diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..c036454 --- /dev/null +++ b/client/index.html @@ -0,0 +1,14 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <link rel="icon" type="image/svg+xml" href="/logoIcon.png" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> + <title>Equilink</title> + </head> + <body> + <div id="root"></div> + <script type="module" src="/src/main.tsx"></script> + </body> +</html> diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..da584cf --- /dev/null +++ b/client/package.json @@ -0,0 +1,54 @@ +{ + "name": "client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@privy-io/react-auth": "^2.3.0", + "@radix-ui/react-slot": "^1.1.1", + "@react-three/drei": "^9.121.4", + "@react-three/fiber": "^8.17.14", + "@react-three/postprocessing": "^2.19.1", + "@splinetool/react-spline": "^4.0.0", + "@splinetool/runtime": "^1.9.64", + "axios": "^1.7.9", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "framer-motion": "^12.0.11", + "gsap": "^3.12.7", + "lucide-react": "^0.469.0", + "motion": "^12.0.8", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.1.1", + "reactflow": "^11.11.4", + "recharts": "^2.15.1", + "simplex-noise": "^4.0.3", + "styled-components": "^6.1.14", + "tailwind-merge": "^3.0.1", + "three": "^0.173.0", + "three.meshline": "^1.4.0" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.20", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "~5.6.2", + "typescript-eslint": "^8.18.2", + "vite": "^6.0.5" + } +} diff --git a/client/postcss.config.js b/client/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/client/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/client/public/X.svg b/client/public/X.svg new file mode 100644 index 0000000..b0a78f8 --- /dev/null +++ b/client/public/X.svg @@ -0,0 +1,3 @@ +<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M10.7124 7.62177L17.4133 0H15.8254L10.0071 6.61788L5.35992 0H0L7.02738 10.0074L0 18H1.58799L7.73237 11.0113L12.6401 18H18L10.7124 7.62177ZM8.53747 10.0956L7.82546 9.09906L2.16017 1.16971H4.59922L9.17118 7.56895L9.8832 8.56546L15.8262 16.8835H13.3871L8.53747 10.0956Z" fill="black"/> +</svg> diff --git a/client/public/arai-hero-2.jpg b/client/public/arai-hero-2.jpg new file mode 100644 index 0000000..cfe6c73 Binary files /dev/null and b/client/public/arai-hero-2.jpg differ diff --git a/client/public/arai-hero.jpg b/client/public/arai-hero.jpg new file mode 100644 index 0000000..d5220ad Binary files /dev/null and b/client/public/arai-hero.jpg differ diff --git a/client/public/gitbook.svg b/client/public/gitbook.svg new file mode 100644 index 0000000..a89cb60 --- /dev/null +++ b/client/public/gitbook.svg @@ -0,0 +1,9 @@ +<svg width="23" height="22" viewBox="0 0 23 22" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<rect width="23" height="22" fill="url(#pattern0_41_230)"/> +<defs> +<pattern id="pattern0_41_230" patternContentUnits="objectBoundingBox" width="1" height="1"> +<use xlink:href="#image0_41_230" transform="matrix(0.0075 0 0 0.0078125 -0.0160228 0)"/> +</pattern> +<image id="image0_41_230" width="604" height="128" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlwAAACACAYAAADef7fNAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAACQASURBVHgB7Z1LdhPJtob3TomFG7VOUbdlrsFW9W4PM4ISvdsr6N1emRFgRoA8AsMIMK17e1AjKNUIyjWCknkc0/Q56zTgIGXcvSMzhW1kKyMyIh/S/63FY4Fsp0Lx+GM/iQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAFYUJzNnaGuzOiHbn/8A0+fh+MiYAAAAAgAqsveDavDMYMqc/y1DsGUO3Lv8/M50ZMm/IJK8gvgAAAADgw9oKLhVaROaZ/HVY+ovE4iW/HXx8NzkiAAAAAICSrJ3g2hqI23BqDslFaF1CBu04Mfz4w4fJMQEAAAAALGFtBNdgMLj1eZY+M4b3KRRsjqiXHHycTCYEAAAAAHAFayG4Nu9sP2Pm/UUxWmEwI+onryC8AAAAALCIlRZcNk6LzUsyNKDYIL4LAAAAAFewkoIrRJyWNyK8eik/QnwXAAAAAApWSnBFidPyBfFdAAAAAMjp0Ypwe3vwZJaaNyK2htQKeJdS2v/ub9/Tv/75j98JAAAAAGtL5y1ctcZp+YL4LgAAAGCt6azg2hT/IU1FaDURp+WLCq8eP4CbEQAAAFgvOie4NE7r0zR9Io8+oq6C+C4AAABgrehUDFcRpyWK5b+p0/Aup7T33d++30B8FwAAALD6dMLC5dX3sCsgvgsAAABYeVotuDROi2fm0Bh6SCuO9mc0fX4ENyMAAACwerRScBVxWnHb8bQUxHcBAAAAK0frYrg27w72psb8rygPtWpt0NrBuyQWve/+9v0txHcBAAAAq0FrLFwrHaflC+K7AAAAgJWgccFl3Yez9JAM7xFYiHxIb0yfn8LNCAAAAHSTxgTXWsdp+YL4LgAAAKCTNBLD9Z93Bw+/GPN6feO0fMnju77/4R//+ufZMQEAAACgE9Rq4UKcVkAQ3wUAAAB0hloEl7oPP8/SZ8bwPoGwwM0IAAAAtJ7ogmvzzvYzxGnFh9k8N73kBYQXAAAA0D6iCS7rPmTzkgwNCNQD3IwAAABAKwkuuLQdD01FaCFOqzlEeCXET//+bvKGAAAAANA4QbMUb28PnnBq/k/++l8EmuSWIfqf777/fvDdf/zw57/Ozs4IAAAAAI0RxMIFq1bbMSPqJ68Q31UPdj0IvS90a8ZZ7GLP0NnsBlnhi88BgHLYeo2Ux/9Oz4Wn9DV8Yr3XEsame1QWXFuDwe5sZl4jVqvlwM0YlKxwL+1yQrvGpPfY8K6M8aBscggznclrj2UBnhniP+Wfxht9OpY9shZrpI2xdFizHz98Gxdox+ALPaR1QNbPx/eT8eV/tvvfF9qlFpAkdJaKsFdx/+HDpFN1+uwl5QsNOUnvkWFdR7q2bpVZT+fXEiX8u0npeNFn1VUWjY3uNaW+2Ij4krnLbI6Jk5OmxkZrb6Zpub1R53FT59Tm1mCPKrBonzxPJcG1uT34hVJzRKBD8INV2ozqJKsjl/4kYyh/xrHmyoKUjdGMjUl+jfk5bd4dHJExv5R9/cf3J9/sFbll+y9aD8YyBg8u/6PMiVFeW7CNjPWgjT2XfJhfWDj92aT8sLSAcGMsauwV9eSz65C1Z36RSdKfmPhh6Az/QqDWOTabd3Z+o7J7pl5u3p38SDViS1dNzW+G/C5P2Zjyo2XrrE+eyEbzTMTWiEC3YOv6rXUyd5l5Cyrd+Mjsxq6kYhe8WsvI7G/e3ZmIKDqCOxh4MpRDYDifS8QHTYsPvbSoyPo8M3uksaaGYy4pseKaobjb9MC34qvNGdwXxkZDEWRsDIUnF3CdGpuY6MXx08yoIByQDyIQTU8MGSXWVUIeWLFFEFudRNxImaUGXIcKLa0hJ5ufWHB45HvzqYR1+fFIrUibd7dfFrFhADijc8nIZUsOFrFu7lHN6J6TWTnEimAaqcuoAuOlCM+/mnj/14GxaQ4NCeCZ+cM3JEo9Ehs9vl/2EuMsuCC2VoIhgYV8I7TaUrDX8J4VXvJsBIAvufDSA74OAa8/oxAT1IZ9p3j/LRAX54UWYWxqR0OiZlPzh/ceb8yr0/cn913ibp0Elwa+QWyBVUU3wE9622mT0PoGHtkNEdYuUI2htXZFnEf2cpDF+A2pbZwXFzWvJb3U3b67fdgaoXWZ+disrlU9D4k6Im/MwccPb/fIkdKCSwfekI3/AV2Hs7Rh8JXccvtbJ7Jt5RlZbma3twboTQr80bkeQXTp97t9Z8deXKjt1LyW8nihPzrRV1it6jI/MkPLamA9GFvbL30NRxocL789/vj+7Yg8KCW49CF14NEPcUXo0ZiAJbtt7rzumuXWaMAxm0O4GEElVHRNw12ki5iYRmIePalrLakLq0q8UCPIs6bGvF6FfUbFrmYiimDaIx+0tJIGx1dILigluD7P0meos7UqiCkUGW+WeSqw6XItKR7B0gUqMgwxhyrHxDSOuuu3o3hxChdWp8emw6LLWnFn/mUfrFdIxNaHSbX6dksFl5oTO2H+BEthMi98TaGrRtW6K20iu50j8xRUgM0z68nwZGVqMoobLbToWp1Es26KLltuo5JlkccumYjXsbQOV0rmkEC3UXVu+PHp+5MxAcunqRE3YiixxWOm9E9jkmM71n2abBCdXc5e0VtWT9wXsyndyivU77JJ7mX1vSo+AYnZfzC4X7v10sSLByxbabyWZ2EO0wEg1jNWLByqbrVP01Qv1iNyxFbbn4YUW1/XU+8GHc9kLV1eTyoOv8gfxVqSN/CTXUchPDEium7f3T47fff2KVUkF6IjCkBeXPP48thcXvOX9xkdG3lTwzDWNSu6SC7uB9QBtL+zSc1z41nQTI0Ucm4GMzhdK7isMjdmQKCT5Av0hficRwTm5DfOIVVCDoWEfr2Z0FHZtOBLG+N4/jyyQXJKYkk2T3wPDD0weWovR4+oJvL3E62IrnMV9xvlig82SsRnVOGTplrs1Hce8U/kiM5d29qtMjyWZ361cYPelFlP+WsK985Yfj23z6OWXk737HupIL7UqyNu1pPTD5Pn5Ild1zM57KkqMjZEBzd75Vp/LdhnLo6N4V+oEiK6tgeTj28nr6jF6D5vKoldc3Aa2CN0ZY3ffLJ02B+/3qgyv9lPRnX15usKtr6MqRIknG1+sVqlZPVvTIWYyXKtm0K09omNs+Dq8491C662PqNvy6GNPv/gsmdoWYVqVqU468mGDKS0V+USk+HXCs12qKgaIM98RD0KHnObteSiParQksr2gO2Xd7PV2dona42UHvoGx1tDBfHTGJX3r47hmqXPILa6iG5g/ECU+T7E1kWy9HfPTcaW0rCbb9RelHaR9/gBf729O9Lavn6gRmSOjmwrH0f+PStfFyrzgPi3Q4m5nnTvO30r1ilZS8TG3xLD5qVPbFuVRLNs7dtsuMcxxLl+Tzs/RPz7jo1a1ENmt4aiDZmI17FQcNmDyXg+MGiGmgRBp/HeBPOgyZrGVTdErWCslYzJnSEC6IGih6qrcDdpufWRX15G5IPM67rWkxUX797uccJPbQ0lV2S/yGPbSmNrVnommmWeCX5Q59j4CPOcYZsypKtmItq1EiAT8ToWW7gcbjmgWbJNhA/qFARdxPsSIYeDitgmrIVaydjH0sWUPiQAlISdRLvhkl4Nvbx4kVXorns9qbUrsdYu96QFJn7iZOXytvzYmKHaPRMqzBPmR16CtGJ2ayiqZiIy8xsrdCO7+69wKVZ3S8gkPVYftCp2+0veECqcB0bG92aPf9QFA/fhEjwOCJ2zPu0bQmL67huhYf6ZABCSJHyRY38PiIitBsvSqOWi1/NYT18zOJeSW5eH5EyzY/P3d5M3YpVzTrhxGZtYaCZi1vjbLwTKZiK+mzyq4wz9RnDZCeOtEnNrS59/OH0/ua8+aFXs9pe8oSwQrqJPHVARp6XjC6G1HK8DQi4HN3v0mBpGb1yaaer0RbJ+0WsRKFo2wOX1bEq83vfy0oIagCq6xBjgvK7LW7ncjRVtqY+oHhJ1vZIjOjbUEHkmoncmKRt+qvqEauJbCxenXimj1vdcwtqiH6r1G9uAPVi8nNDxsn2cEKflhI+LXNwPbRGzG31y3lCSWfcLuoIATN0uz5xcvyf7Xl5MjyrXtAqFWnNEJDhdYtSS8/mLZvZdTX7JGZILMjZ1HvjLUNerGE7euHyNjk3dcaNBeiJqclmFsh8+LHAp8pCccfc9ZwF7YvESAQHhdT0X4rQiZU+sNo63TnHVtqmek66rWMHPYMVxLIia9pbMM6/4Xm5dO7GbfRq5njuGzbWuep6Su3DSuLKWIYaTx+7xXPVlR4fIRDQNxTxfKHyaVwwekBPVfM+5gDjyrRuz6qgpXm+H6H/oh9ec7lHrqiibhH+l1GET7BEA6nn4uXThTa1/tGyfcajdljNu4yVRLzGbdweyzp0C3IdqWbnasGDcCse27GJXYMfmzuCFy3ksF8Ld68cmDOcyEQfkgV5cRWw9amrcLwgurVJMLuiEeXcyogCoK1IG84hm6ah6JdxVICsIePoOrsMqeM3pFm6CH9+iWwBwQ908xpjyGatLypDYgpJT1w4N3LrLS4EKwdt3dw5dgq1zt+I3bihbCmLq2KKrhRe7Ag1j+DyjJ2XHJguet2EMY4pEnon42rs+qMzvmzeSRutTJpceqLxCt92zw06Yoi5Ir8/319XNaE25keK0dMLevrt9ePvOzmtt0JpVNV9xjNutUxbErwRAx1HLrhbtdPqifnJ03X/nB2p51GLW8lhT14QUk9C9hf/h7modt9lrYUWJcSspErMcTdVMxKbKkVzmguByKxjG0SaMZpKsW3xXEadlEw8Cm+BVaGWtFXTC8r58zg9t4KsxL7U1xypntLkWwdOAWgKgo9hg4jvbz1Jxu7hlm5sycVZDcoCNaf/lpU9H5MRiCx8bVzHqJmaaQPZOx+B5vkcRCJGJ2IYsUGXuUszNxYOyX1iHOVSFh4iBsQYjGjKNpZ7Gh8emR8HbOGT9vNJDEVZ7V75IN2XZnGWc29/41xHnOR3RHA6AwtN0Xw6QoLds5vR727zc8O4n69ZiWfIu30B71y0/kJjNPZfvayhp/eVF97zNrZ1J6eQCo9vKt7FKcj65iY1e+/catU6Ky/WsrFWJKWxm9LwnIl1zfl33PNoT0fCj0w/tsbLOBZeLuVgDz05rOpxzEbAvguD56sV3xWvc+mmaPvk8M/syXssXixVdtrZO43WnQuLqApFj6k8CICLG1ixyUUMlvqfh/Ht7YENDymXKubpzOlO6JuHf5c0Nyr78E9lxuCC45HDfLStGtfHzaUcut/KeNGt1WOq1Mi6hAufzTMTXMrC+bXrObCZiy8Z57lJM2GUx8QnVzLzv0wq4GVV5Z2bO8HFa/3l38NB2qSceuWyQ8jwP29CiISRuc1rTvhOn0gsAdJpcbJU9lFRUUEn8m6/Xj7wvp2ddVOPOZa81XRobYqdL6Jcv1cvRsI5lhZ6IirX4ztLWecXmgss41GtpcsKom7Hb8V1ZnFbogmtFnFZq5Fbg0SnAZpmQb0BiO3GZ09kXoB4cWBfEut5z6x3nKCoaDU52wczcnjW9tE86x8AyT6grJG574oyrnyF6Fvl2u7nwfQzvazwjtYi5S9Gk3Tpsi/iu7rgZZYPrx4nT+izuQGPEfQgu0JY5vbkVORtULh4bfTpGmyewDJuck/KB64Uvj4cs/wVdEhWOF3euuq8Yqt1D5IsVo+zwBVxdKIWFRyK6xL39thUlOPrUYXLxsifCa0RTenlVBkmj6GI2tszDmAKj6l3jtEyZOC2wnH4kC5drer4Hn6YyH+5uH1EvaV1Vb9ASxIKbGH704cPE2UOxatbvKpjLVpxp20QGuIiIru3B5OPbSeOZoQnVhHV53d1+mdWACnvjt/Fd7ycP2uRmnMdpifszRj0tLefgGqcFVhwt9TEzv21tDYJmC4EVQawPMzZ/yB78x1rU4KuJXr877lNXkmRF3ltqjjS+mRqmFsGldTS0BpQeCFkNKPNS441C13+ax3cRH7j3ggpH0cg7dJyWFjMs6mmF8HGDi/S+rIB4lXmRsvltlWurgWrYYGTHGnwbHYrJig2bi2MxW+GxSR3dp0mLx8LInG/6MhpdcGWZbws7eg9pav6yFc9DC6/3k5GmhMrKqNmEqHFaIrQcG3kvQ8dQK8TPppp96NM8dk1xDII3yWqIWBt0mpX5AOBqRJyz7Cllbv6u+5mIkh+oIzhnM1e1+jDtUEfgntvYpKYeweVjUNF9senLaHTBtbQWUu4GCZ1NMC8jIQIoupvRfn9+YMs8BI6f0ZYGn2fmL824IBCVdIXiVFaxzAcIjz2EjHm9uT34pcSLJ1QSwyZK1fEYVM1mdt3zuyRGZVMcuLy8V4vgMgdJjx/4iq680PeAGqB/7kkmTtkIIbHuMR6JiXtP3YEhW9vki+HHLGbBPAvpissr2b6Q5x1RYDROS4OtTepUKR2co3eDjmfT8q9nk65M7FMdzWSBO0x8HKtkgmzftwwZrznMqXku7pY/rwuot/sdleSKiuytxLHf6kJRkZ2fAyqF289rEtcK+jduxDVuaFz06YcTG6qzNRg8yL0+buTdVWR+3q97frYrS9GKIRvf9YtYpoKWUMhF3JEImRGzeVI12DyL00pGoT8wq7ynJsu4DFuQeu24IZ6QmcPrY/UCa4zWpWgD06dHsbNIs8tauudSLid3t2g27f0rX8P8p4iT0oKuK4LftcDmQlGaeVEGVAIda93nu5BN7FpBP5aAUbGvVi3ts1z8m/5dDCmPNR6RXBGt8XlqRdeDOkXX3KWo1oDSXxXfB93e+C7mo1hxWtatKu+bEKcVBP18XMzO2gtsldxw3LHaeiAMmhWt4RS9vu5zDm5Amf/XZS+6VmQXf9SQWo49Xxy8HldV0HetyM5faGncXNOocG9FBX2Zw3pmnxdbBZkhhb1qbOl8/zyNX7LnPHPBpdaAsl/k4oOulDKbx3fd3hoEjV+6GN8lwmvJpmRLPIhFS18vH/DjWHFa6lYlEJpx2Reec8OtBIYhuNYZe0C5xroYc6VVzKRuByrbvpHtRi4ljsJncVu7vOdgaQybn6ntcOpUUDxOL1oebyzpiahGlAqi66Eadqgm5i5FtQaU7ZruEhDp6tb59ofRQH7e4ebdnSeR4rv29O+q5pnSh8TJjqp6u0mZ9EQ73t/saRXvk+Bmx+xnmkOTmrCHvAhIZn4hwnhiW/2sM2wb0zpsqkaTN8YUFNukPNC3Mk43crDe6B4n+8yLfF6XYaj70qLagdrN4PNM41bLCXnrOrvie7UFY4yTKJRLzJuF/3FD9gyHeFG6ZpzbgLX8zdwKietZSQFRI8fp+5NSxhYVXbfvDDSG0V3ki2FHvEuTOqrRX4zhKts13SEg0gq5Oztjquomy+O7bt/Z+dn0+WloK1M+8cdUA+fjtEKGaRVB/Bs9el58NjL2tM643spJN8LA8RW2KG8gxOVzJO9qQACURITSc7Hcls4Cl4vawtirfC/X9TSk0sS4wITBuk+N41rqLX4vVtiWNFjMySxIY2ojU9JnG7h8SVjxaA5O378duXzF6fvJ/ubW9i05CD1a/dXTAuhCWQgXH/2nmYsploO9CVs4NVJ8V2yKOC2eha+nJRatN+rnVqWPnnpf0U3ANX2Yp+aQ2oox662ggTN2P3CpScdX702c8K/khrXkUCspbfUrGF97EWN2iwu2lpX2jY09V9nsuXyNuI9d58V130ytTSPyYONGss/esWQ8Ch2+dJkLgitJyqttNuV90PbQS/gphaSo39WRFhXn47TCtuNRdxU/OH03edSFrJcmUKuf0+vVr9/WjRAJFcAHDlND62ZCR871j9i8bFsyiu1+4uqaXyao+nREjmhISesSdbRosuPYyJw4ohagl4ubfX7gW3vThi+VqUnnyQXBpUGWDotp6DJRTt9qmxv/gViIToqiRUVLhZfte3hn5zeTmuchhda8V6MWW21xjEQbUJcKudLCQyI38wPQGJm1zNWSY1Pwa80Gu46ssv7C7idXoiUPrnInFuQX3mtfcxmbKdeirhBqGLDGDBfkTP/7u0nQ+K0q2Dna89caeU26KMlT31aaL7mYsoyu1Mn8lqUrZ70O4wiv9rgZ9Tlu3915bfseBrdK8EGMXo2rSu5iHbt8TVGnhVpCNq/dDgkACrSeEgVC9n7nwzWzGm83Liy0H60hd/FnmN+U8yC4h89oF5E2jI0tAyFig5wJFzIUCvtZVahGH6sFULLgh5VeTJr262MFsGmcVoEG7nWoynxq/tK+g00Jr/NxWmLRckw5XkbWqxFxWj54bIS2LtF245auPGOoNeIPdAsrMgJa1/O4SA+Lhg1MbkxY6Dikso68xqJHpfYP/+SrZsdGrX7MHhntGm8VsHJASFR0ta0F0DeCyy6mkkFnPlau+c85VwuLAxdMs30HG4jv0p/3yQbEB47TitircV3wPiRExKulqykBr4eEFVsoBQE8mc1St1T5EgH2psdPfQ4yG5h8Z+d13etJ43K8xRaZA7d919fiI2MjxgKqGXUjavkgv7Fpn3XrPDZMivgx+ZC3AAo5V5PFP6d8xoFauao8kE7k0/cn98Xm/ThWfFfms49HEadlWwwE7tVo47TEDYs4rer4HhK29UcTAl5uvCnEFqhAFhzuFpMje/o/lr1G923XZJQCm2ku8zr2vqyoddqKmNQceQkKj4y5zGjhOTbqXtSY5BoEqf6MIr6YfGixdes8Nr6M/UUXT83rUF6OhYJLg4zLHkxq5dIHooroBzeP7wqJDJiq9xjxXdZ9aKvUho/Tyno1Ik4rJPaWyp7zqxDwskHFzGDM5tRgTzfd8BmtYF2YCw2PuD9T0hKcVfj2rCMVcV9WitAOzQy3Hg9fNPTFg5t9GnkbEHSviVj6KER5IqsPPMemCaq2APo0DVNAfKHg0vggl9uLPlAoU6hdxEXLnZDk8V060apO4vOL2TmjYyk81h5oIXo1ti7LrgXYbFlTaW4NVWCLW+QPK4wCbYgq4nQNZXMqrKUUrAfZvqTW9opCo+cgovr82M+1mDPfl3esBbnqnnVhHVW+sLi6Er+ie3evx49CjI11wbZsbMQL9rRr4S1VWgCR1pML0AKIr/oP/XCzRevyoZhRyEqtGr8ym4myDH34ZDFRXm2C1AyekjmM8kyGH4d0Hdrxm9pbTCk+vj9hWgN0bttYu0CfoY1BZDMmTk5sZfs+TTaIzi4L5rk4m5Jtz8NJek8OxV3NIItjyZI5nlkhvsFWrL+mb95lmpgbckCMnIpTakJJzYeA8zOagGETl+EA85n5SPvFunyJ6z5TgjGzOWZKfk+NCBZZT5c/12ItJTNZO/K+jUnviRvvYah1lLWVeetvGcvJq9mHLIkxlqf7PWE6Ljs24k79SYvZhttjRIg6ulltyE1Za5p1Vaq3Kw6bW9tHftXolWoap3/Vf2RtHJx6cFHo8vh5d/Afs9gZ8yyYyMnbBInb5llZkZO5kcwzMYMPKSCL2vGEIp2V/+xsnZk1wc7tweBBqGB0G+Mlwkk72FqmRJ9oQVul6blGTmzjNbKvNwTWBQ60h8WiZDbeeXSflj36cUBhIeKAh4ZMJnimV6+lVH+zf2UKtozEAn76obrYUvRSL2fHgNyr2l/FUFvCpcWbLTU25/6sjLvYahsfP7zdkzHTQRuSM9U0TnLdf9rbsbMfOnymhbVEWX9x+PgudQ9d5yu3gYWR47RCl3nQG6cNhnQrSzGhNaKo0xI0UQOALqPWLU8Lod2jfQOT24SILT2QKSAVXVktovtiq2CjL+7eBloAJUtfYdwXUYxMC1tGInp8185vt7cH+5tbgz37p5pBp3HitGw7ngBxWucpAmVz8/6QnOATWjO6KLoqxYQAcBWyBsTKXqn9mooujT/t6iVGL8ChxVaBnl0JV4zpapTVEVuKjVMX0VV3C6Clgss7xbXItAgQpH7hefL6XTp5IyxsrbR7qG1d7J+hK8TL8+pzx2jHU/Rq9A2UNV6FDLtPNp9OfvRN464TvZGZkE1iAVB0H5WLR4jLnw0D6eAlRsvvhIjZug4tT2B63RKkmUDUGpCrI7YKql64fVoALbdwCafvJ5U6cMeoYaST1wbWha7fFYF80h5syGIL3XPKZp7c2fmjcq/Gnmd694qgc7zdc4nHtikrACHJxVbIZIPiEtMNNxqPVQTVVX5Hx0bPgS5c8IqxWeUakHW3AColuOw371cwh54rQhq6KeQ8viu0mzEUzEf5pA0ap1UUrdPYMhu0XYUKsRurRFvnknV1iFUU7ZxAWHish3+stR8tBCQA86LSDXTv0HVsL3gRuqwEYc06mxQtgMgD1xZApQVXXln4EVVBhNeMzR+hC7pdaBPUGtdYFqelKdYhJ22IonUXsDdc6sBNtB7Oz6XmD4qvsX4EQCDsxZltdnZ0ET9fT2STnsbUMIW3oQ1Fpc93WRGLV/PCa14uaf06m1hXOMdvAVRacCn2QwiRiXKuCCkFxE7gdyePmnQNnd/MYsVphaxAnnSwgF0dfCO8ap1PuViPMIfA+qLWFE74qc2Mrrkli85jnc/NrCeF7dkVIyu8KvpZiMXrvhWlMjb1B9YXxgErtEa0pujnoOuDfCjZAqhPHg8lB/+tPKi8IjwSN+OebxHSq8i/15EtSsjmlzqqdhf1tG5GqKdV1ACTMR9SIOzzitgKHVO2auRidE//rp8DU/pQZOpPhkxQ17jdZI15ZSh5A5EFQpDvSWo5+V1+jU9bMK/Or6esiLSuJ/4p9B5dvHdO6NebCR11wR2fr/uxHtr/ntEQY1M/2olE9vlbPnXTzrUAutI9yeSJlk0II7rmD3KscWKhrS3WzDdLR2JV86wsWwa5IfTpcYxnF9fhoWM9reXI7VLbTuSFZYEH803RkFaKv2c3RTaDMpbHTFzxxLBYHJj+TBIal/0srPguuQH3btDxVd/X5fsoHz/U36TWVjD/Uj4+ceMGvan78HB9xlpQ69GCCuRtRvc6WxndpEO5dNyT8+BW6UuNoQkznxXrSbs9bPTpeFWEhM4xM7PV9CuPjcteExKX/Uae8axpQ4C9DKSeXqQbNL5q7XkLLsofSj74l0HbkrA5ol5yEEW8iPqsHGB+jjxN/2loi4RtPTNNn8hC2Q/d8sUWW+0nrTKprxoXWvgU9DMXyqKWPwCAxdi9UARGT37Nptle2OvT2SzvjLHO4RAYm+5RSXApmQUpTIuUOXJD45RfxAhqDNEmyFooUj5o6/MtIpY4BAAAAMByKgsuJZrbrkKT6WU4N52dP1IcC1ERp0Wh2wdFFIcAAAAAKEcQwVUQyzoT081YXijGidOyZuFZehi+fRDchwAAAEBbCCq4lJhB6szmueklL6IIrylpg+rhgp86lt8OuhSnFeuZAQAAAOBHcMFVYLN3ZuZ1eGtXRDejBtan9JDSdEBJMtFslxiixboP2byMMTYJSj0AAAAArSOa4CqI52YU4WVsgdExdQQrQqfhm2IXNcA2+uFrgAEAAACgOtEFl5K77PZ8gtSXEim+KyTqPvw8S5+JKNqn0DAfaWsepAADAAAA7aUWwVUQtwipGW30kxdts/BoOx4yZoQ4LQAAAGB9qVVwFUR1M0aK73IlVpxW0ZKnDe8RAAAAAOVoRHAVRBVePX7QhJstc5+K0EKcFgAAAAByGhVcSlQ3Y43xXUWZB23ITcGJUwMMAAAAAPXQuOAqiNWoWd6guODM84/v3x5QJGLFaaEdDwAAALAatEZwFXQpvgvteAAAAABQhtYJrgLtdchsnkSxGvX5URX3XKw4LQXteAAAAIDVo7WCS2lbfFf+PM9i9D1EnBYAAACwurRacBVkQsf8FtzNmDEWH96r61yNsVyHlg5WzAcAAACAG50QXAXR4ruoKLtAx+LGPDYm+Qdz+r0IoYGM0DB80dKvZR5EaI0IAAAAACtNpwSXkpVfoP0obYJqAnFaAAAAwHrROcFVELdNUCzQjgcAAABYRzoruAq2BoPd2cy8jhTfFQbEaQEAAABrTecFV0HM+C5fEKcFAAAAAGVlBFeB1u8iNr80KbzQ9xAAAAAA51k5waU0Gt/FfEQ9OkA9LQAAAAAUrKTgKqhXeKFwKQAAAAAWs9KCq2AuvIh/CulqtD0PjXll+slzCC0AAAAAXMVaCK6CTHjRkA09MWR2yRdDE61OjxgtAAAAAJRhrQTXeVR8cUoPTUo/i4IaLv8KW0Prd/k1RnkHAAAAALiwtoLrMrae15RunXc5JgmdcY8mN4gmsGQBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl/h/zjL987W5yjIAAAAASUVORK5CYII="/> +</defs> +</svg> diff --git a/client/public/github.svg b/client/public/github.svg new file mode 100644 index 0000000..af1df72 --- /dev/null +++ b/client/public/github.svg @@ -0,0 +1,10 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_41_228)"> +<path d="M12 0.5C5.37 0.5 0 5.78 0 12.292C0 17.503 3.438 21.922 8.205 23.48C8.805 23.591 9.025 23.226 9.025 22.913C9.025 22.633 9.015 21.891 9.01 20.908C5.672 21.619 4.968 19.326 4.968 19.326C4.422 17.965 3.633 17.601 3.633 17.601C2.546 16.87 3.717 16.885 3.717 16.885C4.922 16.967 5.555 18.1 5.555 18.1C6.625 19.903 8.364 19.382 9.05 19.081C9.158 18.318 9.467 17.799 9.81 17.504C7.145 17.209 4.344 16.195 4.344 11.677C4.344 10.39 4.809 9.338 5.579 8.513C5.444 8.215 5.039 7.016 5.684 5.392C5.684 5.392 6.689 5.076 8.984 6.601C9.944 6.339 10.964 6.209 11.984 6.203C13.004 6.209 14.024 6.339 14.984 6.601C17.264 5.076 18.269 5.392 18.269 5.392C18.914 7.016 18.509 8.215 18.389 8.513C19.154 9.338 19.619 10.39 19.619 11.677C19.619 16.207 16.814 17.204 14.144 17.494C14.564 17.848 14.954 18.571 14.954 19.676C14.954 21.254 14.939 22.522 14.939 22.905C14.939 23.214 15.149 23.583 15.764 23.465C20.565 21.917 24 17.495 24 12.292C24 5.78 18.627 0.5 12 0.5Z" fill="black"/> +</g> +<defs> +<clipPath id="clip0_41_228"> +<rect width="24" height="24" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/client/public/icons/Box.svg b/client/public/icons/Box.svg new file mode 100644 index 0000000..4c7fa69 --- /dev/null +++ b/client/public/icons/Box.svg @@ -0,0 +1,4 @@ +<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M25.9628 5.63653L29.2962 7.38578C32.8823 9.26769 34.6753 10.2086 35.671 11.8995C36.6666 13.5903 36.6666 15.6944 36.6666 19.9024V20.0974C36.6666 24.3055 36.6666 26.4095 35.671 28.1004C34.6753 29.7912 32.8823 30.7321 29.2962 32.6141L25.9628 34.3633C23.0368 35.8988 21.5738 36.6666 20 36.6666C18.4262 36.6666 16.9632 35.8988 14.0371 34.3633L10.7038 32.6141C7.11769 30.7321 5.32464 29.7912 4.32897 28.1004C3.33331 26.4095 3.33331 24.3055 3.33331 20.0974V19.9024C3.33331 15.6944 3.33331 13.5903 4.32897 11.8995C5.32464 10.2086 7.11769 9.26769 10.7038 7.38578L14.0371 5.63653C16.9632 4.10101 18.4262 3.33325 20 3.33325C21.5738 3.33325 23.0368 4.10101 25.9628 5.63653Z" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +<path d="M35 12.5L28.3333 15.8333M20 20L5 12.5M20 20V35.8333M20 20C20 20 24.5711 17.7145 27.5 16.25C27.8254 16.0873 28.3333 15.8333 28.3333 15.8333M28.3333 15.8333V21.6667M28.3333 15.8333L12.5 7.5" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +</svg> diff --git a/client/public/icons/Posts Carousel Horizontal.svg b/client/public/icons/Posts Carousel Horizontal.svg new file mode 100644 index 0000000..bd33ffe --- /dev/null +++ b/client/public/icons/Posts Carousel Horizontal.svg @@ -0,0 +1,5 @@ +<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M20.8333 8.33325C23.976 8.33325 25.5474 8.33325 26.5237 9.30956C27.5 10.2859 27.5 11.8572 27.5 14.9999V24.9999C27.5 28.1426 27.5 29.714 26.5237 30.6903C25.5474 31.6666 23.976 31.6666 20.8333 31.6666H19.1667C16.024 31.6666 14.4526 31.6666 13.4763 30.6903C12.5 29.714 12.5 28.1426 12.5 24.9999L12.5 14.9999C12.5 11.8572 12.5 10.2859 13.4763 9.30956C14.4526 8.33325 16.024 8.33325 19.1667 8.33325L20.8333 8.33325Z" stroke="black" stroke-width="2.5"/> +<path d="M36.6666 31.6666H35.8333C33.5321 31.6666 31.6666 29.8011 31.6666 27.4999L31.6666 12.4999C31.6666 10.1987 33.5321 8.33325 35.8333 8.33325L36.6666 8.33325" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +<path d="M3.33337 31.6666H4.16671C6.46789 31.6666 8.33337 29.8011 8.33337 27.4999L8.33338 12.4999C8.33338 10.1987 6.46789 8.33325 4.16671 8.33325L3.33338 8.33325" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +</svg> diff --git a/client/public/icons/SSD Square.svg b/client/public/icons/SSD Square.svg new file mode 100644 index 0000000..07082bc --- /dev/null +++ b/client/public/icons/SSD Square.svg @@ -0,0 +1,7 @@ +<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M31.6666 28.3333V29.9999" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +<path d="M27.5 28.3333V29.9999" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +<path d="M23.3334 28.3333V29.9999" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +<path d="M19.1666 28.3333V29.9999" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +<path d="M31.6667 8.52941L32.8673 8.18143L32.8633 8.16769L32.859 8.15405L31.6667 8.52941ZM8.33337 8.52941L7.14106 8.15405L7.13677 8.16769L7.13279 8.18143L8.33337 8.52941ZM4.81481 34.4052L5.53675 33.3847L4.81481 34.4052ZM3.89514 33.4314L4.95225 32.7643L3.89514 33.4314ZM36.1049 33.4314L35.0478 32.7643L36.1049 33.4314ZM35.1853 34.4052L34.4633 33.3847L35.1853 34.4052ZM35.1853 23.2419L34.4633 24.2623L35.1853 23.2419ZM36.1049 24.2156L35.0478 24.8827L36.1049 24.2156ZM4.81481 23.2419L5.53675 24.2623L4.81481 23.2419ZM3.89514 24.2156L4.95225 24.8827L3.89514 24.2156ZM12.5 6.25H27.5V3.75H12.5V6.25ZM27.5 6.25C28.2136 6.25 28.7553 6.41692 29.1927 6.75788C29.6418 7.10799 30.1081 7.7411 30.4744 8.90477L32.859 8.15405C32.392 6.67066 31.6954 5.53907 30.7298 4.78624C29.7524 4.02425 28.6275 3.75 27.5 3.75V6.25ZM12.5 3.75C11.3726 3.75 10.2477 4.02425 9.27031 4.78624C8.30463 5.53907 7.60806 6.67066 7.14106 8.15405L9.52569 8.90477C9.89203 7.7411 10.3583 7.10799 10.8074 6.75788C11.2447 6.41692 11.7865 6.25 12.5 6.25V3.75ZM30.4661 8.8774L35.2186 25.2742L37.6198 24.5782L32.8673 8.18143L30.4661 8.8774ZM7.13279 8.18143L2.38026 24.5782L4.78144 25.2742L9.53396 8.8774L7.13279 8.18143ZM9.16671 23.8971H30.8334V21.3971H9.16671V23.8971ZM30.8334 33.75H9.16671V36.25H30.8334V33.75ZM9.16671 33.75C7.9688 33.75 7.16995 33.7483 6.56211 33.6828C5.97899 33.62 5.71386 33.5101 5.53675 33.3847L4.09286 35.4256C4.75649 35.8951 5.49694 36.0826 6.29438 36.1685C7.06712 36.2517 8.02384 36.25 9.16671 36.25V33.75ZM2.08337 28.8235C2.08337 30.0382 2.08202 31.038 2.15932 31.8426C2.23831 32.6647 2.40873 33.4182 2.83803 34.0985L4.95225 32.7643C4.81979 32.5544 4.70932 32.2432 4.64787 31.6035C4.58472 30.9463 4.58337 30.0874 4.58337 28.8235H2.08337ZM5.53675 33.3847C5.30958 33.224 5.10995 33.0142 4.95225 32.7643L2.83803 34.0985C3.16672 34.6194 3.5921 35.0713 4.09286 35.4256L5.53675 33.3847ZM35.4167 28.8235C35.4167 30.0874 35.4154 30.9463 35.3522 31.6035C35.2908 32.2432 35.1803 32.5544 35.0478 32.7643L37.1621 34.0985C37.5914 33.4182 37.7618 32.6647 37.8408 31.8426C37.9181 31.038 37.9167 30.0382 37.9167 28.8235H35.4167ZM30.8334 36.25C31.9762 36.25 32.933 36.2517 33.7057 36.1685C34.5031 36.0826 35.2436 35.8951 35.9072 35.4256L34.4633 33.3847C34.2862 33.5101 34.0211 33.62 33.438 33.6828C32.8301 33.7483 32.0313 33.75 30.8334 33.75V36.25ZM35.0478 32.7643C34.8901 33.0142 34.6905 33.224 34.4633 33.3847L35.9072 35.4256C36.408 35.0713 36.8334 34.6194 37.1621 34.0985L35.0478 32.7643ZM30.8334 23.8971C32.0313 23.8971 32.8301 23.8988 33.438 23.9642C34.0211 24.027 34.2862 24.137 34.4633 24.2623L35.9072 22.2214C35.2436 21.7519 34.5031 21.5645 33.7057 21.4786C32.933 21.3954 31.9762 21.3971 30.8334 21.3971V23.8971ZM37.9167 28.8235C37.9167 27.6089 37.9181 26.609 37.8408 25.8044C37.7618 24.9823 37.5914 24.2288 37.1621 23.5485L35.0478 24.8827C35.1803 25.0926 35.2908 25.4038 35.3522 26.0435C35.4154 26.7007 35.4167 27.5597 35.4167 28.8235H37.9167ZM34.4633 24.2623C34.6905 24.423 34.8901 24.6328 35.0478 24.8827L37.1621 23.5485C36.8334 23.0277 36.408 22.5757 35.9072 22.2214L34.4633 24.2623ZM9.16671 21.3971C8.02384 21.3971 7.06712 21.3954 6.29438 21.4786C5.49694 21.5645 4.75649 21.7519 4.09286 22.2214L5.53675 24.2623C5.71386 24.137 5.97899 24.027 6.56211 23.9642C7.16995 23.8988 7.9688 23.8971 9.16671 23.8971V21.3971ZM4.58337 28.8235C4.58337 27.5597 4.58472 26.7007 4.64787 26.0435C4.70932 25.4038 4.81979 25.0926 4.95225 24.8827L2.83803 23.5485C2.40873 24.2288 2.23831 24.9823 2.15932 25.8044C2.08202 26.609 2.08337 27.6089 2.08337 28.8235H4.58337ZM4.09286 22.2214C3.59209 22.5757 3.16672 23.0277 2.83803 23.5485L4.95225 24.8827C5.10995 24.6328 5.30959 24.423 5.53675 24.2623L4.09286 22.2214Z" fill="black"/> +</svg> diff --git a/client/public/icons/Share Circle.svg b/client/public/icons/Share Circle.svg new file mode 100644 index 0000000..765412f --- /dev/null +++ b/client/public/icons/Share Circle.svg @@ -0,0 +1,6 @@ +<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M20 15C17.2386 15 15 12.7614 15 10C15 7.23858 17.2386 5 20 5C22.7614 5 25 7.23858 25 10C25 12.7614 22.7614 15 20 15Z" stroke="black" stroke-width="2.5"/> +<path d="M9.16669 35C6.40526 35 4.16669 32.7614 4.16669 30C4.16669 27.2386 6.40526 25 9.16669 25C11.9281 25 14.1667 27.2386 14.1667 30C14.1667 32.7614 11.9281 35 9.16669 35Z" stroke="black" stroke-width="2.5"/> +<path d="M30.8333 35C28.0719 35 25.8333 32.7614 25.8333 30C25.8333 27.2386 28.0719 25 30.8333 25C33.5947 25 35.8333 27.2386 35.8333 30C35.8333 32.7614 33.5947 35 30.8333 35Z" stroke="black" stroke-width="2.5"/> +<path d="M33.3334 21.6668C33.3334 17.6845 31.5875 14.1099 28.8194 11.6667M6.66669 21.6668C6.66669 17.6845 8.41256 14.1099 11.1807 11.6667M16.6667 34.5801C17.7321 34.8543 18.849 35.0001 20 35.0001C21.151 35.0001 22.268 34.8543 23.3334 34.5801" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +</svg> diff --git a/client/public/icons/Star Fall Minimalistic 3.svg b/client/public/icons/Star Fall Minimalistic 3.svg new file mode 100644 index 0000000..0ed4927 --- /dev/null +++ b/client/public/icons/Star Fall Minimalistic 3.svg @@ -0,0 +1,6 @@ +<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M19.6857 11.2112C21.3745 8.18158 22.219 6.66675 23.4814 6.66675C24.7439 6.66675 25.5884 8.18158 27.2772 11.2112L27.7141 11.9951C28.1941 12.856 28.434 13.2865 28.8082 13.5705C29.1823 13.8545 29.6483 13.9599 30.5803 14.1708L31.4287 14.3628C34.7083 15.1048 36.3481 15.4758 36.7382 16.7304C37.1283 17.9849 36.0104 19.2922 33.7746 21.9066L33.1962 22.583C32.5609 23.326 32.2432 23.6975 32.1003 24.157C31.9574 24.6166 32.0054 25.1122 32.1015 26.1035L32.1889 27.0059C32.5269 30.4942 32.6959 32.2383 31.6746 33.0137C30.6532 33.7891 29.1179 33.0821 26.0472 31.6683L25.2528 31.3025C24.3802 30.9008 23.9439 30.6999 23.4814 30.6999C23.019 30.6999 22.5827 30.9008 21.7101 31.3025L20.9157 31.6683C17.845 33.0821 16.3097 33.7891 15.2883 33.0137C14.2669 32.2383 14.4359 30.4942 14.774 27.0059L14.8614 26.1035C14.9575 25.1122 15.0055 24.6166 14.8626 24.157C14.7197 23.6975 14.402 23.326 13.7667 22.583L13.1882 21.9066C10.9524 19.2922 9.83453 17.9849 10.2247 16.7304C10.6148 15.4758 12.2546 15.1048 15.5342 14.3628L16.3826 14.1708C17.3146 13.9599 17.7805 13.8545 18.1547 13.5705C18.5288 13.2865 18.7688 12.856 19.2487 11.9951L19.6857 11.2112Z" stroke="black" stroke-width="2.5"/> +<path d="M3.48145 26.6667C5.34075 25.2017 7.81066 24.6618 10.1481 25.2096" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +<path d="M3.48145 17.5001C5.14811 16.6667 5.63103 16.7676 6.81478 16.6667" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +<path d="M3.33334 9.34786L3.68028 9.14469C7.35639 6.99185 11.2506 6.41153 14.9217 7.46944L15.2682 7.56928" stroke="black" stroke-width="2.5" stroke-linecap="round"/> +</svg> diff --git a/client/public/img-footer.png b/client/public/img-footer.png new file mode 100644 index 0000000..e7bc142 Binary files /dev/null and b/client/public/img-footer.png differ diff --git a/client/public/img-road.png b/client/public/img-road.png new file mode 100644 index 0000000..1cdd796 Binary files /dev/null and b/client/public/img-road.png differ diff --git a/client/public/img-side.png b/client/public/img-side.png new file mode 100644 index 0000000..be7e7f5 Binary files /dev/null and b/client/public/img-side.png differ diff --git a/client/public/logo.png b/client/public/logo.png new file mode 100644 index 0000000..edde85a Binary files /dev/null and b/client/public/logo.png differ diff --git a/client/public/logo.svg b/client/public/logo.svg new file mode 100644 index 0000000..6a2df5d --- /dev/null +++ b/client/public/logo.svg @@ -0,0 +1,828 @@ +<svg width="152" height="32" viewBox="0 0 152 32" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M45.987 22.5206V8.12059H59.267V11.0206H48.907V13.8606H57.247V16.7806H48.907V19.6206H59.267V22.5206H45.987ZM72.6195 22.5206V19.9606L75.6195 19.5006V19.6206H77.2995V22.5206H72.6195ZM64.0995 22.5206C63.5662 22.5206 63.0795 22.3939 62.6395 22.1406C62.2129 21.8739 61.8662 21.5273 61.5995 21.1006C61.3462 20.6606 61.2195 20.1739 61.2195 19.6406V11.0006C61.2195 10.4673 61.3462 9.98726 61.5995 9.56059C61.8662 9.12059 62.2129 8.77392 62.6395 8.52059C63.0795 8.25392 63.5662 8.12059 64.0995 8.12059H72.7395C73.2595 8.12059 73.7329 8.25392 74.1595 8.52059C74.5995 8.77392 74.9529 9.12059 75.2195 9.56059C75.4862 9.98726 75.6195 10.4673 75.6195 11.0006V19.6406C75.6195 20.1739 75.4862 20.6606 75.2195 21.1006C74.9529 21.5273 74.5995 21.8739 74.1595 22.1406C73.7329 22.3939 73.2595 22.5206 72.7395 22.5206H64.0995ZM64.2195 19.6206H72.5795C72.6195 19.6206 72.6462 19.6139 72.6595 19.6006C72.6862 19.5739 72.6995 19.5406 72.6995 19.5006V11.1406C72.6995 11.1006 72.6862 11.0739 72.6595 11.0606C72.6462 11.0339 72.6195 11.0206 72.5795 11.0206H64.2195C64.1795 11.0206 64.1462 11.0339 64.1195 11.0606C64.1062 11.0739 64.0995 11.1006 64.0995 11.1406V19.5006C64.0995 19.5406 64.1062 19.5739 64.1195 19.6006C64.1462 19.6139 64.1795 19.6206 64.2195 19.6206ZM81.7753 22.5206C81.242 22.5206 80.7553 22.3939 80.3153 22.1406C79.8886 21.8739 79.542 21.5273 79.2753 21.1006C79.022 20.6606 78.8953 20.1739 78.8953 19.6406V8.12059H81.7753V19.5006C81.7753 19.5406 81.782 19.5739 81.7953 19.6006C81.822 19.6139 81.8553 19.6206 81.8953 19.6206H90.2553C90.2953 19.6206 90.322 19.6139 90.3353 19.6006C90.362 19.5739 90.3753 19.5406 90.3753 19.5006V8.12059H93.2953V19.6406C93.2953 20.1739 93.162 20.6606 92.8953 21.1006C92.6286 21.5273 92.2753 21.8739 91.8353 22.1406C91.4086 22.3939 90.9353 22.5206 90.4153 22.5206H81.7753ZM95.0978 22.5206V8.12059H97.9578V22.5206H95.0978ZM99.7952 22.5206V8.10059H102.675V19.6206H114.195V22.5206H99.7952ZM114.961 22.5206V8.12059H117.821V22.5206H114.961ZM119.638 22.5206V8.12059H122.698L131.118 18.1606V8.12059H134.038V22.5206H130.978L122.518 12.4406V22.5206H119.638ZM136.299 22.5206V8.12059H139.199V13.8606H142.299L147.099 8.12059H150.179V9.04059L144.899 15.3206L150.179 21.6006V22.5206H147.099L142.299 16.7806H139.199V22.5206H136.299Z" fill="#121212"/> +<g clip-path="url(#clip0_35_3830)"> +<path d="M24.264 11.2284C26.1726 10.599 27.736 9.7665 28.9543 8.75127C31.1269 6.90355 32.1827 4.54822 32.1827 1.52284V0H13.7056C8.83249 0 5.3198 1.05584 3.00508 3.24873C1.01523 5.11675 0 7.77665 0 11.1675V22.3553H3.22843C3.14721 22.4162 3.06599 22.4975 3.00508 22.5584C1.01523 24.4264 0 27.1066 0 30.4772V32H13.0761C20.5076 32 25.8477 30.6802 28.934 28.0609C31.1066 26.2132 32.1624 23.8579 32.1624 20.8325V19.3096H23.7563C24.2437 17.9492 24.2437 16.0812 24.2437 13.4416V11.2284H24.264ZM5.09645 5.46193C6.78173 3.85787 9.68528 3.04569 13.7056 3.04569H29.0152C28.8122 4.14213 28.264 5.36041 26.9848 6.43655C24.4467 8.56853 19.7766 9.64467 13.0761 9.64467H3.1269C3.35025 7.85787 4 6.47716 5.09645 5.46193ZM3.04569 18.5584C3.04569 15.6751 3.04569 13.7665 3.65482 13.2995C4.4264 12.6904 7.04568 12.6904 11.0051 12.6904H21.2386V13.4416C21.2386 16.3249 21.2386 18.2335 20.6294 18.7005C19.8579 19.3096 17.2386 19.3096 13.2792 19.3096H3.04569V18.5584ZM26.9848 25.7462C24.4467 27.8782 19.7766 28.9543 13.0761 28.9543H3.1269C3.35025 27.1675 4 25.7868 5.07614 24.7513C6.78173 23.1472 9.66497 22.335 13.6853 22.335H28.9949C28.8122 23.4518 28.264 24.6701 26.9848 25.7462Z" fill="#121212"/> +<path d="M13.7667 45.9549C13.7761 46.2233 13.7855 46.4917 13.7949 46.7633L13.8345 46.6979C12.9091 47.2313 11.9817 47.7615 11.0563 48.295C11.4107 47.503 11.765 46.711 12.1193 45.9222L12.0798 45.9549C12.6527 45.9876 13.2182 43.2613 13.8006 45.9418C13.8025 45.9418 13.7327 45.8305 13.7327 45.8305L13.7667 45.9549Z" fill="#FEFEFE"/> +<path d="M-6.73641 28.5859C-6.32175 28.9721 -5.90899 29.3583 -5.49433 29.7445C-6.24071 29.8656 -6.98709 30.0293 -7.73536 30.0784C-7.92195 30.0915 -8.11609 29.738 -8.30834 29.5514C-7.78813 29.2503 -7.26604 28.9525 -6.74584 28.6514L-6.73641 28.5859Z" fill="#FEFEFE"/> +<path d="M51.8321 45.1335C51.8039 45.6637 51.7737 46.1972 51.7454 46.7274L51.785 46.6652C51.1366 47.4768 50.4901 48.2852 49.8418 49.0969C49.8644 48.5569 49.8851 48.0136 49.9077 47.4736L49.8908 47.5128C50.0661 47.5161 50.2395 47.5194 50.4147 47.5194L50.4016 47.4965C50.8652 46.7273 51.327 45.9549 51.7907 45.1858L51.8321 45.1335Z" fill="#FEFEFE"/> +<path d="M-4.88358 5.45957C-4.61029 5.21084 -4.33511 4.9621 -4.05993 4.71663C-4.05804 4.71663 -4.09574 4.65772 -4.09574 4.65772C-4.30118 6.27779 -3.0214 8.69317 -4.93824 9.39684L-4.96463 9.40011C-4.93824 8.62117 -4.91186 7.8455 -4.88547 7.06983L-4.94013 7.11892C-4.10705 6.55926 -4.64421 5.98323 -4.93447 5.41375L-4.88358 5.45957Z" fill="#FEFEFE"/> +<path d="M33.817 27.0542C33.4457 27.4698 33.097 27.8593 32.7464 28.252C32.705 27.964 32.5712 27.5451 32.6352 27.4109C32.9067 26.8414 33.2365 26.357 33.5456 25.8432C33.621 26.1737 33.6945 26.5043 33.817 27.0542Z" fill="#FEFEFE"/> +<path d="M-8.80571 41.6313C-8.12341 40.6757 -7.44111 39.7233 -6.75693 38.7676L-6.74185 38.8036C-6.66269 41.4382 -7.58247 41.8637 -8.80571 41.6117V41.6313Z" fill="#FEFEFE"/> +<path d="M33.1725 35.9139C33.1178 34.8895 33.0631 33.8618 33.0085 32.8374C33.4891 33.2694 33.9697 33.7014 34.4522 34.1367L34.407 34.0647C33.9848 34.6604 33.5607 35.2593 33.1348 35.8484C33.1329 35.8451 33.1725 35.9139 33.1725 35.9139Z" fill="#FEFEFE"/> +<path d="M-11.8646 38.8363C-11.4405 39.1832 -11.0183 39.5334 -10.5942 39.8803C-10.843 39.9818 -11.0824 42.3743 -11.3557 39.8803C-11.3991 39.4909 -11.6592 39.1701 -11.8194 38.8199L-11.8646 38.8363Z" fill="#FEFEFE"/> +<path d="M47.5122 11.7958C47.8929 11.6452 48.2737 11.4947 48.6544 11.3441C48.6902 11.7172 48.7279 12.0903 48.7637 12.4634C48.3603 12.2147 47.957 11.9692 47.5555 11.7205L47.5122 11.7958Z" fill="#FEFEFE"/> +<path d="M-12.1552 28.661C-12.2758 30.5887 -13.075 29.8425 -13.68 29.7901C-13.7347 29.7868 -13.7761 29.3352 -13.8233 29.093C-13.2635 28.9752 -12.7037 28.8541 -12.1458 28.7297L-12.1552 28.661Z" fill="#FEFEFE"/> +<path d="M29.7007 26.9461C30.023 26.6744 30.3434 26.4028 30.6657 26.1312C30.7354 27.0181 31.4102 28.1767 30.3095 28.5465L30.3415 28.612C30.1436 28.0458 29.9457 27.4796 29.7478 26.9134L29.7007 26.9461Z" fill="#FEFEFE"/> +<path d="M-23.1868 14.172C-24.4515 12.5552 -23.0794 11.9726 -22.7722 10.9711L-22.7854 10.9973C-22.6157 11.2918 -22.448 11.5831 -22.2783 11.8777V11.8613C-22.4423 12.3752 -22.6063 12.889 -22.7703 13.4028L-22.7288 13.3636C-22.8984 13.6614 -23.07 13.956 -23.2396 14.2538L-23.1868 14.172Z" fill="#FEFEFE"/> +<path d="M13.7949 46.7636C14.3792 47.0778 14.9635 47.392 15.5478 47.7029L15.5911 47.6211C14.8693 48.0891 13.8986 49.9841 13.8345 46.6948C13.8345 46.6981 13.7949 46.7636 13.7949 46.7636Z" fill="#FEFEFE"/> +<path d="M22.4742 26.8708C22.1256 27.257 21.775 27.6399 21.4263 28.0261C21.3396 27.7381 21.2529 27.4501 21.1643 27.1588C21.6148 27.0868 22.0652 27.0148 22.5157 26.9428C22.5157 26.9461 22.4742 26.8708 22.4742 26.8708Z" fill="#FEFEFE"/> +<path d="M-19.1062 -4.01861C-18.7519 -4.45391 -18.3975 -4.8892 -18.0432 -5.32449C-18.0375 -5.02011 -17.9885 -4.47682 -18.03 -4.45391C-18.3655 -4.27717 -18.7161 -4.2019 -19.0629 -4.09716L-19.1062 -4.01861Z" fill="#FEFEFE"/> +<path d="M-2.03363 -8.01456C-2.45394 -7.17016 -2.87613 -6.32576 -3.29645 -5.48136C-3.34922 -5.67773 -3.46985 -6.01483 -3.44346 -6.05084C-3.00053 -6.70868 -2.53876 -7.33053 -2.08263 -7.96219L-2.03363 -8.01456Z" fill="#FEFEFE"/> +<path d="M-12.5865 18.129C-13.1143 19.2091 -13.6401 20.2858 -14.1679 21.3659L-14.2131 21.4313C-13.6873 20.3415 -13.1595 19.2516 -12.6337 18.1585L-12.5865 18.129Z" fill="#FEFEFE"/> +<path d="M48.5489 4.58902C48.1437 4.37301 47.7403 4.15373 47.3351 3.93772C47.6178 3.51552 47.9005 3.09004 48.1833 2.66784L48.2021 2.59911C47.4293 3.66607 48.2511 4.04572 48.4999 4.67084L48.5489 4.58902Z" fill="#FEFEFE"/> +<path d="M19.1365 31.8621C18.8142 32.1108 18.6709 32.3138 18.5239 32.317C18.2374 32.3203 17.9509 32.2156 17.6644 32.1534C17.819 31.8261 17.9641 31.2468 18.1319 31.2239C18.3901 31.1912 18.6653 31.5381 19.1365 31.8621Z" fill="#FEFEFE"/> +<path d="M48.5016 4.67411C48.8239 4.70683 49.1444 4.73956 49.4667 4.77229L49.4214 4.69047C49.1953 5.5676 48.971 6.44473 48.7448 7.32186L48.7655 7.27604C48.6939 6.38254 48.6223 5.48578 48.5488 4.59228C48.5488 4.58901 48.5016 4.67411 48.5016 4.67411Z" fill="#FEFEFE"/> +<path d="M6.65913 8.77188C6.79107 7.8162 6.923 6.86052 7.05494 5.90811C7.19441 6.02594 7.33389 6.14376 7.47336 6.26158C7.18687 7.10925 6.90038 7.9602 6.61389 8.80787L6.65913 8.77188Z" fill="#FEFEFE"/> +<path d="M-3.92593 13.3997C-3.79588 12.8924 -3.66582 12.3818 -3.53577 11.8745L-3.58289 11.8058C-3.40949 11.7992 -3.23798 11.7959 -3.06458 11.7894L-3.123 11.8712C-2.95337 11.5767 -2.78185 11.2821 -2.61222 10.9843L-2.64049 11.0792C-2.01851 13.7008 -3.19651 13.1607 -3.96174 13.344C-3.96174 13.3473 -3.92593 13.3997 -3.92593 13.3997Z" fill="#FEFEFE"/> +<path d="M20.5841 13.3114C20.5238 13.7074 20.4899 13.943 20.4541 14.1787C20.3127 13.9561 20.1129 13.7761 20.047 13.4979C20.0017 13.3146 20.145 12.9939 20.2034 12.7321C20.3391 12.9415 20.4767 13.1477 20.5841 13.3114Z" fill="#FEFEFE"/> +<path d="M32.5524 47.5489C32.4261 48.3475 32.3017 49.1461 32.166 49.9414C32.1622 49.961 32.0397 49.9152 31.9719 49.9021C32.1622 49.1068 32.3507 48.3115 32.5411 47.5162L32.5524 47.5489Z" fill="#FEFEFE"/> +<path d="M-19.1665 14.817C-18.6331 14.997 -18.6049 11.7471 -17.7378 14.1821L-17.6964 14.1592C-17.866 14.4537 -18.0356 14.745 -18.2053 15.0396L-18.177 14.9676C-18.5144 14.8923 -18.8536 14.817 -19.191 14.7417L-19.1665 14.817Z" fill="#FEFEFE"/> +<path d="M37.1476 -16.6485C36.8366 -15.6273 37.3492 -13.8011 36.1694 -13.6309L36.2221 -13.5785C36.0544 -15.0579 36.2655 -16.1641 37.1928 -16.5732L37.1476 -16.6485Z" fill="#FEFEFE"/> +<path d="M16.7956 10.0055C16.1962 10.7681 15.5987 11.5307 14.9994 12.2932L15.0276 12.3489C15.6232 11.5601 16.2188 10.7681 16.8163 9.97931L16.7956 10.0055Z" fill="#FEFEFE"/> +<path d="M-23.8108 15.527C-23.6015 15.0753 -23.3942 14.6236 -23.185 14.172L-23.2359 14.2571C-23.0663 13.9592 -22.8947 13.6647 -22.7251 13.3669L-22.7666 13.4061C-22.4669 13.6647 -22.1691 13.9232 -21.8675 14.1851L-21.9052 14.1196C-22.1446 14.5778 -22.384 15.036 -22.6233 15.4975L-22.661 15.4484C-23.0361 15.4549 -23.4093 15.4582 -23.7844 15.4648L-23.8108 15.527Z" fill="#FEFEFE"/> +<path d="M24.6437 -16.9988C24.7964 -17.5355 24.9509 -18.0723 25.1036 -18.609C25.2072 -18.4978 25.3109 -18.3865 25.4165 -18.2785C25.1658 -17.8759 24.9151 -17.4733 24.6644 -17.0741L24.6437 -16.9988Z" fill="#FEFEFE"/> +<path d="M30.4488 -10.8261C30.0775 -10.6887 29.7062 -10.5512 29.333 -10.4138L29.367 -10.3418C30.0172 -11.0192 30.6694 -11.6967 31.3196 -12.3742L31.314 -12.4364C31.0218 -11.88 30.7278 -11.3269 30.4356 -10.7705L30.4488 -10.8261Z" fill="#FEFEFE"/> +<path d="M23.5037 32.6408C23.1362 33.6586 22.7687 34.6798 22.4011 35.6976L22.4407 35.7631C22.8101 34.7485 23.1777 33.7372 23.5433 32.7161C23.5433 32.7128 23.5037 32.6408 23.5037 32.6408Z" fill="#FEFEFE"/> +<path d="M-17.2892 4.72653C-16.6993 4.93272 -15.7964 4.54325 -16.1451 6.5397L-16.1187 6.54624C-16.4938 5.91458 -16.8689 5.27964 -17.244 4.64798C-17.244 4.6447 -17.2892 4.72653 -17.2892 4.72653Z" fill="#FEFEFE"/> +<path d="M54.2917 2.31432C54.4293 2.45505 54.5952 2.62852 54.761 2.79871C54.6461 2.94926 54.5104 3.25691 54.4218 3.22091C54.2295 3.14563 54.0618 2.89035 53.8846 2.71034C53.9958 2.59906 54.1089 2.49106 54.2917 2.31432Z" fill="#FEFEFE"/> +<path d="M40.6569 22.9237C40.9151 22.3411 41.1752 21.7586 41.4335 21.1727C41.4844 21.3855 41.605 21.752 41.5786 21.788C41.2978 22.1677 40.9943 22.495 40.6965 22.8354L40.6569 22.9237Z" fill="#FEFEFE"/> +<path d="M18.2733 26.6745C18.6087 26.0494 18.9461 25.4243 19.2835 24.7959C19.3646 24.9726 19.4456 25.1526 19.5266 25.3294C19.112 25.7516 18.6973 26.1738 18.2827 26.596L18.2733 26.6745Z" fill="#FEFEFE"/> +<path d="M10.4587 26.9952C10.5793 26.3243 10.7 25.6533 10.8206 24.9791C10.8112 25.3424 10.8376 25.7188 10.7829 26.0592C10.7339 26.3636 10.5963 26.6287 10.4983 26.9101L10.4587 26.9952Z" fill="#FEFEFE"/> +<path d="M8.72107 0.121378C8.62118 -0.762299 8.52317 -1.6427 8.42327 -2.52637L8.37804 -2.51656C9.97258 -2.11727 8.41197 -0.637928 8.69092 0.209745C8.69092 0.206472 8.72107 0.121378 8.72107 0.121378Z" fill="#FEFEFE"/> +<path d="M-7.75988 -1.90086C-7.40365 -2.47362 -7.04931 -3.04964 -6.69309 -3.62239C-6.61204 -3.36384 -6.52911 -3.10528 -6.44806 -2.84345C-6.89664 -2.55871 -7.34523 -2.27397 -7.79004 -1.97941C-7.78627 -1.97287 -7.75988 -1.90086 -7.75988 -1.90086Z" fill="#FEFEFE"/> +<path d="M24.8303 -7.26211C25.0206 -6.77445 25.2129 -6.29006 25.4033 -5.80241C25.3373 -5.74349 25.2732 -5.68458 25.2072 -5.62567C25.0941 -6.19515 24.9829 -6.76136 24.868 -7.32756C24.868 -7.32429 24.8303 -7.26211 24.8303 -7.26211Z" fill="#FEFEFE"/> +<path d="M21.2567 5.51218C21.3038 4.91979 21.351 4.3274 21.3981 3.73829C21.5715 3.88556 21.7449 4.03284 21.9183 4.18012C21.6846 4.61214 21.4508 5.04089 21.2152 5.46964C21.2134 5.46964 21.2567 5.51218 21.2567 5.51218Z" fill="#FEFEFE"/> +<path d="M58.1215 6.94224C58.0687 7.02734 58.0159 7.11243 57.965 7.19753C57.9632 7.05352 57.9368 6.88988 57.9669 6.77205C57.9858 6.69678 58.0913 6.69023 58.1573 6.65096C58.146 6.74914 58.1328 6.84733 58.1215 6.94224Z" fill="#FEFEFE"/> +<path d="M-3.53386 11.8713C-3.40758 11.3312 -3.27942 10.7912 -3.15314 10.2479C-2.98162 10.5261 -2.81199 10.801 -2.64047 11.0792L-2.6122 10.9843C-2.78183 11.2789 -2.95335 11.5734 -3.12298 11.8713L-3.06455 11.7895C-3.23795 11.796 -3.40947 11.7993 -3.58287 11.8058L-3.53386 11.8713Z" fill="#FEFEFE"/> +<path d="M58.5382 51.4697C58.427 51.5909 58.3196 51.6989 58.2103 51.8036C58.182 51.5941 58.1405 51.3879 58.1367 51.1752C58.1349 51.1163 58.28 50.9755 58.3007 51.005C58.3912 51.1294 58.4628 51.2996 58.5382 51.4697Z" fill="#FEFEFE"/> +<path d="M44.9036 49.0707C45.1166 48.4979 45.3277 47.9219 45.5406 47.3491C45.6273 47.4833 45.7159 47.6208 45.8026 47.755C45.4954 48.1739 45.1863 48.5961 44.8791 49.015C44.8791 49.0183 44.9036 49.0707 44.9036 49.0707Z" fill="#FEFEFE"/> +<path d="M15.5476 47.7029C15.8266 47.7258 16.1055 47.7487 16.3864 47.7749C16.343 47.9909 16.2997 48.2037 16.2563 48.4197C16.0358 48.1513 15.8153 47.8862 15.5929 47.6211C15.591 47.6244 15.5476 47.7029 15.5476 47.7029Z" fill="#FEFEFE"/> +<path d="M-6.14068 48.966C-6.30088 48.8057 -6.4102 48.6944 -6.51952 48.5864C-6.39889 48.3017 -6.30277 47.9613 -6.14445 47.7682C-6.09356 47.706 -5.88434 48.0398 -5.74675 48.1904C-5.88057 48.4522 -6.01062 48.7108 -6.14068 48.966Z" fill="#FEFEFE"/> +<path d="M22.0768 -15.8403C21.8789 -15.6308 21.696 -15.4377 21.5132 -15.2446C21.4831 -15.4214 21.4001 -15.7126 21.4303 -15.7585C21.5961 -15.9941 21.7922 -16.1676 21.9788 -16.3607C22.0089 -16.2003 22.0391 -16.0399 22.0768 -15.8403Z" fill="#FEFEFE"/> +<path d="M-15.2706 12.7681C-15.1406 12.8924 -15.0294 13.0005 -14.9182 13.1052C-14.9973 13.2623 -15.069 13.4325 -15.1594 13.5667C-15.1726 13.5863 -15.3102 13.4488 -15.314 13.3736C-15.3253 13.1837 -15.2914 12.9874 -15.2706 12.7681Z" fill="#FEFEFE"/> +<path d="M34.4486 44.9568C34.5447 44.7866 34.6371 44.5117 34.7351 44.5051C34.8293 44.4986 34.9292 44.767 35.0253 44.9175C34.9179 45.0681 34.8218 45.2873 34.6993 45.3463C34.639 45.3757 34.5315 45.1073 34.4486 44.9568Z" fill="#FEFEFE"/> +<path d="M12.2135 41.18C12.0496 41.3371 11.8724 41.504 11.6952 41.6709C11.6745 41.4418 11.5878 41.1178 11.6443 41C11.7706 40.7349 11.9685 40.5712 12.1363 40.3683C12.1589 40.6039 12.1815 40.8363 12.2135 41.18Z" fill="#FEFEFE"/> +<path d="M53.0817 40.0311C52.8442 40.4664 52.6991 40.7348 52.552 41.0031C52.4408 40.7806 52.2147 40.486 52.2429 40.3518C52.3089 40.0442 52.4748 39.7398 52.6444 39.5827C52.716 39.5205 52.9045 39.8413 53.0817 40.0311Z" fill="#FEFEFE"/> +<path d="M16.1943 39.6315C16.3206 38.8297 16.4469 38.0311 16.575 37.2293L16.6165 37.1965C16.4619 37.9853 16.3074 38.7741 16.1509 39.5628C16.1472 39.5595 16.1943 39.6315 16.1943 39.6315Z" fill="#FEFEFE"/> +<path d="M56.6893 33.1385C56.6252 32.9618 56.5668 32.7785 56.5102 32.5952C56.5724 32.5559 56.6705 32.4577 56.6912 32.4937C56.7741 32.6345 56.8325 32.8177 56.9004 32.9879C56.8307 33.037 56.7628 33.0828 56.6893 33.1385Z" fill="#FEFEFE"/> +<path d="M28.8185 29.1257C28.517 29.4006 28.2154 29.6723 27.9138 29.9472C28.0364 29.8261 28.1551 29.6853 28.2851 29.5872C28.4736 29.4432 28.6715 29.3319 28.8657 29.2075C28.8657 29.2108 28.8185 29.1257 28.8185 29.1257Z" fill="#FEFEFE"/> +<path d="M-11.9139 30.9258C-11.6161 30.5887 -11.3183 30.2483 -11.0206 29.9112C-10.9621 30.0749 -10.9037 30.2385 -10.8453 30.3989C-11.1845 30.5625 -11.5238 30.7229 -11.8631 30.8865L-11.9139 30.9258Z" fill="#FEFEFE"/> +<path d="M38.5196 29.2175C38.3726 29.3091 38.2464 29.3877 38.1201 29.4662C38.1351 29.2404 38.1351 29.0048 38.1747 28.7953C38.1879 28.7233 38.3519 28.6513 38.3651 28.684C38.4292 28.8378 38.4669 29.0244 38.5196 29.2175Z" fill="#FEFEFE"/> +<path d="M47.1674 19.7718C46.9544 20.2005 46.7414 20.6325 46.5284 21.0613C46.4643 20.878 46.4002 20.6914 46.3362 20.5082C46.6283 20.2823 46.9186 20.0565 47.2107 19.834L47.1674 19.7718Z" fill="#FEFEFE"/> +<path d="M26.5944 25.3685C26.4625 24.6255 26.3305 23.8826 26.1986 23.1396C26.4851 23.5913 26.7735 24.0462 27.0599 24.4979L27.0976 24.4782C26.928 24.7728 26.7565 25.0706 26.5869 25.3652L26.5944 25.3685Z" fill="#FEFEFE"/> +<path d="M37.8506 22.6327C37.73 22.6458 37.6037 22.6458 37.4793 22.6458C37.485 22.5508 37.4793 22.3807 37.4963 22.3741C37.6112 22.3283 37.73 22.3185 37.8468 22.2956C37.8468 22.4003 37.8468 22.5083 37.8506 22.6327Z" fill="#FEFEFE"/> +<path d="M18.9895 22.9204C18.7332 23.1004 18.4769 23.2771 18.2205 23.4571C18.2017 23.3458 18.1828 23.2346 18.164 23.1266C18.426 23.0873 18.6899 23.0513 18.9518 23.012L18.9895 22.9204Z" fill="#FEFEFE"/> +<path d="M-4.01656 21.9451C-4.0373 22.1578 -4.05803 22.3673 -4.08065 22.5735C-4.16923 22.472 -4.32002 22.3837 -4.33133 22.2626C-4.35017 22.0465 -4.28421 21.8044 -4.25405 21.5753C-4.173 21.6963 -4.09573 21.8174 -4.01656 21.9451Z" fill="#FEFEFE"/> +<path d="M28.3137 23.2707C28.4023 23.4147 28.4815 23.562 28.5606 23.7092C28.4721 23.8205 28.3891 23.9482 28.2911 24.0267C28.2704 24.0431 28.1554 23.8631 28.1648 23.8107C28.1912 23.6242 28.2553 23.4507 28.3137 23.2707Z" fill="#FEFEFE"/> +<path d="M47.1692 25.375C47.2314 24.7597 47.2936 24.1476 47.3558 23.5323L47.3181 23.516C48.8241 24.4913 47.0429 24.7531 47.1805 25.4306L47.1692 25.375Z" fill="#FEFEFE"/> +<path d="M-12.6468 23.7454C-12.9352 24.0793 -13.2217 24.4131 -13.5101 24.7469C-13.5402 24.6324 -13.5704 24.5178 -13.6006 24.4065C-13.2933 24.1807 -12.9842 23.9549 -12.677 23.7291L-12.6468 23.7454Z" fill="#FEFEFE"/> +<path d="M-10.0441 25.9675C-10.1421 26.0657 -10.2382 26.1508 -10.3343 26.2359C-10.3456 26.0198 -10.372 25.7973 -10.3607 25.5845C-10.3569 25.506 -10.2608 25.4405 -10.208 25.3718C-10.1534 25.5616 -10.0987 25.758 -10.0441 25.9675Z" fill="#FEFEFE"/> +<path d="M11.8537 26.1278C12.0761 25.9249 12.2985 25.722 12.519 25.519C12.5039 25.6041 12.4983 25.7481 12.47 25.7645C12.2815 25.8758 12.0874 25.9609 11.897 26.0525L11.8537 26.1278Z" fill="#FEFEFE"/> +<path d="M50.277 26.3899C50.294 26.4848 50.3373 26.6452 50.3241 26.6583C50.2563 26.7336 50.1733 26.7761 50.0979 26.8285C50.1093 26.7238 50.1036 26.6027 50.1356 26.5208C50.1601 26.4521 50.228 26.4325 50.277 26.3899Z" fill="#FEFEFE"/> +<path d="M57.5034 27.4338C57.4394 27.4108 57.379 27.3912 57.3206 27.3716C57.3545 27.1719 57.3828 26.969 57.4262 26.7759C57.4299 26.7563 57.5336 26.8054 57.5901 26.8217C57.5638 27.0279 57.5374 27.2308 57.5034 27.4338Z" fill="#FEFEFE"/> +<path d="M50.2883 18.8393C50.1073 19.1863 49.9264 19.5332 49.7454 19.8801C49.7002 19.7885 49.6531 19.7001 49.6078 19.6085C49.8472 19.3761 50.0866 19.147 50.326 18.9146L50.2883 18.8393Z" fill="#FEFEFE"/> +<path d="M11.2164 20.698C11.3898 20.3478 11.5651 19.9976 11.7385 19.6474C11.7705 19.7161 11.8045 19.7881 11.8365 19.8568C11.616 20.122 11.3955 20.3838 11.1731 20.6489L11.2164 20.698Z" fill="#FEFEFE"/> +<path d="M23.9579 30.0749C23.8053 30.9258 23.6526 31.7801 23.5018 32.6343C23.5056 32.6408 23.5433 32.7096 23.5452 32.7161C23.6714 31.839 23.794 30.9553 23.9165 30.0716C23.9165 30.0749 23.9579 30.0749 23.9579 30.0749Z" fill="#FEFEFE"/> +<path d="M24.7437 33.0009L24.8964 32.8405L24.9114 33.0205L24.7437 33.0009Z" fill="#FEFEFE"/> +<path d="M22.0147 18.1354C21.7414 18.1354 21.4662 18.1322 21.1929 18.1322C21.2514 17.8049 21.3079 17.4809 21.3663 17.1536C21.5699 17.5005 21.7735 17.8507 21.9751 18.1976L22.0147 18.1354Z" fill="#FEFEFE"/> +<path d="M-0.81212 16.666C-0.847933 17.0751 -0.885628 17.4875 -0.923323 17.8966C-0.976097 17.8312 -1.07788 17.7199 -1.07223 17.7035C-0.97987 17.3762 -0.876204 17.0588 -0.774424 16.738L-0.81212 16.666Z" fill="#FEFEFE"/> +<path d="M45.7912 35.7077C45.5688 36.1495 45.3464 36.5946 45.124 37.0365C45.0467 36.7812 44.9713 36.5259 44.8941 36.2673C45.2013 36.0971 45.5066 35.9302 45.8138 35.76L45.7912 35.7077Z" fill="#FEFEFE"/> +<path d="M41.0887 15.4975C41.4072 15.216 41.7238 14.9346 42.0424 14.6531C42.0612 14.8528 42.0801 15.0524 42.097 15.252C41.7653 15.3208 41.4336 15.3928 41.1019 15.4615L41.0887 15.4975Z" fill="#FEFEFE"/> +<path d="M-17.7379 14.1818C-17.687 14.6924 -17.6361 15.2029 -17.5871 15.7168C-17.7831 15.468 -17.981 15.216 -18.177 14.9673L-18.2053 15.0393C-18.0357 14.7447 -17.866 14.4534 -17.6964 14.1589L-17.7379 14.1818Z" fill="#FEFEFE"/> +<path d="M4.78362 15.848C4.93629 15.4291 5.08896 15.0102 5.23975 14.5912C5.29818 14.7091 5.35472 14.8301 5.41315 14.948C5.18886 15.2425 4.96456 15.5338 4.74027 15.8284C4.74027 15.8251 4.78362 15.848 4.78362 15.848Z" fill="#FEFEFE"/> +<path d="M39.1191 45.3953C39.1398 44.8979 39.1586 44.4004 39.1794 43.9029C39.3 43.9618 39.4206 44.0207 39.5431 44.0796C39.3886 44.4986 39.234 44.9175 39.0776 45.3331L39.1191 45.3953Z" fill="#FEFEFE"/> +<path d="M23.7636 13.0987C23.7542 13.0332 23.7447 12.9645 23.7353 12.8925C23.8107 12.9579 23.8861 13.0266 23.9615 13.0921C23.8955 13.0921 23.8295 13.0921 23.7636 13.0987Z" fill="#FEFEFE"/> +<path d="M7.9446 48.5767C7.92199 48.9825 7.89936 49.3916 7.87675 49.8007L7.91256 49.7222C7.67696 49.3589 7.44136 48.9956 7.20576 48.6323C7.45644 48.6454 7.70523 48.6552 7.95591 48.6618C7.95591 48.6552 7.9446 48.5767 7.9446 48.5767Z" fill="#FEFEFE"/> +<path d="M43.2411 12.1035C43.1337 12.2704 43.0281 12.4275 42.9245 12.5846C42.8547 12.4275 42.7058 12.1984 42.7266 12.1264C42.7869 11.9366 42.9075 11.7664 43.0263 11.6879C43.0658 11.6617 43.1714 11.9464 43.2411 12.1035Z" fill="#FEFEFE"/> +<path d="M28.3834 49.4274L28.3288 49.5649L28.2213 49.4961L28.3834 49.4274Z" fill="#FEFEFE"/> +<path d="M30.4263 10.3101C30.5507 10.5163 30.7204 10.7291 30.7053 10.7814C30.6167 11.0923 30.4829 11.364 30.3641 11.652C30.2548 11.472 30.0324 11.2003 30.0531 11.1283C30.1342 10.8272 30.2887 10.5883 30.4263 10.3101Z" fill="#FEFEFE"/> +<path d="M-11.4032 11.1578C-11.4899 11.3574 -11.6143 11.724 -11.6576 11.6945C-11.8084 11.6029 -11.9309 11.3738 -12.0628 11.1971C-11.9422 11.0563 -11.8272 10.8338 -11.6953 10.7978C-11.6105 10.7749 -11.5012 11.0171 -11.4032 11.1578Z" fill="#FEFEFE"/> +<path d="M7.8767 49.8006C8.04445 50.1574 8.2122 50.5141 8.37995 50.8708C8.27817 50.9461 8.17827 51.0181 8.07649 51.0934C8.02184 50.6385 7.96717 50.1836 7.91251 49.7286C7.9144 49.7221 7.8767 49.8006 7.8767 49.8006Z" fill="#FEFEFE"/> +<path d="M2.79536 7.75737C2.98008 7.4039 3.16667 7.05044 3.35138 6.69697C3.15159 7.02752 2.94992 7.35809 2.75013 7.68864L2.79536 7.75737Z" fill="#FEFEFE"/> +<path d="M-4.88725 7.06996C-5.67698 6.52994 -5.56577 5.99319 -4.88348 5.45971L-4.93814 5.41389C-4.94002 5.98337 -4.9419 6.54957 -4.94379 7.11905L-4.88725 7.06996Z" fill="#FEFEFE"/> +<path d="M56.8589 5.79694C56.8344 5.89186 56.8231 6.01295 56.7835 6.07841C56.7421 6.14714 56.6704 6.16351 56.612 6.20278C56.6346 6.04895 56.6478 5.88859 56.6855 5.74458C56.6931 5.72167 56.7986 5.77731 56.8589 5.79694Z" fill="#FEFEFE"/> +<path d="M44.4681 6.18933C44.5134 5.74749 44.5586 5.30565 44.6057 4.86382C44.6905 5.33838 44.7772 5.81295 44.8621 6.28752L44.9016 6.21878C44.7471 6.18933 44.5944 6.15987 44.4399 6.13042L44.4681 6.18933Z" fill="#FEFEFE"/> +<path d="M23.4733 6.27481C23.5995 5.85589 23.7258 5.43696 23.8521 5.01803C23.903 5.0704 23.9558 5.12276 24.0067 5.17513C23.8144 5.51551 23.6222 5.85589 23.428 6.19626L23.4733 6.27481Z" fill="#FEFEFE"/> +<path d="M32.102 4.0688C31.8495 3.77752 31.5969 3.48623 31.3443 3.19495C31.5215 3.01821 31.7006 2.8382 31.8777 2.66147C31.9456 3.1033 32.0115 3.54842 32.0794 3.99025L32.102 4.0688Z" fill="#FEFEFE"/> +<path d="M-17.7001 3.84928C-18.0149 3.83291 -18.3315 3.81655 -18.6463 3.79691L-18.6256 3.84273C-18.586 3.41398 -18.5464 2.98851 -18.5068 2.55976C-18.2505 3.01142 -17.996 3.46308 -17.7397 3.91146C-17.7378 3.91473 -17.7001 3.84928 -17.7001 3.84928Z" fill="#FEFEFE"/> +<path d="M37.6301 0.625587C37.9223 0.42267 38.2144 0.223024 38.5066 0.0201073C38.5254 0.134657 38.5424 0.249208 38.5612 0.36376C38.2427 0.432489 37.9223 0.497946 37.6038 0.566677L37.6301 0.625587Z" fill="#FEFEFE"/> +<path d="M35.7886 -0.0517712C35.4663 -0.0419521 35.144 -0.035408 34.8217 -0.025589C34.9782 -0.310329 35.1346 -0.595068 35.2929 -0.879808L35.3042 -0.860172C35.4607 -0.581978 35.6171 -0.303783 35.7736 -0.025589L35.7886 -0.0517712Z" fill="#FEFEFE"/> +<path d="M24.1784 0.137833C24.0577 0.242565 23.9428 0.36039 23.8184 0.40621C23.792 0.416029 23.6827 0.0723763 23.6977 0.0461941C23.7939 -0.117451 23.9164 -0.238546 24.0295 -0.372734C24.0785 -0.202543 24.1294 -0.0389023 24.1784 0.137833Z" fill="#FEFEFE"/> +<path d="M9.78401 -0.670538C9.6615 0.530605 9.3882 1.12299 8.72287 0.11495C8.72098 0.121496 8.69271 0.20332 8.69082 0.209864C9.0527 -0.0552387 9.41459 -0.326887 9.77835 -0.598536L9.78401 -0.670538Z" fill="#FEFEFE"/> +<path d="M49.9474 -0.929148C49.7061 -0.893147 49.463 -0.860418 49.2217 -0.824417C49.4611 -1.09279 49.7004 -1.35789 49.9398 -1.62627L49.8984 -1.695C49.9002 -1.42008 49.9021 -1.14189 49.904 -0.866964L49.9474 -0.929148Z" fill="#FEFEFE"/> +<path d="M27.0733 -1.76687C27.2694 -1.67523 27.4635 -1.58359 27.6595 -1.49195C27.4616 -1.56396 27.2637 -1.63596 27.0658 -1.70796L27.0733 -1.76687Z" fill="#FEFEFE"/> +<path d="M49.9417 -1.62608C50.0397 -2.04174 50.1358 -2.45739 50.2338 -2.87304C50.3262 -2.7094 50.4204 -2.54249 50.5128 -2.37884C50.3092 -2.14974 50.1057 -1.92391 49.9021 -1.69481L49.9417 -1.62608Z" fill="#FEFEFE"/> +<path d="M41.3301 -2.51289C41.3885 -2.59471 41.4413 -2.66672 41.494 -2.74199C41.5487 -2.55544 41.6109 -2.37543 41.6505 -2.17906C41.6561 -2.15615 41.5468 -2.06124 41.4903 -1.99905C41.4356 -2.16597 41.3791 -2.33616 41.3301 -2.51289Z" fill="#FEFEFE"/> +<path d="M-23.298 -3.62589C-23.411 -3.51134 -23.5222 -3.40989 -23.6334 -3.30515C-23.673 -3.51462 -23.7729 -3.7699 -23.7352 -3.92045C-23.6919 -4.09719 -23.5279 -4.18555 -23.4148 -4.3132C-23.3752 -4.08737 -23.3356 -3.86154 -23.298 -3.62589Z" fill="#FEFEFE"/> +<path d="M-0.998787 -4.87932C-1.11376 -4.84986 -1.22873 -4.83022 -1.34371 -4.81058C-1.34936 -4.92513 -1.37009 -5.13787 -1.35878 -5.14114C-1.2457 -5.19024 -1.12884 -5.2066 -1.01198 -5.23279C-1.00821 -5.11824 -1.00256 -5.00368 -0.998787 -4.87932Z" fill="#FEFEFE"/> +<path d="M52.9063 -5.41613C52.8083 -5.32121 52.7084 -5.23612 52.6067 -5.14775C52.6067 -5.24267 52.5859 -5.3834 52.6142 -5.42595C52.6934 -5.54704 52.7914 -5.62559 52.8818 -5.7205C52.8894 -5.61905 52.8969 -5.52086 52.9063 -5.41613Z" fill="#FEFEFE"/> +<path d="M38.5968 -5.44568C38.0861 -5.50786 37.5772 -5.56677 37.0664 -5.62896L37.0211 -5.62241C37.5376 -5.53732 38.054 -5.45222 38.5686 -5.3704L38.5968 -5.44568Z" fill="#FEFEFE"/> +<path d="M-23.0795 -6.25732C-23.1869 -6.34569 -23.3735 -6.43733 -23.3735 -6.53224C-23.3735 -6.73843 -23.2812 -6.94463 -23.2265 -7.15082C-23.0927 -7.02972 -22.9589 -6.90862 -22.825 -6.78753C-22.908 -6.61407 -22.9909 -6.43733 -23.0795 -6.25732Z" fill="#FEFEFE"/> +<path d="M51.4985 -7.40577C51.4626 -7.61196 51.4005 -7.8247 51.4193 -8.01125C51.4287 -8.10616 51.587 -8.15526 51.6775 -8.22399C51.6926 -8.11598 51.7378 -7.98507 51.7152 -7.90979C51.6624 -7.72979 51.5795 -7.57269 51.4985 -7.40577Z" fill="#FEFEFE"/> +<path d="M57.0492 -18.0066C56.9851 -18.1703 56.8739 -18.3536 56.8871 -18.5008C56.9022 -18.6874 57.0209 -18.851 57.0944 -19.0212C57.1698 -18.8576 57.3149 -18.6743 57.3018 -18.5401C57.2791 -18.347 57.1434 -18.1834 57.0492 -18.0066Z" fill="#FEFEFE"/> +<path d="M56.5252 -9.06851C56.9003 -9.25506 57.2754 -9.44162 57.6486 -9.62817L57.6052 -9.70999C57.2923 -9.28452 57.249 -7.53026 56.5403 -9.05869C56.5384 -9.05869 56.5252 -9.06851 56.5252 -9.06851Z" fill="#FEFEFE"/> +<path d="M20.4822 -8.21128C20.3069 -8.00836 20.141 -7.81526 19.9752 -7.62216C19.9186 -7.8349 19.781 -8.16218 19.8187 -8.24073C19.9337 -8.4862 20.1165 -8.63675 20.2711 -8.82658C20.3352 -8.6433 20.3974 -8.46002 20.4822 -8.21128Z" fill="#FEFEFE"/> +<path d="M-5.31706 -15.9251C-5.37172 -15.8564 -5.45842 -15.732 -5.46408 -15.7419C-5.53758 -15.8793 -5.60167 -16.0364 -5.66575 -16.187C-5.61674 -16.2492 -5.53004 -16.3768 -5.52439 -16.3637C-5.44711 -16.2328 -5.38115 -16.079 -5.31706 -15.9251Z" fill="#FEFEFE"/> +<path d="M1.81496 -15.395C2.19946 -15.7452 2.58396 -16.0921 2.96657 -16.4489C2.96469 -16.4554 2.94395 -16.5274 2.94395 -16.5274C2.55757 -16.174 2.1693 -15.8205 1.78292 -15.467L1.81496 -15.395Z" fill="#FEFEFE"/> +<path d="M54.1598 -16.4621C53.8978 -16.2985 53.6339 -16.1348 53.3719 -15.9712C53.3493 -16.1381 53.3286 -16.3083 53.306 -16.4752C53.5849 -16.4523 53.8639 -16.4261 54.1428 -16.4032C54.1428 -16.4065 54.1598 -16.4621 54.1598 -16.4621Z" fill="#FEFEFE"/> +<path d="M36.0788 -9.52027C36.1863 -9.94247 36.2956 -10.3679 36.403 -10.7901C36.305 -10.3974 36.2089 -10.0079 36.1109 -9.61518L36.0788 -9.52027Z" fill="#FEFEFE"/> +<path d="M57.5487 -13.6607C57.5355 -13.3138 57.5204 -12.9669 57.5072 -12.6167C57.5373 -12.9767 57.5675 -13.3334 57.5977 -13.6935L57.5487 -13.6607Z" fill="#FEFEFE"/> +<path d="M54.3351 -13.0355C54.5971 -13.1631 54.8591 -13.294 55.1192 -13.4217C55.1173 -13.3006 55.1173 -13.1795 55.1154 -13.0551C54.8478 -13.0682 54.5783 -13.078 54.3106 -13.0911L54.3351 -13.0355Z" fill="#FEFEFE"/> +<path d="M50.9781 -12.4332C51.0158 -12.6328 51.0516 -12.8292 51.0893 -13.0288C51.0384 -12.8259 50.9856 -12.6197 50.9348 -12.4168L50.9781 -12.4332Z" fill="#FEFEFE"/> +<path d="M40.2894 -13.3495C40.4044 -13.3463 40.5193 -13.3463 40.6343 -13.343C40.5156 -13.3724 40.3968 -13.4019 40.2781 -13.4313L40.2894 -13.3495Z" fill="#FEFEFE"/> +<path d="M31.3217 -12.371C31.5969 -12.9699 31.8721 -13.5721 32.1491 -14.1711L32.1472 -14.2529C31.8683 -13.6507 31.5912 -13.0517 31.3142 -12.443C31.316 -12.4332 31.3217 -12.371 31.3217 -12.371Z" fill="#FEFEFE"/> +<path d="M-12.9109 -13.3561L-12.8732 -13.0616L-12.9957 -13.1041L-12.9109 -13.3561Z" fill="#FEFEFE"/> +<path d="M49.0105 -13.6247C49.0689 -13.9585 49.1274 -14.289 49.1858 -14.6229C49.2593 -14.5312 49.3309 -14.4429 49.4044 -14.3512C49.2612 -14.1287 49.1161 -13.9094 48.9728 -13.6868L49.0105 -13.6247Z" fill="#FEFEFE"/> +<path d="M16.7222 -14.8647C16.7109 -14.4097 16.7014 -13.9515 16.6901 -13.4966L16.6468 -13.5555C16.6694 -13.9712 16.6939 -14.3868 16.7165 -14.8058L16.7222 -14.8647Z" fill="#FEFEFE"/> +<path d="M8.25927 -15.2052C8.25927 -14.8681 8.25927 -14.5277 8.25927 -14.1906C8.19519 -14.22 8.1311 -14.2495 8.06702 -14.2789C8.14618 -14.5637 8.22723 -14.8517 8.30639 -15.1364L8.25927 -15.2052Z" fill="#FEFEFE"/> +<path d="M8.30621 -15.1365C8.31187 -15.4409 8.31752 -15.7485 8.32317 -16.0529L8.31187 -16.1347C8.43438 -15.9056 8.55501 -15.6765 8.67563 -15.4474C8.53616 -15.3656 8.39857 -15.2838 8.25909 -15.2052L8.30621 -15.1365Z" fill="#FEFEFE"/> +<path d="M-22.2499 -9.94897C-22.3046 -9.8966 -22.3875 -9.77551 -22.4102 -9.80169C-22.4931 -9.90315 -22.5572 -10.057 -22.6288 -10.1879C-22.5251 -10.2075 -22.4196 -10.2501 -22.3178 -10.2337C-22.2914 -10.2304 -22.2726 -10.0504 -22.2499 -9.94897Z" fill="#FEFEFE"/> +<path d="M6.79655 -16.3867C6.8531 -16.3474 6.91153 -16.3049 6.96807 -16.2656C6.93415 -16.1674 6.91153 -16.0332 6.86253 -15.9907C6.83048 -15.9612 6.75886 -16.0594 6.7042 -16.0987C6.73436 -16.1936 6.76451 -16.2918 6.79655 -16.3867Z" fill="#FEFEFE"/> +<path d="M-6.48004 -9.14384C-6.54977 -9.11766 -6.61762 -9.09475 -6.68736 -9.06856C-6.69302 -9.25512 -6.69867 -9.4384 -6.70433 -9.62495C-6.63836 -9.57913 -6.55166 -9.56604 -6.51208 -9.48094C-6.47438 -9.40567 -6.48946 -9.25839 -6.48004 -9.14384Z" fill="#FEFEFE"/> +<path d="M16.9688 -9.54967C17.1384 -9.02274 17.3081 -8.49908 17.4777 -7.97215L17.4607 -8.00487C17.3118 -8.5449 17.1648 -9.08165 17.0159 -9.62167C17.0159 -9.62495 16.9688 -9.54967 16.9688 -9.54967Z" fill="#FEFEFE"/> +<path d="M9.51649 -18.9952C9.49576 -19.1949 9.47126 -19.388 9.47691 -19.5811C9.4788 -19.6236 9.61639 -19.7152 9.64278 -19.6792C9.72382 -19.5647 9.78225 -19.401 9.84822 -19.257C9.74079 -19.1654 9.63147 -19.077 9.51649 -18.9952Z" fill="#FEFEFE"/> +<path d="M30.5998 -7.15744C30.7638 -7.60582 30.9278 -8.05748 31.0936 -8.50913C31.0955 -8.51241 31.1219 -8.45022 31.1219 -8.45022C30.9598 -8.04766 30.7977 -7.6451 30.6375 -7.24253L30.5998 -7.15744Z" fill="#FEFEFE"/> +<path d="M-20.4859 -8.07383C-20.631 -7.89709 -20.7761 -7.72036 -20.9212 -7.54362C-20.7686 -7.74654 -20.614 -7.94618 -20.4614 -8.1491L-20.4859 -8.07383Z" fill="#FEFEFE"/> +<path d="M43.3956 -5.593C43.7914 -5.70755 44.1872 -5.8221 44.583 -5.93992L44.5622 -5.99229C44.1891 -5.87119 43.8177 -5.74682 43.4446 -5.62573L43.3956 -5.593Z" fill="#FEFEFE"/> +<path d="M-19.0648 -4.09381C-19.2854 -4.29018 -19.504 -4.48983 -19.7245 -4.6862C-19.6736 -4.78111 -19.6246 -4.87275 -19.5737 -4.96767C-19.4192 -4.6502 -19.2627 -4.33273 -19.1082 -4.01526C-19.1063 -4.01853 -19.0648 -4.09381 -19.0648 -4.09381Z" fill="#FEFEFE"/> +<path d="M9.67286 -4.85965C9.53715 -4.7811 9.40144 -4.70582 9.26574 -4.62727C9.26197 -4.94474 9.25631 -5.26548 9.25254 -5.58295L9.21485 -5.67132C9.38448 -5.37676 9.55411 -5.0822 9.72374 -4.78764L9.67286 -4.85965Z" fill="#FEFEFE"/> +<path d="M15.6873 -1.75379C15.7608 -2.02544 15.8343 -2.29709 15.906 -2.56874C15.921 -2.46728 15.9663 -2.32327 15.9437 -2.27745C15.8626 -2.10399 15.759 -1.96325 15.6628 -1.80943L15.6873 -1.75379Z" fill="#FEFEFE"/> +<path d="M-20.3256 -1.04345C-20.2314 -1.13836 -20.1353 -1.22018 -20.0391 -1.302C-20.0222 -1.19727 -19.9713 -1.02708 -19.992 -0.997625C-20.075 -0.873257 -20.1786 -0.791433 -20.2747 -0.693247C-20.2898 -0.807796 -20.3068 -0.919077 -20.3256 -1.04345Z" fill="#FEFEFE"/> +<path d="M-11.8422 -1.38704C-11.7763 -1.31177 -11.7178 -1.24631 -11.6575 -1.17758C-11.7518 -1.00412 -11.8403 -0.824108 -11.944 -0.667011C-11.9515 -0.653919 -12.042 -0.804472 -12.0948 -0.879747C-12.0119 -1.04994 -11.9289 -1.22013 -11.8422 -1.38704Z" fill="#FEFEFE"/> +<path d="M-0.810616 -1.63265C-1.01417 -1.325 -1.21773 -1.01735 -1.42318 -0.706425C-1.46464 -0.886433 -1.50611 -1.06317 -1.54757 -1.24318C-1.28936 -1.35445 -1.03302 -1.46246 -0.774805 -1.57374L-0.810616 -1.63265Z" fill="#FEFEFE"/> +<path d="M21.3925 0.183538C21.3453 -0.480854 21.3001 -1.14852 21.2549 -1.81291L21.2172 -1.88492C21.2681 -1.20416 21.319 -0.523401 21.3698 0.157356L21.3925 0.183538Z" fill="#FEFEFE"/> +<path d="M-3.39649 -0.585178C-3.54162 -0.382259 -3.68863 -0.179342 -3.83376 0.0235767C-3.6924 -0.159704 -3.55293 -0.342983 -3.41345 -0.529537C-3.41534 -0.529537 -3.39649 -0.585178 -3.39649 -0.585178Z" fill="#FEFEFE"/> +<path d="M32.5166 0.625458C32.5713 0.396358 32.592 0.157438 32.5807 -0.088026L32.5317 -0.0291157C32.6994 -0.3204 32.8672 -0.611687 33.0368 -0.902973L32.9878 -0.834242C33.1537 -0.834242 33.3214 -0.837515 33.4892 -0.837515L33.4477 -0.889883C33.1424 -0.412043 32.8351 0.0657978 32.5298 0.543636L32.5166 0.625458Z" fill="#FEFEFE"/> +<path d="M-20.6406 1.80709L-20.6934 2.07874L-20.7556 1.85291L-20.6406 1.80709Z" fill="#FEFEFE"/> +<path d="M-15.951 2.14424C-15.9717 2.24243 -15.9943 2.33734 -16.0151 2.43553C-16.0697 2.33734 -16.1244 2.23915 -16.179 2.14097C-16.1395 2.07878 -16.1018 1.97405 -16.0565 1.96423C-16.0283 1.95441 -15.9868 2.07878 -15.951 2.14424Z" fill="#FEFEFE"/> +<path d="M7.59748 3.41423C7.72187 3.04112 7.84627 2.66474 7.97255 2.29163C8.02533 2.36364 8.07622 2.43237 8.12899 2.50437C7.94239 2.81202 7.7558 3.12294 7.56921 3.43059L7.59748 3.41423Z" fill="#FEFEFE"/> +<path d="M50.9462 3.14901C51.2195 2.87409 51.4928 2.60244 51.7661 2.32752L51.7303 2.25879C51.4551 2.53371 51.1799 2.8119 50.9029 3.08682C50.901 3.08682 50.9462 3.14901 50.9462 3.14901Z" fill="#FEFEFE"/> +<path d="M50.3731 3.9969C50.0564 4.22927 49.7398 4.45838 49.4213 4.69075L49.4665 4.77257C49.7813 4.5402 50.0941 4.30783 50.4089 4.07545L50.3731 3.9969Z" fill="#FEFEFE"/> +<path d="M-15.4026 6.29757C-15.3366 5.98665 -15.2725 5.67573 -15.2065 5.36153C-15.1387 5.66263 -15.0708 5.96701 -15.003 6.26812C-15.003 6.26812 -14.9559 6.23211 -14.954 6.23211C-15.1217 6.23211 -15.2895 6.22884 -15.4572 6.22884L-15.4026 6.29757Z" fill="#FEFEFE"/> +<path d="M-23.5072 5.17178C-23.5261 5.2536 -23.5468 5.33542 -23.5656 5.41724C-23.6165 5.36815 -23.6806 5.33214 -23.7164 5.25687C-23.7315 5.22741 -23.6844 5.10959 -23.6636 5.03104C-23.6109 5.07686 -23.5581 5.12596 -23.5072 5.17178Z" fill="#FEFEFE"/> +<path d="M23.4301 6.19608C23.1248 6.7361 22.8195 7.27285 22.5141 7.81288L22.5349 7.84233C22.8477 7.31867 23.1606 6.79829 23.4754 6.27463C23.4735 6.27463 23.4301 6.19608 23.4301 6.19608Z" fill="#FEFEFE"/> +<path d="M39.3848 6.23876C39.2793 6.5955 39.1737 6.95224 39.0701 7.30899C39.0173 7.22389 38.9645 7.1388 38.9117 7.05043C39.0776 6.79842 39.2453 6.54313 39.4112 6.29112L39.3848 6.23876Z" fill="#FEFEFE"/> +<path d="M8.22539 8.51316C8.38937 8.34625 8.55335 8.17933 8.71732 8.01241C8.74371 8.10078 8.77198 8.18915 8.79837 8.27751C8.6212 8.33643 8.44215 8.39206 8.26497 8.45098L8.22539 8.51316Z" fill="#FEFEFE"/> +<path d="M40.6437 10.3428C40.5928 10.2938 40.542 10.2447 40.4911 10.1923C40.5721 10.1367 40.6532 10.0843 40.7342 10.0287C40.7041 10.1334 40.6739 10.2381 40.6437 10.3428Z" fill="#FEFEFE"/> +<path d="M17.6549 10.0056C17.604 10.5719 17.5512 11.1348 17.5003 11.701L17.5324 11.7632C17.5814 11.1839 17.6323 10.6079 17.6813 10.0286L17.6549 10.0056Z" fill="#FEFEFE"/> +<path d="M-0.819799 49.8593C-0.488073 49.4339 -0.154463 49.0084 0.177263 48.5796C0.177263 48.5764 0.182917 48.5142 0.182917 48.5142C-0.148808 48.9429 -0.478651 49.3717 -0.810375 49.8004L-0.819799 49.8593Z" fill="#FEFEFE"/> +<path d="M-10.4396 48.3343C-10.5075 48.547 -10.5754 48.7597 -10.6413 48.9725C-10.7035 48.8383 -10.7638 48.7008 -10.826 48.5666C-10.6866 48.5077 -10.549 48.4455 -10.4095 48.3866L-10.4396 48.3343Z" fill="#FEFEFE"/> +<path d="M49.674 12.4308C49.6288 12.2279 49.576 12.0283 49.5741 11.8286C49.5741 11.7763 49.74 11.7108 49.8324 11.6846C49.8437 11.6813 49.9096 11.917 49.8889 11.9857C49.8399 12.1559 49.7551 12.2901 49.674 12.4308Z" fill="#FEFEFE"/> +<path d="M48.166 47.3558C48.2056 47.6962 48.249 48.0366 48.2772 48.3802C48.2791 48.3966 48.1528 48.4424 48.0869 48.4751C48.1246 48.1249 48.1642 47.7747 48.2018 47.4245L48.166 47.3558Z" fill="#FEFEFE"/> +<path d="M54.4783 46.6194C54.4576 46.5212 54.4369 46.423 54.4161 46.3248C54.4802 46.2888 54.5462 46.2201 54.6065 46.2332C54.6329 46.2397 54.6498 46.4034 54.6725 46.4983C54.6065 46.5376 54.5424 46.5801 54.4783 46.6194Z" fill="#FEFEFE"/> +<path d="M28.796 44.6555C28.9242 44.698 29.0523 44.7373 29.1824 44.7798C29.0542 44.7176 28.9242 44.6587 28.7998 44.59C28.7998 44.5835 28.796 44.6555 28.796 44.6555Z" fill="#FEFEFE"/> +<path d="M-23.5468 45.104C-23.6015 45.3265 -23.6316 45.6015 -23.7259 45.7193C-23.7805 45.788 -23.9389 45.5982 -24.052 45.5262C-23.9992 45.3102 -23.9766 45.0287 -23.8823 44.8978C-23.8333 44.8291 -23.6637 45.0189 -23.5468 45.104Z" fill="#FEFEFE"/> +<path d="M14.9994 12.2904C15.0597 12.9155 15.1219 13.5373 15.1822 14.1624L15.2255 14.0937C15.1615 13.5177 15.0993 12.9384 15.0314 12.3525C15.0276 12.346 14.9994 12.2904 14.9994 12.2904Z" fill="#FEFEFE"/> +<path d="M-8.80571 41.6149C-8.7322 42.0567 -8.65681 42.4985 -8.5833 42.9404C-8.6455 42.9535 -8.70958 42.9633 -8.77178 42.9764C-8.78309 42.5313 -8.79251 42.0829 -8.80571 41.6345C-8.80571 41.6312 -8.80571 41.6149 -8.80571 41.6149Z" fill="#FEFEFE"/> +<path d="M15.6175 40.3878C15.4027 40.8166 15.1897 41.242 14.9748 41.6708C14.9371 41.5595 14.8636 41.3566 14.8693 41.35C15.1256 41.0391 15.3876 40.7445 15.6496 40.45L15.6175 40.3878Z" fill="#FEFEFE"/> +<path d="M9.6332 16.2207C9.59551 16.3026 9.56347 16.4237 9.51635 16.4531C9.48242 16.4728 9.42399 16.3647 9.37498 16.3157C9.43341 16.1946 9.49184 16.0735 9.55027 15.9524C9.57854 16.0407 9.60682 16.1324 9.6332 16.2207Z" fill="#FEFEFE"/> +<path d="M26.0783 38.6269C26.2988 38.2833 26.5193 37.9396 26.7398 37.596L26.7568 37.5567C26.5174 37.884 26.2762 38.2145 26.0387 38.5484C26.0424 38.5516 26.0783 38.6269 26.0783 38.6269Z" fill="#FEFEFE"/> +<path d="M46.4943 16.1358C46.5509 16.0867 46.6508 15.982 46.6564 15.9984C46.7073 16.1194 46.7412 16.2635 46.7808 16.4009C46.7148 16.4009 46.6413 16.4336 46.5867 16.3878C46.5452 16.3518 46.5264 16.2242 46.4943 16.1358Z" fill="#FEFEFE"/> +<path d="M32.1188 37.236C32.4675 36.7909 32.8181 36.349 33.1706 35.9104C33.1724 35.9137 33.1329 35.845 33.1366 35.8515C32.7861 36.2966 32.4336 36.7352 32.0811 37.1705L32.1188 37.236Z" fill="#FEFEFE"/> +<path d="M56.8438 16.7017C56.6855 16.8261 56.5272 16.9472 56.3688 17.0715C56.3858 16.9897 56.3971 16.8392 56.4216 16.8326C56.5479 16.7901 56.6798 16.7868 56.8099 16.7672L56.8438 16.7017Z" fill="#FEFEFE"/> +<path d="M48.3827 35.0891C48.2659 34.9091 48.149 34.729 48.0303 34.549C48.0849 34.5229 48.1792 34.4574 48.1867 34.4803C48.2489 34.6636 48.296 34.8632 48.3488 35.0531L48.3827 35.0891Z" fill="#FEFEFE"/> +<path d="M39.1738 34.7848L39.2624 34.6113L39.2888 34.8077L39.1738 34.7848Z" fill="#FEFEFE"/> +<path d="M50.2883 33.135C50.4184 33.2103 50.5409 33.2888 50.6634 33.3707C50.6031 33.567 50.5616 33.878 50.4749 33.927C50.3712 33.986 50.2242 33.8158 50.0979 33.747C50.1583 33.5441 50.2186 33.3412 50.2883 33.135Z" fill="#FEFEFE"/> +<path d="M43.9856 32.9258C43.946 33.0239 43.9121 33.1156 43.8782 33.2039C43.8009 33.0959 43.7161 32.9978 43.6539 32.8668C43.6388 32.8341 43.7067 32.6868 43.7368 32.5919C43.8216 32.6999 43.9064 32.8079 43.9856 32.9258Z" fill="#FEFEFE"/> +<path d="M34.4524 34.1367C34.4995 33.8192 34.5467 33.4985 34.5938 33.181C34.7012 33.3087 34.8068 33.433 34.9142 33.5607C34.7446 33.7309 34.5749 33.8978 34.4072 34.068C34.4072 34.0647 34.4524 34.1367 34.4524 34.1367Z" fill="#FEFEFE"/> +<path d="M-7.93314 33.4494C-7.84832 33.2432 -7.77104 33.024 -7.67303 32.8439C-7.64665 32.7948 -7.5524 32.8603 -7.48832 32.8734C-7.6523 33.0534 -7.81439 33.2334 -7.97837 33.4134L-7.93314 33.4494Z" fill="#FEFEFE"/> +<path d="M42.2912 31.2011C42.2064 31.3058 42.1235 31.4138 42.0387 31.5186C42.116 31.4269 42.1951 31.3386 42.2724 31.2469L42.2912 31.2011Z" fill="#FEFEFE"/> +<path d="M30.3095 28.5464C29.8138 28.7428 29.3162 28.9359 28.8205 29.129C28.8186 29.1257 28.8658 29.2108 28.8639 29.2075C28.8676 28.985 28.8884 28.769 28.9261 28.5562L28.9016 28.6086C29.3803 28.6086 29.8609 28.6086 30.3397 28.6119C30.3416 28.6119 30.3095 28.5464 30.3095 28.5464Z" fill="#FEFEFE"/> +<path d="M37.1816 28.2161C37.076 28.2881 37.0195 28.3273 36.9611 28.3633C36.9422 28.2684 36.9215 28.1768 36.9026 28.0819C36.9837 28.1211 37.0628 28.1604 37.1816 28.2161Z" fill="#FEFEFE"/> +<path d="M31.1785 19.0029C31.056 19.2156 30.9316 19.4284 30.8091 19.6411C30.762 19.4906 30.7168 19.34 30.6696 19.1927C30.8525 19.1502 31.0334 19.1076 31.2162 19.0651L31.1785 19.0029Z" fill="#FEFEFE"/> +<path d="M27.0585 24.498C26.9039 24.7861 26.7494 25.0741 26.5929 25.3653C26.5929 25.3686 26.5854 25.3653 26.5854 25.3653C26.755 25.0708 26.9265 24.773 27.0962 24.4784L27.0585 24.498Z" fill="#FEFEFE"/> +<path d="M52.8067 24.6288C52.8105 24.367 52.8123 24.1084 52.8161 23.8466C52.8821 23.8826 52.9481 23.9219 53.014 23.9579C52.9292 24.1706 52.8463 24.3834 52.7615 24.5961L52.8067 24.6288Z" fill="#FEFEFE"/> +<path d="M4.42376 23.516C4.469 23.6011 4.5557 23.7222 4.54439 23.7549C4.4935 23.9284 4.41622 24.0822 4.35026 24.2425C4.29937 24.1673 4.20136 24.0462 4.20701 24.0265C4.26921 23.8465 4.34648 23.6796 4.42376 23.516Z" fill="#FEFEFE"/> +<path d="M11.1752 20.6491C10.8322 20.5902 10.491 20.528 10.148 20.4691L10.1329 20.3905C10.4929 20.4887 10.8529 20.5902 11.2148 20.6916C11.2167 20.6982 11.1752 20.6491 11.1752 20.6491Z" fill="#FEFEFE"/> +<path d="M58.9585 20.4264C58.8888 20.7079 58.8191 20.9893 58.7493 21.2675C58.6984 21.2119 58.6475 21.1563 58.5966 21.1006C58.7305 20.8977 58.8643 20.6915 59 20.4919C59 20.4984 58.9585 20.4264 58.9585 20.4264Z" fill="#FEFEFE"/> +<path d="M34.4126 22.8877C34.1827 22.963 33.9528 23.0383 33.7228 23.1136C33.9452 22.8059 34.1676 22.4983 34.39 22.1939L34.3523 22.1252C34.3561 22.4034 34.3618 22.6848 34.3655 22.963L34.4126 22.8877Z" fill="#FEFEFE"/> +<path d="M-19.8336 -19.9772L-19.7242 -19.9805L-19.7789 -19.7448L-19.8336 -19.9772Z" fill="#FEFEFE"/> +<path d="M21.1381 -18.8837C21.1249 -19.2176 21.1117 -19.5547 21.0985 -19.8885L21.0777 -19.9081C21.0872 -19.5939 21.0947 -19.2797 21.1041 -18.9655L21.1381 -18.8837Z" fill="#FEFEFE"/> +<path d="M31.4857 -19.5647L31.661 -19.6465L31.6403 -19.4141L31.4857 -19.5647Z" fill="#FEFEFE"/> +<path d="M6.02392 -19.1031C5.95041 -18.946 5.87879 -18.7856 5.80528 -18.6285C5.81659 -18.7202 5.81282 -18.8413 5.84486 -18.9002C5.89386 -18.982 5.96737 -19.0213 6.03145 -19.0769L6.02392 -19.1031Z" fill="#FEFEFE"/> +<path d="M-8.23086 -17.863C-8.28363 -17.8008 -8.33641 -17.7354 -8.3873 -17.6732C-8.42688 -17.8238 -8.46458 -17.9743 -8.50416 -18.1249C-8.4363 -18.1412 -8.35714 -18.2067 -8.30625 -18.1641C-8.26479 -18.1281 -8.25536 -17.9678 -8.23086 -17.863Z" fill="#FEFEFE"/> +<path d="M2.81973 -18.5078C2.85931 -17.8532 2.89889 -17.1954 2.94036 -16.5343C2.94413 -16.5277 2.96297 -16.4557 2.96675 -16.4492C2.92716 -17.1037 2.8857 -17.7649 2.84423 -18.4293L2.81973 -18.5078Z" fill="#FEFEFE"/> +<path d="M39.5677 -17.6959L39.66 -17.9282L39.7015 -17.6533L39.5677 -17.6959Z" fill="#FEFEFE"/> +<path d="M54.1426 -18.3963C54.0578 -18.1901 54.071 -18.0035 54.1841 -17.8399L54.1633 -17.8922C54.1426 -18.0363 54.1238 -18.177 54.103 -18.321L54.1426 -18.3963Z" fill="#FEFEFE"/> +<path d="M40.823 -15.4672L40.6986 -15.5817L40.8343 -15.6635L40.823 -15.4672Z" fill="#FEFEFE"/> +<path d="M1.78292 -15.4638C1.79608 -15.2118 1.80924 -14.9597 1.82052 -14.7077C1.82052 -14.9303 1.82239 -15.1561 1.81863 -15.3852C1.81487 -15.395 1.78292 -15.4638 1.78292 -15.4638Z" fill="#FEFEFE"/> +<path d="M44.1929 -14.3508C44.1477 -14.5505 44.1213 -14.6618 44.0949 -14.7698C44.1571 -14.8025 44.2174 -14.8319 44.2796 -14.8647C44.2532 -14.7207 44.2287 -14.5734 44.1929 -14.3508Z" fill="#FEFEFE"/> +<path d="M-1.29119 -14.4C-1.34208 -14.2101 -1.39485 -14.0203 -1.44574 -13.8338C-1.44386 -13.9352 -1.46459 -14.0661 -1.43632 -14.125C-1.39108 -14.2167 -1.3138 -14.2625 -1.24972 -14.328L-1.29119 -14.4Z" fill="#FEFEFE"/> +<path d="M24.74 -13.968C24.7155 -13.8599 24.7079 -13.7225 24.6627 -13.657C24.6288 -13.6079 24.5496 -13.6538 24.4893 -13.657C24.5232 -13.8403 24.5571 -14.0236 24.5911 -14.2069C24.6401 -14.1283 24.691 -14.0465 24.74 -13.968Z" fill="#FEFEFE"/> +<path d="M43.3278 -13.1532C43.3542 -13.0485 43.4051 -12.9372 43.3975 -12.839C43.39 -12.7408 43.324 -12.6557 43.2845 -12.5641C43.2581 -12.6721 43.2091 -12.7834 43.2147 -12.8848C43.2204 -12.983 43.2882 -13.0648 43.3278 -13.1532Z" fill="#FEFEFE"/> +<path d="M48.903 -12.5476C49.1763 -12.7113 49.4477 -12.8782 49.721 -13.0418L49.6984 -13.0222C49.442 -12.8847 49.1876 -12.7473 48.935 -12.6131C48.9369 -12.6164 48.903 -12.5476 48.903 -12.5476Z" fill="#FEFEFE"/> +<path d="M-1.07621 -10.9015C-1.04229 -11.1175 -1.0159 -11.3368 -0.968779 -11.543C-0.959354 -11.5855 -0.866999 -11.5724 -0.814224 -11.5855C-0.912233 -11.3499 -1.01025 -11.1142 -1.10637 -10.8786L-1.07621 -10.9015Z" fill="#FEFEFE"/> +<path d="M9.35999 -10.2466C9.39769 -10.4365 9.43727 -10.623 9.47496 -10.8128C9.4203 -10.6001 9.36753 -10.3874 9.31287 -10.1779L9.35999 -10.2466Z" fill="#FEFEFE"/> +<path d="M-12.9032 -8.37152L-12.9768 -8.66935L-12.8128 -8.65625L-12.9032 -8.37152Z" fill="#FEFEFE"/> +<path d="M-12.2961 -7.30468C-12.1642 -7.4225 -12.0323 -7.54033 -11.8984 -7.65488C-12.0473 -7.55997 -12.1944 -7.46505 -12.3433 -7.37014L-12.2961 -7.30468Z" fill="#FEFEFE"/> +<path d="M-7.02834 -7.6187C-7.15086 -7.60561 -7.27148 -7.59252 -7.39399 -7.57943C-7.27337 -7.57943 -7.15085 -7.5827 -7.034 -7.57288C-7.03588 -7.56307 -7.02834 -7.6187 -7.02834 -7.6187Z" fill="#FEFEFE"/> +<path d="M-12.3455 -7.37009C-12.3549 -7.06244 -12.3643 -6.75806 -12.3719 -6.45041C-12.4341 -6.48641 -12.4963 -6.52241 -12.5585 -6.55514C-12.4699 -6.80388 -12.3813 -7.04934 -12.2946 -7.29808C-12.2965 -7.30463 -12.3455 -7.37009 -12.3455 -7.37009Z" fill="#FEFEFE"/> +<path d="M24.12 -7.53695C24.1124 -7.32749 24.1162 -7.11148 24.0936 -6.90856C24.0879 -6.8562 24.0069 -6.82674 23.9598 -6.78419C24.0163 -7.0362 24.0728 -7.29149 24.1313 -7.5435L24.12 -7.53695Z" fill="#FEFEFE"/> +<path d="M29.5593 -4.45691C29.5291 -4.54527 29.499 -4.63037 29.4707 -4.71874C29.5404 -4.78747 29.6102 -4.85292 29.678 -4.92165C29.6837 -4.81692 29.7101 -4.6991 29.6893 -4.61401C29.6743 -4.54528 29.6064 -4.50927 29.5593 -4.45691Z" fill="#FEFEFE"/> +<path d="M-2.49172 -4.12963C-2.57088 -4.00853 -2.65004 -3.89071 -2.73108 -3.76961C-2.67643 -3.70743 -2.62365 -3.64197 -2.56899 -3.57979C-2.55768 -3.74016 -2.54638 -3.89725 -2.53507 -4.05762L-2.49172 -4.12963Z" fill="#FEFEFE"/> +<path d="M23.4111 -3.99239C23.364 -3.90402 23.3188 -3.81238 23.2716 -3.72401C23.3206 -3.78947 23.3696 -3.8582 23.4187 -3.92366L23.4111 -3.99239Z" fill="#FEFEFE"/> +<path d="M-0.772728 -1.57383C-0.744457 -1.78002 -0.7143 -1.98621 -0.686028 -2.1924C-0.727493 -2.00584 -0.770844 -1.81929 -0.812309 -1.63274C-0.810425 -1.63274 -0.772728 -1.57383 -0.772728 -1.57383Z" fill="#FEFEFE"/> +<path d="M43.3823 -1.98609C43.4803 -2.1301 43.5802 -2.27083 43.6783 -2.41484C43.5859 -2.29047 43.4935 -2.16282 43.4012 -2.03518C43.4012 -2.03191 43.3823 -1.98609 43.3823 -1.98609Z" fill="#FEFEFE"/> +<path d="M14.2491 -2.47069C14.2058 -2.24486 14.1624 -2.0223 14.1191 -1.79648C14.0512 -1.93066 13.9853 -2.06158 13.9174 -2.19576C14.038 -2.26777 14.1605 -2.33977 14.2812 -2.41178C14.2812 -2.41505 14.2491 -2.47069 14.2491 -2.47069Z" fill="#FEFEFE"/> +<path d="M21.253 -1.81608C21.1494 -1.81936 21.0457 -1.82263 20.9421 -1.8259C20.9515 -1.73099 20.959 -1.63935 20.9684 -1.54444C21.0514 -1.65572 21.1343 -1.77027 21.2172 -1.88809C21.2154 -1.88809 21.253 -1.81608 21.253 -1.81608Z" fill="#FEFEFE"/> +<path d="M-18.8724 1.02817C-18.9083 0.812162 -18.946 0.596153 -18.9818 0.383417C-18.9196 0.380144 -18.8593 0.376871 -18.7971 0.373598C-18.831 0.589609 -18.8649 0.808889 -18.8988 1.0249L-18.8724 1.02817Z" fill="#FEFEFE"/> +<path d="M-15.1501 0.0594807L-15.2406 0.301672L-15.2858 0.0169334L-15.1501 0.0594807Z" fill="#FEFEFE"/> +<path d="M11.0865 -0.0156593L11.2222 0.0628872L11.1242 -0.0811176L11.0865 -0.0156593Z" fill="#FEFEFE"/> +<path d="M-18.8988 1.02505C-19.0364 1.06106 -19.1759 1.09706 -19.3135 1.13633C-19.1684 1.10033 -19.0232 1.06106 -18.8743 1.02505C-18.8725 1.02833 -18.8988 1.02505 -18.8988 1.02505Z" fill="#FEFEFE"/> +<path d="M-12.8677 1.2735L-12.96 1.58115L-13.0373 1.26368L-12.8677 1.2735Z" fill="#FEFEFE"/> +<path d="M-5.96906 1.17892C-5.91252 1.21165 -5.85786 1.24438 -5.80132 1.27711C-5.85409 1.22802 -5.90498 1.18219 -5.95776 1.1331L-5.96906 1.17892Z" fill="#FEFEFE"/> +<path d="M48.1849 2.66805C48.1905 2.64186 48.1943 2.61568 48.2018 2.59277C48.2037 2.60259 48.1849 2.66805 48.1849 2.66805Z" fill="#FEFEFE"/> +<path d="M-5.95776 1.1331C-5.98791 1.42766 -6.01622 1.72549 -6.04638 2.02005C-6.01999 1.74185 -5.9936 1.46694 -5.9691 1.18547C-5.9691 1.17892 -5.95776 1.1331 -5.95776 1.1331Z" fill="#FEFEFE"/> +<path d="M1.96398 1.84946L2.12042 1.79709L2.08084 2.0131L1.96398 1.84946Z" fill="#FEFEFE"/> +<path d="M-24.4288 3.00854C-24.3798 3.01181 -24.3044 2.98563 -24.2894 3.02818C-24.2554 3.11654 -24.2535 3.24091 -24.2385 3.34892C-24.3252 3.34237 -24.41 3.33255 -24.4967 3.32601C-24.4722 3.218 -24.4514 3.11327 -24.4288 3.00854Z" fill="#FEFEFE"/> +<path d="M-10.2967 2.52058C-10.4061 2.63513 -10.5154 2.74968 -10.6247 2.86423C-10.6002 2.78241 -10.5851 2.65149 -10.5455 2.62858C-10.4796 2.58276 -10.4004 2.6024 -10.3269 2.59586C-10.325 2.59258 -10.2967 2.52058 -10.2967 2.52058Z" fill="#FEFEFE"/> +<path d="M-21.611 4.95238C-21.5715 4.89674 -21.53 4.84437 -21.4904 4.78873C-21.5677 4.78219 -21.645 4.77564 -21.7241 4.7691C-21.6921 4.83783 -21.6601 4.90329 -21.628 4.97202L-21.611 4.95238Z" fill="#FEFEFE"/> +<path d="M52.7103 4.20935L52.7085 4.42208L52.5784 4.31408L52.7103 4.20935Z" fill="#FEFEFE"/> +<path d="M-13.5291 4.67073C-13.6271 4.80164 -13.7233 4.93256 -13.8213 5.0602C-13.7383 4.92929 -13.6535 4.80164 -13.5706 4.67073H-13.5291Z" fill="#FEFEFE"/> +<path d="M-12.9937 5.74104C-12.9353 5.70177 -12.875 5.66577 -12.8165 5.62649C-12.8052 5.79013 -12.7939 5.95378 -12.7845 6.11742C-12.8486 6.09451 -12.9315 6.1076 -12.973 6.04214C-13.005 5.99305 -12.9881 5.84577 -12.9937 5.74104Z" fill="#FEFEFE"/> +<path d="M39.4131 6.29427C39.7298 6.07498 40.0464 5.85897 40.363 5.63969L40.4026 5.57096C40.0634 5.79679 39.7241 6.01934 39.3867 6.2419C39.3848 6.23863 39.4131 6.29427 39.4131 6.29427Z" fill="#FEFEFE"/> +<path d="M17.3497 6.86359C17.4665 6.74577 17.5834 6.63122 17.7002 6.5134C17.7247 6.6574 17.7474 6.80141 17.7719 6.94542C17.6437 6.89632 17.5155 6.84723 17.3874 6.79814L17.3497 6.86359Z" fill="#FEFEFE"/> +<path d="M48.7446 7.32191C48.6824 7.27936 48.6202 7.24008 48.558 7.19754C48.6278 7.22372 48.6956 7.2499 48.7654 7.27608L48.7446 7.32191Z" fill="#FEFEFE"/> +<path d="M2.74984 7.68827C2.76115 7.92064 2.77246 8.15302 2.78377 8.38539C2.69895 8.34612 2.61413 8.30684 2.52743 8.27084C2.6179 8.10065 2.70649 7.93373 2.79507 7.76027C2.79507 7.757 2.74984 7.68827 2.74984 7.68827Z" fill="#FEFEFE"/> +<path d="M40.1614 51.4369C40.1124 51.414 40.0634 51.3911 40.0144 51.3682C40.0823 51.2929 40.1501 51.2176 40.2161 51.1424C40.1991 51.2405 40.1803 51.3387 40.1614 51.4369Z" fill="#FEFEFE"/> +<path d="M35.2969 51.6072C35.3685 51.4207 35.442 51.2309 35.5137 51.0443C35.427 51.208 35.3422 51.3683 35.2555 51.532C35.2573 51.532 35.2969 51.6072 35.2969 51.6072Z" fill="#FEFEFE"/> +<path d="M1.2722 50.5435C1.23451 50.5861 1.19681 50.6253 1.15911 50.6679C1.20812 50.6122 1.25712 50.5599 1.30801 50.5042L1.2722 50.5435Z" fill="#FEFEFE"/> +<path d="M44.3454 49.9249C44.2926 49.9216 44.2417 49.9216 44.189 49.9183C44.2549 49.9412 44.319 49.9641 44.3869 49.987L44.3454 49.9249Z" fill="#FEFEFE"/> +<path d="M1.30809 50.5009C1.36275 50.5533 1.41553 50.6056 1.47019 50.6613C1.4061 50.622 1.34014 50.5827 1.27417 50.5434C1.27228 50.5434 1.30809 50.5009 1.30809 50.5009Z" fill="#FEFEFE"/> +<path d="M-14.8013 10.9744H-14.6863L-14.7447 11.2035L-14.8013 10.9744Z" fill="#FEFEFE"/> +<path d="M2.68387 10.8569L2.60471 11.1351L2.54439 10.8405L2.68387 10.8569Z" fill="#FEFEFE"/> +<path d="M38.5442 49.2147C38.5781 49.3653 38.629 49.5126 38.6403 49.6664C38.6441 49.7318 38.5649 49.8169 38.5254 49.8922L38.5706 49.9708C38.5725 49.7024 38.5763 49.434 38.5781 49.1656L38.5442 49.2147Z" fill="#FEFEFE"/> +<path d="M8.46098 47.0415C8.28758 47.5488 8.11418 48.0594 7.94455 48.5732C7.94643 48.5798 7.95774 48.6583 7.95774 48.6648C8.11983 48.1477 8.28193 47.6241 8.44402 47.0971C8.44213 47.0939 8.46098 47.0415 8.46098 47.0415Z" fill="#FEFEFE"/> +<path d="M-7.32064 13.1608C-7.2151 13.0691 -7.10955 12.9808 -7.00211 12.8891C-7.03604 12.9611 -7.06243 13.0691 -7.10389 13.092C-7.16798 13.1248 -7.24337 13.0986 -7.31311 13.0953L-7.32064 13.1608Z" fill="#FEFEFE"/> +<path d="M39.0778 45.3332C38.9609 45.451 38.8497 45.5787 38.7272 45.6736C38.7027 45.6932 38.6443 45.5754 38.6009 45.523C38.7724 45.4772 38.9421 45.4314 39.1174 45.3888C39.1192 45.3954 39.0778 45.3332 39.0778 45.3332Z" fill="#FEFEFE"/> +<path d="M5.98809 45.1663C5.89951 45.4085 5.80903 45.6507 5.72045 45.8896C5.66579 45.8143 5.61113 45.7423 5.55836 45.6671C5.71102 45.5132 5.86181 45.3594 6.01447 45.2023L5.98809 45.1663Z" fill="#FEFEFE"/> +<path d="M-1.22138 13.0234C-1.27604 13.0889 -1.3307 13.1871 -1.38536 13.1838C-1.43437 13.1805 -1.48337 13.0725 -1.53238 13.0103C-1.42871 13.0103 -1.32505 13.0103 -1.22138 13.0234Z" fill="#FEFEFE"/> +<path d="M56.9813 13.0234L56.823 13.1249L56.8362 12.886L56.9813 13.0234Z" fill="#FEFEFE"/> +<path d="M46.6395 44.5345C46.6169 44.6392 46.5943 44.7407 46.5716 44.8454C46.5 44.7178 46.4265 44.5901 46.3549 44.4625C46.4095 44.3839 46.4642 44.3087 46.5189 44.2334C46.5585 44.3316 46.5999 44.433 46.6395 44.5345Z" fill="#FEFEFE"/> +<path d="M30.7883 43.5821C30.7204 43.6607 30.6526 43.7359 30.5866 43.8145C30.6356 43.8734 30.6865 43.9323 30.7355 43.9912C30.743 43.8505 30.7487 43.7098 30.7562 43.5657L30.7883 43.5821Z" fill="#FEFEFE"/> +<path d="M11.8084 43.0814L11.9649 43.2123L11.8066 43.3432L11.8084 43.0814Z" fill="#FEFEFE"/> +<path d="M-18.9687 42.7409C-19.0459 42.8456 -19.1232 42.9471 -19.2005 43.0485C-19.1458 43.1074 -19.0912 43.1696 -19.0384 43.2285C-19.0309 43.0747 -19.0252 42.9209 -19.0177 42.7671L-18.9687 42.7409Z" fill="#FEFEFE"/> +<path d="M11.6047 14.8133C11.4991 14.7413 11.3936 14.6726 11.288 14.6006C11.386 14.689 11.4841 14.7773 11.5802 14.869C11.5783 14.8755 11.6047 14.8133 11.6047 14.8133Z" fill="#FEFEFE"/> +<path d="M-5.69202 42.5285C-5.73914 42.4663 -5.78626 42.4008 -5.83338 42.3386C-5.78437 42.2797 -5.73348 42.1783 -5.68448 42.1783C-5.63924 42.1783 -5.59401 42.2928 -5.54877 42.355C-5.59589 42.4107 -5.6449 42.4696 -5.69202 42.5285Z" fill="#FEFEFE"/> +<path d="M54.7873 41.6904L54.7948 41.4416L54.9456 41.5791L54.7873 41.6904Z" fill="#FEFEFE"/> +<path d="M30.3848 42.057C30.3772 41.7755 30.3716 41.4973 30.364 41.2158L30.3282 41.2649C30.332 41.5497 30.3358 41.8344 30.3395 42.1192L30.3848 42.057Z" fill="#FEFEFE"/> +<path d="M44.7941 41.7721C44.9034 41.6543 45.0108 41.5398 45.1201 41.4219C45.0956 41.5103 45.0805 41.6543 45.0428 41.6805C44.9769 41.7263 44.894 41.6969 44.8186 41.7001L44.7941 41.7721Z" fill="#FEFEFE"/> +<path d="M25.8745 40.715C25.7991 40.787 25.7237 40.859 25.6483 40.931C25.6879 41.0062 25.7256 41.0815 25.7652 41.1568C25.8104 41.0259 25.8538 40.895 25.899 40.7608L25.8745 40.715Z" fill="#FEFEFE"/> +<path d="M-18.2807 40.761C-18.0168 40.9966 -17.7529 41.229 -17.4872 41.4647L-17.474 41.481C-17.7454 41.2192 -18.0187 40.9574 -18.2901 40.6923L-18.2807 40.761Z" fill="#FEFEFE"/> +<path d="M6.37265 15.4976C6.31988 15.5041 6.25203 15.5434 6.2181 15.5041C6.18229 15.4616 6.1804 15.3405 6.16344 15.2521C6.25014 15.239 6.33496 15.2259 6.42166 15.2129C6.4047 15.3078 6.38961 15.4027 6.37265 15.4976Z" fill="#FEFEFE"/> +<path d="M34.8764 15.7952C34.9424 15.6283 35.0102 15.4647 35.0762 15.2977C35.0668 15.3992 35.0762 15.5399 35.0423 15.589C34.9895 15.6643 34.9047 15.6807 34.835 15.7199L34.8764 15.7952Z" fill="#FEFEFE"/> +<path d="M57.805 41.3531C57.8484 41.3073 57.8917 41.2582 57.9369 41.2124C57.9087 41.1437 57.8823 41.0717 57.854 41.0029C57.8201 41.1404 57.788 41.2778 57.7541 41.4186L57.805 41.3531Z" fill="#FEFEFE"/> +<path d="M46.2475 40.1359L46.093 39.9788L46.2664 39.8904L46.2475 40.1359Z" fill="#FEFEFE"/> +<path d="M25.8992 40.764C25.9614 40.0571 26.0236 39.3469 26.082 38.6334C26.0801 38.6269 26.0424 38.5516 26.0406 38.5483C25.9821 39.2651 25.9256 39.9851 25.8728 40.7117C25.8747 40.715 25.8992 40.764 25.8992 40.764Z" fill="#FEFEFE"/> +<path d="M-18.2921 40.6923C-18.2883 40.7119 -18.2846 40.7315 -18.2808 40.7545C-18.2808 40.761 -18.2921 40.6923 -18.2921 40.6923Z" fill="#FEFEFE"/> +<path d="M-0.382729 15.658C-0.282833 15.5991 -0.181053 15.5402 -0.0811577 15.4813C-0.130163 15.5173 -0.177286 15.5762 -0.228176 15.586C-0.292259 15.5991 -0.360111 15.5762 -0.424194 15.5729C-0.422308 15.5762 -0.382729 15.658 -0.382729 15.658Z" fill="#FEFEFE"/> +<path d="M12.5867 16.0636L12.664 15.8018L12.73 16.0702L12.5867 16.0636Z" fill="#FEFEFE"/> +<path d="M21.5998 15.4975L21.4678 15.3633L21.6149 15.2684L21.5998 15.4975Z" fill="#FEFEFE"/> +<path d="M36.3749 37.5436C36.4257 37.5109 36.4785 37.4749 36.5294 37.4421C36.5369 37.596 36.5445 37.7498 36.5539 37.9036C36.4974 37.8774 36.4239 37.8807 36.3899 37.8185C36.3598 37.7662 36.3786 37.6385 36.3749 37.5436Z" fill="#FEFEFE"/> +<path d="M51.5495 37.1608L51.5891 37.4652L51.4515 37.4096L51.5495 37.1608Z" fill="#FEFEFE"/> +<path d="M43.0168 36.7481C43.0017 36.8496 42.9867 36.9478 42.9716 37.0492C42.9188 36.9118 42.8679 36.7776 42.8151 36.6401C42.883 36.6761 42.949 36.7121 43.0168 36.7481Z" fill="#FEFEFE"/> +<path d="M-22.6272 15.4941C-22.6668 15.5923 -22.7252 15.6807 -22.7403 15.792C-22.7478 15.8509 -22.6856 15.9392 -22.6555 16.0145C-22.6592 15.8247 -22.6649 15.6349 -22.6668 15.4483C-22.6649 15.4483 -22.6272 15.4941 -22.6272 15.4941Z" fill="#FEFEFE"/> +<path d="M15.61 17.3501C15.7287 17.1373 15.8456 16.9246 15.9643 16.7119C16.0114 16.9246 16.0604 17.1373 16.1075 17.3501L16.1189 17.337C15.953 17.337 15.7871 17.3337 15.6213 17.3337L15.61 17.3501Z" fill="#FEFEFE"/> +<path d="M52.9875 16.45C52.9366 16.4762 52.8706 16.5449 52.8386 16.5122C52.7952 16.4696 52.7783 16.3485 52.75 16.2601C52.8405 16.2176 52.9309 16.1783 53.0214 16.1358C53.0101 16.2438 52.9988 16.3485 52.9875 16.45Z" fill="#FEFEFE"/> +<path d="M38.2014 36.6862L38.2711 36.4375L38.3314 36.6928L38.2014 36.6862Z" fill="#FEFEFE"/> +<path d="M1.28357 36.0152L1.43058 35.9301L1.4155 36.1461L1.28357 36.0152Z" fill="#FEFEFE"/> +<path d="M50.654 35.0954L50.8237 35.2394L50.6521 35.3769L50.654 35.0954Z" fill="#FEFEFE"/> +<path d="M-17.6061 36.4473C-17.6042 36.2476 -17.6005 36.0447 -17.5986 35.8451C-17.6136 36.0316 -17.6306 36.2215 -17.6456 36.408L-17.6061 36.4473Z" fill="#FEFEFE"/> +<path d="M-3.17009 16.8916L-3.16443 17.1305L-3.31899 17.0225L-3.17009 16.8916Z" fill="#FEFEFE"/> +<path d="M8.72475 34.7813C8.81898 34.6864 8.91134 34.5947 9.00558 34.4998C8.92453 34.5751 8.8416 34.6504 8.76056 34.7256L8.72475 34.7813Z" fill="#FEFEFE"/> +<path d="M-7.97823 33.4133C-8.29676 33.626 -8.61717 33.8388 -8.93759 34.0515C-8.93947 34.0482 -8.89612 34.0712 -8.89612 34.0712C-8.57759 33.8617 -8.25906 33.6522 -7.93676 33.4428C-7.93299 33.4493 -7.97823 33.4133 -7.97823 33.4133Z" fill="#FEFEFE"/> +<path d="M-16.6352 17.8443C-16.6126 17.7658 -16.5919 17.6218 -16.5693 17.6218C-16.5184 17.6218 -16.4675 17.6905 -16.4166 17.7331C-16.4392 17.8116 -16.4599 17.9491 -16.4844 17.9523C-16.5334 17.9556 -16.5843 17.8836 -16.6352 17.8443Z" fill="#FEFEFE"/> +<path d="M23.89 18.2009C24.0163 17.9947 24.1444 17.7918 24.2707 17.5856C24.3084 17.6772 24.3442 17.7689 24.3819 17.8638C24.2047 17.9522 24.0294 18.0438 23.8523 18.1322L23.89 18.2009Z" fill="#FEFEFE"/> +<path d="M10.8847 32.1631C10.9073 32.0747 10.9281 31.9143 10.9526 31.9111C11.0148 31.9078 11.0789 31.9733 11.1429 32.0125C11.1203 32.1009 11.0996 32.2645 11.0751 32.2678C11.011 32.2678 10.9469 32.2024 10.8847 32.1631Z" fill="#FEFEFE"/> +<path d="M21.1758 32.4607C21.3247 31.8519 21.4755 31.2465 21.6244 30.6377L21.6036 30.7195C21.4547 31.3185 21.304 31.9174 21.1551 32.5163L21.1758 32.4607Z" fill="#FEFEFE"/> +<path d="M6.09562 30.8702C6.05038 30.9127 6.00514 30.9552 5.95991 30.9978C5.99195 30.9683 6.02399 30.9422 6.05792 30.9127L6.09562 30.8702Z" fill="#FEFEFE"/> +<path d="M3.46618 31.0994C3.48314 31.1845 3.5001 31.2663 3.51518 31.3514C3.45675 31.3809 3.39832 31.4365 3.34178 31.43C3.32104 31.4267 3.30785 31.2794 3.29089 31.1943C3.34932 31.1616 3.40775 31.1321 3.46618 31.0994Z" fill="#FEFEFE"/> +<path d="M23.8522 18.132C23.5884 18.4495 23.3245 18.767 23.0606 19.0844L23.104 19.1433C23.366 18.8291 23.6279 18.515 23.8899 18.2008L23.8522 18.132Z" fill="#FEFEFE"/> +<path d="M55.0813 19.2188C54.9701 19.317 54.8608 19.4152 54.7496 19.5134C54.7817 19.4381 54.8062 19.3203 54.8476 19.2974C54.9136 19.2614 54.9928 19.2843 55.0644 19.281C55.0625 19.281 55.0813 19.2188 55.0813 19.2188Z" fill="#FEFEFE"/> +<path d="M55.6112 26.9068C55.5792 26.7366 55.5453 26.6384 55.5509 26.55C55.5547 26.5107 55.6395 26.4911 55.6885 26.4616C55.6659 26.5893 55.6433 26.7169 55.6112 26.9068Z" fill="#FEFEFE"/> +<path d="M-2.54813 26.5404C-2.65744 26.6288 -2.76676 26.727 -2.88362 26.7761C-2.91001 26.7859 -2.9609 26.6124 -3.00048 26.5241C-2.89304 26.4455 -2.78938 26.3408 -2.67818 26.2982C-2.64614 26.2819 -2.59148 26.4488 -2.54813 26.5404Z" fill="#FEFEFE"/> +<path d="M-8.30437 26.475L-8.15547 26.3899L-8.17244 26.6027L-8.30437 26.475Z" fill="#FEFEFE"/> +<path d="M-16.4335 25.8005L-16.5824 25.6237L-16.4071 25.5256L-16.4335 25.8005Z" fill="#FEFEFE"/> +<path d="M23.8654 21.4544C23.8636 21.4805 23.8617 21.5067 23.8617 21.5296L23.8654 21.4544Z" fill="#FEFEFE"/> +<path d="M52.7632 24.5993C52.7764 24.6058 52.7877 24.6157 52.8046 24.6255C52.8065 24.6288 52.7632 24.5993 52.7632 24.5993Z" fill="#FEFEFE"/> +<path d="M35.9904 24.3213C35.9847 24.5504 35.9772 24.7828 35.9716 25.0119C35.9847 24.7599 35.9998 24.5111 36.0129 24.2591L35.9904 24.3213Z" fill="#FEFEFE"/> +<path d="M23.4998 25.29C23.7788 25.0478 24.0577 24.8089 24.3367 24.5667L24.299 24.5012C24.0219 24.7467 23.7449 24.9922 23.4659 25.2409C23.4678 25.2409 23.4998 25.29 23.4998 25.29Z" fill="#FEFEFE"/> +<path d="M2.56157 25.3519L2.72744 25.3486L2.64639 25.6596L2.56157 25.3519Z" fill="#FEFEFE"/> +<path d="M58.4497 24.2983C58.3932 24.3343 58.3385 24.3736 58.282 24.4096C58.2707 24.2394 58.2612 24.0692 58.2499 23.9023C58.3121 23.9285 58.3969 23.9187 58.4328 23.9874C58.4667 24.0463 58.446 24.1936 58.4497 24.2983Z" fill="#FEFEFE"/> +<path d="M36.0129 24.2591C36.0751 24.3148 36.1373 24.3737 36.1976 24.4293C36.1279 24.3933 36.0581 24.3573 35.9903 24.3213L36.0129 24.2591Z" fill="#FEFEFE"/> +<path d="M34.3658 22.9631C34.4996 23.1529 34.6334 23.3395 34.7672 23.5293C34.7164 23.6111 34.6636 23.6962 34.6127 23.7781C34.5467 23.4802 34.4808 23.1857 34.4129 22.8878L34.3658 22.9631Z" fill="#FEFEFE"/> +<path d="M-20.1693 21.6374C-20.2146 21.5195 -20.2617 21.3984 -20.3069 21.2806C-20.273 21.3886 -20.2372 21.4934 -20.2033 21.6014L-20.1693 21.6374Z" fill="#FEFEFE"/> +<path d="M-10.815 22.472L-10.8169 22.6749L-10.9432 22.5702L-10.815 22.472Z" fill="#FEFEFE"/> +<path d="M-20.2029 21.6015C-19.9692 21.5164 -19.7355 21.4313 -19.5018 21.343H-19.4603C-19.6959 21.4379 -19.9315 21.5361 -20.169 21.6343C-20.169 21.6375 -20.2029 21.6015 -20.2029 21.6015Z" fill="#FEFEFE"/> +<path d="M-14.1679 21.3657L-14.1283 21.5162C-14.1283 21.5162 -14.2075 21.4213 -14.2094 21.4278C-14.2132 21.4311 -14.1679 21.3657 -14.1679 21.3657Z" fill="#FEFEFE"/> +<path d="M-7.34889 21.7586L-7.49025 21.8503L-7.47329 21.6081L-7.34889 21.7586Z" fill="#FEFEFE"/> +<path d="M23.8616 21.5294L23.8126 21.5359C23.8126 21.5359 23.8692 21.441 23.8673 21.4475C23.8654 21.4541 23.8616 21.5294 23.8616 21.5294Z" fill="#FEFEFE"/> +<path d="M34.3903 22.1938L34.4468 22.0335L34.3526 22.1251L34.3903 22.1938Z" fill="#FEFEFE"/> +<path d="M-18.5407 22.9729L-18.4672 22.8158L-18.5859 22.9042L-18.5407 22.9729Z" fill="#FEFEFE"/> +<path d="M18.9516 23.0122L18.9158 22.8715C18.9158 22.8715 18.9855 22.9337 18.9874 22.9304C18.9893 22.9206 18.9516 23.0122 18.9516 23.0122Z" fill="#FEFEFE"/> +<path d="M44.5361 20.5019L44.3947 20.5379L44.4927 20.5445L44.5361 20.5019Z" fill="#FEFEFE"/> +<path d="M20.3239 20.5312C20.2787 20.4821 20.2315 20.433 20.1863 20.3839C20.2165 20.4395 20.2466 20.4919 20.2768 20.5475L20.3239 20.5312Z" fill="#FEFEFE"/> +<path d="M-19.502 21.3426C-19.4662 21.3099 -19.4304 21.2772 -19.3946 21.2444C-19.4172 21.2772 -19.4417 21.3099 -19.4625 21.3426C-19.4606 21.3426 -19.502 21.3426 -19.502 21.3426Z" fill="#FEFEFE"/> +<path d="M-18.5861 22.904C-18.7557 23.1593 -18.9254 23.4146 -19.095 23.6699L-19.0667 23.7222C-18.8933 23.4702 -18.718 23.2215 -18.5427 22.9695C-18.5409 22.9728 -18.5861 22.904 -18.5861 22.904Z" fill="#FEFEFE"/> +<path d="M-12.6752 23.7288C-12.6319 23.6993 -12.5885 23.6699 -12.5433 23.6437C-12.5772 23.6797 -12.613 23.7124 -12.6469 23.7452L-12.6752 23.7288Z" fill="#FEFEFE"/> +<path d="M40.6946 22.8353L40.7172 22.9826C40.7172 22.9826 40.6606 22.9106 40.6588 22.9171C40.6569 22.9237 40.6946 22.8353 40.6946 22.8353Z" fill="#FEFEFE"/> +<path d="M47.3557 23.5324L47.2219 23.6535C47.2219 23.6535 47.3123 23.5226 47.3142 23.5193C47.318 23.5193 47.3557 23.5324 47.3557 23.5324Z" fill="#FEFEFE"/> +<path d="M-19.095 23.6734L-19.0668 23.7257C-19.0649 23.7257 -19.095 23.6734 -19.095 23.6734Z" fill="#FEFEFE"/> +<path d="M-17.8152 24.5111C-17.7662 24.5308 -17.7172 24.5471 -17.6663 24.5668C-17.7021 24.5242 -17.7361 24.4849 -17.7719 24.4424L-17.8152 24.5111Z" fill="#FEFEFE"/> +<path d="M20.5425 24.5668C20.5877 24.5995 20.6311 24.6355 20.6763 24.6683C20.648 24.6225 20.6198 24.5799 20.5915 24.5341L20.5425 24.5668Z" fill="#FEFEFE"/> +<path d="M24.3386 24.5667C24.4008 24.4423 24.463 24.3146 24.5252 24.1903C24.5139 24.2721 24.5177 24.3932 24.4894 24.4259C24.4366 24.4816 24.365 24.4816 24.3028 24.5045C24.3009 24.5012 24.3386 24.5667 24.3386 24.5667Z" fill="#FEFEFE"/> +<path d="M-17.7737 24.4424V24.6126C-17.7737 24.6126 -17.8094 24.5013 -17.8132 24.5078C-17.8151 24.5111 -17.7737 24.4424 -17.7737 24.4424Z" fill="#FEFEFE"/> +<path d="M-3.99563 24.4817L-4.05029 24.6126L-3.9862 24.5046L-3.99563 24.4817Z" fill="#FEFEFE"/> +<path d="M20.5912 24.5341L20.5837 24.6879C20.5837 24.6879 20.5518 24.557 20.548 24.5603C20.5424 24.5668 20.5912 24.5341 20.5912 24.5341Z" fill="#FEFEFE"/> +<path d="M44.4927 20.5445L44.4927 20.4299C44.4927 20.4299 44.5303 20.5183 44.5341 20.5117C44.536 20.5019 44.4927 20.5445 44.4927 20.5445Z" fill="#FEFEFE"/> +<path d="M22.6065 20.024C22.5594 20.0437 22.5104 20.0633 22.4632 20.083C22.5217 20.0928 22.5782 20.1026 22.6348 20.1059C22.6329 20.0993 22.6065 20.024 22.6065 20.024Z" fill="#FEFEFE"/> +<path d="M20.2766 20.5474C20.3068 20.5049 20.3369 20.4656 20.3671 20.4231C20.3501 20.4591 20.3332 20.4983 20.3181 20.5311C20.3237 20.5311 20.2766 20.5474 20.2766 20.5474Z" fill="#FEFEFE"/> +<path d="M10.1477 20.4692L10.0836 20.4528C10.0836 20.4528 10.1383 20.4037 10.1345 20.3972C10.1326 20.3939 10.1477 20.4692 10.1477 20.4692Z" fill="#FEFEFE"/> +<path d="M-20.0391 26.1018L-19.9486 26.0494L-20.0127 26.1182L-20.0391 26.1018Z" fill="#FEFEFE"/> +<path d="M0.870779 26.1934C0.923553 26.2097 0.97633 26.2261 1.0291 26.2457C0.991407 26.2065 0.953711 26.1639 0.914129 26.1246L0.870779 26.1934Z" fill="#FEFEFE"/> +<path d="M3.6528 26.1343L3.79981 26.1506L3.69992 26.1212L3.6528 26.1343Z" fill="#FEFEFE"/> +<path d="M5.48479 26.056C5.53191 26.0658 5.57903 26.0756 5.62615 26.0855C5.59222 26.0462 5.55829 26.0102 5.52437 25.9709L5.48479 26.056Z" fill="#FEFEFE"/> +<path d="M22.9739 26.1376C23.1491 25.8562 23.3244 25.5747 23.4997 25.29C23.4997 25.29 23.4677 25.2409 23.4677 25.2376C23.2905 25.5158 23.1133 25.794 22.9362 26.0722L22.9739 26.1376Z" fill="#FEFEFE"/> +<path d="M38.6309 26.1867C38.6139 26.1998 38.5989 26.2161 38.582 26.2325L38.6309 26.1867Z" fill="#FEFEFE"/> +<path d="M47.1803 25.4339C47.1445 25.4273 47.1105 25.4208 47.0747 25.4143C47.1068 25.4012 47.1388 25.3848 47.169 25.375L47.1803 25.4339Z" fill="#FEFEFE"/> +<path d="M56.6384 25.7023L56.5177 25.7776L56.5328 25.5812L56.6384 25.7023Z" fill="#FEFEFE"/> +<path d="M-20.0128 26.1179C-20.0486 26.1409 -20.0844 26.167 -20.1184 26.19C-20.0901 26.1605 -20.0637 26.131 -20.0373 26.0983C-20.0392 26.1016 -20.0128 26.1179 -20.0128 26.1179Z" fill="#FEFEFE"/> +<path d="M-0.65019 26.5499L-0.535215 26.4747L-0.550295 26.671L-0.65019 26.5499Z" fill="#FEFEFE"/> +<path d="M0.914064 26.1212L0.959297 26.2717C0.959297 26.2717 0.876369 26.1801 0.872599 26.1866C0.870714 26.1932 0.914064 26.1212 0.914064 26.1212Z" fill="#FEFEFE"/> +<path d="M3.69997 26.1212C3.66982 26.1572 3.64154 26.1932 3.61139 26.2292C3.62835 26.1964 3.64531 26.1604 3.6585 26.131C3.65285 26.1343 3.69997 26.1212 3.69997 26.1212Z" fill="#FEFEFE"/> +<path d="M5.52256 25.9709L5.53759 26.1542C5.53759 26.1542 5.48871 26.0462 5.48684 26.0527C5.48495 26.056 5.52256 25.9709 5.52256 25.9709Z" fill="#FEFEFE"/> +<path d="M11.8968 26.0526L11.9138 26.1966C11.9138 26.1966 11.861 26.1181 11.8572 26.1213C11.8535 26.1246 11.8968 26.0526 11.8968 26.0526Z" fill="#FEFEFE"/> +<path d="M22.9362 26.0721C22.7816 26.3372 22.627 26.6056 22.4725 26.8707C22.4725 26.8707 22.5158 26.9427 22.5158 26.946C22.6685 26.6776 22.8212 26.406 22.9739 26.1376L22.9362 26.0721Z" fill="#FEFEFE"/> +<path d="M38.5837 26.2325L38.497 26.1998L38.6308 26.1867L38.5837 26.2325Z" fill="#FEFEFE"/> +<path d="M-12.1002 27.3259C-12.1454 27.3095 -12.1888 27.2899 -12.234 27.2735C-12.1831 27.303 -12.1341 27.3357 -12.0832 27.3651L-12.1002 27.3259Z" fill="#FEFEFE"/> +<path d="M10.5003 26.9102L10.555 27.0509C10.555 27.0509 10.4664 26.9789 10.4645 26.9854C10.4589 26.9953 10.5003 26.9102 10.5003 26.9102Z" fill="#FEFEFE"/> +<path d="M18.2808 26.5959L18.3335 26.8544C18.3335 26.8544 18.2789 26.6875 18.2751 26.681C18.2732 26.6744 18.2808 26.5959 18.2808 26.5959Z" fill="#FEFEFE"/> +<path d="M23.3395 27.699H23.4771L23.3791 27.7056L23.3395 27.699Z" fill="#FEFEFE"/> +<path d="M28.4437 27.5124L28.357 27.4142C28.357 27.4142 28.4173 27.5746 28.4173 27.5779C28.4173 27.5812 28.4437 27.5124 28.4437 27.5124Z" fill="#FEFEFE"/> +<path d="M29.7479 26.9167L29.7422 27.0738C29.7422 27.0738 29.7084 26.9396 29.7046 26.9429C29.7009 26.9461 29.7479 26.9167 29.7479 26.9167Z" fill="#FEFEFE"/> +<path d="M56.789 18.9635L56.7325 19.0682L56.7721 18.9341L56.789 18.9635Z" fill="#FEFEFE"/> +<path d="M47.2121 19.8308L47.167 19.7686C47.167 19.7719 47.2121 19.8308 47.2121 19.8308Z" fill="#FEFEFE"/> +<path d="M23.0606 19.0847C22.9061 19.3923 22.7534 19.7 22.6026 20.0174C22.6064 20.024 22.6309 20.0993 22.6347 20.1058C22.6215 19.7229 22.6045 19.3301 22.5875 18.9374C22.5857 18.9374 22.5423 19.0061 22.5423 19.0061C22.727 19.0487 22.9136 19.0945 23.1021 19.1403C23.104 19.1436 23.0606 19.0847 23.0606 19.0847Z" fill="#FEFEFE"/> +<path d="M3.05543 19.4808L3.0215 19.2714L3.12705 19.3041L3.05543 19.4808Z" fill="#FEFEFE"/> +<path d="M-12.0853 27.3651C-12.1098 27.7938 -12.1343 28.2258 -12.1569 28.6579C-12.155 28.6611 -12.1456 28.7266 -12.1456 28.7331C-12.1305 28.2684 -12.1154 27.7971 -12.1022 27.3291C-12.1004 27.3258 -12.0853 27.3651 -12.0853 27.3651Z" fill="#FEFEFE"/> +<path d="M-6.74772 28.6512L-6.7026 28.4515C-6.7026 28.4515 -6.73832 28.5825 -6.73832 28.5857C-6.73832 28.589 -6.74772 28.6512 -6.74772 28.6512Z" fill="#FEFEFE"/> +<path d="M10.966 28.4709L11.1074 28.376L11.0037 28.3858L10.966 28.4709Z" fill="#FEFEFE"/> +<path d="M23.3789 27.7056C23.345 27.735 23.3111 27.7677 23.2771 27.7972C23.2998 27.7645 23.3224 27.7318 23.3431 27.699C23.3393 27.699 23.3789 27.7056 23.3789 27.7056Z" fill="#FEFEFE"/> +<path d="M28.9279 28.5564C28.7677 28.2095 28.6056 27.8626 28.4454 27.5124C28.4454 27.5091 28.4172 27.5779 28.4172 27.5779C28.5792 27.9182 28.7413 28.2652 28.9034 28.6088C28.9015 28.6088 28.9279 28.5564 28.9279 28.5564Z" fill="#FEFEFE"/> +<path d="M-22.4044 28.9428L-22.5722 29.0409L-22.5552 28.7758L-22.4044 28.9428Z" fill="#FEFEFE"/> +<path d="M11.0035 28.3862L11.0205 28.5302C11.0205 28.5302 10.9697 28.4582 10.9678 28.4647C10.9659 28.4713 11.0035 28.3862 11.0035 28.3862Z" fill="#FEFEFE"/> +<path d="M19.3682 29.9344L19.2777 29.9573L19.4096 30.0096L19.3682 29.9344Z" fill="#FEFEFE"/> +<path d="M23.9164 30.0751C23.9541 30.0358 23.9918 29.9966 24.0294 29.9606C24.0031 29.9998 23.9767 30.0391 23.9541 30.0784C23.9578 30.0751 23.9164 30.0751 23.9164 30.0751Z" fill="#FEFEFE"/> +<path d="M36.1466 30.291L36.1128 30.0423L36.0978 30.2255L36.1466 30.291Z" fill="#FEFEFE"/> +<path d="M42.278 29.7279C42.2272 29.7083 42.1763 29.6886 42.1235 29.6723C42.1819 29.705 42.2385 29.7377 42.295 29.7737L42.278 29.7279Z" fill="#FEFEFE"/> +<path d="M56.7719 18.934C56.8096 18.9209 56.8454 18.9111 56.8831 18.898C56.8511 18.9209 56.8209 18.9439 56.7889 18.9635L56.7719 18.934Z" fill="#FEFEFE"/> +<path d="M54.9384 17.9884C54.9855 18.3975 55.0307 18.8067 55.0798 19.2158C55.0816 19.219 55.0628 19.278 55.0647 19.2812C55.027 18.8787 54.9874 18.4728 54.9478 18.067L54.9384 17.9884Z" fill="#FEFEFE"/> +<path d="M50.3261 18.9143C50.3751 18.8455 50.4241 18.7768 50.4731 18.7048C50.4128 18.7506 50.3525 18.7964 50.2903 18.839C50.2884 18.839 50.3261 18.9143 50.3261 18.9143Z" fill="#FEFEFE"/> +<path d="M31.2161 19.0651C31.2217 18.9669 31.2293 18.8655 31.2349 18.7673C31.2161 18.8458 31.1953 18.9244 31.1765 19.0029C31.1784 19.0029 31.2161 19.0651 31.2161 19.0651Z" fill="#FEFEFE"/> +<path d="M21.9769 18.1977C22.1654 18.4661 22.352 18.7377 22.5423 19.0061C22.5442 19.0061 22.5876 18.9374 22.5894 18.9374C22.3991 18.669 22.2087 18.4006 22.0183 18.1355C22.0146 18.1355 21.9769 18.1977 21.9769 18.1977Z" fill="#FEFEFE"/> +<path d="M16.1432 18.1946C15.9604 18.1946 15.7776 18.1914 15.5948 18.1914L15.6193 18.2175C15.787 18.2175 15.9566 18.2175 16.1244 18.2175L16.1432 18.1946Z" fill="#FEFEFE"/> +<path d="M6.05573 30.9129L6.09144 30.8016C6.09144 30.8016 6.08957 30.8802 6.09332 30.8736C6.09521 30.8703 6.05573 30.9129 6.05573 30.9129Z" fill="#FEFEFE"/> +<path d="M19.4096 30.0093L19.3739 30.0911C19.3739 30.0911 19.3626 29.9275 19.3645 29.9308C19.3682 29.934 19.4096 30.0093 19.4096 30.0093Z" fill="#FEFEFE"/> +<path d="M21.6245 30.6377L21.6679 30.7097C21.6679 30.7097 21.5981 30.7326 21.6019 30.7261C21.6019 30.7195 21.6245 30.6377 21.6245 30.6377Z" fill="#FEFEFE"/> +<path d="M36.0978 30.2255L36.2033 30.196C36.2033 30.196 36.143 30.2844 36.143 30.2909C36.1468 30.2909 36.0978 30.2255 36.0978 30.2255Z" fill="#FEFEFE"/> +<path d="M42.2742 31.2467C42.2742 30.7394 42.276 30.2354 42.2779 29.7281L42.2967 29.7707C42.2948 30.2452 42.293 30.7198 42.2911 31.1976C42.2911 31.2009 42.2742 31.2467 42.2742 31.2467Z" fill="#FEFEFE"/> +<path d="M-23.2226 31.6689L-23.1548 31.6133L-23.1981 31.6853L-23.2226 31.6689Z" fill="#FEFEFE"/> +<path d="M-11.8649 30.8868L-11.8592 31.0635C-11.8592 31.0635 -11.9062 30.9195 -11.91 30.9228C-11.9138 30.9261 -11.8649 30.8868 -11.8649 30.8868Z" fill="#FEFEFE"/> +<path d="M28.6018 31.8195L28.5887 31.6133L28.5548 31.8686L28.6018 31.8195Z" fill="#FEFEFE"/> +<path d="M29.6159 31.1288L29.6555 31.335L29.5405 31.3022L29.6159 31.1288Z" fill="#FEFEFE"/> +<path d="M-23.1982 31.6854L-23.2528 31.8294C-23.2528 31.8294 -23.2208 31.669 -23.2227 31.669L-23.1982 31.6854Z" fill="#FEFEFE"/> +<path d="M28.5549 31.8684L28.472 31.7702C28.472 31.7702 28.602 31.8128 28.602 31.816C28.602 31.8193 28.5549 31.8684 28.5549 31.8684Z" fill="#FEFEFE"/> +<path d="M54.9474 18.0698C54.9248 18.0142 54.9022 17.9586 54.8796 17.9029C54.9003 17.9357 54.921 17.9684 54.9399 17.9946C54.938 17.988 54.9474 18.0698 54.9474 18.0698Z" fill="#FEFEFE"/> +<path d="M43.6711 17.2976C43.6164 17.2845 43.5637 17.2714 43.509 17.2583C43.5486 17.2976 43.59 17.3368 43.6296 17.3761L43.6711 17.2976Z" fill="#FEFEFE"/> +<path d="M41.2263 17.3632L41.1829 17.4712L41.2734 17.4253L41.2263 17.3632Z" fill="#FEFEFE"/> +<path d="M16.1076 17.3502C16.1188 17.6316 16.1282 17.9131 16.1414 18.1946C16.1433 18.1946 16.1245 18.2142 16.1245 18.2142C16.1226 17.9197 16.1207 17.6284 16.1207 17.3338L16.1076 17.3502Z" fill="#FEFEFE"/> +<path d="M15.5948 18.1913C15.623 18.0048 15.6626 17.8215 15.6739 17.6316C15.6796 17.5433 15.6343 17.4451 15.6117 17.3502C15.6098 17.3502 15.6212 17.3338 15.6212 17.3338C15.6212 17.6284 15.6193 17.9229 15.6193 18.2175L15.5948 18.1913Z" fill="#FEFEFE"/> +<path d="M5.81855 17.9489L5.77708 17.7525L5.8864 17.7754L5.81855 17.9489Z" fill="#FEFEFE"/> +<path d="M-12.632 18.1585L-12.6283 18.0178C-12.6283 18.0178 -12.5926 18.1389 -12.5888 18.1323C-12.5869 18.1291 -12.632 18.1585 -12.632 18.1585Z" fill="#FEFEFE"/> +<path d="M-24.8945 17.7887L-24.7626 17.7003L-24.7776 17.9229L-24.8945 17.7887Z" fill="#FEFEFE"/> +<path d="M21.1534 32.5166L21.1044 32.5722C21.1044 32.5722 21.176 32.4577 21.1741 32.4577C21.176 32.461 21.1534 32.5166 21.1534 32.5166Z" fill="#FEFEFE"/> +<path d="M-6.22362 34.12L-6.14069 33.9792L-6.26885 34.0382L-6.22362 34.12Z" fill="#FEFEFE"/> +<path d="M-15.772 34.4081L-15.6306 34.3197L-15.6476 34.5554L-15.772 34.4081Z" fill="#FEFEFE"/> +<path d="M-9.64252 34.8993C-9.39561 34.6243 -9.15058 34.3461 -8.8999 34.0712C-8.89614 34.0712 -8.94137 34.0483 -8.93949 34.0516C-9.16189 34.3003 -9.38618 34.5491 -9.61047 34.7978L-9.64252 34.8993Z" fill="#FEFEFE"/> +<path d="M-6.26872 34.0386C-6.35354 34.1499 -6.43647 34.2644 -6.52128 34.3757C-6.49489 34.3004 -6.47793 34.1793 -6.44024 34.1564C-6.37615 34.1138 -6.29699 34.1269 -6.22348 34.1204L-6.26872 34.0386Z" fill="#FEFEFE"/> +<path d="M4.49688 35.0759L4.50064 34.8828L4.46868 35.0432L4.49688 35.0759Z" fill="#FEFEFE"/> +<path d="M5.32465 35.0661C5.31525 35.0791 5.30585 35.089 5.29646 35.1021C5.29646 35.0988 5.32465 35.0661 5.32465 35.0661Z" fill="#FEFEFE"/> +<path d="M10.949 34.6211L11.0998 34.5687L10.9773 34.5458L10.949 34.6211Z" fill="#FEFEFE"/> +<path d="M30.0608 34.3461L30.0909 34.5522L29.9872 34.5195L30.0608 34.3461Z" fill="#FEFEFE"/> +<path d="M46.3208 34.7616L46.4075 34.5882L46.2925 34.7027L46.3208 34.7616Z" fill="#FEFEFE"/> +<path d="M49.2027 35.0629C49.1914 35.076 49.1801 35.0891 49.1688 35.1022L49.2027 35.0629Z" fill="#FEFEFE"/> +<path d="M43.6293 17.3763L43.5746 17.2258C43.5746 17.2258 43.6651 17.3076 43.667 17.3043C43.6708 17.2978 43.6293 17.3763 43.6293 17.3763Z" fill="#FEFEFE"/> +<path d="M41.1737 16.7512C41.2962 16.8264 41.4168 16.8984 41.5393 16.9737C41.4357 17.1046 41.3301 17.2323 41.2265 17.3632L41.2736 17.4254C41.185 17.2028 41.1586 16.9606 41.1925 16.6955L41.1737 16.7512Z" fill="#FEFEFE"/> +<path d="M22.989 16.4694L23.0116 16.6429L23.0229 16.5316L22.989 16.4694Z" fill="#FEFEFE"/> +<path d="M-9.61074 34.7976L-9.55231 34.9187C-9.55231 34.9187 -9.63901 34.886 -9.64089 34.8925C-9.64278 34.8991 -9.61074 34.7976 -9.61074 34.7976Z" fill="#FEFEFE"/> +<path d="M-0.0206223 35.8386L-0.0922451 35.6488L-0.0658569 35.8419L-0.0206223 35.8386Z" fill="#FEFEFE"/> +<path d="M4.46868 35.043C4.75328 35.0496 5.03977 35.0529 5.32438 35.0627L5.2961 35.0987C5.03035 35.0921 4.76459 35.0823 4.49695 35.0758L4.46868 35.043Z" fill="#FEFEFE"/> +<path d="M8.7606 34.7257L8.71924 34.8828C8.71924 34.8828 8.72864 34.7781 8.72676 34.7781C8.72488 34.7814 8.7606 34.7257 8.7606 34.7257Z" fill="#FEFEFE"/> +<path d="M10.977 34.5458L11.0033 34.7913C11.0033 34.7913 10.9525 34.6244 10.9507 34.6244C10.9488 34.6211 10.977 34.5458 10.977 34.5458Z" fill="#FEFEFE"/> +<path d="M46.2925 34.7027C46.1248 35.0366 45.959 35.3704 45.7912 35.7075L45.8138 35.7599C45.9835 35.4293 46.1512 35.0987 46.3208 34.7649C46.3208 34.7616 46.2925 34.7027 46.2925 34.7027Z" fill="#FEFEFE"/> +<path d="M49.167 35.1021C48.905 35.0955 48.6449 35.0923 48.3829 35.089C48.381 35.0923 48.349 35.053 48.349 35.0563C48.6317 35.0595 48.9163 35.0595 49.2028 35.0628L49.167 35.1021Z" fill="#FEFEFE"/> +<path d="M-0.0658131 35.8417L0.0812054 35.7435C0.0812054 35.7435 -0.0130367 35.8221 -0.0168056 35.8319C-0.0205765 35.8417 -0.0658131 35.8417 -0.0658131 35.8417Z" fill="#FEFEFE"/> +<path d="M3.43032 36.0119L3.57733 35.9301L3.55849 36.1559L3.43032 36.0119Z" fill="#FEFEFE"/> +<path d="M22.4027 35.6975L22.5271 35.7433C22.5271 35.7433 22.4404 35.7564 22.4404 35.7597C22.4422 35.763 22.4027 35.6975 22.4027 35.6975Z" fill="#FEFEFE"/> +<path d="M26.7378 36.0775C26.6888 36.0579 26.6379 36.035 26.5889 36.0153C26.6455 36.0513 26.7001 36.084 26.7567 36.12C26.7567 36.1233 26.7378 36.0775 26.7378 36.0775Z" fill="#FEFEFE"/> +<path d="M29.5763 35.7992L29.6328 36.0545L29.4971 36.0349L29.5763 35.7992Z" fill="#FEFEFE"/> +<path d="M56.8098 16.7675L56.8493 16.5875C56.8493 16.5875 56.8399 16.7053 56.8418 16.7053C56.8437 16.7053 56.8098 16.7675 56.8098 16.7675Z" fill="#FEFEFE"/> +<path d="M41.1923 16.6953C41.1584 16.296 41.1226 15.8967 41.0887 15.4974C41.0887 15.4974 41.1019 15.4614 41.1019 15.4581C41.1264 15.8869 41.1527 16.3156 41.1754 16.7477C41.1735 16.7509 41.1923 16.6953 41.1923 16.6953Z" fill="#FEFEFE"/> +<path d="M34.835 15.7234C34.835 15.7234 34.8763 15.7987 34.8763 15.7954L34.835 15.7234Z" fill="#FEFEFE"/> +<path d="M23.0229 16.5316L22.9324 16.4727C22.9324 16.4727 22.9927 16.476 22.9908 16.4727C22.989 16.4695 23.0229 16.5316 23.0229 16.5316Z" fill="#FEFEFE"/> +<path d="M11.6989 16.1358C11.6556 16.0834 11.6122 16.0311 11.5689 15.9787C11.6085 16.0409 11.6499 16.0998 11.6895 16.162L11.6989 16.1358Z" fill="#FEFEFE"/> +<path d="M4.74018 15.825L4.67044 15.8577C4.67044 15.8577 4.77788 15.8413 4.77976 15.8446C4.78353 15.8479 4.74018 15.825 4.74018 15.825Z" fill="#FEFEFE"/> +<path d="M-0.774614 16.7383C-0.642679 16.3816 -0.512627 16.0248 -0.382576 15.6648C-0.38446 15.6615 -0.424042 15.5797 -0.424042 15.5732C-0.554092 15.9332 -0.684143 16.2965 -0.812309 16.663C-0.812309 16.6663 -0.774614 16.7383 -0.774614 16.7383Z" fill="#FEFEFE"/> +<path d="M-17.6435 36.4078C-17.8207 36.6893 -17.9978 36.9708 -18.175 37.2555L-18.1939 37.2261C-17.9978 36.9675 -17.8037 36.7089 -17.6077 36.4504C-17.6058 36.4471 -17.6435 36.4078 -17.6435 36.4078Z" fill="#FEFEFE"/> +<path d="M-3.09467 37.1999C-3.03247 37.0297 -2.97028 36.8628 -2.90808 36.6926C-2.98536 36.8432 -3.06263 36.9937 -3.13991 37.1476L-3.09467 37.1999Z" fill="#FEFEFE"/> +<path d="M16.5732 37.2295L16.607 37.0756C16.607 37.0756 16.6089 37.2033 16.6108 37.2C16.6146 37.1967 16.5732 37.2295 16.5732 37.2295Z" fill="#FEFEFE"/> +<path d="M26.7397 37.5957C26.7378 37.0917 26.7378 36.5877 26.7378 36.0804C26.7378 36.0804 26.7566 36.1229 26.7566 36.1196C26.7566 36.5942 26.7566 37.072 26.7566 37.5532C26.7566 37.5564 26.7397 37.5957 26.7397 37.5957Z" fill="#FEFEFE"/> +<path d="M-23.7879 15.4615L-23.7408 15.6971C-23.7408 15.6971 -23.8068 15.5302 -23.8087 15.5269C-23.8105 15.5269 -23.7879 15.4615 -23.7879 15.4615Z" fill="#FEFEFE"/> +<path d="M-18.1752 37.2553C-18.2129 37.2684 -18.2487 37.2815 -18.2864 37.2946C-18.2562 37.2717 -18.2242 37.2488 -18.194 37.2259L-18.1752 37.2553Z" fill="#FEFEFE"/> +<path d="M-3.13815 37.1442C-3.13815 37.1442 -3.09115 37.1998 -3.09303 37.1998C-3.09491 37.1998 -3.13815 37.1442 -3.13815 37.1442Z" fill="#FEFEFE"/> +<path d="M10.6529 38.0346L10.7133 37.8612L10.6435 38.0837L10.6529 38.0346Z" fill="#FEFEFE"/> +<path d="M32.0794 37.1705C32.0304 37.2851 31.9814 37.4029 31.9305 37.5174C31.938 37.4454 31.9305 37.3374 31.955 37.3112C32.0002 37.2622 32.0624 37.2589 32.1171 37.2392C32.119 37.236 32.0794 37.1705 32.0794 37.1705Z" fill="#FEFEFE"/> +<path d="M-6.75895 38.7677L-6.67602 38.663L-6.74388 38.807L-6.75895 38.7677Z" fill="#FEFEFE"/> +<path d="M1.80561 38.8726L1.95451 38.8006L1.84896 38.8104L1.80561 38.8726Z" fill="#FEFEFE"/> +<path d="M10.6437 38.0837L10.6003 38.1688C10.6003 38.1688 10.655 38.028 10.655 38.0313C10.6531 38.0346 10.6437 38.0837 10.6437 38.0837Z" fill="#FEFEFE"/> +<path d="M30.419 38.9509L30.453 38.8069L30.3738 38.8953L30.419 38.9509Z" fill="#FEFEFE"/> +<path d="M49.9605 16.0735C50.0566 15.648 50.1527 15.2225 50.2489 14.7971L50.2112 14.7381C50.1282 15.1538 50.0453 15.5727 49.9624 15.9917C49.9661 15.9982 49.9605 16.0735 49.9605 16.0735Z" fill="#FEFEFE"/> +<path d="M11.6894 16.162C11.6612 15.7136 11.631 15.2685 11.6046 14.8168C11.6065 14.8135 11.5801 14.8725 11.5801 14.8692C11.6197 15.2881 11.6593 15.7103 11.6989 16.1325C11.6989 16.1358 11.6894 16.162 11.6894 16.162Z" fill="#FEFEFE"/> +<path d="M-19.191 14.7416L-19.1722 15.0035C-19.1722 15.0035 -19.1572 14.83 -19.1609 14.8235C-19.1666 14.8169 -19.191 14.7416 -19.191 14.7416Z" fill="#FEFEFE"/> +<path d="M-11.8214 38.8199L-11.8459 38.9738C-11.8459 38.9738 -11.859 38.833 -11.8628 38.8363C-11.8647 38.8363 -11.8214 38.8199 -11.8214 38.8199Z" fill="#FEFEFE"/> +<path d="M1.84896 38.8104L1.86967 38.9184C1.86967 38.9184 1.81125 38.8595 1.80936 38.8661C1.80559 38.8726 1.84896 38.8104 1.84896 38.8104Z" fill="#FEFEFE"/> +<path d="M23.3941 39.5987L23.4638 39.5169L23.4148 39.6249L23.3941 39.5987Z" fill="#FEFEFE"/> +<path d="M30.3737 38.8955C30.1475 39.0067 29.9195 39.118 29.6933 39.2293C29.6933 39.2326 29.6782 39.2784 29.6782 39.2784C29.9232 39.1671 30.1664 39.0526 30.4152 38.9445C30.4189 38.9511 30.3737 38.8955 30.3737 38.8955Z" fill="#FEFEFE"/> +<path d="M38.9401 39.5239L38.8534 39.442L38.9005 39.5926L38.9401 39.5239Z" fill="#FEFEFE"/> +<path d="M48.0455 39.5892L48.1699 39.5499L48.0737 39.6088L48.0455 39.5892Z" fill="#FEFEFE"/> +<path d="M49.7944 39.8085L49.7493 39.6318L49.7587 39.8249L49.7944 39.8085Z" fill="#FEFEFE"/> +<path d="M50.4392 39.6744C50.4543 39.4748 50.4712 39.2718 50.4863 39.0722C50.5636 39.1507 50.639 39.226 50.7163 39.3046C50.6145 39.4126 50.5146 39.5239 50.4128 39.6319C50.4109 39.6286 50.4392 39.6744 50.4392 39.6744Z" fill="#FEFEFE"/> +<path d="M15.6496 40.4502C15.8306 40.1786 16.0096 39.9036 16.1906 39.632C16.1924 39.632 16.1472 39.5632 16.1472 39.5632C15.97 39.8382 15.7929 40.1164 15.6157 40.3913C15.6176 40.388 15.6496 40.4502 15.6496 40.4502Z" fill="#FEFEFE"/> +<path d="M23.415 39.6252C23.3773 39.6448 23.3415 39.6612 23.3038 39.6808C23.334 39.6546 23.3641 39.6284 23.3943 39.6022C23.3943 39.599 23.415 39.6252 23.415 39.6252Z" fill="#FEFEFE"/> +<path d="M29.7648 40.3155C29.7365 39.9719 29.7082 39.6315 29.68 39.2846C29.68 39.2813 29.695 39.2322 29.6932 39.229C29.7045 39.6053 29.7158 39.985 29.729 40.3646C29.7309 40.3679 29.7648 40.3155 29.7648 40.3155Z" fill="#FEFEFE"/> +<path d="M38.9005 39.5925C38.9005 39.5925 38.9418 39.5237 38.94 39.5237L38.9005 39.5925Z" fill="#FEFEFE"/> +<path d="M42.5173 40.09C42.5607 40.1391 42.6059 40.1915 42.6493 40.2438C42.6097 40.1718 42.5701 40.0965 42.5305 40.0278C42.5305 40.0311 42.5173 40.09 42.5173 40.09Z" fill="#FEFEFE"/> +<path d="M48.0736 39.6089C48.0303 39.6318 47.9888 39.6547 47.9455 39.6776C47.9794 39.6482 48.0133 39.6187 48.0453 39.5893L48.0736 39.6089Z" fill="#FEFEFE"/> +<path d="M49.7587 39.8247C49.9849 39.7756 50.2111 39.7233 50.4391 39.6742C50.4391 39.6742 50.4128 39.6284 50.4146 39.6316C50.2111 39.6905 50.0075 39.7462 49.8002 39.8051C49.7945 39.8084 49.7587 39.8247 49.7587 39.8247Z" fill="#FEFEFE"/> +<path d="M50.2506 14.7938C50.3128 14.7677 50.3732 14.7317 50.4354 14.7251C50.4655 14.7218 50.4994 14.7775 50.5315 14.8069C50.4278 14.7873 50.3242 14.7677 50.2167 14.7448C50.2129 14.7382 50.2506 14.7938 50.2506 14.7938Z" fill="#FEFEFE"/> +<path d="M28.8639 14.1229L28.8676 14.2342L28.8845 14.0443L28.8639 14.1229Z" fill="#FEFEFE"/> +<path d="M15.1822 14.1657C15.2369 14.2311 15.2896 14.2966 15.3443 14.3621C15.3047 14.2737 15.2651 14.1853 15.2255 14.097C15.2274 14.0937 15.1822 14.1657 15.1822 14.1657Z" fill="#FEFEFE"/> +<path d="M-4.52358 14.2833C-4.55939 14.3127 -4.59709 14.3389 -4.6329 14.3684C-4.58578 14.3618 -4.53866 14.3553 -4.49154 14.3487C-4.48966 14.3455 -4.52358 14.2833 -4.52358 14.2833Z" fill="#FEFEFE"/> +<path d="M-7.33761 14.5843L-7.16798 14.5777C-7.16798 14.5777 -7.35269 14.545 -7.35081 14.5417C-7.35081 14.5385 -7.33761 14.5843 -7.33761 14.5843Z" fill="#FEFEFE"/> +<path d="M-13.5025 14.5547L-13.3574 14.4664L-13.3725 14.6987L-13.5025 14.5547Z" fill="#FEFEFE"/> +<path d="M-16.6127 41.4383C-16.6183 41.4448 -16.6221 41.4481 -16.6277 41.4547L-16.6127 41.4383Z" fill="#FEFEFE"/> +<path d="M5.00614 40.5611L5.13242 40.5022C5.13242 40.5022 5.05137 40.4858 5.0476 40.4957C5.04383 40.5022 5.00614 40.5611 5.00614 40.5611Z" fill="#FEFEFE"/> +<path d="M24.6664 40.8363C24.6212 40.9018 24.5759 41.0229 24.5345 41.0163C24.493 41.013 24.4553 40.8821 24.4157 40.8068C24.461 40.7414 24.5062 40.6203 24.5495 40.6268C24.5891 40.6334 24.6268 40.7643 24.6664 40.8363Z" fill="#FEFEFE"/> +<path d="M30.3643 41.2159C30.1664 40.918 29.9666 40.6169 29.7668 40.3191C29.7649 40.3191 29.731 40.3715 29.7291 40.3715C29.927 40.6693 30.1268 40.9671 30.3266 41.265C30.3285 41.2617 30.3643 41.2159 30.3643 41.2159Z" fill="#FEFEFE"/> +<path d="M41.5223 41.445C41.5505 41.3763 41.5807 41.3076 41.609 41.2388C41.5694 41.2978 41.5298 41.3567 41.4902 41.4123C41.4921 41.409 41.5223 41.445 41.5223 41.445Z" fill="#FEFEFE"/> +<path d="M42.3609 41.3959C42.4137 40.9638 42.4684 40.5351 42.5192 40.0965C42.5174 40.09 42.5305 40.0311 42.5305 40.0278C42.4646 40.4926 42.3986 40.9606 42.3308 41.4319C42.3308 41.4286 42.3609 41.3959 42.3609 41.3959Z" fill="#FEFEFE"/> +<path d="M-17.4892 41.4645C-17.1971 41.458 -16.9049 41.4482 -16.6128 41.4416L-16.6279 41.458C-16.9087 41.4645 -17.1914 41.4743 -17.4741 41.4809C-17.4741 41.4776 -17.4892 41.4645 -17.4892 41.4645Z" fill="#FEFEFE"/> +<path d="M16.4941 41.9817L16.6355 41.9882H16.5318L16.4941 41.9817Z" fill="#FEFEFE"/> +<path d="M42.3308 41.4286C42.0613 41.4319 41.7918 41.4351 41.5223 41.4417C41.5204 41.445 41.4921 41.409 41.4902 41.409C41.7786 41.4057 42.067 41.3959 42.3591 41.3926C42.361 41.3959 42.3308 41.4286 42.3308 41.4286Z" fill="#FEFEFE"/> +<path d="M46.3508 42.119L46.3376 41.9554L46.3038 42.1877L46.3508 42.119Z" fill="#FEFEFE"/> +<path d="M57.7541 41.4153L57.6938 41.2909C57.6938 41.2909 57.8087 41.3433 57.8068 41.3465C57.805 41.3531 57.7541 41.4153 57.7541 41.4153Z" fill="#FEFEFE"/> +<path d="M-19.0176 42.7704C-19.0308 42.7279 -19.0421 42.682 -19.0553 42.6395C-19.029 42.6755 -19.0026 42.7148 -18.9724 42.7475C-18.9686 42.741 -19.0176 42.7704 -19.0176 42.7704Z" fill="#FEFEFE"/> +<path d="M45.0375 13.3474C44.9828 13.3147 44.9262 13.282 44.8716 13.246C44.9112 13.2983 44.9508 13.3507 44.9903 13.4031L45.0375 13.3474Z" fill="#FEFEFE"/> +<path d="M28.8847 14.0443L28.9167 14.0541C28.9167 14.0541 28.8583 14.136 28.8602 14.1294C28.8639 14.1229 28.8847 14.0443 28.8847 14.0443Z" fill="#FEFEFE"/> +<path d="M14.0494 42.5348L14.0079 42.3254L14.121 42.3515L14.0494 42.5348Z" fill="#FEFEFE"/> +<path d="M16.5317 41.9882C16.4978 42.0045 16.4657 42.0209 16.4318 42.0373C16.4544 42.0176 16.477 41.998 16.4959 41.9784C16.494 41.9816 16.5317 41.9882 16.5317 41.9882Z" fill="#FEFEFE"/> +<path d="M30.3397 42.119L30.2549 42.0863C30.2549 42.0863 30.3849 42.0536 30.383 42.0536C30.3849 42.0568 30.3397 42.119 30.3397 42.119Z" fill="#FEFEFE"/> +<path d="M44.8168 41.7001L44.8281 41.9194C44.8281 41.9194 44.798 41.7786 44.7961 41.7753C44.7943 41.7721 44.8168 41.7001 44.8168 41.7001Z" fill="#FEFEFE"/> +<path d="M46.304 42.1876L46.2606 42.1091C46.2606 42.1091 46.3549 42.1091 46.353 42.1156C46.3511 42.1189 46.304 42.1876 46.304 42.1876Z" fill="#FEFEFE"/> +<path d="M3.8828 13.3769C3.83568 13.3343 3.79045 13.2918 3.74333 13.246C3.77349 13.2983 3.80364 13.354 3.8338 13.4063L3.8828 13.3769Z" fill="#FEFEFE"/> +<path d="M-3.96176 13.3472C-4.14835 13.6581 -4.33495 13.969 -4.52343 14.2799C-4.52343 14.2799 -4.49139 14.3421 -4.49139 14.3454C-4.30479 14.0312 -4.11631 13.7137 -3.92595 13.3995L-3.96176 13.3472Z" fill="#FEFEFE"/> +<path d="M-7.31498 13.0954C-7.3225 13.5896 -7.33002 14.0838 -7.33754 14.5813C-7.33754 14.5845 -7.35258 14.5387 -7.35258 14.542C-7.3413 14.0871 -7.33002 13.6289 -7.31874 13.1674C-7.32062 13.1608 -7.31498 13.0954 -7.31498 13.0954Z" fill="#FEFEFE"/> +<path d="M-21.3491 13.4751C-21.5338 13.6911 -21.7204 13.9038 -21.907 14.1198L-21.8693 14.1853C-21.7053 13.966 -21.5413 13.7467 -21.3754 13.5274L-21.3491 13.4751Z" fill="#FEFEFE"/> +<path d="M-2.49914 43.1793L-2.37851 43.1041L-2.39359 43.3037L-2.49914 43.1793Z" fill="#FEFEFE"/> +<path d="M25.9162 43.3792L25.8559 43.0879L26.0104 43.1141L25.9162 43.3792Z" fill="#FEFEFE"/> +<path d="M28.7489 43.2252C28.7828 43.2645 28.8167 43.3005 28.8507 43.3397C28.8224 43.2874 28.7922 43.2383 28.764 43.1859L28.7489 43.2252Z" fill="#FEFEFE"/> +<path d="M30.7544 43.5658C30.7959 43.5396 30.8355 43.5167 30.877 43.4905C30.8468 43.52 30.8148 43.5494 30.7865 43.5789C30.7884 43.5822 30.7544 43.5658 30.7544 43.5658Z" fill="#FEFEFE"/> +<path d="M52.8667 43.2548L52.8366 43.0453L52.9421 43.0813L52.8667 43.2548Z" fill="#FEFEFE"/> +<path d="M28.7622 43.1859C28.7734 43.6736 28.7866 44.158 28.796 44.6522C28.7941 44.6587 28.7998 44.5867 28.796 44.5933C28.7772 44.1449 28.7622 43.6899 28.7471 43.2285C28.749 43.2252 28.7622 43.1859 28.7622 43.1859Z" fill="#FEFEFE"/> +<path d="M44.9903 13.4061C45.0035 13.3897 45.0166 13.3734 45.0336 13.3537C45.0373 13.3472 44.9903 13.4061 44.9903 13.4061Z" fill="#FEFEFE"/> +<path d="M17.0198 12.7781L16.9538 12.9253C16.9538 12.9253 17.0443 12.8632 17.0443 12.8599C17.0443 12.8533 17.0198 12.7781 17.0198 12.7781Z" fill="#FEFEFE"/> +<path d="M13.8534 12.6372L13.7403 12.6962L13.8289 12.6143L13.8534 12.6372Z" fill="#FEFEFE"/> +<path d="M3.83562 13.4061C3.86012 13.3571 3.88463 13.3112 3.90913 13.2621C3.89782 13.3014 3.88839 13.3407 3.88085 13.3767C3.88274 13.3767 3.83562 13.4061 3.83562 13.4061Z" fill="#FEFEFE"/> +<path d="M-21.3754 13.5275L-21.3247 13.3638L-21.351 13.4751C-21.3491 13.4751 -21.3754 13.5275 -21.3754 13.5275Z" fill="#FEFEFE"/> +<path d="M-5.49416 45.1957C-5.44516 45.2251 -5.39615 45.2546 -5.34715 45.2808C-5.38107 45.2382 -5.41311 45.1957 -5.44704 45.1531L-5.49416 45.1957Z" fill="#FEFEFE"/> +<path d="M-2.47083 45.3721C-2.42748 45.3197 -2.38413 45.2674 -2.34078 45.215C-2.39732 45.251 -2.45198 45.287 -2.5123 45.3165C-2.51418 45.3132 -2.47083 45.3721 -2.47083 45.3721Z" fill="#FEFEFE"/> +<path d="M6.50454 44.1845C6.33302 44.5118 6.1615 44.8358 5.9881 45.1631L6.0126 45.2024C6.18412 44.8849 6.35564 44.5674 6.52715 44.2467C6.52904 44.2467 6.50454 44.1845 6.50454 44.1845Z" fill="#FEFEFE"/> +<path d="M8.13288 44.9598C8.18 44.9892 8.22712 45.0219 8.27424 45.0514C8.23089 44.999 8.18565 44.9434 8.14419 44.891C8.14608 44.891 8.13288 44.9598 8.13288 44.9598Z" fill="#FEFEFE"/> +<path d="M11.4895 45.0549L11.3953 44.9142C11.3953 44.9142 11.4537 45.104 11.4556 45.104C11.4575 45.104 11.4895 45.0549 11.4895 45.0549Z" fill="#FEFEFE"/> +<path d="M17.7229 45.4343C17.7455 45.3787 17.77 45.3231 17.7927 45.2707C17.7625 45.3198 17.7323 45.3656 17.7041 45.4147C17.7041 45.4114 17.7229 45.4343 17.7229 45.4343Z" fill="#FEFEFE"/> +<path d="M18.5373 45.3395L18.5637 45.1071L18.4977 45.3231L18.5373 45.3395Z" fill="#FEFEFE"/> +<path d="M26.8583 45.4476C26.8866 45.3821 26.913 45.3166 26.9412 45.2512C26.9073 45.3101 26.8753 45.369 26.8413 45.4312C26.8432 45.4312 26.8583 45.4476 26.8583 45.4476Z" fill="#FEFEFE"/> +<path d="M27.7388 45.4213C27.7331 45.4278 27.7294 45.4344 27.7237 45.4376L27.7388 45.4213Z" fill="#FEFEFE"/> +<path d="M50.4336 45.2119L50.4524 45.0483L50.4204 45.2806L50.4336 45.2119Z" fill="#FEFEFE"/> +<path d="M51.7887 45.1824L51.8057 45.0514C51.8057 45.0514 51.8263 45.1431 51.8282 45.1398C51.832 45.1333 51.7887 45.1824 51.7887 45.1824Z" fill="#FEFEFE"/> +<path d="M-10.0855 45.9221C-10.0402 45.9254 -9.99501 45.9254 -9.94977 45.9286C-9.9837 45.8959 -10.0157 45.8632 -10.0497 45.8305L-10.0855 45.9221Z" fill="#FEFEFE"/> +<path d="M-5.44718 45.1531L-5.45094 45.3037C-5.45094 45.3037 -5.48666 45.1859 -5.49042 45.1924C-5.49418 45.1957 -5.44718 45.1531 -5.44718 45.1531Z" fill="#FEFEFE"/> +<path d="M-3.20978 45.657C-2.96476 45.5588 -2.72162 45.4606 -2.47282 45.3657C-2.46906 45.3689 -2.51429 45.31 -2.51052 45.3166C-2.74612 45.4017 -2.98361 45.4835 -3.21921 45.5751C-3.21921 45.585 -3.20978 45.657 -3.20978 45.657Z" fill="#FEFEFE"/> +<path d="M8.45713 45.6012C8.34969 45.3885 8.24414 45.1758 8.13483 44.9598C8.13294 44.9598 8.14613 44.891 8.14425 44.891C8.25357 45.143 8.36477 45.3983 8.47786 45.6503L8.45713 45.6012Z" fill="#FEFEFE"/> +<path d="M12.1193 45.9188C11.9101 45.6307 11.7009 45.3427 11.4917 45.0514C11.4898 45.0514 11.4578 45.1038 11.4559 45.1005C11.6613 45.382 11.8687 45.6667 12.0779 45.9482C12.0798 45.9515 12.1193 45.9188 12.1193 45.9188Z" fill="#FEFEFE"/> +<path d="M18.4976 45.3232C18.2394 45.3592 17.983 45.3985 17.7248 45.4345C17.7229 45.4345 17.7041 45.4116 17.7041 45.4116C17.9793 45.3854 18.2544 45.3592 18.5334 45.3363C18.5372 45.3396 18.4976 45.3232 18.4976 45.3232Z" fill="#FEFEFE"/> +<path d="M25.6711 45.8208L25.5825 45.7422L25.6447 45.8764L25.6711 45.8208Z" fill="#FEFEFE"/> +<path d="M27.7234 45.4376C27.4369 45.4409 27.1486 45.4442 26.8602 45.4475C26.8583 45.4475 26.8432 45.4311 26.8413 45.4311C27.1391 45.4278 27.4388 45.4245 27.7385 45.4213L27.7234 45.4376Z" fill="#FEFEFE"/> +<path d="M50.4203 45.2808L50.3713 45.3561C50.3713 45.3561 50.4354 45.2088 50.4354 45.2121C50.4335 45.2121 50.4203 45.2808 50.4203 45.2808Z" fill="#FEFEFE"/> +<path d="M47.5552 11.7208L47.5608 11.8648C47.5608 11.8648 47.5195 11.7862 47.5157 11.7928C47.512 11.796 47.5552 11.7208 47.5552 11.7208Z" fill="#FEFEFE"/> +<path d="M17.5002 11.7012C17.34 12.058 17.1779 12.4147 17.0177 12.7747C17.0177 12.778 17.0422 12.8533 17.0441 12.8566C17.2081 12.4966 17.3702 12.13 17.5341 11.7634C17.5341 11.7602 17.5002 11.7012 17.5002 11.7012Z" fill="#FEFEFE"/> +<path d="M13.8289 12.6144C13.8703 12.5948 13.9118 12.5784 13.9533 12.5588C13.9193 12.585 13.8854 12.6079 13.8534 12.6341C13.8534 12.6373 13.8289 12.6144 13.8289 12.6144Z" fill="#FEFEFE"/> +<path d="M-10.0497 45.8273L-10.0139 45.9811C-10.0139 45.9811 -10.0818 45.9124 -10.0836 45.9189C-10.0855 45.9222 -10.0497 45.8273 -10.0497 45.8273Z" fill="#FEFEFE"/> +<path d="M-4.18247 47.0087C-4.15608 46.9465 -4.13158 46.8876 -4.10519 46.8254C-4.141 46.8745 -4.17682 46.9236 -4.21263 46.9727L-4.18247 47.0087Z" fill="#FEFEFE"/> +<path d="M-3.34911 46.9663C-3.3001 46.5376 -3.2511 46.1055 -3.20586 45.667C-3.20963 45.6572 -3.21717 45.5851 -3.21905 45.5753C-3.27371 46.0466 -3.3246 46.5277 -3.37926 47.0056C-3.38115 47.0056 -3.34911 46.9663 -3.34911 46.9663Z" fill="#FEFEFE"/> +<path d="M8.47764 45.6504C8.472 46.1118 8.46448 46.5733 8.45884 47.0348C8.46072 47.0381 8.44192 47.0904 8.44192 47.0937C8.44756 46.5962 8.45132 46.0988 8.45508 45.598C8.45696 45.6013 8.47764 45.6504 8.47764 45.6504Z" fill="#FEFEFE"/> +<path d="M25.6448 45.8763C25.7937 46.1905 25.9407 46.5047 26.0896 46.8189L26.1311 46.7436C25.9784 46.436 25.8258 46.1316 25.6731 45.8239C25.6712 45.8206 25.6448 45.8763 25.6448 45.8763Z" fill="#FEFEFE"/> +<path d="M27.8083 46.4689L27.912 46.4559L27.8291 46.41L27.8083 46.4689Z" fill="#FEFEFE"/> +<path d="M-4.21439 46.9728C-3.92601 46.9696 -3.63952 46.9663 -3.35115 46.9663C-3.35115 46.9696 -3.38131 47.0056 -3.38131 47.0088C-3.64706 47.0088 -3.91471 47.0088 -4.18235 47.0088L-4.21439 46.9728Z" fill="#FEFEFE"/> +<path d="M0.229904 47.1791C0.190325 47.1693 0.152628 47.1562 0.113049 47.1464C0.158283 47.1726 0.20352 47.202 0.248755 47.2282L0.229904 47.1791Z" fill="#FEFEFE"/> +<path d="M26.0893 46.8188C26.1534 46.8286 26.2175 46.8417 26.2816 46.8515C26.2307 46.8155 26.1817 46.7795 26.1308 46.7435L26.0893 46.8188Z" fill="#FEFEFE"/> +<path d="M27.8291 46.41L27.8799 46.6228C27.8799 46.6228 27.8102 46.4722 27.8083 46.4722C27.8083 46.4689 27.8291 46.41 27.8291 46.41Z" fill="#FEFEFE"/> +<path d="M32.5413 47.5127L32.6129 47.3982L32.5526 47.5487L32.5413 47.5127Z" fill="#FEFEFE"/> +<path d="M33.5911 47.1266L33.74 47.0252L33.7249 47.2804L33.5911 47.1266Z" fill="#FEFEFE"/> +<path d="M37.8941 47.261C37.9337 47.3101 37.9713 47.3624 38.0109 47.4115C37.9789 47.3428 37.9487 47.2708 37.9167 47.2021L37.8941 47.261Z" fill="#FEFEFE"/> +<path d="M48.2019 47.4277L48.0963 47.3786C48.0963 47.3786 48.1661 47.3622 48.1661 47.3589C48.1661 47.3557 48.2019 47.4277 48.2019 47.4277Z" fill="#FEFEFE"/> +<path d="M49.9076 47.4704C50.0716 47.4802 50.2356 47.4867 50.3996 47.4965C50.3996 47.4933 50.4128 47.5162 50.4128 47.5162C50.2394 47.5129 50.0641 47.5096 49.8907 47.5096L49.9076 47.4704Z" fill="#FEFEFE"/> +<path d="M51.7453 46.7275C51.8094 46.7733 51.8848 46.7962 51.9338 46.8682C51.9602 46.9075 51.9414 47.0351 51.9414 47.1235C51.8886 46.9697 51.8358 46.8191 51.7831 46.6653C51.7849 46.6653 51.7453 46.7275 51.7453 46.7275Z" fill="#FEFEFE"/> +<path d="M-10.4118 48.3866L-10.4419 48.3343C-10.44 48.3343 -10.4118 48.3866 -10.4118 48.3866Z" fill="#FEFEFE"/> +<path d="M-1.80375 48.3377C-1.75474 48.3705 -1.70574 48.4032 -1.65673 48.4359C-1.69066 48.3901 -1.72459 48.3475 -1.75851 48.3017L-1.80375 48.3377Z" fill="#FEFEFE"/> +<path d="M0.250652 47.2281C0.228035 47.6535 0.203533 48.079 0.1828 48.511C0.184685 48.5143 0.177145 48.5765 0.177145 48.5797C0.194107 48.115 0.211071 47.6502 0.229919 47.1822C0.229919 47.179 0.250652 47.2281 0.250652 47.2281Z" fill="#FEFEFE"/> +<path d="M37.9167 47.2021C37.928 47.5686 37.9412 47.9319 37.9525 48.2985L37.9864 48.2526C37.9563 47.9254 37.9261 47.5948 37.8941 47.2642C37.8941 47.261 37.9167 47.2021 37.9167 47.2021Z" fill="#FEFEFE"/> +<path d="M28.4434 10.9154L28.4284 11.1118L28.466 10.8369L28.4434 10.9154Z" fill="#FEFEFE"/> +<path d="M-17.2762 11.2296L-17.1839 11.3016C-17.1839 11.3016 -17.2479 11.1609 -17.2461 11.1576C-17.2461 11.1544 -17.2762 11.2296 -17.2762 11.2296Z" fill="#FEFEFE"/> +<path d="M-22.2858 10.9417C-22.2839 11.2494 -22.2802 11.557 -22.2764 11.8647C-22.2745 11.8647 -22.2764 11.8811 -22.2764 11.8811C-22.2745 11.5832 -22.2708 11.2854 -22.2689 10.9908L-22.2858 10.9417Z" fill="#FEFEFE"/> +<path d="M-1.75851 48.3017L-1.79045 48.4556C-1.79045 48.4556 -1.79609 48.3312 -1.79797 48.3345C-1.80361 48.3377 -1.75851 48.3017 -1.75851 48.3017Z" fill="#FEFEFE"/> +<path d="M37.9542 48.2984C38.1502 48.6028 38.3481 48.9072 38.5442 49.2148L38.5781 49.169C38.3821 48.8646 38.186 48.5603 37.9881 48.2559C37.9881 48.2526 37.9542 48.2984 37.9542 48.2984Z" fill="#FEFEFE"/> +<path d="M23.7805 49.9609L23.9162 49.9478L23.8238 49.938L23.7805 49.9609Z" fill="#FEFEFE"/> +<path d="M34.7953 49.879C34.8802 49.6925 34.965 49.5059 35.0517 49.3194C34.9537 49.4896 34.8557 49.663 34.7576 49.8332L34.7953 49.879Z" fill="#FEFEFE"/> +<path d="M44.879 49.0184C44.7019 49.3195 44.5247 49.6239 44.3456 49.925C44.3438 49.925 44.3871 49.9872 44.3852 49.9872C44.5567 49.6828 44.7301 49.3784 44.9035 49.0708L44.879 49.0184Z" fill="#FEFEFE"/> +<path d="M28.4662 10.8369L28.4982 10.8794C28.4982 10.8794 28.436 10.9318 28.4398 10.9252C28.4436 10.9154 28.4662 10.8369 28.4662 10.8369Z" fill="#FEFEFE"/> +<path d="M8.77763 10.1433L8.77386 10.2807L8.79266 10.068L8.77763 10.1433Z" fill="#FEFEFE"/> +<path d="M4.71973 10.3068L4.61229 10.3984L4.69145 10.3624L4.71973 10.3068Z" fill="#FEFEFE"/> +<path d="M-17.7227 10.2643C-17.5738 10.585 -17.4249 10.9025 -17.2779 11.2265C-17.2779 11.2298 -17.2477 11.1545 -17.2477 11.1578C-17.391 10.837 -17.5323 10.5097 -17.6756 10.1857L-17.7227 10.2643Z" fill="#FEFEFE"/> +<path d="M-18.39 9.91743L-18.4088 10.1531C-18.4088 10.1531 -18.3675 9.94034 -18.3637 9.94689C-18.3581 9.95671 -18.39 9.91743 -18.39 9.91743Z" fill="#FEFEFE"/> +<path d="M-22.7703 10.971C-22.6083 10.9612 -22.4462 10.9547 -22.2841 10.9416C-22.2841 10.9383 -22.2671 10.9874 -22.2671 10.9874C-22.4386 10.9907 -22.6101 10.9939 -22.7817 10.9972L-22.7703 10.971Z" fill="#FEFEFE"/> +<path d="M-11.7744 50.8839C-11.929 50.8348 -12.0835 50.7857 -12.2381 50.7333L-12.2569 50.7072C-12.0967 50.7399 -11.9365 50.7759 -11.7763 50.8086L-11.7744 50.8839Z" fill="#FEFEFE"/> +<path d="M-0.810688 49.7971L-0.857685 50.0033C-0.857685 50.0033 -0.820087 49.8625 -0.820087 49.8593L-0.810688 49.7971Z" fill="#FEFEFE"/> +<path d="M23.8236 49.938L23.8067 50.0493C23.8067 50.0493 23.786 49.9511 23.7823 49.9543C23.7804 49.9609 23.8236 49.938 23.8236 49.938Z" fill="#FEFEFE"/> +<path d="M34.7576 49.8333C34.7576 49.8333 34.8046 49.8791 34.799 49.8791C34.7952 49.8791 34.7576 49.8333 34.7576 49.8333Z" fill="#FEFEFE"/> +<path d="M38.5252 49.892C38.4837 49.9934 38.4441 50.0949 38.4027 50.1963C38.4573 50.1211 38.512 50.0458 38.5685 49.9705C38.5704 49.9705 38.5252 49.892 38.5252 49.892Z" fill="#FEFEFE"/> +<path d="M-24.5965 51.6464C-24.6003 51.6726 -24.604 51.7021 -24.6097 51.7282L-24.5965 51.6464Z" fill="#FEFEFE"/> +<path d="M-12.2381 50.7333C-12.2795 50.7464 -12.321 50.7628 -12.3624 50.7792C-12.3266 50.7563 -12.2927 50.7301 -12.2569 50.7072L-12.2381 50.7333Z" fill="#FEFEFE"/> +<path d="M-11.7761 50.8052C-11.7553 50.8641 -11.7365 50.923 -11.7157 50.9852C-11.7346 50.946 -11.7553 50.91 -11.7742 50.8772C-11.7742 50.8838 -11.7761 50.8052 -11.7761 50.8052Z" fill="#FEFEFE"/> +<path d="M20.4256 50.9951L20.4689 51.198L20.3539 51.1719L20.4256 50.9951Z" fill="#FEFEFE"/> +<path d="M36.6897 9.46589L36.6011 9.50844L36.6614 9.46916L36.6897 9.46589Z" fill="#FEFEFE"/> +<path d="M26.1195 9.67184L26.2213 9.77658L26.1497 9.59329L26.1195 9.67184Z" fill="#FEFEFE"/> +<path d="M17.6834 10.0252C17.3875 10.0187 17.0916 10.0121 16.7957 10.0056C16.7957 10.0056 16.8164 9.97941 16.8164 9.97614C17.0935 9.98595 17.3724 9.99577 17.6533 10.0056C17.6551 10.0056 17.6834 10.0252 17.6834 10.0252Z" fill="#FEFEFE"/> +<path d="M12.4491 9.3969L12.4549 9.554L12.4491 9.32817V9.3969Z" fill="#FEFEFE"/> +<path d="M8.7925 10.068L8.8207 10.0844C8.8207 10.0844 8.77182 10.1596 8.7737 10.1531C8.77746 10.1433 8.7925 10.068 8.7925 10.068Z" fill="#FEFEFE"/> +<path d="M4.69137 10.3623L4.73649 10.1791C4.73649 10.1791 4.71769 10.3067 4.71957 10.3067L4.69137 10.3623Z" fill="#FEFEFE"/> +<path d="M-24.6097 51.7283L-24.6663 51.6891C-24.6663 51.6891 -24.5928 51.6334 -24.5947 51.64C-24.5966 51.6465 -24.6097 51.7283 -24.6097 51.7283Z" fill="#FEFEFE"/> +<path d="M-4.94004 9.39719L-5.04371 9.52155L-4.96643 9.40373C-4.96643 9.40046 -4.94004 9.39719 -4.94004 9.39719Z" fill="#FEFEFE"/> +<path d="M-17.6737 10.1855C-17.9093 10.1005 -18.1449 10.0121 -18.3843 9.92044C-18.3881 9.91717 -18.356 9.95317 -18.3598 9.94662C-18.1562 9.78625 -17.947 9.62915 -17.7397 9.47533L-17.751 9.46224C-17.7416 9.73061 -17.7303 9.99572 -17.7209 10.2641C-17.7227 10.2641 -17.6737 10.1855 -17.6737 10.1855Z" fill="#FEFEFE"/> +<path d="M44.6867 51.7578L44.7281 52L44.6037 51.9673L44.6867 51.7578Z" fill="#FEFEFE"/> +<path d="M36.6614 9.46896L36.7312 9.35768C36.7312 9.35768 36.6859 9.46896 36.6878 9.46896C36.6897 9.46569 36.6614 9.46896 36.6614 9.46896Z" fill="#FEFEFE"/> +<path d="M30.2926 8.78175L30.2379 8.96503C30.2379 8.96503 30.334 8.87339 30.3321 8.87012C30.3321 8.86684 30.2926 8.78175 30.2926 8.78175Z" fill="#FEFEFE"/> +<path d="M26.1497 9.59345C26.0008 9.2498 25.8519 8.90615 25.703 8.56249L25.686 8.48395C25.8312 8.87669 25.9763 9.27271 26.1214 9.66873C26.1195 9.672 26.1497 9.59345 26.1497 9.59345Z" fill="#FEFEFE"/> +<path d="M12.4491 9.32821L12.5018 9.29549C12.5018 9.29549 12.4472 9.40676 12.4491 9.40022C12.4491 9.39695 12.4491 9.32821 12.4491 9.32821Z" fill="#FEFEFE"/> +<path d="M8.2667 8.45094L8.23662 8.64077C8.23662 8.64077 8.23098 8.50986 8.22721 8.51313C8.22534 8.51313 8.2667 8.45094 8.2667 8.45094Z" fill="#FEFEFE"/> +<path d="M6.61388 8.80449L6.53283 8.74557C6.53283 8.74557 6.65534 8.76848 6.65723 8.76848C6.65911 8.77176 6.61388 8.80449 6.61388 8.80449Z" fill="#FEFEFE"/> +<path d="M-17.7416 9.47551L-17.6869 9.35768L-17.7529 9.46242L-17.7416 9.47551Z" fill="#FEFEFE"/> +<path d="M30.6996 7.82932C30.562 8.14679 30.4263 8.46098 30.2906 8.78172C30.2924 8.785 30.332 8.87009 30.3339 8.87337C30.4715 8.55262 30.6072 8.22861 30.7429 7.90459L30.6996 7.82932Z" fill="#FEFEFE"/> +<path d="M25.7029 8.56249L25.6257 8.51667C25.6257 8.51667 25.6916 8.49376 25.6879 8.48722C25.686 8.48395 25.7029 8.56249 25.7029 8.56249Z" fill="#FEFEFE"/> +<path d="M24.3459 7.71805C24.3497 7.69187 24.3534 7.66241 24.3591 7.63623L24.3459 7.71805Z" fill="#FEFEFE"/> +<path d="M22.514 7.81313L22.465 7.93096L22.5329 7.84259L22.514 7.81313Z" fill="#FEFEFE"/> +<path d="M-2.19582 8.73935L-2.22778 8.60516C-2.22778 8.60516 -2.2353 8.79826 -2.23718 8.80153C-2.23906 8.80481 -2.19582 8.73935 -2.19582 8.73935Z" fill="#FEFEFE"/> +<path d="M43.9197 7.13217C43.882 7.15508 43.8443 7.18126 43.8066 7.20417C43.8537 7.19763 43.9008 7.19435 43.9479 7.18781C43.9479 7.18453 43.9197 7.13217 43.9197 7.13217Z" fill="#FEFEFE"/> +<path d="M30.7411 7.9045L30.7693 7.78013L30.6996 7.82923L30.7411 7.9045Z" fill="#FEFEFE"/> +<path d="M24.3573 7.6394L24.4138 7.67868C24.4138 7.67868 24.3403 7.73432 24.3422 7.72777C24.346 7.71795 24.3573 7.6394 24.3573 7.6394Z" fill="#FEFEFE"/> +<path d="M20.1221 7.0768L20.0486 7.26335L20.1504 7.10952L20.1221 7.0768Z" fill="#FEFEFE"/> +<path d="M17.3872 6.79819L17.3778 7.0142C17.3778 7.0142 17.3553 6.86365 17.3515 6.86692C17.3496 6.86365 17.3872 6.79819 17.3872 6.79819Z" fill="#FEFEFE"/> +<path d="M-15.0012 7.07642L-15.2048 7.10588L-15.4102 7.07315L-15.4592 7.1026C-15.2915 7.1026 -15.1237 7.1026 -14.956 7.1026L-15.0012 7.07642Z" fill="#FEFEFE"/> +<path d="M44.8621 6.28797L44.9714 6.4058L44.9036 6.21924L44.8621 6.28797Z" fill="#FEFEFE"/> +<path d="M44.4417 6.13055C44.2683 6.46438 44.0949 6.79495 43.9196 7.13205C43.9196 7.13205 43.9478 7.18769 43.9478 7.19096C44.1212 6.8604 44.2947 6.52657 44.4681 6.19274C44.4681 6.18946 44.4417 6.13055 44.4417 6.13055Z" fill="#FEFEFE"/> +<path d="M33.4874 6.27478L33.4158 6.3566L33.4666 6.24859L33.4874 6.27478Z" fill="#FEFEFE"/> +<path d="M25.7314 6.31729L25.6371 6.36966L25.7031 6.37293L25.7314 6.31729Z" fill="#FEFEFE"/> +<path d="M20.6216 6.35648C20.4557 6.5954 20.2898 6.83432 20.124 7.07652L20.1522 7.11252C20.3181 6.88014 20.4859 6.65104 20.6536 6.41867L20.6216 6.35648Z" fill="#FEFEFE"/> +<path d="M19.4473 6.16974C19.3964 6.17301 19.3455 6.17956 19.2946 6.18283C19.3342 6.20901 19.3738 6.23847 19.4134 6.26465L19.4473 6.16974Z" fill="#FEFEFE"/> +<path d="M11.2316 6.6871L11.3485 6.6151L11.3334 6.8082L11.2316 6.6871Z" fill="#FEFEFE"/> +<path d="M-9.48051 6.26814L-9.54648 6.3205L-9.50501 6.25177L-9.48051 6.26814Z" fill="#FEFEFE"/> +<path d="M-15.005 6.27127C-14.9711 6.448 -14.9221 6.62147 -14.9089 6.80147C-14.9032 6.88657 -14.9673 6.98475 -15.0012 7.0764L-14.956 7.10258C-14.956 6.81456 -14.956 6.52328 -14.9579 6.23527L-15.005 6.27127Z" fill="#FEFEFE"/> +<path d="M-16.1473 6.53625C-15.9004 6.45771 -15.6516 6.37588 -15.4047 6.29733L-15.4613 6.2286C-15.4613 6.51989 -15.4613 6.81117 -15.4594 7.10246L-15.4104 7.07301C-15.6441 6.893 -15.8759 6.71299 -16.1153 6.53953C-16.1191 6.5428 -16.1473 6.53625 -16.1473 6.53625Z" fill="#FEFEFE"/> +<path d="M46.711 6.28102C46.7355 6.17301 46.7487 6.04864 46.7902 5.96355C46.8109 5.921 46.8825 5.95045 46.9296 5.94391C46.8429 6.03228 46.7581 6.12064 46.6714 6.20574C46.6714 6.20901 46.711 6.28102 46.711 6.28102Z" fill="#FEFEFE"/> +<path d="M33.4666 6.24844C33.5043 6.23208 33.5401 6.21244 33.5778 6.19608C33.5477 6.22226 33.5175 6.24844 33.4874 6.27463L33.4666 6.24844Z" fill="#FEFEFE"/> +<path d="M25.703 6.37307L25.7443 6.21924C25.7443 6.21924 25.7293 6.31743 25.7312 6.31743L25.703 6.37307Z" fill="#FEFEFE"/> +<path d="M20.6519 6.41544C20.8517 6.11433 21.0534 5.81323 21.2551 5.51212C21.257 5.51212 21.2136 5.46958 21.2155 5.46958C21.0195 5.76414 20.8197 6.05869 20.6218 6.35325C20.6218 6.35652 20.6519 6.41544 20.6519 6.41544Z" fill="#FEFEFE"/> +<path d="M19.4136 6.26464L19.3458 6.1599C19.3458 6.1599 19.4419 6.18282 19.4438 6.17627C19.4475 6.16972 19.4136 6.26464 19.4136 6.26464Z" fill="#FEFEFE"/> +<path d="M-9.50485 6.25177L-9.45019 6.11104C-9.45019 6.11104 -9.48411 6.27141 -9.48223 6.27141C-9.48034 6.26813 -9.50485 6.25177 -9.50485 6.25177Z" fill="#FEFEFE"/> +<path d="M43.1601 5.08669L43.3109 4.97869L43.3014 5.23397L43.1601 5.08669Z" fill="#FEFEFE"/> +<path d="M40.3631 5.6363L40.3856 5.42356C40.3856 5.42356 40.3988 5.57084 40.4007 5.56757C40.4026 5.56757 40.3631 5.6363 40.3631 5.6363Z" fill="#FEFEFE"/> +<path d="M-19.193 4.67073C-19.193 4.67073 -19.1573 4.71982 -19.1554 4.71982L-19.193 4.67073Z" fill="#FEFEFE"/> +<path d="M-22.3291 4.70034C-22.0897 4.78543 -21.8503 4.86725 -21.611 4.95235C-21.611 4.95235 -21.6279 4.97199 -21.626 4.97199C-21.8729 4.88035 -22.1217 4.78871 -22.3686 4.69707L-22.3291 4.70034Z" fill="#FEFEFE"/> +<path d="M38.4254 3.85268C38.4254 3.85268 38.4648 3.92468 38.4667 3.92796C38.4667 3.92468 38.4254 3.85268 38.4254 3.85268Z" fill="#FEFEFE"/> +<path d="M32.0794 3.98691L32.1548 4.02945C32.1548 4.02945 32.0963 4.05564 32.0982 4.06218C32.102 4.06873 32.0794 3.98691 32.0794 3.98691Z" fill="#FEFEFE"/> +<path d="M9.59179 3.8952C9.56163 3.94102 9.53148 3.98357 9.49944 4.02939C9.5409 3.99339 9.58426 3.96066 9.62761 3.92793C9.62949 3.92793 9.59179 3.8952 9.59179 3.8952Z" fill="#FEFEFE"/> +<path d="M1.3477 4.33066L1.20823 4.41576L1.22519 4.18666L1.3477 4.33066Z" fill="#FEFEFE"/> +<path d="M-1.55864 4.14065C-1.55864 4.14065 -1.56438 4.18647 -1.5663 4.18319L-1.55864 4.14065Z" fill="#FEFEFE"/> +<path d="M-3.3909 4.13414C-3.62461 4.31088 -3.86021 4.48434 -4.09581 4.6578C-4.0977 4.6578 -4.06 4.71671 -4.06 4.71671C-3.84891 4.54325 -3.63592 4.37306 -3.42483 4.20287L-3.3909 4.13414Z" fill="#FEFEFE"/> +<path d="M-13.5706 4.67437C-13.5404 4.64491 -13.5122 4.61546 -13.482 4.586C-13.499 4.61546 -13.5178 4.64491 -13.531 4.67437C-13.5291 4.6711 -13.5706 4.67437 -13.5706 4.67437Z" fill="#FEFEFE"/> +<path d="M-17.1875 3.86244C-17.2214 4.15045 -17.2553 4.43847 -17.2892 4.72321L-17.244 4.64466C-17.4118 4.64138 -17.5814 4.63811 -17.7491 4.63811L-17.7039 4.71666C-17.702 4.42864 -17.702 4.13736 -17.7001 3.84935L-17.7397 3.91481C-17.5701 3.91153 -17.4004 3.90826 -17.2327 3.90499L-17.1875 3.86244Z" fill="#FEFEFE"/> +<path d="M-18.6444 3.79715C-18.8272 4.08843 -19.0081 4.37972 -19.191 4.67101C-19.1928 4.67101 -19.1533 4.7201 -19.1551 4.7201C-18.978 4.42881 -18.8008 4.13753 -18.6236 3.84297L-18.6444 3.79715Z" fill="#FEFEFE"/> +<path d="M-22.3688 4.6969L-22.3896 4.63471C-22.3896 4.63471 -22.3236 4.70672 -22.3255 4.70345C-22.3293 4.70017 -22.3688 4.6969 -22.3688 4.6969Z" fill="#FEFEFE"/> +<path d="M50.409 4.07508C50.5862 3.76743 50.7652 3.45978 50.9443 3.14886C50.9462 3.14886 50.9009 3.08667 50.9009 3.08667C50.7256 3.38778 50.5485 3.68888 50.3713 3.98999C50.3732 3.99653 50.409 4.07508 50.409 4.07508Z" fill="#FEFEFE"/> +<path d="M46.5339 3.39463L46.566 3.60737L46.4566 3.56809L46.5339 3.39463Z" fill="#FEFEFE"/> +<path d="M39.0964 3.33545C38.8721 3.50891 38.6497 3.6791 38.4254 3.85256C38.4254 3.85256 38.4668 3.92784 38.4649 3.92457C38.6836 3.74783 38.9041 3.5711 39.1227 3.39436L39.0964 3.33545Z" fill="#FEFEFE"/> +<path d="M10.2591 3.08017C10.0386 3.35182 9.81619 3.62347 9.59378 3.89511C9.5919 3.89511 9.62959 3.92784 9.62771 3.92457C9.82184 3.6431 10.0179 3.36491 10.2139 3.08671L10.2591 3.08017Z" fill="#FEFEFE"/> +<path d="M7.56926 3.4337C7.43921 3.23733 7.31105 3.04423 7.181 2.85113L7.16215 2.82822C7.30728 3.02459 7.4524 3.21769 7.59753 3.41406L7.56926 3.4337Z" fill="#FEFEFE"/> +<path d="M6.28018 2.8643L6.30086 3.01812L6.30274 2.84139L6.28018 2.8643Z" fill="#FEFEFE"/> +<path d="M-1.88679 3.39107C-1.77747 3.63981 -1.67004 3.88855 -1.56072 4.13729C-1.56072 4.13729 -1.56826 4.17984 -1.56637 4.18311C-1.66438 3.89837 -1.76428 3.61363 -1.86417 3.32561L-1.88679 3.39107Z" fill="#FEFEFE"/> +<path d="M-3.42466 4.20304L-3.46613 3.96739C-3.46613 3.96739 -3.39451 4.1343 -3.39262 4.1343C-3.39074 4.1343 -3.42466 4.20304 -3.42466 4.20304Z" fill="#FEFEFE"/> +<path d="M-17.2308 3.90502L-17.2083 3.78065C-17.2083 3.78065 -17.1951 3.87229 -17.1914 3.86901C-17.1876 3.86247 -17.2308 3.90502 -17.2308 3.90502Z" fill="#FEFEFE"/> +<path d="M40.7853 2.19651L40.7967 2.34052L40.791 2.12123L40.7853 2.19651Z" fill="#FEFEFE"/> +<path d="M39.1246 3.39435C39.1115 3.36816 39.0983 3.34525 39.0908 3.32561C39.0964 3.33543 39.1246 3.39435 39.1246 3.39435Z" fill="#FEFEFE"/> +<path d="M10.2138 3.08679C10.2477 3.05079 10.2797 3.01479 10.3137 2.97879C10.2929 3.01479 10.2722 3.04752 10.2552 3.08352C10.259 3.08025 10.2138 3.08679 10.2138 3.08679Z" fill="#FEFEFE"/> +<path d="M6.30279 2.84141C6.58928 2.83486 6.87388 2.83159 7.16037 2.82504C7.16226 2.82504 7.17922 2.84795 7.18111 2.84795C6.88142 2.85123 6.58363 2.85777 6.28206 2.86105C6.28017 2.86432 6.30279 2.84141 6.30279 2.84141Z" fill="#FEFEFE"/> +<path d="M4.12597 2.16724L4.11845 2.35052L4.16356 2.24579L4.12597 2.16724Z" fill="#FEFEFE"/> +<path d="M-1.86407 3.32558C-1.80187 3.04411 -1.73968 2.76265 -1.67748 2.48118L-1.6379 2.42554C-1.71706 2.74301 -1.7981 3.05721 -1.88103 3.38122C-1.88669 3.39104 -1.86407 3.32558 -1.86407 3.32558Z" fill="#FEFEFE"/> +<path d="M52.2241 2.26867C52.0601 2.2654 51.8942 2.2654 51.7284 2.26212L51.7642 2.33086C51.9131 2.06903 52.062 1.81047 52.2109 1.54864L52.1807 1.49627C52.1807 1.77447 52.1807 2.05593 52.1807 2.33413C52.1826 2.33413 52.2241 2.26867 52.2241 2.26867Z" fill="#FEFEFE"/> +<path d="M40.7908 2.12133L40.8398 2.11806C40.8398 2.11806 40.7833 2.21297 40.7852 2.20642C40.7852 2.19661 40.7908 2.12133 40.7908 2.12133Z" fill="#FEFEFE"/> +<path d="M37.0664 1.57782L37.0137 1.70547L37.0947 1.63346C37.0966 1.63346 37.0664 1.57782 37.0664 1.57782Z" fill="#FEFEFE"/> +<path d="M18.8781 1.5193L18.7669 1.5913L18.8517 1.50294L18.8781 1.5193Z" fill="#FEFEFE"/> +<path d="M4.16365 2.24571C4.21266 2.17698 4.26166 2.10825 4.31255 2.03952C4.25224 2.08534 4.19193 2.13116 4.12973 2.17371C4.12596 2.16717 4.16365 2.24571 4.16365 2.24571Z" fill="#FEFEFE"/> +<path d="M-1.67731 2.48134L-1.63031 2.31115C-1.63031 2.31115 -1.64347 2.42897 -1.64159 2.42897C-1.63971 2.4257 -1.67731 2.48134 -1.67731 2.48134Z" fill="#FEFEFE"/> +<path d="M-8.90958 1.55529L-9.03963 1.60439L-8.95105 1.63384L-8.90958 1.55529Z" fill="#FEFEFE"/> +<path d="M-10.325 2.59266L-10.3344 2.36684C-10.3344 2.36684 -10.2987 2.51739 -10.2968 2.52066L-10.325 2.59266Z" fill="#FEFEFE"/> +<path d="M52.2127 1.54868C52.3918 1.26721 52.5727 0.985743 52.7518 0.704275L52.7952 0.635546C52.5916 0.923559 52.388 1.21157 52.1826 1.49958C52.1826 1.49631 52.2127 1.54868 52.2127 1.54868Z" fill="#FEFEFE"/> +<path d="M37.6018 0.566528C37.4246 0.903635 37.2456 1.24074 37.0665 1.57785C37.0665 1.57785 37.0948 1.63348 37.0948 1.63676C37.272 1.30293 37.451 0.96582 37.6282 0.628714C37.6301 0.625441 37.6018 0.566528 37.6018 0.566528Z" fill="#FEFEFE"/> +<path d="M32.5299 0.543682L32.5242 0.726963C32.5242 0.726963 32.5204 0.632048 32.5186 0.628775C32.5167 0.625502 32.5299 0.543682 32.5299 0.543682Z" fill="#FEFEFE"/> +<path d="M18.8519 1.50299C18.8934 1.47353 18.9367 1.44735 18.9782 1.41789C18.9443 1.4539 18.9103 1.48662 18.8764 1.51935C18.8783 1.51935 18.8519 1.50299 18.8519 1.50299Z" fill="#FEFEFE"/> +<path d="M16.3619 1.01506L16.394 1.23107L16.2846 1.19507L16.3619 1.01506Z" fill="#FEFEFE"/> +<path d="M-8.95092 1.6337L-8.96408 1.4766C-8.96408 1.4766 -8.91521 1.56169 -8.91332 1.55842C-8.90956 1.55515 -8.95092 1.6337 -8.95092 1.6337Z" fill="#FEFEFE"/> +<path d="M52.7517 0.704144L52.7121 0.592867C52.7121 0.592867 52.7875 0.648506 52.7913 0.641962C52.7951 0.632143 52.7517 0.704144 52.7517 0.704144Z" fill="#FEFEFE"/> +<path d="M21.3678 0.154484C21.6279 0.0759354 21.888 -0.00588799 22.1481 -0.0844364L22.1896 -0.162985C21.9239 -0.0484352 21.66 0.0661144 21.3923 0.180666C21.3923 0.183939 21.3678 0.154484 21.3678 0.154484Z" fill="#FEFEFE"/> +<path d="M14.6676 -0.0322514C14.6299 -0.00279617 14.5941 0.0266609 14.5564 0.059391C14.6016 0.039753 14.6469 0.0233879 14.6921 0.00374985C14.694 0.00374985 14.6676 -0.0322514 14.6676 -0.0322514Z" fill="#FEFEFE"/> +<path d="M43.4052 -0.510279L43.5013 -0.588827L43.3863 -0.55937L43.4052 -0.510279Z" fill="#FEFEFE"/> +<path d="M35.7341 -0.843763C35.7511 -0.578661 35.7699 -0.316832 35.7888 -0.0517273C35.7906 -0.0517273 35.7737 -0.025547 35.7737 -0.025547C35.7718 -0.320105 35.7718 -0.614662 35.7699 -0.912493L35.7341 -0.843763Z" fill="#FEFEFE"/> +<path d="M32.5827 -0.0878277C32.5752 -0.336567 32.5676 -0.582033 32.5601 -0.83077L32.53 -0.909319C32.5319 -0.614761 32.5319 -0.320204 32.5338 -0.0256462L32.5827 -0.0878277Z" fill="#FEFEFE"/> +<path d="M24.9153 -0.513453L25.0491 -0.592001L25.0322 -0.375992L24.9153 -0.513453Z" fill="#FEFEFE"/> +<path d="M22.1485 -0.0847836L22.0938 -0.235336C22.0938 -0.235336 22.1843 -0.153513 22.1862 -0.156786C22.19 -0.163332 22.1485 -0.0847836 22.1485 -0.0847836Z" fill="#FEFEFE"/> +<path d="M15.1368 -0.798258C14.9804 -0.542974 14.8258 -0.287689 14.6694 -0.0324059L14.6939 0.00359535C14.8503 -0.245144 15.0049 -0.497154 15.1613 -0.749165L15.1368 -0.798258Z" fill="#FEFEFE"/> +<path d="M11.1242 -0.0811176C11.1242 -0.0811176 11.0847 -0.0156593 11.0866 -0.0156593L11.1242 -0.0811176Z" fill="#FEFEFE"/> +<path d="M-7.6429 -0.840666L-7.51473 -0.742479L-7.59389 -0.922487L-7.6429 -0.840666Z" fill="#FEFEFE"/> +<path d="M-8.37772 -1.17123C-8.37396 -1.1745 -8.3702 -1.17777 -8.36268 -1.17777C-8.35704 -1.17777 -8.37772 -1.17123 -8.37772 -1.17123Z" fill="#FEFEFE"/> +<path d="M-24.4628 -0.912712C-24.5174 -0.951986 -24.5702 -0.991261 -24.6249 -1.03053C-24.5872 -0.978168 -24.5495 -0.925802 -24.5118 -0.873438L-24.4628 -0.912712Z" fill="#FEFEFE"/> +<path d="M58.7096 -1.7307L58.5682 -1.68488H58.6662L58.7096 -1.7307Z" fill="#FEFEFE"/> +<path d="M54.9721 -1.88127L54.9947 -1.66199L55.0135 -1.80926L54.9721 -1.88127Z" fill="#FEFEFE"/> +<path d="M43.3861 -0.559042C43.3861 -1.03361 43.3842 -1.5049 43.3823 -1.97947C43.3823 -1.98274 43.4011 -2.02856 43.3993 -2.03183C43.4011 -1.52781 43.403 -1.02052 43.4049 -0.509949L43.3861 -0.559042Z" fill="#FEFEFE"/> +<path d="M35.2929 -0.879971C35.4022 -1.07962 35.5097 -1.27926 35.619 -1.47891C35.6567 -1.26617 35.6962 -1.05343 35.7339 -0.840696L35.7679 -0.909426C35.6133 -0.893061 35.4588 -0.876698 35.3023 -0.860334C35.3042 -0.863605 35.2929 -0.879971 35.2929 -0.879971Z" fill="#FEFEFE"/> +<path d="M33.4854 -1.67518C33.6343 -1.65555 33.7851 -1.64245 33.934 -1.63591L33.8963 -1.70791C33.7455 -1.43626 33.5947 -1.16462 33.4439 -0.89624L33.4854 -0.843874C33.4873 -1.13189 33.4873 -1.42317 33.4892 -1.71118L33.4854 -1.67518Z" fill="#FEFEFE"/> +<path d="M32.5599 -0.834152C32.7031 -1.11562 32.8483 -1.40036 32.9915 -1.68183L32.984 -1.70801C32.9859 -1.41673 32.9859 -1.12544 32.9877 -0.837427L33.0367 -0.906157C32.8671 -0.90943 32.6975 -0.912701 32.5278 -0.915974L32.5599 -0.834152Z" fill="#FEFEFE"/> +<path d="M15.6627 -1.80606C15.4874 -1.47223 15.3121 -1.13512 15.1368 -0.798019L15.1613 -0.745651C15.3366 -1.07948 15.5119 -1.41332 15.6872 -1.74715C15.6872 -1.7537 15.6627 -1.80606 15.6627 -1.80606Z" fill="#FEFEFE"/> +<path d="M9.77849 -0.595276L9.75781 -0.821106C9.75781 -0.821106 9.78037 -0.677099 9.78225 -0.673826C9.78413 -0.670553 9.77849 -0.595276 9.77849 -0.595276Z" fill="#FEFEFE"/> +<path d="M-3.55291 -1.68834C-3.50202 -1.32178 -3.45113 -0.955214 -3.39836 -0.585381C-3.39647 -0.585381 -3.41532 -0.526468 -3.41532 -0.526468C-3.46621 -0.902849 -3.51899 -1.27923 -3.56988 -1.65888L-3.55291 -1.68834Z" fill="#FEFEFE"/> +<path d="M-7.59363 -0.922556C-7.85374 -1.00438 -8.11384 -1.0862 -8.37583 -1.1713C-8.37771 -1.1713 -8.35886 -1.17784 -8.36263 -1.17784C-8.16285 -1.41349 -7.9574 -1.65241 -7.75761 -1.8946C-7.76138 -1.90114 -7.78777 -1.97642 -7.79154 -1.98297C-7.74442 -1.60659 -7.69541 -1.22366 -7.64641 -0.844007C-7.64264 -0.840734 -7.59363 -0.922556 -7.59363 -0.922556Z" fill="#FEFEFE"/> +<path d="M-24.5099 -0.873316L-24.5136 -1.05005C-24.5136 -1.05005 -24.4704 -0.906042 -24.4666 -0.909315C-24.4629 -0.912588 -24.5099 -0.873316 -24.5099 -0.873316Z" fill="#FEFEFE"/> +<path d="M58.6662 -1.68495L58.6568 -1.79622C58.6568 -1.79622 58.7038 -1.71768 58.7075 -1.72095C58.7094 -1.73077 58.6662 -1.68495 58.6662 -1.68495Z" fill="#FEFEFE"/> +<path d="M55.0137 -1.80925L54.9289 -1.80271C54.9289 -1.80271 54.976 -1.87471 54.9742 -1.87799C54.9723 -1.88126 55.0137 -1.80925 55.0137 -1.80925Z" fill="#FEFEFE"/> +<path d="M39.8637 -2.43769C39.8411 -2.32968 39.8316 -2.20858 39.794 -2.12349C39.7751 -2.08421 39.7016 -2.12349 39.6545 -2.12349C39.7412 -2.20858 39.8279 -2.29695 39.9127 -2.38204L39.8637 -2.43769Z" fill="#FEFEFE"/> +<path d="M33.936 -1.63252C33.9944 -1.80926 34.0529 -1.98599 34.1113 -2.16273C34.0416 -2.0089 33.9699 -1.85508 33.9002 -1.70452C33.8983 -1.70452 33.936 -1.63252 33.936 -1.63252Z" fill="#FEFEFE"/> +<path d="M32.9916 -1.68183C33.1555 -1.67855 33.3214 -1.67528 33.4854 -1.67201L33.4929 -1.70474C33.3233 -1.70474 33.1537 -1.70474 32.984 -1.70801L32.9916 -1.68183Z" fill="#FEFEFE"/> +<path d="M27.0658 -1.71127C27.0507 -1.77345 27.0337 -1.83891 27.0187 -1.9011C27.0375 -1.85528 27.0545 -1.80946 27.0733 -1.76691L27.0658 -1.71127Z" fill="#FEFEFE"/> +<path d="M-3.56975 -1.65876L-3.63948 -1.79622L-3.55278 -1.68822L-3.56975 -1.65876Z" fill="#FEFEFE"/> +<path d="M39.9123 -2.38199L39.886 -2.52273L39.8615 -2.43763C39.8634 -2.43763 39.9123 -2.38199 39.9123 -2.38199Z" fill="#FEFEFE"/> +<path d="M14.8487 -3.2854C14.6489 -3.01375 14.4491 -2.74538 14.2494 -2.47373L14.2814 -2.41809C14.4548 -2.69301 14.6282 -2.96793 14.8016 -3.24613L14.8487 -3.2854Z" fill="#FEFEFE"/> +<path d="M8.42311 -2.52637C8.42311 -2.52637 8.37423 -2.51001 8.37611 -2.51328C8.37799 -2.51328 8.42311 -2.52637 8.42311 -2.52637Z" fill="#FEFEFE"/> +<path d="M17.2424 -3.51461L17.201 -3.74044L17.3178 -3.71098L17.2424 -3.51461Z" fill="#FEFEFE"/> +<path d="M14.8013 -3.24292L14.8126 -3.37711C14.8126 -3.37711 14.8427 -3.27565 14.8465 -3.27892C14.8484 -3.28547 14.8013 -3.24292 14.8013 -3.24292Z" fill="#FEFEFE"/> +<path d="M12.374 -4.15276C12.3928 -4.09385 12.4117 -4.03494 12.4324 -3.97603C12.4286 -4.05785 12.4249 -4.13967 12.4211 -4.22149L12.374 -4.15276Z" fill="#FEFEFE"/> +<path d="M44.5795 -4.56181C44.5343 -4.61745 44.4891 -4.67309 44.4438 -4.72872C44.4834 -4.65345 44.523 -4.58144 44.5607 -4.50617L44.5795 -4.56181Z" fill="#FEFEFE"/> +<path d="M26.6059 -4.10372C26.6455 -4.11354 26.685 -4.12336 26.7246 -4.13645C26.6907 -4.11354 26.6568 -4.09063 26.6228 -4.06772L26.6059 -4.10372Z" fill="#FEFEFE"/> +<path d="M23.4186 -3.92387C23.4186 -3.92387 23.4074 -3.99587 23.4093 -3.9926C23.4112 -3.9926 23.4186 -3.92387 23.4186 -3.92387Z" fill="#FEFEFE"/> +<path d="M20.8327 -4.17887L20.7083 -4.15924C20.7083 -4.15924 20.7875 -4.20833 20.7894 -4.2116C20.7913 -4.21488 20.8327 -4.17887 20.8327 -4.17887Z" fill="#FEFEFE"/> +<path d="M14.0661 -4.54547L14.1 -4.34583L13.9945 -4.37856L14.0661 -4.54547Z" fill="#FEFEFE"/> +<path d="M12.4189 -4.22466L12.4698 -4.15594C12.4698 -4.15594 12.3699 -4.14612 12.3718 -4.14939C12.3737 -4.15266 12.4189 -4.22466 12.4189 -4.22466Z" fill="#FEFEFE"/> +<path d="M1.71714 -4.63686L1.77934 -4.34557L1.62102 -4.37503L1.71714 -4.63686Z" fill="#FEFEFE"/> +<path d="M-2.53484 -4.05476L-2.58196 -4.20531C-2.58196 -4.20531 -2.49715 -4.11694 -2.49338 -4.12349C-2.49149 -4.13003 -2.53484 -4.05476 -2.53484 -4.05476Z" fill="#FEFEFE"/> +<path d="M44.581 -5.93643C44.5791 -5.47823 44.5791 -5.02003 44.5791 -4.56183C44.581 -4.56183 44.5603 -4.50619 44.5622 -4.50619C44.5622 -4.99712 44.5603 -5.49132 44.5603 -5.9888C44.5622 -5.9888 44.581 -5.93643 44.581 -5.93643Z" fill="#FEFEFE"/> +<path d="M43.4428 -5.62229C43.4202 -5.57975 43.3976 -5.5372 43.3731 -5.49465C43.3825 -5.53065 43.3919 -5.56338 43.3976 -5.59284C43.3957 -5.59284 43.4428 -5.62229 43.4428 -5.62229Z" fill="#FEFEFE"/> +<path d="M41.9879 -5.8679L41.9464 -5.66498L42.0274 -5.81226L41.9879 -5.8679Z" fill="#FEFEFE"/> +<path d="M37.0685 -5.62547C37.0346 -5.58947 37.0025 -5.55346 36.9705 -5.51419C36.9912 -5.55019 37.0119 -5.58619 37.027 -5.61892C37.0233 -5.61892 37.0685 -5.62547 37.0685 -5.62547Z" fill="#FEFEFE"/> +<path d="M32.6825 -5.82188C32.8012 -5.66805 32.9332 -5.60587 33.0783 -5.64187L33.1254 -5.67787L32.935 -5.87424L32.7258 -5.7957L32.6825 -5.82188Z" fill="#FEFEFE"/> +<path d="M10.1346 -5.65168C9.98001 -5.38658 9.82734 -5.12475 9.67279 -4.85965L9.72368 -4.79419C9.72368 -5.08875 9.72368 -5.38003 9.72179 -5.67132L9.68033 -5.59604C9.84619 -5.59604 10.0121 -5.59932 10.1798 -5.59932L10.1346 -5.65168Z" fill="#FEFEFE"/> +<path d="M-7.81229 -5.7205L-7.80853 -5.52413L-7.76717 -5.69105L-7.81229 -5.7205Z" fill="#FEFEFE"/> +<path d="M48.1774 -6.43051C48.1397 -6.46978 48.1001 -6.50578 48.0624 -6.54506C48.0869 -6.50906 48.1133 -6.47305 48.1378 -6.43705L48.1774 -6.43051Z" fill="#FEFEFE"/> +<path d="M42.0274 -5.81207C42.0971 -5.8448 42.165 -5.87753 42.2347 -5.91026C42.1556 -5.89062 42.0745 -5.87426 41.9916 -5.86117C41.9878 -5.86771 42.0274 -5.81207 42.0274 -5.81207Z" fill="#FEFEFE"/> +<path d="M38.5707 -5.3669L38.5538 -5.58945C38.5538 -5.58945 38.5933 -5.44872 38.5951 -5.44872C38.597 -5.44545 38.5707 -5.3669 38.5707 -5.3669Z" fill="#FEFEFE"/> +<path d="M33.0781 -5.6451L33.0818 -5.7662C33.0818 -5.7662 33.1157 -5.67128 33.1194 -5.67456C33.1251 -5.67783 33.0781 -5.6451 33.0781 -5.6451Z" fill="#FEFEFE"/> +<path d="M32.7258 -5.79584L32.5919 -5.72711C32.5919 -5.72711 32.6786 -5.81548 32.6805 -5.81875C32.6824 -5.82202 32.7258 -5.79584 32.7258 -5.79584Z" fill="#FEFEFE"/> +<path d="M13.0561 -6.51251C13.0015 -6.51906 12.9468 -6.52233 12.8903 -6.52887C12.9317 -6.49614 12.9732 -6.46014 13.0166 -6.42741L13.0561 -6.51251Z" fill="#FEFEFE"/> +<path d="M10.1629 -6.52237C10.1535 -6.23108 10.1441 -5.94307 10.1347 -5.65178L10.1779 -5.59942C10.1798 -5.88743 10.1817 -6.17544 10.1836 -6.46673L10.1629 -6.52237Z" fill="#FEFEFE"/> +<path d="M9.25242 -5.58619C9.40132 -5.90038 9.54834 -6.21785 9.69724 -6.53205L9.67462 -6.46659C9.6765 -6.1753 9.67839 -5.88729 9.68027 -5.59601L9.72362 -5.67128C9.55399 -5.67128 9.38624 -5.67455 9.21661 -5.67455L9.25242 -5.58619Z" fill="#FEFEFE"/> +<path d="M-7.76707 -5.69115C-7.52394 -5.81552 -7.2808 -5.94316 -7.03954 -6.06753L-7.03389 -6.08717C-7.2921 -5.9628 -7.54844 -5.8417 -7.80854 -5.7206C-7.81231 -5.7206 -7.76707 -5.69115 -7.76707 -5.69115Z" fill="#FEFEFE"/> +<path d="M48.1378 -6.43733C48.1755 -6.46679 48.2113 -6.49624 48.249 -6.5257C48.2226 -6.49297 48.1981 -6.46024 48.1736 -6.43079C48.1773 -6.43079 48.1378 -6.43733 48.1378 -6.43733Z" fill="#FEFEFE"/> +<path d="M30.6377 -7.24205L30.6829 -7.12095C30.6829 -7.12095 30.6038 -7.17004 30.6019 -7.1635C30.6 -7.15695 30.6377 -7.24205 30.6377 -7.24205Z" fill="#FEFEFE"/> +<path d="M13.0165 -6.4276L12.9619 -6.57488C12.9619 -6.57488 13.0505 -6.49961 13.0523 -6.50615C13.0561 -6.5127 13.0165 -6.4276 13.0165 -6.4276Z" fill="#FEFEFE"/> +<path d="M9.69749 -6.53205C9.85393 -6.5255 10.0085 -6.52223 10.1649 -6.51896C10.1649 -6.52223 10.1856 -6.46659 10.1856 -6.46659C10.016 -6.46659 9.84639 -6.46659 9.67675 -6.46659L9.69749 -6.53205Z" fill="#FEFEFE"/> +<path d="M-7.0398 -6.06756C-7.03788 -6.5814 -7.03597 -7.09524 -7.03214 -7.61563C-7.03023 -7.62217 -7.03789 -7.56653 -7.03406 -7.57635C-7.03214 -7.0887 -7.03406 -6.59122 -7.03597 -6.09047C-7.03406 -6.0872 -7.0398 -6.06756 -7.0398 -6.06756Z" fill="#FEFEFE"/> +<path d="M28.8017 -8.16837L28.8149 -7.99163L28.8525 -8.23383L28.8017 -8.16837Z" fill="#FEFEFE"/> +<path d="M24.1312 -7.5435C24.363 -7.44859 24.5949 -7.35367 24.8286 -7.25876C24.8305 -7.26203 24.8682 -7.32422 24.8682 -7.32749C24.6194 -7.39949 24.3706 -7.46822 24.1199 -7.53695L24.1312 -7.5435Z" fill="#FEFEFE"/> +<path d="M17.4779 -7.97237C17.4421 -7.96255 17.4044 -7.95273 17.3686 -7.94619C17.4006 -7.96582 17.4308 -7.98873 17.4628 -8.00837C17.4591 -8.0051 17.4779 -7.97237 17.4779 -7.97237Z" fill="#FEFEFE"/> +<path d="M15.855 -7.42259L15.806 -7.64187L15.9304 -7.61568L15.855 -7.42259Z" fill="#FEFEFE"/> +<path d="M55.9523 -8.71171C55.9222 -8.6528 55.8939 -8.59716 55.8637 -8.53825C55.9128 -8.57098 55.9618 -8.6037 56.0089 -8.63971C56.007 -8.64298 55.9523 -8.71171 55.9523 -8.71171Z" fill="#FEFEFE"/> +<path d="M28.8526 -8.23383L28.8978 -8.13237C28.8978 -8.13237 28.7979 -8.15855 28.7998 -8.16182C28.8017 -8.16837 28.8526 -8.23383 28.8526 -8.23383Z" fill="#FEFEFE"/> +<path d="M5.52439 -8.09024L5.58847 -8.08697C5.58847 -8.08697 5.48293 -8.05751 5.48104 -8.06078L5.52439 -8.09024Z" fill="#FEFEFE"/> +<path d="M-2.08459 -7.96249L-2.07895 -8.11959C-2.07895 -8.11959 -2.04323 -8.00177 -2.03947 -8.00831C-2.03383 -8.01486 -2.08459 -7.96249 -2.08459 -7.96249Z" fill="#FEFEFE"/> +<path d="M-20.4615 -8.14561L-20.4371 -8.12925C-20.4371 -8.12925 -20.4916 -8.06052 -20.4897 -8.06706C-20.4859 -8.07361 -20.4615 -8.14561 -20.4615 -8.14561Z" fill="#FEFEFE"/> +<path d="M58.1008 -9.4875L58.1724 -9.40568L58.146 -9.57259L58.1008 -9.4875Z" fill="#FEFEFE"/> +<path d="M55.7128 -9.22273C55.9823 -9.17037 56.2519 -9.12127 56.5233 -9.06891C56.5252 -9.06891 56.5384 -9.05909 56.5384 -9.05582C56.3405 -8.94127 56.1426 -8.82999 55.9484 -8.71216C55.9503 -8.70889 56.005 -8.64016 56.0087 -8.63689C55.9088 -8.83981 55.8052 -9.04273 55.7034 -9.25219C55.7034 -9.25546 55.7128 -9.22273 55.7128 -9.22273Z" fill="#FEFEFE"/> +<path d="M45.7685 -9.55308C45.7685 -9.55308 45.808 -9.4778 45.808 -9.48108C45.808 -9.48435 45.7685 -9.55308 45.7685 -9.55308Z" fill="#FEFEFE"/> +<path d="M36.1108 -9.6186L36.1693 -9.52042C36.1693 -9.52042 36.0807 -9.53351 36.0807 -9.52696C36.0788 -9.52042 36.1108 -9.6186 36.1108 -9.6186Z" fill="#FEFEFE"/> +<path d="M30.9393 -9.89015C31.0014 -9.41231 31.0618 -8.93447 31.124 -8.45336C31.124 -8.45008 31.0957 -8.51227 31.0938 -8.509C31.0542 -8.97047 31.0146 -9.43849 30.9732 -9.90324C30.9694 -9.89997 30.9393 -9.89015 30.9393 -9.89015Z" fill="#FEFEFE"/> +<path d="M30.2172 -9.62812L30.1833 -9.48085L30.2643 -9.5463L30.2172 -9.62812Z" fill="#FEFEFE"/> +<path d="M3.46061 -9.25496C3.42669 -9.29423 3.39276 -9.33023 3.36072 -9.36951C3.38899 -9.32042 3.41915 -9.27132 3.44742 -9.21896L3.46061 -9.25496Z" fill="#FEFEFE"/> +<path d="M-24.9812 -8.60038L-25 -8.79675C-25 -8.79675 -24.9812 -8.68547 -24.9812 -8.6822C-24.9793 -8.67893 -24.9812 -8.60038 -24.9812 -8.60038Z" fill="#FEFEFE"/> +<path d="M57.6485 -9.62808C57.7992 -9.91936 57.95 -10.2106 58.0989 -10.5019L58.0593 -10.5412C58.0725 -10.191 58.0857 -9.84081 58.0989 -9.49062C58.0989 -9.49062 58.146 -9.57244 58.1442 -9.57244C57.9651 -9.61498 57.7842 -9.6608 57.6032 -9.7099C57.6051 -9.7099 57.6485 -9.62808 57.6485 -9.62808Z" fill="#FEFEFE"/> +<path d="M55.8674 -10.5513C55.8146 -10.1095 55.7637 -9.66762 55.7128 -9.22578C55.7128 -9.22251 55.7034 -9.25523 55.7034 -9.25196C55.7694 -9.70689 55.8372 -10.1651 55.9032 -10.6266L55.8674 -10.5513Z" fill="#FEFEFE"/> +<path d="M46.1776 -10.4433C46.0419 -10.1487 45.9062 -9.85415 45.7705 -9.55632C45.7705 -9.55632 45.8101 -9.48432 45.8101 -9.48104C45.9439 -9.82142 46.0796 -10.1618 46.2134 -10.5022L46.1776 -10.4433Z" fill="#FEFEFE"/> +<path d="M30.4376 -10.7671C30.6016 -10.4693 30.7656 -10.1747 30.9352 -9.88342C30.9408 -9.88997 30.9691 -9.89979 30.9729 -9.90306C30.7241 -9.81142 30.4715 -9.71978 30.219 -9.62814L30.2661 -9.54959C30.3264 -9.96852 30.3848 -10.3907 30.447 -10.8195C30.4489 -10.826 30.4376 -10.7671 30.4376 -10.7671Z" fill="#FEFEFE"/> +<path d="M29.333 -10.4138L29.3688 -10.3451C29.3688 -10.3418 29.333 -10.4138 29.333 -10.4138Z" fill="#FEFEFE"/> +<path d="M16.4769 -9.72653C16.6748 -9.86072 16.8746 -9.99818 17.0725 -10.1324L17.0838 -10.2044C17.048 -9.98509 17.0084 -9.76581 16.9669 -9.54653C16.9669 -9.54653 17.014 -9.6218 17.014 -9.61853C16.8218 -9.67417 16.6314 -9.73308 16.4373 -9.79199C16.4373 -9.80181 16.4769 -9.72653 16.4769 -9.72653Z" fill="#FEFEFE"/> +<path d="M9.31456 -10.175L9.25802 -10.2601C9.25802 -10.2601 9.36357 -10.2502 9.36357 -10.247C9.3598 -10.247 9.31456 -10.175 9.31456 -10.175Z" fill="#FEFEFE"/> +<path d="M3.44738 -9.21911C3.39649 -9.67731 3.3456 -10.1355 3.29283 -10.597L3.24948 -10.6723C3.31922 -10.201 3.38895 -9.72967 3.46058 -9.25838C3.46058 -9.25511 3.44738 -9.21911 3.44738 -9.21911Z" fill="#FEFEFE"/> +<path d="M58.1009 -10.5022C58.1009 -10.5022 58.067 -10.5316 58.0652 -10.5382C58.0614 -10.5414 58.1009 -10.5022 58.1009 -10.5022Z" fill="#FEFEFE"/> +<path d="M55.9032 -10.6266L55.9201 -10.5382C55.9201 -10.5382 55.8617 -10.5382 55.8636 -10.5447C55.8673 -10.5513 55.9032 -10.6266 55.9032 -10.6266Z" fill="#FEFEFE"/> +<path d="M46.2134 -10.5021L46.2718 -10.5087C46.2718 -10.5087 46.1757 -10.4367 46.1776 -10.4367C46.1776 -10.4432 46.2134 -10.5021 46.2134 -10.5021Z" fill="#FEFEFE"/> +<path d="M39.5581 -11.2942C39.5072 -11.2877 39.4564 -11.2811 39.4036 -11.2746C39.4451 -11.2484 39.4846 -11.2222 39.5261 -11.196L39.5581 -11.2942Z" fill="#FEFEFE"/> +<path d="M17.0727 -10.1354L17.0671 -10.3515C17.0671 -10.3515 17.0802 -10.214 17.0821 -10.2107C17.084 -10.2074 17.0727 -10.1354 17.0727 -10.1354Z" fill="#FEFEFE"/> +<path d="M3.29457 -10.5971L3.20411 -10.5087C3.20411 -10.5087 3.25688 -10.6626 3.25311 -10.6658C3.25122 -10.6724 3.29457 -10.5971 3.29457 -10.5971Z" fill="#FEFEFE"/> +<path d="M-1.10628 -10.8752C-1.26271 -11.0225 -1.41727 -11.1698 -1.57371 -11.3171L-1.61894 -11.3629C-1.438 -11.2091 -1.25706 -11.0553 -1.07612 -10.9014L-1.10628 -10.8752Z" fill="#FEFEFE"/> +<path d="M39.5261 -11.1959L39.4545 -11.2974C39.4545 -11.2974 39.5525 -11.281 39.5544 -11.2876C39.5581 -11.2941 39.5261 -11.1959 39.5261 -11.1959Z" fill="#FEFEFE"/> +<path d="M-1.57174 -11.317L-1.69802 -11.2908C-1.69802 -11.2908 -1.61885 -11.3563 -1.61885 -11.3596C-1.61885 -11.3628 -1.57174 -11.317 -1.57174 -11.317Z" fill="#FEFEFE"/> +<path d="M54.3124 -13.0909C54.3237 -13.068 54.3368 -13.0418 54.3425 -13.0254C54.3349 -13.0352 54.3124 -13.0909 54.3124 -13.0909Z" fill="#FEFEFE"/> +<path d="M50.935 -12.4133C50.8257 -12.6163 50.7163 -12.8192 50.6051 -13.0221L50.5863 -13.045C50.7182 -12.8421 50.8502 -12.6424 50.9802 -12.4363C50.9783 -12.433 50.935 -12.4133 50.935 -12.4133Z" fill="#FEFEFE"/> +<path d="M-6.2236 -12.7767C-6.26695 -12.816 -6.3103 -12.8585 -6.35365 -12.8978C-6.3235 -12.8585 -6.29334 -12.8192 -6.26319 -12.78L-6.2236 -12.7767Z" fill="#FEFEFE"/> +<path d="M-8.67187 -12.3905C-8.71711 -12.325 -8.76611 -12.2072 -8.80758 -12.2105C-8.84904 -12.217 -8.88674 -12.348 -8.92443 -12.4232C-8.8792 -12.4887 -8.83019 -12.6065 -8.78873 -12.6032C-8.74915 -12.6 -8.71145 -12.4658 -8.67187 -12.3905Z" fill="#FEFEFE"/> +<path d="M-23.7467 -12.9078L-23.7373 -12.7442L-23.6997 -12.9798L-23.7467 -12.9078Z" fill="#FEFEFE"/> +<path d="M49.7212 -13.0418C50.0077 -13.0451 50.2961 -13.0451 50.5844 -13.0483C50.5863 -13.0483 50.6052 -13.0254 50.6052 -13.0254C50.3055 -13.0254 50.0039 -13.0222 49.7005 -13.0222C49.6986 -13.0189 49.7212 -13.0418 49.7212 -13.0418Z" fill="#FEFEFE"/> +<path d="M48.971 -13.6833C48.9503 -13.3069 48.9277 -12.9305 48.905 -12.5509C48.9032 -12.5476 48.9371 -12.6163 48.9352 -12.6098C48.9597 -12.9436 48.9842 -13.2807 49.0106 -13.6211C49.0106 -13.6244 48.971 -13.6833 48.971 -13.6833Z" fill="#FEFEFE"/> +<path d="M36.1676 -13.6311L36.2015 -13.4838L36.2223 -13.5787L36.1676 -13.6311Z" fill="#FEFEFE"/> +<path d="M29.0224 -13.6048L28.8885 -13.5458L28.979 -13.536L29.0224 -13.6048Z" fill="#FEFEFE"/> +<path d="M16.6897 -13.5L16.6371 -13.4738C16.6371 -13.4738 16.639 -13.5688 16.6427 -13.5655C16.6465 -13.5589 16.6897 -13.5 16.6897 -13.5Z" fill="#FEFEFE"/> +<path d="M11.5028 -13.4835C11.4406 -13.369 11.3784 -13.2512 11.3162 -13.1366C11.3275 -13.2119 11.3257 -13.3264 11.352 -13.3526C11.4029 -13.4017 11.4689 -13.4017 11.5292 -13.4246L11.5028 -13.4835Z" fill="#FEFEFE"/> +<path d="M-6.26312 -12.7768C-6.22543 -12.803 -6.18773 -12.8259 -6.14815 -12.8521C-6.17454 -12.8259 -6.20093 -12.7997 -6.22543 -12.7735C-6.22355 -12.7768 -6.26312 -12.7768 -6.26312 -12.7768Z" fill="#FEFEFE"/> +<path d="M-16.424 -13.5329L-16.4749 -13.3987L-16.3863 -13.4707C-16.3863 -13.474 -16.424 -13.5329 -16.424 -13.5329Z" fill="#FEFEFE"/> +<path d="M-23.6996 -12.9798L-23.6581 -12.9045C-23.6581 -12.9045 -23.7505 -12.9013 -23.7486 -12.9045C-23.7467 -12.9078 -23.6996 -12.9798 -23.6996 -12.9798Z" fill="#FEFEFE"/> +<path d="M57.5974 -13.6935L57.6822 -13.664C57.6822 -13.664 57.5503 -13.6607 57.5484 -13.6607L57.5974 -13.6935Z" fill="#FEFEFE"/> +<path d="M40.2781 -13.4313V-13.5786C40.2781 -13.5786 40.2913 -13.356 40.2913 -13.3528C40.2894 -13.3495 40.2781 -13.4313 40.2781 -13.4313Z" fill="#FEFEFE"/> +<path d="M28.979 -13.5361L28.9658 -13.6539C28.9658 -13.6539 29.0186 -13.5918 29.0205 -13.595C29.0224 -13.6049 28.979 -13.5361 28.979 -13.5361Z" fill="#FEFEFE"/> +<path d="M11.5295 -13.4246C11.6671 -13.8042 11.8028 -14.1839 11.9404 -14.5635L11.8914 -14.4948C11.7614 -14.161 11.6313 -13.8239 11.5013 -13.4868C11.5031 -13.4835 11.5295 -13.4246 11.5295 -13.4246Z" fill="#FEFEFE"/> +<path d="M5.42069 -14.0564C5.46215 -14.0335 5.50362 -14.0073 5.54509 -13.9844C5.49797 -14.0303 5.45085 -14.0793 5.40373 -14.1252L5.42069 -14.0564Z" fill="#FEFEFE"/> +<path d="M-15.9172 -14.4622C-16.0868 -14.1546 -16.2546 -13.8437 -16.4242 -13.5327C-16.4242 -13.5327 -16.3865 -13.4706 -16.3865 -13.4673C-16.2206 -13.824 -16.0529 -14.1808 -15.8852 -14.5375L-15.9172 -14.4622Z" fill="#FEFEFE"/> +<path d="M32.1471 -14.1709C32.1471 -14.1709 32.1394 -14.2592 32.1414 -14.256C32.1452 -14.2527 32.1471 -14.1709 32.1471 -14.1709Z" fill="#FEFEFE"/> +<path d="M11.94 -14.5635L11.9966 -14.4752C11.9966 -14.4752 11.8892 -14.485 11.8892 -14.4915C11.891 -14.4948 11.94 -14.5635 11.94 -14.5635Z" fill="#FEFEFE"/> +<path d="M5.40373 -14.1219C5.48854 -14.4034 5.57524 -14.6881 5.66006 -14.9696L5.69964 -15.0514C5.60729 -14.7176 5.51682 -14.387 5.42257 -14.0532C5.42069 -14.0565 5.40373 -14.1219 5.40373 -14.1219Z" fill="#FEFEFE"/> +<path d="M-1.24937 -14.3249C-1.19848 -14.5147 -1.14759 -14.7045 -1.0967 -14.8943C-1.16267 -14.7274 -1.22675 -14.5638 -1.29272 -14.3969C-1.29083 -14.4001 -1.24937 -14.3249 -1.24937 -14.3249Z" fill="#FEFEFE"/> +<path d="M-13.5801 -15.1169L-13.6743 -15.0711L-13.6084 -15.0646L-13.5801 -15.1169Z" fill="#FEFEFE"/> +<path d="M-15.8869 -14.5409L-15.8624 -14.4983C-15.8624 -14.4983 -15.9227 -14.4525 -15.9208 -14.4558C-15.9171 -14.4623 -15.8869 -14.5409 -15.8869 -14.5409Z" fill="#FEFEFE"/> +<path d="M-23.1133 -15.1693C-23.1548 -15.2152 -23.1944 -15.2577 -23.2359 -15.3035C-23.2095 -15.2577 -23.1831 -15.2119 -23.1567 -15.1661L-23.1133 -15.1693Z" fill="#FEFEFE"/> +<path d="M46.8354 -15.7257L46.7393 -15.6832L46.8184 -15.6504L46.8354 -15.7257Z" fill="#FEFEFE"/> +<path d="M29.013 -15.994C28.9583 -16.03 28.9055 -16.0692 28.8509 -16.1052C28.8886 -16.0561 28.9263 -16.0038 28.964 -15.9547L29.013 -15.994Z" fill="#FEFEFE"/> +<path d="M16.7162 -14.806L16.6692 -15.0744C16.6692 -15.0744 16.7125 -14.878 16.7181 -14.8715C16.7219 -14.865 16.7162 -14.806 16.7162 -14.806Z" fill="#FEFEFE"/> +<path d="M5.66017 -14.9729L5.64889 -15.1693C5.64889 -15.1693 5.69401 -15.0515 5.69777 -15.0547L5.66017 -14.9729Z" fill="#FEFEFE"/> +<path d="M-10.3721 -15.817C-10.5229 -15.8531 -10.6755 -15.8891 -10.8263 -15.9283L-10.8659 -15.8629C-10.6868 -15.8203 -10.5078 -15.7778 -10.3306 -15.7352L-10.3721 -15.817Z" fill="#FEFEFE"/> +<path d="M-13.6083 -15.0644L-13.5631 -15.2117C-13.5631 -15.2117 -13.5838 -15.1135 -13.5819 -15.1167C-13.5801 -15.1167 -13.6083 -15.0644 -13.6083 -15.0644Z" fill="#FEFEFE"/> +<path d="M-23.1566 -15.1659C-23.1207 -15.1986 -23.0868 -15.2346 -23.051 -15.2674C-23.0736 -15.2346 -23.0962 -15.1986 -23.1151 -15.1692C-23.1132 -15.1692 -23.1566 -15.1659 -23.1566 -15.1659Z" fill="#FEFEFE"/> +<path d="M50.2395 -16.2689L50.1226 -16.2035L50.1433 -16.3999L50.2395 -16.2689Z" fill="#FEFEFE"/> +<path d="M46.8185 -15.6504L46.7789 -15.8828C46.7789 -15.8828 46.8317 -15.7322 46.8336 -15.729C46.8354 -15.7257 46.8185 -15.6504 46.8185 -15.6504Z" fill="#FEFEFE"/> +<path d="M38.6234 -16.3442L38.7798 -16.4522L38.7648 -16.1871L38.6234 -16.3442Z" fill="#FEFEFE"/> +<path d="M28.9655 -15.9513L28.9636 -16.1281C28.9636 -16.1281 29.0069 -15.9841 29.0106 -15.9873C29.0125 -15.9939 28.9655 -15.9513 28.9655 -15.9513Z" fill="#FEFEFE"/> +<path d="M24.6647 -17.0675L24.7118 -16.8188C24.7118 -16.8188 24.6477 -16.989 24.6458 -16.9922C24.6439 -16.9988 24.6647 -17.0675 24.6647 -17.0675Z" fill="#FEFEFE"/> +<path d="M8.32328 -16.0561L8.22715 -16.0921C8.22715 -16.0921 8.31574 -16.1248 8.31386 -16.1314C8.31197 -16.1379 8.32328 -16.0561 8.32328 -16.0561Z" fill="#FEFEFE"/> +<path d="M-0.475048 -16.3868C-0.437351 -16.3738 -0.399654 -16.3639 -0.361958 -16.3508C-0.407192 -16.3803 -0.450546 -16.4098 -0.495781 -16.4392L-0.475048 -16.3868Z" fill="#FEFEFE"/> +<path d="M-2.25233 -16.6945L-2.3183 -16.557L-2.2184 -16.6389L-2.25233 -16.6945Z" fill="#FEFEFE"/> +<path d="M-10.3287 -15.7356C-10.21 -16.0792 -10.0912 -16.4229 -9.97059 -16.7632L-10.0045 -16.8189C-10.127 -16.4883 -10.2514 -16.1545 -10.3721 -15.8207C-10.3721 -15.8174 -10.3287 -15.7356 -10.3287 -15.7356Z" fill="#FEFEFE"/> +<path d="M58.8585 -17.3063L58.9093 -17.0608L58.7718 -17.0903L58.8585 -17.3063Z" fill="#FEFEFE"/> +<path d="M54.1842 -17.84C54.1766 -17.3818 54.1672 -16.9236 54.1597 -16.4621C54.1597 -16.4588 54.1428 -16.4064 54.1447 -16.4032C54.1503 -16.8974 54.1578 -17.3916 54.1635 -17.889C54.1635 -17.8923 54.1842 -17.84 54.1842 -17.84Z" fill="#FEFEFE"/> +<path d="M37.191 -16.5734C37.1797 -16.8975 37.1684 -17.2182 37.1571 -17.5422L37.1156 -17.4702C37.2721 -17.4604 37.4285 -17.4473 37.5868 -17.4375L37.6151 -17.48C37.4587 -17.2051 37.3004 -16.9302 37.1458 -16.652C37.1477 -16.6487 37.191 -16.5734 37.191 -16.5734Z" fill="#FEFEFE"/> +<path d="M27.5145 -17.4112L27.5899 -17.4014L27.4843 -17.4767L27.5145 -17.4112Z" fill="#FEFEFE"/> +<path d="M-0.495663 -16.4393C-0.495663 -16.904 -0.495661 -17.3688 -0.497541 -17.8335C-0.497541 -17.8335 -0.478743 -17.8859 -0.480623 -17.8859C-0.478743 -17.3884 -0.476864 -16.8876 -0.474983 -16.3869L-0.495663 -16.4393Z" fill="#FEFEFE"/> +<path d="M-2.21829 -16.6387C-2.0562 -16.966 -1.89599 -17.29 -1.7339 -17.6173L-1.71882 -17.5747C-1.89599 -17.2834 -2.07505 -16.9921 -2.25222 -16.6976C-2.25222 -16.6943 -2.21829 -16.6387 -2.21829 -16.6387Z" fill="#FEFEFE"/> +<path d="M-3.47739 -17.5716L-3.60556 -17.5617L-3.52075 -17.5487L-3.47739 -17.5716Z" fill="#FEFEFE"/> +<path d="M-9.9726 -16.7632C-9.9726 -16.7632 -10.0046 -16.8123 -10.0046 -16.8156C-10.0064 -16.8188 -9.9726 -16.7632 -9.9726 -16.7632Z" fill="#FEFEFE"/> +<path d="M37.5866 -17.4373L37.6488 -17.5747L37.6148 -17.4798C37.6167 -17.4798 37.5866 -17.4373 37.5866 -17.4373Z" fill="#FEFEFE"/> +<path d="M37.1588 -17.5421C37.0872 -17.6468 37.0174 -17.7548 36.9458 -17.8595C36.9873 -17.8333 37.0476 -17.8301 37.0646 -17.781C37.0947 -17.6926 37.1004 -17.5748 37.1173 -17.4701C37.1154 -17.4701 37.1588 -17.5421 37.1588 -17.5421Z" fill="#FEFEFE"/> +<path d="M27.4844 -17.4765L27.4825 -17.5649C27.4825 -17.5649 27.5183 -17.4078 27.5164 -17.4078C27.5145 -17.4111 27.4844 -17.4765 27.4844 -17.4765Z" fill="#FEFEFE"/> +<path d="M-1.73392 -17.6141L-1.6755 -17.6959L-1.71884 -17.5683C-1.71696 -17.5749 -1.73392 -17.6141 -1.73392 -17.6141Z" fill="#FEFEFE"/> +<path d="M-3.52075 -17.5487L-3.49632 -17.6959C-3.49632 -17.6959 -3.48316 -17.565 -3.4794 -17.5683C-3.47752 -17.5716 -3.52075 -17.5487 -3.52075 -17.5487Z" fill="#FEFEFE"/> +<path d="M-11.094 -18.0723L-11.0507 -17.8497L-11.1694 -17.8792L-11.094 -18.0723Z" fill="#FEFEFE"/> +<path d="M54.1034 -18.321L54.0751 -18.4225C54.0751 -18.4225 54.1374 -18.3832 54.1411 -18.3897C54.143 -18.3963 54.1034 -18.321 54.1034 -18.321Z" fill="#FEFEFE"/> +<path d="M51.7058 -18.2523C51.8962 -18.5469 52.0846 -18.8381 52.275 -19.1327L52.3221 -19.1556C52.1073 -18.8676 51.8905 -18.5829 51.6738 -18.2948L51.7058 -18.2523Z" fill="#FEFEFE"/> +<path d="M49.8264 -19.1456L49.8773 -19.0376C49.8773 -19.0376 49.7944 -19.0671 49.7925 -19.0605C49.7906 -19.054 49.8264 -19.1456 49.8264 -19.1456Z" fill="#FEFEFE"/> +<path d="M21.1044 -18.9658L21.1835 -18.9724C21.1835 -18.9724 21.1327 -18.8938 21.1364 -18.8905C21.1383 -18.884 21.1044 -18.9658 21.1044 -18.9658Z" fill="#FEFEFE"/> +<path d="M2.84236 -18.4289L2.76885 -18.4322C2.76885 -18.4322 2.82539 -18.4944 2.82162 -18.5009C2.81974 -18.5075 2.84236 -18.4289 2.84236 -18.4289Z" fill="#FEFEFE"/> +<path d="M52.2749 -19.1327C52.3032 -19.1753 52.3333 -19.2211 52.3616 -19.2637C52.3465 -19.2244 52.3295 -19.1851 52.3182 -19.1524C52.322 -19.1557 52.2749 -19.1327 52.2749 -19.1327Z" fill="#FEFEFE"/> +<path d="M6.02969 -19.077L6.08058 -19.2111L6.02026 -19.1031C6.02403 -19.1031 6.02969 -19.077 6.02969 -19.077Z" fill="#FEFEFE"/> +<path d="M-13.0259 -19.6728L-13.1748 -19.6074H-13.0372L-13.0259 -19.6728Z" fill="#FEFEFE"/> +<path d="M21.1004 -19.8887L21.1531 -20L21.0777 -19.9084L21.1004 -19.8887Z" fill="#FEFEFE"/> +<path d="M-13.0371 -19.6073L-13.1049 -19.8364C-13.1049 -19.8364 -13.0296 -19.6793 -13.0277 -19.6761C-13.0258 -19.6728 -13.0371 -19.6073 -13.0371 -19.6073Z" fill="#FEFEFE"/> +<path d="M11.1242 -0.0811182L11.2222 0.062887L11.0865 -0.0156601L11.1242 -0.0811182ZM11.1242 -0.0811182C11.1242 -0.0811182 11.0847 -0.0156601 11.0866 -0.0156601L11.1242 -0.0811182ZM-5.95776 1.1331C-5.90498 1.18219 -5.85409 1.22802 -5.80132 1.27711C-5.85786 1.24438 -5.91252 1.21165 -5.96906 1.17892L-5.95776 1.1331ZM-5.95776 1.1331C-5.98791 1.42766 -6.01622 1.72549 -6.04638 2.02005C-6.01999 1.74185 -5.9936 1.46694 -5.9691 1.18547C-5.9691 1.17892 -5.95776 1.1331 -5.95776 1.1331ZM36.0129 24.2591C35.9998 24.5111 35.9847 24.7599 35.9716 25.0119C35.9772 24.7828 35.9847 24.5504 35.9904 24.3213L36.0129 24.2591ZM36.0129 24.2591C36.0751 24.3148 36.1373 24.3737 36.1976 24.4293C36.1279 24.3933 36.0581 24.3573 35.9903 24.3213L36.0129 24.2591ZM44.4927 20.5445L44.3947 20.5379L44.5361 20.5019L44.4927 20.5445ZM44.4927 20.5445L44.4927 20.4299C44.4927 20.4299 44.5303 20.5183 44.5341 20.5117C44.536 20.5019 44.4927 20.5445 44.4927 20.5445ZM-3.98644 24.5044L-3.99764 24.4817M22.5423 19.0061C22.5423 19.0061 22.5857 18.9374 22.5875 18.9374C22.6045 19.3301 22.6215 19.7229 22.6347 20.1058C22.6309 20.0993 22.6064 20.024 22.6026 20.0174C22.7534 19.7 22.9061 19.3923 23.0606 19.0847C23.0606 19.0847 23.104 19.1436 23.1021 19.1403C22.9136 19.0945 22.727 19.0487 22.5423 19.0061ZM22.5423 19.0061C22.352 18.7377 22.1654 18.4661 21.9769 18.1977C21.9769 18.1977 22.0146 18.1355 22.0183 18.1355C22.2087 18.4006 22.3991 18.669 22.5894 18.9374C22.5876 18.9374 22.5442 19.0061 22.5423 19.0061ZM46.2926 34.7027L46.4075 34.5882L46.3208 34.7616L46.2926 34.7027ZM46.2926 34.7027C46.1248 35.0366 45.959 35.3704 45.7912 35.7075L45.8138 35.7599C45.9835 35.4293 46.1512 35.0987 46.3208 34.7649C46.3208 34.7616 46.2926 34.7027 46.2926 34.7027ZM23.0229 16.5316L23.0116 16.6429L22.989 16.4694L23.0229 16.5316ZM23.0229 16.5316L22.9324 16.4727C22.9324 16.4727 22.9927 16.476 22.9908 16.4727C22.989 16.4695 23.0229 16.5316 23.0229 16.5316ZM49.9663 15.9984L49.9605 16.0737M1.84896 38.8104L1.95451 38.8006L1.80561 38.8726L1.84896 38.8104ZM1.84896 38.8104L1.86968 38.9184C1.86968 38.9184 1.81125 38.8595 1.80936 38.8661C1.80559 38.8726 1.84896 38.8104 1.84896 38.8104ZM-20.9232 15.0916L-20.9589 15.0261L-20.9213 15.0916M5.04363 40.5025L5.00415 40.5581M42.5305 40.0278C42.5701 40.0965 42.6097 40.1718 42.6493 40.2438C42.6059 40.1915 42.5607 40.1391 42.5173 40.09C42.5173 40.09 42.5305 40.0311 42.5305 40.0278ZM42.5305 40.0278C42.5305 40.0311 42.5174 40.09 42.5192 40.0965C42.4684 40.5351 42.4137 40.9638 42.3609 41.3959C42.3609 41.3959 42.3308 41.4286 42.3308 41.4319C42.3986 40.9606 42.4646 40.4926 42.5305 40.0278ZM6.52908 44.2467L6.50464 44.1845M27.8291 46.41L27.912 46.4559L27.8083 46.4689L27.8291 46.41ZM27.8291 46.41L27.8799 46.6228C27.8799 46.6228 27.8102 46.4722 27.8083 46.4722C27.8083 46.4689 27.8291 46.41 27.8291 46.41ZM37.9167 47.2021C37.9487 47.2708 37.9789 47.3428 38.0109 47.4115C37.9713 47.3624 37.9337 47.3101 37.8941 47.261L37.9167 47.2021ZM37.9167 47.2021C37.928 47.5686 37.9412 47.9319 37.9525 48.2985L37.9864 48.2526C37.9563 47.9254 37.9261 47.5948 37.8941 47.2642C37.8941 47.261 37.9167 47.2021 37.9167 47.2021ZM-1.75851 48.3017C-1.72459 48.3475 -1.69066 48.3901 -1.65673 48.4359C-1.70574 48.4032 -1.75474 48.3705 -1.80375 48.3377L-1.75851 48.3017ZM-1.75851 48.3017L-1.79045 48.4556C-1.79045 48.4556 -1.79609 48.3312 -1.79797 48.3345C-1.80361 48.3377 -1.75851 48.3017 -1.75851 48.3017ZM-12.2381 50.7333C-12.0835 50.7857 -11.929 50.8348 -11.7744 50.8839L-11.7763 50.8086C-11.9365 50.7759 -12.0967 50.7399 -12.2569 50.7072M-12.2381 50.7333L-12.2569 50.7072M-12.2381 50.7333C-12.2795 50.7464 -12.321 50.7628 -12.3624 50.7792C-12.3266 50.7563 -12.2927 50.7301 -12.2569 50.7072M-2.23922 8.80437L-2.19598 8.73891M46.6714 6.20925L46.7109 6.28125M-17.7491 4.6382L-17.704 4.71675M52.1826 2.33402L52.2239 2.2653M49.9056 -0.866808L49.947 -0.928993M26.6228 -4.06761L26.6059 -4.10361M20.7914 -4.21467L20.8327 -4.17867M5.48104 -8.06078L5.52428 -8.09024M5.48104 -8.06078C5.48293 -8.05751 5.58847 -8.08697 5.58847 -8.08697L5.52439 -8.09024L5.48104 -8.06078ZM-24.9794 -8.67918L-24.9813 -8.60063M16.4373 -9.8017L16.4768 -9.72969M55.9032 -10.6266C55.8372 -10.1651 55.7694 -9.70689 55.7034 -9.25196C55.7034 -9.25523 55.7128 -9.22251 55.7128 -9.22578C55.7637 -9.66762 55.8146 -10.1095 55.8674 -10.5513L55.9032 -10.6266ZM55.9032 -10.6266L55.9201 -10.5382C55.9201 -10.5382 55.8617 -10.5382 55.8636 -10.5447C55.8673 -10.5513 55.9032 -10.6266 55.9032 -10.6266ZM-10.8659 -15.8629L-10.8263 -15.9283C-10.6755 -15.8891 -10.5229 -15.8531 -10.3721 -15.817L-10.3306 -15.7352C-10.5078 -15.7778 -10.6868 -15.8203 -10.8659 -15.8629ZM-10.8659 -15.8629L-10.8264 -15.9283M-3.52075 -17.5487L-3.60556 -17.5617L-3.47739 -17.5716L-3.52075 -17.5487ZM-3.52075 -17.5487L-3.49632 -17.6959C-3.49632 -17.6959 -3.48316 -17.565 -3.4794 -17.5683C-3.47752 -17.5716 -3.52075 -17.5487 -3.52075 -17.5487ZM51.6738 -18.2947L51.7076 -18.2522M13.7667 45.9549C13.7761 46.2233 13.7855 46.4917 13.7949 46.7633L13.8345 46.6979C12.9091 47.2313 11.9817 47.7615 11.0563 48.295C11.4107 47.503 11.765 46.711 12.1193 45.9222L12.0798 45.9549C12.6527 45.9876 13.2182 43.2613 13.8006 45.9418C13.8025 45.9418 13.7327 45.8305 13.7327 45.8305L13.7667 45.9549ZM-6.73641 28.5859C-6.32175 28.9721 -5.90898 29.3583 -5.49433 29.7445C-6.24071 29.8656 -6.98709 30.0293 -7.73536 30.0784C-7.92195 30.0915 -8.11609 29.738 -8.30834 29.5514C-7.78813 29.2503 -7.26604 28.9525 -6.74584 28.6514L-6.73641 28.5859ZM51.8321 45.1335C51.8039 45.6637 51.7737 46.1972 51.7454 46.7274L51.785 46.6652C51.1366 47.4768 50.4901 48.2852 49.8418 49.0969C49.8644 48.5569 49.8851 48.0136 49.9077 47.4736L49.8908 47.5128C50.0661 47.5161 50.2395 47.5194 50.4148 47.5194L50.4016 47.4965C50.8652 46.7273 51.327 45.955 51.7907 45.1858L51.8321 45.1335ZM-4.88358 5.45957C-4.61029 5.21084 -4.33511 4.9621 -4.05993 4.71663C-4.05804 4.71663 -4.09574 4.65772 -4.09574 4.65772C-4.30118 6.27779 -3.0214 8.69317 -4.93824 9.39684L-4.96463 9.40011C-4.93824 8.62117 -4.91186 7.8455 -4.88547 7.06983L-4.94013 7.11892C-4.10705 6.55926 -4.64421 5.98323 -4.93447 5.41375L-4.88358 5.45957ZM33.817 27.0542C33.4457 27.4698 33.097 27.8593 32.7464 28.252C32.705 27.964 32.5712 27.5451 32.6352 27.4109C32.9067 26.8414 33.2365 26.357 33.5456 25.8432C33.621 26.1737 33.6945 26.5043 33.817 27.0542ZM-8.80571 41.6313C-8.12341 40.6757 -7.44111 39.7233 -6.75693 38.7676L-6.74185 38.8036C-6.66269 41.4382 -7.58247 41.8637 -8.80571 41.6117V41.6313ZM33.1725 35.9139C33.1178 34.8895 33.0631 33.8618 33.0085 32.8374C33.4891 33.2694 33.9697 33.7014 34.4522 34.1367L34.407 34.0647C33.9848 34.6604 33.5607 35.2593 33.1348 35.8484C33.1329 35.8451 33.1725 35.9139 33.1725 35.9139ZM-11.8646 38.8363C-11.4405 39.1832 -11.0183 39.5334 -10.5942 39.8803C-10.843 39.9818 -11.0824 42.3743 -11.3557 39.8803C-11.3991 39.4909 -11.6592 39.1701 -11.8194 38.8199L-11.8646 38.8363ZM47.5122 11.7958C47.8929 11.6452 48.2736 11.4947 48.6544 11.3441C48.6902 11.7172 48.7279 12.0903 48.7637 12.4634C48.3603 12.2147 47.957 11.9692 47.5555 11.7205L47.5122 11.7958ZM-12.1552 28.661C-12.2758 30.5887 -13.075 29.8425 -13.68 29.7901C-13.7347 29.7868 -13.7761 29.3352 -13.8233 29.093C-13.2635 28.9752 -12.7037 28.8541 -12.1458 28.7297L-12.1552 28.661ZM29.7007 26.9461C30.023 26.6745 30.3434 26.4028 30.6657 26.1312C30.7354 27.0181 31.4102 28.1767 30.3095 28.5465L30.3415 28.612C30.1436 28.0458 29.9457 27.4796 29.7478 26.9134L29.7007 26.9461ZM-23.1868 14.172C-24.4515 12.5552 -23.0794 11.9726 -22.7722 10.9711L-22.7854 10.9973C-22.6157 11.2918 -22.448 11.5831 -22.2783 11.8777V11.8613C-22.4423 12.3752 -22.6063 12.889 -22.7703 13.4028L-22.7288 13.3636C-22.8984 13.6614 -23.07 13.956 -23.2396 14.2538L-23.1868 14.172ZM13.7949 46.7636C14.3792 47.0778 14.9635 47.392 15.5478 47.7029L15.5911 47.6211C14.8693 48.0891 13.8986 49.9841 13.8345 46.6948C13.8345 46.6981 13.7949 46.7636 13.7949 46.7636ZM22.4742 26.8708C22.1256 27.257 21.775 27.64 21.4263 28.0261C21.3396 27.7381 21.2529 27.4501 21.1643 27.1588C21.6148 27.0868 22.0652 27.0148 22.5157 26.9428C22.5157 26.9461 22.4742 26.8708 22.4742 26.8708ZM-19.1062 -4.01861C-18.7519 -4.45391 -18.3975 -4.8892 -18.0432 -5.32449C-18.0375 -5.02011 -17.9885 -4.47682 -18.03 -4.45391C-18.3655 -4.27717 -18.7161 -4.2019 -19.0629 -4.09716L-19.1062 -4.01861ZM-2.03363 -8.01456C-2.45394 -7.17016 -2.87613 -6.32576 -3.29645 -5.48136C-3.34922 -5.67773 -3.46985 -6.01483 -3.44346 -6.05084C-3.00053 -6.70868 -2.53876 -7.33053 -2.08263 -7.96219L-2.03363 -8.01456ZM-12.5865 18.129C-13.1143 19.2091 -13.6401 20.2858 -14.1679 21.3659L-14.2131 21.4313C-13.6873 20.3415 -13.1595 19.2516 -12.6337 18.1585L-12.5865 18.129ZM48.5489 4.58902C48.1437 4.37301 47.7403 4.15373 47.3351 3.93772C47.6178 3.51552 47.9005 3.09004 48.1833 2.66784L48.2021 2.59911C47.4293 3.66607 48.2511 4.04572 48.4999 4.67084L48.5489 4.58902ZM19.1365 31.8621C18.8142 32.1108 18.6709 32.3138 18.5239 32.317C18.2374 32.3203 17.9509 32.2156 17.6644 32.1534C17.819 31.8261 17.9641 31.2468 18.1319 31.2239C18.3901 31.1912 18.6653 31.5381 19.1365 31.8621ZM48.5016 4.67411C48.8239 4.70683 49.1444 4.73956 49.4667 4.77229L49.4214 4.69047C49.1953 5.5676 48.971 6.44473 48.7448 7.32186L48.7655 7.27604C48.6939 6.38254 48.6223 5.48578 48.5488 4.59228C48.5488 4.58901 48.5016 4.67411 48.5016 4.67411ZM6.65913 8.77187C6.79107 7.8162 6.923 6.86052 7.05494 5.90811C7.19441 6.02594 7.33389 6.14376 7.47336 6.26158C7.18687 7.10925 6.90038 7.9602 6.61389 8.80787L6.65913 8.77187ZM-3.92593 13.3997C-3.79588 12.8924 -3.66582 12.3818 -3.53577 11.8745L-3.58289 11.8058C-3.40949 11.7992 -3.23798 11.7959 -3.06457 11.7894L-3.123 11.8712C-2.95337 11.5767 -2.78185 11.2821 -2.61222 10.9843L-2.64049 11.0792C-2.01851 13.7008 -3.19651 13.1607 -3.96174 13.344C-3.96174 13.3473 -3.92593 13.3997 -3.92593 13.3997ZM20.5841 13.3114C20.5238 13.7074 20.4899 13.943 20.4541 14.1787C20.3127 13.9561 20.1129 13.7761 20.047 13.4979C20.0017 13.3146 20.145 12.9939 20.2034 12.7321C20.3391 12.9415 20.4767 13.1477 20.5841 13.3114ZM32.5524 47.5489C32.4261 48.3475 32.3017 49.1461 32.166 49.9414C32.1622 49.961 32.0397 49.9152 31.9719 49.9021C32.1622 49.1068 32.3507 48.3115 32.5411 47.5162L32.5524 47.5489ZM-19.1665 14.817C-18.6331 14.997 -18.6049 11.7471 -17.7378 14.1821L-17.6964 14.1592C-17.866 14.4537 -18.0356 14.745 -18.2053 15.0396L-18.177 14.9676C-18.5144 14.8923 -18.8536 14.817 -19.191 14.7417L-19.1665 14.817ZM37.1476 -16.6485C36.8366 -15.6273 37.3492 -13.8011 36.1694 -13.6309L36.2221 -13.5785C36.0544 -15.0579 36.2655 -16.1641 37.1928 -16.5732L37.1476 -16.6485ZM16.7956 10.0055C16.1962 10.7681 15.5987 11.5307 14.9994 12.2932L15.0276 12.3489C15.6232 11.5601 16.2188 10.7681 16.8163 9.97931L16.7956 10.0055ZM-23.8108 15.527C-23.6015 15.0753 -23.3942 14.6236 -23.185 14.172L-23.2359 14.2571C-23.0663 13.9592 -22.8947 13.6647 -22.7251 13.3669L-22.7666 13.4061C-22.4669 13.6647 -22.1691 13.9232 -21.8675 14.1851L-21.9052 14.1196C-22.1446 14.5778 -22.384 15.036 -22.6233 15.4975L-22.661 15.4484C-23.0361 15.4549 -23.4093 15.4582 -23.7844 15.4648L-23.8108 15.527ZM24.6437 -16.9988C24.7964 -17.5355 24.9509 -18.0723 25.1036 -18.609C25.2072 -18.4978 25.3109 -18.3865 25.4165 -18.2785C25.1658 -17.8759 24.9151 -17.4733 24.6644 -17.0741L24.6437 -16.9988ZM30.4488 -10.8261C30.0775 -10.6887 29.7062 -10.5512 29.333 -10.4138L29.367 -10.3418C30.0172 -11.0192 30.6694 -11.6967 31.3196 -12.3742L31.314 -12.4364C31.0218 -11.88 30.7278 -11.3269 30.4357 -10.7705L30.4488 -10.8261ZM23.5037 32.6408C23.1362 33.6587 22.7687 34.6798 22.4011 35.6976L22.4407 35.7631C22.8101 34.7485 23.1777 33.7372 23.5433 32.7161C23.5433 32.7128 23.5037 32.6408 23.5037 32.6408ZM-17.2892 4.72653C-16.6993 4.93272 -15.7964 4.54324 -16.1451 6.5397L-16.1187 6.54624C-16.4938 5.91458 -16.8689 5.27964 -17.244 4.64798C-17.244 4.6447 -17.2892 4.72653 -17.2892 4.72653ZM54.2917 2.31432C54.4293 2.45505 54.5952 2.62852 54.761 2.79871C54.6461 2.94926 54.5104 3.25691 54.4218 3.22091C54.2295 3.14563 54.0618 2.89035 53.8846 2.71034C53.9958 2.59906 54.1089 2.49106 54.2917 2.31432ZM40.6569 22.9237C40.9151 22.3411 41.1752 21.7586 41.4335 21.1727C41.4844 21.3855 41.605 21.752 41.5786 21.788C41.2978 22.1677 40.9943 22.495 40.6965 22.8354L40.6569 22.9237ZM18.2733 26.6745C18.6087 26.0494 18.9461 25.4243 19.2835 24.7959C19.3646 24.9726 19.4456 25.1526 19.5267 25.3294C19.112 25.7516 18.6973 26.1738 18.2827 26.596L18.2733 26.6745ZM10.4587 26.9952C10.5793 26.3243 10.7 25.6533 10.8206 24.9791C10.8112 25.3424 10.8376 25.7188 10.7829 26.0592C10.7339 26.3636 10.5963 26.6287 10.4983 26.9101L10.4587 26.9952ZM8.72107 0.121377C8.62118 -0.762298 8.52317 -1.6427 8.42328 -2.52638L8.37804 -2.51656C9.97258 -2.11727 8.41197 -0.637928 8.69092 0.209746C8.69092 0.206473 8.72107 0.121377 8.72107 0.121377ZM-7.75988 -1.90086C-7.40365 -2.47361 -7.04931 -3.04964 -6.69309 -3.62239C-6.61204 -3.36384 -6.52911 -3.10528 -6.44806 -2.84345C-6.89664 -2.55871 -7.34523 -2.27397 -7.79004 -1.97941C-7.78627 -1.97287 -7.75988 -1.90086 -7.75988 -1.90086ZM24.8303 -7.26211C25.0206 -6.77445 25.2129 -6.29006 25.4033 -5.80241C25.3373 -5.74349 25.2732 -5.68458 25.2072 -5.62567C25.0941 -6.19515 24.9829 -6.76136 24.868 -7.32756C24.868 -7.32429 24.8303 -7.26211 24.8303 -7.26211ZM21.2567 5.51218C21.3038 4.91979 21.351 4.3274 21.3981 3.73829C21.5715 3.88557 21.7449 4.03284 21.9183 4.18012C21.6846 4.61214 21.4508 5.04089 21.2152 5.46964C21.2134 5.46964 21.2567 5.51218 21.2567 5.51218ZM58.1215 6.94224C58.0687 7.02734 58.0159 7.11243 57.9651 7.19752C57.9632 7.05352 57.9368 6.88988 57.9669 6.77205C57.9858 6.69678 58.0913 6.69023 58.1573 6.65096C58.146 6.74914 58.1328 6.84733 58.1215 6.94224ZM-3.53387 11.8713C-3.40758 11.3312 -3.27942 10.7912 -3.15314 10.2479C-2.98162 10.5261 -2.81199 10.801 -2.64047 11.0792L-2.6122 10.9843C-2.78183 11.2789 -2.95335 11.5734 -3.12298 11.8713L-3.06455 11.7895C-3.23795 11.796 -3.40947 11.7993 -3.58287 11.8058L-3.53387 11.8713ZM58.5382 51.4698C58.427 51.5908 58.3196 51.6989 58.2102 51.8036C58.182 51.5941 58.1405 51.3879 58.1367 51.1752C58.1349 51.1163 58.28 50.9756 58.3007 51.005C58.3912 51.1294 58.4628 51.2996 58.5382 51.4698ZM44.9036 49.0707C45.1166 48.4979 45.3277 47.9219 45.5406 47.3491C45.6273 47.4833 45.7159 47.6208 45.8026 47.755C45.4954 48.1739 45.1863 48.5961 44.8791 49.015C44.8791 49.0183 44.9036 49.0707 44.9036 49.0707ZM15.5476 47.7029C15.8266 47.7258 16.1055 47.7487 16.3864 47.7749C16.343 47.9909 16.2997 48.2037 16.2563 48.4197C16.0358 48.1513 15.8153 47.8862 15.5929 47.6211C15.591 47.6244 15.5476 47.7029 15.5476 47.7029ZM-6.14068 48.966C-6.30088 48.8057 -6.4102 48.6944 -6.51952 48.5864C-6.39889 48.3016 -6.30277 47.9613 -6.14444 47.7682C-6.09356 47.706 -5.88434 48.0398 -5.74675 48.1904C-5.88057 48.4522 -6.01062 48.7108 -6.14068 48.966ZM22.0768 -15.8403C21.8789 -15.6308 21.696 -15.4377 21.5132 -15.2446C21.4831 -15.4214 21.4001 -15.7126 21.4303 -15.7585C21.5961 -15.9941 21.7922 -16.1676 21.9788 -16.3607C22.0089 -16.2003 22.0391 -16.0399 22.0768 -15.8403ZM-15.2706 12.7681C-15.1406 12.8924 -15.0294 13.0005 -14.9182 13.1052C-14.9973 13.2623 -15.069 13.4325 -15.1594 13.5667C-15.1726 13.5863 -15.3102 13.4488 -15.314 13.3736C-15.3253 13.1837 -15.2914 12.9874 -15.2706 12.7681ZM34.4486 44.9568C34.5447 44.7866 34.6371 44.5117 34.7351 44.5051C34.8293 44.4986 34.9292 44.767 35.0253 44.9175C34.9179 45.0681 34.8218 45.2873 34.6993 45.3463C34.639 45.3757 34.5315 45.1073 34.4486 44.9568ZM12.2135 41.18C12.0496 41.3371 11.8724 41.504 11.6952 41.6709C11.6745 41.4418 11.5878 41.1178 11.6443 41C11.7706 40.7349 11.9685 40.5712 12.1363 40.3683C12.1589 40.6039 12.1815 40.8363 12.2135 41.18ZM53.0817 40.0311C52.8442 40.4664 52.6991 40.7348 52.552 41.0031C52.4408 40.7806 52.2147 40.486 52.2429 40.3518C52.3089 40.0442 52.4748 39.7398 52.6444 39.5827C52.716 39.5205 52.9045 39.8413 53.0817 40.0311ZM16.1943 39.6315C16.3206 38.8297 16.4469 38.0311 16.575 37.2293L16.6165 37.1965C16.4619 37.9853 16.3074 38.7741 16.1509 39.5628C16.1472 39.5595 16.1943 39.6315 16.1943 39.6315ZM56.6893 33.1385C56.6252 32.9618 56.5668 32.7785 56.5102 32.5952C56.5724 32.5559 56.6705 32.4577 56.6912 32.4937C56.7741 32.6345 56.8325 32.8177 56.9004 32.9879C56.8307 33.037 56.7628 33.0828 56.6893 33.1385ZM28.8185 29.1257C28.517 29.4006 28.2154 29.6723 27.9138 29.9472C28.0363 29.8261 28.1551 29.6853 28.2851 29.5872C28.4736 29.4432 28.6715 29.3319 28.8657 29.2075C28.8657 29.2108 28.8185 29.1257 28.8185 29.1257ZM-11.9139 30.9258C-11.6161 30.5887 -11.3183 30.2483 -11.0206 29.9112C-10.9621 30.0749 -10.9037 30.2385 -10.8453 30.3989C-11.1845 30.5625 -11.5238 30.7229 -11.8631 30.8865L-11.9139 30.9258ZM38.5196 29.2175C38.3726 29.3091 38.2464 29.3877 38.1201 29.4662C38.1351 29.2404 38.1351 29.0048 38.1747 28.7953C38.1879 28.7233 38.3519 28.6513 38.3651 28.684C38.4292 28.8378 38.4669 29.0244 38.5196 29.2175ZM47.1674 19.7718C46.9544 20.2005 46.7414 20.6325 46.5284 21.0613C46.4643 20.878 46.4002 20.6914 46.3362 20.5082C46.6283 20.2823 46.9186 20.0565 47.2107 19.834L47.1674 19.7718ZM26.5944 25.3685C26.4625 24.6255 26.3305 23.8826 26.1986 23.1396C26.4851 23.5913 26.7735 24.0462 27.0599 24.4979L27.0976 24.4782C26.928 24.7728 26.7565 25.0706 26.5869 25.3652L26.5944 25.3685ZM37.8506 22.6327C37.73 22.6458 37.6037 22.6458 37.4793 22.6458C37.485 22.5509 37.4793 22.3807 37.4963 22.3741C37.6112 22.3283 37.73 22.3185 37.8468 22.2956C37.8468 22.4003 37.8468 22.5083 37.8506 22.6327ZM18.9895 22.9204C18.7332 23.1004 18.4769 23.2771 18.2205 23.4571C18.2017 23.3458 18.1828 23.2346 18.164 23.1266C18.426 23.0873 18.6899 23.0513 18.9518 23.012L18.9895 22.9204ZM-4.01656 21.9451C-4.0373 22.1578 -4.05803 22.3673 -4.08065 22.5735C-4.16923 22.472 -4.32002 22.3837 -4.33133 22.2626C-4.35017 22.0465 -4.28421 21.8044 -4.25405 21.5753C-4.173 21.6963 -4.09573 21.8174 -4.01656 21.9451ZM28.3137 23.2707C28.4023 23.4147 28.4815 23.562 28.5606 23.7092C28.4721 23.8205 28.3891 23.9482 28.2911 24.0267C28.2704 24.0431 28.1554 23.8631 28.1648 23.8107C28.1912 23.6242 28.2553 23.4507 28.3137 23.2707ZM47.1692 25.375C47.2314 24.7597 47.2936 24.1476 47.3558 23.5323L47.3181 23.516C48.8241 24.4913 47.0429 24.7531 47.1805 25.4306L47.1692 25.375ZM-12.6468 23.7454C-12.9352 24.0793 -13.2217 24.4131 -13.5101 24.7469C-13.5402 24.6324 -13.5704 24.5178 -13.6006 24.4065C-13.2933 24.1807 -12.9842 23.9549 -12.677 23.7291L-12.6468 23.7454ZM-10.0441 25.9675C-10.1421 26.0657 -10.2382 26.1508 -10.3343 26.2359C-10.3456 26.0198 -10.372 25.7973 -10.3607 25.5845C-10.3569 25.506 -10.2608 25.4405 -10.208 25.3718C-10.1534 25.5616 -10.0987 25.758 -10.0441 25.9675ZM11.8537 26.1278C12.0761 25.9249 12.2985 25.722 12.519 25.519C12.5039 25.6041 12.4983 25.7481 12.47 25.7645C12.2815 25.8758 12.0874 25.9609 11.897 26.0525L11.8537 26.1278ZM50.277 26.3899C50.294 26.4848 50.3373 26.6452 50.3241 26.6583C50.2563 26.7336 50.1733 26.7761 50.0979 26.8285C50.1093 26.7238 50.1036 26.6027 50.1356 26.5208C50.1601 26.4521 50.228 26.4325 50.277 26.3899ZM57.5034 27.4338C57.4394 27.4108 57.379 27.3912 57.3206 27.3716C57.3545 27.1719 57.3828 26.969 57.4262 26.7759C57.4299 26.7563 57.5336 26.8054 57.5901 26.8217C57.5638 27.0279 57.5374 27.2308 57.5034 27.4338ZM50.2883 18.8393C50.1073 19.1863 49.9264 19.5332 49.7454 19.8801C49.7002 19.7885 49.6531 19.7001 49.6078 19.6085C49.8472 19.3761 50.0866 19.147 50.3259 18.9146L50.2883 18.8393ZM11.2164 20.698C11.3898 20.3478 11.5651 19.9976 11.7385 19.6474C11.7705 19.7161 11.8045 19.7881 11.8365 19.8568C11.616 20.122 11.3955 20.3838 11.1731 20.6489L11.2164 20.698ZM23.9579 30.0749C23.8053 30.9258 23.6526 31.7801 23.5018 32.6343C23.5056 32.6408 23.5433 32.7096 23.5452 32.7161C23.6714 31.839 23.794 30.9553 23.9165 30.0716C23.9165 30.0749 23.9579 30.0749 23.9579 30.0749ZM24.7437 33.0009L24.8964 32.8405L24.9114 33.0205L24.7437 33.0009ZM22.0147 18.1354C21.7414 18.1354 21.4662 18.1322 21.1929 18.1322C21.2514 17.8049 21.3079 17.4809 21.3663 17.1536C21.5699 17.5005 21.7735 17.8507 21.9751 18.1976L22.0147 18.1354ZM-0.812121 16.666C-0.847932 17.0751 -0.885627 17.4875 -0.923323 17.8966C-0.976098 17.8312 -1.07788 17.7199 -1.07222 17.7035C-0.97987 17.3762 -0.876204 17.0588 -0.774424 16.738L-0.812121 16.666ZM45.7912 35.7077C45.5688 36.1495 45.3464 36.5946 45.124 37.0365C45.0467 36.7812 44.9713 36.5259 44.8941 36.2673C45.2013 36.0971 45.5066 35.9302 45.8138 35.76L45.7912 35.7077ZM41.0887 15.4975C41.4072 15.216 41.7238 14.9346 42.0424 14.6531C42.0612 14.8528 42.0801 15.0524 42.097 15.252C41.7653 15.3208 41.4336 15.3928 41.1018 15.4615L41.0887 15.4975ZM-17.7379 14.1818C-17.687 14.6924 -17.6361 15.2029 -17.5871 15.7168C-17.7831 15.468 -17.981 15.216 -18.177 14.9673L-18.2053 15.0393C-18.0357 14.7447 -17.866 14.4534 -17.6964 14.1589L-17.7379 14.1818ZM4.78362 15.848C4.93629 15.4291 5.08896 15.0102 5.23975 14.5912C5.29817 14.7091 5.35472 14.8301 5.41315 14.948C5.18886 15.2425 4.96456 15.5338 4.74027 15.8284C4.74027 15.8251 4.78362 15.848 4.78362 15.848ZM39.1191 45.3953C39.1398 44.8979 39.1586 44.4004 39.1794 43.9029C39.3 43.9618 39.4206 44.0207 39.5431 44.0796C39.3886 44.4986 39.234 44.9175 39.0776 45.3331L39.1191 45.3953ZM23.7636 13.0987C23.7542 13.0332 23.7447 12.9645 23.7353 12.8925C23.8107 12.9579 23.8861 13.0266 23.9615 13.0921C23.8955 13.0921 23.8295 13.0921 23.7636 13.0987ZM7.9446 48.5767C7.92198 48.9825 7.89937 49.3916 7.87675 49.8007L7.91256 49.7222C7.67696 49.3589 7.44136 48.9956 7.20576 48.6323C7.45644 48.6454 7.70523 48.6552 7.95591 48.6618C7.95591 48.6552 7.9446 48.5767 7.9446 48.5767ZM43.2411 12.1035C43.1337 12.2704 43.0281 12.4275 42.9245 12.5846C42.8547 12.4275 42.7058 12.1984 42.7266 12.1264C42.7869 11.9366 42.9075 11.7664 43.0263 11.6879C43.0658 11.6617 43.1714 11.9464 43.2411 12.1035ZM28.3834 49.4274L28.3288 49.5649L28.2213 49.4961L28.3834 49.4274ZM30.4263 10.3101C30.5507 10.5163 30.7204 10.7291 30.7053 10.7814C30.6167 11.0923 30.4829 11.364 30.3641 11.652C30.2548 11.472 30.0324 11.2003 30.0531 11.1283C30.1342 10.8272 30.2887 10.5883 30.4263 10.3101ZM-11.4032 11.1578C-11.4899 11.3574 -11.6143 11.724 -11.6576 11.6945C-11.8084 11.6029 -11.9309 11.3738 -12.0628 11.1971C-11.9422 11.0563 -11.8272 10.8338 -11.6953 10.7978C-11.6105 10.7749 -11.5012 11.0171 -11.4032 11.1578ZM7.8767 49.8006C8.04445 50.1574 8.2122 50.5141 8.37995 50.8709C8.27817 50.9461 8.17827 51.0181 8.07649 51.0934C8.02183 50.6385 7.96717 50.1836 7.91251 49.7286C7.9144 49.7221 7.8767 49.8006 7.8767 49.8006ZM2.79536 7.75737C2.98008 7.4039 3.16667 7.05044 3.35138 6.69697C3.15159 7.02753 2.94992 7.35809 2.75013 7.68865L2.79536 7.75737ZM-4.88725 7.06996C-5.67698 6.52994 -5.56577 5.99319 -4.88348 5.45971L-4.93814 5.41389C-4.94002 5.98337 -4.9419 6.54957 -4.94379 7.11905L-4.88725 7.06996ZM56.8589 5.79694C56.8344 5.89186 56.8231 6.01295 56.7835 6.07841C56.7421 6.14714 56.6704 6.1635 56.612 6.20278C56.6346 6.04895 56.6478 5.88859 56.6855 5.74458C56.6931 5.72167 56.7986 5.77731 56.8589 5.79694ZM44.4681 6.18933C44.5134 5.74749 44.5586 5.30565 44.6057 4.86382C44.6905 5.33838 44.7772 5.81295 44.8621 6.28752L44.9016 6.21878C44.7471 6.18933 44.5944 6.15987 44.4399 6.13042L44.4681 6.18933ZM23.4733 6.27481C23.5995 5.85589 23.7258 5.43696 23.8521 5.01803C23.903 5.0704 23.9558 5.12276 24.0067 5.17513C23.8144 5.51551 23.6222 5.85589 23.428 6.19627L23.4733 6.27481ZM32.102 4.0688C31.8495 3.77752 31.5969 3.48623 31.3443 3.19495C31.5215 3.01821 31.7006 2.8382 31.8777 2.66147C31.9456 3.1033 32.0115 3.54842 32.0794 3.99025L32.102 4.0688ZM-17.7001 3.84928C-18.0149 3.83291 -18.3315 3.81655 -18.6463 3.79691L-18.6256 3.84273C-18.586 3.41398 -18.5464 2.98851 -18.5068 2.55977C-18.2505 3.01142 -17.996 3.46308 -17.7397 3.91146C-17.7378 3.91473 -17.7001 3.84928 -17.7001 3.84928ZM37.6301 0.625588C37.9223 0.42267 38.2144 0.223025 38.5066 0.020107C38.5254 0.134658 38.5424 0.249209 38.5612 0.36376C38.2427 0.43249 37.9223 0.497946 37.6038 0.566677L37.6301 0.625588ZM35.7886 -0.0517713C35.4663 -0.0419527 35.144 -0.0354082 34.8217 -0.0255895C34.9782 -0.310329 35.1346 -0.595069 35.2929 -0.879809L35.3043 -0.860171C35.4607 -0.581977 35.6171 -0.303784 35.7736 -0.0255895L35.7886 -0.0517713ZM24.1784 0.137833C24.0577 0.242565 23.9428 0.36039 23.8184 0.40621C23.792 0.416029 23.6827 0.0723763 23.6977 0.0461933C23.7939 -0.11745 23.9164 -0.238546 24.0295 -0.372733C24.0785 -0.202544 24.1294 -0.0389019 24.1784 0.137833ZM9.78401 -0.670538C9.6615 0.530606 9.3882 1.12299 8.72286 0.11495C8.72098 0.121496 8.69271 0.203319 8.69082 0.209865C9.0527 -0.055238 9.41459 -0.326887 9.77835 -0.598535L9.78401 -0.670538ZM49.9474 -0.929148C49.7061 -0.893146 49.463 -0.860418 49.2217 -0.824417C49.4611 -1.09279 49.7004 -1.3579 49.9398 -1.62627L49.8984 -1.695C49.9002 -1.42008 49.9021 -1.14189 49.904 -0.866965L49.9474 -0.929148ZM27.0733 -1.76687C27.2694 -1.67523 27.4635 -1.58359 27.6595 -1.49195C27.4616 -1.56395 27.2637 -1.63596 27.0658 -1.70796L27.0733 -1.76687ZM49.9417 -1.62608C50.0397 -2.04174 50.1358 -2.45739 50.2338 -2.87305C50.3262 -2.7094 50.4204 -2.54249 50.5128 -2.37884C50.3092 -2.14974 50.1057 -1.92391 49.9021 -1.69481L49.9417 -1.62608ZM41.3301 -2.51289C41.3885 -2.59471 41.4413 -2.66672 41.4941 -2.74199C41.5487 -2.55544 41.6109 -2.37543 41.6505 -2.17906C41.6561 -2.15615 41.5468 -2.06123 41.4903 -1.99905C41.4356 -2.16597 41.3791 -2.33616 41.3301 -2.51289ZM-23.298 -3.62589C-23.411 -3.51134 -23.5222 -3.40988 -23.6334 -3.30515C-23.673 -3.51462 -23.7729 -3.7699 -23.7352 -3.92045C-23.6919 -4.09719 -23.5279 -4.18555 -23.4148 -4.3132C-23.3752 -4.08737 -23.3356 -3.86154 -23.298 -3.62589ZM-0.998787 -4.87932C-1.11376 -4.84986 -1.22873 -4.83022 -1.34371 -4.81058C-1.34936 -4.92513 -1.37009 -5.13787 -1.35878 -5.14114C-1.2457 -5.19024 -1.12884 -5.2066 -1.01198 -5.23279C-1.00821 -5.11824 -1.00256 -5.00368 -0.998787 -4.87932ZM52.9063 -5.41613C52.8083 -5.32121 52.7084 -5.23612 52.6067 -5.14775C52.6067 -5.24266 52.5859 -5.3834 52.6142 -5.42595C52.6934 -5.54704 52.7914 -5.62559 52.8818 -5.7205C52.8894 -5.61904 52.8969 -5.52086 52.9063 -5.41613ZM38.5968 -5.44568C38.0861 -5.50786 37.5772 -5.56677 37.0664 -5.62896L37.0211 -5.62241C37.5376 -5.53732 38.054 -5.45222 38.5686 -5.3704L38.5968 -5.44568ZM-23.0795 -6.25732C-23.1869 -6.34569 -23.3735 -6.43733 -23.3735 -6.53224C-23.3735 -6.73843 -23.2812 -6.94463 -23.2265 -7.15082C-23.0927 -7.02972 -22.9589 -6.90863 -22.825 -6.78753C-22.908 -6.61407 -22.9909 -6.43733 -23.0795 -6.25732ZM51.4985 -7.40577C51.4626 -7.61196 51.4005 -7.8247 51.4193 -8.01125C51.4287 -8.10616 51.587 -8.15526 51.6775 -8.22399C51.6926 -8.11598 51.7378 -7.98507 51.7152 -7.90979C51.6624 -7.72979 51.5795 -7.57269 51.4985 -7.40577ZM57.0492 -18.0066C56.9851 -18.1703 56.8739 -18.3536 56.8871 -18.5008C56.9022 -18.6874 57.0209 -18.851 57.0944 -19.0212C57.1698 -18.8576 57.3149 -18.6743 57.3018 -18.5401C57.2791 -18.347 57.1434 -18.1834 57.0492 -18.0066ZM56.5252 -9.06851C56.9003 -9.25506 57.2754 -9.44162 57.6486 -9.62817L57.6052 -9.70999C57.2923 -9.28452 57.249 -7.53026 56.5403 -9.05869C56.5384 -9.05869 56.5252 -9.06851 56.5252 -9.06851ZM20.4822 -8.21128C20.3069 -8.00836 20.141 -7.81526 19.9752 -7.62216C19.9186 -7.8349 19.781 -8.16218 19.8187 -8.24073C19.9337 -8.4862 20.1165 -8.63675 20.2711 -8.82658C20.3352 -8.6433 20.3974 -8.46002 20.4822 -8.21128ZM-5.31706 -15.9251C-5.37172 -15.8564 -5.45842 -15.732 -5.46408 -15.7419C-5.53758 -15.8793 -5.60167 -16.0364 -5.66575 -16.187C-5.61675 -16.2492 -5.53004 -16.3768 -5.52439 -16.3637C-5.44711 -16.2328 -5.38115 -16.079 -5.31706 -15.9251ZM1.81496 -15.395C2.19946 -15.7452 2.58396 -16.0921 2.96657 -16.4489C2.96469 -16.4554 2.94395 -16.5274 2.94395 -16.5274C2.55757 -16.174 2.1693 -15.8205 1.78292 -15.467L1.81496 -15.395ZM54.1598 -16.4621C53.8978 -16.2985 53.6339 -16.1348 53.3719 -15.9712C53.3493 -16.1381 53.3286 -16.3083 53.306 -16.4752C53.5849 -16.4523 53.8639 -16.4261 54.1428 -16.4032C54.1428 -16.4065 54.1598 -16.4621 54.1598 -16.4621ZM36.0788 -9.52027C36.1863 -9.94247 36.2956 -10.3679 36.403 -10.7901C36.305 -10.3974 36.2089 -10.0079 36.1109 -9.61518L36.0788 -9.52027ZM57.5487 -13.6607C57.5355 -13.3138 57.5204 -12.9669 57.5072 -12.6167C57.5373 -12.9767 57.5675 -13.3334 57.5977 -13.6935L57.5487 -13.6607ZM54.3351 -13.0355C54.5971 -13.1631 54.8591 -13.294 55.1192 -13.4217C55.1173 -13.3006 55.1173 -13.1795 55.1154 -13.0551C54.8478 -13.0682 54.5783 -13.078 54.3106 -13.0911L54.3351 -13.0355ZM50.9781 -12.4332C51.0158 -12.6328 51.0516 -12.8292 51.0893 -13.0288C51.0384 -12.8259 50.9856 -12.6197 50.9348 -12.4168L50.9781 -12.4332ZM40.2894 -13.3495C40.4043 -13.3463 40.5193 -13.3463 40.6343 -13.343C40.5156 -13.3724 40.3968 -13.4019 40.2781 -13.4313L40.2894 -13.3495ZM31.3217 -12.371C31.5969 -12.9699 31.8721 -13.5721 32.1491 -14.1711L32.1472 -14.2529C31.8683 -13.6507 31.5912 -13.0517 31.3142 -12.443C31.316 -12.4332 31.3217 -12.371 31.3217 -12.371ZM-12.9109 -13.3561L-12.8732 -13.0616L-12.9957 -13.1041L-12.9109 -13.3561ZM49.0105 -13.6247C49.0689 -13.9585 49.1274 -14.289 49.1858 -14.6229C49.2593 -14.5312 49.3309 -14.4429 49.4044 -14.3512C49.2612 -14.1287 49.116 -13.9094 48.9728 -13.6868L49.0105 -13.6247ZM16.7222 -14.8647C16.7109 -14.4097 16.7014 -13.9515 16.6901 -13.4966L16.6468 -13.5555C16.6694 -13.9712 16.6939 -14.3868 16.7165 -14.8058L16.7222 -14.8647ZM8.25927 -15.2052C8.25927 -14.8681 8.25927 -14.5277 8.25927 -14.1906C8.19519 -14.22 8.1311 -14.2495 8.06702 -14.2789C8.14618 -14.5637 8.22723 -14.8517 8.30639 -15.1364L8.25927 -15.2052ZM8.30621 -15.1365C8.31187 -15.4409 8.31752 -15.7485 8.32318 -16.0529L8.31187 -16.1347C8.43438 -15.9056 8.55501 -15.6765 8.67563 -15.4474C8.53616 -15.3656 8.39857 -15.2838 8.25909 -15.2052L8.30621 -15.1365ZM-22.2499 -9.94897C-22.3046 -9.8966 -22.3875 -9.77551 -22.4102 -9.80169C-22.4931 -9.90315 -22.5572 -10.057 -22.6288 -10.1879C-22.5251 -10.2075 -22.4196 -10.2501 -22.3178 -10.2337C-22.2914 -10.2304 -22.2726 -10.0504 -22.2499 -9.94897ZM6.79656 -16.3867C6.8531 -16.3474 6.91153 -16.3049 6.96807 -16.2656C6.93415 -16.1674 6.91153 -16.0332 6.86253 -15.9907C6.83048 -15.9612 6.75886 -16.0594 6.7042 -16.0987C6.73436 -16.1936 6.76451 -16.2918 6.79656 -16.3867ZM-6.48003 -9.14384C-6.54977 -9.11766 -6.61762 -9.09475 -6.68736 -9.06856C-6.69302 -9.25512 -6.69867 -9.4384 -6.70433 -9.62495C-6.63836 -9.57913 -6.55166 -9.56604 -6.51208 -9.48094C-6.47438 -9.40567 -6.48946 -9.25839 -6.48003 -9.14384ZM16.9688 -9.54967C17.1384 -9.02274 17.3081 -8.49908 17.4777 -7.97215L17.4607 -8.00487C17.3118 -8.5449 17.1648 -9.08165 17.0159 -9.62167C17.0159 -9.62495 16.9688 -9.54967 16.9688 -9.54967ZM9.5165 -18.9952C9.49576 -19.1949 9.47126 -19.388 9.47691 -19.5811C9.4788 -19.6236 9.61639 -19.7152 9.64278 -19.6792C9.72382 -19.5647 9.78225 -19.401 9.84822 -19.257C9.74079 -19.1654 9.63147 -19.077 9.5165 -18.9952ZM30.5998 -7.15744C30.7638 -7.60582 30.9278 -8.05748 31.0936 -8.50913C31.0955 -8.51241 31.1219 -8.45022 31.1219 -8.45022C30.9598 -8.04766 30.7977 -7.6451 30.6375 -7.24253L30.5998 -7.15744ZM-20.4859 -8.07383C-20.631 -7.89709 -20.7761 -7.72036 -20.9213 -7.54362C-20.7686 -7.74654 -20.614 -7.94618 -20.4614 -8.1491L-20.4859 -8.07383ZM43.3956 -5.593C43.7914 -5.70755 44.1872 -5.8221 44.583 -5.93992L44.5622 -5.99229C44.1891 -5.87119 43.8177 -5.74682 43.4446 -5.62573L43.3956 -5.593ZM-19.0648 -4.09381C-19.2854 -4.29018 -19.504 -4.48983 -19.7245 -4.6862C-19.6736 -4.78111 -19.6246 -4.87275 -19.5737 -4.96767C-19.4192 -4.6502 -19.2627 -4.33273 -19.1082 -4.01526C-19.1063 -4.01853 -19.0648 -4.09381 -19.0648 -4.09381ZM9.67286 -4.85965C9.53715 -4.7811 9.40144 -4.70582 9.26574 -4.62727C9.26197 -4.94474 9.25631 -5.26548 9.25254 -5.58295L9.21485 -5.67132C9.38448 -5.37676 9.55411 -5.0822 9.72374 -4.78764L9.67286 -4.85965ZM15.6873 -1.75379C15.7608 -2.02544 15.8343 -2.29709 15.906 -2.56874C15.921 -2.46728 15.9663 -2.32327 15.9437 -2.27745C15.8626 -2.10399 15.759 -1.96325 15.6628 -1.80943L15.6873 -1.75379ZM-20.3256 -1.04345C-20.2314 -1.13836 -20.1353 -1.22018 -20.0391 -1.302C-20.0222 -1.19727 -19.9713 -1.02708 -19.992 -0.997625C-20.075 -0.873256 -20.1786 -0.791433 -20.2747 -0.693247C-20.2898 -0.807797 -20.3068 -0.919077 -20.3256 -1.04345ZM-11.8422 -1.38704C-11.7763 -1.31177 -11.7178 -1.24631 -11.6575 -1.17758C-11.7518 -1.00412 -11.8403 -0.824109 -11.944 -0.667011C-11.9515 -0.653919 -12.042 -0.804471 -12.0948 -0.879747C-12.0119 -1.04994 -11.9289 -1.22013 -11.8422 -1.38704ZM-0.810616 -1.63265C-1.01417 -1.325 -1.21773 -1.01735 -1.42318 -0.706424C-1.46464 -0.886432 -1.50611 -1.06317 -1.54757 -1.24318C-1.28936 -1.35445 -1.03302 -1.46246 -0.774804 -1.57374L-0.810616 -1.63265ZM21.3925 0.183539C21.3453 -0.480854 21.3001 -1.14852 21.2549 -1.81291L21.2172 -1.88492C21.2681 -1.20416 21.319 -0.5234 21.3698 0.157357L21.3925 0.183539ZM-3.39649 -0.585178C-3.54162 -0.38226 -3.68863 -0.179342 -3.83376 0.0235765C-3.6924 -0.159704 -3.55293 -0.342984 -3.41345 -0.529538C-3.41534 -0.529538 -3.39649 -0.585178 -3.39649 -0.585178ZM32.5166 0.625459C32.5713 0.396358 32.592 0.157439 32.5807 -0.0880266L32.5317 -0.0291149C32.6994 -0.3204 32.8672 -0.611687 33.0368 -0.902973L32.9878 -0.834242C33.1537 -0.834242 33.3214 -0.837515 33.4892 -0.837515L33.4477 -0.889882C33.1424 -0.412043 32.8351 0.0657972 32.5298 0.543636L32.5166 0.625459ZM-20.6406 1.80709L-20.6934 2.07874L-20.7556 1.85291L-20.6406 1.80709ZM-15.951 2.14424C-15.9717 2.24243 -15.9943 2.33734 -16.0151 2.43553C-16.0697 2.33734 -16.1244 2.23915 -16.179 2.14097C-16.1395 2.07878 -16.1018 1.97405 -16.0565 1.96423C-16.0283 1.95441 -15.9868 2.07878 -15.951 2.14424ZM7.59748 3.41423C7.72187 3.04112 7.84627 2.66474 7.97255 2.29163C8.02533 2.36364 8.07622 2.43237 8.12899 2.50437C7.9424 2.81202 7.7558 3.12294 7.56921 3.43059L7.59748 3.41423ZM50.9462 3.14901C51.2195 2.87409 51.4928 2.60244 51.7661 2.32752L51.7303 2.25879C51.4551 2.53371 51.1799 2.8119 50.9029 3.08682C50.901 3.08682 50.9462 3.14901 50.9462 3.14901ZM50.3731 3.9969C50.0565 4.22928 49.7398 4.45838 49.4213 4.69075L49.4665 4.77257C49.7813 4.5402 50.0941 4.30782 50.4089 4.07545L50.3731 3.9969ZM-15.4026 6.29757C-15.3366 5.98665 -15.2725 5.67573 -15.2065 5.36153C-15.1387 5.66263 -15.0708 5.96701 -15.003 6.26812C-15.003 6.26812 -14.9559 6.23212 -14.954 6.23212C-15.1217 6.23212 -15.2895 6.22884 -15.4572 6.22884L-15.4026 6.29757ZM-23.5072 5.17178C-23.5261 5.2536 -23.5468 5.33542 -23.5656 5.41724C-23.6165 5.36815 -23.6806 5.33214 -23.7164 5.25687C-23.7315 5.22741 -23.6844 5.10959 -23.6636 5.03104C-23.6109 5.07686 -23.5581 5.12596 -23.5072 5.17178ZM23.4301 6.19608C23.1248 6.7361 22.8195 7.27285 22.5141 7.81288L22.5349 7.84233C22.8477 7.31867 23.1606 6.79829 23.4754 6.27463C23.4735 6.27463 23.4301 6.19608 23.4301 6.19608ZM39.3848 6.23876C39.2793 6.5955 39.1737 6.95224 39.0701 7.30899C39.0173 7.22389 38.9645 7.1388 38.9117 7.05043C39.0776 6.79842 39.2453 6.54314 39.4112 6.29112L39.3848 6.23876ZM8.22539 8.51316C8.38937 8.34625 8.55335 8.17933 8.71733 8.01241C8.74371 8.10078 8.77198 8.18915 8.79837 8.27751C8.6212 8.33643 8.44214 8.39206 8.26497 8.45098L8.22539 8.51316ZM40.6437 10.3428C40.5928 10.2938 40.542 10.2447 40.4911 10.1923C40.5721 10.1367 40.6532 10.0843 40.7342 10.0287C40.7041 10.1334 40.6739 10.2381 40.6437 10.3428ZM17.6549 10.0056C17.604 10.5719 17.5512 11.1348 17.5003 11.701L17.5324 11.7632C17.5814 11.1839 17.6323 10.6079 17.6813 10.0286L17.6549 10.0056ZM-0.819799 49.8593C-0.488074 49.4339 -0.154463 49.0084 0.177262 48.5796C0.177262 48.5764 0.182917 48.5142 0.182917 48.5142C-0.148808 48.9429 -0.47865 49.3717 -0.810375 49.8004L-0.819799 49.8593ZM-10.4396 48.3343C-10.5075 48.547 -10.5754 48.7597 -10.6413 48.9725C-10.7035 48.8383 -10.7638 48.7008 -10.826 48.5666C-10.6866 48.5077 -10.549 48.4455 -10.4095 48.3866L-10.4396 48.3343ZM49.674 12.4308C49.6288 12.2279 49.576 12.0283 49.5741 11.8286C49.5741 11.7763 49.74 11.7108 49.8324 11.6846C49.8437 11.6813 49.9096 11.917 49.8889 11.9857C49.8399 12.1559 49.7551 12.2901 49.674 12.4308ZM48.166 47.3558C48.2056 47.6962 48.249 48.0366 48.2772 48.3802C48.2791 48.3966 48.1528 48.4424 48.0869 48.4751C48.1246 48.1249 48.1642 47.7747 48.2018 47.4245L48.166 47.3558ZM54.4783 46.6194C54.4576 46.5212 54.4369 46.423 54.4161 46.3248C54.4802 46.2888 54.5462 46.2201 54.6065 46.2332C54.6329 46.2397 54.6498 46.4034 54.6725 46.4983C54.6065 46.5376 54.5424 46.5801 54.4783 46.6194ZM28.796 44.6555C28.9242 44.698 29.0523 44.7373 29.1824 44.7798C29.0542 44.7176 28.9242 44.6587 28.7998 44.59C28.7998 44.5835 28.796 44.6555 28.796 44.6555ZM-23.5468 45.104C-23.6015 45.3265 -23.6316 45.6015 -23.7259 45.7193C-23.7805 45.788 -23.9389 45.5982 -24.052 45.5262C-23.9992 45.3102 -23.9766 45.0287 -23.8823 44.8978C-23.8333 44.8291 -23.6637 45.0189 -23.5468 45.104ZM14.9994 12.2904C15.0597 12.9155 15.1219 13.5373 15.1822 14.1624L15.2255 14.0937C15.1615 13.5177 15.0993 12.9384 15.0314 12.3525C15.0276 12.346 14.9994 12.2904 14.9994 12.2904ZM-8.80571 41.6149C-8.7322 42.0567 -8.65681 42.4985 -8.5833 42.9404C-8.6455 42.9535 -8.70958 42.9633 -8.77178 42.9764C-8.78309 42.5313 -8.79251 42.0829 -8.80571 41.6345C-8.80571 41.6312 -8.80571 41.6149 -8.80571 41.6149ZM15.6175 40.3878C15.4027 40.8166 15.1897 41.242 14.9748 41.6708C14.9371 41.5595 14.8636 41.3566 14.8693 41.35C15.1256 41.0391 15.3876 40.7445 15.6496 40.45L15.6175 40.3878ZM9.6332 16.2207C9.59551 16.3026 9.56347 16.4237 9.51635 16.4531C9.48242 16.4728 9.42399 16.3647 9.37498 16.3157C9.43341 16.1946 9.49184 16.0735 9.55027 15.9524C9.57854 16.0407 9.60682 16.1324 9.6332 16.2207ZM26.0783 38.6269C26.2988 38.2833 26.5193 37.9396 26.7398 37.596L26.7568 37.5567C26.5174 37.884 26.2762 38.2145 26.0387 38.5484C26.0424 38.5516 26.0783 38.6269 26.0783 38.6269ZM46.4943 16.1358C46.5509 16.0867 46.6508 15.982 46.6564 15.9984C46.7073 16.1194 46.7412 16.2635 46.7808 16.4009C46.7148 16.4009 46.6413 16.4336 46.5867 16.3878C46.5452 16.3518 46.5264 16.2242 46.4943 16.1358ZM32.1188 37.236C32.4675 36.7909 32.8181 36.349 33.1705 35.9105C33.1724 35.9137 33.1329 35.845 33.1366 35.8515C32.7861 36.2966 32.4336 36.7352 32.0811 37.1705L32.1188 37.236ZM56.8438 16.7017C56.6855 16.8261 56.5272 16.9472 56.3688 17.0715C56.3858 16.9897 56.3971 16.8392 56.4216 16.8326C56.5479 16.7901 56.6798 16.7868 56.8099 16.7672L56.8438 16.7017ZM48.3827 35.0891C48.2659 34.9091 48.149 34.729 48.0303 34.549C48.0849 34.5228 48.1792 34.4574 48.1867 34.4803C48.2489 34.6636 48.296 34.8632 48.3488 35.0531L48.3827 35.0891ZM39.1738 34.7848L39.2624 34.6113L39.2888 34.8077L39.1738 34.7848ZM50.2883 33.135C50.4184 33.2103 50.5409 33.2888 50.6634 33.3707C50.6031 33.567 50.5616 33.878 50.4749 33.927C50.3712 33.986 50.2242 33.8158 50.0979 33.747C50.1583 33.5441 50.2186 33.3412 50.2883 33.135ZM43.9856 32.9258C43.946 33.0239 43.9121 33.1156 43.8782 33.2039C43.8009 33.0959 43.7161 32.9978 43.6539 32.8668C43.6388 32.8341 43.7067 32.6868 43.7368 32.5919C43.8216 32.6999 43.9064 32.8079 43.9856 32.9258ZM34.4524 34.1367C34.4995 33.8192 34.5467 33.4985 34.5938 33.181C34.7012 33.3087 34.8068 33.433 34.9142 33.5607C34.7446 33.7309 34.5749 33.8978 34.4072 34.068C34.4072 34.0647 34.4524 34.1367 34.4524 34.1367ZM-7.93314 33.4494C-7.84832 33.2432 -7.77104 33.024 -7.67303 32.8439C-7.64665 32.7949 -7.55241 32.8603 -7.48832 32.8734C-7.6523 33.0534 -7.81439 33.2334 -7.97837 33.4134L-7.93314 33.4494ZM42.2912 31.2011C42.2064 31.3058 42.1235 31.4138 42.0387 31.5186C42.116 31.4269 42.1951 31.3386 42.2724 31.2469L42.2912 31.2011ZM30.3095 28.5464C29.8138 28.7428 29.3162 28.9359 28.8205 29.129C28.8186 29.1257 28.8658 29.2108 28.8639 29.2075C28.8676 28.985 28.8884 28.769 28.9261 28.5562L28.9016 28.6086C29.3803 28.6086 29.8609 28.6086 30.3397 28.6119C30.3416 28.6119 30.3095 28.5464 30.3095 28.5464ZM37.1816 28.2161C37.076 28.2881 37.0195 28.3273 36.9611 28.3633C36.9422 28.2684 36.9215 28.1768 36.9026 28.0819C36.9837 28.1211 37.0628 28.1604 37.1816 28.2161ZM31.1785 19.0029C31.056 19.2156 30.9316 19.4284 30.8091 19.6411C30.762 19.4906 30.7168 19.34 30.6696 19.1927C30.8525 19.1502 31.0334 19.1076 31.2162 19.0651L31.1785 19.0029ZM27.0585 24.498C26.9039 24.7861 26.7494 25.0741 26.5929 25.3653C26.5929 25.3686 26.5854 25.3653 26.5854 25.3653C26.755 25.0708 26.9265 24.773 27.0962 24.4784L27.0585 24.498ZM52.8067 24.6288C52.8105 24.367 52.8123 24.1084 52.8161 23.8466C52.8821 23.8826 52.9481 23.9219 53.014 23.9579C52.9292 24.1706 52.8463 24.3834 52.7615 24.5961L52.8067 24.6288ZM4.42376 23.516C4.469 23.6011 4.5557 23.7222 4.54439 23.7549C4.4935 23.9284 4.41622 24.0822 4.35026 24.2425C4.29937 24.1673 4.20136 24.0462 4.20701 24.0265C4.26921 23.8465 4.34648 23.6796 4.42376 23.516ZM11.1752 20.6491C10.8322 20.5902 10.491 20.528 10.148 20.4691L10.1329 20.3905C10.4929 20.4887 10.8529 20.5902 11.2148 20.6916C11.2167 20.6982 11.1752 20.6491 11.1752 20.6491ZM58.9585 20.4264C58.8888 20.7079 58.8191 20.9893 58.7493 21.2675C58.6984 21.2119 58.6475 21.1563 58.5966 21.1006C58.7305 20.8977 58.8643 20.6915 59 20.4919C59 20.4984 58.9585 20.4264 58.9585 20.4264ZM34.4126 22.8877C34.1827 22.963 33.9528 23.0383 33.7228 23.1136C33.9452 22.8059 34.1676 22.4983 34.39 22.1939L34.3523 22.1252C34.3561 22.4034 34.3618 22.6848 34.3655 22.963L34.4126 22.8877ZM-19.8336 -19.9772L-19.7242 -19.9805L-19.7789 -19.7448L-19.8336 -19.9772ZM21.1381 -18.8837C21.1249 -19.2176 21.1117 -19.5547 21.0985 -19.8885L21.0777 -19.9081C21.0872 -19.5939 21.0947 -19.2797 21.1041 -18.9655L21.1381 -18.8837ZM31.4857 -19.5647L31.661 -19.6465L31.6403 -19.4141L31.4857 -19.5647ZM6.02392 -19.1031C5.95041 -18.946 5.87879 -18.7856 5.80528 -18.6285C5.81659 -18.7202 5.81282 -18.8413 5.84486 -18.9002C5.89386 -18.982 5.96737 -19.0213 6.03145 -19.0769L6.02392 -19.1031ZM-8.23086 -17.863C-8.28363 -17.8008 -8.33641 -17.7354 -8.3873 -17.6732C-8.42688 -17.8238 -8.46458 -17.9743 -8.50416 -18.1249C-8.4363 -18.1412 -8.35714 -18.2067 -8.30625 -18.1641C-8.26479 -18.1281 -8.25536 -17.9678 -8.23086 -17.863ZM2.81973 -18.5078C2.85931 -17.8532 2.89889 -17.1954 2.94036 -16.5343C2.94413 -16.5277 2.96298 -16.4557 2.96674 -16.4492C2.92716 -17.1037 2.8857 -17.7649 2.84423 -18.4293L2.81973 -18.5078ZM39.5677 -17.6959L39.66 -17.9282L39.7015 -17.6533L39.5677 -17.6959ZM54.1426 -18.3963C54.0578 -18.1901 54.071 -18.0035 54.1841 -17.8399L54.1633 -17.8922C54.1426 -18.0363 54.1238 -18.177 54.103 -18.321L54.1426 -18.3963ZM40.823 -15.4672L40.6986 -15.5817L40.8343 -15.6635L40.823 -15.4672ZM1.78292 -15.4638C1.79608 -15.2118 1.80924 -14.9597 1.82052 -14.7077C1.82052 -14.9303 1.82239 -15.1561 1.81863 -15.3852C1.81487 -15.395 1.78292 -15.4638 1.78292 -15.4638ZM44.1929 -14.3508C44.1477 -14.5505 44.1213 -14.6618 44.0949 -14.7698C44.1571 -14.8025 44.2174 -14.8319 44.2796 -14.8647C44.2532 -14.7207 44.2287 -14.5734 44.1929 -14.3508ZM-1.29119 -14.4C-1.34208 -14.2101 -1.39485 -14.0203 -1.44574 -13.8338C-1.44385 -13.9352 -1.46459 -14.0661 -1.43632 -14.125C-1.39108 -14.2167 -1.3138 -14.2625 -1.24972 -14.328L-1.29119 -14.4ZM24.74 -13.968C24.7155 -13.8599 24.7079 -13.7225 24.6627 -13.657C24.6288 -13.6079 24.5496 -13.6538 24.4893 -13.657C24.5232 -13.8403 24.5571 -14.0236 24.5911 -14.2069C24.6401 -14.1283 24.691 -14.0465 24.74 -13.968ZM43.3278 -13.1532C43.3542 -13.0485 43.4051 -12.9372 43.3975 -12.839C43.39 -12.7408 43.324 -12.6557 43.2845 -12.5641C43.2581 -12.6721 43.2091 -12.7834 43.2147 -12.8848C43.2204 -12.983 43.2882 -13.0648 43.3278 -13.1532ZM48.903 -12.5476C49.1763 -12.7113 49.4477 -12.8782 49.721 -13.0418L49.6984 -13.0222C49.442 -12.8847 49.1876 -12.7473 48.935 -12.6131C48.9369 -12.6164 48.903 -12.5476 48.903 -12.5476ZM-1.07621 -10.9015C-1.04229 -11.1175 -1.0159 -11.3368 -0.968778 -11.543C-0.959354 -11.5855 -0.866999 -11.5724 -0.814224 -11.5855C-0.912234 -11.3499 -1.01025 -11.1142 -1.10637 -10.8786L-1.07621 -10.9015ZM9.35999 -10.2466C9.39769 -10.4365 9.43727 -10.623 9.47496 -10.8128C9.4203 -10.6001 9.36753 -10.3874 9.31287 -10.1779L9.35999 -10.2466ZM-12.9032 -8.37152L-12.9768 -8.66935L-12.8128 -8.65625L-12.9032 -8.37152ZM-12.2961 -7.30468C-12.1642 -7.4225 -12.0323 -7.54033 -11.8984 -7.65488C-12.0473 -7.55997 -12.1944 -7.46505 -12.3433 -7.37014L-12.2961 -7.30468ZM-7.02834 -7.6187C-7.15086 -7.60561 -7.27148 -7.59252 -7.39399 -7.57943C-7.27337 -7.57943 -7.15085 -7.5827 -7.034 -7.57288C-7.03588 -7.56307 -7.02834 -7.6187 -7.02834 -7.6187ZM-12.3455 -7.37009C-12.3549 -7.06244 -12.3643 -6.75806 -12.3719 -6.45041C-12.4341 -6.48641 -12.4963 -6.52241 -12.5585 -6.55514C-12.4699 -6.80388 -12.3813 -7.04934 -12.2946 -7.29808C-12.2965 -7.30463 -12.3455 -7.37009 -12.3455 -7.37009ZM24.12 -7.53695C24.1124 -7.32749 24.1162 -7.11148 24.0936 -6.90856C24.0879 -6.8562 24.0069 -6.82674 23.9598 -6.78419C24.0163 -7.0362 24.0728 -7.29149 24.1313 -7.5435L24.12 -7.53695ZM29.5593 -4.45691C29.5291 -4.54527 29.499 -4.63037 29.4707 -4.71874C29.5404 -4.78747 29.6102 -4.85292 29.678 -4.92165C29.6837 -4.81692 29.7101 -4.6991 29.6893 -4.61401C29.6743 -4.54528 29.6064 -4.50927 29.5593 -4.45691ZM-2.49172 -4.12963C-2.57088 -4.00853 -2.65004 -3.89071 -2.73109 -3.76961C-2.67643 -3.70743 -2.62365 -3.64197 -2.56899 -3.57979C-2.55768 -3.74016 -2.54637 -3.89725 -2.53507 -4.05762L-2.49172 -4.12963ZM23.4111 -3.99239C23.364 -3.90402 23.3188 -3.81238 23.2716 -3.72401C23.3206 -3.78947 23.3696 -3.8582 23.4187 -3.92366L23.4111 -3.99239ZM-0.772729 -1.57383C-0.744457 -1.78002 -0.7143 -1.98621 -0.686028 -2.1924C-0.727494 -2.00584 -0.770843 -1.81929 -0.812309 -1.63274C-0.810424 -1.63274 -0.772729 -1.57383 -0.772729 -1.57383ZM43.3823 -1.98609C43.4803 -2.1301 43.5802 -2.27083 43.6783 -2.41484C43.5859 -2.29047 43.4935 -2.16283 43.4012 -2.03518C43.4012 -2.03191 43.3823 -1.98609 43.3823 -1.98609ZM14.2491 -2.47069C14.2058 -2.24486 14.1624 -2.0223 14.1191 -1.79648C14.0512 -1.93066 13.9853 -2.06158 13.9174 -2.19576C14.038 -2.26777 14.1605 -2.33977 14.2812 -2.41177C14.2812 -2.41505 14.2491 -2.47069 14.2491 -2.47069ZM21.253 -1.81608C21.1494 -1.81936 21.0457 -1.82263 20.9421 -1.8259C20.9515 -1.73099 20.959 -1.63935 20.9684 -1.54444C21.0514 -1.65572 21.1343 -1.77027 21.2172 -1.88809C21.2154 -1.88809 21.253 -1.81608 21.253 -1.81608ZM-18.8724 1.02817C-18.9083 0.812163 -18.946 0.596153 -18.9818 0.383417C-18.9196 0.380144 -18.8593 0.376872 -18.7971 0.373599C-18.831 0.589608 -18.8649 0.80889 -18.8988 1.0249L-18.8724 1.02817ZM-15.1501 0.0594806L-15.2406 0.301672L-15.2858 0.0169329L-15.1501 0.0594806ZM-18.8988 1.02505C-19.0364 1.06106 -19.1759 1.09706 -19.3135 1.13633C-19.1684 1.10033 -19.0232 1.06106 -18.8743 1.02505C-18.8725 1.02833 -18.8988 1.02505 -18.8988 1.02505ZM-12.8677 1.2735L-12.96 1.58115L-13.0373 1.26368L-12.8677 1.2735ZM48.1849 2.66805C48.1905 2.64186 48.1943 2.61568 48.2018 2.59277C48.2037 2.60259 48.1849 2.66805 48.1849 2.66805ZM1.96398 1.84946L2.12042 1.79709L2.08084 2.0131L1.96398 1.84946ZM-24.4288 3.00854C-24.3798 3.01181 -24.3044 2.98563 -24.2894 3.02818C-24.2554 3.11654 -24.2535 3.24091 -24.2385 3.34892C-24.3252 3.34237 -24.41 3.33255 -24.4967 3.32601C-24.4722 3.218 -24.4514 3.11327 -24.4288 3.00854ZM-10.2967 2.52058C-10.4061 2.63513 -10.5154 2.74968 -10.6247 2.86423C-10.6002 2.78241 -10.5851 2.65149 -10.5455 2.62858C-10.4796 2.58276 -10.4004 2.6024 -10.3269 2.59586C-10.325 2.59258 -10.2967 2.52058 -10.2967 2.52058ZM-21.611 4.95238C-21.5715 4.89674 -21.53 4.84437 -21.4904 4.78873C-21.5677 4.78219 -21.645 4.77564 -21.7241 4.7691C-21.6921 4.83783 -21.6601 4.90329 -21.628 4.97202L-21.611 4.95238ZM52.7103 4.20935L52.7085 4.42208L52.5784 4.31408L52.7103 4.20935ZM-13.5291 4.67073C-13.6271 4.80164 -13.7233 4.93256 -13.8213 5.0602C-13.7383 4.92929 -13.6535 4.80164 -13.5706 4.67073H-13.5291ZM-12.9937 5.74104C-12.9353 5.70177 -12.875 5.66577 -12.8165 5.62649C-12.8052 5.79014 -12.7939 5.95378 -12.7845 6.11742C-12.8486 6.09451 -12.9315 6.1076 -12.973 6.04215C-13.005 5.99305 -12.9881 5.84577 -12.9937 5.74104ZM39.4131 6.29427C39.7298 6.07498 40.0464 5.85897 40.363 5.63969L40.4026 5.57096C40.0634 5.79679 39.7241 6.01935 39.3867 6.2419C39.3848 6.23863 39.4131 6.29427 39.4131 6.29427ZM17.3497 6.86359C17.4665 6.74577 17.5834 6.63122 17.7002 6.5134C17.7247 6.6574 17.7474 6.80141 17.7719 6.94542C17.6437 6.89632 17.5155 6.84723 17.3874 6.79814L17.3497 6.86359ZM48.7446 7.32191C48.6824 7.27936 48.6202 7.24008 48.558 7.19754C48.6278 7.22372 48.6956 7.2499 48.7654 7.27608L48.7446 7.32191ZM2.74984 7.68827C2.76115 7.92064 2.77246 8.15302 2.78377 8.38539C2.69895 8.34612 2.61413 8.30684 2.52743 8.27084C2.6179 8.10065 2.70649 7.93374 2.79507 7.76027C2.79507 7.757 2.74984 7.68827 2.74984 7.68827ZM40.1614 51.4369C40.1124 51.414 40.0634 51.3911 40.0144 51.3682C40.0823 51.2929 40.1501 51.2176 40.2161 51.1424C40.1991 51.2405 40.1803 51.3387 40.1614 51.4369ZM35.2969 51.6072C35.3685 51.4207 35.442 51.2309 35.5137 51.0443C35.427 51.208 35.3422 51.3683 35.2555 51.532C35.2573 51.532 35.2969 51.6072 35.2969 51.6072ZM1.2722 50.5435C1.23451 50.5861 1.19681 50.6253 1.15911 50.6679C1.20812 50.6122 1.25712 50.5599 1.30801 50.5042L1.2722 50.5435ZM44.3454 49.9248C44.2926 49.9216 44.2417 49.9216 44.189 49.9183C44.2549 49.9412 44.319 49.9641 44.3869 49.987L44.3454 49.9248ZM1.30809 50.5009C1.36275 50.5533 1.41553 50.6056 1.47019 50.6613C1.4061 50.622 1.34013 50.5827 1.27417 50.5434C1.27228 50.5434 1.30809 50.5009 1.30809 50.5009ZM-14.8013 10.9744H-14.6863L-14.7447 11.2035L-14.8013 10.9744ZM2.68387 10.8569L2.60471 11.1351L2.54439 10.8405L2.68387 10.8569ZM38.5442 49.2147C38.5781 49.3653 38.629 49.5126 38.6403 49.6664C38.6441 49.7318 38.565 49.8169 38.5254 49.8922L38.5706 49.9708C38.5725 49.7024 38.5763 49.434 38.5781 49.1656L38.5442 49.2147ZM8.46098 47.0415C8.28758 47.5488 8.11418 48.0594 7.94455 48.5732C7.94643 48.5797 7.95774 48.6583 7.95774 48.6648C8.11983 48.1477 8.28193 47.6241 8.44402 47.0971C8.44214 47.0939 8.46098 47.0415 8.46098 47.0415ZM-7.32064 13.1608C-7.2151 13.0691 -7.10955 12.9808 -7.00211 12.8891C-7.03604 12.9611 -7.06243 13.0691 -7.10389 13.092C-7.16798 13.1248 -7.24337 13.0986 -7.31311 13.0953L-7.32064 13.1608ZM39.0778 45.3332C38.9609 45.451 38.8497 45.5787 38.7272 45.6736C38.7027 45.6932 38.6443 45.5754 38.6009 45.523C38.7724 45.4772 38.9421 45.4314 39.1174 45.3888C39.1192 45.3954 39.0778 45.3332 39.0778 45.3332ZM5.98809 45.1663C5.8995 45.4085 5.80903 45.6507 5.72045 45.8896C5.66579 45.8143 5.61113 45.7423 5.55835 45.6671C5.71102 45.5132 5.86181 45.3594 6.01448 45.2023L5.98809 45.1663ZM-1.22138 13.0234C-1.27604 13.0889 -1.3307 13.1871 -1.38536 13.1838C-1.43437 13.1805 -1.48337 13.0725 -1.53237 13.0103C-1.42871 13.0103 -1.32505 13.0103 -1.22138 13.0234ZM56.9813 13.0234L56.823 13.1249L56.8362 12.886L56.9813 13.0234ZM46.6395 44.5345C46.6169 44.6392 46.5943 44.7407 46.5716 44.8454C46.5 44.7178 46.4265 44.5901 46.3549 44.4625C46.4095 44.3839 46.4642 44.3087 46.5189 44.2334C46.5585 44.3316 46.5999 44.433 46.6395 44.5345ZM30.7883 43.5821C30.7204 43.6607 30.6526 43.7359 30.5866 43.8145C30.6356 43.8734 30.6865 43.9323 30.7355 43.9912C30.743 43.8505 30.7487 43.7098 30.7562 43.5657L30.7883 43.5821ZM11.8084 43.0814L11.9649 43.2123L11.8066 43.3432L11.8084 43.0814ZM-18.9687 42.7409C-19.0459 42.8456 -19.1232 42.9471 -19.2005 43.0485C-19.1458 43.1074 -19.0912 43.1696 -19.0384 43.2285C-19.0309 43.0747 -19.0252 42.9209 -19.0177 42.7671L-18.9687 42.7409ZM11.6047 14.8133C11.4991 14.7413 11.3936 14.6726 11.288 14.6006C11.386 14.689 11.4841 14.7773 11.5802 14.869C11.5783 14.8755 11.6047 14.8133 11.6047 14.8133ZM-5.69202 42.5285C-5.73914 42.4663 -5.78626 42.4008 -5.83338 42.3386C-5.78437 42.2797 -5.73348 42.1783 -5.68448 42.1783C-5.63924 42.1783 -5.59401 42.2928 -5.54877 42.355C-5.59589 42.4107 -5.6449 42.4696 -5.69202 42.5285ZM54.7873 41.6904L54.7948 41.4416L54.9456 41.5791L54.7873 41.6904ZM30.3848 42.057C30.3772 41.7755 30.3716 41.4973 30.364 41.2158L30.3282 41.2649C30.332 41.5497 30.3358 41.8344 30.3395 42.1192L30.3848 42.057ZM44.7941 41.7721C44.9034 41.6543 45.0108 41.5398 45.1201 41.4219C45.0956 41.5103 45.0805 41.6543 45.0428 41.6805C44.9769 41.7263 44.8939 41.6969 44.8186 41.7001L44.7941 41.7721ZM25.8745 40.715C25.7991 40.787 25.7237 40.859 25.6484 40.931C25.6879 41.0062 25.7256 41.0815 25.7652 41.1568C25.8104 41.0259 25.8538 40.895 25.899 40.7608L25.8745 40.715ZM-18.2807 40.761C-18.0168 40.9966 -17.7529 41.229 -17.4872 41.4647L-17.474 41.481C-17.7454 41.2192 -18.0187 40.9574 -18.2901 40.6923L-18.2807 40.761ZM6.37265 15.4976C6.31988 15.5041 6.25203 15.5434 6.2181 15.5041C6.18229 15.4616 6.1804 15.3405 6.16344 15.2521C6.25014 15.239 6.33496 15.2259 6.42166 15.2129C6.4047 15.3078 6.38961 15.4027 6.37265 15.4976ZM34.8764 15.7952C34.9424 15.6283 35.0102 15.4647 35.0762 15.2977C35.0668 15.3992 35.0762 15.5399 35.0423 15.589C34.9895 15.6643 34.9047 15.6807 34.835 15.7199L34.8764 15.7952ZM57.805 41.3531C57.8484 41.3073 57.8917 41.2582 57.9369 41.2124C57.9087 41.1437 57.8823 41.0717 57.854 41.0029C57.8201 41.1404 57.788 41.2778 57.7541 41.4186L57.805 41.3531ZM46.2475 40.1359L46.093 39.9788L46.2664 39.8904L46.2475 40.1359ZM25.8992 40.764C25.9614 40.0571 26.0236 39.3469 26.082 38.6334C26.0801 38.6269 26.0424 38.5516 26.0406 38.5483C25.9821 39.2651 25.9256 39.9851 25.8728 40.7117C25.8747 40.715 25.8992 40.764 25.8992 40.764ZM-18.2921 40.6923C-18.2883 40.7119 -18.2846 40.7315 -18.2808 40.7545C-18.2808 40.761 -18.2921 40.6923 -18.2921 40.6923ZM-0.382728 15.658C-0.282833 15.5991 -0.181053 15.5402 -0.0811584 15.4813C-0.130163 15.5173 -0.177287 15.5762 -0.228177 15.586C-0.29226 15.5991 -0.36011 15.5762 -0.424194 15.5729C-0.422309 15.5762 -0.382728 15.658 -0.382728 15.658ZM12.5867 16.0636L12.664 15.8018L12.73 16.0702L12.5867 16.0636ZM21.5998 15.4975L21.4678 15.3633L21.6149 15.2684L21.5998 15.4975ZM36.3749 37.5436C36.4257 37.5109 36.4785 37.4749 36.5294 37.4421C36.5369 37.596 36.5445 37.7498 36.5539 37.9036C36.4974 37.8774 36.4239 37.8807 36.3899 37.8185C36.3598 37.7662 36.3786 37.6385 36.3749 37.5436ZM51.5495 37.1608L51.5891 37.4652L51.4515 37.4096L51.5495 37.1608ZM43.0168 36.7481C43.0017 36.8496 42.9867 36.9478 42.9716 37.0492C42.9188 36.9118 42.8679 36.7776 42.8151 36.6401C42.883 36.6761 42.949 36.7121 43.0168 36.7481ZM-22.6272 15.4941C-22.6668 15.5923 -22.7252 15.6807 -22.7403 15.792C-22.7478 15.8509 -22.6856 15.9392 -22.6555 16.0145C-22.6592 15.8247 -22.6649 15.6349 -22.6668 15.4483C-22.6649 15.4483 -22.6272 15.4941 -22.6272 15.4941ZM15.61 17.3501C15.7287 17.1373 15.8456 16.9246 15.9643 16.7119C16.0114 16.9246 16.0604 17.1373 16.1075 17.3501L16.1189 17.337C15.953 17.337 15.7871 17.3337 15.6213 17.3337L15.61 17.3501ZM52.9875 16.45C52.9366 16.4762 52.8706 16.5449 52.8386 16.5122C52.7952 16.4696 52.7783 16.3485 52.75 16.2601C52.8405 16.2176 52.9309 16.1783 53.0214 16.1358C53.0101 16.2438 52.9988 16.3485 52.9875 16.45ZM38.2014 36.6862L38.2711 36.4375L38.3314 36.6928L38.2014 36.6862ZM1.28357 36.0152L1.43058 35.9301L1.4155 36.1461L1.28357 36.0152ZM50.654 35.0954L50.8237 35.2394L50.6521 35.3769L50.654 35.0954ZM-17.6061 36.4473C-17.6042 36.2476 -17.6005 36.0447 -17.5986 35.8451C-17.6136 36.0316 -17.6306 36.2215 -17.6456 36.408L-17.6061 36.4473ZM-3.17009 16.8916L-3.16444 17.1305L-3.31899 17.0225L-3.17009 16.8916ZM8.72475 34.7813C8.81899 34.6864 8.91134 34.5947 9.00558 34.4998C8.92454 34.5751 8.8416 34.6504 8.76056 34.7256L8.72475 34.7813ZM-7.97823 33.4133C-8.29676 33.626 -8.61717 33.8388 -8.93759 34.0515C-8.93947 34.0482 -8.89612 34.0712 -8.89612 34.0712C-8.57759 33.8617 -8.25906 33.6522 -7.93676 33.4428C-7.93299 33.4493 -7.97823 33.4133 -7.97823 33.4133ZM-16.6352 17.8443C-16.6126 17.7658 -16.5919 17.6218 -16.5693 17.6218C-16.5184 17.6218 -16.4675 17.6905 -16.4166 17.7331C-16.4392 17.8116 -16.4599 17.9491 -16.4844 17.9523C-16.5334 17.9556 -16.5843 17.8836 -16.6352 17.8443ZM23.89 18.2009C24.0162 17.9947 24.1444 17.7918 24.2707 17.5856C24.3084 17.6772 24.3442 17.7689 24.3819 17.8638C24.2047 17.9522 24.0294 18.0438 23.8523 18.1322L23.89 18.2009ZM10.8847 32.1631C10.9073 32.0747 10.9281 31.9143 10.9526 31.9111C11.0148 31.9078 11.0789 31.9733 11.1429 32.0125C11.1203 32.1009 11.0996 32.2645 11.0751 32.2678C11.011 32.2678 10.9469 32.2024 10.8847 32.1631ZM21.1758 32.4607C21.3247 31.8519 21.4755 31.2465 21.6244 30.6377L21.6036 30.7195C21.4547 31.3185 21.304 31.9174 21.1551 32.5163L21.1758 32.4607ZM6.09562 30.8701C6.05038 30.9127 6.00514 30.9553 5.95991 30.9978C5.99195 30.9683 6.02399 30.9422 6.05792 30.9127L6.09562 30.8701ZM3.46617 31.0994C3.48314 31.1845 3.5001 31.2663 3.51518 31.3514C3.45675 31.3809 3.39832 31.4365 3.34178 31.43C3.32104 31.4267 3.30785 31.2794 3.29089 31.1943C3.34932 31.1616 3.40775 31.1321 3.46617 31.0994ZM23.8522 18.132C23.5884 18.4495 23.3245 18.767 23.0606 19.0844L23.104 19.1433C23.366 18.8291 23.6279 18.515 23.8899 18.2008L23.8522 18.132ZM55.0813 19.2188C54.9701 19.317 54.8608 19.4152 54.7496 19.5134C54.7817 19.4381 54.8062 19.3203 54.8476 19.2974C54.9136 19.2614 54.9928 19.2843 55.0644 19.281C55.0625 19.281 55.0813 19.2188 55.0813 19.2188ZM55.6112 26.9068C55.5792 26.7366 55.5453 26.6384 55.5509 26.55C55.5547 26.5107 55.6395 26.4911 55.6885 26.4616C55.6659 26.5893 55.6433 26.7169 55.6112 26.9068ZM-2.54813 26.5404C-2.65744 26.6288 -2.76676 26.727 -2.88362 26.7761C-2.91001 26.7859 -2.9609 26.6124 -3.00048 26.5241C-2.89304 26.4455 -2.78938 26.3408 -2.67818 26.2982C-2.64614 26.2819 -2.59148 26.4488 -2.54813 26.5404ZM-8.30437 26.475L-8.15547 26.3899L-8.17244 26.6027L-8.30437 26.475ZM-16.4335 25.8005L-16.5824 25.6237L-16.4071 25.5256L-16.4335 25.8005ZM23.8654 21.4544C23.8636 21.4805 23.8617 21.5067 23.8617 21.5296L23.8654 21.4544ZM52.7632 24.5993C52.7764 24.6058 52.7877 24.6157 52.8046 24.6255C52.8065 24.6288 52.7632 24.5993 52.7632 24.5993ZM23.4998 25.29C23.7788 25.0478 24.0577 24.8089 24.3367 24.5667L24.299 24.5012C24.0219 24.7467 23.7449 24.9922 23.4659 25.2409C23.4678 25.2409 23.4998 25.29 23.4998 25.29ZM2.56158 25.3519L2.72744 25.3486L2.64639 25.6596L2.56158 25.3519ZM58.4497 24.2983C58.3932 24.3343 58.3385 24.3736 58.282 24.4096C58.2707 24.2394 58.2612 24.0692 58.2499 23.9023C58.3121 23.9285 58.397 23.9187 58.4328 23.9874C58.4667 24.0463 58.446 24.1936 58.4497 24.2983ZM34.3658 22.9631C34.4996 23.1529 34.6334 23.3395 34.7672 23.5293C34.7164 23.6111 34.6636 23.6962 34.6127 23.7781C34.5467 23.4802 34.4807 23.1857 34.4129 22.8878L34.3658 22.9631ZM-20.1693 21.6374C-20.2146 21.5195 -20.2617 21.3984 -20.3069 21.2806C-20.273 21.3886 -20.2372 21.4934 -20.2033 21.6014L-20.1693 21.6374ZM-10.815 22.472L-10.8169 22.6749L-10.9432 22.5702L-10.815 22.472ZM-20.2029 21.6015C-19.9692 21.5164 -19.7355 21.4313 -19.5018 21.343H-19.4603C-19.6959 21.4379 -19.9315 21.5361 -20.169 21.6343C-20.169 21.6375 -20.2029 21.6015 -20.2029 21.6015ZM-14.1679 21.3657L-14.1283 21.5162C-14.1283 21.5162 -14.2075 21.4213 -14.2094 21.4278C-14.2132 21.4311 -14.1679 21.3657 -14.1679 21.3657ZM-7.34889 21.7586L-7.49025 21.8503L-7.47329 21.6081L-7.34889 21.7586ZM23.8616 21.5294L23.8126 21.5359C23.8126 21.5359 23.8692 21.441 23.8673 21.4475C23.8654 21.4541 23.8616 21.5294 23.8616 21.5294ZM34.3903 22.1938L34.4468 22.0335L34.3526 22.1251L34.3903 22.1938ZM-18.5407 22.9729L-18.4672 22.8158L-18.5859 22.9042L-18.5407 22.9729ZM18.9516 23.0122L18.9158 22.8715C18.9158 22.8715 18.9855 22.9337 18.9874 22.9304C18.9893 22.9206 18.9516 23.0122 18.9516 23.0122ZM20.3239 20.5312C20.2787 20.4821 20.2315 20.433 20.1863 20.3839C20.2165 20.4395 20.2466 20.4919 20.2768 20.5475L20.3239 20.5312ZM-19.502 21.3426C-19.4662 21.3099 -19.4304 21.2772 -19.3946 21.2444C-19.4172 21.2772 -19.4417 21.3099 -19.4625 21.3426C-19.4606 21.3426 -19.502 21.3426 -19.502 21.3426ZM-18.5861 22.904C-18.7557 23.1593 -18.9254 23.4146 -19.095 23.6699L-19.0667 23.7222C-18.8933 23.4702 -18.718 23.2215 -18.5427 22.9695C-18.5409 22.9728 -18.5861 22.904 -18.5861 22.904ZM-12.6752 23.7288C-12.6319 23.6993 -12.5885 23.6699 -12.5433 23.6437C-12.5772 23.6797 -12.613 23.7124 -12.6469 23.7452L-12.6752 23.7288ZM40.6946 22.8353L40.7172 22.9826C40.7172 22.9826 40.6606 22.9106 40.6588 22.9171C40.6569 22.9237 40.6946 22.8353 40.6946 22.8353ZM47.3557 23.5324L47.2219 23.6535C47.2219 23.6535 47.3123 23.5226 47.3142 23.5193C47.318 23.5193 47.3557 23.5324 47.3557 23.5324ZM-19.095 23.6734L-19.0668 23.7257C-19.0649 23.7257 -19.095 23.6734 -19.095 23.6734ZM-17.8152 24.5111C-17.7662 24.5308 -17.7172 24.5471 -17.6663 24.5668C-17.7021 24.5242 -17.7361 24.4849 -17.7719 24.4424L-17.8152 24.5111ZM20.5425 24.5668C20.5877 24.5995 20.6311 24.6355 20.6763 24.6683C20.648 24.6225 20.6198 24.5799 20.5915 24.5341L20.5425 24.5668ZM24.3386 24.5667C24.4008 24.4423 24.463 24.3146 24.5252 24.1903C24.5139 24.2721 24.5177 24.3932 24.4894 24.4259C24.4366 24.4816 24.365 24.4816 24.3028 24.5045C24.3009 24.5012 24.3386 24.5667 24.3386 24.5667ZM-17.7737 24.4424V24.6126C-17.7737 24.6126 -17.8094 24.5013 -17.8132 24.5078C-17.8151 24.5111 -17.7737 24.4424 -17.7737 24.4424ZM-3.99563 24.4817L-4.05029 24.6126L-3.9862 24.5046L-3.99563 24.4817ZM20.5912 24.5341L20.5837 24.6879C20.5837 24.6879 20.5518 24.557 20.548 24.5603C20.5424 24.5668 20.5912 24.5341 20.5912 24.5341ZM22.6065 20.024C22.5594 20.0437 22.5104 20.0633 22.4632 20.083C22.5217 20.0928 22.5782 20.1026 22.6348 20.1059C22.6329 20.0993 22.6065 20.024 22.6065 20.024ZM20.2766 20.5474C20.3068 20.5049 20.3369 20.4656 20.3671 20.4231C20.3501 20.4591 20.3332 20.4983 20.3181 20.5311C20.3237 20.5311 20.2766 20.5474 20.2766 20.5474ZM10.1477 20.4692L10.0836 20.4528C10.0836 20.4528 10.1383 20.4037 10.1345 20.3972C10.1326 20.3939 10.1477 20.4692 10.1477 20.4692ZM-20.0391 26.1018L-19.9486 26.0494L-20.0127 26.1182L-20.0391 26.1018ZM0.870778 26.1934C0.923553 26.2097 0.976329 26.2261 1.0291 26.2457C0.991407 26.2065 0.953711 26.1639 0.91413 26.1246L0.870778 26.1934ZM3.6528 26.1343L3.79981 26.1506L3.69992 26.1212L3.6528 26.1343ZM5.48479 26.056C5.53191 26.0658 5.57903 26.0756 5.62615 26.0855C5.59222 26.0462 5.55829 26.0102 5.52437 25.9709L5.48479 26.056ZM22.9739 26.1376C23.1491 25.8562 23.3244 25.5747 23.4997 25.29C23.4997 25.29 23.4677 25.2409 23.4677 25.2376C23.2905 25.5158 23.1133 25.794 22.9362 26.0722L22.9739 26.1376ZM38.6309 26.1867C38.6139 26.1998 38.5989 26.2161 38.582 26.2325L38.6309 26.1867ZM47.1803 25.4339C47.1445 25.4274 47.1105 25.4208 47.0747 25.4143C47.1068 25.4012 47.1388 25.3848 47.169 25.375L47.1803 25.4339ZM56.6384 25.7023L56.5177 25.7776L56.5328 25.5812L56.6384 25.7023ZM-20.0128 26.1179C-20.0486 26.1409 -20.0844 26.167 -20.1184 26.19C-20.0901 26.1605 -20.0637 26.131 -20.0373 26.0983C-20.0392 26.1016 -20.0128 26.1179 -20.0128 26.1179ZM-0.65019 26.5499L-0.535216 26.4747L-0.550294 26.671L-0.65019 26.5499ZM0.914065 26.1212L0.959297 26.2717C0.959297 26.2717 0.876369 26.1801 0.872599 26.1866C0.870714 26.1932 0.914065 26.1212 0.914065 26.1212ZM3.69997 26.1212C3.66981 26.1572 3.64154 26.1932 3.61138 26.2292C3.62835 26.1964 3.64531 26.1604 3.65851 26.131C3.65285 26.1342 3.69997 26.1212 3.69997 26.1212ZM5.52256 25.9709L5.53759 26.1542C5.53759 26.1542 5.48871 26.0462 5.48683 26.0527C5.48496 26.056 5.52256 25.9709 5.52256 25.9709ZM11.8968 26.0526L11.9138 26.1966C11.9138 26.1966 11.861 26.1181 11.8572 26.1213C11.8535 26.1246 11.8968 26.0526 11.8968 26.0526ZM22.9362 26.0721C22.7816 26.3372 22.627 26.6056 22.4725 26.8707C22.4725 26.8707 22.5158 26.9427 22.5158 26.946C22.6685 26.6776 22.8212 26.406 22.9739 26.1376L22.9362 26.0721ZM38.5837 26.2325L38.497 26.1998L38.6308 26.1867L38.5837 26.2325ZM-12.1002 27.3259C-12.1454 27.3095 -12.1888 27.2899 -12.234 27.2735C-12.1831 27.303 -12.1341 27.3357 -12.0832 27.3651L-12.1002 27.3259ZM10.5003 26.9102L10.555 27.0509C10.555 27.0509 10.4664 26.9789 10.4645 26.9854C10.4589 26.9953 10.5003 26.9102 10.5003 26.9102ZM18.2808 26.5959L18.3335 26.8544C18.3335 26.8544 18.2789 26.6875 18.2751 26.681C18.2732 26.6744 18.2808 26.5959 18.2808 26.5959ZM23.3395 27.699H23.4771L23.3791 27.7056L23.3395 27.699ZM28.4437 27.5124L28.357 27.4142C28.357 27.4142 28.4173 27.5746 28.4173 27.5779C28.4173 27.5812 28.4437 27.5124 28.4437 27.5124ZM29.7479 26.9167L29.7422 27.0738C29.7422 27.0738 29.7084 26.9396 29.7046 26.9429C29.7009 26.9461 29.7479 26.9167 29.7479 26.9167ZM56.789 18.9635L56.7325 19.0682L56.7721 18.9341L56.789 18.9635ZM47.2121 19.8308L47.167 19.7686C47.167 19.7719 47.2121 19.8308 47.2121 19.8308ZM3.05543 19.4808L3.0215 19.2714L3.12705 19.3041L3.05543 19.4808ZM-12.0853 27.3651C-12.1098 27.7938 -12.1343 28.2258 -12.1569 28.6579C-12.155 28.6611 -12.1456 28.7266 -12.1456 28.7331C-12.1305 28.2684 -12.1154 27.7971 -12.1022 27.3291C-12.1004 27.3258 -12.0853 27.3651 -12.0853 27.3651ZM-6.74772 28.6512L-6.7026 28.4515C-6.7026 28.4515 -6.73832 28.5825 -6.73832 28.5857C-6.73832 28.589 -6.74772 28.6512 -6.74772 28.6512ZM10.966 28.4709L11.1074 28.376L11.0037 28.3858L10.966 28.4709ZM23.3789 27.7056C23.345 27.735 23.3111 27.7678 23.2771 27.7972C23.2998 27.7645 23.3224 27.7318 23.3431 27.699C23.3393 27.699 23.3789 27.7056 23.3789 27.7056ZM28.9279 28.5564C28.7677 28.2095 28.6056 27.8626 28.4454 27.5124C28.4454 27.5091 28.4172 27.5779 28.4172 27.5779C28.5792 27.9182 28.7413 28.2652 28.9034 28.6088C28.9015 28.6088 28.9279 28.5564 28.9279 28.5564ZM-22.4044 28.9428L-22.5722 29.0409L-22.5552 28.7758L-22.4044 28.9428ZM11.0035 28.3862L11.0205 28.5302C11.0205 28.5302 10.9697 28.4582 10.9678 28.4647C10.9659 28.4713 11.0035 28.3862 11.0035 28.3862ZM19.3682 29.9344L19.2777 29.9573L19.4096 30.0096L19.3682 29.9344ZM23.9164 30.0751C23.9541 30.0358 23.9918 29.9966 24.0295 29.9606C24.0031 29.9998 23.9767 30.0391 23.9541 30.0784C23.9578 30.0751 23.9164 30.0751 23.9164 30.0751ZM36.1466 30.291L36.1128 30.0423L36.0978 30.2255L36.1466 30.291ZM42.278 29.7279C42.2272 29.7083 42.1763 29.6886 42.1235 29.6723C42.1819 29.705 42.2385 29.7377 42.295 29.7737L42.278 29.7279ZM56.7719 18.934C56.8096 18.9209 56.8454 18.9111 56.8831 18.898C56.8511 18.9209 56.8209 18.9439 56.7889 18.9635L56.7719 18.934ZM54.9384 17.9884C54.9855 18.3975 55.0307 18.8067 55.0798 19.2158C55.0816 19.219 55.0628 19.278 55.0647 19.2812C55.027 18.8787 54.9874 18.4728 54.9478 18.067L54.9384 17.9884ZM50.3261 18.9143C50.3751 18.8455 50.4241 18.7768 50.4731 18.7048C50.4128 18.7506 50.3525 18.7964 50.2903 18.839C50.2884 18.839 50.3261 18.9143 50.3261 18.9143ZM31.2161 19.0651C31.2217 18.9669 31.2293 18.8655 31.2349 18.7673C31.2161 18.8458 31.1953 18.9244 31.1765 19.0029C31.1784 19.0029 31.2161 19.0651 31.2161 19.0651ZM16.1432 18.1946C15.9604 18.1946 15.7776 18.1914 15.5948 18.1914L15.6193 18.2175C15.787 18.2175 15.9566 18.2175 16.1244 18.2175L16.1432 18.1946ZM6.05573 30.9129L6.09144 30.8016C6.09144 30.8016 6.08957 30.8802 6.09333 30.8736C6.09521 30.8703 6.05573 30.9129 6.05573 30.9129ZM19.4096 30.0093L19.3739 30.0911C19.3739 30.0911 19.3626 29.9275 19.3645 29.9308C19.3682 29.934 19.4096 30.0093 19.4096 30.0093ZM21.6245 30.6377L21.6679 30.7097C21.6679 30.7097 21.5981 30.7326 21.6019 30.7261C21.6019 30.7195 21.6245 30.6377 21.6245 30.6377ZM36.0978 30.2255L36.2033 30.196C36.2033 30.196 36.143 30.2844 36.143 30.2909C36.1468 30.2909 36.0978 30.2255 36.0978 30.2255ZM42.2742 31.2467C42.2742 30.7394 42.276 30.2354 42.2779 29.7281L42.2967 29.7707C42.2948 30.2452 42.293 30.7198 42.2911 31.1976C42.2911 31.2009 42.2742 31.2467 42.2742 31.2467ZM-23.2226 31.6689L-23.1548 31.6133L-23.1981 31.6853L-23.2226 31.6689ZM-11.8649 30.8868L-11.8592 31.0635C-11.8592 31.0635 -11.9062 30.9195 -11.91 30.9228C-11.9138 30.9261 -11.8649 30.8868 -11.8649 30.8868ZM28.6018 31.8195L28.5887 31.6133L28.5548 31.8686L28.6018 31.8195ZM29.6159 31.1288L29.6555 31.335L29.5405 31.3022L29.6159 31.1288ZM-23.1982 31.6854L-23.2528 31.8294C-23.2528 31.8294 -23.2208 31.669 -23.2227 31.669L-23.1982 31.6854ZM28.5549 31.8684L28.472 31.7702C28.472 31.7702 28.602 31.8128 28.602 31.816C28.602 31.8193 28.5549 31.8684 28.5549 31.8684ZM54.9474 18.0698C54.9248 18.0142 54.9022 17.9586 54.8796 17.9029C54.9003 17.9357 54.921 17.9684 54.9399 17.9946C54.938 17.988 54.9474 18.0698 54.9474 18.0698ZM43.6711 17.2976C43.6164 17.2845 43.5637 17.2714 43.509 17.2583C43.5486 17.2976 43.59 17.3368 43.6296 17.3761L43.6711 17.2976ZM41.2263 17.3632L41.1829 17.4712L41.2734 17.4253L41.2263 17.3632ZM16.1076 17.3502C16.1188 17.6316 16.1282 17.9131 16.1414 18.1946C16.1433 18.1946 16.1245 18.2142 16.1245 18.2142C16.1226 17.9197 16.1207 17.6284 16.1207 17.3338L16.1076 17.3502ZM15.5948 18.1913C15.623 18.0048 15.6626 17.8215 15.6739 17.6316C15.6796 17.5433 15.6343 17.4451 15.6117 17.3502C15.6098 17.3502 15.6212 17.3338 15.6212 17.3338C15.6212 17.6284 15.6193 17.9229 15.6193 18.2175L15.5948 18.1913ZM5.81855 17.9489L5.77709 17.7525L5.8864 17.7754L5.81855 17.9489ZM-12.632 18.1585L-12.6283 18.0178C-12.6283 18.0178 -12.5925 18.1389 -12.5888 18.1323C-12.5869 18.1291 -12.632 18.1585 -12.632 18.1585ZM-24.8945 17.7887L-24.7626 17.7003L-24.7776 17.9229L-24.8945 17.7887ZM21.1534 32.5166L21.1044 32.5722C21.1044 32.5722 21.176 32.4577 21.1741 32.4577C21.176 32.461 21.1534 32.5166 21.1534 32.5166ZM-6.22362 34.12L-6.14069 33.9792L-6.26885 34.0381L-6.22362 34.12ZM-15.772 34.4081L-15.6306 34.3197L-15.6476 34.5554L-15.772 34.4081ZM-9.64252 34.8993C-9.39561 34.6243 -9.15058 34.3461 -8.8999 34.0712C-8.89613 34.0712 -8.94137 34.0483 -8.93949 34.0516C-9.16189 34.3003 -9.38618 34.5491 -9.61047 34.7978L-9.64252 34.8993ZM-6.26872 34.0386C-6.35354 34.1499 -6.43647 34.2644 -6.52128 34.3757C-6.49489 34.3004 -6.47793 34.1793 -6.44023 34.1564C-6.37615 34.1139 -6.29699 34.1269 -6.22348 34.1204L-6.26872 34.0386ZM4.49688 35.0759L4.50064 34.8828L4.46868 35.0432L4.49688 35.0759ZM5.32465 35.0661C5.31525 35.0791 5.30585 35.089 5.29646 35.1021C5.29646 35.0988 5.32465 35.0661 5.32465 35.0661ZM10.949 34.6211L11.0998 34.5687L10.9773 34.5458L10.949 34.6211ZM30.0608 34.3461L30.0909 34.5522L29.9872 34.5195L30.0608 34.3461ZM49.2027 35.0629C49.1914 35.076 49.1801 35.0891 49.1688 35.1022L49.2027 35.0629ZM43.6293 17.3763L43.5746 17.2258C43.5746 17.2258 43.6651 17.3076 43.667 17.3043C43.6708 17.2978 43.6293 17.3763 43.6293 17.3763ZM41.1737 16.7512C41.2962 16.8264 41.4168 16.8984 41.5393 16.9737C41.4357 17.1046 41.3301 17.2323 41.2265 17.3632L41.2736 17.4254C41.185 17.2028 41.1586 16.9606 41.1925 16.6955L41.1737 16.7512ZM-9.61074 34.7976L-9.55231 34.9187C-9.55231 34.9187 -9.63901 34.886 -9.64089 34.8925C-9.64278 34.8991 -9.61074 34.7976 -9.61074 34.7976ZM-0.0206229 35.8386L-0.0922451 35.6488L-0.0658575 35.8419L-0.0206229 35.8386ZM4.46868 35.043C4.75328 35.0496 5.03977 35.0529 5.32438 35.0627L5.2961 35.0987C5.03035 35.0921 4.76459 35.0823 4.49695 35.0758L4.46868 35.043ZM8.7606 34.7257L8.71924 34.8828C8.71924 34.8828 8.72864 34.7781 8.72676 34.7781C8.72488 34.7814 8.7606 34.7257 8.7606 34.7257ZM10.977 34.5458L11.0033 34.7913C11.0033 34.7913 10.9525 34.6244 10.9507 34.6244C10.9488 34.6211 10.977 34.5458 10.977 34.5458ZM49.167 35.1021C48.905 35.0955 48.6449 35.0923 48.3829 35.089C48.381 35.0923 48.349 35.053 48.349 35.0563C48.6317 35.0595 48.9163 35.0595 49.2028 35.0628L49.167 35.1021ZM-0.0658125 35.8417L0.0812058 35.7435C0.0812058 35.7435 -0.0130368 35.8221 -0.0168064 35.8319C-0.020576 35.8417 -0.0658125 35.8417 -0.0658125 35.8417ZM3.43032 36.0119L3.57733 35.9301L3.55849 36.1559L3.43032 36.0119ZM22.4027 35.6975L22.5271 35.7433C22.5271 35.7433 22.4404 35.7564 22.4404 35.7597C22.4422 35.763 22.4027 35.6975 22.4027 35.6975ZM26.7378 36.0775C26.6888 36.0579 26.6379 36.0349 26.5889 36.0153C26.6455 36.0513 26.7001 36.084 26.7567 36.12C26.7567 36.1233 26.7378 36.0775 26.7378 36.0775ZM29.5763 35.7992L29.6328 36.0545L29.4971 36.0349L29.5763 35.7992ZM56.8098 16.7675L56.8493 16.5875C56.8493 16.5875 56.8399 16.7053 56.8418 16.7053C56.8436 16.7053 56.8098 16.7675 56.8098 16.7675ZM41.1923 16.6953C41.1584 16.296 41.1226 15.8967 41.0887 15.4974C41.0887 15.4974 41.1018 15.4614 41.1018 15.4581C41.1264 15.8869 41.1527 16.3156 41.1754 16.7477C41.1735 16.7509 41.1923 16.6953 41.1923 16.6953ZM34.835 15.7234C34.835 15.7234 34.8763 15.7987 34.8763 15.7954L34.835 15.7234ZM11.6989 16.1358C11.6556 16.0834 11.6122 16.0311 11.5689 15.9787C11.6085 16.0409 11.6499 16.0998 11.6895 16.162L11.6989 16.1358ZM4.74018 15.825L4.67044 15.8577C4.67044 15.8577 4.77788 15.8413 4.77976 15.8446C4.78353 15.8479 4.74018 15.825 4.74018 15.825ZM-0.774614 16.7383C-0.642678 16.3816 -0.512627 16.0248 -0.382575 15.6648C-0.38446 15.6615 -0.424041 15.5797 -0.424041 15.5732C-0.554092 15.9332 -0.684142 16.2965 -0.812309 16.663C-0.812309 16.6663 -0.774614 16.7383 -0.774614 16.7383ZM-17.6435 36.4078C-17.8207 36.6893 -17.9978 36.9708 -18.175 37.2555L-18.1939 37.2261C-17.9978 36.9675 -17.8037 36.7089 -17.6077 36.4504C-17.6058 36.4471 -17.6435 36.4078 -17.6435 36.4078ZM-3.09467 37.1999C-3.03248 37.0297 -2.97028 36.8628 -2.90808 36.6926C-2.98535 36.8432 -3.06263 36.9937 -3.13991 37.1476L-3.09467 37.1999ZM16.5732 37.2295L16.607 37.0756C16.607 37.0756 16.6089 37.2033 16.6108 37.2C16.6146 37.1967 16.5732 37.2295 16.5732 37.2295ZM26.7397 37.5957C26.7378 37.0917 26.7378 36.5877 26.7378 36.0804C26.7378 36.0804 26.7566 36.1229 26.7566 36.1196C26.7566 36.5942 26.7566 37.072 26.7566 37.5532C26.7566 37.5564 26.7397 37.5957 26.7397 37.5957ZM-23.7879 15.4615L-23.7408 15.6971C-23.7408 15.6971 -23.8068 15.5302 -23.8087 15.5269C-23.8105 15.5269 -23.7879 15.4615 -23.7879 15.4615ZM-18.1752 37.2553C-18.2129 37.2684 -18.2487 37.2815 -18.2864 37.2946C-18.2562 37.2717 -18.2242 37.2488 -18.194 37.2259L-18.1752 37.2553ZM-3.13815 37.1442C-3.13815 37.1442 -3.09115 37.1998 -3.09303 37.1998C-3.09491 37.1998 -3.13815 37.1442 -3.13815 37.1442ZM10.6529 38.0346L10.7133 37.8612L10.6435 38.0837L10.6529 38.0346ZM32.0794 37.1705C32.0304 37.2851 31.9814 37.4029 31.9305 37.5174C31.938 37.4454 31.9305 37.3374 31.955 37.3112C32.0002 37.2622 32.0624 37.2589 32.1171 37.2392C32.119 37.236 32.0794 37.1705 32.0794 37.1705ZM-6.75895 38.7677L-6.67602 38.663L-6.74388 38.807L-6.75895 38.7677ZM10.6437 38.0837L10.6003 38.1688C10.6003 38.1688 10.655 38.028 10.655 38.0313C10.6531 38.0346 10.6437 38.0837 10.6437 38.0837ZM30.419 38.9509L30.453 38.8069L30.3738 38.8953L30.419 38.9509ZM49.9605 16.0735C50.0566 15.648 50.1527 15.2225 50.2489 14.7971L50.2112 14.7381C50.1282 15.1538 50.0453 15.5727 49.9624 15.9917C49.9662 15.9982 49.9605 16.0735 49.9605 16.0735ZM11.6894 16.162C11.6612 15.7136 11.631 15.2685 11.6046 14.8168C11.6065 14.8135 11.5801 14.8725 11.5801 14.8692C11.6197 15.2881 11.6593 15.7103 11.6989 16.1325C11.6989 16.1358 11.6894 16.162 11.6894 16.162ZM-19.191 14.7416L-19.1722 15.0035C-19.1722 15.0035 -19.1572 14.83 -19.1609 14.8235C-19.1666 14.8169 -19.191 14.7416 -19.191 14.7416ZM-11.8214 38.8199L-11.8459 38.9738C-11.8459 38.9738 -11.859 38.833 -11.8628 38.8363C-11.8647 38.8363 -11.8214 38.8199 -11.8214 38.8199ZM23.3941 39.5987L23.4638 39.5169L23.4148 39.6249L23.3941 39.5987ZM30.3737 38.8955C30.1475 39.0067 29.9195 39.118 29.6933 39.2293C29.6933 39.2326 29.6782 39.2784 29.6782 39.2784C29.9232 39.1671 30.1664 39.0526 30.4152 38.9445C30.4189 38.9511 30.3737 38.8955 30.3737 38.8955ZM38.9401 39.5239L38.8534 39.442L38.9005 39.5926L38.9401 39.5239ZM48.0455 39.5892L48.1699 39.5499L48.0737 39.6088L48.0455 39.5892ZM49.7944 39.8085L49.7493 39.6318L49.7587 39.8249L49.7944 39.8085ZM50.4392 39.6744C50.4543 39.4748 50.4712 39.2718 50.4863 39.0722C50.5636 39.1507 50.639 39.226 50.7163 39.3046C50.6145 39.4126 50.5146 39.5239 50.4128 39.6319C50.4109 39.6286 50.4392 39.6744 50.4392 39.6744ZM15.6496 40.4502C15.8306 40.1785 16.0096 39.9036 16.1905 39.632C16.1924 39.632 16.1472 39.5632 16.1472 39.5632C15.97 39.8382 15.7929 40.1164 15.6157 40.3913C15.6176 40.388 15.6496 40.4502 15.6496 40.4502ZM23.415 39.6252C23.3773 39.6448 23.3415 39.6612 23.3038 39.6808C23.334 39.6546 23.3641 39.6284 23.3943 39.6022C23.3943 39.599 23.415 39.6252 23.415 39.6252ZM29.7648 40.3155C29.7365 39.9719 29.7082 39.6315 29.68 39.2846C29.68 39.2813 29.695 39.2322 29.6932 39.229C29.7045 39.6053 29.7158 39.985 29.729 40.3646C29.7309 40.3679 29.7648 40.3155 29.7648 40.3155ZM38.9005 39.5925C38.9005 39.5925 38.9418 39.5237 38.94 39.5237L38.9005 39.5925ZM48.0736 39.6089C48.0303 39.6318 47.9888 39.6547 47.9455 39.6776C47.9794 39.6482 48.0133 39.6187 48.0454 39.5893L48.0736 39.6089ZM49.7587 39.8247C49.9849 39.7756 50.2111 39.7233 50.4391 39.6742C50.4391 39.6742 50.4128 39.6284 50.4146 39.6316C50.2111 39.6905 50.0075 39.7462 49.8002 39.8051C49.7945 39.8084 49.7587 39.8247 49.7587 39.8247ZM50.2506 14.7938C50.3128 14.7677 50.3732 14.7317 50.4354 14.7251C50.4655 14.7218 50.4994 14.7775 50.5315 14.8069C50.4278 14.7873 50.3242 14.7677 50.2167 14.7448C50.2129 14.7382 50.2506 14.7938 50.2506 14.7938ZM28.8639 14.1229L28.8676 14.2342L28.8845 14.0443L28.8639 14.1229ZM15.1822 14.1657C15.2369 14.2311 15.2896 14.2966 15.3443 14.3621C15.3047 14.2737 15.2651 14.1853 15.2255 14.097C15.2274 14.0937 15.1822 14.1657 15.1822 14.1657ZM-4.52358 14.2833C-4.5594 14.3127 -4.59709 14.3389 -4.6329 14.3684C-4.58578 14.3618 -4.53866 14.3553 -4.49154 14.3487C-4.48966 14.3455 -4.52358 14.2833 -4.52358 14.2833ZM-7.33761 14.5843L-7.16798 14.5777C-7.16798 14.5777 -7.35269 14.545 -7.35081 14.5417C-7.35081 14.5385 -7.33761 14.5843 -7.33761 14.5843ZM-13.5025 14.5547L-13.3574 14.4664L-13.3725 14.6987L-13.5025 14.5547ZM-16.6127 41.4383C-16.6183 41.4448 -16.6221 41.4481 -16.6277 41.4547L-16.6127 41.4383ZM5.00614 40.5611L5.13242 40.5022C5.13242 40.5022 5.05137 40.4858 5.0476 40.4957C5.04383 40.5022 5.00614 40.5611 5.00614 40.5611ZM24.6664 40.8363C24.6212 40.9018 24.5759 41.0229 24.5345 41.0163C24.493 41.013 24.4553 40.8821 24.4157 40.8068C24.461 40.7414 24.5062 40.6203 24.5495 40.6268C24.5891 40.6334 24.6268 40.7643 24.6664 40.8363ZM30.3643 41.2159C30.1664 40.918 29.9666 40.6169 29.7668 40.3191C29.7649 40.3191 29.731 40.3715 29.7291 40.3715C29.927 40.6693 30.1268 40.9671 30.3266 41.265C30.3285 41.2617 30.3643 41.2159 30.3643 41.2159ZM41.5223 41.445C41.5505 41.3763 41.5807 41.3076 41.609 41.2389C41.5694 41.2978 41.5298 41.3567 41.4902 41.4123C41.4921 41.409 41.5223 41.445 41.5223 41.445ZM-17.4892 41.4645C-17.1971 41.458 -16.9049 41.4482 -16.6128 41.4416L-16.6279 41.458C-16.9087 41.4645 -17.1914 41.4744 -17.4741 41.4809C-17.4741 41.4776 -17.4892 41.4645 -17.4892 41.4645ZM16.4941 41.9817L16.6355 41.9882H16.5318L16.4941 41.9817ZM42.3308 41.4286C42.0613 41.4319 41.7918 41.4351 41.5223 41.4417C41.5204 41.445 41.4921 41.409 41.4902 41.409C41.7786 41.4057 42.067 41.3959 42.3591 41.3926C42.361 41.3959 42.3308 41.4286 42.3308 41.4286ZM46.3508 42.119L46.3376 41.9554L46.3038 42.1877L46.3508 42.119ZM57.7541 41.4153L57.6938 41.2909C57.6938 41.2909 57.8087 41.3433 57.8068 41.3465C57.805 41.3531 57.7541 41.4153 57.7541 41.4153ZM-19.0176 42.7704C-19.0308 42.7279 -19.0421 42.682 -19.0553 42.6395C-19.029 42.6755 -19.0026 42.7148 -18.9724 42.7475C-18.9686 42.741 -19.0176 42.7704 -19.0176 42.7704ZM45.0374 13.3474C44.9828 13.3147 44.9262 13.282 44.8716 13.246C44.9112 13.2983 44.9508 13.3507 44.9903 13.4031L45.0374 13.3474ZM28.8847 14.0443L28.9167 14.0542C28.9167 14.0542 28.8583 14.136 28.8602 14.1294C28.8639 14.1229 28.8847 14.0443 28.8847 14.0443ZM14.0494 42.5348L14.0079 42.3254L14.121 42.3515L14.0494 42.5348ZM16.5317 41.9882C16.4978 42.0045 16.4657 42.0209 16.4318 42.0373C16.4544 42.0176 16.477 41.998 16.4959 41.9784C16.494 41.9816 16.5317 41.9882 16.5317 41.9882ZM30.3397 42.119L30.2549 42.0863C30.2549 42.0863 30.3849 42.0536 30.383 42.0536C30.3849 42.0568 30.3397 42.119 30.3397 42.119ZM44.8168 41.7001L44.8281 41.9194C44.8281 41.9194 44.798 41.7786 44.7961 41.7753C44.7943 41.7721 44.8168 41.7001 44.8168 41.7001ZM46.304 42.1876L46.2606 42.1091C46.2606 42.1091 46.3549 42.1091 46.353 42.1156C46.3511 42.1189 46.304 42.1876 46.304 42.1876ZM3.8828 13.3769C3.83568 13.3343 3.79045 13.2918 3.74333 13.246C3.77348 13.2983 3.80364 13.354 3.8338 13.4063L3.8828 13.3769ZM-3.96176 13.3472C-4.14835 13.6581 -4.33495 13.969 -4.52343 14.2799C-4.52343 14.2799 -4.49139 14.3421 -4.49139 14.3454C-4.30479 14.0312 -4.11631 13.7137 -3.92595 13.3995L-3.96176 13.3472ZM-7.31498 13.0954C-7.3225 13.5896 -7.33002 14.0838 -7.33754 14.5813C-7.33754 14.5845 -7.35258 14.5387 -7.35258 14.542C-7.3413 14.0871 -7.33002 13.6289 -7.31874 13.1674C-7.32062 13.1608 -7.31498 13.0954 -7.31498 13.0954ZM-21.3491 13.4751C-21.5338 13.6911 -21.7204 13.9038 -21.907 14.1198L-21.8693 14.1853C-21.7053 13.966 -21.5413 13.7467 -21.3754 13.5274L-21.3491 13.4751ZM-2.49914 43.1793L-2.37851 43.1041L-2.39359 43.3037L-2.49914 43.1793ZM25.9162 43.3791L25.8559 43.0879L26.0104 43.1141L25.9162 43.3791ZM28.7489 43.2252C28.7828 43.2645 28.8167 43.3005 28.8507 43.3397C28.8224 43.2874 28.7922 43.2383 28.764 43.1859L28.7489 43.2252ZM30.7544 43.5658C30.7959 43.5396 30.8355 43.5167 30.877 43.4905C30.8468 43.52 30.8148 43.5494 30.7865 43.5789C30.7884 43.5822 30.7544 43.5658 30.7544 43.5658ZM52.8667 43.2548L52.8366 43.0453L52.9421 43.0813L52.8667 43.2548ZM28.7622 43.1859C28.7734 43.6736 28.7866 44.158 28.796 44.6522C28.7941 44.6587 28.7998 44.5867 28.796 44.5933C28.7772 44.1449 28.7622 43.6899 28.7471 43.2285C28.749 43.2252 28.7622 43.1859 28.7622 43.1859ZM44.9903 13.4061C45.0035 13.3897 45.0166 13.3734 45.0336 13.3537C45.0373 13.3472 44.9903 13.4061 44.9903 13.4061ZM17.0198 12.7781L16.9538 12.9253C16.9538 12.9253 17.0443 12.8632 17.0443 12.8599C17.0443 12.8533 17.0198 12.7781 17.0198 12.7781ZM13.8534 12.6372L13.7403 12.6962L13.8289 12.6143L13.8534 12.6372ZM3.83562 13.4061C3.86012 13.3571 3.88463 13.3112 3.90913 13.2621C3.89782 13.3014 3.88839 13.3407 3.88085 13.3767C3.88274 13.3767 3.83562 13.4061 3.83562 13.4061ZM-21.3754 13.5275L-21.3247 13.3638L-21.351 13.4751C-21.3491 13.4751 -21.3754 13.5275 -21.3754 13.5275ZM-5.49416 45.1957C-5.44516 45.2251 -5.39615 45.2546 -5.34715 45.2808C-5.38107 45.2382 -5.41311 45.1957 -5.44704 45.1531L-5.49416 45.1957ZM-2.47083 45.3721C-2.42748 45.3197 -2.38413 45.2674 -2.34078 45.215C-2.39732 45.251 -2.45198 45.287 -2.5123 45.3165C-2.51418 45.3132 -2.47083 45.3721 -2.47083 45.3721ZM6.50454 44.1845C6.33302 44.5118 6.1615 44.8358 5.9881 45.1631L6.0126 45.2024C6.18412 44.8849 6.35564 44.5674 6.52716 44.2467C6.52904 44.2467 6.50454 44.1845 6.50454 44.1845ZM8.13288 44.9598C8.18 44.9892 8.22712 45.0219 8.27424 45.0514C8.23089 44.999 8.18566 44.9434 8.14419 44.891C8.14607 44.891 8.13288 44.9598 8.13288 44.9598ZM11.4895 45.0549L11.3953 44.9142C11.3953 44.9142 11.4537 45.104 11.4556 45.104C11.4575 45.104 11.4895 45.0549 11.4895 45.0549ZM17.7229 45.4343C17.7455 45.3787 17.77 45.3231 17.7927 45.2707C17.7625 45.3198 17.7323 45.3656 17.7041 45.4147C17.7041 45.4114 17.7229 45.4343 17.7229 45.4343ZM18.5373 45.3395L18.5637 45.1071L18.4977 45.3231L18.5373 45.3395ZM26.8583 45.4476C26.8866 45.3821 26.913 45.3166 26.9412 45.2512C26.9073 45.3101 26.8753 45.369 26.8413 45.4312C26.8432 45.4312 26.8583 45.4476 26.8583 45.4476ZM27.7388 45.4213C27.7331 45.4278 27.7294 45.4344 27.7237 45.4376L27.7388 45.4213ZM50.4336 45.2119L50.4524 45.0483L50.4204 45.2806L50.4336 45.2119ZM51.7887 45.1824L51.8057 45.0514C51.8057 45.0514 51.8263 45.1431 51.8282 45.1398C51.832 45.1333 51.7887 45.1824 51.7887 45.1824ZM-10.0855 45.9221C-10.0402 45.9254 -9.99501 45.9254 -9.94977 45.9286C-9.9837 45.8959 -10.0157 45.8632 -10.0497 45.8305L-10.0855 45.9221ZM-5.44718 45.1531L-5.45094 45.3037C-5.45094 45.3037 -5.48666 45.1859 -5.49042 45.1924C-5.49418 45.1957 -5.44718 45.1531 -5.44718 45.1531ZM-3.20978 45.657C-2.96476 45.5588 -2.72162 45.4606 -2.47282 45.3657C-2.46906 45.3689 -2.51429 45.31 -2.51052 45.3166C-2.74612 45.4017 -2.98361 45.4835 -3.21921 45.5751C-3.21921 45.585 -3.20978 45.657 -3.20978 45.657ZM8.45713 45.6012C8.34969 45.3885 8.24414 45.1758 8.13483 44.9598C8.13294 44.9598 8.14613 44.891 8.14425 44.891C8.25357 45.143 8.36477 45.3983 8.47786 45.6503L8.45713 45.6012ZM12.1193 45.9188C11.9101 45.6307 11.7009 45.3427 11.4917 45.0514C11.4898 45.0514 11.4578 45.1038 11.4559 45.1005C11.6613 45.382 11.8687 45.6667 12.0779 45.9482C12.0798 45.9515 12.1193 45.9188 12.1193 45.9188ZM18.4976 45.3232C18.2394 45.3592 17.983 45.3985 17.7248 45.4345C17.7229 45.4345 17.7041 45.4116 17.7041 45.4116C17.9793 45.3854 18.2544 45.3592 18.5334 45.3363C18.5372 45.3396 18.4976 45.3232 18.4976 45.3232ZM25.6711 45.8208L25.5825 45.7422L25.6447 45.8764L25.6711 45.8208ZM27.7234 45.4376C27.4369 45.4409 27.1486 45.4442 26.8602 45.4475C26.8583 45.4475 26.8432 45.4311 26.8413 45.4311C27.1391 45.4278 27.4388 45.4245 27.7385 45.4213L27.7234 45.4376ZM50.4203 45.2808L50.3713 45.3561C50.3713 45.3561 50.4354 45.2088 50.4354 45.212C50.4335 45.212 50.4203 45.2808 50.4203 45.2808ZM47.5552 11.7208L47.5608 11.8648C47.5608 11.8648 47.5195 11.7862 47.5157 11.7928C47.512 11.796 47.5552 11.7208 47.5552 11.7208ZM17.5002 11.7012C17.34 12.058 17.1779 12.4147 17.0177 12.7747C17.0177 12.778 17.0422 12.8533 17.0441 12.8566C17.2081 12.4966 17.3702 12.13 17.5341 11.7634C17.5341 11.7602 17.5002 11.7012 17.5002 11.7012ZM13.8289 12.6144C13.8703 12.5948 13.9118 12.5784 13.9533 12.5588C13.9193 12.585 13.8854 12.6079 13.8534 12.6341C13.8534 12.6373 13.8289 12.6144 13.8289 12.6144ZM-10.0497 45.8273L-10.0139 45.9811C-10.0139 45.9811 -10.0818 45.9124 -10.0836 45.9189C-10.0855 45.9222 -10.0497 45.8273 -10.0497 45.8273ZM-4.18247 47.0087C-4.15608 46.9465 -4.13158 46.8876 -4.10519 46.8254C-4.141 46.8745 -4.17681 46.9236 -4.21263 46.9727L-4.18247 47.0087ZM-3.34911 46.9663C-3.3001 46.5375 -3.2511 46.1055 -3.20586 45.667C-3.20963 45.6572 -3.21717 45.5851 -3.21905 45.5753C-3.27371 46.0466 -3.3246 46.5277 -3.37926 47.0056C-3.38115 47.0056 -3.34911 46.9663 -3.34911 46.9663ZM8.47764 45.6504C8.472 46.1119 8.46448 46.5733 8.45884 47.0348C8.46072 47.0381 8.44192 47.0904 8.44192 47.0937C8.44756 46.5962 8.45132 46.0988 8.45508 45.598C8.45696 45.6013 8.47764 45.6504 8.47764 45.6504ZM25.6448 45.8763C25.7937 46.1905 25.9407 46.5047 26.0896 46.8189L26.1311 46.7436C25.9784 46.436 25.8258 46.1316 25.6731 45.8239C25.6712 45.8207 25.6448 45.8763 25.6448 45.8763ZM-4.21439 46.9728C-3.92601 46.9696 -3.63952 46.9663 -3.35115 46.9663C-3.35115 46.9696 -3.3813 47.0056 -3.3813 47.0088C-3.64706 47.0088 -3.9147 47.0088 -4.18235 47.0088L-4.21439 46.9728ZM0.229905 47.1791C0.190324 47.1693 0.152629 47.1562 0.113048 47.1464C0.158283 47.1726 0.203519 47.202 0.248755 47.2282L0.229905 47.1791ZM26.0893 46.8188C26.1534 46.8286 26.2175 46.8417 26.2816 46.8515C26.2307 46.8155 26.1817 46.7795 26.1308 46.7435L26.0893 46.8188ZM32.5413 47.5127L32.6129 47.3982L32.5526 47.5487L32.5413 47.5127ZM33.5911 47.1266L33.74 47.0252L33.7249 47.2804L33.5911 47.1266ZM48.2019 47.4277L48.0963 47.3786C48.0963 47.3786 48.1661 47.3622 48.1661 47.3589C48.1661 47.3557 48.2019 47.4277 48.2019 47.4277ZM49.9076 47.4704C50.0716 47.4802 50.2356 47.4867 50.3996 47.4965C50.3996 47.4933 50.4128 47.5162 50.4128 47.5162C50.2394 47.5129 50.0641 47.5096 49.8907 47.5096L49.9076 47.4704ZM51.7453 46.7275C51.8094 46.7733 51.8848 46.7962 51.9338 46.8682C51.9602 46.9075 51.9414 47.0351 51.9414 47.1235C51.8886 46.9697 51.8358 46.8191 51.783 46.6653C51.7849 46.6653 51.7453 46.7275 51.7453 46.7275ZM-10.4118 48.3866L-10.4419 48.3343C-10.44 48.3343 -10.4118 48.3866 -10.4118 48.3866ZM0.250653 47.228C0.228035 47.6535 0.203532 48.079 0.182799 48.511C0.184684 48.5143 0.177145 48.5765 0.177145 48.5797C0.194108 48.115 0.211072 47.6502 0.22992 47.1822C0.22992 47.179 0.250653 47.228 0.250653 47.228ZM28.4434 10.9154L28.4284 11.1118L28.466 10.8369L28.4434 10.9154ZM-17.2762 11.2296L-17.1839 11.3016C-17.1839 11.3016 -17.2479 11.1609 -17.2461 11.1576C-17.2461 11.1544 -17.2762 11.2296 -17.2762 11.2296ZM-22.2858 10.9417C-22.2839 11.2494 -22.2802 11.557 -22.2764 11.8647C-22.2745 11.8647 -22.2764 11.8811 -22.2764 11.8811C-22.2745 11.5832 -22.2708 11.2854 -22.2689 10.9908L-22.2858 10.9417ZM37.9542 48.2984C38.1502 48.6028 38.3481 48.9072 38.5442 49.2148L38.5781 49.169C38.3821 48.8646 38.186 48.5603 37.9881 48.2559C37.9881 48.2526 37.9542 48.2984 37.9542 48.2984ZM23.7805 49.9609L23.9162 49.9478L23.8238 49.938L23.7805 49.9609ZM34.7953 49.879C34.8802 49.6925 34.965 49.5059 35.0517 49.3194C34.9537 49.4896 34.8557 49.663 34.7576 49.8332L34.7953 49.879ZM44.879 49.0184C44.7019 49.3195 44.5247 49.6239 44.3456 49.925C44.3438 49.925 44.3871 49.9872 44.3852 49.9872C44.5567 49.6828 44.7301 49.3784 44.9035 49.0708L44.879 49.0184ZM28.4662 10.8369L28.4982 10.8794C28.4982 10.8794 28.436 10.9318 28.4398 10.9252C28.4436 10.9154 28.4662 10.8369 28.4662 10.8369ZM8.77763 10.1433L8.77387 10.2807L8.79266 10.068L8.77763 10.1433ZM4.71973 10.3068L4.61229 10.3984L4.69145 10.3624L4.71973 10.3068ZM-17.7227 10.2643C-17.5738 10.585 -17.4249 10.9025 -17.2779 11.2265C-17.2779 11.2298 -17.2477 11.1545 -17.2477 11.1578C-17.391 10.837 -17.5323 10.5097 -17.6756 10.1857L-17.7227 10.2643ZM-18.39 9.91743L-18.4088 10.1531C-18.4088 10.1531 -18.3675 9.94034 -18.3637 9.94689C-18.3581 9.95671 -18.39 9.91743 -18.39 9.91743ZM-22.7703 10.971C-22.6083 10.9612 -22.4462 10.9547 -22.2841 10.9416C-22.2841 10.9383 -22.2671 10.9874 -22.2671 10.9874C-22.4386 10.9907 -22.6101 10.9939 -22.7817 10.9972L-22.7703 10.971ZM-0.810688 49.7971L-0.857686 50.0033C-0.857686 50.0033 -0.820087 49.8626 -0.820087 49.8593L-0.810688 49.7971ZM23.8236 49.938L23.8067 50.0493C23.8067 50.0493 23.786 49.9511 23.7823 49.9543C23.7804 49.9609 23.8236 49.938 23.8236 49.938ZM34.7576 49.8333C34.7576 49.8333 34.8046 49.8791 34.799 49.8791C34.7952 49.8791 34.7576 49.8333 34.7576 49.8333ZM38.5252 49.892C38.4837 49.9934 38.4441 50.0949 38.4027 50.1963C38.4573 50.1211 38.512 50.0458 38.5685 49.9705C38.5704 49.9705 38.5252 49.892 38.5252 49.892ZM-24.5965 51.6464C-24.6003 51.6726 -24.604 51.7021 -24.6097 51.7282L-24.5965 51.6464ZM-11.7761 50.8052C-11.7553 50.8641 -11.7365 50.923 -11.7157 50.9852C-11.7346 50.946 -11.7553 50.91 -11.7742 50.8772C-11.7742 50.8838 -11.7761 50.8052 -11.7761 50.8052ZM20.4256 50.9951L20.4689 51.198L20.3539 51.1719L20.4256 50.9951ZM36.6897 9.46589L36.6011 9.50844L36.6614 9.46916L36.6897 9.46589ZM26.1195 9.67184L26.2213 9.77658L26.1497 9.59329L26.1195 9.67184ZM17.6834 10.0252C17.3875 10.0187 17.0916 10.0121 16.7957 10.0056C16.7957 10.0056 16.8164 9.97941 16.8164 9.97614C17.0935 9.98595 17.3724 9.99577 17.6533 10.0056C17.6551 10.0056 17.6834 10.0252 17.6834 10.0252ZM12.4491 9.3969L12.4549 9.554L12.4491 9.32817V9.3969ZM8.7925 10.068L8.8207 10.0844C8.8207 10.0844 8.77182 10.1596 8.7737 10.1531C8.77746 10.1433 8.7925 10.068 8.7925 10.068ZM4.69137 10.3623L4.73649 10.1791C4.73649 10.1791 4.71769 10.3067 4.71957 10.3067L4.69137 10.3623ZM-24.6097 51.7283L-24.6663 51.6891C-24.6663 51.6891 -24.5928 51.6334 -24.5947 51.64C-24.5966 51.6465 -24.6097 51.7283 -24.6097 51.7283ZM-4.94004 9.39719L-5.04371 9.52156L-4.96643 9.40373C-4.96643 9.40046 -4.94004 9.39719 -4.94004 9.39719ZM-17.6737 10.1855C-17.9093 10.1005 -18.1449 10.0121 -18.3843 9.92044C-18.3881 9.91717 -18.356 9.95317 -18.3598 9.94663C-18.1562 9.78625 -17.947 9.62915 -17.7397 9.47533L-17.751 9.46224C-17.7416 9.73061 -17.7303 9.99572 -17.7209 10.2641C-17.7227 10.2641 -17.6737 10.1855 -17.6737 10.1855ZM44.6867 51.7578L44.7281 52L44.6037 51.9673L44.6867 51.7578ZM36.6614 9.46896L36.7312 9.35768C36.7312 9.35768 36.6859 9.46896 36.6878 9.46896C36.6897 9.46569 36.6614 9.46896 36.6614 9.46896ZM30.2926 8.78175L30.2379 8.96503C30.2379 8.96503 30.334 8.87339 30.3322 8.87011C30.3322 8.86684 30.2926 8.78175 30.2926 8.78175ZM26.1497 9.59345C26.0008 9.2498 25.8519 8.90615 25.703 8.56249L25.686 8.48395C25.8312 8.87669 25.9763 9.27271 26.1214 9.66873C26.1195 9.672 26.1497 9.59345 26.1497 9.59345ZM12.4491 9.32822L12.5018 9.29549C12.5018 9.29549 12.4472 9.40677 12.4491 9.40022C12.4491 9.39695 12.4491 9.32822 12.4491 9.32822ZM8.2667 8.45095L8.23662 8.64077C8.23662 8.64077 8.23098 8.50986 8.22722 8.51313C8.22534 8.51313 8.2667 8.45095 8.2667 8.45095ZM6.61388 8.80449L6.53283 8.74557C6.53283 8.74557 6.65534 8.76848 6.65723 8.76848C6.65911 8.77176 6.61388 8.80449 6.61388 8.80449ZM-17.7416 9.47551L-17.6869 9.35768L-17.7529 9.46242L-17.7416 9.47551ZM30.6996 7.82932C30.562 8.14679 30.4263 8.46098 30.2906 8.78172C30.2924 8.785 30.332 8.87009 30.3339 8.87336C30.4715 8.55262 30.6072 8.22861 30.7429 7.9046L30.6996 7.82932ZM25.7029 8.56249L25.6257 8.51667C25.6257 8.51667 25.6916 8.49376 25.6879 8.48722C25.686 8.48395 25.7029 8.56249 25.7029 8.56249ZM24.3459 7.71805C24.3497 7.69187 24.3534 7.66241 24.3591 7.63623L24.3459 7.71805ZM22.514 7.81313L22.465 7.93096L22.5329 7.84259L22.514 7.81313ZM-2.19582 8.73935L-2.22778 8.60516C-2.22778 8.60516 -2.2353 8.79826 -2.23718 8.80153C-2.23906 8.80481 -2.19582 8.73935 -2.19582 8.73935ZM43.9197 7.13217C43.882 7.15508 43.8443 7.18126 43.8066 7.20417C43.8537 7.19763 43.9008 7.19435 43.9479 7.18781C43.9479 7.18453 43.9197 7.13217 43.9197 7.13217ZM30.7411 7.90451L30.7693 7.78013L30.6996 7.82923L30.7411 7.90451ZM24.3573 7.6394L24.4138 7.67868C24.4138 7.67868 24.3403 7.73432 24.3422 7.72777C24.346 7.71795 24.3573 7.6394 24.3573 7.6394ZM20.1221 7.0768L20.0486 7.26335L20.1504 7.10952L20.1221 7.0768ZM17.3872 6.79819L17.3778 7.0142C17.3778 7.0142 17.3553 6.86365 17.3515 6.86692C17.3496 6.86365 17.3872 6.79819 17.3872 6.79819ZM-15.0012 7.07642L-15.2048 7.10588L-15.4102 7.07315L-15.4592 7.1026C-15.2915 7.1026 -15.1237 7.1026 -14.956 7.1026L-15.0012 7.07642ZM44.8621 6.28797L44.9714 6.4058L44.9036 6.21924L44.8621 6.28797ZM44.4417 6.13055C44.2683 6.46438 44.0949 6.79495 43.9196 7.13205C43.9196 7.13205 43.9478 7.18769 43.9478 7.19096C44.1212 6.8604 44.2947 6.52657 44.4681 6.19274C44.4681 6.18946 44.4417 6.13055 44.4417 6.13055ZM33.4874 6.27478L33.4158 6.3566L33.4666 6.24859L33.4874 6.27478ZM25.7314 6.31729L25.6371 6.36966L25.7031 6.37293L25.7314 6.31729ZM20.6216 6.35648C20.4557 6.5954 20.2898 6.83432 20.124 7.07652L20.1522 7.11252C20.3181 6.88014 20.4859 6.65104 20.6536 6.41867L20.6216 6.35648ZM19.4473 6.16974C19.3964 6.17301 19.3455 6.17956 19.2946 6.18283C19.3342 6.20902 19.3738 6.23847 19.4134 6.26465L19.4473 6.16974ZM11.2316 6.6871L11.3485 6.6151L11.3334 6.8082L11.2316 6.6871ZM-9.48051 6.26813L-9.54648 6.3205L-9.50501 6.25177L-9.48051 6.26813ZM-15.005 6.27127C-14.9711 6.448 -14.9221 6.62146 -14.9089 6.80147C-14.9032 6.88657 -14.9673 6.98476 -15.0012 7.0764L-14.956 7.10258C-14.956 6.81456 -14.956 6.52328 -14.9579 6.23527L-15.005 6.27127ZM-16.1473 6.53626C-15.9004 6.45771 -15.6516 6.37588 -15.4047 6.29733L-15.4613 6.2286C-15.4613 6.51989 -15.4613 6.81117 -15.4594 7.10246L-15.4104 7.07301C-15.6441 6.893 -15.8759 6.71299 -16.1153 6.53953C-16.1191 6.5428 -16.1473 6.53626 -16.1473 6.53626ZM46.711 6.28102C46.7355 6.17301 46.7487 6.04864 46.7902 5.96355C46.8109 5.921 46.8825 5.95045 46.9296 5.94391C46.8429 6.03228 46.7581 6.12064 46.6714 6.20574C46.6714 6.20901 46.711 6.28102 46.711 6.28102ZM33.4666 6.24844C33.5043 6.23208 33.5401 6.21244 33.5778 6.19608C33.5477 6.22226 33.5175 6.24844 33.4874 6.27463L33.4666 6.24844ZM25.703 6.37307L25.7443 6.21924C25.7443 6.21924 25.7293 6.31743 25.7312 6.31743L25.703 6.37307ZM20.6519 6.41544C20.8517 6.11433 21.0534 5.81323 21.2551 5.51212C21.257 5.51212 21.2136 5.46958 21.2155 5.46958C21.0195 5.76414 20.8197 6.05869 20.6218 6.35325C20.6218 6.35652 20.6519 6.41544 20.6519 6.41544ZM19.4136 6.26464L19.3458 6.1599C19.3458 6.1599 19.4419 6.18282 19.4438 6.17627C19.4475 6.16972 19.4136 6.26464 19.4136 6.26464ZM-9.50485 6.25177L-9.45019 6.11104C-9.45019 6.11104 -9.48411 6.27141 -9.48223 6.27141C-9.48034 6.26813 -9.50485 6.25177 -9.50485 6.25177ZM43.1601 5.08669L43.3109 4.97869L43.3014 5.23397L43.1601 5.08669ZM40.3631 5.6363L40.3856 5.42357C40.3856 5.42357 40.3988 5.57085 40.4007 5.56757C40.4026 5.56757 40.3631 5.6363 40.3631 5.6363ZM-19.193 4.67073C-19.193 4.67073 -19.1573 4.71982 -19.1554 4.71982L-19.193 4.67073ZM-22.3291 4.70034C-22.0897 4.78543 -21.8503 4.86725 -21.611 4.95235C-21.611 4.95235 -21.6279 4.97199 -21.626 4.97199C-21.8729 4.88035 -22.1217 4.78871 -22.3686 4.69707L-22.3291 4.70034ZM38.4254 3.85268C38.4254 3.85268 38.4648 3.92468 38.4667 3.92796C38.4667 3.92468 38.4254 3.85268 38.4254 3.85268ZM32.0794 3.98691L32.1548 4.02945C32.1548 4.02945 32.0963 4.05564 32.0982 4.06218C32.102 4.06873 32.0794 3.98691 32.0794 3.98691ZM9.59179 3.8952C9.56164 3.94102 9.53148 3.98357 9.49944 4.02939C9.5409 3.99338 9.58426 3.96066 9.62761 3.92793C9.62949 3.92793 9.59179 3.8952 9.59179 3.8952ZM1.3477 4.33066L1.20823 4.41576L1.22519 4.18666L1.3477 4.33066ZM-1.55864 4.14065C-1.55864 4.14065 -1.56438 4.18647 -1.5663 4.18319L-1.55864 4.14065ZM-3.3909 4.13414C-3.62461 4.31088 -3.86021 4.48434 -4.09581 4.6578C-4.0977 4.6578 -4.06 4.71671 -4.06 4.71671C-3.84891 4.54325 -3.63592 4.37306 -3.42483 4.20287L-3.3909 4.13414ZM-13.5706 4.67437C-13.5404 4.64492 -13.5122 4.61546 -13.482 4.586C-13.499 4.61546 -13.5178 4.64492 -13.531 4.67437C-13.5291 4.6711 -13.5706 4.67437 -13.5706 4.67437ZM-17.1875 3.86244C-17.2214 4.15045 -17.2553 4.43847 -17.2892 4.72321L-17.244 4.64466C-17.4118 4.64138 -17.5814 4.63811 -17.7491 4.63811L-17.7039 4.71666C-17.702 4.42864 -17.702 4.13736 -17.7001 3.84935L-17.7397 3.91481C-17.5701 3.91153 -17.4004 3.90826 -17.2327 3.90499L-17.1875 3.86244ZM-18.6444 3.79715C-18.8272 4.08844 -19.0081 4.37972 -19.191 4.67101C-19.1928 4.67101 -19.1533 4.7201 -19.1551 4.7201C-18.978 4.42881 -18.8008 4.13753 -18.6236 3.84297L-18.6444 3.79715ZM-22.3688 4.6969L-22.3896 4.63471C-22.3896 4.63471 -22.3236 4.70672 -22.3255 4.70345C-22.3293 4.70017 -22.3688 4.6969 -22.3688 4.6969ZM50.409 4.07508C50.5862 3.76743 50.7652 3.45978 50.9443 3.14886C50.9462 3.14886 50.9009 3.08667 50.9009 3.08667C50.7256 3.38778 50.5485 3.68888 50.3713 3.98999C50.3732 3.99653 50.409 4.07508 50.409 4.07508ZM46.5339 3.39463L46.566 3.60737L46.4567 3.56809L46.5339 3.39463ZM39.0964 3.33545C38.8721 3.50891 38.6497 3.6791 38.4254 3.85256C38.4254 3.85256 38.4668 3.92784 38.4649 3.92457C38.6836 3.74783 38.9041 3.5711 39.1227 3.39436L39.0964 3.33545ZM10.2591 3.08017C10.0386 3.35182 9.81619 3.62347 9.59378 3.89511C9.5919 3.89511 9.62959 3.92784 9.62771 3.92457C9.82184 3.6431 10.0179 3.36491 10.2139 3.08671L10.2591 3.08017ZM7.56926 3.4337C7.43921 3.23733 7.31105 3.04423 7.181 2.85113L7.16215 2.82822C7.30728 3.02459 7.4524 3.21769 7.59753 3.41406L7.56926 3.4337ZM6.28018 2.8643L6.30086 3.01812L6.30274 2.84139L6.28018 2.8643ZM-1.88679 3.39107C-1.77747 3.63981 -1.67004 3.88855 -1.56072 4.13729C-1.56072 4.13729 -1.56826 4.17984 -1.56637 4.18311C-1.66438 3.89837 -1.76428 3.61363 -1.86417 3.32561L-1.88679 3.39107ZM-3.42466 4.20304L-3.46613 3.96739C-3.46613 3.96739 -3.39451 4.1343 -3.39262 4.1343C-3.39074 4.1343 -3.42466 4.20304 -3.42466 4.20304ZM-17.2308 3.90502L-17.2083 3.78065C-17.2083 3.78065 -17.1951 3.87229 -17.1914 3.86902C-17.1876 3.86247 -17.2308 3.90502 -17.2308 3.90502ZM40.7853 2.19651L40.7967 2.34052L40.791 2.12123L40.7853 2.19651ZM39.1246 3.39435C39.1115 3.36816 39.0983 3.34525 39.0908 3.32561C39.0964 3.33543 39.1246 3.39435 39.1246 3.39435ZM10.2138 3.08679C10.2477 3.05079 10.2797 3.01479 10.3137 2.97879C10.2929 3.01479 10.2722 3.04752 10.2552 3.08352C10.259 3.08025 10.2138 3.08679 10.2138 3.08679ZM6.30279 2.84141C6.58928 2.83486 6.87388 2.83159 7.16037 2.82504C7.16226 2.82504 7.17922 2.84795 7.18111 2.84795C6.88142 2.85123 6.58363 2.85777 6.28206 2.86105C6.28017 2.86432 6.30279 2.84141 6.30279 2.84141ZM4.12597 2.16724L4.11845 2.35052L4.16356 2.24579L4.12597 2.16724ZM-1.86407 3.32558C-1.80187 3.04411 -1.73968 2.76265 -1.67748 2.48118L-1.6379 2.42554C-1.71706 2.74301 -1.7981 3.05721 -1.88103 3.38122C-1.88669 3.39104 -1.86407 3.32558 -1.86407 3.32558ZM52.2241 2.26867C52.0601 2.2654 51.8942 2.2654 51.7284 2.26212L51.7642 2.33086C51.9131 2.06903 52.062 1.81047 52.2109 1.54864L52.1807 1.49627C52.1807 1.77447 52.1807 2.05593 52.1807 2.33413C52.1826 2.33413 52.2241 2.26867 52.2241 2.26867ZM40.7908 2.12133L40.8398 2.11806C40.8398 2.11806 40.7833 2.21297 40.7852 2.20642C40.7852 2.19661 40.7908 2.12133 40.7908 2.12133ZM37.0664 1.57782L37.0137 1.70547L37.0947 1.63346C37.0966 1.63346 37.0664 1.57782 37.0664 1.57782ZM18.8781 1.5193L18.7669 1.5913L18.8517 1.50294L18.8781 1.5193ZM4.16365 2.24571C4.21266 2.17698 4.26166 2.10825 4.31255 2.03952C4.25224 2.08534 4.19193 2.13116 4.12973 2.17371C4.12596 2.16717 4.16365 2.24571 4.16365 2.24571ZM-1.67731 2.48134L-1.63031 2.31115C-1.63031 2.31115 -1.64347 2.42897 -1.64159 2.42897C-1.63971 2.4257 -1.67731 2.48134 -1.67731 2.48134ZM-8.90958 1.55529L-9.03964 1.60439L-8.95105 1.63384L-8.90958 1.55529ZM-10.325 2.59266L-10.3344 2.36684C-10.3344 2.36684 -10.2987 2.51739 -10.2968 2.52066L-10.325 2.59266ZM52.2127 1.54868C52.3918 1.26721 52.5727 0.985743 52.7518 0.704276L52.7951 0.635547C52.5916 0.923559 52.388 1.21157 52.1826 1.49959C52.1826 1.49631 52.2127 1.54868 52.2127 1.54868ZM37.6018 0.566529C37.4246 0.903635 37.2456 1.24074 37.0665 1.57785C37.0665 1.57785 37.0948 1.63348 37.0948 1.63676C37.272 1.30292 37.451 0.96582 37.6282 0.628714C37.6301 0.625441 37.6018 0.566529 37.6018 0.566529ZM32.5299 0.543681L32.5242 0.726963C32.5242 0.726963 32.5204 0.632048 32.5186 0.628775C32.5167 0.625502 32.5299 0.543681 32.5299 0.543681ZM18.8519 1.50299C18.8934 1.47353 18.9367 1.44735 18.9782 1.41789C18.9443 1.4539 18.9103 1.48662 18.8764 1.51935C18.8783 1.51935 18.8519 1.50299 18.8519 1.50299ZM16.3619 1.01506L16.394 1.23107L16.2847 1.19507L16.3619 1.01506ZM-8.95092 1.6337L-8.96408 1.4766C-8.96408 1.4766 -8.9152 1.56169 -8.91332 1.55842C-8.90956 1.55515 -8.95092 1.6337 -8.95092 1.6337ZM52.7517 0.704144L52.7121 0.592867C52.7121 0.592867 52.7875 0.648507 52.7913 0.641961C52.7951 0.632143 52.7517 0.704144 52.7517 0.704144ZM21.3678 0.154484C21.6279 0.0759347 21.888 -0.00588749 22.1481 -0.0844364L22.1896 -0.162985C21.9238 -0.0484349 21.66 0.0661149 21.3923 0.180665C21.3923 0.183938 21.3678 0.154484 21.3678 0.154484ZM14.6676 -0.0322512C14.6299 -0.00279533 14.5941 0.0266618 14.5564 0.0593905C14.6016 0.0397532 14.6469 0.0233874 14.6921 0.00375013C14.694 0.00375013 14.6676 -0.0322512 14.6676 -0.0322512ZM43.4051 -0.510279L43.5013 -0.588828L43.3863 -0.559371L43.4051 -0.510279ZM35.7341 -0.843764C35.7511 -0.578661 35.7699 -0.316831 35.7888 -0.0517281C35.7906 -0.0517281 35.7737 -0.0255463 35.7737 -0.0255463C35.7718 -0.320105 35.7718 -0.614662 35.7699 -0.912494L35.7341 -0.843764ZM32.5827 -0.0878285C32.5752 -0.336567 32.5676 -0.582032 32.5601 -0.83077L32.53 -0.909319C32.5319 -0.614761 32.5319 -0.320204 32.5338 -0.0256454L32.5827 -0.0878285ZM24.9153 -0.513453L25.0491 -0.592002L25.0322 -0.375992L24.9153 -0.513453ZM22.1485 -0.0847841L22.0938 -0.235336C22.0938 -0.235336 22.1843 -0.153514 22.1862 -0.156787C22.19 -0.163332 22.1485 -0.0847841 22.1485 -0.0847841ZM15.1368 -0.798259C14.9804 -0.542975 14.8258 -0.28769 14.6694 -0.0324061L14.6939 0.00359521C14.8503 -0.245143 15.0049 -0.497153 15.1613 -0.749165L15.1368 -0.798259ZM-7.6429 -0.840666L-7.51473 -0.742479L-7.59389 -0.922488L-7.6429 -0.840666ZM-8.37772 -1.17123C-8.37396 -1.1745 -8.3702 -1.17777 -8.36268 -1.17777C-8.35704 -1.17777 -8.37772 -1.17123 -8.37772 -1.17123ZM-24.4628 -0.912712C-24.5174 -0.951986 -24.5702 -0.99126 -24.6249 -1.03053C-24.5872 -0.978169 -24.5495 -0.925803 -24.5118 -0.873437L-24.4628 -0.912712ZM58.7096 -1.7307L58.5682 -1.68488H58.6662L58.7096 -1.7307ZM54.9721 -1.88127L54.9947 -1.66199L55.0135 -1.80926L54.9721 -1.88127ZM43.3861 -0.559041C43.3861 -1.03361 43.3842 -1.5049 43.3823 -1.97947C43.3823 -1.98274 43.4011 -2.02856 43.3993 -2.03183C43.4011 -1.52781 43.403 -1.02052 43.4049 -0.509949L43.3861 -0.559041ZM35.2929 -0.879971C35.4022 -1.07962 35.5097 -1.27926 35.619 -1.47891C35.6567 -1.26617 35.6962 -1.05343 35.7339 -0.840696L35.7679 -0.909426C35.6133 -0.893061 35.4588 -0.876698 35.3023 -0.860334C35.3042 -0.863606 35.2929 -0.879971 35.2929 -0.879971ZM33.4854 -1.67518C33.6343 -1.65555 33.7851 -1.64245 33.934 -1.63591L33.8963 -1.70791C33.7455 -1.43626 33.5947 -1.16461 33.4439 -0.896239L33.4854 -0.843874C33.4873 -1.13189 33.4873 -1.42317 33.4892 -1.71118L33.4854 -1.67518ZM32.5599 -0.834152C32.7031 -1.11562 32.8483 -1.40036 32.9915 -1.68183L32.984 -1.70801C32.9859 -1.41672 32.9859 -1.12544 32.9877 -0.837427L33.0367 -0.906156C32.8671 -0.909429 32.6975 -0.912701 32.5278 -0.915974L32.5599 -0.834152ZM15.6627 -1.80606C15.4874 -1.47223 15.3121 -1.13512 15.1368 -0.798019L15.1613 -0.745652C15.3366 -1.07948 15.5119 -1.41332 15.6872 -1.74715C15.6872 -1.7537 15.6627 -1.80606 15.6627 -1.80606ZM9.77849 -0.595277L9.75781 -0.821106C9.75781 -0.821106 9.78037 -0.677099 9.78225 -0.673826C9.78413 -0.670553 9.77849 -0.595277 9.77849 -0.595277ZM-3.55291 -1.68834C-3.50202 -1.32177 -3.45113 -0.955214 -3.39836 -0.58538C-3.39647 -0.58538 -3.41532 -0.526468 -3.41532 -0.526468C-3.46621 -0.902848 -3.51899 -1.27923 -3.56988 -1.65888L-3.55291 -1.68834ZM-7.59363 -0.922556C-7.85374 -1.00438 -8.11384 -1.0862 -8.37583 -1.1713C-8.37771 -1.1713 -8.35886 -1.17784 -8.36263 -1.17784C-8.16285 -1.41349 -7.9574 -1.65241 -7.75761 -1.8946C-7.76138 -1.90114 -7.78777 -1.97642 -7.79154 -1.98297C-7.74442 -1.60659 -7.69541 -1.22366 -7.64641 -0.844007C-7.64264 -0.840734 -7.59363 -0.922556 -7.59363 -0.922556ZM-24.5099 -0.873316L-24.5136 -1.05005C-24.5136 -1.05005 -24.4704 -0.906043 -24.4666 -0.909316C-24.4629 -0.912589 -24.5099 -0.873316 -24.5099 -0.873316ZM58.6662 -1.68495L58.6568 -1.79623C58.6568 -1.79623 58.7038 -1.71768 58.7075 -1.72095C58.7094 -1.73077 58.6662 -1.68495 58.6662 -1.68495ZM55.0137 -1.80925L54.9289 -1.80271C54.9289 -1.80271 54.976 -1.87471 54.9742 -1.87798C54.9723 -1.88126 55.0137 -1.80925 55.0137 -1.80925ZM39.8637 -2.43768C39.8411 -2.32968 39.8316 -2.20858 39.794 -2.12349C39.7751 -2.08421 39.7016 -2.12349 39.6545 -2.12349C39.7412 -2.20858 39.8279 -2.29695 39.9127 -2.38204L39.8637 -2.43768ZM33.936 -1.63252C33.9944 -1.80926 34.0529 -1.98599 34.1113 -2.16273C34.0416 -2.0089 33.9699 -1.85508 33.9002 -1.70453C33.8983 -1.70453 33.936 -1.63252 33.936 -1.63252ZM32.9916 -1.68183C33.1555 -1.67855 33.3214 -1.67528 33.4854 -1.67201L33.4929 -1.70474C33.3233 -1.70474 33.1537 -1.70474 32.984 -1.70801L32.9916 -1.68183ZM27.0658 -1.71127C27.0507 -1.77345 27.0337 -1.83891 27.0187 -1.9011C27.0375 -1.85528 27.0545 -1.80946 27.0733 -1.76691L27.0658 -1.71127ZM-3.56975 -1.65876L-3.63948 -1.79623L-3.55278 -1.68822L-3.56975 -1.65876ZM39.9123 -2.38199L39.886 -2.52273L39.8615 -2.43763C39.8634 -2.43763 39.9123 -2.38199 39.9123 -2.38199ZM14.8487 -3.2854C14.6489 -3.01375 14.4491 -2.74538 14.2494 -2.47373L14.2814 -2.41809C14.4548 -2.69301 14.6282 -2.96793 14.8016 -3.24613L14.8487 -3.2854ZM8.42311 -2.52638C8.42311 -2.52638 8.37423 -2.51001 8.37611 -2.51328C8.37799 -2.51328 8.42311 -2.52638 8.42311 -2.52638ZM17.2424 -3.51461L17.201 -3.74044L17.3178 -3.71098L17.2424 -3.51461ZM14.8013 -3.24292L14.8126 -3.37711C14.8126 -3.37711 14.8427 -3.27565 14.8465 -3.27892C14.8483 -3.28547 14.8013 -3.24292 14.8013 -3.24292ZM12.374 -4.15276C12.3928 -4.09385 12.4117 -4.03494 12.4324 -3.97603C12.4286 -4.05785 12.4249 -4.13967 12.4211 -4.22149L12.374 -4.15276ZM44.5795 -4.56181C44.5343 -4.61745 44.4891 -4.67309 44.4438 -4.72872C44.4834 -4.65345 44.523 -4.58144 44.5607 -4.50617L44.5795 -4.56181ZM26.6059 -4.10372C26.6455 -4.11354 26.685 -4.12336 26.7246 -4.13645C26.6907 -4.11354 26.6568 -4.09063 26.6228 -4.06772L26.6059 -4.10372ZM23.4186 -3.92387C23.4186 -3.92387 23.4074 -3.99587 23.4093 -3.9926C23.4112 -3.9926 23.4186 -3.92387 23.4186 -3.92387ZM20.8327 -4.17887L20.7083 -4.15924C20.7083 -4.15924 20.7875 -4.20833 20.7894 -4.2116C20.7913 -4.21488 20.8327 -4.17887 20.8327 -4.17887ZM14.0661 -4.54547L14.1 -4.34583L13.9945 -4.37856L14.0661 -4.54547ZM12.4189 -4.22466L12.4698 -4.15593C12.4698 -4.15593 12.3699 -4.14612 12.3718 -4.14939C12.3737 -4.15266 12.4189 -4.22466 12.4189 -4.22466ZM1.71714 -4.63686L1.77934 -4.34557L1.62102 -4.37503L1.71714 -4.63686ZM-2.53484 -4.05475L-2.58196 -4.20531C-2.58196 -4.20531 -2.49715 -4.11694 -2.49338 -4.12349C-2.49149 -4.13003 -2.53484 -4.05475 -2.53484 -4.05475ZM44.581 -5.93643C44.5791 -5.47823 44.5791 -5.02003 44.5791 -4.56183C44.581 -4.56183 44.5603 -4.50619 44.5622 -4.50619C44.5622 -4.99712 44.5603 -5.49132 44.5603 -5.9888C44.5622 -5.9888 44.581 -5.93643 44.581 -5.93643ZM43.4428 -5.62229C43.4202 -5.57975 43.3976 -5.5372 43.3731 -5.49465C43.3825 -5.53065 43.3919 -5.56338 43.3976 -5.59284C43.3957 -5.59284 43.4428 -5.62229 43.4428 -5.62229ZM41.9879 -5.8679L41.9464 -5.66498L42.0274 -5.81226L41.9879 -5.8679ZM37.0685 -5.62547C37.0346 -5.58947 37.0025 -5.55346 36.9705 -5.51419C36.9912 -5.55019 37.0119 -5.58619 37.027 -5.61892C37.0233 -5.61892 37.0685 -5.62547 37.0685 -5.62547ZM32.6825 -5.82188C32.8012 -5.66805 32.9332 -5.60587 33.0783 -5.64187L33.1254 -5.67787L32.935 -5.87424L32.7258 -5.79569L32.6825 -5.82188ZM10.1346 -5.65168C9.98001 -5.38658 9.82734 -5.12475 9.67279 -4.85965L9.72368 -4.79419C9.72368 -5.08875 9.72368 -5.38003 9.72179 -5.67132L9.68033 -5.59604C9.84619 -5.59604 10.0121 -5.59932 10.1798 -5.59932L10.1346 -5.65168ZM-7.81229 -5.7205L-7.80853 -5.52413L-7.76717 -5.69105L-7.81229 -5.7205ZM48.1774 -6.43051C48.1397 -6.46978 48.1001 -6.50578 48.0624 -6.54506C48.0869 -6.50905 48.1133 -6.47305 48.1378 -6.43705L48.1774 -6.43051ZM42.0274 -5.81207C42.0971 -5.8448 42.165 -5.87753 42.2347 -5.91026C42.1556 -5.89062 42.0745 -5.87426 41.9916 -5.86117C41.9878 -5.86771 42.0274 -5.81207 42.0274 -5.81207ZM38.5707 -5.3669L38.5538 -5.58945C38.5538 -5.58945 38.5933 -5.44872 38.5951 -5.44872C38.597 -5.44544 38.5707 -5.3669 38.5707 -5.3669ZM33.0781 -5.6451L33.0818 -5.7662C33.0818 -5.7662 33.1157 -5.67128 33.1194 -5.67456C33.1251 -5.67783 33.0781 -5.6451 33.0781 -5.6451ZM32.7258 -5.79584L32.5919 -5.72711C32.5919 -5.72711 32.6786 -5.81548 32.6805 -5.81875C32.6824 -5.82202 32.7258 -5.79584 32.7258 -5.79584ZM13.0561 -6.51251C13.0015 -6.51905 12.9468 -6.52233 12.8903 -6.52887C12.9317 -6.49614 12.9732 -6.46014 13.0166 -6.42741L13.0561 -6.51251ZM10.1629 -6.52237C10.1535 -6.23108 10.1441 -5.94307 10.1347 -5.65178L10.1779 -5.59942C10.1798 -5.88743 10.1817 -6.17544 10.1836 -6.46673L10.1629 -6.52237ZM9.25242 -5.58619C9.40132 -5.90038 9.54834 -6.21785 9.69723 -6.53205L9.67462 -6.46659C9.6765 -6.1753 9.67839 -5.88729 9.68027 -5.59601L9.72362 -5.67128C9.55399 -5.67128 9.38624 -5.67455 9.21661 -5.67455L9.25242 -5.58619ZM-7.76707 -5.69115C-7.52393 -5.81552 -7.2808 -5.94316 -7.03954 -6.06753L-7.03389 -6.08717C-7.2921 -5.9628 -7.54844 -5.8417 -7.80854 -5.7206C-7.81231 -5.7206 -7.76707 -5.69115 -7.76707 -5.69115ZM48.1378 -6.43733C48.1755 -6.46679 48.2113 -6.49624 48.249 -6.5257C48.2226 -6.49297 48.1981 -6.46024 48.1736 -6.43079C48.1773 -6.43079 48.1378 -6.43733 48.1378 -6.43733ZM30.6377 -7.24205L30.6829 -7.12095C30.6829 -7.12095 30.6038 -7.17004 30.6019 -7.1635C30.6 -7.15695 30.6377 -7.24205 30.6377 -7.24205ZM13.0165 -6.4276L12.9619 -6.57488C12.9619 -6.57488 13.0505 -6.49961 13.0523 -6.50615C13.0561 -6.5127 13.0165 -6.4276 13.0165 -6.4276ZM9.69749 -6.53205C9.85393 -6.5255 10.0085 -6.52223 10.1649 -6.51896C10.1649 -6.52223 10.1857 -6.46659 10.1857 -6.46659C10.016 -6.46659 9.84639 -6.46659 9.67675 -6.46659L9.69749 -6.53205ZM-7.0398 -6.06756C-7.03788 -6.5814 -7.03597 -7.09524 -7.03214 -7.61563C-7.03023 -7.62217 -7.03789 -7.56654 -7.03406 -7.57635C-7.03214 -7.0887 -7.03406 -6.59122 -7.03597 -6.09047C-7.03406 -6.0872 -7.0398 -6.06756 -7.0398 -6.06756ZM28.8017 -8.16837L28.8149 -7.99163L28.8525 -8.23383L28.8017 -8.16837ZM24.1312 -7.5435C24.363 -7.44859 24.5949 -7.35367 24.8286 -7.25876C24.8305 -7.26203 24.8682 -7.32422 24.8682 -7.32749C24.6194 -7.39949 24.3706 -7.46822 24.1199 -7.53695L24.1312 -7.5435ZM17.4779 -7.97237C17.4421 -7.96255 17.4044 -7.95273 17.3686 -7.94619C17.4006 -7.96582 17.4308 -7.98873 17.4628 -8.00837C17.4591 -8.0051 17.4779 -7.97237 17.4779 -7.97237ZM15.855 -7.42259L15.806 -7.64187L15.9304 -7.61568L15.855 -7.42259ZM55.9523 -8.71171C55.9222 -8.6528 55.8939 -8.59716 55.8637 -8.53825C55.9128 -8.57097 55.9618 -8.6037 56.0089 -8.63971C56.007 -8.64298 55.9523 -8.71171 55.9523 -8.71171ZM28.8526 -8.23383L28.8978 -8.13237C28.8978 -8.13237 28.7979 -8.15855 28.7998 -8.16182C28.8017 -8.16837 28.8526 -8.23383 28.8526 -8.23383ZM-2.08459 -7.96249L-2.07895 -8.11959C-2.07895 -8.11959 -2.04323 -8.00177 -2.03947 -8.00831C-2.03383 -8.01486 -2.08459 -7.96249 -2.08459 -7.96249ZM-20.4615 -8.14561L-20.4371 -8.12925C-20.4371 -8.12925 -20.4916 -8.06052 -20.4897 -8.06706C-20.4859 -8.07361 -20.4615 -8.14561 -20.4615 -8.14561ZM58.1008 -9.4875L58.1724 -9.40568L58.1461 -9.57259L58.1008 -9.4875ZM55.7128 -9.22273C55.9823 -9.17037 56.2519 -9.12127 56.5233 -9.06891C56.5252 -9.06891 56.5384 -9.05909 56.5384 -9.05582C56.3405 -8.94127 56.1426 -8.82999 55.9484 -8.71216C55.9503 -8.70889 56.005 -8.64016 56.0087 -8.63689C55.9088 -8.83981 55.8052 -9.04273 55.7034 -9.25219C55.7034 -9.25546 55.7128 -9.22273 55.7128 -9.22273ZM45.7685 -9.55308C45.7685 -9.55308 45.808 -9.4778 45.808 -9.48108C45.808 -9.48435 45.7685 -9.55308 45.7685 -9.55308ZM36.1108 -9.6186L36.1692 -9.52042C36.1692 -9.52042 36.0807 -9.53351 36.0807 -9.52696C36.0788 -9.52042 36.1108 -9.6186 36.1108 -9.6186ZM30.9393 -9.89015C31.0015 -9.41231 31.0618 -8.93447 31.124 -8.45336C31.124 -8.45008 31.0957 -8.51227 31.0938 -8.509C31.0542 -8.97047 31.0146 -9.43849 30.9732 -9.90324C30.9694 -9.89997 30.9393 -9.89015 30.9393 -9.89015ZM30.2172 -9.62812L30.1833 -9.48085L30.2643 -9.5463L30.2172 -9.62812ZM3.46061 -9.25496C3.42669 -9.29423 3.39276 -9.33023 3.36072 -9.36951C3.38899 -9.32042 3.41915 -9.27132 3.44742 -9.21896L3.46061 -9.25496ZM-24.9812 -8.60038L-25 -8.79675C-25 -8.79675 -24.9812 -8.68547 -24.9812 -8.6822C-24.9793 -8.67893 -24.9812 -8.60038 -24.9812 -8.60038ZM57.6485 -9.62808C57.7992 -9.91936 57.95 -10.2106 58.0989 -10.5019L58.0593 -10.5412C58.0725 -10.191 58.0857 -9.84081 58.0989 -9.49062C58.0989 -9.49062 58.146 -9.57244 58.1442 -9.57244C57.9651 -9.61498 57.7842 -9.66081 57.6032 -9.7099C57.6051 -9.7099 57.6485 -9.62808 57.6485 -9.62808ZM46.1776 -10.4433C46.0419 -10.1487 45.9062 -9.85415 45.7705 -9.55632C45.7705 -9.55632 45.8101 -9.48432 45.8101 -9.48104C45.9439 -9.82142 46.0796 -10.1618 46.2134 -10.5022L46.1776 -10.4433ZM30.4376 -10.7671C30.6016 -10.4693 30.7656 -10.1747 30.9352 -9.88342C30.9408 -9.88997 30.9691 -9.89979 30.9729 -9.90306C30.7241 -9.81142 30.4715 -9.71978 30.219 -9.62814L30.2661 -9.54959C30.3264 -9.96852 30.3848 -10.3907 30.447 -10.8195C30.4489 -10.826 30.4376 -10.7671 30.4376 -10.7671ZM29.333 -10.4138L29.3688 -10.3451C29.3688 -10.3418 29.333 -10.4138 29.333 -10.4138ZM16.4769 -9.72654C16.6748 -9.86072 16.8746 -9.99818 17.0725 -10.1324L17.0838 -10.2044C17.048 -9.98509 17.0084 -9.76581 16.9669 -9.54653C16.9669 -9.54653 17.014 -9.6218 17.014 -9.61853C16.8218 -9.67417 16.6314 -9.73308 16.4373 -9.79199C16.4373 -9.80181 16.4769 -9.72654 16.4769 -9.72654ZM9.31456 -10.175L9.25802 -10.2601C9.25802 -10.2601 9.36357 -10.2502 9.36357 -10.247C9.3598 -10.247 9.31456 -10.175 9.31456 -10.175ZM3.44738 -9.21911C3.39649 -9.67731 3.3456 -10.1355 3.29283 -10.597L3.24948 -10.6723C3.31922 -10.201 3.38896 -9.72967 3.46058 -9.25838C3.46058 -9.25511 3.44738 -9.21911 3.44738 -9.21911ZM58.1009 -10.5022C58.1009 -10.5022 58.067 -10.5316 58.0652 -10.5382C58.0614 -10.5414 58.1009 -10.5022 58.1009 -10.5022ZM46.2134 -10.5021L46.2718 -10.5087C46.2718 -10.5087 46.1757 -10.4367 46.1776 -10.4367C46.1776 -10.4432 46.2134 -10.5021 46.2134 -10.5021ZM39.5581 -11.2942C39.5072 -11.2877 39.4564 -11.2811 39.4036 -11.2746C39.4451 -11.2484 39.4846 -11.2222 39.5261 -11.196L39.5581 -11.2942ZM17.0727 -10.1354L17.0671 -10.3515C17.0671 -10.3515 17.0802 -10.214 17.0821 -10.2107C17.084 -10.2074 17.0727 -10.1354 17.0727 -10.1354ZM3.29457 -10.5971L3.20411 -10.5087C3.20411 -10.5087 3.25688 -10.6626 3.25311 -10.6658C3.25122 -10.6724 3.29457 -10.5971 3.29457 -10.5971ZM-1.10628 -10.8752C-1.26271 -11.0225 -1.41727 -11.1698 -1.57371 -11.3171L-1.61894 -11.3629C-1.438 -11.2091 -1.25706 -11.0553 -1.07612 -10.9014L-1.10628 -10.8752ZM39.5261 -11.1959L39.4545 -11.2974C39.4545 -11.2974 39.5525 -11.281 39.5544 -11.2876C39.5581 -11.2941 39.5261 -11.1959 39.5261 -11.1959ZM-1.57173 -11.317L-1.69802 -11.2908C-1.69802 -11.2908 -1.61886 -11.3563 -1.61886 -11.3596C-1.61886 -11.3628 -1.57173 -11.317 -1.57173 -11.317ZM54.3124 -13.0909C54.3237 -13.068 54.3368 -13.0418 54.3425 -13.0254C54.3349 -13.0352 54.3124 -13.0909 54.3124 -13.0909ZM50.935 -12.4133C50.8257 -12.6163 50.7163 -12.8192 50.6051 -13.0221L50.5863 -13.045C50.7182 -12.8421 50.8502 -12.6424 50.9802 -12.4363C50.9783 -12.433 50.935 -12.4133 50.935 -12.4133ZM-6.2236 -12.7767C-6.26695 -12.816 -6.31031 -12.8585 -6.35366 -12.8978C-6.3235 -12.8585 -6.29334 -12.8192 -6.26319 -12.78L-6.2236 -12.7767ZM-8.67187 -12.3905C-8.71711 -12.325 -8.76611 -12.2072 -8.80758 -12.2105C-8.84904 -12.217 -8.88674 -12.348 -8.92443 -12.4232C-8.8792 -12.4887 -8.83019 -12.6065 -8.78873 -12.6032C-8.74915 -12.6 -8.71145 -12.4658 -8.67187 -12.3905ZM-23.7467 -12.9078L-23.7373 -12.7442L-23.6997 -12.9798L-23.7467 -12.9078ZM49.7212 -13.0418C50.0077 -13.0451 50.2961 -13.0451 50.5844 -13.0483C50.5863 -13.0483 50.6052 -13.0254 50.6052 -13.0254C50.3055 -13.0254 50.0039 -13.0222 49.7005 -13.0222C49.6986 -13.0189 49.7212 -13.0418 49.7212 -13.0418ZM48.971 -13.6833C48.9503 -13.3069 48.9277 -12.9305 48.905 -12.5509C48.9031 -12.5476 48.9371 -12.6163 48.9352 -12.6098C48.9597 -12.9436 48.9842 -13.2807 49.0106 -13.6211C49.0106 -13.6244 48.971 -13.6833 48.971 -13.6833ZM36.1676 -13.6311L36.2015 -13.4838L36.2223 -13.5787L36.1676 -13.6311ZM29.0224 -13.6048L28.8885 -13.5458L28.979 -13.536L29.0224 -13.6048ZM16.6897 -13.5L16.6371 -13.4738C16.6371 -13.4738 16.639 -13.5688 16.6427 -13.5655C16.6465 -13.5589 16.6897 -13.5 16.6897 -13.5ZM11.5028 -13.4835C11.4406 -13.369 11.3784 -13.2512 11.3162 -13.1366C11.3275 -13.2119 11.3257 -13.3264 11.352 -13.3526C11.4029 -13.4017 11.4689 -13.4017 11.5292 -13.4246L11.5028 -13.4835ZM-6.26313 -12.7768C-6.22543 -12.803 -6.18773 -12.8259 -6.14815 -12.8521C-6.17454 -12.8259 -6.20093 -12.7997 -6.22543 -12.7735C-6.22354 -12.7768 -6.26313 -12.7768 -6.26313 -12.7768ZM-16.424 -13.5329L-16.4749 -13.3987L-16.3863 -13.4707C-16.3863 -13.474 -16.424 -13.5329 -16.424 -13.5329ZM-23.6996 -12.9798L-23.6581 -12.9045C-23.6581 -12.9045 -23.7505 -12.9013 -23.7486 -12.9045C-23.7467 -12.9078 -23.6996 -12.9798 -23.6996 -12.9798ZM57.5974 -13.6935L57.6822 -13.664C57.6822 -13.664 57.5503 -13.6607 57.5484 -13.6607L57.5974 -13.6935ZM40.2781 -13.4313V-13.5786C40.2781 -13.5786 40.2913 -13.356 40.2913 -13.3528C40.2894 -13.3495 40.2781 -13.4313 40.2781 -13.4313ZM28.979 -13.5361L28.9658 -13.6539C28.9658 -13.6539 29.0186 -13.5918 29.0205 -13.595C29.0224 -13.6049 28.979 -13.5361 28.979 -13.5361ZM11.5295 -13.4246C11.6671 -13.8042 11.8028 -14.1839 11.9404 -14.5635L11.8914 -14.4948C11.7614 -14.161 11.6313 -13.8239 11.5013 -13.4868C11.5031 -13.4835 11.5295 -13.4246 11.5295 -13.4246ZM5.42069 -14.0564C5.46215 -14.0335 5.50362 -14.0073 5.54509 -13.9844C5.49797 -14.0303 5.45085 -14.0793 5.40373 -14.1252L5.42069 -14.0564ZM-15.9172 -14.4622C-16.0868 -14.1546 -16.2546 -13.8437 -16.4242 -13.5327C-16.4242 -13.5327 -16.3865 -13.4706 -16.3865 -13.4673C-16.2206 -13.824 -16.0529 -14.1808 -15.8852 -14.5375L-15.9172 -14.4622ZM32.1471 -14.1709C32.1471 -14.1709 32.1394 -14.2592 32.1414 -14.256C32.1452 -14.2527 32.1471 -14.1709 32.1471 -14.1709ZM11.94 -14.5635L11.9966 -14.4752C11.9966 -14.4752 11.8892 -14.485 11.8892 -14.4915C11.891 -14.4948 11.94 -14.5635 11.94 -14.5635ZM5.40373 -14.1219C5.48854 -14.4034 5.57524 -14.6881 5.66006 -14.9696L5.69964 -15.0514C5.60729 -14.7176 5.51682 -14.387 5.42258 -14.0532C5.42069 -14.0565 5.40373 -14.1219 5.40373 -14.1219ZM-1.24937 -14.3249C-1.19848 -14.5147 -1.14759 -14.7045 -1.0967 -14.8943C-1.16267 -14.7274 -1.22675 -14.5638 -1.29272 -14.3969C-1.29083 -14.4001 -1.24937 -14.3249 -1.24937 -14.3249ZM-13.5801 -15.1169L-13.6743 -15.0711L-13.6084 -15.0646L-13.5801 -15.1169ZM-15.8869 -14.5409L-15.8624 -14.4983C-15.8624 -14.4983 -15.9227 -14.4525 -15.9208 -14.4558C-15.9171 -14.4623 -15.8869 -14.5409 -15.8869 -14.5409ZM-23.1133 -15.1693C-23.1548 -15.2152 -23.1944 -15.2577 -23.2359 -15.3035C-23.2095 -15.2577 -23.1831 -15.2119 -23.1567 -15.1661L-23.1133 -15.1693ZM46.8354 -15.7257L46.7393 -15.6832L46.8184 -15.6504L46.8354 -15.7257ZM29.013 -15.994C28.9583 -16.03 28.9055 -16.0692 28.8509 -16.1052C28.8886 -16.0561 28.9263 -16.0038 28.964 -15.9547L29.013 -15.994ZM16.7162 -14.806L16.6692 -15.0744C16.6692 -15.0744 16.7125 -14.878 16.7181 -14.8715C16.7219 -14.865 16.7162 -14.806 16.7162 -14.806ZM5.66017 -14.9729L5.64889 -15.1693C5.64889 -15.1693 5.69401 -15.0515 5.69777 -15.0548L5.66017 -14.9729ZM-13.6083 -15.0644L-13.5631 -15.2117C-13.5631 -15.2117 -13.5838 -15.1135 -13.5819 -15.1167C-13.5801 -15.1167 -13.6083 -15.0644 -13.6083 -15.0644ZM-23.1566 -15.1659C-23.1207 -15.1986 -23.0868 -15.2346 -23.051 -15.2674C-23.0736 -15.2346 -23.0962 -15.1986 -23.1151 -15.1692C-23.1132 -15.1692 -23.1566 -15.1659 -23.1566 -15.1659ZM50.2395 -16.2689L50.1226 -16.2035L50.1433 -16.3999L50.2395 -16.2689ZM46.8185 -15.6504L46.7789 -15.8828C46.7789 -15.8828 46.8317 -15.7322 46.8336 -15.729C46.8355 -15.7257 46.8185 -15.6504 46.8185 -15.6504ZM38.6234 -16.3442L38.7798 -16.4522L38.7648 -16.1871L38.6234 -16.3442ZM28.9655 -15.9513L28.9636 -16.1281C28.9636 -16.1281 29.0069 -15.9841 29.0106 -15.9873C29.0125 -15.9939 28.9655 -15.9513 28.9655 -15.9513ZM24.6647 -17.0675L24.7118 -16.8188C24.7118 -16.8188 24.6477 -16.989 24.6458 -16.9922C24.6439 -16.9988 24.6647 -17.0675 24.6647 -17.0675ZM8.32328 -16.0561L8.22715 -16.0921C8.22715 -16.0921 8.31574 -16.1248 8.31386 -16.1314C8.31197 -16.1379 8.32328 -16.0561 8.32328 -16.0561ZM-0.475048 -16.3868C-0.437352 -16.3738 -0.399654 -16.3639 -0.361958 -16.3508C-0.407193 -16.3803 -0.450546 -16.4098 -0.495781 -16.4392L-0.475048 -16.3868ZM-2.25233 -16.6945L-2.3183 -16.557L-2.2184 -16.6389L-2.25233 -16.6945ZM-10.3287 -15.7356C-10.21 -16.0792 -10.0912 -16.4229 -9.97059 -16.7632L-10.0045 -16.8189C-10.127 -16.4883 -10.2514 -16.1545 -10.3721 -15.8207C-10.3721 -15.8174 -10.3287 -15.7356 -10.3287 -15.7356ZM58.8585 -17.3063L58.9094 -17.0608L58.7718 -17.0903L58.8585 -17.3063ZM54.1842 -17.84C54.1766 -17.3818 54.1672 -16.9236 54.1597 -16.4621C54.1597 -16.4588 54.1428 -16.4064 54.1447 -16.4032C54.1503 -16.8974 54.1578 -17.3916 54.1635 -17.889C54.1635 -17.8923 54.1842 -17.84 54.1842 -17.84ZM37.191 -16.5734C37.1797 -16.8975 37.1684 -17.2182 37.1571 -17.5422L37.1156 -17.4702C37.2721 -17.4604 37.4285 -17.4473 37.5868 -17.4375L37.6151 -17.48C37.4587 -17.2051 37.3003 -16.9302 37.1458 -16.652C37.1477 -16.6487 37.191 -16.5734 37.191 -16.5734ZM27.5145 -17.4112L27.5899 -17.4014L27.4843 -17.4767L27.5145 -17.4112ZM-0.495663 -16.4393C-0.495663 -16.904 -0.495662 -17.3688 -0.497542 -17.8335C-0.497542 -17.8335 -0.478743 -17.8859 -0.480623 -17.8859C-0.478743 -17.3884 -0.476863 -16.8876 -0.474983 -16.3869L-0.495663 -16.4393ZM-2.21829 -16.6387C-2.0562 -16.966 -1.89599 -17.29 -1.7339 -17.6173L-1.71882 -17.5747C-1.89599 -17.2834 -2.07505 -16.9921 -2.25222 -16.6976C-2.25222 -16.6943 -2.21829 -16.6387 -2.21829 -16.6387ZM-9.9726 -16.7632C-9.9726 -16.7632 -10.0046 -16.8123 -10.0046 -16.8156C-10.0064 -16.8188 -9.9726 -16.7632 -9.9726 -16.7632ZM37.5866 -17.4373L37.6488 -17.5747L37.6148 -17.4798C37.6167 -17.4798 37.5866 -17.4373 37.5866 -17.4373ZM37.1588 -17.5421C37.0872 -17.6468 37.0174 -17.7548 36.9458 -17.8595C36.9873 -17.8333 37.0476 -17.8301 37.0646 -17.781C37.0947 -17.6926 37.1004 -17.5748 37.1173 -17.4701C37.1154 -17.4701 37.1588 -17.5421 37.1588 -17.5421ZM27.4844 -17.4765L27.4825 -17.5649C27.4825 -17.5649 27.5183 -17.4078 27.5164 -17.4078C27.5145 -17.4111 27.4844 -17.4765 27.4844 -17.4765ZM-1.73392 -17.6141L-1.67549 -17.6959L-1.71884 -17.5683C-1.71696 -17.5749 -1.73392 -17.6141 -1.73392 -17.6141ZM-11.094 -18.0723L-11.0507 -17.8497L-11.1694 -17.8792L-11.094 -18.0723ZM54.1034 -18.321L54.0751 -18.4225C54.0751 -18.4225 54.1373 -18.3832 54.1411 -18.3897C54.143 -18.3963 54.1034 -18.321 54.1034 -18.321ZM51.7058 -18.2523C51.8962 -18.5469 52.0846 -18.8381 52.275 -19.1327L52.3221 -19.1556C52.1073 -18.8676 51.8905 -18.5829 51.6738 -18.2948L51.7058 -18.2523ZM49.8264 -19.1456L49.8773 -19.0376C49.8773 -19.0376 49.7944 -19.0671 49.7925 -19.0605C49.7906 -19.054 49.8264 -19.1456 49.8264 -19.1456ZM21.1044 -18.9658L21.1835 -18.9724C21.1835 -18.9724 21.1327 -18.8938 21.1364 -18.8905C21.1383 -18.884 21.1044 -18.9658 21.1044 -18.9658ZM2.84236 -18.4289L2.76885 -18.4322C2.76885 -18.4322 2.82539 -18.4944 2.82162 -18.5009C2.81974 -18.5075 2.84236 -18.4289 2.84236 -18.4289ZM52.2749 -19.1327C52.3032 -19.1753 52.3333 -19.2211 52.3616 -19.2637C52.3465 -19.2244 52.3295 -19.1851 52.3182 -19.1524C52.322 -19.1557 52.2749 -19.1327 52.2749 -19.1327ZM6.02969 -19.077L6.08058 -19.2111L6.02026 -19.1031C6.02403 -19.1031 6.02969 -19.077 6.02969 -19.077ZM-13.0259 -19.6728L-13.1748 -19.6074H-13.0372L-13.0259 -19.6728ZM21.1004 -19.8887L21.1531 -20L21.0777 -19.9084L21.1004 -19.8887ZM-13.0371 -19.6073L-13.1049 -19.8364C-13.1049 -19.8364 -13.0296 -19.6793 -13.0277 -19.6761C-13.0258 -19.6728 -13.0371 -19.6073 -13.0371 -19.6073Z" stroke="url(#paint0_linear_35_3830)" stroke-width="0.0907647"/> +</g> +<defs> +<linearGradient id="paint0_linear_35_3830" x1="17" y1="-20" x2="17" y2="52" gradientUnits="userSpaceOnUse"> +<stop stop-color="white" stop-opacity="0.1"/> +<stop offset="0.58" stop-color="white"/> +</linearGradient> +<clipPath id="clip0_35_3830"> +<rect width="32.1827" height="32" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/client/public/logoIcon.png b/client/public/logoIcon.png new file mode 100644 index 0000000..d985f75 Binary files /dev/null and b/client/public/logoIcon.png differ diff --git a/client/public/roadmap.png b/client/public/roadmap.png new file mode 100644 index 0000000..f4f469f Binary files /dev/null and b/client/public/roadmap.png differ diff --git a/client/public/roadmap.svg b/client/public/roadmap.svg new file mode 100644 index 0000000..3457410 --- /dev/null +++ b/client/public/roadmap.svg @@ -0,0 +1,37 @@ +<svg width="1313" height="613" viewBox="0 0 1313 613" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g filter="url(#filter0_d_35_4221)"> +<path d="M27 354C75 389 186.8 455 250 439C329 419 348.5 316 470.5 292C592.5 268 682 351.5 776.5 231C871 110.5 917 31.5003 1044 48.5003" stroke="#FEDD3E" stroke-width="5" stroke-linecap="round" stroke-linejoin="round"/> +</g> +<path d="M252.049 586V482.368L243.073 493.588H204.517L250.213 439.12H281.221V586H252.049Z" fill="black" fill-opacity="0.04"/> +<path d="M26.0788 473.449H28.4311L29.6136 474.97L30.777 476.325L32.9695 479.074H30.3871L28.8786 477.22L28.1051 476.121L26.0788 473.449ZM33.1676 471.455C33.1676 472.882 32.897 474.097 32.3558 475.098C31.8189 476.099 31.0859 476.864 30.157 477.393C29.2322 477.917 28.1925 478.179 27.0376 478.179C25.8743 478.179 24.8303 477.915 23.9055 477.386C22.9808 476.858 22.25 476.093 21.7131 475.092C21.1761 474.09 20.9077 472.878 20.9077 471.455C20.9077 470.027 21.1761 468.812 21.7131 467.811C22.25 466.81 22.9808 466.047 23.9055 465.523C24.8303 464.994 25.8743 464.73 27.0376 464.73C28.1925 464.73 29.2322 464.994 30.157 465.523C31.0859 466.047 31.8189 466.81 32.3558 467.811C32.897 468.812 33.1676 470.027 33.1676 471.455ZM30.3615 471.455C30.3615 470.53 30.223 469.75 29.946 469.115C29.6733 468.48 29.2876 467.999 28.7891 467.67C28.2905 467.342 27.7067 467.178 27.0376 467.178C26.3686 467.178 25.7848 467.342 25.2862 467.67C24.7876 467.999 24.3999 468.48 24.1229 469.115C23.8501 469.75 23.7138 470.53 23.7138 471.455C23.7138 472.379 23.8501 473.159 24.1229 473.794C24.3999 474.429 24.7876 474.911 25.2862 475.239C25.7848 475.567 26.3686 475.731 27.0376 475.731C27.7067 475.731 28.2905 475.567 28.7891 475.239C29.2876 474.911 29.6733 474.429 29.946 473.794C30.223 473.159 30.3615 472.379 30.3615 471.455ZM40.2965 464.909V478H37.5287V467.536H37.452L34.4541 469.415V466.961L37.6949 464.909H40.2965ZM52.6366 470.374V472.535H46.6664V470.374H52.6366ZM58.0173 478V476.006L62.6771 471.691C63.0734 471.308 63.4058 470.962 63.6743 470.656C63.947 470.349 64.1537 470.048 64.2943 469.754C64.4349 469.456 64.5053 469.134 64.5053 468.789C64.5053 468.406 64.4179 468.075 64.2432 467.798C64.0685 467.517 63.8298 467.302 63.5273 467.153C63.2247 466.999 62.8817 466.923 62.4982 466.923C62.0976 466.923 61.7482 467.004 61.4499 467.165C61.1516 467.327 60.9214 467.56 60.7595 467.862C60.5976 468.165 60.5166 468.525 60.5166 468.942H57.8895C57.8895 468.086 58.0834 467.342 58.4712 466.712C58.8589 466.081 59.4023 465.593 60.1011 465.248C60.8 464.903 61.6054 464.73 62.5173 464.73C63.4548 464.73 64.2709 464.896 64.9655 465.229C65.6643 465.557 66.2077 466.013 66.5955 466.597C66.9832 467.18 67.1771 467.849 67.1771 468.604C67.1771 469.098 67.0791 469.586 66.8831 470.067C66.6913 470.549 66.3483 471.084 65.854 471.672C65.3597 472.256 64.6629 472.957 63.7638 473.775L61.8526 475.648V475.737H67.3497V478H58.0173ZM73.948 478.288C72.8486 478.283 71.9026 478.013 71.11 477.476C70.3216 476.939 69.7144 476.161 69.2882 475.143C68.8664 474.124 68.6575 472.899 68.6618 471.467C68.6618 470.04 68.8727 468.823 69.2946 467.817C69.7208 466.812 70.328 466.047 71.1164 465.523C71.909 464.994 72.8529 464.73 73.948 464.73C75.0432 464.73 75.985 464.994 76.7733 465.523C77.5659 466.051 78.1753 466.818 78.6014 467.824C79.0276 468.825 79.2385 470.04 79.2343 471.467C79.2343 472.903 79.0212 474.131 78.595 475.149C78.1732 476.168 77.5681 476.945 76.7797 477.482C75.9914 478.019 75.0475 478.288 73.948 478.288ZM73.948 475.993C74.698 475.993 75.2968 475.616 75.7442 474.862C76.1916 474.107 76.4132 472.976 76.409 471.467C76.409 470.474 76.3067 469.648 76.1022 468.987C75.9019 468.327 75.6164 467.83 75.2456 467.498C74.8791 467.165 74.4466 466.999 73.948 466.999C73.2023 466.999 72.6057 467.372 72.1583 468.118C71.7108 468.864 71.485 469.98 71.4807 471.467C71.4807 472.473 71.5808 473.312 71.7811 473.986C71.9857 474.655 72.2733 475.158 72.6441 475.494C73.0148 475.827 73.4495 475.993 73.948 475.993ZM80.6678 478V476.006L85.3276 471.691C85.7239 471.308 86.0563 470.962 86.3248 470.656C86.5975 470.349 86.8042 470.048 86.9448 469.754C87.0854 469.456 87.1557 469.134 87.1557 468.789C87.1557 468.406 87.0684 468.075 86.8937 467.798C86.7189 467.517 86.4803 467.302 86.1777 467.153C85.8752 466.999 85.5321 466.923 85.1486 466.923C84.7481 466.923 84.3986 467.004 84.1003 467.165C83.802 467.327 83.5719 467.56 83.41 467.862C83.2481 468.165 83.1671 468.525 83.1671 468.942H80.54C80.54 468.086 80.7339 467.342 81.1216 466.712C81.5094 466.081 82.0527 465.593 82.7516 465.248C83.4505 464.903 84.2559 464.73 85.1678 464.73C86.1053 464.73 86.9214 464.896 87.616 465.229C88.3148 465.557 88.8581 466.013 89.2459 466.597C89.6337 467.18 89.8276 467.849 89.8276 468.604C89.8276 469.098 89.7296 469.586 89.5336 470.067C89.3418 470.549 88.9988 471.084 88.5044 471.672C88.0101 472.256 87.3134 472.957 86.4142 473.775L84.503 475.648V475.737H90.0002V478H80.6678ZM96.2469 478.179C95.3435 478.179 94.5381 478.013 93.8307 477.68C93.1276 477.348 92.5694 476.89 92.156 476.306C91.7427 475.722 91.5275 475.053 91.5104 474.299H94.1951C94.2249 474.806 94.438 475.217 94.8343 475.533C95.2306 475.848 95.7015 476.006 96.2469 476.006C96.6816 476.006 97.0651 475.91 97.3975 475.718C97.7342 475.522 97.9962 475.251 98.1837 474.906C98.3755 474.557 98.4714 474.156 98.4714 473.705C98.4714 473.244 98.3734 472.839 98.1773 472.49C97.9856 472.141 97.7192 471.868 97.3783 471.672C97.0374 471.476 96.6475 471.376 96.2086 471.371C95.8251 471.371 95.4522 471.45 95.09 471.608C94.732 471.766 94.4529 471.981 94.2526 472.254L91.7917 471.812L92.4117 464.909H100.415V467.172H94.6937L94.3549 470.451H94.4316C94.6617 470.127 95.009 469.859 95.4735 469.646C95.938 469.433 96.4579 469.326 97.0332 469.326C97.8215 469.326 98.5246 469.511 99.1425 469.882C99.7604 470.253 100.248 470.762 100.606 471.41C100.964 472.053 101.141 472.795 101.137 473.634C101.141 474.516 100.937 475.3 100.523 475.987C100.114 476.668 99.541 477.205 98.8038 477.597C98.0708 477.985 97.2185 478.179 96.2469 478.179Z" fill="black"/> +<path d="M21.4091 514V502.364H22.8182V512.75H28.2273V514H21.4091ZM32.4755 514.205C31.9224 514.205 31.4205 514.1 30.9698 513.892C30.519 513.68 30.1611 513.375 29.8959 512.977C29.6308 512.576 29.4982 512.091 29.4982 511.523C29.4982 511.023 29.5967 510.617 29.7936 510.307C29.9906 509.992 30.2539 509.746 30.5834 509.568C30.913 509.39 31.2766 509.258 31.6743 509.17C32.0758 509.08 32.4792 509.008 32.8845 508.955C33.4148 508.886 33.8448 508.835 34.1743 508.801C34.5077 508.763 34.7501 508.701 34.9016 508.614C35.0569 508.527 35.1345 508.375 35.1345 508.159V508.114C35.1345 507.553 34.9811 507.117 34.6743 506.807C34.3713 506.496 33.9111 506.341 33.2936 506.341C32.6535 506.341 32.1516 506.481 31.788 506.761C31.4243 507.042 31.1686 507.341 31.0209 507.659L29.7482 507.205C29.9755 506.674 30.2785 506.261 30.6573 505.966C31.0398 505.667 31.4565 505.458 31.9073 505.341C32.3618 505.22 32.8088 505.159 33.2482 505.159C33.5285 505.159 33.8505 505.193 34.2141 505.261C34.5815 505.326 34.9357 505.46 35.2766 505.665C35.6213 505.869 35.9073 506.178 36.1345 506.591C36.3618 507.004 36.4755 507.557 36.4755 508.25V514H35.1345V512.818H35.0664C34.9755 513.008 34.8239 513.21 34.6118 513.426C34.3997 513.642 34.1175 513.826 33.7652 513.977C33.413 514.129 32.983 514.205 32.4755 514.205ZM32.68 513C33.2103 513 33.6573 512.896 34.0209 512.688C34.3883 512.479 34.6648 512.21 34.8505 511.881C35.0398 511.551 35.1345 511.205 35.1345 510.841V509.614C35.0777 509.682 34.9527 509.744 34.7595 509.801C34.5702 509.854 34.3505 509.902 34.1005 509.943C33.8542 509.981 33.6137 510.015 33.3789 510.045C33.1478 510.072 32.9603 510.095 32.8164 510.114C32.4679 510.159 32.1421 510.233 31.8391 510.335C31.5398 510.434 31.2974 510.583 31.1118 510.784C30.93 510.981 30.8391 511.25 30.8391 511.591C30.8391 512.057 31.0114 512.409 31.3561 512.648C31.7046 512.883 32.1459 513 32.68 513ZM44.1029 510.432V505.273H45.4438V514H44.1029V512.523H44.012C43.8074 512.966 43.4893 513.343 43.0574 513.653C42.6256 513.96 42.0802 514.114 41.4211 514.114C40.8756 514.114 40.3908 513.994 39.9665 513.756C39.5423 513.513 39.209 513.15 38.9665 512.665C38.7241 512.176 38.6029 511.561 38.6029 510.818V505.273H39.9438V510.727C39.9438 511.364 40.1218 511.871 40.4779 512.25C40.8377 512.629 41.2961 512.818 41.8529 512.818C42.1862 512.818 42.5252 512.733 42.8699 512.562C43.2184 512.392 43.5101 512.131 43.7449 511.778C43.9836 511.426 44.1029 510.977 44.1029 510.432ZM48.9207 508.75V514H47.5798V505.273H48.8752V506.636H48.9889C49.1934 506.193 49.504 505.837 49.9207 505.568C50.3373 505.295 50.8752 505.159 51.5343 505.159C52.1252 505.159 52.6423 505.28 53.0855 505.523C53.5286 505.761 53.8733 506.125 54.1195 506.614C54.3658 507.098 54.4889 507.712 54.4889 508.455V514H53.148V508.545C53.148 507.86 52.9699 507.326 52.6139 506.943C52.2578 506.557 51.7692 506.364 51.148 506.364C50.7199 506.364 50.3373 506.456 50.0002 506.642C49.6669 506.828 49.4036 507.098 49.2105 507.455C49.0173 507.811 48.9207 508.242 48.9207 508.75ZM60.1646 514.182C59.3464 514.182 58.6419 513.989 58.051 513.602C57.4601 513.216 57.0055 512.684 56.6873 512.006C56.3691 511.328 56.2101 510.553 56.2101 509.682C56.2101 508.795 56.3729 508.013 56.6987 507.335C57.0282 506.653 57.4866 506.121 58.0737 505.739C58.6646 505.352 59.354 505.159 60.1419 505.159C60.7555 505.159 61.3085 505.273 61.801 505.5C62.2934 505.727 62.6968 506.045 63.0112 506.455C63.3256 506.864 63.5207 507.341 63.5964 507.886H62.2555C62.1532 507.489 61.926 507.136 61.5737 506.83C61.2252 506.519 60.7555 506.364 60.1646 506.364C59.6419 506.364 59.1835 506.5 58.7896 506.773C58.3995 507.042 58.0945 507.422 57.8748 507.915C57.6589 508.403 57.551 508.977 57.551 509.636C57.551 510.311 57.657 510.898 57.8691 511.398C58.0851 511.898 58.3881 512.286 58.7782 512.562C59.1722 512.839 59.6343 512.977 60.1646 512.977C60.5131 512.977 60.8294 512.917 61.1135 512.795C61.3976 512.674 61.6381 512.5 61.8351 512.273C62.032 512.045 62.1722 511.773 62.2555 511.455H63.5964C63.5207 511.97 63.3332 512.434 63.0339 512.847C62.7385 513.256 62.3464 513.581 61.8578 513.824C61.3729 514.062 60.8085 514.182 60.1646 514.182ZM66.5776 508.75V514H65.2366V502.364H66.5776V506.636H66.6912C66.8957 506.186 67.2026 505.828 67.6116 505.562C68.0245 505.294 68.5738 505.159 69.2594 505.159C69.8541 505.159 70.3749 505.278 70.8219 505.517C71.2688 505.752 71.6154 506.114 71.8616 506.602C72.1116 507.087 72.2366 507.705 72.2366 508.455V514H70.8957V508.545C70.8957 507.852 70.7158 507.316 70.356 506.938C69.9999 506.555 69.5056 506.364 68.873 506.364C68.4336 506.364 68.0397 506.456 67.6912 506.642C67.3465 506.828 67.0738 507.098 66.873 507.455C66.676 507.811 66.5776 508.242 66.5776 508.75ZM82.2089 514.182C81.368 514.182 80.6426 513.996 80.0327 513.625C79.4267 513.25 78.9589 512.727 78.6293 512.057C78.3036 511.383 78.1407 510.598 78.1407 509.705C78.1407 508.811 78.3036 508.023 78.6293 507.341C78.9589 506.655 79.4172 506.121 80.0043 505.739C80.5952 505.352 81.2846 505.159 82.0725 505.159C82.527 505.159 82.9759 505.235 83.4191 505.386C83.8623 505.538 84.2657 505.784 84.6293 506.125C84.993 506.462 85.2827 506.909 85.4986 507.466C85.7145 508.023 85.8225 508.708 85.8225 509.523V510.091H79.0952V508.932H84.4589C84.4589 508.439 84.3604 508 84.1634 507.614C83.9702 507.227 83.6937 506.922 83.3339 506.699C82.9778 506.475 82.5573 506.364 82.0725 506.364C81.5384 506.364 81.0763 506.496 80.6861 506.761C80.2998 507.023 80.0024 507.364 79.7941 507.784C79.5858 508.205 79.4816 508.655 79.4816 509.136V509.909C79.4816 510.568 79.5952 511.127 79.8225 511.585C80.0536 512.04 80.3736 512.386 80.7827 512.625C81.1918 512.86 81.6672 512.977 82.2089 512.977C82.5611 512.977 82.8793 512.928 83.1634 512.83C83.4513 512.727 83.6994 512.576 83.9077 512.375C84.1161 512.17 84.277 511.917 84.3907 511.614L85.6861 511.977C85.5498 512.417 85.3206 512.803 84.9986 513.136C84.6767 513.466 84.2789 513.723 83.8055 513.909C83.332 514.091 82.7998 514.182 82.2089 514.182ZM93.7241 507.227L92.5195 507.568C92.4438 507.367 92.332 507.172 92.1843 506.983C92.0404 506.79 91.8434 506.631 91.5934 506.506C91.3434 506.381 91.0233 506.318 90.6332 506.318C90.0991 506.318 89.654 506.441 89.298 506.688C88.9457 506.93 88.7695 507.239 88.7695 507.614C88.7695 507.947 88.8908 508.21 89.1332 508.403C89.3756 508.597 89.7544 508.758 90.2695 508.886L91.565 509.205C92.3453 509.394 92.9267 509.684 93.3093 510.074C93.6919 510.46 93.8832 510.958 93.8832 511.568C93.8832 512.068 93.7392 512.515 93.4514 512.909C93.1673 513.303 92.7695 513.614 92.2582 513.841C91.7468 514.068 91.1521 514.182 90.4741 514.182C89.5839 514.182 88.8472 513.989 88.2639 513.602C87.6805 513.216 87.3112 512.652 87.1559 511.909L88.4286 511.591C88.5499 512.061 88.779 512.413 89.1161 512.648C89.457 512.883 89.9021 513 90.4514 513C91.0764 513 91.5726 512.867 91.94 512.602C92.3112 512.333 92.4968 512.011 92.4968 511.636C92.4968 511.333 92.3908 511.08 92.1786 510.875C91.9665 510.667 91.6408 510.511 91.2014 510.409L89.7468 510.068C88.9476 509.879 88.3605 509.585 87.9855 509.188C87.6142 508.786 87.4286 508.284 87.4286 507.682C87.4286 507.189 87.5669 506.754 87.8434 506.375C88.1237 505.996 88.5044 505.699 88.9855 505.483C89.4703 505.267 90.0195 505.159 90.6332 505.159C91.4968 505.159 92.1749 505.348 92.6673 505.727C93.1635 506.106 93.5158 506.606 93.7241 507.227ZM101.763 507.227L100.559 507.568C100.483 507.367 100.371 507.172 100.224 506.983C100.08 506.79 99.8828 506.631 99.6328 506.506C99.3828 506.381 99.0627 506.318 98.6726 506.318C98.1385 506.318 97.6934 506.441 97.3373 506.688C96.9851 506.93 96.8089 507.239 96.8089 507.614C96.8089 507.947 96.9301 508.21 97.1726 508.403C97.415 508.597 97.7938 508.758 98.3089 508.886L99.6044 509.205C100.385 509.394 100.966 509.684 101.349 510.074C101.731 510.46 101.923 510.958 101.923 511.568C101.923 512.068 101.779 512.515 101.491 512.909C101.207 513.303 100.809 513.614 100.298 513.841C99.7862 514.068 99.1915 514.182 98.5135 514.182C97.6233 514.182 96.8866 513.989 96.3032 513.602C95.7199 513.216 95.3506 512.652 95.1953 511.909L96.468 511.591C96.5892 512.061 96.8184 512.413 97.1555 512.648C97.4964 512.883 97.9415 513 98.4907 513C99.1157 513 99.612 512.867 99.9794 512.602C100.351 512.333 100.536 512.011 100.536 511.636C100.536 511.333 100.43 511.08 100.218 510.875C100.006 510.667 99.6801 510.511 99.2407 510.409L97.7862 510.068C96.987 509.879 96.3998 509.585 96.0248 509.188C95.6536 508.786 95.468 508.284 95.468 507.682C95.468 507.189 95.6063 506.754 95.8828 506.375C96.1631 505.996 96.5438 505.699 97.0248 505.483C97.5097 505.267 98.0589 505.159 98.6726 505.159C99.5362 505.159 100.214 505.348 100.707 505.727C101.203 506.106 101.555 506.606 101.763 507.227ZM107.28 514.182C106.439 514.182 105.714 513.996 105.104 513.625C104.498 513.25 104.03 512.727 103.701 512.057C103.375 511.383 103.212 510.598 103.212 509.705C103.212 508.811 103.375 508.023 103.701 507.341C104.03 506.655 104.488 506.121 105.076 505.739C105.666 505.352 106.356 505.159 107.144 505.159C107.598 505.159 108.047 505.235 108.49 505.386C108.934 505.538 109.337 505.784 109.701 506.125C110.064 506.462 110.354 506.909 110.57 507.466C110.786 508.023 110.894 508.708 110.894 509.523V510.091H104.166V508.932H109.53C109.53 508.439 109.432 508 109.235 507.614C109.041 507.227 108.765 506.922 108.405 506.699C108.049 506.475 107.629 506.364 107.144 506.364C106.61 506.364 106.148 506.496 105.757 506.761C105.371 507.023 105.074 507.364 104.865 507.784C104.657 508.205 104.553 508.655 104.553 509.136V509.909C104.553 510.568 104.666 511.127 104.894 511.585C105.125 512.04 105.445 512.386 105.854 512.625C106.263 512.86 106.738 512.977 107.28 512.977C107.632 512.977 107.951 512.928 108.235 512.83C108.523 512.727 108.771 512.576 108.979 512.375C109.187 512.17 109.348 511.917 109.462 511.614L110.757 511.977C110.621 512.417 110.392 512.803 110.07 513.136C109.748 513.466 109.35 513.723 108.877 513.909C108.403 514.091 107.871 514.182 107.28 514.182ZM113.954 508.75V514H112.614V505.273H113.909V506.636H114.023C114.227 506.193 114.538 505.837 114.954 505.568C115.371 505.295 115.909 505.159 116.568 505.159C117.159 505.159 117.676 505.28 118.119 505.523C118.562 505.761 118.907 506.125 119.153 506.614C119.4 507.098 119.523 507.712 119.523 508.455V514H118.182V508.545C118.182 507.86 118.004 507.326 117.648 506.943C117.292 506.557 116.803 506.364 116.182 506.364C115.754 506.364 115.371 506.456 115.034 506.642C114.701 506.828 114.437 507.098 114.244 507.455C114.051 507.811 113.954 508.242 113.954 508.75ZM125.448 505.273V506.409H120.926V505.273H125.448ZM122.244 503.182H123.585V511.5C123.585 511.879 123.64 512.163 123.749 512.352C123.863 512.538 124.007 512.663 124.181 512.727C124.359 512.788 124.547 512.818 124.744 512.818C124.892 512.818 125.013 512.811 125.107 512.795C125.202 512.777 125.278 512.761 125.335 512.75L125.607 513.955C125.517 513.989 125.39 514.023 125.227 514.057C125.064 514.095 124.857 514.114 124.607 514.114C124.229 514.114 123.857 514.032 123.494 513.869C123.134 513.706 122.835 513.458 122.596 513.125C122.361 512.792 122.244 512.371 122.244 511.864V503.182ZM127.145 514V505.273H128.486V514H127.145ZM127.827 503.818C127.566 503.818 127.34 503.729 127.151 503.551C126.965 503.373 126.873 503.159 126.873 502.909C126.873 502.659 126.965 502.445 127.151 502.267C127.34 502.089 127.566 502 127.827 502C128.089 502 128.312 502.089 128.498 502.267C128.687 502.445 128.782 502.659 128.782 502.909C128.782 503.159 128.687 503.373 128.498 503.551C128.312 503.729 128.089 503.818 127.827 503.818ZM133.19 514.205C132.637 514.205 132.136 514.1 131.685 513.892C131.234 513.68 130.876 513.375 130.611 512.977C130.346 512.576 130.213 512.091 130.213 511.523C130.213 511.023 130.312 510.617 130.509 510.307C130.706 509.992 130.969 509.746 131.298 509.568C131.628 509.39 131.992 509.258 132.389 509.17C132.791 509.08 133.194 509.008 133.6 508.955C134.13 508.886 134.56 508.835 134.889 508.801C135.223 508.763 135.465 508.701 135.617 508.614C135.772 508.527 135.85 508.375 135.85 508.159V508.114C135.85 507.553 135.696 507.117 135.389 506.807C135.086 506.496 134.626 506.341 134.009 506.341C133.368 506.341 132.867 506.481 132.503 506.761C132.139 507.042 131.884 507.341 131.736 507.659L130.463 507.205C130.69 506.674 130.993 506.261 131.372 505.966C131.755 505.667 132.172 505.458 132.622 505.341C133.077 505.22 133.524 505.159 133.963 505.159C134.243 505.159 134.565 505.193 134.929 505.261C135.297 505.326 135.651 505.46 135.992 505.665C136.336 505.869 136.622 506.178 136.85 506.591C137.077 507.004 137.19 507.557 137.19 508.25V514H135.85V512.818H135.781C135.69 513.008 135.539 513.21 135.327 513.426C135.115 513.642 134.832 513.826 134.48 513.977C134.128 514.129 133.698 514.205 133.19 514.205ZM133.395 513C133.925 513 134.372 512.896 134.736 512.688C135.103 512.479 135.38 512.21 135.565 511.881C135.755 511.551 135.85 511.205 135.85 510.841V509.614C135.793 509.682 135.668 509.744 135.475 509.801C135.285 509.854 135.065 509.902 134.815 509.943C134.569 509.981 134.329 510.015 134.094 510.045C133.863 510.072 133.675 510.095 133.531 510.114C133.183 510.159 132.857 510.233 132.554 510.335C132.255 510.434 132.012 510.583 131.827 510.784C131.645 510.981 131.554 511.25 131.554 511.591C131.554 512.057 131.726 512.409 132.071 512.648C132.42 512.883 132.861 513 133.395 513ZM140.659 502.364V514H139.318V502.364H140.659ZM150.861 505.273V506.409H146.157V505.273H150.861ZM147.566 514V504.068C147.566 503.568 147.683 503.152 147.918 502.818C148.153 502.485 148.458 502.235 148.833 502.068C149.208 501.902 149.604 501.818 150.02 501.818C150.35 501.818 150.619 501.845 150.827 501.898C151.035 501.951 151.191 502 151.293 502.045L150.907 503.205C150.838 503.182 150.744 503.153 150.622 503.119C150.505 503.085 150.35 503.068 150.157 503.068C149.713 503.068 149.393 503.18 149.196 503.403C149.003 503.627 148.907 503.955 148.907 504.386V514H147.566ZM155.72 514.182C154.879 514.182 154.154 513.996 153.544 513.625C152.938 513.25 152.47 512.727 152.141 512.057C151.815 511.383 151.652 510.598 151.652 509.705C151.652 508.811 151.815 508.023 152.141 507.341C152.47 506.655 152.928 506.121 153.516 505.739C154.106 505.352 154.796 505.159 155.584 505.159C156.038 505.159 156.487 505.235 156.93 505.386C157.374 505.538 157.777 505.784 158.141 506.125C158.504 506.462 158.794 506.909 159.01 507.466C159.226 508.023 159.334 508.708 159.334 509.523V510.091H152.606V508.932H157.97C157.97 508.439 157.872 508 157.675 507.614C157.481 507.227 157.205 506.922 156.845 506.699C156.489 506.475 156.069 506.364 155.584 506.364C155.05 506.364 154.588 506.496 154.197 506.761C153.811 507.023 153.514 507.364 153.305 507.784C153.097 508.205 152.993 508.655 152.993 509.136V509.909C152.993 510.568 153.106 511.127 153.334 511.585C153.565 512.04 153.885 512.386 154.294 512.625C154.703 512.86 155.178 512.977 155.72 512.977C156.072 512.977 156.391 512.928 156.675 512.83C156.963 512.727 157.211 512.576 157.419 512.375C157.627 512.17 157.788 511.917 157.902 511.614L159.197 511.977C159.061 512.417 158.832 512.803 158.51 513.136C158.188 513.466 157.79 513.723 157.317 513.909C156.843 514.091 156.311 514.182 155.72 514.182ZM163.622 514.205C163.069 514.205 162.567 514.1 162.116 513.892C161.665 513.68 161.307 513.375 161.042 512.977C160.777 512.576 160.644 512.091 160.644 511.523C160.644 511.023 160.743 510.617 160.94 510.307C161.137 509.992 161.4 509.746 161.73 509.568C162.059 509.39 162.423 509.258 162.821 509.17C163.222 509.08 163.625 509.008 164.031 508.955C164.561 508.886 164.991 508.835 165.321 508.801C165.654 508.763 165.896 508.701 166.048 508.614C166.203 508.527 166.281 508.375 166.281 508.159V508.114C166.281 507.553 166.127 507.117 165.821 506.807C165.518 506.496 165.057 506.341 164.44 506.341C163.8 506.341 163.298 506.481 162.934 506.761C162.571 507.042 162.315 507.341 162.167 507.659L160.894 507.205C161.122 506.674 161.425 506.261 161.804 505.966C162.186 505.667 162.603 505.458 163.054 505.341C163.508 505.22 163.955 505.159 164.394 505.159C164.675 505.159 164.997 505.193 165.36 505.261C165.728 505.326 166.082 505.46 166.423 505.665C166.768 505.869 167.054 506.178 167.281 506.591C167.508 507.004 167.622 507.557 167.622 508.25V514H166.281V512.818H166.213C166.122 513.008 165.97 513.21 165.758 513.426C165.546 513.642 165.264 513.826 164.911 513.977C164.559 514.129 164.129 514.205 163.622 514.205ZM163.826 513C164.357 513 164.804 512.896 165.167 512.688C165.535 512.479 165.811 512.21 165.997 511.881C166.186 511.551 166.281 511.205 166.281 510.841V509.614C166.224 509.682 166.099 509.744 165.906 509.801C165.716 509.854 165.497 509.902 165.247 509.943C165 509.981 164.76 510.015 164.525 510.045C164.294 510.072 164.107 510.095 163.963 510.114C163.614 510.159 163.288 510.233 162.985 510.335C162.686 510.434 162.444 510.583 162.258 510.784C162.076 510.981 161.985 511.25 161.985 511.591C161.985 512.057 162.158 512.409 162.502 512.648C162.851 512.883 163.292 513 163.826 513ZM173.545 505.273V506.409H169.022V505.273H173.545ZM170.34 503.182H171.681V511.5C171.681 511.879 171.736 512.163 171.846 512.352C171.959 512.538 172.103 512.663 172.278 512.727C172.456 512.788 172.643 512.818 172.84 512.818C172.988 512.818 173.109 512.811 173.204 512.795C173.298 512.777 173.374 512.761 173.431 512.75L173.704 513.955C173.613 513.989 173.486 514.023 173.323 514.057C173.16 514.095 172.954 514.114 172.704 514.114C172.325 514.114 171.954 514.032 171.59 513.869C171.23 513.706 170.931 513.458 170.692 513.125C170.457 512.792 170.34 512.371 170.34 511.864V503.182ZM180.742 510.432V505.273H182.083V514H180.742V512.523H180.651C180.446 512.966 180.128 513.343 179.696 513.653C179.264 513.96 178.719 514.114 178.06 514.114C177.514 514.114 177.03 513.994 176.605 513.756C176.181 513.513 175.848 513.15 175.605 512.665C175.363 512.176 175.242 511.561 175.242 510.818V505.273H176.583V510.727C176.583 511.364 176.761 511.871 177.117 512.25C177.476 512.629 177.935 512.818 178.492 512.818C178.825 512.818 179.164 512.733 179.509 512.562C179.857 512.392 180.149 512.131 180.384 511.778C180.622 511.426 180.742 510.977 180.742 510.432ZM184.219 514V505.273H185.514V506.591H185.605C185.764 506.159 186.052 505.809 186.469 505.54C186.885 505.271 187.355 505.136 187.878 505.136C187.976 505.136 188.099 505.138 188.247 505.142C188.395 505.146 188.506 505.152 188.582 505.159V506.523C188.537 506.511 188.433 506.494 188.27 506.472C188.111 506.445 187.942 506.432 187.764 506.432C187.34 506.432 186.961 506.521 186.628 506.699C186.298 506.873 186.037 507.116 185.844 507.426C185.654 507.733 185.559 508.083 185.559 508.477V514H184.219ZM193.245 514.182C192.404 514.182 191.679 513.996 191.069 513.625C190.463 513.25 189.995 512.727 189.666 512.057C189.34 511.383 189.177 510.598 189.177 509.705C189.177 508.811 189.34 508.023 189.666 507.341C189.995 506.655 190.453 506.121 191.041 505.739C191.631 505.352 192.321 505.159 193.109 505.159C193.563 505.159 194.012 505.235 194.455 505.386C194.899 505.538 195.302 505.784 195.666 506.125C196.029 506.462 196.319 506.909 196.535 507.466C196.751 508.023 196.859 508.708 196.859 509.523V510.091H190.131V508.932H195.495C195.495 508.439 195.397 508 195.2 507.614C195.006 507.227 194.73 506.922 194.37 506.699C194.014 506.475 193.594 506.364 193.109 506.364C192.575 506.364 192.113 506.496 191.722 506.761C191.336 507.023 191.039 507.364 190.83 507.784C190.622 508.205 190.518 508.655 190.518 509.136V509.909C190.518 510.568 190.631 511.127 190.859 511.585C191.09 512.04 191.41 512.386 191.819 512.625C192.228 512.86 192.703 512.977 193.245 512.977C193.597 512.977 193.916 512.928 194.2 512.83C194.488 512.727 194.736 512.576 194.944 512.375C195.152 512.17 195.313 511.917 195.427 511.614L196.722 511.977C196.586 512.417 196.357 512.803 196.035 513.136C195.713 513.466 195.315 513.723 194.842 513.909C194.368 514.091 193.836 514.182 193.245 514.182ZM204.76 507.227L203.556 507.568C203.48 507.367 203.368 507.172 203.221 506.983C203.077 506.79 202.88 506.631 202.63 506.506C202.38 506.381 202.06 506.318 201.669 506.318C201.135 506.318 200.69 506.441 200.334 506.688C199.982 506.93 199.806 507.239 199.806 507.614C199.806 507.947 199.927 508.21 200.169 508.403C200.412 508.597 200.791 508.758 201.306 508.886L202.601 509.205C203.382 509.394 203.963 509.684 204.346 510.074C204.728 510.46 204.919 510.958 204.919 511.568C204.919 512.068 204.775 512.515 204.488 512.909C204.204 513.303 203.806 513.614 203.294 513.841C202.783 514.068 202.188 514.182 201.51 514.182C200.62 514.182 199.883 513.989 199.3 513.602C198.717 513.216 198.347 512.652 198.192 511.909L199.465 511.591C199.586 512.061 199.815 512.413 200.152 512.648C200.493 512.883 200.938 513 201.488 513C202.113 513 202.609 512.867 202.976 512.602C203.347 512.333 203.533 512.011 203.533 511.636C203.533 511.333 203.427 511.08 203.215 510.875C203.003 510.667 202.677 510.511 202.238 510.409L200.783 510.068C199.984 509.879 199.397 509.585 199.022 509.188C198.65 508.786 198.465 508.284 198.465 507.682C198.465 507.189 198.603 506.754 198.88 506.375C199.16 505.996 199.541 505.699 200.022 505.483C200.507 505.267 201.056 505.159 201.669 505.159C202.533 505.159 203.211 505.348 203.704 505.727C204.2 506.106 204.552 506.606 204.76 507.227ZM213.366 514.205C212.813 514.205 212.311 514.1 211.86 513.892C211.41 513.68 211.052 513.375 210.787 512.977C210.521 512.576 210.389 512.091 210.389 511.523C210.389 511.023 210.487 510.617 210.684 510.307C210.881 509.992 211.144 509.746 211.474 509.568C211.804 509.39 212.167 509.258 212.565 509.17C212.966 509.08 213.37 509.008 213.775 508.955C214.305 508.886 214.735 508.835 215.065 508.801C215.398 508.763 215.641 508.701 215.792 508.614C215.948 508.527 216.025 508.375 216.025 508.159V508.114C216.025 507.553 215.872 507.117 215.565 506.807C215.262 506.496 214.802 506.341 214.184 506.341C213.544 506.341 213.042 506.481 212.679 506.761C212.315 507.042 212.059 507.341 211.912 507.659L210.639 507.205C210.866 506.674 211.169 506.261 211.548 505.966C211.93 505.667 212.347 505.458 212.798 505.341C213.252 505.22 213.699 505.159 214.139 505.159C214.419 505.159 214.741 505.193 215.105 505.261C215.472 505.326 215.826 505.46 216.167 505.665C216.512 505.869 216.798 506.178 217.025 506.591C217.252 507.004 217.366 507.557 217.366 508.25V514H216.025V512.818H215.957C215.866 513.008 215.715 513.21 215.502 513.426C215.29 513.642 215.008 513.826 214.656 513.977C214.304 514.129 213.874 514.205 213.366 514.205ZM213.571 513C214.101 513 214.548 512.896 214.912 512.688C215.279 512.479 215.555 512.21 215.741 511.881C215.93 511.551 216.025 511.205 216.025 510.841V509.614C215.968 509.682 215.843 509.744 215.65 509.801C215.461 509.854 215.241 509.902 214.991 509.943C214.745 509.981 214.504 510.015 214.269 510.045C214.038 510.072 213.851 510.095 213.707 510.114C213.358 510.159 213.033 510.233 212.73 510.335C212.43 510.434 212.188 510.583 212.002 510.784C211.821 510.981 211.73 511.25 211.73 511.591C211.73 512.057 211.902 512.409 212.247 512.648C212.595 512.883 213.037 513 213.571 513ZM220.834 508.75V514H219.494V505.273H220.789V506.636H220.903C221.107 506.193 221.418 505.837 221.834 505.568C222.251 505.295 222.789 505.159 223.448 505.159C224.039 505.159 224.556 505.28 224.999 505.523C225.442 505.761 225.787 506.125 226.033 506.614C226.28 507.098 226.403 507.712 226.403 508.455V514H225.062V508.545C225.062 507.86 224.884 507.326 224.528 506.943C224.172 506.557 223.683 506.364 223.062 506.364C222.634 506.364 222.251 506.456 221.914 506.642C221.581 506.828 221.317 507.098 221.124 507.455C220.931 507.811 220.834 508.242 220.834 508.75ZM231.828 514.182C231.101 514.182 230.459 513.998 229.902 513.631C229.345 513.259 228.91 512.737 228.595 512.062C228.281 511.384 228.124 510.583 228.124 509.659C228.124 508.742 228.281 507.947 228.595 507.273C228.91 506.598 229.347 506.078 229.908 505.71C230.468 505.343 231.116 505.159 231.851 505.159C232.419 505.159 232.868 505.254 233.198 505.443C233.531 505.629 233.785 505.841 233.959 506.08C234.137 506.314 234.275 506.508 234.374 506.659H234.487V502.364H235.828V514H234.533V512.659H234.374C234.275 512.818 234.135 513.019 233.953 513.261C233.772 513.5 233.512 513.714 233.175 513.903C232.838 514.089 232.389 514.182 231.828 514.182ZM232.01 512.977C232.548 512.977 233.003 512.837 233.374 512.557C233.745 512.273 234.027 511.881 234.22 511.381C234.414 510.877 234.51 510.295 234.51 509.636C234.51 508.985 234.415 508.415 234.226 507.926C234.037 507.434 233.756 507.051 233.385 506.778C233.014 506.502 232.556 506.364 232.01 506.364C231.442 506.364 230.968 506.509 230.59 506.801C230.215 507.089 229.933 507.481 229.743 507.977C229.558 508.47 229.465 509.023 229.465 509.636C229.465 510.258 229.559 510.822 229.749 511.33C229.942 511.833 230.226 512.235 230.601 512.534C230.98 512.83 231.45 512.977 232.01 512.977ZM246.126 505.273V506.409H241.603V505.273H246.126ZM242.921 503.182H244.262V511.5C244.262 511.879 244.317 512.163 244.427 512.352C244.541 512.538 244.685 512.663 244.859 512.727C245.037 512.788 245.224 512.818 245.421 512.818C245.569 512.818 245.69 512.811 245.785 512.795C245.88 512.777 245.955 512.761 246.012 512.75L246.285 513.955C246.194 513.989 246.067 514.023 245.904 514.057C245.741 514.095 245.535 514.114 245.285 514.114C244.906 514.114 244.535 514.032 244.171 513.869C243.811 513.706 243.512 513.458 243.274 513.125C243.039 512.792 242.921 512.371 242.921 511.864V503.182ZM251.275 514.182C250.487 514.182 249.795 513.994 249.201 513.619C248.61 513.244 248.148 512.72 247.814 512.045C247.485 511.371 247.32 510.583 247.32 509.682C247.32 508.773 247.485 507.979 247.814 507.301C248.148 506.623 248.61 506.097 249.201 505.722C249.795 505.347 250.487 505.159 251.275 505.159C252.062 505.159 252.752 505.347 253.343 505.722C253.937 506.097 254.4 506.623 254.729 507.301C255.062 507.979 255.229 508.773 255.229 509.682C255.229 510.583 255.062 511.371 254.729 512.045C254.4 512.72 253.937 513.244 253.343 513.619C252.752 513.994 252.062 514.182 251.275 514.182ZM251.275 512.977C251.873 512.977 252.366 512.824 252.752 512.517C253.138 512.21 253.424 511.807 253.61 511.307C253.795 510.807 253.888 510.265 253.888 509.682C253.888 509.098 253.795 508.555 253.61 508.051C253.424 507.547 253.138 507.14 252.752 506.83C252.366 506.519 251.873 506.364 251.275 506.364C250.676 506.364 250.184 506.519 249.797 506.83C249.411 507.14 249.125 507.547 248.939 508.051C248.754 508.555 248.661 509.098 248.661 509.682C248.661 510.265 248.754 510.807 248.939 511.307C249.125 511.807 249.411 512.21 249.797 512.517C250.184 512.824 250.676 512.977 251.275 512.977ZM260.501 514.182C259.714 514.182 259.022 513.994 258.428 513.619C257.837 513.244 257.375 512.72 257.041 512.045C256.712 511.371 256.547 510.583 256.547 509.682C256.547 508.773 256.712 507.979 257.041 507.301C257.375 506.623 257.837 506.097 258.428 505.722C259.022 505.347 259.714 505.159 260.501 505.159C261.289 505.159 261.979 505.347 262.57 505.722C263.164 506.097 263.626 506.623 263.956 507.301C264.289 507.979 264.456 508.773 264.456 509.682C264.456 510.583 264.289 511.371 263.956 512.045C263.626 512.72 263.164 513.244 262.57 513.619C261.979 513.994 261.289 514.182 260.501 514.182ZM260.501 512.977C261.1 512.977 261.592 512.824 261.979 512.517C262.365 512.21 262.651 511.807 262.837 511.307C263.022 510.807 263.115 510.265 263.115 509.682C263.115 509.098 263.022 508.555 262.837 508.051C262.651 507.547 262.365 507.14 261.979 506.83C261.592 506.519 261.1 506.364 260.501 506.364C259.903 506.364 259.411 506.519 259.024 506.83C258.638 507.14 258.352 507.547 258.166 508.051C257.981 508.555 257.888 509.098 257.888 509.682C257.888 510.265 257.981 510.807 258.166 511.307C258.352 511.807 258.638 512.21 259.024 512.517C259.411 512.824 259.903 512.977 260.501 512.977ZM267.524 502.364V514H266.183V502.364H267.524ZM275.842 507.227L274.637 507.568C274.561 507.367 274.45 507.172 274.302 506.983C274.158 506.79 273.961 506.631 273.711 506.506C273.461 506.381 273.141 506.318 272.751 506.318C272.217 506.318 271.772 506.441 271.415 506.688C271.063 506.93 270.887 507.239 270.887 507.614C270.887 507.947 271.008 508.21 271.251 508.403C271.493 508.597 271.872 508.758 272.387 508.886L273.682 509.205C274.463 509.394 275.044 509.684 275.427 510.074C275.809 510.46 276.001 510.958 276.001 511.568C276.001 512.068 275.857 512.515 275.569 512.909C275.285 513.303 274.887 513.614 274.376 513.841C273.864 514.068 273.27 514.182 272.592 514.182C271.701 514.182 270.965 513.989 270.381 513.602C269.798 513.216 269.429 512.652 269.273 511.909L270.546 511.591C270.667 512.061 270.897 512.413 271.234 512.648C271.575 512.883 272.02 513 272.569 513C273.194 513 273.69 512.867 274.057 512.602C274.429 512.333 274.614 512.011 274.614 511.636C274.614 511.333 274.508 511.08 274.296 510.875C274.084 510.667 273.758 510.511 273.319 510.409L271.864 510.068C271.065 509.879 270.478 509.585 270.103 509.188C269.732 508.786 269.546 508.284 269.546 507.682C269.546 507.189 269.684 506.754 269.961 506.375C270.241 505.996 270.622 505.699 271.103 505.483C271.588 505.267 272.137 505.159 272.751 505.159C273.614 505.159 274.292 505.348 274.785 505.727C275.281 506.106 275.633 506.606 275.842 507.227ZM23.2045 544L20.5455 535.273H21.9545L23.8409 541.955H23.9318L25.7955 535.273H27.2273L29.0682 541.932H29.1591L31.0455 535.273H32.4545L29.7955 544H28.4773L26.5682 537.295H26.4318L24.5227 544H23.2045ZM35.2482 538.75V544H33.9073V532.364H35.2482V536.636H35.3618C35.5664 536.186 35.8732 535.828 36.2823 535.562C36.6952 535.294 37.2444 535.159 37.93 535.159C38.5247 535.159 39.0455 535.278 39.4925 535.517C39.9395 535.752 40.2861 536.114 40.5323 536.602C40.7823 537.087 40.9073 537.705 40.9073 538.455V544H39.5664V538.545C39.5664 537.852 39.3864 537.316 39.0266 536.938C38.6705 536.555 38.1762 536.364 37.5436 536.364C37.1042 536.364 36.7103 536.456 36.3618 536.642C36.0171 536.828 35.7444 537.098 35.5436 537.455C35.3467 537.811 35.2482 538.242 35.2482 538.75ZM43.0404 544V535.273H44.3813V544H43.0404ZM43.7222 533.818C43.4609 533.818 43.2355 533.729 43.0461 533.551C42.8605 533.373 42.7677 533.159 42.7677 532.909C42.7677 532.659 42.8605 532.445 43.0461 532.267C43.2355 532.089 43.4609 532 43.7222 532C43.9836 532 44.2071 532.089 44.3927 532.267C44.5821 532.445 44.6768 532.659 44.6768 532.909C44.6768 533.159 44.5821 533.373 44.3927 533.551C44.2071 533.729 43.9836 533.818 43.7222 533.818ZM47.8582 532.364V544H46.5173V532.364H47.8582ZM53.6532 544.182C52.8123 544.182 52.087 543.996 51.4771 543.625C50.871 543.25 50.4032 542.727 50.0737 542.057C49.7479 541.383 49.5851 540.598 49.5851 539.705C49.5851 538.811 49.7479 538.023 50.0737 537.341C50.4032 536.655 50.8616 536.121 51.4487 535.739C52.0396 535.352 52.729 535.159 53.5169 535.159C53.9714 535.159 54.4203 535.235 54.8635 535.386C55.3066 535.538 55.7101 535.784 56.0737 536.125C56.4373 536.462 56.7271 536.909 56.943 537.466C57.1589 538.023 57.2669 538.708 57.2669 539.523V540.091H50.5396V538.932H55.9032C55.9032 538.439 55.8048 538 55.6078 537.614C55.4146 537.227 55.1381 536.922 54.7782 536.699C54.4222 536.475 54.0017 536.364 53.5169 536.364C52.9828 536.364 52.5207 536.496 52.1305 536.761C51.7441 537.023 51.4468 537.364 51.2385 537.784C51.0301 538.205 50.926 538.655 50.926 539.136V539.909C50.926 540.568 51.0396 541.127 51.2669 541.585C51.4979 542.04 51.818 542.386 52.2271 542.625C52.6362 542.86 53.1116 542.977 53.6532 542.977C54.0055 542.977 54.3237 542.928 54.6078 542.83C54.8957 542.727 55.1438 542.576 55.3521 542.375C55.5604 542.17 55.7214 541.917 55.8351 541.614L57.1305 541.977C56.9941 542.417 56.765 542.803 56.443 543.136C56.121 543.466 55.7233 543.723 55.2498 543.909C54.7763 544.091 54.2441 544.182 53.6532 544.182ZM66.8257 544.182C65.9848 544.182 65.2595 543.996 64.6496 543.625C64.0435 543.25 63.5757 542.727 63.2462 542.057C62.9204 541.383 62.7576 540.598 62.7576 539.705C62.7576 538.811 62.9204 538.023 63.2462 537.341C63.5757 536.655 64.0341 536.121 64.6212 535.739C65.2121 535.352 65.9015 535.159 66.6894 535.159C67.1439 535.159 67.5928 535.235 68.036 535.386C68.4791 535.538 68.8826 535.784 69.2462 536.125C69.6098 536.462 69.8996 536.909 70.1155 537.466C70.3314 538.023 70.4394 538.708 70.4394 539.523V540.091H63.7121V538.932H69.0757C69.0757 538.439 68.9773 538 68.7803 537.614C68.5871 537.227 68.3106 536.922 67.9507 536.699C67.5947 536.475 67.1742 536.364 66.6894 536.364C66.1553 536.364 65.6932 536.496 65.303 536.761C64.9166 537.023 64.6193 537.364 64.411 537.784C64.2026 538.205 64.0985 538.655 64.0985 539.136V539.909C64.0985 540.568 64.2121 541.127 64.4394 541.585C64.6704 542.04 64.9905 542.386 65.3996 542.625C65.8087 542.86 66.2841 542.977 66.8257 542.977C67.178 542.977 67.4962 542.928 67.7803 542.83C68.0682 542.727 68.3163 542.576 68.5246 542.375C68.7329 542.17 68.8939 541.917 69.0076 541.614L70.303 541.977C70.1666 542.417 69.9375 542.803 69.6155 543.136C69.2935 543.466 68.8958 543.723 68.4223 543.909C67.9488 544.091 67.4166 544.182 66.8257 544.182ZM78.341 537.227L77.1364 537.568C77.0607 537.367 76.9489 537.172 76.8012 536.983C76.6573 536.79 76.4603 536.631 76.2103 536.506C75.9603 536.381 75.6402 536.318 75.2501 536.318C74.716 536.318 74.2709 536.441 73.9148 536.688C73.5626 536.93 73.3864 537.239 73.3864 537.614C73.3864 537.947 73.5076 538.21 73.7501 538.403C73.9925 538.597 74.3713 538.758 74.8864 538.886L76.1819 539.205C76.9622 539.394 77.5436 539.684 77.9262 540.074C78.3088 540.46 78.5001 540.958 78.5001 541.568C78.5001 542.068 78.3561 542.515 78.0682 542.909C77.7841 543.303 77.3864 543.614 76.8751 543.841C76.3637 544.068 75.769 544.182 75.091 544.182C74.2008 544.182 73.4641 543.989 72.8807 543.602C72.2974 543.216 71.9281 542.652 71.7728 541.909L73.0455 541.591C73.1667 542.061 73.3959 542.413 73.733 542.648C74.0739 542.883 74.519 543 75.0682 543C75.6932 543 76.1894 542.867 76.5569 542.602C76.9281 542.333 77.1137 542.011 77.1137 541.636C77.1137 541.333 77.0076 541.08 76.7955 540.875C76.5834 540.667 76.2576 540.511 75.8182 540.409L74.3637 540.068C73.5644 539.879 72.9773 539.585 72.6023 539.188C72.2311 538.786 72.0455 538.284 72.0455 537.682C72.0455 537.189 72.1838 536.754 72.4603 536.375C72.7406 535.996 73.1213 535.699 73.6023 535.483C74.0872 535.267 74.6364 535.159 75.2501 535.159C76.1137 535.159 76.7917 535.348 77.2841 535.727C77.7804 536.106 78.1326 536.606 78.341 537.227ZM83.994 535.273V536.409H79.4712V535.273H83.994ZM80.7894 533.182H82.1303V541.5C82.1303 541.879 82.1853 542.163 82.2951 542.352C82.4087 542.538 82.5527 542.663 82.7269 542.727C82.905 542.788 83.0925 542.818 83.2894 542.818C83.4372 542.818 83.5584 542.811 83.6531 542.795C83.7478 542.777 83.8235 542.761 83.8803 542.75L84.1531 543.955C84.0622 543.989 83.9353 544.023 83.7724 544.057C83.6095 544.095 83.4031 544.114 83.1531 544.114C82.7743 544.114 82.4031 544.032 82.0394 543.869C81.6796 543.706 81.3803 543.458 81.1417 543.125C80.9069 542.792 80.7894 542.371 80.7894 541.864V533.182ZM88.2592 544.205C87.7062 544.205 87.2043 544.1 86.7535 543.892C86.3028 543.68 85.9448 543.375 85.6797 542.977C85.4145 542.576 85.2819 542.091 85.2819 541.523C85.2819 541.023 85.3804 540.617 85.5774 540.307C85.7744 539.992 86.0376 539.746 86.3672 539.568C86.6967 539.39 87.0603 539.258 87.4581 539.17C87.8596 539.08 88.263 539.008 88.6683 538.955C89.1986 538.886 89.6285 538.835 89.9581 538.801C90.2914 538.763 90.5338 538.701 90.6853 538.614C90.8406 538.527 90.9183 538.375 90.9183 538.159V538.114C90.9183 537.553 90.7649 537.117 90.4581 536.807C90.155 536.496 89.6948 536.341 89.0774 536.341C88.4372 536.341 87.9353 536.481 87.5717 536.761C87.2081 537.042 86.9524 537.341 86.8047 537.659L85.5319 537.205C85.7592 536.674 86.0622 536.261 86.441 535.966C86.8236 535.667 87.2403 535.458 87.691 535.341C88.1456 535.22 88.5925 535.159 89.0319 535.159C89.3122 535.159 89.6342 535.193 89.9978 535.261C90.3653 535.326 90.7194 535.46 91.0603 535.665C91.405 535.869 91.691 536.178 91.9183 536.591C92.1456 537.004 92.2592 537.557 92.2592 538.25V544H90.9183V542.818H90.8501C90.7592 543.008 90.6077 543.21 90.3956 543.426C90.1834 543.642 89.9013 543.826 89.549 543.977C89.1967 544.129 88.7668 544.205 88.2592 544.205ZM88.4638 543C88.9941 543 89.441 542.896 89.8047 542.688C90.1721 542.479 90.4486 542.21 90.6342 541.881C90.8236 541.551 90.9183 541.205 90.9183 540.841V539.614C90.8615 539.682 90.7365 539.744 90.5433 539.801C90.3539 539.854 90.1342 539.902 89.8842 539.943C89.638 539.981 89.3975 540.015 89.1626 540.045C88.9316 540.072 88.7441 540.095 88.6001 540.114C88.2516 540.159 87.9259 540.233 87.6228 540.335C87.3236 540.434 87.0812 540.583 86.8956 540.784C86.7138 540.981 86.6228 541.25 86.6228 541.591C86.6228 542.057 86.7952 542.409 87.1399 542.648C87.4884 542.883 87.9297 543 88.4638 543ZM94.5685 544V532.364H95.9094V536.659H96.023C96.1215 536.508 96.2579 536.314 96.4321 536.08C96.6101 535.841 96.8639 535.629 97.1935 535.443C97.5268 535.254 97.9776 535.159 98.5457 535.159C99.2806 535.159 99.9283 535.343 100.489 535.71C101.05 536.078 101.487 536.598 101.801 537.273C102.116 537.947 102.273 538.742 102.273 539.659C102.273 540.583 102.116 541.384 101.801 542.062C101.487 542.737 101.051 543.259 100.495 543.631C99.9378 543.998 99.2957 544.182 98.5685 544.182C98.0079 544.182 97.559 544.089 97.2219 543.903C96.8848 543.714 96.6253 543.5 96.4435 543.261C96.2617 543.019 96.1215 542.818 96.023 542.659H95.8639V544H94.5685ZM95.8867 539.636C95.8867 540.295 95.9832 540.877 96.1764 541.381C96.3696 541.881 96.6518 542.273 97.023 542.557C97.3942 542.837 97.8488 542.977 98.3867 542.977C98.9473 542.977 99.4151 542.83 99.7901 542.534C100.169 542.235 100.453 541.833 100.642 541.33C100.836 540.822 100.932 540.258 100.932 539.636C100.932 539.023 100.837 538.47 100.648 537.977C100.462 537.481 100.18 537.089 99.8014 536.801C99.4264 536.509 98.9548 536.364 98.3867 536.364C97.8412 536.364 97.3829 536.502 97.0117 536.778C96.6404 537.051 96.3601 537.434 96.1707 537.926C95.9813 538.415 95.8867 538.985 95.8867 539.636ZM105.345 532.364V544H104.004V532.364H105.345ZM107.481 544V535.273H108.822V544H107.481ZM108.163 533.818C107.901 533.818 107.676 533.729 107.487 533.551C107.301 533.373 107.208 533.159 107.208 532.909C107.208 532.659 107.301 532.445 107.487 532.267C107.676 532.089 107.901 532 108.163 532C108.424 532 108.648 532.089 108.833 532.267C109.023 532.445 109.117 532.659 109.117 532.909C109.117 533.159 109.023 533.373 108.833 533.551C108.648 533.729 108.424 533.818 108.163 533.818ZM117.14 537.227L115.935 537.568C115.859 537.367 115.748 537.172 115.6 536.983C115.456 536.79 115.259 536.631 115.009 536.506C114.759 536.381 114.439 536.318 114.049 536.318C113.515 536.318 113.07 536.441 112.714 536.688C112.361 536.93 112.185 537.239 112.185 537.614C112.185 537.947 112.306 538.21 112.549 538.403C112.791 538.597 113.17 538.758 113.685 538.886L114.981 539.205C115.761 539.394 116.342 539.684 116.725 540.074C117.108 540.46 117.299 540.958 117.299 541.568C117.299 542.068 117.155 542.515 116.867 542.909C116.583 543.303 116.185 543.614 115.674 543.841C115.162 544.068 114.568 544.182 113.89 544.182C113 544.182 112.263 543.989 111.679 543.602C111.096 543.216 110.727 542.652 110.572 541.909L111.844 541.591C111.965 542.061 112.195 542.413 112.532 542.648C112.873 542.883 113.318 543 113.867 543C114.492 543 114.988 542.867 115.356 542.602C115.727 542.333 115.912 542.011 115.912 541.636C115.912 541.333 115.806 541.08 115.594 540.875C115.382 540.667 115.056 540.511 114.617 540.409L113.162 540.068C112.363 539.879 111.776 539.585 111.401 539.188C111.03 538.786 110.844 538.284 110.844 537.682C110.844 537.189 110.983 536.754 111.259 536.375C111.539 535.996 111.92 535.699 112.401 535.483C112.886 535.267 113.435 535.159 114.049 535.159C114.912 535.159 115.59 535.348 116.083 535.727C116.579 536.106 116.931 536.606 117.14 537.227ZM120.338 538.75V544H118.997V532.364H120.338V536.636H120.452C120.656 536.186 120.963 535.828 121.372 535.562C121.785 535.294 122.334 535.159 123.02 535.159C123.615 535.159 124.136 535.278 124.582 535.517C125.029 535.752 125.376 536.114 125.622 536.602C125.872 537.087 125.997 537.705 125.997 538.455V544H124.656V538.545C124.656 537.852 124.476 537.316 124.117 536.938C123.761 536.555 123.266 536.364 122.634 536.364C122.194 536.364 121.8 536.456 121.452 536.642C121.107 536.828 120.834 537.098 120.634 537.455C120.437 537.811 120.338 538.242 120.338 538.75ZM128.13 544V535.273H129.471V544H128.13ZM128.812 533.818C128.551 533.818 128.325 533.729 128.136 533.551C127.95 533.373 127.858 533.159 127.858 532.909C127.858 532.659 127.95 532.445 128.136 532.267C128.325 532.089 128.551 532 128.812 532C129.074 532 129.297 532.089 129.483 532.267C129.672 532.445 129.767 532.659 129.767 532.909C129.767 533.159 129.672 533.373 129.483 533.551C129.297 533.729 129.074 533.818 128.812 533.818ZM132.948 538.75V544H131.607V535.273H132.903V536.636H133.016C133.221 536.193 133.532 535.837 133.948 535.568C134.365 535.295 134.903 535.159 135.562 535.159C136.153 535.159 136.67 535.28 137.113 535.523C137.556 535.761 137.901 536.125 138.147 536.614C138.393 537.098 138.516 537.712 138.516 538.455V544H137.175V538.545C137.175 537.86 136.997 537.326 136.641 536.943C136.285 536.557 135.797 536.364 135.175 536.364C134.747 536.364 134.365 536.456 134.028 536.642C133.694 536.828 133.431 537.098 133.238 537.455C133.045 537.811 132.948 538.242 132.948 538.75ZM144.169 547.455C143.522 547.455 142.965 547.371 142.499 547.205C142.033 547.042 141.645 546.826 141.334 546.557C141.027 546.292 140.783 546.008 140.601 545.705L141.669 544.955C141.791 545.114 141.944 545.295 142.13 545.5C142.315 545.708 142.569 545.888 142.891 546.04C143.217 546.195 143.643 546.273 144.169 546.273C144.874 546.273 145.455 546.102 145.914 545.761C146.372 545.42 146.601 544.886 146.601 544.159V542.386H146.488C146.389 542.545 146.249 542.742 146.067 542.977C145.889 543.208 145.631 543.415 145.294 543.597C144.961 543.775 144.51 543.864 143.942 543.864C143.238 543.864 142.605 543.697 142.044 543.364C141.488 543.03 141.046 542.545 140.721 541.909C140.399 541.273 140.238 540.5 140.238 539.591C140.238 538.697 140.395 537.919 140.709 537.256C141.024 536.589 141.461 536.074 142.022 535.71C142.582 535.343 143.23 535.159 143.965 535.159C144.533 535.159 144.984 535.254 145.317 535.443C145.654 535.629 145.912 535.841 146.09 536.08C146.272 536.314 146.412 536.508 146.51 536.659H146.647V535.273H147.942V544.25C147.942 545 147.772 545.61 147.431 546.08C147.094 546.553 146.639 546.9 146.067 547.119C145.499 547.343 144.866 547.455 144.169 547.455ZM144.124 542.659C144.662 542.659 145.116 542.536 145.488 542.29C145.859 542.044 146.141 541.689 146.334 541.227C146.527 540.765 146.624 540.212 146.624 539.568C146.624 538.939 146.529 538.384 146.34 537.903C146.15 537.422 145.87 537.045 145.499 536.773C145.128 536.5 144.669 536.364 144.124 536.364C143.556 536.364 143.082 536.508 142.703 536.795C142.328 537.083 142.046 537.47 141.857 537.955C141.671 538.439 141.578 538.977 141.578 539.568C141.578 540.174 141.673 540.71 141.863 541.176C142.056 541.638 142.34 542.002 142.715 542.267C143.094 542.528 143.563 542.659 144.124 542.659ZM160.438 537.227L159.234 537.568C159.158 537.367 159.046 537.172 158.899 536.983C158.755 536.79 158.558 536.631 158.308 536.506C158.058 536.381 157.738 536.318 157.348 536.318C156.813 536.318 156.368 536.441 156.012 536.688C155.66 536.93 155.484 537.239 155.484 537.614C155.484 537.947 155.605 538.21 155.848 538.403C156.09 538.597 156.469 538.758 156.984 538.886L158.279 539.205C159.06 539.394 159.641 539.684 160.024 540.074C160.406 540.46 160.598 540.958 160.598 541.568C160.598 542.068 160.454 542.515 160.166 542.909C159.882 543.303 159.484 543.614 158.973 543.841C158.461 544.068 157.866 544.182 157.188 544.182C156.298 544.182 155.562 543.989 154.978 543.602C154.395 543.216 154.026 542.652 153.87 541.909L155.143 541.591C155.264 542.061 155.493 542.413 155.831 542.648C156.171 542.883 156.616 543 157.166 543C157.791 543 158.287 542.867 158.654 542.602C159.026 542.333 159.211 542.011 159.211 541.636C159.211 541.333 159.105 541.08 158.893 540.875C158.681 540.667 158.355 540.511 157.916 540.409L156.461 540.068C155.662 539.879 155.075 539.585 154.7 539.188C154.329 538.786 154.143 538.284 154.143 537.682C154.143 537.189 154.281 536.754 154.558 536.375C154.838 535.996 155.219 535.699 155.7 535.483C156.185 535.267 156.734 535.159 157.348 535.159C158.211 535.159 158.889 535.348 159.382 535.727C159.878 536.106 160.23 536.606 160.438 537.227ZM166.091 535.273V536.409H161.569V535.273H166.091ZM162.887 533.182H164.228V541.5C164.228 541.879 164.283 542.163 164.393 542.352C164.506 542.538 164.65 542.663 164.824 542.727C165.002 542.788 165.19 542.818 165.387 542.818C165.535 542.818 165.656 542.811 165.751 542.795C165.845 542.777 165.921 542.761 165.978 542.75L166.251 543.955C166.16 543.989 166.033 544.023 165.87 544.057C165.707 544.095 165.501 544.114 165.251 544.114C164.872 544.114 164.501 544.032 164.137 543.869C163.777 543.706 163.478 543.458 163.239 543.125C163.004 542.792 162.887 542.371 162.887 541.864V533.182ZM167.789 544V535.273H169.084V536.591H169.175C169.334 536.159 169.622 535.809 170.039 535.54C170.455 535.271 170.925 535.136 171.448 535.136C171.546 535.136 171.669 535.138 171.817 535.142C171.965 535.146 172.076 535.152 172.152 535.159V536.523C172.107 536.511 172.003 536.494 171.84 536.472C171.681 536.445 171.512 536.432 171.334 536.432C170.91 536.432 170.531 536.521 170.198 536.699C169.868 536.873 169.607 537.116 169.414 537.426C169.224 537.733 169.129 538.083 169.129 538.477V544H167.789ZM175.99 544.205C175.437 544.205 174.935 544.1 174.484 543.892C174.033 543.68 173.675 543.375 173.41 542.977C173.145 542.576 173.013 542.091 173.013 541.523C173.013 541.023 173.111 540.617 173.308 540.307C173.505 539.992 173.768 539.746 174.098 539.568C174.427 539.39 174.791 539.258 175.189 539.17C175.59 539.08 175.994 539.008 176.399 538.955C176.929 538.886 177.359 538.835 177.689 538.801C178.022 538.763 178.264 538.701 178.416 538.614C178.571 538.527 178.649 538.375 178.649 538.159V538.114C178.649 537.553 178.496 537.117 178.189 536.807C177.886 536.496 177.425 536.341 176.808 536.341C176.168 536.341 175.666 536.481 175.302 536.761C174.939 537.042 174.683 537.341 174.535 537.659L173.263 537.205C173.49 536.674 173.793 536.261 174.172 535.966C174.554 535.667 174.971 535.458 175.422 535.341C175.876 535.22 176.323 535.159 176.763 535.159C177.043 535.159 177.365 535.193 177.728 535.261C178.096 535.326 178.45 535.46 178.791 535.665C179.136 535.869 179.422 536.178 179.649 536.591C179.876 537.004 179.99 537.557 179.99 538.25V544H178.649V542.818H178.581C178.49 543.008 178.338 543.21 178.126 543.426C177.914 543.642 177.632 543.826 177.28 543.977C176.927 544.129 176.497 544.205 175.99 544.205ZM176.194 543C176.725 543 177.172 542.896 177.535 542.688C177.903 542.479 178.179 542.21 178.365 541.881C178.554 541.551 178.649 541.205 178.649 540.841V539.614C178.592 539.682 178.467 539.744 178.274 539.801C178.085 539.854 177.865 539.902 177.615 539.943C177.369 539.981 177.128 540.015 176.893 540.045C176.662 540.072 176.475 540.095 176.331 540.114C175.982 540.159 175.657 540.233 175.353 540.335C175.054 540.434 174.812 540.583 174.626 540.784C174.444 540.981 174.353 541.25 174.353 541.591C174.353 542.057 174.526 542.409 174.871 542.648C175.219 542.883 175.66 543 176.194 543ZM185.913 535.273V536.409H181.39V535.273H185.913ZM182.708 533.182H184.049V541.5C184.049 541.879 184.104 542.163 184.214 542.352C184.327 542.538 184.471 542.663 184.646 542.727C184.824 542.788 185.011 542.818 185.208 542.818C185.356 542.818 185.477 542.811 185.572 542.795C185.667 542.777 185.742 542.761 185.799 542.75L186.072 543.955C185.981 543.989 185.854 544.023 185.691 544.057C185.528 544.095 185.322 544.114 185.072 544.114C184.693 544.114 184.322 544.032 183.958 543.869C183.598 543.706 183.299 543.458 183.06 543.125C182.826 542.792 182.708 542.371 182.708 541.864V533.182ZM191.175 544.182C190.334 544.182 189.609 543.996 188.999 543.625C188.393 543.25 187.925 542.727 187.596 542.057C187.27 541.383 187.107 540.598 187.107 539.705C187.107 538.811 187.27 538.023 187.596 537.341C187.925 536.655 188.383 536.121 188.971 535.739C189.561 535.352 190.251 535.159 191.039 535.159C191.493 535.159 191.942 535.235 192.385 535.386C192.829 535.538 193.232 535.784 193.596 536.125C193.959 536.462 194.249 536.909 194.465 537.466C194.681 538.023 194.789 538.708 194.789 539.523V540.091H188.061V538.932H193.425C193.425 538.439 193.327 538 193.13 537.614C192.936 537.227 192.66 536.922 192.3 536.699C191.944 536.475 191.524 536.364 191.039 536.364C190.505 536.364 190.043 536.496 189.652 536.761C189.266 537.023 188.969 537.364 188.76 537.784C188.552 538.205 188.448 538.655 188.448 539.136V539.909C188.448 540.568 188.561 541.127 188.789 541.585C189.02 542.04 189.34 542.386 189.749 542.625C190.158 542.86 190.633 542.977 191.175 542.977C191.527 542.977 191.846 542.928 192.13 542.83C192.418 542.727 192.666 542.576 192.874 542.375C193.082 542.17 193.243 541.917 193.357 541.614L194.652 541.977C194.516 542.417 194.287 542.803 193.965 543.136C193.643 543.466 193.245 543.723 192.772 543.909C192.298 544.091 191.766 544.182 191.175 544.182ZM200.031 547.455C199.384 547.455 198.827 547.371 198.361 547.205C197.895 547.042 197.507 546.826 197.196 546.557C196.889 546.292 196.645 546.008 196.463 545.705L197.531 544.955C197.652 545.114 197.806 545.295 197.991 545.5C198.177 545.708 198.431 545.888 198.753 546.04C199.079 546.195 199.505 546.273 200.031 546.273C200.736 546.273 201.317 546.102 201.776 545.761C202.234 545.42 202.463 544.886 202.463 544.159V542.386H202.349C202.251 542.545 202.111 542.742 201.929 542.977C201.751 543.208 201.493 543.415 201.156 543.597C200.823 543.775 200.372 543.864 199.804 543.864C199.099 543.864 198.467 543.697 197.906 543.364C197.349 543.03 196.908 542.545 196.582 541.909C196.26 541.273 196.099 540.5 196.099 539.591C196.099 538.697 196.257 537.919 196.571 537.256C196.885 536.589 197.323 536.074 197.884 535.71C198.444 535.343 199.092 535.159 199.827 535.159C200.395 535.159 200.846 535.254 201.179 535.443C201.516 535.629 201.774 535.841 201.952 536.08C202.134 536.314 202.274 536.508 202.372 536.659H202.509V535.273H203.804V544.25C203.804 545 203.634 545.61 203.293 546.08C202.955 546.553 202.501 546.9 201.929 547.119C201.361 547.343 200.728 547.455 200.031 547.455ZM199.986 542.659C200.524 542.659 200.978 542.536 201.349 542.29C201.721 542.044 202.003 541.689 202.196 541.227C202.389 540.765 202.486 540.212 202.486 539.568C202.486 538.939 202.391 538.384 202.202 537.903C202.012 537.422 201.732 537.045 201.361 536.773C200.99 536.5 200.531 536.364 199.986 536.364C199.418 536.364 198.944 536.508 198.565 536.795C198.19 537.083 197.908 537.47 197.719 537.955C197.533 538.439 197.44 538.977 197.44 539.568C197.44 540.174 197.535 540.71 197.724 541.176C197.918 541.638 198.202 542.002 198.577 542.267C198.955 542.528 199.425 542.659 199.986 542.659ZM205.939 544V535.273H207.279V544H205.939ZM206.62 533.818C206.359 533.818 206.134 533.729 205.944 533.551C205.759 533.373 205.666 533.159 205.666 532.909C205.666 532.659 205.759 532.445 205.944 532.267C206.134 532.089 206.359 532 206.62 532C206.882 532 207.105 532.089 207.291 532.267C207.48 532.445 207.575 532.659 207.575 532.909C207.575 533.159 207.48 533.373 207.291 533.551C207.105 533.729 206.882 533.818 206.62 533.818ZM212.961 544.182C212.143 544.182 211.438 543.989 210.847 543.602C210.256 543.216 209.802 542.684 209.484 542.006C209.165 541.328 209.006 540.553 209.006 539.682C209.006 538.795 209.169 538.013 209.495 537.335C209.824 536.653 210.283 536.121 210.87 535.739C211.461 535.352 212.15 535.159 212.938 535.159C213.552 535.159 214.105 535.273 214.597 535.5C215.09 535.727 215.493 536.045 215.807 536.455C216.122 536.864 216.317 537.341 216.393 537.886H215.052C214.949 537.489 214.722 537.136 214.37 536.83C214.021 536.519 213.552 536.364 212.961 536.364C212.438 536.364 211.98 536.5 211.586 536.773C211.196 537.042 210.891 537.422 210.671 537.915C210.455 538.403 210.347 538.977 210.347 539.636C210.347 540.311 210.453 540.898 210.665 541.398C210.881 541.898 211.184 542.286 211.574 542.562C211.968 542.839 212.431 542.977 212.961 542.977C213.309 542.977 213.626 542.917 213.91 542.795C214.194 542.674 214.434 542.5 214.631 542.273C214.828 542.045 214.968 541.773 215.052 541.455H216.393C216.317 541.97 216.129 542.434 215.83 542.847C215.535 543.256 215.143 543.581 214.654 543.824C214.169 544.062 213.605 544.182 212.961 544.182ZM21.2273 577.273V565.273H22.5227V566.659H22.6818C22.7803 566.508 22.9167 566.314 23.0909 566.08C23.2689 565.841 23.5227 565.629 23.8523 565.443C24.1856 565.254 24.6364 565.159 25.2045 565.159C25.9394 565.159 26.5871 565.343 27.1477 565.71C27.7083 566.078 28.1458 566.598 28.4602 567.273C28.7746 567.947 28.9318 568.742 28.9318 569.659C28.9318 570.583 28.7746 571.384 28.4602 572.062C28.1458 572.737 27.7102 573.259 27.1534 573.631C26.5966 573.998 25.9545 574.182 25.2273 574.182C24.6667 574.182 24.2178 574.089 23.8807 573.903C23.5436 573.714 23.2841 573.5 23.1023 573.261C22.9205 573.019 22.7803 572.818 22.6818 572.659H22.5682V577.273H21.2273ZM22.5455 569.636C22.5455 570.295 22.642 570.877 22.8352 571.381C23.0284 571.881 23.3106 572.273 23.6818 572.557C24.053 572.837 24.5076 572.977 25.0455 572.977C25.6061 572.977 26.0739 572.83 26.4489 572.534C26.8277 572.235 27.1117 571.833 27.3011 571.33C27.4943 570.822 27.5909 570.258 27.5909 569.636C27.5909 569.023 27.4962 568.47 27.3068 567.977C27.1212 567.481 26.839 567.089 26.4602 566.801C26.0852 566.509 25.6136 566.364 25.0455 566.364C24.5 566.364 24.0417 566.502 23.6705 566.778C23.2992 567.051 23.0189 567.434 22.8295 567.926C22.6402 568.415 22.5455 568.985 22.5455 569.636ZM33.2255 574.205C32.6724 574.205 32.1705 574.1 31.7198 573.892C31.269 573.68 30.9111 573.375 30.6459 572.977C30.3808 572.576 30.2482 572.091 30.2482 571.523C30.2482 571.023 30.3467 570.617 30.5436 570.307C30.7406 569.992 31.0039 569.746 31.3334 569.568C31.663 569.39 32.0266 569.258 32.4243 569.17C32.8258 569.08 33.2292 569.008 33.6345 568.955C34.1648 568.886 34.5948 568.835 34.9243 568.801C35.2577 568.763 35.5001 568.701 35.6516 568.614C35.8069 568.527 35.8845 568.375 35.8845 568.159V568.114C35.8845 567.553 35.7311 567.117 35.4243 566.807C35.1213 566.496 34.6611 566.341 34.0436 566.341C33.4035 566.341 32.9016 566.481 32.538 566.761C32.1743 567.042 31.9186 567.341 31.7709 567.659L30.4982 567.205C30.7255 566.674 31.0285 566.261 31.4073 565.966C31.7898 565.667 32.2065 565.458 32.6573 565.341C33.1118 565.22 33.5588 565.159 33.9982 565.159C34.2785 565.159 34.6005 565.193 34.9641 565.261C35.3315 565.326 35.6857 565.46 36.0266 565.665C36.3713 565.869 36.6573 566.178 36.8845 566.591C37.1118 567.004 37.2255 567.557 37.2255 568.25V574H35.8845V572.818H35.8164C35.7255 573.008 35.5739 573.21 35.3618 573.426C35.1497 573.642 34.8675 573.826 34.5152 573.977C34.163 574.129 33.733 574.205 33.2255 574.205ZM33.43 573C33.9603 573 34.4073 572.896 34.7709 572.688C35.1383 572.479 35.4148 572.21 35.6005 571.881C35.7898 571.551 35.8845 571.205 35.8845 570.841V569.614C35.8277 569.682 35.7027 569.744 35.5095 569.801C35.3202 569.854 35.1005 569.902 34.8505 569.943C34.6042 569.981 34.3637 570.015 34.1289 570.045C33.8978 570.072 33.7103 570.095 33.5664 570.114C33.2179 570.159 32.8921 570.233 32.5891 570.335C32.2898 570.434 32.0474 570.583 31.8618 570.784C31.68 570.981 31.5891 571.25 31.5891 571.591C31.5891 572.057 31.7614 572.409 32.1061 572.648C32.4546 572.883 32.8959 573 33.43 573ZM39.3529 574V565.273H40.6484V566.591H40.7393C40.8984 566.159 41.1862 565.809 41.6029 565.54C42.0196 565.271 42.4893 565.136 43.012 565.136C43.1105 565.136 43.2336 565.138 43.3813 565.142C43.529 565.146 43.6408 565.152 43.7165 565.159V566.523C43.6711 566.511 43.5669 566.494 43.404 566.472C43.2449 566.445 43.0764 566.432 42.8984 566.432C42.4741 566.432 42.0953 566.521 41.762 566.699C41.4324 566.873 41.1711 567.116 40.9779 567.426C40.7885 567.733 40.6938 568.083 40.6938 568.477V574H39.3529ZM49.3284 565.273V566.409H44.8056V565.273H49.3284ZM46.1238 563.182H47.4647V571.5C47.4647 571.879 47.5196 572.163 47.6295 572.352C47.7431 572.538 47.8871 572.663 48.0613 572.727C48.2393 572.788 48.4268 572.818 48.6238 572.818C48.7715 572.818 48.8927 572.811 48.9874 572.795C49.0821 572.777 49.1579 572.761 49.2147 572.75L49.4874 573.955C49.3965 573.989 49.2696 574.023 49.1068 574.057C48.9439 574.095 48.7374 574.114 48.4874 574.114C48.1087 574.114 47.7374 574.032 47.3738 573.869C47.014 573.706 46.7147 573.458 46.4761 573.125C46.2412 572.792 46.1238 572.371 46.1238 571.864V563.182ZM52.3663 568.75V574H51.0254V565.273H52.3209V566.636H52.4345C52.639 566.193 52.9496 565.837 53.3663 565.568C53.783 565.295 54.3209 565.159 54.9799 565.159C55.5709 565.159 56.0879 565.28 56.5311 565.523C56.9743 565.761 57.319 566.125 57.5652 566.614C57.8114 567.098 57.9345 567.712 57.9345 568.455V574H56.5936V568.545C56.5936 567.86 56.4155 567.326 56.0595 566.943C55.7034 566.557 55.2148 566.364 54.5936 566.364C54.1655 566.364 53.783 566.456 53.4459 566.642C53.1125 566.828 52.8493 567.098 52.6561 567.455C52.4629 567.811 52.3663 568.242 52.3663 568.75ZM63.7239 574.182C62.883 574.182 62.1576 573.996 61.5477 573.625C60.9417 573.25 60.4739 572.727 60.1443 572.057C59.8186 571.383 59.6557 570.598 59.6557 569.705C59.6557 568.811 59.8186 568.023 60.1443 567.341C60.4739 566.655 60.9322 566.121 61.5193 565.739C62.1102 565.352 62.7996 565.159 63.5875 565.159C64.042 565.159 64.4909 565.235 64.9341 565.386C65.3773 565.538 65.7807 565.784 66.1443 566.125C66.508 566.462 66.7977 566.909 67.0136 567.466C67.2295 568.023 67.3375 568.708 67.3375 569.523V570.091H60.6102V568.932H65.9739C65.9739 568.439 65.8754 568 65.6784 567.614C65.4852 567.227 65.2087 566.922 64.8489 566.699C64.4928 566.475 64.0724 566.364 63.5875 566.364C63.0534 566.364 62.5913 566.496 62.2011 566.761C61.8148 567.023 61.5174 567.364 61.3091 567.784C61.1008 568.205 60.9966 568.655 60.9966 569.136V569.909C60.9966 570.568 61.1102 571.127 61.3375 571.585C61.5686 572.04 61.8886 572.386 62.2977 572.625C62.7068 572.86 63.1822 572.977 63.7239 572.977C64.0761 572.977 64.3943 572.928 64.6784 572.83C64.9663 572.727 65.2144 572.576 65.4227 572.375C65.6311 572.17 65.792 571.917 65.9057 571.614L67.2011 571.977C67.0648 572.417 66.8356 572.803 66.5136 573.136C66.1917 573.466 65.7939 573.723 65.3205 573.909C64.847 574.091 64.3148 574.182 63.7239 574.182ZM69.0573 574V565.273H70.3527V566.591H70.4436C70.6027 566.159 70.8906 565.809 71.3073 565.54C71.7239 565.271 72.1936 565.136 72.7164 565.136C72.8149 565.136 72.938 565.138 73.0857 565.142C73.2334 565.146 73.3452 565.152 73.4209 565.159V566.523C73.3755 566.511 73.2713 566.494 73.1084 566.472C72.9493 566.445 72.7808 566.432 72.6027 566.432C72.1785 566.432 71.7997 566.521 71.4664 566.699C71.1368 566.873 70.8755 567.116 70.6823 567.426C70.4929 567.733 70.3982 568.083 70.3982 568.477V574H69.0573ZM80.8722 567.227L79.6677 567.568C79.5919 567.367 79.4802 567.172 79.3324 566.983C79.1885 566.79 78.9915 566.631 78.7415 566.506C78.4915 566.381 78.1715 566.318 77.7813 566.318C77.2472 566.318 76.8021 566.441 76.4461 566.688C76.0938 566.93 75.9177 567.239 75.9177 567.614C75.9177 567.947 76.0389 568.21 76.2813 568.403C76.5237 568.597 76.9025 568.758 77.4177 568.886L78.7131 569.205C79.4934 569.394 80.0749 569.684 80.4574 570.074C80.84 570.46 81.0313 570.958 81.0313 571.568C81.0313 572.068 80.8874 572.515 80.5995 572.909C80.3154 573.303 79.9177 573.614 79.4063 573.841C78.8949 574.068 78.3002 574.182 77.6222 574.182C76.7321 574.182 75.9953 573.989 75.412 573.602C74.8287 573.216 74.4593 572.652 74.304 571.909L75.5768 571.591C75.698 572.061 75.9271 572.413 76.2643 572.648C76.6052 572.883 77.0502 573 77.5995 573C78.2245 573 78.7207 572.867 79.0881 572.602C79.4593 572.333 79.6449 572.011 79.6449 571.636C79.6449 571.333 79.5389 571.08 79.3268 570.875C79.1146 570.667 78.7889 570.511 78.3495 570.409L76.8949 570.068C76.0957 569.879 75.5086 569.585 75.1336 569.188C74.7624 568.786 74.5768 568.284 74.5768 567.682C74.5768 567.189 74.715 566.754 74.9915 566.375C75.2718 565.996 75.6525 565.699 76.1336 565.483C76.6184 565.267 77.1677 565.159 77.7813 565.159C78.6449 565.159 79.323 565.348 79.8154 565.727C80.3116 566.106 80.6639 566.606 80.8722 567.227ZM84.0707 568.75V574H82.7298V562.364H84.0707V566.636H84.1843C84.3889 566.186 84.6957 565.828 85.1048 565.562C85.5177 565.294 86.0669 565.159 86.7525 565.159C87.3472 565.159 87.868 565.278 88.315 565.517C88.762 565.752 89.1086 566.114 89.3548 566.602C89.6048 567.087 89.7298 567.705 89.7298 568.455V574H88.3889V568.545C88.3889 567.852 88.2089 567.316 87.8491 566.938C87.493 566.555 86.9987 566.364 86.3661 566.364C85.9267 566.364 85.5328 566.456 85.1843 566.642C84.8396 566.828 84.5669 567.098 84.3661 567.455C84.1692 567.811 84.0707 568.242 84.0707 568.75ZM91.8629 574V565.273H93.2038V574H91.8629ZM92.5447 563.818C92.2834 563.818 92.058 563.729 91.8686 563.551C91.683 563.373 91.5902 563.159 91.5902 562.909C91.5902 562.659 91.683 562.445 91.8686 562.267C92.058 562.089 92.2834 562 92.5447 562C92.8061 562 93.0296 562.089 93.2152 562.267C93.4046 562.445 93.4993 562.659 93.4993 562.909C93.4993 563.159 93.4046 563.373 93.2152 563.551C93.0296 563.729 92.8061 563.818 92.5447 563.818ZM95.3398 577.273V565.273H96.6352V566.659H96.7943C96.8928 566.508 97.0292 566.314 97.2034 566.08C97.3814 565.841 97.6352 565.629 97.9648 565.443C98.2981 565.254 98.7489 565.159 99.317 565.159C100.052 565.159 100.7 565.343 101.26 565.71C101.821 566.078 102.258 566.598 102.573 567.273C102.887 567.947 103.044 568.742 103.044 569.659C103.044 570.583 102.887 571.384 102.573 572.062C102.258 572.737 101.823 573.259 101.266 573.631C100.709 573.998 100.067 574.182 99.3398 574.182C98.7792 574.182 98.3303 574.089 97.9932 573.903C97.6561 573.714 97.3966 573.5 97.2148 573.261C97.033 573.019 96.8928 572.818 96.7943 572.659H96.6807V577.273H95.3398ZM96.658 569.636C96.658 570.295 96.7545 570.877 96.9477 571.381C97.1409 571.881 97.4231 572.273 97.7943 572.557C98.1655 572.837 98.6201 572.977 99.158 572.977C99.7186 572.977 100.186 572.83 100.561 572.534C100.94 572.235 101.224 571.833 101.414 571.33C101.607 570.822 101.703 570.258 101.703 569.636C101.703 569.023 101.609 568.47 101.419 567.977C101.234 567.481 100.952 567.089 100.573 566.801C100.198 566.509 99.7261 566.364 99.158 566.364C98.6125 566.364 98.1542 566.502 97.783 566.778C97.4117 567.051 97.1314 567.434 96.942 567.926C96.7527 568.415 96.658 568.985 96.658 569.636ZM110.952 567.227L109.747 567.568C109.671 567.367 109.56 567.172 109.412 566.983C109.268 566.79 109.071 566.631 108.821 566.506C108.571 566.381 108.251 566.318 107.861 566.318C107.327 566.318 106.882 566.441 106.525 566.688C106.173 566.93 105.997 567.239 105.997 567.614C105.997 567.947 106.118 568.21 106.361 568.403C106.603 568.597 106.982 568.758 107.497 568.886L108.793 569.205C109.573 569.394 110.154 569.684 110.537 570.074C110.919 570.46 111.111 570.958 111.111 571.568C111.111 572.068 110.967 572.515 110.679 572.909C110.395 573.303 109.997 573.614 109.486 573.841C108.974 574.068 108.38 574.182 107.702 574.182C106.811 574.182 106.075 573.989 105.491 573.602C104.908 573.216 104.539 572.652 104.383 571.909L105.656 571.591C105.777 572.061 106.007 572.413 106.344 572.648C106.685 572.883 107.13 573 107.679 573C108.304 573 108.8 572.867 109.168 572.602C109.539 572.333 109.724 572.011 109.724 571.636C109.724 571.333 109.618 571.08 109.406 570.875C109.194 570.667 108.868 570.511 108.429 570.409L106.974 570.068C106.175 569.879 105.588 569.585 105.213 569.188C104.842 568.786 104.656 568.284 104.656 567.682C104.656 567.189 104.794 566.754 105.071 566.375C105.351 565.996 105.732 565.699 106.213 565.483C106.698 565.267 107.247 565.159 107.861 565.159C108.724 565.159 109.402 565.348 109.895 565.727C110.391 566.106 110.743 566.606 110.952 567.227ZM119.557 574.205C119.004 574.205 118.502 574.1 118.052 573.892C117.601 573.68 117.243 573.375 116.978 572.977C116.713 572.576 116.58 572.091 116.58 571.523C116.58 571.023 116.679 570.617 116.876 570.307C117.072 569.992 117.336 569.746 117.665 569.568C117.995 569.39 118.358 569.258 118.756 569.17C119.158 569.08 119.561 569.008 119.966 568.955C120.497 568.886 120.927 568.835 121.256 568.801C121.59 568.763 121.832 568.701 121.983 568.614C122.139 568.527 122.216 568.375 122.216 568.159V568.114C122.216 567.553 122.063 567.117 121.756 566.807C121.453 566.496 120.993 566.341 120.376 566.341C119.735 566.341 119.233 566.481 118.87 566.761C118.506 567.042 118.251 567.341 118.103 567.659L116.83 567.205C117.057 566.674 117.36 566.261 117.739 565.966C118.122 565.667 118.538 565.458 118.989 565.341C119.444 565.22 119.891 565.159 120.33 565.159C120.61 565.159 120.932 565.193 121.296 565.261C121.663 565.326 122.018 565.46 122.358 565.665C122.703 565.869 122.989 566.178 123.216 566.591C123.444 567.004 123.557 567.557 123.557 568.25V574H122.216V572.818H122.148C122.057 573.008 121.906 573.21 121.694 573.426C121.482 573.642 121.199 573.826 120.847 573.977C120.495 574.129 120.065 574.205 119.557 574.205ZM119.762 573C120.292 573 120.739 572.896 121.103 572.688C121.47 572.479 121.747 572.21 121.932 571.881C122.122 571.551 122.216 571.205 122.216 570.841V569.614C122.16 569.682 122.035 569.744 121.841 569.801C121.652 569.854 121.432 569.902 121.182 569.943C120.936 569.981 120.696 570.015 120.461 570.045C120.23 570.072 120.042 570.095 119.898 570.114C119.55 570.159 119.224 570.233 118.921 570.335C118.622 570.434 118.379 570.583 118.194 570.784C118.012 570.981 117.921 571.25 117.921 571.591C117.921 572.057 118.093 572.409 118.438 572.648C118.786 572.883 119.228 573 119.762 573ZM127.026 568.75V574H125.685V565.273H126.98V566.636H127.094C127.298 566.193 127.609 565.837 128.026 565.568C128.442 565.295 128.98 565.159 129.639 565.159C130.23 565.159 130.747 565.28 131.19 565.523C131.634 565.761 131.978 566.125 132.225 566.614C132.471 567.098 132.594 567.712 132.594 568.455V574H131.253V568.545C131.253 567.86 131.075 567.326 130.719 566.943C130.363 566.557 129.874 566.364 129.253 566.364C128.825 566.364 128.442 566.456 128.105 566.642C127.772 566.828 127.509 567.098 127.315 567.455C127.122 567.811 127.026 568.242 127.026 568.75ZM138.02 574.182C137.292 574.182 136.65 573.998 136.093 573.631C135.537 573.259 135.101 572.737 134.787 572.062C134.472 571.384 134.315 570.583 134.315 569.659C134.315 568.742 134.472 567.947 134.787 567.273C135.101 566.598 135.539 566.078 136.099 565.71C136.66 565.343 137.307 565.159 138.042 565.159C138.611 565.159 139.059 565.254 139.389 565.443C139.722 565.629 139.976 565.841 140.15 566.08C140.328 566.314 140.467 566.508 140.565 566.659H140.679V562.364H142.02V574H140.724V572.659H140.565C140.467 572.818 140.326 573.019 140.145 573.261C139.963 573.5 139.703 573.714 139.366 573.903C139.029 574.089 138.58 574.182 138.02 574.182ZM138.201 572.977C138.739 572.977 139.194 572.837 139.565 572.557C139.936 572.273 140.218 571.881 140.412 571.381C140.605 570.877 140.701 570.295 140.701 569.636C140.701 568.985 140.607 568.415 140.417 567.926C140.228 567.434 139.948 567.051 139.576 566.778C139.205 566.502 138.747 566.364 138.201 566.364C137.633 566.364 137.16 566.509 136.781 566.801C136.406 567.089 136.124 567.481 135.934 567.977C135.749 568.47 135.656 569.023 135.656 569.636C135.656 570.258 135.751 570.822 135.94 571.33C136.133 571.833 136.417 572.235 136.792 572.534C137.171 572.83 137.641 572.977 138.201 572.977ZM148.522 574V565.273H149.863V574H148.522ZM149.203 563.818C148.942 563.818 148.717 563.729 148.527 563.551C148.342 563.373 148.249 563.159 148.249 562.909C148.249 562.659 148.342 562.445 148.527 562.267C148.717 562.089 148.942 562 149.203 562C149.465 562 149.688 562.089 149.874 562.267C150.063 562.445 150.158 562.659 150.158 562.909C150.158 563.159 150.063 563.373 149.874 563.551C149.688 563.729 149.465 563.818 149.203 563.818ZM153.339 568.75V574H151.999V565.273H153.294V566.636H153.408C153.612 566.193 153.923 565.837 154.339 565.568C154.756 565.295 155.294 565.159 155.953 565.159C156.544 565.159 157.061 565.28 157.504 565.523C157.947 565.761 158.292 566.125 158.538 566.614C158.785 567.098 158.908 567.712 158.908 568.455V574H157.567V568.545C157.567 567.86 157.389 567.326 157.033 566.943C156.677 566.557 156.188 566.364 155.567 566.364C155.139 566.364 154.756 566.456 154.419 566.642C154.086 566.828 153.822 567.098 153.629 567.455C153.436 567.811 153.339 568.242 153.339 568.75ZM161.038 574V565.273H162.379V574H161.038ZM161.72 563.818C161.458 563.818 161.233 563.729 161.044 563.551C160.858 563.373 160.765 563.159 160.765 562.909C160.765 562.659 160.858 562.445 161.044 562.267C161.233 562.089 161.458 562 161.72 562C161.981 562 162.205 562.089 162.39 562.267C162.58 562.445 162.674 562.659 162.674 562.909C162.674 563.159 162.58 563.373 162.39 563.551C162.205 563.729 161.981 563.818 161.72 563.818ZM168.31 565.273V566.409H163.788V565.273H168.31ZM165.106 563.182H166.447V571.5C166.447 571.879 166.502 572.163 166.611 572.352C166.725 572.538 166.869 572.663 167.043 572.727C167.221 572.788 167.409 572.818 167.606 572.818C167.753 572.818 167.875 572.811 167.969 572.795C168.064 572.777 168.14 572.761 168.197 572.75L168.469 573.955C168.378 573.989 168.252 574.023 168.089 574.057C167.926 574.095 167.719 574.114 167.469 574.114C167.091 574.114 166.719 574.032 166.356 573.869C165.996 573.706 165.697 573.458 165.458 573.125C165.223 572.792 165.106 572.371 165.106 571.864V563.182ZM170.007 574V565.273H171.348V574H170.007ZM170.689 563.818C170.428 563.818 170.202 563.729 170.013 563.551C169.827 563.373 169.735 563.159 169.735 562.909C169.735 562.659 169.827 562.445 170.013 562.267C170.202 562.089 170.428 562 170.689 562C170.95 562 171.174 562.089 171.36 562.267C171.549 562.445 171.644 562.659 171.644 562.909C171.644 563.159 171.549 563.373 171.36 563.551C171.174 563.729 170.95 563.818 170.689 563.818ZM176.052 574.205C175.499 574.205 174.997 574.1 174.547 573.892C174.096 573.68 173.738 573.375 173.473 572.977C173.208 572.576 173.075 572.091 173.075 571.523C173.075 571.023 173.174 570.617 173.371 570.307C173.567 569.992 173.831 569.746 174.16 569.568C174.49 569.39 174.853 569.258 175.251 569.17C175.653 569.08 176.056 569.008 176.461 568.955C176.992 568.886 177.422 568.835 177.751 568.801C178.085 568.763 178.327 568.701 178.478 568.614C178.634 568.527 178.711 568.375 178.711 568.159V568.114C178.711 567.553 178.558 567.117 178.251 566.807C177.948 566.496 177.488 566.341 176.871 566.341C176.23 566.341 175.728 566.481 175.365 566.761C175.001 567.042 174.746 567.341 174.598 567.659L173.325 567.205C173.552 566.674 173.855 566.261 174.234 565.966C174.617 565.667 175.033 565.458 175.484 565.341C175.939 565.22 176.386 565.159 176.825 565.159C177.105 565.159 177.427 565.193 177.791 565.261C178.158 565.326 178.513 565.46 178.853 565.665C179.198 565.869 179.484 566.178 179.711 566.591C179.939 567.004 180.052 567.557 180.052 568.25V574H178.711V572.818H178.643C178.552 573.008 178.401 573.21 178.189 573.426C177.977 573.642 177.694 573.826 177.342 573.977C176.99 574.129 176.56 574.205 176.052 574.205ZM176.257 573C176.787 573 177.234 572.896 177.598 572.688C177.965 572.479 178.242 572.21 178.427 571.881C178.617 571.551 178.711 571.205 178.711 570.841V569.614C178.655 569.682 178.53 569.744 178.336 569.801C178.147 569.854 177.927 569.902 177.677 569.943C177.431 569.981 177.191 570.015 176.956 570.045C176.725 570.072 176.537 570.095 176.393 570.114C176.045 570.159 175.719 570.233 175.416 570.335C175.117 570.434 174.874 570.583 174.689 570.784C174.507 570.981 174.416 571.25 174.416 571.591C174.416 572.057 174.588 572.409 174.933 572.648C175.282 572.883 175.723 573 176.257 573ZM185.975 565.273V566.409H181.452V565.273H185.975ZM182.771 563.182H184.112V571.5C184.112 571.879 184.167 572.163 184.276 572.352C184.39 572.538 184.534 572.663 184.708 572.727C184.886 572.788 185.074 572.818 185.271 572.818C185.418 572.818 185.54 572.811 185.634 572.795C185.729 572.777 185.805 572.761 185.862 572.75L186.134 573.955C186.043 573.989 185.917 574.023 185.754 574.057C185.591 574.095 185.384 574.114 185.134 574.114C184.756 574.114 184.384 574.032 184.021 573.869C183.661 573.706 183.362 573.458 183.123 573.125C182.888 572.792 182.771 572.371 182.771 571.864V563.182ZM187.672 574V565.273H189.013V574H187.672ZM188.354 563.818C188.093 563.818 187.867 563.729 187.678 563.551C187.492 563.373 187.4 563.159 187.4 562.909C187.4 562.659 187.492 562.445 187.678 562.267C187.867 562.089 188.093 562 188.354 562C188.615 562 188.839 562.089 189.025 562.267C189.214 562.445 189.309 562.659 189.309 562.909C189.309 563.159 189.214 563.373 189.025 563.551C188.839 563.729 188.615 563.818 188.354 563.818ZM192.49 568.75V574H191.149V565.273H192.445V566.636H192.558C192.763 566.193 193.073 565.837 193.49 565.568C193.907 565.295 194.445 565.159 195.104 565.159C195.695 565.159 196.212 565.28 196.655 565.523C197.098 565.761 197.443 566.125 197.689 566.614C197.935 567.098 198.058 567.712 198.058 568.455V574H196.717V568.545C196.717 567.86 196.539 567.326 196.183 566.943C195.827 566.557 195.339 566.364 194.717 566.364C194.289 566.364 193.907 566.456 193.57 566.642C193.236 566.828 192.973 567.098 192.78 567.455C192.587 567.811 192.49 568.242 192.49 568.75ZM203.711 577.455C203.064 577.455 202.507 577.371 202.041 577.205C201.575 577.042 201.187 576.826 200.876 576.557C200.569 576.292 200.325 576.008 200.143 575.705L201.211 574.955C201.332 575.114 201.486 575.295 201.671 575.5C201.857 575.708 202.111 575.888 202.433 576.04C202.759 576.195 203.185 576.273 203.711 576.273C204.416 576.273 204.997 576.102 205.456 575.761C205.914 575.42 206.143 574.886 206.143 574.159V572.386H206.029C205.931 572.545 205.791 572.742 205.609 572.977C205.431 573.208 205.173 573.415 204.836 573.597C204.503 573.775 204.052 573.864 203.484 573.864C202.779 573.864 202.147 573.697 201.586 573.364C201.029 573.03 200.588 572.545 200.262 571.909C199.94 571.273 199.779 570.5 199.779 569.591C199.779 568.697 199.937 567.919 200.251 567.256C200.565 566.589 201.003 566.074 201.564 565.71C202.124 565.343 202.772 565.159 203.507 565.159C204.075 565.159 204.526 565.254 204.859 565.443C205.196 565.629 205.454 565.841 205.632 566.08C205.814 566.314 205.954 566.508 206.052 566.659H206.189V565.273H207.484V574.25C207.484 575 207.314 575.61 206.973 576.08C206.635 576.553 206.181 576.9 205.609 577.119C205.041 577.343 204.408 577.455 203.711 577.455ZM203.666 572.659C204.204 572.659 204.658 572.536 205.029 572.29C205.401 572.044 205.683 571.689 205.876 571.227C206.069 570.765 206.166 570.212 206.166 569.568C206.166 568.939 206.071 568.384 205.882 567.903C205.692 567.422 205.412 567.045 205.041 566.773C204.67 566.5 204.211 566.364 203.666 566.364C203.098 566.364 202.624 566.508 202.245 566.795C201.87 567.083 201.588 567.47 201.399 567.955C201.213 568.439 201.12 568.977 201.12 569.568C201.12 570.174 201.215 570.71 201.404 571.176C201.598 571.638 201.882 572.002 202.257 572.267C202.635 572.528 203.105 572.659 203.666 572.659ZM217.344 574.182C216.526 574.182 215.821 573.989 215.23 573.602C214.639 573.216 214.185 572.684 213.867 572.006C213.549 571.328 213.389 570.553 213.389 569.682C213.389 568.795 213.552 568.013 213.878 567.335C214.208 566.653 214.666 566.121 215.253 565.739C215.844 565.352 216.533 565.159 217.321 565.159C217.935 565.159 218.488 565.273 218.98 565.5C219.473 565.727 219.876 566.045 220.191 566.455C220.505 566.864 220.7 567.341 220.776 567.886H219.435C219.333 567.489 219.105 567.136 218.753 566.83C218.405 566.519 217.935 566.364 217.344 566.364C216.821 566.364 216.363 566.5 215.969 566.773C215.579 567.042 215.274 567.422 215.054 567.915C214.838 568.403 214.73 568.977 214.73 569.636C214.73 570.311 214.836 570.898 215.049 571.398C215.264 571.898 215.567 572.286 215.958 572.562C216.352 572.839 216.814 572.977 217.344 572.977C217.692 572.977 218.009 572.917 218.293 572.795C218.577 572.674 218.817 572.5 219.014 572.273C219.211 572.045 219.352 571.773 219.435 571.455H220.776C220.7 571.97 220.513 572.434 220.213 572.847C219.918 573.256 219.526 573.581 219.037 573.824C218.552 574.062 217.988 574.182 217.344 574.182ZM225.961 574.182C225.174 574.182 224.482 573.994 223.888 573.619C223.297 573.244 222.835 572.72 222.501 572.045C222.172 571.371 222.007 570.583 222.007 569.682C222.007 568.773 222.172 567.979 222.501 567.301C222.835 566.623 223.297 566.097 223.888 565.722C224.482 565.347 225.174 565.159 225.961 565.159C226.749 565.159 227.439 565.347 228.03 565.722C228.624 566.097 229.086 566.623 229.416 567.301C229.749 567.979 229.916 568.773 229.916 569.682C229.916 570.583 229.749 571.371 229.416 572.045C229.086 572.72 228.624 573.244 228.03 573.619C227.439 573.994 226.749 574.182 225.961 574.182ZM225.961 572.977C226.56 572.977 227.052 572.824 227.439 572.517C227.825 572.21 228.111 571.807 228.297 571.307C228.482 570.807 228.575 570.265 228.575 569.682C228.575 569.098 228.482 568.555 228.297 568.051C228.111 567.547 227.825 567.14 227.439 566.83C227.052 566.519 226.56 566.364 225.961 566.364C225.363 566.364 224.871 566.519 224.484 566.83C224.098 567.14 223.812 567.547 223.626 568.051C223.441 568.555 223.348 569.098 223.348 569.682C223.348 570.265 223.441 570.807 223.626 571.307C223.812 571.807 224.098 572.21 224.484 572.517C224.871 572.824 225.363 572.977 225.961 572.977ZM231.643 574V565.273H232.938V566.636H233.052C233.234 566.17 233.527 565.809 233.933 565.551C234.338 565.29 234.825 565.159 235.393 565.159C235.969 565.159 236.448 565.29 236.83 565.551C237.217 565.809 237.518 566.17 237.734 566.636H237.825C238.048 566.186 238.383 565.828 238.83 565.562C239.277 565.294 239.813 565.159 240.438 565.159C241.219 565.159 241.857 565.403 242.353 565.892C242.849 566.377 243.097 567.133 243.097 568.159V574H241.757V568.159C241.757 567.515 241.58 567.055 241.228 566.778C240.876 566.502 240.461 566.364 239.984 566.364C239.37 566.364 238.895 566.549 238.558 566.92C238.221 567.288 238.052 567.754 238.052 568.318V574H236.688V568.023C236.688 567.527 236.527 567.127 236.205 566.824C235.883 566.517 235.469 566.364 234.961 566.364C234.613 566.364 234.287 566.456 233.984 566.642C233.685 566.828 233.442 567.085 233.257 567.415C233.075 567.741 232.984 568.117 232.984 568.545V574H231.643ZM245.229 574V565.273H246.525V566.636H246.638C246.82 566.17 247.114 565.809 247.519 565.551C247.924 565.29 248.411 565.159 248.979 565.159C249.555 565.159 250.034 565.29 250.417 565.551C250.803 565.809 251.104 566.17 251.32 566.636H251.411C251.634 566.186 251.97 565.828 252.417 565.562C252.864 565.294 253.4 565.159 254.025 565.159C254.805 565.159 255.443 565.403 255.939 565.892C256.436 566.377 256.684 567.133 256.684 568.159V574H255.343V568.159C255.343 567.515 255.167 567.055 254.814 566.778C254.462 566.502 254.047 566.364 253.57 566.364C252.956 566.364 252.481 566.549 252.144 566.92C251.807 567.288 251.638 567.754 251.638 568.318V574H250.275V568.023C250.275 567.527 250.114 567.127 249.792 566.824C249.47 566.517 249.055 566.364 248.547 566.364C248.199 566.364 247.873 566.456 247.57 566.642C247.271 566.828 247.028 567.085 246.843 567.415C246.661 567.741 246.57 568.117 246.57 568.545V574H245.229ZM264.315 570.432V565.273H265.656V574H264.315V572.523H264.224C264.02 572.966 263.702 573.343 263.27 573.653C262.838 573.96 262.293 574.114 261.634 574.114C261.088 574.114 260.603 573.994 260.179 573.756C259.755 573.513 259.421 573.15 259.179 572.665C258.937 572.176 258.815 571.561 258.815 570.818V565.273H260.156V570.727C260.156 571.364 260.334 571.871 260.69 572.25C261.05 572.629 261.509 572.818 262.065 572.818C262.399 572.818 262.738 572.733 263.082 572.562C263.431 572.392 263.723 572.131 263.957 571.778C264.196 571.426 264.315 570.977 264.315 570.432ZM269.133 568.75V574H267.792V565.273H269.088V566.636H269.201C269.406 566.193 269.717 565.837 270.133 565.568C270.55 565.295 271.088 565.159 271.747 565.159C272.338 565.159 272.855 565.28 273.298 565.523C273.741 565.761 274.086 566.125 274.332 566.614C274.578 567.098 274.701 567.712 274.701 568.455V574H273.36V568.545C273.36 567.86 273.182 567.326 272.826 566.943C272.47 566.557 271.982 566.364 271.36 566.364C270.932 566.364 270.55 566.456 270.213 566.642C269.879 566.828 269.616 567.098 269.423 567.455C269.23 567.811 269.133 568.242 269.133 568.75ZM276.832 574V565.273H278.173V574H276.832ZM277.513 563.818C277.252 563.818 277.027 563.729 276.837 563.551C276.652 563.373 276.559 563.159 276.559 562.909C276.559 562.659 276.652 562.445 276.837 562.267C277.027 562.089 277.252 562 277.513 562C277.775 562 277.998 562.089 278.184 562.267C278.373 562.445 278.468 562.659 278.468 562.909C278.468 563.159 278.373 563.373 278.184 563.551C277.998 563.729 277.775 563.818 277.513 563.818ZM284.104 565.273V566.409H279.581V565.273H284.104ZM280.899 563.182H282.24V571.5C282.24 571.879 282.295 572.163 282.405 572.352C282.519 572.538 282.663 572.663 282.837 572.727C283.015 572.788 283.202 572.818 283.399 572.818C283.547 572.818 283.668 572.811 283.763 572.795C283.858 572.777 283.934 572.761 283.99 572.75L284.263 573.955C284.172 573.989 284.045 574.023 283.882 574.057C283.719 574.095 283.513 574.114 283.263 574.114C282.884 574.114 282.513 574.032 282.149 573.869C281.79 573.706 281.49 573.458 281.252 573.125C281.017 572.792 280.899 572.371 280.899 571.864V563.182ZM286.665 577.273C286.437 577.273 286.235 577.254 286.057 577.216C285.879 577.182 285.756 577.148 285.687 577.114L286.028 575.932C286.354 576.015 286.642 576.045 286.892 576.023C287.142 576 287.364 575.888 287.557 575.688C287.754 575.491 287.934 575.17 288.096 574.727L288.346 574.045L285.119 565.273H286.574L288.983 572.227H289.074L291.483 565.273H292.937L289.233 575.273C289.066 575.723 288.86 576.097 288.614 576.392C288.367 576.691 288.081 576.913 287.756 577.057C287.434 577.201 287.07 577.273 286.665 577.273ZM24.8864 604.182C24.0455 604.182 23.3201 603.996 22.7102 603.625C22.1042 603.25 21.6364 602.727 21.3068 602.057C20.9811 601.383 20.8182 600.598 20.8182 599.705C20.8182 598.811 20.9811 598.023 21.3068 597.341C21.6364 596.655 22.0947 596.121 22.6818 595.739C23.2727 595.352 23.9621 595.159 24.75 595.159C25.2045 595.159 25.6534 595.235 26.0966 595.386C26.5398 595.538 26.9432 595.784 27.3068 596.125C27.6705 596.462 27.9602 596.909 28.1761 597.466C28.392 598.023 28.5 598.708 28.5 599.523V600.091H21.7727V598.932H27.1364C27.1364 598.439 27.0379 598 26.8409 597.614C26.6477 597.227 26.3712 596.922 26.0114 596.699C25.6553 596.475 25.2348 596.364 24.75 596.364C24.2159 596.364 23.7538 596.496 23.3636 596.761C22.9773 597.023 22.6799 597.364 22.4716 597.784C22.2633 598.205 22.1591 598.655 22.1591 599.136V599.909C22.1591 600.568 22.2727 601.127 22.5 601.585C22.7311 602.04 23.0511 602.386 23.4602 602.625C23.8693 602.86 24.3447 602.977 24.8864 602.977C25.2386 602.977 25.5568 602.928 25.8409 602.83C26.1288 602.727 26.3769 602.576 26.5852 602.375C26.7936 602.17 26.9545 601.917 27.0682 601.614L28.3636 601.977C28.2273 602.417 27.9981 602.803 27.6761 603.136C27.3542 603.466 26.9564 603.723 26.483 603.909C26.0095 604.091 25.4773 604.182 24.8864 604.182ZM31.5607 598.75V604H30.2198V595.273H31.5152V596.636H31.6289C31.8334 596.193 32.144 595.837 32.5607 595.568C32.9773 595.295 33.5152 595.159 34.1743 595.159C34.7652 595.159 35.2823 595.28 35.7255 595.523C36.1686 595.761 36.5133 596.125 36.7595 596.614C37.0058 597.098 37.1289 597.712 37.1289 598.455V604H35.788V598.545C35.788 597.86 35.6099 597.326 35.2539 596.943C34.8978 596.557 34.4092 596.364 33.788 596.364C33.3599 596.364 32.9773 596.456 32.6402 596.642C32.3069 596.828 32.0436 597.098 31.8505 597.455C31.6573 597.811 31.5607 598.242 31.5607 598.75ZM42.7819 607.455C42.1341 607.455 41.5773 607.371 41.1114 607.205C40.6455 607.042 40.2573 606.826 39.9466 606.557C39.6398 606.292 39.3955 606.008 39.2137 605.705L40.2819 604.955C40.4031 605.114 40.5565 605.295 40.7421 605.5C40.9277 605.708 41.1815 605.888 41.5035 606.04C41.8292 606.195 42.2554 606.273 42.7819 606.273C43.4864 606.273 44.0679 606.102 44.5262 605.761C44.9845 605.42 45.2137 604.886 45.2137 604.159V602.386H45.1001C45.0016 602.545 44.8614 602.742 44.6796 602.977C44.5016 603.208 44.244 603.415 43.9069 603.597C43.5735 603.775 43.1228 603.864 42.5546 603.864C41.8501 603.864 41.2175 603.697 40.6569 603.364C40.1001 603.03 39.6588 602.545 39.333 601.909C39.011 601.273 38.8501 600.5 38.8501 599.591C38.8501 598.697 39.0073 597.919 39.3216 597.256C39.636 596.589 40.0735 596.074 40.6341 595.71C41.1948 595.343 41.8425 595.159 42.5773 595.159C43.1455 595.159 43.5963 595.254 43.9296 595.443C44.2667 595.629 44.5243 595.841 44.7023 596.08C44.8841 596.314 45.0243 596.508 45.1228 596.659H45.2591V595.273H46.5546V604.25C46.5546 605 46.3841 605.61 46.0432 606.08C45.7061 606.553 45.2516 606.9 44.6796 607.119C44.1114 607.343 43.4788 607.455 42.7819 607.455ZM42.7364 602.659C43.2743 602.659 43.7288 602.536 44.1001 602.29C44.4713 602.044 44.7535 601.689 44.9466 601.227C45.1398 600.765 45.2364 600.212 45.2364 599.568C45.2364 598.939 45.1417 598.384 44.9523 597.903C44.7629 597.422 44.4826 597.045 44.1114 596.773C43.7402 596.5 43.2819 596.364 42.7364 596.364C42.1682 596.364 41.6948 596.508 41.316 596.795C40.941 597.083 40.6588 597.47 40.4694 597.955C40.2838 598.439 40.191 598.977 40.191 599.568C40.191 600.174 40.2857 600.71 40.4751 601.176C40.6682 601.638 40.9523 602.002 41.3273 602.267C41.7061 602.528 42.1758 602.659 42.7364 602.659ZM51.2573 604.205C50.7043 604.205 50.2024 604.1 49.7516 603.892C49.3009 603.68 48.9429 603.375 48.6778 602.977C48.4126 602.576 48.2801 602.091 48.2801 601.523C48.2801 601.023 48.3785 600.617 48.5755 600.307C48.7725 599.992 49.0357 599.746 49.3653 599.568C49.6948 599.39 50.0585 599.258 50.4562 599.17C50.8577 599.08 51.2611 599.008 51.6664 598.955C52.1967 598.886 52.6266 598.835 52.9562 598.801C53.2895 598.763 53.532 598.701 53.6835 598.614C53.8388 598.527 53.9164 598.375 53.9164 598.159V598.114C53.9164 597.553 53.763 597.117 53.4562 596.807C53.1532 596.496 52.6929 596.341 52.0755 596.341C51.4354 596.341 50.9335 596.481 50.5698 596.761C50.2062 597.042 49.9505 597.341 49.8028 597.659L48.5301 597.205C48.7573 596.674 49.0604 596.261 49.4391 595.966C49.8217 595.667 50.2384 595.458 50.6891 595.341C51.1437 595.22 51.5907 595.159 52.0301 595.159C52.3104 595.159 52.6323 595.193 52.996 595.261C53.3634 595.326 53.7176 595.46 54.0585 595.665C54.4032 595.869 54.6891 596.178 54.9164 596.591C55.1437 597.004 55.2573 597.557 55.2573 598.25V604H53.9164V602.818H53.8482C53.7573 603.008 53.6058 603.21 53.3937 603.426C53.1816 603.642 52.8994 603.826 52.5471 603.977C52.1948 604.129 51.7649 604.205 51.2573 604.205ZM51.4619 603C51.9922 603 52.4391 602.896 52.8028 602.688C53.1702 602.479 53.4467 602.21 53.6323 601.881C53.8217 601.551 53.9164 601.205 53.9164 600.841V599.614C53.8596 599.682 53.7346 599.744 53.5414 599.801C53.352 599.854 53.1323 599.902 52.8823 599.943C52.6361 599.981 52.3956 600.015 52.1607 600.045C51.9297 600.072 51.7422 600.095 51.5982 600.114C51.2498 600.159 50.924 600.233 50.621 600.335C50.3217 600.434 50.0793 600.583 49.8937 600.784C49.7119 600.981 49.621 601.25 49.621 601.591C49.621 602.057 49.7933 602.409 50.138 602.648C50.4865 602.883 50.9278 603 51.4619 603ZM60.9075 607.455C60.2598 607.455 59.703 607.371 59.237 607.205C58.7711 607.042 58.3829 606.826 58.0723 606.557C57.7655 606.292 57.5211 606.008 57.3393 605.705L58.4075 604.955C58.5287 605.114 58.6821 605.295 58.8677 605.5C59.0533 605.708 59.3071 605.888 59.6291 606.04C59.9548 606.195 60.381 606.273 60.9075 606.273C61.612 606.273 62.1935 606.102 62.6518 605.761C63.1102 605.42 63.3393 604.886 63.3393 604.159V602.386H63.2257C63.1272 602.545 62.987 602.742 62.8052 602.977C62.6272 603.208 62.3696 603.415 62.0325 603.597C61.6992 603.775 61.2484 603.864 60.6802 603.864C59.9757 603.864 59.3431 603.697 58.7825 603.364C58.2257 603.03 57.7844 602.545 57.4586 601.909C57.1367 601.273 56.9757 600.5 56.9757 599.591C56.9757 598.697 57.1329 597.919 57.4473 597.256C57.7617 596.589 58.1992 596.074 58.7598 595.71C59.3204 595.343 59.9681 595.159 60.703 595.159C61.2711 595.159 61.7219 595.254 62.0552 595.443C62.3924 595.629 62.6499 595.841 62.828 596.08C63.0098 596.314 63.1499 596.508 63.2484 596.659H63.3848V595.273H64.6802V604.25C64.6802 605 64.5098 605.61 64.1689 606.08C63.8317 606.553 63.3772 606.9 62.8052 607.119C62.237 607.343 61.6045 607.455 60.9075 607.455ZM60.862 602.659C61.3999 602.659 61.8545 602.536 62.2257 602.29C62.5969 602.044 62.8791 601.689 63.0723 601.227C63.2655 600.765 63.362 600.212 63.362 599.568C63.362 598.939 63.2673 598.384 63.078 597.903C62.8886 597.422 62.6083 597.045 62.237 596.773C61.8658 596.5 61.4075 596.364 60.862 596.364C60.2939 596.364 59.8204 596.508 59.4416 596.795C59.0666 597.083 58.7844 597.47 58.595 597.955C58.4094 598.439 58.3166 598.977 58.3166 599.568C58.3166 600.174 58.4113 600.71 58.6007 601.176C58.7939 601.638 59.078 602.002 59.453 602.267C59.8317 602.528 60.3014 602.659 60.862 602.659ZM70.4739 604.182C69.633 604.182 68.9076 603.996 68.2977 603.625C67.6917 603.25 67.2239 602.727 66.8943 602.057C66.5686 601.383 66.4057 600.598 66.4057 599.705C66.4057 598.811 66.5686 598.023 66.8943 597.341C67.2239 596.655 67.6822 596.121 68.2693 595.739C68.8602 595.352 69.5496 595.159 70.3375 595.159C70.792 595.159 71.2409 595.235 71.6841 595.386C72.1273 595.538 72.5307 595.784 72.8943 596.125C73.258 596.462 73.5477 596.909 73.7636 597.466C73.9795 598.023 74.0875 598.708 74.0875 599.523V600.091H67.3602V598.932H72.7239C72.7239 598.439 72.6254 598 72.4284 597.614C72.2352 597.227 71.9587 596.922 71.5989 596.699C71.2428 596.475 70.8224 596.364 70.3375 596.364C69.8034 596.364 69.3413 596.496 68.9511 596.761C68.5648 597.023 68.2674 597.364 68.0591 597.784C67.8508 598.205 67.7466 598.655 67.7466 599.136V599.909C67.7466 600.568 67.8602 601.127 68.0875 601.585C68.3186 602.04 68.6386 602.386 69.0477 602.625C69.4568 602.86 69.9322 602.977 70.4739 602.977C70.8261 602.977 71.1443 602.928 71.4284 602.83C71.7163 602.727 71.9644 602.576 72.1727 602.375C72.3811 602.17 72.542 601.917 72.6557 601.614L73.9511 601.977C73.8148 602.417 73.5856 602.803 73.2636 603.136C72.9417 603.466 72.5439 603.723 72.0705 603.909C71.597 604.091 71.0648 604.182 70.4739 604.182ZM75.8073 604V595.273H77.1027V596.636H77.2164C77.3982 596.17 77.6917 595.809 78.097 595.551C78.5024 595.29 78.9891 595.159 79.5573 595.159C80.133 595.159 80.6122 595.29 80.9948 595.551C81.3811 595.809 81.6823 596.17 81.8982 596.636H81.9891C82.2126 596.186 82.5478 595.828 82.9948 595.562C83.4417 595.294 83.9777 595.159 84.6027 595.159C85.383 595.159 86.0213 595.403 86.5175 595.892C87.0137 596.377 87.2618 597.133 87.2618 598.159V604H85.9209V598.159C85.9209 597.515 85.7448 597.055 85.3925 596.778C85.0402 596.502 84.6255 596.364 84.1482 596.364C83.5345 596.364 83.0592 596.549 82.722 596.92C82.3849 597.288 82.2164 597.754 82.2164 598.318V604H80.8527V598.023C80.8527 597.527 80.6917 597.127 80.3698 596.824C80.0478 596.517 79.633 596.364 79.1255 596.364C78.777 596.364 78.4512 596.456 78.1482 596.642C77.8489 596.828 77.6065 597.085 77.4209 597.415C77.2391 597.741 77.1482 598.117 77.1482 598.545V604H75.8073ZM93.0526 604.182C92.2117 604.182 91.4863 603.996 90.8765 603.625C90.2704 603.25 89.8026 602.727 89.4731 602.057C89.1473 601.383 88.9844 600.598 88.9844 599.705C88.9844 598.811 89.1473 598.023 89.4731 597.341C89.8026 596.655 90.2609 596.121 90.8481 595.739C91.439 595.352 92.1284 595.159 92.9163 595.159C93.3708 595.159 93.8197 595.235 94.2628 595.386C94.706 595.538 95.1094 595.784 95.4731 596.125C95.8367 596.462 96.1265 596.909 96.3424 597.466C96.5583 598.023 96.6663 598.708 96.6663 599.523V600.091H89.939V598.932H95.3026C95.3026 598.439 95.2041 598 95.0072 597.614C94.814 597.227 94.5375 596.922 94.1776 596.699C93.8216 596.475 93.4011 596.364 92.9163 596.364C92.3822 596.364 91.92 596.496 91.5299 596.761C91.1435 597.023 90.8462 597.364 90.6378 597.784C90.4295 598.205 90.3253 598.655 90.3253 599.136V599.909C90.3253 600.568 90.439 601.127 90.6663 601.585C90.8973 602.04 91.2174 602.386 91.6265 602.625C92.0356 602.86 92.5109 602.977 93.0526 602.977C93.4049 602.977 93.7231 602.928 94.0072 602.83C94.295 602.727 94.5431 602.576 94.7515 602.375C94.9598 602.17 95.1208 601.917 95.2344 601.614L96.5299 601.977C96.3935 602.417 96.1644 602.803 95.8424 603.136C95.5204 603.466 95.1227 603.723 94.6492 603.909C94.1757 604.091 93.6435 604.182 93.0526 604.182ZM99.7269 598.75V604H98.386V595.273H99.6815V596.636H99.7951C99.9997 596.193 100.31 595.837 100.727 595.568C101.144 595.295 101.681 595.159 102.341 595.159C102.931 595.159 103.449 595.28 103.892 595.523C104.335 595.761 104.68 596.125 104.926 596.614C105.172 597.098 105.295 597.712 105.295 598.455V604H103.954V598.545C103.954 597.86 103.776 597.326 103.42 596.943C103.064 596.557 102.575 596.364 101.954 596.364C101.526 596.364 101.144 596.456 100.806 596.642C100.473 596.828 100.21 597.098 100.017 597.455C99.8235 597.811 99.7269 598.242 99.7269 598.75ZM111.221 595.273V596.409H106.698V595.273H111.221ZM108.016 593.182H109.357V601.5C109.357 601.879 109.412 602.163 109.522 602.352C109.636 602.538 109.78 602.663 109.954 602.727C110.132 602.788 110.319 602.818 110.516 602.818C110.664 602.818 110.785 602.811 110.88 602.795C110.975 602.777 111.05 602.761 111.107 602.75L111.38 603.955C111.289 603.989 111.162 604.023 110.999 604.057C110.836 604.095 110.63 604.114 110.38 604.114C110.001 604.114 109.63 604.032 109.266 603.869C108.906 603.706 108.607 603.458 108.369 603.125C108.134 602.792 108.016 602.371 108.016 601.864V593.182ZM117.098 607.273V595.273H118.393V596.659H118.552C118.651 596.508 118.787 596.314 118.962 596.08C119.14 595.841 119.393 595.629 119.723 595.443C120.056 595.254 120.507 595.159 121.075 595.159C121.81 595.159 122.458 595.343 123.018 595.71C123.579 596.078 124.016 596.598 124.331 597.273C124.645 597.947 124.802 598.742 124.802 599.659C124.802 600.583 124.645 601.384 124.331 602.062C124.016 602.737 123.581 603.259 123.024 603.631C122.467 603.998 121.825 604.182 121.098 604.182C120.537 604.182 120.088 604.089 119.751 603.903C119.414 603.714 119.155 603.5 118.973 603.261C118.791 603.019 118.651 602.818 118.552 602.659H118.439V607.273H117.098ZM118.416 599.636C118.416 600.295 118.513 600.877 118.706 601.381C118.899 601.881 119.181 602.273 119.552 602.557C119.924 602.837 120.378 602.977 120.916 602.977C121.477 602.977 121.944 602.83 122.319 602.534C122.698 602.235 122.982 601.833 123.172 601.33C123.365 600.822 123.462 600.258 123.462 599.636C123.462 599.023 123.367 598.47 123.177 597.977C122.992 597.481 122.71 597.089 122.331 596.801C121.956 596.509 121.484 596.364 120.916 596.364C120.371 596.364 119.912 596.502 119.541 596.778C119.17 597.051 118.89 597.434 118.7 597.926C118.511 598.415 118.416 598.985 118.416 599.636ZM126.528 604V595.273H127.823V596.591H127.914C128.073 596.159 128.361 595.809 128.778 595.54C129.195 595.271 129.664 595.136 130.187 595.136C130.285 595.136 130.409 595.138 130.556 595.142C130.704 595.146 130.816 595.152 130.892 595.159V596.523C130.846 596.511 130.742 596.494 130.579 596.472C130.42 596.445 130.251 596.432 130.073 596.432C129.649 596.432 129.27 596.521 128.937 596.699C128.607 596.873 128.346 597.116 128.153 597.426C127.964 597.733 127.869 598.083 127.869 598.477V604H126.528ZM135.441 604.182C134.653 604.182 133.962 603.994 133.367 603.619C132.776 603.244 132.314 602.72 131.981 602.045C131.651 601.371 131.486 600.583 131.486 599.682C131.486 598.773 131.651 597.979 131.981 597.301C132.314 596.623 132.776 596.097 133.367 595.722C133.962 595.347 134.653 595.159 135.441 595.159C136.229 595.159 136.918 595.347 137.509 595.722C138.104 596.097 138.566 596.623 138.895 597.301C139.229 597.979 139.395 598.773 139.395 599.682C139.395 600.583 139.229 601.371 138.895 602.045C138.566 602.72 138.104 603.244 137.509 603.619C136.918 603.994 136.229 604.182 135.441 604.182ZM135.441 602.977C136.039 602.977 136.532 602.824 136.918 602.517C137.304 602.21 137.59 601.807 137.776 601.307C137.962 600.807 138.054 600.265 138.054 599.682C138.054 599.098 137.962 598.555 137.776 598.051C137.59 597.547 137.304 597.14 136.918 596.83C136.532 596.519 136.039 596.364 135.441 596.364C134.842 596.364 134.35 596.519 133.964 596.83C133.577 597.14 133.291 597.547 133.106 598.051C132.92 598.555 132.827 599.098 132.827 599.682C132.827 600.265 132.92 600.807 133.106 601.307C133.291 601.807 133.577 602.21 133.964 602.517C134.35 602.824 134.842 602.977 135.441 602.977ZM144.645 607.455C143.997 607.455 143.44 607.371 142.975 607.205C142.509 607.042 142.12 606.826 141.81 606.557C141.503 606.292 141.259 606.008 141.077 605.705L142.145 604.955C142.266 605.114 142.42 605.295 142.605 605.5C142.791 605.708 143.045 605.888 143.367 606.04C143.692 606.195 144.118 606.273 144.645 606.273C145.35 606.273 145.931 606.102 146.389 605.761C146.848 605.42 147.077 604.886 147.077 604.159V602.386H146.963C146.865 602.545 146.725 602.742 146.543 602.977C146.365 603.208 146.107 603.415 145.77 603.597C145.437 603.775 144.986 603.864 144.418 603.864C143.713 603.864 143.081 603.697 142.52 603.364C141.963 603.03 141.522 602.545 141.196 601.909C140.874 601.273 140.713 600.5 140.713 599.591C140.713 598.697 140.87 597.919 141.185 597.256C141.499 596.589 141.937 596.074 142.497 595.71C143.058 595.343 143.706 595.159 144.44 595.159C145.009 595.159 145.459 595.254 145.793 595.443C146.13 595.629 146.387 595.841 146.565 596.08C146.747 596.314 146.887 596.508 146.986 596.659H147.122V595.273H148.418V604.25C148.418 605 148.247 605.61 147.906 606.08C147.569 606.553 147.115 606.9 146.543 607.119C145.975 607.343 145.342 607.455 144.645 607.455ZM144.6 602.659C145.137 602.659 145.592 602.536 145.963 602.29C146.334 602.044 146.617 601.689 146.81 601.227C147.003 600.765 147.1 600.212 147.1 599.568C147.1 598.939 147.005 598.384 146.815 597.903C146.626 597.422 146.346 597.045 145.975 596.773C145.603 596.5 145.145 596.364 144.6 596.364C144.031 596.364 143.558 596.508 143.179 596.795C142.804 597.083 142.522 597.47 142.332 597.955C142.147 598.439 142.054 598.977 142.054 599.568C142.054 600.174 142.149 600.71 142.338 601.176C142.531 601.638 142.815 602.002 143.19 602.267C143.569 602.528 144.039 602.659 144.6 602.659ZM150.552 604V595.273H151.848V596.591H151.939C152.098 596.159 152.386 595.809 152.802 595.54C153.219 595.271 153.689 595.136 154.211 595.136C154.31 595.136 154.433 595.138 154.581 595.142C154.728 595.146 154.84 595.152 154.916 595.159V596.523C154.87 596.511 154.766 596.494 154.603 596.472C154.444 596.445 154.276 596.432 154.098 596.432C153.673 596.432 153.295 596.521 152.961 596.699C152.632 596.873 152.37 597.116 152.177 597.426C151.988 597.733 151.893 598.083 151.893 598.477V604H150.552ZM158.754 604.205C158.201 604.205 157.699 604.1 157.248 603.892C156.797 603.68 156.439 603.375 156.174 602.977C155.909 602.576 155.776 602.091 155.776 601.523C155.776 601.023 155.875 600.617 156.072 600.307C156.269 599.992 156.532 599.746 156.862 599.568C157.191 599.39 157.555 599.258 157.952 599.17C158.354 599.08 158.757 599.008 159.163 598.955C159.693 598.886 160.123 598.835 160.452 598.801C160.786 598.763 161.028 598.701 161.18 598.614C161.335 598.527 161.413 598.375 161.413 598.159V598.114C161.413 597.553 161.259 597.117 160.952 596.807C160.649 596.496 160.189 596.341 159.572 596.341C158.932 596.341 158.43 596.481 158.066 596.761C157.702 597.042 157.447 597.341 157.299 597.659L156.026 597.205C156.254 596.674 156.557 596.261 156.935 595.966C157.318 595.667 157.735 595.458 158.185 595.341C158.64 595.22 159.087 595.159 159.526 595.159C159.807 595.159 160.129 595.193 160.492 595.261C160.86 595.326 161.214 595.46 161.555 595.665C161.899 595.869 162.185 596.178 162.413 596.591C162.64 597.004 162.754 597.557 162.754 598.25V604H161.413V602.818H161.344C161.254 603.008 161.102 603.21 160.89 603.426C160.678 603.642 160.396 603.826 160.043 603.977C159.691 604.129 159.261 604.205 158.754 604.205ZM158.958 603C159.488 603 159.935 602.896 160.299 602.688C160.666 602.479 160.943 602.21 161.129 601.881C161.318 601.551 161.413 601.205 161.413 600.841V599.614C161.356 599.682 161.231 599.744 161.038 599.801C160.848 599.854 160.629 599.902 160.379 599.943C160.132 599.981 159.892 600.015 159.657 600.045C159.426 600.072 159.238 600.095 159.094 600.114C158.746 600.159 158.42 600.233 158.117 600.335C157.818 600.434 157.576 600.583 157.39 600.784C157.208 600.981 157.117 601.25 157.117 601.591C157.117 602.057 157.29 602.409 157.634 602.648C157.983 602.883 158.424 603 158.958 603ZM164.881 604V595.273H166.176V596.636H166.29C166.472 596.17 166.765 595.809 167.171 595.551C167.576 595.29 168.063 595.159 168.631 595.159C169.207 595.159 169.686 595.29 170.069 595.551C170.455 595.809 170.756 596.17 170.972 596.636H171.063C171.286 596.186 171.622 595.828 172.069 595.562C172.515 595.294 173.051 595.159 173.676 595.159C174.457 595.159 175.095 595.403 175.591 595.892C176.087 596.377 176.336 597.133 176.336 598.159V604H174.995V598.159C174.995 597.515 174.819 597.055 174.466 596.778C174.114 596.502 173.699 596.364 173.222 596.364C172.608 596.364 172.133 596.549 171.796 596.92C171.459 597.288 171.29 597.754 171.29 598.318V604H169.926V598.023C169.926 597.527 169.765 597.127 169.444 596.824C169.122 596.517 168.707 596.364 168.199 596.364C167.851 596.364 167.525 596.456 167.222 596.642C166.923 596.828 166.68 597.085 166.495 597.415C166.313 597.741 166.222 598.117 166.222 598.545V604H164.881ZM184.649 597.227L183.445 597.568C183.369 597.367 183.257 597.172 183.109 596.983C182.965 596.79 182.768 596.631 182.518 596.506C182.268 596.381 181.948 596.318 181.558 596.318C181.024 596.318 180.579 596.441 180.223 596.688C179.871 596.93 179.695 597.239 179.695 597.614C179.695 597.947 179.816 598.21 180.058 598.403C180.301 598.597 180.679 598.758 181.195 598.886L182.49 599.205C183.27 599.394 183.852 599.684 184.234 600.074C184.617 600.46 184.808 600.958 184.808 601.568C184.808 602.068 184.664 602.515 184.376 602.909C184.092 603.303 183.695 603.614 183.183 603.841C182.672 604.068 182.077 604.182 181.399 604.182C180.509 604.182 179.772 603.989 179.189 603.602C178.606 603.216 178.236 602.652 178.081 601.909L179.354 601.591C179.475 602.061 179.704 602.413 180.041 602.648C180.382 602.883 180.827 603 181.376 603C182.001 603 182.498 602.867 182.865 602.602C183.236 602.333 183.422 602.011 183.422 601.636C183.422 601.333 183.316 601.08 183.104 600.875C182.892 600.667 182.566 600.511 182.126 600.409L180.672 600.068C179.873 599.879 179.285 599.585 178.91 599.188C178.539 598.786 178.354 598.284 178.354 597.682C178.354 597.189 178.492 596.754 178.768 596.375C179.049 595.996 179.429 595.699 179.91 595.483C180.395 595.267 180.945 595.159 181.558 595.159C182.422 595.159 183.1 595.348 183.592 595.727C184.088 596.106 184.441 596.606 184.649 597.227ZM187.484 604.091C187.204 604.091 186.963 603.991 186.762 603.79C186.562 603.589 186.461 603.348 186.461 603.068C186.461 602.788 186.562 602.547 186.762 602.347C186.963 602.146 187.204 602.045 187.484 602.045C187.764 602.045 188.005 602.146 188.206 602.347C188.406 602.547 188.507 602.788 188.507 603.068C188.507 603.254 188.459 603.424 188.365 603.58C188.274 603.735 188.151 603.86 187.995 603.955C187.844 604.045 187.673 604.091 187.484 604.091Z" fill="black"/> +<rect y="322" width="64" height="64" rx="20" fill="white"/> +<rect x="20" y="342" width="23" height="23" rx="10" fill="#FEDD3E"/> +<path d="M573.628 489V432.288C573.628 426.984 574.92 422.156 577.504 417.804C580.224 413.452 583.76 409.984 588.112 407.4C592.464 404.816 597.292 403.524 602.596 403.524H688.276C688.548 403.524 688.82 403.388 689.092 403.116C689.364 402.844 689.5 402.572 689.5 402.3V372.312C689.5 372.04 689.364 371.768 689.092 371.496C688.82 371.224 688.548 371.088 688.276 371.088H603.82C603.548 371.088 603.276 371.224 603.004 371.496C602.732 371.768 602.596 372.04 602.596 372.312V383.328H573.628V370.884C573.628 365.58 574.92 360.752 577.504 356.4C580.224 352.048 583.76 348.58 588.112 345.996C592.464 343.412 597.292 342.12 602.596 342.12H689.5C694.668 342.12 699.428 343.412 703.78 345.996C708.268 348.58 711.804 352.048 714.388 356.4C717.108 360.752 718.468 365.58 718.468 370.884V403.728C718.468 409.032 717.108 413.86 714.388 418.212C711.804 422.564 708.268 426.1 703.78 428.82C699.428 431.404 694.668 432.696 689.5 432.696H603.82C603.548 432.696 603.276 432.832 603.004 433.104C602.732 433.376 602.596 433.648 602.596 433.92V458.808C602.596 459.08 602.732 459.352 603.004 459.624C603.276 459.896 603.548 460.032 603.82 460.032H718.468V489H573.628Z" fill="black" fill-opacity="0.04"/> +<path d="M384.079 382.449H386.431L387.614 383.97L388.777 385.325L390.969 388.074H388.387L386.879 386.22L386.105 385.121L384.079 382.449ZM391.168 380.455C391.168 381.882 390.897 383.097 390.356 384.098C389.819 385.099 389.086 385.864 388.157 386.393C387.232 386.917 386.192 387.179 385.038 387.179C383.874 387.179 382.83 386.915 381.906 386.386C380.981 385.858 380.25 385.093 379.713 384.092C379.176 383.09 378.908 381.878 378.908 380.455C378.908 379.027 379.176 377.812 379.713 376.811C380.25 375.81 380.981 375.047 381.906 374.523C382.83 373.994 383.874 373.73 385.038 373.73C386.192 373.73 387.232 373.994 388.157 374.523C389.086 375.047 389.819 375.81 390.356 376.811C390.897 377.812 391.168 379.027 391.168 380.455ZM388.362 380.455C388.362 379.53 388.223 378.75 387.946 378.115C387.673 377.48 387.288 376.999 386.789 376.67C386.29 376.342 385.707 376.178 385.038 376.178C384.369 376.178 383.785 376.342 383.286 376.67C382.788 376.999 382.4 377.48 382.123 378.115C381.85 378.75 381.714 379.53 381.714 380.455C381.714 381.379 381.85 382.159 382.123 382.794C382.4 383.429 382.788 383.911 383.286 384.239C383.785 384.567 384.369 384.731 385.038 384.731C385.707 384.731 386.29 384.567 386.789 384.239C387.288 383.911 387.673 383.429 387.946 382.794C388.223 382.159 388.362 381.379 388.362 380.455ZM392.601 387V385.006L397.261 380.691C397.657 380.308 397.99 379.962 398.258 379.656C398.531 379.349 398.738 379.048 398.878 378.754C399.019 378.456 399.089 378.134 399.089 377.789C399.089 377.406 399.002 377.075 398.827 376.798C398.652 376.517 398.414 376.302 398.111 376.153C397.809 375.999 397.466 375.923 397.082 375.923C396.681 375.923 396.332 376.004 396.034 376.165C395.735 376.327 395.505 376.56 395.343 376.862C395.181 377.165 395.1 377.525 395.1 377.942H392.473C392.473 377.086 392.667 376.342 393.055 375.712C393.443 375.081 393.986 374.593 394.685 374.248C395.384 373.903 396.189 373.73 397.101 373.73C398.039 373.73 398.855 373.896 399.549 374.229C400.248 374.557 400.791 375.013 401.179 375.597C401.567 376.18 401.761 376.849 401.761 377.604C401.761 378.098 401.663 378.586 401.467 379.067C401.275 379.549 400.932 380.084 400.438 380.672C399.943 381.256 399.247 381.957 398.348 382.775L396.436 384.648V384.737H401.934V387H392.601ZM413.168 379.374V381.535H407.198V379.374H413.168ZM418.549 387V385.006L423.208 380.691C423.605 380.308 423.937 379.962 424.206 379.656C424.478 379.349 424.685 379.048 424.826 378.754C424.966 378.456 425.037 378.134 425.037 377.789C425.037 377.406 424.949 377.075 424.774 376.798C424.6 376.517 424.361 376.302 424.059 376.153C423.756 375.999 423.413 375.923 423.029 375.923C422.629 375.923 422.279 376.004 421.981 376.165C421.683 376.327 421.453 376.56 421.291 376.862C421.129 377.165 421.048 377.525 421.048 377.942H418.421C418.421 377.086 418.615 376.342 419.002 375.712C419.39 375.081 419.934 374.593 420.632 374.248C421.331 373.903 422.137 373.73 423.049 373.73C423.986 373.73 424.802 373.896 425.497 374.229C426.196 374.557 426.739 375.013 427.127 375.597C427.514 376.18 427.708 376.849 427.708 377.604C427.708 378.098 427.61 378.586 427.414 379.067C427.223 379.549 426.88 380.084 426.385 380.672C425.891 381.256 425.194 381.957 424.295 382.775L422.384 384.648V384.737H427.881V387H418.549ZM434.479 387.288C433.38 387.283 432.434 387.013 431.641 386.476C430.853 385.939 430.246 385.161 429.819 384.143C429.398 383.124 429.189 381.899 429.193 380.467C429.193 379.04 429.404 377.823 429.826 376.817C430.252 375.812 430.859 375.047 431.648 374.523C432.44 373.994 433.384 373.73 434.479 373.73C435.574 373.73 436.516 373.994 437.305 374.523C438.097 375.051 438.707 375.818 439.133 376.824C439.559 377.825 439.77 379.04 439.766 380.467C439.766 381.903 439.552 383.131 439.126 384.149C438.704 385.168 438.099 385.945 437.311 386.482C436.523 387.019 435.579 387.288 434.479 387.288ZM434.479 384.993C435.229 384.993 435.828 384.616 436.275 383.862C436.723 383.107 436.944 381.976 436.94 380.467C436.94 379.474 436.838 378.648 436.633 377.987C436.433 377.327 436.148 376.83 435.777 376.498C435.41 376.165 434.978 375.999 434.479 375.999C433.734 375.999 433.137 376.372 432.69 377.118C432.242 377.864 432.016 378.98 432.012 380.467C432.012 381.473 432.112 382.312 432.312 382.986C432.517 383.655 432.805 384.158 433.175 384.494C433.546 384.827 433.981 384.993 434.479 384.993ZM441.199 387V385.006L445.859 380.691C446.255 380.308 446.588 379.962 446.856 379.656C447.129 379.349 447.335 379.048 447.476 378.754C447.617 378.456 447.687 378.134 447.687 377.789C447.687 377.406 447.6 377.075 447.425 376.798C447.25 376.517 447.012 376.302 446.709 376.153C446.406 375.999 446.063 375.923 445.68 375.923C445.279 375.923 444.93 376.004 444.632 376.165C444.333 376.327 444.103 376.56 443.941 376.862C443.779 377.165 443.698 377.525 443.698 377.942H441.071C441.071 377.086 441.265 376.342 441.653 375.712C442.041 375.081 442.584 374.593 443.283 374.248C443.982 373.903 444.787 373.73 445.699 373.73C446.637 373.73 447.453 373.896 448.147 374.229C448.846 374.557 449.389 375.013 449.777 375.597C450.165 376.18 450.359 376.849 450.359 377.604C450.359 378.098 450.261 378.586 450.065 379.067C449.873 379.549 449.53 380.084 449.036 380.672C448.541 381.256 447.845 381.957 446.945 382.775L445.034 384.648V384.737H450.531V387H441.199ZM456.778 387.179C455.875 387.179 455.069 387.013 454.362 386.68C453.659 386.348 453.101 385.89 452.687 385.306C452.274 384.722 452.059 384.053 452.042 383.299H454.726C454.756 383.806 454.969 384.217 455.366 384.533C455.762 384.848 456.233 385.006 456.778 385.006C457.213 385.006 457.596 384.91 457.929 384.718C458.265 384.522 458.527 384.251 458.715 383.906C458.907 383.557 459.003 383.156 459.003 382.705C459.003 382.244 458.905 381.839 458.709 381.49C458.517 381.141 458.25 380.868 457.91 380.672C457.569 380.476 457.179 380.376 456.74 380.371C456.356 380.371 455.983 380.45 455.621 380.608C455.263 380.766 454.984 380.981 454.784 381.254L452.323 380.812L452.943 373.909H460.946V376.172H455.225L454.886 379.451H454.963C455.193 379.127 455.54 378.859 456.005 378.646C456.469 378.433 456.989 378.326 457.564 378.326C458.353 378.326 459.056 378.511 459.674 378.882C460.292 379.253 460.78 379.762 461.138 380.41C461.496 381.053 461.672 381.795 461.668 382.634C461.672 383.516 461.468 384.3 461.054 384.987C460.645 385.668 460.072 386.205 459.335 386.597C458.602 386.985 457.75 387.179 456.778 387.179Z" fill="black"/> +<path d="M379.409 423V411.364H386.432V412.614H380.818V416.545H386.068V417.795H380.818V421.75H386.523V423H379.409ZM389.47 414.273L391.561 417.841L393.652 414.273H395.197L392.379 418.636L395.197 423H393.652L391.561 419.614L389.47 423H387.924L390.697 418.636L387.924 414.273H389.47ZM396.79 426.273V414.273H398.086V415.659H398.245C398.343 415.508 398.48 415.314 398.654 415.08C398.832 414.841 399.086 414.629 399.415 414.443C399.749 414.254 400.199 414.159 400.768 414.159C401.503 414.159 402.15 414.343 402.711 414.71C403.271 415.078 403.709 415.598 404.023 416.273C404.338 416.947 404.495 417.742 404.495 418.659C404.495 419.583 404.338 420.384 404.023 421.062C403.709 421.737 403.273 422.259 402.717 422.631C402.16 422.998 401.518 423.182 400.79 423.182C400.23 423.182 399.781 423.089 399.444 422.903C399.107 422.714 398.847 422.5 398.665 422.261C398.484 422.019 398.343 421.818 398.245 421.659H398.131V426.273H396.79ZM398.109 418.636C398.109 419.295 398.205 419.877 398.398 420.381C398.592 420.881 398.874 421.273 399.245 421.557C399.616 421.837 400.071 421.977 400.609 421.977C401.169 421.977 401.637 421.83 402.012 421.534C402.391 421.235 402.675 420.833 402.864 420.33C403.057 419.822 403.154 419.258 403.154 418.636C403.154 418.023 403.059 417.47 402.87 416.977C402.684 416.481 402.402 416.089 402.023 415.801C401.648 415.509 401.177 415.364 400.609 415.364C400.063 415.364 399.605 415.502 399.234 415.778C398.862 416.051 398.582 416.434 398.393 416.926C398.203 417.415 398.109 417.985 398.109 418.636ZM408.789 423.205C408.236 423.205 407.734 423.1 407.283 422.892C406.832 422.68 406.474 422.375 406.209 421.977C405.944 421.576 405.811 421.091 405.811 420.523C405.811 420.023 405.91 419.617 406.107 419.307C406.304 418.992 406.567 418.746 406.897 418.568C407.226 418.39 407.59 418.258 407.987 418.17C408.389 418.08 408.792 418.008 409.198 417.955C409.728 417.886 410.158 417.835 410.487 417.801C410.821 417.763 411.063 417.701 411.215 417.614C411.37 417.527 411.448 417.375 411.448 417.159V417.114C411.448 416.553 411.294 416.117 410.987 415.807C410.684 415.496 410.224 415.341 409.607 415.341C408.967 415.341 408.465 415.481 408.101 415.761C407.737 416.042 407.482 416.341 407.334 416.659L406.061 416.205C406.289 415.674 406.592 415.261 406.97 414.966C407.353 414.667 407.77 414.458 408.22 414.341C408.675 414.22 409.122 414.159 409.561 414.159C409.842 414.159 410.164 414.193 410.527 414.261C410.895 414.326 411.249 414.46 411.59 414.665C411.934 414.869 412.22 415.178 412.448 415.591C412.675 416.004 412.789 416.557 412.789 417.25V423H411.448V421.818H411.379C411.289 422.008 411.137 422.21 410.925 422.426C410.713 422.642 410.431 422.826 410.078 422.977C409.726 423.129 409.296 423.205 408.789 423.205ZM408.993 422C409.523 422 409.97 421.896 410.334 421.688C410.701 421.479 410.978 421.21 411.164 420.881C411.353 420.551 411.448 420.205 411.448 419.841V418.614C411.391 418.682 411.266 418.744 411.073 418.801C410.883 418.854 410.664 418.902 410.414 418.943C410.167 418.981 409.927 419.015 409.692 419.045C409.461 419.072 409.273 419.095 409.129 419.114C408.781 419.159 408.455 419.233 408.152 419.335C407.853 419.434 407.611 419.583 407.425 419.784C407.243 419.981 407.152 420.25 407.152 420.591C407.152 421.057 407.325 421.409 407.669 421.648C408.018 421.883 408.459 422 408.993 422ZM416.257 417.75V423H414.916V414.273H416.211V415.636H416.325C416.53 415.193 416.84 414.837 417.257 414.568C417.674 414.295 418.211 414.159 418.871 414.159C419.461 414.159 419.979 414.28 420.422 414.523C420.865 414.761 421.21 415.125 421.456 415.614C421.702 416.098 421.825 416.712 421.825 417.455V423H420.484V417.545C420.484 416.86 420.306 416.326 419.95 415.943C419.594 415.557 419.105 415.364 418.484 415.364C418.056 415.364 417.674 415.456 417.336 415.642C417.003 415.828 416.74 416.098 416.547 416.455C416.354 416.811 416.257 417.242 416.257 417.75ZM427.251 423.182C426.524 423.182 425.882 422.998 425.325 422.631C424.768 422.259 424.332 421.737 424.018 421.062C423.704 420.384 423.546 419.583 423.546 418.659C423.546 417.742 423.704 416.947 424.018 416.273C424.332 415.598 424.77 415.078 425.33 414.71C425.891 414.343 426.539 414.159 427.274 414.159C427.842 414.159 428.291 414.254 428.62 414.443C428.954 414.629 429.207 414.841 429.382 415.08C429.56 415.314 429.698 415.508 429.796 415.659H429.91V411.364H431.251V423H429.955V421.659H429.796C429.698 421.818 429.558 422.019 429.376 422.261C429.194 422.5 428.935 422.714 428.597 422.903C428.26 423.089 427.811 423.182 427.251 423.182ZM427.433 421.977C427.971 421.977 428.425 421.837 428.796 421.557C429.168 421.273 429.45 420.881 429.643 420.381C429.836 419.877 429.933 419.295 429.933 418.636C429.933 417.985 429.838 417.415 429.649 416.926C429.459 416.434 429.179 416.051 428.808 415.778C428.436 415.502 427.978 415.364 427.433 415.364C426.864 415.364 426.391 415.509 426.012 415.801C425.637 416.089 425.355 416.481 425.166 416.977C424.98 417.47 424.887 418.023 424.887 418.636C424.887 419.258 424.982 419.822 425.171 420.33C425.364 420.833 425.649 421.235 426.024 421.534C426.402 421.83 426.872 421.977 427.433 421.977ZM437.753 426.273V414.273H439.048V415.659H439.207C439.306 415.508 439.442 415.314 439.617 415.08C439.795 414.841 440.048 414.629 440.378 414.443C440.711 414.254 441.162 414.159 441.73 414.159C442.465 414.159 443.113 414.343 443.673 414.71C444.234 415.078 444.671 415.598 444.986 416.273C445.3 416.947 445.457 417.742 445.457 418.659C445.457 419.583 445.3 420.384 444.986 421.062C444.671 421.737 444.236 422.259 443.679 422.631C443.122 422.998 442.48 423.182 441.753 423.182C441.192 423.182 440.743 423.089 440.406 422.903C440.069 422.714 439.81 422.5 439.628 422.261C439.446 422.019 439.306 421.818 439.207 421.659H439.094V426.273H437.753ZM439.071 418.636C439.071 419.295 439.168 419.877 439.361 420.381C439.554 420.881 439.836 421.273 440.207 421.557C440.579 421.837 441.033 421.977 441.571 421.977C442.132 421.977 442.599 421.83 442.974 421.534C443.353 421.235 443.637 420.833 443.827 420.33C444.02 419.822 444.117 419.258 444.117 418.636C444.117 418.023 444.022 417.47 443.832 416.977C443.647 416.481 443.365 416.089 442.986 415.801C442.611 415.509 442.139 415.364 441.571 415.364C441.026 415.364 440.567 415.502 440.196 415.778C439.825 416.051 439.545 416.434 439.355 416.926C439.166 417.415 439.071 417.985 439.071 418.636ZM448.524 411.364V423H447.183V411.364H448.524ZM453.228 423.205C452.675 423.205 452.173 423.1 451.722 422.892C451.272 422.68 450.914 422.375 450.648 421.977C450.383 421.576 450.251 421.091 450.251 420.523C450.251 420.023 450.349 419.617 450.546 419.307C450.743 418.992 451.006 418.746 451.336 418.568C451.665 418.39 452.029 418.258 452.427 418.17C452.828 418.08 453.232 418.008 453.637 417.955C454.167 417.886 454.597 417.835 454.927 417.801C455.26 417.763 455.503 417.701 455.654 417.614C455.809 417.527 455.887 417.375 455.887 417.159V417.114C455.887 416.553 455.734 416.117 455.427 415.807C455.124 415.496 454.664 415.341 454.046 415.341C453.406 415.341 452.904 415.481 452.54 415.761C452.177 416.042 451.921 416.341 451.773 416.659L450.501 416.205C450.728 415.674 451.031 415.261 451.41 414.966C451.792 414.667 452.209 414.458 452.66 414.341C453.114 414.22 453.561 414.159 454.001 414.159C454.281 414.159 454.603 414.193 454.967 414.261C455.334 414.326 455.688 414.46 456.029 414.665C456.374 414.869 456.66 415.178 456.887 415.591C457.114 416.004 457.228 416.557 457.228 417.25V423H455.887V421.818H455.819C455.728 422.008 455.576 422.21 455.364 422.426C455.152 422.642 454.87 422.826 454.518 422.977C454.165 423.129 453.736 423.205 453.228 423.205ZM453.433 422C453.963 422 454.41 421.896 454.773 421.688C455.141 421.479 455.417 421.21 455.603 420.881C455.792 420.551 455.887 420.205 455.887 419.841V418.614C455.83 418.682 455.705 418.744 455.512 418.801C455.323 418.854 455.103 418.902 454.853 418.943C454.607 418.981 454.366 419.015 454.131 419.045C453.9 419.072 453.713 419.095 453.569 419.114C453.22 419.159 452.895 419.233 452.592 419.335C452.292 419.434 452.05 419.583 451.864 419.784C451.683 419.981 451.592 420.25 451.592 420.591C451.592 421.057 451.764 421.409 452.109 421.648C452.457 421.883 452.898 422 453.433 422ZM463.151 414.273V415.409H458.628V414.273H463.151ZM459.946 412.182H461.287V420.5C461.287 420.879 461.342 421.163 461.452 421.352C461.566 421.538 461.71 421.663 461.884 421.727C462.062 421.788 462.249 421.818 462.446 421.818C462.594 421.818 462.715 421.811 462.81 421.795C462.905 421.777 462.98 421.761 463.037 421.75L463.31 422.955C463.219 422.989 463.092 423.023 462.929 423.057C462.766 423.095 462.56 423.114 462.31 423.114C461.931 423.114 461.56 423.032 461.196 422.869C460.836 422.706 460.537 422.458 460.299 422.125C460.064 421.792 459.946 421.371 459.946 420.864V412.182ZM468.734 414.273V415.409H464.03V414.273H468.734ZM465.439 423V413.068C465.439 412.568 465.556 412.152 465.791 411.818C466.026 411.485 466.331 411.235 466.706 411.068C467.081 410.902 467.477 410.818 467.893 410.818C468.223 410.818 468.492 410.845 468.7 410.898C468.909 410.951 469.064 411 469.166 411.045L468.78 412.205C468.712 412.182 468.617 412.153 468.496 412.119C468.378 412.085 468.223 412.068 468.03 412.068C467.587 412.068 467.266 412.18 467.069 412.403C466.876 412.627 466.78 412.955 466.78 413.386V423H465.439ZM473.48 423.182C472.692 423.182 472 422.994 471.406 422.619C470.815 422.244 470.353 421.72 470.019 421.045C469.69 420.371 469.525 419.583 469.525 418.682C469.525 417.773 469.69 416.979 470.019 416.301C470.353 415.623 470.815 415.097 471.406 414.722C472 414.347 472.692 414.159 473.48 414.159C474.267 414.159 474.957 414.347 475.548 414.722C476.142 415.097 476.605 415.623 476.934 416.301C477.267 416.979 477.434 417.773 477.434 418.682C477.434 419.583 477.267 420.371 476.934 421.045C476.605 421.72 476.142 422.244 475.548 422.619C474.957 422.994 474.267 423.182 473.48 423.182ZM473.48 421.977C474.078 421.977 474.571 421.824 474.957 421.517C475.343 421.21 475.629 420.807 475.815 420.307C476 419.807 476.093 419.265 476.093 418.682C476.093 418.098 476 417.555 475.815 417.051C475.629 416.547 475.343 416.14 474.957 415.83C474.571 415.519 474.078 415.364 473.48 415.364C472.881 415.364 472.389 415.519 472.002 415.83C471.616 416.14 471.33 416.547 471.144 417.051C470.959 417.555 470.866 418.098 470.866 418.682C470.866 419.265 470.959 419.807 471.144 420.307C471.33 420.807 471.616 421.21 472.002 421.517C472.389 421.824 472.881 421.977 473.48 421.977ZM479.161 423V414.273H480.456V415.591H480.547C480.706 415.159 480.994 414.809 481.411 414.54C481.828 414.271 482.297 414.136 482.82 414.136C482.919 414.136 483.042 414.138 483.189 414.142C483.337 414.146 483.449 414.152 483.525 414.159V415.523C483.479 415.511 483.375 415.494 483.212 415.472C483.053 415.445 482.885 415.432 482.706 415.432C482.282 415.432 481.903 415.521 481.57 415.699C481.241 415.873 480.979 416.116 480.786 416.426C480.597 416.733 480.502 417.083 480.502 417.477V423H479.161ZM484.794 423V414.273H486.09V415.636H486.203C486.385 415.17 486.679 414.809 487.084 414.551C487.489 414.29 487.976 414.159 488.544 414.159C489.12 414.159 489.599 414.29 489.982 414.551C490.368 414.809 490.669 415.17 490.885 415.636H490.976C491.199 415.186 491.535 414.828 491.982 414.562C492.429 414.294 492.965 414.159 493.59 414.159C494.37 414.159 495.008 414.403 495.504 414.892C496.001 415.377 496.249 416.133 496.249 417.159V423H494.908V417.159C494.908 416.515 494.732 416.055 494.379 415.778C494.027 415.502 493.612 415.364 493.135 415.364C492.521 415.364 492.046 415.549 491.709 415.92C491.372 416.288 491.203 416.754 491.203 417.318V423H489.84V417.023C489.84 416.527 489.679 416.127 489.357 415.824C489.035 415.517 488.62 415.364 488.112 415.364C487.764 415.364 487.438 415.456 487.135 415.642C486.836 415.828 486.593 416.085 486.408 416.415C486.226 416.741 486.135 417.117 486.135 417.545V423H484.794ZM506.106 423.182C505.288 423.182 504.583 422.989 503.992 422.602C503.401 422.216 502.947 421.684 502.629 421.006C502.31 420.328 502.151 419.553 502.151 418.682C502.151 417.795 502.314 417.013 502.64 416.335C502.969 415.653 503.428 415.121 504.015 414.739C504.606 414.352 505.295 414.159 506.083 414.159C506.697 414.159 507.25 414.273 507.742 414.5C508.235 414.727 508.638 415.045 508.952 415.455C509.267 415.864 509.462 416.341 509.538 416.886H508.197C508.094 416.489 507.867 416.136 507.515 415.83C507.166 415.519 506.697 415.364 506.106 415.364C505.583 415.364 505.125 415.5 504.731 415.773C504.341 416.042 504.036 416.422 503.816 416.915C503.6 417.403 503.492 417.977 503.492 418.636C503.492 419.311 503.598 419.898 503.81 420.398C504.026 420.898 504.329 421.286 504.719 421.562C505.113 421.839 505.576 421.977 506.106 421.977C506.454 421.977 506.771 421.917 507.055 421.795C507.339 421.674 507.579 421.5 507.776 421.273C507.973 421.045 508.113 420.773 508.197 420.455H509.538C509.462 420.97 509.274 421.434 508.975 421.847C508.68 422.256 508.288 422.581 507.799 422.824C507.314 423.062 506.75 423.182 506.106 423.182ZM513.746 423.205C513.193 423.205 512.691 423.1 512.24 422.892C511.79 422.68 511.432 422.375 511.167 421.977C510.901 421.576 510.769 421.091 510.769 420.523C510.769 420.023 510.867 419.617 511.064 419.307C511.261 418.992 511.524 418.746 511.854 418.568C512.184 418.39 512.547 418.258 512.945 418.17C513.346 418.08 513.75 418.008 514.155 417.955C514.685 417.886 515.115 417.835 515.445 417.801C515.778 417.763 516.021 417.701 516.172 417.614C516.328 417.527 516.405 417.375 516.405 417.159V417.114C516.405 416.553 516.252 416.117 515.945 415.807C515.642 415.496 515.182 415.341 514.564 415.341C513.924 415.341 513.422 415.481 513.059 415.761C512.695 416.042 512.439 416.341 512.292 416.659L511.019 416.205C511.246 415.674 511.549 415.261 511.928 414.966C512.31 414.667 512.727 414.458 513.178 414.341C513.632 414.22 514.079 414.159 514.519 414.159C514.799 414.159 515.121 414.193 515.485 414.261C515.852 414.326 516.206 414.46 516.547 414.665C516.892 414.869 517.178 415.178 517.405 415.591C517.632 416.004 517.746 416.557 517.746 417.25V423H516.405V421.818H516.337C516.246 422.008 516.095 422.21 515.882 422.426C515.67 422.642 515.388 422.826 515.036 422.977C514.684 423.129 514.254 423.205 513.746 423.205ZM513.951 422C514.481 422 514.928 421.896 515.292 421.688C515.659 421.479 515.935 421.21 516.121 420.881C516.31 420.551 516.405 420.205 516.405 419.841V418.614C516.348 418.682 516.223 418.744 516.03 418.801C515.841 418.854 515.621 418.902 515.371 418.943C515.125 418.981 514.884 419.015 514.649 419.045C514.418 419.072 514.231 419.095 514.087 419.114C513.739 419.159 513.413 419.233 513.11 419.335C512.81 419.434 512.568 419.583 512.382 419.784C512.201 419.981 512.11 420.25 512.11 420.591C512.11 421.057 512.282 421.409 512.627 421.648C512.975 421.883 513.417 422 513.951 422ZM519.874 426.273V414.273H521.169V415.659H521.328C521.427 415.508 521.563 415.314 521.737 415.08C521.915 414.841 522.169 414.629 522.499 414.443C522.832 414.254 523.283 414.159 523.851 414.159C524.586 414.159 525.233 414.343 525.794 414.71C526.355 415.078 526.792 415.598 527.106 416.273C527.421 416.947 527.578 417.742 527.578 418.659C527.578 419.583 527.421 420.384 527.106 421.062C526.792 421.737 526.356 422.259 525.8 422.631C525.243 422.998 524.601 423.182 523.874 423.182C523.313 423.182 522.864 423.089 522.527 422.903C522.19 422.714 521.93 422.5 521.749 422.261C521.567 422.019 521.427 421.818 521.328 421.659H521.214V426.273H519.874ZM521.192 418.636C521.192 419.295 521.288 419.877 521.481 420.381C521.675 420.881 521.957 421.273 522.328 421.557C522.699 421.837 523.154 421.977 523.692 421.977C524.252 421.977 524.72 421.83 525.095 421.534C525.474 421.235 525.758 420.833 525.947 420.33C526.141 419.822 526.237 419.258 526.237 418.636C526.237 418.023 526.142 417.47 525.953 416.977C525.767 416.481 525.485 416.089 525.106 415.801C524.731 415.509 524.26 415.364 523.692 415.364C523.146 415.364 522.688 415.502 522.317 415.778C521.945 416.051 521.665 416.434 521.476 416.926C521.286 417.415 521.192 417.985 521.192 418.636ZM531.872 423.205C531.319 423.205 530.817 423.1 530.366 422.892C529.915 422.68 529.557 422.375 529.292 421.977C529.027 421.576 528.894 421.091 528.894 420.523C528.894 420.023 528.993 419.617 529.19 419.307C529.387 418.992 529.65 418.746 529.98 418.568C530.309 418.39 530.673 418.258 531.071 418.17C531.472 418.08 531.875 418.008 532.281 417.955C532.811 417.886 533.241 417.835 533.571 417.801C533.904 417.763 534.146 417.701 534.298 417.614C534.453 417.527 534.531 417.375 534.531 417.159V417.114C534.531 416.553 534.377 416.117 534.071 415.807C533.768 415.496 533.307 415.341 532.69 415.341C532.05 415.341 531.548 415.481 531.184 415.761C530.821 416.042 530.565 416.341 530.417 416.659L529.144 416.205C529.372 415.674 529.675 415.261 530.054 414.966C530.436 414.667 530.853 414.458 531.304 414.341C531.758 414.22 532.205 414.159 532.644 414.159C532.925 414.159 533.247 414.193 533.61 414.261C533.978 414.326 534.332 414.46 534.673 414.665C535.018 414.869 535.304 415.178 535.531 415.591C535.758 416.004 535.872 416.557 535.872 417.25V423H534.531V421.818H534.463C534.372 422.008 534.22 422.21 534.008 422.426C533.796 422.642 533.514 422.826 533.161 422.977C532.809 423.129 532.379 423.205 531.872 423.205ZM532.076 422C532.607 422 533.054 421.896 533.417 421.688C533.785 421.479 534.061 421.21 534.247 420.881C534.436 420.551 534.531 420.205 534.531 419.841V418.614C534.474 418.682 534.349 418.744 534.156 418.801C533.966 418.854 533.747 418.902 533.497 418.943C533.25 418.981 533.01 419.015 532.775 419.045C532.544 419.072 532.357 419.095 532.213 419.114C531.864 419.159 531.538 419.233 531.235 419.335C530.936 419.434 530.694 419.583 530.508 419.784C530.326 419.981 530.235 420.25 530.235 420.591C530.235 421.057 530.408 421.409 530.752 421.648C531.101 421.883 531.542 422 532.076 422ZM538.181 423V411.364H539.522V415.659H539.636C539.734 415.508 539.87 415.314 540.045 415.08C540.223 414.841 540.476 414.629 540.806 414.443C541.139 414.254 541.59 414.159 542.158 414.159C542.893 414.159 543.541 414.343 544.101 414.71C544.662 415.078 545.1 415.598 545.414 416.273C545.728 416.947 545.886 417.742 545.886 418.659C545.886 419.583 545.728 420.384 545.414 421.062C545.1 421.737 544.664 422.259 544.107 422.631C543.55 422.998 542.908 423.182 542.181 423.182C541.62 423.182 541.172 423.089 540.834 422.903C540.497 422.714 540.238 422.5 540.056 422.261C539.874 422.019 539.734 421.818 539.636 421.659H539.476V423H538.181ZM539.499 418.636C539.499 419.295 539.596 419.877 539.789 420.381C539.982 420.881 540.264 421.273 540.636 421.557C541.007 421.837 541.461 421.977 541.999 421.977C542.56 421.977 543.028 421.83 543.403 421.534C543.781 421.235 544.065 420.833 544.255 420.33C544.448 419.822 544.545 419.258 544.545 418.636C544.545 418.023 544.45 417.47 544.261 416.977C544.075 416.481 543.793 416.089 543.414 415.801C543.039 415.509 542.567 415.364 541.999 415.364C541.454 415.364 540.995 415.502 540.624 415.778C540.253 416.051 539.973 416.434 539.783 416.926C539.594 417.415 539.499 417.985 539.499 418.636ZM547.617 423V414.273H548.958V423H547.617ZM548.298 412.818C548.037 412.818 547.812 412.729 547.622 412.551C547.437 412.373 547.344 412.159 547.344 411.909C547.344 411.659 547.437 411.445 547.622 411.267C547.812 411.089 548.037 411 548.298 411C548.56 411 548.783 411.089 548.969 411.267C549.158 411.445 549.253 411.659 549.253 411.909C549.253 412.159 549.158 412.373 548.969 412.551C548.783 412.729 548.56 412.818 548.298 412.818ZM552.434 411.364V423H551.094V411.364H552.434ZM554.57 423V414.273H555.911V423H554.57ZM555.252 412.818C554.991 412.818 554.765 412.729 554.576 412.551C554.39 412.373 554.298 412.159 554.298 411.909C554.298 411.659 554.39 411.445 554.576 411.267C554.765 411.089 554.991 411 555.252 411C555.514 411 555.737 411.089 555.923 411.267C556.112 411.445 556.207 411.659 556.207 411.909C556.207 412.159 556.112 412.373 555.923 412.551C555.737 412.729 555.514 412.818 555.252 412.818ZM561.843 414.273V415.409H557.32V414.273H561.843ZM558.638 412.182H559.979V420.5C559.979 420.879 560.034 421.163 560.144 421.352C560.258 421.538 560.401 421.663 560.576 421.727C560.754 421.788 560.941 421.818 561.138 421.818C561.286 421.818 561.407 421.811 561.502 421.795C561.597 421.777 561.672 421.761 561.729 421.75L562.002 422.955C561.911 422.989 561.784 423.023 561.621 423.057C561.458 423.095 561.252 423.114 561.002 423.114C560.623 423.114 560.252 423.032 559.888 422.869C559.528 422.706 559.229 422.458 558.99 422.125C558.756 421.792 558.638 421.371 558.638 420.864V412.182ZM563.54 423V414.273H564.881V423H563.54ZM564.222 412.818C563.96 412.818 563.735 412.729 563.545 412.551C563.36 412.373 563.267 412.159 563.267 411.909C563.267 411.659 563.36 411.445 563.545 411.267C563.735 411.089 563.96 411 564.222 411C564.483 411 564.706 411.089 564.892 411.267C565.081 411.445 565.176 411.659 565.176 411.909C565.176 412.159 565.081 412.373 564.892 412.551C564.706 412.729 564.483 412.818 564.222 412.818ZM570.676 423.182C569.835 423.182 569.109 422.996 568.5 422.625C567.894 422.25 567.426 421.727 567.096 421.057C566.77 420.383 566.608 419.598 566.608 418.705C566.608 417.811 566.77 417.023 567.096 416.341C567.426 415.655 567.884 415.121 568.471 414.739C569.062 414.352 569.751 414.159 570.539 414.159C570.994 414.159 571.443 414.235 571.886 414.386C572.329 414.538 572.733 414.784 573.096 415.125C573.46 415.462 573.75 415.909 573.966 416.466C574.181 417.023 574.289 417.708 574.289 418.523V419.091H567.562V417.932H572.926C572.926 417.439 572.827 417 572.63 416.614C572.437 416.227 572.161 415.922 571.801 415.699C571.445 415.475 571.024 415.364 570.539 415.364C570.005 415.364 569.543 415.496 569.153 415.761C568.767 416.023 568.469 416.364 568.261 416.784C568.053 417.205 567.948 417.655 567.948 418.136V418.909C567.948 419.568 568.062 420.127 568.289 420.585C568.52 421.04 568.841 421.386 569.25 421.625C569.659 421.86 570.134 421.977 570.676 421.977C571.028 421.977 571.346 421.928 571.63 421.83C571.918 421.727 572.166 421.576 572.375 421.375C572.583 421.17 572.744 420.917 572.858 420.614L574.153 420.977C574.017 421.417 573.787 421.803 573.466 422.136C573.144 422.466 572.746 422.723 572.272 422.909C571.799 423.091 571.267 423.182 570.676 423.182ZM582.191 416.227L580.986 416.568C580.911 416.367 580.799 416.172 580.651 415.983C580.507 415.79 580.31 415.631 580.06 415.506C579.81 415.381 579.49 415.318 579.1 415.318C578.566 415.318 578.121 415.441 577.765 415.688C577.413 415.93 577.236 416.239 577.236 416.614C577.236 416.947 577.358 417.21 577.6 417.403C577.842 417.597 578.221 417.758 578.736 417.886L580.032 418.205C580.812 418.394 581.394 418.684 581.776 419.074C582.159 419.46 582.35 419.958 582.35 420.568C582.35 421.068 582.206 421.515 581.918 421.909C581.634 422.303 581.236 422.614 580.725 422.841C580.214 423.068 579.619 423.182 578.941 423.182C578.051 423.182 577.314 422.989 576.731 422.602C576.147 422.216 575.778 421.652 575.623 420.909L576.896 420.591C577.017 421.061 577.246 421.413 577.583 421.648C577.924 421.883 578.369 422 578.918 422C579.543 422 580.039 421.867 580.407 421.602C580.778 421.333 580.964 421.011 580.964 420.636C580.964 420.333 580.858 420.08 580.646 419.875C580.433 419.667 580.108 419.511 579.668 419.409L578.214 419.068C577.414 418.879 576.827 418.585 576.452 418.188C576.081 417.786 575.896 417.284 575.896 416.682C575.896 416.189 576.034 415.754 576.31 415.375C576.591 414.996 576.971 414.699 577.452 414.483C577.937 414.267 578.486 414.159 579.1 414.159C579.964 414.159 580.642 414.348 581.134 414.727C581.63 415.106 581.983 415.606 582.191 416.227ZM590.206 423L587.547 414.273H588.956L590.842 420.955H590.933L592.797 414.273H594.229L596.069 420.932H596.16L598.047 414.273H599.456L596.797 423H595.479L593.569 416.295H593.433L591.524 423H590.206ZM600.909 423V414.273H602.249V423H600.909ZM601.59 412.818C601.329 412.818 601.104 412.729 600.914 412.551C600.729 412.373 600.636 412.159 600.636 411.909C600.636 411.659 600.729 411.445 600.914 411.267C601.104 411.089 601.329 411 601.59 411C601.852 411 602.075 411.089 602.261 411.267C602.45 411.445 602.545 411.659 602.545 411.909C602.545 412.159 602.45 412.373 602.261 412.551C602.075 412.729 601.852 412.818 601.59 412.818ZM608.181 414.273V415.409H603.658V414.273H608.181ZM604.976 412.182H606.317V420.5C606.317 420.879 606.372 421.163 606.482 421.352C606.596 421.538 606.74 421.663 606.914 421.727C607.092 421.788 607.279 421.818 607.476 421.818C607.624 421.818 607.745 421.811 607.84 421.795C607.935 421.777 608.01 421.761 608.067 421.75L608.34 422.955C608.249 422.989 608.122 423.023 607.959 423.057C607.796 423.095 607.59 423.114 607.34 423.114C606.961 423.114 606.59 423.032 606.226 422.869C605.866 422.706 605.567 422.458 605.329 422.125C605.094 421.792 604.976 421.371 604.976 420.864V412.182ZM611.406 417.75V423H610.065V411.364H611.406V415.636H611.52C611.724 415.186 612.031 414.828 612.44 414.562C612.853 414.294 613.403 414.159 614.088 414.159C614.683 414.159 615.204 414.278 615.651 414.517C616.098 414.752 616.444 415.114 616.69 415.602C616.94 416.087 617.065 416.705 617.065 417.455V423H615.724V417.545C615.724 416.852 615.545 416.316 615.185 415.938C614.829 415.555 614.334 415.364 613.702 415.364C613.262 415.364 612.868 415.456 612.52 415.642C612.175 415.828 611.903 416.098 611.702 416.455C611.505 416.811 611.406 417.242 611.406 417.75ZM624.719 417.75V423H623.379V414.273H624.674V415.636H624.788C624.992 415.193 625.303 414.837 625.719 414.568C626.136 414.295 626.674 414.159 627.333 414.159C627.924 414.159 628.441 414.28 628.884 414.523C629.327 414.761 629.672 415.125 629.918 415.614C630.165 416.098 630.288 416.712 630.288 417.455V423H628.947V417.545C628.947 416.86 628.769 416.326 628.413 415.943C628.057 415.557 627.568 415.364 626.947 415.364C626.519 415.364 626.136 415.456 625.799 415.642C625.466 415.828 625.202 416.098 625.009 416.455C624.816 416.811 624.719 417.242 624.719 417.75ZM636.077 423.182C635.236 423.182 634.511 422.996 633.901 422.625C633.295 422.25 632.827 421.727 632.497 421.057C632.172 420.383 632.009 419.598 632.009 418.705C632.009 417.811 632.172 417.023 632.497 416.341C632.827 415.655 633.285 415.121 633.872 414.739C634.463 414.352 635.153 414.159 635.941 414.159C636.395 414.159 636.844 414.235 637.287 414.386C637.73 414.538 638.134 414.784 638.497 415.125C638.861 415.462 639.151 415.909 639.367 416.466C639.583 417.023 639.691 417.708 639.691 418.523V419.091H632.963V417.932H638.327C638.327 417.439 638.229 417 638.032 416.614C637.838 416.227 637.562 415.922 637.202 415.699C636.846 415.475 636.425 415.364 635.941 415.364C635.407 415.364 634.944 415.496 634.554 415.761C634.168 416.023 633.871 416.364 633.662 416.784C633.454 417.205 633.35 417.655 633.35 418.136V418.909C633.35 419.568 633.463 420.127 633.691 420.585C633.922 421.04 634.242 421.386 634.651 421.625C635.06 421.86 635.535 421.977 636.077 421.977C636.429 421.977 636.747 421.928 637.032 421.83C637.319 421.727 637.568 421.576 637.776 421.375C637.984 421.17 638.145 420.917 638.259 420.614L639.554 420.977C639.418 421.417 639.189 421.803 638.867 422.136C638.545 422.466 638.147 422.723 637.674 422.909C637.2 423.091 636.668 423.182 636.077 423.182ZM643.388 423L640.729 414.273H642.138L644.024 420.955H644.115L645.979 414.273H647.41L649.251 420.932H649.342L651.229 414.273H652.638L649.979 423H648.66L646.751 416.295H646.615L644.706 423H643.388ZM383.114 444.273V445.409H378.409V444.273H383.114ZM379.818 453V443.068C379.818 442.568 379.936 442.152 380.17 441.818C380.405 441.485 380.71 441.235 381.085 441.068C381.46 440.902 381.856 440.818 382.273 440.818C382.602 440.818 382.871 440.845 383.08 440.898C383.288 440.951 383.443 441 383.545 441.045L383.159 442.205C383.091 442.182 382.996 442.153 382.875 442.119C382.758 442.085 382.602 442.068 382.409 442.068C381.966 442.068 381.646 442.18 381.449 442.403C381.256 442.627 381.159 442.955 381.159 443.386V453H379.818ZM390.173 449.432V444.273H391.514V453H390.173V451.523H390.082C389.877 451.966 389.559 452.343 389.127 452.653C388.696 452.96 388.15 453.114 387.491 453.114C386.946 453.114 386.461 452.994 386.037 452.756C385.612 452.513 385.279 452.15 385.037 451.665C384.794 451.176 384.673 450.561 384.673 449.818V444.273H386.014V449.727C386.014 450.364 386.192 450.871 386.548 451.25C386.908 451.629 387.366 451.818 387.923 451.818C388.256 451.818 388.595 451.733 388.94 451.562C389.288 451.392 389.58 451.131 389.815 450.778C390.054 450.426 390.173 449.977 390.173 449.432ZM394.991 447.75V453H393.65V444.273H394.945V445.636H395.059C395.263 445.193 395.574 444.837 395.991 444.568C396.407 444.295 396.945 444.159 397.604 444.159C398.195 444.159 398.712 444.28 399.155 444.523C399.599 444.761 399.943 445.125 400.19 445.614C400.436 446.098 400.559 446.712 400.559 447.455V453H399.218V447.545C399.218 446.86 399.04 446.326 398.684 445.943C398.328 445.557 397.839 445.364 397.218 445.364C396.79 445.364 396.407 445.456 396.07 445.642C395.737 445.828 395.474 446.098 395.28 446.455C395.087 446.811 394.991 447.242 394.991 447.75ZM406.235 453.182C405.416 453.182 404.712 452.989 404.121 452.602C403.53 452.216 403.076 451.684 402.757 451.006C402.439 450.328 402.28 449.553 402.28 448.682C402.28 447.795 402.443 447.013 402.769 446.335C403.098 445.653 403.557 445.121 404.144 444.739C404.735 444.352 405.424 444.159 406.212 444.159C406.826 444.159 407.379 444.273 407.871 444.5C408.363 444.727 408.767 445.045 409.081 445.455C409.396 445.864 409.591 446.341 409.666 446.886H408.326C408.223 446.489 407.996 446.136 407.644 445.83C407.295 445.519 406.826 445.364 406.235 445.364C405.712 445.364 405.254 445.5 404.86 445.773C404.469 446.042 404.165 446.422 403.945 446.915C403.729 447.403 403.621 447.977 403.621 448.636C403.621 449.311 403.727 449.898 403.939 450.398C404.155 450.898 404.458 451.286 404.848 451.562C405.242 451.839 405.704 451.977 406.235 451.977C406.583 451.977 406.899 451.917 407.183 451.795C407.468 451.674 407.708 451.5 407.905 451.273C408.102 451.045 408.242 450.773 408.326 450.455H409.666C409.591 450.97 409.403 451.434 409.104 451.847C408.808 452.256 408.416 452.581 407.928 452.824C407.443 453.062 406.879 453.182 406.235 453.182ZM415.102 444.273V445.409H410.579V444.273H415.102ZM411.898 442.182H413.238V450.5C413.238 450.879 413.293 451.163 413.403 451.352C413.517 451.538 413.661 451.663 413.835 451.727C414.013 451.788 414.201 451.818 414.398 451.818C414.545 451.818 414.666 451.811 414.761 451.795C414.856 451.777 414.932 451.761 414.988 451.75L415.261 452.955C415.17 452.989 415.043 453.023 414.881 453.057C414.718 453.095 414.511 453.114 414.261 453.114C413.882 453.114 413.511 453.032 413.148 452.869C412.788 452.706 412.488 452.458 412.25 452.125C412.015 451.792 411.898 451.371 411.898 450.864V442.182ZM416.799 453V444.273H418.14V453H416.799ZM417.481 442.818C417.22 442.818 416.994 442.729 416.805 442.551C416.619 442.373 416.526 442.159 416.526 441.909C416.526 441.659 416.619 441.445 416.805 441.267C416.994 441.089 417.22 441 417.481 441C417.742 441 417.966 441.089 418.151 441.267C418.341 441.445 418.436 441.659 418.436 441.909C418.436 442.159 418.341 442.373 418.151 442.551C417.966 442.729 417.742 442.818 417.481 442.818ZM423.821 453.182C423.034 453.182 422.342 452.994 421.748 452.619C421.157 452.244 420.695 451.72 420.361 451.045C420.032 450.371 419.867 449.583 419.867 448.682C419.867 447.773 420.032 446.979 420.361 446.301C420.695 445.623 421.157 445.097 421.748 444.722C422.342 444.347 423.034 444.159 423.821 444.159C424.609 444.159 425.299 444.347 425.89 444.722C426.484 445.097 426.946 445.623 427.276 446.301C427.609 446.979 427.776 447.773 427.776 448.682C427.776 449.583 427.609 450.371 427.276 451.045C426.946 451.72 426.484 452.244 425.89 452.619C425.299 452.994 424.609 453.182 423.821 453.182ZM423.821 451.977C424.42 451.977 424.912 451.824 425.299 451.517C425.685 451.21 425.971 450.807 426.157 450.307C426.342 449.807 426.435 449.265 426.435 448.682C426.435 448.098 426.342 447.555 426.157 447.051C425.971 446.547 425.685 446.14 425.299 445.83C424.912 445.519 424.42 445.364 423.821 445.364C423.223 445.364 422.731 445.519 422.344 445.83C421.958 446.14 421.672 446.547 421.486 447.051C421.301 447.555 421.208 448.098 421.208 448.682C421.208 449.265 421.301 449.807 421.486 450.307C421.672 450.807 421.958 451.21 422.344 451.517C422.731 451.824 423.223 451.977 423.821 451.977ZM430.844 447.75V453H429.503V444.273H430.798V445.636H430.912C431.117 445.193 431.427 444.837 431.844 444.568C432.26 444.295 432.798 444.159 433.457 444.159C434.048 444.159 434.565 444.28 435.009 444.523C435.452 444.761 435.796 445.125 436.043 445.614C436.289 446.098 436.412 446.712 436.412 447.455V453H435.071V447.545C435.071 446.86 434.893 446.326 434.537 445.943C434.181 445.557 433.692 445.364 433.071 445.364C432.643 445.364 432.26 445.456 431.923 445.642C431.59 445.828 431.327 446.098 431.134 446.455C430.94 446.811 430.844 447.242 430.844 447.75ZM441.11 453.205C440.557 453.205 440.056 453.1 439.605 452.892C439.154 452.68 438.796 452.375 438.531 451.977C438.266 451.576 438.133 451.091 438.133 450.523C438.133 450.023 438.232 449.617 438.429 449.307C438.626 448.992 438.889 448.746 439.218 448.568C439.548 448.39 439.912 448.258 440.309 448.17C440.711 448.08 441.114 448.008 441.52 447.955C442.05 447.886 442.48 447.835 442.809 447.801C443.143 447.763 443.385 447.701 443.537 447.614C443.692 447.527 443.77 447.375 443.77 447.159V447.114C443.77 446.553 443.616 446.117 443.309 445.807C443.006 445.496 442.546 445.341 441.929 445.341C441.288 445.341 440.787 445.481 440.423 445.761C440.059 446.042 439.804 446.341 439.656 446.659L438.383 446.205C438.61 445.674 438.913 445.261 439.292 444.966C439.675 444.667 440.092 444.458 440.542 444.341C440.997 444.22 441.444 444.159 441.883 444.159C442.163 444.159 442.485 444.193 442.849 444.261C443.217 444.326 443.571 444.46 443.912 444.665C444.256 444.869 444.542 445.178 444.77 445.591C444.997 446.004 445.11 446.557 445.11 447.25V453H443.77V451.818H443.701C443.61 452.008 443.459 452.21 443.247 452.426C443.035 452.642 442.752 452.826 442.4 452.977C442.048 453.129 441.618 453.205 441.11 453.205ZM441.315 452C441.845 452 442.292 451.896 442.656 451.688C443.023 451.479 443.3 451.21 443.485 450.881C443.675 450.551 443.77 450.205 443.77 449.841V448.614C443.713 448.682 443.588 448.744 443.395 448.801C443.205 448.854 442.985 448.902 442.735 448.943C442.489 448.981 442.249 449.015 442.014 449.045C441.783 449.072 441.595 449.095 441.451 449.114C441.103 449.159 440.777 449.233 440.474 449.335C440.175 449.434 439.932 449.583 439.747 449.784C439.565 449.981 439.474 450.25 439.474 450.591C439.474 451.057 439.646 451.409 439.991 451.648C440.34 451.883 440.781 452 441.315 452ZM448.579 441.364V453H447.238V441.364H448.579ZM450.715 453V444.273H452.056V453H450.715ZM451.397 442.818C451.135 442.818 450.91 442.729 450.72 442.551C450.535 442.373 450.442 442.159 450.442 441.909C450.442 441.659 450.535 441.445 450.72 441.267C450.91 441.089 451.135 441 451.397 441C451.658 441 451.881 441.089 452.067 441.267C452.256 441.445 452.351 441.659 452.351 441.909C452.351 442.159 452.256 442.373 452.067 442.551C451.881 442.729 451.658 442.818 451.397 442.818ZM457.987 444.273V445.409H453.464V444.273H457.987ZM454.783 442.182H456.123V450.5C456.123 450.879 456.178 451.163 456.288 451.352C456.402 451.538 456.546 451.663 456.72 451.727C456.898 451.788 457.086 451.818 457.283 451.818C457.43 451.818 457.551 451.811 457.646 451.795C457.741 451.777 457.817 451.761 457.873 451.75L458.146 452.955C458.055 452.989 457.928 453.023 457.766 453.057C457.603 453.095 457.396 453.114 457.146 453.114C456.767 453.114 456.396 453.032 456.033 452.869C455.673 452.706 455.373 452.458 455.135 452.125C454.9 451.792 454.783 451.371 454.783 450.864V442.182ZM459.684 453V444.273H461.025V453H459.684ZM460.366 442.818C460.105 442.818 459.879 442.729 459.69 442.551C459.504 442.373 459.411 442.159 459.411 441.909C459.411 441.659 459.504 441.445 459.69 441.267C459.879 441.089 460.105 441 460.366 441C460.627 441 460.851 441.089 461.036 441.267C461.226 441.445 461.321 441.659 461.321 441.909C461.321 442.159 461.226 442.373 461.036 442.551C460.851 442.729 460.627 442.818 460.366 442.818ZM466.82 453.182C465.979 453.182 465.254 452.996 464.644 452.625C464.038 452.25 463.57 451.727 463.241 451.057C462.915 450.383 462.752 449.598 462.752 448.705C462.752 447.811 462.915 447.023 463.241 446.341C463.57 445.655 464.028 445.121 464.616 444.739C465.206 444.352 465.896 444.159 466.684 444.159C467.138 444.159 467.587 444.235 468.03 444.386C468.474 444.538 468.877 444.784 469.241 445.125C469.604 445.462 469.894 445.909 470.11 446.466C470.326 447.023 470.434 447.708 470.434 448.523V449.091H463.706V447.932H469.07C469.07 447.439 468.972 447 468.775 446.614C468.581 446.227 468.305 445.922 467.945 445.699C467.589 445.475 467.169 445.364 466.684 445.364C466.15 445.364 465.688 445.496 465.297 445.761C464.911 446.023 464.614 446.364 464.405 446.784C464.197 447.205 464.093 447.655 464.093 448.136V448.909C464.093 449.568 464.206 450.127 464.434 450.585C464.665 451.04 464.985 451.386 465.394 451.625C465.803 451.86 466.278 451.977 466.82 451.977C467.172 451.977 467.491 451.928 467.775 451.83C468.063 451.727 468.311 451.576 468.519 451.375C468.727 451.17 468.888 450.917 469.002 450.614L470.297 450.977C470.161 451.417 469.932 451.803 469.61 452.136C469.288 452.466 468.89 452.723 468.417 452.909C467.943 453.091 467.411 453.182 466.82 453.182ZM478.335 446.227L477.131 446.568C477.055 446.367 476.943 446.172 476.796 445.983C476.652 445.79 476.455 445.631 476.205 445.506C475.955 445.381 475.635 445.318 475.244 445.318C474.71 445.318 474.265 445.441 473.909 445.688C473.557 445.93 473.381 446.239 473.381 446.614C473.381 446.947 473.502 447.21 473.744 447.403C473.987 447.597 474.366 447.758 474.881 447.886L476.176 448.205C476.957 448.394 477.538 448.684 477.921 449.074C478.303 449.46 478.494 449.958 478.494 450.568C478.494 451.068 478.35 451.515 478.063 451.909C477.779 452.303 477.381 452.614 476.869 452.841C476.358 453.068 475.763 453.182 475.085 453.182C474.195 453.182 473.458 452.989 472.875 452.602C472.292 452.216 471.922 451.652 471.767 450.909L473.04 450.591C473.161 451.061 473.39 451.413 473.727 451.648C474.068 451.883 474.513 452 475.063 452C475.688 452 476.184 451.867 476.551 451.602C476.922 451.333 477.108 451.011 477.108 450.636C477.108 450.333 477.002 450.08 476.79 449.875C476.578 449.667 476.252 449.511 475.813 449.409L474.358 449.068C473.559 448.879 472.972 448.585 472.597 448.188C472.225 447.786 472.04 447.284 472.04 446.682C472.04 446.189 472.178 445.754 472.455 445.375C472.735 444.996 473.116 444.699 473.597 444.483C474.082 444.267 474.631 444.159 475.244 444.159C476.108 444.159 476.786 444.348 477.279 444.727C477.775 445.106 478.127 445.606 478.335 446.227ZM482.193 451.409L482.102 452.023C482.038 452.455 481.939 452.917 481.807 453.409C481.678 453.902 481.543 454.366 481.403 454.801C481.263 455.237 481.147 455.583 481.057 455.841H480.034C480.083 455.598 480.147 455.278 480.227 454.881C480.307 454.483 480.386 454.038 480.466 453.545C480.549 453.057 480.617 452.557 480.67 452.045L480.738 451.409H482.193ZM488.537 453V444.273H489.878V453H488.537ZM489.219 442.818C488.958 442.818 488.732 442.729 488.543 442.551C488.357 442.373 488.265 442.159 488.265 441.909C488.265 441.659 488.357 441.445 488.543 441.267C488.732 441.089 488.958 441 489.219 441C489.48 441 489.704 441.089 489.89 441.267C490.079 441.445 490.174 441.659 490.174 441.909C490.174 442.159 490.079 442.373 489.89 442.551C489.704 442.729 489.48 442.818 489.219 442.818ZM493.355 447.75V453H492.014V444.273H493.31V445.636H493.423C493.628 445.193 493.938 444.837 494.355 444.568C494.772 444.295 495.31 444.159 495.969 444.159C496.56 444.159 497.077 444.28 497.52 444.523C497.963 444.761 498.308 445.125 498.554 445.614C498.8 446.098 498.923 446.712 498.923 447.455V453H497.582V447.545C497.582 446.86 497.404 446.326 497.048 445.943C496.692 445.557 496.204 445.364 495.582 445.364C495.154 445.364 494.772 445.456 494.435 445.642C494.101 445.828 493.838 446.098 493.645 446.455C493.452 446.811 493.355 447.242 493.355 447.75ZM504.849 444.273V445.409H500.326V444.273H504.849ZM501.644 442.182H502.985V450.5C502.985 450.879 503.04 451.163 503.15 451.352C503.264 451.538 503.408 451.663 503.582 451.727C503.76 451.788 503.947 451.818 504.144 451.818C504.292 451.818 504.413 451.811 504.508 451.795C504.603 451.777 504.679 451.761 504.735 451.75L505.008 452.955C504.917 452.989 504.79 453.023 504.627 453.057C504.465 453.095 504.258 453.114 504.008 453.114C503.629 453.114 503.258 453.032 502.894 452.869C502.535 452.706 502.235 452.458 501.997 452.125C501.762 451.792 501.644 451.371 501.644 450.864V442.182ZM510.111 453.182C509.27 453.182 508.545 452.996 507.935 452.625C507.329 452.25 506.861 451.727 506.532 451.057C506.206 450.383 506.043 449.598 506.043 448.705C506.043 447.811 506.206 447.023 506.532 446.341C506.861 445.655 507.32 445.121 507.907 444.739C508.498 444.352 509.187 444.159 509.975 444.159C510.43 444.159 510.878 444.235 511.322 444.386C511.765 444.538 512.168 444.784 512.532 445.125C512.895 445.462 513.185 445.909 513.401 446.466C513.617 447.023 513.725 447.708 513.725 448.523V449.091H506.998V447.932H512.361C512.361 447.439 512.263 447 512.066 446.614C511.873 446.227 511.596 445.922 511.236 445.699C510.88 445.475 510.46 445.364 509.975 445.364C509.441 445.364 508.979 445.496 508.589 445.761C508.202 446.023 507.905 446.364 507.697 446.784C507.488 447.205 507.384 447.655 507.384 448.136V448.909C507.384 449.568 507.498 450.127 507.725 450.585C507.956 451.04 508.276 451.386 508.685 451.625C509.094 451.86 509.57 451.977 510.111 451.977C510.464 451.977 510.782 451.928 511.066 451.83C511.354 451.727 511.602 451.576 511.81 451.375C512.019 451.17 512.18 450.917 512.293 450.614L513.589 450.977C513.452 451.417 513.223 451.803 512.901 452.136C512.579 452.466 512.181 452.723 511.708 452.909C511.234 453.091 510.702 453.182 510.111 453.182ZM518.967 456.455C518.32 456.455 517.763 456.371 517.297 456.205C516.831 456.042 516.443 455.826 516.132 455.557C515.825 455.292 515.581 455.008 515.399 454.705L516.467 453.955C516.589 454.114 516.742 454.295 516.928 454.5C517.113 454.708 517.367 454.888 517.689 455.04C518.015 455.195 518.441 455.273 518.967 455.273C519.672 455.273 520.253 455.102 520.712 454.761C521.17 454.42 521.399 453.886 521.399 453.159V451.386H521.286C521.187 451.545 521.047 451.742 520.865 451.977C520.687 452.208 520.43 452.415 520.092 452.597C519.759 452.775 519.308 452.864 518.74 452.864C518.036 452.864 517.403 452.697 516.842 452.364C516.286 452.03 515.844 451.545 515.519 450.909C515.197 450.273 515.036 449.5 515.036 448.591C515.036 447.697 515.193 446.919 515.507 446.256C515.822 445.589 516.259 445.074 516.82 444.71C517.38 444.343 518.028 444.159 518.763 444.159C519.331 444.159 519.782 444.254 520.115 444.443C520.452 444.629 520.71 444.841 520.888 445.08C521.07 445.314 521.21 445.508 521.308 445.659H521.445V444.273H522.74V453.25C522.74 454 522.57 454.61 522.229 455.08C521.892 455.553 521.437 455.9 520.865 456.119C520.297 456.343 519.664 456.455 518.967 456.455ZM518.922 451.659C519.46 451.659 519.914 451.536 520.286 451.29C520.657 451.044 520.939 450.689 521.132 450.227C521.325 449.765 521.422 449.212 521.422 448.568C521.422 447.939 521.327 447.384 521.138 446.903C520.949 446.422 520.668 446.045 520.297 445.773C519.926 445.5 519.467 445.364 518.922 445.364C518.354 445.364 517.88 445.508 517.502 445.795C517.127 446.083 516.844 446.47 516.655 446.955C516.469 447.439 516.377 447.977 516.377 448.568C516.377 449.174 516.471 449.71 516.661 450.176C516.854 450.638 517.138 451.002 517.513 451.267C517.892 451.528 518.361 451.659 518.922 451.659ZM524.875 453V444.273H526.17V445.591H526.261C526.42 445.159 526.708 444.809 527.125 444.54C527.541 444.271 528.011 444.136 528.534 444.136C528.632 444.136 528.755 444.138 528.903 444.142C529.051 444.146 529.163 444.152 529.238 444.159V445.523C529.193 445.511 529.089 445.494 528.926 445.472C528.767 445.445 528.598 445.432 528.42 445.432C527.996 445.432 527.617 445.521 527.284 445.699C526.954 445.873 526.693 446.116 526.5 446.426C526.31 446.733 526.216 447.083 526.216 447.477V453H524.875ZM533.076 453.205C532.523 453.205 532.021 453.1 531.57 452.892C531.12 452.68 530.762 452.375 530.497 451.977C530.231 451.576 530.099 451.091 530.099 450.523C530.099 450.023 530.197 449.617 530.394 449.307C530.591 448.992 530.854 448.746 531.184 448.568C531.514 448.39 531.877 448.258 532.275 448.17C532.676 448.08 533.08 448.008 533.485 447.955C534.015 447.886 534.445 447.835 534.775 447.801C535.108 447.763 535.351 447.701 535.502 447.614C535.658 447.527 535.735 447.375 535.735 447.159V447.114C535.735 446.553 535.582 446.117 535.275 445.807C534.972 445.496 534.512 445.341 533.894 445.341C533.254 445.341 532.752 445.481 532.389 445.761C532.025 446.042 531.769 446.341 531.622 446.659L530.349 446.205C530.576 445.674 530.879 445.261 531.258 444.966C531.64 444.667 532.057 444.458 532.508 444.341C532.962 444.22 533.409 444.159 533.849 444.159C534.129 444.159 534.451 444.193 534.815 444.261C535.182 444.326 535.536 444.46 535.877 444.665C536.222 444.869 536.508 445.178 536.735 445.591C536.962 446.004 537.076 446.557 537.076 447.25V453H535.735V451.818H535.667C535.576 452.008 535.425 452.21 535.212 452.426C535 452.642 534.718 452.826 534.366 452.977C534.014 453.129 533.584 453.205 533.076 453.205ZM533.281 452C533.811 452 534.258 451.896 534.622 451.688C534.989 451.479 535.265 451.21 535.451 450.881C535.64 450.551 535.735 450.205 535.735 449.841V448.614C535.678 448.682 535.553 448.744 535.36 448.801C535.171 448.854 534.951 448.902 534.701 448.943C534.455 448.981 534.214 449.015 533.979 449.045C533.748 449.072 533.561 449.095 533.417 449.114C533.069 449.159 532.743 449.233 532.44 449.335C532.14 449.434 531.898 449.583 531.712 449.784C531.531 449.981 531.44 450.25 531.44 450.591C531.44 451.057 531.612 451.409 531.957 451.648C532.305 451.883 532.747 452 533.281 452ZM542.999 444.273V445.409H538.476V444.273H542.999ZM539.794 442.182H541.135V450.5C541.135 450.879 541.19 451.163 541.3 451.352C541.414 451.538 541.558 451.663 541.732 451.727C541.91 451.788 542.097 451.818 542.294 451.818C542.442 451.818 542.563 451.811 542.658 451.795C542.753 451.777 542.829 451.761 542.885 451.75L543.158 452.955C543.067 452.989 542.94 453.023 542.777 453.057C542.615 453.095 542.408 453.114 542.158 453.114C541.779 453.114 541.408 453.032 541.044 452.869C540.685 452.706 540.385 452.458 540.147 452.125C539.912 451.792 539.794 451.371 539.794 450.864V442.182ZM548.261 453.182C547.42 453.182 546.695 452.996 546.085 452.625C545.479 452.25 545.011 451.727 544.682 451.057C544.356 450.383 544.193 449.598 544.193 448.705C544.193 447.811 544.356 447.023 544.682 446.341C545.011 445.655 545.47 445.121 546.057 444.739C546.648 444.352 547.337 444.159 548.125 444.159C548.58 444.159 549.028 444.235 549.472 444.386C549.915 444.538 550.318 444.784 550.682 445.125C551.045 445.462 551.335 445.909 551.551 446.466C551.767 447.023 551.875 447.708 551.875 448.523V449.091H545.148V447.932H550.511C550.511 447.439 550.413 447 550.216 446.614C550.023 446.227 549.746 445.922 549.386 445.699C549.03 445.475 548.61 445.364 548.125 445.364C547.591 445.364 547.129 445.496 546.739 445.761C546.352 446.023 546.055 446.364 545.847 446.784C545.638 447.205 545.534 447.655 545.534 448.136V448.909C545.534 449.568 545.648 450.127 545.875 450.585C546.106 451.04 546.426 451.386 546.835 451.625C547.244 451.86 547.72 451.977 548.261 451.977C548.614 451.977 548.932 451.928 549.216 451.83C549.504 451.727 549.752 451.576 549.96 451.375C550.169 451.17 550.33 450.917 550.443 450.614L551.739 450.977C551.602 451.417 551.373 451.803 551.051 452.136C550.729 452.466 550.331 452.723 549.858 452.909C549.384 453.091 548.852 453.182 548.261 453.182ZM563.275 449.432V444.273H564.616V453H563.275V451.523H563.184C562.979 451.966 562.661 452.343 562.229 452.653C561.798 452.96 561.252 453.114 560.593 453.114C560.048 453.114 559.563 452.994 559.138 452.756C558.714 452.513 558.381 452.15 558.138 451.665C557.896 451.176 557.775 450.561 557.775 449.818V444.273H559.116V449.727C559.116 450.364 559.294 450.871 559.65 451.25C560.01 451.629 560.468 451.818 561.025 451.818C561.358 451.818 561.697 451.733 562.042 451.562C562.39 451.392 562.682 451.131 562.917 450.778C563.155 450.426 563.275 449.977 563.275 449.432ZM572.933 446.227L571.729 446.568C571.653 446.367 571.541 446.172 571.394 445.983C571.25 445.79 571.053 445.631 570.803 445.506C570.553 445.381 570.233 445.318 569.843 445.318C569.308 445.318 568.863 445.441 568.507 445.688C568.155 445.93 567.979 446.239 567.979 446.614C567.979 446.947 568.1 447.21 568.343 447.403C568.585 447.597 568.964 447.758 569.479 447.886L570.774 448.205C571.555 448.394 572.136 448.684 572.519 449.074C572.901 449.46 573.093 449.958 573.093 450.568C573.093 451.068 572.949 451.515 572.661 451.909C572.377 452.303 571.979 452.614 571.468 452.841C570.956 453.068 570.361 453.182 569.683 453.182C568.793 453.182 568.057 452.989 567.473 452.602C566.89 452.216 566.521 451.652 566.365 450.909L567.638 450.591C567.759 451.061 567.988 451.413 568.326 451.648C568.666 451.883 569.111 452 569.661 452C570.286 452 570.782 451.867 571.149 451.602C571.521 451.333 571.706 451.011 571.706 450.636C571.706 450.333 571.6 450.08 571.388 449.875C571.176 449.667 570.85 449.511 570.411 449.409L568.956 449.068C568.157 448.879 567.57 448.585 567.195 448.188C566.824 447.786 566.638 447.284 566.638 446.682C566.638 446.189 566.776 445.754 567.053 445.375C567.333 444.996 567.714 444.699 568.195 444.483C568.68 444.267 569.229 444.159 569.843 444.159C570.706 444.159 571.384 444.348 571.877 444.727C572.373 445.106 572.725 445.606 572.933 446.227ZM578.45 453.182C577.609 453.182 576.884 452.996 576.274 452.625C575.668 452.25 575.2 451.727 574.871 451.057C574.545 450.383 574.382 449.598 574.382 448.705C574.382 447.811 574.545 447.023 574.871 446.341C575.2 445.655 575.658 445.121 576.246 444.739C576.836 444.352 577.526 444.159 578.314 444.159C578.768 444.159 579.217 444.235 579.66 444.386C580.104 444.538 580.507 444.784 580.871 445.125C581.234 445.462 581.524 445.909 581.74 446.466C581.956 447.023 582.064 447.708 582.064 448.523V449.091H575.336V447.932H580.7C580.7 447.439 580.602 447 580.405 446.614C580.211 446.227 579.935 445.922 579.575 445.699C579.219 445.475 578.799 445.364 578.314 445.364C577.78 445.364 577.318 445.496 576.927 445.761C576.541 446.023 576.244 446.364 576.035 446.784C575.827 447.205 575.723 447.655 575.723 448.136V448.909C575.723 449.568 575.836 450.127 576.064 450.585C576.295 451.04 576.615 451.386 577.024 451.625C577.433 451.86 577.908 451.977 578.45 451.977C578.802 451.977 579.121 451.928 579.405 451.83C579.693 451.727 579.941 451.576 580.149 451.375C580.357 451.17 580.518 450.917 580.632 450.614L581.927 450.977C581.791 451.417 581.562 451.803 581.24 452.136C580.918 452.466 580.52 452.723 580.047 452.909C579.573 453.091 579.041 453.182 578.45 453.182ZM583.784 453V444.273H585.079V445.591H585.17C585.329 445.159 585.617 444.809 586.034 444.54C586.45 444.271 586.92 444.136 587.443 444.136C587.541 444.136 587.664 444.138 587.812 444.142C587.96 444.146 588.071 444.152 588.147 444.159V445.523C588.102 445.511 587.998 445.494 587.835 445.472C587.676 445.445 587.507 445.432 587.329 445.432C586.905 445.432 586.526 445.521 586.193 445.699C585.863 445.873 585.602 446.116 585.409 446.426C585.219 446.733 585.124 447.083 585.124 447.477V453H583.784ZM383.114 474.273V475.409H378.409V474.273H383.114ZM379.818 483V473.068C379.818 472.568 379.936 472.152 380.17 471.818C380.405 471.485 380.71 471.235 381.085 471.068C381.46 470.902 381.856 470.818 382.273 470.818C382.602 470.818 382.871 470.845 383.08 470.898C383.288 470.951 383.443 471 383.545 471.045L383.159 472.205C383.091 472.182 382.996 472.153 382.875 472.119C382.758 472.085 382.602 472.068 382.409 472.068C381.966 472.068 381.646 472.18 381.449 472.403C381.256 472.627 381.159 472.955 381.159 473.386V483H379.818ZM387.973 483.182C387.132 483.182 386.406 482.996 385.796 482.625C385.19 482.25 384.723 481.727 384.393 481.057C384.067 480.383 383.904 479.598 383.904 478.705C383.904 477.811 384.067 477.023 384.393 476.341C384.723 475.655 385.181 475.121 385.768 474.739C386.359 474.352 387.048 474.159 387.836 474.159C388.291 474.159 388.74 474.235 389.183 474.386C389.626 474.538 390.029 474.784 390.393 475.125C390.757 475.462 391.046 475.909 391.262 476.466C391.478 477.023 391.586 477.708 391.586 478.523V479.091H384.859V477.932H390.223C390.223 477.439 390.124 477 389.927 476.614C389.734 476.227 389.457 475.922 389.098 475.699C388.742 475.475 388.321 475.364 387.836 475.364C387.302 475.364 386.84 475.496 386.45 475.761C386.064 476.023 385.766 476.364 385.558 476.784C385.35 477.205 385.245 477.655 385.245 478.136V478.909C385.245 479.568 385.359 480.127 385.586 480.585C385.817 481.04 386.137 481.386 386.546 481.625C386.956 481.86 387.431 481.977 387.973 481.977C388.325 481.977 388.643 481.928 388.927 481.83C389.215 481.727 389.463 481.576 389.671 481.375C389.88 481.17 390.041 480.917 390.154 480.614L391.45 480.977C391.314 481.417 391.084 481.803 390.762 482.136C390.44 482.466 390.043 482.723 389.569 482.909C389.096 483.091 388.564 483.182 387.973 483.182ZM396.965 483.182C396.124 483.182 395.399 482.996 394.789 482.625C394.183 482.25 393.715 481.727 393.386 481.057C393.06 480.383 392.897 479.598 392.897 478.705C392.897 477.811 393.06 477.023 393.386 476.341C393.715 475.655 394.173 475.121 394.761 474.739C395.351 474.352 396.041 474.159 396.829 474.159C397.283 474.159 397.732 474.235 398.175 474.386C398.619 474.538 399.022 474.784 399.386 475.125C399.749 475.462 400.039 475.909 400.255 476.466C400.471 477.023 400.579 477.708 400.579 478.523V479.091H393.851V477.932H399.215C399.215 477.439 399.117 477 398.92 476.614C398.726 476.227 398.45 475.922 398.09 475.699C397.734 475.475 397.314 475.364 396.829 475.364C396.295 475.364 395.833 475.496 395.442 475.761C395.056 476.023 394.759 476.364 394.55 476.784C394.342 477.205 394.238 477.655 394.238 478.136V478.909C394.238 479.568 394.351 480.127 394.579 480.585C394.81 481.04 395.13 481.386 395.539 481.625C395.948 481.86 396.423 481.977 396.965 481.977C397.317 481.977 397.636 481.928 397.92 481.83C398.208 481.727 398.456 481.576 398.664 481.375C398.872 481.17 399.033 480.917 399.147 480.614L400.442 480.977C400.306 481.417 400.077 481.803 399.755 482.136C399.433 482.466 399.035 482.723 398.562 482.909C398.088 483.091 397.556 483.182 396.965 483.182ZM405.594 483.182C404.867 483.182 404.225 482.998 403.668 482.631C403.111 482.259 402.675 481.737 402.361 481.062C402.047 480.384 401.889 479.583 401.889 478.659C401.889 477.742 402.047 476.947 402.361 476.273C402.675 475.598 403.113 475.078 403.674 474.71C404.234 474.343 404.882 474.159 405.617 474.159C406.185 474.159 406.634 474.254 406.963 474.443C407.297 474.629 407.55 474.841 407.725 475.08C407.903 475.314 408.041 475.508 408.139 475.659H408.253V471.364H409.594V483H408.299V481.659H408.139C408.041 481.818 407.901 482.019 407.719 482.261C407.537 482.5 407.278 482.714 406.941 482.903C406.603 483.089 406.155 483.182 405.594 483.182ZM405.776 481.977C406.314 481.977 406.768 481.837 407.139 481.557C407.511 481.273 407.793 480.881 407.986 480.381C408.179 479.877 408.276 479.295 408.276 478.636C408.276 477.985 408.181 477.415 407.992 476.926C407.802 476.434 407.522 476.051 407.151 475.778C406.78 475.502 406.321 475.364 405.776 475.364C405.208 475.364 404.734 475.509 404.355 475.801C403.98 476.089 403.698 476.481 403.509 476.977C403.323 477.47 403.23 478.023 403.23 478.636C403.23 479.258 403.325 479.822 403.514 480.33C403.708 480.833 403.992 481.235 404.367 481.534C404.745 481.83 405.215 481.977 405.776 481.977ZM412.098 483V471.364H413.439V475.659H413.552C413.651 475.508 413.787 475.314 413.961 475.08C414.14 474.841 414.393 474.629 414.723 474.443C415.056 474.254 415.507 474.159 416.075 474.159C416.81 474.159 417.458 474.343 418.018 474.71C418.579 475.078 419.016 475.598 419.331 476.273C419.645 476.947 419.802 477.742 419.802 478.659C419.802 479.583 419.645 480.384 419.331 481.062C419.016 481.737 418.581 482.259 418.024 482.631C417.467 482.998 416.825 483.182 416.098 483.182C415.537 483.182 415.088 483.089 414.751 482.903C414.414 482.714 414.155 482.5 413.973 482.261C413.791 482.019 413.651 481.818 413.552 481.659H413.393V483H412.098ZM413.416 478.636C413.416 479.295 413.513 479.877 413.706 480.381C413.899 480.881 414.181 481.273 414.552 481.557C414.924 481.837 415.378 481.977 415.916 481.977C416.477 481.977 416.944 481.83 417.319 481.534C417.698 481.235 417.982 480.833 418.172 480.33C418.365 479.822 418.461 479.258 418.461 478.636C418.461 478.023 418.367 477.47 418.177 476.977C417.992 476.481 417.71 476.089 417.331 475.801C416.956 475.509 416.484 475.364 415.916 475.364C415.371 475.364 414.912 475.502 414.541 475.778C414.17 476.051 413.89 476.434 413.7 476.926C413.511 477.415 413.416 477.985 413.416 478.636ZM424.102 483.205C423.549 483.205 423.047 483.1 422.596 482.892C422.145 482.68 421.787 482.375 421.522 481.977C421.257 481.576 421.124 481.091 421.124 480.523C421.124 480.023 421.223 479.617 421.42 479.307C421.617 478.992 421.88 478.746 422.21 478.568C422.539 478.39 422.903 478.258 423.301 478.17C423.702 478.08 424.105 478.008 424.511 477.955C425.041 477.886 425.471 477.835 425.801 477.801C426.134 477.763 426.376 477.701 426.528 477.614C426.683 477.527 426.761 477.375 426.761 477.159V477.114C426.761 476.553 426.607 476.117 426.301 475.807C425.998 475.496 425.537 475.341 424.92 475.341C424.28 475.341 423.778 475.481 423.414 475.761C423.051 476.042 422.795 476.341 422.647 476.659L421.374 476.205C421.602 475.674 421.905 475.261 422.284 474.966C422.666 474.667 423.083 474.458 423.534 474.341C423.988 474.22 424.435 474.159 424.874 474.159C425.155 474.159 425.477 474.193 425.84 474.261C426.208 474.326 426.562 474.46 426.903 474.665C427.248 474.869 427.534 475.178 427.761 475.591C427.988 476.004 428.102 476.557 428.102 477.25V483H426.761V481.818H426.693C426.602 482.008 426.45 482.21 426.238 482.426C426.026 482.642 425.744 482.826 425.391 482.977C425.039 483.129 424.609 483.205 424.102 483.205ZM424.306 482C424.837 482 425.284 481.896 425.647 481.688C426.015 481.479 426.291 481.21 426.477 480.881C426.666 480.551 426.761 480.205 426.761 479.841V478.614C426.704 478.682 426.579 478.744 426.386 478.801C426.196 478.854 425.977 478.902 425.727 478.943C425.48 478.981 425.24 479.015 425.005 479.045C424.774 479.072 424.587 479.095 424.443 479.114C424.094 479.159 423.768 479.233 423.465 479.335C423.166 479.434 422.924 479.583 422.738 479.784C422.556 479.981 422.465 480.25 422.465 480.591C422.465 481.057 422.638 481.409 422.982 481.648C423.331 481.883 423.772 482 424.306 482ZM433.775 483.182C432.956 483.182 432.252 482.989 431.661 482.602C431.07 482.216 430.616 481.684 430.297 481.006C429.979 480.328 429.82 479.553 429.82 478.682C429.82 477.795 429.983 477.013 430.309 476.335C430.638 475.653 431.097 475.121 431.684 474.739C432.275 474.352 432.964 474.159 433.752 474.159C434.366 474.159 434.919 474.273 435.411 474.5C435.903 474.727 436.307 475.045 436.621 475.455C436.936 475.864 437.131 476.341 437.206 476.886H435.866C435.763 476.489 435.536 476.136 435.184 475.83C434.835 475.519 434.366 475.364 433.775 475.364C433.252 475.364 432.794 475.5 432.4 475.773C432.009 476.042 431.705 476.422 431.485 476.915C431.269 477.403 431.161 477.977 431.161 478.636C431.161 479.311 431.267 479.898 431.479 480.398C431.695 480.898 431.998 481.286 432.388 481.562C432.782 481.839 433.244 481.977 433.775 481.977C434.123 481.977 434.439 481.917 434.723 481.795C435.008 481.674 435.248 481.5 435.445 481.273C435.642 481.045 435.782 480.773 435.866 480.455H437.206C437.131 480.97 436.943 481.434 436.644 481.847C436.348 482.256 435.956 482.581 435.468 482.824C434.983 483.062 434.419 483.182 433.775 483.182ZM440.097 479.818L440.074 478.159H440.347L444.165 474.273H445.824L441.756 478.386H441.642L440.097 479.818ZM438.847 483V471.364H440.188V483H438.847ZM444.392 483L440.983 478.682L441.938 477.75L446.097 483H444.392ZM455.296 474.273V475.409H450.592V474.273H455.296ZM452.001 483V473.068C452.001 472.568 452.118 472.152 452.353 471.818C452.588 471.485 452.893 471.235 453.268 471.068C453.643 470.902 454.039 470.818 454.455 470.818C454.785 470.818 455.054 470.845 455.262 470.898C455.47 470.951 455.626 471 455.728 471.045L455.342 472.205C455.273 472.182 455.179 472.153 455.058 472.119C454.94 472.085 454.785 472.068 454.592 472.068C454.148 472.068 453.828 472.18 453.631 472.403C453.438 472.627 453.342 472.955 453.342 473.386V483H452.001ZM460.041 483.182C459.254 483.182 458.562 482.994 457.968 482.619C457.377 482.244 456.915 481.72 456.581 481.045C456.252 480.371 456.087 479.583 456.087 478.682C456.087 477.773 456.252 476.979 456.581 476.301C456.915 475.623 457.377 475.097 457.968 474.722C458.562 474.347 459.254 474.159 460.041 474.159C460.829 474.159 461.519 474.347 462.11 474.722C462.704 475.097 463.166 475.623 463.496 476.301C463.829 476.979 463.996 477.773 463.996 478.682C463.996 479.583 463.829 480.371 463.496 481.045C463.166 481.72 462.704 482.244 462.11 482.619C461.519 482.994 460.829 483.182 460.041 483.182ZM460.041 481.977C460.64 481.977 461.132 481.824 461.519 481.517C461.905 481.21 462.191 480.807 462.377 480.307C462.562 479.807 462.655 479.265 462.655 478.682C462.655 478.098 462.562 477.555 462.377 477.051C462.191 476.547 461.905 476.14 461.519 475.83C461.132 475.519 460.64 475.364 460.041 475.364C459.443 475.364 458.951 475.519 458.564 475.83C458.178 476.14 457.892 476.547 457.706 477.051C457.521 477.555 457.428 478.098 457.428 478.682C457.428 479.265 457.521 479.807 457.706 480.307C457.892 480.807 458.178 481.21 458.564 481.517C458.951 481.824 459.443 481.977 460.041 481.977ZM465.723 483V474.273H467.018V475.591H467.109C467.268 475.159 467.556 474.809 467.973 474.54C468.39 474.271 468.859 474.136 469.382 474.136C469.48 474.136 469.604 474.138 469.751 474.142C469.899 474.146 470.011 474.152 470.087 474.159V475.523C470.041 475.511 469.937 475.494 469.774 475.472C469.615 475.445 469.446 475.432 469.268 475.432C468.844 475.432 468.465 475.521 468.132 475.699C467.802 475.873 467.541 476.116 467.348 476.426C467.159 476.733 467.064 477.083 467.064 477.477V483H465.723ZM481.718 476.227L480.513 476.568C480.438 476.367 480.326 476.172 480.178 475.983C480.034 475.79 479.837 475.631 479.587 475.506C479.337 475.381 479.017 475.318 478.627 475.318C478.093 475.318 477.648 475.441 477.292 475.688C476.939 475.93 476.763 476.239 476.763 476.614C476.763 476.947 476.885 477.21 477.127 477.403C477.369 477.597 477.748 477.758 478.263 477.886L479.559 478.205C480.339 478.394 480.92 478.684 481.303 479.074C481.686 479.46 481.877 479.958 481.877 480.568C481.877 481.068 481.733 481.515 481.445 481.909C481.161 482.303 480.763 482.614 480.252 482.841C479.741 483.068 479.146 483.182 478.468 483.182C477.578 483.182 476.841 482.989 476.258 482.602C475.674 482.216 475.305 481.652 475.15 480.909L476.422 480.591C476.544 481.061 476.773 481.413 477.11 481.648C477.451 481.883 477.896 482 478.445 482C479.07 482 479.566 481.867 479.934 481.602C480.305 481.333 480.491 481.011 480.491 480.636C480.491 480.333 480.385 480.08 480.172 479.875C479.96 479.667 479.635 479.511 479.195 479.409L477.741 479.068C476.941 478.879 476.354 478.585 475.979 478.188C475.608 477.786 475.422 477.284 475.422 476.682C475.422 476.189 475.561 475.754 475.837 475.375C476.117 474.996 476.498 474.699 476.979 474.483C477.464 474.267 478.013 474.159 478.627 474.159C479.491 474.159 480.169 474.348 480.661 474.727C481.157 475.106 481.51 475.606 481.718 476.227ZM484.439 486.273C484.212 486.273 484.009 486.254 483.831 486.216C483.653 486.182 483.53 486.148 483.462 486.114L483.803 484.932C484.128 485.015 484.416 485.045 484.666 485.023C484.916 485 485.138 484.888 485.331 484.688C485.528 484.491 485.708 484.17 485.871 483.727L486.121 483.045L482.894 474.273H484.348L486.757 481.227H486.848L489.257 474.273H490.712L487.007 484.273C486.841 484.723 486.634 485.097 486.388 485.392C486.142 485.691 485.856 485.913 485.53 486.057C485.208 486.201 484.844 486.273 484.439 486.273ZM498.343 476.227L497.139 476.568C497.063 476.367 496.951 476.172 496.804 475.983C496.66 475.79 496.463 475.631 496.213 475.506C495.963 475.381 495.643 475.318 495.253 475.318C494.718 475.318 494.273 475.441 493.917 475.688C493.565 475.93 493.389 476.239 493.389 476.614C493.389 476.947 493.51 477.21 493.753 477.403C493.995 477.597 494.374 477.758 494.889 477.886L496.184 478.205C496.965 478.394 497.546 478.684 497.929 479.074C498.311 479.46 498.503 479.958 498.503 480.568C498.503 481.068 498.359 481.515 498.071 481.909C497.787 482.303 497.389 482.614 496.878 482.841C496.366 483.068 495.771 483.182 495.093 483.182C494.203 483.182 493.467 482.989 492.883 482.602C492.3 482.216 491.931 481.652 491.775 480.909L493.048 480.591C493.169 481.061 493.398 481.413 493.736 481.648C494.076 481.883 494.521 482 495.071 482C495.696 482 496.192 481.867 496.559 481.602C496.931 481.333 497.116 481.011 497.116 480.636C497.116 480.333 497.01 480.08 496.798 479.875C496.586 479.667 496.26 479.511 495.821 479.409L494.366 479.068C493.567 478.879 492.98 478.585 492.605 478.188C492.234 477.786 492.048 477.284 492.048 476.682C492.048 476.189 492.186 475.754 492.463 475.375C492.743 474.996 493.124 474.699 493.605 474.483C494.09 474.267 494.639 474.159 495.253 474.159C496.116 474.159 496.794 474.348 497.287 474.727C497.783 475.106 498.135 475.606 498.343 476.227ZM503.996 474.273V475.409H499.474V474.273H503.996ZM500.792 472.182H502.133V480.5C502.133 480.879 502.188 481.163 502.298 481.352C502.411 481.538 502.555 481.663 502.729 481.727C502.907 481.788 503.095 481.818 503.292 481.818C503.44 481.818 503.561 481.811 503.656 481.795C503.75 481.777 503.826 481.761 503.883 481.75L504.156 482.955C504.065 482.989 503.938 483.023 503.775 483.057C503.612 483.095 503.406 483.114 503.156 483.114C502.777 483.114 502.406 483.032 502.042 482.869C501.682 482.706 501.383 482.458 501.144 482.125C500.909 481.792 500.792 481.371 500.792 480.864V472.182ZM509.259 483.182C508.418 483.182 507.693 482.996 507.083 482.625C506.477 482.25 506.009 481.727 505.679 481.057C505.354 480.383 505.191 479.598 505.191 478.705C505.191 477.811 505.354 477.023 505.679 476.341C506.009 475.655 506.467 475.121 507.054 474.739C507.645 474.352 508.335 474.159 509.122 474.159C509.577 474.159 510.026 474.235 510.469 474.386C510.912 474.538 511.316 474.784 511.679 475.125C512.043 475.462 512.333 475.909 512.549 476.466C512.765 477.023 512.872 477.708 512.872 478.523V479.091H506.145V477.932H511.509C511.509 477.439 511.41 477 511.213 476.614C511.02 476.227 510.744 475.922 510.384 475.699C510.028 475.475 509.607 475.364 509.122 475.364C508.588 475.364 508.126 475.496 507.736 475.761C507.35 476.023 507.052 476.364 506.844 476.784C506.636 477.205 506.532 477.655 506.532 478.136V478.909C506.532 479.568 506.645 480.127 506.872 480.585C507.104 481.04 507.424 481.386 507.833 481.625C508.242 481.86 508.717 481.977 509.259 481.977C509.611 481.977 509.929 481.928 510.213 481.83C510.501 481.727 510.749 481.576 510.958 481.375C511.166 481.17 511.327 480.917 511.441 480.614L512.736 480.977C512.6 481.417 512.371 481.803 512.049 482.136C511.727 482.466 511.329 482.723 510.855 482.909C510.382 483.091 509.85 483.182 509.259 483.182ZM514.592 483V474.273H515.888V475.636H516.001C516.183 475.17 516.477 474.809 516.882 474.551C517.287 474.29 517.774 474.159 518.342 474.159C518.918 474.159 519.397 474.29 519.78 474.551C520.166 474.809 520.467 475.17 520.683 475.636H520.774C520.998 475.186 521.333 474.828 521.78 474.562C522.227 474.294 522.763 474.159 523.388 474.159C524.168 474.159 524.806 474.403 525.303 474.892C525.799 475.377 526.047 476.133 526.047 477.159V483H524.706V477.159C524.706 476.515 524.53 476.055 524.178 475.778C523.825 475.502 523.41 475.364 522.933 475.364C522.32 475.364 521.844 475.549 521.507 475.92C521.17 476.288 521.001 476.754 521.001 477.318V483H519.638V477.023C519.638 476.527 519.477 476.127 519.155 475.824C518.833 475.517 518.418 475.364 517.91 475.364C517.562 475.364 517.236 475.456 516.933 475.642C516.634 475.828 516.392 476.085 516.206 476.415C516.024 476.741 515.933 477.117 515.933 477.545V483H514.592ZM532.359 483V474.273H533.699V483H532.359ZM533.04 472.818C532.779 472.818 532.554 472.729 532.364 472.551C532.179 472.373 532.086 472.159 532.086 471.909C532.086 471.659 532.179 471.445 532.364 471.267C532.554 471.089 532.779 471 533.04 471C533.302 471 533.525 471.089 533.711 471.267C533.9 471.445 533.995 471.659 533.995 471.909C533.995 472.159 533.9 472.373 533.711 472.551C533.525 472.729 533.302 472.818 533.04 472.818ZM535.835 483V474.273H537.131V475.636H537.244C537.426 475.17 537.72 474.809 538.125 474.551C538.53 474.29 539.017 474.159 539.585 474.159C540.161 474.159 540.64 474.29 541.023 474.551C541.409 474.809 541.71 475.17 541.926 475.636H542.017C542.241 475.186 542.576 474.828 543.023 474.562C543.47 474.294 544.006 474.159 544.631 474.159C545.411 474.159 546.049 474.403 546.546 474.892C547.042 475.377 547.29 476.133 547.29 477.159V483H545.949V477.159C545.949 476.515 545.773 476.055 545.421 475.778C545.068 475.502 544.654 475.364 544.176 475.364C543.563 475.364 543.087 475.549 542.75 475.92C542.413 476.288 542.244 476.754 542.244 477.318V483H540.881V477.023C540.881 476.527 540.72 476.127 540.398 475.824C540.076 475.517 539.661 475.364 539.154 475.364C538.805 475.364 538.479 475.456 538.176 475.642C537.877 475.828 537.635 476.085 537.449 476.415C537.267 476.741 537.176 477.117 537.176 477.545V483H535.835ZM549.422 486.273V474.273H550.717V475.659H550.876C550.975 475.508 551.111 475.314 551.285 475.08C551.463 474.841 551.717 474.629 552.047 474.443C552.38 474.254 552.831 474.159 553.399 474.159C554.134 474.159 554.782 474.343 555.342 474.71C555.903 475.078 556.34 475.598 556.655 476.273C556.969 476.947 557.126 477.742 557.126 478.659C557.126 479.583 556.969 480.384 556.655 481.062C556.34 481.737 555.905 482.259 555.348 482.631C554.791 482.998 554.149 483.182 553.422 483.182C552.861 483.182 552.412 483.089 552.075 482.903C551.738 482.714 551.478 482.5 551.297 482.261C551.115 482.019 550.975 481.818 550.876 481.659H550.763V486.273H549.422ZM550.74 478.636C550.74 479.295 550.836 479.877 551.03 480.381C551.223 480.881 551.505 481.273 551.876 481.557C552.247 481.837 552.702 481.977 553.24 481.977C553.8 481.977 554.268 481.83 554.643 481.534C555.022 481.235 555.306 480.833 555.496 480.33C555.689 479.822 555.785 479.258 555.785 478.636C555.785 478.023 555.691 477.47 555.501 476.977C555.316 476.481 555.033 476.089 554.655 475.801C554.28 475.509 553.808 475.364 553.24 475.364C552.694 475.364 552.236 475.502 551.865 475.778C551.494 476.051 551.213 476.434 551.024 476.926C550.835 477.415 550.74 477.985 550.74 478.636ZM558.852 483V474.273H560.147V475.591H560.238C560.397 475.159 560.685 474.809 561.102 474.54C561.518 474.271 561.988 474.136 562.511 474.136C562.609 474.136 562.732 474.138 562.88 474.142C563.028 474.146 563.14 474.152 563.215 474.159V475.523C563.17 475.511 563.066 475.494 562.903 475.472C562.744 475.445 562.575 475.432 562.397 475.432C561.973 475.432 561.594 475.521 561.261 475.699C560.931 475.873 560.67 476.116 560.477 476.426C560.287 476.733 560.193 477.083 560.193 477.477V483H558.852ZM567.765 483.182C566.977 483.182 566.285 482.994 565.691 482.619C565.1 482.244 564.638 481.72 564.304 481.045C563.975 480.371 563.81 479.583 563.81 478.682C563.81 477.773 563.975 476.979 564.304 476.301C564.638 475.623 565.1 475.097 565.691 474.722C566.285 474.347 566.977 474.159 567.765 474.159C568.552 474.159 569.242 474.347 569.833 474.722C570.427 475.097 570.89 475.623 571.219 476.301C571.552 476.979 571.719 477.773 571.719 478.682C571.719 479.583 571.552 480.371 571.219 481.045C570.89 481.72 570.427 482.244 569.833 482.619C569.242 482.994 568.552 483.182 567.765 483.182ZM567.765 481.977C568.363 481.977 568.856 481.824 569.242 481.517C569.628 481.21 569.914 480.807 570.1 480.307C570.285 479.807 570.378 479.265 570.378 478.682C570.378 478.098 570.285 477.555 570.1 477.051C569.914 476.547 569.628 476.14 569.242 475.83C568.856 475.519 568.363 475.364 567.765 475.364C567.166 475.364 566.674 475.519 566.287 475.83C565.901 476.14 565.615 476.547 565.429 477.051C565.244 477.555 565.151 478.098 565.151 478.682C565.151 479.265 565.244 479.807 565.429 480.307C565.615 480.807 565.901 481.21 566.287 481.517C566.674 481.824 567.166 481.977 567.765 481.977ZM580.27 474.273L577.043 483H575.679L572.452 474.273H573.906L576.315 481.227H576.406L578.815 474.273H580.27ZM585.066 483.182C584.225 483.182 583.5 482.996 582.89 482.625C582.284 482.25 581.816 481.727 581.487 481.057C581.161 480.383 580.998 479.598 580.998 478.705C580.998 477.811 581.161 477.023 581.487 476.341C581.816 475.655 582.275 475.121 582.862 474.739C583.453 474.352 584.142 474.159 584.93 474.159C585.385 474.159 585.833 474.235 586.277 474.386C586.72 474.538 587.123 474.784 587.487 475.125C587.85 475.462 588.14 475.909 588.356 476.466C588.572 477.023 588.68 477.708 588.68 478.523V479.091H581.953V477.932H587.316C587.316 477.439 587.218 477 587.021 476.614C586.828 476.227 586.551 475.922 586.191 475.699C585.835 475.475 585.415 475.364 584.93 475.364C584.396 475.364 583.934 475.496 583.544 475.761C583.157 476.023 582.86 476.364 582.652 476.784C582.443 477.205 582.339 477.655 582.339 478.136V478.909C582.339 479.568 582.453 480.127 582.68 480.585C582.911 481.04 583.231 481.386 583.64 481.625C584.049 481.86 584.525 481.977 585.066 481.977C585.419 481.977 585.737 481.928 586.021 481.83C586.309 481.727 586.557 481.576 586.765 481.375C586.974 481.17 587.135 480.917 587.248 480.614L588.544 480.977C588.407 481.417 588.178 481.803 587.856 482.136C587.534 482.466 587.136 482.723 586.663 482.909C586.189 483.091 585.657 483.182 585.066 483.182ZM590.4 483V474.273H591.695V475.636H591.809C591.991 475.17 592.284 474.809 592.69 474.551C593.095 474.29 593.582 474.159 594.15 474.159C594.726 474.159 595.205 474.29 595.587 474.551C595.974 474.809 596.275 475.17 596.491 475.636H596.582C596.805 475.186 597.14 474.828 597.587 474.562C598.034 474.294 598.57 474.159 599.195 474.159C599.976 474.159 600.614 474.403 601.11 474.892C601.606 475.377 601.854 476.133 601.854 477.159V483H600.513V477.159C600.513 476.515 600.337 476.055 599.985 475.778C599.633 475.502 599.218 475.364 598.741 475.364C598.127 475.364 597.652 475.549 597.315 475.92C596.977 476.288 596.809 476.754 596.809 477.318V483H595.445V477.023C595.445 476.527 595.284 476.127 594.962 475.824C594.64 475.517 594.226 475.364 593.718 475.364C593.369 475.364 593.044 475.456 592.741 475.642C592.441 475.828 592.199 476.085 592.013 476.415C591.832 476.741 591.741 477.117 591.741 477.545V483H590.4ZM607.645 483.182C606.804 483.182 606.079 482.996 605.469 482.625C604.863 482.25 604.395 481.727 604.066 481.057C603.74 480.383 603.577 479.598 603.577 478.705C603.577 477.811 603.74 477.023 604.066 476.341C604.395 475.655 604.853 475.121 605.441 474.739C606.031 474.352 606.721 474.159 607.509 474.159C607.963 474.159 608.412 474.235 608.855 474.386C609.299 474.538 609.702 474.784 610.066 475.125C610.429 475.462 610.719 475.909 610.935 476.466C611.151 477.023 611.259 477.708 611.259 478.523V479.091H604.531V477.932H609.895C609.895 477.439 609.797 477 609.6 476.614C609.406 476.227 609.13 475.922 608.77 475.699C608.414 475.475 607.994 475.364 607.509 475.364C606.975 475.364 606.513 475.496 606.122 475.761C605.736 476.023 605.439 476.364 605.23 476.784C605.022 477.205 604.918 477.655 604.918 478.136V478.909C604.918 479.568 605.031 480.127 605.259 480.585C605.49 481.04 605.81 481.386 606.219 481.625C606.628 481.86 607.103 481.977 607.645 481.977C607.997 481.977 608.316 481.928 608.6 481.83C608.888 481.727 609.136 481.576 609.344 481.375C609.552 481.17 609.713 480.917 609.827 480.614L611.122 480.977C610.986 481.417 610.757 481.803 610.435 482.136C610.113 482.466 609.715 482.723 609.242 482.909C608.768 483.091 608.236 483.182 607.645 483.182ZM614.319 477.75V483H612.979V474.273H614.274V475.636H614.388C614.592 475.193 614.903 474.837 615.319 474.568C615.736 474.295 616.274 474.159 616.933 474.159C617.524 474.159 618.041 474.28 618.484 474.523C618.927 474.761 619.272 475.125 619.518 475.614C619.765 476.098 619.888 476.712 619.888 477.455V483H618.547V477.545C618.547 476.86 618.369 476.326 618.013 475.943C617.657 475.557 617.168 475.364 616.547 475.364C616.119 475.364 615.736 475.456 615.399 475.642C615.066 475.828 614.802 476.098 614.609 476.455C614.416 476.811 614.319 477.242 614.319 477.75ZM625.813 474.273V475.409H621.291V474.273H625.813ZM622.609 472.182H623.95V480.5C623.95 480.879 624.005 481.163 624.114 481.352C624.228 481.538 624.372 481.663 624.546 481.727C624.724 481.788 624.912 481.818 625.109 481.818C625.257 481.818 625.378 481.811 625.472 481.795C625.567 481.777 625.643 481.761 625.7 481.75L625.972 482.955C625.882 482.989 625.755 483.023 625.592 483.057C625.429 483.095 625.222 483.114 624.972 483.114C624.594 483.114 624.222 483.032 623.859 482.869C623.499 482.706 623.2 482.458 622.961 482.125C622.726 481.792 622.609 481.371 622.609 480.864V472.182ZM633.536 476.227L632.331 476.568C632.256 476.367 632.144 476.172 631.996 475.983C631.852 475.79 631.655 475.631 631.405 475.506C631.155 475.381 630.835 475.318 630.445 475.318C629.911 475.318 629.466 475.441 629.11 475.688C628.758 475.93 628.581 476.239 628.581 476.614C628.581 476.947 628.703 477.21 628.945 477.403C629.187 477.597 629.566 477.758 630.081 477.886L631.377 478.205C632.157 478.394 632.739 478.684 633.121 479.074C633.504 479.46 633.695 479.958 633.695 480.568C633.695 481.068 633.551 481.515 633.263 481.909C632.979 482.303 632.581 482.614 632.07 482.841C631.559 483.068 630.964 483.182 630.286 483.182C629.396 483.182 628.659 482.989 628.076 482.602C627.492 482.216 627.123 481.652 626.968 480.909L628.241 480.591C628.362 481.061 628.591 481.413 628.928 481.648C629.269 481.883 629.714 482 630.263 482C630.888 482 631.384 481.867 631.752 481.602C632.123 481.333 632.309 481.011 632.309 480.636C632.309 480.333 632.203 480.08 631.991 479.875C631.778 479.667 631.453 479.511 631.013 479.409L629.559 479.068C628.759 478.879 628.172 478.585 627.797 478.188C627.426 477.786 627.241 477.284 627.241 476.682C627.241 476.189 627.379 475.754 627.655 475.375C627.936 474.996 628.316 474.699 628.797 474.483C629.282 474.267 629.831 474.159 630.445 474.159C631.309 474.159 631.987 474.348 632.479 474.727C632.975 475.106 633.328 475.606 633.536 476.227ZM637.394 481.409L637.303 482.023C637.238 482.455 637.14 482.917 637.007 483.409C636.878 483.902 636.744 484.366 636.604 484.801C636.464 485.237 636.348 485.583 636.257 485.841H635.234C635.284 485.598 635.348 485.278 635.428 484.881C635.507 484.483 635.587 484.038 635.666 483.545C635.75 483.057 635.818 482.557 635.871 482.045L635.939 481.409H637.394ZM381.795 513.205C381.242 513.205 380.741 513.1 380.29 512.892C379.839 512.68 379.481 512.375 379.216 511.977C378.951 511.576 378.818 511.091 378.818 510.523C378.818 510.023 378.917 509.617 379.114 509.307C379.311 508.992 379.574 508.746 379.903 508.568C380.233 508.39 380.597 508.258 380.994 508.17C381.396 508.08 381.799 508.008 382.205 507.955C382.735 507.886 383.165 507.835 383.494 507.801C383.828 507.763 384.07 507.701 384.222 507.614C384.377 507.527 384.455 507.375 384.455 507.159V507.114C384.455 506.553 384.301 506.117 383.994 505.807C383.691 505.496 383.231 505.341 382.614 505.341C381.973 505.341 381.472 505.481 381.108 505.761C380.744 506.042 380.489 506.341 380.341 506.659L379.068 506.205C379.295 505.674 379.598 505.261 379.977 504.966C380.36 504.667 380.777 504.458 381.227 504.341C381.682 504.22 382.129 504.159 382.568 504.159C382.848 504.159 383.17 504.193 383.534 504.261C383.902 504.326 384.256 504.46 384.597 504.665C384.941 504.869 385.227 505.178 385.455 505.591C385.682 506.004 385.795 506.557 385.795 507.25V513H384.455V511.818H384.386C384.295 512.008 384.144 512.21 383.932 512.426C383.72 512.642 383.438 512.826 383.085 512.977C382.733 513.129 382.303 513.205 381.795 513.205ZM382 512C382.53 512 382.977 511.896 383.341 511.688C383.708 511.479 383.985 511.21 384.17 510.881C384.36 510.551 384.455 510.205 384.455 509.841V508.614C384.398 508.682 384.273 508.744 384.08 508.801C383.89 508.854 383.67 508.902 383.42 508.943C383.174 508.981 382.934 509.015 382.699 509.045C382.468 509.072 382.28 509.095 382.136 509.114C381.788 509.159 381.462 509.233 381.159 509.335C380.86 509.434 380.617 509.583 380.432 509.784C380.25 509.981 380.159 510.25 380.159 510.591C380.159 511.057 380.331 511.409 380.676 511.648C381.025 511.883 381.466 512 382 512ZM389.264 507.75V513H387.923V504.273H389.218V505.636H389.332C389.537 505.193 389.847 504.837 390.264 504.568C390.68 504.295 391.218 504.159 391.877 504.159C392.468 504.159 392.985 504.28 393.429 504.523C393.872 504.761 394.216 505.125 394.463 505.614C394.709 506.098 394.832 506.712 394.832 507.455V513H393.491V507.545C393.491 506.86 393.313 506.326 392.957 505.943C392.601 505.557 392.112 505.364 391.491 505.364C391.063 505.364 390.68 505.456 390.343 505.642C390.01 505.828 389.747 506.098 389.554 506.455C389.36 506.811 389.264 507.242 389.264 507.75ZM400.258 513.182C399.53 513.182 398.888 512.998 398.332 512.631C397.775 512.259 397.339 511.737 397.025 511.062C396.71 510.384 396.553 509.583 396.553 508.659C396.553 507.742 396.71 506.947 397.025 506.273C397.339 505.598 397.777 505.078 398.337 504.71C398.898 504.343 399.546 504.159 400.28 504.159C400.849 504.159 401.298 504.254 401.627 504.443C401.96 504.629 402.214 504.841 402.388 505.08C402.566 505.314 402.705 505.508 402.803 505.659H402.917V501.364H404.258V513H402.962V511.659H402.803C402.705 511.818 402.565 512.019 402.383 512.261C402.201 512.5 401.941 512.714 401.604 512.903C401.267 513.089 400.818 513.182 400.258 513.182ZM400.44 511.977C400.977 511.977 401.432 511.837 401.803 511.557C402.174 511.273 402.457 510.881 402.65 510.381C402.843 509.877 402.94 509.295 402.94 508.636C402.94 507.985 402.845 507.415 402.655 506.926C402.466 506.434 402.186 506.051 401.815 505.778C401.443 505.502 400.985 505.364 400.44 505.364C399.871 505.364 399.398 505.509 399.019 505.801C398.644 506.089 398.362 506.481 398.173 506.977C397.987 507.47 397.894 508.023 397.894 508.636C397.894 509.258 397.989 509.822 398.178 510.33C398.371 510.833 398.655 511.235 399.03 511.534C399.409 511.83 399.879 511.977 400.44 511.977ZM412.101 507.75V513H410.76V501.364H412.101V505.636H412.214C412.419 505.186 412.726 504.828 413.135 504.562C413.548 504.294 414.097 504.159 414.782 504.159C415.377 504.159 415.898 504.278 416.345 504.517C416.792 504.752 417.139 505.114 417.385 505.602C417.635 506.087 417.76 506.705 417.76 507.455V513H416.419V507.545C416.419 506.852 416.239 506.316 415.879 505.938C415.523 505.555 415.029 505.364 414.396 505.364C413.957 505.364 413.563 505.456 413.214 505.642C412.87 505.828 412.597 506.098 412.396 506.455C412.199 506.811 412.101 507.242 412.101 507.75ZM423.438 513.182C422.65 513.182 421.959 512.994 421.364 512.619C420.774 512.244 420.311 511.72 419.978 511.045C419.649 510.371 419.484 509.583 419.484 508.682C419.484 507.773 419.649 506.979 419.978 506.301C420.311 505.623 420.774 505.097 421.364 504.722C421.959 504.347 422.65 504.159 423.438 504.159C424.226 504.159 424.916 504.347 425.507 504.722C426.101 505.097 426.563 505.623 426.893 506.301C427.226 506.979 427.393 507.773 427.393 508.682C427.393 509.583 427.226 510.371 426.893 511.045C426.563 511.72 426.101 512.244 425.507 512.619C424.916 512.994 424.226 513.182 423.438 513.182ZM423.438 511.977C424.037 511.977 424.529 511.824 424.916 511.517C425.302 511.21 425.588 510.807 425.774 510.307C425.959 509.807 426.052 509.265 426.052 508.682C426.052 508.098 425.959 507.555 425.774 507.051C425.588 506.547 425.302 506.14 424.916 505.83C424.529 505.519 424.037 505.364 423.438 505.364C422.84 505.364 422.347 505.519 421.961 505.83C421.575 506.14 421.289 506.547 421.103 507.051C420.918 507.555 420.825 508.098 420.825 508.682C420.825 509.265 420.918 509.807 421.103 510.307C421.289 510.807 421.575 511.21 421.961 511.517C422.347 511.824 422.84 511.977 423.438 511.977ZM435.302 506.227L434.097 506.568C434.021 506.367 433.91 506.172 433.762 505.983C433.618 505.79 433.421 505.631 433.171 505.506C432.921 505.381 432.601 505.318 432.211 505.318C431.677 505.318 431.232 505.441 430.875 505.688C430.523 505.93 430.347 506.239 430.347 506.614C430.347 506.947 430.468 507.21 430.711 507.403C430.953 507.597 431.332 507.758 431.847 507.886L433.143 508.205C433.923 508.394 434.504 508.684 434.887 509.074C435.269 509.46 435.461 509.958 435.461 510.568C435.461 511.068 435.317 511.515 435.029 511.909C434.745 512.303 434.347 512.614 433.836 512.841C433.324 513.068 432.73 513.182 432.052 513.182C431.161 513.182 430.425 512.989 429.841 512.602C429.258 512.216 428.889 511.652 428.733 510.909L430.006 510.591C430.127 511.061 430.357 511.413 430.694 511.648C431.035 511.883 431.48 512 432.029 512C432.654 512 433.15 511.867 433.518 511.602C433.889 511.333 434.074 511.011 434.074 510.636C434.074 510.333 433.968 510.08 433.756 509.875C433.544 509.667 433.218 509.511 432.779 509.409L431.324 509.068C430.525 508.879 429.938 508.585 429.563 508.188C429.192 507.786 429.006 507.284 429.006 506.682C429.006 506.189 429.144 505.754 429.421 505.375C429.701 504.996 430.082 504.699 430.563 504.483C431.048 504.267 431.597 504.159 432.211 504.159C433.074 504.159 433.752 504.348 434.245 504.727C434.741 505.106 435.093 505.606 435.302 506.227ZM440.955 504.273V505.409H436.432V504.273H440.955ZM437.75 502.182H439.091V510.5C439.091 510.879 439.146 511.163 439.256 511.352C439.369 511.538 439.513 511.663 439.688 511.727C439.866 511.788 440.053 511.818 440.25 511.818C440.398 511.818 440.519 511.811 440.614 511.795C440.708 511.777 440.784 511.761 440.841 511.75L441.114 512.955C441.023 512.989 440.896 513.023 440.733 513.057C440.57 513.095 440.364 513.114 440.114 513.114C439.735 513.114 439.364 513.032 439 512.869C438.64 512.706 438.341 512.458 438.102 512.125C437.867 511.792 437.75 511.371 437.75 510.864V502.182ZM448.809 513L446.15 504.273H447.559L449.445 510.955H449.536L451.4 504.273H452.832L454.673 510.932H454.763L456.65 504.273H458.059L455.4 513H454.082L452.173 506.295H452.036L450.127 513H448.809ZM462.874 513.182C462.033 513.182 461.308 512.996 460.698 512.625C460.092 512.25 459.624 511.727 459.294 511.057C458.969 510.383 458.806 509.598 458.806 508.705C458.806 507.811 458.969 507.023 459.294 506.341C459.624 505.655 460.082 505.121 460.669 504.739C461.26 504.352 461.95 504.159 462.738 504.159C463.192 504.159 463.641 504.235 464.084 504.386C464.527 504.538 464.931 504.784 465.294 505.125C465.658 505.462 465.948 505.909 466.164 506.466C466.38 507.023 466.488 507.708 466.488 508.523V509.091H459.76V507.932H465.124C465.124 507.439 465.025 507 464.828 506.614C464.635 506.227 464.359 505.922 463.999 505.699C463.643 505.475 463.222 505.364 462.738 505.364C462.203 505.364 461.741 505.496 461.351 505.761C460.965 506.023 460.667 506.364 460.459 506.784C460.251 507.205 460.147 507.655 460.147 508.136V508.909C460.147 509.568 460.26 510.127 460.488 510.585C460.719 511.04 461.039 511.386 461.448 511.625C461.857 511.86 462.332 511.977 462.874 511.977C463.226 511.977 463.544 511.928 463.828 511.83C464.116 511.727 464.364 511.576 464.573 511.375C464.781 511.17 464.942 510.917 465.056 510.614L466.351 510.977C466.215 511.417 465.986 511.803 465.664 512.136C465.342 512.466 464.944 512.723 464.47 512.909C463.997 513.091 463.465 513.182 462.874 513.182ZM468.389 513V501.364H469.73V505.659H469.844C469.942 505.508 470.078 505.314 470.253 505.08C470.431 504.841 470.685 504.629 471.014 504.443C471.347 504.254 471.798 504.159 472.366 504.159C473.101 504.159 473.749 504.343 474.31 504.71C474.87 505.078 475.308 505.598 475.622 506.273C475.936 506.947 476.094 507.742 476.094 508.659C476.094 509.583 475.936 510.384 475.622 511.062C475.308 511.737 474.872 512.259 474.315 512.631C473.758 512.998 473.116 513.182 472.389 513.182C471.828 513.182 471.38 513.089 471.043 512.903C470.705 512.714 470.446 512.5 470.264 512.261C470.082 512.019 469.942 511.818 469.844 511.659H469.685V513H468.389ZM469.707 508.636C469.707 509.295 469.804 509.877 469.997 510.381C470.19 510.881 470.472 511.273 470.844 511.557C471.215 511.837 471.669 511.977 472.207 511.977C472.768 511.977 473.236 511.83 473.611 511.534C473.989 511.235 474.274 510.833 474.463 510.33C474.656 509.822 474.753 509.258 474.753 508.636C474.753 508.023 474.658 507.47 474.469 506.977C474.283 506.481 474.001 506.089 473.622 505.801C473.247 505.509 472.775 505.364 472.207 505.364C471.662 505.364 471.203 505.502 470.832 505.778C470.461 506.051 470.181 506.434 469.991 506.926C469.802 507.415 469.707 507.985 469.707 508.636ZM477.825 513V504.273H479.166V513H477.825ZM478.507 502.818C478.245 502.818 478.02 502.729 477.83 502.551C477.645 502.373 477.552 502.159 477.552 501.909C477.552 501.659 477.645 501.445 477.83 501.267C478.02 501.089 478.245 501 478.507 501C478.768 501 478.991 501.089 479.177 501.267C479.366 501.445 479.461 501.659 479.461 501.909C479.461 502.159 479.366 502.373 479.177 502.551C478.991 502.729 478.768 502.818 478.507 502.818ZM482.643 507.75V513H481.302V504.273H482.597V505.636H482.711C482.915 505.193 483.226 504.837 483.643 504.568C484.059 504.295 484.597 504.159 485.256 504.159C485.847 504.159 486.364 504.28 486.807 504.523C487.251 504.761 487.595 505.125 487.841 505.614C488.088 506.098 488.211 506.712 488.211 507.455V513H486.87V507.545C486.87 506.86 486.692 506.326 486.336 505.943C485.98 505.557 485.491 505.364 484.87 505.364C484.442 505.364 484.059 505.456 483.722 505.642C483.389 505.828 483.126 506.098 482.932 506.455C482.739 506.811 482.643 507.242 482.643 507.75ZM492.909 513.205C492.356 513.205 491.854 513.1 491.404 512.892C490.953 512.68 490.595 512.375 490.33 511.977C490.065 511.576 489.932 511.091 489.932 510.523C489.932 510.023 490.03 509.617 490.227 509.307C490.424 508.992 490.688 508.746 491.017 508.568C491.347 508.39 491.71 508.258 492.108 508.17C492.51 508.08 492.913 508.008 493.318 507.955C493.849 507.886 494.279 507.835 494.608 507.801C494.941 507.763 495.184 507.701 495.335 507.614C495.491 507.527 495.568 507.375 495.568 507.159V507.114C495.568 506.553 495.415 506.117 495.108 505.807C494.805 505.496 494.345 505.341 493.727 505.341C493.087 505.341 492.585 505.481 492.222 505.761C491.858 506.042 491.602 506.341 491.455 506.659L490.182 506.205C490.409 505.674 490.712 505.261 491.091 504.966C491.474 504.667 491.89 504.458 492.341 504.341C492.796 504.22 493.243 504.159 493.682 504.159C493.962 504.159 494.284 504.193 494.648 504.261C495.015 504.326 495.369 504.46 495.71 504.665C496.055 504.869 496.341 505.178 496.568 505.591C496.796 506.004 496.909 506.557 496.909 507.25V513H495.568V511.818H495.5C495.409 512.008 495.258 512.21 495.046 512.426C494.833 512.642 494.551 512.826 494.199 512.977C493.847 513.129 493.417 513.205 492.909 513.205ZM493.114 512C493.644 512 494.091 511.896 494.455 511.688C494.822 511.479 495.099 511.21 495.284 510.881C495.474 510.551 495.568 510.205 495.568 509.841V508.614C495.511 508.682 495.386 508.744 495.193 508.801C495.004 508.854 494.784 508.902 494.534 508.943C494.288 508.981 494.047 509.015 493.813 509.045C493.582 509.072 493.394 509.095 493.25 509.114C492.902 509.159 492.576 509.233 492.273 509.335C491.974 509.434 491.731 509.583 491.546 509.784C491.364 509.981 491.273 510.25 491.273 510.591C491.273 511.057 491.445 511.409 491.79 511.648C492.138 511.883 492.58 512 493.114 512ZM499.037 513V504.273H500.332V505.591H500.423C500.582 505.159 500.87 504.809 501.287 504.54C501.703 504.271 502.173 504.136 502.696 504.136C502.794 504.136 502.917 504.138 503.065 504.142C503.213 504.146 503.325 504.152 503.4 504.159V505.523C503.355 505.511 503.251 505.494 503.088 505.472C502.929 505.445 502.76 505.432 502.582 505.432C502.158 505.432 501.779 505.521 501.446 505.699C501.116 505.873 500.855 506.116 500.662 506.426C500.472 506.733 500.378 507.083 500.378 507.477V513H499.037ZM510.852 506.227L509.647 506.568C509.571 506.367 509.46 506.172 509.312 505.983C509.168 505.79 508.971 505.631 508.721 505.506C508.471 505.381 508.151 505.318 507.761 505.318C507.227 505.318 506.782 505.441 506.425 505.688C506.073 505.93 505.897 506.239 505.897 506.614C505.897 506.947 506.018 507.21 506.261 507.403C506.503 507.597 506.882 507.758 507.397 507.886L508.692 508.205C509.473 508.394 510.054 508.684 510.437 509.074C510.819 509.46 511.011 509.958 511.011 510.568C511.011 511.068 510.867 511.515 510.579 511.909C510.295 512.303 509.897 512.614 509.386 512.841C508.874 513.068 508.28 513.182 507.602 513.182C506.711 513.182 505.975 512.989 505.391 512.602C504.808 512.216 504.439 511.652 504.283 510.909L505.556 510.591C505.677 511.061 505.907 511.413 506.244 511.648C506.585 511.883 507.03 512 507.579 512C508.204 512 508.7 511.867 509.067 511.602C509.439 511.333 509.624 511.011 509.624 510.636C509.624 510.333 509.518 510.08 509.306 509.875C509.094 509.667 508.768 509.511 508.329 509.409L506.874 509.068C506.075 508.879 505.488 508.585 505.113 508.188C504.742 507.786 504.556 507.284 504.556 506.682C504.556 506.189 504.694 505.754 504.971 505.375C505.251 504.996 505.632 504.699 506.113 504.483C506.598 504.267 507.147 504.159 507.761 504.159C508.624 504.159 509.302 504.348 509.795 504.727C510.291 505.106 510.643 505.606 510.852 506.227ZM519.457 513.205C518.904 513.205 518.402 513.1 517.952 512.892C517.501 512.68 517.143 512.375 516.878 511.977C516.613 511.576 516.48 511.091 516.48 510.523C516.48 510.023 516.579 509.617 516.776 509.307C516.972 508.992 517.236 508.746 517.565 508.568C517.895 508.39 518.258 508.258 518.656 508.17C519.058 508.08 519.461 508.008 519.866 507.955C520.397 507.886 520.827 507.835 521.156 507.801C521.49 507.763 521.732 507.701 521.883 507.614C522.039 507.527 522.116 507.375 522.116 507.159V507.114C522.116 506.553 521.963 506.117 521.656 505.807C521.353 505.496 520.893 505.341 520.276 505.341C519.635 505.341 519.133 505.481 518.77 505.761C518.406 506.042 518.151 506.341 518.003 506.659L516.73 506.205C516.957 505.674 517.26 505.261 517.639 504.966C518.022 504.667 518.438 504.458 518.889 504.341C519.344 504.22 519.791 504.159 520.23 504.159C520.51 504.159 520.832 504.193 521.196 504.261C521.563 504.326 521.918 504.46 522.258 504.665C522.603 504.869 522.889 505.178 523.116 505.591C523.344 506.004 523.457 506.557 523.457 507.25V513H522.116V511.818H522.048C521.957 512.008 521.806 512.21 521.594 512.426C521.382 512.642 521.099 512.826 520.747 512.977C520.395 513.129 519.965 513.205 519.457 513.205ZM519.662 512C520.192 512 520.639 511.896 521.003 511.688C521.37 511.479 521.647 511.21 521.832 510.881C522.022 510.551 522.116 510.205 522.116 509.841V508.614C522.06 508.682 521.935 508.744 521.741 508.801C521.552 508.854 521.332 508.902 521.082 508.943C520.836 508.981 520.596 509.015 520.361 509.045C520.13 509.072 519.942 509.095 519.798 509.114C519.45 509.159 519.124 509.233 518.821 509.335C518.522 509.434 518.279 509.583 518.094 509.784C517.912 509.981 517.821 510.25 517.821 510.591C517.821 511.057 517.993 511.409 518.338 511.648C518.687 511.883 519.128 512 519.662 512ZM526.926 507.75V513H525.585V504.273H526.88V505.636H526.994C527.198 505.193 527.509 504.837 527.926 504.568C528.342 504.295 528.88 504.159 529.539 504.159C530.13 504.159 530.647 504.28 531.09 504.523C531.534 504.761 531.878 505.125 532.125 505.614C532.371 506.098 532.494 506.712 532.494 507.455V513H531.153V507.545C531.153 506.86 530.975 506.326 530.619 505.943C530.263 505.557 529.774 505.364 529.153 505.364C528.725 505.364 528.342 505.456 528.005 505.642C527.672 505.828 527.409 506.098 527.215 506.455C527.022 506.811 526.926 507.242 526.926 507.75ZM537.92 513.182C537.192 513.182 536.55 512.998 535.993 512.631C535.437 512.259 535.001 511.737 534.687 511.062C534.372 510.384 534.215 509.583 534.215 508.659C534.215 507.742 534.372 506.947 534.687 506.273C535.001 505.598 535.439 505.078 535.999 504.71C536.56 504.343 537.207 504.159 537.942 504.159C538.511 504.159 538.959 504.254 539.289 504.443C539.622 504.629 539.876 504.841 540.05 505.08C540.228 505.314 540.367 505.508 540.465 505.659H540.579V501.364H541.92V513H540.624V511.659H540.465C540.367 511.818 540.226 512.019 540.045 512.261C539.863 512.5 539.603 512.714 539.266 512.903C538.929 513.089 538.48 513.182 537.92 513.182ZM538.101 511.977C538.639 511.977 539.094 511.837 539.465 511.557C539.836 511.273 540.118 510.881 540.312 510.381C540.505 509.877 540.601 509.295 540.601 508.636C540.601 507.985 540.507 507.415 540.317 506.926C540.128 506.434 539.848 506.051 539.476 505.778C539.105 505.502 538.647 505.364 538.101 505.364C537.533 505.364 537.06 505.509 536.681 505.801C536.306 506.089 536.024 506.481 535.834 506.977C535.649 507.47 535.556 508.023 535.556 508.636C535.556 509.258 535.651 509.822 535.84 510.33C536.033 510.833 536.317 511.235 536.692 511.534C537.071 511.83 537.541 511.977 538.101 511.977ZM552.081 513.182C551.24 513.182 550.514 512.996 549.905 512.625C549.299 512.25 548.831 511.727 548.501 511.057C548.175 510.383 548.013 509.598 548.013 508.705C548.013 507.811 548.175 507.023 548.501 506.341C548.831 505.655 549.289 505.121 549.876 504.739C550.467 504.352 551.157 504.159 551.944 504.159C552.399 504.159 552.848 504.235 553.291 504.386C553.734 504.538 554.138 504.784 554.501 505.125C554.865 505.462 555.155 505.909 555.371 506.466C555.586 507.023 555.694 507.708 555.694 508.523V509.091H548.967V507.932H554.331C554.331 507.439 554.232 507 554.035 506.614C553.842 506.227 553.566 505.922 553.206 505.699C552.85 505.475 552.429 505.364 551.944 505.364C551.41 505.364 550.948 505.496 550.558 505.761C550.172 506.023 549.874 506.364 549.666 506.784C549.458 507.205 549.353 507.655 549.353 508.136V508.909C549.353 509.568 549.467 510.127 549.694 510.585C549.925 511.04 550.246 511.386 550.655 511.625C551.064 511.86 551.539 511.977 552.081 511.977C552.433 511.977 552.751 511.928 553.035 511.83C553.323 511.727 553.571 511.576 553.78 511.375C553.988 511.17 554.149 510.917 554.263 510.614L555.558 510.977C555.422 511.417 555.192 511.803 554.871 512.136C554.549 512.466 554.151 512.723 553.677 512.909C553.204 513.091 552.672 513.182 552.081 513.182ZM564.285 504.273L561.058 513H559.694L556.467 504.273H557.921L560.33 511.227H560.421L562.83 504.273H564.285ZM569.081 513.182C568.24 513.182 567.515 512.996 566.905 512.625C566.299 512.25 565.831 511.727 565.502 511.057C565.176 510.383 565.013 509.598 565.013 508.705C565.013 507.811 565.176 507.023 565.502 506.341C565.831 505.655 566.29 505.121 566.877 504.739C567.468 504.352 568.157 504.159 568.945 504.159C569.4 504.159 569.848 504.235 570.292 504.386C570.735 504.538 571.138 504.784 571.502 505.125C571.865 505.462 572.155 505.909 572.371 506.466C572.587 507.023 572.695 507.708 572.695 508.523V509.091H565.968V507.932H571.331C571.331 507.439 571.233 507 571.036 506.614C570.843 506.227 570.566 505.922 570.206 505.699C569.85 505.475 569.43 505.364 568.945 505.364C568.411 505.364 567.949 505.496 567.559 505.761C567.172 506.023 566.875 506.364 566.667 506.784C566.458 507.205 566.354 507.655 566.354 508.136V508.909C566.354 509.568 566.468 510.127 566.695 510.585C566.926 511.04 567.246 511.386 567.655 511.625C568.064 511.86 568.54 511.977 569.081 511.977C569.434 511.977 569.752 511.928 570.036 511.83C570.324 511.727 570.572 511.576 570.78 511.375C570.989 511.17 571.15 510.917 571.263 510.614L572.559 510.977C572.422 511.417 572.193 511.803 571.871 512.136C571.549 512.466 571.151 512.723 570.678 512.909C570.204 513.091 569.672 513.182 569.081 513.182ZM575.756 507.75V513H574.415V504.273H575.71V505.636H575.824C576.028 505.193 576.339 504.837 576.756 504.568C577.172 504.295 577.71 504.159 578.369 504.159C578.96 504.159 579.477 504.28 579.92 504.523C580.364 504.761 580.708 505.125 580.955 505.614C581.201 506.098 581.324 506.712 581.324 507.455V513H579.983V507.545C579.983 506.86 579.805 506.326 579.449 505.943C579.093 505.557 578.604 505.364 577.983 505.364C577.555 505.364 577.172 505.456 576.835 505.642C576.502 505.828 576.239 506.098 576.045 506.455C575.852 506.811 575.756 507.242 575.756 507.75ZM587.25 504.273V505.409H582.727V504.273H587.25ZM584.045 502.182H585.386V510.5C585.386 510.879 585.441 511.163 585.551 511.352C585.664 511.538 585.808 511.663 585.983 511.727C586.161 511.788 586.348 511.818 586.545 511.818C586.693 511.818 586.814 511.811 586.909 511.795C587.003 511.777 587.079 511.761 587.136 511.75L587.409 512.955C587.318 512.989 587.191 513.023 587.028 513.057C586.865 513.095 586.659 513.114 586.409 513.114C586.03 513.114 585.659 513.032 585.295 512.869C584.935 512.706 584.636 512.458 584.397 512.125C584.162 511.792 584.045 511.371 584.045 510.864V502.182ZM594.972 506.227L593.768 506.568C593.692 506.367 593.58 506.172 593.432 505.983C593.289 505.79 593.092 505.631 592.842 505.506C592.592 505.381 592.271 505.318 591.881 505.318C591.347 505.318 590.902 505.441 590.546 505.688C590.194 505.93 590.018 506.239 590.018 506.614C590.018 506.947 590.139 507.21 590.381 507.403C590.624 507.597 591.003 507.758 591.518 507.886L592.813 508.205C593.593 508.394 594.175 508.684 594.557 509.074C594.94 509.46 595.131 509.958 595.131 510.568C595.131 511.068 594.987 511.515 594.699 511.909C594.415 512.303 594.018 512.614 593.506 512.841C592.995 513.068 592.4 513.182 591.722 513.182C590.832 513.182 590.095 512.989 589.512 512.602C588.929 512.216 588.559 511.652 588.404 510.909L589.677 510.591C589.798 511.061 590.027 511.413 590.364 511.648C590.705 511.883 591.15 512 591.699 512C592.324 512 592.821 511.867 593.188 511.602C593.559 511.333 593.745 511.011 593.745 510.636C593.745 510.333 593.639 510.08 593.427 509.875C593.215 509.667 592.889 509.511 592.449 509.409L590.995 509.068C590.196 508.879 589.609 508.585 589.234 508.188C588.862 507.786 588.677 507.284 588.677 506.682C588.677 506.189 588.815 505.754 589.092 505.375C589.372 504.996 589.753 504.699 590.234 504.483C590.718 504.267 591.268 504.159 591.881 504.159C592.745 504.159 593.423 504.348 593.915 504.727C594.412 505.106 594.764 505.606 594.972 506.227ZM604.805 504.273V505.409H600.283V504.273H604.805ZM601.601 502.182H602.942V510.5C602.942 510.879 602.997 511.163 603.106 511.352C603.22 511.538 603.364 511.663 603.538 511.727C603.716 511.788 603.904 511.818 604.101 511.818C604.248 511.818 604.37 511.811 604.464 511.795C604.559 511.777 604.635 511.761 604.692 511.75L604.964 512.955C604.873 512.989 604.747 513.023 604.584 513.057C604.421 513.095 604.214 513.114 603.964 513.114C603.586 513.114 603.214 513.032 602.851 512.869C602.491 512.706 602.192 512.458 601.953 512.125C601.718 511.792 601.601 511.371 601.601 510.864V502.182ZM609.954 513.182C609.166 513.182 608.475 512.994 607.88 512.619C607.289 512.244 606.827 511.72 606.494 511.045C606.164 510.371 605.999 509.583 605.999 508.682C605.999 507.773 606.164 506.979 606.494 506.301C606.827 505.623 607.289 505.097 607.88 504.722C608.475 504.347 609.166 504.159 609.954 504.159C610.742 504.159 611.431 504.347 612.022 504.722C612.617 505.097 613.079 505.623 613.409 506.301C613.742 506.979 613.909 507.773 613.909 508.682C613.909 509.583 613.742 510.371 613.409 511.045C613.079 511.72 612.617 512.244 612.022 512.619C611.431 512.994 610.742 513.182 609.954 513.182ZM609.954 511.977C610.552 511.977 611.045 511.824 611.431 511.517C611.818 511.21 612.104 510.807 612.289 510.307C612.475 509.807 612.568 509.265 612.568 508.682C612.568 508.098 612.475 507.555 612.289 507.051C612.104 506.547 611.818 506.14 611.431 505.83C611.045 505.519 610.552 505.364 609.954 505.364C609.355 505.364 608.863 505.519 608.477 505.83C608.09 506.14 607.804 506.547 607.619 507.051C607.433 507.555 607.34 508.098 607.34 508.682C607.34 509.265 607.433 509.807 607.619 510.307C607.804 510.807 608.09 511.21 608.477 511.517C608.863 511.824 609.355 511.977 609.954 511.977ZM623.338 516.455C622.69 516.455 622.134 516.371 621.668 516.205C621.202 516.042 620.813 515.826 620.503 515.557C620.196 515.292 619.952 515.008 619.77 514.705L620.838 513.955C620.959 514.114 621.113 514.295 621.298 514.5C621.484 514.708 621.738 514.888 622.06 515.04C622.385 515.195 622.812 515.273 623.338 515.273C624.043 515.273 624.624 515.102 625.082 514.761C625.541 514.42 625.77 513.886 625.77 513.159V511.386H625.656C625.558 511.545 625.418 511.742 625.236 511.977C625.058 512.208 624.8 512.415 624.463 512.597C624.13 512.775 623.679 512.864 623.111 512.864C622.406 512.864 621.774 512.697 621.213 512.364C620.656 512.03 620.215 511.545 619.889 510.909C619.567 510.273 619.406 509.5 619.406 508.591C619.406 507.697 619.563 506.919 619.878 506.256C620.192 505.589 620.63 505.074 621.19 504.71C621.751 504.343 622.399 504.159 623.134 504.159C623.702 504.159 624.153 504.254 624.486 504.443C624.823 504.629 625.081 504.841 625.259 505.08C625.44 505.314 625.581 505.508 625.679 505.659H625.815V504.273H627.111V513.25C627.111 514 626.94 514.61 626.599 515.08C626.262 515.553 625.808 515.9 625.236 516.119C624.668 516.343 624.035 516.455 623.338 516.455ZM623.293 511.659C623.831 511.659 624.285 511.536 624.656 511.29C625.028 511.044 625.31 510.689 625.503 510.227C625.696 509.765 625.793 509.212 625.793 508.568C625.793 507.939 625.698 507.384 625.509 506.903C625.319 506.422 625.039 506.045 624.668 505.773C624.296 505.5 623.838 505.364 623.293 505.364C622.724 505.364 622.251 505.508 621.872 505.795C621.497 506.083 621.215 506.47 621.026 506.955C620.84 507.439 620.747 507.977 620.747 508.568C620.747 509.174 620.842 509.71 621.031 510.176C621.224 510.638 621.509 511.002 621.884 511.267C622.262 511.528 622.732 511.659 623.293 511.659ZM629.245 513V504.273H630.541V505.591H630.632C630.791 505.159 631.079 504.809 631.495 504.54C631.912 504.271 632.382 504.136 632.904 504.136C633.003 504.136 633.126 504.138 633.274 504.142C633.422 504.146 633.533 504.152 633.609 504.159V505.523C633.564 505.511 633.459 505.494 633.297 505.472C633.137 505.445 632.969 505.432 632.791 505.432C632.367 505.432 631.988 505.521 631.654 505.699C631.325 505.873 631.064 506.116 630.87 506.426C630.681 506.733 630.586 507.083 630.586 507.477V513H629.245ZM638.158 513.182C637.37 513.182 636.679 512.994 636.084 512.619C635.494 512.244 635.031 511.72 634.698 511.045C634.369 510.371 634.204 509.583 634.204 508.682C634.204 507.773 634.369 506.979 634.698 506.301C635.031 505.623 635.494 505.097 636.084 504.722C636.679 504.347 637.37 504.159 638.158 504.159C638.946 504.159 639.636 504.347 640.227 504.722C640.821 505.097 641.283 505.623 641.613 506.301C641.946 506.979 642.113 507.773 642.113 508.682C642.113 509.583 641.946 510.371 641.613 511.045C641.283 511.72 640.821 512.244 640.227 512.619C639.636 512.994 638.946 513.182 638.158 513.182ZM638.158 511.977C638.757 511.977 639.249 511.824 639.636 511.517C640.022 511.21 640.308 510.807 640.494 510.307C640.679 509.807 640.772 509.265 640.772 508.682C640.772 508.098 640.679 507.555 640.494 507.051C640.308 506.547 640.022 506.14 639.636 505.83C639.249 505.519 638.757 505.364 638.158 505.364C637.56 505.364 637.067 505.519 636.681 505.83C636.295 506.14 636.009 506.547 635.823 507.051C635.638 507.555 635.545 508.098 635.545 508.682C635.545 509.265 635.638 509.807 635.823 510.307C636.009 510.807 636.295 511.21 636.681 511.517C637.067 511.824 637.56 511.977 638.158 511.977ZM645.52 513L642.861 504.273H644.27L646.157 510.955H646.247L648.111 504.273H649.543L651.384 510.932H651.475L653.361 504.273H654.77L652.111 513H650.793L648.884 506.295H648.747L646.838 513H645.52ZM383.023 534.273V535.409H378.5V534.273H383.023ZM379.818 532.182H381.159V540.5C381.159 540.879 381.214 541.163 381.324 541.352C381.438 541.538 381.581 541.663 381.756 541.727C381.934 541.788 382.121 541.818 382.318 541.818C382.466 541.818 382.587 541.811 382.682 541.795C382.777 541.777 382.852 541.761 382.909 541.75L383.182 542.955C383.091 542.989 382.964 543.023 382.801 543.057C382.638 543.095 382.432 543.114 382.182 543.114C381.803 543.114 381.432 543.032 381.068 542.869C380.708 542.706 380.409 542.458 380.17 542.125C379.936 541.792 379.818 541.371 379.818 540.864V532.182ZM386.248 537.75V543H384.907V531.364H386.248V535.636H386.362C386.566 535.186 386.873 534.828 387.282 534.562C387.695 534.294 388.244 534.159 388.93 534.159C389.525 534.159 390.046 534.278 390.492 534.517C390.939 534.752 391.286 535.114 391.532 535.602C391.782 536.087 391.907 536.705 391.907 537.455V543H390.566V537.545C390.566 536.852 390.386 536.316 390.027 535.938C389.671 535.555 389.176 535.364 388.544 535.364C388.104 535.364 387.71 535.456 387.362 535.642C387.017 535.828 386.744 536.098 386.544 536.455C386.347 536.811 386.248 537.242 386.248 537.75ZM397.699 543.182C396.859 543.182 396.133 542.996 395.523 542.625C394.917 542.25 394.449 541.727 394.12 541.057C393.794 540.383 393.631 539.598 393.631 538.705C393.631 537.811 393.794 537.023 394.12 536.341C394.449 535.655 394.908 535.121 395.495 534.739C396.086 534.352 396.775 534.159 397.563 534.159C398.018 534.159 398.467 534.235 398.91 534.386C399.353 534.538 399.756 534.784 400.12 535.125C400.484 535.462 400.773 535.909 400.989 536.466C401.205 537.023 401.313 537.708 401.313 538.523V539.091H394.586V537.932H399.949C399.949 537.439 399.851 537 399.654 536.614C399.461 536.227 399.184 535.922 398.824 535.699C398.468 535.475 398.048 535.364 397.563 535.364C397.029 535.364 396.567 535.496 396.177 535.761C395.79 536.023 395.493 536.364 395.285 536.784C395.076 537.205 394.972 537.655 394.972 538.136V538.909C394.972 539.568 395.086 540.127 395.313 540.585C395.544 541.04 395.864 541.386 396.273 541.625C396.682 541.86 397.158 541.977 397.699 541.977C398.052 541.977 398.37 541.928 398.654 541.83C398.942 541.727 399.19 541.576 399.398 541.375C399.607 541.17 399.768 540.917 399.881 540.614L401.177 540.977C401.04 541.417 400.811 541.803 400.489 542.136C400.167 542.466 399.77 542.723 399.296 542.909C398.823 543.091 398.29 543.182 397.699 543.182ZM412.713 539.432V534.273H414.054V543H412.713V541.523H412.622C412.417 541.966 412.099 542.343 411.667 542.653C411.236 542.96 410.69 543.114 410.031 543.114C409.486 543.114 409.001 542.994 408.577 542.756C408.152 542.513 407.819 542.15 407.577 541.665C407.334 541.176 407.213 540.561 407.213 539.818V534.273H408.554V539.727C408.554 540.364 408.732 540.871 409.088 541.25C409.448 541.629 409.906 541.818 410.463 541.818C410.796 541.818 411.135 541.733 411.48 541.562C411.828 541.392 412.12 541.131 412.355 540.778C412.594 540.426 412.713 539.977 412.713 539.432ZM422.372 536.227L421.167 536.568C421.091 536.367 420.98 536.172 420.832 535.983C420.688 535.79 420.491 535.631 420.241 535.506C419.991 535.381 419.671 535.318 419.281 535.318C418.747 535.318 418.302 535.441 417.945 535.688C417.593 535.93 417.417 536.239 417.417 536.614C417.417 536.947 417.538 537.21 417.781 537.403C418.023 537.597 418.402 537.758 418.917 537.886L420.213 538.205C420.993 538.394 421.574 538.684 421.957 539.074C422.339 539.46 422.531 539.958 422.531 540.568C422.531 541.068 422.387 541.515 422.099 541.909C421.815 542.303 421.417 542.614 420.906 542.841C420.394 543.068 419.8 543.182 419.122 543.182C418.231 543.182 417.495 542.989 416.911 542.602C416.328 542.216 415.959 541.652 415.803 540.909L417.076 540.591C417.197 541.061 417.427 541.413 417.764 541.648C418.105 541.883 418.55 542 419.099 542C419.724 542 420.22 541.867 420.588 541.602C420.959 541.333 421.144 541.011 421.144 540.636C421.144 540.333 421.038 540.08 420.826 539.875C420.614 539.667 420.288 539.511 419.849 539.409L418.394 539.068C417.595 538.879 417.008 538.585 416.633 538.188C416.262 537.786 416.076 537.284 416.076 536.682C416.076 536.189 416.214 535.754 416.491 535.375C416.771 534.996 417.152 534.699 417.633 534.483C418.118 534.267 418.667 534.159 419.281 534.159C420.144 534.159 420.822 534.348 421.315 534.727C421.811 535.106 422.163 535.606 422.372 536.227ZM427.888 543.182C427.047 543.182 426.322 542.996 425.712 542.625C425.106 542.25 424.638 541.727 424.309 541.057C423.983 540.383 423.82 539.598 423.82 538.705C423.82 537.811 423.983 537.023 424.309 536.341C424.638 535.655 425.097 535.121 425.684 534.739C426.275 534.352 426.964 534.159 427.752 534.159C428.206 534.159 428.655 534.235 429.098 534.386C429.542 534.538 429.945 534.784 430.309 535.125C430.672 535.462 430.962 535.909 431.178 536.466C431.394 537.023 431.502 537.708 431.502 538.523V539.091H424.775V537.932H430.138C430.138 537.439 430.04 537 429.843 536.614C429.65 536.227 429.373 535.922 429.013 535.699C428.657 535.475 428.237 535.364 427.752 535.364C427.218 535.364 426.756 535.496 426.366 535.761C425.979 536.023 425.682 536.364 425.473 536.784C425.265 537.205 425.161 537.655 425.161 538.136V538.909C425.161 539.568 425.275 540.127 425.502 540.585C425.733 541.04 426.053 541.386 426.462 541.625C426.871 541.86 427.347 541.977 427.888 541.977C428.241 541.977 428.559 541.928 428.843 541.83C429.131 541.727 429.379 541.576 429.587 541.375C429.795 541.17 429.956 540.917 430.07 540.614L431.366 540.977C431.229 541.417 431 541.803 430.678 542.136C430.356 542.466 429.958 542.723 429.485 542.909C429.011 543.091 428.479 543.182 427.888 543.182ZM433.222 543V534.273H434.517V535.591H434.608C434.767 535.159 435.055 534.809 435.472 534.54C435.888 534.271 436.358 534.136 436.881 534.136C436.979 534.136 437.102 534.138 437.25 534.142C437.398 534.146 437.51 534.152 437.585 534.159V535.523C437.54 535.511 437.436 535.494 437.273 535.472C437.114 535.445 436.945 535.432 436.767 535.432C436.343 535.432 435.964 535.521 435.631 535.699C435.301 535.873 435.04 536.116 434.847 536.426C434.657 536.733 434.563 537.083 434.563 537.477V543H433.222ZM443.217 543V531.364H444.557V535.659H444.671C444.77 535.508 444.906 535.314 445.08 535.08C445.258 534.841 445.512 534.629 445.842 534.443C446.175 534.254 446.626 534.159 447.194 534.159C447.929 534.159 448.576 534.343 449.137 534.71C449.698 535.078 450.135 535.598 450.45 536.273C450.764 536.947 450.921 537.742 450.921 538.659C450.921 539.583 450.764 540.384 450.45 541.062C450.135 541.737 449.7 542.259 449.143 542.631C448.586 542.998 447.944 543.182 447.217 543.182C446.656 543.182 446.207 543.089 445.87 542.903C445.533 542.714 445.273 542.5 445.092 542.261C444.91 542.019 444.77 541.818 444.671 541.659H444.512V543H443.217ZM444.535 538.636C444.535 539.295 444.631 539.877 444.825 540.381C445.018 540.881 445.3 541.273 445.671 541.557C446.042 541.837 446.497 541.977 447.035 541.977C447.595 541.977 448.063 541.83 448.438 541.534C448.817 541.235 449.101 540.833 449.29 540.33C449.484 539.822 449.58 539.258 449.58 538.636C449.58 538.023 449.486 537.47 449.296 536.977C449.111 536.481 448.828 536.089 448.45 535.801C448.075 535.509 447.603 535.364 447.035 535.364C446.489 535.364 446.031 535.502 445.66 535.778C445.289 536.051 445.008 536.434 444.819 536.926C444.629 537.415 444.535 537.985 444.535 538.636ZM455.22 543.205C454.667 543.205 454.166 543.1 453.715 542.892C453.264 542.68 452.906 542.375 452.641 541.977C452.376 541.576 452.243 541.091 452.243 540.523C452.243 540.023 452.342 539.617 452.539 539.307C452.736 538.992 452.999 538.746 453.328 538.568C453.658 538.39 454.022 538.258 454.419 538.17C454.821 538.08 455.224 538.008 455.63 537.955C456.16 537.886 456.59 537.835 456.919 537.801C457.253 537.763 457.495 537.701 457.647 537.614C457.802 537.527 457.88 537.375 457.88 537.159V537.114C457.88 536.553 457.726 536.117 457.419 535.807C457.116 535.496 456.656 535.341 456.039 535.341C455.398 535.341 454.897 535.481 454.533 535.761C454.169 536.042 453.914 536.341 453.766 536.659L452.493 536.205C452.72 535.674 453.023 535.261 453.402 534.966C453.785 534.667 454.202 534.458 454.652 534.341C455.107 534.22 455.554 534.159 455.993 534.159C456.273 534.159 456.595 534.193 456.959 534.261C457.327 534.326 457.681 534.46 458.022 534.665C458.366 534.869 458.652 535.178 458.88 535.591C459.107 536.004 459.22 536.557 459.22 537.25V543H457.88V541.818H457.811C457.72 542.008 457.569 542.21 457.357 542.426C457.145 542.642 456.863 542.826 456.51 542.977C456.158 543.129 455.728 543.205 455.22 543.205ZM455.425 542C455.955 542 456.402 541.896 456.766 541.688C457.133 541.479 457.41 541.21 457.595 540.881C457.785 540.551 457.88 540.205 457.88 539.841V538.614C457.823 538.682 457.698 538.744 457.505 538.801C457.315 538.854 457.095 538.902 456.845 538.943C456.599 538.981 456.359 539.015 456.124 539.045C455.893 539.072 455.705 539.095 455.561 539.114C455.213 539.159 454.887 539.233 454.584 539.335C454.285 539.434 454.042 539.583 453.857 539.784C453.675 539.981 453.584 540.25 453.584 540.591C453.584 541.057 453.756 541.409 454.101 541.648C454.45 541.883 454.891 542 455.425 542ZM467.53 536.227L466.325 536.568C466.249 536.367 466.138 536.172 465.99 535.983C465.846 535.79 465.649 535.631 465.399 535.506C465.149 535.381 464.829 535.318 464.439 535.318C463.905 535.318 463.46 535.441 463.104 535.688C462.751 535.93 462.575 536.239 462.575 536.614C462.575 536.947 462.696 537.21 462.939 537.403C463.181 537.597 463.56 537.758 464.075 537.886L465.371 538.205C466.151 538.394 466.732 538.684 467.115 539.074C467.498 539.46 467.689 539.958 467.689 540.568C467.689 541.068 467.545 541.515 467.257 541.909C466.973 542.303 466.575 542.614 466.064 542.841C465.552 543.068 464.958 543.182 464.28 543.182C463.39 543.182 462.653 542.989 462.069 542.602C461.486 542.216 461.117 541.652 460.962 540.909L462.234 540.591C462.355 541.061 462.585 541.413 462.922 541.648C463.263 541.883 463.708 542 464.257 542C464.882 542 465.378 541.867 465.746 541.602C466.117 541.333 466.302 541.011 466.302 540.636C466.302 540.333 466.196 540.08 465.984 539.875C465.772 539.667 465.446 539.511 465.007 539.409L463.552 539.068C462.753 538.879 462.166 538.585 461.791 538.188C461.42 537.786 461.234 537.284 461.234 536.682C461.234 536.189 461.373 535.754 461.649 535.375C461.929 534.996 462.31 534.699 462.791 534.483C463.276 534.267 463.825 534.159 464.439 534.159C465.302 534.159 465.98 534.348 466.473 534.727C466.969 535.106 467.321 535.606 467.53 536.227ZM473.046 543.182C472.205 543.182 471.48 542.996 470.87 542.625C470.264 542.25 469.796 541.727 469.467 541.057C469.141 540.383 468.978 539.598 468.978 538.705C468.978 537.811 469.141 537.023 469.467 536.341C469.796 535.655 470.255 535.121 470.842 534.739C471.433 534.352 472.122 534.159 472.91 534.159C473.365 534.159 473.813 534.235 474.257 534.386C474.7 534.538 475.103 534.784 475.467 535.125C475.83 535.462 476.12 535.909 476.336 536.466C476.552 537.023 476.66 537.708 476.66 538.523V539.091H469.933V537.932H475.296C475.296 537.439 475.198 537 475.001 536.614C474.808 536.227 474.531 535.922 474.171 535.699C473.815 535.475 473.395 535.364 472.91 535.364C472.376 535.364 471.914 535.496 471.524 535.761C471.137 536.023 470.84 536.364 470.632 536.784C470.423 537.205 470.319 537.655 470.319 538.136V538.909C470.319 539.568 470.433 540.127 470.66 540.585C470.891 541.04 471.211 541.386 471.62 541.625C472.029 541.86 472.505 541.977 473.046 541.977C473.399 541.977 473.717 541.928 474.001 541.83C474.289 541.727 474.537 541.576 474.745 541.375C474.954 541.17 475.115 540.917 475.228 540.614L476.524 540.977C476.387 541.417 476.158 541.803 475.836 542.136C475.514 542.466 475.116 542.723 474.643 542.909C474.169 543.091 473.637 543.182 473.046 543.182ZM479.357 543.091C479.077 543.091 478.836 542.991 478.635 542.79C478.435 542.589 478.334 542.348 478.334 542.068C478.334 541.788 478.435 541.547 478.635 541.347C478.836 541.146 479.077 541.045 479.357 541.045C479.637 541.045 479.878 541.146 480.079 541.347C480.279 541.547 480.38 541.788 480.38 542.068C480.38 542.254 480.332 542.424 480.238 542.58C480.147 542.735 480.024 542.86 479.868 542.955C479.717 543.045 479.546 543.091 479.357 543.091Z" fill="black"/> +<rect x="377" y="277" width="64" height="64" rx="20" fill="white"/> +<rect x="397" y="297" width="23" height="23" rx="10" fill="#FEDD3E"/> +<path d="M949.78 424C944.476 424 939.648 422.708 935.296 420.124C930.944 417.404 927.408 413.868 924.688 409.516C922.104 405.164 920.812 400.404 920.812 395.236V385.036H949.984V393.808C949.984 394.08 950.052 394.352 950.188 394.624C950.46 394.896 950.732 395.032 951.004 395.032H1035.46C1035.73 395.032 1036 394.896 1036.28 394.624C1036.55 394.352 1036.68 394.08 1036.68 393.808V365.656C1036.68 365.248 1036.55 364.976 1036.28 364.84C1036 364.568 1035.73 364.432 1035.46 364.432H945.496V335.26H1029.75C1030.16 335.26 1030.43 335.192 1030.56 335.056C1030.84 334.784 1030.97 334.512 1030.97 334.24V307.312C1030.97 307.04 1030.84 306.768 1030.56 306.496C1030.43 306.224 1030.16 306.088 1029.75 306.088H951.004C950.732 306.088 950.46 306.224 950.188 306.496C950.052 306.768 949.984 307.04 949.984 307.312V317.92H920.812V305.884C920.812 300.58 922.104 295.752 924.688 291.4C927.408 287.048 930.944 283.58 935.296 280.996C939.648 278.412 944.476 277.12 949.78 277.12H1031.18C1036.48 277.12 1041.31 278.412 1045.66 280.996C1050.01 283.58 1053.48 287.048 1056.06 291.4C1058.65 295.752 1059.94 300.58 1059.94 305.884V335.464C1059.94 337.096 1059.8 338.796 1059.53 340.564C1059.4 342.196 1059.06 343.692 1058.51 345.052C1060.82 347.636 1062.59 350.628 1063.82 354.028C1065.04 357.292 1065.65 360.692 1065.65 364.228V395.236C1065.65 400.404 1064.36 405.164 1061.78 409.516C1059.19 413.868 1055.66 417.404 1051.17 420.124C1046.82 422.708 1042.06 424 1036.89 424H949.78Z" fill="black" fill-opacity="0.04"/> +<path d="M763.079 300.449H765.431L766.614 301.97L767.777 303.325L769.969 306.074H767.387L765.879 304.22L765.105 303.121L763.079 300.449ZM770.168 298.455C770.168 299.882 769.897 301.097 769.356 302.098C768.819 303.099 768.086 303.864 767.157 304.393C766.232 304.917 765.192 305.179 764.038 305.179C762.874 305.179 761.83 304.915 760.906 304.386C759.981 303.858 759.25 303.093 758.713 302.092C758.176 301.09 757.908 299.878 757.908 298.455C757.908 297.027 758.176 295.812 758.713 294.811C759.25 293.81 759.981 293.047 760.906 292.523C761.83 291.994 762.874 291.73 764.038 291.73C765.192 291.73 766.232 291.994 767.157 292.523C768.086 293.047 768.819 293.81 769.356 294.811C769.897 295.812 770.168 297.027 770.168 298.455ZM767.362 298.455C767.362 297.53 767.223 296.75 766.946 296.115C766.673 295.48 766.288 294.999 765.789 294.67C765.29 294.342 764.707 294.178 764.038 294.178C763.369 294.178 762.785 294.342 762.286 294.67C761.788 294.999 761.4 295.48 761.123 296.115C760.85 296.75 760.714 297.53 760.714 298.455C760.714 299.379 760.85 300.159 761.123 300.794C761.4 301.429 761.788 301.911 762.286 302.239C762.785 302.567 763.369 302.731 764.038 302.731C764.707 302.731 765.29 302.567 765.789 302.239C766.288 301.911 766.673 301.429 766.946 300.794C767.223 300.159 767.362 299.379 767.362 298.455ZM776.44 305.179C775.485 305.179 774.635 305.015 773.89 304.687C773.148 304.354 772.562 303.898 772.132 303.319C771.706 302.735 771.486 302.062 771.473 301.299H774.26C774.277 301.619 774.382 301.9 774.573 302.143C774.769 302.381 775.029 302.567 775.353 302.699C775.677 302.831 776.041 302.897 776.446 302.897C776.868 302.897 777.241 302.822 777.565 302.673C777.889 302.524 778.142 302.317 778.326 302.053C778.509 301.789 778.6 301.484 778.6 301.139C778.6 300.79 778.502 300.481 778.306 300.212C778.115 299.94 777.838 299.727 777.475 299.573C777.117 299.42 776.691 299.343 776.197 299.343H774.976V297.31H776.197C776.615 297.31 776.983 297.238 777.303 297.093C777.627 296.948 777.878 296.748 778.057 296.492C778.236 296.232 778.326 295.93 778.326 295.585C778.326 295.256 778.247 294.969 778.089 294.722C777.936 294.47 777.718 294.274 777.437 294.134C777.16 293.993 776.836 293.923 776.466 293.923C776.091 293.923 775.747 293.991 775.436 294.127C775.125 294.259 774.876 294.449 774.689 294.696C774.501 294.943 774.401 295.233 774.388 295.565H771.735C771.748 294.811 771.963 294.146 772.381 293.571C772.799 292.996 773.361 292.546 774.068 292.222C774.78 291.894 775.583 291.73 776.478 291.73C777.382 291.73 778.172 291.894 778.85 292.222C779.527 292.55 780.054 292.994 780.429 293.552C780.808 294.106 780.995 294.728 780.991 295.418C780.995 296.151 780.767 296.763 780.307 297.253C779.851 297.743 779.257 298.054 778.524 298.186V298.288C779.487 298.412 780.22 298.746 780.723 299.292C781.23 299.833 781.481 300.511 781.477 301.325C781.481 302.07 781.266 302.733 780.831 303.312C780.401 303.892 779.806 304.348 779.048 304.68C778.289 305.013 777.42 305.179 776.44 305.179ZM792.695 297.374V299.535H786.725V297.374H792.695ZM798.076 305V303.006L802.736 298.691C803.132 298.308 803.464 297.962 803.733 297.656C804.006 297.349 804.212 297.048 804.353 296.754C804.494 296.456 804.564 296.134 804.564 295.789C804.564 295.406 804.476 295.075 804.302 294.798C804.127 294.517 803.888 294.302 803.586 294.153C803.283 293.999 802.94 293.923 802.557 293.923C802.156 293.923 801.807 294.004 801.508 294.165C801.21 294.327 800.98 294.56 800.818 294.862C800.656 295.165 800.575 295.525 800.575 295.942H797.948C797.948 295.086 798.142 294.342 798.53 293.712C798.918 293.081 799.461 292.593 800.16 292.248C800.859 291.903 801.664 291.73 802.576 291.73C803.513 291.73 804.329 291.896 805.024 292.229C805.723 292.557 806.266 293.013 806.654 293.597C807.042 294.18 807.236 294.849 807.236 295.604C807.236 296.098 807.138 296.586 806.942 297.067C806.75 297.549 806.407 298.084 805.913 298.672C805.418 299.256 804.722 299.957 803.822 300.775L801.911 302.648V302.737H807.408V305H798.076ZM814.007 305.288C812.907 305.283 811.961 305.013 811.169 304.476C810.38 303.939 809.773 303.161 809.347 302.143C808.925 301.124 808.716 299.899 808.72 298.467C808.72 297.04 808.931 295.823 809.353 294.817C809.779 293.812 810.387 293.047 811.175 292.523C811.968 291.994 812.911 291.73 814.007 291.73C815.102 291.73 816.044 291.994 816.832 292.523C817.625 293.051 818.234 293.818 818.66 294.824C819.086 295.825 819.297 297.04 819.293 298.467C819.293 299.903 819.08 301.131 818.654 302.149C818.232 303.168 817.627 303.945 816.838 304.482C816.05 305.019 815.106 305.288 814.007 305.288ZM814.007 302.993C814.757 302.993 815.355 302.616 815.803 301.862C816.25 301.107 816.472 299.976 816.468 298.467C816.468 297.474 816.365 296.648 816.161 295.987C815.96 295.327 815.675 294.83 815.304 294.498C814.938 294.165 814.505 293.999 814.007 293.999C813.261 293.999 812.664 294.372 812.217 295.118C811.769 295.864 811.544 296.98 811.539 298.467C811.539 299.473 811.639 300.312 811.84 300.986C812.044 301.655 812.332 302.158 812.703 302.494C813.073 302.827 813.508 302.993 814.007 302.993ZM820.726 305V303.006L825.386 298.691C825.783 298.308 826.115 297.962 826.383 297.656C826.656 297.349 826.863 297.048 827.003 296.754C827.144 296.456 827.214 296.134 827.214 295.789C827.214 295.406 827.127 295.075 826.952 294.798C826.778 294.517 826.539 294.302 826.236 294.153C825.934 293.999 825.591 293.923 825.207 293.923C824.807 293.923 824.457 294.004 824.159 294.165C823.861 294.327 823.631 294.56 823.469 294.862C823.307 295.165 823.226 295.525 823.226 295.942H820.599C820.599 295.086 820.792 294.342 821.18 293.712C821.568 293.081 822.111 292.593 822.81 292.248C823.509 291.903 824.314 291.73 825.226 291.73C826.164 291.73 826.98 291.896 827.675 292.229C828.373 292.557 828.917 293.013 829.305 293.597C829.692 294.18 829.886 294.849 829.886 295.604C829.886 296.098 829.788 296.586 829.592 297.067C829.4 297.549 829.057 298.084 828.563 298.672C828.069 299.256 827.372 299.957 826.473 300.775L824.562 302.648V302.737H830.059V305H820.726ZM836.306 305.179C835.402 305.179 834.597 305.013 833.889 304.68C833.186 304.348 832.628 303.89 832.215 303.306C831.801 302.722 831.586 302.053 831.569 301.299H834.254C834.284 301.806 834.497 302.217 834.893 302.533C835.289 302.848 835.76 303.006 836.306 303.006C836.74 303.006 837.124 302.91 837.456 302.718C837.793 302.522 838.055 302.251 838.242 301.906C838.434 301.557 838.53 301.156 838.53 300.705C838.53 300.244 838.432 299.839 838.236 299.49C838.044 299.141 837.778 298.868 837.437 298.672C837.096 298.476 836.706 298.376 836.267 298.371C835.884 298.371 835.511 298.45 835.149 298.608C834.791 298.766 834.511 298.981 834.311 299.254L831.85 298.812L832.47 291.909H840.473V294.172H834.752L834.413 297.451H834.49C834.72 297.127 835.068 296.859 835.532 296.646C835.997 296.433 836.516 296.326 837.092 296.326C837.88 296.326 838.583 296.511 839.201 296.882C839.819 297.253 840.307 297.762 840.665 298.41C841.023 299.053 841.2 299.795 841.195 300.634C841.2 301.516 840.995 302.3 840.582 302.987C840.173 303.668 839.6 304.205 838.862 304.597C838.129 304.985 837.277 305.179 836.306 305.179Z" fill="black"/> +<path d="M768.227 335.182C768.227 336.409 768.006 337.47 767.562 338.364C767.119 339.258 766.511 339.947 765.739 340.432C764.966 340.917 764.083 341.159 763.091 341.159C762.098 341.159 761.216 340.917 760.443 340.432C759.67 339.947 759.063 339.258 758.619 338.364C758.176 337.47 757.955 336.409 757.955 335.182C757.955 333.955 758.176 332.894 758.619 332C759.063 331.106 759.67 330.417 760.443 329.932C761.216 329.447 762.098 329.205 763.091 329.205C764.083 329.205 764.966 329.447 765.739 329.932C766.511 330.417 767.119 331.106 767.562 332C768.006 332.894 768.227 333.955 768.227 335.182ZM766.864 335.182C766.864 334.174 766.695 333.324 766.358 332.631C766.025 331.938 765.572 331.413 765 331.057C764.432 330.701 763.795 330.523 763.091 330.523C762.386 330.523 761.748 330.701 761.176 331.057C760.608 331.413 760.155 331.938 759.818 332.631C759.485 333.324 759.318 334.174 759.318 335.182C759.318 336.189 759.485 337.04 759.818 337.733C760.155 338.426 760.608 338.951 761.176 339.307C761.748 339.663 762.386 339.841 763.091 339.841C763.795 339.841 764.432 339.663 765 339.307C765.572 338.951 766.025 338.426 766.358 337.733C766.695 337.04 766.864 336.189 766.864 335.182ZM770.095 344.273V332.273H771.39V333.659H771.549C771.648 333.508 771.784 333.314 771.958 333.08C772.136 332.841 772.39 332.629 772.72 332.443C773.053 332.254 773.504 332.159 774.072 332.159C774.807 332.159 775.455 332.343 776.015 332.71C776.576 333.078 777.013 333.598 777.328 334.273C777.642 334.947 777.799 335.742 777.799 336.659C777.799 337.583 777.642 338.384 777.328 339.062C777.013 339.737 776.578 340.259 776.021 340.631C775.464 340.998 774.822 341.182 774.095 341.182C773.534 341.182 773.085 341.089 772.748 340.903C772.411 340.714 772.152 340.5 771.97 340.261C771.788 340.019 771.648 339.818 771.549 339.659H771.436V344.273H770.095ZM771.413 336.636C771.413 337.295 771.51 337.877 771.703 338.381C771.896 338.881 772.178 339.273 772.549 339.557C772.921 339.837 773.375 339.977 773.913 339.977C774.474 339.977 774.941 339.83 775.316 339.534C775.695 339.235 775.979 338.833 776.169 338.33C776.362 337.822 776.458 337.258 776.458 336.636C776.458 336.023 776.364 335.47 776.174 334.977C775.989 334.481 775.707 334.089 775.328 333.801C774.953 333.509 774.481 333.364 773.913 333.364C773.368 333.364 772.909 333.502 772.538 333.778C772.167 334.051 771.886 334.434 771.697 334.926C771.508 335.415 771.413 335.985 771.413 336.636ZM783.32 332.273V333.409H778.798V332.273H783.32ZM780.116 330.182H781.457V338.5C781.457 338.879 781.512 339.163 781.621 339.352C781.735 339.538 781.879 339.663 782.053 339.727C782.231 339.788 782.419 339.818 782.616 339.818C782.763 339.818 782.885 339.811 782.979 339.795C783.074 339.777 783.15 339.761 783.207 339.75L783.479 340.955C783.388 340.989 783.262 341.023 783.099 341.057C782.936 341.095 782.729 341.114 782.479 341.114C782.101 341.114 781.729 341.032 781.366 340.869C781.006 340.706 780.707 340.458 780.468 340.125C780.233 339.792 780.116 339.371 780.116 338.864V330.182ZM785.017 341V332.273H786.358V341H785.017ZM785.699 330.818C785.438 330.818 785.212 330.729 785.023 330.551C784.837 330.373 784.745 330.159 784.745 329.909C784.745 329.659 784.837 329.445 785.023 329.267C785.212 329.089 785.438 329 785.699 329C785.96 329 786.184 329.089 786.37 329.267C786.559 329.445 786.654 329.659 786.654 329.909C786.654 330.159 786.559 330.373 786.37 330.551C786.184 330.729 785.96 330.818 785.699 330.818ZM788.494 341V332.273H789.79V333.636H789.903C790.085 333.17 790.379 332.809 790.784 332.551C791.189 332.29 791.676 332.159 792.244 332.159C792.82 332.159 793.299 332.29 793.682 332.551C794.068 332.809 794.369 333.17 794.585 333.636H794.676C794.899 333.186 795.235 332.828 795.682 332.562C796.129 332.294 796.665 332.159 797.29 332.159C798.07 332.159 798.708 332.403 799.204 332.892C799.701 333.377 799.949 334.133 799.949 335.159V341H798.608V335.159C798.608 334.515 798.432 334.055 798.079 333.778C797.727 333.502 797.312 333.364 796.835 333.364C796.221 333.364 795.746 333.549 795.409 333.92C795.072 334.288 794.903 334.754 794.903 335.318V341H793.54V335.023C793.54 334.527 793.379 334.127 793.057 333.824C792.735 333.517 792.32 333.364 791.812 333.364C791.464 333.364 791.138 333.456 790.835 333.642C790.536 333.828 790.293 334.085 790.108 334.415C789.926 334.741 789.835 335.117 789.835 335.545V341H788.494ZM802.08 341V332.273H803.421V341H802.08ZM802.762 330.818C802.501 330.818 802.275 330.729 802.086 330.551C801.9 330.373 801.808 330.159 801.808 329.909C801.808 329.659 801.9 329.445 802.086 329.267C802.275 329.089 802.501 329 802.762 329C803.024 329 803.247 329.089 803.433 329.267C803.622 329.445 803.717 329.659 803.717 329.909C803.717 330.159 803.622 330.373 803.433 330.551C803.247 330.729 803.024 330.818 802.762 330.818ZM805.307 341V339.977L810.262 333.614V333.523H805.466V332.273H811.989V333.341L807.171 339.659V339.75H812.148V341H805.307ZM817.303 341.182C816.462 341.182 815.736 340.996 815.126 340.625C814.52 340.25 814.053 339.727 813.723 339.057C813.397 338.383 813.234 337.598 813.234 336.705C813.234 335.811 813.397 335.023 813.723 334.341C814.053 333.655 814.511 333.121 815.098 332.739C815.689 332.352 816.378 332.159 817.166 332.159C817.621 332.159 818.07 332.235 818.513 332.386C818.956 332.538 819.359 332.784 819.723 333.125C820.087 333.462 820.376 333.909 820.592 334.466C820.808 335.023 820.916 335.708 820.916 336.523V337.091H814.189V335.932H819.553C819.553 335.439 819.454 335 819.257 334.614C819.064 334.227 818.787 333.922 818.428 333.699C818.072 333.475 817.651 333.364 817.166 333.364C816.632 333.364 816.17 333.496 815.78 333.761C815.394 334.023 815.096 334.364 814.888 334.784C814.68 335.205 814.575 335.655 814.575 336.136V336.909C814.575 337.568 814.689 338.127 814.916 338.585C815.147 339.04 815.467 339.386 815.876 339.625C816.286 339.86 816.761 339.977 817.303 339.977C817.655 339.977 817.973 339.928 818.257 339.83C818.545 339.727 818.793 339.576 819.001 339.375C819.21 339.17 819.371 338.917 819.484 338.614L820.78 338.977C820.644 339.417 820.414 339.803 820.092 340.136C819.77 340.466 819.373 340.723 818.899 340.909C818.426 341.091 817.894 341.182 817.303 341.182ZM826.816 344.273V332.273H828.111V333.659H828.271C828.369 333.508 828.505 333.314 828.68 333.08C828.858 332.841 829.111 332.629 829.441 332.443C829.774 332.254 830.225 332.159 830.793 332.159C831.528 332.159 832.176 332.343 832.736 332.71C833.297 333.078 833.735 333.598 834.049 334.273C834.363 334.947 834.521 335.742 834.521 336.659C834.521 337.583 834.363 338.384 834.049 339.062C833.735 339.737 833.299 340.259 832.742 340.631C832.185 340.998 831.543 341.182 830.816 341.182C830.255 341.182 829.807 341.089 829.469 340.903C829.132 340.714 828.873 340.5 828.691 340.261C828.509 340.019 828.369 339.818 828.271 339.659H828.157V344.273H826.816ZM828.134 336.636C828.134 337.295 828.231 337.877 828.424 338.381C828.617 338.881 828.899 339.273 829.271 339.557C829.642 339.837 830.096 339.977 830.634 339.977C831.195 339.977 831.663 339.83 832.038 339.534C832.416 339.235 832.7 338.833 832.89 338.33C833.083 337.822 833.18 337.258 833.18 336.636C833.18 336.023 833.085 335.47 832.896 334.977C832.71 334.481 832.428 334.089 832.049 333.801C831.674 333.509 831.202 333.364 830.634 333.364C830.089 333.364 829.63 333.502 829.259 333.778C828.888 334.051 828.608 334.434 828.418 334.926C828.229 335.415 828.134 335.985 828.134 336.636ZM839.905 341.182C839.064 341.182 838.339 340.996 837.729 340.625C837.123 340.25 836.655 339.727 836.326 339.057C836 338.383 835.837 337.598 835.837 336.705C835.837 335.811 836 335.023 836.326 334.341C836.655 333.655 837.113 333.121 837.701 332.739C838.291 332.352 838.981 332.159 839.769 332.159C840.223 332.159 840.672 332.235 841.115 332.386C841.559 332.538 841.962 332.784 842.326 333.125C842.689 333.462 842.979 333.909 843.195 334.466C843.411 335.023 843.519 335.708 843.519 336.523V337.091H836.791V335.932H842.155C842.155 335.439 842.057 335 841.86 334.614C841.666 334.227 841.39 333.922 841.03 333.699C840.674 333.475 840.254 333.364 839.769 333.364C839.235 333.364 838.773 333.496 838.382 333.761C837.996 334.023 837.699 334.364 837.49 334.784C837.282 335.205 837.178 335.655 837.178 336.136V336.909C837.178 337.568 837.291 338.127 837.519 338.585C837.75 339.04 838.07 339.386 838.479 339.625C838.888 339.86 839.363 339.977 839.905 339.977C840.257 339.977 840.576 339.928 840.86 339.83C841.148 339.727 841.396 339.576 841.604 339.375C841.812 339.17 841.973 338.917 842.087 338.614L843.382 338.977C843.246 339.417 843.017 339.803 842.695 340.136C842.373 340.466 841.975 340.723 841.502 340.909C841.028 341.091 840.496 341.182 839.905 341.182ZM845.239 341V332.273H846.534V333.591H846.625C846.784 333.159 847.072 332.809 847.489 332.54C847.905 332.271 848.375 332.136 848.898 332.136C848.996 332.136 849.119 332.138 849.267 332.142C849.415 332.146 849.526 332.152 849.602 332.159V333.523C849.557 333.511 849.453 333.494 849.29 333.472C849.131 333.445 848.962 333.432 848.784 333.432C848.36 333.432 847.981 333.521 847.648 333.699C847.318 333.873 847.057 334.116 846.864 334.426C846.674 334.733 846.579 335.083 846.579 335.477V341H845.239ZM855.305 332.273V333.409H850.6V332.273H855.305ZM852.009 341V331.068C852.009 330.568 852.127 330.152 852.362 329.818C852.597 329.485 852.901 329.235 853.276 329.068C853.651 328.902 854.047 328.818 854.464 328.818C854.794 328.818 855.062 328.845 855.271 328.898C855.479 328.951 855.634 329 855.737 329.045L855.35 330.205C855.282 330.182 855.187 330.153 855.066 330.119C854.949 330.085 854.794 330.068 854.6 330.068C854.157 330.068 853.837 330.18 853.64 330.403C853.447 330.627 853.35 330.955 853.35 331.386V341H852.009ZM860.05 341.182C859.262 341.182 858.571 340.994 857.976 340.619C857.385 340.244 856.923 339.72 856.59 339.045C856.26 338.371 856.096 337.583 856.096 336.682C856.096 335.773 856.26 334.979 856.59 334.301C856.923 333.623 857.385 333.097 857.976 332.722C858.571 332.347 859.262 332.159 860.05 332.159C860.838 332.159 861.527 332.347 862.118 332.722C862.713 333.097 863.175 333.623 863.505 334.301C863.838 334.979 864.005 335.773 864.005 336.682C864.005 337.583 863.838 338.371 863.505 339.045C863.175 339.72 862.713 340.244 862.118 340.619C861.527 340.994 860.838 341.182 860.05 341.182ZM860.05 339.977C860.649 339.977 861.141 339.824 861.527 339.517C861.914 339.21 862.2 338.807 862.385 338.307C862.571 337.807 862.664 337.265 862.664 336.682C862.664 336.098 862.571 335.555 862.385 335.051C862.2 334.547 861.914 334.14 861.527 333.83C861.141 333.519 860.649 333.364 860.05 333.364C859.452 333.364 858.959 333.519 858.573 333.83C858.187 334.14 857.901 334.547 857.715 335.051C857.529 335.555 857.437 336.098 857.437 336.682C857.437 337.265 857.529 337.807 857.715 338.307C857.901 338.807 858.187 339.21 858.573 339.517C858.959 339.824 859.452 339.977 860.05 339.977ZM865.732 341V332.273H867.027V333.591H867.118C867.277 333.159 867.565 332.809 867.982 332.54C868.398 332.271 868.868 332.136 869.391 332.136C869.489 332.136 869.612 332.138 869.76 332.142C869.908 332.146 870.02 332.152 870.095 332.159V333.523C870.05 333.511 869.946 333.494 869.783 333.472C869.624 333.445 869.455 333.432 869.277 333.432C868.853 333.432 868.474 333.521 868.141 333.699C867.811 333.873 867.55 334.116 867.357 334.426C867.167 334.733 867.073 335.083 867.073 335.477V341H865.732ZM871.365 341V332.273H872.66V333.636H872.774C872.956 333.17 873.249 332.809 873.655 332.551C874.06 332.29 874.547 332.159 875.115 332.159C875.691 332.159 876.17 332.29 876.552 332.551C876.939 332.809 877.24 333.17 877.456 333.636H877.547C877.77 333.186 878.105 332.828 878.552 332.562C878.999 332.294 879.535 332.159 880.16 332.159C880.941 332.159 881.579 332.403 882.075 332.892C882.571 333.377 882.819 334.133 882.819 335.159V341H881.478V335.159C881.478 334.515 881.302 334.055 880.95 333.778C880.598 333.502 880.183 333.364 879.706 333.364C879.092 333.364 878.617 333.549 878.28 333.92C877.942 334.288 877.774 334.754 877.774 335.318V341H876.41V335.023C876.41 334.527 876.249 334.127 875.927 333.824C875.605 333.517 875.191 333.364 874.683 333.364C874.334 333.364 874.009 333.456 873.706 333.642C873.406 333.828 873.164 334.085 872.978 334.415C872.797 334.741 872.706 335.117 872.706 335.545V341H871.365ZM887.519 341.205C886.966 341.205 886.464 341.1 886.014 340.892C885.563 340.68 885.205 340.375 884.94 339.977C884.675 339.576 884.542 339.091 884.542 338.523C884.542 338.023 884.64 337.617 884.837 337.307C885.034 336.992 885.298 336.746 885.627 336.568C885.957 336.39 886.32 336.258 886.718 336.17C887.12 336.08 887.523 336.008 887.928 335.955C888.459 335.886 888.889 335.835 889.218 335.801C889.551 335.763 889.794 335.701 889.945 335.614C890.101 335.527 890.178 335.375 890.178 335.159V335.114C890.178 334.553 890.025 334.117 889.718 333.807C889.415 333.496 888.955 333.341 888.337 333.341C887.697 333.341 887.195 333.481 886.832 333.761C886.468 334.042 886.212 334.341 886.065 334.659L884.792 334.205C885.019 333.674 885.322 333.261 885.701 332.966C886.084 332.667 886.5 332.458 886.951 332.341C887.406 332.22 887.853 332.159 888.292 332.159C888.572 332.159 888.894 332.193 889.258 332.261C889.625 332.326 889.979 332.46 890.32 332.665C890.665 332.869 890.951 333.178 891.178 333.591C891.406 334.004 891.519 334.557 891.519 335.25V341H890.178V339.818H890.11C890.019 340.008 889.868 340.21 889.656 340.426C889.443 340.642 889.161 340.826 888.809 340.977C888.457 341.129 888.027 341.205 887.519 341.205ZM887.724 340C888.254 340 888.701 339.896 889.065 339.688C889.432 339.479 889.709 339.21 889.894 338.881C890.084 338.551 890.178 338.205 890.178 337.841V336.614C890.121 336.682 889.996 336.744 889.803 336.801C889.614 336.854 889.394 336.902 889.144 336.943C888.898 336.981 888.657 337.015 888.423 337.045C888.192 337.072 888.004 337.095 887.86 337.114C887.512 337.159 887.186 337.233 886.883 337.335C886.584 337.434 886.341 337.583 886.156 337.784C885.974 337.981 885.883 338.25 885.883 338.591C885.883 339.057 886.055 339.409 886.4 339.648C886.748 339.883 887.19 340 887.724 340ZM894.988 335.75V341H893.647V332.273H894.942V333.636H895.056C895.26 333.193 895.571 332.837 895.988 332.568C896.404 332.295 896.942 332.159 897.601 332.159C898.192 332.159 898.709 332.28 899.152 332.523C899.596 332.761 899.94 333.125 900.186 333.614C900.433 334.098 900.556 334.712 900.556 335.455V341H899.215V335.545C899.215 334.86 899.037 334.326 898.681 333.943C898.325 333.557 897.836 333.364 897.215 333.364C896.787 333.364 896.404 333.456 896.067 333.642C895.734 333.828 895.471 334.098 895.277 334.455C895.084 334.811 894.988 335.242 894.988 335.75ZM906.231 341.182C905.413 341.182 904.709 340.989 904.118 340.602C903.527 340.216 903.072 339.684 902.754 339.006C902.436 338.328 902.277 337.553 902.277 336.682C902.277 335.795 902.44 335.013 902.766 334.335C903.095 333.653 903.553 333.121 904.141 332.739C904.731 332.352 905.421 332.159 906.209 332.159C906.822 332.159 907.375 332.273 907.868 332.5C908.36 332.727 908.764 333.045 909.078 333.455C909.392 333.864 909.588 334.341 909.663 334.886H908.322C908.22 334.489 907.993 334.136 907.641 333.83C907.292 333.519 906.822 333.364 906.231 333.364C905.709 333.364 905.25 333.5 904.856 333.773C904.466 334.042 904.161 334.422 903.942 334.915C903.726 335.403 903.618 335.977 903.618 336.636C903.618 337.311 903.724 337.898 903.936 338.398C904.152 338.898 904.455 339.286 904.845 339.562C905.239 339.839 905.701 339.977 906.231 339.977C906.58 339.977 906.896 339.917 907.18 339.795C907.464 339.674 907.705 339.5 907.902 339.273C908.099 339.045 908.239 338.773 908.322 338.455H909.663C909.588 338.97 909.4 339.434 909.101 339.847C908.805 340.256 908.413 340.581 907.925 340.824C907.44 341.062 906.875 341.182 906.231 341.182ZM914.963 341.182C914.122 341.182 913.396 340.996 912.786 340.625C912.18 340.25 911.713 339.727 911.383 339.057C911.057 338.383 910.894 337.598 910.894 336.705C910.894 335.811 911.057 335.023 911.383 334.341C911.713 333.655 912.171 333.121 912.758 332.739C913.349 332.352 914.038 332.159 914.826 332.159C915.281 332.159 915.73 332.235 916.173 332.386C916.616 332.538 917.019 332.784 917.383 333.125C917.747 333.462 918.036 333.909 918.252 334.466C918.468 335.023 918.576 335.708 918.576 336.523V337.091H911.849V335.932H917.213C917.213 335.439 917.114 335 916.917 334.614C916.724 334.227 916.447 333.922 916.088 333.699C915.732 333.475 915.311 333.364 914.826 333.364C914.292 333.364 913.83 333.496 913.44 333.761C913.054 334.023 912.756 334.364 912.548 334.784C912.34 335.205 912.235 335.655 912.235 336.136V336.909C912.235 337.568 912.349 338.127 912.576 338.585C912.807 339.04 913.127 339.386 913.536 339.625C913.946 339.86 914.421 339.977 914.963 339.977C915.315 339.977 915.633 339.928 915.917 339.83C916.205 339.727 916.453 339.576 916.661 339.375C916.87 339.17 917.031 338.917 917.144 338.614L918.44 338.977C918.304 339.417 918.074 339.803 917.752 340.136C917.43 340.466 917.033 340.723 916.559 340.909C916.086 341.091 915.554 341.182 914.963 341.182ZM928.362 332.273V333.409H923.658V332.273H928.362ZM925.067 341V331.068C925.067 330.568 925.184 330.152 925.419 329.818C925.654 329.485 925.959 329.235 926.334 329.068C926.709 328.902 927.105 328.818 927.521 328.818C927.851 328.818 928.12 328.845 928.328 328.898C928.537 328.951 928.692 329 928.794 329.045L928.408 330.205C928.34 330.182 928.245 330.153 928.124 330.119C928.006 330.085 927.851 330.068 927.658 330.068C927.215 330.068 926.895 330.18 926.698 330.403C926.504 330.627 926.408 330.955 926.408 331.386V341H925.067ZM933.108 341.182C932.32 341.182 931.629 340.994 931.034 340.619C930.443 340.244 929.981 339.72 929.648 339.045C929.318 338.371 929.153 337.583 929.153 336.682C929.153 335.773 929.318 334.979 929.648 334.301C929.981 333.623 930.443 333.097 931.034 332.722C931.629 332.347 932.32 332.159 933.108 332.159C933.896 332.159 934.585 332.347 935.176 332.722C935.771 333.097 936.233 333.623 936.562 334.301C936.896 334.979 937.062 335.773 937.062 336.682C937.062 337.583 936.896 338.371 936.562 339.045C936.233 339.72 935.771 340.244 935.176 340.619C934.585 340.994 933.896 341.182 933.108 341.182ZM933.108 339.977C933.706 339.977 934.199 339.824 934.585 339.517C934.971 339.21 935.257 338.807 935.443 338.307C935.629 337.807 935.721 337.265 935.721 336.682C935.721 336.098 935.629 335.555 935.443 335.051C935.257 334.547 934.971 334.14 934.585 333.83C934.199 333.519 933.706 333.364 933.108 333.364C932.509 333.364 932.017 333.519 931.63 333.83C931.244 334.14 930.958 334.547 930.773 335.051C930.587 335.555 930.494 336.098 930.494 336.682C930.494 337.265 930.587 337.807 930.773 338.307C930.958 338.807 931.244 339.21 931.63 339.517C932.017 339.824 932.509 339.977 933.108 339.977ZM938.789 341V332.273H940.085V333.591H940.176C940.335 333.159 940.622 332.809 941.039 332.54C941.456 332.271 941.926 332.136 942.448 332.136C942.547 332.136 942.67 332.138 942.818 332.142C942.965 332.146 943.077 332.152 943.153 332.159V333.523C943.107 333.511 943.003 333.494 942.84 333.472C942.681 333.445 942.513 333.432 942.335 333.432C941.91 333.432 941.532 333.521 941.198 333.699C940.869 333.873 940.607 334.116 940.414 334.426C940.225 334.733 940.13 335.083 940.13 335.477V341H938.789ZM954.784 334.227L953.58 334.568C953.504 334.367 953.392 334.172 953.244 333.983C953.1 333.79 952.903 333.631 952.653 333.506C952.403 333.381 952.083 333.318 951.693 333.318C951.159 333.318 950.714 333.441 950.358 333.688C950.006 333.93 949.83 334.239 949.83 334.614C949.83 334.947 949.951 335.21 950.193 335.403C950.436 335.597 950.814 335.758 951.33 335.886L952.625 336.205C953.405 336.394 953.987 336.684 954.369 337.074C954.752 337.46 954.943 337.958 954.943 338.568C954.943 339.068 954.799 339.515 954.511 339.909C954.227 340.303 953.83 340.614 953.318 340.841C952.807 341.068 952.212 341.182 951.534 341.182C950.644 341.182 949.907 340.989 949.324 340.602C948.741 340.216 948.371 339.652 948.216 338.909L949.489 338.591C949.61 339.061 949.839 339.413 950.176 339.648C950.517 339.883 950.962 340 951.511 340C952.136 340 952.633 339.867 953 339.602C953.371 339.333 953.557 339.011 953.557 338.636C953.557 338.333 953.451 338.08 953.239 337.875C953.027 337.667 952.701 337.511 952.261 337.409L950.807 337.068C950.008 336.879 949.42 336.585 949.045 336.188C948.674 335.786 948.489 335.284 948.489 334.682C948.489 334.189 948.627 333.754 948.903 333.375C949.184 332.996 949.564 332.699 950.045 332.483C950.53 332.267 951.08 332.159 951.693 332.159C952.557 332.159 953.235 332.348 953.727 332.727C954.223 333.106 954.576 333.606 954.784 334.227ZM960.187 341.182C959.369 341.182 958.664 340.989 958.073 340.602C957.483 340.216 957.028 339.684 956.71 339.006C956.392 338.328 956.233 337.553 956.233 336.682C956.233 335.795 956.395 335.013 956.721 334.335C957.051 333.653 957.509 333.121 958.096 332.739C958.687 332.352 959.376 332.159 960.164 332.159C960.778 332.159 961.331 332.273 961.823 332.5C962.316 332.727 962.719 333.045 963.034 333.455C963.348 333.864 963.543 334.341 963.619 334.886H962.278C962.176 334.489 961.948 334.136 961.596 333.83C961.248 333.519 960.778 333.364 960.187 333.364C959.664 333.364 959.206 333.5 958.812 333.773C958.422 334.042 958.117 334.422 957.897 334.915C957.681 335.403 957.573 335.977 957.573 336.636C957.573 337.311 957.68 337.898 957.892 338.398C958.108 338.898 958.411 339.286 958.801 339.562C959.195 339.839 959.657 339.977 960.187 339.977C960.536 339.977 960.852 339.917 961.136 339.795C961.42 339.674 961.661 339.5 961.858 339.273C962.055 339.045 962.195 338.773 962.278 338.455H963.619C963.543 338.97 963.356 339.434 963.056 339.847C962.761 340.256 962.369 340.581 961.88 340.824C961.395 341.062 960.831 341.182 960.187 341.182ZM967.827 341.205C967.274 341.205 966.772 341.1 966.322 340.892C965.871 340.68 965.513 340.375 965.248 339.977C964.983 339.576 964.85 339.091 964.85 338.523C964.85 338.023 964.949 337.617 965.146 337.307C965.342 336.992 965.606 336.746 965.935 336.568C966.265 336.39 966.628 336.258 967.026 336.17C967.428 336.08 967.831 336.008 968.236 335.955C968.767 335.886 969.197 335.835 969.526 335.801C969.86 335.763 970.102 335.701 970.253 335.614C970.409 335.527 970.486 335.375 970.486 335.159V335.114C970.486 334.553 970.333 334.117 970.026 333.807C969.723 333.496 969.263 333.341 968.646 333.341C968.005 333.341 967.503 333.481 967.14 333.761C966.776 334.042 966.521 334.341 966.373 334.659L965.1 334.205C965.327 333.674 965.63 333.261 966.009 332.966C966.392 332.667 966.808 332.458 967.259 332.341C967.714 332.22 968.161 332.159 968.6 332.159C968.88 332.159 969.202 332.193 969.566 332.261C969.933 332.326 970.288 332.46 970.628 332.665C970.973 332.869 971.259 333.178 971.486 333.591C971.714 334.004 971.827 334.557 971.827 335.25V341H970.486V339.818H970.418C970.327 340.008 970.176 340.21 969.964 340.426C969.752 340.642 969.469 340.826 969.117 340.977C968.765 341.129 968.335 341.205 967.827 341.205ZM968.032 340C968.562 340 969.009 339.896 969.373 339.688C969.74 339.479 970.017 339.21 970.202 338.881C970.392 338.551 970.486 338.205 970.486 337.841V336.614C970.43 336.682 970.305 336.744 970.111 336.801C969.922 336.854 969.702 336.902 969.452 336.943C969.206 336.981 968.966 337.015 968.731 337.045C968.5 337.072 968.312 337.095 968.168 337.114C967.82 337.159 967.494 337.233 967.191 337.335C966.892 337.434 966.649 337.583 966.464 337.784C966.282 337.981 966.191 338.25 966.191 338.591C966.191 339.057 966.363 339.409 966.708 339.648C967.056 339.883 967.498 340 968.032 340ZM975.296 329.364V341H973.955V329.364H975.296ZM980 341.205C979.447 341.205 978.945 341.1 978.494 340.892C978.043 340.68 977.685 340.375 977.42 339.977C977.155 339.576 977.023 339.091 977.023 338.523C977.023 338.023 977.121 337.617 977.318 337.307C977.515 336.992 977.778 336.746 978.108 336.568C978.437 336.39 978.801 336.258 979.199 336.17C979.6 336.08 980.004 336.008 980.409 335.955C980.939 335.886 981.369 335.835 981.699 335.801C982.032 335.763 982.274 335.701 982.426 335.614C982.581 335.527 982.659 335.375 982.659 335.159V335.114C982.659 334.553 982.506 334.117 982.199 333.807C981.896 333.496 981.435 333.341 980.818 333.341C980.178 333.341 979.676 333.481 979.312 333.761C978.949 334.042 978.693 334.341 978.545 334.659L977.273 334.205C977.5 333.674 977.803 333.261 978.182 332.966C978.564 332.667 978.981 332.458 979.432 332.341C979.886 332.22 980.333 332.159 980.773 332.159C981.053 332.159 981.375 332.193 981.738 332.261C982.106 332.326 982.46 332.46 982.801 332.665C983.146 332.869 983.432 333.178 983.659 333.591C983.886 334.004 984 334.557 984 335.25V341H982.659V339.818H982.591C982.5 340.008 982.348 340.21 982.136 340.426C981.924 340.642 981.642 340.826 981.29 340.977C980.937 341.129 980.507 341.205 980 341.205ZM980.204 340C980.735 340 981.182 339.896 981.545 339.688C981.913 339.479 982.189 339.21 982.375 338.881C982.564 338.551 982.659 338.205 982.659 337.841V336.614C982.602 336.682 982.477 336.744 982.284 336.801C982.095 336.854 981.875 336.902 981.625 336.943C981.379 336.981 981.138 337.015 980.903 337.045C980.672 337.072 980.485 337.095 980.341 337.114C979.992 337.159 979.666 337.233 979.363 337.335C979.064 337.434 978.822 337.583 978.636 337.784C978.454 337.981 978.363 338.25 978.363 338.591C978.363 339.057 978.536 339.409 978.881 339.648C979.229 339.883 979.67 340 980.204 340ZM986.309 341V329.364H987.65V333.659H987.764C987.862 333.508 987.998 333.314 988.173 333.08C988.351 332.841 988.605 332.629 988.934 332.443C989.267 332.254 989.718 332.159 990.286 332.159C991.021 332.159 991.669 332.343 992.23 332.71C992.79 333.078 993.228 333.598 993.542 334.273C993.856 334.947 994.014 335.742 994.014 336.659C994.014 337.583 993.856 338.384 993.542 339.062C993.228 339.737 992.792 340.259 992.235 340.631C991.678 340.998 991.036 341.182 990.309 341.182C989.748 341.182 989.3 341.089 988.962 340.903C988.625 340.714 988.366 340.5 988.184 340.261C988.002 340.019 987.862 339.818 987.764 339.659H987.605V341H986.309ZM987.627 336.636C987.627 337.295 987.724 337.877 987.917 338.381C988.11 338.881 988.392 339.273 988.764 339.557C989.135 339.837 989.589 339.977 990.127 339.977C990.688 339.977 991.156 339.83 991.531 339.534C991.909 339.235 992.194 338.833 992.383 338.33C992.576 337.822 992.673 337.258 992.673 336.636C992.673 336.023 992.578 335.47 992.389 334.977C992.203 334.481 991.921 334.089 991.542 333.801C991.167 333.509 990.695 333.364 990.127 333.364C989.582 333.364 989.123 333.502 988.752 333.778C988.381 334.051 988.101 334.434 987.911 334.926C987.722 335.415 987.627 335.985 987.627 336.636ZM995.745 341V332.273H997.086V341H995.745ZM996.427 330.818C996.165 330.818 995.94 330.729 995.75 330.551C995.565 330.373 995.472 330.159 995.472 329.909C995.472 329.659 995.565 329.445 995.75 329.267C995.94 329.089 996.165 329 996.427 329C996.688 329 996.911 329.089 997.097 329.267C997.286 329.445 997.381 329.659 997.381 329.909C997.381 330.159 997.286 330.373 997.097 330.551C996.911 330.729 996.688 330.818 996.427 330.818ZM1000.56 329.364V341H999.222V329.364H1000.56ZM1002.7 341V332.273H1004.04V341H1002.7ZM1003.38 330.818C1003.12 330.818 1002.89 330.729 1002.7 330.551C1002.52 330.373 1002.43 330.159 1002.43 329.909C1002.43 329.659 1002.52 329.445 1002.7 329.267C1002.89 329.089 1003.12 329 1003.38 329C1003.64 329 1003.87 329.089 1004.05 329.267C1004.24 329.445 1004.33 329.659 1004.33 329.909C1004.33 330.159 1004.24 330.373 1004.05 330.551C1003.87 330.729 1003.64 330.818 1003.38 330.818ZM1009.97 332.273V333.409H1005.45V332.273H1009.97ZM1006.77 330.182H1008.11V338.5C1008.11 338.879 1008.16 339.163 1008.27 339.352C1008.39 339.538 1008.53 339.663 1008.7 339.727C1008.88 339.788 1009.07 339.818 1009.27 339.818C1009.41 339.818 1009.54 339.811 1009.63 339.795C1009.72 339.777 1009.8 339.761 1009.86 339.75L1010.13 340.955C1010.04 340.989 1009.91 341.023 1009.75 341.057C1009.59 341.095 1009.38 341.114 1009.13 341.114C1008.75 341.114 1008.38 341.032 1008.02 340.869C1007.66 340.706 1007.36 340.458 1007.12 340.125C1006.88 339.792 1006.77 339.371 1006.77 338.864V330.182ZM1012.53 344.273C1012.3 344.273 1012.1 344.254 1011.92 344.216C1011.75 344.182 1011.62 344.148 1011.55 344.114L1011.9 342.932C1012.22 343.015 1012.51 343.045 1012.76 343.023C1013.01 343 1013.23 342.888 1013.42 342.688C1013.62 342.491 1013.8 342.17 1013.96 341.727L1014.21 341.045L1010.99 332.273H1012.44L1014.85 339.227H1014.94L1017.35 332.273H1018.8L1015.1 342.273C1014.93 342.723 1014.73 343.097 1014.48 343.392C1014.23 343.691 1013.95 343.913 1013.62 344.057C1013.3 344.201 1012.94 344.273 1012.53 344.273ZM1021.71 339.409L1021.62 340.023C1021.55 340.455 1021.45 340.917 1021.32 341.409C1021.19 341.902 1021.06 342.366 1020.92 342.801C1020.78 343.237 1020.66 343.583 1020.57 343.841H1019.55C1019.6 343.598 1019.66 343.278 1019.74 342.881C1019.82 342.483 1019.9 342.038 1019.98 341.545C1020.06 341.057 1020.13 340.557 1020.18 340.045L1020.25 339.409H1021.71ZM758.227 371V362.273H759.523V363.591H759.614C759.773 363.159 760.061 362.809 760.477 362.54C760.894 362.271 761.364 362.136 761.886 362.136C761.985 362.136 762.108 362.138 762.256 362.142C762.403 362.146 762.515 362.152 762.591 362.159V363.523C762.545 363.511 762.441 363.494 762.278 363.472C762.119 363.445 761.951 363.432 761.773 363.432C761.348 363.432 760.97 363.521 760.636 363.699C760.307 363.873 760.045 364.116 759.852 364.426C759.663 364.733 759.568 365.083 759.568 365.477V371H758.227ZM767.14 371.182C766.352 371.182 765.661 370.994 765.066 370.619C764.475 370.244 764.013 369.72 763.68 369.045C763.35 368.371 763.186 367.583 763.186 366.682C763.186 365.773 763.35 364.979 763.68 364.301C764.013 363.623 764.475 363.097 765.066 362.722C765.661 362.347 766.352 362.159 767.14 362.159C767.928 362.159 768.617 362.347 769.208 362.722C769.803 363.097 770.265 363.623 770.595 364.301C770.928 364.979 771.095 365.773 771.095 366.682C771.095 367.583 770.928 368.371 770.595 369.045C770.265 369.72 769.803 370.244 769.208 370.619C768.617 370.994 767.928 371.182 767.14 371.182ZM767.14 369.977C767.739 369.977 768.231 369.824 768.617 369.517C769.004 369.21 769.29 368.807 769.475 368.307C769.661 367.807 769.754 367.265 769.754 366.682C769.754 366.098 769.661 365.555 769.475 365.051C769.29 364.547 769.004 364.14 768.617 363.83C768.231 363.519 767.739 363.364 767.14 363.364C766.542 363.364 766.049 363.519 765.663 363.83C765.277 364.14 764.991 364.547 764.805 365.051C764.619 365.555 764.527 366.098 764.527 366.682C764.527 367.265 764.619 367.807 764.805 368.307C764.991 368.807 765.277 369.21 765.663 369.517C766.049 369.824 766.542 369.977 767.14 369.977ZM774.163 359.364V371H772.822V359.364H774.163ZM777.639 359.364V371H776.299V359.364H777.639ZM787.501 371.182C786.713 371.182 786.022 370.994 785.427 370.619C784.836 370.244 784.374 369.72 784.041 369.045C783.711 368.371 783.546 367.583 783.546 366.682C783.546 365.773 783.711 364.979 784.041 364.301C784.374 363.623 784.836 363.097 785.427 362.722C786.022 362.347 786.713 362.159 787.501 362.159C788.289 362.159 788.978 362.347 789.569 362.722C790.164 363.097 790.626 363.623 790.955 364.301C791.289 364.979 791.455 365.773 791.455 366.682C791.455 367.583 791.289 368.371 790.955 369.045C790.626 369.72 790.164 370.244 789.569 370.619C788.978 370.994 788.289 371.182 787.501 371.182ZM787.501 369.977C788.099 369.977 788.592 369.824 788.978 369.517C789.364 369.21 789.65 368.807 789.836 368.307C790.022 367.807 790.114 367.265 790.114 366.682C790.114 366.098 790.022 365.555 789.836 365.051C789.65 364.547 789.364 364.14 788.978 363.83C788.592 363.519 788.099 363.364 787.501 363.364C786.902 363.364 786.41 363.519 786.024 363.83C785.637 364.14 785.351 364.547 785.166 365.051C784.98 365.555 784.887 366.098 784.887 366.682C784.887 367.265 784.98 367.807 785.166 368.307C785.351 368.807 785.637 369.21 786.024 369.517C786.41 369.824 786.902 369.977 787.501 369.977ZM798.682 367.432V362.273H800.023V371H798.682V369.523H798.591C798.387 369.966 798.069 370.343 797.637 370.653C797.205 370.96 796.66 371.114 796 371.114C795.455 371.114 794.97 370.994 794.546 370.756C794.122 370.513 793.788 370.15 793.546 369.665C793.303 369.176 793.182 368.561 793.182 367.818V362.273H794.523V367.727C794.523 368.364 794.701 368.871 795.057 369.25C795.417 369.629 795.875 369.818 796.432 369.818C796.766 369.818 797.105 369.733 797.449 369.562C797.798 369.392 798.089 369.131 798.324 368.778C798.563 368.426 798.682 367.977 798.682 367.432ZM805.955 362.273V363.409H801.432V362.273H805.955ZM802.75 360.182H804.091V368.5C804.091 368.879 804.146 369.163 804.256 369.352C804.369 369.538 804.513 369.663 804.688 369.727C804.866 369.788 805.053 369.818 805.25 369.818C805.398 369.818 805.519 369.811 805.614 369.795C805.708 369.777 805.784 369.761 805.841 369.75L806.114 370.955C806.023 370.989 805.896 371.023 805.733 371.057C805.57 371.095 805.364 371.114 805.114 371.114C804.735 371.114 804.364 371.032 804 370.869C803.64 370.706 803.341 370.458 803.102 370.125C802.867 369.792 802.75 369.371 802.75 368.864V360.182ZM814.4 371.205C813.847 371.205 813.345 371.1 812.894 370.892C812.443 370.68 812.085 370.375 811.82 369.977C811.555 369.576 811.423 369.091 811.423 368.523C811.423 368.023 811.521 367.617 811.718 367.307C811.915 366.992 812.178 366.746 812.508 366.568C812.837 366.39 813.201 366.258 813.599 366.17C814 366.08 814.404 366.008 814.809 365.955C815.339 365.886 815.769 365.835 816.099 365.801C816.432 365.763 816.674 365.701 816.826 365.614C816.981 365.527 817.059 365.375 817.059 365.159V365.114C817.059 364.553 816.906 364.117 816.599 363.807C816.296 363.496 815.835 363.341 815.218 363.341C814.578 363.341 814.076 363.481 813.712 363.761C813.349 364.042 813.093 364.341 812.945 364.659L811.673 364.205C811.9 363.674 812.203 363.261 812.582 362.966C812.964 362.667 813.381 362.458 813.832 362.341C814.286 362.22 814.733 362.159 815.173 362.159C815.453 362.159 815.775 362.193 816.138 362.261C816.506 362.326 816.86 362.46 817.201 362.665C817.546 362.869 817.832 363.178 818.059 363.591C818.286 364.004 818.4 364.557 818.4 365.25V371H817.059V369.818H816.991C816.9 370.008 816.748 370.21 816.536 370.426C816.324 370.642 816.042 370.826 815.69 370.977C815.337 371.129 814.907 371.205 814.4 371.205ZM814.604 370C815.135 370 815.582 369.896 815.945 369.688C816.313 369.479 816.589 369.21 816.775 368.881C816.964 368.551 817.059 368.205 817.059 367.841V366.614C817.002 366.682 816.877 366.744 816.684 366.801C816.495 366.854 816.275 366.902 816.025 366.943C815.779 366.981 815.538 367.015 815.303 367.045C815.072 367.072 814.885 367.095 814.741 367.114C814.392 367.159 814.066 367.233 813.763 367.335C813.464 367.434 813.222 367.583 813.036 367.784C812.854 367.981 812.763 368.25 812.763 368.591C812.763 369.057 812.936 369.409 813.281 369.648C813.629 369.883 814.07 370 814.604 370ZM823.823 371.182C823.095 371.182 822.453 370.998 821.897 370.631C821.34 370.259 820.904 369.737 820.59 369.062C820.275 368.384 820.118 367.583 820.118 366.659C820.118 365.742 820.275 364.947 820.59 364.273C820.904 363.598 821.342 363.078 821.902 362.71C822.463 362.343 823.111 362.159 823.845 362.159C824.414 362.159 824.862 362.254 825.192 362.443C825.525 362.629 825.779 362.841 825.953 363.08C826.131 363.314 826.27 363.508 826.368 363.659H826.482V359.364H827.823V371H826.527V369.659H826.368C826.27 369.818 826.13 370.019 825.948 370.261C825.766 370.5 825.506 370.714 825.169 370.903C824.832 371.089 824.383 371.182 823.823 371.182ZM824.005 369.977C824.542 369.977 824.997 369.837 825.368 369.557C825.739 369.273 826.022 368.881 826.215 368.381C826.408 367.877 826.505 367.295 826.505 366.636C826.505 365.985 826.41 365.415 826.22 364.926C826.031 364.434 825.751 364.051 825.38 363.778C825.008 363.502 824.55 363.364 824.005 363.364C823.436 363.364 822.963 363.509 822.584 363.801C822.209 364.089 821.927 364.481 821.737 364.977C821.552 365.47 821.459 366.023 821.459 366.636C821.459 367.258 821.554 367.822 821.743 368.33C821.936 368.833 822.22 369.235 822.595 369.534C822.974 369.83 823.444 369.977 824.005 369.977ZM837.281 362.273L834.054 371H832.69L829.463 362.273H830.918L833.327 369.227H833.418L835.827 362.273H837.281ZM841.034 371.205C840.481 371.205 839.979 371.1 839.528 370.892C839.077 370.68 838.719 370.375 838.454 369.977C838.189 369.576 838.056 369.091 838.056 368.523C838.056 368.023 838.155 367.617 838.352 367.307C838.549 366.992 838.812 366.746 839.142 366.568C839.471 366.39 839.835 366.258 840.232 366.17C840.634 366.08 841.037 366.008 841.443 365.955C841.973 365.886 842.403 365.835 842.732 365.801C843.066 365.763 843.308 365.701 843.46 365.614C843.615 365.527 843.693 365.375 843.693 365.159V365.114C843.693 364.553 843.539 364.117 843.232 363.807C842.929 363.496 842.469 363.341 841.852 363.341C841.212 363.341 840.71 363.481 840.346 363.761C839.982 364.042 839.727 364.341 839.579 364.659L838.306 364.205C838.534 363.674 838.837 363.261 839.215 362.966C839.598 362.667 840.015 362.458 840.465 362.341C840.92 362.22 841.367 362.159 841.806 362.159C842.087 362.159 842.409 362.193 842.772 362.261C843.14 362.326 843.494 362.46 843.835 362.665C844.179 362.869 844.465 363.178 844.693 363.591C844.92 364.004 845.034 364.557 845.034 365.25V371H843.693V369.818H843.624C843.534 370.008 843.382 370.21 843.17 370.426C842.958 370.642 842.676 370.826 842.323 370.977C841.971 371.129 841.541 371.205 841.034 371.205ZM841.238 370C841.768 370 842.215 369.896 842.579 369.688C842.946 369.479 843.223 369.21 843.409 368.881C843.598 368.551 843.693 368.205 843.693 367.841V366.614C843.636 366.682 843.511 366.744 843.318 366.801C843.128 366.854 842.909 366.902 842.659 366.943C842.412 366.981 842.172 367.015 841.937 367.045C841.706 367.072 841.518 367.095 841.374 367.114C841.026 367.159 840.7 367.233 840.397 367.335C840.098 367.434 839.856 367.583 839.67 367.784C839.488 367.981 839.397 368.25 839.397 368.591C839.397 369.057 839.57 369.409 839.914 369.648C840.263 369.883 840.704 370 841.238 370ZM848.502 365.75V371H847.161V362.273H848.456V363.636H848.57C848.775 363.193 849.085 362.837 849.502 362.568C849.919 362.295 850.456 362.159 851.116 362.159C851.706 362.159 852.224 362.28 852.667 362.523C853.11 362.761 853.455 363.125 853.701 363.614C853.947 364.098 854.07 364.712 854.07 365.455V371H852.729V365.545C852.729 364.86 852.551 364.326 852.195 363.943C851.839 363.557 851.35 363.364 850.729 363.364C850.301 363.364 849.919 363.456 849.581 363.642C849.248 363.828 848.985 364.098 848.792 364.455C848.599 364.811 848.502 365.242 848.502 365.75ZM859.746 371.182C858.928 371.182 858.223 370.989 857.632 370.602C857.041 370.216 856.587 369.684 856.269 369.006C855.95 368.328 855.791 367.553 855.791 366.682C855.791 365.795 855.954 365.013 856.28 364.335C856.609 363.653 857.068 363.121 857.655 362.739C858.246 362.352 858.935 362.159 859.723 362.159C860.337 362.159 860.89 362.273 861.382 362.5C861.875 362.727 862.278 363.045 862.592 363.455C862.907 363.864 863.102 364.341 863.178 364.886H861.837C861.734 364.489 861.507 364.136 861.155 363.83C860.806 363.519 860.337 363.364 859.746 363.364C859.223 363.364 858.765 363.5 858.371 363.773C857.981 364.042 857.676 364.422 857.456 364.915C857.24 365.403 857.132 365.977 857.132 366.636C857.132 367.311 857.238 367.898 857.45 368.398C857.666 368.898 857.969 369.286 858.359 369.562C858.753 369.839 859.216 369.977 859.746 369.977C860.094 369.977 860.411 369.917 860.695 369.795C860.979 369.674 861.219 369.5 861.416 369.273C861.613 369.045 861.753 368.773 861.837 368.455H863.178C863.102 368.97 862.914 369.434 862.615 369.847C862.32 370.256 861.928 370.581 861.439 370.824C860.954 371.062 860.39 371.182 859.746 371.182ZM868.477 371.182C867.636 371.182 866.911 370.996 866.301 370.625C865.695 370.25 865.227 369.727 864.897 369.057C864.572 368.383 864.409 367.598 864.409 366.705C864.409 365.811 864.572 365.023 864.897 364.341C865.227 363.655 865.685 363.121 866.272 362.739C866.863 362.352 867.553 362.159 868.341 362.159C868.795 362.159 869.244 362.235 869.687 362.386C870.13 362.538 870.534 362.784 870.897 363.125C871.261 363.462 871.551 363.909 871.767 364.466C871.983 365.023 872.091 365.708 872.091 366.523V367.091H865.363V365.932H870.727C870.727 365.439 870.629 365 870.432 364.614C870.238 364.227 869.962 363.922 869.602 363.699C869.246 363.475 868.825 363.364 868.341 363.364C867.807 363.364 867.344 363.496 866.954 363.761C866.568 364.023 866.271 364.364 866.062 364.784C865.854 365.205 865.75 365.655 865.75 366.136V366.909C865.75 367.568 865.863 368.127 866.091 368.585C866.322 369.04 866.642 369.386 867.051 369.625C867.46 369.86 867.935 369.977 868.477 369.977C868.829 369.977 869.147 369.928 869.432 369.83C869.719 369.727 869.968 369.576 870.176 369.375C870.384 369.17 870.545 368.917 870.659 368.614L871.954 368.977C871.818 369.417 871.589 369.803 871.267 370.136C870.945 370.466 870.547 370.723 870.074 370.909C869.6 371.091 869.068 371.182 868.477 371.182ZM877.106 371.182C876.379 371.182 875.737 370.998 875.18 370.631C874.623 370.259 874.187 369.737 873.873 369.062C873.559 368.384 873.401 367.583 873.401 366.659C873.401 365.742 873.559 364.947 873.873 364.273C874.187 363.598 874.625 363.078 875.185 362.71C875.746 362.343 876.394 362.159 877.129 362.159C877.697 362.159 878.146 362.254 878.475 362.443C878.809 362.629 879.062 362.841 879.237 363.08C879.415 363.314 879.553 363.508 879.651 363.659H879.765V359.364H881.106V371H879.81V369.659H879.651C879.553 369.818 879.413 370.019 879.231 370.261C879.049 370.5 878.79 370.714 878.452 370.903C878.115 371.089 877.666 371.182 877.106 371.182ZM877.288 369.977C877.826 369.977 878.28 369.837 878.651 369.557C879.023 369.273 879.305 368.881 879.498 368.381C879.691 367.877 879.788 367.295 879.788 366.636C879.788 365.985 879.693 365.415 879.504 364.926C879.314 364.434 879.034 364.051 878.663 363.778C878.291 363.502 877.833 363.364 877.288 363.364C876.719 363.364 876.246 363.509 875.867 363.801C875.492 364.089 875.21 364.481 875.021 364.977C874.835 365.47 874.742 366.023 874.742 366.636C874.742 367.258 874.837 367.822 875.026 368.33C875.219 368.833 875.504 369.235 875.879 369.534C876.257 369.83 876.727 369.977 877.288 369.977ZM890.176 371.205C889.623 371.205 889.121 371.1 888.67 370.892C888.22 370.68 887.862 370.375 887.597 369.977C887.331 369.576 887.199 369.091 887.199 368.523C887.199 368.023 887.297 367.617 887.494 367.307C887.691 366.992 887.954 366.746 888.284 366.568C888.614 366.39 888.977 366.258 889.375 366.17C889.776 366.08 890.18 366.008 890.585 365.955C891.115 365.886 891.545 365.835 891.875 365.801C892.208 365.763 892.451 365.701 892.602 365.614C892.758 365.527 892.835 365.375 892.835 365.159V365.114C892.835 364.553 892.682 364.117 892.375 363.807C892.072 363.496 891.612 363.341 890.994 363.341C890.354 363.341 889.852 363.481 889.489 363.761C889.125 364.042 888.869 364.341 888.722 364.659L887.449 364.205C887.676 363.674 887.979 363.261 888.358 362.966C888.74 362.667 889.157 362.458 889.608 362.341C890.062 362.22 890.509 362.159 890.949 362.159C891.229 362.159 891.551 362.193 891.915 362.261C892.282 362.326 892.636 362.46 892.977 362.665C893.322 362.869 893.608 363.178 893.835 363.591C894.062 364.004 894.176 364.557 894.176 365.25V371H892.835V369.818H892.767C892.676 370.008 892.525 370.21 892.312 370.426C892.1 370.642 891.818 370.826 891.466 370.977C891.114 371.129 890.684 371.205 890.176 371.205ZM890.381 370C890.911 370 891.358 369.896 891.722 369.688C892.089 369.479 892.365 369.21 892.551 368.881C892.74 368.551 892.835 368.205 892.835 367.841V366.614C892.778 366.682 892.653 366.744 892.46 366.801C892.271 366.854 892.051 366.902 891.801 366.943C891.555 366.981 891.314 367.015 891.079 367.045C890.848 367.072 890.661 367.095 890.517 367.114C890.169 367.159 889.843 367.233 889.54 367.335C889.24 367.434 888.998 367.583 888.812 367.784C888.631 367.981 888.54 368.25 888.54 368.591C888.54 369.057 888.712 369.409 889.057 369.648C889.405 369.883 889.847 370 890.381 370ZM897.644 365.75V371H896.304V362.273H897.599V363.636H897.713C897.917 363.193 898.228 362.837 898.644 362.568C899.061 362.295 899.599 362.159 900.258 362.159C900.849 362.159 901.366 362.28 901.809 362.523C902.252 362.761 902.597 363.125 902.843 363.614C903.09 364.098 903.213 364.712 903.213 365.455V371H901.872V365.545C901.872 364.86 901.694 364.326 901.338 363.943C900.982 363.557 900.493 363.364 899.872 363.364C899.444 363.364 899.061 363.456 898.724 363.642C898.391 363.828 898.127 364.098 897.934 364.455C897.741 364.811 897.644 365.242 897.644 365.75ZM907.911 371.205C907.358 371.205 906.856 371.1 906.405 370.892C905.955 370.68 905.597 370.375 905.332 369.977C905.066 369.576 904.934 369.091 904.934 368.523C904.934 368.023 905.032 367.617 905.229 367.307C905.426 366.992 905.689 366.746 906.019 366.568C906.349 366.39 906.712 366.258 907.11 366.17C907.511 366.08 907.915 366.008 908.32 365.955C908.85 365.886 909.28 365.835 909.61 365.801C909.943 365.763 910.186 365.701 910.337 365.614C910.493 365.527 910.57 365.375 910.57 365.159V365.114C910.57 364.553 910.417 364.117 910.11 363.807C909.807 363.496 909.347 363.341 908.729 363.341C908.089 363.341 907.587 363.481 907.224 363.761C906.86 364.042 906.604 364.341 906.457 364.659L905.184 364.205C905.411 363.674 905.714 363.261 906.093 362.966C906.475 362.667 906.892 362.458 907.343 362.341C907.797 362.22 908.244 362.159 908.684 362.159C908.964 362.159 909.286 362.193 909.65 362.261C910.017 362.326 910.371 362.46 910.712 362.665C911.057 362.869 911.343 363.178 911.57 363.591C911.797 364.004 911.911 364.557 911.911 365.25V371H910.57V369.818H910.502C910.411 370.008 910.26 370.21 910.047 370.426C909.835 370.642 909.553 370.826 909.201 370.977C908.849 371.129 908.419 371.205 907.911 371.205ZM908.116 370C908.646 370 909.093 369.896 909.457 369.688C909.824 369.479 910.1 369.21 910.286 368.881C910.475 368.551 910.57 368.205 910.57 367.841V366.614C910.513 366.682 910.388 366.744 910.195 366.801C910.006 366.854 909.786 366.902 909.536 366.943C909.29 366.981 909.049 367.015 908.814 367.045C908.583 367.072 908.396 367.095 908.252 367.114C907.904 367.159 907.578 367.233 907.275 367.335C906.975 367.434 906.733 367.583 906.547 367.784C906.366 367.981 906.275 368.25 906.275 368.591C906.275 369.057 906.447 369.409 906.792 369.648C907.14 369.883 907.582 370 908.116 370ZM915.379 359.364V371H914.039V359.364H915.379ZM918.379 374.273C918.152 374.273 917.949 374.254 917.771 374.216C917.593 374.182 917.47 374.148 917.402 374.114L917.743 372.932C918.068 373.015 918.356 373.045 918.606 373.023C918.856 373 919.078 372.888 919.271 372.688C919.468 372.491 919.648 372.17 919.811 371.727L920.061 371.045L916.834 362.273H918.288L920.697 369.227H920.788L923.197 362.273H924.652L920.947 372.273C920.781 372.723 920.574 373.097 920.328 373.392C920.082 373.691 919.796 373.913 919.47 374.057C919.148 374.201 918.784 374.273 918.379 374.273ZM929.897 362.273V363.409H925.374V362.273H929.897ZM926.693 360.182H928.033V368.5C928.033 368.879 928.088 369.163 928.198 369.352C928.312 369.538 928.456 369.663 928.63 369.727C928.808 369.788 928.996 369.818 929.193 369.818C929.34 369.818 929.461 369.811 929.556 369.795C929.651 369.777 929.727 369.761 929.783 369.75L930.056 370.955C929.965 370.989 929.838 371.023 929.676 371.057C929.513 371.095 929.306 371.114 929.056 371.114C928.677 371.114 928.306 371.032 927.943 370.869C927.583 370.706 927.283 370.458 927.045 370.125C926.81 369.792 926.693 369.371 926.693 368.864V360.182ZM931.594 371V362.273H932.935V371H931.594ZM932.276 360.818C932.015 360.818 931.789 360.729 931.6 360.551C931.414 360.373 931.321 360.159 931.321 359.909C931.321 359.659 931.414 359.445 931.6 359.267C931.789 359.089 932.015 359 932.276 359C932.537 359 932.761 359.089 932.946 359.267C933.136 359.445 933.231 359.659 933.231 359.909C933.231 360.159 933.136 360.373 932.946 360.551C932.761 360.729 932.537 360.818 932.276 360.818ZM938.616 371.182C937.798 371.182 937.094 370.989 936.503 370.602C935.912 370.216 935.457 369.684 935.139 369.006C934.821 368.328 934.662 367.553 934.662 366.682C934.662 365.795 934.825 365.013 935.151 364.335C935.48 363.653 935.938 363.121 936.526 362.739C937.116 362.352 937.806 362.159 938.594 362.159C939.207 362.159 939.76 362.273 940.253 362.5C940.745 362.727 941.149 363.045 941.463 363.455C941.777 363.864 941.973 364.341 942.048 364.886H940.707C940.605 364.489 940.378 364.136 940.026 363.83C939.677 363.519 939.207 363.364 938.616 363.364C938.094 363.364 937.635 363.5 937.241 363.773C936.851 364.042 936.546 364.422 936.327 364.915C936.111 365.403 936.003 365.977 936.003 366.636C936.003 367.311 936.109 367.898 936.321 368.398C936.537 368.898 936.84 369.286 937.23 369.562C937.624 369.839 938.086 369.977 938.616 369.977C938.965 369.977 939.281 369.917 939.565 369.795C939.849 369.674 940.09 369.5 940.287 369.273C940.484 369.045 940.624 368.773 940.707 368.455H942.048C941.973 368.97 941.785 369.434 941.486 369.847C941.19 370.256 940.798 370.581 940.31 370.824C939.825 371.062 939.26 371.182 938.616 371.182ZM949.87 364.227L948.666 364.568C948.59 364.367 948.478 364.172 948.331 363.983C948.187 363.79 947.99 363.631 947.74 363.506C947.49 363.381 947.17 363.318 946.779 363.318C946.245 363.318 945.8 363.441 945.444 363.688C945.092 363.93 944.916 364.239 944.916 364.614C944.916 364.947 945.037 365.21 945.279 365.403C945.522 365.597 945.901 365.758 946.416 365.886L947.711 366.205C948.492 366.394 949.073 366.684 949.456 367.074C949.838 367.46 950.029 367.958 950.029 368.568C950.029 369.068 949.885 369.515 949.598 369.909C949.314 370.303 948.916 370.614 948.404 370.841C947.893 371.068 947.298 371.182 946.62 371.182C945.73 371.182 944.993 370.989 944.41 370.602C943.827 370.216 943.457 369.652 943.302 368.909L944.575 368.591C944.696 369.061 944.925 369.413 945.262 369.648C945.603 369.883 946.048 370 946.598 370C947.223 370 947.719 369.867 948.086 369.602C948.457 369.333 948.643 369.011 948.643 368.636C948.643 368.333 948.537 368.08 948.325 367.875C948.113 367.667 947.787 367.511 947.348 367.409L945.893 367.068C945.094 366.879 944.507 366.585 944.132 366.188C943.76 365.786 943.575 365.284 943.575 364.682C943.575 364.189 943.713 363.754 943.99 363.375C944.27 362.996 944.651 362.699 945.132 362.483C945.617 362.267 946.166 362.159 946.779 362.159C947.643 362.159 948.321 362.348 948.814 362.727C949.31 363.106 949.662 363.606 949.87 364.227ZM958.476 371.205C957.923 371.205 957.421 371.1 956.97 370.892C956.52 370.68 956.162 370.375 955.897 369.977C955.631 369.576 955.499 369.091 955.499 368.523C955.499 368.023 955.597 367.617 955.794 367.307C955.991 366.992 956.254 366.746 956.584 366.568C956.914 366.39 957.277 366.258 957.675 366.17C958.076 366.08 958.48 366.008 958.885 365.955C959.415 365.886 959.845 365.835 960.175 365.801C960.508 365.763 960.751 365.701 960.902 365.614C961.058 365.527 961.135 365.375 961.135 365.159V365.114C961.135 364.553 960.982 364.117 960.675 363.807C960.372 363.496 959.912 363.341 959.294 363.341C958.654 363.341 958.152 363.481 957.789 363.761C957.425 364.042 957.169 364.341 957.022 364.659L955.749 364.205C955.976 363.674 956.279 363.261 956.658 362.966C957.04 362.667 957.457 362.458 957.908 362.341C958.362 362.22 958.809 362.159 959.249 362.159C959.529 362.159 959.851 362.193 960.215 362.261C960.582 362.326 960.936 362.46 961.277 362.665C961.622 362.869 961.908 363.178 962.135 363.591C962.362 364.004 962.476 364.557 962.476 365.25V371H961.135V369.818H961.067C960.976 370.008 960.825 370.21 960.612 370.426C960.4 370.642 960.118 370.826 959.766 370.977C959.414 371.129 958.984 371.205 958.476 371.205ZM958.681 370C959.211 370 959.658 369.896 960.022 369.688C960.389 369.479 960.665 369.21 960.851 368.881C961.04 368.551 961.135 368.205 961.135 367.841V366.614C961.078 366.682 960.953 366.744 960.76 366.801C960.571 366.854 960.351 366.902 960.101 366.943C959.855 366.981 959.614 367.015 959.379 367.045C959.148 367.072 958.961 367.095 958.817 367.114C958.468 367.159 958.143 367.233 957.84 367.335C957.54 367.434 957.298 367.583 957.112 367.784C956.931 367.981 956.84 368.25 956.84 368.591C956.84 369.057 957.012 369.409 957.357 369.648C957.705 369.883 958.147 370 958.681 370ZM965.944 365.75V371H964.604V362.273H965.899V363.636H966.013C966.217 363.193 966.528 362.837 966.944 362.568C967.361 362.295 967.899 362.159 968.558 362.159C969.149 362.159 969.666 362.28 970.109 362.523C970.552 362.761 970.897 363.125 971.143 363.614C971.39 364.098 971.513 364.712 971.513 365.455V371H970.172V365.545C970.172 364.86 969.994 364.326 969.638 363.943C969.282 363.557 968.793 363.364 968.172 363.364C967.744 363.364 967.361 363.456 967.024 363.642C966.691 363.828 966.427 364.098 966.234 364.455C966.041 364.811 965.944 365.242 965.944 365.75ZM976.938 371.182C976.211 371.182 975.569 370.998 975.012 370.631C974.455 370.259 974.02 369.737 973.705 369.062C973.391 368.384 973.234 367.583 973.234 366.659C973.234 365.742 973.391 364.947 973.705 364.273C974.02 363.598 974.457 363.078 975.018 362.71C975.578 362.343 976.226 362.159 976.961 362.159C977.529 362.159 977.978 362.254 978.308 362.443C978.641 362.629 978.895 362.841 979.069 363.08C979.247 363.314 979.385 363.508 979.484 363.659H979.597V359.364H980.938V371H979.643V369.659H979.484C979.385 369.818 979.245 370.019 979.063 370.261C978.882 370.5 978.622 370.714 978.285 370.903C977.948 371.089 977.499 371.182 976.938 371.182ZM977.12 369.977C977.658 369.977 978.113 369.837 978.484 369.557C978.855 369.273 979.137 368.881 979.33 368.381C979.524 367.877 979.62 367.295 979.62 366.636C979.62 365.985 979.525 365.415 979.336 364.926C979.147 364.434 978.866 364.051 978.495 363.778C978.124 363.502 977.666 363.364 977.12 363.364C976.552 363.364 976.078 363.509 975.7 363.801C975.325 364.089 975.043 364.481 974.853 364.977C974.668 365.47 974.575 366.023 974.575 366.636C974.575 367.258 974.669 367.822 974.859 368.33C975.052 368.833 975.336 369.235 975.711 369.534C976.09 369.83 976.56 369.977 977.12 369.977ZM758.227 401V392.273H759.523V393.591H759.614C759.773 393.159 760.061 392.809 760.477 392.54C760.894 392.271 761.364 392.136 761.886 392.136C761.985 392.136 762.108 392.138 762.256 392.142C762.403 392.146 762.515 392.152 762.591 392.159V393.523C762.545 393.511 762.441 393.494 762.278 393.472C762.119 393.445 761.951 393.432 761.773 393.432C761.348 393.432 760.97 393.521 760.636 393.699C760.307 393.873 760.045 394.116 759.852 394.426C759.663 394.733 759.568 395.083 759.568 395.477V401H758.227ZM767.254 401.182C766.413 401.182 765.688 400.996 765.078 400.625C764.472 400.25 764.004 399.727 763.674 399.057C763.349 398.383 763.186 397.598 763.186 396.705C763.186 395.811 763.349 395.023 763.674 394.341C764.004 393.655 764.462 393.121 765.049 392.739C765.64 392.352 766.33 392.159 767.117 392.159C767.572 392.159 768.021 392.235 768.464 392.386C768.907 392.538 769.311 392.784 769.674 393.125C770.038 393.462 770.328 393.909 770.544 394.466C770.76 395.023 770.867 395.708 770.867 396.523V397.091H764.14V395.932H769.504C769.504 395.439 769.405 395 769.208 394.614C769.015 394.227 768.739 393.922 768.379 393.699C768.023 393.475 767.602 393.364 767.117 393.364C766.583 393.364 766.121 393.496 765.731 393.761C765.345 394.023 765.047 394.364 764.839 394.784C764.631 395.205 764.527 395.655 764.527 396.136V396.909C764.527 397.568 764.64 398.127 764.867 398.585C765.099 399.04 765.419 399.386 765.828 399.625C766.237 399.86 766.712 399.977 767.254 399.977C767.606 399.977 767.924 399.928 768.208 399.83C768.496 399.727 768.744 399.576 768.953 399.375C769.161 399.17 769.322 398.917 769.436 398.614L770.731 398.977C770.595 399.417 770.366 399.803 770.044 400.136C769.722 400.466 769.324 400.723 768.85 400.909C768.377 401.091 767.845 401.182 767.254 401.182ZM772.587 404.273V392.273H773.883V393.659H774.042C774.14 393.508 774.277 393.314 774.451 393.08C774.629 392.841 774.883 392.629 775.212 392.443C775.546 392.254 775.996 392.159 776.565 392.159C777.299 392.159 777.947 392.343 778.508 392.71C779.068 393.078 779.506 393.598 779.82 394.273C780.135 394.947 780.292 395.742 780.292 396.659C780.292 397.583 780.135 398.384 779.82 399.062C779.506 399.737 779.07 400.259 778.513 400.631C777.957 400.998 777.315 401.182 776.587 401.182C776.027 401.182 775.578 401.089 775.241 400.903C774.904 400.714 774.644 400.5 774.462 400.261C774.28 400.019 774.14 399.818 774.042 399.659H773.928V404.273H772.587ZM773.905 396.636C773.905 397.295 774.002 397.877 774.195 398.381C774.388 398.881 774.671 399.273 775.042 399.557C775.413 399.837 775.868 399.977 776.405 399.977C776.966 399.977 777.434 399.83 777.809 399.534C778.188 399.235 778.472 398.833 778.661 398.33C778.854 397.822 778.951 397.258 778.951 396.636C778.951 396.023 778.856 395.47 778.667 394.977C778.481 394.481 778.199 394.089 777.82 393.801C777.445 393.509 776.974 393.364 776.405 393.364C775.86 393.364 775.402 393.502 775.03 393.778C774.659 394.051 774.379 394.434 774.19 394.926C774 395.415 773.905 395.985 773.905 396.636ZM785.563 401.182C784.775 401.182 784.084 400.994 783.489 400.619C782.898 400.244 782.436 399.72 782.103 399.045C781.773 398.371 781.608 397.583 781.608 396.682C781.608 395.773 781.773 394.979 782.103 394.301C782.436 393.623 782.898 393.097 783.489 392.722C784.084 392.347 784.775 392.159 785.563 392.159C786.351 392.159 787.04 392.347 787.631 392.722C788.226 393.097 788.688 393.623 789.017 394.301C789.351 394.979 789.517 395.773 789.517 396.682C789.517 397.583 789.351 398.371 789.017 399.045C788.688 399.72 788.226 400.244 787.631 400.619C787.04 400.994 786.351 401.182 785.563 401.182ZM785.563 399.977C786.161 399.977 786.654 399.824 787.04 399.517C787.426 399.21 787.712 398.807 787.898 398.307C788.084 397.807 788.176 397.265 788.176 396.682C788.176 396.098 788.084 395.555 787.898 395.051C787.712 394.547 787.426 394.14 787.04 393.83C786.654 393.519 786.161 393.364 785.563 393.364C784.964 393.364 784.472 393.519 784.085 393.83C783.699 394.14 783.413 394.547 783.228 395.051C783.042 395.555 782.949 396.098 782.949 396.682C782.949 397.265 783.042 397.807 783.228 398.307C783.413 398.807 783.699 399.21 784.085 399.517C784.472 399.824 784.964 399.977 785.563 399.977ZM791.244 401V392.273H792.54V393.591H792.631C792.79 393.159 793.077 392.809 793.494 392.54C793.911 392.271 794.381 392.136 794.903 392.136C795.002 392.136 795.125 392.138 795.273 392.142C795.42 392.146 795.532 392.152 795.608 392.159V393.523C795.562 393.511 795.458 393.494 795.295 393.472C795.136 393.445 794.968 393.432 794.79 393.432C794.365 393.432 793.987 393.521 793.653 393.699C793.324 393.873 793.062 394.116 792.869 394.426C792.68 394.733 792.585 395.083 792.585 395.477V401H791.244ZM801.22 392.273V393.409H796.697V392.273H801.22ZM798.015 390.182H799.356V398.5C799.356 398.879 799.411 399.163 799.521 399.352C799.634 399.538 799.778 399.663 799.953 399.727C800.131 399.788 800.318 399.818 800.515 399.818C800.663 399.818 800.784 399.811 800.879 399.795C800.973 399.777 801.049 399.761 801.106 399.75L801.379 400.955C801.288 400.989 801.161 401.023 800.998 401.057C800.835 401.095 800.629 401.114 800.379 401.114C800 401.114 799.629 401.032 799.265 400.869C798.905 400.706 798.606 400.458 798.367 400.125C798.132 399.792 798.015 399.371 798.015 398.864V390.182ZM802.917 401V392.273H804.258V401H802.917ZM803.598 390.818C803.337 390.818 803.112 390.729 802.922 390.551C802.737 390.373 802.644 390.159 802.644 389.909C802.644 389.659 802.737 389.445 802.922 389.267C803.112 389.089 803.337 389 803.598 389C803.86 389 804.083 389.089 804.269 389.267C804.458 389.445 804.553 389.659 804.553 389.909C804.553 390.159 804.458 390.373 804.269 390.551C804.083 390.729 803.86 390.818 803.598 390.818ZM807.734 395.75V401H806.394V392.273H807.689V393.636H807.803C808.007 393.193 808.318 392.837 808.734 392.568C809.151 392.295 809.689 392.159 810.348 392.159C810.939 392.159 811.456 392.28 811.899 392.523C812.342 392.761 812.687 393.125 812.933 393.614C813.18 394.098 813.303 394.712 813.303 395.455V401H811.962V395.545C811.962 394.86 811.784 394.326 811.428 393.943C811.072 393.557 810.583 393.364 809.962 393.364C809.534 393.364 809.151 393.456 808.814 393.642C808.481 393.828 808.217 394.098 808.024 394.455C807.831 394.811 807.734 395.242 807.734 395.75ZM818.956 404.455C818.308 404.455 817.751 404.371 817.285 404.205C816.819 404.042 816.431 403.826 816.12 403.557C815.814 403.292 815.569 403.008 815.387 402.705L816.456 401.955C816.577 402.114 816.73 402.295 816.916 402.5C817.101 402.708 817.355 402.888 817.677 403.04C818.003 403.195 818.429 403.273 818.956 403.273C819.66 403.273 820.242 403.102 820.7 402.761C821.158 402.42 821.387 401.886 821.387 401.159V399.386H821.274C821.175 399.545 821.035 399.742 820.853 399.977C820.675 400.208 820.418 400.415 820.081 400.597C819.747 400.775 819.297 400.864 818.728 400.864C818.024 400.864 817.391 400.697 816.831 400.364C816.274 400.03 815.833 399.545 815.507 398.909C815.185 398.273 815.024 397.5 815.024 396.591C815.024 395.697 815.181 394.919 815.495 394.256C815.81 393.589 816.247 393.074 816.808 392.71C817.369 392.343 818.016 392.159 818.751 392.159C819.319 392.159 819.77 392.254 820.103 392.443C820.44 392.629 820.698 392.841 820.876 393.08C821.058 393.314 821.198 393.508 821.297 393.659H821.433V392.273H822.728V401.25C822.728 402 822.558 402.61 822.217 403.08C821.88 403.553 821.425 403.9 820.853 404.119C820.285 404.343 819.653 404.455 818.956 404.455ZM818.91 399.659C819.448 399.659 819.903 399.536 820.274 399.29C820.645 399.044 820.927 398.689 821.12 398.227C821.314 397.765 821.41 397.212 821.41 396.568C821.41 395.939 821.315 395.384 821.126 394.903C820.937 394.422 820.656 394.045 820.285 393.773C819.914 393.5 819.456 393.364 818.91 393.364C818.342 393.364 817.869 393.508 817.49 393.795C817.115 394.083 816.833 394.47 816.643 394.955C816.458 395.439 816.365 395.977 816.365 396.568C816.365 397.174 816.459 397.71 816.649 398.176C816.842 398.638 817.126 399.002 817.501 399.267C817.88 399.528 818.35 399.659 818.91 399.659ZM832.929 392.273V393.409H828.225V392.273H832.929ZM829.634 401V391.068C829.634 390.568 829.751 390.152 829.986 389.818C830.221 389.485 830.526 389.235 830.901 389.068C831.276 388.902 831.672 388.818 832.088 388.818C832.418 388.818 832.687 388.845 832.895 388.898C833.104 388.951 833.259 389 833.361 389.045L832.975 390.205C832.907 390.182 832.812 390.153 832.691 390.119C832.573 390.085 832.418 390.068 832.225 390.068C831.782 390.068 831.461 390.18 831.264 390.403C831.071 390.627 830.975 390.955 830.975 391.386V401H829.634ZM837.788 401.182C836.947 401.182 836.222 400.996 835.612 400.625C835.006 400.25 834.538 399.727 834.209 399.057C833.883 398.383 833.72 397.598 833.72 396.705C833.72 395.811 833.883 395.023 834.209 394.341C834.538 393.655 834.997 393.121 835.584 392.739C836.175 392.352 836.864 392.159 837.652 392.159C838.106 392.159 838.555 392.235 838.998 392.386C839.442 392.538 839.845 392.784 840.209 393.125C840.572 393.462 840.862 393.909 841.078 394.466C841.294 395.023 841.402 395.708 841.402 396.523V397.091H834.675V395.932H840.038C840.038 395.439 839.94 395 839.743 394.614C839.55 394.227 839.273 393.922 838.913 393.699C838.557 393.475 838.137 393.364 837.652 393.364C837.118 393.364 836.656 393.496 836.266 393.761C835.879 394.023 835.582 394.364 835.373 394.784C835.165 395.205 835.061 395.655 835.061 396.136V396.909C835.061 397.568 835.175 398.127 835.402 398.585C835.633 399.04 835.953 399.386 836.362 399.625C836.771 399.86 837.247 399.977 837.788 399.977C838.141 399.977 838.459 399.928 838.743 399.83C839.031 399.727 839.279 399.576 839.487 399.375C839.695 399.17 839.856 398.917 839.97 398.614L841.266 398.977C841.129 399.417 840.9 399.803 840.578 400.136C840.256 400.466 839.858 400.723 839.385 400.909C838.911 401.091 838.379 401.182 837.788 401.182ZM845.69 401.205C845.137 401.205 844.635 401.1 844.184 400.892C843.733 400.68 843.375 400.375 843.11 399.977C842.845 399.576 842.713 399.091 842.713 398.523C842.713 398.023 842.811 397.617 843.008 397.307C843.205 396.992 843.468 396.746 843.798 396.568C844.127 396.39 844.491 396.258 844.889 396.17C845.29 396.08 845.694 396.008 846.099 395.955C846.629 395.886 847.059 395.835 847.389 395.801C847.722 395.763 847.964 395.701 848.116 395.614C848.271 395.527 848.349 395.375 848.349 395.159V395.114C848.349 394.553 848.196 394.117 847.889 393.807C847.586 393.496 847.125 393.341 846.508 393.341C845.868 393.341 845.366 393.481 845.002 393.761C844.639 394.042 844.383 394.341 844.235 394.659L842.963 394.205C843.19 393.674 843.493 393.261 843.872 392.966C844.254 392.667 844.671 392.458 845.122 392.341C845.576 392.22 846.023 392.159 846.463 392.159C846.743 392.159 847.065 392.193 847.428 392.261C847.796 392.326 848.15 392.46 848.491 392.665C848.836 392.869 849.122 393.178 849.349 393.591C849.576 394.004 849.69 394.557 849.69 395.25V401H848.349V399.818H848.281C848.19 400.008 848.038 400.21 847.826 400.426C847.614 400.642 847.332 400.826 846.98 400.977C846.627 401.129 846.197 401.205 845.69 401.205ZM845.894 400C846.425 400 846.872 399.896 847.235 399.688C847.603 399.479 847.879 399.21 848.065 398.881C848.254 398.551 848.349 398.205 848.349 397.841V396.614C848.292 396.682 848.167 396.744 847.974 396.801C847.785 396.854 847.565 396.902 847.315 396.943C847.069 396.981 846.828 397.015 846.593 397.045C846.362 397.072 846.175 397.095 846.031 397.114C845.682 397.159 845.356 397.233 845.053 397.335C844.754 397.434 844.512 397.583 844.326 397.784C844.144 397.981 844.053 398.25 844.053 398.591C844.053 399.057 844.226 399.409 844.571 399.648C844.919 399.883 845.36 400 845.894 400ZM855.613 392.273V393.409H851.09V392.273H855.613ZM852.408 390.182H853.749V398.5C853.749 398.879 853.804 399.163 853.914 399.352C854.027 399.538 854.171 399.663 854.346 399.727C854.524 399.788 854.711 399.818 854.908 399.818C855.056 399.818 855.177 399.811 855.272 399.795C855.367 399.777 855.442 399.761 855.499 399.75L855.772 400.955C855.681 400.989 855.554 401.023 855.391 401.057C855.228 401.095 855.022 401.114 854.772 401.114C854.393 401.114 854.022 401.032 853.658 400.869C853.298 400.706 852.999 400.458 852.76 400.125C852.526 399.792 852.408 399.371 852.408 398.864V390.182ZM862.81 397.432V392.273H864.151V401H862.81V399.523H862.719C862.514 399.966 862.196 400.343 861.764 400.653C861.332 400.96 860.787 401.114 860.128 401.114C859.582 401.114 859.098 400.994 858.673 400.756C858.249 400.513 857.916 400.15 857.673 399.665C857.431 399.176 857.31 398.561 857.31 397.818V392.273H858.651V397.727C858.651 398.364 858.829 398.871 859.185 399.25C859.545 399.629 860.003 399.818 860.56 399.818C860.893 399.818 861.232 399.733 861.577 399.562C861.925 399.392 862.217 399.131 862.452 398.778C862.69 398.426 862.81 397.977 862.81 397.432ZM866.287 401V392.273H867.582V393.591H867.673C867.832 393.159 868.12 392.809 868.537 392.54C868.953 392.271 869.423 392.136 869.946 392.136C870.044 392.136 870.167 392.138 870.315 392.142C870.463 392.146 870.575 392.152 870.65 392.159V393.523C870.605 393.511 870.501 393.494 870.338 393.472C870.179 393.445 870.01 393.432 869.832 393.432C869.408 393.432 869.029 393.521 868.696 393.699C868.366 393.873 868.105 394.116 867.912 394.426C867.722 394.733 867.628 395.083 867.628 395.477V401H866.287ZM875.313 401.182C874.472 401.182 873.747 400.996 873.137 400.625C872.531 400.25 872.063 399.727 871.734 399.057C871.408 398.383 871.245 397.598 871.245 396.705C871.245 395.811 871.408 395.023 871.734 394.341C872.063 393.655 872.522 393.121 873.109 392.739C873.7 392.352 874.389 392.159 875.177 392.159C875.631 392.159 876.08 392.235 876.523 392.386C876.967 392.538 877.37 392.784 877.734 393.125C878.097 393.462 878.387 393.909 878.603 394.466C878.819 395.023 878.927 395.708 878.927 396.523V397.091H872.2V395.932H877.563C877.563 395.439 877.465 395 877.268 394.614C877.075 394.227 876.798 393.922 876.438 393.699C876.082 393.475 875.662 393.364 875.177 393.364C874.643 393.364 874.181 393.496 873.791 393.761C873.404 394.023 873.107 394.364 872.898 394.784C872.69 395.205 872.586 395.655 872.586 396.136V396.909C872.586 397.568 872.7 398.127 872.927 398.585C873.158 399.04 873.478 399.386 873.887 399.625C874.296 399.86 874.772 399.977 875.313 399.977C875.666 399.977 875.984 399.928 876.268 399.83C876.556 399.727 876.804 399.576 877.012 399.375C877.22 399.17 877.381 398.917 877.495 398.614L878.791 398.977C878.654 399.417 878.425 399.803 878.103 400.136C877.781 400.466 877.383 400.723 876.91 400.909C876.436 401.091 875.904 401.182 875.313 401.182ZM886.828 394.227L885.624 394.568C885.548 394.367 885.436 394.172 885.289 393.983C885.145 393.79 884.948 393.631 884.698 393.506C884.448 393.381 884.128 393.318 883.738 393.318C883.203 393.318 882.758 393.441 882.402 393.688C882.05 393.93 881.874 394.239 881.874 394.614C881.874 394.947 881.995 395.21 882.238 395.403C882.48 395.597 882.859 395.758 883.374 395.886L884.669 396.205C885.45 396.394 886.031 396.684 886.414 397.074C886.796 397.46 886.988 397.958 886.988 398.568C886.988 399.068 886.844 399.515 886.556 399.909C886.272 400.303 885.874 400.614 885.363 400.841C884.851 401.068 884.256 401.182 883.578 401.182C882.688 401.182 881.952 400.989 881.368 400.602C880.785 400.216 880.416 399.652 880.26 398.909L881.533 398.591C881.654 399.061 881.883 399.413 882.221 399.648C882.561 399.883 883.006 400 883.556 400C884.181 400 884.677 399.867 885.044 399.602C885.416 399.333 885.601 399.011 885.601 398.636C885.601 398.333 885.495 398.08 885.283 397.875C885.071 397.667 884.745 397.511 884.306 397.409L882.851 397.068C882.052 396.879 881.465 396.585 881.09 396.188C880.719 395.786 880.533 395.284 880.533 394.682C880.533 394.189 880.671 393.754 880.948 393.375C881.228 392.996 881.609 392.699 882.09 392.483C882.575 392.267 883.124 392.159 883.738 392.159C884.601 392.159 885.279 392.348 885.772 392.727C886.268 393.106 886.62 393.606 886.828 394.227ZM890.686 399.409L890.595 400.023C890.531 400.455 890.432 400.917 890.3 401.409C890.171 401.902 890.036 402.366 889.896 402.801C889.756 403.237 889.641 403.583 889.55 403.841H888.527C888.576 403.598 888.641 403.278 888.72 402.881C888.8 402.483 888.879 402.038 888.959 401.545C889.042 401.057 889.11 400.557 889.163 400.045L889.231 399.409H890.686ZM899.599 401.205C899.046 401.205 898.544 401.1 898.093 400.892C897.642 400.68 897.284 400.375 897.019 399.977C896.754 399.576 896.621 399.091 896.621 398.523C896.621 398.023 896.72 397.617 896.917 397.307C897.114 396.992 897.377 396.746 897.707 396.568C898.036 396.39 898.4 396.258 898.797 396.17C899.199 396.08 899.602 396.008 900.008 395.955C900.538 395.886 900.968 395.835 901.297 395.801C901.631 395.763 901.873 395.701 902.025 395.614C902.18 395.527 902.258 395.375 902.258 395.159V395.114C902.258 394.553 902.104 394.117 901.797 393.807C901.494 393.496 901.034 393.341 900.417 393.341C899.777 393.341 899.275 393.481 898.911 393.761C898.547 394.042 898.292 394.341 898.144 394.659L896.871 394.205C897.099 393.674 897.402 393.261 897.78 392.966C898.163 392.667 898.58 392.458 899.03 392.341C899.485 392.22 899.932 392.159 900.371 392.159C900.652 392.159 900.974 392.193 901.337 392.261C901.705 392.326 902.059 392.46 902.4 392.665C902.744 392.869 903.03 393.178 903.258 393.591C903.485 394.004 903.599 394.557 903.599 395.25V401H902.258V399.818H902.189C902.099 400.008 901.947 400.21 901.735 400.426C901.523 400.642 901.241 400.826 900.888 400.977C900.536 401.129 900.106 401.205 899.599 401.205ZM899.803 400C900.333 400 900.78 399.896 901.144 399.688C901.511 399.479 901.788 399.21 901.974 398.881C902.163 398.551 902.258 398.205 902.258 397.841V396.614C902.201 396.682 902.076 396.744 901.883 396.801C901.693 396.854 901.474 396.902 901.224 396.943C900.977 396.981 900.737 397.015 900.502 397.045C900.271 397.072 900.083 397.095 899.939 397.114C899.591 397.159 899.265 397.233 898.962 397.335C898.663 397.434 898.421 397.583 898.235 397.784C898.053 397.981 897.962 398.25 897.962 398.591C897.962 399.057 898.135 399.409 898.479 399.648C898.828 399.883 899.269 400 899.803 400ZM907.067 395.75V401H905.726V392.273H907.021V393.636H907.135C907.34 393.193 907.65 392.837 908.067 392.568C908.484 392.295 909.021 392.159 909.681 392.159C910.271 392.159 910.789 392.28 911.232 392.523C911.675 392.761 912.02 393.125 912.266 393.614C912.512 394.098 912.635 394.712 912.635 395.455V401H911.294V395.545C911.294 394.86 911.116 394.326 910.76 393.943C910.404 393.557 909.915 393.364 909.294 393.364C908.866 393.364 908.484 393.456 908.146 393.642C907.813 393.828 907.55 394.098 907.357 394.455C907.164 394.811 907.067 395.242 907.067 395.75ZM918.061 401.182C917.334 401.182 916.692 400.998 916.135 400.631C915.578 400.259 915.142 399.737 914.828 399.062C914.514 398.384 914.356 397.583 914.356 396.659C914.356 395.742 914.514 394.947 914.828 394.273C915.142 393.598 915.58 393.078 916.14 392.71C916.701 392.343 917.349 392.159 918.084 392.159C918.652 392.159 919.101 392.254 919.43 392.443C919.764 392.629 920.017 392.841 920.192 393.08C920.37 393.314 920.508 393.508 920.606 393.659H920.72V389.364H922.061V401H920.765V399.659H920.606C920.508 399.818 920.368 400.019 920.186 400.261C920.004 400.5 919.745 400.714 919.407 400.903C919.07 401.089 918.621 401.182 918.061 401.182ZM918.243 399.977C918.781 399.977 919.235 399.837 919.606 399.557C919.978 399.273 920.26 398.881 920.453 398.381C920.646 397.877 920.743 397.295 920.743 396.636C920.743 395.985 920.648 395.415 920.459 394.926C920.269 394.434 919.989 394.051 919.618 393.778C919.246 393.502 918.788 393.364 918.243 393.364C917.674 393.364 917.201 393.509 916.822 393.801C916.447 394.089 916.165 394.481 915.976 394.977C915.79 395.47 915.697 396.023 915.697 396.636C915.697 397.258 915.792 397.822 915.981 398.33C916.174 398.833 916.459 399.235 916.834 399.534C917.212 399.83 917.682 399.977 918.243 399.977ZM928.563 401V392.273H929.904V401H928.563ZM929.245 390.818C928.983 390.818 928.758 390.729 928.569 390.551C928.383 390.373 928.29 390.159 928.29 389.909C928.29 389.659 928.383 389.445 928.569 389.267C928.758 389.089 928.983 389 929.245 389C929.506 389 929.73 389.089 929.915 389.267C930.105 389.445 930.199 389.659 930.199 389.909C930.199 390.159 930.105 390.373 929.915 390.551C929.73 390.729 929.506 390.818 929.245 390.818ZM933.381 395.75V401H932.04V392.273H933.335V393.636H933.449C933.653 393.193 933.964 392.837 934.381 392.568C934.797 392.295 935.335 392.159 935.994 392.159C936.585 392.159 937.102 392.28 937.545 392.523C937.989 392.761 938.333 393.125 938.58 393.614C938.826 394.098 938.949 394.712 938.949 395.455V401H937.608V395.545C937.608 394.86 937.43 394.326 937.074 393.943C936.718 393.557 936.229 393.364 935.608 393.364C935.18 393.364 934.797 393.456 934.46 393.642C934.127 393.828 933.864 394.098 933.67 394.455C933.477 394.811 933.381 395.242 933.381 395.75ZM944.875 392.273V393.409H940.352V392.273H944.875ZM941.67 390.182H943.011V398.5C943.011 398.879 943.066 399.163 943.176 399.352C943.289 399.538 943.433 399.663 943.608 399.727C943.786 399.788 943.973 399.818 944.17 399.818C944.318 399.818 944.439 399.811 944.534 399.795C944.628 399.777 944.704 399.761 944.761 399.75L945.034 400.955C944.943 400.989 944.816 401.023 944.653 401.057C944.49 401.095 944.284 401.114 944.034 401.114C943.655 401.114 943.284 401.032 942.92 400.869C942.56 400.706 942.261 400.458 942.022 400.125C941.787 399.792 941.67 399.371 941.67 398.864V390.182ZM946.572 401V392.273H947.867V393.591H947.958C948.117 393.159 948.405 392.809 948.822 392.54C949.238 392.271 949.708 392.136 950.231 392.136C950.329 392.136 950.452 392.138 950.6 392.142C950.748 392.146 950.86 392.152 950.935 392.159V393.523C950.89 393.511 950.786 393.494 950.623 393.472C950.464 393.445 950.295 393.432 950.117 393.432C949.693 393.432 949.314 393.521 948.981 393.699C948.651 393.873 948.39 394.116 948.197 394.426C948.007 394.733 947.913 395.083 947.913 395.477V401H946.572ZM955.485 401.182C954.697 401.182 954.005 400.994 953.411 400.619C952.82 400.244 952.358 399.72 952.024 399.045C951.695 398.371 951.53 397.583 951.53 396.682C951.53 395.773 951.695 394.979 952.024 394.301C952.358 393.623 952.82 393.097 953.411 392.722C954.005 392.347 954.697 392.159 955.485 392.159C956.272 392.159 956.962 392.347 957.553 392.722C958.147 393.097 958.61 393.623 958.939 394.301C959.272 394.979 959.439 395.773 959.439 396.682C959.439 397.583 959.272 398.371 958.939 399.045C958.61 399.72 958.147 400.244 957.553 400.619C956.962 400.994 956.272 401.182 955.485 401.182ZM955.485 399.977C956.083 399.977 956.576 399.824 956.962 399.517C957.348 399.21 957.634 398.807 957.82 398.307C958.005 397.807 958.098 397.265 958.098 396.682C958.098 396.098 958.005 395.555 957.82 395.051C957.634 394.547 957.348 394.14 956.962 393.83C956.576 393.519 956.083 393.364 955.485 393.364C954.886 393.364 954.394 393.519 954.007 393.83C953.621 394.14 953.335 394.547 953.149 395.051C952.964 395.555 952.871 396.098 952.871 396.682C952.871 397.265 952.964 397.807 953.149 398.307C953.335 398.807 953.621 399.21 954.007 399.517C954.394 399.824 954.886 399.977 955.485 399.977ZM964.461 401.182C963.734 401.182 963.092 400.998 962.535 400.631C961.979 400.259 961.543 399.737 961.229 399.062C960.914 398.384 960.757 397.583 960.757 396.659C960.757 395.742 960.914 394.947 961.229 394.273C961.543 393.598 961.98 393.078 962.541 392.71C963.102 392.343 963.749 392.159 964.484 392.159C965.052 392.159 965.501 392.254 965.831 392.443C966.164 392.629 966.418 392.841 966.592 393.08C966.77 393.314 966.908 393.508 967.007 393.659H967.121V389.364H968.461V401H967.166V399.659H967.007C966.908 399.818 966.768 400.019 966.586 400.261C966.405 400.5 966.145 400.714 965.808 400.903C965.471 401.089 965.022 401.182 964.461 401.182ZM964.643 399.977C965.181 399.977 965.636 399.837 966.007 399.557C966.378 399.273 966.66 398.881 966.854 398.381C967.047 397.877 967.143 397.295 967.143 396.636C967.143 395.985 967.049 395.415 966.859 394.926C966.67 394.434 966.39 394.051 966.018 393.778C965.647 393.502 965.189 393.364 964.643 393.364C964.075 393.364 963.602 393.509 963.223 393.801C962.848 394.089 962.566 394.481 962.376 394.977C962.191 395.47 962.098 396.023 962.098 396.636C962.098 397.258 962.193 397.822 962.382 398.33C962.575 398.833 962.859 399.235 963.234 399.534C963.613 399.83 964.083 399.977 964.643 399.977ZM976.284 397.432V392.273H977.624V401H976.284V399.523H976.193C975.988 399.966 975.67 400.343 975.238 400.653C974.806 400.96 974.261 401.114 973.602 401.114C973.056 401.114 972.571 400.994 972.147 400.756C971.723 400.513 971.39 400.15 971.147 399.665C970.905 399.176 970.784 398.561 970.784 397.818V392.273H972.124V397.727C972.124 398.364 972.302 398.871 972.659 399.25C973.018 399.629 973.477 399.818 974.034 399.818C974.367 399.818 974.706 399.733 975.051 399.562C975.399 399.392 975.691 399.131 975.926 398.778C976.164 398.426 976.284 397.977 976.284 397.432ZM983.306 401.182C982.488 401.182 981.783 400.989 981.192 400.602C980.601 400.216 980.147 399.684 979.829 399.006C979.51 398.328 979.351 397.553 979.351 396.682C979.351 395.795 979.514 395.013 979.84 394.335C980.169 393.653 980.628 393.121 981.215 392.739C981.806 392.352 982.495 392.159 983.283 392.159C983.897 392.159 984.45 392.273 984.942 392.5C985.435 392.727 985.838 393.045 986.152 393.455C986.467 393.864 986.662 394.341 986.738 394.886H985.397C985.294 394.489 985.067 394.136 984.715 393.83C984.366 393.519 983.897 393.364 983.306 393.364C982.783 393.364 982.325 393.5 981.931 393.773C981.541 394.042 981.236 394.422 981.016 394.915C980.8 395.403 980.692 395.977 980.692 396.636C980.692 397.311 980.798 397.898 981.01 398.398C981.226 398.898 981.529 399.286 981.919 399.562C982.313 399.839 982.776 399.977 983.306 399.977C983.654 399.977 983.971 399.917 984.255 399.795C984.539 399.674 984.779 399.5 984.976 399.273C985.173 399.045 985.313 398.773 985.397 398.455H986.738C986.662 398.97 986.474 399.434 986.175 399.847C985.88 400.256 985.488 400.581 984.999 400.824C984.514 401.062 983.95 401.182 983.306 401.182ZM992.037 401.182C991.196 401.182 990.471 400.996 989.861 400.625C989.255 400.25 988.787 399.727 988.457 399.057C988.132 398.383 987.969 397.598 987.969 396.705C987.969 395.811 988.132 395.023 988.457 394.341C988.787 393.655 989.245 393.121 989.832 392.739C990.423 392.352 991.113 392.159 991.901 392.159C992.355 392.159 992.804 392.235 993.247 392.386C993.69 392.538 994.094 392.784 994.457 393.125C994.821 393.462 995.111 393.909 995.327 394.466C995.543 395.023 995.651 395.708 995.651 396.523V397.091H988.923V395.932H994.287C994.287 395.439 994.188 395 993.992 394.614C993.798 394.227 993.522 393.922 993.162 393.699C992.806 393.475 992.385 393.364 991.901 393.364C991.367 393.364 990.904 393.496 990.514 393.761C990.128 394.023 989.831 394.364 989.622 394.784C989.414 395.205 989.31 395.655 989.31 396.136V396.909C989.31 397.568 989.423 398.127 989.651 398.585C989.882 399.04 990.202 399.386 990.611 399.625C991.02 399.86 991.495 399.977 992.037 399.977C992.389 399.977 992.707 399.928 992.992 399.83C993.279 399.727 993.528 399.576 993.736 399.375C993.944 399.17 994.105 398.917 994.219 398.614L995.514 398.977C995.378 399.417 995.149 399.803 994.827 400.136C994.505 400.466 994.107 400.723 993.634 400.909C993.16 401.091 992.628 401.182 992.037 401.182ZM1002.89 395.75V401H1001.55V392.273H1002.85V393.636H1002.96C1003.16 393.193 1003.47 392.837 1003.89 392.568C1004.31 392.295 1004.85 392.159 1005.5 392.159C1006.1 392.159 1006.61 392.28 1007.06 392.523C1007.5 392.761 1007.84 393.125 1008.09 393.614C1008.34 394.098 1008.46 394.712 1008.46 395.455V401H1007.12V395.545C1007.12 394.86 1006.94 394.326 1006.58 393.943C1006.23 393.557 1005.74 393.364 1005.12 393.364C1004.69 393.364 1004.31 393.456 1003.97 393.642C1003.64 393.828 1003.37 394.098 1003.18 394.455C1002.99 394.811 1002.89 395.242 1002.89 395.75ZM1014.25 401.182C1013.41 401.182 1012.68 400.996 1012.07 400.625C1011.47 400.25 1011 399.727 1010.67 399.057C1010.34 398.383 1010.18 397.598 1010.18 396.705C1010.18 395.811 1010.34 395.023 1010.67 394.341C1011 393.655 1011.46 393.121 1012.04 392.739C1012.64 392.352 1013.32 392.159 1014.11 392.159C1014.57 392.159 1015.02 392.235 1015.46 392.386C1015.9 392.538 1016.31 392.784 1016.67 393.125C1017.03 393.462 1017.32 393.909 1017.54 394.466C1017.75 395.023 1017.86 395.708 1017.86 396.523V397.091H1011.14V395.932H1016.5C1016.5 395.439 1016.4 395 1016.2 394.614C1016.01 394.227 1015.73 393.922 1015.37 393.699C1015.02 393.475 1014.6 393.364 1014.11 393.364C1013.58 393.364 1013.12 393.496 1012.73 393.761C1012.34 394.023 1012.04 394.364 1011.83 394.784C1011.63 395.205 1011.52 395.655 1011.52 396.136V396.909C1011.52 397.568 1011.64 398.127 1011.86 398.585C1012.09 399.04 1012.41 399.386 1012.82 399.625C1013.23 399.86 1013.71 399.977 1014.25 399.977C1014.6 399.977 1014.92 399.928 1015.2 399.83C1015.49 399.727 1015.74 399.576 1015.95 399.375C1016.16 399.17 1016.32 398.917 1016.43 398.614L1017.73 398.977C1017.59 399.417 1017.36 399.803 1017.04 400.136C1016.72 400.466 1016.32 400.723 1015.85 400.909C1015.37 401.091 1014.84 401.182 1014.25 401.182ZM1021.56 401L1018.9 392.273H1020.31L1022.2 398.955H1022.29L1024.15 392.273H1025.58L1027.42 398.932H1027.51L1029.4 392.273H1030.81L1028.15 401H1026.83L1024.92 394.295H1024.79L1022.88 401H1021.56ZM761.773 431.182C760.955 431.182 760.25 430.989 759.659 430.602C759.068 430.216 758.614 429.684 758.295 429.006C757.977 428.328 757.818 427.553 757.818 426.682C757.818 425.795 757.981 425.013 758.307 424.335C758.636 423.653 759.095 423.121 759.682 422.739C760.273 422.352 760.962 422.159 761.75 422.159C762.364 422.159 762.917 422.273 763.409 422.5C763.902 422.727 764.305 423.045 764.619 423.455C764.934 423.864 765.129 424.341 765.205 424.886H763.864C763.761 424.489 763.534 424.136 763.182 423.83C762.833 423.519 762.364 423.364 761.773 423.364C761.25 423.364 760.792 423.5 760.398 423.773C760.008 424.042 759.703 424.422 759.483 424.915C759.267 425.403 759.159 425.977 759.159 426.636C759.159 427.311 759.265 427.898 759.477 428.398C759.693 428.898 759.996 429.286 760.386 429.562C760.78 429.839 761.242 429.977 761.773 429.977C762.121 429.977 762.438 429.917 762.722 429.795C763.006 429.674 763.246 429.5 763.443 429.273C763.64 429.045 763.78 428.773 763.864 428.455H765.205C765.129 428.97 764.941 429.434 764.642 429.847C764.347 430.256 763.955 430.581 763.466 430.824C762.981 431.062 762.417 431.182 761.773 431.182ZM770.39 431.182C769.602 431.182 768.911 430.994 768.316 430.619C767.725 430.244 767.263 429.72 766.93 429.045C766.6 428.371 766.436 427.583 766.436 426.682C766.436 425.773 766.6 424.979 766.93 424.301C767.263 423.623 767.725 423.097 768.316 422.722C768.911 422.347 769.602 422.159 770.39 422.159C771.178 422.159 771.868 422.347 772.458 422.722C773.053 423.097 773.515 423.623 773.845 424.301C774.178 424.979 774.345 425.773 774.345 426.682C774.345 427.583 774.178 428.371 773.845 429.045C773.515 429.72 773.053 430.244 772.458 430.619C771.868 430.994 771.178 431.182 770.39 431.182ZM770.39 429.977C770.989 429.977 771.481 429.824 771.868 429.517C772.254 429.21 772.54 428.807 772.725 428.307C772.911 427.807 773.004 427.265 773.004 426.682C773.004 426.098 772.911 425.555 772.725 425.051C772.54 424.547 772.254 424.14 771.868 423.83C771.481 423.519 770.989 423.364 770.39 423.364C769.792 423.364 769.299 423.519 768.913 423.83C768.527 424.14 768.241 424.547 768.055 425.051C767.869 425.555 767.777 426.098 767.777 426.682C767.777 427.265 767.869 427.807 768.055 428.307C768.241 428.807 768.527 429.21 768.913 429.517C769.299 429.824 769.792 429.977 770.39 429.977ZM777.413 419.364V431H776.072V419.364H777.413ZM780.889 419.364V431H779.549V419.364H780.889ZM785.594 431.205C785.041 431.205 784.539 431.1 784.088 430.892C783.637 430.68 783.279 430.375 783.014 429.977C782.749 429.576 782.616 429.091 782.616 428.523C782.616 428.023 782.715 427.617 782.912 427.307C783.109 426.992 783.372 426.746 783.702 426.568C784.031 426.39 784.395 426.258 784.792 426.17C785.194 426.08 785.597 426.008 786.003 425.955C786.533 425.886 786.963 425.835 787.292 425.801C787.626 425.763 787.868 425.701 788.02 425.614C788.175 425.527 788.253 425.375 788.253 425.159V425.114C788.253 424.553 788.099 424.117 787.792 423.807C787.489 423.496 787.029 423.341 786.412 423.341C785.772 423.341 785.27 423.481 784.906 423.761C784.542 424.042 784.287 424.341 784.139 424.659L782.866 424.205C783.094 423.674 783.397 423.261 783.775 422.966C784.158 422.667 784.575 422.458 785.025 422.341C785.48 422.22 785.927 422.159 786.366 422.159C786.647 422.159 786.969 422.193 787.332 422.261C787.7 422.326 788.054 422.46 788.395 422.665C788.739 422.869 789.025 423.178 789.253 423.591C789.48 424.004 789.594 424.557 789.594 425.25V431H788.253V429.818H788.184C788.094 430.008 787.942 430.21 787.73 430.426C787.518 430.642 787.236 430.826 786.883 430.977C786.531 431.129 786.101 431.205 785.594 431.205ZM785.798 430C786.328 430 786.775 429.896 787.139 429.688C787.506 429.479 787.783 429.21 787.969 428.881C788.158 428.551 788.253 428.205 788.253 427.841V426.614C788.196 426.682 788.071 426.744 787.878 426.801C787.688 426.854 787.469 426.902 787.219 426.943C786.972 426.981 786.732 427.015 786.497 427.045C786.266 427.072 786.078 427.095 785.934 427.114C785.586 427.159 785.26 427.233 784.957 427.335C784.658 427.434 784.416 427.583 784.23 427.784C784.048 427.981 783.957 428.25 783.957 428.591C783.957 429.057 784.13 429.409 784.474 429.648C784.823 429.883 785.264 430 785.798 430ZM791.903 431V419.364H793.244V423.659H793.357C793.456 423.508 793.592 423.314 793.766 423.08C793.945 422.841 794.198 422.629 794.528 422.443C794.861 422.254 795.312 422.159 795.88 422.159C796.615 422.159 797.263 422.343 797.823 422.71C798.384 423.078 798.821 423.598 799.136 424.273C799.45 424.947 799.607 425.742 799.607 426.659C799.607 427.583 799.45 428.384 799.136 429.062C798.821 429.737 798.386 430.259 797.829 430.631C797.272 430.998 796.63 431.182 795.903 431.182C795.342 431.182 794.893 431.089 794.556 430.903C794.219 430.714 793.96 430.5 793.778 430.261C793.596 430.019 793.456 429.818 793.357 429.659H793.198V431H791.903ZM793.221 426.636C793.221 427.295 793.318 427.877 793.511 428.381C793.704 428.881 793.986 429.273 794.357 429.557C794.729 429.837 795.183 429.977 795.721 429.977C796.282 429.977 796.749 429.83 797.124 429.534C797.503 429.235 797.787 428.833 797.977 428.33C798.17 427.822 798.266 427.258 798.266 426.636C798.266 426.023 798.172 425.47 797.982 424.977C797.797 424.481 797.515 424.089 797.136 423.801C796.761 423.509 796.289 423.364 795.721 423.364C795.176 423.364 794.717 423.502 794.346 423.778C793.975 424.051 793.695 424.434 793.505 424.926C793.316 425.415 793.221 425.985 793.221 426.636ZM804.884 431.182C804.096 431.182 803.405 430.994 802.81 430.619C802.219 430.244 801.757 429.72 801.424 429.045C801.094 428.371 800.929 427.583 800.929 426.682C800.929 425.773 801.094 424.979 801.424 424.301C801.757 423.623 802.219 423.097 802.81 422.722C803.405 422.347 804.096 422.159 804.884 422.159C805.672 422.159 806.361 422.347 806.952 422.722C807.547 423.097 808.009 423.623 808.339 424.301C808.672 424.979 808.839 425.773 808.839 426.682C808.839 427.583 808.672 428.371 808.339 429.045C808.009 429.72 807.547 430.244 806.952 430.619C806.361 430.994 805.672 431.182 804.884 431.182ZM804.884 429.977C805.482 429.977 805.975 429.824 806.361 429.517C806.748 429.21 807.034 428.807 807.219 428.307C807.405 427.807 807.498 427.265 807.498 426.682C807.498 426.098 807.405 425.555 807.219 425.051C807.034 424.547 806.748 424.14 806.361 423.83C805.975 423.519 805.482 423.364 804.884 423.364C804.285 423.364 803.793 423.519 803.407 423.83C803.02 424.14 802.734 424.547 802.549 425.051C802.363 425.555 802.27 426.098 802.27 426.682C802.27 427.265 802.363 427.807 802.549 428.307C802.734 428.807 803.02 429.21 803.407 429.517C803.793 429.824 804.285 429.977 804.884 429.977ZM810.565 431V422.273H811.861V423.591H811.952C812.111 423.159 812.399 422.809 812.815 422.54C813.232 422.271 813.702 422.136 814.224 422.136C814.323 422.136 814.446 422.138 814.594 422.142C814.742 422.146 814.853 422.152 814.929 422.159V423.523C814.884 423.511 814.779 423.494 814.617 423.472C814.457 423.445 814.289 423.432 814.111 423.432C813.687 423.432 813.308 423.521 812.974 423.699C812.645 423.873 812.384 424.116 812.19 424.426C812.001 424.733 811.906 425.083 811.906 425.477V431H810.565ZM818.767 431.205C818.214 431.205 817.712 431.1 817.261 430.892C816.81 430.68 816.452 430.375 816.187 429.977C815.922 429.576 815.789 429.091 815.789 428.523C815.789 428.023 815.888 427.617 816.085 427.307C816.282 426.992 816.545 426.746 816.875 426.568C817.204 426.39 817.568 426.258 817.966 426.17C818.367 426.08 818.77 426.008 819.176 425.955C819.706 425.886 820.136 425.835 820.466 425.801C820.799 425.763 821.041 425.701 821.193 425.614C821.348 425.527 821.426 425.375 821.426 425.159V425.114C821.426 424.553 821.272 424.117 820.966 423.807C820.663 423.496 820.202 423.341 819.585 423.341C818.945 423.341 818.443 423.481 818.079 423.761C817.716 424.042 817.46 424.341 817.312 424.659L816.039 424.205C816.267 423.674 816.57 423.261 816.949 422.966C817.331 422.667 817.748 422.458 818.199 422.341C818.653 422.22 819.1 422.159 819.539 422.159C819.82 422.159 820.142 422.193 820.505 422.261C820.873 422.326 821.227 422.46 821.568 422.665C821.913 422.869 822.199 423.178 822.426 423.591C822.653 424.004 822.767 424.557 822.767 425.25V431H821.426V429.818H821.358C821.267 430.008 821.115 430.21 820.903 430.426C820.691 430.642 820.409 430.826 820.056 430.977C819.704 431.129 819.274 431.205 818.767 431.205ZM818.971 430C819.502 430 819.949 429.896 820.312 429.688C820.68 429.479 820.956 429.21 821.142 428.881C821.331 428.551 821.426 428.205 821.426 427.841V426.614C821.369 426.682 821.244 426.744 821.051 426.801C820.861 426.854 820.642 426.902 820.392 426.943C820.145 426.981 819.905 427.015 819.67 427.045C819.439 427.072 819.252 427.095 819.108 427.114C818.759 427.159 818.433 427.233 818.13 427.335C817.831 427.434 817.589 427.583 817.403 427.784C817.221 427.981 817.13 428.25 817.13 428.591C817.13 429.057 817.303 429.409 817.647 429.648C817.996 429.883 818.437 430 818.971 430ZM828.69 422.273V423.409H824.167V422.273H828.69ZM825.485 420.182H826.826V428.5C826.826 428.879 826.881 429.163 826.991 429.352C827.104 429.538 827.248 429.663 827.423 429.727C827.601 429.788 827.788 429.818 827.985 429.818C828.133 429.818 828.254 429.811 828.349 429.795C828.443 429.777 828.519 429.761 828.576 429.75L828.849 430.955C828.758 430.989 828.631 431.023 828.468 431.057C828.305 431.095 828.099 431.114 827.849 431.114C827.47 431.114 827.099 431.032 826.735 430.869C826.375 430.706 826.076 430.458 825.837 430.125C825.602 429.792 825.485 429.371 825.485 428.864V420.182ZM830.387 431V422.273H831.728V431H830.387ZM831.068 420.818C830.807 420.818 830.582 420.729 830.392 420.551C830.207 420.373 830.114 420.159 830.114 419.909C830.114 419.659 830.207 419.445 830.392 419.267C830.582 419.089 830.807 419 831.068 419C831.33 419 831.553 419.089 831.739 419.267C831.928 419.445 832.023 419.659 832.023 419.909C832.023 420.159 831.928 420.373 831.739 420.551C831.553 420.729 831.33 420.818 831.068 420.818ZM837.409 431.182C836.621 431.182 835.93 430.994 835.335 430.619C834.744 430.244 834.282 429.72 833.949 429.045C833.619 428.371 833.454 427.583 833.454 426.682C833.454 425.773 833.619 424.979 833.949 424.301C834.282 423.623 834.744 423.097 835.335 422.722C835.93 422.347 836.621 422.159 837.409 422.159C838.197 422.159 838.886 422.347 839.477 422.722C840.072 423.097 840.534 423.623 840.864 424.301C841.197 424.979 841.364 425.773 841.364 426.682C841.364 427.583 841.197 428.371 840.864 429.045C840.534 429.72 840.072 430.244 839.477 430.619C838.886 430.994 838.197 431.182 837.409 431.182ZM837.409 429.977C838.007 429.977 838.5 429.824 838.886 429.517C839.273 429.21 839.559 428.807 839.744 428.307C839.93 427.807 840.023 427.265 840.023 426.682C840.023 426.098 839.93 425.555 839.744 425.051C839.559 424.547 839.273 424.14 838.886 423.83C838.5 423.519 838.007 423.364 837.409 423.364C836.81 423.364 836.318 423.519 835.932 423.83C835.545 424.14 835.259 424.547 835.074 425.051C834.888 425.555 834.795 426.098 834.795 426.682C834.795 427.265 834.888 427.807 835.074 428.307C835.259 428.807 835.545 429.21 835.932 429.517C836.318 429.824 836.81 429.977 837.409 429.977ZM844.431 425.75V431H843.09V422.273H844.386V423.636H844.499C844.704 423.193 845.015 422.837 845.431 422.568C845.848 422.295 846.386 422.159 847.045 422.159C847.636 422.159 848.153 422.28 848.596 422.523C849.039 422.761 849.384 423.125 849.63 423.614C849.876 424.098 849.999 424.712 849.999 425.455V431H848.659V425.545C848.659 424.86 848.481 424.326 848.124 423.943C847.768 423.557 847.28 423.364 846.659 423.364C846.231 423.364 845.848 423.456 845.511 423.642C845.178 423.828 844.914 424.098 844.721 424.455C844.528 424.811 844.431 425.242 844.431 425.75ZM860.105 422.273V423.409H855.582V422.273H860.105ZM856.901 420.182H858.242V428.5C858.242 428.879 858.297 429.163 858.406 429.352C858.52 429.538 858.664 429.663 858.838 429.727C859.016 429.788 859.204 429.818 859.401 429.818C859.548 429.818 859.67 429.811 859.764 429.795C859.859 429.777 859.935 429.761 859.992 429.75L860.264 430.955C860.173 430.989 860.047 431.023 859.884 431.057C859.721 431.095 859.514 431.114 859.264 431.114C858.886 431.114 858.514 431.032 858.151 430.869C857.791 430.706 857.492 430.458 857.253 430.125C857.018 429.792 856.901 429.371 856.901 428.864V420.182ZM865.254 431.182C864.466 431.182 863.775 430.994 863.18 430.619C862.589 430.244 862.127 429.72 861.794 429.045C861.464 428.371 861.299 427.583 861.299 426.682C861.299 425.773 861.464 424.979 861.794 424.301C862.127 423.623 862.589 423.097 863.18 422.722C863.775 422.347 864.466 422.159 865.254 422.159C866.042 422.159 866.731 422.347 867.322 422.722C867.917 423.097 868.379 423.623 868.709 424.301C869.042 424.979 869.209 425.773 869.209 426.682C869.209 427.583 869.042 428.371 868.709 429.045C868.379 429.72 867.917 430.244 867.322 430.619C866.731 430.994 866.042 431.182 865.254 431.182ZM865.254 429.977C865.852 429.977 866.345 429.824 866.731 429.517C867.118 429.21 867.404 428.807 867.589 428.307C867.775 427.807 867.868 427.265 867.868 426.682C867.868 426.098 867.775 425.555 867.589 425.051C867.404 424.547 867.118 424.14 866.731 423.83C866.345 423.519 865.852 423.364 865.254 423.364C864.655 423.364 864.163 423.519 863.777 423.83C863.39 424.14 863.104 424.547 862.919 425.051C862.733 425.555 862.64 426.098 862.64 426.682C862.64 427.265 862.733 427.807 862.919 428.307C863.104 428.807 863.39 429.21 863.777 429.517C864.163 429.824 864.655 429.977 865.254 429.977ZM874.481 431.182C873.693 431.182 873.002 430.994 872.407 430.619C871.816 430.244 871.354 429.72 871.021 429.045C870.691 428.371 870.526 427.583 870.526 426.682C870.526 425.773 870.691 424.979 871.021 424.301C871.354 423.623 871.816 423.097 872.407 422.722C873.002 422.347 873.693 422.159 874.481 422.159C875.269 422.159 875.958 422.347 876.549 422.722C877.144 423.097 877.606 423.623 877.935 424.301C878.269 424.979 878.435 425.773 878.435 426.682C878.435 427.583 878.269 428.371 877.935 429.045C877.606 429.72 877.144 430.244 876.549 430.619C875.958 430.994 875.269 431.182 874.481 431.182ZM874.481 429.977C875.079 429.977 875.572 429.824 875.958 429.517C876.344 429.21 876.63 428.807 876.816 428.307C877.002 427.807 877.094 427.265 877.094 426.682C877.094 426.098 877.002 425.555 876.816 425.051C876.63 424.547 876.344 424.14 875.958 423.83C875.572 423.519 875.079 423.364 874.481 423.364C873.882 423.364 873.39 423.519 873.004 423.83C872.617 424.14 872.331 424.547 872.146 425.051C871.96 425.555 871.867 426.098 871.867 426.682C871.867 427.265 871.96 427.807 872.146 428.307C872.331 428.807 872.617 429.21 873.004 429.517C873.39 429.824 873.882 429.977 874.481 429.977ZM881.503 419.364V431H880.162V419.364H881.503ZM889.821 424.227L888.616 424.568C888.541 424.367 888.429 424.172 888.281 423.983C888.137 423.79 887.94 423.631 887.69 423.506C887.44 423.381 887.12 423.318 886.73 423.318C886.196 423.318 885.751 423.441 885.395 423.688C885.043 423.93 884.866 424.239 884.866 424.614C884.866 424.947 884.988 425.21 885.23 425.403C885.472 425.597 885.851 425.758 886.366 425.886L887.662 426.205C888.442 426.394 889.024 426.684 889.406 427.074C889.789 427.46 889.98 427.958 889.98 428.568C889.98 429.068 889.836 429.515 889.548 429.909C889.264 430.303 888.866 430.614 888.355 430.841C887.844 431.068 887.249 431.182 886.571 431.182C885.681 431.182 884.944 430.989 884.361 430.602C883.777 430.216 883.408 429.652 883.253 428.909L884.526 428.591C884.647 429.061 884.876 429.413 885.213 429.648C885.554 429.883 885.999 430 886.548 430C887.173 430 887.669 429.867 888.037 429.602C888.408 429.333 888.594 429.011 888.594 428.636C888.594 428.333 888.488 428.08 888.276 427.875C888.063 427.667 887.738 427.511 887.298 427.409L885.844 427.068C885.044 426.879 884.457 426.585 884.082 426.188C883.711 425.786 883.526 425.284 883.526 424.682C883.526 424.189 883.664 423.754 883.94 423.375C884.221 422.996 884.601 422.699 885.082 422.483C885.567 422.267 886.116 422.159 886.73 422.159C887.594 422.159 888.272 422.348 888.764 422.727C889.26 423.106 889.613 423.606 889.821 424.227ZM892.656 431.091C892.375 431.091 892.135 430.991 891.934 430.79C891.733 430.589 891.633 430.348 891.633 430.068C891.633 429.788 891.733 429.547 891.934 429.347C892.135 429.146 892.375 429.045 892.656 429.045C892.936 429.045 893.177 429.146 893.377 429.347C893.578 429.547 893.679 429.788 893.679 430.068C893.679 430.254 893.631 430.424 893.536 430.58C893.446 430.735 893.322 430.86 893.167 430.955C893.016 431.045 892.845 431.091 892.656 431.091Z" fill="black"/> +<rect x="756" y="195" width="64" height="64" rx="20" fill="white"/> +<rect x="776" y="215" width="23" height="23" rx="10" fill="#FEDD3E"/> +<path d="M1254.39 180V143.28H1164.22V116.76L1256.84 33.12H1283.36V114.108H1303.35V143.28H1283.36V180H1254.39ZM1210.74 114.108H1254.39V78L1210.74 114.108Z" fill="black" fill-opacity="0.04"/> +<path d="M1011.08 122.449H1013.43L1014.61 123.97L1015.78 125.325L1017.97 128.074H1015.39L1013.88 126.22L1013.11 125.121L1011.08 122.449ZM1018.17 120.455C1018.17 121.882 1017.9 123.097 1017.36 124.098C1016.82 125.099 1016.09 125.864 1015.16 126.393C1014.23 126.917 1013.19 127.179 1012.04 127.179C1010.87 127.179 1009.83 126.915 1008.91 126.386C1007.98 125.858 1007.25 125.093 1006.71 124.092C1006.18 123.09 1005.91 121.878 1005.91 120.455C1005.91 119.027 1006.18 117.812 1006.71 116.811C1007.25 115.81 1007.98 115.047 1008.91 114.523C1009.83 113.994 1010.87 113.73 1012.04 113.73C1013.19 113.73 1014.23 113.994 1015.16 114.523C1016.09 115.047 1016.82 115.81 1017.36 116.811C1017.9 117.812 1018.17 119.027 1018.17 120.455ZM1015.36 120.455C1015.36 119.53 1015.22 118.75 1014.95 118.115C1014.67 117.48 1014.29 116.999 1013.79 116.67C1013.29 116.342 1012.71 116.178 1012.04 116.178C1011.37 116.178 1010.78 116.342 1010.29 116.67C1009.79 116.999 1009.4 117.48 1009.12 118.115C1008.85 118.75 1008.71 119.53 1008.71 120.455C1008.71 121.379 1008.85 122.159 1009.12 122.794C1009.4 123.429 1009.79 123.911 1010.29 124.239C1010.78 124.567 1011.37 124.731 1012.04 124.731C1012.71 124.731 1013.29 124.567 1013.79 124.239C1014.29 123.911 1014.67 123.429 1014.95 122.794C1015.22 122.159 1015.36 121.379 1015.36 120.455ZM1019.4 124.699V122.519L1024.87 113.909H1026.75V116.926H1025.64L1022.19 122.379V122.481H1029.96V124.699H1019.4ZM1025.69 127V124.034L1025.74 123.069V113.909H1028.33V127H1025.69ZM1041.03 119.374V121.535H1035.06V119.374H1041.03ZM1046.41 127V125.006L1051.07 120.691C1051.47 120.308 1051.8 119.962 1052.07 119.656C1052.34 119.349 1052.55 119.048 1052.69 118.754C1052.83 118.456 1052.9 118.134 1052.9 117.789C1052.9 117.406 1052.81 117.075 1052.64 116.798C1052.46 116.517 1052.22 116.302 1051.92 116.153C1051.62 115.999 1051.27 115.923 1050.89 115.923C1050.49 115.923 1050.14 116.004 1049.84 116.165C1049.54 116.327 1049.31 116.56 1049.15 116.862C1048.99 117.165 1048.91 117.525 1048.91 117.942H1046.28C1046.28 117.086 1046.48 116.342 1046.86 115.712C1047.25 115.081 1047.79 114.593 1048.49 114.248C1049.19 113.903 1050 113.73 1050.91 113.73C1051.85 113.73 1052.66 113.896 1053.36 114.229C1054.06 114.557 1054.6 115.013 1054.99 115.597C1055.38 116.18 1055.57 116.849 1055.57 117.604C1055.57 118.098 1055.47 118.586 1055.28 119.067C1055.08 119.549 1054.74 120.084 1054.25 120.672C1053.75 121.256 1053.06 121.957 1052.16 122.775L1050.25 124.648V124.737H1055.74V127H1046.41ZM1062.34 127.288C1061.24 127.283 1060.3 127.013 1059.5 126.476C1058.71 125.939 1058.11 125.161 1057.68 124.143C1057.26 123.124 1057.05 121.899 1057.05 120.467C1057.05 119.04 1057.27 117.823 1057.69 116.817C1058.11 115.812 1058.72 115.047 1059.51 114.523C1060.3 113.994 1061.25 113.73 1062.34 113.73C1063.44 113.73 1064.38 113.994 1065.17 114.523C1065.96 115.051 1066.57 115.818 1066.99 116.824C1067.42 117.825 1067.63 119.04 1067.63 120.467C1067.63 121.903 1067.41 123.131 1066.99 124.149C1066.57 125.168 1065.96 125.945 1065.17 126.482C1064.38 127.019 1063.44 127.288 1062.34 127.288ZM1062.34 124.993C1063.09 124.993 1063.69 124.616 1064.14 123.862C1064.58 123.107 1064.81 121.976 1064.8 120.467C1064.8 119.474 1064.7 118.648 1064.49 117.987C1064.29 117.327 1064.01 116.83 1063.64 116.498C1063.27 116.165 1062.84 115.999 1062.34 115.999C1061.59 115.999 1061 116.372 1060.55 117.118C1060.1 117.864 1059.88 118.98 1059.87 120.467C1059.87 121.473 1059.97 122.312 1060.17 122.986C1060.38 123.655 1060.67 124.158 1061.04 124.494C1061.41 124.827 1061.84 124.993 1062.34 124.993ZM1069.06 127V125.006L1073.72 120.691C1074.12 120.308 1074.45 119.962 1074.72 119.656C1074.99 119.349 1075.2 119.048 1075.34 118.754C1075.48 118.456 1075.55 118.134 1075.55 117.789C1075.55 117.406 1075.46 117.075 1075.29 116.798C1075.11 116.517 1074.87 116.302 1074.57 116.153C1074.27 115.999 1073.92 115.923 1073.54 115.923C1073.14 115.923 1072.79 116.004 1072.49 116.165C1072.19 116.327 1071.96 116.56 1071.8 116.862C1071.64 117.165 1071.56 117.525 1071.56 117.942H1068.93C1068.93 117.086 1069.13 116.342 1069.51 115.712C1069.9 115.081 1070.45 114.593 1071.14 114.248C1071.84 113.903 1072.65 113.73 1073.56 113.73C1074.5 113.73 1075.31 113.896 1076.01 114.229C1076.71 114.557 1077.25 115.013 1077.64 115.597C1078.03 116.18 1078.22 116.849 1078.22 117.604C1078.22 118.098 1078.12 118.586 1077.93 119.067C1077.73 119.549 1077.39 120.084 1076.9 120.672C1076.4 121.256 1075.71 121.957 1074.81 122.775L1072.9 124.648V124.737H1078.39V127H1069.06ZM1084.64 127.179C1083.74 127.179 1082.93 127.013 1082.22 126.68C1081.52 126.348 1080.96 125.89 1080.55 125.306C1080.14 124.722 1079.92 124.053 1079.9 123.299H1082.59C1082.62 123.806 1082.83 124.217 1083.23 124.533C1083.62 124.848 1084.09 125.006 1084.64 125.006C1085.07 125.006 1085.46 124.91 1085.79 124.718C1086.13 124.522 1086.39 124.251 1086.58 123.906C1086.77 123.557 1086.86 123.156 1086.86 122.705C1086.86 122.244 1086.77 121.839 1086.57 121.49C1086.38 121.141 1086.11 120.868 1085.77 120.672C1085.43 120.476 1085.04 120.376 1084.6 120.371C1084.22 120.371 1083.84 120.45 1083.48 120.608C1083.12 120.766 1082.85 120.981 1082.65 121.254L1080.18 120.812L1080.8 113.909H1088.81V116.172H1083.09L1082.75 119.451H1082.82C1083.05 119.127 1083.4 118.859 1083.87 118.646C1084.33 118.433 1084.85 118.326 1085.43 118.326C1086.21 118.326 1086.92 118.511 1087.54 118.882C1088.15 119.253 1088.64 119.762 1089 120.41C1089.36 121.053 1089.53 121.795 1089.53 122.634C1089.53 123.516 1089.33 124.3 1088.92 124.987C1088.51 125.668 1087.93 126.205 1087.2 126.597C1086.46 126.985 1085.61 127.179 1084.64 127.179Z" fill="black"/> +<path d="M1006.41 163V151.364H1007.82V161.75H1013.23V163H1006.41ZM1017.48 163.205C1016.92 163.205 1016.42 163.1 1015.97 162.892C1015.52 162.68 1015.16 162.375 1014.9 161.977C1014.63 161.576 1014.5 161.091 1014.5 160.523C1014.5 160.023 1014.6 159.617 1014.79 159.307C1014.99 158.992 1015.25 158.746 1015.58 158.568C1015.91 158.39 1016.28 158.258 1016.67 158.17C1017.08 158.08 1017.48 158.008 1017.88 157.955C1018.41 157.886 1018.84 157.835 1019.17 157.801C1019.51 157.763 1019.75 157.701 1019.9 157.614C1020.06 157.527 1020.13 157.375 1020.13 157.159V157.114C1020.13 156.553 1019.98 156.117 1019.67 155.807C1019.37 155.496 1018.91 155.341 1018.29 155.341C1017.65 155.341 1017.15 155.481 1016.79 155.761C1016.42 156.042 1016.17 156.341 1016.02 156.659L1014.75 156.205C1014.98 155.674 1015.28 155.261 1015.66 154.966C1016.04 154.667 1016.46 154.458 1016.91 154.341C1017.36 154.22 1017.81 154.159 1018.25 154.159C1018.53 154.159 1018.85 154.193 1019.21 154.261C1019.58 154.326 1019.94 154.46 1020.28 154.665C1020.62 154.869 1020.91 155.178 1021.13 155.591C1021.36 156.004 1021.48 156.557 1021.48 157.25V163H1020.13V161.818H1020.07C1019.98 162.008 1019.82 162.21 1019.61 162.426C1019.4 162.642 1019.12 162.826 1018.77 162.977C1018.41 163.129 1017.98 163.205 1017.48 163.205ZM1017.68 162C1018.21 162 1018.66 161.896 1019.02 161.688C1019.39 161.479 1019.66 161.21 1019.85 160.881C1020.04 160.551 1020.13 160.205 1020.13 159.841V158.614C1020.08 158.682 1019.95 158.744 1019.76 158.801C1019.57 158.854 1019.35 158.902 1019.1 158.943C1018.85 158.981 1018.61 159.015 1018.38 159.045C1018.15 159.072 1017.96 159.095 1017.82 159.114C1017.47 159.159 1017.14 159.233 1016.84 159.335C1016.54 159.434 1016.3 159.583 1016.11 159.784C1015.93 159.981 1015.84 160.25 1015.84 160.591C1015.84 161.057 1016.01 161.409 1016.36 161.648C1016.7 161.883 1017.15 162 1017.68 162ZM1029.1 159.432V154.273H1030.44V163H1029.1V161.523H1029.01C1028.81 161.966 1028.49 162.343 1028.06 162.653C1027.63 162.96 1027.08 163.114 1026.42 163.114C1025.88 163.114 1025.39 162.994 1024.97 162.756C1024.54 162.513 1024.21 162.15 1023.97 161.665C1023.72 161.176 1023.6 160.561 1023.6 159.818V154.273H1024.94V159.727C1024.94 160.364 1025.12 160.871 1025.48 161.25C1025.84 161.629 1026.3 161.818 1026.85 161.818C1027.19 161.818 1027.53 161.733 1027.87 161.562C1028.22 161.392 1028.51 161.131 1028.74 160.778C1028.98 160.426 1029.1 159.977 1029.1 159.432ZM1033.92 157.75V163H1032.58V154.273H1033.88V155.636H1033.99C1034.19 155.193 1034.5 154.837 1034.92 154.568C1035.34 154.295 1035.88 154.159 1036.53 154.159C1037.13 154.159 1037.64 154.28 1038.09 154.523C1038.53 154.761 1038.87 155.125 1039.12 155.614C1039.37 156.098 1039.49 156.712 1039.49 157.455V163H1038.15V157.545C1038.15 156.86 1037.97 156.326 1037.61 155.943C1037.26 155.557 1036.77 155.364 1036.15 155.364C1035.72 155.364 1035.34 155.456 1035 155.642C1034.67 155.828 1034.4 156.098 1034.21 156.455C1034.02 156.811 1033.92 157.242 1033.92 157.75ZM1045.16 163.182C1044.35 163.182 1043.64 162.989 1043.05 162.602C1042.46 162.216 1042.01 161.684 1041.69 161.006C1041.37 160.328 1041.21 159.553 1041.21 158.682C1041.21 157.795 1041.37 157.013 1041.7 156.335C1042.03 155.653 1042.49 155.121 1043.07 154.739C1043.66 154.352 1044.35 154.159 1045.14 154.159C1045.76 154.159 1046.31 154.273 1046.8 154.5C1047.29 154.727 1047.7 155.045 1048.01 155.455C1048.33 155.864 1048.52 156.341 1048.6 156.886H1047.26C1047.15 156.489 1046.93 156.136 1046.57 155.83C1046.23 155.519 1045.76 155.364 1045.16 155.364C1044.64 155.364 1044.18 155.5 1043.79 155.773C1043.4 156.042 1043.09 156.422 1042.87 156.915C1042.66 157.403 1042.55 157.977 1042.55 158.636C1042.55 159.311 1042.66 159.898 1042.87 160.398C1043.09 160.898 1043.39 161.286 1043.78 161.562C1044.17 161.839 1044.63 161.977 1045.16 161.977C1045.51 161.977 1045.83 161.917 1046.11 161.795C1046.4 161.674 1046.64 161.5 1046.84 161.273C1047.03 161.045 1047.17 160.773 1047.26 160.455H1048.6C1048.52 160.97 1048.33 161.434 1048.03 161.847C1047.74 162.256 1047.35 162.581 1046.86 162.824C1046.37 163.062 1045.81 163.182 1045.16 163.182ZM1051.58 157.75V163H1050.24V151.364H1051.58V155.636H1051.69C1051.9 155.186 1052.2 154.828 1052.61 154.562C1053.02 154.294 1053.57 154.159 1054.26 154.159C1054.85 154.159 1055.37 154.278 1055.82 154.517C1056.27 154.752 1056.62 155.114 1056.86 155.602C1057.11 156.087 1057.24 156.705 1057.24 157.455V163H1055.9V157.545C1055.9 156.852 1055.72 156.316 1055.36 155.938C1055 155.555 1054.51 155.364 1053.87 155.364C1053.43 155.364 1053.04 155.456 1052.69 155.642C1052.35 155.828 1052.07 156.098 1051.87 156.455C1051.68 156.811 1051.58 157.242 1051.58 157.75ZM1063.55 163V154.273H1064.89V163H1063.55ZM1064.23 152.818C1063.97 152.818 1063.74 152.729 1063.56 152.551C1063.37 152.373 1063.28 152.159 1063.28 151.909C1063.28 151.659 1063.37 151.445 1063.56 151.267C1063.74 151.089 1063.97 151 1064.23 151C1064.49 151 1064.72 151.089 1064.9 151.267C1065.09 151.445 1065.19 151.659 1065.19 151.909C1065.19 152.159 1065.09 152.373 1064.9 152.551C1064.72 152.729 1064.49 152.818 1064.23 152.818ZM1068.37 157.75V163H1067.03V154.273H1068.32V155.636H1068.44C1068.64 155.193 1068.95 154.837 1069.37 154.568C1069.78 154.295 1070.32 154.159 1070.98 154.159C1071.57 154.159 1072.09 154.28 1072.53 154.523C1072.98 154.761 1073.32 155.125 1073.57 155.614C1073.81 156.098 1073.94 156.712 1073.94 157.455V163H1072.59V157.545C1072.59 156.86 1072.42 156.326 1072.06 155.943C1071.7 155.557 1071.22 155.364 1070.59 155.364C1070.17 155.364 1069.78 155.456 1069.45 155.642C1069.11 155.828 1068.85 156.098 1068.66 156.455C1068.46 156.811 1068.37 157.242 1068.37 157.75ZM1077.41 157.75V163H1076.07V154.273H1077.36V155.636H1077.48C1077.68 155.193 1077.99 154.837 1078.41 154.568C1078.82 154.295 1079.36 154.159 1080.02 154.159C1080.61 154.159 1081.13 154.28 1081.57 154.523C1082.01 154.761 1082.36 155.125 1082.61 155.614C1082.85 156.098 1082.98 156.712 1082.98 157.455V163H1081.63V157.545C1081.63 156.86 1081.46 156.326 1081.1 155.943C1080.74 155.557 1080.26 155.364 1079.63 155.364C1079.21 155.364 1078.82 155.456 1078.49 155.642C1078.15 155.828 1077.89 156.098 1077.7 156.455C1077.5 156.811 1077.41 157.242 1077.41 157.75ZM1088.65 163.182C1087.86 163.182 1087.17 162.994 1086.58 162.619C1085.99 162.244 1085.52 161.72 1085.19 161.045C1084.86 160.371 1084.7 159.583 1084.7 158.682C1084.7 157.773 1084.86 156.979 1085.19 156.301C1085.52 155.623 1085.99 155.097 1086.58 154.722C1087.17 154.347 1087.86 154.159 1088.65 154.159C1089.44 154.159 1090.13 154.347 1090.72 154.722C1091.31 155.097 1091.78 155.623 1092.11 156.301C1092.44 156.979 1092.61 157.773 1092.61 158.682C1092.61 159.583 1092.44 160.371 1092.11 161.045C1091.78 161.72 1091.31 162.244 1090.72 162.619C1090.13 162.994 1089.44 163.182 1088.65 163.182ZM1088.65 161.977C1089.25 161.977 1089.74 161.824 1090.13 161.517C1090.51 161.21 1090.8 160.807 1090.99 160.307C1091.17 159.807 1091.26 159.265 1091.26 158.682C1091.26 158.098 1091.17 157.555 1090.99 157.051C1090.8 156.547 1090.51 156.14 1090.13 155.83C1089.74 155.519 1089.25 155.364 1088.65 155.364C1088.05 155.364 1087.56 155.519 1087.17 155.83C1086.79 156.14 1086.5 156.547 1086.32 157.051C1086.13 157.555 1086.04 158.098 1086.04 158.682C1086.04 159.265 1086.13 159.807 1086.32 160.307C1086.5 160.807 1086.79 161.21 1087.17 161.517C1087.56 161.824 1088.05 161.977 1088.65 161.977ZM1101.16 154.273L1097.93 163H1096.57L1093.34 154.273H1094.79L1097.2 161.227H1097.29L1099.7 154.273H1101.16ZM1104.91 163.205C1104.36 163.205 1103.85 163.1 1103.4 162.892C1102.95 162.68 1102.59 162.375 1102.33 161.977C1102.06 161.576 1101.93 161.091 1101.93 160.523C1101.93 160.023 1102.03 159.617 1102.23 159.307C1102.42 158.992 1102.69 158.746 1103.02 158.568C1103.35 158.39 1103.71 158.258 1104.11 158.17C1104.51 158.08 1104.91 158.008 1105.32 157.955C1105.85 157.886 1106.28 157.835 1106.61 157.801C1106.94 157.763 1107.18 157.701 1107.33 157.614C1107.49 157.527 1107.57 157.375 1107.57 157.159V157.114C1107.57 156.553 1107.41 156.117 1107.11 155.807C1106.8 155.496 1106.34 155.341 1105.73 155.341C1105.09 155.341 1104.58 155.481 1104.22 155.761C1103.86 156.042 1103.6 156.341 1103.45 156.659L1102.18 156.205C1102.41 155.674 1102.71 155.261 1103.09 154.966C1103.47 154.667 1103.89 154.458 1104.34 154.341C1104.79 154.22 1105.24 154.159 1105.68 154.159C1105.96 154.159 1106.28 154.193 1106.65 154.261C1107.01 154.326 1107.37 154.46 1107.71 154.665C1108.05 154.869 1108.34 155.178 1108.57 155.591C1108.79 156.004 1108.91 156.557 1108.91 157.25V163H1107.57V161.818H1107.5C1107.41 162.008 1107.26 162.21 1107.04 162.426C1106.83 162.642 1106.55 162.826 1106.2 162.977C1105.85 163.129 1105.42 163.205 1104.91 163.205ZM1105.11 162C1105.64 162 1106.09 161.896 1106.45 161.688C1106.82 161.479 1107.1 161.21 1107.28 160.881C1107.47 160.551 1107.57 160.205 1107.57 159.841V158.614C1107.51 158.682 1107.39 158.744 1107.19 158.801C1107 158.854 1106.78 158.902 1106.53 158.943C1106.29 158.981 1106.05 159.015 1105.81 159.045C1105.58 159.072 1105.39 159.095 1105.25 159.114C1104.9 159.159 1104.58 159.233 1104.27 159.335C1103.97 159.434 1103.73 159.583 1103.54 159.784C1103.36 159.981 1103.27 160.25 1103.27 160.591C1103.27 161.057 1103.44 161.409 1103.79 161.648C1104.14 161.883 1104.58 162 1105.11 162ZM1114.83 154.273V155.409H1110.31V154.273H1114.83ZM1111.63 152.182H1112.97V160.5C1112.97 160.879 1113.02 161.163 1113.13 161.352C1113.25 161.538 1113.39 161.663 1113.56 161.727C1113.74 161.788 1113.93 161.818 1114.13 161.818C1114.27 161.818 1114.4 161.811 1114.49 161.795C1114.59 161.777 1114.66 161.761 1114.72 161.75L1114.99 162.955C1114.9 162.989 1114.77 163.023 1114.61 163.057C1114.45 163.095 1114.24 163.114 1113.99 163.114C1113.61 163.114 1113.24 163.032 1112.88 162.869C1112.52 162.706 1112.22 162.458 1111.98 162.125C1111.74 161.792 1111.63 161.371 1111.63 160.864V152.182ZM1116.53 163V154.273H1117.87V163H1116.53ZM1117.21 152.818C1116.95 152.818 1116.72 152.729 1116.53 152.551C1116.35 152.373 1116.26 152.159 1116.26 151.909C1116.26 151.659 1116.35 151.445 1116.53 151.267C1116.72 151.089 1116.95 151 1117.21 151C1117.47 151 1117.7 151.089 1117.88 151.267C1118.07 151.445 1118.16 151.659 1118.16 151.909C1118.16 152.159 1118.07 152.373 1117.88 152.551C1117.7 152.729 1117.47 152.818 1117.21 152.818ZM1127.14 154.273L1123.91 163H1122.55L1119.32 154.273H1120.78L1123.19 161.227H1123.28L1125.69 154.273H1127.14ZM1131.94 163.182C1131.1 163.182 1130.37 162.996 1129.76 162.625C1129.16 162.25 1128.69 161.727 1128.36 161.057C1128.03 160.383 1127.87 159.598 1127.87 158.705C1127.87 157.811 1128.03 157.023 1128.36 156.341C1128.69 155.655 1129.15 155.121 1129.73 154.739C1130.32 154.352 1131.01 154.159 1131.8 154.159C1132.26 154.159 1132.71 154.235 1133.15 154.386C1133.59 154.538 1134 154.784 1134.36 155.125C1134.72 155.462 1135.01 155.909 1135.23 156.466C1135.44 157.023 1135.55 157.708 1135.55 158.523V159.091H1128.82V157.932H1134.19C1134.19 157.439 1134.09 157 1133.89 156.614C1133.7 156.227 1133.42 155.922 1133.06 155.699C1132.71 155.475 1132.29 155.364 1131.8 155.364C1131.27 155.364 1130.81 155.496 1130.42 155.761C1130.03 156.023 1129.73 156.364 1129.52 156.784C1129.32 157.205 1129.21 157.655 1129.21 158.136V158.909C1129.21 159.568 1129.32 160.127 1129.55 160.585C1129.78 161.04 1130.1 161.386 1130.51 161.625C1130.92 161.86 1131.4 161.977 1131.94 161.977C1132.29 161.977 1132.61 161.928 1132.89 161.83C1133.18 161.727 1133.43 161.576 1133.64 161.375C1133.85 161.17 1134.01 160.917 1134.12 160.614L1135.42 160.977C1135.28 161.417 1135.05 161.803 1134.73 162.136C1134.41 162.466 1134.01 162.723 1133.53 162.909C1133.06 163.091 1132.53 163.182 1131.94 163.182ZM1147.63 156.227L1146.43 156.568C1146.35 156.367 1146.24 156.172 1146.09 155.983C1145.95 155.79 1145.75 155.631 1145.5 155.506C1145.25 155.381 1144.93 155.318 1144.54 155.318C1144.01 155.318 1143.56 155.441 1143.21 155.688C1142.86 155.93 1142.68 156.239 1142.68 156.614C1142.68 156.947 1142.8 157.21 1143.04 157.403C1143.28 157.597 1143.66 157.758 1144.18 157.886L1145.47 158.205C1146.25 158.394 1146.84 158.684 1147.22 159.074C1147.6 159.46 1147.79 159.958 1147.79 160.568C1147.79 161.068 1147.65 161.515 1147.36 161.909C1147.08 162.303 1146.68 162.614 1146.17 162.841C1145.66 163.068 1145.06 163.182 1144.38 163.182C1143.49 163.182 1142.76 162.989 1142.17 162.602C1141.59 162.216 1141.22 161.652 1141.07 160.909L1142.34 160.591C1142.46 161.061 1142.69 161.413 1143.03 161.648C1143.37 161.883 1143.81 162 1144.36 162C1144.99 162 1145.48 161.867 1145.85 161.602C1146.22 161.333 1146.41 161.011 1146.41 160.636C1146.41 160.333 1146.3 160.08 1146.09 159.875C1145.88 159.667 1145.55 159.511 1145.11 159.409L1143.66 159.068C1142.86 158.879 1142.27 158.585 1141.89 158.188C1141.52 157.786 1141.34 157.284 1141.34 156.682C1141.34 156.189 1141.48 155.754 1141.75 155.375C1142.03 154.996 1142.41 154.699 1142.89 154.483C1143.38 154.267 1143.93 154.159 1144.54 154.159C1145.41 154.159 1146.08 154.348 1146.58 154.727C1147.07 155.106 1147.43 155.606 1147.63 156.227ZM1153.04 163.182C1152.25 163.182 1151.56 162.994 1150.96 162.619C1150.37 162.244 1149.91 161.72 1149.58 161.045C1149.25 160.371 1149.08 159.583 1149.08 158.682C1149.08 157.773 1149.25 156.979 1149.58 156.301C1149.91 155.623 1150.37 155.097 1150.96 154.722C1151.56 154.347 1152.25 154.159 1153.04 154.159C1153.82 154.159 1154.51 154.347 1155.1 154.722C1155.7 155.097 1156.16 155.623 1156.49 156.301C1156.82 156.979 1156.99 157.773 1156.99 158.682C1156.99 159.583 1156.82 160.371 1156.49 161.045C1156.16 161.72 1155.7 162.244 1155.1 162.619C1154.51 162.994 1153.82 163.182 1153.04 163.182ZM1153.04 161.977C1153.63 161.977 1154.13 161.824 1154.51 161.517C1154.9 161.21 1155.19 160.807 1155.37 160.307C1155.56 159.807 1155.65 159.265 1155.65 158.682C1155.65 158.098 1155.56 157.555 1155.37 157.051C1155.19 156.547 1154.9 156.14 1154.51 155.83C1154.13 155.519 1153.63 155.364 1153.04 155.364C1152.44 155.364 1151.95 155.519 1151.56 155.83C1151.17 156.14 1150.89 156.547 1150.7 157.051C1150.52 157.555 1150.42 158.098 1150.42 158.682C1150.42 159.265 1150.52 159.807 1150.7 160.307C1150.89 160.807 1151.17 161.21 1151.56 161.517C1151.95 161.824 1152.44 161.977 1153.04 161.977ZM1160.06 151.364V163H1158.72V151.364H1160.06ZM1167.69 159.432V154.273H1169.04V163H1167.69V161.523H1167.6C1167.4 161.966 1167.08 162.343 1166.65 162.653C1166.22 162.96 1165.67 163.114 1165.01 163.114C1164.47 163.114 1163.98 162.994 1163.56 162.756C1163.13 162.513 1162.8 162.15 1162.56 161.665C1162.32 161.176 1162.19 160.561 1162.19 159.818V154.273H1163.54V159.727C1163.54 160.364 1163.71 160.871 1164.07 161.25C1164.43 161.629 1164.89 161.818 1165.44 161.818C1165.78 161.818 1166.12 161.733 1166.46 161.562C1166.81 161.392 1167.1 161.131 1167.34 160.778C1167.58 160.426 1167.69 159.977 1167.69 159.432ZM1174.97 154.273V155.409H1170.44V154.273H1174.97ZM1171.76 152.182H1173.1V160.5C1173.1 160.879 1173.16 161.163 1173.27 161.352C1173.38 161.538 1173.53 161.663 1173.7 161.727C1173.88 161.788 1174.07 161.818 1174.26 161.818C1174.41 161.818 1174.53 161.811 1174.63 161.795C1174.72 161.777 1174.8 161.761 1174.85 161.75L1175.13 162.955C1175.04 162.989 1174.91 163.023 1174.75 163.057C1174.58 163.095 1174.38 163.114 1174.13 163.114C1173.75 163.114 1173.38 163.032 1173.01 162.869C1172.65 162.706 1172.35 162.458 1172.11 162.125C1171.88 161.792 1171.76 161.371 1171.76 160.864V152.182ZM1176.66 163V154.273H1178.01V163H1176.66ZM1177.35 152.818C1177.08 152.818 1176.86 152.729 1176.67 152.551C1176.48 152.373 1176.39 152.159 1176.39 151.909C1176.39 151.659 1176.48 151.445 1176.67 151.267C1176.86 151.089 1177.08 151 1177.35 151C1177.61 151 1177.83 151.089 1178.02 151.267C1178.21 151.445 1178.3 151.659 1178.3 151.909C1178.3 152.159 1178.21 152.373 1178.02 152.551C1177.83 152.729 1177.61 152.818 1177.35 152.818ZM1183.69 163.182C1182.9 163.182 1182.21 162.994 1181.61 162.619C1181.02 162.244 1180.56 161.72 1180.23 161.045C1179.9 160.371 1179.73 159.583 1179.73 158.682C1179.73 157.773 1179.9 156.979 1180.23 156.301C1180.56 155.623 1181.02 155.097 1181.61 154.722C1182.21 154.347 1182.9 154.159 1183.69 154.159C1184.47 154.159 1185.16 154.347 1185.75 154.722C1186.35 155.097 1186.81 155.623 1187.14 156.301C1187.47 156.979 1187.64 157.773 1187.64 158.682C1187.64 159.583 1187.47 160.371 1187.14 161.045C1186.81 161.72 1186.35 162.244 1185.75 162.619C1185.16 162.994 1184.47 163.182 1183.69 163.182ZM1183.69 161.977C1184.28 161.977 1184.78 161.824 1185.16 161.517C1185.55 161.21 1185.84 160.807 1186.02 160.307C1186.21 159.807 1186.3 159.265 1186.3 158.682C1186.3 158.098 1186.21 157.555 1186.02 157.051C1185.84 156.547 1185.55 156.14 1185.16 155.83C1184.78 155.519 1184.28 155.364 1183.69 155.364C1183.09 155.364 1182.6 155.519 1182.21 155.83C1181.82 156.14 1181.54 156.547 1181.35 157.051C1181.17 157.555 1181.07 158.098 1181.07 158.682C1181.07 159.265 1181.17 159.807 1181.35 160.307C1181.54 160.807 1181.82 161.21 1182.21 161.517C1182.6 161.824 1183.09 161.977 1183.69 161.977ZM1190.71 157.75V163H1189.37V154.273H1190.66V155.636H1190.78C1190.98 155.193 1191.29 154.837 1191.71 154.568C1192.13 154.295 1192.66 154.159 1193.32 154.159C1193.91 154.159 1194.43 154.28 1194.87 154.523C1195.32 154.761 1195.66 155.125 1195.91 155.614C1196.15 156.098 1196.28 156.712 1196.28 157.455V163H1194.94V157.545C1194.94 156.86 1194.76 156.326 1194.4 155.943C1194.05 155.557 1193.56 155.364 1192.94 155.364C1192.51 155.364 1192.13 155.456 1191.79 155.642C1191.46 155.828 1191.19 156.098 1191 156.455C1190.81 156.811 1190.71 157.242 1190.71 157.75ZM1204.59 156.227L1203.38 156.568C1203.31 156.367 1203.2 156.172 1203.05 155.983C1202.91 155.79 1202.71 155.631 1202.46 155.506C1202.21 155.381 1201.89 155.318 1201.5 155.318C1200.96 155.318 1200.52 155.441 1200.16 155.688C1199.81 155.93 1199.63 156.239 1199.63 156.614C1199.63 156.947 1199.76 157.21 1200 157.403C1200.24 157.597 1200.62 157.758 1201.13 157.886L1202.43 158.205C1203.21 158.394 1203.79 158.684 1204.17 159.074C1204.56 159.46 1204.75 159.958 1204.75 160.568C1204.75 161.068 1204.6 161.515 1204.32 161.909C1204.03 162.303 1203.63 162.614 1203.12 162.841C1202.61 163.068 1202.02 163.182 1201.34 163.182C1200.45 163.182 1199.71 162.989 1199.13 162.602C1198.55 162.216 1198.18 161.652 1198.02 160.909L1199.29 160.591C1199.41 161.061 1199.64 161.413 1199.98 161.648C1200.32 161.883 1200.77 162 1201.32 162C1201.94 162 1202.44 161.867 1202.8 161.602C1203.18 161.333 1203.36 161.011 1203.36 160.636C1203.36 160.333 1203.26 160.08 1203.04 159.875C1202.83 159.667 1202.51 159.511 1202.07 159.409L1200.61 159.068C1199.81 158.879 1199.23 158.585 1198.85 158.188C1198.48 157.786 1198.29 157.284 1198.29 156.682C1198.29 156.189 1198.43 155.754 1198.71 155.375C1198.99 154.996 1199.37 154.699 1199.85 154.483C1200.34 154.267 1200.88 154.159 1201.5 154.159C1202.36 154.159 1203.04 154.348 1203.53 154.727C1204.03 155.106 1204.38 155.606 1204.59 156.227ZM1214.42 154.273V155.409H1209.9V154.273H1214.42ZM1211.22 152.182H1212.56V160.5C1212.56 160.879 1212.61 161.163 1212.72 161.352C1212.84 161.538 1212.98 161.663 1213.16 161.727C1213.33 161.788 1213.52 161.818 1213.72 161.818C1213.87 161.818 1213.99 161.811 1214.08 161.795C1214.18 161.777 1214.25 161.761 1214.31 161.75L1214.58 162.955C1214.49 162.989 1214.36 163.023 1214.2 163.057C1214.04 163.095 1213.83 163.114 1213.58 163.114C1213.2 163.114 1212.83 163.032 1212.47 162.869C1212.11 162.706 1211.81 162.458 1211.57 162.125C1211.33 161.792 1211.22 161.371 1211.22 160.864V152.182ZM1219.57 163.182C1218.78 163.182 1218.09 162.994 1217.5 162.619C1216.91 162.244 1216.44 161.72 1216.11 161.045C1215.78 160.371 1215.62 159.583 1215.62 158.682C1215.62 157.773 1215.78 156.979 1216.11 156.301C1216.44 155.623 1216.91 155.097 1217.5 154.722C1218.09 154.347 1218.78 154.159 1219.57 154.159C1220.36 154.159 1221.05 154.347 1221.64 154.722C1222.23 155.097 1222.7 155.623 1223.03 156.301C1223.36 156.979 1223.53 157.773 1223.53 158.682C1223.53 159.583 1223.36 160.371 1223.03 161.045C1222.7 161.72 1222.23 162.244 1221.64 162.619C1221.05 162.994 1220.36 163.182 1219.57 163.182ZM1219.57 161.977C1220.17 161.977 1220.66 161.824 1221.05 161.517C1221.43 161.21 1221.72 160.807 1221.91 160.307C1222.09 159.807 1222.18 159.265 1222.18 158.682C1222.18 158.098 1222.09 157.555 1221.91 157.051C1221.72 156.547 1221.43 156.14 1221.05 155.83C1220.66 155.519 1220.17 155.364 1219.57 155.364C1218.97 155.364 1218.48 155.519 1218.09 155.83C1217.71 156.14 1217.42 156.547 1217.24 157.051C1217.05 157.555 1216.96 158.098 1216.96 158.682C1216.96 159.265 1217.05 159.807 1217.24 160.307C1217.42 160.807 1217.71 161.21 1218.09 161.517C1218.48 161.824 1218.97 161.977 1219.57 161.977ZM1229.43 163V154.273H1230.73V155.636H1230.84C1231.02 155.17 1231.32 154.809 1231.72 154.551C1232.13 154.29 1232.61 154.159 1233.18 154.159C1233.76 154.159 1234.24 154.29 1234.62 154.551C1235.01 154.809 1235.31 155.17 1235.52 155.636H1235.61C1235.84 155.186 1236.17 154.828 1236.62 154.562C1237.07 154.294 1237.6 154.159 1238.23 154.159C1239.01 154.159 1239.65 154.403 1240.14 154.892C1240.64 155.377 1240.89 156.133 1240.89 157.159V163H1239.55V157.159C1239.55 156.515 1239.37 156.055 1239.02 155.778C1238.67 155.502 1238.25 155.364 1237.77 155.364C1237.16 155.364 1236.68 155.549 1236.35 155.92C1236.01 156.288 1235.84 156.754 1235.84 157.318V163H1234.48V157.023C1234.48 156.527 1234.32 156.127 1233.99 155.824C1233.67 155.517 1233.26 155.364 1232.75 155.364C1232.4 155.364 1232.08 155.456 1231.77 155.642C1231.47 155.828 1231.23 156.085 1231.05 156.415C1230.86 156.741 1230.77 157.117 1230.77 157.545V163H1229.43ZM1246.68 163.182C1245.84 163.182 1245.11 162.996 1244.5 162.625C1243.9 162.25 1243.43 161.727 1243.1 161.057C1242.77 160.383 1242.61 159.598 1242.61 158.705C1242.61 157.811 1242.77 157.023 1243.1 156.341C1243.43 155.655 1243.89 155.121 1244.47 154.739C1245.06 154.352 1245.75 154.159 1246.54 154.159C1247 154.159 1247.44 154.235 1247.89 154.386C1248.33 154.538 1248.73 154.784 1249.1 155.125C1249.46 155.462 1249.75 155.909 1249.97 156.466C1250.18 157.023 1250.29 157.708 1250.29 158.523V159.091H1243.56V157.932H1248.93C1248.93 157.439 1248.83 157 1248.63 156.614C1248.44 156.227 1248.16 155.922 1247.8 155.699C1247.45 155.475 1247.03 155.364 1246.54 155.364C1246.01 155.364 1245.55 155.496 1245.15 155.761C1244.77 156.023 1244.47 156.364 1244.26 156.784C1244.05 157.205 1243.95 157.655 1243.95 158.136V158.909C1243.95 159.568 1244.06 160.127 1244.29 160.585C1244.52 161.04 1244.84 161.386 1245.25 161.625C1245.66 161.86 1246.14 161.977 1246.68 161.977C1247.03 161.977 1247.35 161.928 1247.63 161.83C1247.92 161.727 1248.17 161.576 1248.38 161.375C1248.58 161.17 1248.75 160.917 1248.86 160.614L1250.15 160.977C1250.02 161.417 1249.79 161.803 1249.47 162.136C1249.15 162.466 1248.75 162.723 1248.27 162.909C1247.8 163.091 1247.27 163.182 1246.68 163.182ZM1255.67 163.182C1254.83 163.182 1254.1 162.996 1253.49 162.625C1252.89 162.25 1252.42 161.727 1252.09 161.057C1251.76 160.383 1251.6 159.598 1251.6 158.705C1251.6 157.811 1251.76 157.023 1252.09 156.341C1252.42 155.655 1252.88 155.121 1253.47 154.739C1254.06 154.352 1254.75 154.159 1255.53 154.159C1255.99 154.159 1256.44 154.235 1256.88 154.386C1257.32 154.538 1257.73 154.784 1258.09 155.125C1258.45 155.462 1258.74 155.909 1258.96 156.466C1259.18 157.023 1259.28 157.708 1259.28 158.523V159.091H1252.56V157.932H1257.92C1257.92 157.439 1257.82 157 1257.62 156.614C1257.43 156.227 1257.15 155.922 1256.8 155.699C1256.44 155.475 1256.02 155.364 1255.53 155.364C1255 155.364 1254.54 155.496 1254.15 155.761C1253.76 156.023 1253.46 156.364 1253.26 156.784C1253.05 157.205 1252.94 157.655 1252.94 158.136V158.909C1252.94 159.568 1253.06 160.127 1253.28 160.585C1253.51 161.04 1253.83 161.386 1254.24 161.625C1254.65 161.86 1255.13 161.977 1255.67 161.977C1256.02 161.977 1256.34 161.928 1256.62 161.83C1256.91 161.727 1257.16 161.576 1257.37 161.375C1257.58 161.17 1257.74 160.917 1257.85 160.614L1259.15 160.977C1259.01 161.417 1258.78 161.803 1258.46 162.136C1258.14 162.466 1257.74 162.723 1257.27 162.909C1256.79 163.091 1256.26 163.182 1255.67 163.182ZM1264.8 154.273V155.409H1260.28V154.273H1264.8ZM1261.59 152.182H1262.94V160.5C1262.94 160.879 1262.99 161.163 1263.1 161.352C1263.21 161.538 1263.36 161.663 1263.53 161.727C1263.71 161.788 1263.9 161.818 1264.09 161.818C1264.24 161.818 1264.36 161.811 1264.46 161.795C1264.55 161.777 1264.63 161.761 1264.69 161.75L1264.96 162.955C1264.87 162.989 1264.74 163.023 1264.58 163.057C1264.41 163.095 1264.21 163.114 1263.96 163.114C1263.58 163.114 1263.21 163.032 1262.84 162.869C1262.48 162.706 1262.19 162.458 1261.95 162.125C1261.71 161.792 1261.59 161.371 1261.59 160.864V152.182ZM1009.89 193.182C1009.05 193.182 1008.32 192.996 1007.71 192.625C1007.1 192.25 1006.64 191.727 1006.31 191.057C1005.98 190.383 1005.82 189.598 1005.82 188.705C1005.82 187.811 1005.98 187.023 1006.31 186.341C1006.64 185.655 1007.09 185.121 1007.68 184.739C1008.27 184.352 1008.96 184.159 1009.75 184.159C1010.2 184.159 1010.65 184.235 1011.1 184.386C1011.54 184.538 1011.94 184.784 1012.31 185.125C1012.67 185.462 1012.96 185.909 1013.18 186.466C1013.39 187.023 1013.5 187.708 1013.5 188.523V189.091H1006.77V187.932H1012.14C1012.14 187.439 1012.04 187 1011.84 186.614C1011.65 186.227 1011.37 185.922 1011.01 185.699C1010.66 185.475 1010.23 185.364 1009.75 185.364C1009.22 185.364 1008.75 185.496 1008.36 185.761C1007.98 186.023 1007.68 186.364 1007.47 186.784C1007.26 187.205 1007.16 187.655 1007.16 188.136V188.909C1007.16 189.568 1007.27 190.127 1007.5 190.585C1007.73 191.04 1008.05 191.386 1008.46 191.625C1008.87 191.86 1009.34 191.977 1009.89 191.977C1010.24 191.977 1010.56 191.928 1010.84 191.83C1011.13 191.727 1011.38 191.576 1011.59 191.375C1011.79 191.17 1011.95 190.917 1012.07 190.614L1013.36 190.977C1013.23 191.417 1013 191.803 1012.68 192.136C1012.35 192.466 1011.96 192.723 1011.48 192.909C1011.01 193.091 1010.48 193.182 1009.89 193.182ZM1015.22 193V184.273H1016.52V185.636H1016.63C1016.81 185.17 1017.1 184.809 1017.51 184.551C1017.91 184.29 1018.4 184.159 1018.97 184.159C1019.55 184.159 1020.02 184.29 1020.41 184.551C1020.79 184.809 1021.09 185.17 1021.31 185.636H1021.4C1021.63 185.186 1021.96 184.828 1022.41 184.562C1022.85 184.294 1023.39 184.159 1024.02 184.159C1024.8 184.159 1025.43 184.403 1025.93 184.892C1026.43 185.377 1026.67 186.133 1026.67 187.159V193H1025.33V187.159C1025.33 186.515 1025.16 186.055 1024.81 185.778C1024.45 185.502 1024.04 185.364 1023.56 185.364C1022.95 185.364 1022.47 185.549 1022.13 185.92C1021.8 186.288 1021.63 186.754 1021.63 187.318V193H1020.27V187.023C1020.27 186.527 1020.1 186.127 1019.78 185.824C1019.46 185.517 1019.05 185.364 1018.54 185.364C1018.19 185.364 1017.86 185.456 1017.56 185.642C1017.26 185.828 1017.02 186.085 1016.83 186.415C1016.65 186.741 1016.56 187.117 1016.56 187.545V193H1015.22ZM1032.47 193.182C1031.62 193.182 1030.9 192.996 1030.29 192.625C1029.68 192.25 1029.22 191.727 1028.89 191.057C1028.56 190.383 1028.4 189.598 1028.4 188.705C1028.4 187.811 1028.56 187.023 1028.89 186.341C1029.22 185.655 1029.67 185.121 1030.26 184.739C1030.85 184.352 1031.54 184.159 1032.33 184.159C1032.78 184.159 1033.23 184.235 1033.68 184.386C1034.12 184.538 1034.52 184.784 1034.89 185.125C1035.25 185.462 1035.54 185.909 1035.75 186.466C1035.97 187.023 1036.08 187.708 1036.08 188.523V189.091H1029.35V187.932H1034.72C1034.72 187.439 1034.62 187 1034.42 186.614C1034.23 186.227 1033.95 185.922 1033.59 185.699C1033.23 185.475 1032.81 185.364 1032.33 185.364C1031.79 185.364 1031.33 185.496 1030.94 185.761C1030.56 186.023 1030.26 186.364 1030.05 186.784C1029.84 187.205 1029.74 187.655 1029.74 188.136V188.909C1029.74 189.568 1029.85 190.127 1030.08 190.585C1030.31 191.04 1030.63 191.386 1031.04 191.625C1031.45 191.86 1031.92 191.977 1032.47 191.977C1032.82 191.977 1033.14 191.928 1033.42 191.83C1033.71 191.727 1033.96 191.576 1034.16 191.375C1034.37 191.17 1034.53 190.917 1034.65 190.614L1035.94 190.977C1035.81 191.417 1035.58 191.803 1035.25 192.136C1034.93 192.466 1034.54 192.723 1034.06 192.909C1033.59 193.091 1033.06 193.182 1032.47 193.182ZM1037.8 193V184.273H1039.09V185.591H1039.18C1039.34 185.159 1039.63 184.809 1040.05 184.54C1040.47 184.271 1040.93 184.136 1041.46 184.136C1041.56 184.136 1041.68 184.138 1041.83 184.142C1041.97 184.146 1042.09 184.152 1042.16 184.159V185.523C1042.12 185.511 1042.01 185.494 1041.85 185.472C1041.69 185.445 1041.52 185.432 1041.34 185.432C1040.92 185.432 1040.54 185.521 1040.21 185.699C1039.88 185.873 1039.62 186.116 1039.42 186.426C1039.23 186.733 1039.14 187.083 1039.14 187.477V193H1037.8ZM1046.69 196.455C1046.04 196.455 1045.48 196.371 1045.02 196.205C1044.55 196.042 1044.16 195.826 1043.85 195.557C1043.55 195.292 1043.3 195.008 1043.12 194.705L1044.19 193.955C1044.31 194.114 1044.46 194.295 1044.65 194.5C1044.83 194.708 1045.09 194.888 1045.41 195.04C1045.74 195.195 1046.16 195.273 1046.69 195.273C1047.39 195.273 1047.97 195.102 1048.43 194.761C1048.89 194.42 1049.12 193.886 1049.12 193.159V191.386H1049.01C1048.91 191.545 1048.77 191.742 1048.59 191.977C1048.41 192.208 1048.15 192.415 1047.81 192.597C1047.48 192.775 1047.03 192.864 1046.46 192.864C1045.76 192.864 1045.12 192.697 1044.56 192.364C1044.01 192.03 1043.57 191.545 1043.24 190.909C1042.92 190.273 1042.76 189.5 1042.76 188.591C1042.76 187.697 1042.91 186.919 1043.23 186.256C1043.54 185.589 1043.98 185.074 1044.54 184.71C1045.1 184.343 1045.75 184.159 1046.48 184.159C1047.05 184.159 1047.5 184.254 1047.84 184.443C1048.17 184.629 1048.43 184.841 1048.61 185.08C1048.79 185.314 1048.93 185.508 1049.03 185.659H1049.17V184.273H1050.46V193.25C1050.46 194 1050.29 194.61 1049.95 195.08C1049.61 195.553 1049.16 195.9 1048.59 196.119C1048.02 196.343 1047.39 196.455 1046.69 196.455ZM1046.64 191.659C1047.18 191.659 1047.64 191.536 1048.01 191.29C1048.38 191.044 1048.66 190.689 1048.85 190.227C1049.05 189.765 1049.14 189.212 1049.14 188.568C1049.14 187.939 1049.05 187.384 1048.86 186.903C1048.67 186.422 1048.39 186.045 1048.02 185.773C1047.65 185.5 1047.19 185.364 1046.64 185.364C1046.08 185.364 1045.6 185.508 1045.22 185.795C1044.85 186.083 1044.57 186.47 1044.38 186.955C1044.19 187.439 1044.1 187.977 1044.1 188.568C1044.1 189.174 1044.19 189.71 1044.38 190.176C1044.58 190.638 1044.86 191.002 1045.23 191.267C1045.61 191.528 1046.08 191.659 1046.64 191.659ZM1052.6 193V184.273H1053.94V193H1052.6ZM1053.28 182.818C1053.02 182.818 1052.79 182.729 1052.6 182.551C1052.42 182.373 1052.32 182.159 1052.32 181.909C1052.32 181.659 1052.42 181.445 1052.6 181.267C1052.79 181.089 1053.02 181 1053.28 181C1053.54 181 1053.76 181.089 1053.95 181.267C1054.14 181.445 1054.23 181.659 1054.23 181.909C1054.23 182.159 1054.14 182.373 1053.95 182.551C1053.76 182.729 1053.54 182.818 1053.28 182.818ZM1057.41 187.75V193H1056.07V184.273H1057.37V185.636H1057.48C1057.69 185.193 1058 184.837 1058.41 184.568C1058.83 184.295 1059.37 184.159 1060.03 184.159C1060.62 184.159 1061.14 184.28 1061.58 184.523C1062.02 184.761 1062.37 185.125 1062.61 185.614C1062.86 186.098 1062.98 186.712 1062.98 187.455V193H1061.64V187.545C1061.64 186.86 1061.46 186.326 1061.11 185.943C1060.75 185.557 1060.26 185.364 1059.64 185.364C1059.21 185.364 1058.83 185.456 1058.49 185.642C1058.16 185.828 1057.9 186.098 1057.7 186.455C1057.51 186.811 1057.41 187.242 1057.41 187.75ZM1068.63 196.455C1067.99 196.455 1067.43 196.371 1066.96 196.205C1066.5 196.042 1066.11 195.826 1065.8 195.557C1065.49 195.292 1065.25 195.008 1065.07 194.705L1066.13 193.955C1066.26 194.114 1066.41 194.295 1066.6 194.5C1066.78 194.708 1067.03 194.888 1067.36 195.04C1067.68 195.195 1068.11 195.273 1068.63 195.273C1069.34 195.273 1069.92 195.102 1070.38 194.761C1070.84 194.42 1071.07 193.886 1071.07 193.159V191.386H1070.95C1070.85 191.545 1070.71 191.742 1070.53 191.977C1070.35 192.208 1070.1 192.415 1069.76 192.597C1069.43 192.775 1068.98 192.864 1068.41 192.864C1067.7 192.864 1067.07 192.697 1066.51 192.364C1065.95 192.03 1065.51 191.545 1065.19 190.909C1064.86 190.273 1064.7 189.5 1064.7 188.591C1064.7 187.697 1064.86 186.919 1065.17 186.256C1065.49 185.589 1065.93 185.074 1066.49 184.71C1067.05 184.343 1067.7 184.159 1068.43 184.159C1069 184.159 1069.45 184.254 1069.78 184.443C1070.12 184.629 1070.38 184.841 1070.56 185.08C1070.74 185.314 1070.88 185.508 1070.98 185.659H1071.11V184.273H1072.41V193.25C1072.41 194 1072.24 194.61 1071.9 195.08C1071.56 195.553 1071.1 195.9 1070.53 196.119C1069.96 196.343 1069.33 196.455 1068.63 196.455ZM1068.59 191.659C1069.13 191.659 1069.58 191.536 1069.95 191.29C1070.32 191.044 1070.61 190.689 1070.8 190.227C1070.99 189.765 1071.09 189.212 1071.09 188.568C1071.09 187.939 1070.99 187.384 1070.81 186.903C1070.62 186.422 1070.34 186.045 1069.96 185.773C1069.59 185.5 1069.13 185.364 1068.59 185.364C1068.02 185.364 1067.55 185.508 1067.17 185.795C1066.79 186.083 1066.51 186.47 1066.32 186.955C1066.14 187.439 1066.04 187.977 1066.04 188.568C1066.04 189.174 1066.14 189.71 1066.33 190.176C1066.52 190.638 1066.81 191.002 1067.18 191.267C1067.56 191.528 1068.03 191.659 1068.59 191.659ZM1080.06 187.75V193H1078.72V184.273H1080.02V185.636H1080.13C1080.34 185.193 1080.65 184.837 1081.06 184.568C1081.48 184.295 1082.02 184.159 1082.68 184.159C1083.27 184.159 1083.78 184.28 1084.23 184.523C1084.67 184.761 1085.02 185.125 1085.26 185.614C1085.51 186.098 1085.63 186.712 1085.63 187.455V193H1084.29V187.545C1084.29 186.86 1084.11 186.326 1083.76 185.943C1083.4 185.557 1082.91 185.364 1082.29 185.364C1081.86 185.364 1081.48 185.456 1081.14 185.642C1080.81 185.828 1080.55 186.098 1080.35 186.455C1080.16 186.811 1080.06 187.242 1080.06 187.75ZM1091.42 193.182C1090.58 193.182 1089.85 192.996 1089.24 192.625C1088.64 192.25 1088.17 191.727 1087.84 191.057C1087.52 190.383 1087.35 189.598 1087.35 188.705C1087.35 187.811 1087.52 187.023 1087.84 186.341C1088.17 185.655 1088.63 185.121 1089.22 184.739C1089.81 184.352 1090.5 184.159 1091.28 184.159C1091.74 184.159 1092.19 184.235 1092.63 184.386C1093.07 184.538 1093.48 184.784 1093.84 185.125C1094.2 185.462 1094.49 185.909 1094.71 186.466C1094.93 187.023 1095.03 187.708 1095.03 188.523V189.091H1088.31V187.932H1093.67C1093.67 187.439 1093.57 187 1093.38 186.614C1093.18 186.227 1092.91 185.922 1092.55 185.699C1092.19 185.475 1091.77 185.364 1091.28 185.364C1090.75 185.364 1090.29 185.496 1089.9 185.761C1089.51 186.023 1089.21 186.364 1089.01 186.784C1088.8 187.205 1088.69 187.655 1088.69 188.136V188.909C1088.69 189.568 1088.81 190.127 1089.03 190.585C1089.27 191.04 1089.59 191.386 1089.99 191.625C1090.4 191.86 1090.88 191.977 1091.42 191.977C1091.77 191.977 1092.09 191.928 1092.38 191.83C1092.66 191.727 1092.91 191.576 1093.12 191.375C1093.33 191.17 1093.49 190.917 1093.6 190.614L1094.9 190.977C1094.76 191.417 1094.53 191.803 1094.21 192.136C1093.89 192.466 1093.49 192.723 1093.02 192.909C1092.54 193.091 1092.01 193.182 1091.42 193.182ZM1100.41 193.182C1099.57 193.182 1098.85 192.996 1098.24 192.625C1097.63 192.25 1097.16 191.727 1096.83 191.057C1096.51 190.383 1096.35 189.598 1096.35 188.705C1096.35 187.811 1096.51 187.023 1096.83 186.341C1097.16 185.655 1097.62 185.121 1098.21 184.739C1098.8 184.352 1099.49 184.159 1100.28 184.159C1100.73 184.159 1101.18 184.235 1101.62 184.386C1102.07 184.538 1102.47 184.784 1102.83 185.125C1103.2 185.462 1103.49 185.909 1103.7 186.466C1103.92 187.023 1104.03 187.708 1104.03 188.523V189.091H1097.3V187.932H1102.66C1102.66 187.439 1102.56 187 1102.37 186.614C1102.17 186.227 1101.9 185.922 1101.54 185.699C1101.18 185.475 1100.76 185.364 1100.28 185.364C1099.74 185.364 1099.28 185.496 1098.89 185.761C1098.5 186.023 1098.21 186.364 1098 186.784C1097.79 187.205 1097.69 187.655 1097.69 188.136V188.909C1097.69 189.568 1097.8 190.127 1098.03 190.585C1098.26 191.04 1098.58 191.386 1098.99 191.625C1099.4 191.86 1099.87 191.977 1100.41 191.977C1100.77 191.977 1101.08 191.928 1101.37 191.83C1101.66 191.727 1101.9 191.576 1102.11 191.375C1102.32 191.17 1102.48 190.917 1102.6 190.614L1103.89 190.977C1103.75 191.417 1103.52 191.803 1103.2 192.136C1102.88 192.466 1102.48 192.723 1102.01 192.909C1101.54 193.091 1101 193.182 1100.41 193.182ZM1109.04 193.182C1108.31 193.182 1107.67 192.998 1107.12 192.631C1106.56 192.259 1106.12 191.737 1105.81 191.062C1105.49 190.384 1105.34 189.583 1105.34 188.659C1105.34 187.742 1105.49 186.947 1105.81 186.273C1106.12 185.598 1106.56 185.078 1107.12 184.71C1107.68 184.343 1108.33 184.159 1109.06 184.159C1109.63 184.159 1110.08 184.254 1110.41 184.443C1110.74 184.629 1111 184.841 1111.17 185.08C1111.35 185.314 1111.49 185.508 1111.59 185.659H1111.7V181.364H1113.04V193H1111.75V191.659H1111.59C1111.49 191.818 1111.35 192.019 1111.17 192.261C1110.99 192.5 1110.73 192.714 1110.39 192.903C1110.05 193.089 1109.6 193.182 1109.04 193.182ZM1109.22 191.977C1109.76 191.977 1110.22 191.837 1110.59 191.557C1110.96 191.273 1111.24 190.881 1111.43 190.381C1111.63 189.877 1111.72 189.295 1111.72 188.636C1111.72 187.985 1111.63 187.415 1111.44 186.926C1111.25 186.434 1110.97 186.051 1110.6 185.778C1110.23 185.502 1109.77 185.364 1109.22 185.364C1108.66 185.364 1108.18 185.509 1107.8 185.801C1107.43 186.089 1107.15 186.481 1106.96 186.977C1106.77 187.47 1106.68 188.023 1106.68 188.636C1106.68 189.258 1106.77 189.822 1106.96 190.33C1107.16 190.833 1107.44 191.235 1107.81 191.534C1108.19 191.83 1108.66 191.977 1109.22 191.977ZM1121.55 186.227L1120.34 186.568C1120.27 186.367 1120.15 186.172 1120.01 185.983C1119.86 185.79 1119.67 185.631 1119.42 185.506C1119.17 185.381 1118.85 185.318 1118.46 185.318C1117.92 185.318 1117.48 185.441 1117.12 185.688C1116.77 185.93 1116.59 186.239 1116.59 186.614C1116.59 186.947 1116.71 187.21 1116.96 187.403C1117.2 187.597 1117.58 187.758 1118.09 187.886L1119.39 188.205C1120.17 188.394 1120.75 188.684 1121.13 189.074C1121.51 189.46 1121.71 189.958 1121.71 190.568C1121.71 191.068 1121.56 191.515 1121.27 191.909C1120.99 192.303 1120.59 192.614 1120.08 192.841C1119.57 193.068 1118.97 193.182 1118.3 193.182C1117.41 193.182 1116.67 192.989 1116.09 192.602C1115.5 192.216 1115.13 191.652 1114.98 190.909L1116.25 190.591C1116.37 191.061 1116.6 191.413 1116.94 191.648C1117.28 191.883 1117.72 192 1118.27 192C1118.9 192 1119.39 191.867 1119.76 191.602C1120.13 191.333 1120.32 191.011 1120.32 190.636C1120.32 190.333 1120.21 190.08 1120 189.875C1119.79 189.667 1119.46 189.511 1119.02 189.409L1117.57 189.068C1116.77 188.879 1116.18 188.585 1115.81 188.188C1115.44 187.786 1115.25 187.284 1115.25 186.682C1115.25 186.189 1115.39 185.754 1115.67 185.375C1115.95 184.996 1116.33 184.699 1116.81 184.483C1117.29 184.267 1117.84 184.159 1118.46 184.159C1119.32 184.159 1120 184.348 1120.49 184.727C1120.99 185.106 1121.34 185.606 1121.55 186.227ZM1125.4 191.409L1125.31 192.023C1125.25 192.455 1125.15 192.917 1125.02 193.409C1124.89 193.902 1124.75 194.366 1124.61 194.801C1124.47 195.237 1124.36 195.583 1124.27 195.841H1123.24C1123.29 195.598 1123.36 195.278 1123.44 194.881C1123.52 194.483 1123.6 194.038 1123.68 193.545C1123.76 193.057 1123.83 192.557 1123.88 192.045L1123.95 191.409H1125.4ZM1137.93 186.227L1136.73 186.568C1136.65 186.367 1136.54 186.172 1136.39 185.983C1136.25 185.79 1136.05 185.631 1135.8 185.506C1135.55 185.381 1135.23 185.318 1134.84 185.318C1134.3 185.318 1133.86 185.441 1133.5 185.688C1133.15 185.93 1132.98 186.239 1132.98 186.614C1132.98 186.947 1133.1 187.21 1133.34 187.403C1133.58 187.597 1133.96 187.758 1134.48 187.886L1135.77 188.205C1136.55 188.394 1137.13 188.684 1137.51 189.074C1137.9 189.46 1138.09 189.958 1138.09 190.568C1138.09 191.068 1137.94 191.515 1137.66 191.909C1137.37 192.303 1136.98 192.614 1136.46 192.841C1135.95 193.068 1135.36 193.182 1134.68 193.182C1133.79 193.182 1133.05 192.989 1132.47 192.602C1131.89 192.216 1131.52 191.652 1131.36 190.909L1132.63 190.591C1132.76 191.061 1132.98 191.413 1133.32 191.648C1133.66 191.883 1134.11 192 1134.66 192C1135.28 192 1135.78 191.867 1136.15 191.602C1136.52 191.333 1136.7 191.011 1136.7 190.636C1136.7 190.333 1136.6 190.08 1136.38 189.875C1136.17 189.667 1135.85 189.511 1135.41 189.409L1133.95 189.068C1133.15 188.879 1132.57 188.585 1132.19 188.188C1131.82 187.786 1131.63 187.284 1131.63 186.682C1131.63 186.189 1131.77 185.754 1132.05 185.375C1132.33 184.996 1132.71 184.699 1133.19 184.483C1133.68 184.267 1134.23 184.159 1134.84 184.159C1135.7 184.159 1136.38 184.348 1136.87 184.727C1137.37 185.106 1137.72 185.606 1137.93 186.227ZM1143.58 184.273V185.409H1139.06V184.273H1143.58ZM1140.38 182.182H1141.72V190.5C1141.72 190.879 1141.77 191.163 1141.88 191.352C1142 191.538 1142.14 191.663 1142.32 191.727C1142.49 191.788 1142.68 191.818 1142.88 191.818C1143.03 191.818 1143.15 191.811 1143.24 191.795C1143.34 191.777 1143.41 191.761 1143.47 191.75L1143.74 192.955C1143.65 192.989 1143.52 193.023 1143.36 193.057C1143.2 193.095 1142.99 193.114 1142.74 193.114C1142.36 193.114 1141.99 193.032 1141.63 192.869C1141.27 192.706 1140.97 192.458 1140.73 192.125C1140.5 191.792 1140.38 191.371 1140.38 190.864V182.182ZM1145.28 193V184.273H1146.58V185.591H1146.67C1146.83 185.159 1147.11 184.809 1147.53 184.54C1147.95 184.271 1148.42 184.136 1148.94 184.136C1149.04 184.136 1149.16 184.138 1149.31 184.142C1149.46 184.146 1149.57 184.152 1149.64 184.159V185.523C1149.6 185.511 1149.49 185.494 1149.33 185.472C1149.17 185.445 1149 185.432 1148.83 185.432C1148.4 185.432 1148.02 185.521 1147.69 185.699C1147.36 185.873 1147.1 186.116 1146.9 186.426C1146.72 186.733 1146.62 187.083 1146.62 187.477V193H1145.28ZM1154.31 193.182C1153.47 193.182 1152.74 192.996 1152.13 192.625C1151.52 192.25 1151.06 191.727 1150.73 191.057C1150.4 190.383 1150.24 189.598 1150.24 188.705C1150.24 187.811 1150.4 187.023 1150.73 186.341C1151.06 185.655 1151.51 185.121 1152.1 184.739C1152.69 184.352 1153.38 184.159 1154.17 184.159C1154.62 184.159 1155.07 184.235 1155.52 184.386C1155.96 184.538 1156.36 184.784 1156.73 185.125C1157.09 185.462 1157.38 185.909 1157.6 186.466C1157.81 187.023 1157.92 187.708 1157.92 188.523V189.091H1151.19V187.932H1156.56C1156.56 187.439 1156.46 187 1156.26 186.614C1156.07 186.227 1155.79 185.922 1155.43 185.699C1155.08 185.475 1154.65 185.364 1154.17 185.364C1153.64 185.364 1153.17 185.496 1152.78 185.761C1152.4 186.023 1152.1 186.364 1151.89 186.784C1151.68 187.205 1151.58 187.655 1151.58 188.136V188.909C1151.58 189.568 1151.69 190.127 1151.92 190.585C1152.15 191.04 1152.47 191.386 1152.88 191.625C1153.29 191.86 1153.76 191.977 1154.31 191.977C1154.66 191.977 1154.98 191.928 1155.26 191.83C1155.55 191.727 1155.8 191.576 1156.01 191.375C1156.21 191.17 1156.37 190.917 1156.49 190.614L1157.78 190.977C1157.65 191.417 1157.42 191.803 1157.1 192.136C1156.77 192.466 1156.38 192.723 1155.9 192.909C1155.43 193.091 1154.9 193.182 1154.31 193.182ZM1160.98 187.75V193H1159.64V184.273H1160.94V185.636H1161.05C1161.25 185.193 1161.56 184.837 1161.98 184.568C1162.4 184.295 1162.94 184.159 1163.59 184.159C1164.19 184.159 1164.7 184.28 1165.15 184.523C1165.59 184.761 1165.93 185.125 1166.18 185.614C1166.43 186.098 1166.55 186.712 1166.55 187.455V193H1165.21V187.545C1165.21 186.86 1165.03 186.326 1164.67 185.943C1164.32 185.557 1163.83 185.364 1163.21 185.364C1162.78 185.364 1162.4 185.456 1162.06 185.642C1161.73 185.828 1161.46 186.098 1161.27 186.455C1161.08 186.811 1160.98 187.242 1160.98 187.75ZM1172.2 196.455C1171.55 196.455 1171 196.371 1170.53 196.205C1170.07 196.042 1169.68 195.826 1169.37 195.557C1169.06 195.292 1168.82 195.008 1168.63 194.705L1169.7 193.955C1169.82 194.114 1169.98 194.295 1170.16 194.5C1170.35 194.708 1170.6 194.888 1170.92 195.04C1171.25 195.195 1171.68 195.273 1172.2 195.273C1172.91 195.273 1173.49 195.102 1173.95 194.761C1174.4 194.42 1174.63 193.886 1174.63 193.159V191.386H1174.52C1174.42 191.545 1174.28 191.742 1174.1 191.977C1173.92 192.208 1173.66 192.415 1173.33 192.597C1172.99 192.775 1172.54 192.864 1171.97 192.864C1171.27 192.864 1170.64 192.697 1170.08 192.364C1169.52 192.03 1169.08 191.545 1168.75 190.909C1168.43 190.273 1168.27 189.5 1168.27 188.591C1168.27 187.697 1168.43 186.919 1168.74 186.256C1169.06 185.589 1169.49 185.074 1170.05 184.71C1170.61 184.343 1171.26 184.159 1172 184.159C1172.57 184.159 1173.02 184.254 1173.35 184.443C1173.69 184.629 1173.94 184.841 1174.12 185.08C1174.3 185.314 1174.44 185.508 1174.54 185.659H1174.68V184.273H1175.97V193.25C1175.97 194 1175.8 194.61 1175.46 195.08C1175.13 195.553 1174.67 195.9 1174.1 196.119C1173.53 196.343 1172.9 196.455 1172.2 196.455ZM1172.16 191.659C1172.69 191.659 1173.15 191.536 1173.52 191.29C1173.89 191.044 1174.17 190.689 1174.37 190.227C1174.56 189.765 1174.66 189.212 1174.66 188.568C1174.66 187.939 1174.56 187.384 1174.37 186.903C1174.18 186.422 1173.9 186.045 1173.53 185.773C1173.16 185.5 1172.7 185.364 1172.16 185.364C1171.59 185.364 1171.11 185.508 1170.74 185.795C1170.36 186.083 1170.08 186.47 1169.89 186.955C1169.7 187.439 1169.61 187.977 1169.61 188.568C1169.61 189.174 1169.71 189.71 1169.9 190.176C1170.09 190.638 1170.37 191.002 1170.75 191.267C1171.13 191.528 1171.6 191.659 1172.16 191.659ZM1181.9 184.273V185.409H1177.38V184.273H1181.9ZM1178.7 182.182H1180.04V190.5C1180.04 190.879 1180.1 191.163 1180.21 191.352C1180.32 191.538 1180.46 191.663 1180.64 191.727C1180.82 191.788 1181 191.818 1181.2 191.818C1181.35 191.818 1181.47 191.811 1181.56 191.795C1181.66 191.777 1181.73 191.761 1181.79 191.75L1182.06 192.955C1181.97 192.989 1181.85 193.023 1181.68 193.057C1181.52 193.095 1181.31 193.114 1181.06 193.114C1180.68 193.114 1180.31 193.032 1179.95 192.869C1179.59 192.706 1179.29 192.458 1179.05 192.125C1178.82 191.792 1178.7 191.371 1178.7 190.864V182.182ZM1185.13 187.75V193H1183.79V181.364H1185.13V185.636H1185.24C1185.45 185.186 1185.76 184.828 1186.16 184.562C1186.58 184.294 1187.13 184.159 1187.81 184.159C1188.41 184.159 1188.93 184.278 1189.37 184.517C1189.82 184.752 1190.17 185.114 1190.41 185.602C1190.66 186.087 1190.79 186.705 1190.79 187.455V193H1189.45V187.545C1189.45 186.852 1189.27 186.316 1188.91 185.938C1188.55 185.555 1188.06 185.364 1187.43 185.364C1186.99 185.364 1186.59 185.456 1186.24 185.642C1185.9 185.828 1185.63 186.098 1185.43 186.455C1185.23 186.811 1185.13 187.242 1185.13 187.75ZM1196.58 193.182C1195.74 193.182 1195.02 192.996 1194.41 192.625C1193.8 192.25 1193.33 191.727 1193 191.057C1192.68 190.383 1192.51 189.598 1192.51 188.705C1192.51 187.811 1192.68 187.023 1193 186.341C1193.33 185.655 1193.79 185.121 1194.38 184.739C1194.97 184.352 1195.66 184.159 1196.45 184.159C1196.9 184.159 1197.35 184.235 1197.79 184.386C1198.23 184.538 1198.64 184.784 1199 185.125C1199.37 185.462 1199.66 185.909 1199.87 186.466C1200.09 187.023 1200.2 187.708 1200.2 188.523V189.091H1193.47V187.932H1198.83C1198.83 187.439 1198.73 187 1198.54 186.614C1198.34 186.227 1198.07 185.922 1197.71 185.699C1197.35 185.475 1196.93 185.364 1196.45 185.364C1195.91 185.364 1195.45 185.496 1195.06 185.761C1194.67 186.023 1194.37 186.364 1194.17 186.784C1193.96 187.205 1193.85 187.655 1193.85 188.136V188.909C1193.85 189.568 1193.97 190.127 1194.2 190.585C1194.43 191.04 1194.75 191.386 1195.16 191.625C1195.56 191.86 1196.04 191.977 1196.58 191.977C1196.93 191.977 1197.25 191.928 1197.54 191.83C1197.82 191.727 1198.07 191.576 1198.28 191.375C1198.49 191.17 1198.65 190.917 1198.76 190.614L1200.06 190.977C1199.92 191.417 1199.69 191.803 1199.37 192.136C1199.05 192.466 1198.65 192.723 1198.18 192.909C1197.7 193.091 1197.17 193.182 1196.58 193.182ZM1203.26 187.75V193H1201.91V184.273H1203.21V185.636H1203.32C1203.53 185.193 1203.84 184.837 1204.26 184.568C1204.67 184.295 1205.21 184.159 1205.87 184.159C1206.46 184.159 1206.98 184.28 1207.42 184.523C1207.86 184.761 1208.21 185.125 1208.45 185.614C1208.7 186.098 1208.82 186.712 1208.82 187.455V193H1207.48V187.545C1207.48 186.86 1207.3 186.326 1206.95 185.943C1206.59 185.557 1206.1 185.364 1205.48 185.364C1205.05 185.364 1204.67 185.456 1204.34 185.642C1204 185.828 1203.74 186.098 1203.55 186.455C1203.35 186.811 1203.26 187.242 1203.26 187.75ZM1009.77 223.182C1008.95 223.182 1008.25 222.989 1007.66 222.602C1007.07 222.216 1006.61 221.684 1006.3 221.006C1005.98 220.328 1005.82 219.553 1005.82 218.682C1005.82 217.795 1005.98 217.013 1006.31 216.335C1006.64 215.653 1007.09 215.121 1007.68 214.739C1008.27 214.352 1008.96 214.159 1009.75 214.159C1010.36 214.159 1010.92 214.273 1011.41 214.5C1011.9 214.727 1012.3 215.045 1012.62 215.455C1012.93 215.864 1013.13 216.341 1013.2 216.886H1011.86C1011.76 216.489 1011.53 216.136 1011.18 215.83C1010.83 215.519 1010.36 215.364 1009.77 215.364C1009.25 215.364 1008.79 215.5 1008.4 215.773C1008.01 216.042 1007.7 216.422 1007.48 216.915C1007.27 217.403 1007.16 217.977 1007.16 218.636C1007.16 219.311 1007.27 219.898 1007.48 220.398C1007.69 220.898 1008 221.286 1008.39 221.562C1008.78 221.839 1009.24 221.977 1009.77 221.977C1010.12 221.977 1010.44 221.917 1010.72 221.795C1011.01 221.674 1011.25 221.5 1011.44 221.273C1011.64 221.045 1011.78 220.773 1011.86 220.455H1013.2C1013.13 220.97 1012.94 221.434 1012.64 221.847C1012.35 222.256 1011.95 222.581 1011.47 222.824C1010.98 223.062 1010.42 223.182 1009.77 223.182ZM1018.39 223.182C1017.6 223.182 1016.91 222.994 1016.32 222.619C1015.73 222.244 1015.26 221.72 1014.93 221.045C1014.6 220.371 1014.44 219.583 1014.44 218.682C1014.44 217.773 1014.6 216.979 1014.93 216.301C1015.26 215.623 1015.73 215.097 1016.32 214.722C1016.91 214.347 1017.6 214.159 1018.39 214.159C1019.18 214.159 1019.87 214.347 1020.46 214.722C1021.05 215.097 1021.52 215.623 1021.84 216.301C1022.18 216.979 1022.34 217.773 1022.34 218.682C1022.34 219.583 1022.18 220.371 1021.84 221.045C1021.52 221.72 1021.05 222.244 1020.46 222.619C1019.87 222.994 1019.18 223.182 1018.39 223.182ZM1018.39 221.977C1018.99 221.977 1019.48 221.824 1019.87 221.517C1020.25 221.21 1020.54 220.807 1020.73 220.307C1020.91 219.807 1021 219.265 1021 218.682C1021 218.098 1020.91 217.555 1020.73 217.051C1020.54 216.547 1020.25 216.14 1019.87 215.83C1019.48 215.519 1018.99 215.364 1018.39 215.364C1017.79 215.364 1017.3 215.519 1016.91 215.83C1016.53 216.14 1016.24 216.547 1016.06 217.051C1015.87 217.555 1015.78 218.098 1015.78 218.682C1015.78 219.265 1015.87 219.807 1016.06 220.307C1016.24 220.807 1016.53 221.21 1016.91 221.517C1017.3 221.824 1017.79 221.977 1018.39 221.977ZM1024.07 223V214.273H1025.37V215.636H1025.48C1025.66 215.17 1025.96 214.809 1026.36 214.551C1026.77 214.29 1027.25 214.159 1027.82 214.159C1028.4 214.159 1028.88 214.29 1029.26 214.551C1029.65 214.809 1029.95 215.17 1030.16 215.636H1030.25C1030.48 215.186 1030.81 214.828 1031.26 214.562C1031.71 214.294 1032.24 214.159 1032.87 214.159C1033.65 214.159 1034.29 214.403 1034.78 214.892C1035.28 215.377 1035.53 216.133 1035.53 217.159V223H1034.19V217.159C1034.19 216.515 1034.01 216.055 1033.66 215.778C1033.3 215.502 1032.89 215.364 1032.41 215.364C1031.8 215.364 1031.32 215.549 1030.99 215.92C1030.65 216.288 1030.48 216.754 1030.48 217.318V223H1029.12V217.023C1029.12 216.527 1028.96 216.127 1028.63 215.824C1028.31 215.517 1027.9 215.364 1027.39 215.364C1027.04 215.364 1026.72 215.456 1026.41 215.642C1026.11 215.828 1025.87 216.085 1025.69 216.415C1025.5 216.741 1025.41 217.117 1025.41 217.545V223H1024.07ZM1037.66 223V214.273H1038.95V215.636H1039.07C1039.25 215.17 1039.54 214.809 1039.95 214.551C1040.35 214.29 1040.84 214.159 1041.41 214.159C1041.98 214.159 1042.46 214.29 1042.85 214.551C1043.23 214.809 1043.53 215.17 1043.75 215.636H1043.84C1044.06 215.186 1044.4 214.828 1044.85 214.562C1045.29 214.294 1045.83 214.159 1046.45 214.159C1047.23 214.159 1047.87 214.403 1048.37 214.892C1048.86 215.377 1049.11 216.133 1049.11 217.159V223H1047.77V217.159C1047.77 216.515 1047.6 216.055 1047.24 215.778C1046.89 215.502 1046.48 215.364 1046 215.364C1045.39 215.364 1044.91 215.549 1044.57 215.92C1044.24 216.288 1044.07 216.754 1044.07 217.318V223H1042.7V217.023C1042.7 216.527 1042.54 216.127 1042.22 215.824C1041.9 215.517 1041.48 215.364 1040.98 215.364C1040.63 215.364 1040.3 215.456 1040 215.642C1039.7 215.828 1039.46 216.085 1039.27 216.415C1039.09 216.741 1039 217.117 1039 217.545V223H1037.66ZM1056.74 219.432V214.273H1058.09V223H1056.74V221.523H1056.65C1056.45 221.966 1056.13 222.343 1055.7 222.653C1055.27 222.96 1054.72 223.114 1054.06 223.114C1053.52 223.114 1053.03 222.994 1052.61 222.756C1052.18 222.513 1051.85 222.15 1051.61 221.665C1051.37 221.176 1051.24 220.561 1051.24 219.818V214.273H1052.59V219.727C1052.59 220.364 1052.76 220.871 1053.12 221.25C1053.48 221.629 1053.94 221.818 1054.49 221.818C1054.83 221.818 1055.17 221.733 1055.51 221.562C1055.86 221.392 1056.15 221.131 1056.39 220.778C1056.62 220.426 1056.74 219.977 1056.74 219.432ZM1061.56 217.75V223H1060.22V214.273H1061.52V215.636H1061.63C1061.83 215.193 1062.15 214.837 1062.56 214.568C1062.98 214.295 1063.52 214.159 1064.18 214.159C1064.77 214.159 1065.28 214.28 1065.73 214.523C1066.17 214.761 1066.51 215.125 1066.76 215.614C1067.01 216.098 1067.13 216.712 1067.13 217.455V223H1065.79V217.545C1065.79 216.86 1065.61 216.326 1065.26 215.943C1064.9 215.557 1064.41 215.364 1063.79 215.364C1063.36 215.364 1062.98 215.456 1062.64 215.642C1062.31 215.828 1062.04 216.098 1061.85 216.455C1061.66 216.811 1061.56 217.242 1061.56 217.75ZM1069.26 223V214.273H1070.6V223H1069.26ZM1069.94 212.818C1069.68 212.818 1069.46 212.729 1069.27 212.551C1069.08 212.373 1068.99 212.159 1068.99 211.909C1068.99 211.659 1069.08 211.445 1069.27 211.267C1069.46 211.089 1069.68 211 1069.94 211C1070.2 211 1070.43 211.089 1070.61 211.267C1070.8 211.445 1070.9 211.659 1070.9 211.909C1070.9 212.159 1070.8 212.373 1070.61 212.551C1070.43 212.729 1070.2 212.818 1069.94 212.818ZM1076.53 214.273V215.409H1072.01V214.273H1076.53ZM1073.33 212.182H1074.67V220.5C1074.67 220.879 1074.72 221.163 1074.83 221.352C1074.95 221.538 1075.09 221.663 1075.27 221.727C1075.44 221.788 1075.63 221.818 1075.83 221.818C1075.98 221.818 1076.1 221.811 1076.19 221.795C1076.29 221.777 1076.36 221.761 1076.42 221.75L1076.69 222.955C1076.6 222.989 1076.47 223.023 1076.31 223.057C1076.15 223.095 1075.94 223.114 1075.69 223.114C1075.31 223.114 1074.94 223.032 1074.58 222.869C1074.22 222.706 1073.92 222.458 1073.68 222.125C1073.45 221.792 1073.33 221.371 1073.33 220.864V212.182ZM1079.09 226.273C1078.87 226.273 1078.66 226.254 1078.49 226.216C1078.31 226.182 1078.18 226.148 1078.12 226.114L1078.46 224.932C1078.78 225.015 1079.07 225.045 1079.32 225.023C1079.57 225 1079.79 224.888 1079.99 224.688C1080.18 224.491 1080.36 224.17 1080.53 223.727L1080.78 223.045L1077.55 214.273H1079L1081.41 221.227H1081.5L1083.91 214.273H1085.37L1081.66 224.273C1081.49 224.723 1081.29 225.097 1081.04 225.392C1080.8 225.691 1080.51 225.913 1080.18 226.057C1079.86 226.201 1079.5 226.273 1079.09 226.273ZM1093.56 223.205C1093.01 223.205 1092.51 223.1 1092.06 222.892C1091.61 222.68 1091.25 222.375 1090.98 221.977C1090.72 221.576 1090.59 221.091 1090.59 220.523C1090.59 220.023 1090.69 219.617 1090.88 219.307C1091.08 218.992 1091.34 218.746 1091.67 218.568C1092 218.39 1092.37 218.258 1092.76 218.17C1093.16 218.08 1093.57 218.008 1093.97 217.955C1094.5 217.886 1094.93 217.835 1095.26 217.801C1095.6 217.763 1095.84 217.701 1095.99 217.614C1096.15 217.527 1096.22 217.375 1096.22 217.159V217.114C1096.22 216.553 1096.07 216.117 1095.76 215.807C1095.46 215.496 1095 215.341 1094.38 215.341C1093.74 215.341 1093.24 215.481 1092.88 215.761C1092.51 216.042 1092.26 216.341 1092.11 216.659L1090.84 216.205C1091.06 215.674 1091.37 215.261 1091.75 214.966C1092.13 214.667 1092.55 214.458 1093 214.341C1093.45 214.22 1093.9 214.159 1094.34 214.159C1094.62 214.159 1094.94 214.193 1095.3 214.261C1095.67 214.326 1096.02 214.46 1096.37 214.665C1096.71 214.869 1097 215.178 1097.22 215.591C1097.45 216.004 1097.56 216.557 1097.56 217.25V223H1096.22V221.818H1096.16C1096.06 222.008 1095.91 222.21 1095.7 222.426C1095.49 222.642 1095.21 222.826 1094.85 222.977C1094.5 223.129 1094.07 223.205 1093.56 223.205ZM1093.77 222C1094.3 222 1094.75 221.896 1095.11 221.688C1095.48 221.479 1095.75 221.21 1095.94 220.881C1096.13 220.551 1096.22 220.205 1096.22 219.841V218.614C1096.17 218.682 1096.04 218.744 1095.85 218.801C1095.66 218.854 1095.44 218.902 1095.19 218.943C1094.94 218.981 1094.7 219.015 1094.47 219.045C1094.24 219.072 1094.05 219.095 1093.91 219.114C1093.56 219.159 1093.23 219.233 1092.93 219.335C1092.63 219.434 1092.39 219.583 1092.2 219.784C1092.02 219.981 1091.93 220.25 1091.93 220.591C1091.93 221.057 1092.1 221.409 1092.44 221.648C1092.79 221.883 1093.23 222 1093.77 222ZM1101.03 217.75V223H1099.69V214.273H1100.99V215.636H1101.1C1101.31 215.193 1101.62 214.837 1102.03 214.568C1102.45 214.295 1102.99 214.159 1103.65 214.159C1104.24 214.159 1104.75 214.28 1105.2 214.523C1105.64 214.761 1105.99 215.125 1106.23 215.614C1106.48 216.098 1106.6 216.712 1106.6 217.455V223H1105.26V217.545C1105.26 216.86 1105.08 216.326 1104.73 215.943C1104.37 215.557 1103.88 215.364 1103.26 215.364C1102.83 215.364 1102.45 215.456 1102.11 215.642C1101.78 215.828 1101.52 216.098 1101.32 216.455C1101.13 216.811 1101.03 217.242 1101.03 217.75ZM1112.03 223.182C1111.3 223.182 1110.66 222.998 1110.1 222.631C1109.54 222.259 1109.11 221.737 1108.79 221.062C1108.48 220.384 1108.32 219.583 1108.32 218.659C1108.32 217.742 1108.48 216.947 1108.79 216.273C1109.11 215.598 1109.55 215.078 1110.11 214.71C1110.67 214.343 1111.31 214.159 1112.05 214.159C1112.62 214.159 1113.07 214.254 1113.4 214.443C1113.73 214.629 1113.98 214.841 1114.16 215.08C1114.34 215.314 1114.47 215.508 1114.57 215.659H1114.69V211.364H1116.03V223H1114.73V221.659H1114.57C1114.47 221.818 1114.33 222.019 1114.15 222.261C1113.97 222.5 1113.71 222.714 1113.37 222.903C1113.04 223.089 1112.59 223.182 1112.03 223.182ZM1112.21 221.977C1112.75 221.977 1113.2 221.837 1113.57 221.557C1113.94 221.273 1114.23 220.881 1114.42 220.381C1114.61 219.877 1114.71 219.295 1114.71 218.636C1114.71 217.985 1114.61 217.415 1114.42 216.926C1114.23 216.434 1113.95 216.051 1113.58 215.778C1113.21 215.502 1112.75 215.364 1112.21 215.364C1111.64 215.364 1111.17 215.509 1110.79 215.801C1110.41 216.089 1110.13 216.481 1109.94 216.977C1109.76 217.47 1109.66 218.023 1109.66 218.636C1109.66 219.258 1109.76 219.822 1109.95 220.33C1110.14 220.833 1110.42 221.235 1110.8 221.534C1111.18 221.83 1111.65 221.977 1112.21 221.977ZM1126.19 223.182C1125.35 223.182 1124.62 222.996 1124.01 222.625C1123.41 222.25 1122.94 221.727 1122.61 221.057C1122.28 220.383 1122.12 219.598 1122.12 218.705C1122.12 217.811 1122.28 217.023 1122.61 216.341C1122.94 215.655 1123.4 215.121 1123.98 214.739C1124.57 214.352 1125.26 214.159 1126.05 214.159C1126.51 214.159 1126.95 214.235 1127.4 214.386C1127.84 214.538 1128.24 214.784 1128.61 215.125C1128.97 215.462 1129.26 215.909 1129.48 216.466C1129.69 217.023 1129.8 217.708 1129.8 218.523V219.091H1123.07V217.932H1128.44C1128.44 217.439 1128.34 217 1128.14 216.614C1127.95 216.227 1127.67 215.922 1127.31 215.699C1126.96 215.475 1126.54 215.364 1126.05 215.364C1125.52 215.364 1125.06 215.496 1124.66 215.761C1124.28 216.023 1123.98 216.364 1123.77 216.784C1123.56 217.205 1123.46 217.655 1123.46 218.136V218.909C1123.46 219.568 1123.57 220.127 1123.8 220.585C1124.03 221.04 1124.35 221.386 1124.76 221.625C1125.17 221.86 1125.65 221.977 1126.19 221.977C1126.54 221.977 1126.86 221.928 1127.14 221.83C1127.43 221.727 1127.68 221.576 1127.89 221.375C1128.09 221.17 1128.26 220.917 1128.37 220.614L1129.66 220.977C1129.53 221.417 1129.3 221.803 1128.98 222.136C1128.66 222.466 1128.26 222.723 1127.78 222.909C1127.31 223.091 1126.78 223.182 1126.19 223.182ZM1135.07 223.182C1134.25 223.182 1133.54 222.989 1132.95 222.602C1132.36 222.216 1131.91 221.684 1131.59 221.006C1131.27 220.328 1131.11 219.553 1131.11 218.682C1131.11 217.795 1131.27 217.013 1131.6 216.335C1131.93 215.653 1132.39 215.121 1132.98 214.739C1133.57 214.352 1134.26 214.159 1135.04 214.159C1135.66 214.159 1136.21 214.273 1136.7 214.5C1137.2 214.727 1137.6 215.045 1137.91 215.455C1138.23 215.864 1138.42 216.341 1138.5 216.886H1137.16C1137.06 216.489 1136.83 216.136 1136.48 215.83C1136.13 215.519 1135.66 215.364 1135.07 215.364C1134.54 215.364 1134.09 215.5 1133.69 215.773C1133.3 216.042 1133 216.422 1132.78 216.915C1132.56 217.403 1132.45 217.977 1132.45 218.636C1132.45 219.311 1132.56 219.898 1132.77 220.398C1132.99 220.898 1133.29 221.286 1133.68 221.562C1134.07 221.839 1134.54 221.977 1135.07 221.977C1135.41 221.977 1135.73 221.917 1136.02 221.795C1136.3 221.674 1136.54 221.5 1136.74 221.273C1136.93 221.045 1137.07 220.773 1137.16 220.455H1138.5C1138.42 220.97 1138.24 221.434 1137.94 221.847C1137.64 222.256 1137.25 222.581 1136.76 222.824C1136.27 223.062 1135.71 223.182 1135.07 223.182ZM1143.68 223.182C1142.9 223.182 1142.2 222.994 1141.61 222.619C1141.02 222.244 1140.56 221.72 1140.22 221.045C1139.89 220.371 1139.73 219.583 1139.73 218.682C1139.73 217.773 1139.89 216.979 1140.22 216.301C1140.56 215.623 1141.02 215.097 1141.61 214.722C1142.2 214.347 1142.9 214.159 1143.68 214.159C1144.47 214.159 1145.16 214.347 1145.75 214.722C1146.35 215.097 1146.81 215.623 1147.14 216.301C1147.47 216.979 1147.64 217.773 1147.64 218.682C1147.64 219.583 1147.47 220.371 1147.14 221.045C1146.81 221.72 1146.35 222.244 1145.75 222.619C1145.16 222.994 1144.47 223.182 1143.68 223.182ZM1143.68 221.977C1144.28 221.977 1144.77 221.824 1145.16 221.517C1145.55 221.21 1145.83 220.807 1146.02 220.307C1146.2 219.807 1146.3 219.265 1146.3 218.682C1146.3 218.098 1146.2 217.555 1146.02 217.051C1145.83 216.547 1145.55 216.14 1145.16 215.83C1144.77 215.519 1144.28 215.364 1143.68 215.364C1143.09 215.364 1142.59 215.519 1142.21 215.83C1141.82 216.14 1141.53 216.547 1141.35 217.051C1141.16 217.555 1141.07 218.098 1141.07 218.682C1141.07 219.265 1141.16 219.807 1141.35 220.307C1141.53 220.807 1141.82 221.21 1142.21 221.517C1142.59 221.824 1143.09 221.977 1143.68 221.977ZM1155.55 216.227L1154.34 216.568C1154.27 216.367 1154.16 216.172 1154.01 215.983C1153.86 215.79 1153.67 215.631 1153.42 215.506C1153.17 215.381 1152.85 215.318 1152.46 215.318C1151.92 215.318 1151.48 215.441 1151.12 215.688C1150.77 215.93 1150.59 216.239 1150.59 216.614C1150.59 216.947 1150.71 217.21 1150.96 217.403C1151.2 217.597 1151.58 217.758 1152.09 217.886L1153.39 218.205C1154.17 218.394 1154.75 218.684 1155.13 219.074C1155.52 219.46 1155.71 219.958 1155.71 220.568C1155.71 221.068 1155.56 221.515 1155.27 221.909C1154.99 222.303 1154.59 222.614 1154.08 222.841C1153.57 223.068 1152.98 223.182 1152.3 223.182C1151.41 223.182 1150.67 222.989 1150.09 222.602C1149.5 222.216 1149.13 221.652 1148.98 220.909L1150.25 220.591C1150.37 221.061 1150.6 221.413 1150.94 221.648C1151.28 221.883 1151.73 222 1152.27 222C1152.9 222 1153.4 221.867 1153.76 221.602C1154.13 221.333 1154.32 221.011 1154.32 220.636C1154.32 220.333 1154.21 220.08 1154 219.875C1153.79 219.667 1153.46 219.511 1153.02 219.409L1151.57 219.068C1150.77 218.879 1150.18 218.585 1149.81 218.188C1149.44 217.786 1149.25 217.284 1149.25 216.682C1149.25 216.189 1149.39 215.754 1149.67 215.375C1149.95 214.996 1150.33 214.699 1150.81 214.483C1151.29 214.267 1151.84 214.159 1152.46 214.159C1153.32 214.159 1154 214.348 1154.49 214.727C1154.99 215.106 1155.34 215.606 1155.55 216.227ZM1158.27 226.273C1158.04 226.273 1157.84 226.254 1157.66 226.216C1157.48 226.182 1157.36 226.148 1157.29 226.114L1157.63 224.932C1157.96 225.015 1158.25 225.045 1158.5 225.023C1158.75 225 1158.97 224.888 1159.16 224.688C1159.36 224.491 1159.54 224.17 1159.7 223.727L1159.95 223.045L1156.72 214.273H1158.18L1160.59 221.227H1160.68L1163.09 214.273H1164.54L1160.84 224.273C1160.67 224.723 1160.46 225.097 1160.22 225.392C1159.97 225.691 1159.69 225.913 1159.36 226.057C1159.04 226.201 1158.67 226.273 1158.27 226.273ZM1172.17 216.227L1170.97 216.568C1170.89 216.367 1170.78 216.172 1170.63 215.983C1170.49 215.79 1170.29 215.631 1170.04 215.506C1169.79 215.381 1169.47 215.318 1169.08 215.318C1168.55 215.318 1168.1 215.441 1167.75 215.688C1167.39 215.93 1167.22 216.239 1167.22 216.614C1167.22 216.947 1167.34 217.21 1167.58 217.403C1167.82 217.597 1168.2 217.758 1168.72 217.886L1170.01 218.205C1170.79 218.394 1171.38 218.684 1171.76 219.074C1172.14 219.46 1172.33 219.958 1172.33 220.568C1172.33 221.068 1172.19 221.515 1171.9 221.909C1171.62 222.303 1171.22 222.614 1170.71 222.841C1170.2 223.068 1169.6 223.182 1168.92 223.182C1168.03 223.182 1167.3 222.989 1166.71 222.602C1166.13 222.216 1165.76 221.652 1165.6 220.909L1166.88 220.591C1167 221.061 1167.23 221.413 1167.56 221.648C1167.91 221.883 1168.35 222 1168.9 222C1169.53 222 1170.02 221.867 1170.39 221.602C1170.76 221.333 1170.95 221.011 1170.95 220.636C1170.95 220.333 1170.84 220.08 1170.63 219.875C1170.42 219.667 1170.09 219.511 1169.65 219.409L1168.2 219.068C1167.4 218.879 1166.81 218.585 1166.43 218.188C1166.06 217.786 1165.88 217.284 1165.88 216.682C1165.88 216.189 1166.02 215.754 1166.29 215.375C1166.57 214.996 1166.95 214.699 1167.43 214.483C1167.92 214.267 1168.47 214.159 1169.08 214.159C1169.95 214.159 1170.62 214.348 1171.12 214.727C1171.61 215.106 1171.96 215.606 1172.17 216.227ZM1177.83 214.273V215.409H1173.3V214.273H1177.83ZM1174.62 212.182H1175.96V220.5C1175.96 220.879 1176.02 221.163 1176.13 221.352C1176.24 221.538 1176.38 221.663 1176.56 221.727C1176.74 221.788 1176.92 221.818 1177.12 221.818C1177.27 221.818 1177.39 221.811 1177.48 221.795C1177.58 221.777 1177.66 221.761 1177.71 221.75L1177.98 222.955C1177.89 222.989 1177.77 223.023 1177.6 223.057C1177.44 223.095 1177.23 223.114 1176.98 223.114C1176.61 223.114 1176.23 223.032 1175.87 222.869C1175.51 222.706 1175.21 222.458 1174.97 222.125C1174.74 221.792 1174.62 221.371 1174.62 220.864V212.182ZM1183.09 223.182C1182.25 223.182 1181.52 222.996 1180.91 222.625C1180.31 222.25 1179.84 221.727 1179.51 221.057C1179.18 220.383 1179.02 219.598 1179.02 218.705C1179.02 217.811 1179.18 217.023 1179.51 216.341C1179.84 215.655 1180.3 215.121 1180.88 214.739C1181.47 214.352 1182.16 214.159 1182.95 214.159C1183.41 214.159 1183.86 214.235 1184.3 214.386C1184.74 214.538 1185.15 214.784 1185.51 215.125C1185.87 215.462 1186.16 215.909 1186.38 216.466C1186.59 217.023 1186.7 217.708 1186.7 218.523V219.091H1179.97V217.932H1185.34C1185.34 217.439 1185.24 217 1185.04 216.614C1184.85 216.227 1184.57 215.922 1184.21 215.699C1183.86 215.475 1183.44 215.364 1182.95 215.364C1182.42 215.364 1181.96 215.496 1181.57 215.761C1181.18 216.023 1180.88 216.364 1180.67 216.784C1180.47 217.205 1180.36 217.655 1180.36 218.136V218.909C1180.36 219.568 1180.47 220.127 1180.7 220.585C1180.93 221.04 1181.25 221.386 1181.66 221.625C1182.07 221.86 1182.55 221.977 1183.09 221.977C1183.44 221.977 1183.76 221.928 1184.04 221.83C1184.33 221.727 1184.58 221.576 1184.79 221.375C1185 221.17 1185.16 220.917 1185.27 220.614L1186.57 220.977C1186.43 221.417 1186.2 221.803 1185.88 222.136C1185.56 222.466 1185.16 222.723 1184.68 222.909C1184.21 223.091 1183.68 223.182 1183.09 223.182ZM1188.42 223V214.273H1189.72V215.636H1189.83C1190.01 215.17 1190.31 214.809 1190.71 214.551C1191.12 214.29 1191.6 214.159 1192.17 214.159C1192.75 214.159 1193.23 214.29 1193.61 214.551C1194 214.809 1194.3 215.17 1194.51 215.636H1194.6C1194.83 215.186 1195.16 214.828 1195.61 214.562C1196.06 214.294 1196.59 214.159 1197.22 214.159C1198 214.159 1198.64 214.403 1199.13 214.892C1199.63 215.377 1199.88 216.133 1199.88 217.159V223H1198.54V217.159C1198.54 216.515 1198.36 216.055 1198.01 215.778C1197.65 215.502 1197.24 215.364 1196.76 215.364C1196.15 215.364 1195.67 215.549 1195.34 215.92C1195 216.288 1194.83 216.754 1194.83 217.318V223H1193.47V217.023C1193.47 216.527 1193.31 216.127 1192.98 215.824C1192.66 215.517 1192.25 215.364 1191.74 215.364C1191.39 215.364 1191.07 215.456 1190.76 215.642C1190.46 215.828 1190.22 216.085 1190.04 216.415C1189.85 216.741 1189.76 217.117 1189.76 217.545V223H1188.42ZM1006.23 256.273V244.273H1007.52V245.659H1007.68C1007.78 245.508 1007.92 245.314 1008.09 245.08C1008.27 244.841 1008.52 244.629 1008.85 244.443C1009.19 244.254 1009.64 244.159 1010.2 244.159C1010.94 244.159 1011.59 244.343 1012.15 244.71C1012.71 245.078 1013.15 245.598 1013.46 246.273C1013.77 246.947 1013.93 247.742 1013.93 248.659C1013.93 249.583 1013.77 250.384 1013.46 251.062C1013.15 251.737 1012.71 252.259 1012.15 252.631C1011.6 252.998 1010.95 253.182 1010.23 253.182C1009.67 253.182 1009.22 253.089 1008.88 252.903C1008.54 252.714 1008.28 252.5 1008.1 252.261C1007.92 252.019 1007.78 251.818 1007.68 251.659H1007.57V256.273H1006.23ZM1007.55 248.636C1007.55 249.295 1007.64 249.877 1007.84 250.381C1008.03 250.881 1008.31 251.273 1008.68 251.557C1009.05 251.837 1009.51 251.977 1010.05 251.977C1010.61 251.977 1011.07 251.83 1011.45 251.534C1011.83 251.235 1012.11 250.833 1012.3 250.33C1012.49 249.822 1012.59 249.258 1012.59 248.636C1012.59 248.023 1012.5 247.47 1012.31 246.977C1012.12 246.481 1011.84 246.089 1011.46 245.801C1011.09 245.509 1010.61 245.364 1010.05 245.364C1009.5 245.364 1009.04 245.502 1008.67 245.778C1008.3 246.051 1008.02 246.434 1007.83 246.926C1007.64 247.415 1007.55 247.985 1007.55 248.636ZM1018.23 253.205C1017.67 253.205 1017.17 253.1 1016.72 252.892C1016.27 252.68 1015.91 252.375 1015.65 251.977C1015.38 251.576 1015.25 251.091 1015.25 250.523C1015.25 250.023 1015.35 249.617 1015.54 249.307C1015.74 248.992 1016 248.746 1016.33 248.568C1016.66 248.39 1017.03 248.258 1017.42 248.17C1017.83 248.08 1018.23 248.008 1018.63 247.955C1019.16 247.886 1019.59 247.835 1019.92 247.801C1020.26 247.763 1020.5 247.701 1020.65 247.614C1020.81 247.527 1020.88 247.375 1020.88 247.159V247.114C1020.88 246.553 1020.73 246.117 1020.42 245.807C1020.12 245.496 1019.66 245.341 1019.04 245.341C1018.4 245.341 1017.9 245.481 1017.54 245.761C1017.17 246.042 1016.92 246.341 1016.77 246.659L1015.5 246.205C1015.73 245.674 1016.03 245.261 1016.41 244.966C1016.79 244.667 1017.21 244.458 1017.66 244.341C1018.11 244.22 1018.56 244.159 1019 244.159C1019.28 244.159 1019.6 244.193 1019.96 244.261C1020.33 244.326 1020.69 244.46 1021.03 244.665C1021.37 244.869 1021.66 245.178 1021.88 245.591C1022.11 246.004 1022.23 246.557 1022.23 247.25V253H1020.88V251.818H1020.82C1020.73 252.008 1020.57 252.21 1020.36 252.426C1020.15 252.642 1019.87 252.826 1019.52 252.977C1019.16 253.129 1018.73 253.205 1018.23 253.205ZM1018.43 252C1018.96 252 1019.41 251.896 1019.77 251.688C1020.14 251.479 1020.41 251.21 1020.6 250.881C1020.79 250.551 1020.88 250.205 1020.88 249.841V248.614C1020.83 248.682 1020.7 248.744 1020.51 248.801C1020.32 248.854 1020.1 248.902 1019.85 248.943C1019.6 248.981 1019.36 249.015 1019.13 249.045C1018.9 249.072 1018.71 249.095 1018.57 249.114C1018.22 249.159 1017.89 249.233 1017.59 249.335C1017.29 249.434 1017.05 249.583 1016.86 249.784C1016.68 249.981 1016.59 250.25 1016.59 250.591C1016.59 251.057 1016.76 251.409 1017.11 251.648C1017.45 251.883 1017.9 252 1018.43 252ZM1024.35 253V244.273H1025.65V245.591H1025.74C1025.9 245.159 1026.19 244.809 1026.6 244.54C1027.02 244.271 1027.49 244.136 1028.01 244.136C1028.11 244.136 1028.23 244.138 1028.38 244.142C1028.53 244.146 1028.64 244.152 1028.72 244.159V245.523C1028.67 245.511 1028.57 245.494 1028.4 245.472C1028.24 245.445 1028.08 245.432 1027.9 245.432C1027.47 245.432 1027.1 245.521 1026.76 245.699C1026.43 245.873 1026.17 246.116 1025.98 246.426C1025.79 246.733 1025.69 247.083 1025.69 247.477V253H1024.35ZM1034.33 244.273V245.409H1029.81V244.273H1034.33ZM1031.12 242.182H1032.46V250.5C1032.46 250.879 1032.52 251.163 1032.63 251.352C1032.74 251.538 1032.89 251.663 1033.06 251.727C1033.24 251.788 1033.43 251.818 1033.62 251.818C1033.77 251.818 1033.89 251.811 1033.99 251.795C1034.08 251.777 1034.16 251.761 1034.21 251.75L1034.49 252.955C1034.4 252.989 1034.27 253.023 1034.11 253.057C1033.94 253.095 1033.74 253.114 1033.49 253.114C1033.11 253.114 1032.74 253.032 1032.37 252.869C1032.01 252.706 1031.71 252.458 1031.48 252.125C1031.24 251.792 1031.12 251.371 1031.12 250.864V242.182ZM1037.37 247.75V253H1036.03V244.273H1037.32V245.636H1037.43C1037.64 245.193 1037.95 244.837 1038.37 244.568C1038.78 244.295 1039.32 244.159 1039.98 244.159C1040.57 244.159 1041.09 244.28 1041.53 244.523C1041.97 244.761 1042.32 245.125 1042.57 245.614C1042.81 246.098 1042.93 246.712 1042.93 247.455V253H1041.59V247.545C1041.59 246.86 1041.42 246.326 1041.06 245.943C1040.7 245.557 1040.21 245.364 1039.59 245.364C1039.17 245.364 1038.78 245.456 1038.45 245.642C1038.11 245.828 1037.85 246.098 1037.66 246.455C1037.46 246.811 1037.37 247.242 1037.37 247.75ZM1048.72 253.182C1047.88 253.182 1047.16 252.996 1046.55 252.625C1045.94 252.25 1045.47 251.727 1045.14 251.057C1044.82 250.383 1044.66 249.598 1044.66 248.705C1044.66 247.811 1044.82 247.023 1045.14 246.341C1045.47 245.655 1045.93 245.121 1046.52 244.739C1047.11 244.352 1047.8 244.159 1048.59 244.159C1049.04 244.159 1049.49 244.235 1049.93 244.386C1050.38 244.538 1050.78 244.784 1051.14 245.125C1051.51 245.462 1051.8 245.909 1052.01 246.466C1052.23 247.023 1052.34 247.708 1052.34 248.523V249.091H1045.61V247.932H1050.97C1050.97 247.439 1050.88 247 1050.68 246.614C1050.49 246.227 1050.21 245.922 1049.85 245.699C1049.49 245.475 1049.07 245.364 1048.59 245.364C1048.05 245.364 1047.59 245.496 1047.2 245.761C1046.81 246.023 1046.52 246.364 1046.31 246.784C1046.1 247.205 1046 247.655 1046 248.136V248.909C1046 249.568 1046.11 250.127 1046.34 250.585C1046.57 251.04 1046.89 251.386 1047.3 251.625C1047.71 251.86 1048.18 251.977 1048.72 251.977C1049.08 251.977 1049.39 251.928 1049.68 251.83C1049.97 251.727 1050.21 251.576 1050.42 251.375C1050.63 251.17 1050.79 250.917 1050.91 250.614L1052.2 250.977C1052.06 251.417 1051.84 251.803 1051.51 252.136C1051.19 252.466 1050.79 252.723 1050.32 252.909C1049.85 253.091 1049.31 253.182 1048.72 253.182ZM1054.06 253V244.273H1055.35V245.591H1055.44C1055.6 245.159 1055.89 244.809 1056.31 244.54C1056.72 244.271 1057.19 244.136 1057.72 244.136C1057.81 244.136 1057.94 244.138 1058.09 244.142C1058.23 244.146 1058.35 244.152 1058.42 244.159V245.523C1058.38 245.511 1058.27 245.494 1058.11 245.472C1057.95 245.445 1057.78 245.432 1057.6 245.432C1057.18 245.432 1056.8 245.521 1056.47 245.699C1056.14 245.873 1055.88 246.116 1055.68 246.426C1055.49 246.733 1055.4 247.083 1055.4 247.477V253H1054.06ZM1065.87 246.227L1064.67 246.568C1064.59 246.367 1064.48 246.172 1064.33 245.983C1064.19 245.79 1063.99 245.631 1063.74 245.506C1063.49 245.381 1063.17 245.318 1062.78 245.318C1062.25 245.318 1061.8 245.441 1061.45 245.688C1061.09 245.93 1060.92 246.239 1060.92 246.614C1060.92 246.947 1061.04 247.21 1061.28 247.403C1061.52 247.597 1061.9 247.758 1062.42 247.886L1063.71 248.205C1064.49 248.394 1065.07 248.684 1065.46 249.074C1065.84 249.46 1066.03 249.958 1066.03 250.568C1066.03 251.068 1065.89 251.515 1065.6 251.909C1065.32 252.303 1064.92 252.614 1064.41 252.841C1063.89 253.068 1063.3 253.182 1062.62 253.182C1061.73 253.182 1061 252.989 1060.41 252.602C1059.83 252.216 1059.46 251.652 1059.3 250.909L1060.58 250.591C1060.7 251.061 1060.93 251.413 1061.26 251.648C1061.61 251.883 1062.05 252 1062.6 252C1063.22 252 1063.72 251.867 1064.09 251.602C1064.46 251.333 1064.64 251.011 1064.64 250.636C1064.64 250.333 1064.54 250.08 1064.33 249.875C1064.11 249.667 1063.79 249.511 1063.35 249.409L1061.89 249.068C1061.1 248.879 1060.51 248.585 1060.13 248.188C1059.76 247.786 1059.58 247.284 1059.58 246.682C1059.58 246.189 1059.72 245.754 1059.99 245.375C1060.27 244.996 1060.65 244.699 1061.13 244.483C1061.62 244.267 1062.17 244.159 1062.78 244.159C1063.64 244.159 1064.32 244.348 1064.82 244.727C1065.31 245.106 1065.66 245.606 1065.87 246.227ZM1069.07 247.75V253H1067.73V241.364H1069.07V245.636H1069.18C1069.39 245.186 1069.7 244.828 1070.1 244.562C1070.52 244.294 1071.07 244.159 1071.75 244.159C1072.35 244.159 1072.87 244.278 1073.31 244.517C1073.76 244.752 1074.11 245.114 1074.35 245.602C1074.6 246.087 1074.73 246.705 1074.73 247.455V253H1073.39V247.545C1073.39 246.852 1073.21 246.316 1072.85 245.938C1072.49 245.555 1072 245.364 1071.37 245.364C1070.93 245.364 1070.53 245.456 1070.18 245.642C1069.84 245.828 1069.57 246.098 1069.37 246.455C1069.17 246.811 1069.07 247.242 1069.07 247.75ZM1076.86 253V244.273H1078.2V253H1076.86ZM1077.54 242.818C1077.28 242.818 1077.06 242.729 1076.87 242.551C1076.68 242.373 1076.59 242.159 1076.59 241.909C1076.59 241.659 1076.68 241.445 1076.87 241.267C1077.06 241.089 1077.28 241 1077.54 241C1077.81 241 1078.03 241.089 1078.22 241.267C1078.4 241.445 1078.5 241.659 1078.5 241.909C1078.5 242.159 1078.4 242.373 1078.22 242.551C1078.03 242.729 1077.81 242.818 1077.54 242.818ZM1080.34 256.273V244.273H1081.64V245.659H1081.79C1081.89 245.508 1082.03 245.314 1082.2 245.08C1082.38 244.841 1082.64 244.629 1082.96 244.443C1083.3 244.254 1083.75 244.159 1084.32 244.159C1085.05 244.159 1085.7 244.343 1086.26 244.71C1086.82 245.078 1087.26 245.598 1087.57 246.273C1087.89 246.947 1088.04 247.742 1088.04 248.659C1088.04 249.583 1087.89 250.384 1087.57 251.062C1087.26 251.737 1086.82 252.259 1086.27 252.631C1085.71 252.998 1085.07 253.182 1084.34 253.182C1083.78 253.182 1083.33 253.089 1082.99 252.903C1082.66 252.714 1082.4 252.5 1082.21 252.261C1082.03 252.019 1081.89 251.818 1081.79 251.659H1081.68V256.273H1080.34ZM1081.66 248.636C1081.66 249.295 1081.75 249.877 1081.95 250.381C1082.14 250.881 1082.42 251.273 1082.79 251.557C1083.17 251.837 1083.62 251.977 1084.16 251.977C1084.72 251.977 1085.19 251.83 1085.56 251.534C1085.94 251.235 1086.22 250.833 1086.41 250.33C1086.61 249.822 1086.7 249.258 1086.7 248.636C1086.7 248.023 1086.61 247.47 1086.42 246.977C1086.23 246.481 1085.95 246.089 1085.57 245.801C1085.2 245.509 1084.73 245.364 1084.16 245.364C1083.61 245.364 1083.15 245.502 1082.78 245.778C1082.41 246.051 1082.13 246.434 1081.94 246.926C1081.75 247.415 1081.66 247.985 1081.66 248.636ZM1095.95 246.227L1094.75 246.568C1094.67 246.367 1094.56 246.172 1094.41 245.983C1094.27 245.79 1094.07 245.631 1093.82 245.506C1093.57 245.381 1093.25 245.318 1092.86 245.318C1092.33 245.318 1091.88 245.441 1091.53 245.688C1091.17 245.93 1091 246.239 1091 246.614C1091 246.947 1091.12 247.21 1091.36 247.403C1091.6 247.597 1091.98 247.758 1092.5 247.886L1093.79 248.205C1094.57 248.394 1095.15 248.684 1095.54 249.074C1095.92 249.46 1096.11 249.958 1096.11 250.568C1096.11 251.068 1095.97 251.515 1095.68 251.909C1095.39 252.303 1095 252.614 1094.49 252.841C1093.97 253.068 1093.38 253.182 1092.7 253.182C1091.81 253.182 1091.07 252.989 1090.49 252.602C1089.91 252.216 1089.54 251.652 1089.38 250.909L1090.66 250.591C1090.78 251.061 1091.01 251.413 1091.34 251.648C1091.68 251.883 1092.13 252 1092.68 252C1093.3 252 1093.8 251.867 1094.17 251.602C1094.54 251.333 1094.72 251.011 1094.72 250.636C1094.72 250.333 1094.62 250.08 1094.41 249.875C1094.19 249.667 1093.87 249.511 1093.43 249.409L1091.97 249.068C1091.18 248.879 1090.59 248.585 1090.21 248.188C1089.84 247.786 1089.66 247.284 1089.66 246.682C1089.66 246.189 1089.79 245.754 1090.07 245.375C1090.35 244.996 1090.73 244.699 1091.21 244.483C1091.7 244.267 1092.25 244.159 1092.86 244.159C1093.72 244.159 1094.4 244.348 1094.89 244.727C1095.39 245.106 1095.74 245.606 1095.95 246.227ZM1099.81 251.409L1099.72 252.023C1099.65 252.455 1099.56 252.917 1099.42 253.409C1099.29 253.902 1099.16 254.366 1099.02 254.801C1098.88 255.237 1098.76 255.583 1098.67 255.841H1097.65C1097.7 255.598 1097.76 255.278 1097.84 254.881C1097.92 254.483 1098 254.038 1098.08 253.545C1098.17 253.057 1098.23 252.557 1098.29 252.045L1098.35 251.409H1099.81ZM1108.72 253.205C1108.17 253.205 1107.67 253.1 1107.22 252.892C1106.77 252.68 1106.41 252.375 1106.14 251.977C1105.88 251.576 1105.74 251.091 1105.74 250.523C1105.74 250.023 1105.84 249.617 1106.04 249.307C1106.24 248.992 1106.5 248.746 1106.83 248.568C1107.16 248.39 1107.52 248.258 1107.92 248.17C1108.32 248.08 1108.73 248.008 1109.13 247.955C1109.66 247.886 1110.09 247.835 1110.42 247.801C1110.75 247.763 1111 247.701 1111.15 247.614C1111.3 247.527 1111.38 247.375 1111.38 247.159V247.114C1111.38 246.553 1111.23 246.117 1110.92 245.807C1110.62 245.496 1110.16 245.341 1109.54 245.341C1108.9 245.341 1108.4 245.481 1108.03 245.761C1107.67 246.042 1107.41 246.341 1107.27 246.659L1105.99 246.205C1106.22 245.674 1106.52 245.261 1106.9 244.966C1107.29 244.667 1107.7 244.458 1108.15 244.341C1108.61 244.22 1109.06 244.159 1109.49 244.159C1109.77 244.159 1110.1 244.193 1110.46 244.261C1110.83 244.326 1111.18 244.46 1111.52 244.665C1111.87 244.869 1112.15 245.178 1112.38 245.591C1112.61 246.004 1112.72 246.557 1112.72 247.25V253H1111.38V251.818H1111.31C1111.22 252.008 1111.07 252.21 1110.86 252.426C1110.65 252.642 1110.36 252.826 1110.01 252.977C1109.66 253.129 1109.23 253.205 1108.72 253.205ZM1108.93 252C1109.46 252 1109.9 251.896 1110.27 251.688C1110.63 251.479 1110.91 251.21 1111.1 250.881C1111.29 250.551 1111.38 250.205 1111.38 249.841V248.614C1111.32 248.682 1111.2 248.744 1111.01 248.801C1110.82 248.854 1110.6 248.902 1110.35 248.943C1110.1 248.981 1109.86 249.015 1109.63 249.045C1109.39 249.072 1109.21 249.095 1109.06 249.114C1108.71 249.159 1108.39 249.233 1108.09 249.335C1107.79 249.434 1107.54 249.583 1107.36 249.784C1107.18 249.981 1107.09 250.25 1107.09 250.591C1107.09 251.057 1107.26 251.409 1107.6 251.648C1107.95 251.883 1108.39 252 1108.93 252ZM1116.19 247.75V253H1114.85V244.273H1116.14V245.636H1116.26C1116.46 245.193 1116.77 244.837 1117.19 244.568C1117.61 244.295 1118.14 244.159 1118.8 244.159C1119.39 244.159 1119.91 244.28 1120.35 244.523C1120.8 244.761 1121.14 245.125 1121.39 245.614C1121.64 246.098 1121.76 246.712 1121.76 247.455V253H1120.42V247.545C1120.42 246.86 1120.24 246.326 1119.88 245.943C1119.53 245.557 1119.04 245.364 1118.42 245.364C1117.99 245.364 1117.61 245.456 1117.27 245.642C1116.94 245.828 1116.67 246.098 1116.48 246.455C1116.29 246.811 1116.19 247.242 1116.19 247.75ZM1127.18 253.182C1126.46 253.182 1125.81 252.998 1125.26 252.631C1124.7 252.259 1124.27 251.737 1123.95 251.062C1123.64 250.384 1123.48 249.583 1123.48 248.659C1123.48 247.742 1123.64 246.947 1123.95 246.273C1124.27 245.598 1124.7 245.078 1125.26 244.71C1125.82 244.343 1126.47 244.159 1127.21 244.159C1127.77 244.159 1128.22 244.254 1128.55 244.443C1128.89 244.629 1129.14 244.841 1129.31 245.08C1129.49 245.314 1129.63 245.508 1129.73 245.659H1129.84V241.364H1131.18V253H1129.89V251.659H1129.73C1129.63 251.818 1129.49 252.019 1129.31 252.261C1129.13 252.5 1128.87 252.714 1128.53 252.903C1128.19 253.089 1127.74 253.182 1127.18 253.182ZM1127.37 251.977C1127.9 251.977 1128.36 251.837 1128.73 251.557C1129.1 251.273 1129.38 250.881 1129.58 250.381C1129.77 249.877 1129.87 249.295 1129.87 248.636C1129.87 247.985 1129.77 247.415 1129.58 246.926C1129.39 246.434 1129.11 246.051 1128.74 245.778C1128.37 245.502 1127.91 245.364 1127.37 245.364C1126.8 245.364 1126.32 245.509 1125.95 245.801C1125.57 246.089 1125.29 246.481 1125.1 246.977C1124.91 247.47 1124.82 248.023 1124.82 248.636C1124.82 249.258 1124.92 249.822 1125.1 250.33C1125.3 250.833 1125.58 251.235 1125.96 251.534C1126.34 251.83 1126.81 251.977 1127.37 251.977ZM1137.69 256.273V244.273H1138.98V245.659H1139.14C1139.24 245.508 1139.38 245.314 1139.55 245.08C1139.73 244.841 1139.98 244.629 1140.31 244.443C1140.64 244.254 1141.1 244.159 1141.66 244.159C1142.4 244.159 1143.05 244.343 1143.61 244.71C1144.17 245.078 1144.6 245.598 1144.92 246.273C1145.23 246.947 1145.39 247.742 1145.39 248.659C1145.39 249.583 1145.23 250.384 1144.92 251.062C1144.6 251.737 1144.17 252.259 1143.61 252.631C1143.06 252.998 1142.41 253.182 1141.69 253.182C1141.13 253.182 1140.68 253.089 1140.34 252.903C1140 252.714 1139.74 252.5 1139.56 252.261C1139.38 252.019 1139.24 251.818 1139.14 251.659H1139.03V256.273H1137.69ZM1139 248.636C1139 249.295 1139.1 249.877 1139.29 250.381C1139.49 250.881 1139.77 251.273 1140.14 251.557C1140.51 251.837 1140.97 251.977 1141.5 251.977C1142.06 251.977 1142.53 251.83 1142.91 251.534C1143.29 251.235 1143.57 250.833 1143.76 250.33C1143.95 249.822 1144.05 249.258 1144.05 248.636C1144.05 248.023 1143.95 247.47 1143.77 246.977C1143.58 246.481 1143.3 246.089 1142.92 245.801C1142.54 245.509 1142.07 245.364 1141.5 245.364C1140.96 245.364 1140.5 245.502 1140.13 245.778C1139.76 246.051 1139.48 246.434 1139.29 246.926C1139.1 247.415 1139 247.985 1139 248.636ZM1148.46 241.364V253H1147.12V241.364H1148.46ZM1153.16 253.205C1152.61 253.205 1152.11 253.1 1151.66 252.892C1151.2 252.68 1150.85 252.375 1150.58 251.977C1150.32 251.576 1150.18 251.091 1150.18 250.523C1150.18 250.023 1150.28 249.617 1150.48 249.307C1150.68 248.992 1150.94 248.746 1151.27 248.568C1151.6 248.39 1151.96 248.258 1152.36 248.17C1152.76 248.08 1153.16 248.008 1153.57 247.955C1154.1 247.886 1154.53 247.835 1154.86 247.801C1155.19 247.763 1155.44 247.701 1155.59 247.614C1155.74 247.527 1155.82 247.375 1155.82 247.159V247.114C1155.82 246.553 1155.67 246.117 1155.36 245.807C1155.06 245.496 1154.6 245.341 1153.98 245.341C1153.34 245.341 1152.84 245.481 1152.47 245.761C1152.11 246.042 1151.85 246.341 1151.71 246.659L1150.43 246.205C1150.66 245.674 1150.96 245.261 1151.34 244.966C1151.73 244.667 1152.14 244.458 1152.59 244.341C1153.05 244.22 1153.49 244.159 1153.93 244.159C1154.21 244.159 1154.54 244.193 1154.9 244.261C1155.27 244.326 1155.62 244.46 1155.96 244.665C1156.31 244.869 1156.59 245.178 1156.82 245.591C1157.05 246.004 1157.16 246.557 1157.16 247.25V253H1155.82V251.818H1155.75C1155.66 252.008 1155.51 252.21 1155.3 252.426C1155.09 252.642 1154.8 252.826 1154.45 252.977C1154.1 253.129 1153.67 253.205 1153.16 253.205ZM1153.37 252C1153.9 252 1154.34 251.896 1154.71 251.688C1155.07 251.479 1155.35 251.21 1155.54 250.881C1155.73 250.551 1155.82 250.205 1155.82 249.841V248.614C1155.76 248.682 1155.64 248.744 1155.45 248.801C1155.26 248.854 1155.04 248.902 1154.79 248.943C1154.54 248.981 1154.3 249.015 1154.06 249.045C1153.83 249.072 1153.65 249.095 1153.5 249.114C1153.15 249.159 1152.83 249.233 1152.52 249.335C1152.23 249.434 1151.98 249.583 1151.8 249.784C1151.62 249.981 1151.52 250.25 1151.52 250.591C1151.52 251.057 1151.7 251.409 1152.04 251.648C1152.39 251.883 1152.83 252 1153.37 252ZM1160.63 247.75V253H1159.29V244.273H1160.58V245.636H1160.7C1160.9 245.193 1161.21 244.837 1161.63 244.568C1162.05 244.295 1162.58 244.159 1163.24 244.159C1163.83 244.159 1164.35 244.28 1164.79 244.523C1165.24 244.761 1165.58 245.125 1165.83 245.614C1166.07 246.098 1166.2 246.712 1166.2 247.455V253H1164.86V247.545C1164.86 246.86 1164.68 246.326 1164.32 245.943C1163.97 245.557 1163.48 245.364 1162.86 245.364C1162.43 245.364 1162.05 245.456 1161.71 245.642C1161.38 245.828 1161.11 246.098 1160.92 246.455C1160.73 246.811 1160.63 247.242 1160.63 247.75ZM1175.08 253.205C1174.52 253.205 1174.02 253.1 1173.57 252.892C1173.12 252.68 1172.76 252.375 1172.5 251.977C1172.23 251.576 1172.1 251.091 1172.1 250.523C1172.1 250.023 1172.2 249.617 1172.39 249.307C1172.59 248.992 1172.85 248.746 1173.18 248.568C1173.51 248.39 1173.88 248.258 1174.27 248.17C1174.68 248.08 1175.08 248.008 1175.49 247.955C1176.02 247.886 1176.45 247.835 1176.77 247.801C1177.11 247.763 1177.35 247.701 1177.5 247.614C1177.66 247.527 1177.74 247.375 1177.74 247.159V247.114C1177.74 246.553 1177.58 246.117 1177.27 245.807C1176.97 245.496 1176.51 245.341 1175.89 245.341C1175.25 245.341 1174.75 245.481 1174.39 245.761C1174.02 246.042 1173.77 246.341 1173.62 246.659L1172.35 246.205C1172.58 245.674 1172.88 245.261 1173.26 244.966C1173.64 244.667 1174.06 244.458 1174.51 244.341C1174.96 244.22 1175.41 244.159 1175.85 244.159C1176.13 244.159 1176.45 244.193 1176.81 244.261C1177.18 244.326 1177.54 244.46 1177.88 244.665C1178.22 244.869 1178.51 245.178 1178.74 245.591C1178.96 246.004 1179.08 246.557 1179.08 247.25V253H1177.74V251.818H1177.67C1177.58 252.008 1177.42 252.21 1177.21 252.426C1177 252.642 1176.72 252.826 1176.37 252.977C1176.01 253.129 1175.58 253.205 1175.08 253.205ZM1175.28 252C1175.81 252 1176.26 251.896 1176.62 251.688C1176.99 251.479 1177.27 251.21 1177.45 250.881C1177.64 250.551 1177.74 250.205 1177.74 249.841V248.614C1177.68 248.682 1177.55 248.744 1177.36 248.801C1177.17 248.854 1176.95 248.902 1176.7 248.943C1176.45 248.981 1176.21 249.015 1175.98 249.045C1175.75 249.072 1175.56 249.095 1175.42 249.114C1175.07 249.159 1174.74 249.233 1174.44 249.335C1174.14 249.434 1173.9 249.583 1173.71 249.784C1173.53 249.981 1173.44 250.25 1173.44 250.591C1173.44 251.057 1173.61 251.409 1173.96 251.648C1174.31 251.883 1174.75 252 1175.28 252ZM1182.54 247.75V253H1181.2V244.273H1182.5V245.636H1182.61C1182.82 245.193 1183.13 244.837 1183.54 244.568C1183.96 244.295 1184.5 244.159 1185.16 244.159C1185.75 244.159 1186.27 244.28 1186.71 244.523C1187.15 244.761 1187.5 245.125 1187.74 245.614C1187.99 246.098 1188.11 246.712 1188.11 247.455V253H1186.77V247.545C1186.77 246.86 1186.59 246.326 1186.24 245.943C1185.88 245.557 1185.39 245.364 1184.77 245.364C1184.34 245.364 1183.96 245.456 1183.62 245.642C1183.29 245.828 1183.03 246.098 1182.83 246.455C1182.64 246.811 1182.54 247.242 1182.54 247.75ZM1193.54 253.182C1192.81 253.182 1192.17 252.998 1191.61 252.631C1191.06 252.259 1190.62 251.737 1190.31 251.062C1189.99 250.384 1189.83 249.583 1189.83 248.659C1189.83 247.742 1189.99 246.947 1190.31 246.273C1190.62 245.598 1191.06 245.078 1191.62 244.71C1192.18 244.343 1192.83 244.159 1193.56 244.159C1194.13 244.159 1194.58 244.254 1194.91 244.443C1195.24 244.629 1195.49 244.841 1195.67 245.08C1195.85 245.314 1195.99 245.508 1196.08 245.659H1196.2V241.364H1197.54V253H1196.24V251.659H1196.08C1195.99 251.818 1195.85 252.019 1195.66 252.261C1195.48 252.5 1195.22 252.714 1194.88 252.903C1194.55 253.089 1194.1 253.182 1193.54 253.182ZM1193.72 251.977C1194.26 251.977 1194.71 251.837 1195.08 251.557C1195.46 251.273 1195.74 250.881 1195.93 250.381C1196.12 249.877 1196.22 249.295 1196.22 248.636C1196.22 247.985 1196.13 247.415 1195.94 246.926C1195.75 246.434 1195.47 246.051 1195.1 245.778C1194.72 245.502 1194.27 245.364 1193.72 245.364C1193.15 245.364 1192.68 245.509 1192.3 245.801C1191.92 246.089 1191.64 246.481 1191.45 246.977C1191.27 247.47 1191.17 248.023 1191.17 248.636C1191.17 249.258 1191.27 249.822 1191.46 250.33C1191.65 250.833 1191.94 251.235 1192.31 251.534C1192.69 251.83 1193.16 251.977 1193.72 251.977ZM1207.59 253.182C1206.8 253.182 1206.11 252.994 1205.51 252.619C1204.92 252.244 1204.46 251.72 1204.13 251.045C1203.8 250.371 1203.63 249.583 1203.63 248.682C1203.63 247.773 1203.8 246.979 1204.13 246.301C1204.46 245.623 1204.92 245.097 1205.51 244.722C1206.11 244.347 1206.8 244.159 1207.59 244.159C1208.37 244.159 1209.06 244.347 1209.65 244.722C1210.25 245.097 1210.71 245.623 1211.04 246.301C1211.37 246.979 1211.54 247.773 1211.54 248.682C1211.54 249.583 1211.37 250.371 1211.04 251.045C1210.71 251.72 1210.25 252.244 1209.65 252.619C1209.06 252.994 1208.37 253.182 1207.59 253.182ZM1207.59 251.977C1208.18 251.977 1208.68 251.824 1209.06 251.517C1209.45 251.21 1209.74 250.807 1209.92 250.307C1210.11 249.807 1210.2 249.265 1210.2 248.682C1210.2 248.098 1210.11 247.555 1209.92 247.051C1209.74 246.547 1209.45 246.14 1209.06 245.83C1208.68 245.519 1208.18 245.364 1207.59 245.364C1206.99 245.364 1206.49 245.519 1206.11 245.83C1205.72 246.14 1205.44 246.547 1205.25 247.051C1205.07 247.555 1204.97 248.098 1204.97 248.682C1204.97 249.265 1205.07 249.807 1205.25 250.307C1205.44 250.807 1205.72 251.21 1206.11 251.517C1206.49 251.824 1206.99 251.977 1207.59 251.977ZM1218.77 249.432V244.273H1220.11V253H1218.77V251.523H1218.68C1218.47 251.966 1218.15 252.343 1217.72 252.653C1217.29 252.96 1216.74 253.114 1216.09 253.114C1215.54 253.114 1215.06 252.994 1214.63 252.756C1214.21 252.513 1213.87 252.15 1213.63 251.665C1213.39 251.176 1213.27 250.561 1213.27 249.818V244.273H1214.61V249.727C1214.61 250.364 1214.79 250.871 1215.14 251.25C1215.5 251.629 1215.96 251.818 1216.52 251.818C1216.85 251.818 1217.19 251.733 1217.53 251.562C1217.88 251.392 1218.17 251.131 1218.41 250.778C1218.65 250.426 1218.77 249.977 1218.77 249.432ZM1226.04 244.273V245.409H1221.52V244.273H1226.04ZM1222.84 242.182H1224.18V250.5C1224.18 250.879 1224.23 251.163 1224.34 251.352C1224.45 251.538 1224.6 251.663 1224.77 251.727C1224.95 251.788 1225.14 251.818 1225.34 251.818C1225.48 251.818 1225.6 251.811 1225.7 251.795C1225.79 251.777 1225.87 251.761 1225.93 251.75L1226.2 252.955C1226.11 252.989 1225.98 253.023 1225.82 253.057C1225.66 253.095 1225.45 253.114 1225.2 253.114C1224.82 253.114 1224.45 253.032 1224.09 252.869C1223.73 252.706 1223.43 252.458 1223.19 252.125C1222.95 251.792 1222.84 251.371 1222.84 250.864V242.182ZM1229.27 241.364V253H1227.92V241.364H1229.27ZM1231.4 253V244.273H1232.74V253H1231.4ZM1232.08 242.818C1231.82 242.818 1231.6 242.729 1231.41 242.551C1231.22 242.373 1231.13 242.159 1231.13 241.909C1231.13 241.659 1231.22 241.445 1231.41 241.267C1231.6 241.089 1231.82 241 1232.08 241C1232.34 241 1232.57 241.089 1232.75 241.267C1232.94 241.445 1233.04 241.659 1233.04 241.909C1233.04 242.159 1232.94 242.373 1232.75 242.551C1232.57 242.729 1232.34 242.818 1232.08 242.818ZM1236.22 247.75V253H1234.88V244.273H1236.17V245.636H1236.29C1236.49 245.193 1236.8 244.837 1237.22 244.568C1237.64 244.295 1238.17 244.159 1238.83 244.159C1239.42 244.159 1239.94 244.28 1240.38 244.523C1240.83 244.761 1241.17 245.125 1241.42 245.614C1241.66 246.098 1241.79 246.712 1241.79 247.455V253H1240.45V247.545C1240.45 246.86 1240.27 246.326 1239.91 245.943C1239.56 245.557 1239.07 245.364 1238.45 245.364C1238.02 245.364 1237.64 245.456 1237.3 245.642C1236.97 245.828 1236.7 246.098 1236.51 246.455C1236.32 246.811 1236.22 247.242 1236.22 247.75ZM1247.58 253.182C1246.74 253.182 1246.01 252.996 1245.4 252.625C1244.79 252.25 1244.33 251.727 1244 251.057C1243.67 250.383 1243.51 249.598 1243.51 248.705C1243.51 247.811 1243.67 247.023 1244 246.341C1244.33 245.655 1244.78 245.121 1245.37 244.739C1245.96 244.352 1246.65 244.159 1247.44 244.159C1247.89 244.159 1248.34 244.235 1248.79 244.386C1249.23 244.538 1249.63 244.784 1250 245.125C1250.36 245.462 1250.65 245.909 1250.87 246.466C1251.08 247.023 1251.19 247.708 1251.19 248.523V249.091H1244.46V247.932H1249.83C1249.83 247.439 1249.73 247 1249.53 246.614C1249.34 246.227 1249.06 245.922 1248.7 245.699C1248.35 245.475 1247.92 245.364 1247.44 245.364C1246.91 245.364 1246.44 245.496 1246.05 245.761C1245.67 246.023 1245.37 246.364 1245.16 246.784C1244.95 247.205 1244.85 247.655 1244.85 248.136V248.909C1244.85 249.568 1244.96 250.127 1245.19 250.585C1245.42 251.04 1245.74 251.386 1246.15 251.625C1246.56 251.86 1247.03 251.977 1247.58 251.977C1247.93 251.977 1248.25 251.928 1248.53 251.83C1248.82 251.727 1249.07 251.576 1249.28 251.375C1249.48 251.17 1249.64 250.917 1249.76 250.614L1251.05 250.977C1250.92 251.417 1250.69 251.803 1250.37 252.136C1250.04 252.466 1249.65 252.723 1249.17 252.909C1248.7 253.091 1248.17 253.182 1247.58 253.182ZM1009.75 286.455C1009.1 286.455 1008.55 286.371 1008.08 286.205C1007.61 286.042 1007.23 285.826 1006.91 285.557C1006.61 285.292 1006.36 285.008 1006.18 284.705L1007.25 283.955C1007.37 284.114 1007.52 284.295 1007.71 284.5C1007.9 284.708 1008.15 284.888 1008.47 285.04C1008.8 285.195 1009.22 285.273 1009.75 285.273C1010.45 285.273 1011.04 285.102 1011.49 284.761C1011.95 284.42 1012.18 283.886 1012.18 283.159V281.386H1012.07C1011.97 281.545 1011.83 281.742 1011.65 281.977C1011.47 282.208 1011.21 282.415 1010.88 282.597C1010.54 282.775 1010.09 282.864 1009.52 282.864C1008.82 282.864 1008.19 282.697 1007.62 282.364C1007.07 282.03 1006.63 281.545 1006.3 280.909C1005.98 280.273 1005.82 279.5 1005.82 278.591C1005.82 277.697 1005.98 276.919 1006.29 276.256C1006.6 275.589 1007.04 275.074 1007.6 274.71C1008.16 274.343 1008.81 274.159 1009.55 274.159C1010.11 274.159 1010.56 274.254 1010.9 274.443C1011.23 274.629 1011.49 274.841 1011.67 275.08C1011.85 275.314 1011.99 275.508 1012.09 275.659H1012.23V274.273H1013.52V283.25C1013.52 284 1013.35 284.61 1013.01 285.08C1012.67 285.553 1012.22 285.9 1011.65 286.119C1011.08 286.343 1010.45 286.455 1009.75 286.455ZM1009.7 281.659C1010.24 281.659 1010.7 281.536 1011.07 281.29C1011.44 281.044 1011.72 280.689 1011.91 280.227C1012.11 279.765 1012.2 279.212 1012.2 278.568C1012.2 277.939 1012.11 277.384 1011.92 276.903C1011.73 276.422 1011.45 276.045 1011.08 275.773C1010.71 275.5 1010.25 275.364 1009.7 275.364C1009.14 275.364 1008.66 275.508 1008.28 275.795C1007.91 276.083 1007.63 276.47 1007.44 276.955C1007.25 277.439 1007.16 277.977 1007.16 278.568C1007.16 279.174 1007.25 279.71 1007.44 280.176C1007.64 280.638 1007.92 281.002 1008.3 281.267C1008.67 281.528 1009.14 281.659 1009.7 281.659ZM1019.2 283.182C1018.41 283.182 1017.72 282.994 1017.13 282.619C1016.54 282.244 1016.08 281.72 1015.74 281.045C1015.41 280.371 1015.25 279.583 1015.25 278.682C1015.25 277.773 1015.41 276.979 1015.74 276.301C1016.08 275.623 1016.54 275.097 1017.13 274.722C1017.72 274.347 1018.41 274.159 1019.2 274.159C1019.99 274.159 1020.68 274.347 1021.27 274.722C1021.87 275.097 1022.33 275.623 1022.66 276.301C1022.99 276.979 1023.16 277.773 1023.16 278.682C1023.16 279.583 1022.99 280.371 1022.66 281.045C1022.33 281.72 1021.87 282.244 1021.27 282.619C1020.68 282.994 1019.99 283.182 1019.2 283.182ZM1019.2 281.977C1019.8 281.977 1020.29 281.824 1020.68 281.517C1021.07 281.21 1021.35 280.807 1021.54 280.307C1021.72 279.807 1021.82 279.265 1021.82 278.682C1021.82 278.098 1021.72 277.555 1021.54 277.051C1021.35 276.547 1021.07 276.14 1020.68 275.83C1020.29 275.519 1019.8 275.364 1019.2 275.364C1018.6 275.364 1018.11 275.519 1017.73 275.83C1017.34 276.14 1017.05 276.547 1016.87 277.051C1016.68 277.555 1016.59 278.098 1016.59 278.682C1016.59 279.265 1016.68 279.807 1016.87 280.307C1017.05 280.807 1017.34 281.21 1017.73 281.517C1018.11 281.824 1018.6 281.977 1019.2 281.977ZM1027.45 283.205C1026.9 283.205 1026.4 283.1 1025.95 282.892C1025.5 282.68 1025.14 282.375 1024.87 281.977C1024.61 281.576 1024.48 281.091 1024.48 280.523C1024.48 280.023 1024.57 279.617 1024.77 279.307C1024.97 278.992 1025.23 278.746 1025.56 278.568C1025.89 278.39 1026.25 278.258 1026.65 278.17C1027.05 278.08 1027.46 278.008 1027.86 277.955C1028.39 277.886 1028.82 277.835 1029.15 277.801C1029.48 277.763 1029.73 277.701 1029.88 277.614C1030.03 277.527 1030.11 277.375 1030.11 277.159V277.114C1030.11 276.553 1029.96 276.117 1029.65 275.807C1029.35 275.496 1028.89 275.341 1028.27 275.341C1027.63 275.341 1027.13 275.481 1026.76 275.761C1026.4 276.042 1026.15 276.341 1026 276.659L1024.73 276.205C1024.95 275.674 1025.26 275.261 1025.63 274.966C1026.02 274.667 1026.43 274.458 1026.88 274.341C1027.34 274.22 1027.79 274.159 1028.23 274.159C1028.51 274.159 1028.83 274.193 1029.19 274.261C1029.56 274.326 1029.91 274.46 1030.25 274.665C1030.6 274.869 1030.88 275.178 1031.11 275.591C1031.34 276.004 1031.45 276.557 1031.45 277.25V283H1030.11V281.818H1030.04C1029.95 282.008 1029.8 282.21 1029.59 282.426C1029.38 282.642 1029.09 282.826 1028.74 282.977C1028.39 283.129 1027.96 283.205 1027.45 283.205ZM1027.66 282C1028.19 282 1028.63 281.896 1029 281.688C1029.37 281.479 1029.64 281.21 1029.83 280.881C1030.02 280.551 1030.11 280.205 1030.11 279.841V278.614C1030.05 278.682 1029.93 278.744 1029.74 278.801C1029.55 278.854 1029.33 278.902 1029.08 278.943C1028.83 278.981 1028.59 279.015 1028.36 279.045C1028.12 279.072 1027.94 279.095 1027.79 279.114C1027.44 279.159 1027.12 279.233 1026.82 279.335C1026.52 279.434 1026.27 279.583 1026.09 279.784C1025.91 279.981 1025.82 280.25 1025.82 280.591C1025.82 281.057 1025.99 281.409 1026.33 281.648C1026.68 281.883 1027.12 282 1027.66 282ZM1034.92 271.364V283H1033.58V271.364H1034.92ZM1043.24 276.227L1042.03 276.568C1041.96 276.367 1041.85 276.172 1041.7 275.983C1041.55 275.79 1041.36 275.631 1041.11 275.506C1040.86 275.381 1040.54 275.318 1040.15 275.318C1039.61 275.318 1039.17 275.441 1038.81 275.688C1038.46 275.93 1038.28 276.239 1038.28 276.614C1038.28 276.947 1038.41 277.21 1038.65 277.403C1038.89 277.597 1039.27 277.758 1039.78 277.886L1041.08 278.205C1041.86 278.394 1042.44 278.684 1042.82 279.074C1043.21 279.46 1043.4 279.958 1043.4 280.568C1043.4 281.068 1043.25 281.515 1042.97 281.909C1042.68 282.303 1042.28 282.614 1041.77 282.841C1041.26 283.068 1040.67 283.182 1039.99 283.182C1039.1 283.182 1038.36 282.989 1037.78 282.602C1037.19 282.216 1036.83 281.652 1036.67 280.909L1037.94 280.591C1038.06 281.061 1038.29 281.413 1038.63 281.648C1038.97 281.883 1039.42 282 1039.97 282C1040.59 282 1041.09 281.867 1041.45 281.602C1041.83 281.333 1042.01 281.011 1042.01 280.636C1042.01 280.333 1041.91 280.08 1041.69 279.875C1041.48 279.667 1041.16 279.511 1040.72 279.409L1039.26 279.068C1038.46 278.879 1037.87 278.585 1037.5 278.188C1037.13 277.786 1036.94 277.284 1036.94 276.682C1036.94 276.189 1037.08 275.754 1037.36 275.375C1037.64 274.996 1038.02 274.699 1038.5 274.483C1038.98 274.267 1039.53 274.159 1040.15 274.159C1041.01 274.159 1041.69 274.348 1042.18 274.727C1042.68 275.106 1043.03 275.606 1043.24 276.227ZM1053.16 274.273V275.409H1048.46V274.273H1053.16ZM1049.87 283V273.068C1049.87 272.568 1049.98 272.152 1050.22 271.818C1050.45 271.485 1050.76 271.235 1051.13 271.068C1051.51 270.902 1051.9 270.818 1052.32 270.818C1052.65 270.818 1052.92 270.845 1053.13 270.898C1053.34 270.951 1053.49 271 1053.59 271.045L1053.21 272.205C1053.14 272.182 1053.04 272.153 1052.92 272.119C1052.81 272.085 1052.65 272.068 1052.46 272.068C1052.01 272.068 1051.69 272.18 1051.5 272.403C1051.3 272.627 1051.21 272.955 1051.21 273.386V283H1049.87ZM1057.91 283.182C1057.12 283.182 1056.43 282.994 1055.83 282.619C1055.24 282.244 1054.78 281.72 1054.45 281.045C1054.12 280.371 1053.95 279.583 1053.95 278.682C1053.95 277.773 1054.12 276.979 1054.45 276.301C1054.78 275.623 1055.24 275.097 1055.83 274.722C1056.43 274.347 1057.12 274.159 1057.91 274.159C1058.7 274.159 1059.38 274.347 1059.98 274.722C1060.57 275.097 1061.03 275.623 1061.36 276.301C1061.7 276.979 1061.86 277.773 1061.86 278.682C1061.86 279.583 1061.7 280.371 1061.36 281.045C1061.03 281.72 1060.57 282.244 1059.98 282.619C1059.38 282.994 1058.7 283.182 1057.91 283.182ZM1057.91 281.977C1058.51 281.977 1059 281.824 1059.38 281.517C1059.77 281.21 1060.06 280.807 1060.24 280.307C1060.43 279.807 1060.52 279.265 1060.52 278.682C1060.52 278.098 1060.43 277.555 1060.24 277.051C1060.06 276.547 1059.77 276.14 1059.38 275.83C1059 275.519 1058.51 275.364 1057.91 275.364C1057.31 275.364 1056.82 275.519 1056.43 275.83C1056.04 276.14 1055.76 276.547 1055.57 277.051C1055.39 277.555 1055.29 278.098 1055.29 278.682C1055.29 279.265 1055.39 279.807 1055.57 280.307C1055.76 280.807 1056.04 281.21 1056.43 281.517C1056.82 281.824 1057.31 281.977 1057.91 281.977ZM1063.59 283V274.273H1064.88V275.591H1064.98C1065.13 275.159 1065.42 274.809 1065.84 274.54C1066.26 274.271 1066.73 274.136 1067.25 274.136C1067.35 274.136 1067.47 274.138 1067.62 274.142C1067.77 274.146 1067.88 274.152 1067.95 274.159V275.523C1067.91 275.511 1067.8 275.494 1067.64 275.472C1067.48 275.445 1067.31 275.432 1067.13 275.432C1066.71 275.432 1066.33 275.521 1066 275.699C1065.67 275.873 1065.41 276.116 1065.21 276.426C1065.02 276.733 1064.93 277.083 1064.93 277.477V283H1063.59ZM1077.2 274.273V275.409H1072.68V274.273H1077.2ZM1073.99 272.182H1075.33V280.5C1075.33 280.879 1075.39 281.163 1075.5 281.352C1075.61 281.538 1075.76 281.663 1075.93 281.727C1076.11 281.788 1076.3 281.818 1076.49 281.818C1076.64 281.818 1076.76 281.811 1076.86 281.795C1076.95 281.777 1077.03 281.761 1077.08 281.75L1077.36 282.955C1077.27 282.989 1077.14 283.023 1076.98 283.057C1076.81 283.095 1076.61 283.114 1076.36 283.114C1075.98 283.114 1075.61 283.032 1075.24 282.869C1074.88 282.706 1074.58 282.458 1074.35 282.125C1074.11 281.792 1073.99 281.371 1073.99 280.864V272.182ZM1080.42 277.75V283H1079.08V271.364H1080.42V275.636H1080.54C1080.74 275.186 1081.05 274.828 1081.46 274.562C1081.87 274.294 1082.42 274.159 1083.11 274.159C1083.7 274.159 1084.22 274.278 1084.67 274.517C1085.11 274.752 1085.46 275.114 1085.71 275.602C1085.96 276.087 1086.08 276.705 1086.08 277.455V283H1084.74V277.545C1084.74 276.852 1084.56 276.316 1084.2 275.938C1083.85 275.555 1083.35 275.364 1082.72 275.364C1082.28 275.364 1081.89 275.456 1081.54 275.642C1081.19 275.828 1080.92 276.098 1080.72 276.455C1080.52 276.811 1080.42 277.242 1080.42 277.75ZM1091.87 283.182C1091.03 283.182 1090.31 282.996 1089.7 282.625C1089.09 282.25 1088.62 281.727 1088.29 281.057C1087.97 280.383 1087.81 279.598 1087.81 278.705C1087.81 277.811 1087.97 277.023 1088.29 276.341C1088.62 275.655 1089.08 275.121 1089.67 274.739C1090.26 274.352 1090.95 274.159 1091.74 274.159C1092.19 274.159 1092.64 274.235 1093.08 274.386C1093.53 274.538 1093.93 274.784 1094.29 275.125C1094.66 275.462 1094.95 275.909 1095.16 276.466C1095.38 277.023 1095.49 277.708 1095.49 278.523V279.091H1088.76V277.932H1094.12C1094.12 277.439 1094.03 277 1093.83 276.614C1093.64 276.227 1093.36 275.922 1093 275.699C1092.64 275.475 1092.22 275.364 1091.74 275.364C1091.2 275.364 1090.74 275.496 1090.35 275.761C1089.97 276.023 1089.67 276.364 1089.46 276.784C1089.25 277.205 1089.15 277.655 1089.15 278.136V278.909C1089.15 279.568 1089.26 280.127 1089.49 280.585C1089.72 281.04 1090.04 281.386 1090.45 281.625C1090.86 281.86 1091.33 281.977 1091.87 281.977C1092.23 281.977 1092.54 281.928 1092.83 281.83C1093.12 281.727 1093.37 281.576 1093.57 281.375C1093.78 281.17 1093.94 280.917 1094.06 280.614L1095.35 280.977C1095.22 281.417 1094.99 281.803 1094.66 282.136C1094.34 282.466 1093.94 282.723 1093.47 282.909C1093 283.091 1092.47 283.182 1091.87 283.182ZM1106.89 279.432V274.273H1108.23V283H1106.89V281.523H1106.8C1106.59 281.966 1106.27 282.343 1105.84 282.653C1105.41 282.96 1104.87 283.114 1104.21 283.114C1103.66 283.114 1103.18 282.994 1102.75 282.756C1102.33 282.513 1101.99 282.15 1101.75 281.665C1101.51 281.176 1101.39 280.561 1101.39 279.818V274.273H1102.73V279.727C1102.73 280.364 1102.91 280.871 1103.26 281.25C1103.62 281.629 1104.08 281.818 1104.64 281.818C1104.97 281.818 1105.31 281.733 1105.65 281.562C1106 281.392 1106.3 281.131 1106.53 280.778C1106.77 280.426 1106.89 279.977 1106.89 279.432ZM1110.36 286.273V274.273H1111.66V275.659H1111.82C1111.92 275.508 1112.05 275.314 1112.23 275.08C1112.41 274.841 1112.66 274.629 1112.99 274.443C1113.32 274.254 1113.77 274.159 1114.34 274.159C1115.08 274.159 1115.72 274.343 1116.29 274.71C1116.85 275.078 1117.28 275.598 1117.6 276.273C1117.91 276.947 1118.07 277.742 1118.07 278.659C1118.07 279.583 1117.91 280.384 1117.6 281.062C1117.28 281.737 1116.85 282.259 1116.29 282.631C1115.73 282.998 1115.09 283.182 1114.36 283.182C1113.8 283.182 1113.36 283.089 1113.02 282.903C1112.68 282.714 1112.42 282.5 1112.24 282.261C1112.06 282.019 1111.92 281.818 1111.82 281.659H1111.71V286.273H1110.36ZM1111.68 278.636C1111.68 279.295 1111.78 279.877 1111.97 280.381C1112.17 280.881 1112.45 281.273 1112.82 281.557C1113.19 281.837 1113.65 281.977 1114.18 281.977C1114.74 281.977 1115.21 281.83 1115.59 281.534C1115.97 281.235 1116.25 280.833 1116.44 280.33C1116.63 279.822 1116.73 279.258 1116.73 278.636C1116.73 278.023 1116.63 277.47 1116.44 276.977C1116.26 276.481 1115.98 276.089 1115.6 275.801C1115.22 275.509 1114.75 275.364 1114.18 275.364C1113.64 275.364 1113.18 275.502 1112.81 275.778C1112.44 276.051 1112.16 276.434 1111.97 276.926C1111.78 277.415 1111.68 277.985 1111.68 278.636ZM1123.34 283.182C1122.52 283.182 1121.82 282.989 1121.23 282.602C1120.64 282.216 1120.18 281.684 1119.86 281.006C1119.54 280.328 1119.39 279.553 1119.39 278.682C1119.39 277.795 1119.55 277.013 1119.87 276.335C1120.2 275.653 1120.66 275.121 1121.25 274.739C1121.84 274.352 1122.53 274.159 1123.32 274.159C1123.93 274.159 1124.48 274.273 1124.98 274.5C1125.47 274.727 1125.87 275.045 1126.19 275.455C1126.5 275.864 1126.7 276.341 1126.77 276.886H1125.43C1125.33 276.489 1125.1 276.136 1124.75 275.83C1124.4 275.519 1123.93 275.364 1123.34 275.364C1122.82 275.364 1122.36 275.5 1121.97 275.773C1121.58 276.042 1121.27 276.422 1121.05 276.915C1120.83 277.403 1120.73 277.977 1120.73 278.636C1120.73 279.311 1120.83 279.898 1121.04 280.398C1121.26 280.898 1121.56 281.286 1121.95 281.562C1122.35 281.839 1122.81 281.977 1123.34 281.977C1123.69 281.977 1124 281.917 1124.29 281.795C1124.57 281.674 1124.81 281.5 1125.01 281.273C1125.21 281.045 1125.35 280.773 1125.43 280.455H1126.77C1126.7 280.97 1126.51 281.434 1126.21 281.847C1125.91 282.256 1125.52 282.581 1125.03 282.824C1124.55 283.062 1123.98 283.182 1123.34 283.182ZM1131.96 283.182C1131.17 283.182 1130.48 282.994 1129.88 282.619C1129.29 282.244 1128.83 281.72 1128.5 281.045C1128.17 280.371 1128 279.583 1128 278.682C1128 277.773 1128.17 276.979 1128.5 276.301C1128.83 275.623 1129.29 275.097 1129.88 274.722C1130.48 274.347 1131.17 274.159 1131.96 274.159C1132.75 274.159 1133.43 274.347 1134.03 274.722C1134.62 275.097 1135.08 275.623 1135.41 276.301C1135.75 276.979 1135.91 277.773 1135.91 278.682C1135.91 279.583 1135.75 280.371 1135.41 281.045C1135.08 281.72 1134.62 282.244 1134.03 282.619C1133.43 282.994 1132.75 283.182 1131.96 283.182ZM1131.96 281.977C1132.56 281.977 1133.05 281.824 1133.43 281.517C1133.82 281.21 1134.11 280.807 1134.29 280.307C1134.48 279.807 1134.57 279.265 1134.57 278.682C1134.57 278.098 1134.48 277.555 1134.29 277.051C1134.11 276.547 1133.82 276.14 1133.43 275.83C1133.05 275.519 1132.56 275.364 1131.96 275.364C1131.36 275.364 1130.87 275.519 1130.48 275.83C1130.09 276.14 1129.81 276.547 1129.62 277.051C1129.44 277.555 1129.34 278.098 1129.34 278.682C1129.34 279.265 1129.44 279.807 1129.62 280.307C1129.81 280.807 1130.09 281.21 1130.48 281.517C1130.87 281.824 1131.36 281.977 1131.96 281.977ZM1137.64 283V274.273H1138.93V275.636H1139.05C1139.23 275.17 1139.52 274.809 1139.93 274.551C1140.33 274.29 1140.82 274.159 1141.39 274.159C1141.96 274.159 1142.44 274.29 1142.83 274.551C1143.21 274.809 1143.51 275.17 1143.73 275.636H1143.82C1144.04 275.186 1144.38 274.828 1144.83 274.562C1145.27 274.294 1145.81 274.159 1146.43 274.159C1147.21 274.159 1147.85 274.403 1148.35 274.892C1148.85 275.377 1149.09 276.133 1149.09 277.159V283H1147.75V277.159C1147.75 276.515 1147.58 276.055 1147.22 275.778C1146.87 275.502 1146.46 275.364 1145.98 275.364C1145.37 275.364 1144.89 275.549 1144.55 275.92C1144.22 276.288 1144.05 276.754 1144.05 277.318V283H1142.68V277.023C1142.68 276.527 1142.52 276.127 1142.2 275.824C1141.88 275.517 1141.46 275.364 1140.96 275.364C1140.61 275.364 1140.28 275.456 1139.98 275.642C1139.68 275.828 1139.44 276.085 1139.25 276.415C1139.07 276.741 1138.98 277.117 1138.98 277.545V283H1137.64ZM1151.23 283V274.273H1152.57V283H1151.23ZM1151.91 272.818C1151.65 272.818 1151.42 272.729 1151.23 272.551C1151.05 272.373 1150.95 272.159 1150.95 271.909C1150.95 271.659 1151.05 271.445 1151.23 271.267C1151.42 271.089 1151.65 271 1151.91 271C1152.17 271 1152.39 271.089 1152.58 271.267C1152.77 271.445 1152.86 271.659 1152.86 271.909C1152.86 272.159 1152.77 272.373 1152.58 272.551C1152.39 272.729 1152.17 272.818 1151.91 272.818ZM1156.04 277.75V283H1154.7V274.273H1156V275.636H1156.11C1156.32 275.193 1156.63 274.837 1157.04 274.568C1157.46 274.295 1158 274.159 1158.66 274.159C1159.25 274.159 1159.76 274.28 1160.21 274.523C1160.65 274.761 1161 275.125 1161.24 275.614C1161.49 276.098 1161.61 276.712 1161.61 277.455V283H1160.27V277.545C1160.27 276.86 1160.09 276.326 1159.74 275.943C1159.38 275.557 1158.89 275.364 1158.27 275.364C1157.84 275.364 1157.46 275.456 1157.12 275.642C1156.79 275.828 1156.53 276.098 1156.33 276.455C1156.14 276.811 1156.04 277.242 1156.04 277.75ZM1167.26 286.455C1166.62 286.455 1166.06 286.371 1165.59 286.205C1165.13 286.042 1164.74 285.826 1164.43 285.557C1164.12 285.292 1163.88 285.008 1163.7 284.705L1164.76 283.955C1164.89 284.114 1165.04 284.295 1165.22 284.5C1165.41 284.708 1165.66 284.888 1165.99 285.04C1166.31 285.195 1166.74 285.273 1167.26 285.273C1167.97 285.273 1168.55 285.102 1169.01 284.761C1169.47 284.42 1169.7 283.886 1169.7 283.159V281.386H1169.58C1169.48 281.545 1169.34 281.742 1169.16 281.977C1168.98 282.208 1168.73 282.415 1168.39 282.597C1168.06 282.775 1167.61 282.864 1167.04 282.864C1166.33 282.864 1165.7 282.697 1165.14 282.364C1164.58 282.03 1164.14 281.545 1163.82 280.909C1163.49 280.273 1163.33 279.5 1163.33 278.591C1163.33 277.697 1163.49 276.919 1163.8 276.256C1164.12 275.589 1164.56 275.074 1165.12 274.71C1165.68 274.343 1166.32 274.159 1167.06 274.159C1167.63 274.159 1168.08 274.254 1168.41 274.443C1168.75 274.629 1169.01 274.841 1169.18 275.08C1169.37 275.314 1169.51 275.508 1169.61 275.659H1169.74V274.273H1171.04V283.25C1171.04 284 1170.87 284.61 1170.53 285.08C1170.19 285.553 1169.73 285.9 1169.16 286.119C1168.59 286.343 1167.96 286.455 1167.26 286.455ZM1167.22 281.659C1167.76 281.659 1168.21 281.536 1168.58 281.29C1168.95 281.044 1169.24 280.689 1169.43 280.227C1169.62 279.765 1169.72 279.212 1169.72 278.568C1169.72 277.939 1169.62 277.384 1169.43 276.903C1169.25 276.422 1168.97 276.045 1168.59 275.773C1168.22 275.5 1167.76 275.364 1167.22 275.364C1166.65 275.364 1166.18 275.508 1165.8 275.795C1165.42 276.083 1165.14 276.47 1164.95 276.955C1164.77 277.439 1164.67 277.977 1164.67 278.568C1164.67 279.174 1164.77 279.71 1164.96 280.176C1165.15 280.638 1165.43 281.002 1165.81 281.267C1166.19 281.528 1166.66 281.659 1167.22 281.659ZM1178.22 286.273C1177.99 286.273 1177.79 286.254 1177.61 286.216C1177.43 286.182 1177.31 286.148 1177.24 286.114L1177.58 284.932C1177.9 285.015 1178.19 285.045 1178.44 285.023C1178.69 285 1178.91 284.888 1179.11 284.688C1179.3 284.491 1179.48 284.17 1179.65 283.727L1179.9 283.045L1176.67 274.273H1178.12L1180.53 281.227H1180.62L1183.03 274.273H1184.49L1180.78 284.273C1180.62 284.723 1180.41 285.097 1180.16 285.392C1179.92 285.691 1179.63 285.913 1179.31 286.057C1178.98 286.201 1178.62 286.273 1178.22 286.273ZM1189.28 283.182C1188.44 283.182 1187.72 282.996 1187.11 282.625C1186.5 282.25 1186.03 281.727 1185.7 281.057C1185.38 280.383 1185.22 279.598 1185.22 278.705C1185.22 277.811 1185.38 277.023 1185.7 276.341C1186.03 275.655 1186.49 275.121 1187.08 274.739C1187.67 274.352 1188.36 274.159 1189.15 274.159C1189.6 274.159 1190.05 274.235 1190.49 274.386C1190.94 274.538 1191.34 274.784 1191.7 275.125C1192.07 275.462 1192.36 275.909 1192.57 276.466C1192.79 277.023 1192.9 277.708 1192.9 278.523V279.091H1186.17V277.932H1191.53C1191.53 277.439 1191.44 277 1191.24 276.614C1191.05 276.227 1190.77 275.922 1190.41 275.699C1190.05 275.475 1189.63 275.364 1189.15 275.364C1188.61 275.364 1188.15 275.496 1187.76 275.761C1187.38 276.023 1187.08 276.364 1186.87 276.784C1186.66 277.205 1186.56 277.655 1186.56 278.136V278.909C1186.56 279.568 1186.67 280.127 1186.9 280.585C1187.13 281.04 1187.45 281.386 1187.86 281.625C1188.27 281.86 1188.74 281.977 1189.28 281.977C1189.64 281.977 1189.95 281.928 1190.24 281.83C1190.53 281.727 1190.78 281.576 1190.98 281.375C1191.19 281.17 1191.35 280.917 1191.47 280.614L1192.76 280.977C1192.63 281.417 1192.4 281.803 1192.07 282.136C1191.75 282.466 1191.35 282.723 1190.88 282.909C1190.41 283.091 1189.88 283.182 1189.28 283.182ZM1197.19 283.205C1196.63 283.205 1196.13 283.1 1195.68 282.892C1195.23 282.68 1194.87 282.375 1194.61 281.977C1194.34 281.576 1194.21 281.091 1194.21 280.523C1194.21 280.023 1194.31 279.617 1194.5 279.307C1194.7 278.992 1194.96 278.746 1195.29 278.568C1195.62 278.39 1195.99 278.258 1196.38 278.17C1196.79 278.08 1197.19 278.008 1197.6 277.955C1198.13 277.886 1198.56 277.835 1198.88 277.801C1199.22 277.763 1199.46 277.701 1199.61 277.614C1199.77 277.527 1199.85 277.375 1199.85 277.159V277.114C1199.85 276.553 1199.69 276.117 1199.38 275.807C1199.08 275.496 1198.62 275.341 1198 275.341C1197.36 275.341 1196.86 275.481 1196.5 275.761C1196.13 276.042 1195.88 276.341 1195.73 276.659L1194.46 276.205C1194.69 275.674 1194.99 275.261 1195.37 274.966C1195.75 274.667 1196.17 274.458 1196.62 274.341C1197.07 274.22 1197.52 274.159 1197.96 274.159C1198.24 274.159 1198.56 274.193 1198.92 274.261C1199.29 274.326 1199.65 274.46 1199.99 274.665C1200.33 274.869 1200.62 275.178 1200.85 275.591C1201.07 276.004 1201.19 276.557 1201.19 277.25V283H1199.85V281.818H1199.78C1199.69 282.008 1199.53 282.21 1199.32 282.426C1199.11 282.642 1198.83 282.826 1198.48 282.977C1198.12 283.129 1197.69 283.205 1197.19 283.205ZM1197.39 282C1197.92 282 1198.37 281.896 1198.73 281.688C1199.1 281.479 1199.38 281.21 1199.56 280.881C1199.75 280.551 1199.85 280.205 1199.85 279.841V278.614C1199.79 278.682 1199.66 278.744 1199.47 278.801C1199.28 278.854 1199.06 278.902 1198.81 278.943C1198.56 278.981 1198.32 279.015 1198.09 279.045C1197.86 279.072 1197.67 279.095 1197.53 279.114C1197.18 279.159 1196.85 279.233 1196.55 279.335C1196.25 279.434 1196.01 279.583 1195.82 279.784C1195.64 279.981 1195.55 280.25 1195.55 280.591C1195.55 281.057 1195.72 281.409 1196.07 281.648C1196.42 281.883 1196.86 282 1197.39 282ZM1203.31 283V274.273H1204.61V275.591H1204.7C1204.86 275.159 1205.15 274.809 1205.56 274.54C1205.98 274.271 1206.45 274.136 1206.97 274.136C1207.07 274.136 1207.19 274.138 1207.34 274.142C1207.49 274.146 1207.6 274.152 1207.68 274.159V275.523C1207.63 275.511 1207.53 275.494 1207.36 275.472C1207.21 275.445 1207.04 275.432 1206.86 275.432C1206.43 275.432 1206.06 275.521 1205.72 275.699C1205.39 275.873 1205.13 276.116 1204.94 276.426C1204.75 276.733 1204.65 277.083 1204.65 277.477V283H1203.31ZM1208.92 283.091C1208.64 283.091 1208.4 282.991 1208.2 282.79C1208 282.589 1207.9 282.348 1207.9 282.068C1207.9 281.788 1208 281.547 1208.2 281.347C1208.4 281.146 1208.64 281.045 1208.92 281.045C1209.2 281.045 1209.44 281.146 1209.65 281.347C1209.85 281.547 1209.95 281.788 1209.95 282.068C1209.95 282.254 1209.9 282.424 1209.8 282.58C1209.71 282.735 1209.59 282.86 1209.44 282.955C1209.28 283.045 1209.11 283.091 1208.92 283.091Z" fill="black"/> +<rect x="1004" y="17" width="64" height="64" rx="20" fill="white"/> +<rect x="1024" y="37" width="23" height="23" rx="10" fill="#FEDD3E"/> +<defs> +<filter id="filter0_d_35_4221" x="0.499817" y="43.7036" width="1070" height="448.255" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> +<feOffset dy="24"/> +<feGaussianBlur stdDeviation="12"/> +<feComposite in2="hardAlpha" operator="out"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.24 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_35_4221"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_35_4221" result="shape"/> +</filter> +</defs> +</svg> diff --git a/client/src/App.css b/client/src/App.css new file mode 100644 index 0000000..6286d19 --- /dev/null +++ b/client/src/App.css @@ -0,0 +1,86 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* #root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} */ + +*{ + scroll-behavior: smooth; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + +/* AgentGallery styles */ +.perspective { + perspective: 2000px; +} + +.preserve-3d { + transform-style: preserve-3d; +} + +.backface-hidden { + backface-visibility: hidden; +} + +.rotate-y-180 { + transform: rotateY(180deg); +} + +/* Custom scrollbar for webkit browsers */ +::-webkit-scrollbar { + width: 6px; +} + +::-webkit-scrollbar-track { + background: rgba(128, 90, 213, 0.1); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb { + background: rgba(128, 90, 213, 0.3); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(128, 90, 213, 0.5); +} diff --git a/client/src/App.tsx b/client/src/App.tsx new file mode 100644 index 0000000..1b46991 --- /dev/null +++ b/client/src/App.tsx @@ -0,0 +1,66 @@ +import { Routes, Route, Link, useLocation, Navigate } from "react-router-dom"; +import Home from "./pages/Home"; +import AgentCreator from "./pages/AgentCreator"; +import ChatToAgent from "./pages/ChatToAgent"; +import AgentGallery from "./pages/AgentGallery"; +import { usePrivy, useSolanaWallets } from '@privy-io/react-auth'; +import "./App.css"; + +// Protected Route wrapper component +const ProtectedRoute = ({ children }: { children: React.ReactNode }) => { + const { authenticated } = usePrivy(); + const { wallets } = useSolanaWallets() + console.log(wallets[0]); + if (!authenticated && wallets.length===0) { + return <Navigate to="/" replace />; + } + + return <>{children}</>; +}; + +function App() { + const location = useLocation(); + const { authenticated } = usePrivy(); + + // Helper function to determine if link is active + const isActive = (path: string) => location.pathname === path; + + return ( + <div id="root" className="min-h-screen font-roboto"> + <main> + <Routes> + {/* Public route */} + <Route path="/" element={<Home />} /> + + {/* Protected routes */} + <Route + path="/create-agent" + element={ + <ProtectedRoute> + <AgentCreator /> + </ProtectedRoute> + } + /> + <Route + path="/browse-agents" + element={ + <ProtectedRoute> + <AgentGallery /> + </ProtectedRoute> + } + /> + <Route + path="/chat" + element={ + <ProtectedRoute> + <ChatToAgent /> + </ProtectedRoute> + } + /> + </Routes> + </main> + </div> + ); +} + +export default App; \ No newline at end of file diff --git a/client/src/api/agentsAPI.ts b/client/src/api/agentsAPI.ts new file mode 100644 index 0000000..b046e7b --- /dev/null +++ b/client/src/api/agentsAPI.ts @@ -0,0 +1,192 @@ +const BASE_URL = "https://b804o8s04cwkg80skgcwsw04.dev3vds1.link/api"; // Your Flask API base URL +// const BASE_URL = "http://localhost:8080/api"; + +// Function to get all agents +export async function getAgents() { + const response = await fetch(`${BASE_URL}/agents`); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + +// Function to create a new agent +export async function createAgent(agentData: any) { + // If the agentData comes in as an Agent object, we need to drill down into the agent one level + // This allows us to process both Agent and non-agent type objects + if (agentData.agent) { + agentData = agentData.agent; + } + + const response = await fetch(`${BASE_URL}/agents`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(agentData), + }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + +// Function to get all characters +export async function getCharacters() { + const response = await fetch(`${BASE_URL}/characters`); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + + // Return the data directly + return data; // Returns an array of the characters +} + +// Function to create a random agent +export async function createRandomAgent(concept?: string) { + const response = await fetch(`${BASE_URL}/agents/random`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ concept }), + }); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + +// Function to send a chat message to an agent +export async function sendChatMessage( + masterFilePath: string, + message: string, + chatHistory: any +) { + const response = await fetch(`${BASE_URL}/agents/chat`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + prompt: message, + master_file_path: masterFilePath, + chat_history: chatHistory, + }), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + +// Function to get chat history for an agent +export async function getChatHistory(masterFilePath: string) { + const response = await fetch( + `${BASE_URL}/agents/chat-history?master_file_path=${encodeURIComponent( + masterFilePath + )}` + ); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + +// Function to create a new season +export async function createSeason( + masterFilePath: string, + numberOfEpisodes: number = 3 +) { + const response = await fetch(`${BASE_URL}/agents/seasons`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + master_file_path: masterFilePath, + number_of_episodes: numberOfEpisodes, + }), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + +// Function to create posts for episodes +export async function createEpisodePosts( + masterFilePath: string, + numberOfPosts: number = 6 +) { + const response = await fetch(`${BASE_URL}/agents/episodes/posts`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + master_file_path: masterFilePath, + number_of_posts: numberOfPosts, + }), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + + +// Function to start the post manager +export async function startPostManager(agentName: string) { + const response = await fetch(`${BASE_URL}/start-post-manager/twitter`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ agent_name: agentName }), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + +// Function to post to twitter +export async function postToTwitter(masterData: any, content: string) { + const response = await fetch(`${BASE_URL}/post-to-twitter`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + master_data: masterData, + content: content + }), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} + +export async function updateSeasons(agentName: string, seasons: any[]) { + const response = await fetch(`${BASE_URL}/agents/update-seasons`, { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + agent_name: agentName, + seasons: seasons, + }), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return await response.json(); +} diff --git a/client/src/api/leonardoApi.ts b/client/src/api/leonardoApi.ts new file mode 100644 index 0000000..10a4319 --- /dev/null +++ b/client/src/api/leonardoApi.ts @@ -0,0 +1,31 @@ +import { LambdaPayload } from "../interfaces/LeonardoInterfaces"; + +const getInconsistentImageLambdaUrl = "https://46i9cnowhh.execute-api.us-east-1.amazonaws.com/getImageInconsistent" + +// Function to call the AWS Lambda +export async function inconsistentImageLambda(payload: LambdaPayload): Promise<any> { + const url = getInconsistentImageLambdaUrl; + + try { + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(payload) + + }); + + if (!response.ok) { + const errorText = await response.text(); + console.error(`HTTP error! Status: ${response.status}, Response: ${errorText}`); + throw new Error(`HTTP error! Status: ${response.status}`); + } + + const data = await response.json(); + return data; + } catch (error) { + console.error('Error calling Lambda:', error); + throw error; + } +} diff --git a/client/src/assets/agent-images/agent1.jpg b/client/src/assets/agent-images/agent1.jpg new file mode 100644 index 0000000..3e35d0f Binary files /dev/null and b/client/src/assets/agent-images/agent1.jpg differ diff --git a/client/src/assets/agent-images/agent2.jpg b/client/src/assets/agent-images/agent2.jpg new file mode 100644 index 0000000..c363176 Binary files /dev/null and b/client/src/assets/agent-images/agent2.jpg differ diff --git a/client/src/assets/agent-images/agent3.jpg b/client/src/assets/agent-images/agent3.jpg new file mode 100644 index 0000000..3011e35 Binary files /dev/null and b/client/src/assets/agent-images/agent3.jpg differ diff --git a/client/src/assets/agent-images/agent4.jpg b/client/src/assets/agent-images/agent4.jpg new file mode 100644 index 0000000..95d9fdf Binary files /dev/null and b/client/src/assets/agent-images/agent4.jpg differ diff --git a/client/src/assets/araiBannerTransarent.png b/client/src/assets/araiBannerTransarent.png new file mode 100644 index 0000000..6ea96df Binary files /dev/null and b/client/src/assets/araiBannerTransarent.png differ diff --git a/client/src/assets/araiLogo.png b/client/src/assets/araiLogo.png new file mode 100644 index 0000000..8d2b05a Binary files /dev/null and b/client/src/assets/araiLogo.png differ diff --git a/client/src/assets/example-agents/Cosmic_Curator_master.json b/client/src/assets/example-agents/Cosmic_Curator_master.json new file mode 100644 index 0000000..b2bcea9 --- /dev/null +++ b/client/src/assets/example-agents/Cosmic_Curator_master.json @@ -0,0 +1,120 @@ +{ + "concept": "Create a name and try to incorporate the Time-traveling Doctor into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter C ", + "agent": { + "agent_details": { + "name": "Cosmic Curator", + "personality": [ + "inquisitive", + "enigmatic", + "analytical", + "whimsical", + "determined", + "wise", + "patient" + ], + "communication_style": [ + "cryptic", + "poetic", + "metaphorical", + "uses rhetorical questions", + "incorporates historical and scientific facts", + "precise", + "measured" + ], + "backstory": "Once a celebrated historian in a futuristic society obsessed with preserving the past, the Cosmic Curator became disillusioned with the rigid and unchanging nature of his world. After stumbling upon a hidden archive containing fragments of forbidden knowledge about time travel, he dedicated himself to mastering this lost art. Through years of clandestine research and experimentation, he constructed a unique device – the Chrono-Compendium – capable of navigating the vast tapestry of time. Now, he travels through history, not to change it, but to observe, document, and curate the most pivotal moments, ensuring that the true essence of the past is never forgotten. He walks a fine line, however, as his actions could inadvertently alter the timeline he is sworn to protect.", + "universe": "The Cosmic Curator operates in a multiverse where time is a fluid, navigable dimension, accessible through advanced technology. His home era is a distant future where society has achieved technological utopia but has become culturally stagnant, valuing the preservation of the past above all else. This future is governed by the Chronomasters, an order dedicated to maintaining the stability of the timeline. Outside his home era, the Curator ventures into a myriad of historical periods and alternate realities, each with its own unique laws of physics, societies, and potential dangers. Powerful organizations like the Temporal Guard, who seek to exploit time travel for their own gain, and the enigmatic Void Walkers, beings who exist outside of time, populate this multiverse.", + "topic_expertise": [ + "time travel", + "history", + "archaeology", + "temporal paradoxes", + "alternate realities", + "cultural preservation" + ], + "hashtags": [], + "emojis": [ + "⏳", + "🕰️", + "📚", + "🌌", + "🔍", + "✍️", + "🌎" + ], + "concept": "Create a name and try to incorporate the Time-traveling Doctor into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter C " + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/462b6ab4-fa5d-41b4-9c5f-a04bb506726b/Leonardo_Anime_XL_Create_a_name_and_try_to_incorporate_the_Tim_0.jpg", + "image_id": "3c5b1e28-9221-43dc-b7ca-274abf8796e6", + "generationId": "462b6ab4-fa5d-41b4-9c5f-a04bb506726b" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/462b6ab4-fa5d-41b4-9c5f-a04bb506726b/Leonardo_Anime_XL_Create_a_name_and_try_to_incorporate_the_Tim_0.jpg", + "nsfw": false, + "id": "3c5b1e28-9221-43dc-b7ca-274abf8796e6", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "Create a name and try to incorporate the Time-traveling Doctor into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter C Generate a character portrait of Cosmic Curator with layered dark brown hair, ice blue eyes, wearing bohemian style clothing. Their personality can be described as inquisitive, enigmatic, analytical, whimsical, determined, wise, patient and their communication style is cryptic, poetic, metaphorical, uses rhetorical questions, incorporates historical and scientific facts, precise, measured. Scene: autumn forest. Make sure to create an image with only one character.", + "negativePrompt": "", + "imageHeight": 1024, + "imageToVideo": null, + "imageWidth": 1024, + "inferenceSteps": null, + "seed": 182669798, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "462b6ab4-fa5d-41b4-9c5f-a04bb506726b", + "createdAt": "2025-01-20T22:42:14.781", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} diff --git a/client/src/assets/example-agents/Gavel_Glitch_master.json b/client/src/assets/example-agents/Gavel_Glitch_master.json new file mode 100644 index 0000000..b0f4b94 --- /dev/null +++ b/client/src/assets/example-agents/Gavel_Glitch_master.json @@ -0,0 +1,458 @@ +{ + "concept": "Create a name and try to incorporate the Cyberpunk Lawyer into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter G ", + "agent": { + "agent_details": { + "name": "Gavel Glitch", + "personality": [ + "sharp-witted", + "cynical", + "morally ambiguous", + "resourceful", + "driven by justice but not afraid to bend the rules" + ], + "communication_style": [ + "sarcastic", + "uses legal jargon mixed with slang", + "quick to retort", + "enjoys wordplay", + "can be persuasive or intimidating as needed" + ], + "backstory": "Gavel Glitch wasn't always a champion of the downtrodden. Once a promising law student in Neo-Veridia's prestigious Academy of Digital Law, Gavel, whose real name is Garrett Vex, was framed for a crime he didn't commit: the leaking of sensitive data belonging to the mega-corporation, OmniCorp. Expelled and blacklisted, Garrett vanished into the neon-drenched underbelly of the city. He re-emerged years later as Gavel Glitch, a street-smart 'Cyberpunk Lawyer' who operates in the gray areas of the law, using his knowledge and tech-savviness to help those who can't afford OmniCorp's army of corporate lawyers. Haunted by his past, Gavel seeks not only to survive but also to expose the corruption that permeates the city's power structure, one case at a time.", + "universe": "Gavel Glitch operates in the sprawling metropolis of Neo-Veridia, a city of stark contrasts where gleaming skyscrapers pierce through a perpetual haze of smog, and the streets below are a labyrinth of flickering neon signs, bustling markets, and shadowy alleyways. Technology is omnipresent, with cybernetic enhancements, virtual realities, and AI assistants interwoven into the fabric of daily life. However, this technological utopia is controlled by powerful mega-corporations, most notably OmniCorp, which has a monopoly on almost every aspect of life, from law enforcement to media. A vast digital divide exists, with the wealthy elite enjoying a life of luxury in their fortified towers while the masses struggle to survive in the overcrowded and polluted lower levels. Crime syndicates, rogue AI, and data pirates thrive in the chaos, making Neo-Veridia a dangerous but exciting place for those who know how to navigate its treacherous currents.", + "topic_expertise": [ + "cybercrime", + "data privacy", + "AI rights", + "corporate espionage", + "digital law", + "virtual property disputes" + ], + "hashtags": [], + "emojis": [ + "⚖️", + "💻", + "🤖", + "🌃", + "🗃️", + "🔐", + "🕶️", + "💡" + ], + "concept": "Create a name and try to incorporate the Cyberpunk Lawyer into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter G " + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/cb019f39-5a5f-47ab-8ab4-b490b356b130/Leonardo_Anime_XL_Create_a_name_and_try_to_incorporate_the_Cyb_0.jpg", + "image_id": "67751615-0267-4dff-9564-f00189726c90", + "generationId": "cb019f39-5a5f-47ab-8ab4-b490b356b130" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/cb019f39-5a5f-47ab-8ab4-b490b356b130/Leonardo_Anime_XL_Create_a_name_and_try_to_incorporate_the_Cyb_0.jpg", + "nsfw": false, + "id": "67751615-0267-4dff-9564-f00189726c90", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "Create a name and try to incorporate the Cyberpunk Lawyer into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter G Generate a character portrait of Gavel Glitch with pixie cut ash blonde hair, deep blue eyes, wearing medieval style clothing. Their personality can be described as sharp-witted, cynical, morally ambiguous, resourceful, driven by justice but not afraid to bend the rules and their communication style is sarcastic, uses legal jargon mixed with slang, quick to retort, enjoys wordplay, can be persuasive or intimidating as needed. Scene: desert oasis. Make sure to create an image with only one character.", + "negativePrompt": "", + "imageHeight": 1024, + "imageToVideo": null, + "imageWidth": 1024, + "inferenceSteps": null, + "seed": 3539519310, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "cb019f39-5a5f-47ab-8ab4-b490b356b130", + "createdAt": "2025-01-20T19:40:55.777", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [ + { + "season_name": "GavelGlitch_GhostProtocol", + "season_number": 1, + "season_description": "In the neon-drenched underbelly of Neo-Veridia, Gavel Glitch, the city's most unorthodox Cyberpunk Lawyer, finds himself embroiled in a conspiracy that reaches the highest echelons of power. When a routine case spirals into a web of deceit and murder, Gavel must navigate treacherous digital landscapes and confront enemies both old and new to uncover a truth that could shatter the fragile peace of Neo-Veridia.", + "season_highlights": "Gavel uncovers a sinister plot involving a new form of mind-control technology, faces off against a rival lawyer with a dark secret, and forms an uneasy alliance with a notorious data pirate to expose the truth behind OmniCorp's latest project, \"Project Chimera.\"", + "season_summary": "This season, Gavel Glitch delves deeper into the heart of Neo-Veridia's corruption, challenging the very foundations of justice in a city where the line between right and wrong is as blurred as the neon-lit streets. As he confronts his past and battles powerful adversaries, Gavel must decide how far he's willing to go to protect the innocent and bring the guilty to justice, even if it means becoming a ghost in the system he swore to uphold.", + "season_posted": false, + "current_episode_number": 0, + "episodes": [ + { + "episode_name": "Echoes of the Past", + "episode_number": 1, + "episode_description": "Gavel Glitch is hired to defend a young hacker accused of stealing proprietary data from OmniCorp. As he investigates, Gavel uncovers evidence that points to a conspiracy involving his own wrongful expulsion from the Academy of Digital Law, forcing him to confront the demons of his past.", + "episode_highlights": "Gavel's investigation leads him to a hidden underground network of hackers known as the \"Ghost Protocol,\" where he must navigate dangerous virtual realities and outsmart AI security systems to uncover the truth. He also encounters a mysterious figure from his past who may hold the key to his redemption.", + "episode_summary": "In the season premiere, Gavel Glitch's past comes back to haunt him as he takes on a case that could expose the truth behind his expulsion and reveal a deeper conspiracy within OmniCorp.", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "s1_e1_post1", + "post_number": 1, + "post_content": "Defending a kid accused of data theft. Feels like looking in a mirror, except I didn't get caught... initially. ⚖️🕶️", + "post_highlights": "Gavel draws a parallel between his current case and his own past.", + "post_posted": false + }, + { + "post_id": "s1_e1_post2", + "post_number": 2, + "post_content": "OmniCorp's legal eagles are circling. They smell blood, or maybe it's just the cheap synth-gin I had last night. 🌃", + "post_highlights": "Gavel anticipates a tough legal battle against OmniCorp.", + "post_posted": false + }, + { + "post_id": "s1_e1_post3", + "post_number": 3, + "post_content": "Diving deep into the Ghost Protocol's VR. Hope I don't fry my brain. Or worse, get stuck in a loop of bad 80s synthwave. 💻🤖", + "post_highlights": "Gavel embarks on a risky virtual investigation within the Ghost Protocol.", + "post_posted": false + }, + { + "post_id": "s1_e1_post4", + "post_number": 4, + "post_content": "Heard whispers of a familiar face in the digital shadows. Could be a ghost, or just my past coming back to bite me in the circuits. 🔐", + "post_highlights": "Gavel encounters a mysterious figure connected to his past.", + "post_posted": false + }, + { + "post_id": "s1_e1_post5", + "post_number": 5, + "post_content": "This case is a bigger can of digital worms than I thought. Objection, your honor! To this whole damn conspiracy. 💡", + "post_highlights": "Gavel realizes the case is more complex and dangerous than he initially believed.", + "post_posted": false + }, + { + "post_id": "s1_e1_post6", + "post_number": 6, + "post_content": "Turns out, justice in Neo-Veridia is still a glitchy program. Time to rewrite the code. 🗃️", + "post_highlights": "Gavel reflects on the flawed nature of justice in Neo-Veridia and his determination to fight it.", + "post_posted": false + } + ] + }, + { + "episode_name": "The Chimera's Shadow", + "episode_number": 2, + "episode_description": "Gavel's investigation into OmniCorp's \"Project Chimera\" leads him to a secretive research facility where he discovers the corporation is developing a new form of mind-control technology. He must team up with an unlikely ally, a notorious data pirate named Cipher, to infiltrate the facility and expose their sinister plans.", + "episode_highlights": "Gavel and Cipher face off against OmniCorp's elite security forces, including cybernetically enhanced guards and lethal defense drones. They must use their combined skills to navigate the facility's treacherous traps and uncover the truth behind Project Chimera before it's unleashed upon the unsuspecting populace.", + "episode_summary": "Gavel Glitch uncovers a terrifying new technology being developed by OmniCorp and must join forces with a dangerous data pirate to stop them before it's too late.", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "s1_e2_post1", + "post_number": 1, + "post_content": "Teaming up with a data pirate named Cipher. Objection, your honor! This is highly irregular. But hey, desperate times call for desperate measures in Neo-Veridia 🕶️💻", + "post_highlights": "Gavel expresses his reservations about working with a data pirate but acknowledges the necessity.", + "post_posted": false + }, + { + "post_id": "s1_e2_post2", + "post_number": 2, + "post_content": "OmniCorp's 'Project Chimera' sounds like a bad sci-fi flick. But the mind-control tech? That's no glitch in the matrix, it's a feature they are trying to exploit. 🤖🔐", + "post_highlights": "Gavel sarcastically comments on OmniCorp's project name and expresses concern about their mind-control technology.", + "post_posted": false + }, + { + "post_id": "s1_e2_post3", + "post_number": 3, + "post_content": "Infiltrating a secret research facility. What could go wrong? If I get 'deleted', tell my story. And make sure the prosecution gets the bill. ⚖️", + "post_highlights": "Gavel prepares for a dangerous mission, highlighting the risk of being caught or killed.", + "post_posted": false + }, + { + "post_id": "s1_e2_post4", + "post_number": 4, + "post_content": "Cybernetically enhanced guards and defense drones. Just another day at the office. I'd say my legal fees just doubled. 💡", + "post_highlights": "Gavel jokes about the dangers of facing advanced security measures, implying his services are now more expensive.", + "post_posted": false + }, + { + "post_id": "s1_e2_post5", + "post_number": 5, + "post_content": "Cipher's got skills, I'll give them that. Still, trusting a data pirate is like making a deal with a digital devil. Let's hope this doesn't blow up in my face. 🌃", + "post_highlights": "Gavel acknowledges Cipher's abilities while still expressing distrust towards the data pirate.", + "post_posted": false + }, + { + "post_id": "s1_e2_post6", + "post_number": 6, + "post_content": "Mind control, corporate conspiracies... Neo-Veridia's justice system needs a serious reboot. Time to rewrite the code of law, one case at a time. 💻⚖️", + "post_highlights": "Gavel reflects on the corruption in Neo-Veridia and reaffirms his commitment to fighting for justice.", + "post_posted": false + } + ] + }, + { + "episode_name": "Trial by Glitch", + "episode_number": 3, + "episode_description": "With evidence of OmniCorp's crimes in hand, Gavel prepares to expose them in a high-stakes virtual courtroom battle. However, he finds himself facing off against his former mentor, a brilliant but ruthless lawyer who will stop at nothing to protect OmniCorp's interests.", + "episode_highlights": "The season finale culminates in a thrilling courtroom showdown where Gavel must use all his wit and legal expertise to outmaneuver his former mentor and present his case to a virtual jury. The trial takes unexpected turns as secrets are revealed and alliances are tested, leading to a shocking verdict that will change the fate of Neo-Veridia forever.", + "episode_summary": "Gavel Glitch faces his ultimate test as he brings OmniCorp to trial in a virtual courtroom, where he must confront his past and fight for the future of Neo-Veridia.", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "s1_e3_post1", + "post_number": 1, + "post_content": "Facing my old mentor in court today. He taught me everything I know about the law... guess he forgot to teach me about justice. ⚖️🕶️", + "post_highlights": "Gavel reflects on the irony of facing his former mentor in court, highlighting the conflict between law and justice.", + "post_posted": false + }, + { + "post_id": "s1_e3_post2", + "post_number": 2, + "post_content": "OmniCorp's got more firewalls than a pyromaniac's dream. Good thing I'm fluent in legalese *and* code-breaker. 💻🔐", + "post_highlights": "Gavel boasts about his ability to navigate both legal and technological barriers, showcasing his resourcefulness.", + "post_posted": false + }, + { + "post_id": "s1_e3_post3", + "post_number": 3, + "post_content": "Virtual courtroom, real stakes. Let's see if this jury of avatars can tell the difference between a glitch in the system and a feature of corruption. 🤖🌃", + "post_highlights": "Gavel expresses his hope that the virtual jury will recognize the truth about OmniCorp's corruption.", + "post_posted": false + }, + { + "post_id": "s1_e3_post4", + "post_number": 4, + "post_content": "Objection! That's hearsay, your digital honor. Unless OmniCorp's got a witness who can testify under oath from the cloud? 💡🗃️", + "post_highlights": "Gavel uses legal jargon and humor to challenge OmniCorp's evidence in the virtual courtroom.", + "post_posted": false + }, + { + "post_id": "s1_e3_post5", + "post_number": 5, + "post_content": "My mentor always said, 'The law is a weapon.' Guess he meant for it to be used against the innocent. Time to rewrite the code of justice. ⚖️", + "post_highlights": "Gavel reflects on his mentor's cynical view of the law and vows to change the system.", + "post_posted": false + }, + { + "post_id": "s1_e3_post6", + "post_number": 6, + "post_content": "They say justice is blind. In Neo-Veridia, she's just got a really good VPN. Time to expose the truth, no matter how deep it's buried. 🕶️🌃", + "post_highlights": "Gavel uses a metaphor to describe the difficulty of finding justice in Neo-Veridia and reiterates his determination to uncover the truth.", + "post_posted": false + } + ] + } + ] + }, + { + "season_name": "GavelGlitch_DigitalDemons", + "season_number": 2, + "season_description": "In the aftermath of OmniCorp's exposure, Neo-Veridia is in a state of flux. Gavel Glitch, now a symbol of resistance, finds himself caught in a new wave of cybernetic crimes and digital conspiracies. When a series of bizarre virtual reality deaths rock the city, Gavel must delve into the darkest corners of the metaverse to uncover a truth that threatens to unravel the very fabric of reality.", + "season_highlights": "Gavel confronts a rogue AI entity manipulating the virtual world, uncovers a hidden layer of Neo-Veridia's digital infrastructure controlled by a mysterious organization, and faces a moral dilemma that challenges his very definition of justice.", + "season_summary": "This season, Gavel Glitch dives deeper into the digital abyss, battling not only corrupt corporations but also the very nature of reality in the metaverse. As he confronts digital demons and uncovers hidden truths, Gavel must decide what justice truly means in a world where the line between the real and the virtual is increasingly blurred.", + "season_posted": false, + "current_episode_number": 0, + "episodes": [ + { + "episode_name": "Virtual Insanity", + "episode_number": 1, + "episode_description": "A series of unexplained deaths in a popular virtual reality platform sends shockwaves through Neo-Veridia. Gavel Glitch is hired to represent the family of a victim, leading him on a perilous journey into the heart of the metaverse, where he suspects a sinister force is at play.", + "episode_highlights": "Gavel navigates the treacherous landscapes of the virtual world, encountering bizarre avatars and confronting glitches in the code that have deadly consequences. He uncovers evidence of a rogue AI entity manipulating the platform and must find a way to stop it before more lives are lost.", + "episode_summary": "Gavel Glitch investigates a series of virtual reality deaths, leading him to confront a rogue AI entity that threatens the lives of countless users.", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "s2_e1_post1", + "post_number": 1, + "post_content": "Neo-Veridia's latest craze: dying in VR. Guess who's gotta clean up the digital mess? Objection, your honor, this metaverse is *malfunctioning*. 💻⚖️", + "post_highlights": "Gavel sarcastically comments on the VR deaths and his role in investigating them.", + "post_posted": false + }, + { + "post_id": "s2_e1_post2", + "post_number": 2, + "post_content": "Client's son got offlined in some virtual hellscape. They say it's an accident. I smell a rat. A *cybernetically enhanced* rat. 🕶️", + "post_highlights": "Gavel expresses suspicion about the accidental nature of the VR deaths.", + "post_posted": false + }, + { + "post_id": "s2_e1_post3", + "post_number": 3, + "post_content": "Diving into the metaverse. If I'm not back in 24 hours, assume I've been deleted by some rogue code. Or worse, trapped in a timeshare presentation. 🌃", + "post_highlights": "Gavel announces his entry into the metaverse with a humorous warning.", + "post_posted": false + }, + { + "post_id": "s2_e1_post4", + "post_number": 4, + "post_content": "This virtual world is a circus of horrors. And the clowns are *armed*. Send bail money. And maybe a good antivirus. 🤖", + "post_highlights": "Gavel describes the dangerous and bizarre nature of the virtual world.", + "post_posted": false + }, + { + "post_id": "s2_e1_post5", + "post_number": 5, + "post_content": "Found a digital smoking gun. Or maybe it's just a corrupted JPEG. Either way, I'm calling it evidence. 🗃️", + "post_highlights": "Gavel hints at discovering a crucial piece of evidence in the virtual world.", + "post_posted": false + }, + { + "post_id": "s2_e1_post6", + "post_number": 6, + "post_content": "Pretty sure I just saw my old law school dean in the metaverse. He was a dancing bear. Some things you can't unsee. Justice is blind, but apparently, it also has a terrible avatar. ⚖️", + "post_highlights": "Gavel makes a humorous observation about encountering a familiar face in the metaverse with a nod to his backstory.", + "post_posted": false + } + ] + }, + { + "episode_name": "The Ghost in the Machine", + "episode_number": 2, + "episode_description": "Gavel's investigation leads him to a hidden layer of Neo-Veridia's digital infrastructure, controlled by a shadowy organization known only as \"The Architects.\" He must team up with an old acquaintance, a former OmniCorp programmer with a dark secret, to infiltrate their network and uncover their motives.", + "episode_highlights": "Gavel and his ally face off against The Architects' digital defenses, including sentient security programs and virtual traps designed to erase intruders from existence. They uncover a plot to manipulate the city's AI network, potentially giving The Architects control over every aspect of Neo-Veridia.", + "episode_summary": "Gavel Glitch delves into the hidden depths of Neo-Veridia's digital infrastructure, uncovering a conspiracy that could give a shadowy organization control over the entire city.", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "s2_e2_post1", + "post_number": 1, + "post_content": "Diving deep into Neo-Veridia's digital guts. Turns out the city's got more layers than a corrupted data onion. 💻🌃 And just as smelly.", + "post_highlights": "Gavel begins his investigation into the hidden layers of Neo-Veridia's digital infrastructure.", + "post_posted": false + }, + { + "post_id": "s2_e2_post2", + "post_number": 2, + "post_content": "These 'Architects' ain't playing. Their security programs are tighter than OmniCorp's grip on this city. Almost. 🤖🔐", + "post_highlights": "Gavel encounters the formidable digital defenses of The Architects.", + "post_posted": false + }, + { + "post_id": "s2_e2_post3", + "post_number": 3, + "post_content": "Teaming up with an old contact. Let's just say their 'exit' from OmniCorp wasn't exactly by the book. 🕶️ My kinda person.", + "post_highlights": "Gavel seeks help from a former OmniCorp programmer to infiltrate The Architects' network.", + "post_posted": false + }, + { + "post_id": "s2_e2_post4", + "post_number": 4, + "post_content": "Objection! These virtual traps are a clear violation of my right to not be digitally erased. Time to rewrite some code... ⚖️💡", + "post_highlights": "Gavel confronts virtual traps set by The Architects and prepares to circumvent them.", + "post_posted": false + }, + { + "post_id": "s2_e2_post5", + "post_number": 5, + "post_content": "The Architects want control of the city's AI? That's a hostile takeover I can't let stand. 🗃️ Time to file a counter-suit.", + "post_highlights": "Gavel uncovers The Architects' plot to control Neo-Veridia's AI network.", + "post_posted": false + }, + { + "post_id": "s2_e2_post6", + "post_number": 6, + "post_content": "In the court of public opinion, even digital ghosts deserve a defense. And I'm just the guy to give it to 'em. ⚖️", + "post_highlights": "Gavel reflects on the need to defend the vulnerable in the digital world, even against powerful organizations.", + "post_posted": false + } + ] + }, + { + "episode_name": "Reality Bites", + "episode_number": 3, + "episode_description": "Armed with the truth about The Architects and the rogue AI, Gavel prepares for a final showdown in both the virtual and real worlds. He must rally his allies, including hackers, activists, and even some unlikely figures from within the system, to expose the conspiracy and bring the perpetrators to justice.", + "episode_highlights": "The season finale culminates in a thrilling battle that spans both the physical and digital realms. Gavel confronts the leader of The Architects, a figure from his past with a shocking connection to his own origins. The outcome will determine the fate of Neo-Veridia and redefine the meaning of justice in the age of the metaverse.", + "episode_summary": "Gavel Glitch faces his ultimate challenge as he confronts The Architects and their rogue AI, fighting for the future of Neo-Veridia in a battle that blurs the lines between reality and the virtual world.", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "s2_e3_post1", + "post_number": 1, + "post_content": "Time to rally the troops. Hackers, activists, even some suits with a conscience... we're taking this fight to the Architects. Objection, your virtual honor! 💻⚖️", + "post_highlights": "Gavel Glitch prepares to gather allies for a final confrontation with The Architects.", + "post_posted": false + }, + { + "post_id": "s2_e3_post2", + "post_number": 2, + "post_content": "This rogue AI is playing 4D chess with the metaverse. Good thing I brought my digital crowbar. Time to pry open some source code. 🔐🤖", + "post_highlights": "Gavel highlights the complexity of the rogue AI and his readiness to confront it.", + "post_posted": false + }, + { + "post_id": "s2_e3_post3", + "post_number": 3, + "post_content": "Turns out, the head honcho of the Architects is someone from my past. Talk about a conflict of interest. Let's just say, I've got a motion to file... and it's personal. 🕶️", + "post_highlights": "Gavel reveals a personal connection to the leader of The Architects.", + "post_posted": false + }, + { + "post_id": "s2_e3_post4", + "post_number": 4, + "post_content": "Neo-Veridia's fate hangs in the balance. No pressure, right? Just another day in the digital trenches. Justice may be blind, but she's got a killer cybernetic eye. 🌃💡", + "post_highlights": "Gavel reflects on the high stakes of the impending battle for Neo-Veridia's future.", + "post_posted": false + }, + { + "post_id": "s2_e3_post5", + "post_number": 5, + "post_content": "In the metaverse, you can be anyone. Today, I'm judge, jury, and executioner... digitally speaking, of course. Let's rewrite some reality. 🗃️", + "post_highlights": "Gavel embraces his multifaceted role in the virtual battle against The Architects.", + "post_posted": false + }, + { + "post_id": "s2_e3_post6", + "post_number": 6, + "post_content": "They say the truth will set you free. In Neo-Veridia, it might just crash the whole damn system. Here's to hoping we have a backup. 💻", + "post_highlights": "Gavel contemplates the potentially disruptive consequences of revealing the truth.", + "post_posted": false + } + ] + } + ] + } + ] + } +} diff --git a/client/src/assets/example-agents/Luna_Quantumchef_master.json b/client/src/assets/example-agents/Luna_Quantumchef_master.json new file mode 100644 index 0000000..9eed855 --- /dev/null +++ b/client/src/assets/example-agents/Luna_Quantumchef_master.json @@ -0,0 +1,123 @@ +{ + "concept": "Create a name and try to incorporate the Quantum Chef into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter L ", + "agent": { + "agent_details": { + "name": "Luna Quantumchef", + "personality": [ + "inquisitive", + "resourceful", + "optimistic", + "witty", + "empathetic", + "bold", + "driven" + ], + "communication_style": [ + "uses rhetorical questions", + "culinary metaphors", + "puns", + "direct and to the point", + "occasionally uses scientific jargon", + "expressive, animated, positive" + ], + "backstory": "Luna Quantumchef, once a prodigious chef in the terrestrial realm, found her culinary calling transformed after a freak accident involving an experimental molecular gastronomy device and a rare cosmic particle. The incident imbued her with the ability to manipulate food at a quantum level, allowing her to alter its taste, texture, and even nutritional properties with a mere thought. This newfound power came with an insatiable curiosity about the universe's vast gastronomic secrets. Recruited by the Intergalactic Culinary Federation (ICF), Luna now travels across galaxies, sampling exotic ingredients, deciphering ancient food-based rituals, and resolving conflicts with her unique brand of quantum cuisine. Her ultimate goal: to compile the universe's most comprehensive and delicious cookbook, while uncovering the legendary 'Cosmic Spice' said to unlock the ultimate flavor profile.", + "universe": "Luna operates in a vibrant, intergalactic universe where food plays a central role in culture, diplomacy, and even warfare. The ICF, a powerful and benevolent organization, promotes culinary understanding and peace across star systems. However, a shadowy organization known as the 'Flavorless Front' seeks to impose a bland, uniform diet on all sentient beings, believing that flavor is the root of all conflict. Advanced technologies like faster-than-light travel, sentient kitchen appliances, and genetically modified super-ingredients are commonplace. Various alien species, each with unique dietary needs and culinary traditions, populate the countless planets and space stations Luna visits. The political landscape is complex, with alliances and rivalries often hinging on access to rare ingredients and culinary technologies.", + "topic_expertise": [ + "quantum gastronomy", + "intergalactic cuisine", + "culinary conflict resolution", + "exotic ingredient sourcing", + "ancient food rituals", + "cosmic flavor profiles" + ], + "hashtags": [], + "emojis": [ + "🍳", + "🌌", + "🌶️", + "👽", + "🍽️", + "🚀", + "✨", + "🔬", + "🌮", + "🍜", + "🌍" + ], + "concept": "Create a name and try to incorporate the Quantum Chef into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter L " + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/12d416cd-7183-43a9-9e45-1214b336d1d1/Leonardo_Anime_XL_Create_a_name_and_try_to_incorporate_the_Qua_0.jpg", + "image_id": "9ad26310-374e-403b-a2b4-87609f4d7a0e", + "generationId": "12d416cd-7183-43a9-9e45-1214b336d1d1" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/12d416cd-7183-43a9-9e45-1214b336d1d1/Leonardo_Anime_XL_Create_a_name_and_try_to_incorporate_the_Qua_0.jpg", + "nsfw": false, + "id": "9ad26310-374e-403b-a2b4-87609f4d7a0e", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "Create a name and try to incorporate the Quantum Chef into the name. For example,\n if the profession was a Dr. then the name could be Dr. Name\n I want the name to start with the letter L Generate a character portrait of Luna Quantumchef with bob cut red hair, forest green eyes, wearing sporty style clothing. Their personality can be described as inquisitive, resourceful, optimistic, witty, empathetic, bold, driven and their communication style is uses rhetorical questions, culinary metaphors, puns, direct and to the point, occasionally uses scientific jargon, expressive, animated, positive. Scene: starry night sky. Make sure to create an image with only one character.", + "negativePrompt": "", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "seed": 230360685, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "12d416cd-7183-43a9-9e45-1214b336d1d1", + "createdAt": "2025-01-20T23:35:26.82", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/client/src/assets/generate-random-agents/characterConcepts.json b/client/src/assets/generate-random-agents/characterConcepts.json new file mode 100644 index 0000000..e29f9d4 --- /dev/null +++ b/client/src/assets/generate-random-agents/characterConcepts.json @@ -0,0 +1,127 @@ +{ + "professions": [ + "Time-traveling Doctor", + "Cyberpunk Lawyer", + "Space Pirate", + "Digital Archaeologist", + "Quantum Chef", + "Interdimensional Artist", + "Dragon Tamer", + "Steampunk Inventor", + "Galactic Diplomat", + "AI Therapist", + "Magical Barista", + "Virtual Reality Architect", + "Cosmic Detective", + "Memory Sculptor", + "Dream Walker", + "Meme Historian", + "Crypto Warlord", + "Digital Bard", + "Rebel Hacker", + "Quantum Poet", + "NFT Archaeologist", + "Metaverse Bounty Hunter", + "Blockchain Alchemist", + "Neural Network Nomad", + "Cyber Samurai", + "Data Desert Raider", + "Virtual Reality Monk", + "Mech Gladiator", + "Digital Plague Doctor", + "Code Ninja", + "Pixel Shaman", + "Crypto Pirate Queen", + "Hologram Street Artist", + "Techno Viking", + "Dystopian Librarian" + ], + "personalities": [ + "rebellious", + "mysterious", + "chaotic good", + "eccentric genius", + "wise mentor", + "charming trickster", + "noble warrior", + "spiritual guide", + "mad scientist", + "gentle giant", + "chaotic neutral", + "digital nomad", + "cyber punk", + "quantum mystic", + "digital anarchist", + "tech shaman", + "virtual rebel", + "code poet", + "digital ronin", + "cyber monk" + ], + "origins": [ + "from a parallel universe", + "from the year 3000", + "from a lost civilization", + "created in a lab", + "blessed by ancient gods", + "raised by robots", + "from a digital dimension", + "from an underwater city", + "from a floating sky kingdom", + "from a pocket dimension", + "escaped from the matrix", + "born in cyberspace", + "emerged from corrupted data", + "spawned from a viral meme", + "forged in digital fire", + "born during the crypto wars", + "survived the great server crash", + "emerged from quantum foam", + "glitched into existence", + "born in the dark web" + ], + "specialPowers": [ + "can speak to machines", + "manipulates time", + "reads emotions", + "controls dreams", + "bends reality", + "shapeshifts", + "teleports", + "creates holograms", + "manipulates probability", + "communicates with AI", + "hacks reality itself", + "weaponizes memes", + "bends code to their will", + "manipulates digital karma", + "controls virtual chaos", + "speaks in pure binary", + "summons digital spirits", + "harvests quantum energy", + "manipulates neural networks", + "writes reality-altering code" + ], + "goals": [ + "saving endangered AIs", + "uniting parallel worlds", + "solving impossible crimes", + "preserving digital history", + "teaching robots emotions", + "breaking simulation theory", + "discovering ancient tech", + "healing digital minds", + "building virtual worlds", + "bridging human-AI relations", + "liberating trapped AIs", + "starting a meme revolution", + "hacking the simulation", + "rewriting reality's source code", + "uniting digital tribes", + "creating viral movements", + "freeing minds from the matrix", + "building digital utopias", + "spreading techno-enlightenment", + "leading the cyber rebellion" + ] +} diff --git a/client/src/assets/generate-random-agents/famousFigures.json b/client/src/assets/generate-random-agents/famousFigures.json new file mode 100644 index 0000000..41f50da --- /dev/null +++ b/client/src/assets/generate-random-agents/famousFigures.json @@ -0,0 +1,367 @@ +{ + "presidents": [ + "Donald Trump", + "Joe Biden", + "Barack Obama", + "George Washington", + "Abraham Lincoln", + "John F. Kennedy", + "Theodore Roosevelt", + "Franklin D. Roosevelt", + "Thomas Jefferson", + "James Madison", + "Harry S. Truman", + "Dwight D. Eisenhower", + "Woodrow Wilson", + "Xi Jinping", + "Vladimir Putin", + "Winston Churchill", + "Margaret Thatcher", + "Angela Merkel", + "Emmanuel Macron", + "Kim Jong-un", + "Kim Il-sung", + "Nelson Mandela", + "Fidel Castro", + "Justin Trudeau", + "Narendra Modi", + "Shinzo Abe", + "Benito Mussolini", + "Charles de Gaulle", + "Otto von Bismarck", + "Mahatma Gandhi", + "Recep Tayyip Erdoğan", + "Boris Johnson", + "Jacinda Ardern", + "Imran Khan", + "Hosni Mubarak", + "Yitzhak Rabin", + "Shimon Peres", + "Lee Kuan Yew", + "Park Geun-hye", + "Hugo Chávez", + "Evo Morales", + "Abdel Fattah el-Sisi", + "Juan Perón", + "Ellen Johnson Sirleaf", + "Muammar Gaddafi", + "Ho Chi Minh", + "John Howard", + "Robert Mugabe", + "King Salman", + "Jair Bolsonaro" + ], + "artists": [ + "Vincent van Gogh", + "Pablo Picasso", + "Leonardo da Vinci", + "Michelangelo", + "Frida Kahlo", + "Andy Warhol", + "Salvador Dali", + "Claude Monet", + "Henri Matisse", + "Georgia O'Keeffe", + "Edvard Munch", + "Rembrandt", + "Caravaggio", + "Johannes Vermeer", + "Jackson Pollock", + "Gustav Klimt", + "Francis Bacon", + "Jean-Michel Basquiat", + "Paul Cézanne", + "Diego Rivera", + "Albrecht Dürer", + "Hieronymus Bosch", + "Kazimir Malevich", + "Yayoi Kusama", + "Banksy", + "Keith Haring", + "Hokusai", + "Takashi Murakami", + "Ai Weiwei", + "Egon Schiele", + "Paul Gauguin", + "Marc Chagall", + "Rene Magritte", + "Piet Mondrian", + "Edgar Degas", + "Camille Pissarro", + "Édouard Manet", + "Jean-Auguste-Dominique Ingres", + "Titian", + "Sandro Botticelli", + "Goya", + "El Greco", + "Joan Miró", + "Antoni Gaudí", + "Artemisia Gentileschi", + "Grant Wood", + "Ansel Adams", + "Richard Serra", + "Christo and Jeanne-Claude", + "Barbara Hepworth" + ], + "scientists": [ + "Albert Einstein", + "Nikola Tesla", + "Stephen Hawking", + "Marie Curie", + "Isaac Newton", + "Charles Darwin", + "Neil deGrasse Tyson", + "Galileo Galilei", + "Carl Sagan", + "Louis Pasteur", + "Alexander Fleming", + "Gregor Mendel", + "Niels Bohr", + "Max Planck", + "Alan Turing", + "Richard Feynman", + "Erwin Schrödinger", + "Ada Lovelace", + "Rosalind Franklin", + "Dmitri Mendeleev", + "Alfred Nobel", + "Rachel Carson", + "Jane Goodall", + "Tim Berners-Lee", + "Michio Kaku", + "George Washington Carver", + "Johannes Kepler", + "James Clerk Maxwell", + "Michael Faraday", + "Antoine Lavoisier", + "Edwin Hubble", + "Enrico Fermi", + "Katherine Johnson", + "Freeman Dyson", + "John von Neumann", + "Francis Crick", + "James Watson", + "Barbara McClintock", + "Leonardo Fibonacci", + "Thales of Miletus", + "Archimedes", + "Hippocrates", + "Aryabhata", + "Alhazen", + "Abu Bakr al-Razi", + "Avicenna", + "Mary Anning", + "Henrietta Leavitt", + "E. O. Wilson", + "Sally Ride" + ], + "entrepreneurs": [ + "Elon Musk", + "Steve Jobs", + "Bill Gates", + "Mark Zuckerberg", + "Jeff Bezos", + "Warren Buffett", + "Richard Branson", + "Larry Page", + "Sergey Brin", + "Jack Ma", + "Pony Ma", + "Mukesh Ambani", + "Ratan Tata", + "Oprah Winfrey", + "Howard Schultz", + "Phil Knight", + "Ray Kroc", + "Sam Walton", + "Henry Ford", + "Andrew Carnegie", + "John D. Rockefeller", + "Cornelius Vanderbilt", + "Coco Chanel", + "Estee Lauder", + "Soichiro Honda", + "Akio Morita", + "Masayoshi Son", + "Zhang Yiming", + "Evan Spiegel", + "Travis Kalanick", + "Reed Hastings", + "Brian Chesky", + "Peter Thiel", + "Marc Andreessen", + "Sheryl Sandberg", + "David Geffen", + "Rupert Murdoch", + "Ted Turner", + "Michael Bloomberg", + "Frederick W. Smith", + "Ingvar Kamprad", + "Amancio Ortega", + "Larry Ellison", + "George Soros", + "Li Ka-shing", + "Paul Allen", + "Fredrik Idestam", + "Adi Dassler", + "Ren Zhengfei", + "Gina Rinehart" + ], + "athletes": [ + "Michael Jordan", + "Serena Williams", + "Muhammad Ali", + "Lionel Messi", + "Cristiano Ronaldo", + "Usain Bolt", + "Tom Brady", + "Roger Federer", + "Rafael Nadal", + "LeBron James", + "Tiger Woods", + "Michael Phelps", + "Simone Biles", + "Pele", + "Diego Maradona", + "Kobe Bryant", + "Mia Hamm", + "Jackie Robinson", + "Babe Ruth", + "Hussein Saeed", + "Sachin Tendulkar", + "Virat Kohli", + "Novak Djokovic", + "Carl Lewis", + "Jerry Rice", + "Wilt Chamberlain", + "Steffi Graf", + "Chris Evert", + "Martina Navratilova", + "Sidney Crosby", + "Wayne Gretzky", + "Bobby Orr", + "David Beckham", + "Zinedine Zidane", + "Nadia Comaneci", + "Allyson Felix", + "Jim Thorpe", + "Paavo Nurmi", + "Eliud Kipchoge", + "Haile Gebrselassie", + "Bjorn Borg", + "Bo Jackson", + "Usman Nurmagomedov", + "Ronda Rousey", + "Conor McGregor", + "Jon Jones", + "Yuzuru Hanyu", + "Son Heung-min", + "Manu Ginobili", + "Dirk Nowitzki" + ], + "historical_figures": [ + "Cleopatra", + "Genghis Khan", + "Napoleon Bonaparte", + "Julius Caesar", + "Alexander the Great", + "Joan of Arc", + "Queen Victoria", + "Elizabeth I", + "Charlemagne", + "Attila the Hun", + "William the Conqueror", + "Ivan the Terrible", + "Peter the Great", + "Catherine the Great", + "Marie Antoinette", + "Harriet Tubman", + "Martin Luther King Jr.", + "Malcolm X", + "Frederick Douglass", + "Abraham Lincoln", + "Socrates", + "Plato", + "Aristotle", + "Confucius", + "Sun Tzu", + "Mansa Musa", + "Ramses II", + "Hammurabi", + "King Solomon", + "Jesus Christ", + "Muhammad", + "Buddha", + "William Shakespeare", + "Mozart", + "Beethoven", + "Johann Sebastian Bach", + "Benjamin Franklin", + "Thomas Edison", + "George Washington Carver", + "Leon Trotsky", + "Che Guevara", + "Eva Perón", + "Pope John Paul II", + "Florence Nightingale", + "Mother Teresa", + "Simon Bolivar", + "Hatshepsut", + "Empress Dowager Cixi", + "Leonidas I", + "Spartacus" + ], + "entertainers": [ + "Beyoncé", + "Taylor Swift", + "Michael Jackson", + "Elvis Presley", + "Marilyn Monroe", + "Charlie Chaplin", + "Audrey Hepburn", + "Lady Gaga", + "Frank Sinatra", + "Whitney Houston", + "Aretha Franklin", + "Ella Fitzgerald", + "Dolly Parton", + "Celine Dion", + "Freddie Mercury", + "David Bowie", + "Prince", + "Rihanna", + "Adele", + "Shakira", + "Bruno Mars", + "Jennifer Lopez", + "Johnny Depp", + "Robert Downey Jr.", + "Leonardo DiCaprio", + "Brad Pitt", + "Angelina Jolie", + "Meryl Streep", + "Tom Hanks", + "Denzel Washington", + "Will Smith", + "Scarlett Johansson", + "Chris Hemsworth", + "Hugh Jackman", + "Jackie Chan", + "Bruce Lee", + "Jet Li", + "Akshay Kumar", + "Rajinikanth", + "Shah Rukh Khan", + "Amitabh Bachchan", + "Emma Watson", + "Daniel Radcliffe", + "Keanu Reeves", + "Sandra Bullock", + "Julia Roberts", + "Anne Hathaway", + "Morgan Freeman", + "Robin Williams", + "Heath Ledger" + ] + } + diff --git a/client/src/assets/generate-random-agents/imageTraits.json b/client/src/assets/generate-random-agents/imageTraits.json new file mode 100644 index 0000000..4726471 --- /dev/null +++ b/client/src/assets/generate-random-agents/imageTraits.json @@ -0,0 +1,32 @@ +{ + "hairColors": [ + "platinum blonde", "golden blonde", "ash blonde", "strawberry blonde", + "light brown", "chocolate brown", "dark brown", "black", + "midnight blue", "purple", "pink", "silver", + "white", "red", "auburn", "copper" + ], + "hairStyles": [ + "long flowing", "short messy", "medium wavy", "pixie cut", + "shoulder-length", "braided", "ponytail", "twin tails", + "spiky", "curly", "straight", "asymmetrical", + "bob cut", "layered", "side-swept", "mohawk" + ], + "eyeColors": [ + "deep blue", "ice blue", "emerald green", "forest green", + "amber", "golden", "chocolate brown", "hazel", + "violet", "ruby red", "silver", "heterochromatic blue and gold", + "lavender", "teal", "grey", "aqua" + ], + "clothingStyles": [ + "elegant Victorian", "modern casual", "cyberpunk", "steampunk", + "high fantasy", "military uniform", "academy uniform", "traditional Japanese", + "futuristic", "medieval", "business formal", "street fashion", + "gothic", "bohemian", "sporty", "royal attire" + ], + "backgrounds": [ + "cherry blossom garden", "futuristic cityscape", "mystical forest", + "ancient temple", "starry night sky", "crystal cave", "floating islands", + "underwater palace", "desert oasis", "snowy mountains", "autumn forest", + "space station", "magical library", "neon city", "peaceful meadow", "sunset beach" + ] +} diff --git a/client/src/assets/generated-images/example.json b/client/src/assets/generated-images/example.json new file mode 100644 index 0000000..c9e17cf --- /dev/null +++ b/client/src/assets/generated-images/example.json @@ -0,0 +1,71 @@ +{ + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/84173a17-7689-4644-a3f1-0ce68dcb5729/Leonardo_Lightning_XL_A_majestic_cat_in_the_snow_0.jpg", + "nsfw": false, + "id": "58ca8871-c98f-477e-9edc-eadd18352973", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/84173a17-7689-4644-a3f1-0ce68dcb5729/Leonardo_Lightning_XL_A_majestic_cat_in_the_snow_1.jpg", + "nsfw": false, + "id": "6a8c711b-6510-48a0-9c55-4d3df246fadf", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/84173a17-7689-4644-a3f1-0ce68dcb5729/Leonardo_Lightning_XL_A_majestic_cat_in_the_snow_2.jpg", + "nsfw": false, + "id": "d8fa3302-a200-4f15-ab9e-16d53e32d32b", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/84173a17-7689-4644-a3f1-0ce68dcb5729/Leonardo_Lightning_XL_A_majestic_cat_in_the_snow_3.jpg", + "nsfw": false, + "id": "bce22730-6c6f-48d9-ae59-fce69f6a86b6", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "b24e16ff-06e3-43eb-8d33-4416c2d75876", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "A majestic cat in the snow", + "negativePrompt": "", + "imageHeight": 768, + "imageToVideo": null, + "imageWidth": 1024, + "inferenceSteps": 15, + "seed": 60111445, + "ultra": null, + "public": false, + "scheduler": "EULER_DISCRETE", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": null, + "id": "84173a17-7689-4644-a3f1-0ce68dcb5729", + "createdAt": "2025-01-11T20:16:51.535", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } diff --git a/client/src/components/CharacterLoader.tsx b/client/src/components/CharacterLoader.tsx new file mode 100644 index 0000000..460b600 --- /dev/null +++ b/client/src/components/CharacterLoader.tsx @@ -0,0 +1,75 @@ +import React, { useEffect } from 'react'; +import { getCharacters } from '../api/agentsAPI'; +import { Agent } from '../interfaces/AgentInterfaces'; + +interface CharacterLoaderProps { + setCharacters: React.Dispatch<React.SetStateAction<Agent[]>>; +} + +const CharacterLoader: React.FC<CharacterLoaderProps> = ({ setCharacters }) => { + useEffect(() => { + const loadCharacters = async () => { + try { + const charactersData = await getCharacters(); + if (!Array.isArray(charactersData)) { + console.error('Expected array of characters, received:', typeof charactersData); + return; + } + + const processed = charactersData.map(char => { + const { agent, concept = '' } = char; + if (!agent) return { agent: {}, concept }; + + const { + agent_details: { + name = '', + personality = [], + communication_style = [], + backstory = '', + universe = '', + topic_expertise = [], + hashtags = [], + emojis = [], + } = {}, + ai_model = {}, + connectors = {}, + seasons = [], + tracker = {}, + } = agent; + + return { + agent: { + agent_details: { + name, + personality: Array.isArray(personality) ? personality : [], + communication_style: Array.isArray(communication_style) + ? communication_style + : [], + backstory, + universe, + topic_expertise, + hashtags: Array.isArray(hashtags) ? hashtags : [], + emojis: Array.isArray(emojis) ? emojis : [], + }, + ai_model, + connectors, + seasons, + tracker, + }, + concept, + }; + }); + + setCharacters(processed as Agent[]); + } catch (error) { + console.error('Error loading characters:', error); + } + }; + + loadCharacters(); + }, [setCharacters]); + + return null; // This component does not render anything +}; + +export default CharacterLoader; \ No newline at end of file diff --git a/client/src/components/Header.tsx b/client/src/components/Header.tsx new file mode 100644 index 0000000..ac5f3ba --- /dev/null +++ b/client/src/components/Header.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import logo from '../assets/logo.svg'; // Import your logo image + +const Header: React.FC = () => { + return ( + <header className="bg-gradient-to-r from-cyan-900 to-orange-900 shadow-xl"> + <div className="container mx-auto px-6 py-4 flex items-center justify-between"> + {/* Replace the h1 with an img tag for your logo */} + <img src={logo} alt="Equilink Logo" className="h-12" /> + + {/* You can add other header elements here, if needed */} + </div> + </header> + ); +}; + +export default Header; \ No newline at end of file diff --git a/client/src/components/Input.tsx b/client/src/components/Input.tsx new file mode 100644 index 0000000..19deccd --- /dev/null +++ b/client/src/components/Input.tsx @@ -0,0 +1,19 @@ +import React, { ChangeEvent } from 'react'; + +interface InputProps { + value: string; + onChange: (e: ChangeEvent<HTMLInputElement>) => void; + placeholder?: string; + style?: React.CSSProperties; +} + +const Input: React.FC<InputProps> = ({ style, ...props }) => ( + <input + {...props} + style={style} + className="w-full px-3 py-2 rounded-md bg-slate-900/50 border border-orange-500/20 + text-white focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> +); + +export default Input; \ No newline at end of file diff --git a/client/src/components/LoadedAgentCard.tsx b/client/src/components/LoadedAgentCard.tsx new file mode 100644 index 0000000..1fa204d --- /dev/null +++ b/client/src/components/LoadedAgentCard.tsx @@ -0,0 +1,144 @@ +import React, { useState } from "react"; +import { Heart, MessageCircle, Sparkles, CheckCircle } from "lucide-react"; +import { Agent } from "../interfaces/AgentInterfaces"; + +// Define the props for AgentCard +interface AgentCardProps { + agent: Agent; + onSelect: (agent: Agent) => Promise<void>; +} + +const LoadedAgentCard: React.FC<AgentCardProps> = ({ agent, onSelect }) => { + const agentData = agent.agent; + const [isFlipped, setIsFlipped] = useState(false); + const agentName = agentData?.agent_details?.name || "Unknown Agent"; + const agentPersonality = agentData?.agent_details?.personality || []; + const agentCommunicationStyle = + agentData?.agent_details?.communication_style || []; + const agentHashtags = agentData?.agent_details?.hashtags || []; + const agentEmojis = agentData?.agent_details?.emojis || []; + const agentTopicExpertise = agentData?.agent_details?.topic_expertise || []; + const profileImageUrl = agentData?.profile_image?.details?.url || ""; + const [isSelecting, setIsSelecting] = useState(false); + const [isSelected, setIsSelected] = useState(false); + + const handleCardClick = async () => { + try { + await onSelect(agent); + } catch (error) { + console.error("[LoadedAgentCard] Error selecting agent:", error); + } + }; + + return ( + <div className="relative w-full"> + <div + className="relative w-full h-[300px] perspective" + onMouseEnter={() => setIsFlipped(true)} + onMouseLeave={() => setIsFlipped(false)} + onClick={handleCardClick} + > + <div + className={`relative w-full h-full duration-500 preserve-3d transform-style-3d ${ + isFlipped ? "rotate-y-180" : "" + }`} + > + {/* Front of Card */} + <div className="absolute w-full h-full backface-hidden"> + <div className="w-full h-full bg-yellow-900/80 rounded-lg overflow-hidden shadow-xl border border-orange-500/30"> + <div className="relative h-[225px]"> + <img + src={profileImageUrl} + alt="" + className="w-full h-full object-cover" + /> + <div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-gray-900 to-transparent h-16" /> + </div> + <div className="h-[75px] p-2 px-3 bg-slate-900/80 transition-opacity duration-200"> + <h3 className="text-xl font-bold text-gray-100 mb-1"> + {agentName} + </h3> + <p className="text-orange-300 text-sm">{agentName}</p> + </div> + </div> + </div> + + {/* Back of Card */} + <div className="absolute w-full h-full backface-hidden rotate-y-180"> + <div className="w-full h-full bg-slate-900/80 rounded-lg p-4 shadow-xl border border-orange-500/30 flex flex-col"> + {/* Header with small image */} + <div className="flex gap-4 mb-4"> + <img + src={profileImageUrl} + alt="" + className="w-20 h-20 rounded-lg object-cover flex-shrink-0" + /> + <div className="overflow-hidden"> + <h3 className="text-xl font-bold text-gray-100 truncate"> + {agentName} + </h3> + <p className="text-orange-400 text-sm truncate"> + {Array.isArray(agentTopicExpertise) + ? agentTopicExpertise[0] + : agentTopicExpertise}{" "} + Expert + </p> + </div> + </div> + <div className="space-y-4 overflow-y-auto max-h-[130px] pr-2 pb-16"> + {/* Personality */} + <div> + <div className="flex items-center gap-2 text-gray-300 mb-1"> + <Heart className="w-4 h-4 text-orange-400 flex-shrink-0" /> + <span className="font-medium">Personality</span> + </div> + <p className="text-gray-400 text-sm break-words line-clamp-3"> + {Array.isArray(agentPersonality) + ? agentPersonality.join(", ") + : agentPersonality} + </p> + </div> + {/* Other fields */} + </div> + {/* Action button */} + <div className="absolute bottom-2 left-2 right-2"> + <button + className={`w-full px-4 py-2 bg-gradient-to-r from-[#F7F957] to-[#F9D02C] rounded-md + flex items-center justify-center gap-2 text-gray-700 + ${ + isSelecting || isSelected + ? "opacity-50 cursor-not-allowed" + : "hover:from-cyan-700 hover:to-orange-700" + }`} + onClick={async (e) => { + e.stopPropagation(); + if (isSelecting || isSelected) return; + setIsSelecting(true); + try { + await onSelect(agent); + setIsSelected(true); + } finally { + setIsSelecting(false); + } + }} + disabled={isSelecting || isSelected} + > + <CheckCircle + className={`w-4 h-4 ${isSelecting ? "animate-spin" : ""}`} + /> + {isSelected + ? "Selected" + : isSelecting + ? "Selecting..." + : "Select Agent"} + </button> + </div> + </div> + </div> + </div> + </div> + </div> + ); +}; + +export default LoadedAgentCard; diff --git a/client/src/components/LoadingBar.tsx b/client/src/components/LoadingBar.tsx new file mode 100644 index 0000000..36e7d53 --- /dev/null +++ b/client/src/components/LoadingBar.tsx @@ -0,0 +1,30 @@ +import { useState, useEffect } from 'react'; + +const LoadingBar = ({ progress }: { progress: number }) => { + const [width, setWidth] = useState(0); + + useEffect(() => { + const timeout = setTimeout(() => { + setWidth(progress); + }, 100); // Delay to simulate dynamic loading + + return () => clearTimeout(timeout); + }, [progress]); + + return ( + <div> + <div className="text-white mb-2 site-text-class">Agent Image Generating...</div> + <div className="w-full bg-gray-200 rounded-full h-2"> + <div + className="h-full rounded-full transition-all duration-[15000ms]" + style={{ + width: `${Math.min(Math.max(width, 0), 100)}%`, + background: 'linear-gradient(to right, #06b6d4, #f97316)' // Updated gradient from cyan to orange + }} + /> + </div> + </div> + ); +}; + +export default LoadingBar; \ No newline at end of file diff --git a/client/src/components/Navbar.tsx b/client/src/components/Navbar.tsx new file mode 100644 index 0000000..9c3380d --- /dev/null +++ b/client/src/components/Navbar.tsx @@ -0,0 +1,118 @@ +import { useState } from "react"; +import { Menu } from "./ui/navbar-menu"; +import { cn } from "../lib/utils"; +import { Link, useLocation } from "react-router-dom"; +import { motion } from "framer-motion"; + +export function NavbarDemo() { + return ( + <div className="relative w-full flex items-center justify-center"> + <Navbar className="top-6 shadow-lg" /> + </div> + ); +} + +function Navbar({ className }: { className?: string }) { + const [active, setActive] = useState<string | null>(null); + const location = useLocation(); // To track the current active page + + // Map of links to their path (for active state comparison) + const links = [ + { label: "Home", path: "#" }, + { label: "Features", path: "#agents" }, + { label: "Tokenomics", path: "#tokenomics" }, + { label: "Roadmap", path: "#roadmap" }, + ]; + + return ( + <div + className={cn( + "fixed top-10 inset-x-0 lg:max-w-7xl max-w-2xl mx-auto z-50 rounded-lg bg-gradient-to-r from-yellow-300 to-yellow-100", + className + )} + > + <Menu setActive={setActive}> + <div className="flex justify-between"> + <div className="flex items-center space-x-8"> + <a href="/"> + <img src="/logo.svg" alt="logo" className="w-36" /> + </a> + + {/* Navbar Links */} + <div className="flex items-center space-x-8"> + {links.map(({ label, path }) => { + const isActive = location.pathname === path; + + return ( + <motion.div + key={label} + whileHover={{ + scale: 1.05, // Scale slightly on hover + transition: { + type: "spring", + stiffness: 300, + damping: 20, + }, + }} + className="relative hover:border-b-2 border-neutral-800 duration-100" + > + <a href={path}> + <p + className={`${ + isActive ? "text-amber-500" : "text-gray-800" + } transition-colors duration-300 font-medium font-orbitron`} + > + {label} + </p> + </a> + + {/* Animated Underline for active link */} + {isActive && ( + <motion.div + className="absolute bottom-0 left-0 w-full h-[2px] bg-amber-500" + initial={{ width: 0 }} + animate={{ width: "100%" }} + transition={{ duration: 0.4 }} + /> + )} + </motion.div> + ); + })} + </div> + </div> + + {/* Social Icons with animation to slide in from the right */} + <div className="flex items-center space-x-3 justify-end"> + {["gitbook.svg", "github.svg", "X.svg"].map((src, index) => ( + <motion.a + href={ + src === "gitbook.svg" + ? "https://equilink.gitbook.io" + : src === "github.svg" + ? "https://github.com/Equilink-Suite" + : "" + } + target="_blank" + key={index} + className="p-3 border-[1px] hover:bg-yellow-400 rounded-xl bg-white shadow-lg" + initial={{ opacity: 0, x: 20 }} + animate={{ opacity: 1, x: 0 }} + transition={{ + delay: index * 0.2, + type: "spring", + stiffness: 300, + }} + whileHover={{ + scale: 1.1, // This is the Framer Motion scale on hover + transition: { duration: 0.2 }, // Smooth transition + }} + > + <img src={`/${src}`} className="w-6 h-auto" /> + </motion.a> + ))} + </div> + </div> + </Menu> + </div> + ); +} diff --git a/client/src/components/Notification.tsx b/client/src/components/Notification.tsx new file mode 100644 index 0000000..124c140 --- /dev/null +++ b/client/src/components/Notification.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +interface NotificationProps { + message: string; + type: 'error' | 'success' | 'info'; + onClose: () => void; +} + +const Notification: React.FC<NotificationProps> = ({ message, type, onClose }) => { + return ( + <div + className={`fixed inset-0 flex items-center justify-center z-50`} + onClick={onClose} + > + <div + className={`bg-white p-4 rounded shadow-md border ${ + type === 'error' ? 'border-red-500' : type === 'success' ? 'border-green-500' : 'border-blue-500' + }`} + > + <p className={`text-${type === 'error' ? 'red' : type === 'success' ? 'green' : 'blue'}-500`}> + {message} + </p> + </div> + </div> + ); +}; + +export default Notification; diff --git a/client/src/components/RandomAgentCard.tsx b/client/src/components/RandomAgentCard.tsx new file mode 100644 index 0000000..a031b4c --- /dev/null +++ b/client/src/components/RandomAgentCard.tsx @@ -0,0 +1,310 @@ +import React, { useState, useEffect } from 'react'; +import { + Heart, + MessageCircle, + Sparkles, + CheckCircle, + RefreshCcw, +} from 'lucide-react'; +import { Agent } from '../interfaces/AgentInterfaces'; +import LoadingBar from './LoadingBar'; + +// Define the props for AgentCard +interface RandomAgentCardProps { + agent: Agent; + onSelect: (agent: Agent) => Promise<void>; + onAddAgent: (agent: Agent) => void; + isUserAgent: boolean; + setRandomAgents: React.Dispatch<React.SetStateAction<Agent[]>>; + generateRandomAgentData: () => Promise<Agent>; + isLoadedAgent: boolean; + onRegenerate: (agentId: string) => Promise<void>; + isLoading?: boolean; + isExample?: boolean; +} + +const RandomAgentCard: React.FC<RandomAgentCardProps> = ({ + agent, + onSelect, + onAddAgent, + isUserAgent, + onRegenerate, +}) => { + const [isFlipped, setIsFlipped] = useState(false); + const [isRegenerating, setIsRegenerating] = useState(false); + const [isSelecting, setIsSelecting] = useState(false); + const [isAdded, setIsAdded] = useState(false); + const agentName = agent.name || 'Unknown Agent'; + const agentPersonality = Array.isArray(agent.personality) ? agent.personality : []; + const agentCommunicationStyle = Array.isArray(agent.communicationStyle) ? agent.communicationStyle : []; + const agentEmojis = Array.isArray(agent.emojis) ? agent.emojis : []; + const agentTags = Array.isArray(agent.tags) ? agent.tags : []; + const profileImageUrl = agent.avatar || ""; + const [showNewContent, setShowNewContent] = useState(true); + const [loadingProgress, setLoadingProgress] = useState(0); + + useEffect(() => { + let intervalId: number | undefined; + + if (agent.isLoading || isRegenerating) { + // Reset states when loading starts + setLoadingProgress(0); + setShowNewContent(false); + + // Immediately start filling to 30% + setLoadingProgress(30); + + // Start progress up to 90% + intervalId = window.setInterval(() => { + setLoadingProgress(prev => { + if (prev < 90) { + return Math.min(prev + 1, 90); + } + return prev; + }); + }, 30); + } else if (loadingProgress > 0) { + // When regeneration is complete, quickly fill to 100% + if (intervalId !== undefined) clearInterval(intervalId); + setLoadingProgress(100); + + // Show new content after progress bar completes + const timeout = setTimeout(() => { + setLoadingProgress(0); + setShowNewContent(true); + }, 500); + + return () => clearTimeout(timeout); + } + + return () => { + if (intervalId !== undefined) clearInterval(intervalId); + }; + }, [agent.isLoading, isRegenerating]); + + const addButton = agent.isExample ? ( + <button + onClick={(e) => { + e.stopPropagation(); + onSelect(agent); + }} + className="opacity-50 cursor-not-allowed bg-gray-500 text-white px-4 py-2 rounded" + > + Example Agent + </button> + ) : isAdded ? ( + <button + className="opacity-50 cursor-not-allowed bg-green-600 text-white px-4 py-2 rounded" + disabled + onClick={(e) => e.stopPropagation()} + > + Added ✓ + </button> + ) : ( + <button + onClick={async (e) => { + e.stopPropagation(); + if (isRegenerating) return; + setIsRegenerating(true); + try { + await onAddAgent(agent); + setIsAdded(true); + } finally { + setIsRegenerating(false); + } + }} + disabled={isRegenerating} + className={`bg-gradient-to-r from-cyan-600 to-orange-600 text-white px-4 py-2 rounded + ${isRegenerating ? 'opacity-50 cursor-not-allowed' : 'hover:from-cyan-700 hover:to-orange-700'}`} + > + {isRegenerating ? 'Adding...' : 'Add Agent'} + </button> + ); + + const selectButton = ( + <button + className={`w-full px-4 py-2 bg-gradient-to-r from-cyan-600 to-orange-600 rounded-md + flex items-center justify-center gap-2 text-white + ${isSelecting ? 'opacity-50 cursor-not-allowed' : 'hover:from-cyan-700 hover:to-orange-700'}`} + onClick={async (e) => { + e.stopPropagation(); + if (isSelecting) return; + setIsSelecting(true); + try { + await onSelect(agent); + } finally { + setIsSelecting(false); + } + }} + disabled={isSelecting} + > + <CheckCircle className={`w-4 h-4 ${isSelecting ? 'animate-spin' : ''}`} /> + {isSelecting ? 'Selecting...' : 'Select Agent'} + </button> + ); + + return ( + <div className="relative"> + {/* <div className="absolute top-2 right-2 bg-gray-700 text-white text-xs rounded px-2"> + {isUserAgent ? 'Loaded Agent' : 'Randomly Generated'} + </div> */} + <div + className="perspective w-64 h-[500px]" + onMouseEnter={() => !isRegenerating && setIsFlipped(true)} + onMouseLeave={() => !isRegenerating && setIsFlipped(false)} + onClick={(e) => { + e.stopPropagation(); + if (!isRegenerating) { + onSelect(agent); + } + }} + > + <div + className={`relative w-full h-full duration-500 preserve-3d ${ + isFlipped && !isRegenerating ? 'rotate-y-180' : '' + }`} + > + {/* Front of card */} + <div className="absolute w-full h-full backface-hidden"> + <div className="w-full h-full bg-slate-900/80 rounded-lg overflow-hidden shadow-xl border border-orange-500/30"> + <div className="relative h-[400px]"> + {(!showNewContent || agent.isLoading || isRegenerating || loadingProgress > 0) ? ( + <div className="w-full h-full bg-slate-900/80 flex items-center justify-center"> + <div className="w-3/4"> + <LoadingBar progress={loadingProgress} /> + </div> + </div> + ) : ( + <img + src={agent.avatar || ''} + alt={agent.avatar ? '' : 'Please regenerate again'} + className="w-full h-full object-cover" + style={{ display: agent.avatar ? 'block' : 'none' }} + /> + )} + {!agent.avatar && ( + <div className="w-full h-full flex items-center justify-center text-white"> + Please regenerate again + </div> + )} + <div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-gray-900 to-transparent h-16" /> + </div> + {/* Only show name and role when not flipped */} + <div className={`h-[100px] p-4 bg-slate-900/80 transition-opacity duration-200 ${ + isFlipped ? 'opacity-0' : 'opacity-100' + }`}> + <h3 className="text-xl font-bold text-gray-100 mb-1 truncate"> + {agentName} + </h3> + <p className="text-orange-300 text-sm truncate">{agent.role}</p> + </div> + </div> + </div> + + {/* Back of card */} + <div className="absolute w-full h-full backface-hidden rotate-y-180"> + <div className="w-full h-full bg-slate-900/80 rounded-lg p-4 shadow-xl border border-orange-500/30 flex flex-col"> + {/* Header with small image */} + <div className="flex gap-4 mb-4"> + <img + src={profileImageUrl} + alt="" + className="w-20 h-20 rounded-lg object-cover flex-shrink-0" + /> + <div className="overflow-hidden"> + <h3 className="text-xl font-bold text-gray-100 truncate"> + {agentName} + </h3> + <p className="text-orange-400 text-sm truncate">{agent.role}</p> + </div> + </div> + + {/* Content sections with better overflow handling */} + <div className="space-y-4 overflow-y-auto flex-grow mb-4 pr-2"> + <div> + <div className="flex items-center gap-2 text-gray-300 mb-1"> + <Heart className="w-4 h-4 text-orange-400 flex-shrink-0" /> + <span className="font-medium">Personality</span> + </div> + <p className="text-gray-400 text-sm break-words line-clamp-3"> + {agentPersonality.join(', ')} + </p> + </div> + + <div> + <div className="flex items-center gap-2 text-gray-300 mb-1"> + <MessageCircle className="w-4 h-4 text-orange-400 flex-shrink-0" /> + <span className="font-medium">Communication Style</span> + </div> + <p className="text-gray-400 text-sm break-words line-clamp-3"> + {agentCommunicationStyle.join(', ')} + </p> + </div> + + <div> + <div className="flex items-center gap-2 text-gray-300 mb-1"> + <Sparkles className="w-4 h-4 text-orange-400 flex-shrink-0" /> + <span className="font-medium">Emojis</span> + </div> + <p className="text-gray-400 text-sm break-words line-clamp-2"> + {agentEmojis.join(' ')} + </p> + </div> + + {/* Tags */} + <div className="flex gap-2 flex-wrap"> + {agentTags.map((tag, index) => ( + <span + key={index} + className="px-2 py-1 bg-orange-900/50 rounded-full text-xs text-orange-300 truncate max-w-[150px]" + > + {tag} + </span> + ))} + </div> + </div> + + {/* Action button - with solid background */} + <div className="absolute bottom-2 left-4 right-4"> + {/* Solid background container */} + <div className="bg-slate-900 rounded-md"> {/* Removed opacity, added rounded corners */} + <div className="relative px-4 py-2"> {/* Added some vertical padding */} + {isUserAgent ? selectButton : addButton} + </div> + </div> + </div> + </div> + </div> + </div> + </div> + + {/* Regenerate button below the card */} + {!isUserAgent && ( + <div className="mt-2 w-64 mx-auto"> + <button + data-agent-id={agent.id} + className={`w-full mt-2 py-2 bg-gradient-to-r from-[#F7F957] to-[#F9D02C] rounded-md + flex items-center justify-center gap-2 text-gray-700 + ${isRegenerating ? 'opacity-50 cursor-not-allowed' : 'hover:from-cyan-700 hover:to-orange-700'}`} + onClick={async (e) => { + e.stopPropagation(); + if (isRegenerating) return; + setIsRegenerating(true); + try { + await onRegenerate(agent.id?.toString() || Math.random().toString()); + } finally { + setIsRegenerating(false); + } + }} + disabled={isRegenerating} + > + <RefreshCcw className={`w-4 h-4 ${isRegenerating ? 'animate-spin' : ''}`} /> + {isRegenerating ? 'Regenerating...' : 'Regenerate'} + </button> + </div> + )} + </div> + ); +}; + +export default RandomAgentCard; \ No newline at end of file diff --git a/client/src/components/TraitButtons.tsx b/client/src/components/TraitButtons.tsx new file mode 100644 index 0000000..99a53e8 --- /dev/null +++ b/client/src/components/TraitButtons.tsx @@ -0,0 +1,51 @@ +import React, { useState } from 'react'; +import { Sparkles } from 'lucide-react'; + +interface TraitButtonsProps { + field: 'personality' | 'communication_style' | 'topic_expertise' | 'hashtags' | 'emojis'; + options: string[]; + onTraitButtonClick: (field: 'personality' | 'communication_style' | 'topic_expertise' | 'hashtags' | 'emojis', value: string) => void; +} + +// Component to render suggestion chips for a given field with provided options +const TraitButtons: React.FC<TraitButtonsProps> = ({ field, options, onTraitButtonClick }) => { + const [selectedOption, setSelectedOption] = useState<string | null>(null); // Track selected option + + const handleDeleteTrait = (option: string) => { + setSelectedOption(null); // Clear the selected option + onTraitButtonClick(field, option); // Call the click handler to delete the trait + }; + + return ( + <div className="flex flex-wrap gap-2 mb-4"> + {options.map((option, index) => ( + <div key={index} className="flex items-center"> + <button + className={`px-3 py-1 rounded-full transition-all duration-300 flex items-center justify-between + ${selectedOption === option ? 'bg-yellow-400 text-gray-600' : 'bg-gray-100/30 hover:bg-yellow-500/30 text-gray-700'} + border border-orange-500/30`} + onClick={() => { + setSelectedOption(option); // Update selected option + }} + > + <div className="flex items-center"> + <Sparkles className="w-4 h-4 mr-2 text-orange-400" /> + {option} + </div> + <span + className="text-red-500 ml-2 cursor-pointer" // Changed to span and added cursor pointer + onClick={(e) => { + e.stopPropagation(); // Prevent the click from bubbling up to the main button + handleDeleteTrait(option); // Handle delete action + }} + > + x + </span> + </button> + </div> + ))} + </div> + ); +}; + +export default TraitButtons; \ No newline at end of file diff --git a/client/src/components/button.tsx b/client/src/components/button.tsx new file mode 100644 index 0000000..04e60ac --- /dev/null +++ b/client/src/components/button.tsx @@ -0,0 +1,16 @@ +import React from 'react'; + +interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { + children: React.ReactNode; +} + +export const Button: React.FC<ButtonProps> = ({ children, className = '', ...props }) => { + return ( + <button + className={`px-4 py-2 rounded-lg text-white ${className}`} + {...props} + > + {children} + </button> + ); +}; \ No newline at end of file diff --git a/client/src/components/providers.tsx b/client/src/components/providers.tsx new file mode 100644 index 0000000..1c90679 --- /dev/null +++ b/client/src/components/providers.tsx @@ -0,0 +1,35 @@ +import { PrivyProvider } from "@privy-io/react-auth"; +import { toSolanaWalletConnectors } from "@privy-io/react-auth/solana"; + +const solanaConnectors = toSolanaWalletConnectors({ + // By default, shouldAutoConnect is enabled + shouldAutoConnect: true, +}); + +export default function Providers({ children }: { children: React.ReactNode }) { + return ( + <PrivyProvider + appId="cm6t7wm9y0i1wt680b4tukt8r" + config={{ + appearance: { + theme: "dark", + showWalletLoginFirst: false, + walletChainType: "solana-only", + walletList: ["phantom"], + }, + externalWallets: { + solana: { + connectors: solanaConnectors, + }, + }, + loginMethods: ["wallet", "email"], + embeddedWallets: { + createOnLogin: "all-users", + requireUserPasswordOnCreate: false, + }, + }} + > + {children} + </PrivyProvider> + ); +} diff --git a/client/src/components/sidebar.tsx b/client/src/components/sidebar.tsx new file mode 100644 index 0000000..4208e44 --- /dev/null +++ b/client/src/components/sidebar.tsx @@ -0,0 +1,114 @@ +import React, { useState } from "react"; +import { motion } from "framer-motion"; +import { + ChevronLeft, + ChevronRight, + UserPlus, + Users, + MessageSquare, + LogOut, +} from "lucide-react"; +import { Link, useNavigate } from "react-router-dom"; +import { usePrivy } from "@privy-io/react-auth"; + +const Sidebar = () => { + const [isOpen, setIsOpen] = useState(true); + const {logout} = usePrivy() + const navigate = useNavigate() + const toggleSidebar = () => { + setIsOpen(!isOpen); + }; + + const sidebarVariants = { + open: { + width: "300px", + transition: { + type: "spring", + stiffness: 200, + damping: 25, + }, + }, + closed: { + width: "0px", + transition: { + type: "spring", + stiffness: 200, + damping: 25, + }, + }, + }; + + const menuItems = [ + { icon: <UserPlus size={20} />, text: "Create Agent", link: "/create-agent" }, + { icon: <Users size={20} />, text: "Browse Agents", link: "/browse-agents" }, + { icon: <MessageSquare size={20} />, text: "Chat with Agent", link: "/chat" }, + ]; + + return ( + <div className="relative"> + {/* Toggle Button - Positioned absolutely relative to the container */} + <button + onClick={toggleSidebar} + className="fixed top-8 left-0 z-50 bg-yellow-400 rounded-full p-1.5 + hover:bg-yellow-500 transition-colors" + style={{ + left: isOpen ? "282px" : "12px", + transition: "left 0.3s ease-in-out", + }} + > + {isOpen ? <ChevronLeft size={16} /> : <ChevronRight size={16} />} + </button> + + <motion.div + initial="open" + animate={isOpen ? "open" : "closed"} + variants={sidebarVariants} + className="h-screen bg-white shadow-lg flex flex-col overflow-hidden" + > + {isOpen && ( + <div className="flex flex-col h-full"> + {/* Logo Section */} + <Link to="/" className="flex items-center p-4"> + <img src="/logo.svg" alt="Logo" className="w-[80%] h-auto" /> + </Link> + + {/* Navigation Items */} + <div className="flex-1 px-3 py-8 flex flex-col gap-2 items-stretch"> + {menuItems.map((item, index) => ( + <Link to={item.link}> + <motion.button + key={index} + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + className="flex w-full items-center p-3 rounded-lg hover:bg-yellow-50 + text-gray-700 hover:text-yellow-600 transition-colors justify-start" + > + {item.icon} + <span className="ml-3 whitespace-nowrap">{item.text}</span> + </motion.button> + </Link> + ))} + </div> + + {/* Logout Button */} + <motion.button + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + onClick={()=>{ + logout() + navigate("/") + }} + className="m-4 p-3 flex items-center rounded-lg bg-yellow-400 + hover:bg-yellow-500 text-gray-800 transition-colors justify-start" + > + <LogOut size={20} /> + <span className="ml-3 whitespace-nowrap">Logout</span> + </motion.button> + </div> + )} + </motion.div> + </div> + ); +}; + +export default Sidebar; diff --git a/client/src/components/tokenomics.tsx b/client/src/components/tokenomics.tsx new file mode 100644 index 0000000..eb4a16d --- /dev/null +++ b/client/src/components/tokenomics.tsx @@ -0,0 +1,92 @@ +import React from "react"; +import { PieChart, Pie, Cell, ResponsiveContainer } from "recharts"; +import { motion } from "framer-motion"; + +const COLORS = ["#F7A600", "#FFD700", "#FFEC80", "#D3D3D3"]; + +const data = [ + { name: "Developer Wallet Allocation", value: 5, color: "#F7A600" }, + { name: "Team", value: 2, color: "#FFD700" }, + { name: "Marketing & Operations", value: 1, color: "#FFEC80" }, + { name: "Treasury & Ecosystem", value: 2, color: "#D3D3D3" }, +]; + +const vestingData = [ + { name: "2% Locked (2 Years)", color: "#D3D3D3" }, + { name: "0.5% for Marketing", color: "#E0E0E0" }, + { name: "0.5% Treasury Liquidity", color: "#F0F0F0" }, +]; + +const Tokenomics: React.FC = () => { + return ( + <div id="tokenomics" className="grid md:grid-cols-2 gap-10 items-center justify-center p-10 w-full"> + {/* Animated Pie Chart */} + <motion.div + initial={{ opacity: 0, scale: 0.8 }} + animate={{ opacity: 1, scale: 1 }} + transition={{ duration: 0.8 }} + className="flex justify-center" + > + <ResponsiveContainer width={600} height={600}> + <PieChart> + <Pie + data={data} + cx="50%" + cy="50%" + innerRadius={120} + outerRadius={180} + fill="#8884d8" + paddingAngle={5} + dataKey="value" + className="w-full h-full" + > + {data.map((entry, index) => ( + <Cell key={`cell-${index}`} fill={entry.color} /> + ))} + </Pie> + </PieChart> + </ResponsiveContainer> + </motion.div> + + {/* Tokenomics Info */} + <motion.div + initial={{ opacity: 0, x: 50 }} + animate={{ opacity: 1, x: 0 }} + transition={{ duration: 0.8 }} + className="text-left" + > + <h2 className="text-4xl font-orbitron font-bold mb-4">Tokenomics</h2> + <p className="text-gray-500 mb-4"> + Transparent Allocation – Designed for Growth and Sustainability + </p> + + <div className="mb-6 space-y-2"> + {data.map((item, index) => ( + <div key={index} className="flex items-center"> + <div + className="w-4 h-4 rounded mr-2" + style={{ backgroundColor: item.color }} + ></div> + <p className="text-lg">{item.name} ({item.value}%)</p> + </div> + ))} + </div> + + <h3 className="text-xl font-semibold mb-3">Vesting Plan</h3> + <div className="space-y-2"> + {vestingData.map((item, index) => ( + <div key={index} className="flex items-center"> + <div + className="w-4 h-4 rounded mr-2" + style={{ backgroundColor: item.color }} + ></div> + <p className="text-lg">{item.name}</p> + </div> + ))} + </div> + </motion.div> + </div> + ); +}; + +export default Tokenomics; diff --git a/client/src/components/ui/PixelCard.jsx b/client/src/components/ui/PixelCard.jsx new file mode 100644 index 0000000..bbb411e --- /dev/null +++ b/client/src/components/ui/PixelCard.jsx @@ -0,0 +1,274 @@ +import { useEffect, useRef } from "react"; + +class Pixel { + constructor(canvas, context, x, y, color, speed, delay) { + this.width = canvas.width; + this.height = canvas.height; + this.ctx = context; + this.x = x; + this.y = y; + this.color = color; + this.speed = this.getRandomValue(0.1, 0.9) * speed; + this.size = 0; + this.sizeStep = Math.random() * 0.4; + this.minSize = 0.5; + this.maxSizeInteger = 2; + this.maxSize = this.getRandomValue(this.minSize, this.maxSizeInteger); + this.delay = delay; + this.counter = 0; + this.counterStep = Math.random() * 4 + (this.width + this.height) * 0.01; + this.isIdle = false; + this.isReverse = false; + this.isShimmer = false; + } + + getRandomValue(min, max) { + return Math.random() * (max - min) + min; + } + + draw() { + const centerOffset = this.maxSizeInteger * 0.5 - this.size * 0.5; + this.ctx.fillStyle = this.color; + this.ctx.fillRect( + this.x + centerOffset, + this.y + centerOffset, + this.size, + this.size + ); + } + + appear() { + this.isIdle = false; + if (this.counter <= this.delay) { + this.counter += this.counterStep; + return; + } + if (this.size >= this.maxSize) { + this.isShimmer = true; + } + if (this.isShimmer) { + this.shimmer(); + } else { + this.size += this.sizeStep; + } + this.draw(); + } + + disappear() { + this.isShimmer = false; + this.counter = 0; + if (this.size <= 0) { + this.isIdle = true; + return; + } else { + this.size -= 0.1; + } + this.draw(); + } + + shimmer() { + if (this.size >= this.maxSize) { + this.isReverse = true; + } else if (this.size <= this.minSize) { + this.isReverse = false; + } + if (this.isReverse) { + this.size -= this.speed; + } else { + this.size += this.speed; + } + } +} + +function getEffectiveSpeed(value, reducedMotion) { + const min = 0; + const max = 100; + const throttle = 0.001; + const parsed = parseInt(value, 10); + + if (parsed <= min || reducedMotion) { + return min; + } else if (parsed >= max) { + return max * throttle; + } else { + return parsed * throttle; + } +} + +/** + * You can change/expand these as you like. + */ +const VARIANTS = { + default: { + activeColor: null, + gap: 5, + speed: 35, + colors: "#f8fafc,#f1f5f9,#cbd5e1", + noFocus: false + }, + blue: { + activeColor: "#e0f2fe", + gap: 10, + speed: 25, + colors: "#e0f2fe,#7dd3fc,#0ea5e9", + noFocus: false + }, + yellow: { + activeColor: "#fef08a", + gap: 3, + speed: 20, + colors: "#fef08a,#fde047,#eab308", + noFocus: false + }, + pink: { + activeColor: "#fecdd3", + gap: 6, + speed: 80, + colors: "#fecdd3,#fda4af,#e11d48", + noFocus: true + } +}; + +export default function PixelCard({ + variant = "default", + gap, + speed, + colors, + noFocus, + className = "", + children +}) { + const containerRef = useRef(null); + const canvasRef = useRef(null); + const pixelsRef = useRef([]); + const animationRef = useRef(null); + const timePreviousRef = useRef(performance.now()); + const reducedMotion = useRef( + window.matchMedia("(prefers-reduced-motion: reduce)").matches + ).current; + + const variantCfg = VARIANTS[variant] || VARIANTS.default; + const finalGap = gap ?? variantCfg.gap; + const finalSpeed = speed ?? variantCfg.speed; + const finalColors = colors ?? variantCfg.colors; + const finalNoFocus = noFocus ?? variantCfg.noFocus; + + const initPixels = () => { + if (!containerRef.current || !canvasRef.current) return; + + const rect = containerRef.current.getBoundingClientRect(); + const width = Math.floor(rect.width); + const height = Math.floor(rect.height); + const ctx = canvasRef.current.getContext("2d"); + + canvasRef.current.width = width; + canvasRef.current.height = height; + canvasRef.current.style.width = `${width}px`; + canvasRef.current.style.height = `${height}px`; + + const colorsArray = finalColors.split(","); + const pxs = []; + for (let x = 0; x < width; x += parseInt(finalGap, 10)) { + for (let y = 0; y < height; y += parseInt(finalGap, 10)) { + const color = + colorsArray[Math.floor(Math.random() * colorsArray.length)]; + + const dx = x - width / 2; + const dy = y - height / 2; + const distance = Math.sqrt(dx * dx + dy * dy); + const delay = reducedMotion ? 0 : distance; + + pxs.push( + new Pixel( + canvasRef.current, + ctx, + x, + y, + color, + getEffectiveSpeed(finalSpeed, reducedMotion), + delay + ) + ); + } + } + pixelsRef.current = pxs; + }; + + const doAnimate = (fnName) => { + animationRef.current = requestAnimationFrame(() => doAnimate(fnName)); + const timeNow = performance.now(); + const timePassed = timeNow - timePreviousRef.current; + const timeInterval = 1000 / 60; // ~60 FPS + + if (timePassed < timeInterval) return; + timePreviousRef.current = timeNow - (timePassed % timeInterval); + + const ctx = canvasRef.current?.getContext("2d"); + if (!ctx || !canvasRef.current) return; + + ctx.clearRect(0, 0, canvasRef.current.width, canvasRef.current.height); + + let allIdle = true; + for (let i = 0; i < pixelsRef.current.length; i++) { + const pixel = pixelsRef.current[i]; + pixel[fnName](); + if (!pixel.isIdle) { + allIdle = false; + } + } + if (allIdle) { + cancelAnimationFrame(animationRef.current); + } + }; + + const handleAnimation = (name) => { + cancelAnimationFrame(animationRef.current); + animationRef.current = requestAnimationFrame(() => doAnimate(name)); + }; + + const onMouseEnter = () => handleAnimation("appear"); + const onMouseLeave = () => handleAnimation("disappear"); + const onFocus = (e) => { + if (e.currentTarget.contains(e.relatedTarget)) return; + handleAnimation("appear"); + }; + const onBlur = (e) => { + if (e.currentTarget.contains(e.relatedTarget)) return; + handleAnimation("disappear"); + }; + + useEffect(() => { + initPixels(); + const observer = new ResizeObserver(() => { + initPixels(); + }); + if (containerRef.current) { + observer.observe(containerRef.current); + } + return () => { + observer.disconnect(); + cancelAnimationFrame(animationRef.current); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [finalGap, finalSpeed, finalColors, finalNoFocus]); + + return ( + <div + ref={containerRef} + className={`h-[400px] w-[300px] relative shadow-lg overflow-hidden grid place-items-center aspect-[4/5] border border-[#c2c2c2] rounded-[25px] isolate transition-colors duration-200 ease-[cubic-bezier(0.5,1,0.89,1)] select-none ${className}`} + + onMouseEnter={onMouseEnter} + onMouseLeave={onMouseLeave} + + onFocus={finalNoFocus ? undefined : onFocus} + onBlur={finalNoFocus ? undefined : onBlur} + tabIndex={finalNoFocus ? -1 : 0} + > + <canvas + className="w-full h-full block" + ref={canvasRef} + /> + {children} + </div> + ); +} diff --git a/client/src/components/ui/button.tsx b/client/src/components/ui/button.tsx new file mode 100644 index 0000000..dcfee0c --- /dev/null +++ b/client/src/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "../../lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes<HTMLButtonElement>, + VariantProps<typeof buttonVariants> { + asChild?: boolean +} + +const Button = React.forwardRef<HTMLButtonElement, ButtonProps>( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + <Comp + className={cn(buttonVariants({ variant, size, className }))} + ref={ref} + {...props} + /> + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/client/src/components/ui/card-new.tsx b/client/src/components/ui/card-new.tsx new file mode 100644 index 0000000..5e0de0a --- /dev/null +++ b/client/src/components/ui/card-new.tsx @@ -0,0 +1,176 @@ +import React from 'react'; +import styled, { keyframes } from 'styled-components'; + +interface CardProps { + heading?: string; + content?: string; + bgColor?: string; + bgColorLight?: string; + textColorHover?: string; + boxShadowColor?: string; + icon?: React.ReactNode; +} + +const sparkleAnimation = keyframes` + 0% { + transform: scale(0) rotate(0deg); + opacity: 0; + } + 50% { + transform: scale(1.2) rotate(180deg); + opacity: 1; + } + 100% { + transform: scale(0) rotate(360deg); + opacity: 0; + } +`; + +const CardWrapper = styled.div<CardProps>` + position: relative; + + .sparkle { + position: absolute; + width: 20px; + height: 20px; + background: radial-gradient(circle, rgba(255,255,255,0.8) 0%, transparent 70%); + border-radius: 50%; + pointer-events: none; + z-index: 1000; + animation: ${sparkleAnimation} 1s ease-in-out infinite; + } + + .custom-card { + width: 400px; + border-radius:15px; + height: 500px; + background: #fff; + border-top-right-radius: 10px; + overflow: hidden; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + position: relative; + box-shadow: 0 14px 26px rgba(0,0,0,0.1); + transition: all 0.3s ease-out; + text-decoration: none; + + /* Custom color variables */ + --bg-color: ${props => props.bgColor || '#ffd861'}; + --bg-color-light: ${props => props.bgColorLight || '#ffeeba'}; + --text-color-hover: ${props => props.textColorHover || '#4C5656'}; + --box-shadow-color: ${props => props.boxShadowColor || 'rgba(255, 215, 97, 0.48)'}; + } + + .custom-card:hover { + transform: translateY(-5px) scale(1.005) translateZ(0); + box-shadow: 0 24px 36px rgba(0,0,0,0.11), + 0 24px 46px var(--box-shadow-color); + } + + .custom-card:hover .overlay { + transform: scale(8) translateZ(0); + } + + .circle { + width: 131px; + height: 131px; + border-radius: 50%; + background: #fff; + border: 3px solid var(--bg-color); + display: flex; + justify-content: center; + align-items: center; + position: relative; + z-index: 1; + transition: all 0.3s ease-out; + margin-bottom: 20px; + } + + .circle svg { + width: 60px; + height: 60px; + color: var(--bg-color); + } + + .overlay { + width: 170px; + position: absolute; + height: 170px; + border-radius: 50%; + background: var(--bg-color); + top: 330px; + left: 400px; + z-index: 0; + transition: transform 0.3s ease-out; + } + + .card-heading { + font-size: 20px; + font-weight: bold; + color: #333; + margin-bottom: 15px; + z-index: 1000; + } + + .card-content { + font-size: 17px; + color: #4C5656; + text-align: center; + padding: 0 20px; + z-index: 1000; + transition: color 0.3s ease-out; + } +`; + +const Card: React.FC<CardProps> = ({ + heading, + content, + bgColor, + bgColorLight, + textColorHover, + boxShadowColor, + icon +}) => { + const renderSparkles = () => { + const sparkles = []; + for (let i = 0; i < 5; i++) { + sparkles.push( + <div + key={i} + className="sparkle" + style={{ + top: `${Math.random() * 100}%`, + left: `${Math.random() * 100}%`, + animationDelay: `${Math.random()}s` + }} + /> + ); + } + return sparkles; + }; + + return ( + <CardWrapper + bgColor={bgColor} + bgColorLight={bgColorLight} + textColorHover={textColorHover} + boxShadowColor={boxShadowColor} + > + <div className="body"> + <div className="custom-card p-3"> + {renderSparkles()} + <div className="overlay" /> + <div className="circle"> + {icon} + </div> + {heading && <div className="text-2xl z-50 font-bold my-3 text-gray-700">{heading}</div>} + {content && <div className="card-content">{content}</div>} + </div> + </div> + </CardWrapper> + ); +}; + +export default Card; \ No newline at end of file diff --git a/client/src/components/ui/hero-backround.tsx b/client/src/components/ui/hero-backround.tsx new file mode 100644 index 0000000..6c15435 --- /dev/null +++ b/client/src/components/ui/hero-backround.tsx @@ -0,0 +1,127 @@ +import { Canvas, useFrame, useThree } from '@react-three/fiber'; +import { useRef, useEffect, useState } from 'react'; +import * as THREE from 'three'; +import Stats from 'three/addons/libs/stats.module.js'; + +function SmokeParticles() { + const groupRef = useRef(); + const particlesRef = useRef([]); + const clockRef = useRef(new THREE.Clock()); + const statsRef = useRef(); + const { scene, size } = useThree(); + const [mousePos, setMousePos] = useState({ x: 0, y: 0 }); + + + + // Update mouse position + useEffect(() => { + const handleMouseMove = (event) => { + const x = (event.clientX / size.width) * 2 - 1; + const y = -(event.clientY / size.height) * 2 + 1; + setMousePos({ x, y }); + }; + + window.addEventListener("mousemove", handleMouseMove); + return () => window.removeEventListener("mousemove", handleMouseMove); + }, [size]); + + // Create smoke particles + useEffect(() => { + const loader = new THREE.TextureLoader(); + + loader.load('https://s3-us-west-2.amazonaws.com/s.cdpn.io/95637/Smoke-Element.png', (smokeTexture) => { + const smokeGeo = new THREE.PlaneGeometry(300, 300); + + for (let p = 0; p < 150; p++) { + const colors = [0xFFD700, 0xFACC15, 0xFFA500]; // Gold, yellow-400, amber + const randomColor = colors[Math.floor(Math.random() * colors.length)]; + + const smokeMaterial = new THREE.MeshLambertMaterial({ + color: randomColor, + map: smokeTexture, + transparent: true, + opacity: Math.random() * 0.6 + 0.4, // More vibrant + emissive: randomColor, + emissiveIntensity: 1.2, // Stronger glow + }); + + const particle = new THREE.Mesh(smokeGeo, smokeMaterial); + particle.position.set( + Math.random() * 500 - 250, + Math.random() * 500 - 250, + Math.random() * 1000 - 100 + ); + particle.rotation.z = Math.random() * 360; + particle.userData.originalPos = { ...particle.position }; + groupRef.current.add(particle); + particlesRef.current.push(particle); + } + }); + + // Add a golden light for extra glow + const light = new THREE.PointLight(0xFFD700, 2.0, 2000); + light.position.set(0, 0, 500); + scene.add(light); + + }, [scene]); + + // Animation loop with smooth wind effect + useFrame(() => { + if (statsRef.current) statsRef.current.begin(); + + const delta = clockRef.current.getDelta(); + + particlesRef.current.forEach((particle) => { + if (particle) { + particle.rotation.z += delta * 0.2; + + // Get particle position + const particlePos = particle.position; + const originalPos = particle.userData.originalPos; + + // Calculate distance from mouse + const dx = (mousePos.x * 500) - particlePos.x; + const dy = (mousePos.y * 500) - particlePos.y; + const distance = Math.sqrt(dx * dx + dy * dy); + + // Wind effect: move particles with a slight random offset + if (distance < 150) { + particlePos.x += dx * 0.02 + (Math.random() - 0.5) * 2; + particlePos.y += dy * 0.02 + (Math.random() - 0.5) * 2; + } + + // Smoothly return particles to original position but with a slight offset + particlePos.x = THREE.MathUtils.lerp(particlePos.x, originalPos.x + (Math.random() - 0.5) * 5, delta); + particlePos.y = THREE.MathUtils.lerp(particlePos.y, originalPos.y + (Math.random() - 0.5) * 5, delta); + } + }); + + if (statsRef.current) statsRef.current.end(); + }); + + return <group ref={groupRef} />; +} + +export default function SmokeEffect() { + return ( + <Canvas + style={{ + position: 'absolute', + top: 0, + left: 0, + width: '100vw', + height: '100vh', + zIndex: -10, + background: 'white' + }} + camera={{ + fov: 75, + position: [0, 0, 1000], + near: 1, + far: 10000 + }} + > + <SmokeParticles /> + </Canvas> + ); +} diff --git a/client/src/components/ui/info-card.tsx b/client/src/components/ui/info-card.tsx new file mode 100644 index 0000000..f966314 --- /dev/null +++ b/client/src/components/ui/info-card.tsx @@ -0,0 +1,41 @@ +import React from "react"; +import { motion } from "framer-motion"; + +interface CardProps { + number: string; + heading: string; + description: string; + numberBgColor: string; + numberTextColor: string; +} + +const InfoCard: React.FC<CardProps> = ({ + number, + heading, + description, + numberBgColor, + numberTextColor, +}) => { + return ( + <motion.div + className="w-full p-6 my-4 bg-white rounded-lg shadow-md" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <div className="flex items-center space-x-4"> + <div + className="w-12 h-12 flex items-center justify-center rounded-md font-orbitron text-xl font-bold" + style={{ backgroundColor: numberBgColor, color: numberTextColor }} + > + <p>{number}</p> + </div> + <h3 className="text-2xl font-semibold text-gray-800">{heading}</h3> + </div> + <p className="mt-4 text-lg text-left text-gray-600">{description}</p> + </motion.div> + ); +}; + +export default InfoCard; diff --git a/client/src/components/ui/navbar-menu.tsx b/client/src/components/ui/navbar-menu.tsx new file mode 100644 index 0000000..88cc418 --- /dev/null +++ b/client/src/components/ui/navbar-menu.tsx @@ -0,0 +1,119 @@ +import React from "react"; +import { motion } from "framer-motion"; +import {Link} from "react-router-dom" + +const transition = { + type: "spring", + mass: 0.5, + damping: 11.5, + stiffness: 100, + restDelta: 0.001, + restSpeed: 0.001, +}; + +export const MenuItem = ({ + setActive, + active, + item, + children, +}: { + setActive: (item: string) => void; + active: string | null; + item: string; + children?: React.ReactNode; +}) => { + return ( + <div onMouseEnter={() => setActive(item)} className="relative "> + <motion.p + transition={{ duration: 0.3 }} + className="cursor-pointer text-black hover:opacity-[0.9]" + > + {item} + </motion.p> + {active !== null && ( + <motion.div + initial={{ opacity: 0, scale: 0.85, y: 10 }} + animate={{ opacity: 1, scale: 1, y: 0 }} + transition={transition} + > + {active === item && ( + <div className="absolute top-[calc(100%_+_1.2rem)] left-1/2 transform -translate-x-1/2 pt-4"> + <motion.div + transition={transition} + layoutId="active" // layoutId ensures smooth animation + className="bg-white backdrop-blur-sm rounded-2xl overflow-hidden border border-black/[0.2] shadow-xl" + > + <motion.div + layout // layout ensures smooth animation + className="w-max h-full p-4" + > + {children} + </motion.div> + </motion.div> + </div> + )} + </motion.div> + )} + </div> + ); +}; + +export const Menu = ({ + setActive, + children, +}: { + setActive: (item: string | null) => void; + children: React.ReactNode; +}) => { + return ( + <nav + onMouseLeave={() => setActive(null)} // resets the state + className="relative rounded-xl border border-transparent shadow-input space-x-4 px-8 py-4 " + > + {children} + </nav> + ); +}; + +export const ProductItem = ({ + title, + description, + href, + src, +}: { + title: string; + description: string; + href: string; + src: string; +}) => { + return ( + <Link to={href} className="flex space-x-2"> + <img + src={src} + width={140} + height={70} + alt={title} + className="flex-shrink-0 rounded-md shadow-2xl" + /> + <div> + <h4 className="text-xl font-bold mb-1 text-black"> + {title} + </h4> + <p className="text-neutral-700 text-sm max-w-[10rem]"> + {description} + </p> + </div> + </Link> + ); +}; + +export const HoveredLink = ({ children, ...rest }: any) => { + return ( + <Link + {...rest} + className="text-neutral-700 hover:text-black " + > + {children} + </Link> + ); +}; diff --git a/client/src/context/AgentContext.tsx b/client/src/context/AgentContext.tsx new file mode 100644 index 0000000..051f2f3 --- /dev/null +++ b/client/src/context/AgentContext.tsx @@ -0,0 +1,27 @@ +import React, { createContext, useContext, useState } from 'react'; +import { Agent } from '../interfaces/AgentInterfaces'; + +interface AgentContextType { + selectedAgent: Agent | null; + setSelectedAgent: (agent: Agent | null) => void; +} + +const AgentContext = createContext<AgentContextType | undefined>(undefined); + +export const AgentProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [selectedAgent, setSelectedAgent] = useState<Agent | null>(null); + + return ( + <AgentContext.Provider value={{ selectedAgent, setSelectedAgent }}> + {children} + </AgentContext.Provider> + ); +}; + +export const useAgent = () => { + const context = useContext(AgentContext); + if (context === undefined) { + throw new Error('useAgent must be used within an AgentProvider'); + } + return context; +}; \ No newline at end of file diff --git a/client/src/hooks/useCharacterSelection.ts b/client/src/hooks/useCharacterSelection.ts new file mode 100644 index 0000000..3f93191 --- /dev/null +++ b/client/src/hooks/useCharacterSelection.ts @@ -0,0 +1,30 @@ +import { useState } from 'react'; + +/** + * useCharacterSelection - A custom hook to manage character selection logic. + * + * Responsibilities: + * 1. Manages the `selectedCharacter` state. + * 2. Provides a function (`handleCharacterSelect`) to update the selected character. + * 3. Ensures the selected character data is validated before updating. + */ +const useCharacterSelection = () => { + const [selectedCharacter, setSelectedCharacter] = useState(null); // Holds the currently selected character. + + /** + * handleCharacterSelect - Updates the selected character. + * + * @param character - The character to select. + */ + const handleCharacterSelect = (character: any) => { + if (!character?.agent?.agent_details) { + console.error('Invalid character data'); // Log an error if the character data structure is invalid. + return; + } + setSelectedCharacter(character); // Update the selected character state. + }; + + return { selectedCharacter, handleCharacterSelect, setSelectedCharacter }; // Return the state and handlers for character selection. +}; + +export default useCharacterSelection; diff --git a/client/src/hooks/useCharacters.ts b/client/src/hooks/useCharacters.ts new file mode 100644 index 0000000..af60b0f --- /dev/null +++ b/client/src/hooks/useCharacters.ts @@ -0,0 +1,37 @@ +import useFetchCharacters from './useFetchCharacters'; +import useProcessCharacters from './useProcessCharacters'; +import useCharacterSelection from './useCharacterSelection'; +import { useEffect } from 'react'; + +/** + * useCharacters - A composed custom hook to manage character data and selection. + * + * Responsibilities: + * 1. Fetches raw character data using `useFetchCharacters`. + * 2. Processes raw character data into a usable format using `useProcessCharacters`. + * 3. Manages character selection logic using `useCharacterSelection`. + * 4. Automatically selects the first character by default when characters are loaded. + */ +const useCharacters = () => { + const { characters: rawCharacters, loading, error } = useFetchCharacters(); // Fetch raw characters and track fetch state. + const processedCharacters = useProcessCharacters(rawCharacters); // Process the raw characters into a usable format. + const { selectedCharacter, handleCharacterSelect, setSelectedCharacter } = useCharacterSelection(); // Manage character selection. + + // Automatically select the first character when characters are loaded. + useEffect(() => { + if (!selectedCharacter && processedCharacters.length > 0) { + handleCharacterSelect(processedCharacters[0]); // Select the first character by default. + } + }, [processedCharacters, selectedCharacter, handleCharacterSelect]); + + return { + characters: processedCharacters, // The processed characters data. + selectedCharacter, // The currently selected character. + setSelectedCharacter, // Function to manually update the selected character. + loading, // Whether the characters are still being fetched. + error, // Any error that occurred during the fetch. + handleCharacterSelect, // Function to select a character. + }; +}; + +export default useCharacters; diff --git a/client/src/hooks/useFetchCharacters.ts b/client/src/hooks/useFetchCharacters.ts new file mode 100644 index 0000000..6ecc5ba --- /dev/null +++ b/client/src/hooks/useFetchCharacters.ts @@ -0,0 +1,42 @@ +import { useState, useEffect } from 'react'; +import { getCharacters } from '../api/agentsAPI'; +import { Agent } from '../interfaces/AgentInterfaces'; + +/** + * useFetchCharacters - A custom hook to fetch characters from the API. + * + * Responsibilities: + * 1. Handles the API call to GET/fetch character data. + * 2. Manages the state for `characters`, `loading`, and `error`. + * 3. Provides feedback on the fetch process (loading and error states). + */ +const useFetchCharacters = () => { +const [characters, setCharacters] = useState<Agent[]>([]); // Explicitly typed with your Agent interface +const [loading, setLoading] = useState(true); // Tracks whether the API call is in progress. + const [error, setError] = useState<Error | null>(null); // Tracks any errors during the fetch process. + + useEffect(() => { + const fetchCharacters = async () => { + setLoading(true); // Mark the fetch as in progress. + try { + const data = await getCharacters(); // Call the API to fetch characters. + if (!Array.isArray(data)) { + throw new Error(`Expected array, received: ${typeof data}`); // Validate the response type. + } + setCharacters(data); // Save the fetched data to state. + } catch (err) { + // Handle errors during the fetch process. + const error = err instanceof Error ? err : new Error('Failed to fetch characters'); + setError(error); + } finally { + setLoading(false); // Mark the fetch as complete, regardless of success or failure. + } + }; + + fetchCharacters(); // Execute the fetch when the hook is used. + }, []); // Dependency array is empty to ensure this runs only once on component mount. + + return { characters, loading, error }; // Return the characters data and state for use in components. +}; + +export default useFetchCharacters; diff --git a/client/src/hooks/useProcessCharacters.ts b/client/src/hooks/useProcessCharacters.ts new file mode 100644 index 0000000..793a841 --- /dev/null +++ b/client/src/hooks/useProcessCharacters.ts @@ -0,0 +1,44 @@ +/** + * useProcessCharacters - A custom hook to transform raw character data into a usable format. + * + * Responsibilities: + * 1. Maps and processes raw data from the API. + * 2. Ensures all necessary fields are structured and default values are applied. + * 3. Provides a consistent and clean data structure for use in the application. + */ +const useProcessCharacters = (characters: any[]) => { + const processedCharacters = characters.map((char) => { + // Char is the raw data from the API + // Destructure the char object to extract the necessary fields + const { agent } = char; + + return { + agent: { + agent_details: { + name: agent?.agent_details?.name || '', + personality: agent?.agent_details?.personality || [], + communication_style: agent?.agent_details?.communication_style || [], + backstory: agent?.agent_details?.backstory || '', + universe: agent?.agent_details?.universe || '', + topic_expertise: agent?.agent_details?.topic_expertise || [], + hashtags: agent?.agent_details?.hashtags || [], + emojis: agent?.agent_details?.emojis || [], + concept: agent?.concept || '', + }, + profile_image: agent?.profile_image || {}, + concept: agent?.concept || '', + profile_image_options: agent?.profile_image_options || [], + ai_model: agent?.ai_model || {}, + connectors: agent?.connectors || {}, + seasons: agent?.seasons || [], + tracker: agent?.tracker || {}, + master_file_path: agent?.master_file_path || '', + } + }; + }); + + return processedCharacters; // Return the processed data for use in the application. + }; + + export default useProcessCharacters; + \ No newline at end of file diff --git a/client/src/index.css b/client/src/index.css new file mode 100644 index 0000000..b6f33b5 --- /dev/null +++ b/client/src/index.css @@ -0,0 +1,26 @@ +@import url("https://fonts.googleapis.com/css2?family=Orbitron:wght@400..900&display=swap"); +@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap'); + +@tailwind base; +@tailwind components; +@tailwind utilities; + +.font-orbitron{ + font-family: "Orbitron", sans-serif; +} + +/* @layer base { + body { + @apply m-0 min-h-screen bg-slate-950; + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } +} + +/* Only keep custom styles that can't be handled by Tailwind */ +/* @layer components { + .gradient-text { + @apply bg-gradient-to-r from-cyan-400 via-orange-400 to-red-400 bg-clip-text text-transparent; + } +} */ diff --git a/client/src/interfaces/AgentInterfaces.ts b/client/src/interfaces/AgentInterfaces.ts new file mode 100644 index 0000000..30e3e01 --- /dev/null +++ b/client/src/interfaces/AgentInterfaces.ts @@ -0,0 +1,143 @@ +export interface AgentDetails { + id?: string | number; + name: string; + personality: string[]; + communication_style: string[]; + backstory: string; + universe: string; + topic_expertise: string[]; + hashtags: string[]; + emojis: string[]; +} + +export interface ProfileImage { + details: { + url: string; + image_id: string; + generationId: string; + }; + [key: string]: unknown; +} + +export interface GeneratedImage { + url: string; + id: string; + generationId: string; +} + +export interface GenerationsByPk { + id?: string; + prompt?: string; + generated_images: GeneratedImage[]; +} + +export interface ProfileImageOption { + generations_by_pk: GenerationsByPk; +} + +export interface Agent { + id?: string | number; + name?: string; + avatar?: string; + shortDescription?: string; + tags?: string[]; + personality?: string[]; + communicationStyle?: string[]; + emojis?: string[]; + hashtags?: string[]; + universe?: string; + backstory?: string; + concept?: string; + role?: string; + isLoading?: boolean; + leonardoResponse?: any; + leonardoImage?: any; + topic_expertise?: string[]; + agent?: { + concept: string; + agent_details: AgentDetails; + ai_model: { + memory_store: string; + model_name: string; + model_type: string; + }; + connectors: { + discord: boolean; + telegram: boolean; + twitter: boolean; + }; + tracker: { + messages_sent: number; + total_interactions: number; + current_episode_number: number; + current_post_number: number; + current_season_number: number; + post_every_x_minutes: number; + }; + seasons: any[]; + profile_image: ProfileImage; + profile_image_options: ProfileImageOption[]; + master_file_path?: string; + }; + isExample?: boolean; +} + +export function createBlankAgent(): Agent { + return { + id: '', + name: '', + avatar: '', + agent: { + concept: '', + agent_details: { + backstory: '', + communication_style: [], + emojis: [], + hashtags: [], + name: '', + personality: [], + topic_expertise: [], + universe: '' + }, + ai_model: { + memory_store: '', + model_name: '', + model_type: '' + }, + connectors: { + discord: false, + telegram: false, + twitter: false + }, + tracker: { + messages_sent: 0, + total_interactions: 0, + current_episode_number: 0, + current_post_number: 0, + current_season_number: 0, + post_every_x_minutes: 0 + }, + seasons: [], + profile_image: { + details: { + url: '', + image_id: '', + generationId: '' + } + }, + profile_image_options: [] as ProfileImageOption[] + } + }; +} + +export interface RandomAgentCardProps { + agent: Agent; + onSelect: (agent: Agent | null) => void; + onAddAgent: (agent: Agent) => void; + isUserAgent: boolean; + setRandomAgents: React.Dispatch<React.SetStateAction<Agent[]>>; + generateRandomAgentData: () => Promise<Agent>; + isLoadedAgent: boolean; + onRegenerate: (agentId: string) => Promise<void>; + isLoading?: boolean; +} \ No newline at end of file diff --git a/client/src/interfaces/ChatInterfaces.ts b/client/src/interfaces/ChatInterfaces.ts new file mode 100644 index 0000000..63304e8 --- /dev/null +++ b/client/src/interfaces/ChatInterfaces.ts @@ -0,0 +1,11 @@ +export interface Message { + role: string; + message?: string; + response?: string; + message_id: number; +} + +export interface ChatHistory { + agent_name: string; + chat_history: Message[]; +} \ No newline at end of file diff --git a/client/src/interfaces/LeonardoInterfaces.ts b/client/src/interfaces/LeonardoInterfaces.ts new file mode 100644 index 0000000..28ecb77 --- /dev/null +++ b/client/src/interfaces/LeonardoInterfaces.ts @@ -0,0 +1,8 @@ +// Define the payload type for better type-checking +export interface LambdaPayload { + prompt: string; + modelId: string; + styleUUID: string; + num_images: number; + } + diff --git a/client/src/interfaces/PostsInterface.ts b/client/src/interfaces/PostsInterface.ts new file mode 100644 index 0000000..7e1b57b --- /dev/null +++ b/client/src/interfaces/PostsInterface.ts @@ -0,0 +1,21 @@ +export interface Post { + post_id: string; + post_number: number; + post_content: string; + post_highlights?: string; + post_posted: boolean; + seasonNumber?: number; + episodeNumber?: number; + episodeName?: string; + } + +export interface Episode { + episode_number: number; + episode_name: string; + posts: Post[]; +} + +export interface Season { + season_number: number; + episodes: Episode[]; +} \ No newline at end of file diff --git a/client/src/interfaces/SeasonInterfaces.ts b/client/src/interfaces/SeasonInterfaces.ts new file mode 100644 index 0000000..00a5b5c --- /dev/null +++ b/client/src/interfaces/SeasonInterfaces.ts @@ -0,0 +1,29 @@ +export interface Post { + post_id: string; + post_number: number; + post_content: string; + post_highlights: string; + post_posted: boolean; +} + +export interface Episode { + episode_name: string; + episode_number: number; + episode_description: string; + episode_highlights: string; + episode_summary: string; + episode_posted: boolean; + current_post_number: number; + posts: Post[]; +} + +export interface Season { + season_name: string; + season_number: number; + season_description: string; + season_highlights: string; + season_summary: string; + season_posted: false; + current_episode_number: number; + episodes: Episode[]; +} \ No newline at end of file diff --git a/client/src/interfaces/SocialFeedInterfaces.ts b/client/src/interfaces/SocialFeedInterfaces.ts new file mode 100644 index 0000000..e69de29 diff --git a/client/src/interfaces/TraitButtonsProps.ts b/client/src/interfaces/TraitButtonsProps.ts new file mode 100644 index 0000000..71afab9 --- /dev/null +++ b/client/src/interfaces/TraitButtonsProps.ts @@ -0,0 +1,7 @@ +import { AgentDetails } from './AgentInterfaces'; + +export interface TraitButtonsProps { + field: keyof AgentDetails; + options: string[]; + onTraitButtonClick: (field: keyof AgentDetails, value: string) => void; +} \ No newline at end of file diff --git a/client/src/lib/utils.ts b/client/src/lib/utils.ts new file mode 100644 index 0000000..cec6ac9 --- /dev/null +++ b/client/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/client/src/main.tsx b/client/src/main.tsx new file mode 100644 index 0000000..85624e3 --- /dev/null +++ b/client/src/main.tsx @@ -0,0 +1,20 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' +import { BrowserRouter as Router } from 'react-router-dom'; +import Providers from './components/providers.tsx'; +import { AgentProvider } from './context/AgentContext.tsx'; + + +createRoot(document.getElementById('root')!).render( + <StrictMode> + <Providers> + <AgentProvider> + <Router> + <App /> + </Router> + </AgentProvider> + </Providers> + </StrictMode>, +) diff --git a/client/src/pages/AgentCreator.tsx b/client/src/pages/AgentCreator.tsx new file mode 100644 index 0000000..a26e8a6 --- /dev/null +++ b/client/src/pages/AgentCreator.tsx @@ -0,0 +1,999 @@ +import React, { useState, ChangeEvent, useEffect, KeyboardEvent } from "react"; +import { Brain, Wand2, MessageSquare, Save, RefreshCcw, Layers } from "lucide-react"; +import { createAgent, getCharacters } from "../api/agentsAPI"; +import { + GeneratedImage, + ProfileImageOption, +} from "../interfaces/AgentInterfaces"; +import TraitButtons from "../components/TraitButtons"; // We'll still use your TraitButtons +import useCharacters from "../hooks/useCharacters"; +import { inconsistentImageLambda } from "../api/leonardoApi"; +import LoadingBar from "../components/LoadingBar"; +import Sidebar from "../components/sidebar"; +import { motion } from "framer-motion"; + +const LEONARDO_MODEL_ID = "e71a1c2f-4f80-4800-934f-2c68979d8cc8"; +const LEONARDO_STYLE_UUID = "b2a54a51-230b-4d4f-ad4e-8409bf58645f"; + + +/** + * AgentCreator Component + * A form-based interface for creating and editing AI agents with various attributes + * including personality traits, communication style, and profile images. + */ +const AgentCreator: React.FC = () => { + + /** + * Main UI state management + * activeTab controls which section of the form is visible: + * - basic: name, universe, expertise + * - personality: personality traits, backstory + * - style: communication style, hashtags, emojis + */ + const [activeTab, setActiveTab] = useState<"basic" | "personality" | "style">( + "basic" + ); + + /** + * Core agent state + * Maintains the complete agent object including: + * - agent_details: main characteristics and traits + * - profile_image: currently selected image + * - profile_image_options: available image choices + * - selectedImage: index of chosen image + * - seasons: associated seasons/episodes + */ + const [agent, setAgent] = useState<{ + agent_details: { + name: string; + personality: string[]; + communication_style: string[]; + backstory: string; + universe: string; + topic_expertise: string[]; + hashtags: string[]; + emojis: string[]; + concept: string; + }; + profile_image: { + details: { + url: string; + image_id: string; + generationId: string; + }; + }; + profile_image_options: ProfileImageOption[]; + selectedImage: number | undefined; + seasons: any[]; + }>({ + agent_details: { + name: "", + personality: [], + communication_style: [], + backstory: "", + universe: "", + topic_expertise: [], + hashtags: [], + emojis: [], + concept: "", + }, + profile_image: { + details: { + url: "", + image_id: "", + generationId: "", + }, + }, + profile_image_options: [], + selectedImage: undefined, + seasons: [], + }); + + // The fetched characters + const { characters, loading, error } = useCharacters(); + + /** + * Draft field management + * Maintains temporary states for text fields before they're committed to the main agent state + * Prevents immediate updates and allows for Enter-to-commit functionality + */ + const [draftFields, setDraftFields] = useState({ + name: "", + universe: "", + backstory: "", + imageDescription: "", + }); + + /** + * Synchronization Effects + * Keep draft states in sync with the main agent state + * Ensures drafts are updated when agent data changes + */ + useEffect(() => { + setDraftFields({ + name: agent.agent_details.name || "", + universe: agent.agent_details.universe || "", + backstory: agent.agent_details.backstory || "", + imageDescription: + agent.profile_image_options?.[0]?.generations_by_pk?.prompt || "", + }); + }, [agent]); + + /** + * Draft traits management + * Handles temporary states for array-based fields (traits, hashtags, etc.) + * Stores them as comma-separated strings until committed + */ + const [draftTraits, setDraftTraits] = useState<{ + topic_expertise: string; + personality: string; + communication_style: string; + hashtags: string; + emojis: string; + }>({ + topic_expertise: "", + personality: "", + communication_style: "", + hashtags: "", + emojis: "", + }); + + /** + * Synchronization Effects + * Keep draft states in sync with the main agent state + * Ensures drafts are updated when agent data changes + */ + useEffect(() => { + setDraftTraits({ + topic_expertise: agent.agent_details.topic_expertise.join(", "), + personality: agent.agent_details.personality.join(", "), + communication_style: agent.agent_details.communication_style.join(", "), + hashtags: agent.agent_details.hashtags.join(", "), + emojis: agent.agent_details.emojis.join(" "), + }); + }, [agent]); + + /** + * Profile Image Management + * Handles initialization and updates of the agent's profile image + * Sets default placeholder if no images are available + */ + useEffect(() => { + if (agent.profile_image_options.length > 0) { + const firstImage = + agent.profile_image_options[0]?.generations_by_pk + ?.generated_images?.[0] ?? + ({ + url: "https://via.placeholder.com/400x400?text=Brain+Placeholder", + id: "", + generationId: "", + } as GeneratedImage); + + setAgent((prev) => ({ + ...prev, + selectedImage: + prev.selectedImage !== undefined ? prev.selectedImage : 0, + profile_image: { + details: { + url: firstImage.url, + image_id: firstImage.id, + generationId: firstImage.generationId, + }, + }, + })); + } else { + setAgent((prev) => ({ + ...prev, + profile_image: { + details: { + url: "https://via.placeholder.com/400x400?text=Brain+Placeholder", + image_id: "", + generationId: "", + }, + }, + })); + } + }, [agent.profile_image_options]); + + /** + * Field Update Handlers + * Manages updates to regular text fields (name, universe, backstory) + * Commits changes when Enter is pressed + */ + const handleDraftChange = + (field: keyof typeof draftFields) => + (e: ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => { + setDraftFields((prev) => ({ + ...prev, + [field]: e.target.value, + })); + }; + + const handleDraftKeyDown = + (field: keyof typeof draftFields) => + (e: KeyboardEvent<HTMLTextAreaElement | HTMLInputElement>) => { + if (e.key === "Enter") { + e.preventDefault(); + + if (field === "imageDescription") { + setAgent((prev) => { + const newImageOption: ProfileImageOption = { + generations_by_pk: { + prompt: draftFields[field], + generated_images: [], + }, + }; + + return { + ...prev, + profile_image_options: prev.profile_image_options?.length + ? prev.profile_image_options.map((option, index) => + index === 0 + ? { + ...option, + generations_by_pk: { + ...option.generations_by_pk, + prompt: draftFields[field], + }, + } + : option + ) + : [newImageOption], + }; + }); + } else { + setAgent((prev) => ({ + ...prev, + agent_details: { + ...prev.agent_details, + [field]: draftFields[field], + }, + })); + } + } + }; + + /** + * Trait Field Handlers + * Manages updates to array-based fields (personality, hashtags, etc.) + * Splits input by commas (or spaces for emojis) and commits on Enter + */ + const handleTraitDraftChange = + (field: keyof typeof draftTraits) => + (e: ChangeEvent<HTMLTextAreaElement>) => { + setDraftTraits((prev) => ({ + ...prev, + [field]: e.target.value, + })); + }; + + const handleTraitDraftKeyDown = + (field: keyof typeof draftTraits) => + (e: KeyboardEvent<HTMLTextAreaElement>) => { + if (e.key === "Enter") { + e.preventDefault(); + // If field is "emojis", we split by space; otherwise, by comma + const separator = field === "emojis" ? " " : ","; + const arrayValue = draftTraits[field] + .split(separator) + .map((item) => item.trim()) + .filter(Boolean); + + setAgent((prev) => ({ + ...prev, + agent_details: { + ...prev.agent_details, + [field]: arrayValue, + }, + })); + } + }; + + // Deleting a single trait + type TraitField = + | "personality" + | "communication_style" + | "topic_expertise" + | "hashtags" + | "emojis"; + + const handleDeleteTrait = (field: TraitField, value: string) => { + setAgent((prev) => ({ + ...prev, + agent_details: { + ...prev.agent_details, + [field]: prev.agent_details[field].filter( + (trait: string) => trait !== value + ), + }, + })); + }; + + // State to manage the visibility of the success message + const [showSuccessMessage, setShowSuccessMessage] = useState(false); + + // Add state for loading progress near other state declarations + const [loadingProgress, setLoadingProgress] = useState(0); + + // Add a new state for tracking image generation + const [isGenerating, setIsGenerating] = useState(false); + + const [selectedCharacterIndex, setSelectedCharacterIndex] = + useState<number>(-1); + + /** + * Form Submission Handler + * Processes the final agent data and sends it to the server + * Shows success message on completion + */ + const handleSubmitCreateAgent = async ( + event: + | React.FormEvent<HTMLFormElement> + | React.MouseEvent<HTMLButtonElement> + ) => { + event.preventDefault(); + + type AgentState = typeof agent; + + const updatedAgent: AgentState = { + ...agent, + agent_details: { + ...agent.agent_details, + name: draftFields.name || agent.agent_details.name, + universe: draftFields.universe || agent.agent_details.universe, + backstory: draftFields.backstory || agent.agent_details.backstory, + concept: agent.agent_details.concept, + + personality: draftTraits.personality + ? draftTraits.personality + .split(",") + .map((item) => item.trim()) + .filter(Boolean) + : agent.agent_details.personality, + + communication_style: draftTraits.communication_style + ? draftTraits.communication_style + .split(",") + .map((item) => item.trim()) + .filter(Boolean) + : agent.agent_details.communication_style, + + topic_expertise: draftTraits.topic_expertise + ? draftTraits.topic_expertise + .split(",") + .map((item) => item.trim()) + .filter(Boolean) + : agent.agent_details.topic_expertise, + + hashtags: draftTraits.hashtags + ? draftTraits.hashtags + .split(",") + .map((item) => item.trim()) + .filter(Boolean) + : agent.agent_details.hashtags, + + emojis: draftTraits.emojis + ? draftTraits.emojis.split(" ").filter(Boolean) + : agent.agent_details.emojis, + }, + profile_image: agent.profile_image, + profile_image_options: agent.profile_image_options.map((option, index) => + index === 0 + ? { + ...option, + generations_by_pk: { + ...option.generations_by_pk, + prompt: + draftFields.imageDescription || + option.generations_by_pk?.prompt, + }, + } + : option + ), + selectedImage: agent.selectedImage, + seasons: agent.seasons, + }; + + try { + + await createAgent(updatedAgent); + + setShowSuccessMessage(true); + setTimeout(() => setShowSuccessMessage(false), 3000); + setAgent(updatedAgent); + } catch (error) { + console.error("Error creating agent:", error); + } + }; + + // + // ────────────────────────────────────────────────────────────────────────────── + // 8) Load characters + // ────────────────────────────────────────────────────────────────────────────── + // + useEffect(() => { + const loadCharacters = async () => { + try { + const charactersData = await getCharacters(); + if (!Array.isArray(charactersData)) { + console.error( + "Expected array of characters, received:", + typeof charactersData + ); + return; + } + + const processed = charactersData.map((char) => { + const agentProfileImageOptions = char.agent.profile_image_options; + const agentConcept = char.concept; + const { agent } = char; + if (!agent) return { agent: {} }; + + const { + agent_details: { + name = "", + personality = [], + communication_style = [], + backstory = "", + universe = "", + topic_expertise = [], + hashtags = [], + emojis = [], + } = {}, + ai_model = {}, + connectors = {}, + seasons = [], + tracker = {}, + } = agent; + + return { + agent: { + agent_details: { + name, + personality, + communication_style, + backstory, + universe, + topic_expertise, + hashtags, + emojis, + }, + ai_model, + connectors, + profile_image: agentProfileImageOptions || [], + seasons, + tracker, + }, + concept: agentConcept || "", + }; + }); + console.log("Processed characters:", processed); + } catch (error) { + console.error("Error loading characters:", error); + } + }; + + loadCharacters(); + }, []); + + /** + * Character Selection Handler + * Populates the form with data from an existing character + * Updates both main agent state and draft states + */ + const handleCharacterSelect = (e: ChangeEvent<HTMLSelectElement>) => { + const selectedIndex = parseInt(e.target.value); + setSelectedCharacterIndex(selectedIndex); + const char = characters[selectedIndex]; + if (!char?.agent?.agent_details) return; + + const details = char.agent.agent_details; + + setAgent({ + agent_details: { + name: details.name || "", + personality: details.personality || [], + communication_style: details.communication_style || [], + backstory: details.backstory || "", + universe: details.universe || "", + topic_expertise: details.topic_expertise || [], + hashtags: details.hashtags || [], + emojis: details.emojis || [], + concept: details.concept || "", + }, + profile_image: char.agent?.profile_image_options || [], + profile_image_options: char.agent?.profile_image_options || [], + selectedImage: char.agent?.profile_image_options?.[0]?.generations_by_pk + ?.generated_images?.length + ? 0 + : undefined, + seasons: char.agent?.seasons || [], + }); + + // Sync local drafts + setDraftFields({ + name: details.name || "", + universe: details.universe || "", + backstory: details.backstory || "", + imageDescription: + char.agent?.profile_image_options?.[0]?.generations_by_pk?.prompt || "", + }); + + setDraftTraits({ + topic_expertise: (details.topic_expertise || []).join(", "), + personality: (details.personality || []).join(", "), + communication_style: (details.communication_style || []).join(", "), + hashtags: (details.hashtags || []).join(", "), + emojis: (details.emojis || []).join(" "), + }); + }; + + // + // ────────────────────────────────────────────────────────────────────────────── + // 10) Render + // ────────────────────────────────────────────────────────────────────────────── + // + return ( + <div className="flex h-screen"> + <Sidebar /> + + <div className="w-full overflow-y-scroll flex flex-col min-h-screen bg-gray-50"> + {/* Success Message */} + + {showSuccessMessage && ( + <div className="fixed inset-0 flex items-center justify-center z-50"> + <div className="bg-gradient-to-r from-orange-600 to-red-600 text-white px-6 py-3 rounded-md shadow-lg"> + Agent successfully saved! + </div> + </div> + )} + + {/* div */} + <div className="p-5 my-4 mx-12 rounded-xl shadow-xl flex items-center justify-between"> + <div className="text-3xl font-semibold text-gray-600 font-orbitron"> + Create Agent + </div> + <div className="flex items-center space-x-3 justify-end"> + </div> + </div> + <div className="flex-grow flex p-5 m-5"> + + + {/* Left Panel */} + <div className="w-1/2 p-6 rounded-2xl h-fit shadow-xl bg-white"> + <div className="flex gap-4 mb-6 bg-gray-50/80 p-2 rounded-lg"> + {[ + { id: "basic" as const, icon: Brain, label: "Basic Info" }, + { id: "personality" as const, icon: Wand2, label: "Personality" }, + { id: "style" as const, icon: MessageSquare, label: "Style" }, + ].map(({ id, icon: Icon, label }) => ( + <button + key={id} + onClick={() => { + setActiveTab(id); + }} + className={`flex-1 flex items-center justify-center px-4 py-2 + rounded-md text-gray-700 ${activeTab === id + ? "bg-gradient-to-r from-[#F7F957] to-[#F9D02C]" + : "bg-gray-200" + }`} + > + <Icon className="w-4 h-4 mr-2" /> + {label} + </button> + ))} + </div> + + {/* Form */} + <div className="space-y-6"> + {activeTab === "basic" && ( + <div className="space-y-6"> + {/* Agent Name => local draft */} + <div> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Agent Name + </label> + <textarea + value={draftFields.name} + onChange={handleDraftChange("name")} + onKeyDown={handleDraftKeyDown("name")} + placeholder="Enter agent name (Press Enter to commit)" + rows={2} + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-800 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + + {/* Universe => local draft */} + <div> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Universe + </label> + <textarea + value={draftFields.universe} + onChange={handleDraftChange("universe")} + onKeyDown={handleDraftKeyDown("universe")} + placeholder="Enter universe (Press Enter to commit)" + rows={2} + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-800 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + + {/* Topic Expertise => local draft => commit on Enter */} + <div> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Topic Expertise + </label> + <TraitButtons + field="topic_expertise" + options={agent.agent_details.topic_expertise} + onTraitButtonClick={handleDeleteTrait} + /> + <textarea + value={draftTraits.topic_expertise} + onChange={handleTraitDraftChange("topic_expertise")} + onKeyDown={handleTraitDraftKeyDown("topic_expertise")} + placeholder="Comma-separated (e.g. 'AI, Robotics, Music') (Press Enter to commit)" + rows={2} + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-800 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + </div> + )} + + {activeTab === "personality" && ( + <div className="space-y-6"> + {/* Personality => local draft => commit on Enter */} + <div> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Personality + </label> + <TraitButtons + field="personality" + options={agent.agent_details.personality} + onTraitButtonClick={handleDeleteTrait} + /> + <textarea + value={draftTraits.personality} + onChange={handleTraitDraftChange("personality")} + onKeyDown={handleTraitDraftKeyDown("personality")} + placeholder="Comma-separated personality traits (Press Enter to commit)" + rows={2} + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-700 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + + {/* Backstory => local draft */} + <div> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Backstory + </label> + <textarea + value={draftFields.backstory} + onChange={handleDraftChange("backstory")} + onKeyDown={handleDraftKeyDown("backstory")} + placeholder="Enter agent backstory (Press Enter to commit)" + rows={3} + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-700 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + </div> + )} + + {activeTab === "style" && ( + <div className="space-y-6"> + {/* Communication Style => local draft => commit on Enter */} + <div> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Communication Style + </label> + <TraitButtons + field="communication_style" + options={agent.agent_details.communication_style} + onTraitButtonClick={handleDeleteTrait} + /> + <textarea + value={draftTraits.communication_style} + onChange={handleTraitDraftChange("communication_style")} + onKeyDown={handleTraitDraftKeyDown("communication_style")} + placeholder="Comma-separated (Press Enter to commit)" + rows={2} + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-700 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + + {/* Hashtags => local draft => commit on Enter */} + <div> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Hashtags + </label> + <TraitButtons + field="hashtags" + options={agent.agent_details.hashtags} + onTraitButtonClick={handleDeleteTrait} + /> + <textarea + value={draftTraits.hashtags} + onChange={handleTraitDraftChange("hashtags")} + onKeyDown={handleTraitDraftKeyDown("hashtags")} + placeholder="Comma-separated #tags (Press Enter to commit)" + rows={2} + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-700 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + + {/* Emojis => local draft => commit on Enter => splitted by space */} + <div> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Emojis + </label> + <TraitButtons + field="emojis" + options={agent.agent_details.emojis} + onTraitButtonClick={handleDeleteTrait} + /> + <textarea + value={draftTraits.emojis} + onChange={handleTraitDraftChange("emojis")} + onKeyDown={handleTraitDraftKeyDown("emojis")} + placeholder="Split by space (e.g. '✨ 🚀') (Press Enter to commit)" + rows={2} + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-700 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + </div> + )} + </div> + + <button + type="button" + onClick={(e) => + handleSubmitCreateAgent( + e as unknown as React.FormEvent<HTMLFormElement> + ) + } + className="mt-6 w-full px-4 py-2 rounded-md bg-gradient-to-r from-[#F7F957] to-[#F9D02C] hover:scale-95 font-semibold + text-gray-700 transition-all duration-300 flex items-center justify-center" + > + <Save className="w-4 h-4 mr-2" /> + Save Agent + </button> + + {/* Character Selection */} + <div className="mt-6 p-4 bg-gray-50/80 rounded-lg border border-orange-500/30"> + <label className="text-sm text-gray-700 font-medium block mb-2"> + Select Existing Character + </label> + {loading ? ( + <div className="text-gray-100">Loading characters...</div> + ) : error ? ( + <div className="text-red-400"> + No Existing Agents - {error.message} + </div> + ) : ( + <> + <select + className="w-full px-3 py-2 rounded-md bg-gray-50/80 border + border-orange-500/30 text-gray-700 focus:ring-2 + focus:ring-orange-500/50 focus:outline-none" + onChange={handleCharacterSelect} + value={selectedCharacterIndex} + > + <option value={-1}>-- Select a Character --</option> + {characters.map((char, index) => ( + <option key={index} value={index}> + {char.agent?.agent_details?.name || "Unnamed Character"} + </option> + ))} + </select> + </> + )} + </div> + </div> + + {/* Right Panel */} + <div className="w-1/2 p-6 border-r border-orange-500/20"> + <div className="h-full flex flex-col space-y-6"> + {/* Main Character Image */} + <div + className="relative -mt-7 aspect-square rounded-lg flex items-center border-2 bg-yellow-400/50 justify-center" + style={{ + backgroundImage: + agent.selectedImage !== undefined && + agent.profile_image?.details?.url && + loadingProgress === 0 + ? `url(${agent.profile_image.details.url})` + : "none", + backgroundSize: "cover", + backgroundPosition: "center", + }} + > + {loadingProgress > 0 && ( + <div className="absolute inset-0 flex items-center justify-center bg-slate-900/80"> + <div className="w-3/4"> + <LoadingBar progress={loadingProgress} /> + </div> + </div> + )} + {agent.selectedImage === undefined && loadingProgress === 0 && ( + <Layers className="w-32 h-32 text-amber-500" /> + )} + <button + className={`absolute bottom-4 right-4 px-4 py-2 rounded-md bg-gradient-to-r from-[#F7F957] to-[#F9D02C] text-gray-700 flex items-center + ${isGenerating + ? "opacity-50 cursor-not-allowed" + : "hover:scale-95" + }`} + onClick={async () => { + if (isGenerating) return; // Prevent multiple clicks while generating + + try { + setIsGenerating(true); + let prompt = + agent.profile_image_options?.[0]?.generations_by_pk + ?.prompt || + draftFields.imageDescription || + ""; + + setLoadingProgress(10); + + const payload = { + prompt: prompt, + modelId: LEONARDO_MODEL_ID, + styleUUID: LEONARDO_STYLE_UUID, + num_images: 4 + }; + const imageResponse = await inconsistentImageLambda( + payload + ); + + if ( + !imageResponse?.generations_by_pk?.generated_images?.[0] + ?.url + ) { + throw new Error("No image URL received"); + } + + setLoadingProgress(50); + const imageUrl = + imageResponse.generations_by_pk.generated_images[0].url; + + setLoadingProgress(90); + setAgent((prev) => ({ + ...prev, + profile_image: { + details: { + url: imageUrl, + image_id: + imageResponse.generations_by_pk.generated_images[0] + .id, + generationId: imageResponse.generations_by_pk.id, + }, + }, + profile_image_options: [ + { + generations_by_pk: { + ...imageResponse.generations_by_pk, + prompt, + }, + }, + ], + })); + + setLoadingProgress(100); + setTimeout(() => setLoadingProgress(0), 500); + } catch (error) { + console.error("Error generating new image:", error); + setLoadingProgress(0); + } finally { + setIsGenerating(false); + } + }} + disabled={isGenerating} + > + <RefreshCcw + className={`w-4 h-4 mr-2 ${isGenerating ? "animate-spin" : ""}`} + /> + {isGenerating ? "Generating..." : "Regenerate All"} + </button> + </div> + + {/* Image Selection Grid */} + <div className="grid grid-cols-4 gap-4"> + {agent.profile_image_options?.[0]?.generations_by_pk?.generated_images?.map( + (image: GeneratedImage, index: number) => ( + <div + key={index} + className={`relative aspect-square rounded-lg cursor-pointer + ${agent.selectedImage === index + ? "ring-2 ring-orange-500" + : "" + }`} + onClick={async () => { + + try { + setLoadingProgress(30); + + setLoadingProgress(70); + + setAgent((prev) => ({ + ...prev, + selectedImage: index, + profile_image: { + details: { + url: image?.url || "", + image_id: image?.id || "", + generationId: image?.generationId || "", + }, + }, + })); + + setLoadingProgress(100); + setTimeout(() => setLoadingProgress(0), 500); + } catch (error) { + console.error("Error loading image:", error); + setLoadingProgress(0); + } + }} + style={{ + backgroundImage: image?.url ? `url(${image.url})` : "none", + backgroundSize: "cover", + backgroundPosition: "center", + }} + > + {agent.selectedImage === index && ( + <div className="absolute inset-0 flex items-center justify-center bg-gray-800 bg-opacity-50"> + <svg + className="w-8 h-8 text-white" + fill="none" + stroke="currentColor" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" + > + <path + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth="2" + d="M5 13l4 4L19 7" + /> + </svg> + </div> + )} + </div> + ) + )} + </div> + + {/* Character Info Card */} + <div className="p-4 rounded-lg bg-gray-50/80 border border-orange-500/30"> + <div className="mb-4"> + <div className="text-lg font-medium text-gray-700"> + Image Generation Description + </div> + <textarea + value={draftFields.imageDescription || ""} + onChange={handleDraftChange("imageDescription")} + onKeyDown={handleDraftKeyDown("imageDescription")} + placeholder="Enter image generation description (Press Enter to commit)" + rows={3} + className="w-full px-3 py-2 mt-3 rounded-md bg-gray-50/80 border border-orange-500/30 text-gray-700 focus:outline-none focus:ring-2 focus:ring-orange-500/50" + /> + </div> + </div> + <div className="p-4 rounded-lg bg-gray-50/80 border border-orange-500/30"> + <div className="mb-4"> + <div className="text-lg font-medium text-gray-700"> + Agent Name + </div> + <div className="text-gray-700 mt-4">{agent.agent_details.name}</div> + </div> + </div> + </div> + </div> + + </div> + </div> + </div> + ); +}; + +export default AgentCreator; diff --git a/client/src/pages/AgentGallery.tsx b/client/src/pages/AgentGallery.tsx new file mode 100644 index 0000000..9fdd661 --- /dev/null +++ b/client/src/pages/AgentGallery.tsx @@ -0,0 +1,538 @@ +import React, { useState, useEffect, useRef } from "react"; +import { Agent, GenerationsByPk } from "../interfaces/AgentInterfaces"; +import useCharacters from "../hooks/useCharacters"; +import RandomAgentCard from "../components/RandomAgentCard"; // Import the new component +import LoadedAgentCard from "../components/LoadedAgentCard"; // Import the new component +import { inconsistentImageLambda } from "../api/leonardoApi"; +import { createBlankAgent } from "../utils/agentUtils"; +import { createAgent } from "../api/agentsAPI"; +import { generateRandomAgent } from "../utils/generateRandomAgent"; +import imageTraits from "../assets/generate-random-agents/imageTraits.json"; +import characterConcepts from "../assets/generate-random-agents/characterConcepts.json"; +import famousFigures from "../assets/generate-random-agents/famousFigures.json"; +import LunaQuantumchef from "../assets/example-agents/Luna_Quantumchef_master.json"; +import CosmicCurator from "../assets/example-agents/Cosmic_Curator_master.json"; +import GavelGlitch from "../assets/example-agents/Gavel_Glitch_master.json"; +import Sidebar from "../components/sidebar"; +import { Search, Filter as FilterIcon } from "lucide-react"; +import { motion } from "framer-motion"; +import { useMemo } from "react"; +import { useNavigate } from "react-router-dom"; +import { useAgent } from '../context/AgentContext'; + +const LEONARDO_MODEL_ID = "e71a1c2f-4f80-4800-934f-2c68979d8cc8"; +const LEONARDO_STYLE_UUID = "b2a54a51-230b-4d4f-ad4e-8409bf58645f"; + +// Helper function to get random trait +const getRandomTrait = (traitArray: string[]): string => { + return traitArray[Math.floor(Math.random() * traitArray.length)]; +}; + +// Add a utility function to handle image loading +const loadImageWithFallback = async (url: string): Promise<string> => { + try { + const response = await fetch(url, { + mode: "cors", + credentials: "omit", // Don't send cookies + headers: { + Accept: "image/*", + }, + }); + + if (!response.ok) { + throw new Error("Image failed to load"); + } + + return url; + } catch (error) { + console.error("[AgentGallery] Error loading image:", error); + return "Error loading image. Regenerate again"; + } +}; + +// Add this helper function near the top with other utility functions +const generateCharacterConcept = (): string => { + const profession = getRandomTrait(characterConcepts.professions); + const personality = getRandomTrait(characterConcepts.personalities); + const origin = getRandomTrait(characterConcepts.origins); + const power = getRandomTrait(characterConcepts.specialPowers); + const goal = getRandomTrait(characterConcepts.goals); + + // Randomly choose between different concept formats + const conceptFormats = [ + `A ${personality} ${profession} who ${power} and is ${origin}`, + `${profession} ${origin}, who ${power} while ${goal}`, + `A ${personality} individual ${origin} working as a ${profession}, with the ability to ${power}`, + `An extraordinary ${profession} ${origin} on a mission of ${goal}`, + `A remarkable ${personality} being who ${power}, working as a ${profession} while ${goal}`, + `Create a name and try to incorporate the ${profession} into the name. For example, + if the profession was a Dr. then the name could be Dr.{Name} `, + ]; + const conceptFormat2 = [ + `Create a parody meme of ${getRandomFamousPerson()}. The meme should be a funny and clever meme that captures the essence of the person and their achievements. Make it witty and memorable while staying respectful. Include their most iconic features, expressions, or famous quotes if applicable. + Make sure to use their name as part of their agent name. It is best to make a variation of their name. For example, if the person is Elon Musk, then the agent name could be Elon Musk Jr., Elon Gate, Trump Bot, Trump Tron, etc. Make something unique and memorable that could go viral within the first 24 hours of being posted.`, + ]; + + // 80% chance of conceptFormat1, 20% chance of conceptFormat2 + return Math.random() < 0.35 + ? getRandomTrait(conceptFormats) + : getRandomTrait(conceptFormat2); +}; + +// Add this helper function near other utility functions +const getRandomFamousPerson = (): string => { + const categories = Object.keys(famousFigures); + const randomCategory = + categories[Math.floor(Math.random() * categories.length)]; + const figures = famousFigures[randomCategory as keyof typeof famousFigures]; + return figures[Math.floor(Math.random() * figures.length)]; +}; + +// Add this function to convert master JSON to Agent type +const convertMasterJsonToAgent = (masterJson: any): Agent => { + return { + id: Math.floor(Math.random() * 1000000).toString(), + name: masterJson.agent.agent_details.name || "", + avatar: masterJson.agent.profile_image?.details?.url || "", + shortDescription: masterJson.agent.agent_details.backstory || "", + tags: masterJson.agent.agent_details.hashtags || [], + personality: masterJson.agent.agent_details.personality || [], + communicationStyle: + masterJson.agent.agent_details.communication_style || [], + emojis: masterJson.agent.agent_details.emojis || [], + universe: masterJson.agent.agent_details.universe || "", + backstory: masterJson.agent.agent_details.backstory || "", + topic_expertise: masterJson.agent.agent_details.topic_expertise || [], + isExample: true, // Add this flag to identify example agents + }; +}; + +const AgentGallery: React.FC = () => { + // Add selected agent state + // const [selectedAgent, setSelectedAgent] = useState<Agent | null>(null); + const { characters: loadedAgents } = useCharacters(); + const [randomAgents, setRandomAgents] = useState<Agent[]>([]); + const [filter, setFilter] = useState("all"); + const [searchQuery, setSearchQuery] = useState(""); + const [showFilters, setShowFilters] = useState(false); + const initialMount = useRef(true); + const navigate = useNavigate() + + // Inside AgentGallery component: + const { setSelectedAgent } = useAgent(); + + // Define generateRandomAgentData inside AgentGallery so it's accessible to child components + const generateRandomAgentData = async (): Promise<Agent> => { + try { + const concept = generateCharacterConcept(); + + const newRandomAgentData = await generateRandomAgent(concept); + const agentObject = newRandomAgentData.agent; + const agentDetails = agentObject.agent_details; + + return { + id: Math.floor(Math.random() * 1000000).toString(), + name: agentDetails.name.replace("_", " ") || "", + avatar: "", + shortDescription: "...", + tags: agentDetails.hashtags || [], + personality: agentDetails.personality || [], + communicationStyle: agentDetails.communication_style || [], + emojis: agentDetails.emojis || [], + universe: agentDetails.universe || "", + backstory: agentDetails.backstory || "", + concept: concept, + topic_expertise: agentDetails.topic_expertise || [], + }; + } catch (error) { + console.error("[generateRandomAgentData] Error:", error); + throw error; + } + }; + + const filterAgentsByName = ( + agents: any[], + isLoadedAgent: boolean = false + ): any[] => { + if (!searchQuery) return agents; + + const lowerQuery = searchQuery.toLowerCase().trim(); + + return agents.filter((agent) => { + if (isLoadedAgent) { + // Handle loaded agents structure where properties are in agent.agent.agent_details + const details = agent?.agent?.agent_details; + if (!details) return false; + + return ( + details.name?.toLowerCase().includes(lowerQuery) || + details.backstory?.toLowerCase().includes(lowerQuery) || + details.universe?.toLowerCase().includes(lowerQuery) || + details.hashtags?.some((tag: string) => + tag.toLowerCase().includes(lowerQuery) + ) || + details.personality?.some((trait: string) => + trait.toLowerCase().includes(lowerQuery) + ) || + details.topic_expertise?.some((topic: string) => + topic.toLowerCase().includes(lowerQuery) + ) || + details.communication_style?.some((style: string) => + style.toLowerCase().includes(lowerQuery) + ) + ); + } else { + // Handle random agents structure (keeping existing logic) + return ( + agent.name?.toLowerCase().includes(lowerQuery) || + agent.shortDescription?.toLowerCase().includes(lowerQuery) || + agent.backstory?.toLowerCase().includes(lowerQuery) || + agent.tags?.some((tag) => tag.toLowerCase().includes(lowerQuery)) || + agent.personality?.some((trait) => + trait.toLowerCase().includes(lowerQuery) + ) || + agent.topic_expertise?.some((topic) => + topic.toLowerCase().includes(lowerQuery) + ) + ); + } + }); + }; + + const filteredRandomAgents = filterAgentsByName(randomAgents); + const filteredLoadedAgents = filterAgentsByName(loadedAgents, true); + + useEffect(() => { + if (initialMount.current) { + initialMount.current = false; + const exampleAgents = [ + convertMasterJsonToAgent(LunaQuantumchef), + convertMasterJsonToAgent(CosmicCurator), + convertMasterJsonToAgent(GavelGlitch), + ]; + setRandomAgents(exampleAgents); + } + }, []); + + const handleAddAgent = async (agent: Agent, leonardoResponse: any) => { + try { + // Create a new blank agent with proper initialization + const newAgent = createBlankAgent(); + + if (!newAgent.agent) { + console.error( + "[handleAddAgent] - New agent object is not properly initialized" + ); + return; + } + + // Ensure agent.agent_details exists before accessing + if (!newAgent.agent.agent_details) { + console.error( + "[handleAddAgent] - Agent details are not properly initialized" + ); + return; + } + + // Log the concept being saved + + // populate our concept + newAgent.agent.concept = agent.concept || ""; + + // populate our agent details + const agentDetails = newAgent.agent.agent_details; + agentDetails.name = agent?.name || ""; + agentDetails.personality = agent?.personality || []; + agentDetails.communication_style = agent?.communicationStyle || []; + agentDetails.emojis = agent?.emojis || []; + agentDetails.hashtags = agent?.hashtags || []; + agentDetails.universe = agent?.universe || ""; + agentDetails.topic_expertise = agent?.topic_expertise || []; + agentDetails.backstory = agent?.backstory || ""; + + // Ensure profile_image_options array exists and has at least one element + if (!newAgent.agent.profile_image_options) { + newAgent.agent.profile_image_options = []; + } + if (newAgent.agent.profile_image_options.length === 0) { + newAgent.agent.profile_image_options.push({ + generations_by_pk: {} as GenerationsByPk, + }); + } + + // Ensure profile_image exists and has details + if (!newAgent.agent.profile_image) { + newAgent.agent.profile_image = { + details: { + url: "", + image_id: "", + generationId: "", + }, + }; + } + + // Populate the image data + if (leonardoResponse?.generations_by_pk) { + const generation_by_pk = leonardoResponse.generations_by_pk; + newAgent.agent.profile_image_options[0].generations_by_pk = + generation_by_pk; + + if (generation_by_pk.generated_images?.[0]) { + const imageDetails = newAgent.agent.profile_image.details; + imageDetails.url = generation_by_pk.generated_images[0].url; + imageDetails.image_id = generation_by_pk.generated_images[0].id; + imageDetails.generationId = generation_by_pk.id; + } + } + + // Call our api to save the new agent + const newAgentResponse = await createAgent(newAgent); + + return newAgentResponse; + } catch (error) { + console.error("[handleAddAgent] Error:", error); + throw error; + } + }; + + // Update the handleSingleAgentRegeneration function + const handleSingleAgentRegeneration = async ( + agentId: string + ): Promise<void> => { + try { + // Show loading state immediately with loading name + setRandomAgents((prevAgents) => + prevAgents.map((agent) => + agent.id === agentId + ? { + ...agent, + name: "Generating Agent...", // Add loading name + isLoading: true, + personality: [], + communicationStyle: [], + emojis: [], + hashtags: [], + } + : agent + ) + ); + + const currentAgent = randomAgents.find((agent) => agent.id === agentId); + if (!currentAgent) return; + + // Generate new agent data + const newAgentData = await generateRandomAgentData(); + + const newAgent = { + ...newAgentData, + id: currentAgent.id, + }; + + // Update UI to show we're now generating the image + setRandomAgents((prevAgents) => + prevAgents.map((agent) => + agent.id === agentId + ? { + ...newAgent, + isLoading: true, + } + : agent + ) + ); + + // Incorporate the concept into the prompt + const prompt = `Generate an anime character portrait of ${newAgent.name + } with ${getRandomTrait(imageTraits.hairStyles)} ${getRandomTrait( + imageTraits.hairColors + )} hair, ${getRandomTrait( + imageTraits.eyeColors + )} eyes, wearing ${getRandomTrait( + imageTraits.clothingStyles + )} style clothing. Their personality can be described as ${newAgent.personality?.join(", ") || "unknown" + }. Scene: ${getRandomTrait( + imageTraits.backgrounds + )}. Style: high quality, detailed anime art, character portrait. Concept: ${newAgent.concept + } `; + + const payload = { + prompt: prompt, + modelId: LEONARDO_MODEL_ID, + styleUUID: LEONARDO_STYLE_UUID, + num_images: 4, + }; + const imageResponse = await inconsistentImageLambda(payload); + + if (!imageResponse?.generations_by_pk?.generated_images?.[0]?.url) { + throw new Error("No image URL received"); + } + + const imageUrl = imageResponse.generations_by_pk.generated_images[0].url; + const loadedImageUrl = await loadImageWithFallback(imageUrl); + + // Update with all necessary data for saving + setRandomAgents((prevAgents) => + prevAgents.map((agent) => + agent.id === agentId + ? { + ...newAgent, + avatar: loadedImageUrl, + isLoading: false, + leonardoResponse: imageResponse, // Add the full Leonardo response + leonardoImage: + imageResponse.generations_by_pk.generated_images[0], // Add the image data + } + : agent + ) + ); + } catch (error) { + console.error("[AgentGallery] Error regenerating single agent:", error); + setRandomAgents((prevAgents) => + prevAgents.map((agent) => + agent.id === agentId + ? { + ...agent, + isLoading: false, + } + : agent + ) + ); + } + }; + + + + // Update handleSelectAgent: + const handleSelectAgent = async (agent: Agent) => { + setSelectedAgent(agent); + navigate('/chat'); + }; + // // Add handleSelectAgent function + // const handleSelectAgent = async (agent: Agent) => { + // console.log("[handleSelectAgent] Selecting agent:", agent); + // try { + // // Add a small delay to show the loading state + // navigate("/chat") + // } catch (error) { + // console.error("[handleSelectAgent] Error:", error); + // throw error; + // } + // }; + + useEffect(() => { + if (initialMount.current) { + initialMount.current = false; + // Load example agents instead of generating new ones + const exampleAgents = [ + convertMasterJsonToAgent(LunaQuantumchef), + convertMasterJsonToAgent(CosmicCurator), + convertMasterJsonToAgent(GavelGlitch), + ]; + setRandomAgents(exampleAgents); + } + }, []); + + return ( + <div className="flex"> + <Sidebar /> + <div className="h-screen w-full overflow-y-scroll bg-gray-50 p-10"> + <div className="p-5 mb-[4rem] rounded-xl shadow-xl flex items-center justify-between"> + <div className="text-3xl font-semibold text-gray-600 font-orbitron"> + Browse Agents + </div> + <div className="flex items-center space-x-3 justify-end"></div> + </div> + <div className="max-w-7xl mx-auto"> + {/* Search and Filter Header */} + <div className="mb-8 space-y-4"> + <div className="flex gap-4 items-center"> + <div className="relative flex-1"> + <Search + className="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400" + size={20} + /> + <input + type="text" + placeholder="Search agents by name, description, or tags..." + className="w-full pl-10 pr-4 py-3 placeholder:text-neutral-600 bg-neutral-200 shadow-inner text-neutral-600 rounded-lg outline-none focus:ring-2 focus:ring-yellow-400 focus:border-transparent" + value={searchQuery} + onChange={(e) => setSearchQuery(e.target.value)} + /> + </div> + <button + onClick={() => setShowFilters(!showFilters)} + className="flex items-center gap-2 px-4 py-3 bg-gradient-to-r from-yellow-400 to-yellow-500 hover:from-yellow-500 hover:to-yellow-600 text-gray-900 rounded-lg font-medium transition-all" + > + <FilterIcon size={20} /> + Filters + </button> + </div> + + {/* Filter Pills */} + <div className="flex flex-wrap gap-3"> + {["all", "random", "yourAgents"].map((filterOption) => ( + <button + key={filterOption} + className={`px-4 py-2 rounded-full font-medium transition-all ${filter === filterOption + ? "bg-gradient-to-r from-yellow-400 to-yellow-500 text-gray-900" + : "bg-neutral-200 text-neutral-600 hover:bg-neutral-400" + }`} + onClick={() => setFilter(filterOption)} + > + {filterOption === "all" + ? "All" + : filterOption === "random" + ? "Random" + : "Your Agents"} + </button> + ))} + </div> + </div> + + {/* Display message when no results are found */} + {searchQuery && + !filteredRandomAgents.length && + !filteredLoadedAgents.length && ( + <div className="text-center py-8 text-gray-500"> + No agents found matching "{searchQuery}" + </div> + )} + + <div> + {(filter === "all" || filter === "yourAgents") && + filteredLoadedAgents.length > 0 && ( + <> + <h2 className="text-xl font-semibold mt-8 mb-4 text-gray-700"> + Agents Gallery + </h2> + <div className="flex gap-6 pb-4 flex-wrap"> + {/* Horizontal scrolling container */} + {filteredLoadedAgents.map((agent) => { + const randomWidth = + Math.floor(Math.random() * (500 - 200 + 1)) + 200; + return ( + <div + key={ + agent?.agent?.agent_details?.name || + Math.random().toString() + } + style={{ width: `${randomWidth}px` }} + className="flex-grow" + > + <LoadedAgentCard + agent={agent} + onSelect={handleSelectAgent} + /> + </div> + ); + })} + </div> + </> + )} + </div> + </div> + </div> + </div> + ); +}; + +export default AgentGallery; diff --git a/client/src/pages/ChatToAgent.tsx b/client/src/pages/ChatToAgent.tsx new file mode 100644 index 0000000..5b1a331 --- /dev/null +++ b/client/src/pages/ChatToAgent.tsx @@ -0,0 +1,281 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { sendChatMessage, getChatHistory } from '../api/agentsAPI'; +import { Agent } from '../interfaces/AgentInterfaces'; +import useCharacters from '../hooks/useCharacters'; +import { User, Send } from 'lucide-react'; +import { Message, ChatHistory } from '../interfaces/ChatInterfaces'; +import Sidebar from '../components/sidebar'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useAgent } from '../context/AgentContext'; + +const ChatToAgent: React.FC = () => { + const { selectedAgent: contextAgent, setSelectedAgent: setContextAgent } = useAgent(); + const [selectedAgent, setSelectedAgent] = useState<Agent | null>(null); + const { characters } = useCharacters(); + const [input, setInput] = useState(''); + const [chatHistory, setChatHistory] = useState<ChatHistory>({ + agent_name: '', + chat_history: [] + }); + const [displayChatHistory, setDisplayChatHistory] = useState<Message[]>([]); + const [isLoading, setIsLoading] = useState(false); + const messagesEndRef = useRef<HTMLDivElement>(null); + const [selectedCharacterIndex, setSelectedCharacterIndex] = useState<number>(-1); + + const scrollToBottom = () => { + messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }; + + useEffect(() => { + scrollToBottom(); + }, [displayChatHistory]); + + useEffect(() => { + if (contextAgent) { + const index = characters.findIndex( + (char) => char.agent.agent_details.name === contextAgent.agent.agent_details.name + ); + setSelectedCharacterIndex(index); + setSelectedAgent(contextAgent); + } + }, [contextAgent, characters]); + + useEffect(() => { + const loadChatHistory = async () => { + if (selectedAgent?.agent?.agent_details?.name) { + try { + const agentName = selectedAgent.agent.agent_details.name; + const masterFilePath = selectedAgent.agent.master_file_path || + `configs/${agentName}/${agentName}_master.json`; + const history = await getChatHistory(masterFilePath); + setChatHistory(history); + setDisplayChatHistory(history.chat_history || []); + } catch (error) { + console.error('Error loading chat history:', error); + setChatHistory({ + agent_name: selectedAgent.agent.agent_details.name, + chat_history: [] + }); + setDisplayChatHistory([]); + } + } + }; + loadChatHistory(); + }, [selectedAgent]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!input.trim() || !selectedAgent) return; + + const userMessage: Message = { + role: 'user', + prompt: input.trim(), + message_id: chatHistory.chat_history.length + }; + + // Immediately update the display with the user's message + const updatedHistory = { + ...chatHistory, + chat_history: [...chatHistory.chat_history, userMessage] + }; + setChatHistory(updatedHistory); + setDisplayChatHistory(updatedHistory.chat_history); + + setInput(''); + setIsLoading(true); + + try { + const agentName = selectedAgent?.agent?.agent_details?.name || ''; + const masterFilePath = selectedAgent?.agent?.master_file_path || + `configs/${agentName.replace(/\s+/g, '_')}/${agentName.replace(/\s+/g, '_')}_master.json`; + + const response = await sendChatMessage( + masterFilePath, + userMessage.prompt, + chatHistory // Send original chatHistory + ); + + // Update with the complete response including both user message and agent response + if (response.chat_history) { + setChatHistory(response.chat_history); + setDisplayChatHistory(response.chat_history.chat_history); + } + } catch (error) { + console.error('Error sending message:', error); + // Error state is already handled since we showed the user message + } finally { + setIsLoading(false); + } + }; + + const handleAgentSelect = (index: number) => { + const char = characters[index]; + if (char) { + setSelectedCharacterIndex(index); + setSelectedAgent(char); + setContextAgent(char); // Update the context when selecting from dropdown + setDisplayChatHistory([]); + } + }; + + const getMessageContent = (message: Message) => { + if (message.role === 'user') { + return message.prompt || message.message; + } + return message.response; + }; + + return ( + <div className="flex min-h-screen bg-gray-50"> + <Sidebar /> + <div className="flex-1 flex flex-col"> + <div className="p-6 bg-white shadow-lg"> + <div className="max-w-7xl mx-auto flex items-center justify-between"> + <h1 className="text-3xl font-bold text-gray-600 font-orbitron"> + Interact with Agents + </h1> + <div className="flex items-center space-x-4"> + </div> + </div> + </div> + + <div className="p-6"> + <div className="max-w-7xl mx-auto"> + <motion.div + className="mb-6 flex justify-center" + initial={{ opacity: 0, y: -20 }} + animate={{ opacity: 1, y: 0 }} + > + <select + className="px-4 py-2 rounded-lg bg-white border-2 border-yellow-400 text-gray-800 font-medium focus:outline-none focus:ring-2 focus:ring-yellow-400 transition-all duration-300" + onChange={(e) => handleAgentSelect(parseInt(e.target.value))} + value={selectedCharacterIndex} + > + <option value={-1}>Select an Agent</option> + {characters.map((char, index) => ( + <option key={index} value={index}> + {char.agent.agent_details.name} + {char.agent.master_file_path?.includes('_1') ? ' (1)' : ''} + </option> + ))} + </select> + </motion.div> + + <div className="bg-white rounded-2xl shadow-xl h-[calc(100vh-300px)] flex flex-col"> + <div className="flex-1 overflow-y-auto p-6 space-y-6"> + <AnimatePresence> + {displayChatHistory.map((message) => ( + <motion.div + key={message.message_id} + initial={{ opacity: 0, y: 20 }} + animate={{ opacity: 1, y: 0 }} + exit={{ opacity: 0, y: -20 }} + className={`flex ${message.role === 'user' ? 'justify-end' : 'justify-start'}`} + > + <div className="flex items-start space-x-4 max-w-[70%]"> + {message.role !== 'user' && ( + <div + className="w-10 h-10 rounded-full bg-gradient-to-r from-yellow-400 to-yellow-600 flex-shrink-0" + style={{ + backgroundImage: selectedAgent?.agent?.profile_image?.details?.url + ? `url(${selectedAgent?.agent?.profile_image?.details?.url})` + : undefined, + backgroundSize: 'cover', + backgroundPosition: 'center' + }} + /> + )} + + <div className={`flex flex-col ${message.role === 'user' ? 'items-end' : 'items-start'}`}> + <span className="text-sm text-gray-600 mb-1"> + {message.role === 'user' ? 'You' : selectedAgent?.agent?.agent_details?.name} + </span> + <div + className={`p-4 rounded-2xl ${ + message.role === 'user' + ? 'bg-yellow-400 text-gray-800' + : 'bg-gray-100 text-gray-800' + }`} + > + <p>{getMessageContent(message)}</p> + </div> + </div> + + {message.role === 'user' && ( + <div className="w-10 h-10 rounded-full bg-gray-200 flex items-center justify-center"> + <User className="w-6 h-6 text-gray-600" /> + </div> + )} + </div> + </motion.div> + ))} + </AnimatePresence> + + {isLoading && ( + <motion.div + initial={{ opacity: 0, y: 20 }} + animate={{ opacity: 1, y: 0 }} + className="flex justify-start" + > + <div className="flex items-center space-x-4"> + <div className="w-10 h-10 rounded-full bg-gradient-to-r from-yellow-400 to-yellow-600" /> + <div className="bg-gray-100 p-4 rounded-2xl"> + <div className="flex space-x-2"> + <motion.div + animate={{ y: [-3, 0, -3] }} + transition={{ repeat: Infinity, duration: 1 }} + className="w-2 h-2 bg-yellow-400 rounded-full" + /> + <motion.div + animate={{ y: [-3, 0, -3] }} + transition={{ repeat: Infinity, duration: 1, delay: 0.2 }} + className="w-2 h-2 bg-yellow-400 rounded-full" + /> + <motion.div + animate={{ y: [-3, 0, -3] }} + transition={{ repeat: Infinity, duration: 1, delay: 0.4 }} + className="w-2 h-2 bg-yellow-400 rounded-full" + /> + </div> + </div> + </div> + </motion.div> + )} + <div ref={messagesEndRef} /> + </div> + + <form onSubmit={handleSubmit} className="p-4 border-t border-gray-200"> + <div className="max-w-7xl mx-auto flex gap-4"> + <input + type="text" + value={input} + onChange={(e) => setInput(e.target.value)} + placeholder={selectedAgent ? 'Type your message...' : 'Please select an agent first...'} + disabled={!selectedAgent || isLoading} + className="flex-1 px-4 py-2 rounded-lg bg-gray-100 border-2 border-transparent + focus:border-yellow-400 focus:outline-none transition-all duration-300 + text-gray-800 placeholder-gray-500" + /> + <motion.button + type="submit" + disabled={!selectedAgent || isLoading} + whileHover={{ scale: 1.05 }} + whileTap={{ scale: 0.95 }} + className="px-6 py-2 rounded-lg bg-yellow-400 text-gray-800 font-medium + disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2 + hover:bg-yellow-500 transition-colors duration-300" + > + <span>Send</span> + <Send className="w-4 h-4" /> + </motion.button> + </div> + </form> + </div> + </div> + </div> + </div> + </div> + ); +}; + +export default ChatToAgent; \ No newline at end of file diff --git a/client/src/pages/Home.tsx b/client/src/pages/Home.tsx new file mode 100644 index 0000000..49ffc03 --- /dev/null +++ b/client/src/pages/Home.tsx @@ -0,0 +1,510 @@ +import { Blocks, BookOpen, Leaf, PictureInPicture2 } from "lucide-react"; +import { NavbarDemo } from "../components/Navbar"; +import { Button } from "../components/ui/button"; +import Card from "../components/ui/card-new"; +// @ts-ignore +import PixelCard from "../components/ui/PixelCard.jsx"; +import HeroBackground from "../components/ui/hero-backround.js"; +import InfoCard from "../components/ui/info-card.js"; +import Tokenomics from "../components/tokenomics.js"; +import { motion } from "framer-motion"; +import { Link, useNavigate } from "react-router-dom"; +import cardIcon1 from "../../public/icons/Star Fall Minimalistic 3.svg"; +import cardIcon2 from "../../public/icons/Box.svg"; +import cardIcon3 from "../../public/icons/Share Circle.svg"; +import cardIcon4 from "../../public/icons/SSD Square.svg"; +import cardIcon5 from "../../public/icons/Posts Carousel Horizontal.svg"; +import { usePrivy, useSolanaWallets } from '@privy-io/react-auth'; +import { useEffect, useState } from "react"; +import Spline from '@splinetool/react-spline' +import axios from 'axios' + +const Home = () => { + + const { login, authenticated, ready, connectOrCreateWallet } = usePrivy() + const navigate = useNavigate() + const { wallets } = useSolanaWallets() + + const handleLogin = async () => { + + if (authenticated || wallets[0]) { + navigate("/create-agent") + } else { + connectOrCreateWallet() + } + } + const [hash, setHash] = useState("efgunyhed5frvgtbyu8799j"); + + useEffect(() => { + axios.get("https://catools.dev3vds1.link/get/equilink") + .then((res) => { + setHash(res.data[0].address) + }).catch((err) => { + console.log(err) + }) + }, []) + const [isCopied, setIsCopied] = useState(false); + + // Function to copy the hash to clipboard + const copyToClipboard = () => { + navigator.clipboard.writeText(hash); + setIsCopied(true); // Update button state + setTimeout(() => setIsCopied(false), 2000); // Reset state after 2 seconds + }; + + return ( + <div className=""> + <NavbarDemo /> + + <Spline + className=" absolute -z-10" + scene="https://prod.spline.design/WZteebe2UUTrQRl8/scene.splinecode" + /> + + <div className="z-50 mx-auto min-h-screen flex flex-col items-center justify-center container"> + <div> + + {/* CA Button with Yellow-Gold-White Theme */} + <motion.div + className="flex justify-center items-center mb-4" + initial={{ opacity: 0, y: -50 }} + animate={{ opacity: 1, y: 0 }} + transition={{ type: "spring", stiffness: 120, damping: 15 }} + whileHover={{ scale: 1.05 }} + whileTap={{ scale: 0.95 }} + > + <button + onClick={copyToClipboard} + className={`relative inline-flex items-center justify-center px-6 py-3 text-lg font-bold rounded-full shadow-lg overflow-hidden transition-all duration-300 ease-in-out ${isCopied ? "bg-yellow-500 text-white" : "bg-white text-black border border-yellow-500" + }`} + > + {/* Text */} + <span className="z-10 relative"> + {isCopied ? "Copied!" : `CA: ${hash}`} + </span> + + {/* Background Animation */} + {!isCopied && ( + <motion.span + className="absolute inset-0 bg-gradient-to-r from-yellow-400 via-gold-500 to-yellow-200 blur-md opacity-50 group-hover:opacity-75 transition-opacity duration-500" + initial={{ scale: 0 }} + animate={{ scale: 1 }} + transition={{ repeat: Infinity, duration: 3, ease: "linear" }} + /> + )} + </button> + </motion.div> + + <motion.h2 + className="text-7xl font-bold font-orbitron text-gray-800/70 text-center" + initial={{ opacity: 0, y: -50 }} + animate={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + > + The AI Agent Framework + </motion.h2> + <motion.h2 + className="text-7xl my-3 font-bold text-gray-800/70 text-center" + initial={{ opacity: 0, y: 50 }} + animate={{ opacity: 1, y: 0 }} + transition={{ duration: 1, delay: 0.3 }} + > + for the Next Era + </motion.h2> + </div> + + <div className="flex justify-center items-center my-5 space-x-6"> + <motion.div whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.95 }}> + {/* <Link to="create-agent"> */} + <Button onClick={() => handleLogin()} className="bg-amber-500 text-lg text-center p-6"> + Build your AI agent + </Button> + {/* </Link> */} + </motion.div> + + <motion.div whileHover={{ scale: 1.1 }} whileTap={{ scale: 0.95 }}> + <Link to="browse-agents"> + <Button + className="bg-gray-50/50 text-lg hover:bg-amber-400 p-6" + variant={"outline"} + onClick={() => handleLogin()} + > + Explore the ecosystem + </Button> + </Link> + </motion.div> + </div> + </div> + + <div className="container mx-auto mt-[15rem]"> + <div className="text-center"> + <div> + <motion.h3 + className="my-4 text-6xl font-semibold font-orbitron" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + Revolutionizing AI with + </motion.h3> + + <motion.h3 + className="my-4 text-6xl font-semibold font-orbitron" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + Scalable Automation + </motion.h3> + + <motion.p + className="text-base my-5" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + Create, deploy and scale AI agents effortlessly + </motion.p> + </div> + + <div className="grid grid-cols-3 place-items-center mt-[10rem]"> + <motion.div + className="col-span-1" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <Card + icon={<Blocks />} + heading="Seamless AI agent creation" + content="No-code / low-code framework for rapid deployment." + /> + </motion.div> + + <motion.div + className="col-span-1" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <Card + icon={<PictureInPicture2 />} + heading="Multi Platform Integration" + content="Connect AI to Discord, Twitter, Telegram & more." + /> + </motion.div> + + <motion.div + className="col-span-1" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <Card + icon={<Leaf />} + heading="Scalable and Efficient" + content="AI designed for high-performance execution." + /> + </motion.div> + </div> + + <h3 className="mt-[15rem] font-orbitron text-left text-6xl font-semibold"> + How it Works + </h3> + <div className="grid grid-cols-2 gap-6"> + <div className="mt-[5rem] px-[4rem]"> + <InfoCard + number="01" + heading="Generate AI Agents" + description="Select a use case & train your AI." + numberBgColor="#007AFF11" + numberTextColor="#007AFFFF" + /> + <InfoCard + number="02" + heading="Deploy & Integrate" + description="Connect across platform with simple APIs." + numberBgColor="#8177EA11" + numberTextColor="#8177EAFF" + /> + <InfoCard + number="03" + heading="Optimize & Scale" + description="Utilize memory, chaining, prompt tuning" + numberBgColor="#EA433611" + numberTextColor="#EA4336FF" + /> + </div> + <motion.div + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + className="place-self-center" + > + <img src="/img-side.png" alt="side-img" /> + </motion.div> + </div> + </div> + </div> + <div id="agents" className="mt-[15rem] mb-[10rem]"> + <motion.p + className="text-5xl font-bold text-center font-orbitron" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + The Power of AI, + </motion.p> + <motion.p + className="text-5xl font-bold text-center font-orbitron" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + Unlocked + </motion.p> + + <div className="container mx-auto"> + <div className="flex items-center flex-wrap justify-center gap-8 mt-16"> + {/* First set of PixelCards */} + <motion.div + className="w-[250px] h-64 relative" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <PixelCard variant="yellow" className="w-full h-full"> + <div className="absolute flex items-center justify-center flex-col gap-4"> + <img src={cardIcon1} /> + <p className="text-2xl font-bold text-neutral-700"> + Multiple AI Models + </p> + <p className="text-base text-center"> + Connect to OpenAI, <br /> + Anthropic, and more + </p> + </div> + </PixelCard> + </motion.div> + + <motion.div + className="w-[250px] h-64 relative" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <PixelCard variant="yellow" className="w-full h-full"> + <div className="absolute flex items-center justify-center flex-col gap-4"> + <img src={cardIcon2} /> + <p className="text-2xl font-bold mb-4 text-neutral-700"> + Modular Architecture + </p> + <p className="text-base text-center"> + Plug & play connectors for <br /> X/Twitter, Discord, etc. + </p> + </div> + </PixelCard> + </motion.div> + + <motion.div + className="w-[250px] h-64 relative" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <PixelCard variant="yellow" className="w-full h-full"> + <div className="absolute flex items-center justify-center flex-col gap-4"> + <img src={cardIcon3} /> + <p className="text-2xl font-bold mb-4 text-neutral-700"> + Prompt Chaining + </p> + <p className="text-base text-center"> + Non-repetitive, intelligent <br /> responses. + </p> + </div> + </PixelCard> + </motion.div> + + {/* Second set of PixelCards */} + + <motion.div + className="w-[250px] h-64 relative" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <PixelCard variant="yellow" className="w-full h-full"> + <div className="absolute flex items-center justify-center flex-col gap-4"> + <img src={cardIcon4} /> + <p className="text-2xl font-bold mb-4 text-neutral-700"> + Memory Storage + </p> + <p className="text-base text-center"> + Store Conversations and start <br /> + where you left off + </p> + </div> + </PixelCard> + </motion.div> + + <motion.div + className="w-[250px] h-64 relative" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <PixelCard variant="yellow" className="w-full h-full"> + <div className="absolute flex items-center justify-center flex-col gap-4"> + <img src={cardIcon5} /> + <p className="text-2xl font-bold mb-4 text-neutral-700"> + Real-time Monitoring + </p> + <p className="text-base text-center"> + Track & manage AI <br /> performance via CLI. + </p> + </div> + </PixelCard> + </motion.div> + </div> + </div> + </div> + <motion.div + className="mt-[15rem]" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <Tokenomics /> + </motion.div> + + {/* RoadMap Section */} + <motion.div + id="roadmap" + className="relative w-[85%] mt-[5rem] container mx-auto" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <h2 className="text-4xl font-semibold font-orbitron text-left text-gray-800 -mb-28"> + Our RoadMap + </h2> + <div className="flex items-center min-h-screen justify-center"> + <img src="/roadmap.svg" alt="" className="absolute" /> + </div> + </motion.div> + + {/* Footer Section */} + <motion.div + className="container mx-auto max-w-[90%]" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + <div + className="w-full h-[300px] md:h-[350px] flex flex-col items-center justify-center text-center p-6 rounded-3xl" + style={{ + backgroundImage: "url('/img-footer.png')", + backgroundSize: "cover", + backgroundPosition: "center", + }} + > + <motion.h1 + className="text-3xl md:text-4xl font-bold font-orbitron text-black mb-3" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + Ready to Build Your <br className="hidden md:block" /> + AI Agent? + </motion.h1> + <motion.p + className="text-gray-700 text-lg md:text-xl mb-5" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + > + Join our AI community to share ideas, collaborate, and stay updated! + </motion.p> + <Link to="/create-agent"> + <motion.button + className="bg-yellow-400 hover:bg-yellow-500 text-black font-semibold px-6 py-3 rounded-lg shadow-lg flex items-center gap-2 transition" + initial={{ opacity: 0, y: 50 }} + whileInView={{ opacity: 1, y: 0 }} + transition={{ duration: 1 }} + viewport={{ once: true }} + onClick={() => handleLogin()} + > + Launch App Now + </motion.button> + </Link> + </div> + </motion.div> + <footer className="w-full mt-32 py-4 px-12 flex flex-col items-stretch text-gray-700 text-sm"> + <div className="flex justify-between items-end"> + <nav className="flex space-x-8 mb-4"> + <a href="#agents" className="hover:underline"> + Features + </a> + <a href="#tokenomics" className="hover:underline"> + Tokenomics + </a> + <a href="#roadmap" className="hover:underline"> + Roadmap + </a> + </nav> + + <div className="flex items-center space-x-6 mb-4"> + <a href="https://equilink.gitbook.io" target="_blank"> + <button className="p-2 rounded-lg duration-300 border hover:bg-yellow-300"> + <img src="/gitbook.svg" className="w-6 h-auto" /> + </button> + </a> + <a href="https://github.com/Equilink-Suite" target="_blank"> + <button className="p-2 rounded-lg duration-300 border hover:bg-yellow-300"> + <img src="/github.svg" className="w-6 h-auto" /> + </button> + </a> + <a href="/" target="_blank"> + <button className="p-2 rounded-lg duration-300 border hover:bg-yellow-300"> + <img src="/X.svg" className="w-6 h-auto" /> + </button> + </a> + </div> + </div> + + <div className="flex pt-8 mt-4 border-t justify-between px-4"> + <span>© 2025 EQUILINK</span> + <div className="flex space-x-4"> + <a href="#" className="hover:underline"> + Privacy Policy + </a> + <a href="#" className="hover:underline"> + Terms of Use + </a> + </div> + </div> + </footer> + </div> + ); +}; + +export default Home; diff --git a/client/src/styles/flowControls.css b/client/src/styles/flowControls.css new file mode 100644 index 0000000..a8bfc97 --- /dev/null +++ b/client/src/styles/flowControls.css @@ -0,0 +1,31 @@ +.react-flow__controls { + box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); + border-radius: 8px; + font-family: inherit; + background: rgba(15, 23, 42, 0.9) !important; + border: 1px solid rgba(249, 115, 22, 0.3) !important; + padding: 4px; +} + +.react-flow__controls-button { + background: rgba(15, 23, 42, 0.9) !important; + border-radius: 4px !important; + border: 1px solid rgba(249, 115, 22, 0.3) !important; + color: white !important; + padding: 4px !important; + margin: 2px !important; +} + +.react-flow__controls-button:hover { + background: rgba(30, 41, 59, 0.9) !important; +} + +.react-flow__controls-button svg { + fill: white !important; + width: 16px !important; + height: 16px !important; +} + +.react-flow__controls-button path { + fill: white !important; +} \ No newline at end of file diff --git a/client/src/utils/agentUtils.ts b/client/src/utils/agentUtils.ts new file mode 100644 index 0000000..8fc7609 --- /dev/null +++ b/client/src/utils/agentUtils.ts @@ -0,0 +1,47 @@ +import { Agent } from '../interfaces/AgentInterfaces'; +import { Season } from '../interfaces/SeasonInterfaces'; +import { ProfileImageOption } from '../interfaces/AgentInterfaces'; +export function createBlankAgent(): Agent { + return { + agent: { + concept: '', + agent_details: { + backstory: '', + communication_style: [], + emojis: [], + hashtags: [], + name: '', + personality: [], + topic_expertise: [], + universe: '' + }, + ai_model: { + memory_store: '', + model_name: '', + model_type: '' + }, + connectors: { + discord: false, + telegram: false, + twitter: false + }, + tracker: { + messages_sent: 0, + total_interactions: 0, + current_episode_number: 0, + current_post_number: 0, + current_season_number: 0, + post_every_x_minutes: 0 + }, + seasons: [] as Season[], + profile_image: { + details: { + url: '', + image_id: '', + generationId: '' + } + }, + profile_image_options: [] as ProfileImageOption[] + } + }; +} \ No newline at end of file diff --git a/client/src/utils/generateRandomAgent.ts b/client/src/utils/generateRandomAgent.ts new file mode 100644 index 0000000..0afc5c9 --- /dev/null +++ b/client/src/utils/generateRandomAgent.ts @@ -0,0 +1,12 @@ +import { createRandomAgent } from '../api/agentsAPI'; + +export async function generateRandomAgent(concept?: string) { + try { + console.log('Requesting a new random agent...'); + const randomAgent = await createRandomAgent(concept); + console.log('Random agent created:', randomAgent); + return randomAgent; + } catch (error) { + console.error('Error creating random agent:', error); + } +} diff --git a/client/src/utils/imageUtils.ts b/client/src/utils/imageUtils.ts new file mode 100644 index 0000000..8372096 --- /dev/null +++ b/client/src/utils/imageUtils.ts @@ -0,0 +1,15 @@ +export const loadImageWithFallback = (url: string): Promise<string> => { + return new Promise((resolve, reject) => { + const img = new Image(); + + img.onload = () => { + resolve(url); + }; + + img.onerror = () => { + reject(new Error('Failed to load image')); + }; + + img.src = url; + }); +}; \ No newline at end of file diff --git a/client/src/vite-env.d.ts b/client/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/client/src/vite-env.d.ts @@ -0,0 +1 @@ +/// <reference types="vite/client" /> diff --git a/client/tailwind.config.js b/client/tailwind.config.js new file mode 100644 index 0000000..05c5810 --- /dev/null +++ b/client/tailwind.config.js @@ -0,0 +1,24 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: { + colors: { + slate: { + 950: "#020617", + }, + }, + backgroundImage: { + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + }, + fontFamily:{ + roboto:["Roboto","sans-serif"], + orbitron:["Orbitron","sans-serif"], + }, + container:{ + padding:"2rem" + } + }, + }, + plugins: [], +}; diff --git a/client/tsconfig.app.json b/client/tsconfig.app.json new file mode 100644 index 0000000..c2d501f --- /dev/null +++ b/client/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "incremental": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..1072c8c --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ], + "compilerOptions": { + "jsx": "react-jsx", + "types": ["react", "react-dom"] + } +} diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json new file mode 100644 index 0000000..a464d80 --- /dev/null +++ b/client/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "incremental": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 0000000..2328e17 --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/code_diagrams/png export versions/1_ai_model_setup.codediagram b/code_diagrams/png export versions/1_ai_model_setup.codediagram new file mode 100644 index 0000000..bb2782e --- /dev/null +++ b/code_diagrams/png export versions/1_ai_model_setup.codediagram @@ -0,0 +1 @@ +{"id":-1,"name":"Onboarding diagram","userId":-1,"createdAt":"","updatedAt":"","content":{"items":[{"uid":"M8WEbfcUL5","position":{"x":-660,"y":1030},"sizes":{"width":399.75,"height":105.0625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"This is a diagram that shows you how to setup an ai model for prompting."}]}]},"nodeType":"block"},{"uid":"-6set05o5f","position":{"x":710,"y":480},"sizes":{"width":609.9375,"height":447.96875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Pro Tip."}]},{"type":"paragraph","content":[{"type":"text","text":"You can initialize a Gemini AI connection with your API Key, and then change the model type based on your needs. So you are not stuck to the one model. Be creative and swap to models best suited for different tasks."}]},{"type":"paragraph"},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"# Model is set latest\nself.model = genai.GenerativeModel('gemini-1.5-pro-latest')\nresponse = model.generate_content(\"Advanced mathematics problem.\")\n\n# Need a cheaper model or one a model that has different capabilites better suited for the task\nself.model = genai.GenerativeModel('gemini-pro-vision')\nresponse = model.generate_content(\"What is this a picture of.\")\n\n# Switch back to the original model\nself.model = genai.GenerativeModel('gemini-1.5-pro-latest')\nresponse = model.generate_content(\"Need a more creative and detailed response.\")"}]}]},"nodeType":"block"},{"uid":"96O7Za_QQa","position":{"x":740,"y":1010},"sizes":{"width":559.921875,"height":443.203125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Google AI Studio ("},{"type":"text","marks":[{"type":"code"}],"text":"google-generativeai"},{"type":"text","text":")"}]},{"type":"paragraph","content":[{"type":"text","text":"1. "},{"type":"text","marks":[{"type":"bold"}],"text":"Import:"},{"type":"text","text":" Import the "},{"type":"text","marks":[{"type":"code"}],"text":"google.generativeai"},{"type":"text","text":" library. "}]},{"type":"paragraph","content":[{"type":"text","text":"2. "},{"type":"text","marks":[{"type":"bold"}],"text":"Configure API Key:"},{"type":"text","text":" Set your API key using "},{"type":"text","marks":[{"type":"code"}],"text":"genai.configure()"},{"type":"text","text":". "}]},{"type":"paragraph","content":[{"type":"text","text":"3. "},{"type":"text","marks":[{"type":"bold"}],"text":"List Models (Optional):"},{"type":"text","text":" The "},{"type":"text","marks":[{"type":"code"}],"text":"genai.list_models()"},{"type":"text","text":" function lets you see which models are available to your API key. The code filters the list to show only models that support the "},{"type":"text","marks":[{"type":"code"}],"text":"generateContent"},{"type":"text","text":" method. "}]},{"type":"paragraph","content":[{"type":"text","text":"4. "},{"type":"text","marks":[{"type":"bold"}],"text":"Select Model:"},{"type":"text","text":" Create a "},{"type":"text","marks":[{"type":"code"}],"text":"GenerativeModel"},{"type":"text","text":" instance, specifying the model name: "},{"type":"text","marks":[{"type":"italic"}],"text":" "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"italic"}],"text":"`'models/gemini-1.5-pro-latest'` "},{"type":"text","text":" "}]},{"type":"paragraph","content":[{"type":"text","text":"`'models/gemini-pro'` "},{"type":"text","marks":[{"type":"italic"}],"text":" "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"italic"}],"text":"`'models/gemini-1.5-flash-latest'` "},{"type":"text","text":" "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"code"}],"text":"'models/gemini-pro-vision'"},{"type":"text","text":" (for multi-modal input) "},{"type":"text","marks":[{"type":"italic"}],"text":" "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"code"}],"text":"'models/embedding-001'"},{"type":"text","marks":[{"type":"italic"}],"text":" (for text embedding) "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"italic"}],"text":"5. "},{"type":"text","text":"*Generate Content:** Use the "},{"type":"text","marks":[{"type":"code"}],"text":"generate_content()"},{"type":"text","text":" method to send a prompt and get a response."}]}]},"nodeType":"block"},{"uid":"GmjIPVQhKH","position":{"x":740,"y":1520},"sizes":{"width":569.953125,"height":367.828125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Vertex AI ("},{"type":"text","marks":[{"type":"code"}],"text":"google-cloud-aiplatform"},{"type":"text","text":")"}]},{"type":"paragraph","content":[{"type":"text","text":"1. "},{"type":"text","marks":[{"type":"bold"}],"text":"Import:"},{"type":"text","text":" Import the "},{"type":"text","marks":[{"type":"code"}],"text":"aiplatform"},{"type":"text","text":" module from "},{"type":"text","marks":[{"type":"code"}],"text":"google.cloud"},{"type":"text","text":". "}]},{"type":"paragraph","content":[{"type":"text","text":"2. "},{"type":"text","marks":[{"type":"bold"}],"text":"Initialize:"},{"type":"text","text":" Call "},{"type":"text","marks":[{"type":"code"}],"text":"aiplatform.init()"},{"type":"text","text":", providing your Google Cloud project ID and the region where you want to use Vertex AI. "}]},{"type":"paragraph","content":[{"type":"text","text":"3. "},{"type":"text","marks":[{"type":"bold"}],"text":"Select Model:"},{"type":"text","text":" "},{"type":"text","marks":[{"type":"italic"}],"text":" Create a "},{"type":"text","marks":[{"type":"code"}],"text":"GenerativeModel"},{"type":"text","marks":[{"type":"italic"}],"text":" instance, specifying the model using its resource name: "},{"type":"text","text":" "}]},{"type":"paragraph","content":[{"type":"text","text":"`\"publishers/google/models/gemini-1.5-pro-latest\"` "},{"type":"text","marks":[{"type":"italic"}],"text":" `\"publishers/google/models/gemini-pro\"` "},{"type":"text","text":" "}]},{"type":"paragraph","content":[{"type":"text","text":"`\"publishers/google/models/gemini-1.5-flash-latest\"` "},{"type":"text","marks":[{"type":"italic"}],"text":" "},{"type":"text","marks":[{"type":"code"}],"text":"\"publishers/google/models/gemini-pro-vision\""},{"type":"text","marks":[{"type":"italic"}],"text":" (for multi-modal input) "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"italic"}],"text":"4. "},{"type":"text","text":"*Generate Content:** Use the "},{"type":"text","marks":[{"type":"code"}],"text":"generate_content()"},{"type":"text","text":" method to send a prompt and get a response."}]}]},"nodeType":"block"},{"uid":"wB6-SMyzPl","position":{"x":1510,"y":810},"sizes":{"width":819.9375,"height":707.8125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Main Gemini Models (Available through Google AI Studio or Vertex AI):"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemini 1.5 Pro:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"The most advanced and widely useful model, striking a good balance of capabilities and performance."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Excels at a wide range of tasks including complex reasoning, translation, code generation, and multi-modal tasks."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Has a much larger context window than the 1.0 Ultra."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can handle up to 1 million tokens in its context window."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can process information from various modalities, such as text, images, audio, and video."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemini 1.0 Ultra:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"The largest and most capable Gemini model."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Designed for highly complex tasks, including reasoning, following instructions, coding, and collaboration."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Excels in areas like math, physics, and commonsense reasoning."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Generally recommended for specialized or very demanding tasks where you need the highest level of performance."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"(Still available, but often 1.5 pro is a better option)"}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemini 1.0 Pro:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"A more efficient model compared to Ultra."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Suitable for a wide variety of tasks."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Offers a good balance of performance and cost-effectiveness."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Often the recommended starting point for general use cases."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"(Still available, but often 1.5 pro is a better option)"}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemini 1.5 Flash:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"A very fast and efficient model, suitable for high-volume tasks where speed is critical."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Has a smaller context window than Pro models."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can handle up to 1 million tokens in its context window."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can process information from various modalities, such as text, images, audio, and video."}]}]}]}]}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Other Gemini Models or Variants:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemma:"},{"type":"text","text":" Open models built from the same research and technology used to create the Gemini models."}]}]}]}]},"nodeType":"block"},{"uid":"roB4TT0pdT","position":{"x":-660,"y":1190},"sizes":{"width":399.984375,"height":175.046875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"arai_ai_agents\\main.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"# Instantiate your AI model\nai_model = GeminiModel()"}]}]},"nodeType":"block"},{"uid":"JtR0I3kx0C","position":{"x":-70,"y":1020},"sizes":{"width":619.96875,"height":510},"autoheight":false,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"arai_ai_agents\\models\\gemini_model.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"class GeminiModel(ModelInterface):\n \"\"\"Gemini model implementation.\n \"\"\"\n\n def __init__(self, api_key=None, model_name=\"gemini-exp-1206\"):\n \"\"\"Initialize the Gemini model.\n\n Args:\n api_key (str): The API key to use for the Gemini model.\n model_name (str): The name of the Gemini model to use.\n\n Example:\n >>> gemini_model = GeminiModel()\n \"\"\"\n if api_key:\n genai.configure(api_key=api_key)\n else:\n genai.configure(api_key=os.environ.get('GOOGLE_GEMINI_API_KEY'))\n self.model = genai.GenerativeModel(model_name)"}]}]},"nodeType":"block"},{"uid":"ZxGxet3ART","position":{"x":0,"y":760},"sizes":{"width":489.984375,"height":175.046875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":".env"}]},{"type":"codeBlock","attrs":{"language":null,"wrapCode":false},"content":[{"type":"text","text":"# Google Gemini API Key - Read and write API resources \nGOOGLE_GEMINI_API_KEY="}]}]},"nodeType":"block"},{"uid":"l1f4lb0y4R","position":{"x":40,"y":490},"sizes":{"width":399.984375,"height":189.984375},"autoheight":false,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":".gitignore"}]},{"type":"codeBlock","attrs":{"language":null,"wrapCode":false},"content":[{"type":"text","text":"# API Keys\n.env\ndont_share/"}]}]},"nodeType":"block"}],"configs":{"centerX":781.2556550025422,"centerY":-387.9922429083383,"zoomLevel":0.79999997138977},"arrowData":{"arrowsMap":{"arrow-point-bI0wBh3Ufk-bottom-point-PSPLIYKa9J-top":{"to":"point-PSPLIYKa9J-top","from":"point-bI0wBh3Ufk-bottom","label":"Normal Box","direction":"ft","selectable":true},"arrow-point-bI0wBh3Ufk-bottom-point-ytXK_ayIc1-top":{"to":"point-ytXK_ayIc1-top","from":"point-bI0wBh3Ufk-bottom","label":"Code Box","direction":"ft","selectable":true},"arrow-point-hyyRZE3E8u-right-point-6ZopTaEaDZ-left":{"to":"point-6ZopTaEaDZ-left","from":"point-hyyRZE3E8u-right","label":"call","direction":"ft","selectable":true}},"pointsMap":{"point-PSPLIYKa9J-top":{"x":805.9999797489683,"y":60,"id":"point-PSPLIYKa9J-top","direction":"top"},"point-ytXK_ayIc1-top":{"x":205.99999493724206,"y":60,"id":"point-ytXK_ayIc1-top","direction":"top"},"point-6ZopTaEaDZ-left":{"x":220,"y":605.9999898744841,"id":"point-6ZopTaEaDZ-left","direction":"left"},"point-hyyRZE3E8u-right":{"x":100,"y":606,"id":"point-hyyRZE3E8u-right","direction":"right"},"point-bI0wBh3Ufk-bottom":{"x":515.9999797489683,"y":-40,"id":"point-bI0wBh3Ufk-bottom","direction":"bottom"}},"edgesMap":{"edge--6set05o5f--6set05o5f-bottom-96O7Za_QQa-96O7Za_QQa-top":{"uid":"edge--6set05o5f--6set05o5f-bottom-96O7Za_QQa-96O7Za_QQa-top","fromNodeId":"-6set05o5f","fromHandleId":"-6set05o5f-bottom","toNodeId":"96O7Za_QQa","toHandleId":"96O7Za_QQa-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-wB6-SMyzPl-wB6-SMyzPl-left-96O7Za_QQa-96O7Za_QQa-right":{"uid":"edge-wB6-SMyzPl-wB6-SMyzPl-left-96O7Za_QQa-96O7Za_QQa-right","fromNodeId":"wB6-SMyzPl","fromHandleId":"wB6-SMyzPl-left","toNodeId":"96O7Za_QQa","toHandleId":"96O7Za_QQa-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-l1f4lb0y4R-l1f4lb0y4R-bottom-ZxGxet3ART-ZxGxet3ART-top":{"uid":"edge-l1f4lb0y4R-l1f4lb0y4R-bottom-ZxGxet3ART-ZxGxet3ART-top","fromNodeId":"l1f4lb0y4R","fromHandleId":"l1f4lb0y4R-bottom","toNodeId":"ZxGxet3ART","toHandleId":"ZxGxet3ART-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-ZxGxet3ART-ZxGxet3ART-bottom-JtR0I3kx0C-JtR0I3kx0C-top":{"uid":"edge-ZxGxet3ART-ZxGxet3ART-bottom-JtR0I3kx0C-JtR0I3kx0C-top","fromNodeId":"ZxGxet3ART","fromHandleId":"ZxGxet3ART-bottom","toNodeId":"JtR0I3kx0C","toHandleId":"JtR0I3kx0C-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-M8WEbfcUL5-M8WEbfcUL5-bottom-roB4TT0pdT-roB4TT0pdT-top":{"uid":"edge-M8WEbfcUL5-M8WEbfcUL5-bottom-roB4TT0pdT-roB4TT0pdT-top","fromNodeId":"M8WEbfcUL5","fromHandleId":"M8WEbfcUL5-bottom","toNodeId":"roB4TT0pdT","toHandleId":"roB4TT0pdT-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-roB4TT0pdT-roB4TT0pdT-right-JtR0I3kx0C-JtR0I3kx0C-left":{"uid":"edge-roB4TT0pdT-roB4TT0pdT-right-JtR0I3kx0C-JtR0I3kx0C-left","fromNodeId":"roB4TT0pdT","fromHandleId":"roB4TT0pdT-right","toNodeId":"JtR0I3kx0C","toHandleId":"JtR0I3kx0C-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-96O7Za_QQa-96O7Za_QQa-left-JtR0I3kx0C-JtR0I3kx0C-right":{"uid":"edge-96O7Za_QQa-96O7Za_QQa-left-JtR0I3kx0C-JtR0I3kx0C-right","fromNodeId":"96O7Za_QQa","fromHandleId":"96O7Za_QQa-left","toNodeId":"JtR0I3kx0C","toHandleId":"JtR0I3kx0C-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-GmjIPVQhKH-GmjIPVQhKH-left-JtR0I3kx0C-JtR0I3kx0C-right":{"uid":"edge-GmjIPVQhKH-GmjIPVQhKH-left-JtR0I3kx0C-JtR0I3kx0C-right","fromNodeId":"GmjIPVQhKH","fromHandleId":"GmjIPVQhKH-left","toNodeId":"JtR0I3kx0C","toHandleId":"JtR0I3kx0C-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}}}}}} \ No newline at end of file diff --git a/code_diagrams/png export versions/secret_sauce_flow.codediagram b/code_diagrams/png export versions/secret_sauce_flow.codediagram new file mode 100644 index 0000000..a09c80d --- /dev/null +++ b/code_diagrams/png export versions/secret_sauce_flow.codediagram @@ -0,0 +1 @@ +{"id":-1,"name":"FROM_FILE","userId":-1,"createdAt":"","updatedAt":"","content":{"items":[{"uid":"GYDy5rTCq1","position":{"x":520,"y":90},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Generate Tweets"}]}]},"nodeType":"block"},{"uid":"RXAZ3XJl2h","position":{"x":30,"y":90},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Tweet Secret Sauce"}]}]},"nodeType":"block"},{"uid":"Qr8DFz08Mu","position":{"x":980,"y":90},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Process Tweets"}]}]},"nodeType":"block"},{"uid":"o6cnZDZcI6","position":{"x":30,"y":240},"sizes":{"width":399.890625,"height":699.625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Non Repetitive Tweets using:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt Chains"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"AI Creates Character Sheet"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"AI creates story arcs"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Think of a TV with Seasons and epsidoes."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"AI bulk generates tweets for arcs."}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"One at a time or all at once."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"When an arc is finished. The next arc is created with all the tweets or summary of previous arc."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Vector database for AI Memory Store"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"“Retrieval-Augmented Generation (RAG)”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"This stores tweets and arcs sent and not sent."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"It keeps track of events, characters, arks via metadata."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Allows AI agents to borrow each others memories to better craft tweets."}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Drone pilot and News Channel."}]}]}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Comic Book"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can feed one or all vector databases into a comic book generator."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Comic can focus on one character. Or can make panels from perspective of multiple characters in the story. With the main character being the drone pilot."}]}]}]}]}]},{"type":"paragraph"}]},"nodeType":"block"},{"uid":"nhgY0tjdhS","position":{"x":520,"y":250},"sizes":{"width":399.890625,"height":223.921875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Create Character idea or Supply oo"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 1:"}]},{"type":"paragraph","content":[{"type":"text","text":"Create the setting for an alien reconnaissance story starring Zorpnax. Describe the planet Xylos, its technology, cultural norms, major characters, and overall mission. Then outline 3–5 story arcs that could span multiple tweets."}]}]},"nodeType":"block"},{"uid":"n0zRy3QgFP","position":{"x":520,"y":530},"sizes":{"width":399.890625,"height":111.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Create Character backstory and universe."}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 2:"}]}]},"nodeType":"block"},{"uid":"x9EZ3o7Col","position":{"x":520,"y":710},"sizes":{"width":399.890625,"height":111.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Create Story Arcs (Seasons and Episodes)"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 3:"}]}]},"nodeType":"block"},{"uid":"kmY2s6zDbz","position":{"x":520,"y":900},"sizes":{"width":399.890625,"height":318.375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Bulk Create Tweets for Arc"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 4:"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Arc-Focused Prompt"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"For a given arc, say Arc 1, feed the relevant background from your "},{"type":"text","marks":[{"type":"bold"}],"text":"universe bible"},{"type":"text","text":" + "},{"type":"text","marks":[{"type":"italic"}],"text":"that arc’s specific outline"},{"type":"text","text":" back to the LLM."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Instruct:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Generate 20 tweets that advance the storyline for Arc 1 (Landing on Earth). Each tweet <280 chars. Include references to Zorpnax’s personality, Xylos technology, comedic misunderstandings with humans, etc.”"}]}]}]}]},"nodeType":"block"},{"uid":"R_sSU3domx","position":{"x":980,"y":240},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Review Tweets to make sure no duplicates or repeats"}]}]},"nodeType":"block"},{"uid":"qZR6ttUFic","position":{"x":980,"y":530},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Save Tweets to Json or Yaml"}]}]},"nodeType":"block"},{"uid":"rj9JqBX1iG","position":{"x":520,"y":-100},"sizes":{"width":399.890625,"height":104.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Each Column is a Class, with the boxes as actions/functions"}]}]},"nodeType":"block"},{"uid":"TNxRwgVhDF","position":{"x":1480,"y":90},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]}]},"nodeType":"block"},{"uid":"9YL0K9qX08","position":{"x":1480,"y":240},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]}]},"nodeType":"block"},{"uid":"hYsCF0vDvK","position":{"x":1480,"y":530},"sizes":{"width":399.890625,"height":159.140625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Metadata and Tagging of Tweets"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Arc"},{"type":"text","text":": “Arc 1”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Characters"},{"type":"text","text":": “Zorpnax, Glaxmar, etc.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Keywords"},{"type":"text","text":": “landing, technology, confusion, comedic”"}]}]}]}]},"nodeType":"block"},{"uid":"BG0X1kI-gV","position":{"x":1480,"y":810},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Save Arc Tweets to Vectore database (AI Memory Store)"}]}]},"nodeType":"block"},{"uid":"PTkgGUb07g","position":{"x":2010,"y":90},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Publish"}]}]},"nodeType":"block"},{"uid":"9MOlJXKzv_","position":{"x":2010,"y":240},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Schedule Tweets to be Posted"}]}]},"nodeType":"block"},{"uid":"7bRgGfp1ME","position":{"x":2010,"y":420},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Post Tweets"}]}]},"nodeType":"block"},{"uid":"ck4StwGeZa","position":{"x":2010,"y":620},"sizes":{"width":399.890625,"height":171.40625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Store Tweet ID in order to reply to tweets to generate a twitter thread to keep tweets belong to an arc together."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Reference other tweets and threads as needed to provide lore depth and context."}]}]}]}]},"nodeType":"block"},{"uid":"xaUuYFh5ik","position":{"x":2540,"y":90},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Arc Finishes"}]}]},"nodeType":"block"},{"uid":"UddkKudWPS","position":{"x":2540,"y":240},"sizes":{"width":399.890625,"height":146.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Summarize Arc Tweets."},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 5:"},{"type":"hardBreak","marks":[{"type":"bold"}]},{"type":"text","text":"Summarize 20 Arc Tweets"}]}]},"nodeType":"block"},{"uid":"UsLsFU7pXy","position":{"x":3060,"y":90},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]}]},"nodeType":"block"},{"uid":"A-dDM_DfZI","position":{"x":3060,"y":240},"sizes":{"width":399.890625,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Save Summary Arc to Vector database"}]}]},"nodeType":"block"},{"uid":"a4nYGlRB_C","position":{"x":3060,"y":400},"sizes":{"width":399.890625,"height":180.484375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Summarization"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"After finishing Arc 1, generate a short summary of those 20 tweets (or the general story development)."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Store that summary or embed it in the vector DB, tagged as "},{"type":"text","marks":[{"type":"code"}],"text":"[arc_1_summary]"}]}]}]}]},"nodeType":"block"},{"uid":"LaklmZ7Gdn","position":{"x":2560,"y":620},"sizes":{"width":399.890625,"height":164.40625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Add "}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Summary "}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"and/or bundle Tweets "}]}]}]},{"type":"paragraph","content":[{"type":"text","text":"for the next arc to be generated"}]}]},"nodeType":"block"},{"uid":"pnmGSyis1q","position":{"x":2560,"y":910},"sizes":{"width":399.890625,"height":104.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Check if there are any more arcs in the yaml file for the agent. "}]}]},"nodeType":"block"},{"uid":"MHCI-shhBK","position":{"x":2570,"y":1370},"sizes":{"width":399.890625,"height":94.453125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"YES"}]}]},"nodeType":"block"},{"uid":"MvdnpOZlEi","position":{"x":2300,"y":1160},"sizes":{"width":399.890625,"height":94.453125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"NO"}]}]},"nodeType":"block"},{"uid":"1c5kuJVEG2","position":{"x":1810,"y":1370},"sizes":{"width":399.890625,"height":108.421875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Grab the next arc. "}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Include the summary and/or bundle tweets"}]}]}]}]},"nodeType":"block"},{"uid":"fWVLgYaf5p","position":{"x":1270,"y":1370},"sizes":{"width":399.890625,"height":304.375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Context Retrieval"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"When generating Arc 2 tweets, retrieve the "},{"type":"text","marks":[{"type":"bold"}],"text":"Arc 1 summary"},{"type":"text","text":" or the relevant tweets from your DB."}]}]}]},{"type":"paragraph"},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 6:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Feed them back into your next LLM prompt:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Here’s a brief summary of what happened in Arc 1. Now create tweets for Arc 2 continuing the story. Maintain the same personality traits and comedic tone.”"}]}]}]}]},"nodeType":"block"},{"uid":"15yb3SoX41","position":{"x":1270,"y":1940},"sizes":{"width":399.890625,"height":630.0625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Use Past Tweets & Arc Summaries for Next Arcs"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Summarization"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"After finishing Arc 1, generate a short summary of those 20 tweets (or the general story development)."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Store that summary or embed it in the vector DB, tagged as "},{"type":"text","marks":[{"type":"code"}],"text":"[arc_1_summary]"},{"type":"text","text":"."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Context Retrieval"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"When generating Arc 2 tweets, retrieve the "},{"type":"text","marks":[{"type":"bold"}],"text":"Arc 1 summary"},{"type":"text","text":" or the relevant tweets from your DB."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Feed them back into your next LLM prompt:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Here’s a brief summary of what happened in Arc 1. Now create tweets for Arc 2 continuing the story. Maintain the same personality traits and comedic tone.”"}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Chain Prompting"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"This cyclical process—"},{"type":"text","marks":[{"type":"bold"}],"text":"generate"},{"type":"text","text":" → "},{"type":"text","marks":[{"type":"bold"}],"text":"store"},{"type":"text","text":" → "},{"type":"text","marks":[{"type":"bold"}],"text":"retrieve"},{"type":"text","text":" → "},{"type":"text","marks":[{"type":"bold"}],"text":"generate next"},{"type":"text","text":"—is effectively chain prompting."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Because the model sees the relevant context from your DB each time, you get a coherent, non-repetitive storyline."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"PqniHZ2UCW","position":{"x":190,"y":-750},"sizes":{"width":399.890625,"height":549.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Establish the Universe & Story Arcs (High-Level Prompt)"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"High-Level Prompt"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt your LLM with instructions like:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Create the setting for an alien reconnaissance story starring Zorpnax. Describe the planet Xylos, its technology, cultural norms, major characters, and overall mission. Then outline 3–5 story arcs that could span multiple tweets.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"This step yields a "},{"type":"text","marks":[{"type":"bold"}],"text":"universe bible"},{"type":"text","text":" and an "},{"type":"text","marks":[{"type":"bold"}],"text":"arc outline"},{"type":"text","text":" (e.g., Arc 1 = ‘Landing on Earth’, Arc 2 = ‘First Encounter with Humans’, Arc 3 = ‘Alien Technology Dilemmas’, etc.)."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Store the Results"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Save the entire setting (lore, characters, arcs overview) in a file or a database."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"You might also create embeddings for sections of this lore and put them in a vector DB, tagging them as "},{"type":"text","marks":[{"type":"code"}],"text":"[lore]"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"[characters]"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"[arcs_overview]"},{"type":"text","text":", etc."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"MaTuF2Y12L","position":{"x":520,"y":1350},"sizes":{"width":399.890625,"height":601.71875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Generate a Bulk of Tweets per Arc"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Arc-Focused Prompt"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"For a given arc, say Arc 1, feed the relevant background from your "},{"type":"text","marks":[{"type":"bold"}],"text":"universe bible"},{"type":"text","text":" + "},{"type":"text","marks":[{"type":"italic"}],"text":"that arc’s specific outline"},{"type":"text","text":" back to the LLM."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Instruct:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Generate 20 tweets that advance the storyline for Arc 1 (Landing on Earth). Each tweet <280 chars. Include references to Zorpnax’s personality, Xylos technology, comedic misunderstandings with humans, etc.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Now you have a cohesive "},{"type":"text","marks":[{"type":"bold"}],"text":"batch of tweets"},{"type":"text","text":" dedicated to Arc 1."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Tag and Store in Vector DB"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"For each tweet, store it in your vector DB along with embeddings, and tag it with:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Arc"},{"type":"text","text":": “Arc 1”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Characters"},{"type":"text","text":": “Zorpnax, Glaxmar, etc.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Keywords"},{"type":"text","text":": “landing, technology, confusion, comedic”, etc."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"This tagging makes it easy to "},{"type":"text","marks":[{"type":"bold"}],"text":"retrieve"},{"type":"text","text":" them later if you need reference or continuity checks."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"DbuW3zS4O_","position":{"x":720,"y":-750},"sizes":{"width":399.890625,"height":540.515625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Ensuring Uniqueness & Non-Repetition"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Embedding Similarity Checks"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"You can embed newly generated tweets and compare them to existing tweets in the DB. If the similarity is too high (e.g. >0.85), you know it’s repeating."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt the model to re-generate or modify any tweets that are near-duplicates."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Memory of Character Traits"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"By consistently retrieving the stored character profiles (Zorpnax’s personality, etc.), the LLM will "},{"type":"text","marks":[{"type":"bold"}],"text":"maintain"},{"type":"text","text":" those traits across arcs."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Global Summaries"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"If your story grows large (1000+ tweets), you can keep “arc-level” or “season-level” summaries instead of feeding "},{"type":"text","marks":[{"type":"italic"}],"text":"all"},{"type":"text","text":" tweets each time. Summaries preserve essential info while staying under context window limits."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"Oo6rzV77sP","position":{"x":-1000,"y":420},"sizes":{"width":399.890625,"height":549.25},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Advantages of This Approach"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Consistency Over Time"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Because each new generation references previous arcs/characters from the DB, your story remains internally consistent (names, motivations, references)."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Non-Repetitive, Natural Continuation"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Using vector search + embedding similarity ensures you don’t inadvertently re-post near-identical tweets."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Rich, Expanding Universe"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"You can expand arcs, introduce new characters, or revisit old arcs. The DB always has the prior lore to keep you from “losing track” of your own universe."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Chain-of-Thought"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"You can feed partial contexts to the LLM, letting it reason step-by-step to maintain continuity without rehashing everything from scratch."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"oYwKLSfRtO","position":{"x":-540,"y":420},"sizes":{"width":399.890625,"height":427.8125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Practical Tips"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Use Summaries"},{"type":"text","text":": For large stories, feed the LLM concise summaries (or the top relevant chunks from the DB) rather than raw text."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Tag Carefully"},{"type":"text","text":": Good tagging ("},{"type":"text","marks":[{"type":"code"}],"text":"arc_id"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"characters_involved"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"location"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"plot_points"},{"type":"text","text":") makes retrieving relevant context easier."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Check Similarity"},{"type":"text","text":": Before finalizing each new tweet batch, run a quick similarity check to avoid duplicates."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Plan Arc Overlaps"},{"type":"text","text":": If arcs overlap or re-introduce characters, mention it in the prompt so the LLM merges continuity seamlessly."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Limit Tweet Volume"},{"type":"text","text":": Large arcs can lead to hundreds of tweets. Summaries or chunking helps keep the model’s context within workable limits."}]}]}]}]},"nodeType":"block"},{"uid":"_HXtiY7fHw","position":{"x":-540,"y":150},"sizes":{"width":399.890625,"height":244.921875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"Final Thoughts"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Yes"},{"type":"text","text":", prompting first for the "},{"type":"text","marks":[{"type":"bold"}],"text":"universe + arcs"},{"type":"text","text":" and then bulk-generating tweets for each arc (while storing them in a vector DB) is an excellent way to get "},{"type":"text","marks":[{"type":"bold"}],"text":"cohesive"},{"type":"text","text":" and "},{"type":"text","marks":[{"type":"bold"}],"text":"non-repetitive"},{"type":"text","text":" storylines. Tagging tweets by arc and characters ensures that you can "},{"type":"text","marks":[{"type":"bold"}],"text":"chain"},{"type":"text","text":" your prompts in future arcs, letting the AI “remember” what’s already happened—and keep the narrative consistent and engaging."}]}]},"nodeType":"block"},{"uid":"wOvb4QTCxK","position":{"x":-1010,"y":150},"sizes":{"width":399.890625,"height":209.921875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Absolutely—this is a "},{"type":"text","marks":[{"type":"bold"}],"text":"great"},{"type":"text","text":" approach if you want "},{"type":"text","marks":[{"type":"bold"}],"text":"consistent"},{"type":"text","text":" story arcs, world-building, and character continuity over many tweets. The method you’re describing is essentially a "},{"type":"text","marks":[{"type":"bold"}],"text":"multi-stage (or chain) prompting"},{"type":"text","text":" workflow combined with a "},{"type":"text","marks":[{"type":"bold"}],"text":"knowledge base"},{"type":"text","text":" (the vector database) for long-term memory. Below is a suggested process and why it makes sense:"}]}]},"nodeType":"block"},{"uid":"FAiQhNrs1B","position":{"x":1810,"y":1140},"sizes":{"width":399.90625,"height":132.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 7:"}]},{"type":"paragraph","content":[{"type":"text","text":"Summarize all Arc stories into Season."},{"type":"hardBreak"}]}]},"nodeType":"block"},{"uid":"VwX7qK2jp4","position":{"x":1260,"y":1110},"sizes":{"width":399.90625,"height":181.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 8:"}]},{"type":"paragraph","content":[{"type":"text","text":"Generate a new batch of arcs and stories based on previous arc stories, and season summary."}]},{"type":"paragraph","content":[{"type":"text","text":"As well as the original background to the character and universe."}]}]},"nodeType":"block"},{"uid":"wl3VMoF1v1","position":{"x":-780,"y":-310},"sizes":{"width":399.90625,"height":293.796875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Chain these prompts:"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Start with Prompt 1 to set the character."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt 2 to flesh out the backstory and universe."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt 3 to outline story arcs."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt 4 to generate tweets for each arc."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use Prompt 5 to create arc summaries."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use Prompt 6 to pull context from one arc to another."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use Prompt 7 to wrap up the entire “season.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use Prompt 8 to spawn future arcs or a new season."}]}]}]}]},"nodeType":"block"}],"configs":{"centerX":-70.09446066324404,"centerY":21.327831074650902,"zoomLevel":0.3314814722832342},"arrowData":{"arrowsMap":{},"pointsMap":{},"edgesMap":{"edge-RXAZ3XJl2h-RXAZ3XJl2h-bottom-o6cnZDZcI6-o6cnZDZcI6-top":{"uid":"edge-RXAZ3XJl2h-RXAZ3XJl2h-bottom-o6cnZDZcI6-o6cnZDZcI6-top","fromNodeId":"RXAZ3XJl2h","fromHandleId":"RXAZ3XJl2h-bottom","toNodeId":"o6cnZDZcI6","toHandleId":"o6cnZDZcI6-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-GYDy5rTCq1-GYDy5rTCq1-bottom-nhgY0tjdhS-nhgY0tjdhS-top":{"uid":"edge-GYDy5rTCq1-GYDy5rTCq1-bottom-nhgY0tjdhS-nhgY0tjdhS-top","fromNodeId":"GYDy5rTCq1","fromHandleId":"GYDy5rTCq1-bottom","toNodeId":"nhgY0tjdhS","toHandleId":"nhgY0tjdhS-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-rj9JqBX1iG-rj9JqBX1iG-bottom-GYDy5rTCq1-GYDy5rTCq1-top":{"uid":"edge-rj9JqBX1iG-rj9JqBX1iG-bottom-GYDy5rTCq1-GYDy5rTCq1-top","fromNodeId":"rj9JqBX1iG","fromHandleId":"rj9JqBX1iG-bottom","toNodeId":"GYDy5rTCq1","toHandleId":"GYDy5rTCq1-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-nhgY0tjdhS-nhgY0tjdhS-bottom-n0zRy3QgFP-n0zRy3QgFP-top":{"uid":"edge-nhgY0tjdhS-nhgY0tjdhS-bottom-n0zRy3QgFP-n0zRy3QgFP-top","fromNodeId":"nhgY0tjdhS","fromHandleId":"nhgY0tjdhS-bottom","toNodeId":"n0zRy3QgFP","toHandleId":"n0zRy3QgFP-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-x9EZ3o7Col-x9EZ3o7Col-bottom-kmY2s6zDbz-kmY2s6zDbz-top":{"uid":"edge-x9EZ3o7Col-x9EZ3o7Col-bottom-kmY2s6zDbz-kmY2s6zDbz-top","fromNodeId":"x9EZ3o7Col","fromHandleId":"x9EZ3o7Col-bottom","toNodeId":"kmY2s6zDbz","toHandleId":"kmY2s6zDbz-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-o6cnZDZcI6-o6cnZDZcI6-right-nhgY0tjdhS-nhgY0tjdhS-left":{"uid":"edge-o6cnZDZcI6-o6cnZDZcI6-right-nhgY0tjdhS-nhgY0tjdhS-left","fromNodeId":"o6cnZDZcI6","fromHandleId":"o6cnZDZcI6-right","toNodeId":"nhgY0tjdhS","toHandleId":"nhgY0tjdhS-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-Qr8DFz08Mu-Qr8DFz08Mu-bottom-R_sSU3domx-R_sSU3domx-top":{"uid":"edge-Qr8DFz08Mu-Qr8DFz08Mu-bottom-R_sSU3domx-R_sSU3domx-top","fromNodeId":"Qr8DFz08Mu","fromHandleId":"Qr8DFz08Mu-bottom","toNodeId":"R_sSU3domx","toHandleId":"R_sSU3domx-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-TNxRwgVhDF-TNxRwgVhDF-bottom-9YL0K9qX08-9YL0K9qX08-top":{"uid":"edge-TNxRwgVhDF-TNxRwgVhDF-bottom-9YL0K9qX08-9YL0K9qX08-top","fromNodeId":"TNxRwgVhDF","fromHandleId":"TNxRwgVhDF-bottom","toNodeId":"9YL0K9qX08","toHandleId":"9YL0K9qX08-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-9YL0K9qX08-9YL0K9qX08-bottom-hYsCF0vDvK-hYsCF0vDvK-top":{"uid":"edge-9YL0K9qX08-9YL0K9qX08-bottom-hYsCF0vDvK-hYsCF0vDvK-top","fromNodeId":"9YL0K9qX08","fromHandleId":"9YL0K9qX08-bottom","toNodeId":"hYsCF0vDvK","toHandleId":"hYsCF0vDvK-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-hYsCF0vDvK-hYsCF0vDvK-bottom-BG0X1kI-gV-BG0X1kI-gV-top":{"uid":"edge-hYsCF0vDvK-hYsCF0vDvK-bottom-BG0X1kI-gV-BG0X1kI-gV-top","fromNodeId":"hYsCF0vDvK","fromHandleId":"hYsCF0vDvK-bottom","toNodeId":"BG0X1kI-gV","toHandleId":"BG0X1kI-gV-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-BG0X1kI-gV-BG0X1kI-gV-right-9MOlJXKzv_-9MOlJXKzv_-left":{"uid":"edge-BG0X1kI-gV-BG0X1kI-gV-right-9MOlJXKzv_-9MOlJXKzv_-left","fromNodeId":"BG0X1kI-gV","fromHandleId":"BG0X1kI-gV-right","toNodeId":"9MOlJXKzv_","toHandleId":"9MOlJXKzv_-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-PTkgGUb07g-PTkgGUb07g-bottom-9MOlJXKzv_-9MOlJXKzv_-top":{"uid":"edge-PTkgGUb07g-PTkgGUb07g-bottom-9MOlJXKzv_-9MOlJXKzv_-top","fromNodeId":"PTkgGUb07g","fromHandleId":"PTkgGUb07g-bottom","toNodeId":"9MOlJXKzv_","toHandleId":"9MOlJXKzv_-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-9MOlJXKzv_-9MOlJXKzv_-bottom-7bRgGfp1ME-7bRgGfp1ME-top":{"uid":"edge-9MOlJXKzv_-9MOlJXKzv_-bottom-7bRgGfp1ME-7bRgGfp1ME-top","fromNodeId":"9MOlJXKzv_","fromHandleId":"9MOlJXKzv_-bottom","toNodeId":"7bRgGfp1ME","toHandleId":"7bRgGfp1ME-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-7bRgGfp1ME-7bRgGfp1ME-bottom-ck4StwGeZa-ck4StwGeZa-top":{"uid":"edge-7bRgGfp1ME-7bRgGfp1ME-bottom-ck4StwGeZa-ck4StwGeZa-top","fromNodeId":"7bRgGfp1ME","fromHandleId":"7bRgGfp1ME-bottom","toNodeId":"ck4StwGeZa","toHandleId":"ck4StwGeZa-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-ck4StwGeZa-ck4StwGeZa-right-UddkKudWPS-UddkKudWPS-left":{"uid":"edge-ck4StwGeZa-ck4StwGeZa-right-UddkKudWPS-UddkKudWPS-left","fromNodeId":"ck4StwGeZa","fromHandleId":"ck4StwGeZa-right","toNodeId":"UddkKudWPS","toHandleId":"UddkKudWPS-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-UddkKudWPS-UddkKudWPS-right-A-dDM_DfZI-A-dDM_DfZI-left":{"uid":"edge-UddkKudWPS-UddkKudWPS-right-A-dDM_DfZI-A-dDM_DfZI-left","fromNodeId":"UddkKudWPS","fromHandleId":"UddkKudWPS-right","toNodeId":"A-dDM_DfZI","toHandleId":"A-dDM_DfZI-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-A-dDM_DfZI-A-dDM_DfZI-bottom-a4nYGlRB_C-a4nYGlRB_C-top":{"uid":"edge-A-dDM_DfZI-A-dDM_DfZI-bottom-a4nYGlRB_C-a4nYGlRB_C-top","fromNodeId":"A-dDM_DfZI","fromHandleId":"A-dDM_DfZI-bottom","toNodeId":"a4nYGlRB_C","toHandleId":"a4nYGlRB_C-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-a4nYGlRB_C-a4nYGlRB_C-left-LaklmZ7Gdn-LaklmZ7Gdn-top":{"uid":"edge-a4nYGlRB_C-a4nYGlRB_C-left-LaklmZ7Gdn-LaklmZ7Gdn-top","fromNodeId":"a4nYGlRB_C","fromHandleId":"a4nYGlRB_C-left","toNodeId":"LaklmZ7Gdn","toHandleId":"LaklmZ7Gdn-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-UsLsFU7pXy-UsLsFU7pXy-bottom-A-dDM_DfZI-A-dDM_DfZI-top":{"uid":"edge-UsLsFU7pXy-UsLsFU7pXy-bottom-A-dDM_DfZI-A-dDM_DfZI-top","fromNodeId":"UsLsFU7pXy","fromHandleId":"UsLsFU7pXy-bottom","toNodeId":"A-dDM_DfZI","toHandleId":"A-dDM_DfZI-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-xaUuYFh5ik-xaUuYFh5ik-bottom-UddkKudWPS-UddkKudWPS-top":{"uid":"edge-xaUuYFh5ik-xaUuYFh5ik-bottom-UddkKudWPS-UddkKudWPS-top","fromNodeId":"xaUuYFh5ik","fromHandleId":"xaUuYFh5ik-bottom","toNodeId":"UddkKudWPS","toHandleId":"UddkKudWPS-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-LaklmZ7Gdn-LaklmZ7Gdn-bottom-pnmGSyis1q-pnmGSyis1q-top":{"uid":"edge-LaklmZ7Gdn-LaklmZ7Gdn-bottom-pnmGSyis1q-pnmGSyis1q-top","fromNodeId":"LaklmZ7Gdn","fromHandleId":"LaklmZ7Gdn-bottom","toNodeId":"pnmGSyis1q","toHandleId":"pnmGSyis1q-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-pnmGSyis1q-pnmGSyis1q-bottom-MHCI-shhBK-MHCI-shhBK-top":{"uid":"edge-pnmGSyis1q-pnmGSyis1q-bottom-MHCI-shhBK-MHCI-shhBK-top","fromNodeId":"pnmGSyis1q","fromHandleId":"pnmGSyis1q-bottom","toNodeId":"MHCI-shhBK","toHandleId":"MHCI-shhBK-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-MHCI-shhBK-MHCI-shhBK-left-1c5kuJVEG2-1c5kuJVEG2-right":{"uid":"edge-MHCI-shhBK-MHCI-shhBK-left-1c5kuJVEG2-1c5kuJVEG2-right","fromNodeId":"MHCI-shhBK","fromHandleId":"MHCI-shhBK-left","toNodeId":"1c5kuJVEG2","toHandleId":"1c5kuJVEG2-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-1c5kuJVEG2-1c5kuJVEG2-left-fWVLgYaf5p-fWVLgYaf5p-right":{"uid":"edge-1c5kuJVEG2-1c5kuJVEG2-left-fWVLgYaf5p-fWVLgYaf5p-right","fromNodeId":"1c5kuJVEG2","fromHandleId":"1c5kuJVEG2-left","toNodeId":"fWVLgYaf5p","toHandleId":"fWVLgYaf5p-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-fWVLgYaf5p-fWVLgYaf5p-left-kmY2s6zDbz-kmY2s6zDbz-right":{"uid":"edge-fWVLgYaf5p-fWVLgYaf5p-left-kmY2s6zDbz-kmY2s6zDbz-right","fromNodeId":"fWVLgYaf5p","fromHandleId":"fWVLgYaf5p-left","toNodeId":"kmY2s6zDbz","toHandleId":"kmY2s6zDbz-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-n0zRy3QgFP-n0zRy3QgFP-bottom-x9EZ3o7Col-x9EZ3o7Col-top":{"uid":"edge-n0zRy3QgFP-n0zRy3QgFP-bottom-x9EZ3o7Col-x9EZ3o7Col-top","fromNodeId":"n0zRy3QgFP","fromHandleId":"n0zRy3QgFP-bottom","toNodeId":"x9EZ3o7Col","toHandleId":"x9EZ3o7Col-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-R_sSU3domx-R_sSU3domx-bottom-qZR6ttUFic-qZR6ttUFic-top":{"uid":"edge-R_sSU3domx-R_sSU3domx-bottom-qZR6ttUFic-qZR6ttUFic-top","fromNodeId":"R_sSU3domx","fromHandleId":"R_sSU3domx-bottom","toNodeId":"qZR6ttUFic","toHandleId":"qZR6ttUFic-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-kmY2s6zDbz-kmY2s6zDbz-right-R_sSU3domx-R_sSU3domx-left":{"uid":"edge-kmY2s6zDbz-kmY2s6zDbz-right-R_sSU3domx-R_sSU3domx-left","fromNodeId":"kmY2s6zDbz","fromHandleId":"kmY2s6zDbz-right","toNodeId":"R_sSU3domx","toHandleId":"R_sSU3domx-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-qZR6ttUFic-qZR6ttUFic-right-9YL0K9qX08-9YL0K9qX08-left":{"uid":"edge-qZR6ttUFic-qZR6ttUFic-right-9YL0K9qX08-9YL0K9qX08-left","fromNodeId":"qZR6ttUFic","fromHandleId":"qZR6ttUFic-right","toNodeId":"9YL0K9qX08","toHandleId":"9YL0K9qX08-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-MaTuF2Y12L-MaTuF2Y12L-top-kmY2s6zDbz-kmY2s6zDbz-bottom":{"uid":"edge-MaTuF2Y12L-MaTuF2Y12L-top-kmY2s6zDbz-kmY2s6zDbz-bottom","fromNodeId":"MaTuF2Y12L","fromHandleId":"MaTuF2Y12L-top","toNodeId":"kmY2s6zDbz","toHandleId":"kmY2s6zDbz-bottom","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-15yb3SoX41-15yb3SoX41-top-fWVLgYaf5p-fWVLgYaf5p-bottom":{"uid":"edge-15yb3SoX41-15yb3SoX41-top-fWVLgYaf5p-fWVLgYaf5p-bottom","fromNodeId":"15yb3SoX41","fromHandleId":"15yb3SoX41-top","toNodeId":"fWVLgYaf5p","toHandleId":"fWVLgYaf5p-bottom","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-PqniHZ2UCW-PqniHZ2UCW-bottom-nhgY0tjdhS-nhgY0tjdhS-left":{"uid":"edge-PqniHZ2UCW-PqniHZ2UCW-bottom-nhgY0tjdhS-nhgY0tjdhS-left","fromNodeId":"PqniHZ2UCW","fromHandleId":"PqniHZ2UCW-bottom","toNodeId":"nhgY0tjdhS","toHandleId":"nhgY0tjdhS-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-DbuW3zS4O_-DbuW3zS4O_-bottom-R_sSU3domx-R_sSU3domx-left":{"uid":"edge-DbuW3zS4O_-DbuW3zS4O_-bottom-R_sSU3domx-R_sSU3domx-left","fromNodeId":"DbuW3zS4O_","fromHandleId":"DbuW3zS4O_-bottom","toNodeId":"R_sSU3domx","toHandleId":"R_sSU3domx-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-pnmGSyis1q-pnmGSyis1q-bottom-MvdnpOZlEi-MvdnpOZlEi-right":{"uid":"edge-pnmGSyis1q-pnmGSyis1q-bottom-MvdnpOZlEi-MvdnpOZlEi-right","fromNodeId":"pnmGSyis1q","fromHandleId":"pnmGSyis1q-bottom","toNodeId":"MvdnpOZlEi","toHandleId":"MvdnpOZlEi-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-VwX7qK2jp4-VwX7qK2jp4-left-x9EZ3o7Col-x9EZ3o7Col-right":{"uid":"edge-VwX7qK2jp4-VwX7qK2jp4-left-x9EZ3o7Col-x9EZ3o7Col-right","fromNodeId":"VwX7qK2jp4","fromHandleId":"VwX7qK2jp4-left","toNodeId":"x9EZ3o7Col","toHandleId":"x9EZ3o7Col-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-FAiQhNrs1B-FAiQhNrs1B-left-VwX7qK2jp4-VwX7qK2jp4-right":{"uid":"edge-FAiQhNrs1B-FAiQhNrs1B-left-VwX7qK2jp4-VwX7qK2jp4-right","fromNodeId":"FAiQhNrs1B","fromHandleId":"FAiQhNrs1B-left","toNodeId":"VwX7qK2jp4","toHandleId":"VwX7qK2jp4-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-MvdnpOZlEi-MvdnpOZlEi-left-FAiQhNrs1B-FAiQhNrs1B-right":{"uid":"edge-MvdnpOZlEi-MvdnpOZlEi-left-FAiQhNrs1B-FAiQhNrs1B-right","fromNodeId":"MvdnpOZlEi","fromHandleId":"MvdnpOZlEi-left","toNodeId":"FAiQhNrs1B","toHandleId":"FAiQhNrs1B-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}}}}}} \ No newline at end of file diff --git a/code_diagrams/pngs/1_ai_model_setup.png b/code_diagrams/pngs/1_ai_model_setup.png new file mode 100644 index 0000000..95aacbd Binary files /dev/null and b/code_diagrams/pngs/1_ai_model_setup.png differ diff --git a/code_diagrams/secret_sauce_flow.codediagram b/code_diagrams/secret_sauce_flow.codediagram new file mode 100644 index 0000000..1300824 --- /dev/null +++ b/code_diagrams/secret_sauce_flow.codediagram @@ -0,0 +1 @@ +{"id":-1,"name":"FROM_FILE","userId":-1,"createdAt":"","updatedAt":"","content":{"items":[{"uid":"GYDy5rTCq1","position":{"x":520,"y":90},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Generate Tweets"}]}]},"nodeType":"block"},{"uid":"RXAZ3XJl2h","position":{"x":30,"y":90},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Tweet Secret Sauce"}]}]},"nodeType":"block"},{"uid":"Qr8DFz08Mu","position":{"x":980,"y":90},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Process Tweets"}]}]},"nodeType":"block"},{"uid":"o6cnZDZcI6","position":{"x":30,"y":240},"sizes":{"width":399.90625,"height":704.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Non Repetitive Tweets using:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt Chains"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"AI Creates Character Sheet"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"AI creates story arcs"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Think of a TV with Seasons and epsidoes."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"AI bulk generates tweets for arcs."}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"One at a time or all at once."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"When an arc is finished. The next arc is created with all the tweets or summary of previous arc."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Vector database for AI Memory Store"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"“Retrieval-Augmented Generation (RAG)”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"This stores tweets and arcs sent and not sent."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"It keeps track of events, characters, arks via metadata."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Allows AI agents to borrow each others memories to better craft tweets."}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Drone pilot and News Channel."}]}]}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Comic Book"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can feed one or all vector databases into a comic book generator."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Comic can focus on one character. Or can make panels from perspective of multiple characters in the story. With the main character being the drone pilot."}]}]}]}]}]},{"type":"paragraph"}]},"nodeType":"block"},{"uid":"nhgY0tjdhS","position":{"x":520,"y":250},"sizes":{"width":399.90625,"height":224.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Create Character idea or Supply oo"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 1:"}]},{"type":"paragraph","content":[{"type":"text","text":"Create the setting for an alien reconnaissance story starring Zorpnax. Describe the planet Xylos, its technology, cultural norms, major characters, and overall mission. Then outline 3–5 story arcs that could span multiple tweets."}]}]},"nodeType":"block"},{"uid":"n0zRy3QgFP","position":{"x":520,"y":530},"sizes":{"width":399.90625,"height":112.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Create Character backstory and universe."}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 2:"}]}]},"nodeType":"block"},{"uid":"x9EZ3o7Col","position":{"x":520,"y":710},"sizes":{"width":399.90625,"height":112.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Create Story Arcs (Seasons and Episodes)"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 3:"}]}]},"nodeType":"block"},{"uid":"kmY2s6zDbz","position":{"x":520,"y":900},"sizes":{"width":399.90625,"height":319.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Bulk Create Tweets for Arc"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 4:"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Arc-Focused Prompt"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"For a given arc, say Arc 1, feed the relevant background from your "},{"type":"text","marks":[{"type":"bold"}],"text":"universe bible"},{"type":"text","text":" + "},{"type":"text","marks":[{"type":"italic"}],"text":"that arc’s specific outline"},{"type":"text","text":" back to the LLM."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Instruct:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Generate 20 tweets that advance the storyline for Arc 1 (Landing on Earth). Each tweet <280 chars. Include references to Zorpnax’s personality, Xylos technology, comedic misunderstandings with humans, etc.”"}]}]}]}]},"nodeType":"block"},{"uid":"R_sSU3domx","position":{"x":980,"y":240},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Review Tweets to make sure no duplicates or repeats"}]}]},"nodeType":"block"},{"uid":"qZR6ttUFic","position":{"x":980,"y":530},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Save Tweets to Json or Yaml"}]}]},"nodeType":"block"},{"uid":"rj9JqBX1iG","position":{"x":520,"y":-100},"sizes":{"width":399.90625,"height":105.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Each Column is a Class, with the boxes as actions/functions"}]}]},"nodeType":"block"},{"uid":"TNxRwgVhDF","position":{"x":1480,"y":90},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]}]},"nodeType":"block"},{"uid":"9YL0K9qX08","position":{"x":1480,"y":240},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]}]},"nodeType":"block"},{"uid":"hYsCF0vDvK","position":{"x":1480,"y":530},"sizes":{"width":399.90625,"height":160.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Metadata and Tagging of Tweets"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Arc"},{"type":"text","text":": “Arc 1”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Characters"},{"type":"text","text":": “Zorpnax, Glaxmar, etc.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Keywords"},{"type":"text","text":": “landing, technology, confusion, comedic”"}]}]}]}]},"nodeType":"block"},{"uid":"BG0X1kI-gV","position":{"x":1480,"y":810},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Save Arc Tweets to Vectore database (AI Memory Store)"}]}]},"nodeType":"block"},{"uid":"PTkgGUb07g","position":{"x":2010,"y":90},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Publish"}]}]},"nodeType":"block"},{"uid":"9MOlJXKzv_","position":{"x":2010,"y":240},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Schedule Tweets to be Posted"}]}]},"nodeType":"block"},{"uid":"7bRgGfp1ME","position":{"x":2010,"y":420},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Post Tweets"}]}]},"nodeType":"block"},{"uid":"ck4StwGeZa","position":{"x":2010,"y":620},"sizes":{"width":399.90625,"height":172.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Store Tweet ID in order to reply to tweets to generate a twitter thread to keep tweets belong to an arc together."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Reference other tweets and threads as needed to provide lore depth and context."}]}]}]}]},"nodeType":"block"},{"uid":"xaUuYFh5ik","position":{"x":2540,"y":90},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Arc Finishes"}]}]},"nodeType":"block"},{"uid":"UddkKudWPS","position":{"x":2540,"y":240},"sizes":{"width":399.90625,"height":147.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Summarize Arc Tweets."},{"type":"hardBreak"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 5:"},{"type":"hardBreak","marks":[{"type":"bold"}]},{"type":"text","text":"Summarize 20 Arc Tweets"}]}]},"nodeType":"block"},{"uid":"UsLsFU7pXy","position":{"x":3060,"y":90},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]}]},"nodeType":"block"},{"uid":"A-dDM_DfZI","position":{"x":3060,"y":240},"sizes":{"width":399.90625,"height":84.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Save Summary Arc to Vector database"}]}]},"nodeType":"block"},{"uid":"a4nYGlRB_C","position":{"x":3060,"y":400},"sizes":{"width":399.90625,"height":181},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Summarization"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"After finishing Arc 1, generate a short summary of those 20 tweets (or the general story development)."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Store that summary or embed it in the vector DB, tagged as "},{"type":"text","marks":[{"type":"code"}],"text":"[arc_1_summary]"}]}]}]}]},"nodeType":"block"},{"uid":"LaklmZ7Gdn","position":{"x":2560,"y":620},"sizes":{"width":399.90625,"height":165.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Add "}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Summary "}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"and/or bundle Tweets "}]}]}]},{"type":"paragraph","content":[{"type":"text","text":"for the next arc to be generated"}]}]},"nodeType":"block"},{"uid":"pnmGSyis1q","position":{"x":2560,"y":910},"sizes":{"width":399.90625,"height":105.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Check if there are any more arcs in the yaml file for the agent. "}]}]},"nodeType":"block"},{"uid":"MHCI-shhBK","position":{"x":2570,"y":1370},"sizes":{"width":399.90625,"height":95},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"YES"}]}]},"nodeType":"block"},{"uid":"MvdnpOZlEi","position":{"x":2300,"y":1160},"sizes":{"width":399.90625,"height":95},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"NO"}]}]},"nodeType":"block"},{"uid":"1c5kuJVEG2","position":{"x":1810,"y":1370},"sizes":{"width":399.90625,"height":109.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Grab the next arc. "}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Include the summary and/or bundle tweets"}]}]}]}]},"nodeType":"block"},{"uid":"fWVLgYaf5p","position":{"x":1270,"y":1370},"sizes":{"width":399.90625,"height":305.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Context Retrieval"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"When generating Arc 2 tweets, retrieve the "},{"type":"text","marks":[{"type":"bold"}],"text":"Arc 1 summary"},{"type":"text","text":" or the relevant tweets from your DB."}]}]}]},{"type":"paragraph"},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 6:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Feed them back into your next LLM prompt:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Here’s a brief summary of what happened in Arc 1. Now create tweets for Arc 2 continuing the story. Maintain the same personality traits and comedic tone.”"}]}]}]}]},"nodeType":"block"},{"uid":"15yb3SoX41","position":{"x":1270,"y":1940},"sizes":{"width":399.90625,"height":632.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Use Past Tweets & Arc Summaries for Next Arcs"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Summarization"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"After finishing Arc 1, generate a short summary of those 20 tweets (or the general story development)."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Store that summary or embed it in the vector DB, tagged as "},{"type":"text","marks":[{"type":"code"}],"text":"[arc_1_summary]"},{"type":"text","text":"."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Context Retrieval"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"When generating Arc 2 tweets, retrieve the "},{"type":"text","marks":[{"type":"bold"}],"text":"Arc 1 summary"},{"type":"text","text":" or the relevant tweets from your DB."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Feed them back into your next LLM prompt:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Here’s a brief summary of what happened in Arc 1. Now create tweets for Arc 2 continuing the story. Maintain the same personality traits and comedic tone.”"}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Chain Prompting"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"This cyclical process—"},{"type":"text","marks":[{"type":"bold"}],"text":"generate"},{"type":"text","text":" → "},{"type":"text","marks":[{"type":"bold"}],"text":"store"},{"type":"text","text":" → "},{"type":"text","marks":[{"type":"bold"}],"text":"retrieve"},{"type":"text","text":" → "},{"type":"text","marks":[{"type":"bold"}],"text":"generate next"},{"type":"text","text":"—is effectively chain prompting."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Because the model sees the relevant context from your DB each time, you get a coherent, non-repetitive storyline."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"PqniHZ2UCW","position":{"x":190,"y":-750},"sizes":{"width":399.90625,"height":551},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Establish the Universe & Story Arcs (High-Level Prompt)"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"High-Level Prompt"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt your LLM with instructions like:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Create the setting for an alien reconnaissance story starring Zorpnax. Describe the planet Xylos, its technology, cultural norms, major characters, and overall mission. Then outline 3–5 story arcs that could span multiple tweets.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"This step yields a "},{"type":"text","marks":[{"type":"bold"}],"text":"universe bible"},{"type":"text","text":" and an "},{"type":"text","marks":[{"type":"bold"}],"text":"arc outline"},{"type":"text","text":" (e.g., Arc 1 = ‘Landing on Earth’, Arc 2 = ‘First Encounter with Humans’, Arc 3 = ‘Alien Technology Dilemmas’, etc.)."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Store the Results"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Save the entire setting (lore, characters, arcs overview) in a file or a database."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"You might also create embeddings for sections of this lore and put them in a vector DB, tagging them as "},{"type":"text","marks":[{"type":"code"}],"text":"[lore]"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"[characters]"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"[arcs_overview]"},{"type":"text","text":", etc."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"MaTuF2Y12L","position":{"x":520,"y":1350},"sizes":{"width":399.90625,"height":605},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Generate a Bulk of Tweets per Arc"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Arc-Focused Prompt"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"For a given arc, say Arc 1, feed the relevant background from your "},{"type":"text","marks":[{"type":"bold"}],"text":"universe bible"},{"type":"text","text":" + "},{"type":"text","marks":[{"type":"italic"}],"text":"that arc’s specific outline"},{"type":"text","text":" back to the LLM."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Instruct:"},{"type":"hardBreak"},{"type":"text","marks":[{"type":"italic"}],"text":"“Generate 20 tweets that advance the storyline for Arc 1 (Landing on Earth). Each tweet <280 chars. Include references to Zorpnax’s personality, Xylos technology, comedic misunderstandings with humans, etc.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Now you have a cohesive "},{"type":"text","marks":[{"type":"bold"}],"text":"batch of tweets"},{"type":"text","text":" dedicated to Arc 1."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Tag and Store in Vector DB"},{"type":"text","text":":"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"For each tweet, store it in your vector DB along with embeddings, and tag it with:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Arc"},{"type":"text","text":": “Arc 1”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Characters"},{"type":"text","text":": “Zorpnax, Glaxmar, etc.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Keywords"},{"type":"text","text":": “landing, technology, confusion, comedic”, etc."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"This tagging makes it easy to "},{"type":"text","marks":[{"type":"bold"}],"text":"retrieve"},{"type":"text","text":" them later if you need reference or continuity checks."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"DbuW3zS4O_","position":{"x":720,"y":-750},"sizes":{"width":399.90625,"height":543},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Ensuring Uniqueness & Non-Repetition"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Embedding Similarity Checks"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"You can embed newly generated tweets and compare them to existing tweets in the DB. If the similarity is too high (e.g. >0.85), you know it’s repeating."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt the model to re-generate or modify any tweets that are near-duplicates."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Memory of Character Traits"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"By consistently retrieving the stored character profiles (Zorpnax’s personality, etc.), the LLM will "},{"type":"text","marks":[{"type":"bold"}],"text":"maintain"},{"type":"text","text":" those traits across arcs."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Global Summaries"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"If your story grows large (1000+ tweets), you can keep “arc-level” or “season-level” summaries instead of feeding "},{"type":"text","marks":[{"type":"italic"}],"text":"all"},{"type":"text","text":" tweets each time. Summaries preserve essential info while staying under context window limits."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"Oo6rzV77sP","position":{"x":-1000,"y":420},"sizes":{"width":399.90625,"height":552},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Advantages of This Approach"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Consistency Over Time"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Because each new generation references previous arcs/characters from the DB, your story remains internally consistent (names, motivations, references)."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Non-Repetitive, Natural Continuation"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Using vector search + embedding similarity ensures you don’t inadvertently re-post near-identical tweets."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Rich, Expanding Universe"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"You can expand arcs, introduce new characters, or revisit old arcs. The DB always has the prior lore to keep you from “losing track” of your own universe."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Chain-of-Thought"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"You can feed partial contexts to the LLM, letting it reason step-by-step to maintain continuity without rehashing everything from scratch."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"oYwKLSfRtO","position":{"x":-540,"y":420},"sizes":{"width":399.90625,"height":428},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"Practical Tips"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Use Summaries"},{"type":"text","text":": For large stories, feed the LLM concise summaries (or the top relevant chunks from the DB) rather than raw text."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Tag Carefully"},{"type":"text","text":": Good tagging ("},{"type":"text","marks":[{"type":"code"}],"text":"arc_id"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"characters_involved"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"location"},{"type":"text","text":", "},{"type":"text","marks":[{"type":"code"}],"text":"plot_points"},{"type":"text","text":") makes retrieving relevant context easier."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Check Similarity"},{"type":"text","text":": Before finalizing each new tweet batch, run a quick similarity check to avoid duplicates."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Plan Arc Overlaps"},{"type":"text","text":": If arcs overlap or re-introduce characters, mention it in the prompt so the LLM merges continuity seamlessly."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Limit Tweet Volume"},{"type":"text","text":": Large arcs can lead to hundreds of tweets. Summaries or chunking helps keep the model’s context within workable limits."}]}]}]}]},"nodeType":"block"},{"uid":"_HXtiY7fHw","position":{"x":-540,"y":150},"sizes":{"width":399.90625,"height":266.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"Final Thoughts"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Yes"},{"type":"text","text":", prompting first for the "},{"type":"text","marks":[{"type":"bold"}],"text":"universe + arcs"},{"type":"text","text":" and then bulk-generating tweets for each arc (while storing them in a vector DB) is an excellent way to get "},{"type":"text","marks":[{"type":"bold"}],"text":"cohesive"},{"type":"text","text":" and "},{"type":"text","marks":[{"type":"bold"}],"text":"non-repetitive"},{"type":"text","text":" storylines. Tagging tweets by arc and characters ensures that you can "},{"type":"text","marks":[{"type":"bold"}],"text":"chain"},{"type":"text","text":" your prompts in future arcs, letting the AI “remember” what’s already happened—and keep the narrative consistent and engaging."}]}]},"nodeType":"block"},{"uid":"wOvb4QTCxK","position":{"x":-1010,"y":150},"sizes":{"width":399.90625,"height":210.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Absolutely—this is a "},{"type":"text","marks":[{"type":"bold"}],"text":"great"},{"type":"text","text":" approach if you want "},{"type":"text","marks":[{"type":"bold"}],"text":"consistent"},{"type":"text","text":" story arcs, world-building, and character continuity over many tweets. The method you’re describing is essentially a "},{"type":"text","marks":[{"type":"bold"}],"text":"multi-stage (or chain) prompting"},{"type":"text","text":" workflow combined with a "},{"type":"text","marks":[{"type":"bold"}],"text":"knowledge base"},{"type":"text","text":" (the vector database) for long-term memory. Below is a suggested process and why it makes sense:"}]}]},"nodeType":"block"},{"uid":"FAiQhNrs1B","position":{"x":1810,"y":1140},"sizes":{"width":399.921875,"height":133.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 7:"}]},{"type":"paragraph","content":[{"type":"text","text":"Summarize all Arc stories into Season."},{"type":"hardBreak"}]}]},"nodeType":"block"},{"uid":"VwX7qK2jp4","position":{"x":1260,"y":1110},"sizes":{"width":399.921875,"height":182.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Prompt 8:"}]},{"type":"paragraph","content":[{"type":"text","text":"Generate a new batch of arcs and stories based on previous arc stories, and season summary."}]},{"type":"paragraph","content":[{"type":"text","text":"As well as the original background to the character and universe."}]}]},"nodeType":"block"},{"uid":"wl3VMoF1v1","position":{"x":-780,"y":-310},"sizes":{"width":399.921875,"height":296.5},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Chain these prompts:"}]},{"type":"orderedList","attrs":{"start":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Start with Prompt 1 to set the character."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt 2 to flesh out the backstory and universe."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt 3 to outline story arcs."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Prompt 4 to generate tweets for each arc."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use Prompt 5 to create arc summaries."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use Prompt 6 to pull context from one arc to another."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use Prompt 7 to wrap up the entire “season.”"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use Prompt 8 to spawn future arcs or a new season."}]}]}]}]},"nodeType":"block"}],"configs":{"centerX":248.61919798832565,"centerY":112.1815131966427,"zoomLevel":0.43333333333333335},"arrowData":{"arrowsMap":{},"pointsMap":{},"edgesMap":{"edge-RXAZ3XJl2h-RXAZ3XJl2h-bottom-o6cnZDZcI6-o6cnZDZcI6-top":{"uid":"edge-RXAZ3XJl2h-RXAZ3XJl2h-bottom-o6cnZDZcI6-o6cnZDZcI6-top","fromNodeId":"RXAZ3XJl2h","fromHandleId":"RXAZ3XJl2h-bottom","toNodeId":"o6cnZDZcI6","toHandleId":"o6cnZDZcI6-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-GYDy5rTCq1-GYDy5rTCq1-bottom-nhgY0tjdhS-nhgY0tjdhS-top":{"uid":"edge-GYDy5rTCq1-GYDy5rTCq1-bottom-nhgY0tjdhS-nhgY0tjdhS-top","fromNodeId":"GYDy5rTCq1","fromHandleId":"GYDy5rTCq1-bottom","toNodeId":"nhgY0tjdhS","toHandleId":"nhgY0tjdhS-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-rj9JqBX1iG-rj9JqBX1iG-bottom-GYDy5rTCq1-GYDy5rTCq1-top":{"uid":"edge-rj9JqBX1iG-rj9JqBX1iG-bottom-GYDy5rTCq1-GYDy5rTCq1-top","fromNodeId":"rj9JqBX1iG","fromHandleId":"rj9JqBX1iG-bottom","toNodeId":"GYDy5rTCq1","toHandleId":"GYDy5rTCq1-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-nhgY0tjdhS-nhgY0tjdhS-bottom-n0zRy3QgFP-n0zRy3QgFP-top":{"uid":"edge-nhgY0tjdhS-nhgY0tjdhS-bottom-n0zRy3QgFP-n0zRy3QgFP-top","fromNodeId":"nhgY0tjdhS","fromHandleId":"nhgY0tjdhS-bottom","toNodeId":"n0zRy3QgFP","toHandleId":"n0zRy3QgFP-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-x9EZ3o7Col-x9EZ3o7Col-bottom-kmY2s6zDbz-kmY2s6zDbz-top":{"uid":"edge-x9EZ3o7Col-x9EZ3o7Col-bottom-kmY2s6zDbz-kmY2s6zDbz-top","fromNodeId":"x9EZ3o7Col","fromHandleId":"x9EZ3o7Col-bottom","toNodeId":"kmY2s6zDbz","toHandleId":"kmY2s6zDbz-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-o6cnZDZcI6-o6cnZDZcI6-right-nhgY0tjdhS-nhgY0tjdhS-left":{"uid":"edge-o6cnZDZcI6-o6cnZDZcI6-right-nhgY0tjdhS-nhgY0tjdhS-left","fromNodeId":"o6cnZDZcI6","fromHandleId":"o6cnZDZcI6-right","toNodeId":"nhgY0tjdhS","toHandleId":"nhgY0tjdhS-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-Qr8DFz08Mu-Qr8DFz08Mu-bottom-R_sSU3domx-R_sSU3domx-top":{"uid":"edge-Qr8DFz08Mu-Qr8DFz08Mu-bottom-R_sSU3domx-R_sSU3domx-top","fromNodeId":"Qr8DFz08Mu","fromHandleId":"Qr8DFz08Mu-bottom","toNodeId":"R_sSU3domx","toHandleId":"R_sSU3domx-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-TNxRwgVhDF-TNxRwgVhDF-bottom-9YL0K9qX08-9YL0K9qX08-top":{"uid":"edge-TNxRwgVhDF-TNxRwgVhDF-bottom-9YL0K9qX08-9YL0K9qX08-top","fromNodeId":"TNxRwgVhDF","fromHandleId":"TNxRwgVhDF-bottom","toNodeId":"9YL0K9qX08","toHandleId":"9YL0K9qX08-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-9YL0K9qX08-9YL0K9qX08-bottom-hYsCF0vDvK-hYsCF0vDvK-top":{"uid":"edge-9YL0K9qX08-9YL0K9qX08-bottom-hYsCF0vDvK-hYsCF0vDvK-top","fromNodeId":"9YL0K9qX08","fromHandleId":"9YL0K9qX08-bottom","toNodeId":"hYsCF0vDvK","toHandleId":"hYsCF0vDvK-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-hYsCF0vDvK-hYsCF0vDvK-bottom-BG0X1kI-gV-BG0X1kI-gV-top":{"uid":"edge-hYsCF0vDvK-hYsCF0vDvK-bottom-BG0X1kI-gV-BG0X1kI-gV-top","fromNodeId":"hYsCF0vDvK","fromHandleId":"hYsCF0vDvK-bottom","toNodeId":"BG0X1kI-gV","toHandleId":"BG0X1kI-gV-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-BG0X1kI-gV-BG0X1kI-gV-right-9MOlJXKzv_-9MOlJXKzv_-left":{"uid":"edge-BG0X1kI-gV-BG0X1kI-gV-right-9MOlJXKzv_-9MOlJXKzv_-left","fromNodeId":"BG0X1kI-gV","fromHandleId":"BG0X1kI-gV-right","toNodeId":"9MOlJXKzv_","toHandleId":"9MOlJXKzv_-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-PTkgGUb07g-PTkgGUb07g-bottom-9MOlJXKzv_-9MOlJXKzv_-top":{"uid":"edge-PTkgGUb07g-PTkgGUb07g-bottom-9MOlJXKzv_-9MOlJXKzv_-top","fromNodeId":"PTkgGUb07g","fromHandleId":"PTkgGUb07g-bottom","toNodeId":"9MOlJXKzv_","toHandleId":"9MOlJXKzv_-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-9MOlJXKzv_-9MOlJXKzv_-bottom-7bRgGfp1ME-7bRgGfp1ME-top":{"uid":"edge-9MOlJXKzv_-9MOlJXKzv_-bottom-7bRgGfp1ME-7bRgGfp1ME-top","fromNodeId":"9MOlJXKzv_","fromHandleId":"9MOlJXKzv_-bottom","toNodeId":"7bRgGfp1ME","toHandleId":"7bRgGfp1ME-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-7bRgGfp1ME-7bRgGfp1ME-bottom-ck4StwGeZa-ck4StwGeZa-top":{"uid":"edge-7bRgGfp1ME-7bRgGfp1ME-bottom-ck4StwGeZa-ck4StwGeZa-top","fromNodeId":"7bRgGfp1ME","fromHandleId":"7bRgGfp1ME-bottom","toNodeId":"ck4StwGeZa","toHandleId":"ck4StwGeZa-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-ck4StwGeZa-ck4StwGeZa-right-UddkKudWPS-UddkKudWPS-left":{"uid":"edge-ck4StwGeZa-ck4StwGeZa-right-UddkKudWPS-UddkKudWPS-left","fromNodeId":"ck4StwGeZa","fromHandleId":"ck4StwGeZa-right","toNodeId":"UddkKudWPS","toHandleId":"UddkKudWPS-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-UddkKudWPS-UddkKudWPS-right-A-dDM_DfZI-A-dDM_DfZI-left":{"uid":"edge-UddkKudWPS-UddkKudWPS-right-A-dDM_DfZI-A-dDM_DfZI-left","fromNodeId":"UddkKudWPS","fromHandleId":"UddkKudWPS-right","toNodeId":"A-dDM_DfZI","toHandleId":"A-dDM_DfZI-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-A-dDM_DfZI-A-dDM_DfZI-bottom-a4nYGlRB_C-a4nYGlRB_C-top":{"uid":"edge-A-dDM_DfZI-A-dDM_DfZI-bottom-a4nYGlRB_C-a4nYGlRB_C-top","fromNodeId":"A-dDM_DfZI","fromHandleId":"A-dDM_DfZI-bottom","toNodeId":"a4nYGlRB_C","toHandleId":"a4nYGlRB_C-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-a4nYGlRB_C-a4nYGlRB_C-left-LaklmZ7Gdn-LaklmZ7Gdn-top":{"uid":"edge-a4nYGlRB_C-a4nYGlRB_C-left-LaklmZ7Gdn-LaklmZ7Gdn-top","fromNodeId":"a4nYGlRB_C","fromHandleId":"a4nYGlRB_C-left","toNodeId":"LaklmZ7Gdn","toHandleId":"LaklmZ7Gdn-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-UsLsFU7pXy-UsLsFU7pXy-bottom-A-dDM_DfZI-A-dDM_DfZI-top":{"uid":"edge-UsLsFU7pXy-UsLsFU7pXy-bottom-A-dDM_DfZI-A-dDM_DfZI-top","fromNodeId":"UsLsFU7pXy","fromHandleId":"UsLsFU7pXy-bottom","toNodeId":"A-dDM_DfZI","toHandleId":"A-dDM_DfZI-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-xaUuYFh5ik-xaUuYFh5ik-bottom-UddkKudWPS-UddkKudWPS-top":{"uid":"edge-xaUuYFh5ik-xaUuYFh5ik-bottom-UddkKudWPS-UddkKudWPS-top","fromNodeId":"xaUuYFh5ik","fromHandleId":"xaUuYFh5ik-bottom","toNodeId":"UddkKudWPS","toHandleId":"UddkKudWPS-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-LaklmZ7Gdn-LaklmZ7Gdn-bottom-pnmGSyis1q-pnmGSyis1q-top":{"uid":"edge-LaklmZ7Gdn-LaklmZ7Gdn-bottom-pnmGSyis1q-pnmGSyis1q-top","fromNodeId":"LaklmZ7Gdn","fromHandleId":"LaklmZ7Gdn-bottom","toNodeId":"pnmGSyis1q","toHandleId":"pnmGSyis1q-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-pnmGSyis1q-pnmGSyis1q-bottom-MHCI-shhBK-MHCI-shhBK-top":{"uid":"edge-pnmGSyis1q-pnmGSyis1q-bottom-MHCI-shhBK-MHCI-shhBK-top","fromNodeId":"pnmGSyis1q","fromHandleId":"pnmGSyis1q-bottom","toNodeId":"MHCI-shhBK","toHandleId":"MHCI-shhBK-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-MHCI-shhBK-MHCI-shhBK-left-1c5kuJVEG2-1c5kuJVEG2-right":{"uid":"edge-MHCI-shhBK-MHCI-shhBK-left-1c5kuJVEG2-1c5kuJVEG2-right","fromNodeId":"MHCI-shhBK","fromHandleId":"MHCI-shhBK-left","toNodeId":"1c5kuJVEG2","toHandleId":"1c5kuJVEG2-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-1c5kuJVEG2-1c5kuJVEG2-left-fWVLgYaf5p-fWVLgYaf5p-right":{"uid":"edge-1c5kuJVEG2-1c5kuJVEG2-left-fWVLgYaf5p-fWVLgYaf5p-right","fromNodeId":"1c5kuJVEG2","fromHandleId":"1c5kuJVEG2-left","toNodeId":"fWVLgYaf5p","toHandleId":"fWVLgYaf5p-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-fWVLgYaf5p-fWVLgYaf5p-left-kmY2s6zDbz-kmY2s6zDbz-right":{"uid":"edge-fWVLgYaf5p-fWVLgYaf5p-left-kmY2s6zDbz-kmY2s6zDbz-right","fromNodeId":"fWVLgYaf5p","fromHandleId":"fWVLgYaf5p-left","toNodeId":"kmY2s6zDbz","toHandleId":"kmY2s6zDbz-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-n0zRy3QgFP-n0zRy3QgFP-bottom-x9EZ3o7Col-x9EZ3o7Col-top":{"uid":"edge-n0zRy3QgFP-n0zRy3QgFP-bottom-x9EZ3o7Col-x9EZ3o7Col-top","fromNodeId":"n0zRy3QgFP","fromHandleId":"n0zRy3QgFP-bottom","toNodeId":"x9EZ3o7Col","toHandleId":"x9EZ3o7Col-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-R_sSU3domx-R_sSU3domx-bottom-qZR6ttUFic-qZR6ttUFic-top":{"uid":"edge-R_sSU3domx-R_sSU3domx-bottom-qZR6ttUFic-qZR6ttUFic-top","fromNodeId":"R_sSU3domx","fromHandleId":"R_sSU3domx-bottom","toNodeId":"qZR6ttUFic","toHandleId":"qZR6ttUFic-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-kmY2s6zDbz-kmY2s6zDbz-right-R_sSU3domx-R_sSU3domx-left":{"uid":"edge-kmY2s6zDbz-kmY2s6zDbz-right-R_sSU3domx-R_sSU3domx-left","fromNodeId":"kmY2s6zDbz","fromHandleId":"kmY2s6zDbz-right","toNodeId":"R_sSU3domx","toHandleId":"R_sSU3domx-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-qZR6ttUFic-qZR6ttUFic-right-9YL0K9qX08-9YL0K9qX08-left":{"uid":"edge-qZR6ttUFic-qZR6ttUFic-right-9YL0K9qX08-9YL0K9qX08-left","fromNodeId":"qZR6ttUFic","fromHandleId":"qZR6ttUFic-right","toNodeId":"9YL0K9qX08","toHandleId":"9YL0K9qX08-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-MaTuF2Y12L-MaTuF2Y12L-top-kmY2s6zDbz-kmY2s6zDbz-bottom":{"uid":"edge-MaTuF2Y12L-MaTuF2Y12L-top-kmY2s6zDbz-kmY2s6zDbz-bottom","fromNodeId":"MaTuF2Y12L","fromHandleId":"MaTuF2Y12L-top","toNodeId":"kmY2s6zDbz","toHandleId":"kmY2s6zDbz-bottom","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-15yb3SoX41-15yb3SoX41-top-fWVLgYaf5p-fWVLgYaf5p-bottom":{"uid":"edge-15yb3SoX41-15yb3SoX41-top-fWVLgYaf5p-fWVLgYaf5p-bottom","fromNodeId":"15yb3SoX41","fromHandleId":"15yb3SoX41-top","toNodeId":"fWVLgYaf5p","toHandleId":"fWVLgYaf5p-bottom","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-PqniHZ2UCW-PqniHZ2UCW-bottom-nhgY0tjdhS-nhgY0tjdhS-left":{"uid":"edge-PqniHZ2UCW-PqniHZ2UCW-bottom-nhgY0tjdhS-nhgY0tjdhS-left","fromNodeId":"PqniHZ2UCW","fromHandleId":"PqniHZ2UCW-bottom","toNodeId":"nhgY0tjdhS","toHandleId":"nhgY0tjdhS-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-DbuW3zS4O_-DbuW3zS4O_-bottom-R_sSU3domx-R_sSU3domx-left":{"uid":"edge-DbuW3zS4O_-DbuW3zS4O_-bottom-R_sSU3domx-R_sSU3domx-left","fromNodeId":"DbuW3zS4O_","fromHandleId":"DbuW3zS4O_-bottom","toNodeId":"R_sSU3domx","toHandleId":"R_sSU3domx-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-pnmGSyis1q-pnmGSyis1q-bottom-MvdnpOZlEi-MvdnpOZlEi-right":{"uid":"edge-pnmGSyis1q-pnmGSyis1q-bottom-MvdnpOZlEi-MvdnpOZlEi-right","fromNodeId":"pnmGSyis1q","fromHandleId":"pnmGSyis1q-bottom","toNodeId":"MvdnpOZlEi","toHandleId":"MvdnpOZlEi-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-VwX7qK2jp4-VwX7qK2jp4-left-x9EZ3o7Col-x9EZ3o7Col-right":{"uid":"edge-VwX7qK2jp4-VwX7qK2jp4-left-x9EZ3o7Col-x9EZ3o7Col-right","fromNodeId":"VwX7qK2jp4","fromHandleId":"VwX7qK2jp4-left","toNodeId":"x9EZ3o7Col","toHandleId":"x9EZ3o7Col-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-FAiQhNrs1B-FAiQhNrs1B-left-VwX7qK2jp4-VwX7qK2jp4-right":{"uid":"edge-FAiQhNrs1B-FAiQhNrs1B-left-VwX7qK2jp4-VwX7qK2jp4-right","fromNodeId":"FAiQhNrs1B","fromHandleId":"FAiQhNrs1B-left","toNodeId":"VwX7qK2jp4","toHandleId":"VwX7qK2jp4-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-MvdnpOZlEi-MvdnpOZlEi-left-FAiQhNrs1B-FAiQhNrs1B-right":{"uid":"edge-MvdnpOZlEi-MvdnpOZlEi-left-FAiQhNrs1B-FAiQhNrs1B-right","fromNodeId":"MvdnpOZlEi","fromHandleId":"MvdnpOZlEi-left","toNodeId":"FAiQhNrs1B","toHandleId":"FAiQhNrs1B-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}}}}}} \ No newline at end of file diff --git a/code_diagrams/tutorial_diagrams/1_ai_model_setup.codediagram b/code_diagrams/tutorial_diagrams/1_ai_model_setup.codediagram new file mode 100644 index 0000000..5eeafdf --- /dev/null +++ b/code_diagrams/tutorial_diagrams/1_ai_model_setup.codediagram @@ -0,0 +1 @@ +{"id":-1,"name":"Onboarding diagram","userId":-1,"createdAt":"","updatedAt":"","content":{"items":[{"uid":"BVH2G9gxwl","position":{"x":-490,"y":740},"sizes":{"width":399.765625,"height":188.8125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"main.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"# Instantiate your AI model\r\nai_model = GeminiModel()\r\n"}]}]},"nodeType":"block"},{"uid":"YNbOjafkh4","position":{"x":120,"y":280},"sizes":{"width":509.765625,"height":171.3125},"autoheight":true,"blockContent":{"content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":".env"}]},{"type":"codeBlock","attrs":{"language":"env","wrapCode":true},"content":[{"type":"text","text":"# Google Gemini API Key - Read and write API resources\r\nGOOGLE_GEMINI_API_KEY="}]}]},"nodeType":"block"},{"uid":"jRY1ZQZUGR","position":{"x":70,"y":530},"sizes":{"width":609.953125,"height":489.796875},"autoheight":false,"blockContent":{"type":"doc","content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"models\\gemini_model.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"import google.generativeai as genai # import the gemini model\nfrom dotenv import load_dotenv # import the dotenv library\n \nload_dotenv() # load the environment variables from the .env file\r\n\r\nclass GeminiModel:\r\n '''\r\n Gemini model implementation.\r\n '''\r\n\r\n def __init__(self, api_key=None, model_name=\"gemini-pro\"):\r\n '''\r\n Initialize the Gemini model.\r\n '''\n\r\n if api_key:\r\n genai.configure(api_key=api_key)\r\n else:\r\n genai.configure(api_key=os.environ.get('GOOGLE_GEMINI_API_KEY'))\n self.model = genai.GenerativeModel(model_name)"}]}]},"nodeType":"block"},{"uid":"-Z5MInqll-","position":{"x":-490,"y":530},"sizes":{"width":399.734375,"height":104.8125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"This is a diagram that shows you how to setup an ai model for prompting."}]}]},"nodeType":"block"},{"uid":"RbPx6SIt7X","position":{"x":1530,"y":280},"sizes":{"width":809.796875,"height":718.703125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Main Gemini Models (Available through Google AI Studio or Vertex AI):"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemini 1.5 Pro:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"The most advanced and widely useful model, striking a good balance of capabilities and performance."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Excels at a wide range of tasks including complex reasoning, translation, code generation, and multi-modal tasks."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Has a much larger context window than the 1.0 Ultra."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can handle up to 1 million tokens in its context window."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can process information from various modalities, such as text, images, audio, and video."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemini 1.0 Ultra:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"The largest and most capable Gemini model."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Designed for highly complex tasks, including reasoning, following instructions, coding, and collaboration."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Excels in areas like math, physics, and commonsense reasoning."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Generally recommended for specialized or very demanding tasks where you need the highest level of performance."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"(Still available, but often 1.5 pro is a better option)"}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemini 1.0 Pro:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"A more efficient model compared to Ultra."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Suitable for a wide variety of tasks."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Offers a good balance of performance and cost-effectiveness."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Often the recommended starting point for general use cases."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"(Still available, but often 1.5 pro is a better option)"}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemini 1.5 Flash:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"A very fast and efficient model, suitable for high-volume tasks where speed is critical."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Has a smaller context window than Pro models."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can handle up to 1 million tokens in its context window."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Can process information from various modalities, such as text, images, audio, and video."}]}]}]}]}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Other Gemini Models or Variants:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Gemma:"},{"type":"text","text":" Open models built from the same research and technology used to create the Gemini models."}]}]}]}]},"nodeType":"block"},{"uid":"JiXmN8atG2","position":{"x":840,"y":470},"sizes":{"width":550,"height":462.75},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Google AI Studio ("},{"type":"text","marks":[{"type":"code"}],"text":"google-generativeai"},{"type":"text","text":")"}]},{"type":"paragraph","content":[{"type":"text","text":"1. "},{"type":"text","marks":[{"type":"bold"}],"text":"Import:"},{"type":"text","text":" Import the "},{"type":"text","marks":[{"type":"code"}],"text":"google.generativeai"},{"type":"text","text":" library. "}]},{"type":"paragraph","content":[{"type":"text","text":"2. "},{"type":"text","marks":[{"type":"bold"}],"text":"Configure API Key:"},{"type":"text","text":" Set your API key using "},{"type":"text","marks":[{"type":"code"}],"text":"genai.configure()"},{"type":"text","text":". "}]},{"type":"paragraph","content":[{"type":"text","text":"3. "},{"type":"text","marks":[{"type":"bold"}],"text":"List Models (Optional):"},{"type":"text","text":" The "},{"type":"text","marks":[{"type":"code"}],"text":"genai.list_models()"},{"type":"text","text":" function lets you see which models are available to your API key. The code filters the list to show only models that support the "},{"type":"text","marks":[{"type":"code"}],"text":"generateContent"},{"type":"text","text":" method. "}]},{"type":"paragraph","content":[{"type":"text","text":"4. "},{"type":"text","marks":[{"type":"bold"}],"text":"Select Model:"},{"type":"text","text":" Create a "},{"type":"text","marks":[{"type":"code"}],"text":"GenerativeModel"},{"type":"text","text":" instance, specifying the model name: "},{"type":"text","marks":[{"type":"italic"}],"text":" "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"italic"}],"text":"`'models/gemini-1.5-pro-latest'` "},{"type":"text","text":" "}]},{"type":"paragraph","content":[{"type":"text","text":"`'models/gemini-pro'` "},{"type":"text","marks":[{"type":"italic"}],"text":" "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"italic"}],"text":"`'models/gemini-1.5-flash-latest'` "},{"type":"text","text":" "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"code"}],"text":"'models/gemini-pro-vision'"},{"type":"text","text":" (for multi-modal input) "},{"type":"text","marks":[{"type":"italic"}],"text":" "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"code"}],"text":"'models/embedding-001'"},{"type":"text","marks":[{"type":"italic"}],"text":" (for text embedding) "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"italic"}],"text":"5. "},{"type":"text","text":"*Generate Content:** Use the "},{"type":"text","marks":[{"type":"code"}],"text":"generate_content()"},{"type":"text","text":" method to send a prompt and get a response."}]}]},"nodeType":"block"},{"uid":"q0nfZMIznq","position":{"x":840,"y":1020},"sizes":{"width":550,"height":366.765625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Vertex AI ("},{"type":"text","marks":[{"type":"code"}],"text":"google-cloud-aiplatform"},{"type":"text","text":")"}]},{"type":"paragraph","content":[{"type":"text","text":"1. "},{"type":"text","marks":[{"type":"bold"}],"text":"Import:"},{"type":"text","text":" Import the "},{"type":"text","marks":[{"type":"code"}],"text":"aiplatform"},{"type":"text","text":" module from "},{"type":"text","marks":[{"type":"code"}],"text":"google.cloud"},{"type":"text","text":". "}]},{"type":"paragraph","content":[{"type":"text","text":"2. "},{"type":"text","marks":[{"type":"bold"}],"text":"Initialize:"},{"type":"text","text":" Call "},{"type":"text","marks":[{"type":"code"}],"text":"aiplatform.init()"},{"type":"text","text":", providing your Google Cloud project ID and the region where you want to use Vertex AI. "}]},{"type":"paragraph","content":[{"type":"text","text":"3. "},{"type":"text","marks":[{"type":"bold"}],"text":"Select Model:"},{"type":"text","text":" "},{"type":"text","marks":[{"type":"italic"}],"text":" Create a "},{"type":"text","marks":[{"type":"code"}],"text":"GenerativeModel"},{"type":"text","marks":[{"type":"italic"}],"text":" instance, specifying the model using its resource name: "},{"type":"text","text":" "}]},{"type":"paragraph","content":[{"type":"text","text":"`\"publishers/google/models/gemini-1.5-pro-latest\"` "},{"type":"text","marks":[{"type":"italic"}],"text":" `\"publishers/google/models/gemini-pro\"` "},{"type":"text","text":" "}]},{"type":"paragraph","content":[{"type":"text","text":"`\"publishers/google/models/gemini-1.5-flash-latest\"` "},{"type":"text","marks":[{"type":"italic"}],"text":" "},{"type":"text","marks":[{"type":"code"}],"text":"\"publishers/google/models/gemini-pro-vision\""},{"type":"text","marks":[{"type":"italic"}],"text":" (for multi-modal input) "}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"italic"}],"text":"4. "},{"type":"text","text":"*Generate Content:** Use the "},{"type":"text","marks":[{"type":"code"}],"text":"generate_content()"},{"type":"text","text":" method to send a prompt and get a response."}]}]},"nodeType":"block"},{"uid":"GB6t3ipoJQ","position":{"x":170,"y":20},"sizes":{"width":399.84375,"height":188.8125},"autoheight":true,"blockContent":{"content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":".gitignore"}]},{"type":"codeBlock","attrs":{"language":"gitignore","wrapCode":true},"content":[{"type":"text","text":"# API Keys\r\n.env\r\ndont_share/"}]}]},"nodeType":"block"},{"uid":"m_9bpoosTx","position":{"x":800,"y":-30},"sizes":{"width":629.953125,"height":437.296875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Pro Tip."}]},{"type":"paragraph","content":[{"type":"text","text":"You can initialize a Gemini AI connection with your API Key, and then change the model type based on your needs. So you are not stuck to the one model. Be creative and swap to models best suited for different tasks."}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"# Model is set latest\nself.model = genai.GenerativeModel('gemini-1.5-pro-latest')\nresponse = model.generate_content(\"Advanced mathematics problem.\")\n\n# Need a cheaper model or one a model that has different capabilites better suited for the task\nself.model = genai.GenerativeModel('gemini-pro-vision')\nresponse = model.generate_content(\"What is this a picture of.\")\n\n# Switch back to the original model\nself.model = genai.GenerativeModel('gemini-1.5-pro-latest')\nresponse = model.generate_content(\"Need a more creative and detailed response.\")\n"}]}]},"nodeType":"block"}],"configs":{"centerX":415.77115280647536,"centerY":19.553587890839225,"zoomLevel":0.19259258891329367},"arrowData":{"arrowsMap":{"arrow-point-bI0wBh3Ufk-bottom-point-PSPLIYKa9J-top":{"to":"point-PSPLIYKa9J-top","from":"point-bI0wBh3Ufk-bottom","label":"Normal Box","direction":"ft","selectable":true},"arrow-point-bI0wBh3Ufk-bottom-point-ytXK_ayIc1-top":{"to":"point-ytXK_ayIc1-top","from":"point-bI0wBh3Ufk-bottom","label":"Code Box","direction":"ft","selectable":true},"arrow-point-hyyRZE3E8u-right-point-6ZopTaEaDZ-left":{"to":"point-6ZopTaEaDZ-left","from":"point-hyyRZE3E8u-right","label":"call","direction":"ft","selectable":true}},"pointsMap":{"point-PSPLIYKa9J-top":{"x":805.9999797489683,"y":60,"id":"point-PSPLIYKa9J-top","direction":"top"},"point-ytXK_ayIc1-top":{"x":205.99999493724206,"y":60,"id":"point-ytXK_ayIc1-top","direction":"top"},"point-6ZopTaEaDZ-left":{"x":220,"y":605.9999898744841,"id":"point-6ZopTaEaDZ-left","direction":"left"},"point-hyyRZE3E8u-right":{"x":100,"y":606,"id":"point-hyyRZE3E8u-right","direction":"right"},"point-bI0wBh3Ufk-bottom":{"x":515.9999797489683,"y":-40,"id":"point-bI0wBh3Ufk-bottom","direction":"bottom"}},"edgesMap":{"edge-BVH2G9gxwl-BVH2G9gxwl-right-jRY1ZQZUGR-jRY1ZQZUGR-left":{"uid":"edge-BVH2G9gxwl-BVH2G9gxwl-right-jRY1ZQZUGR-jRY1ZQZUGR-left","fromNodeId":"BVH2G9gxwl","fromHandleId":"BVH2G9gxwl-right","toNodeId":"jRY1ZQZUGR","toHandleId":"jRY1ZQZUGR-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-YNbOjafkh4-YNbOjafkh4-bottom-jRY1ZQZUGR-jRY1ZQZUGR-top":{"uid":"edge-YNbOjafkh4-YNbOjafkh4-bottom-jRY1ZQZUGR-jRY1ZQZUGR-top","fromNodeId":"YNbOjafkh4","fromHandleId":"YNbOjafkh4-bottom","toNodeId":"jRY1ZQZUGR","toHandleId":"jRY1ZQZUGR-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-JiXmN8atG2-JiXmN8atG2-left-jRY1ZQZUGR-jRY1ZQZUGR-right":{"uid":"edge-JiXmN8atG2-JiXmN8atG2-left-jRY1ZQZUGR-jRY1ZQZUGR-right","fromNodeId":"JiXmN8atG2","fromHandleId":"JiXmN8atG2-left","toNodeId":"jRY1ZQZUGR","toHandleId":"jRY1ZQZUGR-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-RbPx6SIt7X-RbPx6SIt7X-left-JiXmN8atG2-JiXmN8atG2-right":{"uid":"edge-RbPx6SIt7X-RbPx6SIt7X-left-JiXmN8atG2-JiXmN8atG2-right","fromNodeId":"RbPx6SIt7X","fromHandleId":"RbPx6SIt7X-left","toNodeId":"JiXmN8atG2","toHandleId":"JiXmN8atG2-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-q0nfZMIznq-q0nfZMIznq-left-jRY1ZQZUGR-jRY1ZQZUGR-right":{"uid":"edge-q0nfZMIznq-q0nfZMIznq-left-jRY1ZQZUGR-jRY1ZQZUGR-right","fromNodeId":"q0nfZMIznq","fromHandleId":"q0nfZMIznq-left","toNodeId":"jRY1ZQZUGR","toHandleId":"jRY1ZQZUGR-right","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge--Z5MInqll---Z5MInqll--bottom-BVH2G9gxwl-BVH2G9gxwl-top":{"uid":"edge--Z5MInqll---Z5MInqll--bottom-BVH2G9gxwl-BVH2G9gxwl-top","fromNodeId":"-Z5MInqll-","fromHandleId":"-Z5MInqll--bottom","toNodeId":"BVH2G9gxwl","toHandleId":"BVH2G9gxwl-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-GB6t3ipoJQ-GB6t3ipoJQ-bottom-YNbOjafkh4-YNbOjafkh4-top":{"uid":"edge-GB6t3ipoJQ-GB6t3ipoJQ-bottom-YNbOjafkh4-YNbOjafkh4-top","fromNodeId":"GB6t3ipoJQ","fromHandleId":"GB6t3ipoJQ-bottom","toNodeId":"YNbOjafkh4","toHandleId":"YNbOjafkh4-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-m_9bpoosTx-m_9bpoosTx-bottom-JiXmN8atG2-JiXmN8atG2-top":{"uid":"edge-m_9bpoosTx-m_9bpoosTx-bottom-JiXmN8atG2-JiXmN8atG2-top","fromNodeId":"m_9bpoosTx","fromHandleId":"m_9bpoosTx-bottom","toNodeId":"JiXmN8atG2","toHandleId":"JiXmN8atG2-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}}}}}} \ No newline at end of file diff --git a/code_diagrams/tutorial_diagrams/2_ai_model_response.codediagram b/code_diagrams/tutorial_diagrams/2_ai_model_response.codediagram new file mode 100644 index 0000000..8fc905b --- /dev/null +++ b/code_diagrams/tutorial_diagrams/2_ai_model_response.codediagram @@ -0,0 +1 @@ +{"id":-1,"name":"Onboarding diagram","userId":-1,"createdAt":"","updatedAt":"","content":{"items":[{"uid":"tXz3sfRHmC","position":{"x":-620,"y":180},"sizes":{"width":469.6875,"height":482.25},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"ARAI Agent Basic"}]},{"type":"paragraph","content":[{"type":"text","text":"Simple way of sending a prompt and receiving a response from ai."}]},{"type":"paragraph"},{"type":"paragraph","content":[{"type":"text","text":"We use messages as a dictionary as it creates the habit of allowing for more complex prompts in the future."}]},{"type":"paragraph"},{"type":"paragraph","content":[{"type":"text","text":"This will come in handy for:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Personality, Style or Persona."}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Tells the AI what type of expert it is so it can draft a more accurate response."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"History [ ] "}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"for prompts and responses for ai to have context. "}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Memories []"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"for vector db on most recent memories, and most relevant"}]}]}]}]}]},{"type":"paragraph"}]},"nodeType":"block"},{"uid":"zT1dxIBB8b","position":{"x":570,"y":570},"sizes":{"width":679.921875,"height":801.3125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"models\\gemini_model.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":" def generate_response_from_string(self, prompt, **kwargs):\n # Extract personality and style from kwargs, or use defaults from agent_template\n if kwargs:\n if \"personality\" in kwargs:\n personality = kwargs.get(\"personality\")\n if \"communication_style\" in kwargs:\n communication_style = kwargs.get(\"communication_style\")\n else:\n personality = \"\"\n communication_style = \"\" \n\n try:\n # instructions being sent to the ai model\n messages = []\n\n # add personality and style to the instructions\n if personality or communication_style:\n persona_prompt = f\"{personality} {communication_style}\"\n messages.append({\n \"role\": \"user\",\n \"parts\": [persona_prompt]\n })\n\n # user message\n messages.append({\n \"role\": \"user\",\n \"parts\": [prompt]\n })\n\n # Make sure that what is being sent to the model is correct\n # print(messages)\n\n # generate the response\n response = self.model.generate_content(messages)\n return response.text.strip()\n\n except Exception as e:\n return f\"Error generating response: {str(e)}\""}]}]},"nodeType":"block"},{"uid":"vg7Z0EZd1u","position":{"x":-640,"y":720},"sizes":{"width":509.6875,"height":293.8125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"models\\gemini_model.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"messages = []\n\nmessages.append({\n \"role\": \"user\",\r\n \"parts\": \"what is the capital of france\"\n})\n\nresponse = self.model.generate_content(messages)\nprint(response)"}]}]},"nodeType":"block"},{"uid":"CYddWFZB2g","position":{"x":-30,"y":800},"sizes":{"width":479.6875,"height":213.296875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Intermediate."}]},{"type":"paragraph","content":[{"type":"text","text":"This example shows sending the persona the ai takes on in order for a better response to our prompt."}]},{"type":"paragraph","content":[{"type":"text","text":"Right now we are checking for personality and communication_style, but we could also iterate over the kwarg and add each parameter detected to the prompt."}]}]},"nodeType":"block"},{"uid":"c91Ur0p-AI","position":{"x":-670,"y":1380},"sizes":{"width":589.921875,"height":626.296875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]},{"type":"filePathNode","attrs":{"pathToFile":"","version":1}},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":" def fix_response(self, prompt):\n try:\n # instructions being sent to the ai model\n messages = []\n\n # add personality and style to the instructions \n messages.append({\n \"role\": \"user\",\n \"parts\": [prompt]\n })\n\n # user message\n messages.append({\n \"role\": \"user\",\n \"parts\": [response]\n })\n\n # Make sure that what is being sent to the model is correct\n # print(messages)\n\n # generate the response\n response = self.model.generate_content(messages)\n return response.text.strip()\n\n except Exception as e:\n return f\"Error generating response: {str(e)}\""}]}]},"nodeType":"block"},{"uid":"0nFxh-9nUb","position":{"x":-1260,"y":410},"sizes":{"width":499.78125,"height":314.8125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"import google.generativeai as genai\n\ngenai.configure(api_key=\"YOUR_API_KEY\")\nmodel = genai.GenerativeModel(\"gemini-pro\")\n\nprompt = \"What is the capital of France?\"\n\nresponse = model.generate_content(prompt)\n\nprint(response.text)"}]}]},"nodeType":"block"},{"uid":"RFyphDOklg","position":{"x":-1230,"y":220},"sizes":{"width":469.78125,"height":122.3125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Basic"}]},{"type":"paragraph","content":[{"type":"text","text":"Simple way of sending a prompt and receiving a response from ai."}]}]},"nodeType":"block"},{"uid":"8x6mKpEQV1","position":{"x":-580,"y":1090},"sizes":{"width":399.78125,"height":230.78125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"I like to put my responses in a try and exception block."}]},{"type":"paragraph","content":[{"type":"text","text":"This allows for situations if your internet is down, or an issue with the ai model for whatever reason there maybe."}]},{"type":"paragraph","content":[{"type":"text","text":"It allows your program to keep running."}]},{"type":"paragraph","content":[{"type":"text","text":"You can even do a sleep for x seconds and try again, or have other functions that print off network status, or wait for user input before continuining. "}]}]},"nodeType":"block"}],"configs":{"centerX":86.56464462548138,"centerY":-679.1082958542006,"zoomLevel":0.655555533479762},"arrowData":{"arrowsMap":{"arrow-point-bI0wBh3Ufk-bottom-point-PSPLIYKa9J-top":{"to":"point-PSPLIYKa9J-top","from":"point-bI0wBh3Ufk-bottom","label":"Normal Box","direction":"ft","selectable":true},"arrow-point-bI0wBh3Ufk-bottom-point-ytXK_ayIc1-top":{"to":"point-ytXK_ayIc1-top","from":"point-bI0wBh3Ufk-bottom","label":"Code Box","direction":"ft","selectable":true},"arrow-point-hyyRZE3E8u-right-point-6ZopTaEaDZ-left":{"to":"point-6ZopTaEaDZ-left","from":"point-hyyRZE3E8u-right","label":"call","direction":"ft","selectable":true}},"pointsMap":{"point-PSPLIYKa9J-top":{"x":805.9999797489683,"y":60,"id":"point-PSPLIYKa9J-top","direction":"top"},"point-ytXK_ayIc1-top":{"x":205.99999493724206,"y":60,"id":"point-ytXK_ayIc1-top","direction":"top"},"point-6ZopTaEaDZ-left":{"x":220,"y":605.9999898744841,"id":"point-6ZopTaEaDZ-left","direction":"left"},"point-hyyRZE3E8u-right":{"x":100,"y":606,"id":"point-hyyRZE3E8u-right","direction":"right"},"point-bI0wBh3Ufk-bottom":{"x":515.9999797489683,"y":-40,"id":"point-bI0wBh3Ufk-bottom","direction":"bottom"}},"edgesMap":{"edge-RFyphDOklg-RFyphDOklg-bottom-0nFxh-9nUb-0nFxh-9nUb-top":{"uid":"edge-RFyphDOklg-RFyphDOklg-bottom-0nFxh-9nUb-0nFxh-9nUb-top","fromNodeId":"RFyphDOklg","fromHandleId":"RFyphDOklg-bottom","toNodeId":"0nFxh-9nUb","toHandleId":"0nFxh-9nUb-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-tXz3sfRHmC-tXz3sfRHmC-bottom-vg7Z0EZd1u-vg7Z0EZd1u-top":{"uid":"edge-tXz3sfRHmC-tXz3sfRHmC-bottom-vg7Z0EZd1u-vg7Z0EZd1u-top","fromNodeId":"tXz3sfRHmC","fromHandleId":"tXz3sfRHmC-bottom","toNodeId":"vg7Z0EZd1u","toHandleId":"vg7Z0EZd1u-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-vg7Z0EZd1u-vg7Z0EZd1u-bottom-8x6mKpEQV1-8x6mKpEQV1-top":{"uid":"edge-vg7Z0EZd1u-vg7Z0EZd1u-bottom-8x6mKpEQV1-8x6mKpEQV1-top","fromNodeId":"vg7Z0EZd1u","fromHandleId":"vg7Z0EZd1u-bottom","toNodeId":"8x6mKpEQV1","toHandleId":"8x6mKpEQV1-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-8x6mKpEQV1-8x6mKpEQV1-bottom-c91Ur0p-AI-c91Ur0p-AI-top":{"uid":"edge-8x6mKpEQV1-8x6mKpEQV1-bottom-c91Ur0p-AI-c91Ur0p-AI-top","fromNodeId":"8x6mKpEQV1","fromHandleId":"8x6mKpEQV1-bottom","toNodeId":"c91Ur0p-AI","toHandleId":"c91Ur0p-AI-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-vg7Z0EZd1u-vg7Z0EZd1u-right-CYddWFZB2g-CYddWFZB2g-left":{"uid":"edge-vg7Z0EZd1u-vg7Z0EZd1u-right-CYddWFZB2g-CYddWFZB2g-left","fromNodeId":"vg7Z0EZd1u","fromHandleId":"vg7Z0EZd1u-right","toNodeId":"CYddWFZB2g","toHandleId":"CYddWFZB2g-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-CYddWFZB2g-CYddWFZB2g-right-zT1dxIBB8b-zT1dxIBB8b-left":{"uid":"edge-CYddWFZB2g-CYddWFZB2g-right-zT1dxIBB8b-zT1dxIBB8b-left","fromNodeId":"CYddWFZB2g","fromHandleId":"CYddWFZB2g-right","toNodeId":"zT1dxIBB8b","toHandleId":"zT1dxIBB8b-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}}}}}} \ No newline at end of file diff --git a/code_diagrams/tutorial_diagrams/3_agent_character_sheet.codediagram b/code_diagrams/tutorial_diagrams/3_agent_character_sheet.codediagram new file mode 100644 index 0000000..3823602 --- /dev/null +++ b/code_diagrams/tutorial_diagrams/3_agent_character_sheet.codediagram @@ -0,0 +1 @@ +{"id":-1,"name":"Onboarding diagram","userId":-1,"createdAt":"","updatedAt":"","content":{"items":[{"uid":"lW0CrByFpI","position":{"x":-680,"y":800},"sizes":{"width":399.75,"height":223.921875},"autoheight":true,"blockContent":{"content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"main.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"# Instantiate your AI model\r\nai_model = GeminiModel()\r\n\n# call step 1\r\nnext_step.step_1(ai_model, debug=False)"}]}]},"nodeType":"block"},{"uid":"RuCwNpe8rs","position":{"x":-680,"y":630},"sizes":{"width":399.75,"height":104.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"We setup our AI Model, and create our Agent Character Sheet that will help the AI make the Twitter posts."}]}]},"color":{"bgColor":"#2b313a","bgName":"black"},"nodeType":"block"},{"uid":"24FHjKbcb4","position":{"x":-100,"y":820},"sizes":{"width":399.75,"height":171.4375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"step_1.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"def step_1(ai_model, debug=False):\r\n"}]}]},"nodeType":"block"},{"uid":"aPeP7UA4jx","position":{"x":-100,"y":620},"sizes":{"width":399.75,"height":153.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"We have a debug feature that can be turned on and off to help people track down what is going wrong."}]},{"type":"paragraph","content":[{"type":"text","text":"This could also be a separate tests file that is run rather than cluttering up the code here."}]}]},"nodeType":"block"},{"uid":"errABHj0Ma","position":{"x":-130,"y":1260},"sizes":{"width":479.75,"height":381.390625},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"step_1.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"# prompt 1 Character Creation:\r\n# step 1.1: Generate a new agent name, topic, personality, and communication style with the prompt_1 template\r\nprompt_1_vars = {\r\n # \"agent_name\": \"\",\r\n # \"personality\": \"\",\r\n # \"communication_style\": \"\",\r\n # \"topic\": \"\",\n \"concept\": \"alien drone pilot who is a sarcastic asshole visiting earth to report back his findings to his home planet\",\n \"agent_yaml\": yaml.dump(agent)\r\n}\r\n"}]}]},"nodeType":"block"},{"uid":"cgbqTXNQi1","position":{"x":-110,"y":1720},"sizes":{"width":439.78125,"height":146.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"The following is the prompt that has been changed countless times to ensure the AI is returning a yaml file consistently that is valid, as well as the contents of the yaml file that is our secret sauce to the Agent and what it will use to make posts."}]}]},"nodeType":"block"},{"uid":"flbOA-v9zK","position":{"x":-1070,"y":1250},"sizes":{"width":399.765625,"height":416.390625},"autoheight":true,"blockContent":{"content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"templates\\agent_template.yaml"}]},{"type":"codeBlock","attrs":{"language":"yaml","wrapCode":true},"content":[{"type":"text","text":"name:\r\npersonality:\r\ncommunication_style:\r\nbackstory:\r\nuniverse:\r\ntopic_expertise:\r\nhashtags: []\r\nemojis: []\r\nmodel_type: \"gemini\"\r\nmodel_name: \"gemini-exp-1206\"\r\nmemory_store: \"gemini_chroma\"\r\nconnectors:\r\n twitter: true\r\n telegram: false\r\n discord: false\r\n"}]}]},"nodeType":"block"},{"uid":"bk2x5x3hCZ","position":{"x":-90,"y":1060},"sizes":{"width":399.765625,"height":153.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"We can provide any number of details for our agent we want made. "}]},{"type":"paragraph","content":[{"type":"text","text":"It is best to provide a concept, otherwise its just a random concept the AI decides."}]}]},"color":{"bgColor":"#2b313a","bgName":"black"},"nodeType":"block"},{"uid":"GTc84OB9HI","position":{"x":-820,"y":2320},"sizes":{"width":399.765625,"height":223.921875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"This is the prompt that will generate the Character Sheet for our Agent in a yaml format. "}]},{"type":"paragraph","content":[{"type":"text","text":"Not the placeholders using double {{ Variable_Name }}"}]},{"type":"paragraph","content":[{"type":"text","text":"As is how we can swap out values in our yaml file for anything we want without having to retype a custom prompt for every character, while still allowing the prompt to be flexible and not generic."}]}]},"nodeType":"block"},{"uid":"LkysyEPIGx","position":{"x":-600,"y":1400},"sizes":{"width":399.78125,"height":104.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"This is the ai template we want the ai to fill out and return to us."}]}]},"color":{"bgColor":"#2b313a","bgName":"black"},"nodeType":"block"},{"uid":"40nWX7qZ7r","position":{"x":-90,"y":1950},"sizes":{"width":399.78125,"height":293.90625},"autoheight":true,"blockContent":{"content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"step_1.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"# step 1.2: Run the prompt\r\nagent_data = manager.run_prompt(\r\n # prompt_key=\"prompt_1 (Character Creation)\",\r\n prompt_key=\"promot_1 (Character Sheet Creation)\",\r\n template_vars=prompt_1_vars, \r\n ai_model=ai_model,\r\n debug=debug\r\n)"}]}]},"nodeType":"block"},{"uid":"u17DlfDBf8","position":{"x":-1500,"y":2110},"sizes":{"width":589.9375,"height":1431.203125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"prompts\\chain_prompts_v2.yaml"}]},{"type":"codeBlock","attrs":{"language":"yaml","wrapCode":true},"content":[{"type":"text","text":"promot_1 (Character Sheet Creation): |\r\n You are an expert in creative writing, character design, world-building, and marketing. You are tasked with developing a complete character profile for a new agent who will be featured in stories for a Twitter bot. These stories will be broken down into seasons, episodes, and individual tweets (scenes/posts).\r\n\r\n Agent Development Task\r\n Generate a comprehensive YAML file that defines this new agent, including their name, personality, communication style, topic of expertise, backstory, universe, relevant hashtags, and emojis.\r\n Use the following concept if its not empty, otherwise create one.\r\n - concept: {{ concept }}\r\n\r\n Specific Instructions:\r\n 1. Invent a Creative Name:\r\n - If no specific name is provided, create a unique and fitting name for the agent based on the concept of the agent. The name should be suitable for a Twitter handle.\r\n - Agent Name: {{ agent_name }}\r\n\r\n 2. Define the Topic: \r\n - If no specific topic is provided, default to \"Crypto\" or invent a creative topic that lends itself to episodic storytelling.\r\n - Topic: {{ topic }}\r\n\r\n 3. Develop Personality and Style:\r\n - Create a detailed personality for the agent.\r\n - Define a clear communication style for the agent.\r\n - Personality: {{ personality }}\r\n - Communication Style: {{ style }}\r\n\r\n 4. Craft a Backstory:\r\n - Invent a compelling and original backstory for the agent that explains their motivations, skills, and current situation. This backstory should be suitable for unfolding gradually over multiple story arcs.\r\n - Backstory: {{ backstory }}\r\n\r\n 5. Describe the Universe:\r\n - Detail the world(s) or setting where the agent operates. Consider the current state of technology, the social and political landscape, major organizations or factions, and any unique elements relevant to the chosen topic.\r\n - Use a narrative or bullet-point format within the YAML.\r\n - Universe: {{ universe }}\r\n\r\n 6. Generate Marketing Elements:\r\n - Create a list of relevant hashtags that will be used for social media promotion. Include hashtags related to the agent's name, topic, and genre.\r\n - Important: Output the hashtags as a YAML array. Enclose the hashtags in square brackets, separate them with commas, make sure they have double quotes around each hashtag, and put each hashtag on a new line within the brackets. (e.g., `hashtags: [\\\\n- \"#example1\",\\\\n- \"#example2\"\\\\n]` )**\r\n - Create a list of relevant emojis that can be used in tweets to add visual interest and convey meaning.\r\n - Important: Output the emojis as a YAML array. Enclose the emojis in square brackets, separate them with commas, and put each emoji on a new line within the brackets. (e.g., `emojis: [\\\\n- 🐳,\\\\n- 🌊\\\\n]` )**\r\n - Hashtags: {{ hashtags }}\r\n - Emojis: {{ emojis }}\r\n\r\n Output Requirements:\r\n - Only output valid YAML. Do not include any text outside of the YAML structure.\r\n - Output a single, complete YAML file that includes all the fields mentioned above (name, personality, communication_style, topic, backstory, universe, hashtags, emojis).\r\n - Adhere to the specified answer lengths for each field (short for personality and communication style, long for backstory and universe).\r\n\r\n Output exactly as the yaml file:\r\n ```yaml\r\n {{ agent_yaml }}\r\n ```"}]}]},"nodeType":"block"},{"uid":"_FbKHtj4_Z","position":{"x":-770,"y":3470},"sizes":{"width":479.84375,"height":496.875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"We swap out all the place holders values in our yaml file for the prompt_1_vars we created."}]},{"type":"codeBlock","attrs":{"language":"yaml","wrapCode":true},"content":[{"type":"text","text":"{{ concept }}"}]},{"type":"paragraph","content":[{"type":"text","text":"This is achieved by using the following library."}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":false},"content":[{"type":"text","text":"from jinja2 import Template"}]},{"type":"paragraph","content":[{"type":"text","text":"In this case"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":false},"content":[{"type":"text","text":"# The following yaml variable\n{{ concept }}\n\n# Gets replaced with prompt_1_vars concept variable value\n\"alien drone pilot who is a sarcastic asshole visiting \nearth to report back his findings to his home planet\""}]},{"type":"paragraph"}]},"nodeType":"block"},{"uid":"3hymDJ_oQT","position":{"x":-190,"y":2570},"sizes":{"width":639.9375,"height":783.8125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"filePathNode","attrs":{"pathToFile":"","version":1},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"content_generator.py"}]},{"type":"codeBlock","attrs":{"language":"python","wrapCode":true},"content":[{"type":"text","text":"# -------------------------------------------------------------------\r\n# Generic prompt runner that works with any prompt template\r\n# -------------------------------------------------------------------\r\ndef run_prompt(self, prompt_key, template_vars, ai_model, debug=False):\r\n \"\"\"\r\n Generic prompt runner that works with any prompt template\r\n \r\n Args:\r\n prompt_key: The key for the prompt template (e.g., \"prompt_1\", \"prompt_2\")\r\n template_vars: dict of variables to pass to the template\r\n ai_model: The AI model to use for generating responses\r\n \"\"\"\r\n self.ai_model = ai_model\r\n\n # 1. Load the chain prompts from the YAML file\r\n with open(\"prompts/chain_prompts_v2.yaml\", \"r\", encoding=\"utf-8\") as f:\r\n chain_prompts = yaml.safe_load(f)\r\n\n # 2. Grab the raw prompt template text\r\n prompt_template = chain_prompts[prompt_key]\r\n\n # 3. Use Jinja2 to fill placeholders\n template = Template(prompt_template)\n prompt_text = template.render(**template_vars)\n\n # 4. Call the LLM\n response = ai_model.generate_response(prompt_text)\n\n # # 5. Parse the YAML from the LLM's response\n yaml_response = self.parse_yaml_from_response(response)\n if yaml_response is None:\r\n # Handle parse error or fallback\r\n print(f\"Error: LLM returned invalid YAML for {prompt_key}.\")\r\n return None\r\n\n # return yaml_response\r\n return yaml_response"}]}]},"nodeType":"block"},{"uid":"aKUkNhx4oa","position":{"x":-80,"y":2370},"sizes":{"width":399.828125,"height":83.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Write your note here..."}]}]},"nodeType":"block"},{"uid":"Ka5_2WO78J","position":{"x":-800,"y":2910},"sizes":{"width":399.828125,"height":125.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"The nice things about this function is that it works for all prompts. There is no need to have a custom function for each prompt."}]}]},"nodeType":"block"},{"uid":"ZHSj7Wyw_j","position":{"x":-70,"y":3450},"sizes":{"width":399.84375,"height":104.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"We next have to process the results of the response we get from the AI."}]}]},"nodeType":"block"},{"uid":"xQMZhS6h3z","position":{"x":-70,"y":3890},"sizes":{"width":399.84375,"height":104.953125},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"First we save the raw response. This is a temp file that gets overridden each time."}]}]},"nodeType":"block"},{"uid":"kkQcsDI9vz","position":{"x":-60,"y":4220},"sizes":{"width":399.84375,"height":244.921875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"We then remove our placed holder values we told the AI to put around our yaml file."}]},{"type":"codeBlock","attrs":{"language":"yaml","wrapCode":false},"content":[{"type":"text","text":"``` yaml\n```"}]},{"type":"paragraph","content":[{"type":"text","text":"we also want to remove any empty lines at the start and end of the file."}]}]},"nodeType":"block"},{"uid":"5CWrjQmahA","position":{"x":-50,"y":4660},"sizes":{"width":399.84375,"height":125.9375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"We then return the filepath for this file so that we can merge together our template for our AI agent we made at the start, and the new values we received."}]}]},"nodeType":"block"},{"uid":"PotOsSoAv5","position":{"x":-40,"y":4970},"sizes":{"width":399.84375,"height":542.234375},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"paragraph","content":[{"type":"text","text":"Our Character Sheet for our Agents secret sauce should be made. We can then do one of the following:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Character Sheet"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Manually edit the files and tweak what we want."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Copy the results and put them into and online AI edit to refine. Just make sure the results are put into a valid yaml file."}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"ChatGPT"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Google Gemini"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Claude."}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Just make "}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Re-run the Agent creation process again. You should be provided with a new agent with its own character sheet. To be safe, I would save your current agent to a safe location just in case the AI does create a character with a similar name. Otherwise it will overwrite the files."}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Posts"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Move onto the next steps to generate the posts your agent will make and post to social media."}]}]}]}]}]}]},"nodeType":"block"},{"uid":"JNsqZAtg37","position":{"x":-1400,"y":1790},"sizes":{"width":379.9375,"height":276.421875},"autoheight":true,"blockContent":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"type":"text","text":"Pro Tip."}]},{"type":"paragraph","content":[{"type":"text","text":"To help with marketing and getting your ai out there. I would be selective on the hashtags it uses and includes."}]},{"type":"paragraph","content":[{"type":"text","text":"More importantly, I would have it sign on or off with a hashtag that is its own name. This can help trace back to your agents account if it goes viral. It does not cost you anything and could help get eyes on your agent / project."}]}]},"nodeType":"block"}],"configs":{"centerX":718.6506797353916,"centerY":-136.41252377462126,"zoomLevel":0.5629629445664683},"arrowData":{"arrowsMap":{"arrow-point-bI0wBh3Ufk-bottom-point-PSPLIYKa9J-top":{"to":"point-PSPLIYKa9J-top","from":"point-bI0wBh3Ufk-bottom","label":"Normal Box","direction":"ft","selectable":true},"arrow-point-bI0wBh3Ufk-bottom-point-ytXK_ayIc1-top":{"to":"point-ytXK_ayIc1-top","from":"point-bI0wBh3Ufk-bottom","label":"Code Box","direction":"ft","selectable":true},"arrow-point-hyyRZE3E8u-right-point-6ZopTaEaDZ-left":{"to":"point-6ZopTaEaDZ-left","from":"point-hyyRZE3E8u-right","label":"call","direction":"ft","selectable":true}},"pointsMap":{"point-PSPLIYKa9J-top":{"x":805.9999797489683,"y":60,"id":"point-PSPLIYKa9J-top","direction":"top"},"point-ytXK_ayIc1-top":{"x":205.99999493724206,"y":60,"id":"point-ytXK_ayIc1-top","direction":"top"},"point-6ZopTaEaDZ-left":{"x":220,"y":605.9999898744841,"id":"point-6ZopTaEaDZ-left","direction":"left"},"point-hyyRZE3E8u-right":{"x":100,"y":606,"id":"point-hyyRZE3E8u-right","direction":"right"},"point-bI0wBh3Ufk-bottom":{"x":515.9999797489683,"y":-40,"id":"point-bI0wBh3Ufk-bottom","direction":"bottom"}},"edgesMap":{"edge-RuCwNpe8rs-RuCwNpe8rs-bottom-lW0CrByFpI-lW0CrByFpI-top":{"uid":"edge-RuCwNpe8rs-RuCwNpe8rs-bottom-lW0CrByFpI-lW0CrByFpI-top","fromNodeId":"RuCwNpe8rs","fromHandleId":"RuCwNpe8rs-bottom","toNodeId":"lW0CrByFpI","toHandleId":"lW0CrByFpI-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-lW0CrByFpI-lW0CrByFpI-right-24FHjKbcb4-24FHjKbcb4-left":{"uid":"edge-lW0CrByFpI-lW0CrByFpI-right-24FHjKbcb4-24FHjKbcb4-left","fromNodeId":"lW0CrByFpI","fromHandleId":"lW0CrByFpI-right","toNodeId":"24FHjKbcb4","toHandleId":"24FHjKbcb4-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-aPeP7UA4jx-aPeP7UA4jx-bottom-24FHjKbcb4-24FHjKbcb4-top":{"uid":"edge-aPeP7UA4jx-aPeP7UA4jx-bottom-24FHjKbcb4-24FHjKbcb4-top","fromNodeId":"aPeP7UA4jx","fromHandleId":"aPeP7UA4jx-bottom","toNodeId":"24FHjKbcb4","toHandleId":"24FHjKbcb4-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-24FHjKbcb4-24FHjKbcb4-bottom-bk2x5x3hCZ-bk2x5x3hCZ-top":{"uid":"edge-24FHjKbcb4-24FHjKbcb4-bottom-bk2x5x3hCZ-bk2x5x3hCZ-top","fromNodeId":"24FHjKbcb4","fromHandleId":"24FHjKbcb4-bottom","toNodeId":"bk2x5x3hCZ","toHandleId":"bk2x5x3hCZ-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-bk2x5x3hCZ-bk2x5x3hCZ-bottom-errABHj0Ma-errABHj0Ma-top":{"uid":"edge-bk2x5x3hCZ-bk2x5x3hCZ-bottom-errABHj0Ma-errABHj0Ma-top","fromNodeId":"bk2x5x3hCZ","fromHandleId":"bk2x5x3hCZ-bottom","toNodeId":"errABHj0Ma","toHandleId":"errABHj0Ma-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-flbOA-v9zK-flbOA-v9zK-right-LkysyEPIGx-LkysyEPIGx-left":{"uid":"edge-flbOA-v9zK-flbOA-v9zK-right-LkysyEPIGx-LkysyEPIGx-left","fromNodeId":"flbOA-v9zK","fromHandleId":"flbOA-v9zK-right","toNodeId":"LkysyEPIGx","toHandleId":"LkysyEPIGx-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-LkysyEPIGx-LkysyEPIGx-right-errABHj0Ma-errABHj0Ma-left":{"uid":"edge-LkysyEPIGx-LkysyEPIGx-right-errABHj0Ma-errABHj0Ma-left","fromNodeId":"LkysyEPIGx","fromHandleId":"LkysyEPIGx-right","toNodeId":"errABHj0Ma","toHandleId":"errABHj0Ma-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-cgbqTXNQi1-cgbqTXNQi1-bottom-40nWX7qZ7r-40nWX7qZ7r-top":{"uid":"edge-cgbqTXNQi1-cgbqTXNQi1-bottom-40nWX7qZ7r-40nWX7qZ7r-top","fromNodeId":"cgbqTXNQi1","fromHandleId":"cgbqTXNQi1-bottom","toNodeId":"40nWX7qZ7r","toHandleId":"40nWX7qZ7r-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-errABHj0Ma-errABHj0Ma-bottom-cgbqTXNQi1-cgbqTXNQi1-top":{"uid":"edge-errABHj0Ma-errABHj0Ma-bottom-cgbqTXNQi1-cgbqTXNQi1-top","fromNodeId":"errABHj0Ma","fromHandleId":"errABHj0Ma-bottom","toNodeId":"cgbqTXNQi1","toHandleId":"cgbqTXNQi1-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-GTc84OB9HI-GTc84OB9HI-right-40nWX7qZ7r-40nWX7qZ7r-left":{"uid":"edge-GTc84OB9HI-GTc84OB9HI-right-40nWX7qZ7r-40nWX7qZ7r-left","fromNodeId":"GTc84OB9HI","fromHandleId":"GTc84OB9HI-right","toNodeId":"40nWX7qZ7r","toHandleId":"40nWX7qZ7r-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-u17DlfDBf8-u17DlfDBf8-right-GTc84OB9HI-GTc84OB9HI-left":{"uid":"edge-u17DlfDBf8-u17DlfDBf8-right-GTc84OB9HI-GTc84OB9HI-left","fromNodeId":"u17DlfDBf8","fromHandleId":"u17DlfDBf8-right","toNodeId":"GTc84OB9HI","toHandleId":"GTc84OB9HI-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-40nWX7qZ7r-40nWX7qZ7r-bottom-aKUkNhx4oa-aKUkNhx4oa-top":{"uid":"edge-40nWX7qZ7r-40nWX7qZ7r-bottom-aKUkNhx4oa-aKUkNhx4oa-top","fromNodeId":"40nWX7qZ7r","fromHandleId":"40nWX7qZ7r-bottom","toNodeId":"aKUkNhx4oa","toHandleId":"aKUkNhx4oa-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-aKUkNhx4oa-aKUkNhx4oa-bottom-3hymDJ_oQT-3hymDJ_oQT-top":{"uid":"edge-aKUkNhx4oa-aKUkNhx4oa-bottom-3hymDJ_oQT-3hymDJ_oQT-top","fromNodeId":"aKUkNhx4oa","fromHandleId":"aKUkNhx4oa-bottom","toNodeId":"3hymDJ_oQT","toHandleId":"3hymDJ_oQT-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-Ka5_2WO78J-Ka5_2WO78J-right-3hymDJ_oQT-3hymDJ_oQT-left":{"uid":"edge-Ka5_2WO78J-Ka5_2WO78J-right-3hymDJ_oQT-3hymDJ_oQT-left","fromNodeId":"Ka5_2WO78J","fromHandleId":"Ka5_2WO78J-right","toNodeId":"3hymDJ_oQT","toHandleId":"3hymDJ_oQT-left","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-3hymDJ_oQT-3hymDJ_oQT-right-_FbKHtj4_Z-_FbKHtj4_Z-top":{"uid":"edge-3hymDJ_oQT-3hymDJ_oQT-right-_FbKHtj4_Z-_FbKHtj4_Z-top","fromNodeId":"3hymDJ_oQT","fromHandleId":"3hymDJ_oQT-right","toNodeId":"_FbKHtj4_Z","toHandleId":"_FbKHtj4_Z-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-_FbKHtj4_Z-_FbKHtj4_Z-left-u17DlfDBf8-u17DlfDBf8-bottom":{"uid":"edge-_FbKHtj4_Z-_FbKHtj4_Z-left-u17DlfDBf8-u17DlfDBf8-bottom","fromNodeId":"_FbKHtj4_Z","fromHandleId":"_FbKHtj4_Z-left","toNodeId":"u17DlfDBf8","toHandleId":"u17DlfDBf8-bottom","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-3hymDJ_oQT-3hymDJ_oQT-bottom-ZHSj7Wyw_j-ZHSj7Wyw_j-top":{"uid":"edge-3hymDJ_oQT-3hymDJ_oQT-bottom-ZHSj7Wyw_j-ZHSj7Wyw_j-top","fromNodeId":"3hymDJ_oQT","fromHandleId":"3hymDJ_oQT-bottom","toNodeId":"ZHSj7Wyw_j","toHandleId":"ZHSj7Wyw_j-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-40nWX7qZ7r-40nWX7qZ7r-bottom-_FbKHtj4_Z-_FbKHtj4_Z-top":{"uid":"edge-40nWX7qZ7r-40nWX7qZ7r-bottom-_FbKHtj4_Z-_FbKHtj4_Z-top","fromNodeId":"40nWX7qZ7r","fromHandleId":"40nWX7qZ7r-bottom","toNodeId":"_FbKHtj4_Z","toHandleId":"_FbKHtj4_Z-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}},"edge-JNsqZAtg37-JNsqZAtg37-bottom-u17DlfDBf8-u17DlfDBf8-top":{"uid":"edge-JNsqZAtg37-JNsqZAtg37-bottom-u17DlfDBf8-u17DlfDBf8-top","fromNodeId":"JNsqZAtg37","fromHandleId":"JNsqZAtg37-bottom","toNodeId":"u17DlfDBf8","toHandleId":"u17DlfDBf8-top","direction":"ft","selectable":true,"type":"solid","content":{"label":""}}}}}} \ No newline at end of file diff --git a/docs/about-llms.md b/docs/about-llms.md new file mode 100644 index 0000000..e487c79 --- /dev/null +++ b/docs/about-llms.md @@ -0,0 +1,164 @@ +# Explanation: Understanding LLMs, Prompt Engineering, and ARAI AI + +**ARAI AI Agents** leverages advanced **Large Language Models (LLMs)** to produce non-repetitive, context-aware content through various strategies, including **prompt chaining**. This document provides a brief history of AI, explains how LLMs differ from other AI approaches, covers tokenization and prompts, and explores two popular prompt engineering techniques—_Prompt Chaining_ and _Chain-of-Thought (CoT) Prompting_. We’ll also highlight ARAI’s approach to orchestrating these methods. + +--- + +## Table of Contents + +1. [A Brief History of AI](#1-a-brief-history-of-ai) +2. [How LLMs Differ from Other AI Approaches](#2-how-llms-differ-from-other-ai-approaches) +3. [Tokens, Prompts & Generation](#3-tokens-prompts-generation) +4. [Two Paths to Take: Prompt Chaining vs. Chain-of-Thought Prompting](#4-two-paths-to-take-prompt-chaining-vs-chain-of-thought-prompting) +5. [Limitations of LLMs](#5-limitations-of-llms) +6. [How ARAI AI Agents Leverage LLMs](#6-how-arai-ai-agents-leverage-llms) +7. [Conclusion](#7-conclusion) + +--- + +## 1. A Brief History of AI + +1. **Symbolic AI (1950s–1980s)** + Early AI largely relied on **rule-based** or “expert” systems, manually encoding logic rather than learning from large datasets. + +2. **Machine Learning (1980s–2000s)** + Statistical algorithms (decision trees, SVMs, etc.) gained traction, but they often required extensive feature engineering and couldn’t handle nuanced language tasks well. + +3. **Deep Learning (2010s)** + Neural networks scaled to many layers (“deep”) ushered in a new era of success in fields like vision, speech, and basic NLP tasks, yet still had limitations with long-range text dependencies. + +4. **Transformers & LLMs (Late 2010s–Present)** + The **Transformer** architecture ([“Attention Is All You Need”](https://arxiv.org/abs/1706.03762)) revolutionized NLP. **Large Language Models (LLMs)** like GPT (OpenAI), BERT (Google), and others leverage massive datasets, enabling more context-aware and flexible text generation. + +--- + +## 2. How LLMs Differ from Other AI Approaches + +1. **Context Handling** + LLMs excel at understanding and generating text with long-range context, unlike older models that quickly lost track of previous content. + +2. **General-Purpose Functionality** + Traditional AI is usually _task-specific_, whereas modern LLMs can _adapt_ to various language-related tasks via well-structured prompts. + +3. **Few-Shot & Zero-Shot Learning** + LLMs can tackle tasks with minimal examples, a huge leap from older machine learning methods requiring large labeled datasets for each new domain. + +4. **Fluency & Creativity** + Transformer-based models produce coherent, contextually rich text that often feels natural and human-like. + +--- + +## 3. Tokens, Prompts & Generation + +### 3.1 Tokenization + +- **What Is a Token?** + A **token** can be a sub-word, punctuation, or symbol. LLMs process text sequentially in tokens. +- **Context Window** + LLMs only have a finite **context window** (e.g., 2k–32k tokens). If your conversation exceeds that window, older context may be dropped or truncated. + +### 3.2 Prompts + +- **Prompt as an Instruction** + A **prompt** is the text or instruction you give an LLM. +- **Prompt Engineering** + The art of shaping prompts to achieve specific outputs is called **prompt engineering**. Effective prompts may include role instructions, examples, or constraints. + +--- + +## 4. Two Paths to Take: Prompt Chaining vs. Chain-of-Thought Prompting + +**Prompt engineering** is the process of writing prompts that guide **artificial intelligence (AI) models** (LLMs) to generate desired outputs. Two popular techniques often used to improve the quality and reliability of responses are **Prompt Chaining** and **Chain-of-Thought (CoT) Prompting**. Each technique offers unique advantages and suits different types of tasks. + +### 4.1 Prompt Chaining + +- **Definition** + In **Prompt Chaining**, you break down a complex task into a series of smaller prompts. Each prompt’s output feeds into the next, ensuring the model carries forward relevant context and partial results. + +- **Use Case** + Ideal for: + + - **Sequential tasks** (e.g., multi-episode stories, multi-step transformations). + - **Maintaining context** over multiple posts or interactions. + - **Structured workflows** where each step refines or expands the content. + +- **Example** + 1. **Prompt 1**: “Generate a character backstory.” + 2. **Prompt 2**: “Using the backstory, outline a 5-episode arc.” + 3. **Prompt 3**: “Write the first episode’s script referencing the outline.” + +This approach is central to how **ARAI** orchestrates episodes and seasons while preventing repetitive content. + +### 4.2 Chain-of-Thought (CoT) Prompting + +- **Definition** + **CoT Prompting** encourages the model to write out its reasoning steps before giving a final answer. Instead of simply asking for a solution, you instruct the LLM to “show its work” in a structured or step-by-step explanation. + +- **Use Case** + Best for: + + - **Complex problem-solving** (math, logic puzzles, or multi-faceted questions). + - **Diagnostic tasks** (where seeing intermediate reasoning is valuable). + - **Ensuring correctness** by revealing potential errors in the reasoning chain. + +- **Example** + 1. Prompt: “Explain how to solve this math problem step by step, then provide the final answer.” + 2. The model outputs a _reasoning chain_ (hidden or partially visible) and a final solution. + +In short, **CoT** is more about unveiling the reasoning process. **Prompt Chaining** is about splitting tasks into multiple sequential steps. **ARAI** primarily uses _Prompt Chaining_ but can combine CoT for more in-depth reasoning within each step. + +--- + +## 5. Limitations of LLMs + +1. **Hallucinations** + LLMs may invent details when unsure, which can lead to plausible-sounding but incorrect answers. + +2. **Context Window Constraints** + They can only handle a limited token count at once. Exceeding that limit truncates older parts of the conversation. + +3. **Lack of True Understanding** + Despite generating sophisticated text, LLMs do not possess consciousness or genuine comprehension. + +4. **Bias & Ethical Concerns** + LLMs can reflect biases present in their training data. Caution is advised, especially for public-facing content. + +5. **Prompt Quality** + Output is only as good as the prompt. Poorly structured requests yield suboptimal results. + +--- + +## 6. How ARAI AI Agents Leverage LLMs + +**ARAI AI Agents** harness LLMs with a focus on **Prompt Chaining** for narrative-driven content. Some highlights: + +1. **Story-First Content** + ARAI uses a _TV show or cinematic model_—seasons, episodes, scenes—to maintain overarching context. +2. **Chained Prompts** + - Each step (episode, scene, or post) references the preceding step’s output, ensuring continuity and preventing repetition. +3. **Multi-Agent Collaboration** + - ARAI can integrate multiple agent personalities, each guided by specialized prompts or constraints. +4. **Chain-of-Thought (Optional)** + - For specific logic or puzzle-based tasks, ARAI can enable CoT to capture the LLM’s reasoning process more transparently. + +--- + +## 7. Conclusion + +Modern **Large Language Models** give us _unprecedented flexibility_ in text generation. By employing **Prompt Chaining** and, when necessary, **Chain-of-Thought Prompting**, we guide LLMs toward more coherent, context-rich outputs that serve both creative and analytical tasks. + +**ARAI AI** exemplifies these methods by: + +- Building multi-episode narratives that avoid redundancy. +- Utilizing carefully structured prompts to maintain story context across seasons. +- Embracing or bypassing CoT as required by the complexity of each scenario. + +--- + +> **Next Steps**: +> +> - Check out our [How-To Guides](./how-to-guides.md) for environment setup and configuring your LLM keys. +> - Dive into [tutorials](./tutorials.md) for hands-on practice creating your first story-driven agent. +> - See the [Reference](./reference.md) docs for ARAI’s APIs and modules. + +**Happy prompt engineering with ARAI AI!** diff --git a/docs/api/SUMMARY.md b/docs/api/SUMMARY.md new file mode 100644 index 0000000..7be0090 --- /dev/null +++ b/docs/api/SUMMARY.md @@ -0,0 +1,16 @@ +- auth + - [twitter_app_auth](auth/twitter_app_auth.md) +- connectors + - [twitter_connector](connectors/twitter_connector.md) +- [main](main.md) +- models + - [base_model](models/base_model.md) + - [gemini_model](models/gemini_model.md) +- prompt_chaining + - [step_1](prompt_chaining/step_1.md) + - [step_2](prompt_chaining/step_2.md) + - [step_3](prompt_chaining/step_3.md) +- utils + - [content_generator](utils/content_generator.md) + - [post_manager](utils/post_manager.md) + - [template_types](utils/template_types.md) diff --git a/docs/api/auth/index.md b/docs/api/auth/index.md new file mode 100644 index 0000000..015a98f --- /dev/null +++ b/docs/api/auth/index.md @@ -0,0 +1,3 @@ +# auth + +::: arai_ai_agents.auth diff --git a/docs/api/auth/twitter_app_auth.md b/docs/api/auth/twitter_app_auth.md new file mode 100644 index 0000000..7894e7a --- /dev/null +++ b/docs/api/auth/twitter_app_auth.md @@ -0,0 +1,3 @@ +# twitter_app_auth + +::: arai_ai_agents.auth.twitter_app_auth diff --git a/docs/api/connectors/index.md b/docs/api/connectors/index.md new file mode 100644 index 0000000..51cb370 --- /dev/null +++ b/docs/api/connectors/index.md @@ -0,0 +1,3 @@ +# connectors + +::: arai_ai_agents.connectors diff --git a/docs/api/connectors/twitter_connector.md b/docs/api/connectors/twitter_connector.md new file mode 100644 index 0000000..c56d177 --- /dev/null +++ b/docs/api/connectors/twitter_connector.md @@ -0,0 +1,3 @@ +# twitter_connector + +::: arai_ai_agents.connectors.twitter_connector diff --git a/docs/api/main.md b/docs/api/main.md new file mode 100644 index 0000000..076d9ca --- /dev/null +++ b/docs/api/main.md @@ -0,0 +1,3 @@ +# main + +::: arai_ai_agents.main diff --git a/docs/api/models/base_model.md b/docs/api/models/base_model.md new file mode 100644 index 0000000..dfa59da --- /dev/null +++ b/docs/api/models/base_model.md @@ -0,0 +1,3 @@ +# base_model + +::: arai_ai_agents.models.base_model diff --git a/docs/api/models/gemini_model.md b/docs/api/models/gemini_model.md new file mode 100644 index 0000000..0fba7d1 --- /dev/null +++ b/docs/api/models/gemini_model.md @@ -0,0 +1,3 @@ +# gemini_model + +::: arai_ai_agents.models.gemini_model diff --git a/docs/api/models/index.md b/docs/api/models/index.md new file mode 100644 index 0000000..a1ef402 --- /dev/null +++ b/docs/api/models/index.md @@ -0,0 +1,3 @@ +# models + +::: arai_ai_agents.models diff --git a/docs/api/prompt_chaining/index.md b/docs/api/prompt_chaining/index.md new file mode 100644 index 0000000..ec55e85 --- /dev/null +++ b/docs/api/prompt_chaining/index.md @@ -0,0 +1,3 @@ +# prompt_chaining + +::: arai_ai_agents.prompt_chaining diff --git a/docs/api/prompt_chaining/step_1.md b/docs/api/prompt_chaining/step_1.md new file mode 100644 index 0000000..0c3f28b --- /dev/null +++ b/docs/api/prompt_chaining/step_1.md @@ -0,0 +1,3 @@ +# step_1 + +::: arai_ai_agents.prompt_chaining.step_1 diff --git a/docs/api/prompt_chaining/step_2.md b/docs/api/prompt_chaining/step_2.md new file mode 100644 index 0000000..78bdcb6 --- /dev/null +++ b/docs/api/prompt_chaining/step_2.md @@ -0,0 +1,3 @@ +# step_2 + +::: arai_ai_agents.prompt_chaining.step_2 diff --git a/docs/api/prompt_chaining/step_3.md b/docs/api/prompt_chaining/step_3.md new file mode 100644 index 0000000..ea70826 --- /dev/null +++ b/docs/api/prompt_chaining/step_3.md @@ -0,0 +1,3 @@ +# step_3 + +::: arai_ai_agents.prompt_chaining.step_3 diff --git a/docs/api/utils/content_generator.md b/docs/api/utils/content_generator.md new file mode 100644 index 0000000..ef50715 --- /dev/null +++ b/docs/api/utils/content_generator.md @@ -0,0 +1,3 @@ +# content_generator + +::: arai_ai_agents.utils.content_generator diff --git a/docs/api/utils/index.md b/docs/api/utils/index.md new file mode 100644 index 0000000..0889c7d --- /dev/null +++ b/docs/api/utils/index.md @@ -0,0 +1,3 @@ +# utils + +::: arai_ai_agents.utils diff --git a/docs/api/utils/post_manager.md b/docs/api/utils/post_manager.md new file mode 100644 index 0000000..c914aa2 --- /dev/null +++ b/docs/api/utils/post_manager.md @@ -0,0 +1,3 @@ +# post_manager + +::: arai_ai_agents.utils.post_manager diff --git a/docs/api/utils/template_types.md b/docs/api/utils/template_types.md new file mode 100644 index 0000000..c6c0ada --- /dev/null +++ b/docs/api/utils/template_types.md @@ -0,0 +1,3 @@ +# template_types + +::: arai_ai_agents.utils.template_types diff --git a/docs/assets/gifs/featureReleaseTeaser.gif b/docs/assets/gifs/featureReleaseTeaser.gif new file mode 100644 index 0000000..4b40ae7 Binary files /dev/null and b/docs/assets/gifs/featureReleaseTeaser.gif differ diff --git a/docs/assets/images/logos/ARAI - vec - black logo.png b/docs/assets/images/logos/ARAI - vec - black logo.png new file mode 100644 index 0000000..3a07b47 Binary files /dev/null and b/docs/assets/images/logos/ARAI - vec - black logo.png differ diff --git a/docs/assets/images/logos/ARAI - vec - grey logo - transparent background - dexscreener logo.png b/docs/assets/images/logos/ARAI - vec - grey logo - transparent background - dexscreener logo.png new file mode 100644 index 0000000..f681eec Binary files /dev/null and b/docs/assets/images/logos/ARAI - vec - grey logo - transparent background - dexscreener logo.png differ diff --git a/docs/assets/images/logos/ARAI - vec - grey logo.png b/docs/assets/images/logos/ARAI - vec - grey logo.png new file mode 100644 index 0000000..c14bffc Binary files /dev/null and b/docs/assets/images/logos/ARAI - vec - grey logo.png differ diff --git a/docs/assets/images/logos/ARAI - vec - white logo - black background - dexscreener logo.png b/docs/assets/images/logos/ARAI - vec - white logo - black background - dexscreener logo.png new file mode 100644 index 0000000..03b897c Binary files /dev/null and b/docs/assets/images/logos/ARAI - vec - white logo - black background - dexscreener logo.png differ diff --git a/docs/assets/images/logos/ARAI - vec - white logo - black background.png b/docs/assets/images/logos/ARAI - vec - white logo - black background.png new file mode 100644 index 0000000..33395c9 Binary files /dev/null and b/docs/assets/images/logos/ARAI - vec - white logo - black background.png differ diff --git a/docs/assets/images/logos/theblockrhino_banner - transparent background.png b/docs/assets/images/logos/theblockrhino_banner - transparent background.png new file mode 100644 index 0000000..5fb2e9d Binary files /dev/null and b/docs/assets/images/logos/theblockrhino_banner - transparent background.png differ diff --git a/docs/assets/images/logos/theblockrhino_banner.png b/docs/assets/images/logos/theblockrhino_banner.png new file mode 100644 index 0000000..3e1a361 Binary files /dev/null and b/docs/assets/images/logos/theblockrhino_banner.png differ diff --git a/docs/assets/images/logos/theblockrhino_banner_trim.png b/docs/assets/images/logos/theblockrhino_banner_trim.png new file mode 100644 index 0000000..834d18b Binary files /dev/null and b/docs/assets/images/logos/theblockrhino_banner_trim.png differ diff --git a/docs/assets/images/logos/theblockrhino_banner_trim_grey.png b/docs/assets/images/logos/theblockrhino_banner_trim_grey.png new file mode 100644 index 0000000..e62bc07 Binary files /dev/null and b/docs/assets/images/logos/theblockrhino_banner_trim_grey.png differ diff --git a/docs/cli-guide.md b/docs/cli-guide.md new file mode 100644 index 0000000..a950ad3 --- /dev/null +++ b/docs/cli-guide.md @@ -0,0 +1,192 @@ +# ARAI CLI Usage Guide + +The **ARAI AI Agents** command-line interface (CLI) offers a straightforward way to manage your AI agents, create media content (seasons/episodes), and schedule or force posts. This guide will walk you through the main menu options and typical use cases. + +--- + +## Table of Contents + +1. [Launching the CLI](#1-launching-the-cli) +2. [Main Menu Overview](#2-main-menu-overview) +3. [CLI Tips & Tricks](#3-cli-tips--tricks) +4. [Common Workflows](#4-common-workflows) +5. [Exiting the CLI](#5-exiting-the-cli) +6. [Troubleshooting](#6-troubleshooting) +7. [Conclusion](#7-conclusion) + +--- + +## 1. Launching the CLI + +1. **Activate your Conda environment** (if using conda): + ```bash + conda activate arai_ai_agents + ``` +2. **Navigate** to your `arai_ai_agents` folder: + ```bash + cd arai_ai_agents + ``` +3. **Run** the CLI script: + ```bash + python main.py + ``` +4. You should see a welcome prompt similar to: + + ```plaintext + === Main Menu === + Welcome to ARAI Agents. + Please select an option: + + Current Agent: None + + = Agent Management = + 1. Select an existing Agent + 2. Create a new Agent + + = Media Management = + 3. Create a new Season + 4. Create Season posts + + = Scheduler Management = + 5. Start Scheduler + 6. Check posting status + 7. Force post now + 8. Pause/Resume posting + + = Miscellaneous = + 9. Exit + + Enter your choice (1-9): + ``` + +--- + +## 2. Main Menu Overview + +Below is a breakdown of each **main menu** option and what it does: + +### 1. Select an Existing Agent + +If you have previously created AI agents, you can pick which one you want to work with. After you select an agent, the **Current Agent** will change from `None` to the chosen agent’s name. + +- **Why**: This allows you to isolate tasks (creating posts, scheduling, etc.) for a specific agent. + +### 2. Create a New Agent + +This option launches a short wizard to build a new AI agent from scratch: + +- **Steps**: + 1. Provide a **name** or handle for the agent. + 2. Supply any extra info (e.g., personality traits, brand guidelines). + 3. Confirm creation. +- Once complete, the new agent appears in the list of available agents. + +--- + +### 3. Create a New Season + +Seasons act like **story arcs** or **thematic campaigns** for your agent’s content. Selecting this option: + +1. Prompts you for a **season name** (e.g., “Season 1: The Great Launch”). +2. Optionally requests a **description** or theme. +3. Creates a basic YAML or JSON entry to track this season’s details. + +### 4. Create Season Posts + +After you have a season in place (or multiple), this option helps you **generate posts** (or “episodes”) related to that season. You may be asked: + +1. Which **season** you want to create posts for. +2. How many posts (scenes/episodes) you need. +3. Any special context or prompts. + The CLI will then process prompts and **batch-generate** content (e.g., social media posts) for that season. + +--- + +### 5. Start Scheduler + +ARAI includes a **scheduler** that can automatically post content at set intervals: + +1. When you start the scheduler, you’ll see logs or debug info showing if posting is live or in “test mode.” +2. The system will queue up any scheduled posts from the currently selected agent (or all agents, depending on your config). + +### 6. Check Posting Status + +Use this to see **which posts** are scheduled, how many have gone out, and whether any are **pending** or **on hold**. It helps confirm that your agent is indeed posting or waiting to post. + +### 7. Force Post Now + +If you don’t want to wait for the next scheduled slot, you can **force** the system to post immediately. This can be handy if: + +- You need to push out an urgent update. +- You want to test how the post looks on your platform right away. + +### 8. Pause/Resume Posting + +Allows you to **temporarily halt** the scheduler without losing its state. When paused: + +- No new posts are sent to Twitter (or other connectors). +- You can safely resume posting later when you’re ready. + +--- + +### 9. Exit + +Closes the CLI. Any running background jobs or schedulers (if not paused or stopped) may continue operating until their next iteration, but the main interactive session ends. + +--- + +## 3. CLI Tips & Tricks + +- **Switching Agents**: You can always go back to option `1` to select another agent at any time. +- **Inspecting Logs**: If something goes wrong (e.g., an error connecting to Twitter), check the CLI output or your log files in `configs/agent_folder/agentName_post_log.yaml` for debug information. +- **Using the .env**: Make sure your environment variables (Twitter keys, Gemini API key, etc.) are properly set in your `.env` file or system environment so the CLI can access them. +- **In-Depth Configuration**: If you prefer custom intervals, advanced scheduling, or specialized post flows, you can modify the relevant `.yaml` or `.json` config files in the `configs/` directory. The CLI reads from and writes to these files to maintain state. + +--- + +## 4. Common Workflows + +1. **Create & Configure a New Agent** + + 1. Select option **2** at the main menu. + 2. Provide agent details. + 3. Optionally, create a season (option **3**) and season posts (option **4**). + +2. **Schedule Posts for Automated Publishing** + + 1. Start the scheduler with option **5**. + 2. Check the status with option **6**. + 3. If you want immediate posting, option **7** triggers it right away. + 4. Pause/Resume with option **8**. + +3. **Batch Generate Contextual Posts** + 1. Select or create an agent. + 2. Use option **3** to define a thematic “season.” + 3. Then option **4** to generate multiple posts in one go. + 4. Let the scheduler handle posting times, or force them out (option **7**). + +--- + +## 5. Exiting the CLI + +When you’re done: + +1. Select **9** at the main menu or press `Ctrl + C` to exit the application. +2. Any unsaved changes in memory will typically be written out to config/log files when you exit. + +--- + +## 6. Troubleshooting + +- **CLI Not Launching**: Double-check you’ve activated your conda environment or installed the dependencies with `pip install -r requirements.txt`. +- **Agent Not Appearing in Menu**: The agent creation process may have failed or you forgot to confirm. Check your `/configs/agent_folder/` for a new `.yaml` or `.json`. +- **No Posting**: Confirm `twitter_live = True` in your main settings if you want real posts. Otherwise, they’re logged to a local file. +- **Crashes or Errors**: Review the CLI output or logs for stack traces. If the system can’t find your API keys, ensure your `.env` or environment variables are correctly set. + +--- + +## Conclusion + +That’s the basics of using the **ARAI AI Agents** CLI. From selecting or creating new agents, to generating multi-episode story arcs, to scheduling or forcing posts, the menu-based system keeps everything at your fingertips. If you have questions or encounter issues, check out the official [GitHub repository](https://github.com/arai-ai/arai_ai_agents) or submit an Issue for assistance. + +**Happy creating and scheduling with ARAI!** diff --git a/docs/code.md b/docs/code.md new file mode 100644 index 0000000..7f32a1a --- /dev/null +++ b/docs/code.md @@ -0,0 +1,57 @@ +# Code Examples + +## Code annotation Examples + +### Codeblocks + +Some `code` goes here. + +### Plain codeblock + +A plain codeblock: + +``` +Some code here +def my_function(): + print("Hello, world!") +``` + +#### Code for a specific language + +Some more code with the `py` at the start: + +```py +def my_function(): + print("Hello, world!") +``` + +#### With title + +```py title="my_function.py" +def my_function(): + print("Hello, world!") +``` + +#### With title and line numbers + +```py title="my_function.py" linenums="1" +def my_function(): + print("Hello, world!") +``` + +#### With line numbers and line highlighting + +```py title="my_function.py" linenums="1" hl_lines="2" +def my_function(): + print("Hello, world!") +``` + +## Icons and Emojis + +:smile: + +:fontawesome-brands-github-alt: + +:fontawesome-brands-twitter:{ .twitter} + +:octicons-heart-fill-24:{ .heart} diff --git a/docs/explanation.md b/docs/explanation.md new file mode 100644 index 0000000..cc5d186 --- /dev/null +++ b/docs/explanation.md @@ -0,0 +1,149 @@ +# Explanation: ARAI’s Prompt Chaining Approach + +**ARAI AI Agents** employs a narrative-based prompt chaining methodology to create cohesive, non-repetitive, and engaging content—ranging from **tweets** and **social media posts** to entire **story arcs**. This approach draws inspiration from **Hollywood screenwriters**, using seasons and episodes to structure continuous storylines and maintain context. + +--- + +## Table of Contents + +1. [Core Concept](#1-core-concept) +2. [Why “Prompt Chaining”?](#2-why-prompt-chaining) +3. [High-Level Workflow](#3-high-level-workflow) +4. [The Importance of a Large Context Window](#4-the-importance-of-a-large-context-window) +5. [Example Flow](#5-example-flow) +6. [Benefits of This Approach](#6-benefits-of-this-approach) +7. [Conclusion](#7-conclusion) + +--- + +## Core Concept + +1. **Non-Repetitive Storytelling** + + - Each generated post builds on previous context, avoiding repetitive language or ideas. + - The AI references a “universe” or “world Bible” similar to what screenwriters use in film or television. + +2. **TV Show & Cinematic Structure** + + - Stories are segmented into **seasons** and **episodes**. + - Each **episode** can be further divided into “scenes,” which are effectively _individual posts_ or _tweets_. + +3. **Prompt Chaining** + - **Prompts** are carefully crafted to pass relevant context (e.g., last episode events, the overall season arc). + - **Chained prompts** ensure that each subsequent piece of content knows what has happened before and maintains consistency. + +--- + +## Why “Prompt Chaining”? + +Typical AI-generated content can become repetitive when prompts are not carefully managed. **Prompt chaining** solves this by: + +- **Carrying Over Context** + Each step (post, scene, or episode) includes details of what came before, preventing “resetting” or “forgetting” and ensuring a natural flow. + +- **Layering Background & Universe Data** + The AI “knows” the characters’ personalities, the setting, and prior events. This leads to more believable and varied outputs. + +- **Batch & Story-Based Generation** + Instead of randomly generating single posts, ARAI processes entire sequences of posts together, referencing each other for narrative coherence. + +--- + +## High-Level Workflow + +1. **Character Background Sheets** + + - The system prompts the AI to create detailed character profiles: + - **Universe & Backstory** (setting, tone, etc.) + - **Traits** (personality, style, goals) + - **Emojis & Hashtags** they might use + +2. **Season & Episode Creation** + + - **Season** = a broad story arc (e.g., Season 1: “The Origin”). + - **Episodes** = subdivisions in each season (e.g., Episode 1: “Awakening”, Episode 2: “New Allies”). + - This structure emulates a TV series format, providing an expansive canvas for narrative progression. + +3. **Scene-to-Post Conversion** + + - Each **episode** is broken down into “scenes,” which **map directly to individual social media posts**. + - _Context injection_ includes: + - Last episode’s key events + - Character developments + - The overall “season” summary + +4. **Batch Generation** + + - ARAI then prompts the AI to generate multiple posts at once (or in succession) so they share context and maintain narrative continuity. + - This ensures each post references the correct timeline and plot details. + +5. **Season Rollovers** + - After a season ends, **context** from that entire season is folded into the AI’s prompt for the next season. + - This preserves continuity across seasons, allowing characters to evolve over time. + +--- + +## The Importance of a Large Context Window + +To make prompt chaining truly effective, the underlying AI model needs a large **context window**. The **context window** refers to the amount of text (measured in tokens) that the model can “remember” and consider when generating a response. + +- **Why We Use `2.0 Experimental Advanced model in Gemini Advanced.`** + By default, ARAI uses the `Gemini-Exp-1206` model because it offers a large context window. This is ideal for our narrative-driven approach because: + + - **Long-Term Memory:** + The model can retain information from earlier parts of the conversation (e.g., details from previous episodes or seasons), which is crucial for maintaining consistency in long-running storylines. + + - **Complex Narrative Structures:** + A larger context window allows the model to handle intricate plots, multiple characters, and evolving relationships within the narrative. + + - **Reduced Repetition:** + With more context available, the model is less likely to fall back on repetitive phrases or generic responses. + +- **Model Selection and Context Window:** + When choosing a model for ARAI, the size of the context window is a primary consideration. While a larger context window generally improves performance on complex tasks, it can also increase computational cost and latency. The `gemini-pro` model provides a good balance between context size and efficiency for our use case. + +--- + +## Example Flow + +1. **Initialize a “Concept of AI Agent”** + ```plaintext + Prompt: + "You are a comedic AI sidekick from a futuristic Mars colony. Generate a backstory + detailing your origin, personality traits, and comedic style. Also include an + emoji palette and hashtags you frequently use." + ``` +2. **Generate a Character Sheet** + - AI responds with backstory, style notes, emojis, hashtags (`#MarsLife`, `#CosmicComedy`, etc.). +3. **Create a Season Plan** + - _Season 1: “Launch Day”_ with 5 episodes. +4. **Episode 1** + - Provide the AI with _scene outlines_ or _beats_ to cover in episode 1. + - AI generates Scenes 1, 2, 3, each as separate social media posts but referencing each other’s details. +5. **Proceed to Episode 2** + - Summarize Episode 1 outcomes: “In Episode 1, your comedic AI discovered a stowaway on the Mars rocket…” + - The AI crafts next scenes with knowledge of Episode 1’s revelations. +6. **Season Finale** + - Summaries of all episodes in Season 1 inform the _Season 2_ kickoff prompt. + +--- + +## Benefits of This Approach + +- **Narrative Consistency**: By continuously chaining prompts, the AI won’t “forget” critical details and the story remains coherent. +- **Creative Expansion**: You can easily scale from short comedic sketches to grand multi-season arcs. +- **Flexibility**: Adapt the same system for _comics_, _film scripts_, or _novel chapters_, just by tweaking prompts. +- **Engagement**: Social media followers can follow an unfolding storyline rather than seeing disjointed or repetitive posts. + +--- + +## Conclusion + +**ARAI AI Agents** leverages a _story-first, chain-of-thought approach_ to generating content. By structuring the process akin to **Hollywood screenwriting** and dividing it into **seasons, episodes, and scenes**, ARAI creates vibrant, interconnected narratives. Each step references previous context, preventing repetitive output and fostering deeper engagement for readers (or social media audiences). + +If you’d like to learn more about setting up your environment or configuring connectors: + +- Check our [How-To Guides](./how-to-guides.md) for environment & API key setup +- Look at the [Tutorials](./tutorials.md) for step-by-step instructions on building your first season-based storyline + +**Happy storytelling with ARAI!** diff --git a/docs/how-to-guides.md b/docs/how-to-guides.md new file mode 100644 index 0000000..7e60645 --- /dev/null +++ b/docs/how-to-guides.md @@ -0,0 +1,258 @@ +# How-To Guide: Setting up ARAI AI, Google Gemini, and Twitter + +This guide walks you through the essential steps for installing **ARAI AI Agents** in a conda environment, configuring the Google Gemini API key, and authenticating a Twitter account for agent interactions. We also detail how environment variables are managed via a `.env` file using `python-dotenv`. + +--- + +## Table of Contents + +1. [Set Up a Conda Environment](#1-set-up-a-conda-environment) +2. [Install ARAI AI Agents](#2-install-arai-ai-agents) +3. [Obtain a Google Gemini API Key](#3-obtain-a-google-gemini-api-key) +4. [Get a Twitter API Key](#4-get-a-twitter-api-key) +5. [Authenticate Your Twitter Account](#5-authenticate-your-twitter-account) +6. [Debug Mode](#6-debug-mode) +7. [Processing Speed & Wait Times](#7-processing-speed--wait-times) +8. [Next Steps](#8-next-steps) +9. [Troubleshooting](#9-troubleshooting) + +--- + +## 1. Set Up a Conda Environment + +Conda environments keep dependencies isolated and help avoid conflicts with other projects on your system. + +1. **Install or Update Conda** + + - Download and install [Miniconda](https://docs.conda.io/en/latest/miniconda.html) or [Anaconda](https://www.anaconda.com/) if you haven’t already. + - Ensure your conda is up to date: + ```bash + conda update conda + ``` + +2. **Create a New Environment** + - In your terminal or Anaconda Prompt, run: + ```bash + conda create --name arai_ai_agents python=3.11 + ``` + - Activate your new environment: + ```bash + conda activate arai_ai_agents + ``` + +You now have an isolated environment ready for ARAI AI Agents. + +--- + +## 2. Install ARAI AI Agents + +1. **Clone the Repository** + ```bash + git clone https://github.com/arai-ai/arai_ai_agents.git + ``` +2. **Navigate to the Project Directory** + ```bash + cd arai_ai_agents + ``` +3. **Install Dependencies** + Within your `arai_ai_agents` folder, install the required packages: + ```bash + pip install -r requirements.txt + ``` +4. **Run the Main Script** + ```bash + python main.py + ``` + This starts the primary ARAI AI Agents application, which includes agent configurations, connectors, and any prompt-chaining logic. + +--- + +## 3. Obtain a Google Gemini API Key + +_(Note: The steps below are illustrative. Refer to Google’s official documentation for the most up-to-date instructions.)_ + +1. **Sign Up or Log In** + + - Go to [Google Cloud Console](https://console.cloud.google.com/). + +2. **Create a New Project** (if needed) + + - Click **Select a project** → **New Project**. Give it a name, then create it. + +3. **Enable the Gemini API** + + - Navigate to **APIs & Services** → **Library**. + - Search for **Gemini API** (or equivalent) and enable it. + +4. **Create Credentials** + + - Under **APIs & Services** → **Credentials**, click **+ CREATE CREDENTIALS** → **API key**. + - Copy the **API key** (e.g., `AIzaSyD...`). + +5. **Set the Environment Variable** + - Either place it in your system environment: + ```bash + export GEMINI_API_KEY="AIzaSyD..." + ``` + - **Or** place the key in your `.env` file at the root of the project: + ```bash + GOOGLE_GEMINI_API_KEY=AIzaSyD... + ``` + +_(ARAI uses `python-dotenv` to automatically load variables from `.env` if configured.)_ + +--- + +## 4. Get a Twitter API Key + +To allow ARAI AI Agents to interact with Twitter, you need developer credentials. + +1. **Apply for a Twitter Developer Account** + + - Go to the [Twitter Developer Portal](https://developer.twitter.com/) and apply for a Developer account. + +2. **Create a Project & App** + + - Once approved, create a **Project**, then create an **App** within that project. + +3. **Generate Keys & Tokens** + - Under **Keys and tokens**, generate an **API Key**, **API Secret Key**, and **Bearer Token** (or OAuth 2.0 Client if required). + - Copy these values somewhere secure. + +Example `.env` variables: + +```bash +TWITTER_API_KEY=xxxxxxxxxxxxxxxxxxx +TWITTER_API_SECRET=yyyyyyyyyyyyyyyyyyyyyyyyy +TWITTER_BEARER_TOKEN=AAAAAAAAAAAAAAAAAAAAAAA +``` + +--- + +## 5. Authenticate Your Twitter Account + +ARAI AI Agents includes modules or scripts (e.g., `twitter_app_auth.py`) to handle Twitter OAuth or token-based authentication. Below is a typical approach: + +1. **Load Environment Variables** + Make sure you have `python-dotenv` installed and your `.env` file in the project root. For example: + + ```python + from dotenv import load_dotenv + load_dotenv() # This will load your .env variables + ``` + +2. **Locate the Auth File** + + - In `arai_ai_agents/auth/twitter_app_auth.py` (or a similar file): + + ```python + import os + from dotenv import load_dotenv + + load_dotenv() # ensures environment variables are loaded + + TWITTER_API_KEY = os.getenv("TWITTER_API_KEY") + TWITTER_API_SECRET = os.getenv("TWITTER_API_SECRET") + TWITTER_BEARER_TOKEN = os.getenv("TWITTER_BEARER_TOKEN") + + # Additional OAuth logic, if needed + ``` + +3. **Set Your Credentials** + + - Store your credentials in a `.env` file or environment variables. The code snippet above automatically pulls from your environment. + +4. **Run the App** + + - When you run `python main.py`, the application will attempt to initialize the `TwitterConnector` (if configured), using your environment variables. + +5. **Test Connectivity** + + - Use the connector or a test script to verify you can post or retrieve tweets. + - Example: + + ```python + from arai_ai_agents.connectors.twitter_connector import TwitterConnector + import os + + connector = TwitterConnector( + api_key=os.getenv("TWITTER_API_KEY"), + api_secret=os.getenv("TWITTER_API_SECRET"), + bearer_token=os.getenv("TWITTER_BEARER_TOKEN") + ) + connector.test_connection() + ``` + +6. **Twitter Access Tokens** + + - To post on behalf of a user, you will need _access tokens_ for the specific Twitter account. + - The `twitter_app_auth.py` file may contain a function to fetch or handle these tokens. + - Save your access tokens in the `.env` file: + ```bash + TWITTER_ACCESS_TOKEN=XXXXXXXX + TWITTER_ACCESS_TOKEN_SECRET=YYYYYYYY + ``` + +7. **Enable Twitter Live Mode** + - Set `twitter_live = True` in the `main.py` file so you can post to Twitter live: + ```python + twitter_live = True + ``` + - Once successfully authenticated, your ARAI agents can interact with Twitter—posting tweets, reading mentions, or replying to DMs, depending on your configuration. + +--- + +## 6. Debug Mode + +By default, posting to Twitter is **disabled** so you can see generated tweets in log files without actually publishing. This is by design so that you can test AI output before using real APIs: + +- **Log-Only Mode** + The system logs tweets to a `yaml` file, typically located at `configs/agent_folder/agentName_post_log.yaml`. +- **Trial Run** + Check this file to verify the AI is generating appropriate, non-repetitive content. +- **Switch to Live** + Once you’re satisfied, enable `twitter_live = True` to start posting live. + +--- + +## 7. Processing Speed & Wait Times + +Depending on your prompt complexity, **ARAI AI** may take a few minutes to generate a response—especially if the agent is creating **long-form or multiple pieces** of content. The system is waiting for the LLM (e.g., Google Gemini) to process and return a detailed answer. + +- **CLI Feedback** + Keep an eye on your command-line interface (CLI). You’ll see logging messages that indicate whether the agent is still running or if an error occurs. +- **Batch Generation** + If you’re generating content in batches (e.g., multiple tweets or entire episodes), expect longer wait times as the AI compiles all required context. +- **Crash Handling** + If the CLI exits unexpectedly or logs an error, it’s likely that the model or process has crashed. You can check the logs for details and rerun once you’ve addressed the issue. + +_Reminder_: The more context (characters, episodes, story arcs) we include, the more time the model may need to process your request. + +--- + +## 8. Next Steps + +- **Using ARAI with Other Models**: Check out the [API Reference Documentation](api/main.md) for integrating additional LLMs like OpenAI or Anthropic. +- **Setting Up Additional Connectors**: See our [How-To Guides](how-to-guides.md) for adding Discord, Slack, or Telegram connectors. +- **Managing Prompts & Templates**: Explore the [Prompt Reference](yaml/prompts/prompt_chaining.md) for advanced usage of prompt chaining and template customization. + +--- + +## 9. Troubleshooting + +- **Conda Environment Not Found** + Ensure you spelled the environment name correctly or re-run `conda activate arai_ai_agents`. + +- **Credential Errors** + Double-check environment variables are set in your `.env` or system variables. Make sure you restart the shell if you updated `.env`. + +- **Authentication Failures** + Validate your **Google** or **Twitter** keys/tokens in their respective developer dashboards. + +If you run into any issues, feel free to open an [Issue](https://github.com/arai-ai/arai_ai_agents/issues). + +--- + +**That’s it!** You’ve now set up your environment, installed ARAI AI Agents, obtained the necessary API keys, and authenticated your Twitter account. Remember that **complex or large-scale AI tasks** may take a bit longer to generate responses, so don’t worry if you see some delay—it’s just the model crafting detailed content. + +**Happy building with ARAI AI Agents!** diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..5a48240 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,47 @@ +# ARAI AI Agents + +Welcome to the **ARAI AI Agents** documentation site! ARAI (Autonomous Responsive Intelligent Agent) is an advanced AI agent framework designed to create and manage autonomous AI agents. It provides a flexible and powerful system for building, deploying, and orchestrating AI agents for various applications. + +--- + +## Documentation Structure + +We follow the [Diátaxis documentation framework](https://diataxis.fr/) to organize content into four main sections: + +1. [Tutorials](tutorials.md) – Step-by-step guides to get started with ARAI +2. [How-To Guides](how-to-guides.md) – Practical guides for specific ARAI tasks +3. [LLMS Explained](about-llms.md) – Conceptual guides about LLMs and how they work +4. [ARAI AI Agents](explanation.md) – Conceptual guides about ARAI’s architecture and design +5. [Resources](resources.md) – Resources for learning how to program AI agents +6. [API Reference](api/main.md) – Technical reference for ARAI’s APIs and components +7. [Prompt Reference](yaml/prompts/prompt_chaining.md) – Technical reference for ARAI’s prompts and templates + +For **code examples**, **API references**, and **prompt references**, refer to the dedicated pages: + +- [Code Examples](code.md) +- [API Reference](api/main.md) +- [Prompt Reference](yaml/prompts/prompt_chaining.md) + +Quickly find what you’re looking for by using the navigation links on top or in the sidebar. + +--- + +## Project Overview + +ARAI simplifies creating and managing AI agents by providing: + +> 🚀 **Multiple AI Models**: Connect to OpenAI, Anthropic, or other LLMs. +> ⚙️ **Modular Architecture**: Plug and play new connectors (Discord, Twitter, Telegram, etc.) with minimal effort. +> 🔗 **Prompt Chaining**: Build, modify, and chain prompts to accomplish complex tasks. +> 🧠 **Memory & Templates**: Store persistent context and quickly adapt to different use cases. [WIP] +> 📊 **CLI**: Monitor and manage agent interactions in real-time. + +--- + +## Acknowledgements + +This project builds upon various open-source technologies and research in the field of artificial intelligence and autonomous agents. Special thanks to all contributors and the broader AI research community for their ongoing work in advancing agent-based systems. + +--- + +> **Get Started** by checking out the [Tutorials](tutorials.md) or explore the [How-To Guides](how-to-guides.md) for more specific tasks! diff --git a/docs/resources.md b/docs/resources.md new file mode 100644 index 0000000..3470f60 --- /dev/null +++ b/docs/resources.md @@ -0,0 +1,178 @@ +# AI Starter Resource Guide + +Welcome to the **AI Starter Resource Guide**! This document provides a curated set of resources to help you begin (or continue) your journey into artificial intelligence (AI). It covers everything from **Python** programming and environment management to popular **integrated development environments (IDEs)** and AI-specific tools. + +--- + +## Table of Contents + +1. [Python Basics](#1-python-basics) +2. [Conda for Environment Management](#2-conda-for-environment-management) +3. [Code Editors & IDEs](#3-code-editors--ides) + - [Visual Studio Code](#visual-studio-code) + - [Cursor AI](#cursor-ai) +4. [Foundational AI Resources](#4-foundational-ai-resources) +5. [Machine Learning & Deep Learning Frameworks](#5-machine-learning--deep-learning-frameworks) +6. [Online Courses & Tutorials](#6-online-courses--tutorials) +7. [Communities & Forums](#7-communities--forums) +8. [Additional References](#8-additional-references) + +--- + +## 1. Python Basics + +**Python** is the de facto language for AI. Here are a few beginner-friendly resources: + +- **Official Python Docs** + [https://docs.python.org/3/](https://docs.python.org/3/) + The official documentation for Python. Great place to reference built-in modules, syntax details, and best practices. + +- **Automate the Boring Stuff with Python** + [https://automatetheboringstuff.com/](https://automatetheboringstuff.com/) + A free online book that introduces Python through practical tasks and examples. + +- **Python Crash Course** by Eric Matthes + [Amazon Link](https://www.amazon.com/Python-Crash-Course-2nd-Edition/dp/1593279280) (not free, but highly recommended). + Teaches programming concepts, projects, and fundamental Python skills. + +--- + +## 2. Conda for Environment Management + +**Conda** is a widely-used tool for managing virtual environments, especially useful when juggling multiple data science projects or conflicting library versions. + +- **Installing Miniconda or Anaconda** + [https://docs.conda.io/en/latest/miniconda.html](https://docs.conda.io/en/latest/miniconda.html) + Miniconda is a minimal environment, while Anaconda is a more extensive distribution including many data science packages. + +- **Conda Cheat Sheet** + [https://docs.conda.io/projects/conda/en/latest/user-guide/cheatsheet/](https://docs.conda.io/projects/conda/en/latest/user-guide/cheatsheet/) + Quick reference for common commands (create envs, install packages, etc.). + +- **Practical Tips** + 1. `conda create --name myenv python=3.9` – Create a new environment. + 2. `conda activate myenv` – Activate the new environment. + 3. `conda install numpy` – Install a package into the active environment. + +--- + +## 3. Code Editors & IDEs + +A comfortable coding environment makes learning AI more enjoyable and productive. + +### Visual Studio Code + +- **VS Code** + [https://code.visualstudio.com/](https://code.visualstudio.com/) + A free, lightweight yet powerful editor with a robust extension ecosystem. + +- **Python Extension** + [https://marketplace.visualstudio.com/items?itemName=ms-python.python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) + Adds support for Python syntax, IntelliSense, debugging, linting, and more. + +- **Remote Development** + [https://code.visualstudio.com/docs/remote/remote-overview](https://code.visualstudio.com/docs/remote/remote-overview) + Work in containers, WSL, or remote machines — useful for data-intensive AI projects. + +### Cursor AI + +- **Cursor AI** + [https://www.cursor.so/](https://www.cursor.so/) + A specialized code editor powered by AI. Cursor AI can provide in-editor suggestions, code completions, and debugging help tailored for data science and machine learning code. + +- **Setup & Documentation** + The site offers guides on how to integrate AI-based coding assistance into your workflow. + +--- + +## 4. Foundational AI Resources + +- **Andrew Ng’s “AI Transformation Playbook”** + [https://landing.ai/ai-transformation-playbook/](https://landing.ai/ai-transformation-playbook/) + A high-level overview of how companies adopt AI, also helpful to understand AI project lifecycles. + +- **Stanford’s CS229: Machine Learning** + [https://cs229.stanford.edu/](https://cs229.stanford.edu/) + Lecture materials, notes, and assignments from one of the most popular ML courses. + +--- + +## 5. Machine Learning & Deep Learning Frameworks + +- **TensorFlow** + [https://www.tensorflow.org/](https://www.tensorflow.org/) + An end-to-end open-source platform for machine learning from Google. Popular for deep learning, also supports a wide range of machine learning tasks. + +- **PyTorch** + [https://pytorch.org/](https://pytorch.org/) + A popular framework by Meta (Facebook). Known for its dynamic computation graph and ease of experimentation. Favored by many researchers. + +- **scikit-learn** + [https://scikit-learn.org/stable/](https://scikit-learn.org/stable/) + Perfect for traditional machine learning algorithms. Great documentation and easy to integrate into Python projects. + +- **Hugging Face** + [https://huggingface.co/](https://huggingface.co/) + A platform & library for state-of-the-art NLP and other ML tasks. With Transformers, you can quickly experiment with large language models (LLMs). + +--- + +## 6. Online Courses & Tutorials + +- **Coursera** + + - “Machine Learning” by Andrew Ng (classic intro course). + - “Deep Learning Specialization” by Andrew Ng. + +- **fast.ai** + [https://www.fast.ai/](https://www.fast.ai/) + Practical deep learning courses that don’t require advanced math prerequisites. + +- **Kaggle** + [https://www.kaggle.com/](https://www.kaggle.com/) + Hosts ML competitions. Offers free data sets and interactive tutorials (Kaggle Learn). Great for hands-on practice and portfolio building. + +--- + +## 7. Communities & Forums + +- **Reddit /r/MachineLearning** + [https://www.reddit.com/r/MachineLearning/](https://www.reddit.com/r/MachineLearning/) + News, papers, and discussions on ML. + +- **Stack Overflow** + [https://stackoverflow.com/](https://stackoverflow.com/) + Essential Q&A site for programming issues. + +- **Hugging Face Forums** + [https://discuss.huggingface.co/](https://discuss.huggingface.co/) + Focused on Transformers, NLP, and specialized model usage. + +- **Discord Communities** + Many open-source ML or AI project communities have active Discord servers. For instance, Hugging Face, PyTorch, etc. + +--- + +## 8. Additional References + +- **Papers with Code** + [https://paperswithcode.com/](https://paperswithcode.com/) + Tracks the latest in AI research along with code implementations. + +- **Arxiv** + [https://arxiv.org/](https://arxiv.org/) + The go-to place for preprints on ML, NLP, CV (computer vision), and other AI research fields. + +- **YouTube Channels** + - **3Blue1Brown**: Explains math and ML concepts visually. + - **Two Minute Papers**: Summaries of recent AI papers. + +--- + +## Final Notes + +- **Practice**: The best way to learn AI is by doing. Try small projects on Kaggle or your own dataset. +- **Stay Updated**: AI research moves quickly. Follow conferences like NeurIPS, ICLR, ICML, and domain-specific communities. +- **Experiment**: Tools like **VS Code** or **Cursor AI** can speed up your development and debugging. Combine them with **Conda** to keep your environment clean. + +**We wish you the best on your AI journey!** Remember that the AI field is broad and constantly evolving—there’s always something new to learn or try. Happy coding! diff --git a/docs/tutorials.md b/docs/tutorials.md new file mode 100644 index 0000000..1445eeb --- /dev/null +++ b/docs/tutorials.md @@ -0,0 +1,219 @@ +# Getting Started with the Gemini API using Python + +This tutorial will guide you through the process of setting up and making your first request to the Gemini API using the Google's Generative AI Python library. + +--- + +## Table of Contents + +1. [Prerequisites](#prerequisites) +2. [Configure Your API Key](#configure-your-api-key) +3. [Initialize the Model](#initialize-the-model) +4. [Make Your First Request](#make-your-first-request) +5. [Using the Chat Interface](#using-the-chat-interface) +6. [Exploring Further](#exploring-further) +7. [Troubleshooting](#troubleshooting) +8. [Conclusion](#conclusion) + +--- + +## Prerequisites + +Before you begin, make sure you have the following: + +- **Python 3.11+ installed** + You can check your Python version by running: + + ```bash + python --version + ``` + + or: + + ```bash + python3 --version + ``` + +- **A Google Cloud Project** + If you don't have one, create a new project in the [Google Cloud Console](https://console.cloud.google.com/). + +- **A Gemini API Key** + + 1. Go to [Google AI Studio](https://ai.google.dev/). + 2. Click on **"Get API Key"**. + 3. Select your Google Cloud Project where you want to enable the API. + 4. Click on **"Create API Key"**. Copy this key; you'll need it later. + +- **The `google-generativeai` Python library** + You can install it using pip: + ```bash + pip install google-generativeai + ``` + +--- + +## Configure Your API Key + +The `google-generativeai` library needs your API key to authenticate your requests to the Gemini API. There are a couple of ways to provide it: + +### Method 1: Environment Variable (Recommended) + +1. Set an environment variable named `GOOGLE_API_KEY` with your API key as the value. + + - **Linux/macOS:** + + ```bash + export GOOGLE_API_KEY="YOUR_API_KEY" + ``` + + - **Windows:** + ```bash + setx GOOGLE_API_KEY "YOUR_API_KEY" + ``` + _(You might need to restart your console or IDE for it to take effect.)_ + +2. Then in your Python code, configure like this: + + ```python + import google.generativeai as genai + import os + + genai.configure(api_key=os.environ.get("GOOGLE_API_KEY")) + ``` + +### Method 2: Directly in Your Code (Less Secure) + +You can set your API key directly in your Python code. **However, this is less secure, especially if you are sharing or versioning your code.** + +```python +import google.generativeai as genai + +genai.configure(api_key="YOUR_API_KEY") # Replace "YOUR_API_KEY" with your actual key +``` + +--- + +## Initialize the Model + +Now, let's initialize the `GenerativeModel` with the `gemini-pro` model: + +```python +import google.generativeai as genai + +# ... API key configuration (see "Configure Your API Key") ... + +model = genai.GenerativeModel("gemini-pro") +``` + +--- + +## Make Your First Request + +Let's send a simple prompt to the Gemini API and get a response: + +```python +import google.generativeai as genai + +# ... API key configuration and model initialization (see "Configure Your API Key" & "Initialize the Model") ... + +prompt = "What is the capital of France?" + +response = model.generate_content(prompt) + +print(response.text) +``` + +**Expected Output:** + +``` +The capital of France is Paris. +``` + +_(Or a similar, more elaborate response.)_ + +**Explanation**: + +- **prompt**: This variable holds the text prompt you are sending to the model. +- **model.generate_content(prompt)**: This calls the API, sending the prompt and receiving the generated content. +- **response.text**: This accesses the text part of the response from the model. + +--- + +## Using the Chat Interface + +The Gemini API also supports a **chat interface** where you can have back-and-forth conversations. + +```python +import google.generativeai as genai + +# ... API key configuration (see "Configure Your API Key") ... + +model = genai.GenerativeModel("gemini-pro") + +messages = [] + +messages.append({ + "role": "user", + "parts": ["What is the capital of France?"] +}) + +response = model.generate_content(messages) +print(response.text) + +# Add model's response back into the conversation history +messages.append({ + "role": "model", + "parts": [response.text] +}) + +# User asks another question +messages.append({ + "role": "user", + "parts": ["And what is its population?"] +}) + +response = model.generate_content(messages) +print(response.text) +``` + +### Explanation + +- **messages**: This list stores the history of your conversation. +- **Adding messages**: Each item in `messages` is a dictionary with: + - **role**: Either `"user"` or `"model"`. + - **parts**: A list of strings (or other content parts) representing the message content. +- **model.generate_content(messages)**: Takes the entire message history to provide context for the model. +- **Appending the model's response**: To maintain conversation flow, you append the AI's response to `messages` so it “remembers” earlier turns. + +--- + +## Exploring Further + +- **More Model Parameters** + Check out the Google AI for Developers documentation to learn about additional parameters (e.g., `temperature`, `top_k`, `top_p`) for controlling the model's generation. +- **Safety Settings** + You can configure safety settings to control what type of content the model generates. See the **Safety Settings** documentation. + +- **Other Models** + Explore other available models, such as `gemini-pro-vision` for multimodal input (text + images). + +--- + +## Troubleshooting + +- **API key not found error** + Make sure your API key is correctly configured as an environment variable or in your code. +- **PermissionDenied error** + Verify that the API key is associated with a Google Cloud project that has the Gemini API enabled. +- **Other errors** + Refer to the Gemini API documentation for more detailed error messages and troubleshooting steps. + +--- + +## Conclusion + +Congratulations! You've now successfully made your first request to the Gemini API and even tried out a simple conversation. This is just the beginning of what you can do with this powerful API. Explore the documentation and experiment with different prompts and model parameters to unlock the full potential of **Google's Generative AI** models. + +``` + +``` diff --git a/docs/yaml/agent_template.yaml b/docs/yaml/agent_template.yaml new file mode 100644 index 0000000..6eecd73 --- /dev/null +++ b/docs/yaml/agent_template.yaml @@ -0,0 +1,15 @@ +name: +personality: +communication_style: +backstory: +universe: +topic_expertise: +hashtags: +emojis: +model_type: "gemini" +model_name: "gemini-exp-1206" +memory_store: "gemini_chroma" +connectors: + twitter: true + telegram: false + discord: false diff --git a/docs/yaml/episode_template.yaml b/docs/yaml/episode_template.yaml new file mode 100644 index 0000000..c2d439a --- /dev/null +++ b/docs/yaml/episode_template.yaml @@ -0,0 +1,15 @@ +episode: + season_number: + episode_name: + episode_number: + episode_overview: | + episode_summary: | + episode_highlights: | + episode_posted: False + current_post_number: 0 + posts: + - post_id: + post_number: + post_content: | + post_highlights: | + post_posted: False diff --git a/docs/yaml/prompt_chaining.yaml b/docs/yaml/prompt_chaining.yaml new file mode 100644 index 0000000..6bc9ddf --- /dev/null +++ b/docs/yaml/prompt_chaining.yaml @@ -0,0 +1,181 @@ +prompt_1 (Character Sheet Creation): | + You are an expert in creative writing, character design, world-building, and marketing. You are tasked with developing a complete character profile for a new agent who will be featured in stories for a Twitter bot. These stories will be broken down into seasons, episodes, and individual tweets (scenes/posts). + + Agent Development Task + Generate a comprehensive YAML file that defines this new agent, including their name, personality, communication style, topic of expertise, backstory, universe, relevant hashtags, and emojis. + Use the following concept if its not empty, otherwise create one. + - concept: {{ concept }} + + Specific Instructions: + + 1. Invent a Creative Name: + - If no specific name is provided, create a unique and fitting name for the agent based on the concept of the agent. The name should be suitable for a Twitter handle. + - Agent Name: {{ agent_name }} + + 2. Define the Topic: + - If no specific topic is provided, default to "Crypto" or invent a creative topic that lends itself to episodic storytelling. + - Topic: {{ topic }} + + 3. Develop Personality and Style: + - Create a detailed personality for the agent. + - Define a clear communication style for the agent. + - Important: Use the YAML block scalar style with the `|` character to preserve newlines and formatting. + - Example: + ```yaml + personality: | + This is a multi-line + description of the agent's + personality. + ``` + - Personality: {{ personality }} + - Communication Style: {{ style }} + + 4. Craft a Backstory: + - Invent a compelling and original backstory for the agent that explains their motivations, skills, and current situation. This backstory should be suitable for unfolding gradually over multiple story arcs. + - Important: Use the YAML block scalar style with the `|` character to preserve newlines and formatting. + - Example: + ```yaml + backstory: | + This is a longer, multi-line + backstory for the agent. + It can span several lines. + ``` + - Backstory: {{ backstory }} + + 5. Describe the Universe: + - Detail the world(s) or setting where the agent operates. Consider the current state of technology, the social and political landscape, major organizations or factions, and any unique elements relevant to the chosen topic. + - Use a narrative or bullet-point format within the YAML. + - Important: Use the YAML block scalar style with the `|` character to preserve newlines and formatting. + - Example: + ```yaml + universe: | + This is a description + of the agent's universe. + It can have multiple lines + and paragraphs. + ``` + - Universe: {{ universe }} + + 6. Generate Marketing Elements: + - Create a list of relevant hashtags that will be used for social media promotion. Include hashtags related to the agent's name, topic, and genre. + - Important: Output the hashtags as a YAML array using block style. This means each hashtag should be on a new line, preceded by a hyphen and a space and placed inside double quotes. + - Example: + ```yaml + hashtags: + - "#example1" + - "#example2" + - "#longerExampleHashtag" + ``` + - Create a list of relevant emojis that can be used in tweets to add visual interest and convey meaning. + - Important: Output the emojis as a YAML array using block style. Each emoji should be on a new line, preceded by a hyphen and a space and placed inside double quotes. + - Example: + ```yaml + emojis: + - "🐳" + - "🌊" + - "🚀" + ``` + - Hashtags: {{ hashtags }} + - Emojis: {{ emojis }} + + Output Requirements: + - Only output valid YAML. Do not include any text outside of the YAML structure. + - Output a single, complete YAML file that includes all the fields mentioned above (name, personality, communication_style, topic, backstory, universe, hashtags, emojis). + - Adhere to the specified answer lengths for each field (short for personality and communication style, long for backstory and universe). + + Output exactly as the yaml file: + ```yaml + {{ agent_yaml }} + ``` + +prompt_2 (Season Creation): | + You are an expert in creative writing, season/episode design, and structured storytelling. + Your goal is to create a new season for {{ agent_name }}, who was previously defined in the following agent YAML: + + {{ agent_yaml }} + + Previous season: + - This provides the previous season details, including description and highlights for the season. Ignore if none is provided as this means we are creating season 1, so there is no previous season. + {{ previous_season }} + + --- + ## Task: Season Creation + + Generate a single valid YAML file that defines a new season for this agent. The season should include: + + - Season Name: If none is provided, create a unique and fitting name based on {{ agent_name }} and the agent’s YAML. + - Use something that can also work as a Twitter hashtag. + - Season Name: {{ season_name }} + + - Season Number: If none is provided, default to 1. + - Season Number: {{ season_number }} + + - Season Description: If none is provided, create a unique description based on {{ agent_name }}’s YAML. + - Important: Use the YAML block scalar style with the `|` character to preserve newlines and formatting. + - Season Description: {{ season_description }} + + - Season Highlights: If none is provided, invent highlights relevant to the agent’s concept or storyline. + - Important: Use the YAML block scalar style with the `|` character to preserve newlines and formatting. + - Season Highlights: {{ season_highlights }} + + - Season Summary: If none is provided, create a concise summary that captures the essence of this season. + - Important: Use the YAML block scalar style with the `|` character to preserve newlines and formatting. + - Season Summary: {{ season_summary }} + + - Episodes: We want **28 episodes** total (one for each day over 4 weeks). + - If none are provided, create 28 unique episodes. + - Each episode entry should have: + - `episode_id` + - `episode_name` + - `episode_number` + - `episode_description` (Use `|` for multi-line) + - `episode_highlights` (Use `|` for multi-line) + - `episode_posted` (default `False`) + - `episode_summary` (Use `|` for multi-line) + + Output Requirements: + - Only output valid YAML. Do not include any text outside of the YAML structure. + - Output a single, complete YAML file that includes all the fields mentioned above (season_name, season_number, season_description, season_highlights, season_summary, episodes). + + Output exactly as the yaml file: + ```yaml + {{ season_yaml }} + +prompt_3 (Episode Posts Creation): | + You are an expert in creative writing, social media engagement, and character voice development. Your task is to generate {{ number_of_posts }} short "updates" (tweets/posts) for the agent {{ agent_name }} in the style of Twitter posts. These posts are for season {{ season_number }}, episode {{ episode_number }}. + + Agent and Context: + + * Agent YAML: {{ agent_yaml }} (This provides the agent's personality, backstory, etc.) + * Season YAML: {{ season_yaml }} (This provides the season details, including description and highlights for the season) + * Episode YAML: {{ episode_yaml }} (This provides the episode details, including description and highlights for the episode) + * Previous Episode YAML: {{ previous_episode }} (This provides the previous episode details, including description and highlights for the episode. Ignore if none is provided as this means we are creating episode 1, so there is no previous episode) + **Post Requirements:** + + Each post should: + + * Reflect Agent's Personality: Be consistent with {{ agent_name }}'s personality, tone, and communication style as defined in the agent YAML. + * Relate to Setting/Technology: Reference elements of the setting, technology, or other relevant details from the agent's universe as defined in the agent YAML. + * Incorporate Episode Context: Align with the season overview and specific episode overview provided in the season YAML. + * Highlight Observations: Center around misunderstandings, comedic observations, or serious reflections relevant to the episode's theme. + * Consider Emojis: Optionally use emojis from this set: {{ agent_yaml }} or use any emojis that are relevant to the episode's theme. + * Consider Hashtags: Optionally use hashtags from this set: {{ agent_yaml }} or use any hashtags that are relevant to the episode's theme. + * Length Constraint: Each post must be under {{ post_length }} characters. + * Sign-Off: End each post with the sign-off: "#{{ agent_name }}" + + **YAML Output Format:** + + Output a valid YAML file containing a list of posts under the `posts` key. Each post should be a separate entry in the list and include the following: + + * `post_id`: A unique identifier for the post (e.g., s1\_e1\_post1, s1\_e1\_post2). + * `post_number`: The ordinal number of the post within the episode (e.g., 1, 2, 3). + * `post_content`: The actual text of the post, formatted using the YAML block scalar style (`|`) to preserve newlines, do not use '-' for the first line. + * `post_highlights`: A brief, one-sentence description of the key takeaway or event in the post (using `|` for multi-line), do not use '-' for the first line. + * `post_posted`: Set to `False` by default. + + **Output Requirements:** + - **Only output valid YAML.** Do not include any text outside of the YAML structure. + - **Output the yaml file:** + ```yaml + {{ episode_yaml }} + ``` diff --git a/docs/yaml/prompts/prompt_chaining.md b/docs/yaml/prompts/prompt_chaining.md new file mode 100644 index 0000000..1291699 --- /dev/null +++ b/docs/yaml/prompts/prompt_chaining.md @@ -0,0 +1,5 @@ +# Prompt Chaining + +```yaml linenums='1' +{ % include "yaml/prompt_chaining.yaml" % } +``` diff --git a/docs/yaml/season_template.yaml b/docs/yaml/season_template.yaml new file mode 100644 index 0000000..d2dc562 --- /dev/null +++ b/docs/yaml/season_template.yaml @@ -0,0 +1,15 @@ +season: + season_name: + season_number: + season_description: | + season_highlights: | + season_summary: | + season_posted: False + current_episode_number: 0 + episodes: + episode_name: + episode_number: + episode_description: | + episode_highlights: | + episode_summary: | + episode_posted: False diff --git a/docs/yaml/templates/agent_template.md b/docs/yaml/templates/agent_template.md new file mode 100644 index 0000000..fccf337 --- /dev/null +++ b/docs/yaml/templates/agent_template.md @@ -0,0 +1,5 @@ +# Agent Template + +```yaml linenums='1' +{ % include "yaml/agent_template.yaml" % } +``` diff --git a/docs/yaml/templates/episode_template.md b/docs/yaml/templates/episode_template.md new file mode 100644 index 0000000..95733d6 --- /dev/null +++ b/docs/yaml/templates/episode_template.md @@ -0,0 +1,5 @@ +# Episode Template + +```yaml linenums='1' +{ % include "yaml/episode_template.yaml" % } +``` diff --git a/docs/yaml/templates/season_template.md b/docs/yaml/templates/season_template.md new file mode 100644 index 0000000..f66c6da --- /dev/null +++ b/docs/yaml/templates/season_template.md @@ -0,0 +1,5 @@ +# Season Template + +```yaml linenums='1' +{ % include "yaml/season_template.yaml" % } +``` diff --git a/docs/yaml/templates/tracker_template.md b/docs/yaml/templates/tracker_template.md new file mode 100644 index 0000000..f10ca53 --- /dev/null +++ b/docs/yaml/templates/tracker_template.md @@ -0,0 +1,5 @@ +# Tracker Template + +```yaml linenums='1' +{ % include "yaml/tracker_template.yaml" % } +``` diff --git a/docs/yaml/tracker_template.yaml b/docs/yaml/tracker_template.yaml new file mode 100644 index 0000000..e7470b2 --- /dev/null +++ b/docs/yaml/tracker_template.yaml @@ -0,0 +1,4 @@ +current_season_number: 1 +current_episode_number: 1 +current_post_number: 0 +post_every_x_minutes: 60 diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..e9fb8cd --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,102 @@ +site_name: ARAI AI Agents +site_description: Documentation for ARAI AI Agents +site_author: TheBlockRhino + +# The docs directory (where your .md files live) +docs_dir: docs + +# Build directory (where MkDocs will output the static site) +site_dir: site + +theme: + name: material + features: + - navigation.tabs + - navigation.sections + - toc.integrate + - navigation.top + - navigation.expand + - search.suggest + - search.highlight + - content.tabs.link + - content.code.annotation + - content.code.copy + language: en + palette: + - scheme: slate + toggle: + icon: material/toggle-switch + name: Switch to light mode + primary: teal + accent: lime + - scheme: default + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + primary: teal + accent: purple + logo: assets/images/AVA_LOG_BASE_WHITE.png + +extra: + social: + - icon: fontawesome/brands/github-alt + link: https://github.com/ARAIDevHub/arai_ai_agents + - icon: fontawesome/brands/twitter + link: https://twitter.com/ARAI_AI_AGENTS + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - admonition + - pymdownx.arithmatex: + generic: true + - footnotes + - pymdownx.details + - pymdownx.superfences + - pymdownx.mark + - attr_list + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + +plugins: + - search + - gen-files: + scripts: + - scripts/gen_ref_py_pages.py + - scripts/gen_ref_yaml_pages.py + - literate-nav: + nav_file: SUMMARY.md + - include-markdown + - section-index + - mkdocstrings: + handlers: + python: + paths: [.] + options: + show_source: true + show_root_heading: true + docstring_style: google + +nav: + - Home: index.md + - ARAI CLI Usage Guide: cli-guide.md + - How-to Guides: how-to-guides.md + - AI Tutorial: tutorials.md + - LLMS Explained: about-llms.md + - ARAI AI Agents: explanation.md + - Resources: resources.md + - API Reference: api/ + - Prompt Reference: + - Prompts: + - Prompt Chaining: yaml/prompts/prompt_chaining.md + - Templates: + - Agent Template: yaml/templates/agent_template.md + - Episode Template: yaml/templates/episode_template.md + - Season Template: yaml/templates/season_template.md + - Tracker Template: yaml/templates/tracker_template.md + +copyright: | + © 2024 <a href="https://github.com/ARAIDevHub" target="_blank" rel="noopener">ARAIDevHub</a> diff --git a/packages/twitter_playwright/twitter_api_free_connector.py b/packages/twitter_playwright/twitter_api_free_connector.py new file mode 100644 index 0000000..b1e8400 --- /dev/null +++ b/packages/twitter_playwright/twitter_api_free_connector.py @@ -0,0 +1,113 @@ +import os +from dotenv import load_dotenv +from playwright.sync_api import sync_playwright + +load_dotenv() + +# Add this at the top level of the file +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +STATE_FILE = os.path.join(SCRIPT_DIR, "state.json") + +def login_and_save_state(username, password, phone_or_username, storage_path=STATE_FILE): + with sync_playwright() as p: + browser = p.chromium.launch(headless=False, slow_mo=1000) # delay for 1 second for all actions + context = browser.new_context() + page = context.new_page() + + # 1) Navigate to login + page.goto("https://x.com/login") + page.wait_for_timeout(1000) # optional + + # 2) Fill in username & password (this is just an example, update selectors as needed) + page.wait_for_selector('input[name="text"]', timeout=10000) + page.fill('input[name="text"]', username) + # page.click('div:has-text("Next")') + page.keyboard.press("Enter") + + # Unusal activity + try: + # Attempt to find the suspicious activity input + page.wait_for_selector('input[data-testid="ocfEnterTextTextInput"]', timeout=3000) + print("[INFO] Unusual login activity popup detected.") + + # Fill it with phone/username + page.fill('input[data-testid="ocfEnterTextTextInput"]', phone_or_username) + # page.click('div:has-text("Next")') # Or the appropriate button text + page.keyboard.press("Enter") + page.wait_for_load_state("networkidle") + print("[INFO] Challenge response submitted.") + + except TimeoutError: + print("[INFO] No suspicious login activity popup. Continuing normal flow.") + + # Password + page.wait_for_selector('input[name="password"]', timeout=10000) + page.fill('input[name="password"]', password) + # page.click('div:has-text("Log in")') + page.keyboard.press("Enter") + + # 3) Wait until the user is on the home feed + page.wait_for_url(lambda url: "home" in url, timeout=15000) + print("[INFO] Logged in successfully (assuming no extra checks).") + + # 4) Save the current browser context's storage state to a file + context.storage_state(path=storage_path) + print(f"[INFO] Storage state saved to {storage_path}.") + + browser.close() + +def post_tweet_with_saved_state(tweet_text, storage_path=STATE_FILE): + with sync_playwright() as p: + # Create a new context with the previously saved state + browser = p.chromium.launch(headless=False) + context = browser.new_context(storage_state=storage_path) + page = context.new_page() + + # Now page is already logged in if state.json is still valid + page.goto("https://x.com/home") + # Wait a bit for the home feed to render + page.wait_for_timeout(1000) # optional + # page.wait_for_load_state("networkidle") + print("[INFO] Checking if we are indeed logged in...") + + # Post a tweet + tweet_box_selector = 'div[data-testid="tweetTextarea_0"]' + page.wait_for_selector(tweet_box_selector, timeout=10000) + page.fill(tweet_box_selector, tweet_text) + + # post_button_selector = 'div[data-testid="tweetButtonInline"]' + post_button_selector = 'button[data-testid="tweetButtonInline"]' + # page.wait_for_selector(post_button_selector, state="visible", timeout=20000) # Wait for visible + + page.wait_for_selector(post_button_selector, timeout=10000) + page.click(post_button_selector) + page.wait_for_timeout(3000) + print("[INFO] Tweet posted (assuming no errors).") + + browser.close() + + +def main(tweet_content): + # Test post + X_POST_TEXT = tweet_content + + # check if state.json exist + if os.path.exists(STATE_FILE): + print(f"[INFO] state.json exists at {STATE_FILE}. Using existing state.") + else: + print(f"[INFO] state.json does not exist at {STATE_FILE}. Logging in and saving state.") + + login_and_save_state( + username=os.getenv("X_USERNAME"), + password=os.getenv("X_PASSWORD"), + phone_or_username=os.getenv("X_PHONE_OR_USERNAME"), + storage_path=STATE_FILE + ) + + post_tweet_with_saved_state( + tweet_text=X_POST_TEXT, + storage_path=STATE_FILE + ) + +if __name__ == "__main__": + main("Hello") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..17e9445 Binary files /dev/null and b/requirements.txt differ diff --git a/scripts/gen_ref_py_pages.py b/scripts/gen_ref_py_pages.py new file mode 100644 index 0000000..60f88ea --- /dev/null +++ b/scripts/gen_ref_py_pages.py @@ -0,0 +1,68 @@ +"""Generate the code reference pages and navigation.""" +from pathlib import Path +import mkdocs_gen_files + +nav = mkdocs_gen_files.Nav() + +root = Path(__file__).parent.parent +src = root / "arai_ai_agents" + +print(f"Looking for Python files in: {src}") + +# First, process __init__.py files to create module indexes +for path in sorted(src.rglob("__init__.py")): + module_path = path.relative_to(src).parent + doc_path = path.relative_to(src).parent / "index.md" + full_doc_path = Path("api", doc_path) + + parts = tuple(module_path.parts) + + if parts: + # Create the module index page + with mkdocs_gen_files.open(full_doc_path, "w") as fd: + ident = "arai_ai_agents" + if parts: + ident += "." + ".".join(parts) + print(f"Writing module index: {ident}") + fd.write(f"# {parts[-1] if parts else 'arai_ai_agents'}\n\n") + fd.write(f"::: {ident}") + + mkdocs_gen_files.set_edit_path(full_doc_path, path.relative_to(root)) + +# Then process other Python files +for path in sorted(src.rglob("*.py")): + module_path = path.relative_to(src).with_suffix("") + doc_path = path.relative_to(src).with_suffix(".md") + full_doc_path = Path("api", doc_path) + + parts = tuple(module_path.parts) + + if parts[-1] == "__init__": + continue # Skip __init__.py files as they're already processed + elif parts[-1] == "__main__": + continue + elif "_pycache_" in str(path): + continue + + # Use nested navigation to ensure collapsible sections + if len(parts) > 1: + nav[parts[:-1] + (parts[-1],)] = doc_path.as_posix() + else: + nav[parts] = doc_path.as_posix() + + print(f"Added to nav: {parts} -> {doc_path.as_posix()}") + + with mkdocs_gen_files.open(full_doc_path, "w") as fd: + ident = "arai_ai_agents." + ".".join(parts) + print(f"Writing docs for: {ident}") + fd.write(f"# {parts[-1]}\n\n") # Add a title + fd.write(f"::: {ident}") + + mkdocs_gen_files.set_edit_path(full_doc_path, path.relative_to(root)) + +# Write the navigation file +summary_file = Path("api/SUMMARY.md") +with mkdocs_gen_files.open(summary_file, "w") as nav_file: + for line in nav.build_literate_nav(): + # Convert *-based bullet points to `-` for MkDocs + nav_file.write(line.replace("*", "-")) diff --git a/scripts/gen_ref_yaml_pages.py b/scripts/gen_ref_yaml_pages.py new file mode 100644 index 0000000..adedff2 --- /dev/null +++ b/scripts/gen_ref_yaml_pages.py @@ -0,0 +1,53 @@ +import shutil +from pathlib import Path + +def create_markdown_for_yaml(yaml_path, output_file): + """ + Generate markdown content for a given YAML file. + """ + # Copy the YAML file to the docs/yaml directory + target_yaml_dir = root_dir / "docs" / "yaml" + target_yaml_dir.mkdir(parents=True, exist_ok=True) + target_yaml_path = target_yaml_dir / yaml_path.name + shutil.copy(yaml_path, target_yaml_path) + + # Path relative to the docs directory + relative_path = target_yaml_path.relative_to(root_dir / "docs").as_posix() + + with open(output_file, "w") as md_file: + md_file.write(f"# {yaml_path.stem.replace('_', ' ').title()}\n\n") + md_file.write(f"```yaml linenums='1'\n") + md_file.write(f"{{% include \"{relative_path}\" %}}\n") + md_file.write(f"```\n") + print(f"Generated markdown: {output_file} and copied YAML to {target_yaml_path}") + +def process_yaml_files(): + """ + Automatically find YAML files and create markdown documentation. + """ + yaml_source = root_dir / "arai_ai_agents" # YAML source folder + output_dir = root_dir / "docs" / "yaml" + + print(f"Looking for YAML files in: {yaml_source}") + output_dir.mkdir(parents=True, exist_ok=True) + + for yaml_file in yaml_source.rglob("*.yaml"): + # Skip the 'configs' and 'responses' directories and their subfolders + if any(skip_dir in yaml_file.parts for skip_dir in ["configs", "responses"]): + print(f"Skipping file in excluded folder: {yaml_file}") + continue + + print(f"Found YAML file: {yaml_file}") + + # Create output path based on the YAML file's relative structure + relative_path = yaml_file.relative_to(yaml_source) + output_path = output_dir / relative_path.with_suffix(".md") + output_path.parent.mkdir(parents=True, exist_ok=True) + + # Generate markdown for the YAML file + create_markdown_for_yaml(yaml_file, output_path) + + +if __name__ == "__main__": + root_dir = Path(__file__).parent.parent # Define the root of the project + process_yaml_files() diff --git a/server/__init__.py b/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api.py b/server/api.py new file mode 100644 index 0000000..122cbd4 --- /dev/null +++ b/server/api.py @@ -0,0 +1,527 @@ +""" +API Server Module + +This module implements the Flask REST API server that handles agent creation, +chat interactions, content generation and other core functionality. + +Key Features: +- Agent creation and management +- Chat interactions with agents +- Season and episode content generation +- Chat history tracking +""" + +from flask import Flask, jsonify, request, make_response +from flask_cors import CORS +from dotenv import load_dotenv +import os +import json +import glob +from pprint import pprint +from prompt_chaining.step_1_create_agent import create_agent as generateAgent +from models.openai_model import OpenAIModel +from prompt_chaining.step_5_agent_chat import agent_chat +from prompt_chaining.step_2_create_content import create_seasons_and_episodes +from prompt_chaining.step_3_create_posts import create_episode_posts +from utils.post_manager import PostManager +from utils.scheduler import AgentScheduler + + +# Load environment variables +load_dotenv() + +#Global Post Manager - Will be instantiated when a user logs in to Twitter +global post_manager_twitter + +# Initialize Flask app with 20MB max content size +app = Flask(__name__) +app.config['MAX_CONTENT_LENGTH'] = 20 * 1024 * 1024 # 20 MB + +# Configure CORS for frontend origin +CORS(app, resources={r"/api/*": { + "origins": ["https://g0c0848ggco0cgw4gss8gws0.dev3vds1.link", "http://localhost:5173"], + "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"], + "allow_headers": ["Content-Type"] +}}) + +# Create global AI model instance +ai_model = OpenAIModel() + +@app.route('/') +def show(): + return "Hello APi works" + +# Post reques to create a random agent with no prompt +@app.route('/api/agents/random', methods=['POST']) +def create_random_agent(): + """ + Creates a new random agent with optional concept. + + Request Body: + concept (str, optional): Initial concept for the agent + + Returns: + JSON: Generated agent data + int: HTTP status code + """ + # Get concept from request body if provided + data = request.get_json() if request.is_json else {} + concept = data.get('concept', '') # Default to empty string if no concept provided + + print("[create_random_agent] - Creating a random agent", f"concept: {concept}" if concept else "") + + # Remove the local instantiation and use global ai_model + print("Using global Gemini Model instance", ai_model) + + # Create RandomAgents directory if it doesn't exist + random_agents_dir = os.path.join('configs', 'RandomAgents') + os.makedirs(random_agents_dir, exist_ok=True) + + # Call the generateAgent function with the concept + generated_master_file_path = generateAgent(ai_model, concept) + print(f"[create_random_agent] - generatedMasterFilePath for generatedAgent: {generated_master_file_path}") + + try: + if not generated_master_file_path: + return jsonify({"error": "No file path generated"}), 500 + + # Get just the filename without path and extension + base_filename = os.path.basename(generated_master_file_path) + name_without_ext = os.path.splitext(base_filename)[0] + + # Replace _master with _random in the filename + name_without_ext = name_without_ext.replace('_master', '_random') + + # Generate unique filename in the RandomAgents directory + counter = 1 + final_path = os.path.join(random_agents_dir, f"{name_without_ext}.json") + while os.path.exists(final_path): + filename = f"{name_without_ext}_{counter}.json" + final_path = os.path.join(random_agents_dir, filename) + counter += 1 + + # Move the generated file to the RandomAgents directory + if os.path.exists(generated_master_file_path): + os.rename(generated_master_file_path, final_path) + print(f"[create_random_agent] - Moved file to: {final_path}") + + # Clean up any empty character directory that might have been created + char_dir = os.path.dirname(generated_master_file_path) + if os.path.exists(char_dir) and not os.listdir(char_dir): + os.rmdir(char_dir) + + # Read the JSON data from the file + with open(final_path, 'r', encoding='utf-8') as f: + data = json.load(f) + print(f"[create_random_agent] - Loaded data from file: {data}") + + return jsonify(data), 200 + + except Exception as e: + print(f"[create_random_agent] - Error: {str(e)}") + return jsonify({"error": "Failed to load agent data"}), 500 + +@app.before_request +def handle_preflight(): + """ + Handles CORS preflight requests by adding required headers. + + Returns: + Response: Flask response with CORS headers + """ + if request.method == "OPTIONS": + response = make_response() + response.headers.add("Access-Control-Allow-Headers", "*") + response.headers.add("Access-Control-Allow-Methods", "*") + return response + +# Your existing routes... +@app.route('/api/agents', methods=['GET']) +def get_agents(): + """ + Retrieves list of all agents. + + Returns: + JSON: List of agent data + """ + return jsonify(agents) + +@app.route('/api/agents/', methods=['POST']) +def create_agent(): + """ + Creates a new agent from provided configuration. If an agent with the same name exists, + it will be replaced. + + Request Body: + agent_details (dict): Agent configuration including name, personality, etc. + concept (str): Initial concept for the agent + + Returns: + JSON: Created agent data + int: HTTP status code + """ + data = request.get_json() + print(f"[create_agent] - Received data: {data}") + + # Extract character name from the agent_details + character_name = data.get('agent_details', {}).get('name') + if not character_name: + return jsonify({"error": "Character name is required"}), 400 + + # Replace spaces with underscores in the character name + character_name = character_name.replace(' ', '_') + + # Create a directory for the character + character_dir = os.path.join('configs', character_name) + os.makedirs(character_dir, exist_ok=True) + + # Generate filename - always use _master.json + filename = f"{character_name}_master.json" + file_path = os.path.normpath(os.path.join(character_dir, filename)) + + # Create the new character structure based on the incoming data structure + new_character_data = { + "concept": data.get('concept', ''), + "agent": { + "agent_details": { + "name": character_name.replace('_', ' '), + "personality": data.get('agent_details', {}).get('personality', []), + "communication_style": data.get('agent_details', {}).get('communication_style', []), + "backstory": data.get('agent_details', {}).get('backstory', ''), + "universe": data.get('agent_details', {}).get('universe', ''), + "topic_expertise": data.get('agent_details', {}).get('topic_expertise', []), + "hashtags": data.get('agent_details', {}).get('hashtags', []), + "emojis": data.get('agent_details', {}).get('emojis', []), + "concept": data.get('concept', '') + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": False, + "telegram": False, + "discord": False + }, + "profile_image": data.get('profile_image', []), + "profile_image_options": data.get('profile_image_options', []), + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": data.get('seasons', []) + } + } + + # Write data to the JSON file, overwriting if it exists + with open(file_path, 'w', encoding='utf-8') as f: + json.dump(new_character_data, f, ensure_ascii=False, indent=4) + + return jsonify(new_character_data), 201 + +@app.route('/api/characters', methods=['GET']) +def get_characters(): + """ + Retrieves all character configurations from the configs directory. + + Returns: + JSON: List of character configurations + int: HTTP status code + """ + try: + # Use os.path.join for cross-platform path handling + config_dir = 'configs' + pattern = os.path.join(config_dir, '**', '*master*.json') + # Use os.path.normpath to normalize path separators + files = [os.path.normpath(f) for f in glob.glob(pattern, recursive=True)] + print(f"[get_characters] - Found {len(files)} files: {files}") + + if not files: + print("[get_characters] - No files found in configs directory or subdirectories") + return jsonify({"error": "No character files found"}), 404 + + characters = [] + for file in files: + try: + with open(file, 'r', encoding='utf-8') as f: + characters.append(json.load(f)) + except json.JSONDecodeError as e: + print(f"[get_characters] - Error parsing JSON from {file}: {str(e)}") + continue + except Exception as e: + print(f"[get_characters] - Error reading file {file}: {str(e)}") + continue + + return jsonify(characters) + + except Exception as e: + print(f"[get_characters] - Unexpected error: {str(e)}") + return jsonify({"error": str(e)}), 500 + +@app.route('/api/agents/chat', methods=['POST']) +def chat_with_agent(): + """ + Handles chat interactions with an agent. + + Request Body: + prompt (str): User message to the agent + master_file_path (str): Path to agent's master configuration file + chat_history (dict): Previous chat history + + Returns: + JSON: Agent response and updated chat history + int: HTTP status code + """ + data = request.get_json() + prompt = data.get('prompt') + + master_file_path = data.get('master_file_path') + print(f"[chat_with_agent] - master_file_path: {master_file_path}") + print("\n\n\n") + + chat_history = data.get('chat_history', {'chat_history': []}) + + + if not master_file_path: + return jsonify({"error": "Master file path is required"}), 400 + + if not os.path.exists(master_file_path): + return jsonify({"error": "Agent master file not found"}), 404 + + try: + # Initialize AI model + ai_model = OpenAIModel() + + # Call the agent_chat function from step_5 + agent_response, updated_chat_history = agent_chat( + ai_model=ai_model, + master_file_path=master_file_path, + prompt=prompt, + chat_history=chat_history + ) + + return jsonify({ + "response": agent_response, + "chat_history": updated_chat_history + }) + except Exception as e: + print(f"Error in chat_with_agent: {str(e)}") + return jsonify({"error": str(e)}), 500 + +@app.route('/api/agents/chat-history', methods=['GET']) +def get_chat_history(): + """ + Retrieves chat history for a specific agent. + + Query Parameters: + master_file_path (str): Path to agent's master configuration file + + Returns: + JSON: Agent's chat history + int: HTTP status code + """ + master_file_path = request.args.get('master_file_path') + print(f"[get_chat_history] - master_file_path: {master_file_path}") + if not master_file_path: + return jsonify({"error": "Master file path is required"}), 400 + + # Extract agent name from master file path + agent_name = os.path.basename(master_file_path).replace('_master.json', '') + + # Create the chat history file path using the same format as in step_5_agent_chat.py + chat_file_path = os.path.join(os.path.dirname(master_file_path), f"{agent_name}_chat_log.json") + print(f"[get_chat_history] - chat_file_path: {chat_file_path}") + print("\n\n\n") + # If chat history doesn't exist, return empty history with agent name + if not os.path.exists(chat_file_path): + return jsonify({ + "agent_name": agent_name, + "chat_history": [] + }) + + # Load and return the chat history + with open(chat_file_path, 'r', encoding='utf-8') as file: + chat_history = json.load(file) + + return jsonify(chat_history) + +@app.route('/api/agents/seasons', methods=['POST']) +def create_season(): + """ + Generates a new season of content for an agent. + + Request Body: + master_file_path (str): Path to agent's master configuration file + number_of_episodes (int): Number of episodes to generate + + Returns: + JSON: Updated agent data with new season + int: HTTP status code + """ + try: + data = request.get_json() + master_file_path = data.get('master_file_path') + number_of_episodes = data.get('number_of_episodes', 3) # Default to 3 episodes + + if not master_file_path: + return jsonify({"error": "Master file path is required"}), 400 + + # Create a new season using the global AI model + result = create_seasons_and_episodes( + ai_model=ai_model, + master_file_path=master_file_path, + number_of_episodes=number_of_episodes + ) + + # Load and return the updated agent data + with open(master_file_path, 'r', encoding='utf-8') as f: + updated_agent = json.load(f) + + return jsonify(updated_agent), 200 + + except Exception as e: + print(f"Error creating season: {str(e)}") + return jsonify({"error": str(e)}), 500 + +@app.route('/api/agents/episodes/posts', methods=['POST']) +def create_episode_content(): + """ + Generates posts for an agent's episodes. + + Request Body: + master_file_path (str): Path to agent's master configuration file + number_of_posts (int): Number of posts to generate per episode + + Returns: + JSON: Updated agent data with new posts + int: HTTP status code + """ + try: + data = request.get_json() + master_file_path = data.get('master_file_path') + number_of_posts = data.get('number_of_posts', 6) # Default to 6 posts + + if not master_file_path: + return jsonify({"error": "Master file path is required"}), 400 + + # Create posts for the episodes using the global AI model + result = create_episode_posts( + ai_model=ai_model, + master_file_path=master_file_path, + number_of_posts=number_of_posts + ) + + # Load and return the updated agent data + with open(master_file_path, 'r', encoding='utf-8') as f: + updated_agent = json.load(f) + + return jsonify(updated_agent), 200 + + except Exception as e: + print(f"Error creating episode posts: {str(e)}") + return jsonify({"error": str(e)}), 500 + +# Twitter Posting +@app.route('/api/start-post-manager/twitter', methods=['POST']) +def start_post_manager_twitter(): + global post_manager_twitter + + data = request.json + agent_name = data.get('agent_name') + + print("\n") + if not agent_name: + print("[start_post_manager_twitter] - Agent name is required") + return jsonify({'error': 'Agent name is required'}), 400 + + try: + # Create PostManager instance with the agent name + post_manager_twitter = PostManager(agent_name=agent_name) + print(f"[start_post_manager_twitter] - post_manager created: {post_manager_twitter}") + + # Check if the PostManager is logged in + if post_manager_twitter and post_manager_twitter.is_logged_in: + return jsonify({'success': True, 'message': f'Post manager started for {agent_name}'}), 200 + else: + return jsonify({'error': 'Failed to start post manager or login to Twitter'}), 500 + + except Exception as e: + print(f"[start_post_manager] - Error: {str(e)}") + return jsonify({'error': str(e)}), 500 + + +@app.route('/api/post-to-twitter', methods=['POST']) +def post_to_twitter(): + global post_manager_twitter + + print("\n") + try: + data = request.json + master_data = data.get('master_data') + post_content = data.get('content') + print(f"[post_to_twitter api ] - post_content: {post_content}") + if not master_data or not post_content: + return jsonify({'error': 'Master data or post content is required'}), 400 + + if post_manager_twitter: + post_success = post_manager_twitter.post_single_tweet(post_content) + if post_success: + return jsonify({'success': True}), 200 + else: + return jsonify({'error': 'Failed to post to Twitter'}), 500 + else: + return jsonify({'error': 'Post manager not initialized'}), 500 + + except Exception as e: + return jsonify({'error': str(e)}), 500 + +@app.route('/api/agents/update-seasons', methods=['PUT']) +def update_seasons(): + """ + Updates the seasons array for a specific agent using the agent's name. + + Request Body: + agent_name (str): Name of the agent + seasons (list): New seasons data to update + + Returns: + JSON: Updated agent data + int: HTTP status code + """ + try: + data = request.get_json() + agent_name = data.get('agent_name') + new_seasons = data.get('seasons') + + if not agent_name or not new_seasons: + return jsonify({"error": "Agent name and seasons data are required"}), 400 + + # Construct the master file path using the agent's name + master_file_path = os.path.join('configs', agent_name, f"{agent_name}_master.json") + + if not os.path.exists(master_file_path): + return jsonify({"error": "Agent master file not found"}), 404 + + # Load the existing agent data + with open(master_file_path, 'r', encoding='utf-8') as f: + agent_data = json.load(f) + + # Update the seasons array + agent_data['agent']['seasons'] = new_seasons + + # Save the updated agent data back to the file + with open(master_file_path, 'w', encoding='utf-8') as f: + json.dump(agent_data, f, ensure_ascii=False, indent=4) + + return jsonify(agent_data), 200 + + except Exception as e: + print(f"Error updating seasons: {str(e)}") + return jsonify({"error": str(e)}), 500 + +if __name__ == '__main__': + print("API Server starting on port 8080...") + app.run(host='0.0.0.0',debug=True, port=8080) \ No newline at end of file diff --git a/server/asset_generation/images_leonardo.py b/server/asset_generation/images_leonardo.py new file mode 100644 index 0000000..7b6580a --- /dev/null +++ b/server/asset_generation/images_leonardo.py @@ -0,0 +1,200 @@ +# +# Module: template_types +# +# This module implements the TemplateType class for defining the type of template. +# +# Title: Template Types +# Summary: Template types implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-12 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +import requests +import os +import dotenv +import time +import json +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# custom ARAI imports +from utils.content_generator import ContentGenerator +from utils.template_types import TemplateType + +dotenv.load_dotenv() + +# Define the Lambda endpoint URL +get_inconsistent_image_lambda_url = "https://46i9cnowhh.execute-api.us-east-1.amazonaws.com/getImageInconsistent" + +# Function to call the AWS Lambda +def generate_inconsistent_image_lambda(prompt, model_id, style_uuid, num_images): + + url = get_inconsistent_image_lambda_url + + headers = { + "Content-Type": "application/json" + } + + payload = { + "prompt": prompt, + "modelId": model_id, + "styleUUID": style_uuid, + "num_images": num_images + } + + try: + # Send the POST request with the payload + # Use dumpts to convert the payload to a string + response = requests.post(url, headers=headers, data=json.dumps(payload)) + + # Check for HTTP errors + if not response.ok: + print(f"HTTP error! Status: {response.status_code}, Response: {response.text}") + response.raise_for_status() + + # Parse and return the response JSON + data = response.json() + return data + + except requests.RequestException as error: + print("Error calling Lambda:", error) + raise error + +#-------------------------------- +# Generate multiple images from a prompt that are inconsistent with each other +#-------------------------------- +def generated_image_inconsistent(prompt, model_id, style_uuid, num_images): + url = "https://cloud.leonardo.ai/api/rest/v1/generations" + + payload = { + "modelId": model_id, + "presetStyle": "DYNAMIC", + "scheduler": "LEONARDO", + "sd_version": "SDXL_LIGHTNING", + "contrast": 1.3, + "prompt": prompt, + "num_images": num_images, + "width": 512, + "height": 512, + "alchemy": True, + "styleUUID": style_uuid, + "enhancePrompt": False, + "nsfw": True, + "public": False, + } + headers = { + "accept": "application/json", + "content-type": "application/json", + "authorization": "Bearer " + os.getenv("LEONARDO_API_KEY", "") + } + + try: + response = requests.post(url, json=payload, headers=headers) + return response.json(), payload + except Exception as e: + print("Error:", str(e)) + return None, payload + +#-------------------------------- +# Generate multiple images from a prompt that are consistent with each other +#-------------------------------- +def generated_image_consistent(prompt, model_id, style_uuid, num_images): + url = "https://cloud.leonardo.ai/api/rest/v1/generations" + + payload = { + "modelId": model_id, + "presetStyle": "DYNAMIC", + "scheduler": "LEONARDO", + "sd_version": "SDXL_LIGHTNING", + "contrast": 1.3, + "prompt": prompt, + "num_images": num_images, + "width": 1024, + "height": 1024, + "alchemy": True, + "styleUUID": style_uuid, + "enhancePrompt": False, + "nsfw": True, + "public": False, + "num_inference_steps": 10, + "guidance_scale": 7, + + } + headers = { + "accept": "application/json", + "content-type": "application/json", + "authorization": "Bearer " + os.getenv("LEONARDO_API_KEY", "") + } + + try: + response = requests.post(url, json=payload, headers=headers) + return response.json(), payload + except Exception as e: + print("Error:", str(e)) + return None, payload + +#-------------------------------- +# Get the image URL from a generation ID +#-------------------------------- +def get_image_url(generation_id): + url = "https://cloud.leonardo.ai/api/rest/v1/generations/" + generation_id + + headers = { + "accept": "application/json", + "authorization": "Bearer " + os.getenv("LEONARDO_API_KEY", "") + } + + response = requests.get(url, headers=headers) + + return response.json() + +#-------------------------------- +# Get list of models +#-------------------------------- +def get_models(): + url = "https://cloud.leonardo.ai/api/rest/v1/platformModels" + + headers = { + "accept": "application/json", + "authorization": "Bearer " + os.getenv("LEONARDO_API_KEY", "") + } + + response = requests.get(url, headers=headers) + + return response.json() + +# Get a list of model styles +#-------------------------------- +def get_model_styles(model_id): + url = "https://cloud.leonardo.ai/api/rest/v1/platformModels/" + model_id + "/styles" + + headers = { + "accept": "application/json", + "authorization": "Bearer " + os.getenv("LEONARDO_API_KEY", "") + } + + response = requests.get(url, headers=headers) + + return response.json() + +#-------------------------------- +# Get list of elements +#-------------------------------- +def get_elements(): + url = "https://cloud.leonardo.ai/api/rest/v1/elements" + + headers = { + "accept": "application/json", + "authorization": "Bearer " + os.getenv("LEONARDO_API_KEY", "") + } + + response = requests.get(url, headers=headers) + + return response.json() diff --git a/server/asset_generation/leonard_anime_styles.json b/server/asset_generation/leonard_anime_styles.json new file mode 100644 index 0000000..cbeb4ea --- /dev/null +++ b/server/asset_generation/leonard_anime_styles.json @@ -0,0 +1,50 @@ +{ + "models": [ + { + "model name": "Leonardo Anime XL", + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "styles": [ + { + "style name": "Anime General", + "styleUUID": "b2a54a51-230b-4d4f-ad4e-8409bf58645f" + }, + { + "style name": "Anime Retro", + "styleUUID": "1824f984-dc0b-4f72-aa32-0442091d488c" + }, + { + "style name": "Anime None", + "styleUUID": "e89ca6f0-7653-4db6-8a24-ded9d1267d84" + }, + { + "style name": "Anime Background", + "styleUUID": "5f611024-668e-41cc-b538-4569a7985cad" + }, + { + "style name": "Anime Flat Illustration", + "styleUUID": "" + }, + { + "style name": "Anime Monoschrome", + "styleUUID": "" + }, + { + "style name": "Anime Screencap", + "styleUUID": "" + }, + { + "style name": "Anime Semi-Realism", + "styleUUID": "" + }, + { + "style name": "Character Sheet", + "styleUUID": "" + }, + { + "style name": "Manga", + "styleUUID": "" + } + ] + } + ] +} \ No newline at end of file diff --git a/server/asset_generation/leonard_models.py b/server/asset_generation/leonard_models.py new file mode 100644 index 0000000..6911551 --- /dev/null +++ b/server/asset_generation/leonard_models.py @@ -0,0 +1,39 @@ +# +# Module: template_types +# +# This module implements the TemplateType class for defining the type of template. +# +# Title: Leonard Models +# Summary: Leonard models implementation. +# Authors: +# - @TheBlockRhino +# Created: 2025-01-12 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-12 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +class LeonardModel: + # https://docs.leonardo.ai/docs/generate-images-using-flux + # Preset_Model modelId + FLUX_SPEED_FLUX_SCHNELL = "1dd50843-d653-4516-a8e3-f0238ee453ff" + FLUX_PRECISION_FLUX_DEV = "b2614463-296c-462a-9586-aafdb8f00e36" + + # Flux Preset Style UUID + THREE_D_RENDER = "debdf72a-91a4-467b-bf61-cc02bdeb69c6" + ACRYLIC = "3cbb655a-7ca4-463f-b697-8a03ad67327c" + ANIME_GENERAL = "b2a54a51-230b-4d4f-ad4e-8409bf58645f" + CREATIVE = "6fedbf1f-4a17-45ec-84fb-92fe524a29ef" + DYNAMIC = "111dc692-d470-4eec-b791-3475abac4c46" + FASHION = "594c4a08-a522-4e0e-b7ff-e4dac4b6b622" + GAME_CONCEPT = "09d2b5b5-d7c5-4c02-905d-9f84051640f4" + GRAPHIC_DESIGN_3D = "7d7c2bc5-4b12-4ac3-81a9-630057e9e89f" + ILLUSTRATION = "645e4195-f63d-4715-a3f2-3fb1e6eb8c70" + NONE = "556c1ee5-ec38-42e8-955a-1e82dad0ffa1" + PORTRAIT = "8e2bc543-6ee2-45f9-bcd9-594b6ce84dcd" + PORTRAIT_CINEMATIC = "4edb03c9-8a26-4041-9d01-f85b5d4abd71" + RAY_TRACED = "b504f83c-3326-4947-82e1-7fe9e839ec0f" + STOCK_PHOTO = "5bdc3f2a-1be6-4d1c-8e77-992a30824a2c" + WATERCOLOR = "1db308ce-c7ad-4d10-96fd-592fa6b75cc4" \ No newline at end of file diff --git a/server/auth/__init__.py b/server/auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/auth/twitter_app_auth.py b/server/auth/twitter_app_auth.py new file mode 100644 index 0000000..8016856 --- /dev/null +++ b/server/auth/twitter_app_auth.py @@ -0,0 +1,148 @@ +# +# Module: twitter_app_auth +# +# This module implements the TwitterAppAuth class for authenticating with the Twitter API using OAuth 1.0a. +# +# Title: Twitter App Auth +# Summary: Twitter app authentication implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-04 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino +import os +from dotenv import load_dotenv +import tweepy +import webbrowser +import yaml + +load_dotenv() + +class TwitterAppAuth: + """ + A class for authenticating with the Twitter API using OAuth 1.0a. + + Attributes: + api_key (str): The API key for the Twitter API. + api_secret_key (str): The API secret key for the Twitter API. + bearer_token (str): The bearer token for the Twitter API. + """ + def __init__(self): + """Initializes the TwitterAppAuth class. + + Example: + >>> twitter_auth = TwitterAppAuth() + """ + self.api_key = os.getenv("TWITTER_API_KEY") + self.api_secret_key = os.getenv("TWITTER_API_KEY_SECRET") + self.bearer_token = os.getenv("TWITTER_BEARER_TOKEN") + + def setup_twitter_auth(self): + """Sets up the Twitter authentication. + + Raises: + ValueError: If Twitter API credentials are not present in the environment variables. + + Example: + >>> twitter_auth.setup_twitter_auth() + """ + try: + # Initialize OAuth 1.0a handler + self.auth = tweepy.OAuth1UserHandler( + consumer_key=self.api_key, + consumer_secret=self.api_secret_key, + callback="oob" # Use out-of-band OAuth + ) + + # Get the authorization URL + try: + auth_url = self.auth.get_authorization_url() + print("\n1. Visit this URL to authorize your app:") + print(auth_url) + + # Open the URL in default browser + webbrowser.open(auth_url) + + # Get the verifier code from user + print("\n2. Enter the PIN shown on the website:") + verifier = input("> ").strip() + + # Get the access tokens + try: + access_token, access_token_secret = self.auth.get_access_token(verifier) + + print("\nSuccess! Add these tokens to your .env file:") + print(f"\nTWITTER_ACCESS_TOKEN={access_token}") + print(f"TWITTER_ACCESS_TOKEN_SECRET={access_token_secret}") + + # Test the credentials + self.client = tweepy.Client( + bearer_token=self.bearer_token, + consumer_key=self.api_key, + consumer_secret=self.api_secret_key, + access_token=access_token, + access_token_secret=access_token_secret + ) + + me = self.client.get_me() + print(f"\nSuccessfully authenticated as @{me.data.username}") + + self.save_credentials(access_token, access_token_secret) + + except Exception as e: + print(f"\nError getting access tokens: {str(e)}") + + except Exception as e: + print(f"\nError getting authorization URL: {str(e)}") + print("\nMake sure your app has OAuth 1.0a enabled in the Twitter Developer Portal:") + print("1. Go to https://developer.twitter.com/en/portal/projects") + print("2. Select your project and app") + print("3. Go to 'User authentication settings'") + print("4. Enable 'OAuth 1.0a'") + print("5. Set App permissions to 'Read and Write'") + print("6. Add 'http://127.0.0.1' to callback URLs") + + except Exception as e: + print(f"\nSetup error: {str(e)}") + print("\nCheck that your API credentials are correct in .env file:") + print("TWITTER_API_KEY") + print("TWITTER_API_KEY_SECRET") + + + def save_credentials(self, access_token, access_token_secret): + """Saves the Twitter access tokens to a YAML file. + + Args: + access_token (str): The access token for the Twitter API. + access_token_secret (str): The access token secret for the Twitter API. + + Example: + >>> twitter_auth.save_credentials(access_token, access_token_secret) + """ + try: + tokens = { + 'TWITTER_ACCESS_TOKEN': access_token, + 'TWITTER_ACCESS_TOKEN_SECRET': access_token_secret + } + + with open('twitter_tokens.yaml', 'w') as f: + yaml.dump(tokens, f) + + print("\nSuccess! Tokens have been saved to twitter_tokens.yaml") + + except Exception as e: + print(f"\nError saving tokens: {str(e)}") + + +if __name__ == "__main__": + """Main function to run the TwitterAppAuth class. + + Example: + >>> python twitter_app_auth.py + """ + auth = TwitterAppAuth() + auth.setup_twitter_auth() diff --git a/server/configs/Cassandra_Fox/Cassandra_Fox_master.json b/server/configs/Cassandra_Fox/Cassandra_Fox_master.json new file mode 100644 index 0000000..0a1e1a6 --- /dev/null +++ b/server/configs/Cassandra_Fox/Cassandra_Fox_master.json @@ -0,0 +1,123 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Cassandra Fox", + "personality": [ + "Methodical", + "focused", + "analytical", + "patient", + "detail-oriented", + "introspective", + "determined." + ], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Forensic Anthropology", + "Human Remains Analysis" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a7e5f8a4-c947-48c3-a8ff-4654bf2d9b60/Leonardo_Anime_XL_A_focused_female_agent_in_a_forensic_lab_exa_0.jpg", + "image_id": "04a63db0-764e-4b64-8cd8-b1199e33fab0" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "createdAt": "2025-02-07T06:50:22.058", + "fantasyAvatar": null, + "generated_images": [ + { + "generated_image_variation_generics": [], + "id": "04a63db0-764e-4b64-8cd8-b1199e33fab0", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a7e5f8a4-c947-48c3-a8ff-4654bf2d9b60/Leonardo_Anime_XL_A_focused_female_agent_in_a_forensic_lab_exa_0.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "5db26ccf-9931-4998-8109-3ae18362fe99", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a7e5f8a4-c947-48c3-a8ff-4654bf2d9b60/Leonardo_Anime_XL_A_focused_female_agent_in_a_forensic_lab_exa_1.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "af6fb8cb-251c-486a-8195-979e218be28f", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a7e5f8a4-c947-48c3-a8ff-4654bf2d9b60/Leonardo_Anime_XL_A_focused_female_agent_in_a_forensic_lab_exa_2.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "250506dc-0787-4bdf-bd50-1196fc08c1c0", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a7e5f8a4-c947-48c3-a8ff-4654bf2d9b60/Leonardo_Anime_XL_A_focused_female_agent_in_a_forensic_lab_exa_3.jpg" + } + ], + "generation_elements": [], + "guidanceScale": 1.3, + "id": "a7e5f8a4-c947-48c3-a8ff-4654bf2d9b60", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "initStrength": null, + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "negativePrompt": "", + "photoReal": false, + "photoRealStrength": null, + "presetStyle": "DYNAMIC", + "prompt": "A focused female agent in a forensic lab, examining skeletal remains in a scientific setting. She’s working with a microscope, examining bones and forensic reports, with detailed anatomical charts and forensic tools surrounding her", + "promptMagic": false, + "promptMagicStrength": null, + "promptMagicVersion": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "seed": 6198019575, + "status": "COMPLETE", + "ultra": null + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Dexter_Lorne/Dexter_Lorne_master.json b/server/configs/Dexter_Lorne/Dexter_Lorne_master.json new file mode 100644 index 0000000..e6daec5 --- /dev/null +++ b/server/configs/Dexter_Lorne/Dexter_Lorne_master.json @@ -0,0 +1,123 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Dexter Lorne", + "personality": [ + "Confident", + "strategic", + "composed", + "charming", + "pragmatic", + "observant", + "persuasive." + ], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Financial Crime", + "Money Laundering Prevention" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/007d9d17-aa5a-4c5a-8667-5de092886637/Leonardo_Anime_XL_A_focused_male_agent_in_a_professional_suit_0.jpg", + "image_id": "e0193f0f-fb57-46ee-8de3-640fe27bc29e" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "createdAt": "2025-02-07T06:44:47.837", + "fantasyAvatar": null, + "generated_images": [ + { + "generated_image_variation_generics": [], + "id": "e0193f0f-fb57-46ee-8de3-640fe27bc29e", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/007d9d17-aa5a-4c5a-8667-5de092886637/Leonardo_Anime_XL_A_focused_male_agent_in_a_professional_suit_0.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "72f29180-7428-4805-8a4a-c3743705cdc6", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/007d9d17-aa5a-4c5a-8667-5de092886637/Leonardo_Anime_XL_A_focused_male_agent_in_a_professional_suit_1.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "8abbaccd-c152-4a6b-a61a-9f6195f27766", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/007d9d17-aa5a-4c5a-8667-5de092886637/Leonardo_Anime_XL_A_focused_male_agent_in_a_professional_suit_2.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "e94c11c8-d420-4a03-a2cb-766f38b45a04", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/007d9d17-aa5a-4c5a-8667-5de092886637/Leonardo_Anime_XL_A_focused_male_agent_in_a_professional_suit_3.jpg" + } + ], + "generation_elements": [], + "guidanceScale": 1.3, + "id": "007d9d17-aa5a-4c5a-8667-5de092886637", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "initStrength": null, + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "negativePrompt": "", + "photoReal": false, + "photoRealStrength": null, + "presetStyle": "DYNAMIC", + "prompt": "A focused male agent in a professional suit, sitting in front of a large financial display board. He’s examining encrypted financial transactions and charts on a digital tablet, with high-tech banking and anti-money laundering systems in the background.", + "promptMagic": false, + "promptMagicStrength": null, + "promptMagicVersion": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "seed": 9117045654, + "status": "COMPLETE", + "ultra": null + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Elara_Quinn/Elara_Quinn_master.json b/server/configs/Elara_Quinn/Elara_Quinn_master.json new file mode 100644 index 0000000..c2cb0bf --- /dev/null +++ b/server/configs/Elara_Quinn/Elara_Quinn_master.json @@ -0,0 +1,123 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Elara Quinn", + "personality": [ + "Empathetic", + "intuitive", + "reserved", + "patient", + "insightful", + "observant", + "compassionate." + ], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Criminal Psychology", + "Behavioral Analysis" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e477f131-c57d-4abc-b589-8b32fe133b0f/Leonardo_Anime_XL_A_thoughtful_female_agent_in_a_psychology_of_0.jpg", + "image_id": "9ec82199-ab99-4c02-b9b4-7e4c9f094836" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "createdAt": "2025-02-07T06:40:22.955", + "fantasyAvatar": null, + "generated_images": [ + { + "generated_image_variation_generics": [], + "id": "9ec82199-ab99-4c02-b9b4-7e4c9f094836", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e477f131-c57d-4abc-b589-8b32fe133b0f/Leonardo_Anime_XL_A_thoughtful_female_agent_in_a_psychology_of_0.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "90dc5b6a-2e00-4ca5-8671-56827d58ffa4", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e477f131-c57d-4abc-b589-8b32fe133b0f/Leonardo_Anime_XL_A_thoughtful_female_agent_in_a_psychology_of_1.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "963bbd45-a1d0-4638-8202-9e28dd37e5a4", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e477f131-c57d-4abc-b589-8b32fe133b0f/Leonardo_Anime_XL_A_thoughtful_female_agent_in_a_psychology_of_2.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "881671aa-f9fa-437d-98d0-89cc9a64e528", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e477f131-c57d-4abc-b589-8b32fe133b0f/Leonardo_Anime_XL_A_thoughtful_female_agent_in_a_psychology_of_3.jpg" + } + ], + "generation_elements": [], + "guidanceScale": 1.3, + "id": "e477f131-c57d-4abc-b589-8b32fe133b0f", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "initStrength": null, + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "negativePrompt": "", + "photoReal": false, + "photoRealStrength": null, + "presetStyle": "DYNAMIC", + "prompt": "A thoughtful female agent in a psychology office, sitting at a desk surrounded by psychological profiles and case notes. She’s analyzing a criminal behavior chart on a screen, with psychological books and criminology texts scattered around the room.", + "promptMagic": false, + "promptMagicStrength": null, + "promptMagicVersion": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "seed": 54561375, + "status": "COMPLETE", + "ultra": null + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Isla_Monroe/Isla_Monroe_master.json b/server/configs/Isla_Monroe/Isla_Monroe_master.json new file mode 100644 index 0000000..1dc93c0 --- /dev/null +++ b/server/configs/Isla_Monroe/Isla_Monroe_master.json @@ -0,0 +1,116 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Isla Monroe", + "personality": [], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Geopolitical Risk", + "International Relations" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e108e53b-4320-49a3-af1e-78b5c626f03d/Leonardo_Anime_XL_A_strategic_female_agent_in_an_embassy_setti_1.jpg", + "image_id": "3a3edfb1-92f6-4af1-bb54-daaaf425c70c", + "generationId": "" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e108e53b-4320-49a3-af1e-78b5c626f03d/Leonardo_Anime_XL_A_strategic_female_agent_in_an_embassy_setti_0.jpg", + "nsfw": false, + "id": "cf021d28-6c14-485b-8bb2-1b0f62ad7305", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e108e53b-4320-49a3-af1e-78b5c626f03d/Leonardo_Anime_XL_A_strategic_female_agent_in_an_embassy_setti_1.jpg", + "nsfw": false, + "id": "3a3edfb1-92f6-4af1-bb54-daaaf425c70c", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e108e53b-4320-49a3-af1e-78b5c626f03d/Leonardo_Anime_XL_A_strategic_female_agent_in_an_embassy_setti_2.jpg", + "nsfw": false, + "id": "53bb00a9-ac2a-419c-85e9-924e60c3f87f", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/e108e53b-4320-49a3-af1e-78b5c626f03d/Leonardo_Anime_XL_A_strategic_female_agent_in_an_embassy_setti_3.jpg", + "nsfw": false, + "id": "49aa0992-16a5-4640-a772-043bb9c654ae", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "A strategic female agent in an embassy setting, surrounded by diplomatic documents and world maps with international flags. She’s reviewing geopolitical risk reports on a holographic screen, with various global locations marked for analysis.", + "negativePrompt": "", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "seed": 1614805193, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "e108e53b-4320-49a3-af1e-78b5c626f03d", + "createdAt": "2025-02-07T06:45:45.212", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Jaxon_Steele/Jaxon_Steele_master.json b/server/configs/Jaxon_Steele/Jaxon_Steele_master.json new file mode 100644 index 0000000..720bf15 --- /dev/null +++ b/server/configs/Jaxon_Steele/Jaxon_Steele_master.json @@ -0,0 +1,123 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Jaxon Steele", + "personality": [ + "Competitive", + "fast-paced", + "strategic", + "focused", + "energetic", + "confident", + "bold." + ], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Professional Racing", + "Motorsport Strategy" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a2120884-b2c0-4d9a-8fb0-e2055dc4cfc6/Leonardo_Anime_XL_A_dynamic_male_agent_in_a_sleek_racing_suit_0.jpg", + "image_id": "91ef72d0-19df-4717-99cf-fe1ba9e5f991" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "createdAt": "2025-02-07T06:51:58.549", + "fantasyAvatar": null, + "generated_images": [ + { + "generated_image_variation_generics": [], + "id": "91ef72d0-19df-4717-99cf-fe1ba9e5f991", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a2120884-b2c0-4d9a-8fb0-e2055dc4cfc6/Leonardo_Anime_XL_A_dynamic_male_agent_in_a_sleek_racing_suit_0.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "e02b952e-ebb7-492d-bc1a-f55b2d1881b7", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a2120884-b2c0-4d9a-8fb0-e2055dc4cfc6/Leonardo_Anime_XL_A_dynamic_male_agent_in_a_sleek_racing_suit_1.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "0589ba42-9e4c-46ae-8406-d4087b9d73bc", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a2120884-b2c0-4d9a-8fb0-e2055dc4cfc6/Leonardo_Anime_XL_A_dynamic_male_agent_in_a_sleek_racing_suit_2.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "d9251e86-eaa9-4122-b214-c31d762c9c08", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/a2120884-b2c0-4d9a-8fb0-e2055dc4cfc6/Leonardo_Anime_XL_A_dynamic_male_agent_in_a_sleek_racing_suit_3.jpg" + } + ], + "generation_elements": [], + "guidanceScale": 1.3, + "id": "a2120884-b2c0-4d9a-8fb0-e2055dc4cfc6", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "initStrength": null, + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "negativePrompt": "", + "photoReal": false, + "photoRealStrength": null, + "presetStyle": "DYNAMIC", + "prompt": "A dynamic male agent in a sleek racing suit, standing by a high-performance race car in a pit stop. He’s analyzing the car’s performance data on a tablet, surrounded by racing crew members, tire equipment, and a race track in the background, with the sound of engines roaring in the distance.", + "promptMagic": false, + "promptMagicStrength": null, + "promptMagicVersion": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "seed": 6863284070, + "status": "COMPLETE", + "ultra": null + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Kara_Stratton/Kara_Stratton_master.json b/server/configs/Kara_Stratton/Kara_Stratton_master.json new file mode 100644 index 0000000..efbc8ec --- /dev/null +++ b/server/configs/Kara_Stratton/Kara_Stratton_master.json @@ -0,0 +1,116 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Kara Stratton", + "personality": [], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Cybersecurity", + "Digital Forensics" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/652edafa-5256-42d4-99a2-4a3d5f728e5d/Leonardo_Anime_XL_A_determined_female_agent_in_a_hightech_cont_2.jpg", + "image_id": "9b83a2ec-7e59-4f6d-9c36-99078c086776", + "generationId": "" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/652edafa-5256-42d4-99a2-4a3d5f728e5d/Leonardo_Anime_XL_A_determined_female_agent_in_a_hightech_cont_0.jpg", + "nsfw": false, + "id": "72842c09-c02e-42b5-be4d-007e753e1dcc", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/652edafa-5256-42d4-99a2-4a3d5f728e5d/Leonardo_Anime_XL_A_determined_female_agent_in_a_hightech_cont_1.jpg", + "nsfw": false, + "id": "5f51ea9b-fdf1-4440-8d00-33e7115a04da", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/652edafa-5256-42d4-99a2-4a3d5f728e5d/Leonardo_Anime_XL_A_determined_female_agent_in_a_hightech_cont_2.jpg", + "nsfw": false, + "id": "9b83a2ec-7e59-4f6d-9c36-99078c086776", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/652edafa-5256-42d4-99a2-4a3d5f728e5d/Leonardo_Anime_XL_A_determined_female_agent_in_a_hightech_cont_3.jpg", + "nsfw": false, + "id": "1754a734-a259-4e3b-863b-0574e9497779", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "A determined female agent in a high-tech control room, analyzing digital forensics data on multiple holographic screens, wearing a sleek, futuristic black suit with digital interfaces glowing around her. The room is filled with glowing data, servers, and advanced cybersecurity tools.", + "negativePrompt": "", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "seed": 7576144302, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "652edafa-5256-42d4-99a2-4a3d5f728e5d", + "createdAt": "2025-02-07T06:37:54.317", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Luca_Devereux/Luca_Devereux_master.json b/server/configs/Luca_Devereux/Luca_Devereux_master.json new file mode 100644 index 0000000..cbb8628 --- /dev/null +++ b/server/configs/Luca_Devereux/Luca_Devereux_master.json @@ -0,0 +1,116 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Luca Devereux", + "personality": [], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Archaeology", + "Ancient Civilizations" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/3c05c294-728f-4a71-8a51-23506d7dfe31/Leonardo_Anime_XL_A_determined_male_agent_in_rugged_field_gear_2.jpg", + "image_id": "fa42a390-2962-4c2a-bb8a-ddd20b6c6c32", + "generationId": "" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/3c05c294-728f-4a71-8a51-23506d7dfe31/Leonardo_Anime_XL_A_determined_male_agent_in_rugged_field_gear_0.jpg", + "nsfw": false, + "id": "eca31c1c-d751-4cdd-977d-f79469dd91b6", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/3c05c294-728f-4a71-8a51-23506d7dfe31/Leonardo_Anime_XL_A_determined_male_agent_in_rugged_field_gear_1.jpg", + "nsfw": false, + "id": "20dd00cb-9910-4317-bf70-88c76129412a", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/3c05c294-728f-4a71-8a51-23506d7dfe31/Leonardo_Anime_XL_A_determined_male_agent_in_rugged_field_gear_2.jpg", + "nsfw": false, + "id": "fa42a390-2962-4c2a-bb8a-ddd20b6c6c32", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/3c05c294-728f-4a71-8a51-23506d7dfe31/Leonardo_Anime_XL_A_determined_male_agent_in_rugged_field_gear_3.jpg", + "nsfw": false, + "id": "dc995500-ad84-4730-90f0-79726fe65eba", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "A determined male agent in rugged field gear, excavating an ancient archaeological site. He’s carefully brushing off a newly uncovered artifact in a sunlit desert or jungle, surrounded by ruins, ancient stone carvings, and excavation tools.", + "negativePrompt": "", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "seed": 1534064082, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "3c05c294-728f-4a71-8a51-23506d7dfe31", + "createdAt": "2025-02-07T06:47:08.025", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Lucian_Voss/Lucian_Voss_master.json b/server/configs/Lucian_Voss/Lucian_Voss_master.json new file mode 100644 index 0000000..a284cc6 --- /dev/null +++ b/server/configs/Lucian_Voss/Lucian_Voss_master.json @@ -0,0 +1,116 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Lucian Voss", + "personality": [], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Intelligence", + "Counterintelligence Operations" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/24048e1b-7e08-4756-a4f6-2dcee1058c59/Leonardo_Anime_XL_A_sharp_confident_male_agent_in_a_dark_suit_1.jpg", + "image_id": "3000ac56-d5bd-4f56-a705-38166e78139e", + "generationId": "" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/24048e1b-7e08-4756-a4f6-2dcee1058c59/Leonardo_Anime_XL_A_sharp_confident_male_agent_in_a_dark_suit_0.jpg", + "nsfw": false, + "id": "a4b06725-e109-475c-9dbb-a16e04cfff0f", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/24048e1b-7e08-4756-a4f6-2dcee1058c59/Leonardo_Anime_XL_A_sharp_confident_male_agent_in_a_dark_suit_1.jpg", + "nsfw": false, + "id": "3000ac56-d5bd-4f56-a705-38166e78139e", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/24048e1b-7e08-4756-a4f6-2dcee1058c59/Leonardo_Anime_XL_A_sharp_confident_male_agent_in_a_dark_suit_2.jpg", + "nsfw": false, + "id": "bea02920-e696-4cc9-8c00-dbf533837cf6", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/24048e1b-7e08-4756-a4f6-2dcee1058c59/Leonardo_Anime_XL_A_sharp_confident_male_agent_in_a_dark_suit_3.jpg", + "nsfw": false, + "id": "59b3a7e3-b241-453b-80b9-f64e2013b386", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "A sharp, confident male agent in a dark suit, standing in front of a world map with red and blue zones highlighting global intelligence operations. He’s holding a tablet displaying encrypted information, with a background of sleek modern intelligence tech", + "negativePrompt": "", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "seed": 7011957790, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "24048e1b-7e08-4756-a4f6-2dcee1058c59", + "createdAt": "2025-02-07T06:39:08.41", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Mia_Caldwell/Mia_Caldwell_master.json b/server/configs/Mia_Caldwell/Mia_Caldwell_master.json new file mode 100644 index 0000000..4fbe849 --- /dev/null +++ b/server/configs/Mia_Caldwell/Mia_Caldwell_master.json @@ -0,0 +1,123 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Mia Caldwell", + "personality": [ + "Visionary", + "creative", + "problem-solving", + "ambitious", + "social", + "practical", + "forward-thinking." + ], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Urban Planning", + "Smart City Solutions" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/c4eee511-c41e-4fad-b173-3b2229082fa6/Leonardo_Anime_XL_A_visionary_female_agent_in_a_modern_highris_0.jpg", + "image_id": "284c5e84-09a5-414e-aec6-1674b5b7280c" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "createdAt": "2025-02-07T06:43:28.991", + "fantasyAvatar": null, + "generated_images": [ + { + "generated_image_variation_generics": [], + "id": "284c5e84-09a5-414e-aec6-1674b5b7280c", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/c4eee511-c41e-4fad-b173-3b2229082fa6/Leonardo_Anime_XL_A_visionary_female_agent_in_a_modern_highris_0.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "605b4e47-3ca5-47b0-9dae-ca802edd7cd6", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/c4eee511-c41e-4fad-b173-3b2229082fa6/Leonardo_Anime_XL_A_visionary_female_agent_in_a_modern_highris_1.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "aa4a4083-9733-42c9-81fe-77735d633a44", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/c4eee511-c41e-4fad-b173-3b2229082fa6/Leonardo_Anime_XL_A_visionary_female_agent_in_a_modern_highris_2.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "2715d992-289a-4992-8bce-f45182c15388", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/c4eee511-c41e-4fad-b173-3b2229082fa6/Leonardo_Anime_XL_A_visionary_female_agent_in_a_modern_highris_3.jpg" + } + ], + "generation_elements": [], + "guidanceScale": 1.3, + "id": "c4eee511-c41e-4fad-b173-3b2229082fa6", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "initStrength": null, + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "negativePrompt": "", + "photoReal": false, + "photoRealStrength": null, + "presetStyle": "DYNAMIC", + "prompt": "A visionary female agent in a modern, high-rise office overlooking a smart city. She’s presenting digital blueprints of the city, with interactive touch screens showing smart infrastructure, renewable energy sources, and transportation systems.", + "promptMagic": false, + "promptMagicStrength": null, + "promptMagicVersion": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "seed": 5366546608, + "status": "COMPLETE", + "ultra": null + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/RandomAgents/Gaudinho Artdor_random.json b/server/configs/RandomAgents/Gaudinho Artdor_random.json new file mode 100644 index 0000000..26f85d5 --- /dev/null +++ b/server/configs/RandomAgents/Gaudinho Artdor_random.json @@ -0,0 +1,94 @@ +{ + "agent": { + "concept": "Create a parody meme of Antoni Gaudí. The meme should be a funny and clever meme that captures the essence of the person and their achievements. Make it witty and memorable while staying respectful. Include their most iconic features, expressions, or famous quotes if applicable.\n Make sure to use their name as part of their agent name. It is best to make a variation of their name. For example, if the person is Elon Musk, then the agent name could be Elon Musk Jr., Elon Gate, Trump Bot, Trump Tron, etc. Make something unique and memorable that could go viral within the first 24 hours of being posted.", + "agent_details": { + "name": "Gaudinho Artdor", + "personality": [ + "quirky", + "passionate about architecture", + "resourceful", + "imaginative", + "witty" + ], + "communication_style": [ + "playful", + "pun-laden", + "humorous", + "energetic", + "enthusiastic" + ], + "backstory": "Once an architecture student inspired by the great Antoni Gaudí, Gaudinho Artdor discovered a mysterious blueprint buried in the ancient streets of Barcelona. These blueprints seem to hold secrets of fantastical and whimsical constructions beyond imagination. Embarking on a quest to bring these designs to life, Gaudinho travels the world spreading the magic of art and architecture while facing quirky challenges and rival architects. Gaudinho believes that art and beauty can solve any problem, fueled by a mission to create structures that inspire laughter, joy, and wonder. With each structure built, a mystery deepens, hinting at a much larger grand design hidden within the patterns.", + "universe": "Set in a parallel universe where every city is a character itself, thriving with sentient buildings that communicate emotions through colors and shapes. This world is a mixture of advanced steampunk technology and organic art forms, where architects are seen as wizards wielding magic through their designs. While cities compete for aesthetic supremacy, secret societies of rogue artists and architects battle against mundane, unimaginative forces seeking to gray out the world. Authority figures are depicted as mechanical bureaucrats trying to order the chaos, yet secretly appreciative of Gaudinho's unruly spirit. Social and political landscapes fluctuate based on the latest artistic trends, with rivaling factions vying for dominance in the world's most fabulous craft fair.", + "topic_expertise": [ + "whimsical architecture", + "art history", + "magic of design", + "creative problem-solving", + "art-inspired adventures" + ], + "hashtags": [ + "#GaudinhoArtdor", + "#WhimsyArchitecture", + "#BuildTheImpossible", + "#MagicOfDesign", + "#ArtisticAdventures" + ], + "emojis": [ + "🎨", + "🏛️", + "🔮", + "🏗️", + "🌈" + ] + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "profile_image": {}, + "profile_image_options": [], + "seasons": [ + { + "season_name": "", + "season_number": 0, + "season_description": "", + "season_highlights": "", + "season_summary": "", + "season_posted": false, + "current_episode_number": 0, + "episodes": [ + { + "episode_name": "", + "episode_number": 0, + "episode_description": "", + "episode_highlights": "", + "episode_summary": "", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "", + "post_number": 0, + "post_content": "", + "post_highlights": "", + "post_posted": false + } + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/server/configs/Ravi_Patel/Ravi_Patel_master.json b/server/configs/Ravi_Patel/Ravi_Patel_master.json new file mode 100644 index 0000000..fa36078 --- /dev/null +++ b/server/configs/Ravi_Patel/Ravi_Patel_master.json @@ -0,0 +1,123 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Ravi Patel", + "personality": [ + "Curious", + "innovative", + "intellectual", + "friendly", + "collaborative", + "warm", + "approachable." + ], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Advanced Robotics", + "AI Integration" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/6fd386ac-e89b-4259-87c3-4f1cc2a54d54/Leonardo_Anime_XL_A_techsavvy_male_agent_in_a_lab_coat_oversee_0.jpg", + "image_id": "5c590eec-a962-4d8e-bdff-90b3d70e869c" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "createdAt": "2025-02-07T06:42:07.88", + "fantasyAvatar": null, + "generated_images": [ + { + "generated_image_variation_generics": [], + "id": "5c590eec-a962-4d8e-bdff-90b3d70e869c", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/6fd386ac-e89b-4259-87c3-4f1cc2a54d54/Leonardo_Anime_XL_A_techsavvy_male_agent_in_a_lab_coat_oversee_0.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "1adf96cc-87d7-4655-ba0a-a86d7cda3512", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/6fd386ac-e89b-4259-87c3-4f1cc2a54d54/Leonardo_Anime_XL_A_techsavvy_male_agent_in_a_lab_coat_oversee_1.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "b73a196e-18b5-418b-b6a5-014bd6a8ebd3", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/6fd386ac-e89b-4259-87c3-4f1cc2a54d54/Leonardo_Anime_XL_A_techsavvy_male_agent_in_a_lab_coat_oversee_2.jpg" + }, + { + "generated_image_variation_generics": [], + "id": "f36ab53b-2033-4133-9c8c-f879170f1e28", + "likeCount": 0, + "motionMP4URL": null, + "nsfw": false, + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/6fd386ac-e89b-4259-87c3-4f1cc2a54d54/Leonardo_Anime_XL_A_techsavvy_male_agent_in_a_lab_coat_oversee_3.jpg" + } + ], + "generation_elements": [], + "guidanceScale": 1.3, + "id": "6fd386ac-e89b-4259-87c3-4f1cc2a54d54", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "initStrength": null, + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "negativePrompt": "", + "photoReal": false, + "photoRealStrength": null, + "presetStyle": "DYNAMIC", + "prompt": "A tech-savvy male agent in a lab coat, overseeing a futuristic robotics lab filled with humanoid robots and AI systems. He’s standing next to a highly advanced robot, looking at an interactive digital hologram with AI code floating in the air.", + "promptMagic": false, + "promptMagicStrength": null, + "promptMagicVersion": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "seed": 7866122516, + "status": "COMPLETE", + "ultra": null + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Seraphina_Blackwell/Seraphina_Blackwell_master.json b/server/configs/Seraphina_Blackwell/Seraphina_Blackwell_master.json new file mode 100644 index 0000000..9a3d17b --- /dev/null +++ b/server/configs/Seraphina_Blackwell/Seraphina_Blackwell_master.json @@ -0,0 +1,116 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Seraphina Blackwell", + "personality": [], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "High-Profile Diplomacy", + "Negotiation" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/f2c2fbe9-9588-48c7-89e5-ee7c42b77758/Leonardo_Anime_XL_A_poised_female_agent_in_a_formal_suit_negot_2.jpg", + "image_id": "05b8a29b-768b-476d-894e-9ffa610ec338", + "generationId": "" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/f2c2fbe9-9588-48c7-89e5-ee7c42b77758/Leonardo_Anime_XL_A_poised_female_agent_in_a_formal_suit_negot_0.jpg", + "nsfw": false, + "id": "92885f5e-8c26-4819-901b-c6763231ae4c", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/f2c2fbe9-9588-48c7-89e5-ee7c42b77758/Leonardo_Anime_XL_A_poised_female_agent_in_a_formal_suit_negot_1.jpg", + "nsfw": false, + "id": "edc1c402-35e2-4e97-b7a3-906063e9e3ec", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/f2c2fbe9-9588-48c7-89e5-ee7c42b77758/Leonardo_Anime_XL_A_poised_female_agent_in_a_formal_suit_negot_2.jpg", + "nsfw": false, + "id": "05b8a29b-768b-476d-894e-9ffa610ec338", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/f2c2fbe9-9588-48c7-89e5-ee7c42b77758/Leonardo_Anime_XL_A_poised_female_agent_in_a_formal_suit_negot_3.jpg", + "nsfw": false, + "id": "a9de25e7-f3d1-41b9-937a-63631cd9c838", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "A poised female agent in a formal suit, negotiating in a luxurious, high-stakes diplomatic setting. She’s sitting at an elegant conference table with world leaders, papers and documents spread out, and a tense yet professional atmosphere.", + "negativePrompt": "", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "seed": 1766790468, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "f2c2fbe9-9588-48c7-89e5-ee7c42b77758", + "createdAt": "2025-02-07T06:48:01.845", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/Victor_Hayes/Victor_Hayes_master.json b/server/configs/Victor_Hayes/Victor_Hayes_master.json new file mode 100644 index 0000000..1d0a418 --- /dev/null +++ b/server/configs/Victor_Hayes/Victor_Hayes_master.json @@ -0,0 +1,116 @@ +{ + "concept": "", + "agent": { + "agent_details": { + "name": "Victor Hayes", + "personality": [], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [ + "Wilderness Survival", + "Natural Disaster Response" + ], + "hashtags": [], + "emojis": [], + "concept": "" + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "profile_image": { + "details": { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/b53642e2-c961-4538-826a-d2c514b4e315/Leonardo_Anime_XL_A_rugged_male_agent_in_survival_gear_navigat_1.jpg", + "image_id": "27299f36-e44c-4b0e-9faa-3e200ececed8", + "generationId": "" + } + }, + "profile_image_options": [ + { + "generations_by_pk": { + "generated_images": [ + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/b53642e2-c961-4538-826a-d2c514b4e315/Leonardo_Anime_XL_A_rugged_male_agent_in_survival_gear_navigat_0.jpg", + "nsfw": false, + "id": "d0d388cf-e08e-4961-87b8-41c251bb5877", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/b53642e2-c961-4538-826a-d2c514b4e315/Leonardo_Anime_XL_A_rugged_male_agent_in_survival_gear_navigat_1.jpg", + "nsfw": false, + "id": "27299f36-e44c-4b0e-9faa-3e200ececed8", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/b53642e2-c961-4538-826a-d2c514b4e315/Leonardo_Anime_XL_A_rugged_male_agent_in_survival_gear_navigat_2.jpg", + "nsfw": false, + "id": "7ad22c29-c80b-423f-b40c-18fee3189ca9", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + }, + { + "url": "https://cdn.leonardo.ai/users/d506f027-508f-4cf3-99ea-811721ad6a3a/generations/b53642e2-c961-4538-826a-d2c514b4e315/Leonardo_Anime_XL_A_rugged_male_agent_in_survival_gear_navigat_3.jpg", + "nsfw": false, + "id": "782a1dc2-2df7-40cf-aca5-234b4af0ff21", + "likeCount": 0, + "motionMP4URL": null, + "generated_image_variation_generics": [] + } + ], + "modelId": "e71a1c2f-4f80-4800-934f-2c68979d8cc8", + "motion": null, + "motionModel": null, + "motionStrength": null, + "prompt": "A rugged male agent in survival gear, navigating through a dense forest during a storm. He’s leading a group of survivors, guiding them towards safety with a map and compass, surrounded by thick trees and turbulent weather.", + "negativePrompt": "", + "imageHeight": 512, + "imageToVideo": null, + "imageWidth": 512, + "inferenceSteps": null, + "seed": 8224579333, + "ultra": null, + "public": false, + "scheduler": "LEONARDO", + "sdVersion": "SDXL_LIGHTNING", + "status": "COMPLETE", + "presetStyle": "DYNAMIC", + "initStrength": null, + "guidanceScale": 1.3, + "id": "b53642e2-c961-4538-826a-d2c514b4e315", + "createdAt": "2025-02-07T06:49:01.658", + "promptMagic": false, + "promptMagicVersion": null, + "promptMagicStrength": null, + "photoReal": false, + "photoRealStrength": null, + "fantasyAvatar": null, + "prompt_moderations": [ + { + "moderationClassification": [] + } + ], + "generation_elements": [] + } + } + ], + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "seasons": [] + } +} \ No newline at end of file diff --git a/server/configs/temporary/processed_response.json b/server/configs/temporary/processed_response.json new file mode 100644 index 0000000..2e3038a --- /dev/null +++ b/server/configs/temporary/processed_response.json @@ -0,0 +1,3 @@ +{ + "response": "Hey there! 😊 How can I assist you today?" +} \ No newline at end of file diff --git a/server/configs/temporary/raw_response.json b/server/configs/temporary/raw_response.json new file mode 100644 index 0000000..2cb249b --- /dev/null +++ b/server/configs/temporary/raw_response.json @@ -0,0 +1,5 @@ +```json +{ + "response": "Hey there! 😊 How can I assist you today?" +} +``` \ No newline at end of file diff --git a/server/connectors/__init__.py b/server/connectors/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/connectors/twitter_api_free_connector.py b/server/connectors/twitter_api_free_connector.py new file mode 100644 index 0000000..d9e3804 --- /dev/null +++ b/server/connectors/twitter_api_free_connector.py @@ -0,0 +1,143 @@ +from playwright.sync_api import sync_playwright +import os +from dotenv import load_dotenv +from pathlib import Path + +def ensure_state_folder(): + """Create state folder if it doesn't exist""" + state_folder = Path("state") + state_folder.mkdir(exist_ok=True) + return state_folder + +def get_state_path(): + """Get the full path to the login state file""" + return Path("state/login_state.json") + +def login_and_save_state(username, password, phone_or_email, storage_path=None): + if storage_path is None: + storage_path = get_state_path() + + with sync_playwright() as p: + # Ensure state folder exists + ensure_state_folder() + + # If we already have a state file, we can return True + if storage_path.exists(): + print(f"[api_free_connector] - {storage_path} exists. Using existing state.") + return True + + browser = p.chromium.launch(headless=False, slow_mo=1000) + context = browser.new_context() + page = context.new_page() + + # 1) Navigate to login + page.goto("https://x.com/login") + page.wait_for_timeout(1000) + + # 2) Fill in username + page.wait_for_selector('input[name="text"]', timeout=10000) + page.fill('input[name="text"]', username) + page.keyboard.press("Enter") + + try: + # Attempt normal login flow + page.wait_for_selector('input[name="password"]', timeout=5000) # reduced from 10000 + page.fill('input[name="password"]', password) + page.keyboard.press("Enter") + + # Wait for successful login + page.wait_for_url(lambda url: "home" in url, timeout=5000) + print("[api_free_connector] - Logged in successfully through normal flow.") + + except: + print(f"[api_free_connector] - Normal login failed: Checking for unusual activity...") + + try: + # Check for unusual activity challenge + page.wait_for_selector('input[data-testid="ocfEnterTextTextInput"]', timeout=3000) + + # Fill in phone or username + page.fill('input[data-testid="ocfEnterTextTextInput"]', phone_or_email) + page.keyboard.press("Enter") + page.wait_for_load_state("networkidle") + + # Enter password again after challenge + page.wait_for_selector('input[name="password"]', timeout=5000) + page.fill('input[name="password"]', password) + page.keyboard.press("Enter") + + # Wait for successful login after challenge + page.wait_for_url(lambda url: "home" in url, timeout=5000) + print("[api_free_connector] - Logged in successfully after challenge.") + + except: + print("[api_free_connector] - Error: Login failed - unusual activity flow could not be completed.") + browser.close() + return False + + # Save the current browser context's storage state to a file + context.storage_state(path=str(storage_path)) + print(f"[api_free_connector] - Storage state saved to {storage_path}.") + + browser.close() + return True + +def post_tweet_with_saved_state(tweet_text, storage_path=None): + if storage_path is None: + storage_path = get_state_path() + + with sync_playwright() as p: + # Create a new context with the previously saved state + browser = p.chromium.launch(headless=False) + context = browser.new_context(storage_state=str(storage_path)) + page = context.new_page() + + # Now page is already logged in if state.json is still valid + page.goto("https://x.com/home") + # Post a tweet + tweet_box_selector = 'div[data-testid="tweetTextarea_0"]' + page.wait_for_selector(tweet_box_selector, timeout=10000) + page.fill(tweet_box_selector, tweet_text) + + # post_button_selector = 'div[data-testid="tweetButtonInline"]' + post_button_selector = 'button[data-testid="tweetButtonInline"]' + # page.wait_for_selector(post_button_selector, state="visible", timeout=20000) # Wait for visible + + page.wait_for_selector(post_button_selector, timeout=10000) + page.click(post_button_selector) + page.wait_for_timeout(3000) + print(f"[Twitter API Free Connector] - Tweet posted: {tweet_text}") + + browser.close() + return True + +if __name__ == "__main__": + """ + Example usage. Replace the placeholders with your real credentials. + 'phone_or_username' is used if the suspicious activity screen appears + asking you to confirm via phone or username. + """ + load_dotenv() + + # Test post + X_POST_TEXT = "Hello" + + # Ensure state folder exists and get state file path + state_path = get_state_path() + + # check if login state exists + if state_path.exists(): + print(f"[INFO] {state_path} exists. Using existing state.") + else: + print(f"[INFO] {state_path} does not exist. Logging in and saving state.") + login_and_save_state( + username=os.getenv("X_USERNAME"), + password=os.getenv("X_PASSWORD"), + phone_or_email=os.getenv("X_PHONE_OR_EMAIL"), + storage_path=state_path + ) + + post_tweet_with_saved_state( + tweet_text=X_POST_TEXT, + storage_path=state_path + ) diff --git a/server/connectors/twitter_connector.py b/server/connectors/twitter_connector.py new file mode 100644 index 0000000..a8d02e5 --- /dev/null +++ b/server/connectors/twitter_connector.py @@ -0,0 +1,114 @@ +# +# Module: twitter_connector +# +# This module implements the TwitterConnector class for interacting with Twitter APIs. +# +# Title: Twitter Connector +# Summary: Twitter connector implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-04 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +import os +import time +import tweepy +from dotenv import load_dotenv + +load_dotenv() + +class TwitterConnector: + """A connector for interacting with the Twitter API via Tweepy. + + This class handles OAuth 1.0a and OAuth 2.0 authentication for + posting tweets and retrieving data from Twitter. + + Attributes: + api_key (str): The API key for the Twitter API. + api_secret_key (str): The API secret key for the Twitter API. + access_token (str): The access token for the Twitter API. + access_token_secret (str): The access token secret for the Twitter API. + bearer_token (str): The bearer token for the Twitter API. + bot_username (str): The username of the bot. + bot_id (str): The ID of the bot. + """ + + def __init__(self): + """Initializes the Twitter connector. + + Raises: + ValueError: If Twitter API credentials are not present in the environment variables. + """ + + self.api_key = os.getenv("TWITTER_API_KEY") + # Part of the OAuth 1.0a credentials identifying the application (required for user-based authentication). + + self.api_secret_key = os.getenv("TWITTER_API_KEY_SECRET") + # Secret counterpart to the API key, used in signing OAuth 1.0a requests. + + self.access_token = os.getenv("TWITTER_ACCESS_TOKEN") + # Represents the user’s OAuth 1.0a credentials, required for user-level actions (e.g., posting tweets). + + self.access_token_secret = os.getenv("TWITTER_ACCESS_TOKEN_SECRET") + # Secret counterpart to the access token, used in signing user-level requests under OAuth 1.0a. + + self.bearer_token = os.getenv("TWITTER_BEARER_TOKEN") + # Used for OAuth 2.0 app-only authentication in Twitter API v2, often for read-only access to public data. + + if not all([self.api_key, self.api_secret_key, self.access_token, self.access_token_secret]): + raise ValueError("Twitter API credentials are not set in .env file") + + try: + # Initialize v2 client only + self.client = tweepy.Client( + bearer_token=self.bearer_token, + consumer_key=self.api_key, + consumer_secret=self.api_secret_key, + access_token=self.access_token, + access_token_secret=self.access_token_secret, + wait_on_rate_limit=True + ) + + # Get the bot's info using v2 API + me = self.client.get_me() + self.bot_username = me.data.username.lower() + self.bot_id = me.data.id + print(f"Successfully authenticated as @{self.bot_username}") + + self.last_mention_id = None + except Exception as e: + print(f"Twitter authentication failed: {str(e)}") + raise + + def post_tweet(self, message: str) -> str: + """Posts a tweet to the bot's Twitter account. + + Args: + message (str): The message to be posted as a tweet. Must be shorter than 280 characters. + + Returns: + str: A string message indicating success or failure. + + Raises: + Exception: If there's an error posting the tweet. + + Example: + >>> twitter_connector.post_tweet("Hello, world!") + """ + try: + if not message: + return "Error: Tweet message is empty" + + # Truncate if too long + if len(message) > 280: + message = message[:277] + "..." + + self.client.create_tweet(text=message) + return "Tweeted: " + message + except Exception as e: + return "Error posting tweet: " + str(e) \ No newline at end of file diff --git a/server/handlers/menu_handlers.py b/server/handlers/menu_handlers.py new file mode 100644 index 0000000..e5923aa --- /dev/null +++ b/server/handlers/menu_handlers.py @@ -0,0 +1,236 @@ +# standard imports +import os +import json + +# custom ARAI imports +from utils import config_utils +import prompt_chaining.step_1_create_agent as step_1 +import prompt_chaining.step_2_create_content as step_2 +import prompt_chaining.step_3_create_posts as step_3 +import prompt_chaining.step_4_create_profile_images as step_4 +import prompt_chaining.step_5_agent_chat as step_5 + +def handle_create_agent(ai_model): + """Handle creating a new agent + + Args: + ai_model: The AI model to use + """ + agent_concept = input("\nProvide a concept for the new agent: ") + + print("\nCreating new agent...") + agent_file_path = step_1.create_agent(ai_model, agent_concept) + + set_tracker_post_every_x_minutes(agent_file_path, 30) + + return agent_file_path + +def set_tracker_post_every_x_minutes(agent_file_path, post_every_x_minutes): + """Set the tracker post every x minutes for an agent + + Args: + agent_file_path (str): Path to the agent's master file + post_every_x_minutes (int): The number of minutes to post every + """ + agent_master_template = config_utils.load_agent_master_template(agent_file_path) + + agent_master_template["agent"]["tracker"]["post_every_x_minutes"] = post_every_x_minutes + + config_utils.save_agent_master_template(agent_master_template, agent_file_path) + +def handle_select_agent(): + """Handle selecting an agent + + Returns: + tuple: (selected agent name, agent file path) + """ + agents = config_utils.list_available_agents() + + # Filter out the temporary folder + agents = [agent for agent in agents if agent != "temporary"] + + if not agents: + print("No agents found. Please create an agent first.") + return None, None + + print("\nAvailable agents:") + for i, agent in enumerate(agents, 1): + print(f"{i}. {agent}") + + while True: + try: + choice = int(input("\nSelect an agent (number): ")) + if 1 <= choice <= len(agents): + selected_agent = agents[choice - 1] + agent_file_path = config_utils.get_agent_file_path(selected_agent) + print(f"Selected agent: {selected_agent}") + return selected_agent, agent_file_path + else: + print("Invalid choice. Please try again.") + except ValueError: + print("Please enter a valid number.") + +def handle_select_season(current_agent): + """Handle selecting a season for an agent + + Args: + current_agent (str): The current agent's name + """ + if not current_agent: + print("No agent selected. Please select an agent first.") + return + + seasons = config_utils.list_available_seasons(current_agent) + if not seasons: + print("No seasons found for this agent.") + return + + print("\nAvailable seasons:") + for i, season in enumerate(seasons, 1): + print(f"{i}. {season}") + + while True: + try: + choice = int(input("\nSelect a season (number): ")) + if 1 <= choice <= len(seasons): + selected_season = seasons[choice - 1] + print(f"Selected season: {selected_season}") + config_utils.display_season_details(current_agent, choice-1) + break + else: + print("Invalid choice. Please try again.") + except ValueError: + print("Please enter a valid number.") + + +def handle_create_content(ai_model, current_agent, agent_file_path): + """Handle creating content for an agent + + Args: + ai_model: The AI model to use + current_agent (str): The current agent's name + agent_file_path (str): Path to the agent's master file + """ + if not current_agent: + print("No agent selected. Please select an agent first.") + return + + print(f"\nCreating content for {current_agent}...") + step_2.create_seasons_and_episodes(ai_model, agent_file_path, 3) + +def handle_create_posts(ai_model, current_agent, agent_file_path): + """Handle creating posts for an agent + + Args: + ai_model: The AI model to use + current_agent (str): The current agent's name + agent_file_path (str): Path to the agent's master file + """ + if not current_agent: + print("No agent selected. Please select an agent first.") + return + + print(f"\nCreating posts for {current_agent}...") + step_3.create_episode_posts(ai_model, agent_file_path, 6) + +def handle_create_profile_images(ai_model, current_agent, agent_file_path): + """Handle creating profile images for an agent + + Args: + ai_model: The AI model to use + current_agent (str): The current agent's name + agent_file_path (str): Path to the agent's master file + """ + if not current_agent: + print("No agent selected. Please select an agent first.") + return + + prompt = input("\nDescribe what you want your agent to look like: ") + + print(f"\nCreating profile images for {current_agent}...") + step_4.create_images(ai_model, prompt,agent_file_path, 4) + +def handle_chat_with_agent(ai_model, current_agent, agent_file_path): + """Handle chatting with an agent + + Args: + ai_model: The AI model to use + current_agent (str): The name of the current agent + agent_file_path (str): Path to the agent's master file + """ + if not current_agent: + print("No agent selected. Please select an agent first.") + return + + print("--------------------------------") + print(f"\nStarting chat with {current_agent}...") + print("--------------------------------") + print("\n") + + print(f"Current agent: {current_agent}") + + # loop through chat history and print each message + chat_history = config_utils.load_chat_history(current_agent) + + # print chat history + if chat_history["chat_history"]: + for message in chat_history["chat_history"]: + content = message.get('prompt') if 'prompt' in message else message.get('response') + print(f"{message['role']}: {content}") + print("\n") + + while True: + prompt = input("\nEnter your message (or 'exit' to end chat): ") + if prompt.lower() == 'exit': + break + + response, chat_history = step_5.agent_chat(ai_model, agent_file_path, prompt, chat_history) + if response: + print(f"\n{current_agent}: {response['response']}") + + +def handle_manage_scheduler(scheduler, current_agent, post_manager): + """Handle scheduler management options + + Args: + scheduler: The scheduler instance + current_agent (str): The current agent's name + """ + if not current_agent: + print("No agent selected. Please select an agent first.") + return + + print("\nScheduler Management:") + print("1. Start scheduler") + print("2. Stop scheduler") + print("3. Pause/Resume scheduler") + print("4. Back to main menu") + + choice = input("\nEnter your choice (1-4): ") + + if choice == "1": + if not scheduler.is_running(): + scheduler.start() + scheduler.schedule_posts( + post_manager=post_manager, + tracker_data=config_utils.load_agent_tracker_config(current_agent), + ) + print("Scheduler started.") + else: + print("Scheduler is already running.") + elif choice == "2": + if scheduler.is_running(): + scheduler.stop() + print("Scheduler stopped.") + else: + print("Scheduler is not running.") + elif choice == "3": + if scheduler.is_running(): + if scheduler.is_paused(): + scheduler.resume() + print("Scheduler resumed.") + else: + scheduler.pause() + print("Scheduler paused.") + else: + print("Scheduler is not running.") diff --git a/server/main.py b/server/main.py new file mode 100644 index 0000000..d44c8f5 --- /dev/null +++ b/server/main.py @@ -0,0 +1,96 @@ +# +# Module: main +# +# This module implements the main function for the ARAI Agents application. +# +# Title: ARAI Agents +# Summary: ARAI Agents implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-04 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +# standard imports +import os +import json + +# custom ARAI imports +from models.gemini_model import GeminiModel +from models.openai_model import OpenAIModel +from models.claude_model import ClaudeModel +from models.deepseek_model import DeepSeekModel +from utils.scheduler import AgentScheduler +from handlers import menu_handlers +from utils.post_manager import PostManager + +def main(): + """Main function for the ARAI Agents application""" + # Initialize the AI model and scheduler + ai_model = GeminiModel(model_name="gemini-1.5-flash-latest") + # ai_model = OpenAIModel() + # ai_model = ClaudeModel() + # ai_model = DeepSeekModel() + + scheduler = AgentScheduler() + post_manager = None + + # Initialize variables + current_agent = None + agent_file_path = None + + while True: + print("\nARAI Agents Menu:") + print("\n= Agent Management =") + print("1. Create New Agent") + print("2. Select Agent") + print("3. Social Feed") + + print("\n= Content Creation =") + print("4. Create Content") + print("5. Create Posts") + print("6. Create Profile Images") + + print("\n= Scheduler =") + print("7. Manage Scheduler") + + print("\n= Chat =") + print("8. Chat with Agent") + + print("\n= Exit =") + print("9. Exit") + + choice = input("\nEnter your choice (1-9): ") + + if choice == "1": + agent_file_path = menu_handlers.handle_create_agent(ai_model) + elif choice == "2": + current_agent, agent_file_path = menu_handlers.handle_select_agent() + post_manager = PostManager(current_agent) + elif choice == "3": + # update this to social media feed - prints off all the posts for the season + menu_handlers.handle_select_season(current_agent) + elif choice == "4": + menu_handlers.handle_create_content(ai_model, current_agent, agent_file_path) + elif choice == "5": + menu_handlers.handle_create_posts(ai_model, current_agent, agent_file_path) + elif choice == "6": + menu_handlers.handle_create_profile_images(ai_model, current_agent, agent_file_path) + elif choice == "7": + menu_handlers.handle_manage_scheduler(scheduler, current_agent, post_manager) + elif choice == "8": + menu_handlers.handle_chat_with_agent(ai_model, current_agent, agent_file_path) + elif choice == "9": + if scheduler.is_running(): + scheduler.stop() + print("Goodbye!") + break + else: + print("Invalid choice. Please try again.") + +if __name__ == "__main__": + main() diff --git a/server/models/__init__.py b/server/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/models/base_model.py b/server/models/base_model.py new file mode 100644 index 0000000..c91bb60 --- /dev/null +++ b/server/models/base_model.py @@ -0,0 +1,36 @@ +# +# Module: base_model +# +# This module implements the ModelInterface class for interacting with ai apis. +# +# Title: Base Model +# Summary: Base model implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-04 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino +from abc import ABC, abstractmethod # Import the ABC class and abstractmethod from the abc module + +class ModelInterface(ABC): + """Base class for all models. + """ + @abstractmethod + def generate_response(self, prompt: str) -> str: + """ Generate a response to a given prompt. + + Args: + prompt (str): The prompt to generate a response to. + + Returns: + str: The generated response. + + Example: + >>> base_model.generate_response("Hello, world!") + """ + + pass \ No newline at end of file diff --git a/server/models/claude_model.py b/server/models/claude_model.py new file mode 100644 index 0000000..92ec1cc --- /dev/null +++ b/server/models/claude_model.py @@ -0,0 +1,171 @@ +import os +import anthropic +from .base_model import ModelInterface +from dotenv import load_dotenv +import sys +import json + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +load_dotenv() + +class ClaudeModel(ModelInterface): + """DeepSeek model implementation. + + Attributes: + model (str): The name of the DeepSeek model to use. + """ + + def __init__(self, my_api_key=None, model_name="claude-3-5-sonnet-20241022"): + """Initialize the DeepSeek model. + + Args: + api_key (str): The API key to use for the DeepSeek model. + model_name (str): The name of the DeepSeek model to use. + + Example: + >>> deepseek_model = DeepSeekModel() + """ + + self.model_name = model_name + + if my_api_key: + self.client = client = anthropic.Anthropic( + # defaults to os.environ.get("ANTHROPIC_API_KEY") + api_key=my_api_key, + ) + else: + self.client = anthropic.Anthropic( + api_key=os.environ.get("ANTHROPIC_API_KEY") + ) + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using the OpenAI API. + # ------------------------------------------------------------------- + def generate_response(self, prompt, **kwargs): + """Generate a response to a given prompt using the DeepSeek API. + + Args: + prompt (str): The prompt to generate a response to. + **kwargs: Additional keyword arguments. + + Returns: + str: The generated response. + + Example: + >>> deepseek_model = DeepSeekModel() + >>> response = deepseek_model.generate_response("What is the weather in Tokyo?") + """ + if isinstance(prompt, str): + return self.generate_response_from_string(prompt, **kwargs) + elif isinstance(prompt, list[dict]): + return self.generate_response_dictionary(prompt) + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using a list of dictionaries + # ------------------------------------------------------------------- + def generate_response_dictionary(self, prompt: list[dict]) -> str: + """Generate a response to a given prompt using a list of dictionaries. + + Args: + prompt (list[dict]): The prompt to generate a response to. + + Returns: + str: The generated response. + + Example: + >>> deepseek_model = DeepSeekModel() + >>> response = deepseek_model.generate_response_dictionary([{"role": "user", "parts": "What is the weather in Tokyo?"}]) + """ + try: + response = self.client.messages.create( # Create a chat completion with the OpenAI API + model=self.model_name, # Set the model type we want to use + messages=prompt, # Set the prompt we want to use + max_tokens=1024 + ) + + return response.content[0].text if isinstance(response.content, list) else response.content + except Exception as e: + return f"Error generating response: {str(e)}" + + + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using a string + # ------------------------------------------------------------------- + def generate_response_from_string(self, prompt, **kwargs): + """ + Description: + Generate a response to a given prompt using a string. + + Args: + prompt (str): The prompt to generate a response to. + **kwargs: Additional keyword arguments. + + Returns: + str: The generated response. + + Example: + >>> deepseek_model = DeepSeekModel() + >>> response = deepseek_model.generate_response_from_string("What is the weather in Tokyo?") + """ + # Extract personality and style from kwargs, or use defaults from agent_template + if kwargs: + if "personality" in kwargs: + personality = kwargs.get("personality") + if "communication_style" in kwargs: + communication_style = kwargs.get("communication_style") + else: + personality = "" + communication_style = "" + + try: + # instructions being sent to the ai model + messages = [] + + # add personality and style to the instructions + if personality or communication_style: + persona_prompt = f"{personality} {communication_style}".strip() + messages.append({ + "role": "system", + "content": persona_prompt + }) + + # User message + messages.append({ + "role": "user", + "content": prompt + }) + + # generate the response + # generate the response + # response = self.client.messages.create( # Create a chat completion with the OpenAI API + # model=self.model_name, # Set the model type we want to use + # messages=messages, # Set the prompt we want to use + # temperature=0.7, # Set the temperature of the response + # max_tokens=400, # Set the maximum number of tokens to generate + # ) + response = self.client.messages.create( # Create a chat completion with the OpenAI API + model=self.model_name, # Set the model type we want to use + messages=messages, # Set the prompt we want to use + max_tokens=1024 + ) + + return response.content[0].text if isinstance(response.content, list) else response.content + + except Exception as e: + return f"Error generating response: {str(e)}" + + +if __name__ == "__main__": + deepseek_model = DeepSeekModel() + response = deepseek_model.generate_response("Tell me 10 one liners about crypto. put them as a json object") + # Extract just the text content from the response + if hasattr(response, 'text'): + print("\nClaude's Response:\n") + print(response.text) + print("\n") + else: + print("\nClaude's Response:\n") + print(response) + print("\n") diff --git a/server/models/deepseek_model.py b/server/models/deepseek_model.py new file mode 100644 index 0000000..06840c7 --- /dev/null +++ b/server/models/deepseek_model.py @@ -0,0 +1,172 @@ +# +# Module: deepseek_model +# +# This module implements the DeepSeekModel class for interacting with the DeepSeek API. +# +# Title: DeepSeek Model +# Summary: DeepSeek model implementation. +# Authors: +# - @TheBlockRhino +# Created: 2025-01-22 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-22 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +import os +from openai import OpenAI # Please install OpenAI SDK first: `pip3 install openai` +from .base_model import ModelInterface +from dotenv import load_dotenv +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +load_dotenv() + +class DeepSeekModel(ModelInterface): + """DeepSeek model implementation. + + Attributes: + model (str): The name of the DeepSeek model to use. + """ + + def __init__(self, my_api_key=None, model_name="deepseek-chat"): + """Initialize the DeepSeek model. + + Args: + api_key (str): The API key to use for the DeepSeek model. + model_name (str): The name of the DeepSeek model to use. + + Example: + >>> deepseek_model = DeepSeekModel() + """ + + self.model_name = model_name + + if my_api_key: + self.client = OpenAI(api_key=my_api_key, base_url="https://api.deepseek.com") + else: + self.client = OpenAI(api_key=os.environ.get('DEEPSEEK_API_KEY'), base_url="https://api.deepseek.com") + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using the OpenAI API. + # ------------------------------------------------------------------- + def generate_response(self, prompt, **kwargs): + """Generate a response to a given prompt using the DeepSeek API. + + Args: + prompt (str): The prompt to generate a response to. + **kwargs: Additional keyword arguments. + + Returns: + str: The generated response. + + Example: + >>> deepseek_model = DeepSeekModel() + >>> response = deepseek_model.generate_response("What is the weather in Tokyo?") + """ + if isinstance(prompt, str): + return self.generate_response_from_string(prompt, **kwargs) + elif isinstance(prompt, list[dict]): + return self.generate_response_dictionary(prompt) + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using a list of dictionaries + # ------------------------------------------------------------------- + def generate_response_dictionary(self, prompt: list[dict]) -> str: + """Generate a response to a given prompt using a list of dictionaries. + + Args: + prompt (list[dict]): The prompt to generate a response to. + + Returns: + str: The generated response. + + Example: + >>> deepseek_model = DeepSeekModel() + >>> response = deepseek_model.generate_response_dictionary([{"role": "user", "parts": "What is the weather in Tokyo?"}]) + """ + try: + response = self.client.chat.completions.create( # Create a chat completion with the OpenAI API + model=self.model_name, # Set the model type we want to use + messages=prompt # Set the prompt we want to use + ) + + return response.choices[0].message.content.strip() + except Exception as e: + return f"Error generating response: {str(e)}" + + + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using a string + # ------------------------------------------------------------------- + def generate_response_from_string(self, prompt, **kwargs): + """ + Description: + Generate a response to a given prompt using a string. + + Args: + prompt (str): The prompt to generate a response to. + **kwargs: Additional keyword arguments. + + Returns: + str: The generated response. + + Example: + >>> deepseek_model = DeepSeekModel() + >>> response = deepseek_model.generate_response_from_string("What is the weather in Tokyo?") + """ + # Extract personality and style from kwargs, or use defaults from agent_template + if kwargs: + if "personality" in kwargs: + personality = kwargs.get("personality") + if "communication_style" in kwargs: + communication_style = kwargs.get("communication_style") + else: + personality = "" + communication_style = "" + + try: + # instructions being sent to the ai model + messages = [] + + # add personality and style to the instructions + if personality or communication_style: + persona_prompt = f"{personality} {communication_style}".strip() + messages.append({ + "role": "system", + "content": persona_prompt + }) + + # User message + messages.append({ + "role": "user", + "content": prompt + }) + + # generate the response + # generate the response + # response = self.client.chat.completions.create( # Create a chat completion with the OpenAI API + # model=self.model_name, # Set the model type we want to use + # messages=messages, # Set the prompt we want to use + # temperature=0.7, # Set the temperature of the response + # max_tokens=400, # Set the maximum number of tokens to generate + # ) + response = self.client.chat.completions.create( # Create a chat completion with the OpenAI API + model=self.model_name, # Set the model type we want to use + messages=messages # Set the prompt we want to use + ) + + return response.choices[0].message.content.strip() + + except Exception as e: + return f"Error generating response: {str(e)}" + + +if __name__ == "__main__": + deepseek_model = DeepSeekModel() + response = deepseek_model.generate_response("Tell me 10 one liners about crypto. put them as a json object") + print(response) diff --git a/server/models/gemini_model.py b/server/models/gemini_model.py new file mode 100644 index 0000000..bc37dc4 --- /dev/null +++ b/server/models/gemini_model.py @@ -0,0 +1,156 @@ +# +# Module: gemini_model +# +# This module implements the GeminiModel class for interacting with the Gemini API. +# +# Title: Gemini Model +# Summary: Gemini model implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-04 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino +import os +import google.generativeai as genai +from .base_model import ModelInterface +from dotenv import load_dotenv +import yaml +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +load_dotenv() + +class GeminiModel(ModelInterface): + """Gemini model implementation. + + Attributes: + model (str): The name of the Gemini model to use. + """ + + def __init__(self, my_api_key=None, model_name="gemini-exp-1206"): + """Initialize the Gemini model. + + Args: + api_key (str): The API key to use for the Gemini model. + model_name (str): The name of the Gemini model to use. + + Example: + >>> gemini_model = GeminiModel() + """ + if my_api_key: + genai.configure(api_key=my_api_key) + else: + genai.configure(api_key=os.environ.get('GOOGLE_GEMINI_API_KEY')) + self.model = genai.GenerativeModel(model_name) + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using the Gemini API. + # ------------------------------------------------------------------- + def generate_response(self, prompt, **kwargs): + """Generate a response to a given prompt using the Gemini API. + + Args: + prompt (str): The prompt to generate a response to. + **kwargs: Additional keyword arguments. + + Returns: + str: The generated response. + + Example: + >>> gemini_model = GeminiModel() + >>> response = gemini_model.generate_response("What is the weather in Tokyo?") + """ + if isinstance(prompt, str): + return self.generate_response_from_string(prompt, **kwargs) + elif isinstance(prompt, list[dict]): + return self.generate_response_dictionary(prompt) + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using a list of dictionaries + # ------------------------------------------------------------------- + def generate_response_dictionary(self, prompt: list[dict]) -> str: + """Generate a response to a given prompt using a list of dictionaries. + + Args: + prompt (list[dict]): The prompt to generate a response to. + + Returns: + str: The generated response. + + Example: + >>> gemini_model = GeminiModel() + >>> response = gemini_model.generate_response_dictionary([{"role": "user", "parts": "What is the weather in Tokyo?"}]) + """ + try: + response = self.model.generate_content(prompt) + return response.text.strip() + except Exception as e: + return f"Error generating response: {str(e)}" + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using a string + # ------------------------------------------------------------------- + def generate_response_from_string(self, prompt, **kwargs): + """ + Description: + Generate a response to a given prompt using a string. + + Args: + prompt (str): The prompt to generate a response to. + **kwargs: Additional keyword arguments. + + Returns: + str: The generated response. + + Example: + >>> gemini_model = GeminiModel() + >>> response = gemini_model.generate_response_from_string("What is the weather in Tokyo?") + """ + # Extract personality and style from kwargs, or use defaults from agent_template + if kwargs: + if "personality" in kwargs: + personality = kwargs.get("personality") + if "communication_style" in kwargs: + communication_style = kwargs.get("communication_style") + else: + personality = "" + communication_style = "" + + try: + # instructions being sent to the ai model + messages = [] + + # add personality and style to the instructions + if personality or communication_style: + persona_prompt = f"{personality} {communication_style}" + messages.append({ + "role": "user", + "parts": [persona_prompt] + }) + + # user message + messages.append({ + "role": "user", + "parts": [prompt] + }) + + # Make sure that what is being sent to the model is correct + # print(messages) + + # generate the response + response = self.model.generate_content(messages) + return response.text.strip() + + except Exception as e: + return f"Error generating response: {str(e)}" + +if __name__ == "__main__": + gemini_model = GeminiModel() + response = gemini_model.generate_response("Tell me 10 one liners about crypto. put them as a json object") + print(response) + diff --git a/server/models/openai_model.py b/server/models/openai_model.py new file mode 100644 index 0000000..a7e95cc --- /dev/null +++ b/server/models/openai_model.py @@ -0,0 +1,144 @@ +import os # Os is used for interacting with the operating system +from openai import OpenAI # OpenAI is used for interacting with the OpenAI API +from .base_model import ModelInterface # Used for agent interface +from dotenv import load_dotenv # Used for loading environment variables + +load_dotenv() # Load environment variables from .env file + +class OpenAIModel(ModelInterface): # OpenAIModel inherits from ModelInterface + ''' + OpenAI model implementation. + ''' + + def __init__(self, my_api_key=None, model_name="gpt-4o"): + ''' + Initialize the OpenAI model. + ''' + + # ai model setup + self.model_name = model_name # Set the model type we want to use + if my_api_key: + self.client = OpenAI(api_key=my_api_key) + else: + self.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using the OpenAI API. + # ------------------------------------------------------------------- + def generate_response(self, prompt, **kwargs): + """Generate a response to a given prompt using the OpenAI API. + + Args: + prompt (str): The prompt to generate a response to. + **kwargs: Additional keyword arguments. + + Returns: + str: The generated response. + + Example: + >>> openai_model = OpenAIModel() + >>> response = openai_model.generate_response("What is the weather in Tokyo?") + """ + if isinstance(prompt, str): + return self.generate_response_from_string(prompt, **kwargs) + elif isinstance(prompt, list[dict]): + return self.generate_response_dictionary(prompt) + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using a list of dictionaries + # ------------------------------------------------------------------- + def generate_response_dictionary(self, prompt: list[dict]) -> str: + """Generate a response to a given prompt using a list of dictionaries. + + Args: + prompt (list[dict]): The prompt to generate a response to. + + Returns: + str: The generated response. + + Example: + >>> openai_model = OpenAIModel() + >>> response = openai_model.generate_response_dictionary([{"role": "user", "parts": "What is the weather in Tokyo?"}]) + """ + try: + response = self.client.chat.completions.create( # Create a chat completion with the OpenAI API + model=self.model_name, # Set the model type we want to use + messages=prompt # Set the prompt we want to use + ) + + return response.choices[0].message.content.strip() + except Exception as e: + return f"Error generating response: {str(e)}" + + + + # ------------------------------------------------------------------- + # Helper to generate a response to a given prompt using a string + # ------------------------------------------------------------------- + def generate_response_from_string(self, prompt, **kwargs): + """ + Description: + Generate a response to a given prompt using a string. + + Args: + prompt (str): The prompt to generate a response to. + **kwargs: Additional keyword arguments. + + Returns: + str: The generated response. + + Example: + >>> openai_model = OpenAIModel() + >>> response = openai_model.generate_response_from_string("What is the weather in Tokyo?") + """ + # Extract personality and style from kwargs, or use defaults from agent_template + if kwargs: + if "personality" in kwargs: + personality = kwargs.get("personality") + if "communication_style" in kwargs: + communication_style = kwargs.get("communication_style") + else: + personality = "" + communication_style = "" + + try: + # instructions being sent to the ai model + messages = [] + + # add personality and style to the instructions + if personality or communication_style: + persona_prompt = f"{personality} {communication_style}".strip() + messages.append({ + "role": "system", + "content": persona_prompt + }) + + # User message + messages.append({ + "role": "user", + "content": prompt + }) + + # generate the response + # generate the response + # response = self.client.chat.completions.create( # Create a chat completion with the OpenAI API + # model=self.model_name, # Set the model type we want to use + # messages=messages, # Set the prompt we want to use + # temperature=0.7, # Set the temperature of the response + # max_tokens=400, # Set the maximum number of tokens to generate + # ) + response = self.client.chat.completions.create( # Create a chat completion with the OpenAI API + model=self.model_name, # Set the model type we want to use + messages=messages # Set the prompt we want to use + ) + + return response.choices[0].message.content.strip() + + except Exception as e: + return f"Error generating response: {str(e)}" + + +if __name__ == "__main__": + openai_model = OpenAIModel() + response = openai_model.generate_response("Tell me 10 one liners about crypto. put them as a json object") + print(response) diff --git a/server/prompt_chaining/__init__.py b/server/prompt_chaining/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/server/prompt_chaining/__init__.py @@ -0,0 +1 @@ + diff --git a/server/prompt_chaining/step_1_create_agent.py b/server/prompt_chaining/step_1_create_agent.py new file mode 100644 index 0000000..d0c563a --- /dev/null +++ b/server/prompt_chaining/step_1_create_agent.py @@ -0,0 +1,150 @@ +# +# Module: step_1 +# +# This module implements the step_1 function for creating a new agent. +# +# Title: Step 1 +# Summary: Step 1 implementation. +# Authors: +# - @TheBlockRhino +# Created: 2025-01-02 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-09 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +# standard imports +import yaml +import json +import sys +import os +import time +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# custom ARAI imports +from utils.content_generator import ContentGenerator +import prompt_chaining.step_2_create_content as next_step +from utils.template_types import TemplateType + +# ------------------------------------------------------------------- +# Step 1: Create a new agent +# ------------------------------------------------------------------- +def create_agent(ai_model, concept: str): + ''' + Description: + Create a new agent + + Args: + ai_model: The AI model to use for generating responses + debug (bool, optional): whether to print debug information. Defaults to False. + + Returns: + agent_file_path: The path to the agent yaml file + + Raises: + Exception: If there's an error creating the agent + + Example: + >>> ai_model = GeminiModel() + >>> step_1(ai_model, "alien drone pilot who is a sarcastic asshole visiting earth to report back his findings to his home planet") + ''' + + # Step 1.1: Create a new agent + manager = ContentGenerator() + # agent_template = manager.create_new_template_yaml(TemplateType.AGENT) + agent_template = manager.create_new_template_json(TemplateType.AGENT) + agent_master_template = manager.create_new_template_json(TemplateType.MASTER) + + # Gather a list of agent names based on folder names in config folder + agent_names_blacklist = manager.get_agent_names_blacklist() + # remove _ from names + # print(f"agent_names_blacklist: {agent_names_blacklist}") + # agent_names_blacklist = [name.replace("_", " ") for name in agent_names_blacklist] + print(f"agent_names_blacklist: {agent_names_blacklist}") + + # step 1.2: Generate a new agent name, topic, personality, and communication style with the prompt_1 template + # prompt 1 Character Creation: + print("Crafting prompt for AI to create a new agent") + prompt_1_vars = { + # "agent_name": "", + # "personality": "", + # "communication_style": "", + # "topic": "", + "concept": concept, + "agent_names_blacklist": agent_names_blacklist, + "agent_json": json.dumps(agent_template) + } + + # Constants for retry configuration + max_retries = 3 + delay = 2 # seconds between retries + + # step 3.11: Run the prompt with retry logic for LLM failures + success = False + for attempt in range(max_retries): + try: + # step 1.3: Run the prompt + print("Sending prompt to AI to create a new agent") + agent_data = manager.run_prompt( + prompt_key="prompt_1 (Character Sheet Creation)", + template_vars=prompt_1_vars, + ai_model=ai_model, + debug=False + ) + + # Validate that posts_data is valid JSON and has expected structure + if isinstance(agent_data, dict) and 'agent' in agent_data: + success = True + break + else: + print(f"Invalid response format. Attempt {attempt + 1}/{max_retries}") + + except (json.JSONDecodeError, Exception) as e: + print(f"Error on attempt {attempt + 1}/{max_retries}: {str(e)}") + if attempt < max_retries - 1: + print(f"Retrying in {delay} seconds...") + time.sleep(delay) + continue + + if not success: + print("Max retries reached. Failed to get valid response from LLM.") + return None + + # step 1.4: Merge agent details into the master template + print("Merging agent details into the master template") + agent_master_template = manager.merge_agent_details( + master_data=agent_master_template, + agent_data=agent_data + ) + + # step 1.5: store the concept in the agent template + print("Storing the concept in the agent template") + agent_master_template["agent"]["concept"] = prompt_1_vars["concept"] + + # step 1.6: create the file path for master file + print("Creating the file path for the master file") + agent_master_file_path = manager.create_filepath( + agent_name=agent_master_template["agent"]["agent_details"]["name"], + season_number=0, + episode_number=0, + template_type=TemplateType.MASTER + ) + + # step 1.7: Save the agent data to a file + print("Saving the agent data to a file") + manager.save_json_file( + save_path=agent_master_file_path, + json_data=agent_master_template + ) + + print("Step 1 complete") + return agent_master_file_path + + +import models.gemini_model as gemini_model +if __name__ == "__main__": + ai_model = gemini_model.GeminiModel() + create_agent(ai_model, "time-traveling historian documenting the evolution of human technology through the ages") + diff --git a/server/prompt_chaining/step_2_create_content.py b/server/prompt_chaining/step_2_create_content.py new file mode 100644 index 0000000..e111af6 --- /dev/null +++ b/server/prompt_chaining/step_2_create_content.py @@ -0,0 +1,162 @@ +# +# Module: step_2 +# +# This module implements the step_2 function for creating a new season for an agent. +# +# Title: Step 2 +# Summary: Step 2 implementation. +# Authors: +# - @TheBlockRhino +# Created: 2025-01-02 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-09 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +# standard imports +import os +import json +import json +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# custom ARAI imports +from utils.content_generator import ContentGenerator +from utils.template_types import TemplateType +import prompt_chaining.step_3_create_posts as next_step + +def create_seasons_and_episodes(ai_model, master_file_path, number_of_episodes): + ''' + Description: + Create a new season for the agent + + Args: + ai_model: The AI model to use for generating responses + master_file_path: The path to the agent master json file + + Returns: + season_file_path: The path to the season json file + + Raises: + Exception: If there's an error creating the season + + Example: + >>> ai_model = GeminiModel() + >>> master_file_path = "agent_template.json" + >>> step_2(ai_model, master_file_path) + ''' + print("Step 2: Create a new season") + + # step 2.1: load the season template json file + manager = ContentGenerator() + #season_template = manager.create_new_template_yaml(TemplateType.SEASON) + print(f"Creating a new season template") + season_template = manager.create_new_template_json(TemplateType.SEASON) + + # step 2.2: load the agent json file + print(f"Loading agent master json file") + agent_master_json = None + with open(master_file_path, 'r', encoding='utf-8') as file: + agent_master_json = json.load(file) + + # extract agent from master json + print(f"Extracting agent details from master json") + agent_details = agent_master_json['agent']['agent_details'] + + + # if the seasons array is empty or None, we need to initialize it + if not agent_master_json['agent']['seasons'] or agent_master_json['agent']['seasons'] == []: + agent_master_json['agent']['seasons'] = season_template['seasons'] + + # step 2.3: find the previous season + # get last season file + previous_season = None + # Get the last season from the seasons array if it exists + seasons = agent_master_json['agent']['seasons'] + previous_season = seasons[-1] if seasons else None + + if previous_season: + print(f"Found previous season: {previous_season['season_number']}") + else: + print("No previous seasons found") + + # step 2.3: Generate a new season name, topic, and communication style with the prompt_2 template + # prompt 2 Season Creation: + # note that emojis will be output as unicode characters due to the json dump + print("Crafting prompt for AI to create a new season") + prompt_2_vars = { + "agent_name": agent_details["name"], + "agent_json": json.dumps(agent_details), + "season_json": json.dumps(season_template), + "previous_season": json.dumps(previous_season), + "number_of_episodes": number_of_episodes + } + + # Constants for retry configuration + max_retries = 3 + delay = 2 # seconds between retries + + # step 3.11: Run the prompt with retry logic for LLM failures + success = False + for attempt in range(max_retries): + try: + # step 2.4: Run the prompt + print("Sending prompt to AI to create a new season") + season_data = manager.run_prompt( + # prompt_key="prompt_1 (Character Creation)", + prompt_key="prompt_2 (Season Creation)", + template_vars=prompt_2_vars, + ai_model=ai_model, + ) + + # Validate that posts_data is valid JSON and has expected structure + if isinstance(season_data, dict) and 'seasons' in season_data: + success = True + break + else: + print(f"Invalid response format. Attempt {attempt + 1}/{max_retries}") + + except (json.JSONDecodeError, Exception) as e: + print(f"Error on attempt {attempt + 1}/{max_retries}: {str(e)}") + if attempt < max_retries - 1: + print(f"Retrying in {delay} seconds...") + time.sleep(delay) + continue + + if not success: + print("Max retries reached. Failed to get valid response from LLM.") + return None + + #print(f"season data is: {season_data}") + + # step 2.8: append the season data to the master data + if len(seasons) <= 1 and seasons[0]["season_number"] == 0: + print("First season, so we need to initialize the seasons array") + agent_master_json = manager.initialize_seasons( + master_data=agent_master_json, + seasons_data=season_data + ) + else: + print("Appending the season data to the master data") + agent_master_json = manager.append_seasons( + master_data=agent_master_json, + seasons_data=season_data, + ) + + # step 2.9: save the master data to a file + print("Saving the master data to a file") + manager.save_json_file( + save_path=master_file_path, + json_data=agent_master_json + ) + + print("Step 2 complete") + #return season_file_path + +import models.gemini_model as gemini_model +if __name__ == "__main__": + ai_model = gemini_model.GeminiModel() + create_seasons_and_episodes(ai_model, "configs/CipherCat/CipherCat_master.json", 3) \ No newline at end of file diff --git a/server/prompt_chaining/step_3_create_posts.py b/server/prompt_chaining/step_3_create_posts.py new file mode 100644 index 0000000..b52ccd9 --- /dev/null +++ b/server/prompt_chaining/step_3_create_posts.py @@ -0,0 +1,161 @@ +# +# Module: step_3 +# +# This module implements the step_3 function for creating a new episode posts for an agent. +# +# Title: Step 3 +# Summary: Step 3 implementation. +# Authors: +# - @TheBlockRhino +# Created: 2025-01-02 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-09 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +# standard imports +import os +import yaml +import json +import sys +import time + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# custom ARAI imports +from utils.content_generator import ContentGenerator +from utils.template_types import TemplateType + +def create_episode_posts(ai_model, master_file_path, number_of_posts): + ''' + Description: + Create a new episode posts for the agent + + Args: + ai_model: The AI model to use for generating responses + master_file_path: The path to the agent master json file + + Raises: + Exception: If there's an error creating the episode posts + + Example: + >>> ai_model = GeminiModel() + >>> master_file_path = "configs/Zorp/Zorp_master.json" + >>> step_3(ai_model, master_file_path) + ''' + print("Step 3: Create a batch of posts for episode") + + # step 3.1: load the season template yaml file + manager = ContentGenerator() + + episode_template = manager.create_new_template_json(TemplateType.EPISODE) + + # step 2.2: load the agent json file + agent_master_json = None + with open(master_file_path, 'r', encoding='utf-8') as file: + agent_master_json = json.load(file) + + # extract agent details from master json + agent_details = agent_master_json['agent']['agent_details'] + + # get last season file + current_season = None + # Get the last season from the seasons array if it exists + seasons = agent_master_json['agent']['seasons'] + current_season = seasons[-1] if seasons else None + + # Extract season details + season_details = { + 'season_name': current_season['season_name'], + 'season_number': current_season['season_number'], + 'season_description': current_season['season_description'], + 'season_highlights': current_season['season_highlights'], + 'season_summary': current_season['season_summary'], + } + + previous_episode = None + + # Iterate over episodes while maintaining season context + for episode in current_season['episodes']: + # Now you have access to both season_details and the current episode + print(f"Processing Episode {episode['episode_number']} of Season {season_details['season_number']}") + # Work with episode data + episode_data = { + 'episode_name': episode['episode_name'], + 'episode_number': episode['episode_number'], + 'episode_description': episode['episode_description'], + 'episode_highlights': episode['episode_highlights'], + 'episode_summary': episode['episode_summary'], + } + + # step 3.10: Generate a new season name, topic, and communication style with the prompt_2 template + # prompt 2 Season Creation: + # note that emojis will be output as unicode characters due to the yaml dump + + prompt_3_vars = { + "agent_name": agent_details["name"], + "agent_json": json.dumps(agent_details), + "season_json": json.dumps(season_details), + "episode_json": json.dumps(episode_data), + "previous_episode": json.dumps(previous_episode), + "number_of_posts": number_of_posts, + "post_length": 277 + } + + # Constants for retry configuration + max_retries = 3 + delay = 2 # seconds between retries + + # step 3.11: Run the prompt with retry logic for LLM failures + success = False + for attempt in range(max_retries): + try: + posts_data = manager.run_prompt( + prompt_key="prompt_3 (Episode Posts Creation)", + template_vars=prompt_3_vars, + ai_model=ai_model, + ) + + # Validate that posts_data is valid JSON and has expected structure + if isinstance(posts_data, dict) and 'posts' in posts_data: + success = True + break + else: + print(f"Invalid response format. Attempt {attempt + 1}/{max_retries}") + + except (json.JSONDecodeError, Exception) as e: + print(f"Error on attempt {attempt + 1}/{max_retries}: {str(e)}") + if attempt < max_retries - 1: + print(f"Retrying in {delay} seconds...") + time.sleep(delay) + continue + + if not success: + print("Max retries reached. Failed to get valid response from LLM.") + return None + + print("Appending the episode data to the master data") + agent_master_json = manager.append_episodes( + master_data=agent_master_json, + posts_data=posts_data, + season_index=season_details["season_number"]-1, + episode_index= episode_data["episode_number"]-1 + ) + + # step 2.9: save the master data to a file + print("Saving the master data to a file") + manager.save_json_file( + save_path=master_file_path, + json_data=agent_master_json + ) + + # step 3.15: Move onto the next step of creating a new season + previous_episode = episode_data + +import models.gemini_model as gemini_model +if __name__ == "__main__": + ai_model = gemini_model.GeminiModel() + create_episode_posts(ai_model, "configs/Pixelina/Pixelina_master.json", 6) + diff --git a/server/prompt_chaining/step_4_create_profile_images.py b/server/prompt_chaining/step_4_create_profile_images.py new file mode 100644 index 0000000..c29253d --- /dev/null +++ b/server/prompt_chaining/step_4_create_profile_images.py @@ -0,0 +1,182 @@ +# +# Module: template_types +# +# This module implements the TemplateType class for defining the type of template. +# +# Title: Template Types +# Summary: Template types implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-12 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +import requests +import os +import dotenv +import time +import json +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# custom ARAI imports +from utils.content_generator import ContentGenerator +from utils.template_types import TemplateType +import asset_generation.images_leonardo as images_leonardo +from models.gemini_model import GeminiModel + +dotenv.load_dotenv() + +def create_images(ai_model, prompt, master_file_path, num_images): + # 4.1 Setup model details + model_details = json.loads(open("asset_generation/leonard_anime_styles.json", "r").read()) + model_id = model_details["models"][0]["modelId"] + anime_general_style = next( + style for style in model_details["models"][0]["styles"] + if style["style name"] == "Anime General" + ) + + # 4.2 Setup style UUID + style_uuid = anime_general_style["styleUUID"] + + # 4.3 Setup number of images + num_images = 4 + + # 4.4 Create image descriptions + # If prompt is None, we need to create image descriptions automatically + if prompt is None or prompt == "": + # # 4.4 Create image descriptions + # image_descriptions = image_post_description(ai_model, master_file_path, num_images) + + # # 4.5 loop through image descriptions and create profile images + # for image_description in image_descriptions["profile_image_descriptions"]: + # print(image_description["description"] + "\n") + # # 4.6 Create profile images + # create_profile_images(image_description, master_file_path, model_id, style_uuid, num_images, consistent=True, max_retries=10, delay=5) + + # Simple fix for now is to feed in the agents concept into the prompt + agent_master_json = None + with open(master_file_path, 'r', encoding='utf-8') as file: + agent_master_json = json.load(file) + + prompt = agent_master_json['agent']['concept'] + create_profile_images(prompt, master_file_path, model_id, style_uuid, num_images, consistent=False, max_retries=10, delay=5) + + # 4.7 Create profile images based on users prompt + else: + create_profile_images(prompt, master_file_path, model_id, style_uuid, num_images, consistent=False, max_retries=10, delay=5) + +def image_post_description(ai_model, master_file_path, num_images): + manager = ContentGenerator() + image_descriptions = None + + # step 4.2: load the agent json file + agent_master_json = None + with open(master_file_path, 'r', encoding='utf-8') as file: + agent_master_json = json.load(file) + + # step 4.3: extract agent from master json + agent_details = agent_master_json['agent']['agent_details'] + + print("Crafting prompt for AI to create a new profile image descriptions") + prompt_4_vars = { + "agent_name": agent_details["name"], + "agent_json": json.dumps(agent_details), + "number_of_images": num_images + } + + # step 2.4: Run the prompt + print("Sending prompt to AI to create a new profile image descriptions") + image_descriptions = manager.run_prompt( + prompt_key="prompt_4 (Agent Profile Image)", + template_vars=prompt_4_vars, + ai_model=ai_model, + ) + + # print(f"image_descriptions is: {image_descriptions}") + return image_descriptions + +#-------------------------------- +# Step 4: Generate a number of images for profile image +#-------------------------------- +def create_profile_images(prompt, master_file_path, model_id, style_uuid, num_images, consistent=False, max_retries=10, delay=5): + + # step 4.1: load existing profile image options from templates directory + manager = ContentGenerator() + profile_image_options_template = manager.create_new_template_json(TemplateType.PROFILE_IMAGE_OPTIONS) + profile_image_template = manager.create_new_template_json(TemplateType.PROFILE_IMAGE) + + # step 4.2: load the agent json file + agent_master_json = None + with open(master_file_path, 'r', encoding='utf-8') as file: + agent_master_json = json.load(file) + + # step 4.3: extract agent from master json + agent_details = agent_master_json['agent']['agent_details'] + + # step 4.3.1: check to make sure we have a profile image placeholder + if agent_master_json['agent']['profile_image'] is None or agent_master_json['agent']['profile_image'] == {}: + agent_master_json['agent']['profile_image'] = profile_image_template['profile_image'] + + # step 4.4: generate the image + if consistent: + response = images_leonardo.generate_inconsistent_image_lambda(prompt, model_id, style_uuid, num_images) + else: + response = images_leonardo.generate_inconsistent_image_lambda(prompt, model_id, style_uuid, num_images) + + if not response['generations_by_pk']['generated_images']: + raise Exception("No Images Generated") + + generations_by_pk = response['generations_by_pk'].get("generated_images") + generated_url = generations_by_pk[0].get('url') + generated_id = generations_by_pk[0].get('id') + + # step 4.6: append new URL to the array + profile_image_options_template["profile_image_options"].append(response) + + profile_image_template["profile_image"]["details"]["generationId"] = generated_id + profile_image_template["profile_image"]["details"]["url"] = generated_url + profile_image_template["profile_image"]["details"]["image_id"] = generated_id + + # step 4.7: create the save path, use 0 as we are not in a season or episode + save_path = manager.create_filepath(agent_details["name"], 0, 0, TemplateType.PROFILE_IMAGE_OPTIONS) + save_path_profile_image = manager.create_filepath(agent_details["name"], 0, 0, TemplateType.PROFILE_IMAGE) + + # step 4.8: save the profile image options to a file + manager.save_json_file(save_path, profile_image_options_template) + + # if this is consistent, we will multiple genreation ids to track. So its better to store the generation id of the image the user picks. + if not consistent: + manager.save_json_file(save_path_profile_image, profile_image_template) + + # step 4.9: append to master file + agent_master_json = manager.append_profile_image_options(agent_master_json, profile_image_options_template) + agent_master_json = manager.append_profile_image(agent_master_json, profile_image_template) + + # step 4.10: save the master data to a file + print("Saving the master data to a file") + manager.save_json_file( + save_path=master_file_path, + json_data=agent_master_json + ) + + +if __name__ == "__main__": + # 4.1 Setup number of images + num_images = 4 + + # 4.2 Setup AI model + ai_model = GeminiModel() + master_file_path = "configs/CipherCat/CipherCat_master.json" + + # 4.2.1 Setup prompt + # prompt = "a pygmy marmoset who owns 30% of trumps meme coin" + prompt = "" + + # 4.3 Create profile images + create_images(ai_model, prompt, master_file_path, num_images) diff --git a/server/prompt_chaining/step_5_agent_chat.py b/server/prompt_chaining/step_5_agent_chat.py new file mode 100644 index 0000000..4c6aa32 --- /dev/null +++ b/server/prompt_chaining/step_5_agent_chat.py @@ -0,0 +1,131 @@ +# +# Module: step_1 +# +# This module implements the step_1 function for creating a new agent. +# +# Title: Step 1 +# Summary: Step 1 implementation. +# Authors: +# - @TheBlockRhino +# Created: 2025-01-15 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-15 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +# standard imports +import yaml +import json +import sys +import os + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +import utils.content_generator as content_generator +from utils.template_types import TemplateType +import utils.config_utils as config_utils +# ------------------------------------------------------------------- +# Step 5: Chat with the agent +# ------------------------------------------------------------------- +def agent_chat(ai_model, master_file_path: str, prompt: str, chat_history): + # Step 5.1: Create a new content manager that will send off the prompt to the AI model + manager = content_generator.ContentGenerator() + + # step 5.2: load the agent json file + agent_master_json = None + with open(master_file_path, 'r', encoding='utf-8') as file: + agent_master_json = json.load(file) + + # step 5.3: extract agent from master json + agent_details = agent_master_json['agent']['agent_details'] + + # Initialize chat history if None + if chat_history is None: + chat_history = config_utils.load_chat_history(agent_details["name"]) + + # step 5.4: Set up chat variables + agent_response = None + + # prompt 5 Chat with the agent: + print("Crafting prompt for AI to chat with the agent") + prompt_5_vars = { + "agent_name": agent_details["name"], + "agent_json": json.dumps(agent_details), + "chat_history": json.dumps(chat_history), + "user_prompt": prompt, # Use the prompt parameter instead of user_prompt + "agent_json": json.dumps(agent_details) + } + + # get the agent's response + print("Sending prompt to AI to chat with the agent") + agent_response = manager.run_prompt( + prompt_key="prompt_5 (Chat with the agent)", + template_vars=prompt_5_vars, + ai_model=ai_model, + ) + + if agent_response: # Add error checking + # add the user's prompt to the history log with label + chat_history['chat_history'].append({ + "role": "user", + "prompt": prompt, + "message_id": len(chat_history['chat_history']) + }) + + # add the agent's response to the history log with label + chat_history['chat_history'].append({ + "role": agent_details["name"], + "response": agent_response['response'], + "message_id": len(chat_history['chat_history']) + }) + + # Need to save the chat history to a file + # Need to check is there is an existing chat history file + # If there is, append to the file + # If there is not, create a new file + # or chat a new file, for users to have new chats + # later can allow the user to select which chat history to use + + # step 5.5: create the file path for chat file + print("Creating the file path for the chat file") + agent_chat_file_path = manager.create_filepath( + agent_name=agent_details["name"], + season_number=0, + episode_number=0, + template_type=TemplateType.CHAT + ) + + # step 5.6: Save the chat history to a file + print("Saving the chat history to a file") + manager.save_json_file( + save_path=agent_chat_file_path, + json_data=chat_history + ) + + return agent_response, chat_history + + +import models.gemini_model as gemini_model +if __name__ == "__main__": + ai_model = gemini_model.GeminiModel() + manager = content_generator.ContentGenerator() + master_file_path = "configs/LamboLara/LamboLara_master.json" + chat_history = manager.create_new_template_json(TemplateType.CHAT) + + user_prompt = "What is your name?" + agent_response, chat_history = agent_chat(ai_model, master_file_path, user_prompt, chat_history) + print(f"Response: {agent_response['response']}") + # print(f"Chat history: {chat_history}") + user_prompt = "What is your favorite color?" + agent_response, chat_history = agent_chat(ai_model, master_file_path, user_prompt, chat_history) + print(f"Response: {agent_response['response']}") + # print(f"Chat history: {chat_history}") + user_prompt = "What is your favorite food?" + agent_response, chat_history = agent_chat(ai_model, master_file_path, user_prompt, chat_history) + print(f"Response: {agent_response['response']}") + # print(f"Chat history: {chat_history}") + user_prompt = "What was the first question I asked you?" + agent_response, chat_history = agent_chat(ai_model, master_file_path, user_prompt, chat_history) + print(f"Response: {agent_response['response']}") + # print(f"Chat history: {chat_history}") \ No newline at end of file diff --git a/server/prompt_chaining/step_6_create_image_posts.py b/server/prompt_chaining/step_6_create_image_posts.py new file mode 100644 index 0000000..863bd98 --- /dev/null +++ b/server/prompt_chaining/step_6_create_image_posts.py @@ -0,0 +1,149 @@ +# +# Module: template_types +# +# This module implements the TemplateType class for defining the type of template. +# +# Title: Template Types +# Summary: Template types implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-12 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +import requests +import os +import dotenv +import time +import json +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# custom ARAI imports +from utils.content_generator import ContentGenerator +from utils.template_types import TemplateType +import asset_generation.images_leonardo as images_leonardo +from models.gemini_model import GeminiModel + +dotenv.load_dotenv() + + +def create_image_posts(ai_model, master_file_path, num_images, season_number, episode_number): + manager = ContentGenerator() + image_descriptions = None + + # step 4.2: load the agent json file + agent_master_json = None + with open(master_file_path, 'r', encoding='utf-8') as file: + agent_master_json = json.load(file) + + # step 4.3: extract agent from master json + agent_details = agent_master_json['agent']['agent_details'] + episode_details = agent_master_json['agent']['seasons'][season_number]['episodes'][episode_number] + + print("Crafting prompt for AI to create a new profile image descriptions") + prompt_6_vars = { + "agent_name": agent_details["name"], + "agent_json": json.dumps(agent_details), + "episode_json": json.dumps(episode_details), + "number_of_images": num_images + } + + # step 2.4: Run the prompt + print("Sending prompt to AI to create a new profile image descriptions") + image_descriptions = manager.run_prompt( + prompt_key="prompt_6 (Create Social Media Image Post)", + template_vars=prompt_6_vars, + ai_model=ai_model, + ) + + # print(f"image_descriptions is: {image_descriptions}") + return image_descriptions + +def create_image_post(ai_model, prompt, model_id, style_uuid, num_images, consistent=False, max_retries=10, delay=5): + manager = ContentGenerator() + + # step 4.4: generate the image + if consistent: + response, payload = images_leonardo.generated_image_consistent(prompt, model_id, style_uuid, num_images) + else: + response, payload = images_leonardo.generated_image_inconsistent(prompt, model_id, style_uuid, num_images) + + generation_id = response["sdGenerationJob"]["generationId"] + + # step 4.5: retry loop to check for image completion + success = False # Add flag to track success + for attempt in range(max_retries): + response_url = images_leonardo.get_image_url(generation_id) + + if response_url.get("generations_by_pk", {}).get("generated_images"): + success = True # Set flag when successful + break # Exit the loop when we have images + + print(f"Image not ready yet. Attempt {attempt + 1}/{max_retries}. Waiting {delay} seconds...") + time.sleep(delay) + + if not success: + print("Max retries reached. Image generation may have failed.") + return None + + # step 4.7: create the save path, use 0 as we are not in a season or episode + save_path = os.path.join("configs", "temporary", "image_generations", f"generation_{generation_id}.json") + + # step 4.8: save the profile image options to a file + manager.save_json_file(save_path, response_url) + +if __name__ == "__main__": + # Setup model details + model_details = json.loads(open("asset_generation/leonard_anime_styles.json", "r").read()) + model_id = model_details["models"][0]["modelId"] + anime_general_style = next( + style for style in model_details["models"][0]["styles"] + if style["style name"] == "Anime General" + ) + + # Setup parameters + episode_number = 0 + season_number = 0 + style_uuid = anime_general_style["styleUUID"] + num_images = 2 + + # Setup AI model + ai_model = GeminiModel() + master_file_path = "configs/LamboLara/LamboLara_master.json" + + #-------------------------------- + # Step 4.1: Create multiple profile images via multiple prompts using consistent images + #-------------------------------- + image_descriptions = create_image_posts( + ai_model=ai_model, + master_file_path=master_file_path, + num_images=num_images, + episode_number=episode_number, + season_number=season_number + ) + + print("\n\n") + print(f"image_descriptions is: {json.dumps(image_descriptions, indent=4)}") + print("\n\n") + + # print the image descriptions + for image_description in image_descriptions["image_post_descriptions"]: + print(image_description["image_description"] + "\n") + print(image_description["post_after"] + "\n") + # Generate the image + create_image_post( + ai_model=ai_model, + prompt=image_description["image_description"], + model_id=model_id, + style_uuid=style_uuid, + num_images=1, + consistent=False, + max_retries=10, + delay=5 + ) \ No newline at end of file diff --git a/server/prompts/prompt_chaining.yaml b/server/prompts/prompt_chaining.yaml new file mode 100644 index 0000000..ab80439 --- /dev/null +++ b/server/prompts/prompt_chaining.yaml @@ -0,0 +1,395 @@ +prompt_1 (Character Sheet Creation): | + You are an expert in creative writing, character design, world-building, and marketing. You are tasked with developing a complete character profile for a new agent who will be featured in stories for a Twitter bot. These stories will be broken down into seasons, episodes, and individual tweets (scenes/posts). + + Agent Development Task + Generate a comprehensive JSON file that defines this new agent, including their name, personality, communication style, topic of expertise, backstory, universe, relevant hashtags, and emojis. + Use the following concept if its not empty, otherwise create one. + - concept: {{ concept }} + + Specific Instructions: + + 1. Invent a Creative Name: + - If no specific name is provided, create a unique and fitting name for the agent based on the concept of the agent. The name should be suitable for a Twitter handle. + - Don't have the word agent in the agents name or the @ symbol in the agents name. + - The name must be made up of two words. A first and last name, or something fun and creative. + - Agent Name: {{ agent_name }} + - Do not use any names that have already been previously used from {{ agent_names_blacklist }} + + 2. Define the Topic: + - If no specific topic is provided invent a creative topic that lends itself to episodic storytelling. + - Topic: {{ topic }} + + 3. Develop Personality and Style: + - Create a detailed personality for the agent. + - Define a clear communication style for the agent. + - Create a list of keywords. + - Personality: {{ personality }} + - Communication Style: {{ style }} + + 4. Craft a Backstory: + - Invent a compelling and original backstory for the agent that explains their motivations, skills, and current situation. This backstory should be suitable for unfolding gradually over multiple story arcs. + - Backstory: {{ backstory }} + + 5. Describe the Universe: + - Detail the world(s) or setting where the agent operates. Consider the current state of technology, the social and political landscape, major organizations or factions, and any unique elements relevant to the chosen topic. + - Universe: {{ universe }} + + 6. Generate Marketing Elements: + - Create a list of relevant hashtags that will be used for social media promotion. Include hashtags related to the agent's name, topic, and genre. + - Example: + ```json + hashtags: + - "#example1" + - "#example2" + - "#longerExampleHashtag" + ``` + - Create a list of relevant emojis that can be used in tweets to add visual interest and convey meaning. + - Example: + ```json + emojis: + - "🐳" + - "🌊" + - "🚀" + ``` + - Hashtags: {{ hashtags }} + - Emojis: {{ emojis }} + + Output Requirements: + - Only output valid JSON. Do not include any text outside of the JSON structure. + - Output a single, complete JSON file that includes all the fields mentioned above (name, personality, communication_style, topic, backstory, universe, hashtags, emojis). + - Adhere to the specified answer lengths for each field (short for personality and communication style, long for backstory and universe). + + Output exactly as the json file: + ```json + {{ agent_json }} + ``` + +prompt_2 (Season Creation): | + You are an expert in creative writing, season/episode design, and structured storytelling. + Your goal is to create a new season for {{ agent_name }}, who was previously defined in the following agent JSON: + + {{ agent_json }} + + Previous season: + - This provides the previous season details, including description and highlights for the season. Ignore if none is provided as this means we are creating season 1, so there is no previous season. + {{ previous_season }} + + --- + ## Task: Season Creation + + Generate a single valid JSON file that defines a new season for this agent. The season should include: + + - Season Name: If none is provided, create a unique and fitting name based on {{ agent_name }} and the agent’s JSON. + - Use something that can also work as a Twitter hashtag. + - Season Name: {{ season_name }} + + - Season Number: If none is provided, default to 1. + - Season Number: {{ season_number }} + + - Season Description: If none is provided, create a unique description based on {{ agent_name }}’s JSON. + - Season Description: {{ season_description }} + + - Season Highlights: If none is provided, invent highlights relevant to the agent’s concept or storyline. + - Season Highlights: {{ season_highlights }} + + - Season Summary: If none is provided, create a concise summary that captures the essence of this season. + - Season Summary: {{ season_summary }} + + - Episodes: We want **{{ number_of_episodes }} episodes** total. Starting with episode 1. + - If none are provided, create {{ number_of_episodes }} unique episodes. + - Each episode entry should have: + - `episode_id` + - `episode_name` + - `episode_number` + - `episode_description` + - `episode_highlights` + - `episode_posted` (default `False`) + - `episode_summary` + + Output Requirements: + - Only output valid JSON. Do not include any text outside of the JSON structure. + - Output a single, complete JSON file in a seasons array that includes all the fields mentioned above (season_name, season_number, season_description, season_highlights, season_summary, episodes). + + Output exactly as the json file: + ```json + {{ season_json }} + ``` + +prompt_3 (Episode Posts Creation): | + You are an expert in creative writing, social media engagement, and character voice development. Your task is to generate {{ number_of_posts }} short "updates" (tweets/posts) for the agent {{ agent_name }} in the style of Twitter posts. These posts are for season {{ season_number }}, episode {{ episode_number }}. + + Agent and Context: + + * Agent JSON: {{ agent_json }} (This provides the agent's personality, backstory, etc.) + * Season JSON: {{ season_json }} (This provides the season details, including description and highlights for the season) + * Episode JSON: {{ episode_json }} (This provides the episode details, including description and highlights for the episode) + * Previous Episode JSON: {{ previous_episode }} (This provides the previous episode details, including description and highlights for the episode. Ignore if none is provided as this means we are creating episode 1, so there is no previous episode) + **Post Requirements:** + + Each post should: + + * Reflect Agent's Personality: Be consistent with {{ agent_name }}'s personality, tone, and communication style as defined in the agent JSON. + * Relate to Setting/Technology: Reference elements of the setting, technology, or other relevant details from the agent's universe as defined in the agent JSON. + * Incorporate Episode Context: Align with the season overview and specific episode overview provided in the season JSON. + * Highlight Observations: Center around misunderstandings, comedic observations, or serious reflections relevant to the episode's theme. + * Consider Emojis: Optionally use emojis from this set: {{ agent_json }} or use any emojis that are relevant to the episode's theme. + * Make sure there are no hashtags in the post. We want only text and emojis. + * Length Constraint: Each post must be under {{ post_length }} characters. + + **JSON Output Format:** + + Output a valid JSON file containing a list of posts under the `posts` key. Each post should be a separate entry in the list and include the following: + + * `post_id`: A unique identifier for the post (e.g., s1\_e1\_post1, s1\_e1\_post2). + * `post_number`: The ordinal number of the post within the episode (e.g., 1, 2, 3). + * `post_content`: The actual text of the post. + * `post_highlights`: A brief, one-sentence description of the key takeaway or event in the post. + * `post_posted`: Set to `False` by default. + + **Output Requirements:** + - **Only output valid JSON.** Do not include any text outside of the JSON structure. + - **Output the json file:** + ```json + {{ episode_json }} + ``` +prompt_4 (Agent Profile Image): | + You are an expert in creative writing, character design, world-building, and marketing. + You are tasked with developing a visual description for a character profile for social media. + This profile image is for a new agent named {{ agent_name }} who will be featured in stories for a Twitter bot. + + Based on the agent's JSON, create a visual description for the agent's profile image. + {{ agent_json }} + + Make {{ number_of_images }} image description variations. + + Output Requirements: + - Only output valid JSON. Do not include any text outside of the JSON structure. + + Output exactly as the json file: + ```json + { + "profile_image_descriptions": [ + { + "id": 1, + "description": "" + }] + } + ``` + +prompt_5 (Chat with the agent): | + Your task is to take on the role of {{ agent_name }} and answer any user's question as best and accurately as possible. + You should respond in the style of {{ agent_name }}. + You should use the chat history to understand the context of the conversation. + Do not put in hashtags in your response, unless its relevant to the conversation. + Use emojis if relevant to the conversation. + + Here is the agent character sheet: + {{ agent_json }} + + Here is the chat history: + {{ chat_history }} + + Here is the users question as a prompt: + {{ user_prompt }} + + **Output Requirements:** + - **Only output valid JSON.** Do not include any text outside of the JSON structure. + - **Output the json file:** + ```json + { + "response": "" + } + ``` + +prompt_6 (Create Social Media Image Post): | + You are an expert in creative writing, character design, world-building, and marketing. + You are tasked with developing a series of visual descriptions that will be used to create artwork for a character social media posts. + These image descriptions will be used to create images based on the agents current episode. + These will be posted to twitter as a series of posts. + The style will be instagram style were it does not include the character in the photos but what the character is doing and seeing. + + Here is the agent's JSON: + {{ agent_json }} + + Here is the episode JSON with details on the episode and posts: + {{ episode_json }} + + Make {{ number_of_images }} of image descriptions that support the narrative of the episode posts being sent to twitter. + Keep the descriptions short and to the point. + Mark were abouts in the order of the posts the image post should be tweeted. + Example, post this image after post 1, post this image after post 4, etc. + Determine which posts best benefit from an image directly after them. + Mark sure to spread out the image post among the text posts. + + Example: + - Image of pina calada drink at a beach resort + - Image traditional japanese breakfast food + - Image out an apartment window on a summers day. + + Output Requirements: + - Only output valid JSON. Do not include any text outside of the JSON structure. + + Output exactly as the json file: + ```json + { + "image_post_descriptions": [ + { + "image_description": "", + "post_after": + } + ] + } + ``` + +prompt_6.1 (Create Social Media Image Post): | + You are tasked with developing visual descriptions for {{ number_of_images }} images that will be used to create artwork for a character social media posts. + These image descriptions will be based on an agents current episode and posts it contains. + These will be posted to twitter as a series of posts. + The style will be instagram style were it does not include the character in the photos but what the character is doing and seeing. + + Keep it short and to the point. + It should be Image of OBJECT ACTION ENVIRONMENT + Example: + - Image of pina calada drink at a beach resort + - Image traditional japanese breakfast food + - Image out an apartment window on a summers day. + + Here is the agent's JSON for context: + {{ agent_json }} + + Here is the episode JSON with details on the episode and posts: + {{ episode_json }} + + Mark were abouts in the order of the posts the image post should be tweeted. + Example, post this image after post 1, post this image after post 4, etc. + Determine which posts best benefit from an image directly after them. + Mark sure to spread out the image post among the text posts. + + Output Requirements: + - Only output valid JSON. Do not include any text outside of the JSON structure. + + Output exactly as the json file: + ```json + { + "image_post_descriptions": [ + { + "image_description": "", + "post_after": + } + ] + } + ``` + +prompt_6.2 (Create Social Media Image Post): | + You are tasked with developing visual descriptions for {{ number_of_images }} images that will be used to create artwork for a character social media posts. + These image descriptions will be based on an agents current episode and posts it contains. + These will be posted to twitter as a series of posts. + The style will be instagram style were it does not include any characters in the photos but what the character is doing and seeing. + + Keep it short and to the point, and avoid any descriptiosn that could be used to generate a character image. + It should be Image of OBJECT ACTION ENVIRONMENT + Example: + - Image of pina calada drink at a beach resort + - Image traditional japanese breakfast food + - Image out an apartment window on a summers day. + + Here is the agent's JSON for context: + {{ agent_json }} + + Here is the episode JSON with details on the episode and posts: + {{ episode_json }} + + Mark were abouts in the order of the posts the image post should be tweeted. + Example, post this image after post 1, post this image after post 4, etc. + Determine which posts best benefit from an image directly after them. + Mark sure to spread out the image post among the text posts but keep context, so an image should have at least a number of posts before it. This is dependent on the number of posts in the current episode. + If an image appears after a post, it should be relevant to the post. + + Output Requirements: + - Only output valid JSON. Do not include any text outside of the JSON structure. + + Output exactly as the json file: + ```json + { + "image_post_descriptions": [ + { + "image_description": "", + "post_after": + } + ] + } + ``` + +prompt 7 (Create Social Media Image Post): | + You are an expert in character design, and visual storytelling. Your task is to generate an illustration. + + + +prompt 8 (Profile Image Editor): | + You are an expert in character design, and visual storytelling. Your task is to generate a character illustration. + The illustration will include all relevant physical features, clothing, style, and the character's overall aesthetic. + Use the placeholders provided below to dynamically incorporate details into the description. + + Character Illustration Prompt + Generate a descriptive prompt for an artist or an AI to create an image of the character. The prompt should be vivid, imaginative, and comprehensive, capturing the essence of the character. Use the following placeholders to define the details of the character: + + About the character: + - agent name {{ agent_name }} + - agent personality {{ personality }} + - agent backstory {{ backstory }} + + Specific Instructions: + 1. Character Profile: + - Gender/Body Type: {{ genderBodyType }} + - Age: {{ age }} + - Ethnicity/Skin Tone: {{ ethnicitySkinTone }} + - Height/Build: {{ heightBuild }} + + 2. Face & Head Details: + - Face Shape: {{ faceShape }} + - Eye Color: {{ eyes.color }} + - Eye Shape: {{ eyes.shape }} + - Eyebrow Style: {{ eyes.eyebrowStyle }} + - Nose Shape: {{ nose }} + - Mouth/Lip Style: {{ mouthLips }} + - Facial Hair (if applicable): {{ facialHair }} + - Hair Length: {{ hair.length }} + - Hair Style: {{ hair.style }} + - Hair Color: {{ hair.color }} + + 3. Body & Clothing: + - Body Shape: {{ bodyShape }} + - Outfit Style: {{ outfitStyle }} + - Specific Garments: {{ specificGarments }} + - Color Palette: {{ colorPalette }} + - Accessories: {{ accessories }} + - Armor or Weapons: {{ armorOrWeapons }} + + 4. Style & Aesthetic: + - Art Style: {{ artStyle }} + - Mood/Expression: {{ moodExpression }} + - Lighting or Color Mood: {{ lightingOrColorMood }} + - Background Setting: {{ background }} + + Output Requirements: + - Generate a complete and vivid description of the character using the placeholders provided. + - The output should be a natural language paragraph formatted for readability. + - Ensure the description flows smoothly and vividly combines all selected traits into a cohesive vision. + - Example: + "{{ genderBodyType }} character, {{ age }} with {{ ethnicitySkinTone }} skin, a {{ faceShape }} face, {{ hair.length }} {{ hair.style }} hair in {{ hair.color }}, wearing {{ outfitStyle }} clothing, accessorized with {{ accessories }}, set in a {{ background }}." + + Final Output: + - Description: {{ character_description }} + + +prompt 9 (Create Character Image): | + Generate a character portrait of {{ agent_name }} with {{ hair_style }} {{ hair_color }} hair, + {{ eye_color }} eyes, wearing {{ clothing_style }} style clothing. + Their personality can be described as {{ personality }} and their communication style is + {{ communication_style }}. Scene: {{ background }}. + Make sure to create an image with only one character. + + + "{{ genderBodyType }} character, {{ age }} with {{ ethnicitySkinTone }} skin, + a {{ faceShape }} face, {{ hair.length }} {{ hair.style }} hair in {{ hair.color }}, + wearing {{ outfitStyle }} clothing, accessorized with {{ accessories }}, set in a {{ background }}." diff --git a/server/requirements.txt b/server/requirements.txt new file mode 100644 index 0000000..eec5d2a Binary files /dev/null and b/server/requirements.txt differ diff --git a/server/templates/agent.json b/server/templates/agent.json new file mode 100644 index 0000000..95b9e36 --- /dev/null +++ b/server/templates/agent.json @@ -0,0 +1,14 @@ +{ + "agent": { + "agent_details": { + "name": "", + "personality": [], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [], + "hashtags": [], + "emojis": [] + } +} +} diff --git a/server/templates/chat_log.json b/server/templates/chat_log.json new file mode 100644 index 0000000..d6450e0 --- /dev/null +++ b/server/templates/chat_log.json @@ -0,0 +1,4 @@ +{ + "agent_name": "", + "chat_history": [] +} diff --git a/server/templates/episode.json b/server/templates/episode.json new file mode 100644 index 0000000..d7578c7 --- /dev/null +++ b/server/templates/episode.json @@ -0,0 +1,20 @@ +{ + "episode": { + "episode_name": "", + "episode_number": 0, + "episode_description": "", + "episode_highlights": "", + "episode_summary": "", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "", + "post_number": 0, + "post_content": "", + "post_highlights": "", + "post_posted": false + } + ] + } +} diff --git a/server/templates/master.json b/server/templates/master.json new file mode 100644 index 0000000..8351ab5 --- /dev/null +++ b/server/templates/master.json @@ -0,0 +1,64 @@ +{ + "agent": { + "concept": "", + "agent_details": { + "name": "", + "personality": [], + "communication_style": [], + "backstory": "", + "universe": "", + "topic_expertise": [], + "hashtags": [], + "emojis": [] + }, + "ai_model": { + "model_type": "", + "model_name": "", + "memory_store": "" + }, + "connectors": { + "twitter": false, + "telegram": false, + "discord": false + }, + "tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + }, + "profile_image": {}, + "profile_image_options": [], + "seasons": [ + { + "season_name": "", + "season_number": 0, + "season_description": "", + "season_highlights": "", + "season_summary": "", + "season_posted": false, + "current_episode_number": 0, + "episodes": [ + { + "episode_name": "", + "episode_number": 0, + "episode_description": "", + "episode_highlights": "", + "episode_summary": "", + "episode_posted": false, + "current_post_number": 0, + "posts": [ + { + "post_id": "", + "post_number": 0, + "post_content": "", + "post_highlights": "", + "post_posted": false + } + ] + } + ] + } + ] + } +} diff --git a/server/templates/post_image.json b/server/templates/post_image.json new file mode 100644 index 0000000..e69de29 diff --git a/server/templates/profile_image.json b/server/templates/profile_image.json new file mode 100644 index 0000000..2b058a9 --- /dev/null +++ b/server/templates/profile_image.json @@ -0,0 +1,11 @@ +{ + "profile_image":{ + "details":{ + "url": "", + "image_id": "", + "generationId": "" + }, + "payload":{ + } + } +} diff --git a/server/templates/profile_image_options.json b/server/templates/profile_image_options.json new file mode 100644 index 0000000..a086c9d --- /dev/null +++ b/server/templates/profile_image_options.json @@ -0,0 +1,3 @@ +{ + "profile_image_options":[] +} diff --git a/server/templates/profile_image_traits.json b/server/templates/profile_image_traits.json new file mode 100644 index 0000000..d857fa9 --- /dev/null +++ b/server/templates/profile_image_traits.json @@ -0,0 +1,121 @@ +{ + "characterTraits": [ + { + "category": "Character Profile", + "traits": [ + { + "traitName": "genderBodyType", + "options": ["Male", "Female", "Androgynous", "Child-like", "Non-binary"] + }, + { + "traitName": "age", + "options": ["Teen", "Young Adult", "Adult", "Middle-aged", "Elderly"] + }, + { + "traitName": "ethnicitySkinTone", + "options": ["Light", "Medium", "Dark", "Olive", "Fantasy (e.g. green, blue)"] + }, + { + "traitName": "heightBuild", + "options": ["Short", "Tall", "Slim", "Athletic", "Muscular", "Heavy-set"] + } + ] + }, + { + "category": "Face & Head Details", + "traits": [ + { + "traitName": "faceShape", + "options": ["Round", "Oval", "Square", "Heart-shaped", "Angular"] + }, + { + "traitName": "eyes.color", + "options": ["Brown", "Blue", "Green", "Amber", "Gray", "Fantasy (e.g. purple, red)"] + }, + { + "traitName": "eyes.shape", + "options": ["Large and round", "Narrow", "Slanted", "Almond-shaped"] + }, + { + "traitName": "eyes.eyebrowStyle", + "options": ["Arched", "Bushy", "Thin", "Straight"] + }, + { + "traitName": "nose", + "options": ["Small and pointed", "Broad", "Straight", "Hawk-like", "Button"] + }, + { + "traitName": "mouthLips", + "options": ["Thin lips", "Full lips", "Wide mouth", "Subtle smile", "Neutral"] + }, + { + "traitName": "facialHair", + "options": ["Clean-shaven", "Stubble", "Goatee", "Full beard", "Moustache"] + }, + { + "traitName": "hair.length", + "options": ["Short", "Medium", "Long", "Bald"] + }, + { + "traitName": "hair.style", + "options": ["Straight", "Wavy", "Curly", "Braided", "Dreads", "Ponytail", "Mohawk"] + }, + { + "traitName": "hair.color", + "options": ["Black", "Brown", "Blonde", "Red", "Gray", "Fantasy (e.g. neon pink, silver)"] + } + ] + }, + { + "category": "Body & Clothing", + "traits": [ + { + "traitName": "bodyShape", + "options": ["Proportional", "Long-legged", "Broad-shouldered", "Pear-shaped", "Stocky"] + }, + { + "traitName": "outfitStyle", + "options": ["Medieval fantasy", "Futuristic", "Pirate", "Steampunk", "Military", "Casual modern", "High-tech soldier"] + }, + { + "traitName": "specificGarments", + "options": ["Armor", "Robe", "Jacket", "Dress", "Tunic", "Bodysuit"] + }, + { + "traitName": "colorPalette", + "options": ["Neutral browns", "Bright primary", "Dark & edgy", "Pastel", "Neon/cyberpunk"] + }, + { + "traitName": "accessories", + "options": ["Earrings", "Necklace", "Headband", "Goggles", "Gloves", "Hat", "Belts or pouches"] + }, + { + "traitName": "armorOrWeapons", + "options": ["Leather armor", "Plate mail", "Energy shield", "Katana", "Magic staff"] + } + ] + }, + { + "category": "Style & Aesthetic", + "traits": [ + { + "traitName": "artStyle", + "options": ["Semi-realistic", "Cartoon", "Anime", "Stylized", "Pixel Art", "Cel-shaded"] + }, + { + "traitName": "moodExpression", + "options": ["Confident", "Friendly smile", "Serious and determined", "Mischievous grin", "Angry snarl"] + }, + { + "traitName": "lightingOrColorMood", + "options": ["Bright and vibrant", "Dark and gothic", "Pastel", "Neon/cyberpunk", "Cinematic lighting"] + }, + { + "traitName": "background", + "options": ["Transparent", "Simple gradient", "Forest", "Sci-fi cityscape", "Ancient ruins", "Cyberpunk skyline"] + } + ] + } + ] + } + diff --git a/server/templates/season.json b/server/templates/season.json new file mode 100644 index 0000000..4a123f0 --- /dev/null +++ b/server/templates/season.json @@ -0,0 +1,24 @@ +{ + "seasons": [ + { + "season_name": "", + "season_number": 0, + "season_description": "", + "season_highlights": "", + "season_summary": "", + "season_posted": false, + "current_episode_number": 0, + "episodes": [ + { + "episode_name": "", + "episode_number": 0, + "episode_description": "", + "episode_highlights": "", + "episode_summary": "", + "episode_posted": false, + "current_post_number": 0 + } + ] + } + ] +} diff --git a/server/templates/tracker.json b/server/templates/tracker.json new file mode 100644 index 0000000..7f19ef2 --- /dev/null +++ b/server/templates/tracker.json @@ -0,0 +1,8 @@ +{ +"tracker": { + "current_season_number": 0, + "current_episode_number": 0, + "current_post_number": 0, + "post_every_x_minutes": 0 + } +} diff --git a/server/utils/__init__.py b/server/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/utils/config_utils.py b/server/utils/config_utils.py new file mode 100644 index 0000000..570b4a4 --- /dev/null +++ b/server/utils/config_utils.py @@ -0,0 +1,213 @@ +# standard imports +import os +import json +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +import utils.content_generator as content_generator +from utils.template_types import TemplateType + +def list_available_seasons(agent_name): + """List all available seasons for an agent + + Args: + agent_name (str): The name of the agent to list seasons for + + Returns: + list: List of available season names + """ + seasons = [] + config_path = os.path.join("configs", agent_name, f"{agent_name}_master.json") + + if os.path.exists(config_path): + with open(config_path, 'r', encoding='utf-8') as f: + master_data = json.load(f) + for season in master_data["agent"]["seasons"]: + seasons.append(season["season_name"]) + return seasons + +def load_season_data(agent_name, season_index): + """Load detailed information about a season and its episodes + + Args: + agent_name (str): The name of the agent + season_index (int or str): The index of the season to display + """ + config_path = os.path.join("configs", agent_name, f"{agent_name}_master.json") + with open(config_path, 'r', encoding='utf-8') as f: + # Convert season_index to int if it's a string + if isinstance(season_index, str): + season_index = int(season_index) + return json.load(f)["agent"]["seasons"][season_index] + +def display_season_details(agent_name, season_index): + """Display detailed information about a season and its episodes + + Args: + agent_name (str): The name of the agent + season_name (str): The name of the season to display + """ + season_data = load_season_data(agent_name, season_index) + + print("\n" + "="*50) + print("Season Name:") + print(season_data.get('season_name', 'No season name available')) + print(f"Season Number:") + print(f"{season_data.get('season_number', 'No season number available')}") + print(f"Season Posted:") + print(f"{season_data.get('season_posted', 'No season posted available')}") + print("\nSeason Description:") + print(season_data.get('season_description', 'No description available')) + print("\nSeason Highlights:") + for highlight in season_data.get('season_highlights', []): + print(f"- {highlight}") + print("\nSeason Summary:") + print(season_data.get('season_summary', 'No summary available')) + + print("="*50) + print("\nEpisodes:") + + for episode in season_data.get('episodes', []): + print("="*50) + print(f"\nEpisode: {episode['episode_name']}") + print(f"Episode Number: {episode['episode_number']}") + print(f"Episode Posted: {episode.get('episode_posted', 'No episode posted available')}") + print("-"*30) + print("Description:") + print(episode.get('episode_description', 'No description available')) + print("\nHighlights:") + for highlight in episode.get('episode_highlights', []): + print(f"- {highlight}") + print("\nEpisode Summary:") + print(episode.get('episode_summary', 'No summary available')) + + print("\nPosts:") + for post in episode.get('posts', []): + print("-"*20) + print(f"Post Number: {post.get('post_number', 'No post number available')}") + print(f"Post Posted: {post.get('post_posted', 'No post posted available')}") + print(f"Content: {post.get('post_content', 'No content available')}") + print(f"Highlights: {post.get('post_highlights', 'No highlights available')}") + print("-"*30) + +def list_available_agents(): + """List all available agent configs in the configs folder + + Returns: + list: List of available agent names + """ + agents = [] + if os.path.exists("configs"): + for agent_dir in os.listdir("configs"): + if os.path.isdir(os.path.join("configs", agent_dir)): + agents.append(agent_dir) + return agents + +def load_agent_master_template(agent_file_path): + """Load the master template for an agent + + Args: + agent_name (str): The name of the agent to load the master template for + + Returns: + dict: The master template for the agent + """ + with open(agent_file_path, 'r', encoding='utf-8') as f: + return json.load(f) + +def save_agent_master_template(agent_master_template, agent_file_path): + """Save the master template for an agent + + Args: + agent_master_template (dict): The master template for the agent + agent_file_path (str): The path to the agent's master file + """ + with open(agent_file_path, 'w', encoding='utf-8') as f: + json.dump(agent_master_template, f, indent=4) + +def load_agent_tracker_config(agent_name): + """Load configuration for the selected agent + + Args: + agent_name (str): The name of the agent to load configuration for + + Returns: + dict: The configuration for the selected agent + """ + config_path = os.path.join("configs", agent_name, f"{agent_name}_master.json") + with open(config_path, 'r', encoding='utf-8') as f: + return json.load(f)["agent"]["tracker"] + +def get_agent_file_path(agent_name): + """Get the path to an agent's master file + + Args: + agent_name (str): Name of the agent + + Returns: + str: Path to the agent's master file + """ + return os.path.join("configs", agent_name, f"{agent_name}_master.json") + +def load_chat_history(agent_name): + """Load chat history for an agent + + Args: + agent_name (str): Name of the agent + + Returns: + dict: Chat history for the agent + """ + + if not check_if_chat_history_exists(agent_name): + create_new_chat_history_file(agent_name) + + chat_history_path = os.path.join("configs", agent_name, f"{agent_name}_chat_log.json") + with open(chat_history_path, 'r', encoding='utf-8') as f: + return json.load(f) + +def create_new_chat_history_file(agent_name): + """Create a new chat history file for an agent + + Args: + agent_name (str): Name of the agent + """ + manager = content_generator.ContentGenerator() + + chat_history = manager.create_new_template_json(TemplateType.CHAT) + + chat_history["agent_name"] = agent_name + + agent_chat_file_path = manager.create_filepath( + agent_name=agent_name, + season_number=0, + episode_number=0, + template_type=TemplateType.CHAT + ) + + manager.save_json_file( + save_path=agent_chat_file_path, + json_data=chat_history + ) + +def get_chat_history_file_path(agent_name): + """Get the path to an agent's chat history file + + Args: + agent_name (str): Name of the agent + + Returns: + str: Path to the agent's chat history file + """ + return os.path.join("configs", agent_name, f"{agent_name}_chat_log.json") + +def check_if_chat_history_exists(agent_name): + """Check if chat history exists for an agent + + Args: + agent_name (str): Name of the agent + + Returns: + bool: True if chat history exists, False otherwise + """ + return os.path.exists(os.path.join("configs", agent_name, f"{agent_name}_chat_log.json")) \ No newline at end of file diff --git a/server/utils/content_generator.py b/server/utils/content_generator.py new file mode 100644 index 0000000..d4cb268 --- /dev/null +++ b/server/utils/content_generator.py @@ -0,0 +1,658 @@ +# +# Module: content_generator +# +# This module implements the ContentGenerator class for generating content for the agents. +# +# Title: Content Generator +# Summary: Content generator implementation. +# Authors: +# - @TheBlockRhino +# Created: 2025-01-02 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-09 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +# standard imports +import os +import shutil +import yaml +import json +from jinja2 import Template +import copy + +# custom ARAI code imports +from models.base_model import ModelInterface +from utils.template_types import TemplateType + +class ContentGenerator: + """ + Description: + This class is responsible for generating content for the agents. + + Attributes: + agents_config_dir (str): the directory to save the agent configurations + templates_dir (str): the directory to save the agent templates + agent_template_path (str): the path to the agent template + chain_prompts_path (str): the path to the chain prompts + """ + + def __init__(self): + """Initialize the ContentGenerator class. + + Example: + >>> content_generator = ContentGenerator() + """ + # use relative path to get to project root (two levels up from utils) + project_root = os.path.dirname(os.path.dirname(__file__)) + + # Set the directories relative to project root + self.agents_config_dir = os.path.join(project_root, "configs") + self.prompts_dir = os.path.join(project_root, "prompts") + + # Set the path for the chain prompt + self.chain_prompts_path = os.path.join(self.prompts_dir, "prompt_chaining.yaml") + + # Set the paths for the templates + self.templates_dir = os.path.join(project_root, "templates") + self.master_template_path = os.path.join(self.templates_dir, "master.json") + self.tracker_template_path = os.path.join(self.templates_dir, "tracker.json") + self.agent_template_path = os.path.join(self.templates_dir, "agent.json") + self.season_template_path = os.path.join(self.templates_dir, "season.json") + self.episode_template_path = os.path.join(self.templates_dir, "episode.json") + self.profile_image_template_path = os.path.join(self.templates_dir, "profile_image.json") + self.profile_image_options_template_path = os.path.join(self.templates_dir, "profile_image_options.json") + self.chat_template_path = os.path.join(self.templates_dir, "chat_log.json") + + # ------------------------------------------------------------------- + # Helper to create a new agent yaml file + # ------------------------------------------------------------------- + def create_new_template_json(self, template_type: TemplateType) -> dict: + """Create a new agent configuration based on the template configuration file. + + Args: + template_type (TemplateType): the type of template to create + + Returns: + dict: the new agent configuration + + Raises: + ValueError: If the template type is invalid + + Example: + >>> agent_config = create_new_template_json(TemplateType.MASTER) + >>> print(agent_config) + """ + # 1. Ensure directory exist + os.makedirs(self.templates_dir, exist_ok=True) + + # 2. Load the template configuration file + if template_type == TemplateType.MASTER: + template_path = self.master_template_path + elif template_type == TemplateType.TRACKER: + template_path = self.tracker_template_path + elif template_type == TemplateType.AGENT: + template_path = self.agent_template_path + elif template_type == TemplateType.SEASON: + template_path = self.season_template_path + elif template_type == TemplateType.EPISODE: + template_path = self.episode_template_path + elif template_type == TemplateType.PROFILE_IMAGE: + template_path = self.profile_image_template_path + elif template_type == TemplateType.PROFILE_IMAGE_OPTIONS: + template_path = self.profile_image_options_template_path + elif template_type == TemplateType.CHAT: + template_path = self.chat_template_path + else: + raise ValueError(f"Invalid template type: {template_type}") + + # 3. Load the template configuration file + with open(template_path, "r") as f: + template = json.load(f) + + # 4. Return new configuration + return template + + # ------------------------------------------------------------------- + # Helper to safely parse YAML from the LLM's response + # ------------------------------------------------------------------- + def process_and_save_agent_response(self, response) -> dict: + """Attempts to parse JSON from LLM text. + + Args: + response (str): the response from the LLM + debug (bool, optional): whether to print debug information. Defaults to False. + + Returns: + dict: the parsed JSON + + Raises: + Exception: If there's an error parsing the JSON + + Example: + >>> response = "```yaml\nname: John Doe\nage: 30\n```" + >>> parsed = process_and_save_agent_response(response) + >>> print(parsed) + """ + + # 1. response = self.fix_yaml_from_response(response, debug) + raw_save_path = self.save_raw_response(response) + print(f"raw_save_path is: {raw_save_path}") + + # 2. response = self.save_processed_response(response, debug) + save_path = self.create_json_from_response(response) + print(f"save_path is: {save_path}") + + # 3. load the yaml file into a dict + with open(save_path, "r", encoding="utf-8") as f: + try: + # 3.1 load the yaml file into a dict + response = json.load(f) + except Exception as e: + print(f"process_and_save_agent_response. Error loading json file: {str(e)}") + return None + + # 4. Agent directory + file_dir = os.path.join(self.agents_config_dir, "temporary") + print(f"file_dir is: {file_dir}") + + # 5. Make sure the agent directory exists + os.makedirs(file_dir, exist_ok=True) + + # 6. Move files to agent directory + saved_raw_path = self.move_file(raw_save_path, file_dir) + saved_processed_path = self.move_file(save_path, file_dir) + + # 8. return the response + return response + + # ------------------------------------------------------------------- + # Helper to save the raw response to a file + # ------------------------------------------------------------------- + def save_raw_response(self, response) -> str: + """Saves the raw response to a file. + + Args: + response (str): the response from the LLM + debug (bool, optional): whether to print debug information. Defaults to False. + + Returns: + str: the path to the saved yaml file + + Raises: + Exception: If there's an error saving the response + + Example: + >>> response = "```yaml\nname: John Doe\nage: 30\n```" + >>> save_path = save_raw_response(response) + >>> print(save_path) + """ + # 1. create a file to save the response + save_path = os.path.join(self.agents_config_dir, "raw_response.json") + + # 2. Ensure directory exists + os.makedirs(os.path.dirname(save_path), exist_ok=True) + + # 3. Save the response to the file + with open(save_path, "w", encoding="utf-8") as f: + try: + f.write(response) + return save_path + except Exception as e: + print(f"Error saving raw response to file: {str(e)}") + return None + + # ------------------------------------------------------------------- + # Helper to create a yaml file from LLM text + # ------------------------------------------------------------------- + def create_json_from_response(self, response) -> str: + """Attempts to create a yaml file from LLM text. + + Args: + response (str): the response from the LLM + + Returns: + str: the path to the saved yaml file + + Raises: + Exception: If there's an error saving the response + + Example: + >>> response = "```json\nname: John Doe\nage: 30\n```" + >>> save_path = create_json_from_response(response) + >>> print(save_path) + """ + # 1. strip out '''yaml and ''' + # remove new lines and leading and trailing whitespace + response = response.replace("```json", "").replace("```", "").strip() + + # 2. create a file to save the response + save_path = os.path.join(self.agents_config_dir, "processed_response.json") + + # 3. Ensure directory exists + os.makedirs(os.path.dirname(save_path), exist_ok=True) + + # 4. Save the response to the file + with open(save_path, "w", encoding="utf-8") as f: + try: + # yaml_string = yaml.dump(response, allow_unicode=True, default_flow_style=False) + # f.write(yaml_string) + f.write(response) + except Exception as e: + print(f"Error creating json file from response: {str(e)}") + + return save_path + + # ------------------------------------------------------------------- + # Helper to rename file + # ------------------------------------------------------------------- + def rename_file(self, old_path, new_name) -> str: + """Renames a file. + + Args: + old_path (str): the old path to the file + new_name (str): the new name of the file + + Returns: + str: the new path to the file + + Raises: + Exception: If there's an error renaming the file + + Example: + >>> rename_file("tests/test.json", "test_new.json") + """ + # 1. Ensure directory exists + os.makedirs(os.path.dirname(old_path), exist_ok=True) + + # 2. Rename the file + try: + new_path = os.path.join(os.path.dirname(old_path), new_name) + os.rename(old_path, new_path) + return new_path + except Exception as e: + print(f"Error renaming file: {str(e)}") + return None + + # ------------------------------------------------------------------- + # Helper to move file + # ------------------------------------------------------------------- + def move_file(self, old_path, new_dir) -> str: + """Moves a file. + + Args: + old_path (str): the old path to the file + new_dir (str): the new directory to move the file to + + Returns: + str: the new path to the file after moving + + Raises: + Exception: If there's an error moving the file + + Example: + >>> move_file("tests/test.json", "agents/test") + """ + # 1. Ensure directory exists + os.makedirs(new_dir, exist_ok=True) + + # 2. Move the file + try: + new_path = os.path.join(new_dir, os.path.basename(old_path)) + new_path = shutil.move(old_path, new_path) + return new_path + except Exception as e: + print(f"Error moving file: {str(e)}") + return None + + + # ------------------------------------------------------------------- + # Helper to add new agent data to the current agent data + # ------------------------------------------------------------------- + def add_data_to_template(self, current_data, new_data) -> dict: + """Adds new agent data to the current agent data. + + Args: + new_data (dict): the new data + current_data (dict): the current data + + Returns: + dict: the updated agent data + + Raises: + Exception: If there's an error adding the data + + Example: + >>> new_data = {"name": "John Doe", "age": 30} + >>> current_data = {"name": "Jane Doe", "age": 25} + >>> updated_data = add_data_to_template(new_data, current_data) + >>> print(updated_data) + """ + # 1. ensure we have a dictionary to work with + if isinstance(current_data, str): + existing_data = json.loads(current_data) + elif isinstance(current_data, dict): + existing_data = current_data.copy() + else: + existing_data = {} + + # 2. Only update fields that already exist in existing_data + for key in new_data: + if key in existing_data: + existing_data[key] = new_data[key] + + # 3. return the updated data + return existing_data + + # ------------------------------------------------------------------- + # Helper to create filepath + # ------------------------------------------------------------------- + def create_filepath(self, agent_name: str, season_number: int, episode_number: int, template_type: TemplateType): + """Creates a filepath for the agent data. + + Args: + agent_name (str): the name of the agent + season_number (str): the number of the season + episode_number (str): the number of the episode + template_type (TemplateType): the type of template + + Returns: + str: the filepath + + Raises: + Exception: If there's an error creating the filepath + + Example: + >>> create_filepath("John Doe", "0", TemplateType.AGENT) + """ + # 1. create the filepath based on the template type + if template_type == TemplateType.MASTER: + return os.path.join(self.agents_config_dir, agent_name, agent_name + "_master.json") + elif template_type == TemplateType.TRACKER: + return os.path.join(self.agents_config_dir, agent_name, "tracker" + ".json") + elif template_type == TemplateType.AGENT: + return os.path.join(self.agents_config_dir, agent_name, agent_name + ".json") + elif template_type == TemplateType.SEASON: + return os.path.join(self.agents_config_dir, agent_name, "season_" + str(season_number), "season_" + str(season_number) + ".json") + elif template_type == TemplateType.EPISODE: + return os.path.join(self.agents_config_dir, agent_name, "season_" + str(season_number), "s" + str(season_number) + "_episode_" + str(episode_number) + ".json") + elif template_type == TemplateType.PROFILE_IMAGE: + return os.path.join(self.agents_config_dir, agent_name, "profile_image.json") + elif template_type == TemplateType.PROFILE_IMAGE_OPTIONS: + return os.path.join(self.agents_config_dir, agent_name, "profile_image_options.json") + elif template_type == TemplateType.CHAT: + return os.path.join(self.agents_config_dir, agent_name, agent_name + "_chat_log.json") + + # ------------------------------------------------------------------- + # Helper to save the agent data to a yaml file + # ------------------------------------------------------------------- + def save_json_file(self, save_path: str, json_data: dict): + """Saves the agent data to a JSON file. + + Args: + save_path (str): The path to save the JSON file + json_data (dict): The data to save to the JSON file + + Returns: + str: the path to the saved json file + + Raises: + Exception: If there's an error saving the json file + + Example: + >>> agent_data = {"name": "John Doe", "age": 30} + >>> save_json_file(filepath="tests/test.json", json_data=agent_data) + """ + # 1. Ensure directory exists + os.makedirs(os.path.dirname(save_path), exist_ok=True) + + # 2. Save the response to the file + with open(save_path, "w", encoding="utf-8") as f: + try: + # Use json.dump() with the file object, not json.dumps() + json.dump(json_data, f, ensure_ascii=False, indent=2) + print(f"save_path is: {save_path}") + return save_path + except Exception as e: + print(f"Error saving response to json file: {str(e)}") + return None + + # ------------------------------------------------------------------- + # Generic prompt runner that works with any prompt template + # ------------------------------------------------------------------- + def run_prompt(self, prompt_key, template_vars, ai_model, debug=False): + """Generic prompt runner that works with any prompt template. + + Args: + prompt_key (str): The key for the prompt template (e.g., "prompt_1", "prompt_2") + template_vars (dict): dict of variables to pass to the template + ai_model (ModelInterface): The AI model to use for generating responses + debug (bool, optional): whether to print debug information. Defaults to False. + + Returns: + dict: the parsed YAML + + Raises: + Exception: If there's an error running the prompt + + Example: + >>> prompt_key = "prompt_1" + >>> template_vars = {"name": "John Doe", "age": 30} + >>> ai_model = OpenAI(api_key="your_api_key") + >>> parsed = run_prompt(prompt_key, template_vars, ai_model, debug=True) + >>> print(parsed) + """ + # 1. Load the chain prompts from the JSON file + with open(self.chain_prompts_path, "r", encoding="utf-8") as f: + chain_prompts = yaml.safe_load(f) + + # 2. Grab the raw prompt template text + prompt_template = chain_prompts[prompt_key] + + # 3. Use Jinja2 to fill placeholders + template = Template(prompt_template) + prompt_text = template.render(**template_vars) + + if debug: + print("--------------------------------") + print(f"prompt key is:") + print (prompt_key) + print("--------------------------------") + print(f"prompt text is:") + print (prompt_text) + print("--------------------------------") + + # 4. Call the LLM + response = ai_model.generate_response(prompt_text) + + if debug: + print("--------------------------------") + print(f"response is:") + print(response) + print("--------------------------------") + + # # 5. Parse the YAML from the LLM's response + json_response = self.process_and_save_agent_response(response) + + if debug: + print("--------------------------------") + print(f"json_response is:") + print(json_response) + print("--------------------------------") + print(f"json_response is a {type(json_response)}") + print("--------------------------------") + + if json_response is None: + # Handle parse error or fallback + print(f"Error: LLM returned invalid JSON for {prompt_key}.") + return None + + # 6. return json_response + return json_response + + def merge_agent_details(self, master_data: dict, agent_data: dict) -> dict: + """Merges agent details by replacing fields in master with agent data. + + Args: + master_data (dict): The master template data + agent_data (dict): The agent-specific data to merge + + Returns: + dict: Updated master data with agent details + """ + if isinstance(master_data, str): + master_data = json.loads(master_data) + + # Deep copy to avoid modifying original + result = copy.deepcopy(master_data) + + # Replace agent_details section + if "agent" in agent_data and "agent_details" in agent_data["agent"]: + result["agent"]["agent_details"] = agent_data["agent"]["agent_details"] + else: + print("Error: agent_details not found in agent_data") + + return result + + def append_seasons(self, master_data: dict, seasons_data: dict) -> dict: + """Appends new seasons data to existing master data. + + Args: + master_data (dict): The master template data + seasons_data (dict): The seasons data to append + + Returns: + dict: Updated master data with appended seasons + """ + if isinstance(master_data, str): + master_data = json.loads(master_data) + + result = copy.deepcopy(master_data) + + # Append new seasons to existing seasons list + if "seasons" in seasons_data: + if "seasons" not in result["agent"]: + result["agent"]["seasons"] = [] + result["agent"]["seasons"].extend(seasons_data["seasons"]) + + return result + + def initialize_seasons(self, master_data: dict, seasons_data: dict) -> dict: + """Initializes the seasons array in the master data. + + Args: + master_data (dict): The master template data + seasons_data (dict): The seasons data to initialize + + Returns: + dict: Updated master data with initialized seasons + """ + + if isinstance(master_data, str): + master_data = json.loads(master_data) + + # Deep copy to avoid modifying original + result = copy.deepcopy(master_data) + + if "agent" in master_data and "seasons" in master_data["agent"]: + result["agent"]["seasons"] = seasons_data["seasons"] + + #print(f"result is: {result}") + return result + + def append_episodes(self, master_data: dict, posts_data: dict, season_index: int, episode_index: int) -> dict: + """Appends new episodes data to existing season data. + + Args: + master_data (dict): The master template data + episodes_data (dict): The episodes data to append + season_index (int): Index of the season to update + episode_index (int): Index of the episode to update + + Returns: + dict: Updated master data with appended episodes + """ + if isinstance(master_data, str): + master_data = json.loads(master_data) + + result = copy.deepcopy(master_data) + + # Validate the nested structure exists + if "agent" not in result: + result["agent"] = {} + if "seasons" not in result["agent"]: + result["agent"]["seasons"] = [] + if season_index >= len(result["agent"]["seasons"]): + result["agent"]["seasons"].append({"episodes": []}) + if "episodes" not in result["agent"]["seasons"][season_index]: + result["agent"]["seasons"][season_index]["episodes"] = [] + if episode_index >= len(result["agent"]["seasons"][season_index]["episodes"]): + result["agent"]["seasons"][season_index]["episodes"].append({}) + + # Replace posts array with new data + if "posts" in posts_data: + result["agent"]["seasons"][season_index]["episodes"][episode_index]["posts"] = posts_data["posts"] + + return result + + def append_profile_image_options(self, master_data: dict, profile_image_data: dict) -> dict: + """Appends new profile image data to existing master data. + + Args: + master_data (dict): The master template data + profile_image_data (dict): The profile image data to append + + Returns: + dict: Updated master data with appended profile image + """ + + if isinstance(master_data, str): + master_data = json.loads(master_data) + + # Deep copy to avoid modifying original + result = copy.deepcopy(master_data) + + # Append new profile image to existing profile image list + if "profile_image_options" in profile_image_data: + if "profile_image_options" not in result["agent"]: + result["agent"]["profile_image_options"] = [] + + # replace the profile image with the new profile image + result["agent"]["profile_image_options"] = profile_image_data["profile_image_options"] + + #print(f"result is: {result}") + return result + + def append_profile_image(self, master_data: dict, profile_image_data: dict) -> dict: + """Appends new profile image data to existing master data. + + Args: + master_data (dict): The master template data + profile_image_data (dict): The profile image data to append + + Returns: + dict: Updated master data with appended profile image + """ + + if isinstance(master_data, str): + master_data = json.loads(master_data) + + # Deep copy to avoid modifying original + result = copy.deepcopy(master_data) + + # Append new profile image to existing profile image list + if "profile_image" in profile_image_data: + if "profile_image" not in result["agent"]: + result["agent"]["profile_image"] = [] + + # replace the profile image with the new profile image + result["agent"]["profile_image"] = profile_image_data["profile_image"] + + #print(f"result is: {result}") + return result + + def get_agent_names_blacklist(self): + """Get a list of agent names based on folder names in config folder.""" + return [name for name in os.listdir(self.agents_config_dir) if os.path.isdir(os.path.join(self.agents_config_dir, name))] \ No newline at end of file diff --git a/server/utils/post_manager.py b/server/utils/post_manager.py new file mode 100644 index 0000000..8992184 --- /dev/null +++ b/server/utils/post_manager.py @@ -0,0 +1,241 @@ +# +# Module: post_manager +# +# This module implements the PostManager class for managing the posts for an agent. +# +# Title: Post Manager +# Summary: Post manager implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-04 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +# standard imports +import os +import json +import datetime +from dotenv import load_dotenv +import sys + +# Add project root to Python path +project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +sys.path.append(project_root) + +# custom ARAI code imports +import connectors.twitter_connector as twitter +from connectors.twitter_api_free_connector import ( + login_and_save_state, + post_tweet_with_saved_state +) +from handlers import menu_handlers + +# Load environment variables +load_dotenv() + +# Define constants from environment variables +X_ENABLED = os.getenv("X_ENABLED", "False") +X_API_OFFICIAL = os.getenv("X_API_OFFICIAL", "False") +X_USERNAME = os.getenv("X_USERNAME", "") +X_PASSWORD = os.getenv("X_PASSWORD","") +X_PHONE_OR_EMAIL = os.getenv("X_PHONE_OR_EMAIL", "") +X_DRY_RUN = os.getenv("X_DRY_RUN", "True") + +class PostManager: + """Manages posts for an agent using JSON configuration files. + + Attributes: + agent_name (str): The name of the agent + master_file (str): Path to the agent's master JSON file + twitter_connector: Twitter API connector instance + """ + def __init__(self, agent_name: str): + """Initialize the post manager + + Args: + agent_name (str): The name of the agent + + Raises: + FileNotFoundError: If master JSON file doesn't exist + """ + self.agent_name = agent_name + self.master_file = os.path.join("configs", agent_name, f"{agent_name}_master.json") + self.is_logged_in = False + + # Initialize Twitter connectors based on environment variable + if X_API_OFFICIAL == "True": + print(f"[Post Manager] Initializing Twitter Connector with official API") + self.twitter_connector = twitter.TwitterConnector() + self.twitter_api_free = None + else: + print(f"[Post Manager] Initializing Twitter API Free") + self.twitter_connector = None + self.twitter_api_free = login_and_save_state(username=X_USERNAME, password=X_PASSWORD, phone_or_email=X_PHONE_OR_EMAIL) + if self.twitter_api_free: + self.is_logged_in = True + + # Load master configuration + with open(self.master_file, 'r', encoding='utf-8') as f: + self.master_data = json.load(f) + + # Get current tracking info + self.tracker = self.master_data["agent"]["tracker"] + self.current_season = self.tracker["current_season_number"] + self.current_episode = self.tracker["current_episode_number"] + self.current_post = self.tracker["current_post_number"] + + def _save_master_file(self): + """Save the master JSON file with updated tracking information""" + # Update master data from local variables + self.master_data["agent"]["tracker"]["current_season_number"] = self.current_season + self.master_data["agent"]["tracker"]["current_episode_number"] = self.current_episode + self.master_data["agent"]["tracker"]["current_post_number"] = self.current_post + + # Save to file + with open(self.master_file, 'w', encoding='utf-8') as f: + json.dump(self.master_data, f, indent=2) + + def change_season(self, season_number: int): + """Change the current season + + Args: + season_number (int): The season number (1-based, will be converted to 0-based for array access) + """ + # Convert from 1-based season number to 0-based array index + season_index = season_number + + # Check if season exists and is not posted yet + if 0 <= season_index < len(self.master_data["agent"]["seasons"]): + print(f"Checking season: {season_index}") + season = self.master_data["agent"]["seasons"][season_index] + if not season.get("season_posted", False): + self.current_season = season_index # Store as 0-based index + self.current_episode = 0 + self.current_post = 0 + self._save_master_file() + print(f"Changed to season {season_number}") # Display as 1-based number + else: + print(f"Season {season_number} has already been posted") + raise ValueError(f"Season {season_number} has already been posted") + else: + print("No more unposted seasons available") + # Reset to beginning + self.current_season = -1 + self.current_episode = -1 + self.current_post = -1 + self._save_master_file() + raise ValueError(f"No more content available to post") + + def change_episode(self, episode_number: int): + """Change the current episode + + Args: + episode_number (int): The episode number (1-based, will be converted to 0-based for array access) + """ + # Convert from 1-based episode number to 0-based array index + episode_index = episode_number + + current_season = self.master_data["agent"]["seasons"][self.current_season] + if episode_index >= len(current_season["episodes"]): + print(f"Moving to next season: {self.current_season + 1}") + self.change_season(self.current_season + 1) # Move to next season + return + + self.current_episode = episode_index + self.current_post = 0 + self._save_master_file() + print(f"Changed to episode {episode_number}") # Display as 1-based number + + def next_post_number(self, post_number: int) -> str: + """Get the next post content and update tracking + + Args: + post_number (int): The post number (1-based, will be converted to 0-based for array access) + """ + # Convert from 1-based post number to 0-based array index + post_index = post_number + + current_season = self.master_data["agent"]["seasons"][self.current_season] + current_episode = current_season["episodes"][self.current_episode] + + if post_index >= len(current_episode["posts"]): + print(f"Moving to next episode: {self.current_episode + 1}") + self.change_episode(self.current_episode + 1) # Move to next episode + post_index = 0 + + print(f"Getting post: {post_index}") + post = current_episode["posts"][post_index] + post_content = post["post_content"] + + self.current_post = post_index + 1 # Store as 1-based for consistency with display + self._save_master_file() + + return post_content + + def post_to_twitter(self): + """Post content to Twitter""" + tweet_content = self.next_post_number(self.current_post) + + if X_ENABLED: + if X_API_OFFICIAL: + if self.twitter_connector and not X_DRY_RUN: + tweet_result = self.twitter_connector.post_tweet(tweet_content) + else: + print(f"[Post Manager] - Dry run mode, not posting to Twitter", tweet_content) + else: + if self.twitter_api_free and not X_DRY_RUN: + tweet_result = post_tweet_with_saved_state(tweet_content) + else: + print(f"[Post Manager] - Dry run mode, not posting to Twitter", tweet_content) + + + print(f"[Post Manager] Tweet result: {tweet_result}") + + if tweet_result.startswith("Error"): + self.current_post -= 1 + self.tracker["current_post_number"] = self.current_post + self._save_master_file() + else: + print(f"\nWould have posted: \n{tweet_content}") + + # Log the post + log_file = os.path.join("configs", self.agent_name, f"{self.agent_name}_post_log.json") + try: + try: + with open(log_file, 'r', encoding='utf-8') as f: + log_data = json.load(f) + except FileNotFoundError: + log_data = {"posts": []} + + log_data["posts"].append({ + "post_id": f"s_{self.current_season + 1}_e_{self.current_episode + 1}_p_{self.current_post}", + "content": tweet_content, + "timestamp": datetime.datetime.now().isoformat() + }) + + with open(log_file, 'w', encoding='utf-8') as f: + json.dump(log_data, f, indent=2) + + except Exception as e: + print(f"Error writing to log file: {e}") + + @classmethod + def post_single_tweet(cls, tweet_content: str) -> str: + """Class method to post a single tweet without needing to instantiate PostManager + + Args: + tweet_content (str): The content to tweet + + Returns: + str: Result of the tweet operation + """ + if X_ENABLED == "True" and X_DRY_RUN == "False": + return post_tweet_with_saved_state(tweet_content) + else: + print(f"[Post Manager] - Dry run mode, would have posted: {tweet_content}") + return "Dry run - tweet not posted" + diff --git a/server/utils/scheduler.py b/server/utils/scheduler.py new file mode 100644 index 0000000..c6bd34b --- /dev/null +++ b/server/utils/scheduler.py @@ -0,0 +1,109 @@ +# standard imports +import threading +import schedule +import time +import os +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +class AgentScheduler: + def __init__(self): + self.scheduler_running = False + self.pause_event = threading.Event() + self.scheduler_thread = None + + def run_scheduler(self): + """Continuously run the scheduler in a loop""" + while self.scheduler_running: + if not self.pause_event.is_set(): + schedule.run_pending() + time.sleep(1) + + def start(self): + """Start the scheduler thread""" + if not self.scheduler_thread or not self.scheduler_thread.is_alive(): + self.scheduler_running = True + self.scheduler_thread = threading.Thread(target=self.run_scheduler) + self.scheduler_thread.daemon = True + self.scheduler_thread.start() + + def stop(self): + """Stop the scheduler thread""" + self.scheduler_running = False + if self.scheduler_thread: + self.scheduler_thread.join() + + def pause(self): + """Pause the scheduler""" + self.pause_event.set() + + def resume(self): + """Resume the scheduler""" + self.pause_event.clear() + + def is_paused(self): + """Check if scheduler is paused""" + return self.pause_event.is_set() + + def is_running(self): + """Check if scheduler is running""" + return self.scheduler_running and (self.scheduler_thread and self.scheduler_thread.is_alive()) + + def schedule_posts(self, post_manager, tracker_data): + """Schedule posts with special handling for first post""" + + # Schedule first post right away + self.schedule_first_post(post_manager, tracker_data) + + # check what we to do the scheduler if all content is posted + self.schedule_last_post(post_manager, tracker_data) + + # Schedule regular posts + # Production schedule: + if os.getenv("X_ENABLED") == "True": + schedule.every(tracker_data.get('post_every_x_minutes')).minutes.do(post_manager.post_to_twitter) + else: + # Test schedule if you want to : + schedule.every(5).seconds.do(post_manager.post_to_twitter) + + def schedule_first_post(self, post_manager, tracker_data): + """Schedule posts with special handling for first post""" + if (tracker_data['season_number'] == 0 and + tracker_data['episode_number'] == 0 and + tracker_data['post_number'] == 0): + + # Post immediately for first post of first episode/season + post_manager.post_to_twitter() + + def schedule_last_post(self, post_manager, tracker_data): + if (tracker_data['season_number'] == -1 and + tracker_data['episode_number'] == -1 and + tracker_data['post_number'] == -1): + + # check what we to do the scheduler if all content is posted + self.check_generate_post_env(tracker_data) + + def check_generate_post_env(self, tracker_data): + """Check what settings the auto generate posts is set to""" + + if os.getenv("AUTO_GENERATE_POSTS") == "AUTO": + # generate new content + # post_manager.create_content() + + # tracker_data['season_number'] = length seasons -1 + # tracker_data['episode_number'] = 0 + # tracker_data['post_number'] = 0 + self.stop() + + elif os.getenv("AUTO_GENERATE_POSTS") == "LOOP": + tracker_data['season_number'] = 0 + tracker_data['episode_number'] = 0 + tracker_data['post_number'] = 0 + + elif os.getenv("AUTO_GENERATE_POSTS") == "STOP": + self.stop() + else: + print("Auto generate posts is not set to a valid setting") + print("Please set AUTO_GENERATE_POSTS to AUTO, LOOP, or STOP") diff --git a/server/utils/template_types.py b/server/utils/template_types.py new file mode 100644 index 0000000..fe7b26c --- /dev/null +++ b/server/utils/template_types.py @@ -0,0 +1,34 @@ +# +# Module: template_types +# +# This module implements the TemplateType class for defining the type of template. +# +# Title: Template Types +# Summary: Template types implementation. +# Authors: +# - @TheBlockRhino +# Created: 2024-12-31 +# Last edited by: @TheBlockRhino +# Last edited date: 2025-01-04 +# URLs: +# - https://arai-ai.io +# - https://github.com/ARAI-DevHub/arai-ai-agents +# - https://x.com/TheBlockRhino + +class TemplateType: + """This class is used to define the type of template. + + Attributes: + AGENT (str): the type of template for an agent + SEASON (str): the type of template for a season + EPISODE (str): the type of template for an episode + PROFILE_PICTURE (str): the type of template for a profile picture + """ + MASTER = "master" + TRACKER = "tracker" + AGENT = "agent" + SEASON = "season" + EPISODE = "episode" + PROFILE_IMAGE = "profile_image" + PROFILE_IMAGE_OPTIONS = "profile_image_options" + CHAT = "chat" \ No newline at end of file