Commit 55b357aa authored by tyyin lan's avatar tyyin lan

build: project initialization

parents
root = true
[*]
indent_style = space
charset = utf-8
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
insert_final_newline = false
VITE_APP_ENV = 'DEV'
VITE_APP_THEME_COLOR = '#00a2ea'
VITE_PORT = 8848
VITE_PUBLIC_PATH = '/'
VITE_ROUTER_MODE = 'h5'
VITE_VITEST = true
VITE_HIDE_HOME = false
VITE_APP_ENV = 'PROD'
VITE_APP_THEME_COLOR = '#00a2ea'
VITE_PUBLIC_PATH = '/'
VITE_ROUTER_MODE = 'h5'
# 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/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
auto-imports.d.ts
components.d.ts
package-lock.json
pnpm dlx commitlint --edit $1
npm run lint:lint-staged
\ No newline at end of file
node_modules
build
dist
{
"recommendations": [
"Vue.volar",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"EditorConfig.EditorConfig",
"bradlc.vscode-tailwindcss",
"stylelint.vscode-stylelint",
"redhat.vscode-yaml",
],
"unwantedRecommendations": [
"bradlc.vscode-tailwindcss"
]
}
\ No newline at end of file
{
"editor.formatOnSave": true,
"editor.formatOnPaste": true,
"editor.tabSize": 2,
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"tailwindCSS.experimental.configFile": "src/styles/app.css",
"files.associations": {
"*.css": "tailwindcss"
},
"editor.quickSuggestions": {
"strings": "on"
},
"extensions.disabledRecommendations": [
"antfu.unocss"
]
}
\ No newline at end of file
FROM nginx:stable-alpin
RUN rm -rf /usr/share/nginx/html
COPY dist/ /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
/** 处理环境变量 */
export const wrapperEnv = (envConf: Recordable): ViteEnv => {
const ret: ViteEnv = {
VITE_APP_ENV: 'DEV',
VITE_PORT: 8848,
VITE_PUBLIC_PATH: '/',
VITE_ROUTER_MODE: 'hash',
VITE_VITEST: true,
VITE_HIDE_HOME: false,
}
for (const envName of Object.keys(envConf)) {
let realName = envConf[envName].replace(/\\n/g, '\n')
realName = realName === 'true' ? true : realName === 'false' ? false : realName
if (envName === 'VITE_PORT') {
realName = Number(realName)
}
;(ret as any)[envName] = realName
if (typeof realName === 'string') {
process.env[envName] = realName
} else if (typeof realName === 'object') {
process.env[envName] = JSON.stringify(realName)
}
}
return ret
}
import { type PluginOption } from 'vite'
import vue from '@vitejs/plugin-vue'
import checker from 'vite-plugin-checker'
import { visualizer } from 'rollup-plugin-visualizer'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import tailwindcss from '@tailwindcss/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import appConfig from '../src/config/app-config.json'
function htmlPlugin() {
return {
name: 'html-transform',
transformIndexHtml(html: string) {
// 2. 将html中的占位符替换为配置的值
return html.replace(/%APP_NAME%/g, appConfig.appTitle)
},
}
}
export function setupPlugins(
isBuild: boolean,
envConf: ViteEnv,
_pathResolve: (dir: string) => string,
): PluginOption[] {
const lifecycle = process.env.npm_lifecycle_event
const plugins: PluginOption = [
vue(),
// VueI18nPlugin({
// include: [pathResolve('./src/locales/langs/**')],
// }),
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
htmlPlugin(),
tailwindcss(),
]
if (envConf.VITE_VITEST && !isBuild) {
plugins.push(checker({ vueTsc: true }))
}
if (lifecycle === 'report') {
plugins.push(visualizer())
}
return plugins
}
import type { UserConfig } from '@commitlint/types'
const configuration: UserConfig = {
extends: ['@commitlint/config-conventional'],
rules: {
'body-leading-blank': [2, 'always'],
'footer-leading-blank': [1, 'always'],
'subject-empty': [2, 'never'],
'type-empty': [2, 'never'],
'type-enum': [
2,
'always',
[
'feat',
'fix',
'perf',
'style',
'docs',
'test',
'refactor',
'build',
'ci',
'chore',
'revert',
'types',
'release',
],
],
},
}
export default configuration
import globals from 'globals'
import pluginJs from '@eslint/js'
import tseslint from 'typescript-eslint'
import pluginVue from 'eslint-plugin-vue'
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
import vueParser from 'vue-eslint-parser'
import tsParser from '@typescript-eslint/parser'
export default [
pluginJs.configs.recommended,
...tseslint.configs.recommended,
...pluginVue.configs['flat/recommended'],
{
languageOptions: {
globals: {
...globals.browser,
NodeJS: 'readonly',
Recordable: 'readonly',
ViteEnv: 'readonly',
AnyObject: 'readonly',
ConversationMessageItem: 'readonly',
ConversationMessageItemInfo: 'readonly',
},
parser: vueParser,
parserOptions: {
parser: tsParser,
sourceType: 'module',
ecmaVersion: 'latest',
ecmaFeatures: {
jsx: true,
},
},
},
rules: {
'no-console': 'warn',
'vue/attribute-hyphenation': 'error',
'vue/multi-word-component-names': 'off',
'vue/component-name-in-template-casing': [
'error',
'PascalCase',
{
registeredComponentsOnly: true,
ignores: [],
},
],
'vue/v-on-event-hyphenation': [
'error',
'always',
{
autofix: true,
ignore: [],
},
],
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
},
],
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/array-type': 'error',
},
},
eslintPluginPrettierRecommended,
{
ignores: ['dist/', 'public/'],
},
]
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4939750_9nzhie7u3y.css" />
<title>%APP_NAME%</title>
</head>
<body>
<div id="app">
<style>
.loading-wrapper {
width: 100%;
margin-top: 40vh;
display: flex;
justify-content: center;
}
.pulse {
width: 110px;
height: 60px;
color: #00a2ea;
--c: radial-gradient(farthest-side, currentColor 96%, #0000);
background:
var(--c) 100% 100% /30% 60%,
var(--c) 70% 0 /50% 100%,
var(--c) 0 100% /36% 68%,
var(--c) 27% 18% /26% 40%,
linear-gradient(currentColor 0 0) bottom/67% 58%;
background-repeat: no-repeat;
position: relative;
}
.pulse:after {
content: '';
position: absolute;
inset: 0;
background: inherit;
opacity: 0.4;
animation: pulse-hjvm54 1s infinite;
}
@keyframes pulse-hjvm54 {
to {
transform: scale(1.8);
opacity: 0;
}
}
</style>
<div class="loading-wrapper">
<div class="pulse"></div>
</div>
</div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
export default {
'*.md': ['prettier --write'],
'package.json': ['prettier --write'],
'!(package).json': ['prettier --write--parser json'],
'*.{css,scss,postcss,less}': ['stylelint --fix', 'prettier --write'],
'*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
'*.vue': ['eslint --fix', 'stylelint --fix', 'prettier --write', 'echo "统一格式化完成🌸"'],
}
{
"name": "hxyj-admin-fe",
"private": true,
"version": "0.0.1",
"type": "module",
"scripts": {
"dev": "vite",
"build": "npm run build:uat",
"build:sit": "vue-tsc --noEmit && vite build --mode development",
"build:uat": "vue-tsc --noEmit && vite build",
"preview": "vite preview",
"lint:lint-staged": "lint-staged -c ./lint-staged.config.js",
"lint:prettier": "prettier --write \"src/**/*.{js,ts,json,tsx,css,scss,vue,html,md}\"",
"lint:stylelint": "stylelint \"./src/**/*.{html,vue,css,scss}\" --fix",
"prepare": "husky",
"preinstall": "npx only-allow pnpm"
},
"dependencies": {
"@icon-park/vue-next": "^1.4.2",
"@tailwindcss/vite": "^4.1.8",
"@vueuse/core": "^13.3.0",
"axios": "^1.9.0",
"element-plus": "^2.9.11",
"nanoid": "^5.1.5",
"nprogress": "^0.2.0",
"pinia": "^3.0.2",
"tailwindcss": "^4.1.8",
"tippy.js": "^6.3.7",
"vue": "^3.5.16",
"vue-i18n": "^11.1.5",
"vue-router": "^4.5.1",
"vue-tippy": "^6.7.1"
},
"devDependencies": {
"@commitlint/cli": "^19.8.1",
"@commitlint/config-conventional": "^19.8.1",
"@commitlint/types": "^19.8.1",
"@intlify/unplugin-vue-i18n": "^6.0.8",
"@types/node": "^22.15.29",
"@types/nprogress": "^0.2.3",
"@typescript-eslint/parser": "^8.33.1",
"@vitejs/plugin-vue": "^5.2.4",
"autoprefixer": "^10.4.21",
"eslint": "^9.28.0",
"eslint-config-prettier": "^10.1.5",
"eslint-plugin-prettier": "^5.4.1",
"eslint-plugin-vue": "^10.1.0",
"globals": "^16.2.0",
"husky": "^9.1.7",
"lint-staged": "^16.1.0",
"postcss-html": "^1.8.0",
"prettier": "^3.5.3",
"prettier-plugin-tailwindcss": "^0.6.12",
"rollup-plugin-visualizer": "^6.0.1",
"stylelint": "^16.20.0",
"stylelint-config-recess-order": "^6.0.0",
"stylelint-config-recommended-vue": "^1.6.0",
"stylelint-config-standard": "^38.0.0",
"stylelint-order": "^7.0.0",
"typescript": "^5.8.3",
"typescript-eslint": "^8.33.1",
"unplugin-auto-import": "^19.3.0",
"unplugin-vue-components": "^28.7.0",
"vite": "^6.3.5",
"vite-plugin-checker": "^0.9.3",
"vue-eslint-parser": "^10.1.3",
"vue-tsc": "^2.2.10"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0",
"pnpm": ">=9"
},
"volta": {
"node": "20.19.1"
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
export default {
plugins: ['prettier-plugin-tailwindcss'],
experimentalTernaries: false,
printWidth: 120,
tabWidth: 2,
useTabs: false,
semi: false,
singleQuote: true,
quoteProps: 'as-needed', // 对象属性引号问题
jsxSingleQuote: true,
trailingComma: 'all', // 尾随逗号
bracketSpacing: true,
bracketSameLine: false,
arrowParens: 'always', // 箭头函数单个参数 提供括号支持
requirePragma: false,
insertPragma: false,
proseWrap: 'preserve',
htmlWhitespaceSensitivity: 'css',
vueIndentScriptAndStyle: false,
endOfLine: 'auto',
singleAttributePerLine: false, // 在 HTML、Vue和JSX中强制每行使用单一属性
}
import { request } from '@/utils/request'
export function fetchLogin<T>(payload: { username: string; password: string }) {
return request.post<T>(`/oauth/auth?username=${payload.username}&password=${payload.password}`, null, {
ignoreErrorCheck: true,
})
}
<script setup lang="ts">
import { ref } from 'vue'
import { useResizeObserver } from '@vueuse/core'
import { useDesignSettingStore } from '@/store/modules/design-setting'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
const designSettingStore = useDesignSettingStore()
const currentLocale = ref({
zhCn,
})
const rootContainer = ref<HTMLDivElement | null>(null)
useResizeObserver(rootContainer, (entries) => {
const entry = entries[0]
const { width } = entry.contentRect
/**
* 0 < width <= 760 隐藏侧边栏
* 760 < width <= 990 折叠侧边栏
* width > 990 展开侧边栏
*/
if (width <= 760) {
designSettingStore.toggleIsMobileLayout(true)
designSettingStore.toggleSidebarDisplayStatus('hidden')
} else if (760 < width && width <= 990) {
designSettingStore.toggleIsMobileLayout(false)
designSettingStore.toggleSidebarDisplayStatus('collapse')
} else {
designSettingStore.toggleIsMobileLayout(false)
designSettingStore.toggleSidebarDisplayStatus('expand')
}
})
</script>
<template>
<div ref="rootContainer" class="h-full w-full">
<el-config-provider :locale="currentLocale">
<RouterView v-slot="{ Component }">
<Component :is="Component" />
</RouterView>
</el-config-provider>
</div>
</template>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><g id="freepik--Floor--inject-15"><path id="freepik--floor--inject-15" d="M410.25,249.13c-89.63-51.53-234.95-51.53-324.58,0s-89.62,135.09,0,186.62,234.94,51.54,324.57,0S499.87,300.67,410.25,249.13Z" style="fill:#f5f5f5"></path></g><g id="freepik--Shadows--inject-15"><ellipse id="freepik--Shadow--inject-15" cx="139.25" cy="312.65" rx="63.45" ry="36.64" style="fill:#e0e0e0"></ellipse><g id="freepik--shadow--inject-15"><path d="M247.29,409l-5.9-3.41,4.29-2.47a4.56,4.56,0,0,0,0-8.21L235,388.7a9,9,0,0,0-8.37,0l-7.21,4.17-37.26-21.52a9,9,0,0,0-8.37,0l-15.22,8.79a7.46,7.46,0,0,0-2.73,2.38,5.41,5.41,0,0,0-.59,3.92l7.88,39.44c.46,2,1.94,3.71,4.41,5.13l10.69,6.17a8.19,8.19,0,0,0,4.17,1h0a8.22,8.22,0,0,0,4.19-1l30.3-17.49,8.82,5.09a9,9,0,0,0,8.37,0l13.2-7.62a4.56,4.56,0,0,0,0-8.21Zm-58.68,1.69-1.77-8.88,8.57,5Z" style="fill:#e0e0e0"></path><path d="M306.62,347.59c-2.67-1.7-5.62-3.48-8.77-5.31s-6.29-3.54-9.4-5.19a67.84,67.84,0,0,0-13.07-5A58.37,58.37,0,0,0,260.57,330h-.68a64,64,0,0,0-15,1.86,61.37,61.37,0,0,0-16,6.54c-5.45,3.15-9.27,6.28-11.69,9.6a16.72,16.72,0,0,0-3.63,10.47,16.24,16.24,0,0,0,4,9.88,39.49,39.49,0,0,0,9.06,7.83c2.76,1.75,5.78,3.57,9,5.42s6.28,3.55,9.19,5.07a68.35,68.35,0,0,0,13.07,5.05,58.35,58.35,0,0,0,14.8,2.05h.7a63.81,63.81,0,0,0,15-1.86,61.37,61.37,0,0,0,16-6.54c5.45-3.15,9.27-6.29,11.69-9.6a16.66,16.66,0,0,0,3.63-10.47,16.26,16.26,0,0,0-4-9.88A39,39,0,0,0,306.62,347.59ZM288.5,368.47a9.24,9.24,0,0,1-3.16,2.51,17.21,17.21,0,0,1-9,2.5q-.52,0-1.05,0a18.2,18.2,0,0,1-4.73-.93,32.91,32.91,0,0,1-4.9-2.13,188.5,188.5,0,0,1-16.72-9.66,17.64,17.64,0,0,1-3.37-2.63,4,4,0,0,1-1.12-1.77c0-.1-.09-.4.34-1.06a9.15,9.15,0,0,1,3.15-2.51,18,18,0,0,1,5.12-2.06,17.27,17.27,0,0,1,3.73-.42c.38,0,.75,0,1.12,0a19.3,19.3,0,0,1,4.73,1,41.7,41.7,0,0,1,5,2.06c5.75,3,11.38,6.27,16.75,9.67a20.84,20.84,0,0,1,3.48,2.66,3.44,3.44,0,0,1,1,1.63C288.89,367.41,289,367.77,288.5,368.47Z" style="fill:#e0e0e0"></path><path d="M394.57,323.93l-5.9-3.41L393,318a4.56,4.56,0,0,0,0-8.2l-10.69-6.17a8.39,8.39,0,0,0-4.19-1,8.31,8.31,0,0,0-4.18,1l-7.21,4.16-37.26-21.51a9,9,0,0,0-8.36,0l-15.23,8.79a7.63,7.63,0,0,0-2.73,2.38,5.43,5.43,0,0,0-.59,3.93l7.89,39.43c.45,2,1.94,3.71,4.41,5.14l10.68,6.17a8.3,8.3,0,0,0,4.18,1h0a8.3,8.3,0,0,0,4.18-1l30.3-17.5,8.83,5.1a9,9,0,0,0,8.36,0l13.2-7.63a4.55,4.55,0,0,0,0-8.2Zm-58.68,1.68-1.77-8.88,8.58,4.95Z" style="fill:#e0e0e0"></path></g></g><g id="freepik--Clouds--inject-15"><g id="freepik--clouds--inject-15"><path d="M435.37,85.75l-9.46-5.46a8.57,8.57,0,0,0,.08-1.16V76.39a16.92,16.92,0,0,0-7.65-13.25,6,6,0,0,0-4.56-.88c-.69-6.94-5.51-14.78-11.35-18.15-6.32-3.65-11.45-.69-11.45,6.6v4.11a19.92,19.92,0,0,0,1,5.87l-7.86-4.54c-2.34-1.36-4.24-.26-4.24,2.45A9.41,9.41,0,0,0,384.09,66l51.28,29.6c2.34,1.36,4.24.26,4.24-2.45A9.41,9.41,0,0,0,435.37,85.75Z" style="fill:#ebebeb"></path><path d="M378,95.89l-6-3.48a5.74,5.74,0,0,0,0-.74V89.93a10.79,10.79,0,0,0-4.87-8.45,3.85,3.85,0,0,0-2.91-.56c-.44-4.41-3.51-9.41-7.23-11.56-4-2.32-7.29-.44-7.29,4.21v2.61a12.46,12.46,0,0,0,.62,3.74l-5-2.89c-1.49-.86-2.7-.16-2.7,1.56a6,6,0,0,0,2.7,4.68L378,102.14c1.49.86,2.7.16,2.7-1.57A6,6,0,0,0,378,95.89Z" style="fill:#ebebeb"></path></g></g><g id="freepik--Plant--inject-15"><g id="freepik--Plants--inject-15"><path d="M373.82,300.75c-3.23-14.81-8.41-29.33-5.2-52,2.92-20.54,13.71-38.89,29.08-41,10.36-1.38,19.41,10.17,9.27,25-1.69,2.47-23.65,24-20,53.67l-2.05,19.74Z" style="fill:#3F9CAD"></path><g style="opacity:0.2"><path d="M373.82,300.75c-3.23-14.81-8.41-29.33-5.2-52,2.92-20.54,13.71-38.89,29.08-41,10.36-1.38,19.41,10.17,9.27,25-1.69,2.47-23.65,24-20,53.67l-2.05,19.74Z"></path></g><path d="M379.2,298.55a.67.67,0,0,0,.38-.71c-6-38,1.65-66.37,20-82a.67.67,0,0,0,.08-.94.68.68,0,0,0-1-.08c-18.58,15.8-26.49,44.72-20.45,83.19a.66.66,0,0,0,.76.56Z" style="fill:#fff"></path><path d="M391.14,312.06c-.07-5.76,3.11-18.32,10.64-29.27,9.5-13.82,24.32-18.34,25.83-25.58,1.82-8.7-7.29-13.67-19.08-9.45-14.19,5.08-30.94,25.51-25.13,59.95Z" style="fill:#455a64"></path><path d="M387.27,306a.71.71,0,0,0,.45-.63c1.6-30.57,19.75-46.58,29.13-50.77a.72.72,0,0,0,.36-.95.7.7,0,0,0-.95-.36c-10.37,4.63-28.34,20.8-30,52a.72.72,0,0,0,.69.75A.63.63,0,0,0,387.27,306Z" style="fill:#fff"></path></g></g><g id="freepik--error-404--inject-15"><g id="freepik--404--inject-15"><g id="freepik--404--inject-15"><path d="M244.66,401.34,231.45,409a6.1,6.1,0,0,1-5.44,0L215.72,403,184,421.36a6,6,0,0,1-5.45,0l-10.68-6.17c-1.76-1-2.76-2.09-3-3.26l-7.87-39.35a3.61,3.61,0,0,1-.06-.7c0,.76,0,10.58,0,11.06a3.38,3.38,0,0,0,.06.6l7.87,39.35c.27,1.17,1.27,2.26,3,3.27l10.68,6.17a6.12,6.12,0,0,0,5.45,0L215.72,414,226,419.92a6,6,0,0,0,5.44,0l13.21-7.62a1.85,1.85,0,0,0,1.11-1.58v-11A1.89,1.89,0,0,1,244.66,401.34Z" style="fill:#3F9CAD"></path><path d="M244.15,396.64v-11a1.86,1.86,0,0,1-1.11,1.58l-8.67,5,9.36,5.4A1.49,1.49,0,0,0,244.15,396.64Z" style="fill:#3F9CAD"></path><polygon points="184.02 395.09 190.59 398.9 200.09 393.42 181.54 382.7 184 395.09 184.02 395.09" style="fill:#3F9CAD"></polygon><polygon points="184.02 395.09 190.59 398.9 200.09 393.42 181.54 382.7 184 395.09 184.02 395.09" style="opacity:0.35000000000000003"></polygon><path d="M244.15,396.64v-11a1.86,1.86,0,0,1-1.11,1.58l-8.67,5,9.36,5.4A1.49,1.49,0,0,0,244.15,396.64Z" style="opacity:0.2"></path><path d="M244.66,401.34,231.45,409a5.35,5.35,0,0,1-2.73.64v11a5.26,5.26,0,0,0,2.73-.65l13.21-7.62a1.85,1.85,0,0,0,1.11-1.58v-11A1.89,1.89,0,0,1,244.66,401.34Z" style="opacity:0.2"></path><path d="M164.8,411.93l-7.87-39.35a3.61,3.61,0,0,1-.06-.7c0,.76,0,10.58,0,11.06a3.38,3.38,0,0,0,.06.6l7.87,39.35a2.45,2.45,0,0,0,.24.67v-11A2.51,2.51,0,0,1,164.8,411.93Z" style="opacity:0.25"></path><path d="M181.23,422a5.47,5.47,0,0,1-2.72-.65l-10.68-6.17a6.46,6.46,0,0,1-2.79-2.6v11a6.52,6.52,0,0,0,2.79,2.6l10.68,6.17a5.47,5.47,0,0,0,2.72.64,1.62,1.62,0,0,0,.31,0V422A1.09,1.09,0,0,1,181.23,422Z" style="opacity:0.35000000000000003"></path><path d="M184,421.36a4.93,4.93,0,0,1-2.42.62v11a5.15,5.15,0,0,0,2.42-.62L215.72,414V403Z" style="opacity:0.2"></path><path d="M226,409,215.72,403v11L226,419.92a5.21,5.21,0,0,0,2.71.65v-11A5.3,5.3,0,0,1,226,409Z" style="opacity:0.35000000000000003"></path><path d="M231.45,409a6.12,6.12,0,0,1-5.45,0L215.72,403,184,421.36a6.12,6.12,0,0,1-5.45,0l-10.68-6.17q-2.62-1.51-3-3.26l-7.86-39.35a2.53,2.53,0,0,1,.2-1.81,5,5,0,0,1,1.71-1.4l15.23-8.79a6.1,6.1,0,0,1,5.44,0l38.72,22.36,8.67-5a6.12,6.12,0,0,1,5.45,0L243,384.1a1.67,1.67,0,0,1,0,3.15l-8.67,5,10.29,5.94a1.67,1.67,0,0,1,0,3.14Zm-31.36-15.54-18.55-10.71,3.83,19.21Z" style="fill:#3F9CAD"></path><path d="M315.64,352.65a14.3,14.3,0,0,1-3.09,8.09q-3.23,4.41-10.79,8.79a57.94,57.94,0,0,1-15.22,6.23,60.19,60.19,0,0,1-15,1.77,54.92,54.92,0,0,1-14.07-1.95A64.12,64.12,0,0,1,245,370.74q-4.32-2.26-9.07-5t-8.87-5.36a35.6,35.6,0,0,1-8.36-7.21,13.37,13.37,0,0,1-3.38-8.12c.06,1.74-.07,9.05,0,11a13.37,13.37,0,0,0,3.38,8.13,36.07,36.07,0,0,0,8.36,7.21q4.14,2.63,8.87,5.35t9.07,5a64.74,64.74,0,0,0,12.51,4.83,55.37,55.37,0,0,0,14.07,1.95,60.22,60.22,0,0,0,15-1.78,57.94,57.94,0,0,0,15.22-6.23q7.58-4.37,10.79-8.79a13.83,13.83,0,0,0,3.08-8.64C315.57,361.45,315.68,355.14,315.64,352.65Z" style="fill:#3F9CAD"></path><path d="M274.26,377.48c-.9,0-1.8.07-2.69,0a54.92,54.92,0,0,1-14.07-1.95A64.12,64.12,0,0,1,245,370.74q-4.32-2.26-9.07-5t-8.87-5.36a35.6,35.6,0,0,1-8.36-7.21,13.37,13.37,0,0,1-3.38-8.12c.06,1.74-.07,9.05,0,11a13.37,13.37,0,0,0,3.38,8.13,36.07,36.07,0,0,0,8.36,7.21q4.14,2.63,8.87,5.35t9.07,5a64.74,64.74,0,0,0,12.51,4.83,55.37,55.37,0,0,0,14.07,1.95c.89,0,1.79,0,2.69-.06Z" style="opacity:0.35000000000000003"></path><path d="M315.64,352.65a14.3,14.3,0,0,1-3.09,8.09q-3.23,4.41-10.79,8.79a57.94,57.94,0,0,1-15.22,6.23,61.82,61.82,0,0,1-12.28,1.72v11a60.39,60.39,0,0,0,12.28-1.72,57.94,57.94,0,0,0,15.22-6.23q7.58-4.37,10.79-8.79a13.83,13.83,0,0,0,3.08-8.64C315.57,361.45,315.68,355.14,315.64,352.65Z" style="opacity:0.2"></path><path d="M242.28,346.82a15.5,15.5,0,0,0,2,1.73c.34-.22.67-.44,1.05-.66a21.43,21.43,0,0,1,5.95-2.39,19.89,19.89,0,0,1,5.7-.43,22.35,22.35,0,0,1,5.45,1.1,47.79,47.79,0,0,1,5.39,2.24q8.77,4.62,16.94,9.79c.71.44,1.37.9,2,1.34a10.29,10.29,0,0,0,3.08-2.77,4.5,4.5,0,0,0,.81-3.32,6.15,6.15,0,0,0-1.86-3.17,24.55,24.55,0,0,0-4-3q-8.18-5.19-16.94-9.78a46.1,46.1,0,0,0-5.39-2.25,22.83,22.83,0,0,0-5.45-1.1,19.91,19.91,0,0,0-5.7.44,21.09,21.09,0,0,0-5.95,2.38,12.34,12.34,0,0,0-4.13,3.44,4.26,4.26,0,0,0-.76,3.28A7,7,0,0,0,242.28,346.82Z" style="fill:#3F9CAD"></path><path d="M242.28,346.82a15.5,15.5,0,0,0,2,1.73c.34-.22.67-.44,1.05-.66a21.43,21.43,0,0,1,5.95-2.39,19.89,19.89,0,0,1,5.7-.43,22.35,22.35,0,0,1,5.45,1.1,47.79,47.79,0,0,1,5.39,2.24q8.77,4.62,16.94,9.79c.71.44,1.37.9,2,1.34a10.29,10.29,0,0,0,3.08-2.77,4.5,4.5,0,0,0,.81-3.32,6.15,6.15,0,0,0-1.86-3.17,24.55,24.55,0,0,0-4-3q-8.18-5.19-16.94-9.78a46.1,46.1,0,0,0-5.39-2.25,22.83,22.83,0,0,0-5.45-1.1,19.91,19.91,0,0,0-5.7.44,21.09,21.09,0,0,0-5.95,2.38,12.34,12.34,0,0,0-4.13,3.44,4.26,4.26,0,0,0-.76,3.28A7,7,0,0,0,242.28,346.82Z" style="opacity:0.35000000000000003"></path><path d="M229.17,327.61a57.66,57.66,0,0,1,15.23-6.23,60.19,60.19,0,0,1,15-1.77,55,55,0,0,1,14.07,1.95,64.39,64.39,0,0,1,12.5,4.83q4.53,2.39,9.28,5.12c3.16,1.83,6,3.57,8.67,5.24a36.55,36.55,0,0,1,8.37,7.22,13.39,13.39,0,0,1,3.37,8.12,13.76,13.76,0,0,1-3.07,8.64q-3.22,4.42-10.79,8.8a57.63,57.63,0,0,1-15.23,6.22,59.7,59.7,0,0,1-15,1.78,55.29,55.29,0,0,1-14.06-1.95A64.24,64.24,0,0,1,245,370.75c-2.89-1.52-5.91-3.18-9.07-5s-6.12-3.61-8.88-5.35a36.3,36.3,0,0,1-8.36-7.22,13.35,13.35,0,0,1-3.38-8.12,13.85,13.85,0,0,1,3.07-8.65Q221.61,332,229.17,327.61Zm55.56,19.62q-8.18-5.18-16.94-9.78a44.35,44.35,0,0,0-5.39-2.24A22.37,22.37,0,0,0,257,334.1a19.88,19.88,0,0,0-5.7.44,20.84,20.84,0,0,0-5.95,2.39,12.1,12.1,0,0,0-4.13,3.43,4.24,4.24,0,0,0-.76,3.29,6.79,6.79,0,0,0,1.87,3.17,20.69,20.69,0,0,0,3.93,3.09,191.88,191.88,0,0,0,16.94,9.78,36.37,36.37,0,0,0,5.29,2.3,21,21,0,0,0,5.5,1.07,20.54,20.54,0,0,0,5.75-.46,20.84,20.84,0,0,0,5.95-2.39,12.22,12.22,0,0,0,4.13-3.43,4.46,4.46,0,0,0,.81-3.32,6.13,6.13,0,0,0-1.87-3.17A23.1,23.1,0,0,0,284.73,347.23Z" style="fill:#3F9CAD"></path><path d="M391.94,316.3l-13.21,7.62a6,6,0,0,1-5.44,0L363,318l-31.77,18.35a5.42,5.42,0,0,1-2.72.64,5.48,5.48,0,0,1-2.73-.64l-10.68-6.18q-2.62-1.5-3-3.26l-7.87-39.35a4.51,4.51,0,0,1,0-.7c0,.76,0,10.58,0,11.06a4.55,4.55,0,0,0,0,.61l7.87,39.35c.27,1.17,1.28,2.25,3,3.26l10.68,6.17a5.48,5.48,0,0,0,2.73.65,5.42,5.42,0,0,0,2.72-.65L363,329l10.28,5.94a6.1,6.1,0,0,0,5.44,0l13.21-7.62a1.86,1.86,0,0,0,1.11-1.58v-11A1.86,1.86,0,0,1,391.94,316.3Z" style="fill:#3F9CAD"></path><path d="M391.44,311.6v-11a1.86,1.86,0,0,1-1.11,1.57l-8.68,5,9.37,5.4A1.57,1.57,0,0,0,391.44,311.6Z" style="fill:#3F9CAD"></path><polygon points="331.3 310.06 337.87 313.87 347.38 308.39 328.82 297.67 331.29 310.06 331.3 310.06" style="fill:#3F9CAD"></polygon><polygon points="331.3 310.06 337.87 313.87 347.38 308.39 328.82 297.67 331.29 310.06 331.3 310.06" style="opacity:0.35000000000000003"></polygon><path d="M391.44,311.6v-11a1.86,1.86,0,0,1-1.11,1.57l-8.68,5,9.37,5.4A1.57,1.57,0,0,0,391.44,311.6Z" style="opacity:0.2"></path><path d="M391.94,316.3l-13.21,7.62a5.24,5.24,0,0,1-2.72.65v11a5.34,5.34,0,0,0,2.72-.64l13.21-7.62a1.86,1.86,0,0,0,1.11-1.58v-11A1.86,1.86,0,0,1,391.94,316.3Z" style="opacity:0.2"></path><path d="M312.08,326.89l-7.87-39.35a4.51,4.51,0,0,1,0-.7c0,.76,0,10.58,0,11.06a4.55,4.55,0,0,0,0,.61l7.87,39.35a2.55,2.55,0,0,0,.25.66v-11A2.61,2.61,0,0,1,312.08,326.89Z" style="opacity:0.25"></path><path d="M328.52,337a5.48,5.48,0,0,1-2.73-.64l-10.68-6.18a6.36,6.36,0,0,1-2.78-2.59v11a6.37,6.37,0,0,0,2.78,2.6l10.68,6.17a5.48,5.48,0,0,0,2.73.65,1,1,0,0,0,.3,0V337A1.51,1.51,0,0,1,328.52,337Z" style="opacity:0.35000000000000003"></path><path d="M331.24,336.33a5.12,5.12,0,0,1-2.42.62v11a4.9,4.9,0,0,0,2.42-.62L363,329V318Z" style="opacity:0.2"></path><path d="M373.29,323.92,363,318v11l10.28,5.94a5.32,5.32,0,0,0,2.72.64v-11A5.22,5.22,0,0,1,373.29,323.92Z" style="opacity:0.35000000000000003"></path><path d="M378.73,323.92a6.1,6.1,0,0,1-5.44,0L363,318l-31.76,18.34a6.1,6.1,0,0,1-5.44,0l-10.69-6.17c-1.75-1-2.76-2.09-3-3.26l-7.86-39.35a2.54,2.54,0,0,1,.2-1.8,4.91,4.91,0,0,1,1.71-1.4l15.23-8.79a6.1,6.1,0,0,1,5.44,0l38.72,22.35,8.67-5a6,6,0,0,1,5.45,0l10.69,6.17a1.67,1.67,0,0,1,0,3.14l-8.67,5,10.28,5.93a1.67,1.67,0,0,1,0,3.15Zm-31.36-15.54-18.55-10.71,3.83,19.21Z" style="fill:#3F9CAD"></path></g><path d="M310.38,409.16a1.62,1.62,0,0,1,.83-.19,1.64,1.64,0,0,1,.83.19l3.25,1.89a.5.5,0,0,1,0,.95l-14.56,8.41a1.64,1.64,0,0,1-.83.2,1.62,1.62,0,0,1-.83-.2L279.22,409a.51.51,0,0,1,0-1l14.32-8.26a1.62,1.62,0,0,1,.83-.2,1.67,1.67,0,0,1,.83.2l3.25,1.88a.5.5,0,0,1,0,.95L289,408l3.32,1.91,8.79-5.07a1.62,1.62,0,0,1,.83-.19,1.67,1.67,0,0,1,.83.19l3.25,1.88a.51.51,0,0,1,0,1l-8.79,5.07,3.45,2Z" style="fill:#455a64"></path><path d="M315.23,393.59a1.67,1.67,0,0,1,.83-.2,1.62,1.62,0,0,1,.83.2l3.11,1.79a.51.51,0,0,1,0,1L317.2,398q-2.82,1.64,0,3.27l7.56,4.36a.51.51,0,0,1,0,1l-3.87,2.23a1.64,1.64,0,0,1-.83.2,1.62,1.62,0,0,1-.83-.2l-14.32-8.26a.51.51,0,0,1,0-1l3.56-2.06a1.64,1.64,0,0,1,.83-.2,1.62,1.62,0,0,1,.83.2l.71.41a3.09,3.09,0,0,1,.6-1.63,5.93,5.93,0,0,1,1.95-1.62Z" style="fill:#455a64"></path><path d="M330.11,385a1.62,1.62,0,0,1,.83-.2,1.64,1.64,0,0,1,.83.2l3.1,1.79a.51.51,0,0,1,0,1l-2.8,1.61q-2.82,1.63,0,3.27l7.56,4.36a.51.51,0,0,1,0,1l-3.87,2.24a1.62,1.62,0,0,1-.83.19,1.67,1.67,0,0,1-.83-.19l-14.32-8.27a.51.51,0,0,1,0-1l3.57-2.06a1.62,1.62,0,0,1,.83-.19,1.67,1.67,0,0,1,.83.19l.7.41a3.06,3.06,0,0,1,.6-1.62,6.06,6.06,0,0,1,1.95-1.63Z" style="fill:#455a64"></path><path d="M356.54,377.62c.32.16.73.38,1.21.66s.87.51,1.15.7a6.28,6.28,0,0,1,2.09,2,3.64,3.64,0,0,1,.57,2.28,4.48,4.48,0,0,1-1.07,2.38,10.16,10.16,0,0,1-2.85,2.28,16.25,16.25,0,0,1-3.95,1.64,17.87,17.87,0,0,1-4.11.62,17.1,17.1,0,0,1-3.95-.33,12.82,12.82,0,0,1-3.44-1.2c-.33-.17-.74-.39-1.22-.67s-.86-.51-1.15-.7a6.16,6.16,0,0,1-2.12-2,3.53,3.53,0,0,1-.55-2.29,4.66,4.66,0,0,1,1.07-2.39,9.75,9.75,0,0,1,2.83-2.29,15.93,15.93,0,0,1,4-1.64,19.48,19.48,0,0,1,4.15-.62,17.05,17.05,0,0,1,3.95.33A13,13,0,0,1,356.54,377.62Zm-9,7.73a5.38,5.38,0,0,0,2.68.57,5.6,5.6,0,0,0,2.64-.76q1.23-.71,1.32-1.53c.06-.54-.26-1.06-1-1.54a9.54,9.54,0,0,0-1-.64c-.38-.22-.75-.41-1.1-.57a5.62,5.62,0,0,0-5.32.2c-.82.47-1.26,1-1.32,1.52s.27,1.06,1,1.55a11.72,11.72,0,0,0,2.09,1.2Z" style="fill:#455a64"></path><path d="M364.53,365.13a1.62,1.62,0,0,1,.83-.2,1.64,1.64,0,0,1,.83.2l3.1,1.79a.51.51,0,0,1,0,1l-2.8,1.61q-2.82,1.63,0,3.27l7.56,4.36a.51.51,0,0,1,0,1l-3.87,2.23a1.62,1.62,0,0,1-.83.2,1.67,1.67,0,0,1-.83-.2l-14.32-8.26a.51.51,0,0,1,0-1l3.57-2.06a1.62,1.62,0,0,1,.83-.2,1.67,1.67,0,0,1,.83.2l.7.41a3.09,3.09,0,0,1,.6-1.63,5.93,5.93,0,0,1,1.95-1.62Z" style="fill:#455a64"></path></g></g><g id="freepik--Character--inject-15"><g id="freepik--Monster--inject-15"><path d="M152.59,274.36c-4.22-.17-6.08.25-5.43,4.71s.85,7.9.85,7.9,7.51.22,11-1.73S158.93,274.61,152.59,274.36Z" style="fill:#3F9CAD"></path><path d="M152.59,274.36c-4.22-.17-6.08.25-5.43,4.71s.85,7.9.85,7.9,7.51.22,11-1.73S158.93,274.61,152.59,274.36Z" style="opacity:0.5"></path><path d="M153.26,293.52a4.56,4.56,0,0,1-.82-.08,4.26,4.26,0,0,1-3.35-5c1.09-5.54,2.17-9.82,3.13-13.59a108.4,108.4,0,0,0,3.15-16,41,41,0,0,0-5.18-24.15,4.24,4.24,0,1,1,7.3-4.33,49.29,49.29,0,0,1,6.32,29.4,114.15,114.15,0,0,1-3.36,17.14c-.92,3.67-2,7.83-3,13.15A4.25,4.25,0,0,1,153.26,293.52Z" style="fill:#455a64"></path><path d="M143.1,299.26a5.29,5.29,0,0,0,0,2.49c.59,1.1,3.86,2.45,5.58,3.16a10,10,0,0,1,5.42,5c1.92,3.51,5.42,5.88,9.33,7.37a27.44,27.44,0,0,0,16.3.59c6.69-1.67,7-5.7,7-5.7s.1-3.78-1.62-4.26S143.1,299.26,143.1,299.26Z" style="fill:#455a64"></path><path d="M145.8,285.22a26.77,26.77,0,0,1-.81,3.52c-1,3.17-2.55,6.44-1.89,10.52,1.1,2,3.4,2.7,5.12,3.46,2.31,1,4,1.71,5.63,3.71,3,3.59,5.81,8.13,14.79,9.3s15.52-2.1,17-4.74-.18-4.91-6.07-7.59c-3-1.37-9.81-7-10.59-7.72a14.83,14.83,0,0,1-1.92-2.41,14.61,14.61,0,0,1-2.4-6,21,21,0,0,1,.33-6.83c.1-.52.36-1.06.14-1.53-.57-1.26-2.54-.93-3.63-.84a36.26,36.26,0,0,0-4.84.83,2.79,2.79,0,0,0-1.44.61,2.92,2.92,0,0,0-.63,1.38c-.21.75-.43,1.5-.67,2.23a2.06,2.06,0,0,1-.88,1.31,1.31,1.31,0,0,1-1.46-.36,2.39,2.39,0,0,1-.55-1.46c0-.54,0-1.07.06-1.6a2.51,2.51,0,0,0-.29-1.48c-.59-.93-2.08-1.08-2.46-2.11a1.59,1.59,0,0,1,.45-1.61,2.83,2.83,0,0,1,1.61-.66,12.68,12.68,0,0,1,1.75,0l.32-1.24a7.67,7.67,0,0,0-4.09.52,3.69,3.69,0,0,0-1.87,1.76,5.33,5.33,0,0,0-.15,3.07C146.61,281.6,146.18,282.88,145.8,285.22Z" style="fill:#3F9CAD"></path><path d="M145.8,285.22a26.77,26.77,0,0,1-.81,3.52c-1,3.17-2.55,6.44-1.89,10.52,1.1,2,3.4,2.7,5.12,3.46,2.31,1,4,1.71,5.63,3.71,3,3.59,5.81,8.13,14.79,9.3s15.52-2.1,17-4.74-.18-4.91-6.07-7.59c-3-1.37-9.81-7-10.59-7.72a14.83,14.83,0,0,1-1.92-2.41,14.61,14.61,0,0,1-2.4-6,21,21,0,0,1,.33-6.83c.1-.52.36-1.06.14-1.53-.57-1.26-2.54-.93-3.63-.84a36.26,36.26,0,0,0-4.84.83,2.79,2.79,0,0,0-1.44.61,2.92,2.92,0,0,0-.63,1.38c-.21.75-.43,1.5-.67,2.23a2.06,2.06,0,0,1-.88,1.31,1.31,1.31,0,0,1-1.46-.36,2.39,2.39,0,0,1-.55-1.46c0-.54,0-1.07.06-1.6a2.51,2.51,0,0,0-.29-1.48c-.59-.93-2.08-1.08-2.46-2.11a1.59,1.59,0,0,1,.45-1.61,2.83,2.83,0,0,1,1.61-.66,12.68,12.68,0,0,1,1.75,0l.32-1.24a7.67,7.67,0,0,0-4.09.52,3.69,3.69,0,0,0-1.87,1.76,5.33,5.33,0,0,0-.15,3.07C146.61,281.6,146.18,282.88,145.8,285.22Z" style="opacity:0.35000000000000003"></path><path d="M162.68,314.17a11.66,11.66,0,0,1,6-10.24c6.45-3.86,10.66-1.93,12.81-.6,2.55,1.59,6.28,5,4.34,7.82-2.09,3-5.66,4.63-12.47,5.17S162.68,314.17,162.68,314.17Z" style="fill:#fafafa"></path><path d="M153.78,291a.74.74,0,0,0,.64-.25c.89-.95,6.3-4.22,10.39-2.54.1-.15.27-1.15-.22-1.46a12.74,12.74,0,0,0-11.32,3,.72.72,0,0,0,.07,1A.83.83,0,0,0,153.78,291Z" style="fill:#fafafa"></path><path d="M166.53,292.49a2.09,2.09,0,0,0-.66-1.53c-4.66-.66-9.34,2.27-10.37,3.38a.72.72,0,0,0,.08,1,.74.74,0,0,0,.44.18.76.76,0,0,0,.64-.24C157.52,294.39,162.85,291.3,166.53,292.49Z" style="fill:#fafafa"></path><path d="M173.58,299.42c-.07-.48-1-1.2-1.79-1.4-5.15-.35-9.5,3.57-10.35,4.87a.71.71,0,0,0,.24,1,.8.8,0,0,0,.47.11.79.79,0,0,0,.59-.34C163.5,302.51,168.7,298.12,173.58,299.42Z" style="fill:#fafafa"></path><path d="M158.7,300a.83.83,0,0,0,.61-.31c.75-1.05,5.27-5,9.92-3.81,0-.41-.82-1.22-1.24-1.33-4.61-.42-9.07,3.07-10,4.3a.72.72,0,0,0,.19,1A.82.82,0,0,0,158.7,300Z" style="fill:#fafafa"></path><path d="M105.66,289.11c-4.2-.34-6.09,0-5.62,4.48s.52,7.93.52,7.93,7.49.53,11.06-1.27S112,289.63,105.66,289.11Z" style="fill:#3F9CAD"></path><path d="M105.66,289.11c-4.2-.34-6.09,0-5.62,4.48s.52,7.93.52,7.93,7.49.53,11.06-1.27S112,289.63,105.66,289.11Z" style="opacity:0.5"></path><path d="M105.53,308.28a4.61,4.61,0,0,1-.82-.11,4.24,4.24,0,0,1-3.13-5.13c1.32-5.49,2.58-9.71,3.69-13.45a106.87,106.87,0,0,0,3.82-15.83,41,41,0,0,0-4.16-24.34,4.25,4.25,0,0,1,7.48-4A49.4,49.4,0,0,1,117.49,275a113.91,113.91,0,0,1-4.08,17c-1.08,3.63-2.3,7.74-3.57,13A4.25,4.25,0,0,1,105.53,308.28Z" style="fill:#455a64"></path><path d="M95.14,313.59a5.2,5.2,0,0,0-.13,2.49c.54,1.12,3.74,2.61,5.43,3.39a10,10,0,0,1,5.2,5.26c1.78,3.58,5.18,6.1,9,7.75a27.44,27.44,0,0,0,16.26,1.27c6.75-1.38,7.2-5.4,7.2-5.4s.26-3.77-1.44-4.32S95.14,313.59,95.14,313.59Z" style="fill:#455a64"></path><path d="M98.42,299.68a28,28,0,0,1-1,3.48c-1.1,3.13-2.82,6.32-2.33,10.43,1,2,3.27,2.84,5,3.68,2.27,1.12,3.9,1.87,5.47,3.94,2.82,3.71,5.46,8.37,14.39,9.91s15.6-1.45,17.18-4,0-4.91-5.75-7.84c-2.93-1.49-9.51-7.38-10.26-8.15a16.7,16.7,0,0,1-4-8.58,21.2,21.2,0,0,1,.61-6.81c.13-.51.41-1,.21-1.53-.52-1.28-2.5-1-3.59-1a34.7,34.7,0,0,0-4.87.63,2.81,2.81,0,0,0-1.47.55,3,3,0,0,0-.69,1.35c-.23.74-.48,1.48-.76,2.21a2.05,2.05,0,0,1-.93,1.26,1.31,1.31,0,0,1-1.44-.41,2.34,2.34,0,0,1-.49-1.49,14.18,14.18,0,0,1,.13-1.6,2.6,2.6,0,0,0-.23-1.49c-.55-.95-2-1.16-2.37-2.21a1.53,1.53,0,0,1,.52-1.58,2.64,2.64,0,0,1,1.63-.59,13.11,13.11,0,0,1,1.76,0l.36-1.22a7.73,7.73,0,0,0-4.11.34,3.7,3.7,0,0,0-1.94,1.69,5.38,5.38,0,0,0-.28,3.05C99.38,296.1,98.9,297.35,98.42,299.68Z" style="fill:#3F9CAD"></path><path d="M98.42,299.68a28,28,0,0,1-1,3.48c-1.1,3.13-2.82,6.32-2.33,10.43,1,2,3.27,2.84,5,3.68,2.27,1.12,3.9,1.87,5.47,3.94,2.82,3.71,5.46,8.37,14.39,9.91s15.6-1.45,17.18-4,0-4.91-5.75-7.84c-2.93-1.49-9.51-7.38-10.26-8.15a16.7,16.7,0,0,1-4-8.58,21.2,21.2,0,0,1,.61-6.81c.13-.51.41-1,.21-1.53-.52-1.28-2.5-1-3.59-1a34.7,34.7,0,0,0-4.87.63,2.81,2.81,0,0,0-1.47.55,3,3,0,0,0-.69,1.35c-.23.74-.48,1.48-.76,2.21a2.05,2.05,0,0,1-.93,1.26,1.31,1.31,0,0,1-1.44-.41,2.34,2.34,0,0,1-.49-1.49,14.18,14.18,0,0,1,.13-1.6,2.6,2.6,0,0,0-.23-1.49c-.55-.95-2-1.16-2.37-2.21a1.53,1.53,0,0,1,.52-1.58,2.64,2.64,0,0,1,1.63-.59,13.11,13.11,0,0,1,1.76,0l.36-1.22a7.73,7.73,0,0,0-4.11.34,3.7,3.7,0,0,0-1.94,1.69,5.38,5.38,0,0,0-.28,3.05C99.38,296.1,98.9,297.35,98.42,299.68Z" style="opacity:0.35000000000000003"></path><path d="M114.07,329.31a11.66,11.66,0,0,1,6.42-10c6.61-3.59,10.74-1.49,12.83-.06,2.48,1.69,6.06,5.27,4,8-2.22,2.93-5.85,4.39-12.68,4.64S114.07,329.31,114.07,329.31Z" style="fill:#fafafa"></path><path d="M106.16,305.74a.76.76,0,0,0,.65-.21c.92-.92,6.46-4,10.48-2.1.11-.16.32-1.14-.16-1.47a12.74,12.74,0,0,0-11.44,2.54.71.71,0,0,0,0,1A.77.77,0,0,0,106.16,305.74Z" style="fill:#fafafa"></path><path d="M118.83,307.82a2,2,0,0,0-.6-1.56c-4.62-.86-9.42,1.87-10.49,2.94a.71.71,0,0,0,0,1,.79.79,0,0,0,1.08,0C109.75,309.33,115.2,306.47,118.83,307.82Z" style="fill:#fafafa"></path><path d="M125.58,315c0-.48-1-1.24-1.73-1.47-5.13-.57-9.64,3.17-10.55,4.43a.71.71,0,0,0,.21,1,.77.77,0,0,0,.46.13.81.81,0,0,0,.61-.32C115.38,317.7,120.76,313.53,125.58,315Z" style="fill:#fafafa"></path><path d="M110.68,315a.82.82,0,0,0,.63-.29c.8-1,5.47-4.78,10.07-3.39.05-.41-.77-1.24-1.18-1.38-4.59-.61-9.19,2.69-10.12,3.88a.71.71,0,0,0,.15,1A.76.76,0,0,0,110.68,315Z" style="fill:#fafafa"></path><path d="M214.06,215.4c-4.06,0-9.12-1.43-14.74-5.26a3,3,0,0,1,3.43-5c7.56,5.16,13,4.56,15,3.39a4.28,4.28,0,0,0,1.65-3.09c.48-3-.5-7.82-4.68-12.54-8.84-10-19.93-15.11-37.09-17.16a3,3,0,0,1,.72-6c18.52,2.2,31.13,8.11,40.91,19.16,4.74,5.35,7,11.9,6.14,17.52a10,10,0,0,1-4.59,7.36A13.22,13.22,0,0,1,214.06,215.4Z" style="fill:#455a64"></path><path d="M175.68,137.58c4.59-4.33,8.64-17.05,6.55-30.41S167.8,81.32,162.88,78.61s-8.38.79-7,5.78c1.82,6.77,4.09,22-8.56,28.73A44.41,44.41,0,0,0,155.67,131C162.19,138.87,175.68,137.58,175.68,137.58Z" style="fill:#3F9CAD"></path><path d="M175.68,137.58c4.59-4.33,8.64-17.05,6.55-30.41S167.8,81.32,162.88,78.61s-8.38.79-7,5.78c1.82,6.77,4.09,22-8.56,28.73A44.41,44.41,0,0,0,155.67,131C162.19,138.87,175.68,137.58,175.68,137.58Z" style="fill:#fff;opacity:0.75"></path><path d="M158.52,87a10.91,10.91,0,0,1-3.24-.48.62.62,0,0,1-.4-.77.61.61,0,0,1,.77-.39c4,1.27,9.35-.21,10.7-4.37a.6.6,0,1,1,1.15.37C166.29,85.11,162.34,87,158.52,87Z" style="fill:#3F9CAD"></path><path d="M163.07,95.41a13.21,13.21,0,0,1-6.68-1.86.61.61,0,0,1,.6-1.06,11.76,11.76,0,0,0,9,1.35c5.52-1.33,6.7-4.56,6.95-5.89a.61.61,0,1,1,1.19.22c-.3,1.56-1.65,5.35-7.86,6.85A14,14,0,0,1,163.07,95.41Z" style="fill:#3F9CAD"></path><path d="M169.35,105.93h0a18.41,18.41,0,0,1-13.54-5.7.61.61,0,0,1,0-.86.6.6,0,0,1,.86,0,17.14,17.14,0,0,0,12.66,5.31h0c7.8,0,10.11-3.66,11.1-5.22a.6.6,0,0,1,.84-.19.61.61,0,0,1,.19.84C180.47,101.72,177.81,105.93,169.35,105.93Z" style="fill:#3F9CAD"></path><path d="M172.53,118.13a22.31,22.31,0,0,1-7.08-1.15c-5.74-1.94-9.89-5.27-12.32-9.89a.61.61,0,0,1,1.07-.57c2.32,4.41,6.12,7.45,11.64,9.31,7.6,2.56,14.86,0,16.89-1.86a.61.61,0,0,1,.82.89C182,116.33,177.74,118.13,172.53,118.13Z" style="fill:#3F9CAD"></path><path d="M157.19,126.73c10.89-12.43,6.68-32,4-37.64-3.77-7.9-2.17-11.37,1.13-10.75-4.61-2.14-7.76,1.26-6.48,6,1.82,6.77,4.09,22-8.56,28.73a45.33,45.33,0,0,0,7.18,16.3A23.74,23.74,0,0,0,157.19,126.73Z" style="opacity:0.1"></path><path d="M185.68,211.35c-3.7-9-5.54-33.91-4.78-50.27,2.48-.52,5.51-3.9,4.29-8.27-1.1-3.93-2.17-4.45-5.49-8.69-2.36-3-4-7-6.12-10.28-7.28-11.14-16.53-18.57-30.15-21.78a4.21,4.21,0,0,1-3.07-5.26c.87-3,1.61-6.92.7-9.8-1.69-5.32-5.05-5.86-7.27-4.87s-2.39,3.19-1.72,6.76-.38,4.2-1.57,3.82-2.08-6.88-10.39-9.93-13.92,1-13.78,4.38c.15,3.75,2.87,4,8.64,4.66a11.46,11.46,0,0,1,6.71,3,4.23,4.23,0,0,1-2.19,7.06C98.36,116.57,82,134.18,77.31,157.94a103.43,103.43,0,0,0-1.48,12.91h0a11.16,11.16,0,0,0-6.66-5.1c-4.08-1-5.7.95-5.64,2.77s2.32,2.69,4.61,3.64c3.67,1.52,4.27,2.93,4.27,2.93a11.43,11.43,0,0,0-5.68.57c-2.51,1.11-3.17,3.82-.74,4.86,1.35.57,3.42-.46,5.55-1,1.34-.31,3.82-.81,4,.8h0c0,3.77,0,7.7.09,11.75.31,11.41,2.31,19.22.49,29.57-1.39,7.84-8.25,14-1.36,20.51a10.66,10.66,0,0,0,9.5,2.63,4.33,4.33,0,0,1,5,3.32c.77,3.25,3.12,7.21,9.76,9,6.12,1.62,10-.24,12.43-2.51a4.13,4.13,0,0,1,6,.16c2.55,3.05,7.28,6.32,15.83,6.28s12.85-3.75,15-6.91a4.24,4.24,0,0,1,5.65-1.39c3.24,1.92,8.46,3.46,15,0,4.83-2.58,6.08-7.21,6.2-11a4.17,4.17,0,0,1,4.74-4,9.64,9.64,0,0,0,10.09-4.28C194.53,226.49,189,219.46,185.68,211.35Z" style="fill:#3F9CAD"></path><g style="opacity:0.1"><path d="M68.14,172.16c3.67,1.52,4.27,2.93,4.27,2.93a11.43,11.43,0,0,0-5.68.57c-2.51,1.11-3.17,3.82-.74,4.86,1.35.57,3.42-.46,5.55-1,1.34-.31,3.82-.81,4,.8h0c0,3.77,0,7.7.09,11.75.31,11.41,2.31,19.22.49,29.57-1.39,7.84-8.25,14-1.36,20.51a10.07,10.07,0,0,0,5.09,2.62c-.21-.11-3.43-5.29.37-12.76,5.34-10.51,5-17.08,3.61-38.37-1.71-26,1.48-37.17,10.93-55.57,9.69-18.86,25.09-19.77,31.63-24.77,3.56-2.72,2.34-7.65-.77-10.78-2.61-2.63-6.69-3.7-9.1-3.95-5.26-.54-10.15-1.46-9.16-4.09a3.93,3.93,0,0,0-1,2.63c.15,3.75,2.87,4,8.64,4.66a11.46,11.46,0,0,1,6.71,3,4.23,4.23,0,0,1-2.19,7.06C98.36,116.57,82,134.18,77.31,157.94a103.43,103.43,0,0,0-1.48,12.91h0a11.16,11.16,0,0,0-6.66-5.1c-4.08-1-5.7.95-5.64,2.77S65.85,171.21,68.14,172.16Z"></path><path d="M94.72,248.25c-2.68-3.54-4.85-4.12-8.58-3.33h0a4.32,4.32,0,0,1,3.1,3.22c.77,3.25,3.12,7.21,9.76,9,4.32,1.15,7.55.55,9.91-.7C99.3,258.5,97.41,251.78,94.72,248.25Z"></path><path d="M140.8,259.81c-4.73.62-9.16-.45-14.14-4.1-5.37-3.93-8-3.56-11.32-2.23h0a3.82,3.82,0,0,1,2.1,1.28c2.55,3.05,7.28,6.32,15.83,6.28A22.48,22.48,0,0,0,140.8,259.81Z"></path><path d="M134.27,97.34c-.18-3.16,1.83-5.54,4.31-4.5a4.45,4.45,0,0,0-4.79-.71c-2.23,1-2.39,3.19-1.72,6.76s-.38,4.2-1.57,3.82a1.26,1.26,0,0,1-.54-.56h0c.92,2,1.81,4,3.89,2.92S134.45,100.49,134.27,97.34Z"></path></g><path d="M114.15,169.43a6.49,6.49,0,0,0,6.5,4.82c5.35-.07,5.94-2.5,8.13-5.82s6.9-4.06,11-4.13a6.65,6.65,0,0,0,5.72-9.4,5.76,5.76,0,0,1-2.72,5.49c-3.28,2.14-7.64.21-11.93,2.26s-4.66,6.68-7.81,8.15A8.64,8.64,0,0,1,114.15,169.43Z" style="opacity:0.2"></path><path d="M139.21,166.66a8,8,0,0,1-14.87,3.23c2.12-2,2.92-5.4,6.5-7.24,2.83-1.44,5-.78,7.35-.85A8.06,8.06,0,0,1,139.21,166.66Z" style="fill:#455a64"></path><path d="M119.75,172a8,8,0,0,1-7.86-4.82.61.61,0,0,1,.31-.8.6.6,0,0,1,.8.31c.92,2.08,3,4.47,7.81,4.05,2.69-.23,3.73-1.84,5-3.88a12.22,12.22,0,0,1,4.71-4.79,10.46,10.46,0,0,1,5.88-1,8.72,8.72,0,0,0,6.26-1.45,4.75,4.75,0,0,0,2.17-4,7,7,0,0,0-1.94-5,.61.61,0,0,1-.13-.85.59.59,0,0,1,.84-.13c1.21.88,2.48,3.49,2.44,6a6,6,0,0,1-2.7,5,9.91,9.91,0,0,1-7,1.66,9.25,9.25,0,0,0-5.27.83,11,11,0,0,0-4.24,4.36c-1.32,2-2.69,4.15-6,4.43C120.51,172,120.12,172,119.75,172Z" style="fill:#455a64"></path><path d="M137.12,165.79a2.21,2.21,0,1,1-2.18-2.23A2.2,2.2,0,0,1,137.12,165.79Z" style="fill:#f5f5f5"></path><path d="M180.89,161.35l-.53-.27a5.6,5.6,0,0,1-3-1.12c-1.07-1-2.27-4.23-5.69-5.06s-5.34.83-9.14,1-5.07-2.46-5.83-4.66c-.41,3.73.65,6.23,3.35,7.33,3,1.22,8.44-1.34,10.76,0s3.66,4.11,6.55,4.43a5.16,5.16,0,0,0,3.45-.69C180.86,162,180.88,161.67,180.89,161.35Z" style="opacity:0.2"></path><path d="M177.4,160a7.69,7.69,0,0,1-15.1-2.74,7.47,7.47,0,0,1,.27-1.33c2.82-.07,5.39-2,9.14-1C175,155.81,175.23,158.42,177.4,160Z" style="fill:#455a64"></path><path d="M180.81,161.69a7.77,7.77,0,0,1-2.45-.52,7.44,7.44,0,0,1-3.38-3,5.86,5.86,0,0,0-3.44-2.73,10,10,0,0,0-5.69.38c-2.09.59-4.25,1.2-6.82-.35a6.1,6.1,0,0,1-2.71-7,.6.6,0,0,1,.77-.37.61.61,0,0,1,.37.78,4.94,4.94,0,0,0,2.19,5.55c2.13,1.28,3.86.79,5.87.23a11,11,0,0,1,6.35-.39A7,7,0,0,1,176,157.5a6.35,6.35,0,0,0,2.85,2.54,6.66,6.66,0,0,0,2.07.43.63.63,0,0,1,.63.58.6.6,0,0,1-.58.63Z" style="fill:#455a64"></path><path d="M174.07,159.55a2.06,2.06,0,1,1-2-2.08A2,2,0,0,1,174.07,159.55Z" style="fill:#f5f5f5"></path><path d="M149.81,176.64c-10.39,4.65-19.52,13.84-23.74,24-2.6,6.25-1.18,11.44,2.3,12.62,6.88,2.32,14.59-8.4,22.26-12.14s13.91-.12,17.8-2.63c4.58-2.95,3.91-10.48,1.45-15.85C167.14,176.62,160.21,172,149.81,176.64Z" style="fill:#455a64"></path><path d="M168.17,198.61c-3.81-13.25-16.25-17.38-28.87-15.38a46.21,46.21,0,0,0-13.23,17.39c-2.6,6.25-1.18,11.44,2.3,12.62,6.88,2.32,14.59-8.4,22.26-12.14C158.05,197.48,164.26,200.81,168.17,198.61Z" style="fill:#f28f8f"></path><path d="M160,199.3c-12.77-3.43-21,7.54-25.05,7.44s-6-3.63-.39-12.58,17.61-11.4,22.85-8.78c-5.23-2.58-11.62-3.17-18.07-2.15a46.21,46.21,0,0,0-13.23,17.39c-2.6,6.24-1.18,11.44,2.3,12.62,6.88,2.32,14.59-8.4,22.26-12.14A19.44,19.44,0,0,1,160,199.3Z" style="opacity:0.1"></path><path d="M164.86,186.62c-2.46,1.07-2.43,4.34-4.46,11.29-.14.49-.28,1-.42,1.4,3.42.08,6.31.54,8.45-.84a6.54,6.54,0,0,0,1.17-1C170.1,192.22,167.46,185.49,164.86,186.62Z" style="fill:#f5f5f5"></path><path d="M169.6,197.49a14.71,14.71,0,0,0,.05-1.88,5.05,5.05,0,0,1-2.86,1.9,12.37,12.37,0,0,1-3.95,0s.64-4.06,1.28-7.55c.42-2.34,1.82-3.36,2.94-2.55-.69-.77-1.44-1.12-2.2-.79-2.46,1.07-2.43,4.34-4.46,11.29-.14.49-.28,1-.42,1.4,3.42.08,6.31.54,8.45-.84A6.54,6.54,0,0,0,169.6,197.49Z" style="fill:#e0e0e0"></path><path d="M138.47,195.25c-2.47,1.07-2.43,4.34-4.46,11.29-.89,3-1.65,5.28-2.24,6.88,3.67-.7,7.52-4,11.43-7.17h0C143.75,201,141.09,194.11,138.47,195.25Z" style="fill:#f5f5f5"></path><path d="M143.2,206.24a15.11,15.11,0,0,0,0-2.61c-3.89,2.52-6.23,5.22-6.85,4.88s-.08-3.07.18-6.07c.32-3.63.77-7.39,3.19-7.13a1.51,1.51,0,0,0-1.28-.06c-2.47,1.07-2.43,4.34-4.46,11.29-.89,3-1.65,5.28-2.24,6.88,3.67-.7,7.52-4,11.43-7.17Z" style="fill:#e0e0e0"></path><path d="M53.76,240.39a3.28,3.28,0,0,1-1-.16,3,3,0,0,1-1.91-3.84C59,212.3,70.83,202.12,87.37,193.5a3,3,0,0,1,2.8,5.38C74.58,207,64.1,216.06,56.64,238.32A3.05,3.05,0,0,1,53.76,240.39Z" style="fill:#455a64"></path><path d="M51.62,234.22c-1.27,3.3-3.21,4.63-5.06,6.58s-3.85,3.13-5.78,6.17-2.84,8.2-2.26,10.61c.32,1.36,2.21,1.37,2.32.18.41-4.44,1.15-8.26,4.26-10.63a26.11,26.11,0,0,0-2.39,8.18c-.28,3.9.24,8.56,1.85,8.79s1.56-1.42,1.33-3.77-.44-8.55,2.69-13c0,0-1.12,6.54,0,10.72s3.28,7.16,4.48,6.65,1.14-1.31-.16-4.52c-1-2.49-1-5.65-.7-8.33a9.83,9.83,0,0,1,2.72-6.54,5.46,5.46,0,0,1,2.31-1.48,3.4,3.4,0,0,1,2.76.9,7.74,7.74,0,0,1,2.43,4.76c.28,2.1,3.75,2.29,2.46-3.61s-8.56-6.94-6.74-11.76Z" style="fill:#455a64"></path><path d="M202.67,212.13l2.77-5.36c-4.3-2.24.62-8.83-1.87-14.34s-5.15-3.29-4.13-1.44a6.84,6.84,0,0,1,.89,5.27c-.42,1.47-1.37,2.33-2.38,1.46s-1.66-3.73-5.37-6.88a13.11,13.11,0,0,0-8-3.42c-2.9,0-1.88,2-.49,2.57,6,2.4,6.74,3.74,8.24,5.7s1.31,3.08.53,2.85-2-1.93-5.62-3.61-7.71-1.67-8.34-.9-.56,1.76,1.18,2.17a33.14,33.14,0,0,1,7.41,2.49c2.55,1.47,3.71,3.37,3.29,3.92s-2.6-1-5.92-1.6-5-.61-6.4-.07c-1,.39-.65,2.44,2.39,2.59a20,20,0,0,1,8.72,2.83,29.17,29.17,0,0,0,5.06,2.94A76.71,76.71,0,0,0,202.67,212.13Z" style="fill:#455a64"></path><path d="M103.38,131.17c3.51,1.84,9.14,11.42,2.24,21.61a20.32,20.32,0,0,1-21.15,9.05c-2.8-1.36-17.46-7.72-18.18-28S78,105.83,81.16,104s9.34-2.33,8.57,4.61-1.5,13.1,3.54,17.56C97.23,129.7,103.38,131.17,103.38,131.17Z" style="fill:#3F9CAD"></path><path d="M103.38,131.17c3.51,1.84,9.14,11.42,2.24,21.61a20.32,20.32,0,0,1-21.15,9.05c-2.8-1.36-17.46-7.72-18.18-28S78,105.83,81.16,104s9.34-2.33,8.57,4.61-1.5,13.1,3.54,17.56C97.23,129.7,103.38,131.17,103.38,131.17Z" style="fill:#fff;opacity:0.75"></path><path d="M77.13,157.52a14.61,14.61,0,0,1-1.47-.07.61.61,0,0,1-.54-.67.61.61,0,0,1,.67-.54c3,.33,12.34-.35,18.77-7.36,6.57-7.17,6.84-14.16,5.9-18.76a.6.6,0,0,1,.47-.71.61.61,0,0,1,.72.47c1,4.87.72,12.27-6.2,19.82C89.52,156.17,81.24,157.52,77.13,157.52Z" style="fill:#3F9CAD"></path><path d="M73.41,144.14a32.94,32.94,0,0,1-6.62-.64.6.6,0,1,1,.26-1.18c.46.1,11.34,2.46,19.13-2.77,7.06-4.73,7.68-10.44,7.94-12.88a.61.61,0,0,1,.67-.54.59.59,0,0,1,.53.67c-.25,2.38-.93,8.71-8.46,13.76C82.57,143.44,77.42,144.14,73.41,144.14Z" style="fill:#3F9CAD"></path><path d="M76.31,128a18.69,18.69,0,0,1-10.38-2.79.6.6,0,1,1,.66-1c2,1.32,6.48,3.37,13.71,2.27,5.71-.87,8.19-2.71,10-4.56a.6.6,0,1,1,.86.85c-2,2-4.62,4-10.68,4.91A27.64,27.64,0,0,1,76.31,128Z" style="fill:#3F9CAD"></path><path d="M82.68,116.3a14.43,14.43,0,0,1-3.66-.49,10.3,10.3,0,0,1-6.93-5.31.61.61,0,0,1,.27-.82.6.6,0,0,1,.81.27,9,9,0,0,0,6.15,4.69,12.08,12.08,0,0,0,10-1.6.59.59,0,0,1,.84.17.6.6,0,0,1-.17.84A13.14,13.14,0,0,1,82.68,116.3Z" style="fill:#3F9CAD"></path><path d="M92.38,154.6c-4.42-.41-10-1.66-14.75-9s-6.28-22.65-1.91-31.87c2.88-6.07,8.63-11.63,12.78-9.77-1.85-1.73-5.27-1.11-7.34.08-3.12,1.8-15.59,9.55-14.87,29.82s15.38,26.62,18.18,28a20.32,20.32,0,0,0,21.15-9.05c4.62-6.82,3.62-13.37,1.41-17.51h0C110.49,146.14,99,155.2,92.38,154.6Z" style="opacity:0.1"></path><path d="M101.46,152.5s-5.22,5.75-5.26,11.27a5.26,5.26,0,1,0,10.51,0C106.67,158.25,101.46,152.5,101.46,152.5Z" style="fill:#fafafa"></path></g></g><g id="freepik--speech-bubble--inject-15"><g id="freepik--speech-bubble--inject-15"><g id="freepik--speech-bubble--inject-15"><path d="M280,60.69,215.54,97.88a2.67,2.67,0,0,0-1.22,2.1v40.54a2.66,2.66,0,0,0,1.22,2.09l4.35,2.43a2.7,2.7,0,0,0,2.43,0l64.49-37.18a2.69,2.69,0,0,0,1.21-2.1V65.21a2.66,2.66,0,0,0-1.22-2.09l-4.35-2.44A2.73,2.73,0,0,0,280,60.69Z" style="fill:#3F9CAD"></path><path d="M221.11,144.33V103.79a2.69,2.69,0,0,1,1.21-2.1l64.49-37.18c.67-.39,1.21-.07,1.21.7v40.54a2.69,2.69,0,0,1-1.21,2.1L222.32,145C221.65,145.42,221.11,145.1,221.11,144.33Z" style="fill:#3F9CAD"></path><path d="M222.32,145a2.67,2.67,0,0,1-2.43,0l-4.35-2.45a2.63,2.63,0,0,1-1.22-2.08V100a2.44,2.44,0,0,1,.39-1.24l6.76,3.86a2.35,2.35,0,0,0-.36,1.19v40.54C221.11,145,221.61,145.45,222.32,145Z" style="opacity:0.2"></path><path d="M288,65c-.09-.61-.59-.83-1.2-.48l-64.47,37.18a2.52,2.52,0,0,0-.86.91l-6.77-3.86a2.39,2.39,0,0,1,.84-.86L280,60.69a2.73,2.73,0,0,1,2.43,0l4.35,2.44A2.67,2.67,0,0,1,288,65Z" style="fill:#fff;opacity:0.4"></path><path d="M214.32,114.38l-9.76,9.93a1.08,1.08,0,0,0,.18,1.66c.2.14,6.76,3.89,6.76,3.89l9.61-11.57Z" style="fill:#3F9CAD"></path><path d="M214.32,114.38l-9.76,9.93a1.08,1.08,0,0,0,.18,1.66c.2.14,6.76,3.89,6.76,3.89l9.61-11.57Z" style="opacity:0.1"></path><path d="M221.11,118.29l-9.76,9.93a1.08,1.08,0,0,0,.92,1.82l8.84-1.28C222.06,128.76,222.06,118.29,221.11,118.29Z" style="fill:#3F9CAD"></path></g><path d="M229,115a17.58,17.58,0,0,1,.47-3.42,15.17,15.17,0,0,1,1.18-3.23,13.63,13.63,0,0,1,1.86-2.8,9.37,9.37,0,0,1,2.52-2.09,5,5,0,0,1,2.51-.81,2.74,2.74,0,0,1,1.86.65,4.1,4.1,0,0,1,1.18,1.87,9.73,9.73,0,0,1,.47,2.87c0,.83,0,1.72,0,2.65s0,1.81,0,2.64a16.08,16.08,0,0,1-.47,3.41,15.54,15.54,0,0,1-1.18,3.25,12.87,12.87,0,0,1-1.86,2.8,9.94,9.94,0,0,1-2.51,2.08,5.26,5.26,0,0,1-2.52.83,2.74,2.74,0,0,1-1.86-.65,4.27,4.27,0,0,1-1.18-1.9,10.36,10.36,0,0,1-.47-2.86c0-.8,0-1.66,0-2.6S229,115.88,229,115Zm8.48.24c0-.36,0-.76,0-1.21s0-.89,0-1.35,0-.89,0-1.31,0-.79,0-1.12a4.88,4.88,0,0,0-.2-1.25,1.85,1.85,0,0,0-.47-.82,1.08,1.08,0,0,0-.74-.3,2,2,0,0,0-1,.33,4.43,4.43,0,0,0-1,.87,5.58,5.58,0,0,0-.74,1.16,6.8,6.8,0,0,0-.46,1.36,8.94,8.94,0,0,0-.21,1.48c0,.35,0,.74,0,1.17s0,.88,0,1.33,0,.9,0,1.34,0,.82,0,1.16a3.37,3.37,0,0,0,.67,2.08c.39.43,1,.41,1.79-.05a4.14,4.14,0,0,0,1.77-2A8.11,8.11,0,0,0,237.49,115.26Z" style="fill:#455a64"></path><path d="M253.18,105.26c0,.29,0,.67,0,1.13s0,.85,0,1.16a13,13,0,0,1-.43,2.92,14.3,14.3,0,0,1-1.06,2.8,11.86,11.86,0,0,1-1.63,2.41,8.31,8.31,0,0,1-2.14,1.77,4.55,4.55,0,0,1-2.13.7,2.51,2.51,0,0,1-1.64-.53,3.66,3.66,0,0,1-1.06-1.57,7.35,7.35,0,0,1-.42-2.44c0-.29,0-.66,0-1.13s0-.85,0-1.16a12.42,12.42,0,0,1,.4-2.91,13.75,13.75,0,0,1,1.08-2.8,12,12,0,0,1,1.64-2.44,8.31,8.31,0,0,1,2.13-1.78,4.42,4.42,0,0,1,2.14-.68,2.59,2.59,0,0,1,1.64.54,3.47,3.47,0,0,1,1.06,1.57A7.9,7.9,0,0,1,253.18,105.26Zm-7,6.2a1.9,1.9,0,0,0,.54,1.46c.31.25.73.22,1.24-.08a3.25,3.25,0,0,0,1.25-1.36,5.1,5.1,0,0,0,.53-2.07c0-.32,0-.66,0-1s0-.7,0-1a2,2,0,0,0-.53-1.46,1.08,1.08,0,0,0-1.25.08,3.23,3.23,0,0,0-1.24,1.36,5,5,0,0,0-.54,2.08c0,.31,0,.65,0,1S246.12,111.18,246.14,111.46Z" style="fill:#455a64"></path><path d="M261.06,109.87a3.35,3.35,0,0,1-1,.39,1.73,1.73,0,0,1-.73,0,1.35,1.35,0,0,1-.52-.27,2.38,2.38,0,0,1-.35-.38v6.33a1.46,1.46,0,0,1-.16.66,1.05,1.05,0,0,1-.36.45l-2.44,1.4a.28.28,0,0,1-.36,0,.62.62,0,0,1-.16-.48V98.41a1.39,1.39,0,0,1,.16-.65.94.94,0,0,1,.36-.45L257.85,96a.27.27,0,0,1,.37,0,.66.66,0,0,1,.15.48v.68l.38-.84a4.76,4.76,0,0,1,.5-.87,6.84,6.84,0,0,1,.73-.84,5.46,5.46,0,0,1,1.08-.78,3.66,3.66,0,0,1,1.64-.55,1.81,1.81,0,0,1,1.35.47,3.57,3.57,0,0,1,.94,1.58,9.63,9.63,0,0,1,.39,2.81c0,.29,0,.69,0,1.19s0,.91,0,1.22a14.93,14.93,0,0,1-.39,3.26,12.87,12.87,0,0,1-.94,2.67,8.71,8.71,0,0,1-1.35,2A6.87,6.87,0,0,1,261.06,109.87Zm.87-7.7a11.63,11.63,0,0,0,0-1.67,2.94,2.94,0,0,0-.45-1.55q-.39-.56-1.29,0a2.48,2.48,0,0,0-.74.63,4.26,4.26,0,0,0-.51.85,6.12,6.12,0,0,0-.32.94,6.45,6.45,0,0,0-.15,1c0,.31,0,.67,0,1.06a10,10,0,0,0,0,1,3.72,3.72,0,0,0,.15.78,1.73,1.73,0,0,0,.32.57.78.78,0,0,0,.51.25,1.31,1.31,0,0,0,.74-.21,3,3,0,0,0,1.29-1.52A6.74,6.74,0,0,0,261.93,102.17Z" style="fill:#455a64"></path><path d="M272.92,98.08q0-.33-.15-.42a.65.65,0,0,0-.49,0,7.49,7.49,0,0,0-.92.29c-.38.14-.85.29-1.42.46a2.13,2.13,0,0,1-2.26-.36,3.92,3.92,0,0,1-.79-2.81,6.93,6.93,0,0,1,.33-2.07,9.28,9.28,0,0,1,.92-2,9.59,9.59,0,0,1,1.42-1.85,8.6,8.6,0,0,1,1.85-1.44,5.21,5.21,0,0,1,1.85-.7,3,3,0,0,1,1.47.11,1.86,1.86,0,0,1,1,.77,2.47,2.47,0,0,1,.39,1.27,1.2,1.2,0,0,1-.14.65,1.07,1.07,0,0,1-.38.46l-2.3,1.32c-.14.09-.25.1-.33.05l-.3-.15a.91.91,0,0,0-.46-.07,1.89,1.89,0,0,0-.78.31,2.5,2.5,0,0,0-.74.62,1.23,1.23,0,0,0-.3.81.8.8,0,0,0,.09.45q.1.12.39.06a6,6,0,0,0,.81-.25l1.37-.46c1.17-.38,2-.26,2.56.35a4,4,0,0,1,.8,2.7,7.31,7.31,0,0,1-.32,2.08,9.49,9.49,0,0,1-1,2.11,10.45,10.45,0,0,1-1.55,2,10.14,10.14,0,0,1-2.06,1.58,5.67,5.67,0,0,1-2,.77,2.77,2.77,0,0,1-1.48-.17,2.08,2.08,0,0,1-.92-.84,2.75,2.75,0,0,1-.35-1.25,1.2,1.2,0,0,1,.14-.65,1.13,1.13,0,0,1,.38-.46l2.39-1.38c.15-.08.25-.09.31,0a1.84,1.84,0,0,0,.25.21.83.83,0,0,0,.45.1,2.13,2.13,0,0,0,.87-.34,4,4,0,0,0,1-.82A1.46,1.46,0,0,0,272.92,98.08Z" style="fill:#455a64"></path><path d="M281.63,90.5a1.45,1.45,0,0,1-.16.65.94.94,0,0,1-.36.45L278.67,93a.26.26,0,0,1-.36,0,.62.62,0,0,1-.16-.48V79.69a1.46,1.46,0,0,1,.16-.66.94.94,0,0,1,.36-.45l2.44-1.4a.26.26,0,0,1,.36,0,.62.62,0,0,1,.16.48Zm0,6.39a1.39,1.39,0,0,1-.16.65.94.94,0,0,1-.36.45l-2.44,1.41a.27.27,0,0,1-.36,0,.59.59,0,0,1-.16-.47v-3a1.45,1.45,0,0,1,.16-.65.94.94,0,0,1,.36-.45l2.44-1.41a.27.27,0,0,1,.36,0,.62.62,0,0,1,.16.48Z" style="fill:#455a64"></path></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><g id="freepik--background-complete--inject-5"><rect x="417.41" y="60.85" width="26.48" height="11.19" transform="translate(861.29 132.88) rotate(-180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><rect x="432.18" y="46.74" width="26.48" height="11.19" transform="translate(890.84 104.66) rotate(180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><rect x="250" y="170.97" width="26.48" height="11.19" transform="translate(526.48 353.13) rotate(180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><rect x="264.77" y="156.86" width="26.48" height="11.19" transform="translate(556.02 324.91) rotate(180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><rect x="279.49" y="170.97" width="26.48" height="11.19" transform="translate(585.45 353.13) rotate(180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><rect x="41.34" y="46.74" width="26.48" height="11.19" transform="translate(109.16 104.66) rotate(180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><rect x="56.11" y="309.85" width="26.48" height="11.19" transform="translate(138.71 630.89) rotate(180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><rect x="41.34" y="295.74" width="26.48" height="11.19" transform="translate(109.16 602.67) rotate(180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><rect x="417.41" y="309.85" width="26.48" height="11.19" transform="translate(861.29 630.89) rotate(-180)" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10;stroke-width:0.75px"></rect><polyline points="208.82 421.54 208.82 295.88 235.55 259.39 235.55 191.06" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></polyline><path d="M233.18,188.73a2.38,2.38,0,1,0,2.37-2.38A2.37,2.37,0,0,0,233.18,188.73Z" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></path><polyline points="215.71 421.54 215.71 300.29 242.44 263.8 242.44 216.06" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></polyline><path d="M240.06,213.72a2.38,2.38,0,1,0,2.38-2.37A2.38,2.38,0,0,0,240.06,213.72Z" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></path><line x1="202.19" y1="421.54" x2="202.19" y2="255.13" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></line><path d="M199.81,252.75a2.38,2.38,0,1,0,2.38-2.37A2.38,2.38,0,0,0,199.81,252.75Z" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></path><polyline points="195.8 421.54 195.8 336.96 177.66 302.74 177.66 241.37" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></polyline><path d="M175.28,239a2.38,2.38,0,1,0,2.38-2.38A2.37,2.37,0,0,0,175.28,239Z" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></path><polyline points="189.45 421.54 189.45 340.62 168.06 302.78 168.06 262.37" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></polyline><path d="M165.68,260a2.38,2.38,0,1,0,2.38-2.37A2.39,2.39,0,0,0,165.68,260Z" style="fill:none;stroke:#ebebeb;stroke-miterlimit:10"></path><line x1="110.72" y1="37.56" x2="110.72" style="fill:none;stroke:#c7c7c7;stroke-miterlimit:10"></line><polygon points="133.93 59.92 132.06 64.03 89.38 64.03 87.52 59.92 105.69 47.35 115.76 47.35 133.93 59.92" style="fill:#ebebeb"></polygon><polygon points="117.02 35.23 115.76 47.35 105.69 47.35 104.43 35.23 117.02 35.23" style="fill:#dbdbdb"></polygon><polygon points="133.93 59.93 132.06 64.03 89.38 64.03 87.52 59.93 133.93 59.93" style="fill:#dbdbdb"></polygon><line x1="203.58" y1="37.56" x2="203.58" style="fill:none;stroke:#c7c7c7;stroke-miterlimit:10"></line><polygon points="226.78 59.92 224.91 64.03 182.23 64.03 180.37 59.92 198.54 47.35 208.61 47.35 226.78 59.92" style="fill:#ebebeb"></polygon><polygon points="209.87 35.23 208.61 47.35 198.54 47.35 197.28 35.23 209.87 35.23" style="fill:#dbdbdb"></polygon><polygon points="226.78 59.93 224.91 64.03 182.23 64.03 180.37 59.93 226.78 59.93" style="fill:#dbdbdb"></polygon><line x1="296.43" y1="37.56" x2="296.43" style="fill:none;stroke:#c7c7c7;stroke-miterlimit:10"></line><polygon points="319.63 59.92 317.77 64.03 275.08 64.03 273.22 59.92 291.39 47.35 301.46 47.35 319.63 59.92" style="fill:#ebebeb"></polygon><polygon points="302.72 35.23 301.46 47.35 291.39 47.35 290.13 35.23 302.72 35.23" style="fill:#dbdbdb"></polygon><polygon points="319.63 59.93 317.76 64.03 275.08 64.03 273.22 59.93 319.63 59.93" style="fill:#dbdbdb"></polygon><line x1="389.28" y1="37.56" x2="389.28" style="fill:none;stroke:#c7c7c7;stroke-miterlimit:10"></line><polygon points="412.49 59.92 410.62 64.03 367.93 64.03 366.07 59.92 384.25 47.35 394.31 47.35 412.49 59.92" style="fill:#ebebeb"></polygon><polygon points="395.57 35.23 394.31 47.35 384.25 47.35 382.98 35.23 395.57 35.23" style="fill:#dbdbdb"></polygon><polygon points="412.48 59.93 410.62 64.03 367.93 64.03 366.07 59.93 412.48 59.93" style="fill:#dbdbdb"></polygon></g><g id="freepik--Shadow--inject-5"><ellipse cx="183.79" cy="443.41" rx="106.41" ry="16.99" style="fill:#ebebeb"></ellipse></g><g id="freepik--Server--inject-5"><rect x="267.37" y="176.42" width="65.02" height="245.17" style="fill:#37474f"></rect><rect x="332.39" y="176.42" width="119.66" height="245.17" style="fill:#455a64"></rect><rect x="341.37" y="389.79" width="103.21" height="23.84" style="fill:#37474f"></rect><rect x="345.71" y="393.73" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="397.22" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="400.71" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="404.19" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="407.68" width="58.75" height="2.01" style="fill:#455a64"></rect><path d="M415.17,395.73a2,2,0,1,1-2-2A2,2,0,0,1,415.17,395.73Z" style="fill:#3F9CAD"></path><path d="M421.75,395.73a2,2,0,1,1-2-2A2,2,0,0,1,421.75,395.73Z" style="fill:#3F9CAD"></path><path d="M428.33,395.73a2,2,0,1,1-2-2A2,2,0,0,1,428.33,395.73Z" style="fill:#3F9CAD"></path><path d="M434.9,395.73a2,2,0,1,1-2-2A2,2,0,0,1,434.9,395.73Z" style="fill:#3F9CAD"></path><path d="M441.48,395.73a2,2,0,1,1-2-2A2,2,0,0,1,441.48,395.73Z" style="fill:#3F9CAD"></path><path d="M415.17,401.71a2,2,0,1,1-2-2A2,2,0,0,1,415.17,401.71Z" style="fill:#3F9CAD"></path><path d="M421.75,401.71a2,2,0,1,1-2-2A2,2,0,0,1,421.75,401.71Z" style="fill:#3F9CAD"></path><path d="M428.33,401.71a2,2,0,1,1-2-2A2,2,0,0,1,428.33,401.71Z" style="fill:#3F9CAD"></path><path d="M434.9,401.71a2,2,0,1,1-2-2A2,2,0,0,1,434.9,401.71Z" style="fill:#3F9CAD"></path><path d="M441.48,401.71a2,2,0,1,1-2-2A2,2,0,0,1,441.48,401.71Z" style="fill:#3F9CAD"></path><circle cx="413.18" cy="407.7" r="2" style="fill:#3F9CAD"></circle><path d="M421.75,407.7a2,2,0,1,1-2-2A2,2,0,0,1,421.75,407.7Z" style="fill:#3F9CAD"></path><circle cx="426.33" cy="407.7" r="2" style="fill:#3F9CAD"></circle><path d="M434.9,407.7a2,2,0,1,1-2-2A2,2,0,0,1,434.9,407.7Z" style="fill:#3F9CAD"></path><path d="M441.48,407.7a2,2,0,1,1-2-2A2,2,0,0,1,441.48,407.7Z" style="fill:#3F9CAD"></path><rect x="407.4" y="393.73" width="1.15" height="15.96" style="fill:#263238"></rect><rect x="341.37" y="361.07" width="103.21" height="23.84" style="fill:#37474f"></rect><rect x="345.71" y="365" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="368.49" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="371.98" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="375.47" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="378.95" width="58.75" height="2.01" style="fill:#455a64"></rect><path d="M415.17,367a2,2,0,1,1-2-2A2,2,0,0,1,415.17,367Z" style="fill:#3F9CAD"></path><path d="M421.75,367a2,2,0,1,1-2-2A2,2,0,0,1,421.75,367Z" style="fill:#3F9CAD"></path><path d="M428.33,367a2,2,0,1,1-2-2A2,2,0,0,1,428.33,367Z" style="fill:#3F9CAD"></path><path d="M434.9,367a2,2,0,1,1-2-2A2,2,0,0,1,434.9,367Z" style="fill:#3F9CAD"></path><path d="M441.48,367a2,2,0,1,1-2-2A2,2,0,0,1,441.48,367Z" style="fill:#3F9CAD"></path><path d="M415.17,373a2,2,0,1,1-2-2A2,2,0,0,1,415.17,373Z" style="fill:#3F9CAD"></path><path d="M421.75,373a2,2,0,1,1-2-2A2,2,0,0,1,421.75,373Z" style="fill:#3F9CAD"></path><path d="M428.33,373a2,2,0,1,1-2-2A2,2,0,0,1,428.33,373Z" style="fill:#3F9CAD"></path><path d="M434.9,373a2,2,0,1,1-2-2A2,2,0,0,1,434.9,373Z" style="fill:#3F9CAD"></path><path d="M441.48,373a2,2,0,1,1-2-2A2,2,0,0,1,441.48,373Z" style="fill:#3F9CAD"></path><path d="M415.17,379a2,2,0,1,1-2-2A2,2,0,0,1,415.17,379Z" style="fill:#3F9CAD"></path><path d="M421.75,379a2,2,0,1,1-2-2A2,2,0,0,1,421.75,379Z" style="fill:#3F9CAD"></path><path d="M428.33,379a2,2,0,1,1-2-2A2,2,0,0,1,428.33,379Z" style="fill:#3F9CAD"></path><path d="M434.9,379a2,2,0,1,1-2-2A2,2,0,0,1,434.9,379Z" style="fill:#3F9CAD"></path><path d="M441.48,379a2,2,0,1,1-2-2A2,2,0,0,1,441.48,379Z" style="fill:#3F9CAD"></path><rect x="407.4" y="365" width="1.15" height="15.96" style="fill:#263238"></rect><rect x="341.37" y="332.34" width="103.21" height="23.84" style="fill:#37474f"></rect><rect x="345.71" y="336.28" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="339.76" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="343.25" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="346.74" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="350.23" width="58.75" height="2.01" style="fill:#455a64"></rect><circle cx="413.18" cy="338.27" r="2" style="fill:#3F9CAD"></circle><path d="M421.75,338.27a2,2,0,1,1-2-2A2,2,0,0,1,421.75,338.27Z" style="fill:#3F9CAD"></path><circle cx="426.33" cy="338.27" r="2" style="fill:#3F9CAD"></circle><path d="M434.9,338.27a2,2,0,1,1-2-2A2,2,0,0,1,434.9,338.27Z" style="fill:#3F9CAD"></path><path d="M441.48,338.27a2,2,0,1,1-2-2A2,2,0,0,1,441.48,338.27Z" style="fill:#3F9CAD"></path><path d="M415.17,344.26a2,2,0,1,1-2-2A2,2,0,0,1,415.17,344.26Z" style="fill:#3F9CAD"></path><path d="M421.75,344.26a2,2,0,1,1-2-2A2,2,0,0,1,421.75,344.26Z" style="fill:#3F9CAD"></path><path d="M428.33,344.26a2,2,0,1,1-2-2A2,2,0,0,1,428.33,344.26Z" style="fill:#3F9CAD"></path><path d="M434.9,344.26a2,2,0,1,1-2-2A2,2,0,0,1,434.9,344.26Z" style="fill:#3F9CAD"></path><path d="M441.48,344.26a2,2,0,1,1-2-2A2,2,0,0,1,441.48,344.26Z" style="fill:#3F9CAD"></path><path d="M415.17,350.24a2,2,0,1,1-2-2A2,2,0,0,1,415.17,350.24Z" style="fill:#3F9CAD"></path><path d="M421.75,350.24a2,2,0,1,1-2-2A2,2,0,0,1,421.75,350.24Z" style="fill:#3F9CAD"></path><path d="M428.33,350.24a2,2,0,1,1-2-2A2,2,0,0,1,428.33,350.24Z" style="fill:#3F9CAD"></path><path d="M434.9,350.24a2,2,0,1,1-2-2A2,2,0,0,1,434.9,350.24Z" style="fill:#3F9CAD"></path><path d="M441.48,350.24a2,2,0,1,1-2-2A2,2,0,0,1,441.48,350.24Z" style="fill:#3F9CAD"></path><rect x="407.4" y="336.28" width="1.15" height="15.96" style="fill:#263238"></rect><rect x="341.37" y="303.61" width="103.21" height="23.84" style="fill:#37474f"></rect><rect x="345.71" y="307.55" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="311.03" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="314.52" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="318.01" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="321.5" width="58.75" height="2.01" style="fill:#455a64"></rect><path d="M415.17,309.54a2,2,0,1,1-2-2A2,2,0,0,1,415.17,309.54Z" style="fill:#3F9CAD"></path><path d="M421.75,309.54a2,2,0,1,1-2-2A2,2,0,0,1,421.75,309.54Z" style="fill:#3F9CAD"></path><path d="M428.33,309.54a2,2,0,1,1-2-2A2,2,0,0,1,428.33,309.54Z" style="fill:#3F9CAD"></path><path d="M434.9,309.54a2,2,0,1,1-2-2A2,2,0,0,1,434.9,309.54Z" style="fill:#3F9CAD"></path><path d="M441.48,309.54a2,2,0,1,1-2-2A2,2,0,0,1,441.48,309.54Z" style="fill:#3F9CAD"></path><circle cx="413.18" cy="315.53" r="2" style="fill:#3F9CAD"></circle><path d="M421.75,315.53a2,2,0,1,1-2-2A2,2,0,0,1,421.75,315.53Z" style="fill:#3F9CAD"></path><circle cx="426.33" cy="315.53" r="2" style="fill:#3F9CAD"></circle><path d="M434.9,315.53a2,2,0,1,1-2-2A2,2,0,0,1,434.9,315.53Z" style="fill:#3F9CAD"></path><path d="M441.48,315.53a2,2,0,1,1-2-2A2,2,0,0,1,441.48,315.53Z" style="fill:#3F9CAD"></path><circle cx="413.18" cy="321.51" r="2" style="fill:#3F9CAD"></circle><path d="M421.75,321.51a2,2,0,1,1-2-2A2,2,0,0,1,421.75,321.51Z" style="fill:#3F9CAD"></path><circle cx="426.33" cy="321.51" r="2" style="fill:#3F9CAD"></circle><path d="M434.9,321.51a2,2,0,1,1-2-2A2,2,0,0,1,434.9,321.51Z" style="fill:#3F9CAD"></path><path d="M441.48,321.51a2,2,0,1,1-2-2A2,2,0,0,1,441.48,321.51Z" style="fill:#3F9CAD"></path><rect x="407.4" y="307.55" width="1.15" height="15.96" style="fill:#263238"></rect><rect x="341.37" y="274.88" width="103.21" height="23.84" style="fill:#37474f"></rect><rect x="345.71" y="278.82" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="282.31" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="285.79" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="289.28" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="292.77" width="58.75" height="2.01" style="fill:#455a64"></rect><circle cx="413.18" cy="280.82" r="2" style="fill:#3F9CAD"></circle><path d="M421.75,280.82a2,2,0,1,1-2-2A2,2,0,0,1,421.75,280.82Z" style="fill:#3F9CAD"></path><circle cx="426.33" cy="280.82" r="2" style="fill:#3F9CAD"></circle><path d="M434.9,280.82a2,2,0,1,1-2-2A2,2,0,0,1,434.9,280.82Z" style="fill:#3F9CAD"></path><path d="M441.48,280.82a2,2,0,1,1-2-2A2,2,0,0,1,441.48,280.82Z" style="fill:#3F9CAD"></path><circle cx="413.18" cy="286.8" r="2" style="fill:#3F9CAD"></circle><path d="M421.75,286.8a2,2,0,1,1-2-2A2,2,0,0,1,421.75,286.8Z" style="fill:#3F9CAD"></path><circle cx="426.33" cy="286.8" r="2" style="fill:#3F9CAD"></circle><path d="M434.9,286.8a2,2,0,1,1-2-2A2,2,0,0,1,434.9,286.8Z" style="fill:#3F9CAD"></path><path d="M441.48,286.8a2,2,0,1,1-2-2A2,2,0,0,1,441.48,286.8Z" style="fill:#3F9CAD"></path><path d="M415.17,292.79a2,2,0,1,1-2-2A2,2,0,0,1,415.17,292.79Z" style="fill:#3F9CAD"></path><path d="M421.75,292.79a2,2,0,1,1-2-2A2,2,0,0,1,421.75,292.79Z" style="fill:#3F9CAD"></path><path d="M428.33,292.79a2,2,0,1,1-2-2A2,2,0,0,1,428.33,292.79Z" style="fill:#3F9CAD"></path><path d="M434.9,292.79a2,2,0,1,1-2-2A2,2,0,0,1,434.9,292.79Z" style="fill:#3F9CAD"></path><path d="M441.48,292.79a2,2,0,1,1-2-2A2,2,0,0,1,441.48,292.79Z" style="fill:#3F9CAD"></path><rect x="407.4" y="278.82" width="1.15" height="15.96" style="fill:#263238"></rect><rect x="341.37" y="246.15" width="103.21" height="23.84" style="fill:#37474f"></rect><rect x="345.71" y="250.09" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="253.58" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="257.07" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="260.55" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="264.04" width="58.75" height="2.01" style="fill:#455a64"></rect><path d="M415.17,252.09a2,2,0,1,1-2-2A2,2,0,0,1,415.17,252.09Z" style="fill:#3F9CAD"></path><path d="M421.75,252.09a2,2,0,1,1-2-2A2,2,0,0,1,421.75,252.09Z" style="fill:#3F9CAD"></path><path d="M428.33,252.09a2,2,0,1,1-2-2A2,2,0,0,1,428.33,252.09Z" style="fill:#3F9CAD"></path><path d="M434.9,252.09a2,2,0,1,1-2-2A2,2,0,0,1,434.9,252.09Z" style="fill:#3F9CAD"></path><path d="M441.48,252.09a2,2,0,1,1-2-2A2,2,0,0,1,441.48,252.09Z" style="fill:#3F9CAD"></path><path d="M415.17,258.07a2,2,0,1,1-2-2A2,2,0,0,1,415.17,258.07Z" style="fill:#3F9CAD"></path><path d="M421.75,258.07a2,2,0,1,1-2-2A2,2,0,0,1,421.75,258.07Z" style="fill:#3F9CAD"></path><path d="M428.33,258.07a2,2,0,1,1-2-2A2,2,0,0,1,428.33,258.07Z" style="fill:#3F9CAD"></path><path d="M434.9,258.07a2,2,0,1,1-2-2A2,2,0,0,1,434.9,258.07Z" style="fill:#3F9CAD"></path><path d="M441.48,258.07a2,2,0,1,1-2-2A2,2,0,0,1,441.48,258.07Z" style="fill:#3F9CAD"></path><path d="M415.17,264.06a2,2,0,1,1-2-2A2,2,0,0,1,415.17,264.06Z" style="fill:#3F9CAD"></path><path d="M421.75,264.06a2,2,0,1,1-2-2A2,2,0,0,1,421.75,264.06Z" style="fill:#3F9CAD"></path><path d="M428.33,264.06a2,2,0,1,1-2-2A2,2,0,0,1,428.33,264.06Z" style="fill:#3F9CAD"></path><path d="M434.9,264.06a2,2,0,1,1-2-2A2,2,0,0,1,434.9,264.06Z" style="fill:#3F9CAD"></path><path d="M441.48,264.06a2,2,0,1,1-2-2A2,2,0,0,1,441.48,264.06Z" style="fill:#3F9CAD"></path><rect x="407.4" y="250.09" width="1.15" height="15.96" style="fill:#263238"></rect><rect x="341.37" y="217.43" width="103.21" height="23.84" style="fill:#37474f"></rect><rect x="345.71" y="221.36" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="224.85" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="228.34" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="231.83" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="235.31" width="58.75" height="2.01" style="fill:#455a64"></rect><path d="M415.17,223.36a2,2,0,1,1-2-2A2,2,0,0,1,415.17,223.36Z" style="fill:#3F9CAD"></path><path d="M421.75,223.36a2,2,0,1,1-2-2A2,2,0,0,1,421.75,223.36Z" style="fill:#3F9CAD"></path><path d="M428.33,223.36a2,2,0,1,1-2-2A2,2,0,0,1,428.33,223.36Z" style="fill:#3F9CAD"></path><path d="M434.9,223.36a2,2,0,1,1-2-2A2,2,0,0,1,434.9,223.36Z" style="fill:#3F9CAD"></path><path d="M441.48,223.36a2,2,0,1,1-2-2A2,2,0,0,1,441.48,223.36Z" style="fill:#3F9CAD"></path><path d="M415.17,229.35a2,2,0,1,1-2-2A2,2,0,0,1,415.17,229.35Z" style="fill:#3F9CAD"></path><path d="M421.75,229.35a2,2,0,1,1-2-2A2,2,0,0,1,421.75,229.35Z" style="fill:#3F9CAD"></path><path d="M428.33,229.35a2,2,0,1,1-2-2A2,2,0,0,1,428.33,229.35Z" style="fill:#3F9CAD"></path><path d="M434.9,229.35a2,2,0,1,1-2-2A2,2,0,0,1,434.9,229.35Z" style="fill:#3F9CAD"></path><path d="M441.48,229.35a2,2,0,1,1-2-2A2,2,0,0,1,441.48,229.35Z" style="fill:#3F9CAD"></path><path d="M415.17,235.33a2,2,0,1,1-2-2A2,2,0,0,1,415.17,235.33Z" style="fill:#3F9CAD"></path><path d="M421.75,235.33a2,2,0,1,1-2-2A2,2,0,0,1,421.75,235.33Z" style="fill:#3F9CAD"></path><path d="M428.33,235.33a2,2,0,1,1-2-2A2,2,0,0,1,428.33,235.33Z" style="fill:#3F9CAD"></path><path d="M434.9,235.33a2,2,0,1,1-2-2A2,2,0,0,1,434.9,235.33Z" style="fill:#3F9CAD"></path><path d="M441.48,235.33a2,2,0,1,1-2-2A2,2,0,0,1,441.48,235.33Z" style="fill:#3F9CAD"></path><rect x="407.4" y="221.36" width="1.15" height="15.96" style="fill:#263238"></rect><rect x="341.37" y="188.7" width="103.21" height="23.84" style="fill:#37474f"></rect><rect x="345.71" y="192.64" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="196.12" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="199.61" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="203.1" width="58.75" height="2.01" style="fill:#455a64"></rect><rect x="345.71" y="206.59" width="58.75" height="2.01" style="fill:#455a64"></rect><path d="M415.17,194.63a2,2,0,1,1-2-2A2,2,0,0,1,415.17,194.63Z" style="fill:#3F9CAD"></path><path d="M421.75,194.63a2,2,0,1,1-2-2A2,2,0,0,1,421.75,194.63Z" style="fill:#3F9CAD"></path><path d="M428.33,194.63a2,2,0,1,1-2-2A2,2,0,0,1,428.33,194.63Z" style="fill:#3F9CAD"></path><path d="M434.9,194.63a2,2,0,1,1-2-2A2,2,0,0,1,434.9,194.63Z" style="fill:#3F9CAD"></path><path d="M441.48,194.63a2,2,0,1,1-2-2A2,2,0,0,1,441.48,194.63Z" style="fill:#3F9CAD"></path><circle cx="413.18" cy="200.62" r="2" style="fill:#3F9CAD"></circle><path d="M421.75,200.62a2,2,0,1,1-2-2A2,2,0,0,1,421.75,200.62Z" style="fill:#3F9CAD"></path><circle cx="426.33" cy="200.62" r="2" style="fill:#3F9CAD"></circle><path d="M434.9,200.62a2,2,0,1,1-2-2A2,2,0,0,1,434.9,200.62Z" style="fill:#3F9CAD"></path><path d="M441.48,200.62a2,2,0,1,1-2-2A2,2,0,0,1,441.48,200.62Z" style="fill:#3F9CAD"></path><path d="M415.17,206.6a2,2,0,1,1-2-2A2,2,0,0,1,415.17,206.6Z" style="fill:#3F9CAD"></path><path d="M421.75,206.6a2,2,0,1,1-2-2A2,2,0,0,1,421.75,206.6Z" style="fill:#3F9CAD"></path><path d="M428.33,206.6a2,2,0,1,1-2-2A2,2,0,0,1,428.33,206.6Z" style="fill:#3F9CAD"></path><path d="M434.9,206.6a2,2,0,1,1-2-2A2,2,0,0,1,434.9,206.6Z" style="fill:#3F9CAD"></path><path d="M441.48,206.6a2,2,0,1,1-2-2A2,2,0,0,1,441.48,206.6Z" style="fill:#3F9CAD"></path><rect x="407.4" y="192.64" width="1.15" height="15.96" style="fill:#263238"></rect><rect x="291.69" y="168.86" width="136.05" height="7.56" style="fill:#37474f"></rect><rect x="277.86" y="384.07" width="15.19" height="15.19" style="fill:#263238"></rect></g><g id="freepik--Texts--inject-5"><path d="M63,226.7V212.31h2.27V226.7Z" style="fill:#263238"></path><path d="M70.79,216.57V226.7H68.52V212.31H70.3l8.23,10.38V212.33h2.29V226.7H78.94Z" style="fill:#263238"></path><path d="M94.62,214.32H89.84V226.7H87.55V214.32h-4.8v-2H94.62Z" style="fill:#263238"></path><path d="M106.42,224.7v2H96.55V212.31h9.69v2H98.82v4.09h6.43v1.89H98.82v4.4Z" style="fill:#263238"></path><path d="M108.77,226.7V212.31H115a4,4,0,0,1,1.79.41,4.51,4.51,0,0,1,1.41,1.06,5,5,0,0,1,.92,1.5,4.66,4.66,0,0,1,.34,1.72,4.59,4.59,0,0,1-.21,1.39,4.52,4.52,0,0,1-.57,1.24,3.79,3.79,0,0,1-.89,1,3.47,3.47,0,0,1-1.15.62l3.38,5.47h-2.57l-3.12-5H111v5Zm2.27-7h4a1.87,1.87,0,0,0,.88-.21,2.12,2.12,0,0,0,.68-.59A3,3,0,0,0,117,218a3.17,3.17,0,0,0,.16-1,2.78,2.78,0,0,0-.19-1,3.23,3.23,0,0,0-.5-.85,2.53,2.53,0,0,0-.73-.58,1.92,1.92,0,0,0-.87-.21H111Z" style="fill:#263238"></path><path d="M124.44,216.57V226.7h-2.27V212.31H124l8.23,10.38V212.33h2.29V226.7h-1.88Z" style="fill:#263238"></path><path d="M142,212.31h2l5.68,14.39h-2.4l-1.52-3.91h-5.55l-1.5,3.91h-2.41Zm3.31,8.8L143,214.93l-2.39,6.18Z" style="fill:#263238"></path><path d="M151.4,226.7V212.31h2.27V224.7h7.72v2Z" style="fill:#263238"></path><path d="M176.21,215.7a3.18,3.18,0,0,0-.59-.48,5,5,0,0,0-.9-.47,6.63,6.63,0,0,0-1.14-.37,5.86,5.86,0,0,0-1.26-.14,3.39,3.39,0,0,0-2.12.53,1.74,1.74,0,0,0-.68,1.46,1.61,1.61,0,0,0,.21.86,1.89,1.89,0,0,0,.66.58,5.21,5.21,0,0,0,1.12.45q.66.19,1.56.42a17.39,17.39,0,0,1,2,.58,5.64,5.64,0,0,1,1.49.79,3.39,3.39,0,0,1,.95,1.15,3.73,3.73,0,0,1,.33,1.65,4.12,4.12,0,0,1-.41,1.89,3.6,3.6,0,0,1-1.14,1.28,4.77,4.77,0,0,1-1.67.73,8.41,8.41,0,0,1-2.05.24,10.25,10.25,0,0,1-3.17-.5,9.05,9.05,0,0,1-2.77-1.45l1-2a3.79,3.79,0,0,0,.76.59,6.5,6.5,0,0,0,1.15.6,10.9,10.9,0,0,0,1.43.47,6.49,6.49,0,0,0,1.6.19,3.87,3.87,0,0,0,2.07-.47,1.52,1.52,0,0,0,.73-1.38,1.45,1.45,0,0,0-.28-.91,2.44,2.44,0,0,0-.78-.64,7,7,0,0,0-1.23-.49c-.49-.15-1-.31-1.66-.47a16.84,16.84,0,0,1-1.88-.6,4.69,4.69,0,0,1-1.33-.76,3,3,0,0,1-.8-1,3.51,3.51,0,0,1-.27-1.45,4.15,4.15,0,0,1,.4-1.87,3.94,3.94,0,0,1,1.11-1.38,4.77,4.77,0,0,1,1.65-.84,7.24,7.24,0,0,1,2.07-.29,7.56,7.56,0,0,1,2.69.47,8.74,8.74,0,0,1,2.17,1.15Z" style="fill:#263238"></path><path d="M190,224.7v2h-9.87V212.31h9.69v2h-7.42v4.09h6.43v1.89h-6.43v4.4Z" style="fill:#263238"></path><path d="M192.3,226.7V212.31h6.27a4,4,0,0,1,1.79.41,4.51,4.51,0,0,1,1.41,1.06,5,5,0,0,1,.92,1.5A4.47,4.47,0,0,1,203,217a4.59,4.59,0,0,1-.21,1.39,4.8,4.8,0,0,1-.56,1.24,3.83,3.83,0,0,1-.9,1,3.47,3.47,0,0,1-1.15.62l3.38,5.47H201l-3.12-5h-3.33v5Zm2.27-7h4a1.84,1.84,0,0,0,.88-.21,2.12,2.12,0,0,0,.68-.59,2.8,2.8,0,0,0,.44-.86,3.18,3.18,0,0,0,.17-1,2.79,2.79,0,0,0-.2-1,3,3,0,0,0-.5-.85,2.53,2.53,0,0,0-.73-.58,1.91,1.91,0,0,0-.86-.21h-3.86Z" style="fill:#263238"></path><path d="M206.27,212.31l4.34,11.54,4.32-11.54h2.41l-5.76,14.39h-2l-5.77-14.39Z" style="fill:#263238"></path><path d="M229,224.7v2H219.1V212.31h9.69v2h-7.42v4.09h6.43v1.89h-6.43v4.4Z" style="fill:#263238"></path><path d="M231.32,226.7V212.31h6.27a4,4,0,0,1,1.79.41,4.51,4.51,0,0,1,1.41,1.06,5,5,0,0,1,.92,1.5,4.66,4.66,0,0,1,.34,1.72,4.59,4.59,0,0,1-.21,1.39,4.8,4.8,0,0,1-.56,1.24,4,4,0,0,1-.9,1,3.47,3.47,0,0,1-1.15.62l3.38,5.47H240l-3.12-5h-3.33v5Zm2.27-7h4a1.87,1.87,0,0,0,.88-.21,2.12,2.12,0,0,0,.68-.59,3,3,0,0,0,.44-.86,3.17,3.17,0,0,0,.16-1,2.78,2.78,0,0,0-.19-1,3.23,3.23,0,0,0-.5-.85,2.53,2.53,0,0,0-.73-.58,1.92,1.92,0,0,0-.87-.21h-3.85Z" style="fill:#263238"></path><path d="M132.08,245.89v2.92H122V234.42h9.94v2.92h-6.61v2.79H131v2.7h-5.67v3.06Z" style="fill:#263238"></path><path d="M134.11,248.81V234.42h6.48a4.25,4.25,0,0,1,1.88.42A5.17,5.17,0,0,1,144,236a5.48,5.48,0,0,1,1,1.56,4.57,4.57,0,0,1,.35,1.76,5,5,0,0,1-.16,1.29,5.1,5.1,0,0,1-.46,1.16,4.57,4.57,0,0,1-.74,1,4.27,4.27,0,0,1-1,.74l3.16,5.35h-3.75l-2.75-4.64h-2.17v4.64Zm3.32-7.54h3a1.25,1.25,0,0,0,1-.56,2.25,2.25,0,0,0,.43-1.43,2,2,0,0,0-.49-1.42,1.4,1.4,0,0,0-1-.52h-2.94Z" style="fill:#263238"></path><path d="M147.69,248.81V234.42h6.48a4.25,4.25,0,0,1,1.88.42,5.17,5.17,0,0,1,1.49,1.12,5.27,5.27,0,0,1,1,1.56,4.58,4.58,0,0,1,.36,1.76,5,5,0,0,1-.17,1.29,5.1,5.1,0,0,1-.46,1.16,4.57,4.57,0,0,1-.74,1,4.27,4.27,0,0,1-1,.74l3.17,5.35h-3.75l-2.76-4.64H151v4.64Zm3.32-7.54h3a1.25,1.25,0,0,0,1-.56,2.25,2.25,0,0,0,.43-1.43,2,2,0,0,0-.49-1.42,1.4,1.4,0,0,0-1.05-.52H151Z" style="fill:#263238"></path><path d="M167.57,248.93a6.68,6.68,0,0,1-2.92-.63,7.21,7.21,0,0,1-2.25-1.65,7.61,7.61,0,0,1-1.45-2.34,7.46,7.46,0,0,1-.51-2.72,7.13,7.13,0,0,1,.53-2.73,7.31,7.31,0,0,1,3.78-3.93,7,7,0,0,1,2.88-.59,6.82,6.82,0,0,1,2.92.62,7.11,7.11,0,0,1,2.25,1.67,7.55,7.55,0,0,1,1.44,2.35,7.36,7.36,0,0,1,.51,2.67,7.16,7.16,0,0,1-.54,2.74,7.5,7.5,0,0,1-1.49,2.32,7.26,7.26,0,0,1-2.27,1.61A6.73,6.73,0,0,1,167.57,248.93Zm-3.75-7.3a5.53,5.53,0,0,0,.24,1.62,4.53,4.53,0,0,0,.72,1.38,3.66,3.66,0,0,0,1.19,1,3.51,3.51,0,0,0,1.62.36,3.4,3.4,0,0,0,2.84-1.39,4.49,4.49,0,0,0,.7-1.4,5.71,5.71,0,0,0,.23-1.59,5.46,5.46,0,0,0-.24-1.61,4.15,4.15,0,0,0-.73-1.38,3.68,3.68,0,0,0-1.19-.95,3.87,3.87,0,0,0-3.26,0,3.75,3.75,0,0,0-1.18,1,4.46,4.46,0,0,0-.71,1.39A5.71,5.71,0,0,0,163.82,241.63Z" style="fill:#263238"></path><path d="M176.67,248.81V234.42h6.49a4.2,4.2,0,0,1,1.87.42,5,5,0,0,1,1.49,1.12,5.3,5.3,0,0,1,1,1.56,4.76,4.76,0,0,1,.35,1.76,5,5,0,0,1-.16,1.29,5.13,5.13,0,0,1-.47,1.16,4.27,4.27,0,0,1-.74,1,4.43,4.43,0,0,1-1,.74l3.16,5.35h-3.75l-2.76-4.64H180v4.64Zm3.33-7.54h3a1.25,1.25,0,0,0,1-.56,2.32,2.32,0,0,0,.43-1.43,2.06,2.06,0,0,0-.49-1.42,1.44,1.44,0,0,0-1.05-.52H180Z" style="fill:#263238"></path><path d="M82.72,113.28v22.21a15.05,15.05,0,0,1,6.54-5.12,13.72,13.72,0,0,1,5.22-.91q10.26,0,15.15,7.18,4.22,6.2,4.22,17.51v22.29q0,11.48-7.27,18.83a23.45,23.45,0,0,1-17.5,7.1,22,22,0,0,1-17-7.43,24.71,24.71,0,0,1-6.52-17.34v-2.48L80.49,174l.33,3.55q.59,6.19,5,8.26a6.21,6.21,0,0,0,2.81.66q9.57,0,9.57-10V151.09a9.63,9.63,0,0,0-3.32-7.51,6.35,6.35,0,0,0-4.4-1.4,6.72,6.72,0,0,0-6.14,3.22,11.45,11.45,0,0,0-1.66,5.94v2.81H67.12V97.59h45.66v15.69Z" style="fill:#3F9CAD"></path><path d="M176.43,177.6a24.76,24.76,0,0,1-42.23,17.46A23.78,23.78,0,0,1,127,177.6V121.12a24.75,24.75,0,0,1,42.27-17.5,24,24,0,0,1,7.18,17.5Zm-16.18-56.81a9,9,0,0,0-9-9,8.55,8.55,0,0,0-6.32,2.64,8.77,8.77,0,0,0-2.6,6.36v56.56a8.75,8.75,0,0,0,2.6,6.36,8.55,8.55,0,0,0,6.32,2.64,9,9,0,0,0,9-9Z" style="fill:#3F9CAD"></path><path d="M239.35,177.6a24.73,24.73,0,0,1-49.46,0V121.12a24.76,24.76,0,0,1,42.28-17.5,24,24,0,0,1,7.18,17.5Zm-16.19-56.81a9,9,0,0,0-9-9,8.53,8.53,0,0,0-6.32,2.64,8.73,8.73,0,0,0-2.6,6.36v56.56a8.71,8.71,0,0,0,2.6,6.36,8.53,8.53,0,0,0,6.32,2.64,9,9,0,0,0,9-9Z" style="fill:#3F9CAD"></path></g><g id="freepik--wall-plug--inject-5"><rect x="43.46" y="353.74" width="26.56" height="26.56" style="fill:#37474f"></rect><circle cx="56.74" cy="367.01" r="8.87" style="fill:#455a64"></circle><rect x="53.12" y="363.43" width="2" height="7.32" style="fill:#263238"></rect><rect x="58.68" y="363.43" width="2" height="7.32" style="fill:#263238"></rect></g><g id="freepik--Floor--inject-5"><polygon points="36.85 421.59 90.14 421.35 143.43 421.26 250 421.09 356.57 421.26 409.86 421.35 463.15 421.59 409.86 421.84 356.57 421.93 250 422.09 143.43 421.92 90.14 421.83 36.85 421.59" style="fill:#263238"></polygon></g><g id="freepik--Dog--inject-5"><path d="M128.08,396.52c1,2.12-2.84,17.31-4,20.43s-5.39,20.53-7.43,21.28-11.93.54-13.33,0,0-3.51,1.61-4.55,3.54-2.63,3.54-2.63-2.89-26.89-2.35-29.9S125.48,390.83,128.08,396.52Z" style="fill:#3F9CAD"></path><path d="M128.08,396.52c1,2.12-2.84,17.31-4,20.43s-5.39,20.53-7.43,21.28-11.93.54-13.33,0,0-3.51,1.61-4.55,3.54-2.63,3.54-2.63-2.89-26.89-2.35-29.9S125.48,390.83,128.08,396.52Z" style="opacity:0.1"></path><path d="M107.4,437.06a3.9,3.9,0,0,1,.65-1.49,5.6,5.6,0,0,1,1.13-1.15,3.68,3.68,0,0,1,1.42-.69.07.07,0,0,1,.07.12c-.18.16-.38.3-.55.47s-.36.35-.52.53a6.07,6.07,0,0,0-.85,1.16c-.25.41-.48.83-.7,1.27s-.33.91-.5,1.37a.1.1,0,0,1-.2,0A3.67,3.67,0,0,1,107.4,437.06Z" style="opacity:0.1"></path><path d="M104.51,435.48a5,5,0,0,1,2.41-2.11c.07,0,.14.05.08.1a8.13,8.13,0,0,0-1.92,2.17,3.66,3.66,0,0,0-.38,2.85s0,.06-.07,0A2.92,2.92,0,0,1,104.51,435.48Z" style="opacity:0.1"></path><path d="M106.94,416l13.59,12.86c1.5-4.93,2.9-10.29,3.51-11.88,1.2-3.12,5-18.31,4-20.43-2.61-5.69-21.48,1.62-22,4.63C105.83,402.57,106.33,409.27,106.94,416Z" style="opacity:0.1"></path><path d="M179.41,411.72c.55.52,5.9-4.54,6.72-6.91s-2.6-9.06-2-10.2,3.55-2.05,5.06-.3,5.38,11.34,4.58,15.44S184.74,423,183.87,423,179.41,411.72,179.41,411.72Z" style="fill:#3F9CAD"></path><path d="M179.41,411.72s3.61,11.2,4.46,11.25c.63,0,5.21-4.86,7.95-9.09l-7.49-6.31C182.44,409.8,179.79,412.08,179.41,411.72Z" style="opacity:0.1"></path><path d="M149.19,365.46h-44.4s-3.3,29.24-2.94,33.11,19.87,32.54,25.92,36.24,40.83,3.88,49.29,2c6.58-1.45,12.07-9.85,9.34-22.78-1.19-5.66-16.61-19.14-18.76-21.72S149.19,365.46,149.19,365.46Z" style="fill:#c7c7c7"></path><path d="M101.85,398.57c.36,3.87,19.87,32.54,25.93,36.24s40.82,3.88,49.29,2c6.57-1.45,12.07-9.85,9.33-22.79-1.19-5.65-16.6-19.13-18.75-21.71-1.32-1.58-7.94-11.3-12.88-18.6-3.13-4.62-5.58-8.27-5.58-8.27h-44.4s-.83,7.34-1.61,15.15S101.67,396.64,101.85,398.57Z" style="fill:#3F9CAD"></path><path d="M103.18,380.61c23.86,7.36,45.08-3.11,51.59-6.88-3.13-4.62-5.58-8.27-5.58-8.27h-44.4S104,372.8,103.18,380.61Z" style="opacity:0.1"></path><path d="M177.91,412.64s-12.22-7.67-20.79-6.29-11.6,19-7.49,28.89c0,0-7.82,2.32-7.82,6.1,0,2.15,4.47,2.84,10.91,2.68s19.26-.28,19.54-1.9a7.68,7.68,0,0,0-.84-3.85s11.57-1.3,13.84-9S179.84,413.93,177.91,412.64Z" style="fill:#3F9CAD"></path><path d="M161.22,436.11a31.06,31.06,0,0,0,10.29,2.28c.07,0,.09.12,0,.13a16.82,16.82,0,0,1-10.33-2.33C161.14,436.17,161.17,436.08,161.22,436.11Z" style="opacity:0.1"></path><path d="M146.84,444.07a6,6,0,0,1,2.66-3.44,9.23,9.23,0,0,1,2.26-1.14c.92-.31,1.86-.48,2.79-.77.07,0,.13.09,0,.12a15,15,0,0,0-2.3,1.06,22.45,22.45,0,0,0-2.17,1.28,13.51,13.51,0,0,0-3,3C147.05,444.31,146.8,444.24,146.84,444.07Z" style="opacity:0.1"></path><path d="M148.42,438a.06.06,0,0,1,0,.12,9.84,9.84,0,0,0-5.26,5.22c0,.1-.22.1-.2,0A6.27,6.27,0,0,1,148.42,438Z" style="opacity:0.1"></path><path d="M144.61,437.45s0,.06,0,.05a25.61,25.61,0,0,1,4.81-2.21c.2.35.41.7.64,1,0,.07.15,0,.11-.06a22.3,22.3,0,0,1-2.14-9.88,48.93,48.93,0,0,1,.32-5.41,0,0,0,0,1,0,0,26.51,26.51,0,0,1,2.9-9,10.84,10.84,0,0,1,3.77-4.34,10.46,10.46,0,0,1,5.65-1,26,26,0,0,1,5.9,1.09,45.74,45.74,0,0,1,5.72,2,31.69,31.69,0,0,0-11.56-3.87,10.58,10.58,0,0,0-6.16,1,11.77,11.77,0,0,0-4.2,4.64,27.93,27.93,0,0,0-3.07,11.88c0,.47,0,.95,0,1.42v0c0,.63,0,1.25,0,1.88a18.69,18.69,0,0,0,2.11,8.53A9.08,9.08,0,0,0,144.61,437.45Z" style="opacity:0.1"></path><path d="M142.43,400.29c1,2.11-2.84,17.3-4,20.42S133,441.24,131,442s-11.93.54-13.33,0,0-3.51,1.61-4.55,3.53-2.63,3.53-2.63-2.88-26.89-2.35-29.9S139.83,394.59,142.43,400.29Z" style="fill:#3F9CAD"></path><path d="M135.77,429.15c.91-2.74,2.1-5.4,3-8.13,0-.11.21-.06.17.05-.7,2.2-1.23,4.46-1.89,6.68.1-.15.19-.31.28-.46a10.87,10.87,0,0,0,1.57-2.77.09.09,0,0,1,.18.05,6.42,6.42,0,0,1-.59,1.34c-.26.49-.53,1-.8,1.47s-.71,1.26-1.1,1.87c0,.05,0,.09,0,.13a78.59,78.59,0,0,1-3,8.13.13.13,0,0,1-.24-.07A85.77,85.77,0,0,1,135.77,429.15Z" style="opacity:0.1"></path><path d="M120.05,409.2c0-.05.11-.07.12,0,.29,2,.41,4.1.62,6.15s.47,4.25.7,6.38c.47,4.23,1.18,8.45,1.52,12.69,0,.18-.31.2-.36,0A77.9,77.9,0,0,1,120.6,422c-.22-2.08-.35-4.16-.45-6.24A59.07,59.07,0,0,1,120.05,409.2Z" style="opacity:0.1"></path><path d="M121.27,440.61a3.73,3.73,0,0,1,.64-1.49,5.4,5.4,0,0,1,1.14-1.15,3.55,3.55,0,0,1,1.42-.69.07.07,0,0,1,.06.12c-.18.17-.38.3-.55.47l-.52.53a6.91,6.91,0,0,0-.85,1.16c-.24.41-.48.83-.69,1.27s-.34.91-.51,1.37a.1.1,0,0,1-.19,0A3.52,3.52,0,0,1,121.27,440.61Z" style="opacity:0.1"></path><path d="M118.37,439a5,5,0,0,1,2.42-2.11c.06,0,.13.05.07.1a7.92,7.92,0,0,0-1.91,2.17,3.57,3.57,0,0,0-.38,2.85s0,.06-.07,0A2.92,2.92,0,0,1,118.37,439Z" style="opacity:0.1"></path><path d="M121.78,324.81c.48-1.76-3.9-8-5.57-10.05s-10.86-5.22-13.8-3.61c-1.15.63-3.29,5.05-6.18,8.88-4.48,5.94-9.7,12.17-7.8,13.84,4.6,4.07,15.11-2.35,18.52-4.5s6.52-4.78,7.35-4.69c1.1.12,3.4,1.86,4.33,2A3.23,3.23,0,0,0,121.78,324.81Z" style="fill:#3F9CAD"></path><path d="M121.78,324.81c.48-1.76-3.9-8-5.57-10.05s-10.86-5.22-13.8-3.61c-1.15.63-3.29,5.05-6.18,8.88-4.48,5.94-9.7,12.17-7.8,13.84,4.6,4.07,15.11-2.35,18.52-4.5s6.52-4.78,7.35-4.69c1.1.12,3.4,1.86,4.33,2A3.23,3.23,0,0,0,121.78,324.81Z" style="opacity:0.1"></path><path d="M143,318.59c10.73,6.42,15.49,23.48,15.78,26.21.24,2.22,5.35,10.1,4.44,18.57-.59,5.44-10.37,12.67-18.33,12.6-1.46,0-13.85,4.48-24.32,3.76s-18.39-8.15-18.7-8.78S93,369.1,92.5,360.35c-.85-14,13.4-37.76,17.47-41C116.72,314,135.66,314.23,143,318.59Z" style="fill:#3F9CAD"></path><path d="M137.9,326c-.2-1.9,5.37-7.61,7.45-9.5s12.14-3.61,14.92-1.45c1.09.85,2.58,5.78,4.94,10.24,3.65,6.91,8,14.24,5.8,15.66-5.46,3.46-15.3-4.94-18.48-7.75s-6-6-6.85-6.08c-1.16-.06-3.84,1.36-4.81,1.31A3.41,3.41,0,0,1,137.9,326Z" style="fill:#3F9CAD"></path><path d="M137.9,326c-.2-1.9,5.37-7.61,7.45-9.5s12.14-3.61,14.92-1.45c1.09.85,2.58,5.78,4.94,10.24,3.65,6.91,8,14.24,5.8,15.66-5.46,3.46-15.3-4.94-18.48-7.75s-6-6-6.85-6.08c-1.16-.06-3.84,1.36-4.81,1.31A3.41,3.41,0,0,1,137.9,326Z" style="opacity:0.1"></path><path d="M118.3,349.93c6.58.06,9.58,7.11,10.37,8.94s4.86,6,5,10.43-8.23,9.3-17,7.75-13.4-6.49-13.35-10.95c0-3.59,3.42-6.7,3.8-7.64S112.31,349.87,118.3,349.93Z" style="opacity:0.1"></path><path d="M134.48,362.31a15.06,15.06,0,0,1,2.21,3.31,14,14,0,0,1,1.29,3.82,6.9,6.9,0,0,1-.43,4.1,4.83,4.83,0,0,1-1.28,1.65,5.75,5.75,0,0,1-1.79.92,5.67,5.67,0,0,0,2.35-2.87,7.45,7.45,0,0,0,.16-3.64,20.22,20.22,0,0,0-1-3.67C135.52,364.72,135,363.51,134.48,362.31Z" style="opacity:0.1"></path><path d="M104.33,359.68c-.57.71-1.11,1.4-1.61,2.1a13,13,0,0,0-1.27,2.18,7,7,0,0,0-.58,2.36,7.36,7.36,0,0,0,.47,2.51,4.41,4.41,0,0,1-1.25-2.46,5.51,5.51,0,0,1,.45-2.81,8.3,8.3,0,0,1,3.79-3.88Z" style="opacity:0.1"></path><path d="M207.14,453.86c-10.77,0-22.66-.19-34.61-.41-6.16-.11-11-.2-14.06-.2-15.53,0-20-20-24.32-39.26-.6-2.69-1.2-5.38-1.83-8-1.24-5.17-2.25-10.38-3.24-15.43-3-15.61-5.67-29.08-12.55-29.82-9.09-1-17.18,12.62-20.13,33.83l-2-.27c3.11-22.36,12.08-36.66,22.32-35.55,8.35.89,11.11,15,14.3,31.43,1,5,2,10.22,3.22,15.34.64,2.65,1.24,5.36,1.85,8.06,4.34,19.38,8.44,37.69,22.36,37.69,3.05,0,7.93.09,14.1.2,13.52.26,32,.6,47.7.29,25.42-.5,28.43-2.5,28.74-3.11,0-4.16-26.84-9.16-36.94-11.05s-10.6-2-10.49-3.23,1.35-1.13,3.25-1.13h41.94c13.15,0,17.39-18.92,19.93-30.23a42.34,42.34,0,0,1,1.93-7.13c2.94-6.12,10.38-5.23,10.69-5.19l-.26,2c-.26,0-6.32-.74-8.63,4.07a44,44,0,0,0-1.78,6.7c-2.67,11.89-7.12,31.79-21.88,31.79H210.35l2.09.39c24.42,4.56,38.56,8.17,38.56,13.1a1.94,1.94,0,0,1-.65,1.42C247.38,453.05,229.71,453.86,207.14,453.86Z" style="fill:#263238"></path><rect x="89.27" y="392.73" width="12.28" height="7.37" transform="translate(23.88 -5) rotate(3.43)" style="fill:#455a64"></rect><rect x="91.87" y="390.4" width="7.66" height="2.34" transform="translate(23.58 -5.02) rotate(3.43)" style="fill:#37474f"></rect><rect x="91.51" y="399.92" width="1.45" height="5.62" transform="translate(24.25 -4.79) rotate(3.43)" style="fill:#3F9CAD"></rect><rect x="97.06" y="400.25" width="1.44" height="5.62" transform="translate(24.28 -5.13) rotate(3.43)" style="fill:#3F9CAD"></rect><rect x="279.59" y="388.98" width="12.28" height="5.37" transform="translate(-105.93 677.4) rotate(-90)" style="fill:#455a64"></rect><rect x="277.05" y="389.5" width="7.66" height="4.34" transform="translate(-110.78 672.55) rotate(-90)" style="fill:#37474f"></rect><path d="M110,360.6s2.61,3,3.62,2.38,3.54-6.58,3.54-6.58.61,7.56,2.56,7.77,5.29-2.78,5.29-2.78l-7.89-5.47Z" style="fill:#3F9CAD"></path><path d="M110,360.6s2.61,3,3.62,2.38,3.54-6.58,3.54-6.58.61,7.56,2.56,7.77,5.29-2.78,5.29-2.78l-7.89-5.47Z" style="opacity:0.1"></path><path d="M148.65,351.21a18.76,18.76,0,0,0,.8-7.54,13.36,13.36,0,0,0-.91-3.83,9.38,9.38,0,0,0-1-1.79,8.76,8.76,0,0,0-1.34-1.58,7.2,7.2,0,0,0-.81-.65c-.29-.2-.59-.36-.88-.54l-.45-.25-.47-.19a8.56,8.56,0,0,0-1-.36,10.59,10.59,0,0,0-4-.38,13.75,13.75,0,0,0-7.08,2.79,20,20,0,0,1,7.13-1.31,10.52,10.52,0,0,1,3.37.6c.27.08.52.23.78.33l.38.17.36.23c.23.15.48.28.71.44a6,6,0,0,1,.63.52,8.14,8.14,0,0,1,1.94,2.69,14.77,14.77,0,0,1,1.09,3.33A35.93,35.93,0,0,1,148.65,351.21Z" style="opacity:0.1"></path><path d="M99.87,346.1a28.54,28.54,0,0,1,1-6.15,9.2,9.2,0,0,1,3-4.76,6.73,6.73,0,0,1,1.18-.69,4.66,4.66,0,0,1,1.27-.35,10.83,10.83,0,0,1,2.89.06,40.09,40.09,0,0,1,6.06,1.57,15.32,15.32,0,0,0-2.69-1.82c-.48-.25-1-.48-1.48-.7a16.12,16.12,0,0,0-1.57-.54,9.22,9.22,0,0,0-3.42-.38,5.58,5.58,0,0,0-1.8.44,7.54,7.54,0,0,0-1.56.9,7.93,7.93,0,0,0-2.26,2.71,10.63,10.63,0,0,0-1,3.23A14.87,14.87,0,0,0,99.87,346.1Z" style="opacity:0.1"></path><path d="M132.36,348.07c0-.11.26.15.25.28-.24,3,0,6.5,3,7.63.09,0,.07.19,0,.17C131.94,355.52,131.61,350.89,132.36,348.07Z" style="fill:#263238"></path><path d="M135.46,345.05c5.34-.14,5.33,9.61.38,9.74S131,345.16,135.46,345.05Z" style="fill:#263238"></path><path d="M111.73,345.7c0-.11-.27.12-.28.25-.18,3-1,6.43-4,7.14-.09,0-.1.17,0,.17C111.12,353.14,112.09,348.6,111.73,345.7Z" style="fill:#263238"></path><path d="M109.09,342.28c-5.26-.88-6.62,8.78-1.74,9.59S113.51,343,109.09,342.28Z" style="fill:#263238"></path><path d="M116.91,356.12c1,.31,7.54-1.77,7-3.77-.55-2.16-9.81-2.67-11-1.27S115.92,355.8,116.91,356.12Z" style="fill:#263238"></path><path d="M125.13,361.29a22.13,22.13,0,0,1-3.35,2.09,4.46,4.46,0,0,1-1.82.52c-.38.07-.7-.44-.92-.93a14.25,14.25,0,0,1-.83-3.19c-.2-1.09-.31-2.21-.43-3.3l-.31-3-.91,2.95c-.28.91-.61,1.82-.94,2.73a20.82,20.82,0,0,1-1.18,2.64,3.85,3.85,0,0,1-.39.6,1.77,1.77,0,0,1-.46.48.83.83,0,0,1-.55.06,3.15,3.15,0,0,1-.72-.3,10.27,10.27,0,0,1-2.37-2.13,7.52,7.52,0,0,0,2,2.46,2.86,2.86,0,0,0,.87.46,2.71,2.71,0,0,0,.59.08,1.4,1.4,0,0,0,.64-.15,2.72,2.72,0,0,0,.74-.6,5.94,5.94,0,0,0,.5-.65,16.62,16.62,0,0,0,1.43-2.69c.4-.91.74-1.83,1-2.76l-1.23-.09a29.65,29.65,0,0,0,.46,3.37,16.5,16.5,0,0,0,.42,1.68,8.7,8.7,0,0,0,.67,1.67,3.5,3.5,0,0,0,.59.82,1.71,1.71,0,0,0,.53.37,1.31,1.31,0,0,0,.41.12,1.51,1.51,0,0,0,.37,0,4.89,4.89,0,0,0,2.16-.77A13.91,13.91,0,0,0,125.13,361.29Z" style="fill:#263238"></path></g><g id="freepik--Lines--inject-5"><path d="M74.9,395.89a47.15,47.15,0,0,1,11.86.81,47.23,47.23,0,0,1-11.86-.81Z" style="fill:#263238"></path><path d="M103.69,402.22a42.64,42.64,0,0,1,5.47,2.34,41.43,41.43,0,0,1,5.13,3,47.1,47.1,0,0,1-10.6-5.35Z" style="fill:#263238"></path><path d="M81.25,416a46.89,46.89,0,0,1,7.14-9.5,41.37,41.37,0,0,1-3.27,5A41.53,41.53,0,0,1,81.25,416Z" style="fill:#263238"></path><path d="M70,384.07c1.55.49,3.06,1.05,4.56,1.63s3,1.2,4.48,1.83,3,1.28,4.41,2,2.92,1.39,4.34,2.17c-1.55-.5-3.06-1.06-4.56-1.64s-3-1.2-4.48-1.83-3-1.28-4.41-2S71.43,384.84,70,384.07Z" style="fill:#263238"></path><path d="M105.13,392.93a26.48,26.48,0,0,1,4.34-1.72,25.63,25.63,0,0,1,4.55-1,28.44,28.44,0,0,1-8.89,2.73Z" style="fill:#263238"></path><path d="M90.75,387.87c-.82-1.3-1.56-2.63-2.29-4s-1.43-2.7-2.12-4.07-1.35-2.74-2-4.14-1.25-2.79-1.79-4.23c.82,1.3,1.57,2.64,2.3,4s1.43,2.7,2.12,4.06,1.34,2.74,2,4.14S90.21,386.43,90.75,387.87Z" style="fill:#263238"></path><path d="M111,419.5c-.89-1-1.72-2.09-2.53-3.16s-1.59-2.18-2.37-3.28-1.51-2.23-2.22-3.38-1.42-2.3-2.06-3.49c.89,1,1.72,2.09,2.53,3.16s1.6,2.18,2.37,3.28,1.51,2.23,2.22,3.38S110.36,418.3,111,419.5Z" style="fill:#263238"></path></g><g id="freepik--Device--inject-5"><polygon points="379.94 168.86 297.28 168.86 290.88 112.72 373.54 112.72 379.94 168.86" style="fill:#a6a6a6"></polygon><polygon points="375.44 165.1 300.93 165.1 295.39 116.49 369.9 116.49 375.44 165.1" style="fill:#fff"></polygon><polygon points="329.42 142.06 328.23 143.48 316.51 133.36 317.7 131.94 329.42 142.06" style="fill:#3F9CAD"></polygon><polygon points="326.4 131.94 328.04 133.36 319.53 143.48 317.89 142.06 326.4 131.94" style="fill:#3F9CAD"></polygon><polygon points="354.48 142.06 353.29 143.48 341.57 133.36 342.76 131.94 354.48 142.06" style="fill:#3F9CAD"></polygon><polygon points="351.46 131.94 353.1 133.36 344.59 143.48 342.95 142.06 351.46 131.94" style="fill:#3F9CAD"></polygon><polygon points="315.01 151.79 314.69 149.79 360.12 149.79 360.44 151.79 315.01 151.79" style="fill:#3F9CAD"></polygon><rect x="297.86" y="165.1" width="106.34" height="3.77" style="fill:#a6a6a6"></rect><rect x="320.96" y="165.1" width="92.22" height="3.77" style="fill:#c7c7c7"></rect><polygon points="370.17 118.85 369.9 116.49 295.39 116.49 295.66 118.85 370.17 118.85" style="fill:#263238"></polygon><path d="M301.66,117.67a.63.63,0,0,0,.59.58.48.48,0,0,0,.46-.58.63.63,0,0,0-.59-.59A.49.49,0,0,0,301.66,117.67Z" style="fill:#c7c7c7"></path><path d="M299.5,117.67a.64.64,0,0,0,.6.58.49.49,0,0,0,.46-.58.64.64,0,0,0-.59-.59A.5.5,0,0,0,299.5,117.67Z" style="fill:#fff"></path><path d="M297.35,117.67a.63.63,0,0,0,.59.58.48.48,0,0,0,.46-.58.63.63,0,0,0-.59-.59A.49.49,0,0,0,297.35,117.67Z" style="fill:#3F9CAD"></path></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin:auto;background:#ffffff;display:block;z-index:1;position:relative" width="1920" height="929" preserveAspectRatio="xMidYMid" viewBox="0 0 1920 929">
<g transform="translate(960,464.5) scale(1,1) translate(-960,-464.5)"><path id="path0" d="M 955.5539725178639 65.45163570865364
c 0 36.82700328510537 -9.010862505930037 10.57796902870048 -19.588831534630515 10.57796902870048
S 916.3763094486028 102.27863899375902 916.3763094486028 65.45163570865364
s 9.010862505930037 -10.57796902870048 19.588831534630515 -10.57796902870048
S 955.5539725178639 28.62463242354827 955.5539725178639 65.45163570865364
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="4.357439674533767" fill="#ff708e" opacity="0.9">
<animateMotion begin="-8.913298286924444s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path0"></mpath>
</animateMotion>
</circle><path id="path1" d="M 1703.1818239326476 177.53279452001436
c 0 19.93977393484943 -4.878880856399329 5.7273818749035605 -10.60626273130289 5.7273818749035605
S 1681.9692984700418 197.4725684548638 1681.9692984700418 177.53279452001436
s 4.878880856399329 -5.7273818749035605 10.60626273130289 -5.7273818749035605
S 1703.1818239326476 157.59302058516494 1703.1818239326476 177.53279452001436
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.156705160267812" fill="#ff708e" opacity="0.9">
<animateMotion begin="-9.025198419573792s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path1"></mpath>
</animateMotion>
</circle><path id="path2" d="M 985.5574297448907 917.7379528642807
c 0 36.067706339295405 -8.825077083019087 10.359873097457191 -19.184950180476278 10.359873097457191
S 947.187529383938 953.8056592035762 947.187529383938 917.7379528642807
s 8.825077083019087 -10.359873097457191 19.184950180476278 -10.359873097457191
S 985.5574297448907 881.6702465249853 985.5574297448907 917.7379528642807
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="7.888569395946006" fill="#de9dd6" opacity="0.9">
<animateMotion begin="-9.027683298067167s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path2"></mpath>
</animateMotion>
</circle><path id="path3" d="M 520.5334256998025 134.50238038581224
c 0 32.93739739936884 -8.059150427505141 9.460741806201689 -17.51989223370683 9.460741806201689
S 485.4936412323888 167.4397777851811 485.4936412323888 134.50238038581224
s 8.059150427505141 -9.460741806201689 17.51989223370683 -9.460741806201689
S 520.5334256998025 101.5649829864434 520.5334256998025 134.50238038581224
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.343253543446285" fill="#9df871" opacity="0.9">
<animateMotion begin="-3.3525219033797704s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path3"></mpath>
</animateMotion>
</circle><path id="path4" d="M 1357.4072706286936 753.7314815143777
c 0 28.72440350979377 -7.0283114970771985 8.250626540047147 -15.278938037124345 8.250626540047147
S 1326.8493945544449 782.4558850241715 1326.8493945544449 753.7314815143777
s 7.0283114970771985 -8.250626540047147 15.278938037124345 -8.250626540047147
S 1357.4072706286936 725.007078004584 1357.4072706286936 753.7314815143777
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="4.5269511430809075" fill="#ff708e" opacity="0.9">
<animateMotion begin="-4.69195617043777s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path4"></mpath>
</animateMotion>
</circle><path id="path5" d="M 793.8242472567799 522.6816770215448
c 0 30.098320256802207 -7.364482616026071 8.645262201421911 -16.00974481744798 8.645262201421911
S 761.8047576218839 552.7799972783471 761.8047576218839 522.6816770215448
s 7.364482616026071 -8.645262201421911 16.00974481744798 -8.645262201421911
S 793.8242472567799 492.58335676474263 793.8242472567799 522.6816770215448
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="7.592398976316255" fill="#de9dd6" opacity="0.9">
<animateMotion begin="-4.243123062488568s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path5"></mpath>
</animateMotion>
</circle><path id="path6" d="M 367.47825864021263 499.4299192694251
c 0 34.54924540954503 -8.453538770420591 9.923719426145913 -18.377258196566505 9.923719426145913
S 330.7237422470796 533.9791646789702 330.7237422470796 499.4299192694251
s 8.453538770420591 -9.923719426145913 18.377258196566505 -9.923719426145913
S 367.47825864021263 464.88067385988006 367.47825864021263 499.4299192694251
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.9612462696625625" fill="#9df871" opacity="0.9">
<animateMotion begin="-1.1685034347378154s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path6"></mpath>
</animateMotion>
</circle><path id="path7" d="M 550.9232977202602 574.818760517315
c 0 20.710889227219866 -5.06755800240486 5.948872437605707 -11.016430440010566 5.948872437605707
S 528.890436840239 595.5296497445349 528.890436840239 574.818760517315
s 5.06755800240486 -5.948872437605707 11.016430440010566 -5.948872437605707
S 550.9232977202602 554.1078712900951 550.9232977202602 574.818760517315
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="7.330949448045926" fill="#de9dd6" opacity="0.9">
<animateMotion begin="-1.0844108587468426s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path7"></mpath>
</animateMotion>
</circle><path id="path8" d="M 1237.3040842845899 725.9375213439366
c 0 19.449193362229998 -4.758845184375424 5.58647043383202 -10.345315618207444 5.58647043383202
S 1216.613453048175 745.3867147061666 1216.613453048175 725.9375213439366
s 4.758845184375424 -5.58647043383202 10.345315618207444 -5.58647043383202
S 1237.3040842845899 706.4883279817067 1237.3040842845899 725.9375213439366
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="7.035398243794798" fill="#51cacc" opacity="0.9">
<animateMotion begin="-6.254000416517831s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path8"></mpath>
</animateMotion>
</circle><path id="path9" d="M 1680.9602381799548 419.4828401233379
c 0 36.72117580650077 -8.984968548399124 10.547571774207668 -19.532540322606792 10.547571774207668
S 1641.8951575347412 456.20401592983865 1641.8951575347412 419.4828401233379
s 8.984968548399124 -10.547571774207668 19.532540322606792 -10.547571774207668
S 1680.9602381799548 382.76166431683714 1680.9602381799548 419.4828401233379
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="5.261014128042041" fill="#e0ff77" opacity="0.9">
<animateMotion begin="-9.063513602539562s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path9"></mpath>
</animateMotion>
</circle><path id="path10" d="M 1338.3321302053603 446.7583732361256
c 0 28.87919794129171 -7.066186730316056 8.295088770371024 -15.361275500687078 8.295088770371024
S 1307.6095792039862 475.63757117741727 1307.6095792039862 446.7583732361256
s 7.066186730316056 -8.295088770371024 15.361275500687078 -8.295088770371024
S 1338.3321302053603 417.8791752948339 1338.3321302053603 446.7583732361256
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.7426195762437295" fill="#9df871" opacity="0.9">
<animateMotion begin="-0.9165499953476353s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path10"></mpath>
</animateMotion>
</circle><path id="path11" d="M 399.81777704514707 275.2335827094575
c 0 20.855470607107026 -5.102934297483634 5.990401131828614 -11.093335429312248 5.990401131828614
S 377.63110618652263 296.0890533165645 377.63110618652263 275.2335827094575
s 5.102934297483634 -5.990401131828614 11.093335429312248 -5.990401131828614
S 399.81777704514707 254.37811210235046 399.81777704514707 275.2335827094575
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="7.930190667488647" fill="#51cacc" opacity="0.9">
<animateMotion begin="-1.9577947811370588s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path11"></mpath>
</animateMotion>
</circle><path id="path12" d="M 1861.7262087258541 630.1631589167814
c 0 27.820003464672023 -6.807022124334643 7.990852059001538 -14.797874183336182 7.990852059001538
S 1832.1304603591816 657.9831623814534 1832.1304603591816 630.1631589167814
s 6.807022124334643 -7.990852059001538 14.797874183336182 -7.990852059001538
S 1861.7262087258541 602.3431554521094 1861.7262087258541 630.1631589167814
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.514933424924015" fill="#9df871" opacity="0.9">
<animateMotion begin="-8.551154749961604s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path12"></mpath>
</animateMotion>
</circle><path id="path13" d="M 569.8910996700582 715.2925958323095
c 0 23.931611128322178 -5.855606978206489 6.873973409198923 -12.729580387405413 6.873973409198923
S 544.4319388952473 739.2242069606317 544.4319388952473 715.2925958323095
s 5.855606978206489 -6.873973409198923 12.729580387405413 -6.873973409198923
S 569.8910996700582 691.3609847039874 569.8910996700582 715.2925958323095
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="5.853233053419534" fill="#ff708e" opacity="0.9">
<animateMotion begin="-3.3741341270854064s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path13"></mpath>
</animateMotion>
</circle><path id="path14" d="M 756.2471524701806 470.35608174095927
c 0 34.846590852632964 -8.526293506495298 10.00912715979883 -18.53542066629413 10.00912715979883
S 719.1763111375923 505.20267259359224 719.1763111375923 470.35608174095927
s 8.526293506495298 -10.00912715979883 18.53542066629413 -10.00912715979883
S 756.2471524701806 435.5094908883263 756.2471524701806 470.35608174095927
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.902083432433539" fill="#e0ff77" opacity="0.9">
<animateMotion begin="-4.040735387096204s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path14"></mpath>
</animateMotion>
</circle><path id="path15" d="M 873.8369125041987 885.8299587263507
c 0 28.146585609913043 -6.886930521574467 8.084657568804811 -14.971588090379278 8.084657568804811
S 843.8937363234401 913.9765443362637 843.8937363234401 885.8299587263507
s 6.886930521574467 -8.084657568804811 14.971588090379278 -8.084657568804811
S 873.8369125041987 857.6833731164377 873.8369125041987 885.8299587263507
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="5.839004926763606" fill="#ff708e" opacity="0.9">
<animateMotion begin="-9.975411261632516s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path15"></mpath>
</animateMotion>
</circle><path id="path16" d="M 487.1118473459408 282.5411431199672
c 0 27.02762846699372 -6.613143135541015 7.763254985200323 -14.376398120741339 7.763254985200323
S 458.35905110445816 309.5687715869609 458.35905110445816 282.5411431199672
s 6.613143135541015 -7.763254985200323 14.376398120741339 -7.763254985200323
S 487.1118473459408 255.5135146529735 487.1118473459408 282.5411431199672
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.86824087066557" fill="#9df871" opacity="0.9">
<animateMotion begin="-8.803170411110596s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path16"></mpath>
</animateMotion>
</circle><path id="path17" d="M 1265.6580012707077 795.6980230068914
c 0 30.236621641422204 -7.398322316518198 8.684987067217016 -16.083309383735212 8.684987067217016
S 1233.4913825032372 825.9346446483136 1233.4913825032372 795.6980230068914
s 7.398322316518198 -8.684987067217016 16.083309383735212 -8.684987067217016
S 1265.6580012707077 765.4614013654692 1265.6580012707077 795.6980230068914
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.288469148908051" fill="#de9dd6" opacity="0.9">
<animateMotion begin="-9.626942333610014s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path17"></mpath>
</animateMotion>
</circle><path id="path18" d="M 1484.9464973898473 903.7491169506483
c 0 34.14872771436202 -8.355539759897088 9.808677109444409 -18.164216869341494 9.808677109444409
S 1448.6180636511642 937.8978446650103 1448.6180636511642 903.7491169506483
s 8.355539759897088 -9.808677109444409 18.164216869341494 -9.808677109444409
S 1484.9464973898473 869.6003892362862 1484.9464973898473 903.7491169506483
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="4.895862597244981" fill="#9df871" opacity="0.9">
<animateMotion begin="-9.228995842807672s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path18"></mpath>
</animateMotion>
</circle><path id="path19" d="M 850.6053115494469 796.142953384223
c 0 35.32727201420891 -8.643906982200052 10.147195153017453 -18.791102135217507 10.147195153017453
S 813.0231072790118 831.4702253984319 813.0231072790118 796.142953384223
s 8.643906982200052 -10.147195153017453 18.791102135217507 -10.147195153017453
S 850.6053115494469 760.8156813700141 850.6053115494469 796.142953384223
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="5.384265799575377" fill="#e0ff77" opacity="0.9">
<animateMotion begin="-4.526663726869837s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path19"></mpath>
</animateMotion>
</circle><path id="path20" d="M 33.412448687637436 510.1878032298389
c 0 32.64279932231 -7.987067919288616 9.37612320959968 -17.363191128888296 9.37612320959968
S -1.3139335701391524 542.8306025521489 -1.3139335701391524 510.1878032298389
s 7.987067919288616 -9.37612320959968 17.363191128888296 -9.37612320959968
S 33.412448687637436 477.5450039075289 33.412448687637436 510.1878032298389
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="5.143957023543638" fill="#9df871" opacity="0.9">
<animateMotion begin="-5.599929106371498s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path20"></mpath>
</animateMotion>
</circle><path id="path21" d="M 509.8773572960573 892.4241691637679
c 0 23.874494762095285 -5.8416316971084195 6.857567644431624 -12.699199341540044 6.857567644431624
S 484.4789586129772 916.2986639258633 484.4789586129772 892.4241691637679
s 5.8416316971084195 -6.857567644431624 12.699199341540044 -6.857567644431624
S 509.8773572960573 868.5496744016726 509.8773572960573 892.4241691637679
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.342364542314336" fill="#de9dd6" opacity="0.9">
<animateMotion begin="-4.349798975571144s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path21"></mpath>
</animateMotion>
</circle><path id="path22" d="M 1247.273962426879 758.1889087849656
c 0 36.968945813114765 -9.045593124485526 10.618739754830838 -19.664332879316365 10.618739754830838
S 1207.9452966682463 795.1578545980803 1207.9452966682463 758.1889087849656
s 9.045593124485526 -10.618739754830838 19.664332879316365 -10.618739754830838
S 1247.273962426879 721.2199629718509 1247.273962426879 758.1889087849656
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="4.692753210327203" fill="#de9dd6" opacity="0.9">
<animateMotion begin="-2.4831799303337143s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path22"></mpath>
</animateMotion>
</circle><path id="path23" d="M 1584.7402821497892 386.1747166632284
c 0 30.77915767711262 -7.531070495463726 8.840821885979157 -16.371892381442883 8.840821885979157
S 1551.9964973869035 416.95387434034103 1551.9964973869035 386.1747166632284
s 7.531070495463726 -8.840821885979157 16.371892381442883 -8.840821885979157
S 1584.7402821497892 355.3955589861158 1584.7402821497892 386.1747166632284
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="5.300555911109718" fill="#e0ff77" opacity="0.9">
<animateMotion begin="-7.2716009692033605s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path23"></mpath>
</animateMotion>
</circle><path id="path24" d="M 37.67271446223528 696.5238732265075
c 0 21.443787541777834 -5.24688418575415 6.159385783276612 -11.406269969030763 6.159385783276612
S 14.860174524173754 717.9676607682853 14.860174524173754 696.5238732265075
s 5.24688418575415 -6.159385783276612 11.406269969030763 -6.159385783276612
S 37.67271446223528 675.0800856847296 37.67271446223528 696.5238732265075
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="5.153922364575918" fill="#9df871" opacity="0.9">
<animateMotion begin="-5.293144313372071s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path24"></mpath>
</animateMotion>
</circle><path id="path25" d="M 1795.4373500525382 156.153117384214
c 0 22.765642981572885 -5.570316899746556 6.539067664919871 -12.109384564666428 6.539067664919871
S 1771.2185809232053 178.91876036578688 1771.2185809232053 156.153117384214
s 5.570316899746556 -6.539067664919871 12.109384564666428 -6.539067664919871
S 1795.4373500525382 133.38747440264112 1795.4373500525382 156.153117384214
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="7.230905788188841" fill="#e0ff77" opacity="0.9">
<animateMotion begin="-7.178923417601723s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path25"></mpath>
</animateMotion>
</circle><path id="path26" d="M 1146.891780526549 720.1852512212665
c 0 28.18156000015208 -6.895488085143593 8.094703404299002 -14.990191489442594 8.094703404299002
S 1116.9113975476637 748.3668112214186 1116.9113975476637 720.1852512212665
s 6.895488085143593 -8.094703404299002 14.990191489442594 -8.094703404299002
S 1146.891780526549 692.0036912211144 1146.891780526549 720.1852512212665
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.3862801389787895" fill="#de9dd6" opacity="0.9">
<animateMotion begin="-6.9540952257375555s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path26"></mpath>
</animateMotion>
</circle><path id="path27" d="M 409.89191484750046 865.3478285018073
c 0 25.66686500093736 -6.280190372569779 7.372397393886263 -13.65258776645604 7.372397393886263
S 382.5867393145883 891.0146935027446 382.5867393145883 865.3478285018073
s 6.280190372569779 -7.372397393886263 13.65258776645604 -7.372397393886263
S 409.89191484750046 839.6809635008699 409.89191484750046 865.3478285018073
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.076965899313655" fill="#e0ff77" opacity="0.9">
<animateMotion begin="-5.230818234234993s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path27"></mpath>
</animateMotion>
</circle><path id="path28" d="M 1859.0276688590025 398.33615669563994
c 0 24.40211867321272 -5.9707311647222605 7.009119193369611 -12.979850358091872 7.009119193369611
S 1833.0679681428187 422.73827536885267 1833.0679681428187 398.33615669563994
s 5.9707311647222605 -7.009119193369611 12.979850358091872 -7.009119193369611
S 1859.0276688590025 373.9340380224272 1859.0276688590025 398.33615669563994
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="6.52718047511751" fill="#51cacc" opacity="0.9">
<animateMotion begin="-9.697113499505221s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path28"></mpath>
</animateMotion>
</circle><path id="path29" d="M 749.1991882218231 29.687011447739238
c 0 25.89267260209934 -6.3354411685987735 7.437257024007256 -13.772698192606029 7.437257024007256
S 721.6537918366109 55.579684049838576 721.6537918366109 29.687011447739238
s 6.3354411685987735 -7.437257024007256 13.772698192606029 -7.437257024007256
S 749.1991882218231 3.794338845639899 749.1991882218231 29.687011447739238
z" fill="none" stroke="none"></path>
<circle cx="0" cy="0" r="5.739221663793044" fill="#de9dd6" opacity="0.9">
<animateMotion begin="-2.3237912180038856s" dur="10s" repeatCount="indefinite">
<mpath xlink:href="#path29"></mpath>
</animateMotion>
</circle></g>
</svg>
<script setup lang="ts">
import { ref, onMounted, onUnmounted, watch } from 'vue'
import { useTippy } from 'vue-tippy'
import type { Placement } from 'tippy.js'
// 1. 定义 Props
interface Props {
// 控制最大显示行数
maxLines?: number
// Tippy 弹窗的位置
placement?: Placement
}
const { maxLines = 1, placement = 'right' } = defineProps<Props>()
// 2. 获取 DOM 元素的引用
const textContainerRef = ref<HTMLElement | null>(null)
// 3. 使用 useTippy 创建 Tippy 实例
// 我们将目标元素(textContainerRef)和配置项传入
const tippy = useTippy(textContainerRef, {
// 将 props 中的 placement 响应式地传递给 tippy
placement: placement,
// 添加一个动画效果,使其过渡更平滑
// animation: 'scale',
animation: 'scale-subtle',
// Tippy 的内容将是元素的完整文本
// 我们在启用它时再设置 content,以确保获取到最新内容
content: () => textContainerRef.value?.textContent || '',
})
// 4. 核心逻辑:检测文本是否溢出
const checkTruncation = () => {
const element = textContainerRef.value
if (!element) return
// 关键判断:当元素的滚动高度大于其可见高度时,说明内容被截断了
const isTruncated = element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth
if (isTruncated) {
// 如果文本被截断,启用 tippy
tippy.enable()
} else {
// 否则,禁用 tippy
tippy.disable()
}
}
// 5. 使用 ResizeObserver 监听元素尺寸变化
// 这是最健壮的方式,当父容器宽度变化导致溢出状态改变时,能自动更新
let resizeObserver: ResizeObserver | null = null
onMounted(() => {
const element = textContainerRef.value
if (element) {
// 首次挂载时检查一次
checkTruncation()
// 创建 ResizeObserver 实例
resizeObserver = new ResizeObserver(() => {
// 当元素尺寸变化时,重新检查
checkTruncation()
})
// 开始监听元素
resizeObserver.observe(element)
}
})
// 6. 组件卸载时清理 Observer
onUnmounted(() => {
if (resizeObserver && textContainerRef.value) {
resizeObserver.unobserve(textContainerRef.value)
}
resizeObserver = null
})
// 7. 监听 maxLines 变化,以重新应用样式并检查
// 虽然 CSS v-bind 是响应式的,但 DOM 高度变化需要重新检查
watch(
() => maxLines,
() => {
// 使用 nextTick 确保 DOM 更新后再检查
// 在实践中,因为 CSS 变化会自动触发 ResizeObserver,这一步通常是可选的,
// 但显式添加可以增加代码的健壮性。
checkTruncation()
},
)
</script>
<template>
<div ref="textContainerRef" class="ellipsis-container">
<slot></slot>
</div>
</template>
<style lang="css" scoped>
.ellipsis-container {
/* 关键的 CSS,用于实现多行文本溢出省略 */
display: -webkit-box;
-webkit-box-orient: vertical;
/* 要求2:最大宽度随父元素决定 */
width: 100%;
max-width: 100%;
/* 使用 v-bind 将 Vue 的 props 绑定到 CSS 变量 */
overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: v-bind('maxLines');
}
</style>
{
"appTitle": "航行印记管理后台"
}
export const BASE_URLS: Record<'DEV' | 'PROD', string> = {
DEV: '',
PROD: '',
}
import { GlobalThemeOverrides } from 'naive-ui'
export const themeOverrides: GlobalThemeOverrides = {
common: {
primaryColor: '#00a2ea',
primaryColorHover: '#0CABF0',
primaryColorPressed: '#038FCB',
primaryColorSuppl: '#00a2ea',
},
LoadingBar: {
colorLoading: '#00a2ea',
},
}
<script setup lang="ts">
import { useDesignSettingStore } from '@/store/modules/design-setting'
import { useUserStore } from '@/store/modules/user'
import { readonly } from 'vue'
import { useRouter } from 'vue-router'
import { ExpandRight, ExpandLeft } from '@icon-park/vue-next'
const defaultAvatar = 'https://mkp-dev.oss-cn-shenzhen.aliyuncs.com/game-template/20221018/1666079174947.png'
const designSettingStore = useDesignSettingStore()
const userStore = useUserStore()
const router = useRouter()
// const currentRoute = useRoute()
const menuOptions = readonly([
{
label: '退出登录',
key: 1,
},
])
function handleSidebarDisplayStatusChange(status: 'collapse' | 'expand') {
if (designSettingStore.sidebarDisplayStatus === 'hidden') {
designSettingStore.changeShowSidebarDrawer(true)
return
}
designSettingStore.toggleSidebarDisplayStatus(status)
}
function onDropdownSelect(key: number) {
if (key === 1) {
userStore.logout().then(() => {
router.push({ name: 'Login' })
})
}
}
// function handleRefreshPage() {
// router.replace({ path: currentRoute.fullPath })
// }
</script>
<template>
<div class="flex justify-between bg-white shadow-[0_1px_4px_rgba(0,21,41,0.08)] select-none">
<div class="flex">
<div class="flex items-center px-3">
<ExpandLeft
v-show="designSettingStore.sidebarDisplayStatus !== 'expand'"
class="cursor-pointer"
theme="outline"
size="21"
fill="#333639"
:stroke-width="3"
@click="handleSidebarDisplayStatusChange('expand')"
/>
<ExpandRight
v-show="designSettingStore.sidebarDisplayStatus === 'expand'"
class="cursor-pointer"
theme="outline"
size="21"
fill="#333639"
:stroke-width="3"
@click="handleSidebarDisplayStatusChange('collapse')"
/>
</div>
</div>
<div class="mr-5 flex sm:mr-6">
<div class="flex cursor-pointer items-center px-2">
<el-dropdown placement="bottom" @command="onDropdownSelect">
<div class="flex h-full items-center outline-none">
<el-avatar :size="30" fit="cover" :src="userStore.userInfo.avatar || defaultAvatar" shape="circle" />
<div class="ml-2 max-w-24 truncate text-base">{{ userStore.userInfo.userName }}</div>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-for="option in menuOptions" :key="option.key" :command="option.key">
{{ option.label }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { useDesignSettingStore } from '@/store/modules/design-setting'
import appConfig from '@/config/app-config.json'
const designSettingStore = useDesignSettingStore()
</script>
<template>
<div class="flex h-[64px] cursor-pointer items-center justify-center px-2">
<div
class="h-[32px] w-[32px] shrink-0 bg-[url('https://gsst-poe-sit.gz.bcebos.com/data/20240911/1726041369632.webp')] bg-cover"
></div>
<div
class="truncate pl-[8px] text-lg font-semibold transition"
:class="designSettingStore.isMenuCollapse ? 'w-0 !pl-0' : ''"
>
{{ appConfig.appTitle }}
</div>
</div>
</template>
<script setup lang="ts">
import { sidebarMenus } from '@/router/index'
import { useDesignSettingStore } from '@/store/modules/design-setting'
import SidebarLogo from '../sidebar-logo/sidebar-logo.vue'
// import { type MenuOption } from '@/router/utils'
import { useRoute, useRouter } from 'vue-router'
import { ref, watch } from 'vue'
import EllipsisTooltipText from '@/components/ellipsis-tooltip-text.vue'
const designSettingStore = useDesignSettingStore()
const currentRoute = useRoute()
const router = useRouter()
const menuValue = ref(currentRoute.meta.key)
watch(
() => currentRoute.fullPath,
() => {
menuValue.value = currentRoute.meta.key
},
)
// function handleUpdateValue(_key: string, menuItemOption: MenuOption) {
// router.push({ name: menuItemOption.routeName })
// // menuValue.value = key
// }
function handleLogoClick() {
router.push({ name: 'Root' })
}
function handleMenuItemClick(routeName: any) {
console.log('💥💥💥💥💥💥jtest💥💥💥💥💥💥')
console.log(routeName)
// router.push({ name: routeName })
}
</script>
<template>
<div class="sidebar-container flex h-full flex-col">
<SidebarLogo @click="handleLogoClick" />
<div class="flex-1">
<el-scrollbar>
<el-menu
:popper-offset="3"
:default-active="menuValue"
:collapse="designSettingStore.isMenuCollapse"
class="!border-none"
>
<template v-for="menuInfo in sidebarMenus">
<template v-if="!menuInfo.children">
<el-menu-item
:key="menuInfo.key"
:index="menuInfo.key"
class="relative hover:!bg-[unset]"
@click="handleMenuItemClick(menuInfo.routeName)"
>
<span
class="absolute inset-x-[10px] inset-y-[4px] rounded-[6px] bg-[#e5f6fd] opacity-0 transition"
:class="
menuValue === menuInfo.key ? 'opacity-100' : 'group-hover:bg-[#f3f3f5] group-hover:opacity-100'
"
></span>
<i
class="iconfont z-1 pr-[8px] pl-[4px] !text-[16px]"
:class="{
[menuInfo.icon]: true,
'!text-(--el-menu-active-color)': menuValue === menuInfo.key,
'!text-(--el-text-color-primary)': menuValue !== menuInfo.key,
}"
></i>
<template #title>
<EllipsisTooltipText
class="z-1"
:class="
menuValue === menuInfo.key ? '!text-(--el-menu-active-color)' : 'text-(--el-text-color-primary)'
"
>
{{ menuInfo.label }}
</EllipsisTooltipText>
<!-- <el-text class="z-1 !text-(--el-menu-active-color)" truncated></el-text> -->
</template>
</el-menu-item>
</template>
<template v-else>
<el-sub-menu :key="menuInfo.key" :index="menuInfo.key" class="relative hover:!bg-[unset]">
<template #title>
<span
class="menu-bg-panel absolute inset-x-[10px] inset-y-[4px] rounded-[6px] bg-[#e5f6fd] opacity-0 transition"
:class="menuValue === menuInfo.key ? 'opacity-100' : ''"
></span>
<i
class="iconfont z-1 pr-[8px] pl-[4px] !text-[16px]"
:class="{
[menuInfo.icon]: true,
'!text-(--el-menu-active-color)': menuValue === menuInfo.key,
'!text-(--el-text-color-primary)': menuValue !== menuInfo.key,
}"
></i>
<span class="z-1">{{ menuInfo.label }}</span>
</template>
<template v-for="menuChildInfo in menuInfo.children" :key="menuChildInfo.key">
<el-menu-item
:index="menuChildInfo.key"
class="group relative hover:!bg-[unset]"
@click="handleMenuItemClick(menuChildInfo.routeName)"
>
<span
class="absolute inset-x-[10px] inset-y-[4px] rounded-[6px] bg-[#e5f6fd] opacity-0 transition"
:class="
menuValue === menuChildInfo.key
? 'opacity-100'
: 'group-hover:bg-[#f3f3f5] group-hover:opacity-100'
"
></span>
<i
class="iconfont z-1 pr-[8px] pl-[4px] !text-[16px]"
:class="{
[menuChildInfo.icon]: true,
'!text-(--el-menu-active-color)': menuValue === menuChildInfo.key,
'!text-(--el-text-color-primary)': menuValue !== menuChildInfo.key,
}"
></i>
<template #title>
<EllipsisTooltipText
class="z-1"
:class="
menuValue === menuChildInfo.key
? '!text-(--el-menu-active-color)'
: 'text-(--el-text-color-primary)'
"
>
{{ menuChildInfo.label }}
</EllipsisTooltipText>
</template>
</el-menu-item>
</template>
</el-sub-menu>
</template>
</template>
</el-menu>
</el-scrollbar>
</div>
</div>
</template>
<style lang="css" scoped>
.sidebar-container {
/* --el-menu-base-level-padding: 12px; */
:deep(.el-menu .el-sub-menu__title) {
position: relative;
&:hover {
background-color: unset;
.menu-bg-panel {
background-color: #f3f3f5;
opacity: 1;
}
}
}
}
</style>
<script setup lang="ts">
import Sidebar from './components/sidebar/sidebar.vue'
import NavBar from './components/navbar/navbar.vue'
import { useDesignSettingStore } from '@/store/modules/design-setting'
import { ref, watchEffect } from 'vue'
const designSettingStore = useDesignSettingStore()
const layoutSideWidth = ref(210)
watchEffect(() => {
if (designSettingStore.isMenuCollapse) {
layoutSideWidth.value = 64
} else {
layoutSideWidth.value = 210
}
})
</script>
<template>
<el-container class="h-full select-none">
<el-aside
v-show="designSettingStore.sidebarDisplayStatus !== 'hidden'"
class="transition-duration-300 shadow-[2px_0_8px_0_rgba(29,35,41,0.05)] transition-[width] ease-in-out"
:width="`${layoutSideWidth}px`"
>
<Sidebar />
</el-aside>
<el-drawer
v-model="designSettingStore.showSidebarDrawer"
body-class="drawer-body-container"
:with-header="false"
direction="ltr"
:size="210"
>
<Sidebar />
</el-drawer>
<el-container>
<el-header class="!px-0" height="64px">
<NavBar class="h-full" />
</el-header>
<el-main class="main-content-wrapper">
<RouterView v-slot="{ Component }">
<Transition appear name="fade-slide" mode="out-in">
<div>
<Component :is="Component" />
</div>
</Transition>
</RouterView>
</el-main>
</el-container>
</el-container>
</template>
<style lang="css" scoped>
:deep(.el-drawer .drawer-body-container) {
padding: 0;
}
:deep(.layout-content) {
display: flex;
flex-direction: column;
background-color: #f5f7f9;
}
:deep(.main-content-wrapper) {
background-color: #f5f7f9;
}
.fade-slide-leave-active,
.fade-slide-enter-active {
transition: all 0.3s;
}
.fade-slide-enter-from {
opacity: 0;
transform: translateX(-30px);
}
.fade-slide-leave-to {
opacity: 0;
transform: translateX(30px);
}
</style>
import { type App } from 'vue'
import { createI18n } from 'vue-i18n'
import messages from './messages'
const i18n = createI18n({
legacy: false,
locale: 'zh-HK',
fallbackLocale: 'zh-CN',
messages,
})
export function setupI18n(app: App) {
app.use(i18n)
}
buttons:
btnLogin: '登录'
buttons:
btnLogin: '登錄'
import zhHK from './langs/zh-hk.yaml'
import zhCN from './langs/zh-cn.yaml'
const messages: Record<I18n.LangType, I18n.Schema> = {
'zh-HK': zhHK,
'zh-CN': zhCN,
}
export default messages
import { createApp } from 'vue'
import { setupStore } from './store/'
import { setupRouter } from './router'
// import { setupI18n } from './locales'
import App from './app.vue'
import '@/styles/app.css'
import '@/styles/nprogress.css'
// 引入 Tippy.js 的核心、主题和动画CSS
import 'tippy.js/dist/tippy.css'
import 'tippy.js/themes/light-border.css' // 一个漂亮的主题,可选用
import 'tippy.js/animations/scale-subtle.css' // 一个平滑的动画,可选用
async function bootstrap() {
const app = createApp(App)
setupStore(app)
// setupI18n(app)
await setupRouter(app)
app.mount('#app')
}
bootstrap()
import type { Router } from 'vue-router'
import { useUserStore } from '@/store/modules/user'
import NProgress from 'nprogress'
import appConfig from '@/config/app-config.json'
NProgress.configure({ showSpinner: false })
/** 路由白名单 */
const whitePathList = ['/login']
export function createRouterGuards(router: Router) {
router.beforeEach((to) => {
NProgress.start()
const userStore = useUserStore()
if (userStore.isLogin && to.fullPath === '/login') {
return false
}
// 白名单直接跳过
if (whitePathList.includes(to.path)) {
return true
}
// if (!userStore.isLogin && !whitePathList.includes(to.fullPath)) {
// return { path: '/login', query: { redirect: encodeURIComponent(to.fullPath) } }
// }
return true
})
router.afterEach((to) => {
if (to.meta.hiddenTitle) {
document.title = appConfig.appTitle
} else {
document.title = (to.meta.title as string) || appConfig.appTitle
}
NProgress.done()
})
router.onError((error) => {
console.log(error, '--路由错误--')
})
}
import { type App } from 'vue'
import { createRouter, type RouteRecordRaw } from 'vue-router'
import { createRouterGuards } from './guards'
import baseRoutes from './modules/base'
import { getHistoryMode, menuFilterSort } from './utils'
/** 原始静态路由(未做任何处理) */
const routes: RouteRecordRaw[] = []
/* 自动导入全部静态路由,无需再手动引入! */
const modules: Record<string, any> = import.meta.glob(['./modules/**/*.ts', '!./modules/**/base.ts'], {
eager: true,
})
;(function () {
const routesDraft: RouteRecordRaw[] = []
Object.keys(modules).forEach((key) => {
routesDraft.push(modules[key].default)
})
routesDraft.forEach((routesItem) => {
if (Array.isArray(routesItem)) {
routes.push(...routesItem)
} else {
routes.push(routesItem)
}
})
})()
/** 导出处理后的静态路由(三级及以上的路由全部拍成二级) */
// export const constantRoutes: RouteRecordRaw[] = formatTwoStageRoutes(
// formatFlatteningRoutes(ascending(routes.flat(Infinity))),
// )
/** 用于渲染菜单,保持原始层级 */
// export const constantMenus: RouteRecordRaw[] = ascending(routes.flat(Infinity)).concat(...baseRoutes)
export const sidebarMenus = menuFilterSort([...routes])
const router = createRouter({
history: getHistoryMode(import.meta.env.VITE_ROUTER_MODE),
routes: [...routes, ...baseRoutes],
strict: true,
scrollBehavior(_to, from, savedPosition) {
return new Promise((resolve) => {
if (savedPosition) {
return savedPosition
} else {
if (from.meta.saveScrollTop) {
const top: number = document.documentElement.scrollTop || document.body.scrollTop
resolve({ left: 0, top })
}
}
})
},
})
export async function setupRouter(app: App) {
app.use(router)
// 创建路由守卫
createRouterGuards(router)
await router.isReady()
}
import { type RouteRecordRaw } from 'vue-router'
export default [
{
path: '/login',
name: 'Login',
meta: {
rank: 1001,
title: '登录',
},
component: () => import('@/views/login/login.vue'),
},
// {
// path: '/404',
// name: 'NotFound',
// meta: {
// title: '未找到该页面',
// },
// component: () => import('@/views/exception/404.vue'),
// },
{
path: '/500',
name: 'ServerError',
meta: {
rank: 1001,
title: '服务器错误',
},
component: () => import('@/views/exception/500.vue'),
},
{
path: '/:pathMatch(.*)*',
name: 'Universal',
meta: {
rank: 1001,
title: '未找到该页面',
},
component: () => import('@/views/exception/404.vue'),
},
] as RouteRecordRaw[]
import { type RouteRecordRaw } from 'vue-router'
import Layout from '@/layout/index.vue'
import Home from '@/views/home/home.vue'
export default [
{
path: '/',
name: 'Root',
meta: {
rank: 1001,
title: '',
},
component: Layout,
redirect: '/home',
children: [
{
path: '/home',
name: 'Home',
meta: {
rank: 1001,
title: '首页',
icon: 'icon-shouye-zhihui',
},
component: Home,
},
],
},
] as RouteRecordRaw[]
import { nanoid } from 'nanoid/non-secure'
// import { h, type VNode } from 'vue'
import { createWebHashHistory, createWebHistory, type RouteRecordRaw, type RouterHistory } from 'vue-router'
export interface MenuOption {
// label: (() => VNode) | string
label: string
key: string
routeName: string
// icon: (() => VNode) | null
icon: string
children?: MenuOption[]
}
export function getHistoryMode(modeString: ViteEnv['VITE_ROUTER_MODE']): RouterHistory {
if (modeString === 'h5') {
return createWebHistory()
}
return createWebHashHistory()
}
function menuSort(routes: RouteRecordRaw[]) {
routes.sort((a, b) => {
if (!a.meta || !a.meta.rank) {
return 1
}
if (!b.meta || !b.meta.rank) {
return -1
}
return (a.meta.rank as number) - (b.meta.rank as number)
})
return routes
}
export function menuFilterSort(routes: RouteRecordRaw[]) {
function createRouteKey(routes: RouteRecordRaw[]) {
routes.forEach((route, index) => {
if (route.meta) {
route.meta.key = nanoid()
} else {
route.meta = { key: nanoid(), title: '', rank: 1001 + index }
}
if (route.children) {
createRouteKey(route.children)
}
})
}
createRouteKey(routes)
function menuChildrenSort(routes: RouteRecordRaw[]) {
routes.forEach((routeItem) => {
if (routeItem.children) {
const newRouteChildren = menuSort(routeItem.children)
routeItem.children = newRouteChildren
menuChildrenSort(routeItem.children)
}
})
}
menuChildrenSort(routes)
menuSort(routes)
const rootRouteIndex = routes.findIndex((route) => route.name === 'Root')
if (rootRouteIndex >= 0) {
const rootRouteChildren = routes[rootRouteIndex].children || []
routes.splice(rootRouteIndex, 1)
routes.unshift(...rootRouteChildren)
}
function createMenuOptions(routes: RouteRecordRaw[]) {
const menuOptions: MenuOption[] = []
routes.forEach((route) => {
// 菜单Item隐藏判断
if (route.meta?.hideSideMenItem) {
return
}
const menuOption: MenuOption = {
// label: route.meta?.title
// ? () => h(RouterLink, { to: { name: route.name || 'Root' } }, { default: () => route.meta?.title })
// : '-',
label: (route.meta?.title as string) || '-',
key: route.meta?.key as string,
routeName: route.name as string,
// icon: route.meta?.icon ? () => h('i', { class: `iconfont ${route?.meta?.icon as string}` }) : null,
icon: route.meta?.icon || '',
}
if (route.children) {
menuOption.children = createMenuOptions(route.children)
}
menuOptions.push(menuOption)
})
return menuOptions
}
return createMenuOptions(routes)
}
import type { App } from 'vue'
import { createPinia } from 'pinia'
const pinia = createPinia()
export function setupStore(app: App) {
app.use(pinia)
}
import { defineStore } from 'pinia'
export const useAppStore = defineStore('app-store', {
state: () => ({
layoutDevice: 'desktop',
isMenuCollapse: false,
}),
actions: {
toggleLayoutDevice(layoutDevice: 'desktop' | 'mobile') {
if (this.layoutDevice !== layoutDevice) {
this.layoutDevice = layoutDevice
if (layoutDevice === 'mobile') {
this.isMenuCollapse = true
}
}
},
toggleMenuCollapse(isCollapse: boolean) {
if (this.isMenuCollapse !== isCollapse) {
this.isMenuCollapse = isCollapse
}
},
},
})
import { defineStore } from 'pinia'
export const useDesignSettingStore = defineStore('design-setting-store', {
state: () => ({
sidebarDisplayStatus: 'expand', // status: 'expand' | 'collapse' | 'hidden'
isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
isMobileLayout: false,
showSidebarDrawer: false,
}),
getters: {
isMenuCollapse: (state) => {
return state.sidebarDisplayStatus === 'collapse'
},
},
actions: {
toggleSidebarDisplayStatus(status: 'expand' | 'collapse' | 'hidden') {
this.sidebarDisplayStatus = status
},
toggleIsMobileLayout(result: boolean) {
this.isMobileLayout = result
},
changeShowSidebarDrawer(result: boolean) {
this.showSidebarDrawer = result
},
},
})
import { defineStore } from 'pinia'
import { ss } from '@/utils/storage'
import { STORAGE_KEYS } from '@/utils/storage-key'
import type { UserState, UserInfo } from '../types/user'
function getDefaultUserInfo(): UserInfo {
return {
account: '',
userAccount: '',
userId: null,
userName: '用户',
createdTime: '',
avatar: '',
}
}
export const useUserStore = defineStore('user-store', {
state: (): UserState => ({
isLogin: ss.get(STORAGE_KEYS.IS_LOGIN),
token: ss.get(STORAGE_KEYS.TOKEN) || '',
userInfo: ss.get(STORAGE_KEYS.USER_INFO) || getDefaultUserInfo(),
}),
actions: {
async logout() {
this.isLogin = false
this.token = ''
this.userInfo = getDefaultUserInfo()
ss.remove(STORAGE_KEYS.IS_LOGIN)
ss.remove(STORAGE_KEYS.TOKEN)
ss.remove(STORAGE_KEYS.USER_INFO)
},
updateIsLogin(status: boolean) {
this.isLogin = status
ss.set(STORAGE_KEYS.IS_LOGIN, status)
},
updateToken(token: string) {
this.token = token
ss.set(STORAGE_KEYS.TOKEN, token)
},
updateUserInfo(userInfo: UserInfo) {
this.userInfo = userInfo
ss.set(STORAGE_KEYS.USER_INFO, userInfo)
},
},
})
export interface UserInfo {
account: string
userAccount: string
userId: null | number
userName: string
createdTime: string
avatar: string
}
export interface UserState {
isLogin: boolean
token: string
userInfo: UserInfo
}
@import 'tailwindcss';
@import './theme.css';
@import './base.css';
@import './utilities.css';
@import './reset.css';
/* @import './element-theme.css'; */
/* @layer base {
} */
:root {
--el-color-primary: green;
}
/* Make clicks pass-through */
#nprogress {
pointer-events: none;
}
#nprogress .bar {
position: fixed;
top: 0;
left: 0;
z-index: 1031;
width: 100%;
height: 2px;
background: var(--el-color-primary);
}
/* Fancy blur effect */
#nprogress .peg {
position: absolute;
right: 0;
display: block;
width: 100px;
height: 100%;
box-shadow:
0 0 10px #29d,
0 0 5px #29d;
opacity: 1;
transform: rotate(3deg) translate(0, -4px);
}
/* Remove these to get rid of the spinner */
#nprogress .spinner {
position: fixed;
top: 15px;
right: 15px;
z-index: 1031;
display: block;
}
#nprogress .spinner-icon {
box-sizing: border-box;
width: 18px;
height: 18px;
border: solid 2px transparent;
border-top-color: #29d;
border-left-color: #29d;
border-radius: 50%;
animation: nprogress-spinner 400ms linear infinite;
}
.nprogress-custom-parent {
position: relative;
overflow: hidden;
}
.nprogress-custom-parent #nprogress .spinner,
.nprogress-custom-parent #nprogress .bar {
position: absolute;
}
@keyframes nprogress-spinner {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes nprogress-spinner {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
html {
box-sizing: border-box;
width: 100%;
height: 100%;
}
body {
width: 100%;
height: 100%;
margin: 0;
}
#app {
width: 100%;
height: 100%;
}
@theme {
--color-theme-color: #00a2ea;
}
@utility flex-center {
@apply flex items-center justify-center;
}
export function isAllEmpty(value: string | number | any[] | AnyObject) {
if (!value && typeof value !== 'number') {
return false
}
switch (typeof value) {
case 'object': {
if (Array.isArray(value)) {
return value.length === 0
} else {
return Object.keys(value).length === 0
}
}
default:
return true
}
}
import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios'
import { BASE_URLS } from '@/config/base-url'
import { useUserStore } from '@/store/modules/user'
import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
interface PagingInfoParams {
pageNo: number
pageSize: number
}
export interface Response<T> {
data: T
message: string | null
code: number
pagingInfo?: PagingInfoParams & { totalPages: number; totalRows: number }
}
const ENV = import.meta.env.VITE_APP_ENV
function handleLogout() {
const router = useRouter()
const currentRoute = router.currentRoute.value
router.replace({ name: 'Login', query: { redirect: encodeURIComponent(currentRoute.fullPath) } })
ElMessage.warning('身份已过期,请重新登录')
}
const service = axios.create({
baseURL: `${BASE_URLS[ENV]}/api`,
timeout: 7000,
headers: {
'Content-Type': 'application/json',
},
})
service.interceptors.request.use(
(config) => {
const token = useUserStore().token
if (token) config.headers['X-Request-Token'] = token
return config
},
(error) => {
return Promise.reject(error.response)
},
)
service.interceptors.response.use(
(response: AxiosResponse) => {
if (response.status === 200) {
return response.data
}
throw new Error(response.status.toString())
},
(error) => {
const response = error.response
// 处理响应错误
if (response && [500, 502].includes(response.status) && window.location.hash === '#/500')
useRouter().push({ name: 'ServerError' })
return Promise.reject(error)
},
)
type RequestOptions = AxiosRequestConfig & { ignoreErrorCheck?: boolean }
function http<T>(
method: 'GET' | 'POST' = 'POST',
url: string,
payload?: { pagingInfo?: PagingInfoParams; [key: string]: any } | null,
options?: RequestOptions,
) {
/* 请求成功处理函数 */
const successHandler = (res: Response<T>): Promise<Response<T>> | Response<T> => {
if (res.code === 0 || options?.ignoreErrorCheck) return res
if (res.code === -10) {
handleLogout()
}
if (res.message) {
const msg = res.message.match(/\[(?<msg>[\s\S]+)\]/)?.groups?.msg
ElMessage.error(msg || res.message)
}
return Promise.reject(res)
}
/* 请求失败处理函数 */
const failHandler = (error: Error) => {
throw new Error(error?.message || 'Error')
}
// 分页参数携带
if (payload?.pagingInfo) {
const { pageNo, pageSize } = payload.pagingInfo
delete payload.pagingInfo
if (pageNo && pageSize) {
if (options) {
if (options.params) {
options.params = { ...options.params, ...{ pageNo, pageSize } }
} else {
options.params = { pageNo, pageSize }
}
} else {
options = { params: { pageNo, pageSize } }
}
}
}
return method === 'GET'
? service.get<any, Response<T>>(url, Object.assign(options || {}, payload || {})).then(successHandler, failHandler)
: service.post<any, Response<T>>(url, payload || null, options || {}).then(successHandler, failHandler)
}
export const request = {
get<T>(url: string, params?: { pagingInfo?: PagingInfoParams; [key: string]: any } | null, options?: RequestOptions) {
return http<T>('GET', url, params, options)
},
post<T>(
url: string,
payload?: { pagingInfo?: PagingInfoParams; [key: string]: any } | null,
options?: RequestOptions,
) {
return http<T>('POST', url, payload, options)
},
}
export enum STORAGE_KEYS {
TOKEN = 'TOKEN',
IS_LOGIN = 'IS_LOGIN',
USER_INFO = 'USER_INFO',
}
interface StorageData<T = any> {
data: T
expire: number | null
}
export function createLocalStorage(options?: { expire?: number | null }) {
const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7
const { expire } = Object.assign({ expire: DEFAULT_CACHE_TIME }, options)
function set<T = any>(key: string, data: T) {
const storageData: StorageData<T> = {
data,
expire: expire !== null ? new Date().getTime() + expire * 1000 : null,
}
const json = JSON.stringify(storageData)
window.localStorage.setItem(key, json)
}
function get(key: string) {
const json = window.localStorage.getItem(key)
if (json) {
let storageData: StorageData | null = null
try {
storageData = JSON.parse(json)
} catch {
// Prevent failure
}
if (storageData) {
const { data, expire } = storageData
if (expire === null || expire >= Date.now()) return data
}
remove(key)
return null
}
}
function remove(key: string) {
window.localStorage.removeItem(key)
}
function clear() {
window.localStorage.clear()
}
return { set, get, remove, clear }
}
export const ls = createLocalStorage()
export const ss = createLocalStorage({ expire: null })
import type { App } from 'vue'
import VueTippy from 'vue-tippy'
export function setupStore(app: App) {
app.use(VueTippy, {
defaultProps: { placement: 'right' },
})
}
/**
* @description 创建层级关系
* @param tree 树
* @param pathList 每一项的id组成的数组
* @returns 创建层级关系后的树
*/
export const buildHierarchyTree = (tree: any[], pathList = []): any => {
if (!Array.isArray(tree)) {
console.warn('tree must be an array')
return []
}
if (!tree || tree.length === 0) return []
for (const [key, node] of tree.entries()) {
node.id = key
node.parentId = pathList.length ? pathList[pathList.length - 1] : null
node.pathList = [...pathList, node.id]
const hasChildren = node.children && node.children.length > 0
if (hasChildren) {
buildHierarchyTree(node.children, node.pathList)
}
}
return tree
}
<script setup lang="ts">
import { useRouter } from 'vue-router'
const router = useRouter()
function handleToHomePage() {
router.replace({ name: 'Root' })
}
</script>
<template>
<div class="h-screen overflow-hidden">
<div class="absolute top-10 left-10">
<el-button type="primary" @click="handleToHomePage">返回首页</el-button>
</div>
<div class="flex h-full items-center justify-center">
<img
class="w-10/12 transition-[width] duration-200 ease-linear sm:w-5/12"
src="@/assets/svgs/404.svg"
alt="404"
/>
</div>
</div>
</template>
<script setup lang="ts">
import { useRouter } from 'vue-router'
const router = useRouter()
function handleToHomePage() {
router.replace({ name: 'Root' })
}
</script>
<template>
<div class="h-screen overflow-hidden">
<div class="absolute top-10 left-10">
<el-button type="primary" @click="handleToHomePage">返回首页</el-button>
</div>
<div class="flex h-full items-center justify-center">
<img
class="w-10/12 transition-[width] duration-200 ease-linear sm:w-5/12"
src="@/assets/svgs/500.svg"
alt="500"
/>
</div>
</div>
</template>
<script setup lang="ts"></script>
<template>
<div>首页内容区</div>
</template>
<script setup lang="ts"></script>
<template>
<div>登陆页面</div>
</template>
export default {
extends: ['stylelint-config-standard', 'stylelint-config-recess-order', 'stylelint-config-recommended-vue'],
plugins: ['stylelint-order'],
rules: {
'color-function-notation': 'legacy',
'font-family-name-quotes': null,
'font-family-no-missing-generic-family-keyword': null,
'alpha-value-notation': 'number',
'selector-class-pattern': null,
'at-rule-no-unknown': [
true,
{
ignoreAtRules: ['tailwind', 'apply', 'variants', 'utility', 'reference', 'theme'],
},
],
'import-notation': 'string',
'at-rule-no-deprecated': [
true,
{
ignoreAtRules: ['apply'],
},
],
'custom-property-pattern': null,
},
}
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
/* Linting */
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"],
"@build/*": ["build/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "types/**/*.d.ts"]
}
{
"files": [],
"references": [
{
"path": "./tsconfig.app.json"
},
{
"path": "./tsconfig.node.json"
}
]
}
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"strict": true,
"noEmit": true
},
"include": ["types/**/*.d.ts", "build/**/*.ts", "vite.config.ts"]
}
// declare interface Window {}
type Recordable<T = any> = Record<string, T>
declare type AnyObject = { [k: string]: any }
declare namespace I18n {
type LangType = 'zh-HK' | 'zh-CN'
type Schema = {
buttons: {
btnLogin: string
}
}
}
declare module '*.yaml' {
const value: I18n.Schema
export default value
}
import 'vue-router'
export {}
declare module 'vue-router' {
interface RouteMeta {
rank: number
title: string
icon?: string
}
}
/// <reference types="vite/client" />
declare interface ViteEnv {
readonly VITE_APP_ENV: 'DEV' | 'PROD'
readonly VITE_PORT: number
readonly VITE_PUBLIC_PATH: string
readonly VITE_ROUTER_MODE: 'hash' | 'h5'
readonly VITE_VITEST: boolean
readonly VITE_HIDE_HOME: boolean
}
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
interface ImportMetaEnv extends ViteEnv {}
interface ImportMeta {
readonly env: ImportMetaEnv
}
import { defineConfig, loadEnv } from 'vite'
import { resolve } from 'node:path'
import { wrapperEnv } from './build'
import { setupPlugins } from './build/plugins'
/** 当前执行node命令时文件夹的地址(工作目录) */
const root: string = process.cwd()
/** 路径查找 */
const pathResolve = (dir: string): string => {
return resolve(__dirname, '.', dir)
}
export default defineConfig(({ command, mode }) => {
const isBuild = command === 'build'
const envConf = wrapperEnv(loadEnv(mode, root))
return {
base: envConf.VITE_PUBLIC_PATH,
resolve: {
alias: {
'@': pathResolve('src'),
'@build': pathResolve('build'),
},
},
plugins: setupPlugins(isBuild, envConf, pathResolve),
server: {
host: true,
port: envConf.VITE_PORT,
},
}
})
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment