@feng3d/ctc 0.0.19 → 0.1.0

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.
Files changed (40) hide show
  1. package/README.md +82 -106
  2. package/dist/cli.d.ts +13 -11
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +188 -1067
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +18 -55
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +42 -188
  9. package/dist/config.js.map +1 -1
  10. package/dist/controller.d.ts +47 -5
  11. package/dist/controller.d.ts.map +1 -1
  12. package/dist/controller.js +10 -15
  13. package/dist/controller.js.map +1 -1
  14. package/dist/handlers/unified-handler.d.ts.map +1 -1
  15. package/dist/handlers/unified-handler.js +3 -1
  16. package/dist/handlers/unified-handler.js.map +1 -1
  17. package/dist/index.d.ts +20 -16
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +17 -328
  20. package/dist/index.js.map +1 -1
  21. package/dist/proxy-manager.d.ts +32 -32
  22. package/dist/proxy-manager.d.ts.map +1 -1
  23. package/dist/proxy-manager.js +81 -66
  24. package/dist/proxy-manager.js.map +1 -1
  25. package/package.json +5 -6
  26. package/admin-ui/dist/app.js +0 -29
  27. package/admin-ui/dist/index.html +0 -222
  28. package/admin-ui/dist/style.css +0 -1
  29. package/dist/admin-server.d.ts +0 -143
  30. package/dist/admin-server.d.ts.map +0 -1
  31. package/dist/admin-server.js +0 -407
  32. package/dist/admin-server.js.map +0 -1
  33. package/dist/forward-proxy.d.ts +0 -100
  34. package/dist/forward-proxy.d.ts.map +0 -1
  35. package/dist/forward-proxy.js +0 -407
  36. package/dist/forward-proxy.js.map +0 -1
  37. package/dist/ipc-handler.d.ts +0 -52
  38. package/dist/ipc-handler.d.ts.map +0 -1
  39. package/dist/ipc-handler.js +0 -110
  40. package/dist/ipc-handler.js.map +0 -1
