@ynight/core 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +472 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/base-class/controller.d.ts +42 -0
- package/dist/base-class/controller.d.ts.map +1 -0
- package/dist/base-class/controller.js +62 -0
- package/dist/base-class/controller.js.map +1 -0
- package/dist/base-class/service.d.ts +31 -0
- package/dist/base-class/service.d.ts.map +1 -0
- package/dist/base-class/service.js +42 -0
- package/dist/base-class/service.js.map +1 -0
- package/dist/core.d.ts +119 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +143 -0
- package/dist/core.js.map +1 -0
- package/dist/define-config.d.ts +26 -0
- package/dist/define-config.d.ts.map +1 -0
- package/dist/define-config.js +17 -0
- package/dist/define-config.js.map +1 -0
- package/dist/env.d.ts +40 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +54 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +86 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +226 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/loader/config.d.ts +31 -0
- package/dist/loader/config.d.ts.map +1 -0
- package/dist/loader/config.js +81 -0
- package/dist/loader/config.js.map +1 -0
- package/dist/loader/controller.d.ts +24 -0
- package/dist/loader/controller.d.ts.map +1 -0
- package/dist/loader/controller.js +39 -0
- package/dist/loader/controller.js.map +1 -0
- package/dist/loader/extend.d.ts +26 -0
- package/dist/loader/extend.d.ts.map +1 -0
- package/dist/loader/extend.js +53 -0
- package/dist/loader/extend.js.map +1 -0
- package/dist/loader/middleware.d.ts +29 -0
- package/dist/loader/middleware.d.ts.map +1 -0
- package/dist/loader/middleware.js +85 -0
- package/dist/loader/middleware.js.map +1 -0
- package/dist/loader/modules.d.ts +57 -0
- package/dist/loader/modules.d.ts.map +1 -0
- package/dist/loader/modules.js +168 -0
- package/dist/loader/modules.js.map +1 -0
- package/dist/loader/router-schema.d.ts +30 -0
- package/dist/loader/router-schema.d.ts.map +1 -0
- package/dist/loader/router-schema.js +52 -0
- package/dist/loader/router-schema.js.map +1 -0
- package/dist/loader/router.d.ts +24 -0
- package/dist/loader/router.d.ts.map +1 -0
- package/dist/loader/router.js +57 -0
- package/dist/loader/router.js.map +1 -0
- package/dist/loader/service.d.ts +24 -0
- package/dist/loader/service.d.ts.map +1 -0
- package/dist/loader/service.js +39 -0
- package/dist/loader/service.js.map +1 -0
- package/dist/logger.d.ts +48 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +67 -0
- package/dist/logger.js.map +1 -0
- package/dist/utils/index.d.ts +16 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +23 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +54 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 diaogroup
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,473 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @ynight/core
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Elpis 框架的服务端底层引擎:Koa 应用生命周期、约定式目录扫描与模块加载、Controller/Service 基类与日志能力。
|
|
4
|
+
|
|
5
|
+
## 概述
|
|
6
|
+
|
|
7
|
+
`@ynight/core` 是 Elpis 框架的服务端核心层,基于 [Koa](https://koajs.com/) 与 TypeScript 构建。它向上层 `@ynight/framework` 提供以下能力:
|
|
8
|
+
|
|
9
|
+
- 一个可托管(managed)的 Koa 应用容器,负责应用创建、HTTP 监听、优雅关闭与信号处理;
|
|
10
|
+
- 一组约定式目录 loader(加载器),按固定顺序扫描业务目录并自动装配 controller、service、middleware、extend、router-schema、router 与全局中间件;
|
|
11
|
+
- 一套基类与工具函数,让业务侧的 controller 与 service 继承后即可访问框架能力;
|
|
12
|
+
- 基于 [log4js](https://log4js-node.github.io/log4js-node/) 的内置日志器;
|
|
13
|
+
- 环境判定与运行时配置类型定义工具。
|
|
14
|
+
|
|
15
|
+
`@ynight/core` 不包含任何业务模型,仅作为框架底层引擎存在,业务代码通常通过上层 `@ynight/framework` 间接使用,也可以单独引用本包来构建定制化服务。
|
|
16
|
+
|
|
17
|
+
## 核心能力
|
|
18
|
+
|
|
19
|
+
- **应用生命周期管理**:提供 `createApplicationContainer` / `startApplicationContainer` 两个底层 API,以及 `createApplication` / `startApplication` 两个高级入口,处理 listen 幂等、close 幂等、超时兜底与信号处理器注册。
|
|
20
|
+
- **Koa 应用初始化与装配**:`ElipsCore.start()` 按固定顺序加载所有约定目录,返回一个已经完整装配的 `ElipsApplication`。
|
|
21
|
+
- **约定式目录扫描与模块加载**:内置 `config` / `controller` / `extend` / `middleware` / `router` / `router-schema` / `service` 共 7 个 loader,覆盖典型后端分层。
|
|
22
|
+
- **Controller / Service 基类**:`BaseController` 提供 `success` / `fail` 统一响应结构,`BaseService` 内置基于 axios 的 `curl` HTTP 客户端。
|
|
23
|
+
- **日志能力**:基于 log4js 实现,可同时输出到控制台与按天归档的文件 appender。
|
|
24
|
+
- **环境判定**:`ElipsEnv` 提供 `isLocal` / `isBeta` / `isTest` / `isProd` / `get` 一组方法,便于运行时分支判断。
|
|
25
|
+
- **配置类型定义**:`defineConfig` 与 `ElipsBuiltInConfig` 提供带类型推断的配置声明方式。
|
|
26
|
+
|
|
27
|
+
## 安装
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pnpm add @ynight/core
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
依赖要求:
|
|
34
|
+
|
|
35
|
+
- Node.js `>=22.0.0`
|
|
36
|
+
- Koa `^2.15.0`
|
|
37
|
+
- @koa/router `^15.1.1`
|
|
38
|
+
- axios `^1.13.2`
|
|
39
|
+
- log4js `^6.9.1`
|
|
40
|
+
- glob `^11.0.0`
|
|
41
|
+
|
|
42
|
+
## 快速开始
|
|
43
|
+
|
|
44
|
+
下面展示一个最简使用方式:通过 `startApplication` 启动一个已经装配好的 Elpis 应用。
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// app/controller/hello.ts
|
|
48
|
+
import { Context } from 'koa';
|
|
49
|
+
import { BaseController } from '@ynight/core';
|
|
50
|
+
|
|
51
|
+
export default class HelloController extends BaseController {
|
|
52
|
+
sayHi(ctx: Context) {
|
|
53
|
+
this.success(ctx, { message: 'hello, elpis' });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// app/router/hello.ts
|
|
60
|
+
export default (app: any, router: any) => {
|
|
61
|
+
const { hello } = app.controller;
|
|
62
|
+
router.get('/hello', hello.sayHi.bind(hello));
|
|
63
|
+
};
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// app/service/world.ts
|
|
68
|
+
import { BaseService } from '@ynight/core';
|
|
69
|
+
|
|
70
|
+
export default class WorldService extends BaseService {
|
|
71
|
+
getMessage() {
|
|
72
|
+
return 'world from service';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// config.default.ts
|
|
79
|
+
export default {
|
|
80
|
+
logger: {
|
|
81
|
+
level: 'info',
|
|
82
|
+
console: true,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// server.ts —— 启动入口
|
|
89
|
+
import { startApplication } from '@ynight/core';
|
|
90
|
+
|
|
91
|
+
startApplication({ baseDir: __dirname }).catch(err => {
|
|
92
|
+
console.error('应用启动失败', err);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
启动后访问 `http://localhost:3000/hello` 即可看到返回的 JSON 响应。
|
|
98
|
+
|
|
99
|
+
## API 参考
|
|
100
|
+
|
|
101
|
+
### 应用生命周期
|
|
102
|
+
|
|
103
|
+
#### `startApplication(options?)`
|
|
104
|
+
|
|
105
|
+
`@ynight/core` 推荐的生产入口。内部会:
|
|
106
|
+
|
|
107
|
+
1. 调用 `ElipsCore.start()` 装配 Koa 应用;
|
|
108
|
+
2. 调用 `listen` 启动 HTTP 监听;
|
|
109
|
+
3. 注册 `SIGINT` / `SIGTERM` 信号处理器,进程收到终止信号时自动优雅关闭。
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
function startApplication(options?: ElipsCoreOptions): Promise<ManagedElipsApplication>;
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
| 参数 | 类型 | 说明 |
|
|
116
|
+
| --------- | ---------------------------------- | ------------------------------------ |
|
|
117
|
+
| `options` | `ElipsCoreOptions` | 启动配置,可省略 |
|
|
118
|
+
| 返回值 | `Promise<ManagedElipsApplication>` | 已经监听端口并注册信号处理的托管应用 |
|
|
119
|
+
|
|
120
|
+
#### `createApplication(options?)`
|
|
121
|
+
|
|
122
|
+
与 `startApplication` 的区别:只装配应用并托管生命周期,不会自动调用 `listen` 也不会注册信号处理器。适合测试或自定义进程管理场景。
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
function createApplication(options?: ElipsCoreOptions): Promise<ManagedElipsApplication>;
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
#### `createApplicationContainer(options?)`
|
|
129
|
+
|
|
130
|
+
底层容器 API:直接创建一个托管应用并把 listen/close 收敛到一个确定的对象上。
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
function createApplicationContainer<TApp extends ApplicationContainerApp = Koa>(
|
|
134
|
+
options?: ApplicationContainerOptions<TApp>
|
|
135
|
+
): ManagedApplication<TApp>;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
关键设计:
|
|
139
|
+
|
|
140
|
+
- **listen 幂等**:重复调用 `listen()` 会复用第一次创建的 `http.Server`;并发调用复用同一个 `listening` Promise。
|
|
141
|
+
- **close 幂等**:重复调用 `close()` 会复用同一个 `closing` Promise。
|
|
142
|
+
- **不可逆**:调用 `close()` 后再次调用 `listen()` 会被拒绝并抛出 `ELPIS_APPLICATION_CLOSED` 错误。
|
|
143
|
+
- **超时兜底**:`closeTimeoutMs`(默认 10000ms)控制 server 关闭与 `onClose` 钩子的等待时长;超时后会强制销毁所有 socket 并调用 `closeAllConnections()` 防止长连接卡死。
|
|
144
|
+
- **WeakMap 防泄漏**:使用 `WeakMap` 记录每个托管应用注册的信号处理器清理函数,避免容器自身阻止应用被 GC。
|
|
145
|
+
- **错误聚合**:server 关闭错误与 `onClose` 钩子错误都会被收集,最终通过 `AggregateError` 一次性抛出。
|
|
146
|
+
|
|
147
|
+
#### `startApplicationContainer(managed, options?)`
|
|
148
|
+
|
|
149
|
+
在已托管应用上启动监听并注册 `SIGINT` / `SIGTERM` 信号处理器:
|
|
150
|
+
|
|
151
|
+
- 监听失败时会尝试调用 `close()` 清理已部分初始化的资源,清理失败则抛出 `AggregateError([listenError, cleanupError])`;
|
|
152
|
+
- 信号处理器使用 `process.once` 注册,同一信号不会重复触发关闭;
|
|
153
|
+
- 仅在第一次启动时注册清理函数,避免重复绑定。
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
function startApplicationContainer<TApp extends ApplicationContainerApp>(
|
|
157
|
+
managed: ManagedApplication<TApp>,
|
|
158
|
+
options?: { host?: string; port?: number }
|
|
159
|
+
): Promise<ManagedApplication<TApp>>;
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Koa 应用初始化与加载
|
|
163
|
+
|
|
164
|
+
#### `ElipsCore` 类
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
import ElipsCore from '@ynight/core';
|
|
168
|
+
|
|
169
|
+
const app = new ElipsCore().start({ baseDir: __dirname });
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
`start(options?)` 方法返回已经完整装配的 `ElipsApplication`,内部按以下顺序依次加载各模块:
|
|
173
|
+
|
|
174
|
+
1. **config** —— 加载 `config.default.*` 与 `config.{env}.*`,写入 `app.config`;
|
|
175
|
+
2. **logger** —— 基于 `app.config.logger` 创建 log4js logger;
|
|
176
|
+
3. **extend** —— 扫描并执行 extend 工厂函数,把结果挂到 `app.${name}`;
|
|
177
|
+
4. **middleware** —— 扫描并装配 middleware 文件,结果写入 `app.middlewares`;
|
|
178
|
+
5. **routerSchema** —— 扫描并合并 router-schema 文件,结果写入 `app.routerSchema`;
|
|
179
|
+
6. **service** —— 扫描并实例化 service class,结果写入 `app.service`;
|
|
180
|
+
7. **controller** —— 扫描并实例化 controller class,结果写入 `app.controller`;
|
|
181
|
+
8. **全局中间件** —— 若 `app/middleware.ts`(注意拼写沿用旧约定)存在则执行它;
|
|
182
|
+
9. **router** —— 扫描并注册所有路由文件,最后挂上 404 兜底路由;
|
|
183
|
+
10. **HTTP 监听** —— 若 `options.listen !== false` 且 `ENV !== test` 时调用 `app.listen()`。
|
|
184
|
+
|
|
185
|
+
#### `ElipsCoreOptions`
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
interface ElipsCoreOptions {
|
|
189
|
+
PORT?: string | number; // 监听端口,优先级高于环境变量 PORT
|
|
190
|
+
IP?: string; // 监听主机,优先级高于环境变量 IP
|
|
191
|
+
ext?: string; // 业务模块扩展名,默认取当前文件扩展名
|
|
192
|
+
baseDir?: string; // 应用根目录,默认 process.cwd()
|
|
193
|
+
businessPath?: string; // 业务文件目录,默认 ${baseDir}/app
|
|
194
|
+
configPath?: string; // 配置目录,默认 ${baseDir}/config
|
|
195
|
+
homePage?: string; // 首页路径(预留字段)
|
|
196
|
+
listen?: boolean; // 是否自动监听端口,默认 true
|
|
197
|
+
closeTimeoutMs?: number; // 关闭超时毫秒数,默认 10000
|
|
198
|
+
[key: string]: unknown; // 允许扩展自定义字段
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
#### `ElipsApplication`
|
|
203
|
+
|
|
204
|
+
框架对 Koa 应用的扩展类型(注意 `Omit<Koa, 'env'>` 排除了 Koa 内置的 `env` 字符串字段,改用框架自定义的 `ElipsEnv`):
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
interface ElipsApplication extends Omit<Koa, 'env'>, IApplication {
|
|
208
|
+
options: ElipsCoreOptions & { ext: string };
|
|
209
|
+
baseDir: string;
|
|
210
|
+
businessPath: string;
|
|
211
|
+
configPath: string;
|
|
212
|
+
env: ElipsEnv;
|
|
213
|
+
middlewares: IMiddleware; // 中间件命名空间
|
|
214
|
+
routerSchema: any; // 路由参数描述对象
|
|
215
|
+
controller: IController; // 控制器命名空间
|
|
216
|
+
service: IService; // 服务命名空间
|
|
217
|
+
config: AppConfig; // 已合并的配置
|
|
218
|
+
logger: ElipsLogger; // 框架内置 logger
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
其中 `IController` / `IService` / `IMiddleware` / `IApplication` / `AppConfigRegistry` 是 5 个空接口,业务应用可以通过 TypeScript [declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html) 机制补充具体类型:
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
// global.d.ts
|
|
226
|
+
import '@ynight/core';
|
|
227
|
+
|
|
228
|
+
declare module '@ynight/core' {
|
|
229
|
+
interface IController {
|
|
230
|
+
user: { list: (ctx: any) => Promise<void> };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 配置定义
|
|
236
|
+
|
|
237
|
+
#### `defineConfig(config)`
|
|
238
|
+
|
|
239
|
+
为业务配置对象保留完整类型推断,同时接受框架内置字段的类型校验。
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
import { defineConfig } from '@ynight/core';
|
|
243
|
+
|
|
244
|
+
export default defineConfig({
|
|
245
|
+
logger: {
|
|
246
|
+
level: 'info',
|
|
247
|
+
console: true,
|
|
248
|
+
file: { enabled: true, filename: 'logs/app.log' },
|
|
249
|
+
},
|
|
250
|
+
db: {
|
|
251
|
+
host: 'localhost',
|
|
252
|
+
port: 3306,
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
#### `ElipsBuiltInConfig`
|
|
258
|
+
|
|
259
|
+
业务配置应继承此接口以获得框架内置字段(如 `logger`)的类型约束:
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
interface ElipsBuiltInConfig {
|
|
263
|
+
logger?: ElipsLoggerOptions;
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
`defineConfig` 当前作为类型入口与未来扩展点存在,不会修改传入的对象,保证 `Object.is(defineConfig(c), c)` 为 `true`。
|
|
268
|
+
|
|
269
|
+
### 环境判定
|
|
270
|
+
|
|
271
|
+
#### `ElipsEnv` 类
|
|
272
|
+
|
|
273
|
+
通过 `process.env.ENV` 环境变量判定当前运行环境,支持 `local` / `beta` / `test` / `production` 四种环境。所有方法名采用严格相等(`===`)判定,`ENV` 的大小写必须完全匹配。
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
class ElipsEnv {
|
|
277
|
+
isLocal(): boolean; // ENV=local
|
|
278
|
+
isBeta(): boolean; // ENV=beta
|
|
279
|
+
isTest(): boolean; // ENV=test
|
|
280
|
+
isProd(): boolean; // ENV=production
|
|
281
|
+
get(): string; // 返回环境名,未设置时默认 'local'
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
通常不需要手动 `new ElipsEnv()`,框架在 `start()` 时会自动实例化并挂到 `app.env` 上。
|
|
286
|
+
|
|
287
|
+
### 日志
|
|
288
|
+
|
|
289
|
+
#### `createLogger(app)`
|
|
290
|
+
|
|
291
|
+
创建框架内置 logger:
|
|
292
|
+
|
|
293
|
+
```typescript
|
|
294
|
+
function createLogger(app: ElipsApplication): ElipsLogger;
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
装配逻辑:
|
|
298
|
+
|
|
299
|
+
1. 默认启用 `console` appender,若 `options.console !== false` 则加入启用列表;
|
|
300
|
+
2. 当 `file.enabled` 为 `true` 时构造 `dateFile` appender,自动创建日志目录,按 `.yyyy-MM-dd` 归档;
|
|
301
|
+
3. 若没有任何 appender 被启用(如 `console=false` 且 `file.enabled=false`),退回 `console` 但级别设为 `off`,避免日志静默丢失;
|
|
302
|
+
4. 调用 `log4js.configure` 并返回默认 logger 实例。
|
|
303
|
+
|
|
304
|
+
#### `ElipsLoggerOptions`
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
interface ElipsLoggerOptions {
|
|
308
|
+
level?: string; // trace/debug/info/warn/error/fatal,默认 info
|
|
309
|
+
console?: boolean; // 是否启用控制台,默认 true
|
|
310
|
+
file?: ElipsLoggerFileOptions; // 文件输出配置
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
interface ElipsLoggerFileOptions {
|
|
314
|
+
enabled?: boolean; // 是否启用文件输出,默认 false
|
|
315
|
+
filename?: string; // 日志文件路径,相对路径基于 app.baseDir
|
|
316
|
+
pattern?: string; // 归档命名模式,默认 '.yyyy-MM-dd'
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
#### `ElipsLogger`
|
|
321
|
+
|
|
322
|
+
```typescript
|
|
323
|
+
type ElipsLogger = Logger; // 复用 log4js 的 Logger 接口
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
通过 `app.logger` 访问:
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
app.logger.info('hello %s', 'elpis');
|
|
330
|
+
app.logger.error(err);
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### 基类
|
|
334
|
+
|
|
335
|
+
#### `BaseController`
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
import { Context } from 'koa';
|
|
339
|
+
import { BaseController } from '@ynight/core';
|
|
340
|
+
|
|
341
|
+
export default class UserController extends BaseController {
|
|
342
|
+
async list(ctx: Context) {
|
|
343
|
+
const data = await this.app.service.user.findAll();
|
|
344
|
+
this.success(ctx, data);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
async failDemo(ctx: Context) {
|
|
348
|
+
this.fail(ctx, '用户不存在', 1001);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**继承成员**:
|
|
354
|
+
|
|
355
|
+
- `readonly app: ElipsApplication` —— 由 controller loader 自动注入;
|
|
356
|
+
- `success(ctx, data?, metadata?)` —— 设置 `ctx.status = 200` 并写入 `{ success: true, data, metadata }`;
|
|
357
|
+
- `fail(ctx, message, code)` —— 设置 `ctx.status = 200` 并写入 `{ success: false, message, code }`(注意 status 仍为 200,错误通过业务字段传递,便于与仅识别 HTTP 200 的前端拦截器兼容)。
|
|
358
|
+
|
|
359
|
+
#### `BaseService`
|
|
360
|
+
|
|
361
|
+
```typescript
|
|
362
|
+
import { BaseService } from '@ynight/core';
|
|
363
|
+
|
|
364
|
+
export default class UserService extends BaseService {
|
|
365
|
+
async findAll() {
|
|
366
|
+
const res = await this.curl.get('/api/users');
|
|
367
|
+
return res.data;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
**继承成员**:
|
|
373
|
+
|
|
374
|
+
- `readonly app: ElipsApplication` —— 由 service loader 自动注入;
|
|
375
|
+
- `readonly curl` —— 基于 axios 的 HTTP 客户端实例,默认超时 `1000ms`,业务可在构造函数中扩展 `baseURL`、拦截器等配置。
|
|
376
|
+
|
|
377
|
+
### 加载器(Loader)
|
|
378
|
+
|
|
379
|
+
所有 loader 均在 `ElipsCore.start()` 内部按固定顺序实例化。loader 自身不导出供业务调用的 API(除 `modules` 工具函数外),下表描述每个 loader 的职责与命名规则。
|
|
380
|
+
|
|
381
|
+
| Loader | 职责 | 扫描目录 | 输出位置 |
|
|
382
|
+
| ------------------------- | ---------------------------------------------------- | ------------------------------------ | ---------------------------------- |
|
|
383
|
+
| `ElipsConfigLoader` | 加载 `config.default.*` 与 `config.{env}.*` 并浅合并 | `${configPath}` | `app.config` |
|
|
384
|
+
| `ElipsExtendLoader` | 扫描 extend 文件并执行工厂函数 | `${businessPath}/extend/**/*` | `app.${camelCaseName}` |
|
|
385
|
+
| `ElipsMiddlewareLoader` | 扫描 middleware 文件并执行工厂函数 | `${businessPath}/middleware/**/*` | `app.middlewares.${camelCasePath}` |
|
|
386
|
+
| `ElipsRouterSchemaLoader` | 扫描 schema 文件并浅合并到一个对象 | `${businessPath}/router-schema/**/*` | `app.routerSchema`(扁平) |
|
|
387
|
+
| `ElipsServiceLoader` | 扫描 service class 文件并实例化 | `${businessPath}/service/**/*` | `app.service.${camelCasePath}` |
|
|
388
|
+
| `ElipsControllerLoader` | 扫描 controller class 文件并实例化 | `${businessPath}/controller/**/*` | `app.controller.${camelCasePath}` |
|
|
389
|
+
| `ElipsRouterLoader` | 扫描 router 文件并注册到 KoaRouter | `${businessPath}/router/**/*` | `app.use(router.routes())` |
|
|
390
|
+
|
|
391
|
+
#### 命名规则
|
|
392
|
+
|
|
393
|
+
- 文件名 / 目录名中的 `-` 和 `_` 会被转换为小驼峰(`custom-extend` → `customExtend`);
|
|
394
|
+
- 嵌套目录映射为对象嵌套(`order/list.ts` → `app.service.order.list`);
|
|
395
|
+
- 业务模块名称禁止使用 `__proto__` / `prototype` / `constructor`,会触发原型链防护检查。
|
|
396
|
+
|
|
397
|
+
#### Loader 工具函数
|
|
398
|
+
|
|
399
|
+
以下 4 个工具函数从 `@ynight/core` 命名导出,可被 SDK、测试工具或自定义 loader 复用:
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
import { listModuleFiles, readModule, loadModuleTree, loadClassModules } from '@ynight/core';
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
##### `listModuleFiles(root, extension)`
|
|
406
|
+
|
|
407
|
+
递归扫描 `root` 目录,收集所有匹配扩展名的文件路径。
|
|
408
|
+
|
|
409
|
+
- 扩展名白名单:`.ts` / `.js` / `.cjs`,其他扩展名会抛出错误;
|
|
410
|
+
- 自动忽略 `.d.ts`;
|
|
411
|
+
- 目录按字典序遍历,保证加载顺序稳定;
|
|
412
|
+
- 目录不存在时返回空数组而非抛错。
|
|
413
|
+
|
|
414
|
+
##### `readModule(file)`
|
|
415
|
+
|
|
416
|
+
读取并解析一个业务模块,自动解包 ESM/TS 编译后的 `{ default: ... }` 形态;`require` 失败时抛出带 `cause` 字段的链式异常。
|
|
417
|
+
|
|
418
|
+
##### `loadModuleTree(root, extension, instantiate)`
|
|
419
|
+
|
|
420
|
+
通用模块树加载器:扫描目录并按嵌套路径构建命名空间对象。
|
|
421
|
+
|
|
422
|
+
- 每段路径转小驼峰后作为命名空间 key;
|
|
423
|
+
- 通过 `instantiate` 回调实例化每个叶子模块;
|
|
424
|
+
- 检测并报错:禁止使用 `__proto__` / `prototype` / `constructor` 等危险 key;同名叶子或同名中间目录冲突时报错。
|
|
425
|
+
|
|
426
|
+
##### `loadClassModules(root, extension, app)`
|
|
427
|
+
|
|
428
|
+
加载以 class 为导出形式的业务模块(controller / service 场景):
|
|
429
|
+
|
|
430
|
+
- 内部调用 `loadModuleTree` 完成扫描与命名空间构建;
|
|
431
|
+
- 对每个叶子,校验导出必须是函数(class),然后用 `new Constructor(app)` 实例化;
|
|
432
|
+
- 构造失败时抛出带 `cause` 的错误链。
|
|
433
|
+
|
|
434
|
+
## 加载顺序与约束
|
|
435
|
+
|
|
436
|
+
`ElipsCore.start()` 内部按以下固定顺序装配应用,**不可调整**:
|
|
437
|
+
|
|
438
|
+
```text
|
|
439
|
+
config → logger → extend → middleware → routerSchema → service → controller → 全局中间件 → router → listen
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### 为什么是这个顺序?
|
|
443
|
+
|
|
444
|
+
1. **config 先**:其它模块(logger、service、extend 等)都可能依赖配置信息,必须先就绪;
|
|
445
|
+
2. **logger 次之**:所有 loader 在执行过程中都可能输出日志,必须先创建 logger;
|
|
446
|
+
3. **extend 第三**:extend 给 app 注入额外能力,后续 middleware 与 service 可能用到;
|
|
447
|
+
4. **middleware 第四**:middleware 可能使用 config、logger、extend;
|
|
448
|
+
5. **routerSchema 第五**:路由参数校验规则要在 router 注册前就绪,便于校验请求参数;
|
|
449
|
+
6. **service 第六**:controller 必然依赖 service,因此 service 必须在 controller 之前加载;
|
|
450
|
+
7. **controller 最后业务模块**:controller 依赖 service、config、logger、extend;
|
|
451
|
+
8. **全局中间件**:与目录式中间件不同,这是一个单一入口文件 `app/middleware.ts`,支持默认导出或具名导出的工厂函数;
|
|
452
|
+
9. **router**:所有路由文件注册完毕后由 router loader 统一挂载到 Koa 上,并加上 404 兜底;
|
|
453
|
+
10. **listen**:在测试环境(`ENV=test`)或显式 `listen: false` 时跳过监听。
|
|
454
|
+
|
|
455
|
+
### 命名冲突与防护
|
|
456
|
+
|
|
457
|
+
- **同名叶子冲突**:两个模块文件映射到同一命名空间 key(如 `app/service/user.ts` 与 `app/service/user/index.ts`)会抛出错误;
|
|
458
|
+
- **叶子与中间目录冲突**:文件不能与已有的中间目录同名,反之亦然;
|
|
459
|
+
- **原型链防护**:`__proto__` / `prototype` / `constructor` 等危险 key 直接拒绝;
|
|
460
|
+
- **extend 覆盖防护**:extend 文件名若与 Koa/框架已有属性同名(如 `listen`、`use`),loader 会输出警告并跳过挂载,避免破坏内置能力。
|
|
461
|
+
|
|
462
|
+
## 相关包
|
|
463
|
+
|
|
464
|
+
- [@ynight/framework](../framework) —— 框架主入口,依赖本包;
|
|
465
|
+
- [@ynight/contracts](../contracts) —— 类型契约,提供跨包共享的类型定义。
|
|
466
|
+
|
|
467
|
+
## 引擎要求
|
|
468
|
+
|
|
469
|
+
- Node.js `>=22.0.0`
|
|
470
|
+
|
|
471
|
+
## 许可证
|
|
472
|
+
|
|
473
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/sqlite.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/index.d.ts","../../../node_modules/.pnpm/@types+accepts@1.3.7/node_modules/@types/accepts/index.d.ts","../../../node_modules/.pnpm/@types+connect@3.4.38/node_modules/@types/connect/index.d.ts","../../../node_modules/.pnpm/@types+send@1.2.1/node_modules/@types/send/index.d.ts","../../../node_modules/.pnpm/@types+qs@6.14.0/node_modules/@types/qs/index.d.ts","../../../node_modules/.pnpm/@types+range-parser@1.2.7/node_modules/@types/range-parser/index.d.ts","../../../node_modules/.pnpm/@types+express-serve-static-core@5.1.0/node_modules/@types/express-serve-static-core/index.d.ts","../../../node_modules/.pnpm/@types+http-errors@2.0.5/node_modules/@types/http-errors/index.d.ts","../../../node_modules/.pnpm/@types+serve-static@2.2.0/node_modules/@types/serve-static/index.d.ts","../../../node_modules/.pnpm/@types+body-parser@1.19.6/node_modules/@types/body-parser/index.d.ts","../../../node_modules/.pnpm/@types+express@5.0.6/node_modules/@types/express/index.d.ts","../../../node_modules/.pnpm/@types+keygrip@1.0.6/node_modules/@types/keygrip/index.d.ts","../../../node_modules/.pnpm/@types+cookies@0.9.2/node_modules/@types/cookies/index.d.ts","../../../node_modules/.pnpm/@types+http-assert@1.5.6/node_modules/@types/http-assert/index.d.ts","../../../node_modules/.pnpm/@types+content-disposition@0.5.9/node_modules/@types/content-disposition/index.d.ts","../../../node_modules/.pnpm/@types+koa-compose@3.2.9/node_modules/@types/koa-compose/index.d.ts","../../../node_modules/.pnpm/@types+koa@2.15.0/node_modules/@types/koa/index.d.ts","../src/lifecycle.ts","../src/env.ts","../src/loader/modules.ts","../src/base-class/controller.ts","../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/index.d.ts","../src/base-class/service.ts","../../../node_modules/.pnpm/log4js@6.9.1/node_modules/log4js/types/log4js.d.ts","../src/logger.ts","../src/define-config.ts","../src/index.ts","../src/loader/config.ts","../src/loader/controller.ts","../../../node_modules/.pnpm/minipass@7.1.2/node_modules/minipass/dist/commonjs/index.d.ts","../../../node_modules/.pnpm/lru-cache@11.2.4/node_modules/lru-cache/dist/commonjs/index.d.ts","../../../node_modules/.pnpm/path-scurry@2.0.1/node_modules/path-scurry/dist/commonjs/index.d.ts","../../../node_modules/.pnpm/minimatch@10.1.1/node_modules/minimatch/dist/commonjs/ast.d.ts","../../../node_modules/.pnpm/minimatch@10.1.1/node_modules/minimatch/dist/commonjs/escape.d.ts","../../../node_modules/.pnpm/minimatch@10.1.1/node_modules/minimatch/dist/commonjs/unescape.d.ts","../../../node_modules/.pnpm/minimatch@10.1.1/node_modules/minimatch/dist/commonjs/index.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/pattern.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/processor.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/walker.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/ignore.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/glob.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/has-magic.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/index.d.ts","../src/loader/extend.ts","../src/loader/middleware.ts","../../../node_modules/.pnpm/path-to-regexp@8.3.0/node_modules/path-to-regexp/dist/index.d.ts","../../../node_modules/.pnpm/@koa+router@15.1.1_koa@2.16.3/node_modules/@koa/router/dist/index.d.ts","../src/loader/router.ts","../src/loader/service.ts","../src/loader/router-schema.ts","../src/core.ts","../src/utils/index.ts"],"fileIdsList":[[64,114,131,132,180,209],[64,114,128,131,132,164],[64,114,128,131,132,164,166],[64,114,131,132],[64,114,128,131,132,164,166,174,175],[64,114,125,128,131,132,164,167,168,169],[64,114,131,132,170,172,173],[64,114,131,132,180],[64,113,114,125,128,129,131,132,134,140,157,164,165,171,175,176,177,178,179],[64,111,112,114,131,132],[64,113,114,131,132],[114,131,132],[64,114,119,131,132,149],[64,114,115,120,125,131,132,134,146,157],[64,114,115,116,125,131,132,134],[59,60,61,64,114,131,132],[64,114,117,131,132,158],[64,114,118,119,126,131,132,135],[64,114,119,131,132,146,154],[64,114,120,122,125,131,132,134],[64,113,114,121,131,132],[64,114,122,123,131,132],[64,114,124,125,131,132],[64,113,114,125,131,132],[64,114,125,126,127,131,132,146,157],[64,114,125,126,127,131,132,141,146,149],[64,106,114,122,125,128,131,132,134,146,157],[64,114,125,126,128,129,131,132,134,146,154,157],[64,114,128,130,131,132,146,154,157],[62,63,64,65,66,67,68,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[64,114,125,131,132],[64,114,131,132,133,157],[64,114,122,125,131,132,134,146],[64,114,131,132,135],[64,114,131,132,136],[64,113,114,131,132,137],[64,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[64,114,131,132,139],[64,114,131,132,140],[64,114,125,131,132,141,142],[64,114,131,132,141,143,158,160],[64,114,126,131,132],[64,114,125,131,132,146,147,149],[64,114,131,132,148,149],[64,114,131,132,146,147],[64,114,131,132,149],[64,114,131,132,150],[64,111,114,131,132,146,151,157],[64,114,125,131,132,152,153],[64,114,131,132,152,153],[64,114,119,131,132,134,146,154],[64,114,131,132,155],[64,114,131,132,134,156],[64,114,128,131,132,140,157],[64,114,119,131,132,158],[64,114,131,132,146,159],[64,114,131,132,133,160],[64,114,131,132,161],[64,106,114,131,132],[64,106,114,125,127,131,132,137,146,149,157,159,160,162],[64,114,131,132,146,163],[64,114,126,131,132,146,164],[64,114,128,131,132,164,171],[64,114,131,132,193,195,199,200,203],[64,114,131,132,204],[64,114,131,132,195,199,202],[64,114,131,132,193,195,199,202,203,204,205],[64,114,131,132,199],[64,114,131,132,195,199,200,202],[64,114,131,132,193,195,200,201,203],[64,114,131,132,196,197,198],[64,114,125,131,132,150,164],[64,114,126,131,132,136,193,194],[64,78,82,114,131,132,157],[64,78,114,131,132,146,157],[64,73,114,131,132],[64,75,78,114,131,132,154,157],[64,114,131,132,134,154],[64,114,131,132,164],[64,73,114,131,132,164],[64,75,78,114,131,132,134,157],[64,70,71,74,77,114,125,131,132,146,157],[64,78,85,114,131,132],[64,70,76,114,131,132],[64,78,99,100,114,131,132],[64,74,78,114,131,132,149,157,164],[64,99,114,131,132,164],[64,72,73,114,131,132,164],[64,78,114,131,132],[64,72,73,74,75,76,77,78,79,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,100,101,102,103,104,105,114,131,132],[64,78,93,114,131,132],[64,78,85,86,114,131,132],[64,76,78,86,87,114,131,132],[64,77,114,131,132],[64,70,73,78,114,131,132],[64,78,82,86,87,114,131,132],[64,82,114,131,132],[64,76,78,81,114,131,132,157],[64,70,75,78,85,114,131,132],[64,114,131,132,146],[64,73,78,99,114,131,132,162,164],[58,64,114,131,132,180,190],[58,64,114,131,132,185,190],[58,64,114,131,132,136,180,181,182,188,190,191,192,207,208,211,212,213],[58,64,114,131,132,188],[58,64,114,131,132],[58,64,114,131,132,181,183,184,186,188,189,214],[58,64,114,128,131,132,134,180],[58,64,114,126,131,132,136,190],[58,64,114,131,132,136,183,190],[58,64,114,131,132,136,190,206],[58,64,114,126,131,132,136],[58,64,114,131,132,136,190,206,210],[58,64,114,126,131,132,136,187,214]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"f429b61e369208ef7668ebf1dc63176e506fbfaea7b0ecc13d586a5839ebb071","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"168d88e14e0d81fe170e0dadd38ae9d217476c11435ea640ddb9b7382bdb6c1f","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"8e04cf0688e0d921111659c2b55851957017148fa7b977b02727477d155b3c47","impliedFormat":1},{"version":"6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","impliedFormat":1},{"version":"e3ccea927a3e1cb3895f549c439452774db977521d2086738642ef1e1608ba64","impliedFormat":1},{"version":"fbf802b3a028f5eb22ad406ee5fc7c368f0acfd3a2a6d0f805120766f5717ec8","impliedFormat":1},{"version":"0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","impliedFormat":1},{"version":"2e9a5180cb127e7614170db6d4452e1bc604bdd2f7921e28f799c460c88e8c35","impliedFormat":1},{"version":"8cf9b9045a614f883b623c2f1a631ec6a93321747e933330b2eec0ee47164a34","impliedFormat":1},{"version":"e0af410e0f8c37fc813a1c7406ea73601fae97758c8cf27944ca91f5f1fc647d","signature":"ada6e3c9a7ad72cc13fa3c0ca062803db1649e5aee983953317e5038ee515cdd"},{"version":"c852fc3644b6b4d5f96cfb4dc834c1816227fc785a0e504fed483ce5190af930","signature":"b19ac92477a56e50e8286680c0c0621c78825440ad49b2e9eb2f642b84c3ba1a"},{"version":"7bf0d5bbbbd7e2c096c3b4bcd7eb16c5bbc35038c2783a59aa17fac2208e9171","signature":"44b467ab86ecd7c0dc3f10088d607774ec8482f266523627cb74a55e4f5e4305"},{"version":"6b441f22e1c8b3293a8690f608b3e0281bde92725237b42328c9f077a35cce13","signature":"3770f1580d0f8aa122827322f7c82fbe778560ce90d12d6e7c1d0f937e504fb2"},{"version":"1c9800fbae1b443d77672e6d3e715df7280479b7c41f08cb790e750f01b50d90","impliedFormat":99},{"version":"c58e0028e89d2499755cd9d36f57af06ce2395d49fe062b528519c5aa3015d02","signature":"54b4746be3ae10f4fb9d3274d3b0e62a5b79225a5efa66063dbaed4735662836"},{"version":"07eaba6c381ae3c3f513d61a39adc62373fa538f5f2e3852abbc7505f45e44b6","impliedFormat":1},{"version":"469553c9721c50aec757899f581032c92c0b4127642f844a5031aefce965473a","signature":"4b666ac1a7990c9486baa19cd3e53f8c9c5e32c0598e187a770ad74c99ed9c3c"},{"version":"22424c3f240fe46994bcd3f98c79c39cf8a79edba248278e5dee27dacb291783","signature":"b7eb7f5f605a366de5c0369c3c37faae65b6cedbeea1c02af181c150a27c87f5"},{"version":"402de08fca360d13663f4856674b922b8e46efdffa87996cb2acf899dacee025","signature":"ec39189f03830bd45a87edb9a42652496b53680436a2768ad2d076e67946b888"},{"version":"baa71d87a0d726eded3d9238e3260596a742709348e9afdb1dfbadc4c894022e","signature":"e35bd56a3656457d9b255d4e3efffb96fc8949c0da4b8d1474bfdfa5251d0baa"},{"version":"3c03afb0445285b225d41aae977a3e97544f29c8bf29b6f11c5117315cfc3f07","signature":"127248064fb2caf58b241ba43be526d8041316c470ddea6fc19e3db419930539"},{"version":"041597c12abeaa2ef07766775955fc87cfc65c43e0fe86c836071bea787e967c","impliedFormat":1},{"version":"044e197786d0bd718281d6f4ab7332684bc7c7b3ba8ecda54ac5038c89e6e0bb","impliedFormat":1},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":1},{"version":"7212c2d58855b8df35275180e97903a4b6093d4fbaefea863d8d028da63938c6","impliedFormat":1},{"version":"d8a6b3f899917210f00ddf13b564a2a4fdcf1e50c5a22e8d3abcfd4f1c4f9ae1","impliedFormat":1},{"version":"fd5eab954b31e761a72234031dadc3aab768763942a9637e380aed441cc94f59","impliedFormat":1},{"version":"c7aaac3119acf27e03190cc4224f1d81c7498cf6b36fa72d10d99f2c41d1bbc0","impliedFormat":1},{"version":"dd9faff42b456b5f03b85d8fbd64838eb92f6f7b03b36322cbc59c005b7033d3","impliedFormat":1},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":1},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":1},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":1},{"version":"59c44b081724d4ab8039988aba34ee6b3bd41c30fc2d8686f4ed06588397b2f7","impliedFormat":1},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":1},{"version":"2b90463c902dbe4f5bbb9eae084c05de37477c17a5de1e342eb7cbc9410dc6a1","impliedFormat":1},{"version":"8cd4b9d5dec458d01d41e1d1dbc6db80332d6a2617aa1da09743ff8311d26d08","signature":"8638855504b37b5073c6b8847361c8145cfe733a5fd48e9d882ada2a0a432398"},{"version":"19ca0edc946ed47a731b7aa7b4a4f046dae8ad621766ced05b3641552b122b19","signature":"25542b6d9e30c5e2a33e61271f9f0259ad9ee86810c0f71a63d392a6064b76a3"},{"version":"9a40a3320a2301a30e155d4d8445d971ad516a73222c1374b204fbe90d6f5203","impliedFormat":1},{"version":"de86308e6e819652ab8c70c9356d528f999cfc22a54ed721da2287e83a8f6609","impliedFormat":1},{"version":"159fd6ba7d7797fbf06d9b3e2abec3139f2129109c95618b6218fa84e584771e","signature":"4f6ffdf3b696e80bf9513b7702bf8a7959a3e3f2a4fb1827aca6c91c2c773f97"},{"version":"aabc60fb7b65d334adb09e93a6530fedeb1e13ae924c68d7bd509a52a2ac6dd5","signature":"3354492e13b979a43e264202f4026bcd9cf20a5cff96de2cf01fa558e47308a3"},{"version":"fca938c2b4967ad2c8057742e647e014f8104ad131ea4857f4b69f14c419a46b","signature":"1ea5b740ebc8a27f3d88aa6c7a0a3c3884881ac8f04df6d0ef25c6bafbb4453b"},{"version":"c259207baf838f8a1303526ccd300921bbba3935a37301e62403b25ab2d6fa80","signature":"c7d1d8e785136cdc418db831074223d5629cddb95112b8b2dea0c5ae6977eea0"},{"version":"6dd897d393ad5400cbe7c5211aa5dd08ec5ec989962160bbf9ace93da2b01c5c","signature":"8d1a655a27915193a40360ce6cb9c03332a3d28958ae89e4f50614f347f68b81"}],"root":[[181,184],186,[188,192],207,208,[211,215]],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"importHelpers":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitOverride":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"../src","skipDefaultLibCheck":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","useUnknownInCatchVariables":true},"referencedMap":[[210,1],[165,2],[173,3],[166,2],[178,4],[176,5],[170,6],[174,7],[177,4],[171,4],[175,4],[179,8],[180,9],[111,10],[112,10],[113,11],[64,12],[114,13],[115,14],[116,15],[59,4],[62,16],[60,4],[61,4],[117,17],[118,18],[119,19],[120,20],[121,21],[122,22],[123,22],[124,23],[125,24],[126,25],[127,26],[65,4],[63,4],[128,27],[129,28],[130,29],[164,30],[131,31],[132,4],[133,32],[134,33],[135,34],[136,35],[137,36],[138,37],[139,38],[140,39],[141,40],[142,40],[143,41],[144,4],[145,42],[146,43],[148,44],[147,45],[149,46],[150,47],[151,48],[152,49],[153,50],[154,51],[155,52],[156,53],[157,54],[158,55],[159,56],[160,57],[161,58],[66,4],[67,4],[68,4],[107,59],[108,4],[109,4],[110,46],[162,60],[163,61],[168,4],[169,4],[167,62],[172,63],[185,4],[69,4],[204,64],[205,65],[203,66],[206,67],[200,68],[201,69],[202,70],[187,4],[194,4],[196,68],[197,68],[199,71],[198,68],[193,72],[195,73],[209,4],[58,4],[56,4],[57,4],[11,4],[10,4],[2,4],[12,4],[13,4],[14,4],[15,4],[16,4],[17,4],[18,4],[19,4],[3,4],[20,4],[21,4],[4,4],[22,4],[26,4],[23,4],[24,4],[25,4],[27,4],[28,4],[29,4],[5,4],[30,4],[31,4],[32,4],[33,4],[6,4],[37,4],[34,4],[35,4],[36,4],[38,4],[7,4],[39,4],[44,4],[45,4],[40,4],[41,4],[42,4],[43,4],[8,4],[49,4],[46,4],[47,4],[48,4],[50,4],[9,4],[51,4],[52,4],[53,4],[55,4],[54,4],[1,4],[85,74],[95,75],[84,74],[105,76],[76,77],[75,78],[104,79],[98,80],[103,81],[78,82],[92,83],[77,84],[101,85],[73,86],[72,79],[102,87],[74,88],[79,89],[80,4],[83,89],[70,4],[106,90],[96,91],[87,92],[88,93],[90,94],[86,95],[89,96],[99,79],[81,97],[82,98],[91,99],[71,100],[94,91],[93,89],[97,4],[100,101],[184,102],[186,103],[214,104],[189,105],[182,106],[190,107],[181,108],[191,109],[192,110],[207,111],[208,111],[183,112],[213,111],[211,113],[212,110],[188,114],[215,106]],"version":"5.9.3"}
|