@aws-cdk/integ-runner 2.200.2 → 2.201.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/lib/logger.js CHANGED
@@ -1,8 +1,44 @@
1
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 () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
2
38
  Object.defineProperty(exports, "__esModule", { value: true });
3
39
  exports.trace = exports.highlight = exports.success = exports.warning = exports.error = exports.print = void 0;
4
- const util = require("util");
5
- const chalk = require("chalk");
40
+ const util = __importStar(require("util"));
41
+ const chalk_1 = __importDefault(require("chalk"));
6
42
  const { stderr } = process;
7
43
  const logger = (stream, styles) => (fmt, ...args) => {
8
44
  let str = util.format(fmt, ...args);
@@ -12,9 +48,9 @@ const logger = (stream, styles) => (fmt, ...args) => {
12
48
  stream.write(str + '\n');
13
49
  };
14
50
  exports.print = logger(stderr);
15
- exports.error = logger(stderr, [chalk.red]);
16
- exports.warning = logger(stderr, [chalk.yellow]);
17
- exports.success = logger(stderr, [chalk.green]);
18
- exports.highlight = logger(stderr, [chalk.bold]);
19
- exports.trace = logger(stderr, [chalk.gray]);
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFHL0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUUzQixNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQWdCLEVBQUUsTUFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRTtJQUN2RixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBRVcsUUFBQSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwQyxRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDekMsUUFBQSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLFFBQUEsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN6QyxRQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5cbnR5cGUgU3R5bGVGbiA9IChzdHI6IHN0cmluZykgPT4gc3RyaW5nO1xuY29uc3QgeyBzdGRlcnIgfSA9IHByb2Nlc3M7XG5cbmNvbnN0IGxvZ2dlciA9IChzdHJlYW06IFdyaXRhYmxlLCBzdHlsZXM/OiBTdHlsZUZuW10pID0+IChmbXQ6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHtcbiAgbGV0IHN0ciA9IHV0aWwuZm9ybWF0KGZtdCwgLi4uYXJncyk7XG4gIGlmIChzdHlsZXMgJiYgc3R5bGVzLmxlbmd0aCkge1xuICAgIHN0ciA9IHN0eWxlcy5yZWR1Y2UoKGEsIHN0eWxlKSA9PiBzdHlsZShhKSwgc3RyKTtcbiAgfVxuICBzdHJlYW0ud3JpdGUoc3RyICsgJ1xcbicpO1xufTtcblxuZXhwb3J0IGNvbnN0IHByaW50ID0gbG9nZ2VyKHN0ZGVycik7XG5leHBvcnQgY29uc3QgZXJyb3IgPSBsb2dnZXIoc3RkZXJyLCBbY2hhbGsucmVkXSk7XG5leHBvcnQgY29uc3Qgd2FybmluZyA9IGxvZ2dlcihzdGRlcnIsIFtjaGFsay55ZWxsb3ddKTtcbmV4cG9ydCBjb25zdCBzdWNjZXNzID0gbG9nZ2VyKHN0ZGVyciwgW2NoYWxrLmdyZWVuXSk7XG5leHBvcnQgY29uc3QgaGlnaGxpZ2h0ID0gbG9nZ2VyKHN0ZGVyciwgW2NoYWxrLmJvbGRdKTtcbmV4cG9ydCBjb25zdCB0cmFjZSA9IGxvZ2dlcihzdGRlcnIsIFtjaGFsay5ncmF5XSk7XG4iXX0=
51
+ exports.error = logger(stderr, [chalk_1.default.red]);
52
+ exports.warning = logger(stderr, [chalk_1.default.yellow]);
53
+ exports.success = logger(stderr, [chalk_1.default.green]);
54
+ exports.highlight = logger(stderr, [chalk_1.default.bold]);
55
+ exports.trace = logger(stderr, [chalk_1.default.gray]);
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9nZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDJDQUE2QjtBQUM3QixrREFBMEI7QUFHMUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUUzQixNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQWdCLEVBQUUsTUFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFXLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRTtJQUN2RixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3BDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDO0FBRVcsUUFBQSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZCLFFBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwQyxRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDekMsUUFBQSxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGVBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLFFBQUEsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN6QyxRQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAndXRpbCc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG50eXBlIFN0eWxlRm4gPSAoc3RyOiBzdHJpbmcpID0+IHN0cmluZztcbmNvbnN0IHsgc3RkZXJyIH0gPSBwcm9jZXNzO1xuXG5jb25zdCBsb2dnZXIgPSAoc3RyZWFtOiBXcml0YWJsZSwgc3R5bGVzPzogU3R5bGVGbltdKSA9PiAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gIGxldCBzdHIgPSB1dGlsLmZvcm1hdChmbXQsIC4uLmFyZ3MpO1xuICBpZiAoc3R5bGVzICYmIHN0eWxlcy5sZW5ndGgpIHtcbiAgICBzdHIgPSBzdHlsZXMucmVkdWNlKChhLCBzdHlsZSkgPT4gc3R5bGUoYSksIHN0cik7XG4gIH1cbiAgc3RyZWFtLndyaXRlKHN0ciArICdcXG4nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcmludCA9IGxvZ2dlcihzdGRlcnIpO1xuZXhwb3J0IGNvbnN0IGVycm9yID0gbG9nZ2VyKHN0ZGVyciwgW2NoYWxrLnJlZF0pO1xuZXhwb3J0IGNvbnN0IHdhcm5pbmcgPSBsb2dnZXIoc3RkZXJyLCBbY2hhbGsueWVsbG93XSk7XG5leHBvcnQgY29uc3Qgc3VjY2VzcyA9IGxvZ2dlcihzdGRlcnIsIFtjaGFsay5ncmVlbl0pO1xuZXhwb3J0IGNvbnN0IGhpZ2hsaWdodCA9IGxvZ2dlcihzdGRlcnIsIFtjaGFsay5ib2xkXSk7XG5leHBvcnQgY29uc3QgdHJhY2UgPSBsb2dnZXIoc3RkZXJyLCBbY2hhbGsuZ3JheV0pO1xuIl19
@@ -143,10 +143,22 @@ export declare class CdkIntegHelper {
143
143
  private _expectedTestSuite?;
144
144
  private _actualSnapshot?;
145
145
  private _legacyEnableLookups?;
146
+ /**
147
+ * Fields that require an async context to initialize.
148
+ */
149
+ private _asyncMembers?;
146
150
  /**
147
151
  * Private constructor to prevent inheritance.
148
152
  */
149
153
  private constructor();
154
+ /**
155
+ * Async initialization; copy information from an async context into variables so we can access them synchronously later.
156
+ *
157
+ * We call this automatically in all public async members, but if a consumer wants to access this context synchronously
158
+ * without calling an async members first, it needs to call this.
159
+ */
160
+ asyncInitialize(): Promise<void>;
161
+ private get asyncMembers();
150
162
  /**
151
163
  * Configure the legacy enableLookups value to use when generating the actual snapshot.
152
164
  *
@@ -1 +1 @@
1
- {"version":3,"file":"cdk-integ-helper.d.ts","sourceRoot":"","sources":["cdk-integ-helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cdk-integ-helper.d.ts","sourceRoot":"","sources":["cdk-integ-helper.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,49 @@
1
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 () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.DEFAULT_SYNTH_OPTIONS = exports.CdkIntegHelper = void 0;
4
37
  exports.currentlyRecommendedAwsCdkLibFlags = currentlyRecommendedAwsCdkLibFlags;
5
38
  /* eslint-disable @cdklabs/no-literal-partition */
6
- const path = require("path");
39
+ const path = __importStar(require("path"));
7
40
  const cloud_assembly_api_1 = require("@aws-cdk/cloud-assembly-api");
8
- const fs = require("fs-extra");
41
+ const fs = __importStar(require("fs-extra"));
9
42
  const integ_test_suite_1 = require("./integ-test-suite");
10
- const recommendedFlagsFile = require("../recommended-feature-flags.json");
43
+ const recommendedFlagsFile = __importStar(require("../recommended-feature-flags.json"));
11
44
  const utils_1 = require("../utils");
12
45
  const engine_1 = require("./engine");
13
- const logger = require("../logger");
46
+ const logger = __importStar(require("../logger"));
14
47
  const cloud_assembly_1 = require("./private/cloud-assembly");
15
48
  const integ_manifest_1 = require("./private/integ-manifest");
16
49
  const DESTRUCTIVE_CHANGES = '!!DESTRUCTIVE_CHANGES:';
@@ -92,6 +125,10 @@ class CdkIntegHelper {
92
125
  _expectedTestSuite;
93
126
  _actualSnapshot;
94
127
  _legacyEnableLookups;
128
+ /**
129
+ * Fields that require an async context to initialize.
130
+ */
131
+ _asyncMembers;
95
132
  /**
96
133
  * Private constructor to prevent inheritance.
97
134
  */
@@ -108,6 +145,26 @@ class CdkIntegHelper {
108
145
  const testRunCommand = this.test.appCommand;
109
146
  this.cdkApp = testRunCommand.replace('{filePath}', path.relative(this.directory, this.test.fileName));
110
147
  }
148
+ /**
149
+ * Async initialization; copy information from an async context into variables so we can access them synchronously later.
150
+ *
151
+ * We call this automatically in all public async members, but if a consumer wants to access this context synchronously
152
+ * without calling an async members first, it needs to call this.
153
+ */
154
+ async asyncInitialize() {
155
+ if (this._asyncMembers) {
156
+ return;
157
+ }
158
+ this._asyncMembers = {
159
+ testSpecificContext: await this.test.testSpecificContext(),
160
+ };
161
+ }
162
+ get asyncMembers() {
163
+ if (!this._asyncMembers) {
164
+ throw new Error('Async context not initialized. Call asyncInitialize() first.');
165
+ }
166
+ return this._asyncMembers;
167
+ }
111
168
  /**
112
169
  * Configure the legacy enableLookups value to use when generating the actual snapshot.
113
170
  *
@@ -120,6 +177,7 @@ class CdkIntegHelper {
120
177
  * Return the list of actual (i.e. new) test cases for this integration test
121
178
  */
122
179
  async actualTests() {
180
+ await this.asyncInitialize();
123
181
  return (await this.actualTestSuite()).testSuite;
124
182
  }
125
183
  /**
@@ -161,7 +219,7 @@ class CdkIntegHelper {
161
219
  }
162
220
  await this.cdk.synth({
163
221
  app: this.cdkApp,
164
- context: this.getContext(this._legacyEnableLookups !== false ? exports.DEFAULT_SYNTH_OPTIONS.context : {}),
222
+ context: await this.getContext(this._legacyEnableLookups !== false ? exports.DEFAULT_SYNTH_OPTIONS.context : {}),
165
223
  env: exports.DEFAULT_SYNTH_OPTIONS.env,
166
224
  output: path.relative(this.directory, outputDirectory),
167
225
  });
@@ -191,12 +249,14 @@ class CdkIntegHelper {
191
249
  * The test suite from the existing snapshot
192
250
  */
193
251
  async expectedTestSuite() {
252
+ await this.asyncInitialize();
194
253
  if (!this._expectedTestSuite && this.hasSnapshot()) {
195
254
  this._expectedTestSuite = await this.loadManifest();
196
255
  }
197
256
  return this._expectedTestSuite;
198
257
  }
199
258
  async actualSnapshot() {
259
+ await this.asyncInitialize();
200
260
  if (!this._actualSnapshot) {
201
261
  this._actualSnapshot = await this.generateActualSnapshot();
202
262
  // Check if the enableLookups value has changed between the golden
@@ -226,6 +286,7 @@ class CdkIntegHelper {
226
286
  * "legacy mode" and create a manifest from pragma
227
287
  */
228
288
  async loadManifest(dir) {
289
+ await this.asyncInitialize();
229
290
  const manifest = dir ?? this.goldenSnapshotDir;
230
291
  try {
231
292
  const testSuite = integ_test_suite_1.IntegTestSuite.fromPath(manifest);
@@ -337,6 +398,7 @@ class CdkIntegHelper {
337
398
  * the assembly that was output by the deployment
338
399
  */
339
400
  async createSnapshot() {
401
+ await this.asyncInitialize();
340
402
  if (fs.existsSync(this.goldenSnapshotDir)) {
341
403
  fs.removeSync(this.goldenSnapshotDir);
342
404
  }
@@ -370,8 +432,12 @@ class CdkIntegHelper {
370
432
  }
371
433
  }
372
434
  getContext(additionalContext) {
435
+ // Load the test-specific context (from `integ.context.json` or `cdk.json#context`), if any.
436
+ // If not found, use the built-in current feature flags (at the risk of newer feature flags changing
437
+ // the snapshots).
438
+ const featureFlags = this.asyncMembers.testSpecificContext ?? currentlyRecommendedAwsCdkLibFlags();
373
439
  return {
374
- ...currentlyRecommendedAwsCdkLibFlags(),
440
+ ...featureFlags,
375
441
  ...this.legacyContext,
376
442
  ...additionalContext,
377
443
  // Don't record creation stack traces in the snapshot, since they just take up space and are never deterministic.
@@ -448,4 +514,4 @@ exports.DEFAULT_SYNTH_OPTIONS = {
448
514
  function currentlyRecommendedAwsCdkLibFlags() {
449
515
  return recommendedFlagsFile;
450
516
  }
451
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWludGVnLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1pbnRlZy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNGpCQSxnRkFFQztBQTlqQkQsa0RBQWtEO0FBQ2xELDZCQUE2QjtBQUM3QixvRUFBcUY7QUFFckYsK0JBQStCO0FBQy9CLHlEQUEwRTtBQUUxRSwwRUFBMEU7QUFDMUUsb0NBQW1DO0FBQ25DLHFDQUFzQztBQUV0QyxvQ0FBb0M7QUFFcEMsNkRBQWtFO0FBRWxFLDZEQUEyRDtBQUUzRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBOEVyRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBOEI7UUFDakQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLEdBQUcsQ0FBTztJQUUxQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7OztPQUlHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COzs7T0FHRztJQUNhLGNBQWMsQ0FBUztJQUV2Qzs7O09BR0c7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYyxJQUFJLENBQVk7SUFFakM7O09BRUc7SUFDYSxXQUFXLEdBQXNCO1FBQy9DLFlBQVksRUFBRSxLQUFLO1FBQ25CLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQztJQUVGOzs7O09BSUc7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYSxPQUFPLENBQVU7SUFFakM7O09BRUc7SUFDYyxVQUFVLENBQVU7SUFFOUIsbUJBQW1CLENBQXVCO0lBQ3pDLGFBQWEsQ0FBdUI7SUFDcEMsa0JBQWtCLENBQXlDO0lBQzNELGVBQWUsQ0FBNkI7SUFDNUMs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QUNGO0tBQ0Y7SUFDRCxHQUFHLEVBQUU7UUFDSCxpQkFBaUIsRUFBRSxVQUFVO1FBQzdCLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isd0JBQXdCLEVBQUUsZ0JBQWdCO1FBQzFDLDBCQUEwQixFQUFFLGFBQWE7UUFDekMscUJBQXFCLEVBQUUsZUFBZTtRQUN0QyxrQkFBa0IsRUFBRSxtRkFBbUY7UUFDdkcsbUJBQW1CLEVBQUUsMEJBQTBCO0tBQ2hEO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILFNBQWdCLGtDQUFrQztJQUNoRCxPQUFPLG9CQUFvQixDQUFDO0FBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAY2RrbGFicy9uby1saXRlcmFsLXBhcnRpdGlvbiAqL1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IEFWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktYXBpJztcbmltcG9ydCB0eXBlIHsgVGVzdENhc2UsIERlZmF1bHRDZGtPcHRpb25zIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IEludGVnVGVzdFN1aXRlLCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSB9IGZyb20gJy4vaW50ZWctdGVzdC1zdWl0ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdCB9IGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0ICogYXMgcmVjb21tZW5kZWRGbGFnc0ZpbGUgZnJvbSAnLi4vcmVjb21tZW5kZWQtZmVhdHVyZS1mbGFncy5qc29uJztcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBtYWtlRW5naW5lIH0gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBJQ2RrIH0gZnJvbSAnLi4vZW5naW5lcy9jZGstaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdFRyYWNlIH0gZnJvbSAnLi9wcml2YXRlL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBEZXN0cnVjdGl2ZUNoYW5nZSB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcbmltcG9ydCB7IE5vTWFuaWZlc3RFcnJvciB9IGZyb20gJy4vcHJpdmF0ZS9pbnRlZy1tYW5pZmVzdCc7XG5cbmNvbnN0IERFU1RSVUNUSVZFX0NIQU5HRVMgPSAnISFERVNUUlVDVElWRV9DSEFOR0VTOic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gaW50ZWcgaGVscGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrSW50ZWdIZWxwZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXN0IHRvIHJ1blxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdDogSW50ZWdUZXN0O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIHdoZXJlIHRoZSB0ZXN0IHNob3VsZCBiZSBkZXBsb3llZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgcHJvZmlsZSB0byB1c2Ugd2hlbiBpbnZva2luZyB0aGUgQ0RLIENMSVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb2ZpbGUgaXMgcGFzc2VkLCB0aGUgZGVmYXVsdCBwcm9maWxlIGlzIHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBhdmFpbGFibGVcbiAgICogdG8gdGhlIENESyBDTElcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHRtcCBjZGsub3V0IGRpcmVjdG9yeVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRpcmVjdG9yeSB3aWxsIGJlIGBjZGstaW50ZWcub3V0LiR7dGVzdE5hbWV9YFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZWdPdXREaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluc3RhbmNlIG9mIHRoZSBDREsgVG9vbGtpdCBFbmdpbmUgdG8gdXNlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYmFzZWQgb24gYGVuZ2luZWAgb3B0aW9uXG4gICAqL1xuICByZWFkb25seSBjZGs/OiBJQ2RrO1xuXG4gIC8qKlxuICAgKiBTaG93IG91dHB1dCBmcm9tIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHNcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNob3dPdXRwdXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGluZGljYXRlZCBwcm94eVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHByb3h5XG4gICAqL1xuICByZWFkb25seSBwcm94eT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBDQSBjZXJ0aWZpY2F0ZSB0byB1c2Ugd2hlbiB2YWxpZGF0aW5nIEhUVFBTIHJlcXVlc3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBDQSBidW5kbGVcbiAgICovXG4gIHJlYWRvbmx5IGNhQnVuZGxlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRvIHN5bnRoZXNpemUgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIGxvb2t1cHMgZW5hYmxlZCBvciBub3QuXG4gKlxuICogSWYgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgLCB3ZSBzZW5kIGNvbnRleHQgaW4gb3Igbm90IHdoaWxlIHN5bnRoZXNpemluZyxcbiAqIGFuZCBpZiB0aGUgZ2VuZXJhdGVkIHNuYXBzaG90IHRlc3QgZGVmaW5pdGlvbiByZXF1ZXN0cyBhIGRpZmZlcmVudCB2YWx1ZSB3ZVxuICogd2lsbCBzeW50aCBhZ2Fpbi5cbiAqXG4gKiBGb3IgYGRvbnQtY2FyZWAsIHdlIGRvIHNlbmQgaW4gdGhlIGNvbnRleHQgYnV0IHdlIG5ldmVyIHJlc3ludGguXG4gKi9cbmV4cG9ydCB0eXBlIExlZ2FjeUVuYWJsZUxvb2t1cHMgPSB0cnVlIHwgZmFsc2UgfCAnZG9udC1jYXJlJztcblxuLyoqXG4gKiBDbGFzcyB3aXRoIHNvbWUgaGVscGVyIHJvdXRpbmVzIGZvciBydW5uaW5nIENESyBzbmFwc2hvdHMgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIEEgXCJnb2xkZW4gc25hcHNob3RcIiBpcyB0aGUgc25hcHNob3QgdGhhdCBpcyBzdG9yZWQgcGVybWFuZW50bHkgaW4gdmVyc2lvblxuICogY29udHJvbCwgdGhhdCBuZXcgcnVucyBhcmUgY29tcGFyZWQgYWdhaW5zdCAoc3RvcmVkIGluIGEgZGlyZWN0b3J5IG5hbWVkXG4gKiBgPHRlc3QtbmFtZT4uc25hcHNob3RgKS5cbiAqXG4gKiBUaGlzIGlzIGFzIG9wcG9zZWQgdG8gb3RoZXIgc25hcHNob3RzLCB3aGljaCBjYW4gYmUgZ2VuZXJhdGVkIGZvciBleGFtcGxlXG4gKiB0ZW1wb3JhcmlseSBpbiBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIHRvIGNvbXBhcmUgYWdhaW5zIHRoZSBnb2xkZW4gc25hcHNob3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZGtJbnRlZ0hlbHBlciB7XG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIENka0ludGVnSGVscGVyLlxuICAgKlxuICAgKiBIaWRpbmcgdGhlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5oZXJpdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDZGtJbnRlZ0hlbHBlck9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IENka0ludGVnSGVscGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGdvbGRlbiBzbmFwc2hvdCB3aWxsIGJlIHN0b3JlZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdvbGRlblNuYXBzaG90RGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGluc3RhbmNlIG9mIHRoZSBDREsgIENMSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNkazogSUNkaztcblxuICAvKipcbiAgICogUHJldHR5IG5hbWUgb2YgdGhlIHRlc3RcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0ZXN0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdXNlZCBpbiB0aGUgJy0tYXBwJyBDTEkgcGFyYW1ldGVyXG4gICAqXG4gICAqIFBhdGggdG8gdGhlIGludGVnIHRlc3Qgc291cmNlIGZpbGUsIHJlbGF0aXZlIHRvIGB0aGlzLmRpcmVjdG9yeWAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQXBwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHdoZXJlIHRoZSBgY2RrLmNvbnRleHQuanNvbmAgZmlsZVxuICAgKiB3aWxsIGJlIGNyZWF0ZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGtDb250ZXh0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgdGhhdCB0aGUgaW50ZWdyYXRpb24gdGVzdHMgd2lsbCBiZVxuICAgKiBleGVjdXRlZCBmcm9tXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHRvIHJ1blxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0OiBJbnRlZ1Rlc3Q7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBDREsgQ0xJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdEFyZ3M6IERlZmF1bHRDZGtPcHRpb25zID0ge1xuICAgIHBhdGhNZXRhZGF0YTogZmFsc2UsXG4gICAgYXNzZXRNZXRhZGF0YTogZmFsc2UsXG4gICAgdmVyc2lvblJlcG9ydGluZzogZmFsc2UsXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIENESyB3aWxsIGJlIHN5bnRoZWQgdG9cbiAgICpcbiAgICogUmVsYXRpdmUgdG8gY3dkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka091dERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvZmlsZSB0byB1c2UgZm9yIHRoZSBDREsgQ0xJIGNhbGxzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2hvdyBvdXRwdXQgZnJvbSB0aGUgaW50ZWcgdGVzdCBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3dPdXRwdXQ6IGJvb2xlYW47XG5cbiAgcHVibGljIF9kZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xuICBwcml2YXRlIGxlZ2FjeUNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9leHBlY3RlZFRlc3RTdWl0ZT86IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHByaXZhdGUgX2FjdHVhbFNuYXBzaG90PzogU25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbjtcbiAgcHJpdmF0ZSBfbGVnYWN5RW5hYmxlTG9va3Vwcz86IExlZ2FjeUVuYWJsZUxvb2t1cHM7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBpbmhlcml0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3Iob3B0aW9uczogQ2RrSW50ZWdIZWxwZXJPcHRpb25zKSB7XG4gICAgdGhpcy50ZXN0ID0gb3B0aW9ucy50ZXN0O1xuICAgIHRoaXMuZGlyZWN0b3J5ID0gdGhpcy50ZXN0LmRpcmVjdG9yeTtcbiAgICB0aGlzLnRlc3ROYW1lID0gdGhpcy50ZXN0LnRlc3ROYW1lO1xuICAgIHRoaXMuZ29sZGVuU25hcHNob3REaXIgPSB0aGlzLnRlc3Quc25hcHNob3REaXI7XG4gICAgdGhpcy5jZGtDb250ZXh0UGF0aCA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgJ2Nkay5jb250ZXh0Lmpzb24nKTtcbiAgICB0aGlzLnByb2ZpbGUgPSBvcHRpb25zLnByb2ZpbGU7XG4gICAgdGhpcy5zaG93T3V0cHV0ID0gb3B0aW9ucy5zaG93T3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgdGhpcy5jZGsgPSBvcHRpb25zLmNkayA/PyBtYWtlRW5naW5lKG9wdGlvbnMpO1xuICAgIHRoaXMuY2RrT3V0RGlyID0gb3B0aW9ucy5pbnRlZ091dERpciA/PyB0aGlzLnRlc3QudGVtcG9yYXJ5T3V0cHV0RGlyO1xuXG4gICAgY29uc3QgdGVzdFJ1bkNvbW1hbmQgPSB0aGlzLnRlc3QuYXBwQ29tbWFuZDtcbiAgICB0aGlzLmNka0FwcCA9IHRlc3RSdW5Db21tYW5kLnJlcGxhY2UoJ3tmaWxlUGF0aH0nLCBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLnRlc3QuZmlsZU5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIGxlZ2FjeSBlbmFibGVMb29rdXBzIHZhbHVlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgdGhlIGFjdHVhbCBzbmFwc2hvdC5cbiAgICpcbiAgICogTXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHNuYXBzaG90IG1ldGhvZHMuXG4gICAqL1xuICBwdWJsaWMgY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhlbmFibGVMb29rdXBzOiBMZWdhY3lFbmFibGVMb29rdXBzKTogdm9pZCB7XG4gICAgdGhpcy5fbGVnYWN5RW5hYmxlTG9va3VwcyA9IGVuYWJsZUxvb2t1cHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGFjdHVhbCAoaS5lLiBuZXcpIHRlc3QgY2FzZXMgZm9yIHRoaXMgaW50ZWdyYXRpb24gdGVzdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFjdHVhbFRlc3RzKCk6IFByb21pc2U8eyBbdGVzdE5hbWU6IHN0cmluZ106IFRlc3RDYXNlIH0gfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLnRlc3RTdWl0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90IHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgdG8gdGhlXG4gICAqIGV4aXN0aW5nIFwiZXhwZWN0ZWRcIiBzbmFwc2hvdFxuICAgKiBUaGlzIHdpbGwgc3ludGggYW5kIHRoZW4gbG9hZCB0aGUgaW50ZWdyYXRpb24gdGVzdCBtYW5pZmVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8U25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbj4ge1xuICAgIGF3YWl0IHRoaXMuc3ludGhBY3R1YWxTbmFwc2hvdCh0aGlzLmNka091dERpcik7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmxvYWRNYW5pZmVzdCh0aGlzLmNka091dERpcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlc3REZWZpbml0aW9uOiBtYW5pZmVzdCxcbiAgICAgIHNuYXBzaG90RGlyZWN0b3J5OiB0aGlzLmNka091dERpcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBhY3R1YWwgYXBwbGljYXRpb24gdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSwgZm9yIHB1cnBvc2VzIG9mIGdlbmVyYXRpbmcvdmFsaWRhdGluZyBhIHNuYXBzaG90XG4gICAqXG4gICAqIGBsZWdhY3lFbmFibGVMb29rdXBzYCBpcyB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIGZvciBhIHdoaWxlOlxuICAgKiB0cmFkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24gd291bGQgb25seSBiZSBzZWVkZWQgd2l0aCBjb250ZXh0IGlmXG4gICAqIGBlbmFibGVMb29rdXBzYCB3YXMgdHJ1ZSwgYW5kIHRoaXMgaW5mb3JtYXRpb24gd291bGQgY29tZSBmcm9tIHRoZSB0ZXN0XG4gICAqIGRlZmluaXRpb24uXG4gICAqXG4gICAqIC0gU2luY2UgdGhlIHRlc3QgZGVmaW5pdGlvbiBjb21lcyBmcm9tIGluc2lkZSB0aGUgYXBwLCB0aGlzIHJlcXVpcmVzIGFcbiAgICogICBzeW50aCBqdXN0IHRvIGdldCB0aGUgdGVzdCBkZWZpbml0aW9uLCBhbmQgdGhlbiBhbm90aGVyIHN5bnRoIHRvIGdlbmVyYXRlXG4gICAqICAgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQsIHdoaWNoIGlzIHRpbWUgY29uc3VtaW5nLlxuICAgKiAtIEdpdmVuIHRoYXQgdGhlIGNvbnRleHQgaXMgZml4ZWQgYW5kIGZha2UsIGl0IGNvdWxkIGFsd2F5cyBoYXZlIGJlZW4gcGFzc2VkLlxuICAgKlxuICAgKiBIb3dldmVyLCB0aGUgc25hcHNob3QgY29udGVudHMgdGhlbXNlbHZlcyBkZXBlbmQgb24gdGhlIGNvbnRleHQgZmxhZywgYW5kIGNoYW5naW5nXG4gICAqIHRoaXMgYmVoYXZpb3Igbm93IGludmFsaWRhdGVzIGFsbCBzbmFwc2hvdHMgZXZlcnl3aGVyZSwgd2hpY2ggaXMgYW5ub3lpbmcgZm9yIHVwZ3JhZGluZy5cbiAgICpcbiAgICogU28gd2Ugd2lsbCB1c2UgdGhlIGJlaGF2aW9yIGZyb20gdGhlIEdPTERFTiBTTkFQU0hPVCdzIHRlc3QgZGVmaW5pdGlvbiB0b1xuICAgKiBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHRoZSBjb250ZXh0LCBhbmQgaWYgdGhlIG5ldyBhY3R1YWwgc25hcHNob3QgaGFzIGFcbiAgICogZGlmZmVyZW50IHZhbHVlIGZvciBgZW5hYmxlTG9va3Vwc2AsIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUgb2xkIHNuYXBzaG90IGFuZCBzeW50aCBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3ludGhBY3R1YWxTbmFwc2hvdChvdXRwdXREaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBjYWxsIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMgYmVmb3JlIGdlbmVyYXRpbmcgc25hcHNob3RzJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jZGsuc3ludGgoe1xuICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgIGNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dCh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICE9PSBmYWxzZSA/IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5jb250ZXh0IDoge30pLFxuICAgICAgZW52OiBERUZBVUxUX1NZTlRIX09QVElPTlMuZW52LFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCBvdXRwdXREaXJlY3RvcnkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdHVhbFN5bnRoUmVwcm9Db21tYW5kKCkge1xuICAgIC8vIFNob3cgdGhlIGNvbW1hbmQgbmVjZXNzYXJ5IHRvIHJlcHJvIHRoaXNcbiAgICBjb25zdCBlbnZTZXQgPSBPYmplY3QuZW50cmllcyhERUZBVUxUX1NZTlRIX09QVElPTlMuZW52KS5tYXAoKFtrLCB2XSkgPT4gYCR7a309JyR7dn0nYCk7XG4gICAgY29uc3QgZW52Q21kID0gZW52U2V0Lmxlbmd0aCA+IDAgPyBbJ2VudicsIC4uLmVudlNldF0gOiBbXTtcblxuICAgIHJldHVybiBbXG4gICAgICAuLi5lbnZDbWQsXG4gICAgICAnY2RrJyxcbiAgICAgICdzeW50aCcsXG4gICAgICAnLWEnLFxuICAgICAgYCcke3RoaXMuY2RrQXBwfSdgLFxuICAgICAgJy1vJyxcbiAgICAgIGAnJHt0aGlzLmNka091dERpcn0nYCxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0Q29udGV4dChERUZBVUxUX1NZTlRIX09QVElPTlMuY29udGV4dCkpLmZsYXRNYXAoKFtrLCB2XSkgPT4gdHlwZW9mIHYgIT09ICdvYmplY3QnID8gW2AtYyAnJHtrfT0ke3Z9J2BdIDogW10pLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgc25hcHNob3QgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdGVzdFxuICAgKi9cbiAgcHVibGljIGhhc1NuYXBzaG90KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIGV4aXN0aW5nIHNuYXBzaG90XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwZWN0ZWRUZXN0U3VpdGUoKTogUHJvbWlzZTxJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLl9leHBlY3RlZFRlc3RTdWl0ZSAmJiB0aGlzLmhhc1NuYXBzaG90KCkpIHtcbiAgICAgIHRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5sb2FkTWFuaWZlc3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8U25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbj4ge1xuICAgIGlmICghdGhpcy5fYWN0dWFsU25hcHNob3QpIHtcbiAgICAgIHRoaXMuX2FjdHVhbFNuYXBzaG90ID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbmFibGVMb29rdXBzIHZhbHVlIGhhcyBjaGFuZ2VkIGJldHdlZW4gdGhlIGdvbGRlblxuICAgICAgLy8gc25hcHNob3QgYW5kIHRoZSBhY3R1YWwgc25hcHNob3QuIElmIGl0IGhhcywgd2UgbmVlZCB0byByZS1zeW50aCB0aGVcbiAgICAgIC8vIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBuZXcgZW5hYmxlTG9va3VwcyB2YWx1ZS5cbiAgICAgIC8vXG4gICAgICAvLyBTZWUgYHN5bnRoQWN0dWFsU25hcHNob3RgIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS5cbiAgICAgIGNvbnN0IGFjdHVhbEVuYWJsZUxvb2t1cHMgPSB0aGlzLl9hY3R1YWxTbmFwc2hvdC50ZXN0RGVmaW5pdGlvbi5lbmFibGVMb29rdXBzID8/IGZhbHNlO1xuICAgICAgaWYgKGFjdHVhbEVuYWJsZUxvb2t1cHMgIT09IHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgJiYgdGhpcy5fbGVnYWN5RW5hYmxlTG9va3VwcyAhPT0gJ2RvbnQtY2FyZScpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmVMZWdhY3lFbmFibGVMb29rdXBzKGFjdHVhbEVuYWJsZUxvb2t1cHMpO1xuICAgICAgICB0aGlzLl9hY3R1YWxTbmFwc2hvdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWN0dWFsU25hcHNob3Q7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRlc3Qgc3VpdGUgZnJvbSB0aGUgbmV3IFwiYWN0dWFsXCIgc25hcHNob3RcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWN0dWFsVGVzdFN1aXRlKCk6IFByb21pc2U8SW50ZWdUZXN0U3VpdGUgfCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hY3R1YWxTbmFwc2hvdCgpKS50ZXN0RGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnRlZyBtYW5pZmVzdCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvblxuICAgKiBvbiBob3cgdG8gZXhlY3V0ZSB0aGUgdGVzdHNcbiAgICogRmlyc3Qgd2UgdHJ5IGFuZCBsb2FkIHRoZSBtYW5pZmVzdCBmcm9tIHRoZSBpbnRlZyBtYW5pZmVzdCAoaS5lLiBpbnRlZy5qc29uKVxuICAgKiBmcm9tIHRoZSBjbG91ZCBhc3NlbWJseS4gSWYgaXQgZG9lc24ndCBleGlzdCwgdGhlbiB3ZSBmYWxsYmFjayB0byB0aGVcbiAgICogXCJsZWdhY3kgbW9kZVwiIGFuZCBjcmVhdGUgYSBtYW5pZmVzdCBmcm9tIHByYWdtYVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRNYW5pZmVzdChkaXI/OiBzdHJpbmcpOiBQcm9taXNlPEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGRpciA/PyB0aGlzLmdvbGRlblNuYXBzaG90RGlyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZXN0U3VpdGUgPSBJbnRlZ1Rlc3RTdWl0ZS5mcm9tUGF0aChtYW5pZmVzdCk7XG4gICAgICByZXR1cm4gdGVzdFN1aXRlO1xuICAgIH0gY2F0Y2ggKG1vZGVybkVycm9yOiBhbnkpIHtcbiAgICAgIC8vIE9ubHkgYXR0ZW1wdCBsZWdhY3kgdGVzdCBjYXNlIGlmIHRoZSBpbnRlZyB0ZXN0IG1hbmlmZXN0IHdhcyBub3QgZm91bmRcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgZXJyb3JzLCBlLmcuIHdoZW4gcGFyc2luZyB0aGUgbWFuaWZlc3QgZmFpbHMsIHdlIGFib3J0LlxuICAgICAgaWYgKCEobW9kZXJuRXJyb3IgaW5zdGFuY2VvZiBOb01hbmlmZXN0RXJyb3IpKSB7XG4gICAgICAgIHRocm93IG1vZGVybkVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG93T3V0cHV0KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcbiAgICAgICAgICBcIkZhaWxlZCB0byBsb2FkIGludGVnIHRlc3QgbWFuaWZlc3QgZm9yICclcycuIEF0dGVtcHRpbmcgYXMgZGVwcmVjYXRlZCBsZWdhY3kgdGVzdCBpbnN0ZWFkLiBFcnJvciB3YXM6ICVzXCIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgbW9kZXJuRXJyb3IubWVzc2FnZSA/PyBTdHJpbmcobW9kZXJuRXJyb3IpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZXN0Q2FzZXMgPSBhd2FpdCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZS5mcm9tTGVnYWN5KHtcbiAgICAgICAgY2RrOiB0aGlzLmNkayxcbiAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdC5ub3JtYWxpemVkVGVzdE5hbWUsXG4gICAgICAgIGludGVnU291cmNlRmlsZVBhdGg6IHRoaXMudGVzdC5maWxlTmFtZSxcbiAgICAgICAgbGlzdE9wdGlvbnM6IHtcbiAgICAgICAgICAuLi50aGlzLmRlZmF1bHRBcmdzLFxuICAgICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sZWdhY3lDb250ZXh0ID0gTGVnYWN5SW50ZWdUZXN0U3VpdGUuZ2V0UHJhZ21hQ29udGV4dCh0aGlzLnRlc3QuZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRlc3RDYXNlcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICBjb25zdCBjZGtPdXRQYXRoID0gdGhpcy5jZGtPdXREaXI7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrT3V0UGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoY2RrT3V0UGF0aCk7XG4gICAgfVxuICAgIC8vIENsZWFyIGNhY2hlXG4gICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgYXJlIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzIHRvIGEgc3RhY2sgdGhlbiB0aGlzIHdpbGwgcmVjb3JkXG4gICAqIHRob3NlIGluIHRoZSBtYW5pZmVzdC5qc29uIGZpbGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVHJhY2VEYXRhKCk6IE1hbmlmZXN0VHJhY2Uge1xuICAgIGNvbnN0IHRyYWNlRGF0YTogTWFuaWZlc3RUcmFjZSA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXMgPSB0aGlzLl9kZXN0cnVjdGl2ZUNoYW5nZXMgPz8gW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0gdHJhY2VEYXRhLmdldChjaGFuZ2Uuc3RhY2tOYW1lKTtcbiAgICAgIGlmICh0cmFjZSkge1xuICAgICAgICB0cmFjZS5zZXQoY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2VEYXRhLnNldChjaGFuZ2Uuc3RhY2tOYW1lLCBuZXcgTWFwKFtcbiAgICAgICAgICBbY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWBdLFxuICAgICAgICBdKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlcyB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byByZXRhaW4gdGhlIGFzc2V0cyxcbiAgICogZm9yIGV4YW1wbGUsIGlmIHRoZSBhc3NldHMgYXJlIHZlcnkgbGFyZ2UuXG4gICAqXG4gICAqIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIHVwZGF0ZSB3b3JrZmxvdyBmb3IgaW5kaXZpZHVhbCB0ZXN0XG4gICAqIGNhc2VzLCB0aGlzIG5lZWRzIHRvIGZpcnN0IGdldCBhIGxpc3Qgb2Ygc3RhY2tzIHRoYXQgaGF2ZSB0aGUgdXBkYXRlIHdvcmtmbG93XG4gICAqIGRpc2FibGVkIGFuZCB0aGVuIGRlbGV0ZSBhc3NldHMgdGhhdCByZWxhdGUgdG8gdGhhdCBzdGFjay4gSXQgZG9lcyB0aGF0XG4gICAqIGJ5IHJlYWRpbmcgdGhlIGFzc2V0IG1hbmlmZXN0IGZvciB0aGUgc3RhY2sgYW5kIGRlbGV0aW5nIHRoZSBhc3NldCBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5nZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKSA/PyBbXTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgY29uc3QgYXNzZXRzID0gZmxhdHRlbihzdGFja3MubWFwKHN0YWNrID0+IHtcbiAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrKSA/PyBbXTtcbiAgICB9KSk7XG5cbiAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBhc3NldCk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmaWxlTmFtZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGZzLnJlbW92ZVN5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBhc3NldCBjYWNoZSAoLmNhY2hlLykgZmlsZXMgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqIFRoZXNlIGFyZSBhIGNhY2hlIG9mIHRoZSBhc3NldCB6aXBzLCBidXQgd2UgYXJlIGZpbmUgd2l0aFxuICAgKiByZS16aXBwaW5nIG9uIGRlcGxveVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBmaWxlKTtcbiAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZSA9PT0gJy5jYWNoZScpIHtcbiAgICAgICAgZnMuZW1wdHlEaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgZnMucm1kaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5ldyBzbmFwc2hvdC5cbiAgICpcbiAgICogSWYgbG9va3VwcyBhcmUgZW5hYmxlZCwgdGhlbiB3ZSBuZWVkIGNyZWF0ZSB0aGUgc25hcHNob3QgYnkgc3ludGgnaW5nIGFnYWluXG4gICAqIHdpdGggdGhlIGR1bW15IGNvbnRleHQgc28gdGhhdCBlYWNoIHRpbWUgdGhlIHRlc3QgaXMgcnVuIG9uIGRpZmZlcmVudCBtYWNoaW5lc1xuICAgKiAoYW5kIHdpdGggZGlmZmVyZW50IGNvbnRleHQvZW52KSB0aGUgZGlmZiB3aWxsIG5vdCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIGxvb2t1cHMgYXJlIGRpc2FibGVkICh3aGljaCBtZWFucyB0aGUgc3RhY2sgaXMgZW52IGFnbm9zdGljKSB0aGVuIGp1c3QgY29weVxuICAgKiB0aGUgYXNzZW1ibHkgdGhhdCB3YXMgb3V0cHV0IGJ5IHRoZSBkZXBsb3ltZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5nb2xkZW5TbmFwc2hvdERpcikpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmModGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgY2xldmVyLCB3ZSBzaG91bGQgYmUgYWJsZSB0byByZXVzZSB0aGUgc25hcHNob3QgdGhhdCB3YXNcbiAgICAvLyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSB0ZXN0IGludmFsaWRhdGlvbiBjaGVjayBhbmQgYXZvaWQgdGhlIGJlbG93IHN5bnRoLlxuICAgIC8vIEJ1dCB0aGF0IGdldHMgcnVuIGluIGEgY29tcGxldGVseSBkaWZmZXJlbnQgbGlmZWN5Y2xlIGFuZCBpdCBtaWdodCBub3RcbiAgICAvLyBleGlzdC4gV2UncmUgbm90IGRlYWxpbmcgd2l0aCB0aGF0IGp1c3QgeWV0LlxuICAgIGF3YWl0IHRoaXMuc3ludGhBY3R1YWxTbmFwc2hvdCh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcblxuICAgIGF3YWl0IHRoaXMuY2xlYW51cEdvbGRlblNuYXBzaG90KCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBzb21lIGNsZWFudXAgc3RlcHMgYWZ0ZXIgdGhlIHNuYXBzaG90IGlzIGNyZWF0ZWRcbiAgICogQW55dGltZSB0aGUgc25hcHNob3QgbmVlZHMgdG8gYmUgbW9kaWZpZWQgYWZ0ZXIgY3JlYXRpb25cbiAgICogdGhlIGxvZ2ljIHNob3VsZCBsaXZlIGhlcmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBHb2xkZW5TbmFwc2hvdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKSkge1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdmVBc3NldHNGcm9tU25hcHNob3QoKTtcbiAgICAgIHRoaXMucmVtb3ZlQXNzZXRzQ2FjaGVGcm9tU25hcHNob3QoKTtcbiAgICAgIGNvbnN0IGFzc2VtYmx5ID0gQXNzZW1ibHlNYW5pZmVzdFJlYWRlci5mcm9tUGF0aCh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcbiAgICAgIGFzc2VtYmx5LmNsZWFuTWFuaWZlc3QoKTtcbiAgICAgIGFzc2VtYmx5LnJlY29yZFRyYWNlKHRoaXMucmVuZGVyVHJhY2VEYXRhKCkpO1xuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgaXMgYSBsZWdhY3kgdGVzdCB0aGVuIGNyZWF0ZSBhbiBpbnRlZyBtYW5pZmVzdFxuICAgIC8vIGluIHRoZSBzbmFwc2hvdCBkaXJlY3Rvcnkgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRoZVxuICAgIC8vIHVwZGF0ZSB3b3JrZmxvdy4gU2F2ZSBhbnkgbGVnYWN5Q29udGV4dCBhcyB3ZWxsIHNvIHRoYXQgaXQgY2FuIGJlIHJlYWRcbiAgICAvLyB0aGUgbmV4dCB0aW1lXG4gICAgY29uc3QgYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKTtcbiAgICBpZiAoYWN0dWFsVGVzdFN1aXRlLnR5cGUgPT09ICdsZWdhY3ktdGVzdC1zdWl0ZScpIHtcbiAgICAgIChhY3R1YWxUZXN0U3VpdGUgYXMgTGVnYWN5SW50ZWdUZXN0U3VpdGUpLnNhdmVNYW5pZmVzdCh0aGlzLmdvbGRlblNuYXBzaG90RGlyLCB0aGlzLmxlZ2FjeUNvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDb250ZXh0KGFkZGl0aW9uYWxDb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jdXJyZW50bHlSZWNvbW1lbmRlZEF3c0Nka0xpYkZsYWdzKCksXG4gICAgICAuLi50aGlzLmxlZ2FjeUNvbnRleHQsXG4gICAgICAuLi5hZGRpdGlvbmFsQ29udGV4dCxcblxuICAgICAgLy8gRG9uJ3QgcmVjb3JkIGNyZWF0aW9uIHN0YWNrIHRyYWNlcyBpbiB0aGUgc25hcHNob3QsIHNpbmNlIHRoZXkganVzdCB0YWtlIHVwIHNwYWNlIGFuZCBhcmUgbmV2ZXIgZGV0ZXJtaW5pc3RpYy5cbiAgICAgICdhd3M6Y2RrOmRpc2FibGUtY3JlYXRpb24tc3RhY2stdHJhY2VzJzogdHJ1ZSxcblxuICAgICAgLy8gV2Ugb3JpZ2luYWxseSBoYWQgUExBTk5FRCB0byBzZXQgdGhpcyB0byBbJ2F3cycsICdhd3MtY24nXSwgYnV0IGR1ZSB0byBhIHByb2dyYW1taW5nIG1pc3Rha2VcbiAgICAgIC8vIGl0IHdhcyBzZXQgdG8gZXZlcnl0aGluZy4gSW4gdGhpcyBQUiwgc2V0IGl0IHRvIGV2ZXJ5dGhpbmcgdG8gbm90IG1lc3MgdXAgYWxsIHRoZSBzbmFwc2hvdHMuXG4gICAgICAnQGF3cy1jZGsvY29yZTp0YXJnZXQtcGFydGl0aW9ucyc6IHVuZGVmaW5lZCxcblxuICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBUSEUgRlVUVVJFIExJVkVTIEJFTE9XLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgLy8gUmVzdHJpY3RpbmcgdG8gdGhlc2UgdGFyZ2V0IHBhcnRpdGlvbnMgbWFrZXMgbW9zdCBzZXJ2aWNlIHByaW5jaXBhbHMgc3ludGhlc2l6ZSB0b1xuICAgICAgLy8gYHNlcnZpY2UuJHtVUkxfU1VGRklYfWAsIHdoaWNoIGlzIHRlY2huaWNhbGx5ICppbmNvcnJlY3QqIChpdCdzIG9ubHkgYGFtYXpvbmF3cy5jb21gXG4gICAgICAvLyBvciBgYW1hem9uYXdzLmNvbS5jbmAsIG5ldmVyIFVybFN1ZmZpeCBmb3IgYW55IG9mIHRoZSByZXN0cmljdGVkIHJlZ2lvbnMpIGJ1dCBpdCdzIHdoYXRcbiAgICAgIC8vIG1vc3QgZXhpc3RpbmcgaW50ZWcgdGVzdHMgY29udGFpbiwgYW5kIHdlIHdhbnQgdG8gZGlzdHVyYiBhcyBmZXcgYXMgcG9zc2libGUuXG4gICAgICAvLyBbVEFSR0VUX1BBUlRJVElPTlNdOiBbJ2F3cycsICdhd3MtY24nXSxcbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gRU5EIE9GIFRIRSBGVVRVUkUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuICAgIH07XG4gIH1cbn1cblxuLy8gRGVmYXVsdCBjb250ZXh0IHdlIHJ1biBhbGwgaW50ZWcgdGVzdHMgd2l0aCwgc28gdGhleSBkb24ndCBkZXBlbmQgb24gdGhlXG4vLyBhY2NvdW50IG9mIHRoZSBleGVyY2lzaW5nIHVzZXIuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TWU5USF9PUFRJT05TID0ge1xuICBjb250ZXh0OiB7XG4gICAgW0FWQUlMQUJJTElUWV9aT05FX0ZBTExCQUNLX0NPTlRFWFRfS0VZXTogWyd0ZXN0LXJlZ2lvbi0xYScsICd0ZXN0LXJlZ2lvbi0xYicsICd0ZXN0LXJlZ2lvbi0xYyddLFxuICAgICdhdmFpbGFiaWxpdHktem9uZXM6YWNjb3VudD0xMjM0NTY3ODpyZWdpb249dGVzdC1yZWdpb24nOiBbJ3Rlc3QtcmVnaW9uLTFhJywgJ3Rlc3QtcmVnaW9uLTFiJywgJ3Rlc3QtcmVnaW9uLTFjJ10sXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4tYW1pLWh2bS14ODZfNjQtZ3AyOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICdhbWktMTIzNCcsXG4gICAgJ3NzbTphY2NvdW50PTEyMzQ1Njc4OnBhcmFtZXRlck5hbWU9L2F3cy9zZXJ2aWNlL2FtaS1hbWF6b24tbGludXgtbGF0ZXN0L2Ftem4yLWFtaS1odm0teDg2XzY0LWdwMjpyZWdpb249dGVzdC1yZWdpb24nOiAnYW1pLTEyMzQnLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9lY3Mvb3B0aW1pemVkLWFtaS9hbWF6b24tbGludXgvcmVjb21tZW5kZWQ6cmVnaW9uPXRlc3QtcmVnaW9uJzogJ3tcImltYWdlX2lkXCI6IFwiYW1pLTEyMzRcIn0nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAc3R5bGlzdGljL21heC1sZW5cbiAgICAnYW1pOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVycy5pbWFnZS10eXBlLjA9bWFjaGluZTpmaWx0ZXJzLm5hbWUuMD1hbXpuLWFtaS12cGMtbmF0LSo6ZmlsdGVycy5zdGF0ZS4wPWF2YWlsYWJsZTpvd25lcnMuMD1hbWF6b246cmVnaW9uPXRlc3QtcmVnaW9uJzogJ2FtaS0xMjM0JyxcbiAgICAndnBjLXByb3ZpZGVyOmFjY291bnQ9MTIzNDU2Nzg6ZmlsdGVyLmlzRGVmYXVsdD10cnVlOnJlZ2lvbj10ZXN0LXJlZ2lvbjpyZXR1cm5Bc3ltbWV0cmljU3VibmV0cz10cnVlJzoge1xuICAgICAgdnBjSWQ6ICd2cGMtNjA5MDA5MDUnLFxuICAgICAgc3VibmV0R3JvdXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnUHVibGljJyxcbiAgICAgICAgICBuYW1lOiAnUHVibGljJyxcbiAgICAgICAgICBzdWJuZXRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym5ldElkOiAnc3VibmV0LWUxOTQ1NWNhJyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogJ3VzLWVhc3QtMWEnLFxuICAgICAgICAgICAgICByb3V0ZVRhYmxlSWQ6ICdydGItZTE5NDU1Y2EnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibmV0SWQ6ICdzdWJuZXQtZTBjMjQ3OTcnLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiAndXMtZWFzdC0xYicsXG4gICAgICAgICAgICAgIHJvdXRlVGFibGVJZDogJ3J0Yi1lMGMyNDc5NycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJuZXRJZDogJ3N1Ym5ldC1jY2Q3NzM5NScsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6ICd1cy1lYXN0LTFjJyxcbiAgICAgICAgICAgICAgcm91dGVUYWJsZUlkOiAncnRiLWNjZDc3Mzk1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbiAgZW52OiB7XG4gICAgQ0RLX0lOVEVHX0FDQ09VTlQ6ICcxMjM0NTY3OCcsXG4gICAgQ0RLX0lOVEVHX1JFR0lPTjogJ3Rlc3QtcmVnaW9uJyxcbiAgICBDREtfSU5URUdfSE9TVEVEX1pPTkVfSUQ6ICdaMjNBQkM0WFlaTDA1QicsXG4gICAgQ0RLX0lOVEVHX0hPU1RFRF9aT05FX05BTUU6ICdleGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0RPTUFJTl9OQU1FOiAnKi5leGFtcGxlLmNvbScsXG4gICAgQ0RLX0lOVEVHX0NFUlRfQVJOOiAnYXJuOmF3czphY206dGVzdC1yZWdpb246MTIzNDU2Nzg6Y2VydGlmaWNhdGUvODY0NjgyMDktYTI3Mi01OTVkLWI4MzEtMGVmYjY0MjEyNjV6JyxcbiAgICBDREtfSU5URUdfU1VCTkVUX0lEOiAnc3VibmV0LTBkZmYxYTM5OWQ4ZjZmOTJjJyxcbiAgfSxcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBjdXJyZW50bHkgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGBhd3MtY2RrLWxpYmAuXG4gKlxuICogVGhlc2UgaGF2ZSBiZWVuIGJ1aWx0IGludG8gdGhlIENMSSBhdCBidWlsZCB0aW1lLiBJZiB0aGlzIGV2ZXIgZ2V0cyBjaGFuZ2VkXG4gKiBiYWNrIHRvIGEgZHluYW1pYyBsb2FkLCByZW1lbWJlciB0aGF0IHRoaXMgc291cmNlIGZpbGUgbWF5IGJlIGJ1bmRsZWQgaW50b1xuICogYSBKYXZhU2NyaXB0IGJ1bmRsZSwgYW5kIGBfX2Rpcm5hbWVgIG1pZ2h0IG5vdCBwb2ludCB3aGVyZSB5b3UgdGhpbmsgaXQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRseVJlY29tbWVuZGVkQXdzQ2RrTGliRmxhZ3MoKSB7XG4gIHJldHVybiByZWNvbW1lbmRlZEZsYWdzRmlsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgdGVzdERlZmluaXRpb246IEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU7XG4gIHJlYWRvbmx5IHNuYXBzaG90RGlyZWN0b3J5OiBzdHJpbmc7XG59XG4iXX0=
517
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWludGVnLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1pbnRlZy1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcW1CQSxnRkFFQztBQXZtQkQsa0RBQWtEO0FBQ2xELDJDQUE2QjtBQUM3QixvRUFBcUY7QUFFckYsNkNBQStCO0FBQy9CLHlEQUEwRTtBQUUxRSx3RkFBMEU7QUFDMUUsb0NBQW1DO0FBQ25DLHFDQUFzQztBQUV0QyxrREFBb0M7QUFFcEMsNkRBQWtFO0FBRWxFLDZEQUEyRDtBQUczRCxNQUFNLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDO0FBOEVyRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBOEI7UUFDakQsT0FBTyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLEdBQUcsQ0FBTztJQUUxQjs7T0FFRztJQUNhLFFBQVEsQ0FBUztJQUVqQzs7OztPQUlHO0lBQ2EsTUFBTSxDQUFTO0lBRS9COzs7T0FHRztJQUNhLGNBQWMsQ0FBUztJQUV2Qzs7O09BR0c7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYyxJQUFJLENBQVk7SUFFakM7O09BRUc7SUFDYSxXQUFXLEdBQXNCO1FBQy9DLFlBQVksRUFBRSxLQUFLO1FBQ25CLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLGdCQUFnQixFQUFFLEtBQUs7S0FDeEIsQ0FBQztJQUVGOzs7O09BSUc7SUFDYSxTQUFTLENBQVM7SUFFbEM7O09BRUc7SUFDYSxPQUFPLENBQVU7SUFFakM7O09BRUc7SUFDYyxVQUFVLENBQVU7SUFFOUIsbUJBQW1CLENBQXVCO0lBQ3pDLGFBQWEsQ0FBdUI7SUFDcEMsa0JB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Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isa0NBQWtDO0lBQ2hELE9BQU8sb0JBQW9CLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEBjZGtsYWJzL25vLWxpdGVyYWwtcGFydGl0aW9uICovXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgQVZBSUxBQklMSVRZX1pPTkVfRkFMTEJBQ0tfQ09OVEVYVF9LRVkgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1hcGknO1xuaW1wb3J0IHR5cGUgeyBUZXN0Q2FzZSwgRGVmYXVsdENka09wdGlvbnMgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgSW50ZWdUZXN0U3VpdGUsIExlZ2FjeUludGVnVGVzdFN1aXRlIH0gZnJvbSAnLi9pbnRlZy10ZXN0LXN1aXRlJztcbmltcG9ydCB0eXBlIHsgSW50ZWdUZXN0IH0gZnJvbSAnLi9pbnRlZ3JhdGlvbi10ZXN0cyc7XG5pbXBvcnQgKiBhcyByZWNvbW1lbmRlZEZsYWdzRmlsZSBmcm9tICcuLi9yZWNvbW1lbmRlZC1mZWF0dXJlLWZsYWdzLmpzb24nO1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IG1ha2VFbmdpbmUgfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQgdHlwZSB7IElDZGsgfSBmcm9tICcuLi9lbmdpbmVzL2Nkay1pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0VHJhY2UgfSBmcm9tICcuL3ByaXZhdGUvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHsgQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB9IGZyb20gJy4vcHJpdmF0ZS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgdHlwZSB7IERlc3RydWN0aXZlQ2hhbmdlIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuaW1wb3J0IHsgTm9NYW5pZmVzdEVycm9yIH0gZnJvbSAnLi9wcml2YXRlL2ludGVnLW1hbmlmZXN0JztcbmltcG9ydCB0eXBlIHsgQ2RrQ29udGV4dCB9IGZyb20gJy4vcHJpdmF0ZS90ZXN0LXNwZWNpZmljLWNvbnRleHQnO1xuXG5jb25zdCBERVNUUlVDVElWRV9DSEFOR0VTID0gJyEhREVTVFJVQ1RJVkVfQ0hBTkdFUzonO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIGludGVnIGhlbHBlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENka0ludGVnSGVscGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgdGVzdCB0byBydW5cbiAgICovXG4gIHJlYWRvbmx5IHRlc3Q6IEludGVnVGVzdDtcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbiB3aGVyZSB0aGUgdGVzdCBzaG91bGQgYmUgZGVwbG95ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIHByb2ZpbGUgdG8gdXNlIHdoZW4gaW52b2tpbmcgdGhlIENESyBDTElcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwcm9maWxlIGlzIHBhc3NlZCwgdGhlIGRlZmF1bHQgcHJvZmlsZSBpcyB1c2VkXG4gICAqL1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgYXZhaWxhYmxlXG4gICAqIHRvIHRoZSBDREsgQ0xJXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB0bXAgY2RrLm91dCBkaXJlY3RvcnlcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkaXJlY3Rvcnkgd2lsbCBiZSBgY2RrLWludGVnLm91dC4ke3Rlc3ROYW1lfWBcbiAgICovXG4gIHJlYWRvbmx5IGludGVnT3V0RGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbnN0YW5jZSBvZiB0aGUgQ0RLIFRvb2xraXQgRW5naW5lIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJhc2VkIG9uIGBlbmdpbmVgIG9wdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2RrPzogSUNkaztcblxuICAvKipcbiAgICogU2hvdyBvdXRwdXQgZnJvbSBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzaG93T3V0cHV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlIHRoZSBpbmRpY2F0ZWQgcHJveHlcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwcm94eVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gQ0EgY2VydGlmaWNhdGUgdG8gdXNlIHdoZW4gdmFsaWRhdGluZyBIVFRQUyByZXF1ZXN0c1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFkZGl0aW9uYWwgQ0EgYnVuZGxlXG4gICAqL1xuICByZWFkb25seSBjYUJ1bmRsZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hldGhlciB0byBzeW50aGVzaXplIHRoZSBhY3R1YWwgc25hcHNob3Qgd2l0aCBsb29rdXBzIGVuYWJsZWQgb3Igbm90LlxuICpcbiAqIElmIGVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2Ugc2VuZCBjb250ZXh0IGluIG9yIG5vdCB3aGlsZSBzeW50aGVzaXppbmcsXG4gKiBhbmQgaWYgdGhlIGdlbmVyYXRlZCBzbmFwc2hvdCB0ZXN0IGRlZmluaXRpb24gcmVxdWVzdHMgYSBkaWZmZXJlbnQgdmFsdWUgd2VcbiAqIHdpbGwgc3ludGggYWdhaW4uXG4gKlxuICogRm9yIGBkb250LWNhcmVgLCB3ZSBkbyBzZW5kIGluIHRoZSBjb250ZXh0IGJ1dCB3ZSBuZXZlciByZXN5bnRoLlxuICovXG5leHBvcnQgdHlwZSBMZWdhY3lFbmFibGVMb29rdXBzID0gdHJ1ZSB8IGZhbHNlIHwgJ2RvbnQtY2FyZSc7XG5cbi8qKlxuICogQ2xhc3Mgd2l0aCBzb21lIGhlbHBlciByb3V0aW5lcyBmb3IgcnVubmluZyBDREsgc25hcHNob3RzIGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBBIFwiZ29sZGVuIHNuYXBzaG90XCIgaXMgdGhlIHNuYXBzaG90IHRoYXQgaXMgc3RvcmVkIHBlcm1hbmVudGx5IGluIHZlcnNpb25cbiAqIGNvbnRyb2wsIHRoYXQgbmV3IHJ1bnMgYXJlIGNvbXBhcmVkIGFnYWluc3QgKHN0b3JlZCBpbiBhIGRpcmVjdG9yeSBuYW1lZFxuICogYDx0ZXN0LW5hbWU+LnNuYXBzaG90YCkuXG4gKlxuICogVGhpcyBpcyBhcyBvcHBvc2VkIHRvIG90aGVyIHNuYXBzaG90cywgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCBmb3IgZXhhbXBsZVxuICogdGVtcG9yYXJpbHkgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCB0byBjb21wYXJlIGFnYWlucyB0aGUgZ29sZGVuIHNuYXBzaG90LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrSW50ZWdIZWxwZXIge1xuICAvKipcbiAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBDZGtJbnRlZ0hlbHBlci5cbiAgICpcbiAgICogSGlkaW5nIHRoZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluaGVyaXRhbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ2RrSW50ZWdIZWxwZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBDZGtJbnRlZ0hlbHBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBnb2xkZW4gc25hcHNob3Qgd2lsbCBiZSBzdG9yZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnb2xkZW5TbmFwc2hvdERpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgQ0RLICBDTElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGs6IElDZGs7XG5cbiAgLyoqXG4gICAqIFByZXR0eSBuYW1lIG9mIHRoZSB0ZXN0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGVzdE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHVzZWQgaW4gdGhlICctLWFwcCcgQ0xJIHBhcmFtZXRlclxuICAgKlxuICAgKiBQYXRoIHRvIHRoZSBpbnRlZyB0ZXN0IHNvdXJjZSBmaWxlLCByZWxhdGl2ZSB0byBgdGhpcy5kaXJlY3RvcnlgLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka0FwcDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB3aGVyZSB0aGUgYGNkay5jb250ZXh0Lmpzb25gIGZpbGVcbiAgICogd2lsbCBiZSBjcmVhdGVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQ29udGV4dFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoYXQgdGhlIGludGVncmF0aW9uIHRlc3RzIHdpbGwgYmVcbiAgICogZXhlY3V0ZWQgZnJvbVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCB0byBydW5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdDogSW50ZWdUZXN0O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgQ0RLIENMSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRBcmdzOiBEZWZhdWx0Q2RrT3B0aW9ucyA9IHtcbiAgICBwYXRoTWV0YWRhdGE6IGZhbHNlLFxuICAgIGFzc2V0TWV0YWRhdGE6IGZhbHNlLFxuICAgIHZlcnNpb25SZXBvcnRpbmc6IGZhbHNlLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBDREsgd2lsbCBiZSBzeW50aGVkIHRvXG4gICAqXG4gICAqIFJlbGF0aXZlIHRvIGN3ZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjZGtPdXREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByb2ZpbGUgdG8gdXNlIGZvciB0aGUgQ0RLIENMSSBjYWxsc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByb2ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3cgb3V0cHV0IGZyb20gdGhlIGludGVnIHRlc3QgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaG93T3V0cHV0OiBib29sZWFuO1xuXG4gIHB1YmxpYyBfZGVzdHJ1Y3RpdmVDaGFuZ2VzPzogRGVzdHJ1Y3RpdmVDaGFuZ2VbXTtcbiAgcHJpdmF0ZSBsZWdhY3lDb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcHJpdmF0ZSBfZXhwZWN0ZWRUZXN0U3VpdGU/OiBJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlO1xuICBwcml2YXRlIF9hY3R1YWxTbmFwc2hvdD86IFNuYXBzaG90QW5kVGVzdERlZmluaXRpb247XG4gIHByaXZhdGUgX2xlZ2FjeUVuYWJsZUxvb2t1cHM/OiBMZWdhY3lFbmFibGVMb29rdXBzO1xuXG4gIC8qKlxuICAgKiBGaWVsZHMgdGhhdCByZXF1aXJlIGFuIGFzeW5jIGNvbnRleHQgdG8gaW5pdGlhbGl6ZS5cbiAgICovXG4gIHByaXZhdGUgX2FzeW5jTWVtYmVycz86IHtcbiAgICB0ZXN0U3BlY2lmaWNDb250ZXh0PzogQ2RrQ29udGV4dDtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGluaGVyaXRhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihvcHRpb25zOiBDZGtJbnRlZ0hlbHBlck9wdGlvbnMpIHtcbiAgICB0aGlzLnRlc3QgPSBvcHRpb25zLnRlc3Q7XG4gICAgdGhpcy5kaXJlY3RvcnkgPSB0aGlzLnRlc3QuZGlyZWN0b3J5O1xuICAgIHRoaXMudGVzdE5hbWUgPSB0aGlzLnRlc3QudGVzdE5hbWU7XG4gICAgdGhpcy5nb2xkZW5TbmFwc2hvdERpciA9IHRoaXMudGVzdC5zbmFwc2hvdERpcjtcbiAgICB0aGlzLmNka0NvbnRleHRQYXRoID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCAnY2RrLmNvbnRleHQuanNvbicpO1xuICAgIHRoaXMucHJvZmlsZSA9IG9wdGlvbnMucHJvZmlsZTtcbiAgICB0aGlzLnNob3dPdXRwdXQgPSBvcHRpb25zLnNob3dPdXRwdXQgPz8gZmFsc2U7XG5cbiAgICB0aGlzLmNkayA9IG9wdGlvbnMuY2RrID8/IG1ha2VFbmdpbmUob3B0aW9ucyk7XG4gICAgdGhpcy5jZGtPdXREaXIgPSBvcHRpb25zLmludGVnT3V0RGlyID8/IHRoaXMudGVzdC50ZW1wb3JhcnlPdXRwdXREaXI7XG5cbiAgICBjb25zdCB0ZXN0UnVuQ29tbWFuZCA9IHRoaXMudGVzdC5hcHBDb21tYW5kO1xuICAgIHRoaXMuY2RrQXBwID0gdGVzdFJ1bkNvbW1hbmQucmVwbGFjZSgne2ZpbGVQYXRofScsIHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMudGVzdC5maWxlTmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGluaXRpYWxpemF0aW9uOyBjb3B5IGluZm9ybWF0aW9uIGZyb20gYW4gYXN5bmMgY29udGV4dCBpbnRvIHZhcmlhYmxlcyBzbyB3ZSBjYW4gYWNjZXNzIHRoZW0gc3luY2hyb25vdXNseSBsYXRlci5cbiAgICpcbiAgICogV2UgY2FsbCB0aGlzIGF1dG9tYXRpY2FsbHkgaW4gYWxsIHB1YmxpYyBhc3luYyBtZW1iZXJzLCBidXQgaWYgYSBjb25zdW1lciB3YW50cyB0byBhY2Nlc3MgdGhpcyBjb250ZXh0IHN5bmNocm9ub3VzbHlcbiAgICogd2l0aG91dCBjYWxsaW5nIGFuIGFzeW5jIG1lbWJlcnMgZmlyc3QsIGl0IG5lZWRzIHRvIGNhbGwgdGhpcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhc3luY0luaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2FzeW5jTWVtYmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2FzeW5jTWVtYmVycyA9IHtcbiAgICAgIHRlc3RTcGVjaWZpY0NvbnRleHQ6IGF3YWl0IHRoaXMudGVzdC50ZXN0U3BlY2lmaWNDb250ZXh0KCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGFzeW5jTWVtYmVycygpOiBOb25OdWxsYWJsZTxDZGtJbnRlZ0hlbHBlclsnX2FzeW5jTWVtYmVycyddPiB7XG4gICAgaWYgKCF0aGlzLl9hc3luY01lbWJlcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXN5bmMgY29udGV4dCBub3QgaW5pdGlhbGl6ZWQuIENhbGwgYXN5bmNJbml0aWFsaXplKCkgZmlyc3QuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hc3luY01lbWJlcnM7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBsZWdhY3kgZW5hYmxlTG9va3VwcyB2YWx1ZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBhY3R1YWwgc25hcHNob3QuXG4gICAqXG4gICAqIE11c3QgYmUgc2V0IGJlZm9yZSB1c2luZyBzbmFwc2hvdCBtZXRob2RzLlxuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMoZW5hYmxlTG9va3VwczogTGVnYWN5RW5hYmxlTG9va3Vwcyk6IHZvaWQge1xuICAgIHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgPSBlbmFibGVMb29rdXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbGlzdCBvZiBhY3R1YWwgKGkuZS4gbmV3KSB0ZXN0IGNhc2VzIGZvciB0aGlzIGludGVncmF0aW9uIHRlc3RcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3R1YWxUZXN0cygpOiBQcm9taXNlPHsgW3Rlc3ROYW1lOiBzdHJpbmddOiBUZXN0Q2FzZSB9IHwgdW5kZWZpbmVkPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLnRlc3RTdWl0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90IHdoaWNoIHdpbGwgYmUgY29tcGFyZWQgdG8gdGhlXG4gICAqIGV4aXN0aW5nIFwiZXhwZWN0ZWRcIiBzbmFwc2hvdFxuICAgKiBUaGlzIHdpbGwgc3ludGggYW5kIHRoZW4gbG9hZCB0aGUgaW50ZWdyYXRpb24gdGVzdCBtYW5pZmVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUFjdHVhbFNuYXBzaG90KCk6IFByb21pc2U8U25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbj4ge1xuICAgIGF3YWl0IHRoaXMuc3ludGhBY3R1YWxTbmFwc2hvdCh0aGlzLmNka091dERpcik7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCB0aGlzLmxvYWRNYW5pZmVzdCh0aGlzLmNka091dERpcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlc3REZWZpbml0aW9uOiBtYW5pZmVzdCxcbiAgICAgIHNuYXBzaG90RGlyZWN0b3J5OiB0aGlzLmNka091dERpcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIHRoZSBhY3R1YWwgYXBwbGljYXRpb24gdG8gdGhlIGdpdmVuIGRpcmVjdG9yeSwgZm9yIHB1cnBvc2VzIG9mIGdlbmVyYXRpbmcvdmFsaWRhdGluZyBhIHNuYXBzaG90XG4gICAqXG4gICAqIGBsZWdhY3lFbmFibGVMb29rdXBzYCBpcyB0byBwcmVzZXJ2ZSBoaXN0b3JpY2FsIGJlaGF2aW9yIGZvciBhIHdoaWxlOlxuICAgKiB0cmFkaXRpb25hbGx5LCB0aGUgYXBwbGljYXRpb24gd291bGQgb25seSBiZSBzZWVkZWQgd2l0aCBjb250ZXh0IGlmXG4gICAqIGBlbmFibGVMb29rdXBzYCB3YXMgdHJ1ZSwgYW5kIHRoaXMgaW5mb3JtYXRpb24gd291bGQgY29tZSBmcm9tIHRoZSB0ZXN0XG4gICAqIGRlZmluaXRpb24uXG4gICAqXG4gICAqIC0gU2luY2UgdGhlIHRlc3QgZGVmaW5pdGlvbiBjb21lcyBmcm9tIGluc2lkZSB0aGUgYXBwLCB0aGlzIHJlcXVpcmVzIGFcbiAgICogICBzeW50aCBqdXN0IHRvIGdldCB0aGUgdGVzdCBkZWZpbml0aW9uLCBhbmQgdGhlbiBhbm90aGVyIHN5bnRoIHRvIGdlbmVyYXRlXG4gICAqICAgdGhlIGFjdHVhbCBzbmFwc2hvdCB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHQsIHdoaWNoIGlzIHRpbWUgY29uc3VtaW5nLlxuICAgKiAtIEdpdmVuIHRoYXQgdGhlIGNvbnRleHQgaXMgZml4ZWQgYW5kIGZha2UsIGl0IGNvdWxkIGFsd2F5cyBoYXZlIGJlZW4gcGFzc2VkLlxuICAgKlxuICAgKiBIb3dldmVyLCB0aGUgc25hcHNob3QgY29udGVudHMgdGhlbXNlbHZlcyBkZXBlbmQgb24gdGhlIGNvbnRleHQgZmxhZywgYW5kIGNoYW5naW5nXG4gICAqIHRoaXMgYmVoYXZpb3Igbm93IGludmFsaWRhdGVzIGFsbCBzbmFwc2hvdHMgZXZlcnl3aGVyZSwgd2hpY2ggaXMgYW5ub3lpbmcgZm9yIHVwZ3JhZGluZy5cbiAgICpcbiAgICogU28gd2Ugd2lsbCB1c2UgdGhlIGJlaGF2aW9yIGZyb20gdGhlIEdPTERFTiBTTkFQU0hPVCdzIHRlc3QgZGVmaW5pdGlvbiB0b1xuICAgKiBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHRoZSBjb250ZXh0LCBhbmQgaWYgdGhlIG5ldyBhY3R1YWwgc25hcHNob3QgaGFzIGFcbiAgICogZGlmZmVyZW50IHZhbHVlIGZvciBgZW5hYmxlTG9va3Vwc2AsIHdlIHdpbGwgdGhyb3cgYXdheSB0aGUgb2xkIHNuYXBzaG90IGFuZCBzeW50aCBhZ2Fpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3ludGhBY3R1YWxTbmFwc2hvdChvdXRwdXREaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBjYWxsIGNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMgYmVmb3JlIGdlbmVyYXRpbmcgc25hcHNob3RzJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jZGsuc3ludGgoe1xuICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgIGNvbnRleHQ6IGF3YWl0IHRoaXMuZ2V0Q29udGV4dCh0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICE9PSBmYWxzZSA/IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5jb250ZXh0IDoge30pLFxuICAgICAgZW52OiBERUZBVUxUX1NZTlRIX09QVElPTlMuZW52LFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCBvdXRwdXREaXJlY3RvcnkpLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFjdHVhbFN5bnRoUmVwcm9Db21tYW5kKCkge1xuICAgIC8vIFNob3cgdGhlIGNvbW1hbmQgbmVjZXNzYXJ5IHRvIHJlcHJvIHRoaXNcbiAgICBjb25zdCBlbnZTZXQgPSBPYmplY3QuZW50cmllcyhERUZBVUxUX1NZTlRIX09QVElPTlMuZW52KS5tYXAoKFtrLCB2XSkgPT4gYCR7a309JyR7dn0nYCk7XG4gICAgY29uc3QgZW52Q21kID0gZW52U2V0Lmxlbmd0aCA+IDAgPyBbJ2VudicsIC4uLmVudlNldF0gOiBbXTtcblxuICAgIHJldHVybiBbXG4gICAgICAuLi5lbnZDbWQsXG4gICAgICAnY2RrJyxcbiAgICAgICdzeW50aCcsXG4gICAgICAnLWEnLFxuICAgICAgYCcke3RoaXMuY2RrQXBwfSdgLFxuICAgICAgJy1vJyxcbiAgICAgIGAnJHt0aGlzLmNka091dERpcn0nYCxcbiAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0Q29udGV4dChERUZBVUxUX1NZTlRIX09QVElPTlMuY29udGV4dCkpLmZsYXRNYXAoKFtrLCB2XSkgPT4gdHlwZW9mIHYgIT09ICdvYmplY3QnID8gW2AtYyAnJHtrfT0ke3Z9J2BdIDogW10pLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgc25hcHNob3QgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdGVzdFxuICAgKi9cbiAgcHVibGljIGhhc1NuYXBzaG90KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIGV4aXN0aW5nIHNuYXBzaG90XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwZWN0ZWRUZXN0U3VpdGUoKTogUHJvbWlzZTxJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlIHwgdW5kZWZpbmVkPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBpZiAoIXRoaXMuX2V4cGVjdGVkVGVzdFN1aXRlICYmIHRoaXMuaGFzU25hcHNob3QoKSkge1xuICAgICAgdGhpcy5fZXhwZWN0ZWRUZXN0U3VpdGUgPSBhd2FpdCB0aGlzLmxvYWRNYW5pZmVzdCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXhwZWN0ZWRUZXN0U3VpdGU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWN0dWFsU25hcHNob3QoKTogUHJvbWlzZTxTbmFwc2hvdEFuZFRlc3REZWZpbml0aW9uPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBpZiAoIXRoaXMuX2FjdHVhbFNuYXBzaG90KSB7XG4gICAgICB0aGlzLl9hY3R1YWxTbmFwc2hvdCA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdCgpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZW5hYmxlTG9va3VwcyB2YWx1ZSBoYXMgY2hhbmdlZCBiZXR3ZWVuIHRoZSBnb2xkZW5cbiAgICAgIC8vIHNuYXBzaG90IGFuZCB0aGUgYWN0dWFsIHNuYXBzaG90LiBJZiBpdCBoYXMsIHdlIG5lZWQgdG8gcmUtc3ludGggdGhlXG4gICAgICAvLyBhY3R1YWwgc25hcHNob3Qgd2l0aCB0aGUgbmV3IGVuYWJsZUxvb2t1cHMgdmFsdWUuXG4gICAgICAvL1xuICAgICAgLy8gU2VlIGBzeW50aEFjdHVhbFNuYXBzaG90YCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuXG4gICAgICBjb25zdCBhY3R1YWxFbmFibGVMb29rdXBzID0gdGhpcy5fYWN0dWFsU25hcHNob3QudGVzdERlZmluaXRpb24uZW5hYmxlTG9va3VwcyA/PyBmYWxzZTtcbiAgICAgIGlmIChhY3R1YWxFbmFibGVMb29rdXBzICE9PSB0aGlzLl9sZWdhY3lFbmFibGVMb29rdXBzICYmIHRoaXMuX2xlZ2FjeUVuYWJsZUxvb2t1cHMgIT09ICdkb250LWNhcmUnKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcyhhY3R1YWxFbmFibGVMb29rdXBzKTtcbiAgICAgICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQWN0dWFsU25hcHNob3QoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FjdHVhbFNuYXBzaG90O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IHN1aXRlIGZyb20gdGhlIG5ldyBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFjdHVhbFRlc3RTdWl0ZSgpOiBQcm9taXNlPEludGVnVGVzdFN1aXRlIHwgTGVnYWN5SW50ZWdUZXN0U3VpdGU+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWN0dWFsU25hcHNob3QoKSkudGVzdERlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW50ZWcgbWFuaWZlc3Qgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb25cbiAgICogb24gaG93IHRvIGV4ZWN1dGUgdGhlIHRlc3RzXG4gICAqIEZpcnN0IHdlIHRyeSBhbmQgbG9hZCB0aGUgbWFuaWZlc3QgZnJvbSB0aGUgaW50ZWcgbWFuaWZlc3QgKGkuZS4gaW50ZWcuanNvbilcbiAgICogZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHkuIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gd2UgZmFsbGJhY2sgdG8gdGhlXG4gICAqIFwibGVnYWN5IG1vZGVcIiBhbmQgY3JlYXRlIGEgbWFuaWZlc3QgZnJvbSBwcmFnbWFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTWFuaWZlc3QoZGlyPzogc3RyaW5nKTogUHJvbWlzZTxJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGRpciA/PyB0aGlzLmdvbGRlblNuYXBzaG90RGlyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZXN0U3VpdGUgPSBJbnRlZ1Rlc3RTdWl0ZS5mcm9tUGF0aChtYW5pZmVzdCk7XG4gICAgICByZXR1cm4gdGVzdFN1aXRlO1xuICAgIH0gY2F0Y2ggKG1vZGVybkVycm9yOiBhbnkpIHtcbiAgICAgIC8vIE9ubHkgYXR0ZW1wdCBsZWdhY3kgdGVzdCBjYXNlIGlmIHRoZSBpbnRlZyB0ZXN0IG1hbmlmZXN0IHdhcyBub3QgZm91bmRcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgZXJyb3JzLCBlLmcuIHdoZW4gcGFyc2luZyB0aGUgbWFuaWZlc3QgZmFpbHMsIHdlIGFib3J0LlxuICAgICAgaWYgKCEobW9kZXJuRXJyb3IgaW5zdGFuY2VvZiBOb01hbmlmZXN0RXJyb3IpKSB7XG4gICAgICAgIHRocm93IG1vZGVybkVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG93T3V0cHV0KSB7XG4gICAgICAgIGxvZ2dlci50cmFjZShcbiAgICAgICAgICBcIkZhaWxlZCB0byBsb2FkIGludGVnIHRlc3QgbWFuaWZlc3QgZm9yICclcycuIEF0dGVtcHRpbmcgYXMgZGVwcmVjYXRlZCBsZWdhY3kgdGVzdCBpbnN0ZWFkLiBFcnJvciB3YXM6ICVzXCIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgICAgbW9kZXJuRXJyb3IubWVzc2FnZSA/PyBTdHJpbmcobW9kZXJuRXJyb3IpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZXN0Q2FzZXMgPSBhd2FpdCBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZS5mcm9tTGVnYWN5KHtcbiAgICAgICAgY2RrOiB0aGlzLmNkayxcbiAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdC5ub3JtYWxpemVkVGVzdE5hbWUsXG4gICAgICAgIGludGVnU291cmNlRmlsZVBhdGg6IHRoaXMudGVzdC5maWxlTmFtZSxcbiAgICAgICAgbGlzdE9wdGlvbnM6IHtcbiAgICAgICAgICAuLi50aGlzLmRlZmF1bHRBcmdzLFxuICAgICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgICBhcHA6IHRoaXMuY2RrQXBwLFxuICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sZWdhY3lDb250ZXh0ID0gTGVnYWN5SW50ZWdUZXN0U3VpdGUuZ2V0UHJhZ21hQ29udGV4dCh0aGlzLnRlc3QuZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRlc3RDYXNlcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICBjb25zdCBjZGtPdXRQYXRoID0gdGhpcy5jZGtPdXREaXI7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2RrT3V0UGF0aCkpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMoY2RrT3V0UGF0aCk7XG4gICAgfVxuICAgIC8vIENsZWFyIGNhY2hlXG4gICAgdGhpcy5fYWN0dWFsU25hcHNob3QgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlcmUgYXJlIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzIHRvIGEgc3RhY2sgdGhlbiB0aGlzIHdpbGwgcmVjb3JkXG4gICAqIHRob3NlIGluIHRoZSBtYW5pZmVzdC5qc29uIGZpbGVcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyVHJhY2VEYXRhKCk6IE1hbmlmZXN0VHJhY2Uge1xuICAgIGNvbnN0IHRyYWNlRGF0YTogTWFuaWZlc3RUcmFjZSA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXMgPSB0aGlzLl9kZXN0cnVjdGl2ZUNoYW5nZXMgPz8gW107XG4gICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLmZvckVhY2goY2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IHRyYWNlID0gdHJhY2VEYXRhLmdldChjaGFuZ2Uuc3RhY2tOYW1lKTtcbiAgICAgIGlmICh0cmFjZSkge1xuICAgICAgICB0cmFjZS5zZXQoY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhY2VEYXRhLnNldChjaGFuZ2Uuc3RhY2tOYW1lLCBuZXcgTWFwKFtcbiAgICAgICAgICBbY2hhbmdlLmxvZ2ljYWxJZCwgYCR7REVTVFJVQ1RJVkVfQ0hBTkdFU30gJHtjaGFuZ2UuaW1wYWN0fWBdLFxuICAgICAgICBdKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRyYWNlRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBjYXNlcyB3aGVyZSB3ZSBkbyBub3Qgd2FudCB0byByZXRhaW4gdGhlIGFzc2V0cyxcbiAgICogZm9yIGV4YW1wbGUsIGlmIHRoZSBhc3NldHMgYXJlIHZlcnkgbGFyZ2UuXG4gICAqXG4gICAqIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIHVwZGF0ZSB3b3JrZmxvdyBmb3IgaW5kaXZpZHVhbCB0ZXN0XG4gICAqIGNhc2VzLCB0aGlzIG5lZWRzIHRvIGZpcnN0IGdldCBhIGxpc3Qgb2Ygc3RhY2tzIHRoYXQgaGF2ZSB0aGUgdXBkYXRlIHdvcmtmbG93XG4gICAqIGRpc2FibGVkIGFuZCB0aGVuIGRlbGV0ZSBhc3NldHMgdGhhdCByZWxhdGUgdG8gdGhhdCBzdGFjay4gSXQgZG9lcyB0aGF0XG4gICAqIGJ5IHJlYWRpbmcgdGhlIGFzc2V0IG1hbmlmZXN0IGZvciB0aGUgc3RhY2sgYW5kIGRlbGV0aW5nIHRoZSBhc3NldCBzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlQXNzZXRzRnJvbVNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YWNrcyA9IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5nZXRTdGFja3NXaXRob3V0VXBkYXRlV29ya2Zsb3coKSA/PyBbXTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgodGhpcy5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgY29uc3QgYXNzZXRzID0gZmxhdHRlbihzdGFja3MubWFwKHN0YWNrID0+IHtcbiAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBc3NldExvY2F0aW9uc0ZvclN0YWNrKHN0YWNrKSA/PyBbXTtcbiAgICB9KSk7XG5cbiAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBhc3NldCk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlTmFtZSkpIHtcbiAgICAgICAgaWYgKGZzLmxzdGF0U3luYyhmaWxlTmFtZSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIGZzLnJlbW92ZVN5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBhc3NldCBjYWNoZSAoLmNhY2hlLykgZmlsZXMgZnJvbSB0aGUgc25hcHNob3QuXG4gICAqIFRoZXNlIGFyZSBhIGNhY2hlIG9mIHRoZSBhc3NldCB6aXBzLCBidXQgd2UgYXJlIGZpbmUgd2l0aFxuICAgKiByZS16aXBwaW5nIG9uIGRlcGxveVxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IHBhdGguam9pbih0aGlzLmdvbGRlblNuYXBzaG90RGlyLCBmaWxlKTtcbiAgICAgIGlmIChmcy5sc3RhdFN5bmMoZmlsZU5hbWUpLmlzRGlyZWN0b3J5KCkgJiYgZmlsZSA9PT0gJy5jYWNoZScpIHtcbiAgICAgICAgZnMuZW1wdHlEaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgICAgZnMucm1kaXJTeW5jKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG5ldyBzbmFwc2hvdC5cbiAgICpcbiAgICogSWYgbG9va3VwcyBhcmUgZW5hYmxlZCwgdGhlbiB3ZSBuZWVkIGNyZWF0ZSB0aGUgc25hcHNob3QgYnkgc3ludGgnaW5nIGFnYWluXG4gICAqIHdpdGggdGhlIGR1bW15IGNvbnRleHQgc28gdGhhdCBlYWNoIHRpbWUgdGhlIHRlc3QgaXMgcnVuIG9uIGRpZmZlcmVudCBtYWNoaW5lc1xuICAgKiAoYW5kIHdpdGggZGlmZmVyZW50IGNvbnRleHQvZW52KSB0aGUgZGlmZiB3aWxsIG5vdCBjaGFuZ2UuXG4gICAqXG4gICAqIElmIGxvb2t1cHMgYXJlIGRpc2FibGVkICh3aGljaCBtZWFucyB0aGUgc3RhY2sgaXMgZW52IGFnbm9zdGljKSB0aGVuIGp1c3QgY29weVxuICAgKiB0aGUgYXNzZW1ibHkgdGhhdCB3YXMgb3V0cHV0IGJ5IHRoZSBkZXBsb3ltZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlU25hcHNob3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5hc3luY0luaXRpYWxpemUoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKSkge1xuICAgICAgZnMucmVtb3ZlU3luYyh0aGlzLmdvbGRlblNuYXBzaG90RGlyKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBJZiB3ZSdyZSBjbGV2ZXIsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHJldXNlIHRoZSBzbmFwc2hvdCB0aGF0IHdhc1xuICAgIC8vIGdlbmVyYXRlZCBkdXJpbmcgdGhlIHRlc3QgaW52YWxpZGF0aW9uIGNoZWNrIGFuZCBhdm9pZCB0aGUgYmVsb3cgc3ludGguXG4gICAgLy8gQnV0IHRoYXQgZ2V0cyBydW4gaW4gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBsaWZlY3ljbGUgYW5kIGl0IG1pZ2h0IG5vdFxuICAgIC8vIGV4aXN0LiBXZSdyZSBub3QgZGVhbGluZyB3aXRoIHRoYXQganVzdCB5ZXQuXG4gICAgYXdhaXQgdGhpcy5zeW50aEFjdHVhbFNuYXBzaG90KHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuXG4gICAgYXdhaXQgdGhpcy5jbGVhbnVwR29sZGVuU25hcHNob3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHNvbWUgY2xlYW51cCBzdGVwcyBhZnRlciB0aGUgc25hcHNob3QgaXMgY3JlYXRlZFxuICAgKiBBbnl0aW1lIHRoZSBzbmFwc2hvdCBuZWVkcyB0byBiZSBtb2RpZmllZCBhZnRlciBjcmVhdGlvblxuICAgKiB0aGUgbG9naWMgc2hvdWxkIGxpdmUgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cEdvbGRlblNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHRoaXMuZ29sZGVuU25hcHNob3REaXIpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbW92ZUFzc2V0c0Zyb21TbmFwc2hvdCgpO1xuICAgICAgdGhpcy5yZW1vdmVBc3NldHNDYWNoZUZyb21TbmFwc2hvdCgpO1xuICAgICAgY29uc3QgYXNzZW1ibHkgPSBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKHRoaXMuZ29sZGVuU25hcHNob3REaXIpO1xuICAgICAgYXNzZW1ibHkuY2xlYW5NYW5pZmVzdCgpO1xuICAgICAgYXNzZW1ibHkucmVjb3JkVHJhY2UodGhpcy5yZW5kZXJUcmFjZURhdGEoKSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBhIGxlZ2FjeSB0ZXN0IHRoZW4gY3JlYXRlIGFuIGludGVnIG1hbmlmZXN0XG4gICAgLy8gaW4gdGhlIHNuYXBzaG90IGRpcmVjdG9yeSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdGhlXG4gICAgLy8gdXBkYXRlIHdvcmtmbG93LiBTYXZlIGFueSBsZWdhY3lDb250ZXh0IGFzIHdlbGwgc28gdGhhdCBpdCBjYW4gYmUgcmVhZFxuICAgIC8vIHRoZSBuZXh0IHRpbWVcbiAgICBjb25zdCBhY3R1YWxUZXN0U3VpdGUgPSBhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpO1xuICAgIGlmIChhY3R1YWxUZXN0U3VpdGUudHlwZSA9PT0gJ2xlZ2FjeS10ZXN0LXN1aXRlJykge1xuICAgICAgKGFjdHVhbFRlc3RTdWl0ZSBhcyBMZWdhY3lJbnRlZ1Rlc3RTdWl0ZSkuc2F2ZU1hbmlmZXN0KHRoaXMuZ29sZGVuU25hcHNob3REaXIsIHRoaXMubGVnYWN5Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENvbnRleHQoYWRkaXRpb25hbENvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgLy8gTG9hZCB0aGUgdGVzdC1zcGVjaWZpYyBjb250ZXh0IChmcm9tIGBpbnRlZy5jb250ZXh0Lmpzb25gIG9yIGBjZGsuanNvbiNjb250ZXh0YCksIGlmIGFueS5cbiAgICAvLyBJZiBub3QgZm91bmQsIHVzZSB0aGUgYnVpbHQtaW4gY3VycmVudCBmZWF0dXJlIGZsYWdzIChhdCB0aGUgcmlzayBvZiBuZXdlciBmZWF0dXJlIGZsYWdzIGNoYW5naW5nXG4gICAgLy8gdGhlIHNuYXBzaG90cykuXG4gICAgY29uc3QgZmVhdHVyZUZsYWdzID0gdGhpcy5hc3luY01lbWJlcnMudGVzdFNwZWNpZmljQ29udGV4dCA/PyBjdXJyZW50bHlSZWNvbW1lbmRlZEF3c0Nka0xpYkZsYWdzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmVhdHVyZUZsYWdzLFxuICAgICAgLi4udGhpcy5sZWdhY3lDb250ZXh0LFxuICAgICAgLi4uYWRkaXRpb25hbENvbnRleHQsXG5cbiAgICAgIC8vIERvbid0IHJlY29yZCBjcmVhdGlvbiBzdGFjayB0cmFjZXMgaW4gdGhlIHNuYXBzaG90LCBzaW5jZSB0aGV5IGp1c3QgdGFrZSB1cCBzcGFjZSBhbmQgYXJlIG5ldmVyIGRldGVybWluaXN0aWMuXG4gICAgICAnYXdzOmNkazpkaXNhYmxlLWNyZWF0aW9uLXN0YWNrLXRyYWNlcyc6IHRydWUsXG5cbiAgICAgIC8vIFdlIG9yaWdpbmFsbHkgaGFkIFBMQU5ORUQgdG8gc2V0IHRoaXMgdG8gWydhd3MnLCAnYXdzLWNuJ10sIGJ1dCBkdWUgdG8gYSBwcm9ncmFtbWluZyBtaXN0YWtlXG4gICAgICAvLyBpdCB3YXMgc2V0IHRvIGV2ZXJ5dGhpbmcuIEluIHRoaXMgUFIsIHNldCBpdCB0byBldmVyeXRoaW5nIHRvIG5vdCBtZXNzIHVwIGFsbCB0aGUgc25hcHNob3RzLlxuICAgICAgJ0Bhd3MtY2RrL2NvcmU6dGFyZ2V0LXBhcnRpdGlvbnMnOiB1bmRlZmluZWQsXG5cbiAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gVEhFIEZVVFVSRSBMSVZFUyBCRUxPVy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIFJlc3RyaWN0aW5nIHRvIHRoZXNlIHRhcmdldCBwYXJ0aXRpb25zIG1ha2VzIG1vc3Qgc2VydmljZSBwcmluY2lwYWxzIHN5bnRoZXNpemUgdG9cbiAgICAgIC8vIGBzZXJ2aWNlLiR7VVJMX1NVRkZJWH1gLCB3aGljaCBpcyB0ZWNobmljYWxseSAqaW5jb3JyZWN0KiAoaXQncyBvbmx5IGBhbWF6b25hd3MuY29tYFxuICAgICAgLy8gb3IgYGFtYXpvbmF3cy5jb20uY25gLCBuZXZlciBVcmxTdWZmaXggZm9yIGFueSBvZiB0aGUgcmVzdHJpY3RlZCByZWdpb25zKSBidXQgaXQncyB3aGF0XG4gICAgICAvLyBtb3N0IGV4aXN0aW5nIGludGVnIHRlc3RzIGNvbnRhaW4sIGFuZCB3ZSB3YW50IHRvIGRpc3R1cmIgYXMgZmV3IGFzIHBvc3NpYmxlLlxuICAgICAgLy8gW1RBUkdFVF9QQVJUSVRJT05TXTogWydhd3MnLCAnYXdzLWNuJ10sXG4gICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIEVORCBPRiBUSEUgRlVUVVJFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgICB9O1xuICB9XG59XG5cbi8vIERlZmF1bHQgY29udGV4dCB3ZSBydW4gYWxsIGludGVnIHRlc3RzIHdpdGgsIHNvIHRoZXkgZG9uJ3QgZGVwZW5kIG9uIHRoZVxuLy8gYWNjb3VudCBvZiB0aGUgZXhlcmNpc2luZyB1c2VyLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1lOVEhfT1BUSU9OUyA9IHtcbiAgY29udGV4dDoge1xuICAgIFtBVkFJTEFCSUxJVFlfWk9ORV9GQUxMQkFDS19DT05URVhUX0tFWV06IFsndGVzdC1yZWdpb24tMWEnLCAndGVzdC1yZWdpb24tMWInLCAndGVzdC1yZWdpb24tMWMnXSxcbiAgICAnYXZhaWxhYmlsaXR5LXpvbmVzOmFjY291bnQ9MTIzNDU2Nzg6cmVnaW9uPXRlc3QtcmVnaW9uJzogWyd0ZXN0LXJlZ2lvbi0xYScsICd0ZXN0LXJlZ2lvbi0xYicsICd0ZXN0LXJlZ2lvbi0xYyddLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9hbWktYW1hem9uLWxpbnV4LWxhdGVzdC9hbXpuLWFtaS1odm0teDg2XzY0LWdwMjpyZWdpb249dGVzdC1yZWdpb24nOiAnYW1pLTEyMzQnLFxuICAgICdzc206YWNjb3VudD0xMjM0NTY3ODpwYXJhbWV0ZXJOYW1lPS9hd3Mvc2VydmljZS9hbWktYW1hem9uLWxpbnV4LWxhdGVzdC9hbXpuMi1hbWktaHZtLXg4Nl82NC1ncDI6cmVnaW9uPXRlc3QtcmVnaW9uJzogJ2FtaS0xMjM0JyxcbiAgICAnc3NtOmFjY291bnQ9MTIzNDU2Nzg6cGFyYW1ldGVyTmFtZT0vYXdzL3NlcnZpY2UvZWNzL29wdGltaXplZC1hbWkvYW1hem9uLWxpbnV4L3JlY29tbWVuZGVkOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICd7XCJpbWFnZV9pZFwiOiBcImFtaS0xMjM0XCJ9JyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgJ2FtaTphY2NvdW50PTEyMzQ1Njc4OmZpbHRlcnMuaW1hZ2UtdHlwZS4wPW1hY2hpbmU6ZmlsdGVycy5uYW1lLjA9YW16bi1hbWktdnBjLW5hdC0qOmZpbHRlcnMuc3RhdGUuMD1hdmFpbGFibGU6b3duZXJzLjA9YW1hem9uOnJlZ2lvbj10ZXN0LXJlZ2lvbic6ICdhbWktMTIzNCcsXG4gICAgJ3ZwYy1wcm92aWRlcjphY2NvdW50PTEyMzQ1Njc4OmZpbHRlci5pc0RlZmF1bHQ9dHJ1ZTpyZWdpb249dGVzdC1yZWdpb246cmV0dXJuQXN5bW1ldHJpY1N1Ym5ldHM9dHJ1ZSc6IHtcbiAgICAgIHZwY0lkOiAndnBjLTYwOTAwOTA1JyxcbiAgICAgIHN1Ym5ldEdyb3VwczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ1B1YmxpYycsXG4gICAgICAgICAgbmFtZTogJ1B1YmxpYycsXG4gICAgICAgICAgc3VibmV0czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzdWJuZXRJZDogJ3N1Ym5ldC1lMTk0NTVjYScsXG4gICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmU6ICd1cy1lYXN0LTFhJyxcbiAgICAgICAgICAgICAgcm91dGVUYWJsZUlkOiAncnRiLWUxOTQ1NWNhJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHN1Ym5ldElkOiAnc3VibmV0LWUwYzI0Nzk3JyxcbiAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogJ3VzLWVhc3QtMWInLFxuICAgICAgICAgICAgICByb3V0ZVRhYmxlSWQ6ICdydGItZTBjMjQ3OTcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc3VibmV0SWQ6ICdzdWJuZXQtY2NkNzczOTUnLFxuICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lOiAndXMtZWFzdC0xYycsXG4gICAgICAgICAgICAgIHJvdXRlVGFibGVJZDogJ3J0Yi1jY2Q3NzM5NScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIGVudjoge1xuICAgIENES19JTlRFR19BQ0NPVU5UOiAnMTIzNDU2NzgnLFxuICAgIENES19JTlRFR19SRUdJT046ICd0ZXN0LXJlZ2lvbicsXG4gICAgQ0RLX0lOVEVHX0hPU1RFRF9aT05FX0lEOiAnWjIzQUJDNFhZWkwwNUInLFxuICAgIENES19JTlRFR19IT1NURURfWk9ORV9OQU1FOiAnZXhhbXBsZS5jb20nLFxuICAgIENES19JTlRFR19ET01BSU5fTkFNRTogJyouZXhhbXBsZS5jb20nLFxuICAgIENES19JTlRFR19DRVJUX0FSTjogJ2Fybjphd3M6YWNtOnRlc3QtcmVnaW9uOjEyMzQ1Njc4OmNlcnRpZmljYXRlLzg2NDY4MjA5LWEyNzItNTk1ZC1iODMxLTBlZmI2NDIxMjY1eicsXG4gICAgQ0RLX0lOVEVHX1NVQk5FVF9JRDogJ3N1Ym5ldC0wZGZmMWEzOTlkOGY2ZjkyYycsXG4gIH0sXG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgY3VycmVudGx5IHJlY29tbWVuZGVkIGZsYWdzIGZvciBgYXdzLWNkay1saWJgLlxuICpcbiAqIFRoZXNlIGhhdmUgYmVlbiBidWlsdCBpbnRvIHRoZSBDTEkgYXQgYnVpbGQgdGltZS4gSWYgdGhpcyBldmVyIGdldHMgY2hhbmdlZFxuICogYmFjayB0byBhIGR5bmFtaWMgbG9hZCwgcmVtZW1iZXIgdGhhdCB0aGlzIHNvdXJjZSBmaWxlIG1heSBiZSBidW5kbGVkIGludG9cbiAqIGEgSmF2YVNjcmlwdCBidW5kbGUsIGFuZCBgX19kaXJuYW1lYCBtaWdodCBub3QgcG9pbnQgd2hlcmUgeW91IHRoaW5rIGl0IGRvZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdXJyZW50bHlSZWNvbW1lbmRlZEF3c0Nka0xpYkZsYWdzKCkge1xuICByZXR1cm4gcmVjb21tZW5kZWRGbGFnc0ZpbGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU25hcHNob3RBbmRUZXN0RGVmaW5pdGlvbiB7XG4gIHJlYWRvbmx5IHRlc3REZWZpbml0aW9uOiBJbnRlZ1Rlc3RTdWl0ZSB8IExlZ2FjeUludGVnVGVzdFN1aXRlO1xuICByZWFkb25seSBzbmFwc2hvdERpcmVjdG9yeTogc3RyaW5nO1xufVxuIl19