@@ -1,407 +0,0 @@
1
- /**
2
- * @module admin-server
3
- * @description 客户端管理页面 HTTP 服务器模块。
4
- * 提供一个本地 HTTP 服务,用于查看客户端状态和管理代理映射。
5
- * 支持反向代理模式和正向穿透模式。
6
- */
7
- import { createServer } from 'http';
8
- import { readFile } from 'fs';
9
- import { join, dirname } from 'path';
10
- import { fileURLToPath } from 'url';
11
- /**
12
- * 管理页面服务器类
13
- *
14
- * 在本地启动一个 HTTP 服务器,提供状态查询和代理管理的 API 接口,
15
- * 以及一个可视化的 Web 管理界面。
16
- */
17
- export class AdminServer {
18
- /**
19
- * 创建管理服务器实例
20
- *
21
- * @param config - 服务器配置
22
- * @param getStatus - 获取状态的回调函数
23
- * @param addProxy - 添加反向代理的回调函数
24
- * @param removeProxy - 删除反向代理的回调函数
25
- * @param addForwardProxy - 添加正向穿透的回调函数
26
- * @param removeForwardProxy - 删除正向穿透的回调函数
27
- * @param registerClient - 注册客户端的回调函数
28
- * @param getClientList - 获取客户端列表的回调函数
29
- * @param reconnect - 触发重连的回调函数
30
- */
31
- constructor(config, getStatus, addProxy, removeProxy, addForwardProxy, removeForwardProxy, registerClient, getClientList, sendMessage, reconnect) {
32
- /** 正向穿透代理列表(用于存储运行时的正向穿透配置) */
33
- this.forwardProxies = new Map();
34
- this.port = config.port;
35
- this.host = config.host;
36
- this.startedAt = Date.now();
37
- this.getStatusCallback = getStatus;
38
- this.addProxyCallback = addProxy;
39
- this.removeProxyCallback = removeProxy;
40
- this.addForwardProxyCallback = addForwardProxy;
41
- this.removeForwardProxyCallback = removeForwardProxy;
42
- this.registerClientCallback = registerClient;
43
- this.getClientListCallback = getClientList;
44
- this.sendMessageCallback = sendMessage;
45
- this.reconnectCallback = reconnect;
46
- this.server = createServer((req, res) => this.handleRequest(req, res));
47
- }
48
- /**
49
- * 设置发送消息的回调
50
- */
51
- setSendMessageCallback(callback) {
52
- this.sendMessageCallback = callback;
53
- }
54
- /**
55
- * 设置重连回调
56
- */
57
- setReconnectCallback(callback) {
58
- this.reconnectCallback = callback;
59
- }
60
- /**
61
- * 启动服务器
62
- *
63
- * @returns 启动完成的 Promise
64
- */
65
- async start() {
66
- return new Promise((resolve, reject) => {
67
- this.server.listen(this.port, this.host, () => {
68
- console.log(`管理页面已启动: http://${this.host}:${this.port}`);
69
- resolve();
70
- });
71
- this.server.on('error', (error) => {
72
- console.error('管理服务器错误:', error);
73
- reject(error);
74
- });
75
- });
76
- }
77
- /**
78
- * 处理 HTTP 请求
79
- *
80
- * 提供以下端点:
81
- * 反向代理:
82
- * - `GET /` - 管理页面
83
- * - `GET /_ctc/status` - 获取状态
84
- * - `POST /_ctc/proxies` - 添加反向代理
85
- * - `DELETE /_ctc/proxies/:port` - 删除反向代理
86
- * - `POST /_ctc/test-proxy?port=xxx` - 测试反向代理连接
87
- * 正向穿透:
88
- * - `GET /_ctc/forward/list` - 获取正向穿透列表
89
- * - `POST /_ctc/forward/add` - 添加正向穿透
90
- * - `POST /_ctc/forward/remove` - 删除正向穿透
91
- * - `GET /_ctc/forward/clients` - 获取客户端列表
92
- * - `POST /_ctc/forward/register` - 注册到服务器
93
- */
94
- async handleRequest(req, res) {
95
- const url = req.url ?? '/';
96
- // 静态文件服务 - 首页读取模板文件
97
- if (url === '/' && req.method === 'GET') {
98
- readFile(AdminServer.TEMPLATE_PATH, 'utf-8', (err, data) => {
99
- if (err) {
100
- console.error('模板文件读取错误:', err);
101
- res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
102
- res.end('Error loading page');
103
- }
104
- else {
105
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
106
- res.end(data);
107
- }
108
- });
109
- return;
110
- }
111
- // 处理静态文件请求 (支持 .js, .css 等静态资源直接从根路径访问)
112
- if (req.method === 'GET' && url !== '/' && !url.startsWith('/_ctc/')) {
113
- const fileName = url.slice(1); // 去掉开头的 /
114
- const filePath = join(AdminServer.STATIC_DIR, fileName);
115
- readFile(filePath, 'utf-8', (err, data) => {
116
- if (err || !data) {
117
- console.error('静态文件读取错误:', err);
118
- res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
119
- res.end('File not found');
120
- return;
121
- }
122
- const ext = fileName.split('.').pop() || 'html';
123
- const contentType = ext === 'css' ? 'text/css; charset=utf-8' :
124
- ext === 'js' ? 'text/javascript; charset=utf-8' : 'text/html; charset=utf-8';
125
- res.writeHead(200, {
126
- 'Content-Type': contentType,
127
- 'Cache-Control': 'public, max-age=3600'
128
- });
129
- res.end(data);
130
- });
131
- return;
132
- }
133
- // 状态 API
134
- if (url === '/_ctc/status' && req.method === 'GET') {
135
- const status = this.getStatusCallback();
136
- res.writeHead(200, { 'Content-Type': 'application/json' });
137
- res.end(JSON.stringify(status));
138
- return;
139
- }
140
- // ==================== 反向代理 API ====================
141
- // 添加反向代理 API
142
- if (url === '/_ctc/proxies' && req.method === 'POST') {
143
- let body = '';
144
- req.on('data', (chunk) => { body += chunk; });
145
- req.on('end', async () => {
146
- try {
147
- const proxy = JSON.parse(body);
148
- await this.addProxyCallback(proxy);
149
- res.writeHead(200, { 'Content-Type': 'application/json' });
150
- res.end(JSON.stringify({ success: true }));
151
- }
152
- catch (error) {
153
- const errorMessage = error instanceof Error ? error.message : String(error);
154
- res.writeHead(400, { 'Content-Type': 'application/json' });
155
- res.end(JSON.stringify({ error: errorMessage }));
156
- }
157
- });
158
- return;
159
- }
160
- // 删除反向代理 API
161
- if (url.startsWith('/_ctc/proxies/') && req.method === 'DELETE') {
162
- const port = parseInt(url.split('/').pop(), 10);
163
- if (isNaN(port)) {
164
- res.writeHead(400, { 'Content-Type': 'application/json' });
165
- res.end(JSON.stringify({ error: '无效的端口号' }));
166
- return;
167
- }
168
- this.removeProxyCallback(port)
169
- .then(() => {
170
- res.writeHead(200, { 'Content-Type': 'application/json' });
171
- res.end(JSON.stringify({ success: true }));
172
- })
173
- .catch((error) => {
174
- const errorMessage = error instanceof Error ? error.message : String(error);
175
- res.writeHead(400, { 'Content-Type': 'application/json' });
176
- res.end(JSON.stringify({ error: errorMessage }));
177
- });
178
- return;
179
- }
180
- // 测试反向代理 API
181
- if (url.startsWith('/_ctc/test-proxy') && req.method === 'POST') {
182
- const urlObj = new URL(url, `http://${req.headers.host}`);
183
- const portParam = urlObj.searchParams.get('port');
184
- const port = portParam ? parseInt(portParam, 10) : NaN;
185
- if (isNaN(port)) {
186
- res.writeHead(400, { 'Content-Type': 'application/json' });
187
- res.end(JSON.stringify({ error: '无效的端口号' }));
188
- return;
189
- }
190
- // 通过 Controller 发送测试请求到服务端,然后测试连接
191
- try {
192
- // 简单测试:尝试连接本地端口来验证代理是否工作
193
- // 实际测试需要通过服务端发起请求,这里只返回成功状态
194
- const status = this.getStatusCallback();
195
- const proxy = status.proxies.find((p) => p.remotePort === port);
196
- if (!proxy) {
197
- res.writeHead(404, { 'Content-Type': 'application/json' });
198
- res.end(JSON.stringify({ success: false, error: '端口未注册' }));
199
- return;
200
- }
201
- // 测试本地端口是否可连接
202
- const net = await import('net');
203
- const testClient = new net.Socket();
204
- let connected = false;
205
- let error = null;
206
- await new Promise((resolve) => {
207
- testClient.connect({ port: proxy.localPort, host: proxy.localHost || 'localhost' }, () => {
208
- connected = true;
209
- testClient.destroy();
210
- resolve();
211
- });
212
- testClient.on('error', (err) => {
213
- error = err.message;
214
- testClient.destroy();
215
- resolve();
216
- });
217
- // 2秒超时
218
- setTimeout(() => {
219
- if (!connected) {
220
- error = '连接超时';
221
- testClient.destroy();
222
- resolve();
223
- }
224
- }, 2000);
225
- });
226
- if (connected) {
227
- res.writeHead(200, { 'Content-Type': 'application/json' });
228
- res.end(JSON.stringify({
229
- success: true,
230
- message: `本地端口 ${proxy.localPort} 连接成功`,
231
- proxy: { remotePort: port, localPort: proxy.localPort }
232
- }));
233
- }
234
- else {
235
- res.writeHead(200, { 'Content-Type': 'application/json' });
236
- res.end(JSON.stringify({
237
- success: false,
238
- error: `本地端口 ${proxy.localPort} 连接失败: ${error}`
239
- }));
240
- }
241
- }
242
- catch (e) {
243
- const errorMessage = e instanceof Error ? e.message : String(e);
244
- res.writeHead(500, { 'Content-Type': 'application/json' });
245
- res.end(JSON.stringify({ success: false, error: errorMessage }));
246
- }
247
- return;
248
- }
249
- // ==================== 正向穿透 API ====================
250
- // forward list - 列出正向穿透代理
251
- if (url === '/_ctc/forward/list' && req.method === 'GET') {
252
- const proxies = Array.from(this.forwardProxies.entries()).map(([key, value]) => ({
253
- localPort: value.localPort,
254
- targetClientId: value.targetClientId,
255
- targetPort: value.targetPort,
256
- enabled: true,
257
- }));
258
- res.writeHead(200, { 'Content-Type': 'application/json' });
259
- res.end(JSON.stringify({ proxies }));
260
- return;
261
- }
262
- // forward add - 添加正向穿透代理
263
- if (url === '/_ctc/forward/add' && req.method === 'POST') {
264
- let body = '';
265
- req.on('data', (chunk) => { body += chunk; });
266
- req.on('end', async () => {
267
- try {
268
- const data = JSON.parse(body);
269
- const key = `${data.localPort}`;
270
- if (this.addForwardProxyCallback) {
271
- await this.addForwardProxyCallback({
272
- ...data,
273
- enabled: true,
274
- });
275
- }
276
- this.forwardProxies.set(key, {
277
- localPort: data.localPort,
278
- targetClientId: data.targetClientId,
279
- targetPort: data.targetPort,
280
- });
281
- res.writeHead(200, { 'Content-Type': 'application/json' });
282
- res.end(JSON.stringify({ success: true }));
283
- }
284
- catch (error) {
285
- const errorMessage = error instanceof Error ? error.message : String(error);
286
- res.writeHead(400, { 'Content-Type': 'application/json' });
287
- res.end(JSON.stringify({ error: errorMessage }));
288
- }
289
- });
290
- return;
291
- }
292
- // forward remove - 移除正向穿透代理
293
- if (url === '/_ctc/forward/remove' && req.method === 'POST') {
294
- let body = '';
295
- req.on('data', (chunk) => { body += chunk; });
296
- req.on('end', async () => {
297
- try {
298
- const data = JSON.parse(body);
299
- const key = `${data.localPort}`;
300
- const deleted = this.forwardProxies.delete(key);
301
- if (this.removeForwardProxyCallback) {
302
- await this.removeForwardProxyCallback(data.localPort);
303
- }
304
- if (deleted) {
305
- res.writeHead(200, { 'Content-Type': 'application/json' });
306
- res.end(JSON.stringify({ success: true }));
307
- }
308
- else {
309
- res.writeHead(404, { 'Content-Type': 'application/json' });
310
- res.end(JSON.stringify({ error: '代理不存在' }));
311
- }
312
- }
313
- catch (error) {
314
- const errorMessage = error instanceof Error ? error.message : String(error);
315
- res.writeHead(400, { 'Content-Type': 'application/json' });
316
- res.end(JSON.stringify({ error: errorMessage }));
317
- }
318
- });
319
- return;
320
- }
321
- // forward clients - 获取客户端列表
322
- if (url === '/_ctc/forward/clients' && req.method === 'GET') {
323
- if (!this.getClientListCallback) {
324
- res.writeHead(503, { 'Content-Type': 'application/json' });
325
- res.end(JSON.stringify({ error: '服务未就绪' }));
326
- return;
327
- }
328
- try {
329
- const result = await this.getClientListCallback();
330
- res.writeHead(200, { 'Content-Type': 'application/json' });
331
- res.end(JSON.stringify(result));
332
- }
333
- catch (error) {
334
- const errorMessage = error instanceof Error ? error.message : String(error);
335
- res.writeHead(500, { 'Content-Type': 'application/json' });
336
- res.end(JSON.stringify({ error: errorMessage }));
337
- }
338
- return;
339
- }
340
- // forward register - 注册到服务器
341
- if (url === '/_ctc/forward/register' && req.method === 'POST') {
342
- let body = '';
343
- req.on('data', (chunk) => { body += chunk; });
344
- req.on('end', async () => {
345
- try {
346
- const data = JSON.parse(body);
347
- if (!this.registerClientCallback) {
348
- res.writeHead(503, { 'Content-Type': 'application/json' });
349
- res.end(JSON.stringify({ error: '服务未就绪' }));
350
- return;
351
- }
352
- const result = await this.registerClientCallback(data.description);
353
- res.writeHead(200, { 'Content-Type': 'application/json' });
354
- res.end(JSON.stringify(result));
355
- }
356
- catch (error) {
357
- const errorMessage = error instanceof Error ? error.message : String(error);
358
- res.writeHead(400, { 'Content-Type': 'application/json' });
359
- res.end(JSON.stringify({ error: errorMessage }));
360
- }
361
- });
362
- return;
363
- }
364
- // reconnect - 主动重连到服务器
365
- if (url === '/_ctc/reconnect' && req.method === 'POST') {
366
- if (!this.reconnectCallback) {
367
- res.writeHead(503, { 'Content-Type': 'application/json' });
368
- res.end(JSON.stringify({ error: '重连服务未就绪' }));
369
- return;
370
- }
371
- try {
372
- await this.reconnectCallback();
373
- res.writeHead(200, { 'Content-Type': 'application/json' });
374
- res.end(JSON.stringify({ success: true, message: '正在重连...' }));
375
- }
376
- catch (error) {
377
- const errorMessage = error instanceof Error ? error.message : String(error);
378
- res.writeHead(500, { 'Content-Type': 'application/json' });
379
- res.end(JSON.stringify({ error: errorMessage }));
380
- }
381
- return;
382
- }
383
- // 404
384
- res.writeHead(404);
385
- res.end('Not Found');
386
- }
387
- /**
388
- * 停止服务器
389
- */
390
- async stop() {
391
- return new Promise((resolve) => {
392
- this.server.close(() => {
393
- console.log('管理服务器已停止');
394
- resolve();
395
- });
396
- });
397
- }
398
- }
399
- /**
400
- * 静态文件路径常量
401
- */
402
- AdminServer.STATIC_DIR = join(dirname(fileURLToPath(import.meta.url)), '..', 'admin-ui', 'dist');
403
- /**
404
- * HTML 模板文件路径
405
- */
406
- AdminServer.TEMPLATE_PATH = join(AdminServer.STATIC_DIR, 'index.html');
407
- //# sourceMappingURL=admin-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"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"}
@@ -1,100 +0,0 @@
1
- /**
2
- * @module forward-proxy
3
- *
4
- * 正向穿透代理模块。
5
- *
6
- * 实现从本地端口到远程客户端端口的穿透功能。
7
- * 用户连接本地端口 → 通过中继服务器数据通道 → 连接到目标客户端的指定端口。
8
- */
9
- import { EventEmitter } from 'events';
10
- import { ClientListMessage, ForwardProxyEntry } from '@feng3d/chuantou-shared';
11
- import { Controller } from './controller.js';
12
- export type { ForwardProxyEntry };
13
- /**
14
- * 正向穿透代理类
15
- *
16
- * 管理从本地端口到远程客户端的穿透映射。
17
- * 支持两种角色:
18
- * - 发起方: 用户连接本地端口,数据转发到目标客户端
19
- * - 目标方: 接受来自其他客户端的连接,转发到本地服务
20
- */
21
- export declare class ForwardProxy extends EventEmitter {
22
- private controller;
23
- private proxies;
24
- private servers;
25
- private sessions;
26
- constructor(controller: Controller);
27
- /**
28
- * 设置消息处理器
29
- */
30
- private setupMessageHandlers;
31
- /**
32
- * 设置数据通道处理器
33
- */
34
- private setupDataChannelHandlers;
35
- /**
36
- * 处理数据通道数据
37
- */
38
- private handleDataChannelData;
39
- /**
40
- * 注册客户端(正向穿透模式)
41
- */
42
- registerAsClient(description?: string): Promise<void>;
43
- /**
44
- * 获取在线客户端列表
45
- */
46
- getClientList(): Promise<ClientListMessage['payload']>;
47
- /**
48
- * 添加正向穿透代理
49
- */
50
- addProxy(entry: ForwardProxyEntry): Promise<void>;
51
- /**
52
- * 移除正向穿透代理
53
- */
54
- removeProxy(localPort: number): Promise<void>;
55
- /**
56
- * 移除指定目标的所有代理
57
- */
58
- removeByTarget(targetClientId: string): Promise<number>;
59
- /**
60
- * 获取所有代理
61
- */
62
- getProxies(): ForwardProxyEntry[];
63
- /**
64
- * 检查端口是否可用
65
- */
66
- private isPortAvailable;
67
- /**
68
- * 处理本地连接(发起方)
69
- */
70
- private handleLocalConnection;
71
- /**
72
- * 处理入站连接请求(目标方)
73
- */
74
- private handleIncomingConnection;
75
- /**
76
- * 处理连接已建立消息(发起方)
77
- */
78
- private handleConnectionEstablished;
79
- /**
80
- * 处理代理目标端口请求(目标方)
81
- */
82
- private handleProxyTargetPort;
83
- /**
84
- * 处理连接错误
85
- */
86
- private handleConnectionError;
87
- /**
88
- * 清理会话
89
- */
90
- private cleanupSession;
91
- /**
92
- * 生成会话 ID
93
- */
94
- private generateSessionId;
95
- /**
96
- * 销毁所有代理
97
- */
98
- destroy(): Promise<void>;
99
- }
100
- //# sourceMappingURL=forward-proxy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"forward-proxy.d.ts","sourceRoot":"","sources":["../src/forward-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAML,iBAAiB,EAQjB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAgBlC;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,OAAO,CAAgC;IAG/C,OAAO,CAAC,QAAQ,CAAqC;gBAEzC,UAAU,EAAE,UAAU;IAWlC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAShC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACG,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3D;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAU5D;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCvD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBnD;;OAEG;IACG,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe7D;;OAEG;IACH,UAAU,IAAI,iBAAiB,EAAE;IAIjC;;OAEG;YACW,eAAe;IAY7B;;OAEG;YACW,qBAAqB;IA4DnC;;OAEG;YACW,wBAAwB;IAkBtC;;OAEG;YACW,2BAA2B;IA8BzC;;OAEG;YACW,qBAAqB;IA8DnC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB/B"}