feat: add web application

This commit is contained in:
richjohnrambo
2026-10-10 20:55:59 +08:00
parent 3eb5d78875
commit 50fcfd2d3d
571 changed files with 73992 additions and 135 deletions
+40 -133
View File
@@ -1,165 +1,72 @@
# ---> Go
# If you prefer the allow list template instead of the deny list, see community template:
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
#
# Binaries for programs and plugins
# Go binaries and test/build artifacts
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
# Go workspace file
go.work
go.work.sum
# env file
.env
# ---> Node
# Logs
logs
# Node dependencies, logs, caches, and build output
node_modules/
jspm_packages/
web_modules/
logs/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
coverage/
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.nyc_output/
.grunt/
bower_components/
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
build/Release/
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.npm/
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.rpt2_cache_cjs/
.rpt2_cache_es/
.rpt2_cache_umd/
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
.cache/
.parcel-cache/
.next/
out/
.nuxt/
dist/
.temp/
**/.vitepress/dist/
**/.vitepress/cache/
.docusaurus/
.serverless/
.fusebox/
.dynamodb/
.tern-port
.vscode-test/
.yarn/cache/
.yarn/unplugged/
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# dotenv environment variable files
# Local environment files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# vitepress build output
**/.vitepress/dist
# vitepress cache directory
**/.vitepress/cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# Local OS and editor metadata
.DS_Store
.idea/
.vscode/
+960
View File
@@ -0,0 +1,960 @@
# HotGo 项目开发规范
**生成或修改任何代码前,必须完整阅读本文档。**
本规范是项目唯一事实来源,所有新增代码必须严格对齐现有模块风格,不得自创新的代码模式。
---
## 技术栈
| 层 | 技术 |
|----|----------------------------------------------------------------|
| 后端语言 | Go,module 名 `hotgo` |
| 后端框架 | GoFrame v2(gdb、ghttp、gcron、gerror、gctx、gerror、gjson、gvar) |
| 前端框架 | Vue 3 + Vite + TypeScript |
| UI 组件库 | **Naive UI**(优先使用,未经允许不得引入其他 UI 库) |
| 状态管理 | Pinia |
| HTTP 客户端 | 项目封装 `@/utils/http/axios`(`http.request`),禁止直接使用 axios |
---
## 后端目录结构
```
server/
├── addons/ # 插件模块(每个插件独立微架构,见"插件开发"章节)
│ ├── modules/ # 隐式注册文件(每个插件一个 .go,仅含 import)
│ └── <addonName>/ # 插件目录,与主模块结构镜像
├── api/admin/<module>/ # 主模块 HTTP 契约:Req/Res + g.Meta 路由声明
├── internal/
│ ├── consts/ # 全局常量与字典选项(枚举在此定义并注册)
│ ├── global/ # 全局公用变量(谨慎添加,尽量少用)
│ ├── controller/admin/sys/ # 薄控制器,只做参数透传,不含业务逻辑
│ ├── crons/ # 主模块定时任务注册与处理
│ ├── queues/ # 主模块消息队列消费者注册与处理
│ ├── logic/sys/ # 业务实现(sSysXxx),init() 注册到 service
│ ├── library/ # 内部基础库(addons、dict、hgorm、cache、queue、cron 等)
│ ├── service/ # 接口声明(ISysXxx)+ 注册函数
│ ├── dao/ # 对外 DAO;internal/dao/internal/ 为 CLI 生成,禁止手改
│ ├── model/
│ │ ├── entity/ # 表结构体(CLI 生成,禁止手改)
│ │ ├── do/ # ORM 写入结构(CLI 生成,禁止手改)
│ │ └── input/sysin/ # 业务入参、出参、过滤结构
│ └── router/
│ ├── admin.go # 主路由,末尾调用 genrouter.Register()
│ └── genrouter/ # 每个生成模块一个文件,init() 追加到 LoginRequiredRouter
├── resource/
│ ├── generate/default/curd/ # 主模块 CRUD 代码生成模板(参考,禁止直接修改)
│ └── generate/default/addon/ # 插件脚手架代码生成模板(参考,禁止直接修改)
└── utility/ # 通用工具:convert、excel、validate 等
```
---
## 后端分层约定
### 分层职责(禁止跨层调用)
```
api(HTTP契约) → controller(参数透传) → service(接口) → logic(业务实现) → dao(数据访问)
```
- **controller 层**:不写任何业务逻辑,只转调 service
- **logic 层**:不出现 HTTP 相关代码,所有校验通过 `Filter()` 或 `g.Validator()` 完成
- **dao 层**:`internal/dao/internal/` 由 CLI 自动生成,禁止手改
---
### 1. API 层 `api/admin/<module>/<module>.go`
- 每个接口一对 `XxxReq` / `XxxRes`,`g.Meta` 声明路由
- GET 接口用 `method:"get"`,写操作用 `method:"post"`
- 请求体嵌入 `sysin.XxxInp`,响应体嵌入对应 Model 或空 `struct{}`
```go
type ListReq struct {
g.Meta `path:"/xxxModule/list" method:"get" tags:"XXX模块" summary:"获取XXX列表"`
sysin.XxxListInp
}
type ListRes struct {
form.PageRes
List []*sysin.XxxListModel `json:"list" dc:"数据列表"`
}
```
### 2. Controller 层 `internal/controller/admin/sys/<module>.go`
- 变量:`var XxxModule = cXxxModule{}`,类型:`type cXxxModule struct{}`
- 只做参数转发和结果组装,禁止直接操作 dao 或写业务逻辑
```go
func (c *cXxxModule) List(ctx context.Context, req *xxxmodule.ListReq) (res *xxxmodule.ListRes, err error) {
list, totalCount, err := service.SysXxxModule().List(ctx, &req.XxxListInp)
if err != nil {
return
}
if list == nil {
list = []*sysin.XxxListModel{}
}
res = new(xxxmodule.ListRes)
res.List = list
res.PageRes.Pack(req, totalCount)
return
}
```
### 3. Service 层 `internal/service/sys.go`
- 在已有文件中**追加**接口声明和注册函数,禁止新建文件
- 声明 `ISysXxxModule` 接口,提供 `SysXxxModule()` 获取函数和 `RegisterSysXxxModule()` 注册函数
### 4. Logic 层 `internal/logic/sys/<module>.go`
- 结构体:`type sSysXxxModule struct{}`
- `init()` 里调用 `service.RegisterSysXxxModule(NewSysXxxModule())`
- `Model()` 方法:`return handler.Model(dao.XxxTable.Ctx(ctx), option...)`
- 列名引用必须用 `dao.XxxTable.Columns().FieldName`,禁止硬编码字符串字段名
- `Edit` 方法以 `in.Id > 0` 区分更新/新增,更新用 `XxxUpdateFields`,新增用 `XxxInsertFields`
- 字段校验在 `sysin` 的 `Filter(ctx)` 方法完成,logic 层不重复校验
### 5. Model 层 `internal/model/input/sysin/<module>.go`
| 类型 | 用途 |
|------|------|
| `XxxUpdateFields` | 更新时字段白名单 |
| `XxxInsertFields` | 新增时字段白名单 |
| `XxxEditInp` | 嵌入 `entity.XxxTable`,含 `Filter()` 校验方法 |
| `XxxListInp` | 列表查询入参,嵌入 `form.PageInp` |
| `XxxListModel` | 列表返回字段 |
| `XxxViewInp` / `XxxViewModel` | 详情入参/出参 |
| `XxxDeleteInp` | 删除入参(通常含 `Ids []int64`) |
| `XxxStatusInp`、`XxxMaxSortInp` 等 | 其他操作 |
### 6. 路由注册 `internal/router/genrouter/<module>.go`
```go
package genrouter
import "hotgo/internal/controller/admin/sys"
func init() {
LoginRequiredRouter = append(LoginRequiredRouter, sys.XxxModule) // XXX模块
}
```
新建此文件即可,`genrouter/init.go` 通过 `init()` 链自动加载,无需修改 `admin.go`。
---
## 字典与枚举规范
**字典由后端统一维护**,前端通过固定接口拉取,禁止在前端硬编码枚举值。
### 后端:定义与注册(`internal/consts/` 下对应文件)
```go
// 1. 定义常量
const (
XxxStatusEnabled = 1 // 启用
XxxStatusDisable = 2 // 禁用
)
// 2. 定义选项(选择合适的样式函数)
var XxxStatusOptions = []*model.Option{
dict.GenSuccessOption(XxxStatusEnabled, "启用"),
dict.GenWarningOption(XxxStatusDisable, "禁用"),
}
// 3. 在 init() 中注册(同文件)
func init() {
dict.RegisterEnums("XxxStatusOptions", "XXX状态选项", XxxStatusOptions)
}
```
**样式函数选择规则:**
| 函数 | 适用场景 |
|------|---------|
| `dict.GenSuccessOption` | 正常、启用、成功 |
| `dict.GenWarningOption` | 待处理、禁用、警告 |
| `dict.GenErrorOption` | 失败、封禁、危险 |
| `dict.GenInfoOption` | 信息类、中性状态 |
| `dict.GenPrimaryOption` | 主要操作、强调 |
| `dict.GenDefaultOption` | 默认、无特殊含义 |
| `dict.GenHashOption` | 不确定数量的动态枚举 |
### 后端:Logic 层中使用字典
```go
// 获取标签文本
label := dict.GetOptionLabel(consts.XxxStatusOptions, in.Status)
// 校验是否为合法值
if !dict.HasOptionKey(consts.XxxStatusOptions, in.Status) {
return gerror.New("状态值不合法")
}
```
### 前端:加载与使用字典
**加载**(在 `model.ts` 的 `loadOptions()` 中):
```ts
export function loadOptions() {
dict.loadOptions(['XxxStatusOptions', 'sys_normal_disable']);
}
```
**在 `model.ts` 的 columns 中渲染字典标签:**
```ts
import { useDictStore } from '@/store/modules/dict';
const dict = useDictStore();
// columns 中
{
title: '状态',
key: 'status',
render(row) {
return dict.getLabel('XxxStatusOptions', row.status);
}
}
```
**在搜索表单 schemas 中使用字典下拉:**
```ts
{
field: 'status',
component: 'NSelect',
label: '状态',
componentProps: {
options: computed(() => dict.getOptions('XxxStatusOptions')),
placeholder: '请选择状态',
},
}
```
---
## 插件(Addon)开发规范
> 定位:独立、临时性、工具类型的功能推荐插件化开发,例如小游戏、广告管理、文章管理、小程序、微商城等。插件之间完全隔离,方便多项目复用。
### 插件目录结构
每个插件拥有完整的独立微架构,与主模块结构镜像,但 **包路径前缀为 `hotgo/addons/<addonName>/`**:
```
server/addons/<addonName>/
├── main.go # 插件入口:定义 module 结构体,实现 Module 接口,init() 注册
├── global/
│ ├── global.go # 插件级全局变量
│ └── init.go # Init(ctx, skeleton),GetSkeleton() 方法
├── api/
│ ├── admin/ # 后台接口契约(同主模块 api 写法)
│ ├── api/ # 前台 API 接口契约
│ └── home/ # 首页接口契约(如有)
├── controller/
│ ├── admin/sys/ # 后台薄控制器
│ ├── api/ # 前台控制器
│ └── home/ # 首页控制器(如有)
├── logic/
│ ├── logic.go # 匿名导入各 logic 子包触发 init()
│ └── sys/ # 业务实现(同主模块 logic 写法)
├── service/ # 插件内接口声明与注册(独立,不与主模块 service 混用)
├── model/
│ └── input/sysin/ # 插件内入参/出参(调用主模块服务时继承主模块 input 结构)
├── router/
│ ├── admin.go # 注册后台路由,使用 addons.RouterPrefix() 获取路由前缀
│ ├── api.go # 注册前台路由
│ ├── home.go # 注册首页路由(如有)
│ ├── websocket.go # 注册 WebSocket 路由(如有)
│ └── genrouter/
│ ├── init.go # 插件版 genrouter:Register() 使用插件前缀
│ └── *.go # 每个生成模块一个文件,追加到插件 LoginRequiredRouter
├── consts/ # 插件内常量与字典(同主模块 consts 写法)
├── crons/ # 插件定时任务(可选)
├── queues/ # 插件消息队列消费者(可选)
└── resource/ # 插件静态资源与模板(可选)
```
**对应前端目录:**
```
web/src/
├── api/addons/<addonName>/ # 插件前端 API 封装
└── views/addons/<addonName>/ # 插件前端页面
```
### 插件入口 `main.go`
```go
package <addonName>
import (
"context"
"github.com/gogf/gf/v2/net/ghttp"
_ "hotgo/addons/<addonName>/crons"
"hotgo/addons/<addonName>/global"
_ "hotgo/addons/<addonName>/logic"
_ "hotgo/addons/<addonName>/queues"
"hotgo/addons/<addonName>/router"
"hotgo/internal/library/addons"
"hotgo/internal/service"
"sync"
)
type module struct {
skeleton *addons.Skeleton
ctx context.Context
sync.Mutex
}
func init() { newModule() }
func newModule() {
m := &module{
skeleton: &addons.Skeleton{
Label: "插件显示名",
Name: "<addonName>", // 与目录名一致
Group: 1,
Brief: "简介",
Description: "详细描述",
Author: "作者",
Version: "v1.0.0",
},
ctx: gctx.New(),
}
addons.RegisterModule(m)
}
func (m *module) Start(option *addons.Option) (err error) {
global.Init(m.ctx, m.skeleton)
option.Server.Group("/", func(group *ghttp.RouterGroup) {
group.Middleware(service.Middleware().Addon)
router.Admin(m.ctx, group)
router.Api(m.ctx, group)
})
return
}
// 其余方法:Stop、Ctx、GetSkeleton、Install、Upgrade、UnInstall(默认留空)
```
### 插件路由前缀规则
```
后台:/admin/<addonName>/接口路径 → 对应 controller/admin/sys/
前台:/api/<addonName>/接口路径 → 对应 controller/api/
首页:/home/<addonName>/接口路径 → 对应 controller/home/
WebSocket:/socket/<addonName>/接口路径
```
路由前缀通过 `addons.RouterPrefix(ctx, consts.AppAdmin, global.GetSkeleton().Name)` 自动生成,**禁止在路由文件里硬编码路径前缀**。
### 插件 genrouter 与主模块的区别
插件 `genrouter/init.go` 的 `Register()` 函数需要传入 `ctx` 和 `group`,并使用插件路由前缀:
```go
// 插件 genrouter/init.go
func Register(ctx context.Context, group *ghttp.RouterGroup) {
prefix := addons.RouterPrefix(ctx, consts.AppAdmin, global.GetSkeleton().Name)
group.Group(prefix, func(group *ghttp.RouterGroup) {
group.Middleware(service.Middleware().AdminAuth)
if len(LoginRequiredRouter) > 0 {
group.Bind(LoginRequiredRouter...)
}
})
}
// 插件 genrouter/<module>.go
func init() {
LoginRequiredRouter = append(LoginRequiredRouter, sys.XxxModule)
}
```
参考实现:`server/addons/hgexample/router/genrouter/`
### 插件调用主模块服务
**在插件 input 层继承主模块 input 结构,解耦参数依赖**,避免 import cycle:
```go
// 插件 model/input/sysin/config.go
package sysin
import "hotgo/internal/model/input/sysin"
type UpdateConfigInp struct {
sysin.UpdateAddonsConfigInp
}
```
```go
// 插件 logic 中调用主模块服务
import isc "hotgo/internal/service"
func (s *sSysConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateConfigInp) error {
in.UpdateAddonsConfigInp.AddonName = global.GetSkeleton().Name
return isc.SysAddonsConfig().UpdateConfigByGroup(ctx, in.UpdateAddonsConfigInp)
}
```
### 插件获取自身信息
```go
// 插件内部
global.GetSkeleton()
// 任意位置判断当前请求是否为插件请求
contexts.IsAddonRequest(ctx)
contexts.GetAddonName(ctx)
```
### 插件隐式注册
在 `server/addons/modules/` 下新建 `<addonName>.go`,内容仅含一行匿名导入:
```go
package modules
import _ "hotgo/addons/<addonName>"
```
### 新增插件检查清单
**后端:**
- [ ] `addons/<addonName>/main.go` — 插件入口,实现 Module 接口
- [ ] `addons/<addonName>/global/` — global.go + init.go
- [ ] `addons/modules/<addonName>.go` — 隐式注册
- [ ] `addons/<addonName>/service/` — 插件内接口声明(独立包)
- [ ] `addons/<addonName>/logic/logic.go` — 匿名导入触发 init()
- [ ] `addons/<addonName>/logic/sys/<module>.go` — 业务实现
- [ ] `addons/<addonName>/model/input/sysin/<module>.go` — 入参/出参
- [ ] `addons/<addonName>/api/admin/<module>/<module>.go` — API 契约
- [ ] `addons/<addonName>/controller/admin/sys/<module>.go` — 薄控制器
- [ ] `addons/<addonName>/router/admin.go` — 路由注册
- [ ] `addons/<addonName>/router/genrouter/init.go` — 插件 genrouter
- [ ] `addons/<addonName>/router/genrouter/<module>.go` — 模块路由追加
**前端:**
- [ ] `web/src/api/addons/<addonName>/index.ts` — API 封装
- [ ] `web/src/views/addons/<addonName>/model.ts` — State、schemas、columns
- [ ] `web/src/views/addons/<addonName>/index.vue` — 列表页
- [ ] `web/src/views/addons/<addonName>/edit.vue` — 编辑页
参考实现:`server/addons/hgexample/`(完整插件示例)、`server/resource/generate/default/addon/`(生成模板)
---
## 标准 CRUD 接口清单
| 接口 | method | 说明 |
|------|--------|------|
| `/xxx/list` | GET | 分页列表 |
| `/xxx/view` | GET | 详情 |
| `/xxx/edit` | POST | 新增/编辑(id>0 为编辑) |
| `/xxx/delete` | POST | 删除(支持批量,传 ids) |
| `/xxx/status` | POST | 启用/禁用状态切换 |
| `/xxx/switch` | POST | 开关字段切换 |
| `/xxx/maxSort` | GET | 获取最大排序值 |
| `/xxx/export` | GET | 导出列表 |
按实际需求裁剪,不强制全部实现。
---
## 前端目录结构
```
web/src/
├── api/<module>/index.ts # HTTP 请求封装
├── views/<module>/
│ ├── index.vue # 列表页
│ ├── edit.vue # 新增/编辑弹窗
│ └── model.ts # State 类、rules、schemas、columns、loadOptions
├── components/ # 通用组件(BasicTable、BasicForm、BasicModal 等)
├── store/modules/dict.ts # 字典 store(loadOptions、getLabel、getOptions)
└── utils/
├── http/axios.ts # HTTP 封装(http.request / jumpExport)
└── dateUtil.ts # 日期工具(defRangeShortcuts 等)
```
---
## 前端编码约定
### API 文件 `api/<module>/index.ts`
- 使用 `http.request`,禁止直接使用 axios
- 函数名与接口语义一致:`List`、`Edit`、`Delete`、`View`、`Status`、`Switch`、`Export`、`MaxSort`
- 导出接口用 `jumpExport('/xxx/export', params)`
```ts
import { http, jumpExport } from '@/utils/http/axios';
export function List(params) {
return http.request({ url: '/xxxModule/list', method: 'get', params });
}
export function Edit(params) {
return http.request({ url: '/xxxModule/edit', method: 'POST', params });
}
export function Export(params) {
jumpExport('/xxxModule/export', params);
}
```
### model.ts 结构
- `class State`:属性与后端 entity 字段对应,提供合理默认值
- `newState()`:工厂函数,支持深拷贝(`cloneDeep`)
- `rules`:Naive UI 表单校验规则
- `schemas`:搜索栏 `FormSchema[]`(`ref` 包装)
- `columns`:表格列定义,含权限守卫的操作用 `hasPermission(['/xxx/edit'])`
- `loadOptions()`:调用 `dict.loadOptions([...])`,预加载字典数据
### 组件使用规范
**必须优先使用 Naive UI 原生组件**,能用 Naive UI 实现的禁止自行封装替代组件:
| 场景 | 必须使用的组件 |
|------|--------------|
| 表格 | 项目封装 `BasicTable`(基于 Naive UI) |
| 表单 | 项目封装 `BasicForm`(基于 Naive UI) |
| 弹窗 | `n-modal` 或项目封装 `BasicModal` |
| 按钮 | `n-button`,类型用 `primary`/`default`/`error` 等语义值 |
| 选择器 | `n-select`(字典下拉)、`n-tree-select`(树形) |
| 开关 | `n-switch`,配合 Switch 接口 |
| 输入框 | `n-input` |
| 日期选择 | `n-date-picker`,范围选择配合 `defRangeShortcuts()` |
| 图片渲染 | `renderImage(url)` |
| 文件渲染 | `renderFile(url)` |
| 成员信息 | `renderPopoverMemberSumma(summa)` |
**禁止行为:**
- 禁止引入 Element Plus、Ant Design Vue 等其他 UI 库
- 禁止使用内联 style(使用 Naive UI 的 props 或 class)
- 禁止在模板里硬编码字典值文本,必须通过 `dict.getLabel()` 渲染
### 权限控制
```ts
import { usePermission } from '@/hooks/web/usePermission';
const { hasPermission } = usePermission();
// 模板中
v-if="hasPermission(['/xxxModule/edit'])"
// columns 中开关操作
disabled: !hasPermission(['/xxxModule/switch'])
```
权限标识与后端路由路径保持一致,**路由由后端菜单数据驱动,禁止在源码里硬编码路由路径**。
### Vue 3 代码规范
- 使用 Composition API(`<script setup>`)
- 响应式数据用 `ref` / `reactive`,计算属性用 `computed`
- 字典选项传给组件时用 `computed(() => dict.getOptions('XxxOptions'))`,保持响应式
---
## 新增 CRUD 模块检查清单
**后端(必须全部完成,顺序建议从下往上):**
- [ ] `internal/consts/<module>.go` — 常量定义、选项变量、`init()` 注册字典
- [ ] 使用 goframe CLI 生成:`entity`、`do`、`dao/internal`、`dao`(禁止手写)
- [ ] `internal/model/input/sysin/<module>.go` — 入参/出参/过滤模型
- [ ] `internal/service/sys.go` — 追加接口声明与注册函数
- [ ] `internal/logic/sys/<module>.go` — 业务实现
- [ ] `internal/controller/admin/sys/<module>.go` — 薄控制器
- [ ] `api/admin/<module>/<module>.go` — API 契约
- [ ] `internal/router/genrouter/<module>.go` — 路由注册(`LoginRequiredRouter` 追加)
**前端(必须全部完成):**
- [ ] `web/src/api/<module>/index.ts` — HTTP 封装
- [ ] `web/src/views/<module>/model.ts` — State、schemas、columns、rules、loadOptions
- [ ] `web/src/views/<module>/index.vue` — 列表页
- [ ] `web/src/views/<module>/edit.vue` — 编辑页
---
## 参考实现
**所有新模块必须严格对齐以下文件的风格,生成前请逐一阅读:**
**主模块 CRUD 参考:**
| 文件 | 说明 |
|------|------|
| `server/internal/consts/status.go` | 字典常量定义与注册标准写法 |
| `server/api/admin/curddemo/curddemo.go` | API 契约标准写法 |
| `server/internal/controller/admin/sys/curd_demo.go` | 薄控制器标准写法 |
| `server/internal/logic/sys/curd_demo.go` | Logic 标准写法(含关联查询、导出、字段过滤) |
| `server/internal/model/input/sysin/curd_demo.go` | 入参/出参模型标准写法 |
| `server/internal/router/genrouter/curd_demo.go` | 主模块路由注册标准写法 |
| `web/src/api/curdDemo/index.ts` | 前端 API 封装标准写法 |
| `web/src/views/curdDemo/model.ts` | 前端 model 标准写法(含字典加载) |
| `web/src/views/curdDemo/index.vue` | 列表页标准写法 |
| `web/src/views/curdDemo/edit.vue` | 编辑页标准写法 |
**插件参考(以 hgexample 为标准):**
| 文件 | 说明 |
|------|------|
| `server/addons/hgexample/main.go` | 插件入口标准写法 |
| `server/addons/hgexample/global/init.go` | 插件 global 标准写法 |
| `server/addons/hgexample/router/admin.go` | 插件路由注册标准写法 |
| `server/addons/hgexample/router/genrouter/init.go` | 插件 genrouter 标准写法 |
| `server/addons/hgexample/router/genrouter/tenant_order.go` | 插件模块路由追加标准写法 |
| `server/addons/hgexample/logic/sys/tenant_order.go` | 插件业务逻辑标准写法 |
| `server/addons/hgexample/logic/sys/config.go` | 插件调用主模块服务标准写法 |
代码生成模板:
- 主模块 CRUD:`server/resource/generate/default/curd/`
- 插件脚手架:`server/resource/generate/default/addon/`
以上模板可参考逻辑,**禁止直接修改模板文件**。
---
## 错误处理规范
### 基本原则
- 业务错误直接用 `gerror.New("描述清晰的中文信息")` 返回,GoFrame 框架会统一处理响应码
- 错误信息要面向用户,清晰说明**发生了什么**,而不是堆栈路径
### 错误创建方式
```go
import "github.com/gogf/gf/v2/errors/gerror"
// 普通业务错误(最常用)
return gerror.New("用户名已存在")
// 包装底层错误,追加上下文(调用第三方/dao 层出错时使用)
if err := dao.User.Ctx(ctx).Data(data).Insert(); err != nil {
return gerror.Wrap(err, "创建用户失败")
}
// 带格式化参数
return gerror.Newf("订单 %d 状态不合法,当前状态:%d", in.Id, order.Status)
```
### 错误传递原则
- **logic 层**:遇到底层错误用 `gerror.Wrap` 追加上下文后返回;纯业务校验失败用 `gerror.New` 直接返回
- **controller 层**:直接 `return` 透传 logic 的 error,**不再包装**,不打印日志(框架统一处理)
- **禁止**在 controller 层 `fmt.Println(err)` 或 `g.Log().Error` 打印已经会被框架记录的错误
---
## 缓存使用规范
### 统一使用 `cache.Instance()`
**禁止直接调用 `g.Redis().Do()`**,项目统一通过 `cache.Instance()` 操作缓存,底层适配器(Memory / Redis / File)由配置决定,业务层无需关心。
```go
import (
"hotgo/internal/library/cache"
"github.com/gogf/gf/v2/os/gcache"
"time"
)
// 设置缓存(带过期时间)
err := cache.Instance().Set(ctx, "user:info:1", userInfo, 30*time.Minute)
// 获取缓存
val, err := cache.Instance().Get(ctx, "user:info:1")
if err != nil || val.IsNil() {
// 缓存未命中,查数据库
}
// 删除缓存
_, err = cache.Instance().Remove(ctx, "user:info:1")
// GetOrSet:缓存不存在时自动执行函数并写入(推荐用于只读类缓存)
val, err := cache.Instance().GetOrSet(ctx, "user:info:1", func(ctx context.Context) (interface{}, error) {
return dao.AdminMember.Ctx(ctx).Where(...).One()
}, 30*time.Minute)
```
### 缓存 Key 命名规范
- 格式:`模块:实体:唯一标识`,例如:`user:info:1`、`config:site:basic`、`dict:options:XxxStatus`
- 同一模块的 Key 统一在 `internal/consts/cache.go`(或对应模块的 consts 文件)中定义为常量,禁止散落在 logic 里硬编码
- 插件缓存 Key 加插件名前缀:`hgexample:order:1`
### 缓存使用原则
- 更新或删除数据后,**主动清除**相关缓存,不依赖过期自动失效
- 缓存时间:频繁更新的数据(配置、状态)用较短时间(5~30 分钟);基本不变的数据(字典、枚举)可用更长时间
- 缓存穿透场景:查询结果为空时也写入短时缓存(如 1 分钟)防止击穿
---
## 日志规范
### 日志级别选择
| 级别 | 方法 | 适用场景 |
|------|------|---------|
| Info | `g.Log().Info` / `g.Log().Infof` | 正常业务流程的关键节点(登录成功、订单创建、支付回调等) |
| Warning | `g.Log().Warning` / `g.Log().Warningf` | **遇到错误但不影响主流程**(重试、降级、外部服务异常、非致命校验失败) |
| Panic | `g.Log().Panic` / `g.Log().Panicf` | 极其严重、必须立即终止的情况(配置缺失、核心依赖不可用) |
### 使用示例
```go
// Info:记录正常流程关键事件
g.Log().Infof(ctx, "用户登录成功 uid:%d ip:%s", member.Id, ip)
// Info:记录外部调用结果
g.Log().Info(ctx, "支付回调处理完成", g.Map{"orderId": orderId, "status": status})
// Warning:外部接口失败但已降级处理
g.Log().Warningf(ctx, "短信发送失败,已跳过 mobile:%s err:%+v", mobile, err)
// Warning:业务异常但不中断流程
g.Log().Warning(ctx, "用户余额不足,跳过自动扣款", g.Map{"uid": uid, "balance": balance})
// Panic:启动时核心配置缺失
g.Log().Panicf(ctx, "缓存未初始化,无法启动: %+v", err)
```
### 日志上下文原则
- 日志**必须传入 `ctx`**(第一个参数),便于链路追踪
- 关键日志需携带足够的业务字段(uid、orderId、requestId 等),用 `g.Map{}` 附加结构化信息
- **禁止**用 `fmt.Println` 替代日志,禁止在 logic/controller 层裸打印调试信息
---
## 数据库建表约定
建表时遵循以下字段命名约定,代码生成器和 ORM hook 会自动识别并处理:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `id` | bigint(20) NOT NULL AUTO_INCREMENT | 主键,必须 |
| `created_at` | datetime | 创建时间,**自动写入**,禁止手动赋值 |
| `updated_at` | datetime | 更新时间,**自动维护**,禁止手动赋值 |
| `deleted_at` | datetime | 软删除时间,存在时查询自动加 `IS NULL`,删除只更新此字段 |
| `created_by` | bigint(20) | 创建者 ID,**自动写入** |
| `updated_by` | bigint(20) | 更新者 ID,**自动维护** |
| `deleted_by` | bigint(20) | 删除者 ID,**自动写入** |
| `status` | tinyint | 状态字段,默认使用系统字典 `sys_normal_disable` |
| `sort` | int | 排序字段,存在时编辑表单自动获取最大值+1填充 |
| `pid` | bigint(20) | 树表上级ID(树表必须) |
| `level` | int | 树等级(树表必须,自动维护) |
| `tree` | varchar(512) | 关系树(树表必须,自动维护) |
| `tenant_id` | bigint(20) | 租户ID(多租户场景按需加) |
**特殊字段查询方式(代码生成器默认生成):**
- `string` 类型字段 → `LIKE` 模糊查询
- `int/uint/int64` → `=` 精确查询
- `created_by`/`updated_by`/`deleted_by` → 关键词查询(ID/用户名/手机号匹配),调用 `service.AdminMember().GetIdsByKeyword()`
**数据类型 → Go 类型映射(影响生成代码的字段类型):**
- `tinyint/int/smallint` → `int`;加 `unsigned` → `uint`
- `bigint` → `int64`;加 `unsigned` → `uint64`
- `varchar/text/char` → `string`
- `datetime/timestamp` → `*gtime.Time`
- `json/jsonb` → `*gjson.Json`
- `decimal/float/double` → `float64`
---
## 数据权限(权限过滤)
业务查询中如需过滤数据权限(仅自己/所属部门/下级等),在 ORM 链式调用中加入 handler:
```go
import "hotgo/internal/library/hgorm/handler"
// 按登录用户的数据权限范围过滤(表需含 created_by 或 member_id 字段)
dao.XxxTable.Ctx(ctx).Handler(handler.FilterAuth).Scan(&res)
// 表中无标准字段时,指定自定义字段
dao.XxxTable.Ctx(ctx).Handler(handler.FilterAuthWithField("custom_field")).Scan(&res)
// 多租户数据权限过滤(表需含 tenant_id 字段)
// 在 Model() 方法中通过 handler.Option 开启
func (s *sSysXxx) Model(ctx context.Context, option ...*handler.Option) *gdb.Model {
if len(option) == 0 {
option = append(option, &handler.Option{FilterTenant: true})
}
return handler.Model(dao.XxxTable.Ctx(ctx), option...)
}
```
多租户增改时自动维护租户关系,在 ORM 操作后加 `.Hook(hook.SaveTenant)`:
```go
import "hotgo/internal/library/hgorm/hook"
// 新增时自动写入 tenant_id/merchant_id/user_id
dao.XxxTable.Ctx(ctx).Fields(sysin.XxxInsertFields{}).Hook(hook.SaveTenant).Data(in).Insert()
// 更新时自动维护
s.Model(ctx).Fields(sysin.XxxUpdateFields{}).WherePri(in.Id).Data(in).Hook(hook.SaveTenant).Update()
```
---
## 定时任务(Crons)
定时任务通过实现接口 + `init()` 注册,在后台「系统设置 → 定时任务」中配置执行策略:
**主模块**:新建 `server/internal/crons/<name>.go`
**插件**:新建 `server/addons/<addonName>/crons/<name>.go`
```go
package crons
import (
"context"
"hotgo/internal/library/cron"
)
func init() {
cron.Register(MyTask)
}
var MyTask = &cMyTask{name: "myTask"} // name 与后台配置的任务名称一致
type cMyTask struct{ name string }
func (c *cMyTask) GetName() string { return c.name }
func (c *cMyTask) Execute(ctx context.Context, parser *cron.Parser) (err error) {
parser.Logger.Infof(ctx, "任务执行:%v", ...)
return
}
```
---
## 消息队列(Queues)
队列采用接口 + `init()` 注册,topic 统一定义在 `internal/consts/queue.go`(或对应模块 consts 文件)。
**主模块**:新建 `server/internal/queues/<name>.go`
**插件**:新建 `server/addons/<addonName>/queues/<name>.go`
```go
package queues
import (
"context"
"encoding/json"
"hotgo/internal/consts"
"hotgo/internal/library/queue"
)
func init() {
queue.RegisterConsumer(MyConsumer)
}
var MyConsumer = &qMyConsumer{}
type qMyConsumer struct{}
func (q *qMyConsumer) GetTopic() string { return consts.QueueMyTopic }
func (q *qMyConsumer) Handle(ctx context.Context, mqMsg queue.MqMsg) (err error) {
var data MyData
if err = json.Unmarshal(mqMsg.Body, &data); err != nil {
return
}
// 处理消息...
return
}
```
**发送消息:**
```go
// 即时消息
queue.Push(consts.QueueMyTopic, data)
// 延迟消息(仅 redis/rocketmq 驱动支持)
queue.SendDelayMsg(consts.QueueMyTopic, data, 10) // redis: 延迟秒数;rocketmq: 延迟级别
```
---
## 工具库使用规范
**后端(`server/utility/`)优先使用已有工具,禁止重复造轮子:**
| 包 | 用途 |
|----|------|
| `utility/convert` | 数据类型转换 |
| `utility/encrypt` | 加密/解密 |
| `utility/excel` | 电子表格导出/导入(导出接口用此包) |
| `utility/validate` | 数据验证工具 |
| `utility/tree` | 树形结构处理 |
| `utility/simple` | 简捷函数集合 |
| `utility/format` | 数据格式化 |
**前端(`web/src/utils/`)优先使用已有工具:**
| 工具 | 用途 |
|------|------|
| `@/utils/http/axios`(`http.request`) | HTTP 请求,**唯一入口** |
| `@/utils/dateUtil`(`defRangeShortcuts`) | 日期范围快捷选项 |
| `@/utils`(`renderImage`、`renderFile`、`renderPopoverMemberSumma`) | 表格渲染工具函数 |
| `@/store/modules/dict`(`useDictStore`) | 字典数据加载与渲染 |
| `@/hooks/web/usePermission`(`hasPermission`) | 权限判断 |
---
## 树表(Tree CRUD)特殊约定
树表在普通 CRUD 基础上有以下差异:
- 表中必须含 `pid`、`level`、`tree` 字段(参见建表约定)
- `pid`/`level`/`tree` 字段**由系统自动维护**,禁止在编辑表单中手动设置这三个字段
- 前端列表页使用树形表格(`BasicTable` 的 `childrenKey` 或 `treeData` 模式),而非普通分页列表
- 参考实现:`server/internal/logic/sys/tree_demo.go`、`web/src/views/develop/curd/treeDemo/`
---
## 响应格式约定
所有接口统一响应格式(由框架中间件自动处理,**无需在 controller 手动包装**):
```json
{ "code": 0, "message": "操作成功", "timestamp": 1234567890, "traceID": "xxx", "data": {} }
```
- 成功状态码:`0`;失败状态码:`-1`(GoFrame 内置,无需手动设置)
- `gerror.Wrap(err, "用户友好的提示")` → 客户端只看到最外层提示,开发者日志可见完整堆栈
- 禁止在 controller 层手动 `Write`/`WriteJSON` 等直接写响应(破坏统一格式)
---
## 常见错误禁止清单
**后端:**
- 禁止在 controller 层直接调用 dao
- 禁止硬编码字段名字符串(用 `dao.Table.Columns().Field`)
- 禁止手改 `entity/`、`do/`、`dao/internal/` 目录下的文件
- 禁止在 logic 层重复做 `Filter()` 已完成的校验
- 禁止在 `internal/service/sys.go` 之外新建主模块 service 文件(同文件追加)
- 禁止插件 import 另一个插件的包(插件间完全隔离,通过主模块 service 通信)
- 禁止在插件路由文件里硬编码路由前缀(用 `addons.RouterPrefix()` 生成)
- 禁止在 `internal/library/` 下修改基础库(如需扩展,提 issue 或在 utility/ 添加)
**前端:**
- 禁止直接使用 axios,必须用 `http.request`
- 禁止硬编码字典值文本,必须用 `dict.getLabel()` 渲染
- 禁止引入 Naive UI 以外的 UI 框架
- 禁止内联 style
- 禁止在源码里硬编码菜单路由路径
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021-present HotGo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+166 -2
View File
@@ -1,3 +1,167 @@
# olons_admin
# HotGo-V2
<div align="center">
<img width="140px" src="https://gmycos.facms.cn/hotgo/logo.sig.png">
<p>
<h1>HotGo V2</h1>
</p>
<p align="center">
<a href="https://goframe.org/pages/viewpage.action?pageId=1114119" target="_blank">
<img src="https://img.shields.io/badge/goframe-2.10.0-green" alt="goframe">
</a>
<a href="https://v3.vuejs.org/" target="_blank">
<img src="https://img.shields.io/badge/vue.js-vue3.4-green" alt="vue">
</a>
<a href="https://www.naiveui.com" target="_blank">
<img src="https://img.shields.io/badge/naiveui-%3E2.44.1-blue" alt="naiveui">
</a>
<a href="https://www.tslang.cn/" target="_blank">
<img src="https://img.shields.io/badge/typescript-%3E4.0.0-blue" alt="typescript">
</a>
<a href="https://vitejs.dev/" target="_blank">
<img src="https://img.shields.io/badge/vite-%3E5.4.2-yellow" alt="vite">
</a>
<a href="https://github.com/bufanyun/hotgo/blob/v2.0/LICENSE" target="_blank">
<img src="https://img.shields.io/badge/license-MIT-success" alt="license">
</a>
</p>
</div>
## 平台简介
* 基于 GoFrame2 + Vue3 + NaiveUI + uniapp 的企业级全栈框架,为二次开发而生。
* 前端采用 Naive-Ui-Admin、Vue、Naive UI、uniapp。
* 企业级 AI 赋能基础开发平台,内置 AI 开发规范,适配主流 AI 开发工具,实现人机协同开发,大幅提升开发效率。
## 演示地址
- [https://hotgo.facms.cn/admin](https://hotgo.facms.cn/admin)
> 账号:admin 密码:123456
### 使用文档
[安装文档](docs/guide-zh-CN/start-installation.md) · [本地文档](docs/guide-zh-CN/README.md) · [更新历史](docs/guide-zh-CN/start-update-log.md) · [常见问题](docs/guide-zh-CN/start-issue.md)
## 特征
* 高生产率:极强的可扩展性,应用化、模块化、插件化机制敏捷开发,几分钟即可搭建一个应用开发骨架。
* 多应用入口:多入口分为 Admin (后台)、Home (前台页面)、Api (对外通用接口)、WebSocket (即时通讯接口),不同的业务,进入不同的应用入口。
* 极致的插件化: 微核架构,功能隔离,高可定制性,可以渐进式开发,亦可以多人协同开发。支持一键创建插件模板、一键安装、更新、卸载插件、可以非常方便的将插件迁移到新项目中。
* 快速生成代码:无需编写代码,只需创建表进行简单配置就能生成一个完善的 CURD、树表等常用的开发代码,其中所需表单控件也是勾选即可直接生成。
* 认证机制:采用 JWT 的用户状态认证及 casbin 的权限认证
* 路由模式:得益于 GoFrame 提供了规范化的路由注册方式,无需注解自动生成api文档
* 模块化设计,面向接口开发
## 内置功能
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
2. 部门管理:配置系统组织机构(公司、部门、岗位),树结构展现支持数据权限。
3. 岗位管理:配置系统用户所属担任职务。
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
5. 角色管理:角色菜单权限分配、设置角色按机构或按上下级关系进行数据范围权限划分。
6. 字典管理:对系统中经常使用的一些特定数据进行维护,支持枚举字典和自定义方法字典。
7. 配置管理:对系统动态配置常用参数。
8. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
9. 登录日志:系统登录日志记录查询包含登录异常。
10. 服务日志:服务端运行所产生的警告、异常、崩溃日志的详细数据和堆栈信息。
11. 支付网关:集成支付宝、微信支付、QQ支付等多种支付方式,只需简单配置即可使用。
12. 资金管理:支持在线充值、订单申请/原路退款、资金提现、资金/积分变动明细等通用模块。
13. 在线用户:当前系统中活跃用户状态监控。
14. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
15. 代码生成:支持自动化生成前后端代码。CURD关联表、树表、消息队列、定时任务一键生成等。
16. 插件应用:支持一键生成插件模板,每个插件之间开发隔离,拥有独立多应用入口、独立配置。完美支持多人协同开发、插件插拔不会对原系统产生影响等。
17. 服务监控:监视当前系统CPU、内存、磁盘、网络、堆栈等相关信息。
18. 附件管理:文件图片上传,大文件分片上传、断点续传,支持本地、阿里云oss、腾讯云cos、ucloud对象存储、七牛云对象存储、minio等多种上传驱动,后台一键切换配置,并集成了文件选择器。
19. TCP服务:基于gtcp的服务应用,支持长连接、断线重连、服务认证、路由分发、RPC消息、拦截器和数据绑定等。简化和规范了服务器开发流程。
20. 消息队列:同时兼容 kafka、redis、rocketmq、磁盘队列,一键配置切换到场景适用的MQ。
21. 通知公告:采用WebSocket实时推送在线用户最新通知、公告、私信消息。
22. 地区编码:整合国内通用省市区编码,运用于项目于一身,支持动态省市区选项。
23. 常用工具:集成常用的工具包和命令行工具,可以快速开发自定义命令行,多种启动入口。
> HotGo开源以来得到了大家的很多支持,本项目初衷只为互相学习交流,没有任何盈利性目的!欢迎为HotGo贡献代码或提供建议!
## 演示图
<table>
<tr>
<td><img src="./docs/guide-zh-CN/images/demo/1.png"/></td>
<td><img src="./docs/guide-zh-CN/images/demo/2.png"/></td>
</tr>
<tr>
<td><img src="./docs/guide-zh-CN/images/demo/3.png"/></td>
<td><img src="./docs/guide-zh-CN/images/demo/4.png"/></td>
</tr>
<tr>
<td><img src="./docs/guide-zh-CN/images/demo/5.png"/></td>
<td><img src="./docs/guide-zh-CN/images/demo/6.png"/></td>
</tr>
<tr>
<td><img src="./docs/guide-zh-CN/images/demo/7.png"/></td>
<td><img src="./docs/guide-zh-CN/images/demo/8.png"/></td>
</tr>
<tr>
<td><img src="./docs/guide-zh-CN/images/demo/9.png"/></td>
<td><img src="./docs/guide-zh-CN/images/demo/10.png"/></td>
</tr>
<tr>
<td><img src="./docs/guide-zh-CN/images/demo/11.png"/></td>
<td><img src="./docs/guide-zh-CN/images/demo/12.png"/></td>
</tr>
</table>
## 感谢(排名不分先后)
> gf框架 [https://github.com/gogf/gf](https://github.com/gogf/gf)
>
> naive-ui [https://www.naiveui.com](https://www.naiveui.com)
>
> naive-ui-admin [https://github.com/jekip/naive-ui-admin](https://github.com/jekip/naive-ui-admin)
>
> websocket [https://github.com/gorilla/websocket](github.com/gorilla/websocket)
>
> casbin [https://github.com/casbin/casbin](https://github.com/casbin/casbin)
>
> gopay [https://github.com/go-pay/gopay](https://github.com/go-pay/gopay)
## 交流QQ群
交流群①:190966648 <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=mJafkvme3VNyiQlCFIFNRtY8Xlr7pj9U&jump_from=webapi&authKey=jL10vIESr+vO8wpxwyd6DlChzkrbHpzN9uhAsIHgAinL/Vvd+nvuRyilf2UqUlCy"><img border="0" src="https://gmycos.facms.cn/hotgo/group.png" alt="HotGo框架交流1群" title="HotGo框架交流1群"></a>
> <img src="https://gmycos.facms.cn/hotgo/hotgo1qun.png" width="400px"/>
## 商用说明
> HotGo 是开源免费的,遵循 MIT 开源协议,意味着您无需支付任何费用,也无需授权,即可将它应用到您的产品中。
* 使用本项目必须保留所有版权信息。
* 本项目包含的第三方源码和二进制文件之版权信息另行标注。
* 版权所有Copyright © 2020-2026 by Ms (https://github.com/bufanyun/hotgo)
* All rights reserved。
## 免责声明:
* HotGo为开源学习项目,一切商业行为与HotGo无关。
* 用户不得利用HotGo从事非法行为,用户应当合法合规的使用,发现用户在使用产品时有任何的非法行为,HotGo有权配合有关机关进行调查或向政府部门举报,HotGo不承担用户因非法行为造成的任何法律责任,一切法律责任由用户自行承担,如因用户使用造成第三方损害的,用户应当依法予以赔偿。
* 所有与使用HotGo相关的资源直接风险均由用户承担。
#### 如果对您有帮助,您可以点右上角 💘Star💘支持
## [感谢JetBrains提供的免费GoLand](https://jb.gg/OpenSource)
[![avatar](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)](https://jb.gg/OpenSource)
## License
[MIT © HotGo-2026](./LICENSE)
企业后台管理系统
+187
View File
@@ -0,0 +1,187 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, initial-scale=1, minimum-scale=1.0, shrink-to-fit=no, viewport-fit=cover">
<!-- Replace with your own title and description. -->
<title>HotGo-V2</title>
<meta name="description" content="基于全新GoFrame2+Vue3+NaiveUI+uniapp开发的全栖框架,为二次开发而生,适合中小型完整应用开发。">
<!-- Default Theme (see //docsify.js.org/#/themes) -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/vue.css">
</head>
<body>
<div id="app"></div>
<script>
// Docsify Configuration (see //docsify.js.org/#/configuration)
window.$docsify = {
name: "HotGo-V2",
nameLink: {
'/': '/hotgo/',
},
relativePath: true,
// alias: {
// "/.*/_navbar.md": "/_navbar.md",
// },
// themeColor: "#42b983",
// logo: "//bufanyun.cn-bj.ufileos.com/hotgo/logo.sig.png",
// coverpage: true,
// homepage: "README.md",
// Sidebar Configuration
auto2top: true,
loadSidebar: "sidebar.md",
// maxLevel: 2,
// Set subMaxLevel to 0 to remove automatic display of page table of contents (TOC) in Sidebar
// subMaxLevel: 3,
// Navbar Configuration
// loadNavbar: true,
// Search Plugin Configuration
search: {
placeholder: {
"/": "搜索",
// "/": "Type to search"
},
noData: {
"/": "找不到结果",
// "/": "No Results"
},
// Headline depth, 1 - 6
// depth: 2,
},
// Flexible-alerts Plugin Configuration
"flexible-alerts": {
important: {
label: "Important",
// localization
label: {
// "/zh-cn": "重要",
"/": "Important"
},
// Assuming that we use Font Awesome
icon: "far fa-message",
className: "important"
},
warning: {
label: "Warning",
// localization
label: {
// "/zh-cn": "警告",
"/": "Warning"
},
// Assuming that we use Font Awesome
icon: "fas fa-triangle-exclamation",
className: "warning"
},
caution: {
label: "Caution",
// localization
label: {
// "/zh-cn": "注意",
"/": "Caution"
},
// Assuming that we use Font Awesome
icon: "fas fa-circle-exclamation",
className: "attention"
},
},
// Hide-code Plugin Configuration
hideCode: {
// scroll: false, // Enable scrolling
height: 300 // Max height
},
// Versioned Plugin Configuration
// versions: [
// { folder: "/", label: "v2", default: true },
// ],
// versionSelectorLabel: "Version",
// Progress Plugin Configuration
progress: {
position: "top",
// color: "var(--theme-color,#42b983)",
height: "3px",
},
};
</script>
<!-- Required -->
<script src="//cdn.jsdelivr.net/npm/docsify@4/lib/docsify.min.js"></script>
<!-- Recommended -->
<script src="//cdn.jsdelivr.net/npm/docsify@4/lib/plugins/zoom-image.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify@4/lib/plugins/search.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-copy-code/dist/docsify-copy-code.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-pagination/dist/docsify-pagination.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-hide-code/dist/docsify-hide-code.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-progress@latest/dist/progress.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/docsify-example-panels"></script>
<!-- Prism code highlight -->
<script src="//cdn.jsdelivr.net/npm/prismjs@1/components/prism-bash.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1/components/prism-matlab.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-go.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-yaml.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-vue.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-json.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-sql.min.js"></script>
<!--mermaid插件-->
<script type="module">
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs";
mermaid.initialize({ startOnLoad: true });
window.mermaid = mermaid;
</script>
<script src="//unpkg.com/docsify-mermaid@2.0.1/dist/docsify-mermaid.js"></script>
<!-- docsify-dark-switcher -->
<script src="//cdn.jsdelivr.net/gh/LIGMATV/docsify-dark-switcher@latest/docsify-dark-switcher.js"></script>
<style>
:root {
--dark-base-background: #222;
--dark-base-color: #bbc0c4;
--dark-theme-color: var(--theme-color, #42b983);
--dark-code-color: var(--dark-color);
--dark-heading-color: var(--dark-theme-color);
--dark-cover-background: #000000a8;
--dark-code-background: #303030;
--dark-tip-background: #2c0000;
--dark-warn-background: #005842;
--dark-icon-size: 25px;
--dark-icon-transition: .1s ease-in-out .1s;
--dark-moon-color: #000000;
--dark-sun-color: #ffffff;
}
</style>
<!-- docsify-plugin-flexible-alerts -->
<script src="//cdn.jsdelivr.net/npm/docsify-plugin-flexible-alerts/dist/docsify-plugin-flexible-alerts.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/js/all.min.js"></script>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/fontawesome.min.css">
<!-- docsify-versioned-plugin -->
<!-- <script src="//cdn.jsdelivr.net/npm/docsify-versioned-plugin@0.0.1/index.js"></script>
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify-versioned-plugin@0.0.1/styles.css"> -->
</body>
</html>
+58
View File
@@ -0,0 +1,58 @@
- 介绍安装
- [系统介绍](../../README.md)
- [环境搭建](/docs/guide-zh-CN/start-environment.md)
- [系统安装](/docs/guide-zh-CN/start-installation.md)
- [生产部署](/docs/guide-zh-CN/start-deploy.md)
- [如何提问](/docs/guide-zh-CN/start-questions.md)
- [常见问题](/docs/guide-zh-CN/start-issue.md)
- [更新历史](/docs/guide-zh-CN/start-update-log.md)
- 系统开发
- [目录结构](/docs/guide-zh-CN/sys-catalog.md)
- [开发规范](/docs/guide-zh-CN/sys-exploit.md)
- [控制台](/docs/guide-zh-CN/sys-console.md)
- [中间件/拦截器](/docs/guide-zh-CN/sys-middleware.md)
- [WebHook](/docs/guide-zh-CN/sys-webhook.md)
- [权限控制](/docs/guide-zh-CN/sys-auth.md)
- [支付网关](/docs/guide-zh-CN/sys-payment.md)
- [定时任务](/docs/guide-zh-CN/sys-cron.md)
- [消息队列](/docs/guide-zh-CN/sys-queue.md)
- [功能扩展库](/docs/guide-zh-CN/sys-library.md)
- [工具方法](/docs/guide-zh-CN/sys-utility.md)
- [WebSocket服务器](/docs/guide-zh-CN/sys-websocket-server.md)
- [TCP服务器](/docs/guide-zh-CN/sys-tcp-server.md)
- [SaaS多租户](/docs/guide-zh-CN/sys-tenant.md)
- [国际化](/docs/guide-zh-CN/sys-i18n.md)
- [单元测试](/docs/guide-zh-CN/sys-test.md)
- 插件模块开发
- [模块介绍及目录](/docs/guide-zh-CN/addon-introduce-catalog.md)
- [模块开发流程](/docs/guide-zh-CN/addon-flow.md)
- [模块辅助说明](/docs/guide-zh-CN/addon-helper.md)
- 生成代码
- [使用前提](/docs/guide-zh-CN/code-start.md)
- [数据库](/docs/guide-zh-CN/sys-db.md)
- [生成配置](/docs/guide-zh-CN/code-config.md)
- [生成CURD](/docs/guide-zh-CN/code-curd.md)
- [生成关联表CURD](/docs/guide-zh-CN/code-curd-join.md)
- [生成树型CURD](/docs/guide-zh-CN/code-tree.md)
- [生成业务模板](/docs/guide-zh-CN/code-business.md)
- [生成模板开发](/docs/guide-zh-CN/code-template-dev.md)
- [生成常见问题](/docs/guide-zh-CN/code-help.md)
- 前端开发
- [表单组件](/docs/guide-zh-CN/web-form.md)
- [WebSocket客户端](/docs/guide-zh-CN/sys-websocket-client.md)
- [独立部署](/docs/guide-zh-CN/web-deploy.md)
- 附录
- [网址收录](/docs/guide-zh-CN/append-website.md)
+800
View File
@@ -0,0 +1,800 @@
from __future__ import annotations
from datetime import date
from pathlib import Path
from PIL import Image, ImageDraw
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Inches, Pt, RGBColor
from build_reference_prd import (
INK, MUTED, add_page_number, add_picture, add_table, bullet, font,
heading, numbered, p, page_break, rounded, set_run_font, text,
)
ROOT = Path(__file__).resolve().parents[1]
OUT_DIR = ROOT / "docs" / "admin_reference_prd"
ASSET_DIR = OUT_DIR / "assets"
OUT_DOCX = OUT_DIR / "后台管理系统需求文档.docx"
NAV_BG = "#191B20"
TOP_BG = "#FFFFFF"
PAGE_BG = "#F3F5F8"
TEAL = "#4F958E"
BLUE = "#5A7BEF"
RED = "#D95E62"
ORANGE = "#E39B3C"
PURPLE = "#8C54CC"
GREEN = "#45A06B"
def ui_text(draw, xy, value, size=20, fill="#202631", bold=False, anchor=None):
text(draw, xy, value, size=size, fill=fill, bold=bold, anchor=anchor)
def desktop_base(title: str, active: str):
im = Image.new("RGB", (1600, 900), PAGE_BG)
d = ImageDraw.Draw(im)
d.rectangle((0, 0, 250, 900), fill=NAV_BG)
d.rectangle((250, 0, 1600, 66), fill=TOP_BG)
ui_text(d, (125, 34), "DD后台", 23, "white", anchor="mm")
ui_text(d, (278, 34), "☰", 24, "#333A46", anchor="mm")
ui_text(d, (330, 34), "↻", 24, "#333A46", anchor="mm")
ui_text(d, (1530, 34), "admin ▾", 18, "#333A46", anchor="mm")
groups = [
("主页", ["首页", "网站设置", "文本管理", "Banner设置", "手工商城"]),
("会员管理", ["会员列表", "会员等级", "任务大厅"]),
("交易管理", ["订单列表", "充值管理", "提现管理", "客服管理"]),
("商城管理", ["商品列表"]),
("任务管理", ["任务列表", "会员任务审核"]),
("管理员", ["后台管理员", "角色管理", "权限管理", "数据字典"]),
("设置", ["基本资料", "修改密码"]),
]
y = 85
for group, children in groups:
ui_text(d, (24, y), group, 17, "#D9DEE7")
y += 34
if active in children or active == group:
for child in children:
if child == active:
d.rectangle((0, y - 6, 250, y + 27), fill=TEAL)
ui_text(d, (50, y + 10), child, 16, "white", anchor="lm")
else:
ui_text(d, (50, y + 10), child, 15, "#C9CFD8", anchor="lm")
y += 34
y += 10
d.rectangle((250, 66, 1600, 112), fill="#FFFFFF")
ui_text(d, (282, 89), "⌂", 19, "#596273", anchor="mm")
ui_text(d, (322, 89), title, 17, "#596273", anchor="lm")
return im, d
def metric_card(d, box, label, value, sub1, sub2, color):
rounded(d, box, 8, color)
x1, y1, x2, y2 = box
ui_text(d, (x1 + 28, y1 + 36), label, 20, "white")
ui_text(d, (x1 + 28, y1 + 84), value, 32, "white", bold=True)
ui_text(d, (x1 + 28, y1 + 123), sub1, 16, "white")
ui_text(d, (x1 + 28, y1 + 151), sub2, 16, "white")
def dashboard_proto():
im, d = desktop_base("首页", "首页")
ui_text(d, (275, 142), "商城统计", 18, "#333A46")
cards = [
("用户总量", "5,038", "今日注册 13", "昨日注册 21", "#D95B83"),
("充值用户总量", "2,609", "今日新增 7", "昨日新增 15", "#E86866"),
("商品总量", "705", "今日新增 0", "昨日新增 0", "#5BA4CF"),
("订单总量", "75,548", "今日新增 243", "昨日新增 264", "#9851CF"),
("订单总金额", "87,576,426.20", "今日新增 155,616.00", "昨日新增 554,758.90", "#5755B7"),
("用户充值", "40,145,160.82", "今日新增 59,828.00", "昨日新增 230,469.00", "#E6AF1E"),
("用户提现", "3,500,782.79", "今日新增 2,316.04", "昨日新增 4,648.47", "#D96E19"),
("抢单佣金", "2,315,790.44", "今日新增 6,073.24", "昨日新增 13,803.84", "#833052"),
]
for i, c in enumerate(cards):
col, row = i % 2, i // 2
x = 275 + col * 645
y = 165 + row * 170
metric_card(d, (x, y, x + 615, y + 150), *c)
return im
def list_proto(title: str, active: str, filters, headers, rows, action_label, sensitive=False):
im, d = desktop_base(title, active)
x0, y0 = 280, 140
for i, label in enumerate(filters):
x = x0 + (i % 4) * 300
y = y0 + (i // 4) * 58
ui_text(d, (x, y), label, 15, "#374151")
rounded(d, (x + 72, y - 10, x + 270, y + 25), 4, "white", "#D5DAE2")
ui_text(d, (x + 86, y + 7), "请输入 / 请选择", 13, "#9AA2AE", anchor="lm")
top = y0 + ((len(filters) - 1) // 4 + 1) * 58
rounded(d, (280, top, 360, top + 38), 4, BLUE)
ui_text(d, (320, top + 20), "搜索", 15, "white", anchor="mm")
rounded(d, (370, top, 465, top + 38), 4, RED)
ui_text(d, (418, top + 20), "批量删除", 15, "white", anchor="mm")
rounded(d, (475, top, 555, top + 38), 4, TEAL)
ui_text(d, (515, top + 20), "添加", 15, "white", anchor="mm")
table_y = top + 58
widths = [120] + [max(100, int(1050 / max(1, len(headers) - 1))) for _ in headers[1:]]
scale = 1270 / sum(widths)
widths = [int(w * scale) for w in widths]
x = 275
for i, h in enumerate(headers):
d.rectangle((x, table_y, x + widths[i], table_y + 46), fill="#405D8E")
ui_text(d, (x + widths[i] / 2, table_y + 24), h, 13, "white", anchor="mm")
x += widths[i]
for ridx, row in enumerate(rows):
y = table_y + 46 + ridx * 54
x = 275
for i, val in enumerate(row):
fill = "white" if ridx % 2 == 0 else "#F7F9FC"
d.rectangle((x, y, x + widths[i], y + 54), fill=fill, outline="#DDE2EA")
display = val
if sensitive and i in (1, 2, 3):
display = val
ui_text(d, (x + 8, y + 27), display[:18], 12, "#2C3440", anchor="lm")
x += widths[i]
rounded(d, (1180, table_y + 240, 1515, table_y + 288), 6, "#FFF7E6", "#E5B45A")
ui_text(d, (1195, table_y + 264), action_label, 13, "#915F14", anchor="lm")
ui_text(d, (280, 860), "共 5,038 条 30 条/页 1 2 3 …", 13, "#667085")
return im
def modal_proto():
im = list_proto(
"会员列表", "会员列表", ["用户名", "手机号", "注册时间", "状态", "自动派单"],
["ID", "账号", "绑卡姓名", "用户名", "余额", "状态", "操作"],
[["8165", "155****7676", "王**", "会员 A", "299.00", "正常", "编辑 / 银行卡 / 地址 / 团队"],
["8164", "180****8046", "—", "会员 B", "0.00", "正常", "账变 / 奖励金 / 禁用"]],
"敏感信息默认脱敏;查看需授权并留痕", True,
)
overlay = Image.new("RGBA", im.size, (0, 0, 0, 85))
im = Image.alpha_composite(im.convert("RGBA"), overlay).convert("RGB")
d = ImageDraw.Draw(im)
rounded(d, (560, 155, 1285, 785), 10, "white", "#D2D7E0")
d.rectangle((560, 155, 1285, 208), fill="#F6F7F9")
ui_text(d, (590, 182), "添加会员", 21, "#202631", bold=True, anchor="lm")
ui_text(d, (1250, 182), "×", 23, "#667085", anchor="mm")
fields = ["标记", "用户名称", "手机号码", "账户余额", "冻结金额", "会员等级", "交易状态", "登录密码", "交易密码", "上级ID", "信用分"]
for i, lab in enumerate(fields):
col, row = i % 2, i // 2
x = 595 + col * 330
y = 238 + row * 74
ui_text(d, (x, y), lab, 15, "#3C4450")
rounded(d, (x, y + 20, x + 290, y + 56), 4, "white", "#CBD2DC")
rounded(d, (975, 725, 1065, 765), 5, BLUE)
rounded(d, (1078, 725, 1168, 765), 5, "#E8EBF0")
ui_text(d, (1020, 746), "确定", 15, "white", anchor="mm")
ui_text(d, (1123, 746), "取消", 15, "#3F4651", anchor="mm")
return im
def finance_proto():
im, d = desktop_base("提现管理", "提现管理")
x0 = 280
ui_text(d, (x0, 150), "订单号", 15)
rounded(d, (350, 132, 560, 170), 4, "white", "#D4DAE3")
ui_text(d, (600, 150), "用户名", 15)
rounded(d, (670, 132, 880, 170), 4, "white", "#D4DAE3")
rounded(d, (900, 132, 980, 170), 4, BLUE)
ui_text(d, (940, 151), "搜索", 15, "white", anchor="mm")
headers = ["提现用户", "余额", "提现金额", "手续费", "实际到账", "银行", "银行卡号", "发起时间", "处理时间", "操作"]
xs = [280, 420, 520, 630, 740, 855, 970, 1120, 1300, 1450, 1570]
for i, h in enumerate(headers):
d.rectangle((xs[i], 210, xs[i + 1], 258), fill="#405D8E")
ui_text(d, ((xs[i] + xs[i + 1]) / 2, 234), h, 12, "white", anchor="mm")
rows = [
["会员 A", "300.00", "48.38", "0.00", "48.38", "农业银行", "6228 **** **** 7161", "10-07 17:23", "—", "通过 / 驳回"],
["会员 B", "2,940.00", "500.00", "2.00", "498.00", "邮储银行", "6217 **** **** 3408", "10-07 16:21", "16:34", "审核通过"],
["会员 C", "718.35", "100.00", "1.00", "99.00", "建设银行", "6236 **** **** 5670", "10-07 15:25", "15:48", "审核驳回"],
]
for r, row in enumerate(rows):
y = 258 + r * 62
for i, val in enumerate(row):
d.rectangle((xs[i], y, xs[i + 1], y + 62), fill="white" if r % 2 == 0 else "#F7F9FC", outline="#DDE2EA")
ui_text(d, (xs[i] + 7, y + 32), val, 11, "#2C3440", anchor="lm")
rounded(d, (305, 520, 785, 740), 10, "#FFF4F0", "#E98E73")
ui_text(d, (335, 558), "P0 资金审核要求", 22, RED, bold=True)
for i, line in enumerate(["完整银行卡号仅在授权后临时查看", "通过/驳回必须填写原因", "大额或异常订单双人复核", "幂等、余额校验、审计日志不可缺失"]):
ui_text(d, (340, 610 + i * 34), "• " + line, 16, "#523129")
rounded(d, (845, 520, 1515, 740), 10, "#EFF6FF", "#7AA2E8")
ui_text(d, (875, 558), "审核抽屉", 22, BLUE, bold=True)
for i, lab in enumerate(["订单摘要与风险命中", "收款信息(脱敏)", "凭证预览", "处理意见与复核人"]):
ui_text(d, (880, 610 + i * 34), "□ " + lab, 16, "#2D466B")
return im
def rbac_proto():
im, d = desktop_base("角色管理", "角色管理")
ui_text(d, (280, 150), "角色与权限矩阵", 22, "#202631", bold=True)
headers = ["角色", "会员", "订单", "充值", "提现", "内容", "配置", "账号/权限", "导出"]
xs = [280, 470, 590, 710, 830, 950, 1070, 1190, 1400, 1535]
for i, h in enumerate(headers):
d.rectangle((xs[i], 190, xs[i + 1], 240), fill="#405D8E")
ui_text(d, ((xs[i] + xs[i + 1]) / 2, 216), h, 13, "white", anchor="mm")
rows = [
("超级管理员", ["读写", "读写", "复核", "复核", "发布", "发布", "管理", "授权"]),
("运营", ["读", "读", "无", "无", "编辑", "草稿", "无", "无"]),
("客服", ["脱敏读", "读", "只读", "只读", "无", "无", "无", "无"]),
("财务", ["脱敏读", "读", "审核", "审核", "无", "无", "无", "受控"]),
("风控", ["受控查看", "冻结", "复核", "复核", "无", "只读", "无", "受控"]),
("审计员", ["只读", "只读", "只读", "只读", "只读", "只读", "只读", "受控"]),
]
colors = {"无": "#E9EDF3", "只读": "#E8F1FF", "读": "#E8F1FF", "脱敏读": "#E8F1FF", "读写": "#E9F7ED", "编辑": "#E9F7ED", "发布": "#FFF1D8", "审核": "#FFF1D8", "复核": "#FFE4E4", "管理": "#FFE4E4", "授权": "#FFE4E4", "冻结": "#FFE4E4", "受控": "#F2E9FF", "受控查看": "#F2E9FF", "草稿": "#E9F7ED"}
for r, (role, vals) in enumerate(rows):
y = 240 + r * 62
d.rectangle((xs[0], y, xs[1], y + 62), fill="white", outline="#DDE2EA")
ui_text(d, (xs[0] + 14, y + 32), role, 14, "#2C3440", anchor="lm")
for i, val in enumerate(vals, 1):
d.rectangle((xs[i], y, xs[i + 1], y + 62), fill=colors.get(val, "white"), outline="#DDE2EA")
ui_text(d, ((xs[i] + xs[i + 1]) / 2, y + 32), val, 12, "#364152", anchor="mm")
rounded(d, (280, 665, 1535, 792), 10, "#FFF8E8", "#E1B454")
ui_text(d, (310, 705), "关键原则", 20, "#7B5314", bold=True)
ui_text(d, (310, 746), "最小权限 · 职责分离 · 敏感字段临时授权 · 权限变更双人复核 · 全量审计", 18, "#7B5314")
return im
def flow_proto():
im = Image.new("RGB", (1600, 900), "white")
d = ImageDraw.Draw(im)
ui_text(d, (800, 60), "C 端与后台业务闭环", 32, "#202631", bold=True, anchor="mm")
lanes = [("会员", 150, "#EAF1FF"), ("系统", 390, "#EAF8F0"), ("运营/财务", 630, "#FFF4E0")]
for name, y, color in lanes:
rounded(d, (70, y, 1530, y + 160), 16, color)
rounded(d, (90, y + 45, 220, y + 115), 14, "white", "#BCC6D4")
ui_text(d, (155, y + 80), name, 21, "#303846", bold=True, anchor="mm")
boxes = [
("注册/登录", 270, 175, BLUE), ("绑定资料", 500, 175, BLUE), ("领取任务", 730, 175, BLUE), ("提交结果", 960, 175, BLUE), ("查看台账", 1190, 175, BLUE),
("身份与风控", 270, 415, GREEN), ("创建订单", 500, 415, GREEN), ("冻结/解冻", 730, 415, GREEN), ("结算与幂等", 960, 415, GREEN), ("通知与申诉", 1190, 415, GREEN),
("会员配置", 270, 655, ORANGE), ("内容/商品", 500, 655, ORANGE), ("任务审核", 730, 655, ORANGE), ("充值/提现复核", 960, 655, ORANGE), ("审计/对账", 1190, 655, ORANGE),
]
for label, x, y, color in boxes:
rounded(d, (x, y, x + 175, y + 70), 12, color)
ui_text(d, (x + 88, y + 36), label, 16, "white", bold=True, anchor="mm")
for y in (210, 450, 690):
for x in (450, 680, 910, 1140):
ui_text(d, (x, y), "→", 27, "#687386", anchor="mm")
for x in (357, 587, 817, 1047, 1277):
ui_text(d, (x, 355), "↕", 27, "#687386", anchor="mm")
ui_text(d, (x, 595), "↕", 27, "#687386", anchor="mm")
return im
def save_assets():
ASSET_DIR.mkdir(parents=True, exist_ok=True)
assets = {
"prototype_01_dashboard.png": dashboard_proto(),
"prototype_02_member_list.png": list_proto(
"会员列表", "会员列表", ["用户名", "手机号", "注册时间", "状态", "自动派单"],
["ID", "账号", "绑卡姓名", "用户名", "余额", "状态", "操作"],
[["8165", "155****7676", "王**", "会员 A", "299.00", "正常", "编辑 / 银行卡 / 地址"],
["8164", "180****8046", "—", "会员 B", "0.00", "正常", "团队 / 账变 / 奖励金"]],
"删除、禁用、设为假人均需二次确认与理由", True,
),
"prototype_03_member_modal.png": modal_proto(),
"prototype_04_withdrawal.png": finance_proto(),
"prototype_05_rbac.png": rbac_proto(),
"prototype_06_flow.png": flow_proto(),
}
paths = []
for name, image in assets.items():
path = ASSET_DIR / name
image.save(path, quality=94)
paths.append(path)
return paths
def configure_doc(doc: Document):
sec = doc.sections[0]
sec.page_width = Inches(8.5)
sec.page_height = Inches(11)
sec.top_margin = Inches(0.64)
sec.bottom_margin = Inches(0.62)
sec.left_margin = Inches(0.68)
sec.right_margin = Inches(0.68)
normal = doc.styles["Normal"]
normal.font.name = "Heiti SC"
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Heiti SC")
normal.font.size = Pt(10.2)
normal.font.color.rgb = RGBColor.from_string(INK)
for name, size in (("Title", 27), ("Heading 1", 17.5), ("Heading 2", 13.5), ("Heading 3", 11.3)):
st = doc.styles[name]
st.font.name = "Heiti SC"
st._element.rPr.rFonts.set(qn("w:eastAsia"), "Heiti SC")
st.font.size = Pt(size)
st.font.color.rgb = RGBColor(0, 0, 0)
st.font.bold = True
header = sec.header.paragraphs[0]
header.alignment = WD_ALIGN_PARAGRAPH.RIGHT
set_run_font(header.add_run("后台管理系统需求文档"), size=8.5, color=MUTED)
add_page_number(sec.footer.paragraphs[0])
def add_cover(doc: Document):
title = doc.add_paragraph(style="Title")
title.alignment = WD_ALIGN_PARAGRAPH.LEFT
title.paragraph_format.space_before = Pt(72)
title.paragraph_format.space_after = Pt(20)
title_pr = title._p.get_or_add_pPr()
border = OxmlElement("w:pBdr")
for edge in ("top", "left", "bottom", "right", "between"):
node = OxmlElement("w:" + edge)
node.set(qn("w:val"), "nil")
border.append(node)
title_pr.append(border)
set_run_font(title.add_run("后台管理系统需求文档"), size=27, bold=True, color="000000")
sub = doc.add_paragraph()
set_run_font(sub.add_run("参考管理端功能拆解、C 端映射与安全重构方案"), size=15.5, bold=True, color="000000")
sub.paragraph_format.space_after = Pt(32)
p(doc, "目标:基于参考管理系统的实际页面、按钮、链接与弹窗,形成可直接用于产品设计、前后端开发、测试和运维的后台需求基线;保留业务闭环,不复制品牌资产和真实用户数据。")
p(doc, "主要读者:产品负责人、交互设计师、前端开发、后端开发、测试、运营、客服、财务、风控、安全与审计。")
p(doc, f"观察日期:{date(2026, 10, 7).isoformat()} 参考环境:Web 管理后台 文档版本:V1.0")
p(doc, "结论:后台覆盖门户配置、会员、交易、商品、任务、RBAC 与个人设置七大域。复刻时应优先修复敏感数据裸露、资金操作单人审批、配置无校验、接口错误和审计不足。")
page_break(doc)
def add_scope(doc):
heading(doc, "1 文档范围与走查方法", 1)
p(doc, "本需求对后台 21 个可见页面入口进行了逐项走查,并打开新增、编辑、查看、分配、审核等代表性弹窗。为了保护现网数据,没有执行最终确定、上传、删除、禁用、设为假人、审核通过或驳回、资金调整、奖励金发放、权限保存和改密。")
heading(doc, "1.1 已覆盖入口", 2)
add_table(doc, ["一级模块", "页面", "主要控件"], [
("主页", "首页、网站设置、文本管理、Banner 设置、手工商城", "指标卡、保存、上传、编辑、删除、发布"),
("会员管理", "会员列表、会员等级、任务大厅", "搜索、新增、编辑、团队、账变、奖励金、等级配置"),
("交易管理", "订单、充值、提现、客服", "筛选、自动刷新、匹配、凭证、审核、客服嵌入"),
("商城管理", "商品列表", "搜索、新增、编辑、推荐、删除、富文本"),
("任务管理", "任务列表、会员任务审核", "任务新增、编辑、通过、驳回"),
("管理员", "后台管理员、角色、权限、数据字典", "账号、角色、权限树、配置项"),
("设置", "基本资料、修改密码", "资料修改、密码修改"),
], [0.95, 2.7, 2.95])
heading(doc, "1.2 操作边界", 2)
for item in [
"只验证页面、按钮和弹窗是否可达,未提交会改变会员、资金、权限或配置的数据。",
"删除、禁用、设为假人、审核、账变、奖励金、改密等高风险入口仅记录需求,不执行最终动作。",
"原型图基于实测界面脱敏重绘,手机号、姓名、IP、银行卡、订单号均为掩码或虚构值。",
"接口名称以推荐实现命名;现网真实接口需在开发前通过代码或服务端文档二次核验。",
]:
bullet(doc, item)
heading(doc, "1.3 证据等级", 2)
add_table(doc, ["等级", "定义", "使用方式"], [
("A 实测", "页面、按钮、表格或弹窗在走查中直接可见", "可作为复刻基线"),
("B 推导", "由相邻页面、C 端闭环或字段关系推导", "开发前需确认"),
("C 建议", "为安全、合规、可用性提出的重构要求", "作为新系统强制规范"),
], [0.8, 3.3, 2.5])
def add_architecture(doc):
heading(doc, "2 产品定位与后台角色", 1)
p(doc, "该后台用于运营一个移动端会员任务与账户平台。C 端会员进行注册、余额储入、领取订单、任务提交、佣金结算、提现和客服咨询;后台完成内容配置、会员治理、商品与任务配置、交易审核、财务对账和权限审计。")
add_table(doc, ["角色", "职责", "允许范围", "禁止范围"], [
("超级管理员", "系统与权限治理", "账号、角色、权限、系统参数", "不得绕过双人复核直接放款"),
("运营", "内容、Banner、商品、任务、等级", "草稿、预览、发布申请", "不得查看完整银行卡或改余额"),
("客服", "会员与订单查询、工单", "脱敏资料、只读订单、备注", "不得资金审核或导出全量用户"),
("财务", "充值、提现、对账", "凭证、审核、支付状态", "不得修改会员身份与权限"),
("风控", "异常行为与冻结复核", "设备、IP 风险、冻结申请", "不得单人完成冻结与解冻"),
("审计", "只读复核与导出", "日志、审批链、差异报表", "不得修改业务数据"),
], [0.9, 1.65, 2.1, 2.25])
heading(doc, "2.1 信息架构", 2)
p(doc, "采用“一级业务域 + 二级页面 + 多标签工作区”的桌面后台结构。一级菜单固定在左侧,二级页面以标签页打开;标签支持关闭、刷新和回到首页。任何页面刷新后,应保持当前路由但不保留未提交敏感表单。")
heading(doc, "2.2 全局交互规范", 2)
for item in [
"列表页统一:查询区、主操作区、表格、固定操作列、分页;查询条件可重置并写入 URL。",
"弹窗统一:标题、关闭、表单、确定、取消;确定前做前后端双重校验,提交后禁止重复点击。",
"危险操作使用红色按钮并要求对象、影响、理由和二次确认;资金与权限操作额外要求复核人。",
"敏感值默认脱敏;查看完整值需单独权限、再次确认、限定时长,并记录操作者、目标、时间和用途。",
"加载超过 2 秒展示骨架与取消,接口失败展示错误码、重试和上报入口,不长期停留空白页。",
"操作成功后提供结果提示与审计编号;失败不得只显示“error”。",
]:
bullet(doc, item)
def add_c_mapping(doc, flow_img):
heading(doc, "3 C 端与后台功能映射", 1)
p(doc, "后台不是独立工具,其配置和操作必须能解释 C 端每个入口、状态和金额。以下矩阵为联调的单一事实源。")
add_table(doc, ["C 端能力", "后台来源", "后台操作", "一致性要求"], [
("首页横幅与快捷入口", "Banner、网站设置", "排序、有效期、跳转、开关", "发布后按版本生效"),
("平台简介/规则/公告", "文本管理", "富文本编辑、预览、发布", "CSP 与 HTML 白名单"),
("手工商城", "手工商城", "商品增删改、图片、价格、时间", "C 端仅显示已上架"),
("会员等级", "会员等级", "门槛、赠送、次数、佣金、提现次数", "计算与展示同源"),
("领取中心", "网站设置、商品、订单", "营业时间、最低余额、匹配规则", "服务端状态机判定"),
("订单记录", "订单列表", "查询、冻结、匹配、异常处理", "业务单号和台账可追溯"),
("储入", "充值管理", "凭证、审核、入账、驳回", "幂等入账与自动对账"),
("取出", "提现管理、银行卡信息", "收款资料、审核、通道、结果", "金额、手续费、到账同源"),
("任务大厅与任务", "任务大厅、任务列表、会员任务审核", "配置、分发、审核", "等级、佣金、状态一致"),
("个人资料", "会员列表", "资料、团队、状态、风控", "敏感字段默认脱敏"),
("通知与弹幕", "文本、会员弹幕", "发布、定向、撤回、查看记录", "真实性标识和审计"),
("客服", "客服管理", "客服入口、工作时间、会话映射", "失败有备用通道"),
], [1.2, 1.25, 2.3, 1.8], 7.8)
add_picture(doc, flow_img, "图 1 C 端与后台业务闭环(脱敏重绘原型)", width=6.7)
def add_dashboard(doc, img):
page_break(doc)
heading(doc, "4 首页数据看板", 1)
p(doc, "首页展示用户、商品、订单、充值、提现、佣金、利息宝转入、下级返佣与账户余额等汇总卡,并展示微信、支付宝和银行卡渠道统计。新系统应把口径、时间区间、刷新时间和数据延迟显式化。")
add_table(doc, ["指标", "定义", "筛选维度", "权限"], [
("用户总量/新增", "去重有效会员数", "今日、昨日、自定义日期", "运营只读"),
("充值用户", "至少一笔成功充值的会员数", "时间、渠道、等级", "财务/运营"),
("订单量与金额", "按订单状态和完成时间统计", "状态、商品、等级", "运营/财务"),
("充值/提现", "成功与待处理金额分开", "渠道、状态、时间", "财务"),
("佣金/返佣", "任务佣金与层级返佣分开", "类型、等级、时间", "财务/审计"),
("账户余额", "钱包可用与冻结余额总和", "币种、账户状态", "财务/审计"),
], [1.2, 2.55, 1.75, 1.0])
bullet(doc, "卡片可点击进入对应明细页,并继承时间筛选;无权限用户只能看到隐藏金额或不可点击状态。")
bullet(doc, "页面顶部展示“数据截至时间”和刷新按钮;自动刷新不得造成重复请求风暴。")
add_picture(doc, img, "图 2 后台首页看板(按实测界面脱敏重绘)", width=6.7)
def add_content_modules(doc):
heading(doc, "5 门户、内容与 Banner 管理", 1)
heading(doc, "5.1 网站设置", 2)
add_table(doc, ["配置组", "字段", "要求"], [
("品牌", "Logo、站点名称、隐私政策 URL", "Logo 可预览;URL 仅允许 HTTPS 白名单"),
("交易", "交易余额、等待时间、每日次数、奖励次数", "数值范围校验;修改按版本发布"),
("佣金", "0–5 级普通佣金", "Decimal;总和上限;法务开关"),
("时间", "提现、充值、交易、签到时间", "支持多区间;禁止结束早于开始"),
("门槛", "最低充值、自动派单时间与金额", "最小值≤最大值;币种与单位清晰"),
("开关", "免费领取、手工商城、首页任务、签到、商品模式、验证码", "每项写明 C 端影响和降级文案"),
], [0.85, 2.65, 3.1])
p(doc, "实测问题:交易等待时间输入框提示语与字段无关;签到时段出现“18:00–17:00”反向区间。新系统保存前必须做语义校验,并支持草稿、预览、发布、回滚。")
heading(doc, "5.2 文本管理", 2)
p(doc, "内容类型包括平台公告、平台简介、订单规则、代理合作、FAQ、指南、利息宝规则、首页滚动、订单提示、活动、首页弹窗和公司资质。编辑器需支持标题、正文、图片、链接、预览、定时发布、版本和回滚。")
bullet(doc, "富文本使用标签/属性白名单;禁止 script、事件属性、javascript: URL 和未知 iframe。")
bullet(doc, "现网编辑弹窗标题错误显示“编辑商品”,新系统标题必须与内容类型一致。")
heading(doc, "5.3 Banner 设置", 2)
p(doc, "支持多张首页 Banner 的上传、删除、排序、上下线、有效期、跳转类型与替代文本。上传前预览并校验尺寸、比例、MIME、文件大小和恶意内容。删除需要二次确认,已发布素材优先下线而非物理删除。")
heading(doc, "5.4 手工商城", 2)
p(doc, "列表字段为图片、名称、价格、时间与操作;新增/编辑字段为产品名称、价格、图片与展示时间。现网新增弹窗曾长时间停留 loading,需增加 8 秒超时、重试和错误上报。")
def add_member(doc, list_img, modal_img):
page_break(doc)
heading(doc, "6 会员管理", 1)
heading(doc, "6.1 会员列表", 2)
p(doc, "查询条件:用户名、手机号、注册时间、状态、自动派单。列表字段:ID、账号、绑卡姓名、用户名、账户余额、冻结金额、上级用户、邀请码、注册时间、最后登录 IP、IP 属地、自动抢单、状态、当日交易次数。")
add_table(doc, ["操作", "页面或弹窗", "关键校验", "审计要求"], [
("添加/编辑", "会员表单", "手机号唯一;余额不可由普通编辑修改;密码强度", "记录前后值,密码永不回显"),
("银行卡信息", "开户人、银行、电话、卡号、数字钱包、云闪付、收款码", "必要性与格式;图片扫描", "完整值查看留痕"),
("地址信息", "姓名、电话、地区、详细地址", "最小化收集;字段脱敏", "查看和修改留痕"),
("查看团队", "当前用户、层级、人数、余额、佣金、充值、提现", "仅展示授权层级", "导出单独授权"),
("账变", "余额调整或流水", "金额、类型、理由、业务单号", "双人复核;不可直接改余额"),
("弹幕", "会员定向或模拟内容", "标注来源、有效期、撤回", "禁止伪造真实用户行为"),
("奖励金", "奖励金额与原因", "非负、额度、幂等", "财务复核与凭证"),
("设为假人", "账号标记", "不得混入真实统计或 C 端荣誉榜", "仅测试环境默认启用"),
("禁用", "账号状态", "理由、范围、时长、申诉", "双人复核;通知用户"),
("删除", "软删除/注销", "检查资金与订单;不可物理删台账", "高风险二次确认"),
], [0.85, 2.0, 2.3, 1.8], 7.6)
p(doc, "P0:现网页面默认显示完整手机号、姓名与登录 IP。新系统必须默认脱敏,按角色和目的临时授权查看;列表、导出、日志、埋点和截图统一执行同一脱敏规则。")
add_picture(doc, list_img, "图 3 会员列表脱敏原型", width=6.7)
add_picture(doc, modal_img, "图 4 添加会员弹窗原型", width=6.7, page_break_before=True)
def add_member_level_taskhall(doc):
page_break(doc)
heading(doc, "7 会员等级与任务大厅", 1)
heading(doc, "7.1 会员等级", 2)
p(doc, "列表字段为等级名称、升级价格、赠送金额、接单次数、佣金比例和提现次数;支持编辑与受控删除。等级配置直接影响 C 端充值、领取和提现,必须使用版本化发布,不得修改后立即影响进行中的订单。")
add_table(doc, ["规则", "校验", "生效策略"], [
("升级价格/赠送金额", "≥0;货币精度;赠送比例上限", "新会员或下个结算周期"),
("接单次数", "整数;按日重置时区明确", "发布后次日生效"),
("佣金比例", "0–1 Decimal;展示百分比", "锁定到任务订单快照"),
("提现次数", "整数;与提现时间窗一致", "发布后次日生效"),
("删除等级", "无有效会员与在途订单方可删除", "优先停用并保留历史"),
], [1.45, 2.65, 2.5])
heading(doc, "7.2 任务大厅", 2)
p(doc, "页面字段为名称、图标、比例、简介、创建时间;新增弹窗还包含会员等级。实测列表接口直接显示“数据接口请求异常:error”,但新增弹窗可打开。新系统需要标准错误码、可重试状态、traceId 与空数据区分。")
bullet(doc, "任务大厅条目必须绑定可用会员等级、比例单位、图标和 C 端跳转。")
bullet(doc, "停用条目不影响已领取任务;删除仅允许无历史引用的数据,建议统一软删除。")
def add_transactions(doc, finance_img):
page_break(doc)
heading(doc, "8 交易管理", 1)
heading(doc, "8.1 订单列表", 2)
p(doc, "查询条件:订单号、手机号、用户名、日期;支持开启/关闭自动刷新。列表含绑卡姓名、用户名、自动派单、余额、手机号、当日交易次数、商品、数量、金额、佣金、下单时间、解冻时间、消息、订单状态、冻结状态和操作。")
add_table(doc, ["状态", "后台操作", "约束"], [
("匹配中", "查看进度、取消匹配", "同一会员仅一笔匹配;需幂等"),
("待处理", "查看详情、发送提醒", "不可手动完成;服务端倒计时"),
("冻结", "查看风险、发起解冻复核", "冻结理由、时长、申诉路径"),
("已完成", "查看台账", "金额、佣金、解冻三方一致"),
("异常/失败", "重新匹配、人工处理申请", "人工改状态必须双人审批"),
], [1.0, 2.2, 3.35])
heading(doc, "8.2 充值管理", 2)
p(doc, "顶部展示全部、用户已支付、用户未支付、手动审核、手动驳回等汇总金额。列表字段:订单号、真实姓名、手机号、余额、交易金额、打款凭证、添加时间、支付方式、类型、处理时间、备注和操作。")
bullet(doc, "审核通过前校验凭证、订单金额、收款主体、重复订单和账户状态;入账使用幂等键。")
bullet(doc, "驳回必须选择标准原因并可补充说明;通知 C 端且允许补充材料。")
heading(doc, "8.3 提现管理", 2)
p(doc, "查询条件:订单号、用户名、日期。列表含用户余额、提现金额、手续费、实际到账、银行名称、开户名称、银行卡号、云闪付、数字钱包、支付宝/微信收款码、发起与处理时间、操作。")
p(doc, "P0:现网直接显示完整银行卡号与多个钱包账号。新系统列表只显示掩码,完整值不进入普通 DOM;付款处理时通过一次性授权查看,超时自动隐藏。")
add_picture(doc, finance_img, "图 5 提现审核脱敏原型", width=6.7)
heading(doc, "8.4 客服管理", 2)
p(doc, "实测页面在加载后保持空白。新系统至少提供客服账号、名称、工作时间、在线状态、跳转 URL、排序、启停和会话映射;第三方 iframe 失败时显示备用联系方式和错误编号。")
def add_products_tasks(doc):
page_break(doc)
heading(doc, "9 商品与任务管理", 1)
heading(doc, "9.1 商品列表", 2)
p(doc, "查询条件:商品名称、支付类型。列表:ID、图片、名称、商品价格、店铺名称、创建时间、是否推荐、操作。新增/编辑字段:商品名称、分类、店铺名称、商品单价、展示图片、商品详情富文本。")
bullet(doc, "推荐/不推荐为明确状态切换,提交前展示影响范围;列表筛选和 C 端排序一致。")
bullet(doc, "价格采用 Decimal;图片与富文本执行内容安全校验;商品被订单引用后只允许停用。")
heading(doc, "9.2 任务列表", 2)
p(doc, "按会员类型筛选;字段为任务编号、封面、标题、描述、等级、佣金、创建时间。新增弹窗含标题、描述、封面、等级、佣金和详情。实测新增任务弹窗标题误用“添加大厅任务”,需修正。")
heading(doc, "9.3 会员任务审核", 2)
p(doc, "按手机号、用户名查询;列表含记录 ID、用户名、手机、任务标题、等级、佣金、成功率、状态、备注、创建时间和操作。待审核记录支持通过与驳回。")
add_table(doc, ["动作", "前置条件", "提交内容", "结果"], [
("通过", "任务存在、会员有效、未重复审核", "审核意见、证据摘要、幂等键", "发放佣金或进入结算队列"),
("驳回", "记录为待审核", "标准原因、补充说明、是否允许重提", "通知会员并保留证据"),
("撤回审核", "仅异常且未结算", "变更单与复核人", "冲正而非修改历史记录"),
], [0.9, 2.35, 2.2, 2.0])
def add_rbac(doc, rbac_img):
page_break(doc)
heading(doc, "10 管理员、角色与权限", 1)
heading(doc, "10.1 后台管理员", 2)
p(doc, "查询条件为登录名、手机、邮箱、角色;列表含姓名、登录名、手机号、邮箱、角色、更新时间和创建时间。新增字段为姓名、用户名、密码、手机、邮箱和多选角色。")
bullet(doc, "密码强度至少 12 位,禁止默认密码,首次登录强制改密;密码永不回显。")
bullet(doc, "禁用优先于删除;删除账号时保留历史审计主体,不得影响日志可追溯性。")
heading(doc, "10.2 角色管理", 2)
p(doc, "角色列表支持新增、编辑、删除和分配权限。分配弹窗为可展开/折叠的权限树。保存权限属于高风险操作,必须展示新增与移除差异,并由另一名管理员复核。")
heading(doc, "10.3 权限管理", 2)
p(doc, "权限树字段为 ID、名称、权限标识、父级 ID 和操作;支持添加顶级权限、添加子级、编辑、删除、展开/折叠。权限标识唯一且不可随意改名;被角色引用时禁止删除。")
add_picture(doc, rbac_img, "图 6 建议 RBAC 权限矩阵", width=6.7)
def add_dictionary_settings(doc):
page_break(doc)
heading(doc, "11 数据字典与个人设置", 1)
heading(doc, "11.1 数据字典", 2)
p(doc, "列表字段为 ID、名称、值、创建时间;支持新增、编辑、删除。现网同时存在英文 key、中文名称和缺失名称的条目,并与网站设置重复维护。建议将字典拆为“系统常量”和“业务配置”,以结构化 Schema 管理。")
add_table(doc, ["字段", "要求"], [
("key", "全局唯一;小写或大写规范统一;发布后不可改名"),
("value", "按 Schema 校验类型、范围、枚举、时间段和单位"),
("description", "必填,说明业务含义、C 端影响和默认值"),
("scope", "环境、租户、渠道、会员等级等作用域"),
("version", "草稿、已发布、已回滚;记录生效时间"),
("secret", "敏感配置不得明文显示,使用密钥管理系统"),
], [1.3, 5.2])
heading(doc, "11.2 基本资料", 2)
p(doc, "字段为用户名(不可修改)、名称、手机、邮箱,提交按钮为“确认修改”。修改手机或邮箱需验证当前身份和新联系方式;成功后记录审计并通知原联系方式。")
heading(doc, "11.3 修改密码", 2)
p(doc, "字段为当前密码、新密码、确认新密码,现网提示 6–16 个字符。新系统建议至少 12 位并支持密码管理器;最终提交必须由用户本人完成,成功后撤销其他会话并发送安全通知。")
def add_state_models(doc):
page_break(doc)
heading(doc, "12 状态机与数据模型", 1)
heading(doc, "12.1 核心状态机", 2)
add_table(doc, ["实体", "状态", "允许转换"], [
("会员", "正常、受限、禁用、注销", "正常→受限/禁用;复核后恢复;注销不可逆"),
("订单", "匹配中、待处理、处理中、完成、超时、冻结、取消、失败", "仅服务端状态机转换"),
("充值", "待支付、待审核、成功、驳回、过期、取消", "成功后只允许冲正"),
("提现", "待审核、复核中、处理中、成功、失败、驳回、取消", "付款前可取消;成功后只允许冲正"),
("任务审核", "待审核、通过、驳回、已结算、已冲正", "结算后不可回到待审核"),
("内容", "草稿、待审、已发布、已下线、已归档", "发布需审批;可回滚版本"),
("配置", "草稿、待发布、已发布、已回滚", "发布后生成不可变版本"),
], [1.0, 2.45, 3.1])
heading(doc, "12.2 核心实体", 2)
add_table(doc, ["实体", "关键字段", "约束"], [
("AdminUser", "id, loginName, roles, status, mfa, lastLogin", "管理员身份与会话"),
("Role/Permission", "roleId, permissionKey, scope", "最小权限与数据范围"),
("Member", "id, mobileEnc, nameEnc, levelId, status", "敏感字段加密、索引分离"),
("Wallet", "available, frozen, currency, version", "只允许台账事务修改"),
("LedgerEntry", "bizNo, type, amount, before, after, reversalOf", "不可变、幂等、可冲正"),
("Order", "orderNo, memberId, productSnapshot, amount, commission, status", "保存规则快照"),
("Deposit/Withdrawal", "bizNo, amount, fee, channel, status, reviewer", "审批链与支付回执"),
("Content/Banner", "type, body, version, publishAt, operator", "预览与版本化发布"),
("ConfigVersion", "key, value, schema, effectiveAt", "语义校验与回滚"),
("AuditLog", "actor, action, target, before, after, reason, traceId", "防篡改与长期留存"),
], [1.15, 3.5, 2.0], 7.8)
def add_api(doc):
page_break(doc)
heading(doc, "13 推荐接口清单", 1)
p(doc, "接口为新系统建议设计,统一前缀 /admin-api/v1。响应包含 data、code、message、traceId;所有写接口必须携带 Idempotency-Key,资金与权限写操作同时携带审批单号。")
rows = [
("GET", "/dashboard/summary", "首页指标", "timeRange, dimensions"),
("GET/PUT", "/site-settings", "读取/保存站点配置草稿", "version, settings"),
("POST", "/site-settings/publish", "发布配置", "draftVersion, reason"),
("GET/POST", "/contents", "内容列表/新建", "type, status, body"),
("POST", "/contents/{id}/publish", "内容发布", "publishAt, approver"),
("GET/POST", "/banners", "Banner 查询/新建", "imageAssetId, sort, target"),
("GET/POST", "/members", "会员查询/新建", "filters, profile"),
("GET/PATCH", "/members/{id}", "会员详情/编辑", "editableProfile, version"),
("POST", "/members/{id}/adjustment-requests", "账变申请", "type, amount, reason, evidence"),
("POST", "/members/{id}/status-requests", "禁用/解禁申请", "targetStatus, reason, duration"),
("GET/POST", "/member-levels", "等级查询/草稿", "rules, effectiveAt"),
("GET/POST", "/products", "商品查询/新建", "category, price, assets, detail"),
("GET/POST", "/tasks", "任务查询/新建", "levelIds, commission, detail"),
("GET", "/orders", "订单列表", "orderNo, member, status, timeRange"),
("POST", "/orders/{id}/exception-requests", "异常处理申请", "action, reason"),
("GET", "/deposits", "充值列表", "status, channel, timeRange"),
("POST", "/deposits/{id}/review", "充值审核", "decision, reason, version"),
("GET", "/withdrawals", "提现列表", "status, member, timeRange"),
("POST", "/withdrawals/{id}/review", "提现审核", "decision, reason, version"),
("GET", "/withdrawals/{id}/sensitive-view", "一次性查看收款信息", "purpose, challengeToken"),
("GET/POST", "/task-submissions", "任务审核列表/决定", "decision, reason"),
("GET/POST", "/admin-users", "管理员查询/新建", "profile, roleIds"),
("GET/POST", "/roles", "角色查询/新建", "name, scope"),
("POST", "/roles/{id}/permission-change-requests", "权限变更申请", "add, remove, reason"),
("GET", "/audit-logs", "审计查询", "actor, action, target, timeRange"),
]
add_table(doc, ["方法", "路径", "用途", "关键参数"], rows, [0.55, 2.3, 1.75, 2.0], 7.4)
def add_security(doc):
page_break(doc)
heading(doc, "14 安全、隐私与审计", 1)
add_table(doc, ["风险", "现网表现", "新系统要求", "优先级"], [
("个人信息裸露", "完整手机号、姓名、IP", "默认脱敏;临时授权;全链路审计", "P0"),
("金融信息裸露", "完整银行卡与钱包账号", "应用层加密;非 DOM 展示;一次性查看", "P0"),
("资金单人操作", "通过/驳回、账变、奖励入口直接可达", "职责分离、双人复核、额度和幂等", "P0"),
("伪造行为", "设为假人、弹幕入口", "测试数据隔离;禁止混入真实榜单与统计", "P0"),
("富文本 XSS", "商品与内容支持富文本", "白名单、CSP、上传扫描、预览隔离", "P0"),
("配置误发布", "时间反向、字段提示错误", "Schema 校验、预览、审批、回滚", "P0"),
("接口不可用", "任务大厅 error、客服空白", "错误码、重试、熔断、监控和降级", "P1"),
("权限漂移", "多角色与权限树直接保存", "差异预览、审批、定期复核", "P0"),
], [1.0, 1.65, 3.0, 0.65])
heading(doc, "14.1 审计日志", 2)
for item in [
"记录登录、查看敏感信息、导出、查询大范围数据、资金审核、账变、奖励、冻结、配置发布、权限变更和改密。",
"字段至少包含操作者、角色、MFA、目标、动作、前值、后值、理由、审批人、IP、设备、traceId、时间和结果。",
"日志写入独立存储并防篡改;业务管理员无删除权限;按监管与公司政策设定留存期。",
"导出文件水印、加密、限时下载;下载与转发均可追踪。",
]:
bullet(doc, item)
heading(doc, "14.2 登录与会话", 2)
for item in [
"管理员必须启用 MFA;高风险动作触发再次认证。",
"闲置 15–30 分钟自动锁定;会话撤销、设备列表和异地登录提醒。",
"连续失败触发限流与告警;不得依赖前端验证码作为唯一防护。",
"服务端密码使用 Argon2id 或 bcrypt;任何日志、监控和前端状态都不得保存密码。",
]:
bullet(doc, item)
def add_nonfunctional(doc):
heading(doc, "15 非功能需求", 1)
add_table(doc, ["类别", "目标", "验收指标"], [
("性能", "常用列表与详情快速可用", "列表 P95<1s;写操作 P95<1.5s;首屏<2.5s"),
("可用性", "关键交易全年可用", "资金审核 99.95%;其余 99.9%"),
("容量", "支持 10 万会员与百万级订单", "游标分页、索引与冷热分层"),
("并发", "自动刷新与多运营并发安全", "乐观锁、版本号、冲突提示"),
("可观测", "定位每次请求与资金变更", "traceId、指标、日志、告警、审计关联"),
("兼容", "主流桌面浏览器", "Chrome/Edge 最近两个稳定版;1366×768 可用"),
("可访问", "键盘与读屏可操作", "焦点、标签、颜色对比、44px 点击区"),
("灾备", "配置与交易可恢复", "RPO≤5 分钟,RTO≤30 分钟;季度演练"),
], [1.0, 3.0, 2.65])
heading(doc, "15.1 列表与弹窗通用验收", 2)
for item in [
"查询条件、分页、排序、刷新后可恢复;空数据、加载中、失败、无权限均有独立状态。",
"横向宽表固定关键列和操作列;敏感字段不因横向滚动或 tooltip 意外暴露。",
"弹窗关闭与取消不产生写操作;表单脏数据关闭前提示;成功后只刷新受影响区域。",
"重复点击、网络重试和浏览器回退不会重复创建、重复审核或重复入账。",
"所有时间显示时区,金额显示币种和精度,百分比与小数含义统一。",
]:
bullet(doc, item)
def add_acceptance(doc):
page_break(doc)
heading(doc, "16 端到端验收场景", 1)
scenarios = [
("A01 内容发布", "运营新建公告→预览→提交审核→审批→定时发布→C 端显示相同版本→回滚"),
("A02 会员查询", "客服按掩码手机号查询→查看脱敏资料→申请查看完整值→审计留痕→超时隐藏"),
("A03 任务闭环", "配置任务→C 端领取→生成订单→提交→后台审核→佣金入账→台账核对"),
("A04 充值审核", "C 端提交→后台待审核→重复回调→单次入账→通知→对账一致"),
("A05 提现复核", "C 端申请→风控命中→财务初审→复核→通道付款→状态与到账金额一致"),
("A06 禁用会员", "客服发起→填写理由和时长→风控复核→会员受限→通知与申诉→解禁"),
("A07 账变", "运营申请奖励→财务复核→台账入账→重复提交被幂等拦截→审计可追溯"),
("A08 权限变更", "管理员申请新增提现审核权限→展示差异→复核→即时生效→历史会话重新鉴权"),
("A09 配置错误", "输入反向时间/非法比例→前后端阻止→错误定位到字段→不生成草稿版本"),
("A10 服务降级", "任务大厅 API 失败/客服 iframe 失败→清晰错误→重试/备用入口→告警产生"),
]
add_table(doc, ["编号", "场景与验收路径"], scenarios, [0.75, 5.9])
heading(doc, "16.1 发布门槛", 2)
for item in [
"P0 风险全部关闭;资金、权限、隐私与上传通过专项安全测试。",
"C 端和后台使用同一配置版本、状态枚举、金额口径和错误码。",
"关键写操作完成幂等、并发、回滚、重试、超时与断网测试。",
"审计日志可以从一次用户投诉还原完整操作者、审批链和资金流水。",
"备份恢复、支付对账、权限复核和事故响应完成演练。",
]:
bullet(doc, item)
def add_roadmap(doc):
page_break(doc)
heading(doc, "17 研发里程碑", 1)
add_table(doc, ["阶段", "范围", "退出条件"], [
("M0 设计基线", "信息架构、组件、状态机、RBAC、字段字典", "产品/设计/技术/安全评审通过"),
("M1 基础后台", "登录、管理员、角色、权限、审计、内容、Banner", "MFA、审计、发布流可用"),
("M2 会员与配置", "会员、等级、团队、配置中心", "脱敏、临时授权、版本发布完成"),
("M3 商品与任务", "商品、任务、任务大厅、审核", "C 端联调与佣金快照通过"),
("M4 交易与资金", "订单、充值、提现、对账、复核", "支付沙箱、幂等、双人复核通过"),
("M5 运营与稳定性", "看板、客服、监控、灾备、性能", "SLO、告警、恢复演练通过"),
], [1.1, 3.4, 2.25])
heading(doc, "17.1 建议开发顺序", 2)
for item in [
"先建设统一认证、RBAC、审计、脱敏和配置发布,再开发具体业务页。",
"会员、商品、任务可先使用模拟资金;充值和提现必须最后接真实通道。",
"资金域上线前实行沙箱、小流量、额度限制和人工对账。",
"上线后第一周每日权限复核、账务核对和错误率复盘。",
]:
numbered(doc, item)
def add_prototypes(doc, imgs):
page_break(doc)
heading(doc, "18 原型图说明", 1)
p(doc, "文档中的界面图按实测后台的布局、菜单、表格、弹窗和业务字段脱敏重绘,可直接用于讨论信息层级和交互。它们不是视觉稿:品牌、颜色、图标和真实数据应在 UI 设计阶段重新建立。")
for idx, (img, caption) in enumerate([
(imgs[0], "首页看板"), (imgs[1], "会员列表"), (imgs[2], "会员弹窗"),
(imgs[3], "提现审核"), (imgs[4], "角色权限"), (imgs[5], "业务闭环"),
], 1):
if idx > 1:
page_break(doc)
heading(doc, f"18.{idx} {caption}(脱敏重绘)", 2)
pic = doc.add_paragraph()
pic.alignment = WD_ALIGN_PARAGRAPH.CENTER
pic.add_run().add_picture(str(img), width=Inches(5.8))
def add_open_questions(doc):
page_break(doc)
heading(doc, "19 待确认事项", 1)
for item in [
"目标系统是否处理真实资金,适用司法辖区、支付牌照与实名要求是什么。",
"“设为假人、弹幕、奖励金、层级返佣”是否保留;若保留,业务合法性和真实性如何证明。",
"充值、提现、账变和会员禁用的初审/复核角色与金额阈值。",
"C 端现有接口能否修改,还是需要后台兼容旧字段和状态枚举。",
"客服使用自建工单还是第三方服务,允许向第三方传输哪些数据。",
"运营内容是否需要多语言、定时发布、区域差异与灰度发布。",
"历史用户、订单、银行卡和台账的迁移范围、清洗规则和保留年限。",
"生产环境数据导出、敏感值查看和紧急权限的审批人。",
]:
bullet(doc, item)
p(doc, "在上述事项确认前,可以完成认证、RBAC、审计、内容、会员脱敏查询、商品任务配置和沙箱交易;不得接入真实收款、放款或自动资金调整。")
def build_doc():
OUT_DIR.mkdir(parents=True, exist_ok=True)
imgs = save_assets()
doc = Document()
configure_doc(doc)
add_cover(doc)
add_scope(doc)
add_architecture(doc)
add_c_mapping(doc, imgs[5])
add_dashboard(doc, imgs[0])
add_content_modules(doc)
add_member(doc, imgs[1], imgs[2])
add_member_level_taskhall(doc)
add_transactions(doc, imgs[3])
add_products_tasks(doc)
add_rbac(doc, imgs[4])
add_dictionary_settings(doc)
add_state_models(doc)
add_api(doc)
add_security(doc)
add_nonfunctional(doc)
add_acceptance(doc)
add_roadmap(doc)
add_prototypes(doc, imgs)
add_open_questions(doc)
doc.core_properties.title = "后台管理系统需求文档"
doc.core_properties.subject = "参考管理系统拆解、C 端映射与安全重构方案"
doc.core_properties.author = "Product Requirement Analysis"
doc.core_properties.keywords = "后台, 需求文档, 会员, 交易, RBAC, 审计, 原型"
doc.save(OUT_DOCX)
print(OUT_DOCX)
if __name__ == "__main__":
build_doc()
+794
View File
@@ -0,0 +1,794 @@
from __future__ import annotations
from pathlib import Path
from datetime import date
from PIL import Image, ImageDraw, ImageFont
from docx import Document
from docx.enum.section import WD_SECTION
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_BREAK, WD_LINE_SPACING
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Inches, Pt, RGBColor
ROOT = Path(__file__).resolve().parents[1]
OUT_DIR = ROOT / "docs" / "reference_site_prd"
ASSET_DIR = OUT_DIR / "assets"
OUT_DOCX = OUT_DIR / "移动端任务与账户平台需求文档.docx"
FONT_PATH = "/System/Library/Fonts/STHeiti Light.ttc"
INK = "18202F"
BLUE = "4F79E8"
PALE_BLUE = "EAF1FF"
PALE = "F6F8FC"
GOLD = "D8AD58"
RED = "C64F48"
GRID = "D9D9D9"
MUTED = "667085"
def font(size: int, bold: bool = False):
try:
return ImageFont.truetype(FONT_PATH, size=size)
except Exception:
return ImageFont.load_default()
def rounded(draw, box, radius=18, fill="white", outline=None, width=1):
draw.rounded_rectangle(box, radius=radius, fill=fill, outline=outline, width=width)
def text(draw, xy, value, size=24, fill="#18202F", bold=False, anchor=None):
draw.text(xy, value, font=font(size, bold), fill=fill, anchor=anchor)
def phone_base(title: str):
im = Image.new("RGB", (460, 860), "#F3F5FA")
d = ImageDraw.Draw(im)
rounded(d, (8, 8, 452, 852), 34, "#F3F5FA", "#D8DEE9", 2)
text(d, (230, 42), title, 28, anchor="mm")
return im, d
def nav(d, active: str):
rounded(d, (14, 790, 446, 842), 24, "white")
items = ["首页", "记录", "领取", "客服", "我的"]
for i, item in enumerate(items):
x = 52 + i * 89
color = "#4F79E8" if item == active else "#4B5565"
d.ellipse((x - 9, 802, x + 9, 820), fill=color)
text(d, (x, 831), item, 15, color, anchor="mm")
def home_proto():
im, d = phone_base("首页")
rounded(d, (20, 78, 440, 220), 18, "#2459D9")
text(d, (230, 145), "运营活动横幅", 34, "white", anchor="mm")
for i, label in enumerate(["领取", "储入", "取出", "手工"]):
x = 65 + i * 110
d.ellipse((x - 22, 238, x + 22, 282), fill=["#6C8FF1", "#6DD0B5", "#D77B6C", "#E2B362"][i])
text(d, (x, 301), label, 19, anchor="mm")
rounded(d, (20, 322, 440, 422), 28, "#DCEBFF")
text(d, (42, 347), "账户余额", 18, "#667085")
text(d, (42, 395), "Rmb$ 300,019.13", 32)
text(d, (20, 455), "荣誉榜", 23)
for i in range(3):
y = 486 + i * 68
rounded(d, (20, y, 440, y + 56), 20, "white")
d.ellipse((34, y + 9, 72, y + 47), fill="#DDE5F5")
text(d, (88, y + 19), f"用户{i+1} 积分 {5200-i*430}.00", 16)
rounded(d, (340, y + 12, 425, y + 44), 16, "#E3BB6F")
text(d, (382, y + 29), "领取成功", 13, anchor="mm")
text(d, (20, 705), "会员等级 · 公司简介", 20)
nav(d, "首页")
return im
def records_proto():
im, d = phone_base("记录")
text(d, (28, 82), "剩余可用资产", 17, "#667085")
text(d, (28, 126), "Rmb$ 300,019.13", 34)
for i, tab in enumerate(["全部", "待处理", "已完成"]):
text(d, (55 + i * 92, 184), tab, 18, "#18202F" if i == 0 else "#77808F", anchor="mm")
for i, (name, price, comm) in enumerate([("商品订单 A", "¥298", "¥14.90"), ("商品订单 B", "¥235", "¥4.23")]):
y = 220 + i * 190
rounded(d, (18, y, 442, y + 168), 22, "white")
text(d, (32, y + 25), "2026-10-07 16:25", 15, "#667085")
rounded(d, (32, y + 50, 150, y + 142), 12, "#D8E4F8")
text(d, (168, y + 64), name, 19)
text(d, (168, y + 101), f"商品价格 {price}", 16)
rounded(d, (168, y + 117, 422, y + 150), 10, "#F4D5A0")
text(d, (185, y + 134), f"佣金 {comm}", 16, "#C64F48", anchor="lm")
text(d, (384, y + 134), "已完成", 15, anchor="mm")
nav(d, "记录")
return im
def receive_proto():
im, d = phone_base("领取")
rounded(d, (18, 72, 442, 320), 18, "#DCEEFF")
text(d, (35, 102), "至尊会员", 30)
text(d, (35, 138), "佣金费率 5%", 18)
d.ellipse((165, 165, 295, 295), fill="#BED8FF")
rounded(d, (148, 250, 312, 298), 24, "#4F79E8")
text(d, (230, 275), "自动领取", 22, "white", anchor="mm")
text(d, (230, 350), "全力领取中 结果将在下方发放", 16, "#667085", anchor="mm")
text(d, (22, 398), "今日战果", 23)
cards = [("总资产", "300019.13"), ("昨日佣金", "0"), ("今日佣金", "14.9"), ("今日领取数", "1")]
for i, (label, val) in enumerate(cards):
x = 20 + (i % 2) * 212
y = 430 + (i // 2) * 104
rounded(d, (x, y, x + 200, y + 88), 14, ["#E4E1FF", "#FFF0CF", "#FFE2E4", "#DDF6FF"][i])
text(d, (x + 14, y + 25), label, 15, "#667085")
text(d, (x + 14, y + 62), val, 22)
text(d, (22, 655), "规则提示:营业时间、余额门槛、60 分钟时限", 15, "#667085")
nav(d, "领取")
return im
def mine_proto():
im, d = phone_base("我的")
rounded(d, (20, 78, 440, 166), 22, "#CCE4FF")
d.ellipse((38, 96, 92, 150), fill="#AFC8EA")
text(d, (110, 108), "用户昵称", 22)
text(d, (110, 139), "邀请码 ******", 15, "#667085")
rounded(d, (20, 188, 440, 315), 25, "#F5D37D")
text(d, (42, 226), "Rmb$ 300,019.13", 30)
rounded(d, (48, 257, 177, 297), 19, "#B9A95F")
rounded(d, (200, 257, 329, 297), 19, "white")
text(d, (112, 278), "立即取出", 17, anchor="mm")
text(d, (264, 278), "立即储入", 17, anchor="mm")
text(d, (22, 355), "更多功能", 22)
for i, label in enumerate(["个人信息", "储入记录", "取出记录", "账户明细", "弹窗记录", "退出登录"]):
y = 390 + i * 58
rounded(d, (20, y, 440, y + 48), 10, "white")
text(d, (46, y + 25), label, 18, anchor="lm")
text(d, (416, y + 25), ">", 18, "#667085", anchor="mm")
nav(d, "我的")
return im
def recharge_proto():
im, d = phone_base("储入")
cols = ["等级", "金额", "赠送", "单数", "比例"]
d.rounded_rectangle((14, 76, 446, 114), radius=10, fill="#4F79E8")
for i, c in enumerate(cols):
x = 24 + i * 82
text(d, (x, 95), c, 14, "white", anchor="mm")
rows = [("普通", "500", "20", "10", "1.8%"), ("白银", "1888", "88", "20", "2.0%"), ("黄金", "10000", "188", "30", "2.2%"), ("铂金", "30000", "388", "40", "3.0%"), ("钻石", "50000", "588", "50", "3.5%"), ("星耀", "88888", "1888", "80", "4.0%"), ("至尊", "188888", "2888", "1000", "5.0%")]
for r, row in enumerate(rows):
y = 126 + r * 42
if r % 2:
d.rectangle((14, y - 17, 446, y + 20), fill="#EEF3FC")
for i, c in enumerate(row):
text(d, (24 + i * 82, y), c, 13, anchor="mm")
text(d, (22, 455), "输入金额", 16)
rounded(d, (20, 478, 440, 530), 18, "white", "#D9D9D9")
text(d, (22, 565), "姓名", 16)
rounded(d, (20, 588, 440, 640), 18, "white", "#D9D9D9")
rounded(d, (20, 690, 440, 746), 25, "#4F79E8")
text(d, (230, 718), "提交", 21, "white", anchor="mm")
return im
def bind_proto():
im, d = phone_base("绑定信息")
labels = ["姓名", "银行名", "银行账户", "人民币编码"]
for i, lab in enumerate(labels):
y = 78 + i * 100
text(d, (24, y), lab, 17)
rounded(d, (20, y + 24, 440, y + 78), 18, "white", "#D9D9D9")
text(d, (24, 490), "支付宝收款码", 17)
rounded(d, (20, 520, 156, 650), 16, "white", "#C9CFDA")
text(d, (88, 585), "+", 42, anchor="mm")
text(d, (210, 490), "微信收款码", 17)
rounded(d, (206, 520, 342, 650), 16, "white", "#C9CFDA")
text(d, (274, 585), "+", 42, anchor="mm")
rounded(d, (20, 700, 440, 756), 25, "#4F79E8")
text(d, (230, 728), "提交", 21, "white", anchor="mm")
return im
def service_proto():
im, d = phone_base("在线客服")
text(d, (28, 92), "储入与问题处理请联系在线客服", 18)
for i in range(3):
x = 18 + i * 144
rounded(d, (x, 148, x + 132, 330), 20, "white")
d.ellipse((x + 42, 176, x + 90, 224), fill="#2C3440")
text(d, (x + 66, 253), f"在线客服 {i+1}", 16, anchor="mm")
text(d, (x + 66, 281), "9:00-22:00", 13, "#667085", anchor="mm")
rounded(d, (x + 16, 295, x + 116, 327), 16, "#4F79E8")
text(d, (x + 66, 312), "联系客服", 14, "white", anchor="mm")
text(d, (20, 390), "进入后嵌入第三方即时聊天页", 17, "#667085")
nav(d, "客服")
return im
def mall_proto():
im, d = phone_base("手工商城")
rounded(d, (18, 78, 442, 210), 18, "#285FD8")
text(d, (230, 144), "手工任务横幅", 30, "white", anchor="mm")
for i in range(6):
x = 18 + (i % 2) * 214
y = 228 + (i // 2) * 172
rounded(d, (x, y, x + 204, y + 156), 16, "white")
rounded(d, (x + 8, y + 8, x + 196, y + 88), 12, "#DDE6F4")
text(d, (x + 13, y + 110), f"手工商品 {i+1} 工资说明", 15)
text(d, (x + 13, y + 137), "已领取 0.8", 13, "#667085")
return im
def composite(path: Path, title: str, left, right, left_label: str, right_label: str):
canvas = Image.new("RGB", (1200, 980), "white")
d = ImageDraw.Draw(canvas)
text(d, (600, 34), title, 28, anchor="mm")
canvas.paste(left.resize((460, 860)), (105, 74))
canvas.paste(right.resize((460, 860)), (635, 74))
text(d, (335, 955), left_label, 17, "#667085", anchor="mm")
text(d, (865, 955), right_label, 17, "#667085", anchor="mm")
canvas.save(path, quality=92)
def set_cell_shading(cell, fill):
tc_pr = cell._tc.get_or_add_tcPr()
shd = tc_pr.find(qn("w:shd"))
if shd is None:
shd = OxmlElement("w:shd")
tc_pr.append(shd)
shd.set(qn("w:fill"), fill)
def set_cell_border(cell, color=GRID, size="6"):
tc_pr = cell._tc.get_or_add_tcPr()
borders = tc_pr.first_child_found_in("w:tcBorders")
if borders is None:
borders = OxmlElement("w:tcBorders")
tc_pr.append(borders)
for edge in ("top", "left", "bottom", "right", "insideH", "insideV"):
tag = "w:" + edge
node = borders.find(qn(tag))
if node is None:
node = OxmlElement(tag)
borders.append(node)
node.set(qn("w:val"), "single")
node.set(qn("w:sz"), size)
node.set(qn("w:color"), color)
def set_cell_margins(cell, top=100, start=110, bottom=100, end=110):
tc = cell._tc
tc_pr = tc.get_or_add_tcPr()
tc_mar = tc_pr.first_child_found_in("w:tcMar")
if tc_mar is None:
tc_mar = OxmlElement("w:tcMar")
tc_pr.append(tc_mar)
for m, v in (("top", top), ("start", start), ("bottom", bottom), ("end", end)):
node = tc_mar.find(qn("w:" + m))
if node is None:
node = OxmlElement("w:" + m)
tc_mar.append(node)
node.set(qn("w:w"), str(v))
node.set(qn("w:type"), "dxa")
def add_table(doc, headers, rows, widths=None, font_size=8.8):
table = doc.add_table(rows=1, cols=len(headers))
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.autofit = False
hdr = table.rows[0].cells
header_props = table.rows[0]._tr.get_or_add_trPr()
repeat_header = OxmlElement("w:tblHeader")
repeat_header.set(qn("w:val"), "true")
header_props.append(repeat_header)
header_props.append(OxmlElement("w:cantSplit"))
for i, h in enumerate(headers):
hdr[i].text = h
set_cell_shading(hdr[i], "334E7D")
set_cell_border(hdr[i])
set_cell_margins(hdr[i])
hdr[i].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
p = hdr[i].paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
for r in p.runs:
r.font.color.rgb = RGBColor(255, 255, 255)
r.font.bold = True
r.font.size = Pt(font_size)
for ridx, row in enumerate(rows):
table_row = table.add_row()
table_row._tr.get_or_add_trPr().append(OxmlElement("w:cantSplit"))
cells = table_row.cells
for i, value in enumerate(row):
cells[i].text = str(value)
set_cell_border(cells[i])
set_cell_margins(cells[i])
if ridx % 2:
set_cell_shading(cells[i], "F3F6FB")
cells[i].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
p = cells[i].paragraphs[0]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER if i == 0 else WD_ALIGN_PARAGRAPH.LEFT
for r in p.runs:
r.font.size = Pt(font_size)
r.font.color.rgb = RGBColor.from_string(INK)
if widths:
for row in table.rows:
for i, w in enumerate(widths):
row.cells[i].width = Inches(w)
doc.add_paragraph()
return table
def set_run_font(run, name="Heiti SC", size=10.5, bold=None, color=INK):
run.font.name = name
run._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), "Heiti SC")
run.font.size = Pt(size)
run.font.color.rgb = RGBColor.from_string(color)
if bold is not None:
run.font.bold = bold
def p(doc, content="", style=None, bold_lead=None):
par = doc.add_paragraph(style=style)
par.paragraph_format.space_after = Pt(6)
par.paragraph_format.line_spacing = 1.28
if bold_lead and content.startswith(bold_lead):
a = par.add_run(bold_lead)
set_run_font(a, bold=True)
b = par.add_run(content[len(bold_lead):])
set_run_font(b)
else:
r = par.add_run(content)
set_run_font(r)
return par
def bullet(doc, content, level=0):
par = doc.add_paragraph(style="List Bullet" if level == 0 else "List Bullet 2")
par.paragraph_format.space_after = Pt(3)
par.paragraph_format.line_spacing = 1.2
set_run_font(par.add_run(content), size=10.2)
return par
def numbered(doc, content):
par = doc.add_paragraph(style="List Number")
par.paragraph_format.space_after = Pt(4)
set_run_font(par.add_run(content), size=10.2)
return par
def heading(doc, value, level=1):
h = doc.add_heading(value, level=level)
h.paragraph_format.space_before = Pt(10 if level == 1 else 7)
h.paragraph_format.space_after = Pt(6)
return h
def page_break(doc):
doc.add_page_break()
def add_picture(doc, path, caption, width=6.6, page_break_before=False):
par = doc.add_paragraph()
par.paragraph_format.page_break_before = page_break_before
if page_break_before:
par.paragraph_format.space_before = Pt(18)
par.alignment = WD_ALIGN_PARAGRAPH.CENTER
par.add_run().add_picture(str(path), width=Inches(width))
cap = doc.add_paragraph()
cap.alignment = WD_ALIGN_PARAGRAPH.CENTER
cap.paragraph_format.space_after = Pt(8)
set_run_font(cap.add_run(caption), size=9, color=MUTED)
def add_page_number(paragraph):
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = paragraph.add_run()
fld_char1 = OxmlElement("w:fldChar")
fld_char1.set(qn("w:fldCharType"), "begin")
instr = OxmlElement("w:instrText")
instr.set(qn("xml:space"), "preserve")
instr.text = "PAGE"
fld_char2 = OxmlElement("w:fldChar")
fld_char2.set(qn("w:fldCharType"), "end")
run._r.append(fld_char1)
run._r.append(instr)
run._r.append(fld_char2)
def build_assets():
ASSET_DIR.mkdir(parents=True, exist_ok=True)
pairs = [
("prototype_01.png", "核心导航与内容列表", home_proto(), records_proto(), "首页", "订单记录"),
("prototype_02.png", "领取与个人中心", receive_proto(), mine_proto(), "领取中心", "我的"),
("prototype_03.png", "资金入口与收款信息", recharge_proto(), bind_proto(), "储入申请", "收款信息绑定"),
("prototype_04.png", "客服与手工任务", service_proto(), mall_proto(), "在线客服", "手工商城"),
]
out = []
for name, title, left, right, ll, rl in pairs:
path = ASSET_DIR / name
composite(path, title, left, right, ll, rl)
out.append(path)
return out
def build_doc():
OUT_DIR.mkdir(parents=True, exist_ok=True)
figures = build_assets()
doc = Document()
sec = doc.sections[0]
sec.page_width = Inches(8.5)
sec.page_height = Inches(11)
sec.top_margin = Inches(0.68)
sec.bottom_margin = Inches(0.65)
sec.left_margin = Inches(0.72)
sec.right_margin = Inches(0.72)
styles = doc.styles
normal = styles["Normal"]
normal.font.name = "Heiti SC"
normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Heiti SC")
normal.font.size = Pt(10.5)
normal.font.color.rgb = RGBColor.from_string(INK)
for name, size in (("Title", 27), ("Heading 1", 18), ("Heading 2", 14), ("Heading 3", 11.5)):
st = styles[name]
st.font.name = "Heiti SC"
st._element.rPr.rFonts.set(qn("w:eastAsia"), "Heiti SC")
st.font.size = Pt(size)
st.font.color.rgb = RGBColor(0, 0, 0)
st.font.bold = True
header = sec.header.paragraphs[0]
header.alignment = WD_ALIGN_PARAGRAPH.RIGHT
set_run_font(header.add_run("移动端任务与账户平台需求文档"), size=8.5, color=MUTED)
add_page_number(sec.footer.paragraphs[0])
title = doc.add_paragraph(style="Title")
title_pr = title._p.get_or_add_pPr()
border = title_pr.find(qn("w:pBdr"))
if border is not None:
title_pr.remove(border)
border = OxmlElement("w:pBdr")
for edge in ("top", "left", "bottom", "right", "between"):
node = OxmlElement("w:" + edge)
node.set(qn("w:val"), "nil")
border.append(node)
title_pr.append(border)
title.alignment = WD_ALIGN_PARAGRAPH.LEFT
title.paragraph_format.space_before = Pt(70)
title.paragraph_format.space_after = Pt(18)
set_run_font(title.add_run("移动端任务与账户平台需求文档"), size=27, bold=True, color="000000")
sub = doc.add_paragraph()
set_run_font(sub.add_run("参考站点功能拆解与重构建议"), size=16, bold=True, color="000000")
sub.paragraph_format.space_after = Pt(30)
p(doc, "目标:在不复制品牌素材、敏感数据与高风险业务表述的前提下,复刻参考站点的信息架构和交互骨架,并形成可开发、可验收、可审计的产品需求基线。")
p(doc, "主要读者:产品负责人、交互设计师、前端开发、后端开发、测试、风控与运营。")
p(doc, f"观察日期:{date(2026, 10, 7).isoformat()} 参考环境:移动端网页 文档版本:V1.0")
p(doc, "结论:参考站点由账户、任务订单、余额台账、储入取出、会员等级、内容展示和在线客服七个域构成。建议复刻页面结构与业务闭环,但重写资金、隐私、安全和合规机制。")
page_break(doc)
heading(doc, "1 文档范围与方法", 1)
p(doc, "本需求基于登录后的页面逐项浏览、按钮与导航行为检查、页面状态观察,以及浏览器中可见网络请求和前端资源分析。本文把结论分为三类:实测行为、前端可见实现、建议需求。敏感手机号、邀请码、银行卡等信息已脱敏,不作为原型内容。")
heading(doc, "1.1 已覆盖范围", 2)
for item in [
"登录页现状、注册页字段、会话与路由保护。",
"首页、荣誉榜、会员等级、平台简介、规则说明、代理合作、公司资质。",
"订单记录筛选、领取中心、订单资金变化、手工商城。",
"储入、取出、收款信息绑定、储入记录、取出记录、账户明细。",
"个人信息、头像上传、登录密码、交易密码、通知记录、在线客服。",
"可观察接口、响应结构、关键数据字段与前端安全实现。",
]:
bullet(doc, item)
heading(doc, "1.2 未执行操作", 2)
p(doc, "为避免生成真实订单、变更资金、上传个人文件、修改密码或退出当前会话,本文未点击自动领取、订单提交、储入提交、取出确认、收款信息提交、头像上传、密码提交和退出登录。对应需求由页面字段、前端接口定义与上下游数据状态推导,并标记为待联调确认。")
heading(doc, "2 产品定位与角色", 1)
p(doc, "产品可定位为移动端会员任务与佣金账户平台。用户通过注册、储入余额、领取任务订单、完成任务、获得本金返还与佣金,并可查看台账或发起取出。平台通过等级、任务数量和费率管理用户权益,通过客服处理储入、异常订单和账户问题。")
add_table(doc, ["角色", "主要目标", "关键权限"], [
("游客", "了解平台并注册", "登录、注册、查看隐私政策"),
("会员", "领取任务并查看收益", "首页、任务、订单、余额、客服、个人设置"),
("高级会员", "按等级获得更多任务和更高费率", "等级权益、额度与次数受配置控制"),
("客服", "处理储入、取出、异常任务", "会话、工单、用户与交易查询"),
("运营", "管理内容、等级、任务和公告", "配置、发布、审核、数据看板"),
("财务与风控", "审核资金和异常行为", "充值审核、提现审核、台账、风控规则"),
("管理员", "维护权限与系统参数", "RBAC、审计日志、系统配置"),
], [0.8, 2.1, 3.5])
heading(doc, "3 信息架构与页面路由", 1)
add_table(doc, ["一级模块", "页面或路由", "核心内容", "入口"], [
("认证", "/login /register", "手机号登录、账户名、推荐码、验证码", "未登录访问"),
("首页", "/home", "活动图、快捷入口、余额、荣誉榜、会员等级、公司介绍", "底部首页"),
("任务", "/receive /orderDetail", "领取、等待、任务详情、提交完成", "底部领取"),
("记录", "记录页", "全部、待处理、已完成订单", "底部记录"),
("手工", "/mall", "手工任务卡片并引导客服", "首页快捷入口"),
("资金", "/recharge /withdrawal", "储入、取出、余额、交易密码", "首页与个人中心"),
("账户", "/mine /personalInfo", "用户资料、信用分、邀请码、设置", "底部我的"),
("明细", "/depositRecord /withdrawalRecord /bill", "储入、取出、余额台账", "我的"),
("客服", "/customerService /iframeCustom", "客服列表与第三方会话", "底部客服"),
("内容", "/html/{id}", "平台简介、规则、代理、资质", "首页公司简介"),
], [0.7, 1.45, 3.1, 1.0])
heading(doc, "3.1 建议导航原则", 2)
for item in [
"底部五栏固定为首页、记录、领取、客服、我的;详情页隐藏底部栏并保留明确返回。",
"资金页面必须显示币种、可用余额、冻结余额、预计到账和手续费,不使用含义不明的“人民币编码”。",
"所有金额变动都能跳转至同一业务单据,并在台账中保持可解释、可追溯。",
"客服 iframe 需明确第三方来源、隐私边界和会话状态,失败时提供备用联系方式。",
]:
bullet(doc, item)
heading(doc, "4 核心业务闭环", 1)
heading(doc, "4.1 任务订单闭环", 2)
for item in [
"用户进入领取中心,系统校验登录态、营业时间、会员等级、最低可用余额、未完成任务与风控状态。",
"用户点击领取后,系统创建或匹配一笔任务订单,返回任务编号、商品、金额、佣金、截止时间与状态。",
"任务确认时,台账先记录交易扣款;完成后记录本金返还和佣金入账。参考数据中同一业务单号出现 -298、+298、+14.9 三条流水。",
"订单必须支持待领取、匹配中、待处理、处理中、已完成、超时、冻结、取消与失败,并记录每次状态变化。",
"任何补差额、冻结或信用分变化都必须有明确原因、复核入口和申诉渠道;不得依赖口头客服指令。",
]:
numbered(doc, item)
heading(doc, "4.2 储入与取出闭环", 2)
p(doc, "储入页面按等级展示金额、赠送额、每日单数和佣金比例,用户填写金额与姓名后提交。参考站点还要求联系客服获取收款方式。新系统应改为平台内生成可核验的支付订单,禁止客服通过聊天发送临时个人账户。")
p(doc, "取出前需绑定姓名、银行名、银行账户与收款码,随后输入金额和交易密码。新系统应只保留与实际支付通道必要的字段,敏感数据加密存储,收款码上传须做病毒扫描、内容校验与访问控制。")
heading(doc, "4.3 会员与代理闭环", 2)
p(doc, "参考站点设置普通、白银、黄金、铂金、钻石、星耀、至尊七档,充值门槛、赠送额、每日单数和佣金比例逐级上升,并存在三级推荐奖励。建议将等级规则做成版本化配置,禁止前端写死;代理奖励必须在合规评估通过后再启用。")
page_break(doc)
heading(doc, "5 页面级功能需求", 1)
heading(doc, "5.1 登录与注册", 2)
add_table(doc, ["页面", "字段与控件", "校验与行为", "验收要点"], [
("登录", "手机号、密码、记住密码、登录、去注册、隐私政策", "手机号格式;密码非空;错误次数限制;登录成功进入首页", "不在本地明文保存密码;支持会话过期提示"),
("注册", "账户名、11 位手机号、密码、推荐码、图片验证码、隐私政策", "账户名必填;手机号唯一;验证码校验;推荐码可选或按运营配置", "提交前明确同意协议;防批量注册;注册成功自动登录或返回登录"),
("会话", "Authorization 令牌", "401 清除会话并返回登录;403 显示可解释错误", "支持刷新、撤销、设备管理与退出所有设备"),
], [0.65, 2.1, 2.35, 1.55])
heading(doc, "5.2 首页", 2)
for item in [
"展示轮播图或单图运营位,支持后台排序、上下线、跳转类型和有效期。",
"快捷入口为领取、储入、取出、手工;按后台开关显示,关闭时给出原因而不是静默失效。",
"账户卡展示昵称、可用余额与币种;点击可进入账户明细。",
"荣誉榜为脱敏昵称、积分和结果状态,要求数据真实性标识、刷新频率与隐私策略。",
"会员等级展示当前等级、费率和下一等级条件;等级图不得只是一张不可访问的图片。",
"公司简介包括平台简介、规则说明、代理合作和公司资质,内容由 CMS 管理并保留版本。",
]:
bullet(doc, item)
heading(doc, "5.3 记录与订单详情", 2)
p(doc, "记录页显示可用资产,提供全部、待处理、已完成三种筛选。列表项包括创建时间、商品图、商品名、商品价格、佣金与状态。分页默认 10 条,支持下拉刷新、空状态、加载失败重试和详情跳转。")
p(doc, "实测发现先切换待处理、再切换已完成时曾短暂出现空列表,而重新加载全部后可见已完成记录。验收时需覆盖筛选参数、缓存状态和并发请求覆盖问题。")
add_table(doc, ["状态", "用户可见文案", "允许操作", "系统约束"], [
("匹配中", "正在匹配任务", "取消等待", "只允许一个匹配请求"),
("待处理", "请在截止时间前完成", "查看详情、提交", "倒计时与服务端时间一致"),
("处理中", "已提交,等待确认", "查看详情、联系客服", "防重复提交"),
("已完成", "本金与佣金已入账", "查看流水", "三笔或组合流水必须可核对"),
("超时或冻结", "显示原因与处理路径", "申诉、联系客服", "需要人工复核和审计"),
("失败或取消", "显示失败原因", "重新领取", "不得产生不一致余额"),
], [0.8, 2.1, 1.4, 2.35])
heading(doc, "5.4 领取中心", 2)
p(doc, "领取中心包含会员等级、佣金费率、主领取按钮、匹配进度、今日战果和规则说明。点击主按钮前需完成资格预检;按钮点击后立即进入不可重复提交的 loading 状态;匹配成功跳转订单详情,失败显示可恢复原因。")
bullet(doc, "预检项:营业时间、账户状态、信用或风控状态、最低余额、当日次数、未完成订单、等级商品范围。")
bullet(doc, "统计项:总资产、昨日佣金、今日佣金、今日领取数;所有统计口径需要后台统一定义。")
bullet(doc, "规则文案需要 CMS 管理,禁止把风控与资金规则硬编码在页面。")
heading(doc, "5.5 手工商城", 2)
p(doc, "页面以双列卡片展示图片、任务名称、份数、工资与已领取数;点击卡片实测直接进入客服页。建议增加任务详情、适用人群、交付方式、预计周期、库存、审核标准和风险提示,再由用户主动发起咨询。")
p(doc, "参考站点一条商品名称中可见脚本标签文本,说明内容过滤不足。新系统必须对运营内容做 HTML 转义、富文本白名单、图片域名白名单和持久型 XSS 检测。")
heading(doc, "5.6 客服", 2)
p(doc, "客服页展示多个客服入口与工作时间,点击后在站内 iframe 打开第三方聊天。聊天页含历史会话、系统消息、文本框、图片与视频上传。需求上应增加服务状态、排队人数、会话编号、隐私声明、附件大小与类型限制、敏感信息提醒和会话评价。")
page_break(doc)
heading(doc, "5.7 我的与个人信息", 2)
add_table(doc, ["功能", "需求", "边界或风险"], [
("资料概览", "头像、昵称、邀请码、会员等级、信用状态、余额", "手机号等敏感字段默认脱敏"),
("储入与取出", "提供余额入口与状态提示", "资金操作必须二次确认与风控"),
("收款信息", "姓名、银行、账户、可选支付通道", "加密、最小化收集、修改留痕"),
("头像", "上传、裁剪、预览、替换", "文件扫描、大小和格式校验"),
("密码", "旧密码、新密码、确认密码", "强度、频控、成功后令牌失效"),
("交易密码", "独立于登录密码", "不得用无盐 MD5;失败次数锁定"),
("通知", "公告列表、未读、已读、详情", "重要规则变更需留存阅读证据"),
("退出", "清除令牌和本地用户数据", "保留确认,避免误触"),
], [1.0, 3.1, 2.45])
heading(doc, "5.8 储入", 2)
p(doc, "页面展示等级规则表和金额、姓名输入框。参考规则为普通 500、白银 1888、黄金 10000、铂金 30000、钻石 50000、星耀 88888、至尊 188888;费率从 1.8% 到 5%。规则说明和表格存在个别口径差异,必须以后台版本化配置为唯一事实源。")
bullet(doc, "提交前展示收款主体、订单号、有效期、金额、手续费和风险提示。")
bullet(doc, "储入订单状态:待支付、待审核、成功、失败、过期、取消;失败必须提供原因。")
bullet(doc, "若需要上传付款凭证,必须经过用户明确选择,并限制为图片或 PDF。")
heading(doc, "5.9 取出与收款绑定", 2)
p(doc, "取出页面展示余额、金额、已绑定收款信息摘要和交易密码。若未绑定,弹窗提示并引导至绑定页。绑定页实测字段为姓名、银行名、银行账户、人民币编码、支付宝收款码和微信收款码。建议删除含义不清或非必要字段,并根据支付渠道动态展示。")
bullet(doc, "金额校验:大于 0、不超过可用余额、符合单笔最小值和最大值,并显示手续费与到账金额。")
bullet(doc, "状态:待审核、审核中、处理中、成功、失败、驳回、取消;用户可查看原因和预计时间。")
bullet(doc, "交易密码只在提交时使用;服务端采用强哈希校验并配合频率限制、设备风控和二次验证。")
page_break(doc)
heading(doc, "\u20605.10 账户明细与记录", 2)
p(doc, "账户明细需按业务单号聚合展示变动类型、变动金额、变动前余额、变动后余额、时间、状态和关联单据。储入记录显示订单号、状态、金额、创建时间;取出记录字段同构,并增加手续费、到账金额与失败原因。")
heading(doc, "6 数据模型与状态机", 1)
add_table(doc, ["实体", "关键字段", "说明"], [
("User", "id, username, mobile, avatar, status, inviteCode", "用户主档,手机号单独加密与索引"),
("Membership", "levelId, rate, dailyLimit, withdrawLimits, effectiveAt", "版本化等级权益"),
("Wallet", "available, frozen, currency, version", "使用乐观锁或账户序列保证一致性"),
("LedgerEntry", "bizNo, type, direction, amount, before, after", "不可变台账,支持幂等与冲正"),
("TaskOrder", "orderNo, productId, amount, commission, status, deadline", "任务生命周期"),
("DepositOrder", "depositNo, amount, channel, status, proofUrl", "储入生命周期"),
("WithdrawalOrder", "withdrawNo, amount, fee, netAmount, status", "取出生命周期"),
("PayoutProfile", "realName, bankName, maskedAccount, qrAssetIds", "敏感字段加密与脱敏"),
("Content", "type, title, body, version, status, publishedAt", "公告、规则与公司资料"),
("SupportSession", "sessionNo, provider, status, openedAt, closedAt", "第三方客服映射"),
("AuditLog", "actor, action, target, before, after, ip, device", "资金与权限操作强制留痕"),
], [1.05, 3.55, 2.0])
heading(doc, "6.1 幂等与一致性", 2)
for item in [
"领取、提交订单、储入回调、取出申请和密码修改都必须使用幂等键。",
"钱包余额只能由服务端台账事务修改;前端显示值不参与结算。",
"订单状态转换由服务端状态机控制,不允许客户端任意设置。",
"重复回调、网络重试和并发点击不得重复扣款、返款或发佣金。",
"所有涉及金额的接口返回业务单号和最新余额版本。",
]:
bullet(doc, item)
heading(doc, "7 接口需求", 1)
p(doc, "下表分为实测请求与前端资源中可见接口。实测接口在浏览器中返回 HTTP 200,响应外层为 Base64 字符串,解码后为 JSON,统一包含 success、code、data、msg。建议新系统直接使用标准 JSON,不把 Base64 当作安全措施。")
add_table(doc, ["方法", "接口", "用途", "主要请求或返回字段", "证据"], [
("POST", "/wap-api/doLogin", "登录", "username, password;token, users", "前端实现与已发生请求"),
("POST", "/wap-api/doRegister", "注册", "nickName, username, password, inviteCode, code, uuid", "前端实现"),
("GET", "/wap-api/captchaImage", "图片验证码", "uuid, img, captchaBol", "前端实现"),
("GET", "/wap-api/profile", "用户概要", "tel, username, headpic, inviteCode, level, levelRate, balance, xyf", "实测"),
("GET", "/wap-api/banner/list", "首页横幅", "图片地址数组", "实测"),
("GET", "/wap-api/home", "首页开关与内容编号", "SHOP_STATUS, TASK, POP_MESSAGE, 内容 ID", "实测"),
("GET", "/wap-api/user/data/home", "荣誉榜", "name, avatar, balance", "实测"),
("GET", "/wap-api/ctrl/level-list", "等级配置", "name, orderNum, num, giveNum, bili, 提现限制", "实测"),
("GET", "/wap-api/support", "客服列表", "qq, url, workTime, 分页", "实测"),
("GET", "/wap-api/convey/page", "订单分页", "pageNo, pageSize, status;订单与商品字段", "实测"),
("POST", "/wap-api/convey/order", "领取或匹配订单", "无显式参数;返回订单", "前端实现,未执行"),
("POST", "/wap-api/convey/order/submit/{id}", "提交任务", "订单 id", "前端实现,未执行"),
("GET", "/wap-api/convey/count", "领取统计", "balance, countToday, countNumToday, countNumYesterday, content", "实测"),
("GET", "/wap-api/convey/unpay", "未完成订单检查", "djs 等状态", "实测"),
("GET", "/wap-api/product/page", "手工商品分页", "分页条件;商品卡片", "前端实现"),
("GET", "/wap-api/platform-config/trade-wait-time", "任务等待时间", "秒数或分钟数", "实测"),
("GET", "/wap-api/bank/current/info", "当前收款信息", "收款资料摘要", "前端实现"),
("POST", "/wap-api/bank/save", "保存收款信息", "姓名、银行、账户、收款码", "前端实现,未执行"),
("POST", "/wap-api/recharge/recharge", "创建储入申请", "amount, name 等", "前端实现,未执行"),
("GET", "/wap-api/recharge/page", "储入记录分页", "分页与状态", "前端实现"),
("POST", "/wap-api/deposit/do_deposit", "创建取出申请", "amount, paypassword 等", "前端实现,未执行"),
("GET", "/wap-api/deposit/page", "取出记录分页", "分页与状态", "前端实现"),
("GET", "/wap-api/balance-log/page", "账户流水", "分页;类型、金额、业务单号", "前端实现与页面实测"),
("POST", "/wap-api/users/setPwd", "修改登录密码", "oldPwd, newPwd", "前端实现,未执行"),
("POST", "/wap-api/users/setPwd2", "修改交易密码", "oldPwd, newPwd", "前端实现,未执行"),
("POST", "/wap-api/local/upload", "文件上传", "multipart file", "前端实现,未执行"),
("GET/POST", "/wap-api/user-tc/select /read/{id} /page", "弹窗通知", "公告、已读、分页", "实测与前端实现"),
], [0.55, 1.65, 1.25, 2.45, 0.85], 7.2)
heading(doc, "7.1 新系统接口规范", 2)
for item in [
"统一使用 HTTPS、JSON、明确的 HTTP 状态码、traceId、错误码和可本地化 message。",
"Authorization 使用短期访问令牌与可撤销刷新令牌;敏感操作增加一次性挑战或二次验证。",
"列表接口统一 page、pageSize、sort、status,返回 items、total、hasNext。",
"金额使用最小货币单位整数或高精度 Decimal,禁止浮点结算。",
"上传接口先申请受限上传凭证,服务端扫描后再绑定业务。",
"所有写接口要求 Idempotency-Key、设备信息与审计上下文。",
]:
bullet(doc, item)
heading(doc, "8 管理后台需求", 1)
add_table(doc, ["模块", "主要能力", "审批与审计"], [
("用户管理", "查询、状态、等级、信用、设备、邀请关系", "冻结与解冻需理由和双人复核"),
("等级配置", "门槛、赠送、次数、费率、提现限制、商品范围", "版本化发布,可回滚"),
("任务商品", "商品、图片、金额、佣金、库存、上下线", "内容过滤和审核流"),
("任务订单", "状态、倒计时、资金流水、异常处理", "人工改状态必须双人审批"),
("储入管理", "支付订单、回调、凭证、审核、对账", "每日对账与差错处理"),
("取出管理", "审核、通道、手续费、失败重试", "大额与异常规则"),
("内容管理", "横幅、规则、简介、资质、公告", "预览、定时、版本与发布人"),
("客服管理", "客服入口、工作时间、会话映射、工单", "第三方访问最小权限"),
("风控", "设备、IP、频次、关联账户、异常金额", "命中规则可解释并可申诉"),
("权限审计", "RBAC、操作日志、导出日志", "关键权限定期复核"),
], [1.0, 3.65, 2.1])
heading(doc, "9 非功能需求", 1)
heading(doc, "9.1 安全", 2)
for item in [
"密码使用 Argon2id 或 bcrypt 加盐存储。参考站点在浏览器端对密码做 MD5,这不能替代服务端强哈希。",
"输入与富文本做上下文相关转义;运营内容采用白名单;CSP 禁止任意外部脚本。",
"银行卡和手机号加密存储,日志与埋点禁止记录完整值;展示统一脱敏。",
"接口启用 CSRF 或同站策略、速率限制、风控挑战、签名回调和重放保护。",
"第三方客服 iframe 设置最小 sandbox 权限、allowlist 域名和清晰的数据传输告知。",
"上传文件限制 MIME、扩展名、体积与像素,执行恶意内容扫描,使用隔离存储和短期访问 URL。",
]:
bullet(doc, item)
heading(doc, "9.2 性能与可用性", 2)
for item in [
"首屏 LCP 目标小于 2.5 秒,核心 API P95 小于 800 毫秒,写操作 P95 小于 1.5 秒。",
"按钮防抖、请求取消、重试与离线提示;长列表分页和图片懒加载。",
"资金写入接口可用性目标 99.95%,客服与内容接口目标 99.9%。",
"客户端时间仅用于展示,截止时间与状态以服务端为准。",
]:
bullet(doc, item)
heading(doc, "9.3 可访问性与国际化", 2)
p(doc, "按钮和导航必须有语义标签与至少 44×44 像素触控区域;颜色不作为唯一状态标识;支持字体放大。简体、繁体和术语需统一,避免同一页面混用“储入/充值”“取出/提现”“领取/抢单”。")
heading(doc, "10 合规与业务风险", 1)
p(doc, "参考站点涉及先储入、任务扣款、返本付佣、推荐奖励、信用分和提现限制。此类模式在不同司法辖区可能触及支付、消费者保护、反洗钱、网络营销或其他监管要求。上线前需由法务和持牌支付机构评估,不应直接复制其资金规则、免责条款或客服收款模式。")
add_table(doc, ["风险", "参考站点表现", "新系统要求", "优先级"], [
("资金真实性", "客服提供收款方式,失败责任不清", "使用合规支付通道、订单化收款与自动对账", "P0"),
("诱导与不透明", "高等级对应更高储入和收益", "明确费用、风险、无保证收益,禁止误导", "P0"),
("推荐奖励", "三级佣金 16% 8% 4%", "法务审查后决定是否启用", "P0"),
("账户冻结", "规则含冻结、补差额、信用分", "冻结需合法依据、通知、申诉和复核", "P0"),
("内容安全", "商品名出现脚本标签文本", "CMS 白名单与持久型 XSS 防护", "P0"),
("密码安全", "前端无盐 MD5", "服务端强哈希、MFA、频控", "P0"),
("隐私", "收集银行账户和收款码", "最小化、加密、授权、删除与访问审计", "P0"),
("数据一致性", "筛选短暂空列表、规则口径差异", "单一配置源、请求竞态处理、自动化测试", "P1"),
], [1.0, 2.0, 2.9, 0.65])
heading(doc, "11 埋点与运营指标", 1)
add_table(doc, ["事件", "触发时机", "关键属性"], [
("auth_login_result", "登录成功或失败", "result, errorCode, deviceRisk"),
("home_shortcut_click", "点击首页快捷入口", "target, userLevel"),
("order_claim_click", "点击领取", "eligibilityResult, balanceBucket, level"),
("order_state_change", "订单状态变化", "orderNo, from, to, reason"),
("deposit_submit", "提交储入申请", "amountBucket, channel, result"),
("withdraw_submit", "提交取出申请", "amountBucket, fee, result"),
("support_open", "打开客服会话", "provider, entry, workStatus"),
("content_view", "查看规则或公告", "contentId, version, readDuration"),
("security_challenge", "触发安全验证", "scene, result, ruleId"),
], [1.35, 2.2, 3.0])
p(doc, "核心指标包括注册转化、首个任务完成率、领取成功率、订单超时率、储入成功率、取出成功率与处理时长、客服转人工率、异常账户率、账务差错率和投诉率。涉及金额与身份的数据只做区间化或匿名化统计。")
heading(doc, "12 验收标准", 1)
for idx, item in enumerate([
"未登录用户只能访问登录、注册和公开协议;受保护路由统一拦截。",
"同一用户重复点击领取或提交订单,不产生重复业务单和重复资金流水。",
"订单完成后,订单状态、钱包余额、三类流水和统计数据在一次事务或可验证最终一致性中完成。",
"储入与取出所有状态均可在记录页查询,失败和驳回有明确原因。",
"等级规则由后台发布后前台一致生效,表格、领取校验与提现限制不存在口径差异。",
"手机号、银行卡、邀请码和交易密码不出现在客户端日志、服务端普通日志或分析平台。",
"富文本、商品名、公告和客服消息中的脚本或危险 HTML 不能执行。",
"接口 401、403、429、5xx、超时和断网场景均有清晰恢复路径。",
"移动端 320 至 430 像素宽度可用,底部导航不遮挡内容,键盘弹出时表单按钮可达。",
"关键资金和权限操作在后台可按用户、业务单号和时间完整审计。",
], 1):
p(doc, f"{idx}. {item}")
heading(doc, "13 交付优先级与里程碑", 1)
add_table(doc, ["阶段", "范围", "退出条件"], [
("MVP 认证与账户", "登录注册、资料、钱包、台账、内容、客服", "权限、安全、审计基线通过"),
("MVP 任务闭环", "任务列表、领取、详情、提交、状态机、佣金", "幂等和账务一致性测试通过"),
("资金闭环", "储入、取出、收款绑定、支付通道、对账", "支付与法务合规评审通过"),
("运营能力", "等级、公告、横幅、商品、通知、后台", "配置版本和发布审核可用"),
("增长与优化", "邀请关系、数据看板、体验优化", "合规批准且核心指标稳定"),
], [1.1, 3.55, 2.0])
page_break(doc)
heading(doc, "14 低保真原型", 1)
p(doc, "以下原型根据实测页面重新绘制,用于确认页面层级、组件位置和交互入口,不复制原站品牌素材、头像或敏感数据。视觉设计阶段应重新建立色彩、字体、图标和组件规范。")
for idx, fig in enumerate(figures, 1):
add_picture(doc, fig, f"图 {idx} 参考站点功能复刻原型", width=6.2, page_break_before=(idx > 1))
final_heading = heading(doc, "15 待确认事项", 1)
final_heading.paragraph_format.page_break_before = True
for item in [
"目标产品是否真实涉及用户资金储入与取出,还是仅做演示积分。",
"任务来源、商品真实性、结算主体和佣金承担方。",
"目标市场与适用法律、支付通道和实名要求。",
"是否保留会员等级、推荐奖励、信用分和冻结机制。",
"客服使用自建系统还是第三方服务,允许传输哪些用户数据。",
"管理后台的组织结构、审批层级和财务对账责任人。",
"品牌名、语言版本、视觉方向与是否需要 App 壳或 PWA。",
]:
bullet(doc, item)
p(doc, "在上述事项明确前,可以先完成无资金风险的认证、内容、任务展示、客服、账户明细和后台配置原型;资金接口只做沙箱与模拟数据。")
doc.core_properties.title = "移动端任务与账户平台需求文档"
doc.core_properties.subject = "参考站点功能拆解与重构建议"
doc.core_properties.author = "Product Requirement Analysis"
doc.core_properties.keywords = "需求文档, 移动端, 任务订单, 账户, 接口, 原型"
doc.save(OUT_DOCX)
print(OUT_DOCX)
if __name__ == "__main__":
build_doc()
+146
View File
@@ -0,0 +1,146 @@
from __future__ import annotations
import hashlib
import re
from pathlib import Path
from docx import Document
from docx.oxml.ns import qn
from docx.table import Table
from docx.text.paragraph import Paragraph
ROOT = Path(__file__).resolve().parents[1]
DOC_DIR = ROOT / "docs" / "admin_reference_prd"
SOURCE = DOC_DIR / "后台管理系统需求文档.docx"
TARGET = DOC_DIR / "后台管理系统需求文档.md"
ASSET_DIR = DOC_DIR / "assets"
IMAGE_ALTS = {
"prototype_01_dashboard.png": "后台首页看板脱敏原型",
"prototype_02_member_list.png": "会员列表脱敏原型",
"prototype_03_member_modal.png": "会员编辑弹窗原型",
"prototype_04_withdrawal.png": "提现审核脱敏原型",
"prototype_05_rbac.png": "RBAC 角色权限原型",
"prototype_06_flow.png": "C 端与后台业务闭环原型",
}
def iter_blocks(document: Document):
for child in document.element.body.iterchildren():
if child.tag == qn("w:p"):
yield Paragraph(child, document)
elif child.tag == qn("w:tbl"):
yield Table(child, document)
def media_map(document: Document) -> dict[str, str]:
assets_by_hash = {
hashlib.sha256(path.read_bytes()).hexdigest(): path.name
for path in ASSET_DIR.glob("*.png")
}
mapping: dict[str, str] = {}
for rel_id, rel in document.part.rels.items():
if "image" not in rel.reltype:
continue
digest = hashlib.sha256(rel.target_part.blob).hexdigest()
name = assets_by_hash.get(digest)
if name:
mapping[rel_id] = f"assets/{name}"
return mapping
def paragraph_images(paragraph: Paragraph, images: dict[str, str]) -> list[str]:
result: list[str] = []
for blip in paragraph._p.xpath(".//a:blip"):
rel_id = blip.get(qn("r:embed"))
if rel_id in images:
result.append(images[rel_id])
return result
def escape_cell(value: str) -> str:
return value.strip().replace("|", "\\|").replace("\n", "<br>") or "—"
def table_markdown(table: Table) -> list[str]:
rows = [[escape_cell(cell.text) for cell in row.cells] for row in table.rows]
if not rows:
return []
width = max(len(row) for row in rows)
rows = [row + ["—"] * (width - len(row)) for row in rows]
lines = [
"| " + " | ".join(rows[0]) + " |",
"| " + " | ".join(["---"] * width) + " |",
]
lines.extend("| " + " | ".join(row) + " |" for row in rows[1:])
return lines
def github_slug(title: str) -> str:
slug = title.strip().lower()
slug = re.sub(r"[^\w\-\u4e00-\u9fff ]", "", slug)
return re.sub(r"\s+", "-", slug)
def convert() -> None:
document = Document(SOURCE)
images = media_map(document)
body: list[str] = []
top_level: list[str] = []
image_number = 0
for block in iter_blocks(document):
if isinstance(block, Table):
body.extend(table_markdown(block))
body.append("")
continue
text = block.text.strip()
style = block.style.name if block.style else "Normal"
embedded = paragraph_images(block, images)
if style == "Title" and text:
body.extend([f"# {text}", ""])
elif style == "Heading 1" and text:
top_level.append(text)
body.extend([f"## {text}", ""])
elif style == "Heading 2" and text:
body.extend([f"### {text}", ""])
elif style == "List Bullet" and text:
body.extend([f"- {text}", ""])
elif style == "List Number" and text:
body.extend([f"1. {text}", ""])
elif text:
if text.startswith("结论:"):
body.extend([f"> **{text[:3]}** {text[3:]}", ""])
elif text.startswith("P0:"):
body.extend([f"> **P0 风险:** {text[3:]}", ""])
else:
body.extend([text, ""])
for path in embedded:
image_number += 1
alt = IMAGE_ALTS.get(Path(path).name, f"需求原型图 {image_number}")
body.extend([f"![{alt}]({path})", ""])
# Word 封面之后放置 Markdown 可点击目录,去掉 Word 中无意义的空段落。
first_section = next(i for i, line in enumerate(body) if line.startswith("## 1 "))
toc = ["## 目录", ""]
toc.extend(f"- [{title}](#{github_slug(title)})" for title in top_level)
toc.extend(["", "---", ""])
output = body[:first_section] + toc + body[first_section:]
compact: list[str] = []
for line in output:
if line == "" and compact and compact[-1] == "":
continue
compact.append(line)
rendered = "\n".join(compact).rstrip() + "\n"
rendered = re.sub(r"(^- .+)\n\n(?=- )", r"\1\n", rendered, flags=re.MULTILINE)
rendered = re.sub(r"(^1\. .+)\n\n(?=1\. )", r"\1\n", rendered, flags=re.MULTILINE)
TARGET.write_text(rendered, encoding="utf-8")
if __name__ == "__main__":
convert()
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/System/Library/Fonts</dir>
<dir>/System/Library/Fonts/Supplemental</dir>
<dir>/Library/Fonts</dir>
<cachedir>/private/tmp/codex-font-cache</cachedir>
</fontconfig>
+302
View File
@@ -0,0 +1,302 @@
from __future__ import annotations
from pathlib import Path
from docx import Document
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT, WD_TABLE_ALIGNMENT
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Inches, Pt, RGBColor
from docx.text.paragraph import Paragraph
ROOT = Path(__file__).resolve().parents[1]
SOURCE = ROOT / "docs" / "reference_site_prd" / "移动端任务与账户平台需求文档.docx"
OUT_DIR = ROOT / "docs" / "reference_site_prd_v2"
OUTPUT = OUT_DIR / "移动端任务与账户平台需求文档 V2.docx"
INK = "18202F"
MUTED = "667085"
GRID = "D9D9D9"
def set_font(run, size=10.5, bold=False, color=INK):
run.font.name = "Heiti SC"
run._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), "Heiti SC")
run.font.size = Pt(size)
run.font.bold = bold
run.font.color.rgb = RGBColor.from_string(color)
def replace_all(doc, old: str, new: str):
for paragraph in list(doc.paragraphs) + list(doc.sections[0].header.paragraphs):
if old not in paragraph.text:
continue
full = paragraph.text.replace(old, new)
for run in paragraph.runs:
run.text = ""
run = paragraph.runs[0] if paragraph.runs else paragraph.add_run()
run.text = full
style = paragraph.style.name if paragraph.style else ""
if style == "Title":
set_font(run, 25, True, "000000")
elif style.startswith("Heading"):
set_font(run, 14, True, "000000")
else:
set_font(run, 10.5)
def find_paragraph(doc, exact: str):
for p in doc.paragraphs:
if p.text.strip() == exact:
return p
raise ValueError(f"Paragraph not found: {exact}")
def add_before(anchor, text: str, style: str | None = None, size=10.5, bold=False, color=INK,
space_before=0, space_after=6):
p = OxmlElement("w:p")
anchor._p.addprevious(p)
paragraph = Paragraph(p, anchor._parent)
if style:
paragraph.style = style
paragraph.paragraph_format.space_before = Pt(space_before)
paragraph.paragraph_format.space_after = Pt(space_after)
paragraph.paragraph_format.line_spacing = 1.25
set_font(paragraph.add_run(text), size, bold, color)
return paragraph
def add_heading_before(anchor, text: str, level=2):
sizes = {1: 18, 2: 14, 3: 11.5}
return add_before(anchor, text, f"Heading {level}", sizes[level], True, "000000", 10, 6)
def add_bullet_before(anchor, text: str):
return add_before(anchor, text, "List Bullet", 10.2, False, INK, 0, 3)
def set_cell(cell, text, header=False, shade=None, align=WD_ALIGN_PARAGRAPH.LEFT, size=8.6):
cell.text = str(text)
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
tc_pr = cell._tc.get_or_add_tcPr()
mar = OxmlElement("w:tcMar")
for side in ("top", "start", "bottom", "end"):
node = OxmlElement(f"w:{side}")
node.set(qn("w:w"), "100")
node.set(qn("w:type"), "dxa")
mar.append(node)
tc_pr.append(mar)
borders = OxmlElement("w:tcBorders")
for edge in ("top", "left", "bottom", "right"):
node = OxmlElement(f"w:{edge}")
node.set(qn("w:val"), "single")
node.set(qn("w:sz"), "6")
node.set(qn("w:color"), GRID)
borders.append(node)
tc_pr.append(borders)
if shade:
shd = OxmlElement("w:shd")
shd.set(qn("w:fill"), shade)
tc_pr.append(shd)
p = cell.paragraphs[0]
p.alignment = align
p.paragraph_format.space_after = Pt(0)
for run in p.runs:
set_font(run, size, header, "FFFFFF" if header else INK)
def table_before(doc, anchor, headers, rows, widths):
table = doc.add_table(rows=1, cols=len(headers))
table.alignment = WD_TABLE_ALIGNMENT.CENTER
table.autofit = False
table.rows[0]._tr.get_or_add_trPr().append(OxmlElement("w:cantSplit"))
repeat = OxmlElement("w:tblHeader")
repeat.set(qn("w:val"), "true")
table.rows[0]._tr.get_or_add_trPr().append(repeat)
for i, h in enumerate(headers):
set_cell(table.rows[0].cells[i], h, True, "334E7D", WD_ALIGN_PARAGRAPH.CENTER)
for ridx, row in enumerate(rows):
tr = table.add_row()
tr._tr.get_or_add_trPr().append(OxmlElement("w:cantSplit"))
for i, value in enumerate(row):
set_cell(tr.cells[i], value, False, "F3F6FB" if ridx % 2 else None,
WD_ALIGN_PARAGRAPH.CENTER if i == 0 else WD_ALIGN_PARAGRAPH.LEFT)
for row in table.rows:
for i, width in enumerate(widths):
row.cells[i].width = Inches(width)
anchor._p.addprevious(table._tbl)
return table
def add_revision_summary(doc):
anchor = find_paragraph(doc, "1 文档范围与方法")
add_heading_before(anchor, "0 后台反向校验结论", 1)
add_before(anchor,
"后台走查表明,原 V1 已覆盖账户、任务订单、储入取出和客服等主链路,但对后台可配置项、人工审核、任务大厅、会员限制和运营动作的用户端反馈描述不足。V2 将后台视为业务规则的管理端,并补齐移动端必须展示的状态、原因、时效和恢复路径。")
table_before(doc, anchor,
["校验主题", "后台证据", "V1 缺口", "V2 调整"],
[
("任务模型", "商品订单、任务大厅、任务列表、会员任务审核并存", "容易把所有任务理解为自动领取订单", "拆分自动订单与人工任务两条链路"),
("资金审核", "充值与提现支持人工通过或驳回", "状态虽有定义,但用户通知与补件不够明确", "增加审核进度、驳回原因、补件和到账凭证"),
("会员治理", "后台可改等级、禁用、账变和奖励", "移动端缺少被限制后的统一反馈", "增加受限状态页、原因、期限、申诉和台账说明"),
("运营配置", "营业时间、金额门槛、页面开关、Banner 和文本可配置", "前台规则散落在页面描述中", "建立配置版本、发布时间和客户端降级契约"),
("内容真实性", "存在假人和弹幕入口", "只提出风险,未明确产品取舍", "生产环境不展示伪造用户行为;演示数据必须标识"),
("异常恢复", "任务大厅接口异常,客服页可能空白", "通用错误处理不够落地", "每个核心入口增加错误码、重试和备用路径"),
], [1.0, 2.0, 1.9, 2.0])
add_before(anchor, "V2 的核心原则是:后台每一次影响用户权益的操作,都必须在移动端形成可解释、可追踪、可申诉的结果。", size=10.5, bold=True)
def add_business_closure(doc):
anchor = find_paragraph(doc, "5 页面级功能需求")
add_heading_before(anchor, "4.4 后台操作与移动端反馈闭环", 2)
for text in [
"后台修改等级、佣金、每日次数或提现限制时,移动端必须显示规则版本和生效时间。进行中的订单继续使用创建时的规则快照。",
"后台审核充值、提现或会员任务后,移动端记录页同步显示审核节点、处理时间、结果和原因,并通过站内通知提醒用户。",
"后台禁用、冻结或限制会员时,移动端不得只表现为接口失败。系统应进入受限状态页,说明受影响功能、期限、原因类别和申诉入口。",
"后台执行余额调整或奖励发放时,移动端账户明细必须产生独立流水,展示业务单号、变动方向、原因摘要和处理主体类型。",
"后台下线 Banner、内容、商品、任务或客服入口后,移动端按配置版本刷新。已打开的页面应显示已下线状态,不得继续提交。",
]:
add_bullet_before(anchor, text)
# The V1 builder placed an explicit page break between sections 4 and 5.
# The new 4.4 content now occupies that boundary, so remove the old break to
# avoid leaving section 4.3 alone on a mostly empty page.
paragraphs = doc.paragraphs
closure = find_paragraph(doc, "4.4 后台操作与移动端反馈闭环")
closure_index = next(i for i, paragraph in enumerate(paragraphs) if paragraph._p is closure._p)
for candidate in reversed(paragraphs[:closure_index]):
if candidate._p.xpath('.//w:br[@w:type="page"]'):
candidate._element.getparent().remove(candidate._element)
break
def add_mobile_pages(doc):
anchor = find_paragraph(doc, "6 数据模型与状态机")
add_heading_before(anchor, "5.11 任务大厅与会员任务", 2)
add_before(anchor, "后台同时存在任务大厅、任务列表和会员任务审核,因此移动端需要把人工任务与自动领取订单分开设计,避免共用状态和文案。")
table_before(doc, anchor,
["环节", "移动端需求", "后台对应", "关键状态"],
[
("任务大厅", "展示任务名称、图标、奖励、适用等级、剩余名额和截止时间", "任务大厅配置", "未开始、可申请、已满、已结束、已下线"),
("任务详情", "展示说明、材料要求、审核标准、预计时长和风险提示", "任务列表", "可申请、不可申请、已申请"),
("提交材料", "支持文本、图片或文件,提交前预览并可撤回", "会员任务审核", "草稿、已提交、审核中"),
("审核结果", "显示通过、驳回或补件原因,允许查看历史版本", "会员任务审核", "通过、驳回、待补件、已取消"),
("奖励入账", "审核通过后生成奖励流水和通知", "奖励及账变", "待入账、已入账、入账失败"),
], [0.9, 2.55, 1.45, 1.85])
add_heading_before(anchor, "5.12 会员受限与运营通知", 2)
for text in [
"会员状态至少包括正常、临时限制、冻结、禁用和注销中;登录后优先展示状态说明,而不是让各页面分别报错。",
"站内通知按系统公告、审核结果、资金结果、安全提醒和规则变更分类,重要通知保留已读时间和内容版本。",
"荣誉榜、滚动消息和弹幕只能使用可证明的真实业务数据。测试或演示数据必须与生产数据隔离并明确标识。",
"客服入口不可用时,显示服务时间、错误编号、重试按钮和经审核的备用渠道;不得把空白 iframe 作为最终状态。",
]:
add_bullet_before(anchor, text)
def add_contracts(doc):
anchor = find_paragraph(doc, "8 管理后台需求")
add_heading_before(anchor, "7.2 后台配置与移动端契约", 2)
table_before(doc, anchor,
["后台配置", "移动端消费方式", "校验与降级"],
[
("营业与交易时间", "展示当前可用状态和下一开放时间", "结束时间必须晚于开始时间;配置无效时关闭提交并告警"),
("金额与次数门槛", "表单提示、按钮状态和服务端校验使用同一版本", "客户端仅展示,服务端最终裁决"),
("会员等级", "等级页、领取资格、佣金和提现限制统一读取", "订单创建时保存规则快照"),
("Banner 与文本", "按排序、有效期、语言和跳转类型渲染", "危险链接拦截;富文本白名单"),
("商品与任务", "仅展示已发布且适用于当前用户的条目", "已下线条目不可新建申请,历史记录仍可查看"),
("客服入口", "按在线状态、时间和排序展示", "第三方失败时回退到备用联系方式"),
], [1.35, 3.0, 2.4])
add_before(anchor, "所有配置响应应包含 configVersion、effectiveAt 和 updatedAt。客户端缓存必须按版本失效,关键交易提交时还要携带规则版本,由服务端拒绝过期规则并返回可读提示。")
def add_acceptance(doc):
anchor = find_paragraph(doc, "13 交付优先级与里程碑")
add_heading_before(anchor, "12.1 后台联动补充验收", 2)
for idx, text in enumerate([
"后台发布新等级规则后,移动端在生效时间后展示新规则;存量订单仍按原规则结算。",
"后台驳回充值、提现或任务申请后,移动端显示同一原因码、用户文案、处理时间和补救入口。",
"后台冻结会员后,移动端所有受影响写操作均被服务端拒绝,并统一跳转受限状态页;解除后无需重新安装或清缓存。",
"后台余额调整和奖励发放均生成不可变流水;移动端可从通知跳转至对应流水详情。",
"任务大厅服务不可用时,移动端保留其他导航功能,显示错误编号并支持重试,不出现空白页或无限加载。",
"客服第三方页面失败时,移动端展示备用渠道,且不泄露令牌、手机号、银行卡或完整会话参数。",
"后台下线商品或任务后,新申请立即禁止;已申请记录仍可查看状态和审核结果。",
"生产环境的榜单、弹幕和消息不得混入测试账号或伪造行为数据。",
], 11):
add_before(anchor, f"{idx}. {text}")
def add_pending_questions(doc):
anchor = find_paragraph(doc, "在上述事项明确前,可以先完成无资金风险的认证、内容、任务展示、客服、账户明细和后台配置原型;资金接口只做沙箱与模拟数据。")
add_heading_before(anchor, "15.1 后台联动待确认", 2)
for text in [
"任务大厅与自动领取订单是否属于两个独立业务,还是同一任务的不同入口。",
"充值、提现和会员任务的驳回原因由固定字典选择,还是允许运营自由输入。",
"会员禁用、冻结、等级调整和余额调整分别由哪些角色发起、复核与申诉处理。",
"规则配置采用立即生效、定时发布还是审批后发布;存量订单使用哪一版规则。",
"荣誉榜与弹幕是否保留。若保留,只能展示真实、可审计且已脱敏的数据。",
]:
add_bullet_before(anchor, text)
def remove_page_break_before(doc, heading_text: str):
paragraphs = doc.paragraphs
target = find_paragraph(doc, heading_text)
target_index = next(i for i, paragraph in enumerate(paragraphs) if paragraph._p is target._p)
for candidate in reversed(paragraphs[:target_index]):
if candidate._p.xpath('.//w:br[@w:type="page"]'):
candidate._element.getparent().remove(candidate._element)
return
def normalize_layout(doc):
# Fill the otherwise nearly empty customer-service page and reset inherited
# indentation that clipped the first digit of a top-of-page heading.
remove_page_break_before(doc, "5.7 我的与个人信息")
remove_page_break_before(doc, "\u20605.10 账户明细与记录")
for text in ("5.7 我的与个人信息", "5.9 取出与收款绑定", "5.10 账户明细与记录"):
paragraph = next(p for p in doc.paragraphs if p.text.strip().endswith(text))
paragraph.paragraph_format.left_indent = Inches(0)
paragraph.paragraph_format.first_line_indent = Inches(0)
# The source document predates the table-row split safeguard used by the
# backend PRD. Apply it globally so milestone and interface rows do not break
# across pages.
for table in doc.tables:
for row in table.rows:
tr_pr = row._tr.get_or_add_trPr()
if not tr_pr.xpath('./w:cantSplit'):
tr_pr.append(OxmlElement("w:cantSplit"))
def update_metadata(doc):
doc.core_properties.title = "移动端任务与账户平台需求文档 V2"
doc.core_properties.subject = "基于后台功能的移动端需求反向校验修订版"
doc.core_properties.author = "Product Requirement Analysis"
doc.core_properties.keywords = "需求文档, 移动端, 后台联动, 任务, 资金, 审核, 原型"
def main():
OUT_DIR.mkdir(parents=True, exist_ok=True)
doc = Document(SOURCE)
replace_all(doc, "移动端任务与账户平台需求文档", "移动端任务与账户平台需求文档 V2")
replace_all(doc, "参考站点功能拆解与重构建议", "后台反向校验修订版")
replace_all(doc, "文档版本:V1.0", "文档版本:V2.0")
replace_all(doc,
"结论:参考站点由账户、任务订单、余额台账、储入取出、会员等级、内容展示和在线客服七个域构成。建议复刻页面结构与业务闭环,但重写资金、隐私、安全和合规机制。",
"结论:移动端主链路可以保留,但必须新增人工任务、审核结果、会员受限、配置版本和后台账变反馈。资金、权限、隐私和内容真实性仍按高风险能力重构。")
add_revision_summary(doc)
add_business_closure(doc)
add_mobile_pages(doc)
add_contracts(doc)
add_acceptance(doc)
add_pending_questions(doc)
normalize_layout(doc)
update_metadata(doc)
doc.save(OUTPUT)
print(OUTPUT)
if __name__ == "__main__":
main()
+23
View File
@@ -0,0 +1,23 @@
from docx import Document
from docx.oxml.ns import qn
names = [
"Heiti SC",
"STHeiti",
"Hiragino Sans GB",
"Songti SC",
"Arial Unicode MS",
"PingFang SC",
"Microsoft YaHei",
"SimSun",
"Noto Sans CJK SC",
]
doc = Document()
for name in names:
p = doc.add_paragraph()
r = p.add_run(name + " 中文字体测试 移动端任务与账户平台")
r.font.name = name
r._element.get_or_add_rPr().rFonts.set(qn("w:ascii"), name)
r._element.get_or_add_rPr().rFonts.set(qn("w:hAnsi"), name)
r._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), name)
doc.save("docs/reference_site_prd/font_test.docx")
+19
View File
@@ -0,0 +1,19 @@
root = true
[*]
charset=utf-8
end_of_line=LF
insert_final_newline=true
indent_style=space
indent_size=2
max_line_length = 100
[*.{yml,yaml,json}]
indent_style = space
indent_size = 2
[*.md]
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
+34
View File
@@ -0,0 +1,34 @@
# 只在开发模式中被载入
# 网站根目录
VITE_PUBLIC_PATH=/
# 网站前缀
VITE_BASE_URL=/
# 是否删除console
VITE_DROP_CONSOLE=true
# 跨域代理,可以配置多个,请注意不要换行,如果是公网运行,请改成公网IP:服务端运行端口
#VITE_PROXY = [["/appApi","http://localhost:8001"],["/upload","http://localhost:8001/upload"]]
VITE_PROXY=[["/admin","http://localhost:8000/admin"]]
# API 接口地址
VITE_GLOB_API_URL=
# 图片上传地址
VITE_GLOB_UPLOAD_URL=
# 图片前缀地址
VITE_GLOB_IMG_URL=
# 接口前缀
VITE_GLOB_API_URL_PREFIX=/admin
# 快速登录账号密码配置,没有配置则不开启快速登录
## 格式为 [["账号名称","账号密码","角色名称"],["账号名称","账号密码"],["账号名称"]]
## 帐号名称不能为空,密码为空则和帐号名称相同
## 角色名称可选,如果不填写则默认使用账号名称作为角色名称
## 账号名称和角色名称可以重复,账号名称和密码可以重复
VITE_APP_DEMO_ACCOUNT=[["admin","123456","超管"],["test","123456","管理员"],["ameng","123456","租户"],["abai","123456","商户"],["asong","123456","用户"]]
+30
View File
@@ -0,0 +1,30 @@
# 只在生产模式中被载入
# 网站根目录
VITE_PUBLIC_PATH=/admin
# 网站前缀
VITE_BASE_URL=/
# 是否删除console
VITE_DROP_CONSOLE=true
# API
VITE_GLOB_API_URL=
# 图片上传地址
VITE_GLOB_UPLOAD_URL=
# 图片前缀地址
VITE_GLOB_IMG_URL=
# 接口前缀
VITE_GLOB_API_URL_PREFIX=/admin
# 是否启用gzip压缩或brotli压缩
# 可选: gzip | brotli | none
# 如果你需要多种形式,你可以用','来分隔
VITE_BUILD_COMPRESS='none'
# 使用压缩时是否删除原始文件,默认为false
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE=false
+29
View File
@@ -0,0 +1,29 @@
.DS_Store
node_modules
/screenshots
/dist
dist.zip
dist_electron
package-lock.json
yarn.lock
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
/components.d.ts
+9
View File
@@ -0,0 +1,9 @@
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*
+3
View File
@@ -0,0 +1,3 @@
/dist/*
/public/*
public/*
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021-present Naive Ui Admin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+1
View File
@@ -0,0 +1 @@
## HotGo 管理web前端
+79
View File
@@ -0,0 +1,79 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
// biome-ignore lint: disable
export {}
declare global {
const EffectScope: typeof import('vue').EffectScope
const computed: typeof import('vue').computed
const createApp: typeof import('vue').createApp
const customRef: typeof import('vue').customRef
const defineAsyncComponent: typeof import('vue').defineAsyncComponent
const defineComponent: typeof import('vue').defineComponent
const effectScope: typeof import('vue').effectScope
const getCurrentInstance: typeof import('vue').getCurrentInstance
const getCurrentScope: typeof import('vue').getCurrentScope
const getCurrentWatcher: typeof import('vue').getCurrentWatcher
const h: typeof import('vue').h
const inject: typeof import('vue').inject
const isProxy: typeof import('vue').isProxy
const isReactive: typeof import('vue').isReactive
const isReadonly: typeof import('vue').isReadonly
const isRef: typeof import('vue').isRef
const isShallow: typeof import('vue').isShallow
const markRaw: typeof import('vue').markRaw
const nextTick: typeof import('vue').nextTick
const onActivated: typeof import('vue').onActivated
const onBeforeMount: typeof import('vue').onBeforeMount
const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
const onBeforeUnmount: typeof import('vue').onBeforeUnmount
const onBeforeUpdate: typeof import('vue').onBeforeUpdate
const onDeactivated: typeof import('vue').onDeactivated
const onErrorCaptured: typeof import('vue').onErrorCaptured
const onMounted: typeof import('vue').onMounted
const onRenderTracked: typeof import('vue').onRenderTracked
const onRenderTriggered: typeof import('vue').onRenderTriggered
const onScopeDispose: typeof import('vue').onScopeDispose
const onServerPrefetch: typeof import('vue').onServerPrefetch
const onUnmounted: typeof import('vue').onUnmounted
const onUpdated: typeof import('vue').onUpdated
const onWatcherCleanup: typeof import('vue').onWatcherCleanup
const provide: typeof import('vue').provide
const reactive: typeof import('vue').reactive
const readonly: typeof import('vue').readonly
const ref: typeof import('vue').ref
const resolveComponent: typeof import('vue').resolveComponent
const shallowReactive: typeof import('vue').shallowReactive
const shallowReadonly: typeof import('vue').shallowReadonly
const shallowRef: typeof import('vue').shallowRef
const t: typeof import('@/locale/index').t
const toRaw: typeof import('vue').toRaw
const toRef: typeof import('vue').toRef
const toRefs: typeof import('vue').toRefs
const toValue: typeof import('vue').toValue
const triggerRef: typeof import('vue').triggerRef
const unref: typeof import('vue').unref
const useAttrs: typeof import('vue').useAttrs
const useCssModule: typeof import('vue').useCssModule
const useCssVars: typeof import('vue').useCssVars
const useId: typeof import('vue').useId
const useLink: typeof import('vue-router').useLink
const useModel: typeof import('vue').useModel
const useRoute: typeof import('vue-router').useRoute
const useRouter: typeof import('vue-router').useRouter
const useSlots: typeof import('vue').useSlots
const useTemplateRef: typeof import('vue').useTemplateRef
const watch: typeof import('vue').watch
const watchEffect: typeof import('vue').watchEffect
const watchPostEffect: typeof import('vue').watchPostEffect
const watchSyncEffect: typeof import('vue').watchSyncEffect
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
import('vue')
}
+6
View File
@@ -0,0 +1,6 @@
/**
* The name of the configuration file entered in the production environment
*/
export const GLOB_CONFIG_FILE_NAME = 'app.config.js';
export const OUTPUT_DIR = 'dist';
+9
View File
@@ -0,0 +1,9 @@
/**
* Get the configuration file variable name
* @param env
*/
export const getConfigFileName = (env: Record<string, any>) => {
return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`
.toUpperCase()
.replace(/\s/g, '');
};
+44
View File
@@ -0,0 +1,44 @@
/**
* Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging
*/
import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant';
import fs from 'fs-extra';
import chalk from 'chalk';
import { getRootPath, getEnvConfig } from '../utils';
import { getConfigFileName } from '../getConfigFileName';
import pkg from '../../package.json';
async function createConfig(
{
configName,
config,
configFileName = GLOB_CONFIG_FILE_NAME,
}: { configName: string; config: any; configFileName?: string } = { configName: '', config: {} }
) {
try {
const windowConf = `window.${configName}`;
// Ensure that the variable will not be modified
const configStr = `${windowConf}=${JSON.stringify(config)};
Object.freeze(${windowConf});
Object.defineProperty(window, "${configName}", {
configurable: false,
writable: false,
});
`.replace(/\s/g, '');
await fs.mkdirp(getRootPath(OUTPUT_DIR));
fs.writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr);
console.log(chalk.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);
console.log(chalk.gray(OUTPUT_DIR + '/' + chalk.green(configFileName)) + '\n');
} catch (error) {
console.log(chalk.red('configuration file configuration file failed to package:\n' + error));
}
}
export async function runBuildConfig() {
const config = getEnvConfig();
const configFileName = getConfigFileName(config);
await createConfig({ config, configName: configFileName });
}
+23
View File
@@ -0,0 +1,23 @@
// #!/usr/bin/env node
import { runBuildConfig } from './buildConf';
import chalk from 'chalk';
import process from 'node:process'
import pkg from '../../package.json';
export const runBuild = async () => {
try {
const argvList = process.argv.splice(2);
// Generate configuration file
if (!argvList.includes('disabled-config')) {
await runBuildConfig();
}
console.log(`✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - build successfully!');
} catch (error) {
console.log(chalk.red('vite build error:\n' + error));
process.exit(1);
}
};
runBuild().then();
+71
View File
@@ -0,0 +1,71 @@
import fs from 'fs';
import path from 'path';
import dotenv from 'dotenv';
export function isDevFn(mode: string): boolean {
return mode === 'development';
}
export function isProdFn(mode: string): boolean {
return mode === 'production';
}
/**
* Whether to generate package preview
*/
export function isReportMode(): boolean {
return process.env.REPORT === 'true';
}
// Read all environment variable configuration files to process.env
export function wrapperEnv(envConf: Recordable): ViteEnv {
const ret: any = {};
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);
}
if (envName === 'VITE_PROXY') {
try {
realName = JSON.parse(realName);
} catch (error) {}
}
ret[envName] = realName;
// process.env[envName] = realName;
}
return ret;
}
/**
* Get the environment variables starting with the specified prefix
* @param match prefix
* @param confFiles ext
*/
export function getEnvConfig(match = 'VITE_GLOB_', confFiles = ['.env', '.env.production']) {
let envConfig = {};
confFiles.forEach((item) => {
try {
const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item)));
envConfig = { ...envConfig, ...env };
} catch (error) {}
});
Object.keys(envConfig).forEach((key) => {
const reg = new RegExp(`^(${match})`);
if (!reg.test(key)) {
Reflect.deleteProperty(envConfig, key);
}
});
return envConfig;
}
/**
* Get member root directory
* @param dir file path
*/
export function getRootPath(...dir: string[]) {
return path.resolve(process.cwd(), ...dir);
}
+35
View File
@@ -0,0 +1,35 @@
/**
* Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated
* https://github.com/anncwb/vite-plugin-compression
*/
import type { Plugin } from 'vite';
import compressPlugin from 'vite-plugin-compression';
export function configCompressPlugin(
compress: 'gzip' | 'brotli' | 'none',
deleteOriginFile = false
): Plugin | Plugin[] {
const compressList = compress.split(',');
const plugins: Plugin[] = [];
if (compressList.includes('gzip')) {
plugins.push(
compressPlugin({
ext: '.gz',
deleteOriginFile,
})
);
}
if (compressList.includes('brotli')) {
plugins.push(
compressPlugin({
ext: '.br',
algorithm: 'brotliCompress',
deleteOriginFile,
})
);
}
return plugins;
}
+38
View File
@@ -0,0 +1,38 @@
/**
* Plugin to minimize and use ejs template syntax in index.html.
* https://github.com/anncwb/vite-plugin-html
*/
import { createHtmlPlugin } from 'vite-plugin-html';
import pkg from '../../../package.json';
import { GLOB_CONFIG_FILE_NAME } from '../../constant';
export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) {
const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env;
const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`;
const getAppConfigSrc = () => {
return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`;
};
return createHtmlPlugin({
minify: isBuild,
inject: {
// Inject data into ejs template
data: {
title: VITE_GLOB_APP_TITLE,
},
// Embed the generated app.config.js file
tags: isBuild
? [
{
tag: 'script',
attrs: {
src: getAppConfigSrc(),
},
},
]
: [],
},
});
}
+61
View File
@@ -0,0 +1,61 @@
import type { Plugin } from 'vite';
import Components from 'unplugin-vue-components/vite';
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers';
import AutoImport from 'unplugin-auto-import/vite';
import topLevelAwait from 'vite-plugin-top-level-await';
import setupExtend from 'vite-plugin-vue-setup-extend';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import { configHtmlPlugin } from './html';
import { configCompressPlugin } from './compress';
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
const { VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv;
const vitePlugins: (Plugin | Plugin[])[] = [
// have to
vue(),
// have to
vueJsx(),
// 按需引入NaiveUi且自动创建组件声明
Components({
dts: true,
resolvers: [NaiveUiResolver()],
}),
// 自动引入API
AutoImport({
imports: [
'vue',
'vue-router',
{
'@/locale/index': ['t'],
},
],
dts: 'auto-imports.d.ts',
}),
// 支持顶级wait
topLevelAwait({
// The export name of top-level await promise for each chunk module
promiseExportName: '__tla',
// The function to generate import names of top-level await promise in each chunk module
promiseImportName: (i) => `__tla_${i}`,
}),
];
// vite-plugin-html
vitePlugins.push(configHtmlPlugin(viteEnv, isBuild));
if (isBuild) {
// rollup-plugin-gzip
vitePlugins.push(
configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE)
);
}
vitePlugins.push(setupExtend());
return vitePlugins;
}
+22
View File
@@ -0,0 +1,22 @@
/**
* Introduces component library styles on demand.
* https://github.com/anncwb/vite-plugin-style-import
*/
import styleImport from 'vite-plugin-style-import';
export function configStyleImportPlugin(isBuild: boolean) {
if (!isBuild) return [];
const styleImportPlugin = styleImport({
libs: [
{
libraryName: 'ant-design-vue',
esModule: true,
resolveStyle: (name) => {
return `ant-design-vue/es/${name}/style/index`;
},
},
],
});
return styleImportPlugin;
}
+34
View File
@@ -0,0 +1,34 @@
/**
* Used to parse the .env.development proxy configuration
*/
import type { ProxyOptions } from 'vite';
type ProxyItem = [string, string];
type ProxyList = ProxyItem[];
type ProxyTargetList = Record<string, ProxyOptions & { rewrite: (path: string) => string }>;
const httpsRE = /^https:\/\//;
/**
* Generate proxy
* @param list
*/
export function createProxy(list: ProxyList = []) {
const ret: ProxyTargetList = {};
for (const [prefix, target] of list) {
const isHttps = httpsRE.test(target);
// https://github.com/http-party/node-http-proxy#options
ret[prefix] = {
target: target,
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
// https is require secure=false
...(isHttps ? { secure: false } : {}),
};
}
return ret;
}
+57
View File
@@ -0,0 +1,57 @@
module.exports = {
ignores: [(commit) => commit.includes('init')],
extends: ['@commitlint/config-conventional'],
parserPreset: {
parserOpts: {
headerPattern: /^(\w*|[\u4e00-\u9fa5]*)(?:[\(\(](.*)[\)\)])?[\:\:] (.*)/,
headerCorrespondence: ['type', 'scope', 'subject'],
referenceActions: [
'close',
'closes',
'closed',
'fix',
'fixes',
'fixed',
'resolve',
'resolves',
'resolved',
],
issuePrefixes: ['#'],
noteKeywords: ['BREAKING CHANGE'],
fieldPattern: /^-(.*?)-$/,
revertPattern: /^Revert\s"([\s\S]*)"\s*This reverts commit (\w*)\./,
revertCorrespondence: ['header', 'hash'],
warn() {},
mergePattern: null,
mergeCorrespondence: null,
},
},
rules: {
'body-leading-blank': [2, 'always'],
'footer-leading-blank': [1, 'always'],
'header-max-length': [2, 'always', 108],
'subject-empty': [2, 'never'],
'type-empty': [2, 'never'],
'type-enum': [
2,
'always',
[
'feat',
'fix',
'perf',
'style',
'docs',
'test',
'refactor',
'build',
'ci',
'chore',
'revert',
'wip',
'workflow',
'types',
'release',
],
],
},
};
+104
View File
@@ -0,0 +1,104 @@
import parser from 'vue-eslint-parser';
import { FlatCompat } from '@eslint/eslintrc';
const compat = new FlatCompat();
export default [
{
ignores: [
'**/*.sh',
'**/node_modules',
'**/*.md',
'**/*.woff',
'**/*.ttf',
'**/.vscode',
'**/.idea',
'**/dist',
'public',
'docs',
'**/.husky',
'**/.local',
'bin',
'**/Dockerfile',
'**/components.d.ts',
],
},
...compat.extends(
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
'plugin:prettier/recommended'
),
{
languageOptions: {
parser: parser,
ecmaVersion: 2020,
sourceType: 'module',
parserOptions: {
parser: '@typescript-eslint/parser',
jsxPragma: 'React',
ecmaFeatures: {
jsx: true,
},
},
},
rules: {
'vue/script-setup-uses-vars': 'error',
'@typescript-eslint/ban-ts-ignore': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/no-empty-function': 'off',
'vue/custom-event-name-casing': 'off',
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-unused-vars': [
'error',
{
varsIgnorePattern: '.*',
args: 'none',
},
],
'no-unused-vars': [
'error',
{
varsIgnorePattern: '.*',
args: 'none',
},
],
'space-before-function-paren': 'off',
'vue/multi-word-component-names': 'off',
'vue/attributes-order': 'off',
'vue/one-component-per-file': 'off',
'vue/html-closing-bracket-newline': 'off',
'vue/max-attributes-per-line': 'off',
'vue/multiline-html-element-content-newline': 'off',
'vue/singleline-html-element-content-newline': 'off',
'vue/attribute-hyphenation': 'off',
'vue/require-default-prop': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always',
normal: 'never',
component: 'always',
},
svg: 'always',
math: 'always',
},
],
'@typescript-eslint/no-this-alias': [
'error',
{
allowDestructuring: false,
allowedNames: ['that'],
},
],
},
},
];
+123
View File
@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html lang="zh-cmn-Hans" id="htmlRoot" data-theme="light">
<head>
<meta charset="UTF-8">
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
<meta content="webkit" name="renderer"/>
<meta
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
name="viewport"
/>
<link href="/favicon.ico" rel="icon"/>
<title><%= title %></title>
</head>
<body>
<div id="appProvider" style="display: none"></div>
<div id="app">
<style>
.first-loading-wrap {
display: flex;
width: 100%;
height: 100vh;
justify-content: center;
align-items: center;
flex-direction: column;
}
.first-loading-wrap > h1 {
font-size: 128px
}
.first-loading-wrap .loading-wrap {
padding: 98px;
display: flex;
justify-content: center;
align-items: center
}
.dot {
animation: antRotate 1.2s infinite linear;
transform: rotate(45deg);
position: relative;
display: inline-block;
font-size: 32px;
width: 32px;
height: 32px;
box-sizing: border-box
}
.dot i {
width: 14px;
height: 14px;
position: absolute;
display: block;
background-color: #1890ff;
border-radius: 100%;
transform: scale(.75);
transform-origin: 50% 50%;
opacity: .3;
animation: antSpinMove 1s infinite linear alternate
}
.dot i:nth-child(1) {
top: 0;
left: 0
}
.dot i:nth-child(2) {
top: 0;
right: 0;
-webkit-animation-delay: .4s;
animation-delay: .4s
}
.dot i:nth-child(3) {
right: 0;
bottom: 0;
-webkit-animation-delay: .8s;
animation-delay: .8s
}
.dot i:nth-child(4) {
bottom: 0;
left: 0;
-webkit-animation-delay: 1.2s;
animation-delay: 1.2s
}
@keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg)
}
}
@-webkit-keyframes antRotate {
to {
-webkit-transform: rotate(405deg);
transform: rotate(405deg)
}
}
@keyframes antSpinMove {
to {
opacity: 1
}
}
@-webkit-keyframes antSpinMove {
to {
opacity: 1
}
}</style>
<div class="first-loading-wrap">
<div class="loading-wrap">
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
</div>
</div>
</div>
<script>var globalThis = window;</script>
<script src="/src/main.ts" type="module"></script>
</body>
</html>
+171
View File
@@ -0,0 +1,171 @@
{
"name": "hotgo",
"type": "module",
"version": "2.18.9",
"author": {
"name": "MengShuai",
"email": "133814250@qq.com",
"url": "https://github.com/bufanyun/hotgo"
},
"private": true,
"scripts": {
"bootstrap": "pnpm install",
"serve": "pnpm run dev",
"dev": "vite",
"build": "vite build && esno ./build/script/postBuild.ts",
"build:no-cache": "pnpm clean:cache && pnpm run build",
"report": "cross-env REPORT=true pnpm run build",
"preview": "pnpm run build && vite preview",
"preview:dist": "vite preview",
"clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
"clean:lib": "rimraf node_modules",
"deploy": "gh-pages -d dist",
"lint:eslint": "eslint \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
"lint:prettier": "prettier --write --loglevel warn \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
"lint:stylelint": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
"lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js",
"lint:pretty": "pretty-quick --staged",
"build typecheck": "vuedx-typecheck . && vite build",
"test prod gzip": "http-server dist --cors --gzip -c-1"
},
"dependencies": {
"@codemirror/basic-setup": "^0.20.0",
"@codemirror/lang-yaml": "^6.1.2",
"@codemirror/state": "^6.5.2",
"@codemirror/theme-one-dark": "^6.1.3",
"@codemirror/view": "^6.38.2",
"@vicons/antd": "^0.12.0",
"@vicons/ionicons5": "^0.12.0",
"@vue/runtime-core": "^3.4.38",
"@vueup/vue-quill": "^1.2.0",
"@vueuse/core": "^11.0.3",
"axios": "^1.7.7",
"blueimp-md5": "^2.19.0",
"codemirror": "^6.0.2",
"date-fns": "^3.6.0",
"echarts": "^5.5.1",
"element-resize-detector": "^1.2.4",
"fingerprintjs2": "^2.1.4",
"highlight.js": "^11.10.0",
"js-yaml": "^4.1.0",
"lodash-es": "^4.17.21",
"mint-filter": "^4.0.3",
"mitt": "^3.0.1",
"naive-ui": "^2.44.1",
"pinia": "^2.2.2",
"pinyin-pro": "^3.24.2",
"print-js": "^1.6.0",
"qrcode.vue": "3.4.1",
"qs": "^6.13.0",
"quill-image-uploader": "^1.3.0",
"quill-magic-url": "^4.2.0",
"spark-md5": "^3.0.2",
"throttle-debounce": "^5.0.2",
"vfonts": "^0.0.3",
"vue": "^3.4.38",
"vue-i18n": "^11.1.11",
"vue-router": "^4.4.3",
"vue-types": "^5.1.3",
"vue-waterfall-plugin-next": "^2.6.0",
"vue3-json-viewer": "^2.4.1",
"vuedraggable": "^4.1.0",
"weixin-js-sdk": "^1.6.5"
},
"devDependencies": {
"@commitlint/cli": "^19.4.1",
"@commitlint/config-conventional": "^19.4.1",
"@eslint/eslintrc": "^3.1.0",
"@types/fs-extra": "^11.0.4",
"@types/js-yaml": "^4.0.9",
"@types/lodash-es": "^4.17.12",
"@types/node": "^22.5.2",
"@typescript-eslint/eslint-plugin": "^8.4.0",
"@typescript-eslint/parser": "^8.4.0",
"@vitejs/plugin-vue": "^5.1.3",
"@vitejs/plugin-vue-jsx": "^4.0.1",
"@vue/compiler-sfc": "^3.4.38",
"@vue/eslint-config-typescript": "^13.0.0",
"autoprefixer": "^10.4.20",
"chalk": "^5.3.0",
"commitizen": "^4.3.0",
"core-js": "^3.38.1",
"cross-env": "^7.0.3",
"crypto-js": "^4.2.0",
"dotenv": "^16.4.5",
"eslint": "^9.9.1",
"eslint-config-prettier": "^9.1.0",
"eslint-define-config": "2.1.0",
"eslint-plugin-jest": "^28.8.2",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-vue": "^9.28.0",
"esno": "^4.7.0",
"fs-extra": "^11.2.0",
"gh-pages": "^6.1.1",
"husky": "^9.1.5",
"jest": "^29.7.0",
"less": "^4.2.0",
"less-loader": "^12.2.0",
"lint-staged": "^15.2.10",
"mockjs": "^1.1.0",
"npm-check-updates": "^17.1.1",
"postcss": "^8.4.44",
"prettier": "^3.3.3",
"pretty-quick": "^4.0.0",
"rimraf": "^6.0.1",
"stylelint": "^16.9.0",
"stylelint-config-prettier": "^9.0.5",
"stylelint-config-standard": "^36.0.1",
"stylelint-order": "^6.0.4",
"stylelint-scss": "^6.5.1",
"tailwindcss": "^3.4.10",
"typescript": "^5.5.4",
"unplugin-auto-import": "^20.2.0",
"unplugin-vue-components": "^0.27.4",
"vite": "^5.4.2",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-html": "^3.2.2",
"vite-plugin-mock": "^3.0.2",
"vite-plugin-require-transform": "^1.0.21",
"vite-plugin-style-import": "^2.0.0",
"vite-plugin-top-level-await": "^1.4.4",
"vite-plugin-vue-setup-extend": "^0.4.0",
"vue-demi": "^0.14.10",
"vue-draggable-next": "^2.2.1",
"vue-eslint-parser": "^9.4.3",
"vuedraggable": "^4.1.0"
},
"lint-staged": {
"*.{vue,js,ts,tsx}": "eslint --fix"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-customizable"
}
},
"keywords": [
"hotgo",
"hg",
"gf",
"goframe",
"vue",
"naive-ui",
"naive-ui-admin",
"vue3",
"ts",
"tsx",
"admin",
"typescript"
],
"repository": {
"type": "git",
"url": "git+https://github.com/bufanyun/hotgo.git"
},
"license": "MIT",
"bugs": {
"url": "https://github.com/bufanyun/hotgo/issues"
},
"homepage": "https://github.com/bufanyun/hotgo",
"engines": {
"node": ">=16"
}
}
+10111
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
allowBuilds:
'@swc/core': set this to true or false
core-js: set this to true or false
esbuild: set this to true or false
vue-demi: set this to true or false
+6
View File
@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
+20
View File
@@ -0,0 +1,20 @@
module.exports = {
printWidth: 100,
tabWidth: 2,
useTabs: false,
semi: true,
vueIndentScriptAndStyle: true,
singleQuote: true,
quoteProps: 'as-needed',
bracketSpacing: true,
trailingComma: 'es5',
jsxBracketSameLine: false,
jsxSingleQuote: false,
arrowParens: 'always',
insertPragma: false,
requirePragma: false,
proseWrap: 'never',
htmlWhitespaceSensitivity: 'strict',
endOfLine: 'auto',
rangeStart: 0,
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

+90
View File
@@ -0,0 +1,90 @@
<template>
<NConfigProvider
v-if="!isLock"
:locale="zhCN"
:theme="getDarkTheme"
:theme-overrides="getThemeOverrides"
:date-locale="dateZhCN"
>
<AppProvider>
<RouterView />
</AppProvider>
</NConfigProvider>
<transition v-if="isLock && $route.name !== 'login'" name="slide-up">
<LockScreen />
</transition>
</template>
<script lang="ts" setup>
import { computed, onMounted, onUnmounted } from 'vue';
import { zhCN, dateZhCN, darkTheme } from 'naive-ui';
import { LockScreen } from '@/components/Lockscreen';
import { AppProvider } from '@/components/Application';
import { useLockscreenStore } from '@/store/modules/lockscreen';
import { useRoute } from 'vue-router';
import { useDesignSettingStore } from '@/store/modules/designSetting';
import { lighten } from '@/utils';
const route = useRoute();
const useLockscreen = useLockscreenStore();
const designStore = useDesignSettingStore();
const isLock = computed(() => useLockscreen.isLock);
const lockTime = computed(() => useLockscreen.lockTime);
/**
* @type import('naive-ui').GlobalThemeOverrides
*/
const getThemeOverrides = computed(() => {
const appTheme = designStore.appTheme;
const lightenStr = lighten(designStore.appTheme, 6);
return {
common: {
primaryColor: appTheme,
primaryColorHover: lightenStr,
primaryColorPressed: lightenStr,
// 纵向滚动条宽
scrollbarWidth: '8px',
// 横向滚动条高
scrollbarHeight: '8px',
},
LoadingBar: {
colorLoading: appTheme,
},
};
});
const getDarkTheme = computed(() => (designStore.darkTheme ? darkTheme : undefined));
let timer;
const timekeeping = () => {
clearInterval(timer);
if (route.name == 'login' || isLock.value) return;
// 设置不锁屏
useLockscreen.setLock(false);
// 重置锁屏时间
useLockscreen.setLockTime();
timer = setInterval(() => {
// 锁屏倒计时递减
useLockscreen.setLockTime(lockTime.value - 1);
if (lockTime.value <= 0) {
// 设置锁屏
useLockscreen.setLock(true);
return clearInterval(timer);
}
}, 1000);
};
onMounted(() => {
document.addEventListener('mousedown', timekeeping);
});
onUnmounted(() => {
document.removeEventListener('mousedown', timekeeping);
});
</script>
<style lang="less">
@import 'styles/index.less';
</style>
View File
@@ -0,0 +1,13 @@
import { http } from '@/utils/http/axios';
import type { UploadFileParams } from '@/utils/http/axios/types';
// 导入Excel
export function ImportExcel(params: UploadFileParams) {
return http.uploadFile(
{
url: '/hgexample/comp/importExcel',
method: 'post',
},
params
);
}
@@ -0,0 +1,17 @@
import { http } from '@/utils/http/axios';
export function getConfig(params) {
return http.request({
url: '/hgexample/config/get',
method: 'get',
params,
});
}
export function updateConfig(params) {
return http.request({
url: '/hgexample/config/update',
method: 'post',
params,
});
}
@@ -0,0 +1,68 @@
import { http, jumpExport } from '@/utils/http/axios';
// 列表
export function List(params) {
return http.request({
url: '/hgexample/table/list',
method: 'get',
params,
});
}
// 删除/批量删除
export function Delete(params) {
return http.request({
url: '/hgexample/table/delete',
method: 'POST',
params,
});
}
// 添加/编辑
export function Edit(params) {
return http.request({
url: '/hgexample/table/edit',
method: 'POST',
params,
});
}
// 修改状态
export function Status(params) {
return http.request({
url: '/hgexample/table/status',
method: 'POST',
params,
});
}
// 操作开关
export function Switch(params) {
return http.request({
url: '/hgexample/table/switch',
method: 'POST',
params,
});
}
// 详情
export function View(params) {
return http.request({
url: '/hgexample/table/view',
method: 'GET',
params,
});
}
// 获取最大排序
export function MaxSort() {
return http.request({
url: '/hgexample/table/maxSort',
method: 'GET',
});
}
// 导出
export function Export(params) {
jumpExport('/hgexample/table/export', params);
}
@@ -0,0 +1,42 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取多租户功能演示列表
export function List(params) {
return http.request({
url: '/hgexample/tenantOrder/list',
method: 'get',
params,
});
}
// 删除/批量删除多租户功能演示
export function Delete(params) {
return http.request({
url: '/hgexample/tenantOrder/delete',
method: 'POST',
params,
});
}
// 添加/编辑多租户功能演示
export function Edit(params) {
return http.request({
url: '/hgexample/tenantOrder/edit',
method: 'POST',
params,
});
}
// 获取多租户功能演示指定详情
export function View(params) {
return http.request({
url: '/hgexample/tenantOrder/view',
method: 'GET',
params,
});
}
// 导出多租户功能演示
export function Export(params) {
jumpExport('/hgexample/tenantOrder/export', params);
}
@@ -0,0 +1,76 @@
import { http, jumpExport } from '@/utils/http/axios';
// 列表
export function List(params) {
return http.request({
url: '/hgexample/treeTable/list',
method: 'get',
params,
});
}
// 删除/批量删除
export function Delete(params) {
return http.request({
url: '/hgexample/treeTable/delete',
method: 'POST',
params,
});
}
// 添加/编辑
export function Edit(params) {
return http.request({
url: '/hgexample/treeTable/edit',
method: 'POST',
params,
});
}
// 修改状态
export function Status(params) {
return http.request({
url: '/hgexample/treeTable/status',
method: 'POST',
params,
});
}
// 操作开关
export function Switch(params) {
return http.request({
url: '/hgexample/treeTable/switch',
method: 'POST',
params,
});
}
// 详情
export function View(params) {
return http.request({
url: '/hgexample/treeTable/view',
method: 'GET',
params,
});
}
// 获取最大排序
export function MaxSort() {
return http.request({
url: '/hgexample/treeTable/maxSort',
method: 'GET',
});
}
// 树形选项
export function Select() {
return http.request({
url: '/hgexample/treeTable/select',
method: 'get',
});
}
// 导出
export function Export(params) {
jumpExport('/hgexample/treeTable/export', params);
}
+27
View File
@@ -0,0 +1,27 @@
import { http } from '@/utils/http/axios';
const request = (url: string, method: 'get' | 'POST', params?: any) => http.request({ url, method, params });
export const List = (params) => request('/appMember/list', 'get', params);
export const View = (params) => request('/appMember/view', 'get', params);
export const Edit = (params) => request('/appMember/edit', 'POST', params);
export const Delete = (params) => request('/appMember/delete', 'POST', params);
export const AutoDispatch = (params) => request('/appMember/autoDispatch', 'POST', params);
export const Category = (params) => request('/appMember/category', 'POST', params);
export const PaymentList = (params) => request('/appMember/paymentList', 'get', params);
export const PaymentEdit = (params) => request('/appMember/paymentEdit', 'POST', params);
export const PaymentDelete = (params) => request('/appMember/paymentDelete', 'POST', params);
export const AddressList = (params) => request('/appMember/addressList', 'get', params);
export const AddressEdit = (params) => request('/appMember/addressEdit', 'POST', params);
export const AddressDelete = (params) => request('/appMember/addressDelete', 'POST', params);
export const Sensitive = (params) => request('/appMember/sensitive', 'POST', params);
export const Team = (params) => request('/appMember/team', 'get', params);
export const StatusRequest = (params) => request('/appMember/statusRequest', 'POST', params);
export const StatusExecute = (params) => request('/appMember/statusExecute', 'POST', params);
export const WalletList = (params) => request('/appMember/walletList', 'get', params);
export const LedgerList = (params) => request('/appMember/ledgerList', 'get', params);
export const WalletRequest = (params) => request('/appMember/walletRequest', 'POST', params);
export const WalletExecute = (params) => request('/appMember/walletExecute', 'POST', params);
export const NoticeList = (params) => request('/appMember/noticeList', 'get', params);
export const NoticeEdit = (params) => request('/appMember/noticeEdit', 'POST', params);
export const NoticeRevoke = (params) => request('/appMember/noticeRevoke', 'POST', params);
+58
View File
@@ -0,0 +1,58 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({
url: '/attachment/list',
method: 'get',
params,
});
}
export function Delete(params) {
return http.request({
url: '/attachment/delete',
method: 'POST',
params,
});
}
export function Edit(params) {
return http.request({
url: '/attachment/edit',
method: 'POST',
params,
});
}
export function Status(params) {
return http.request({
url: '/attachment/status',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/attachment/view',
method: 'GET',
params,
});
}
export function ClearKind(params) {
return http.request({
url: '/attachment/clearKind',
method: 'POST',
params,
});
}
// 链接图片转存
export function ImageTransferStorage(params) {
return http.request({
url: '/upload/imageTransferStorage',
method: 'POST',
params,
});
}
+104
View File
@@ -0,0 +1,104 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({
url: '/notice/list',
method: 'get',
params,
});
}
export function Delete(params) {
return http.request({
url: '/notice/delete',
method: 'POST',
params,
});
}
export function Edit(params) {
return http.request({
url: '/notice/edit',
method: 'POST',
params,
});
}
export function Status(params) {
return http.request({
url: '/notice/status',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/notice/view',
method: 'GET',
params,
});
}
// 获取最大排序
export function MaxSort() {
return http.request({
url: '/notice/maxSort',
method: 'GET',
});
}
export function EditNotify(params) {
return http.request({
url: '/notice/editNotify',
method: 'POST',
params,
});
}
export function EditNotice(params) {
return http.request({
url: '/notice/editNotice',
method: 'POST',
params,
});
}
export function EditLetter(params) {
return http.request({
url: '/notice/editLetter',
method: 'POST',
params,
});
}
export function ReadAll(params) {
return http.request({
url: '/notice/readAll',
method: 'POST',
params,
});
}
export function PullMessages() {
return http.request({
url: '/notice/pullMessages',
method: 'get',
});
}
export function UpRead(params) {
return http.request({
url: '/notice/upRead',
method: 'POST',
params,
});
}
export function MessageList(params) {
return http.request({
url: '/notice/messageList',
method: 'get',
params,
});
}
+103
View File
@@ -0,0 +1,103 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({
url: '/provinces/list',
method: 'get',
params,
});
}
export function Delete(params) {
return http.request({
url: '/provinces/delete',
method: 'POST',
params,
});
}
export function Edit(params) {
return http.request({
url: '/provinces/edit',
method: 'POST',
params,
});
}
export function Status(params) {
return http.request({
url: '/provinces/status',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/provinces/view',
method: 'GET',
params,
});
}
// 获取最大排序
export function MaxSort() {
return http.request({
url: '/provinces/maxSort',
method: 'GET',
});
}
/**
* 获取省市区关系树选项列表
*/
export function getProvincesTree() {
return http.request({
url: '/provinces/tree',
method: 'GET',
});
}
/**
* 获取省市区下级列表
*/
export function getProvincesChildrenList(params) {
return http.request({
url: '/provinces/childrenList',
method: 'GET',
params,
});
}
/**
* 唯一省市区ID
*/
export function CheckProvincesUniqueId(params) {
return http.request({
url: '/provinces/uniqueId',
method: 'GET',
params,
});
}
/**
* 省市区选项
*/
export function ProvincesSelect(params) {
return http.request({
url: '/provinces/select',
method: 'GET',
params,
});
}
/**
* 获取指定城市标签
*/
export function GetCityLabel(params) {
return http.request({
url: '/provinces/cityLabel',
method: 'GET',
params,
});
}
+47
View File
@@ -0,0 +1,47 @@
import { http } from '@/utils/http/axios';
import { useUserStoreWidthOut } from '@/store/modules/user';
import type { UploadFileParams } from '@/utils/http/axios/types';
// 获取验证码
export function GetCaptcha() {
return http.request({
url: '/site/captcha',
method: 'get',
});
}
// 上传图片
export function UploadImage(params) {
const useUserStore = useUserStoreWidthOut();
const headers = {
Authorization: useUserStore.token,
uploadType: 'default',
'Content-Type': 'multipart/form-data',
};
return http.request({
url: '/upload/file',
method: 'post',
params,
headers,
});
}
// 检查文件分片
export function CheckMultipart(params) {
return http.request({
url: '/upload/checkMultipart',
method: 'post',
params,
});
}
// 分片上传
export function UploadPart(params: UploadFileParams) {
return http.uploadFile(
{
url: '/upload/uploadPart',
method: 'post',
},
params
);
}
+41
View File
@@ -0,0 +1,41 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({
url: '/cash/list',
method: 'get',
params,
});
}
export function Edit(params) {
return http.request({
url: '/cash/edit',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/cash/view',
method: 'GET',
params,
});
}
export function Apply(params) {
return http.request({
url: '/cash/apply',
method: 'POST',
params,
});
}
export function Payment(params) {
return http.request({
url: '/cash/payment',
method: 'POST',
params,
});
}
+23
View File
@@ -0,0 +1,23 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取资产变动列表
export function List(params) {
return http.request({
url: '/creditsLog/list',
method: 'get',
params,
});
}
// 导出资产变动
export function Export(params) {
jumpExport('/creditsLog/export', params);
}
// 获取变动状态选项
export function Option() {
return http.request({
url: '/creditsLog/option',
method: 'GET',
});
}
+68
View File
@@ -0,0 +1,68 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取CURD列表列表
export function List(params) {
return http.request({
url: '/curdDemo/list',
method: 'get',
params,
});
}
// 删除/批量删除CURD列表
export function Delete(params) {
return http.request({
url: '/curdDemo/delete',
method: 'POST',
params,
});
}
// 添加/编辑CURD列表
export function Edit(params) {
return http.request({
url: '/curdDemo/edit',
method: 'POST',
params,
});
}
// 修改CURD列表状态
export function Status(params) {
return http.request({
url: '/curdDemo/status',
method: 'POST',
params,
});
}
// 操作CURD列表开关
export function Switch(params) {
return http.request({
url: '/curdDemo/switch',
method: 'POST',
params,
});
}
// 获取CURD列表指定详情
export function View(params) {
return http.request({
url: '/curdDemo/view',
method: 'GET',
params,
});
}
// 获取CURD列表最大排序
export function MaxSort() {
return http.request({
url: '/curdDemo/maxSort',
method: 'GET',
});
}
// 导出CURD列表
export function Export(params) {
jumpExport('/curdDemo/export', params);
}
+17
View File
@@ -0,0 +1,17 @@
import { http } from '@/utils/http/axios';
//获取主控台信息
export function getConsoleInfo() {
return http.request({
url: '/console/stat',
method: 'get',
});
}
export function getDashboardSummary(params) {
return http.request({
url: '/dashboard/summary',
method: 'get',
params,
});
}
+57
View File
@@ -0,0 +1,57 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({
url: '/addons/list',
method: 'get',
params,
});
}
export function View(params) {
return http.request({
url: '/addons/view',
method: 'GET',
params,
});
}
export function Status(params) {
return http.request({
url: '/addons/status',
method: 'POST',
params,
});
}
export function Build(params) {
return http.request({
url: '/addons/build',
method: 'post',
params,
});
}
export function Install(params) {
return http.request({
url: '/addons/install',
method: 'post',
params,
});
}
export function Upgrade(params) {
return http.request({
url: '/addons/upgrade',
method: 'post',
params,
});
}
export function UnInstall(params) {
return http.request({
url: '/addons/uninstall',
method: 'post',
params,
});
}
+87
View File
@@ -0,0 +1,87 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({
url: '/genCodes/list',
method: 'get',
params,
});
}
export function Delete(params) {
return http.request({
url: '/genCodes/delete',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/genCodes/view',
method: 'GET',
params,
});
}
export function Edit(params) {
return http.request({
url: '/genCodes/edit',
method: 'POST',
params,
});
}
export function Status(params) {
return http.request({
url: '/genCodes/status',
method: 'POST',
params,
});
}
export function Selects(params) {
return http.request({
url: '/genCodes/selects',
method: 'get',
params,
});
}
export function TableSelect(params) {
return http.request({
url: '/genCodes/tableSelect',
method: 'get',
params,
});
}
export function ColumnSelect(params) {
return http.request({
url: '/genCodes/columnSelect',
method: 'get',
params,
});
}
export function ColumnList(params) {
return http.request({
url: '/genCodes/columnList',
method: 'get',
params,
});
}
export function Preview(params) {
return http.request({
url: '/genCodes/preview',
method: 'post',
params,
});
}
export function Build(params) {
return http.request({
url: '/genCodes/build',
method: 'post',
params,
});
}
+110
View File
@@ -0,0 +1,110 @@
import { http } from '@/utils/http/axios';
/**
* 获取字典类型tree
* @param params
*/
export function getDictTree(params?) {
return http.request({
url: '/dictType/tree',
method: 'GET',
params,
});
}
/**
* 编辑字典类型
* @param params
* @constructor
*/
export function EditDict(params?) {
return http.request({
url: '/dictType/edit',
method: 'POST',
params,
});
}
/**
* 删除字典类型
* @param params
* @constructor
*/
export function DeleteDict(params?) {
return http.request({
url: '/dictType/delete',
method: 'POST',
params,
});
}
/**
* 获取字典类型选项
* @param params
*/
export function getDictSelect(params?) {
return http.request({
url: '/dictType/tree',
method: 'GET',
params,
});
}
/**
* 编辑字典数据
* @param params
* @constructor
*/
export function EditData(params?) {
return http.request({
url: '/dictData/edit',
method: 'POST',
params,
});
}
/**
* 删除字典数据
* @param params
* @constructor
*/
export function DeleteData(params?) {
return http.request({
url: '/dictData/delete',
method: 'POST',
params,
});
}
/**
* 获取字典数据列表
* @param params
*/
export function getDataList(params?) {
return http.request({
url: '/dictData/list',
method: 'GET',
params,
});
}
/**
* 获取字典数据列表
*/
export function Dict(type) {
return http.request({
url: '/dictData/option/' + type,
method: 'GET',
});
}
/**
* 获取字典数据列表
*/
export function Dicts(params) {
return http.request({
url: '/dictData/options',
method: 'GET',
params,
});
}
+29
View File
@@ -0,0 +1,29 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({ url: '/approval/list', method: 'get', params });
}
export function View(params) {
return http.request({ url: '/approval/view', method: 'get', params });
}
export function Create(params) {
return http.request({ url: '/approval/create', method: 'POST', params });
}
export function Submit(params) {
return http.request({ url: '/approval/submit', method: 'POST', params });
}
export function Approve(params) {
return http.request({ url: '/approval/approve', method: 'POST', params });
}
export function Reject(params) {
return http.request({ url: '/approval/reject', method: 'POST', params });
}
export function Cancel(params) {
return http.request({ url: '/approval/cancel', method: 'POST', params });
}
+9
View File
@@ -0,0 +1,9 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({ url: '/bizAudit/list', method: 'get', params });
}
export function View(params) {
return http.request({ url: '/bizAudit/view', method: 'get', params });
}
+24
View File
@@ -0,0 +1,24 @@
import { http } from '@/utils/http/axios';
export function getLogList(params) {
return http.request({
url: '/log/list',
method: 'get',
params,
});
}
export function Delete(params) {
return http.request({
url: '/log/delete',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/log/view',
method: 'GET',
params,
});
}
+24
View File
@@ -0,0 +1,24 @@
import { http } from '@/utils/http/axios';
export function getLogList(params) {
return http.request({
url: '/smsLog/list',
method: 'get',
params,
});
}
export function Delete(params) {
return http.request({
url: '/smsLog/delete',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/smsLog/view',
method: 'GET',
params,
});
}
+24
View File
@@ -0,0 +1,24 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取登录日志列表
export function List(params) {
return http.request({
url: '/loginLog/list',
method: 'get',
params,
});
}
// 删除/批量删除登录日志
export function Delete(params) {
return http.request({
url: '/loginLog/delete',
method: 'POST',
params,
});
}
// 导出登录日志
export function Export(params) {
jumpExport('/loginLog/export', params);
}
+11
View File
@@ -0,0 +1,11 @@
import { http } from '@/utils/http/axios';
const request=(url:string,method:'get'|'POST',params?:any)=>http.request({url,method,params});
export const List=(params)=>request('/memberLevel/list','get',params);
export const View=(params)=>request('/memberLevel/view','get',params);
export const Save=(params)=>request('/memberLevel/save','POST',params);
export const Submit=(params)=>request('/memberLevel/submit','POST',params);
export const Publish=(params)=>request('/memberLevel/publish','POST',params);
export const Rollback=(params)=>request('/memberLevel/rollback','POST',params);
export const History=(params)=>request('/memberLevel/history','get',params);
export const Status=(params)=>request('/memberLevel/status','POST',params);
export const Delete=(params)=>request('/memberLevel/delete','POST',params);
+40
View File
@@ -0,0 +1,40 @@
import { http } from '@/utils/http/axios';
export function OnlineList(params) {
return http.request({
url: '/monitor/userOnlineList',
method: 'get',
params,
});
}
export function Offline(params) {
return http.request({
url: '/monitor/userOffline',
method: 'POST',
params,
});
}
export function NetOnlineList(params) {
return http.request({
url: '/monitor/netOnlineList',
method: 'get',
params,
});
}
export function NetOffline(params) {
return http.request({
url: '/monitor/netOffline',
method: 'POST',
params,
});
}
export function NetOption() {
return http.request({
url: '/monitor/netOption',
method: 'get',
});
}
+53
View File
@@ -0,0 +1,53 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取普通树表列表
export function List(params) {
return http.request({
url: '/normalTreeDemo/list',
method: 'get',
params,
});
}
// 删除/批量删除普通树表
export function Delete(params) {
return http.request({
url: '/normalTreeDemo/delete',
method: 'POST',
params,
});
}
// 添加/编辑普通树表
export function Edit(params) {
return http.request({
url: '/normalTreeDemo/edit',
method: 'POST',
params,
});
}
// 获取普通树表指定详情
export function View(params) {
return http.request({
url: '/normalTreeDemo/view',
method: 'GET',
params,
});
}
// 获取普通树表最大排序
export function MaxSort() {
return http.request({
url: '/normalTreeDemo/maxSort',
method: 'GET',
});
}
// 获取普通树表关系树选项
export function TreeOption() {
return http.request({
url: '/normalTreeDemo/treeOption',
method: 'GET',
});
}
+53
View File
@@ -0,0 +1,53 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取选项树表列表
export function List(params) {
return http.request({
url: '/optionTreeDemo/list',
method: 'get',
params,
});
}
// 删除/批量删除选项树表
export function Delete(params) {
return http.request({
url: '/optionTreeDemo/delete',
method: 'POST',
params,
});
}
// 添加/编辑选项树表
export function Edit(params) {
return http.request({
url: '/optionTreeDemo/edit',
method: 'POST',
params,
});
}
// 获取选项树表指定详情
export function View(params) {
return http.request({
url: '/optionTreeDemo/view',
method: 'GET',
params,
});
}
// 获取选项树表最大排序
export function MaxSort() {
return http.request({
url: '/optionTreeDemo/maxSort',
method: 'GET',
});
}
// 获取选项树表关系树选项
export function TreeOption() {
return http.request({
url: '/optionTreeDemo/treeOption',
method: 'GET',
});
}
+103
View File
@@ -0,0 +1,103 @@
import { http, jumpExport } from '@/utils/http/axios';
// 创建充值订单
export function Create(params) {
return http.request({
url: '/order/create',
method: 'post',
params,
});
}
// 获取充值订单列表
export function List(params) {
return http.request({
url: '/order/list',
method: 'get',
params,
});
}
// 删除/批量删除充值订单
export function Delete(params) {
return http.request({
url: '/order/delete',
method: 'POST',
params,
});
}
// 添加/编辑充值订单
export function Edit(params) {
return http.request({
url: '/order/edit',
method: 'POST',
params,
});
}
// 修改充值订单状态
export function Status(params) {
return http.request({
url: '/order/status',
method: 'POST',
params,
});
}
// 操作充值订单开关
export function Switch(params) {
return http.request({
url: '/order/switch',
method: 'POST',
params,
});
}
// 获取充值订单指定详情
export function View(params) {
return http.request({
url: '/order/view',
method: 'GET',
params,
});
}
// 获取充值订单最大排序
export function MaxSort() {
return http.request({
url: '/order/maxSort',
method: 'GET',
});
}
// 获取订单状态选项
export function Option() {
return http.request({
url: '/order/option',
method: 'GET',
});
}
// 申请订单退款
export function ApplyRefund(params) {
return http.request({
url: '/order/applyRefund',
method: 'post',
params,
});
}
// 受理订单退款
export function AcceptRefund(params) {
return http.request({
url: '/order/acceptRefund',
method: 'post',
params,
});
}
// 导出充值订单
export function Export(params) {
jumpExport('/order/export', params);
}
+68
View File
@@ -0,0 +1,68 @@
import { http } from '@/utils/http/axios';
export function getDeptList(params?) {
return http.request({
url: '/dept/list',
method: 'GET',
params,
});
}
export function Edit(params) {
return http.request({
url: '/dept/edit',
method: 'POST',
params,
});
}
// 部门状态
export function Status(params) {
return http.request({
url: '/dept/status',
method: 'POST',
params,
});
}
// 获取管理员_部门指定详情
export function View(params) {
return http.request({
url: '/dept/view',
method: 'GET',
params,
});
}
// 获取管理员_部门最大排序
export function MaxSort() {
return http.request({
url: '/dept/maxSort',
method: 'GET',
});
}
export function Delete(params) {
return http.request({
url: '/dept/delete',
method: 'POST',
params,
});
}
export function getDeptOption() {
const params = { pageSize: 100 };
return http.request({
url: '/dept/option',
method: 'GET',
params,
});
}
// 部门关系树选项
export function TreeOption() {
return http.request({
url: '/dept/treeOption',
method: 'GET',
});
}
+29
View File
@@ -0,0 +1,29 @@
import { http } from '@/utils/http/axios';
export function getPostList(params?) {
return http.request({
url: '/post/list',
method: 'GET',
params,
});
}
export function getPostOption(params?) {
return getPostList(params);
}
export function Edit(params) {
return http.request({
url: '/post/edit',
method: 'POST',
params,
});
}
export function Delete(params) {
return http.request({
url: '/post/delete',
method: 'POST',
params,
});
}
+73
View File
@@ -0,0 +1,73 @@
import { http } from '@/utils/http/axios';
export function List(params?) {
return http.request({
url: '/member/list',
method: 'GET',
params,
});
}
export function Edit(params) {
return http.request({
url: '/member/edit',
method: 'POST',
params,
});
}
export function Status(params) {
return http.request({
url: '/member/status',
method: 'POST',
params,
});
}
export function Delete(params) {
return http.request({
url: '/member/delete',
method: 'POST',
params,
});
}
export function ResetPwd(params) {
return http.request({
url: '/member/resetPwd',
method: 'POST',
params,
});
}
// 获取可选的后台用户选项
export function GetMemberOption() {
return http.request({
url: '/member/option',
method: 'GET',
});
}
export function GetMemberView(params) {
return http.request({
url: '/member/view',
method: 'GET',
params,
});
}
export function AddMemberBalance(params) {
return http.request({
url: '/member/addBalance',
method: 'POST',
params,
});
}
export function AddMemberIntegral(params) {
return http.request({
url: '/member/addIntegral',
method: 'POST',
params,
});
}
+15
View File
@@ -0,0 +1,15 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取交易退款列表
export function List(params) {
return http.request({
url: '/payRefund/list',
method: 'get',
params,
});
}
// 导出交易退款
export function Export(params) {
jumpExport('/payRefund/export', params);
}
+29
View File
@@ -0,0 +1,29 @@
import { http } from '@/utils/http/axios';
const request = (url: string, method: string, params?: any) => http.request({ url, method, params });
export const SiteConfigCurrent = (params = { configGroup: 'portal' }) => request('/siteConfig/current', 'get', params);
export const SiteConfigHistory = (params) => request('/siteConfig/history', 'get', params);
export const SiteConfigSave = (params) => request('/siteConfig/save', 'POST', params);
export const SiteConfigSubmit = (params) => request('/siteConfig/submit', 'POST', params);
export const SiteConfigPublish = (params) => request('/siteConfig/publish', 'POST', params);
export const SiteConfigRollback = (params) => request('/siteConfig/rollback', 'POST', params);
export const ContentList = (params) => request('/portalContent/list', 'get', params);
export const ContentView = (params) => request('/portalContent/view', 'get', params);
export const ContentEdit = (params) => request('/portalContent/edit', 'POST', params);
export const ContentDelete = (params) => request('/portalContent/delete', 'POST', params);
export const ContentPublish = (params) => request('/portalContent/publish', 'POST', params);
export const ContentOffline = (params) => request('/portalContent/offline', 'POST', params);
export const BannerList = (params) => request('/banner/list', 'get', params);
export const BannerView = (params) => request('/banner/view', 'get', params);
export const BannerEdit = (params) => request('/banner/edit', 'POST', params);
export const BannerDelete = (params) => request('/banner/delete', 'POST', params);
export const BannerStatus = (params) => request('/banner/status', 'POST', params);
export const ManualProductList = (params) => request('/manualProduct/list', 'get', params);
export const ManualProductView = (params) => request('/manualProduct/view', 'get', params);
export const ManualProductEdit = (params) => request('/manualProduct/edit', 'POST', params);
export const ManualProductDelete = (params) => request('/manualProduct/delete', 'POST', params);
export const ManualProductStatus = (params) => request('/manualProduct/status', 'POST', params);
+16
View File
@@ -0,0 +1,16 @@
import { http } from '@/utils/http/axios';
const request = (url, method, params) => http.request({ url, method, params });
export const ProductList = (params) => request('/product/list', 'get', params);
export const ProductView = (params) => request('/product/view', 'get', params);
export const ProductEdit = (params) => request('/product/edit', 'POST', params);
export const ProductStatus = (params) => request('/product/status', 'POST', params);
export const ProductRecommend = (params) => request('/product/recommend', 'POST', params);
export const ProductDelete = (params) => request('/product/delete', 'POST', params);
export const TaskList = (params) => request('/task/list', 'get', params);
export const TaskView = (params) => request('/task/view', 'get', params);
export const TaskEdit = (params) => request('/task/edit', 'POST', params);
export const TaskStatus = (params) => request('/task/status', 'POST', params);
export const TaskDelete = (params) => request('/task/delete', 'POST', params);
export const SubmissionList = (params) => request('/taskSubmission/list', 'get', params);
export const SubmissionView = (params) => request('/taskSubmission/view', 'get', params);
export const SubmissionReview = (params) => request('/taskSubmission/review', 'POST', params);
+60
View File
@@ -0,0 +1,60 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取服务许可证列表
export function List(params) {
return http.request({
url: '/serveLicense/list',
method: 'get',
params,
});
}
// 删除/批量删除服务许可证
export function Delete(params) {
return http.request({
url: '/serveLicense/delete',
method: 'POST',
params,
});
}
// 添加/编辑服务许可证
export function Edit(params) {
return http.request({
url: '/serveLicense/edit',
method: 'POST',
params,
});
}
// 修改服务许可证状态
export function Status(params) {
return http.request({
url: '/serveLicense/status',
method: 'POST',
params,
});
}
// 获取服务许可证指定详情
export function View(params) {
return http.request({
url: '/serveLicense/view',
method: 'GET',
params,
});
}
// 分配服务许可证路由
export function AssignRouter(params) {
return http.request({
url: '/serveLicense/assignRouter',
method: 'POST',
params,
});
}
// 导出服务许可证
export function Export(params) {
jumpExport('/serveLicense/export', params);
}
+33
View File
@@ -0,0 +1,33 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取服务日志列表
export function List(params) {
return http.request({
url: '/serveLog/list',
method: 'get',
params,
});
}
// 删除/批量删除服务日志
export function Delete(params) {
return http.request({
url: '/serveLog/delete',
method: 'POST',
params,
});
}
// 获取服务日志指定详情
export function View(params) {
return http.request({
url: '/serveLog/view',
method: 'GET',
params,
});
}
// 导出服务日志
export function Export(params) {
jumpExport('/serveLog/export', params);
}
+41
View File
@@ -0,0 +1,41 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({
url: '/blacklist/list',
method: 'get',
params,
});
}
export function Delete(params) {
return http.request({
url: '/blacklist/delete',
method: 'POST',
params,
});
}
export function Edit(params) {
return http.request({
url: '/blacklist/edit',
method: 'POST',
params,
});
}
export function Status(params) {
return http.request({
url: '/blacklist/status',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/blacklist/view',
method: 'GET',
params,
});
}
+46
View File
@@ -0,0 +1,46 @@
import { http } from '@/utils/http/axios';
export function getConfig(params) {
return http.request({
url: '/config/get',
method: 'get',
params,
});
}
export function updateConfig(params) {
return http.request({
url: '/config/update',
method: 'post',
params,
});
}
export function TypeSelect() {
return http.request({
url: '/config/typeSelect',
method: 'get',
});
}
export function sendTestEmail(params) {
return http.request({
url: '/ems/sendTest',
method: 'post',
params,
});
}
export function sendTestSms(params) {
return http.request({
url: '/sms/sendTest',
method: 'post',
params,
});
}
export function getCashConfig() {
return http.request({
url: '/config/getCash',
method: 'get',
});
}
+105
View File
@@ -0,0 +1,105 @@
import { http } from '@/utils/http/axios';
export function List(params) {
return http.request({
url: '/cron/list',
method: 'get',
params,
});
}
export function Delete(params) {
return http.request({
url: '/cron/delete',
method: 'POST',
params,
});
}
export function Edit(params) {
return http.request({
url: '/cron/edit',
method: 'POST',
params,
});
}
export function Status(params) {
return http.request({
url: '/cron/status',
method: 'POST',
params,
});
}
export function View(params) {
return http.request({
url: '/cron/view',
method: 'GET',
params,
});
}
export function GroupList(params) {
return http.request({
url: '/cronGroup/list',
method: 'get',
params,
});
}
export function GroupDelete(params) {
return http.request({
url: '/cronGroup/delete',
method: 'POST',
params,
});
}
export function GroupEdit(params) {
return http.request({
url: '/cronGroup/edit',
method: 'POST',
params,
});
}
export function GroupStatus(params) {
return http.request({
url: '/cronGroup/status',
method: 'POST',
params,
});
}
export function GroupView(params) {
return http.request({
url: '/cronGroup/view',
method: 'GET',
params,
});
}
export function getSelect(params) {
return http.request({
url: '/cronGroup/select',
method: 'GET',
params,
});
}
export function OnlineExec(params) {
return http.request({
url: '/cron/onlineExec',
method: 'POST',
params,
});
}
export function DispatchLog(params) {
return http.request({
url: '/cron/dispatchLog',
method: 'POST',
params,
});
}
+40
View File
@@ -0,0 +1,40 @@
import { http } from '@/utils/http/axios';
import { ApiEnum } from '@/enums/apiEnum';
/**
* @description: 根据用户id获取用户菜单
*/
export function adminMenus() {
return http.request({
url: ApiEnum.RoleDynamic,
method: 'GET',
});
}
/**
* 获取tree菜单列表
* @param params
*/
export function getMenuList(params?) {
return http.request({
url: '/menu/list',
method: 'GET',
params,
});
}
export function EditMenu(params?) {
return http.request({
url: '/menu/edit',
method: 'POST',
params,
});
}
export function DeleteMenu(params?) {
return http.request({
url: '/menu/delete',
method: 'POST',
params,
});
}
+64
View File
@@ -0,0 +1,64 @@
import { http } from '@/utils/http/axios';
/**
* @description: 角色列表
*/
export function getRoleList(params) {
return http.request({
url: '/role/list',
method: 'GET',
params,
});
}
export function getRoleOption() {
const params = { pageSize: 100 };
return getRoleList(params);
}
export function Edit(params) {
return http.request({
url: '/role/edit',
method: 'POST',
params,
});
}
export function Delete(params) {
return http.request({
url: '/role/delete',
method: 'POST',
params,
});
}
export function UpdatePermissions(params) {
return http.request({
url: '/role/updatePermissions',
method: 'POST',
params,
});
}
export function GetPermissions(params) {
return http.request({
url: '/role/getPermissions',
method: 'GET',
params,
});
}
export function DataScopeSelect() {
return http.request({
url: '/role/dataScope/select',
method: 'GET',
});
}
export function DataScopeEdit(params) {
return http.request({
url: '/role/dataScope/edit',
method: 'POST',
params,
});
}
+183
View File
@@ -0,0 +1,183 @@
import { http } from '@/utils/http/axios';
import { ApiEnum } from '@/enums/apiEnum';
export interface BasicResponseModel<T = any> {
code: number;
message: string;
data: T;
}
export interface BasicPageParams {
pageNumber: number;
pageSize: number;
total: number;
}
export function getConfig() {
return http.request({
url: ApiEnum.SiteConfig,
method: 'get',
headers: { hostname: location.hostname },
});
}
/**
* @description: 获取用户信息
*/
export function getUserInfo() {
return http.request({
url: ApiEnum.MemberInfo,
method: 'get',
});
}
export function updateMemberProfile(params) {
return http.request({
url: '/member/updateProfile',
method: 'post',
params,
});
}
export function updateMemberPwd(params) {
return http.request({
url: '/member/updatePwd',
method: 'post',
params,
});
}
export function updateMemberMobile(params) {
return http.request({
url: '/member/updateMobile',
method: 'post',
params,
});
}
export function updateMemberEmail(params) {
return http.request({
url: '/member/updateEmail',
method: 'post',
params,
});
}
export function SendBindEmail() {
return http.request({
url: '/ems/sendBind',
method: 'post',
});
}
export function SendBindSms() {
return http.request({
url: '/sms/sendBind',
method: 'post',
});
}
export function SendSms(params) {
return http.request({
url: '/sms/send',
method: 'post',
params,
});
}
export function updateMemberCash(params) {
return http.request({
url: '/member/updateCash',
method: 'post',
params,
});
}
/**
* @description: 用户登录配置
*/
export function getLoginConfig() {
return http.request<BasicResponseModel>({
url: ApiEnum.SiteLoginConfig,
method: 'get',
});
}
/**
* @description: 用户注册
*/
export function register(params) {
return http.request<BasicResponseModel>(
{
url: ApiEnum.SiteRegister,
method: 'POST',
params,
},
{
isTransformResponse: false,
}
);
}
/**
* @description: 用户登录
*/
export function login(params) {
return http.request<BasicResponseModel>(
{
url: ApiEnum.SiteAccountLogin,
method: 'POST',
params,
},
{
isTransformResponse: false,
}
);
}
/**
* @description: 手机号登录
*/
export function mobileLogin(params) {
return http.request<BasicResponseModel>(
{
url: ApiEnum.SiteMobileLogin,
method: 'POST',
params,
},
{
isTransformResponse: false,
}
);
}
/**
* @description: 用户注销
*/
export function logout() {
return http.request<BasicResponseModel>(
{
url: ApiEnum.SiteLogout,
method: 'POST',
},
{
isTransformResponse: false,
}
);
}
/**
* @description: 用户修改密码
*/
export function changePassword(params, uid) {
return http.request(
{
url: `/user/u${uid}/changepw`,
method: 'POST',
params,
},
{
isTransformResponse: false,
}
);
}
+7
View File
@@ -0,0 +1,7 @@
import { http } from '@/utils/http/axios';
const request=(url:string,method:'get'|'POST',params?:any)=>http.request({url,method,params});
export const List=(params)=>request('/taskHall/list','get',params);
export const View=(params)=>request('/taskHall/view','get',params);
export const Edit=(params)=>request('/taskHall/edit','POST',params);
export const Status=(params)=>request('/taskHall/status','POST',params);
export const Delete=(params)=>request('/taskHall/delete','POST',params);
+54
View File
@@ -0,0 +1,54 @@
import { http, jumpExport } from '@/utils/http/axios';
// 获取测试分类列表
export function List(params) {
return http.request({
url: '/testCategory/list',
method: 'get',
params,
});
}
// 删除/批量删除测试分类
export function Delete(params) {
return http.request({
url: '/testCategory/delete',
method: 'POST',
params,
});
}
// 添加/编辑测试分类
export function Edit(params) {
return http.request({
url: '/testCategory/edit',
method: 'POST',
params,
});
}
// 修改测试分类状态
export function Status(params) {
return http.request({
url: '/testCategory/status',
method: 'POST',
params,
});
}
// 获取测试分类指定详情
export function View(params) {
return http.request({
url: '/testCategory/view',
method: 'GET',
params,
});
}
// 获取测试分类最大排序
export function MaxSort() {
return http.request({
url: '/testCategory/maxSort',
method: 'GET',
});
}
+26
View File
@@ -0,0 +1,26 @@
import { http } from '@/utils/http/axios';
export const TradeOrderList = (params) => http.request({ url: '/tradeOrder/list', method: 'get', params });
export const TradeOrderView = (params) => http.request({ url: '/tradeOrder/view', method: 'get', params });
export const TradeOrderMatchProducts = (params) => http.request({ url: '/tradeOrder/matchProducts', method: 'get', params });
export const TradeOrderMatch = (params) => http.request({ url: '/tradeOrder/match', method: 'POST', params });
export const TradeOrderApply = (params) => http.request({ url: '/tradeOrder/apply', method: 'POST', params });
export const TradeOrderExecute = (params) => http.request({ url: '/tradeOrder/execute', method: 'POST', params });
export const RechargeList = (params) => http.request({ url: '/rechargeOrder/list', method: 'get', params });
export const RechargeSummary = (params) => http.request({ url: '/rechargeOrder/summary', method: 'get', params });
export const RechargeView = (params) => http.request({ url: '/rechargeOrder/view', method: 'get', params });
export const RechargeReview = (params) => http.request({ url: '/rechargeOrder/review', method: 'POST', params });
export const RechargeExecute = (params) => http.request({ url: '/rechargeOrder/execute', method: 'POST', params });
export const WithdrawalList = (params) => http.request({ url: '/withdrawalOrder/list', method: 'get', params });
export const WithdrawalView = (params) => http.request({ url: '/withdrawalOrder/view', method: 'get', params });
export const WithdrawalReview = (params) => http.request({ url: '/withdrawalOrder/review', method: 'POST', params });
export const WithdrawalExecute = (params) => http.request({ url: '/withdrawalOrder/execute', method: 'POST', params });
export const WithdrawalComplete = (params) => http.request({ url: '/withdrawalOrder/complete', method: 'POST', params });
export const CustomerServiceList = (params) => http.request({ url: '/customerService/list', method: 'get', params });
export const CustomerServiceView = (params) => http.request({ url: '/customerService/view', method: 'get', params });
export const CustomerServiceEdit = (params) => http.request({ url: '/customerService/edit', method: 'POST', params });
export const CustomerServiceStatus = (params) => http.request({ url: '/customerService/status', method: 'POST', params });
export const CustomerServiceDelete = (params) => http.request({ url: '/customerService/delete', method: 'POST', params });
+127
View File
@@ -0,0 +1,127 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1361px"
height="609px" viewBox="0 0 1361 609" version="1.1">
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
<title>Group 21</title>
<desc>Created with Sketch.</desc>
<defs/>
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
<g id="Group-21" transform="translate(77.000000, 73.000000)">
<g id="Group-18" opacity="0.8"
transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367"
rx="21.7830479" ry="21.766008"/>
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601"
rx="5.2173913" ry="5.21330997"/>
<path
d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z"
id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"/>
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6"
stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7"
stroke-width="0.702678964" opacity="0.7" stroke-linecap="round"
stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"/>
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9"
stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round"
stroke-dasharray="1.405357899873153,2.108036953469981"/>
<g id="Group-17"
transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)"
fill="#CFDAE6">
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653"
ry="9.12768076"/>
<path
d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z"
id="Oval-4"
transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "/>
</g>
</g>
<g id="Group-14"
transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439"
rx="29.1176471" ry="29.1402439"/>
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439"
rx="21.5686275" ry="21.5853659"/>
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341"
rx="23.7254902" ry="23.7439024"/>
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439"
rx="10.7843137" ry="10.7926829"/>
<path
d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z"
id="Oval-2" fill="#BACAD9"/>
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)"
fill="#E6A1A6">
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824"
ry="6.47560976"/>
<path
d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z"
id="Oval-2-Copy-2"
transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "/>
</g>
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706"
ry="1.61890244"/>
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098"
rx="1.61764706" ry="1.61890244"/>
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488"
rx="2.15686275" ry="2.15853659"/>
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6"
opacity="0.8"/>
</g>
<g id="Group-10" opacity="0.799999952"
transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32"
rx="11.1864407" ry="11.2941176"/>
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627"
ry="8.55614973"/>
<path
d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z"
id="Oval-7"/>
</g>
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6"
stroke-width="0.941176471"/>
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186"
cy="3.29411765" rx="3.26271186" ry="3.29411765"/>
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017"
ry="2.82352941"/>
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6"
stroke-width="0.941176471"/>
</g>
<g id="Group-19" opacity="0.33"
transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
<g id="Group-17"
transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)"
fill="#BACAD9">
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"/>
<path
d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z"
id="Oval-4"
transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "/>
</g>
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"/>
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9"
stroke-width="1.16666667"/>
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9"
stroke-width="1.16666667"/>
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667"
points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"/>
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7"
stroke-width="1.16666667" opacity="0.6"/>
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9"
stroke-width="1.16666667"/>
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6"
stroke-width="1.16666667"/>
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"/>
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"/>
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25"
r="8.75"/>
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333"
cy="30.3333333" r="5.83333333"/>
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"/>
</g>
</g>
</g>
</g>
<div xmlns="" id="divScriptsUsed" style="display: none"/>
<script xmlns="" id="globalVarsDetection"
src="chrome-extension://cmkdbmfndkfgebldhnkbfhlneefdaaip/js/wrs_env.js"/>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

+60
View File
@@ -0,0 +1,60 @@
<svg width="182" height="166" xmlns="http://www.w3.org/2000/svg">
<!-- Generator: Sketch 54 (76480) - https://sketchapp.com -->
<title>未命名</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="0.00542331488%" y1="50.0074349%" x2="100.011743%" y2="50.0074349%"
id="linearGradient-1">
<stop stop-color="#3668E7" offset="0.3030465%"/>
<stop stop-color="#44BAE1" offset="100%"/>
</linearGradient>
<linearGradient x1="0.0117592657%" y1="50.0044985%" x2="100.006481%" y2="50.0044985%"
id="linearGradient-2">
<stop stop-color="#44BCE1" offset="0%"/>
<stop stop-color="#44BAE1" offset="36.72%"/>
<stop stop-color="#43B2E2" offset="54.5%"/>
<stop stop-color="#41A5E2" offset="68.19%"/>
<stop stop-color="#3F93E4" offset="79.8%"/>
<stop stop-color="#3C7BE5" offset="89.99%"/>
<stop stop-color="#385EE7" offset="99.21%"/>
<stop stop-color="#385BE7" offset="100%"/>
</linearGradient>
<linearGradient x1="0.0148416278%" y1="50.0005568%" x2="100.005996%" y2="50.0005568%"
id="linearGradient-3">
<stop stop-color="#44BCE1" offset="0%"/>
<stop stop-color="#43B6E1" offset="14.76%"/>
<stop stop-color="#41A4E2" offset="34.89%"/>
<stop stop-color="#3E88E4" offset="58.12%"/>
<stop stop-color="#3960E7" offset="83.49%"/>
<stop stop-color="#385BE7" offset="86.36%"/>
</linearGradient>
</defs>
<g>
<title>background</title>
<rect x="-1" y="-1" width="184" height="168" id="canvas_background" fill="none"/>
</g>
<g>
<title>Layer 1</title>
<g id="logo3-01的副本" fill-rule="nonzero" stroke="null"
transform="rotate(-1 88.74440002441469,82.13372802734358) ">
<g id="图层_2" stroke="null" transform="rotate(-1 88.74440002441469,82.13372802734358) ">
<g id="XMLID_5_" stroke="null">
<g id="编组" stroke="null">
<path
d="m85.59977,58.69808c-18.60016,1.68406 -33.15083,17.00902 -33.15083,35.70211c0,19.80456 16.36951,35.83683 36.51396,35.83683c0,0 74.57221,12.15893 56.93295,-76.69217c10.15802,16.70589 19.42378,33.51283 19.42378,33.51283c0,0 22.64964,38.36292 -2.47087,61.80507c0,0 -14.585,13.40513 -41.55865,13.40513c-7.41261,0 -16.30088,0 -25.36073,0c-47.22107,-8.15086 -51.20191,-49.17461 -51.20191,-49.17461c-3.26018,-52.74481 40.8723,-54.5636 40.8723,-54.5636l0,0.16841z"
id="路径" fill="url(#linearGradient-1)" stroke="null" stroke-width="0"/>
<path
d="m145.89585,53.54485c17.63926,88.8511 -56.93295,76.69217 -56.93295,76.69217c20.17877,0 36.51396,-16.03227 36.51396,-35.83683c0,-3.33445 -0.48045,-6.56784 -1.33839,-9.63284c0,0 0,-0.03368 0,-0.03368c-0.37749,-1.91983 -6.0399,-28.3596 -33.52833,-38.63238c-12.52593,-4.68169 -26.35594,-4.34488 -38.91619,0.20209c-8.81963,3.19972 -19.18356,8.75712 -26.83639,18.32259l19.04629,-32.90656c4.35833,-7.51092 10.05506,-14.17981 16.98722,-19.50144c12.11413,-9.22866 31.19473,-16.97534 52.91779,-0.97676c0,0 6.52035,3.63758 19.86991,23.13901c3.84358,5.62477 8.13328,12.3947 12.21708,19.16463z"
id="路径" fill="url(#linearGradient-2)" stroke="null" stroke-width="0"/>
<path
d="m124.13847,84.73367c0.85794,3.06499 1.33839,6.29839 1.33839,9.63284c0,19.80456 -16.36951,35.83683 -36.51396,35.83683c-20.14445,0 -36.51396,-16.03227 -36.51396,-35.83683c0,-18.69309 14.55067,-34.01805 33.15083,-35.70212c1.09817,-0.10104 2.23065,-0.13472 3.36313,-0.13472c16.747,0 30.88587,11.08113 35.17557,26.204c0,0 0,0 0,0z"
id="路径" fill="#FFFFFF" stroke="null" stroke-width="0"/>
<path
d="m44.72747,113.09327c0,0 3.94653,41.02375 51.20191,49.17461c-15.47726,0 -31.332,0 -40.63208,0c-10.39824,0 -20.69353,-2.35769 -29.85634,-7.20779c-12.21708,-6.50048 -24.64006,-18.38995 -22.3751,-39.44073c1.64725,-15.32496 20.79649,-49.24196 20.79649,-49.24196l0.99521,-1.71775c0,0 0,0 0,-0.03368c7.61851,-9.59915 17.98244,-15.12287 26.83639,-18.32259c12.56025,-4.54697 26.39026,-4.88378 38.91619,-0.20209c27.48843,10.30646 33.15084,36.74623 33.52833,38.63238c-4.2897,-15.08919 -18.42857,-26.17032 -35.17557,-26.17032c-1.13249,0 -2.26497,0.06736 -3.36313,0.13472l0,-0.13472c0,-0.03368 -44.13248,1.78511 -40.8723,54.52992z"
id="路径" fill="url(#linearGradient-3)" stroke="null" stroke-width="0"/>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

+474
View File
@@ -0,0 +1,474 @@
<svg width="1052" height="652" viewBox="0 0 1052 652" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path
d="M909.026 641.482H254.027H209.272V338.044C209.272 316.552 226.717 299.128 248.235 299.128C269.754 299.128 287.198 281.705 287.198 260.212V227.344C287.198 187.699 319.376 155.56 359.069 155.56H683.672C717.986 155.56 745.803 183.343 745.803 217.615C745.803 251.887 773.62 279.67 807.933 279.67H827.414C872.487 279.67 909.026 316.165 909.026 361.183V641.482Z"
fill="#F3F6FF"/>
<path
d="M809.512 139.783C812.42 139.783 814.778 137.429 814.778 134.524C814.778 131.62 812.42 129.265 809.512 129.265C806.604 129.265 804.247 131.62 804.247 134.524C804.247 137.429 806.604 139.783 809.512 139.783Z"
fill="#54B7FF"/>
<path
d="M841.63 165.552C848.609 165.552 854.267 159.901 854.267 152.93C854.267 145.96 848.609 140.309 841.63 140.309C834.651 140.309 828.994 145.96 828.994 152.93C828.994 159.901 834.651 165.552 841.63 165.552Z"
stroke="#54B7FF" stroke-width="1.053"/>
<path
d="M319.062 107.54C328.382 109.316 337.377 103.208 339.151 93.8978C340.925 84.5874 334.807 75.5999 325.486 73.8237C316.166 72.0475 307.171 78.1553 305.397 87.4657C303.623 96.7761 309.741 105.764 319.062 107.54Z"
fill="#54B7FF"/>
<path
d="M294.367 140.737C310.392 143.791 325.857 133.289 328.907 117.281C331.958 101.274 321.439 85.821 305.413 82.7671C289.387 79.7132 273.923 90.2145 270.872 106.222C267.822 122.23 278.341 137.683 294.367 140.737Z"
stroke="#7268F5" stroke-width="1.053"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M316.007 651.438C313.858 651.438 312.182 649.581 312.405 647.447L338.901 393.717L349.371 394.84L319.603 648.243C319.389 650.065 317.843 651.438 316.007 651.438Z"
fill="#627AC1"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M433.809 651.438C435.957 651.438 437.634 649.581 437.411 647.447L410.915 393.717L400.444 394.84L430.212 648.243C430.427 650.065 431.973 651.438 433.809 651.438Z"
fill="#627AC1"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M602.437 651.438C600.289 651.438 598.612 649.581 598.835 647.447L625.331 393.717L635.802 394.84L606.034 648.243C605.819 650.065 604.273 651.438 602.437 651.438Z"
fill="#627AC1"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M720.24 651.438C722.388 651.438 724.064 649.581 723.841 647.447L697.345 393.717L686.875 394.84L716.642 648.243C716.857 650.065 718.403 651.438 720.24 651.438Z"
fill="#627AC1"/>
<path d="M419.399 382.744H323.572V398.521H419.399V382.744Z" fill="#A3BAFF"/>
<path d="M716.36 382.744H419.399V398.521H716.36V382.744Z" fill="#CCD9FF"/>
<path
d="M487.278 2H373.548C369.477 2 366.177 5.30011 366.177 9.371V82.9785C366.177 87.0494 369.477 90.3495 373.548 90.3495H487.278C491.349 90.3495 494.649 87.0494 494.649 82.9785V9.371C494.649 5.30011 491.349 2 487.278 2Z"
fill="white" stroke="#E5E5E5" stroke-width="2.106"/>
<path
d="M387.238 32.5017C390.728 32.5017 393.556 29.6763 393.556 26.1911C393.556 22.7058 390.728 19.8804 387.238 19.8804C383.749 19.8804 380.92 22.7058 380.92 26.1911C380.92 29.6763 383.749 32.5017 387.238 32.5017Z"
fill="#A3B7FF"/>
<path d="M393.556 61.9514H380.92V79.8317H393.556V61.9514Z" fill="#5FFFD8"/>
<path d="M393.556 49.3301H380.92V67.2103H393.556V49.3301Z" fill="#1BE3B3"/>
<path d="M415.67 64.0549H403.034V80.8834H415.67V64.0549Z" fill="#5FFFD8"/>
<path d="M415.67 56.6926H403.034V71.4175H415.67V56.6926Z" fill="#1BE3B3"/>
<path d="M437.785 53.5371H425.148V80.8834H437.785V53.5371Z" fill="#5FFFD8"/>
<path d="M437.785 44.0713H425.148V61.9515H437.785V44.0713Z" fill="#1BE3B3"/>
<path d="M459.899 53.5371H447.262V80.8834H459.899V53.5371Z" fill="#5FFFD8"/>
<path d="M459.899 29.3462H447.262V56.6925H459.899V29.3462Z" fill="#1BE3B3"/>
<path d="M482.013 53.5371H469.376V80.8834H482.013V53.5371Z" fill="#5FFFD8"/>
<path d="M482.013 37.7605H469.376V65.1068H482.013V37.7605Z" fill="#1BE3B3"/>
<path
d="M453.408 200.823C453.408 196.155 457.196 192.372 461.868 192.372H656.464C661.136 192.372 664.924 196.155 664.924 200.823V336.029C664.924 340.696 661.136 344.479 656.464 344.479H461.868C457.196 344.479 453.408 340.696 453.408 336.029V200.823Z"
fill="#706AC7"/>
<path
d="M460.176 205.893C460.176 201.226 463.964 197.442 468.637 197.442H649.695C654.368 197.442 658.156 201.226 658.156 205.893V330.959C658.156 335.627 654.368 339.41 649.695 339.41H468.637C463.964 339.41 460.176 335.627 460.176 330.959V205.893Z"
fill="#282F48"/>
<path d="M580.318 344.479H538.015V374.057H580.318V344.479Z" fill="#2C2770"/>
<path
d="M488.942 378.282C488.942 375.949 490.836 374.057 493.172 374.057H626.005C628.341 374.057 630.235 375.949 630.235 378.282C630.235 380.616 628.341 382.507 626.005 382.507H493.172C490.836 382.507 488.942 380.616 488.942 378.282Z"
fill="#706AC7"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M461.281 203.262C460.574 204.676 460.175 206.272 460.175 207.96V328.892C460.175 334.7 464.89 339.41 470.706 339.41H647.624C653.44 339.41 658.155 334.7 658.155 328.892V313.635C656.039 304.339 638.271 277.722 601.469 294.622C564.665 311.523 516.862 288.707 506.286 248.145C498.271 217.406 473.681 205.726 461.281 203.262Z"
fill="#2F3B67"/>
<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="591" y="249" width="34"
height="34">
<path
d="M608.094 282.802C617.395 282.802 624.936 275.27 624.936 265.979C624.936 256.688 617.395 249.156 608.094 249.156C598.791 249.156 591.25 256.688 591.25 265.979C591.25 275.27 598.791 282.802 608.094 282.802ZM608.094 277.034C614.207 277.034 619.162 272.085 619.162 265.979C619.162 259.874 614.207 254.924 608.094 254.924C601.981 254.924 597.025 259.874 597.025 265.979C597.025 272.085 601.981 277.034 608.094 277.034Z"
fill="white"/>
</mask>
<g mask="url(#mask0)">
<path
d="M608.094 282.802C617.396 282.802 624.937 275.27 624.937 265.979C624.937 256.688 617.396 249.156 608.094 249.156C598.792 249.156 591.251 256.688 591.251 265.979C591.251 275.27 598.792 282.802 608.094 282.802Z"
fill="#324178"/>
</g>
<mask id="mask1" mask-type="alpha" maskUnits="userSpaceOnUse" x="591" y="249" width="34"
height="34">
<path
d="M608.094 282.802C617.395 282.802 624.936 275.27 624.936 265.979C624.936 256.688 617.395 249.156 608.094 249.156C598.791 249.156 591.25 256.688 591.25 265.979C591.25 275.27 598.791 282.802 608.094 282.802ZM608.094 277.034C614.207 277.034 619.162 272.085 619.162 265.979C619.162 259.874 614.207 254.924 608.094 254.924C601.981 254.924 597.025 259.874 597.025 265.979C597.025 272.085 601.981 277.034 608.094 277.034Z"
fill="white"/>
</mask>
<g mask="url(#mask1)">
<path
d="M624.936 265.979C624.936 262.652 623.949 259.399 622.098 256.633C620.247 253.866 617.617 251.71 614.54 250.437C611.462 249.164 608.075 248.831 604.808 249.48C601.541 250.129 598.54 251.731 596.184 254.084L608.094 265.979H624.936Z"
fill="white"/>
</g>
<mask id="mask2" mask-type="alpha" maskUnits="userSpaceOnUse" x="543" y="249" width="35"
height="34">
<path
d="M560.225 282.802C569.527 282.802 577.068 275.27 577.068 265.979C577.068 256.688 569.527 249.156 560.225 249.156C550.923 249.156 543.382 256.688 543.382 265.979C543.382 275.27 550.923 282.802 560.225 282.802ZM560.225 277.034C566.338 277.034 571.294 272.085 571.294 265.979C571.294 259.874 566.338 254.924 560.225 254.924C554.112 254.924 549.157 259.874 549.157 265.979C549.157 272.085 554.112 277.034 560.225 277.034Z"
fill="white"/>
</mask>
<g mask="url(#mask2)">
<path
d="M560.225 282.802C569.527 282.802 577.068 275.27 577.068 265.979C577.068 256.688 569.527 249.156 560.225 249.156C550.923 249.156 543.382 256.688 543.382 265.979C543.382 275.27 550.923 282.802 560.225 282.802Z"
fill="#324178"/>
</g>
<mask id="mask3" mask-type="alpha" maskUnits="userSpaceOnUse" x="543" y="249" width="35"
height="34">
<path
d="M560.225 282.802C569.527 282.802 577.068 275.27 577.068 265.979C577.068 256.688 569.527 249.156 560.225 249.156C550.923 249.156 543.382 256.688 543.382 265.979C543.382 275.27 550.923 282.802 560.225 282.802ZM560.225 277.034C566.338 277.034 571.294 272.085 571.294 265.979C571.294 259.874 566.338 254.924 560.225 254.924C554.112 254.924 549.157 259.874 549.157 265.979C549.157 272.085 554.112 277.034 560.225 277.034Z"
fill="white"/>
</mask>
<g mask="url(#mask3)">
<path
d="M577.068 265.979C577.068 263.213 576.385 260.489 575.079 258.049C573.774 255.609 571.886 253.529 569.582 251.992C567.279 250.455 564.632 249.509 561.876 249.237C559.119 248.966 556.338 249.378 553.779 250.437C551.22 251.496 548.962 253.168 547.205 255.307C545.448 257.445 544.246 259.984 543.706 262.697C543.165 265.411 543.303 268.215 544.107 270.863C544.911 273.51 546.356 275.918 548.315 277.875L560.225 265.979H577.068Z"
fill="white"/>
</g>
<mask id="mask4" mask-type="alpha" maskUnits="userSpaceOnUse" x="493" y="249" width="35"
height="34">
<path
d="M510.582 282.802C519.885 282.802 527.425 275.27 527.425 265.979C527.425 256.688 519.885 249.156 510.582 249.156C501.28 249.156 493.739 256.688 493.739 265.979C493.739 275.27 501.28 282.802 510.582 282.802ZM510.582 277.034C516.695 277.034 521.651 272.085 521.651 265.979C521.651 259.874 516.695 254.924 510.582 254.924C504.47 254.924 499.514 259.874 499.514 265.979C499.514 272.085 504.47 277.034 510.582 277.034Z"
fill="white"/>
</mask>
<g mask="url(#mask4)">
<path
d="M510.582 282.802C519.884 282.802 527.425 275.27 527.425 265.979C527.425 256.688 519.884 249.156 510.582 249.156C501.28 249.156 493.739 256.688 493.739 265.979C493.739 275.27 501.28 282.802 510.582 282.802Z"
fill="#324178"/>
</g>
<mask id="mask5" mask-type="alpha" maskUnits="userSpaceOnUse" x="493" y="249" width="35"
height="34">
<path
d="M510.582 282.802C519.885 282.802 527.425 275.27 527.425 265.979C527.425 256.688 519.885 249.156 510.582 249.156C501.28 249.156 493.739 256.688 493.739 265.979C493.739 275.27 501.28 282.802 510.582 282.802ZM510.582 277.034C516.695 277.034 521.651 272.085 521.651 265.979C521.651 259.874 516.695 254.924 510.582 254.924C504.47 254.924 499.514 259.874 499.514 265.979C499.514 272.085 504.47 277.034 510.582 277.034Z"
fill="white"/>
</mask>
<g mask="url(#mask5)">
<path
d="M527.425 265.979C527.425 262.652 526.438 259.399 524.587 256.633C522.736 253.866 520.106 251.71 517.028 250.437C513.95 249.164 510.564 248.831 507.296 249.48C504.029 250.129 501.028 251.731 498.672 254.084C496.317 256.436 494.713 259.434 494.063 262.697C493.413 265.961 493.747 269.343 495.021 272.417C496.296 275.491 498.455 278.118 501.225 279.967C503.995 281.815 507.251 282.802 510.582 282.802V265.979H527.425Z"
fill="white"/>
</g>
<path
d="M490.193 311.467C490.193 310.306 491.135 309.364 492.298 309.364H532.307C533.47 309.364 534.413 310.306 534.413 311.467C534.413 312.628 533.47 313.571 532.307 313.571H492.298C491.135 313.571 490.193 312.628 490.193 311.467Z"
fill="white"/>
<path
d="M490.193 322.706C490.193 321.544 491.135 320.602 492.298 320.602H521.778C522.941 320.602 523.884 321.544 523.884 322.706C523.884 323.867 522.941 324.809 521.778 324.809H492.298C491.135 324.809 490.193 323.867 490.193 322.706Z"
fill="white"/>
<path
d="M605.434 230.01C605.434 228.849 606.376 227.907 607.54 227.907H622.837C623.999 227.907 624.942 228.849 624.942 230.01C624.942 231.172 623.999 232.113 622.837 232.113H607.54C606.376 232.113 605.434 231.172 605.434 230.01Z"
fill="white"/>
<path
d="M594.798 321.76C597.736 321.76 600.117 319.381 600.117 316.447C600.117 313.513 597.736 311.135 594.798 311.135C591.86 311.135 589.479 313.513 589.479 316.447C589.479 319.381 591.86 321.76 594.798 321.76Z"
fill="white"/>
<path
d="M614.299 321.76C617.237 321.76 619.618 319.381 619.618 316.447C619.618 313.513 617.237 311.135 614.299 311.135C611.362 311.135 608.981 313.513 608.981 316.447C608.981 319.381 611.362 321.76 614.299 321.76Z"
fill="white"/>
<path
d="M522.998 222.594H498.166C495.721 222.594 493.739 224.576 493.739 227.021C493.739 229.466 495.721 231.448 498.166 231.448H522.998C525.443 231.448 527.425 229.466 527.425 227.021C527.425 224.576 525.443 222.594 522.998 222.594Z"
fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M619.618 209.313H499.057C489.755 209.313 482.214 216.845 482.214 226.136V281.031C482.214 290.322 489.755 297.854 499.057 297.854H619.618C628.92 297.854 636.461 290.322 636.461 281.031V226.136C636.461 216.845 628.92 209.313 619.618 209.313ZM499.057 208.428C489.266 208.428 481.328 216.356 481.328 226.136V281.031C481.328 290.811 489.266 298.74 499.057 298.74H619.618C629.41 298.74 637.348 290.811 637.348 281.031V226.136C637.348 216.356 629.41 208.428 619.618 208.428H499.057Z"
fill="white"/>
<path d="M481.608 329.104H403.034L413.968 382.744H492.543L481.608 329.104Z" fill="#BE7430"/>
<path d="M403.404 329.104H480.96L470.06 382.744H392.503L403.404 329.104Z" fill="#FF9330"/>
<path
d="M407.977 337.512C408.237 336.289 409.317 335.414 410.567 335.414H469.886C471.571 335.414 472.827 336.966 472.476 338.614L464.432 376.439C464.172 377.663 463.093 378.537 461.843 378.537H402.523C400.839 378.537 399.583 376.985 399.934 375.337L407.977 337.512Z"
fill="#FFB36C"/>
<path
d="M470.429 351.191L464.68 377.776C464.584 378.22 464.186 378.537 463.724 378.537H392.775C392.68 378.537 392.589 378.524 392.503 378.499V378.462C402.695 378.718 425.032 376.271 431.283 368.661C435.428 363.615 440.391 364.24 445.219 364.37C449.495 364.485 453.358 364.589 455.606 361.069C457.694 357.8 460.339 357.548 462.878 357.305C465.94 357.012 468.847 356.735 470.429 351.191Z"
fill="#F2A864"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M407.799 326.419C408.124 327.047 408.299 327.802 408.299 328.578H407.096C407.096 327.474 406.457 326.579 405.669 326.579C404.88 326.579 404.241 327.474 404.241 328.578C404.241 329.681 404.88 330.576 405.669 330.576C405.816 330.576 405.958 330.545 406.091 330.487L406.448 332.093C405.919 332.323 405.351 332.314 404.825 332.066C404.3 331.818 403.844 331.345 403.522 330.713C403.2 330.082 403.029 329.324 403.034 328.549C403.038 327.773 403.218 327.02 403.546 326.395C403.875 325.771 404.337 325.307 404.865 325.071C405.393 324.835 405.961 324.838 406.488 325.08C407.015 325.322 407.473 325.791 407.799 326.419Z"
fill="#C4C4C4"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M468.875 326.419C469.201 327.047 469.376 327.802 469.376 328.578H468.173C468.173 327.474 467.534 326.579 466.745 326.579C465.957 326.579 465.318 327.474 465.318 328.578C465.318 329.681 465.957 330.576 466.745 330.576C466.892 330.576 467.035 330.545 467.168 330.487L467.525 332.093C466.996 332.323 466.428 332.314 465.902 332.066C465.377 331.818 464.921 331.345 464.599 330.713C464.278 330.082 464.107 329.324 464.111 328.549C464.116 327.773 464.295 327.02 464.624 326.395C464.952 325.771 465.414 325.307 465.942 325.071C466.47 324.835 467.038 324.838 467.565 325.08C468.092 325.322 468.55 325.791 468.875 326.419Z"
fill="#C4C4C4"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M448.868 326.419C449.193 327.047 449.368 327.802 449.368 328.578H448.164C448.164 327.474 447.526 326.579 446.738 326.579C445.949 326.579 445.311 327.474 445.311 328.578C445.311 329.681 445.949 330.576 446.738 330.576C446.885 330.576 447.026 330.545 447.16 330.487L447.517 332.093C446.988 332.323 446.42 332.314 445.895 332.066C445.369 331.818 444.913 331.345 444.591 330.713C444.269 330.082 444.099 329.324 444.103 328.549C444.107 327.773 444.287 327.02 444.615 326.395C444.944 325.771 445.406 325.307 445.934 325.071C446.462 324.835 447.03 324.838 447.557 325.08C448.084 325.322 448.542 325.791 448.868 326.419Z"
fill="#C4C4C4"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M428.86 326.419C429.185 327.047 429.36 327.802 429.36 328.578H428.157C428.157 327.474 427.518 326.579 426.73 326.579C425.941 326.579 425.303 327.474 425.303 328.578C425.303 329.681 425.941 330.576 426.73 330.576C426.877 330.576 427.019 330.545 427.152 330.487L427.509 332.093C426.98 332.323 426.412 332.314 425.886 332.066C425.361 331.818 424.905 331.345 424.583 330.713C424.261 330.082 424.091 329.324 424.095 328.549C424.099 327.773 424.279 327.02 424.607 326.395C424.936 325.771 425.398 325.307 425.926 325.071C426.454 324.835 427.022 324.838 427.549 325.08C428.076 325.322 428.534 325.791 428.86 326.419Z"
fill="#C4C4C4"/>
<path
d="M412.929 343.52C413.143 342.475 414.06 341.725 415.123 341.725H418.696C420.113 341.725 421.174 343.03 420.889 344.423L420.518 346.24C420.304 347.285 419.387 348.036 418.324 348.036H414.751C413.334 348.036 412.273 346.731 412.558 345.338L412.929 343.52Z"
fill="#FFDAB8"/>
<path
d="M428.725 343.52C428.939 342.475 429.855 341.725 430.919 341.725H434.492C435.909 341.725 436.97 343.03 436.685 344.423L436.313 346.24C436.1 347.285 435.183 348.036 434.12 348.036H430.547C429.13 348.036 428.069 346.731 428.354 345.338L428.725 343.52Z"
fill="#FFDAB8"/>
<path
d="M443.468 343.52C443.682 342.475 444.598 341.725 445.661 341.725H449.235C450.652 341.725 451.713 343.03 451.428 344.423L451.056 346.24C450.843 347.285 449.926 348.036 448.863 348.036H445.29C443.872 348.036 442.811 346.731 443.096 345.338L443.468 343.52Z"
fill="#FFDAB8"/>
<path
d="M459.264 343.52C459.477 342.475 460.394 341.725 461.457 341.725H465.03C466.448 341.725 467.508 343.03 467.223 344.423L466.852 346.24C466.638 347.285 465.722 348.036 464.659 348.036H461.085C459.668 348.036 458.607 346.731 458.892 345.338L459.264 343.52Z"
fill="#FFDAB8"/>
<path
d="M409.77 355.09C409.984 354.045 410.9 353.294 411.964 353.294H415.537C416.954 353.294 418.015 354.599 417.73 355.992L417.359 357.81C417.145 358.855 416.228 359.605 415.165 359.605H411.592C410.175 359.605 409.114 358.3 409.399 356.907L409.77 355.09Z"
fill="#FFDAB8"/>
<path
d="M425.566 355.09C425.78 354.045 426.696 353.294 427.759 353.294H431.333C432.75 353.294 433.811 354.599 433.526 355.992L433.154 357.81C432.941 358.855 432.024 359.605 430.961 359.605H427.388C425.97 359.605 424.91 358.3 425.194 356.907L425.566 355.09Z"
fill="#FFDAB8"/>
<path
d="M440.309 355.09C440.522 354.045 441.439 353.294 442.502 353.294H446.075C447.493 353.294 448.554 354.599 448.269 355.992L447.897 357.81C447.683 358.855 446.767 359.605 445.703 359.605H442.13C440.713 359.605 439.652 358.3 439.937 356.907L440.309 355.09Z"
fill="#FFDAB8"/>
<path
d="M456.105 355.09C456.318 354.045 457.235 353.294 458.298 353.294H461.871C463.289 353.294 464.349 354.599 464.064 355.992L463.693 357.81C463.479 358.855 462.563 359.605 461.5 359.605H457.926C456.509 359.605 455.448 358.3 455.733 356.907L456.105 355.09Z"
fill="#FFDAB8"/>
<path
d="M406.611 366.659C406.825 365.614 407.741 364.864 408.804 364.864H412.378C413.795 364.864 414.856 366.169 414.571 367.562L414.199 369.38C413.986 370.425 413.069 371.175 412.006 371.175H408.433C407.015 371.175 405.955 369.87 406.239 368.477L406.611 366.659Z"
fill="#FFDAB8"/>
<path
d="M422.407 366.659C422.62 365.614 423.537 364.864 424.6 364.864H428.173C429.591 364.864 430.652 366.169 430.367 367.562L429.995 369.38C429.781 370.425 428.865 371.175 427.802 371.175H424.229C422.811 371.175 421.75 369.87 422.035 368.477L422.407 366.659Z"
fill="#FFDAB8"/>
<path
d="M437.15 366.659C437.363 365.614 438.28 364.864 439.343 364.864H442.916C444.334 364.864 445.394 366.169 445.11 367.562L444.738 369.38C444.524 370.425 443.608 371.175 442.545 371.175H438.971C437.554 371.175 436.493 369.87 436.778 368.477L437.15 366.659Z"
fill="#FFDAB8"/>
<path
d="M452.945 366.659C453.159 365.614 454.076 364.864 455.139 364.864H458.712C460.13 364.864 461.19 366.169 460.905 367.562L460.534 369.38C460.32 370.425 459.404 371.175 458.34 371.175H454.767C453.35 371.175 452.289 369.87 452.574 368.477L452.945 366.659Z"
fill="#FFDAB8"/>
<path
d="M322.344 639.673L309.917 629.034C303.305 623.375 304.57 606.09 304.57 606.09L286.798 605.129V624.32L283.915 634.396L320.903 641.592L322.344 639.673Z"
fill="#FFAE64"/>
<path
d="M316.14 651.188H328.015C329.56 651.188 330.988 650.368 331.767 649.036C332.943 647.023 332.322 644.436 330.381 643.145C328.032 641.584 324.606 639.264 320.423 636.315C312.256 630.557 308.894 626.719 308.894 626.719C308.894 626.719 304.09 629.598 296.885 629.598C289.68 629.598 285.837 624.32 285.837 624.32C282.745 632.04 282.634 640.632 285.526 648.429L285.837 649.268L299.767 650.229L302.169 648.309L308.522 650.122C311 650.829 313.563 651.188 316.14 651.188Z"
fill="#2C2770"/>
<path
d="M193.609 639.673L206.036 629.034C212.647 623.375 211.382 606.09 211.382 606.09L229.155 605.129V624.32L232.037 634.396L195.05 641.592L193.609 639.673Z"
fill="#FFAE64"/>
<path
d="M199.813 651.188H187.938C186.393 651.188 184.964 650.368 184.186 649.036C183.01 647.023 183.63 644.436 185.573 643.145C187.92 641.584 191.347 639.264 195.53 636.315C203.696 630.557 207.059 626.719 207.059 626.719C207.059 626.719 211.862 629.598 219.068 629.598C226.273 629.598 230.116 624.32 230.116 624.32C233.208 632.04 233.319 640.632 230.427 648.429L230.116 649.268L216.186 650.229L213.784 648.309L207.431 650.122C204.953 650.829 202.389 651.188 199.813 651.188Z"
fill="#2C2770"/>
<path
d="M234.813 339.669L238.762 320.144L318.981 317.745L323.936 355.358C325.433 366.723 325.917 378.198 325.381 389.649L314.658 618.564H286.317L280.553 389.231L238.762 618.564H208.5L232.037 398.347L231.822 396.055C230.054 377.215 231.061 358.217 234.813 339.669Z"
fill="#2C2770"/>
<mask id="mask6" mask-type="alpha" maskUnits="userSpaceOnUse" x="207" y="317" width="118"
height="302">
<path
d="M233.852 339.669L237.802 320.144L318.021 317.745L322.976 355.358C324.473 366.723 324.956 378.198 324.42 389.649L313.698 618.564H285.357L279.592 389.231L237.802 618.564H207.539L231.077 398.347L230.861 396.055C229.093 377.215 230.101 358.217 233.852 339.669Z"
fill="white"/>
</mask>
<g mask="url(#mask6)">
<path
d="M243.566 318.225C241.004 331.019 235.88 367.737 235.88 412.26C235.88 412.26 219.869 568.987 211.863 619.523"
stroke="white" stroke-width="1.053"/>
<path
d="M281.034 389.711C283.916 396.908 289.776 420.896 290.16 459.278C290.545 497.661 290.32 581.461 290.16 618.564"
stroke="white" stroke-width="1.053"/>
</g>
<path
d="M378.719 192.924L355.485 204.712L358.039 230.283L382.401 219.544C395.64 213.707 404.953 201.493 407.064 187.194L415.407 130.703L422.123 123.064L427.336 116.313C429.122 114 429.782 111.012 429.137 108.164C428.669 106.097 427.271 104.362 425.35 103.464L415.653 98.9286L422.041 83.5395C422.662 82.045 421.801 80.3499 420.227 79.9672C419.08 79.6881 417.887 80.2039 417.305 81.2303L407.51 98.5094L404.769 98.0523C403.406 97.8248 402.051 98.5103 401.429 99.7439L398.25 106.04C397.369 107.784 397.124 109.78 397.555 111.685L400.057 122.731L378.719 192.924Z"
fill="#FF9330"/>
<path
d="M422.313 102.109L416.552 113.152C415.98 114.249 414.656 114.715 413.522 114.22C412.445 113.749 411.881 112.555 412.202 111.425L413.157 108.062"
stroke="black" stroke-width="1.053"/>
<path
d="M427.57 104.689L420.619 115.143C419.964 116.127 418.658 116.437 417.63 115.852C416.586 115.257 416.194 113.946 416.742 112.876L417.017 112.338"
stroke="black" stroke-width="1.053"/>
<path
d="M428.461 112.699L422.809 120.618C422.093 121.622 420.732 121.922 419.658 121.311C418.622 120.721 418.175 119.461 418.609 118.35L419.654 115.67"
stroke="black" stroke-width="1.053"/>
<path
d="M409.459 99.3599L419.27 103.524C420.097 103.875 420.509 104.806 420.213 105.653C419.574 107.484 417.779 108.652 415.843 108.496L406.869 107.771C408.608 108.894 410.978 115.099 411.22 121.53"
stroke="black" stroke-width="1.053"/>
<path
d="M237.552 215.097L259.298 209.397H315.578C322.361 209.397 329.111 208.462 335.637 206.618L368.551 197.322L374.315 226.814L325.801 256.206L321.44 274.167L325.256 301.206C326.799 312.132 318.162 321.833 307.118 321.578L242.002 320.078C237.235 319.969 233.51 315.932 233.786 311.178L235.913 274.651L228.227 289.406L200.427 283.419L210.341 242.761C213.636 229.248 224.083 218.627 237.552 215.097Z"
fill="#54B7FF"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M259.298 209.397L237.552 215.097C224.083 218.627 213.636 229.248 210.341 242.761L200.427 283.419L228.227 289.406L235.913 274.651L201.395 486.704C200.883 489.851 203.27 492.726 206.461 492.806L231.97 493.441L264.031 374.856V216.563H291.937L298.255 374.856L316.099 495.535L342.187 496.185C345.397 496.265 347.931 493.482 347.546 490.298L321.44 274.167L325.801 256.206L374.315 226.814L368.551 197.322L335.637 206.618C329.111 208.462 322.361 209.397 315.578 209.397H259.298Z"
fill="#FFE071"/>
<path d="M301.941 166.078L288.251 163.974" stroke="black" stroke-width="1.053"/>
<path
d="M259.448 204.591C261.426 199.656 261.097 183.615 260.684 176.211C269.752 177.857 287.516 183.985 286.032 195.337C284.549 206.688 288.711 209.527 290.979 209.527C293.451 214.873 295.058 226.184 281.704 228.651C268.351 231.119 257.181 219.396 253.266 213.228C254.502 212.405 257.47 209.527 259.448 204.591Z"
fill="#FF9330"/>
<mask id="mask7" mask-type="alpha" maskUnits="userSpaceOnUse" x="253" y="176" width="40"
height="53">
<path
d="M259.779 204.582C261.745 199.708 261.417 183.866 261.008 176.555C270.018 178.179 287.669 184.232 286.195 195.443C284.72 206.654 288.857 209.457 291.109 209.457C293.567 214.737 295.163 225.908 281.895 228.345C268.625 230.782 257.527 219.206 253.636 213.113C254.865 212.3 257.813 209.457 259.779 204.582Z"
fill="white"/>
</mask>
<g mask="url(#mask7)">
<path
d="M287.883 205.331C267.879 203.159 261.428 186.328 260.703 178.184L287.883 193.386C296.218 198.273 307.887 207.503 287.883 205.331Z"
fill="#D76767"/>
</g>
<path
d="M261.228 177.896C260.825 184.659 269.081 196.955 284.185 196.34C293.003 195.982 295.23 185.913 297.476 174.822C299.078 166.915 302.106 158.489 301.101 152.688L287.81 148.386C289.622 150.845 289.027 150.301 282.986 150.301C277.008 150.301 274.671 146.887 272.455 145.042C271.248 152.42 261.925 144.696 261.925 148.386C261.925 151.336 264.031 170.66 264.031 172.914C261.925 172.914 263.018 166.078 261.228 164.985C259.214 163.755 255.187 162.895 255.187 169.289C255.187 175.682 259.214 177.691 261.228 177.896Z"
fill="#FF9330"/>
<path
d="M261.925 172.914C261.925 172.914 262.978 164.5 259.819 164.5C253.159 164.5 255.607 172.388 255.607 172.388C249.464 160.819 251.394 139.257 269.296 133.998C296.315 126.061 308.786 151.132 300.888 152.404C284.565 155.034 272.455 147.145 270.349 148.723C268.243 150.301 266.137 165.026 265.084 170.285C264.241 174.492 262.802 174.141 261.925 172.914Z"
fill="#2C2770"/>
<path
d="M279.641 180.967L286.366 184.325C285.886 185.284 284.348 186.532 282.043 185.764C279.737 184.996 279.481 182.565 279.641 180.967Z"
fill="white"/>
<path
d="M294.051 160.815H298.858C299.653 160.815 300.297 161.46 300.297 162.255C300.297 163.05 299.653 163.694 298.858 163.694H294.051C293.256 163.694 292.611 163.05 292.611 162.255C292.611 161.46 293.256 160.815 294.051 160.815Z"
fill="#2C2770"/>
<path
d="M274.837 160.815H279.644C280.439 160.815 281.083 161.46 281.083 162.255C281.083 163.05 280.439 163.694 279.644 163.694H274.837C274.042 163.694 273.397 163.05 273.397 162.255C273.397 161.46 274.042 160.815 274.837 160.815Z"
fill="#2C2770"/>
<path
d="M277.72 169.544C276.924 169.544 276.279 168.899 276.279 168.104C276.279 167.309 276.924 166.665 277.72 166.665C278.515 166.665 279.161 167.309 279.161 168.104C279.161 168.899 278.515 169.544 277.72 169.544Z"
fill="black"/>
<path d="M288.768 162.735V180.006H284.445" stroke="black" stroke-width="1.053"/>
<path
d="M293.867 169.544C293.071 169.544 292.426 168.899 292.426 168.104C292.426 167.309 293.071 166.665 293.867 166.665C294.663 166.665 295.308 167.309 295.308 168.104C295.308 168.899 294.663 169.544 293.867 169.544Z"
fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M286.145 167.655C286.145 171.141 283.317 173.966 279.827 173.966C276.338 173.966 273.508 171.141 273.508 167.655C273.508 166.782 273.685 166.147 273.971 165.677C274.254 165.21 274.667 164.866 275.21 164.613C276.33 164.089 277.928 163.974 279.827 163.974C281.726 163.974 283.325 164.089 284.443 164.613C284.987 164.866 285.401 165.21 285.684 165.677C285.968 166.147 286.145 166.782 286.145 167.655Z"
stroke="black" stroke-width="1.053"/>
<path d="M289.767 165.677C288.587 164.58 287.226 164.58 285.684 165.677" stroke="black"
stroke-width="1.053"/>
<path fill-rule="evenodd" clip-rule="evenodd"
d="M301.941 167.655C301.941 171.141 299.112 173.966 295.623 173.966C292.134 173.966 289.304 171.141 289.304 167.655C289.304 166.782 289.481 166.147 289.766 165.677C290.05 165.21 290.463 164.866 291.006 164.613C292.125 164.089 293.724 163.974 295.623 163.974C297.522 163.974 299.121 164.089 300.239 164.613C300.782 164.866 301.196 165.21 301.48 165.677C301.764 166.147 301.941 166.782 301.941 167.655Z"
stroke="black" stroke-width="1.053"/>
<path d="M273.508 166.078L259.819 163.974" stroke="black" stroke-width="1.053"/>
<path
d="M367.471 266.481L313.731 273.985C312.968 274.091 312.325 274.604 312.052 275.324L297.379 314.084C296.815 315.573 298.049 317.125 299.629 316.912L352.76 309.783C353.497 309.684 354.128 309.204 354.419 308.52L370.742 270.079C371.137 269.148 370.814 268.069 369.971 267.507L368.931 266.815C368.501 266.529 367.982 266.41 367.471 266.481Z"
fill="#2C2770"/>
<path
d="M368.604 268.71L317.691 275.829C315.785 276.095 314.177 277.379 313.496 279.177L301.357 311.24C299.947 314.964 303.033 318.842 306.984 318.312L353.041 312.132C354.906 311.882 356.496 310.656 357.211 308.918L371.965 273.034C372.891 270.78 371.02 268.373 368.604 268.71Z"
fill="#6B8CFF"/>
<path
d="M339.734 297.607C342.056 295.858 342.661 292.746 341.087 290.658C339.513 288.57 336.355 288.295 334.034 290.044C331.713 291.794 331.107 294.905 332.681 296.993C334.256 299.082 337.413 299.357 339.734 297.607Z"
fill="#2C2770"/>
<path
d="M283.391 298.021L226.648 289.136L200.848 283.351L198.171 297.062C196.272 306.786 203.71 315.83 213.629 315.858L279.17 316.046L285.646 319.763C285.838 319.872 286.038 319.967 286.244 320.046L295.107 323.421C295.211 323.46 295.317 323.491 295.425 323.514L310.126 326.643C310.892 326.806 311.681 326.506 312.142 325.875C312.976 324.734 312.382 323.113 311.008 322.78L300.918 320.334H316.606C317.206 320.334 317.758 320.005 318.042 319.478C318.598 318.451 317.925 317.191 316.761 317.078L304.181 315.872L322.734 314.236C323.45 314.172 324.074 313.72 324.355 313.06C324.883 311.822 324.023 310.435 322.679 310.356L305.92 309.362L321.532 306.904C322.598 306.735 323.425 305.883 323.561 304.814C323.741 303.394 322.655 302.127 321.222 302.086L300.918 301.511L302.448 300.553L305.608 292.139L296.113 293.724C295.644 293.803 295.181 293.92 294.732 294.077L283.391 298.021Z"
fill="#FF9330"/>
<path
d="M724.215 119.799H566.257C562.186 119.799 558.886 123.099 558.886 127.17V206.037C558.886 210.108 562.186 213.408 566.257 213.408H724.215C728.286 213.408 731.586 210.108 731.586 206.037V127.17C731.586 123.099 728.286 119.799 724.215 119.799Z"
fill="white" stroke="#E5E5E5" stroke-width="2.106"/>
<path d="M608.379 161.87H635.759C634.758 146.66 623.044 134.509 608.379 133.472V161.87Z"
fill="#1BE3B3"/>
<path d="M633.09 187.113C637.616 182.343 640.541 176.115 641.024 169.233H614.697L633.09 187.113Z"
fill="#FFAE64"/>
<path
d="M603.926 166.04V133.472C588.179 134.555 575.734 147.774 575.734 163.934C575.734 180.801 589.292 194.476 606.015 194.476C613.313 194.476 620.002 191.865 625.228 187.526L603.926 166.04Z"
fill="#FF8282"/>
<path d="M702.101 174.492H655.766V182.906H702.101V174.492Z" fill="#A3B7FF"/>
<path d="M689.464 159.767H654.714V168.181H689.464V159.767Z" fill="#A3B7FF"/>
<path d="M721.056 143.99H655.766V152.404H721.056V143.99Z" fill="#A3B7FF"/>
<path d="M856.9 524.735H841.104V635.172H856.9V524.735Z" fill="#CCD9FF"/>
<path d="M830.573 498.44H868.483L864.271 535.253H834.786L830.573 498.44Z" fill="#A3BAFF"/>
<mask id="mask8" mask-type="alpha" maskUnits="userSpaceOnUse" x="830" y="498" width="39"
height="38">
<path d="M830.573 498.44H868.483L864.271 535.253H834.786L830.573 498.44Z" fill="white"/>
</mask>
<g mask="url(#mask8)">
<path d="M874.802 499.492L822.149 496.863L827.414 507.906L870.589 517.373L874.802 499.492Z"
fill="black"/>
</g>
<path d="M897.969 479.508H798.982V503.699H897.969V479.508Z" fill="#CCD9FF"/>
<path d="M906.393 632.016H790.557V641.482H906.393V632.016Z" fill="#CCD9FF"/>
<path d="M906.393 638.327H790.557V641.482H906.393V638.327Z" fill="#2C2770"/>
<path
d="M621.18 605.706L637.237 602.537C645.778 600.851 653.179 585.174 653.179 585.174L669.132 593.059L659.692 609.775L657.247 619.965L621.491 608.084L621.18 605.706Z"
fill="#FFAE64"/>
<path
d="M624.078 608.186L656.753 616.933C657.997 620.625 656.859 624.703 653.882 627.221L648.258 631.976L635.652 625.977L636.467 622.581L628.977 621.413C625.886 620.932 622.906 619.899 620.181 618.363L610.535 612.93C609.215 612.186 608.39 610.798 608.368 609.284C608.334 606.948 610.193 605.02 612.531 604.968L628.979 604.591L624.302 605.132C623.351 605.242 622.722 606.176 622.979 607.099C623.127 607.63 623.545 608.043 624.078 608.186Z"
fill="#2C2770"/>
<path
d="M901.669 411.982L900.032 406.935H854.224L846.23 429.353L765.917 453.277C742.196 458.293 721.389 472.395 707.958 492.557L642.034 591.523L664.674 604.144L764.714 497.914L854.533 486.325C867.614 484.637 879.711 478.49 888.779 468.923C903.181 453.728 908.125 431.889 901.669 411.982Z"
fill="#2C2770"/>
<path
d="M893.714 406.935V430.527C893.714 454.91 875.548 475.483 851.327 478.53L755.763 490.552L662.042 603.092"
stroke="white" stroke-width="1.053"/>
<path
d="M744.722 627.888L754.036 614.446C758.992 607.295 753.373 590.897 753.373 590.897L770.32 585.461L775.2 604.023L780.548 613.037L746.604 629.378L744.722 627.888Z"
fill="#FFAE64"/>
<path
d="M748.531 627.652L778.08 611.204C781.548 612.99 783.574 616.708 783.192 620.585L782.472 627.91L769.242 632.371L767.459 629.366L761.269 633.738C758.714 635.543 755.856 636.873 752.83 637.666L742.118 640.476C740.652 640.86 739.093 640.438 738.022 639.367C736.368 637.714 736.358 635.038 738 633.373L749.542 621.664L746.563 625.304C745.956 626.045 746.157 627.154 746.984 627.637C747.461 627.914 748.049 627.921 748.531 627.652Z"
fill="#2C2770"/>
<path
d="M739.08 440.618L820.526 407.987H855.804L845.8 436.385L763.135 454.265L776.298 596.782H750.498L718.791 481.45C716.497 473.104 717.453 464.2 721.468 456.53C725.251 449.299 731.498 443.656 739.08 440.618Z"
fill="#2C2770"/>
<path d="M765.767 455.317L753.657 462.154L769.453 598.359" stroke="white" stroke-width="1.053"/>
<path d="M850.538 419.031L854.224 407.987H841.587L765.767 455.317L850.538 419.031Z" fill="black"
stroke="black" stroke-width="1.053"/>
<path
d="M943.937 346.555L921.943 336.144L904.457 352.576L924.918 363.656C937.67 370.561 953.088 370.465 965.752 363.401L1010.97 338.181L1020.47 338.781H1028.44C1031.17 338.781 1033.77 337.567 1035.51 335.471C1036.77 333.95 1037.26 331.933 1036.83 330.006L1034.65 320.281L1049.7 316.232C1051.16 315.839 1051.93 314.24 1051.31 312.862C1050.86 311.859 1049.8 311.273 1048.71 311.429L1030.32 314.044L1029.17 311.904C1028.51 310.686 1027.14 310.035 1025.77 310.296L1019.65 311.467C1017.73 311.836 1015.99 312.861 1014.74 314.366L1008.12 322.334L943.937 346.555Z"
fill="#FFAE64"/>
<path
d="M1036.1 326.998L1024.63 329.037C1023.49 329.239 1022.39 328.529 1022.11 327.412C1021.84 326.35 1022.4 325.255 1023.42 324.849L1026.46 323.64"
stroke="black" stroke-width="1.053"/>
<path
d="M1037.19 332.339L1025.47 333.166C1024.37 333.243 1023.4 332.458 1023.24 331.368C1023.09 330.26 1023.84 329.225 1024.94 329.021L1025.5 328.917"
stroke="black" stroke-width="1.053"/>
<path
d="M1031.76 337.553L1022.67 337.895C1021.52 337.939 1020.52 337.107 1020.36 335.969C1020.2 334.868 1020.88 333.822 1021.95 333.51L1024.53 332.755"
stroke="black" stroke-width="1.053"/>
<path
d="M1030.8 315.963L1033.31 325.561C1033.52 326.37 1033.07 327.203 1032.27 327.467C1030.55 328.038 1028.66 327.38 1027.67 325.866L1023.09 318.841C1023.25 320.761 1020 326.039 1015.38 329.877"
stroke="black" stroke-width="1.053"/>
<path
d="M771.586 297.811L794.912 304.775L796.816 328.642L774.176 323.197C760.066 319.804 748.694 309.435 744.057 295.74L727.501 246.834L720.056 240.941L714.139 235.614C712.112 233.789 711.008 231.159 711.127 228.441C711.214 226.469 712.211 224.647 713.828 223.506L721.993 217.745L713.558 204.693C712.739 203.425 713.248 201.729 714.632 201.118C715.641 200.672 716.824 200.948 717.53 201.792L729.41 216.014L731.704 215.195C733.011 214.729 734.47 215.164 735.304 216.267L739.054 221.222C740.234 222.782 740.833 224.702 740.747 226.654L740.292 236.987L771.586 297.811Z"
fill="#FFAE64"/>
<path
d="M716.396 221.762L723.531 230.934C724.238 231.844 725.533 232.053 726.494 231.411C727.407 230.802 727.727 229.614 727.244 228.63L725.806 225.706"
stroke="black" stroke-width="1.053"/>
<path
d="M711.99 224.996L720.122 233.431C720.887 234.225 722.139 234.293 722.988 233.587C723.85 232.868 723.991 231.602 723.31 230.712L722.967 230.264"
stroke="black" stroke-width="1.053"/>
<path
d="M712.504 232.487L719.017 238.813C719.843 239.615 721.145 239.664 722.03 238.927C722.885 238.214 723.087 236.985 722.504 236.039L721.096 233.755"
stroke="black" stroke-width="1.053"/>
<path
d="M727.76 217.116L719.43 222.556C718.729 223.014 718.504 223.936 718.917 224.663C719.808 226.236 721.655 227.011 723.408 226.547L731.54 224.399C730.128 225.715 728.98 231.797 729.826 237.733"
stroke="black" stroke-width="1.053"/>
<path
d="M899.247 311.13L879.427 304.094C873.536 304.094 858.218 303.798 844.079 302.613C829.941 301.428 804.314 302.613 783.695 299.651L779.277 326.313C788.113 330.757 801.368 335.201 819.041 338.164C819.041 351.467 821.988 358.553 821.988 364.825L826.406 384.082L815.699 409.039H902.991L893.954 381.693L899.255 351.467L917.719 363.344L935.393 341.125L908.552 316.702C905.855 314.247 902.691 312.353 899.247 311.13Z"
fill="#6B8CFF"/>
<mask id="mask9" mask-type="alpha" maskUnits="userSpaceOnUse" x="779" y="299" width="157"
height="111">
<path
d="M899.247 311.13L879.427 304.094C873.536 304.094 858.218 303.798 844.079 302.613C829.94 301.428 804.314 302.613 783.695 299.651L779.277 326.313C788.113 330.757 801.368 335.201 819.041 338.164C813.15 355.939 817.078 358.901 821.988 364.825L826.406 384.082L815.699 409.039H902.991L893.954 381.693L899.255 351.467L917.719 363.344L935.393 341.125L908.552 316.702C905.855 314.247 902.691 312.353 899.247 311.13Z"
fill="white"/>
</mask>
<g mask="url(#mask9)">
<path
d="M810.113 286.217C817.342 315.003 738.802 333.235 744.101 367.779C749.402 402.322 883.354 483.884 931.056 458.935C978.758 433.987 976.831 390.328 886.245 392.247C795.659 394.167 774.458 354.345 796.141 333.235C817.824 312.125 881.426 376.894 883.354 350.027C885.281 323.16 803.85 315.003 836.615 295.333C863.466 279.213 874.199 329.397 903.591 335.634C927.105 340.624 940.051 331.956 943.584 326.998C965.909 337.712 999.863 362.117 957.076 374.016C914.288 385.914 841.273 370.657 810.113 361.542"
stroke="#A3B7FF" stroke-width="7.371"/>
</g>
<path
d="M833.91 410.461L840.452 301.757L773.376 295.447L742.743 236.021L724.257 246.539L740.317 297.781C744.794 312.067 756.232 323.124 770.706 327.16L813.516 339.096L820.91 382.219L814.413 410.423L833.91 410.461Z"
fill="#FF6767"/>
<path
d="M884.817 440.067L888.514 305.439L899.161 308.7C905.714 310.708 911.739 314.135 916.806 318.734L945.027 344.355L1002.6 321.741L1008.93 341.199L968.178 366.442C952.072 376.418 931.665 376.384 915.592 366.356L902.246 358.028L898.021 382.745L909.112 445.325L884.817 440.067Z"
fill="#FF6767"/>
<path d="M832.001 301.231L825.135 323.319L838.867 322.267" stroke="black" stroke-width="1.053"/>
<path d="M895.908 307.542L902.774 324.371L887.986 322.267" stroke="black" stroke-width="1.053"/>
<path
d="M834.133 243.2C835.319 233.751 844.511 232.373 848.959 232.866C851.43 231.389 856.373 225.484 866.751 226.96C877.13 228.437 888.992 234.342 886.026 247.628C886.026 247.628 888.514 273.213 869.538 273.213C869.538 279.144 854.712 309.266 854.712 291.24C854.712 273.213 857.251 286.792 845.205 273.213C837.811 270.584 832.65 255.01 834.133 243.2Z"
fill="#2C2770"/>
<path
d="M846.262 234.444C836.636 234.444 828.832 226.674 828.832 217.089C828.832 207.505 836.636 199.735 846.262 199.735C855.887 199.735 863.691 207.505 863.691 217.089C863.691 226.674 855.887 234.444 846.262 234.444Z"
fill="#2C2770"/>
<path
d="M841.546 253.534V257.963C839.569 257.471 835.615 257.372 835.615 260.915C835.615 265.344 838.581 268.297 841.546 266.821C841.931 271.422 844.417 280.505 851.809 284.292C851.544 287.761 850.77 292.742 848.959 296.346C846.587 301.071 842.04 303.235 840.063 303.727C843.028 307.172 851.332 314.062 860.821 314.062C870.31 314.062 877.625 307.172 880.095 303.727C878.612 303.235 874.758 301.366 871.199 297.823C868.398 295.033 867.863 288.402 868.004 283.546C874.165 279.419 876.044 271.142 877.13 266.821C879.107 267.313 883.06 267.116 883.06 262.391C883.06 257.667 878.612 257.471 877.13 257.963V253.534C874.164 254.026 866.455 253.829 859.338 249.105C852.221 244.381 850.442 242.216 850.442 241.723C850.442 244.184 849.352 248.714 847.476 250.581C844.511 253.534 842.535 253.042 841.546 253.534Z"
fill="#FFAE64"/>
<path
d="M853.961 273.743L860.708 277.102C860.225 278.061 858.684 279.308 856.371 278.54C854.058 277.774 853.801 275.342 853.961 273.743Z"
fill="white"/>
<path
d="M868.411 253.593H873.241C874.036 253.593 874.681 254.237 874.681 255.032C874.681 255.827 874.036 256.471 873.241 256.471H868.411C867.616 256.471 866.971 255.827 866.971 255.032C866.971 254.237 867.616 253.593 868.411 253.593Z"
fill="#2C2770"/>
<path
d="M849.137 253.593H853.968C854.763 253.593 855.407 254.237 855.407 255.032C855.407 255.827 854.763 256.471 853.968 256.471H849.137C848.342 256.471 847.698 255.827 847.698 255.032C847.698 254.237 848.342 253.593 849.137 253.593Z"
fill="#2C2770"/>
<path
d="M852.034 261.269C851.236 261.269 850.589 260.624 850.589 259.829C850.589 259.035 851.236 258.39 852.034 258.39C852.833 258.39 853.48 259.035 853.48 259.829C853.48 260.624 852.833 261.269 852.034 261.269Z"
fill="black"/>
<path d="M863.116 255.512V272.784H858.78" stroke="black" stroke-width="1.053"/>
<path
d="M870.345 261.269C869.546 261.269 868.899 260.624 868.899 259.829C868.899 259.035 869.546 258.39 870.345 258.39C871.143 258.39 871.79 259.035 871.79 259.829C871.79 260.624 871.143 261.269 870.345 261.269Z"
fill="black"/>
<path d="M839.025 260.789C838.543 261.909 838.446 264.244 841.916 264.628" stroke="black"
stroke-width="1.053"/>
<path d="M880.219 260.789C880.701 261.909 880.797 264.244 877.328 264.628" stroke="black"
stroke-width="1.053"/>
<mask id="mask10" mask-type="alpha" maskUnits="userSpaceOnUse" x="835" y="241" width="49"
height="74">
<path
d="M841.546 253.534V257.963C839.569 257.471 835.615 257.372 835.615 260.915C835.615 265.344 838.581 268.297 841.546 266.821C841.931 271.422 844.417 280.505 851.809 284.292C851.544 287.761 850.77 292.742 848.959 296.346C846.587 301.071 842.04 303.235 840.063 303.728C843.028 307.172 851.332 314.062 860.821 314.062C870.31 314.062 877.625 307.172 880.095 303.728C878.612 303.235 874.758 301.366 871.199 297.823C868.398 295.033 867.863 288.402 868.004 283.546C874.165 279.419 876.044 271.142 877.13 266.821C879.107 267.313 883.06 267.116 883.06 262.391C883.06 257.667 878.612 257.471 877.13 257.963V253.534C874.164 254.026 866.455 253.829 859.338 249.105C852.221 244.381 850.442 242.216 850.442 241.723C850.442 244.184 849.352 248.714 847.476 250.581C844.511 253.534 842.535 253.042 841.546 253.534Z"
fill="white"/>
</mask>
<g mask="url(#mask10)">
<path
d="M869.38 282.859C868.095 283.658 863.983 285.738 859.743 285.738C855.719 285.738 851.954 284.441 850.758 283.898L850.588 283.818C850.638 283.843 850.694 283.87 850.758 283.898L869.863 292.934L869.38 282.859Z"
fill="#FF8282"/>
</g>
<path
d="M211.002 351.121C218.795 341.921 238.471 345.3 245.605 348.881C226.761 383.129 210.138 358.943 204.364 394.166C201.893 409.241 183.472 394.904 184.889 421.359C186.118 444.313 170.367 446.303 168.529 458.675C166.692 471.046 161.718 481.552 151.015 485.153C135.374 490.414 123.357 471.394 135.169 462.449C146.981 453.506 123.973 440.259 142.083 429.681C160.195 419.103 140.781 394.609 163.6 388.277C186.419 381.943 178.027 368.444 185.4 361.34C192.774 354.235 201.26 362.622 211.002 351.121Z"
fill="#6B8CFF"/>
<path
d="M129.734 279.587C133.699 266.522 152.104 268.017 160.002 273.802C148.945 283.794 132.324 283.411 142.046 322.78C146.207 339.629 123.104 332.605 136.359 359.627C147.859 383.075 129.537 392.058 133.149 405.8C136.76 419.544 139.205 432.535 129.734 441.035C115.893 453.458 99.5566 437.731 107.795 423.155C116.033 408.579 89.1912 405.94 103.219 386.868C117.247 367.797 87.0038 354.68 107.795 337.961C128.586 321.241 106.57 312.889 111.035 302.2C115.499 291.512 124.777 295.919 129.734 279.587Z"
fill="#1BE3B3"/>
<path
d="M29.6166 351.997C22.49 344.585 5.89418 348.5 0 351.922C17.8609 380.054 30.7637 358.604 37.5336 388.257C40.4312 400.947 55.383 387.779 55.5636 410.355C55.7203 429.943 69.2517 430.802 71.4672 441.227C73.6826 451.652 78.4739 460.325 87.7874 462.82C101.398 466.468 110.644 449.654 100.105 442.673C89.5659 435.691 108.485 423.206 92.4912 415.167C76.4967 407.129 91.7613 385.27 71.9759 381.091C52.1907 376.911 58.6363 364.986 51.9776 359.334C45.319 353.681 38.5248 361.263 29.6166 351.997Z"
fill="#54B7FF"/>
<path
d="M121.354 501.296C119.515 459.863 111.884 345.785 135.255 289.694C137.293 284.804 141.573 274.328 152.63 274.328"
stroke="#4F4F4F" stroke-width="1.053"/>
<path d="M99.6992 512.335C98.6375 472.751 81.7297 386.336 22.5924 357.345" stroke="#4F4F4F"
stroke-width="1.053"/>
<path d="M139.647 512.669C143.381 469.708 167.393 376.868 233.568 349.198" stroke="#4F4F4F"
stroke-width="1.053"/>
<path
d="M86.8145 493.624H149.998L166.29 615.667C168.815 634.584 154.082 651.391 134.975 651.391H101.837C82.7306 651.391 67.9972 634.584 70.5224 615.667L86.8145 493.624Z"
fill="#A3BAFF"/>
<path d="M158.422 493.624H77.337V505.194H158.422V493.624Z" fill="#CCD9FF"/>
</svg>

After

Width:  |  Height:  |  Size: 48 KiB

+255
View File
@@ -0,0 +1,255 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px"
viewBox="0 0 600 600" enable-background="new 0 0 600 600" xml:space="preserve">
<g id="LEFT_ARM_1">
<g id="XMLID_46_">
<path id="XMLID_290_" fill="#FFB96C" d="M294.4,485.5c-1.2,0.3-2.4,0.4-3.6,0.4c-0.2,0-0.4,0-0.6,0c-8.4-0.3-16.2-6.9-21-15.7
c-21.3-39.2-27.1-63.4-34.8-89.9c-1.9-6.6-1.4-13.3,1.4-18.1c2.2-3.7,5.7-6.4,10.5-6.9c0.6-0.1,1.1-0.1,1.7-0.1
c8.5,0,17.4,6.8,20.9,15.6l36.5,89.4C310,471.5,305,483.1,294.4,485.5z"/>
<path id="XMLID_280_" fill="#FCAF63" d="M290.2,485.9c-8.4-0.3-16.2-6.9-21-15.7c-21.3-39.2-27.1-63.4-34.8-89.9
c-1.9-6.6-1.4-13.3,1.4-18.1c9.5,23,40.7,98.5,50.3,116.1C287.6,481.1,289,483.6,290.2,485.9z"/>
</g>
</g>
<g id="LEFT_ARM_2">
<g id="XMLID_10_">
<g id="XMLID_42_">
<path id="XMLID_293_" fill="#FFB96C" d="M340.2,472c-0.9,2.3-2.1,4.1-3.3,5c-7.2,5.7-14.3,7-26.2,9.6c-11.9,2.6-24.2,2-29.9-3.4
c-1.9-1.8-3.3-3.8-4.1-5.9c-2.5-6-0.3-12.3,6.8-15c4.2-1.6,42.4-10.6,48.7-9.4C343.1,455,342.9,465.3,340.2,472z"/>
<path id="XMLID_279_" fill="#FCAF63" d="M340.2,472c-0.9,2.3-2.1,4.1-3.3,5c-7.2,5.7-14.3,7-26.2,9.6c-11.9,2.6-24.2,2-29.9-3.4
c-1.9-1.8-3.3-3.8-4.1-5.9c3.2,0.9,9.6,2.1,20.5,0.9C306.4,477.2,325.3,474.3,340.2,472z"/>
</g>
<g id="XMLID_41_">
<path id="XMLID_49_" fill="#FEA691" d="M330.2,453.6c-11.9,4-10.6,11.9-8.8,19.6c1.8,7.7,16.6,27.5,21.1,28.5s4.8-0.8,3.6-4.5
c-1.2-3.7-9.7-16.6-9.7-16.6s9.4,12.8,13.3,16.6c3.9,3.8,7.2,3.5,7.1-0.7c-0.2-4.2-9.5-18.3-9.5-18.3s8.2,10.8,11.6,14.5
s7.9,3.1,6.3-1.9c-1.5-5-8.3-15.9-8.3-15.9s6.6,11,11,12.1c4.4,1.1,1.7-5.5-3-13.9C360.3,464.5,345,448.6,330.2,453.6z"/>
<path id="XMLID_50_" fill="#FEA691" d="M320.2,464.6c0,0-2.5,9.8-0.9,18.4s4.3,10.3,6.1,10.7s2.4-1.9,1.5-5.6
c-0.9-3.7,1.5-11,1.5-11S325.8,462.4,320.2,464.6z"/>
</g>
</g>
</g>
<g id="BODY">
<g id="XMLID_70_">
<path id="XMLID_45_" fill="#FEC272" d="M273.1,496H172.2c0,0-13.9-97.2-5.1-121.1c2.5-6.8,5.8-12.3,9.6-16.9
c9.5-11.6,21.7-16.9,30-19c10.9-2.8,20.4-2.9,28.6-0.9c21.8,5.2,33.9,25.1,37.8,46.8C278.5,414.8,273.1,496,273.1,496z"/>
<path id="XMLID_43_" fill="#F9B35F" d="M207.6,358.5c-13.2,3.4-25.3,3-31-0.5c9.5-11.6,21.7-16.9,30-19
c10.9-2.8,20.4-2.9,28.6-0.9C237,344.9,224.6,354.1,207.6,358.5z"/>
</g>
</g>
<g id="RIGHT_ARM_1">
<g id="XMLID_16_">
<path id="XMLID_278_" fill="#FFCD92" d="M199,381.3c0,1.6-0.1,3.2-0.4,4.7c-4.1,26.6-27.7,90.6-27.7,90.6c-1.7,5.1-5.3,8.9-9.7,11
c-4.4,2-9.5,2.4-14.4,0.5c-7.6-3-11.2-10.2-11.2-18.1c0-1.7,0.2-3.4,0.5-5.1c6.9-37.3,19.2-68.2,29.3-90
c4.4-9.6,15.2-15.6,24.7-10.8c2.9,1.4,4.9,3.7,6.4,6.3C198.3,373.6,199,377.4,199,381.3z"/>
<path id="XMLID_273_" fill="#FCB765" d="M199,381.3c0,1.6-0.1,3.2-0.4,4.7c-4.1,26.6-27.7,90.6-27.7,90.6c-1.7,5.1-5.3,8.9-9.7,11
l35.2-117.3C198.3,373.6,199,377.4,199,381.3z"/>
</g>
</g>
<g id="RIGHT_ARM_2">
<g id="XMLID_17_">
<g id="XMLID_20_">
<path id="XMLID_285_" fill="#FFCD92" d="M230.5,487.4c-2.2,5.4-9.4,5.6-9.4,5.6s-20.2,1.2-37.7,1.2c-17.5,0-34.7,0-41.7-7.9
c-1.4-1.6-2.5-3.4-3.1-5.3c-2.6-7.3,0.7-16,11.1-20.4c7.5-3.2,16.1-2.1,25.5-1.2c9.4,0.9,27.5,5.1,38,7.9
c10.6,2.7,16.9,5.4,17.8,15.4C231.3,484.6,231,486.1,230.5,487.4z"/>
<path id="XMLID_284_" fill="#FCB765" d="M230.5,487.4c-2.2,5.4-9.4,5.6-9.4,5.6s-20.2,1.2-37.7,1.2c-17.5,0-34.7,0-41.7-7.9
c-1.4-1.6-2.5-3.4-3.1-5.3c7.8,2.4,18.3,5.2,26.7,5.9C189,488.9,220.4,487.9,230.5,487.4z"/>
</g>
<g id="XMLID_2_">
<g id="XMLID_18_">
<path id="XMLID_47_" fill="#FEA691" d="M251.6,471.3c0,1.6-0.2,3.3-0.6,5.1c-2.1,8.6-13.2,15.2-30.1,16.1
c-7.5,0.4-12.6,0.4-16-0.4c-4.4-1.1-6.1-3.7-6.5-9.1c-0.5-6.9,4.7-13.2,8.6-15.9c11.7-7.9,22.6-8.5,32.1-7.6
C247.6,460.4,251.5,465.1,251.6,471.3z"/>
<path id="XMLID_44_" fill="#FC8172" d="M251.6,471.3c0,1.6-0.2,3.3-0.6,5.1c-2.1,8.6-13.2,15.2-30.1,16.1
c-7.5,0.4-12.6,0.4-16-0.4c-0.4-1-0.7-2.2-0.8-3.7c-0.5-5.9,4.4-11.4,8.2-13.7c11.1-6.8,21.5-7.4,30.5-6.5
C246.8,468.5,249.7,469.6,251.6,471.3z"/>
</g>
<g id="XMLID_19_">
<path id="XMLID_48_" fill="#C7DCF9" d="M264.7,488.7c0,1.1-0.2,2.1-0.5,3.2h-55c-0.3-1-0.5-2.1-0.5-3.2c0-9.6,12.5-17.4,28-17.4
C252.2,471.3,264.7,479.1,264.7,488.7z"/>
<path id="XMLID_254_" opacity="0.55" fill="#C7DCF9" d="M263.5,490.2c0,0.6-0.1,1.1-0.4,1.7h-50.3c-0.3-0.6-0.4-1.1-0.4-1.7
c0-5.1,11.4-9.3,25.5-9.3C252.1,480.9,263.5,485.1,263.5,490.2z"/>
</g>
<g id="XMLID_37_">
<path id="XMLID_28_" fill="#FEA691" d="M252.6,456.6c3.6,0.4,6.1,2.7,7.5,7.5c1.4,4.8,1.7,11.9,0.2,14.4
c-1.5,2.5-4.3,3.6-7.4,1.1c-3.1-2.5-4.8-9.5-5.8-13C245.9,462,244.5,455.8,252.6,456.6z"/>
<g id="XMLID_4_">
<path id="XMLID_38_" fill="#FEA691" d="M239.2,454.3c3.9,0.4,5.5,3.7,7,8.7c1.5,5,1.8,12.6,0.2,15.3c-1.6,2.6-4.6,3.8-7.9,1.2
c-3.3-2.6-5.2-10.1-6.2-13.8C231,460.8,230.4,453.5,239.2,454.3z"/>
<path id="XMLID_79_" fill="#FF8D76" d="M243.1,480.8c-1.4,0.3-3,0-4.6-1.4c-3.3-2.6-5.1-10.1-6.2-13.8c-1.1-4-1.7-9.7,3-11.1
c-0.9,2.7-0.4,6.4,0.3,9.2c1,4.3,2.9,13,6.2,16C242.3,480.2,242.7,480.6,243.1,480.8z"/>
</g>
<path id="XMLID_39_" fill="#FEA691" d="M224.6,456.6c3.9,0.4,6.5,2.9,8,7.9s1.8,12.6,0.2,15.3c-1.6,2.6-4.6,3.8-7.9,1.2
c-3.3-2.6-5.2-10.1-6.2-13.8C217.4,462.3,215.9,455.7,224.6,456.6z"/>
<path id="XMLID_81_" fill="#FF8D76" d="M228.5,482.4c-1.1,0-2.3-0.5-3.5-1.5c-3.3-2.6-5.1-10.1-6.2-13.8
c-1-3.8-2.2-8.6,1.5-10.2c-0.3,2.5,0.4,5.7,1.1,8.3c1.2,4.5,3.3,13.7,7,17C228.4,482.4,228.4,482.4,228.5,482.4z"/>
<path id="XMLID_40_" fill="#FEA691" d="M211.5,459.4c3.4-1,6,2.7,7.3,7.3c1.3,4.6,1.7,11.6,0.2,14c-1.4,2.4-4.2,3.5-7.2,1.1
c-3-2.4-3.8-7-4.7-10.4C205.9,467,204.9,461.4,211.5,459.4z"/>
<path id="XMLID_82_" fill="#FF8D76" d="M215.2,483.2c-1.1,0-2.2-0.4-3.4-1.4c-3-2.4-3.8-7-4.7-10.4c-1.1-3.8-1.9-8.5,2.1-11
c-0.3,2.7,0.2,5.6,0.7,8.2c0.9,4.6,1.6,10.9,5,14.3C215,483,215.1,483.1,215.2,483.2z"/>
<path id="XMLID_78_" fill="#FF8D76" d="M256.8,480.9c-1.2,0.1-2.5-0.3-3.8-1.4c-3.1-2.5-4.8-9.5-5.8-13c-1-3.7-2.2-8.5,1.8-9.7
c0,2.2,0.5,4.7,1,6.9c1,4.5,2.9,13.5,6.1,16.7C256.4,480.6,256.6,480.8,256.8,480.9z"/>
</g>
</g>
</g>
</g>
<g id="HEAD">
<g id="XMLID_89_">
<path id="XMLID_6_" fill="#FF8D76"
d="M208.8,235c0,0,9.3-3.8,15.6,8.8c6.3,12.7-0.5,20.8-0.5,20.8S217.7,246.3,208.8,235z"/>
<path id="XMLID_173_" fill="#FEA691" d="M215.2,350.9c-8.8,4.1-14.9-1.6-14.9-1.6l-5.5-11.9l-9.9-21.4c14.9-3.2,27.9-5.7,27.9-5.7
l2.3,9.5l4.3,17.7C219.2,337.6,224,346.9,215.2,350.9z"/>
<path id="XMLID_171_" fill="#FF8D76" d="M215,319.9c-1.3,1.9-2.7,3.9-4.4,5.8c-4.3,5.1-10.5,9-15.9,11.7l-9.9-21.4
c14.9-3.2,27.9-5.7,27.9-5.7L215,319.9z"/>
<ellipse id="XMLID_3_" transform="matrix(0.8545 -0.5194 0.5194 0.8545 -114.0092 131.008)"
fill="#FEA691" cx="176.9" cy="269" rx="47.2" ry="57.7"/>
<path id="XMLID_12_" fill="#FF8D76" d="M217.4,308.8c-2.9,3.7-6.5,6.9-10.6,9.5c-22.3,13.5-53.7,2.4-70.3-24.8
c-16.4-26.9-12-59.6,9.7-73.4c-12.6,16.2-13.2,42.2,0.3,64.3c16.5,27.2,48,38.3,70.3,24.8C217,309.1,217.2,309,217.4,308.8z"/>
<path id="XMLID_5_" fill="#283575" d="M157.2,309.5c0,0-17-13.4-21.3-37.4s0.5-33.7,20.2-45.3c19.7-11.5,34.4-7.4,34.4-7.4
s-14-10.5-36.9-6.6c-22.9,3.8-46.2,25.6-41.4,58.4C117.2,306.2,138,316.5,157.2,309.5z"/>
<path id="XMLID_11_" fill="#F76F59" d="M177.8,246.8c-2.7,1.9,1.1,12,9.3,19.5c8.2,7.5,16.1,3.6,16.3-3.8
C203.6,254.9,187.1,240.2,177.8,246.8z"/>
<path id="XMLID_7_" fill="#FF8D76"
d="M137.5,291.4c0,0-16,15.7-1.6,29.4c13.8,13.1,31.2-4.5,31.2-4.5S142.7,303.2,137.5,291.4z"
/>
<path id="XMLID_250_" fill="#F76F59"
d="M139.4,300.5c0,0-9,8.8-0.9,16.6c7.8,7.4,17.6-2.5,17.6-2.5S142.3,307.2,139.4,300.5z"/>
</g>
</g>
<g id="HAIR">
<g id="XMLID_84_">
<path id="XMLID_8_" fill="#283575" d="M188.5,218.1c0,0,1.7-30.2-15.5-42.5c-19.4-13.8-30.3,6.1-23.9,22.4
c2.8,7.3,5.8,11.7,8.2,14.3c2.2,2.4,5.2,3.8,8.4,4L188.5,218.1z"/>
<path id="XMLID_9_" fill="#283575" d="M122.7,192.6c-15.3,12.2-2.1,29.7,4.2,34.4c2.7,2,5.6,3.6,8.1,4.8c3.4,1.6,7.4,1.4,10.6-0.6
l21.6-13.7C167.2,217.6,143,176.5,122.7,192.6z"/>
<path id="XMLID_51_" fill="#3C4E8E"
d="M159,172.3c-4.8,0.6,0.5,9.8,7.5,11S171.3,170.8,159,172.3z"/>
<path id="XMLID_61_" fill="#3C4E8E"
d="M128.7,192.8c-2.8,3.2,4.5,7.3,10.4,5.3C145.1,196.2,134.9,185.8,128.7,192.8z"/>
</g>
</g>
<g id="MOUTH">
<g id="XMLID_83_">
<path id="XMLID_177_" fill="#F76F59" d="M217.7,285c-0.5,1-1.2,1.9-2.2,2.7c-3.7,2.9-6.5,7.1-8.5,11.5c-1.8,3.9-6.4,8.5-10.7,5.2
c-0.5-0.4-1-0.8-1.4-1.4c-4.5-5.7-2.8-20.4,4.2-26.9c5.4-5,12.1-3.7,15.5-0.9C217.9,277.7,219.3,281.7,217.7,285z"/>
<path id="XMLID_175_" fill="#FF6EA9" d="M217.7,285c-0.5,1-1.2,1.9-2.2,2.7c-3.7,2.9-6.5,7.1-8.5,11.5c-1.8,3.9-6.4,8.5-10.7,5.2
c0-6.3,2.3-13.7,6.7-17.7C208.1,282.1,214.1,282.7,217.7,285z"/>
</g>
</g>
<g id="EYE_1">
<g id="XMLID_14_">
<path id="XMLID_86_" fill="#1C3177" d="M155.8,267.7c-3.2,0-5.7-1-5.9-1.1c-1.3-0.5-1.9-2-1.4-3.3c0.5-1.3,2-1.9,3.3-1.4
c0.1,0,5.6,2.2,8.6-1.1c3.9-4.1-0.2-9.4-0.3-9.6c-0.9-1.1-0.7-2.7,0.4-3.6c1.1-0.9,2.7-0.7,3.6,0.4c2.4,3.1,5.5,10.4,0,16.2
C161.6,266.9,158.5,267.7,155.8,267.7z"/>
</g>
</g>
<g id="EYE_2">
<g id="XMLID_15_">
<path id="XMLID_85_" fill="#1C3177" d="M193,242.6c-5.1,0-9.4-3.8-9.7-4c-1.1-0.9-1.1-2.6-0.2-3.6c0.9-1,2.5-1.1,3.6-0.2
c0,0,4.6,3.9,8,2.4c1.5-0.7,0.4-3.8,0.3-3.9c-0.5-1.3,0.1-2.8,1.5-3.3c1.3-0.5,2.8,0.1,3.3,1.4c1.5,3.7,1.1,8.6-3,10.4
C195.5,242.4,194.2,242.6,193,242.6z"/>
</g>
</g>
<g id="EYEBROW_1">
<g id="XMLID_1_">
<path id="XMLID_88_" fill="#1C3177" d="M142.4,261.7c-0.1,0-0.2,0-0.3,0c-1.4-0.2-2.4-1.4-2.3-2.8c0-0.3,0.7-6.3,4.9-12.4
c4.1-6.1,8.3-8.2,8.5-8.3c1.3-0.6,2.8-0.1,3.4,1.2c0.6,1.3,0.1,2.8-1.2,3.4c0,0-3.2,1.7-6.5,6.5c-3.4,5-4,10-4,10.1
C144.8,260.7,143.7,261.7,142.4,261.7z"/>
</g>
</g>
<g id="EYEBROW_2">
<g id="XMLID_13_">
<path id="XMLID_87_" fill="#1C3177" d="M179,232.1c-0.7,0-1.5-0.3-2-0.9c-0.9-1.1-0.7-2.7,0.4-3.6c0.3-0.2,2.6-2.1,6.7-3.3
c4.1-1.2,7.5-1.1,7.6-1.1c1.4,0,2.5,1.2,2.5,2.6c0,1.4-1.3,2.5-2.6,2.5c0,0-2.7-0.1-6,0.9c-3.2,1-5,2.4-5,2.4
C180.1,231.9,179.6,232.1,179,232.1z"/>
</g>
</g>
<g id="TABLE">
<g id="XMLID_248_">
<path id="XMLID_22_" fill="#99ADF9" d="M505.9,506.3H98.3c-4,0-7.2-3.2-7.2-7.2l0,0c0-4,3.2-7.2,7.2-7.2h407.6
c4,0,7.2,3.2,7.2,7.2l0,0C513.1,503,509.9,506.3,505.9,506.3z"/>
<path id="XMLID_198_" fill="#789FEF" d="M505.2,506.3H157.1c-4,0-7.2-3.2-7.2-7.2l0,0c0-4,3.2-7.2,7.2-7.2h348.1
c4,0,7.2,3.2,7.2,7.2l0,0C512.5,503,509.2,506.3,505.2,506.3z"/>
</g>
</g>
<g id="DESKTOP">
<g id="XMLID_186_">
<g id="XMLID_182_">
<path id="XMLID_25_" fill="#E1ECFF" d="M457.6,444.7h-186c-3.3,0-5.9-3-5.3-6.3l19.8-118.7c0.4-2.6,2.7-4.5,5.3-4.5h186
c3.3,0,5.9,3,5.3,6.3L463,440.2C462.5,442.8,460.3,444.7,457.6,444.7z"/>
<path id="XMLID_29_" fill="#C7DCF9" d="M461.6,444.7H278c-3.3,0-5.9-3-5.3-6.3l19.8-118.7c0.4-2.6,2.7-4.5,5.3-4.5h183.6
c3.3,0,5.9,3,5.3,6.3l-19.8,118.7C466.5,442.8,464.2,444.7,461.6,444.7z"/>
<path id="XMLID_31_" fill="#B7D4F7" d="M442.2,432H302c-2.6,0-4.5-2.3-4.1-4.8l15.1-90.6c0.3-2,2.1-3.5,4.1-3.5h140.1
c2.6,0,4.5,2.3,4.1,4.8l-15.1,90.6C445.9,430.5,444.2,432,442.2,432z"/>
</g>
<g id="XMLID_183_">
<path id="XMLID_24_" fill="#E1ECFF" d="M382.3,484.5h-25.5c-2.4,0-4.2-2-4-4.4l6.7-66.5c0.2-2,1.9-3.6,4-3.6H389
c2.4,0,4.2,2,4,4.4l-6.7,66.5C386.1,483,384.4,484.5,382.3,484.5z"/>
<path id="XMLID_26_" fill="#C7DCF9" d="M384.1,484.5h-23.4c-1.5,0-2.7-1.3-2.6-2.8l7-69.4c0.1-1.3,1.2-2.3,2.6-2.3h23.4
c1.5,0,2.7,1.3,2.6,2.8l-7,69.4C386.5,483.5,385.4,484.5,384.1,484.5z"/>
</g>
<g id="XMLID_185_">
<path id="XMLID_27_" fill="#E1ECFF" d="M424.7,491.8H318.5c-2.2,0-4-1.8-4-4V479c0-2.2,1.8-4,4-4h106.2c2.2,0,4,1.8,4,4v8.8
C428.7,490,426.9,491.8,424.7,491.8z"/>
<path id="XMLID_30_" fill="#C7DCF9" d="M426.9,491.8H327c-2.3,0-4.2-1.9-4.2-4.2v-8.4c0-2.3,1.9-4.2,4.2-4.2h99.9
c2.3,0,4.2,1.9,4.2,4.2v8.4C431,489.9,429.2,491.8,426.9,491.8z"/>
</g>
</g>
</g>
<g id="SIGN">
<g id="XMLID_21_">
<path id="XMLID_77_" fill="#FF97C9" d="M501.5,298.7c-1,0.7-2.3,1.2-3.7,1.2H402c-4.8,0-7.8-5-5.6-9.3l34.8-66.9l12.8-24.6
c2.4-4.5,8.8-4.5,11.2,0l48.2,91.5C505,293.6,503.9,297,501.5,298.7z"/>
<path id="XMLID_74_" fill="#FC72BB" d="M501.5,298.7c-1,0.7-2.3,1.2-3.7,1.2H402c-4.8,0-7.8-5-5.6-9.3l34.8-66.9L420.6,280
c-0.9,4.8,2.4,9.3,7.3,9.9L501.5,298.7z"/>
<g id="XMLID_32_">
<g id="XMLID_34_">
<path id="XMLID_35_" fill="#FFFFFF" d="M445.2,264.1l-5-35.8c-0.2-1.2,0.8-2.3,2-2.3h14.2c1.2,0,2.1,1.1,2,2.3l-5,35.8
c-0.1,1-1,1.7-2,1.7h-4.3C446.1,265.9,445.3,265.1,445.2,264.1z"/>
</g>
<circle id="XMLID_33_" fill="#FFFFFF" cx="449.3" cy="279.1" r="7.1"/>
</g>
</g>
</g>
<g id="STAR">
<path id="XMLID_195_" fill="#FEC272" d="M189.7,141.2l1.8,3.7c0.2,0.5,0.7,0.8,1.2,0.8l4,0.6c1.3,0.2,1.8,1.7,0.8,2.6l-2.9,2.8
c-0.4,0.4-0.5,0.9-0.4,1.4l0.7,4c0.2,1.2-1.1,2.2-2.2,1.6l-3.6-1.9c-0.4-0.2-1-0.2-1.4,0l-3.6,1.9c-1.1,0.6-2.4-0.4-2.2-1.6l0.7-4
c0.1-0.5-0.1-1-0.4-1.4l-2.9-2.8c-0.9-0.9-0.4-2.4,0.8-2.6l4-0.6c0.5-0.1,0.9-0.4,1.2-0.8l1.8-3.7
C187.5,140.1,189.1,140.1,189.7,141.2"/>
</g>
<g id="BUBBLE_1">
<path id="XMLID_23_" fill="#F0F6FF" d="M384.3,170.2c0,13.8-4,26.6-10.9,37.5c0,0,0,0,0,0c-2.5,5.8-15.1,30.3-57.9,49.9
c-44.9,20.6-84.7,5.9-84.7,5.9s24.5-16.1,19.9-43c-3.6-21.2-6.1-36.4-5.9-49.2c0-0.4,0-0.7,0-1.1c0-38.5,31.2-69.7,69.7-69.7
S384.3,131.7,384.3,170.2z"/>
</g>
<g id="BUBBLE_2">
<path id="XMLID_187_" fill="#C7DCF9" d="M238.1,216.5c-3.7-9.5-7.4-9.1-9.9-7.3c-2.3,1.7-2.8,7.6,0,13.2s5.6,5.2,8.4,3.7
S239.8,220.9,238.1,216.5z"/>
</g>
<g id="BUBBLE_3">
<path id="XMLID_249_" fill="#C7DCF9" d="M361.6,237.5c-15.4,8.2-14,14.5-10.4,18.3c3.4,3.6,13.5,3.2,22.4-2.6s7.8-10.5,4.7-15
C375.2,233.7,368.7,233.6,361.6,237.5z"/>
</g>
<g id="Layer_23">
<g id="XMLID_75_">
<g id="XMLID_73_">
<path id="XMLID_274_" fill="#99ADF9" d="M364.6,191.8c0,3.8-1.8,7.6-5.2,9.9c-7.4,5.2-19.2,12.9-32.2,19.7
c-8.3,4.4-15.5,7.8-21.3,10.3c-4.8,2.1-10.1,1.7-14.4-0.7c-2.9-1.6-5.3-4.1-6.8-7.3c-1-2.2-1.6-4.6-1.6-7c0-2,0.4-4,1.1-6
l0.4-1.1l17.2-43.6l-23,12.4c-6.4,3.4-14.3,1.2-18-5.1c-0.1-0.2-0.2-0.4-0.3-0.6c-1-2-1.5-4.1-1.5-6.2c0-4.4,2.2-8.8,6.2-11.3
c7.3-4.7,17.9-11.1,30.5-17.8c24.2-12.9,36.2-11.3,39.6-4.8c3.4,6.6-16.1,61.8-16.1,61.8s26.1-13.1,28.9-14.1
c6-2.3,12.7,0.5,15.4,6.3c0.6,1.3,0.9,2.7,1,4.1C364.6,191.2,364.6,191.5,364.6,191.8z"/>
<path id="XMLID_267_" fill="#7D9AF9" d="M309.1,158.8c-5.8,14.3-19.5,47.2-24.3,50.9l17.2-43.6l-23,12.4
c-6.4,3.5-14.5,1.2-18.1-5.2c0.2-0.2,0,0,0.2-0.2c2.3,1.1,6.4,2.1,12.5-0.9c11.4-5.4,24.4-12.5,31.9-16.6
C307.6,154.5,310,156.6,309.1,158.8z"/>
<path id="XMLID_264_" fill="#7D9AF9" d="M364.6,191.8c0,3.8-1.8,7.6-5.2,9.9c-7.4,5.2-19.2,12.9-32.2,19.7
c-8.3,4.4-15.5,7.8-21.3,10.3c-4.8,2.1-10.1,1.7-14.4-0.7c0.9-0.2,1.8-0.4,2.6-0.7c4.5-1.5,24.8-12.2,44.7-22.9
c13-7,21.8-12.6,25.7-16.4C364.6,191.2,364.6,191.5,364.6,191.8z"/>
</g>
<path id="XMLID_76_" opacity="0.49" fill="#FFFFFF" d="M314.2,131.6c-9,3-13.6,8.6-2.8,8s16.5-6.1,14.6-7.9
C324.1,130,318.3,130.2,314.2,131.6z"/>
<path id="XMLID_80_" opacity="0.49" fill="#FFFFFF" d="M348.7,182.6c-5.7,1.9-8.7,5.5-1.8,5.1c6.9-0.4,10.5-3.9,9.3-5
C354.9,181.6,351.3,181.7,348.7,182.6z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

+156
View File
@@ -0,0 +1,156 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 300">
<defs>
<linearGradient id="linear-gradient" x1="274.42" y1="197.65" x2="291.62" y2="184.57"
gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#acf4e6"/>
<stop offset="1" stop-color="#8ecdc6"/>
</linearGradient>
<linearGradient id="linear-gradient-2" x1="145.65" y1="256.8" x2="185.96" y2="233.19"
xlink:href="#linear-gradient"/>
<linearGradient id="linear-gradient-3" x1="122.66" y1="227.34" x2="157.79" y2="200.62"
xlink:href="#linear-gradient"/>
</defs>
<title>-</title>
<path
d="M235.66,90.93l131,75.5a5.32,5.32,0,0,1,0,9.22L181.85,281.74a14.88,14.88,0,0,1-14.52.16L39.89,212.48a5.32,5.32,0,0,1-.12-9.28L237.46,88.8"
fill="#acf4e6"/>
<path d="M295.47,182.17l-42.59,15.21s-3.77,7.15,17.65,19.88l34.09-31.44"
fill="url(#linear-gradient)"/>
<polyline points="200.92 213.28 123.74 254.5 150.57 269.05 223.99 223.1"
fill="url(#linear-gradient-2)"/>
<path d="M157.86,190.2l-80.61,44s14,1.49,35.44,14.21l74.06-42" fill="url(#linear-gradient-3)"/>
<path
d="M188.52,173.18l29.85,11.2s1.25.81.45,2.75c-.46,1.11-2.93,2.71-2.93,2.71l-25.77,15a14.86,14.86,0,0,1-4.44,1.2c-2.06.12-5.51-1.55-5.51-1.55l-24-13.9Z"
fill="#34323d"/>
<path
d="M188.94,171.79l28.52,11.66s2,1.09,1.47,2.57a6.16,6.16,0,0,1-2.55,2.59l-25.84,14.85a14.86,14.86,0,0,1-4.44,1.2c-2.06.12-5.51-1.55-5.51-1.55L157.86,190.2Z"
fill="#435950"/>
<path
d="M121.49,211a2.75,2.75,0,0,1-3.19-.77s-.56-.11-.56-2.56V94a7,7,0,0,1,2.49-5.14,82.23,82.23,0,0,1,8.7-5.32L255.28,10.61l1.42-.72a2.23,2.23,0,0,1,2.82.72,4.54,4.54,0,0,1,.62,2.07c.05,1.19,0,12.68,0,12.68v102.3a7.07,7.07,0,0,1-2.3,5.22Z"
fill="#334c42"/>
<path
d="M120.06,193.82V95.71c0-3.26.45-5.08,3-6.44L256.31,12.07a1.76,1.76,0,0,1,2.81,1.42l-.33,100.88Z"
fill="#9a6cff"/>
<path
d="M148.83,243.59a11.19,11.19,0,0,0,4.29,2.59c2.81,1,12.11,4.64,12.11,4.64s6.58,2.69,8.28,2.28-19.37-9.51-19.37-9.51Z"
fill="#34323d"/>
<path
d="M170.2,252.19a11.53,11.53,0,0,0,1.65.64,8.07,8.07,0,0,0,5.81-.66c4.22-2.14,4.67-4.87,3.73-7.11s-11.93-7.26-16.75-8a19.27,19.27,0,0,0-8.82.77,17.31,17.31,0,0,0-4.28,2.06c-.88.6-3.64,2.25-2.72,3.65a1.52,1.52,0,0,0,.91.51c3.6,1,7.19,2.13,10.7,3.45,2,.76,4,1.64,5.92,2.6C167.63,250.78,168.89,251.58,170.2,252.19Z"
fill="#334c42"/>
<path
d="M171,230.67,171,232.8s0,.33.81.71,20,8,20,8a1.87,1.87,0,0,0,1.63,0c.81-.43,77-44.46,77-44.46s.37-.23.09-1.16l-1.19-.47"
fill="#2f2e36"/>
<path
d="M171.54,230.12s-.75.36-.44.75,7.32,3.64,7.32,3.64l13.23,6a1.83,1.83,0,0,0,1.6.19c.86-.33,77-44.24,77-44.24a.62.62,0,0,0,.17-.58s0-.18-.38-.35-19.92-9.58-19.92-9.58a1.78,1.78,0,0,0-1.37-.07C248.19,186.18,171.54,230.12,171.54,230.12Z"
fill="#334c42"/>
<path
d="M77.25,95.06v30.57a4.3,4.3,0,0,0,6.36,3.78L124.73,107a4.3,4.3,0,0,0,2.24-3.78V71.32a4.3,4.3,0,0,0-6.45-3.73L79.4,91.34A4.3,4.3,0,0,0,77.25,95.06Z"
fill="#68e1fd"/>
<polyline points="126.97 95.36 126.97 116 118.19 108.1" fill="#68e1fd"/>
<ellipse cx="245.61" cy="35.65" rx="5.79" ry="5.07"
transform="translate(114.94 246.64) rotate(-66.49)" fill="#ffe427"/>
<polygon points="144.55 124.91 144.55 161.71 152.18 157.25 152.25 120.46 144.55 124.91"
fill="#ffe427"/>
<polygon points="157.37 111.32 157.23 154.57 165.23 149.93 165.23 106.88 157.37 111.32"
fill="#ffe427"/>
<polygon points="170.28 99.62 170.15 147.35 177.28 143.21 177.28 95.36 170.28 99.62"
fill="#ffe427"/>
<ellipse cx="245.61" cy="50.86" rx="5.79" ry="5.07"
transform="translate(101 255.79) rotate(-66.49)" fill="#ffe427"/>
<ellipse cx="245.61" cy="65.58" rx="5.79" ry="5.07"
transform="translate(54.5 233.22) rotate(-56.21)" fill="#ffe427"/>
<path
d="M206.43,117.45a17.49,17.49,0,0,1-5.31-.82c-6.07-1.93-10.63-7-12.85-14.18a37.46,37.46,0,0,1,.56-22c5.23-16.47,18.81-26.36,30.93-22.51S237.27,77.65,232,94.12h0a37.46,37.46,0,0,1-12.26,18.33A22,22,0,0,1,206.43,117.45Zm8.05-51.63c-6.66,0-14.13,7.18-17.32,17.22a28.69,28.69,0,0,0-.53,16.84c1.35,4.39,3.88,7.38,7.14,8.41s7,.05,10.68-2.76a28.68,28.68,0,0,0,9.27-14.06c3.62-11.4.59-23-6.6-25.25A8.68,8.68,0,0,0,214.48,65.82Z"
fill="#68e1fd"/>
<path
d="M145.22,166.22v0a1.76,1.76,0,0,0,2.63,1.52l32.78-18.72a1.76,1.76,0,0,0,.88-1.52h0a1.76,1.76,0,0,0-2.62-1.53L146.11,164.7A1.76,1.76,0,0,0,145.22,166.22Z"
fill="#ffe427"/>
<path
d="M138.08,94.39v13.27a1.86,1.86,0,0,0,2.79,1.61l36.08-20.84a1.86,1.86,0,0,0,.93-1.61V73.56a1.86,1.86,0,0,0-2.79-1.61L139,92.77A1.86,1.86,0,0,0,138.08,94.39Z"
fill="#ffe427"/>
<ellipse cx="146.15" cy="97.72" rx="5.88" ry="4.7"
transform="translate(8.8 207.47) rotate(-72.39)" fill="#fff"/>
<path d="M152.63,90.85,173.72,79a.75.75,0,0,0-.76-1.3L151.87,89.55a.75.75,0,0,0,.76,1.3Z"
fill="#7f47dd"/>
<path d="M153.42,96l13.11-7.34a.75.75,0,0,0-.76-1.3l-13.11,7.34a.75.75,0,0,0,.76,1.3Z"
fill="#7f47dd"/>
<polygon points="222.68 100.54 231.34 94.97 226.13 80.1 217.29 85.65 221.63 97.16 222.68 100.54"
fill="#ffe427"/>
<path
d="M224.1,101.89l-.56-2.49a4.32,4.32,0,0,0-1.11-4.76,11.42,11.42,0,0,0,.65-3.26.47.47,0,0,0-.18-.41.56.56,0,0,0-1,.08c-.25.78-.46,1.57-.66,2.37a14.28,14.28,0,0,0-.51,1.8c-.13-.52-.27-1-.42-1.55v0a.5.5,0,0,0-.07-.19l-.13-.42q-.35-1.43-.83-2.82l0-.06a.4.4,0,0,0-.18-.21,46.72,46.72,0,0,0,.82,8.38,26.74,26.74,0,0,0,1.35,3.31.47.47,0,0,0,.17.18c.1.31.2.61.33.91l0,.06.08.28a.55.55,0,0,0,1,0c.37.24,1,0,.84-.48A.54.54,0,0,0,224.1,101.89Z"
fill="#fcbf81"/>
<path
d="M237.59,87.61c.28-.17-3.43-3.1-3.75-3.38a69.23,69.23,0,0,1-5.31-5.32.47.47,0,0,0-.2-.13,11.82,11.82,0,0,0-1-1,.56.56,0,0,0-.93.54,6.52,6.52,0,0,0,1.85,3.29c-.18.36-.38.76-.53,1.16a.23.23,0,0,1,.15.22,1.69,1.69,0,0,1-.13.57,1.21,1.21,0,0,1-.16.36.27.27,0,0,1-.13.1,1.75,1.75,0,0,0,.75,1.32,2.23,2.23,0,0,0,.33,1.57l.06.05.09,0a16.32,16.32,0,0,1,2.28.78.25.25,0,0,1,0,.41,14.62,14.62,0,0,0,1.75.19.47.47,0,0,0,.36-.12l.26.14a.57.57,0,0,0,.84-.48.65.65,0,0,0,0-.2l.25.16a.64.64,0,0,0,.78.62.65.65,0,0,0,.55-.69.76.76,0,0,0-.06-.25l.59.51a.15.15,0,0,0,.26-.12.13.13,0,0,0,0-.07,8.71,8.71,0,0,1,.88,1C241.32,92.16,237.7,87.73,237.59,87.61Zm-2.41.56a.35.35,0,0,1-.42-.22.58.58,0,0,0,.43-.22h0a.15.15,0,0,0,.21-.08l0,0A.35.35,0,0,1,235.18,88.16Z"
fill="#fcbf81"/>
<path
d="M236.84,87.72a6.07,6.07,0,0,1-1.91-1.23,1.17,1.17,0,0,0-1.68,0,6.84,6.84,0,0,1-.32-.88,1.23,1.23,0,0,0-2.37.65,6,6,0,0,0,1.87,3.12,10,10,0,0,0,3.22,1.54,1.26,1.26,0,0,0,1.54-1.42l.08-.11A1.24,1.24,0,0,0,236.84,87.72Z"
fill="#fcbf81"/>
<path
d="M233.39,89.4a4.31,4.31,0,0,1-3.12-4.09.14.14,0,0,0,0-.11l0,0L229,84c-.18-.18-.37-.35-.53-.54s-.89-1.72.33-1.41c.37.09,1,.8,1.33,1.06s.84.72,1.25,1.09c.15.13.36-.08.22-.22q-1.13-1-2.34-2c-.38-.29-.76-.6-1.2-.22a1,1,0,0,0-.26,1.16c-.09.4-.4.78-.34,1.21a2.1,2.1,0,0,0,.69,1.07l.19.19a.15.15,0,0,0,0,.08c0,.5-.21,1.09.26,1.43a2.29,2.29,0,0,0,.65.28l1.12.37a.14.14,0,0,0,.18-.1,5,5,0,0,0,2.8,2.23C233.5,89.76,233.58,89.46,233.39,89.4Zm-5.31-4.72a.93.93,0,0,1-.23-1c0-.12.09-.24.14-.35a11.66,11.66,0,0,0,2,2s0,.07,0,.1a.14.14,0,0,0-.16,0C229.27,86,228.41,85.08,228.08,84.68Zm1,2.14a.64.64,0,0,1-.5-.56,3.38,3.38,0,0,1,0-.64c.43.32,1,.53,1.39.14a4.29,4.29,0,0,0,.43,1.52C230,87.12,229.5,87,229.06,86.82Z"
fill="#34323d"/>
<path
d="M250.61,97.15c-.43-.78-15.69-11.42-16.57-12.68a8.31,8.31,0,0,0-1.23,9.29s8.22,11,12.8,12.23"
fill="#22b68e"/>
<path
d="M219.22,104.51s2.35-4.27,6.77-5.34c0,0,4.55,10.47,7.82,9.62s3.63-9.82,11.09-12,2.08,24-7.64,24.12S221.88,113.56,219.22,104.51Z"
fill="#22b68e"/>
<path
d="M248.13,197.24l-3.48,1.57a2,2,0,0,1-1.34,1.44.8.8,0,0,1-.48.32,9.42,9.42,0,0,1-4.31-.35c-1.76-.4-8.66-2.43-6.42,2.24,1.29.76,2.72,1.39,4,2.05.74.37,1.48.74,2.23,1.08a4.25,4.25,0,0,0,1.3.48c1,.07,3.25-.84,3.33-.6s.44,2.07.44,2.07,6.29,1.84,6.22-2.27C249.65,204.73,248.13,197.24,248.13,197.24Z"
fill="#e55600"/>
<path
d="M251.29,191.4s-6.25-2.2-7.71-2.19-3.85.7-1.51,3.2c0,0,6.68,3.64,7.53,3.7s2.83-.73,2.9-.52.39,1.8.39,1.8,5.47,1.6,5.41-2c0-.47-1.33-7-1.33-7"
fill="#e55600"/>
<path
d="M250.22,160.17c-.22-12.11-.78-24.27.81-36.32-.14-3.09,2-1.28,1.78-2.49-1.88-9.83-15.38,3.13-15.38,3.13-.55.52-.37,3.57-.43,4.27q-.52,5.79-.76,11.6c-.83,19.55,1.6,38.74,4.13,58.08,3.32,2.89,5.4,3.66,10.19,1.24,0-12.79-.12-25.58-.33-38.36Q250.23,160.74,250.22,160.17Z"
fill="#ffe427"/>
<path
d="M258.24,181.49c-.31-4.81-.9-9.61-1.31-14.37-.63-7.3-.45-14.61-.54-21.92-.91-9.06-1.83-20.58-1.83-20.58l-7.5,2.09s-4.87,63.16,2.61,65.84,8.63-2.19,8.63-2.19S258.29,186.65,258.24,181.49Z"
fill="#ffe427"/>
<path
d="M255.17,124.19a20.15,20.15,0,0,0-.48-3.77,44.91,44.91,0,0,1,0-12.1c.46-3.88.49-7.89-1.9-11.2-3.45-2-8.25-.21-11.16,1.93-3.93,2.9-5.25,22.59-5.2,28.68,0,.86,5.22,1.3,5.8,1.34a24.53,24.53,0,0,0,8.08-.6c1.88-.51,4.22-1.44,4.75-3.54A3.92,3.92,0,0,0,255.17,124.19Z"
fill="#22b68e"/>
<path
d="M250.3,129.87a.55.55,0,0,0-1,.34c3.56,10.9-2.34,22.17-1.2,33.28.6,5.85,1.64,11.62,2,17.51a140.44,140.44,0,0,1-.19,18.77c-.05.7,1,.64,1.09-.05a140.44,140.44,0,0,0,.19-18.77c-.36-6.21-1.57-12.3-2.07-18.48C248.18,151.54,253.82,140.65,250.3,129.87Z"
fill="#34323d"/>
<path
d="M243.44,112.82a9.22,9.22,0,0,1-6.78,8.1c0,.37-.12,2.67-.15,3,4.36-1,7.57-6.51,8-11.14C244.6,112.12,243.51,112.12,243.44,112.82Z"
fill="#06825e"/>
<path d="M246.07,86c-.33.07-3.32,6.26-2.4,10.13s7.58.2,9.33-2.65S252.28,84.63,246.07,86Z"
fill="#fcbf81"/>
<path
d="M246.12,86.85a3,3,0,0,0,1.71,2.83c1.8.74,3.29,1.26,3.15,2.1s-3.29-.25-3.37,1.67a14.37,14.37,0,0,0,.36,3.86c.16,1,5.74-1.72,7.74-6.58s-2.45-6.35-2.67-6.4a4.58,4.58,0,0,0-2.76-2c-2.19-.57-2.85.26-2.85.26a2.68,2.68,0,0,0-3.24.22,3.41,3.41,0,0,0,.55,5.8Z"
fill="#34323d"/>
<path
d="M283.55,135.38a8.38,8.38,0,0,1,4.08.8,6.63,6.63,0,0,1,2.88,3.28c.63,1.32.9,3.2,2.21,4a3.83,3.83,0,0,1,1.29,1.12,3.36,3.36,0,0,1,.4,3.13c-.58,1.16-3,1.87-4.09,1.66"
fill="#8fdb5e"/>
<path
d="M282.48,135.52a7.87,7.87,0,0,0-6.95,6,10.39,10.39,0,0,0-.05,4.91c.31,1.3,1.08,3.56,2.67,3.66,2.15.13,2.84-1.88,3.52-3.53s1.39-3.47,3.11-4.12a4.63,4.63,0,0,1,5,1.12Z"
fill="#1e8c0e"/>
<path
d="M292.31,144.25c-1.3-1.68-2.38-3.51-3.63-5.22a15.55,15.55,0,0,0-2.52-3c-3-1.45-6.75-.12-9,2.42.3.09.72.11,1,.19a8.51,8.51,0,0,1,3.42,2.42c1.32,1.46,2.35,3.25,3.52,4.81,1.9,2.52,4.42,4.6,7.67,3.09C294.85,147.95,293.22,145.43,292.31,144.25Z"
fill="#8fdb5e"/>
<path d="M302.85,122.64s6.73-.53,6.6,10.12-10.18,3.64-8-2.77" fill="#1e8c0e"/>
<path
d="M301.88,133.12c-.07-3.24,3.57-5.6,6.64-6a6.22,6.22,0,0,0-6.09-4.76c-4.61.12-8.06,4.8-8.84,10.32a10.56,10.56,0,0,0,3.39,9l2.22,1.9C303.3,142,301.78,136.07,301.88,133.12Z"
fill="#8fdb5e"/>
<path
d="M320.21,140.73a14.06,14.06,0,0,0-1.56-5.78,6.37,6.37,0,0,0-4.38-3.39l-3.79,7.3s5.65-9.88,3.34-2.27,5.3,16.13,6.34,4.79C320.18,141.16,320.19,140.95,320.21,140.73Z"
fill="#1e8c0e"/>
<path
d="M293.43,159.73s-5.06,3.3-3.66,11a42.32,42.32,0,0,0,2.25,7.82c1,2.51,1.7,5.74,4.23,7.16a9,9,0,0,0,8.37.11c2.17-1.33,2.95-4.34,3.74-6.58a40.85,40.85,0,0,0,1.94-8.51C312.7,152.1,293.43,159.73,293.43,159.73Z"
fill="#68e1fd"/>
<ellipse cx="300.25" cy="160.86" rx="7.39" ry="2.67" fill="#34323d"/>
<path
d="M300.85,146.62c-1-2.49-3-4.58-3.57-7.25a9.49,9.49,0,0,1,3.78-9.69c.56-.41,0-1.36-.55-.94-4.72,3.43-5.64,9.29-2.88,14.28a26,26,0,0,1,2.49,4.73c.68,2.22-.08,3.83-1.12,5.5a6.33,6.33,0,0,0-1.64-4.48c-1.23-1.14-3-1.33-4.56-1.84-2.94-1-5.53-2.67-6-6-.11-.69-1.16-.4-1.05.29a7.88,7.88,0,0,0,4.54,5.82,31.64,31.64,0,0,0,4.38,1.52,5.1,5.1,0,0,1,2.89,2.83c.7,1.61.22,2.71-.17,4.27-.51,2-1.32,3.76.07,5.68.41.56,1.36,0,.94-.55-2.21-3.05,1.32-6,2.52-8.58A6.75,6.75,0,0,0,300.85,146.62Z"
fill="#1e8c0e"/>
<path
d="M314.48,139.93c-4.67-.82-7.85,2.79-7.57,7.31a17.14,17.14,0,0,0,.63,3.35,8.76,8.76,0,0,1,.62,2.9,4.41,4.41,0,0,1-2.67,3.12,6.36,6.36,0,0,0-3.94,4.33.55.55,0,0,0,1.05.29c1.08-4,6.6-3.38,6.64-7.74,0-2.13-1.11-4.12-1.24-6.25-.23-3.72,2.2-7,6.19-6.26C314.87,141.1,315.17,140.05,314.48,139.93Z"
fill="#1e8c0e"/>
<path
d="M318.65,135c-1.81-3.34-5.1-4.12-8.32-3.13a10.61,10.61,0,0,0-1.3.63c-8.11,6-2.35,19.57-1.1,19.46,4.13-.34,3.7-2.77,5.09-9.57a6.42,6.42,0,0,1,6.45-5.44A12,12,0,0,0,318.65,135Z"
fill="#8fdb5e"/>
<path
d="M316.87,132.74A6.76,6.76,0,0,0,310,136c-3,5-2.28,10.73-1.89,16.2.05.7,1.14.7,1.09,0-.29-4-.84-7.87.23-11.75.53-1.9,1.16-4,2.68-5.38a5.6,5.6,0,0,1,6.1-.87l-.41-.56C317.46,133.37,317.17,133.06,316.87,132.74Z"
fill="#1e8c0e"/>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

+100
View File
@@ -0,0 +1,100 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
<defs>
<style>
.cls-1,.cls-2,.cls-20,.cls-22,.cls-23,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#2c94ee;}.cls-14{fill:#8cd7ff;}.cls-15{fill:#40a8f5;}.cls-16{fill:#fff;}.cls-17{fill:#ffb056;}.cls-18{fill:#398eed;}.cls-19{fill:#ffeed2;}.cls-20{stroke:#000;stroke-width:0.23px;}.cls-21{fill:#ebfcff;}.cls-22{stroke:#e49056;stroke-width:0.26px;}.cls-23{stroke:#4986d9;stroke-width:0.13px;}
</style>
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#81cfff"/>
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
</linearGradient>
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
</defs>
<title>无访问权限</title>
<g id="图层_2" data-name="图层 2">
<g id="图层_1-2" data-name="图层 1">
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
<g class="cls-8">
<path class="cls-9"
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
<path class="cls-10"
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
<path class="cls-11"
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
<path class="cls-12"
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
</g>
<path class="cls-13"
d="M315.5,74.68a5.32,5.32,0,0,0-3.58-1.38H162.32a6.41,6.41,0,0,0-5.55,3.21h0a3.34,3.34,0,0,1,2.16-.78H310.77a3.42,3.42,0,0,1,3.4,3.4V185.35a3.36,3.36,0,0,1-1.32,2.68,6.93,6.93,0,0,0,4.41-6.46V78.63A5.29,5.29,0,0,0,315.5,74.68Z"/>
<polygon class="cls-14"
points="293.51 81.67 292.41 81.67 292.41 83.34 294.61 83.34 294.61 82.32 294.61 81.67 293.51 81.67"/>
<polygon class="cls-14"
points="295.72 80.65 295.72 82.32 294.61 82.32 294.61 81.67 293.51 81.67 293.51 80.65 295.72 80.65"/>
<path class="cls-14"
d="M307.05,78.94A3.06,3.06,0,1,1,304,82,3.06,3.06,0,0,1,307.05,78.94Zm.71,3.06,1-1-.71-.71-1,1-1-1-.71.71,1,1-1,1,.71.71,1-1,1,1,.71-.71Z"/>
<path class="cls-14"
d="M294.13,78.94A3.06,3.06,0,1,1,291.08,82,3.06,3.06,0,0,1,294.13,78.94Zm1.59,3.38V80.65h-2.21v1h-1.1v1.67h2.2v-1Z"/>
<path class="cls-14"
d="M281.22,78.94A3.06,3.06,0,1,1,278.16,82,3.05,3.05,0,0,1,281.22,78.94Zm1.51,3.56v-1h-3v1Z"/>
<path class="cls-15"
d="M314.17,79.14v8.29H155.53V79.14a3.41,3.41,0,0,1,3.4-3.4H310.77a3.42,3.42,0,0,1,3.4,3.4ZM310.11,82a3.06,3.06,0,1,0-3.06,3A3.06,3.06,0,0,0,310.11,82Zm-12.92,0a3.06,3.06,0,1,0-3.06,3A3.06,3.06,0,0,0,297.19,82Zm-12.92,0a3.06,3.06,0,1,0-3,3A3.05,3.05,0,0,0,284.27,82Z"/>
<path class="cls-14"
d="M238.61,136.26a3.76,3.76,0,0,1-2.33,3.47V146a.37.37,0,0,1-.37.36h-2.12a.36.36,0,0,1-.36-.36v-6.26a3.76,3.76,0,1,1,5.18-3.47Z"/>
<path class="cls-14"
d="M314.17,87.43v97.92a3.42,3.42,0,0,1-3.4,3.4H158.93a3.4,3.4,0,0,1-3.4-3.4V87.43Zm-59,63.87V128a3.55,3.55,0,0,0-3.55-3.55h-1.8v-4.68a14.93,14.93,0,1,0-29.86,0v4.68h-1.8a3.55,3.55,0,0,0-3.55,3.55V151.3a3.56,3.56,0,0,0,3.55,3.56h33.46A3.56,3.56,0,0,0,255.13,151.3Z"/>
<polygon class="cls-15"
points="308.8 80.96 307.76 82 308.8 83.03 308.09 83.74 307.05 82.7 306.02 83.74 305.31 83.03 306.34 82 305.31 80.96 306.02 80.25 307.05 81.29 308.09 80.25 308.8 80.96"/>
<rect class="cls-15" x="279.71" y="81.5" width="3.02" height="1"/>
<path class="cls-16"
d="M251.58,124.4h-1.8v-4.68a14.93,14.93,0,1,0-29.86,0v4.68h-1.8a3.55,3.55,0,0,0-3.55,3.55V151.3a3.56,3.56,0,0,0,3.55,3.56h33.46a3.56,3.56,0,0,0,3.55-3.56V128A3.55,3.55,0,0,0,251.58,124.4Zm-15.3,15.33V146a.37.37,0,0,1-.37.36h-2.12a.36.36,0,0,1-.36-.36v-6.26a3.76,3.76,0,1,1,2.85,0ZM224.9,124.4v-4.68a9.95,9.95,0,0,1,19.9,0v4.68Z"/>
<path class="cls-14" d="M244.8,119.72v4.68H224.9v-4.68a9.95,9.95,0,0,1,19.9,0Z"/>
<path class="cls-15"
d="M295.87,80.5h-2.51v1h-1.1v2h2.5v-1h1.11Zm-1.41,2.69h-1.9V81.81h1.9Zm1.11-1h-.81v-.65h-1.1v-.73h1.91Z"/>
<path d="M203.58,147.25c.06.14.44-.84.44-.84l.09.84.6-.58.26.7.35-.84s.08.15.35.72c.11-.26.8-.22,1.61-.72a3.06,3.06,0,0,0,1-2.59c-.1-.58-.66-1.12-.34-1.48a.67.67,0,0,1,.92-.15c.23.14.49-.17,1.44-.49l.25-.07c1.16-.34,1.06-1.15,1.24-2.29s-1.16-2.56-2.24-3.51a7,7,0,0,0-5.42-1.06c-1.58.49-3.16.9-3.77,4.44a7.67,7.67,0,0,0,1.52,6.37,3.92,3.92,0,0,0,1.18.88A1,1,0,0,1,203.58,147.25Z"/>
<path class="cls-17"
d="M206.25,232.22c-.33-.73-.59-1.63.55-1.13l.1,0,0-5.25a4.21,4.21,0,0,0-.93.73,31.18,31.18,0,0,0-2.71,2.81c0-.21.05-.39.06-.48,0-.33-.46-.71-.89-.18s-2.71.62-4.06.38a2.8,2.8,0,0,1-.48-.12c-1.18-.39-.84.49-.45,1.18s.44,1.67.57,3.61,2.26,2.4,3.85,2.57c1.4.16,2.37-1.3,4.56-3.27A3.14,3.14,0,0,0,206.25,232.22Z"/>
<path class="cls-17"
d="M206.47,233.11a24.12,24.12,0,0,1,0,2.76c-.06,1.95,2,2.59,3.59,2.92s2.77-1.47,5.85-3.56,5.51-6,4.48-7c-.94-.63-3.41-.22-5.32,1.25a31.79,31.79,0,0,0-3,2.54h0c0-.21.09-.38.11-.47.06-.33-.39-.75-.88-.26s-3.24.34-4.44-.12l-.1,0c-1.14-.5-.88.4-.55,1.13A3.14,3.14,0,0,1,206.47,233.11Z"/>
<path class="cls-18"
d="M197.24,182.41l1.23,23.46-.05,23.27c1.35.24,3.67.09,4.06-.38l1.12-21.62,1.08-17a.71.71,0,0,1,.77-.68.8.8,0,0,1,.47.22.72.72,0,0,1,.2.47l1,18.93L207,225.88l0,5.25c1.2.46,4,.59,4.44.12l1.79-23.48.34-23C209.7,185.44,199.19,182.68,197.24,182.41Z"/>
<path class="cls-17"
d="M188.66,150.58l-.34,7.12,7.18.81s.13,18.8-1.51,23c.89.42,15.71,3.89,19.48,3.27a3.78,3.78,0,0,0,1.09-.3c-.29-1.68,1.18-22.4,1.18-22.4s3.08,2.26,4.81,3.58a4.68,4.68,0,0,0,.79-1.43h0a28.57,28.57,0,0,0,1.07-5.74L216.55,153a3.32,3.32,0,0,0-1.75-.88,39.71,39.71,0,0,1-5.66-1.29c-.81,1-6,1.61-7.16-.22Z"/>
<path class="cls-19"
d="M221.35,164.27l2,1.71a1,1,0,0,0,1.46-.22l8.65-13.51s2.82-2.35,2.8-3.82c0-1-1.52-2.37-1.78-2.42s.17-1.35.2-2.8-.49-1.7-1-1.7,0,.48,0,2-1.77,6.11-2.28,7L224,160l-1.58-1.5A28.57,28.57,0,0,1,221.35,164.27Z"/>
<path class="cls-19"
d="M208.26,143.94a3.06,3.06,0,0,1-1,2.59c-.81.5-1.5.46-1.61.72-.27-.57-.35-.72-.35-.72l-.35.84-.26-.7-.6.58-.09-.84s-.38,1-.44.84a1,1,0,0,0-.54-.67c.13,1.4.49,3.77-.49,3.92l-.57.08c1.14,1.83,6.35,1.24,7.16.22a2.47,2.47,0,0,1-1.23-.71c-.63-1.08-.82-3,0-3.46a6.31,6.31,0,0,0,1.85-2.33,4.7,4.7,0,0,0,.2-1.41c0-.53.15-.54.29-1.06h0c-.95.32-1.21.63-1.44.49a.67.67,0,0,0-.92.15C207.6,142.82,208.16,143.36,208.26,143.94Z"/>
<path class="cls-20"
d="M203,146.58a3.92,3.92,0,0,1-1.18-.88,7.67,7.67,0,0,1-1.52-6.37c.61-3.54,2.19-4,3.77-4.44a7,7,0,0,1,5.42,1.06c1.08,1,2.38,2.4,2.24,3.51s-.08,1.95-1.24,2.29l-.25.07c-.95.32-1.21.63-1.44.49a.67.67,0,0,0-.92.15c-.32.36.24.9.34,1.48a3.06,3.06,0,0,1-1,2.59c-.81.5-1.5.46-1.61.72-.27-.57-.35-.72-.35-.72l-.35.84-.26-.7-.6.58-.09-.84s-.38,1-.44.84A1,1,0,0,0,203,146.58Z"/>
<path class="cls-21"
d="M201.91,236.38c-1.21-.13-2.74-.42-3.45-1.42-.05.94,0,.9,1.1,1.43s2.77,1.15,3.81.39a33.66,33.66,0,0,0,3.14-3.06h0c0-.22,0-.42,0-.6C204.28,235.08,203.31,236.54,201.91,236.38Z"/>
<path class="cls-21"
d="M208.69,239a5.08,5.08,0,0,0,3,.08c1.05-.24,3-2.7,4.28-3.43a15.2,15.2,0,0,0,4.39-4.7c1.09-1.81.54-2.25.19-2.48.44,1.36-1.84,4.8-4.67,6.73-3.08,2.09-4.29,3.88-5.85,3.56-1.23-.26-2.78-.71-3.36-1.85C206.42,238.45,207.7,238.67,208.69,239Z"/>
<path class="cls-22" d="M206.9,231.13l-.1,0c-1.14-.5-.88.4-.55,1.13a3.14,3.14,0,0,1,.22.89"/>
<path class="cls-22" d="M212.64,233.14c-.72.2-.64-.59-.53-1.16"/>
<path class="cls-22" d="M203.94,230.52c-.69.27-.69-.52-.63-1.1"/>
<path class="cls-23"
d="M220.58,228.5h0c.35.23.9.67-.19,2.48a15.2,15.2,0,0,1-4.39,4.7c-1.31.73-3.23,3.19-4.28,3.43a5.08,5.08,0,0,1-3-.08c-1-.36-2.27-.58-2-2.09"/>
<path class="cls-23"
d="M198.46,235h0c-.05.94,0,.9,1.1,1.43s2.77,1.15,3.81.39a33.66,33.66,0,0,0,3.14-3.06h0"/>
<path class="cls-19"
d="M202.57,136.72c.21.61.72,2.29-.44,2.73s-2.64,1.42-2.7,1.85-.2,1.06-.67,1.27l-1.31-1.46c.69-1.08,3.37-4.75,3.73-4.77S202.36,136.12,202.57,136.72Z"/>
<path class="cls-19" d="M197.45,141.11l1.31,1.46-7.79,8h-2.31l-4.32.11a2.25,2.25,0,0,0-.74.12Z"/>
<path class="cls-19"
d="M188.66,150.58l-.23,4.95-4.31-.43a2.21,2.21,0,0,1-1.42-.71,2.17,2.17,0,0,1-.58-1.47,2.22,2.22,0,0,1,1.48-2.11,2.25,2.25,0,0,1,.74-.12Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

+115
View File
@@ -0,0 +1,115 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
<defs>
<style>
.cls-1,.cls-2,.cls-24,.cls-25,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#67c8ff;}.cls-14{fill:#8cd7ff;}.cls-15{fill:#b0e7ff;}.cls-16{fill:#728cb9;}.cls-17{fill:#7798b9;}.cls-18{fill:#a4c0d9;}.cls-19{fill:#ebfcff;}.cls-20{fill:#ffb056;}.cls-21{fill:#257fba;}.cls-22{fill:#398eed;}.cls-23{fill:#ffeed2;}.cls-24{stroke:#e49056;stroke-width:0.26px;}.cls-25{stroke:#4986d9;stroke-width:0.1px;}.cls-26{fill:#e55c5c;opacity:0.2;}
</style>
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#81cfff"/>
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
</linearGradient>
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
</defs>
<title>404</title>
<g id="图层_2" data-name="图层 2">
<g id="图层_1-2" data-name="图层 1">
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
<g class="cls-8">
<path class="cls-9"
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
<path class="cls-10"
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
<path class="cls-11"
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
<path class="cls-12"
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
</g>
<path class="cls-13"
d="M182.43,170.83l.09.09a3.44,3.44,0,0,1,.41.44l.12.15a6,6,0,0,1,.39.59.93.93,0,0,0,.05.1,5.36,5.36,0,0,1,.32.73h0a6.39,6.39,0,0,1,.22.78c0,.06,0,.12,0,.19a8.08,8.08,0,0,1,.14.9V175c0,.31,0,.63,0,1V164.28c0-.28,0-.55,0-.82v-.14h0c0-.26-.06-.51-.11-.75l0-.14c0-.06,0-.13,0-.19L184,162c-.05-.17-.1-.33-.16-.49v0h0c-.06-.16-.12-.31-.19-.46s-.09-.17-.13-.25a.93.93,0,0,0-.05-.1.59.59,0,0,1,0-.08,3.74,3.74,0,0,0-.27-.42l-.08-.1-.12-.15c-.05-.06-.1-.13-.16-.19a3,3,0,0,0-.25-.25l-.09-.09A4.06,4.06,0,0,0,182,159l-.11-.07-.12-.07-.18-.12-.5-.23c-.26-.11-.53-.22-.81-.32a2.46,2.46,0,0,1-.29-.09l-.54-.16h0l-.65-.16-.34-.09c-.32-.06-.65-.13-1-.18h0c-.36-.06-.73-.11-1.12-.15l-.39,0-.8-.07H175l-.74,0-.4,0-1.26,0h-2.95v11.49h2.95c.43,0,.85,0,1.26,0l.4,0,.8,0,.79.07.4,0,1.12.16h0l1,.19.34.08.65.16.58.18.29.09c.28.1.55.2.81.31a6.23,6.23,0,0,1,.68.36l.12.07A4.73,4.73,0,0,1,182.43,170.83Z"/>
<rect class="cls-13" x="122.87" y="157.13" width="29.56" height="11.49"/>
<path class="cls-13"
d="M169.61,106.86q0-.52,0-1c0-.08,0-.15,0-.23s0-.35,0-.52a2.51,2.51,0,0,0,0-.27c0-.25-.06-.49-.1-.73a3.31,3.31,0,0,0,0-.33,1.89,1.89,0,0,1-.05-.23l-.12-.52c0-.11,0-.23-.07-.34a2.41,2.41,0,0,1-.08-.25c0-.14-.08-.27-.13-.4a2,2,0,0,0-.08-.26c0-.12-.09-.23-.14-.35s-.08-.21-.13-.31l0-.15c-.08-.18-.18-.34-.26-.51a1.74,1.74,0,0,1-.1-.19.08.08,0,0,1,0,0c-.14-.25-.3-.49-.46-.72l0,0c-.09-.13-.19-.24-.28-.36s-.2-.25-.3-.36,0,0,0,0l-.45-.43-.26-.24a6.42,6.42,0,0,0-.65-.48l-.13-.1h0l-.46-.27a1.63,1.63,0,0,0-.19-.09l-.52-.25c-.14-.06-.29-.13-.44-.18s-.37-.14-.57-.2l-.31-.1a.58.58,0,0,0-.14,0c-.32-.09-.65-.16-1-.22l-.2,0h-.05c-.4-.06-.83-.11-1.26-.14h0c-.39,0-.79,0-1.2,0H159l-.43,0h-.3c-.21,0-.43,0-.64.09h0l-.13,0a3,3,0,0,0-.43.09.35.35,0,0,0-.11,0,1.41,1.41,0,0,0-.22.06l-.24.06-.2.08-.23.08-.14,0-.27.12-.24.11-.08,0-.24.14-.33.18-.08,0-.14.1-.53.38-.12.09-.27.23a53.11,53.11,0,0,0-5.87,6.55l-36.44,45.8-2.55,3.17c-.68.86-1.34,1.75-2,2.68a12.25,12.25,0,0,0-1.44,2.65,7.17,7.17,0,0,0-.45,1.87c0,.2,0,.41,0,.61h0v11.49a7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.65-.93,1.31-1.82,2-2.69l2.55-3.16L147.76,116a53.36,53.36,0,0,1,5.87-6.56l.39-.31c.17-.14.35-.26.53-.39a1.64,1.64,0,0,0,.22-.14l.33-.19.32-.17.24-.11.41-.17.23-.09.44-.14.22-.06.54-.11.13,0c.23,0,.47-.07.71-.09h.26c.19,0,.38,0,.57,0,.42,0,.83,0,1.23,0a12.44,12.44,0,0,1,1.26.14l.25,0q.51.09,1,.21l.45.14c.2.06.39.12.57.19l.44.19.52.24c.22.12.44.24.65.37h0l.13.1a6.42,6.42,0,0,1,.65.48c.09.07.17.16.26.24s.31.28.45.43.21.26.32.39.19.23.28.36a7.45,7.45,0,0,1,.5.78l.1.19c.11.21.22.43.31.65s.09.22.13.32a6.32,6.32,0,0,1,.22.61c.05.13.09.26.13.4l.15.59.12.52.09.56c0,.24.08.48.1.73s.06.52.08.79c0,.08,0,.15,0,.23,0,.42,0,.84,0,1.29h0V107.13A2.44,2.44,0,0,0,169.61,106.86Z"/>
<path class="cls-13"
d="M247,164.23c-1,5.13-2.63,9.07-5,11.83a11.68,11.68,0,0,1-.85.87c-.09.09-.18.16-.27.24a6.66,6.66,0,0,1-.59.49c-.19.14-.37.28-.56.4s-.39.27-.6.39l-.38.21c-.28.15-.57.3-.86.43l-.2.08a10,10,0,0,1-1.13.4l-.29.09c-.32.08-.64.16-1,.22L235,180c-.43.07-.87.14-1.32.18h-.23c-.43,0-.87.05-1.33.05s-.9,0-1.34-.05l-.7-.08-.77-.1-.21,0c-.39-.08-.78-.17-1.16-.27s-.48-.16-.72-.25l-.55-.19c-.24-.1-.46-.21-.7-.33s-.33-.14-.48-.23l-.21-.13a8.63,8.63,0,0,1-.82-.51c-.21-.15-.41-.31-.61-.47l-.43-.34c-.21-.19-.41-.39-.6-.59s-.27-.25-.39-.39a12.06,12.06,0,0,1-.77-.94l-.17-.22c-.23-.32-.47-.66-.69-1a1,1,0,0,0-.1-.17c-.2-.34-.4-.69-.59-1a1.62,1.62,0,0,1-.1-.18c-.2-.39-.39-.8-.58-1.22l-.13-.31c-.17-.4-.34-.81-.49-1.24l-.06-.14c-.17-.47-.33-1-.48-1.47l-.12-.43c-.12-.39-.22-.79-.33-1.2,0-.15-.07-.31-.11-.46-.13-.55-.26-1.11-.37-1.68s-.23-1.25-.33-1.9l0-.14c-.1-.61-.19-1.25-.27-1.9,0-.17,0-.34-.07-.51-.07-.57-.13-1.14-.19-1.73,0-.12,0-.23,0-.35l-.09-1c0-.49-.09-1-.13-1.48s0-.75-.07-1.12-.06-1-.09-1.51,0-.81-.05-1.21,0-1-.07-1.55l0-1.3,0-1.61c0-.85,0-1.7,0-2.57v11.48c0,.75,0,1.49,0,2.21,0,.13,0,.24,0,.36,0,.55,0,1.08,0,1.61s0,.88,0,1.3,0,1,.07,1.56,0,.82.05,1.21l.09,1.5c0,.38,0,.76.07,1.12,0,.51.09,1,.13,1.49,0,.29.05.6.08.89,0,0,0,.09,0,.13s0,.23,0,.35c.06.59.12,1.16.19,1.72,0,.18.05.35.07.52.08.65.17,1.28.27,1.9l0,.14c.06.41.13.82.2,1.21,0,.23.09.46.13.68.11.58.24,1.14.37,1.69,0,.15.07.3.11.46s.09.37.14.55.12.43.19.65l.12.43c.15.48.3,1,.46,1.42,0,0,0,0,0,0l.06.14c.15.43.32.84.49,1.24l.13.31.11.26c.15.33.31.65.47,1a1.62,1.62,0,0,0,.1.18c.09.18.19.36.29.54l.3.5.1.17c.18.28.36.56.54.82l.16.2.16.22c.25.33.5.64.77.94l.06.06c.1.12.22.22.33.33s.39.4.6.58.29.23.43.35.4.32.61.47l.07.06q.38.24.75.45l.21.13h0l.46.22c.23.11.46.23.7.33l.55.19c.24.08.47.17.72.24l0,0c.37.1.74.18,1.12.25l.21,0,.2,0c.18,0,.38,0,.57.06s.46.07.7.08l.15,0c.39,0,.78,0,1.19,0h.26c.36,0,.72,0,1.07-.06h.26c.38,0,.76-.08,1.13-.14l.16,0,.32-.07.52-.1.45-.13.29-.08.18-.05c.31-.1.6-.2.89-.32l.06,0,.2-.09.62-.28c.09,0,.16-.1.24-.14l.38-.21c.1-.07.21-.12.31-.18l.29-.21.56-.4.24-.18.35-.31.27-.24a11.84,11.84,0,0,0,.85-.88c2.39-2.75,4-6.69,5-11.82a113.49,113.49,0,0,0,1.44-20.15V144.08A113.42,113.42,0,0,1,247,164.23Z"/>
<path class="cls-13"
d="M267.31,143.7c0-.12,0-.23,0-.34,0-.49,0-1,0-1.43s0-.69,0-1c0-.5,0-1-.06-1.46,0-.31,0-.62,0-.92,0-.54-.06-1.08-.1-1.61,0-.23,0-.46,0-.68-.06-.75-.12-1.49-.19-2.22v0c-.06-.63-.13-1.25-.2-1.87,0-.19-.05-.37-.07-.56-.06-.43-.11-.86-.17-1.29,0-.22-.07-.43-.1-.65-.06-.39-.12-.78-.19-1.17,0-.21-.07-.42-.1-.62l-.06-.35c0-.14-.06-.27-.08-.41l-.33-1.63c-.05-.21-.09-.42-.14-.63-.16-.71-.33-1.41-.51-2.08h0c-.16-.6-.33-1.19-.51-1.76l-.18-.56c-.12-.38-.25-.77-.38-1.14,0-.07,0-.14-.07-.21s-.13-.32-.19-.49l-.3-.8c-.09-.23-.19-.46-.29-.69s-.21-.51-.32-.76c0-.08-.07-.17-.11-.25-.13-.29-.27-.58-.4-.86-.34-.68-.7-1.34-1.06-2-.05-.08-.09-.17-.13-.25l-.18-.29c-.2-.34-.4-.68-.6-1s-.23-.38-.35-.56c-.23-.36-.47-.72-.72-1.07-.07-.11-.14-.22-.22-.33l0-.06q-.56-.77-1.14-1.5l-.3-.37c-.3-.36-.61-.72-.92-1.07-.06-.07-.13-.16-.2-.23l-.17-.17c-.44-.49-.9-1-1.37-1.41l-1-.92-.32-.27-.74-.61-.37-.28q-.4-.31-.81-.6l-.29-.21-.1-.07-.42-.27c-.26-.18-.53-.35-.8-.52l-.56-.33-.78-.45-.18-.1-.29-.15c-.42-.21-.83-.42-1.26-.62l-.48-.22c-.57-.25-1.14-.49-1.73-.71s-.91-.33-1.37-.48l-.46-.14-.74-.22-.17,0c-.49-.14-1-.26-1.49-.37l-.24-.06c-.59-.13-1.18-.24-1.79-.34l-.12,0-.57-.08-1-.13-.75-.08-1-.09-.25,0-.79,0-.52,0c-.54,0-1.08,0-1.63,0h-.91c-.35,0-.7,0-1.05,0l-.47,0-1.41.1h-.07c-.45.05-.9.09-1.34.15l-.41.06-.91.13-.13,0-.41.07-.69.13-.55.11-.67.15-.19,0-.37.1-.61.15-.56.16-.59.18-.21.06-.33.12-.59.2-.53.19-.57.22-.24.09-.27.12-.62.26-.48.22-.61.3-.28.13a1.51,1.51,0,0,1-.18.09l-.76.42-.36.19c-.37.21-.73.43-1.09.65l0,0c-.58.36-1.13.75-1.67,1.15-.17.11-.32.24-.48.36s-.45.33-.66.51-.32.28-.48.41l-.55.48c-.37.33-.73.68-1.08,1l-.44.43c-.48.5-1,1-1.4,1.56l-.17.22c-.39.47-.77,1-1.13,1.47-.14.19-.27.39-.4.58-.28.41-.56.82-.82,1.24l-.41.67c-.26.44-.51.89-.76,1.35l-.33.62c-.34.68-.67,1.36-1,2.07A55.46,55.46,0,0,0,198,128.9a127.46,127.46,0,0,0-1.1,17.57V158a127.36,127.36,0,0,1,1.1-17.57A55.34,55.34,0,0,1,201.46,127c.31-.71.64-1.4,1-2.07l.33-.62c.25-.46.5-.91.76-1.35l.41-.67c.26-.42.54-.84.82-1.24.13-.2.26-.4.4-.59.36-.5.74-1,1.13-1.46l.17-.22c.45-.54.92-1.06,1.4-1.56l.44-.44q.52-.53,1.08-1l.55-.48c.37-.32.75-.62,1.14-.92.16-.12.31-.25.48-.37.55-.4,1.12-.8,1.7-1.17.36-.22.72-.44,1.09-.65l.36-.2.76-.41.46-.23.61-.29.48-.22.62-.27.51-.2.57-.22.53-.2.59-.2.54-.17.59-.18.56-.16.61-.15.56-.14.66-.15.56-.11.68-.13.55-.1.91-.13.41-.05c.44-.06.89-.11,1.34-.15h.07c.46,0,.93-.08,1.41-.1l.47,0,1.05,0h.91c.55,0,1.09,0,1.63,0l.52,0,1,.06c.33,0,.65.06,1,.09l.75.07,1,.14.69.1c.61.1,1.2.21,1.79.34l.24,0,1.49.37.91.27.46.14c.46.15.92.31,1.37.48s1.16.46,1.73.71l.48.22c.43.2.84.4,1.26.62l.47.25q.39.21.78.45c.19.11.38.21.56.33s.54.34.8.51l.52.35.29.21c.27.19.55.39.81.6l.36.28c.26.2.5.4.75.61l.32.27c.34.3.68.6,1,.92s.93.92,1.37,1.4l.37.41c.31.35.62.71.92,1.07l.3.37c.39.49.77,1,1.14,1.5l.26.39c.25.35.49.71.72,1.07l.35.55.6,1,.31.54c.36.65.72,1.31,1.06,2l.51,1.11c.11.25.22.5.32.76s.2.45.29.69l.3.8c.09.23.18.46.26.7s.26.75.38,1.14l.18.56c.18.57.35,1.16.51,1.76h0c.18.67.35,1.37.51,2.07.05.21.09.43.14.64.11.53.22,1.08.33,1.63,0,.25.09.5.14.75s.07.42.1.63c.07.39.13.77.19,1.17,0,.21.07.43.1.65.06.42.11.85.17,1.29,0,.19.05.37.07.56.07.62.14,1.25.21,1.9s.13,1.46.19,2.21c0,.23,0,.46,0,.69,0,.53.07,1.07.1,1.61,0,.3,0,.61,0,.91,0,.49.05,1,.06,1.46s0,.68,0,1,0,1,0,1.43c0,.67,0,1.34,0,2h0V145.37C267.32,144.81,267.32,144.25,267.31,143.7Z"/>
<path class="cls-13"
d="M356.8,170.83l.09.09a3.44,3.44,0,0,1,.41.44l.12.15a6,6,0,0,1,.39.59.93.93,0,0,0,.05.1,5.36,5.36,0,0,1,.32.73h0a5.92,5.92,0,0,1,.22.78,1.06,1.06,0,0,1,0,.19,8.46,8.46,0,0,1,.14.9.49.49,0,0,0,0,.12c0,.31,0,.64,0,1V164.28c0-.29,0-.57,0-.84a.49.49,0,0,1,0-.12h0c0-.25-.06-.5-.1-.74,0,0,0-.1,0-.15a1.29,1.29,0,0,0,0-.19c0-.09,0-.19-.06-.27s-.1-.35-.16-.51h0c-.06-.16-.12-.32-.19-.47s-.09-.17-.13-.25l-.05-.1s0-.05,0-.08-.17-.28-.26-.42l-.09-.1-.12-.15-.16-.2-.25-.24-.09-.09a4.06,4.06,0,0,0-.46-.36l-.11-.07-.12-.07-.19-.12-.49-.23c-.26-.11-.53-.22-.81-.31l-.29-.1-.54-.16h0l-.65-.16-.34-.08-1-.19h-.09c-.36-.06-.74-.11-1.12-.15l-.38,0-.82-.07h-.05l-.73,0-.41,0-1.26,0h-3v11.49h3c.43,0,.85,0,1.26,0l.4,0,.79,0,.82.07.38,0,1.12.16h.09l1,.18.34.08.65.16.58.18.29.09c.28.1.55.2.81.31a6.23,6.23,0,0,1,.68.36l.12.07A4.73,4.73,0,0,1,356.8,170.83Z"/>
<rect class="cls-13" x="297.24" y="157.13" width="29.56" height="11.49"/>
<path class="cls-13"
d="M344,106.86c0-.35,0-.69,0-1,0-.08,0-.15,0-.23s0-.35,0-.52,0-.18,0-.27c0-.25-.06-.49-.1-.73s0-.23-.05-.33a1.89,1.89,0,0,0-.05-.23c0-.18-.07-.35-.11-.52s-.05-.23-.08-.34a1.83,1.83,0,0,0-.08-.25l-.12-.4c0-.09-.05-.18-.08-.26s-.09-.23-.14-.35-.08-.21-.13-.31l-.06-.15c-.08-.18-.17-.34-.26-.51a1.74,1.74,0,0,0-.1-.19.08.08,0,0,0,0,0q-.21-.37-.45-.72l0,0c-.09-.12-.19-.24-.29-.35s-.19-.26-.29-.37l0,0a6.14,6.14,0,0,0-.45-.43l-.25-.24a7.62,7.62,0,0,0-.64-.48l-.14-.1h0l-.46-.27a1.11,1.11,0,0,0-.19-.09c-.16-.09-.34-.17-.51-.25s-.29-.13-.44-.18l-.57-.2-.31-.1-.14,0a9.78,9.78,0,0,0-1-.22l-.2,0h0c-.41-.06-.83-.11-1.27-.14h0c-.38,0-.78,0-1.19,0h-.14l-.43,0h-.3c-.21,0-.43,0-.64.09h0l-.13,0c-.15,0-.29,0-.43.09a.35.35,0,0,0-.11,0,1.41,1.41,0,0,0-.22.06l-.24.06-.2.08-.23.08-.14,0-.27.12-.24.11-.08,0-.24.14-.33.18-.07,0-.14.11a4.7,4.7,0,0,0-.53.38l-.12.08-.28.24a53,53,0,0,0-5.88,6.55l-36.43,45.8c-1,1.25-1.86,2.31-2.54,3.17s-1.36,1.75-2,2.68a12.25,12.25,0,0,0-1.44,2.65,7.17,7.17,0,0,0-.45,1.87c0,.2,0,.41,0,.61h0v11.49a7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.64-.93,1.31-1.82,2-2.69l2.54-3.16L322.12,116a53.27,53.27,0,0,1,5.88-6.56l.4-.32.53-.38.21-.14.33-.19.32-.17.24-.11.41-.17.23-.09.44-.14.22-.06.54-.11.13,0c.23,0,.47-.07.71-.09H333c.19,0,.37,0,.57,0,.42,0,.83,0,1.22,0a12.65,12.65,0,0,1,1.27.14l.25,0q.51.09,1,.21l.45.14c.19.06.39.12.57.19l.44.19.51.24c.23.12.45.24.65.37h0l.15.1a7.62,7.62,0,0,1,.64.48c.09.07.17.16.26.24s.3.28.44.43a3.89,3.89,0,0,1,.32.39c.1.12.2.23.29.36a6.07,6.07,0,0,1,.49.78,1.14,1.14,0,0,1,.1.19c.11.21.22.43.32.65s.09.21.13.32.15.4.22.61l.12.39c.06.2.11.4.16.6s.08.34.11.52.07.37.1.56.07.48.1.73.06.52.08.79c0,.08,0,.15,0,.23,0,.42,0,.84,0,1.29h0V106.86Z"/>
<path class="cls-14"
d="M181.06,170q3.19,1.36,3.2,5.95a6,6,0,0,1-2.61,5.45c-1.74,1.15-4.36,1.72-7.84,1.72h-4.19v12q0,5-2.34,7.39a9.16,9.16,0,0,1-12.48-.07c-1.58-1.65-2.37-4.1-2.37-7.32v-12H117.92q-6.53,0-9.79-2.78a9.36,9.36,0,0,1-3.27-7.56,7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.65-.93,1.31-1.82,2-2.69l2.55-3.16L147.76,116a53.36,53.36,0,0,1,5.87-6.56,8.12,8.12,0,0,1,5.54-2q10.44,0,10.45,11.25v50h2.95A22.17,22.17,0,0,1,181.06,170Zm-28.63-1.35V131.09l-29.56,37.53h29.56"/>
<path class="cls-14"
d="M262.1,126.69q5.22,10.67,5.22,30.17A104.74,104.74,0,0,1,266,175.07a40.85,40.85,0,0,1-5.09,13.83,32.76,32.76,0,0,1-12.1,11.76,33.29,33.29,0,0,1-16.5,4.13,32.86,32.86,0,0,1-18.73-5.55,34.11,34.11,0,0,1-12.48-15.38A54.59,54.59,0,0,1,197.92,172a93.33,93.33,0,0,1-1-14,127.36,127.36,0,0,1,1.1-17.57A55.34,55.34,0,0,1,201.46,127a30.81,30.81,0,0,1,11.79-14.18q7.73-4.87,18.46-4.88a36.2,36.2,0,0,1,12.85,2.17,29.45,29.45,0,0,1,10.14,6.33A36.1,36.1,0,0,1,262.1,126.69Zm-15.06,49a113.49,113.49,0,0,0,1.44-20.15A101.2,101.2,0,0,0,247,136.22c-1-5-2.7-8.81-5.08-11.37S236.2,121,232,121q-9.07,0-12.61,8.59t-3.54,26.48a107,107,0,0,0,1.51,19.9q1.51,7.76,5.09,11.73a12.37,12.37,0,0,0,9.69,4q6.33,0,9.9-4.14c2.39-2.75,4-6.69,5-11.82"/>
<path class="cls-14"
d="M355.43,170q3.19,1.36,3.2,5.95a6,6,0,0,1-2.62,5.45q-2.61,1.73-7.83,1.72H344v12q0,5-2.33,7.39a8.29,8.29,0,0,1-6.26,2.42,8.19,8.19,0,0,1-6.22-2.49c-1.58-1.65-2.37-4.1-2.37-7.32v-12H292.29q-6.54,0-9.8-2.78a9.42,9.42,0,0,1-3.26-7.56,7,7,0,0,1,.48-2.49,12.43,12.43,0,0,1,1.44-2.64c.64-.93,1.31-1.82,2-2.69l2.54-3.16L322.12,116a53.27,53.27,0,0,1,5.88-6.56,8.1,8.1,0,0,1,5.54-2q10.44,0,10.44,11.25v50h3A22.17,22.17,0,0,1,355.43,170Zm-28.63-1.35V131.09l-29.56,37.53H326.8"/>
<path class="cls-15"
d="M270.46,172.17c.07,1.42-.5,2.61-1.28,2.64s-1.46-1.08-1.53-2.5.5-2.6,1.28-2.64S270.39,170.75,270.46,172.17Z"/>
<path class="cls-16"
d="M285.58,170.34c.33,0,.62.46.65,1.06s-.21,1.1-.54,1.12l-.88.09c.12-.19.17-.36,0-.48-.38-.34-.75-.34-1-.08s-.17.57-.48.71h0l-3.26.34-.61.07a3.68,3.68,0,0,0,.19-1.45,3.76,3.76,0,0,0-.33-1.42h2c0,.31.1.73.42.83a19.28,19.28,0,0,0,3.06.13c1,0,.41-.65.47-.93h.29Z"/>
<path class="cls-17"
d="M279.17,171.65a3.49,3.49,0,0,1-1.1,2.61l-8.67,1.23c.89-.21,1.53-1.64,1.44-3.34S270,169.06,269,169l8.79.38A2.92,2.92,0,0,1,279.17,171.65Z"/>
<path class="cls-18"
d="M279.37,170.3a3.76,3.76,0,0,1,.33,1.42,3.68,3.68,0,0,1-.19,1.45c-.21.6-.57,1-1,1l-.43.06a3.49,3.49,0,0,0,1.1-2.61,2.92,2.92,0,0,0-1.34-2.3l.44,0C278.7,169.35,279.1,169.71,279.37,170.3Z"/>
<path class="cls-18"
d="M269.18,174.81c.78,0,1.35-1.22,1.28-2.64s-.75-2.54-1.53-2.5-1.35,1.22-1.28,2.64S268.41,174.85,269.18,174.81Zm1.66-2.66c.09,1.7-.55,3.13-1.44,3.34h0l-.17,0c-1,0-1.86-1.38-2-3.19s.64-3.31,1.63-3.36H269C270,169.06,270.76,170.44,270.84,172.15Z"/>
<path d="M303,176a1.14,1.14,0,0,0,.33.71,2.75,2.75,0,0,1-.88-.39A4.37,4.37,0,0,0,303,176Z"/>
<path d="M298.64,166.65l.12.16A5.6,5.6,0,0,0,297,169a4.63,4.63,0,0,1-2.06-1.52C296.92,168,297.5,166.05,298.64,166.65Z"/>
<path d="M306.62,169.68c-.86-3.88-3.84-4.21-3.84-4.21s-3.07-.47-4.14,1.18l.12.16A5.6,5.6,0,0,0,297,169a6.88,6.88,0,0,0,1.35.43c1.8.34,4.18.13,4.85,1.15s.22,2.66-.91,4.16c-.59.8-.28,1.31.16,1.62A4.37,4.37,0,0,0,303,176a.46.46,0,0,1,.28-.48,1.61,1.61,0,0,1,.49-.11,2.5,2.5,0,0,0,1.34-.39C305.68,174.58,307.49,173.56,306.62,169.68Z"/>
<path class="cls-19"
d="M320.54,231.08c0,.63.23,3.56-.53,3.84a54,54,0,0,1-7.28,1.17c-1.07,0-.9-.85-.9-.85s7.18-.51,7.81-1.12.32-2.83.06-4.08a23.55,23.55,0,0,1-.41-4.38,16,16,0,0,0,.17-1.74c-.06-.35-1.59-1.62-1.59-1.62.11-.22.39-.31.9-.31s1.4,1.52,1.44,1.87-.38,1.49-.38,2.36S320.49,230.45,320.54,231.08Z"/>
<path class="cls-20"
d="M319.7,230c.26,1.25.57,3.47-.06,4.08s-7.81,1.12-7.81,1.12,0-.92,0-1.3,4.06-1.18,4.2-2-.47-2.2-1.23-2.16c-.38,0-.48-.26-.49-.57a7.35,7.35,0,0,1,.07-.78c0-.24.95,1,1.35.77s.86-3.75-.28-4.77a1.05,1.05,0,0,0-.86-.28s-.8-.86-.69-1.18.63-.81,1-.31,1.46-.07,1.88-.22a4.57,4.57,0,0,1,1.13-.14s1.53,1.27,1.59,1.62a16,16,0,0,1-.17,1.74A23.55,23.55,0,0,0,319.7,230Z"/>
<path class="cls-21"
d="M313.73,229.3l.17,3L295,235.55a3.15,3.15,0,0,1-3.64-2.68l-2.74-20.29,9.2,2.1-.35,12.89,16-3v.18Z"/>
<path class="cls-22"
d="M288.06,204.33c.51.45,9.48,2.36,15.15,2.31h0l-.77,5.1a3.62,3.62,0,0,1-4.4,3l-.24,0-9.2-2.1-8.66-2,1.86,19-2.31.39-4.45.75-.33.06L272.81,204a2.71,2.71,0,0,1,3.39-2.81Z"/>
<path class="cls-20"
d="M305.83,192.12h0a23,23,0,0,0,.05,2.76l-10.67.31c-.63-.74-1.57-1.4-2-1a.6.6,0,0,0,.34,1c.32,0,1.08.71-.34.58s-2.1-.85-2.62-.44-.66,2.48,0,2.65,4.27.33,5.37-.22l10.05.51c.16,3,.39,6.37.53,7.94a11,11,0,0,1-3.37.43c-5.67.05-14.64-1.86-15.15-2.31s1.25-9.1,2.52-15.42a14.92,14.92,0,0,1-2.92,1.4,5.36,5.36,0,0,1-1.91-2.19,6.93,6.93,0,0,1-.7-4.55,2,2,0,0,1,.24-.6c1.44-1.05,5.18-2.8,7.2-4.19a8.25,8.25,0,0,1,4.06-1.22c-.17.32-.75,3,.87,3.44s5-.87,5-3.08a6.18,6.18,0,0,1,3.22.52c1.77,1,4.07,6.39,5.89,11.34-.32,1.08-2.22,1.88-4,2.19A8.16,8.16,0,0,1,305.83,192.12Z"/>
<polygon class="cls-23"
points="279.49 229.99 279.48 231.93 275.27 232.85 275.04 231.33 275.04 230.74 279.49 229.99"/>
<path class="cls-23"
d="M314.38,228.43a7.35,7.35,0,0,0-.07.78h0l-.58.09-.27-4.55,2-.32c1.14,1,.61,4.6.28,4.77S314.38,228.19,314.38,228.43Z"/>
<path class="cls-23"
d="M314,197.18c-.52-1.65-1.43-4.45-2.51-7.4-.32,1.08-2.22,1.88-4,2.19l1.08,2.83-2.68.08-10.67.31c-.63-.74-1.57-1.4-2-1a.6.6,0,0,0,.34,1c.32,0,1.08.71-.34.58s-2.1-.85-2.62-.44-.66,2.48,0,2.65,4.27.33,5.37-.22l10.05.51,6.84.35A1.11,1.11,0,0,0,314,197.18Z"/>
<path class="cls-23"
d="M302.38,177.92c0,2.21-3.34,3.52-5,3.08s-1-3.12-.87-3.44a14.35,14.35,0,0,1,1.51,0c.17-.09.3-.54.3-.91a3.83,3.83,0,0,0,1.12.27,5.52,5.52,0,0,0,3-.59c-.32.56-.81,1.15-.74,1.48C301.73,177.92,302,177.93,302.38,177.92Z"/>
<path class="cls-23"
d="M303.19,170.55c.67,1,.22,2.66-.91,4.16-.59.8-.28,1.31.16,1.62a5.52,5.52,0,0,1-3,.59,3.83,3.83,0,0,1-1.12-.27c-1.65-.71-2.29-2.23-2.05-4.86a9.18,9.18,0,0,1,1-2.68,3.91,3.91,0,0,0,1,.29C300.14,169.74,302.52,169.53,303.19,170.55Z"/>
<path class="cls-23"
d="M285.29,170.34h0c0-.29-.74-1.21-1.47-1.51a6.8,6.8,0,0,0-2.48,0c-.34,0-.84,1.33-.9,1.48h.9c0,.31.1.73.42.83a19.28,19.28,0,0,0,3.06.13C285.8,171.29,285.23,170.62,285.29,170.34Z"/>
<path class="cls-23"
d="M283.87,172.05c.22-.26.59-.26,1,.08.14.12.09.29,0,.48l-1.42.15C283.7,172.62,283.64,172.31,283.87,172.05Z"/>
<path class="cls-23"
d="M283.38,172.76h0l1.42-.15c-.21.34-.64.74-.7,1.06-.09.49-1.08.75-1.52,1.35l-.48,10.24,2.94-1.69a6.93,6.93,0,0,0,.7,4.55L279.2,191a1,1,0,0,1-1.41-1.07l2.2-15.22c.12-1,.13-1.61.13-1.61Z"/>
<path class="cls-24" d="M303,187.14l1.72,4.81a3.36,3.36,0,0,0,1.11.17"/>
<path class="cls-25"
d="M317.87,222.3c.11-.22.39-.31.9-.31s1.4,1.52,1.44,1.87-.38,1.49-.38,2.36.66,4.23.71,4.86.23,3.56-.53,3.84a54,54,0,0,1-7.28,1.17c-1.07,0-.9-.85-.9-.85"/>
<ellipse class="cls-23" cx="303.14" cy="173.18" rx="1.32" ry="0.91"
transform="translate(13 367.35) rotate(-63.53)"/>
<ellipse class="cls-26" cx="303.14" cy="173.18" rx="0.77" ry="0.53"
transform="translate(13 367.35) rotate(-63.53)"/>
<path class="cls-19"
d="M262.55,235.72a.72.72,0,0,1-.12-1.21c-.17.18.05.37.48.39a36.08,36.08,0,0,0,11.77-.55c1-.08,3.65.2,5.06.15,1.16-.05,1.62-.47,1.73-.86a1,1,0,0,1,.17,1.64c-.6.61-4.14.52-4.82.51s-7.56,0-8.57.12A26.72,26.72,0,0,1,262.55,235.72Z"/>
<path class="cls-20"
d="M280.69,231.61a8.33,8.33,0,0,1,.81,1.8.91.91,0,0,1,0,.23c-.11.39-.57.81-1.73.86-1.41.05-4-.23-5.06-.15a36.08,36.08,0,0,1-11.77.55c-.43,0-.65-.21-.48-.39a33.2,33.2,0,0,1,4.91-1.81,12.78,12.78,0,0,0,6.17-2.66,3.77,3.77,0,0,1,.75,0c.87.08,1.61.44,1.58.78s-.47.82.46.92a3.33,3.33,0,0,0,2.36-.58c.33-.37.34-.67,1-.56.18,0,.33,0,.46,0,.39,0,.58,0,.7.17S280.52,231.25,280.69,231.61Z"/>
<path class="cls-25"
d="M262.43,234.51a.72.72,0,0,0,.12,1.21,26.72,26.72,0,0,0,5.7.19c1-.17,7.9-.13,8.57-.12s4.22.1,4.82-.51a1,1,0,0,0-.17-1.64h0"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 32 KiB

+111
View File
@@ -0,0 +1,111 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
<defs>
<style>
.cls-1,.cls-2,.cls-21,.cls-22,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7{fill:none;}.cls-2,.cls-21,.cls-22,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7{stroke-miterlimit:10;}.cls-2,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7{stroke-width:2px;}.cls-2{stroke:url(#未命名的渐变_26);}.cls-3{stroke:url(#未命名的渐变_26-2);}.cls-4{stroke:url(#未命名的渐变_26-3);}.cls-5{stroke:url(#未命名的渐变_26-4);}.cls-6{stroke:url(#未命名的渐变_26-5);}.cls-7{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-13,.cls-8{opacity:0.4;}.cls-8{fill:url(#未命名的渐变_26-7);}.cls-9{opacity:0.7;}.cls-10{fill:url(#未命名的渐变_26-8);}.cls-11{fill:url(#未命名的渐变_26-9);}.cls-12{fill:url(#未命名的渐变_26-10);}.cls-13{fill:url(#未命名的渐变_26-11);}.cls-14{fill:#67c8ff;}.cls-15{fill:#8cd7ff;}.cls-16{isolation:isolate;}.cls-17{clip-path:url(#clip-path);}.cls-18{fill:#517d94;}.cls-19{fill:#ebfcff;}.cls-20{fill:#ffb056;}.cls-21{stroke:#e49056;stroke-width:0.25px;}.cls-22{stroke:#4986d9;stroke-width:0.13px;}.cls-23{fill:#e49056;}.cls-24{fill:#fae6d2;}.cls-25{fill:#ffeed2;}.cls-26{fill:#d3d3d3;}.cls-27{fill:#fff;}.cls-28{fill:#398eed;}
</style>
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#81cfff"/>
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
</linearGradient>
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
<clipPath id="clip-path">
<path class="cls-1"
d="M132.71,143.17v-8.64c1.84-.15,3.62-.2,5.32-.2s3.18,0,4.65.11c7.58.36,16.62,3.36,22.3,8.63s7.84,11.57,7.84,20.58v8.64c0-9-2.17-15.32-7.84-20.58s-14.72-8.27-22.3-8.63c-1.47-.07-3-.12-4.65-.12S134.55,143,132.71,143.17Z"/>
</clipPath>
</defs>
<title>500</title>
<g id="图层_2" data-name="图层 2">
<g id="图层_1-2" data-name="图层 1">
<line class="cls-2" x1="1" y1="91.35" x2="1" y2="181.12"/>
<line class="cls-3" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
<line class="cls-4" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
<line class="cls-5" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
<line class="cls-6" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
<line class="cls-7" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
<path class="cls-8" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
<g class="cls-9">
<path class="cls-10"
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
<path class="cls-11"
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
<path class="cls-12"
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
<path class="cls-13"
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
</g>
<path class="cls-14"
d="M240.54,164.63c-1,5.12-2.63,9.07-5,11.82-.27.31-.56.6-.85.88l-.27.24c-.19.17-.39.33-.6.49l-.55.4-.6.38-.38.22q-.42.23-.87.42l-.19.09c-.37.15-.74.28-1.13.4l-.3.08c-.31.09-.63.16-1,.23l-.32.06q-.64.12-1.32.18H227c-.44,0-.88.06-1.33.06s-.9,0-1.34-.06l-.71-.08-.76-.1-.21,0a10.34,10.34,0,0,1-1.16-.27c-.25-.07-.48-.16-.72-.24l-.55-.19c-.24-.1-.47-.22-.7-.33l-.48-.23-.21-.13c-.28-.16-.56-.33-.82-.51s-.41-.32-.61-.48a5,5,0,0,1-.43-.34c-.21-.18-.41-.39-.61-.59l-.38-.38c-.27-.3-.52-.62-.77-.94l-.17-.22q-.36-.5-.69-1l-.1-.17c-.21-.34-.41-.68-.6-1.05l-.09-.18c-.2-.39-.4-.79-.58-1.21l-.14-.32c-.17-.4-.33-.81-.49-1.23a.78.78,0,0,0-.05-.14c-.17-.48-.33-1-.48-1.48-.05-.14-.08-.28-.13-.42-.11-.4-.22-.79-.32-1.2,0-.16-.08-.31-.11-.47-.13-.54-.26-1.1-.37-1.68s-.23-1.24-.34-1.89c0-.05,0-.1,0-.15-.1-.61-.19-1.25-.27-1.9,0-.16-.05-.34-.07-.51-.07-.56-.13-1.14-.2-1.73l0-.34c0-.33-.06-.69-.09-1-.05-.49-.09-1-.13-1.48s0-.74-.07-1.12-.07-1-.09-1.5l-.06-1.22c0-.51,0-1-.06-1.55s0-.86,0-1.3,0-1.06,0-1.61c0-.84,0-1.69,0-2.57v11.49c0,.75,0,1.48,0,2.21,0,.12,0,.24,0,.36,0,.54,0,1.08,0,1.61l0,1.3c0,.53,0,1,.06,1.55l.06,1.22c0,.51.06,1,.09,1.5s0,.75.07,1.12.08,1,.13,1.48c0,.3,0,.61.07.9,0,0,0,.08,0,.13l0,.34c.07.59.13,1.17.2,1.73,0,.17,0,.34.07.51.08.65.17,1.29.27,1.9,0,0,0,.1,0,.14.07.41.14.82.21,1.21,0,.23.08.46.13.69.11.58.24,1.13.37,1.68,0,.16.07.31.11.46s.09.38.14.56l.18.64c0,.15.08.29.13.43.14.49.3,1,.46,1.42,0,0,0,0,0,.05a.88.88,0,0,1,.05.15c.16.42.32.83.49,1.23,0,.11.09.21.14.31s.07.18.11.26c.15.33.31.65.47,1l.09.18c.1.18.19.37.29.54s.21.34.31.51l.1.17c.18.28.35.55.54.81l.15.2.17.22a12.06,12.06,0,0,0,.77.94l.05.07.34.32c.19.2.39.4.6.59a5,5,0,0,0,.43.34c.2.16.4.33.61.47l.07.06c.24.17.49.31.75.46l.21.12,0,0c.15.08.31.14.46.21a6.36,6.36,0,0,0,.7.33c.18.08.37.13.55.19s.47.18.72.25h0c.36.1.74.19,1.12.26l.21,0,.19,0,.57.07.71.08.14,0q.58,0,1.2,0h.26c.36,0,.71,0,1.07,0h.25c.39,0,.77-.09,1.13-.15l.17,0,.32-.06.52-.11c.15,0,.29-.08.44-.12l.3-.09.18,0a9.44,9.44,0,0,0,.89-.32l.06,0,.19-.09c.21-.09.43-.18.63-.29l.24-.14c.13-.06.25-.14.38-.21s.21-.11.31-.18l.29-.2.55-.4c.08-.07.17-.12.25-.18l.35-.31.27-.25a11.68,11.68,0,0,0,.85-.87q3.57-4.14,5-11.82A112.54,112.54,0,0,0,242,156V144.47A112.54,112.54,0,0,1,240.54,164.63Z"/>
<path class="cls-14"
d="M260.82,144.09c0-.11,0-.22,0-.34l0-1.43,0-1c0-.49,0-1-.06-1.46,0-.3,0-.61,0-.91,0-.55-.07-1.08-.1-1.62,0-.22,0-.45-.05-.68-.05-.75-.12-1.49-.19-2.22v0c-.06-.63-.13-1.26-.2-1.87,0-.19-.05-.38-.07-.57l-.18-1.28-.09-.66c-.06-.39-.12-.78-.19-1.16,0-.21-.07-.42-.11-.63s0-.23-.06-.35-.05-.26-.08-.4c-.1-.55-.21-1.1-.33-1.64,0-.21-.09-.42-.13-.63-.17-.71-.33-1.4-.51-2.08h0l-.51-1.77-.18-.56c-.13-.38-.25-.76-.38-1.13a1.72,1.72,0,0,1-.07-.21c-.06-.17-.13-.33-.19-.5l-.3-.79c-.1-.24-.19-.47-.29-.7l-.32-.75-.11-.26c-.13-.29-.27-.57-.41-.85-.34-.69-.69-1.35-1-2l-.14-.25c0-.1-.11-.19-.17-.29l-.6-1-.35-.55c-.23-.37-.48-.72-.72-1.08-.07-.1-.14-.22-.22-.32l0-.06c-.36-.52-.74-1-1.13-1.5l-.3-.37c-.3-.37-.61-.72-.92-1.07l-.2-.24-.17-.17c-.45-.48-.9-1-1.37-1.4s-.67-.62-1-.92l-.32-.27-.75-.61-.36-.29-.81-.6-.29-.21-.1-.06-.42-.28c-.27-.17-.53-.35-.8-.51s-.37-.23-.56-.34l-.78-.45-.18-.1-.3-.14c-.41-.22-.83-.42-1.25-.62l-.49-.23c-.56-.25-1.13-.49-1.72-.71s-.91-.32-1.38-.47l-.45-.14c-.25-.08-.49-.16-.74-.22l-.18,0c-.48-.13-1-.26-1.48-.37l-.25-.06c-.58-.12-1.18-.23-1.78-.33l-.12,0-.58-.07-1-.14-.75-.07c-.32,0-.65-.07-1-.09l-.24,0-.8,0-.51,0c-.54,0-1.08,0-1.63,0h-.91l-1.05,0-.48,0c-.47,0-.94,0-1.4.09h-.07l-1.34.14-.41.06-.91.13-.13,0-.41.08-.7.12-.55.12-.66.14-.2,0-.37.09-.6.16-.56.16-.59.17-.21.07-.33.11-.59.2-.53.2-.58.21a1.57,1.57,0,0,1-.23.09l-.27.12-.62.27-.49.22-.6.29-.29.14-.17.09-.77.41-.35.2c-.37.21-.73.42-1.09.65l0,0c-.57.36-1.12.75-1.67,1.15l-.48.37-.66.5-.47.42-.56.48c-.36.33-.72.67-1.07,1l-.44.43c-.48.51-1,1-1.4,1.56l-.17.22c-.39.48-.77,1-1.13,1.47-.14.19-.27.39-.41.59-.28.4-.55.81-.81,1.24-.14.22-.28.44-.41.66-.26.45-.51.9-.76,1.36l-.33.62c-.34.67-.67,1.36-1,2.07a54.8,54.8,0,0,0-3.44,13.43,125.91,125.91,0,0,0-1.1,17.57v11.49a125.91,125.91,0,0,1,1.1-17.57A54.8,54.8,0,0,1,195,127.35c.31-.72.64-1.4,1-2.07l.33-.63c.25-.46.5-.91.76-1.35.13-.22.27-.44.41-.66.26-.43.53-.84.81-1.25l.41-.58c.36-.51.74-1,1.13-1.47l.17-.22c.45-.54.92-1.06,1.4-1.56.14-.15.29-.29.44-.43.35-.35.71-.69,1.07-1l.56-.49,1.13-.92.48-.36c.56-.41,1.12-.8,1.71-1.17.36-.23.72-.45,1.09-.66l.35-.19.77-.41c.15-.08.3-.16.46-.23l.6-.29.49-.22c.2-.1.41-.18.62-.27l.5-.21.58-.22.53-.19.59-.2.54-.18.59-.17.56-.16.6-.16.57-.14.66-.14.56-.12.68-.13.55-.09.9-.13.42-.06,1.34-.14h.07l1.4-.1.48,0,1.05,0h.91c.55,0,1.09,0,1.63,0l.51,0,1,.06,1,.09.75.08,1,.13.7.1c.6.1,1.2.21,1.78.34l.25.06c.5.11,1,.23,1.48.37l.92.26.45.14q.7.23,1.38.48c.59.22,1.16.46,1.72.71l.49.23c.42.19.84.4,1.25.61l.48.25.78.45.56.33.8.52.52.34.29.21.81.6.36.28.75.61.32.28c.34.29.68.6,1,.91s.92.92,1.37,1.41l.37.4c.31.35.62.71.92,1.07l.3.37c.39.49.77,1,1.13,1.5l.27.39c.24.35.49.71.72,1.08l.35.55.6,1c.1.18.2.36.31.54.36.65.71,1.31,1,2,.18.36.35.74.52,1.11s.21.51.32.76l.29.69.3.8c.09.23.17.47.26.71s.25.75.38,1.13l.18.56c.17.57.34,1.16.5,1.76h0c.18.67.34,1.37.51,2.08,0,.21.09.42.13.63.12.54.23,1.08.33,1.64.05.25.1.49.14.75s.08.42.11.63c.07.38.13.77.19,1.16l.09.65.18,1.29c0,.19,0,.38.07.57.07.62.14,1.25.2,1.89s.14,1.47.19,2.22c0,.22,0,.45.05.68,0,.53.07,1.07.1,1.62,0,.3,0,.6,0,.91,0,.48.05,1,.06,1.46l0,1,0,1.43c0,.66,0,1.33,0,2h0V145.77C260.83,145.2,260.82,144.65,260.82,144.09Z"/>
<path class="cls-15"
d="M255.6,127.08q5.23,10.67,5.23,30.18a103.75,103.75,0,0,1-1.38,18.21,40.8,40.8,0,0,1-5.09,13.83,32.63,32.63,0,0,1-12.09,11.75,33.35,33.35,0,0,1-16.5,4.14A32.93,32.93,0,0,1,207,199.63a34.21,34.21,0,0,1-12.48-15.37,54.27,54.27,0,0,1-3.12-11.86,92,92,0,0,1-1-14.05,125.91,125.91,0,0,1,1.1-17.57A54.8,54.8,0,0,1,195,127.35a30.64,30.64,0,0,1,11.79-14.18q7.73-4.87,18.46-4.88a36.47,36.47,0,0,1,12.85,2.16,29.6,29.6,0,0,1,10.14,6.33A36.27,36.27,0,0,1,255.6,127.08Zm-15.06,49A112.54,112.54,0,0,0,242,156a101,101,0,0,0-1.51-19.34q-1.51-7.53-5.09-11.38c-2.39-2.56-5.68-3.84-9.9-3.84q-9.08,0-12.61,8.59t-3.54,26.49a107,107,0,0,0,1.51,19.9q1.52,7.74,5.09,11.72a12.37,12.37,0,0,0,9.69,4q6.31,0,9.9-4.13t5-11.82"/>
<path class="cls-14"
d="M323.79,164.63c-1,5.12-2.63,9.07-5,11.82-.27.31-.56.6-.85.88l-.27.24c-.19.17-.39.33-.6.49l-.55.4-.6.38-.38.22q-.42.23-.87.42l-.19.09c-.37.15-.74.28-1.13.4l-.3.08c-.31.09-.63.16-1,.23l-.32.06q-.64.12-1.32.18h-.23c-.44,0-.88.06-1.33.06s-.9,0-1.34-.06l-.71-.08-.76-.1-.21,0a10.34,10.34,0,0,1-1.16-.27c-.25-.07-.48-.16-.72-.24l-.55-.19c-.24-.1-.47-.22-.7-.33l-.48-.23-.21-.13c-.28-.16-.56-.33-.82-.51s-.41-.32-.61-.48a5,5,0,0,1-.43-.34c-.21-.18-.41-.39-.61-.59l-.38-.38c-.27-.3-.52-.62-.77-.94l-.17-.22q-.36-.5-.69-1l-.1-.17c-.21-.34-.41-.68-.6-1.05l-.09-.18c-.2-.39-.4-.79-.58-1.21l-.14-.32q-.26-.6-.48-1.23l-.06-.14c-.17-.48-.33-1-.48-1.48,0-.14-.08-.28-.13-.42-.11-.4-.22-.79-.32-1.2,0-.16-.08-.31-.11-.47-.13-.54-.26-1.1-.37-1.68s-.23-1.24-.34-1.89a.77.77,0,0,0,0-.15c-.1-.61-.19-1.25-.27-1.9,0-.16-.05-.34-.07-.51-.07-.56-.13-1.14-.19-1.73,0-.11,0-.23,0-.34,0-.33-.06-.69-.09-1-.05-.49-.09-1-.13-1.48s-.05-.74-.07-1.12-.07-1-.09-1.5l-.06-1.22c0-.51,0-1-.06-1.55s0-.86,0-1.3,0-1.06,0-1.61c0-.84,0-1.69,0-2.57v11.49c0,.75,0,1.48,0,2.21,0,.12,0,.24,0,.36,0,.54,0,1.08,0,1.61l0,1.3c0,.53,0,1,.06,1.55l.06,1.22c0,.51.06,1,.09,1.5s.05.75.07,1.12.08,1,.13,1.48c0,.3.05.61.07.9,0,0,0,.08,0,.13s0,.22,0,.34c.06.59.12,1.17.19,1.73,0,.17,0,.34.07.51.08.65.17,1.29.27,1.9a.78.78,0,0,1,0,.14c.07.41.14.82.21,1.21,0,.23.08.46.13.69.11.58.24,1.13.37,1.68,0,.16.07.31.11.46s.09.38.14.56l.18.64c.05.15.09.29.13.43.15.49.3,1,.46,1.42l0,.05.06.15q.23.63.48,1.23c.05.11.09.21.14.31s.07.18.11.26c.15.33.31.65.47,1l.09.18c.1.18.2.37.3.54s.2.34.3.51l.1.17.54.81.15.2.17.22a12.06,12.06,0,0,0,.77.94l.06.07c.1.11.22.21.33.32s.39.4.6.59l.43.34c.2.16.4.33.61.47l.07.06c.24.17.5.31.75.46l.21.12,0,0c.15.08.31.14.46.21a6.36,6.36,0,0,0,.7.33c.18.08.37.13.55.19s.47.18.72.25h0c.37.1.74.19,1.12.26l.21,0,.19,0,.57.07.71.08.14,0q.58,0,1.2,0h.26c.36,0,.72,0,1.07,0h.25c.39,0,.77-.09,1.13-.15l.17,0,.32-.06.52-.11c.15,0,.3-.08.44-.12l.3-.09.18,0a9.44,9.44,0,0,0,.89-.32l.06,0,.19-.09c.21-.09.43-.18.63-.29l.24-.14c.13-.06.25-.14.38-.21s.21-.11.31-.18l.29-.2.55-.4c.08-.07.17-.12.25-.18l.35-.31.27-.25a11.68,11.68,0,0,0,.85-.87q3.57-4.14,5-11.82A112.54,112.54,0,0,0,325.24,156V144.47A112.54,112.54,0,0,1,323.79,164.63Z"/>
<path class="cls-14"
d="M344.07,144.09c0-.11,0-.22,0-.34l0-1.43,0-1c0-.49,0-1-.06-1.46,0-.3,0-.61,0-.91,0-.55-.06-1.08-.1-1.62,0-.22,0-.45-.05-.68-.05-.75-.11-1.49-.19-2.22v0c-.06-.63-.13-1.26-.2-1.87,0-.19-.05-.38-.07-.57l-.18-1.28L343,130c-.06-.39-.12-.78-.19-1.16,0-.21-.07-.42-.11-.63s0-.23-.05-.35l-.09-.4c-.1-.55-.21-1.1-.33-1.64,0-.21-.09-.42-.13-.63-.16-.71-.33-1.4-.51-2.08h0c-.16-.6-.34-1.19-.51-1.77l-.18-.56c-.13-.38-.25-.76-.38-1.13a1.72,1.72,0,0,1-.07-.21c-.06-.17-.13-.33-.19-.5l-.3-.79c-.1-.24-.19-.47-.29-.7s-.21-.5-.32-.75l-.11-.26c-.13-.29-.27-.57-.41-.85-.34-.69-.69-1.35-1.05-2l-.14-.25c-.05-.1-.11-.19-.17-.29l-.6-1-.35-.55c-.23-.37-.47-.72-.72-1.08-.07-.1-.14-.22-.22-.32l-.05-.06c-.36-.52-.74-1-1.13-1.5l-.3-.37c-.3-.37-.61-.72-.92-1.07l-.2-.24-.17-.17c-.45-.48-.9-1-1.37-1.4s-.67-.62-1-.92l-.32-.27-.75-.61-.36-.29-.81-.6-.29-.21-.1-.06-.42-.28c-.27-.17-.53-.35-.8-.51s-.37-.23-.56-.34l-.78-.45-.18-.1-.3-.14c-.41-.22-.82-.42-1.25-.62l-.49-.23c-.56-.25-1.13-.49-1.72-.71s-.91-.32-1.37-.47l-.46-.14c-.25-.08-.49-.16-.74-.22l-.17,0c-.49-.13-1-.26-1.49-.37l-.25-.06c-.58-.12-1.18-.23-1.78-.33l-.12,0-.57-.07-1-.14-.75-.07c-.32,0-.65-.07-1-.09l-.24,0-.8,0-.51,0c-.54,0-1.08,0-1.63,0h-.91l-1.05,0-.48,0c-.47,0-.94,0-1.4.09h-.07l-1.34.14-.41.06-.91.13-.13,0-.41.08-.69.12-.56.12-.66.14-.2,0-.37.09-.6.16-.56.16-.59.17-.21.07-.33.11-.59.2-.53.2-.58.21a1.57,1.57,0,0,1-.23.09l-.27.12-.62.27-.49.22-.6.29-.29.14-.17.09-.77.41-.35.2c-.37.21-.73.42-1.09.65l0,0c-.58.36-1.13.75-1.68,1.15-.16.12-.32.24-.47.37s-.45.33-.66.5l-.48.42c-.19.16-.37.31-.55.48q-.56.5-1.08,1l-.44.43c-.48.51-.95,1-1.4,1.56l-.17.22c-.39.48-.77,1-1.13,1.47-.14.19-.27.39-.41.59-.28.4-.55.81-.81,1.24-.14.22-.28.44-.41.66-.26.45-.51.9-.76,1.36l-.33.62c-.34.67-.67,1.36-1,2.07a54.8,54.8,0,0,0-3.44,13.43,125.91,125.91,0,0,0-1.1,17.57v11.49a125.91,125.91,0,0,1,1.1-17.57,54.8,54.8,0,0,1,3.44-13.43c.31-.72.64-1.4,1-2.07l.33-.63c.25-.46.5-.91.76-1.35.13-.22.27-.44.41-.66.26-.43.53-.84.81-1.25l.41-.58c.36-.51.74-1,1.13-1.47l.17-.22c.45-.54.92-1.06,1.4-1.56.14-.15.29-.29.44-.43q.53-.52,1.08-1l.55-.49c.37-.31.75-.62,1.14-.92l.47-.36c.56-.41,1.12-.8,1.71-1.17.36-.23.72-.45,1.09-.66l.35-.19.77-.41c.15-.08.3-.16.46-.23l.6-.29.49-.22c.2-.1.41-.18.62-.27l.5-.21.58-.22.53-.19.59-.2.54-.18.59-.17.56-.16.6-.16.57-.14.66-.14.56-.12.68-.13.55-.09.9-.13.42-.06,1.34-.14h.07l1.4-.1.48,0,1.05,0h.91c.55,0,1.09,0,1.63,0l.51,0,1,.06,1,.09.75.08,1,.13.69.1c.6.1,1.2.21,1.78.34l.25.06c.5.11,1,.23,1.49.37l.91.26.46.14c.46.15.92.31,1.37.48s1.16.46,1.72.71l.49.23c.43.19.84.4,1.25.61l.48.25.78.45.56.33.8.52.52.34.29.21.81.6.36.28.75.61.32.28c.34.29.68.6,1,.91s.92.92,1.37,1.41c.13.13.25.27.37.4.31.35.62.71.92,1.07l.3.37c.39.49.77,1,1.13,1.5l.27.39q.38.52.72,1.08l.35.55.6,1c.1.18.2.36.31.54.36.65.71,1.31,1.05,2,.18.36.35.74.52,1.11s.22.51.32.76l.29.69.3.8c.09.23.17.47.26.71s.25.75.38,1.13l.18.56c.17.57.34,1.16.51,1.76h0c.18.67.35,1.37.51,2.08,0,.21.09.42.13.63.12.54.23,1.08.33,1.64.05.25.1.49.14.75s.08.42.11.63c.07.38.13.77.19,1.16l.09.65.18,1.29c0,.19,0,.38.07.57.07.62.14,1.25.2,1.89s.14,1.47.19,2.22c0,.22,0,.45.05.68,0,.53.07,1.07.1,1.62,0,.3,0,.6,0,.91,0,.48.05,1,.06,1.46l0,1,0,1.43c0,.66,0,1.33,0,2h0V145.77C344.08,145.2,344.07,144.65,344.07,144.09Z"/>
<path class="cls-15"
d="M338.85,127.08q5.23,10.67,5.23,30.18a103.75,103.75,0,0,1-1.38,18.21,40.59,40.59,0,0,1-5.09,13.83,32.63,32.63,0,0,1-12.09,11.75,33.33,33.33,0,0,1-16.5,4.14,32.93,32.93,0,0,1-18.74-5.56,34.12,34.12,0,0,1-12.47-15.37,53.71,53.71,0,0,1-3.13-11.86,92,92,0,0,1-1-14.05,125.91,125.91,0,0,1,1.1-17.57,54.8,54.8,0,0,1,3.44-13.43A30.64,30.64,0,0,1,290,113.17q7.73-4.87,18.46-4.88a36.47,36.47,0,0,1,12.85,2.16,29.6,29.6,0,0,1,10.14,6.33A36.27,36.27,0,0,1,338.85,127.08Zm-15.06,49A112.54,112.54,0,0,0,325.24,156a101,101,0,0,0-1.51-19.34q-1.51-7.53-5.09-11.38t-9.9-3.84q-9.08,0-12.61,8.59t-3.54,26.49a107,107,0,0,0,1.51,19.9q1.51,7.74,5.09,11.72a12.37,12.37,0,0,0,9.69,4q6.31,0,9.9-4.13t5-11.82"/>
<path class="cls-14"
d="M148,177.15c-.37.32-.77.62-1.18.91l-.38.25c-.31.2-.64.4-1,.59l-.35.19c-.45.24-.91.46-1.39.66l-.14.06c-.44.18-.9.34-1.37.49l-.33.11c-.51.15-1,.29-1.56.41l-.31.06c-.46.1-.94.18-1.43.25l-.44.07c-.57.07-1.17.13-1.78.17s-1.48.08-2.25.08l-1.5,0c-.71,0-1.41-.08-2.1-.13l-.47,0q-1-.1-2-.24l-.26-.05c-.77-.11-1.55-.25-2.31-.41l-.14,0c-.77-.16-1.54-.35-2.3-.56l-.63-.17-.09,0a7.67,7.67,0,0,0-1.06-.22h-.13a5.39,5.39,0,0,0-.79-.07H120l-.58,0h-.11l-.48.06-.26,0h-.08l-.59.14-.19,0h0a7.55,7.55,0,0,0-.84.29l-.05,0-.11.06a5.75,5.75,0,0,0-.82.42l-.13.06-.08.06a7.11,7.11,0,0,0-.72.5h0c-.23.18-.45.39-.67.6l-.18.19c-.15.16-.29.32-.43.49l-.18.23q-.21.28-.39.57a1.86,1.86,0,0,0-.11.19,7.68,7.68,0,0,0-.41.81c0,.06,0,.13-.08.2-.08.22-.16.44-.23.67s-.05.2-.08.3-.1.44-.13.66a2.93,2.93,0,0,0,0,.29,7.82,7.82,0,0,0-.06,1V196a7.77,7.77,0,0,1,.06-1,2.5,2.5,0,0,1,0-.29,6.42,6.42,0,0,1,.13-.66c0-.1,0-.2.08-.3s.15-.46.23-.68c0-.06.05-.13.08-.19a9,9,0,0,1,.41-.82,1.74,1.74,0,0,1,.11-.18,5.72,5.72,0,0,1,.39-.57l.18-.24c.14-.16.28-.33.43-.48l.18-.2c.22-.21.44-.41.67-.59l0,0c.23-.18.47-.34.72-.5l.21-.11a5.75,5.75,0,0,1,.82-.42l.16-.08q.41-.16.84-.3l.22-.05.6-.14.33-.05c.16,0,.32-.05.48-.06l.69,0a9.77,9.77,0,0,1,1.07.07h.11a9.77,9.77,0,0,1,1.17.25l.41.12.22.06c.76.2,1.53.4,2.3.56l.14,0c.76.16,1.54.29,2.31.41l.18,0H128q1,.15,2,.24l.47,0c.69.06,1.39.11,2.1.13h0q.75,0,1.5,0c.77,0,1.52,0,2.25-.08h.1q.86-.06,1.68-.18l.44-.06.7-.1.73-.15.31-.06c.45-.1.89-.21,1.32-.34l.24-.07.33-.11c.47-.15.93-.31,1.37-.5l.14-.05.06,0c.46-.2.9-.41,1.33-.64l.35-.19.48-.27.49-.33.38-.25a11.57,11.57,0,0,0,1.18-.91,14.07,14.07,0,0,0,5-9.84c0-.58.08-1.18.08-1.79h0v-8.63A14.53,14.53,0,0,1,148,177.15Z"/>
<g class="cls-16">
<g class="cls-17">
<g class="cls-16">
<path class="cls-14"
d="M172.52,158.33A33.35,33.35,0,0,0,172,155a26.4,26.4,0,0,0-.82-2.78,22.25,22.25,0,0,0-1.16-2.69,21.93,21.93,0,0,0-2-3.24,25.52,25.52,0,0,0-3-3.25,29.16,29.16,0,0,0-7.34-4.85,40.29,40.29,0,0,0-6.32-2.35,42.23,42.23,0,0,0-5.08-1.08c-1.21-.17-2.4-.29-3.56-.35l-1.53-.06c-1,0-2.05,0-3.12,0-1.5,0-3.06,0-4.68.15l-.64.05v8.64l.64,0C135,143,136.53,143,138,143q1.6,0,3.12.06l1.53.06c1.16.06,2.35.17,3.56.35a42.23,42.23,0,0,1,5.08,1.08,39.31,39.31,0,0,1,6.32,2.35,29.16,29.16,0,0,1,7.34,4.85,24.86,24.86,0,0,1,3,3.25,21.84,21.84,0,0,1,2,3.23,22.39,22.39,0,0,1,1.16,2.7,26.4,26.4,0,0,1,.82,2.78,32.36,32.36,0,0,1,.57,3.3,43.27,43.27,0,0,1,.3,4.55v-8.64A43.27,43.27,0,0,0,172.52,158.33Z"/>
<path class="cls-18" d="M172.82,171.52v0"/>
</g>
</g>
</g>
<polygon class="cls-14" points="113.49 159.94 113.49 151.3 117.24 96.8 117.24 105.44 113.49 159.94"/>
<path class="cls-14"
d="M163.16,105.56l.71.16.31.07.29.1.46.17.3.12.37.18c.2.1.39.21.58.32l.25.15a8.15,8.15,0,0,1,.76.55l0,0c.23.19.44.39.65.6l.2.22a6.4,6.4,0,0,1,.42.49l.24.31.18.27c.09.13.17.26.25.39l.16.29c0,.09.09.19.14.29s.2.43.28.65l.12.31a4.77,4.77,0,0,1,.15.54c0,.11.07.22.09.33s.06.33.09.5l.06.37c0,.16,0,.33,0,.5s0,.29,0,.44v-8.76c0-.1,0-.21,0-.32s0-.34,0-.5a.19.19,0,0,1,0-.08,2.93,2.93,0,0,0-.05-.29c0-.17,0-.33-.09-.49s0-.07,0-.1a2.25,2.25,0,0,0-.08-.24,5.44,5.44,0,0,0-.15-.54.57.57,0,0,1,0-.14l-.08-.16c-.08-.23-.18-.44-.28-.66,0,0-.05-.12-.08-.17l-.06-.12c-.05-.1-.11-.19-.16-.28a3.73,3.73,0,0,0-.25-.39l-.18-.28-.13-.18a.69.69,0,0,1-.11-.13,6.4,6.4,0,0,0-.42-.49l-.2-.22a7.21,7.21,0,0,0-.65-.59l0,0a8.15,8.15,0,0,0-.76-.55l-.25-.15c-.19-.11-.38-.22-.58-.32l-.14-.08-.23-.09-.3-.13-.46-.17-.29-.09-.11,0-.2,0c-.23-.06-.47-.11-.71-.15l-.17,0h-.18a5.11,5.11,0,0,0-.55,0l-.25,0H117.24v8.63H161.7c.19,0,.38,0,.56,0l.55.05Z"/>
<path class="cls-15"
d="M161.7,105.43a8.48,8.48,0,1,1,0,17H134.13l-1.42,20.78c1.84-.15,3.62-.21,5.32-.21s3.18,0,4.65.12c7.58.36,16.62,3.36,22.3,8.63s7.84,11.57,7.84,20.58c0,9.94-2.36,16.89-9.22,23.21s-15.9,9.69-27.68,9.69c-6.9,0-12.87,0-18.22-1.53A7.93,7.93,0,0,1,120,188.1a8.4,8.4,0,0,1,2.35.34,42,42,0,0,0,11.75,1.65q8.88,0,13.88-4.31t5-11.63q0-15.36-21.36-15.36a165,165,0,0,0-18.19,1.15l3.75-54.51Z"/>
<path class="cls-19"
d="M309.61,253.46a4.84,4.84,0,0,1-2.85.39c-1-.12-3.07-2.25-4.39-2.8a14.58,14.58,0,0,1-4.61-4c-1.21-1.6-.74-2.07-.43-2.32-.28,1.32,2.22,4.34,5.08,5.86,3.12,1.66,4.45,3.22,5.88,2.76,1.14-.36,2.55-1,3-2.08C311.7,252.68,310.51,253,309.61,253.46Z"/>
<path class="cls-20"
d="M311.11,247.65a22.22,22.22,0,0,0,.27,2.61c.25,1.83-1.65,2.65-3.09,3.11s-2.76-1.1-5.88-2.76-5.8-5.1-4.93-6.18c.82-.68,3.19-.55,5.14.64a29.2,29.2,0,0,1,3.05,2.09h0c-.06-.19-.12-.35-.14-.43-.09-.3.29-.74.8-.33s3.09,0,4.17-.57l.09-.05c1-.58.87.29.64,1A2.84,2.84,0,0,0,311.11,247.65Z"/>
<path class="cls-21" d="M310.5,245.83l.09-.05c1-.58.87.29.64,1a2.84,2.84,0,0,0-.12.86"/>
<path class="cls-21" d="M305.3,248.31c.69.11.54-.62.37-1.14"/>
<path class="cls-22"
d="M297.34,244.74h0c-.31.25-.78.72.43,2.32a14.58,14.58,0,0,0,4.61,4c1.32.55,3.38,2.68,4.39,2.8a4.84,4.84,0,0,0,2.85-.39c.9-.44,2.09-.78,1.66-2.17"/>
<path d="M305.76,168.75c-.06.15-.45.76-.45.76l-.15.14-.47-.18-.45.3-.4-.22s-.06-.5-.36.1c-.12-.28-.86-.23-1.74-.76a3.15,3.15,0,0,1-1.06-2.71c.11-.61.69-.93.34-1.31s-.48-.24-.75-.08-.6-.32-1.62-.65c-.09,0-1.12-2.63-.77-3.79a4.24,4.24,0,0,1,2.16-3,7,7,0,0,1,5.12-.66c1.72.52,3.43.94,4.08,4.66a6.34,6.34,0,0,1-1.61,6,3.79,3.79,0,0,1-1.07.88C306.25,168.51,306,168.2,305.76,168.75Z"/>
<path class="cls-23"
d="M316.53,186.52a3.29,3.29,0,0,1-1.34,1,4.82,4.82,0,0,1-3.3.2c.15-3.54.27-6.22.27-6.22l1-7.75a1.23,1.23,0,0,1,.27.52C314.07,176.7,315.88,183.71,316.53,186.52Z"/>
<path class="cls-24"
d="M315.34,191.29v0a1.5,1.5,0,0,1-1.84,1.57l-2.69-1.24c.06-1.78,1-2.38,1.08-4a4.82,4.82,0,0,0,3.3-.2Z"/>
<path class="cls-25"
d="M300.82,166.25a2.91,2.91,0,0,0,.92,2.45c.77.47,1.43.43,1.53.68l.33-.68.33.79.25-.66.57.55.08-.8s.37.94.43.8c.19-.49.23-.43.5-.63-.12,1.32-.46,3.57.47,3.71l.54.08c-1.08,1.73-6,1.17-6.78.2a2.38,2.38,0,0,0,1.16-.67c.59-1,.86-3,0-3.27a2.47,2.47,0,0,1-1.88-2.11c-.11-.51-.23-1.65-.33-2.45h0c.89.29,1.14.59,1.36.46a.62.62,0,0,1,.87.14C301.44,165.18,300.91,165.69,300.82,166.25Z"/>
<path class="cls-26"
d="M294.81,182.83a.83.83,0,0,1-.41,1.1L285,188.22a.83.83,0,0,1-1.1-.41l-6.05-13.32a.83.83,0,0,1,.41-1.1l9.45-4.29a.83.83,0,0,1,1.1.41Z"/>
<path class="cls-27"
d="M288.29,170.34l5.14,11.31a.72.72,0,0,1-.36,1l-8.24,3.75a.73.73,0,0,1-1-.36l-5.14-11.31a.72.72,0,0,1,.36-1l8.24-3.75A.73.73,0,0,1,288.29,170.34Z"/>
<circle class="cls-27" cx="289.29" cy="185.23" r="0.5" transform="translate(57.59 438.83) rotate(-80.22)"/>
<path class="cls-25"
d="M285.93,190.32s-1.4-1.52-2-2.13-1.86-2.34-2-2.46-1.82-5.36-2.18-5.62.5-.8,1.14.51,1.86,3,2.43,3,.31-1.59.72-1.85.35,0,.5.15-.34,2,.09,2.65.34,1.79.66,2.29l1.84,2.88Z"/>
<path class="cls-25"
d="M284.63,188.92s3.61,4.34,7,6c.17.08,1.22.48,1.51-.1a24.27,24.27,0,0,0,1-4.75c.07-.34.25-4,.25-4L290.88,185l-.28,5.53a.06.06,0,0,1-.09.05l-4.73-2.84Z"/>
<path class="cls-20"
d="M313.16,173.71l-1,7.75s-.12,2.68-.27,6.22c-.07,1.59-.14,3.35-.2,5.13-.19,5.23-.33,10.58-.15,11.9l-.28,0c-1.85.25-11.81.82-15.38.24a3.6,3.6,0,0,1-1-.29c.28-1.59.43-20.67.43-20.67s-.35,2.07-.51,3.67c-1.63.6-2.42.32-4.63-.63.18-1.38,1.93-9.68,3.19-12.13a2.78,2.78,0,0,1,2.15-1.29h0a26.47,26.47,0,0,0,4.5-.92c.76,1,5.7,1.53,6.78-.2,1.28.18,4.1.53,5.54.71A1.31,1.31,0,0,1,313.16,173.71Z"/>
<path class="cls-28"
d="M311.26,204.76,310.1,225l0,21c-.53.24-3,.89-3.86.38l-1-20.22-1-16.14a.67.67,0,0,0-.73-.63.65.65,0,0,0-.44.2.71.71,0,0,0-.19.44l-2.76,16.56L299.6,243v.05l-.27,4.33c-1.13.44-3.76.56-4.21.12l-.74-22.18,1.5-20.36C299.45,205.58,309.41,205,311.26,204.76Z"/>
<path class="cls-19"
d="M300.08,252.26a4.88,4.88,0,0,1-2.65,1.13c-1,.15-3.56-1.37-5-1.55a14.41,14.41,0,0,1-5.5-2.63c-1.59-1.22-1.25-1.8-1-2.12.07,1.34,3.28,3.6,6.44,4.32,3.44.78,5.13,1.94,6.4,1.11,1-.65,2.21-1.59,2.33-2.79C301.88,251,300.83,251.6,300.08,252.26Z"/>
<path class="cls-20"
d="M300,246.27a22.16,22.16,0,0,0,.95,2.44c.72,1.7-.89,3-2.16,3.81s-3-.33-6.4-1.11-6.94-3.39-6.39-4.66c.62-.88,2.94-1.37,5.13-.74a30.64,30.64,0,0,1,3.5,1.21h0l-.26-.38c-.16-.26.09-.79.69-.53s3-.82,3.87-1.64l.08-.07c.83-.84.91.05.88.81A3.07,3.07,0,0,0,300,246.27Z"/>
<path class="cls-21" d="M298.92,244.67l.08-.07c.83-.84.78.06.88.81a18.24,18.24,0,0,0,1.23,4.32"/>
<path class="cls-21" d="M294.56,248.43c.69-.07.36-.75.06-1.2"/>
<path class="cls-22"
d="M285.94,247.08h0c-.23.32-.57.9,1,2.12a14.41,14.41,0,0,0,5.5,2.63c1.41.18,4,1.7,5,1.55a4.88,4.88,0,0,0,2.65-1.13c.75-.66,1.8-1.3,1-2.53"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 34 KiB

@@ -0,0 +1,133 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
<defs>
<style>
.cls-1,.cls-2,.cls-28,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#3ba7f5;}.cls-14{fill:#53bef5;}.cls-15{fill:#2d8ce9;}.cls-16{fill:#7798b9;}.cls-17{fill:#728cb9;}.cls-18{fill:#a4c0d9;}.cls-19{fill:#ffb056;}.cls-20{fill:#ebfcff;}.cls-21{fill:#257fba;}.cls-22{fill:#398eed;}.cls-23{fill:#e49056;}.cls-24{fill:#ffbf76;}.cls-25{fill:#f0dabc;}.cls-26{fill:#ffeed2;}.cls-27{fill:#fae6d2;}.cls-28{stroke:#4986d9;stroke-width:0.12px;}.cls-29{fill:#e55c5c;opacity:0.2;}
</style>
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#81cfff"/>
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
</linearGradient>
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
</defs>
<title>开发中</title>
<g id="图层_2" data-name="图层 2">
<g id="图层_1-2" data-name="图层 1">
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
<g class="cls-8">
<path class="cls-9"
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
<path class="cls-10"
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
<path class="cls-11"
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
<path class="cls-12"
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
</g>
<path class="cls-13"
d="M183.16,83.07a36,36,0,1,0,36,36A36,36,0,0,0,183.16,83.07Zm1.52,8.36a27.65,27.65,0,0,1,21.65,12.5l-10,5.75a16.19,16.19,0,0,0-11.69-6.75Zm-3,0v11.5A16.19,16.19,0,0,0,170,109.68l-10-5.75A27.68,27.68,0,0,1,181.64,91.43Zm-26.15,27.63a27.59,27.59,0,0,1,3-12.5l10,5.75a16.23,16.23,0,0,0,0,13.5l-10,5.75A27.59,27.59,0,0,1,155.49,119.06Zm26.15,27.63A27.68,27.68,0,0,1,160,134.19l10-5.75a16.19,16.19,0,0,0,11.69,6.75Zm0-19.76a8,8,0,0,1-4.53-2.62,8.23,8.23,0,0,1-1.52-2.63,8,8,0,0,1,0-5.24,8.23,8.23,0,0,1,1.52-2.63,8,8,0,0,1,4.53-2.61,7.78,7.78,0,0,1,3,0,8,8,0,0,1,4.53,2.61,8,8,0,0,1,0,10.5,8,8,0,0,1-4.53,2.62,8.42,8.42,0,0,1-1.52.14A8.51,8.51,0,0,1,181.64,126.93Zm3,19.76v-11.5a16.19,16.19,0,0,0,11.69-6.75l10,5.75A27.65,27.65,0,0,1,184.68,146.69Zm23.17-15.13-10-5.75a16.23,16.23,0,0,0,0-13.5l10-5.75a27.71,27.71,0,0,1,0,25Z"/>
<path class="cls-13" d="M152.32,151.4a46.16,46.16,0,0,0,4.35,3.65l5.59-6.66a36.17,36.17,0,0,1-4.35-3.66Z"/>
<path class="cls-13" d="M165.24,160a45.84,45.84,0,0,0,5.34,1.94l3-8.18a35,35,0,0,1-5.34-1.94Z"/>
<path class="cls-13"
d="M147.31,122.5,138.75,124a45.19,45.19,0,0,0,1,5.6l8.56-1.51A35.83,35.83,0,0,1,147.31,122.5Z"/>
<path class="cls-13"
d="M153.49,98.65,146,94.3a45.28,45.28,0,0,0-2.85,4.92l7.53,4.35A37.49,37.49,0,0,1,153.49,98.65Z"/>
<path class="cls-13"
d="M180.32,155v8.7c.94.06,1.89.09,2.84.09s1.9,0,2.84-.09V155c-.93.08-1.88.11-2.84.11S181.26,155,180.32,155Z"/>
<path class="cls-13"
d="M148.29,110l-8.56-1.51a44.55,44.55,0,0,0-1,5.6l8.56,1.51A35.42,35.42,0,0,1,148.29,110Z"/>
<path class="cls-13"
d="M219,115.63l8.57-1.51a44.55,44.55,0,0,0-1-5.6L218,110A35.42,35.42,0,0,1,219,115.63Z"/>
<path class="cls-13"
d="M192.77,153.77l3,8.18a46.52,46.52,0,0,0,5.34-1.94l-3-8.18A34.66,34.66,0,0,1,192.77,153.77Z"/>
<path class="cls-13"
d="M218,128.1l8.57,1.51a45.19,45.19,0,0,0,1-5.6L219,122.5A35.83,35.83,0,0,1,218,128.1Z"/>
<path class="cls-13"
d="M212.83,139.47l7.54,4.35a44.28,44.28,0,0,0,2.84-4.92l-7.53-4.35A34.8,34.8,0,0,1,212.83,139.47Z"/>
<path class="cls-13"
d="M204.06,148.39l5.59,6.66A46.16,46.16,0,0,0,214,151.4l-5.59-6.67A35.41,35.41,0,0,1,204.06,148.39Z"/>
<path class="cls-13"
d="M150.64,134.55l-7.53,4.35a44.35,44.35,0,0,0,2.85,4.92l7.53-4.35A36.85,36.85,0,0,1,150.64,134.55Z"/>
<path class="cls-13" d="M201.09,78.12a44.75,44.75,0,0,0-5.34-2l-3,8.18a35.73,35.73,0,0,1,5.34,1.94Z"/>
<path class="cls-13"
d="M162.26,89.73l-5.59-6.66a44.79,44.79,0,0,0-4.35,3.66l5.59,6.66A37.12,37.12,0,0,1,162.26,89.73Z"/>
<path class="cls-13" d="M214,86.73a44.79,44.79,0,0,0-4.35-3.66l-5.59,6.66a36.31,36.31,0,0,1,4.35,3.66Z"/>
<path class="cls-13"
d="M215.68,103.57l7.53-4.35a45.2,45.2,0,0,0-2.84-4.92l-7.54,4.35A35.37,35.37,0,0,1,215.68,103.57Z"/>
<path class="cls-13"
d="M173.55,84.35l-3-8.18a44.13,44.13,0,0,0-5.34,2l3,8.17A36.14,36.14,0,0,1,173.55,84.35Z"/>
<path class="cls-13"
d="M186,83.16v-8.7c-.94,0-1.88-.08-2.84-.08s-1.9,0-2.84.08v8.7c.94-.07,1.89-.11,2.84-.11S185.07,83.09,186,83.16Z"/>
<path class="cls-14"
d="M315,95.08c0-.78,0-1.56-.07-2.33l13.18-2.67a52.88,52.88,0,0,0-1.46-8.31l-13.3,2a38.88,38.88,0,0,0-1.59-4.39l11.47-7A52.22,52.22,0,0,0,319,65.07l-11.81,6.42a39.35,39.35,0,0,0-3-3.57l8.38-10.52A53.13,53.13,0,0,0,306.13,52l-8.9,10.07a40.34,40.34,0,0,0-4-2.33L297.46,47a51.91,51.91,0,0,0-7.92-2.89L284.62,56.6a38.62,38.62,0,0,0-4.59-.81l-.35-13.44c-1.39-.11-2.8-.16-4.21-.16s-2.83.05-4.22.16l-.35,13.44a38.62,38.62,0,0,0-4.59.81l-4.92-12.52A52.3,52.3,0,0,0,253.47,47l4.27,12.75a40.34,40.34,0,0,0-4,2.33L244.8,52a53.13,53.13,0,0,0-6.46,5.42l8.38,10.52a39.35,39.35,0,0,0-3,3.57l-11.81-6.42a52.22,52.22,0,0,0-4.23,7.29l11.47,7a38.88,38.88,0,0,0-1.59,4.39l-13.3-2a52.88,52.88,0,0,0-1.46,8.31L236,92.75c0,.77-.07,1.55-.07,2.33s0,1.56.07,2.33l-13.18,2.68a52.75,52.75,0,0,0,1.46,8.3l13.3-2a38.72,38.72,0,0,0,1.59,4.38l-11.47,7a52.92,52.92,0,0,0,4.23,7.3l11.81-6.42a39.35,39.35,0,0,0,3,3.57l-8.38,10.51a53.21,53.21,0,0,0,6.46,5.43l8.9-10.08a38.57,38.57,0,0,0,4,2.34l-4.27,12.75a52.27,52.27,0,0,0,7.92,2.88l4.92-12.51a40.74,40.74,0,0,0,4.59.8l.35,13.44c1.39.11,2.8.17,4.22.17s2.82-.06,4.21-.17l.35-13.44a40.74,40.74,0,0,0,4.59-.8l4.92,12.51a51.88,51.88,0,0,0,7.92-2.88l-4.27-12.75a38.57,38.57,0,0,0,4-2.34l8.9,10.08a53.21,53.21,0,0,0,6.46-5.43l-8.38-10.51a39.35,39.35,0,0,0,3-3.57L319,125.1a52.92,52.92,0,0,0,4.23-7.3l-11.47-7a38.72,38.72,0,0,0,1.59-4.38l13.3,2a52.75,52.75,0,0,0,1.46-8.3L315,97.41C315,96.64,315,95.86,315,95.08ZM275.47,109a13.92,13.92,0,1,1,13.92-13.92A13.92,13.92,0,0,1,275.47,109Z"/>
<path class="cls-15"
d="M255.6,166.39l-2.67-1.56a1.87,1.87,0,0,1-.83-2.23,16.84,16.84,0,0,0,.56-2,1.89,1.89,0,0,1,1.87-1.51h3.08c0-.42.06-.85.07-1.27v-.73c0-.44,0-.88-.06-1.31l-3.1,0a1.88,1.88,0,0,1-1.83-1.52,18.52,18.52,0,0,0-.54-2.07,1.86,1.86,0,0,1,.85-2.22l2.69-1.54c-.18-.39-.38-.79-.59-1.17l-.36-.63c-.22-.37-.45-.73-.68-1.08L251.39,147a1.91,1.91,0,0,1-2.37-.41,17.8,17.8,0,0,0-1.5-1.51,1.88,1.88,0,0,1-.37-2.35l1.56-2.67c-.45-.31-.91-.61-1.4-.89s-1-.55-1.46-.79l-1.56,2.67a1.87,1.87,0,0,1-2.24.83,16.22,16.22,0,0,0-2-.56,1.9,1.9,0,0,1-1.52-1.87l0-3.08c-.42,0-.85-.06-1.27-.07h-.73c-.44,0-.88,0-1.32.05v3.1a1.88,1.88,0,0,1-1.52,1.83,16.62,16.62,0,0,0-2.07.55,1.88,1.88,0,0,1-2.22-.86l-1.54-2.69c-.4.18-.79.38-1.17.59l-.63.36q-.56.33-1.08.69l1.52,2.68a1.9,1.9,0,0,1-.4,2.37,16.33,16.33,0,0,0-1.51,1.49,1.88,1.88,0,0,1-2.35.37l-2.67-1.56c-.32.45-.61.92-.9,1.4h0c-.28.48-.54,1-.78,1.46l2.67,1.56a1.87,1.87,0,0,1,.83,2.24,16.36,16.36,0,0,0-.56,2.05,1.91,1.91,0,0,1-1.87,1.51l-3.08,0c0,.43-.06.85-.07,1.27v.73q0,.66.06,1.32l3.1,0a1.87,1.87,0,0,1,1.83,1.52,17.8,17.8,0,0,0,.54,2.06,1.88,1.88,0,0,1-.85,2.23l-2.69,1.53c.18.4.38.79.59,1.18l.36.63c.22.36.45.72.68,1.07l2.68-1.52a1.89,1.89,0,0,1,2.37.4,16.44,16.44,0,0,0,1.5,1.51,1.88,1.88,0,0,1,.37,2.35l-1.56,2.67c.45.32.91.62,1.4.9s1,.54,1.46.78l1.56-2.67a1.89,1.89,0,0,1,2.24-.83,15.07,15.07,0,0,0,2,.56,1.91,1.91,0,0,1,1.52,1.87l0,3.09c.42,0,.85.06,1.27.07H237c.44,0,.88,0,1.32-.06v-3.09a1.88,1.88,0,0,1,1.52-1.84,16.57,16.57,0,0,0,2.07-.54,1.9,1.9,0,0,1,2.23.85l1.53,2.7q.6-.28,1.17-.6l.63-.36c.37-.22.73-.44,1.08-.68L247,171.93a1.89,1.89,0,0,1,.4-2.37,15.26,15.26,0,0,0,1.51-1.5,1.88,1.88,0,0,1,2.35-.37l2.67,1.57c.32-.46.61-.92.9-1.4h0C255.1,167.37,255.36,166.89,255.6,166.39ZM241,150.18a1.4,1.4,0,1,1,1.81-.47A1.4,1.4,0,0,1,241,150.18Zm-3,7.73a1.4,1.4,0,1,1-.47-1.8A1.4,1.4,0,0,1,238,157.91Zm-11.54.59a1.4,1.4,0,1,1,1.81-.48A1.4,1.4,0,0,1,226.43,158.5Zm3.1-5.44a4.81,4.81,0,1,1,6.59-1.72A4.87,4.87,0,0,1,229.53,153.06Zm-.09,16.77a4.82,4.82,0,1,1,6.58-1.72A4.82,4.82,0,0,1,229.44,169.83ZM240.93,167a1.39,1.39,0,1,1,1.8-.47A1.39,1.39,0,0,1,240.93,167Zm3.12-5.47a4.82,4.82,0,0,1-1.73-6.59,4.88,4.88,0,0,1,6.59-1.73,4.82,4.82,0,0,1-4.86,8.32Z"/>
<polygon class="cls-16" points="318.66 225.37 319.65 228.74 302.95 229.82 302.09 226.6 318.66 225.37"/>
<polygon class="cls-16" points="313.14 206.61 314.2 210.22 297.71 210.22 296.74 206.61 313.14 206.61"/>
<polygon class="cls-16" points="308.26 190 309.06 192.72 292.68 191.39 291.93 188.6 308.26 190"/>
<polygon class="cls-16" points="303.44 173.61 304.26 176.4 288.02 173.99 287.26 171.13 303.44 173.61"/>
<polygon class="cls-16" points="299.11 158.87 300.01 161.93 283.85 158.4 283.21 156 299.11 158.87"/>
<polygon class="cls-16" points="295.05 145.06 295.98 148.25 280.06 144.21 279.46 141.99 295.05 145.06"/>
<polygon class="cls-17"
points="290.44 120.62 325.45 235.84 321.74 235.84 319.65 228.74 318.66 225.37 314.2 210.22 313.14 206.61 309.06 192.72 308.26 190 304.26 176.4 303.44 173.61 300.01 161.93 299.11 158.87 295.98 148.25 295.05 145.06 292.04 134.82 291.46 132.84 287.86 120.62 290.44 120.62"/>
<polygon class="cls-16"
points="291.46 132.84 292.04 134.82 276.5 130.9 276.5 130.9 275.85 128.48 291.46 132.84"/>
<polygon class="cls-18"
points="297.71 210.22 302.09 226.6 302.95 229.82 304.56 235.84 300.85 235.84 271.17 120.62 273.75 120.62 275.85 128.48 276.5 130.9 276.5 130.9 279.46 141.99 280.06 144.21 283.21 156 283.85 158.4 287.26 171.13 288.02 173.99 291.93 188.6 292.68 191.39 296.74 206.61 297.71 210.22"/>
<path class="cls-19"
d="M321.9,225.09c.37.56,1.1,1.95.75,2.94h0a1.46,1.46,0,0,1-.9.87c-1.84.73-3.15,1.16-3.81-.17a4.4,4.4,0,0,0-2.05-2.32c-1-.63-3.84-.21-4.13-.54a1.84,1.84,0,0,1-.42-1.4,2.47,2.47,0,0,1,.3-1c.63-1.22,1.48-2,2.14-2.09a3.61,3.61,0,0,1,1.51.34l.19.64.3-.07c.16.19.53.21.7.83s.91,1,1.25.64.06-.79.38-.89,1.1-.14,1.88-.2l1.13-.08A9.32,9.32,0,0,0,321.9,225.09Z"/>
<path class="cls-20"
d="M317.94,228.74c.66,1.33,2,.9,3.81.17a1.46,1.46,0,0,0,.9-.87c-.1.66-.26,1.2-.82,1.45a7.12,7.12,0,0,1-3.63.33c-.82-.34-1.24-1.18-1.94-2.06a4,4,0,0,0-2.35-1.34c-.42,0-2.18.24-2.72-.09s0-1.26.14-1.85h0a1.84,1.84,0,0,0,.42,1.4c.29.33,3.11-.09,4.13.54A4.4,4.4,0,0,1,317.94,228.74Z"/>
<path class="cls-20"
d="M304.09,210.39a2.37,2.37,0,0,1-2.4-.89c-.53-.48-1.95-2.78-2.57-3s-.6,0-1.3.14-.42-.37-.43-1a2.86,2.86,0,0,0,0,.3c.09.29.38.49,1,0s.91-.58,1.43-.13,2.26,3.41,3.14,3.94,1.9,0,3.09-.77c.75-.52.94-1,.9-1.49a2.56,2.56,0,0,1-.2,1.69A6.74,6.74,0,0,1,304.09,210.39Z"/>
<path class="cls-19"
d="M298.38,205.9c-.58.54-.87.34-1,0a2.86,2.86,0,0,1,0-.3c-.05-.85.13-3.07,2.28-3l1,2.15.73-.34.28.61a1.39,1.39,0,0,1,1.46-.08c0-.55-.13-1-.14-1.29a.56.56,0,0,1,.09-.4,5.92,5.92,0,0,1,1.28-.77h0a1.69,1.69,0,0,1,.72-.22c.37.59.34,1.78.74,2s.6,1.21.87,2.15a4.52,4.52,0,0,1,.21.93h0c0,.51-.15,1-.9,1.49-1.19.81-2.2,1.31-3.09.77s-2.62-3.5-3.14-3.94S299,205.36,298.38,205.9Z"/>
<polygon class="cls-21"
points="315.29 221.75 309.06 200.32 307.74 184.01 315.52 180.55 315.21 200.32 319.65 221.5 315.78 222.32 315.48 222.39 315.29 221.75"/>
<path class="cls-22"
d="M315,175l.52,5.55a2,2,0,0,1-1.58,2.15l-6.2,1.31-9.05,1.91,5.71,16.65h0a5.92,5.92,0,0,0-1.28.77.56.56,0,0,0-.09.4l-1.6.76-.73.34-1-2.15-8.86-18.49a1.71,1.71,0,0,1,.77-2.36l13.82-6.65.11-1C307.05,175,309.88,175.74,315,175Z"/>
<path class="cls-23" d="M310.63,148c1.28-.16,3.5,2.18,3.34,5.77h0A21,21,0,0,0,310.63,148Z"/>
<path class="cls-24"
d="M309.21,151.24c3,4.95-.18,5.31-2.06,5.92a35,35,0,0,1-4.08.45l-2.17.15-.42-2.45-.85-4.88a25.9,25.9,0,0,1,4.82-.6C306.39,149.79,308.37,150.08,309.21,151.24Z"/>
<path class="cls-19"
d="M309.21,151.24c-.84-1.16-2.82-1.45-4.76-1.41l.13-.42h0a6.12,6.12,0,0,0,5.18-1.62l.39-.35s.17.19.46.55a21,21,0,0,1,3.34,5.77,13.81,13.81,0,0,1,.75,3.12,117.36,117.36,0,0,1,1,18L315,175c-5.12.74-7.95,0-9.49-.85a3.67,3.67,0,0,1-1.76-1.78l-.13-2.94-.31-6.58-.24-5.17v-.07a35,35,0,0,0,4.08-.45C309,156.55,312.23,156.19,309.21,151.24Z"/>
<path class="cls-25"
d="M320,222.7h0c-.78.06-1.68.15-1.88.2s-.15.49-.38.89-1.08,0-1.25-.64-.54-.64-.7-.83l3.87-.82Z"/>
<path class="cls-25" d="M301.43,204.5l1.6-.76c0,.31.13.74.14,1.29a1.39,1.39,0,0,0-1.46.08Z"/>
<path class="cls-26"
d="M299.63,150.43l.85,4.88-6.91-1.52L284.11,144c-.56-1.1-2.48-1.8-3.41-2-.48-3.37,4.61-2.59,5.1-2.32s.1,1.73.11,2.32l8.8,8.1Z"/>
<path class="cls-27"
d="M303.31,162.85l.31,6.58s-5-7.55-5.38-8c-.62.21-1.25-.15-2.17-.59s-1.7-.31-1.7-1.2c0-.47.87-.33,1.38-.1a6.38,6.38,0,0,0-1.54-1.64c.24-1.49,3.44-2,4.77-1.24a7.42,7.42,0,0,0,.76,3C299.87,160.2,303.31,162.85,303.31,162.85Z"/>
<path class="cls-26"
d="M308.34,144.67a5.4,5.4,0,0,0,1.11,2.78l.33.35a6.12,6.12,0,0,1-5.18,1.62h0l.43-1.26c.4-.17-.13-1.36-.45-1.83.16,0,.32,0,.48-.06a4.74,4.74,0,0,0,3-1.62Z"/>
<path class="cls-26"
d="M305,146.26c-.16,0-.32.05-.48.06a4.08,4.08,0,0,1-1.39-.06,3,3,0,0,1-2.16-2.52c-.34-.49-1-.2-1-.93.06-.89,1.13-1.23,1.28-2.88a4.18,4.18,0,0,1,3.8-3.33c2.21,0,4,2.21,4,4.94a4.47,4.47,0,0,1-4,4.72Z"/>
<path class="cls-28"
d="M297.39,205.65c0,.64-.27,1.14.43,1s.69-.35,1.3-.14,2,2.5,2.57,3a2.37,2.37,0,0,0,2.4.89,6.74,6.74,0,0,0,2.65-1.25,2.56,2.56,0,0,0,.2-1.69h0"/>
<path class="cls-28"
d="M311.33,224.48c-.13.59-.68,1.52-.14,1.85s2.3,0,2.72.09a4,4,0,0,1,2.35,1.34c.7.88,1.12,1.72,1.94,2.06a7.12,7.12,0,0,0,3.63-.33c.56-.25.72-.79.82-1.45h0"/>
<path d="M300.9,138.55c-.08.49-.21,1.21.34,1.41,1,.46,1.79-.42,2.31-.21s1,.24,1,.72.84,1.08.82,1.31a1,1,0,0,0,.15.79c.28.53.76.3,1.17.73s.23.73.47.81.66,0,.78.1.09.64.66.49.64-.64.72-1.14,1-.9,1.32-1.23,2.05-1.75.83-4.89a4.68,4.68,0,0,0-6-2.76,3,3,0,0,0-2.94-.29c-1.38.92-.87,2.11-1.39,2.55s-.69.25-1.15.09-.79-.1-.88.16a1,1,0,0,0,.23,1.2A1.27,1.27,0,0,0,300.9,138.55Z"/>
<ellipse class="cls-26" cx="305.48" cy="141.34" rx="1.37" ry="0.94"
transform="translate(126.81 426.6) rotate(-82.77)"/>
<ellipse class="cls-26" cx="305.47" cy="141.44" rx="0.61" ry="1.17"
transform="translate(-23.34 69.3) rotate(-12.47)"/>
<ellipse class="cls-29" cx="305.47" cy="141.44" rx="0.36" ry="0.69"
transform="translate(-23.34 69.3) rotate(-12.47)"/>
<path class="cls-23" d="M310.17,147.45a4.24,4.24,0,0,0-.72,0l.33.35Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 26 KiB

@@ -0,0 +1,178 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
<defs>
<style>
.cls-1,.cls-2,.cls-21,.cls-22,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;}.cls-1,.cls-17,.cls-2,.cls-21,.cls-22,.cls-3,.cls-4,.cls-5,.cls-6{stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#f0dabc;}.cls-14{fill:#e55c5c;opacity:0.2;}.cls-15{fill:#ffbf76;}.cls-16{fill:#ffeed2;}.cls-17{stroke:#000;}.cls-17,.cls-22{stroke-width:0.21px;}.cls-18{fill:#ffb056;}.cls-19{fill:#e49056;}.cls-20{fill:#f5f5f5;}.cls-21{stroke:#4986d9;stroke-width:0.1px;}.cls-22{stroke:#ffb056;}.cls-23{fill:#ccc;}.cls-24{fill:#e8e8e8;}.cls-25{fill:#257fba;}.cls-26{fill:#398eed;}.cls-27{fill:#53bef5;}.cls-28{fill:#fff;}
</style>
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#81cfff"/>
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
</linearGradient>
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
</defs>
<title>加载失败_1</title>
<g id="图层_2" data-name="图层 2">
<g id="图层_1-2" data-name="图层 1">
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
<g class="cls-8">
<path class="cls-9"
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
<path class="cls-10"
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
<path class="cls-11"
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
<path class="cls-12"
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
</g>
<path class="cls-13"
d="M242.46,224.89c0-.06,0-.14,0-.24-.06-.39-1.11-21.66-1.11-21.66l1.78-9.2c-1.87,0-6.4-1.73-6.4-1.73l-1.05,8.26a13.51,13.51,0,0,0-.06,3.36c.87,4.18,3.39,19.87,3.62,21.4h0a2.33,2.33,0,0,1,.05.46c-.06.28-.57.25-.61.43.11,0,.43.74.5.78a3.47,3.47,0,0,0,2.71-.08h0a2,2,0,0,0,.88-1.22C242.62,225.21,242.53,225.22,242.46,224.89Z"/>
<path class="cls-14"
d="M236.5,193.59c-.21,1.54-.56,4.41-.64,5,.46.15,1.53-.15,1.47-.73C237.24,197,237.38,194.38,236.5,193.59Z"/>
<path class="cls-15"
d="M228.89,172.19c-.61-2.39-1.16-4.53-1.16-4.57v-.05c0-.11,0-.23,0-.35a3,3,0,0,1,5.79-.78l1.67,5.81c-.21,0-.54-.1-.94-.15-1.44-.15-3.8-.13-5,1.44v0C229.12,173.11,229,172.64,228.89,172.19Z"/>
<path class="cls-15"
d="M234.33,172.84l-.1-.74h0c.4.05.73.11.94.15C235.11,172.44,234.45,172.82,234.33,172.84Z"/>
<path class="cls-15"
d="M230.34,173.56l-.22-.81h0a3.09,3.09,0,0,0-.88.81C229.3,173.75,230.26,173.58,230.34,173.56Z"/>
<path class="cls-13"
d="M236.72,193.32a4,4,0,0,1-1.08-2.09l0-10.61a9.14,9.14,0,0,0-.17-1.73l-1.28-6.79a9.65,9.65,0,0,0-2.35,0,4.79,4.79,0,0,0-1.76.62l2.43,8.69,1.34,9.62a7.58,7.58,0,0,0,.32,1.41,51.11,51.11,0,0,1,1.65,5.67c-.07.53,1.46.24,1.37-.62S237.6,194.1,236.72,193.32Z"/>
<path class="cls-16"
d="M229.26,163c2.14.89-.14,2.84-1.12,3.48-.1-.22-.21-.48-.31-.72a.18.18,0,0,0-.1-.09.74.74,0,0,0-.63,0c-.33.18-.48,1.62-1.79,2.06a4.6,4.6,0,0,1-2.61-.19c-.32.29-.62.59-1,.34s-.44-1.13-.61-1.47-1.36-1.28-1.62-1.7c-.7-1,1-4.17,2.91-4.67,1.24-.47,3.62,1.51,4.61,2A11,11,0,0,0,229.26,163Z"/>
<path class="cls-17"
d="M218.89,159.61a5,5,0,0,0-1.16,3.28c.1,1.66,2.2,3,2.21,2.35a.44.44,0,0,1,.45-.59s-.08-.55.11-.7.39.06.39.06a3.84,3.84,0,0,1,.22-.81c1-1.2,1-1,1.58-.81.14,0,.21-.39.34-.41a13.47,13.47,0,0,1,1.51.91c-.17-.2-.85-.81-.72-1.36a.59.59,0,0,1,.16-.38.76.76,0,0,1,1.07.07.84.84,0,0,1,.26.83c.69.32,1.35.67,1.35.67l-.52-.54.67.2-.21-.29.41,0-.48-.29c-.22-.37.05-1-.39-1.83a3.4,3.4,0,0,0-2.65-2.07A5.84,5.84,0,0,0,218.89,159.61Z"/>
<ellipse class="cls-14" cx="224.56" cy="161.76" rx="0.35" ry="0.47"
transform="translate(-52.16 157.71) rotate(-34.93)"/>
<path class="cls-14"
d="M226.48,166.78a3.62,3.62,0,0,0,.16-2.42,2.06,2.06,0,0,1,.43,1.36A10.11,10.11,0,0,0,226.48,166.78Z"/>
<path class="cls-14"
d="M229.16,166.66c.51-.47,2.44-1.8,0-3.71a1.88,1.88,0,0,1,1.41,2A2.47,2.47,0,0,1,229.16,166.66Z"/>
<path class="cls-18"
d="M244.61,176.64c0,.38-1,1.32-1.33,1.6l-7,4.75s-.15.15-.2.13c-2.89-.69.37-3-1.56-4.65s-2.13-2-4.31-5.13a11.75,11.75,0,0,1-2.42-6.4c0-.42.1-.8.05-1.07.15,0,.16-.08.35-.17a2,2,0,0,0,.67-2.82c.34.07,2.16.21,3.21.33a4.65,4.65,0,0,1,2.19.65c3.37,1.6,8.13,10,8.72,10.51C244.59,176,244.83,174.35,244.61,176.64Z"/>
<path class="cls-15"
d="M230.21,171c-.61-2.39-1.15-4.53-1.16-4.57v-.05a2.14,2.14,0,0,1,0-.36,3,3,0,0,1,5.78-.77c0,.11,1.67,5.81,1.67,5.81a7.22,7.22,0,0,0-.93-.15c-1.44-.16-3.81-.13-5,1.43l0,0C230.45,172,230.33,171.48,230.21,171Z"/>
<path class="cls-19"
d="M235.65,171.68l-.09-.73h0a7.22,7.22,0,0,1,.93.15C236.44,171.29,235.77,171.67,235.65,171.68Z"/>
<path class="cls-19"
d="M231.67,172.4l-.22-.8h0a3.17,3.17,0,0,0-.89.8C230.62,172.6,231.59,172.42,231.67,172.4Z"/>
<path class="cls-20"
d="M234.48,231.09a16.84,16.84,0,0,0,2-.49,7.09,7.09,0,0,1,2.86-.26l1.05.13c1.33.15,2.71.2,3.56-.76a2.6,2.6,0,0,0,.72-1.24c.16.42.93,2.21-2.3,3.16a4.87,4.87,0,0,1-4-.33,2.62,2.62,0,0,0-1.42-.22c-1.4.2-2.85,1.39-4.6.62a4.52,4.52,0,0,1-1.35-1c-1.58-1.6-.67-2.42-.47-2.71a1.42,1.42,0,0,0,.05,1.07A3.37,3.37,0,0,0,234.48,231.09Z"/>
<path class="cls-18"
d="M243.9,229.71c-.85,1-2.23.91-3.56.76.59-1.33,1.82-1.23,2.47-2.13a2.48,2.48,0,0,1,1.39-1.11h0c.11.32.53.63.42,1.24A2.6,2.6,0,0,1,243.9,229.71Z"/>
<path class="cls-19"
d="M243.61,225.27a3,3,0,0,1,.56,1.82.35.35,0,0,0,0,.14h0a2.48,2.48,0,0,0-1.39,1.11c-.65.9-1.88.8-2.47,2.13l-1.05-.13a7.09,7.09,0,0,0-2.86.26,16.84,16.84,0,0,1-2,.49,2.26,2.26,0,0,1-1.83-2.09c.11-.43.63-.47.94-.93a15.68,15.68,0,0,0,5.28-1.79l.35.2a4.55,4.55,0,0,0,1.6.49h0a1.67,1.67,0,0,0,2-2.2.92.92,0,0,1,.23.09,1.41,1.41,0,0,1,.35.23A1.37,1.37,0,0,1,243.61,225.27Z"/>
<path class="cls-18"
d="M232.65,229a2.26,2.26,0,0,0,1.83,2.09,3.37,3.37,0,0,1-4-2,1.42,1.42,0,0,1-.05-1.07c.34-.82,1.66-1.05,2.92-1.11.21,0,.39.6.23,1.16C233.28,228.53,232.76,228.57,232.65,229Z"/>
<path class="cls-15"
d="M239,225.72a1,1,0,0,1,.26.76l-.35-.2a15.68,15.68,0,0,1-5.28,1.79c.16-.56,0-1.16-.23-1.16l.93,0c.48,0,.9,0,1.19,0a17.9,17.9,0,0,0,3.16-.95,1.16,1.16,0,0,0-.2-.24A.47.47,0,0,1,239,225.72Z"/>
<path class="cls-19"
d="M238.64,225.9a17.9,17.9,0,0,1-3.16.95,28.56,28.56,0,0,0,2.84-1.37c.08,0,.12.18.12.18A1.16,1.16,0,0,1,238.64,225.9Z"/>
<path class="cls-21"
d="M244.62,228.47c.16.42.93,2.21-2.3,3.16a4.87,4.87,0,0,1-4-.33,2.62,2.62,0,0,0-1.42-.22c-1.4.2-2.85,1.39-4.6.62a4.52,4.52,0,0,1-1.35-1c-1.58-1.6-.67-2.42-.47-2.71"/>
<path class="cls-22"
d="M243.09,224.91a.11.11,0,0,0,0,0c.13-.65.35-.71.78-.39a.92.92,0,0,1,.14.13c.18.24,0,.47-.41.67l-.44.15"/>
<path d="M233.71,228.65a.21.21,0,0,0,.41-.11.21.21,0,0,0-.41.11Z"/>
<path d="M233.61,228.68a.3.3,0,0,0,.12.17.33.33,0,0,0,.46-.11.33.33,0,0,0-.06-.38.36.36,0,0,0-.36,0,.33.33,0,0,0-.13.13.31.31,0,0,0,0,.23.11.11,0,0,0,.13.07.1.1,0,0,0,.07-.13v0s0,0,0,0v0h0v0h0s0,0,0,0v0s0,0,0,0,0,0,0,0l0,0s0,0,0,0h0l0,0s0,0,0,0h.07s0,0,0,0h0s0,0,0,0h0l0,0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0v0h0v0a0,0,0,0,1,0,0h0s0,0,0,0h0l0,0h0l0,0h0s0,0,0,0h-.1s0,0,0,0h0s0,0,0,0h0v0a.09.09,0,0,0-.12-.07A.11.11,0,0,0,233.61,228.68Z"/>
<path d="M234.88,228.41a.21.21,0,0,0,.41-.11.21.21,0,0,0-.41.11Z"/>
<path d="M234.78,228.43a.32.32,0,0,0,.12.18.34.34,0,0,0,.17,0,.32.32,0,0,0,.29-.16.32.32,0,0,0-.06-.38.34.34,0,0,0-.35,0,.29.29,0,0,0-.14.13.29.29,0,0,0,0,.22.12.12,0,0,0,.13.08.1.1,0,0,0,.07-.13v0h0v0h0s0,0,0,0l0,0h0l0,0h0s0,0,0,0h0s0,0,0,0h.07s0,0,0,0h0s0,0,0,0h0l0,0h0s0,0,0,0h0v0h0v0h0v0a0,0,0,0,1,0,0h0v0h0l0,0h0s0,0,0,0l0,0H235l0,0h0v0a.09.09,0,0,0-.12-.07A.1.1,0,0,0,234.78,228.43Z"/>
<path d="M236.14,228a.21.21,0,0,0,.4-.11.21.21,0,0,0-.4.11Z"/>
<path d="M236,228.05a.3.3,0,0,0,.12.17.34.34,0,0,0,.17.05.35.35,0,0,0,.29-.16.32.32,0,0,0-.07-.38.34.34,0,0,0-.35,0,.35.35,0,0,0-.14.13.36.36,0,0,0,0,.23.1.1,0,0,0,.13.07.11.11,0,0,0,.07-.13v0s0,0,0,0,0,0,0,0h0v0h0s0,0,0,0v0h0l0,0h0l0,0s0,0,0,0h.12l0,0h0s0,0,0,0h0v0h0v0h0v0a0,0,0,0,0,0,0h0s0,0,0,0h0v0h0l0,0h0s0,0,0,0l0,0h0s0,0,0,0h-.1s0,0,0,0h0s0,0,0,0h0v0h0s0,0,0,0l0,0s0,0,0,0v0a.1.1,0,0,0-.13-.07A.11.11,0,0,0,236,228.05Z"/>
<path d="M237.36,227.55a.21.21,0,0,0,.4-.11.21.21,0,0,0-.4.11Z"/>
<path d="M237.26,227.58a.3.3,0,0,0,.12.17.35.35,0,0,0,.17.06.34.34,0,0,0,.29-.17.31.31,0,0,0-.07-.37.3.3,0,0,0-.35,0,.29.29,0,0,0-.14.13.33.33,0,0,0,0,.22.11.11,0,0,0,.13.07.09.09,0,0,0,.07-.12v0s0,0,0,0v0h0s0,0,0,0h0v0h0s0,0,0,0v0s0,0,0,0,0,0,0,0l0,0s0,0,0,0h.14l0,0h0v0h0v0a0,0,0,0,0,0,0h0v0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h-.15s0,0,0,0,0,0,0,0v0a.11.11,0,0,0-.13-.08A.11.11,0,0,0,237.26,227.58Z"/>
<path d="M238.54,227a.21.21,0,0,0,.4-.11.21.21,0,0,0-.4.11Z"/>
<path d="M238.44,227a.3.3,0,0,0,.12.17.35.35,0,0,0,.16.06.34.34,0,0,0,.3-.17.31.31,0,0,0-.07-.37.3.3,0,0,0-.35,0,.25.25,0,0,0-.14.13.28.28,0,0,0,0,.22.1.1,0,0,0,.13.07.1.1,0,0,0,.07-.12v0s0,0,0,0a.08.08,0,0,1,0,0h0s0,0,0,0h0v0h0s0,0,0,0v0s0,0,0,0,0,0,0,0l0,0s0,0,0,0h.13l0,0h0v0h0s0,0,0,0v0a0,0,0,0,1,0,0h0v0h0s0,0,0,0,0,0,0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h-.07s0,0,0,0h0s0,0,0,0,0,0,0,0v0a.12.12,0,0,0-.13-.08A.11.11,0,0,0,238.44,227Z"/>
<path class="cls-23"
d="M233.83,226.85s0,0,0,0l0,0a.41.41,0,0,1,0,.09,1.55,1.55,0,0,1,.08.23,1.51,1.51,0,0,1,.09.47,1.85,1.85,0,0,1-.24.85c-.06.12.12.22.18.1a1.89,1.89,0,0,0,.25-1.16,2.16,2.16,0,0,0-.19-.61c-.06-.14-.26-.3-.4-.15s.06.24.15.14Z"/>
<path class="cls-23"
d="M235.19,228.3a1.63,1.63,0,0,0-.25-.57,4.67,4.67,0,0,0-.36-.51,3.05,3.05,0,0,0-.44-.44.53.53,0,0,0-.24-.14.27.27,0,0,0-.24.07c-.11.08,0,.23.15.15s.15,0,.2.08l.17.15a3.9,3.9,0,0,1,.33.38,2.24,2.24,0,0,1,.48.88c0,.13.22.08.2,0Z"/>
<path class="cls-23"
d="M234.49,226.75a2.8,2.8,0,0,1-.13.95,2.45,2.45,0,0,1-.17.45,3,3,0,0,1-.29.43c-.08.11.1.21.18.1a2.63,2.63,0,0,0,.3-.44,2.78,2.78,0,0,0,.18-.48,2.68,2.68,0,0,0,.13-1c0-.13-.22-.14-.2,0Z"/>
<path class="cls-23"
d="M236.46,227.92c0-.2-.2-.31-.36-.43a3.78,3.78,0,0,1-.4-.4,1.71,1.71,0,0,0-.94-.46c-.13,0-.18.18,0,.2a1.42,1.42,0,0,1,.84.41c.12.12.23.26.36.37s.32.19.35.37.23.07.2-.06Z"/>
<path class="cls-23"
d="M235.74,226.42a.87.87,0,0,0-.34.37,5.4,5.4,0,0,0-.23.49,3,3,0,0,0-.2,1.12c0,.13.19.13.21,0a2.86,2.86,0,0,1,.17-1c.06-.15.13-.29.2-.43a.71.71,0,0,1,.3-.36c.12-.06,0-.24-.11-.18Z"/>
<path class="cls-23"
d="M237.65,227.42a1.71,1.71,0,0,0-.38-.38,2.69,2.69,0,0,0-.44-.31c-.16-.08-.33-.12-.48-.19a1,1,0,0,0-.46-.15.1.1,0,0,0,0,.21.8.8,0,0,1,.39.14c.14.06.3.1.44.17a2.55,2.55,0,0,1,.4.27,1.62,1.62,0,0,1,.35.34c.08.11.26,0,.18-.1Z"/>
<path class="cls-23"
d="M236.9,226.13a.53.53,0,0,0-.29.33,2.11,2.11,0,0,0-.14.49c0,.16-.12.31-.16.47a1.31,1.31,0,0,0,0,.52c0,.13.22.14.2,0a1.63,1.63,0,0,1,0-.44c0-.15.12-.28.15-.42a1.55,1.55,0,0,0,0-.21c0-.08.05-.15.07-.22s.08-.27.19-.32a.11.11,0,0,0,.07-.13.09.09,0,0,0-.12-.07Z"/>
<path class="cls-23"
d="M238.81,226.89a.44.44,0,0,1-.14-.13,1.22,1.22,0,0,0-.17-.15,2.27,2.27,0,0,0-.41-.21c-.32-.11-.65-.19-1-.28a.1.1,0,0,0-.06.2c.32.09.64.17.95.28a1,1,0,0,1,.38.19,3,3,0,0,0,.32.29.11.11,0,0,0,.1-.19Z"/>
<path class="cls-23"
d="M237.9,225.82a5.54,5.54,0,0,1-.4,1.59c0,.05,0,.11.08.12s.1,0,.13-.07a5.77,5.77,0,0,0,.39-1.64c0-.14-.19-.14-.2,0Z"/>
<path class="cls-24"
d="M238,227.78a1.11,1.11,0,0,0,.57-.58.71.71,0,0,0-.21-.71h0a.19.19,0,0,0,0-.08s0,0,0-.07a.41.41,0,0,0-.07-.11l0,0a1.09,1.09,0,0,0,0-.18.25.25,0,0,0-.12-.19,1.71,1.71,0,0,0-1.51-.24c-.27.07-.66.21-.57.57s.54.44.84.42h.1a1.3,1.3,0,0,0-.31.16,4.33,4.33,0,0,1-.47.38,1,1,0,0,1-.65.15c-.14,0-.14.2,0,.21a1.43,1.43,0,0,0,1.12-.47,2,2,0,0,1,1-.4,1.92,1.92,0,0,0-.43.32,1.56,1.56,0,0,0-.27.35,1.21,1.21,0,0,1-.24.35c-.1.09.05.24.15.15s.26-.46.45-.65l.35-.29a1.27,1.27,0,0,1,.31-.15.69.69,0,0,1-.13.11,3,3,0,0,0-.37.25c-.19.15-.41.47-.25.71S237.76,227.9,238,227.78Zm-1.08-1.4a1.09,1.09,0,0,1-.44-.06c-.11,0-.27-.14-.24-.28s.16-.16.26-.19a1.91,1.91,0,0,1,.89-.09,1.35,1.35,0,0,1,.44.15.47.47,0,0,1,.2.12s0,.1,0,.13v0l0,0h0a.2.2,0,0,0-.08.08,1.27,1.27,0,0,0-.55,0A3.63,3.63,0,0,1,236.91,226.38Zm.66,1.33c-.08,0-.19,0-.21-.11a.42.42,0,0,1,.12-.28.92.92,0,0,1,.26-.22,1,1,0,0,0,.47-.43h0a.47.47,0,0,1,.14.46.82.82,0,0,1-.46.47A.93.93,0,0,1,237.57,227.71Z"/>
<path class="cls-16"
d="M244.52,225.37c0-.06,0-.14,0-.24-.06-.39-1.17-21.62-1.17-21.62l1.88-9.95a51.23,51.23,0,0,1-6.5-1l-1.21,9.17a7.46,7.46,0,0,0,.1,2.45c.87,4.18,3.39,19.87,3.62,21.4h0a2.4,2.4,0,0,1,.05.47c-.06.28-1.13.33-1.17.51.11,0,1,1.14,1,1.17.87.39,3.25-.45,3.25-.45.4-.27.22-.78.37-1.33A1.57,1.57,0,0,1,244.52,225.37Z"/>
<path class="cls-20"
d="M236.48,231.89a15.4,15.4,0,0,0,1.92-.61,7.27,7.27,0,0,1,2.85-.43l1.05.06c1.33.07,2.72,0,3.51-1a2.68,2.68,0,0,0,.64-1.29c.19.41,1.07,2.16-2.1,3.3a4.92,4.92,0,0,1-4.06-.08,2.55,2.55,0,0,0-1.42-.14c-1.4.29-2.76,1.56-4.56.9a4.35,4.35,0,0,1-1.41-.89c-1.68-1.49-.82-2.36-.63-2.67a1.38,1.38,0,0,0,.12,1.07A3.35,3.35,0,0,0,236.48,231.89Z"/>
<path class="cls-18"
d="M245.81,229.94c-.79,1-2.18,1-3.51,1,.51-1.36,1.74-1.34,2.33-2.27a2.55,2.55,0,0,1,1.32-1.2h0c.13.32.57.6.5,1.21A2.68,2.68,0,0,1,245.81,229.94Z"/>
<path class="cls-19"
d="M245.25,225.52a3.08,3.08,0,0,1,.67,1.79.61.61,0,0,0,0,.13h0a2.55,2.55,0,0,0-1.32,1.2c-.59.93-1.82.91-2.33,2.27l-1.05-.06a7.27,7.27,0,0,0-2.85.43,15.4,15.4,0,0,1-1.92.61,2.24,2.24,0,0,1-1.94-2c.08-.43.59-.5.87-1a15.49,15.49,0,0,0,5.16-2.11l.37.18a4.52,4.52,0,0,0,1.63.39h0a1.66,1.66,0,0,0,1.89-2.32,1,1,0,0,1,.25.07,1.34,1.34,0,0,1,.36.22A1.29,1.29,0,0,1,245.25,225.52Z"/>
<path class="cls-18"
d="M234.54,229.91a2.24,2.24,0,0,0,1.94,2,3.35,3.35,0,0,1-4.09-1.75,1.38,1.38,0,0,1-.12-1.07c.29-.83,1.59-1.14,2.84-1.29.22,0,.43.58.3,1.15C235.13,229.41,234.62,229.48,234.54,229.91Z"/>
<path class="cls-15"
d="M240.63,226.25a1,1,0,0,1,.31.75l-.37-.18a15.49,15.49,0,0,1-5.16,2.11c.13-.57-.08-1.16-.3-1.15l.94-.08c.47,0,.89-.06,1.18-.1a19.34,19.34,0,0,0,3.1-1.14,1.89,1.89,0,0,0-.22-.23A.48.48,0,0,1,240.63,226.25Z"/>
<path class="cls-19"
d="M240.33,226.46a19.34,19.34,0,0,1-3.1,1.14,29.4,29.4,0,0,0,2.75-1.54c.08,0,.13.17.13.17A1.89,1.89,0,0,1,240.33,226.46Z"/>
<path class="cls-21"
d="M246.45,228.65c.19.41,1.07,2.16-2.1,3.3a4.92,4.92,0,0,1-4.06-.08,2.55,2.55,0,0,0-1.42-.14c-1.4.29-2.76,1.56-4.56.9a4.35,4.35,0,0,1-1.41-.89c-1.68-1.49-.82-2.36-.63-2.67"/>
<path class="cls-22"
d="M244.71,225.19a.09.09,0,0,1,0-.05c.08-.66.3-.73.75-.43a.58.58,0,0,1,.14.12c.2.22.07.47-.36.69a3.73,3.73,0,0,1-.43.18"/>
<path d="M235.57,229.5c.09.25.49.12.4-.13a.21.21,0,0,0-.4.13Z"/>
<path d="M235.47,229.53a.34.34,0,0,0,.13.16.26.26,0,0,0,.17.05.34.34,0,0,0,.29-.17.35.35,0,0,0-.08-.38.33.33,0,0,0-.19-.06.25.25,0,0,0-.17,0,.31.31,0,0,0-.15.36.11.11,0,0,0,.13.07.12.12,0,0,0,.08-.13,0,0,0,0,1,0,0s0,0,0,0v0s0,0,0,0v0s0,0,0,0h0s0,0,0,0l0,0h0s0,0,0,0h.07s0,0,0,0h.06l0,0s0,0,0,0h0s0,0,0,0,0,0,0,0h0v0s0,0,0,0v0h0v0h0s0,0,0,0l0,0h0l0,0s0,0,0,0h-.13l0,0s0,0,0,0h0v0h0a.11.11,0,0,0-.13-.07A.12.12,0,0,0,235.47,229.53Z"/>
<path d="M236.73,229.19a.21.21,0,0,0,.39-.14.21.21,0,0,0-.39.14Z"/>
<path d="M236.63,229.21a.3.3,0,0,0,.12.17.37.37,0,0,0,.17.05.34.34,0,0,0,.29-.18.31.31,0,0,0-.08-.37.4.4,0,0,0-.18-.07.47.47,0,0,0-.17,0,.3.3,0,0,0-.15.36.11.11,0,0,0,.13.08.11.11,0,0,0,.07-.13v0h0v0h0v0s0,0,0,0h0s0,0,0,0l0,0H237s0,0,0,0,0,0,0,0l0,0v0h0v0h0s0,0,0,0v0h0s0,0,0,0h0v0s0,0,0,0l0,0s0,0,0,0h0l0,0s0,0,0,0h0s0,0,0,0h-.12s0,0,0,0l0,0s0,0,0,0v0h0s0,0,0,0h0a.11.11,0,0,0-.13-.07A.09.09,0,0,0,236.63,229.21Z"/>
<path d="M238,228.72a.21.21,0,0,0,.39-.13.21.21,0,0,0-.39.13Z"/>
<path d="M237.86,228.75a.3.3,0,0,0,.12.17.27.27,0,0,0,.17,0,.31.31,0,0,0,.29-.17.31.31,0,0,0-.08-.37.34.34,0,0,0-.18-.07.33.33,0,0,0-.17,0,.29.29,0,0,0-.15.36.1.1,0,0,0,.13.07.09.09,0,0,0,.07-.12.08.08,0,0,1,0,0h0v0h0v0s0,0,0,0h0v0h0l0,0h0l0,0h0s0,0,0,0h.12s0,0,0,0v0s0,0,0,0h0s0,0,0,0h0v0s0,0,0,0v0h0v0h0s0,0,0,0l0,0h0l0,0s0,0,0,0h0l0,0h0s0,0,0,0h-.07l0,0s0,0,0,0v0s0,0,0,0h0a.1.1,0,0,0-.13-.08A.11.11,0,0,0,237.86,228.75Z"/>
<path d="M239.15,228.18a.21.21,0,0,0,.39-.13.21.21,0,0,0-.39.13Z"/>
<path d="M239.05,228.21a.3.3,0,0,0,.12.17.27.27,0,0,0,.17,0,.31.31,0,0,0,.29-.17.31.31,0,0,0-.08-.37.29.29,0,0,0-.18-.07.33.33,0,0,0-.17,0,.3.3,0,0,0-.15.36.11.11,0,0,0,.13.07.09.09,0,0,0,.07-.12s0,0,0,0h0v0h0v0s0,0,0,0h0v0h0l0,0h0l0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0s0,0,0,0h0v0h0s0,0,0,0v0h0s0,0,0,0h0s0,0,0,0l0,0h0a0,0,0,0,1,0,0h-.12s0,0,0,0h0s0,0,0,0l0,0s0,0,0,0v0h0a.11.11,0,0,0-.13-.08A.11.11,0,0,0,239.05,228.21Z"/>
<path d="M240.29,227.57a.21.21,0,0,0,.4-.13.21.21,0,0,0-.4.13Z"/>
<path d="M240.19,227.6a.31.31,0,0,0,.13.17.25.25,0,0,0,.17,0,.3.3,0,0,0,.2-.54.29.29,0,0,0-.18-.07.33.33,0,0,0-.17,0,.31.31,0,0,0-.15.36.11.11,0,0,0,.13.07.09.09,0,0,0,.07-.12s0,0,0,0,0,0,0,0v0h0v0s0,0,0,0h0v0h0l0,0h0s0,0,0,0l0,0h.12s0,0,0,0v0h0s0,0,0,0,0,0,0,0h0v0s0,0,0,0v0h0s0,0,0,0v0h0s0,0,0,0v0s0,0,0,0h0a0,0,0,0,1,0,0s0,0,0,0h0l0,0h0s0,0,0,0h-.07s0,0,0,0h0s0,0,0,0,0,0,0,0v0h0a.1.1,0,0,0-.13-.08A.11.11,0,0,0,240.19,227.6Z"/>
<path class="cls-23"
d="M235.58,227.7s0,0,0,0l0,0a.56.56,0,0,1,0,.08c0,.08.07.15.1.23a1.82,1.82,0,0,1,.11.46,1.72,1.72,0,0,1-.19.86c-.05.12.14.22.19.09a1.89,1.89,0,0,0,.18-1.17,2.57,2.57,0,0,0-.23-.6c-.07-.13-.28-.28-.41-.13s.08.24.16.14Z"/>
<path class="cls-23"
d="M237,229.06a1.73,1.73,0,0,0-.28-.56,4.63,4.63,0,0,0-.4-.48,3,3,0,0,0-.46-.41.55.55,0,0,0-.25-.13.32.32,0,0,0-.24.09c-.1.09.06.22.16.14s.16,0,.21.07l.17.14a4,4,0,0,1,.36.35,2.18,2.18,0,0,1,.53.85c0,.14.23.07.2-.06Z"/>
<path class="cls-23"
d="M236.23,227.55a2.44,2.44,0,0,1-.07,1,1.81,1.81,0,0,1-.14.45,2.91,2.91,0,0,1-.26.45c-.07.11.11.2.19.09a3.47,3.47,0,0,0,.27-.46,4,4,0,0,0,.15-.49,2.7,2.7,0,0,0,.07-1c0-.13-.23-.12-.21,0Z"/>
<path class="cls-23"
d="M238.28,228.61c-.05-.2-.23-.3-.39-.41a3.89,3.89,0,0,1-.43-.38,1.71,1.71,0,0,0-1-.4c-.13,0-.18.19,0,.2a1.51,1.51,0,0,1,.86.36c.13.11.25.24.39.34s.33.18.37.35.23.07.2-.06Z"/>
<path class="cls-23"
d="M237.46,227.16a.85.85,0,0,0-.32.38l-.2.51a3.25,3.25,0,0,0-.13,1.12c0,.13.2.12.21,0a2.91,2.91,0,0,1,.11-1l.17-.44a.7.7,0,0,1,.28-.37c.12-.07,0-.24-.12-.17Z"/>
<path class="cls-23"
d="M239.43,228a2,2,0,0,0-.4-.36,2.73,2.73,0,0,0-.47-.27c-.15-.08-.33-.1-.48-.17a1,1,0,0,0-.47-.11c-.14,0-.12.21,0,.2a1,1,0,0,1,.4.11c.15.06.31.09.45.15a2.8,2.8,0,0,1,.41.25,1.47,1.47,0,0,1,.38.32c.08.1.25,0,.17-.12Z"/>
<path class="cls-23"
d="M238.6,226.79a.53.53,0,0,0-.27.35,2.78,2.78,0,0,0-.11.5c0,.16-.1.31-.13.48a1.51,1.51,0,0,0,0,.52c0,.13.23.12.21,0a1.36,1.36,0,0,1,0-.45c0-.15.09-.28.12-.43a1.52,1.52,0,0,0,0-.21,1.89,1.89,0,0,1,.05-.23c0-.1.06-.27.17-.32s.09-.08.07-.13a.11.11,0,0,0-.13-.07Z"/>
<path class="cls-23"
d="M240.56,227.44a.65.65,0,0,1-.16-.13l-.17-.14a1.72,1.72,0,0,0-.42-.18c-.33-.09-.66-.15-1-.22a.1.1,0,0,0,0,.2c.32.07.65.13,1,.22a1.36,1.36,0,0,1,.39.17,2.78,2.78,0,0,0,.34.26.1.1,0,1,0,.09-.18Z"/>
<path class="cls-23"
d="M239.58,226.42a5.52,5.52,0,0,1-.3,1.61.11.11,0,0,0,.08.12.11.11,0,0,0,.13-.08,5.58,5.58,0,0,0,.29-1.67c0-.13-.2-.12-.2,0Z"/>
<path class="cls-24"
d="M239.79,228.37a1.06,1.06,0,0,0,.53-.61.66.66,0,0,0-.25-.69h0s0-.05,0-.08,0,0,0-.07a.39.39,0,0,0-.08-.1l0,0a1.1,1.1,0,0,0,0-.18.23.23,0,0,0-.13-.19,1.86,1.86,0,0,0-.46-.19,1.91,1.91,0,0,0-1.06.05c-.27.08-.65.25-.53.6s.57.41.87.37h.09a1.11,1.11,0,0,0-.3.17,6,6,0,0,1-.45.42,1,1,0,0,1-.64.18c-.13,0-.12.21,0,.21a1.4,1.4,0,0,0,1.09-.53,2,2,0,0,1,1-.47,2.71,2.71,0,0,0-.4.35,1.37,1.37,0,0,0-.26.37,1.2,1.2,0,0,1-.22.36c-.09.1.07.24.16.14s.24-.47.42-.67a2.34,2.34,0,0,1,.32-.31,1,1,0,0,1,.31-.18.49.49,0,0,1-.13.12c-.12.1-.25.17-.36.27s-.38.5-.2.72S239.57,228.5,239.79,228.37ZM238.63,227a1.14,1.14,0,0,1-.45,0c-.11,0-.27-.12-.25-.27s.15-.17.24-.21a2.08,2.08,0,0,1,.89-.14,1.66,1.66,0,0,1,.45.12c.05,0,.17.06.2.11a.32.32,0,0,1,0,.14v0l0,0h0a.27.27,0,0,0-.07.08,1.23,1.23,0,0,0-.54,0A4.45,4.45,0,0,1,238.63,227Zm.74,1.28c-.08,0-.2,0-.22-.09a.41.41,0,0,1,.11-.29,1.09,1.09,0,0,1,.24-.24,1,1,0,0,0,.44-.45h0a.49.49,0,0,1,.16.45.85.85,0,0,1-.43.5A1,1,0,0,1,239.37,228.32Z"/>
<path class="cls-25"
d="M236.69,192.06l1.75.62.9-6.69-.91-4.45-2.32,1.58,1.07,1.08a1.29,1.29,0,0,1,.35,1.09L236.45,192Z"/>
<path class="cls-26"
d="M247,193.77a12.36,12.36,0,0,1-2.64.37c-1.9,0-4.64.17-5.93-1l-.08-.21c.16-1.66.23-7,.23-7a3.4,3.4,0,0,0-2.45-2.8l6.49-4.41a5.9,5.9,0,0,0,2-2.07c.32.36.71.8,1.11,1.28a7.76,7.76,0,0,1,1.5,7.21c-.09.29-.19.6-.32.91A75.57,75.57,0,0,1,247,193.77Z"/>
<path class="cls-14"
d="M238.53,193.83c-.21,1.53-.56,4.4-.63,5,.42,0,1.1-.3,1-.88C238.85,197.07,239.42,194.62,238.53,193.83Z"/>
<path class="cls-16"
d="M238.17,193.58a3.86,3.86,0,0,1-1.07-2.08l-.09-12a10.16,10.16,0,0,0-.17-1.74L235.56,171a9.65,9.65,0,0,0-2.35,0,4.58,4.58,0,0,0-1.76.62l2.42,8.69,1.47,11a7.58,7.58,0,0,0,.32,1.41,48.43,48.43,0,0,1,1.65,5.67c-.06.53,1.46.24,1.37-.62S239.06,194.37,238.17,193.58Z"/>
<circle class="cls-27" cx="232.66" cy="89.89" r="53.72"/>
<polygon class="cls-28"
points="258.62 69.59 252.96 63.93 232.66 84.23 212.36 63.93 206.7 69.59 227 89.89 206.7 110.19 212.36 115.84 232.66 95.54 252.96 115.84 258.62 110.19 238.32 89.89 258.62 69.59"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 33 KiB

+106
View File
@@ -0,0 +1,106 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 456.01 262.12">
<defs>
<style>
.cls-1,.cls-16,.cls-2,.cls-25,.cls-3,.cls-4,.cls-5,.cls-6{fill:none;stroke-miterlimit:10;}.cls-1,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6{stroke-width:2px;}.cls-1{stroke:url(#未命名的渐变_26);}.cls-2{stroke:url(#未命名的渐变_26-2);}.cls-3{stroke:url(#未命名的渐变_26-3);}.cls-4{stroke:url(#未命名的渐变_26-4);}.cls-5{stroke:url(#未命名的渐变_26-5);}.cls-6{stroke:url(#未命名的渐变_26-6);}.cls-10,.cls-11,.cls-12,.cls-7,.cls-9{opacity:0.4;}.cls-7{fill:url(#未命名的渐变_26-7);}.cls-8{opacity:0.7;}.cls-9{fill:url(#未命名的渐变_26-8);}.cls-10{fill:url(#未命名的渐变_26-9);}.cls-11{fill:url(#未命名的渐变_26-10);}.cls-12{fill:url(#未命名的渐变_26-11);}.cls-13{fill:#40a8f5;}.cls-14{fill:#53b9f5;}.cls-15{fill:#8cd7ff;}.cls-16{stroke:#4986d9;stroke-width:0.11px;}.cls-17{fill:#ffeed2;}.cls-18{fill:#e55c5c;opacity:0.2;}.cls-19{fill:#e49056;}.cls-20{fill:#ebfcff;}.cls-21{fill:#ffb056;}.cls-22{fill:#398eed;}.cls-23{fill:#fae6d2;}.cls-24{fill:#257fba;}.cls-25{stroke:#e49056;stroke-width:0.22px;}
</style>
<linearGradient id="未命名的渐变_26" x1="1" y1="91.35" x2="1" y2="181.12" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#81cfff"/>
<stop offset="1" stop-color="#5ecfff" stop-opacity="0"/>
</linearGradient>
<linearGradient id="未命名的渐变_26-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-7" x1="232.75" y1="224.43" x2="232.75" y2="262.12" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-8" x1="349.36" y1="26.68" x2="349.36" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-9" x1="201.45" y1="55.61" x2="201.45" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-10" x1="122.98" y1="26.68" x2="122.98" y2="204.03" xlink:href="#未命名的渐变_26"/>
<linearGradient id="未命名的渐变_26-11" x1="273.51" y1="0" x2="273.51" y2="209.54" xlink:href="#未命名的渐变_26"/>
</defs>
<title>暂无数据</title>
<g id="图层_2" data-name="图层 2">
<g id="图层_1-2" data-name="图层 1">
<line class="cls-1" x1="1" y1="91.35" x2="1" y2="181.12"/>
<line class="cls-2" x1="455.01" y1="72.11" x2="455.01" y2="161.88"/>
<line class="cls-3" x1="40.9" y1="143.88" x2="40.9" y2="199.51"/>
<line class="cls-4" x1="64.97" y1="95.36" x2="64.97" y2="123.17"/>
<line class="cls-5" x1="397.23" y1="104.2" x2="397.23" y2="132.02"/>
<line class="cls-6" x1="424.75" y1="133.49" x2="424.75" y2="189.13"/>
<path class="cls-7" d="M412.28,262.12c-23-23-61-37.69-179.53-37.69S76.24,239.1,53.21,262.12Z"/>
<g class="cls-8">
<path class="cls-9"
d="M380.66,26.68H318.07a2.71,2.71,0,0,0-2.82,2.59V201.44a2.71,2.71,0,0,0,2.82,2.59h62.59a2.72,2.72,0,0,0,2.82-2.59V29.27A2.72,2.72,0,0,0,380.66,26.68ZM328.3,147a.9.9,0,0,1-.95.87h-3.6a.9.9,0,0,1-.95-.87V127.27a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.23a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V97a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V66.8a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87Zm0-30.24a.91.91,0,0,1-.95.87h-3.6a.91.91,0,0,1-.95-.87V36.56a.91.91,0,0,1,.95-.87h3.6a.91.91,0,0,1,.95.87ZM340,147a.9.9,0,0,1-.94.87h-3.61a.91.91,0,0,1-.95-.87V127.27a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V97a.92.92,0,0,1,.95-.87h3.61A.91.91,0,0,1,340,97Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V66.8a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.92.92,0,0,1-.95-.87V36.56a.92.92,0,0,1,.95-.87h3.61a.91.91,0,0,1,.94.87ZM351.7,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM363.4,147a.9.9,0,0,1-.94.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.23a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87Zm0-30.24a.91.91,0,0,1-.94.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.91.91,0,0,1,.94.87ZM375.11,147a.91.91,0,0,1-.95.87h-3.61a.9.9,0,0,1-.94-.87V127.27a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.23a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V97a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V66.8a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Zm0-30.24a.92.92,0,0,1-.95.87h-3.61a.91.91,0,0,1-.94-.87V36.56a.91.91,0,0,1,.94-.87h3.61a.92.92,0,0,1,.95.87Z"/>
<path class="cls-10"
d="M231.1,55.61H171.8A2.71,2.71,0,0,0,169,58.2V201.44A2.71,2.71,0,0,0,171.8,204h59.3a2.71,2.71,0,0,0,2.82-2.59V58.2A2.71,2.71,0,0,0,231.1,55.61ZM182.47,159.37a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11h-5.4a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1h-5.4a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1v-5.22a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h5.4a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V115.5a1.16,1.16,0,0,1,1.21-1.11h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V89.73A1.16,1.16,0,0,1,186,88.62h5.4a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H186a1.16,1.16,0,0,1-1.21-1.11V76.85A1.16,1.16,0,0,1,186,75.74h5.4a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H186a1.16,1.16,0,0,1-1.21-1.1V64A1.16,1.16,0,0,1,186,62.85h5.4a1.16,1.16,0,0,1,1.2,1.11Zm10.08,90.19a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h5.4a1.16,1.16,0,0,1,1.21,1.1Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.89a1.16,1.16,0,0,1-1.21,1.11H196a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h5.4a1.16,1.16,0,0,1,1.21,1.11Zm0-12.88a1.16,1.16,0,0,1-1.21,1.1H196a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h5.4A1.16,1.16,0,0,1,202.63,64Zm25.21,90.19a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1v-5.22a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.22a1.15,1.15,0,0,1,1.2-1.1h20.54a1.15,1.15,0,0,1,1.2,1.1Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V115.5a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11v-5.21a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V89.73a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Zm0-12.89a1.16,1.16,0,0,1-1.2,1.11H206.1a1.16,1.16,0,0,1-1.2-1.11V76.85a1.15,1.15,0,0,1,1.2-1.11h20.54a1.15,1.15,0,0,1,1.2,1.11Zm0-12.88a1.15,1.15,0,0,1-1.2,1.1H206.1a1.15,1.15,0,0,1-1.2-1.1V64a1.16,1.16,0,0,1,1.2-1.11h20.54a1.16,1.16,0,0,1,1.2,1.11Z"/>
<path class="cls-11"
d="M161.13,26.68H84.83A2.71,2.71,0,0,0,82,29.27V201.44A2.71,2.71,0,0,0,84.83,204h76.3a2.71,2.71,0,0,0,2.82-2.59V29.27A2.71,2.71,0,0,0,161.13,26.68ZM154.34,161a1.16,1.16,0,0,1-1.2,1.11H92.83A1.16,1.16,0,0,1,91.62,161v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1v-5.22A1.16,1.16,0,0,1,92.83,140h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.22a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11v-5.21a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V97a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V82.35a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V67.68a1.16,1.16,0,0,1,1.21-1.11h60.31a1.15,1.15,0,0,1,1.2,1.11Zm0-14.67a1.15,1.15,0,0,1-1.2,1.1H92.83a1.16,1.16,0,0,1-1.21-1.1V53a1.16,1.16,0,0,1,1.21-1.11h60.31a1.16,1.16,0,0,1,1.2,1.11Zm0-14.68a1.16,1.16,0,0,1-1.2,1.11H92.83a1.16,1.16,0,0,1-1.21-1.11V38.32a1.16,1.16,0,0,1,1.21-1.1h60.31a1.15,1.15,0,0,1,1.2,1.1Z"/>
<path class="cls-12"
d="M306.21,0H240.82a2.51,2.51,0,0,0-2.42,2.59V206.94a2.51,2.51,0,0,0,2.42,2.6h65.39a2.51,2.51,0,0,0,2.41-2.6V2.59A2.51,2.51,0,0,0,306.21,0Zm-5.82,134.28a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1v-5.22a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11v-5.22a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V99.71a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V85a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V70.35a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V55.68a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.67a1.06,1.06,0,0,1-1,1.1H247.67a1.06,1.06,0,0,1-1-1.1V41a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V26.32a1.06,1.06,0,0,1,1-1.1h51.69a1.06,1.06,0,0,1,1,1.1Zm0-14.68a1.07,1.07,0,0,1-1,1.11H247.67a1.07,1.07,0,0,1-1-1.11V11.65a1.07,1.07,0,0,1,1-1.11h51.69a1.07,1.07,0,0,1,1,1.11Z"/>
</g>
<path class="cls-13"
d="M295.06,98.88V177c-4.93-3.84-14.28-5.29-15.66-5.42V98.88a7.83,7.83,0,0,1,11.71-6.8,7.94,7.94,0,0,1,1.66,1.27A7.77,7.77,0,0,1,295.06,98.88Z"/>
<path class="cls-14"
d="M279.4,171.6v22.27a7.84,7.84,0,0,1-15.67,0V115.29a7.85,7.85,0,0,0-2.29-5.54,7.53,7.53,0,0,0-1.11-.92c-1.44-1.29-19.11-10.25-34.35-17.38V73.66a7.85,7.85,0,0,1,9.89-7.56l.18.05c4.45-.54,52.62,23.75,55.06,25.93a7.83,7.83,0,0,0-11.71,6.8Z"/>
<path class="cls-13"
d="M263.73,193.87a7.83,7.83,0,0,0,4.86,7.24c-1.81-.29-10.49-4.09-20.48-8.73h0V115.29a7.83,7.83,0,0,1,12.26-6.46,7.53,7.53,0,0,1,1.11.92,7.85,7.85,0,0,1,2.29,5.54Z"/>
<path class="cls-15"
d="M226,91.45c15.24,7.13,32.91,16.09,34.35,17.38a7.83,7.83,0,0,0-12.26,6.46v94.83a7.85,7.85,0,0,1-7.83,7.83,7.61,7.61,0,0,1-2.25-.33h-.08a7.83,7.83,0,0,1-5.5-7.48V201.7c-9.92-2-25.82-9.21-37.84-15.63a7.68,7.68,0,0,0,.09-1.17V90.07a7.82,7.82,0,0,1,7.83-7.83,6.88,6.88,0,0,1,1.29.11l.19,0C205.93,82.38,215.37,86.47,226,91.45Zm15.09,98.41v-5.15a.37.37,0,0,0-.2-.33L203,166.1a.37.37,0,0,0-.53.33v5.15a.36.36,0,0,0,.21.33l37.85,18.28A.36.36,0,0,0,241.07,189.86Zm0-22.38v-5.15a.37.37,0,0,0-.2-.33L203,143.72a.37.37,0,0,0-.53.33v5.15a.36.36,0,0,0,.21.33l37.85,18.28A.37.37,0,0,0,241.07,167.48Zm0-22.39V140a.36.36,0,0,0-.2-.33L203,121.34a.37.37,0,0,0-.53.33v5.15a.36.36,0,0,0,.21.33l37.85,18.27A.36.36,0,0,0,241.07,145.09Zm0-22.38v-5.15a.37.37,0,0,0-.2-.33L203,99a.36.36,0,0,0-.53.32v5.15a.36.36,0,0,0,.21.33L240.55,123A.36.36,0,0,0,241.07,122.71Z"/>
<path class="cls-13"
d="M241.07,184.71v5.15a.36.36,0,0,1-.52.33L202.7,171.91a.36.36,0,0,1-.21-.33v-5.15a.37.37,0,0,1,.53-.33l37.85,18.28A.37.37,0,0,1,241.07,184.71Z"/>
<path class="cls-13"
d="M241.07,162.33v5.15a.37.37,0,0,1-.52.33L202.7,149.53a.36.36,0,0,1-.21-.33v-5.15a.37.37,0,0,1,.53-.33L240.87,162A.37.37,0,0,1,241.07,162.33Z"/>
<path class="cls-13"
d="M241.07,140v5.14a.36.36,0,0,1-.52.33L202.7,127.15a.36.36,0,0,1-.21-.33v-5.15a.37.37,0,0,1,.53-.33l37.85,18.28A.36.36,0,0,1,241.07,140Z"/>
<path class="cls-13"
d="M241.07,117.56v5.15a.36.36,0,0,1-.52.33L202.7,104.76a.36.36,0,0,1-.21-.33V99.28A.36.36,0,0,1,203,99l37.85,18.27A.37.37,0,0,1,241.07,117.56Z"/>
<path class="cls-14"
d="M232.41,210.12a7.83,7.83,0,0,0,5.5,7.48c-4.9-.95-50.65-22.79-55.32-26.12l-.09-.06A7.8,7.8,0,0,1,179,184.9v-8.42c2.09,1.89,8.08,5.58,15.58,9.59,12,6.42,27.92,13.66,37.84,15.63Z"/>
<path class="cls-16"
d="M218.37,121.59c.32,0,.42,0,.38.2s.19,1-.18,1.09a17.78,17.78,0,0,1-4.14-.24c-.74-.08-3.1-.51-3.57-.49s-2.58-.08-3.14-.05A20.86,20.86,0,0,1,205,122c-.57-.1-2.36-.85-1.68-2.35"/>
<path class="cls-16"
d="M232.42,114.62h0c.32,0,1.28,1.42,1.25,1.87a2.56,2.56,0,0,1-.92,1.64c-.48.27-2.58.21-3.18.83a9.7,9.7,0,0,0-1.87,2.59,2.29,2.29,0,0,1-2,1.21c-1,0-2.36-.1-3.41,0s-1.76-.07-1.73-1.16h0"/>
<ellipse class="cls-17" cx="237.51" cy="60.25" rx="1.08" ry="0.74"
transform="translate(174.08 296.94) rotate(-89.23)"/>
<ellipse class="cls-18" cx="237.51" cy="60.25" rx="0.63" ry="0.43"
transform="translate(174.08 296.94) rotate(-89.23)"/>
<path class="cls-19" d="M240,66.35l.33.44a2.85,2.85,0,0,0,.09-.44C240.24,66.25,240,66.35,240,66.35Z"/>
<path class="cls-19"
d="M235.15,67.17a.62.62,0,0,0,.3.48c.08-.22.16-.42.23-.59C235.68,67.06,235.26,67,235.15,67.17Z"/>
<path class="cls-20"
d="M203.32,119.6c-.68,1.5,1.11,2.25,1.68,2.35a20.86,20.86,0,0,0,2.72.15c.56,0,2.66.06,3.14.05s2.83.41,3.57.49a17.78,17.78,0,0,0,4.14.24c.37,0,.13-.92.18-1.09s-.06-.15-.38-.2a20.73,20.73,0,0,1-4.39-.17c-.65-.11-2.71-.4-3.45-.43s-4,.06-4.83.09a3.51,3.51,0,0,1-1.67-.49,1.7,1.7,0,0,1-.69-1Z"/>
<path class="cls-21"
d="M205.65,118.21c-2,.18-2.42.81-2.31,1.38a1.7,1.7,0,0,0,.69,1,3.51,3.51,0,0,0,1.67.49c.8,0,4.1-.11,4.83-.09s2.8.32,3.45.43a20.73,20.73,0,0,0,4.39.17,9,9,0,0,0-.11-3.42c0-.39.06-1,.32-1.08s-.18-.55-.49-.94a1.49,1.49,0,0,1-.61.63,5.16,5.16,0,0,1-1.72.36,2.7,2.7,0,0,1-2.37-.81h0c-.22-.21-.38-.41-.52-.52a4.93,4.93,0,0,1-2,1.72C210.11,117.9,207.13,118,205.65,118.21Z"/>
<path class="cls-22"
d="M215,92.8l-2.22,22.48.81.15,3.89.72.17,0,2.09-14.61.55-3.81,4.56.1,15.31.34a1.58,1.58,0,0,0,1.61-1.41l.38-3.25c-2.33.3-6.45-1-7.89-3.05l-17.82.94A1.52,1.52,0,0,0,215,92.8Z"/>
<path class="cls-23" d="M213.54,115.43l-.15.89h0a2.7,2.7,0,0,0,2.37.81,5.16,5.16,0,0,0,1.72-.36l0-.63Z"/>
<path class="cls-24"
d="M216.56,90.26a1,1,0,0,0-.77,1.23l0,.08h0a1.54,1.54,0,0,1,.57-.14l17.82-.94a2.6,2.6,0,0,1-.51-1.38Z"/>
<polygon class="cls-24"
points="229.08 111.78 228.91 111.25 224.81 97.86 224.81 97.86 220.24 97.76 219.69 101.57 224.34 115.04 225.61 114.24 229.15 112.03 229.08 111.78"/>
<path class="cls-21"
d="M221.62,119.06c-.3.18-1.18,1.26-1.13,1.79a4.27,4.27,0,0,0,0,.72h0a.41.41,0,0,0,.25.25,25.52,25.52,0,0,0,4.65.06,1.82,1.82,0,0,0,1.52-1.07,8.42,8.42,0,0,1,1.41-2.12c1.47-1.64,3.84-1,4.19-1.86a2.48,2.48,0,0,0-.13-2.22h0a.65.65,0,0,0-.25-.22,4.4,4.4,0,0,1-1.46-1.42,7.94,7.94,0,0,1-.48-1.73,3.32,3.32,0,0,0-1.32,0l.17.53c.34,0,.86.2.77.63a1.24,1.24,0,0,1-.36.78,2.64,2.64,0,0,0-.68.89c-.12.32-.16,1.15-.52,1.3s-.93.12-1-.24-.05-.59-.5-.67a6.64,6.64,0,0,0-1.05-.12h0c-.09.08.06.56.27.91a1,1,0,0,1,.05,1.14c-.23.37-1.4,2.18-2,2.3A16.34,16.34,0,0,0,221.62,119.06Z"/>
<path class="cls-20"
d="M220.53,121.58c0,1.09.68,1.25,1.73,1.16s2.4,0,3.41,0a2.29,2.29,0,0,0,2-1.21,9.7,9.7,0,0,1,1.87-2.59c.6-.62,2.7-.56,3.18-.83a2.56,2.56,0,0,0,.92-1.64c0-.45-.93-1.87-1.25-1.87a2.48,2.48,0,0,1,.13,2.22c-.35.81-2.72.22-4.19,1.86a8.42,8.42,0,0,0-1.41,2.12,1.82,1.82,0,0,1-1.52,1.07,25.52,25.52,0,0,1-4.65-.06A.41.41,0,0,1,220.53,121.58Z"/>
<path class="cls-23"
d="M225.61,114.24l.06.11h0a6.64,6.64,0,0,1,1.05.12c.45.08.38.31.5.67s.68.39,1,.24.4-1,.52-1.3a2.64,2.64,0,0,1,.68-.89,1.24,1.24,0,0,0,.36-.78c.09-.43-.43-.61-.77-.63l.07.25Z"/>
<path class="cls-17"
d="M232.16,59.7c.32,1.48-.53,2.08-.34,2.87s.73.2,1.17.53a2.75,2.75,0,0,0,2.57,1.63,2.82,2.82,0,0,0,.57-.09,5.3,5.3,0,0,0,.67-.23l.4-.19a4.58,4.58,0,0,0,1.86-1.57h0a3.48,3.48,0,0,0,.35-.66,4.41,4.41,0,0,0,0-3c-.74-2.39-2.92-3.84-4.87-3.24A3.83,3.83,0,0,0,232.16,59.7Z"/>
<path class="cls-21"
d="M234.78,75.13c-.13,1,.71,2.22,1.62,3.15l-1.9,2a1.52,1.52,0,0,1-.68.4l0,0s.37,7.15-.14,8.34a2.6,2.6,0,0,0,.51,1.38c1.44,2,5.56,3.35,7.89,3.05a3.18,3.18,0,0,0,.75-.17c.59-3.16.49-18.93.49-18.93v-.38a8.32,8.32,0,0,0-1.65-5.42l-.14-.18s-.65-1.31-1.16-2.11a2.85,2.85,0,0,1-.09.44,1.8,1.8,0,0,1-1.52,1.46,5.44,5.44,0,0,1-3.32-.6.62.62,0,0,1-.3-.48c-.35,1.31-.65,2.9-.65,2.9a22.06,22.06,0,0,0-1,5.65c0,.34.1,1,.13,1.37Z"/>
<path class="cls-17"
d="M235.68,67.06c-.07.17-.15.37-.23.59a5.44,5.44,0,0,0,3.32.6,1.8,1.8,0,0,0,1.52-1.46l-.33-.44-.49-.66a13,13,0,0,1-.41-3,4.58,4.58,0,0,1-1.86,1.57l-.4.19a5.3,5.3,0,0,1-.67.23,3,3,0,0,1-.2,1.77C235.89,66.53,235.8,66.76,235.68,67.06Z"/>
<path class="cls-23"
d="M219.65,89.54a.47.47,0,0,0-.15.4h0l.09,0c.41-.1,2.57-1.56,3.1-1.4a20.86,20.86,0,0,0,3.45-.12l4.9-6.64,2.1-3.72.53-.93c0-.37-.13-1-.13-1.37h0l-3,6.16L226,88.22s-2.83,0-3.12-.06A22.33,22.33,0,0,0,219.65,89.54Z"/>
<polygon class="cls-13" points="226.45 89.96 215.76 90.5 216.54 89.84 225.62 89.41 226.45 89.96"/>
<polygon class="cls-13" points="210.32 80.69 216.54 89.84 215.76 90.5 209.31 80.55 210.32 80.69"/>
<polygon class="cls-14"
points="226.45 89.96 226.45 90.9 214.93 91.58 208.34 80.94 209.31 80.55 215.76 90.5 226.45 89.96"/>
<path class="cls-17"
d="M231,81.74l-4.9,6.64a20.86,20.86,0,0,1-3.45.12c-.53-.16-2.69,1.3-3.1,1.4l-.09,0c-.35.21-.43,1.09.51.77a14,14,0,0,1,2.75-1c.62,0,2.54.18,3,.19a2.06,2.06,0,0,0,1.25-.25l5.72-6.24c.15-.12,3.66-5.17,3.66-5.17-.91-.93-1.75-2.15-1.62-3.15Z"/>
<path d="M230.93,58a1.76,1.76,0,0,1,.4-.37c.09,0,.11-.06.2-.45a4.22,4.22,0,0,1,4.07-2.68h0a4,4,0,0,1,3.82,2.13s1.32,2.72.83,4a9.55,9.55,0,0,1-.7,1.46,3.49,3.49,0,0,0-.34.71c.21.28.36.31.36.31l.34,0-.3.16a.41.41,0,0,1-.23.06.79.79,0,0,1-.37-.1.92.92,0,0,1-.47-.67c-.07-.16-.32-.3-.55-.43s-.49-.28-.51-.47a1.39,1.39,0,0,1,0-.39c0-.46.13-1.24-.3-1.41a1.2,1.2,0,0,0-.41-.11h0a2.41,2.41,0,0,1,0,1.26l-.16.37-.05-.4a2.34,2.34,0,0,0-1.64-2,1.32,1.32,0,0,0-.74.16,1.36,1.36,0,0,1-.65.16,1.83,1.83,0,0,1-.44-.12.7.7,0,0,0-.55-.05,1.69,1.69,0,0,0-.45.19,1,1,0,0,1-.75.15.89.89,0,0,1-.61-.57A1,1,0,0,1,230.93,58Z"/>
<line class="cls-25" x1="234.78" y1="75.13" x2="238.1" y2="70.52"/>
<path class="cls-25" d="M240.89,75.52l-2.58,4.2a6.44,6.44,0,0,1-1.91-1.44"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
<title>Group 5 Copy 5</title>
<desc>Created with Sketch.</desc>
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox"
id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1"
result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix"
in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox"
id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1"
result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix"
in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" transform="translate(-1190.000000, -136.000000)">
<g id="Group-8" transform="translate(1167.000000, 0.000000)">
<g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-11" fill="#303648" mask="url(#mask-3)" x="-1" y="0" width="49"
height="10"></rect>
<rect id="Rectangle-18" fill="#303648" mask="url(#mask-3)" x="0" y="0" width="16"
height="44"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Some files were not shown because too many files have changed in this diff Show More