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/README.md +44 -11
- package/package.json +30 -15
- package/src/argv.js +26 -47
- package/src/commander.js +32 -38
- package/src/data-expander.js +38 -88
- package/src/executor.js +10 -40
- package/src/git-data.js +31 -61
- package/src/gitlab-preset.js +6 -9
- package/src/handler.js +40 -69
- package/src/index.js +39 -59
- package/src/job.js +186 -189
- package/src/mutex.js +2 -6
- package/src/parallel.js +7 -14
- package/src/parser-includes.js +48 -76
- package/src/parser.js +60 -89
- package/src/predefined-variables.js +43 -19
- package/src/producers.js +4 -8
- package/src/schema/index.js +6 -8
- package/src/schema/schema.json +21 -2
- package/src/schema-error.js +4 -11
- package/src/state.js +4 -31
- package/src/utils.js +94 -73
- package/src/validator.js +24 -31
- package/src/variables-from-files.js +39 -53
- package/src/write-streams.js +14 -8
package/src/parser.js
CHANGED
|
@@ -1,52 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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.Parser = void 0;
|
|
30
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
31
|
-
const path_1 = __importDefault(require("path"));
|
|
32
|
-
const deep_extend_1 = __importDefault(require("deep-extend"));
|
|
33
|
-
const fs = __importStar(require("fs-extra"));
|
|
34
|
-
const yaml = __importStar(require("js-yaml"));
|
|
35
|
-
const pretty_hrtime_1 = __importDefault(require("pretty-hrtime"));
|
|
36
|
-
const job_1 = require("./job");
|
|
37
|
-
const DataExpander = __importStar(require("./data-expander"));
|
|
38
|
-
const utils_1 = require("./utils");
|
|
39
|
-
const assert_1 = __importDefault(require("assert"));
|
|
40
|
-
const validator_1 = require("./validator");
|
|
41
|
-
const parallel = __importStar(require("./parallel"));
|
|
42
|
-
const git_data_1 = require("./git-data");
|
|
43
|
-
const parser_includes_1 = require("./parser-includes");
|
|
44
|
-
const producers_1 = require("./producers");
|
|
45
|
-
const variables_from_files_1 = require("./variables-from-files");
|
|
46
|
-
const predefined_variables_1 = require("./predefined-variables");
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import deepExtend from "deep-extend";
|
|
4
|
+
import fs from "fs-extra";
|
|
5
|
+
import * as yaml from "js-yaml";
|
|
6
|
+
import prettyHrtime from "pretty-hrtime";
|
|
7
|
+
import { Job } from "./job.js";
|
|
8
|
+
import * as DataExpander from "./data-expander.js";
|
|
9
|
+
import { Utils } from "./utils.js";
|
|
10
|
+
import assert from "assert";
|
|
11
|
+
import { Validator } from "./validator.js";
|
|
12
|
+
import * as parallel from "./parallel.js";
|
|
13
|
+
import { GitData } from "./git-data.js";
|
|
14
|
+
import { ParserIncludes } from "./parser-includes.js";
|
|
15
|
+
import { Producers } from "./producers.js";
|
|
16
|
+
import { VariablesFromFiles } from "./variables-from-files.js";
|
|
17
|
+
import { init as initPredefinedVariables } from "./predefined-variables.js";
|
|
47
18
|
const MAX_FUNCTIONS = 3;
|
|
48
19
|
const INCLUDE_INPUTS_SUPPORTED_TYPES = ["string", "boolean", "number", "array"];
|
|
49
|
-
class Parser {
|
|
20
|
+
export class Parser {
|
|
50
21
|
_stages = [];
|
|
51
22
|
_gitlabData;
|
|
52
23
|
_jobNamePad = null;
|
|
@@ -75,28 +46,28 @@ class Parser {
|
|
|
75
46
|
const parser = new Parser(argv, writeStreams, pipelineIid, jobs, expandVariables);
|
|
76
47
|
const time = process.hrtime();
|
|
77
48
|
await parser.init();
|
|
78
|
-
const warnings = await
|
|
49
|
+
const warnings = await Validator.run(parser.jobs, parser.stages);
|
|
79
50
|
for (const job of parser.jobs) {
|
|
80
51
|
if (job.artifacts === null) {
|
|
81
52
|
job.deleteArtifacts();
|
|
82
53
|
}
|
|
83
54
|
}
|
|
84
55
|
const parsingTime = process.hrtime(time);
|
|
85
|
-
const pathToExpandedGitLabCi =
|
|
86
|
-
fs.mkdirpSync(
|
|
56
|
+
const pathToExpandedGitLabCi = path.join(argv.cwd, argv.stateDir, "expanded-gitlab-ci.yml");
|
|
57
|
+
fs.mkdirpSync(path.join(argv.cwd, argv.stateDir));
|
|
87
58
|
fs.writeFileSync(pathToExpandedGitLabCi, yaml.dump(parser.gitlabData));
|
|
88
|
-
writeStreams.stderr(
|
|
59
|
+
writeStreams.stderr(chalk `{grey parsing and downloads finished in ${prettyHrtime(parsingTime)}.}\n`);
|
|
89
60
|
for (const warning of warnings) {
|
|
90
|
-
writeStreams.stderr(
|
|
61
|
+
writeStreams.stderr(chalk `{yellow ${warning}}\n`);
|
|
91
62
|
}
|
|
92
63
|
// # Second layer of check for errors that are not caught in Validator.run
|
|
93
64
|
if (parser.argv.jsonSchemaValidation) {
|
|
94
65
|
const time = process.hrtime();
|
|
95
|
-
|
|
66
|
+
Validator.jsonSchemaValidation({
|
|
96
67
|
pathToExpandedGitLabCi,
|
|
97
68
|
gitLabCiConfig: parser.gitlabData,
|
|
98
69
|
});
|
|
99
|
-
writeStreams.stderr(
|
|
70
|
+
writeStreams.stderr(chalk `{grey json schema validated in ${prettyHrtime(process.hrtime(time))}}\n`);
|
|
100
71
|
}
|
|
101
72
|
return parser;
|
|
102
73
|
}
|
|
@@ -108,28 +79,28 @@ class Parser {
|
|
|
108
79
|
const file = argv.file;
|
|
109
80
|
const pipelineIid = this.pipelineIid;
|
|
110
81
|
const fetchIncludes = argv.fetchIncludes;
|
|
111
|
-
const gitData = await
|
|
112
|
-
const variablesFromFiles = await
|
|
113
|
-
const
|
|
114
|
-
const
|
|
82
|
+
const gitData = await GitData.init(cwd, writeStreams);
|
|
83
|
+
const variablesFromFiles = await VariablesFromFiles.init(argv, writeStreams, gitData);
|
|
84
|
+
const envMatchedVariables = Utils.findEnvMatchedVariables(variablesFromFiles);
|
|
85
|
+
const predefinedVariables = initPredefinedVariables({ gitData, argv, envMatchedVariables });
|
|
115
86
|
const variables = { ...predefinedVariables, ...envMatchedVariables, ...argv.variable };
|
|
116
|
-
const expanded =
|
|
87
|
+
const expanded = Utils.expandVariables(variables);
|
|
117
88
|
let yamlDataList = [{ stages: [".pre", "build", "test", "deploy", ".post"] }];
|
|
118
89
|
const gitlabCiData = await Parser.loadYaml(`${cwd}/${file}`, {}, this.expandVariables);
|
|
119
|
-
yamlDataList = yamlDataList.concat(await
|
|
120
|
-
|
|
90
|
+
yamlDataList = yamlDataList.concat(await ParserIncludes.init(gitlabCiData, { cwd, stateDir, writeStreams, gitData, fetchIncludes, variables: expanded, expandVariables: this.expandVariables, maximumIncludes: argv.maximumIncludes }));
|
|
91
|
+
ParserIncludes.resetCount();
|
|
121
92
|
const gitlabCiLocalData = await Parser.loadYaml(`${cwd}/.gitlab-ci-local.yml`, {}, this.expandVariables);
|
|
122
|
-
yamlDataList = yamlDataList.concat(await
|
|
123
|
-
|
|
124
|
-
const gitlabData = (
|
|
93
|
+
yamlDataList = yamlDataList.concat(await ParserIncludes.init(gitlabCiLocalData, { cwd, stateDir, writeStreams, gitData, fetchIncludes, variables: expanded, expandVariables: this.expandVariables, maximumIncludes: argv.maximumIncludes }));
|
|
94
|
+
ParserIncludes.resetCount();
|
|
95
|
+
const gitlabData = deepExtend({}, ...yamlDataList);
|
|
125
96
|
// Expand various fields in gitlabData
|
|
126
97
|
DataExpander.jobExtends(gitlabData);
|
|
127
98
|
DataExpander.reference(gitlabData, gitlabData);
|
|
99
|
+
DataExpander.flattenLists(gitlabData);
|
|
128
100
|
DataExpander.complexObjects(gitlabData);
|
|
129
101
|
DataExpander.defaults(gitlabData);
|
|
130
102
|
DataExpander.globalVariables(gitlabData);
|
|
131
|
-
|
|
132
|
-
(0, assert_1.default)(gitlabData.stages && Array.isArray(gitlabData.stages), (0, chalk_1.default) `{yellow stages:} must be an array`);
|
|
103
|
+
assert(gitlabData.stages && Array.isArray(gitlabData.stages), chalk `{yellow stages:} must be an array`);
|
|
133
104
|
if (!gitlabData.stages.includes(".pre")) {
|
|
134
105
|
gitlabData.stages.unshift(".pre");
|
|
135
106
|
}
|
|
@@ -138,27 +109,28 @@ class Parser {
|
|
|
138
109
|
}
|
|
139
110
|
this._stages = gitlabData.stages;
|
|
140
111
|
// Check job variables for invalid hash of key value pairs, and cast numbers to strings
|
|
141
|
-
|
|
112
|
+
Utils.forEachRealJob(gitlabData, (jobName, jobData) => {
|
|
113
|
+
assert(jobData.when !== "never", chalk `This GitLab CI configuration is invalid: jobs:${jobName} when:never can only be used in a rules section or workflow:rules`);
|
|
142
114
|
for (const [key, _value] of Object.entries(jobData.variables || {})) {
|
|
143
115
|
let value = _value;
|
|
144
116
|
if (value === null)
|
|
145
117
|
value = ""; // variable's values are nullable
|
|
146
|
-
(
|
|
118
|
+
assert(typeof value === "string" || typeof value === "number" || typeof value === "boolean", chalk `{blueBright ${jobName}} has invalid variables hash of key value pairs. ${key}=${value}`);
|
|
147
119
|
jobData.variables[key] = String(value);
|
|
148
120
|
}
|
|
149
121
|
for (let i = 0; i < (jobData.services ?? []).length; i++) {
|
|
150
122
|
const service = jobData.services[i];
|
|
151
123
|
for (const [key, value] of Object.entries(service.variables || {})) {
|
|
152
|
-
(
|
|
124
|
+
assert(typeof value === "string" || typeof value === "number" || typeof value === "boolean", chalk `{blueBright ${jobName}.services[${i}]} has invalid variables hash of key value pairs. ${key}=${value}`);
|
|
153
125
|
jobData.services[i].variables[key] = String(value);
|
|
154
126
|
}
|
|
155
127
|
}
|
|
156
128
|
});
|
|
157
129
|
this._gitlabData = gitlabData;
|
|
158
130
|
// Generate jobs and put them into stages
|
|
159
|
-
|
|
160
|
-
(
|
|
161
|
-
(
|
|
131
|
+
Utils.forEachRealJob(gitlabData, (jobName, jobData) => {
|
|
132
|
+
assert(gitData != null, "gitData must be set");
|
|
133
|
+
assert(variablesFromFiles != null, "homeVariables must be set");
|
|
162
134
|
let nodeIndex = 1;
|
|
163
135
|
const parallelMatrixVariablesList = parallel.matrixVariablesList(jobData, jobName);
|
|
164
136
|
for (const parallelMatrixVariables of parallelMatrixVariablesList) {
|
|
@@ -169,7 +141,7 @@ class Parser {
|
|
|
169
141
|
else if (parallel.isPlainParallel(jobData)) {
|
|
170
142
|
matrixJobName = `${jobName}: [${nodeIndex}/${parallelMatrixVariablesList.length}]`;
|
|
171
143
|
}
|
|
172
|
-
const job = new
|
|
144
|
+
const job = new Job({
|
|
173
145
|
argv,
|
|
174
146
|
writeStreams,
|
|
175
147
|
data: jobData,
|
|
@@ -186,7 +158,7 @@ class Parser {
|
|
|
186
158
|
expandVariables: this.expandVariables,
|
|
187
159
|
});
|
|
188
160
|
const foundStage = this.stages.includes(job.stage);
|
|
189
|
-
(
|
|
161
|
+
assert(foundStage, chalk `{yellow stage:${job.stage}} not found for {blueBright ${job.name}}`);
|
|
190
162
|
this.jobs.push(job);
|
|
191
163
|
nodeIndex++;
|
|
192
164
|
}
|
|
@@ -219,7 +191,7 @@ class Parser {
|
|
|
219
191
|
});
|
|
220
192
|
// Generate producers for each job
|
|
221
193
|
this.jobs.forEach((job) => {
|
|
222
|
-
job.producers =
|
|
194
|
+
job.producers = Producers.init(this.jobs, this.stages, job);
|
|
223
195
|
});
|
|
224
196
|
}
|
|
225
197
|
static async loadYaml(filePath, ctx = {}, expandVariables = true) {
|
|
@@ -280,7 +252,7 @@ class Parser {
|
|
|
280
252
|
}
|
|
281
253
|
catch (e) {
|
|
282
254
|
if (e instanceof yaml.YAMLException && e.reason === "duplicated mapping key") {
|
|
283
|
-
console.log(
|
|
255
|
+
console.log(chalk `{black.bgYellowBright WARN } duplicated mapping key detected! Values will be overwritten!`);
|
|
284
256
|
fileData = yaml.loadAll(fileSplitClone.join("\n"), null, { schema, json: true });
|
|
285
257
|
}
|
|
286
258
|
else {
|
|
@@ -295,7 +267,7 @@ class Parser {
|
|
|
295
267
|
const interpolatedConfigurations = JSON.stringify(uninterpolatedConfigurations)
|
|
296
268
|
.replace(/(?<firstChar>.)?(?<secondChar>.)?\$\[\[\s*inputs.(?<interpolationKey>[\w-]+)\s*\|?\s*(?<interpolationFunctions>.*?)\s*\]\](?<lastChar>[^$])?/g // https://regexr.com/81c16
|
|
297
269
|
, (_, firstChar, secondChar, interpolationKey, interpolationFunctions, lastChar) => {
|
|
298
|
-
const configFilePath =
|
|
270
|
+
const configFilePath = path.relative(process.cwd(), filePath);
|
|
299
271
|
const context = {
|
|
300
272
|
interpolationKey,
|
|
301
273
|
interpolationFunctions,
|
|
@@ -327,7 +299,7 @@ class Parser {
|
|
|
327
299
|
}
|
|
328
300
|
return firstTwoChar + inputValue + lastChar;
|
|
329
301
|
default:
|
|
330
|
-
|
|
302
|
+
Utils.switchStatementExhaustiveCheck(inputType);
|
|
331
303
|
}
|
|
332
304
|
});
|
|
333
305
|
return JSON.parse(interpolatedConfigurations);
|
|
@@ -335,36 +307,35 @@ class Parser {
|
|
|
335
307
|
return fileData[0];
|
|
336
308
|
}
|
|
337
309
|
}
|
|
338
|
-
exports.Parser = Parser;
|
|
339
310
|
function isGitlabSpecFile(fileData) {
|
|
340
311
|
return "spec" in fileData;
|
|
341
312
|
}
|
|
342
313
|
function validateInterpolationKey(ctx) {
|
|
343
314
|
const { configFilePath, interpolationKey, inputsSpecification } = ctx;
|
|
344
|
-
const invalidInterpolationKeyErr =
|
|
345
|
-
(
|
|
315
|
+
const invalidInterpolationKeyErr = chalk `This GitLab CI configuration is invalid: \`{blueBright ${configFilePath}}\`: unknown interpolation key: \`${interpolationKey}\`.`;
|
|
316
|
+
assert(inputsSpecification.spec.inputs?.[interpolationKey] !== undefined, invalidInterpolationKeyErr);
|
|
346
317
|
}
|
|
347
318
|
function validateInterpolationFunctions(ctx) {
|
|
348
319
|
const { interpolationFunctions, configFilePath } = ctx;
|
|
349
320
|
if (interpolationFunctions != "") {
|
|
350
|
-
console.log(
|
|
321
|
+
console.log(chalk `{black.bgYellowBright WARN } interpolation functions is currently not supported via gitlab-ci-local. Functions will just be a no-op.`);
|
|
351
322
|
}
|
|
352
|
-
(
|
|
323
|
+
assert(interpolationFunctions.split("|").length <= MAX_FUNCTIONS, chalk `This GitLab CI configuration is invalid: \`{blueBright ${configFilePath}}\`: too many functions in interpolation block.`);
|
|
353
324
|
}
|
|
354
325
|
function validateInput(ctx) {
|
|
355
326
|
const { configFilePath, interpolationKey, inputsSpecification } = ctx;
|
|
356
327
|
const inputValue = getInputValue(ctx);
|
|
357
328
|
const options = inputsSpecification.spec.inputs[interpolationKey]?.options;
|
|
358
329
|
if (options) {
|
|
359
|
-
(
|
|
330
|
+
assert(options.includes(inputValue), chalk `This GitLab CI configuration is invalid: \`{blueBright ${configFilePath}}\`: \`{blueBright ${interpolationKey}}\` input: \`{blueBright ${inputValue}}\` cannot be used because it is not in the list of allowed options.`);
|
|
360
331
|
}
|
|
361
332
|
const expectedInputType = getExpectedInputType(ctx);
|
|
362
|
-
(
|
|
333
|
+
assert(INCLUDE_INPUTS_SUPPORTED_TYPES.includes(expectedInputType), chalk `This GitLab CI configuration is invalid: \`{blueBright ${configFilePath}}\`: header:spec:inputs:{blueBright ${interpolationKey}} input type unknown value: {blueBright ${expectedInputType}}.`);
|
|
363
334
|
const inputType = Array.isArray(inputValue) ? "array" : typeof inputValue;
|
|
364
|
-
(
|
|
335
|
+
assert(inputType === expectedInputType, chalk `This GitLab CI configuration is invalid: \`{blueBright ${configFilePath}}\`: \`{blueBright ${interpolationKey}}\` input: provided value is not a {blueBright ${expectedInputType}}.`);
|
|
365
336
|
const regex = inputsSpecification.spec.inputs[interpolationKey]?.regex;
|
|
366
337
|
if (regex) {
|
|
367
|
-
console.log(
|
|
338
|
+
console.log(chalk `{black.bgYellowBright WARN } spec:inputs:regex is currently not supported via gitlab-ci-local. This will just be a no-op.`);
|
|
368
339
|
}
|
|
369
340
|
}
|
|
370
341
|
function parseIncludeInputs(ctx) {
|
|
@@ -376,11 +347,11 @@ function parseIncludeInputs(ctx) {
|
|
|
376
347
|
function getInputValue(ctx) {
|
|
377
348
|
const { inputs, interpolationKey, configFilePath, inputsSpecification } = ctx;
|
|
378
349
|
const inputValue = inputs[interpolationKey] || inputsSpecification.spec.inputs[interpolationKey]?.default;
|
|
379
|
-
(
|
|
350
|
+
assert(inputValue !== undefined, chalk `This GitLab CI configuration is invalid: \`{blueBright ${configFilePath}}\`: \`{blueBright ${interpolationKey}}\` input: required value has not been provided.`);
|
|
380
351
|
return inputValue;
|
|
381
352
|
}
|
|
382
353
|
function getExpectedInputType(ctx) {
|
|
383
354
|
const { interpolationKey, inputsSpecification } = ctx;
|
|
384
355
|
return inputsSpecification.spec.inputs[interpolationKey]?.type || "string";
|
|
385
356
|
}
|
|
386
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLGdEQUF3QjtBQUN4Qiw4REFBcUM7QUFDckMsNkNBQStCO0FBQy9CLDhDQUFnQztBQUNoQyxrRUFBeUM7QUFDekMsK0JBQTBCO0FBQzFCLDhEQUFnRDtBQUNoRCxtQ0FBOEI7QUFDOUIsb0RBQTRCO0FBQzVCLDJDQUFzQztBQUN0QyxxREFBdUM7QUFDdkMseUNBQW1DO0FBQ25DLHVEQUFpRDtBQUNqRCwyQ0FBc0M7QUFDdEMsaUVBQTBEO0FBRzFELGlFQUF1RTtBQUV2RSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBR3pGLE1BQWEsTUFBTTtJQUVQLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDdkIsV0FBVyxDQUFNO0lBQ2pCLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0lBRWpDLElBQUksQ0FBUTtJQUNaLElBQUksQ0FBTztJQUNYLFlBQVksQ0FBZTtJQUMzQixXQUFXLENBQVM7SUFDcEIsZUFBZSxDQUFVO0lBRWxDLFlBQXFCLElBQVUsRUFBRSxZQUEwQixFQUFFLFdBQW1CLEVBQUUsSUFBVyxFQUFFLGVBQXdCO1FBQ25ILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFP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QWMsc0JBQXNCLGdCQUFnQixrREFBa0QsQ0FBQyxDQUFDO0lBQ3hNLE9BQU8sVUFBVSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFFLEdBQVE7SUFDbkMsTUFBTSxFQUFDLGdCQUFnQixFQUFFLG1CQUFtQixFQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BELE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksSUFBSSxRQUFRLENBQUM7QUFDL0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZGVlcEV4dGVuZCBmcm9tIFwiZGVlcC1leHRlbmRcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tIFwianMteWFtbFwiO1xuaW1wb3J0IHByZXR0eUhydGltZSBmcm9tIFwicHJldHR5LWhydGltZVwiO1xuaW1wb3J0IHtKb2J9IGZyb20gXCIuL2pvYlwiO1xuaW1wb3J0ICogYXMgRGF0YUV4cGFuZGVyIGZyb20gXCIuL2RhdGEtZXhwYW5kZXJcIjtcbmltcG9ydCB7VXRpbHN9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7VmFsaWRhdG9yfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcbmltcG9ydCAqIGFzIHBhcmFsbGVsIGZyb20gXCIuL3BhcmFsbGVsXCI7XG5pbXBvcnQge0dpdERhdGF9IGZyb20gXCIuL2dpdC1kYXRhXCI7XG5pbXBvcnQge1BhcnNlckluY2x1ZGVzfSBmcm9tIFwiLi9wYXJzZXItaW5jbHVkZXNcIjtcbmltcG9ydCB7UHJvZHVjZXJzfSBmcm9tIFwiLi9wcm9kdWNlcnNcIjtcbmltcG9ydCB7VmFyaWFibGVzRnJvbUZpbGVzfSBmcm9tIFwiLi92YXJpYWJsZXMtZnJvbS1maWxlc1wiO1xuaW1wb3J0IHtBcmd2fSBmcm9tIFwiLi9hcmd2XCI7XG5pbXBvcnQge1dyaXRlU3RyZWFtc30gZnJvbSBcIi4vd3JpdGUtc3RyZWFtc1wiO1xuaW1wb3J0IHtpbml0IGFzIGluaXRQcmVkZWZpbmVkVmFyaWFibGVzfSBmcm9tIFwiLi9wcmVkZWZpbmVkLXZhcmlhYmxlc1wiO1xuXG5jb25zdCBNQVhfRlVOQ1RJT05TID0gMztcbmNvbnN0IElOQ0xVREVfSU5QVVRTX1NVUFBPUlRFRF9UWVBFUyA9IFtcInN0cmluZ1wiLCBcImJvb2xlYW5cIiwgXCJudW1iZXJcIiwgXCJhcnJheVwiXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIElucHV0VHlwZSA9IHR5cGVvZiBJTkNMVURFX0lOUFVUU19TVVBQT1JURURfVFlQRVNbbnVtYmVyXTtcblxuZXhwb3J0IGNsYXNzIFBhcnNlciB7XG5cbiAgICBwcml2YXRlIF9zdGFnZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfZ2l0bGFiRGF0YTogYW55O1xuICAgIHByaXZhdGUgX2pvYk5hbWVQYWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgcmVhZG9ubHkgam9iczogSm9iW107XG4gICAgcmVhZG9ubHkgYXJndjogQXJndjtcbiAgICByZWFkb25seSB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcztcbiAgICByZWFkb25seSBwaXBlbGluZUlpZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGV4cGFuZFZhcmlhYmxlczogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IgKGFyZ3Y6IEFyZ3YsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBwaXBlbGluZUlpZDogbnVtYmVyLCBqb2JzOiBKb2JbXSwgZXhwYW5kVmFyaWFibGVzOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgICAgIHRoaXMud3JpdGVTdHJlYW1zID0gd3JpdGVTdHJlYW1zO1xuICAgICAgICB0aGlzLnBpcGVsaW5lSWlkID0gcGlwZWxpbmVJaWQ7XG4gICAgICAgIHRoaXMuam9icyA9IGpvYnM7XG4gICAgICAgIHRoaXMuZXhwYW5kVmFyaWFibGVzID0gZXhwYW5kVmFyaWFibGVzO1xuICAgIH1cblxuICAgIGdldCBzdGFnZXMgKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWdlcztcbiAgICB9XG5cbiAgICBnZXQgZ2l0bGFiRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9naXRsYWJEYXRhO1xuICAgIH1cblxuICAgIGdldCBqb2JOYW1lUGFkICgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fam9iTmFtZVBhZCA/PyAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBjcmVhdGUgKGFyZ3Y6IEFyZ3YsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBwaXBlbGluZUlpZDogbnVtYmVyLCBqb2JzOiBKb2JbXSwgZXhwYW5kVmFyaWFibGVzOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGFyZ3YsIHdyaXRlU3RyZWFtcywgcGlwZWxpbmVJaWQsIGpvYnMsIGV4cGFuZFZhcmlhYmxlcyk7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBhd2FpdCBwYXJzZXIuaW5pdCgpO1xuICAgICAgICBjb25zdCB3YXJuaW5ncyA9IGF3YWl0IFZhbGlkYXRvci5ydW4ocGFyc2VyLmpvYnMsIHBhcnNlci5zdGFnZXMpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIHBhcnNlci5qb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLmFydGlmYWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGpvYi5kZWxldGVBcnRpZmFjdHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNpbmdUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIGNvbnN0IHBhdGhUb0V4cGFuZGVkR2l0TGFiQ2kgPSBwYXRoLmpvaW4oYXJndi5jd2QsIGFyZ3Yuc3RhdGVEaXIsIFwiZXhwYW5kZWQtZ2l0bGFiLWNpLnltbFwiKTtcbiAgICAgICAgZnMubWtkaXJwU3luYyhwYXRoLmpvaW4oYXJndi5jd2QsIGFyZ3Yuc3RhdGVEaXIpKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoVG9FeHBhbmRlZEdpdExhYkNpLCB5YW1sLmR1bXAocGFyc2VyLmdpdGxhYkRhdGEpKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7Z3JleSBwYXJzaW5nIGFuZCBkb3dubG9hZHMgZmluaXNoZWQgaW4gJHtwcmV0dHlIcnRpbWUocGFyc2luZ1RpbWUpfS59XFxuYCk7XG5cbiAgICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgJHt3YXJuaW5nfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICMgU2Vjb25kIGxheWVyIG9mIGNoZWNrIGZvciBlcnJvcnMgdGhhdCBhcmUgbm90IGNhdWdodCBpbiBWYWxpZGF0b3IucnVuXG4gICAgICAgIGlmIChwYXJzZXIuYXJndi5qc29uU2NoZW1hVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBWYWxpZGF0b3IuanNvblNjaGVtYVZhbGlkYXRpb24oe1xuICAgICAgICAgICAgICAgIHBhdGhUb0V4cGFuZGVkR2l0TGFiQ2ksXG4gICAgICAgICAgICAgICAgZ2l0TGFiQ2lDb25maWc6IHBhcnNlci5naXRsYWJEYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHtncmV5IGpzb24gc2NoZW1hIHZhbGlkYXRlZCBpbiAke3ByZXR0eUhydGltZShwcm9jZXNzLmhydGltZSh0aW1lKSl9fVxcbmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZXI7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ3YgPSB0aGlzLmFyZ3Y7XG4gICAgICAgIGNvbnN0IGN3ZCA9IGFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IGFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCBmaWxlID0gYXJndi5maWxlO1xuICAgICAgICBjb25zdCBwaXBlbGluZUlpZCA9IHRoaXMucGlwZWxpbmVJaWQ7XG4gICAgICAgIGNvbnN0IGZldGNoSW5jbHVkZXMgPSBhcmd2LmZldGNoSW5jbHVkZXM7XG4gICAgICAgIGNvbnN0IGdpdERhdGEgPSBhd2FpdCBHaXREYXRhLmluaXQoY3dkLCB3cml0ZVN0cmVhbXMpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZXNGcm9tRmlsZXMgPSBhd2FpdCBWYXJpYWJsZXNGcm9tRmlsZXMuaW5pdChhcmd2LCB3cml0ZVN0cmVhbXMsIGdpdERhdGEpO1xuICAgICAgICBjb25zdCBwcmVkZWZpbmVkVmFyaWFibGVzID0gaW5pdFByZWRlZmluZWRWYXJpYWJsZXMoe2dpdERhdGEsIGFyZ3Z9KTtcbiAgICAgICAgY29uc3QgZW52TWF0Y2hlZFZhcmlhYmxlcyA9IFV0aWxzLmZpbmRFbnZNYXRjaGVkVmFyaWFibGVzKHZhcmlhYmxlc0Zyb21GaWxlcyk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHsuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5lbnZNYXRjaGVkVmFyaWFibGVzLCAuLi5hcmd2LnZhcmlhYmxlfTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModmFyaWFibGVzKTtcblxuICAgICAgICBsZXQgeWFtbERhdGFMaXN0OiBhbnlbXSA9IFt7c3RhZ2VzOiBbXCIucHJlXCIsIFwiYnVpbGRcIiwgXCJ0ZXN0XCIsIFwiZGVwbG95XCIsIFwiLnBvc3RcIl19XTtcbiAgICAgICAgY29uc3QgZ2l0bGFiQ2lEYXRhID0gYXdhaXQgUGFyc2VyLmxvYWRZYW1sKGAke2N3ZH0vJHtmaWxlfWAsIHt9LCB0aGlzLmV4cGFuZFZhcmlhYmxlcyk7XG5cbiAgICAgICAgeWFtbERhdGFMaXN0ID0geWFtbERhdGFMaXN0LmNvbmNhdChhd2FpdCBQYXJzZXJJbmNsdWRlcy5pbml0KGdpdGxhYkNpRGF0YSwge2N3ZCwgc3RhdGVEaXIsIHdyaXRlU3RyZWFtcywgZ2l0RGF0YSwgZmV0Y2hJbmNsdWRlcywgdmFyaWFibGVzOiBleHBhbmRlZCwgZXhwYW5kVmFyaWFibGVzOiB0aGlzLmV4cGFuZFZhcmlhYmxlcywgbWF4aW11bUluY2x1ZGVzOiBhcmd2Lm1heGltdW1JbmNsdWRlc30pKTtcbiAgICAgICAgUGFyc2VySW5jbHVkZXMucmVzZXRDb3VudCgpO1xuXG4gICAgICAgIGNvbnN0IGdpdGxhYkNpTG9jYWxEYXRhID0gYXdhaXQgUGFyc2VyLmxvYWRZYW1sKGAke2N3ZH0vLmdpdGxhYi1jaS1sb2NhbC55bWxgLCB7fSwgdGhpcy5leHBhbmRWYXJpYWJsZXMpO1xuICAgICAgICB5YW1sRGF0YUxpc3QgPSB5YW1sRGF0YUxpc3QuY29uY2F0KGF3YWl0IFBhcnNlckluY2x1ZGVzLmluaXQoZ2l0bGFiQ2lMb2NhbERhdGEsIHtjd2QsIHN0YXRlRGlyLCB3cml0ZVN0cmVhbXMsIGdpdERhdGEsIGZldGNoSW5jbHVkZXMsIHZhcmlhYmxlczogZXhwYW5kZWQsIGV4cGFuZFZhcmlhYmxlczogdGhpcy5leHBhbmRWYXJpYWJsZXMsIG1heGltdW1JbmNsdWRlczogYXJndi5tYXhpbXVtSW5jbHVkZXN9KSk7XG4gICAgICAgIFBhcnNlckluY2x1ZGVzLnJlc2V0Q291bnQoKTtcblxuICAgICAgICBjb25zdCBnaXRsYWJEYXRhOiBhbnkgPSBkZWVwRXh0ZW5kKHt9LCAuLi55YW1sRGF0YUxpc3QpO1xuXG4gICAgICAgIC8vIEV4cGFuZCB2YXJpb3VzIGZpZWxkcyBpbiBnaXRsYWJEYXRhXG4gICAgICAgIERhdGFFeHBhbmRlci5qb2JFeHRlbmRzKGdpdGxhYkRhdGEpO1xuICAgICAgICBEYXRhRXhwYW5kZXIucmVmZXJlbmNlKGdpdGxhYkRhdGEsIGdpdGxhYkRhdGEpO1xuICAgICAgICBEYXRhRXhwYW5kZXIuY29tcGxleE9iamVjdHMoZ2l0bGFiRGF0YSk7XG4gICAgICAgIERhdGFFeHBhbmRlci5kZWZhdWx0cyhnaXRsYWJEYXRhKTtcbiAgICAgICAgRGF0YUV4cGFuZGVyLmdsb2JhbFZhcmlhYmxlcyhnaXRsYWJEYXRhKTtcbiAgICAgICAgRGF0YUV4cGFuZGVyLmZsYXR0ZW5MaXN0cyhnaXRsYWJEYXRhKTtcblxuICAgICAgICBhc3NlcnQoZ2l0bGFiRGF0YS5zdGFnZXMgJiYgQXJyYXkuaXNBcnJheShnaXRsYWJEYXRhLnN0YWdlcyksIGNoYWxrYHt5ZWxsb3cgc3RhZ2VzOn0gbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgICBpZiAoIWdpdGxhYkRhdGEuc3RhZ2VzLmluY2x1ZGVzKFwiLnByZVwiKSkge1xuICAgICAgICAgICAgZ2l0bGFiRGF0YS5zdGFnZXMudW5zaGlmdChcIi5wcmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnaXRsYWJEYXRhLnN0YWdlcy5pbmNsdWRlcyhcIi5wb3N0XCIpKSB7XG4gICAgICAgICAgICBnaXRsYWJEYXRhLnN0YWdlcy5wdXNoKFwiLnBvc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhZ2VzID0gZ2l0bGFiRGF0YS5zdGFnZXM7XG5cbiAgICAgICAgLy8gQ2hlY2sgam9iIHZhcmlhYmxlcyBmb3IgaW52YWxpZCBoYXNoIG9mIGtleSB2YWx1ZSBwYWlycywgYW5kIGNhc3QgbnVtYmVycyB0byBzdHJpbmdzXG4gICAgICAgIFV0aWxzLmZvckVhY2hSZWFsSm9iKGdpdGxhYkRhdGEsIChqb2JOYW1lLCBqb2JEYXRhKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIF92YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoam9iRGF0YS52YXJpYWJsZXMgfHwge30pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgdmFsdWUgPSBcIlwiOyAvLyB2YXJpYWJsZSdzIHZhbHVlcyBhcmUgbnVsbGFibGVcbiAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgY2hhbGtge2JsdWVCcmlnaHQgJHtqb2JOYW1lfX0gaGFzIGludmFsaWQgdmFyaWFibGVzIGhhc2ggb2Yga2V5IHZhbHVlIHBhaXJzLiAke2tleX09JHt2YWx1ZX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBqb2JEYXRhLnZhcmlhYmxlc1trZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoam9iRGF0YS5zZXJ2aWNlcyA/PyBbXSkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gam9iRGF0YS5zZXJ2aWNlc1tpXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXJ2aWNlLnZhcmlhYmxlcyB8fCB7fSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbGtge2JsdWVCcmlnaHQgJHtqb2JOYW1lfS5zZXJ2aWNlc1ske2l9XX0gaGFzIGludmFsaWQgdmFyaWFibGVzIGhhc2ggb2Yga2V5IHZhbHVlIHBhaXJzLiAke2tleX09JHt2YWx1ZX1gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGpvYkRhdGEuc2VydmljZXNbaV0udmFyaWFibGVzW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZ2l0bGFiRGF0YSA9IGdpdGxhYkRhdGE7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgam9icyBhbmQgcHV0IHRoZW0gaW50byBzdGFnZXNcbiAgICAgICAgVXRpbHMuZm9yRWFjaFJlYWxKb2IoZ2l0bGFiRGF0YSwgKGpvYk5hbWUsIGpvYkRhdGEpID0+IHtcbiAgICAgICAgICAgIGFzc2VydChnaXREYXRhICE9IG51bGwsIFwiZ2l0RGF0YSBtdXN0IGJlIHNldFwiKTtcbiAgICAgICAgICAgIGFzc2VydCh2YXJpYWJsZXNGcm9tRmlsZXMgIT0gbnVsbCwgXCJob21lVmFyaWFibGVzIG11c3QgYmUgc2V0XCIpO1xuXG4gICAgICAgICAgICBsZXQgbm9kZUluZGV4ID0gMTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFsbGVsTWF0cml4VmFyaWFibGVzTGlzdCA9IHBhcmFsbGVsLm1hdHJpeFZhcmlhYmxlc0xpc3Qoam9iRGF0YSwgam9iTmFtZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmFsbGVsTWF0cml4VmFyaWFibGVzIG9mIHBhcmFsbGVsTWF0cml4VmFyaWFibGVzTGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBtYXRyaXhKb2JOYW1lID0gam9iTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyYWxsZWxNYXRyaXhWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4Sm9iTmFtZSA9IGAke2pvYk5hbWV9OiBbJHtPYmplY3QudmFsdWVzKHBhcmFsbGVsTWF0cml4VmFyaWFibGVzID8/IFtdKS5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFsbGVsLmlzUGxhaW5QYXJhbGxlbChqb2JEYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRyaXhKb2JOYW1lID0gYCR7am9iTmFtZX06IFske25vZGVJbmRleH0vJHtwYXJhbGxlbE1hdHJpeFZhcmlhYmxlc0xpc3QubGVuZ3RofV1gO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYiA9IG5ldyBKb2Ioe1xuICAgICAgICAgICAgICAgICAgICBhcmd2LFxuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGpvYkRhdGEsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hdHJpeEpvYk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJhc2VOYW1lOiBqb2JOYW1lLFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYWJsZXM6IGdpdGxhYkRhdGEudmFyaWFibGVzLFxuICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUlpZDogcGlwZWxpbmVJaWQsXG4gICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXMsXG4gICAgICAgICAgICAgICAgICAgIGdpdERhdGEsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc0Zyb21GaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4VmFyaWFibGVzOiBwYXJhbGxlbE1hdHJpeFZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZGV4OiAoam9iRGF0YS5wYXJhbGxlbCAhPSBudWxsKSA/IG5vZGVJbmRleCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG5vZGVzVG90YWw6IHBhcmFsbGVsTWF0cml4VmFyaWFibGVzTGlzdC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFZhcmlhYmxlczogdGhpcy5leHBhbmRWYXJpYWJsZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRTdGFnZSA9IHRoaXMuc3RhZ2VzLmluY2x1ZGVzKGpvYi5zdGFnZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGZvdW5kU3RhZ2UsIGNoYWxrYHt5ZWxsb3cgc3RhZ2U6JHtqb2Iuc3RhZ2V9fSBub3QgZm91bmQgZm9yIHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fWApO1xuICAgICAgICAgICAgICAgIHRoaXMuam9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBzb21lIHBhZGRpbmcgc28gdGhhdCBqb2IgbG9ncyBhcmUgbmljZWx5IGFsaWduZWRcbiAgICAgICAgLy8gYWxsb3cgdXNlcnMgdG8gb3ZlcnJpZGUgdGhpcyBpbiBjYXNlIHRoZXkgaGF2ZSByZWFsbHkgbG9uZyBqb2IgbmFtZSAoc2VlICM4NDApXG4gICAgICAgIGlmICh0aGlzLmFyZ3YubWF4Sm9iTmFtZVBhZGRpbmcgIT09IG51bGwgJiYgdGhpcy5hcmd2Lm1heEpvYk5hbWVQYWRkaW5nIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2pvYk5hbWVQYWQgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgam9icyA9IHRoaXMuYXJndi5qb2IubGVuZ3RoICE9PSAwID8gdGhpcy5hcmd2LmpvYiA6IHRoaXMuam9icztcbiAgICAgICAgICAgIGpvYnMuZm9yRWFjaCgoam9iKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGpvYk5lZWRzTGVuZ3RoOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJndi5uZWVkcyAmJiB0aGlzLmFyZ3Yuam9iLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmpvYnMuZmluZChqID0+IGouYmFzZU5hbWUgPT09IGpvYik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZD8ubmVlZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvYk5lZWRzTGVuZ3RoID0gZm91bmQubmVlZHMubWFwKGYgPT4gZi5qb2IubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBqb2JMZW5ndGggPSB0eXBlb2Ygam9iID09IFwic3RyaW5nXCIgPyBqb2IubGVuZ3RoIDogam9iLm5hbWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuX2pvYk5hbWVQYWQgPSBNYXRoLm1heChqb2JMZW5ndGgsIHRoaXMuX2pvYk5hbWVQYWQgPz8gMCwgLi4uam9iTmVlZHNMZW5ndGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5hcmd2Lm1heEpvYk5hbWVQYWRkaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fam9iTmFtZVBhZCA9IE1hdGgubWluKHRoaXMuYXJndi5tYXhKb2JOYW1lUGFkZGluZyA/PyAwLCB0aGlzLl9qb2JOYW1lUGFkID8/IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGpvYk5hbWVQYWQgb24gYWxsIGpvYnNcbiAgICAgICAgdGhpcy5qb2JzLmZvckVhY2goKGpvYikgPT4ge1xuICAgICAgICAgICAgam9iLmpvYk5hbWVQYWQgPSB0aGlzLmpvYk5hbWVQYWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIHByb2R1Y2VycyBmb3IgZWFjaCBqb2JcbiAgICAgICAgdGhpcy5qb2JzLmZvckVhY2goKGpvYikgPT4ge1xuICAgICAgICAgICAgam9iLnByb2R1Y2VycyA9IFByb2R1Y2Vycy5pbml0KHRoaXMuam9icywgdGhpcy5zdGFnZXMsIGpvYik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBsb2FkWWFtbCAoZmlsZVBhdGg6IHN0cmluZywgY3R4OiBhbnkgPSB7fSwgZXhwYW5kVmFyaWFibGVzOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHltbFBhdGggPSBgJHtmaWxlUGF0aH1gO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoeW1sUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoYCR7ZmlsZVBhdGh9YCwgXCJ1dGY4XCIpO1xuICAgICAgICBjb25zdCBmaWxlU3BsaXQgPSBmaWxlQ29udGVudC5zcGxpdCgvXFxyP1xcbi9nKTtcbiAgICAgICAgY29uc3QgZmlsZVNwbGl0Q2xvbmUgPSBmaWxlU3BsaXQuc2xpY2UoKTtcblxuICAgICAgICBsZXQgaW50ZXJhY3RpdmVNYXRjaCA9IG51bGw7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbk1hdGNoID0gbnVsbDtcbiAgICAgICAgbGV0IGluamVjdFNTSEFnZW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG5vQXJ0aWZhY3RzVG9Tb3VyY2VNYXRjaCA9IG51bGw7XG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIGlmIChleHBhbmRWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmaWxlU3BsaXQpIHtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZU1hdGNoID0gIWludGVyYWN0aXZlTWF0Y2ggPyAvI1xccz9AXFxzP1tJaV1udGVyYWN0aXZlLy5leGVjKGxpbmUpIDogaW50ZXJhY3RpdmVNYXRjaDtcbiAgICAgICAgICAgICAgICBpbmplY3RTU0hBZ2VudCA9ICFpbmplY3RTU0hBZ2VudCA/IC8jXFxzP0BcXHM/W0lpXW5qZWN0U1NIQWdlbnQvLmV4ZWMobGluZSkgOiBpbmplY3RTU0hBZ2VudDtcbiAgICAgICAgICAgICAgICBub0FydGlmYWN0c1RvU291cmNlTWF0Y2ggPSAhbm9BcnRpZmFjdHNUb1NvdXJjZU1hdGNoID8gLyNcXHM/QFxccz9Ob0FydGlmYWN0c1RvU291cmNlL2kuZXhlYyhsaW5lKSA6IG5vQXJ0aWZhY3RzVG9Tb3VyY2VNYXRjaDtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbk1hdGNoID0gIWRlc2NyaXB0aW9uTWF0Y2ggPyAvI1xccz9AXFxzP1tEZF1lc2NyaXB0aW9uICg/PGRlc2NyaXB0aW9uPi4qKS8uZXhlYyhsaW5lKSA6IGRlc2NyaXB0aW9uTWF0Y2g7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBqb2JNYXRjaCA9IC9cXHc6Ly5leGVjKGxpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChqb2JNYXRjaCAmJiAoaW50ZXJhY3RpdmVNYXRjaCB8fCBkZXNjcmlwdGlvbk1hdGNoIHx8IGluamVjdFNTSEFnZW50IHx8IG5vQXJ0aWZhY3RzVG9Tb3VyY2VNYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyYWN0aXZlTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTcGxpdENsb25lLnNwbGljZShpbmRleCArIDEsIDAsIFwiICBnY2xJbnRlcmFjdGl2ZTogdHJ1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluamVjdFNTSEFnZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3BsaXRDbG9uZS5zcGxpY2UoaW5kZXggKyAxLCAwLCBcIiAgZ2NsSW5qZWN0U1NIQWdlbnQ6IHRydWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChub0FydGlmYWN0c1RvU291cmNlTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTcGxpdENsb25lLnNwbGljZShpbmRleCArIDEsIDAsIFwiICBnY2xBcnRpZmFjdHNUb1NvdXJjZTogZmFsc2VcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbk1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3BsaXRDbG9uZS5zcGxpY2UoaW5kZXggKyAxLCAwLCBgICBnY2xEZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbk1hdGNoPy5ncm91cHM/LmRlc2NyaXB0aW9uID8/IFwiXCJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlTWF0Y2ggPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbk1hdGNoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0U1NIQWdlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBub0FydGlmYWN0c1RvU291cmNlTWF0Y2ggPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVmZXJlbmNlVHlwZSA9IG5ldyB5YW1sLlR5cGUoXCIhcmVmZXJlbmNlXCIsIHtcbiAgICAgICAgICAgIGtpbmQ6IFwic2VxdWVuY2VcIixcbiAgICAgICAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3JlZmVyZW5jZURhdGE6IGRhdGF9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHlhbWwuREVGQVVMVF9TQ0hFTUEuZXh0ZW5kKFtyZWZlcmVuY2VUeXBlXSk7XG4gICAgICAgIGxldCBmaWxlRGF0YTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmlsZURhdGEgPSB5YW1sLmxvYWRBbGwoZmlsZVNwbGl0Q2xvbmUuam9pbihcIlxcblwiKSwgbnVsbCwge3NjaGVtYX0pIGFzIGFueVtdO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgeWFtbC5ZQU1MRXhjZXB0aW9uICYmIGUucmVhc29uID09PSBcImR1cGxpY2F0ZWQgbWFwcGluZyBrZXlcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrYHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiB9IGR1cGxpY2F0ZWQgbWFwcGluZyBrZXkgZGV0ZWN0ZWQhIFZhbHVlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIWApO1xuICAgICAgICAgICAgICAgIGZpbGVEYXRhID0geWFtbC5sb2FkQWxsKGZpbGVTcGxpdENsb25lLmpvaW4oXCJcXG5cIiksIG51bGwsIHtzY2hlbWEsIGpzb246IHRydWV9KSBhcyBhbnlbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlRGF0YS5sZW5ndGggPD0gMSkgcmV0dXJuIGZpbGVEYXRhWzBdO1xuXG4gICAgICAgIGlmIChpc0dpdGxhYlNwZWNGaWxlKGZpbGVEYXRhWzBdKSkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRzU3BlY2lmaWNhdGlvbjogYW55ID0gZmlsZURhdGFbMF07XG4gICAgICAgICAgICBjb25zdCB1bmludGVycG9sYXRlZENvbmZpZ3VyYXRpb25zOiBhbnkgPSBmaWxlRGF0YVsxXTtcblxuICAgICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkQ29uZmlndXJhdGlvbnMgPSBKU09OLnN0cmluZ2lmeSh1bmludGVycG9sYXRlZENvbmZpZ3VyYXRpb25zKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvKD88Zmlyc3RDaGFyPi4pPyg/PHNlY29uZENoYXI+Lik/XFwkXFxbXFxbXFxzKmlucHV0cy4oPzxpbnRlcnBvbGF0aW9uS2V5PltcXHctXSspXFxzKlxcfD9cXHMqKD88aW50ZXJwb2xhdGlvbkZ1bmN0aW9ucz4uKj8pXFxzKlxcXVxcXSg/PGxhc3RDaGFyPlteJF0pPy9nIC8vIGh0dHBzOi8vcmVnZXhyLmNvbS84MWMxNlxuICAgICAgICAgICAgICAgICAgICAsIChfOiBzdHJpbmcsIGZpcnN0Q2hhcjogc3RyaW5nLCBzZWNvbmRDaGFyOiBzdHJpbmcsIGludGVycG9sYXRpb25LZXk6IHN0cmluZywgaW50ZXJwb2xhdGlvbkZ1bmN0aW9uczogc3RyaW5nLCBsYXN0Q2hhcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb25GdW5jdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzU3BlY2lmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGFyID8/PSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kQ2hhciA/Pz0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGFyID8/PSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7aW5wdXRWYWx1ZSwgaW5wdXRUeXBlfSA9IHBhcnNlSW5jbHVkZUlucHV0cyhjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VHdvQ2hhciA9IGZpcnN0Q2hhciArIHNlY29uZENoYXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY29uZENoYXIgPT0gXCJcXFwiXCIgJiYgbGFzdENoYXIgPT0gXCJcXFwiXCIpICYmIGZpcnN0Q2hhciAhPSBcIlxcXFxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0Q2hhciArIEpTT04uc3RyaW5naWZ5KGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBiZWhhdmVzIHNsaWdodGx5IGRpZmZlcmVudGx5IGZyb20gZ2l0bGFiLmNvbS4gSSBjYW4ndCBjb21lIHVwIHdpdGggcHJhY3RpY2FsIHVzZSBjYXNlIHNvIGkgZG9uJ3QgdGhpbmsgaXQncyB3b3J0aCB0aGUgZWZmb3J0IHRvIG1pbWljIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0VHdvQ2hhciArIEpTT04uc3RyaW5naWZ5KEpTT04uc3RyaW5naWZ5KGlucHV0VmFsdWUpKS5zbGljZSgxLCAtMSkgKyBsYXN0Q2hhcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdFR3b0NoYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSlNPTi5zdHJpbmdpZnkoaW5wdXRWYWx1ZSkgLy8gZW5zdXJlIGEgdmFsaWQganNvbiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSB0aGUgc3Vycm91bmRpbmcgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGFzdENoYXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNvbmRDaGFyID09IFwiXFxcIlwiICYmIGxhc3RDaGFyID09IFwiXFxcIlwiKSAmJiBmaXJzdENoYXIgIT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdENoYXIgKyBpbnB1dFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdFR3b0NoYXIgKyBpbnB1dFZhbHVlICsgbGFzdENoYXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zd2l0Y2hTdGF0ZW1lbnRFeGhhdXN0aXZlQ2hlY2soaW5wdXRUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShpbnRlcnBvbGF0ZWRDb25maWd1cmF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGVEYXRhWzBdO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNHaXRsYWJTcGVjRmlsZSAoZmlsZURhdGE6IGFueSkge1xuICAgIHJldHVybiBcInNwZWNcIiBpbiBmaWxlRGF0YTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVJbnRlcnBvbGF0aW9uS2V5IChjdHg6IGFueSkge1xuICAgIGNvbnN0IHtjb25maWdGaWxlUGF0aCwgaW50ZXJwb2xhdGlvbktleSwgaW5wdXRzU3BlY2lmaWNhdGlvbn0gPSBjdHg7XG4gICAgY29uc3QgaW52YWxpZEludGVycG9sYXRpb25LZXlFcnIgPSBjaGFsa2BUaGlzIEdpdExhYiBDSSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ6IFxcYHtibHVlQnJpZ2h0ICR7Y29uZmlnRmlsZVBhdGh9fVxcYDogdW5rbm93biBpbnRlcnBvbGF0aW9uIGtleTogXFxgJHtpbnRlcnBvbGF0aW9uS2V5fVxcYC5gO1xuICAgIGFzc2VydChpbnB1dHNTcGVjaWZpY2F0aW9uLnNwZWMuaW5wdXRzPy5baW50ZXJwb2xhdGlvbktleV0gIT09IHVuZGVmaW5lZCwgaW52YWxpZEludGVycG9sYXRpb25LZXlFcnIpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUludGVycG9sYXRpb25GdW5jdGlvbnMgKGN0eDogYW55KSB7XG4gICAgY29uc3Qge2ludGVycG9sYXRpb25GdW5jdGlvbnMsIGNvbmZpZ0ZpbGVQYXRofSA9IGN0eDtcbiAgICBpZiAoaW50ZXJwb2xhdGlvbkZ1bmN0aW9ucyAhPSBcIlwiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrYHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiB9IGludGVycG9sYXRpb24gZnVuY3Rpb25zIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIHZpYSBnaXRsYWItY2ktbG9jYWwuIEZ1bmN0aW9ucyB3aWxsIGp1c3QgYmUgYSBuby1vcC5gKTtcbiAgICB9XG4gICAgYXNzZXJ0KGludGVycG9sYXRpb25GdW5jdGlvbnMuc3BsaXQoXCJ8XCIpLmxlbmd0aCA8PSBNQVhfRlVOQ1RJT05TLCBjaGFsa2BUaGlzIEdpdExhYiBDSSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ6IFxcYHtibHVlQnJpZ2h0ICR7Y29uZmlnRmlsZVBhdGh9fVxcYDogdG9vIG1hbnkgZnVuY3Rpb25zIGluIGludGVycG9sYXRpb24gYmxvY2suYCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQgKGN0eDogYW55KSB7XG4gICAgY29uc3Qge2NvbmZpZ0ZpbGVQYXRoLCBpbnRlcnBvbGF0aW9uS2V5LCBpbnB1dHNTcGVjaWZpY2F0aW9ufSA9IGN0eDtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gZ2V0SW5wdXRWYWx1ZShjdHgpO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IGlucHV0c1NwZWNpZmljYXRpb24uc3BlYy5pbnB1dHNbaW50ZXJwb2xhdGlvbktleV0/Lm9wdGlvbnM7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0KG9wdGlvbnMuaW5jbHVkZXMoaW5wdXRWYWx1ZSksXG4gICAgICAgICAgICBjaGFsa2BUaGlzIEdpdExhYiBDSSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ6IFxcYHtibHVlQnJpZ2h0ICR7Y29uZmlnRmlsZVBhdGh9fVxcYDogXFxge2JsdWVCcmlnaHQgJHtpbnRlcnBvbGF0aW9uS2V5fX1cXGAgaW5wdXQ6IFxcYHtibHVlQnJpZ2h0ICR7aW5wdXRWYWx1ZX19XFxgIGNhbm5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWQgb3B0aW9ucy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHBlY3RlZElucHV0VHlwZSA9IGdldEV4cGVjdGVkSW5wdXRUeXBlKGN0eCk7XG4gICAgYXNzZXJ0KElOQ0xVREVfSU5QVVRTX1NVUFBPUlRFRF9UWVBFUy5pbmNsdWRlcyhleHBlY3RlZElucHV0VHlwZSksXG4gICAgICAgIGNoYWxrYFRoaXMgR2l0TGFiIENJIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDogXFxge2JsdWVCcmlnaHQgJHtjb25maWdGaWxlUGF0aH19XFxgOiBoZWFkZXI6c3BlYzppbnB1dHM6e2JsdWVCcmlnaHQgJHtpbnRlcnBvbGF0aW9uS2V5fX0gaW5wdXQgdHlwZSB1bmtub3duIHZhbHVlOiB7Ymx1ZUJyaWdodCAke2V4cGVjdGVkSW5wdXRUeXBlfX0uYCk7XG5cbiAgICBjb25zdCBpbnB1dFR5cGUgPSBBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpID8gXCJhcnJheVwiIDogdHlwZW9mIGlucHV0VmFsdWU7XG4gICAgYXNzZXJ0KGlucHV0VHlwZSA9PT0gZXhwZWN0ZWRJbnB1dFR5cGUsXG4gICAgICAgIGNoYWxrYFRoaXMgR2l0TGFiIENJIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDogXFxge2JsdWVCcmlnaHQgJHtjb25maWdGaWxlUGF0aH19XFxgOiBcXGB7Ymx1ZUJyaWdodCAke2ludGVycG9sYXRpb25LZXl9fVxcYCBpbnB1dDogcHJvdmlkZWQgdmFsdWUgaXMgbm90IGEge2JsdWVCcmlnaHQgJHtleHBlY3RlZElucHV0VHlwZX19LmApO1xuXG4gICAgY29uc3QgcmVnZXggPSBpbnB1dHNTcGVjaWZpY2F0aW9uLnNwZWMuaW5wdXRzW2ludGVycG9sYXRpb25LZXldPy5yZWdleDtcbiAgICBpZiAocmVnZXgpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGtge2JsYWNrLmJnWWVsbG93QnJpZ2h0ICBXQVJOIH0gc3BlYzppbnB1dHM6cmVnZXggaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgdmlhIGdpdGxhYi1jaS1sb2NhbC4gVGhpcyB3aWxsIGp1c3QgYmUgYSBuby1vcC5gKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5jbHVkZUlucHV0cyAoY3R4OiBhbnkpOiB7aW5wdXRWYWx1ZTogYW55OyBpbnB1dFR5cGU6IElucHV0VHlwZX0ge1xuICAgIHZhbGlkYXRlSW50ZXJwb2xhdGlvbktleShjdHgpO1xuICAgIHZhbGlkYXRlSW50ZXJwb2xhdGlvbkZ1bmN0aW9ucyhjdHgpO1xuICAgIHZhbGlkYXRlSW5wdXQoY3R4KTtcbiAgICByZXR1cm4ge2lucHV0VmFsdWU6IGdldElucHV0VmFsdWUoY3R4KSwgaW5wdXRUeXBlOiBnZXRFeHBlY3RlZElucHV0VHlwZShjdHgpfTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZSAoY3R4OiBhbnkpIHtcbiAgICBjb25zdCB7aW5wdXRzLCBpbnRlcnBvbGF0aW9uS2V5LCBjb25maWdGaWxlUGF0aCwgaW5wdXRzU3BlY2lmaWNhdGlvbn0gPSBjdHg7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IGlucHV0c1tpbnRlcnBvbGF0aW9uS2V5XSB8fCBpbnB1dHNTcGVjaWZpY2F0aW9uLnNwZWMuaW5wdXRzW2ludGVycG9sYXRpb25LZXldPy5kZWZhdWx0O1xuICAgIGFzc2VydChpbnB1dFZhbHVlICE9PSB1bmRlZmluZWQsIGNoYWxrYFRoaXMgR2l0TGFiIENJIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDogXFxge2JsdWVCcmlnaHQgJHtjb25maWdGaWxlUGF0aH19XFxgOiBcXGB7Ymx1ZUJyaWdodCAke2ludGVycG9sYXRpb25LZXl9fVxcYCBpbnB1dDogcmVxdWlyZWQgdmFsdWUgaGFzIG5vdCBiZWVuIHByb3ZpZGVkLmApO1xuICAgIHJldHVybiBpbnB1dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBlY3RlZElucHV0VHlwZSAoY3R4OiBhbnkpOiBJbnB1dFR5cGUge1xuICAgIGNvbnN0IHtpbnRlcnBvbGF0aW9uS2V5LCBpbnB1dHNTcGVjaWZpY2F0aW9ufSA9IGN0eDtcbiAgICByZXR1cm4gaW5wdXRzU3BlY2lmaWNhdGlvbi5zcGVjLmlucHV0c1tpbnRlcnBvbGF0aW9uS2V5XT8udHlwZSB8fCBcInN0cmluZ1wiO1xufVxuIl19
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxQixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLFlBQVksTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM3QixPQUFPLEtBQUssWUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDakMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFHN0QsT0FBTyxFQUFDLElBQUksSUFBSSx1QkFBdUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRTFFLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUN4QixNQUFNLDhCQUE4QixHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFHekYsTUFBTSxPQUFPLE1BQU07SUFFUCxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQ3ZCLFdB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b0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQztBQUNsRixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUUsR0FBUTtJQUM1QixNQUFNLEVBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBQyxHQUFHLEdBQUcsQ0FBQztJQUM1RSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQzFHLE1BQU0sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLEtBQUssQ0FBQSwwREFBMEQsY0FBYyxzQkFBc0IsZ0JBQWdCLGtEQUFrRCxDQUFDLENBQUM7SUFDeE0sT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUUsR0FBUTtJQUNuQyxNQUFNLEVBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUMsR0FBRyxHQUFHLENBQUM7SUFDcEQsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQztBQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBkZWVwRXh0ZW5kIGZyb20gXCJkZWVwLWV4dGVuZFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tIFwianMteWFtbFwiO1xuaW1wb3J0IHByZXR0eUhydGltZSBmcm9tIFwicHJldHR5LWhydGltZVwiO1xuaW1wb3J0IHtKb2J9IGZyb20gXCIuL2pvYi5qc1wiO1xuaW1wb3J0ICogYXMgRGF0YUV4cGFuZGVyIGZyb20gXCIuL2RhdGEtZXhwYW5kZXIuanNcIjtcbmltcG9ydCB7VXRpbHN9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7VmFsaWRhdG9yfSBmcm9tIFwiLi92YWxpZGF0b3IuanNcIjtcbmltcG9ydCAqIGFzIHBhcmFsbGVsIGZyb20gXCIuL3BhcmFsbGVsLmpzXCI7XG5pbXBvcnQge0dpdERhdGF9IGZyb20gXCIuL2dpdC1kYXRhLmpzXCI7XG5pbXBvcnQge1BhcnNlckluY2x1ZGVzfSBmcm9tIFwiLi9wYXJzZXItaW5jbHVkZXMuanNcIjtcbmltcG9ydCB7UHJvZHVjZXJzfSBmcm9tIFwiLi9wcm9kdWNlcnMuanNcIjtcbmltcG9ydCB7VmFyaWFibGVzRnJvbUZpbGVzfSBmcm9tIFwiLi92YXJpYWJsZXMtZnJvbS1maWxlcy5qc1wiO1xuaW1wb3J0IHtBcmd2fSBmcm9tIFwiLi9hcmd2LmpzXCI7XG5pbXBvcnQge1dyaXRlU3RyZWFtc30gZnJvbSBcIi4vd3JpdGUtc3RyZWFtcy5qc1wiO1xuaW1wb3J0IHtpbml0IGFzIGluaXRQcmVkZWZpbmVkVmFyaWFibGVzfSBmcm9tIFwiLi9wcmVkZWZpbmVkLXZhcmlhYmxlcy5qc1wiO1xuXG5jb25zdCBNQVhfRlVOQ1RJT05TID0gMztcbmNvbnN0IElOQ0xVREVfSU5QVVRTX1NVUFBPUlRFRF9UWVBFUyA9IFtcInN0cmluZ1wiLCBcImJvb2xlYW5cIiwgXCJudW1iZXJcIiwgXCJhcnJheVwiXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIElucHV0VHlwZSA9IHR5cGVvZiBJTkNMVURFX0lOUFVUU19TVVBQT1JURURfVFlQRVNbbnVtYmVyXTtcblxuZXhwb3J0IGNsYXNzIFBhcnNlciB7XG5cbiAgICBwcml2YXRlIF9zdGFnZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfZ2l0bGFiRGF0YTogYW55O1xuICAgIHByaXZhdGUgX2pvYk5hbWVQYWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgcmVhZG9ubHkgam9iczogSm9iW107XG4gICAgcmVhZG9ubHkgYXJndjogQXJndjtcbiAgICByZWFkb25seSB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcztcbiAgICByZWFkb25seSBwaXBlbGluZUlpZDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGV4cGFuZFZhcmlhYmxlczogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IgKGFyZ3Y6IEFyZ3YsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBwaXBlbGluZUlpZDogbnVtYmVyLCBqb2JzOiBKb2JbXSwgZXhwYW5kVmFyaWFibGVzOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgICAgIHRoaXMud3JpdGVTdHJlYW1zID0gd3JpdGVTdHJlYW1zO1xuICAgICAgICB0aGlzLnBpcGVsaW5lSWlkID0gcGlwZWxpbmVJaWQ7XG4gICAgICAgIHRoaXMuam9icyA9IGpvYnM7XG4gICAgICAgIHRoaXMuZXhwYW5kVmFyaWFibGVzID0gZXhwYW5kVmFyaWFibGVzO1xuICAgIH1cblxuICAgIGdldCBzdGFnZXMgKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWdlcztcbiAgICB9XG5cbiAgICBnZXQgZ2l0bGFiRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9naXRsYWJEYXRhO1xuICAgIH1cblxuICAgIGdldCBqb2JOYW1lUGFkICgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fam9iTmFtZVBhZCA/PyAwO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBjcmVhdGUgKGFyZ3Y6IEFyZ3YsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBwaXBlbGluZUlpZDogbnVtYmVyLCBqb2JzOiBKb2JbXSwgZXhwYW5kVmFyaWFibGVzOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGFyZ3YsIHdyaXRlU3RyZWFtcywgcGlwZWxpbmVJaWQsIGpvYnMsIGV4cGFuZFZhcmlhYmxlcyk7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBwcm9jZXNzLmhydGltZSgpO1xuICAgICAgICBhd2FpdCBwYXJzZXIuaW5pdCgpO1xuICAgICAgICBjb25zdCB3YXJuaW5ncyA9IGF3YWl0IFZhbGlkYXRvci5ydW4ocGFyc2VyLmpvYnMsIHBhcnNlci5zdGFnZXMpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIHBhcnNlci5qb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLmFydGlmYWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGpvYi5kZWxldGVBcnRpZmFjdHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNpbmdUaW1lID0gcHJvY2Vzcy5ocnRpbWUodGltZSk7XG4gICAgICAgIGNvbnN0IHBhdGhUb0V4cGFuZGVkR2l0TGFiQ2kgPSBwYXRoLmpvaW4oYXJndi5jd2QsIGFyZ3Yuc3RhdGVEaXIsIFwiZXhwYW5kZWQtZ2l0bGFiLWNpLnltbFwiKTtcbiAgICAgICAgZnMubWtkaXJwU3luYyhwYXRoLmpvaW4oYXJndi5jd2QsIGFyZ3Yuc3RhdGVEaXIpKTtcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoVG9FeHBhbmRlZEdpdExhYkNpLCB5YW1sLmR1bXAocGFyc2VyLmdpdGxhYkRhdGEpKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZGVycihjaGFsa2B7Z3JleSBwYXJzaW5nIGFuZCBkb3dubG9hZHMgZmluaXNoZWQgaW4gJHtwcmV0dHlIcnRpbWUocGFyc2luZ1RpbWUpfS59XFxuYCk7XG5cbiAgICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgJHt3YXJuaW5nfX1cXG5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICMgU2Vjb25kIGxheWVyIG9mIGNoZWNrIGZvciBlcnJvcnMgdGhhdCBhcmUgbm90IGNhdWdodCBpbiBWYWxpZGF0b3IucnVuXG4gICAgICAgIGlmIChwYXJzZXIuYXJndi5qc29uU2NoZW1hVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgICAgICAgICBWYWxpZGF0b3IuanNvblNjaGVtYVZhbGlkYXRpb24oe1xuICAgICAgICAgICAgICAgIHBhdGhUb0V4cGFuZGVkR2l0TGFiQ2ksXG4gICAgICAgICAgICAgICAgZ2l0TGFiQ2lDb25maWc6IHBhcnNlci5naXRsYWJEYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHtncmV5IGpzb24gc2NoZW1hIHZhbGlkYXRlZCBpbiAke3ByZXR0eUhydGltZShwcm9jZXNzLmhydGltZSh0aW1lKSl9fVxcbmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZXI7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdCAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ3YgPSB0aGlzLmFyZ3Y7XG4gICAgICAgIGNvbnN0IGN3ZCA9IGFyZ3YuY3dkO1xuICAgICAgICBjb25zdCBzdGF0ZURpciA9IGFyZ3Yuc3RhdGVEaXI7XG4gICAgICAgIGNvbnN0IHdyaXRlU3RyZWFtcyA9IHRoaXMud3JpdGVTdHJlYW1zO1xuICAgICAgICBjb25zdCBmaWxlID0gYXJndi5maWxlO1xuICAgICAgICBjb25zdCBwaXBlbGluZUlpZCA9IHRoaXMucGlwZWxpbmVJaWQ7XG4gICAgICAgIGNvbnN0IGZldGNoSW5jbHVkZXMgPSBhcmd2LmZldGNoSW5jbHVkZXM7XG4gICAgICAgIGNvbnN0IGdpdERhdGEgPSBhd2FpdCBHaXREYXRhLmluaXQoY3dkLCB3cml0ZVN0cmVhbXMpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZXNGcm9tRmlsZXMgPSBhd2FpdCBWYXJpYWJsZXNGcm9tRmlsZXMuaW5pdChhcmd2LCB3cml0ZVN0cmVhbXMsIGdpdERhdGEpO1xuICAgICAgICBjb25zdCBlbnZNYXRjaGVkVmFyaWFibGVzID0gVXRpbHMuZmluZEVudk1hdGNoZWRWYXJpYWJsZXModmFyaWFibGVzRnJvbUZpbGVzKTtcbiAgICAgICAgY29uc3QgcHJlZGVmaW5lZFZhcmlhYmxlcyA9IGluaXRQcmVkZWZpbmVkVmFyaWFibGVzKHtnaXREYXRhLCBhcmd2LCBlbnZNYXRjaGVkVmFyaWFibGVzfSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHsuLi5wcmVkZWZpbmVkVmFyaWFibGVzLCAuLi5lbnZNYXRjaGVkVmFyaWFibGVzLCAuLi5hcmd2LnZhcmlhYmxlfTtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBVdGlscy5leHBhbmRWYXJpYWJsZXModmFyaWFibGVzKTtcblxuICAgICAgICBsZXQgeWFtbERhdGFMaXN0OiBhbnlbXSA9IFt7c3RhZ2VzOiBbXCIucHJlXCIsIFwiYnVpbGRcIiwgXCJ0ZXN0XCIsIFwiZGVwbG95XCIsIFwiLnBvc3RcIl19XTtcbiAgICAgICAgY29uc3QgZ2l0bGFiQ2lEYXRhID0gYXdhaXQgUGFyc2VyLmxvYWRZYW1sKGAke2N3ZH0vJHtmaWxlfWAsIHt9LCB0aGlzLmV4cGFuZFZhcmlhYmxlcyk7XG5cbiAgICAgICAgeWFtbERhdGFMaXN0ID0geWFtbERhdGFMaXN0LmNvbmNhdChhd2FpdCBQYXJzZXJJbmNsdWRlcy5pbml0KGdpdGxhYkNpRGF0YSwge2N3ZCwgc3RhdGVEaXIsIHdyaXRlU3RyZWFtcywgZ2l0RGF0YSwgZmV0Y2hJbmNsdWRlcywgdmFyaWFibGVzOiBleHBhbmRlZCwgZXhwYW5kVmFyaWFibGVzOiB0aGlzLmV4cGFuZFZhcmlhYmxlcywgbWF4aW11bUluY2x1ZGVzOiBhcmd2Lm1heGltdW1JbmNsdWRlc30pKTtcbiAgICAgICAgUGFyc2VySW5jbHVkZXMucmVzZXRDb3VudCgpO1xuXG4gICAgICAgIGNvbnN0IGdpdGxhYkNpTG9jYWxEYXRhID0gYXdhaXQgUGFyc2VyLmxvYWRZYW1sKGAke2N3ZH0vLmdpdGxhYi1jaS1sb2NhbC55bWxgLCB7fSwgdGhpcy5leHBhbmRWYXJpYWJsZXMpO1xuICAgICAgICB5YW1sRGF0YUxpc3QgPSB5YW1sRGF0YUxpc3QuY29uY2F0KGF3YWl0IFBhcnNlckluY2x1ZGVzLmluaXQoZ2l0bGFiQ2lMb2NhbERhdGEsIHtjd2QsIHN0YXRlRGlyLCB3cml0ZVN0cmVhbXMsIGdpdERhdGEsIGZldGNoSW5jbHVkZXMsIHZhcmlhYmxlczogZXhwYW5kZWQsIGV4cGFuZFZhcmlhYmxlczogdGhpcy5leHBhbmRWYXJpYWJsZXMsIG1heGltdW1JbmNsdWRlczogYXJndi5tYXhpbXVtSW5jbHVkZXN9KSk7XG4gICAgICAgIFBhcnNlckluY2x1ZGVzLnJlc2V0Q291bnQoKTtcblxuICAgICAgICBjb25zdCBnaXRsYWJEYXRhOiBhbnkgPSBkZWVwRXh0ZW5kKHt9LCAuLi55YW1sRGF0YUxpc3QpO1xuXG4gICAgICAgIC8vIEV4cGFuZCB2YXJpb3VzIGZpZWxkcyBpbiBnaXRsYWJEYXRhXG4gICAgICAgIERhdGFFeHBhbmRlci5qb2JFeHRlbmRzKGdpdGxhYkRhdGEpO1xuICAgICAgICBEYXRhRXhwYW5kZXIucmVmZXJlbmNlKGdpdGxhYkRhdGEsIGdpdGxhYkRhdGEpO1xuICAgICAgICBEYXRhRXhwYW5kZXIuZmxhdHRlbkxpc3RzKGdpdGxhYkRhdGEpO1xuICAgICAgICBEYXRhRXhwYW5kZXIuY29tcGxleE9iamVjdHMoZ2l0bGFiRGF0YSk7XG4gICAgICAgIERhdGFFeHBhbmRlci5kZWZhdWx0cyhnaXRsYWJEYXRhKTtcbiAgICAgICAgRGF0YUV4cGFuZGVyLmdsb2JhbFZhcmlhYmxlcyhnaXRsYWJEYXRhKTtcblxuICAgICAgICBhc3NlcnQoZ2l0bGFiRGF0YS5zdGFnZXMgJiYgQXJyYXkuaXNBcnJheShnaXRsYWJEYXRhLnN0YWdlcyksIGNoYWxrYHt5ZWxsb3cgc3RhZ2VzOn0gbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgICBpZiAoIWdpdGxhYkRhdGEuc3RhZ2VzLmluY2x1ZGVzKFwiLnByZVwiKSkge1xuICAgICAgICAgICAgZ2l0bGFiRGF0YS5zdGFnZXMudW5zaGlmdChcIi5wcmVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFnaXRsYWJEYXRhLnN0YWdlcy5pbmNsdWRlcyhcIi5wb3N0XCIpKSB7XG4gICAgICAgICAgICBnaXRsYWJEYXRhLnN0YWdlcy5wdXNoKFwiLnBvc3RcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhZ2VzID0gZ2l0bGFiRGF0YS5zdGFnZXM7XG5cbiAgICAgICAgLy8gQ2hlY2sgam9iIHZhcmlhYmxlcyBmb3IgaW52YWxpZCBoYXNoIG9mIGtleSB2YWx1ZSBwYWlycywgYW5kIGNhc3QgbnVtYmVycyB0byBzdHJpbmdzXG4gICAgICAgIFV0aWxzLmZvckVhY2hSZWFsSm9iKGdpdGxhYkRhdGEsIChqb2JOYW1lLCBqb2JEYXRhKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQoam9iRGF0YS53aGVuICE9PSBcIm5ldmVyXCIsXG4gICAgICAgICAgICAgICAgY2hhbGtgVGhpcyBHaXRMYWIgQ0kgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkOiBqb2JzOiR7am9iTmFtZX0gd2hlbjpuZXZlciBjYW4gb25seSBiZSB1c2VkIGluIGEgcnVsZXMgc2VjdGlvbiBvciB3b3JrZmxvdzpydWxlc2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIF92YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoam9iRGF0YS52YXJpYWJsZXMgfHwge30pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gX3ZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgdmFsdWUgPSBcIlwiOyAvLyB2YXJpYWJsZSdzIHZhbHVlcyBhcmUgbnVsbGFibGVcbiAgICAgICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICAgICAgY2hhbGtge2JsdWVCcmlnaHQgJHtqb2JOYW1lfX0gaGFzIGludmFsaWQgdmFyaWFibGVzIGhhc2ggb2Yga2V5IHZhbHVlIHBhaXJzLiAke2tleX09JHt2YWx1ZX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBqb2JEYXRhLnZhcmlhYmxlc1trZXldID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoam9iRGF0YS5zZXJ2aWNlcyA/PyBbXSkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlID0gam9iRGF0YS5zZXJ2aWNlc1tpXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXJ2aWNlLnZhcmlhYmxlcyB8fCB7fSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbGtge2JsdWVCcmlnaHQgJHtqb2JOYW1lfS5zZXJ2aWNlc1ske2l9XX0gaGFzIGludmFsaWQgdmFyaWFibGVzIGhhc2ggb2Yga2V5IHZhbHVlIHBhaXJzLiAke2tleX09JHt2YWx1ZX1gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGpvYkRhdGEuc2VydmljZXNbaV0udmFyaWFibGVzW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZ2l0bGFiRGF0YSA9IGdpdGxhYkRhdGE7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgam9icyBhbmQgcHV0IHRoZW0gaW50byBzdGFnZXNcbiAgICAgICAgVXRpbHMuZm9yRWFjaFJlYWxKb2IoZ2l0bGFiRGF0YSwgKGpvYk5hbWUsIGpvYkRhdGEpID0+IHtcbiAgICAgICAgICAgIGFzc2VydChnaXREYXRhICE9IG51bGwsIFwiZ2l0RGF0YSBtdXN0IGJlIHNldFwiKTtcbiAgICAgICAgICAgIGFzc2VydCh2YXJpYWJsZXNGcm9tRmlsZXMgIT0gbnVsbCwgXCJob21lVmFyaWFibGVzIG11c3QgYmUgc2V0XCIpO1xuXG4gICAgICAgICAgICBsZXQgbm9kZUluZGV4ID0gMTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFsbGVsTWF0cml4VmFyaWFibGVzTGlzdCA9IHBhcmFsbGVsLm1hdHJpeFZhcmlhYmxlc0xpc3Qoam9iRGF0YSwgam9iTmFtZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmFsbGVsTWF0cml4VmFyaWFibGVzIG9mIHBhcmFsbGVsTWF0cml4VmFyaWFibGVzTGlzdCkge1xuICAgICAgICAgICAgICAgIGxldCBtYXRyaXhKb2JOYW1lID0gam9iTmFtZTtcbiAgICAgICAgICAgICAgICBpZiAocGFyYWxsZWxNYXRyaXhWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4Sm9iTmFtZSA9IGAke2pvYk5hbWV9OiBbJHtPYmplY3QudmFsdWVzKHBhcmFsbGVsTWF0cml4VmFyaWFibGVzID8/IFtdKS5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFsbGVsLmlzUGxhaW5QYXJhbGxlbChqb2JEYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRyaXhKb2JOYW1lID0gYCR7am9iTmFtZX06IFske25vZGVJbmRleH0vJHtwYXJhbGxlbE1hdHJpeFZhcmlhYmxlc0xpc3QubGVuZ3RofV1gO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGpvYiA9IG5ldyBKb2Ioe1xuICAgICAgICAgICAgICAgICAgICBhcmd2LFxuICAgICAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGpvYkRhdGEsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hdHJpeEpvYk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGJhc2VOYW1lOiBqb2JOYW1lLFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxWYXJpYWJsZXM6IGdpdGxhYkRhdGEudmFyaWFibGVzLFxuICAgICAgICAgICAgICAgICAgICBwaXBlbGluZUlpZDogcGlwZWxpbmVJaWQsXG4gICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWRWYXJpYWJsZXMsXG4gICAgICAgICAgICAgICAgICAgIGdpdERhdGEsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc0Zyb21GaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4VmFyaWFibGVzOiBwYXJhbGxlbE1hdHJpeFZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgbm9kZUluZGV4OiAoam9iRGF0YS5wYXJhbGxlbCAhPSBudWxsKSA/IG5vZGVJbmRleCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG5vZGVzVG90YWw6IHBhcmFsbGVsTWF0cml4VmFyaWFibGVzTGlzdC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFZhcmlhYmxlczogdGhpcy5leHBhbmRWYXJpYWJsZXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRTdGFnZSA9IHRoaXMuc3RhZ2VzLmluY2x1ZGVzKGpvYi5zdGFnZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGZvdW5kU3RhZ2UsIGNoYWxrYHt5ZWxsb3cgc3RhZ2U6JHtqb2Iuc3RhZ2V9fSBub3QgZm91bmQgZm9yIHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fWApO1xuICAgICAgICAgICAgICAgIHRoaXMuam9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgICAgbm9kZUluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCBzb21lIHBhZGRpbmcgc28gdGhhdCBqb2IgbG9ncyBhcmUgbmljZWx5IGFsaWduZWRcbiAgICAgICAgLy8gYWxsb3cgdXNlcnMgdG8gb3ZlcnJpZGUgdGhpcyBpbiBjYXNlIHRoZXkgaGF2ZSByZWFsbHkgbG9uZyBqb2IgbmFtZSAoc2VlICM4NDApXG4gICAgICAgIGlmICh0aGlzLmFyZ3YubWF4Sm9iTmFtZVBhZGRpbmcgIT09IG51bGwgJiYgdGhpcy5hcmd2Lm1heEpvYk5hbWVQYWRkaW5nIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2pvYk5hbWVQYWQgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgam9icyA9IHRoaXMuYXJndi5qb2IubGVuZ3RoICE9PSAwID8gdGhpcy5hcmd2LmpvYiA6IHRoaXMuam9icztcbiAgICAgICAgICAgIGpvYnMuZm9yRWFjaCgoam9iKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGpvYk5lZWRzTGVuZ3RoOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJndi5uZWVkcyAmJiB0aGlzLmFyZ3Yuam9iLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmpvYnMuZmluZChqID0+IGouYmFzZU5hbWUgPT09IGpvYik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZD8ubmVlZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvYk5lZWRzTGVuZ3RoID0gZm91bmQubmVlZHMubWFwKGYgPT4gZi5qb2IubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBqb2JMZW5ndGggPSB0eXBlb2Ygam9iID09IFwic3RyaW5nXCIgPyBqb2IubGVuZ3RoIDogam9iLm5hbWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuX2pvYk5hbWVQYWQgPSBNYXRoLm1heChqb2JMZW5ndGgsIHRoaXMuX2pvYk5hbWVQYWQgPz8gMCwgLi4uam9iTmVlZHNMZW5ndGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5hcmd2Lm1heEpvYk5hbWVQYWRkaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fam9iTmFtZVBhZCA9IE1hdGgubWluKHRoaXMuYXJndi5tYXhKb2JOYW1lUGFkZGluZyA/PyAwLCB0aGlzLl9qb2JOYW1lUGFkID8/IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGpvYk5hbWVQYWQgb24gYWxsIGpvYnNcbiAgICAgICAgdGhpcy5qb2JzLmZvckVhY2goKGpvYikgPT4ge1xuICAgICAgICAgICAgam9iLmpvYk5hbWVQYWQgPSB0aGlzLmpvYk5hbWVQYWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIHByb2R1Y2VycyBmb3IgZWFjaCBqb2JcbiAgICAgICAgdGhpcy5qb2JzLmZvckVhY2goKGpvYikgPT4ge1xuICAgICAgICAgICAgam9iLnByb2R1Y2VycyA9IFByb2R1Y2Vycy5pbml0KHRoaXMuam9icywgdGhpcy5zdGFnZXMsIGpvYik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBsb2FkWWFtbCAoZmlsZVBhdGg6IHN0cmluZywgY3R4OiBhbnkgPSB7fSwgZXhwYW5kVmFyaWFibGVzOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHltbFBhdGggPSBgJHtmaWxlUGF0aH1gO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoeW1sUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoYCR7ZmlsZVBhdGh9YCwgXCJ1dGY4XCIpO1xuICAgICAgICBjb25zdCBmaWxlU3BsaXQgPSBmaWxlQ29udGVudC5zcGxpdCgvXFxyP1xcbi9nKTtcbiAgICAgICAgY29uc3QgZmlsZVNwbGl0Q2xvbmUgPSBmaWxlU3BsaXQuc2xpY2UoKTtcblxuICAgICAgICBsZXQgaW50ZXJhY3RpdmVNYXRjaCA9IG51bGw7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbk1hdGNoID0gbnVsbDtcbiAgICAgICAgbGV0IGluamVjdFNTSEFnZW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG5vQXJ0aWZhY3RzVG9Tb3VyY2VNYXRjaCA9IG51bGw7XG4gICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgIGlmIChleHBhbmRWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmaWxlU3BsaXQpIHtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZU1hdGNoID0gIWludGVyYWN0aXZlTWF0Y2ggPyAvI1xccz9AXFxzP1tJaV1udGVyYWN0aXZlLy5leGVjKGxpbmUpIDogaW50ZXJhY3RpdmVNYXRjaDtcbiAgICAgICAgICAgICAgICBpbmplY3RTU0hBZ2VudCA9ICFpbmplY3RTU0hBZ2VudCA/IC8jXFxzP0BcXHM/W0lpXW5qZWN0U1NIQWdlbnQvLmV4ZWMobGluZSkgOiBpbmplY3RTU0hBZ2VudDtcbiAgICAgICAgICAgICAgICBub0FydGlmYWN0c1RvU291cmNlTWF0Y2ggPSAhbm9BcnRpZmFjdHNUb1NvdXJjZU1hdGNoID8gLyNcXHM/QFxccz9Ob0FydGlmYWN0c1RvU291cmNlL2kuZXhlYyhsaW5lKSA6IG5vQXJ0aWZhY3RzVG9Tb3VyY2VNYXRjaDtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbk1hdGNoID0gIWRlc2NyaXB0aW9uTWF0Y2ggPyAvI1xccz9AXFxzP1tEZF1lc2NyaXB0aW9uICg/PGRlc2NyaXB0aW9uPi4qKS8uZXhlYyhsaW5lKSA6IGRlc2NyaXB0aW9uTWF0Y2g7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBqb2JNYXRjaCA9IC9cXHc6Ly5leGVjKGxpbmUpO1xuICAgICAgICAgICAgICAgIGlmIChqb2JNYXRjaCAmJiAoaW50ZXJhY3RpdmVNYXRjaCB8fCBkZXNjcmlwdGlvbk1hdGNoIHx8IGluamVjdFNTSEFnZW50IHx8IG5vQXJ0aWZhY3RzVG9Tb3VyY2VNYXRjaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyYWN0aXZlTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTcGxpdENsb25lLnNwbGljZShpbmRleCArIDEsIDAsIFwiICBnY2xJbnRlcmFjdGl2ZTogdHJ1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluamVjdFNTSEFnZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3BsaXRDbG9uZS5zcGxpY2UoaW5kZXggKyAxLCAwLCBcIiAgZ2NsSW5qZWN0U1NIQWdlbnQ6IHRydWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChub0FydGlmYWN0c1RvU291cmNlTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTcGxpdENsb25lLnNwbGljZShpbmRleCArIDEsIDAsIFwiICBnY2xBcnRpZmFjdHNUb1NvdXJjZTogZmFsc2VcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbk1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3BsaXRDbG9uZS5zcGxpY2UoaW5kZXggKyAxLCAwLCBgICBnY2xEZXNjcmlwdGlvbjogJHtkZXNjcmlwdGlvbk1hdGNoPy5ncm91cHM/LmRlc2NyaXB0aW9uID8/IFwiXCJ9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlTWF0Y2ggPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbk1hdGNoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0U1NIQWdlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBub0FydGlmYWN0c1RvU291cmNlTWF0Y2ggPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVmZXJlbmNlVHlwZSA9IG5ldyB5YW1sLlR5cGUoXCIhcmVmZXJlbmNlXCIsIHtcbiAgICAgICAgICAgIGtpbmQ6IFwic2VxdWVuY2VcIixcbiAgICAgICAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge3JlZmVyZW5jZURhdGE6IGRhdGF9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHlhbWwuREVGQVVMVF9TQ0hFTUEuZXh0ZW5kKFtyZWZlcmVuY2VUeXBlXSk7XG4gICAgICAgIGxldCBmaWxlRGF0YTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmlsZURhdGEgPSB5YW1sLmxvYWRBbGwoZmlsZVNwbGl0Q2xvbmUuam9pbihcIlxcblwiKSwgbnVsbCwge3NjaGVtYX0pIGFzIGFueVtdO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgeWFtbC5ZQU1MRXhjZXB0aW9uICYmIGUucmVhc29uID09PSBcImR1cGxpY2F0ZWQgbWFwcGluZyBrZXlcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrYHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiB9IGR1cGxpY2F0ZWQgbWFwcGluZyBrZXkgZGV0ZWN0ZWQhIFZhbHVlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIWApO1xuICAgICAgICAgICAgICAgIGZpbGVEYXRhID0geWFtbC5sb2FkQWxsKGZpbGVTcGxpdENsb25lLmpvaW4oXCJcXG5cIiksIG51bGwsIHtzY2hlbWEsIGpzb246IHRydWV9KSBhcyBhbnlbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlRGF0YS5sZW5ndGggPD0gMSkgcmV0dXJuIGZpbGVEYXRhWzBdO1xuXG4gICAgICAgIGlmIChpc0dpdGxhYlNwZWNGaWxlKGZpbGVEYXRhWzBdKSkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRzU3BlY2lmaWNhdGlvbjogYW55ID0gZmlsZURhdGFbMF07XG4gICAgICAgICAgICBjb25zdCB1bmludGVycG9sYXRlZENvbmZpZ3VyYXRpb25zOiBhbnkgPSBmaWxlRGF0YVsxXTtcblxuICAgICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkQ29uZmlndXJhdGlvbnMgPSBKU09OLnN0cmluZ2lmeSh1bmludGVycG9sYXRlZENvbmZpZ3VyYXRpb25zKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAvKD88Zmlyc3RDaGFyPi4pPyg/PHNlY29uZENoYXI+Lik/XFwkXFxbXFxbXFxzKmlucHV0cy4oPzxpbnRlcnBvbGF0aW9uS2V5PltcXHctXSspXFxzKlxcfD9cXHMqKD88aW50ZXJwb2xhdGlvbkZ1bmN0aW9ucz4uKj8pXFxzKlxcXVxcXSg/PGxhc3RDaGFyPlteJF0pPy9nIC8vIGh0dHBzOi8vcmVnZXhyLmNvbS84MWMxNlxuICAgICAgICAgICAgICAgICAgICAsIChfOiBzdHJpbmcsIGZpcnN0Q2hhcjogc3RyaW5nLCBzZWNvbmRDaGFyOiBzdHJpbmcsIGludGVycG9sYXRpb25LZXk6IHN0cmluZywgaW50ZXJwb2xhdGlvbkZ1bmN0aW9uczogc3RyaW5nLCBsYXN0Q2hhcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRpb25GdW5jdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzU3BlY2lmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGFyID8/PSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kQ2hhciA/Pz0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDaGFyID8/PSBcIlwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7aW5wdXRWYWx1ZSwgaW5wdXRUeXBlfSA9IHBhcnNlSW5jbHVkZUlucHV0cyhjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VHdvQ2hhciA9IGZpcnN0Q2hhciArIHNlY29uZENoYXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHNlY29uZENoYXIgPT0gXCJcXFwiXCIgJiYgbGFzdENoYXIgPT0gXCJcXFwiXCIpICYmIGZpcnN0Q2hhciAhPSBcIlxcXFxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0Q2hhciArIEpTT04uc3RyaW5naWZ5KGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBiZWhhdmVzIHNsaWdodGx5IGRpZmZlcmVudGx5IGZyb20gZ2l0bGFiLmNvbS4gSSBjYW4ndCBjb21lIHVwIHdpdGggcHJhY3RpY2FsIHVzZSBjYXNlIHNvIGkgZG9uJ3QgdGhpbmsgaXQncyB3b3J0aCB0aGUgZWZmb3J0IHRvIG1pbWljIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0VHdvQ2hhciArIEpTT04uc3RyaW5naWZ5KEpTT04uc3RyaW5naWZ5KGlucHV0VmFsdWUpKS5zbGljZSgxLCAtMSkgKyBsYXN0Q2hhcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdFR3b0NoYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgSlNPTi5zdHJpbmdpZnkoaW5wdXRWYWx1ZSkgLy8gZW5zdXJlIGEgdmFsaWQganNvbiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMSwgLTEpIC8vIHJlbW92ZSB0aGUgc3Vycm91bmRpbmcgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGFzdENoYXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzZWNvbmRDaGFyID09IFwiXFxcIlwiICYmIGxhc3RDaGFyID09IFwiXFxcIlwiKSAmJiBmaXJzdENoYXIgIT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdENoYXIgKyBpbnB1dFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdFR3b0NoYXIgKyBpbnB1dFZhbHVlICsgbGFzdENoYXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zd2l0Y2hTdGF0ZW1lbnRFeGhhdXN0aXZlQ2hlY2soaW5wdXRUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShpbnRlcnBvbGF0ZWRDb25maWd1cmF0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGVEYXRhWzBdO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNHaXRsYWJTcGVjRmlsZSAoZmlsZURhdGE6IGFueSkge1xuICAgIHJldHVybiBcInNwZWNcIiBpbiBmaWxlRGF0YTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVJbnRlcnBvbGF0aW9uS2V5IChjdHg6IGFueSkge1xuICAgIGNvbnN0IHtjb25maWdGaWxlUGF0aCwgaW50ZXJwb2xhdGlvbktleSwgaW5wdXRzU3BlY2lmaWNhdGlvbn0gPSBjdHg7XG4gICAgY29uc3QgaW52YWxpZEludGVycG9sYXRpb25LZXlFcnIgPSBjaGFsa2BUaGlzIEdpdExhYiBDSSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ6IFxcYHtibHVlQnJpZ2h0ICR7Y29uZmlnRmlsZVBhdGh9fVxcYDogdW5rbm93biBpbnRlcnBvbGF0aW9uIGtleTogXFxgJHtpbnRlcnBvbGF0aW9uS2V5fVxcYC5gO1xuICAgIGFzc2VydChpbnB1dHNTcGVjaWZpY2F0aW9uLnNwZWMuaW5wdXRzPy5baW50ZXJwb2xhdGlvbktleV0gIT09IHVuZGVmaW5lZCwgaW52YWxpZEludGVycG9sYXRpb25LZXlFcnIpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUludGVycG9sYXRpb25GdW5jdGlvbnMgKGN0eDogYW55KSB7XG4gICAgY29uc3Qge2ludGVycG9sYXRpb25GdW5jdGlvbnMsIGNvbmZpZ0ZpbGVQYXRofSA9IGN0eDtcbiAgICBpZiAoaW50ZXJwb2xhdGlvbkZ1bmN0aW9ucyAhPSBcIlwiKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrYHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiB9IGludGVycG9sYXRpb24gZnVuY3Rpb25zIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIHZpYSBnaXRsYWItY2ktbG9jYWwuIEZ1bmN0aW9ucyB3aWxsIGp1c3QgYmUgYSBuby1vcC5gKTtcbiAgICB9XG4gICAgYXNzZXJ0KGludGVycG9sYXRpb25GdW5jdGlvbnMuc3BsaXQoXCJ8XCIpLmxlbmd0aCA8PSBNQVhfRlVOQ1RJT05TLCBjaGFsa2BUaGlzIEdpdExhYiBDSSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ6IFxcYHtibHVlQnJpZ2h0ICR7Y29uZmlnRmlsZVBhdGh9fVxcYDogdG9vIG1hbnkgZnVuY3Rpb25zIGluIGludGVycG9sYXRpb24gYmxvY2suYCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQgKGN0eDogYW55KSB7XG4gICAgY29uc3Qge2NvbmZpZ0ZpbGVQYXRoLCBpbnRlcnBvbGF0aW9uS2V5LCBpbnB1dHNTcGVjaWZpY2F0aW9ufSA9IGN0eDtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gZ2V0SW5wdXRWYWx1ZShjdHgpO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IGlucHV0c1NwZWNpZmljYXRpb24uc3BlYy5pbnB1dHNbaW50ZXJwb2xhdGlvbktleV0/Lm9wdGlvbnM7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgYXNzZXJ0KG9wdGlvbnMuaW5jbHVkZXMoaW5wdXRWYWx1ZSksXG4gICAgICAgICAgICBjaGFsa2BUaGlzIEdpdExhYiBDSSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ6IFxcYHtibHVlQnJpZ2h0ICR7Y29uZmlnRmlsZVBhdGh9fVxcYDogXFxge2JsdWVCcmlnaHQgJHtpbnRlcnBvbGF0aW9uS2V5fX1cXGAgaW5wdXQ6IFxcYHtibHVlQnJpZ2h0ICR7aW5wdXRWYWx1ZX19XFxgIGNhbm5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWQgb3B0aW9ucy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHBlY3RlZElucHV0VHlwZSA9IGdldEV4cGVjdGVkSW5wdXRUeXBlKGN0eCk7XG4gICAgYXNzZXJ0KElOQ0xVREVfSU5QVVRTX1NVUFBPUlRFRF9UWVBFUy5pbmNsdWRlcyhleHBlY3RlZElucHV0VHlwZSksXG4gICAgICAgIGNoYWxrYFRoaXMgR2l0TGFiIENJIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDogXFxge2JsdWVCcmlnaHQgJHtjb25maWdGaWxlUGF0aH19XFxgOiBoZWFkZXI6c3BlYzppbnB1dHM6e2JsdWVCcmlnaHQgJHtpbnRlcnBvbGF0aW9uS2V5fX0gaW5wdXQgdHlwZSB1bmtub3duIHZhbHVlOiB7Ymx1ZUJyaWdodCAke2V4cGVjdGVkSW5wdXRUeXBlfX0uYCk7XG5cbiAgICBjb25zdCBpbnB1dFR5cGUgPSBBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpID8gXCJhcnJheVwiIDogdHlwZW9mIGlucHV0VmFsdWU7XG4gICAgYXNzZXJ0KGlucHV0VHlwZSA9PT0gZXhwZWN0ZWRJbnB1dFR5cGUsXG4gICAgICAgIGNoYWxrYFRoaXMgR2l0TGFiIENJIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDogXFxge2JsdWVCcmlnaHQgJHtjb25maWdGaWxlUGF0aH19XFxgOiBcXGB7Ymx1ZUJyaWdodCAke2ludGVycG9sYXRpb25LZXl9fVxcYCBpbnB1dDogcHJvdmlkZWQgdmFsdWUgaXMgbm90IGEge2JsdWVCcmlnaHQgJHtleHBlY3RlZElucHV0VHlwZX19LmApO1xuXG4gICAgY29uc3QgcmVnZXggPSBpbnB1dHNTcGVjaWZpY2F0aW9uLnNwZWMuaW5wdXRzW2ludGVycG9sYXRpb25LZXldPy5yZWdleDtcbiAgICBpZiAocmVnZXgpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGtge2JsYWNrLmJnWWVsbG93QnJpZ2h0ICBXQVJOIH0gc3BlYzppbnB1dHM6cmVnZXggaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgdmlhIGdpdGxhYi1jaS1sb2NhbC4gVGhpcyB3aWxsIGp1c3QgYmUgYSBuby1vcC5gKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5jbHVkZUlucHV0cyAoY3R4OiBhbnkpOiB7aW5wdXRWYWx1ZTogYW55OyBpbnB1dFR5cGU6IElucHV0VHlwZX0ge1xuICAgIHZhbGlkYXRlSW50ZXJwb2xhdGlvbktleShjdHgpO1xuICAgIHZhbGlkYXRlSW50ZXJwb2xhdGlvbkZ1bmN0aW9ucyhjdHgpO1xuICAgIHZhbGlkYXRlSW5wdXQoY3R4KTtcbiAgICByZXR1cm4ge2lucHV0VmFsdWU6IGdldElucHV0VmFsdWUoY3R4KSwgaW5wdXRUeXBlOiBnZXRFeHBlY3RlZElucHV0VHlwZShjdHgpfTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZSAoY3R4OiBhbnkpIHtcbiAgICBjb25zdCB7aW5wdXRzLCBpbnRlcnBvbGF0aW9uS2V5LCBjb25maWdGaWxlUGF0aCwgaW5wdXRzU3BlY2lmaWNhdGlvbn0gPSBjdHg7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IGlucHV0c1tpbnRlcnBvbGF0aW9uS2V5XSB8fCBpbnB1dHNTcGVjaWZpY2F0aW9uLnNwZWMuaW5wdXRzW2ludGVycG9sYXRpb25LZXldPy5kZWZhdWx0O1xuICAgIGFzc2VydChpbnB1dFZhbHVlICE9PSB1bmRlZmluZWQsIGNoYWxrYFRoaXMgR2l0TGFiIENJIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDogXFxge2JsdWVCcmlnaHQgJHtjb25maWdGaWxlUGF0aH19XFxgOiBcXGB7Ymx1ZUJyaWdodCAke2ludGVycG9sYXRpb25LZXl9fVxcYCBpbnB1dDogcmVxdWlyZWQgdmFsdWUgaGFzIG5vdCBiZWVuIHByb3ZpZGVkLmApO1xuICAgIHJldHVybiBpbnB1dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBlY3RlZElucHV0VHlwZSAoY3R4OiBhbnkpOiBJbnB1dFR5cGUge1xuICAgIGNvbnN0IHtpbnRlcnBvbGF0aW9uS2V5LCBpbnB1dHNTcGVjaWZpY2F0aW9ufSA9IGN0eDtcbiAgICByZXR1cm4gaW5wdXRzU3BlY2lmaWNhdGlvbi5zcGVjLmlucHV0c1tpbnRlcnBvbGF0aW9uS2V5XT8udHlwZSB8fCBcInN0cmluZ1wiO1xufVxuIl19
|