@leadcms/sdk 3.3.11 → 3.4.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 (115) hide show
  1. package/README.md +2 -1
  2. package/dist/cli/bin/content-status-args.d.ts +7 -0
  3. package/dist/cli/bin/content-status-args.d.ts.map +1 -0
  4. package/dist/cli/bin/content-status-args.js +27 -0
  5. package/dist/cli/bin/content-status-args.js.map +1 -0
  6. package/dist/cli/bin/pull-content.js +3 -1
  7. package/dist/cli/bin/pull-content.js.map +1 -1
  8. package/dist/cli/bin/pull-settings.d.ts +6 -0
  9. package/dist/cli/bin/pull-settings.d.ts.map +1 -0
  10. package/dist/cli/bin/pull-settings.js +31 -0
  11. package/dist/cli/bin/pull-settings.js.map +1 -0
  12. package/dist/cli/bin/push-all.js +16 -1
  13. package/dist/cli/bin/push-all.js.map +1 -1
  14. package/dist/cli/bin/push-comments.d.ts +6 -0
  15. package/dist/cli/bin/push-comments.d.ts.map +1 -0
  16. package/dist/cli/bin/push-comments.js +33 -0
  17. package/dist/cli/bin/push-comments.js.map +1 -0
  18. package/dist/cli/bin/push-content.js +3 -2
  19. package/dist/cli/bin/push-content.js.map +1 -1
  20. package/dist/cli/bin/push-email-templates.js +13 -1
  21. package/dist/cli/bin/push-email-templates.js.map +1 -1
  22. package/dist/cli/bin/push-settings.d.ts +6 -0
  23. package/dist/cli/bin/push-settings.d.ts.map +1 -0
  24. package/dist/cli/bin/push-settings.js +34 -0
  25. package/dist/cli/bin/push-settings.js.map +1 -0
  26. package/dist/cli/bin/status-all.js +115 -2
  27. package/dist/cli/bin/status-all.js.map +1 -1
  28. package/dist/cli/bin/status-comments.d.ts +6 -0
  29. package/dist/cli/bin/status-comments.d.ts.map +1 -0
  30. package/dist/cli/bin/status-comments.js +28 -0
  31. package/dist/cli/bin/status-comments.js.map +1 -0
  32. package/dist/cli/bin/status-content.js +3 -1
  33. package/dist/cli/bin/status-content.js.map +1 -1
  34. package/dist/cli/bin/status-settings.d.ts +6 -0
  35. package/dist/cli/bin/status-settings.d.ts.map +1 -0
  36. package/dist/cli/bin/status-settings.js +27 -0
  37. package/dist/cli/bin/status-settings.js.map +1 -0
  38. package/dist/cli/index.js +38 -0
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +1 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/cms-config-types.d.ts +4 -0
  45. package/dist/lib/cms-config-types.d.ts.map +1 -1
  46. package/dist/lib/cms-config-types.js +6 -0
  47. package/dist/lib/cms-config-types.js.map +1 -1
  48. package/dist/lib/cms.d.ts +7 -7
  49. package/dist/lib/cms.d.ts.map +1 -1
  50. package/dist/lib/cms.js +42 -7
  51. package/dist/lib/cms.js.map +1 -1
  52. package/dist/lib/comment-types.d.ts +4 -0
  53. package/dist/lib/comment-types.d.ts.map +1 -1
  54. package/dist/lib/config.d.ts +2 -0
  55. package/dist/lib/config.d.ts.map +1 -1
  56. package/dist/lib/config.js +6 -5
  57. package/dist/lib/config.js.map +1 -1
  58. package/dist/lib/content-merge.d.ts.map +1 -1
  59. package/dist/lib/content-merge.js +102 -19
  60. package/dist/lib/content-merge.js.map +1 -1
  61. package/dist/lib/data-service.d.ts +41 -1
  62. package/dist/lib/data-service.d.ts.map +1 -1
  63. package/dist/lib/data-service.js +133 -1
  64. package/dist/lib/data-service.js.map +1 -1
  65. package/dist/lib/settings-types.d.ts +120 -0
  66. package/dist/lib/settings-types.d.ts.map +1 -0
  67. package/dist/lib/settings-types.js +84 -0
  68. package/dist/lib/settings-types.js.map +1 -0
  69. package/dist/scripts/fetch-leadcms-comments.d.ts +6 -1
  70. package/dist/scripts/fetch-leadcms-comments.d.ts.map +1 -1
  71. package/dist/scripts/fetch-leadcms-comments.js +7 -5
  72. package/dist/scripts/fetch-leadcms-comments.js.map +1 -1
  73. package/dist/scripts/init-leadcms.d.ts.map +1 -1
  74. package/dist/scripts/init-leadcms.js +15 -1
  75. package/dist/scripts/init-leadcms.js.map +1 -1
  76. package/dist/scripts/leadcms-helpers.d.ts +1 -0
  77. package/dist/scripts/leadcms-helpers.d.ts.map +1 -1
  78. package/dist/scripts/leadcms-helpers.js +1 -0
  79. package/dist/scripts/leadcms-helpers.js.map +1 -1
  80. package/dist/scripts/pull-all.d.ts +5 -1
  81. package/dist/scripts/pull-all.d.ts.map +1 -1
  82. package/dist/scripts/pull-all.js +32 -5
  83. package/dist/scripts/pull-all.js.map +1 -1
  84. package/dist/scripts/pull-content.d.ts +11 -0
  85. package/dist/scripts/pull-content.d.ts.map +1 -1
  86. package/dist/scripts/pull-content.js +79 -3
  87. package/dist/scripts/pull-content.js.map +1 -1
  88. package/dist/scripts/pull-settings.d.ts +19 -0
  89. package/dist/scripts/pull-settings.d.ts.map +1 -0
  90. package/dist/scripts/pull-settings.js +69 -0
  91. package/dist/scripts/pull-settings.js.map +1 -0
  92. package/dist/scripts/push-comments.d.ts +48 -0
  93. package/dist/scripts/push-comments.d.ts.map +1 -0
  94. package/dist/scripts/push-comments.js +433 -0
  95. package/dist/scripts/push-comments.js.map +1 -0
  96. package/dist/scripts/push-email-templates.d.ts +4 -1
  97. package/dist/scripts/push-email-templates.d.ts.map +1 -1
  98. package/dist/scripts/push-email-templates.js +57 -12
  99. package/dist/scripts/push-email-templates.js.map +1 -1
  100. package/dist/scripts/push-leadcms-content.d.ts +15 -5
  101. package/dist/scripts/push-leadcms-content.d.ts.map +1 -1
  102. package/dist/scripts/push-leadcms-content.js +112 -31
  103. package/dist/scripts/push-leadcms-content.js.map +1 -1
  104. package/dist/scripts/push-media.d.ts.map +1 -1
  105. package/dist/scripts/push-media.js +13 -8
  106. package/dist/scripts/push-media.js.map +1 -1
  107. package/dist/scripts/push-settings.d.ts +56 -0
  108. package/dist/scripts/push-settings.d.ts.map +1 -0
  109. package/dist/scripts/push-settings.js +272 -0
  110. package/dist/scripts/push-settings.js.map +1 -0
  111. package/dist/scripts/settings-manager.d.ts +52 -0
  112. package/dist/scripts/settings-manager.d.ts.map +1 -0
  113. package/dist/scripts/settings-manager.js +469 -0
  114. package/dist/scripts/settings-manager.js.map +1 -0
  115. package/package.json +1 -1
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Push local settings to LeadCMS.
3
+ */
4
+ import "dotenv/config";
5
+ import { leadCMSUrl, leadCMSApiKey, defaultLanguage, SETTINGS_DIR } from "./leadcms-helpers.js";
6
+ import { fetchRemoteSettings, readLocalSettings, buildSettingsPushOperations, pushSettingsToRemote, buildSettingsStatus, } from "./settings-manager.js";
7
+ import { colorConsole, statusColors, diffColors } from "../lib/console-colors.js";
8
+ import { AI_SITEPROFILE_PREFIX } from "../lib/settings-types.js";
9
+ import * as Diff from "diff";
10
+ export function selectOperationsForPush(operations, force) {
11
+ if (!force) {
12
+ return operations.filter((op) => op.type !== "unchanged");
13
+ }
14
+ return operations.map((op) => {
15
+ if (op.type !== "unchanged")
16
+ return op;
17
+ return {
18
+ ...op,
19
+ type: "update",
20
+ };
21
+ });
22
+ }
23
+ /**
24
+ * Push local settings to LeadCMS.
25
+ */
26
+ export async function pushSettings(options = {}) {
27
+ const { targetName, dryRun, force } = options;
28
+ if (!leadCMSApiKey) {
29
+ console.log("⏭️ Skipping settings push (no API key configured)");
30
+ return;
31
+ }
32
+ console.log(`⚙️ Pushing settings to LeadCMS...`);
33
+ try {
34
+ // Read local settings
35
+ let localSettings = await readLocalSettings(SETTINGS_DIR, defaultLanguage);
36
+ if (targetName) {
37
+ localSettings = localSettings.filter((s) => s.key === targetName);
38
+ if (localSettings.length === 0) {
39
+ console.log(` ℹ️ Setting "${targetName}" not found locally`);
40
+ return;
41
+ }
42
+ }
43
+ if (localSettings.length === 0) {
44
+ console.log(` ℹ️ No local settings to push`);
45
+ return;
46
+ }
47
+ // Fetch remote settings for comparison
48
+ const allRemote = await fetchRemoteSettings(leadCMSUrl, leadCMSApiKey);
49
+ // Build operations
50
+ const operations = buildSettingsPushOperations(localSettings, allRemote);
51
+ const changes = operations.filter((op) => op.type !== "unchanged");
52
+ if (changes.length === 0 && !force) {
53
+ console.log(` ✅ All settings are in sync, nothing to push`);
54
+ return;
55
+ }
56
+ const toPush = selectOperationsForPush(operations, Boolean(force));
57
+ if (dryRun) {
58
+ console.log(` 🔍 Dry run - would push ${toPush.length} setting(s):`);
59
+ for (const op of toPush) {
60
+ const lang = op.language ? ` [${op.language}]` : "";
61
+ console.log(` ${op.type}: ${op.key}${lang} = "${op.localValue}"`);
62
+ }
63
+ return;
64
+ }
65
+ // Push via import API
66
+ const result = await pushSettingsToRemote(toPush, leadCMSUrl, leadCMSApiKey, dryRun || false);
67
+ if (result) {
68
+ console.log(` ✅ Settings push complete: ${result.added} added, ${result.updated} updated, ${result.failed} failed, ${result.skipped} skipped`);
69
+ if (result.errors && result.errors.length > 0) {
70
+ for (const err of result.errors) {
71
+ console.error(` ❌ ${err.key || "unknown"}: ${err.message || "Unknown error"}`);
72
+ }
73
+ }
74
+ }
75
+ }
76
+ catch (error) {
77
+ if (error.response?.status === 401) {
78
+ console.error(" ❌ Authentication failed while pushing settings");
79
+ throw error;
80
+ }
81
+ console.error(` ❌ Failed to push settings: ${error.message}`);
82
+ throw error;
83
+ }
84
+ }
85
+ /**
86
+ * Show settings status (local vs remote comparison).
87
+ */
88
+ export async function statusSettings(options = {}) {
89
+ const { targetName } = options;
90
+ if (!leadCMSApiKey) {
91
+ console.log("⏭️ Skipping settings status (no API key configured)");
92
+ return;
93
+ }
94
+ try {
95
+ const statusResult = await getSettingsStatusData(options);
96
+ if (!statusResult)
97
+ return;
98
+ renderSettingsStatus(statusResult, targetName);
99
+ }
100
+ catch (error) {
101
+ console.error(` ❌ Failed to check settings status: ${error.message}`);
102
+ throw error;
103
+ }
104
+ }
105
+ /**
106
+ * Get settings status data without rendering (for unified status view).
107
+ */
108
+ export async function getSettingsStatusData(options = {}) {
109
+ const { targetName } = options;
110
+ if (!leadCMSApiKey) {
111
+ return null;
112
+ }
113
+ // Read local settings
114
+ let localSettings = await readLocalSettings(SETTINGS_DIR, defaultLanguage);
115
+ // Fetch remote settings
116
+ const allRemote = await fetchRemoteSettings(leadCMSUrl, leadCMSApiKey);
117
+ // Build comparison
118
+ const statusResult = buildSettingsStatus(localSettings, allRemote);
119
+ if (targetName) {
120
+ statusResult.comparisons = statusResult.comparisons.filter((c) => c.key === targetName);
121
+ }
122
+ return statusResult;
123
+ }
124
+ /**
125
+ * Render settings status to console.
126
+ */
127
+ export function renderSettingsStatus(statusResult, targetName) {
128
+ const { comparisons } = statusResult;
129
+ if (comparisons.length === 0) {
130
+ if (targetName) {
131
+ console.log(` ℹ️ Setting "${targetName}" not found locally or remotely`);
132
+ }
133
+ else {
134
+ console.log(` ✅ No tracked settings found`);
135
+ }
136
+ return;
137
+ }
138
+ colorConsole.important("\n⚙️ Settings Status");
139
+ console.log("─".repeat(80));
140
+ const modified = comparisons.filter((c) => c.status === "modified");
141
+ const localOnly = comparisons.filter((c) => c.status === "local-only");
142
+ const remoteOnly = comparisons.filter((c) => c.status === "remote-only");
143
+ const inSync = comparisons.filter((c) => c.status === "in-sync");
144
+ const changeCount = modified.length + localOnly.length + remoteOnly.length;
145
+ if (changeCount === 0) {
146
+ colorConsole.success(`\n✅ All ${inSync.length} tracked setting(s) are in sync!\n`);
147
+ return;
148
+ }
149
+ console.log("");
150
+ for (const entry of comparisons) {
151
+ const lang = entry.language ? ` [${entry.language}]` : "";
152
+ const label = `${entry.key}${lang}`;
153
+ switch (entry.status) {
154
+ case "in-sync":
155
+ console.log(` ${colorConsole.gray("✓")} ${label.padEnd(50)} ${colorConsole.gray(formatSettingValue(entry.key, entry.localValue))}`);
156
+ break;
157
+ case "modified":
158
+ console.log(` ${statusColors.modified("M")} ${label.padEnd(50)} ${colorConsole.gray(formatSettingDiff(entry.key, entry.remoteValue, entry.localValue))}`);
159
+ renderSettingDiffPreview(entry.key, entry.remoteValue, entry.localValue, " ");
160
+ break;
161
+ case "local-only":
162
+ console.log(` ${statusColors.created("+")} ${label.padEnd(50)} ${colorConsole.highlight(formatSettingValue(entry.key, entry.localValue))} ${colorConsole.gray("(local only)")}`);
163
+ break;
164
+ case "remote-only":
165
+ console.log(` ${statusColors.conflict("-")} ${label.padEnd(50)} ${colorConsole.gray(formatSettingValue(entry.key, entry.remoteValue))} ${colorConsole.gray("(remote only)")}`);
166
+ break;
167
+ }
168
+ }
169
+ console.log("");
170
+ console.log("─".repeat(80));
171
+ console.log(` ${inSync.length} in sync, ${modified.length} modified, ${localOnly.length} local only, ${remoteOnly.length} remote only`);
172
+ console.log("");
173
+ }
174
+ function truncateValue(value, maxLen = 40) {
175
+ const singleLine = value.replace(/\n/g, "\\n");
176
+ if (singleLine.length <= maxLen)
177
+ return singleLine;
178
+ return singleLine.slice(0, maxLen - 3) + "...";
179
+ }
180
+ /**
181
+ * Format a setting value for display.
182
+ * AI.SiteProfile values (which are stored as .md files) get a content-style
183
+ * summary: first meaningful line + line count. All other keys use the normal
184
+ * short truncation.
185
+ */
186
+ export function formatSettingValue(key, value) {
187
+ if (!value && value !== "")
188
+ return "(not set)";
189
+ if (value === "")
190
+ return "(empty)";
191
+ if (!key.startsWith(AI_SITEPROFILE_PREFIX)) {
192
+ return truncateValue(value);
193
+ }
194
+ // AI.SiteProfile: summarise like a text file
195
+ const lines = value.split(/\r?\n/);
196
+ const lineCount = lines.length;
197
+ // Pick the first non-empty, non-heading line as a preview
198
+ const preview = lines.find((l) => l.trim() !== "" && !l.startsWith("#"))?.trim() ||
199
+ lines.find((l) => l.trim() !== "")?.trim() ||
200
+ "";
201
+ const shortPreview = preview.length > 40 ? preview.slice(0, 37) + "..." : preview;
202
+ if (lineCount <= 1)
203
+ return shortPreview;
204
+ return `${shortPreview} (${lineCount} lines)`;
205
+ }
206
+ /**
207
+ * Format a diff description for a modified AI.SiteProfile setting.
208
+ * Returns e.g. "3 lines → 47 lines" or the normal "old" → "new" for short values.
209
+ */
210
+ export function formatSettingDiff(key, remoteValue, localValue) {
211
+ if (!key.startsWith(AI_SITEPROFILE_PREFIX)) {
212
+ return `"${truncateValue(remoteValue || '')}" → "${truncateValue(localValue || '')}"`;
213
+ }
214
+ const remoteLines = (remoteValue || "").split(/\r?\n/).length;
215
+ const localLines = (localValue || "").split(/\r?\n/).length;
216
+ if (remoteLines === localLines) {
217
+ return `content changed (${localLines} line${localLines !== 1 ? "s" : ""})`;
218
+ }
219
+ return `${remoteLines} line${remoteLines !== 1 ? "s" : ""} → ${localLines} line${localLines !== 1 ? "s" : ""}`;
220
+ }
221
+ /**
222
+ * Render a colored line-by-line diff for an AI.SiteProfile setting.
223
+ * For non-AI settings this is a no-op (returns false).
224
+ *
225
+ * @param indent Leading whitespace for each printed line
226
+ * @returns true if a diff was rendered, false if skipped
227
+ */
228
+ export function renderSettingDiffPreview(key, remoteValue, localValue, indent = " ") {
229
+ if (!key.startsWith(AI_SITEPROFILE_PREFIX))
230
+ return false;
231
+ const oldText = remoteValue || "";
232
+ const newText = localValue || "";
233
+ const diff = Diff.diffLines(oldText, newText);
234
+ let addedLines = 0;
235
+ let removedLines = 0;
236
+ let unchangedLines = 0;
237
+ let previewLines = 0;
238
+ const maxPreviewLines = 8;
239
+ for (const part of diff) {
240
+ const lines = part.value.split("\n").filter((l) => l.trim() !== "");
241
+ if (part.added) {
242
+ addedLines += lines.length;
243
+ if (previewLines < maxPreviewLines) {
244
+ for (const line of lines.slice(0, maxPreviewLines - previewLines)) {
245
+ colorConsole.log(`${indent}${diffColors.added(`+ ${line}`)}`);
246
+ previewLines++;
247
+ }
248
+ }
249
+ }
250
+ else if (part.removed) {
251
+ removedLines += lines.length;
252
+ if (previewLines < maxPreviewLines) {
253
+ for (const line of lines.slice(0, maxPreviewLines - previewLines)) {
254
+ colorConsole.log(`${indent}${diffColors.removed(`- ${line}`)}`);
255
+ previewLines++;
256
+ }
257
+ }
258
+ }
259
+ else {
260
+ unchangedLines += lines.length;
261
+ }
262
+ if (previewLines >= maxPreviewLines)
263
+ break;
264
+ }
265
+ const remaining = addedLines + removedLines - previewLines;
266
+ if (remaining > 0) {
267
+ colorConsole.log(`${indent}${colorConsole.gray(`... (${remaining} more change${remaining !== 1 ? "s" : ""})`)}`);
268
+ }
269
+ colorConsole.log(`${indent}${colorConsole.green(`+${addedLines}`)} added, ${colorConsole.red(`-${removedLines}`)} removed, ${unchangedLines} unchanged`);
270
+ return true;
271
+ }
272
+ //# sourceMappingURL=push-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-settings.js","sourceRoot":"","sources":["../../src/scripts/push-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * LeadCMS Settings Management
3
+ *
4
+ * Handles fetching, saving, reading, comparing, and pushing CMS settings.
5
+ * Settings are stored locally as:
6
+ * - ai-siteprofile/*.md (one file per AI.SiteProfile.* key)
7
+ * - content.json (all Content.* keys grouped)
8
+ * - media.json (all Media.* keys grouped)
9
+ *
10
+ * Language-specific settings go into locale subdirectories.
11
+ */
12
+ import { type SettingDetailsDto, type SettingImportResult, type LocalSettingValue, type SettingsStatusResult, type SettingPushOperation } from "../lib/settings-types.js";
13
+ /**
14
+ * Fetch all settings from the CMS via /api/settings/export
15
+ */
16
+ export declare function fetchRemoteSettings(leadCMSUrl: string, leadCMSApiKey: string): Promise<SettingDetailsDto[]>;
17
+ /**
18
+ * Filter remote settings to only tracked keys.
19
+ * Also filters out settings with null/empty values.
20
+ */
21
+ export declare function filterTrackedSettings(settings: SettingDetailsDto[]): SettingDetailsDto[];
22
+ /**
23
+ * Save fetched settings to the local settings directory.
24
+ *
25
+ * @param settings - Tracked settings from the CMS
26
+ * @param settingsDir - Resolved path to the settings directory
27
+ * @param defaultLanguage - The project's default language
28
+ * @param targetName - Optional: only save settings matching this key name
29
+ */
30
+ export declare function saveSettingsLocally(settings: SettingDetailsDto[], settingsDir: string, defaultLanguage: string, targetName?: string): Promise<void>;
31
+ /**
32
+ * Read all locally stored settings from the settings directory.
33
+ *
34
+ * @param settingsDir - Resolved path to the settings directory
35
+ * @param defaultLanguage - The project's default language
36
+ * @returns Array of local setting values with their keys and languages
37
+ */
38
+ export declare function readLocalSettings(settingsDir: string, defaultLanguage: string): Promise<LocalSettingValue[]>;
39
+ /**
40
+ * Build a comparison between local and remote settings.
41
+ * Only includes tracked settings.
42
+ */
43
+ export declare function buildSettingsStatus(localSettings: LocalSettingValue[], remoteSettings: SettingDetailsDto[]): SettingsStatusResult;
44
+ /**
45
+ * Determine what push operations are needed.
46
+ */
47
+ export declare function buildSettingsPushOperations(localSettings: LocalSettingValue[], remoteSettings: SettingDetailsDto[]): SettingPushOperation[];
48
+ /**
49
+ * Push local settings to the CMS via /api/settings/import
50
+ */
51
+ export declare function pushSettingsToRemote(operations: SettingPushOperation[], leadCMSUrl: string, leadCMSApiKey: string, dryRun?: boolean): Promise<SettingImportResult | null>;
52
+ //# sourceMappingURL=settings-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-manager.d.ts","sourceRoot":"","sources":["../../src/scripts/settings-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EAEtB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAS1B,MAAM,0BAA0B,CAAC;AAQlC;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmB9B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAMxF;AAID;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAyBf;AA4ID;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6B9B;AAiED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,iBAAiB,EAAE,EAClC,cAAc,EAAE,iBAAiB,EAAE,GAClC,oBAAoB,CA4EtB;AAID;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,iBAAiB,EAAE,EAClC,cAAc,EAAE,iBAAiB,EAAE,GAClC,oBAAoB,EAAE,CA8CxB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,oBAAoB,EAAE,EAClC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAwCrC"}