@decaf-ts/utils 0.1.6

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 (112) hide show
  1. package/LICENSE.md +157 -0
  2. package/README.md +95 -0
  3. package/dist/esm/utils.js +1 -0
  4. package/dist/types/bin/tag-release.d.ts +1 -0
  5. package/dist/types/bin/update-scripts.d.ts +1 -0
  6. package/dist/types/cli/command.d.ts +110 -0
  7. package/dist/types/cli/commands/index.d.ts +2 -0
  8. package/dist/types/cli/commands/tag-release.d.ts +105 -0
  9. package/dist/types/cli/commands/update-scripts.d.ts +211 -0
  10. package/dist/types/cli/constants.d.ts +73 -0
  11. package/dist/types/cli/index.d.ts +4 -0
  12. package/dist/types/cli/types.d.ts +28 -0
  13. package/dist/types/index.d.ts +39 -0
  14. package/dist/types/input/index.d.ts +2 -0
  15. package/dist/types/input/input.d.ts +472 -0
  16. package/dist/types/input/types.d.ts +76 -0
  17. package/dist/types/output/common.d.ts +51 -0
  18. package/dist/types/output/index.d.ts +3 -0
  19. package/dist/types/output/logging.d.ts +177 -0
  20. package/dist/types/output/types.d.ts +203 -0
  21. package/dist/types/utils/accumulator.d.ts +105 -0
  22. package/dist/types/utils/constants.d.ts +136 -0
  23. package/dist/types/utils/environment.d.ts +57 -0
  24. package/dist/types/utils/fs.d.ts +133 -0
  25. package/dist/types/utils/http.d.ts +41 -0
  26. package/dist/types/utils/index.d.ts +7 -0
  27. package/dist/types/utils/md.d.ts +156 -0
  28. package/dist/types/utils/tests.d.ts +170 -0
  29. package/dist/types/utils/text.d.ts +106 -0
  30. package/dist/types/utils/timeout.d.ts +1 -0
  31. package/dist/types/utils/types.d.ts +81 -0
  32. package/dist/types/utils/utils.d.ts +91 -0
  33. package/dist/types/utils/web.d.ts +7 -0
  34. package/dist/types/writers/OutputWriter.d.ts +49 -0
  35. package/dist/types/writers/RegexpOutputWriter.d.ts +69 -0
  36. package/dist/types/writers/StandardOutputWriter.d.ts +91 -0
  37. package/dist/types/writers/index.d.ts +4 -0
  38. package/dist/types/writers/types.d.ts +29 -0
  39. package/dist/utils.js +1 -0
  40. package/lib/assets/slogans.json +802 -0
  41. package/lib/bin/tag-release.cjs +12 -0
  42. package/lib/bin/update-scripts.cjs +12 -0
  43. package/lib/cli/command.cjs +153 -0
  44. package/lib/cli/commands/index.cjs +20 -0
  45. package/lib/cli/commands/tag-release.cjs +168 -0
  46. package/lib/cli/commands/update-scripts.cjs +511 -0
  47. package/lib/cli/constants.cjs +80 -0
  48. package/lib/cli/index.cjs +22 -0
  49. package/lib/cli/types.cjs +4 -0
  50. package/lib/esm/assets/slogans.json +802 -0
  51. package/lib/esm/bin/tag-release.js +10 -0
  52. package/lib/esm/bin/update-scripts.js +10 -0
  53. package/lib/esm/cli/command.js +149 -0
  54. package/lib/esm/cli/commands/index.js +4 -0
  55. package/lib/esm/cli/commands/tag-release.js +164 -0
  56. package/lib/esm/cli/commands/update-scripts.js +504 -0
  57. package/lib/esm/cli/constants.js +77 -0
  58. package/lib/esm/cli/index.js +6 -0
  59. package/lib/esm/cli/types.js +3 -0
  60. package/lib/esm/index.js +41 -0
  61. package/lib/esm/input/index.js +4 -0
  62. package/lib/esm/input/input.js +570 -0
  63. package/lib/esm/input/types.js +3 -0
  64. package/lib/esm/output/common.js +93 -0
  65. package/lib/esm/output/index.js +5 -0
  66. package/lib/esm/output/logging.js +350 -0
  67. package/lib/esm/output/types.js +3 -0
  68. package/lib/esm/utils/accumulator.js +145 -0
  69. package/lib/esm/utils/constants.js +176 -0
  70. package/lib/esm/utils/environment.js +91 -0
  71. package/lib/esm/utils/fs.js +271 -0
  72. package/lib/esm/utils/http.js +70 -0
  73. package/lib/esm/utils/index.js +9 -0
  74. package/lib/esm/utils/md.js +3 -0
  75. package/lib/esm/utils/tests.js +223 -0
  76. package/lib/esm/utils/text.js +142 -0
  77. package/lib/esm/utils/timeout.js +5 -0
  78. package/lib/esm/utils/types.js +3 -0
  79. package/lib/esm/utils/utils.js +220 -0
  80. package/lib/esm/utils/web.js +12 -0
  81. package/lib/esm/writers/OutputWriter.js +3 -0
  82. package/lib/esm/writers/RegexpOutputWriter.js +98 -0
  83. package/lib/esm/writers/StandardOutputWriter.js +127 -0
  84. package/lib/esm/writers/index.js +6 -0
  85. package/lib/esm/writers/types.js +3 -0
  86. package/lib/index.cjs +58 -0
  87. package/lib/input/index.cjs +20 -0
  88. package/lib/input/input.cjs +577 -0
  89. package/lib/input/types.cjs +4 -0
  90. package/lib/output/common.cjs +100 -0
  91. package/lib/output/index.cjs +21 -0
  92. package/lib/output/logging.cjs +355 -0
  93. package/lib/output/types.cjs +4 -0
  94. package/lib/utils/accumulator.cjs +149 -0
  95. package/lib/utils/constants.cjs +179 -0
  96. package/lib/utils/environment.cjs +95 -0
  97. package/lib/utils/fs.cjs +288 -0
  98. package/lib/utils/http.cjs +77 -0
  99. package/lib/utils/index.cjs +25 -0
  100. package/lib/utils/md.cjs +4 -0
  101. package/lib/utils/tests.cjs +263 -0
  102. package/lib/utils/text.cjs +153 -0
  103. package/lib/utils/timeout.cjs +8 -0
  104. package/lib/utils/types.cjs +4 -0
  105. package/lib/utils/utils.cjs +226 -0
  106. package/lib/utils/web.cjs +15 -0
  107. package/lib/writers/OutputWriter.cjs +4 -0
  108. package/lib/writers/RegexpOutputWriter.cjs +102 -0
  109. package/lib/writers/StandardOutputWriter.cjs +131 -0
  110. package/lib/writers/index.cjs +22 -0
  111. package/lib/writers/types.cjs +4 -0
  112. package/package.json +121 -0
