@localheroai/cli 0.0.5 → 0.0.7

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 (116) hide show
  1. package/{README → README.md} +28 -10
  2. package/dist/api/auth.d.ts +2 -0
  3. package/dist/api/auth.js +28 -0
  4. package/dist/api/auth.js.map +1 -0
  5. package/dist/api/client.d.ts +3 -0
  6. package/dist/api/client.js +80 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/imports.d.ts +5 -0
  9. package/dist/api/imports.js +43 -0
  10. package/dist/api/imports.js.map +1 -0
  11. package/dist/api/projects.d.ts +2 -0
  12. package/dist/api/projects.js +42 -0
  13. package/dist/api/projects.js.map +1 -0
  14. package/dist/api/translations.d.ts +15 -0
  15. package/dist/api/translations.js +71 -0
  16. package/dist/api/translations.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +79 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/commands/_sync.js +22 -0
  21. package/dist/commands/_sync.js.map +1 -0
  22. package/dist/commands/_translate.js +3 -0
  23. package/dist/commands/_translate.js.map +1 -0
  24. package/dist/commands/init.d.ts +1 -0
  25. package/dist/commands/init.js +439 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/login.d.ts +16 -0
  28. package/dist/commands/login.js +58 -0
  29. package/dist/commands/login.js.map +1 -0
  30. package/dist/commands/pull.js +22 -0
  31. package/dist/commands/pull.js.map +1 -0
  32. package/dist/commands/push.js +56 -0
  33. package/dist/commands/push.js.map +1 -0
  34. package/dist/commands/sync.d.ts +20 -0
  35. package/dist/commands/sync.js +22 -0
  36. package/dist/commands/sync.js.map +1 -0
  37. package/dist/commands/translate.d.ts +14 -0
  38. package/dist/commands/translate.js +152 -0
  39. package/dist/commands/translate.js.map +1 -0
  40. package/dist/index.d.ts +5 -0
  41. package/dist/index.js +8 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types/index.d.ts +75 -0
  44. package/dist/types/index.js +17 -0
  45. package/dist/types/index.js.map +1 -0
  46. package/dist/types/translate/index.js +2 -0
  47. package/dist/types/translate/index.js.map +1 -0
  48. package/dist/utils/auth.d.ts +2 -0
  49. package/dist/utils/auth.js +29 -0
  50. package/dist/utils/auth.js.map +1 -0
  51. package/dist/utils/common.js +9 -0
  52. package/dist/utils/common.js.map +1 -0
  53. package/dist/utils/config.d.ts +23 -0
  54. package/dist/utils/config.js +137 -0
  55. package/dist/utils/config.js.map +1 -0
  56. package/dist/utils/errors.js +37 -0
  57. package/dist/utils/errors.js.map +1 -0
  58. package/dist/utils/files.d.ts +32 -0
  59. package/dist/utils/files.js +355 -0
  60. package/dist/utils/files.js.map +1 -0
  61. package/dist/utils/git.d.ts +21 -0
  62. package/dist/utils/git.js +87 -0
  63. package/dist/utils/git.js.map +1 -0
  64. package/dist/utils/github.d.ts +241 -0
  65. package/dist/utils/github.js +161 -0
  66. package/dist/utils/github.js.map +1 -0
  67. package/dist/utils/import-service.d.ts +4 -0
  68. package/dist/utils/import-service.js +218 -0
  69. package/dist/utils/import-service.js.map +1 -0
  70. package/dist/utils/prompt-service.d.ts +44 -0
  71. package/dist/utils/prompt-service.js +104 -0
  72. package/dist/utils/prompt-service.js.map +1 -0
  73. package/dist/utils/sync-service.d.ts +58 -0
  74. package/dist/utils/sync-service.js +159 -0
  75. package/dist/utils/sync-service.js.map +1 -0
  76. package/dist/utils/translation-processor.js +197 -0
  77. package/dist/utils/translation-processor.js.map +1 -0
  78. package/dist/utils/translation-updater/common.d.ts +6 -0
  79. package/{src → dist}/utils/translation-updater/common.js +16 -10
  80. package/dist/utils/translation-updater/common.js.map +1 -0
  81. package/dist/utils/translation-updater/index.d.ts +5 -0
  82. package/{src → dist}/utils/translation-updater/index.js +21 -9
  83. package/dist/utils/translation-updater/index.js.map +1 -0
  84. package/dist/utils/translation-updater/json-handler.d.ts +5 -0
  85. package/dist/utils/translation-updater/json-handler.js +123 -0
  86. package/dist/utils/translation-updater/json-handler.js.map +1 -0
  87. package/dist/utils/translation-updater/yaml-handler.d.ts +5 -0
  88. package/dist/utils/translation-updater/yaml-handler.js +193 -0
  89. package/dist/utils/translation-updater/yaml-handler.js.map +1 -0
  90. package/dist/utils/translation-utils.d.ts +30 -0
  91. package/dist/utils/translation-utils.js +334 -0
  92. package/dist/utils/translation-utils.js.map +1 -0
  93. package/dist/utils/updater.js +38 -0
  94. package/dist/utils/updater.js.map +1 -0
  95. package/package.json +26 -26
  96. package/src/api/auth.js +0 -24
  97. package/src/api/client.js +0 -83
  98. package/src/api/imports.js +0 -22
  99. package/src/api/projects.js +0 -24
  100. package/src/api/translations.js +0 -58
  101. package/src/cli.js +0 -78
  102. package/src/commands/init.js +0 -485
  103. package/src/commands/login.js +0 -80
  104. package/src/commands/sync.js +0 -28
  105. package/src/commands/translate.js +0 -267
  106. package/src/utils/auth.js +0 -23
  107. package/src/utils/config.js +0 -125
  108. package/src/utils/files.js +0 -381
  109. package/src/utils/git.js +0 -72
  110. package/src/utils/github.js +0 -128
  111. package/src/utils/import-service.js +0 -128
  112. package/src/utils/prompt-service.js +0 -67
  113. package/src/utils/sync-service.js +0 -147
  114. package/src/utils/translation-updater/json-handler.js +0 -111
  115. package/src/utils/translation-updater/yaml-handler.js +0 -207
  116. package/src/utils/translation-utils.js +0 -278
