page-action-cache 2.0.9 → 2026.2.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.
Files changed (43) hide show
  1. package/README.md +100 -306
  2. package/dist/index.d.ts +21 -4
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +222 -372
  5. package/dist/index.js.map +1 -1
  6. package/dist/types.d.ts +6 -19
  7. package/dist/types.d.ts.map +1 -1
  8. package/dist/types.js +2 -2
  9. package/openclaw.plugin.json +23 -14
  10. package/package.json +24 -21
  11. package/dist/browser-action-executor.d.ts +0 -87
  12. package/dist/browser-action-executor.d.ts.map +0 -1
  13. package/dist/browser-action-executor.js +0 -283
  14. package/dist/browser-action-executor.js.map +0 -1
  15. package/dist/cache-invalidation.d.ts +0 -129
  16. package/dist/cache-invalidation.d.ts.map +0 -1
  17. package/dist/cache-invalidation.js +0 -266
  18. package/dist/cache-invalidation.js.map +0 -1
  19. package/dist/cache-manager.d.ts +0 -83
  20. package/dist/cache-manager.d.ts.map +0 -1
  21. package/dist/cache-manager.js +0 -184
  22. package/dist/cache-manager.js.map +0 -1
  23. package/dist/multi-level-cache.d.ts +0 -127
  24. package/dist/multi-level-cache.d.ts.map +0 -1
  25. package/dist/multi-level-cache.js +0 -364
  26. package/dist/multi-level-cache.js.map +0 -1
  27. package/dist/scenario-recognizer.d.ts +0 -35
  28. package/dist/scenario-recognizer.d.ts.map +0 -1
  29. package/dist/scenario-recognizer.js +0 -93
  30. package/dist/scenario-recognizer.js.map +0 -1
  31. package/dist/variable-extractor.d.ts +0 -56
  32. package/dist/variable-extractor.d.ts.map +0 -1
  33. package/dist/variable-extractor.js +0 -161
  34. package/dist/variable-extractor.js.map +0 -1
  35. package/src/browser-action-executor.ts +0 -337
  36. package/src/cache-invalidation.ts +0 -342
  37. package/src/cache-manager.ts +0 -211
  38. package/src/index.ts +0 -468
  39. package/src/multi-level-cache.ts +0 -480
  40. package/src/scenario-recognizer.ts +0 -121
  41. package/src/types-mock.d.ts +0 -18
  42. package/src/types.ts +0 -66
  43. package/src/variable-extractor.ts +0 -206
package/README.md CHANGED
@@ -1,37 +1,18 @@
1
1
  # Page Action Cache - OpenClaw Extension
2
2
 
3
- 页面操作缓存扩展 - OpenClaw 浏览器操作缓存系统
3
+ 页面操作缓存扩展 - OpenClaw 提供页面快照缓存功能
4
4
 
5
5
  ## 功能特性
6
6
 
7
- ### 1. 场景识别 (Scenario Recognition)
8
- - 自动识别用户操作场景:登录、搜索、支付、结账、通用
9
- - 基于URL模式和页面内容关键词
10
- - 支持自定义规则和关键词扩展
11
-
12
- ### 2. 变量提取 (Variable Extraction)
13
- - 从用户输入中提取动态变量:邮箱、电话、日期、金额等
14
- - 智能置信度计算
15
- - 生成变量替换模板
16
-
17
- ### 3. 多级缓存 (Multi-Level Cache)
18
- - **L3 缓存**: 持久化缓存,适合稳定的重复操作(如登录)
19
- - **L2 缓存**: 内存缓存,适合频繁访问的操作(如搜索)
20
- - **L1 缓存**: 热点缓存,适合当前会话的操作
21
- - 自动缓存提升和容量管理
22
- - LLM分类支持
23
-
24
- ### 4. 缓存失效 (Cache Invalidation)
25
- - 页面变化检测(HTML、结构、内容哈希)
26
- - 软/硬失效策略
27
- - 变化历史追踪
28
- - 自动清理过期缓存
29
-
30
- ### 5. 浏览器动作执行 (Browser Action Execution)
31
- - 通过 Browser Client API 执行浏览器操作
32
- - 支持操作:导航、点击、输入、截图、脚本执行
33
- - 失败跳过机制
34
- - 执行时间节省计算
7
+ ### 1. 页面快照缓存
8
+ - 存储页面快照和角色引用
9
+ - 支持快速查询和失效
10
+ - 自动清理过期缓存(5分钟 TTL)
11
+ - LRU 容量管理(最多 50 个条目)
12
+
13
+ ### 2. 配置选项
14
+ - **enabled**: 启用/禁用插件
15
+ - **autoUseCache**: 自动使用缓存
35
16
 
