@dbx-tools/appkit-mastra 0.9.5 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -18
- package/index.ts +1 -3
- package/lib/index.d.ts +1 -3
- package/lib/index.js +2 -3
- package/lib/src/agents.d.ts +2 -2
- package/lib/src/agents.js +6 -6
- package/lib/src/chart.js +23 -23
- package/lib/src/evaluation.js +3 -3
- package/lib/src/genie.d.ts +2 -2
- package/lib/src/genie.js +20 -20
- package/lib/src/memory.js +9 -26
- package/lib/src/mlflow.js +4 -4
- package/lib/src/model.js +4 -4
- package/lib/src/monty-sandbox.js +6 -6
- package/lib/src/observability.js +3 -3
- package/lib/src/plugin.js +26 -21
- package/lib/src/remote-skills.js +20 -30
- package/lib/src/sandbox.js +10 -10
- package/lib/src/server.js +5 -5
- package/lib/src/serving-sanitize.js +12 -9
- package/lib/src/serving.js +8 -8
- package/lib/src/storage-schema.js +4 -4
- package/lib/src/summarize.js +3 -3
- package/lib/src/workspaces.js +9 -9
- package/lib/src/writer.js +3 -3
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -17
- package/src/agents.ts +8 -8
- package/src/chart.ts +24 -24
- package/src/evaluation.ts +2 -2
- package/src/genie.ts +20 -20
- package/src/memory.ts +11 -27
- package/src/mlflow.ts +3 -3
- package/src/model.ts +3 -3
- package/src/monty-sandbox.ts +5 -5
- package/src/observability.ts +2 -2
- package/src/plugin.ts +30 -20
- package/src/remote-skills.ts +36 -38
- package/src/sandbox.ts +9 -9
- package/src/server.ts +4 -4
- package/src/serving-sanitize.ts +11 -13
- package/src/serving.ts +7 -7
- package/src/storage-schema.ts +3 -3
- package/src/summarize.ts +2 -2
- package/src/workspaces.ts +8 -8
- package/src/writer.ts +2 -2
- package/lib/src/pagination.d.ts +0 -33
- package/lib/src/pagination.js +0 -36
- package/src/pagination.ts +0 -47
package/lib/src/sandbox.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* @module
|
|
10
10
|
*/
|
|
11
11
|
import { databricks } from "@dbx-tools/appkit";
|
|
12
|
-
import {
|
|
12
|
+
import { asyncUtils, errorUtils, log, stringUtils } from "@dbx-tools/shared-core";
|
|
13
13
|
import { z } from "zod";
|
|
14
14
|
import { MontySandbox } from "./monty-sandbox.js";
|
|
15
15
|
const SANDBOX_API_PATH = "/api/2.0/sandboxes";
|
|
@@ -55,7 +55,7 @@ export class DatabricksSandbox {
|
|
|
55
55
|
activeFallback;
|
|
56
56
|
startPromise;
|
|
57
57
|
constructor(options) {
|
|
58
|
-
const id =
|
|
58
|
+
const id = stringUtils.trimToNull(options.sandboxId.replace(/^sandboxes\//, ""));
|
|
59
59
|
if (!id)
|
|
60
60
|
throw new TypeError("Databricks sandbox id must not be blank");
|
|
61
61
|
this.id = id;
|
|
@@ -120,7 +120,7 @@ export class DatabricksSandbox {
|
|
|
120
120
|
logger.warn("Databricks Sandbox unavailable; using fallback", {
|
|
121
121
|
sandboxId: this.id,
|
|
122
122
|
fallback: fallback.provider,
|
|
123
|
-
error:
|
|
123
|
+
error: errorUtils.errorMessage(caught),
|
|
124
124
|
});
|
|
125
125
|
await fallback.start?.();
|
|
126
126
|
this.activeFallback = fallback;
|
|
@@ -129,7 +129,7 @@ export class DatabricksSandbox {
|
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
131
|
this.status = "error";
|
|
132
|
-
this.error =
|
|
132
|
+
this.error = errorUtils.errorMessage(caught);
|
|
133
133
|
throw caught;
|
|
134
134
|
}
|
|
135
135
|
}
|
|
@@ -160,7 +160,7 @@ export class DatabricksSandbox {
|
|
|
160
160
|
return;
|
|
161
161
|
}
|
|
162
162
|
this.status = "error";
|
|
163
|
-
this.error =
|
|
163
|
+
this.error = errorUtils.errorMessage(caught);
|
|
164
164
|
throw caught;
|
|
165
165
|
}
|
|
166
166
|
}
|
|
@@ -184,7 +184,7 @@ export class DatabricksSandbox {
|
|
|
184
184
|
return;
|
|
185
185
|
}
|
|
186
186
|
this.status = "error";
|
|
187
|
-
this.error =
|
|
187
|
+
this.error = errorUtils.errorMessage(caught);
|
|
188
188
|
throw caught;
|
|
189
189
|
}
|
|
190
190
|
}
|
|
@@ -347,7 +347,7 @@ export class DatabricksSandbox {
|
|
|
347
347
|
const sandbox = await this.get(signal);
|
|
348
348
|
if (sandbox.status?.state === expected)
|
|
349
349
|
return sandbox;
|
|
350
|
-
await
|
|
350
|
+
await asyncUtils.sleep(SANDBOX_POLL_INTERVAL_MS, signal);
|
|
351
351
|
}
|
|
352
352
|
throw new Error(`Databricks sandbox ${this.id} did not reach ${expected} within ${this.startupTimeoutMs}ms`);
|
|
353
353
|
}
|
|
@@ -384,7 +384,7 @@ function definedEnvironment(input) {
|
|
|
384
384
|
return Object.fromEntries(Object.entries(input ?? {}).filter((entry) => entry[1] !== undefined));
|
|
385
385
|
}
|
|
386
386
|
function isStatus(caught, status) {
|
|
387
|
-
return
|
|
387
|
+
return errorUtils.errorContext(caught).statusCode === status;
|
|
388
388
|
}
|
|
389
389
|
function remoteStatus(sandbox) {
|
|
390
390
|
switch (sandbox.status?.state) {
|
|
@@ -407,7 +407,7 @@ function resolveFallback(configured) {
|
|
|
407
407
|
return new MontySandbox(configured === "monty" ? {} : configured);
|
|
408
408
|
}
|
|
409
409
|
function isDatabricksSandboxUnavailable(caught) {
|
|
410
|
-
const context =
|
|
410
|
+
const context = errorUtils.errorContext(caught);
|
|
411
411
|
return (context.statusCode === 404 ||
|
|
412
412
|
context.hasMessage("feature", "disabled") ||
|
|
413
413
|
context.hasMessage("sandbox", "not", "enabled") ||
|
|
@@ -415,4 +415,4 @@ function isDatabricksSandboxUnavailable(caught) {
|
|
|
415
415
|
context.hasMessage("preview", "unavailable") ||
|
|
416
416
|
context.hasMessage("preview", "disabled"));
|
|
417
417
|
}
|
|
418
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zYW5kYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFTbkUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUE0QixNQUFNLG9CQUFvQixDQUFDO0FBRTVFLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUM7QUFDOUMsTUFBTSxxQkFBcUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUNoRSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQztBQUMzQyxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUNyQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzdCLENBQUMsQ0FBQztBQUVILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNsQyxXQUFXLEVBQUUsQ0FBQyxDQUFD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UyxFQUFFLFVBQVUsQ0FBQztRQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUM7UUFDL0MsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUMxQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBTYW5kYm94IGFkYXB0ZXIgZm9yIE1hc3RyYSB3b3Jrc3BhY2VzLlxuICpcbiAqIEltcGxlbWVudHMgTWFzdHJhJ3MgZm9yZWdyb3VuZCBjb21tYW5kIHN1cmZhY2Ugb3ZlciB0aGUgRGF0YWJyaWNrcyBTYW5kYm94XG4gKiBSRVNUIEFQSS4gU2FuZGJveGVzIGFyZSBjcmVhdGVkIGxhemlseSwgcmV0YWluIHRoZWlyIGhvbWUgZGlyZWN0b3J5IGFjcm9zc1xuICogaW5hY3Rpdml0eSBzdG9wcywgYW5kIGV4ZWN1dGUgdW50cnVzdGVkIHNoZWxsIGNvbW1hbmRzIG91dHNpZGUgdGhlIEFwcFxuICogY29udGFpbmVyLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGFzeW5jLCBlcnJvciwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmRSZXN1bHQsXG4gIEV4ZWN1dGVDb21tYW5kT3B0aW9ucyxcbiAgUHJvdmlkZXJTdGF0dXMsXG4gIFNhbmRib3hJbmZvLFxuICBXb3Jrc3BhY2VTYW5kYm94LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IE1vbnR5U2FuZGJveCwgdHlwZSBNb250eVNhbmRib3hPcHRpb25zIH0gZnJvbSBcIi4vbW9udHktc2FuZGJveC50c1wiO1xuXG5jb25zdCBTQU5EQk9YX0FQSV9QQVRIID0gXCIvYXBpLzIuMC9zYW5kYm94ZXNcIjtcbmNvbnN0IFNBTkRCT1hfRVhFQ19BUElfUEFUSCA9IFwiL2FwaS8yLjAvc2FuZGJveC1leGVjL3NhbmRib3hlc1wiO1xuY29uc3QgREVGQVVMVF9JTkFDVElWSVRZX1RJTUVPVVQgPSBcIjkwMHNcIjtcbmNvbnN0IERFRkFVTFRfU1RBUlRVUF9USU1FT1VUX01TID0gMTIwXzAwMDtcbmNvbnN0IERFRkFVTFRfQ09NTUFORF9USU1FT1VUX01TID0gMzBfMDAwO1xuY29uc3QgU0FOREJPWF9QT0xMX0lOVEVSVkFMX01TID0gNTAwO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9zYW5kYm94XCIpO1xuXG5jb25zdCBTYW5kYm94U3RhdGVTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHN0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgU2FuZGJveFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBkaXNwbGF5X25hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY3JlYXRlX3RpbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdXBkYXRlX3RpbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgc3RhdHVzOiBTYW5kYm94U3RhdGVTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBFeGVjdXRlUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGV4aXRfY29kZTogei5udW1iZXIoKS5pbnQoKS5vcHRpb25hbCgpLFxuICBzdGF0dXM6IHouc3RyaW5nKCksXG4gIHN0ZG91dDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBzdGRlcnI6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY29tbWFuZF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0cnVuY2F0ZWQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIE9wdGlvbnMgZm9yIG9uZSBEYXRhYnJpY2tzLWJhY2tlZCBNYXN0cmEgc2FuZGJveC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1NhbmRib3hPcHRpb25zIHtcbiAgLyoqIEFwcEtpdCB3b3Jrc3BhY2UgY2xpZW50IHVzZWQgZm9yIGV2ZXJ5IHNhbmRib3ggQVBJIGNhbGwuICovXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICAvKiogUmVzb3VyY2UgaWQsIHdpdGggb3Igd2l0aG91dCB0aGUgYHNhbmRib3hlcy9gIHByZWZpeC4gKi9cbiAgc2FuZGJveElkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBEYXRhYnJpY2tzIGxhYmVsLiAqL1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgLyoqIFNlcnZlci1zaWRlIGlkbGUgdGltZW91dCBpbiBwcm90b2J1ZiBkdXJhdGlvbiBmb3JtLiBEZWZhdWx0cyB0byBgOTAwc2AuICovXG4gIGluYWN0aXZpdHlUaW1lb3V0Pzogc3RyaW5nO1xuICAvKiogTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBzYW5kYm94IHRvIGJlY29tZSBydW5uYWJsZS4gKi9cbiAgc3RhcnR1cFRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgY29tbWFuZCB0aW1lb3V0LiBQZXItY2FsbCBgb3B0aW9ucy50aW1lb3V0YCB3aW5zLiAqL1xuICBjb21tYW5kVGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUHJvdmlkZXIgdXNlZCBvbmx5IHdoZW4gRGF0YWJyaWNrcyBTYW5kYm94IGlzIGRlZmluaXRpdmVseSB1bmF2YWlsYWJsZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIE5vZGUgUHlkYW50aWMgTW9udHkgcnVudGltZTsgYGZhbHNlYCBmYWlscyBpbnN0ZWFkLlxuICAgKi9cbiAgZmFsbGJhY2s/OiBmYWxzZSB8IFwibW9udHlcIiB8IE1vbnR5U2FuZGJveE9wdGlvbnMgfCBXb3Jrc3BhY2VTYW5kYm94O1xufVxuXG4vKiogRGF0YWJyaWNrcyBvcHRpb25zIGFjY2VwdGVkIGJ5IHRoZSBoaWdoZXItbGV2ZWwgd29ya3NwYWNlIGZhY3RvcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyBleHRlbmRzIE9taXQ8XG4gIERhdGFicmlja3NTYW5kYm94T3B0aW9ucyxcbiAgXCJjbGllbnRcIiB8IFwic2FuZGJveElkXCJcbj4ge1xuICAvKiogUHJvdmlkZXIgZGlzY3JpbWluYXRvci4gRGVmYXVsdHMgdG8gYGRhdGFicmlja3NgLiAqL1xuICBwcm92aWRlcj86IFwiZGF0YWJyaWNrc1wiO1xuICAvKipcbiAgICogQ3JlZGVudGlhbCBzb3VyY2UuIERlZmF1bHRzIHRvIGEgZnJlc2ggQXBwS2l0IGNsaWVudCB1c2luZyB0aGUgbm9ybWFsXG4gICAqIGVudmlyb25tZW50L3Byb2ZpbGUgY2hhaW4sIHdoaWNoIGlzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwgaW4gYVxuICAgKiBEYXRhYnJpY2tzIEFwcC5cbiAgICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudCB8ICgoY29udGV4dDogeyByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfSkgPT4gV29ya3NwYWNlQ2xpZW50KTtcbiAgLyoqXG4gICAqIEZpeGVkIGlkIG9yIHBlci1yZXF1ZXN0IHJlc29sdmVyLiBPbWl0IHRvIGRlcml2ZSBhIHN0YWJsZSwgb3BhcXVlIGlkIGZyb21cbiAgICogdGhlIHdvcmtzcGFjZSBhbmQgYXR0cmlidXRlZCB1c2VyLlxuICAgKi9cbiAgc2FuZGJveElkPzogc3RyaW5nIHwgKChjb250ZXh0OiB7IHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCB9KSA9PiBzdHJpbmcpO1xufVxuXG4vKiogTWFzdHJhIHNhbmRib3ggYmFja2VkIGJ5IERhdGFicmlja3Mgc2VydmVybGVzcyBTYW5kYm94IGNvbXB1dGUuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc1NhbmRib3ggaW1wbGVtZW50cyBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBzdGF0dXM6IFByb3ZpZGVyU3RhdHVzID0gXCJwZW5kaW5nXCI7XG4gIGVycm9yPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBpbmFjdGl2aXR5VGltZW91dDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0dXBUaW1lb3V0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFsbGJhY2tDb25maWc6IEV4Y2x1ZGU8RGF0YWJyaWNrc1NhbmRib3hPcHRpb25zW1wiZmFsbGJhY2tcIl0sIHVuZGVmaW5lZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgcHJpdmF0ZSByZW1vdGVDcmVhdGVkQXQ/OiBEYXRlO1xuICBwcml2YXRlIGxhc3RVc2VkQXQ/OiBEYXRlO1xuICBwcml2YXRlIGFjdGl2ZUZhbGxiYWNrPzogV29ya3NwYWNlU2FuZGJveDtcbiAgcHJpdmF0ZSBzdGFydFByb21pc2U/OiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGFicmlja3NTYW5kYm94T3B0aW9ucykge1xuICAgIGNvbnN0IGlkID0gc3RyaW5nLnRyaW1Ub051bGwob3B0aW9ucy5zYW5kYm94SWQucmVwbGFjZSgvXnNhbmRib3hlc1xcLy8sIFwiXCIpKTtcbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRGF0YWJyaWNrcyBzYW5kYm94IGlkIG11c3Qgbm90IGJlIGJsYW5rXCIpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLm5hbWUgPSBvcHRpb25zLmRpc3BsYXlOYW1lPy50cmltKCkgfHwgYE1hc3RyYSBzYW5kYm94ICR7aWR9YDtcbiAgICB0aGlzLmNsaWVudCA9IG9wdGlvbnMuY2xpZW50O1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSB0aGlzLm5hbWU7XG4gICAgdGhpcy5pbmFjdGl2aXR5VGltZW91dCA9IG9wdGlvbnMuaW5hY3Rpdml0eVRpbWVvdXQgPz8gREVGQVVMVF9JTkFDVElWSVRZX1RJTUVPVVQ7XG4gICAgdGhpcy5zdGFydHVwVGltZW91dE1zID0gb3B0aW9ucy5zdGFydHVwVGltZW91dE1zID8/IERFRkFVTFRfU1RBUlRVUF9USU1FT1VUX01TO1xuICAgIHRoaXMuY29tbWFuZFRpbWVvdXRNcyA9IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRNcyA/PyBERUZBVUxUX0NPTU1BTkRfVElNRU9VVF9NUztcbiAgICB0aGlzLmZhbGxiYWNrQ29uZmlnID0gb3B0aW9ucy5mYWxsYmFjayA/PyBcIm1vbnR5XCI7XG4gIH1cblxuICBnZXQgcHJvdmlkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGYWxsYmFjaz8ucHJvdmlkZXIgPz8gXCJkYXRhYnJpY2tzXCI7XG4gIH1cblxuICAvKiogRW5zdXJlIHRoZSByZW1vdGUgc2FuZGJveCBleGlzdHMgYW5kIGhhcyByZWFjaGVkIGl0cyBydW5uaW5nIHN0YXRlLiAqL1xuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0V2l0aFNpZ25hbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFdpdGhTaWduYWwoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFwicnVubmluZ1wiKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc3RhcnRQcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0UHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVyZm9ybVN0YXJ0KHNpZ25hbCk7XG4gICAgdGhpcy5zdGFydFByb21pc2UgPSBwZW5kaW5nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwZW5kaW5nO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5zdGFydFByb21pc2UgPT09IHBlbmRpbmcpIHRoaXMuc3RhcnRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybVN0YXJ0KHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuYWN0aXZlRmFsbGJhY2spIHtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aXZlRmFsbGJhY2suc3RhcnQ/LigpO1xuICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLmFjdGl2ZUZhbGxiYWNrLnN0YXR1cztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdGF0dXMgPSBcInN0YXJ0aW5nXCI7XG4gICAgdGhpcy5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgbGV0IHNhbmRib3ggPSBhd2FpdCB0aGlzLmdldE9yQ3JlYXRlKHNpZ25hbCk7XG4gICAgICBpZiAoc2FuZGJveC5zdGF0dXM/LnN0YXRlID09PSBcIlNBTkRCT1hfU1RBVEVfU1RPUFBFRFwiKSB7XG4gICAgICAgIHNhbmRib3ggPSBhd2FpdCB0aGlzLm11dGF0ZShcInN0YXJ0XCIsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuZGJveC5zdGF0dXM/LnN0YXRlID09PSBcIlNBTkRCT1hfU1RBVEVfU1RPUFBJTkdcIikge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGF0ZShcIlNBTkRCT1hfU1RBVEVfU1RPUFBFRFwiLCBzaWduYWwpO1xuICAgICAgICBzYW5kYm94ID0gYXdhaXQgdGhpcy5tdXRhdGUoXCJzdGFydFwiLCBzaWduYWwpO1xuICAgICAgfVxuICAgICAgaWYgKHNhbmRib3guc3RhdHVzPy5zdGF0ZSAhPT0gXCJTQU5EQk9YX1NUQVRFX1JVTk5JTkdcIikge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGF0ZShcIlNBTkRCT1hfU1RBVEVfUlVOTklOR1wiLCBzaWduYWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMgPSBcInJ1bm5pbmdcIjtcbiAgICAgIHRoaXMubGFzdFVzZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAodGhpcy5mYWxsYmFja0NvbmZpZyAhPT0gZmFsc2UgJiYgaXNEYXRhYnJpY2tzU2FuZGJveFVuYXZhaWxhYmxlKGNhdWdodCkpIHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2sgPSByZXNvbHZlRmFsbGJhY2sodGhpcy5mYWxsYmFja0NvbmZpZyk7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiRGF0YWJyaWNrcyBTYW5kYm94IHVuYXZhaWxhYmxlOyB1c2luZyBmYWxsYmFja1wiLCB7XG4gICAgICAgICAgc2FuZGJveElkOiB0aGlzLmlkLFxuICAgICAgICAgIGZhbGxiYWNrOiBmYWxsYmFjay5wcm92aWRlcixcbiAgICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGNhdWdodCksXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBmYWxsYmFjay5zdGFydD8uKCk7XG4gICAgICAgIHRoaXMuYWN0aXZlRmFsbGJhY2sgPSBmYWxsYmFjaztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBmYWxsYmFjay5zdGF0dXM7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBmYWxsYmFjay5lcnJvcjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICB0aGlzLmVycm9yID0gZXJyb3IuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICB0aHJvdyBjYXVnaHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIERhdGFicmlja3MgaG9tZSBwZXJzaXN0ZW5jZSBpcyBub3QgYSBjbG9uZWFibGUgTWFzdHJhIGNoZWNrcG9pbnQuICovXG4gIGFzeW5jIHNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlRmFsbGJhY2s/LnNuYXBzaG90KCk7XG4gIH1cblxuICBnZXQgc3VwcG9ydHNDaGVja3BvaW50cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGYWxsYmFjaz8uc3VwcG9ydHNDaGVja3BvaW50cyA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKiBTdG9wIGNvbXB1dGUgd2hpbGUgcHJlc2VydmluZyB0aGUgc2FuZGJveCBob21lIGRpcmVjdG9yeS4gKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5hY3RpdmVGYWxsYmFjaykge1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmVGYWxsYmFjay5zdG9wPy4oKTtcbiAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5hY3RpdmVGYWxsYmFjay5zdGF0dXM7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJzdG9wcGVkXCIgfHwgdGhpcy5zdGF0dXMgPT09IFwiZGVzdHJveWVkXCIpIHJldHVybjtcbiAgICB0aGlzLnN0YXR1cyA9IFwic3RvcHBpbmdcIjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tdXRhdGUoXCJzdG9wXCIpO1xuICAgICAgdGhpcy5zdGF0dXMgPSBcInN0b3BwZWRcIjtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIGlmIChpc1N0YXR1cyhjYXVnaHQsIDQwNCkpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBcInN0b3BwZWRcIjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICB0aGlzLmVycm9yID0gZXJyb3IuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICB0aHJvdyBjYXVnaHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBlcm1hbmVudGx5IGRlbGV0ZSB0aGUgc2FuZGJveCBhbmQgaXRzIHBlcnNpc3RlZCBob21lIGRpcmVjdG9yeS4gKi9cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5hY3RpdmVGYWxsYmFjaykge1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmVGYWxsYmFjay5kZXN0cm95Py4oKTtcbiAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5hY3RpdmVGYWxsYmFjay5zdGF0dXM7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJkZXN0cm95ZWRcIikgcmV0dXJuO1xuICAgIHRoaXMuc3RhdHVzID0gXCJkZXN0cm95aW5nXCI7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVxdWVzdChgJHt0aGlzLnJlc291cmNlUGF0aH1gLCBcIkRFTEVURVwiLCB6Lm9iamVjdCh7fSkucGFzc3Rocm91Z2goKSk7XG4gICAgICB0aGlzLnN0YXR1cyA9IFwiZGVzdHJveWVkXCI7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoaXNTdGF0dXMoY2F1Z2h0LCA0MDQpKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gXCJkZXN0cm95ZWRcIjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICB0aGlzLmVycm9yID0gZXJyb3IuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICB0aHJvdyBjYXVnaHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIEV4ZWN1dGUgb25lIGZvcmVncm91bmQgc2hlbGwgY29tbWFuZCBpbiB0aGUgcmVtb3RlIHNhbmRib3guICovXG4gIGFzeW5jIGV4ZWN1dGVDb21tYW5kKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSA9IFtdLFxuICAgIG9wdGlvbnM6IEV4ZWN1dGVDb21tYW5kT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPENvbW1hbmRSZXN1bHQ+IHtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0V2l0aFNpZ25hbChvcHRpb25zLmFib3J0U2lnbmFsKTtcbiAgICBpZiAodGhpcy5hY3RpdmVGYWxsYmFjaykge1xuICAgICAgaWYgKCF0aGlzLmFjdGl2ZUZhbGxiYWNrLmV4ZWN1dGVDb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICBhcmdzLFxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGV4aXRDb2RlOiAxLFxuICAgICAgICAgIHN0ZG91dDogXCJcIixcbiAgICAgICAgICBzdGRlcnI6IGBGYWxsYmFjayBzYW5kYm94ICR7dGhpcy5hY3RpdmVGYWxsYmFjay5wcm92aWRlcn0gZG9lcyBub3Qgc3VwcG9ydCBjb21tYW5kIGV4ZWN1dGlvbi5gLFxuICAgICAgICAgIGV4ZWN1dGlvblRpbWVNczogMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUZhbGxiYWNrLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID8/IHRoaXMuY29tbWFuZFRpbWVvdXRNcztcbiAgICBjb25zdCBzY3JpcHQgPSBjb21tYW5kU2NyaXB0KGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMuY3dkKTtcbiAgICBjb25zdCBzdGFydGVkID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3QoXG4gICAgICBgJHtTQU5EQk9YX0VYRUNfQVBJX1BBVEh9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuaWQpfS9leGVjLXN5bmNgLFxuICAgICAgXCJQT1NUXCIsXG4gICAgICBFeGVjdXRlUmVzcG9uc2VTY2hlbWEsXG4gICAgICB7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBjbWQ6IFwiL2Jpbi9iYXNoXCIsXG4gICAgICAgICAgYXJnczogW1wiLWxjXCIsIHNjcmlwdF0sXG4gICAgICAgICAgZW52czogZGVmaW5lZEVudmlyb25tZW50KG9wdGlvbnMuZW52KSxcbiAgICAgICAgICBleGVjdXRpb25fdGltZW91dDogYCR7TWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRpbWVvdXQgLyAxXzAwMCkpfXNgLFxuICAgICAgICB9LFxuICAgICAgICBzaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICB9LFxuICAgICk7XG4gICAgY29uc3Qgc3Rkb3V0ID0gcmVzcG9uc2Uuc3Rkb3V0ID8/IFwiXCI7XG4gICAgY29uc3Qgc3RkZXJyID0gcmVzcG9uc2Uuc3RkZXJyID8/IFwiXCI7XG4gICAgb3B0aW9ucy5vblN0ZG91dD8uKHN0ZG91dCk7XG4gICAgb3B0aW9ucy5vblN0ZGVycj8uKHN0ZGVycik7XG4gICAgdGhpcy5sYXN0VXNlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB0aW1lZE91dCA9IHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJFWEVDVVRFX0NPTU1BTkRfU1RBVFVTX1RJTUVEX09VVFwiO1xuICAgIGNvbnN0IGV4aXRDb2RlID0gcmVzcG9uc2UuZXhpdF9jb2RlID8/IC0xO1xuICAgIHJldHVybiB7XG4gICAgICBjb21tYW5kLFxuICAgICAgYXJncyxcbiAgICAgIHN1Y2Nlc3M6IHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJFWEVDVVRFX0NPTU1BTkRfU1RBVFVTX0NPTVBMRVRFRFwiICYmIGV4aXRDb2RlID09PSAwLFxuICAgICAgZXhpdENvZGUsXG4gICAgICBzdGRvdXQsXG4gICAgICBzdGRlcnIsXG4gICAgICBleGVjdXRpb25UaW1lTXM6IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZCxcbiAgICAgIC4uLih0aW1lZE91dCA/IHsgdGltZWRPdXQ6IHRydWUsIGtpbGxlZDogdHJ1ZSB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlLnRydW5jYXRlZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0ZG91dFRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIHN0ZGVyclRydW5jYXRlZDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogV2hldGhlciB0aGUgYWRhcHRlciBjdXJyZW50bHkga25vd3MgdGhlIHJlbW90ZSBzYW5kYm94IHRvIGJlIHJ1bm5pbmcuICovXG4gIGFzeW5jIGlzUmVhZHkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuYWN0aXZlRmFsbGJhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUZhbGxiYWNrLmlzUmVhZHk/LigpID8/IHRoaXMuYWN0aXZlRmFsbGJhY2suc3RhdHVzID09PSBcInJ1bm5pbmdcIjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSBcInJ1bm5pbmdcIikgcmV0dXJuIHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCB0aGlzLmdldCgpO1xuICAgICAgdGhpcy5zdGF0dXMgPVxuICAgICAgICBzYW5kYm94LnN0YXR1cz8uc3RhdGUgPT09IFwiU0FOREJPWF9TVEFURV9SVU5OSU5HXCIgPyBcInJ1bm5pbmdcIiA6IHJlbW90ZVN0YXR1cyhzYW5kYm94KTtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCI7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoaXNTdGF0dXMoY2F1Z2h0LCA0MDQpKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aHJvdyBjYXVnaHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlcG9ydCBNYXN0cmEtZmFjaW5nIHNhbmRib3ggbWV0YWRhdGEuICovXG4gIGFzeW5jIGdldEluZm8oKTogUHJvbWlzZTxTYW5kYm94SW5mbz4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZUZhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoYXdhaXQgdGhpcy5hY3RpdmVGYWxsYmFjay5nZXRJbmZvPy4oKSkgPz8ge1xuICAgICAgICAgIGlkOiB0aGlzLmFjdGl2ZUZhbGxiYWNrLmlkLFxuICAgICAgICAgIG5hbWU6IHRoaXMuYWN0aXZlRmFsbGJhY2submFtZSxcbiAgICAgICAgICBwcm92aWRlcjogdGhpcy5hY3RpdmVGYWxsYmFjay5wcm92aWRlcixcbiAgICAgICAgICBzdGF0dXM6IHRoaXMuYWN0aXZlRmFsbGJhY2suc3RhdHVzLFxuICAgICAgICAgIGNyZWF0ZWRBdDogdGhpcy5jcmVhdGVkQXQsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCB0aGlzLmdldCgpO1xuICAgIHRoaXMuc3RhdHVzID0gcmVtb3RlU3RhdHVzKHNhbmRib3gpO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIG5hbWU6IHNhbmRib3guZGlzcGxheV9uYW1lID8/IHRoaXMubmFtZSxcbiAgICAgIHByb3ZpZGVyOiB0aGlzLnByb3ZpZGVyLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIGNyZWF0ZWRBdDogdGhpcy5yZW1vdGVDcmVhdGVkQXQgPz8gdGhpcy5jcmVhdGVkQXQsXG4gICAgICAuLi4odGhpcy5sYXN0VXNlZEF0ID8geyBsYXN0VXNlZEF0OiB0aGlzLmxhc3RVc2VkQXQgfSA6IHt9KSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHJlc291cmNlTmFtZTogc2FuZGJveC5uYW1lLFxuICAgICAgICByZW1vdGVTdGF0ZTogc2FuZGJveC5zdGF0dXM/LnN0YXRlLFxuICAgICAgICB1cGRhdGVUaW1lOiBzYW5kYm94LnVwZGF0ZV90aW1lLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEV4cGxhaW4gdGhlIERhdGFicmlja3MgZXhlY3V0aW9uIGJvdW5kYXJ5IHRvIHRoZSBhZ2VudC4gKi9cbiAgZ2V0SW5zdHJ1Y3Rpb25zKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiQ29tbWFuZHMgcnVuIGluIGEgcGVyc2lzdGVudCBEYXRhYnJpY2tzIHNlcnZlcmxlc3Mgc2FuZGJveCwgbm90IGluIHRoZSBBcHAgY29udGFpbmVyLlwiLFxuICAgICAgXCJVc2Ugc2hlbGwgY29tbWFuZHMgbm9ybWFsbHkuIFRoZSBzYW5kYm94IGhvbWUgZGlyZWN0b3J5IHN1cnZpdmVzIGluYWN0aXZpdHkgc3RvcHMuXCIsXG4gICAgICBcIklmIERhdGFicmlja3MgU2FuZGJveCBpcyB1bmF2YWlsYWJsZSwgY29tbWFuZHMgZmFsbCBiYWNrIHRvIFB5ZGFudGljIE1vbnR5IGFuZCBtdXN0IGJlIFB5dGhvbiBzb3VyY2UuXCIsXG4gICAgICBcIkRhdGFicmlja3MgV29ya3NwYWNlIGZpbGVzeXN0ZW0gbW91bnRzIHJlbWFpbiBzZXBhcmF0ZSB1bmxlc3MgYSBjb21tYW5kIGNvcGllcyBkYXRhIGV4cGxpY2l0bHkuXCIsXG4gICAgXS5qb2luKFwiIFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHJlc291cmNlUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtTQU5EQk9YX0FQSV9QQVRIfS8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmlkKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPckNyZWF0ZShzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXQoc2lnbmFsKTtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIGlmICghaXNTdGF0dXMoY2F1Z2h0LCA0MDQpKSB0aHJvdyBjYXVnaHQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KFNBTkRCT1hfQVBJX1BBVEgsIFwiUE9TVFwiLCBTYW5kYm94UmVzcG9uc2VTY2hlbWEsIHtcbiAgICAgICAgcXVlcnk6IHsgc2FuZGJveF9pZDogdGhpcy5pZCB9LFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgZGlzcGxheV9uYW1lOiB0aGlzLmRpc3BsYXlOYW1lLFxuICAgICAgICAgIHNwZWM6IHtcbiAgICAgICAgICAgIGNvbXB1dGU6IHtcbiAgICAgICAgICAgICAgaW5hY3Rpdml0eV90aW1lb3V0OiB0aGlzLmluYWN0aXZpdHlUaW1lb3V0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzaWduYWwsXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVtZW1iZXJDcmVhdGVkQXQoc2FuZGJveC5jcmVhdGVfdGltZSk7XG4gICAgICByZXR1cm4gc2FuZGJveDtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIGlmICghaXNTdGF0dXMoY2F1Z2h0LCA0MDkpKSB0aHJvdyBjYXVnaHQ7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoc2lnbmFsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldChzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCB0aGlzLnJlcXVlc3QodGhpcy5yZXNvdXJjZVBhdGgsIFwiR0VUXCIsIFNhbmRib3hSZXNwb25zZVNjaGVtYSwge1xuICAgICAgc2lnbmFsLFxuICAgIH0pO1xuICAgIHRoaXMucmVtZW1iZXJDcmVhdGVkQXQoc2FuZGJveC5jcmVhdGVfdGltZSk7XG4gICAgcmV0dXJuIHNhbmRib3g7XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZShvcGVyYXRpb246IFwic3RhcnRcIiB8IFwic3RvcFwiLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoYCR7dGhpcy5yZXNvdXJjZVBhdGh9LyR7b3BlcmF0aW9ufWAsIFwiUE9TVFwiLCBTYW5kYm94UmVzcG9uc2VTY2hlbWEsIHtcbiAgICAgIHNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclN0YXRlKGV4cGVjdGVkOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy5zdGFydHVwVGltZW91dE1zO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBhd2FpdCB0aGlzLmdldChzaWduYWwpO1xuICAgICAgaWYgKHNhbmRib3guc3RhdHVzPy5zdGF0ZSA9PT0gZXhwZWN0ZWQpIHJldHVybiBzYW5kYm94O1xuICAgICAgYXdhaXQgYXN5bmMuc2xlZXAoU0FOREJPWF9QT0xMX0lOVEVSVkFMX01TLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGF0YWJyaWNrcyBzYW5kYm94ICR7dGhpcy5pZH0gZGlkIG5vdCByZWFjaCAke2V4cGVjdGVkfSB3aXRoaW4gJHt0aGlzLnN0YXJ0dXBUaW1lb3V0TXN9bXNgLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbWVtYmVyQ3JlYXRlZEF0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodmFsdWUpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB0aGlzLnJlbW90ZUNyZWF0ZWRBdCA9IHBhcnNlZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxUPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbWV0aG9kOiBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIkRFTEVURVwiLFxuICAgIHNjaGVtYTogei5ab2RUeXBlPFQ+LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHBheWxvYWQ/OiB1bmtub3duO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgfSA9IHt9LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBwYXRoLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5LFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi4ob3B0aW9ucy5wYXlsb2FkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSksXG4gICAgICAgIH0pLFxuICAgICAgICByYXc6IGZhbHNlLFxuICAgICAgICAuLi4ob3B0aW9ucy5wYXlsb2FkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgcGF5bG9hZDogb3B0aW9ucy5wYXlsb2FkIH0pLFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnMuc2lnbmFsID8gZGF0YWJyaWNrcy50b0NvbnRleHQob3B0aW9ucy5zaWduYWwpIDogdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHNjaGVtYS5wYXJzZShyZXNwb25zZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWFuZFNjcmlwdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IGludm9jYXRpb24gPSBhcmdzLmxlbmd0aCA/IFtjb21tYW5kLCAuLi5hcmdzXS5tYXAoc2hlbGxRdW90ZSkuam9pbihcIiBcIikgOiBjb21tYW5kO1xuICByZXR1cm4gY3dkID8gYGNkIC0tICR7c2hlbGxRdW90ZShjd2QpfSAmJiAke2ludm9jYXRpb259YCA6IGludm9jYXRpb247XG59XG5cbmZ1bmN0aW9uIHNoZWxsUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgXCInXFxcXCcnXCIpfSdgO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVkRW52aXJvbm1lbnQoaW5wdXQ6IE5vZGVKUy5Qcm9jZXNzRW52IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoaW5wdXQgPz8ge30pLmZpbHRlcihcbiAgICAgIChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4gZW50cnlbMV0gIT09IHVuZGVmaW5lZCxcbiAgICApLFxuICApO1xufVxuXG5mdW5jdGlvbiBpc1N0YXR1cyhjYXVnaHQ6IHVua25vd24sIHN0YXR1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvci5lcnJvckNvbnRleHQoY2F1Z2h0KS5zdGF0dXNDb2RlID09PSBzdGF0dXM7XG59XG5cbmZ1bmN0aW9uIHJlbW90ZVN0YXR1cyhzYW5kYm94OiB6LmluZmVyPHR5cGVvZiBTYW5kYm94UmVzcG9uc2VTY2hlbWE+KTogUHJvdmlkZXJTdGF0dXMge1xuICBzd2l0Y2ggKHNhbmRib3guc3RhdHVzPy5zdGF0ZSkge1xuICAgIGNhc2UgXCJTQU5EQk9YX1NUQVRFX1JVTk5JTkdcIjpcbiAgICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgICBjYXNlIFwiU0FOREJPWF9TVEFURV9TVE9QUEVEXCI6XG4gICAgICByZXR1cm4gXCJzdG9wcGVkXCI7XG4gICAgY2FzZSBcIlNBTkRCT1hfU1RBVEVfU1RPUFBJTkdcIjpcbiAgICAgIHJldHVybiBcInN0b3BwaW5nXCI7XG4gICAgY2FzZSBcIlNBTkRCT1hfU1RBVEVfUEVORElOR1wiOlxuICAgICAgcmV0dXJuIFwic3RhcnRpbmdcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwicGVuZGluZ1wiO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGYWxsYmFjayhcbiAgY29uZmlndXJlZDogRXhjbHVkZTxEYXRhYnJpY2tzU2FuZGJveE9wdGlvbnNbXCJmYWxsYmFja1wiXSwgZmFsc2UgfCB1bmRlZmluZWQ+LFxuKTogV29ya3NwYWNlU2FuZGJveCB7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJvYmplY3RcIiAmJiBcInByb3ZpZGVyXCIgaW4gY29uZmlndXJlZCAmJiBcInN0YXR1c1wiIGluIGNvbmZpZ3VyZWQpIHtcbiAgICByZXR1cm4gY29uZmlndXJlZDtcbiAgfVxuICByZXR1cm4gbmV3IE1vbnR5U2FuZGJveChjb25maWd1cmVkID09PSBcIm1vbnR5XCIgPyB7fSA6IGNvbmZpZ3VyZWQpO1xufVxuXG5mdW5jdGlvbiBpc0RhdGFicmlja3NTYW5kYm94VW5hdmFpbGFibGUoY2F1Z2h0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRleHQgPSBlcnJvci5lcnJvckNvbnRleHQoY2F1Z2h0KTtcbiAgcmV0dXJuIChcbiAgICBjb250ZXh0LnN0YXR1c0NvZGUgPT09IDQwNCB8fFxuICAgIGNvbnRleHQuaGFzTWVzc2FnZShcImZlYXR1cmVcIiwgXCJkaXNhYmxlZFwiKSB8fFxuICAgIGNvbnRleHQuaGFzTWVzc2FnZShcInNhbmRib3hcIiwgXCJub3RcIiwgXCJlbmFibGVkXCIpIHx8XG4gICAgY29udGV4dC5oYXNNZXNzYWdlKFwicHJldmlld1wiLCBcIm5vdFwiLCBcImVuYWJsZWRcIikgfHxcbiAgICBjb250ZXh0Lmhhc01lc3NhZ2UoXCJwcmV2aWV3XCIsIFwidW5hdmFpbGFibGVcIikgfHxcbiAgICBjb250ZXh0Lmhhc01lc3NhZ2UoXCJwcmV2aWV3XCIsIFwiZGlzYWJsZWRcIilcbiAgKTtcbn1cbiJdfQ==
|
|
418
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FuZGJveC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zYW5kYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFTbEYsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUE0QixNQUFNLG9CQUFvQixDQUFDO0FBRTVFLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUM7QUFDOUMsTUFBTSxxQkFBcUIsR0FBRyxpQ0FBaUMsQ0FBQztBQUNoRSxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLDBCQUEwQixHQUFHLE9BQU8sQ0FBQztBQUMzQyxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQztBQUMxQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUNyQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFNUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ2xDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQzdCLENBQUMsQ0FBQztBQUVILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNsQyxXQUFXLEVBQUUsQ0FBQyxDQUFD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UyxFQUFFLFVBQVUsQ0FBQztRQUN6QyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUM7UUFDL0MsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUMxQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBTYW5kYm94IGFkYXB0ZXIgZm9yIE1hc3RyYSB3b3Jrc3BhY2VzLlxuICpcbiAqIEltcGxlbWVudHMgTWFzdHJhJ3MgZm9yZWdyb3VuZCBjb21tYW5kIHN1cmZhY2Ugb3ZlciB0aGUgRGF0YWJyaWNrcyBTYW5kYm94XG4gKiBSRVNUIEFQSS4gU2FuZGJveGVzIGFyZSBjcmVhdGVkIGxhemlseSwgcmV0YWluIHRoZWlyIGhvbWUgZGlyZWN0b3J5IGFjcm9zc1xuICogaW5hY3Rpdml0eSBzdG9wcywgYW5kIGV4ZWN1dGUgdW50cnVzdGVkIHNoZWxsIGNvbW1hbmRzIG91dHNpZGUgdGhlIEFwcFxuICogY29udGFpbmVyLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGFzeW5jVXRpbHMsIGVycm9yVXRpbHMsIGxvZywgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1hbmRSZXN1bHQsXG4gIEV4ZWN1dGVDb21tYW5kT3B0aW9ucyxcbiAgUHJvdmlkZXJTdGF0dXMsXG4gIFNhbmRib3hJbmZvLFxuICBXb3Jrc3BhY2VTYW5kYm94LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IE1vbnR5U2FuZGJveCwgdHlwZSBNb250eVNhbmRib3hPcHRpb25zIH0gZnJvbSBcIi4vbW9udHktc2FuZGJveC50c1wiO1xuXG5jb25zdCBTQU5EQk9YX0FQSV9QQVRIID0gXCIvYXBpLzIuMC9zYW5kYm94ZXNcIjtcbmNvbnN0IFNBTkRCT1hfRVhFQ19BUElfUEFUSCA9IFwiL2FwaS8yLjAvc2FuZGJveC1leGVjL3NhbmRib3hlc1wiO1xuY29uc3QgREVGQVVMVF9JTkFDVElWSVRZX1RJTUVPVVQgPSBcIjkwMHNcIjtcbmNvbnN0IERFRkFVTFRfU1RBUlRVUF9USU1FT1VUX01TID0gMTIwXzAwMDtcbmNvbnN0IERFRkFVTFRfQ09NTUFORF9USU1FT1VUX01TID0gMzBfMDAwO1xuY29uc3QgU0FOREJPWF9QT0xMX0lOVEVSVkFMX01TID0gNTAwO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9zYW5kYm94XCIpO1xuXG5jb25zdCBTYW5kYm94U3RhdGVTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHN0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgU2FuZGJveFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBkaXNwbGF5X25hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY3JlYXRlX3RpbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdXBkYXRlX3RpbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgc3RhdHVzOiBTYW5kYm94U3RhdGVTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuXG5jb25zdCBFeGVjdXRlUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGV4aXRfY29kZTogei5udW1iZXIoKS5pbnQoKS5vcHRpb25hbCgpLFxuICBzdGF0dXM6IHouc3RyaW5nKCksXG4gIHN0ZG91dDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBzdGRlcnI6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgY29tbWFuZF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB0cnVuY2F0ZWQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIE9wdGlvbnMgZm9yIG9uZSBEYXRhYnJpY2tzLWJhY2tlZCBNYXN0cmEgc2FuZGJveC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1NhbmRib3hPcHRpb25zIHtcbiAgLyoqIEFwcEtpdCB3b3Jrc3BhY2UgY2xpZW50IHVzZWQgZm9yIGV2ZXJ5IHNhbmRib3ggQVBJIGNhbGwuICovXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICAvKiogUmVzb3VyY2UgaWQsIHdpdGggb3Igd2l0aG91dCB0aGUgYHNhbmRib3hlcy9gIHByZWZpeC4gKi9cbiAgc2FuZGJveElkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBEYXRhYnJpY2tzIGxhYmVsLiAqL1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgLyoqIFNlcnZlci1zaWRlIGlkbGUgdGltZW91dCBpbiBwcm90b2J1ZiBkdXJhdGlvbiBmb3JtLiBEZWZhdWx0cyB0byBgOTAwc2AuICovXG4gIGluYWN0aXZpdHlUaW1lb3V0Pzogc3RyaW5nO1xuICAvKiogTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBzYW5kYm94IHRvIGJlY29tZSBydW5uYWJsZS4gKi9cbiAgc3RhcnR1cFRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgY29tbWFuZCB0aW1lb3V0LiBQZXItY2FsbCBgb3B0aW9ucy50aW1lb3V0YCB3aW5zLiAqL1xuICBjb21tYW5kVGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUHJvdmlkZXIgdXNlZCBvbmx5IHdoZW4gRGF0YWJyaWNrcyBTYW5kYm94IGlzIGRlZmluaXRpdmVseSB1bmF2YWlsYWJsZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIE5vZGUgUHlkYW50aWMgTW9udHkgcnVudGltZTsgYGZhbHNlYCBmYWlscyBpbnN0ZWFkLlxuICAgKi9cbiAgZmFsbGJhY2s/OiBmYWxzZSB8IFwibW9udHlcIiB8IE1vbnR5U2FuZGJveE9wdGlvbnMgfCBXb3Jrc3BhY2VTYW5kYm94O1xufVxuXG4vKiogRGF0YWJyaWNrcyBvcHRpb25zIGFjY2VwdGVkIGJ5IHRoZSBoaWdoZXItbGV2ZWwgd29ya3NwYWNlIGZhY3RvcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyBleHRlbmRzIE9taXQ8XG4gIERhdGFicmlja3NTYW5kYm94T3B0aW9ucyxcbiAgXCJjbGllbnRcIiB8IFwic2FuZGJveElkXCJcbj4ge1xuICAvKiogUHJvdmlkZXIgZGlzY3JpbWluYXRvci4gRGVmYXVsdHMgdG8gYGRhdGFicmlja3NgLiAqL1xuICBwcm92aWRlcj86IFwiZGF0YWJyaWNrc1wiO1xuICAvKipcbiAgICogQ3JlZGVudGlhbCBzb3VyY2UuIERlZmF1bHRzIHRvIGEgZnJlc2ggQXBwS2l0IGNsaWVudCB1c2luZyB0aGUgbm9ybWFsXG4gICAqIGVudmlyb25tZW50L3Byb2ZpbGUgY2hhaW4sIHdoaWNoIGlzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwgaW4gYVxuICAgKiBEYXRhYnJpY2tzIEFwcC5cbiAgICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudCB8ICgoY29udGV4dDogeyByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfSkgPT4gV29ya3NwYWNlQ2xpZW50KTtcbiAgLyoqXG4gICAqIEZpeGVkIGlkIG9yIHBlci1yZXF1ZXN0IHJlc29sdmVyLiBPbWl0IHRvIGRlcml2ZSBhIHN0YWJsZSwgb3BhcXVlIGlkIGZyb21cbiAgICogdGhlIHdvcmtzcGFjZSBhbmQgYXR0cmlidXRlZCB1c2VyLlxuICAgKi9cbiAgc2FuZGJveElkPzogc3RyaW5nIHwgKChjb250ZXh0OiB7IHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCB9KSA9PiBzdHJpbmcpO1xufVxuXG4vKiogTWFzdHJhIHNhbmRib3ggYmFja2VkIGJ5IERhdGFicmlja3Mgc2VydmVybGVzcyBTYW5kYm94IGNvbXB1dGUuICovXG5leHBvcnQgY2xhc3MgRGF0YWJyaWNrc1NhbmRib3ggaW1wbGVtZW50cyBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBzdGF0dXM6IFByb3ZpZGVyU3RhdHVzID0gXCJwZW5kaW5nXCI7XG4gIGVycm9yPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBpbmFjdGl2aXR5VGltZW91dDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0dXBUaW1lb3V0TXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFsbGJhY2tDb25maWc6IEV4Y2x1ZGU8RGF0YWJyaWNrc1NhbmRib3hPcHRpb25zW1wiZmFsbGJhY2tcIl0sIHVuZGVmaW5lZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlZEF0ID0gbmV3IERhdGUoKTtcbiAgcHJpdmF0ZSByZW1vdGVDcmVhdGVkQXQ/OiBEYXRlO1xuICBwcml2YXRlIGxhc3RVc2VkQXQ/OiBEYXRlO1xuICBwcml2YXRlIGFjdGl2ZUZhbGxiYWNrPzogV29ya3NwYWNlU2FuZGJveDtcbiAgcHJpdmF0ZSBzdGFydFByb21pc2U/OiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IERhdGFicmlja3NTYW5kYm94T3B0aW9ucykge1xuICAgIGNvbnN0IGlkID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChvcHRpb25zLnNhbmRib3hJZC5yZXBsYWNlKC9ec2FuZGJveGVzXFwvLywgXCJcIikpO1xuICAgIGlmICghaWQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJEYXRhYnJpY2tzIHNhbmRib3ggaWQgbXVzdCBub3QgYmUgYmxhbmtcIik7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMubmFtZSA9IG9wdGlvbnMuZGlzcGxheU5hbWU/LnRyaW0oKSB8fCBgTWFzdHJhIHNhbmRib3ggJHtpZH1gO1xuICAgIHRoaXMuY2xpZW50ID0gb3B0aW9ucy5jbGllbnQ7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IHRoaXMubmFtZTtcbiAgICB0aGlzLmluYWN0aXZpdHlUaW1lb3V0ID0gb3B0aW9ucy5pbmFjdGl2aXR5VGltZW91dCA/PyBERUZBVUxUX0lOQUNUSVZJVFlfVElNRU9VVDtcbiAgICB0aGlzLnN0YXJ0dXBUaW1lb3V0TXMgPSBvcHRpb25zLnN0YXJ0dXBUaW1lb3V0TXMgPz8gREVGQVVMVF9TVEFSVFVQX1RJTUVPVVRfTVM7XG4gICAgdGhpcy5jb21tYW5kVGltZW91dE1zID0gb3B0aW9ucy5jb21tYW5kVGltZW91dE1zID8/IERFRkFVTFRfQ09NTUFORF9USU1FT1VUX01TO1xuICAgIHRoaXMuZmFsbGJhY2tDb25maWcgPSBvcHRpb25zLmZhbGxiYWNrID8/IFwibW9udHlcIjtcbiAgfVxuXG4gIGdldCBwcm92aWRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZhbGxiYWNrPy5wcm92aWRlciA/PyBcImRhdGFicmlja3NcIjtcbiAgfVxuXG4gIC8qKiBFbnN1cmUgdGhlIHJlbW90ZSBzYW5kYm94IGV4aXN0cyBhbmQgaGFzIHJlYWNoZWQgaXRzIHJ1bm5pbmcgc3RhdGUuICovXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc3RhcnRXaXRoU2lnbmFsKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0V2l0aFNpZ25hbChzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHJldHVybjtcbiAgICBpZiAodGhpcy5zdGFydFByb21pc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRQcm9taXNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZXJmb3JtU3RhcnQoc2lnbmFsKTtcbiAgICB0aGlzLnN0YXJ0UHJvbWlzZSA9IHBlbmRpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBlbmRpbmc7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLnN0YXJ0UHJvbWlzZSA9PT0gcGVuZGluZykgdGhpcy5zdGFydFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtU3RhcnQoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5hY3RpdmVGYWxsYmFjaykge1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmVGYWxsYmFjay5zdGFydD8uKCk7XG4gICAgICB0aGlzLnN0YXR1cyA9IHRoaXMuYWN0aXZlRmFsbGJhY2suc3RhdHVzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXR1cyA9IFwic3RhcnRpbmdcIjtcbiAgICB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBsZXQgc2FuZGJveCA9IGF3YWl0IHRoaXMuZ2V0T3JDcmVhdGUoc2lnbmFsKTtcbiAgICAgIGlmIChzYW5kYm94LnN0YXR1cz8uc3RhdGUgPT09IFwiU0FOREJPWF9TVEFURV9TVE9QUEVEXCIpIHtcbiAgICAgICAgc2FuZGJveCA9IGF3YWl0IHRoaXMubXV0YXRlKFwic3RhcnRcIiwgc2lnbmFsKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYW5kYm94LnN0YXR1cz8uc3RhdGUgPT09IFwiU0FOREJPWF9TVEFURV9TVE9QUElOR1wiKSB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXRlKFwiU0FOREJPWF9TVEFURV9TVE9QUEVEXCIsIHNpZ25hbCk7XG4gICAgICAgIHNhbmRib3ggPSBhd2FpdCB0aGlzLm11dGF0ZShcInN0YXJ0XCIsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuZGJveC5zdGF0dXM/LnN0YXRlICE9PSBcIlNBTkRCT1hfU1RBVEVfUlVOTklOR1wiKSB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXRlKFwiU0FOREJPWF9TVEFURV9SVU5OSU5HXCIsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1cyA9IFwicnVubmluZ1wiO1xuICAgICAgdGhpcy5sYXN0VXNlZEF0ID0gbmV3IERhdGUoKTtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIGlmICh0aGlzLmZhbGxiYWNrQ29uZmlnICE9PSBmYWxzZSAmJiBpc0RhdGFicmlja3NTYW5kYm94VW5hdmFpbGFibGUoY2F1Z2h0KSkge1xuICAgICAgICBjb25zdCBmYWxsYmFjayA9IHJlc29sdmVGYWxsYmFjayh0aGlzLmZhbGxiYWNrQ29uZmlnKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJEYXRhYnJpY2tzIFNhbmRib3ggdW5hdmFpbGFibGU7IHVzaW5nIGZhbGxiYWNrXCIsIHtcbiAgICAgICAgICBzYW5kYm94SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgZmFsbGJhY2s6IGZhbGxiYWNrLnByb3ZpZGVyLFxuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVnaHQpLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgZmFsbGJhY2suc3RhcnQ/LigpO1xuICAgICAgICB0aGlzLmFjdGl2ZUZhbGxiYWNrID0gZmFsbGJhY2s7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gZmFsbGJhY2suc3RhdHVzO1xuICAgICAgICB0aGlzLmVycm9yID0gZmFsbGJhY2suZXJyb3I7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdHVzID0gXCJlcnJvclwiO1xuICAgICAgdGhpcy5lcnJvciA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdWdodCk7XG4gICAgICB0aHJvdyBjYXVnaHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIERhdGFicmlja3MgaG9tZSBwZXJzaXN0ZW5jZSBpcyBub3QgYSBjbG9uZWFibGUgTWFzdHJhIGNoZWNrcG9pbnQuICovXG4gIGFzeW5jIHNuYXBzaG90KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlRmFsbGJhY2s/LnNuYXBzaG90KCk7XG4gIH1cblxuICBnZXQgc3VwcG9ydHNDaGVja3BvaW50cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGYWxsYmFjaz8uc3VwcG9ydHNDaGVja3BvaW50cyA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKiBTdG9wIGNvbXB1dGUgd2hpbGUgcHJlc2VydmluZyB0aGUgc2FuZGJveCBob21lIGRpcmVjdG9yeS4gKi9cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5hY3RpdmVGYWxsYmFjaykge1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmVGYWxsYmFjay5zdG9wPy4oKTtcbiAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5hY3RpdmVGYWxsYmFjay5zdGF0dXM7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJzdG9wcGVkXCIgfHwgdGhpcy5zdGF0dXMgPT09IFwiZGVzdHJveWVkXCIpIHJldHVybjtcbiAgICB0aGlzLnN0YXR1cyA9IFwic3RvcHBpbmdcIjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tdXRhdGUoXCJzdG9wXCIpO1xuICAgICAgdGhpcy5zdGF0dXMgPSBcInN0b3BwZWRcIjtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIGlmIChpc1N0YXR1cyhjYXVnaHQsIDQwNCkpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBcInN0b3BwZWRcIjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICB0aGlzLmVycm9yID0gZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoY2F1Z2h0KTtcbiAgICAgIHRocm93IGNhdWdodDtcbiAgICB9XG4gIH1cblxuICAvKiogUGVybWFuZW50bHkgZGVsZXRlIHRoZSBzYW5kYm94IGFuZCBpdHMgcGVyc2lzdGVkIGhvbWUgZGlyZWN0b3J5LiAqL1xuICBhc3luYyBkZXN0cm95KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZUZhbGxiYWNrKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjdGl2ZUZhbGxiYWNrLmRlc3Ryb3k/LigpO1xuICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLmFjdGl2ZUZhbGxiYWNrLnN0YXR1cztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSBcImRlc3Ryb3llZFwiKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXMgPSBcImRlc3Ryb3lpbmdcIjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KGAke3RoaXMucmVzb3VyY2VQYXRofWAsIFwiREVMRVRFXCIsIHoub2JqZWN0KHt9KS5wYXNzdGhyb3VnaCgpKTtcbiAgICAgIHRoaXMuc3RhdHVzID0gXCJkZXN0cm95ZWRcIjtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIGlmIChpc1N0YXR1cyhjYXVnaHQsIDQwNCkpIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBcImRlc3Ryb3llZFwiO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXR1cyA9IFwiZXJyb3JcIjtcbiAgICAgIHRoaXMuZXJyb3IgPSBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVnaHQpO1xuICAgICAgdGhyb3cgY2F1Z2h0O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFeGVjdXRlIG9uZSBmb3JlZ3JvdW5kIHNoZWxsIGNvbW1hbmQgaW4gdGhlIHJlbW90ZSBzYW5kYm94LiAqL1xuICBhc3luYyBleGVjdXRlQ29tbWFuZChcbiAgICBjb21tYW5kOiBzdHJpbmcsXG4gICAgYXJnczogc3RyaW5nW10gPSBbXSxcbiAgICBvcHRpb25zOiBFeGVjdXRlQ29tbWFuZE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxDb21tYW5kUmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5zdGFydFdpdGhTaWduYWwob3B0aW9ucy5hYm9ydFNpZ25hbCk7XG4gICAgaWYgKHRoaXMuYWN0aXZlRmFsbGJhY2spIHtcbiAgICAgIGlmICghdGhpcy5hY3RpdmVGYWxsYmFjay5leGVjdXRlQ29tbWFuZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgYXJncyxcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBleGl0Q29kZTogMSxcbiAgICAgICAgICBzdGRvdXQ6IFwiXCIsXG4gICAgICAgICAgc3RkZXJyOiBgRmFsbGJhY2sgc2FuZGJveCAke3RoaXMuYWN0aXZlRmFsbGJhY2sucHJvdmlkZXJ9IGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZCBleGVjdXRpb24uYCxcbiAgICAgICAgICBleGVjdXRpb25UaW1lTXM6IDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVGYWxsYmFjay5leGVjdXRlQ29tbWFuZChjb21tYW5kLCBhcmdzLCBvcHRpb25zKTtcbiAgICB9XG4gICAgY29uc3QgdGltZW91dCA9IG9wdGlvbnMudGltZW91dCA/PyB0aGlzLmNvbW1hbmRUaW1lb3V0TXM7XG4gICAgY29uc3Qgc2NyaXB0ID0gY29tbWFuZFNjcmlwdChjb21tYW5kLCBhcmdzLCBvcHRpb25zLmN3ZCk7XG4gICAgY29uc3Qgc3RhcnRlZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KFxuICAgICAgYCR7U0FOREJPWF9FWEVDX0FQSV9QQVRIfS8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmlkKX0vZXhlYy1zeW5jYCxcbiAgICAgIFwiUE9TVFwiLFxuICAgICAgRXhlY3V0ZVJlc3BvbnNlU2NoZW1hLFxuICAgICAge1xuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgY21kOiBcIi9iaW4vYmFzaFwiLFxuICAgICAgICAgIGFyZ3M6IFtcIi1sY1wiLCBzY3JpcHRdLFxuICAgICAgICAgIGVudnM6IGRlZmluZWRFbnZpcm9ubWVudChvcHRpb25zLmVudiksXG4gICAgICAgICAgZXhlY3V0aW9uX3RpbWVvdXQ6IGAke01hdGgubWF4KDEsIE1hdGguY2VpbCh0aW1lb3V0IC8gMV8wMDApKX1zYCxcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IHN0ZG91dCA9IHJlc3BvbnNlLnN0ZG91dCA/PyBcIlwiO1xuICAgIGNvbnN0IHN0ZGVyciA9IHJlc3BvbnNlLnN0ZGVyciA/PyBcIlwiO1xuICAgIG9wdGlvbnMub25TdGRvdXQ/LihzdGRvdXQpO1xuICAgIG9wdGlvbnMub25TdGRlcnI/LihzdGRlcnIpO1xuICAgIHRoaXMubGFzdFVzZWRBdCA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgdGltZWRPdXQgPSByZXNwb25zZS5zdGF0dXMgPT09IFwiRVhFQ1VURV9DT01NQU5EX1NUQVRVU19USU1FRF9PVVRcIjtcbiAgICBjb25zdCBleGl0Q29kZSA9IHJlc3BvbnNlLmV4aXRfY29kZSA/PyAtMTtcbiAgICByZXR1cm4ge1xuICAgICAgY29tbWFuZCxcbiAgICAgIGFyZ3MsXG4gICAgICBzdWNjZXNzOiByZXNwb25zZS5zdGF0dXMgPT09IFwiRVhFQ1VURV9DT01NQU5EX1NUQVRVU19DT01QTEVURURcIiAmJiBleGl0Q29kZSA9PT0gMCxcbiAgICAgIGV4aXRDb2RlLFxuICAgICAgc3Rkb3V0LFxuICAgICAgc3RkZXJyLFxuICAgICAgZXhlY3V0aW9uVGltZU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWQsXG4gICAgICAuLi4odGltZWRPdXQgPyB7IHRpbWVkT3V0OiB0cnVlLCBraWxsZWQ6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihyZXNwb25zZS50cnVuY2F0ZWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGRvdXRUcnVuY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICBzdGRlcnJUcnVuY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGFkYXB0ZXIgY3VycmVudGx5IGtub3dzIHRoZSByZW1vdGUgc2FuZGJveCB0byBiZSBydW5uaW5nLiAqL1xuICBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZUZhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVGYWxsYmFjay5pc1JlYWR5Py4oKSA/PyB0aGlzLmFjdGl2ZUZhbGxiYWNrLnN0YXR1cyA9PT0gXCJydW5uaW5nXCI7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgdGhpcy5nZXQoKTtcbiAgICAgIHRoaXMuc3RhdHVzID1cbiAgICAgICAgc2FuZGJveC5zdGF0dXM/LnN0YXRlID09PSBcIlNBTkRCT1hfU1RBVEVfUlVOTklOR1wiID8gXCJydW5uaW5nXCIgOiByZW1vdGVTdGF0dXMoc2FuZGJveCk7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IFwicnVubmluZ1wiO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgaWYgKGlzU3RhdHVzKGNhdWdodCwgNDA0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhyb3cgY2F1Z2h0O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXBvcnQgTWFzdHJhLWZhY2luZyBzYW5kYm94IG1ldGFkYXRhLiAqL1xuICBhc3luYyBnZXRJbmZvKCk6IFByb21pc2U8U2FuZGJveEluZm8+IHtcbiAgICBpZiAodGhpcy5hY3RpdmVGYWxsYmFjaykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGF3YWl0IHRoaXMuYWN0aXZlRmFsbGJhY2suZ2V0SW5mbz8uKCkpID8/IHtcbiAgICAgICAgICBpZDogdGhpcy5hY3RpdmVGYWxsYmFjay5pZCxcbiAgICAgICAgICBuYW1lOiB0aGlzLmFjdGl2ZUZhbGxiYWNrLm5hbWUsXG4gICAgICAgICAgcHJvdmlkZXI6IHRoaXMuYWN0aXZlRmFsbGJhY2sucHJvdmlkZXIsXG4gICAgICAgICAgc3RhdHVzOiB0aGlzLmFjdGl2ZUZhbGxiYWNrLnN0YXR1cyxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgdGhpcy5nZXQoKTtcbiAgICB0aGlzLnN0YXR1cyA9IHJlbW90ZVN0YXR1cyhzYW5kYm94KTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBuYW1lOiBzYW5kYm94LmRpc3BsYXlfbmFtZSA/PyB0aGlzLm5hbWUsXG4gICAgICBwcm92aWRlcjogdGhpcy5wcm92aWRlcixcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBjcmVhdGVkQXQ6IHRoaXMucmVtb3RlQ3JlYXRlZEF0ID8/IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgLi4uKHRoaXMubGFzdFVzZWRBdCA/IHsgbGFzdFVzZWRBdDogdGhpcy5sYXN0VXNlZEF0IH0gOiB7fSksXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICByZXNvdXJjZU5hbWU6IHNhbmRib3gubmFtZSxcbiAgICAgICAgcmVtb3RlU3RhdGU6IHNhbmRib3guc3RhdHVzPy5zdGF0ZSxcbiAgICAgICAgdXBkYXRlVGltZTogc2FuZGJveC51cGRhdGVfdGltZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBFeHBsYWluIHRoZSBEYXRhYnJpY2tzIGV4ZWN1dGlvbiBib3VuZGFyeSB0byB0aGUgYWdlbnQuICovXG4gIGdldEluc3RydWN0aW9ucygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICBcIkNvbW1hbmRzIHJ1biBpbiBhIHBlcnNpc3RlbnQgRGF0YWJyaWNrcyBzZXJ2ZXJsZXNzIHNhbmRib3gsIG5vdCBpbiB0aGUgQXBwIGNvbnRhaW5lci5cIixcbiAgICAgIFwiVXNlIHNoZWxsIGNvbW1hbmRzIG5vcm1hbGx5LiBUaGUgc2FuZGJveCBob21lIGRpcmVjdG9yeSBzdXJ2aXZlcyBpbmFjdGl2aXR5IHN0b3BzLlwiLFxuICAgICAgXCJJZiBEYXRhYnJpY2tzIFNhbmRib3ggaXMgdW5hdmFpbGFibGUsIGNvbW1hbmRzIGZhbGwgYmFjayB0byBQeWRhbnRpYyBNb250eSBhbmQgbXVzdCBiZSBQeXRob24gc291cmNlLlwiLFxuICAgICAgXCJEYXRhYnJpY2tzIFdvcmtzcGFjZSBmaWxlc3lzdGVtIG1vdW50cyByZW1haW4gc2VwYXJhdGUgdW5sZXNzIGEgY29tbWFuZCBjb3BpZXMgZGF0YSBleHBsaWNpdGx5LlwiLFxuICAgIF0uam9pbihcIiBcIik7XG4gIH1cblxuICBwcml2YXRlIGdldCByZXNvdXJjZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7U0FOREJPWF9BUElfUEFUSH0vJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5pZCl9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3JDcmVhdGUoc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0KHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoIWlzU3RhdHVzKGNhdWdodCwgNDA0KSkgdGhyb3cgY2F1Z2h0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGF3YWl0IHRoaXMucmVxdWVzdChTQU5EQk9YX0FQSV9QQVRILCBcIlBPU1RcIiwgU2FuZGJveFJlc3BvbnNlU2NoZW1hLCB7XG4gICAgICAgIHF1ZXJ5OiB7IHNhbmRib3hfaWQ6IHRoaXMuaWQgfSxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIGRpc3BsYXlfbmFtZTogdGhpcy5kaXNwbGF5TmFtZSxcbiAgICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgICBjb21wdXRlOiB7XG4gICAgICAgICAgICAgIGluYWN0aXZpdHlfdGltZW91dDogdGhpcy5pbmFjdGl2aXR5VGltZW91dCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlbWVtYmVyQ3JlYXRlZEF0KHNhbmRib3guY3JlYXRlX3RpbWUpO1xuICAgICAgcmV0dXJuIHNhbmRib3g7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAoIWlzU3RhdHVzKGNhdWdodCwgNDA5KSkgdGhyb3cgY2F1Z2h0O1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KHNpZ25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXQoc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHRoaXMucmVzb3VyY2VQYXRoLCBcIkdFVFwiLCBTYW5kYm94UmVzcG9uc2VTY2hlbWEsIHtcbiAgICAgIHNpZ25hbCxcbiAgICB9KTtcbiAgICB0aGlzLnJlbWVtYmVyQ3JlYXRlZEF0KHNhbmRib3guY3JlYXRlX3RpbWUpO1xuICAgIHJldHVybiBzYW5kYm94O1xuICB9XG5cbiAgcHJpdmF0ZSBtdXRhdGUob3BlcmF0aW9uOiBcInN0YXJ0XCIgfCBcInN0b3BcIiwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KGAke3RoaXMucmVzb3VyY2VQYXRofS8ke29wZXJhdGlvbn1gLCBcIlBPU1RcIiwgU2FuZGJveFJlc3BvbnNlU2NoZW1hLCB7XG4gICAgICBzaWduYWwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JTdGF0ZShleHBlY3RlZDogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMuc3RhcnR1cFRpbWVvdXRNcztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBzYW5kYm94ID0gYXdhaXQgdGhpcy5nZXQoc2lnbmFsKTtcbiAgICAgIGlmIChzYW5kYm94LnN0YXR1cz8uc3RhdGUgPT09IGV4cGVjdGVkKSByZXR1cm4gc2FuZGJveDtcbiAgICAgIGF3YWl0IGFzeW5jVXRpbHMuc2xlZXAoU0FOREJPWF9QT0xMX0lOVEVSVkFMX01TLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGF0YWJyaWNrcyBzYW5kYm94ICR7dGhpcy5pZH0gZGlkIG5vdCByZWFjaCAke2V4cGVjdGVkfSB3aXRoaW4gJHt0aGlzLnN0YXJ0dXBUaW1lb3V0TXN9bXNgLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbWVtYmVyQ3JlYXRlZEF0KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IERhdGUodmFsdWUpO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB0aGlzLnJlbW90ZUNyZWF0ZWRBdCA9IHBhcnNlZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdDxUPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbWV0aG9kOiBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIkRFTEVURVwiLFxuICAgIHNjaGVtYTogei5ab2RUeXBlPFQ+LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHBheWxvYWQ/OiB1bmtub3duO1xuICAgICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgfSA9IHt9LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgICAge1xuICAgICAgICBwYXRoLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5LFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi4ob3B0aW9ucy5wYXlsb2FkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSksXG4gICAgICAgIH0pLFxuICAgICAgICByYXc6IGZhbHNlLFxuICAgICAgICAuLi4ob3B0aW9ucy5wYXlsb2FkID09PSB1bmRlZmluZWQgPyB7fSA6IHsgcGF5bG9hZDogb3B0aW9ucy5wYXlsb2FkIH0pLFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnMuc2lnbmFsID8gZGF0YWJyaWNrcy50b0NvbnRleHQob3B0aW9ucy5zaWduYWwpIDogdW5kZWZpbmVkLFxuICAgICk7XG4gICAgcmV0dXJuIHNjaGVtYS5wYXJzZShyZXNwb25zZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWFuZFNjcmlwdChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IGludm9jYXRpb24gPSBhcmdzLmxlbmd0aCA/IFtjb21tYW5kLCAuLi5hcmdzXS5tYXAoc2hlbGxRdW90ZSkuam9pbihcIiBcIikgOiBjb21tYW5kO1xuICByZXR1cm4gY3dkID8gYGNkIC0tICR7c2hlbGxRdW90ZShjd2QpfSAmJiAke2ludm9jYXRpb259YCA6IGludm9jYXRpb247XG59XG5cbmZ1bmN0aW9uIHNoZWxsUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgXCInXFxcXCcnXCIpfSdgO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVkRW52aXJvbm1lbnQoaW5wdXQ6IE5vZGVKUy5Qcm9jZXNzRW52IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoaW5wdXQgPz8ge30pLmZpbHRlcihcbiAgICAgIChlbnRyeSk6IGVudHJ5IGlzIFtzdHJpbmcsIHN0cmluZ10gPT4gZW50cnlbMV0gIT09IHVuZGVmaW5lZCxcbiAgICApLFxuICApO1xufVxuXG5mdW5jdGlvbiBpc1N0YXR1cyhjYXVnaHQ6IHVua25vd24sIHN0YXR1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvclV0aWxzLmVycm9yQ29udGV4dChjYXVnaHQpLnN0YXR1c0NvZGUgPT09IHN0YXR1cztcbn1cblxuZnVuY3Rpb24gcmVtb3RlU3RhdHVzKHNhbmRib3g6IHouaW5mZXI8dHlwZW9mIFNhbmRib3hSZXNwb25zZVNjaGVtYT4pOiBQcm92aWRlclN0YXR1cyB7XG4gIHN3aXRjaCAoc2FuZGJveC5zdGF0dXM/LnN0YXRlKSB7XG4gICAgY2FzZSBcIlNBTkRCT1hfU1RBVEVfUlVOTklOR1wiOlxuICAgICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICAgIGNhc2UgXCJTQU5EQk9YX1NUQVRFX1NUT1BQRURcIjpcbiAgICAgIHJldHVybiBcInN0b3BwZWRcIjtcbiAgICBjYXNlIFwiU0FOREJPWF9TVEFURV9TVE9QUElOR1wiOlxuICAgICAgcmV0dXJuIFwic3RvcHBpbmdcIjtcbiAgICBjYXNlIFwiU0FOREJPWF9TVEFURV9QRU5ESU5HXCI6XG4gICAgICByZXR1cm4gXCJzdGFydGluZ1wiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJwZW5kaW5nXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZhbGxiYWNrKFxuICBjb25maWd1cmVkOiBFeGNsdWRlPERhdGFicmlja3NTYW5kYm94T3B0aW9uc1tcImZhbGxiYWNrXCJdLCBmYWxzZSB8IHVuZGVmaW5lZD4sXG4pOiBXb3Jrc3BhY2VTYW5kYm94IHtcbiAgaWYgKHR5cGVvZiBjb25maWd1cmVkID09PSBcIm9iamVjdFwiICYmIFwicHJvdmlkZXJcIiBpbiBjb25maWd1cmVkICYmIFwic3RhdHVzXCIgaW4gY29uZmlndXJlZCkge1xuICAgIHJldHVybiBjb25maWd1cmVkO1xuICB9XG4gIHJldHVybiBuZXcgTW9udHlTYW5kYm94KGNvbmZpZ3VyZWQgPT09IFwibW9udHlcIiA/IHt9IDogY29uZmlndXJlZCk7XG59XG5cbmZ1bmN0aW9uIGlzRGF0YWJyaWNrc1NhbmRib3hVbmF2YWlsYWJsZShjYXVnaHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgY29udGV4dCA9IGVycm9yVXRpbHMuZXJyb3JDb250ZXh0KGNhdWdodCk7XG4gIHJldHVybiAoXG4gICAgY29udGV4dC5zdGF0dXNDb2RlID09PSA0MDQgfHxcbiAgICBjb250ZXh0Lmhhc01lc3NhZ2UoXCJmZWF0dXJlXCIsIFwiZGlzYWJsZWRcIikgfHxcbiAgICBjb250ZXh0Lmhhc01lc3NhZ2UoXCJzYW5kYm94XCIsIFwibm90XCIsIFwiZW5hYmxlZFwiKSB8fFxuICAgIGNvbnRleHQuaGFzTWVzc2FnZShcInByZXZpZXdcIiwgXCJub3RcIiwgXCJlbmFibGVkXCIpIHx8XG4gICAgY29udGV4dC5oYXNNZXNzYWdlKFwicHJldmlld1wiLCBcInVuYXZhaWxhYmxlXCIpIHx8XG4gICAgY29udGV4dC5oYXNNZXNzYWdlKFwicHJldmlld1wiLCBcImRpc2FibGVkXCIpXG4gICk7XG59XG4iXX0=
|
package/lib/src/server.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
7
|
import { getExecutionContext } from "@databricks/appkit";
|
|
8
|
-
import { hash, http, log, object,
|
|
8
|
+
import { hash, http, log, object, stringUtils, token } from "@dbx-tools/shared-core";
|
|
9
9
|
import { feedback, thread } from "@dbx-tools/shared-mastra";
|
|
10
10
|
import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY, RequestContext, } from "@mastra/core/request-context";
|
|
11
11
|
import { MastraServer as ExpressMastraServer } from "@mastra/express";
|
|
@@ -256,7 +256,7 @@ export class MastraServer extends ExpressMastraServer {
|
|
|
256
256
|
return;
|
|
257
257
|
}
|
|
258
258
|
const cookies = http.parseCookies(req.headers.cookie);
|
|
259
|
-
const cookieName =
|
|
259
|
+
const cookieName = stringUtils.toIdentifierWithOptions({ delimiter: "_", distinct: true }, "appkit", this.config.name, "sessionId");
|
|
260
260
|
let sessionId = cookies[cookieName];
|
|
261
261
|
if (!sessionId) {
|
|
262
262
|
sessionId = hash.id();
|
|
@@ -278,8 +278,8 @@ export class MastraServer extends ExpressMastraServer {
|
|
|
278
278
|
readRequestedThreadId(req) {
|
|
279
279
|
const headerValue = req.headers[thread.THREAD_ID_HEADER];
|
|
280
280
|
const queryValue = req.query[thread.THREAD_ID_QUERY];
|
|
281
|
-
return (
|
|
282
|
-
|
|
281
|
+
return (stringUtils.trimToNull(Array.isArray(headerValue) ? headerValue[0] : headerValue) ??
|
|
282
|
+
stringUtils.trimToNull(Array.isArray(queryValue) ? queryValue[0] : queryValue));
|
|
283
283
|
}
|
|
284
284
|
configureRequestContextModelOverride(req, requestContext) {
|
|
285
285
|
// Per-request model override: only honored when the plugin
|
|
@@ -376,4 +376,4 @@ export function attachRoutePatchMiddleware(app) {
|
|
|
376
376
|
next();
|
|
377
377
|
});
|
|
378
378
|
}
|
|
379
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsY0FBYyxHQUNmLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixvQkFBb0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sNEJBQTRCLEdBQUc7SUFDbkMsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFC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QUksRUFBRSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwcmVzcy1sYXllciBwbHVtYmluZyBmb3IgdGhlIE1hc3RyYSBwbHVnaW46IGEgYE1hc3RyYVNlcnZlcmAgdGhhdFxuICogc3RhbXBzIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgIGFuZCBhIHNjb3BlZCBuYXRpdmUgQVBJIGdhdGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBoYXNoLCBodHRwLCBsb2csIG9iamVjdCwgc3RyaW5nLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjaywgdGhyZWFkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHtcbiAgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSxcbiAgTUFTVFJBX1RIUkVBRF9JRF9LRVksXG4gIFJlcXVlc3RDb250ZXh0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTWFzdHJhU2VydmVyIGFzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIgfSBmcm9tIFwiQG1hc3RyYS9leHByZXNzXCI7XG5pbXBvcnQgeyB0cmFjZSB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9hcGlcIjtcbmltcG9ydCB0eXBlIGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcblxuaW1wb3J0IHtcbiAgYXR0cmlidXRlZFVzZXJJZCxcbiAgTUFTVFJBX1JFUVVFU1RfSURfS0VZLFxuICBNQVNUUkFfU0NPUEVTX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgdHlwZSBVc2VyLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHJlcXVlc3RVc2VyRW1haWwsIHJlcXVlc3RVc2VySWQgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZCB9IGZyb20gXCIuL21sZmxvdy50c1wiO1xuXG5pbXBvcnQge1xuICBleHRyYWN0TW9kZWxPdmVycmlkZSxcbiAgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSxcbiAgcmVzb2x2ZVNlcnZpbmdDb25maWcsXG59IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbi8qKlxuICogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy5cbiAqIGB0cmFjZS5nZXRBY3RpdmVTcGFuKClgIHJldHVybnMgYSBub24tcmVjb3JkaW5nIHNwYW4gd2l0aCB0aGlzIGlkXG4gKiB3aGVuIG5vIFNESyBpcyByZWdpc3RlcmVkLCB3aGljaCBtdXN0IG5ldmVyIGJlIHN1cmZhY2VkIGFzIGEgdHJhY2UgdG9cbiAqIGF0dGFjaCBmZWVkYmFjayB0by5cbiAqL1xuY29uc3QgSU5WQUxJRF9UUkFDRV9JRCA9IFwiMFwiLnJlcGVhdCgzMik7XG5jb25zdCBUUlVTVEVEX1JFUVVFU1RfQ09OVEVYVF9LRVlTID0gW1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICBNQVNUUkFfVVNFUl9OQU1FX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuXSBhcyBjb25zdDtcblxuLyoqIFJlbW92ZSBicm93c2VyLXN1cHBsaWVkIHZhbHVlcyBmb3IgZmllbGRzIG93bmVkIGJ5IHRydXN0ZWQgc2VydmVyIG1pZGRsZXdhcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5kZWxldGVSYXcoa2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgaW5kZXBlbmRlbnQgb2Ygd2hpY2ggRGF0YWJyaWNrcyBjcmVkZW50aWFsIHJ1bnNcbiAqIGl0cyBjYWxscy4gU3VwcGxpZWQgYnkgdGhlIEhUVFAgbWlkZGxld2FyZSBmcm9tIHRoZSBmb3J3YXJkZWQgdXNlciBoZWFkZXJzIHNvXG4gKiB0aGF0IGluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSAtIHdoZXJlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzIHRoZSBhcHAgU1Anc1xuICogY2xpZW50IC0gdGhlIG1lbW9yeSB0aHJlYWQsIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSwgYW5kIHRyYWNlIG1ldGFkYXRhXG4gKiBzdGlsbCBrZXkgb2ZmIHRoZSByZWFsIGNhbGxlci4gSWdub3JlZCBpbiBhbiBPQk8gKHVzZXIpIGNvbnRleHQsIHdob3NlIG93blxuICogdXNlciBpZCAvIGVtYWlsIGFyZSBhdXRob3JpdGF0aXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZWRJZGVudGl0eSB7XG4gIC8qKiBGb3J3YXJkZWQgYHgtZm9yd2FyZGVkLXVzZXJgIGlkLCB1c2VkIHdoZW4gdGhlIGNsaWVudCBpcyB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIHVzZXJJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtZW1haWxgLCB1c2VkIGZvciB0cmFjZSBtZXRhZGF0YSB1bmRlciB0aGUgc2VydmljZSBwcmluY2lwYWwuICovXG4gIGVtYWlsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YW1wIHRoZSBBcHBLaXQgdXNlciAocGx1cyB0aGUgcmVzb3VyY2UgaWQgYW5kIHRyYWNlIG1ldGFkYXRhKSBvbnRvXG4gKiBgcmVxdWVzdENvbnRleHRgLlxuICpcbiAqIFNwbGl0IG91dCBvZiB7QGxpbmsgTWFzdHJhU2VydmVyfSBiZWNhdXNlIHRoZSBIVFRQIG1pZGRsZXdhcmUgaXMgbm90IHRoZSBvbmx5XG4gKiBjYWxsZXIgdGhhdCBuZWVkcyBpdDogYW4gb3V0LW9mLWJhbmQgdHVybiAoYSBUZWFtcyBhY3Rpdml0eSBhcnJpdmluZyBvblxuICogYW5vdGhlciBwbHVnaW4ncyByb3V0ZSwgYSBzY2hlZHVsZWQgam9iKSBkcml2ZXMgYGFnZW50LmdlbmVyYXRlYCBkaXJlY3RseSwgYW5kXG4gKiB3aXRob3V0IHRoaXMgc3RhbXAgZXZlcnkgdXNlci1zY29wZWQgdG9vbCAtIGBhc2tfZ2VuaWVgIGFib3ZlIGFsbCAtIGZhaWxzIHdpdGhcbiAqIFwiaW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW5cIi4gVGhvc2VcbiAqIGNhbGxlcnMgYnVpbGQgYSBjb250ZXh0IHdpdGgge0BsaW5rIGNyZWF0ZVJlcXVlc3RDb250ZXh0fSBpbnN0ZWFkIG9mIGFcbiAqIHJlcXVlc3QuXG4gKlxuICogVGhlIERhdGFicmlja3MgY3JlZGVudGlhbCBhbHdheXMgY29tZXMgZnJvbSB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dDtcbiAqIGBhdHRyaWJ1dGVkYCBvbmx5IGNoYW5nZXMgV0hPIHRoZSB0dXJuIGlzIGF0dHJpYnV0ZWQgdG8gd2hlbiB0aGF0IGNvbnRleHQgaXNcbiAqIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCAoc2VlIHtAbGluayBBdHRyaWJ1dGVkSWRlbnRpdHl9KS5cbiAqXG4gKiBJZGVtcG90ZW50OiByZXR1cm5zIGltbWVkaWF0ZWx5IHdoZW4gdGhlIHVzZXIgYW5kIHJlc291cmNlIGlkIGFyZSBhbHJlYWR5XG4gKiBwcmVzZW50LCBzbyB0aGUgbWlkZGxld2FyZSBjYW4gY2FsbCBpdCBvdmVyIGEgY29udGV4dCBhbm90aGVyIGxheWVyIHN0YW1wZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICBhdHRyaWJ1dGVkOiBBdHRyaWJ1dGVkSWRlbnRpdHkgPSB7fSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoW01BU1RSQV9VU0VSX0tFWSwgTUFTVFJBX1JFU09VUkNFX0lEX0tFWV0uZXZlcnkoKGtleSkgPT4gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkpKSByZXR1cm47XG4gIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGNvbnN0IGlzVXNlckNvbnRleHQgPSBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0O1xuICAvLyBUaGUgRGF0YWJyaWNrcyBDUkVERU5USUFMIGlzIGFsd2F5cyB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dCdzIGNsaWVudFxuICAvLyAoT0JPIGluIGEgdXNlciBjb250ZXh0LCB0aGUgc2VydmljZSBwcmluY2lwYWwgb3RoZXJ3aXNlKS4gV0hPIHRoZSB0dXJuIGlzXG4gIC8vIGF0dHJpYnV0ZWQgdG8gY2FuIGRpZmZlcjogaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIGV2ZXJ5IHJlcXVlc3Qgc2hhcmVzXG4gIC8vIHRoZSBTUCBjbGllbnQsIGJ1dCB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgbXVzdCBzdGlsbCBrZXkgdGhlIG1lbW9yeSB0aHJlYWRcbiAgLy8gYW5kIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2Ugc28gdHdvIGNhbGxlcnMgZG9uJ3Qgc2hhcmUgYSBjb252ZXJzYXRpb24uXG4gIGNvbnN0IHVzZXI6IFVzZXIgPSB7XG4gICAgaWQ6IGF0dHJpYnV0ZWRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCwgYXR0cmlidXRlZC51c2VySWQpLFxuICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gIH07XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9LRVksIHVzZXIpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgdXNlci5pZCk7XG4gIC8vIEFwcEtpdCdzIGBVc2VyQ29udGV4dGAgc3VyZmFjZXMgZGlzcGxheSBuYW1lIC8gZW1haWwgb25seSBvblxuICAvLyBPQk8gcmVxdWVzdHMuIFNlcnZpY2UtY29udGV4dCBjYWxscyAoYmFja2dyb3VuZCB0YXNrcywgc2VydmVyXG4gIC8vIHN0YXJ0LXVwKSBsZWF2ZSB0aGVzZSB1bmRlZmluZWQgYW5kIHdlIHNraXAgdGhlIHN0YW1wIHNvXG4gIC8vIGRvd25zdHJlYW0gdHJhY2UgbWV0YWRhdGEgc3RheXMgYWJzZW50IHJhdGhlciB0aGFuIGVtcHR5LiBJblxuICAvLyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGZvcndhcmRlZCBlbWFpbCBzdGlsbCBpZGVudGlmaWVzIHRoZSBjYWxsZXIsXG4gIC8vIHNvIGl0IGlzIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIFNQLlxuICBsZXQgdXNlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhdHRyaWJ1dGVkLmVtYWlsO1xuICBpZiAoaXNVc2VyQ29udGV4dCkge1xuICAgIHVzZXJOYW1lID0gZXhlY3V0aW9uQ29udGV4dC51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGV4ZWN1dGlvbkNvbnRleHQudXNlckVtYWlsID8/IGVtYWlsO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LmN1cnJlbnRVc2VyLm1lKCk7XG4gICAgdXNlck5hbWUgPSBjdXJyZW50VXNlcj8udXNlck5hbWU7XG4gICAgZW1haWwgPSBjdXJyZW50VXNlcj8uZW1haWxzPy5maWx0ZXIoKGVtYWlsKSA9PiBlbWFpbC5wcmltYXJ5KS5maW5kKChlbWFpbCkgPT4gZW1haWwudmFsdWUpXG4gICAgICA/LnZhbHVlIGFzIHN0cmluZztcbiAgfVxuICBpZiAodXNlck5hbWUpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVksIHVzZXJOYW1lKTtcbiAgfVxuICBpZiAoZW1haWwpIHtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBlbWFpbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYFJlcXVlc3RDb250ZXh0YCBhIE5PTi1IVFRQIGFnZW50IHR1cm4gbmVlZHMuXG4gKlxuICogRXZlcnl0aGluZyBNYXN0cmEncyB0b29scyByZWFkIG9mZiB0aGUgY29udGV4dCBpcyBzdGFtcGVkIHRoZSBzYW1lIHdheSB0aGVcbiAqIHJlcXVlc3QgbWlkZGxld2FyZSBzdGFtcHMgaXQgLSB0aGUgQXBwS2l0IHVzZXIgKHNvIGBhc2tfZ2VuaWVgIGFuZCB0aGUgbW9kZWxcbiAqIHJlc29sdmVyIGNhbiBtaW50IHVzZXItc2NvcGVkIHRva2VucyksIHRoZSBtZW1vcnkgdGhyZWFkIC8gcmVzb3VyY2UgcGFpciwgYW5kXG4gKiBhIHJlcXVlc3QgaWQgc28gdGhlIHR1cm4ncyBzcGFucyBqb2luIHVwIGluIHRyYWNlcy4gVGhlIHJlc3VsdCBpcyBwYXNzZWQgYXNcbiAqIGByZXF1ZXN0Q29udGV4dGAgdG8gYGFnZW50LmdlbmVyYXRlYCAvIGBhZ2VudC5zdHJlYW1gLlxuICpcbiAqIFRoaXMgaXMgd2hhdCBtYWtlcyBhIGNhcmQgdHVybiBhbnN3ZXIgd2l0aCB0aGUgU0FNRSBkYXRhIGEgY2hhdCB0dXJuIGRvZXM6IHRoZVxuICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZW5kcG9pbnRzIGlzIHByZXNlbnRhdGlvbiwgbm90IGNhcGFiaWxpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSZXF1ZXN0Q29udGV4dChcbiAgb3B0aW9uczogeyB0aHJlYWRJZD86IHN0cmluZzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nIH0gPSB7fSxcbik6IFByb21pc2U8UmVxdWVzdENvbnRleHQ+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBuZXcgUmVxdWVzdENvbnRleHQoKTtcbiAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQpO1xuICBpZiAob3B0aW9ucy50aHJlYWRJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCBvcHRpb25zLnRocmVhZElkKTtcbiAgLy8gU3RhbXBlZCBBRlRFUiB0aGUgdXNlciBzbyBhbiBleHBsaWNpdCByZXNvdXJjZSBpZCAoYSBjaGFubmVsIG1lbWJlciwgc2F5KVxuICAvLyB3aW5zIG92ZXIgdGhlIGFtYmllbnQgaWRlbnRpdHkgYHN0YW1wUmVxdWVzdENvbnRleHRVc2VyYCBkZWZhdWx0ZWQgdG8uXG4gIGlmIChvcHRpb25zLnJlc291cmNlSWQpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBvcHRpb25zLnJlc291cmNlSWQpO1xuICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZLCBvcHRpb25zLnJlcXVlc3RJZCA/PyBoYXNoLmlkKCkpO1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ7XG59XG5cbi8qKlxuICogYEBtYXN0cmEvZXhwcmVzc2Agc3ViY2xhc3MgdGhhdCBzdGFtcHMgYFJlcXVlc3RDb250ZXh0YCB3aXRoIHRoZVxuICogQXBwS2l0IHVzZXIsIHJlc291cmNlIGlkLCBhbmQgYSB0aHJlYWQgaWQgYmFja2VkIGJ5IGFuIEhUVFAtb25seVxuICogc2Vzc2lvbiBjb29raWUgKGBhcHBraXRfPHBsdWdpbi1uYW1lPl9zZXNzaW9uX2lkYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXN0cmFTZXJ2ZXIgZXh0ZW5kcyBFeHByZXNzTWFzdHJhU2VydmVyIHtcbiAgcHJpdmF0ZSBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0YW1wIHRoZSBNTGZsb3cgdHJhY2UtaWQgaGVhZGVyIG9uIHJlc3BvbnNlcy4gU2hhcmVzIHRoZVxuICAgKiBwbHVnaW4ncyBmZWVkYmFjayBnYXRlIHZpYSB7QGxpbmsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZH0uXG4gICAqL1xuICBwcml2YXRlIGZlZWRiYWNrRW5hYmxlZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgRXhwcmVzc01hc3RyYVNlcnZlcj5cbiAgKSB7XG4gICAgc3VwZXIoLi4uYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cubG9nZ2VyKGNvbmZpZyk7XG4gICAgdGhpcy5mZWVkYmFja0VuYWJsZWQgPSByZXNvbHZlRmVlZGJhY2tFbmFibGVkKGNvbmZpZy5mZWVkYmFjayk7XG4gIH1cblxuICBvdmVycmlkZSByZWdpc3RlckF1dGhNaWRkbGV3YXJlKCk6IHZvaWQge1xuICAgIHN1cGVyLnJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTtcbiAgICB0aGlzLmFwcC51c2UoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcy5sb2NhbHMucmVxdWVzdENvbnRleHQhIGFzIFJlcXVlc3RDb250ZXh0O1xuICAgICAgY2xlYXJUcnVzdGVkUmVxdWVzdENvbnRleHQocmVxdWVzdENvbnRleHQpO1xuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFVzZXIocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQocmVxLCByZXMsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRNb2RlbE92ZXJyaWRlKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXEsIHJlcXVlc3RDb250ZXh0KTtcblxuICAgICAgdGhpcy5jb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlcyk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhcImF1dGg6bWlkZGxld2FyZVwiLCB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSksXG4gICAgICAgIHRocmVhZElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpLFxuICAgICAgICByZXNvdXJjZUlkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSksXG4gICAgICAgIHVzZXJOYW1lOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfTkFNRV9LRVkpLFxuICAgICAgICB1c2VyRW1haWw6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9FTUFJTF9LRVkpLFxuICAgICAgICBtb2RlbE92ZXJyaWRlOiByZXF1ZXN0Q29udGV4dC5nZXQoXG4gICAgICAgICAgLy8gaW1wb3J0ZWQgYmVsb3c7IGxvZ2dlZCBzbyBhIG1pc3JvdXRlZCByZXF1ZXN0IHNob3dzXG4gICAgICAgICAgLy8gdXAgYWxvbmdzaWRlIGl0cyBtb2RlbCBzZWxlY3Rpb24gaW4gYExPR19MRVZFTD1kZWJ1Z2AuXG4gICAgICAgICAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGFzcyB0aGUgZm9yd2FyZGVkIGNhbGxlciBpZGVudGl0eSBzbyBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgc3RpbGwga2V5c1xuICAgIC8vIG1lbW9yeSAvIGNhY2hlIC8gdHJhY2VzIHBlciB1c2VyIGV2ZW4gdGhvdWdoIHRoZSBjbGllbnQgaXMgdGhlIGFwcCBTUC5cbiAgICAvLyBJbiBhbiBPQk8gY29udGV4dCB0aGVzZSBhcmUgaWdub3JlZCBpbiBmYXZvciBvZiB0aGUgY29udGV4dCdzIG93biB1c2VyLlxuICAgIGF3YWl0IHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKHJlcXVlc3RDb250ZXh0LCB7XG4gICAgICB1c2VySWQ6IHJlcXVlc3RVc2VySWQocmVxKSxcbiAgICAgIGVtYWlsOiByZXF1ZXN0VXNlckVtYWlsKHJlcSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgYSBwZXItcmVxdWVzdCBpZCBhbmQgZWNobyBpdCBvbiB0aGUgcmVzcG9uc2Ugc28gYW4gdXBzdHJlYW1cbiAgICogcHJveHkgLyBjdXJsIGNsaWVudCAvIGJyb3dzZXItc2lkZSBsb2cgbGluZSBjYW4gcGFpciBpdHMgdmlldyBvZlxuICAgKiB0aGUgcmVxdWVzdCB3aXRoIHRoZSBtYXRjaGluZyB0cmFjZSBzcGFuLiBSZXVzZXMgYFgtUmVxdWVzdC1JZGBcbiAgICogd2hlbiB0aGUgdXBzdHJlYW0gYWxyZWFkeSBzdXBwbGllcyBvbmUgc28gbXVsdGktaG9wIHRyYWNlcyBzdGF5XG4gICAqIGpvaW5lZDsgb3RoZXJ3aXNlIG1pbnRzIGEgVVVJRHY0LlxuICAgKlxuICAgKiBUaGUgaWQgaXMgc3VyZmFjZWQgYXMgYG1hc3RyYV9fcmVxdWVzdElkYCBzcGFuIG1ldGFkYXRhIHZpYVxuICAgKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IGFuZCBhcyB0aGUgYFgtUmVxdWVzdC1JZGBcbiAgICogcmVzcG9uc2UgaGVhZGVyIHNvIGRldiB0b29scyBjYW4gY29weSBpdCBmcm9tIGVpdGhlciBzaWRlLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRSZXF1ZXN0SWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVRVUVTVF9JRF9LRVkpKSByZXR1cm47XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1tcIngtcmVxdWVzdC1pZFwiXTtcbiAgICBjb25zdCB1cHN0cmVhbSA9IEFycmF5LmlzQXJyYXkoaGVhZGVyVmFsdWUpID8gaGVhZGVyVmFsdWVbMF0gOiBoZWFkZXJWYWx1ZTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSB1cHN0cmVhbT8udHJpbSgpIHx8IGhhc2guaWQoKTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZLCByZXF1ZXN0SWQpO1xuICAgIHJlcy5zZXRIZWFkZXIoXCJYLVJlcXVlc3QtSWRcIiwgcmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBPQXV0aCBzY29wZXMgZnJvbSB0aGUgZm9yd2FyZGVkIGFjY2VzcyB0b2tlbiBvblxuICAgKiB7QGxpbmsgTUFTVFJBX1NDT1BFU19LRVl9IGZvciB3b3Jrc3BhY2UgbW91bnQgZ2F0aW5nLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRTY29wZXMocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIGNvbnN0IHNjb3BlcyA9IFtcbiAgICAgIC4uLm9iamVjdFxuICAgICAgICAuc2VxdWVuY2UodG9rZW4uZ2V0QWNjZXNzVG9rZW5TY29wZXMocmVxKSwgdG9rZW4uZ2V0QWNjZXNzVG9rZW5TY29wZXMocmVxLCBcImF1dGhvcml6YXRpb25cIikpXG4gICAgICAgIC5kaXN0aW5jdCgpLFxuICAgIF07XG4gICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9TQ09QRVNfS0VZLCBzY29wZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIHRoZSB0dXJuJ3MgTUxmbG93IHRyYWNlIGlkIG9uIHRoZSByZXNwb25zZSBzbyB0aGUgY2hhdCBjbGllbnRcbiAgICogY2FuIGF0dGFjaCB0aHVtYnMgLyBjb21tZW50IGZlZWRiYWNrIHRvIGl0IGxhdGVyLiBNTGZsb3cgZGVyaXZlc1xuICAgKiBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeSB0cmFjZSBpZCAoYHRyLTxoZXg+YCksIGFuZCBldmVyeVxuICAgKiBNYXN0cmEgc3BhbiBmb3IgdGhpcyByZXF1ZXN0IGluaGVyaXRzIHRoZSBhbWJpZW50IE9UZWwgY29udGV4dCAoc2VlXG4gICAqIGBvYnNlcnZhYmlsaXR5LnRzYCksIHNvIHRoZSBhY3RpdmUgc3BhbidzIHRyYWNlIGlkIGhlcmUgaXMgdGhlIGlkXG4gICAqIE1MZmxvdyB3aWxsIHJlY29yZCBmb3IgdGhlIHR1cm4uXG4gICAqXG4gICAqIE5vLW9wIHVubGVzcyBmZWVkYmFjayBpcyBlbmFibGVkLCBhbmQgd2hlbiBubyBsaXZlIE9UZWwgc3BhbiBpc1xuICAgKiBhY3RpdmUgKGUuZy4gdGhlIE9UTFAgU0RLIGlzbid0IHJlZ2lzdGVyZWQpOiBpbiB0aGF0IGNhc2UgdGhlIGhlYWRlclxuICAgKiBpcyBzaW1wbHkgYWJzZW50IGFuZCB0aGUgY2xpZW50IGhpZGVzIGZlZWRiYWNrIGZvciB0aGF0IG1lc3NhZ2UsXG4gICAqIGRlZ3JhZGluZyBncmFjZWZ1bGx5IHJhdGhlciB0aGFuIGVtaXR0aW5nIGEgYm9ndXMgdHJhY2UgaWQuXG4gICAqL1xuICBjb25maWd1cmVNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSkge1xuICAgIGlmICghdGhpcy5mZWVkYmFja0VuYWJsZWQgfHwgcmVzLmhlYWRlcnNTZW50KSByZXR1cm47XG4gICAgY29uc3QgdHJhY2VJZCA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKT8uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGlmICghdHJhY2VJZCB8fCB0cmFjZUlkID09PSBJTlZBTElEX1RSQUNFX0lEKSByZXR1cm47XG4gICAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHRocmVhZCBpZCB0aGlzIHJlcXVlc3QgdGFyZ2V0cyBhbmQgcGluIGl0IG9uXG4gICAqIGBSZXF1ZXN0Q29udGV4dGAgKGNvbnN1bWVkIGJ5IHRoZSBhZ2VudCBzdHJlYW0gZm9yIHBlcnNpc3RlbmNlIGFuZFxuICAgKiBieSBuYXRpdmUgbWVtb3J5IHJvdXRlcykuIFJlc29sdXRpb24gb3JkZXI6XG4gICAqXG4gICAqICAgMS4gQSBjbGllbnQtc3VwcGxpZWQgdGhyZWFkIGlkICh0aGUgdGhyZWFkLXNlbGVjdGlvbiBoZWFkZXIgL1xuICAgKiAgICAgIGA/dGhyZWFkSWQ9YCBxdWVyeSkuIFRoaXMgaXMgaG93IHRoZSBjaGF0IFVJIHJlZmVyZW5jZXMgYVxuICAgKiAgICAgIHNwZWNpZmljIGNvbnZlcnNhdGlvbiBhbW9uZyB0aGUgbWFueSBhIHVzZXIgb3ducyAtIGl0IHBpY2tzIGFcbiAgICogICAgICB0aHJlYWQgaWQgZnJvbSB0aGUgYC90aHJlYWRzYCBsaXN0aW5nIChvciBtaW50cyBvbmUgZm9yIGEgbmV3XG4gICAqICAgICAgY29udmVyc2F0aW9uKSBhbmQgc3RhbXBzIGl0IGhlcmUuIFRoZSBpZCBpcyBzY29wZWQgdG8gdGhlXG4gICAqICAgICAgY2FsbGVyJ3MgcmVzb3VyY2UgYnkgdGhlIHJlY2FsbCAvIGxpc3Qgcm91dGVzLCBzbyBhIGNsaWVudFxuICAgKiAgICAgIGNhbiBvbmx5IGV2ZXIgcmVhZCBvciB3cml0ZSBpdHMgb3duIHRocmVhZHMuXG4gICAqICAgMi4gVGhlIHBlci1zZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKSxcbiAgICogICAgICBtaW50ZWQgb24gZmlyc3QgY29udGFjdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzaW5nbGUtdGhyZWFkXG4gICAqICAgICAgZmFsbGJhY2sgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBtYW5hZ2UgdGhyZWFkcyBleHBsaWNpdGx5LCBzb1xuICAgKiAgICAgIGV4aXN0aW5nIGVtYmVkcyBrZWVwIG9uZSBzdGFibGUgY29udmVyc2F0aW9uIHBlciBzZXNzaW9uIHdpdGhcbiAgICogICAgICBubyBjbGllbnQgY2hhbmdlcy5cbiAgICovXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VGhyZWFkSWQoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCxcbiAgKSB7XG4gICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCByZXF1ZXN0ZWQgPSB0aGlzLnJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXEpO1xuICAgIGlmIChyZXF1ZXN0ZWQpIHtcbiAgICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgcmVxdWVzdGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29va2llcyA9IGh0dHAucGFyc2VDb29raWVzKHJlcS5oZWFkZXJzLmNvb2tpZSk7XG4gICAgY29uc3QgY29va2llTmFtZSA9IHN0cmluZy50b0lkZW50aWZpZXJXaXRoT3B0aW9ucyhcbiAgICAgIHsgZGVsaW1pdGVyOiBcIl9cIiwgZGlzdGluY3Q6IHRydWUgfSxcbiAgICAgIFwiYXBwa2l0XCIsXG4gICAgICB0aGlzLmNvbmZpZy5uYW1lISxcbiAgICAgIFwic2Vzc2lvbklkXCIsXG4gICAgKTtcbiAgICBsZXQgc2Vzc2lvbklkID0gY29va2llc1tjb29raWVOYW1lXTtcbiAgICBpZiAoIXNlc3Npb25JZCkge1xuICAgICAgc2Vzc2lvbklkID0gaGFzaC5pZCgpO1xuICAgICAgcmVzLmNvb2tpZShjb29raWVOYW1lLCBzZXNzaW9uSWQsIHtcbiAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgIHNhbWVTaXRlOiBcImxheFwiLFxuICAgICAgICBzZWN1cmU6IHJlcS5zZWN1cmUsXG4gICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVEhSRUFEX0lEX0tFWSwgc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRoZSBjbGllbnQtc2VsZWN0ZWQgdGhyZWFkIGlkIGZyb20gdGhlIHJlcXVlc3QsIHByZWZlcnJpbmdcbiAgICogdGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIG92ZXIgdGhlIGA/dGhyZWFkSWQ9YCBxdWVyeS4gUmV0dXJuc1xuICAgKiBgbnVsbGAgd2hlbiBuZWl0aGVyIGNhcnJpZXMgYSBub24tZW1wdHkgdmFsdWUgc28gdGhlIGNhbGxlciBmYWxsc1xuICAgKiBiYWNrIHRvIHRoZSBzZXNzaW9uIGNvb2tpZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgaGVhZGVyVmFsdWUgPSByZXEuaGVhZGVyc1t0aHJlYWQuVEhSRUFEX0lEX0hFQURFUl07XG4gICAgY29uc3QgcXVlcnlWYWx1ZSA9IHJlcS5xdWVyeVt0aHJlYWQuVEhSRUFEX0lEX1FVRVJZXTtcbiAgICByZXR1cm4gKFxuICAgICAgc3RyaW5nLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShxdWVyeVZhbHVlKSA/IHF1ZXJ5VmFsdWVbMF0gOiBxdWVyeVZhbHVlKVxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCkge1xuICAgIC8vIFBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlOiBvbmx5IGhvbm9yZWQgd2hlbiB0aGUgcGx1Z2luXG4gICAgLy8gb3B0cyBpbiAoZGVmYXVsdCkuIFNvdXJjZXMsIGluIHByaW9yaXR5IG9yZGVyLCBhcmVcbiAgICAvLyBgWC1NYXN0cmEtTW9kZWxgIGhlYWRlciwgYD9tb2RlbD1gIHF1ZXJ5LCBhbmQgYG1vZGVsYCAvXG4gICAgLy8gYG1vZGVsSWRgIGJvZHkgZmllbGQ7IHNlZSBgc2VydmluZy50c2AuXG4gICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICBpZiAoc2VydmluZy5hbGxvd092ZXJyaWRlKSB7XG4gICAgICBjb25zdCBvdmVycmlkZSA9IGV4dHJhY3RNb2RlbE92ZXJyaWRlKHtcbiAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgICBxdWVyeTogcmVxLnF1ZXJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBib2R5OiByZXEuYm9keSxcbiAgICAgIH0pO1xuICAgICAgaWYgKG92ZXJyaWRlKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSwgb3ZlcnJpZGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSW5wdXRzIGZvciB7QGxpbmsgaXNNYXN0cmFSZXF1ZXN0QWxsb3dlZH0uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFwaUdhdGVPcHRpb25zIHtcbiAgLyoqIGBjb25maWcuYXBpQWNjZXNzYDsgYFwiZnVsbFwiYCBzaG9ydC1jaXJjdWl0cyB0byBhbGxvdyBldmVyeXRoaW5nLiAqL1xuICBhY2Nlc3M6IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqIFdoZXRoZXIgdGhlIE1DUCB0cmFuc3BvcnQgaXMgbW91bnRlZCAoc28gYC9tY3AvKmAgaXMgbGVnaXRpbWF0ZSkuICovXG4gIG1jcEVuYWJsZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogTW91bnQtcmVsYXRpdmUgYWdlbnQgaW5mZXJlbmNlIHBhdGhzIChgL2FnZW50cy86aWQvPHZlcmI+Li4uYCkuIE1hdGNoZWRcbiAqIGJ5IHByZWZpeCBvbiB0aGUgdmVyYiBzbyBmdXR1cmUgdmFyaWFudHMgKGBzdHJlYW1WTmV4dGAsIGBzdHJlYW0vdm5leHRgLFxuICogYGdlbmVyYXRlVk5leHRgKSBzdGF5IGNvdmVyZWQgd2l0aG91dCBhIGNvZGUgY2hhbmdlLlxuICpcbiAqIENvdmVycyB0aGUgcGxhaW4gaW5mZXJlbmNlIHZlcmJzIChgc3RyZWFtYCAvIGBnZW5lcmF0ZWAgLyBgbmV0d29ya2ApIHBsdXNcbiAqIHRoZSBodW1hbi1pbi10aGUtbG9vcCByZXN1bWUgdmVyYnMgYSBwYXVzZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBuZWVkc1xuICogdG8gY29udGludWU6IGBhcHByb3ZlLXRvb2wtY2FsbGAgLyBgZGVjbGluZS10b29sLWNhbGxgIChzdHJlYW1pbmcsIGFuZCB2aWFcbiAqIHByZWZpeCB0aGVpciBgLWdlbmVyYXRlYCBub24tc3RyZWFtaW5nIHZhcmlhbnRzKSwgdGhlIGAtbmV0d29yay1gIHZhcmlhbnRzLFxuICogYW5kIGByZXN1bWUtc3RyZWFtYCAoY292ZXJzIGByZXN1bWUtc3RyZWFtLXVudGlsLWlkbGVgKS4gV2l0aG91dCB0aGVzZSBhblxuICogYXBwcm92YWwtZ2F0ZWQgdG9vbCAoZS5nLiBgc2VuZF9lbWFpbGApIGNhbiBiZSByZXF1ZXN0ZWQgYnV0IG5ldmVyIGFwcHJvdmVkXG4gKiBmcm9tIHRoZSBicm93c2VyIC0gdGhlIHJlc3VtZSBgUE9TVGAgNDAzcyB1bmRlciBzY29wZWQgbW9kZS4gVG9nZXRoZXIgd2l0aFxuICogdGhlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgbXV0YXRpb25zIGJlbG93LCB0aGVzZSBhcmUgdGhlIG9ubHkgc3RvY2sgTWFzdHJhXG4gKiB3cml0ZXMgdGhlIGJyb3dzZXIgY2xpZW50IGNhbiBtYWtlLlxuICovXG5jb25zdCBBR0VOVF9JTkZFUkVOQ0UgPVxuICAvXlxcL2FnZW50c1xcL1teL10rXFwvKHN0cmVhbXxnZW5lcmF0ZXxuZXR3b3JrfHJlc3VtZS1zdHJlYW18YXBwcm92ZS10b29sLWNhbGx8ZGVjbGluZS10b29sLWNhbGx8YXBwcm92ZS1uZXR3b3JrLXRvb2wtY2FsbHxkZWNsaW5lLW5ldHdvcmstdG9vbC1jYWxsKS9pO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhIChgL2FnZW50c2AsIGAvYWdlbnRzLzppZGApLiAqL1xuY29uc3QgQUdFTlRfTUVUQURBVEEgPSAvXlxcL2FnZW50cyhcXC9bXi9dKyk/JC87XG4vKiogUGVyc2lzdGVkIGFwcHJvdmFsIGRpc2NvdmVyeSBmb3Igb25lIGFnZW50LiAqL1xuY29uc3QgQUdFTlRfU1VTUEVOREVEX1JVTlMgPSAvXlxcL2FnZW50c1xcL1teL10rXFwvc3VzcGVuZGVkLXJ1bnMkL2k7XG4vKiogT2ZmaWNpYWwgQUkgU0RLIFVJIHN0cmVhbSByb3V0ZSwgaW5jbHVkaW5nIGByZXN1bWVEYXRhYCBjb250aW51YXRpb25zLiAqL1xuY29uc3QgQUdFTlRfQ0hBVCA9IC9eXFwvY2hhdFxcL1teL10rJC9pO1xuLyoqIE5hdGl2ZSByZXNvdXJjZS1zY29wZWQgbWVtb3J5IHJlYWRzIHVzZWQgYnkgaGlzdG9yeSBhbmQgdGhlIHRocmVhZCBsaXN0LiAqL1xuY29uc3QgTUVNT1JZX1JFQUQgPSAvXlxcL21lbW9yeVxcL3RocmVhZHMoPzpcXC9bXi9dKyg/OlxcL21lc3NhZ2VzKT8pPyQvaTtcbi8qKiBOYXRpdmUgdGhyZWFkIHJlbmFtZS9kZWxldGUgcm91dGVzLiAqL1xuY29uc3QgTUVNT1JZX1RIUkVBRF9NVVRBVElPTiA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkc1xcL1teL10rJC9pO1xuXG4vKipcbiAqIFdoZXRoZXIgYSByZXF1ZXN0IHRvIHRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBzdWItYXBwIHNob3VsZCBiZVxuICogZGlzcGF0Y2hlZCwgZ2l2ZW4gdGhlIGNvbmZpZ3VyZWQge0BsaW5rIE1hc3RyYUFwaUdhdGVPcHRpb25zLmFjY2Vzc30uXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBwbHVnaW4ncyBjYXRjaC1hbGwgc2VlcywgZS5nLlxuICogYC9jaGF0L3hgLCBgL21lbW9yeS90aHJlYWRzYCwgYC9tY3AvLi4uYCkuIEluIGBcInNjb3BlZFwiYFxuICogbW9kZSB0aGUgYWxsb3dsaXN0IGlzIGRlbGliZXJhdGVseSB0aWdodCAtIHRoZSBjaGF0IGNsaWVudCBvbmx5IGV2ZXJcbiAqIG5lZWRzIGFnZW50IGluZmVyZW5jZSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCByZXNvdXJjZS1zY29wZWQgbWVtb3J5LFxuICogdGhpcyBwbHVnaW4ncyBvd24gYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKSBNQ1AuIFRoZSByZW1haW5pbmdcbiAqIGFkbWluLCBtdXRhdGluZywgYW5kIGJ1bGstZXhwb3J0IHN1cmZhY2Ugc3RheXMgZGVuaWVkIGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hc3RyYVJlcXVlc3RBbGxvd2VkKFxuICBtZXRob2Q6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuICBvcHRzOiBNYXN0cmFBcGlHYXRlT3B0aW9ucyxcbik6IGJvb2xlYW4ge1xuICBpZiAob3B0cy5hY2Nlc3MgPT09IFwiZnVsbFwiKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YDtcbiAgLy8gVGhlIHBsdWdpbidzIGAvcm91dGUvKmAgYWRkaXRpb25zIHZhbGlkYXRlIHRoZWlyIG93biBpbnB1dHMgYW5kIHRydXN0ZWRcbiAgLy8gQXBwS2l0IHJlcXVlc3QgY29udGV4dCBiZWZvcmUgcmVhY2hpbmcgcHJvZHVjdCBiZWhhdmlvci5cbiAgaWYgKHAgPT09IFwiL3JvdXRlXCIgfHwgcC5zdGFydHNXaXRoKFwiL3JvdXRlL1wiKSkgcmV0dXJuIHRydWU7XG4gIGlmIChvcHRzLm1jcEVuYWJsZWQgJiYgKHAgPT09IFwiL21jcFwiIHx8IHAuc3RhcnRzV2l0aChcIi9tY3AvXCIpKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG0gPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0NIQVQudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBBR0VOVF9JTkZFUkVOQ0UudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIkdFVFwiICYmIChBR0VOVF9NRVRBREFUQS50ZXN0KHApIHx8IEFHRU5UX1NVU1BFTkRFRF9SVU5TLnRlc3QocCkpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgTUVNT1JZX1JFQUQudGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmICgobSA9PT0gXCJQQVRDSFwiIHx8IG0gPT09IFwiREVMRVRFXCIpICYmIE1FTU9SWV9USFJFQURfTVVUQVRJT04udGVzdChwKSkgcmV0dXJuIHRydWU7XG4gIGlmIChtID09PSBcIlBPU1RcIiAmJiBwID09PSBcIi9tZW1vcnkvbWVzc2FnZXMvZGVsZXRlXCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogS2VlcCBNYXN0cmEgY3VzdG9tIEFQSSByb3V0ZXMgbW91bnQtcmVsYXRpdmUgd2hlbiB0aGUgRXhwcmVzcyBzdWJhcHAgaXNcbiAqIGhvc3RlZCB1bmRlciBBcHBLaXQncyBgL2FwaS88cGx1Z2luPmAgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFJvdXRlUGF0Y2hNaWRkbGV3YXJlKGFwcDogZXhwcmVzcy5FeHByZXNzKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGlzQ3VzdG9tUm91dGUgPVxuICAgICAgcmVxLnBhdGggPT09IFwiL2NoYXRcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9jaGF0L1wiKSB8fFxuICAgICAgcmVxLnBhdGggPT09IFwiL3JvdXRlXCIgfHxcbiAgICAgIHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpO1xuICAgIGlmICghaXNDdXN0b21Sb3V0ZSkgcmV0dXJuIG5leHQoKTtcbiAgICByZXEub3JpZ2luYWxVcmwgPSByZXEucGF0aDtcbiAgICBuZXh0KCk7XG4gIH0pO1xufVxuIl19
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsY0FBYyxHQUNmLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksSUFBSSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUczQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGVBQWUsRUFDZixvQkFBb0IsR0FHckIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFckQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCOzs7OztHQUtHO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sNEJBQTRCLEdBQUc7SUFDbkMsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLHFC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QUksRUFBRSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLEVBQUUsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXhwcmVzcy1sYXllciBwbHVtYmluZyBmb3IgdGhlIE1hc3RyYSBwbHVnaW46IGEgYE1hc3RyYVNlcnZlcmAgdGhhdFxuICogc3RhbXBzIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgIGFuZCBhIHNjb3BlZCBuYXRpdmUgQVBJIGdhdGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBoYXNoLCBodHRwLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGZlZWRiYWNrLCB0aHJlYWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQge1xuICBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLFxuICBNQVNUUkFfVEhSRUFEX0lEX0tFWSxcbiAgUmVxdWVzdENvbnRleHQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNYXN0cmFTZXJ2ZXIgYXMgRXhwcmVzc01hc3RyYVNlcnZlciB9IGZyb20gXCJAbWFzdHJhL2V4cHJlc3NcIjtcbmltcG9ydCB7IHRyYWNlIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQge1xuICBhdHRyaWJ1dGVkVXNlcklkLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgTUFTVFJBX1VTRVJfTkFNRV9LRVksXG4gIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcmVxdWVzdFVzZXJFbWFpbCwgcmVxdWVzdFVzZXJJZCB9IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5cbmltcG9ydCB7XG4gIGV4dHJhY3RNb2RlbE92ZXJyaWRlLFxuICBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLFxuICByZXNvbHZlU2VydmluZ0NvbmZpZyxcbn0gZnJvbSBcIi4vc2VydmluZy50c1wiO1xuLyoqXG4gKiBPcGVuVGVsZW1ldHJ5J3Mgc2VudGluZWwgZm9yIFwibm8gdmFsaWQgdHJhY2VcIiAtIDMyIHplcm8gaGV4IGNoYXJzLlxuICogYHRyYWNlLmdldEFjdGl2ZVNwYW4oKWAgcmV0dXJucyBhIG5vbi1yZWNvcmRpbmcgc3BhbiB3aXRoIHRoaXMgaWRcbiAqIHdoZW4gbm8gU0RLIGlzIHJlZ2lzdGVyZWQsIHdoaWNoIG11c3QgbmV2ZXIgYmUgc3VyZmFjZWQgYXMgYSB0cmFjZSB0b1xuICogYXR0YWNoIGZlZWRiYWNrIHRvLlxuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcbmNvbnN0IFRSVVNURURfUkVRVUVTVF9DT05URVhUX0tFWVMgPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9SRVFVRVNUX0lEX0tFWSxcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG5dIGFzIGNvbnN0O1xuXG4vKiogUmVtb3ZlIGJyb3dzZXItc3VwcGxpZWQgdmFsdWVzIGZvciBmaWVsZHMgb3duZWQgYnkgdHJ1c3RlZCBzZXJ2ZXIgbWlkZGxld2FyZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgVFJVU1RFRF9SRVFVRVNUX0NPTlRFWFRfS0VZUykge1xuICAgIHJlcXVlc3RDb250ZXh0LmRlbGV0ZVJhdyhrZXkpO1xuICB9XG59XG5cbi8qKlxuICogV2hvIGEgdHVybiBpcyBBVFRSSUJVVEVEIHRvLCBpbmRlcGVuZGVudCBvZiB3aGljaCBEYXRhYnJpY2tzIGNyZWRlbnRpYWwgcnVuc1xuICogaXRzIGNhbGxzLiBTdXBwbGllZCBieSB0aGUgSFRUUCBtaWRkbGV3YXJlIGZyb20gdGhlIGZvcndhcmRlZCB1c2VyIGhlYWRlcnMgc29cbiAqIHRoYXQgaW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIC0gd2hlcmUgZXZlcnkgcmVxdWVzdCBzaGFyZXMgdGhlIGFwcCBTUCdzXG4gKiBjbGllbnQgLSB0aGUgbWVtb3J5IHRocmVhZCwgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdHJhY2UgbWV0YWRhdGFcbiAqIHN0aWxsIGtleSBvZmYgdGhlIHJlYWwgY2FsbGVyLiBJZ25vcmVkIGluIGFuIE9CTyAodXNlcikgY29udGV4dCwgd2hvc2Ugb3duXG4gKiB1c2VyIGlkIC8gZW1haWwgYXJlIGF1dGhvcml0YXRpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXR0cmlidXRlZElkZW50aXR5IHtcbiAgLyoqIEZvcndhcmRlZCBgeC1mb3J3YXJkZWQtdXNlcmAgaWQsIHVzZWQgd2hlbiB0aGUgY2xpZW50IGlzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gKi9cbiAgdXNlcklkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogRm9yd2FyZGVkIGB4LWZvcndhcmRlZC1lbWFpbGAsIHVzZWQgZm9yIHRyYWNlIG1ldGFkYXRhIHVuZGVyIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gKi9cbiAgZW1haWw/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RhbXAgdGhlIEFwcEtpdCB1c2VyIChwbHVzIHRoZSByZXNvdXJjZSBpZCBhbmQgdHJhY2UgbWV0YWRhdGEpIG9udG9cbiAqIGByZXF1ZXN0Q29udGV4dGAuXG4gKlxuICogU3BsaXQgb3V0IG9mIHtAbGluayBNYXN0cmFTZXJ2ZXJ9IGJlY2F1c2UgdGhlIEhUVFAgbWlkZGxld2FyZSBpcyBub3QgdGhlIG9ubHlcbiAqIGNhbGxlciB0aGF0IG5lZWRzIGl0OiBhbiBvdXQtb2YtYmFuZCB0dXJuIChhIFRlYW1zIGFjdGl2aXR5IGFycml2aW5nIG9uXG4gKiBhbm90aGVyIHBsdWdpbidzIHJvdXRlLCBhIHNjaGVkdWxlZCBqb2IpIGRyaXZlcyBgYWdlbnQuZ2VuZXJhdGVgIGRpcmVjdGx5LCBhbmRcbiAqIHdpdGhvdXQgdGhpcyBzdGFtcCBldmVyeSB1c2VyLXNjb3BlZCB0b29sIC0gYGFza19nZW5pZWAgYWJvdmUgYWxsIC0gZmFpbHMgd2l0aFxuICogXCJpbnZva2UgdGhlIHRvb2wgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgbWFzdHJhIHBsdWdpblwiLiBUaG9zZVxuICogY2FsbGVycyBidWlsZCBhIGNvbnRleHQgd2l0aCB7QGxpbmsgY3JlYXRlUmVxdWVzdENvbnRleHR9IGluc3RlYWQgb2YgYVxuICogcmVxdWVzdC5cbiAqXG4gKiBUaGUgRGF0YWJyaWNrcyBjcmVkZW50aWFsIGFsd2F5cyBjb21lcyBmcm9tIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0O1xuICogYGF0dHJpYnV0ZWRgIG9ubHkgY2hhbmdlcyBXSE8gdGhlIHR1cm4gaXMgYXR0cmlidXRlZCB0byB3aGVuIHRoYXQgY29udGV4dCBpc1xuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIChzZWUge0BsaW5rIEF0dHJpYnV0ZWRJZGVudGl0eX0pLlxuICpcbiAqIElkZW1wb3RlbnQ6IHJldHVybnMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgdXNlciBhbmQgcmVzb3VyY2UgaWQgYXJlIGFscmVhZHlcbiAqIHByZXNlbnQsIHNvIHRoZSBtaWRkbGV3YXJlIGNhbiBjYWxsIGl0IG92ZXIgYSBjb250ZXh0IGFub3RoZXIgbGF5ZXIgc3RhbXBlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YW1wUmVxdWVzdENvbnRleHRVc2VyKFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsXG4gIGF0dHJpYnV0ZWQ6IEF0dHJpYnV0ZWRJZGVudGl0eSA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChbTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZXS5ldmVyeSgoa2V5KSA9PiByZXF1ZXN0Q29udGV4dC5nZXQoa2V5KSkpIHJldHVybjtcbiAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaXNVc2VyQ29udGV4dCA9IFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQ7XG4gIC8vIFRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwgaXMgYWx3YXlzIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0J3MgY2xpZW50XG4gIC8vIChPQk8gaW4gYSB1c2VyIGNvbnRleHQsIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCBvdGhlcndpc2UpLiBXSE8gdGhlIHR1cm4gaXNcbiAgLy8gYXR0cmlidXRlZCB0byBjYW4gZGlmZmVyOiBpbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgZXZlcnkgcmVxdWVzdCBzaGFyZXNcbiAgLy8gdGhlIFNQIGNsaWVudCwgYnV0IHRoZSBmb3J3YXJkZWQgdXNlciBpZCBtdXN0IHN0aWxsIGtleSB0aGUgbWVtb3J5IHRocmVhZFxuICAvLyBhbmQgdGhlIHBlci11c2VyIGNhY2hlIG5hbWVzcGFjZSBzbyB0d28gY2FsbGVycyBkb24ndCBzaGFyZSBhIGNvbnZlcnNhdGlvbi5cbiAgY29uc3QgdXNlcjogVXNlciA9IHtcbiAgICBpZDogYXR0cmlidXRlZFVzZXJJZChleGVjdXRpb25Db250ZXh0LCBhdHRyaWJ1dGVkLnVzZXJJZCksXG4gICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9VU0VSX0tFWSwgdXNlcik7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCB1c2VyLmlkKTtcbiAgLy8gQXBwS2l0J3MgYFVzZXJDb250ZXh0YCBzdXJmYWNlcyBkaXNwbGF5IG5hbWUgLyBlbWFpbCBvbmx5IG9uXG4gIC8vIE9CTyByZXF1ZXN0cy4gU2VydmljZS1jb250ZXh0IGNhbGxzIChiYWNrZ3JvdW5kIHRhc2tzLCBzZXJ2ZXJcbiAgLy8gc3RhcnQtdXApIGxlYXZlIHRoZXNlIHVuZGVmaW5lZCBhbmQgd2Ugc2tpcCB0aGUgc3RhbXAgc29cbiAgLy8gZG93bnN0cmVhbSB0cmFjZSBtZXRhZGF0YSBzdGF5cyBhYnNlbnQgcmF0aGVyIHRoYW4gZW1wdHkuIEluXG4gIC8vIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgZm9yd2FyZGVkIGVtYWlsIHN0aWxsIGlkZW50aWZpZXMgdGhlIGNhbGxlcixcbiAgLy8gc28gaXQgaXMgdXNlZCBmb3IgdHJhY2UgbWV0YWRhdGEgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgU1AuXG4gIGxldCB1c2VyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGF0dHJpYnV0ZWQuZW1haWw7XG4gIGlmIChpc1VzZXJDb250ZXh0KSB7XG4gICAgdXNlck5hbWUgPSBleGVjdXRpb25Db250ZXh0LnVzZXJOYW1lO1xuICAgIGVtYWlsID0gZXhlY3V0aW9uQ29udGV4dC51c2VyRW1haWwgPz8gZW1haWw7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgZXhlY3V0aW9uQ29udGV4dC5jbGllbnQuY3VycmVudFVzZXIubWUoKTtcbiAgICB1c2VyTmFtZSA9IGN1cnJlbnRVc2VyPy51c2VyTmFtZTtcbiAgICBlbWFpbCA9IGN1cnJlbnRVc2VyPy5lbWFpbHM/LmZpbHRlcigoZW1haWwpID0+IGVtYWlsLnByaW1hcnkpLmZpbmQoKGVtYWlsKSA9PiBlbWFpbC52YWx1ZSlcbiAgICAgID8udmFsdWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmICh1c2VyTmFtZSkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9OQU1FX0tFWSwgdXNlck5hbWUpO1xuICB9XG4gIGlmIChlbWFpbCkge1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfVVNFUl9FTUFJTF9LRVksIGVtYWlsKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgUmVxdWVzdENvbnRleHRgIGEgTk9OLUhUVFAgYWdlbnQgdHVybiBuZWVkcy5cbiAqXG4gKiBFdmVyeXRoaW5nIE1hc3RyYSdzIHRvb2xzIHJlYWQgb2ZmIHRoZSBjb250ZXh0IGlzIHN0YW1wZWQgdGhlIHNhbWUgd2F5IHRoZVxuICogcmVxdWVzdCBtaWRkbGV3YXJlIHN0YW1wcyBpdCAtIHRoZSBBcHBLaXQgdXNlciAoc28gYGFza19nZW5pZWAgYW5kIHRoZSBtb2RlbFxuICogcmVzb2x2ZXIgY2FuIG1pbnQgdXNlci1zY29wZWQgdG9rZW5zKSwgdGhlIG1lbW9yeSB0aHJlYWQgLyByZXNvdXJjZSBwYWlyLCBhbmRcbiAqIGEgcmVxdWVzdCBpZCBzbyB0aGUgdHVybidzIHNwYW5zIGpvaW4gdXAgaW4gdHJhY2VzLiBUaGUgcmVzdWx0IGlzIHBhc3NlZCBhc1xuICogYHJlcXVlc3RDb250ZXh0YCB0byBgYWdlbnQuZ2VuZXJhdGVgIC8gYGFnZW50LnN0cmVhbWAuXG4gKlxuICogVGhpcyBpcyB3aGF0IG1ha2VzIGEgY2FyZCB0dXJuIGFuc3dlciB3aXRoIHRoZSBTQU1FIGRhdGEgYSBjaGF0IHR1cm4gZG9lczogdGhlXG4gKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgaXMgcHJlc2VudGF0aW9uLCBub3QgY2FwYWJpbGl0eS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICBvcHRpb25zOiB7IHRocmVhZElkPzogc3RyaW5nOyByZXNvdXJjZUlkPzogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmcgfSA9IHt9LFxuKTogUHJvbWlzZTxSZXF1ZXN0Q29udGV4dD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICBhd2FpdCBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcihyZXF1ZXN0Q29udGV4dCk7XG4gIGlmIChvcHRpb25zLnRocmVhZElkKSByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIG9wdGlvbnMudGhyZWFkSWQpO1xuICAvLyBTdGFtcGVkIEFGVEVSIHRoZSB1c2VyIHNvIGFuIGV4cGxpY2l0IHJlc291cmNlIGlkIChhIGNoYW5uZWwgbWVtYmVyLCBzYXkpXG4gIC8vIHdpbnMgb3ZlciB0aGUgYW1iaWVudCBpZGVudGl0eSBgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXJgIGRlZmF1bHRlZCB0by5cbiAgaWYgKG9wdGlvbnMucmVzb3VyY2VJZCkgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksIG9wdGlvbnMucmVzb3VyY2VJZCk7XG4gIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIG9wdGlvbnMucmVxdWVzdElkID8/IGhhc2guaWQoKSk7XG4gIHJldHVybiByZXF1ZXN0Q29udGV4dDtcbn1cblxuLyoqXG4gKiBgQG1hc3RyYS9leHByZXNzYCBzdWJjbGFzcyB0aGF0IHN0YW1wcyBgUmVxdWVzdENvbnRleHRgIHdpdGggdGhlXG4gKiBBcHBLaXQgdXNlciwgcmVzb3VyY2UgaWQsIGFuZCBhIHRocmVhZCBpZCBiYWNrZWQgYnkgYW4gSFRUUC1vbmx5XG4gKiBzZXNzaW9uIGNvb2tpZSAoYGFwcGtpdF88cGx1Z2luLW5hbWU+X3Nlc3Npb25faWRgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVNlcnZlciBleHRlbmRzIEV4cHJlc3NNYXN0cmFTZXJ2ZXIge1xuICBwcml2YXRlIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3RhbXAgdGhlIE1MZmxvdyB0cmFjZS1pZCBoZWFkZXIgb24gcmVzcG9uc2VzLiBTaGFyZXMgdGhlXG4gICAqIHBsdWdpbidzIGZlZWRiYWNrIGdhdGUgdmlhIHtAbGluayByZXNvbHZlRmVlZGJhY2tFbmFibGVkfS5cbiAgICovXG4gIHByaXZhdGUgZmVlZGJhY2tFbmFibGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBFeHByZXNzTWFzdHJhU2VydmVyPlxuICApIHtcbiAgICBzdXBlciguLi5hcmdzKTtcbiAgICB0aGlzLmxvZyA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgICB0aGlzLmZlZWRiYWNrRW5hYmxlZCA9IHJlc29sdmVGZWVkYmFja0VuYWJsZWQoY29uZmlnLmZlZWRiYWNrKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlZ2lzdGVyQXV0aE1pZGRsZXdhcmUoKTogdm9pZCB7XG4gICAgc3VwZXIucmVnaXN0ZXJBdXRoTWlkZGxld2FyZSgpO1xuICAgIHRoaXMuYXBwLnVzZShhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVzLmxvY2Fscy5yZXF1ZXN0Q29udGV4dCEgYXMgUmVxdWVzdENvbnRleHQ7XG4gICAgICBjbGVhclRydXN0ZWRSZXF1ZXN0Q29udGV4dChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0VXNlcihyZXEsIHJlcXVlc3RDb250ZXh0KTtcbiAgICAgIHRoaXMuY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChyZXEsIHJlcywgcmVxdWVzdENvbnRleHQpO1xuICAgICAgdGhpcy5jb25maWd1cmVSZXF1ZXN0Q29udGV4dE1vZGVsT3ZlcnJpZGUocmVxLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0UmVxdWVzdElkKHJlcSwgcmVzLCByZXF1ZXN0Q29udGV4dCk7XG4gICAgICB0aGlzLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzKHJlcSwgcmVxdWVzdENvbnRleHQpO1xuXG4gICAgICB0aGlzLmNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKFwiYXV0aDptaWRkbGV3YXJlXCIsIHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgcmVxdWVzdElkOiByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1JFUVVFU1RfSURfS0VZKSxcbiAgICAgICAgdGhyZWFkSWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVEhSRUFEX0lEX0tFWSksXG4gICAgICAgIHJlc291cmNlSWQ6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSxcbiAgICAgICAgdXNlck5hbWU6IHJlcXVlc3RDb250ZXh0LmdldChNQVNUUkFfVVNFUl9OQU1FX0tFWSksXG4gICAgICAgIHVzZXJFbWFpbDogcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSksXG4gICAgICAgIG1vZGVsT3ZlcnJpZGU6IHJlcXVlc3RDb250ZXh0LmdldChcbiAgICAgICAgICAvLyBpbXBvcnRlZCBiZWxvdzsgbG9nZ2VkIHNvIGEgbWlzcm91dGVkIHJlcXVlc3Qgc2hvd3NcbiAgICAgICAgICAvLyB1cCBhbG9uZ3NpZGUgaXRzIG1vZGVsIHNlbGVjdGlvbiBpbiBgTE9HX0xFVkVMPWRlYnVnYC5cbiAgICAgICAgICBcIm1hc3RyYV9fbW9kZWxfb3ZlcnJpZGVcIixcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY29uZmlndXJlUmVxdWVzdENvbnRleHRVc2VyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpIHtcbiAgICAvLyBQYXNzIHRoZSBmb3J3YXJkZWQgY2FsbGVyIGlkZW50aXR5IHNvIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSBzdGlsbCBrZXlzXG4gICAgLy8gbWVtb3J5IC8gY2FjaGUgLyB0cmFjZXMgcGVyIHVzZXIgZXZlbiB0aG91Z2ggdGhlIGNsaWVudCBpcyB0aGUgYXBwIFNQLlxuICAgIC8vIEluIGFuIE9CTyBjb250ZXh0IHRoZXNlIGFyZSBpZ25vcmVkIGluIGZhdm9yIG9mIHRoZSBjb250ZXh0J3Mgb3duIHVzZXIuXG4gICAgYXdhaXQgc3RhbXBSZXF1ZXN0Q29udGV4dFVzZXIocmVxdWVzdENvbnRleHQsIHtcbiAgICAgIHVzZXJJZDogcmVxdWVzdFVzZXJJZChyZXEpLFxuICAgICAgZW1haWw6IHJlcXVlc3RVc2VyRW1haWwocmVxKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCBhIHBlci1yZXF1ZXN0IGlkIGFuZCBlY2hvIGl0IG9uIHRoZSByZXNwb25zZSBzbyBhbiB1cHN0cmVhbVxuICAgKiBwcm94eSAvIGN1cmwgY2xpZW50IC8gYnJvd3Nlci1zaWRlIGxvZyBsaW5lIGNhbiBwYWlyIGl0cyB2aWV3IG9mXG4gICAqIHRoZSByZXF1ZXN0IHdpdGggdGhlIG1hdGNoaW5nIHRyYWNlIHNwYW4uIFJldXNlcyBgWC1SZXF1ZXN0LUlkYFxuICAgKiB3aGVuIHRoZSB1cHN0cmVhbSBhbHJlYWR5IHN1cHBsaWVzIG9uZSBzbyBtdWx0aS1ob3AgdHJhY2VzIHN0YXlcbiAgICogam9pbmVkOyBvdGhlcndpc2UgbWludHMgYSBVVUlEdjQuXG4gICAqXG4gICAqIFRoZSBpZCBpcyBzdXJmYWNlZCBhcyBgbWFzdHJhX19yZXF1ZXN0SWRgIHNwYW4gbWV0YWRhdGEgdmlhXG4gICAqIHtAbGluayBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZU30gYW5kIGFzIHRoZSBgWC1SZXF1ZXN0LUlkYFxuICAgKiByZXNwb25zZSBoZWFkZXIgc28gZGV2IHRvb2xzIGNhbiBjb3B5IGl0IGZyb20gZWl0aGVyIHNpZGUuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFJlcXVlc3RJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9SRVFVRVNUX0lEX0tFWSkpIHJldHVybjtcbiAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IHJlcS5oZWFkZXJzW1wieC1yZXF1ZXN0LWlkXCJdO1xuICAgIGNvbnN0IHVwc3RyZWFtID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHVwc3RyZWFtPy50cmltKCkgfHwgaGFzaC5pZCgpO1xuICAgIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfUkVRVUVTVF9JRF9LRVksIHJlcXVlc3RJZCk7XG4gICAgcmVzLnNldEhlYWRlcihcIlgtUmVxdWVzdC1JZFwiLCByZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YW1wIE9BdXRoIHNjb3BlcyBmcm9tIHRoZSBmb3J3YXJkZWQgYWNjZXNzIHRva2VuIG9uXG4gICAqIHtAbGluayBNQVNUUkFfU0NPUEVTX0tFWX0gZm9yIHdvcmtzcGFjZSBtb3VudCBnYXRpbmcuXG4gICAqL1xuICBjb25maWd1cmVSZXF1ZXN0Q29udGV4dFNjb3BlcyhyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgY29uc3Qgc2NvcGVzID0gW1xuICAgICAgLi4ub2JqZWN0XG4gICAgICAgIC5zZXF1ZW5jZSh0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEpLCB0b2tlbi5nZXRBY2Nlc3NUb2tlblNjb3BlcyhyZXEsIFwiYXV0aG9yaXphdGlvblwiKSlcbiAgICAgICAgLmRpc3RpbmN0KCksXG4gICAgXTtcbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1NDT1BFU19LRVksIHNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIHR1cm4ncyBNTGZsb3cgdHJhY2UgaWQgb24gdGhlIHJlc3BvbnNlIHNvIHRoZSBjaGF0IGNsaWVudFxuICAgKiBjYW4gYXR0YWNoIHRodW1icyAvIGNvbW1lbnQgZmVlZGJhY2sgdG8gaXQgbGF0ZXIuIE1MZmxvdyBkZXJpdmVzXG4gICAqIGl0cyB0cmFjZSBpZCBmcm9tIHRoZSBPcGVuVGVsZW1ldHJ5IHRyYWNlIGlkIChgdHItPGhleD5gKSwgYW5kIGV2ZXJ5XG4gICAqIE1hc3RyYSBzcGFuIGZvciB0aGlzIHJlcXVlc3QgaW5oZXJpdHMgdGhlIGFtYmllbnQgT1RlbCBjb250ZXh0IChzZWVcbiAgICogYG9ic2VydmFiaWxpdHkudHNgKSwgc28gdGhlIGFjdGl2ZSBzcGFuJ3MgdHJhY2UgaWQgaGVyZSBpcyB0aGUgaWRcbiAgICogTUxmbG93IHdpbGwgcmVjb3JkIGZvciB0aGUgdHVybi5cbiAgICpcbiAgICogTm8tb3AgdW5sZXNzIGZlZWRiYWNrIGlzIGVuYWJsZWQsIGFuZCB3aGVuIG5vIGxpdmUgT1RlbCBzcGFuIGlzXG4gICAqIGFjdGl2ZSAoZS5nLiB0aGUgT1RMUCBTREsgaXNuJ3QgcmVnaXN0ZXJlZCk6IGluIHRoYXQgY2FzZSB0aGUgaGVhZGVyXG4gICAqIGlzIHNpbXBseSBhYnNlbnQgYW5kIHRoZSBjbGllbnQgaGlkZXMgZmVlZGJhY2sgZm9yIHRoYXQgbWVzc2FnZSxcbiAgICogZGVncmFkaW5nIGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW1pdHRpbmcgYSBib2d1cyB0cmFjZSBpZC5cbiAgICovXG4gIGNvbmZpZ3VyZU1sZmxvd1RyYWNlSWQocmVzOiBleHByZXNzLlJlc3BvbnNlKSB7XG4gICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCB8fCByZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICBjb25zdCB0cmFjZUlkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gICAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgICByZXMuc2V0SGVhZGVyKGZlZWRiYWNrLk1MRkxPV19UUkFDRV9JRF9IRUFERVIsIGB0ci0ke3RyYWNlSWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgdGhyZWFkIGlkIHRoaXMgcmVxdWVzdCB0YXJnZXRzIGFuZCBwaW4gaXQgb25cbiAgICogYFJlcXVlc3RDb250ZXh0YCAoY29uc3VtZWQgYnkgdGhlIGFnZW50IHN0cmVhbSBmb3IgcGVyc2lzdGVuY2UgYW5kXG4gICAqIGJ5IG5hdGl2ZSBtZW1vcnkgcm91dGVzKS4gUmVzb2x1dGlvbiBvcmRlcjpcbiAgICpcbiAgICogICAxLiBBIGNsaWVudC1zdXBwbGllZCB0aHJlYWQgaWQgKHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciAvXG4gICAqICAgICAgYD90aHJlYWRJZD1gIHF1ZXJ5KS4gVGhpcyBpcyBob3cgdGhlIGNoYXQgVUkgcmVmZXJlbmNlcyBhXG4gICAqICAgICAgc3BlY2lmaWMgY29udmVyc2F0aW9uIGFtb25nIHRoZSBtYW55IGEgdXNlciBvd25zIC0gaXQgcGlja3MgYVxuICAgKiAgICAgIHRocmVhZCBpZCBmcm9tIHRoZSBgL3RocmVhZHNgIGxpc3RpbmcgKG9yIG1pbnRzIG9uZSBmb3IgYSBuZXdcbiAgICogICAgICBjb252ZXJzYXRpb24pIGFuZCBzdGFtcHMgaXQgaGVyZS4gVGhlIGlkIGlzIHNjb3BlZCB0byB0aGVcbiAgICogICAgICBjYWxsZXIncyByZXNvdXJjZSBieSB0aGUgcmVjYWxsIC8gbGlzdCByb3V0ZXMsIHNvIGEgY2xpZW50XG4gICAqICAgICAgY2FuIG9ubHkgZXZlciByZWFkIG9yIHdyaXRlIGl0cyBvd24gdGhyZWFkcy5cbiAgICogICAyLiBUaGUgcGVyLXNlc3Npb24gY29va2llIChgYXBwa2l0XzxwbHVnaW4tbmFtZT5fc2Vzc2lvbl9pZGApLFxuICAgKiAgICAgIG1pbnRlZCBvbiBmaXJzdCBjb250YWN0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHNpbmdsZS10aHJlYWRcbiAgICogICAgICBmYWxsYmFjayBmb3IgY2xpZW50cyB0aGF0IGRvbid0IG1hbmFnZSB0aHJlYWRzIGV4cGxpY2l0bHksIHNvXG4gICAqICAgICAgZXhpc3RpbmcgZW1iZWRzIGtlZXAgb25lIHN0YWJsZSBjb252ZXJzYXRpb24gcGVyIHNlc3Npb24gd2l0aFxuICAgKiAgICAgIG5vIGNsaWVudCBjaGFuZ2VzLlxuICAgKi9cbiAgY29uZmlndXJlUmVxdWVzdENvbnRleHRUaHJlYWRJZChcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0LFxuICApIHtcbiAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSkgcmV0dXJuO1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IHRoaXMucmVhZFJlcXVlc3RlZFRocmVhZElkKHJlcSk7XG4gICAgaWYgKHJlcXVlc3RlZCkge1xuICAgICAgcmVxdWVzdENvbnRleHQuc2V0KE1BU1RSQV9USFJFQURfSURfS0VZLCByZXF1ZXN0ZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb29raWVzID0gaHR0cC5wYXJzZUNvb2tpZXMocmVxLmhlYWRlcnMuY29va2llKTtcbiAgICBjb25zdCBjb29raWVOYW1lID0gc3RyaW5nVXRpbHMudG9JZGVudGlmaWVyV2l0aE9wdGlvbnMoXG4gICAgICB7IGRlbGltaXRlcjogXCJfXCIsIGRpc3RpbmN0OiB0cnVlIH0sXG4gICAgICBcImFwcGtpdFwiLFxuICAgICAgdGhpcy5jb25maWcubmFtZSEsXG4gICAgICBcInNlc3Npb25JZFwiLFxuICAgICk7XG4gICAgbGV0IHNlc3Npb25JZCA9IGNvb2tpZXNbY29va2llTmFtZV07XG4gICAgaWYgKCFzZXNzaW9uSWQpIHtcbiAgICAgIHNlc3Npb25JZCA9IGhhc2guaWQoKTtcbiAgICAgIHJlcy5jb29raWUoY29va2llTmFtZSwgc2Vzc2lvbklkLCB7XG4gICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICBzYW1lU2l0ZTogXCJsYXhcIixcbiAgICAgICAgc2VjdXJlOiByZXEuc2VjdXJlLFxuICAgICAgICBwYXRoOiBcIi9cIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXF1ZXN0Q29udGV4dC5zZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVksIHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgY2xpZW50LXNlbGVjdGVkIHRocmVhZCBpZCBmcm9tIHRoZSByZXF1ZXN0LCBwcmVmZXJyaW5nXG4gICAqIHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciBvdmVyIHRoZSBgP3RocmVhZElkPWAgcXVlcnkuIFJldHVybnNcbiAgICogYG51bGxgIHdoZW4gbmVpdGhlciBjYXJyaWVzIGEgbm9uLWVtcHR5IHZhbHVlIHNvIHRoZSBjYWxsZXIgZmFsbHNcbiAgICogYmFjayB0byB0aGUgc2Vzc2lvbiBjb29raWUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRSZXF1ZXN0ZWRUaHJlYWRJZChyZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gcmVxLmhlYWRlcnNbdGhyZWFkLlRIUkVBRF9JRF9IRUFERVJdO1xuICAgIGNvbnN0IHF1ZXJ5VmFsdWUgPSByZXEucXVlcnlbdGhyZWFkLlRIUkVBRF9JRF9RVUVSWV07XG4gICAgcmV0dXJuIChcbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSkgPyBoZWFkZXJWYWx1ZVswXSA6IGhlYWRlclZhbHVlKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChBcnJheS5pc0FycmF5KHF1ZXJ5VmFsdWUpID8gcXVlcnlWYWx1ZVswXSA6IHF1ZXJ5VmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0TW9kZWxPdmVycmlkZShyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0KSB7XG4gICAgLy8gUGVyLXJlcXVlc3QgbW9kZWwgb3ZlcnJpZGU6IG9ubHkgaG9ub3JlZCB3aGVuIHRoZSBwbHVnaW5cbiAgICAvLyBvcHRzIGluIChkZWZhdWx0KS4gU291cmNlcywgaW4gcHJpb3JpdHkgb3JkZXIsIGFyZVxuICAgIC8vIGBYLU1hc3RyYS1Nb2RlbGAgaGVhZGVyLCBgP21vZGVsPWAgcXVlcnksIGFuZCBgbW9kZWxgIC9cbiAgICAvLyBgbW9kZWxJZGAgYm9keSBmaWVsZDsgc2VlIGBzZXJ2aW5nLnRzYC5cbiAgICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcodGhpcy5jb25maWcpO1xuICAgIGlmIChzZXJ2aW5nLmFsbG93T3ZlcnJpZGUpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gZXh0cmFjdE1vZGVsT3ZlcnJpZGUoe1xuICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4sXG4gICAgICAgIHF1ZXJ5OiByZXEucXVlcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgICAgfSk7XG4gICAgICBpZiAob3ZlcnJpZGUpIHJlcXVlc3RDb250ZXh0LnNldChNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZLCBvdmVycmlkZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBJbnB1dHMgZm9yIHtAbGluayBpc01hc3RyYVJlcXVlc3RBbGxvd2VkfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhQXBpR2F0ZU9wdGlvbnMge1xuICAvKiogYGNvbmZpZy5hcGlBY2Nlc3NgOyBgXCJmdWxsXCJgIHNob3J0LWNpcmN1aXRzIHRvIGFsbG93IGV2ZXJ5dGhpbmcuICovXG4gIGFjY2VzczogXCJzY29wZWRcIiB8IFwiZnVsbFwiO1xuICAvKiogV2hldGhlciB0aGUgTUNQIHRyYW5zcG9ydCBpcyBtb3VudGVkIChzbyBgL21jcC8qYCBpcyBsZWdpdGltYXRlKS4gKi9cbiAgbWNwRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNb3VudC1yZWxhdGl2ZSBhZ2VudCBpbmZlcmVuY2UgcGF0aHMgKGAvYWdlbnRzLzppZC88dmVyYj4uLi5gKS4gTWF0Y2hlZFxuICogYnkgcHJlZml4IG9uIHRoZSB2ZXJiIHNvIGZ1dHVyZSB2YXJpYW50cyAoYHN0cmVhbVZOZXh0YCwgYHN0cmVhbS92bmV4dGAsXG4gKiBgZ2VuZXJhdGVWTmV4dGApIHN0YXkgY292ZXJlZCB3aXRob3V0IGEgY29kZSBjaGFuZ2UuXG4gKlxuICogQ292ZXJzIHRoZSBwbGFpbiBpbmZlcmVuY2UgdmVyYnMgKGBzdHJlYW1gIC8gYGdlbmVyYXRlYCAvIGBuZXR3b3JrYCkgcGx1c1xuICogdGhlIGh1bWFuLWluLXRoZS1sb29wIHJlc3VtZSB2ZXJicyBhIHBhdXNlZCBgcmVxdWlyZUFwcHJvdmFsYCB0b29sIG5lZWRzXG4gKiB0byBjb250aW51ZTogYGFwcHJvdmUtdG9vbC1jYWxsYCAvIGBkZWNsaW5lLXRvb2wtY2FsbGAgKHN0cmVhbWluZywgYW5kIHZpYVxuICogcHJlZml4IHRoZWlyIGAtZ2VuZXJhdGVgIG5vbi1zdHJlYW1pbmcgdmFyaWFudHMpLCB0aGUgYC1uZXR3b3JrLWAgdmFyaWFudHMsXG4gKiBhbmQgYHJlc3VtZS1zdHJlYW1gIChjb3ZlcnMgYHJlc3VtZS1zdHJlYW0tdW50aWwtaWRsZWApLiBXaXRob3V0IHRoZXNlIGFuXG4gKiBhcHByb3ZhbC1nYXRlZCB0b29sIChlLmcuIGBzZW5kX2VtYWlsYCkgY2FuIGJlIHJlcXVlc3RlZCBidXQgbmV2ZXIgYXBwcm92ZWRcbiAqIGZyb20gdGhlIGJyb3dzZXIgLSB0aGUgcmVzdW1lIGBQT1NUYCA0MDNzIHVuZGVyIHNjb3BlZCBtb2RlLiBUb2dldGhlciB3aXRoXG4gKiB0aGUgcmVzb3VyY2Utc2NvcGVkIG1lbW9yeSBtdXRhdGlvbnMgYmVsb3csIHRoZXNlIGFyZSB0aGUgb25seSBzdG9jayBNYXN0cmFcbiAqIHdyaXRlcyB0aGUgYnJvd3NlciBjbGllbnQgY2FuIG1ha2UuXG4gKi9cbmNvbnN0IEFHRU5UX0lORkVSRU5DRSA9XG4gIC9eXFwvYWdlbnRzXFwvW14vXStcXC8oc3RyZWFtfGdlbmVyYXRlfG5ldHdvcmt8cmVzdW1lLXN0cmVhbXxhcHByb3ZlLXRvb2wtY2FsbHxkZWNsaW5lLXRvb2wtY2FsbHxhcHByb3ZlLW5ldHdvcmstdG9vbC1jYWxsfGRlY2xpbmUtbmV0d29yay10b29sLWNhbGwpL2k7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEgKGAvYWdlbnRzYCwgYC9hZ2VudHMvOmlkYCkuICovXG5jb25zdCBBR0VOVF9NRVRBREFUQSA9IC9eXFwvYWdlbnRzKFxcL1teL10rKT8kLztcbi8qKiBQZXJzaXN0ZWQgYXBwcm92YWwgZGlzY292ZXJ5IGZvciBvbmUgYWdlbnQuICovXG5jb25zdCBBR0VOVF9TVVNQRU5ERURfUlVOUyA9IC9eXFwvYWdlbnRzXFwvW14vXStcXC9zdXNwZW5kZWQtcnVucyQvaTtcbi8qKiBPZmZpY2lhbCBBSSBTREsgVUkgc3RyZWFtIHJvdXRlLCBpbmNsdWRpbmcgYHJlc3VtZURhdGFgIGNvbnRpbnVhdGlvbnMuICovXG5jb25zdCBBR0VOVF9DSEFUID0gL15cXC9jaGF0XFwvW14vXSskL2k7XG4vKiogTmF0aXZlIHJlc291cmNlLXNjb3BlZCBtZW1vcnkgcmVhZHMgdXNlZCBieSBoaXN0b3J5IGFuZCB0aGUgdGhyZWFkIGxpc3QuICovXG5jb25zdCBNRU1PUllfUkVBRCA9IC9eXFwvbWVtb3J5XFwvdGhyZWFkcyg/OlxcL1teL10rKD86XFwvbWVzc2FnZXMpPyk/JC9pO1xuLyoqIE5hdGl2ZSB0aHJlYWQgcmVuYW1lL2RlbGV0ZSByb3V0ZXMuICovXG5jb25zdCBNRU1PUllfVEhSRUFEX01VVEFUSU9OID0gL15cXC9tZW1vcnlcXC90aHJlYWRzXFwvW14vXSskL2k7XG5cbi8qKlxuICogV2hldGhlciBhIHJlcXVlc3QgdG8gdGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1Yi1hcHAgc2hvdWxkIGJlXG4gKiBkaXNwYXRjaGVkLCBnaXZlbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgTWFzdHJhQXBpR2F0ZU9wdGlvbnMuYWNjZXNzfS5cbiAqXG4gKiBgcGF0aGAgaXMgbW91bnQtcmVsYXRpdmUgKHdoYXQgdGhlIHBsdWdpbidzIGNhdGNoLWFsbCBzZWVzLCBlLmcuXG4gKiBgL2NoYXQveGAsIGAvbWVtb3J5L3RocmVhZHNgLCBgL21jcC8uLi5gKS4gSW4gYFwic2NvcGVkXCJgXG4gKiBtb2RlIHRoZSBhbGxvd2xpc3QgaXMgZGVsaWJlcmF0ZWx5IHRpZ2h0IC0gdGhlIGNoYXQgY2xpZW50IG9ubHkgZXZlclxuICogbmVlZHMgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHJlc291cmNlLXNjb3BlZCBtZW1vcnksXG4gKiB0aGlzIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUC4gVGhlIHJlbWFpbmluZ1xuICogYWRtaW4sIG11dGF0aW5nLCBhbmQgYnVsay1leHBvcnQgc3VyZmFjZSBzdGF5cyBkZW5pZWQgYnkgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQoXG4gIG1ldGhvZDogc3RyaW5nLFxuICBwYXRoOiBzdHJpbmcsXG4gIG9wdHM6IE1hc3RyYUFwaUdhdGVPcHRpb25zLFxuKTogYm9vbGVhbiB7XG4gIGlmIChvcHRzLmFjY2VzcyA9PT0gXCJmdWxsXCIpIHJldHVybiB0cnVlO1xuICBjb25zdCBwID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAvLyBUaGUgcGx1Z2luJ3MgYC9yb3V0ZS8qYCBhZGRpdGlvbnMgdmFsaWRhdGUgdGhlaXIgb3duIGlucHV0cyBhbmQgdHJ1c3RlZFxuICAvLyBBcHBLaXQgcmVxdWVzdCBjb250ZXh0IGJlZm9yZSByZWFjaGluZyBwcm9kdWN0IGJlaGF2aW9yLlxuICBpZiAocCA9PT0gXCIvcm91dGVcIiB8fCBwLnN0YXJ0c1dpdGgoXCIvcm91dGUvXCIpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG9wdHMubWNwRW5hYmxlZCAmJiAocCA9PT0gXCIvbWNwXCIgfHwgcC5zdGFydHNXaXRoKFwiL21jcC9cIikpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbSA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICBpZiAobSA9PT0gXCJQT1NUXCIgJiYgQUdFTlRfQ0hBVC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIEFHRU5UX0lORkVSRU5DRS50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiR0VUXCIgJiYgKEFHRU5UX01FVEFEQVRBLnRlc3QocCkgfHwgQUdFTlRfU1VTUEVOREVEX1JVTlMudGVzdChwKSkpIHJldHVybiB0cnVlO1xuICBpZiAobSA9PT0gXCJHRVRcIiAmJiBNRU1PUllfUkVBRC50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChtID09PSBcIlBBVENIXCIgfHwgbSA9PT0gXCJERUxFVEVcIikgJiYgTUVNT1JZX1RIUkVBRF9NVVRBVElPTi50ZXN0KHApKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG0gPT09IFwiUE9TVFwiICYmIHAgPT09IFwiL21lbW9yeS9tZXNzYWdlcy9kZWxldGVcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBLZWVwIE1hc3RyYSBjdXN0b20gQVBJIHJvdXRlcyBtb3VudC1yZWxhdGl2ZSB3aGVuIHRoZSBFeHByZXNzIHN1YmFwcCBpc1xuICogaG9zdGVkIHVuZGVyIEFwcEtpdCdzIGAvYXBpLzxwbHVnaW4+YCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUoYXBwOiBleHByZXNzLkV4cHJlc3MpOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCBfcmVzLCBuZXh0KSA9PiB7XG4gICAgY29uc3QgaXNDdXN0b21Sb3V0ZSA9XG4gICAgICByZXEucGF0aCA9PT0gXCIvY2hhdFwiIHx8XG4gICAgICByZXEucGF0aC5zdGFydHNXaXRoKFwiL2NoYXQvXCIpIHx8XG4gICAgICByZXEucGF0aCA9PT0gXCIvcm91dGVcIiB8fFxuICAgICAgcmVxLnBhdGguc3RhcnRzV2l0aChcIi9yb3V0ZS9cIik7XG4gICAgaWYgKCFpc0N1c3RvbVJvdXRlKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlcS5vcmlnaW5hbFVybCA9IHJlcS5wYXRoO1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG4iXX0=
|