@nlabs/lex 1.49.4 → 1.50.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 (55) hide show
  1. package/.swcrc +35 -0
  2. package/README.md +43 -59
  3. package/__mocks__/chalk.js +19 -17
  4. package/config.json +32 -8
  5. package/examples/lex.config.js +110 -10
  6. package/index.cjs +1 -5
  7. package/lex.config.js +34 -7
  8. package/lib/Button.stories.js +99 -0
  9. package/lib/LexConfig.d.ts +60 -22
  10. package/lib/LexConfig.js +285 -244
  11. package/lib/commands/ai/ai.js +287 -288
  12. package/lib/commands/ai/index.js +8 -7
  13. package/lib/commands/build/build.d.ts +2 -2
  14. package/lib/commands/build/build.js +349 -458
  15. package/lib/commands/clean/clean.js +45 -33
  16. package/lib/commands/compile/compile.js +214 -227
  17. package/lib/commands/config/config.js +46 -42
  18. package/lib/commands/copy/copy.js +36 -35
  19. package/lib/commands/create/create.js +200 -121
  20. package/lib/commands/dev/dev.d.ts +2 -0
  21. package/lib/commands/dev/dev.js +259 -263
  22. package/lib/commands/init/init.js +108 -88
  23. package/lib/commands/link/link.js +18 -14
  24. package/lib/commands/lint/lint.js +735 -742
  25. package/lib/commands/migrate/migrate.js +49 -36
  26. package/lib/commands/publish/publish.js +116 -96
  27. package/lib/commands/serverless/serverless.js +611 -585
  28. package/lib/commands/storybook/storybook.js +242 -238
  29. package/lib/commands/test/test.d.ts +1 -1
  30. package/lib/commands/test/test.js +382 -394
  31. package/lib/commands/update/update.js +141 -120
  32. package/lib/commands/upgrade/upgrade.js +51 -44
  33. package/lib/commands/versions/versions.d.ts +1 -1
  34. package/lib/commands/versions/versions.js +36 -38
  35. package/lib/create/changelog.js +136 -125
  36. package/lib/index.js +40 -38
  37. package/lib/lex.js +95 -68
  38. package/lib/storybook/index.js +6 -1
  39. package/lib/test-react/index.js +7 -84
  40. package/lib/types.d.ts +1 -1
  41. package/lib/types.js +7 -1
  42. package/lib/utils/aiService.js +240 -227
  43. package/lib/utils/app.js +274 -273
  44. package/lib/utils/deepMerge.js +37 -23
  45. package/lib/utils/file.js +218 -215
  46. package/lib/utils/log.js +29 -27
  47. package/lib/utils/reactShim.js +7 -85
  48. package/lib/utils/translations.js +91 -65
  49. package/package.json +63 -64
  50. package/templates/typescript/DataLayer.js.txt +218 -0
  51. package/templates/typescript/DataLayer.test.js.txt +268 -0
  52. package/templates/typescript/DataLayer.test.ts.txt +269 -0
  53. package/templates/typescript/DataLayer.ts.txt +227 -0
  54. package/webpack.config.js +53 -26
  55. package/lib/commands/lint/autofix.d.ts +0 -2