36
17
  ## 技术架构
37
18
 
@@ -39,348 +20,144 @@
39
20
  ```
40
21
  page-action-cache/
41
22
  ├── src/
42
- │ ├── index.ts # 主扩展入口
43
- ├── types.ts # TypeScript 类型定义
44
- ├── cache-manager.ts # 缓存管理器
45
- ├── scenario-recognizer.ts # 场景识别器
46
- ├── variable-extractor.ts # 变量提取器
47
- ├── multi-level-cache.ts # 多级缓存管理器
48
- ├── cache-invalidation.ts # 缓存失效管理器
49
- │ ├── browser-action-executor.ts # 浏览器动作执行器
50
- │ └── types-mock.d.ts # 模拟类型定义
51
- ├── tests/
52
- │ ├── basic.test.ts # 基础功能测试
53
- │ ├── scenario-recognizer.test.ts # 场景识别测试
54
- │ ├── variable-extractor.test.ts # 变量提取测试
55
- │ ├── multi-level-cache.test.ts # 多级缓存测试
56
- │ ├── cache-invalidation.test.ts # 缓存失效测试
57
- │ └── integration.test.ts # 集成测试
58
- ├── dist/ # 编译输出目录
59
- ├── package.json # 项目配置
60
- ├── tsconfig.json # TypeScript 配置
61
- ├── openclaw.plugin.json # OpenClaw 插件元数据
62
- └── README.md # 项目文档
23
+ │ ├── index.ts # 主扩展入口
24
+ └── types.ts # TypeScript 类型定义
25
+ ├── tests/ # 测试文件
26
+ ├── dist/ # 编译输出目录
27
+ ├── package.json # 项目配置
28
+ ├── tsconfig.json # TypeScript 配置
29
+ ├── openclaw.plugin.json # OpenClaw 插件元数据
30
+ └── README.md # 项目文档
63
31
  ```
64
32
 
65
- ## OpenClaw 集成说明
33
+ ## 安装和使用
66
34
 
67
- ### 安装方式
35
+ ### 开发环境安装
68
36
 
69
- #### 方式一:本地开发目录(推荐用于开发调试)
70
37
  ```bash
71
- # 1. 确保 page-action-cache 已构建
38
+ # 1. 确保已构建
72
39
  cd /Users/zhoujinyu/Documents/projects/page-action-cache
73
- npm install && npm run build
40
+ npm run build
74
41
 
75
- # 2. 在 OpenClaw 配置文件中添加本地扩展引用
42
+ # 2. 在 OpenClaw 配置中添加本地扩展引用
76
43
  # 编辑 ~/.openclaw/openclaw.json 或实例配置文件
77
44
  {
78
45
  "plugins": {
79
46
  "entries": {
80
47
  "page-action-cache": {
81
- "path": "/Users/zhoujinyu/Documents/projects/page-action-cache",
82
48
  "enabled": true,
83
- "config": {
84
- "autoUseCache": true,
85
- "scenarioRecognitionEnabled": true,
86
- "cacheLevelStrategy": "auto"
87
- }
49
+ "autoUseCache": true
88
50
  }
89
51
  }
90
52
  }
91
53
  }
92
54
  ```
93
55
 
