xhs-mcp 0.6.0 → 0.7.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/README.en.md CHANGED
@@ -1,14 +1,8 @@
1
- ---
2
- noteId: "de25fbc0988c11f0a5c2e10de4f705bc"
3
- tags: []
4
-
5
- ---
6
-
7
1
  # xhs-mcp
8
2
 
9
3
  English | [简体中文](./README.md)
10
4
 
11
- Unified CLI `xhs-cli` with built-in MCP server subcommand. Automate XiaoHongShu (xiaohongshu.com) with Puppeteer: login, publishing, search, feed discovery, and commenting via MCP and CLI.
5
+ Unified CLI `xhs-mcp` with built-in MCP server subcommand. Automate XiaoHongShu (xiaohongshu.com) with Puppeteer: login, publishing, search, feed discovery, and commenting via MCP and CLI.
12
6
 
13
7
  [![npm version](https://img.shields.io/npm/v/xhs-mcp.svg)](https://www.npmjs.com/package/xhs-mcp)
14
8
  [![npm downloads](https://img.shields.io/npm/dm/xhs-mcp.svg)](https://www.npmjs.com/package/xhs-mcp)
@@ -17,8 +11,8 @@ Unified CLI `xhs-cli` with built-in MCP server subcommand. Automate XiaoHongShu
17
11
  ## 📦 NPM
18
12
 
19
13
  - Package: `xhs-mcp`
20
- - Run CLI: `npx xhs-cli <subcommand>`
21
- - Start MCP: `npx xhs-cli mcp [--mode stdio|http] [--port 3000]`
14
+ - Run CLI: `npx xhs-mcp <subcommand>`
15
+ - Start MCP: `npx xhs-mcp mcp [--mode stdio|http] [--port 3000]`
22
16
 
23
17
  ## ✨ Features
24
18
 
@@ -39,16 +33,16 @@ Unified CLI `xhs-cli` with built-in MCP server subcommand. Automate XiaoHongShu
39
33
  ## 🚀 Quick Start (MCP)
40
34
 
41
35
  ```bash
42
- npx xhs-cli mcp
36
+ npx xhs-mcp mcp
43
37
 
44
38
  # Debug logs
45
- XHS_ENABLE_LOGGING=true npx xhs-cli mcp
39
+ XHS_ENABLE_LOGGING=true npx xhs-mcp mcp
46
40
  ```
47
41
 
48
42
  > First run tip: if Puppeteer browsers are not installed yet, run
49
43
  >
50
44
  > ```bash
51
- > npx xhs-cli browser # auto-check and install Chromium, shows executable path
45
+ > npx xhs-mcp browser # auto-check and install Chromium, shows executable path
52
46
  > # or
53
47
  > npx puppeteer browsers install chrome
54
48
  > ```
@@ -68,24 +62,24 @@ XHS_ENABLE_LOGGING=true npx xhs-cli mcp
68
62
  Verify MCP connection:
69
63
 
70
64
  ```bash
71
- echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | npx xhs-cli mcp
65
+ echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | npx xhs-mcp mcp
72
66
  ```
73
67
 
74
68
  ## 🧰 CLI
75
69
 
76
70
  ```bash
77
- npx xhs-cli login --timeout 120
78
- npx xhs-cli logout
79
- npx xhs-cli status
80
- npx xhs-cli browser # check and install Chromium, shows executable path
81
- npx xhs-cli feeds
82
- npx xhs-cli search -k keyword
83
- npx xhs-cli note-detail --feed-id <id> --xsec-token <token>
84
- npx xhs-cli comment --feed-id <id> --xsec-token <token> -n "Nice!"
85
- npx xhs-cli publish --type image --title Title --content Content -m path1.jpg,path2.png --tags a,b
86
- npx xhs-cli publish --type video --title Title --content Content -m video.mp4 --tags a,b
87
- npx xhs-cli tools [--detailed] [--json]
88
- npx xhs-cli mcp --mode http --port 3000
71
+ npx xhs-mcp login --timeout 120
72
+ npx xhs-mcp logout
73
+ npx xhs-mcp status
74
+ npx xhs-mcp browser # check and install Chromium, shows executable path
75
+ npx xhs-mcp feeds
76
+ npx xhs-mcp search -k keyword
77
+ npx xhs-mcp note-detail --feed-id <id> --xsec-token <token>
78
+ npx xhs-mcp comment --feed-id <id> --xsec-token <token> -n "Nice!"
79
+ npx xhs-mcp publish --type image --title Title --content Content -m path1.jpg,path2.png --tags a,b
80
+ npx xhs-mcp publish --type video --title Title --content Content -m video.mp4 --tags a,b
81
+ npx xhs-mcp tools [--detailed] [--json]
82
+ npx xhs-mcp mcp --mode http --port 3000
89
83
  ```
90
84
 
91
85
  ## 🔧 Client Integration (Cursor)
@@ -97,7 +91,7 @@ npx xhs-cli status
97
91
  "mcpServers": {
98
92
  "xhs-mcp": {
99
93
  "command": "npx",
100
- "args": ["xhs-cli", "mcp"],
94
+ "args": ["xhs-mcp", "mcp"],
101
95
  "env": { "XHS_ENABLE_LOGGING": "true" }
102
96
  }
103
97
  }
@@ -113,10 +107,3 @@ npx xhs-cli status
113
107
  ## 🙏 Acknowledgments
114
108
 
115
109
  Based on and extended from [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) (refactored to TypeScript, improved MCP implementation, log cleanup, published to NPM).
116
-
117
- ## 📚 Docs
118
-
119
- - HTTP Transports: `docs/HTTP_TRANSPORTS.md`
120
- - Publish Features: `docs/PUBLISH_FEATURES.md`
121
- - Architecture Design: `docs/PUBLISH_ARCHITECTURE.md`
122
-
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  简体中文 | [English](./README.en.md)
4
4
 
5
- `xhs-mcp` 提供统一的命令行入口 `xhs-cli`,并内置 MCP 服务器子命令。用于小红书(xiaohongshu.com)的 Model Context Protocol(MCP)服务器与 CLI 工具,支持登录、发布、搜索、推荐等自动化能力(基于 Puppeteer)。
5
+ `xhs-mcp` 提供统一的命令行入口 `xhs-mcp`,并内置 MCP 服务器子命令。用于小红书(xiaohongshu.com)的 Model Context Protocol(MCP)服务器与 CLI 工具,支持登录、发布、搜索、推荐等自动化能力(基于 Puppeteer)。
6
6
 
7
7
  [![npm version](https://img.shields.io/npm/v/xhs-mcp.svg)](https://www.npmjs.com/package/xhs-mcp)
8
8
  [![npm downloads](https://img.shields.io/npm/dm/xhs-mcp.svg)](https://www.npmjs.com/package/xhs-mcp)
@@ -11,8 +11,8 @@
11
11
  ## 📦 NPM 信息
12
12
 
13
13
  - 包名: `xhs-mcp`
14
- - 运行 CLI(推荐): `npx xhs-cli <subcommand>`
15
- - 启动 MCP:`npx xhs-cli mcp [--mode stdio|http] [--port 3000]`
14
+ - 运行 CLI(推荐): `npx xhs-mcp <subcommand>`
15
+ - 启动 MCP:`npx xhs-mcp mcp [--mode stdio|http] [--port 3000]`
16
16
 
17
17
  ## ✨ 功能
18
18
 
@@ -35,16 +35,16 @@
35
35
  ### Stdio 模式(默认)
36
36
 
37
37
  ```bash
38
- npx xhs-cli mcp
38
+ npx xhs-mcp mcp
39
39
 
40
40
  # 调试日志
41
- XHS_ENABLE_LOGGING=true npx xhs-cli mcp
41
+ XHS_ENABLE_LOGGING=true npx xhs-mcp mcp
42
42
  ```
43
43
 
44
44
  > 首次运行提示:如果未安装 Puppeteer 浏览器,先执行
45
45
  >
46
46
  > ```bash
47
- > npx xhs-cli browser # 自动检查并安装 Chromium,显示可执行路径
47
+ > npx xhs-mcp browser # 自动检查并安装 Chromium,显示可执行路径
48
48
  > # 或
49
49
  > npx puppeteer browsers install chrome
50
50
  > ```
@@ -64,20 +64,20 @@ XHS_ENABLE_LOGGING=true npx xhs-cli mcp
64
64
  验证 MCP 连接:
65
65
 
66
66
  ```bash
67
- echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | npx xhs-cli mcp
67
+ echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | npx xhs-mcp mcp
68
68
  ```
69
69
 
70
70
  ### HTTP 模式
71
71
 
72
72
  ```bash
73
73
  # 启动 HTTP 服务器(默认端口 3000)
74
- npx xhs-cli mcp --mode http
74
+ npx xhs-mcp mcp --mode http
75
75
 
76
76
  # 指定端口
77
- npx xhs-cli mcp --mode http --port 8080
77
+ npx xhs-mcp mcp --mode http --port 8080
78
78
 
79
79
  # 调试模式
80
- XHS_ENABLE_LOGGING=true npx xhs-cli mcp --mode http
80
+ XHS_ENABLE_LOGGING=true npx xhs-mcp mcp --mode http
81
81
  ```
82
82
 
83
83
  HTTP 服务器支持:
@@ -91,30 +91,30 @@ HTTP 服务器支持:
91
91
 
92
92
  ```bash
93
93
  # 认证
94
- npx xhs-cli login --timeout 120
95
- npx xhs-cli logout
96
- npx xhs-cli status
94
+ npx xhs-mcp login --timeout 120
95
+ npx xhs-mcp logout
96
+ npx xhs-mcp status
97
97
 
98
98
  # 浏览器依赖
99
- npx xhs-cli browser [--with-deps] # 检查并安装 Chromium,显示可执行路径
99
+ npx xhs-mcp browser [--with-deps] # 检查并安装 Chromium,显示可执行路径
100
100
 
101
101
  # 发现与检索
102
- npx xhs-cli feeds [-b /path/to/chromium]
103
- npx xhs-cli search -k 关键字 [-b /path/to/chromium]
104
- npx xhs-cli note-detail --feed-id <id> --xsec-token <token> [-b /path/to/chromium]
102
+ npx xhs-mcp feeds [-b /path/to/chromium]
103
+ npx xhs-mcp search -k 关键字 [-b /path/to/chromium]
104
+ npx xhs-mcp note-detail --feed-id <id> --xsec-token <token> [-b /path/to/chromium]
105
105
 
106
106
  # 互动
107
- npx xhs-cli comment --feed-id <id> --xsec-token <token> -n "Nice!" [-b /path/to/chromium]
107
+ npx xhs-mcp comment --feed-id <id> --xsec-token <token> -n "Nice!" [-b /path/to/chromium]
108
108
 
109
109
  # 发布
110
- npx xhs-cli publish --type image --title 标题 --content 内容 -m path1.jpg,path2.png --tags a,b [-b /path/to/chromium]
111
- npx xhs-cli publish --type video --title 视频标题 --content 视频描述 -m path/to/video.mp4 --tags a,b [-b /path/to/chromium]
110
+ npx xhs-mcp publish --type image --title 标题 --content 内容 -m path1.jpg,path2.png --tags a,b [-b /path/to/chromium]
111
+ npx xhs-mcp publish --type video --title 视频标题 --content 视频描述 -m path/to/video.mp4 --tags a,b [-b /path/to/chromium]
112
112
 
113
113
  # 查看可用工具
114
- npx xhs-cli tools [--detailed] [--json]
114
+ npx xhs-mcp tools [--detailed] [--json]
115
115
 
116
116
  # 启动 MCP
117
- npx xhs-cli mcp [--mode stdio|http] [--port 3000]
117
+ npx xhs-mcp mcp [--mode stdio|http] [--port 3000]
118
118
  ```
119
119
 
120
120
  ## 🔧 客户端接入(Cursor)
@@ -128,7 +128,7 @@ npx xhs-cli mcp [--mode stdio|http] [--port 3000]
128
128
  "mcpServers": {
129
129
  "xhs-mcp": {
130
130
  "command": "npx",
131
- "args": ["xhs-cli", "mcp"],
131
+ "args": ["xhs-mcp", "mcp"],
132
132
  "env": { "XHS_ENABLE_LOGGING": "true" }
133
133
  }
134
134
  }
@@ -144,7 +144,7 @@ npx xhs-cli mcp [--mode stdio|http] [--port 3000]
144
144
  "mcpServers": {
145
145
  "xhs-mcp-http": {
146
146
  "command": "npx",
147
- "args": ["xhs-cli", "mcp", "--mode", "http", "--port", "3000"],
147
+ "args": ["xhs-mcp", "mcp", "--mode", "http", "--port", "3000"],
148
148
  "env": { "XHS_ENABLE_LOGGING": "true" }
149
149
  }
150
150
  }
@@ -172,9 +172,3 @@ npx xhs-cli mcp [--mode stdio|http] [--port 3000]
172
172
  ## 🙏 致谢
173
173
 
174
174
  基于 [xiaohongshu-mcp](https://github.com/xpzouying/xiaohongshu-mcp) 重构与扩展(TypeScript、Puppeteer、MCP 优化、日志清理、NPM 发布)。
175
-
176
- ## 📚 文档
177
-
178
- - HTTP Transports:`docs/HTTP_TRANSPORTS.md`
179
- - 发布功能:`docs/PUBLISH_FEATURES.md`
180
- - 架构设计:`docs/PUBLISH_ARCHITECTURE.md`
@@ -3,4 +3,4 @@
3
3
  * Unified CLI for XiaoHongShu operations
4
4
  */
5
5
  export {};
6
- //# sourceMappingURL=xhs-cli.d.ts.map
6
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":";AAEA;;GAEG"}
@@ -21,7 +21,7 @@ async function main() {
21
21
  .replace(/[\u2500-\u257F]+/g, '') // box-drawing characters
22
22
  .trim();
23
23
  if (/Executable doesn't exist|puppeteer browsers install/i.test(raw)) {
24
- return 'Chromium is not installed. Run: npx puppeteer browsers install chrome or xhs-cli browser';
24
+ return 'Chromium is not installed. Run: npx puppeteer browsers install chrome or xhs-mcp browser';
25
25
  }
26
26
  return condensed || (error instanceof Error ? error.message : String(error));
27
27
  }
@@ -45,7 +45,7 @@ async function main() {
45
45
  writeJson(payload, 1);
46
46
  }
47
47
  program
48
- .name('xhs-cli')
48
+ .name('xhs-mcp')
49
49
  .description('XiaoHongShu CLI with subcommands')
50
50
  .option('--compact', 'Output compact one-line JSON (no pretty print)')
51
51
  .showHelpAfterError();
@@ -113,7 +113,7 @@ async function main() {
113
113
  if (browserInfo.canLaunch) {
114
114
  printSuccess({
115
115
  installed: true,
116
- executablePath: browserInfo.executablePath
116
+ executablePath: browserInfo.executablePath,
117
117
  }, 'Chromium is ready');
118
118
  return;
119
119
  }
@@ -126,7 +126,7 @@ async function main() {
126
126
  printSuccess({
127
127
  installed: true,
128
128
  executablePath: afterInstallInfo.executablePath,
129
- exitCode: result.status ?? null
129
+ exitCode: result.status ?? null,
130
130
  }, 'Chromium installed and ready');
131
131
  }
132
132
  else {
@@ -216,7 +216,10 @@ async function main() {
216
216
  printError(new Error('Type must be "image" or "video"'));
217
217
  return;
218
218
  }
219
- const mediaPaths = opts.media.split(',').map(s => s.trim()).filter(Boolean);
219
+ const mediaPaths = opts.media
220
+ .split(',')
221
+ .map((s) => s.trim())
222
+ .filter(Boolean);
220
223
  const result = await publishService.publishContent(opts.type, opts.title, opts.content, mediaPaths, opts.tags, opts.browserPath);
221
224
  printSuccess(result);
222
225
  }
@@ -260,9 +263,9 @@ async function main() {
260
263
  console.log(JSON.stringify(toolSchemas, null, 2));
261
264
  }
262
265
  else {
263
- const toolNames = toolSchemas.map(tool => ({
266
+ const toolNames = toolSchemas.map((tool) => ({
264
267
  name: tool.name,
265
- description: tool.description
268
+ description: tool.description,
266
269
  }));
267
270
  console.log(JSON.stringify(toolNames, null, 2));
268
271
  }
@@ -273,13 +276,14 @@ async function main() {
273
276
  console.log(`${index + 1}. ${tool.name}`);
274
277
  console.log(` ${tool.description}`);
275
278
  if (opts.detailed) {
276
- const required = tool.inputSchema.required || [];
277
- const properties = tool.inputSchema.properties || {};
279
+ const required = tool.inputSchema.required ?? [];
280
+ const properties = tool.inputSchema.properties ?? {};
278
281
  if (Object.keys(properties).length > 0) {
279
282
  console.log(' Parameters:');
280
283
  Object.entries(properties).forEach(([key, prop]) => {
281
284
  const requiredMark = required.includes(key) ? ' (required)' : ' (optional)';
282
- console.log(` - ${key}: ${prop.description || 'No description'}${requiredMark}`);
285
+ const propDesc = prop.description;
286
+ console.log(` - ${key}: ${propDesc ?? 'No description'}${requiredMark}`);
283
287
  });
284
288
  }
285
289
  }
@@ -297,4 +301,4 @@ async function main() {
297
301
  program.parseAsync(process.argv);
298
302
  }
299
303
  main();
300
- //# sourceMappingURL=xhs-cli.js.map
304
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Browser Pool Service for XHS Operations
3
+ * Manages browser instance lifecycle with pooling, health monitoring, and automatic cleanup
4
+ */
5
+ import { Browser, BrowserContext } from 'puppeteer';
6
+ import { Config } from '../shared/types.js';
7
+ export interface ManagedBrowser {
8
+ browser: Browser;
9
+ context: BrowserContext;
10
+ id: string;
11
+ createdAt: Date;
12
+ lastUsed: Date;
13
+ isAvailable: boolean;
14
+ isHealthy: boolean;
15
+ usageCount: number;
16
+ }
17
+ export interface BrowserPoolStats {
18
+ totalInstances: number;
19
+ availableInstances: number;
20
+ busyInstances: number;
21
+ unhealthyInstances: number;
22
+ totalUsage: number;
23
+ averageAge: number;
24
+ oldestInstance: Date | null;
25
+ newestInstance: Date | null;
26
+ }
27
+ export interface BrowserPoolOptions {
28
+ minInstances?: number;
29
+ maxInstances?: number;
30
+ idleTimeout?: number;
31
+ maxAge?: number;
32
+ healthCheckInterval?: number;
33
+ maxUsageCount?: number;
34
+ }
35
+ export declare class BrowserPoolService {
36
+ private config;
37
+ private pool;
38
+ private options;
39
+ private healthCheckTimer;
40
+ private cleanupTimer;
41
+ private isShuttingDown;
42
+ constructor(config?: Config, options?: BrowserPoolOptions);
43
+ /**
44
+ * Acquire a browser instance from the pool
45
+ */
46
+ acquireBrowser(options?: {
47
+ timeout?: number;
48
+ }): Promise<ManagedBrowser>;
49
+ /**
50
+ * Release a browser instance back to the pool
51
+ */
52
+ releaseBrowser(browser: ManagedBrowser): Promise<void>;
53
+ /**
54
+ * Get current pool statistics
55
+ */
56
+ getPoolStats(): BrowserPoolStats;
57
+ /**
58
+ * Cleanup and shutdown the browser pool
59
+ */
60
+ cleanup(): Promise<void>;
61
+ /**
62
+ * Create a new browser instance
63
+ */
64
+ private createBrowserInstance;
65
+ /**
66
+ * Find an available healthy browser in the pool
67
+ */
68
+ private findAvailableBrowser;
69
+ /**
70
+ * Check if a browser should be retired
71
+ */
72
+ private shouldRetireBrowser;
73
+ /**
74
+ * Perform health check on a browser instance
75
+ */
76
+ private checkBrowserHealth;
77
+ /**
78
+ * Remove a browser from the pool
79
+ */
80
+ private removeBrowserFromPool;
81
+ /**
82
+ * Handle browser disconnection
83
+ */
84
+ private handleBrowserDisconnection;
85
+ /**
86
+ * Ensure minimum number of instances are available
87
+ */
88
+ private ensureMinimumInstances;
89
+ /**
90
+ * Get count of available browsers
91
+ */
92
+ private getAvailableCount;
93
+ /**
94
+ * Start health monitoring
95
+ */
96
+ private startHealthMonitoring;
97
+ /**
98
+ * Start cleanup monitoring for idle browsers
99
+ */
100
+ private startCleanupMonitoring;
101
+ /**
102
+ * Generate unique browser ID
103
+ */
104
+ private generateBrowserId;
105
+ }
106
+ export declare function getBrowserPool(): BrowserPoolService;
107
+ export declare function cleanupBrowserPool(): Promise<void>;
108
+ //# sourceMappingURL=browser-pool.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-pool.service.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/browser-pool.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAkB,EAAE,OAAO,EAAE,cAAc,EAAQ,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAM5C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAA0C;IACtD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;IAiBzD;;OAEG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IA8C7E;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC5D;;OAEG;IACH,YAAY,IAAI,gBAAgB;IAkChC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B9B;;OAEG;YACW,qBAAqB;IAqDnC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;YACW,kBAAkB;IAkBhC;;OAEG;YACW,qBAAqB;IAgBnC;;OAEG;YACW,0BAA0B;IAYxC;;OAEG;YACW,sBAAsB;IAwBpC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B;AAKD,wBAAgB,cAAc,IAAI,kBAAkB,CAKnD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKxD"}