@open-feishu-card/adapter 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.
- package/dist/dsl-to-raw.d.ts +20 -0
- package/dist/dsl-to-raw.d.ts.map +1 -0
- package/dist/dsl-to-raw.js +295 -0
- package/dist/dsl-to-raw.js.map +1 -0
- package/dist/emoji-data.d.ts +17 -0
- package/dist/emoji-data.d.ts.map +1 -0
- package/dist/emoji-data.js +288 -0
- package/dist/emoji-data.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/md-parse.d.ts +24 -0
- package/dist/md-parse.d.ts.map +1 -0
- package/dist/md-parse.js +358 -0
- package/dist/md-parse.js.map +1 -0
- package/dist/raw-to-dsl.d.ts +8 -0
- package/dist/raw-to-dsl.d.ts.map +1 -0
- package/dist/raw-to-dsl.js +166 -0
- package/dist/raw-to-dsl.js.map +1 -0
- package/dist/types.d.ts +365 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 公开 DSL(JSON Schema 2.0 卡片)→ 本渲染器认得的 RAW 形态。
|
|
3
|
+
*
|
|
4
|
+
* 这是 feishu-raw-card-to-dsl 的**逆向**:那个库把飞书下发的 raw envelope 投影回公开
|
|
5
|
+
* DSL;本文件把开发者手写的公开 DSL 反投影成 RAW,喂给 renderCard* 直接渲染,
|
|
6
|
+
* 从而免去「真发一遍卡片再拉回来」的服务端回环。
|
|
7
|
+
*
|
|
8
|
+
* 关键前提:目标不是「飞书能接收的合法 raw envelope」,而是「本渲染器能画出来的形态」。
|
|
9
|
+
* 后者宽松得多——components.ts 里很多字段本就同时接受 camelCase / snake_case
|
|
10
|
+
* (如 column_set 的 flex_mode/flexMode、img 的 scale_type/scaleType)。因此这里只需处理
|
|
11
|
+
* 三类真实差异:
|
|
12
|
+
* 1. markdown 内容字符串 → 子元素树(交给 md-parse.ts);
|
|
13
|
+
* 2. 元素扁平字段 → 包进 property,文本叶子归一为 { tag:'plain_text', property:{content} };
|
|
14
|
+
* 3. 少数「渲染器只认 camelCase」的字段做 snake→camel 重命名,box 简写字符串 → 对象。
|
|
15
|
+
* 其余字段一律透传(与渲染器 warnOnUnknownTag、以及反向库 convertGeneric 同哲学)。
|
|
16
|
+
*/
|
|
17
|
+
import type { JsonCard } from './types.js';
|
|
18
|
+
/** DSL 顶层 → JsonCard(渲染器输入)。 */
|
|
19
|
+
export declare function dslToRaw(dsl: unknown): JsonCard;
|
|
20
|
+
//# sourceMappingURL=dsl-to-raw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsl-to-raw.d.ts","sourceRoot":"","sources":["../src/dsl-to-raw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAgC,QAAQ,EAAE,MAAM,YAAY,CAAC;AA0BzE,gCAAgC;AAChC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAS/C"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { parseMarkdown } from './md-parse.js';
|
|
2
|
+
/**
|
|
3
|
+
* 渲染器「只读 camelCase」的字段:DSL 用 snake_case 写,必须改名才能渲染出来。
|
|
4
|
+
* 依据 components.ts / registry.ts 逐字段核对(dual-read 的字段不在此列,透传即可)。
|
|
5
|
+
*/
|
|
6
|
+
const KEY_RENAME = {
|
|
7
|
+
text_align: 'textAlign',
|
|
8
|
+
text_style: 'textStyle',
|
|
9
|
+
background_style: 'backgroundStyle',
|
|
10
|
+
background_color: 'backgroundColor',
|
|
11
|
+
user_id: 'userID',
|
|
12
|
+
show_avatar: 'showAvatar',
|
|
13
|
+
show_name: 'showName',
|
|
14
|
+
has_border: 'hasBorder',
|
|
15
|
+
hover_tips: 'hoverTips',
|
|
16
|
+
pill_shaped: 'pillShaped',
|
|
17
|
+
tag_style: 'tagStyle',
|
|
18
|
+
scale_type: 'scaleType',
|
|
19
|
+
drop_invalid_user_id: 'dropInvalidUserID',
|
|
20
|
+
};
|
|
21
|
+
/** 需要把「文本叶子」归一成 { tag:'plain_text', property:{content} } 的字段名 */
|
|
22
|
+
const TEXT_LEAF_KEYS = new Set(['title', 'subtitle', 'alt', 'hover_tips', 'placeholder']);
|
|
23
|
+
/** DSL 顶层 → JsonCard(渲染器输入)。 */
|
|
24
|
+
export function dslToRaw(dsl) {
|
|
25
|
+
const root = isRecord(dsl) ? dsl : {};
|
|
26
|
+
// 允许调用方直接传 { card: {...} } 或 { json_card: {...} } 外层包装
|
|
27
|
+
const card = isRecord(root.card) ? root.card : isRecord(root.json_card) ? root.json_card : root;
|
|
28
|
+
const out = { schema: typeof card.schema === 'string' ? card.schema : '2.0' };
|
|
29
|
+
if (isRecord(card.header))
|
|
30
|
+
out.header = convertHeader(card.header);
|
|
31
|
+
if (isRecord(card.body))
|
|
32
|
+
out.body = convertBody(card.body);
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
function convertHeader(header) {
|
|
36
|
+
const property = {};
|
|
37
|
+
for (const [k, v] of Object.entries(header)) {
|
|
38
|
+
if (k === 'tag')
|
|
39
|
+
continue;
|
|
40
|
+
if (TEXT_LEAF_KEYS.has(k)) {
|
|
41
|
+
property[k] = wrapTextLeaf(v);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// 前置图标:icon / ud_icon(与 body 元素同规则)
|
|
45
|
+
if ((k === 'icon' || k === 'ud_icon') && isRecord(v)) {
|
|
46
|
+
property[k === 'ud_icon' ? 'udIcon' : 'icon'] = convertEl(v);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// text_tag_list 里的 text_tag 需递归 convertEl(否则 text 叶子仍是扁平 DSL)
|
|
50
|
+
if (k === 'text_tag_list' && Array.isArray(v)) {
|
|
51
|
+
property.text_tag_list = v.map(convertNode);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
property[renameKey(k)] = coerceValue(k, v);
|
|
55
|
+
}
|
|
56
|
+
return { tag: 'card_header', property };
|
|
57
|
+
}
|
|
58
|
+
function convertBody(body) {
|
|
59
|
+
// 除 elements 外,body 还可带 padding / vertical_spacing 等容器级字段——一并搬进 property
|
|
60
|
+
// (buildProperty 会做 box 简写→对象、snake→camel 等转换),否则 body 组件读不到、间距/内边距回退默认。
|
|
61
|
+
const property = buildProperty(body, 'body');
|
|
62
|
+
const elements = Array.isArray(body.elements) ? body.elements.map(convertNode) : [];
|
|
63
|
+
property.elements = elements.filter(Boolean);
|
|
64
|
+
return { tag: 'body', property };
|
|
65
|
+
}
|
|
66
|
+
/** 数组项 / 子元素统一入口:元素对象走 convertEl,其它原样递归 */
|
|
67
|
+
function convertNode(node) {
|
|
68
|
+
if (isRecord(node) && typeof node.tag === 'string')
|
|
69
|
+
return convertEl(node);
|
|
70
|
+
return node;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 单个 DSL 元素(扁平、snake_case)→ RAW 元素({ tag, property })。
|
|
74
|
+
*/
|
|
75
|
+
function convertEl(el) {
|
|
76
|
+
const tag = String(el.tag);
|
|
77
|
+
// person → person_v1(渲染器注册的是 person_v1 / person_list)
|
|
78
|
+
// DSL style:"capsule" → pillShaped(与 markdown <person style=capsule> 一致)
|
|
79
|
+
if (tag === 'person') {
|
|
80
|
+
const property = buildProperty(el, 'person_v1');
|
|
81
|
+
// ElementProperty.style 类型偏图标对象;DSL person 的 style 是 "capsule"|"normal" 字符串
|
|
82
|
+
if (property.style === 'capsule') {
|
|
83
|
+
property.pillShaped = true;
|
|
84
|
+
delete property.style;
|
|
85
|
+
}
|
|
86
|
+
return { tag: 'person_v1', property };
|
|
87
|
+
}
|
|
88
|
+
// markdown / lark_md:content 字符串 → 子元素树。
|
|
89
|
+
// lark_md 是飞书旧名(checker.text / div.text 仍常用),统一归一为 markdown 再解析。
|
|
90
|
+
if (tag === 'markdown' || tag === 'lark_md') {
|
|
91
|
+
const property = buildProperty(el, 'markdown');
|
|
92
|
+
if (typeof el.content === 'string')
|
|
93
|
+
property.elements = parseMarkdown(el.content);
|
|
94
|
+
delete property.content;
|
|
95
|
+
return { tag: 'markdown', property };
|
|
96
|
+
}
|
|
97
|
+
// table:lark_md / markdown 列的单元格字符串 → 与真机 RAW 一致的 markdown 元素树。
|
|
98
|
+
// 否则渲染期只能当纯文本,"<font color='green'>**▲**</font>" 会原样漏到 HTML。
|
|
99
|
+
if (tag === 'table') {
|
|
100
|
+
return { tag, property: convertTableProperty(el) };
|
|
101
|
+
}
|
|
102
|
+
return { tag, property: buildProperty(el, tag) };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* table 专用:在通用 buildProperty 之后,把 markdown 列的字符串单元格
|
|
106
|
+
* 转成 { data: { tag:'markdown', property:{ elements } } }(对齐真机 RAW 形态)。
|
|
107
|
+
*/
|
|
108
|
+
function convertTableProperty(el) {
|
|
109
|
+
const property = buildProperty(el, 'table');
|
|
110
|
+
const columns = Array.isArray(property.columns) ? property.columns : [];
|
|
111
|
+
const mdColNames = new Set();
|
|
112
|
+
for (const col of columns) {
|
|
113
|
+
if (!isRecord(col))
|
|
114
|
+
continue;
|
|
115
|
+
const dt = col.data_type ?? col.dataType;
|
|
116
|
+
if (dt === 'lark_md' || dt === 'markdown') {
|
|
117
|
+
const name = typeof col.name === 'string' ? col.name : '';
|
|
118
|
+
if (name)
|
|
119
|
+
mdColNames.add(name);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!mdColNames.size || !Array.isArray(property.rows))
|
|
123
|
+
return property;
|
|
124
|
+
property.rows = property.rows.map((row) => {
|
|
125
|
+
if (!isRecord(row))
|
|
126
|
+
return row;
|
|
127
|
+
const out = { ...row };
|
|
128
|
+
for (const name of mdColNames) {
|
|
129
|
+
const cell = out[name];
|
|
130
|
+
// 已是 { data: … } / markdown 元素则不动(幂等);只转裸字符串。
|
|
131
|
+
if (typeof cell === 'string') {
|
|
132
|
+
out[name] = {
|
|
133
|
+
data: {
|
|
134
|
+
tag: 'markdown',
|
|
135
|
+
property: { elements: parseMarkdown(cell), originTag: 'lark_md' },
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return out;
|
|
141
|
+
});
|
|
142
|
+
return property;
|
|
143
|
+
}
|
|
144
|
+
/** 把 DSL 元素的扁平字段(除 tag/id)搬进 property,逐字段做必要转换。 */
|
|
145
|
+
function buildProperty(el, tag) {
|
|
146
|
+
const property = {};
|
|
147
|
+
for (const [k, v] of Object.entries(el)) {
|
|
148
|
+
if (k === 'tag' || k === 'id')
|
|
149
|
+
continue; // 渲染器不读 id
|
|
150
|
+
// column 定宽 "Npx" → widthValue(渲染器 column 靠 widthValue.value 判定定宽;
|
|
151
|
+
// 直接留 width:"100px" 字符串会被当成权重列,图片按列宽渲染会错位)
|
|
152
|
+
if (tag === 'column' && k === 'width' && typeof v === 'string') {
|
|
153
|
+
const px = pxValue(v);
|
|
154
|
+
if (px != null) {
|
|
155
|
+
property.widthValue = { type: 'pixels', value: px };
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// 文本叶子:title/subtitle/alt/hover_tips/placeholder → {tag:plain_text,property:{content}}
|
|
160
|
+
if (TEXT_LEAF_KEYS.has(k)) {
|
|
161
|
+
property[renameKey(k)] = wrapTextLeaf(v);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// button.text / text_tag.text:归一为 plain_text 叶子(渲染器 extractPlainText / extractText)
|
|
165
|
+
// checker.text 若为 markdown / lark_md:必须走 convertEl(content → parseMarkdown),
|
|
166
|
+
// 否则 <text_tag>/<font> 会作为字面量漏到 HTML。其它父级的 text 仍走 wrapTextLeaf,
|
|
167
|
+
// 避免 header.title / text_tag.text 误走 markdown 后 content 被删、读不到字。
|
|
168
|
+
if (k === 'text') {
|
|
169
|
+
if (tag === 'checker' && isRecord(v) && (v.tag === 'markdown' || v.tag === 'lark_md')) {
|
|
170
|
+
property.text = convertEl(v);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
property.text = wrapTextLeaf(v);
|
|
174
|
+
}
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
// 前置图标
|
|
178
|
+
if ((k === 'icon' || k === 'ud_icon') && isRecord(v)) {
|
|
179
|
+
property[k === 'ud_icon' ? 'udIcon' : 'icon'] = convertEl(v);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// 点击行为:button / interactive_container / checker 的 behaviors|multi_url → 渲染器读的 actions|url
|
|
183
|
+
if (k === 'behaviors' && Array.isArray(v)) {
|
|
184
|
+
property.actions = behaviorsToActions(v);
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (k === 'multi_url') {
|
|
188
|
+
property.url = normalizeUrl(v);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
// checker.button_area:嵌套 buttons 需递归 convertEl(否则仍是扁平 DSL,渲不出)
|
|
192
|
+
if (k === 'button_area' && isRecord(v)) {
|
|
193
|
+
const area = { ...v };
|
|
194
|
+
if (Array.isArray(v.buttons))
|
|
195
|
+
area.buttons = v.buttons.map(convertNode);
|
|
196
|
+
property.button_area = area;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
property[renameKey(k)] = coerceValue(k, v);
|
|
200
|
+
}
|
|
201
|
+
return property;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 字段值转换:box 简写字符串→对象、子元素数组递归、url 归一,其余透传。
|
|
205
|
+
* (column 定宽 width→widthValue 在 buildProperty 里就地处理,不走这里。)
|
|
206
|
+
*/
|
|
207
|
+
function coerceValue(key, value) {
|
|
208
|
+
// padding / margin:CSS 简写字符串 → { top/right/bottom/left:{type:'pixels',value} }
|
|
209
|
+
if ((key === 'padding' || key === 'margin') && typeof value === 'string') {
|
|
210
|
+
return parseBox(value);
|
|
211
|
+
}
|
|
212
|
+
// 子元素容器:elements / columns / actions / persons / items 里的元素递归转换
|
|
213
|
+
if (Array.isArray(value))
|
|
214
|
+
return value.map(convertNode);
|
|
215
|
+
// url 对象/字符串:保持渲染器 resolveURL 认得的形态
|
|
216
|
+
if (key === 'url')
|
|
217
|
+
return normalizeUrl(value);
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
/* ------------------------------------------------------------------ *
|
|
221
|
+
* 小工具
|
|
222
|
+
* ------------------------------------------------------------------ */
|
|
223
|
+
function renameKey(k) {
|
|
224
|
+
return KEY_RENAME[k] || k;
|
|
225
|
+
}
|
|
226
|
+
/** 文本叶子 → { tag:'plain_text', property:{content, textAlign?, text_size?, text_color?} } */
|
|
227
|
+
function wrapTextLeaf(v) {
|
|
228
|
+
if (typeof v === 'string')
|
|
229
|
+
return { tag: 'plain_text', property: { content: v } };
|
|
230
|
+
if (isRecord(v)) {
|
|
231
|
+
const property = { content: typeof v.content === 'string' ? v.content : '' };
|
|
232
|
+
if (typeof v.text_align === 'string')
|
|
233
|
+
property.textAlign = v.text_align;
|
|
234
|
+
// checker 等组件的 text 叶子会带 text_size / text_color(DSL snake_case)
|
|
235
|
+
if (typeof v.text_size === 'string')
|
|
236
|
+
property.text_size = v.text_size;
|
|
237
|
+
if (typeof v.text_color === 'string')
|
|
238
|
+
property.text_color = v.text_color;
|
|
239
|
+
return { tag: typeof v.tag === 'string' ? v.tag : 'plain_text', property };
|
|
240
|
+
}
|
|
241
|
+
return { tag: 'plain_text', property: { content: '' } };
|
|
242
|
+
}
|
|
243
|
+
/** behaviors:[{type,default_url}] → actions:[{type,action:{url}}](渲染器读 actions[].action.url) */
|
|
244
|
+
function behaviorsToActions(behaviors) {
|
|
245
|
+
const out = [];
|
|
246
|
+
for (const b of behaviors) {
|
|
247
|
+
if (!isRecord(b))
|
|
248
|
+
continue;
|
|
249
|
+
const type = typeof b.type === 'string' ? b.type : 'open_url';
|
|
250
|
+
out.push({ type, action: { url: normalizeUrl(b.default_url) } });
|
|
251
|
+
}
|
|
252
|
+
return out;
|
|
253
|
+
}
|
|
254
|
+
/** url 归一:字符串直返;对象取 .url(多端字段交给渲染器 resolveURL 处理) */
|
|
255
|
+
function normalizeUrl(v) {
|
|
256
|
+
if (typeof v === 'string')
|
|
257
|
+
return v;
|
|
258
|
+
if (isRecord(v))
|
|
259
|
+
return v; // {url, pc_url,...} —— resolveURL 认 url/pcURL 等
|
|
260
|
+
return v;
|
|
261
|
+
}
|
|
262
|
+
/** "12px" / "12px 8px" / "1px 2px 3px 4px" → { top/right/bottom/left:{type:'pixels',value} } */
|
|
263
|
+
function parseBox(s) {
|
|
264
|
+
const nums = s.trim().split(/\s+/).map((t) => pxValue(t) ?? 0);
|
|
265
|
+
let t = 0, r = 0, b = 0, l = 0;
|
|
266
|
+
if (nums.length === 1) {
|
|
267
|
+
t = r = b = l = nums[0];
|
|
268
|
+
}
|
|
269
|
+
else if (nums.length === 2) {
|
|
270
|
+
t = b = nums[0];
|
|
271
|
+
r = l = nums[1];
|
|
272
|
+
}
|
|
273
|
+
else if (nums.length === 3) {
|
|
274
|
+
t = nums[0];
|
|
275
|
+
r = l = nums[1];
|
|
276
|
+
b = nums[2];
|
|
277
|
+
}
|
|
278
|
+
else if (nums.length >= 4) {
|
|
279
|
+
[t, r, b, l] = nums;
|
|
280
|
+
}
|
|
281
|
+
const px = (value) => ({ type: 'pixels', value });
|
|
282
|
+
return { top: px(t), right: px(r), bottom: px(b), left: px(l) };
|
|
283
|
+
}
|
|
284
|
+
/** "12px" → 12;"12" → 12;非像素返回 null */
|
|
285
|
+
function pxValue(s) {
|
|
286
|
+
const m = /^(-?\d+(?:\.\d+)?)px?$/.exec(s.trim());
|
|
287
|
+
if (m)
|
|
288
|
+
return Number(m[1]);
|
|
289
|
+
const n = Number(s);
|
|
290
|
+
return Number.isFinite(n) ? n : null;
|
|
291
|
+
}
|
|
292
|
+
function isRecord(v) {
|
|
293
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=dsl-to-raw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsl-to-raw.js","sourceRoot":"","sources":["../src/dsl-to-raw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 飞书 emoji 短码(:KEY:)-> 雪碧图名映射 + 完整雪碧 CSS。
|
|
3
|
+
* 由 scripts/gen-emoji.mjs 从网页版飞书资源生成,请勿手改。
|
|
4
|
+
*
|
|
5
|
+
* 渲染机制:<i class="larkw-emoji__img--emoji-<name>"> 靠单张雪碧图 CDN + background-position
|
|
6
|
+
* 画出表情(与网页版飞书一致)。雪碧图走 CDN 不内联。详见 README 的「Emoji」一节。
|
|
7
|
+
*
|
|
8
|
+
* 共 270 个短码,291 个雪碧定位。
|
|
9
|
+
*/
|
|
10
|
+
/** emoji 短码(大小写敏感,如 "Fire" / "OK")-> 雪碧图名(如 "fire" / "ok_v2") */
|
|
11
|
+
export declare const EMOJI_KEY_TO_NAME: Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* 完整 emoji 雪碧 CSS(含 CDN 背景图 + 每表情 background-position)。
|
|
14
|
+
* 浏览器端首次渲染 emoji 时注入 <style>;Node/SSR 端引入 open-feishu-card/emoji.css。
|
|
15
|
+
*/
|
|
16
|
+
export declare const EMOJI_SPRITE_CSS: string;
|
|
17
|
+
//# sourceMappingURL=emoji-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emoji-data.d.ts","sourceRoot":"","sources":["../src/emoji-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+QpD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAConvB,CAAC"}
|