94
- #### 方式二:通过 npm 全局安装
56
+ ### 全局安装
57
+
95
58
  ```bash
96
59
  # 从 Gitee 仓库安装
97
60
  npm install -g https://gitee.com/jinyu_zjy/page-action-cache.git
98
-
99
- # 或者在已安装的 OpenClaw 中自动发现
100
- npm install page-action-cache --save
101
- ```
102
-
103
- ### OpenClaw 配置示例
104
-
105
- #### 基础配置
106
- ```json
107
- {
108
- "plugins": {
109
- "entries": {
110
- "page-action-cache": {
111
- "enabled": true,
112
- "config": {
113
- "enabled": true,
114
- "autoUseCache": true,
115
- "scenarioRecognitionEnabled": true,
116
- "llmClassificationThreshold": 0.8,
117
- "cacheLevelStrategy": "auto",
118
- "defaultCacheLevel": "L1",
119
- "pageChangeDetectionEnabled": true,
120
- "changeInvalidationThreshold": 0.5,
121
- "invalidationStrategy": "soft",
122
- "variableExtractionEnabled": true,
123
- "allowUserConfirmVariables": true,
124
- "allowUserForcedRefresh": true,
125
- "enableUserCacheErrorReport": true,
126
- "trackExecutionStats": true,
127
- "statsUpdateInterval": 60000
128
- }
129
- }
130
- }
131
- }
132
- }
133
61
  ```
134
62
 
135
- ### 使用示例
136
-
137
- #### 通过 OpenClaw CLI 使用
138
- ```bash
139
- # 执行缓存的页面操作
140
- openclaw message send --channel web --content "请帮我登录 https://example.com/login"
63
+ ## 工具说明
141
64
 
142
- # OpenClaw 会自动调用 browser_cache_execute 工具
143
- # 该工具会:
144
- # 1. 识别场景为 'login'
145
- # 2. 从缓存中查找匹配的登录流程
146
- # 3. 如果找到缓存,直接执行缓存的操作
147
- # 4. 如果未找到,执行新的操作并保存到缓存
65
+ ### 1. page_snapshot_cache
66
+ 缓存和检索页面快照以加速重复操作
148
67
 
149
- # 查看缓存统计
150
- openclaw message send --channel web --content "查看缓存统计"
68
+ **参数**:
69
+ - `url` (必需): 页面 URL
70
+ - `snapshot` (可选): 要存储的页面快照
71
+ - `refs` (可选): 角色引用映射
72
+ - `invalidate` (可选): 失效该 URL 的缓存,默认 false
151
73
 
152
- # 清空缓存
153
- openclaw message send --channel web --content "清空登录页面缓存"
74
+ **返回示例**:
75
+ ```
76
+ Cache stored for https://example.com
154
77
  ```
155
78
 
156
- #### 通过 Web UI 使用
157
- 1. 在 OpenClaw Web UI 中发送消息
158
- 2. AI 会自动调用 page-action-cache 扩展的工具
159
- 3. 工具会执行浏览器操作并返回结果
160
- 4. 用户可以看到缓存命中情况和节省的时间
161
-
162
- ### 工具详细说明
163
-
164
- #### 1. browser_cache_execute
165
- 执行缓存的页面操作序列
79
+ ### 2. page_cache_stats
80
+ 查看页面快照缓存统计信息
166
81
 
167
- **参数**:
168
- - `url` (必需): 目标页面 URL
169
- - `viewport` (可选): 视口大小,如 "1920x1080"
170
- - `scenario` (可选): 操作场景(login/search/payment/checkout/general)
171
- - `actions` (可选): 页面操作序列数组
172
- - `type`: 操作类型(navigate/click/screenshot/type/script)
173
- - `params`: 操作参数对象
174
- - `useCache` (可选): 是否使用缓存,默认 true
175
- - `forceRefresh` (可选): 是否强制刷新缓存,默认 false
176
- - `llmClassificationScore` (可选): LLM 分类置信度分数 (0-1)
82
+ **参数**:
177
83
 
178
84
  **返回示例**:
179
85
  ```
180
- ## Cached Execution
86
+ ## Page Snapshot Cache Statistics
181
87
 