package/lib/utils/app.js CHANGED
@@ -1,296 +1,297 @@
1
- import boxen from "boxen";
2
- import chalk from "chalk";
3
- import { copyFile, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "fs";
4
- import { sync as globSync } from "glob";
5
- import isEmpty from "lodash/isEmpty.js";
6
- import ora from "ora";
7
- import { basename as pathBasename, join as pathJoin, relative as pathRelative, resolve as pathResolve } from "path";
8
- import { rimrafSync } from "rimraf";
9
- import { log } from "./log.js";
10
- const cwd = process.cwd();
11
- const getFilenames = (props) => {
12
- const { callback, cliName, name, quiet, type, useTypescript } = props;
13
- let nameCaps;
14
- const itemTypes = ["stores", "views"];
15
- if (!name) {
16
- if (itemTypes.includes(type)) {
17
- log(`
18
- ${cliName} Error: ${type} name is required. Please use 'lex -h' for options.`, "error", quiet);
19
- return callback?.(1);
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import boxen from 'boxen';
5
+ import chalk from 'chalk';
6
+ import { copyFile, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs';
7
+ import { sync as globSync } from 'glob';
8
+ import isEmpty from 'lodash/isEmpty.js';
9
+ import ora from 'ora';
10
+ import { basename as pathBasename, join as pathJoin, relative as pathRelative, resolve as pathResolve } from 'path';
11
+ import { rimrafSync } from 'rimraf';
12
+ import { log } from './log.js';
13
+ export const cwd = process.cwd();
14
+ export const getFilenames = (props)=>{
15
+ const { callback, cliName, name, quiet, type, useTypescript } = props;
16
+ let nameCaps;
17
+ const itemTypes = [
18
+ 'stores',
19
+ 'views'
20
+ ];
21
+ if (!name) {
22
+ if (itemTypes.includes(type)) {
23
+ log(`\n${cliName} Error: ${type} name is required. Please use 'lex -h' for options.`, 'error', quiet);
24
+ return callback?.(1);
25
+ }
26
+ } else {
27
+ nameCaps = `${name.charAt(0).toUpperCase()}${name.substr(1)}`;
28
+ }
29
+ log(`${cliName} adding ${name} ${type}...`, 'info', quiet);
30
+ let templatePath;
31
+ let templateExt;
32
+ let templateReact;
33
+ if (useTypescript) {
34
+ templatePath = '../../templates/typescript';
35
+ templateExt = '.ts';
36
+ templateReact = '.tsx';
37
+ } else {
38
+ templatePath = '../../templates/flow';
39
+ templateExt = '.js';
40
+ templateReact = '.js';
20
41
  }
21
- } else {
22
- nameCaps = `${name.charAt(0).toUpperCase()}${name.substr(1)}`;
23
- }
24
- log(`${cliName} adding ${name} ${type}...`, "info", quiet);
25
- let templatePath;
26
- let templateExt;
27
- let templateReact;
28
- if (useTypescript) {
29
- templatePath = "../../templates/typescript";
30
- templateExt = ".ts";
31
- templateReact = ".tsx";
32
- } else {
33
- templatePath = "../../templates/flow";
34
- templateExt = ".js";
35
- templateReact = ".js";
36
- }
37
- return {
38
- nameCaps,
39
- templateExt,
40
- templatePath,
41
- templateReact
42
- };
43
- };
44
- const createSpinner = (quiet = false) => {
45
- if (quiet) {
46
42
  return {
47
- fail: () => {
48
- },
49
- start: () => {
50
- },
51
- succeed: () => {
52
- }
43
+ nameCaps,
44
+ templateExt,
45
+ templatePath,
46
+ templateReact
53
47
  };
54
- }
55
- return ora({ color: "yellow" });
56
- };
57
- const createProgressBar = (percentage) => {
58
- const width = 20;
59
- const filled = Math.round(percentage / 100 * width);
60
- const empty = width - filled;
61
- const filledBar = chalk.cyan("\u2588").repeat(filled);
62
- const emptyBar = chalk.gray("\u2591").repeat(empty);
63
- return filledBar + emptyBar;
64
48
  };
65
- const handleWebpackProgress = (output, spinner, quiet, emoji, action) => {
66
- if (quiet) {
67
- return;
68
- }
69
- const progressMatch = output.match(/\[webpack\.Progress\] (\d+)%/);
70
- if (progressMatch) {
71
- const progress = parseInt(progressMatch[1], 10);
72
- const progressBar = createProgressBar(progress);
73
- spinner.text = `${emoji} ${action}: ${progressBar} ${progress}%`;
74
- } else if (output.includes("[webpack.Progress]")) {
75
- const generalProgressMatch = output.match(/(\d+)%/);
76
- if (generalProgressMatch) {
77
- const progress = parseInt(generalProgressMatch[1], 10);
78
- const progressBar = createProgressBar(progress);
79
- spinner.text = `${emoji} ${action}: ${progressBar} ${progress}%`;
49
+ export const createSpinner = (quiet = false)=>{
50
+ if (quiet) {
51
+ return {
52
+ fail: ()=>{},
53
+ start: ()=>{},
54
+ succeed: ()=>{}
55
+ };
80
56
  }
81
- }
57
+ return ora({
58
+ color: 'yellow'
59
+ });
82
60
  };
83
- const copyFiles = async (files, typeName, spinner, config) => {
84
- const { outputFullPath, sourceFullPath } = config;
85
- const items = files.map((fileName) => ({
86
- from: fileName,
87
- to: pathResolve(outputFullPath, pathRelative(sourceFullPath, fileName))
88
- }));
89
- try {
90
- spinner.start(`Copying ${typeName} files...`);
91
- await Promise.all(items.map(({ from, to }) => new Promise(
92
- (resolve, reject) => {
93
- mkdirSync(pathResolve(to, ".."), { recursive: true });
94
- return copyFile(from, to, (copyError) => {
95
- if (copyError) {
96
- reject();
97
- } else {
98
- resolve(true);
99
- }
100
- });
101
- }
102
- )));
103
- spinner.succeed(`Successfully copied ${files.length} ${typeName} files!`);
104
- } catch (error) {
105
- spinner.fail(`Copying of ${typeName} files failed.`);
106
- log(`Error: ${error.message}`, "error");
107
- log(error, "error");
108
- }
61
+ export const createProgressBar = (percentage)=>{
62
+ const width = 20;
63
+ const filled = Math.round(percentage / 100 * width);
64
+ const empty = width - filled;
65
+ const filledBar = chalk.cyan('█').repeat(filled);
66
+ const emptyBar = chalk.gray('░').repeat(empty);
67
+ return filledBar + emptyBar;
109
68
  };
110
- const copyConfiguredFiles = async (spinner, config, quiet) => {
111
- const { copyFiles: copyFilesConfig, outputFullPath, sourceFullPath, sourcePath } = config;
112
- if (!copyFilesConfig || copyFilesConfig.length === 0) {
113
- return;
114
- }
115
- try {
116
- spinner.start("Copying configured files...");
117
- let totalCopied = 0;
118
- const baseDir = sourceFullPath || (sourcePath ? pathResolve(cwd, sourcePath) : cwd);
119
- for (const pattern of copyFilesConfig) {
120
- const resolvedPattern = pathResolve(baseDir, pattern);
121
- const matchingFiles = globSync(resolvedPattern, {
122
- absolute: true,
123
- nodir: true
124
- });
125
- if (matchingFiles.length === 0) {
126
- if (!quiet) {
127
- log(`Warning: No files found matching pattern: ${pattern}`, "warn", quiet);
69
+ export const handleWebpackProgress = (output, spinner, quiet, emoji, action)=>{
70
+ if (quiet) {
71
+ return;
72
+ }
73
+ const progressMatch = output.match(/\[webpack\.Progress\] (\d+)%/);
74
+ if (progressMatch) {
75
+ const progress = parseInt(progressMatch[1], 10);
76
+ const progressBar = createProgressBar(progress);
77
+ spinner.text = `${emoji} ${action}: ${progressBar} ${progress}%`;
78
+ } else if (output.includes('[webpack.Progress]')) {
79
+ const generalProgressMatch = output.match(/(\d+)%/);
80
+ if (generalProgressMatch) {
81
+ const progress = parseInt(generalProgressMatch[1], 10);
82
+ const progressBar = createProgressBar(progress);
83
+ spinner.text = `${emoji} ${action}: ${progressBar} ${progress}%`;
128
84
  }
129
- continue;
130
- }
131
- for (const sourceFile of matchingFiles) {
132
- const relativePath = pathRelative(baseDir, sourceFile);
133
- const destPath = pathResolve(outputFullPath, relativePath);
134
- const destDir = pathResolve(destPath, "..");
135
- mkdirSync(destDir, { recursive: true });
136
- await new Promise((resolve, reject) => {
137
- copyFile(sourceFile, destPath, (copyError) => {
138
- if (copyError) {
139
- reject(copyError);
140
- } else {
141
- resolve(true);
142
- }
143
- });
144
- });
145
- totalCopied++;
146
- }
147
85
  }
148
- if (totalCopied > 0) {
149
- spinner.succeed(`Successfully copied ${totalCopied} configured files!`);
150
- } else {
151
- spinner.succeed("No configured files to copy");
86
+ };
87
+ export const copyFiles = async (files, typeName, spinner, config)=>{
88
+ const { outputFullPath, sourceFullPath } = config;
89
+ const items = files.map((fileName)=>({
90
+ from: fileName,
91
+ to: pathResolve(outputFullPath, pathRelative(sourceFullPath, fileName))
92
+ }));
93
+ try {
94
+ spinner.start(`Copying ${typeName} files...`);
95
+ await Promise.all(items.map(({ from, to })=>new Promise((resolve, reject)=>{
96
+ mkdirSync(pathResolve(to, '..'), {
97
+ recursive: true
98
+ });
99
+ return copyFile(from, to, (copyError)=>{
100
+ if (copyError) {
101
+ reject();
102
+ } else {
103
+ resolve(true);
104
+ }
105
+ });
106
+ })));
107
+ spinner.succeed(`Successfully copied ${files.length} ${typeName} files!`);
108
+ } catch (error) {
109
+ spinner.fail(`Copying of ${typeName} files failed.`);
110
+ log(`Error: ${error.message}`, 'error');
111
+ log(error, 'error');
152
112
  }
153
- } catch (error) {
154
- spinner.fail("Failed to copy configured files");
155
- log(`Error copying configured files: ${error.message}`, "error", quiet);
156
- throw error;
157
- }
158
113
  };
159
- const copyFileSync = (source, target) => {
160
- let targetFile = target;
161
- if (existsSync(target)) {
162
- if (lstatSync(target).isDirectory()) {
163
- targetFile = pathJoin(target, pathBasename(source));
114
+ export const copyConfiguredFiles = async (spinner, config, quiet)=>{
115
+ const { copyFiles: copyFilesConfig, outputFullPath, sourceFullPath, sourcePath } = config;
116
+ if (!copyFilesConfig || copyFilesConfig.length === 0) {
117
+ return;
118
+ }
119
+ try {
120
+ spinner.start('Copying configured files...');
121
+ let totalCopied = 0;
122
+ const baseDir = sourceFullPath || (sourcePath ? pathResolve(cwd, sourcePath) : cwd);
123
+ for (const pattern of copyFilesConfig){
124
+ const resolvedPattern = pathResolve(baseDir, pattern);
125
+ const matchingFiles = globSync(resolvedPattern, {
126
+ absolute: true,
127
+ nodir: true
128
+ });
129
+ if (matchingFiles.length === 0) {
130
+ if (!quiet) {
131
+ log(`Warning: No files found matching pattern: ${pattern}`, 'warn', quiet);
132
+ }
133
+ continue;
134
+ }
135
+ for (const sourceFile of matchingFiles){
136
+ // Calculate relative path from source directory
137
+ const relativePath = pathRelative(baseDir, sourceFile);
138
+ // Determine destination path in output directory
139
+ const destPath = pathResolve(outputFullPath, relativePath);
140
+ // Create destination directory if it doesn't exist
141
+ const destDir = pathResolve(destPath, '..');
142
+ mkdirSync(destDir, {
143
+ recursive: true
144
+ });
145
+ await new Promise((resolve, reject)=>{
146
+ copyFile(sourceFile, destPath, (copyError)=>{
147
+ if (copyError) {
148
+ reject(copyError);
149
+ } else {
150
+ resolve(true);
151
+ }
152
+ });
153
+ });
154
+ totalCopied++;
155
+ }
156
+ }
157
+ if (totalCopied > 0) {
158
+ spinner.succeed(`Successfully copied ${totalCopied} configured files!`);
159
+ } else {
160
+ spinner.succeed('No configured files to copy');
161
+ }
162
+ } catch (error) {
163
+ spinner.fail('Failed to copy configured files');
164
+ log(`Error copying configured files: ${error.message}`, 'error', quiet);
165
+ throw error;
164
166
  }
165
- }
166
- writeFileSync(targetFile, readFileSync(source));
167
167
  };
168
- const copyFolderRecursiveSync = (source, target) => {
169
- let files = [];
170
- const targetFolder = pathJoin(target, pathBasename(source));
171
- if (!existsSync(targetFolder)) {
172
- mkdirSync(targetFolder);
173
- }
174
- if (lstatSync(source).isDirectory()) {
175
- files = readdirSync(source);
176
- files.forEach((file) => {
177
- const curSource = pathJoin(source, file);
178
- if (lstatSync(curSource).isDirectory()) {
179
- copyFolderRecursiveSync(curSource, targetFolder);
180
- } else {
181
- copyFileSync(curSource, targetFolder);
182
- }
183
- });
184
- }
168
+ export const copyFileSync = (source, target)=>{
169
+ let targetFile = target;
170
+ if (existsSync(target)) {
171
+ if (lstatSync(target).isDirectory()) {
172
+ targetFile = pathJoin(target, pathBasename(source));
173
+ }
174
+ }
175
+ writeFileSync(targetFile, readFileSync(source));
185
176
  };
186
- const getPackageJson = (packagePath) => {
187
- const formatPath = packagePath || `${process.cwd()}/package.json`;
188
- const packageData = readFileSync(formatPath).toString();
189
- return JSON.parse(packageData);
177
+ export const copyFolderRecursiveSync = (source, target)=>{
178
+ let files = [];
179
+ const targetFolder = pathJoin(target, pathBasename(source));
180
+ if (!existsSync(targetFolder)) {
181
+ mkdirSync(targetFolder);
182
+ }
183
+ if (lstatSync(source).isDirectory()) {
184
+ files = readdirSync(source);
185
+ files.forEach((file)=>{
186
+ const curSource = pathJoin(source, file);
187
+ if (lstatSync(curSource).isDirectory()) {
188
+ copyFolderRecursiveSync(curSource, targetFolder);
189
+ } else {
190
+ copyFileSync(curSource, targetFolder);
191
+ }
192
+ });
193
+ }
190
194
  };
191
- const getFilesByExt = (ext, config) => {
192
- const { sourceFullPath } = config;
193
- return globSync(`${sourceFullPath}/**/**${ext}`);
195
+ export const getPackageJson = (packagePath)=>{
196
+ const formatPath = packagePath || `${process.cwd()}/package.json`;
197
+ const packageData = readFileSync(formatPath).toString();
198
+ return JSON.parse(packageData);
194
199
  };
195
- const removeConflictModules = (moduleList) => {
196
- const updatedList = { ...moduleList };
197
- Object.keys(updatedList).forEach((moduleName) => {
198
- const regex = new RegExp("^(?!@types/).*?(jest|webpack).*$", "gi");
199
- if (regex.test(moduleName)) {
200
- delete updatedList[moduleName];
201
- }
202
- });
203
- return updatedList;
200
+ export const getFilesByExt = (ext, config)=>{
201
+ const { sourceFullPath } = config;
202
+ return globSync(`${sourceFullPath}/**/**${ext}`);
204
203
  };
205
- const removeFiles = (fileName, isRelative = false) => new Promise((resolve, reject) => {
206
- const filePath = isRelative ? pathResolve(cwd, fileName) : fileName;
207
- try {
208
- rimrafSync(filePath);
209
- return resolve(null);
210
- } catch (error) {
211
- return reject(error);
212
- }
213
- });
214
- const removeModules = () => new Promise(async (resolve, reject) => {
215
- try {
216
- await removeFiles("./node_modules", true);
217
- await removeFiles("./yarn.lock", true);
218
- await removeFiles("./package-lock.json", true);
219
- resolve(null);
220
- } catch (error) {
221
- reject(error);
222
- }
223
- });
224
- const setPackageJson = (json, packagePath) => {
225
- if (!json) {
226
- return;
227
- }
228
- const formatPath = packagePath || `${process.cwd()}/package.json`;
229
- writeFileSync(formatPath, JSON.stringify(json, null, 2));
204
+ export const removeConflictModules = (moduleList)=>{
205
+ const updatedList = {
206
+ ...moduleList
207
+ };
208
+ Object.keys(updatedList).forEach((moduleName)=>{
209
+ const regex = new RegExp('^(?!@types/).*?(jest|webpack).*$', 'gi');
210
+ if (regex.test(moduleName)) {
211
+ delete updatedList[moduleName];
212
+ }
213
+ });
214
+ return updatedList;
230
215
  };
231
- const linkedModules = (startPath) => {
232
- const workingPath = startPath || process.cwd();
233
- let modulePath;
234
- let prefix;
235
- if (workingPath.includes("@")) {
236
- prefix = `@${workingPath.split("@").pop()}`;
237
- modulePath = workingPath;
238
- } else {
239
- modulePath = pathJoin(workingPath, "node_modules");
240
- }
241
- const foundPaths = globSync(`${modulePath}/*`);
242
- return foundPaths.reduce((list, foundPath) => {
243
- try {
244
- const stats = lstatSync(foundPath);
245
- if (stats.isDirectory()) {
246
- const deepList = linkedModules(foundPath);
247
- list.push(...deepList);
248
- } else if (stats.isSymbolicLink()) {
249
- const moduleNames = [prefix, pathBasename(foundPath)].filter((item) => !isEmpty(item));
250
- list.push({ name: `${moduleNames.join("/")}`, path: foundPath });
251
- }
252
- return list;
253
- } catch {
254
- return list;
216
+ export const removeFiles = (fileName, isRelative = false)=>new Promise((resolve, reject)=>{
217
+ const filePath = isRelative ? pathResolve(cwd, fileName) : fileName;
218
+ try {
219
+ rimrafSync(filePath);
220
+ return resolve(null);
221
+ } catch (error) {
222
+ return reject(error);
223
+ }
224
+ });
225
+ export const removeModules = ()=>new Promise(async (resolve, reject)=>{
226
+ try {
227
+ // Remove node_modules
228
+ await removeFiles('./node_modules', true);
229
+ // Remove yarn lock
230
+ await removeFiles('./yarn.lock', true);
231
+ // Remove npm lock
232
+ await removeFiles('./package-lock.json', true);
233
+ resolve(null);
234
+ } catch (error) {
235
+ reject(error);
236
+ }
237
+ });
238
+ export const setPackageJson = (json, packagePath)=>{
239
+ if (!json) {
240
+ return;
255
241
  }
256
- }, []);
242
+ const formatPath = packagePath || `${process.cwd()}/package.json`;
243
+ writeFileSync(formatPath, JSON.stringify(json, null, 2));
257
244
  };
258
- const checkLinkedModules = () => {
259
- const linked = linkedModules();
260
- if (linked.length) {
261
- const msgModule = linked.length > 1 ? "Modules" : "Module";
262
- const linkedMsg = linked.reduce(
263
- (msg, linkedModule) => `${msg}
264
- * ${linkedModule.name}`,
265
- `Linked ${msgModule}:`
266
- );
267
- log(boxen(linkedMsg, { dimBorder: true, padding: 1 }), "warn");
268
- }
245
+ export const linkedModules = (startPath)=>{
246
+ const workingPath = startPath || process.cwd();
247
+ let modulePath;
248
+ let prefix;
249
+ if (workingPath.includes('@')) {
250
+ prefix = `@${workingPath.split('@').pop()}`;
251
+ modulePath = workingPath;
252
+ } else {
253
+ modulePath = pathJoin(workingPath, 'node_modules');
254
+ }
255
+ const foundPaths = globSync(`${modulePath}/*`);
256
+ return foundPaths.reduce((list, foundPath)=>{
257
+ try {
258
+ const stats = lstatSync(foundPath);
259
+ if (stats.isDirectory()) {
260
+ const deepList = linkedModules(foundPath);
261
+ list.push(...deepList);
262
+ } else if (stats.isSymbolicLink()) {
263
+ const moduleNames = [
264
+ prefix,
265
+ pathBasename(foundPath)
266
+ ].filter((item)=>!isEmpty(item));
267
+ list.push({
268
+ name: `${moduleNames.join('/')}`,
269
+ path: foundPath
270
+ });
271
+ }
272
+ return list;
273
+ } catch {
274
+ // Skip files that don't exist or can't be accessed
275
+ return list;
276
+ }
277
+ }, []);
269
278
  };
270
- const updateTemplateName = (filePath, replace, replaceCaps) => {
271
- let data = readFileSync(filePath, "utf8");
272
- data = data.replace(/sample/g, replace);
273
- data = data.replace(/Sample/g, replaceCaps);
274
- writeFileSync(filePath, data, "utf8");
279
+ export const checkLinkedModules = ()=>{
280
+ const linked = linkedModules();
281
+ if (linked.length) {
282
+ const msgModule = linked.length > 1 ? 'Modules' : 'Module';
283
+ const linkedMsg = linked.reduce((msg, linkedModule)=>`${msg}\n * ${linkedModule.name}`, `Linked ${msgModule}:`);
284
+ log(boxen(linkedMsg, {
285
+ dimBorder: true,
286
+ padding: 1
287
+ }), 'warn');
288
+ }
275
289
  };
276
- export {
277
- checkLinkedModules,
278
- copyConfiguredFiles,
279
- copyFileSync,
280
- copyFiles,
281
- copyFolderRecursiveSync,
282
- createProgressBar,
283
- createSpinner,
284
- cwd,
285
- getFilenames,
286
- getFilesByExt,
287
- getPackageJson,
288
- handleWebpackProgress,
289
- linkedModules,
290
- removeConflictModules,
291
- removeFiles,
292
- removeModules,
293
- setPackageJson,
294
- updateTemplateName
290
+ export const updateTemplateName = (filePath, replace, replaceCaps)=>{
291
+ let data = readFileSync(filePath, 'utf8');
292
+ data = data.replace(/sample/g, replace);
293
+ data = data.replace(/Sample/g, replaceCaps);
294
+ writeFileSync(filePath, data, 'utf8');
295
295
  };
296
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3V0aWxzL2FwcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuaW1wb3J0IGJveGVuIGZyb20gJ2JveGVuJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge2NvcHlGaWxlLCBleGlzdHNTeW5jLCBsc3RhdFN5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5LmpzJztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCB7YmFzZW5hbWUgYXMgcGF0aEJhc2VuYW1lLCBqb2luIGFzIHBhdGhKb2luLCByZWxhdGl2ZSBhcyBwYXRoUmVsYXRpdmUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtyaW1yYWZTeW5jfSBmcm9tICdyaW1yYWYnO1xuXG5cbmltcG9ydCB7bG9nfSBmcm9tICcuL2xvZy5qcyc7XG5cbmltcG9ydCB0eXBlIHtMZXhDb25maWdUeXBlfSBmcm9tICcuLi9MZXhDb25maWcuanMnO1xuXG5cbmV4cG9ydCBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmlsZW5hbWVzUHJvcHMge1xuICByZWFkb25seSBjYWxsYmFjaz86IChzdGF0dXM6IG51bWJlcikgPT4gdm9pZDtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSB1c2VUeXBlc2NyaXB0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZpbGVuYW1lc1Jlc3VsdCB7XG4gIG5hbWVDYXBzOiBzdHJpbmc7XG4gIHRlbXBsYXRlRXh0OiBzdHJpbmc7XG4gIHRlbXBsYXRlUGF0aDogc3RyaW5nO1xuICB0ZW1wbGF0ZVJlYWN0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlbmFtZXMgPSAocHJvcHM6IEdldEZpbGVuYW1lc1Byb3BzKTogRmlsZW5hbWVzUmVzdWx0IHwgdm9pZCA9PiB7XG4gIGNvbnN0IHtjYWxsYmFjaywgY2xpTmFtZSwgbmFtZSwgcXVpZXQsIHR5cGUsIHVzZVR5cGVzY3JpcHR9ID0gcHJvcHM7XG5cbiAgbGV0IG5hbWVDYXBzOiBzdHJpbmc7XG4gIGNvbnN0IGl0ZW1UeXBlczogc3RyaW5nW10gPSBbJ3N0b3JlcycsICd2aWV3cyddO1xuXG4gIGlmKCFuYW1lKSB7XG4gICAgaWYoaXRlbVR5cGVzLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7dHlwZX0gbmFtZSBpcyByZXF1aXJlZC4gUGxlYXNlIHVzZSAnbGV4IC1oJyBmb3Igb3B0aW9ucy5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2s/LigxKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmFtZUNhcHMgPSBgJHtuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7bmFtZS5zdWJzdHIoMSl9YDtcbiAgfVxuXG4gIGxvZyhgJHtjbGlOYW1lfSBhZGRpbmcgJHtuYW1lfSAke3R5cGV9Li4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgbGV0IHRlbXBsYXRlUGF0aDogc3RyaW5nO1xuICBsZXQgdGVtcGxhdGVFeHQ6IHN0cmluZztcbiAgbGV0IHRlbXBsYXRlUmVhY3Q6IHN0cmluZztcblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgdGVtcGxhdGVQYXRoID0gJy4uLy4uL3RlbXBsYXRlcy90eXBlc2NyaXB0JztcbiAgICB0ZW1wbGF0ZUV4dCA9ICcudHMnO1xuICAgIHRlbXBsYXRlUmVhY3QgPSAnLnRzeCc7XG4gIH0gZWxzZSB7XG4gICAgdGVtcGxhdGVQYXRoID0gJy4uLy4uL3RlbXBsYXRlcy9mbG93JztcbiAgICB0ZW1wbGF0ZUV4dCA9ICcuanMnO1xuICAgIHRlbXBsYXRlUmVhY3QgPSAnLmpzJztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZUNhcHMsXG4gICAgdGVtcGxhdGVFeHQsXG4gICAgdGVtcGxhdGVQYXRoLFxuICAgIHRlbXBsYXRlUmVhY3RcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Bpbm5lciB7XG4gIGZhaWw6ICh0ZXh0Pzogc3RyaW5nKSA9PiB2b2lkO1xuICBzdGFydDogKHRleHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICh0ZXh0Pzogc3RyaW5nKSA9PiB2b2lkO1xuICB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlU3Bpbm5lciA9IChxdWlldCA9IGZhbHNlKTogU3Bpbm5lciA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZhaWw6ICgpID0+IHt9LFxuICAgICAgc3RhcnQ6ICgpID0+IHt9LFxuICAgICAgc3VjY2VlZDogKCkgPT4ge31cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG9yYSh7Y29sb3I6ICd5ZWxsb3cnfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHJvZ3Jlc3NCYXIgPSAocGVyY2VudGFnZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgd2lkdGggPSAyMDtcbiAgY29uc3QgZmlsbGVkID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZSAvIDEwMCkgKiB3aWR0aCk7XG4gIGNvbnN0IGVtcHR5ID0gd2lkdGggLSBmaWxsZWQ7XG5cbiAgY29uc3QgZmlsbGVkQmFyID0gY2hhbGsuY3lhbignXHUyNTg4JykucmVwZWF0KGZpbGxlZCk7XG4gIGNvbnN0IGVtcHR5QmFyID0gY2hhbGsuZ3JheSgnXHUyNTkxJykucmVwZWF0KGVtcHR5KTtcblxuICByZXR1cm4gZmlsbGVkQmFyICsgZW1wdHlCYXI7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlV2VicGFja1Byb2dyZXNzID0gKG91dHB1dDogc3RyaW5nLCBzcGlubmVyOiBTcGlubmVyLCBxdWlldDogYm9vbGVhbiwgZW1vamk6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwcm9ncmVzc01hdGNoID0gb3V0cHV0Lm1hdGNoKC9cXFt3ZWJwYWNrXFwuUHJvZ3Jlc3NcXF0gKFxcZCspJS8pO1xuICBpZihwcm9ncmVzc01hdGNoKSB7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBwYXJzZUludChwcm9ncmVzc01hdGNoWzFdLCAxMCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBjcmVhdGVQcm9ncmVzc0Jhcihwcm9ncmVzcyk7XG4gICAgc3Bpbm5lci50ZXh0ID0gYCR7ZW1vaml9ICR7YWN0aW9ufTogJHtwcm9ncmVzc0Jhcn0gJHtwcm9ncmVzc30lYDtcbiAgfSBlbHNlIGlmKG91dHB1dC5pbmNsdWRlcygnW3dlYnBhY2suUHJvZ3Jlc3NdJykpIHtcbiAgICBjb25zdCBnZW5lcmFsUHJvZ3Jlc3NNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspJS8pO1xuICAgIGlmKGdlbmVyYWxQcm9ncmVzc01hdGNoKSB7XG4gICAgICBjb25zdCBwcm9ncmVzcyA9IHBhcnNlSW50KGdlbmVyYWxQcm9ncmVzc01hdGNoWzFdLCAxMCk7XG4gICAgICBjb25zdCBwcm9ncmVzc0JhciA9IGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKTtcbiAgICAgIHNwaW5uZXIudGV4dCA9IGAke2Vtb2ppfSAke2FjdGlvbn06ICR7cHJvZ3Jlc3NCYXJ9ICR7cHJvZ3Jlc3N9JWA7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29weUZpbGVzID0gYXN5bmMgKGZpbGVzOiBzdHJpbmdbXSwgdHlwZU5hbWU6IHN0cmluZywgc3Bpbm5lciwgY29uZmlnOiBMZXhDb25maWdUeXBlKSA9PiB7XG4gIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgc291cmNlRnVsbFBhdGh9ID0gY29uZmlnO1xuICBjb25zdCBpdGVtcyA9IGZpbGVzLm1hcCgoZmlsZU5hbWU6IHN0cmluZykgPT4gKHtcbiAgICBmcm9tOiBmaWxlTmFtZSxcbiAgICB0bzogcGF0aFJlc29sdmUob3V0cHV0RnVsbFBhdGgsIHBhdGhSZWxhdGl2ZShzb3VyY2VGdWxsUGF0aCwgZmlsZU5hbWUpKVxuICB9KSk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KGBDb3B5aW5nICR7dHlwZU5hbWV9IGZpbGVzLi4uYCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoaXRlbXMubWFwKCh7ZnJvbSwgdG99KSA9PiBuZXcgUHJvbWlzZShcbiAgICAgIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbWtkaXJTeW5jKHBhdGhSZXNvbHZlKHRvLCAnLi4nKSwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICAgICAgICByZXR1cm4gY29weUZpbGUoZnJvbSwgdG8sIChjb3B5RXJyb3IpID0+IHtcbiAgICAgICAgICBpZihjb3B5RXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKSkpO1xuICAgIHNwaW5uZXIuc3VjY2VlZChgU3VjY2Vzc2Z1bGx5IGNvcGllZCAke2ZpbGVzLmxlbmd0aH0gJHt0eXBlTmFtZX0gZmlsZXMhYCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKGBDb3B5aW5nIG9mICR7dHlwZU5hbWV9IGZpbGVzIGZhaWxlZC5gKTtcbiAgICBsb2coYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgbG9nKGVycm9yLCAnZXJyb3InKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvcHlDb25maWd1cmVkRmlsZXMgPSBhc3luYyAoc3Bpbm5lciwgY29uZmlnOiBMZXhDb25maWdUeXBlLCBxdWlldDogYm9vbGVhbikgPT4ge1xuICBjb25zdCB7Y29weUZpbGVzOiBjb3B5RmlsZXNDb25maWcsIG91dHB1dEZ1bGxQYXRoLCBzb3VyY2VGdWxsUGF0aCwgc291cmNlUGF0aH0gPSBjb25maWc7XG4gIGlmKCFjb3B5RmlsZXNDb25maWcgfHwgY29weUZpbGVzQ29uZmlnLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ29weWluZyBjb25maWd1cmVkIGZpbGVzLi4uJyk7XG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcblxuICAgIGNvbnN0IGJhc2VEaXIgPSBzb3VyY2VGdWxsUGF0aCB8fCAoc291cmNlUGF0aCA/IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlUGF0aCkgOiBjd2QpO1xuXG4gICAgZm9yKGNvbnN0IHBhdHRlcm4gb2YgY29weUZpbGVzQ29uZmlnKSB7XG4gICAgICBjb25zdCByZXNvbHZlZFBhdHRlcm4gPSBwYXRoUmVzb2x2ZShiYXNlRGlyLCBwYXR0ZXJuKTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRmlsZXMgPSBnbG9iU3luYyhyZXNvbHZlZFBhdHRlcm4sIHtcbiAgICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICAgIG5vZGlyOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGlmKG1hdGNoaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIGxvZyhgV2FybmluZzogTm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgcGF0dGVybjogJHtwYXR0ZXJufWAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IoY29uc3Qgc291cmNlRmlsZSBvZiBtYXRjaGluZ0ZpbGVzKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIGZyb20gc291cmNlIGRpcmVjdG9yeVxuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoUmVsYXRpdmUoYmFzZURpciwgc291cmNlRmlsZSk7XG4gICAgICAgIC8vIERldGVybWluZSBkZXN0aW5hdGlvbiBwYXRoIGluIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXRGdWxsUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgLy8gQ3JlYXRlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGNvbnN0IGRlc3REaXIgPSBwYXRoUmVzb2x2ZShkZXN0UGF0aCwgJy4uJyk7XG4gICAgICAgIG1rZGlyU3luYyhkZXN0RGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RQYXRoLCAoY29weUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZihjb3B5RXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGNvcHlFcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdG90YWxDb3BpZWQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYodG90YWxDb3BpZWQgPiAwKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoYFN1Y2Nlc3NmdWxseSBjb3BpZWQgJHt0b3RhbENvcGllZH0gY29uZmlndXJlZCBmaWxlcyFgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdObyBjb25maWd1cmVkIGZpbGVzIHRvIGNvcHknKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gY29weSBjb25maWd1cmVkIGZpbGVzJyk7XG4gICAgbG9nKGBFcnJvciBjb3B5aW5nIGNvbmZpZ3VyZWQgZmlsZXM6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb3B5RmlsZVN5bmMgPSAoc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKSA9PiB7XG4gIGxldCB0YXJnZXRGaWxlOiBzdHJpbmcgPSB0YXJnZXQ7XG5cbiAgaWYoZXhpc3RzU3luYyh0YXJnZXQpKSB7XG4gICAgaWYobHN0YXRTeW5jKHRhcmdldCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGFyZ2V0RmlsZSA9IHBhdGhKb2luKHRhcmdldCwgcGF0aEJhc2VuYW1lKHNvdXJjZSkpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlRmlsZVN5bmModGFyZ2V0RmlsZSwgcmVhZEZpbGVTeW5jKHNvdXJjZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvcHlGb2xkZXJSZWN1cnNpdmVTeW5jID0gKHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICBsZXQgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3QgdGFyZ2V0Rm9sZGVyOiBzdHJpbmcgPSBwYXRoSm9pbih0YXJnZXQsIHBhdGhCYXNlbmFtZShzb3VyY2UpKTtcblxuICBpZighZXhpc3RzU3luYyh0YXJnZXRGb2xkZXIpKSB7XG4gICAgbWtkaXJTeW5jKHRhcmdldEZvbGRlcik7XG4gIH1cblxuICBpZihsc3RhdFN5bmMoc291cmNlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgZmlsZXMgPSByZWFkZGlyU3luYyhzb3VyY2UpO1xuICAgIGZpbGVzLmZvckVhY2goKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgY3VyU291cmNlOiBzdHJpbmcgPSBwYXRoSm9pbihzb3VyY2UsIGZpbGUpO1xuXG4gICAgICBpZihsc3RhdFN5bmMoY3VyU291cmNlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGNvcHlGb2xkZXJSZWN1cnNpdmVTeW5jKGN1clNvdXJjZSwgdGFyZ2V0Rm9sZGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcHlGaWxlU3luYyhjdXJTb3VyY2UsIHRhcmdldEZvbGRlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQYWNrYWdlSnNvbiA9IChwYWNrYWdlUGF0aD86IHN0cmluZykgPT4ge1xuICBjb25zdCBmb3JtYXRQYXRoOiBzdHJpbmcgPSBwYWNrYWdlUGF0aCB8fCBgJHtwcm9jZXNzLmN3ZCgpfS9wYWNrYWdlLmpzb25gO1xuXG4gIGNvbnN0IHBhY2thZ2VEYXRhOiBzdHJpbmcgPSByZWFkRmlsZVN5bmMoZm9ybWF0UGF0aCkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UocGFja2FnZURhdGEpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVzQnlFeHQgPSAoZXh0OiBzdHJpbmcsIGNvbmZpZzogTGV4Q29uZmlnVHlwZSk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qge3NvdXJjZUZ1bGxQYXRofSA9IGNvbmZpZztcbiAgcmV0dXJuIGdsb2JTeW5jKGAke3NvdXJjZUZ1bGxQYXRofS8qKi8qKiR7ZXh0fWApO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUNvbmZsaWN0TW9kdWxlcyA9IChtb2R1bGVMaXN0OiBvYmplY3QpID0+IHtcbiAgY29uc3QgdXBkYXRlZExpc3Q6IG9iamVjdCA9IHsuLi5tb2R1bGVMaXN0fTtcblxuICBPYmplY3Qua2V5cyh1cGRhdGVkTGlzdCkuZm9yRWFjaCgobW9kdWxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ14oPyFAdHlwZXMvKS4qPyhqZXN0fHdlYnBhY2spLiokJywgJ2dpJyk7XG4gICAgaWYocmVnZXgudGVzdChtb2R1bGVOYW1lKSkge1xuICAgICAgZGVsZXRlIHVwZGF0ZWRMaXN0W21vZHVsZU5hbWVdO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHVwZGF0ZWRMaXN0O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUZpbGVzID0gKGZpbGVOYW1lOiBzdHJpbmcsIGlzUmVsYXRpdmU6IGJvb2xlYW4gPSBmYWxzZSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gaXNSZWxhdGl2ZSA/IHBhdGhSZXNvbHZlKGN3ZCwgZmlsZU5hbWUpIDogZmlsZU5hbWU7XG4gIHRyeSB7XG4gICAgcmltcmFmU3luYyhmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlTW9kdWxlcyA9ICgpID0+IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBSZW1vdmUgbm9kZV9tb2R1bGVzXG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4vbm9kZV9tb2R1bGVzJywgdHJ1ZSk7XG5cbiAgICAvLyBSZW1vdmUgeWFybiBsb2NrXG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4veWFybi5sb2NrJywgdHJ1ZSk7XG5cbiAgICAvLyBSZW1vdmUgbnBtIGxvY2tcbiAgICBhd2FpdCByZW1vdmVGaWxlcygnLi9wYWNrYWdlLWxvY2suanNvbicsIHRydWUpO1xuXG4gICAgcmVzb2x2ZShudWxsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IHNldFBhY2thZ2VKc29uID0gKGpzb24sIHBhY2thZ2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gIGlmKCFqc29uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0UGF0aDogc3RyaW5nID0gcGFja2FnZVBhdGggfHwgYCR7cHJvY2Vzcy5jd2QoKX0vcGFja2FnZS5qc29uYDtcblxuICB3cml0ZUZpbGVTeW5jKGZvcm1hdFBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24sIG51bGwsIDIpKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua2VkTW9kdWxlVHlwZSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgbGlua2VkTW9kdWxlcyA9IChzdGFydFBhdGg/OiBzdHJpbmcpOiBMaW5rZWRNb2R1bGVUeXBlW10gPT4ge1xuICBjb25zdCB3b3JraW5nUGF0aDogc3RyaW5nID0gc3RhcnRQYXRoIHx8IHByb2Nlc3MuY3dkKCk7XG4gIGxldCBtb2R1bGVQYXRoOiBzdHJpbmc7XG4gIGxldCBwcmVmaXg6IHN0cmluZztcblxuICBpZih3b3JraW5nUGF0aC5pbmNsdWRlcygnQCcpKSB7XG4gICAgcHJlZml4ID0gYEAke3dvcmtpbmdQYXRoLnNwbGl0KCdAJykucG9wKCl9YDtcbiAgICBtb2R1bGVQYXRoID0gd29ya2luZ1BhdGg7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlUGF0aCA9IHBhdGhKb2luKHdvcmtpbmdQYXRoLCAnbm9kZV9tb2R1bGVzJyk7XG4gIH1cblxuICBjb25zdCBmb3VuZFBhdGhzOiBzdHJpbmdbXSA9IGdsb2JTeW5jKGAke21vZHVsZVBhdGh9LypgKTtcbiAgcmV0dXJuIGZvdW5kUGF0aHMucmVkdWNlKChsaXN0OiBMaW5rZWRNb2R1bGVUeXBlW10sIGZvdW5kUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gbHN0YXRTeW5jKGZvdW5kUGF0aCk7XG5cbiAgICAgIGlmKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29uc3QgZGVlcExpc3Q6IExpbmtlZE1vZHVsZVR5cGVbXSA9IGxpbmtlZE1vZHVsZXMoZm91bmRQYXRoKTtcbiAgICAgICAgbGlzdC5wdXNoKC4uLmRlZXBMaXN0KTtcbiAgICAgIH0gZWxzZSBpZihzdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZU5hbWVzOiBzdHJpbmdbXSA9IChbcHJlZml4LCBwYXRoQmFzZW5hbWUoZm91bmRQYXRoKV0pLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiAhaXNFbXB0eShpdGVtKSk7XG4gICAgICAgIGxpc3QucHVzaCh7bmFtZTogYCR7bW9kdWxlTmFtZXMuam9pbignLycpfWAsIHBhdGg6IGZvdW5kUGF0aH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNraXAgZmlsZXMgdGhhdCBkb24ndCBleGlzdCBvciBjYW4ndCBiZSBhY2Nlc3NlZFxuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICB9LCBbXSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tMaW5rZWRNb2R1bGVzID0gKCkgPT4ge1xuICBjb25zdCBsaW5rZWQgPSBsaW5rZWRNb2R1bGVzKCk7XG5cbiAgaWYobGlua2VkLmxlbmd0aCkge1xuICAgIGNvbnN0IG1zZ01vZHVsZTogc3RyaW5nID0gbGlua2VkLmxlbmd0aCA+IDEgPyAnTW9kdWxlcycgOiAnTW9kdWxlJztcbiAgICBjb25zdCBsaW5rZWRNc2c6IHN0cmluZyA9IGxpbmtlZC5yZWR1Y2UoXG4gICAgICAobXNnOiBzdHJpbmcsIGxpbmtlZE1vZHVsZTogTGlua2VkTW9kdWxlVHlwZSkgPT5cbiAgICAgICAgYCR7bXNnfVxcbiAqICR7bGlua2VkTW9kdWxlLm5hbWV9YCxcbiAgICAgIGBMaW5rZWQgJHttc2dNb2R1bGV9OmBcbiAgICApO1xuICAgIGxvZyhib3hlbihsaW5rZWRNc2csIHtkaW1Cb3JkZXI6IHRydWUsIHBhZGRpbmc6IDF9KSwgJ3dhcm4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRlbXBsYXRlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCByZXBsYWNlOiBzdHJpbmcsIHJlcGxhY2VDYXBzOiBzdHJpbmcpID0+IHtcbiAgbGV0IGRhdGE6IHN0cmluZyA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvc2FtcGxlL2csIHJlcGxhY2UpO1xuICBkYXRhID0gZGF0YS5yZXBsYWNlKC9TYW1wbGUvZywgcmVwbGFjZUNhcHMpO1xuICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBkYXRhLCAndXRmOCcpO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFLQSxPQUFPLFdBQVc7QUFDbEIsT0FBTyxXQUFXO0FBQ2xCLFNBQVEsVUFBVSxZQUFZLFdBQVcsV0FBVyxhQUFhLGNBQWMscUJBQW9CO0FBQ25HLFNBQVEsUUFBUSxnQkFBZTtBQUMvQixPQUFPLGFBQWE7QUFDcEIsT0FBTyxTQUFTO0FBQ2hCLFNBQVEsWUFBWSxjQUFjLFFBQVEsVUFBVSxZQUFZLGNBQWMsV0FBVyxtQkFBa0I7QUFDM0csU0FBUSxrQkFBaUI7QUFHekIsU0FBUSxXQUFVO0FBS1gsTUFBTSxNQUFjLFFBQVEsSUFBSTtBQWtCaEMsTUFBTSxlQUFlLENBQUMsVUFBcUQ7QUFDaEYsUUFBTSxFQUFDLFVBQVUsU0FBUyxNQUFNLE9BQU8sTUFBTSxjQUFhLElBQUk7QUFFOUQsTUFBSTtBQUNKLFFBQU0sWUFBc0IsQ0FBQyxVQUFVLE9BQU87QUFFOUMsTUFBRyxDQUFDLE1BQU07QUFDUixRQUFHLFVBQVUsU0FBUyxJQUFJLEdBQUc7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
296
+
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hcHAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuaW1wb3J0IGJveGVuIGZyb20gJ2JveGVuJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQge2NvcHlGaWxlLCBleGlzdHNTeW5jLCBsc3RhdFN5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5LmpzJztcbmltcG9ydCBvcmEgZnJvbSAnb3JhJztcbmltcG9ydCB7YmFzZW5hbWUgYXMgcGF0aEJhc2VuYW1lLCBqb2luIGFzIHBhdGhKb2luLCByZWxhdGl2ZSBhcyBwYXRoUmVsYXRpdmUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtyaW1yYWZTeW5jfSBmcm9tICdyaW1yYWYnO1xuXG5cbmltcG9ydCB7bG9nfSBmcm9tICcuL2xvZy5qcyc7XG5cbmltcG9ydCB0eXBlIHtMZXhDb25maWdUeXBlfSBmcm9tICcuLi9MZXhDb25maWcuanMnO1xuXG5cbmV4cG9ydCBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmlsZW5hbWVzUHJvcHMge1xuICByZWFkb25seSBjYWxsYmFjaz86IChzdGF0dXM6IG51bWJlcikgPT4gdm9pZDtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSB1c2VUeXBlc2NyaXB0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZpbGVuYW1lc1Jlc3VsdCB7XG4gIG5hbWVDYXBzOiBzdHJpbmc7XG4gIHRlbXBsYXRlRXh0OiBzdHJpbmc7XG4gIHRlbXBsYXRlUGF0aDogc3RyaW5nO1xuICB0ZW1wbGF0ZVJlYWN0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlbmFtZXMgPSAocHJvcHM6IEdldEZpbGVuYW1lc1Byb3BzKTogRmlsZW5hbWVzUmVzdWx0IHwgdm9pZCA9PiB7XG4gIGNvbnN0IHtjYWxsYmFjaywgY2xpTmFtZSwgbmFtZSwgcXVpZXQsIHR5cGUsIHVzZVR5cGVzY3JpcHR9ID0gcHJvcHM7XG5cbiAgbGV0IG5hbWVDYXBzOiBzdHJpbmc7XG4gIGNvbnN0IGl0ZW1UeXBlczogc3RyaW5nW10gPSBbJ3N0b3JlcycsICd2aWV3cyddO1xuXG4gIGlmKCFuYW1lKSB7XG4gICAgaWYoaXRlbVR5cGVzLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7dHlwZX0gbmFtZSBpcyByZXF1aXJlZC4gUGxlYXNlIHVzZSAnbGV4IC1oJyBmb3Igb3B0aW9ucy5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICByZXR1cm4gY2FsbGJhY2s/LigxKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmFtZUNhcHMgPSBgJHtuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7bmFtZS5zdWJzdHIoMSl9YDtcbiAgfVxuXG4gIGxvZyhgJHtjbGlOYW1lfSBhZGRpbmcgJHtuYW1lfSAke3R5cGV9Li4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgbGV0IHRlbXBsYXRlUGF0aDogc3RyaW5nO1xuICBsZXQgdGVtcGxhdGVFeHQ6IHN0cmluZztcbiAgbGV0IHRlbXBsYXRlUmVhY3Q6IHN0cmluZztcblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgdGVtcGxhdGVQYXRoID0gJy4uLy4uL3RlbXBsYXRlcy90eXBlc2NyaXB0JztcbiAgICB0ZW1wbGF0ZUV4dCA9ICcudHMnO1xuICAgIHRlbXBsYXRlUmVhY3QgPSAnLnRzeCc7XG4gIH0gZWxzZSB7XG4gICAgdGVtcGxhdGVQYXRoID0gJy4uLy4uL3RlbXBsYXRlcy9mbG93JztcbiAgICB0ZW1wbGF0ZUV4dCA9ICcuanMnO1xuICAgIHRlbXBsYXRlUmVhY3QgPSAnLmpzJztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZUNhcHMsXG4gICAgdGVtcGxhdGVFeHQsXG4gICAgdGVtcGxhdGVQYXRoLFxuICAgIHRlbXBsYXRlUmVhY3RcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Bpbm5lciB7XG4gIGZhaWw6ICh0ZXh0Pzogc3RyaW5nKSA9PiB2b2lkO1xuICBzdGFydDogKHRleHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICh0ZXh0Pzogc3RyaW5nKSA9PiB2b2lkO1xuICB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlU3Bpbm5lciA9IChxdWlldCA9IGZhbHNlKTogU3Bpbm5lciA9PiB7XG4gIGlmKHF1aWV0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZhaWw6ICgpID0+IHt9LFxuICAgICAgc3RhcnQ6ICgpID0+IHt9LFxuICAgICAgc3VjY2VlZDogKCkgPT4ge31cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG9yYSh7Y29sb3I6ICd5ZWxsb3cnfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUHJvZ3Jlc3NCYXIgPSAocGVyY2VudGFnZTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgd2lkdGggPSAyMDtcbiAgY29uc3QgZmlsbGVkID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZSAvIDEwMCkgKiB3aWR0aCk7XG4gIGNvbnN0IGVtcHR5ID0gd2lkdGggLSBmaWxsZWQ7XG5cbiAgY29uc3QgZmlsbGVkQmFyID0gY2hhbGsuY3lhbign4paIJykucmVwZWF0KGZpbGxlZCk7XG4gIGNvbnN0IGVtcHR5QmFyID0gY2hhbGsuZ3JheSgn4paRJykucmVwZWF0KGVtcHR5KTtcblxuICByZXR1cm4gZmlsbGVkQmFyICsgZW1wdHlCYXI7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlV2VicGFja1Byb2dyZXNzID0gKG91dHB1dDogc3RyaW5nLCBzcGlubmVyOiBTcGlubmVyLCBxdWlldDogYm9vbGVhbiwgZW1vamk6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwcm9ncmVzc01hdGNoID0gb3V0cHV0Lm1hdGNoKC9cXFt3ZWJwYWNrXFwuUHJvZ3Jlc3NcXF0gKFxcZCspJS8pO1xuICBpZihwcm9ncmVzc01hdGNoKSB7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBwYXJzZUludChwcm9ncmVzc01hdGNoWzFdLCAxMCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBjcmVhdGVQcm9ncmVzc0Jhcihwcm9ncmVzcyk7XG4gICAgc3Bpbm5lci50ZXh0ID0gYCR7ZW1vaml9ICR7YWN0aW9ufTogJHtwcm9ncmVzc0Jhcn0gJHtwcm9ncmVzc30lYDtcbiAgfSBlbHNlIGlmKG91dHB1dC5pbmNsdWRlcygnW3dlYnBhY2suUHJvZ3Jlc3NdJykpIHtcbiAgICBjb25zdCBnZW5lcmFsUHJvZ3Jlc3NNYXRjaCA9IG91dHB1dC5tYXRjaCgvKFxcZCspJS8pO1xuICAgIGlmKGdlbmVyYWxQcm9ncmVzc01hdGNoKSB7XG4gICAgICBjb25zdCBwcm9ncmVzcyA9IHBhcnNlSW50KGdlbmVyYWxQcm9ncmVzc01hdGNoWzFdLCAxMCk7XG4gICAgICBjb25zdCBwcm9ncmVzc0JhciA9IGNyZWF0ZVByb2dyZXNzQmFyKHByb2dyZXNzKTtcbiAgICAgIHNwaW5uZXIudGV4dCA9IGAke2Vtb2ppfSAke2FjdGlvbn06ICR7cHJvZ3Jlc3NCYXJ9ICR7cHJvZ3Jlc3N9JWA7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29weUZpbGVzID0gYXN5bmMgKGZpbGVzOiBzdHJpbmdbXSwgdHlwZU5hbWU6IHN0cmluZywgc3Bpbm5lciwgY29uZmlnOiBMZXhDb25maWdUeXBlKSA9PiB7XG4gIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgc291cmNlRnVsbFBhdGh9ID0gY29uZmlnO1xuICBjb25zdCBpdGVtcyA9IGZpbGVzLm1hcCgoZmlsZU5hbWU6IHN0cmluZykgPT4gKHtcbiAgICBmcm9tOiBmaWxlTmFtZSxcbiAgICB0bzogcGF0aFJlc29sdmUob3V0cHV0RnVsbFBhdGgsIHBhdGhSZWxhdGl2ZShzb3VyY2VGdWxsUGF0aCwgZmlsZU5hbWUpKVxuICB9KSk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KGBDb3B5aW5nICR7dHlwZU5hbWV9IGZpbGVzLi4uYCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoaXRlbXMubWFwKCh7ZnJvbSwgdG99KSA9PiBuZXcgUHJvbWlzZShcbiAgICAgIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbWtkaXJTeW5jKHBhdGhSZXNvbHZlKHRvLCAnLi4nKSwge3JlY3Vyc2l2ZTogdHJ1ZX0pO1xuICAgICAgICByZXR1cm4gY29weUZpbGUoZnJvbSwgdG8sIChjb3B5RXJyb3IpID0+IHtcbiAgICAgICAgICBpZihjb3B5RXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKSkpO1xuICAgIHNwaW5uZXIuc3VjY2VlZChgU3VjY2Vzc2Z1bGx5IGNvcGllZCAke2ZpbGVzLmxlbmd0aH0gJHt0eXBlTmFtZX0gZmlsZXMhYCk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBzcGlubmVyLmZhaWwoYENvcHlpbmcgb2YgJHt0eXBlTmFtZX0gZmlsZXMgZmFpbGVkLmApO1xuICAgIGxvZyhgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICBsb2coZXJyb3IsICdlcnJvcicpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29weUNvbmZpZ3VyZWRGaWxlcyA9IGFzeW5jIChzcGlubmVyLCBjb25maWc6IExleENvbmZpZ1R5cGUsIHF1aWV0OiBib29sZWFuKSA9PiB7XG4gIGNvbnN0IHtjb3B5RmlsZXM6IGNvcHlGaWxlc0NvbmZpZywgb3V0cHV0RnVsbFBhdGgsIHNvdXJjZUZ1bGxQYXRoLCBzb3VyY2VQYXRofSA9IGNvbmZpZztcbiAgaWYoIWNvcHlGaWxlc0NvbmZpZyB8fCBjb3B5RmlsZXNDb25maWcubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KCdDb3B5aW5nIGNvbmZpZ3VyZWQgZmlsZXMuLi4nKTtcbiAgICBsZXQgdG90YWxDb3BpZWQgPSAwO1xuXG4gICAgY29uc3QgYmFzZURpciA9IHNvdXJjZUZ1bGxQYXRoIHx8IChzb3VyY2VQYXRoID8gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VQYXRoKSA6IGN3ZCk7XG5cbiAgICBmb3IoY29uc3QgcGF0dGVybiBvZiBjb3B5RmlsZXNDb25maWcpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0dGVybiA9IHBhdGhSZXNvbHZlKGJhc2VEaXIsIHBhdHRlcm4pO1xuICAgICAgY29uc3QgbWF0Y2hpbmdGaWxlcyA9IGdsb2JTeW5jKHJlc29sdmVkUGF0dGVybiwge1xuICAgICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgbm9kaXI6IHRydWVcbiAgICAgIH0pO1xuICAgICAgaWYobWF0Y2hpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYoIXF1aWV0KSB7XG4gICAgICAgICAgbG9nKGBXYXJuaW5nOiBObyBmaWxlcyBmb3VuZCBtYXRjaGluZyBwYXR0ZXJuOiAke3BhdHRlcm59YCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvcihjb25zdCBzb3VyY2VGaWxlIG9mIG1hdGNoaW5nRmlsZXMpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIHBhdGggZnJvbSBzb3VyY2UgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGhSZWxhdGl2ZShiYXNlRGlyLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGRlc3RpbmF0aW9uIHBhdGggaW4gb3V0cHV0IGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGhSZXNvbHZlKG91dHB1dEZ1bGxQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICAvLyBDcmVhdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgY29uc3QgZGVzdERpciA9IHBhdGhSZXNvbHZlKGRlc3RQYXRoLCAnLi4nKTtcbiAgICAgICAgbWtkaXJTeW5jKGRlc3REaXIsIHtyZWN1cnNpdmU6IHRydWV9KTtcblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29weUZpbGUoc291cmNlRmlsZSwgZGVzdFBhdGgsIChjb3B5RXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmKGNvcHlFcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoY29weUVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0b3RhbENvcGllZCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZih0b3RhbENvcGllZCA+IDApIHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZChgU3VjY2Vzc2Z1bGx5IGNvcGllZCAke3RvdGFsQ29waWVkfSBjb25maWd1cmVkIGZpbGVzIWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ05vIGNvbmZpZ3VyZWQgZmlsZXMgdG8gY29weScpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIGNvcHkgY29uZmlndXJlZCBmaWxlcycpO1xuICAgIGxvZyhgRXJyb3IgY29weWluZyBjb25maWd1cmVkIGZpbGVzOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgY29weUZpbGVTeW5jID0gKHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZykgPT4ge1xuICBsZXQgdGFyZ2V0RmlsZTogc3RyaW5nID0gdGFyZ2V0O1xuXG4gIGlmKGV4aXN0c1N5bmModGFyZ2V0KSkge1xuICAgIGlmKGxzdGF0U3luYyh0YXJnZXQpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRhcmdldEZpbGUgPSBwYXRoSm9pbih0YXJnZXQsIHBhdGhCYXNlbmFtZShzb3VyY2UpKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZUZpbGVTeW5jKHRhcmdldEZpbGUsIHJlYWRGaWxlU3luYyhzb3VyY2UpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb3B5Rm9sZGVyUmVjdXJzaXZlU3luYyA9IChzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgbGV0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IHRhcmdldEZvbGRlcjogc3RyaW5nID0gcGF0aEpvaW4odGFyZ2V0LCBwYXRoQmFzZW5hbWUoc291cmNlKSk7XG5cbiAgaWYoIWV4aXN0c1N5bmModGFyZ2V0Rm9sZGVyKSkge1xuICAgIG1rZGlyU3luYyh0YXJnZXRGb2xkZXIpO1xuICB9XG5cbiAgaWYobHN0YXRTeW5jKHNvdXJjZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIGZpbGVzID0gcmVhZGRpclN5bmMoc291cmNlKTtcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGN1clNvdXJjZTogc3RyaW5nID0gcGF0aEpvaW4oc291cmNlLCBmaWxlKTtcblxuICAgICAgaWYobHN0YXRTeW5jKGN1clNvdXJjZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBjb3B5Rm9sZGVyUmVjdXJzaXZlU3luYyhjdXJTb3VyY2UsIHRhcmdldEZvbGRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3B5RmlsZVN5bmMoY3VyU291cmNlLCB0YXJnZXRGb2xkZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UGFja2FnZUpzb24gPSAocGFja2FnZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZm9ybWF0UGF0aDogc3RyaW5nID0gcGFja2FnZVBhdGggfHwgYCR7cHJvY2Vzcy5jd2QoKX0vcGFja2FnZS5qc29uYDtcblxuICBjb25zdCBwYWNrYWdlRGF0YTogc3RyaW5nID0gcmVhZEZpbGVTeW5jKGZvcm1hdFBhdGgpLnRvU3RyaW5nKCk7XG4gIHJldHVybiBKU09OLnBhcnNlKHBhY2thZ2VEYXRhKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlc0J5RXh0ID0gKGV4dDogc3RyaW5nLCBjb25maWc6IExleENvbmZpZ1R5cGUpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IHtzb3VyY2VGdWxsUGF0aH0gPSBjb25maWc7XG4gIHJldHVybiBnbG9iU3luYyhgJHtzb3VyY2VGdWxsUGF0aH0vKiovKioke2V4dH1gKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDb25mbGljdE1vZHVsZXMgPSAobW9kdWxlTGlzdDogb2JqZWN0KSA9PiB7XG4gIGNvbnN0IHVwZGF0ZWRMaXN0OiBvYmplY3QgPSB7Li4ubW9kdWxlTGlzdH07XG5cbiAgT2JqZWN0LmtleXModXBkYXRlZExpc3QpLmZvckVhY2goKG1vZHVsZU5hbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJlZ2V4OiBSZWdFeHAgPSBuZXcgUmVnRXhwKCdeKD8hQHR5cGVzLykuKj8oamVzdHx3ZWJwYWNrKS4qJCcsICdnaScpO1xuICAgIGlmKHJlZ2V4LnRlc3QobW9kdWxlTmFtZSkpIHtcbiAgICAgIGRlbGV0ZSB1cGRhdGVkTGlzdFttb2R1bGVOYW1lXTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB1cGRhdGVkTGlzdDtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVGaWxlcyA9IChmaWxlTmFtZTogc3RyaW5nLCBpc1JlbGF0aXZlOiBib29sZWFuID0gZmFsc2UpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgY29uc3QgZmlsZVBhdGg6IHN0cmluZyA9IGlzUmVsYXRpdmUgPyBwYXRoUmVzb2x2ZShjd2QsIGZpbGVOYW1lKSA6IGZpbGVOYW1lO1xuICB0cnkge1xuICAgIHJpbXJhZlN5bmMoZmlsZVBhdGgpO1xuICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlTW9kdWxlcyA9ICgpID0+IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBSZW1vdmUgbm9kZV9tb2R1bGVzXG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4vbm9kZV9tb2R1bGVzJywgdHJ1ZSk7XG5cbiAgICAvLyBSZW1vdmUgeWFybiBsb2NrXG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMoJy4veWFybi5sb2NrJywgdHJ1ZSk7XG5cbiAgICAvLyBSZW1vdmUgbnBtIGxvY2tcbiAgICBhd2FpdCByZW1vdmVGaWxlcygnLi9wYWNrYWdlLWxvY2suanNvbicsIHRydWUpO1xuXG4gICAgcmVzb2x2ZShudWxsKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gIH1cbn0pO1xuXG5leHBvcnQgY29uc3Qgc2V0UGFja2FnZUpzb24gPSAoanNvbiwgcGFja2FnZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgaWYoIWpzb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmb3JtYXRQYXRoOiBzdHJpbmcgPSBwYWNrYWdlUGF0aCB8fCBgJHtwcm9jZXNzLmN3ZCgpfS9wYWNrYWdlLmpzb25gO1xuXG4gIHdyaXRlRmlsZVN5bmMoZm9ybWF0UGF0aCwgSlNPTi5zdHJpbmdpZnkoanNvbiwgbnVsbCwgMikpO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBMaW5rZWRNb2R1bGVUeXBlIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBsaW5rZWRNb2R1bGVzID0gKHN0YXJ0UGF0aD86IHN0cmluZyk6IExpbmtlZE1vZHVsZVR5cGVbXSA9PiB7XG4gIGNvbnN0IHdvcmtpbmdQYXRoOiBzdHJpbmcgPSBzdGFydFBhdGggfHwgcHJvY2Vzcy5jd2QoKTtcbiAgbGV0IG1vZHVsZVBhdGg6IHN0cmluZztcbiAgbGV0IHByZWZpeDogc3RyaW5nO1xuXG4gIGlmKHdvcmtpbmdQYXRoLmluY2x1ZGVzKCdAJykpIHtcbiAgICBwcmVmaXggPSBgQCR7d29ya2luZ1BhdGguc3BsaXQoJ0AnKS5wb3AoKX1gO1xuICAgIG1vZHVsZVBhdGggPSB3b3JraW5nUGF0aDtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGVQYXRoID0gcGF0aEpvaW4od29ya2luZ1BhdGgsICdub2RlX21vZHVsZXMnKTtcbiAgfVxuXG4gIGNvbnN0IGZvdW5kUGF0aHM6IHN0cmluZ1tdID0gZ2xvYlN5bmMoYCR7bW9kdWxlUGF0aH0vKmApO1xuICByZXR1cm4gZm91bmRQYXRocy5yZWR1Y2UoKGxpc3Q6IExpbmtlZE1vZHVsZVR5cGVbXSwgZm91bmRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBsc3RhdFN5bmMoZm91bmRQYXRoKTtcblxuICAgICAgaWYoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBjb25zdCBkZWVwTGlzdDogTGlua2VkTW9kdWxlVHlwZVtdID0gbGlua2VkTW9kdWxlcyhmb3VuZFBhdGgpO1xuICAgICAgICBsaXN0LnB1c2goLi4uZGVlcExpc3QpO1xuICAgICAgfSBlbHNlIGlmKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlTmFtZXM6IHN0cmluZ1tdID0gKFtwcmVmaXgsIHBhdGhCYXNlbmFtZShmb3VuZFBhdGgpXSkuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+ICFpc0VtcHR5KGl0ZW0pKTtcbiAgICAgICAgbGlzdC5wdXNoKHtuYW1lOiBgJHttb2R1bGVOYW1lcy5qb2luKCcvJyl9YCwgcGF0aDogZm91bmRQYXRofSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH0gY2F0Y2h7XG4gICAgICAvLyBTa2lwIGZpbGVzIHRoYXQgZG9uJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cbiAgfSwgW10pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTGlua2VkTW9kdWxlcyA9ICgpID0+IHtcbiAgY29uc3QgbGlua2VkID0gbGlua2VkTW9kdWxlcygpO1xuXG4gIGlmKGxpbmtlZC5sZW5ndGgpIHtcbiAgICBjb25zdCBtc2dNb2R1bGU6IHN0cmluZyA9IGxpbmtlZC5sZW5ndGggPiAxID8gJ01vZHVsZXMnIDogJ01vZHVsZSc7XG4gICAgY29uc3QgbGlua2VkTXNnOiBzdHJpbmcgPSBsaW5rZWQucmVkdWNlKFxuICAgICAgKG1zZzogc3RyaW5nLCBsaW5rZWRNb2R1bGU6IExpbmtlZE1vZHVsZVR5cGUpID0+XG4gICAgICAgIGAke21zZ31cXG4gKiAke2xpbmtlZE1vZHVsZS5uYW1lfWAsXG4gICAgICBgTGlua2VkICR7bXNnTW9kdWxlfTpgXG4gICAgKTtcbiAgICBsb2coYm94ZW4obGlua2VkTXNnLCB7ZGltQm9yZGVyOiB0cnVlLCBwYWRkaW5nOiAxfSksICd3YXJuJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVUZW1wbGF0ZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZywgcmVwbGFjZTogc3RyaW5nLCByZXBsYWNlQ2Fwczogc3RyaW5nKSA9PiB7XG4gIGxldCBkYXRhOiBzdHJpbmcgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGRhdGEgPSBkYXRhLnJlcGxhY2UoL3NhbXBsZS9nLCByZXBsYWNlKTtcbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvU2FtcGxlL2csIHJlcGxhY2VDYXBzKTtcbiAgd3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgZGF0YSwgJ3V0ZjgnKTtcbn07Il0sIm5hbWVzIjpbImJveGVuIiwiY2hhbGsiLCJjb3B5RmlsZSIsImV4aXN0c1N5bmMiLCJsc3RhdFN5bmMiLCJta2RpclN5bmMiLCJyZWFkZGlyU3luYyIsInJlYWRGaWxlU3luYyIsIndyaXRlRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJpc0VtcHR5Iiwib3JhIiwiYmFzZW5hbWUiLCJwYXRoQmFzZW5hbWUiLCJqb2luIiwicGF0aEpvaW4iLCJyZWxhdGl2ZSIsInBhdGhSZWxhdGl2ZSIsInJlc29sdmUiLCJwYXRoUmVzb2x2ZSIsInJpbXJhZlN5bmMiLCJsb2ciLCJjd2QiLCJwcm9jZXNzIiwiZ2V0RmlsZW5hbWVzIiwicHJvcHMiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJuYW1lIiwicXVpZXQiLCJ0eXBlIiwidXNlVHlwZXNjcmlwdCIsIm5hbWVDYXBzIiwiaXRlbVR5cGVzIiwiaW5jbHVkZXMiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsInRlbXBsYXRlUGF0aCIsInRlbXBsYXRlRXh0IiwidGVtcGxhdGVSZWFjdCIsImNyZWF0ZVNwaW5uZXIiLCJmYWlsIiwic3RhcnQiLCJzdWNjZWVkIiwiY29sb3IiLCJjcmVhdGVQcm9ncmVzc0JhciIsInBlcmNlbnRhZ2UiLCJ3aWR0aCIsImZpbGxlZCIsIk1hdGgiLCJyb3VuZCIsImVtcHR5IiwiZmlsbGVkQmFyIiwiY3lhbiIsInJlcGVhdCIsImVtcHR5QmFyIiwiZ3JheSIsImhhbmRsZVdlYnBhY2tQcm9ncmVzcyIsIm91dHB1dCIsInNwaW5uZXIiLCJlbW9qaSIsImFjdGlvbiIsInByb2dyZXNzTWF0Y2giLCJtYXRjaCIsInByb2dyZXNzIiwicGFyc2VJbnQiLCJwcm9ncmVzc0JhciIsInRleHQiLCJnZW5lcmFsUHJvZ3Jlc3NNYXRjaCIsImNvcHlGaWxlcyIsImZpbGVzIiwidHlwZU5hbWUiLCJjb25maWciLCJvdXRwdXRGdWxsUGF0aCIsInNvdXJjZUZ1bGxQYXRoIiwiaXRlbXMiLCJtYXAiLCJmaWxlTmFtZSIsImZyb20iLCJ0byIsIlByb21pc2UiLCJhbGwiLCJyZWplY3QiLCJyZWN1cnNpdmUiLCJjb3B5RXJyb3IiLCJsZW5ndGgiLCJlcnJvciIsIm1lc3NhZ2UiLCJjb3B5Q29uZmlndXJlZEZpbGVzIiwiY29weUZpbGVzQ29uZmlnIiwic291cmNlUGF0aCIsInRvdGFsQ29waWVkIiwiYmFzZURpciIsInBhdHRlcm4iLCJyZXNvbHZlZFBhdHRlcm4iLCJtYXRjaGluZ0ZpbGVzIiwiYWJzb2x1dGUiLCJub2RpciIsInNvdXJjZUZpbGUiLCJyZWxhdGl2ZVBhdGgiLCJkZXN0UGF0aCIsImRlc3REaXIiLCJjb3B5RmlsZVN5bmMiLCJzb3VyY2UiLCJ0YXJnZXQiLCJ0YXJnZXRGaWxlIiwiaXNEaXJlY3RvcnkiLCJjb3B5Rm9sZGVyUmVjdXJzaXZlU3luYyIsInRhcmdldEZvbGRlciIsImZvckVhY2giLCJmaWxlIiwiY3VyU291cmNlIiwiZ2V0UGFja2FnZUpzb24iLCJwYWNrYWdlUGF0aCIsImZvcm1hdFBhdGgiLCJwYWNrYWdlRGF0YSIsInRvU3RyaW5nIiwiSlNPTiIsInBhcnNlIiwiZ2V0RmlsZXNCeUV4dCIsImV4dCIsInJlbW92ZUNvbmZsaWN0TW9kdWxlcyIsIm1vZHVsZUxpc3QiLCJ1cGRhdGVkTGlzdCIsIk9iamVjdCIsImtleXMiLCJtb2R1bGVOYW1lIiwicmVnZXgiLCJSZWdFeHAiLCJ0ZXN0IiwicmVtb3ZlRmlsZXMiLCJpc1JlbGF0aXZlIiwiZmlsZVBhdGgiLCJyZW1vdmVNb2R1bGVzIiwic2V0UGFja2FnZUpzb24iLCJqc29uIiwic3RyaW5naWZ5IiwibGlua2VkTW9kdWxlcyIsInN0YXJ0UGF0aCIsIndvcmtpbmdQYXRoIiwibW9kdWxlUGF0aCIsInByZWZpeCIsInNwbGl0IiwicG9wIiwiZm91bmRQYXRocyIsInJlZHVjZSIsImxpc3QiLCJmb3VuZFBhdGgiLCJzdGF0cyIsImRlZXBMaXN0IiwicHVzaCIsImlzU3ltYm9saWNMaW5rIiwibW9kdWxlTmFtZXMiLCJmaWx0ZXIiLCJpdGVtIiwicGF0aCIsImNoZWNrTGlua2VkTW9kdWxlcyIsImxpbmtlZCIsIm1zZ01vZHVsZSIsImxpbmtlZE1zZyIsIm1zZyIsImxpbmtlZE1vZHVsZSIsImRpbUJvcmRlciIsInBhZGRpbmciLCJ1cGRhdGVUZW1wbGF0ZU5hbWUiLCJyZXBsYWNlIiwicmVwbGFjZUNhcHMiLCJkYXRhIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FFRCxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVFDLFFBQVEsRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsRUFBRUMsV0FBVyxFQUFFQyxZQUFZLEVBQUVDLGFBQWEsUUFBTyxLQUFLO0FBQ3hHLFNBQVFDLFFBQVFDLFFBQVEsUUFBTyxPQUFPO0FBQ3RDLE9BQU9DLGFBQWEsb0JBQW9CO0FBQ3hDLE9BQU9DLFNBQVMsTUFBTTtBQUN0QixTQUFRQyxZQUFZQyxZQUFZLEVBQUVDLFFBQVFDLFFBQVEsRUFBRUMsWUFBWUMsWUFBWSxFQUFFQyxXQUFXQyxX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