@@ -0,0 +1,355 @@
1
+ import chalk from 'chalk';
2
+ import { glob } from 'glob';
3
+ import { readFile } from 'fs/promises';
4
+ import path from 'path';
5
+ import yaml from 'yaml';
6
+ import { promises as fs } from 'fs';
7
+ /**
8
+ * Parse file content based on format
9
+ */
10
+ export function parseFile(content, format, filePath = '') {
11
+ try {
12
+ if (format === 'json') {
13
+ try {
14
+ return JSON.parse(content);
15
+ }
16
+ catch (jsonError) {
17
+ const errorInfo = jsonError.message.match(/at position (\d+)/)
18
+ ? jsonError.message
19
+ : `${jsonError.message} (check for missing commas, quotes, or brackets)`;
20
+ throw new Error(errorInfo);
21
+ }
22
+ }
23
+ return yaml.parse(content);
24
+ }
25
+ catch (error) {
26
+ const location = filePath ? ` in ${filePath}` : '';
27
+ throw new Error(`Failed to parse ${format} file${location}: ${error.message}`);
28
+ }
29
+ }
30
+ /**
31
+ * Extract locale from file path
32
+ */
33
+ function extractLocaleFromPath(filePath, localeRegex, knownLocales = []) {
34
+ if (knownLocales && knownLocales.length > 0) {
35
+ const basename = path.basename(filePath, path.extname(filePath));
36
+ const foundLocaleInFilename = knownLocales.find(locale => locale && basename.toLowerCase() === locale.toLowerCase());
37
+ if (foundLocaleInFilename) {
38
+ return foundLocaleInFilename.toLowerCase();
39
+ }
40
+ // Then try to match in the path
41
+ const pathParts = filePath.toLowerCase().split(path.sep);
42
+ const foundLocaleInPath = knownLocales.find(locale => locale && pathParts.includes(locale.toLowerCase()));
43
+ if (foundLocaleInPath) {
44
+ return foundLocaleInPath.toLowerCase();
45
+ }
46
+ }
47
+ const dirName = path.basename(path.dirname(filePath));
48
+ if (dirName && isValidLocale(dirName)) {
49
+ return dirName.toLowerCase();
50
+ }
51
+ if (localeRegex) {
52
+ const filename = path.basename(filePath);
53
+ const regexPattern = new RegExp(localeRegex);
54
+ const regexMatch = filename.match(regexPattern);
55
+ if (regexMatch && regexMatch[1]) {
56
+ const locale = regexMatch[1].toLowerCase();
57
+ if (isValidLocale(locale)) {
58
+ return locale;
59
+ }
60
+ }
61
+ }
62
+ throw new Error(`Could not extract locale from path: ${filePath}`);
63
+ }
64
+ /**
65
+ * Check if locale is valid
66
+ */
67
+ export function isValidLocale(locale) {
68
+ // Basic validation for language code (2 letters) or language-region code (e.g., en-US or en-us)
69
+ // Case insensitive for better compatibility with existing code
70
+ return /^[a-zA-Z]{2}(?:-[a-zA-Z]{2})?$/.test(locale);
71
+ }
72
+ /**
73
+ * Flatten a nested object into dot notation
74
+ * Handles null/undefined values by returning an empty object
75
+ */
76
+ export function flattenTranslations(obj, parentKey = '') {
77
+ const result = {};
78
+ if (!obj) {
79
+ return result;
80
+ }
81
+ for (const [key, value] of Object.entries(obj)) {
82
+ const newKey = parentKey ? `${parentKey}.${key}` : key;
83
+ if (value === null || value === undefined) {
84
+ result[newKey] = value;
85
+ }
86
+ else if (typeof value === 'object' && !Array.isArray(value)) {
87
+ Object.assign(result, flattenTranslations(value, newKey));
88
+ }
89
+ else {
90
+ result[newKey] = value;
91
+ }
92
+ }
93
+ return result;
94
+ }
95
+ /**
96
+ * Detect the format of a JSON translation file
97
+ */
98
+ export function detectJsonFormat(obj) {
99
+ let hasNested = false;
100
+ let hasDotNotation = false;
101
+ for (const [key, value] of Object.entries(obj)) {
102
+ if (key.includes('.')) {
103
+ hasDotNotation = true;
104
+ }
105
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
106
+ hasNested = true;
107
+ for (const [, nestedValue] of Object.entries(value)) {
108
+ if (nestedValue && typeof nestedValue === 'object' && !Array.isArray(nestedValue)) {
109
+ return 'nested';
110
+ }
111
+ }
112
+ }
113
+ }
114
+ if (hasNested && hasDotNotation) {
115
+ return 'mixed';
116
+ }
117
+ else if (hasNested) {
118
+ return 'nested';
119
+ }
120
+ else if (hasDotNotation) {
121
+ return 'flat';
122
+ }
123
+ return 'flat';
124
+ }
125
+ /**
126
+ * Convert a flattened object back to nested structure
127
+ */
128
+ export function unflattenTranslations(flatObj) {
129
+ const result = {};
130
+ for (const [key, value] of Object.entries(flatObj)) {
131
+ const keys = key.split('.');
132
+ let current = result;
133
+ for (let i = 0; i < keys.length - 1; i++) {
134
+ const k = keys[i];
135
+ current[k] = current[k] || {};
136
+ current = current[k];
137
+ }
138
+ current[keys[keys.length - 1]] = value;
139
+ }
140
+ return result;
141
+ }
142
+ /**
143
+ * Preserve the original structure of a JSON object when adding new translations
144
+ */
145
+ export function preserveJsonStructure(originalObj, newTranslations, format) {
146
+ if (format === 'flat') {
147
+ return { ...originalObj, ...newTranslations };
148
+ }
149
+ if (format === 'nested') {
150
+ const merged = { ...originalObj };
151
+ const unflattenedNew = unflattenTranslations(newTranslations);
152
+ return deepMerge(merged, unflattenedNew);
153
+ }
154
+ const result = { ...originalObj };
155
+ for (const [key, value] of Object.entries(newTranslations)) {
156
+ if (key.includes('.')) {
157
+ const keys = key.split('.');
158
+ if (originalObj[key] !== undefined) {
159
+ result[key] = value;
160
+ continue;
161
+ }
162
+ let current = result;
163
+ for (let i = 0; i < keys.length - 1; i++) {
164
+ const k = keys[i];
165
+ current[k] = current[k] || {};
166
+ if (typeof current[k] !== 'object' || Array.isArray(current[k])) {
167
+ current[k] = {};
168
+ }
169
+ current = current[k];
170
+ }
171
+ current[keys[keys.length - 1]] = value;
172
+ }
173
+ else {
174
+ result[key] = value;
175
+ }
176
+ }
177
+ return result;
178
+ }
179
+ /**
180
+ * Deep merge two objects
181
+ */
182
+ function deepMerge(target, source) {
183
+ const result = { ...target };
184
+ for (const [key, value] of Object.entries(source)) {
185
+ if (value && typeof value === 'object' &&
186
+ result[key] && typeof result[key] === 'object' &&
187
+ !Array.isArray(value) && !Array.isArray(result[key])) {
188
+ result[key] = deepMerge(result[key], value);
189
+ }
190
+ else {
191
+ result[key] = value;
192
+ }
193
+ }
194
+ return result;
195
+ }
196
+ /**
197
+ * Extract namespace from file path
198
+ */
199
+ function extractNamespace(filePath) {
200
+ const fileName = path.basename(filePath, path.extname(filePath));
201
+ const dirName = path.basename(path.dirname(filePath));
202
+ // Pattern 1: /path/to/en/common.json -> namespace = common
203
+ if (/^[a-z]{2}(-[A-Z]{2})?$/.test(dirName)) {
204
+ return fileName;
205
+ }
206
+ // Pattern 2: /path/to/messages.en.json -> namespace = messages
207
+ const dotMatch = fileName.match(/^(.+)\.([a-z]{2}(?:-[A-Z]{2})?)$/);
208
+ if (dotMatch) {
209
+ return dotMatch[1];
210
+ }
211
+ // Pattern 3: /path/to/common-en.json -> namespace = common
212
+ const dashMatch = fileName.match(/^(.+)-([a-z]{2}(?:-[A-Z]{2})?)$/);
213
+ if (dashMatch) {
214
+ return dashMatch[1];
215
+ }
216
+ return '';
217
+ }
218
+ /**
219
+ * Find and process translation files based on configuration
220
+ */
221
+ export async function findTranslationFiles(config, options = {}) {
222
+ const { parseContent = true, includeContent = true, extractKeys = true, basePath = process.cwd(), sourceLocale = config.sourceLocale, targetLocales = config.outputLocales || [], includeNamespace = false, verbose = false, returnFullResult = false } = options;
223
+ const knownLocales = [sourceLocale, ...targetLocales];
224
+ const { translationFiles } = config;
225
+ const { paths = [], pattern = '**/*.{json,yml,yaml}', ignore = [], localeRegex = '.*?([a-z]{2}(?:-[A-Z]{2})?)\\.(?:yml|yaml|json)$' } = translationFiles || {};
226
+ const processedFiles = [];
227
+ for (const translationPath of paths) {
228
+ const fullPath = path.join(basePath, translationPath);
229
+ const globPattern = path.join(fullPath, pattern);
230
+ if (verbose) {
231
+ console.log(chalk.blue(`Searching for translation files in ${globPattern}`));
232
+ }
233
+ let files;
234
+ try {
235
+ files = await glob(globPattern, {
236
+ ignore: ignore.map(i => path.join(basePath, i)),
237
+ absolute: false
238
+ });
239
+ if (verbose) {
240
+ console.log(chalk.blue(`Found ${files.length} files in ${translationPath}`));
241
+ }
242
+ }
243
+ catch (error) {
244
+ if (verbose) {
245
+ console.error(chalk.red(`Error searching for files in ${translationPath}: ${error.message}`));
246
+ }
247
+ files = [];
248
+ }
249
+ for (const file of files) {
250
+ try {
251
+ const filePath = file;
252
+ const format = path.extname(file).slice(1);
253
+ const locale = extractLocaleFromPath(file, localeRegex, knownLocales);
254
+ const result = {
255
+ path: filePath,
256
+ format,
257
+ locale
258
+ };
259
+ if (parseContent) {
260
+ const content = await readFile(filePath, 'utf8');
261
+ const parsedContent = parseFile(content, format, filePath);
262
+ if (includeContent) {
263
+ result.content = Buffer.from(content).toString('base64');
264
+ }
265
+ if (extractKeys) {
266
+ const hasLanguageWrapper = parsedContent && parsedContent[locale] !== undefined;
267
+ result.hasLanguageWrapper = hasLanguageWrapper;
268
+ const translationData = hasLanguageWrapper ? (parsedContent[locale] || {}) : (parsedContent || {});
269
+ result.translations = translationData;
270
+ const flattened = flattenTranslations(translationData);
271
+ // @ts-expect-error - Keep original behavior for test compatibility
272
+ result.keys = flattened;
273
+ }
274
+ }
275
+ if (includeNamespace) {
276
+ result.namespace = extractNamespace(filePath);
277
+ }
278
+ processedFiles.push(result);
279
+ }
280
+ catch (error) {
281
+ if (error.message.includes('Failed to parse') ||
282
+ error.message.includes('JSON') ||
283
+ error.message.includes('Unexpected token') ||
284
+ error.message.includes('Missing closing')) {
285
+ console.warn(chalk.yellow(`\nWarning: ${error.message}`));
286
+ const format = path.extname(file).slice(1);
287
+ if (format === 'json') {
288
+ console.warn(chalk.gray(' Tip: Check for missing commas, quotes, or brackets in your JSON file.'));
289
+ }
290
+ else if (format === 'yml' || format === 'yaml') {
291
+ console.warn(chalk.gray(' Tip: Check for proper indentation and quote matching in your YAML file.'));
292
+ }
293
+ }
294
+ else if (verbose) {
295
+ console.warn(chalk.yellow(`Warning: ${error.message}`));
296
+ console.error(chalk.dim(error.stack));
297
+ }
298
+ }
299
+ }
300
+ }
301
+ if (!returnFullResult) {
302
+ return processedFiles;
303
+ }
304
+ const allFiles = processedFiles;
305
+ const sourceFiles = allFiles.filter(file => file.locale === sourceLocale);
306
+ const targetFilesByLocale = {};
307
+ for (const locale of targetLocales) {
308
+ targetFilesByLocale[locale] = allFiles.filter(file => file.locale === locale);
309
+ }
310
+ return {
311
+ allFiles,
312
+ sourceFiles,
313
+ targetFilesByLocale
314
+ };
315
+ }
316
+ /**
317
+ * Check if a directory exists
318
+ */
319
+ export async function directoryExists(dirPath, fsModule = fs) {
320
+ try {
321
+ const stats = await fsModule.stat(dirPath);
322
+ return stats.isDirectory();
323
+ }
324
+ catch (error) {
325
+ if (error.code === 'ENOENT') {
326
+ return false;
327
+ }
328
+ throw error;
329
+ }
330
+ }
331
+ /**
332
+ * Find the first existing path from a list of paths
333
+ */
334
+ export async function findFirstExistingPath(paths, fsModule = fs) {
335
+ for (const path of paths) {
336
+ if (await directoryExists(path, fsModule)) {
337
+ return path;
338
+ }
339
+ }
340
+ return null;
341
+ }
342
+ export async function getDirectoryContents(dir, fsModule = fs) {
343
+ try {
344
+ const files = await fsModule.readdir(dir);
345
+ return {
346
+ files,
347
+ jsonFiles: files.filter(f => f.endsWith('.json')),
348
+ yamlFiles: files.filter(f => f.endsWith('.yml') || f.endsWith('.yaml'))
349
+ };
350
+ }
351
+ catch {
352
+ return null;
353
+ }
354
+ }
355
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ interface ExecResult {
4
+ stdout: string;
5
+ stderr: string;
6
+ }
7
+ interface GitDependencies {
8
+ fs: typeof fs;
9
+ path: typeof path;
10
+ exec: (file: string, args: string[]) => Promise<ExecResult>;
11
+ }
12
+ interface GitService {
13
+ deps: GitDependencies;
14
+ setDependencies: (customDeps?: Partial<GitDependencies>) => GitService;
15
+ updateGitignore: (basePath: string) => Promise<boolean>;
16
+ getCurrentBranch: () => Promise<string | null>;
17
+ }
18
+ export declare const gitService: GitService;
19
+ export declare function updateGitignore(basePath: string): Promise<boolean>;
20
+ export declare function getCurrentBranch(): Promise<string | null>;
21
+ export {};
@@ -0,0 +1,87 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import { promisify } from 'util';
4
+ import { execFile } from 'child_process';
5
+ const execFileAsync = promisify(execFile);
6
+ const defaultDeps = {
7
+ fs,
8
+ path,
9
+ exec: execFileAsync,
10
+ };
11
+ export const gitService = {
12
+ deps: { ...defaultDeps },
13
+ /**
14
+ * Set custom dependencies for testing
15
+ */
16
+ setDependencies(customDeps = {}) {
17
+ this.deps = { ...defaultDeps, ...customDeps };
18
+ return this;
19
+ },
20
+ /**
21
+ * Add .localhero_key to .gitignore file
22
+ * @param basePath Base path to project
23
+ * @returns Boolean indicating if the file was updated
24
+ */
25
+ async updateGitignore(basePath) {
26
+ const { fs, path } = this.deps;
27
+ const gitignorePath = path.join(basePath, '.gitignore');
28
+ let content = '';
29
+ try {
30
+ content = await fs.readFile(gitignorePath, 'utf8');
31
+ }
32
+ catch (error) {
33
+ if (error.code !== 'ENOENT') {
34
+ return false;
35
+ }
36
+ }
37
+ if (content.includes('.localhero_key')) {
38
+ return false;
39
+ }
40
+ try {
41
+ await fs.appendFile(gitignorePath, '\n.localhero_key\n');
42
+ return true;
43
+ }
44
+ catch (error) {
45
+ if (error.code === 'ENOENT') {
46
+ try {
47
+ await fs.writeFile(gitignorePath, '.localhero_key\n');
48
+ return true;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ return false;
55
+ }
56
+ },
57
+ /**
58
+ * Get the current git branch name
59
+ * @returns Current branch name or null if not in a git repository
60
+ */
61
+ async getCurrentBranch() {
62
+ try {
63
+ const { exec } = this.deps;
64
+ const { stdout } = await exec('git', ['rev-parse', '--abbrev-ref', 'HEAD']);
65
+ return stdout.trim();
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ };
72
+ /**
73
+ * Add .localhero_key to .gitignore file
74
+ * @param basePath Base path to project
75
+ * @returns Boolean indicating if the file was updated
76
+ */
77
+ export async function updateGitignore(basePath) {
78
+ return gitService.updateGitignore(basePath);
79
+ }
80
+ /**
81
+ * Get the current git branch name
82
+ * @returns Current branch name or null if not in a git repository
83
+ */
84
+ export async function getCurrentBranch() {
85
+ return gitService.getCurrentBranch();
86
+ }
87
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,WAAW,GAAoB;IACnC,EAAE;IACF,IAAI;IACJ,IAAI,EAAE,aAAa;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,EAAE,GAAG,WAAW,EAAE;IAExB;;OAEG;IACH,eAAe,CAAC,aAAuC,EAAE;QACvD,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,UAAU,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;oBACtD,OAAO,IAAI,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,OAAO,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,UAAU,CAAC,gBAAgB,EAAE,CAAC;AACvC,CAAC"}