182
- Execution completed successfully
183
-
184
- - Executed Actions: 4
185
- - Skipped Actions: 0
186
- - Failed Actions: 0
187
- - Saved Time: 1800ms
188
-
189
- Cache ID: 1234567890
190
- URL: https://example.com/login
191
- Scenario: login
192
- Cache Level: L3
193
- Access Count: 5
88
+ - Total Entries: 15
89
+ - Total Hits: 42
90
+ - Hit Rate: 85.50%
91
+ - Avg Hit Count: 2.8
92
+ - Cleaned Entries: 3
93
+ - Oldest Entry: 2026-03-16T10:30:00.000Z
94
+ - Newest Entry: 2026-03-16T11:00:00.000Z
194
95
  ```
195
96
 
196
- #### 2. browser_cache_stats
197
- 查看页面操作缓存的统计信息
97
+ ### 3. page_cache_clear
98
+ 清空页面快照缓存
198
99
 
199
100
  **参数**: 无
200
101
 
201
102
  **返回示例**:
202
103
  ```
203
- ## Page Action Cache Statistics
204
-
205
- ### Overall Performance
206
- - Total Cache Entries: 15
207
- - Total Cache Hits: 42
208
- - Cache Hit Rate: 85.50%
209
-
210
- ### Multi-Level Cache Distribution
211
- #### L3 Cache
212
- - Size: 8/1000 (0.8% full)
213
- - Average Access Count: 5.2
214
-
215
- #### L2 Cache
216
- - Size: 5/200 (2.5% full)
217
- - Average Access Count: 8.4
218
-
219
- #### L1 Cache
220
- - Size: 2/50 (4.0% full)
221
- - Average Access Count: 12.0
222
-
223
- ### Cache Invalidation
224
- - Total Snapshots: 45
225
- - Active Snapshots: 38
226
- - Invalidation Rate: 15.55%
104
+ Cleared 15 cache entries
227
105
  ```
228
106
 
229
- #### 3. browser_cache_clear
230
- 清空页面操作缓存
107
+ ## 使用示例
231
108
 
232
- **参数**:
233
- - `level` (可选): 缓存级别(all/L3/L2/L1),默认 all
234
- - `url` (可选): 特定 URL
235
- - `viewport` (可选): 特定视口
109
+ ### 通过 OpenClaw CLI 使用
236
110
 
237
- **使用示例**:
238
- ```
239
- # 清空所有缓存
240
- openclaw message send --channel web --content "清空所有缓存"
111
+ ```bash
112
+ # 存储页面快照
113
+ openclaw message send --channel web --content "page_snapshot_cache https://example.com --snapshot '...' --refs {...}"
241
114
 
242
- # 清空特定级别
243
- openclaw message send --channel web --content "清空L1缓存"
115
+ # 查询缓存
116
+ openclaw message send --channel web --content "page_snapshot_cache https://example.com"
244
117
 
245
- # 清空特定URL的缓存
246
- openclaw message send --channel web --content "清空登录页面缓存"
118
+ # 查看统计
119
+ openclaw message send --channel web --content "page_cache_stats"
120
+
121
+ # 清空缓存
122
+ openclaw message send --channel web --content "page_cache_clear"
247
123
  ```
248
124
 
249
- ### 多实例集成
125
+ ### 通过 Web UI 使用
126
+ 1. 在 OpenClaw Web UI 中发送消息
127
+ 2. AI 会自动调用 page-action-cache 扩展的工具
128
+ 3. 工具会执行缓存操作并返回结果
129
+ 4. 用户可以看到缓存命中情况和统计信息
250
130
 
251
- 当使用 OpenClaw 多实例架构时,可以为不同实例配置不同的缓存策略:
131
+ ## 配置示例
252
132
 
253
- #### 实例配置示例
133
+ ### 基础配置
254
134
  ```json
255
135
  {
256
136
  "plugins": {
257
137
  "entries": {
258
138
  "page-action-cache": {
259
- "path": "/Users/zhoujinyu/Documents/projects/page-action-cache",
260
139
  "enabled": true,
261
- "config": {
262
- // 生产实例配置
263
- "cacheLevelStrategy": "l3-only",
264
- "pageChangeDetectionEnabled": true,
265
- "invalidationStrategy": "hard"
266
- }
140
+ "autoUseCache": true
267
141
  }
268
142
  }
269
143
  }
270
144
  }
271
145
  ```
