gitlab-ci-local 4.53.0 → 4.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/utils.js CHANGED
@@ -1,65 +1,36 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.Utils = void 0;
30
- const chalk_1 = __importDefault(require("chalk"));
31
- const job_1 = require("./job");
32
- const fs = __importStar(require("fs-extra"));
33
- const checksum_1 = __importDefault(require("checksum"));
34
- const base64url_1 = __importDefault(require("base64url"));
35
- const execa_1 = __importDefault(require("execa"));
36
- const assert_1 = __importDefault(require("assert"));
37
- const git_data_1 = require("./git-data");
38
- const globby_1 = __importDefault(require("globby"));
39
- const micromatch_1 = __importDefault(require("micromatch"));
40
- const axios_1 = __importDefault(require("axios"));
41
- const path_1 = __importDefault(require("path"));
42
- class Utils {
1
+ import chalk from "chalk";
2
+ import { Job } from "./job.js";
3
+ import fs from "fs-extra";
4
+ import checksum from "checksum";
5
+ import base64url from "base64url";
6
+ import execa from "execa";
7
+ import assert from "assert";
8
+ import { GitData } from "./git-data.js";
9
+ import globby from "globby";
10
+ import micromatch from "micromatch";
11
+ import axios from "axios";
12
+ import path from "path";
13
+ export class Utils {
43
14
  static bash(shellScript, cwd = process.cwd()) {
44
- return (0, execa_1.default)(shellScript, { shell: "bash", cwd });
15
+ return execa(shellScript, { shell: "bash", cwd });
45
16
  }
46
17
  static spawn(cmdArgs, cwd = process.cwd()) {
47
- return (0, execa_1.default)(cmdArgs[0], cmdArgs.slice(1), { cwd });
18
+ return execa(cmdArgs[0], cmdArgs.slice(1), { cwd });
48
19
  }
49
20
  static syncSpawn(cmdArgs, cwd = process.cwd()) {
50
- return execa_1.default.sync(cmdArgs[0], cmdArgs.slice(1), { cwd });
21
+ return execa.sync(cmdArgs[0], cmdArgs.slice(1), { cwd });
51
22
  }
52
23
  static fsUrl(url) {
53
24
  return url.replace(/^https:\/\//g, "").replace(/^http:\/\//g, "");
54
25
  }
55
26
  static safeDockerString(jobName) {
56
27
  return jobName.replace(/[^\w-]+/g, (match) => {
57
- return base64url_1.default.encode(match);
28
+ return base64url.encode(match);
58
29
  });
59
30
  }
60
31
  static forEachRealJob(gitlabData, callback) {
61
32
  for (const [jobName, jobData] of Object.entries(gitlabData)) {
62
- if (job_1.Job.illegalJobNames.has(jobName) || jobName[0].startsWith(".")) {
33
+ if (Job.illegalJobNames.has(jobName) || jobName[0].startsWith(".")) {
63
34
  continue;
64
35
  }
65
36
  callback(jobName, jobData);
@@ -90,10 +61,10 @@ class Utils {
90
61
  }
91
62
  static printJobNames(stream, job, i, arr) {
92
63
  if (i === arr.length - 1) {
93
- stream((0, chalk_1.default) `{blueBright ${job.name}}`);
64
+ stream(chalk `{blueBright ${job.name}}`);
94
65
  }
95
66
  else {
96
- stream((0, chalk_1.default) `{blueBright ${job.name}}, `);
67
+ stream(chalk `{blueBright ${job.name}}, `);
97
68
  }
98
69
  }
99
70
  static expandTextWith(text, expandWith) {
@@ -107,12 +78,8 @@ class Utils {
107
78
  }
108
79
  else {
109
80
  const name = var1 || var2;
110
- (0, assert_1.default)(name, "unexpected unset capture group");
111
- let value = `${expandWith.variable(name)}`;
112
- if (value.startsWith("\"/") && value.endsWith("/\"")) {
113
- value = value.substring(1).slice(0, -1);
114
- }
115
- return `${value}`;
81
+ assert(name, "unexpected unset capture group");
82
+ return `${expandWith.variable(name)}`;
116
83
  }
117
84
  });
118
85
  }
@@ -125,7 +92,7 @@ class Utils {
125
92
  static expandVariables(variables) {
126
93
  let expandedAnyVariables, i = 0;
127
94
  do {
128
- (0, assert_1.default)(i < 100, "Recursive variable expansion reached 100 iterations");
95
+ assert(i < 100, "Recursive variable expansion reached 100 iterations");
129
96
  expandedAnyVariables = false;
130
97
  for (const [k, v] of Object.entries(variables)) {
131
98
  const envsWithoutSelf = { ...variables };
@@ -203,22 +170,77 @@ class Utils {
203
170
  unescape: JSON.stringify("$"),
204
171
  variable: (name) => JSON.stringify(envs[name] ?? null).replaceAll("\\\\", "\\"),
205
172
  });
206
- // Convert =~ to match function
207
- evalStr = evalStr.replace(/\s*=~\s*(\/.*?\/[igmsuy]*)(?:\s|$)/g, ".match($1) != null");
208
- evalStr = evalStr.replace(/\s*=~\s(.+?)(\)*?)(?:\s|$)/g, ".match(new RegExp($1)) != null$2"); // Without forward slashes
209
- // Convert !~ to match function
210
- evalStr = evalStr.replace(/\s*!~\s*(\/.*?\/[igmsuy]*)(?:\s|$)/g, ".match($1) == null");
211
- evalStr = evalStr.replace(/\s*!~\s(.+?)(\)*?)(?:\s|$)/g, ".match(new RegExp($1)) == null$2"); // Without forward slashes
173
+ const expandedEvalStr = evalStr;
174
+ // Scenario when RHS is a <regex>
175
+ // https://regexr.com/85sjo
176
+ const pattern1 = /\s*(?<operator>(?:=~)|(?:!~))\s*(?<rhs>\/.*?\/)(?<flags>[igmsuy]*)(\s|$|\))/g;
177
+ evalStr = evalStr.replace(pattern1, (_, operator, rhs, flags, remainingTokens) => {
178
+ let _operator;
179
+ switch (operator) {
180
+ case "=~":
181
+ _operator = "!=";
182
+ break;
183
+ case "!~":
184
+ _operator = "==";
185
+ break;
186
+ default:
187
+ throw operator;
188
+ }
189
+ return `.match(${rhs}${flags})${remainingTokens} ${_operator} null `;
190
+ });
191
+ // Scenario when RHS is surrounded by double-quotes
192
+ // https://regexr.com/85t0g
193
+ const pattern2 = /\s*(?<operator>(?:=~)|(?:!~))\s*"(?<rhs>[^"\\]*(?:\\.[^"\\]*)*)"/g;
194
+ evalStr = evalStr.replace(pattern2, (_, operator, rhs) => {
195
+ let _operator;
196
+ switch (operator) {
197
+ case "=~":
198
+ _operator = "!=";
199
+ break;
200
+ case "!~":
201
+ _operator = "==";
202
+ break;
203
+ default:
204
+ throw operator;
205
+ }
206
+ if (!/\/(.*)\/([\w]*)/.test(rhs)) {
207
+ throw Error(`RHS (${rhs}) must be a regex pattern. Do not rely on this behavior!
208
+ Refer to https://docs.gitlab.com/ee/ci/jobs/job_rules.html#unexpected-behavior-from-regular-expression-matching-with- for more info...`);
209
+ }
210
+ const regex = /\/(?<pattern>.*)\/(?<flags>[igmsuy]*)/;
211
+ const _rhs = rhs.replace(regex, (_, pattern, flags) => {
212
+ const _pattern = pattern.replace(/(?<!\\)\//g, "\\/"); // escape potentially unescaped `/` that's in the pattern
213
+ return `/${_pattern}/${flags}`;
214
+ });
215
+ return `.match(new RegExp(${_rhs})) ${_operator} null`;
216
+ });
212
217
  // Convert all null.match functions to false
213
- evalStr = evalStr.replace(/null.match\(.+?\) != null/g, "false");
214
- evalStr = evalStr.replace(/null.match\(.+?\) == null/g, "false");
215
- return Boolean(eval(evalStr));
218
+ evalStr = evalStr.replace(/null.match\(.+?\)\s*!=\s*null/g, "false");
219
+ evalStr = evalStr.replace(/null.match\(.+?\)\s*==\s*null/g, "false");
220
+ evalStr = evalStr.trim();
221
+ let res;
222
+ try {
223
+ res = (0, eval)(evalStr); // https://esbuild.github.io/content-types/#direct-eval
224
+ }
225
+ catch (err) {
226
+ console.log(`
227
+ Error attempting to evaluate the following rules:
228
+ rules:
229
+ - if: '${expandedEvalStr}'
230
+ as
231
+ \`\`\`javascript
232
+ ${evalStr}
233
+ \`\`\`
234
+ `);
235
+ throw err;
236
+ }
237
+ return Boolean(res);
216
238
  }
217
239
  static evaluateRuleExist(cwd, ruleExists) {
218
240
  if (ruleExists === undefined)
219
241
  return true;
220
242
  for (const pattern of ruleExists) {
221
- if (globby_1.default.sync(pattern, { dot: true, cwd }).length > 0) {
243
+ if (globby.sync(pattern, { dot: true, cwd }).length > 0) {
222
244
  return true;
223
245
  }
224
246
  }
@@ -233,7 +255,7 @@ class Utils {
233
255
  // NOTE: https://docs.gitlab.com/ee/ci/yaml/#ruleschanges
234
256
  // Glob patterns are interpreted with Ruby's [File.fnmatch](https://docs.ruby-lang.org/en/master/File.html#method-c-fnmatch)
235
257
  // with the flags File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB.
236
- return micromatch_1.default.some(git_data_1.GitData.changedFiles(`origin/${defaultBranch}`), ruleChanges, {
258
+ return micromatch.some(GitData.changedFiles(`origin/${defaultBranch}`), ruleChanges, {
237
259
  nonegate: true,
238
260
  noextglob: true,
239
261
  posix: false,
@@ -251,8 +273,8 @@ class Utils {
251
273
  files.forEach((file) => {
252
274
  promises.push(new Promise((resolve, reject) => {
253
275
  if (!fs.pathExistsSync(file))
254
- resolve(path_1.default.relative(cwd, file)); // must use relative path here, so that checksum can be deterministic when running the unit tests
255
- checksum_1.default.file(file, (err, hash) => {
276
+ resolve(path.relative(cwd, file)); // must use relative path here, so that checksum can be deterministic when running the unit tests
277
+ checksum.file(file, (err, hash) => {
256
278
  if (err) {
257
279
  return reject(err);
258
280
  }
@@ -261,7 +283,7 @@ class Utils {
261
283
  }));
262
284
  });
263
285
  const result = await Promise.all(promises);
264
- return (0, checksum_1.default)(result.join(""));
286
+ return checksum(result.join(""));
265
287
  }
266
288
  static isObject(v) {
267
289
  return Object.getPrototypeOf(v) === Object.prototype;
@@ -282,7 +304,7 @@ class Utils {
282
304
  case "http":
283
305
  case "https": {
284
306
  try {
285
- const { status } = await axios_1.default.get(`${protocol}://${domain}/${projectPath}/-/raw/${ref}/${file}`);
307
+ const { status } = await axios.get(`${protocol}://${domain}:${port}/${projectPath}/-/raw/${ref}/${file}`);
286
308
  return (status === 200);
287
309
  }
288
310
  catch (e) {
@@ -302,5 +324,4 @@ class Utils {
302
324
  throw new Error(`Unhandled case ${param}`);
303
325
  }
304
326
  }
305
- exports.Utils = Utils;
306
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQiwrQkFBbUM7QUFDbkMsNkNBQStCO0FBQy9CLHdEQUFnQztBQUNoQywwREFBa0M7QUFDbEMsa0RBQTBCO0FBQzFCLG9EQUE0QjtBQUU1Qix5Q0FBOEM7QUFDOUMsb0RBQTRCO0FBQzVCLDREQUFvQztBQUNwQyxrREFBMEI7QUFDMUIsZ0RBQXdCO0FBYXhCLE1BQWEsS0FBSztJQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUUsV0FBbUIsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUNqRCxPQUFPLElBQUEsZUFBSyxFQUFDLFdBQVcsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBRSxPQUFpQixFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ2hELE9BQU8sSUFBQSxlQUFLLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFFLE9BQWlCLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDcEQsT0FBTyxlQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBRSxHQUFXO1FBQ3JCLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVB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Q0FBQzt3QkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4RyxPQUFPLEtBQUssQ0FBQztnQkFDakIsQ0FBQztZQUVMLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNYLElBQUksQ0FBQztvQkFDRCxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxlQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxNQUFNLE1BQU0sSUFBSSxXQUFXLFVBQVUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2hHLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzVCLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDVCxPQUFPLEtBQUssQ0FBQztnQkFDakIsQ0FBQztZQUNMLENBQUM7WUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNOLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFFLEdBQVcsRUFBRSxNQUFjO1FBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNyRSxDQUFDO0lBRUQsTUFBTSxDQUFDLDhCQUE4QixDQUFFLEtBQVk7UUFDL0MscUVBQXFFO1FBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNKO0FBbFNELHNCQWtTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7Sm9iLCBKb2JSdWxlfSBmcm9tIFwiLi9qb2JcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0IGNoZWNrc3VtIGZyb20gXCJjaGVja3N1bVwiO1xuaW1wb3J0IGJhc2U2NHVybCBmcm9tIFwiYmFzZTY0dXJsXCI7XG5pbXBvcnQgZXhlY2EgZnJvbSBcImV4ZWNhXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7Q0lDRFZhcmlhYmxlfSBmcm9tIFwiLi92YXJpYWJsZXMtZnJvbS1maWxlc1wiO1xuaW1wb3J0IHtHaXREYXRhLCBHaXRTY2hlbWF9IGZyb20gXCIuL2dpdC1kYXRhXCI7XG5pbXBvcnQgZ2xvYmJ5IGZyb20gXCJnbG9iYnlcIjtcbmltcG9ydCBtaWNyb21hdGNoIGZyb20gXCJtaWNyb21hdGNoXCI7XG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG50eXBlIFJ1bGVSZXN1bHRPcHQgPSB7XG4gICAgY3dkOiBzdHJpbmc7XG4gICAgcnVsZXM6IEpvYlJ1bGVbXTtcbiAgICB2YXJpYWJsZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xufTtcblxudHlwZSBFeHBhbmRXaXRoID0ge1xuICAgIHVuZXNjYXBlOiBzdHJpbmc7XG4gICAgdmFyaWFibGU6IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBVdGlscyB7XG4gICAgc3RhdGljIGJhc2ggKHNoZWxsU2NyaXB0OiBzdHJpbmcsIGN3ZCA9IHByb2Nlc3MuY3dkKCkpOiBQcm9taXNlPHtzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmc7IGV4aXRDb2RlOiBudW1iZXJ9PiB7XG4gICAgICAgIHJldHVybiBleGVjYShzaGVsbFNjcmlwdCwge3NoZWxsOiBcImJhc2hcIiwgY3dkfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHNwYXduIChjbWRBcmdzOiBzdHJpbmdbXSwgY3dkID0gcHJvY2Vzcy5jd2QoKSk6IFByb21pc2U8e3N0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZ30+IHtcbiAgICAgICAgcmV0dXJuIGV4ZWNhKGNtZEFyZ3NbMF0sIGNtZEFyZ3Muc2xpY2UoMSksIHtjd2R9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc3luY1NwYXduIChjbWRBcmdzOiBzdHJpbmdbXSwgY3dkID0gcHJvY2Vzcy5jd2QoKSk6IHtzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmd9IHtcbiAgICAgICAgcmV0dXJuIGV4ZWNhLnN5bmMoY21kQXJnc1swXSwgY21kQXJncy5zbGljZSgxKSwge2N3ZH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBmc1VybCAodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdXJsLnJlcGxhY2UoL15odHRwczpcXC9cXC8vZywgXCJcIikucmVwbGFjZSgvXmh0dHA6XFwvXFwvL2csIFwiXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBzYWZlRG9ja2VyU3RyaW5nIChqb2JOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGpvYk5hbWUucmVwbGFjZSgvW15cXHctXSsvZywgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYmFzZTY0dXJsLmVuY29kZShtYXRjaCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JFYWNoUmVhbEpvYiAoZ2l0bGFiRGF0YTogYW55LCBjYWxsYmFjazogKGpvYk5hbWU6IHN0cmluZywgam9iRGF0YTogYW55KSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYkRhdGFdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4oZ2l0bGFiRGF0YSkpIHtcbiAgICAgICAgICAgIGlmIChKb2IuaWxsZWdhbEpvYk5hbWVzLmhhcyhqb2JOYW1lKSB8fCBqb2JOYW1lWzBdLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhqb2JOYW1lLCBqb2JEYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRKb2JOYW1lc0Zyb21QcmV2aW91c1N0YWdlcyAoam9iczogUmVhZG9ubHlBcnJheTxKb2I+LCBzdGFnZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBjdXJyZW50Sm9iOiBKb2IpIHtcbiAgICAgICAgY29uc3Qgam9iTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGFnZUluZGV4ID0gc3RhZ2VzLmluZGV4T2YoY3VycmVudEpvYi5zdGFnZSk7XG4gICAgICAgIGpvYnMuZm9yRWFjaChqb2IgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhZ2VJbmRleCA9IHN0YWdlcy5pbmRleE9mKGpvYi5zdGFnZSk7XG4gICAgICAgICAgICBpZiAoc3RhZ2VJbmRleCA8IGN1cnJlbnRTdGFnZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgam9iTmFtZXMucHVzaChqb2IubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gam9iTmFtZXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGdldENvdmVyYWdlUGVyY2VudCAoY3dkOiBzdHJpbmcsIHN0YXRlRGlyOiBzdHJpbmcsIGNvdmVyYWdlUmVnZXg6IHN0cmluZywgam9iTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShgJHtjd2R9LyR7c3RhdGVEaXJ9L291dHB1dC8ke2pvYk5hbWV9LmxvZ2AsIFwidXRmOFwiKTtcblxuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoY292ZXJhZ2VSZWdleC5yZXBsYWNlKC9eXFwvLywgXCJcIikucmVwbGFjZSgvXFwvJC8sIFwiXCIpLCBcImdtXCIpO1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gQXJyYXkuZnJvbShjb250ZW50Lm1hdGNoQWxsKHJlZ2V4KSk7XG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiMFwiO1xuXG4gICAgICAgIGNvbnN0IGxhc3RNYXRjaCA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZGlnaXRzID0gL1xcZCsoPzpcXC5cXGQrKT8vLmV4ZWMobGFzdE1hdGNoWzFdID8/IGxhc3RNYXRjaFswXSk7XG4gICAgICAgIGlmICghZGlnaXRzKSByZXR1cm4gXCIwXCI7XG4gICAgICAgIHJldHVybiBkaWdpdHNbMF0gPz8gXCIwXCI7XG4gICAgfVxuXG4gICAgc3RhdGljIHByaW50Sm9iTmFtZXMgKHN0cmVhbTogKHR4dDogc3RyaW5nKSA9PiB2b2lkLCBqb2I6IHtuYW1lOiBzdHJpbmd9LCBpOiBudW1iZXIsIGFycjoge25hbWU6IHN0cmluZ31bXSkge1xuICAgICAgICBpZiAoaSA9PT0gYXJyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHN0cmVhbShjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYi5uYW1lfX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmVhbShjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYi5uYW1lfX0sIGApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXhwYW5kVGV4dFdpdGggKHRleHQ6IGFueSwgZXhwYW5kV2l0aDogRXhwYW5kV2l0aCkge1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZShcbiAgICAgICAgICAgIC8oXFwkXFwkKXxcXCRcXHsoW2EtekEtWl9dXFx3Kil9fFxcJChbYS16QS1aX11cXHcqKS9nLCAvLyBodHRwczovL3JlZ2V4ci5jb20vN3M0a2FcbiAgICAgICAgICAgIChfbWF0Y2gsIGVzY2FwZSwgdmFyMSwgdmFyMikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXNjYXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBhbmRXaXRoLnVuZXNjYXBlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB2YXIxIHx8IHZhcjI7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChuYW1lLCBcInVuZXhwZWN0ZWQgdW5zZXQgY2FwdHVyZSBncm91cFwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gYCR7ZXhwYW5kV2l0aC52YXJpYWJsZShuYW1lKX1gO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIlxcXCIvXCIpICYmIHZhbHVlLmVuZHNXaXRoKFwiL1xcXCJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc3RhdGljIGV4cGFuZFRleHQgKHRleHQ6IGFueSwgZW52czoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kVGV4dFdpdGgodGV4dCwge1xuICAgICAgICAgICAgdW5lc2NhcGU6IFwiJFwiLFxuICAgICAgICAgICAgdmFyaWFibGU6IChuYW1lKSA9PiBlbnZzW25hbWVdID8/IFwiXCIsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBleHBhbmRWYXJpYWJsZXMgKHZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgbGV0IGV4cGFuZGVkQW55VmFyaWFibGVzLCBpID0gMDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgYXNzZXJ0KGkgPCAxMDAsIFwiUmVjdXJzaXZlIHZhcmlhYmxlIGV4cGFuc2lvbiByZWFjaGVkIDEwMCBpdGVyYXRpb25zXCIpO1xuICAgICAgICAgICAgZXhwYW5kZWRBbnlWYXJpYWJsZXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZzV2l0aG91dFNlbGYgPSB7Li4udmFyaWFibGVzfTtcbiAgICAgICAgICAgICAgICBkZWxldGUgZW52c1dpdGhvdXRTZWxmW2tdO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSAkJCdzIGFyZSBjb252ZXJ0ZWQgdG8gc2luZ2xlICQncyBub3csIHRoZW4gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24sIHRoZXkgbWlnaHQgYmUgaW50ZXJwcmV0ZWQgYXMgdmFyaWFibGVzLCBldmVuXG4gICAgICAgICAgICAgICAgLy8gdGhvdWdoIHRoZXkgd2VyZSAqZXhwbGljaXRseSogZXNjYXBlZC4gVG8gd29yayBhcm91bmQgdGhpcyxcbiAgICAgICAgICAgICAgICAvLyBsZWF2ZSB0aGUgJyQkJ3MgYXMgdGhlIHNhbWUgdmFsdWUsIHRoZW4gb25seSB1bmVzY2FwZSB0aGVtIGF0XG4gICAgICAgICAgICAgICAgLy8gdGhlIHZlcnkgZW5kLlxuICAgICAgICAgICAgICAgIHZhcmlhYmxlc1trXSA9IFV0aWxzLmV4cGFuZFRleHRXaXRoKHYsIHtcbiAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGU6IFwiJCRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IChuYW1lKSA9PiBlbnZzV2l0aG91dFNlbGZbbmFtZV0gPz8gXCJcIixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBleHBhbmRlZEFueVZhcmlhYmxlcyB8fD0gdmFyaWFibGVzW2tdICE9PSB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSsrO1xuICAgICAgICB9IHdoaWxlIChleHBhbmRlZEFueVZhcmlhYmxlcyk7XG5cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgdW5zY2FwZSQkVmFyaWFibGVzICh2YXJpYWJsZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgIHZhcmlhYmxlc1trXSA9IFV0aWxzLmV4cGFuZFRleHQodiwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZmluZEVudk1hdGNoZWRWYXJpYWJsZXMgKHZhcmlhYmxlczoge1tuYW1lOiBzdHJpbmddOiBDSUNEVmFyaWFibGV9LCBmaWxlVmFyaWFibGVzRGlyPzogc3RyaW5nLCBlbnZpcm9ubWVudD86IHtuYW1lOiBzdHJpbmd9KSB7XG4gICAgICAgIGNvbnN0IGVudk1hdGNoZWRWYXJpYWJsZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2Ygdi5lbnZpcm9ubWVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZW52aXJvbm1lbnQ/Lm5hbWUubWF0Y2goZW50cnkucmVnZXhwKSB8fCBlbnRyeS5yZWdleHAuc291cmNlID09PSBcIi4qXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVWYXJpYWJsZXNEaXIgIT0gbnVsbCAmJiB2LnR5cGUgPT09IFwiZmlsZVwiICYmICFlbnRyeS5maWxlU291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZNYXRjaGVkVmFyaWFibGVzW2tdID0gYCR7ZmlsZVZhcmlhYmxlc0Rpcn0vJHtrfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5ta2RpcnBTeW5jKGAke2ZpbGVWYXJpYWJsZXNEaXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGAke2ZpbGVWYXJpYWJsZXNEaXJ9LyR7a31gLCBlbnRyeS5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlVmFyaWFibGVzRGlyICE9IG51bGwgJiYgdi50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5maWxlU291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZNYXRjaGVkVmFyaWFibGVzW2tdID0gYCR7ZmlsZVZhcmlhYmxlc0Rpcn0vJHtrfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5ta2RpcnBTeW5jKGAke2ZpbGVWYXJpYWJsZXNEaXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMoZW50cnkuZmlsZVNvdXJjZSwgYCR7ZmlsZVZhcmlhYmxlc0Rpcn0vJHtrfWApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52TWF0Y2hlZFZhcmlhYmxlc1trXSA9IGVudHJ5LmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnZNYXRjaGVkVmFyaWFibGVzO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRSdWxlc1Jlc3VsdCAob3B0OiBSdWxlUmVzdWx0T3B0LCBnaXREYXRhOiBHaXREYXRhLCBqb2JXaGVuOiBzdHJpbmcgPSBcIm9uX3N1Y2Nlc3NcIiwgam9iQWxsb3dGYWlsdXJlOiBib29sZWFuIHwge2V4aXRfY29kZXM6IG51bWJlciB8IG51bWJlcltdfSA9IGZhbHNlKToge3doZW46IHN0cmluZzsgYWxsb3dGYWlsdXJlOiBib29sZWFuIHwge2V4aXRfY29kZXM6IG51bWJlciB8IG51bWJlcltdfTsgdmFyaWFibGVzPzoge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9fSB7XG4gICAgICAgIGxldCB3aGVuID0gXCJuZXZlclwiO1xuXG4gICAgICAgIC8vIG9wdGlvbmFsIG1hbnVhbCBqb2JzIGFsbG93RmFpbHVyZSBkZWZhdWx0cyB0byB0cnVlIGh0dHBzOi8vZG9jcy5naXRsYWIuY29tL2VlL2NpL2pvYnMvam9iX2NvbnRyb2wuaHRtbCN0eXBlcy1vZi1tYW51YWwtam9ic1xuICAgICAgICBsZXQgYWxsb3dGYWlsdXJlID0gam9iV2hlbiA9PT0gXCJtYW51YWxcIiA/IHRydWUgOiBqb2JBbGxvd0ZhaWx1cmU7XG4gICAgICAgIGxldCBydWxlVmFyaWFibGU6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfSB8IHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2Ygb3B0LnJ1bGVzKSB7XG4gICAgICAgICAgICBpZiAoIVV0aWxzLmV2YWx1YXRlUnVsZUlmKHJ1bGUuaWYsIG9wdC52YXJpYWJsZXMpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghVXRpbHMuZXZhbHVhdGVSdWxlRXhpc3Qob3B0LmN3ZCwgcnVsZS5leGlzdHMpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghVXRpbHMuZXZhbHVhdGVSdWxlQ2hhbmdlcyhnaXREYXRhLmJyYW5jaGVzLmRlZmF1bHQsIHJ1bGUuY2hhbmdlcykpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICB3aGVuID0gcnVsZS53aGVuID8gcnVsZS53aGVuIDogam9iV2hlbjtcbiAgICAgICAgICAgIGFsbG93RmFpbHVyZSA9IHJ1bGUuYWxsb3dfZmFpbHVyZSA/PyBhbGxvd0ZhaWx1cmU7XG4gICAgICAgICAgICBydWxlVmFyaWFibGUgPSBydWxlLnZhcmlhYmxlcztcblxuICAgICAgICAgICAgYnJlYWs7IC8vIEVhcmx5IHJldHVybiwgd2lsbCBub3QgZXZhbHVhdGUgdGhlIHJlbWFpbmluZyBydWxlc1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHt3aGVuLCBhbGxvd0ZhaWx1cmUsIHZhcmlhYmxlczogcnVsZVZhcmlhYmxlfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXZhbHVhdGVSdWxlSWYgKHJ1bGVJZjogc3RyaW5nIHwgdW5kZWZpbmVkLCBlbnZzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocnVsZUlmID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgZXZhbFN0ciA9IHJ1bGVJZjtcblxuICAgICAgICAvLyBFeHBhbmQgYWxsIHZhcmlhYmxlc1xuICAgICAgICBldmFsU3RyID0gdGhpcy5leHBhbmRUZXh0V2l0aChldmFsU3RyLCB7XG4gICAgICAgICAgICB1bmVzY2FwZTogSlNPTi5zdHJpbmdpZnkoXCIkXCIpLFxuICAgICAgICAgICAgdmFyaWFibGU6IChuYW1lKSA9PiBKU09OLnN0cmluZ2lmeShlbnZzW25hbWVdID8/IG51bGwpLnJlcGxhY2VBbGwoXCJcXFxcXFxcXFwiLCBcIlxcXFxcIiksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENvbnZlcnQgPX4gdG8gbWF0Y2ggZnVuY3Rpb25cbiAgICAgICAgZXZhbFN0ciA9IGV2YWxTdHIucmVwbGFjZSgvXFxzKj1+XFxzKihcXC8uKj9cXC9baWdtc3V5XSopKD86XFxzfCQpL2csIFwiLm1hdGNoKCQxKSAhPSBudWxsXCIpO1xuICAgICAgICBldmFsU3RyID0gZXZhbFN0ci5yZXBsYWNlKC9cXHMqPX5cXHMoLis/KShcXCkqPykoPzpcXHN8JCkvZywgXCIubWF0Y2gobmV3IFJlZ0V4cCgkMSkpICE9IG51bGwkMlwiKTsgLy8gV2l0aG91dCBmb3J3YXJkIHNsYXNoZXNcblxuICAgICAgICAvLyBDb252ZXJ0ICF+IHRvIG1hdGNoIGZ1bmN0aW9uXG4gICAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UoL1xccyohflxccyooXFwvLio/XFwvW2lnbXN1eV0qKSg/Olxcc3wkKS9nLCBcIi5tYXRjaCgkMSkgPT0gbnVsbFwiKTtcbiAgICAgICAgZXZhbFN0ciA9IGV2YWxTdHIucmVwbGFjZSgvXFxzKiF+XFxzKC4rPykoXFwpKj8pKD86XFxzfCQpL2csIFwiLm1hdGNoKG5ldyBSZWdFeHAoJDEpKSA9PSBudWxsJDJcIik7IC8vIFdpdGhvdXQgZm9yd2FyZCBzbGFzaGVzXG5cbiAgICAgICAgLy8gQ29udmVydCBhbGwgbnVsbC5tYXRjaCBmdW5jdGlvbnMgdG8gZmFsc2VcbiAgICAgICAgZXZhbFN0ciA9IGV2YWxTdHIucmVwbGFjZSgvbnVsbC5tYXRjaFxcKC4rP1xcKSAhPSBudWxsL2csIFwiZmFsc2VcIik7XG4gICAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UoL251bGwubWF0Y2hcXCguKz9cXCkgPT0gbnVsbC9nLCBcImZhbHNlXCIpO1xuXG4gICAgICAgIHJldHVybiBCb29sZWFuKGV2YWwoZXZhbFN0cikpO1xuICAgIH1cblxuICAgIHN0YXRpYyBldmFsdWF0ZVJ1bGVFeGlzdCAoY3dkOiBzdHJpbmcsIHJ1bGVFeGlzdHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChydWxlRXhpc3RzID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcnVsZUV4aXN0cykge1xuICAgICAgICAgICAgaWYgKGdsb2JieS5zeW5jKHBhdHRlcm4sIHtkb3Q6IHRydWUsIGN3ZH0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGV2YWx1YXRlUnVsZUNoYW5nZXMgKGRlZmF1bHRCcmFuY2g6IHN0cmluZywgcnVsZUNoYW5nZXM6IHN0cmluZ1tdIHwge3BhdGhzOiBzdHJpbmdbXX0gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHJ1bGVDaGFuZ2VzID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIE5vcm1hbGl6ZSBydWxlczpjaGFuZ2VzOnBhdGhzIHRvIHJ1bGVzOmNoYW5nZXNcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVDaGFuZ2VzKSkgcnVsZUNoYW5nZXMgPSBydWxlQ2hhbmdlcy5wYXRocztcblxuICAgICAgICAvLyBOT1RFOiBodHRwczovL2RvY3MuZ2l0bGFiLmNvbS9lZS9jaS95YW1sLyNydWxlc2NoYW5nZXNcbiAgICAgICAgLy8gICAgICAgR2xvYiBwYXR0ZXJucyBhcmUgaW50ZXJwcmV0ZWQgd2l0aCBSdWJ5J3MgW0ZpbGUuZm5tYXRjaF0oaHR0cHM6Ly9kb2NzLnJ1YnktbGFuZy5vcmcvZW4vbWFzdGVyL0ZpbGUuaHRtbCNtZXRob2QtYy1mbm1hdGNoKVxuICAgICAgICAvLyAgICAgICB3aXRoIHRoZSBmbGFncyBGaWxlOjpGTk1fUEFUSE5BTUUgfCBGaWxlOjpGTk1fRE9UTUFUQ0ggfCBGaWxlOjpGTk1fRVhUR0xPQi5cbiAgICAgICAgcmV0dXJuIG1pY3JvbWF0Y2guc29tZShHaXREYXRhLmNoYW5nZWRGaWxlcyhgb3JpZ2luLyR7ZGVmYXVsdEJyYW5jaH1gKSwgcnVsZUNoYW5nZXMsIHtcbiAgICAgICAgICAgIG5vbmVnYXRlOiB0cnVlLFxuICAgICAgICAgICAgbm9leHRnbG9iOiB0cnVlLFxuICAgICAgICAgICAgcG9zaXg6IGZhbHNlLFxuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcnN5bmNUcmFja2VkRmlsZXMgKGN3ZDogc3RyaW5nLCBzdGF0ZURpcjogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZyk6IFByb21pc2U8e2hyZGVsdGF0aW1lOiBbbnVtYmVyLCBudW1iZXJdfT4ge1xuICAgICAgICBjb25zdCB0aW1lID0gcHJvY2Vzcy5ocnRpbWUoKTtcbiAgICAgICAgYXdhaXQgZnMubWtkaXJwKGAke2N3ZH0vJHtzdGF0ZURpcn0vYnVpbGRzLyR7dGFyZ2V0fWApO1xuICAgICAgICBhd2FpdCBVdGlscy5iYXNoKGByc3luYyAtYSAtLWRlbGV0ZS1leGNsdWRlZCAtLWRlbGV0ZSAtLWV4Y2x1ZGUtZnJvbT08KGdpdCBscy1maWxlcyAtbyAtLWRpcmVjdG9yeSB8IGF3ayAne3ByaW50IFwiL1wiJDB9JykgLS1leGNsdWRlICR7c3RhdGVEaXJ9LyAuLyAke3N0YXRlRGlyfS9idWlsZHMvJHt0YXJnZXR9L2AsIGN3ZCk7XG4gICAgICAgIHJldHVybiB7aHJkZWx0YXRpbWU6IHByb2Nlc3MuaHJ0aW1lKHRpbWUpfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgY2hlY2tzdW1GaWxlcyAoY3dkOiBzdHJpbmcsIGZpbGVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHN0cmluZz5bXSA9IFtdO1xuXG4gICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghIGZzLnBhdGhFeGlzdHNTeW5jKGZpbGUpKSByZXNvbHZlKHBhdGgucmVsYXRpdmUoY3dkLCBmaWxlKSk7IC8vIG11c3QgdXNlIHJlbGF0aXZlIHBhdGggaGVyZSwgc28gdGhhdCBjaGVja3N1bSBjYW4gYmUgZGV0ZXJtaW5pc3RpYyB3aGVuIHJ1bm5pbmcgdGhlIHVuaXQgdGVzdHNcbiAgICAgICAgICAgICAgICBjaGVja3N1bS5maWxlKGZpbGUsIChlcnIsIGhhc2gpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaGFzaCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrc3VtKHJlc3VsdC5qb2luKFwiXCIpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNPYmplY3QgKHY6IGFueSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHYpID09PSBPYmplY3QucHJvdG90eXBlO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyByZW1vdGVGaWxlRXhpc3QgKGN3ZDogc3RyaW5nLCBmaWxlOiBzdHJpbmcsIHJlZjogc3RyaW5nLCBkb21haW46IHN0cmluZywgcHJvamVjdFBhdGg6IHN0cmluZywgcHJvdG9jb2w6IEdpdFNjaGVtYSwgcG9ydDogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAocHJvdG9jb2wpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzc2hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJnaXRcIjpcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBVdGlscy5zcGF3bihgZ2l0IGFyY2hpdmUgLS1yZW1vdGU9c3NoOi8vZ2l0QCR7ZG9tYWlufToke3BvcnR9LyR7cHJvamVjdFBhdGh9LmdpdCAke3JlZn0gJHtmaWxlfWAuc3BsaXQoXCIgXCIpLCBjd2QpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLnN0ZGVyci5pbmNsdWRlcyhgcmVtb3RlOiBmYXRhbDogcGF0aHNwZWMgJyR7ZmlsZX0nIGRpZCBub3QgbWF0Y2ggYW55IGZpbGVzYCkpIHRocm93IG5ldyBFcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBcImh0dHBcIjpcbiAgICAgICAgICAgIGNhc2UgXCJodHRwc1wiOiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge3N0YXR1c30gPSBhd2FpdCBheGlvcy5nZXQoYCR7cHJvdG9jb2x9Oi8vJHtkb21haW59LyR7cHJvamVjdFBhdGh9Ly0vcmF3LyR7cmVmfS8ke2ZpbGV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RhdHVzID09PSAyMDApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBVdGlscy5zd2l0Y2hTdGF0ZW1lbnRFeGhhdXN0aXZlQ2hlY2socHJvdG9jb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHRyaW1TdWZmaXggKHN0cjogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyLmVuZHNXaXRoKHN1ZmZpeCkgPyBzdHIuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpIDogc3RyO1xuICAgIH1cblxuICAgIHN0YXRpYyBzd2l0Y2hTdGF0ZW1lbnRFeGhhdXN0aXZlQ2hlY2sgKHBhcmFtOiBuZXZlcik6IG5ldmVyIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXYudG8vYmFiYWsvZXhoYXVzdGl2ZS10eXBlLWNoZWNraW5nLXdpdGgtdHlwZXNjcmlwdC00bDNmXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNhc2UgJHtwYXJhbX1gKTtcbiAgICB9XG59XG4iXX0=
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEdBQUcsRUFBVSxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUIsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sU0FBUyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBQyxPQUFPLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBYXhCLE1BQU0sT0FBTyxLQUFLO0lBQ2QsTUFBTSxDQUFDLElBQUksQ0FBRSxXQUFtQixFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ2pELE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBRSxPQUFpQixFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ2hELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBRSxPQUFpQixFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FB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LENBQUMsR0FBRyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxNQUFNLENBQUMsOEJBQThCLENBQUUsS0FBWTtRQUMvQyxxRUFBcUU7UUFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQge0pvYiwgSm9iUnVsZX0gZnJvbSBcIi4vam9iLmpzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgY2hlY2tzdW0gZnJvbSBcImNoZWNrc3VtXCI7XG5pbXBvcnQgYmFzZTY0dXJsIGZyb20gXCJiYXNlNjR1cmxcIjtcbmltcG9ydCBleGVjYSBmcm9tIFwiZXhlY2FcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHtDSUNEVmFyaWFibGV9IGZyb20gXCIuL3ZhcmlhYmxlcy1mcm9tLWZpbGVzLmpzXCI7XG5pbXBvcnQge0dpdERhdGEsIEdpdFNjaGVtYX0gZnJvbSBcIi4vZ2l0LWRhdGEuanNcIjtcbmltcG9ydCBnbG9iYnkgZnJvbSBcImdsb2JieVwiO1xuaW1wb3J0IG1pY3JvbWF0Y2ggZnJvbSBcIm1pY3JvbWF0Y2hcIjtcbmltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbnR5cGUgUnVsZVJlc3VsdE9wdCA9IHtcbiAgICBjd2Q6IHN0cmluZztcbiAgICBydWxlczogSm9iUnVsZVtdO1xuICAgIHZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG59O1xuXG50eXBlIEV4cGFuZFdpdGggPSB7XG4gICAgdW5lc2NhcGU6IHN0cmluZztcbiAgICB2YXJpYWJsZTogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xufTtcblxuZXhwb3J0IGNsYXNzIFV0aWxzIHtcbiAgICBzdGF0aWMgYmFzaCAoc2hlbGxTY3JpcHQ6IHN0cmluZywgY3dkID0gcHJvY2Vzcy5jd2QoKSk6IFByb21pc2U8e3N0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZzsgZXhpdENvZGU6IG51bWJlcn0+IHtcbiAgICAgICAgcmV0dXJuIGV4ZWNhKHNoZWxsU2NyaXB0LCB7c2hlbGw6IFwiYmFzaFwiLCBjd2R9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc3Bhd24gKGNtZEFyZ3M6IHN0cmluZ1tdLCBjd2QgPSBwcm9jZXNzLmN3ZCgpKTogUHJvbWlzZTx7c3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nfT4ge1xuICAgICAgICByZXR1cm4gZXhlY2EoY21kQXJnc1swXSwgY21kQXJncy5zbGljZSgxKSwge2N3ZH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBzeW5jU3Bhd24gKGNtZEFyZ3M6IHN0cmluZ1tdLCBjd2QgPSBwcm9jZXNzLmN3ZCgpKToge3N0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZ30ge1xuICAgICAgICByZXR1cm4gZXhlY2Euc3luYyhjbWRBcmdzWzBdLCBjbWRBcmdzLnNsaWNlKDEpLCB7Y3dkfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZzVXJsICh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB1cmwucmVwbGFjZSgvXmh0dHBzOlxcL1xcLy9nLCBcIlwiKS5yZXBsYWNlKC9eaHR0cDpcXC9cXC8vZywgXCJcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIHNhZmVEb2NrZXJTdHJpbmcgKGpvYk5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gam9iTmFtZS5yZXBsYWNlKC9bXlxcdy1dKy9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlNjR1cmwuZW5jb2RlKG1hdGNoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZvckVhY2hSZWFsSm9iIChnaXRsYWJEYXRhOiBhbnksIGNhbGxiYWNrOiAoam9iTmFtZTogc3RyaW5nLCBqb2JEYXRhOiBhbnkpID0+IHZvaWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iRGF0YV0gb2YgT2JqZWN0LmVudHJpZXM8YW55PihnaXRsYWJEYXRhKSkge1xuICAgICAgICAgICAgaWYgKEpvYi5pbGxlZ2FsSm9iTmFtZXMuaGFzKGpvYk5hbWUpIHx8IGpvYk5hbWVbMF0uc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKGpvYk5hbWUsIGpvYkRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEpvYk5hbWVzRnJvbVByZXZpb3VzU3RhZ2VzIChqb2JzOiBSZWFkb25seUFycmF5PEpvYj4sIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW10sIGN1cnJlbnRKb2I6IEpvYikge1xuICAgICAgICBjb25zdCBqb2JOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VycmVudFN0YWdlSW5kZXggPSBzdGFnZXMuaW5kZXhPZihjdXJyZW50Sm9iLnN0YWdlKTtcbiAgICAgICAgam9icy5mb3JFYWNoKGpvYiA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFnZUluZGV4ID0gc3RhZ2VzLmluZGV4T2Yoam9iLnN0YWdlKTtcbiAgICAgICAgICAgIGlmIChzdGFnZUluZGV4IDwgY3VycmVudFN0YWdlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBqb2JOYW1lcy5wdXNoKGpvYi5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBqb2JOYW1lcztcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgZ2V0Q292ZXJhZ2VQZXJjZW50IChjd2Q6IHN0cmluZywgc3RhdGVEaXI6IHN0cmluZywgY292ZXJhZ2VSZWdleDogc3RyaW5nLCBqb2JOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGAke2N3ZH0vJHtzdGF0ZURpcn0vb3V0cHV0LyR7am9iTmFtZX0ubG9nYCwgXCJ1dGY4XCIpO1xuXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChjb3ZlcmFnZVJlZ2V4LnJlcGxhY2UoL15cXC8vLCBcIlwiKS5yZXBsYWNlKC9cXC8kLywgXCJcIiksIFwiZ21cIik7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBBcnJheS5mcm9tKGNvbnRlbnQubWF0Y2hBbGwocmVnZXgpKTtcbiAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCIwXCI7XG5cbiAgICAgICAgY29uc3QgbGFzdE1hdGNoID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBkaWdpdHMgPSAvXFxkKyg/OlxcLlxcZCspPy8uZXhlYyhsYXN0TWF0Y2hbMV0gPz8gbGFzdE1hdGNoWzBdKTtcbiAgICAgICAgaWYgKCFkaWdpdHMpIHJldHVybiBcIjBcIjtcbiAgICAgICAgcmV0dXJuIGRpZ2l0c1swXSA/PyBcIjBcIjtcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJpbnRKb2JOYW1lcyAoc3RyZWFtOiAodHh0OiBzdHJpbmcpID0+IHZvaWQsIGpvYjoge25hbWU6IHN0cmluZ30sIGk6IG51bWJlciwgYXJyOiB7bmFtZTogc3RyaW5nfVtdKSB7XG4gICAgICAgIGlmIChpID09PSBhcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgc3RyZWFtKGNoYWxrYHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyZWFtKGNoYWxrYHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fSwgYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBleHBhbmRUZXh0V2l0aCAodGV4dDogYW55LCBleHBhbmRXaXRoOiBFeHBhbmRXaXRoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKFxuICAgICAgICAgICAgLyhcXCRcXCQpfFxcJFxceyhbYS16QS1aX11cXHcqKX18XFwkKFthLXpBLVpfXVxcdyopL2csIC8vIGh0dHBzOi8vcmVnZXhyLmNvbS83czRrYVxuICAgICAgICAgICAgKF9tYXRjaCwgZXNjYXBlLCB2YXIxLCB2YXIyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlc2NhcGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cGFuZFdpdGgudW5lc2NhcGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHZhcjEgfHwgdmFyMjtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KG5hbWUsIFwidW5leHBlY3RlZCB1bnNldCBjYXB0dXJlIGdyb3VwXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZXhwYW5kV2l0aC52YXJpYWJsZShuYW1lKX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXhwYW5kVGV4dCAodGV4dDogYW55LCBlbnZzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgICAgICByZXR1cm4gdGhpcy5leHBhbmRUZXh0V2l0aCh0ZXh0LCB7XG4gICAgICAgICAgICB1bmVzY2FwZTogXCIkXCIsXG4gICAgICAgICAgICB2YXJpYWJsZTogKG5hbWUpID0+IGVudnNbbmFtZV0gPz8gXCJcIixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGV4cGFuZFZhcmlhYmxlcyAodmFyaWFibGVzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSkge1xuICAgICAgICBsZXQgZXhwYW5kZWRBbnlWYXJpYWJsZXMsIGkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBhc3NlcnQoaSA8IDEwMCwgXCJSZWN1cnNpdmUgdmFyaWFibGUgZXhwYW5zaW9uIHJlYWNoZWQgMTAwIGl0ZXJhdGlvbnNcIik7XG4gICAgICAgICAgICBleHBhbmRlZEFueVZhcmlhYmxlcyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudnNXaXRob3V0U2VsZiA9IHsuLi52YXJpYWJsZXN9O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBlbnZzV2l0aG91dFNlbGZba107XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlICQkJ3MgYXJlIGNvbnZlcnRlZCB0byBzaW5nbGUgJCdzIG5vdywgdGhlbiB0aGUgbmV4dFxuICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGlvbiwgdGhleSBtaWdodCBiZSBpbnRlcnByZXRlZCBhcyB2YXJpYWJsZXMsIGV2ZW5cbiAgICAgICAgICAgICAgICAvLyB0aG91Z2ggdGhleSB3ZXJlICpleHBsaWNpdGx5KiBlc2NhcGVkLiBUbyB3b3JrIGFyb3VuZCB0aGlzLFxuICAgICAgICAgICAgICAgIC8vIGxlYXZlIHRoZSAnJCQncyBhcyB0aGUgc2FtZSB2YWx1ZSwgdGhlbiBvbmx5IHVuZXNjYXBlIHRoZW0gYXRcbiAgICAgICAgICAgICAgICAvLyB0aGUgdmVyeSBlbmQuXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzW2tdID0gVXRpbHMuZXhwYW5kVGV4dFdpdGgodiwge1xuICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZTogXCIkJFwiLFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZTogKG5hbWUpID0+IGVudnNXaXRob3V0U2VsZltuYW1lXSA/PyBcIlwiLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGV4cGFuZGVkQW55VmFyaWFibGVzIHx8PSB2YXJpYWJsZXNba10gIT09IHY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH0gd2hpbGUgKGV4cGFuZGVkQW55VmFyaWFibGVzKTtcblxuICAgICAgICByZXR1cm4gdmFyaWFibGVzO1xuICAgIH1cblxuICAgIHN0YXRpYyB1bnNjYXBlJCRWYXJpYWJsZXMgKHZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSkge1xuICAgICAgICAgICAgdmFyaWFibGVzW2tdID0gVXRpbHMuZXhwYW5kVGV4dCh2LCB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFyaWFibGVzO1xuICAgIH1cblxuICAgIHN0YXRpYyBmaW5kRW52TWF0Y2hlZFZhcmlhYmxlcyAodmFyaWFibGVzOiB7W25hbWU6IHN0cmluZ106IENJQ0RWYXJpYWJsZX0sIGZpbGVWYXJpYWJsZXNEaXI/OiBzdHJpbmcsIGVudmlyb25tZW50Pzoge25hbWU6IHN0cmluZ30pIHtcbiAgICAgICAgY29uc3QgZW52TWF0Y2hlZFZhcmlhYmxlczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFyaWFibGVzKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB2LmVudmlyb25tZW50cykge1xuICAgICAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudD8ubmFtZS5tYXRjaChlbnRyeS5yZWdleHApIHx8IGVudHJ5LnJlZ2V4cC5zb3VyY2UgPT09IFwiLipcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVZhcmlhYmxlc0RpciAhPSBudWxsICYmIHYudHlwZSA9PT0gXCJmaWxlXCIgJiYgIWVudHJ5LmZpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudk1hdGNoZWRWYXJpYWJsZXNba10gPSBgJHtmaWxlVmFyaWFibGVzRGlyfS8ke2t9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1rZGlycFN5bmMoYCR7ZmlsZVZhcmlhYmxlc0Rpcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYCR7ZmlsZVZhcmlhYmxlc0Rpcn0vJHtrfWAsIGVudHJ5LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVWYXJpYWJsZXNEaXIgIT0gbnVsbCAmJiB2LnR5cGUgPT09IFwiZmlsZVwiICYmIGVudHJ5LmZpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudk1hdGNoZWRWYXJpYWJsZXNba10gPSBgJHtmaWxlVmFyaWFibGVzRGlyfS8ke2t9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1rZGlycFN5bmMoYCR7ZmlsZVZhcmlhYmxlc0Rpcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhlbnRyeS5maWxlU291cmNlLCBgJHtmaWxlVmFyaWFibGVzRGlyfS8ke2t9YCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnZNYXRjaGVkVmFyaWFibGVzW2tdID0gZW50cnkuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudk1hdGNoZWRWYXJpYWJsZXM7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFJ1bGVzUmVzdWx0IChvcHQ6IFJ1bGVSZXN1bHRPcHQsIGdpdERhdGE6IEdpdERhdGEsIGpvYldoZW46IHN0cmluZyA9IFwib25fc3VjY2Vzc1wiLCBqb2JBbGxvd0ZhaWx1cmU6IGJvb2xlYW4gfCB7ZXhpdF9jb2RlczogbnVtYmVyIHwgbnVtYmVyW119ID0gZmFsc2UpOiB7d2hlbjogc3RyaW5nOyBhbGxvd0ZhaWx1cmU6IGJvb2xlYW4gfCB7ZXhpdF9jb2RlczogbnVtYmVyIHwgbnVtYmVyW119OyB2YXJpYWJsZXM/OiB7W25hbWU6IHN0cmluZ106IHN0cmluZ319IHtcbiAgICAgICAgbGV0IHdoZW4gPSBcIm5ldmVyXCI7XG5cbiAgICAgICAgLy8gb3B0aW9uYWwgbWFudWFsIGpvYnMgYWxsb3dGYWlsdXJlIGRlZmF1bHRzIHRvIHRydWUgaHR0cHM6Ly9kb2NzLmdpdGxhYi5jb20vZWUvY2kvam9icy9qb2JfY29udHJvbC5odG1sI3R5cGVzLW9mLW1hbnVhbC1qb2JzXG4gICAgICAgIGxldCBhbGxvd0ZhaWx1cmUgPSBqb2JXaGVuID09PSBcIm1hbnVhbFwiID8gdHJ1ZSA6IGpvYkFsbG93RmFpbHVyZTtcbiAgICAgICAgbGV0IHJ1bGVWYXJpYWJsZToge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBvcHQucnVsZXMpIHtcbiAgICAgICAgICAgIGlmICghVXRpbHMuZXZhbHVhdGVSdWxlSWYocnVsZS5pZiwgb3B0LnZhcmlhYmxlcykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFVdGlscy5ldmFsdWF0ZVJ1bGVFeGlzdChvcHQuY3dkLCBydWxlLmV4aXN0cykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFVdGlscy5ldmFsdWF0ZVJ1bGVDaGFuZ2VzKGdpdERhdGEuYnJhbmNoZXMuZGVmYXVsdCwgcnVsZS5jaGFuZ2VzKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIHdoZW4gPSBydWxlLndoZW4gPyBydWxlLndoZW4gOiBqb2JXaGVuO1xuICAgICAgICAgICAgYWxsb3dGYWlsdXJlID0gcnVsZS5hbGxvd19mYWlsdXJlID8/IGFsbG93RmFpbHVyZTtcbiAgICAgICAgICAgIHJ1bGVWYXJpYWJsZSA9IHJ1bGUudmFyaWFibGVzO1xuXG4gICAgICAgICAgICBicmVhazsgLy8gRWFybHkgcmV0dXJuLCB3aWxsIG5vdCBldmFsdWF0ZSB0aGUgcmVtYWluaW5nIHJ1bGVzXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3doZW4sIGFsbG93RmFpbHVyZSwgdmFyaWFibGVzOiBydWxlVmFyaWFibGV9O1xuICAgIH1cblxuICAgIHN0YXRpYyBldmFsdWF0ZVJ1bGVJZiAocnVsZUlmOiBzdHJpbmcgfCB1bmRlZmluZWQsIGVudnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChydWxlSWYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGxldCBldmFsU3RyID0gcnVsZUlmO1xuXG4gICAgICAgIC8vIEV4cGFuZCBhbGwgdmFyaWFibGVzXG4gICAgICAgIGV2YWxTdHIgPSB0aGlzLmV4cGFuZFRleHRXaXRoKGV2YWxTdHIsIHtcbiAgICAgICAgICAgIHVuZXNjYXBlOiBKU09OLnN0cmluZ2lmeShcIiRcIiksXG4gICAgICAgICAgICB2YXJpYWJsZTogKG5hbWUpID0+IEpTT04uc3RyaW5naWZ5KGVudnNbbmFtZV0gPz8gbnVsbCkucmVwbGFjZUFsbChcIlxcXFxcXFxcXCIsIFwiXFxcXFwiKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkRXZhbFN0ciA9IGV2YWxTdHI7XG5cbiAgICAgICAgLy8gU2NlbmFyaW8gd2hlbiBSSFMgaXMgYSA8cmVnZXg+XG4gICAgICAgIC8vIGh0dHBzOi8vcmVnZXhyLmNvbS84NXNqb1xuICAgICAgICBjb25zdCBwYXR0ZXJuMSA9IC9cXHMqKD88b3BlcmF0b3I+KD86PX4pfCg/OiF+KSlcXHMqKD88cmhzPlxcLy4qP1xcLykoPzxmbGFncz5baWdtc3V5XSopKFxcc3wkfFxcKSkvZztcbiAgICAgICAgZXZhbFN0ciA9IGV2YWxTdHIucmVwbGFjZShwYXR0ZXJuMSwgKF8sIG9wZXJhdG9yLCByaHMsIGZsYWdzLCByZW1haW5pbmdUb2tlbnMpID0+IHtcbiAgICAgICAgICAgIGxldCBfb3BlcmF0b3I7XG4gICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIj1+XCI6XG4gICAgICAgICAgICAgICAgICAgIF9vcGVyYXRvciA9IFwiIT1cIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIiF+XCI6XG4gICAgICAgICAgICAgICAgICAgIF9vcGVyYXRvciA9IFwiPT1cIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgb3BlcmF0b3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYC5tYXRjaCgke3Joc30ke2ZsYWdzfSkke3JlbWFpbmluZ1Rva2Vuc30gJHtfb3BlcmF0b3J9IG51bGwgYDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2NlbmFyaW8gd2hlbiBSSFMgaXMgc3Vycm91bmRlZCBieSBkb3VibGUtcXVvdGVzXG4gICAgICAgIC8vIGh0dHBzOi8vcmVnZXhyLmNvbS84NXQwZ1xuICAgICAgICBjb25zdCBwYXR0ZXJuMiA9IC9cXHMqKD88b3BlcmF0b3I+KD86PX4pfCg/OiF+KSlcXHMqXCIoPzxyaHM+W15cIlxcXFxdKig/OlxcXFwuW15cIlxcXFxdKikqKVwiL2c7XG4gICAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UocGF0dGVybjIsIChfLCBvcGVyYXRvciwgcmhzKSA9PiB7XG4gICAgICAgICAgICBsZXQgX29wZXJhdG9yO1xuICAgICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCI9flwiOlxuICAgICAgICAgICAgICAgICAgICBfb3BlcmF0b3IgPSBcIiE9XCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCIhflwiOlxuICAgICAgICAgICAgICAgICAgICBfb3BlcmF0b3IgPSBcIj09XCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG9wZXJhdG9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIS9cXC8oLiopXFwvKFtcXHddKikvLnRlc3QocmhzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBSSFMgKCR7cmhzfSkgbXVzdCBiZSBhIHJlZ2V4IHBhdHRlcm4uIERvIG5vdCByZWx5IG9uIHRoaXMgYmVoYXZpb3IhXG5SZWZlciB0byBodHRwczovL2RvY3MuZ2l0bGFiLmNvbS9lZS9jaS9qb2JzL2pvYl9ydWxlcy5odG1sI3VuZXhwZWN0ZWQtYmVoYXZpb3ItZnJvbS1yZWd1bGFyLWV4cHJlc3Npb24tbWF0Y2hpbmctd2l0aC0gZm9yIG1vcmUgaW5mby4uLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVnZXggPSAvXFwvKD88cGF0dGVybj4uKilcXC8oPzxmbGFncz5baWdtc3V5XSopLztcbiAgICAgICAgICAgIGNvbnN0IF9yaHMgPSByaHMucmVwbGFjZShyZWdleCwgKF86IHN0cmluZywgcGF0dGVybjogc3RyaW5nLCBmbGFnczogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX3BhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoLyg/PCFcXFxcKVxcLy9nLCBcIlxcXFwvXCIpOyAvLyBlc2NhcGUgcG90ZW50aWFsbHkgdW5lc2NhcGVkIGAvYCB0aGF0J3MgaW4gdGhlIHBhdHRlcm5cbiAgICAgICAgICAgICAgICByZXR1cm4gYC8ke19wYXR0ZXJufS8ke2ZsYWdzfWA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBgLm1hdGNoKG5ldyBSZWdFeHAoJHtfcmhzfSkpICR7X29wZXJhdG9yfSBudWxsYDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBhbGwgbnVsbC5tYXRjaCBmdW5jdGlvbnMgdG8gZmFsc2VcbiAgICAgICAgZXZhbFN0ciA9IGV2YWxTdHIucmVwbGFjZSgvbnVsbC5tYXRjaFxcKC4rP1xcKVxccyohPVxccypudWxsL2csIFwiZmFsc2VcIik7XG4gICAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UoL251bGwubWF0Y2hcXCguKz9cXClcXHMqPT1cXHMqbnVsbC9nLCBcImZhbHNlXCIpO1xuXG4gICAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnRyaW0oKTtcblxuICAgICAgICBsZXQgcmVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzID0gKDAsIGV2YWwpKGV2YWxTdHIpOyAvLyBodHRwczovL2VzYnVpbGQuZ2l0aHViLmlvL2NvbnRlbnQtdHlwZXMvI2RpcmVjdC1ldmFsXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFxuRXJyb3IgYXR0ZW1wdGluZyB0byBldmFsdWF0ZSB0aGUgZm9sbG93aW5nIHJ1bGVzOlxuICBydWxlczpcbiAgICAtIGlmOiAnJHtleHBhbmRlZEV2YWxTdHJ9J1xuYXNcblxcYFxcYFxcYGphdmFzY3JpcHRcbiR7ZXZhbFN0cn1cblxcYFxcYFxcYFxuYCk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocmVzKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXZhbHVhdGVSdWxlRXhpc3QgKGN3ZDogc3RyaW5nLCBydWxlRXhpc3RzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocnVsZUV4aXN0cyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHJ1bGVFeGlzdHMpIHtcbiAgICAgICAgICAgIGlmIChnbG9iYnkuc3luYyhwYXR0ZXJuLCB7ZG90OiB0cnVlLCBjd2R9KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBldmFsdWF0ZVJ1bGVDaGFuZ2VzIChkZWZhdWx0QnJhbmNoOiBzdHJpbmcsIHJ1bGVDaGFuZ2VzOiBzdHJpbmdbXSB8IHtwYXRoczogc3RyaW5nW119IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChydWxlQ2hhbmdlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBOb3JtYWxpemUgcnVsZXM6Y2hhbmdlczpwYXRocyB0byBydWxlczpjaGFuZ2VzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlQ2hhbmdlcykpIHJ1bGVDaGFuZ2VzID0gcnVsZUNoYW5nZXMucGF0aHM7XG5cbiAgICAgICAgLy8gTk9URTogaHR0cHM6Ly9kb2NzLmdpdGxhYi5jb20vZWUvY2kveWFtbC8jcnVsZXNjaGFuZ2VzXG4gICAgICAgIC8vICAgICAgIEdsb2IgcGF0dGVybnMgYXJlIGludGVycHJldGVkIHdpdGggUnVieSdzIFtGaWxlLmZubWF0Y2hdKGh0dHBzOi8vZG9jcy5ydWJ5LWxhbmcub3JnL2VuL21hc3Rlci9GaWxlLmh0bWwjbWV0aG9kLWMtZm5tYXRjaClcbiAgICAgICAgLy8gICAgICAgd2l0aCB0aGUgZmxhZ3MgRmlsZTo6Rk5NX1BBVEhOQU1FIHwgRmlsZTo6Rk5NX0RPVE1BVENIIHwgRmlsZTo6Rk5NX0VYVEdMT0IuXG4gICAgICAgIHJldHVybiBtaWNyb21hdGNoLnNvbWUoR2l0RGF0YS5jaGFuZ2VkRmlsZXMoYG9yaWdpbi8ke2RlZmF1bHRCcmFuY2h9YCksIHJ1bGVDaGFuZ2VzLCB7XG4gICAgICAgICAgICBub25lZ2F0ZTogdHJ1ZSxcbiAgICAgICAgICAgIG5vZXh0Z2xvYjogdHJ1ZSxcbiAgICAgICAgICAgIHBvc2l4OiBmYWxzZSxcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHJzeW5jVHJhY2tlZEZpbGVzIChjd2Q6IHN0cmluZywgc3RhdGVEaXI6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBQcm9taXNlPHtocmRlbHRhdGltZTogW251bWJlciwgbnVtYmVyXX0+IHtcbiAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlycChgJHtjd2R9LyR7c3RhdGVEaXJ9L2J1aWxkcy8ke3RhcmdldH1gKTtcbiAgICAgICAgYXdhaXQgVXRpbHMuYmFzaChgcnN5bmMgLWEgLS1kZWxldGUtZXhjbHVkZWQgLS1kZWxldGUgLS1leGNsdWRlLWZyb209PChnaXQgbHMtZmlsZXMgLW8gLS1kaXJlY3RvcnkgfCBhd2sgJ3twcmludCBcIi9cIiQwfScpIC0tZXhjbHVkZSAke3N0YXRlRGlyfS8gLi8gJHtzdGF0ZURpcn0vYnVpbGRzLyR7dGFyZ2V0fS9gLCBjd2QpO1xuICAgICAgICByZXR1cm4ge2hyZGVsdGF0aW1lOiBwcm9jZXNzLmhydGltZSh0aW1lKX07XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIGNoZWNrc3VtRmlsZXMgKGN3ZDogc3RyaW5nLCBmaWxlczogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxzdHJpbmc+W10gPSBbXTtcblxuICAgICAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoISBmcy5wYXRoRXhpc3RzU3luYyhmaWxlKSkgcmVzb2x2ZShwYXRoLnJlbGF0aXZlKGN3ZCwgZmlsZSkpOyAvLyBtdXN0IHVzZSByZWxhdGl2ZSBwYXRoIGhlcmUsIHNvIHRoYXQgY2hlY2tzdW0gY2FuIGJlIGRldGVybWluaXN0aWMgd2hlbiBydW5uaW5nIHRoZSB1bml0IHRlc3RzXG4gICAgICAgICAgICAgICAgY2hlY2tzdW0uZmlsZShmaWxlLCAoZXJyLCBoYXNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGhhc2gpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIHJldHVybiBjaGVja3N1bShyZXN1bHQuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzT2JqZWN0ICh2OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih2KSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcmVtb3RlRmlsZUV4aXN0IChjd2Q6IHN0cmluZywgZmlsZTogc3RyaW5nLCByZWY6IHN0cmluZywgZG9tYWluOiBzdHJpbmcsIHByb2plY3RQYXRoOiBzdHJpbmcsIHByb3RvY29sOiBHaXRTY2hlbWEsIHBvcnQ6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKHByb3RvY29sKSB7XG4gICAgICAgICAgICBjYXNlIFwic3NoXCI6XG4gICAgICAgICAgICBjYXNlIFwiZ2l0XCI6XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgVXRpbHMuc3Bhd24oYGdpdCBhcmNoaXZlIC0tcmVtb3RlPXNzaDovL2dpdEAke2RvbWFpbn06JHtwb3J0fS8ke3Byb2plY3RQYXRofS5naXQgJHtyZWZ9ICR7ZmlsZX1gLnNwbGl0KFwiIFwiKSwgY3dkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZS5zdGRlcnIuaW5jbHVkZXMoYHJlbW90ZTogZmF0YWw6IHBhdGhzcGVjICcke2ZpbGV9JyBkaWQgbm90IG1hdGNoIGFueSBmaWxlc2ApKSB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgXCJodHRwXCI6XG4gICAgICAgICAgICBjYXNlIFwiaHR0cHNcIjoge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHtzdGF0dXN9ID0gYXdhaXQgYXhpb3MuZ2V0KGAke3Byb3RvY29sfTovLyR7ZG9tYWlufToke3BvcnR9LyR7cHJvamVjdFBhdGh9Ly0vcmF3LyR7cmVmfS8ke2ZpbGV9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RhdHVzID09PSAyMDApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBVdGlscy5zd2l0Y2hTdGF0ZW1lbnRFeGhhdXN0aXZlQ2hlY2socHJvdG9jb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHRyaW1TdWZmaXggKHN0cjogc3RyaW5nLCBzdWZmaXg6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyLmVuZHNXaXRoKHN1ZmZpeCkgPyBzdHIuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpIDogc3RyO1xuICAgIH1cblxuICAgIHN0YXRpYyBzd2l0Y2hTdGF0ZW1lbnRFeGhhdXN0aXZlQ2hlY2sgKHBhcmFtOiBuZXZlcik6IG5ldmVyIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXYudG8vYmFiYWsvZXhoYXVzdGl2ZS10eXBlLWNoZWNraW5nLXdpdGgtdHlwZXNjcmlwdC00bDNmXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGNhc2UgJHtwYXJhbX1gKTtcbiAgICB9XG59XG4iXX0=
package/src/validator.js CHANGED
@@ -1,19 +1,13 @@
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.Validator = void 0;
7
- const ajv_1 = __importDefault(require("ajv"));
8
- const assert_1 = __importDefault(require("assert"));
9
- const chalk_1 = __importDefault(require("chalk"));
10
- const schema_1 = __importDefault(require("./schema"));
11
- const schema_error_1 = require("./schema-error");
12
- const terminal_link_1 = __importDefault(require("terminal-link"));
1
+ import Ajv from "ajv";
2
+ import assert from "assert";
3
+ import chalk from "chalk";
4
+ import schema from "./schema/index.js";
5
+ import { betterAjvErrors } from "./schema-error.js";
6
+ import terminalLink from "terminal-link";
13
7
  const MAX_ERRORS = 5;
14
- class Validator {
8
+ export class Validator {
15
9
  static jsonSchemaValidation({ pathToExpandedGitLabCi, gitLabCiConfig }) {
16
- const ajv = new ajv_1.default({
10
+ const ajv = new Ajv({
17
11
  verbose: true,
18
12
  allErrors: true,
19
13
  allowUnionTypes: true,
@@ -21,10 +15,10 @@ class Validator {
21
15
  strictTypes: false, // to suppress the missing types defined in the gitlab-ci json schema
22
16
  keywords: ["markdownDescription"],
23
17
  });
24
- const validate = ajv.compile(schema_1.default);
18
+ const validate = ajv.compile(schema);
25
19
  const valid = validate(gitLabCiConfig);
26
20
  if (!valid) {
27
- const betterErrors = (0, schema_error_1.betterAjvErrors)({
21
+ const betterErrors = betterAjvErrors({
28
22
  data: gitLabCiConfig,
29
23
  errors: validate.errors,
30
24
  });
@@ -34,14 +28,14 @@ class Validator {
34
28
  e += `\t... and ${len - MAX_ERRORS} more`;
35
29
  break;
36
30
  }
37
- e += (0, chalk_1.default) `\t• {redBright ${betterErrors[i].message}} at {blueBright ${betterErrors[i].path}}\n`;
31
+ e += chalk `\t• {redBright ${betterErrors[i].message}} at {blueBright ${betterErrors[i].path}}\n`;
38
32
  }
39
- (0, assert_1.default)(valid, (0, chalk_1.default) `
33
+ assert(valid, chalk `
40
34
  {reset Invalid .gitlab-ci.yml configuration!
41
35
  ${e.trimEnd()}
42
36
 
43
37
  For further troubleshooting, consider either of the following:
44
- \t• Copy the content of {blueBright ${(0, terminal_link_1.default)(".gitlab-ci-local/expanded-gitlab-ci.yml", pathToExpandedGitLabCi)}} to the ${(0, terminal_link_1.default)("pipeline editor", "https://docs.gitlab.com/ee/ci/pipeline_editor/")} to debug it
38
+ \t• Copy the content of {blueBright ${terminalLink(".gitlab-ci-local/expanded-gitlab-ci.yml", pathToExpandedGitLabCi)}} to the ${terminalLink("pipeline editor", "https://docs.gitlab.com/ee/ci/pipeline_editor/")} to debug it
45
39
  \t• Use --json-schema-validation=false to disable schema validation (not recommended)}
46
40
  `);
47
41
  }
@@ -63,10 +57,10 @@ For further troubleshooting, consider either of the following:
63
57
  const needJob = jobs.find(j => j.baseName === need.job);
64
58
  if (need.optional && !needJob)
65
59
  continue;
66
- (0, assert_1.default)(needJob != null, (0, chalk_1.default) `needs: [{blueBright ${need.job}}] for {blueBright ${job.baseName}} could not be found`);
60
+ assert(needJob != null, chalk `needs: [{blueBright ${need.job}}] for {blueBright ${job.baseName}} could not be found`);
67
61
  const needJobStageIndex = stages.indexOf(needJob.stage);
68
62
  const jobStageIndex = stages.indexOf(job.stage);
69
- (0, assert_1.default)(needJobStageIndex <= jobStageIndex, (0, chalk_1.default) `needs: [{blueBright ${needJob.name}}] for {blueBright ${job.name}} is in a future stage`);
63
+ assert(needJobStageIndex <= jobStageIndex, chalk `needs: [{blueBright ${needJob.name}}] for {blueBright ${job.name}} is in a future stage`);
70
64
  }
71
65
  }
72
66
  return warnings;
@@ -76,13 +70,13 @@ For further troubleshooting, consider either of the following:
76
70
  if (job.dependencies === null || job.dependencies.length === 0)
77
71
  continue;
78
72
  const undefDeps = job.dependencies.filter((j) => !jobs.some(n => n.baseName === j));
79
- (0, assert_1.default)(undefDeps.length !== job.dependencies.length, (0, chalk_1.default) `dependencies: [{blueBright ${undefDeps.join(",")}}] for {blueBright ${job.name}} cannot be found`);
73
+ assert(undefDeps.length !== job.dependencies.length, chalk `dependencies: [{blueBright ${undefDeps.join(",")}}] for {blueBright ${job.name}} cannot be found`);
80
74
  for (const dep of job.dependencies) {
81
75
  const depJob = jobs.find(j => j.baseName === dep);
82
- (0, assert_1.default)(depJob != null, (0, chalk_1.default) `dependencies: [{blueBright ${dep}}] for {blueBright ${job.baseName}} could not be found`);
76
+ assert(depJob != null, chalk `dependencies: [{blueBright ${dep}}] for {blueBright ${job.baseName}} could not be found`);
83
77
  const depJobStageIndex = stages.indexOf(depJob.stage);
84
78
  const jobStageIndex = stages.indexOf(job.stage);
85
- (0, assert_1.default)(depJobStageIndex <= jobStageIndex, (0, chalk_1.default) `dependencies: [{blueBright ${depJob.name}}] for {blueBright ${job.name}} is in a future stage`);
79
+ assert(depJobStageIndex <= jobStageIndex, chalk `dependencies: [{blueBright ${depJob.name}}] for {blueBright ${job.name}} is in a future stage`);
86
80
  }
87
81
  }
88
82
  }
@@ -98,7 +92,7 @@ For further troubleshooting, consider either of the following:
98
92
  return needs.some(n => n.job === dep);
99
93
  });
100
94
  const assertMsg = `${job.formattedJobName} needs: '${needs.map(n => n.job).join(",")}' doesn't fully contain dependencies: '${dependencies.join(",")}'`;
101
- (0, assert_1.default)(everyIncluded, assertMsg);
95
+ assert(everyIncluded, assertMsg);
102
96
  }
103
97
  }
104
98
  /**
@@ -120,16 +114,16 @@ For further troubleshooting, consider either of the following:
120
114
  for (const job of jobs) {
121
115
  if (job.trigger)
122
116
  continue; // Jobs with trigger are allowed to have empty script
123
- (0, assert_1.default)(job.scripts.length > 0, (0, chalk_1.default) `{blue ${job.name}} has empty script`);
117
+ assert(job.scripts.length > 0, chalk `{blue ${job.name}} has empty script`);
124
118
  }
125
119
  }
126
120
  static arrayOfStrings(jobs) {
127
121
  for (const job of jobs) {
128
122
  if (job.trigger)
129
123
  continue;
130
- job.beforeScripts.forEach((s) => (0, assert_1.default)(typeof s === "string", (0, chalk_1.default) `{blue ${job.name}} before_script contains non string value`));
131
- job.afterScripts.forEach((s) => (0, assert_1.default)(typeof s === "string", (0, chalk_1.default) `{blue ${job.name}} after_script contains non string value`));
132
- job.scripts.forEach((s) => (0, assert_1.default)(typeof s === "string", (0, chalk_1.default) `{blue ${job.name}} script contains non string value`));
124
+ job.beforeScripts.forEach((s) => assert(typeof s === "string", chalk `{blue ${job.name}} before_script contains non string value`));
125
+ job.afterScripts.forEach((s) => assert(typeof s === "string", chalk `{blue ${job.name}} after_script contains non string value`));
126
+ job.scripts.forEach((s) => assert(typeof s === "string", chalk `{blue ${job.name}} script contains non string value`));
133
127
  }
134
128
  }
135
129
  static async run(jobs, stages) {
@@ -153,5 +147,4 @@ For further troubleshooting, consider either of the following:
153
147
  return warnings;
154
148
  }
155
149
  }
156
- exports.Validator = Validator;
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhDQUFzQjtBQUV0QixvREFBNEI7QUFDNUIsa0RBQTBCO0FBQzFCLHNEQUE4QjtBQUM5QixpREFBK0M7QUFDL0Msa0VBQXlDO0FBRXpDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztBQUVyQixNQUFhLFNBQVM7SUFDbEIsTUFBTSxDQUFDLG9CQUFvQixDQUFFLEVBQUMsc0JBQXNCLEVBQUUsY0FBYyxFQUduRTtRQUNHLE1BQU0sR0FBRyxHQUFHLElBQUksYUFBRyxDQUFDO1lBQ2hCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsU0FBUyxFQUFFLElBQUk7WUFDZixlQUFlLEVBQUUsSUFBSTtZQUNyQixlQUFlLEVBQUUsS0FBSztZQUN0QixXQUFXLEVBQUUsS0FBSyxFQUFFLHFFQUFxRTtZQUN6RixRQUFRLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztTQUNwQyxDQUFDLENBQUM7UUFDSCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFNLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsTUFBTSxZQUFZLEdBQUcsSUFBQSw4QkFBZSxFQUFDO2dCQUNqQyxJQUFJLEVBQUUsY0FBYztnQkFDcEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2FBQzFCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxHQUFXLEVBQUUsQ0FBQztZQUNuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLEVB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XCIuL2pvYlwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgc2NoZW1hIGZyb20gXCIuL3NjaGVtYVwiO1xuaW1wb3J0IHtiZXR0ZXJBanZFcnJvcnN9IGZyb20gXCIuL3NjaGVtYS1lcnJvclwiO1xuaW1wb3J0IHRlcm1pbmFsTGluayBmcm9tIFwidGVybWluYWwtbGlua1wiO1xuXG5jb25zdCBNQVhfRVJST1JTID0gNTtcblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvciB7XG4gICAgc3RhdGljIGpzb25TY2hlbWFWYWxpZGF0aW9uICh7cGF0aFRvRXhwYW5kZWRHaXRMYWJDaSwgZ2l0TGFiQ2lDb25maWd9OiB7XG4gICAgICAgIHBhdGhUb0V4cGFuZGVkR2l0TGFiQ2k6IHN0cmluZztcbiAgICAgICAgZ2l0TGFiQ2lDb25maWc6IG9iamVjdDtcbiAgICB9KSB7XG4gICAgICAgIGNvbnN0IGFqdiA9IG5ldyBBanYoe1xuICAgICAgICAgICAgdmVyYm9zZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbEVycm9yczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93VW5pb25UeXBlczogdHJ1ZSxcbiAgICAgICAgICAgIHZhbGlkYXRlRm9ybWF0czogZmFsc2UsXG4gICAgICAgICAgICBzdHJpY3RUeXBlczogZmFsc2UsIC8vIHRvIHN1cHByZXNzIHRoZSBtaXNzaW5nIHR5cGVzIGRlZmluZWQgaW4gdGhlIGdpdGxhYi1jaSBqc29uIHNjaGVtYVxuICAgICAgICAgICAga2V5d29yZHM6IFtcIm1hcmtkb3duRGVzY3JpcHRpb25cIl0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IGFqdi5jb21waWxlKHNjaGVtYSk7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGUoZ2l0TGFiQ2lDb25maWcpO1xuICAgICAgICBpZiAoIXZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBiZXR0ZXJFcnJvcnMgPSBiZXR0ZXJBanZFcnJvcnMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGdpdExhYkNpQ29uZmlnLFxuICAgICAgICAgICAgICAgIGVycm9yczogdmFsaWRhdGUuZXJyb3JzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBlOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGJldHRlckVycm9ycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpICsgMSA+IE1BWF9FUlJPUlMpIHtcbiAgICAgICAgICAgICAgICAgICAgZSArPSBgXFx0Li4uIGFuZCAke2xlbiAtIE1BWF9FUlJPUlN9IG1vcmVgO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZSArPSBjaGFsa2BcXHTigKIge3JlZEJyaWdodCAke2JldHRlckVycm9yc1tpXS5tZXNzYWdlfX0gYXQge2JsdWVCcmlnaHQgJHtiZXR0ZXJFcnJvcnNbaV0ucGF0aH19XFxuYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXNzZXJ0KHZhbGlkLCBjaGFsa2BcbntyZXNldCBJbnZhbGlkIC5naXRsYWItY2kueW1sIGNvbmZpZ3VyYXRpb24hXG4ke2UudHJpbUVuZCgpfVxuXG5Gb3IgZnVydGhlciB0cm91Ymxlc2hvb3RpbmcsIGNvbnNpZGVyIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nOlxuXFx04oCiIENvcHkgdGhlIGNvbnRlbnQgb2Yge2JsdWVCcmlnaHQgJHt0ZXJtaW5hbExpbmsoXCIuZ2l0bGFiLWNpLWxvY2FsL2V4cGFuZGVkLWdpdGxhYi1jaS55bWxcIiwgcGF0aFRvRXhwYW5kZWRHaXRMYWJDaSl9fSB0byB0aGUgJHt0ZXJtaW5hbExpbmsoXCJwaXBlbGluZSBlZGl0b3JcIiwgXCJodHRwczovL2RvY3MuZ2l0bGFiLmNvbS9lZS9jaS9waXBlbGluZV9lZGl0b3IvXCIpfSB0byBkZWJ1ZyBpdFxuXFx04oCiIFVzZSAtLWpzb24tc2NoZW1hLXZhbGlkYXRpb249ZmFsc2UgdG8gZGlzYWJsZSBzY2hlbWEgdmFsaWRhdGlvbiAobm90IHJlY29tbWVuZGVkKX1cbmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmVlZHMgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPiwgc3RhZ2VzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcbiAgICAgICAgICAgIGlmIChqb2IubmVlZHMgPT09IG51bGwgfHwgam9iLm5lZWRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2ksIG5lZWRdIG9mIGpvYi5uZWVkcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobmVlZC5waXBlbGluZSkge1xuICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKGAke2pvYi5uYW1lfS5uZWVkc1ske2l9XS5qb2I6JHtuZWVkLmpvYn0gaWdub3JlZCwgcGlwZWxpbmUga2V5IG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZWVkLnByb2plY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChgJHtqb2IubmFtZX0ubmVlZHNbJHtpfV0gaWdub3JlZCwgcHJvamVjdCBrZXkgbm90IHN1cHBvcnRlZGApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZEpvYiA9IGpvYnMuZmluZChqID0+IGouYmFzZU5hbWUgPT09IG5lZWQuam9iKTtcbiAgICAgICAgICAgICAgICBpZiAobmVlZC5vcHRpb25hbCAmJiAhbmVlZEpvYikgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KG5lZWRKb2IgIT0gbnVsbCwgY2hhbGtgbmVlZHM6IFt7Ymx1ZUJyaWdodCAke25lZWQuam9ifX1dIGZvciB7Ymx1ZUJyaWdodCAke2pvYi5iYXNlTmFtZX19IGNvdWxkIG5vdCBiZSBmb3VuZGApO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRKb2JTdGFnZUluZGV4ID0gc3RhZ2VzLmluZGV4T2YobmVlZEpvYi5zdGFnZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9iU3RhZ2VJbmRleCA9IHN0YWdlcy5pbmRleE9mKGpvYi5zdGFnZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KG5lZWRKb2JTdGFnZUluZGV4IDw9IGpvYlN0YWdlSW5kZXgsIGNoYWxrYG5lZWRzOiBbe2JsdWVCcmlnaHQgJHtuZWVkSm9iLm5hbWV9fV0gZm9yIHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fSBpcyBpbiBhIGZ1dHVyZSBzdGFnZWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhcm5pbmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGRlcGVuZGVuY2llcyAoam9iczogUmVhZG9ubHlBcnJheTxKb2I+LCBzdGFnZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcbiAgICAgICAgICAgIGlmIChqb2IuZGVwZW5kZW5jaWVzID09PSBudWxsIHx8IGpvYi5kZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgdW5kZWZEZXBzID0gam9iLmRlcGVuZGVuY2llcy5maWx0ZXIoKGopID0+ICFqb2JzLnNvbWUobiA9PiBuLmJhc2VOYW1lID09PSBqKSk7XG4gICAgICAgICAgICBhc3NlcnQodW5kZWZEZXBzLmxlbmd0aCAhPT0gam9iLmRlcGVuZGVuY2llcy5sZW5ndGgsIGNoYWxrYGRlcGVuZGVuY2llczogW3tibHVlQnJpZ2h0ICR7dW5kZWZEZXBzLmpvaW4oXCIsXCIpfX1dIGZvciB7Ymx1ZUJyaWdodCAke2pvYi5uYW1lfX0gY2Fubm90IGJlIGZvdW5kYCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGpvYi5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBKb2IgPSBqb2JzLmZpbmQoaiA9PiBqLmJhc2VOYW1lID09PSBkZXApO1xuICAgICAgICAgICAgICAgIGFzc2VydChkZXBKb2IgIT0gbnVsbCwgY2hhbGtgZGVwZW5kZW5jaWVzOiBbe2JsdWVCcmlnaHQgJHtkZXB9fV0gZm9yIHtibHVlQnJpZ2h0ICR7am9iLmJhc2VOYW1lfX0gY291bGQgbm90IGJlIGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwSm9iU3RhZ2VJbmRleCA9IHN0YWdlcy5pbmRleE9mKGRlcEpvYi5zdGFnZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9iU3RhZ2VJbmRleCA9IHN0YWdlcy5pbmRleE9mKGpvYi5zdGFnZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGRlcEpvYlN0YWdlSW5kZXggPD0gam9iU3RhZ2VJbmRleCwgY2hhbGtgZGVwZW5kZW5jaWVzOiBbe2JsdWVCcmlnaHQgJHtkZXBKb2IubmFtZX19XSBmb3Ige2JsdWVCcmlnaHQgJHtqb2IubmFtZX19IGlzIGluIGEgZnV0dXJlIHN0YWdlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBkZXBlbmRlbmNpZXNDb250YWlubWVudCAoam9iczogUmVhZG9ubHlBcnJheTxKb2I+KSB7XG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRzID0gam9iLm5lZWRzO1xuICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gam9iLmRlcGVuZGVuY2llcztcbiAgICAgICAgICAgIGlmIChuZWVkcyAmJiBuZWVkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXMgfHwgIW5lZWRzKSBjb250aW51ZTtcblxuXG4gICAgICAgICAgICBjb25zdCBldmVyeUluY2x1ZGVkID0gZGVwZW5kZW5jaWVzLmV2ZXJ5KChkZXA6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZWVkcy5zb21lKG4gPT4gbi5qb2IgPT09IGRlcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGFzc2VydE1zZyA9IGAke2pvYi5mb3JtYXR0ZWRKb2JOYW1lfSBuZWVkczogJyR7bmVlZHMubWFwKG4gPT4gbi5qb2IpLmpvaW4oXCIsXCIpfScgZG9lc24ndCBmdWxseSBjb250YWluIGRlcGVuZGVuY2llczogJyR7ZGVwZW5kZW5jaWVzLmpvaW4oXCIsXCIpfSdgO1xuICAgICAgICAgICAgYXNzZXJ0KGV2ZXJ5SW5jbHVkZWQsIGFzc2VydE1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGVzZSBqb2JzIG5hbWVkIGFyZSByZXNlcnZlZCBrZXl3b3JkcyBpbiBHaXRMYWIgQ0kgYnV0IGRvZXMgbm90IHByZXZlbnQgdGhlIHBpcGVsaW5lIGZyb20gcnVubmluZ1xuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlY293L2dpdGxhYi1jaS1sb2NhbC9pc3N1ZXMvMTI2M1xuICAgICAqIEBwYXJhbSBqb2JzTmFtZXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIHBvdGVudGlhbElsbGVnYWxKb2JOYW1lIChqb2JzTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmdzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgam9iTmFtZSBvZiBqb2JzTmFtZXMpIHtcbiAgICAgICAgICAgIGlmIChuZXcgU2V0KFtcInR5cGVzXCIsIFwidHJ1ZVwiLCBcImZhbHNlXCIsIFwibmlsXCJdKS5oYXMoam9iTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKGBKb2IgbmFtZSBcIiR7am9iTmFtZX1cIiBpcyBhIHJlc2VydmVkIGtleXdvcmQuIChodHRwczovL2RvY3MuZ2l0bGFiLmNvbS9lZS9jaS9qb2JzLyNqb2ItbmFtZS1saW1pdGF0aW9ucylgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2FybmluZ3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgc2NyaXB0QmxhbmsgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPikge1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLnRyaWdnZXIpIGNvbnRpbnVlOyAvLyBKb2JzIHdpdGggdHJpZ2dlciBhcmUgYWxsb3dlZCB0byBoYXZlIGVtcHR5IHNjcmlwdFxuICAgICAgICAgICAgYXNzZXJ0KGpvYi5zY3JpcHRzLmxlbmd0aCA+IDAsIGNoYWxrYHtibHVlICR7am9iLm5hbWV9fSBoYXMgZW1wdHkgc2NyaXB0YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhcnJheU9mU3RyaW5ncyAoam9iczogUmVhZG9ubHlBcnJheTxKb2I+KSB7XG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcbiAgICAgICAgICAgIGlmIChqb2IudHJpZ2dlcikgY29udGludWU7XG4gICAgICAgICAgICBqb2IuYmVmb3JlU2NyaXB0cy5mb3JFYWNoKChzOiBhbnkpID0+IGFzc2VydCh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiwgY2hhbGtge2JsdWUgJHtqb2IubmFtZX19IGJlZm9yZV9zY3JpcHQgY29udGFpbnMgbm9uIHN0cmluZyB2YWx1ZWApKTtcbiAgICAgICAgICAgIGpvYi5hZnRlclNjcmlwdHMuZm9yRWFjaCgoczogYW55KSA9PiBhc3NlcnQodHlwZW9mIHMgPT09IFwic3RyaW5nXCIsIGNoYWxrYHtibHVlICR7am9iLm5hbWV9fSBhZnRlcl9zY3JpcHQgY29udGFpbnMgbm9uIHN0cmluZyB2YWx1ZWApKTtcbiAgICAgICAgICAgIGpvYi5zY3JpcHRzLmZvckVhY2goKHM6IGFueSkgPT4gYXNzZXJ0KHR5cGVvZiBzID09PSBcInN0cmluZ1wiLCBjaGFsa2B7Ymx1ZSAke2pvYi5uYW1lfX0gc2NyaXB0IGNvbnRhaW5zIG5vbiBzdHJpbmcgdmFsdWVgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcnVuIChqb2JzOiBSZWFkb25seUFycmF5PEpvYj4sIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMuc2NyaXB0Qmxhbmsoam9icyk7XG4gICAgICAgIHRoaXMuYXJyYXlPZlN0cmluZ3Moam9icyk7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goLi4udGhpcy5uZWVkcyhqb2JzLCBzdGFnZXMpKTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMoam9icywgc3RhZ2VzKTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNDb250YWlubWVudChqb2JzKTtcbiAgICAgICAgd2FybmluZ3MucHVzaCguLi50aGlzLnBvdGVudGlhbElsbGVnYWxKb2JOYW1lKGpvYnMubWFwKGogPT4gai5iYXNlTmFtZSkpKTtcbiAgICAgICAgd2FybmluZ3MucHVzaCguLi50aGlzLmFydGlmYWN0cyhqb2JzKSk7XG4gICAgICAgIHJldHVybiB3YXJuaW5ncztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhcnRpZmFjdHMgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPikge1xuICAgICAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuICAgICAgICAgICAgaWYgKGpvYi5hcnRpZmFjdHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKGAke2pvYi5uYW1lfS5hcnRpZmFjdHMgaXMgbnVsbCwgaWdub3JpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhcm5pbmdzO1xuICAgIH1cbn1cbiJdfQ==
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUV0QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sTUFBTSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLFlBQVksTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBRXJCLE1BQU0sT0FBTyxTQUFTO0lBQ2xCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBRSxFQUFDLHNCQUFzQixFQUFFLGNBQWMsRUFHbkU7UUFDRyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztZQUNoQixPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsZUFBZSxFQUFFLElBQUk7WUFDckIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsV0FBVyxFQUFFLEtBQUssRUFBRSxxRUFBcUU7WUFDekYsUUFBUSxFQUFFLENBQUMscUJBQXFCLENBQUM7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDO2dCQUNqQyxJQUFJLEVBQUUsY0FBYztnQkFDcEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2FBQzFCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxHQUFXLEVBQUUsQ0FBQztZQUNuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMs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QXdCLEVBQUUsTUFBeUI7UUFDakUsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxNQUFNLENBQUMsU0FBUyxDQUFFLElBQXdCO1FBQzlDLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JCLElBQUksR0FBRyxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLCtCQUErQixDQUFDLENBQUM7WUFDOUQsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQWp2IGZyb20gXCJhanZcIjtcbmltcG9ydCB7Sm9ifSBmcm9tIFwiLi9qb2IuanNcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHNjaGVtYSBmcm9tIFwiLi9zY2hlbWEvaW5kZXguanNcIjtcbmltcG9ydCB7YmV0dGVyQWp2RXJyb3JzfSBmcm9tIFwiLi9zY2hlbWEtZXJyb3IuanNcIjtcbmltcG9ydCB0ZXJtaW5hbExpbmsgZnJvbSBcInRlcm1pbmFsLWxpbmtcIjtcblxuY29uc3QgTUFYX0VSUk9SUyA9IDU7XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3Ige1xuICAgIHN0YXRpYyBqc29uU2NoZW1hVmFsaWRhdGlvbiAoe3BhdGhUb0V4cGFuZGVkR2l0TGFiQ2ksIGdpdExhYkNpQ29uZmlnfToge1xuICAgICAgICBwYXRoVG9FeHBhbmRlZEdpdExhYkNpOiBzdHJpbmc7XG4gICAgICAgIGdpdExhYkNpQ29uZmlnOiBvYmplY3Q7XG4gICAgfSkge1xuICAgICAgICBjb25zdCBhanYgPSBuZXcgQWp2KHtcbiAgICAgICAgICAgIHZlcmJvc2U6IHRydWUsXG4gICAgICAgICAgICBhbGxFcnJvcnM6IHRydWUsXG4gICAgICAgICAgICBhbGxvd1VuaW9uVHlwZXM6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZUZvcm1hdHM6IGZhbHNlLFxuICAgICAgICAgICAgc3RyaWN0VHlwZXM6IGZhbHNlLCAvLyB0byBzdXBwcmVzcyB0aGUgbWlzc2luZyB0eXBlcyBkZWZpbmVkIGluIHRoZSBnaXRsYWItY2kganNvbiBzY2hlbWFcbiAgICAgICAgICAgIGtleXdvcmRzOiBbXCJtYXJrZG93bkRlc2NyaXB0aW9uXCJdLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBhanYuY29tcGlsZShzY2hlbWEpO1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlKGdpdExhYkNpQ29uZmlnKTtcbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgICAgY29uc3QgYmV0dGVyRXJyb3JzID0gYmV0dGVyQWp2RXJyb3JzKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBnaXRMYWJDaUNvbmZpZyxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IHZhbGlkYXRlLmVycm9ycyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgZTogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBiZXR0ZXJFcnJvcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSArIDEgPiBNQVhfRVJST1JTKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgKz0gYFxcdC4uLiBhbmQgJHtsZW4gLSBNQVhfRVJST1JTfSBtb3JlYDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGUgKz0gY2hhbGtgXFx04oCiIHtyZWRCcmlnaHQgJHtiZXR0ZXJFcnJvcnNbaV0ubWVzc2FnZX19IGF0IHtibHVlQnJpZ2h0ICR7YmV0dGVyRXJyb3JzW2ldLnBhdGh9fVxcbmA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFzc2VydCh2YWxpZCwgY2hhbGtgXG57cmVzZXQgSW52YWxpZCAuZ2l0bGFiLWNpLnltbCBjb25maWd1cmF0aW9uIVxuJHtlLnRyaW1FbmQoKX1cblxuRm9yIGZ1cnRoZXIgdHJvdWJsZXNob290aW5nLCBjb25zaWRlciBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZzpcblxcdOKAoiBDb3B5IHRoZSBjb250ZW50IG9mIHtibHVlQnJpZ2h0ICR7dGVybWluYWxMaW5rKFwiLmdpdGxhYi1jaS1sb2NhbC9leHBhbmRlZC1naXRsYWItY2kueW1sXCIsIHBhdGhUb0V4cGFuZGVkR2l0TGFiQ2kpfX0gdG8gdGhlICR7dGVybWluYWxMaW5rKFwicGlwZWxpbmUgZWRpdG9yXCIsIFwiaHR0cHM6Ly9kb2NzLmdpdGxhYi5jb20vZWUvY2kvcGlwZWxpbmVfZWRpdG9yL1wiKX0gdG8gZGVidWcgaXRcblxcdOKAoiBVc2UgLS1qc29uLXNjaGVtYS12YWxpZGF0aW9uPWZhbHNlIHRvIGRpc2FibGUgc2NoZW1hIHZhbGlkYXRpb24gKG5vdCByZWNvbW1lbmRlZCl9XG5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG5lZWRzIChqb2JzOiBSZWFkb25seUFycmF5PEpvYj4sIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLm5lZWRzID09PSBudWxsIHx8IGpvYi5uZWVkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpLCBuZWVkXSBvZiBqb2IubmVlZHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWQucGlwZWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChgJHtqb2IubmFtZX0ubmVlZHNbJHtpfV0uam9iOiR7bmVlZC5qb2J9IGlnbm9yZWQsIHBpcGVsaW5lIGtleSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmVlZC5wcm9qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goYCR7am9iLm5hbWV9Lm5lZWRzWyR7aX1dIGlnbm9yZWQsIHByb2plY3Qga2V5IG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRKb2IgPSBqb2JzLmZpbmQoaiA9PiBqLmJhc2VOYW1lID09PSBuZWVkLmpvYik7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWQub3B0aW9uYWwgJiYgIW5lZWRKb2IpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGFzc2VydChuZWVkSm9iICE9IG51bGwsIGNoYWxrYG5lZWRzOiBbe2JsdWVCcmlnaHQgJHtuZWVkLmpvYn19XSBmb3Ige2JsdWVCcmlnaHQgJHtqb2IuYmFzZU5hbWV9fSBjb3VsZCBub3QgYmUgZm91bmRgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkSm9iU3RhZ2VJbmRleCA9IHN0YWdlcy5pbmRleE9mKG5lZWRKb2Iuc3RhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvYlN0YWdlSW5kZXggPSBzdGFnZXMuaW5kZXhPZihqb2Iuc3RhZ2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChuZWVkSm9iU3RhZ2VJbmRleCA8PSBqb2JTdGFnZUluZGV4LCBjaGFsa2BuZWVkczogW3tibHVlQnJpZ2h0ICR7bmVlZEpvYi5uYW1lfX1dIGZvciB7Ymx1ZUJyaWdodCAke2pvYi5uYW1lfX0gaXMgaW4gYSBmdXR1cmUgc3RhZ2VgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YXJuaW5ncztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBkZXBlbmRlbmNpZXMgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPiwgc3RhZ2VzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLmRlcGVuZGVuY2llcyA9PT0gbnVsbCB8fCBqb2IuZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHVuZGVmRGVwcyA9IGpvYi5kZXBlbmRlbmNpZXMuZmlsdGVyKChqKSA9PiAham9icy5zb21lKG4gPT4gbi5iYXNlTmFtZSA9PT0gaikpO1xuICAgICAgICAgICAgYXNzZXJ0KHVuZGVmRGVwcy5sZW5ndGggIT09IGpvYi5kZXBlbmRlbmNpZXMubGVuZ3RoLCBjaGFsa2BkZXBlbmRlbmNpZXM6IFt7Ymx1ZUJyaWdodCAke3VuZGVmRGVwcy5qb2luKFwiLFwiKX19XSBmb3Ige2JsdWVCcmlnaHQgJHtqb2IubmFtZX19IGNhbm5vdCBiZSBmb3VuZGApO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBqb2IuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwSm9iID0gam9icy5maW5kKGogPT4gai5iYXNlTmFtZSA9PT0gZGVwKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZGVwSm9iICE9IG51bGwsIGNoYWxrYGRlcGVuZGVuY2llczogW3tibHVlQnJpZ2h0ICR7ZGVwfX1dIGZvciB7Ymx1ZUJyaWdodCAke2pvYi5iYXNlTmFtZX19IGNvdWxkIG5vdCBiZSBmb3VuZGApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcEpvYlN0YWdlSW5kZXggPSBzdGFnZXMuaW5kZXhPZihkZXBKb2Iuc3RhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvYlN0YWdlSW5kZXggPSBzdGFnZXMuaW5kZXhPZihqb2Iuc3RhZ2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChkZXBKb2JTdGFnZUluZGV4IDw9IGpvYlN0YWdlSW5kZXgsIGNoYWxrYGRlcGVuZGVuY2llczogW3tibHVlQnJpZ2h0ICR7ZGVwSm9iLm5hbWV9fV0gZm9yIHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fSBpcyBpbiBhIGZ1dHVyZSBzdGFnZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZGVwZW5kZW5jaWVzQ29udGFpbm1lbnQgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPikge1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBjb25zdCBuZWVkcyA9IGpvYi5uZWVkcztcbiAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGpvYi5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICBpZiAobmVlZHMgJiYgbmVlZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZGVwZW5kZW5jaWVzIHx8ICFuZWVkcykgY29udGludWU7XG5cblxuICAgICAgICAgICAgY29uc3QgZXZlcnlJbmNsdWRlZCA9IGRlcGVuZGVuY2llcy5ldmVyeSgoZGVwOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmVlZHMuc29tZShuID0+IG4uam9iID09PSBkZXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRNc2cgPSBgJHtqb2IuZm9ybWF0dGVkSm9iTmFtZX0gbmVlZHM6ICcke25lZWRzLm1hcChuID0+IG4uam9iKS5qb2luKFwiLFwiKX0nIGRvZXNuJ3QgZnVsbHkgY29udGFpbiBkZXBlbmRlbmNpZXM6ICcke2RlcGVuZGVuY2llcy5qb2luKFwiLFwiKX0nYDtcbiAgICAgICAgICAgIGFzc2VydChldmVyeUluY2x1ZGVkLCBhc3NlcnRNc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlc2Ugam9icyBuYW1lZCBhcmUgcmVzZXJ2ZWQga2V5d29yZHMgaW4gR2l0TGFiIENJIGJ1dCBkb2VzIG5vdCBwcmV2ZW50IHRoZSBwaXBlbGluZSBmcm9tIHJ1bm5pbmdcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmlyZWNvdy9naXRsYWItY2ktbG9jYWwvaXNzdWVzLzEyNjNcbiAgICAgKiBAcGFyYW0gam9ic05hbWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBwb3RlbnRpYWxJbGxlZ2FsSm9iTmFtZSAoam9ic05hbWVzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGpvYk5hbWUgb2Ygam9ic05hbWVzKSB7XG4gICAgICAgICAgICBpZiAobmV3IFNldChbXCJ0eXBlc1wiLCBcInRydWVcIiwgXCJmYWxzZVwiLCBcIm5pbFwiXSkuaGFzKGpvYk5hbWUpKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChgSm9iIG5hbWUgXCIke2pvYk5hbWV9XCIgaXMgYSByZXNlcnZlZCBrZXl3b3JkLiAoaHR0cHM6Ly9kb2NzLmdpdGxhYi5jb20vZWUvY2kvam9icy8jam9iLW5hbWUtbGltaXRhdGlvbnMpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhcm5pbmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNjcmlwdEJsYW5rIChqb2JzOiBSZWFkb25seUFycmF5PEpvYj4pIHtcbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuICAgICAgICAgICAgaWYgKGpvYi50cmlnZ2VyKSBjb250aW51ZTsgLy8gSm9icyB3aXRoIHRyaWdnZXIgYXJlIGFsbG93ZWQgdG8gaGF2ZSBlbXB0eSBzY3JpcHRcbiAgICAgICAgICAgIGFzc2VydChqb2Iuc2NyaXB0cy5sZW5ndGggPiAwLCBjaGFsa2B7Ymx1ZSAke2pvYi5uYW1lfX0gaGFzIGVtcHR5IHNjcmlwdGApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXJyYXlPZlN0cmluZ3MgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPikge1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLnRyaWdnZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgam9iLmJlZm9yZVNjcmlwdHMuZm9yRWFjaCgoczogYW55KSA9PiBhc3NlcnQodHlwZW9mIHMgPT09IFwic3RyaW5nXCIsIGNoYWxrYHtibHVlICR7am9iLm5hbWV9fSBiZWZvcmVfc2NyaXB0IGNvbnRhaW5zIG5vbiBzdHJpbmcgdmFsdWVgKSk7XG4gICAgICAgICAgICBqb2IuYWZ0ZXJTY3JpcHRzLmZvckVhY2goKHM6IGFueSkgPT4gYXNzZXJ0KHR5cGVvZiBzID09PSBcInN0cmluZ1wiLCBjaGFsa2B7Ymx1ZSAke2pvYi5uYW1lfX0gYWZ0ZXJfc2NyaXB0IGNvbnRhaW5zIG5vbiBzdHJpbmcgdmFsdWVgKSk7XG4gICAgICAgICAgICBqb2Iuc2NyaXB0cy5mb3JFYWNoKChzOiBhbnkpID0+IGFzc2VydCh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiwgY2hhbGtge2JsdWUgJHtqb2IubmFtZX19IHNjcmlwdCBjb250YWlucyBub24gc3RyaW5nIHZhbHVlYCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHJ1biAoam9iczogUmVhZG9ubHlBcnJheTxKb2I+LCBzdGFnZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnNjcmlwdEJsYW5rKGpvYnMpO1xuICAgICAgICB0aGlzLmFycmF5T2ZTdHJpbmdzKGpvYnMpO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnRoaXMubmVlZHMoam9icywgc3RhZ2VzKSk7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzKGpvYnMsIHN0YWdlcyk7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzQ29udGFpbm1lbnQoam9icyk7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goLi4udGhpcy5wb3RlbnRpYWxJbGxlZ2FsSm9iTmFtZShqb2JzLm1hcChqID0+IGouYmFzZU5hbWUpKSk7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goLi4udGhpcy5hcnRpZmFjdHMoam9icykpO1xuICAgICAgICByZXR1cm4gd2FybmluZ3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXJ0aWZhY3RzIChqb2JzOiBSZWFkb25seUFycmF5PEpvYj4pIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcbiAgICAgICAgICAgIGlmIChqb2IuYXJ0aWZhY3RzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChgJHtqb2IubmFtZX0uYXJ0aWZhY3RzIGlzIG51bGwsIGlnbm9yaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YXJuaW5ncztcbiAgICB9XG59XG4iXX0=