@@ -0,0 +1,511 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TemplateSync = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const command_1 = require("../command.cjs");
9
+ const utils_1 = require("../../utils/index.cjs");
10
+ const input_1 = require("../../input/index.cjs");
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const baseUrl = "https://raw.githubusercontent.com/decaf-ts/ts-workspace/master";
13
+ const options = {
14
+ templates: [
15
+ ".github/ISSUE_TEMPLATE/bug_report.md",
16
+ ".github/ISSUE_TEMPLATE/feature_request.md",
17
+ ".github/FUNDING.yml",
18
+ ],
19
+ workflows: [
20
+ ".github/workflows/codeql-analysis.yml",
21
+ ".github/workflows/jest-coverage.yaml",
22
+ ".github/workflows/nodejs-build-prod.yaml",
23
+ ".github/workflows/pages.yaml",
24
+ ".github/workflows/publish-on-release.yaml",
25
+ ".github/workflows/release-on-tag.yaml",
26
+ ".github/workflows/snyk-analysis.yaml",
27
+ ],
28
+ ide: [
29
+ ".idea/runConfigurations/All Tests.run.xml",
30
+ ".idea/runConfigurations/build.run.xml",
31
+ ".idea/runConfigurations/build_prod.run.xml",
32
+ ".idea/runConfigurations/coverage.run.xml",
33
+ ".idea/runConfigurations/docs.run.xml",
34
+ ".idea/runConfigurations/drawings.run.xml",
35
+ ".idea/runConfigurations/flash-forward.run.xml",
36
+ ".idea/runConfigurations/Integration_Tests.run.xml",
37
+ ".idea/runConfigurations/Bundling_Tests.run.xml",
38
+ ".idea/runConfigurations/lint-fix.run.xml",
39
+ ".idea/runConfigurations/release.run.xml",
40
+ ".idea/runConfigurations/test_circular.run.xml",
41
+ ".idea/runConfigurations/uml.run.xml",
42
+ ".idea/runConfigurations/Unit Tests.run.xml",
43
+ ".idea/runConfigurations/update-scripts.run.xml",
44
+ ],
45
+ docs: [
46
+ "workdocs/tutorials/Contributing.md",
47
+ "workdocs/tutorials/Documentation.md",
48
+ "workdocs/tutorials/For Developers.md",
49
+ "workdocs/2-Badges.md",
50
+ "workdocs/jsdocs.json",
51
+ "workdocs/readme-md.json",
52
+ ],
53
+ styles: [".prettierrc", "eslint.config.js"],
54
+ scripts: ["bin/update-scripts.cjs", "bin/tag-release.cjs"],
55
+ tests: ["jest.config.ts", "workdocs/reports/jest.coverage.config.ts"],
56
+ typescript: ["tsconfig.json"],
57
+ docker: ["Dockerfile"],
58
+ automation: [
59
+ "workdocs/confluence/Continuous Integration-Deployment/GitHub.md",
60
+ "workdocs/confluence/Continuous Integration-Deployment/Jira.md",
61
+ "workdocs/confluence/Continuous Integration-Deployment/Teams.md",
62
+ ],
63
+ };
64
+ const argzz = {
65
+ // init attributes
66
+ boot: {
67
+ type: "boolean",
68
+ },
69
+ org: {
70
+ type: "string",
71
+ short: "o",
72
+ },
73
+ name: {
74
+ type: "string",
75
+ short: "n",
76
+ default: undefined,
77
+ },
78
+ author: {
79
+ type: "string",
80
+ short: "a",
81
+ default: undefined,
82
+ },
83
+ // update attributes
84
+ all: {
85
+ type: "boolean",
86
+ },
87
+ license: {
88
+ type: "string",
89
+ message: "Pick the license",
90
+ },
91
+ scripts: {
92
+ type: "boolean",
93
+ },
94
+ styles: {
95
+ type: "boolean",
96
+ },
97
+ docs: {
98
+ type: "boolean",
99
+ },
100
+ ide: {
101
+ type: "boolean",
102
+ },
103
+ workflows: {
104
+ type: "boolean",
105
+ },
106
+ templates: {
107
+ type: "boolean",
108
+ },
109
+ typescript: {
110
+ type: "boolean",
111
+ },
112
+ docker: {
113
+ type: "boolean",
114
+ },
115
+ pkg: {
116
+ type: "boolean",
117
+ },
118
+ dependencies: {
119
+ type: "boolean",
120
+ },
121
+ tests: {
122
+ type: "boolean",
123
+ },
124
+ automation: {
125
+ type: "boolean",
126
+ },
127
+ };
128
+ /**
129
+ * @class TemplateSync
130
+ * @extends {Command}
131
+ * @category scripts
132
+ * @description A command-line tool for synchronizing project templates and configurations.
133
+ * @summary This class provides functionality to download and update various project files and configurations from a remote repository.
134
+ * It supports updating licenses, IDE configurations, scripts, styles, documentation, workflows, and templates.
135
+ *
136
+ * @param {CommandOptions} args - The command options for TemplateSync
137
+ */
138
+ class TemplateSync extends command_1.Command {
139
+ constructor() {
140
+ super("TemplateSync", argzz);
141
+ this.replacements = {};
142
+ /**
143
+ * @description Downloads style configuration files.
144
+ * @returns {Promise<void>}
145
+ */
146
+ this.getStyles = () => this.downloadOption("styles");
147
+ /**
148
+ * @description Downloads template files.
149
+ * @returns {Promise<void>}
150
+ */
151
+ this.getTemplates = () => this.downloadOption("templates");
152
+ /**
153
+ * @description Downloads workflow configuration files.
154
+ * @returns {Promise<void>}
155
+ */
156
+ this.getWorkflows = () => this.downloadOption("workflows");
157
+ /**
158
+ * @description Downloads documentation files.
159
+ * @returns {Promise<void>}
160
+ */
161
+ this.getDocs = () => this.downloadOption("docs");
162
+ /**
163
+ * @description Downloads typescript config files.
164
+ * @returns {Promise<void>}
165
+ */
166
+ this.getTypescript = () => this.downloadOption("typescript");
167
+ /**
168
+ * @description Downloads automation documentation files.
169
+ * @returns {Promise<void>}
170
+ */
171
+ this.getAutomation = () => this.downloadOption("automation");
172
+ /**
173
+ * @description Downloads automation documentation files.
174
+ * @returns {Promise<void>}
175
+ */
176
+ this.getTests = () => this.downloadOption("tests");
177
+ /**
178
+ * @description Downloads docker image files.
179
+ * @returns {Promise<void>}
180
+ */
181
+ this.getDocker = () => this.downloadOption("docker");
182
+ }
183
+ loadValuesFromPackage() {
184
+ const p = process.cwd();
185
+ const author = (0, utils_1.getPackage)(p, "author");
186
+ const scopedName = (0, utils_1.getPackage)(p, "name");
187
+ let name = scopedName;
188
+ let org;
189
+ if (name.startsWith("@")) {
190
+ const split = name.split("/");
191
+ name = split[1];
192
+ org = split[0].replace("@", "");
193
+ }
194
+ ["Tiago Venceslau", "TiagoVenceslau", "${author}"].forEach((el) => (this.replacements[el] = author));
195
+ ["TS-Workspace", "ts-workspace", "${name}"].forEach((el) => (this.replacements[el] = name));
196
+ ["decaf-ts", "${org}"].forEach((el) => (this.replacements[el] = org || '""'));
197
+ this.replacements["${org_or_owner}"] = org || name;
198
+ }
199
+ /**
200
+ * @description Downloads files for a specific option category.
201
+ * @summary This method downloads all files associated with a given option key from the remote repository.
202
+ * @param {string} key - The key representing the option category to download
203
+ * @returns {Promise<void>}
204
+ * @throws {Error} If the specified option key is not found
205
+ */
206
+ async downloadOption(key) {
207
+ if (!(key in options)) {
208
+ throw new Error(`Option "${key}" not found in options`);
209
+ }
210
+ const files = options[key];
211
+ for (const file of files) {
212
+ this.log.info(`Downloading ${file}`);
213
+ let data = await utils_1.HttpClient.downloadFile(`${baseUrl}/${file}`);
214
+ data = (0, utils_1.patchString)(data, this.replacements);
215
+ (0, utils_1.writeFile)(path_1.default.join(process.cwd(), file), data);
216
+ }
217
+ }
218
+ /**
219
+ * @description Downloads and sets up the specified license.
220
+ * @summary This method downloads the chosen license file, saves it to the project, and updates the package.json license field.
221
+ * @param {"MIT" | "GPL" | "Apache" | "LGPL" | "AGPL"} license - The license to download and set up
222
+ * @returns {Promise<void>}
223
+ */
224
+ async getLicense(license) {
225
+ this.log.info(`Downloading ${license} license`);
226
+ const url = `${baseUrl}/workdocs/licenses/${license}.md`;
227
+ let data = await utils_1.HttpClient.downloadFile(url);
228
+ data = (0, utils_1.patchString)(data, this.replacements);
229
+ (0, utils_1.writeFile)(path_1.default.join(process.cwd(), "LICENSE.md"), data);
230
+ (0, utils_1.setPackageAttribute)("license", license);
231
+ }
232
+ /**
233
+ * @description Downloads IDE configuration files.
234
+ * @returns {Promise<void>}
235
+ */
236
+ async getIde() {
237
+ fs_1.default.mkdirSync(path_1.default.join(process.cwd(), ".idea", "runConfigurations"), {
238
+ recursive: true,
239
+ });
240
+ await this.downloadOption("ide");
241
+ }
242
+ /**
243
+ * @description Update npm scripts
244
+ * @returns {Promise<void>}
245
+ */
246
+ async getScripts() {
247
+ await this.downloadOption("scripts");
248
+ this.log.info("please re-run the command");
249
+ process.exit(0);
250
+ }
251
+ async initPackage(pkgName, author, license) {
252
+ try {
253
+ const pkg = (0, utils_1.getPackage)();
254
+ delete pkg[utils_1.SetupScriptKey];
255
+ pkg.name = pkgName;
256
+ pkg.version = "0.0.1";
257
+ pkg.author = author;
258
+ pkg.license = license;
259
+ fs_1.default.writeFileSync("package.json", JSON.stringify(pkg, null, 2));
260
+ }
261
+ catch (e) {
262
+ throw new Error(`Error fixing package.json: ${e}`);
263
+ }
264
+ }
265
+ async updatePackageScrips() {
266
+ try {
267
+ const originalPkg = JSON.parse(await utils_1.HttpClient.downloadFile(`${baseUrl}/package.json`));
268
+ const { scripts } = originalPkg;
269
+ const pkg = (0, utils_1.getPackage)();
270
+ Object.keys(pkg.scripts).forEach((key) => {
271
+ if (key in scripts) {
272
+ const replaced = (0, utils_1.patchString)(scripts[key], this.replacements);
273
+ if (replaced !== scripts[key]) {
274
+ pkg.scripts[key] = replaced;
275
+ }
276
+ }
277
+ });
278
+ pkg["exports"]["require"] = originalPkg["exports"]["require"];
279
+ pkg["exports"]["import"] = originalPkg["exports"]["import"];
280
+ pkg["types"] = originalPkg["types"];
281
+ fs_1.default.writeFileSync("package.json", JSON.stringify(pkg, null, 2));
282
+ }
283
+ catch (e) {
284
+ throw new Error(`Error fixing package.json scripts: ${e}`);
285
+ }
286
+ }
287
+ async createTokenFiles() {
288
+ const log = this.log.for(this.createTokenFiles);
289
+ const gitToken = await input_1.UserInput.insistForText("token", "please input your github token", (res) => {
290
+ return !!res.match(/^ghp_[0-9a-zA-Z]{36}$/g);
291
+ });
292
+ Object.values(utils_1.Tokens).forEach((token) => {
293
+ try {
294
+ let status;
295
+ try {
296
+ status = fs_1.default.existsSync(token);
297
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
298
+ }
299
+ catch (e) {
300
+ log.info(`Token file ${token} not found. Creating a new one...`);
301
+ fs_1.default.writeFileSync(token, token === ".token" ? gitToken : "");
302
+ return;
303
+ }
304
+ if (!status) {
305
+ fs_1.default.writeFileSync(token, token === ".token" ? gitToken : "");
306
+ }
307
+ }
308
+ catch (e) {
309
+ throw new Error(`Error creating token file ${token}: ${e}`);
310
+ }
311
+ });
312
+ }
313
+ async getOrg() {
314
+ const org = await input_1.UserInput.askText("Organization", "Enter the organization name (will be used to scope your npm project. leave blank to create a unscoped project):");
315
+ const confirmation = await input_1.UserInput.askConfirmation("Confirm organization", "Is this organization correct?", true);
316
+ if (!confirmation)
317
+ return this.getOrg();
318
+ return org;
319
+ }
320
+ async auditFix() {
321
+ return await (0, utils_1.runCommand)("npm audit fix --force").promise;
322
+ }
323
+ patchFiles() {
324
+ const files = [
325
+ ...fs_1.default
326
+ .readdirSync(path_1.default.join(process.cwd(), "src"), {
327
+ recursive: true,
328
+ withFileTypes: true,
329
+ })
330
+ .filter((entry) => entry.isFile())
331
+ .map((entry) => path_1.default.join(entry.parentPath, entry.name)),
332
+ ...fs_1.default
333
+ .readdirSync(path_1.default.join(process.cwd(), "workdocs"), {
334
+ recursive: true,
335
+ withFileTypes: true,
336
+ })
337
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
338
+ .map((entry) => path_1.default.join(entry.parentPath, entry.name)),
339
+ path_1.default.join(process.cwd(), ".gitlab-ci.yml"),
340
+ path_1.default.join(process.cwd(), "workdocs", "jsdocs.json"),
341
+ ];
342
+ for (const file of files) {
343
+ (0, utils_1.patchFile)(file, this.replacements);
344
+ }
345
+ }
346
+ async updateDependencies() {
347
+ try {
348
+ const originalPkg = JSON.parse(await utils_1.HttpClient.downloadFile(`${baseUrl}/package.json`));
349
+ const { devDependencies } = originalPkg;
350
+ const pkg = (0, utils_1.getPackage)();
351
+ Object.keys(pkg.scripts).forEach((key) => {
352
+ if (key in devDependencies) {
353
+ const replaced = devDependencies[key];
354
+ if (replaced !== devDependencies[key]) {
355
+ pkg["devDependencies"] =
356
+ pkg["devDependencies"] || {};
357
+ pkg["devDependencies"][key] = replaced;
358
+ }
359
+ }
360
+ });
361
+ fs_1.default.writeFileSync("package.json", JSON.stringify(pkg, null, 2));
362
+ await (0, utils_1.runCommand)("npm install").promise;
363
+ }
364
+ catch (e) {
365
+ throw new Error(`Error fixing package.json dependencies: ${e}`);
366
+ }
367
+ }
368
+ /**
369
+ * @description Runs the template synchronization process.
370
+ * @summary This method orchestrates the downloading of various project components based on the provided arguments.
371
+ * @param {ParseArgsResult} args - The parsed command-line arguments
372
+ * @returns {Promise<void>}
373
+ *
374
+ * @mermaid
375
+ * sequenceDiagram
376
+ * participant T as TemplateSync
377
+ * participant L as getLicense
378
+ * participant I as getIde
379
+ * participant S as getScripts
380
+ * participant St as getStyles
381
+ * participant D as getDocs
382
+ * participant W as getWorkflows
383
+ * participant Te as getTemplates
384
+ * T->>T: Parse arguments
385
+ * alt all flag is true
386
+ * T->>T: Set all component flags to true
387
+ * end
388
+ * alt license is specified
389
+ * T->>L: getLicense(license)
390
+ * end
391
+ * alt ide flag is true
392
+ * T->>I: getIde()
393
+ * end
394
+ * alt scripts flag is true
395
+ * T->>S: getScripts()
396
+ * end
397
+ * alt styles flag is true
398
+ * T->>St: getStyles()
399
+ * end
400
+ * alt docs flag is true
401
+ * T->>D: getDocs()
402
+ * end
403
+ * alt workflows flag is true
404
+ * T->>W: getWorkflows()
405
+ * end
406
+ * alt templates flag is true
407
+ * T->>Te: getTemplates()
408
+ * end
409
+ */
410
+ async run(args) {
411
+ let { license } = args;
412
+ const { boot } = args;
413
+ let { all, scripts, styles, docs, ide, workflows, templates, docker, typescript, dependencies, tests, automation, pkg, } = args;
414
+ if (scripts ||
415
+ styles ||
416
+ docs ||
417
+ ide ||
418
+ workflows ||
419
+ templates ||
420
+ docker ||
421
+ typescript ||
422
+ automation ||
423
+ dependencies ||
424
+ tests ||
425
+ pkg)
426
+ all = false;
427
+ if (boot) {
428
+ const org = await this.getOrg();
429
+ const name = await input_1.UserInput.insistForText("Project name", "Enter the project name:", (res) => res.length > 1);
430
+ const author = await input_1.UserInput.insistForText("Author", "Enter the author name:", (res) => res.length > 1);
431
+ const pkgName = org ? `@${org}/${name}` : name;
432
+ await this.initPackage(pkgName, author, license);
433
+ await this.createTokenFiles();
434
+ await this.auditFix();
435
+ this.patchFiles();
436
+ }
437
+ if (all) {
438
+ scripts = false;
439
+ styles = true;
440
+ docs = true;
441
+ ide = true;
442
+ workflows = true;
443
+ templates = true;
444
+ docker = true;
445
+ typescript = true;
446
+ pkg = true;
447
+ dependencies = true;
448
+ tests = true;
449
+ automation = false;
450
+ }
451
+ if (typeof scripts === "undefined")
452
+ scripts = await input_1.UserInput.askConfirmation("scripts", "Do you want to get scripts?", true);
453
+ if (scripts)
454
+ await this.getScripts();
455
+ this.loadValuesFromPackage();
456
+ if (!all && typeof license === "undefined") {
457
+ const confirmation = await input_1.UserInput.askConfirmation("license", "Do you want to set a license?", true);
458
+ if (confirmation)
459
+ license = await input_1.UserInput.insistForText("license", "Enter the desired License (MIT|GPL|Apache|LGPL|AGPL):", (val) => !!val && !!val.match(/^(MIT|GPL|Apache|LGPL|AGPL)$/g));
460
+ }
461
+ if (typeof license !== "undefined")
462
+ await this.getLicense(license);
463
+ if (typeof ide === "undefined")
464
+ ide = await input_1.UserInput.askConfirmation("ide", "Do you want to get ide configs?", true);
465
+ if (ide)
466
+ await this.getIde();
467
+ if (typeof typescript === "undefined")
468
+ typescript = await input_1.UserInput.askConfirmation("typescript", "Do you want to get typescript configs?", true);
469
+ if (typescript)
470
+ await this.getTypescript();
471
+ if (typeof docker === "undefined")
472
+ docker = await input_1.UserInput.askConfirmation("docker", "Do you want to get docker configs?", true);
473
+ if (docker)
474
+ await this.getDocker();
475
+ if (typeof automation === "undefined")
476
+ automation = await input_1.UserInput.askConfirmation("automation", "Do you want to get automation configs?", true);
477
+ if (automation)
478
+ await this.getAutomation();
479
+ if (typeof styles === "undefined")
480
+ styles = await input_1.UserInput.askConfirmation("styles", "Do you want to get styles?", true);
481
+ if (styles)
482
+ await this.getStyles();
483
+ if (typeof docs === "undefined")
484
+ docs = await input_1.UserInput.askConfirmation("docs", "Do you want to get docs?", true);
485
+ if (docs)
486
+ await this.getDocs();
487
+ if (typeof workflows === "undefined")
488
+ workflows = await input_1.UserInput.askConfirmation("workflows", "Do you want to get workflows?", true);
489
+ if (workflows)
490
+ await this.getWorkflows();
491
+ if (typeof templates === "undefined")
492
+ templates = await input_1.UserInput.askConfirmation("templates", "Do you want to get templates?", true);
493
+ if (templates)
494
+ await this.getTemplates();
495
+ if (typeof pkg === "undefined")
496
+ pkg = await input_1.UserInput.askConfirmation("pkg", "Do you want to update your package.json scripts?", true);
497
+ if (pkg)
498
+ await this.updatePackageScrips();
499
+ if (typeof tests === "undefined")
500
+ tests = await input_1.UserInput.askConfirmation("pkg", "Do you want to update your test configs?", true);
501
+ if (tests)
502
+ await this.getTests();
503
+ if (typeof dependencies === "undefined")
504
+ dependencies = await input_1.UserInput.askConfirmation("pkg", "Do you want to update dev dependencies?", true);
505
+ if (dependencies)
506
+ await this.updateDependencies();
507
+ }
508
+ }
509
+ exports.TemplateSync = TemplateSync;
510
+
511
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9jbGkvY29tbWFuZHMvdXBkYXRlLXNjcmlwdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLHdDQUFxQztBQUVyQyx1Q0FVcUI7QUFHckIsdUNBQXdDO0FBQ3hDLDRDQUFvQjtBQUVwQixNQUFNLE9BQU8sR0FDWCxnRUFBZ0UsQ0FBQztBQUVuRSxNQUFNLE9BQU8sR0FBRztJQUNkLFNBQVMsRUFBRTtRQUNULHNDQUFzQztRQUN0QywyQ0FBMkM7UUFDM0MscUJBQXFCO0tBQ3RCO0lBQ0QsU0FBUyxFQUFFO1FBQ1QsdUNBQXVDO1FBQ3ZDLHNDQUFzQztRQUN0QywwQ0FBMEM7UUFDMUMsOEJBQThCO1FBQzlCLDJDQUEyQztRQUMzQyx1Q0FBdUM7UUFDdkMsc0NBQXNDO0tBQ3ZDO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsMkNBQTJDO1FBQzNDLHVDQUF1QztRQUN2Qyw0Q0FBNEM7UUFDNUMsMENBQTBDO1FBQzFDLHNDQUFzQztRQUN0QywwQ0FBMEM7UUFDMUMsK0NBQStDO1FBQy9DLG1EQUFtRDtRQUNuRCxnREFBZ0Q7UUFDaEQsMENBQTBDO1FBQzFDLHlDQUF5QztRQUN6QywrQ0FBK0M7UUFDL0MscUNBQXFDO1FBQ3JDLDRDQUE0QztRQUM1QyxnREFBZ0Q7S0FDakQ7SUFDRCxJQUFJLEVBQUU7UUFDSixvQ0FBb0M7UUFDcEMscUNBQXFDO1FBQ3JDLHNDQUFzQztRQUN0QyxzQkFBc0I7UUFDdEIsc0JBQXNCO1FBQ3RCLHlCQUF5QjtLQUMxQjtJQUNELE1BQU0sRUFBRSxDQUFDLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQztJQUMzQyxPQUFPLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxxQkFBcUIsQ0FBQztJQUMxRCxLQUFLLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSwwQ0FBMEMsQ0FBQztJQUNyRSxVQUFVLEVBQUUsQ0FBQyxlQUFlLENBQUM7SUFDN0IsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDO0lBQ3RCLFVBQVUsRUFB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Q0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUE1ZkQsb0NBNGZDIiwiZmlsZSI6ImNsaS9jb21tYW5kcy91cGRhdGUtc2NyaXB0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcIi4uL2NvbW1hbmRcIjtcbmltcG9ydCB7IENvbW1hbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRQYWNrYWdlLFxuICBIdHRwQ2xpZW50LFxuICBwYXRjaEZpbGUsXG4gIHBhdGNoU3RyaW5nLFxuICBydW5Db21tYW5kLFxuICBzZXRQYWNrYWdlQXR0cmlidXRlLFxuICBTZXR1cFNjcmlwdEtleSxcbiAgVG9rZW5zLFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCIuLi8uLi9vdXRwdXRcIjtcbmltcG9ydCB7IERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vLi4vaW5wdXRcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcblxuY29uc3QgYmFzZVVybCA9XG4gIFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RlY2FmLXRzL3RzLXdvcmtzcGFjZS9tYXN0ZXJcIjtcblxuY29uc3Qgb3B0aW9ucyA9IHtcbiAgdGVtcGxhdGVzOiBbXG4gICAgXCIuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2J1Z19yZXBvcnQubWRcIixcbiAgICBcIi5naXRodWIvSVNTVUVfVEVNUExBVEUvZmVhdHVyZV9yZXF1ZXN0Lm1kXCIsXG4gICAgXCIuZ2l0aHViL0ZVTkRJTkcueW1sXCIsXG4gIF0sXG4gIHdvcmtmbG93czogW1xuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvY29kZXFsLWFuYWx5c2lzLnltbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvamVzdC1jb3ZlcmFnZS55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9ub2RlanMtYnVpbGQtcHJvZC55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9wYWdlcy55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9wdWJsaXNoLW9uLXJlbGVhc2UueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS1vbi10YWcueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3Mvc255ay1hbmFseXNpcy55YW1sXCIsXG4gIF0sXG4gIGlkZTogW1xuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvQWxsIFRlc3RzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2J1aWxkLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2J1aWxkX3Byb2QucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvY292ZXJhZ2UucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvZG9jcy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9kcmF3aW5ncy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9mbGFzaC1mb3J3YXJkLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL0ludGVncmF0aW9uX1Rlc3RzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL0J1bmRsaW5nX1Rlc3RzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2xpbnQtZml4LnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3JlbGVhc2UucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvdGVzdF9jaXJjdWxhci5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy91bWwucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvVW5pdCBUZXN0cy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy91cGRhdGUtc2NyaXB0cy5ydW4ueG1sXCIsXG4gIF0sXG4gIGRvY3M6IFtcbiAgICBcIndvcmtkb2NzL3R1dG9yaWFscy9Db250cmlidXRpbmcubWRcIixcbiAgICBcIndvcmtkb2NzL3R1dG9yaWFscy9Eb2N1bWVudGF0aW9uLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy90dXRvcmlhbHMvRm9yIERldmVsb3BlcnMubWRcIixcbiAgICBcIndvcmtkb2NzLzItQmFkZ2VzLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy9qc2RvY3MuanNvblwiLFxuICAgIFwid29ya2RvY3MvcmVhZG1lLW1kLmpzb25cIixcbiAgXSxcbiAgc3R5bGVzOiBbXCIucHJldHRpZXJyY1wiLCBcImVzbGludC5jb25maWcuanNcIl0sXG4gIHNjcmlwdHM6IFtcImJpbi91cGRhdGUtc2NyaXB0cy5janNcIiwgXCJiaW4vdGFnLXJlbGVhc2UuY2pzXCJdLFxuICB0ZXN0czogW1wiamVzdC5jb25maWcudHNcIiwgXCJ3b3JrZG9jcy9yZXBvcnRzL2plc3QuY292ZXJhZ2UuY29uZmlnLnRzXCJdLFxuICB0eXBlc2NyaXB0OiBbXCJ0c2NvbmZpZy5qc29uXCJdLFxuICBkb2NrZXI6IFtcIkRvY2tlcmZpbGVcIl0sXG4gIGF1dG9tYXRpb246IFtcbiAgICBcIndvcmtkb2NzL2NvbmZsdWVuY2UvQ29udGludW91cyBJbnRlZ3JhdGlvbi1EZXBsb3ltZW50L0dpdEh1Yi5tZFwiLFxuICAgIFwid29ya2RvY3MvY29uZmx1ZW5jZS9Db250aW51b3VzIEludGVncmF0aW9uLURlcGxveW1lbnQvSmlyYS5tZFwiLFxuICAgIFwid29ya2RvY3MvY29uZmx1ZW5jZS9Db250aW51b3VzIEludGVncmF0aW9uLURlcGxveW1lbnQvVGVhbXMubWRcIixcbiAgXSxcbn07XG5cbmNvbnN0IGFyZ3p6ID0ge1xuICAvLyBpbml0IGF0dHJpYnV0ZXNcbiAgYm9vdDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBvcmc6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIHNob3J0OiBcIm9cIixcbiAgfSxcbiAgbmFtZToge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwiblwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbiAgYXV0aG9yOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJhXCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICAvLyB1cGRhdGUgYXR0cmlidXRlc1xuICBhbGw6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgbGljZW5zZToge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgbWVzc2FnZTogXCJQaWNrIHRoZSBsaWNlbnNlXCIsXG4gIH0sXG4gIHNjcmlwdHM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgc3R5bGVzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGRvY3M6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgaWRlOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHdvcmtmbG93czoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICB0ZW1wbGF0ZXM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgdHlwZXNjcmlwdDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBkb2NrZXI6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgcGtnOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGRlcGVuZGVuY2llczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICB0ZXN0czoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBhdXRvbWF0aW9uOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBjbGFzcyBUZW1wbGF0ZVN5bmNcbiAqIEBleHRlbmRzIHtDb21tYW5kfVxuICogQGNhdGVnb3J5IHNjcmlwdHNcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbW1hbmQtbGluZSB0b29sIGZvciBzeW5jaHJvbml6aW5nIHByb2plY3QgdGVtcGxhdGVzIGFuZCBjb25maWd1cmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byBkb3dubG9hZCBhbmQgdXBkYXRlIHZhcmlvdXMgcHJvamVjdCBmaWxlcyBhbmQgY29uZmlndXJhdGlvbnMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LlxuICogSXQgc3VwcG9ydHMgdXBkYXRpbmcgbGljZW5zZXMsIElERSBjb25maWd1cmF0aW9ucywgc2NyaXB0cywgc3R5bGVzLCBkb2N1bWVudGF0aW9uLCB3b3JrZmxvd3MsIGFuZCB0ZW1wbGF0ZXMuXG4gKlxuICogQHBhcmFtIHtDb21tYW5kT3B0aW9uc30gYXJncyAtIFRoZSBjb21tYW5kIG9wdGlvbnMgZm9yIFRlbXBsYXRlU3luY1xuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVTeW5jIGV4dGVuZHMgQ29tbWFuZDxDb21tYW5kT3B0aW9uczx0eXBlb2YgYXJneno+LCB2b2lkPiB7XG4gIHByaXZhdGUgcmVwbGFjZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJUZW1wbGF0ZVN5bmNcIiwgYXJnenopO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkVmFsdWVzRnJvbVBhY2thZ2UoKSB7XG4gICAgY29uc3QgcCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgYXV0aG9yID0gZ2V0UGFja2FnZShwLCBcImF1dGhvclwiKSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgc2NvcGVkTmFtZSA9IGdldFBhY2thZ2UocCwgXCJuYW1lXCIpO1xuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBzY29wZWROYW1lIGFzIHN0cmluZztcbiAgICBsZXQgb3JnOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gbmFtZS5zcGxpdChcIi9cIik7XG4gICAgICBuYW1lID0gc3BsaXRbMV07XG4gICAgICBvcmcgPSBzcGxpdFswXS5yZXBsYWNlKFwiQFwiLCBcIlwiKTtcbiAgICB9XG4gICAgW1wiVGlhZ28gVmVuY2VzbGF1XCIsIFwiVGlhZ29WZW5jZXNsYXVcIiwgXCIke2F1dGhvcn1cIl0uZm9yRWFjaChcbiAgICAgIChlbCkgPT4gKHRoaXMucmVwbGFjZW1lbnRzW2VsXSA9IGF1dGhvcilcbiAgICApO1xuICAgIFtcIlRTLVdvcmtzcGFjZVwiLCBcInRzLXdvcmtzcGFjZVwiLCBcIiR7bmFtZX1cIl0uZm9yRWFjaChcbiAgICAgIChlbCkgPT4gKHRoaXMucmVwbGFjZW1lbnRzW2VsXSA9IG5hbWUpXG4gICAgKTtcbiAgICBbXCJkZWNhZi10c1wiLCBcIiR7b3JnfVwiXS5mb3JFYWNoKFxuICAgICAgKGVsKSA9PiAodGhpcy5yZXBsYWNlbWVudHNbZWxdID0gKG9yZyBhcyBzdHJpbmcpIHx8ICdcIlwiJylcbiAgICApO1xuICAgIHRoaXMucmVwbGFjZW1lbnRzW1wiJHtvcmdfb3Jfb3duZXJ9XCJdID0gb3JnIHx8IG5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBmaWxlcyBmb3IgYSBzcGVjaWZpYyBvcHRpb24gY2F0ZWdvcnkuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGRvd25sb2FkcyBhbGwgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gb3B0aW9uIGtleSBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgcmVwcmVzZW50aW5nIHRoZSBvcHRpb24gY2F0ZWdvcnkgdG8gZG93bmxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgc3BlY2lmaWVkIG9wdGlvbiBrZXkgaXMgbm90IGZvdW5kXG4gICAqL1xuICBhc3luYyBkb3dubG9hZE9wdGlvbihrZXk6IGtleW9mIHR5cGVvZiBvcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCEoa2V5IGluIG9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBvcHRpb25zYCk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVzID0gb3B0aW9uc1trZXkgYXMga2V5b2YgdHlwZW9mIG9wdGlvbnNdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBEb3dubG9hZGluZyAke2ZpbGV9YCk7XG5cbiAgICAgIGxldCBkYXRhID0gYXdhaXQgSHR0cENsaWVudC5kb3dubG9hZEZpbGUoYCR7YmFzZVVybH0vJHtmaWxlfWApO1xuICAgICAgZGF0YSA9IHBhdGNoU3RyaW5nKGRhdGEsIHRoaXMucmVwbGFjZW1lbnRzKTtcbiAgICAgIHdyaXRlRmlsZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZSksIGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGFuZCBzZXRzIHVwIHRoZSBzcGVjaWZpZWQgbGljZW5zZS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgZG93bmxvYWRzIHRoZSBjaG9zZW4gbGljZW5zZSBmaWxlLCBzYXZlcyBpdCB0byB0aGUgcHJvamVjdCwgYW5kIHVwZGF0ZXMgdGhlIHBhY2thZ2UuanNvbiBsaWNlbnNlIGZpZWxkLlxuICAgKiBAcGFyYW0ge1wiTUlUXCIgfCBcIkdQTFwiIHwgXCJBcGFjaGVcIiB8IFwiTEdQTFwiIHwgXCJBR1BMXCJ9IGxpY2Vuc2UgLSBUaGUgbGljZW5zZSB0byBkb3dubG9hZCBhbmQgc2V0IHVwXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0TGljZW5zZShsaWNlbnNlOiBcIk1JVFwiIHwgXCJHUExcIiB8IFwiQXBhY2hlXCIgfCBcIkxHUExcIiB8IFwiQUdQTFwiKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgRG93bmxvYWRpbmcgJHtsaWNlbnNlfSBsaWNlbnNlYCk7XG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vd29ya2RvY3MvbGljZW5zZXMvJHtsaWNlbnNlfS5tZGA7XG4gICAgbGV0IGRhdGEgPSBhd2FpdCBIdHRwQ2xpZW50LmRvd25sb2FkRmlsZSh1cmwpO1xuICAgIGRhdGEgPSBwYXRjaFN0cmluZyhkYXRhLCB0aGlzLnJlcGxhY2VtZW50cyk7XG4gICAgd3JpdGVGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIkxJQ0VOU0UubWRcIiksIGRhdGEpO1xuICAgIHNldFBhY2thZ2VBdHRyaWJ1dGUoXCJsaWNlbnNlXCIsIGxpY2Vuc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgSURFIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0SWRlKCkge1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCIuaWRlYVwiLCBcInJ1bkNvbmZpZ3VyYXRpb25zXCIpLCB7XG4gICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5kb3dubG9hZE9wdGlvbihcImlkZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIG5wbSBzY3JpcHRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0U2NyaXB0cygpIHtcbiAgICBhd2FpdCB0aGlzLmRvd25sb2FkT3B0aW9uKFwic2NyaXB0c1wiKTtcbiAgICB0aGlzLmxvZy5pbmZvKFwicGxlYXNlIHJlLXJ1biB0aGUgY29tbWFuZFwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBzdHlsZSBjb25maWd1cmF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFN0eWxlcyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJzdHlsZXNcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgdGVtcGxhdGUgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0VGVtcGxhdGVzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcInRlbXBsYXRlc1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyB3b3JrZmxvdyBjb25maWd1cmF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFdvcmtmbG93cyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJ3b3JrZmxvd3NcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgZG9jdW1lbnRhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXREb2NzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcImRvY3NcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgdHlwZXNjcmlwdCBjb25maWcgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0VHlwZXNjcmlwdCA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJ0eXBlc2NyaXB0XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGF1dG9tYXRpb24gZG9jdW1lbnRhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRBdXRvbWF0aW9uID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcImF1dG9tYXRpb25cIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgYXV0b21hdGlvbiBkb2N1bWVudGF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFRlc3RzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcInRlc3RzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGRvY2tlciBpbWFnZSBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXREb2NrZXIgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwiZG9ja2VyXCIpO1xuXG4gIGFzeW5jIGluaXRQYWNrYWdlKHBrZ05hbWU6IHN0cmluZywgYXV0aG9yOiBzdHJpbmcsIGxpY2Vuc2U6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwa2cgPSBnZXRQYWNrYWdlKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBkZWxldGUgcGtnW1NldHVwU2NyaXB0S2V5XTtcbiAgICAgIHBrZy5uYW1lID0gcGtnTmFtZTtcbiAgICAgIHBrZy52ZXJzaW9uID0gXCIwLjAuMVwiO1xuICAgICAgcGtnLmF1dGhvciA9IGF1dGhvcjtcbiAgICAgIHBrZy5saWNlbnNlID0gbGljZW5zZTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXCJwYWNrYWdlLmpzb25cIiwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmaXhpbmcgcGFja2FnZS5qc29uOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlUGFja2FnZVNjcmlwcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxQa2cgPSBKU09OLnBhcnNlKFxuICAgICAgICBhd2FpdCBIdHRwQ2xpZW50LmRvd25sb2FkRmlsZShgJHtiYXNlVXJsfS9wYWNrYWdlLmpzb25gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgc2NyaXB0cyB9ID0gb3JpZ2luYWxQa2c7XG5cbiAgICAgIGNvbnN0IHBrZzogdHlwZW9mIG9yaWdpbmFsUGtnID0gZ2V0UGFja2FnZSgpIGFzIHtcbiAgICAgICAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgIH07XG4gICAgICBPYmplY3Qua2V5cyhwa2cuc2NyaXB0cykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gc2NyaXB0cykge1xuICAgICAgICAgIGNvbnN0IHJlcGxhY2VkID0gcGF0Y2hTdHJpbmcoc2NyaXB0c1trZXldLCB0aGlzLnJlcGxhY2VtZW50cyk7XG4gICAgICAgICAgaWYgKHJlcGxhY2VkICE9PSBzY3JpcHRzW2tleV0pIHtcbiAgICAgICAgICAgIHBrZy5zY3JpcHRzW2tleV0gPSByZXBsYWNlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBwa2dbXCJleHBvcnRzXCJdW1wicmVxdWlyZVwiXSA9IG9yaWdpbmFsUGtnW1wiZXhwb3J0c1wiXVtcInJlcXVpcmVcIl07XG4gICAgICBwa2dbXCJleHBvcnRzXCJdW1wiaW1wb3J0XCJdID0gb3JpZ2luYWxQa2dbXCJleHBvcnRzXCJdW1wiaW1wb3J0XCJdO1xuICAgICAgcGtnW1widHlwZXNcIl0gPSBvcmlnaW5hbFBrZ1tcInR5cGVzXCJdO1xuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFwicGFja2FnZS5qc29uXCIsIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZml4aW5nIHBhY2thZ2UuanNvbiBzY3JpcHRzOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlVG9rZW5GaWxlcygpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGVUb2tlbkZpbGVzKTtcbiAgICBjb25zdCBnaXRUb2tlbiA9IGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgXCJ0b2tlblwiLFxuICAgICAgXCJwbGVhc2UgaW5wdXQgeW91ciBnaXRodWIgdG9rZW5cIixcbiAgICAgIChyZXM6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gISFyZXMubWF0Y2goL15naHBfWzAtOWEtekEtWl17MzZ9JC9nKTtcbiAgICAgIH1cbiAgICApO1xuICAgIE9iamVjdC52YWx1ZXMoVG9rZW5zKS5mb3JFYWNoKCh0b2tlbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHN0YXR1cztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGF0dXMgPSBmcy5leGlzdHNTeW5jKHRva2VuKTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuaW5mbyhgVG9rZW4gZmlsZSAke3Rva2VufSBub3QgZm91bmQuIENyZWF0aW5nIGEgbmV3IG9uZS4uLmApO1xuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModG9rZW4sIHRva2VuID09PSBcIi50b2tlblwiID8gZ2l0VG9rZW4gOiBcIlwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRva2VuLCB0b2tlbiA9PT0gXCIudG9rZW5cIiA/IGdpdFRva2VuIDogXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBjcmVhdGluZyB0b2tlbiBmaWxlICR7dG9rZW59OiAke2V9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRPcmcoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBvcmcgPSBhd2FpdCBVc2VySW5wdXQuYXNrVGV4dChcbiAgICAgIFwiT3JnYW5pemF0aW9uXCIsXG4gICAgICBcIkVudGVyIHRoZSBvcmdhbml6YXRpb24gbmFtZSAod2lsbCBiZSB1c2VkIHRvIHNjb3BlIHlvdXIgbnBtIHByb2plY3QuIGxlYXZlIGJsYW5rIHRvIGNyZWF0ZSBhIHVuc2NvcGVkIHByb2plY3QpOlwiXG4gICAgKTtcbiAgICBjb25zdCBjb25maXJtYXRpb24gPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgXCJDb25maXJtIG9yZ2FuaXphdGlvblwiLFxuICAgICAgXCJJcyB0aGlzIG9yZ2FuaXphdGlvbiBjb3JyZWN0P1wiLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgaWYgKCFjb25maXJtYXRpb24pIHJldHVybiB0aGlzLmdldE9yZygpO1xuXG4gICAgcmV0dXJuIG9yZztcbiAgfVxuXG4gIGFzeW5jIGF1ZGl0Rml4KCkge1xuICAgIHJldHVybiBhd2FpdCBydW5Db21tYW5kKFwibnBtIGF1ZGl0IGZpeCAtLWZvcmNlXCIpLnByb21pc2U7XG4gIH1cblxuICBwYXRjaEZpbGVzKCkge1xuICAgIGNvbnN0IGZpbGVzID0gW1xuICAgICAgLi4uZnNcbiAgICAgICAgLnJlYWRkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInNyY1wiKSwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNGaWxlKCkpXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiBwYXRoLmpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpLFxuICAgICAgLi4uZnNcbiAgICAgICAgLnJlYWRkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIndvcmtkb2NzXCIpLCB7XG4gICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLm1kXCIpKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4gcGF0aC5qb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi5naXRsYWItY2kueW1sXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwid29ya2RvY3NcIiwgXCJqc2RvY3MuanNvblwiKSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBwYXRjaEZpbGUoZmlsZSBhcyBzdHJpbmcsIHRoaXMucmVwbGFjZW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXBlbmRlbmNpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsUGtnID0gSlNPTi5wYXJzZShcbiAgICAgICAgYXdhaXQgSHR0cENsaWVudC5kb3dubG9hZEZpbGUoYCR7YmFzZVVybH0vcGFja2FnZS5qc29uYClcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRldkRlcGVuZGVuY2llcyB9ID0gb3JpZ2luYWxQa2c7XG5cbiAgICAgIGNvbnN0IHBrZzogdHlwZW9mIG9yaWdpbmFsUGtnID0gZ2V0UGFja2FnZSgpIGFzIHtcbiAgICAgICAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgIH07XG4gICAgICBPYmplY3Qua2V5cyhwa2cuc2NyaXB0cykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gZGV2RGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgY29uc3QgcmVwbGFjZWQgPSBkZXZEZXBlbmRlbmNpZXNba2V5XTtcbiAgICAgICAgICBpZiAocmVwbGFjZWQgIT09IGRldkRlcGVuZGVuY2llc1trZXldKSB7XG4gICAgICAgICAgICAocGtnIGFzIGFueSlbXCJkZXZEZXBlbmRlbmNpZXNcIl0gPVxuICAgICAgICAgICAgICAocGtnIGFzIGFueSlbXCJkZXZEZXBlbmRlbmNpZXNcIl0gfHwge307XG4gICAgICAgICAgICAocGtnIGFzIGFueSlbXCJkZXZEZXBlbmRlbmNpZXNcIl1ba2V5XSA9IHJlcGxhY2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXCJwYWNrYWdlLmpzb25cIiwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKFwibnBtIGluc3RhbGxcIikucHJvbWlzZTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpeGluZyBwYWNrYWdlLmpzb24gZGVwZW5kZW5jaWVzOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSdW5zIHRoZSB0ZW1wbGF0ZSBzeW5jaHJvbml6YXRpb24gcHJvY2Vzcy5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgb3JjaGVzdHJhdGVzIHRoZSBkb3dubG9hZGluZyBvZiB2YXJpb3VzIHByb2plY3QgY29tcG9uZW50cyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1BhcnNlQXJnc1Jlc3VsdH0gYXJncyAtIFRoZSBwYXJzZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVCBhcyBUZW1wbGF0ZVN5bmNcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIGdldExpY2Vuc2VcbiAgICogICBwYXJ0aWNpcGFudCBJIGFzIGdldElkZVxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgZ2V0U2NyaXB0c1xuICAgKiAgIHBhcnRpY2lwYW50IFN0IGFzIGdldFN0eWxlc1xuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgZ2V0RG9jc1xuICAgKiAgIHBhcnRpY2lwYW50IFcgYXMgZ2V0V29ya2Zsb3dzXG4gICAqICAgcGFydGljaXBhbnQgVGUgYXMgZ2V0VGVtcGxhdGVzXG4gICAqICAgVC0+PlQ6IFBhcnNlIGFyZ3VtZW50c1xuICAgKiAgIGFsdCBhbGwgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+VDogU2V0IGFsbCBjb21wb25lbnQgZmxhZ3MgdG8gdHJ1ZVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBsaWNlbnNlIGlzIHNwZWNpZmllZFxuICAgKiAgICAgVC0+Pkw6IGdldExpY2Vuc2UobGljZW5zZSlcbiAgICogICBlbmRcbiAgICogICBhbHQgaWRlIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+Pkk6IGdldElkZSgpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IHNjcmlwdHMgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+UzogZ2V0U2NyaXB0cygpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IHN0eWxlcyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5TdDogZ2V0U3R5bGVzKClcbiAgICogICBlbmRcbiAgICogICBhbHQgZG9jcyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5EOiBnZXREb2NzKClcbiAgICogICBlbmRcbiAgICogICBhbHQgd29ya2Zsb3dzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+Plc6IGdldFdvcmtmbG93cygpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IHRlbXBsYXRlcyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5UZTogZ2V0VGVtcGxhdGVzKClcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICBhcmdzOiBMb2dnaW5nQ29uZmlnICZcbiAgICAgIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcyAmIHsgW2sgaW4ga2V5b2YgdHlwZW9mIGFyZ3p6XTogdW5rbm93biB9XG4gICkge1xuICAgIGxldCB7IGxpY2Vuc2UgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBib290IH0gPSBhcmdzO1xuICAgIGxldCB7XG4gICAgICBhbGwsXG4gICAgICBzY3JpcHRzLFxuICAgICAgc3R5bGVzLFxuICAgICAgZG9jcyxcbiAgICAgIGlkZSxcbiAgICAgIHdvcmtmbG93cyxcbiAgICAgIHRlbXBsYXRlcyxcbiAgICAgIGRvY2tlcixcbiAgICAgIHR5cGVzY3JpcHQsXG4gICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICB0ZXN0cyxcbiAgICAgIGF1dG9tYXRpb24sXG4gICAgICBwa2csXG4gICAgfSA9IGFyZ3M7XG4gICAgaWYgKFxuICAgICAgc2NyaXB0cyB8fFxuICAgICAgc3R5bGVzIHx8XG4gICAgICBkb2NzIHx8XG4gICAgICBpZGUgfHxcbiAgICAgIHdvcmtmbG93cyB8fFxuICAgICAgdGVtcGxhdGVzIHx8XG4gICAgICBkb2NrZXIgfHxcbiAgICAgIHR5cGVzY3JpcHQgfHxcbiAgICAgIGF1dG9tYXRpb24gfHxcbiAgICAgIGRlcGVuZGVuY2llcyB8fFxuICAgICAgdGVzdHMgfHxcbiAgICAgIHBrZ1xuICAgIClcbiAgICAgIGFsbCA9IGZhbHNlO1xuXG4gICAgaWYgKGJvb3QpIHtcbiAgICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMuZ2V0T3JnKCk7XG4gICAgICBjb25zdCBuYW1lID0gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwiUHJvamVjdCBuYW1lXCIsXG4gICAgICAgIFwiRW50ZXIgdGhlIHByb2plY3QgbmFtZTpcIixcbiAgICAgICAgKHJlczogc3RyaW5nKSA9PiByZXMubGVuZ3RoID4gMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGF1dGhvciA9IGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgICBcIkF1dGhvclwiLFxuICAgICAgICBcIkVudGVyIHRoZSBhdXRob3IgbmFtZTpcIixcbiAgICAgICAgKHJlczogc3RyaW5nKSA9PiByZXMubGVuZ3RoID4gMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBrZ05hbWUgPSBvcmcgPyBgQCR7b3JnfS8ke25hbWV9YCA6IG5hbWU7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW5pdFBhY2thZ2UocGtnTmFtZSwgYXV0aG9yLCBsaWNlbnNlIGFzIHN0cmluZyk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRva2VuRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMuYXVkaXRGaXgoKTtcbiAgICAgIHRoaXMucGF0Y2hGaWxlcygpO1xuICAgIH1cblxuICAgIGlmIChhbGwpIHtcbiAgICAgIHNjcmlwdHMgPSBmYWxzZTtcbiAgICAgIHN0eWxlcyA9IHRydWU7XG4gICAgICBkb2NzID0gdHJ1ZTtcbiAgICAgIGlkZSA9IHRydWU7XG4gICAgICB3b3JrZmxvd3MgPSB0cnVlO1xuICAgICAgdGVtcGxhdGVzID0gdHJ1ZTtcbiAgICAgIGRvY2tlciA9IHRydWU7XG4gICAgICB0eXBlc2NyaXB0ID0gdHJ1ZTtcbiAgICAgIHBrZyA9IHRydWU7XG4gICAgICBkZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgdGVzdHMgPSB0cnVlO1xuICAgICAgYXV0b21hdGlvbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2NyaXB0cyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHNjcmlwdHMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInNjcmlwdHNcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgc2NyaXB0cz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgIGlmIChzY3JpcHRzKSBhd2FpdCB0aGlzLmdldFNjcmlwdHMoKTtcblxuICAgIHRoaXMubG9hZFZhbHVlc0Zyb21QYWNrYWdlKCk7XG4gICAgaWYgKCFhbGwgJiYgdHlwZW9mIGxpY2Vuc2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwibGljZW5zZVwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHNldCBhIGxpY2Vuc2U/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpZiAoY29uZmlybWF0aW9uKVxuICAgICAgICBsaWNlbnNlID0gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgICAgXCJsaWNlbnNlXCIsXG4gICAgICAgICAgXCJFbnRlciB0aGUgZGVzaXJlZCBMaWNlbnNlIChNSVR8R1BMfEFwYWNoZXxMR1BMfEFHUEwpOlwiLFxuICAgICAgICAgICh2YWwpID0+ICEhdmFsICYmICEhdmFsLm1hdGNoKC9eKE1JVHxHUEx8QXBhY2hlfExHUEx8QUdQTCkkL2cpXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGljZW5zZSAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TGljZW5zZShcbiAgICAgICAgbGljZW5zZSBhcyBcIk1JVFwiIHwgXCJHUExcIiB8IFwiQXBhY2hlXCIgfCBcIkxHUExcIiB8IFwiQUdQTFwiXG4gICAgICApO1xuXG4gICAgaWYgKHR5cGVvZiBpZGUgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBpZGUgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImlkZVwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBpZGUgY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgIGlmIChpZGUpIGF3YWl0IHRoaXMuZ2V0SWRlKCk7XG5cbiAgICBpZiAodHlwZW9mIHR5cGVzY3JpcHQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0eXBlc2NyaXB0ID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHR5cGVzY3JpcHQgY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAodHlwZXNjcmlwdCkgYXdhaXQgdGhpcy5nZXRUeXBlc2NyaXB0KCk7XG5cbiAgICBpZiAodHlwZW9mIGRvY2tlciA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGRvY2tlciA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiZG9ja2VyXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IGRvY2tlciBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgaWYgKGRvY2tlcikgYXdhaXQgdGhpcy5nZXREb2NrZXIoKTtcbiAgICBpZiAodHlwZW9mIGF1dG9tYXRpb24gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBhdXRvbWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJhdXRvbWF0aW9uXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IGF1dG9tYXRpb24gY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAoYXV0b21hdGlvbikgYXdhaXQgdGhpcy5nZXRBdXRvbWF0aW9uKCk7XG5cbiAgICBpZiAodHlwZW9mIHN0eWxlcyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHN0eWxlcyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwic3R5bGVzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHN0eWxlcz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAoc3R5bGVzKSBhd2FpdCB0aGlzLmdldFN0eWxlcygpO1xuXG4gICAgaWYgKHR5cGVvZiBkb2NzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgZG9jcyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiZG9jc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBkb2NzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChkb2NzKSBhd2FpdCB0aGlzLmdldERvY3MoKTtcbiAgICBpZiAodHlwZW9mIHdvcmtmbG93cyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHdvcmtmbG93cyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwid29ya2Zsb3dzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHdvcmtmbG93cz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAod29ya2Zsb3dzKSBhd2FpdCB0aGlzLmdldFdvcmtmbG93cygpO1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgdGVtcGxhdGVzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJ0ZW1wbGF0ZXNcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgdGVtcGxhdGVzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmICh0ZW1wbGF0ZXMpIGF3YWl0IHRoaXMuZ2V0VGVtcGxhdGVzKCk7XG4gICAgaWYgKHR5cGVvZiBwa2cgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBwa2cgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInBrZ1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHVwZGF0ZSB5b3VyIHBhY2thZ2UuanNvbiBzY3JpcHRzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChwa2cpIGF3YWl0IHRoaXMudXBkYXRlUGFja2FnZVNjcmlwcygpO1xuXG4gICAgaWYgKHR5cGVvZiB0ZXN0cyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHRlc3RzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJwa2dcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byB1cGRhdGUgeW91ciB0ZXN0IGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHRlc3RzKSBhd2FpdCB0aGlzLmdldFRlc3RzKCk7XG5cbiAgICBpZiAodHlwZW9mIGRlcGVuZGVuY2llcyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGRlcGVuZGVuY2llcyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwicGtnXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gdXBkYXRlIGRldiBkZXBlbmRlbmNpZXM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKGRlcGVuZGVuY2llcykgYXdhaXQgdGhpcy51cGRhdGVEZXBlbmRlbmNpZXMoKTtcbiAgfVxufVxuIl19