272
146
 
273
- 不同实例可以共享同一个扩展代码,但使用不同的配置参数:
274
- - **开发实例**: 使用 L1 缓存,软失效策略
275
- - **测试实例**: 使用 auto 策略,快速迭代
276
- - **生产实例**: 使用 L3 缓存,硬失效策略,确保稳定性
277
-
278
- ### 与 Browser Client API 集成
279
-
280
- 扩展通过 HTTP API 与 OpenClaw Browser Client 通信:
281
-
282
- **环境变量**:
283
- ```bash
284
- export OPENCLAW_BROWSER_CLIENT_URL="http://localhost:3000"
285
- ```
286
-
287
- **API 端点**:
288
- - `POST /api/browser/navigate` - 导航到指定 URL
289
- - `POST /api/browser/click` - 点击指定元素
290
- - `POST /api/browser/type` - 输入文本到指定元素
291
- - `POST /api/browser/screenshot` - 截取页面截图
292
- - `POST /api/browser/execute-script` - 执行 JavaScript 脚本
293
-
294
- **自动发现机制**:
295
- 扩展会自动尝试连接到以下位置的 Browser Client:
296
- 1. 环境变量 `OPENCLAW_BROWSER_CLIENT_URL` 指定的地址
297
- 2. 默认地址 `http://localhost:3000`
298
- 3. 如果都不可用,扩展仍然可以工作,但浏览器操作会被跳过
299
-
300
- ## 安装和使用
301
-
302
- ### 安装
303
- ```bash
304
- # 开发目录安装
305
- cd /Users/zhoujinyu/Documents/projects/page-action-cache
306
- npm install
307
-
308
- # 构建项目
309
- npm run build
310
- ```
311
-
312
- ### 使用
313
- 该扩展提供三个工具:
314
-
315
- 1. **browser_cache_execute**: 执行缓存的页面操作序列
316
- 2. **browser_cache_stats**: 查看缓存统计信息
317
- 3. **browser_cache_clear**: 清空页面操作缓存
318
-
319
- ### 配置选项
320
- ```json
321
- {
322
- "enabled": true,
323
- "autoUseCache": true,
324
- "scenarioRecognitionEnabled": true,
325
- "llmClassificationThreshold": 0.8,
326
- "cacheLevelStrategy": "auto",
327
- "defaultCacheLevel": "L1",
328
- "pageChangeDetectionEnabled": true,
329
- "changeInvalidationThreshold": 0.5,
330
- "invalidationStrategy": "soft",
331
- "variableExtractionEnabled": true,
332
- "allowUserConfirmVariables": true,
333
- "allowUserForcedRefresh": true,
334
- "enableUserCacheErrorReport": true,
335
- "trackExecutionStats": true,
336
- "statsUpdateInterval": 60000
337
- }
338
- ```
339
-
340
- ## 测试
341
-
342
- ### 运行所有测试
343
- ```bash
344
- npm test
345
- ```
346
-
347
- ### 运行特定测试
348
- ```bash
349
- # 场景识别测试
350
- npm test -- tests/scenario-recognizer.test.ts
351
-
352
- # 基础功能测试
353
- npm test -- tests/basic.test.ts
354
- ```
355
-
356
147
  ## 性能优化
357
148
 
358
149
  ### 缓存策略
359
- - **命中率优化**: 多级缓存自动调整存储位置
360
- - **容量管理**: LRU驱逐策略确保缓存有效性
361
- - **过期清理**: 定期清理过期和低质量缓存
362
-
363
- ### 执行优化
364
- - **失败跳过**: 自动跳过高失败率的操作
365
- - **时间节省**: 实时计算缓存带来的性能提升
366
- - **智能调度**: 根据场景和置信度选择最佳缓存级别
367
-
368
- ## 开发状态
369
-
370
- ✅ **已完成的功能**:
371
- - 场景识别系统
372
- - 变量提取系统
373
- - 多级缓存系统
374
- - 缓存失效系统
375
- - 浏览器动作执行系统
376
- - 完整的测试覆盖
377
- - TypeScript 类型定义
378
- - OpenClaw 插件接口实现
379
-
380
- ⚠️ **已知限制**:
381
- - 依赖 OpenClaw Browser Client API(需要实际的浏览器客户端)
382
- - 某些高级测试需要实际的浏览器环境
383
- - LLM 分类需要外部服务集成
150
+ - **TTL 过期**: 5 分钟后自动失效
151
+ - **LRU 驱逐**: 超过容量时删除最旧的条目
152
+ - **访问计数**: 跟踪每个缓存的命中次数
153
+ - **自动清理**: 每次操作时检查并清理过期缓存
154
+
155
+ ### 预期性能提升
156
+ | 场景 | 无缓存 | 有缓存 | 提升 |
157
+ |--------|--------|--------|------|
158
+ | 首次访问 | ~5s | ~5s | 0% (需存储) |
159
+ | 再次访问 | ~5s | ~50ms | 99% |
160
+ | 缓存命中 | 正常 | 正常 | 0% (直接用 refs) |
384
161
 
385
162
  ## 技术栈
386
163
 
@@ -389,6 +166,23 @@ npm test -- tests/basic.test.ts
389
166
  - **测试框架**: Vitest
390
167
  - **目标环境**: Node.js 22+
391
168
  - **构建工具**: TypeScript Compiler
169
+ - **OpenClaw SDK**: openclaw/plugin-sdk
170
+
171
+ ## 开发状态
172
+
173
+ ### 已完成的功能
174
+ - ✅ OpenClaw Plugin SDK 集成
175
+ - ✅ 内存缓存实现
176
+ - ✅ TTL 过期管理
177
+ - ✅ LRU 容量管理
178
+ - ✅ 统计信息工具
179
+ - ✅ 缓存清空工具
180
+ - ✅ TypeScript 类型定义
181
+
182
+ ### 已知限制
183
+ - 缓存存储在内存中,进程重启后清空
184
+ - 目前不支持跨进程持久化
185
+ - 不支持页面变化检测(简化版本)
392
186
 
393
187
  ## 许可证
394
188
 
@@ -396,4 +190,4 @@ MIT
396
190
 
397
191
  ## 贡献
398
192
 
399
- 欢迎提交 Issue 和 Pull Request!
193
+ 欢迎提交 Issue 和 Pull Request!
package/dist/index.d.ts CHANGED
@@ -1,11 +1,28 @@
1
1
  /**
2
2
  * Page Action Cache - OpenClaw Extension
3
- * 页面操作缓存扩展 - OpenClaw 扩展
3
+ * 页面操作缓存扩展
4
4
  */
5
- import type { OpenClawPluginApi } from './types-mock.js';
5
+ interface OpenClawPluginApi {
6
+ registerTool(tool: {
7
+ name: string;
8
+ description: string;
9
+ inputSchema: unknown;
10
+ execute: (params: unknown) => Promise<unknown>;
11
+ }): void;
12
+ getToolContext?: () => {
13
+ config?: Record<string, unknown>;
14
+ };
15
+ }
16
+ /**
17
+ * 插件配置接口
18
+ */
19
+ export interface PageActionCacheConfig {
20
+ enabled: boolean;
21
+ autoUseCache?: boolean;
22
+ }
6
23
  /**
7
24
  * 主扩展入口
8
25
  */
9
- export declare function register(api: OpenClawPluginApi): void;
10
- export declare const registerTools: typeof register;
26
+ export default function register(api: OpenClawPluginApi): void;
27
+ export {};
11
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAOzD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAicrD;AAGD,eAAO,MAAM,aAAa,iBAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAChD,GAAG,IAAI,CAAC;IACT,cAAc,CAAC,EAAE,MAAM;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAoDD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAiP7D"}