@dbx-tools/appkit-lakebox 0.9.161 → 0.9.165
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 +0 -1
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/_resource-registry.d.ts +0 -6
- package/lib/src/_resource-registry.js +1 -51
- package/lib/src/config.d.ts +0 -1
- package/lib/src/config.js +3 -16
- package/lib/src/runtime.d.ts +1 -2
- package/lib/src/runtime.js +17 -54
- package/package.json +10 -10
- package/src/_resource-registry.ts +0 -49
- package/src/config.ts +1 -19
- package/src/runtime.ts +17 -62
package/README.md
CHANGED
|
@@ -163,7 +163,6 @@ platform.
|
|
|
163
163
|
| `ssh2Patch` | `auto` | Apply the ssh2 missing-exec-reply workaround only in development, always, or never. |
|
|
164
164
|
| `gatewayPort` | `2222` | Lakebox SSH gateway port. |
|
|
165
165
|
| `connectTimeoutMs` | `30000` | SSH connection timeout. |
|
|
166
|
-
| `destroyAfterStartupFailureSeconds` | `false` | Opt in to deleting and recreating an unreachable Lakebox after 5 to 600 seconds. |
|
|
167
166
|
| `commandTimeoutMs` | `120000` | Default command timeout. |
|
|
168
167
|
| `keyDirectory` | `~/.dbx-tools/lakebox` | Optional server-side SSH key and known-host storage root. |
|
|
169
168
|
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-lakebox";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.165";
|
|
7
7
|
export * as config from "./src/config.ts";
|
|
8
8
|
export * as desktop from "./src/desktop.ts";
|
|
9
9
|
export * as metrics from "./src/metrics.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-lakebox";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.165";
|
|
3
3
|
export * as config from "./src/config.ts";
|
|
4
4
|
export * as desktop from "./src/desktop.ts";
|
|
5
5
|
export * as metrics from "./src/metrics.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-lakebox";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.165";
|
|
6
6
|
export * as config from "./src/config.js";
|
|
7
7
|
export * as desktop from "./src/desktop.js";
|
|
8
8
|
export * as metrics from "./src/metrics.js";
|
|
@@ -23,4 +23,4 @@ export { LakeboxControllerDefinitionSchema, LakeboxControllerServiceSchema, buil
|
|
|
23
23
|
export { LAKEBOX_SKILLS_MOUNT, lakeboxSkillMounts } from "./src/skills.js";
|
|
24
24
|
export { LAKEBOX_AGENT_USER, LAKEBOX_AGENT_HOME, LAKEBOX_STATE_ROOT, LAKEBOX_USERS_ROOT, LAKEBOX_RUNTIME_ROOT, LAKEBOX_RUN_ROOT, LAKEBOX_UID_MIN, LAKEBOX_UID_COUNT, LAKEBOX_PORT_MIN, LAKEBOX_PORT_COUNT, normalizeLakeboxIdentity, lakeboxUser, lakeboxPersistentHome, lakeboxServicePort, isLakeboxUserHash } from "./src/user.js";
|
|
25
25
|
export { LakeboxWorkspaceSandbox, lakeboxWorkspaceSandbox } from "./src/workspace.js";
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSw4QkFBOEIsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFak4sT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdFUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2FwcGtpdC1sYWtlYm94XCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMTY1XCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVza3RvcCBmcm9tIFwiLi9zcmMvZGVza3RvcC50c1wiO1xuZXhwb3J0ICogYXMgbWV0cmljcyBmcm9tIFwiLi9zcmMvbWV0cmljcy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHJvdXRlcyBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgKiBhcyBydW50aW1lIGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aWNlcyBmcm9tIFwiLi9zcmMvc2VydmljZXMudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxscyBmcm9tIFwiLi9zcmMvc2tpbGxzLnRzXCI7XG5leHBvcnQgKiBhcyB1c2VyIGZyb20gXCIuL3NyYy91c2VyLnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2UgZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS50c1wiO1xuZXhwb3J0IHsgTGFrZWJveFBsdWdpbkNvbmZpZ1NjaGVtYSwgcmVzb2x2ZUxha2Vib3hQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZUxha2Vib3hQbHVnaW5Db25maWcsIFJlc29sdmVkTGFrZWJveFBsdWdpbkNvbmZpZywgTGFrZWJveFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCB7IGRlc2t0b3BIdG1sSGVhZCwgZGVza3RvcE9wZW5VcmwsIGRlc2t0b3BFbnZpcm9ubWVudCB9IGZyb20gXCIuL3NyYy9kZXNrdG9wLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94TWV0cmljcywgcGFyc2VMYWtlYm94Q291bnRlcnMsIHRvU25hcHNob3QgfSBmcm9tIFwiLi9zcmMvbWV0cmljcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYm94Q291bnRlcnMsIExha2Vib3hNZXRyaWNzRXZlbnRzIH0gZnJvbSBcIi4vc3JjL21ldHJpY3MudHNcIjtcbmV4cG9ydCB7IEFwcEtpdExha2Vib3hQbHVnaW4sIGxha2Vib3ggfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94Um91dGVSZWdpc3RyeSB9IGZyb20gXCIuL3NyYy9yb3V0ZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJveFJvdXRlUmVzb2x1dGlvbiwgTGFrZWJveFJvdXRlUmVzb2x2ZXIgfSBmcm9tIFwiLi9zcmMvcm91dGVzLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94UnVudGltZSwgaXNMYWtlYm94TWlzc2luZyB9IGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2Vib3hJZGVudGl0eVJlc29sdmVyLCBMYWtlYm94TGVnYWN5UG9vbCB9IGZyb20gXCIuL3NyYy9ydW50aW1lLnRzXCI7XG5leHBvcnQgeyBMYWtlYm94Q29udHJvbGxlckRlZmluaXRpb25TY2hlbWEsIExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYSwgYnVpbHRJbkRlZmluaXRpb24sIGltYWdlRGVmaW5pdGlvbiwgc2VydmljZVJvdXRlLCB0b0xha2Vib3hTZXJ2aWNlLCB3aXRoU2VydmljZU9yaWdpbiwgaWRsZUJ1aWx0SW5TZXJ2aWNlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2VzLnRzXCI7XG5leHBvcnQgdHlwZSB7IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbiwgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlLCBMYWtlYm94U2VydmljZVJvdXRlIH0gZnJvbSBcIi4vc3JjL3NlcnZpY2VzLnRzXCI7XG5leHBvcnQgeyBMQUtFQk9YX1NLSUxMU19NT1VOVCwgbGFrZWJveFNraWxsTW91bnRzIH0gZnJvbSBcIi4vc3JjL3NraWxscy50c1wiO1xuZXhwb3J0IHsgTEFLRUJPWF9BR0VOVF9VU0VSLCBMQUtFQk9YX0FHRU5UX0hPTUUsIExBS0VCT1hfU1RBVEVfUk9PVCwgTEFLRUJPWF9VU0VSU19ST09ULCBMQUtFQk9YX1JVTlRJTUVfUk9PVCwgTEFLRUJPWF9SVU5fUk9PVCwgTEFLRUJPWF9VSURfTUlOLCBMQUtFQk9YX1VJRF9DT1VOVCwgTEFLRUJPWF9QT1JUX01JTiwgTEFLRUJPWF9QT1JUX0NPVU5ULCBub3JtYWxpemVMYWtlYm94SWRlbnRpdHksIGxha2Vib3hVc2VyLCBsYWtlYm94UGVyc2lzdGVudEhvbWUsIGxha2Vib3hTZXJ2aWNlUG9ydCwgaXNMYWtlYm94VXNlckhhc2ggfSBmcm9tIFwiLi9zcmMvdXNlci50c1wiO1xuZXhwb3J0IHsgTGFrZWJveFdvcmtzcGFjZVNhbmRib3gsIGxha2Vib3hXb3Jrc3BhY2VTYW5kYm94IH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBMYWtlYm94V29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvd29ya3NwYWNlLnRzXCI7XG4iXX0=
|
|
@@ -31,12 +31,6 @@ export declare class LakeboxResourceRegistry {
|
|
|
31
31
|
read(client: LakeboxResourceClient, signal?: AbortSignal): Promise<LakeboxEntry | undefined>;
|
|
32
32
|
/** Returns the current app Lakebox or creates one with a Databricks-assigned name. */
|
|
33
33
|
getOrCreate(client: LakeboxResourceClient, signal?: AbortSignal): Promise<LakeboxEntry>;
|
|
34
|
-
/**
|
|
35
|
-
* Replace one unreachable managed Lakebox. A replica that observes an already
|
|
36
|
-
* replaced ID returns it without locking; the advisory-lock recheck prevents
|
|
37
|
-
* concurrent replicas from creating multiple replacements.
|
|
38
|
-
*/
|
|
39
|
-
recreate(client: LakeboxResourceClient, failedSandboxId: string, signal?: AbortSignal): Promise<LakeboxEntry>;
|
|
40
34
|
/** Clears the persisted pointer after the managed Lakebox is deleted. */
|
|
41
35
|
clear(client: LakeboxResourceClient): Promise<void>;
|
|
42
36
|
private resolve;
|
|
@@ -55,56 +55,6 @@ export class LakeboxResourceRegistry {
|
|
|
55
55
|
this.pending.set(scope, pending);
|
|
56
56
|
return pending;
|
|
57
57
|
}
|
|
58
|
-
/**
|
|
59
|
-
* Replace one unreachable managed Lakebox. A replica that observes an already
|
|
60
|
-
* replaced ID returns it without locking; the advisory-lock recheck prevents
|
|
61
|
-
* concurrent replicas from creating multiple replacements.
|
|
62
|
-
*/
|
|
63
|
-
async recreate(client, failedSandboxId, signal) {
|
|
64
|
-
const scope = await client.workspaceScope();
|
|
65
|
-
const current = await this.resolve(client, scope, signal);
|
|
66
|
-
if (current && current.sandboxId !== failedSandboxId)
|
|
67
|
-
return current;
|
|
68
|
-
const pending = this.pending.get(scope);
|
|
69
|
-
if (pending)
|
|
70
|
-
return pending;
|
|
71
|
-
const replacement = this.withLock(scope, async () => {
|
|
72
|
-
const rechecked = await this.resolve(client, scope, signal);
|
|
73
|
-
if (rechecked && rechecked.sandboxId !== failedSandboxId)
|
|
74
|
-
return rechecked;
|
|
75
|
-
if (rechecked) {
|
|
76
|
-
try {
|
|
77
|
-
await client.delete(rechecked.sandboxId, signal);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
throw new Error("Destroying the unreachable Lakebox failed", { cause: error });
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
await this.cache().delete(this.key(scope));
|
|
84
|
-
this.legacyChecked.add(scope);
|
|
85
|
-
let created;
|
|
86
|
-
try {
|
|
87
|
-
created = await client.create(signal);
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
throw new Error("Creating a replacement Lakebox failed", { cause: error });
|
|
91
|
-
}
|
|
92
|
-
try {
|
|
93
|
-
await this.write(scope, created.sandboxId);
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
await client.delete(created.sandboxId, signal).catch(() => undefined);
|
|
97
|
-
throw error;
|
|
98
|
-
}
|
|
99
|
-
logger.warn("replaced unreachable app Lakebox", {
|
|
100
|
-
previousId: failedSandboxId,
|
|
101
|
-
replacementId: created.sandboxId,
|
|
102
|
-
});
|
|
103
|
-
return created;
|
|
104
|
-
}).finally(() => this.pending.delete(scope));
|
|
105
|
-
this.pending.set(scope, replacement);
|
|
106
|
-
return replacement;
|
|
107
|
-
}
|
|
108
58
|
/** Clears the persisted pointer after the managed Lakebox is deleted. */
|
|
109
59
|
async clear(client) {
|
|
110
60
|
const scope = await client.workspaceScope();
|
|
@@ -175,4 +125,4 @@ function selectLegacyLakebox(entries, name) {
|
|
|
175
125
|
(Date.parse(right.createTime ?? "") || Number.MAX_SAFE_INTEGER) ||
|
|
176
126
|
left.sandboxId.localeCompare(right.sandboxId))[0];
|
|
177
127
|
}
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Jlc291cmNlLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19yZXNvdXJjZS1yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxlQUFlLEdBQUcseUJBQXlCLENBQUM7QUFDbEQsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDaEQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUVyRCxNQUFNLDhCQUE4QixHQUFHLENBQUM7S0FDckMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsQ0FBQztLQUNuRixNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsNERBQTRELENBQUMsQ0FBQztBQWtCMUU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHVCQUF1QjtJQUtmO0lBQ0E7SUFDQTtJQU5GLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUNuRCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUVuRCxZQUNtQixXQUFtQixFQUNuQixJQUFpQixFQUNqQixRQUFRLEdBQWtCLEVBQUUsQ0FBQyxZ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UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDckYsT0FBTyxHQUFHLGFBQWEsR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsT0FBZ0MsRUFDaEMsSUFBWTtJQUVaLE9BQU8sT0FBTztTQUNYLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUM7U0FDdEMsSUFBSSxDQUNILENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ2QsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQzVELENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQ2hELENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgTGFrZWJveEFwaUVycm9yLCB0eXBlIExha2Vib3hFbnRyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2xha2Vib3hcIjtcbmltcG9ydCB7IHdpdGhBZHZpc29yeUxvY2ssIHR5cGUgUGdQb29sTGlrZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3Bvc3RncmVzXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuY29uc3QgQ0FDSEVfTkFNRVNQQUNFID0gXCJhcHBraXQtbGFrZWJveDpyZXNvdXJjZVwiO1xuY29uc3QgUkVTT1VSQ0VfVFRMX1NFQ09ORFMgPSAzNjUgKiAyNCAqIDYwICogNjA7XG5jb25zdCBMRUdBQ1lfUFJFRklYID0gXCJkYngtbGFrZWJveC1cIjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQtbGFrZWJveDpyZXNvdXJjZVwiKTtcblxuY29uc3QgTGFrZWJveFJlc291cmNlUmVmZXJlbmNlU2NoZW1hID0gelxuICAub2JqZWN0KHsgc2FuZGJveElkOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZShcIkRhdGFicmlja3MgTGFrZWJveCBpZGVudGlmaWVyLlwiKSB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiUGVyc2lzdGVudCBwb2ludGVyIHRvIHRoZSBEYXRhYnJpY2tzLWFzc2lnbmVkIGFwcCBMYWtlYm94LlwiKTtcblxuaW50ZXJmYWNlIFJlc291cmNlQ2FjaGUge1xuICBnZW5lcmF0ZUtleShwYXJ0czogKHN0cmluZyB8IG51bWJlciB8IG9iamVjdClbXSwgdXNlcktleTogc3RyaW5nKTogc3RyaW5nO1xuICBnZXQ8VD4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPjtcbiAgc2V0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgb3B0aW9ucz86IHsgdHRsPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+O1xuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogTGFrZWJveCBjbGllbnQgY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGJ5IHRoZSBwZXJzaXN0ZW50IHJlc291cmNlIHJlZ2lzdHJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYm94UmVzb3VyY2VDbGllbnQge1xuICB3b3Jrc3BhY2VTY29wZSgpOiBQcm9taXNlPHN0cmluZz47XG4gIGxpc3Qoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExha2Vib3hFbnRyeVtdPjtcbiAgZ2V0KGlkOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMYWtlYm94RW50cnk+O1xuICBjcmVhdGUoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExha2Vib3hFbnRyeT47XG4gIGRlbGV0ZShpZDogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogUGVyc2lzdHMgdGhlIERhdGFicmlja3MtYXNzaWduZWQgTGFrZWJveCBJRCBhbmQgc2VyaWFsaXplcyBmaXJzdCBjcmVhdGlvblxuICogYWNyb3NzIGFwcCByZXBsaWNhcyB3aXRoIHRoZSBMYWtlYmFzZSBzZXJ2aWNlLXByaW5jaXBhbCBwb29sLlxuICovXG5leHBvcnQgY2xhc3MgTGFrZWJveFJlc291cmNlUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxMYWtlYm94RW50cnk+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxlZ2FjeUNoZWNrZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcGxpY2F0aW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwb29sPzogUGdQb29sTGlrZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gKCk6IFJlc291cmNlQ2FjaGUgPT4gQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLFxuICApIHt9XG5cbiAgLyoqIFJlc29sdmVzIHRoZSBjdXJyZW50IGFwcCBMYWtlYm94IHdpdGhvdXQgY3JlYXRpbmcgb25lLiAqL1xuICBhc3luYyByZWFkKFxuICAgIGNsaWVudDogTGFrZWJveFJlc291cmNlQ2xpZW50LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPExha2Vib3hFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHNjb3BlID0gYXdhaXQgY2xpZW50LndvcmtzcGFjZVNjb3BlKCk7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZShjbGllbnQsIHNjb3BlLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwIExha2Vib3ggb3IgY3JlYXRlcyBvbmUgd2l0aCBhIERhdGFicmlja3MtYXNzaWduZWQgbmFtZS4gKi9cbiAgYXN5bmMgZ2V0T3JDcmVhdGUoY2xpZW50OiBMYWtlYm94UmVzb3VyY2VDbGllbnQsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMYWtlYm94RW50cnk+IHtcbiAgICBjb25zdCBzY29wZSA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2VTY29wZSgpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBlbmRpbmcuZ2V0KHNjb3BlKTtcbiAgICBpZiAoY3VycmVudCkgcmV0dXJuIGN1cnJlbnQ7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMud2l0aExvY2soc2NvcGUsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5yZXNvbHZlKGNsaWVudCwgc2NvcGUsIHNpZ25hbCk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjbGllbnQuY3JlYXRlKHNpZ25hbCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLndyaXRlKHNjb3BlLCBjcmVhdGVkLnNhbmRib3hJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBhd2FpdCBjbGllbnQuZGVsZXRlKGNyZWF0ZWQuc2FuZGJveElkLCBzaWduYWwpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmluZm8oXCJjcmVhdGVkIGFwcCBMYWtlYm94XCIsIHsgaWQ6IGNyZWF0ZWQuc2FuZGJveElkIH0pO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSkuZmluYWxseSgoKSA9PiB0aGlzLnBlbmRpbmcuZGVsZXRlKHNjb3BlKSk7XG4gICAgdGhpcy5wZW5kaW5nLnNldChzY29wZSwgcGVuZGluZyk7XG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBvbmUgdW5yZWFjaGFibGUgbWFuYWdlZCBMYWtlYm94LiBBIHJlcGxpY2EgdGhhdCBvYnNlcnZlcyBhbiBhbHJlYWR5XG4gICAqIHJlcGxhY2VkIElEIHJldHVybnMgaXQgd2l0aG91dCBsb2NraW5nOyB0aGUgYWR2aXNvcnktbG9jayByZWNoZWNrIHByZXZlbnRzXG4gICAqIGNvbmN1cnJlbnQgcmVwbGljYXMgZnJvbSBjcmVhdGluZyBtdWx0aXBsZSByZXBsYWNlbWVudHMuXG4gICAqL1xuICBhc3luYyByZWNyZWF0ZShcbiAgICBjbGllbnQ6IExha2Vib3hSZXNvdXJjZUNsaWVudCxcbiAgICBmYWlsZWRTYW5kYm94SWQ6IHN0cmluZyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxMYWtlYm94RW50cnk+IHtcbiAgICBjb25zdCBzY29wZSA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2VTY29wZSgpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLnJlc29sdmUoY2xpZW50LCBzY29wZSwgc2lnbmFsKTtcbiAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LnNhbmRib3hJZCAhPT0gZmFpbGVkU2FuZGJveElkKSByZXR1cm4gY3VycmVudDtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nLmdldChzY29wZSk7XG4gICAgaWYgKHBlbmRpbmcpIHJldHVybiBwZW5kaW5nO1xuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdGhpcy53aXRoTG9jayhzY29wZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVjaGVja2VkID0gYXdhaXQgdGhpcy5yZXNvbHZlKGNsaWVudCwgc2NvcGUsIHNpZ25hbCk7XG4gICAgICBpZiAocmVjaGVja2VkICYmIHJlY2hlY2tlZC5zYW5kYm94SWQgIT09IGZhaWxlZFNhbmRib3hJZCkgcmV0dXJuIHJlY2hlY2tlZDtcbiAgICAgIGlmIChyZWNoZWNrZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjbGllbnQuZGVsZXRlKHJlY2hlY2tlZC5zYW5kYm94SWQsIHNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVzdHJveWluZyB0aGUgdW5yZWFjaGFibGUgTGFrZWJveCBmYWlsZWRcIiwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuY2FjaGUoKS5kZWxldGUodGhpcy5rZXkoc2NvcGUpKTtcbiAgICAgIHRoaXMubGVnYWN5Q2hlY2tlZC5hZGQoc2NvcGUpO1xuICAgICAgbGV0IGNyZWF0ZWQ6IExha2Vib3hFbnRyeTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWF0ZWQgPSBhd2FpdCBjbGllbnQuY3JlYXRlKHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDcmVhdGluZyBhIHJlcGxhY2VtZW50IExha2Vib3ggZmFpbGVkXCIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy53cml0ZShzY29wZSwgY3JlYXRlZC5zYW5kYm94SWQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYXdhaXQgY2xpZW50LmRlbGV0ZShjcmVhdGVkLnNhbmRib3hJZCwgc2lnbmFsKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci53YXJuKFwicmVwbGFjZWQgdW5yZWFjaGFibGUgYXBwIExha2Vib3hcIiwge1xuICAgICAgICBwcmV2aW91c0lkOiBmYWlsZWRTYW5kYm94SWQsXG4gICAgICAgIHJlcGxhY2VtZW50SWQ6IGNyZWF0ZWQuc2FuZGJveElkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9KS5maW5hbGx5KCgpID0+IHRoaXMucGVuZGluZy5kZWxldGUoc2NvcGUpKTtcbiAgICB0aGlzLnBlbmRpbmcuc2V0KHNjb3BlLCByZXBsYWNlbWVudCk7XG4gICAgcmV0dXJuIHJlcGxhY2VtZW50O1xuICB9XG5cbiAgLyoqIENsZWFycyB0aGUgcGVyc2lzdGVkIHBvaW50ZXIgYWZ0ZXIgdGhlIG1hbmFnZWQgTGFrZWJveCBpcyBkZWxldGVkLiAqL1xuICBhc3luYyBjbGVhcihjbGllbnQ6IExha2Vib3hSZXNvdXJjZUNsaWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNjb3BlID0gYXdhaXQgY2xpZW50LndvcmtzcGFjZVNjb3BlKCk7XG4gICAgYXdhaXQgdGhpcy5jYWNoZSgpLmRlbGV0ZSh0aGlzLmtleShzY29wZSkpO1xuICAgIHRoaXMubGVnYWN5Q2hlY2tlZC5hZGQoc2NvcGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlKFxuICAgIGNsaWVudDogTGFrZWJveFJlc291cmNlQ2xpZW50LFxuICAgIHNjb3BlOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5rZXkoc2NvcGUpO1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5jYWNoZSgpLmdldDx1bmtub3duPihrZXkpO1xuICAgIGNvbnN0IHBhcnNlZCA9IExha2Vib3hSZXNvdXJjZVJlZmVyZW5jZVNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiAhcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZGlzY2FyZGVkIGludmFsaWQgY2FjaGVkIExha2Vib3ggcmVzb3VyY2UgcmVmZXJlbmNlXCIsIHtcbiAgICAgICAgYXBwbGljYXRpb246IHRoaXMuYXBwbGljYXRpb24sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuY2FjaGUoKS5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LmdldChwYXJzZWQuZGF0YS5zYW5kYm94SWQsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIExha2Vib3hBcGlFcnJvcikgfHwgZXJyb3Iuc3RhdHVzICE9PSA0MDQpIHRocm93IGVycm9yO1xuICAgICAgICBhd2FpdCB0aGlzLmNhY2hlKCkuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMubGVnYWN5Q2hlY2tlZC5hZGQoc2NvcGUpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5sZWdhY3lDaGVja2VkLmhhcyhzY29wZSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdGhpcy5sZWdhY3lDaGVja2VkLmFkZChzY29wZSk7XG4gICAgY29uc3QgbGVnYWN5ID0gc2VsZWN0TGVnYWN5TGFrZWJveChcbiAgICAgIGF3YWl0IGNsaWVudC5saXN0KHNpZ25hbCksXG4gICAgICBsZWdhY3lMYWtlYm94TmFtZSh0aGlzLmFwcGxpY2F0aW9uKSxcbiAgICApO1xuICAgIGlmICghbGVnYWN5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGF3YWl0IHRoaXMud3JpdGUoc2NvcGUsIGxlZ2FjeS5zYW5kYm94SWQpO1xuICAgIGxvZ2dlci5pbmZvKFwiYWRvcHRlZCBsZWdhY3kgbmFtZWQgYXBwIExha2Vib3hcIiwgeyBpZDogbGVnYWN5LnNhbmRib3hJZCB9KTtcbiAgICByZXR1cm4gbGVnYWN5O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZShzY29wZTogc3RyaW5nLCBzYW5kYm94SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2FjaGUoKS5zZXQodGhpcy5rZXkoc2NvcGUpLCBMYWtlYm94UmVzb3VyY2VSZWZlcmVuY2VTY2hlbWEucGFyc2UoeyBzYW5kYm94SWQgfSksIHtcbiAgICAgIHR0bDogUkVTT1VSQ0VfVFRMX1NFQ09ORFMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGtleShzY29wZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZSgpLmdlbmVyYXRlS2V5KFtDQUNIRV9OQU1FU1BBQ0UsIHRoaXMuYXBwbGljYXRpb25dLCBzY29wZSk7XG4gIH1cblxuICBwcml2YXRlIHdpdGhMb2NrPFQ+KHNjb3BlOiBzdHJpbmcsIGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKCF0aGlzLnBvb2wpIHJldHVybiBmbigpO1xuICAgIHJldHVybiB3aXRoQWR2aXNvcnlMb2NrKHRoaXMucG9vbCwgW0NBQ0hFX05BTUVTUEFDRSwgdGhpcy5hcHBsaWNhdGlvbiwgc2NvcGVdLCBmbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGVnYWN5TGFrZWJveE5hbWUoYXBwbGljYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNsdWcgPSBhcHBsaWNhdGlvblxuICAgIC50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiLVwiKVxuICAgIC5yZXBsYWNlKC9eLXwtJC9nLCBcIlwiKVxuICAgIC5zbGljZSgwLCAyMDApO1xuICBpZiAoIXNsdWcpIHRocm93IG5ldyBFcnJvcihcIkEgbWFuYWdlZCBMYWtlYm94IHJlcXVpcmVzIGEgbm9uLWVtcHR5IGFwcGxpY2F0aW9uIGtleVwiKTtcbiAgcmV0dXJuIGAke0xFR0FDWV9QUkVGSVh9JHtzbHVnfWA7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdExlZ2FjeUxha2Vib3goXG4gIGVudHJpZXM6IHJlYWRvbmx5IExha2Vib3hFbnRyeVtdLFxuICBuYW1lOiBzdHJpbmcsXG4pOiBMYWtlYm94RW50cnkgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKVxuICAgIC5zb3J0KFxuICAgICAgKGxlZnQsIHJpZ2h0KSA9PlxuICAgICAgICAoRGF0ZS5wYXJzZShsZWZ0LmNyZWF0ZVRpbWUgPz8gXCJcIikgfHwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIC1cbiAgICAgICAgICAoRGF0ZS5wYXJzZShyaWdodC5jcmVhdGVUaW1lID8/IFwiXCIpIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB8fFxuICAgICAgICBsZWZ0LnNhbmRib3hJZC5sb2NhbGVDb21wYXJlKHJpZ2h0LnNhbmRib3hJZCksXG4gICAgKVswXTtcbn1cbiJdfQ==
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Jlc291cmNlLXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19yZXNvdXJjZS1yZWdpc3RyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxlQUFlLEdBQUcseUJBQXlCLENBQUM7QUFDbEQsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDaEQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUVyRCxNQUFNLDhCQUE4QixHQUFHLENBQUM7S0FDckMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsQ0FBQztLQUNuRixNQUFNLEVBQUU7S0FDUixRQUFRLENBQUMsNERBQTRELENBQUMsQ0FBQztBQWtCMUU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLHVCQUF1QjtJQUtmO0lBQ0E7SUFDQTtJQU5GLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUNuRCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUVuRCxZQUNtQixXQUFtQixFQUNuQixJQUFpQixFQUNqQixRQUFRLEdBQWtCLEVBQUUsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFO1FBRjNELGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsVUFBSyxHQUFMLEtBQUssQ0FBc0Q7SUFDM0UsQ0FBQztJQUVKLDZEQUE2RDtJQUM3RCxLQUFLLENBQUMsSUFBSSxDQUNSLE1BQTZCLEVBQzdCLE1BQW9CO1FBRXBCLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUE2QixFQUFFLE1BQW9CO1FBQ25FLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksT0FBTztZQUFFLE9BQU8sT0FBTyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNELElBQUksUUFBUTtnQkFBRSxPQUFPLFFBQVEsQ0FBQztZQUM5QixNQUFNLE9BQU8sR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdEUsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM5RCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQTZCO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQ25CLE1BQTZCLEVBQzdCLEtBQWEsRUFDYixNQUFvQjtRQUVwQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBVSxHQUFHLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMscURBQXFELEVBQUU7Z0JBQ2pFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUM5QixDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHO29CQUFFLE1BQU0sS0FBSyxDQUFDO2dCQUM3RSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQ2hDLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFDekIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUNwQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM5QixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQWEsRUFBRSxTQUFpQjtRQUNsRCxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO1lBQzNGLEdBQUcsRUFBRSxvQkFBb0I7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEdBQUcsQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVPLFFBQVEsQ0FBSSxLQUFhLEVBQUUsRUFBb0I7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUM1QixPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDO0NBQ0Y7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFdBQW1CO0lBQzVDLE1BQU0sSUFBSSxHQUFHLFdBQVc7U0FDckIsSUFBSSxFQUFFO1NBQ04sV0FBVyxFQUFFO1NBQ2IsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUM7U0FDM0IsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7U0FDckIsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqQixJQUFJLENBQUMsSUFBSTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztJQUNyRixPQUFPLEdBQUcsYUFBYSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ25DLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUMxQixPQUFnQyxFQUNoQyxJQUFZO0lBRVosT0FBTyxPQUFPO1NBQ1gsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQztTQUN0QyxJQUFJLENBQ0gsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDZCxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDNUQsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQ2pFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FDaEQsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBMYWtlYm94QXBpRXJyb3IsIHR5cGUgTGFrZWJveEVudHJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvbGFrZWJveFwiO1xuaW1wb3J0IHsgd2l0aEFkdmlzb3J5TG9jaywgdHlwZSBQZ1Bvb2xMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBDQUNIRV9OQU1FU1BBQ0UgPSBcImFwcGtpdC1sYWtlYm94OnJlc291cmNlXCI7XG5jb25zdCBSRVNPVVJDRV9UVExfU0VDT05EUyA9IDM2NSAqIDI0ICogNjAgKiA2MDtcbmNvbnN0IExFR0FDWV9QUkVGSVggPSBcImRieC1sYWtlYm94LVwiO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC1sYWtlYm94OnJlc291cmNlXCIpO1xuXG5jb25zdCBMYWtlYm94UmVzb3VyY2VSZWZlcmVuY2VTY2hlbWEgPSB6XG4gIC5vYmplY3QoeyBzYW5kYm94SWQ6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBMYWtlYm94IGlkZW50aWZpZXIuXCIpIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJQZXJzaXN0ZW50IHBvaW50ZXIgdG8gdGhlIERhdGFicmlja3MtYXNzaWduZWQgYXBwIExha2Vib3guXCIpO1xuXG5pbnRlcmZhY2UgUmVzb3VyY2VDYWNoZSB7XG4gIGdlbmVyYXRlS2V5KHBhcnRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0KVtdLCB1c2VyS2V5OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldDxUPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+O1xuICBzZXQ8VD4oa2V5OiBzdHJpbmcsIHZhbHVlOiBULCBvcHRpb25zPzogeyB0dGw/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD47XG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBMYWtlYm94IGNsaWVudCBjYXBhYmlsaXRpZXMgcmVxdWlyZWQgYnkgdGhlIHBlcnNpc3RlbnQgcmVzb3VyY2UgcmVnaXN0cnkuICovXG5leHBvcnQgaW50ZXJmYWNlIExha2Vib3hSZXNvdXJjZUNsaWVudCB7XG4gIHdvcmtzcGFjZVNjb3BlKCk6IFByb21pc2U8c3RyaW5nPjtcbiAgbGlzdChzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveEVudHJ5W10+O1xuICBnZXQoaWQ6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExha2Vib3hFbnRyeT47XG4gIGNyZWF0ZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveEVudHJ5PjtcbiAgZGVsZXRlKGlkOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBQZXJzaXN0cyB0aGUgRGF0YWJyaWNrcy1hc3NpZ25lZCBMYWtlYm94IElEIGFuZCBzZXJpYWxpemVzIGZpcnN0IGNyZWF0aW9uXG4gKiBhY3Jvc3MgYXBwIHJlcGxpY2FzIHdpdGggdGhlIExha2ViYXNlIHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlYm94UmVzb3VyY2VSZWdpc3RyeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPExha2Vib3hFbnRyeT4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVnYWN5Q2hlY2tlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwbGljYXRpb246IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvb2w/OiBQZ1Bvb2xMaWtlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSAoKTogUmVzb3VyY2VDYWNoZSA9PiBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCksXG4gICkge31cblxuICAvKiogUmVzb2x2ZXMgdGhlIGN1cnJlbnQgYXBwIExha2Vib3ggd2l0aG91dCBjcmVhdGluZyBvbmUuICovXG4gIGFzeW5jIHJlYWQoXG4gICAgY2xpZW50OiBMYWtlYm94UmVzb3VyY2VDbGllbnQsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3Qgc2NvcGUgPSBhd2FpdCBjbGllbnQud29ya3NwYWNlU2NvcGUoKTtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKGNsaWVudCwgc2NvcGUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgY3VycmVudCBhcHAgTGFrZWJveCBvciBjcmVhdGVzIG9uZSB3aXRoIGEgRGF0YWJyaWNrcy1hc3NpZ25lZCBuYW1lLiAqL1xuICBhc3luYyBnZXRPckNyZWF0ZShjbGllbnQ6IExha2Vib3hSZXNvdXJjZUNsaWVudCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExha2Vib3hFbnRyeT4ge1xuICAgIGNvbnN0IHNjb3BlID0gYXdhaXQgY2xpZW50LndvcmtzcGFjZVNjb3BlKCk7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMucGVuZGluZy5nZXQoc2NvcGUpO1xuICAgIGlmIChjdXJyZW50KSByZXR1cm4gY3VycmVudDtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy53aXRoTG9jayhzY29wZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnJlc29sdmUoY2xpZW50LCBzY29wZSwgc2lnbmFsKTtcbiAgICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNsaWVudC5jcmVhdGUoc2lnbmFsKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMud3JpdGUoc2NvcGUsIGNyZWF0ZWQuc2FuZGJveElkKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC5kZWxldGUoY3JlYXRlZC5zYW5kYm94SWQsIHNpZ25hbCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhcImNyZWF0ZWQgYXBwIExha2Vib3hcIiwgeyBpZDogY3JlYXRlZC5zYW5kYm94SWQgfSk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9KS5maW5hbGx5KCgpID0+IHRoaXMucGVuZGluZy5kZWxldGUoc2NvcGUpKTtcbiAgICB0aGlzLnBlbmRpbmcuc2V0KHNjb3BlLCBwZW5kaW5nKTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfVxuXG4gIC8qKiBDbGVhcnMgdGhlIHBlcnNpc3RlZCBwb2ludGVyIGFmdGVyIHRoZSBtYW5hZ2VkIExha2Vib3ggaXMgZGVsZXRlZC4gKi9cbiAgYXN5bmMgY2xlYXIoY2xpZW50OiBMYWtlYm94UmVzb3VyY2VDbGllbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzY29wZSA9IGF3YWl0IGNsaWVudC53b3Jrc3BhY2VTY29wZSgpO1xuICAgIGF3YWl0IHRoaXMuY2FjaGUoKS5kZWxldGUodGhpcy5rZXkoc2NvcGUpKTtcbiAgICB0aGlzLmxlZ2FjeUNoZWNrZWQuYWRkKHNjb3BlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZShcbiAgICBjbGllbnQ6IExha2Vib3hSZXNvdXJjZUNsaWVudCxcbiAgICBzY29wZTogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPExha2Vib3hFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMua2V5KHNjb3BlKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuY2FjaGUoKS5nZXQ8dW5rbm93bj4oa2V5KTtcbiAgICBjb25zdCBwYXJzZWQgPSBMYWtlYm94UmVzb3VyY2VSZWZlcmVuY2VTY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICBsb2dnZXIud2FybihcImRpc2NhcmRlZCBpbnZhbGlkIGNhY2hlZCBMYWtlYm94IHJlc291cmNlIHJlZmVyZW5jZVwiLCB7XG4gICAgICAgIGFwcGxpY2F0aW9uOiB0aGlzLmFwcGxpY2F0aW9uLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLmNhY2hlKCkuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmIChwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5nZXQocGFyc2VkLmRhdGEuc2FuZGJveElkLCBzaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBMYWtlYm94QXBpRXJyb3IpIHx8IGVycm9yLnN0YXR1cyAhPT0gNDA0KSB0aHJvdyBlcnJvcjtcbiAgICAgICAgYXdhaXQgdGhpcy5jYWNoZSgpLmRlbGV0ZShrZXkpO1xuICAgICAgICB0aGlzLmxlZ2FjeUNoZWNrZWQuYWRkKHNjb3BlKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMubGVnYWN5Q2hlY2tlZC5oYXMoc2NvcGUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHRoaXMubGVnYWN5Q2hlY2tlZC5hZGQoc2NvcGUpO1xuICAgIGNvbnN0IGxlZ2FjeSA9IHNlbGVjdExlZ2FjeUxha2Vib3goXG4gICAgICBhd2FpdCBjbGllbnQubGlzdChzaWduYWwpLFxuICAgICAgbGVnYWN5TGFrZWJveE5hbWUodGhpcy5hcHBsaWNhdGlvbiksXG4gICAgKTtcbiAgICBpZiAoIWxlZ2FjeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLndyaXRlKHNjb3BlLCBsZWdhY3kuc2FuZGJveElkKTtcbiAgICBsb2dnZXIuaW5mbyhcImFkb3B0ZWQgbGVnYWN5IG5hbWVkIGFwcCBMYWtlYm94XCIsIHsgaWQ6IGxlZ2FjeS5zYW5kYm94SWQgfSk7XG4gICAgcmV0dXJuIGxlZ2FjeTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGUoc2NvcGU6IHN0cmluZywgc2FuZGJveElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNhY2hlKCkuc2V0KHRoaXMua2V5KHNjb3BlKSwgTGFrZWJveFJlc291cmNlUmVmZXJlbmNlU2NoZW1hLnBhcnNlKHsgc2FuZGJveElkIH0pLCB7XG4gICAgICB0dGw6IFJFU09VUkNFX1RUTF9TRUNPTkRTLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBrZXkoc2NvcGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUoKS5nZW5lcmF0ZUtleShbQ0FDSEVfTkFNRVNQQUNFLCB0aGlzLmFwcGxpY2F0aW9uXSwgc2NvcGUpO1xuICB9XG5cbiAgcHJpdmF0ZSB3aXRoTG9jazxUPihzY29wZTogc3RyaW5nLCBmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGlmICghdGhpcy5wb29sKSByZXR1cm4gZm4oKTtcbiAgICByZXR1cm4gd2l0aEFkdmlzb3J5TG9jayh0aGlzLnBvb2wsIFtDQUNIRV9OQU1FU1BBQ0UsIHRoaXMuYXBwbGljYXRpb24sIHNjb3BlXSwgZm4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUxha2Vib3hOYW1lKGFwcGxpY2F0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzbHVnID0gYXBwbGljYXRpb25cbiAgICAudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCBcIi1cIilcbiAgICAucmVwbGFjZSgvXi18LSQvZywgXCJcIilcbiAgICAuc2xpY2UoMCwgMjAwKTtcbiAgaWYgKCFzbHVnKSB0aHJvdyBuZXcgRXJyb3IoXCJBIG1hbmFnZWQgTGFrZWJveCByZXF1aXJlcyBhIG5vbi1lbXB0eSBhcHBsaWNhdGlvbiBrZXlcIik7XG4gIHJldHVybiBgJHtMRUdBQ1lfUFJFRklYfSR7c2x1Z31gO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RMZWdhY3lMYWtlYm94KFxuICBlbnRyaWVzOiByZWFkb25seSBMYWtlYm94RW50cnlbXSxcbiAgbmFtZTogc3RyaW5nLFxuKTogTGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSlcbiAgICAuc29ydChcbiAgICAgIChsZWZ0LCByaWdodCkgPT5cbiAgICAgICAgKERhdGUucGFyc2UobGVmdC5jcmVhdGVUaW1lID8/IFwiXCIpIHx8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSAtXG4gICAgICAgICAgKERhdGUucGFyc2UocmlnaHQuY3JlYXRlVGltZSA/PyBcIlwiKSB8fCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikgfHxcbiAgICAgICAgbGVmdC5zYW5kYm94SWQubG9jYWxlQ29tcGFyZShyaWdodC5zYW5kYm94SWQpLFxuICAgIClbMF07XG59XG4iXX0=
|
package/lib/src/config.d.ts
CHANGED
|
@@ -7,7 +7,6 @@ export declare const LakeboxPluginConfigSchema: z.ZodObject<{
|
|
|
7
7
|
routePrefix: z.ZodDefault<z.ZodString>;
|
|
8
8
|
gatewayPort: z.ZodDefault<z.ZodNumber>;
|
|
9
9
|
connectTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
10
|
-
destroyAfterStartupFailureSeconds: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<false>, z.ZodNumber]>>;
|
|
11
10
|
commandTimeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
12
11
|
metricsIntervalSeconds: z.ZodDefault<z.ZodNumber>;
|
|
13
12
|
sshTransport: z.ZodDefault<z.ZodPipe<z.ZodString, z.ZodEnum<{
|
package/lib/src/config.js
CHANGED
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
import { basename } from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { configUtils, string, ENV_ONLY, positiveInt, root } from "@dbx-tools/core";
|
|
3
3
|
import { Ssh2PatchModeSchema, SshTransportModeSchema } from "@dbx-tools/lakebox";
|
|
4
4
|
import { LAKEBOX_DEFAULT_ROUTE_PREFIX } from "@dbx-tools/shared-lakebox";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
const APPLICATION_CONFIG_KEY = "LAKEBOX_APPLICATION";
|
|
7
7
|
const IDLE_TIMEOUT_CONFIG_KEY = "LAKEBOX_IDLE_TIMEOUT_SECONDS";
|
|
8
|
-
const DESTROY_AFTER_STARTUP_FAILURE_CONFIG_KEY = "LAKEBOX_DESTROY_AFTER_STARTUP_FAILURE_SECONDS";
|
|
9
8
|
const SSH_TRANSPORT_CONFIG_KEY = "LAKEBOX_SSH_TRANSPORT";
|
|
10
9
|
const SSH2_PATCH_CONFIG_KEY = "LAKEBOX_SSH_SSH2_PATCH";
|
|
11
|
-
/** Resolve an optional destructive startup-recovery timeout. */
|
|
12
|
-
function _destroyAfterStartupFailureSeconds(configured) {
|
|
13
|
-
if (boolean(configured, DESTROY_AFTER_STARTUP_FAILURE_CONFIG_KEY) === false)
|
|
14
|
-
return false;
|
|
15
|
-
const seconds = positiveInt(configured, DESTROY_AFTER_STARTUP_FAILURE_CONFIG_KEY, 0);
|
|
16
|
-
return seconds > 0 ? seconds : undefined;
|
|
17
|
-
}
|
|
18
10
|
export const LakeboxPluginConfigSchema = z
|
|
19
11
|
.object({
|
|
20
12
|
auto: z
|
|
@@ -51,10 +43,6 @@ export const LakeboxPluginConfigSchema = z
|
|
|
51
43
|
.positive()
|
|
52
44
|
.default(30_000)
|
|
53
45
|
.describe("SSH connection timeout in milliseconds. Defaults to 30000."),
|
|
54
|
-
destroyAfterStartupFailureSeconds: z
|
|
55
|
-
.union([z.literal(false), z.number().int().min(5).max(600)])
|
|
56
|
-
.default(false)
|
|
57
|
-
.describe(`Destroy and recreate the Lakebox when its SSH gateway remains unreachable for this many seconds, from 5 to 600. Defaults to false; configure with ${configUtils.name(DESTROY_AFTER_STARTUP_FAILURE_CONFIG_KEY)}.`),
|
|
58
46
|
commandTimeoutMs: z
|
|
59
47
|
.number()
|
|
60
48
|
.int()
|
|
@@ -84,16 +72,15 @@ export const LakeboxPluginConfigSchema = z
|
|
|
84
72
|
* @throws A Zod validation error when a field has an invalid type or range.
|
|
85
73
|
*/
|
|
86
74
|
export function resolveLakeboxPluginConfig(config = {}) {
|
|
87
|
-
const { runtime: _runtime, name: _name, host: _host, context: _context, telemetry: _telemetry, streamConfig: _stream, application, idleTimeoutSeconds,
|
|
75
|
+
const { runtime: _runtime, name: _name, host: _host, context: _context, telemetry: _telemetry, streamConfig: _stream, application, idleTimeoutSeconds, sshTransport, ssh2Patch, ...serializable } = config;
|
|
88
76
|
return LakeboxPluginConfigSchema.parse({
|
|
89
77
|
...serializable,
|
|
90
78
|
application: string(application, APPLICATION_CONFIG_KEY) ??
|
|
91
79
|
string(undefined, "DATABRICKS_APP_NAME", ENV_ONLY) ??
|
|
92
80
|
basename(root() ?? process.cwd()),
|
|
93
81
|
idleTimeoutSeconds: positiveInt(idleTimeoutSeconds, IDLE_TIMEOUT_CONFIG_KEY, 3_600),
|
|
94
|
-
destroyAfterStartupFailureSeconds: _destroyAfterStartupFailureSeconds(destroyAfterStartupFailureSeconds),
|
|
95
82
|
sshTransport: string(sshTransport, SSH_TRANSPORT_CONFIG_KEY),
|
|
96
83
|
ssh2Patch: string(ssh2Patch, SSH2_PATCH_CONFIG_KEY),
|
|
97
84
|
});
|
|
98
85
|
}
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNyRCxNQUFNLHVCQUF1QixHQUFHLDhCQUE4QixDQUFDO0FBQy9ELE1BQU0sd0NBQXdDLEdBQUcsK0NBQStDLENBQUM7QUFDakcsTUFBTSx3QkFBd0IsR0FBRyx1QkFBdUIsQ0FBQztBQUN6RCxNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixDQUFDO0FBRXZELGdFQUFnRTtBQUNoRSxTQUFTLGtDQUFrQyxDQUFDLFVBQW1CO0lBQzdELElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSx3Q0FBd0MsQ0FBQyxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsVUFBVSxFQUFFLHdDQUF3QyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0MsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUM7S0FDdkMsTUFBTSxDQUFDO0lBQ04sSUFBSSxFQUFFLENBQUM7U0FDSixP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LEVBQUUsUUFBUSxFQUNqQixTQUFTLEVBQUUsVUFBVSxFQUNyQixZQUFZLEVBQUUsT0FBTyxFQUNyQixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGlDQUFpQyxFQUNqQyxZQUFZLEVBQ1osU0FBUyxFQUNULEdBQUcsWUFBWSxFQUNoQixHQUFHLE1BQU0sQ0FBQztJQUNYLE9BQU8seUJBQXlCLENBQUMsS0FBSyxDQUFDO1FBQ3JDLEdBQUcsWUFBWTtRQUNmLFdBQVcsRUFDVCxNQUFNLENBQUMsV0FBVyxFQUFFLHNCQUFzQixDQUFDO1lBQzNDLE1BQU0sQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsUUFBUSxDQUFDO1lBQ2xELFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbkMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLEtBQUssQ0FBQztRQUNuRixpQ0FBaUMsRUFBRSxrQ0FBa0MsQ0FDbkUsaUNBQWlDLENBQ2xDO1FBQ0QsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLENBQUM7UUFDNUQsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUM7S0FDcEQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJhc2VuYW1lIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlUGx1Z2luQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYm9vbGVhbiwgY29uZmlnVXRpbHMsIHN0cmluZywgRU5WX09OTFksIHBvc2l0aXZlSW50LCByb290IH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgU3NoMlBhdGNoTW9kZVNjaGVtYSwgU3NoVHJhbnNwb3J0TW9kZVNjaGVtYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2xha2Vib3hcIjtcbmltcG9ydCB7IExBS0VCT1hfREVGQVVMVF9ST1VURV9QUkVGSVggfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbGFrZWJveFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuY29uc3QgQVBQTElDQVRJT05fQ09ORklHX0tFWSA9IFwiTEFLRUJPWF9BUFBMSUNBVElPTlwiO1xuY29uc3QgSURMRV9USU1FT1VUX0NPTkZJR19LRVkgPSBcIkxBS0VCT1hfSURMRV9USU1FT1VUX1NFQ09ORFNcIjtcbmNvbnN0IERFU1RST1lfQUZURVJfU1RBUlRVUF9GQUlMVVJFX0NPTkZJR19LRVkgPSBcIkxBS0VCT1hfREVTVFJPWV9BRlRFUl9TVEFSVFVQX0ZBSUxVUkVfU0VDT05EU1wiO1xuY29uc3QgU1NIX1RSQU5TUE9SVF9DT05GSUdfS0VZID0gXCJMQUtFQk9YX1NTSF9UUkFOU1BPUlRcIjtcbmNvbnN0IFNTSDJfUEFUQ0hfQ09ORklHX0tFWSA9IFwiTEFLRUJPWF9TU0hfU1NIMl9QQVRDSFwiO1xuXG4vKiogUmVzb2x2ZSBhbiBvcHRpb25hbCBkZXN0cnVjdGl2ZSBzdGFydHVwLXJlY292ZXJ5IHRpbWVvdXQuICovXG5mdW5jdGlvbiBfZGVzdHJveUFmdGVyU3RhcnR1cEZhaWx1cmVTZWNvbmRzKGNvbmZpZ3VyZWQ6IHVua25vd24pOiBmYWxzZSB8IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmIChib29sZWFuKGNvbmZpZ3VyZWQsIERFU1RST1lfQUZURVJfU1RBUlRVUF9GQUlMVVJFX0NPTkZJR19LRVkpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzZWNvbmRzID0gcG9zaXRpdmVJbnQoY29uZmlndXJlZCwgREVTVFJPWV9BRlRFUl9TVEFSVFVQX0ZBSUxVUkVfQ09ORklHX0tFWSwgMCk7XG4gIHJldHVybiBzZWNvbmRzID4gMCA/IHNlY29uZHMgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBMYWtlYm94UGx1Z2luQ29uZmlnU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBhdXRvOiB6XG4gICAgICAuYm9vbGVhbigpXG4gICAgICAuZGVmYXVsdCh0cnVlKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBcIldoZXRoZXIgY29tbWFuZHMsIHNlcnZpY2VzLCBhbmQgcm91dGVzIGNyZWF0ZSBvciBzdGFydCB0aGUgYXBwIExha2Vib3ggb24gZGVtYW5kLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgICAgKSxcbiAgICBhcHBsaWNhdGlvbjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgICAubWluKDEpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIGBTdGFibGUgYXBwbGljYXRpb24ga2V5IGZvciB0aGUgcGVyc2lzdGVkIExha2Vib3ggcmVzb3VyY2UgSUQuIERlZmF1bHRzIHRvICR7Y29uZmlnVXRpbHMubmFtZShBUFBMSUNBVElPTl9DT05GSUdfS0VZKX0sIHRoZW4gREFUQUJSSUNLU19BUFBfTkFNRSwgdGhlbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkgbmFtZS5gLFxuICAgICAgKSxcbiAgICBpZGxlVGltZW91dFNlY29uZHM6IHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLmludCgpXG4gICAgICAubWluKDYwKVxuICAgICAgLm1heCg4Nl80MDApXG4gICAgICAuZGVmYXVsdCgzXzYwMClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgYFBsYXRmb3JtIGlkbGUgdGltZW91dCB0aGF0IHN0b3BzIHRoZSBMYWtlYm94IGFmdGVyIGluYWN0aXZpdHksIGZyb20gNjAgdG8gODY0MDAgc2Vjb25kcy4gRGVmYXVsdHMgdG8gMzYwMDsgY29uZmlndXJlIHdpdGggJHtjb25maWdVdGlscy5uYW1lKElETEVfVElNRU9VVF9DT05GSUdfS0VZKX0uYCxcbiAgICAgICksXG4gICAgcm91dGVQcmVmaXg6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAuZGVmYXVsdChMQUtFQk9YX0RFRkFVTFRfUk9VVEVfUFJFRklYKVxuICAgICAgLmRlc2NyaWJlKFwiQXBwS2l0IHJvb3QgcGF0aCBmb3IgdXNlciBzZXJ2aWNlIHJvdXRlcy4gRGVmYXVsdHMgdG8gL2xha2Vib3guXCIpLFxuICAgIGdhdGV3YXlQb3J0OiB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5pbnQoKVxuICAgICAgLm1pbigxKVxuICAgICAgLm1heCg2NTUzNSlcbiAgICAgIC5kZWZhdWx0KDIyMjIpXG4gICAgICAuZGVzY3JpYmUoXCJMYWtlYm94IFNTSCBnYXRld2F5IHBvcnQuIERlZmF1bHRzIHRvIDIyMjIuXCIpLFxuICAgIGNvbm5lY3RUaW1lb3V0TXM6IHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLmludCgpXG4gICAgICAucG9zaXRpdmUoKVxuICAgICAgLmRlZmF1bHQoMzBfMDAwKVxuICAgICAgLmRlc2NyaWJlKFwiU1NIIGNvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDMwMDAwLlwiKSxcbiAgICBkZXN0cm95QWZ0ZXJTdGFydHVwRmFpbHVyZVNlY29uZHM6IHpcbiAgICAgIC51bmlvbihbei5saXRlcmFsKGZhbHNlKSwgei5udW1iZXIoKS5pbnQoKS5taW4oNSkubWF4KDYwMCldKVxuICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIGBEZXN0cm95IGFuZCByZWNyZWF0ZSB0aGUgTGFrZWJveCB3aGVuIGl0cyBTU0ggZ2F0ZXdheSByZW1haW5zIHVucmVhY2hhYmxlIGZvciB0aGlzIG1hbnkgc2Vjb25kcywgZnJvbSA1IHRvIDYwMC4gRGVmYXVsdHMgdG8gZmFsc2U7IGNvbmZpZ3VyZSB3aXRoICR7Y29uZmlnVXRpbHMubmFtZShERVNUUk9ZX0FGVEVSX1NUQVJUVVBfRkFJTFVSRV9DT05GSUdfS0VZKX0uYCxcbiAgICAgICksXG4gICAgY29tbWFuZFRpbWVvdXRNczogelxuICAgICAgLm51bWJlcigpXG4gICAgICAuaW50KClcbiAgICAgIC5wb3NpdGl2ZSgpXG4gICAgICAuZGVmYXVsdCgxMjBfMDAwKVxuICAgICAgLmRlc2NyaWJlKFwiRGVmYXVsdCBjb21tYW5kIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byAxMjAwMDAuXCIpLFxuICAgIG1ldHJpY3NJbnRlcnZhbFNlY29uZHM6IHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLmludCgpXG4gICAgICAubWluKDEpXG4gICAgICAubWF4KDMwMClcbiAgICAgIC5kZWZhdWx0KDUpXG4gICAgICAuZGVzY3JpYmUoXCJJbnRlcnZhbCBiZXR3ZWVuIG1ldHJpY3Mgc2FtcGxlcyB3aGlsZSB0aGUgTGFrZWJveCBydW5zLiBEZWZhdWx0cyB0byA1LlwiKSxcbiAgICBzc2hUcmFuc3BvcnQ6IFNzaFRyYW5zcG9ydE1vZGVTY2hlbWEuZGVzY3JpYmUoXG4gICAgICBgU1NIIHRyYW5zcG9ydDogYXV0bywgb3BlbnNzaCwgb3Igc3NoMi4gQ29uZmlndXJlIHdpdGggJHtjb25maWdVdGlscy5uYW1lKFNTSF9UUkFOU1BPUlRfQ09ORklHX0tFWSl9LmAsXG4gICAgKSxcbiAgICBzc2gyUGF0Y2g6IFNzaDJQYXRjaE1vZGVTY2hlbWEuZGVzY3JpYmUoXG4gICAgICBgc3NoMiBtaXNzaW5nLWV4ZWMtcmVwbHkgd29ya2Fyb3VuZDogYXV0bywgdHJ1ZSwgb3IgZmFsc2UuIENvbmZpZ3VyZSB3aXRoICR7Y29uZmlnVXRpbHMubmFtZShTU0gyX1BBVENIX0NPTkZJR19LRVkpfS5gLFxuICAgICksXG4gICAga2V5RGlyZWN0b3J5OiB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC5taW4oMSlcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJTZXJ2ZXItc2lkZSBkaXJlY3RvcnkgZm9yIHRoZSBhcHAgU1NIIGtleSBhbmQgZ2F0ZXdheSBob3N0IGtleXMuXCIpLFxuICB9KVxuICAuc3RyaWN0KClcbiAgLmRlc2NyaWJlKFwiU2VyaWFsaXphYmxlIExha2Vib3ggQXBwS2l0IHBsdWdpbiBjb25maWd1cmF0aW9uLlwiKTtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlTGFrZWJveFBsdWdpbkNvbmZpZyA9IHouaW5wdXQ8dHlwZW9mIExha2Vib3hQbHVnaW5Db25maWdTY2hlbWE+O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRMYWtlYm94UGx1Z2luQ29uZmlnID0gei5vdXRwdXQ8dHlwZW9mIExha2Vib3hQbHVnaW5Db25maWdTY2hlbWE+O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gYWNjZXB0ZWQgYnkgdGhlIExha2Vib3ggQXBwS2l0IHBsdWdpbi5cbiAqXG4gKiBQYXNzIGEgc2hhcmVkIHJ1bnRpbWUgd2hlbiB0aGUgcGx1Z2luIGFuZCB0aGUgTWFzdHJhIHdvcmtzcGFjZSByZXNvbHZlciBtdXN0XG4gKiB1c2UgdGhlIHNhbWUgc2Vzc2lvbnMsIHJvdXRlcywgYW5kIG1ldHJpY3MuXG4gKi9cbmV4cG9ydCB0eXBlIExha2Vib3hQbHVnaW5Db25maWcgPSBCYXNlUGx1Z2luQ29uZmlnICZcbiAgUGFydGlhbDxTZXJpYWxpemFibGVMYWtlYm94UGx1Z2luQ29uZmlnPiAmIHtcbiAgICBydW50aW1lPzogaW1wb3J0KFwiLi9ydW50aW1lLnRzXCIpLkxha2Vib3hSdW50aW1lO1xuICB9O1xuXG4vKipcbiAqIFJlc29sdmVzIGRlZmF1bHRzIHRocm91Z2ggY29uZmlnVXRpbHMgYW5kIHJlbW92ZXMgQXBwS2l0LW9ubHkgZmllbGRzLlxuICpcbiAqIEB0aHJvd3MgQSBab2QgdmFsaWRhdGlvbiBlcnJvciB3aGVuIGEgZmllbGQgaGFzIGFuIGludmFsaWQgdHlwZSBvciByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMYWtlYm94UGx1Z2luQ29uZmlnKFxuICBjb25maWc6IExha2Vib3hQbHVnaW5Db25maWcgPSB7fSxcbik6IFJlc29sdmVkTGFrZWJveFBsdWdpbkNvbmZpZyB7XG4gIGNvbnN0IHtcbiAgICBydW50aW1lOiBfcnVudGltZSxcbiAgICBuYW1lOiBfbmFtZSxcbiAgICBob3N0OiBfaG9zdCxcbiAgICBjb250ZXh0OiBfY29udGV4dCxcbiAgICB0ZWxlbWV0cnk6IF90ZWxlbWV0cnksXG4gICAgc3RyZWFtQ29uZmlnOiBfc3RyZWFtLFxuICAgIGFwcGxpY2F0aW9uLFxuICAgIGlkbGVUaW1lb3V0U2Vjb25kcyxcbiAgICBkZXN0cm95QWZ0ZXJTdGFydHVwRmFpbHVyZVNlY29uZHMsXG4gICAgc3NoVHJhbnNwb3J0LFxuICAgIHNzaDJQYXRjaCxcbiAgICAuLi5zZXJpYWxpemFibGVcbiAgfSA9IGNvbmZpZztcbiAgcmV0dXJuIExha2Vib3hQbHVnaW5Db25maWdTY2hlbWEucGFyc2Uoe1xuICAgIC4uLnNlcmlhbGl6YWJsZSxcbiAgICBhcHBsaWNhdGlvbjpcbiAgICAgIHN0cmluZyhhcHBsaWNhdGlvbiwgQVBQTElDQVRJT05fQ09ORklHX0tFWSkgPz9cbiAgICAgIHN0cmluZyh1bmRlZmluZWQsIFwiREFUQUJSSUNLU19BUFBfTkFNRVwiLCBFTlZfT05MWSkgPz9cbiAgICAgIGJhc2VuYW1lKHJvb3QoKSA/PyBwcm9jZXNzLmN3ZCgpKSxcbiAgICBpZGxlVGltZW91dFNlY29uZHM6IHBvc2l0aXZlSW50KGlkbGVUaW1lb3V0U2Vjb25kcywgSURMRV9USU1FT1VUX0NPTkZJR19LRVksIDNfNjAwKSxcbiAgICBkZXN0cm95QWZ0ZXJTdGFydHVwRmFpbHVyZVNlY29uZHM6IF9kZXN0cm95QWZ0ZXJTdGFydHVwRmFpbHVyZVNlY29uZHMoXG4gICAgICBkZXN0cm95QWZ0ZXJTdGFydHVwRmFpbHVyZVNlY29uZHMsXG4gICAgKSxcbiAgICBzc2hUcmFuc3BvcnQ6IHN0cmluZyhzc2hUcmFuc3BvcnQsIFNTSF9UUkFOU1BPUlRfQ09ORklHX0tFWSksXG4gICAgc3NoMlBhdGNoOiBzdHJpbmcoc3NoMlBhdGNoLCBTU0gyX1BBVENIX0NPTkZJR19LRVkpLFxuICB9KTtcbn1cbiJdfQ==
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixNQUFNLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO0FBQ3JELE1BQU0sdUJBQXVCLEdBQUcsOEJBQThCLENBQUM7QUFDL0QsTUFBTSx3QkFBd0IsR0FBRyx1QkFBdUIsQ0FBQztBQUN6RCxNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUM7S0FDdkMsTUFBTSxDQUFDO0lBQ04sSUFBSSxFQUFFLENBQUM7U0FDSixPQUFPLEVBQUU7U0FDVCxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ2IsUUFBUSxDQUNQLHFHQUFxRyxDQUN0RztJQUNILFdBQVcsRUFBRSxDQUFDO1NBQ1gsTUFBTSxFQUFFO1NBQ1IsSUFBSSxFQUFFO1NBQ04sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNOLFFBQVEsQ0FDUCw2RUFBNkUsV0FBVyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyw4REFBOEQsQ0FDcEw7SUFDSCxrQkFBa0IsRUFBRSxDQUFDO1NBQ2xCLE1BQU0sRUFBRTtTQUNSLEdBQUcsRUFBRTtTQUNMLEdBQUcsQ0FBQyxFQUFFLENBQUM7U0FDUCxHQUFHLENBQUMsTUFBTSxDQUFDO1NB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IjtcbmltcG9ydCB0eXBlIHsgQmFzZVBsdWdpbkNvbmZpZyB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGNvbmZpZ1V0aWxzLCBzdHJpbmcsIEVOVl9PTkxZLCBwb3NpdGl2ZUludCwgcm9vdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IFNzaDJQYXRjaE1vZGVTY2hlbWEsIFNzaFRyYW5zcG9ydE1vZGVTY2hlbWEgfSBmcm9tIFwiQGRieC10b29scy9sYWtlYm94XCI7XG5pbXBvcnQgeyBMQUtFQk9YX0RFRkFVTFRfUk9VVEVfUFJFRklYIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWxha2Vib3hcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IEFQUExJQ0FUSU9OX0NPTkZJR19LRVkgPSBcIkxBS0VCT1hfQVBQTElDQVRJT05cIjtcbmNvbnN0IElETEVfVElNRU9VVF9DT05GSUdfS0VZID0gXCJMQUtFQk9YX0lETEVfVElNRU9VVF9TRUNPTkRTXCI7XG5jb25zdCBTU0hfVFJBTlNQT1JUX0NPTkZJR19LRVkgPSBcIkxBS0VCT1hfU1NIX1RSQU5TUE9SVFwiO1xuY29uc3QgU1NIMl9QQVRDSF9DT05GSUdfS0VZID0gXCJMQUtFQk9YX1NTSF9TU0gyX1BBVENIXCI7XG5cbmV4cG9ydCBjb25zdCBMYWtlYm94UGx1Z2luQ29uZmlnU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBhdXRvOiB6XG4gICAgICAuYm9vbGVhbigpXG4gICAgICAuZGVmYXVsdCh0cnVlKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBcIldoZXRoZXIgY29tbWFuZHMsIHNlcnZpY2VzLCBhbmQgcm91dGVzIGNyZWF0ZSBvciBzdGFydCB0aGUgYXBwIExha2Vib3ggb24gZGVtYW5kLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgICAgKSxcbiAgICBhcHBsaWNhdGlvbjogelxuICAgICAgLnN0cmluZygpXG4gICAgICAudHJpbSgpXG4gICAgICAubWluKDEpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIGBTdGFibGUgYXBwbGljYXRpb24ga2V5IGZvciB0aGUgcGVyc2lzdGVkIExha2Vib3ggcmVzb3VyY2UgSUQuIERlZmF1bHRzIHRvICR7Y29uZmlnVXRpbHMubmFtZShBUFBMSUNBVElPTl9DT05GSUdfS0VZKX0sIHRoZW4gREFUQUJSSUNLU19BUFBfTkFNRSwgdGhlbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkgbmFtZS5gLFxuICAgICAgKSxcbiAgICBpZGxlVGltZW91dFNlY29uZHM6IHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLmludCgpXG4gICAgICAubWluKDYwKVxuICAgICAgLm1heCg4Nl80MDApXG4gICAgICAuZGVmYXVsdCgzXzYwMClcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgYFBsYXRmb3JtIGlkbGUgdGltZW91dCB0aGF0IHN0b3BzIHRoZSBMYWtlYm94IGFmdGVyIGluYWN0aXZpdHksIGZyb20gNjAgdG8gODY0MDAgc2Vjb25kcy4gRGVmYXVsdHMgdG8gMzYwMDsgY29uZmlndXJlIHdpdGggJHtjb25maWdVdGlscy5uYW1lKElETEVfVElNRU9VVF9DT05GSUdfS0VZKX0uYCxcbiAgICAgICksXG4gICAgcm91dGVQcmVmaXg6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAuZGVmYXVsdChMQUtFQk9YX0RFRkFVTFRfUk9VVEVfUFJFRklYKVxuICAgICAgLmRlc2NyaWJlKFwiQXBwS2l0IHJvb3QgcGF0aCBmb3IgdXNlciBzZXJ2aWNlIHJvdXRlcy4gRGVmYXVsdHMgdG8gL2xha2Vib3guXCIpLFxuICAgIGdhdGV3YXlQb3J0OiB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5pbnQoKVxuICAgICAgLm1pbigxKVxuICAgICAgLm1heCg2NTUzNSlcbiAgICAgIC5kZWZhdWx0KDIyMjIpXG4gICAgICAuZGVzY3JpYmUoXCJMYWtlYm94IFNTSCBnYXRld2F5IHBvcnQuIERlZmF1bHRzIHRvIDIyMjIuXCIpLFxuICAgIGNvbm5lY3RUaW1lb3V0TXM6IHpcbiAgICAgIC5udW1iZXIoKVxuICAgICAgLmludCgpXG4gICAgICAucG9zaXRpdmUoKVxuICAgICAgLmRlZmF1bHQoMzBfMDAwKVxuICAgICAgLmRlc2NyaWJlKFwiU1NIIGNvbm5lY3Rpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDMwMDAwLlwiKSxcbiAgICBjb21tYW5kVGltZW91dE1zOiB6XG4gICAgICAubnVtYmVyKClcbiAgICAgIC5pbnQoKVxuICAgICAgLnBvc2l0aXZlKClcbiAgICAgIC5kZWZhdWx0KDEyMF8wMDApXG4gICAgICAuZGVzY3JpYmUoXCJEZWZhdWx0IGNvbW1hbmQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDEyMDAwMC5cIiksXG4gICAgbWV0cmljc0ludGVydmFsU2Vjb25kczogelxuICAgICAgLm51bWJlcigpXG4gICAgICAuaW50KClcbiAgICAgIC5taW4oMSlcbiAgICAgIC5tYXgoMzAwKVxuICAgICAgLmRlZmF1bHQoNSlcbiAgICAgIC5kZXNjcmliZShcIkludGVydmFsIGJldHdlZW4gbWV0cmljcyBzYW1wbGVzIHdoaWxlIHRoZSBMYWtlYm94IHJ1bnMuIERlZmF1bHRzIHRvIDUuXCIpLFxuICAgIHNzaFRyYW5zcG9ydDogU3NoVHJhbnNwb3J0TW9kZVNjaGVtYS5kZXNjcmliZShcbiAgICAgIGBTU0ggdHJhbnNwb3J0OiBhdXRvLCBvcGVuc3NoLCBvciBzc2gyLiBDb25maWd1cmUgd2l0aCAke2NvbmZpZ1V0aWxzLm5hbWUoU1NIX1RSQU5TUE9SVF9DT05GSUdfS0VZKX0uYCxcbiAgICApLFxuICAgIHNzaDJQYXRjaDogU3NoMlBhdGNoTW9kZVNjaGVtYS5kZXNjcmliZShcbiAgICAgIGBzc2gyIG1pc3NpbmctZXhlYy1yZXBseSB3b3JrYXJvdW5kOiBhdXRvLCB0cnVlLCBvciBmYWxzZS4gQ29uZmlndXJlIHdpdGggJHtjb25maWdVdGlscy5uYW1lKFNTSDJfUEFUQ0hfQ09ORklHX0tFWSl9LmAsXG4gICAgKSxcbiAgICBrZXlEaXJlY3Rvcnk6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm1pbigxKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIlNlcnZlci1zaWRlIGRpcmVjdG9yeSBmb3IgdGhlIGFwcCBTU0gga2V5IGFuZCBnYXRld2F5IGhvc3Qga2V5cy5cIiksXG4gIH0pXG4gIC5zdHJpY3QoKVxuICAuZGVzY3JpYmUoXCJTZXJpYWxpemFibGUgTGFrZWJveCBBcHBLaXQgcGx1Z2luIGNvbmZpZ3VyYXRpb24uXCIpO1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVMYWtlYm94UGx1Z2luQ29uZmlnID0gei5pbnB1dDx0eXBlb2YgTGFrZWJveFBsdWdpbkNvbmZpZ1NjaGVtYT47XG5leHBvcnQgdHlwZSBSZXNvbHZlZExha2Vib3hQbHVnaW5Db25maWcgPSB6Lm91dHB1dDx0eXBlb2YgTGFrZWJveFBsdWdpbkNvbmZpZ1NjaGVtYT47XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBhY2NlcHRlZCBieSB0aGUgTGFrZWJveCBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIFBhc3MgYSBzaGFyZWQgcnVudGltZSB3aGVuIHRoZSBwbHVnaW4gYW5kIHRoZSBNYXN0cmEgd29ya3NwYWNlIHJlc29sdmVyIG11c3RcbiAqIHVzZSB0aGUgc2FtZSBzZXNzaW9ucywgcm91dGVzLCBhbmQgbWV0cmljcy5cbiAqL1xuZXhwb3J0IHR5cGUgTGFrZWJveFBsdWdpbkNvbmZpZyA9IEJhc2VQbHVnaW5Db25maWcgJlxuICBQYXJ0aWFsPFNlcmlhbGl6YWJsZUxha2Vib3hQbHVnaW5Db25maWc+ICYge1xuICAgIHJ1bnRpbWU/OiBpbXBvcnQoXCIuL3J1bnRpbWUudHNcIikuTGFrZWJveFJ1bnRpbWU7XG4gIH07XG5cbi8qKlxuICogUmVzb2x2ZXMgZGVmYXVsdHMgdGhyb3VnaCBjb25maWdVdGlscyBhbmQgcmVtb3ZlcyBBcHBLaXQtb25seSBmaWVsZHMuXG4gKlxuICogQHRocm93cyBBIFpvZCB2YWxpZGF0aW9uIGVycm9yIHdoZW4gYSBmaWVsZCBoYXMgYW4gaW52YWxpZCB0eXBlIG9yIHJhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxha2Vib3hQbHVnaW5Db25maWcoXG4gIGNvbmZpZzogTGFrZWJveFBsdWdpbkNvbmZpZyA9IHt9LFxuKTogUmVzb2x2ZWRMYWtlYm94UGx1Z2luQ29uZmlnIHtcbiAgY29uc3Qge1xuICAgIHJ1bnRpbWU6IF9ydW50aW1lLFxuICAgIG5hbWU6IF9uYW1lLFxuICAgIGhvc3Q6IF9ob3N0LFxuICAgIGNvbnRleHQ6IF9jb250ZXh0LFxuICAgIHRlbGVtZXRyeTogX3RlbGVtZXRyeSxcbiAgICBzdHJlYW1Db25maWc6IF9zdHJlYW0sXG4gICAgYXBwbGljYXRpb24sXG4gICAgaWRsZVRpbWVvdXRTZWNvbmRzLFxuICAgIHNzaFRyYW5zcG9ydCxcbiAgICBzc2gyUGF0Y2gsXG4gICAgLi4uc2VyaWFsaXphYmxlXG4gIH0gPSBjb25maWc7XG4gIHJldHVybiBMYWtlYm94UGx1Z2luQ29uZmlnU2NoZW1hLnBhcnNlKHtcbiAgICAuLi5zZXJpYWxpemFibGUsXG4gICAgYXBwbGljYXRpb246XG4gICAgICBzdHJpbmcoYXBwbGljYXRpb24sIEFQUExJQ0FUSU9OX0NPTkZJR19LRVkpID8/XG4gICAgICBzdHJpbmcodW5kZWZpbmVkLCBcIkRBVEFCUklDS1NfQVBQX05BTUVcIiwgRU5WX09OTFkpID8/XG4gICAgICBiYXNlbmFtZShyb290KCkgPz8gcHJvY2Vzcy5jd2QoKSksXG4gICAgaWRsZVRpbWVvdXRTZWNvbmRzOiBwb3NpdGl2ZUludChpZGxlVGltZW91dFNlY29uZHMsIElETEVfVElNRU9VVF9DT05GSUdfS0VZLCAzXzYwMCksXG4gICAgc3NoVHJhbnNwb3J0OiBzdHJpbmcoc3NoVHJhbnNwb3J0LCBTU0hfVFJBTlNQT1JUX0NPTkZJR19LRVkpLFxuICAgIHNzaDJQYXRjaDogc3RyaW5nKHNzaDJQYXRjaCwgU1NIMl9QQVRDSF9DT05GSUdfS0VZKSxcbiAgfSk7XG59XG4iXX0=
|
package/lib/src/runtime.d.ts
CHANGED
|
@@ -116,9 +116,8 @@ export declare class LakeboxRuntime {
|
|
|
116
116
|
/** Serializes create, start, connect, and bootstrap for the current boot. */
|
|
117
117
|
private ready;
|
|
118
118
|
private converge;
|
|
119
|
-
private startupTimeoutMs;
|
|
120
|
-
private replaceUnreachable;
|
|
121
119
|
private connect;
|
|
120
|
+
private refreshSshEntry;
|
|
122
121
|
private waitForSshRetry;
|
|
123
122
|
private connectOnce;
|
|
124
123
|
/** Runs the fixed privileged bootstrap and returns the restored user hashes. */
|
package/lib/src/runtime.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { ExecutionError } from "@databricks/appkit";
|
|
3
2
|
import { onParentTerminationSignal } from "@dbx-tools/core";
|
|
4
3
|
import { SshKeyStore, ensureLakeboxRunning, ensureLakeboxStopped, lakeboxIdleTimeoutSeconds, normalizeLakeboxStatus, SshCommand, SshSession, } from "@dbx-tools/lakebox";
|
|
5
4
|
import { isLakeboxUnavailable, LakeboxApiError, LakeboxClient, } from "@dbx-tools/lakebox";
|
|
@@ -422,33 +421,11 @@ export class LakeboxRuntime {
|
|
|
422
421
|
}
|
|
423
422
|
entry = await ensureLakeboxRunning(this.client(), entry, operationSignal);
|
|
424
423
|
this.cached = { entry, at: Date.now() };
|
|
425
|
-
|
|
424
|
+
const key = this.bootKey(entry);
|
|
426
425
|
if (this.boot?.key === key)
|
|
427
426
|
return this.boot;
|
|
428
427
|
await this.discardBoot();
|
|
429
|
-
|
|
430
|
-
try {
|
|
431
|
-
session = await this.connect(entry, operationSignal, this.startupTimeoutMs());
|
|
432
|
-
}
|
|
433
|
-
catch (error) {
|
|
434
|
-
if (this.config.destroyAfterStartupFailureSeconds === false)
|
|
435
|
-
throw error;
|
|
436
|
-
logger.warn("Lakebox SSH startup timed out; replacing the machine", {
|
|
437
|
-
id: entry.sandboxId,
|
|
438
|
-
timeoutSeconds: this.config.destroyAfterStartupFailureSeconds,
|
|
439
|
-
});
|
|
440
|
-
entry = await this.replaceUnreachable(entry, operationSignal);
|
|
441
|
-
key = this.bootKey(entry);
|
|
442
|
-
try {
|
|
443
|
-
session = await this.connect(entry, operationSignal, this.startupTimeoutMs());
|
|
444
|
-
}
|
|
445
|
-
catch (replacementError) {
|
|
446
|
-
throw new ExecutionError("Replacement Lakebox SSH gateway did not become ready", {
|
|
447
|
-
cause: toError(replacementError),
|
|
448
|
-
clientMessage: "The replacement Lakebox also failed to start.",
|
|
449
|
-
});
|
|
450
|
-
}
|
|
451
|
-
}
|
|
428
|
+
const session = await this.connect(entry, operationSignal);
|
|
452
429
|
const boot = {
|
|
453
430
|
key,
|
|
454
431
|
entry,
|
|
@@ -475,33 +452,7 @@ export class LakeboxRuntime {
|
|
|
475
452
|
throw error;
|
|
476
453
|
}
|
|
477
454
|
}
|
|
478
|
-
|
|
479
|
-
return this.config.destroyAfterStartupFailureSeconds === false
|
|
480
|
-
? SSH_READY_TIMEOUT_MS
|
|
481
|
-
: this.config.destroyAfterStartupFailureSeconds * 1_000;
|
|
482
|
-
}
|
|
483
|
-
async replaceUnreachable(entry, signal) {
|
|
484
|
-
let replacement;
|
|
485
|
-
try {
|
|
486
|
-
replacement = await this.resources().recreate(this.client(), entry.sandboxId, signal);
|
|
487
|
-
}
|
|
488
|
-
catch (error) {
|
|
489
|
-
const cause = toError(error);
|
|
490
|
-
throw new ExecutionError(`Could not destroy and replace Lakebox ${entry.sandboxId}`, {
|
|
491
|
-
cause,
|
|
492
|
-
clientMessage: cause.message,
|
|
493
|
-
});
|
|
494
|
-
}
|
|
495
|
-
this.cached = undefined;
|
|
496
|
-
this.readyBootKey = undefined;
|
|
497
|
-
if (lakeboxIdleTimeoutSeconds(replacement.idleTimeout) !== this.config.idleTimeoutSeconds) {
|
|
498
|
-
replacement = await this.client().setIdleTimeout(replacement.sandboxId, this.config.idleTimeoutSeconds, signal);
|
|
499
|
-
}
|
|
500
|
-
replacement = await ensureLakeboxRunning(this.client(), replacement, signal);
|
|
501
|
-
this.cached = { entry: replacement, at: Date.now() };
|
|
502
|
-
return replacement;
|
|
503
|
-
}
|
|
504
|
-
async connect(entry, signal, timeoutMs) {
|
|
455
|
+
async connect(entry, signal) {
|
|
505
456
|
const startedAt = Date.now();
|
|
506
457
|
let attempt = 0;
|
|
507
458
|
while (true) {
|
|
@@ -510,9 +461,10 @@ export class LakeboxRuntime {
|
|
|
510
461
|
}
|
|
511
462
|
catch (error) {
|
|
512
463
|
attempt += 1;
|
|
513
|
-
if (!_isTransientSshStartupError(error) || Date.now() - startedAt >=
|
|
464
|
+
if (!_isTransientSshStartupError(error) || Date.now() - startedAt >= SSH_READY_TIMEOUT_MS) {
|
|
514
465
|
throw error;
|
|
515
466
|
}
|
|
467
|
+
entry = await this.refreshSshEntry(entry, signal);
|
|
516
468
|
const delayMs = Math.min(SSH_READY_RETRY_INITIAL_MS * 2 ** (attempt - 1), SSH_READY_RETRY_MAX_MS);
|
|
517
469
|
logger.info("Lakebox SSH gateway is not ready; retrying", {
|
|
518
470
|
attempt,
|
|
@@ -522,6 +474,17 @@ export class LakeboxRuntime {
|
|
|
522
474
|
}
|
|
523
475
|
}
|
|
524
476
|
}
|
|
477
|
+
async refreshSshEntry(entry, signal) {
|
|
478
|
+
const refreshed = await this.client().get(entry.sandboxId, signal);
|
|
479
|
+
if (refreshed.gatewayHost !== entry.gatewayHost) {
|
|
480
|
+
logger.info("Lakebox SSH gateway address changed during startup", {
|
|
481
|
+
previousHost: entry.gatewayHost,
|
|
482
|
+
gatewayHost: refreshed.gatewayHost,
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
this.cached = { entry: refreshed, at: Date.now() };
|
|
486
|
+
return refreshed;
|
|
487
|
+
}
|
|
525
488
|
waitForSshRetry(delayMs, signal) {
|
|
526
489
|
return sleep(delayMs, signal);
|
|
527
490
|
}
|
|
@@ -844,4 +807,4 @@ function shellQuote(value) {
|
|
|
844
807
|
export function isLakeboxMissing(error) {
|
|
845
808
|
return error instanceof LakeboxApiError && error.status === 404;
|
|
846
809
|
}
|
|
847
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFDTCxXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixhQUFhLEdBR2QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekUsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsMkJBQTJCLEVBQzNCLCtCQUErQixHQVdoQyxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwRCxPQUFPLEVBQTJCLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFM0YsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQStCLE1BQU0sYUFBYSxDQUFDO0FBQ2hGLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIsWUFBWSxFQUNaLGdCQUFnQixHQUdqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxD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QyxJQUFJLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLE1BQU0sQ0FBQyxVQUF1QztJQUNyRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUMvQyxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sS0FBSyxZQUFZLGVBQWUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgRXhlY3V0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBvblBhcmVudFRlcm1pbmF0aW9uU2lnbmFsIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgU3NoS2V5U3RvcmUsXG4gIGVuc3VyZUxha2Vib3hSdW5uaW5nLFxuICBlbnN1cmVMYWtlYm94U3RvcHBlZCxcbiAgbGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyxcbiAgbm9ybWFsaXplTGFrZWJveFN0YXR1cyxcbiAgU3NoQ29tbWFuZCxcbiAgU3NoU2Vzc2lvbixcbn0gZnJvbSBcIkBkYngtdG9vbHMvbGFrZWJveFwiO1xuaW1wb3J0IHtcbiAgaXNMYWtlYm94VW5hdmFpbGFibGUsXG4gIExha2Vib3hBcGlFcnJvcixcbiAgTGFrZWJveENsaWVudCxcbiAgdHlwZSBMYWtlYm94QXV0aCxcbiAgdHlwZSBMYWtlYm94RW50cnksXG59IGZyb20gXCJAZGJ4LXRvb2xzL2xha2Vib3hcIjtcbmltcG9ydCB7IGVycm9yTm9kZXMsIGxvZywgc2xlZXAsIHRvRXJyb3IgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTEFLRUJPWF9CVUlMVF9JTl9TRVJWSUNFUyxcbiAgbGFrZWJveEJ1aWx0SW5TZXJ2aWNlTmFtZVNjaGVtYSxcbiAgbGFrZWJveENvbW1hbmRSZXF1ZXN0U2NoZW1hLFxuICBsYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0U2NoZW1hLFxuICB0eXBlIENyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lLFxuICB0eXBlIExha2Vib3hDb21tYW5kUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94TWV0cmljc1Jlc3BvbnNlLFxuICB0eXBlIExha2Vib3hNZXRyaWNzU25hcHNob3QsXG4gIHR5cGUgTGFrZWJveFNlcnZpY2UsXG4gIHR5cGUgTGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdCxcbiAgdHlwZSBMYWtlYm94U3RhdHVzLFxuICB0eXBlIExha2Vib3hTdW1tYXJ5LFxuICB0eXBlIExha2Vib3hVc2VyLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbGFrZWJveFwiO1xuaW1wb3J0IHsgcmVhZFBhY2thZ2VSZXNvdXJjZSB9IGZyb20gXCIuL19wYWNrYWdlLnRzXCI7XG5pbXBvcnQgeyBMYWtlYm94UmVzb3VyY2VSZWdpc3RyeSB9IGZyb20gXCIuL19yZXNvdXJjZS1yZWdpc3RyeS50c1wiO1xuaW1wb3J0IHsgTGFrZWJveFNlcnZpY2VTbmFwc2hvdHMsIHN0b3BwZWRTbmFwc2hvdFNlcnZpY2VzIH0gZnJvbSBcIi4vX3NlcnZpY2Utc25hcHNob3RzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkTGFrZWJveFBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgTGFrZWJveE1ldHJpY3MgfSBmcm9tIFwiLi9tZXRyaWNzLnRzXCI7XG5pbXBvcnQgeyBMYWtlYm94Um91dGVSZWdpc3RyeSwgdHlwZSBMYWtlYm94Um91dGVSZXNvbHV0aW9uIH0gZnJvbSBcIi4vcm91dGVzLnRzXCI7XG5pbXBvcnQge1xuICBidWlsdEluRGVmaW5pdGlvbixcbiAgaWRsZUJ1aWx0SW5TZXJ2aWNlLFxuICBpbWFnZURlZmluaXRpb24sXG4gIExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYSxcbiAgc2VydmljZVJvdXRlLFxuICB0b0xha2Vib3hTZXJ2aWNlLFxuICB0eXBlIExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbixcbiAgdHlwZSBMYWtlYm94Q29udHJvbGxlclNlcnZpY2UsXG59IGZyb20gXCIuL3NlcnZpY2VzLnRzXCI7XG5pbXBvcnQgeyBMQUtFQk9YX1JVTlRJTUVfUk9PVCwgbGFrZWJveFVzZXIgfSBmcm9tIFwiLi91c2VyLnRzXCI7XG5cbmNvbnN0IEFETUlOX1NDUklQVCA9IHJlYWRQYWNrYWdlUmVzb3VyY2UoXCJzY3JpcHRzXCIsIFwibGFrZWJveC1hZG1pbi5zaFwiKTtcbmNvbnN0IEhFTFBFUlMgPSB7XG4gIFwibGFrZWJveC1zZXJ2aWNlXCI6IHJlYWRQYWNrYWdlUmVzb3VyY2UoXCJzY3JpcHRzXCIsIFwibGFrZWJveC1zZXJ2aWNlLnB5XCIpLFxuICBcImRlc2t0b3Atc2Vzc2lvblwiOiByZWFkUGFja2FnZVJlc291cmNlKFwic2NyaXB0c1wiLCBcImRlc2t0b3Atc2Vzc2lvbi5zaFwiKSxcbiAgXCJkZXNrdG9wLXByZXJlcXVpc2l0ZXNcIjogcmVhZFBhY2thZ2VSZXNvdXJjZShcInNjcmlwdHNcIiwgXCJkZXNrdG9wLXByZXJlcXVpc2l0ZXMuc2hcIiksXG59IGFzIGNvbnN0O1xuY29uc3QgQ09OVFJPTExFUiA9IGAke0xBS0VCT1hfUlVOVElNRV9ST09UfS9iaW4vbGFrZWJveC1zZXJ2aWNlYDtcbmNvbnN0IEVOVFJZX1RUTF9NUyA9IDVfMDAwO1xuY29uc3QgU0VUVVBfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBTU0hfUkVBRFlfVElNRU9VVF9NUyA9IDMwMF8wMDA7XG5jb25zdCBTU0hfUkVBRFlfUkVUUllfSU5JVElBTF9NUyA9IDFfMDAwO1xuY29uc3QgU1NIX1JFQURZX1JFVFJZX01BWF9NUyA9IDEwXzAwMDtcbmNvbnN0IFRSQU5TSUVOVF9TU0hfQ09ERVMgPSBuZXcgU2V0KFtcbiAgXCJFQ09OTlJFRlVTRURcIixcbiAgXCJFQ09OTlJFU0VUXCIsXG4gIFwiRUhPU1RVTlJFQUNIXCIsXG4gIFwiRU5FVFVOUkVBQ0hcIixcbiAgXCJFVElNRURPVVRcIixcbl0pO1xuY29uc3QgTUVUUklDU19MRUFTRV9NUyA9IDYwXzAwMDtcbmNvbnN0IElETEVfQ0hFQ0tfTVMgPSAzMF8wMDA7XG5jb25zdCBTU0hfS0VZX09XTkVSID0gXCJhcHAtc2VydmljZS1wcmluY2lwYWxcIjtcbmNvbnN0IExFR0FDWV9OQU1FID1cbiAgL15kYngtKD8hbGFrZWJveC0pW2Etel0rLVthLXpdKy1bMC05YS1mXXs4fSg/Ol91aWRfW0EtWmEtejAtOV8tXStfZXhwX1swLTldKyk/JC87XG5jb25zdCBMRUdBQ1lfU0NIRU1BX1BSRUZJWCA9IFwiZGJ4X3Rvb2xzX2RhdGFicmlja3Nfc2FuZGJveFwiO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImFwcGtpdC1sYWtlYm94OnJ1bnRpbWVcIik7XG5cbi8qKiBXaGV0aGVyIHRoZSBwbGF0Zm9ybSBpcyBydW5uaW5nIGJ1dCBpdHMgU1NIIGdhdGV3YXkgaXMgc3RpbGwgYmVjb21pbmcgcmVhY2hhYmxlLiAqL1xuZnVuY3Rpb24gX2lzVHJhbnNpZW50U3NoU3RhcnR1cEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBbLi4uZXJyb3JOb2RlcyhlcnJvcildLnNvbWUoXG4gICAgKG5vZGUpID0+XG4gICAgICB0eXBlb2Ygbm9kZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgXCJjb2RlXCIgaW4gbm9kZSAmJlxuICAgICAgVFJBTlNJRU5UX1NTSF9DT0RFUy5oYXMoU3RyaW5nKChub2RlIGFzIHsgY29kZT86IHVua25vd24gfSkuY29kZSkpLFxuICApO1xufVxuXG4vKiogUmVzb2x2ZXMgdGhlIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgZm9yIHJhdyByZXF1ZXN0IGhlYWRlcnMuICovXG5leHBvcnQgdHlwZSBMYWtlYm94SWRlbnRpdHlSZXNvbHZlciA9IChoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbi8qKiBNaW5pbWFsIExha2ViYXNlIHBvb2wgdXNlZCB0byBkcm9wIGxlZ2FjeSBvd25lcnNoaXAgc2NoZW1hcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJveExlZ2FjeVBvb2wge1xuICBxdWVyeShzcWw6IHN0cmluZywgdmFsdWVzPzogdW5rbm93bltdKTogUHJvbWlzZTx7IHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9Pjtcbn1cblxuaW50ZXJmYWNlIEJvb3Qge1xuICBrZXk6IHN0cmluZztcbiAgZW50cnk6IExha2Vib3hFbnRyeTtcbiAgc2Vzc2lvbjogU3NoU2Vzc2lvbjtcbiAgdXNlcnM6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+O1xuICBzZXJ2aWNlczogTWFwPHN0cmluZywgTWFwPHN0cmluZywgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlPj47XG4gIHN0YXJ0aW5nOiBNYXA8c3RyaW5nLCBQcm9taXNlPExha2Vib3hTZXJ2aWNlPj47XG4gIGRlc2t0b3A/OiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgU2VydmljZUxpc3Rpbmcge1xuICBzZXJ2aWNlczogTGFrZWJveFNlcnZpY2VbXTtcbiAgc3RhbGU6IGJvb2xlYW47XG4gIG9ic2VydmVkQXQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3ducyB0aGUgc2luZ2xlIGxhemlseSBjcmVhdGVkIExha2Vib3ggb2Ygb25lIGFwcGxpY2F0aW9uLlxuICpcbiAqIEV2ZXJ5IERhdGFicmlja3MgTGFrZWJveCBSRVNUIGNhbGwgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsIHN1cHBsaWVkXG4gKiB0aHJvdWdoIHtAbGluayBpbml0aWFsaXplfTsgcmVxdWVzdCBpZGVudGl0eSBvbmx5IHNlbGVjdHMgdGhlIGludGVybmFsIExpbnV4XG4gKiBhY2NvdW50LiBFYWNoIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgbWFwcyB0aHJvdWdoIG9uZSBGTlYtMWEgaGFzaCB0byBhIGxvY2tlZFxuICogYWNjb3VudCwgcGVyc2lzdGVudCBob21lLCByb3V0ZSBzZWdtZW50LCBhbmQgc2VydmljZSBwb3J0cy4gTGlmZWN5Y2xlIGFuZFxuICogcGVyLWJvb3QgYm9vdHN0cmFwIGFyZSBzZXJpYWxpemVkIGluLXByb2Nlc3M7IHRoZSBwZXJzaXN0ZW50IHJlc291cmNlXG4gKiByZWdpc3RyeSBzZXJpYWxpemVzIGZpcnN0IGNyZWF0aW9uIGFjcm9zcyByZXBsaWNhcy5cbiAqL1xuZXhwb3J0IGNsYXNzIExha2Vib3hSdW50aW1lIHtcbiAgcmVhZG9ubHkgcm91dGVzOiBMYWtlYm94Um91dGVSZWdpc3RyeTtcbiAgcmVhZG9ubHkgbWV0cmljczogTGFrZWJveE1ldHJpY3M7XG4gIHByaXZhdGUgcmVhZG9ubHkga2V5czogU3NoS2V5U3RvcmU7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcFBhcmVudFRlcm1pbmF0aW9uU2lnbmFsOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlYWRvbmx5IHNodXRkb3duQ29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgcHJpdmF0ZSBhcGk/OiBMYWtlYm94Q2xpZW50O1xuICBwcml2YXRlIGlkZW50aXR5OiBMYWtlYm94SWRlbnRpdHlSZXNvbHZlciA9ICgpID0+IHVuZGVmaW5lZDtcbiAgLyoqIEluLW1lbW9yeSBpZGVudGl0aWVzIG9mIHJvdXRlZCB1c2VyczsgbmV2ZXIgcGVyc2lzdGVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlZElkZW50aXRpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIGNhY2hlZD86IHsgZW50cnk/OiBMYWtlYm94RW50cnk7IGF0OiBudW1iZXIgfTtcbiAgcHJpdmF0ZSBib290PzogQm9vdDtcbiAgLyoqIExhc3QgYm9vdCB0aGF0IGNvbXBsZXRlZCBydW50aW1lIGJvb3RzdHJhcCBhbmQgcHJvZHVjZWQgYSBtZXRyaWNzIHNhbXBsZS4gKi9cbiAgcHJpdmF0ZSByZWFkeUJvb3RLZXk/OiBzdHJpbmc7XG4gIHByaXZhdGUgY29udmVyZ2luZz86IFByb21pc2U8Qm9vdD47XG4gIHByaXZhdGUgd2FraW5nPzogUHJvbWlzZTx1bmtub3duPjtcbiAgcHJpdmF0ZSBtZXRyaWNzTGVhc2U/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBpZGxlVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIHByaXZhdGUgbGFzdEFjdGl2aXR5ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBhY3RpdmVDb21tYW5kcyA9IDA7XG4gIC8qKiBMYXN0IHNlcnZpY2Ugc3RhdGVzIHBlciB1c2VyIGhhc2gsIGtlcHQgYWZ0ZXIgYW4gaWRsZSBzZXNzaW9uIHJlbGVhc2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFzdFNlcnZpY2VzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFzdFNlcnZpY2VzT2JzZXJ2ZWRBdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVzb3VyY2VSZWdpc3RyeT86IExha2Vib3hSZXNvdXJjZVJlZ2lzdHJ5O1xuICBwcml2YXRlIHNlcnZpY2VTbmFwc2hvdHM/OiBMYWtlYm94U2VydmljZVNuYXBzaG90cztcbiAgcHJpdmF0ZSBjbG9zaW5nPzogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogQ3JlYXRlcyBhIHJ1bnRpbWUgZnJvbSByZXNvbHZlZCBwbHVnaW4gY29uZmlndXJhdGlvbi4gKi9cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgY29uZmlnOiBSZXNvbHZlZExha2Vib3hQbHVnaW5Db25maWcpIHtcbiAgICB0aGlzLmtleXMgPSBuZXcgU3NoS2V5U3RvcmUoY29uZmlnLmtleURpcmVjdG9yeSk7XG4gICAgdGhpcy5yb3V0ZXMgPSBuZXcgTGFrZWJveFJvdXRlUmVnaXN0cnkoY29uZmlnLnJvdXRlUHJlZml4LCB7XG4gICAgICB1c2VyOiAoaGVhZGVycykgPT4ge1xuICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuaWRlbnRpdHkoaGVhZGVycyk7XG4gICAgICAgIGlmICghaWRlbnRpdHkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgICAgICB0aGlzLnJvdXRlZElkZW50aXRpZXMuc2V0KHVzZXIuaGFzaCwgaWRlbnRpdHkpO1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiAodXNlciwgc2VydmljZSkgPT4gdGhpcy5yZXNvbHZlUm91dGUodXNlciwgc2VydmljZSksXG4gICAgICB1bmF2YWlsYWJsZTogKHVzZXIsIHNlcnZpY2UpID0+IHRoaXMubWFya1VuYXZhaWxhYmxlKHVzZXIsIHNlcnZpY2UpLFxuICAgIH0pO1xuICAgIHRoaXMubWV0cmljcyA9IG5ldyBMYWtlYm94TWV0cmljcyhcbiAgICAgIChzaWduYWwpID0+IHRoaXMucmVhZE1ldHJpY3Moc2lnbmFsKSxcbiAgICAgIGNvbmZpZy5tZXRyaWNzSW50ZXJ2YWxTZWNvbmRzICogMV8wMDAsXG4gICAgKTtcbiAgICB0aGlzLnN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCA9IG9uUGFyZW50VGVybWluYXRpb25TaWduYWwoKCkgPT4gdGhpcy5yb3V0ZXMuYmVnaW5TaHV0ZG93bigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwbGllcyBhcHAgc2VydmljZS1wcmluY2lwYWwgY3JlZGVudGlhbHMgYW5kIHRoZSByZXF1ZXN0IGlkZW50aXR5XG4gICAqIHJlc29sdmVyIHVzZWQgYnkgcm91dGVzLlxuICAgKi9cbiAgaW5pdGlhbGl6ZShcbiAgICBhdXRoOiBMYWtlYm94QXV0aCxcbiAgICBpZGVudGl0eT86IExha2Vib3hJZGVudGl0eVJlc29sdmVyLFxuICAgIHNlcnZpY2VTbmFwc2hvdHM/OiBMYWtlYm94U2VydmljZVNuYXBzaG90cyxcbiAgICByZXNvdXJjZVJlZ2lzdHJ5PzogTGFrZWJveFJlc291cmNlUmVnaXN0cnksXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYXBpID0gbmV3IExha2Vib3hDbGllbnQoYXV0aCk7XG4gICAgaWYgKGlkZW50aXR5KSB0aGlzLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgaWYgKHNlcnZpY2VTbmFwc2hvdHMpIHRoaXMuc2VydmljZVNuYXBzaG90cyA9IHNlcnZpY2VTbmFwc2hvdHM7XG4gICAgaWYgKHJlc291cmNlUmVnaXN0cnkpIHRoaXMucmVzb3VyY2VSZWdpc3RyeSA9IHJlc291cmNlUmVnaXN0cnk7XG4gIH1cblxuICAvKiogRGVyaXZlcyB0aGUgTGFrZWJveCBhY2NvdW50IGZvciBvbmUgYXV0aGVudGljYXRlZCBpZGVudGl0eS4gKi9cbiAgdXNlcihpZGVudGl0eTogc3RyaW5nKTogTGFrZWJveFVzZXIge1xuICAgIHJldHVybiBsYWtlYm94VXNlcihpZGVudGl0eSwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpO1xuICB9XG5cbiAgLyoqIFN1bW1hcml6ZXMgdGhlIGFwcCBMYWtlYm94IGZvciBvbmUgdXNlciB3aXRob3V0IGNyZWF0aW5nIGl0LiAqL1xuICBhc3luYyBzdW1tYXJ5KGlkZW50aXR5OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMYWtlYm94U3VtbWFyeT4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgIGNvbnN0IGJhc2UgPSB7IGF1dG86IHRoaXMuY29uZmlnLmF1dG8sIG5hbWU6IFwiTGFrZWJveFwiLCB1c2VyIH07XG4gICAgbGV0IGVudHJ5OiBMYWtlYm94RW50cnkgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGVudHJ5ID0gYXdhaXQgdGhpcy5lbnRyeShzaWduYWwsIHRydWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNMYWtlYm94VW5hdmFpbGFibGUoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBzdXBwb3J0ZWQ6IGZhbHNlLFxuICAgICAgICAgIHN0YXR1czogXCJtaXNzaW5nXCIsXG4gICAgICAgICAgc2VydmljZXM6IFtdLFxuICAgICAgICAgIHNlcnZpY2VzU3RhbGU6IGZhbHNlLFxuICAgICAgICAgIGNhblN0YXJ0OiBmYWxzZSxcbiAgICAgICAgICBjYW5TdG9wOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCBwbGF0Zm9ybVN0YXR1czogTGFrZWJveFN0YXR1cyA9IGVudHJ5ID8gbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpIDogXCJtaXNzaW5nXCI7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5wcm9kdWN0U3RhdHVzKGVudHJ5LCBwbGF0Zm9ybVN0YXR1cyk7XG4gICAgaWYgKGVudHJ5ICYmIHBsYXRmb3JtU3RhdHVzID09PSBcInJ1bm5pbmdcIiAmJiBzdGF0dXMgPT09IFwic3RhcnRpbmdcIikge1xuICAgICAgdGhpcy53YWtlKCgpID0+IHRoaXMucmVhZHkoKSk7XG4gICAgfVxuICAgIGNvbnN0IGxpc3RpbmcgPSBhd2FpdCB0aGlzLnNlcnZpY2VMaXN0aW5nKGlkZW50aXR5LCB1c2VyLCBlbnRyeSwgc3RhdHVzLCBzaWduYWwpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5iYXNlLFxuICAgICAgc3VwcG9ydGVkOiB0cnVlLFxuICAgICAgc3RhdHVzLFxuICAgICAgLi4uKGVudHJ5ID8geyBpZDogZW50cnkuc2FuZGJveElkIH0gOiB7fSksXG4gICAgICAuLi4obGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyhlbnRyeT8uaWRsZVRpbWVvdXQpICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IGlkbGVUaW1lb3V0U2Vjb25kczogbGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyhlbnRyeT8uaWRsZVRpbWVvdXQpIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBzZXJ2aWNlczogbGlzdGluZy5zZXJ2aWNlcyxcbiAgICAgIHNlcnZpY2VzU3RhbGU6IGxpc3Rpbmcuc3RhbGUsXG4gICAgICAuLi4obGlzdGluZy5vYnNlcnZlZEF0ID8geyBzZXJ2aWNlc09ic2VydmVkQXQ6IGxpc3Rpbmcub2JzZXJ2ZWRBdCB9IDoge30pLFxuICAgICAgY2FuU3RhcnQ6IHN0YXR1cyAhPT0gXCJydW5uaW5nXCIgJiYgc3RhdHVzICE9PSBcInN0YXJ0aW5nXCIsXG4gICAgICBjYW5TdG9wOiBzdGF0dXMgPT09IFwicnVubmluZ1wiIHx8IHN0YXR1cyA9PT0gXCJzdGFydGluZ1wiLFxuICAgIH07XG4gIH1cblxuICAvKiogQ3JlYXRlcyB0aGUgTGFrZWJveCB3aGVuIG5lZWRlZCwgc3RhcnRzIGl0LCBhbmQgcmVzdG9yZXMgc2F2ZWQgc2VydmljZXMuICovXG4gIGFzeW5jIHN0YXJ0KHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWFkeShzaWduYWwsIHRydWUpO1xuICB9XG5cbiAgLyoqIFN0b3BzIHRoZSBzaGFyZWQgTGFrZWJveCBmb3IgZXZlcnkgdXNlci4gRmlsZXMgYW5kIHNhdmVkIHNlcnZpY2VzIHBlcnNpc3QuICovXG4gIGFzeW5jIHN0b3Aoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsLCB0cnVlKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5kaXNjYXJkQm9vdCgpO1xuICAgIGF3YWl0IGVuc3VyZUxha2Vib3hTdG9wcGVkKHRoaXMuY2xpZW50KCksIGVudHJ5LCBzaWduYWwpO1xuICAgIHRoaXMuY2FjaGVkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFBlcm1hbmVudGx5IGRlbGV0ZXMgdGhlIG1hbmFnZWQgTGFrZWJveCBhbmQgZXZlcnkgdXNlcidzIGZpbGVzLiAqL1xuICBhc3luYyBkZWxldGUoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsLCB0cnVlKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgdGhpcy5kaXNjYXJkQm9vdCgpO1xuICAgIGF3YWl0IHRoaXMuY2xpZW50KCkuZGVsZXRlKGVudHJ5LnNhbmRib3hJZCwgc2lnbmFsKTtcbiAgICBhd2FpdCB0aGlzLnJlc291cmNlcygpLmNsZWFyKHRoaXMuY2xpZW50KCkpO1xuICAgIHRoaXMucmVhZHlCb290S2V5ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FjaGVkID0geyBhdDogRGF0ZS5ub3coKSB9O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIGNvbW1hbmQgYXMgdGhlIHVzZXIncyBhY2NvdW50LCBjcmVhdGluZyBvciBzdGFydGluZyB0aGUgTGFrZWJveFxuICAgKiB3aGVuIGBhdXRvYCBpcyBlbmFibGVkLlxuICAgKi9cbiAgZXhlY3V0ZShpZGVudGl0eTogc3RyaW5nLCBpbnB1dDogTGFrZWJveENvbW1hbmRSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFNzaENvbW1hbmQge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBsYWtlYm94Q29tbWFuZFJlcXVlc3RTY2hlbWEucGFyc2UoaW5wdXQpO1xuICAgIGNvbnN0IHRpbWVvdXRNcyA9IHJlcXVlc3QudGltZW91dE1zID8/IHRoaXMuY29uZmlnLmNvbW1hbmRUaW1lb3V0TXM7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgcmV0dXJuIG5ldyBTc2hDb21tYW5kKFxuICAgICAgcmVxdWVzdC5jb21tYW5kLFxuICAgICAgcmVxdWVzdC5hcmdzLFxuICAgICAgeyB0aW1lb3V0TXMsIHNpZ25hbCB9LFxuICAgICAgYXN5bmMgKGV4ZWN1dGlvbikgPT4ge1xuICAgICAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIGV4ZWN1dGlvbi5zaWduYWwpO1xuICAgICAgICB0aGlzLmFjdGl2ZUNvbW1hbmRzICs9IDE7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGlvbi5mb2xsb3coXG4gICAgICAgICAgICBib290LnNlc3Npb24uZXhlY3V0ZShyZXF1ZXN0LmNvbW1hbmQsIHJlcXVlc3QuYXJncywge1xuICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAuLi4ocmVxdWVzdC5jd2QgPyB7IGN3ZDogcmVxdWVzdC5jd2QgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKHJlcXVlc3QuZW52ID8geyBlbnY6IHJlcXVlc3QuZW52IH0gOiB7fSksXG4gICAgICAgICAgICAgIHRpbWVvdXRNcyxcbiAgICAgICAgICAgICAgc2lnbmFsOiBleGVjdXRpb24uc2lnbmFsLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNvbW1hbmRzIC09IDE7XG4gICAgICAgICAgdGhpcy50b3VjaCgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKiogTGlzdHMgdGhlIHVzZXIncyBzZXJ2aWNlcywgaW5jbHVkaW5nIGlkbGUgYnVpbHQtaW5zLiBOZXZlciBjcmVhdGVzIHRoZSBMYWtlYm94LiAqL1xuICBhc3luYyBsaXN0U2VydmljZXMoaWRlbnRpdHk6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExha2Vib3hTZXJ2aWNlW10+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsKTtcbiAgICBjb25zdCBzdGF0dXM6IExha2Vib3hTdGF0dXMgPSBlbnRyeSA/IG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMoZW50cnkuc3RhdHVzKSA6IFwibWlzc2luZ1wiO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5zZXJ2aWNlTGlzdGluZyhpZGVudGl0eSwgdXNlciwgZW50cnksIHN0YXR1cywgc2lnbmFsKSkuc2VydmljZXM7XG4gIH1cblxuICAvKiogQ3JlYXRlcyBvciByZXBsYWNlcyBvbmUgaW1hZ2Ugc2VydmljZSBhbmQgd2FpdHMgdW50aWwgaXQgaXMgcmVhZHkgb3IgZmFpbGVkLiAqL1xuICBhc3luYyBjcmVhdGVTZXJ2aWNlKFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgaW5wdXQ6IENyZWF0ZUxha2Vib3hTZXJ2aWNlUmVxdWVzdCxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxMYWtlYm94U2VydmljZT4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgIGNvbnN0IGRlZmluaXRpb24gPSBpbWFnZURlZmluaXRpb24oaW5wdXQsIHVzZXIpO1xuICAgIGNvbnN0IGJvb3QgPSBhd2FpdCB0aGlzLnJlYWR5VXNlcih1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICBhd2FpdCB0aGlzLmNvbnRyb2xsZXIoYm9vdCwgdXNlciwgXCJwdXRcIiwgW2VuY29kZShkZWZpbml0aW9uKV0sIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRoaXMucnVuU2VydmljZShib290LCB1c2VyLCBkZWZpbml0aW9uLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFN0YXJ0cyBhIHNhdmVkIHNlcnZpY2Ugb3IgYSBidWlsdC1pbiBhbmQgd2FpdHMgdW50aWwgaXQgaXMgcmVhZHkgb3IgZmFpbGVkLiAqL1xuICBhc3luYyBzdGFydFNlcnZpY2UoXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveFNlcnZpY2U+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3QgYnVpbHRJbiA9IGxha2Vib3hCdWlsdEluU2VydmljZU5hbWVTY2hlbWEuc2FmZVBhcnNlKG5hbWUpO1xuICAgIGlmIChidWlsdEluLnN1Y2Nlc3MpIHtcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBidWlsdEluRGVmaW5pdGlvbihidWlsdEluLmRhdGEsIHVzZXIpO1xuICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwicHV0XCIsIFtlbmNvZGUoZGVmaW5pdGlvbildLCBzaWduYWwpO1xuICAgICAgcmV0dXJuIHRoaXMucnVuU2VydmljZShib290LCB1c2VyLCBkZWZpbml0aW9uLCBzaWduYWwpO1xuICAgIH1cbiAgICBjb25zdCBzYXZlZCA9IChhd2FpdCB0aGlzLnJlZnJlc2hTZXJ2aWNlcyhib290LCB1c2VyLCBpZGVudGl0eSwgc2lnbmFsKSkuZ2V0KG5hbWUpO1xuICAgIGlmICghc2F2ZWQpIHRocm93IG5ldyBFcnJvcihgTGFrZWJveCBzZXJ2aWNlICR7bmFtZX0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICByZXR1cm4gdGhpcy5ydW5TZXJ2aWNlKGJvb3QsIHVzZXIsIHNhdmVkLmRlZmluaXRpb24sIHNpZ25hbCk7XG4gIH1cblxuICAvKiogU3RvcHMgb25lIHJ1bm5pbmcgc2VydmljZSB3aXRob3V0IHJlbW92aW5nIGl0cyBkZWZpbml0aW9uLiAqL1xuICBhc3luYyBzdG9wU2VydmljZShpZGVudGl0eTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMYWtlYm94U2VydmljZT4ge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgIGNvbnN0IGJvb3QgPSBhd2FpdCB0aGlzLnJlYWR5VXNlcih1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICBjb25zdCBzdG9wcGVkID0gTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlU2NoZW1hLnBhcnNlKFxuICAgICAgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwic3RvcFwiLCBbbmFtZV0sIHNpZ25hbCksXG4gICAgKTtcbiAgICB0aGlzLmNhY2hlU2VydmljZShib290LCB1c2VyLCBzdG9wcGVkKTtcbiAgICByZXR1cm4gdG9MYWtlYm94U2VydmljZShzdG9wcGVkLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeCk7XG4gIH1cblxuICAvKiogU3RvcHMgYW5kIGRlbGV0ZXMgb25lIHNhdmVkIHNlcnZpY2UuIE1vdW50ZWQgaG9tZSBkaXJlY3RvcmllcyBhcmUgcHJlc2VydmVkLiAqL1xuICBhc3luYyByZW1vdmVTZXJ2aWNlKGlkZW50aXR5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcInJlbW92ZVwiLCBbbmFtZV0sIHNpZ25hbCkpIGFzIHtcbiAgICAgIHJlbW92ZWQ/OiBib29sZWFuO1xuICAgIH07XG4gICAgaWYgKHJlc3VsdC5yZW1vdmVkID09PSB0cnVlKSBhd2FpdCB0aGlzLnJlZnJlc2hTZXJ2aWNlcyhib290LCB1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICByZXR1cm4gcmVzdWx0LnJlbW92ZWQgPT09IHRydWU7XG4gIH1cblxuICAvKiogUmVhZHMgYSBib3VuZGVkIHRhaWwgb2Ygb25lIHNlcnZpY2UgbG9nLiAqL1xuICBhc3luYyBzZXJ2aWNlTG9ncyhcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIGlucHV0OiBMYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHsgbG9nOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBsYWtlYm94U2VydmljZUxvZ3NSZXF1ZXN0U2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsKTtcbiAgICBpZiAoIWVudHJ5IHx8IG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMoZW50cnkuc3RhdHVzKSAhPT0gXCJydW5uaW5nXCIpIHJldHVybiB7IGxvZzogXCJcIiB9O1xuICAgIGNvbnN0IGJvb3QgPSBhd2FpdCB0aGlzLnJlYWR5VXNlcih1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy5jb250cm9sbGVyKFxuICAgICAgYm9vdCxcbiAgICAgIHVzZXIsXG4gICAgICBcImxvZ3NcIixcbiAgICAgIFtyZXF1ZXN0Lm5hbWUsIFN0cmluZyhyZXF1ZXN0Lm1heExpbmVzKSwgU3RyaW5nKHJlcXVlc3QubWF4Q2hhcnMpXSxcbiAgICAgIHNpZ25hbCxcbiAgICApKSBhcyB7IGxvZz86IHN0cmluZyB9O1xuICAgIHJldHVybiB7IGxvZzogcmVzdWx0LmxvZyA/PyBcIlwiIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyByZWNlbnQgbWV0cmljcyBhbmQga2VlcHMgc2FtcGxpbmcgZm9yIG9uZSBsZWFzZSBpbnRlcnZhbC4gU2FtcGxpbmdcbiAgICogcnVucyBvbmx5IHdoaWxlIHRoZSBMYWtlYm94IHJ1bnMgYW5kIGEgY2FsbGVyIGlzIHdhdGNoaW5nLCBzbyBtZXRyaWNzIG5ldmVyXG4gICAqIGtlZXAgYW4gb3RoZXJ3aXNlIGlkbGUgTGFrZWJveCBhd2FrZS5cbiAgICovXG4gIGFzeW5jIG1ldHJpY3NSZXNwb25zZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveE1ldHJpY3NSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy5lbnRyeShzaWduYWwpO1xuICAgIGNvbnN0IHBsYXRmb3JtU3RhdHVzOiBMYWtlYm94U3RhdHVzID0gZW50cnkgPyBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgOiBcIm1pc3NpbmdcIjtcbiAgICBpZiAocGxhdGZvcm1TdGF0dXMgIT09IFwicnVubmluZ1wiKSB7XG4gICAgICB0aGlzLm1ldHJpY3Muc3RvcCgpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBwbGF0Zm9ybVN0YXR1cywgc2VyaWVzOiBbXSB9O1xuICAgIH1cbiAgICBpZiAoIWVudHJ5IHx8ICF0aGlzLmJvb3QgfHwgdGhpcy5ib290LmtleSAhPT0gdGhpcy5ib290S2V5KGVudHJ5KSkge1xuICAgICAgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICAgIHRoaXMud2FrZSgoKSA9PiB0aGlzLnJlYWR5KCkpO1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcInN0YXJ0aW5nXCIsIHNlcmllczogW10gfTtcbiAgICB9XG4gICAgdGhpcy5sZWFzZU1ldHJpY3MoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiB0aGlzLnByb2R1Y3RTdGF0dXMoZW50cnksIHBsYXRmb3JtU3RhdHVzKSxcbiAgICAgIHNlcmllczogWy4uLnRoaXMubWV0cmljcy5zZXJpZXMoKV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBTdWJzY3JpYmVzIHRvIG1ldHJpY3Mgc25hcHNob3RzIHdoaWxlIHRoZSBMYWtlYm94IHJ1bnMuICovXG4gIHN1YnNjcmliZU1ldHJpY3MobGlzdGVuZXI6IChzbmFwc2hvdDogTGFrZWJveE1ldHJpY3NTbmFwc2hvdCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWV0cmljcy5vbihcInNuYXBzaG90XCIsIGxpc3RlbmVyKTtcbiAgICBpZiAodGhpcy5ib290Py5rZXkgPT09IHRoaXMucmVhZHlCb290S2V5KSB0aGlzLm1ldHJpY3Muc3RhcnQoKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5tZXRyaWNzLm9mZihcInNuYXBzaG90XCIsIGxpc3RlbmVyKTtcbiAgICAgIHRoaXMubGVhc2VNZXRyaWNzKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGxlZ2FjeSBwZXItdXNlciBMYWtlYm94ZXMgYW5kIGRyb3BzIGxlZ2FjeSBvd25lcnNoaXAgc2NoZW1hcy5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gbWlncmF0aW9uOiB0aGUgZWFybGllciBvbmUtbWFjaGluZS1wZXItdXNlciBtb2RlbCBpcyByZW1vdmVkLlxuICAgKiBUaGUgbWFuYWdlZCBhcHAgTGFrZWJveCBhbmQgTGFrZWJveGVzIHdpdGggb3RoZXIgbmFtZXMgYXJlIG5ldmVyIHRvdWNoZWQuXG4gICAqL1xuICBhc3luYyBjbGVhbnVwTGVnYWN5KHBvb2w/OiBMYWtlYm94TGVnYWN5UG9vbCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuY2xpZW50KCkubGlzdChzaWduYWwpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGVudHJpZXNcbiAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubmFtZSAmJiBMRUdBQ1lfTkFNRS50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgICAgICAgIC5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudCgpLmRlbGV0ZShlbnRyeS5zYW5kYm94SWQsIHNpZ25hbCk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcImRlbGV0ZWQgbGVnYWN5IHBlci11c2VyIExha2Vib3hcIiwge1xuICAgICAgICAgICAgICBpZDogZW50cnkuc2FuZGJveElkLFxuICAgICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzTGFrZWJveFVuYXZhaWxhYmxlKGVycm9yKSkge1xuICAgICAgICBsb2dnZXIud2FybihcImxlZ2FjeSBMYWtlYm94IGNsZWFudXAgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXBvb2wpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2NoZW1hcyA9IGF3YWl0IHBvb2wucXVlcnkoXG4gICAgICAgIFwiU0VMRUNUIG5zcG5hbWUgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9ICQxIE9SIHN0YXJ0c193aXRoKG5zcG5hbWUsICQyKVwiLFxuICAgICAgICBbTEVHQUNZX1NDSEVNQV9QUkVGSVgsIGAke0xFR0FDWV9TQ0hFTUFfUFJFRklYfV9gXSxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBzY2hlbWFzLnJvd3MpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gU3RyaW5nKHJvdy5uc3BuYW1lKTtcbiAgICAgICAgYXdhaXQgcG9vbC5xdWVyeShgRFJPUCBTQ0hFTUEgSUYgRVhJU1RTIFwiJHtzY2hlbWEucmVwbGFjZUFsbCgnXCInLCAnXCJcIicpfVwiIENBU0NBREVgKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJkcm9wcGVkIGxlZ2FjeSBMYWtlYm94IG93bmVyc2hpcCBzY2hlbWFcIiwgeyBzY2hlbWEgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwibGVnYWN5IG93bmVyc2hpcCBzY2hlbWEgY2xlYW51cCBmYWlsZWRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbmNlbHMgaW4tZmxpZ2h0IHdvcmsgYmVmb3JlIHRlYXJkb3duLiAqL1xuICBhYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgdGhpcy5zaHV0ZG93bkNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxuXG4gIC8qKiBDbG9zZXMgcm91dGVzLCBtZXRyaWNzLCBhbmQgdGhlIFNTSCBzZXNzaW9uIHdpdGhvdXQgY2hhbmdpbmcgdGhlIExha2Vib3guICovXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk7XG4gICAgdGhpcy5yb3V0ZXMuYmVnaW5TaHV0ZG93bigpO1xuICAgIHRoaXMuY2xvc2luZyA/Pz0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLm1ldHJpY3NMZWFzZSkgY2xlYXJUaW1lb3V0KHRoaXMubWV0cmljc0xlYXNlKTtcbiAgICAgICAgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZXMuY2xvc2UoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5ib290Py5zZXNzaW9uLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuYm9vdCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuc3RvcFBhcmVudFRlcm1pbmF0aW9uU2lnbmFsKCk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICByZXR1cm4gdGhpcy5jbG9zaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGllbnQoKTogTGFrZWJveENsaWVudCB7XG4gICAgaWYgKCF0aGlzLmFwaSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIExha2Vib3ggcnVudGltZSBoYXMgbm8gYXBwIHNlcnZpY2UtcHJpbmNpcGFsIGNyZWRlbnRpYWxzXCIpO1xuICAgIHJldHVybiB0aGlzLmFwaTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb3VyY2VzKCk6IExha2Vib3hSZXNvdXJjZVJlZ2lzdHJ5IHtcbiAgICBpZiAoIXRoaXMucmVzb3VyY2VSZWdpc3RyeSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIExha2Vib3ggcnVudGltZSBoYXMgbm8gcmVzb3VyY2UgcmVnaXN0cnlcIik7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBtYW5hZ2VkIExha2Vib3ggZW50cnksIGNhY2hlZCBicmllZmx5IHRvIGtlZXAgcm91dGVzIGNoZWFwLiAqL1xuICBwcml2YXRlIGFzeW5jIGVudHJ5KHNpZ25hbD86IEFib3J0U2lnbmFsLCBmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxMYWtlYm94RW50cnkgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWZyZXNoICYmIHRoaXMuY2FjaGVkICYmIERhdGUubm93KCkgLSB0aGlzLmNhY2hlZC5hdCA8IEVOVFJZX1RUTF9NUykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkLmVudHJ5O1xuICAgIH1cbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMucmVzb3VyY2VzKCkucmVhZCh0aGlzLmNsaWVudCgpLCBzaWduYWwpO1xuICAgIHRoaXMuY2FjaGVkID0geyAuLi4oZW50cnkgPyB7IGVudHJ5IH0gOiB7fSksIGF0OiBEYXRlLm5vdygpIH07XG4gICAgaWYgKCFlbnRyeSB8fCBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgIT09IFwicnVubmluZ1wiKSB7XG4gICAgICB0aGlzLnJlYWR5Qm9vdEtleSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm9vdCAmJiAoIWVudHJ5IHx8IHRoaXMuYm9vdEtleShlbnRyeSkgIT09IHRoaXMuYm9vdC5rZXkpKSBhd2FpdCB0aGlzLmRpc2NhcmRCb290KCk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBib290S2V5KGVudHJ5OiBMYWtlYm94RW50cnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtlbnRyeS5zYW5kYm94SWR9XFwwJHtlbnRyeS5sYXN0U3RhcnRUaW1lID8/IFwiXCJ9YDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvZHVjdFN0YXR1cyhlbnRyeTogTGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkLCBzdGF0dXM6IExha2Vib3hTdGF0dXMpOiBMYWtlYm94U3RhdHVzIHtcbiAgICByZXR1cm4gZW50cnkgJiYgc3RhdHVzID09PSBcInJ1bm5pbmdcIiAmJiB0aGlzLnJlYWR5Qm9vdEtleSAhPT0gdGhpcy5ib290S2V5KGVudHJ5KVxuICAgICAgPyBcInN0YXJ0aW5nXCJcbiAgICAgIDogc3RhdHVzO1xuICB9XG5cbiAgLyoqIFNlcmlhbGl6ZXMgY3JlYXRlLCBzdGFydCwgY29ubmVjdCwgYW5kIGJvb3RzdHJhcCBmb3IgdGhlIGN1cnJlbnQgYm9vdC4gKi9cbiAgcHJpdmF0ZSByZWFkeShzaWduYWw/OiBBYm9ydFNpZ25hbCwgZXhwbGljaXQgPSBmYWxzZSk6IFByb21pc2U8Qm9vdD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmJvb3Q7XG4gICAgaWYgKGN1cnJlbnQgJiYgdGhpcy5jYWNoZWQ/LmVudHJ5ICYmIHRoaXMuYm9vdEtleSh0aGlzLmNhY2hlZC5lbnRyeSkgPT09IGN1cnJlbnQua2V5KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMuY2FjaGVkLmF0IDwgRU5UUllfVFRMX01TKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnQpO1xuICAgIH1cbiAgICB0aGlzLmNvbnZlcmdpbmcgPz89IHRoaXMuY29udmVyZ2Uoc2lnbmFsLCBleHBsaWNpdCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLmNvbnZlcmdpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuY29udmVyZ2luZztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udmVyZ2Uoc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCwgZXhwbGljaXQ6IGJvb2xlYW4pOiBQcm9taXNlPEJvb3Q+IHtcbiAgICBjb25zdCBvcGVyYXRpb25TaWduYWwgPSBzaWduYWxcbiAgICAgID8gQWJvcnRTaWduYWwuYW55KFtzaWduYWwsIHRoaXMuc2h1dGRvd25Db250cm9sbGVyLnNpZ25hbF0pXG4gICAgICA6IHRoaXMuc2h1dGRvd25Db250cm9sbGVyLnNpZ25hbDtcbiAgICBsZXQgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KG9wZXJhdGlvblNpZ25hbCwgdHJ1ZSk7XG4gICAgaWYgKCFlbnRyeSB8fCBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgIT09IFwicnVubmluZ1wiKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG8gJiYgIWV4cGxpY2l0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTGFrZWJveCBpcyAke2VudHJ5ID8gZW50cnkuc3RhdHVzIDogXCJub3QgY3JlYXRlZFwifTsgc3RhcnQgaXQgZXhwbGljaXRseSBiZWNhdXNlIGF1dG8gaXMgZmFsc2VgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnRyeSA/Pz0gYXdhaXQgdGhpcy5yZXNvdXJjZXMoKS5nZXRPckNyZWF0ZSh0aGlzLmNsaWVudCgpLCBvcGVyYXRpb25TaWduYWwpO1xuICAgIGlmIChsYWtlYm94SWRsZVRpbWVvdXRTZWNvbmRzKGVudHJ5LmlkbGVUaW1lb3V0KSAhPT0gdGhpcy5jb25maWcuaWRsZVRpbWVvdXRTZWNvbmRzKSB7XG4gICAgICBlbnRyeSA9IGF3YWl0IHRoaXMuY2xpZW50KCkuc2V0SWRsZVRpbWVvdXQoXG4gICAgICAgIGVudHJ5LnNhbmRib3hJZCxcbiAgICAgICAgdGhpcy5jb25maWcuaWRsZVRpbWVvdXRTZWNvbmRzLFxuICAgICAgICBvcGVyYXRpb25TaWduYWwsXG4gICAgICApO1xuICAgIH1cbiAgICBlbnRyeSA9IGF3YWl0IGVuc3VyZUxha2Vib3hSdW5uaW5nKHRoaXMuY2xpZW50KCksIGVudHJ5LCBvcGVyYXRpb25TaWduYWwpO1xuICAgIHRoaXMuY2FjaGVkID0geyBlbnRyeSwgYXQ6IERhdGUubm93KCkgfTtcbiAgICBsZXQga2V5ID0gdGhpcy5ib290S2V5KGVudHJ5KTtcbiAgICBpZiAodGhpcy5ib290Py5rZXkgPT09IGtleSkgcmV0dXJuIHRoaXMuYm9vdDtcbiAgICBhd2FpdCB0aGlzLmRpc2NhcmRCb290KCk7XG4gICAgbGV0IHNlc3Npb246IFNzaFNlc3Npb247XG4gICAgdHJ5IHtcbiAgICAgIHNlc3Npb24gPSBhd2FpdCB0aGlzLmNvbm5lY3QoZW50cnksIG9wZXJhdGlvblNpZ25hbCwgdGhpcy5zdGFydHVwVGltZW91dE1zKCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuZGVzdHJveUFmdGVyU3RhcnR1cEZhaWx1cmVTZWNvbmRzID09PSBmYWxzZSkgdGhyb3cgZXJyb3I7XG4gICAgICBsb2dnZXIud2FybihcIkxha2Vib3ggU1NIIHN0YXJ0dXAgdGltZWQgb3V0OyByZXBsYWNpbmcgdGhlIG1hY2hpbmVcIiwge1xuICAgICAgICBpZDogZW50cnkuc2FuZGJveElkLFxuICAgICAgICB0aW1lb3V0U2Vjb25kczogdGhpcy5jb25maWcuZGVzdHJveUFmdGVyU3RhcnR1cEZhaWx1cmVTZWNvbmRzLFxuICAgICAgfSk7XG4gICAgICBlbnRyeSA9IGF3YWl0IHRoaXMucmVwbGFjZVVucmVhY2hhYmxlKGVudHJ5LCBvcGVyYXRpb25TaWduYWwpO1xuICAgICAga2V5ID0gdGhpcy5ib290S2V5KGVudHJ5KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb24gPSBhd2FpdCB0aGlzLmNvbm5lY3QoZW50cnksIG9wZXJhdGlvblNpZ25hbCwgdGhpcy5zdGFydHVwVGltZW91dE1zKCkpO1xuICAgICAgfSBjYXRjaCAocmVwbGFjZW1lbnRFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJSZXBsYWNlbWVudCBMYWtlYm94IFNTSCBnYXRld2F5IGRpZCBub3QgYmVjb21lIHJlYWR5XCIsIHtcbiAgICAgICAgICBjYXVzZTogdG9FcnJvcihyZXBsYWNlbWVudEVycm9yKSxcbiAgICAgICAgICBjbGllbnRNZXNzYWdlOiBcIlRoZSByZXBsYWNlbWVudCBMYWtlYm94IGFsc28gZmFpbGVkIHRvIHN0YXJ0LlwiLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYm9vdDogQm9vdCA9IHtcbiAgICAgIGtleSxcbiAgICAgIGVudHJ5LFxuICAgICAgc2Vzc2lvbixcbiAgICAgIHVzZXJzOiBuZXcgTWFwKCksXG4gICAgICBzZXJ2aWNlczogbmV3IE1hcCgpLFxuICAgICAgc3RhcnRpbmc6IG5ldyBNYXAoKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN0b3JlZCA9IGF3YWl0IHRoaXMuYm9vdHN0cmFwKHNlc3Npb24sIG9wZXJhdGlvblNpZ25hbCk7XG4gICAgICB0aGlzLm1ldHJpY3Muc3RvcCgpO1xuICAgICAgdGhpcy5tZXRyaWNzLnNlZWQoKGF3YWl0IHRoaXMuYWRtaW4oc2Vzc2lvbiwgW1wibWV0cmljc1wiXSwgb3BlcmF0aW9uU2lnbmFsKSkuc3Rkb3V0KTtcbiAgICAgIHRoaXMuYm9vdCA9IGJvb3Q7XG4gICAgICB0aGlzLnJlYWR5Qm9vdEtleSA9IGtleTtcbiAgICAgIHRoaXMud2F0Y2hJZGxlKCk7XG4gICAgICBpZiAodGhpcy5tZXRyaWNzLmxpc3RlbmVyQ291bnQoXCJzbmFwc2hvdFwiKSA+IDApIHRoaXMubWV0cmljcy5zdGFydCgpO1xuICAgICAgZm9yIChjb25zdCBoYXNoIG9mIHJlc3RvcmVkKSB2b2lkIHRoaXMucmVzdG9yZVVzZXIoYm9vdCwgaGFzaCk7XG4gICAgICByZXR1cm4gYm9vdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgc2Vzc2lvbi5jbG9zZSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydHVwVGltZW91dE1zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRlc3Ryb3lBZnRlclN0YXJ0dXBGYWlsdXJlU2Vjb25kcyA9PT0gZmFsc2VcbiAgICAgID8gU1NIX1JFQURZX1RJTUVPVVRfTVNcbiAgICAgIDogdGhpcy5jb25maWcuZGVzdHJveUFmdGVyU3RhcnR1cEZhaWx1cmVTZWNvbmRzICogMV8wMDA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlcGxhY2VVbnJlYWNoYWJsZShcbiAgICBlbnRyeTogTGFrZWJveEVudHJ5LFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveEVudHJ5PiB7XG4gICAgbGV0IHJlcGxhY2VtZW50OiBMYWtlYm94RW50cnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlcGxhY2VtZW50ID0gYXdhaXQgdGhpcy5yZXNvdXJjZXMoKS5yZWNyZWF0ZSh0aGlzLmNsaWVudCgpLCBlbnRyeS5zYW5kYm94SWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGNhdXNlID0gdG9FcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYENvdWxkIG5vdCBkZXN0cm95IGFuZCByZXBsYWNlIExha2Vib3ggJHtlbnRyeS5zYW5kYm94SWR9YCwge1xuICAgICAgICBjYXVzZSxcbiAgICAgICAgY2xpZW50TWVzc2FnZTogY2F1c2UubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNhY2hlZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlYWR5Qm9vdEtleSA9IHVuZGVmaW5lZDtcbiAgICBpZiAobGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyhyZXBsYWNlbWVudC5pZGxlVGltZW91dCkgIT09IHRoaXMuY29uZmlnLmlkbGVUaW1lb3V0U2Vjb25kcykge1xuICAgICAgcmVwbGFjZW1lbnQgPSBhd2FpdCB0aGlzLmNsaWVudCgpLnNldElkbGVUaW1lb3V0KFxuICAgICAgICByZXBsYWNlbWVudC5zYW5kYm94SWQsXG4gICAgICAgIHRoaXMuY29uZmlnLmlkbGVUaW1lb3V0U2Vjb25kcyxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmVwbGFjZW1lbnQgPSBhd2FpdCBlbnN1cmVMYWtlYm94UnVubmluZyh0aGlzLmNsaWVudCgpLCByZXBsYWNlbWVudCwgc2lnbmFsKTtcbiAgICB0aGlzLmNhY2hlZCA9IHsgZW50cnk6IHJlcGxhY2VtZW50LCBhdDogRGF0ZS5ub3coKSB9O1xuICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdChcbiAgICBlbnRyeTogTGFrZWJveEVudHJ5LFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXG4gICAgdGltZW91dE1zOiBudW1iZXIsXG4gICk6IFByb21pc2U8U3NoU2Vzc2lvbj4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0T25jZShlbnRyeSwgc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGF0dGVtcHQgKz0gMTtcbiAgICAgICAgaWYgKCFfaXNUcmFuc2llbnRTc2hTdGFydHVwRXJyb3IoZXJyb3IpIHx8IERhdGUubm93KCkgLSBzdGFydGVkQXQgPj0gdGltZW91dE1zKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsYXlNcyA9IE1hdGgubWluKFxuICAgICAgICAgIFNTSF9SRUFEWV9SRVRSWV9JTklUSUFMX01TICogMiAqKiAoYXR0ZW1wdCAtIDEpLFxuICAgICAgICAgIFNTSF9SRUFEWV9SRVRSWV9NQVhfTVMsXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiTGFrZWJveCBTU0ggZ2F0ZXdheSBpcyBub3QgcmVhZHk7IHJldHJ5aW5nXCIsIHtcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIGRlbGF5TXMsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTc2hSZXRyeShkZWxheU1zLCBzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd2FpdEZvclNzaFJldHJ5KGRlbGF5TXM6IG51bWJlciwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzbGVlcChkZWxheU1zLCBzaWduYWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0T25jZShlbnRyeTogTGFrZWJveEVudHJ5LCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxTc2hTZXNzaW9uPiB7XG4gICAgY29uc3QgYXBpID0gdGhpcy5jbGllbnQoKTtcbiAgICBjb25zdCBzY29wZSA9IGF3YWl0IGFwaS53b3Jrc3BhY2VTY29wZSgpO1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHRoaXMua2V5cy5lbnN1cmVSZWdpc3RlcmVkKGFwaSwgU1NIX0tFWV9PV05FUiwgc2lnbmFsKTtcbiAgICBjb25zdCBnYXRld2F5SG9zdCA9IGVudHJ5LmdhdGV3YXlIb3N0ID8/IGtleS5nYXRld2F5SG9zdDtcbiAgICBpZiAoIWdhdGV3YXlIb3N0KSB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIExha2Vib3ggZGlkIG5vdCByZXR1cm4gYW4gU1NIIGdhdGV3YXkgaG9zdFwiKTtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5jb25maWcuZ2F0ZXdheVBvcnQ7XG4gICAgY29uc3Qga25vd25Ib3N0ID0gYXdhaXQgdGhpcy5rZXlzLmtub3duSG9zdChzY29wZSwgU1NIX0tFWV9PV05FUiwgZ2F0ZXdheUhvc3QsIHBvcnQpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgU3NoU2Vzc2lvbih7XG4gICAgICBob3N0OiBnYXRld2F5SG9zdCxcbiAgICAgIHBvcnQsXG4gICAgICB1c2VybmFtZTogZW50cnkuc2FuZGJveElkLFxuICAgICAgcHJpdmF0ZUtleToga2V5LnByaXZhdGVLZXksXG4gICAgICBwcml2YXRlS2V5UGF0aDoga2V5LnByaXZhdGVLZXlQYXRoLFxuICAgICAga25vd25Ib3N0c1BhdGg6IHRoaXMua2V5cy5rbm93bkhvc3RzUGF0aChzY29wZSwgU1NIX0tFWV9PV05FUiwgZ2F0ZXdheUhvc3QsIHBvcnQpLFxuICAgICAgY29ubmVjdFRpbWVvdXRNczogdGhpcy5jb25maWcuY29ubmVjdFRpbWVvdXRNcyxcbiAgICAgIHNzaFRyYW5zcG9ydDogdGhpcy5jb25maWcuc3NoVHJhbnNwb3J0LFxuICAgICAgc3NoMlBhdGNoOiB0aGlzLmNvbmZpZy5zc2gyUGF0Y2gsXG4gICAgICAuLi4oa25vd25Ib3N0ID8geyBrbm93bkhvc3QgfSA6IHt9KSxcbiAgICAgIHJlbWVtYmVySG9zdDogKGZpbmdlcnByaW50LCBob3N0S2V5KSA9PlxuICAgICAgICB0aGlzLmtleXMucmVtZW1iZXJIb3N0KHNjb3BlLCBTU0hfS0VZX09XTkVSLCBnYXRld2F5SG9zdCwgcG9ydCwgZmluZ2VycHJpbnQsIGhvc3RLZXkpLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXNzaW9uLmNvbm5lY3QoKTtcbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBzZXNzaW9uLmNsb3NlKCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogUnVucyB0aGUgZml4ZWQgcHJpdmlsZWdlZCBib290c3RyYXAgYW5kIHJldHVybnMgdGhlIHJlc3RvcmVkIHVzZXIgaGFzaGVzLiAqL1xuICBwcml2YXRlIGFzeW5jIGJvb3RzdHJhcChzZXNzaW9uOiBTc2hTZXNzaW9uLCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGhlbHBlcnMgPSBPYmplY3QuZW50cmllcyhIRUxQRVJTKS5tYXAoXG4gICAgICAoW25hbWUsIGNvbnRlbnRdKSA9PiBgJHtuYW1lfT0ke0J1ZmZlci5mcm9tKGNvbnRlbnQpLnRvU3RyaW5nKFwiYmFzZTY0XCIpfWAsXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFkbWluKHNlc3Npb24sIFtcImJvb3RzdHJhcFwiLCAuLi5oZWxwZXJzXSwgc2lnbmFsKTtcbiAgICByZXR1cm4gcmVzdWx0LnN0ZG91dFxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoXCJfX0xBS0VCT1hfVVNFUl9fPVwiKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoXCJfX0xBS0VCT1hfVVNFUl9fPVwiLmxlbmd0aCkudHJpbSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRtaW4oXG4gICAgc2Vzc2lvbjogU3NoU2Vzc2lvbixcbiAgICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx7IHN0ZG91dDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBlbmNvZGVkID0gQnVmZmVyLmZyb20oQURNSU5fU0NSSVBUKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXNzaW9uLmV4ZWN1dGVQcml2aWxlZ2VkKFxuICAgICAgXCJzaFwiLFxuICAgICAgW1wiLWNcIiwgYHByaW50ZiAlcyAnJHtlbmNvZGVkfScgfCBiYXNlNjQgLWQgfCBzaCAtcyAtLSAke2FyZ3MubWFwKHNoZWxsUXVvdGUpLmpvaW4oXCIgXCIpfWBdLFxuICAgICAgeyB0aW1lb3V0TXM6IFNFVFVQX1RJTUVPVVRfTVMsIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pIH0sXG4gICAgKS5yZXN1bHQ7XG4gICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTGFrZWJveCAke2FyZ3NbMF19IGZhaWxlZDogJHtyZXN1bHQuc3RkZXJyLnRyaW0oKSB8fCByZXN1bHQuc3Rkb3V0LnRyaW0oKSB8fCBgZXhpdCAke3Jlc3VsdC5leGl0Q29kZX1gfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIE1hcmtzIGFjdGl2aXR5LCByZWFkaWVzIHRoZSBjdXJyZW50IGJvb3QsIGFuZCBjb252ZXJnZXMgdGhlIHVzZXIncyBhY2NvdW50LiAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWR5VXNlcihcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPEJvb3Q+IHtcbiAgICB0aGlzLnRvdWNoKCk7XG4gICAgY29uc3QgYm9vdCA9IGF3YWl0IHRoaXMucmVhZHkoc2lnbmFsKTtcbiAgICBhd2FpdCB0aGlzLmNvbnZlcmdlVXNlcihib290LCB1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICByZXR1cm4gYm9vdDtcbiAgfVxuXG4gIC8qKiBDcmVhdGVzIG9yIHZlcmlmaWVzIHRoZSB1c2VyJ3MgYWNjb3VudCBvbmNlIHBlciBib290LiAqL1xuICBwcml2YXRlIGNvbnZlcmdlVXNlcihcbiAgICBib290OiBCb290LFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBjb252ZXJnZWQgPSBib290LnVzZXJzLmdldCh1c2VyLmhhc2gpO1xuICAgIGlmICghY29udmVyZ2VkKSB7XG4gICAgICBjb25zdCBkaWdlc3QgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShpZGVudGl0eS50cmltKCkudG9Mb3dlckNhc2UoKSkuZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgY29udmVyZ2VkID0gdGhpcy5hZG1pbihcbiAgICAgICAgYm9vdC5zZXNzaW9uLFxuICAgICAgICBbXCJlbnN1cmUtdXNlclwiLCB1c2VyLmhhc2gsIFN0cmluZyh1c2VyLnVpZCksIGRpZ2VzdF0sXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICkudGhlbigoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgYm9vdC51c2Vycy5zZXQodXNlci5oYXNoLCBjb252ZXJnZWQpO1xuICAgICAgY29udmVyZ2VkLmNhdGNoKCgpID0+IGJvb3QudXNlcnMuZGVsZXRlKHVzZXIuaGFzaCkpO1xuICAgIH1cbiAgICByZXR1cm4gY29udmVyZ2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXN0b3JlVXNlcihib290OiBCb290LCBoYXNoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1c2VyID0geyBuYW1lOiBgbGFrZWJveC0ke2hhc2h9YCwgaG9tZTogYC9ob21lL2xha2Vib3gtJHtoYXNofWAgfTtcbiAgICBib290LnVzZXJzLnNldChoYXNoLCBQcm9taXNlLnJlc29sdmUoKSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJvb3Quc2Vzc2lvbi5leGVjdXRlKFwicHl0aG9uM1wiLCBbQ09OVFJPTExFUiwgXCJzdGFydC1hbGxcIl0sIHtcbiAgICAgICAgdXNlcixcbiAgICAgICAgdGltZW91dE1zOiBTRVRVUF9USU1FT1VUX01TLFxuICAgICAgICBzaWduYWw6IHRoaXMuc2h1dGRvd25Db250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH0pLnJlc3VsdDtcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihyZXN1bHQuc3RkZXJyLnRyaW0oKSB8fCBgZXhpdCAke3Jlc3VsdC5leGl0Q29kZX1gKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25Db250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICBsb2dnZXIud2FybihcIkxha2Vib3ggc2VydmljZSByZXN0b3JlIGZhaWxlZFwiLCB7XG4gICAgICAgIHVzZXI6IGhhc2gsXG4gICAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udHJvbGxlcihcbiAgICBib290OiBCb290LFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBhcmdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYm9vdC5zZXNzaW9uLmV4ZWN1dGUoXCJweXRob24zXCIsIFtDT05UUk9MTEVSLCBjb21tYW5kLCAuLi5hcmdzXSwge1xuICAgICAgdXNlcixcbiAgICAgIHRpbWVvdXRNczogU0VUVVBfVElNRU9VVF9NUyxcbiAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgIH0pLnJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBMYWtlYm94IHNlcnZpY2UgJHtjb21tYW5kfSBmYWlsZWQ6ICR7cmVzdWx0LnN0ZGVyci50cmltKCkgfHwgYGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9YH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCkgYXMgdW5rbm93bjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2VydmljZShcbiAgICBib290OiBCb290LFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIGRlZmluaXRpb246IExha2Vib3hDb250cm9sbGVyRGVmaW5pdGlvbixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxMYWtlYm94U2VydmljZT4ge1xuICAgIGNvbnN0IGtleSA9IGAke3VzZXIuaGFzaH1cXDAke2RlZmluaXRpb24ubmFtZX1gO1xuICAgIGNvbnN0IHBlbmRpbmcgPSBib290LnN0YXJ0aW5nLmdldChrZXkpO1xuICAgIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZztcbiAgICBjb25zdCBvcGVyYXRpb24gPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGRlZmluaXRpb24ua2luZCA9PT0gXCJkZXNrdG9wXCIpIHtcbiAgICAgICAgYm9vdC5kZXNrdG9wID8/PSB0aGlzLmFkbWluKGJvb3Quc2Vzc2lvbiwgW1wiZGVza3RvcC1wcmVyZXF1aXNpdGVzXCJdLCBzaWduYWwpLnRoZW4oXG4gICAgICAgICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICBib290LmRlc2t0b3AuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGJvb3QuZGVza3RvcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGJvb3QuZGVza3RvcDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYWRtaW4oXG4gICAgICAgIGJvb3Quc2Vzc2lvbixcbiAgICAgICAgW1wiYWxsb3ctcG9ydFwiLCBTdHJpbmcodXNlci51aWQpLCBTdHJpbmcoZGVmaW5pdGlvbi5wb3J0KV0sXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzdGFydGVkID0gTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlU2NoZW1hLnBhcnNlKFxuICAgICAgICBhd2FpdCB0aGlzLmNvbnRyb2xsZXIoYm9vdCwgdXNlciwgXCJzdGFydFwiLCBbZGVmaW5pdGlvbi5uYW1lXSwgc2lnbmFsKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmNhY2hlU2VydmljZShib290LCB1c2VyLCBzdGFydGVkKTtcbiAgICAgIHJldHVybiB0b0xha2Vib3hTZXJ2aWNlKHN0YXJ0ZWQsIHVzZXIsIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KTtcbiAgICB9KSgpLmZpbmFsbHkoKCkgPT4gYm9vdC5zdGFydGluZy5kZWxldGUoa2V5KSk7XG4gICAgYm9vdC5zdGFydGluZy5zZXQoa2V5LCBvcGVyYXRpb24pO1xuICAgIHJldHVybiBvcGVyYXRpb247XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hTZXJ2aWNlcyhcbiAgICBib290OiBCb290LFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlPj4ge1xuICAgIGF3YWl0IHRoaXMuY29udmVyZ2VVc2VyKGJvb3QsIHVzZXIsIGlkZW50aXR5LCBzaWduYWwpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcImxpc3RcIiwgW10sIHNpZ25hbCkpIGFzIHtcbiAgICAgIHNlcnZpY2VzPzogdW5rbm93bltdO1xuICAgIH07XG4gICAgY29uc3Qgc2VydmljZXMgPSBuZXcgTWFwKFxuICAgICAgKHJlc3BvbnNlLnNlcnZpY2VzID8/IFtdKS5tYXAoKHNlcnZpY2UpID0+IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlU2NoZW1hLnBhcnNlKHNlcnZpY2UpO1xuICAgICAgICByZXR1cm4gW3BhcnNlZC5uYW1lLCBwYXJzZWRdIGFzIGNvbnN0O1xuICAgICAgfSksXG4gICAgKTtcbiAgICBib290LnNlcnZpY2VzLnNldCh1c2VyLmhhc2gsIHNlcnZpY2VzKTtcbiAgICB0aGlzLmxhc3RTZXJ2aWNlcy5zZXQodXNlci5oYXNoLCBzZXJ2aWNlcyk7XG4gICAgY29uc3Qgb2JzZXJ2ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICB0aGlzLmxhc3RTZXJ2aWNlc09ic2VydmVkQXQuc2V0KHVzZXIuaGFzaCwgb2JzZXJ2ZWRBdCk7XG4gICAgYXdhaXQgdGhpcy5wZXJzaXN0U2VydmljZVNuYXBzaG90KGJvb3QuZW50cnksIHVzZXIsIHNlcnZpY2VzLCBvYnNlcnZlZEF0KTtcbiAgICByZXR1cm4gc2VydmljZXM7XG4gIH1cblxuICBwcml2YXRlIGNhY2hlU2VydmljZShib290OiBCb290LCB1c2VyOiBMYWtlYm94VXNlciwgc2VydmljZTogTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlKTogdm9pZCB7XG4gICAgY29uc3Qgc2VydmljZXMgPSBib290LnNlcnZpY2VzLmdldCh1c2VyLmhhc2gpID8/IG5ldyBNYXA8c3RyaW5nLCBMYWtlYm94Q29udHJvbGxlclNlcnZpY2U+KCk7XG4gICAgc2VydmljZXMuc2V0KHNlcnZpY2UubmFtZSwgc2VydmljZSk7XG4gICAgYm9vdC5zZXJ2aWNlcy5zZXQodXNlci5oYXNoLCBzZXJ2aWNlcyk7XG4gICAgdGhpcy5sYXN0U2VydmljZXMuc2V0KHVzZXIuaGFzaCwgc2VydmljZXMpO1xuICAgIGNvbnN0IG9ic2VydmVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgdGhpcy5sYXN0U2VydmljZXNPYnNlcnZlZEF0LnNldCh1c2VyLmhhc2gsIG9ic2VydmVkQXQpO1xuICAgIHZvaWQgdGhpcy5wZXJzaXN0U2VydmljZVNuYXBzaG90KGJvb3QuZW50cnksIHVzZXIsIHNlcnZpY2VzLCBvYnNlcnZlZEF0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VydmljZUxpc3RpbmcoXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBlbnRyeTogTGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkLFxuICAgIHN0YXR1czogTGFrZWJveFN0YXR1cyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxTZXJ2aWNlTGlzdGluZz4ge1xuICAgIGlmICghZW50cnkgfHwgc3RhdHVzID09PSBcIm1pc3NpbmdcIikge1xuICAgICAgcmV0dXJuIHsgc2VydmljZXM6IHRoaXMuaWRsZVNlcnZpY2VzKHVzZXIpLCBzdGFsZTogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gXCJydW5uaW5nXCIgJiYgdGhpcy5ib290Py5rZXkgPT09IHRoaXMuYm9vdEtleShlbnRyeSkpIHtcbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgdGhpcy5yZWZyZXNoU2VydmljZXModGhpcy5ib290LCB1c2VyLCBpZGVudGl0eSwgc2lnbmFsKTtcbiAgICAgIHJldHVybiB7IHNlcnZpY2VzOiB0aGlzLndpdGhCdWlsdElucyh1c2VyLCBzZXJ2aWNlcyksIHN0YWxlOiBmYWxzZSB9O1xuICAgIH1cbiAgICBjb25zdCBtZW1vcnkgPSB0aGlzLmxhc3RTZXJ2aWNlcy5nZXQodXNlci5oYXNoKTtcbiAgICBpZiAobWVtb3J5KSB7XG4gICAgICBjb25zdCBvYnNlcnZlZEF0ID0gdGhpcy5sYXN0U2VydmljZXNPYnNlcnZlZEF0LmdldCh1c2VyLmhhc2gpO1xuICAgICAgY29uc3Qgc2VydmljZXMgPVxuICAgICAgICBzdGF0dXMgPT09IFwicnVubmluZ1wiXG4gICAgICAgICAgPyBtZW1vcnlcbiAgICAgICAgICA6IHN0b3BwZWRTbmFwc2hvdFNlcnZpY2VzKHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZWRBdDogb2JzZXJ2ZWRBdCA/PyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgIGRlZmluaXRpb25zOiBbLi4ubWVtb3J5LnZhbHVlcygpXS5tYXAoKHNlcnZpY2UpID0+IHNlcnZpY2UuZGVmaW5pdGlvbiksXG4gICAgICAgICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZpY2VzOiB0aGlzLndpdGhCdWlsdElucyh1c2VyLCBzZXJ2aWNlcyksXG4gICAgICAgIHN0YWxlOiB0cnVlLFxuICAgICAgICAuLi4ob2JzZXJ2ZWRBdCA/IHsgb2JzZXJ2ZWRBdCB9IDoge30pLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLnNlcnZpY2VTbmFwc2hvdHM/LnJlYWQoZW50cnkuc2FuZGJveElkLCB1c2VyLmhhc2gpO1xuICAgIHJldHVybiBzbmFwc2hvdFxuICAgICAgPyB7XG4gICAgICAgICAgc2VydmljZXM6IHRoaXMud2l0aEJ1aWx0SW5zKHVzZXIsIHN0b3BwZWRTbmFwc2hvdFNlcnZpY2VzKHNuYXBzaG90KSksXG4gICAgICAgICAgc3RhbGU6IHRydWUsXG4gICAgICAgICAgb2JzZXJ2ZWRBdDogc25hcHNob3Qub2JzZXJ2ZWRBdCxcbiAgICAgICAgfVxuICAgICAgOiB7IHNlcnZpY2VzOiB0aGlzLmlkbGVTZXJ2aWNlcyh1c2VyKSwgc3RhbGU6IHRydWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyc2lzdFNlcnZpY2VTbmFwc2hvdChcbiAgICBlbnRyeTogTGFrZWJveEVudHJ5LFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIHNlcnZpY2VzOiBSZWFkb25seU1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4sXG4gICAgb2JzZXJ2ZWRBdDogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNlcnZpY2VTbmFwc2hvdHM/LndyaXRlKGVudHJ5LnNhbmRib3hJZCwgdXNlci5oYXNoLCB7XG4gICAgICBvYnNlcnZlZEF0LFxuICAgICAgZGVmaW5pdGlvbnM6IFsuLi5zZXJ2aWNlcy52YWx1ZXMoKV0ubWFwKChzZXJ2aWNlKSA9PiBzZXJ2aWNlLmRlZmluaXRpb24pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3aXRoQnVpbHRJbnMoXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgc2VydmljZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlPixcbiAgKTogTGFrZWJveFNlcnZpY2VbXSB7XG4gICAgY29uc3QgYnVpbHRJbnMgPSBMQUtFQk9YX0JVSUxUX0lOX1NFUlZJQ0VTLm1hcCgoeyBuYW1lIH0pID0+IHtcbiAgICAgIGNvbnN0IHNhdmVkID0gc2VydmljZXMuZ2V0KG5hbWUpO1xuICAgICAgcmV0dXJuIHNhdmVkXG4gICAgICAgID8gdG9MYWtlYm94U2VydmljZShzYXZlZCwgdXNlciwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpXG4gICAgICAgIDogaWRsZUJ1aWx0SW5TZXJ2aWNlKG5hbWUsIHVzZXIsIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KTtcbiAgICB9KTtcbiAgICBjb25zdCBjdXN0b20gPSBbLi4uc2VydmljZXMudmFsdWVzKCldXG4gICAgICAuZmlsdGVyKChzZXJ2aWNlKSA9PiAhTEFLRUJPWF9CVUlMVF9JTl9TRVJWSUNFUy5zb21lKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gc2VydmljZS5uYW1lKSlcbiAgICAgIC5tYXAoKHNlcnZpY2UpID0+IHRvTGFrZWJveFNlcnZpY2Uoc2VydmljZSwgdXNlciwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpKTtcbiAgICByZXR1cm4gWy4uLmJ1aWx0SW5zLCAuLi5jdXN0b21dO1xuICB9XG5cbiAgcHJpdmF0ZSBpZGxlU2VydmljZXModXNlcjogTGFrZWJveFVzZXIpOiBMYWtlYm94U2VydmljZVtdIHtcbiAgICByZXR1cm4gTEFLRUJPWF9CVUlMVF9JTl9TRVJWSUNFUy5tYXAoKHsgbmFtZSB9KSA9PlxuICAgICAgaWRsZUJ1aWx0SW5TZXJ2aWNlKG5hbWUgYXMgTGFrZWJveEJ1aWx0SW5TZXJ2aWNlTmFtZSwgdXNlciwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpLFxuICAgICk7XG4gIH1cblxuICAvKiogUmVzb2x2ZXMgb25lIHJvdXRlZCByZXF1ZXN0LCB3YWtpbmcgdGhlIExha2Vib3ggb3Igc2VydmljZSBpbiB0aGUgYmFja2dyb3VuZC4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlUm91dGUodXNlcjogTGFrZWJveFVzZXIsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8TGFrZWJveFJvdXRlUmVzb2x1dGlvbj4ge1xuICAgIHRoaXMudG91Y2goKTtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoKTtcbiAgICBjb25zdCBydW5uaW5nID0gZW50cnkgJiYgbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpID09PSBcInJ1bm5pbmdcIjtcbiAgICBjb25zdCBib290ID0gdGhpcy5ib290O1xuICAgIGlmICghcnVubmluZyB8fCAhYm9vdCB8fCBib290LmtleSAhPT0gdGhpcy5ib290S2V5KGVudHJ5KSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5hdXRvKSByZXR1cm4geyBraW5kOiBcIm1pc3NpbmdcIiB9O1xuICAgICAgdGhpcy53YWtlKCgpID0+IHRoaXMucmVhZHkoKSk7XG4gICAgICByZXR1cm4geyBraW5kOiBcImxvYWRpbmdcIiB9O1xuICAgIH1cbiAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMucm91dGVkSWRlbnRpdGllcy5nZXQodXNlci5oYXNoKTtcbiAgICBpZiAoIWlkZW50aXR5KSByZXR1cm4geyBraW5kOiBcIm1pc3NpbmdcIiB9O1xuICAgIGxldCBzZXJ2aWNlID0gYm9vdC5zZXJ2aWNlcy5nZXQodXNlci5oYXNoKT8uZ2V0KG5hbWUpO1xuICAgIGlmICghc2VydmljZSkgc2VydmljZSA9IChhd2FpdCB0aGlzLnJlZnJlc2hTZXJ2aWNlcyhib290LCB1c2VyLCBpZGVudGl0eSkpLmdldChuYW1lKTtcbiAgICBjb25zdCBidWlsdEluID0gbGFrZWJveEJ1aWx0SW5TZXJ2aWNlTmFtZVNjaGVtYS5zYWZlUGFyc2UobmFtZSk7XG4gICAgaWYgKCFzZXJ2aWNlICYmICFidWlsdEluLnN1Y2Nlc3MpIHJldHVybiB7IGtpbmQ6IFwibWlzc2luZ1wiIH07XG4gICAgaWYgKHNlcnZpY2U/LnN0YXRlID09PSBcInJlYWR5XCIpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwicmVhZHlcIiwgc2Vzc2lvbjogYm9vdC5zZXNzaW9uLCByb3V0ZTogc2VydmljZVJvdXRlKHNlcnZpY2UuZGVmaW5pdGlvbikgfTtcbiAgICB9XG4gICAgaWYgKHNlcnZpY2U/LnN0YXRlID09PSBcImVycm9yXCIgJiYgIWJvb3Quc3RhcnRpbmcuaGFzKGAke3VzZXIuaGFzaH1cXDAke25hbWV9YCkpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwiZmFpbGVkXCIsIG1lc3NhZ2U6IHNlcnZpY2UuZXJyb3IgPz8gXCJ0aGUgc2VydmljZSBmYWlsZWQgdG8gc3RhcnRcIiB9O1xuICAgIH1cbiAgICBjb25zdCBkZWZpbml0aW9uID0gc2VydmljZT8uZGVmaW5pdGlvbiA/PyBidWlsdEluRGVmaW5pdGlvbihidWlsdEluLmRhdGEhLCB1c2VyKTtcbiAgICB0aGlzLndha2UoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzZXJ2aWNlKSBhd2FpdCB0aGlzLmNvbnRyb2xsZXIoYm9vdCwgdXNlciwgXCJwdXRcIiwgW2VuY29kZShkZWZpbml0aW9uKV0pO1xuICAgICAgYXdhaXQgdGhpcy5ydW5TZXJ2aWNlKGJvb3QsIHVzZXIsIGRlZmluaXRpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGtpbmQ6IFwibG9hZGluZ1wiIH07XG4gIH1cblxuICBwcml2YXRlIG1hcmtVbmF2YWlsYWJsZSh1c2VyOiBMYWtlYm94VXNlciwgbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5ib290Py5zZXJ2aWNlcy5nZXQodXNlci5oYXNoKT8uZGVsZXRlKG5hbWUpO1xuICAgIHRoaXMuY2FjaGVkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB3YWtlKGFjdGlvbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLndha2luZykgcmV0dXJuO1xuICAgIHRoaXMud2FraW5nID0gYWN0aW9uKClcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ2dlci53YXJuKFwiTGFrZWJveCB3YWtlIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy53YWtpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZE1ldHJpY3Moc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYm9vdCA9IHRoaXMuYm9vdDtcbiAgICBpZiAoIWJvb3QpIHRocm93IG5ldyBFcnJvcihcIkxha2Vib3ggaXMgbm90IHJ1bm5pbmdcIik7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5hZG1pbihib290LnNlc3Npb24sIFtcIm1ldHJpY3NcIl0sIHNpZ25hbCkpLnN0ZG91dDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jYWNoZWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxlYXNlTWV0cmljcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYm9vdCkgcmV0dXJuO1xuICAgIHRoaXMubWV0cmljcy5zdGFydCgpO1xuICAgIGlmICh0aGlzLm1ldHJpY3NMZWFzZSkgY2xlYXJUaW1lb3V0KHRoaXMubWV0cmljc0xlYXNlKTtcbiAgICB0aGlzLm1ldHJpY3NMZWFzZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubWV0cmljcy5saXN0ZW5lckNvdW50KFwic25hcHNob3RcIikgPT09IDApIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgfSwgTUVUUklDU19MRUFTRV9NUyk7XG4gICAgdGhpcy5tZXRyaWNzTGVhc2UudW5yZWY/LigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIHRoZSBTU0ggc2Vzc2lvbiBhZnRlciB0aGUgaWRsZSB0aW1lb3V0IHdpdGhvdXQgY29tbWFuZHMsIHNlcnZpY2VcbiAgICogb3BlcmF0aW9ucywgcm91dGVkIHRyYWZmaWMsIG9wZW4gc3RyZWFtcywgb3IgbWV0cmljcyB3YXRjaGVycy4gQW4gb3BlblxuICAgKiBzZXNzaW9uIGNvdW50cyBhcyBhY3Rpdml0eSBmb3IgdGhlIHBsYXRmb3JtIHdhdGNoZG9nLCBzbyByZWxlYXNpbmcgaXQgbGV0c1xuICAgKiB0aGUgcGxhdGZvcm0gc3RvcCB0aGUgTGFrZWJveCBhZnRlciBpdHMgb3duIGlkbGUgdGltZW91dC4gVGhlIG5leHQgcmVxdWVzdFxuICAgKiByZWNvbm5lY3RzLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXRjaElkbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaWRsZVRpbWVyKSBjbGVhckludGVydmFsKHRoaXMuaWRsZVRpbWVyKTtcbiAgICB0aGlzLmlkbGVUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkbGVNcyA9IERhdGUubm93KCkgLSB0aGlzLmxhc3RBY3Rpdml0eTtcbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuYm9vdCB8fFxuICAgICAgICB0aGlzLmNvbnZlcmdpbmcgfHxcbiAgICAgICAgaWRsZU1zIDwgdGhpcy5jb25maWcuaWRsZVRpbWVvdXRTZWNvbmRzICogMV8wMDAgfHxcbiAgICAgICAgdGhpcy5hY3RpdmVDb21tYW5kcyA+IDAgfHxcbiAgICAgICAgdGhpcy5ib290LnN0YXJ0aW5nLnNpemUgPiAwIHx8XG4gICAgICAgIHRoaXMucm91dGVzLmFjdGl2ZUNvbm5lY3Rpb25zKCkgPiAwIHx8XG4gICAgICAgIHRoaXMubWV0cmljcy5saXN0ZW5lckNvdW50KFwic25hcHNob3RcIikgPiAwXG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMucm91dGVzLmFjdGl2ZUNvbm5lY3Rpb25zKCkgPiAwIHx8IHRoaXMuYWN0aXZlQ29tbWFuZHMgPiAwKSB0aGlzLnRvdWNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKFwicmVsZWFzaW5nIGlkbGUgTGFrZWJveCBzZXNzaW9uXCIsIHsgaWRsZVNlY29uZHM6IE1hdGgucm91bmQoaWRsZU1zIC8gMV8wMDApIH0pO1xuICAgICAgdm9pZCB0aGlzLmRpc2NhcmRCb290KCk7XG4gICAgfSwgSURMRV9DSEVDS19NUyk7XG4gICAgdGhpcy5pZGxlVGltZXIudW5yZWY/LigpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b3VjaCgpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RBY3Rpdml0eSA9IERhdGUubm93KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRpc2NhcmRCb290KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlkbGVUaW1lcikgY2xlYXJJbnRlcnZhbCh0aGlzLmlkbGVUaW1lcik7XG4gICAgdGhpcy5pZGxlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgYm9vdCA9IHRoaXMuYm9vdDtcbiAgICB0aGlzLmJvb3QgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICBhd2FpdCB0aGlzLnJvdXRlcy5jbG9zZUJyaWRnZXMoKTtcbiAgICBhd2FpdCBib290Py5zZXNzaW9uLmNsb3NlKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGUoZGVmaW5pdGlvbjogTGFrZWJveENvbnRyb2xsZXJEZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGRlZmluaXRpb24pKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cblxuZnVuY3Rpb24gc2hlbGxRdW90ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAnJHt2YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBcIidcXFxcJydcIil9J2A7XG59XG5cbi8qKiBSZXR1cm5zIHdoZXRoZXIgYW4gZXJyb3IgbWVhbnMgdGhlIG1hbmFnZWQgTGFrZWJveCBubyBsb25nZXIgZXhpc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGFrZWJveE1pc3NpbmcoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgTGFrZWJveEFwaUVycm9yICYmIGVycm9yLnN0YXR1cyA9PT0gNDA0O1xufVxuIl19
|
|
810
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekMsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLFVBQVUsR0FDWCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLGFBQWEsR0FHZCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLCtCQUErQixFQUMvQiwyQkFBMkIsRUFDM0IsK0JBQStCLEdBV2hDLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBELE9BQU8sRUFBMkIsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxvQkFBb0IsRUFBK0IsTUFBTSxhQUFhLENBQUM7QUFDaEYsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLDhCQUE4QixFQUM5QixZQUFZLEVBQ1osZ0JBQWdCLEdBR2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFOUQsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxF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QUFDO0FBRUQsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sS0FBSyxZQUFZLGVBQWUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0h0dHBIZWFkZXJzIH0gZnJvbSBcIm5vZGU6aHR0cFwiO1xuaW1wb3J0IHsgb25QYXJlbnRUZXJtaW5hdGlvblNpZ25hbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7XG4gIFNzaEtleVN0b3JlLFxuICBlbnN1cmVMYWtlYm94UnVubmluZyxcbiAgZW5zdXJlTGFrZWJveFN0b3BwZWQsXG4gIGxha2Vib3hJZGxlVGltZW91dFNlY29uZHMsXG4gIG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMsXG4gIFNzaENvbW1hbmQsXG4gIFNzaFNlc3Npb24sXG59IGZyb20gXCJAZGJ4LXRvb2xzL2xha2Vib3hcIjtcbmltcG9ydCB7XG4gIGlzTGFrZWJveFVuYXZhaWxhYmxlLFxuICBMYWtlYm94QXBpRXJyb3IsXG4gIExha2Vib3hDbGllbnQsXG4gIHR5cGUgTGFrZWJveEF1dGgsXG4gIHR5cGUgTGFrZWJveEVudHJ5LFxufSBmcm9tIFwiQGRieC10b29scy9sYWtlYm94XCI7XG5pbXBvcnQgeyBlcnJvck5vZGVzLCBsb2csIHNsZWVwLCB0b0Vycm9yIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIExBS0VCT1hfQlVJTFRfSU5fU0VSVklDRVMsXG4gIGxha2Vib3hCdWlsdEluU2VydmljZU5hbWVTY2hlbWEsXG4gIGxha2Vib3hDb21tYW5kUmVxdWVzdFNjaGVtYSxcbiAgbGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdFNjaGVtYSxcbiAgdHlwZSBDcmVhdGVMYWtlYm94U2VydmljZVJlcXVlc3QsXG4gIHR5cGUgTGFrZWJveEJ1aWx0SW5TZXJ2aWNlTmFtZSxcbiAgdHlwZSBMYWtlYm94Q29tbWFuZFJlcXVlc3QsXG4gIHR5cGUgTGFrZWJveE1ldHJpY3NSZXNwb25zZSxcbiAgdHlwZSBMYWtlYm94TWV0cmljc1NuYXBzaG90LFxuICB0eXBlIExha2Vib3hTZXJ2aWNlLFxuICB0eXBlIExha2Vib3hTZXJ2aWNlTG9nc1JlcXVlc3QsXG4gIHR5cGUgTGFrZWJveFN0YXR1cyxcbiAgdHlwZSBMYWtlYm94U3VtbWFyeSxcbiAgdHlwZSBMYWtlYm94VXNlcixcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWxha2Vib3hcIjtcbmltcG9ydCB7IHJlYWRQYWNrYWdlUmVzb3VyY2UgfSBmcm9tIFwiLi9fcGFja2FnZS50c1wiO1xuaW1wb3J0IHsgTGFrZWJveFJlc291cmNlUmVnaXN0cnkgfSBmcm9tIFwiLi9fcmVzb3VyY2UtcmVnaXN0cnkudHNcIjtcbmltcG9ydCB7IExha2Vib3hTZXJ2aWNlU25hcHNob3RzLCBzdG9wcGVkU25hcHNob3RTZXJ2aWNlcyB9IGZyb20gXCIuL19zZXJ2aWNlLXNuYXBzaG90cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZExha2Vib3hQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IExha2Vib3hNZXRyaWNzIH0gZnJvbSBcIi4vbWV0cmljcy50c1wiO1xuaW1wb3J0IHsgTGFrZWJveFJvdXRlUmVnaXN0cnksIHR5cGUgTGFrZWJveFJvdXRlUmVzb2x1dGlvbiB9IGZyb20gXCIuL3JvdXRlcy50c1wiO1xuaW1wb3J0IHtcbiAgYnVpbHRJbkRlZmluaXRpb24sXG4gIGlkbGVCdWlsdEluU2VydmljZSxcbiAgaW1hZ2VEZWZpbml0aW9uLFxuICBMYWtlYm94Q29udHJvbGxlclNlcnZpY2VTY2hlbWEsXG4gIHNlcnZpY2VSb3V0ZSxcbiAgdG9MYWtlYm94U2VydmljZSxcbiAgdHlwZSBMYWtlYm94Q29udHJvbGxlckRlZmluaXRpb24sXG4gIHR5cGUgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlLFxufSBmcm9tIFwiLi9zZXJ2aWNlcy50c1wiO1xuaW1wb3J0IHsgTEFLRUJPWF9SVU5USU1FX1JPT1QsIGxha2Vib3hVc2VyIH0gZnJvbSBcIi4vdXNlci50c1wiO1xuXG5jb25zdCBBRE1JTl9TQ1JJUFQgPSByZWFkUGFja2FnZVJlc291cmNlKFwic2NyaXB0c1wiLCBcImxha2Vib3gtYWRtaW4uc2hcIik7XG5jb25zdCBIRUxQRVJTID0ge1xuICBcImxha2Vib3gtc2VydmljZVwiOiByZWFkUGFja2FnZVJlc291cmNlKFwic2NyaXB0c1wiLCBcImxha2Vib3gtc2VydmljZS5weVwiKSxcbiAgXCJkZXNrdG9wLXNlc3Npb25cIjogcmVhZFBhY2thZ2VSZXNvdXJjZShcInNjcmlwdHNcIiwgXCJkZXNrdG9wLXNlc3Npb24uc2hcIiksXG4gIFwiZGVza3RvcC1wcmVyZXF1aXNpdGVzXCI6IHJlYWRQYWNrYWdlUmVzb3VyY2UoXCJzY3JpcHRzXCIsIFwiZGVza3RvcC1wcmVyZXF1aXNpdGVzLnNoXCIpLFxufSBhcyBjb25zdDtcbmNvbnN0IENPTlRST0xMRVIgPSBgJHtMQUtFQk9YX1JVTlRJTUVfUk9PVH0vYmluL2xha2Vib3gtc2VydmljZWA7XG5jb25zdCBFTlRSWV9UVExfTVMgPSA1XzAwMDtcbmNvbnN0IFNFVFVQX1RJTUVPVVRfTVMgPSA2MDBfMDAwO1xuY29uc3QgU1NIX1JFQURZX1RJTUVPVVRfTVMgPSAzMDBfMDAwO1xuY29uc3QgU1NIX1JFQURZX1JFVFJZX0lOSVRJQUxfTVMgPSAxXzAwMDtcbmNvbnN0IFNTSF9SRUFEWV9SRVRSWV9NQVhfTVMgPSAxMF8wMDA7XG5jb25zdCBUUkFOU0lFTlRfU1NIX0NPREVTID0gbmV3IFNldChbXG4gIFwiRUNPTk5SRUZVU0VEXCIsXG4gIFwiRUNPTk5SRVNFVFwiLFxuICBcIkVIT1NUVU5SRUFDSFwiLFxuICBcIkVORVRVTlJFQUNIXCIsXG4gIFwiRVRJTUVET1VUXCIsXG5dKTtcbmNvbnN0IE1FVFJJQ1NfTEVBU0VfTVMgPSA2MF8wMDA7XG5jb25zdCBJRExFX0NIRUNLX01TID0gMzBfMDAwO1xuY29uc3QgU1NIX0tFWV9PV05FUiA9IFwiYXBwLXNlcnZpY2UtcHJpbmNpcGFsXCI7XG5jb25zdCBMRUdBQ1lfTkFNRSA9XG4gIC9eZGJ4LSg/IWxha2Vib3gtKVthLXpdKy1bYS16XSstWzAtOWEtZl17OH0oPzpfdWlkX1tBLVphLXowLTlfLV0rX2V4cF9bMC05XSspPyQvO1xuY29uc3QgTEVHQUNZX1NDSEVNQV9QUkVGSVggPSBcImRieF90b29sc19kYXRhYnJpY2tzX3NhbmRib3hcIjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQtbGFrZWJveDpydW50aW1lXCIpO1xuXG4vKiogV2hldGhlciB0aGUgcGxhdGZvcm0gaXMgcnVubmluZyBidXQgaXRzIFNTSCBnYXRld2F5IGlzIHN0aWxsIGJlY29taW5nIHJlYWNoYWJsZS4gKi9cbmZ1bmN0aW9uIF9pc1RyYW5zaWVudFNzaFN0YXJ0dXBFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gWy4uLmVycm9yTm9kZXMoZXJyb3IpXS5zb21lKFxuICAgIChub2RlKSA9PlxuICAgICAgdHlwZW9mIG5vZGUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIFwiY29kZVwiIGluIG5vZGUgJiZcbiAgICAgIFRSQU5TSUVOVF9TU0hfQ09ERVMuaGFzKFN0cmluZygobm9kZSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUpKSxcbiAgKTtcbn1cblxuLyoqIFJlc29sdmVzIHRoZSBhdXRoZW50aWNhdGVkIGlkZW50aXR5IGZvciByYXcgcmVxdWVzdCBoZWFkZXJzLiAqL1xuZXhwb3J0IHR5cGUgTGFrZWJveElkZW50aXR5UmVzb2x2ZXIgPSAoaGVhZGVyczogSW5jb21pbmdIdHRwSGVhZGVycykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKiogTWluaW1hbCBMYWtlYmFzZSBwb29sIHVzZWQgdG8gZHJvcCBsZWdhY3kgb3duZXJzaGlwIHNjaGVtYXMuICovXG5leHBvcnQgaW50ZXJmYWNlIExha2Vib3hMZWdhY3lQb29sIHtcbiAgcXVlcnkoc3FsOiBzdHJpbmcsIHZhbHVlcz86IHVua25vd25bXSk6IFByb21pc2U8eyByb3dzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfT47XG59XG5cbmludGVyZmFjZSBCb290IHtcbiAga2V5OiBzdHJpbmc7XG4gIGVudHJ5OiBMYWtlYm94RW50cnk7XG4gIHNlc3Npb246IFNzaFNlc3Npb247XG4gIHVzZXJzOiBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PjtcbiAgc2VydmljZXM6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4+O1xuICBzdGFydGluZzogTWFwPHN0cmluZywgUHJvbWlzZTxMYWtlYm94U2VydmljZT4+O1xuICBkZXNrdG9wPzogUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIFNlcnZpY2VMaXN0aW5nIHtcbiAgc2VydmljZXM6IExha2Vib3hTZXJ2aWNlW107XG4gIHN0YWxlOiBib29sZWFuO1xuICBvYnNlcnZlZEF0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE93bnMgdGhlIHNpbmdsZSBsYXppbHkgY3JlYXRlZCBMYWtlYm94IG9mIG9uZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBFdmVyeSBEYXRhYnJpY2tzIExha2Vib3ggUkVTVCBjYWxsIHVzZXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCBzdXBwbGllZFxuICogdGhyb3VnaCB7QGxpbmsgaW5pdGlhbGl6ZX07IHJlcXVlc3QgaWRlbnRpdHkgb25seSBzZWxlY3RzIHRoZSBpbnRlcm5hbCBMaW51eFxuICogYWNjb3VudC4gRWFjaCBhdXRoZW50aWNhdGVkIGlkZW50aXR5IG1hcHMgdGhyb3VnaCBvbmUgRk5WLTFhIGhhc2ggdG8gYSBsb2NrZWRcbiAqIGFjY291bnQsIHBlcnNpc3RlbnQgaG9tZSwgcm91dGUgc2VnbWVudCwgYW5kIHNlcnZpY2UgcG9ydHMuIExpZmVjeWNsZSBhbmRcbiAqIHBlci1ib290IGJvb3RzdHJhcCBhcmUgc2VyaWFsaXplZCBpbi1wcm9jZXNzOyB0aGUgcGVyc2lzdGVudCByZXNvdXJjZVxuICogcmVnaXN0cnkgc2VyaWFsaXplcyBmaXJzdCBjcmVhdGlvbiBhY3Jvc3MgcmVwbGljYXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlYm94UnVudGltZSB7XG4gIHJlYWRvbmx5IHJvdXRlczogTGFrZWJveFJvdXRlUmVnaXN0cnk7XG4gIHJlYWRvbmx5IG1ldHJpY3M6IExha2Vib3hNZXRyaWNzO1xuICBwcml2YXRlIHJlYWRvbmx5IGtleXM6IFNzaEtleVN0b3JlO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbDogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaHV0ZG93bkNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHByaXZhdGUgYXBpPzogTGFrZWJveENsaWVudDtcbiAgcHJpdmF0ZSBpZGVudGl0eTogTGFrZWJveElkZW50aXR5UmVzb2x2ZXIgPSAoKSA9PiB1bmRlZmluZWQ7XG4gIC8qKiBJbi1tZW1vcnkgaWRlbnRpdGllcyBvZiByb3V0ZWQgdXNlcnM7IG5ldmVyIHBlcnNpc3RlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZWRJZGVudGl0aWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBjYWNoZWQ/OiB7IGVudHJ5PzogTGFrZWJveEVudHJ5OyBhdDogbnVtYmVyIH07XG4gIHByaXZhdGUgYm9vdD86IEJvb3Q7XG4gIC8qKiBMYXN0IGJvb3QgdGhhdCBjb21wbGV0ZWQgcnVudGltZSBib290c3RyYXAgYW5kIHByb2R1Y2VkIGEgbWV0cmljcyBzYW1wbGUuICovXG4gIHByaXZhdGUgcmVhZHlCb290S2V5Pzogc3RyaW5nO1xuICBwcml2YXRlIGNvbnZlcmdpbmc/OiBQcm9taXNlPEJvb3Q+O1xuICBwcml2YXRlIHdha2luZz86IFByb21pc2U8dW5rbm93bj47XG4gIHByaXZhdGUgbWV0cmljc0xlYXNlPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgaWRsZVRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICBwcml2YXRlIGxhc3RBY3Rpdml0eSA9IERhdGUubm93KCk7XG4gIHByaXZhdGUgYWN0aXZlQ29tbWFuZHMgPSAwO1xuICAvKiogTGFzdCBzZXJ2aWNlIHN0YXRlcyBwZXIgdXNlciBoYXNoLCBrZXB0IGFmdGVyIGFuIGlkbGUgc2Vzc2lvbiByZWxlYXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxhc3RTZXJ2aWNlcyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBMYWtlYm94Q29udHJvbGxlclNlcnZpY2U+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhc3RTZXJ2aWNlc09ic2VydmVkQXQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlc291cmNlUmVnaXN0cnk/OiBMYWtlYm94UmVzb3VyY2VSZWdpc3RyeTtcbiAgcHJpdmF0ZSBzZXJ2aWNlU25hcHNob3RzPzogTGFrZWJveFNlcnZpY2VTbmFwc2hvdHM7XG4gIHByaXZhdGUgY2xvc2luZz86IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENyZWF0ZXMgYSBydW50aW1lIGZyb20gcmVzb2x2ZWQgcGx1Z2luIGNvbmZpZ3VyYXRpb24uICovXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRMYWtlYm94UGx1Z2luQ29uZmlnKSB7XG4gICAgdGhpcy5rZXlzID0gbmV3IFNzaEtleVN0b3JlKGNvbmZpZy5rZXlEaXJlY3RvcnkpO1xuICAgIHRoaXMucm91dGVzID0gbmV3IExha2Vib3hSb3V0ZVJlZ2lzdHJ5KGNvbmZpZy5yb3V0ZVByZWZpeCwge1xuICAgICAgdXNlcjogKGhlYWRlcnMpID0+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmlkZW50aXR5KGhlYWRlcnMpO1xuICAgICAgICBpZiAoIWlkZW50aXR5KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICAgICAgdGhpcy5yb3V0ZWRJZGVudGl0aWVzLnNldCh1c2VyLmhhc2gsIGlkZW50aXR5KTtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogKHVzZXIsIHNlcnZpY2UpID0+IHRoaXMucmVzb2x2ZVJvdXRlKHVzZXIsIHNlcnZpY2UpLFxuICAgICAgdW5hdmFpbGFibGU6ICh1c2VyLCBzZXJ2aWNlKSA9PiB0aGlzLm1hcmtVbmF2YWlsYWJsZSh1c2VyLCBzZXJ2aWNlKSxcbiAgICB9KTtcbiAgICB0aGlzLm1ldHJpY3MgPSBuZXcgTGFrZWJveE1ldHJpY3MoXG4gICAgICAoc2lnbmFsKSA9PiB0aGlzLnJlYWRNZXRyaWNzKHNpZ25hbCksXG4gICAgICBjb25maWcubWV0cmljc0ludGVydmFsU2Vjb25kcyAqIDFfMDAwLFxuICAgICk7XG4gICAgdGhpcy5zdG9wUGFyZW50VGVybWluYXRpb25TaWduYWwgPSBvblBhcmVudFRlcm1pbmF0aW9uU2lnbmFsKCgpID0+IHRoaXMucm91dGVzLmJlZ2luU2h1dGRvd24oKSk7XG4gIH1cblxuICAvKipcbiAgICogU3VwcGxpZXMgYXBwIHNlcnZpY2UtcHJpbmNpcGFsIGNyZWRlbnRpYWxzIGFuZCB0aGUgcmVxdWVzdCBpZGVudGl0eVxuICAgKiByZXNvbHZlciB1c2VkIGJ5IHJvdXRlcy5cbiAgICovXG4gIGluaXRpYWxpemUoXG4gICAgYXV0aDogTGFrZWJveEF1dGgsXG4gICAgaWRlbnRpdHk/OiBMYWtlYm94SWRlbnRpdHlSZXNvbHZlcixcbiAgICBzZXJ2aWNlU25hcHNob3RzPzogTGFrZWJveFNlcnZpY2VTbmFwc2hvdHMsXG4gICAgcmVzb3VyY2VSZWdpc3RyeT86IExha2Vib3hSZXNvdXJjZVJlZ2lzdHJ5LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmFwaSA9IG5ldyBMYWtlYm94Q2xpZW50KGF1dGgpO1xuICAgIGlmIChpZGVudGl0eSkgdGhpcy5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIGlmIChzZXJ2aWNlU25hcHNob3RzKSB0aGlzLnNlcnZpY2VTbmFwc2hvdHMgPSBzZXJ2aWNlU25hcHNob3RzO1xuICAgIGlmIChyZXNvdXJjZVJlZ2lzdHJ5KSB0aGlzLnJlc291cmNlUmVnaXN0cnkgPSByZXNvdXJjZVJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIERlcml2ZXMgdGhlIExha2Vib3ggYWNjb3VudCBmb3Igb25lIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkuICovXG4gIHVzZXIoaWRlbnRpdHk6IHN0cmluZyk6IExha2Vib3hVc2VyIHtcbiAgICByZXR1cm4gbGFrZWJveFVzZXIoaWRlbnRpdHksIHRoaXMuY29uZmlnLnJvdXRlUHJlZml4KTtcbiAgfVxuXG4gIC8qKiBTdW1tYXJpemVzIHRoZSBhcHAgTGFrZWJveCBmb3Igb25lIHVzZXIgd2l0aG91dCBjcmVhdGluZyBpdC4gKi9cbiAgYXN5bmMgc3VtbWFyeShpZGVudGl0eTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveFN1bW1hcnk+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBiYXNlID0geyBhdXRvOiB0aGlzLmNvbmZpZy5hdXRvLCBuYW1lOiBcIkxha2Vib3hcIiwgdXNlciB9O1xuICAgIGxldCBlbnRyeTogTGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsLCB0cnVlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzTGFrZWJveFVuYXZhaWxhYmxlKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgc3VwcG9ydGVkOiBmYWxzZSxcbiAgICAgICAgICBzdGF0dXM6IFwibWlzc2luZ1wiLFxuICAgICAgICAgIHNlcnZpY2VzOiBbXSxcbiAgICAgICAgICBzZXJ2aWNlc1N0YWxlOiBmYWxzZSxcbiAgICAgICAgICBjYW5TdGFydDogZmFsc2UsXG4gICAgICAgICAgY2FuU3RvcDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY29uc3QgcGxhdGZvcm1TdGF0dXM6IExha2Vib3hTdGF0dXMgPSBlbnRyeSA/IG5vcm1hbGl6ZUxha2Vib3hTdGF0dXMoZW50cnkuc3RhdHVzKSA6IFwibWlzc2luZ1wiO1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMucHJvZHVjdFN0YXR1cyhlbnRyeSwgcGxhdGZvcm1TdGF0dXMpO1xuICAgIGlmIChlbnRyeSAmJiBwbGF0Zm9ybVN0YXR1cyA9PT0gXCJydW5uaW5nXCIgJiYgc3RhdHVzID09PSBcInN0YXJ0aW5nXCIpIHtcbiAgICAgIHRoaXMud2FrZSgoKSA9PiB0aGlzLnJlYWR5KCkpO1xuICAgIH1cbiAgICBjb25zdCBsaXN0aW5nID0gYXdhaXQgdGhpcy5zZXJ2aWNlTGlzdGluZyhpZGVudGl0eSwgdXNlciwgZW50cnksIHN0YXR1cywgc2lnbmFsKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZSxcbiAgICAgIHN1cHBvcnRlZDogdHJ1ZSxcbiAgICAgIHN0YXR1cyxcbiAgICAgIC4uLihlbnRyeSA/IHsgaWQ6IGVudHJ5LnNhbmRib3hJZCB9IDoge30pLFxuICAgICAgLi4uKGxha2Vib3hJZGxlVGltZW91dFNlY29uZHMoZW50cnk/LmlkbGVUaW1lb3V0KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBpZGxlVGltZW91dFNlY29uZHM6IGxha2Vib3hJZGxlVGltZW91dFNlY29uZHMoZW50cnk/LmlkbGVUaW1lb3V0KSB9XG4gICAgICAgIDoge30pLFxuICAgICAgc2VydmljZXM6IGxpc3Rpbmcuc2VydmljZXMsXG4gICAgICBzZXJ2aWNlc1N0YWxlOiBsaXN0aW5nLnN0YWxlLFxuICAgICAgLi4uKGxpc3Rpbmcub2JzZXJ2ZWRBdCA/IHsgc2VydmljZXNPYnNlcnZlZEF0OiBsaXN0aW5nLm9ic2VydmVkQXQgfSA6IHt9KSxcbiAgICAgIGNhblN0YXJ0OiBzdGF0dXMgIT09IFwicnVubmluZ1wiICYmIHN0YXR1cyAhPT0gXCJzdGFydGluZ1wiLFxuICAgICAgY2FuU3RvcDogc3RhdHVzID09PSBcInJ1bm5pbmdcIiB8fCBzdGF0dXMgPT09IFwic3RhcnRpbmdcIixcbiAgICB9O1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIExha2Vib3ggd2hlbiBuZWVkZWQsIHN0YXJ0cyBpdCwgYW5kIHJlc3RvcmVzIHNhdmVkIHNlcnZpY2VzLiAqL1xuICBhc3luYyBzdGFydChzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVhZHkoc2lnbmFsLCB0cnVlKTtcbiAgfVxuXG4gIC8qKiBTdG9wcyB0aGUgc2hhcmVkIExha2Vib3ggZm9yIGV2ZXJ5IHVzZXIuIEZpbGVzIGFuZCBzYXZlZCBzZXJ2aWNlcyBwZXJzaXN0LiAqL1xuICBhc3luYyBzdG9wKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KHNpZ25hbCwgdHJ1ZSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuZGlzY2FyZEJvb3QoKTtcbiAgICBhd2FpdCBlbnN1cmVMYWtlYm94U3RvcHBlZCh0aGlzLmNsaWVudCgpLCBlbnRyeSwgc2lnbmFsKTtcbiAgICB0aGlzLmNhY2hlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBQZXJtYW5lbnRseSBkZWxldGVzIHRoZSBtYW5hZ2VkIExha2Vib3ggYW5kIGV2ZXJ5IHVzZXIncyBmaWxlcy4gKi9cbiAgYXN5bmMgZGVsZXRlKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KHNpZ25hbCwgdHJ1ZSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IHRoaXMuZGlzY2FyZEJvb3QoKTtcbiAgICBhd2FpdCB0aGlzLmNsaWVudCgpLmRlbGV0ZShlbnRyeS5zYW5kYm94SWQsIHNpZ25hbCk7XG4gICAgYXdhaXQgdGhpcy5yZXNvdXJjZXMoKS5jbGVhcih0aGlzLmNsaWVudCgpKTtcbiAgICB0aGlzLnJlYWR5Qm9vdEtleSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNhY2hlZCA9IHsgYXQ6IERhdGUubm93KCkgfTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uZSBjb21tYW5kIGFzIHRoZSB1c2VyJ3MgYWNjb3VudCwgY3JlYXRpbmcgb3Igc3RhcnRpbmcgdGhlIExha2Vib3hcbiAgICogd2hlbiBgYXV0b2AgaXMgZW5hYmxlZC5cbiAgICovXG4gIGV4ZWN1dGUoaWRlbnRpdHk6IHN0cmluZywgaW5wdXQ6IExha2Vib3hDb21tYW5kUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBTc2hDb21tYW5kIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbGFrZWJveENvbW1hbmRSZXF1ZXN0U2NoZW1hLnBhcnNlKGlucHV0KTtcbiAgICBjb25zdCB0aW1lb3V0TXMgPSByZXF1ZXN0LnRpbWVvdXRNcyA/PyB0aGlzLmNvbmZpZy5jb21tYW5kVGltZW91dE1zO1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnVzZXIoaWRlbnRpdHkpO1xuICAgIHJldHVybiBuZXcgU3NoQ29tbWFuZChcbiAgICAgIHJlcXVlc3QuY29tbWFuZCxcbiAgICAgIHJlcXVlc3QuYXJncyxcbiAgICAgIHsgdGltZW91dE1zLCBzaWduYWwgfSxcbiAgICAgIGFzeW5jIChleGVjdXRpb24pID0+IHtcbiAgICAgICAgY29uc3QgYm9vdCA9IGF3YWl0IHRoaXMucmVhZHlVc2VyKHVzZXIsIGlkZW50aXR5LCBleGVjdXRpb24uc2lnbmFsKTtcbiAgICAgICAgdGhpcy5hY3RpdmVDb21tYW5kcyArPSAxO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRpb24uZm9sbG93KFxuICAgICAgICAgICAgYm9vdC5zZXNzaW9uLmV4ZWN1dGUocmVxdWVzdC5jb21tYW5kLCByZXF1ZXN0LmFyZ3MsIHtcbiAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgLi4uKHJlcXVlc3QuY3dkID8geyBjd2Q6IHJlcXVlc3QuY3dkIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihyZXF1ZXN0LmVudiA/IHsgZW52OiByZXF1ZXN0LmVudiB9IDoge30pLFxuICAgICAgICAgICAgICB0aW1lb3V0TXMsXG4gICAgICAgICAgICAgIHNpZ25hbDogZXhlY3V0aW9uLnNpZ25hbCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDb21tYW5kcyAtPSAxO1xuICAgICAgICAgIHRoaXMudG91Y2goKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqIExpc3RzIHRoZSB1c2VyJ3Mgc2VydmljZXMsIGluY2x1ZGluZyBpZGxlIGJ1aWx0LWlucy4gTmV2ZXIgY3JlYXRlcyB0aGUgTGFrZWJveC4gKi9cbiAgYXN5bmMgbGlzdFNlcnZpY2VzKGlkZW50aXR5OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxMYWtlYm94U2VydmljZVtdPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KHNpZ25hbCk7XG4gICAgY29uc3Qgc3RhdHVzOiBMYWtlYm94U3RhdHVzID0gZW50cnkgPyBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgOiBcIm1pc3NpbmdcIjtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuc2VydmljZUxpc3RpbmcoaWRlbnRpdHksIHVzZXIsIGVudHJ5LCBzdGF0dXMsIHNpZ25hbCkpLnNlcnZpY2VzO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgb3IgcmVwbGFjZXMgb25lIGltYWdlIHNlcnZpY2UgYW5kIHdhaXRzIHVudGlsIGl0IGlzIHJlYWR5IG9yIGZhaWxlZC4gKi9cbiAgYXN5bmMgY3JlYXRlU2VydmljZShcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIGlucHV0OiBDcmVhdGVMYWtlYm94U2VydmljZVJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TGFrZWJveFNlcnZpY2U+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gaW1hZ2VEZWZpbml0aW9uKGlucHV0LCB1c2VyKTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwicHV0XCIsIFtlbmNvZGUoZGVmaW5pdGlvbildLCBzaWduYWwpO1xuICAgIHJldHVybiB0aGlzLnJ1blNlcnZpY2UoYm9vdCwgdXNlciwgZGVmaW5pdGlvbiwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBTdGFydHMgYSBzYXZlZCBzZXJ2aWNlIG9yIGEgYnVpbHQtaW4gYW5kIHdhaXRzIHVudGlsIGl0IGlzIHJlYWR5IG9yIGZhaWxlZC4gKi9cbiAgYXN5bmMgc3RhcnRTZXJ2aWNlKFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPExha2Vib3hTZXJ2aWNlPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgY29uc3QgYm9vdCA9IGF3YWl0IHRoaXMucmVhZHlVc2VyKHVzZXIsIGlkZW50aXR5LCBzaWduYWwpO1xuICAgIGNvbnN0IGJ1aWx0SW4gPSBsYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lU2NoZW1hLnNhZmVQYXJzZShuYW1lKTtcbiAgICBpZiAoYnVpbHRJbi5zdWNjZXNzKSB7XG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gYnVpbHRJbkRlZmluaXRpb24oYnVpbHRJbi5kYXRhLCB1c2VyKTtcbiAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcInB1dFwiLCBbZW5jb2RlKGRlZmluaXRpb24pXSwgc2lnbmFsKTtcbiAgICAgIHJldHVybiB0aGlzLnJ1blNlcnZpY2UoYm9vdCwgdXNlciwgZGVmaW5pdGlvbiwgc2lnbmFsKTtcbiAgICB9XG4gICAgY29uc3Qgc2F2ZWQgPSAoYXdhaXQgdGhpcy5yZWZyZXNoU2VydmljZXMoYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCkpLmdldChuYW1lKTtcbiAgICBpZiAoIXNhdmVkKSB0aHJvdyBuZXcgRXJyb3IoYExha2Vib3ggc2VydmljZSAke25hbWV9IGRvZXMgbm90IGV4aXN0YCk7XG4gICAgcmV0dXJuIHRoaXMucnVuU2VydmljZShib290LCB1c2VyLCBzYXZlZC5kZWZpbml0aW9uLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFN0b3BzIG9uZSBydW5uaW5nIHNlcnZpY2Ugd2l0aG91dCByZW1vdmluZyBpdHMgZGVmaW5pdGlvbi4gKi9cbiAgYXN5bmMgc3RvcFNlcnZpY2UoaWRlbnRpdHk6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveFNlcnZpY2U+IHtcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyKGlkZW50aXR5KTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3Qgc3RvcHBlZCA9IExha2Vib3hDb250cm9sbGVyU2VydmljZVNjaGVtYS5wYXJzZShcbiAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcInN0b3BcIiwgW25hbWVdLCBzaWduYWwpLFxuICAgICk7XG4gICAgdGhpcy5jYWNoZVNlcnZpY2UoYm9vdCwgdXNlciwgc3RvcHBlZCk7XG4gICAgcmV0dXJuIHRvTGFrZWJveFNlcnZpY2Uoc3RvcHBlZCwgdXNlciwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpO1xuICB9XG5cbiAgLyoqIFN0b3BzIGFuZCBkZWxldGVzIG9uZSBzYXZlZCBzZXJ2aWNlLiBNb3VudGVkIGhvbWUgZGlyZWN0b3JpZXMgYXJlIHByZXNlcnZlZC4gKi9cbiAgYXN5bmMgcmVtb3ZlU2VydmljZShpZGVudGl0eTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgY29uc3QgYm9vdCA9IGF3YWl0IHRoaXMucmVhZHlVc2VyKHVzZXIsIGlkZW50aXR5LCBzaWduYWwpO1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB0aGlzLmNvbnRyb2xsZXIoYm9vdCwgdXNlciwgXCJyZW1vdmVcIiwgW25hbWVdLCBzaWduYWwpKSBhcyB7XG4gICAgICByZW1vdmVkPzogYm9vbGVhbjtcbiAgICB9O1xuICAgIGlmIChyZXN1bHQucmVtb3ZlZCA9PT0gdHJ1ZSkgYXdhaXQgdGhpcy5yZWZyZXNoU2VydmljZXMoYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgcmV0dXJuIHJlc3VsdC5yZW1vdmVkID09PSB0cnVlO1xuICB9XG5cbiAgLyoqIFJlYWRzIGEgYm91bmRlZCB0YWlsIG9mIG9uZSBzZXJ2aWNlIGxvZy4gKi9cbiAgYXN5bmMgc2VydmljZUxvZ3MoXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICBpbnB1dDogTGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdCxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx7IGxvZzogc3RyaW5nIH0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbGFrZWJveFNlcnZpY2VMb2dzUmVxdWVzdFNjaGVtYS5wYXJzZShpbnB1dCk7XG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlcihpZGVudGl0eSk7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmVudHJ5KHNpZ25hbCk7XG4gICAgaWYgKCFlbnRyeSB8fCBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgIT09IFwicnVubmluZ1wiKSByZXR1cm4geyBsb2c6IFwiXCIgfTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeVVzZXIodXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMuY29udHJvbGxlcihcbiAgICAgIGJvb3QsXG4gICAgICB1c2VyLFxuICAgICAgXCJsb2dzXCIsXG4gICAgICBbcmVxdWVzdC5uYW1lLCBTdHJpbmcocmVxdWVzdC5tYXhMaW5lcyksIFN0cmluZyhyZXF1ZXN0Lm1heENoYXJzKV0sXG4gICAgICBzaWduYWwsXG4gICAgKSkgYXMgeyBsb2c/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4geyBsb2c6IHJlc3VsdC5sb2cgPz8gXCJcIiB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVjZW50IG1ldHJpY3MgYW5kIGtlZXBzIHNhbXBsaW5nIGZvciBvbmUgbGVhc2UgaW50ZXJ2YWwuIFNhbXBsaW5nXG4gICAqIHJ1bnMgb25seSB3aGlsZSB0aGUgTGFrZWJveCBydW5zIGFuZCBhIGNhbGxlciBpcyB3YXRjaGluZywgc28gbWV0cmljcyBuZXZlclxuICAgKiBrZWVwIGFuIG90aGVyd2lzZSBpZGxlIExha2Vib3ggYXdha2UuXG4gICAqL1xuICBhc3luYyBtZXRyaWNzUmVzcG9uc2Uoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExha2Vib3hNZXRyaWNzUmVzcG9uc2U+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZW50cnkoc2lnbmFsKTtcbiAgICBjb25zdCBwbGF0Zm9ybVN0YXR1czogTGFrZWJveFN0YXR1cyA9IGVudHJ5ID8gbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpIDogXCJtaXNzaW5nXCI7XG4gICAgaWYgKHBsYXRmb3JtU3RhdHVzICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICAgIHJldHVybiB7IHN0YXR1czogcGxhdGZvcm1TdGF0dXMsIHNlcmllczogW10gfTtcbiAgICB9XG4gICAgaWYgKCFlbnRyeSB8fCAhdGhpcy5ib290IHx8IHRoaXMuYm9vdC5rZXkgIT09IHRoaXMuYm9vdEtleShlbnRyeSkpIHtcbiAgICAgIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgICB0aGlzLndha2UoKCkgPT4gdGhpcy5yZWFkeSgpKTtcbiAgICAgIHJldHVybiB7IHN0YXR1czogXCJzdGFydGluZ1wiLCBzZXJpZXM6IFtdIH07XG4gICAgfVxuICAgIHRoaXMubGVhc2VNZXRyaWNzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogdGhpcy5wcm9kdWN0U3RhdHVzKGVudHJ5LCBwbGF0Zm9ybVN0YXR1cyksXG4gICAgICBzZXJpZXM6IFsuLi50aGlzLm1ldHJpY3Muc2VyaWVzKCldLFxuICAgIH07XG4gIH1cblxuICAvKiogU3Vic2NyaWJlcyB0byBtZXRyaWNzIHNuYXBzaG90cyB3aGlsZSB0aGUgTGFrZWJveCBydW5zLiAqL1xuICBzdWJzY3JpYmVNZXRyaWNzKGxpc3RlbmVyOiAoc25hcHNob3Q6IExha2Vib3hNZXRyaWNzU25hcHNob3QpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY3Mub24oXCJzbmFwc2hvdFwiLCBsaXN0ZW5lcik7XG4gICAgaWYgKHRoaXMuYm9vdD8ua2V5ID09PSB0aGlzLnJlYWR5Qm9vdEtleSkgdGhpcy5tZXRyaWNzLnN0YXJ0KCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMubWV0cmljcy5vZmYoXCJzbmFwc2hvdFwiLCBsaXN0ZW5lcik7XG4gICAgICB0aGlzLmxlYXNlTWV0cmljcygpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBsZWdhY3kgcGVyLXVzZXIgTGFrZWJveGVzIGFuZCBkcm9wcyBsZWdhY3kgb3duZXJzaGlwIHNjaGVtYXMuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIG1pZ3JhdGlvbjogdGhlIGVhcmxpZXIgb25lLW1hY2hpbmUtcGVyLXVzZXIgbW9kZWwgaXMgcmVtb3ZlZC5cbiAgICogVGhlIG1hbmFnZWQgYXBwIExha2Vib3ggYW5kIExha2Vib3hlcyB3aXRoIG90aGVyIG5hbWVzIGFyZSBuZXZlciB0b3VjaGVkLlxuICAgKi9cbiAgYXN5bmMgY2xlYW51cExlZ2FjeShwb29sPzogTGFrZWJveExlZ2FjeVBvb2wsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmNsaWVudCgpLmxpc3Qoc2lnbmFsKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBlbnRyaWVzXG4gICAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgJiYgTEVHQUNZX05BTUUudGVzdChlbnRyeS5uYW1lKSlcbiAgICAgICAgICAubWFwKGFzeW5jIChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQoKS5kZWxldGUoZW50cnkuc2FuZGJveElkLCBzaWduYWwpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJkZWxldGVkIGxlZ2FjeSBwZXItdXNlciBMYWtlYm94XCIsIHtcbiAgICAgICAgICAgICAgaWQ6IGVudHJ5LnNhbmRib3hJZCxcbiAgICAgICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0xha2Vib3hVbmF2YWlsYWJsZShlcnJvcikpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJsZWdhY3kgTGFrZWJveCBjbGVhbnVwIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwb29sKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNjaGVtYXMgPSBhd2FpdCBwb29sLnF1ZXJ5KFxuICAgICAgICBcIlNFTEVDVCBuc3BuYW1lIEZST00gcGdfbmFtZXNwYWNlIFdIRVJFIG5zcG5hbWUgPSAkMSBPUiBzdGFydHNfd2l0aChuc3BuYW1lLCAkMilcIixcbiAgICAgICAgW0xFR0FDWV9TQ0hFTUFfUFJFRklYLCBgJHtMRUdBQ1lfU0NIRU1BX1BSRUZJWH1fYF0sXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCByb3cgb2Ygc2NoZW1hcy5yb3dzKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IFN0cmluZyhyb3cubnNwbmFtZSk7XG4gICAgICAgIGF3YWl0IHBvb2wucXVlcnkoYERST1AgU0NIRU1BIElGIEVYSVNUUyBcIiR7c2NoZW1hLnJlcGxhY2VBbGwoJ1wiJywgJ1wiXCInKX1cIiBDQVNDQURFYCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZHJvcHBlZCBsZWdhY3kgTGFrZWJveCBvd25lcnNoaXAgc2NoZW1hXCIsIHsgc2NoZW1hIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihcImxlZ2FjeSBvd25lcnNoaXAgc2NoZW1hIGNsZWFudXAgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYW5jZWxzIGluLWZsaWdodCB3b3JrIGJlZm9yZSB0ZWFyZG93bi4gKi9cbiAgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaHV0ZG93bkNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHRoaXMuc2h1dGRvd25Db250cm9sbGVyLmFib3J0KCk7XG4gIH1cblxuICAvKiogQ2xvc2VzIHJvdXRlcywgbWV0cmljcywgYW5kIHRoZSBTU0ggc2Vzc2lvbiB3aXRob3V0IGNoYW5naW5nIHRoZSBMYWtlYm94LiAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHRoaXMucm91dGVzLmJlZ2luU2h1dGRvd24oKTtcbiAgICB0aGlzLmNsb3NpbmcgPz89IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy5tZXRyaWNzTGVhc2UpIGNsZWFyVGltZW91dCh0aGlzLm1ldHJpY3NMZWFzZSk7XG4gICAgICAgIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucm91dGVzLmNsb3NlKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYm9vdD8uc2Vzc2lvbi5jbG9zZSgpO1xuICAgICAgICB0aGlzLmJvb3QgPSB1bmRlZmluZWQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnN0b3BQYXJlbnRUZXJtaW5hdGlvblNpZ25hbCgpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2luZztcbiAgfVxuXG4gIHByaXZhdGUgY2xpZW50KCk6IExha2Vib3hDbGllbnQge1xuICAgIGlmICghdGhpcy5hcGkpIHRocm93IG5ldyBFcnJvcihcIlRoZSBMYWtlYm94IHJ1bnRpbWUgaGFzIG5vIGFwcCBzZXJ2aWNlLXByaW5jaXBhbCBjcmVkZW50aWFsc1wiKTtcbiAgICByZXR1cm4gdGhpcy5hcGk7XG4gIH1cblxuICBwcml2YXRlIHJlc291cmNlcygpOiBMYWtlYm94UmVzb3VyY2VSZWdpc3RyeSB7XG4gICAgaWYgKCF0aGlzLnJlc291cmNlUmVnaXN0cnkpIHRocm93IG5ldyBFcnJvcihcIlRoZSBMYWtlYm94IHJ1bnRpbWUgaGFzIG5vIHJlc291cmNlIHJlZ2lzdHJ5XCIpO1xuICAgIHJldHVybiB0aGlzLnJlc291cmNlUmVnaXN0cnk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgbWFuYWdlZCBMYWtlYm94IGVudHJ5LCBjYWNoZWQgYnJpZWZseSB0byBrZWVwIHJvdXRlcyBjaGVhcC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnRyeShzaWduYWw/OiBBYm9ydFNpZ25hbCwgZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8TGFrZWJveEVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCFmcmVzaCAmJiB0aGlzLmNhY2hlZCAmJiBEYXRlLm5vdygpIC0gdGhpcy5jYWNoZWQuYXQgPCBFTlRSWV9UVExfTVMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZC5lbnRyeTtcbiAgICB9XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLnJlc291cmNlcygpLnJlYWQodGhpcy5jbGllbnQoKSwgc2lnbmFsKTtcbiAgICB0aGlzLmNhY2hlZCA9IHsgLi4uKGVudHJ5ID8geyBlbnRyeSB9IDoge30pLCBhdDogRGF0ZS5ub3coKSB9O1xuICAgIGlmICghZW50cnkgfHwgbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhpcy5yZWFkeUJvb3RLZXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmJvb3QgJiYgKCFlbnRyeSB8fCB0aGlzLmJvb3RLZXkoZW50cnkpICE9PSB0aGlzLmJvb3Qua2V5KSkgYXdhaXQgdGhpcy5kaXNjYXJkQm9vdCgpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgYm9vdEtleShlbnRyeTogTGFrZWJveEVudHJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7ZW50cnkuc2FuZGJveElkfVxcMCR7ZW50cnkubGFzdFN0YXJ0VGltZSA/PyBcIlwifWA7XG4gIH1cblxuICBwcml2YXRlIHByb2R1Y3RTdGF0dXMoZW50cnk6IExha2Vib3hFbnRyeSB8IHVuZGVmaW5lZCwgc3RhdHVzOiBMYWtlYm94U3RhdHVzKTogTGFrZWJveFN0YXR1cyB7XG4gICAgcmV0dXJuIGVudHJ5ICYmIHN0YXR1cyA9PT0gXCJydW5uaW5nXCIgJiYgdGhpcy5yZWFkeUJvb3RLZXkgIT09IHRoaXMuYm9vdEtleShlbnRyeSlcbiAgICAgID8gXCJzdGFydGluZ1wiXG4gICAgICA6IHN0YXR1cztcbiAgfVxuXG4gIC8qKiBTZXJpYWxpemVzIGNyZWF0ZSwgc3RhcnQsIGNvbm5lY3QsIGFuZCBib290c3RyYXAgZm9yIHRoZSBjdXJyZW50IGJvb3QuICovXG4gIHByaXZhdGUgcmVhZHkoc2lnbmFsPzogQWJvcnRTaWduYWwsIGV4cGxpY2l0ID0gZmFsc2UpOiBQcm9taXNlPEJvb3Q+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5ib290O1xuICAgIGlmIChjdXJyZW50ICYmIHRoaXMuY2FjaGVkPy5lbnRyeSAmJiB0aGlzLmJvb3RLZXkodGhpcy5jYWNoZWQuZW50cnkpID09PSBjdXJyZW50LmtleSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSB0aGlzLmNhY2hlZC5hdCA8IEVOVFJZX1RUTF9NUykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50KTtcbiAgICB9XG4gICAgdGhpcy5jb252ZXJnaW5nID8/PSB0aGlzLmNvbnZlcmdlKHNpZ25hbCwgZXhwbGljaXQpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdGhpcy5jb252ZXJnaW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmNvbnZlcmdpbmc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnZlcmdlKHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsIGV4cGxpY2l0OiBib29sZWFuKTogUHJvbWlzZTxCb290PiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uU2lnbmFsID0gc2lnbmFsXG4gICAgICA/IEFib3J0U2lnbmFsLmFueShbc2lnbmFsLCB0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWxdKVxuICAgICAgOiB0aGlzLnNodXRkb3duQ29udHJvbGxlci5zaWduYWw7XG4gICAgbGV0IGVudHJ5ID0gYXdhaXQgdGhpcy5lbnRyeShvcGVyYXRpb25TaWduYWwsIHRydWUpO1xuICAgIGlmICghZW50cnkgfHwgbm9ybWFsaXplTGFrZWJveFN0YXR1cyhlbnRyeS5zdGF0dXMpICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5hdXRvICYmICFleHBsaWNpdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYExha2Vib3ggaXMgJHtlbnRyeSA/IGVudHJ5LnN0YXR1cyA6IFwibm90IGNyZWF0ZWRcIn07IHN0YXJ0IGl0IGV4cGxpY2l0bHkgYmVjYXVzZSBhdXRvIGlzIGZhbHNlYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPz89IGF3YWl0IHRoaXMucmVzb3VyY2VzKCkuZ2V0T3JDcmVhdGUodGhpcy5jbGllbnQoKSwgb3BlcmF0aW9uU2lnbmFsKTtcbiAgICBpZiAobGFrZWJveElkbGVUaW1lb3V0U2Vjb25kcyhlbnRyeS5pZGxlVGltZW91dCkgIT09IHRoaXMuY29uZmlnLmlkbGVUaW1lb3V0U2Vjb25kcykge1xuICAgICAgZW50cnkgPSBhd2FpdCB0aGlzLmNsaWVudCgpLnNldElkbGVUaW1lb3V0KFxuICAgICAgICBlbnRyeS5zYW5kYm94SWQsXG4gICAgICAgIHRoaXMuY29uZmlnLmlkbGVUaW1lb3V0U2Vjb25kcyxcbiAgICAgICAgb3BlcmF0aW9uU2lnbmFsLFxuICAgICAgKTtcbiAgICB9XG4gICAgZW50cnkgPSBhd2FpdCBlbnN1cmVMYWtlYm94UnVubmluZyh0aGlzLmNsaWVudCgpLCBlbnRyeSwgb3BlcmF0aW9uU2lnbmFsKTtcbiAgICB0aGlzLmNhY2hlZCA9IHsgZW50cnksIGF0OiBEYXRlLm5vdygpIH07XG4gICAgY29uc3Qga2V5ID0gdGhpcy5ib290S2V5KGVudHJ5KTtcbiAgICBpZiAodGhpcy5ib290Py5rZXkgPT09IGtleSkgcmV0dXJuIHRoaXMuYm9vdDtcbiAgICBhd2FpdCB0aGlzLmRpc2NhcmRCb290KCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuY29ubmVjdChlbnRyeSwgb3BlcmF0aW9uU2lnbmFsKTtcbiAgICBjb25zdCBib290OiBCb290ID0ge1xuICAgICAga2V5LFxuICAgICAgZW50cnksXG4gICAgICBzZXNzaW9uLFxuICAgICAgdXNlcnM6IG5ldyBNYXAoKSxcbiAgICAgIHNlcnZpY2VzOiBuZXcgTWFwKCksXG4gICAgICBzdGFydGluZzogbmV3IE1hcCgpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3RvcmVkID0gYXdhaXQgdGhpcy5ib290c3RyYXAoc2Vzc2lvbiwgb3BlcmF0aW9uU2lnbmFsKTtcbiAgICAgIHRoaXMubWV0cmljcy5zdG9wKCk7XG4gICAgICB0aGlzLm1ldHJpY3Muc2VlZCgoYXdhaXQgdGhpcy5hZG1pbihzZXNzaW9uLCBbXCJtZXRyaWNzXCJdLCBvcGVyYXRpb25TaWduYWwpKS5zdGRvdXQpO1xuICAgICAgdGhpcy5ib290ID0gYm9vdDtcbiAgICAgIHRoaXMucmVhZHlCb290S2V5ID0ga2V5O1xuICAgICAgdGhpcy53YXRjaElkbGUoKTtcbiAgICAgIGlmICh0aGlzLm1ldHJpY3MubGlzdGVuZXJDb3VudChcInNuYXBzaG90XCIpID4gMCkgdGhpcy5tZXRyaWNzLnN0YXJ0KCk7XG4gICAgICBmb3IgKGNvbnN0IGhhc2ggb2YgcmVzdG9yZWQpIHZvaWQgdGhpcy5yZXN0b3JlVXNlcihib290LCBoYXNoKTtcbiAgICAgIHJldHVybiBib290O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBzZXNzaW9uLmNsb3NlKCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3QoZW50cnk6IExha2Vib3hFbnRyeSwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8U3NoU2Vzc2lvbj4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0T25jZShlbnRyeSwgc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGF0dGVtcHQgKz0gMTtcbiAgICAgICAgaWYgKCFfaXNUcmFuc2llbnRTc2hTdGFydHVwRXJyb3IoZXJyb3IpIHx8IERhdGUubm93KCkgLSBzdGFydGVkQXQgPj0gU1NIX1JFQURZX1RJTUVPVVRfTVMpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbnRyeSA9IGF3YWl0IHRoaXMucmVmcmVzaFNzaEVudHJ5KGVudHJ5LCBzaWduYWwpO1xuICAgICAgICBjb25zdCBkZWxheU1zID0gTWF0aC5taW4oXG4gICAgICAgICAgU1NIX1JFQURZX1JFVFJZX0lOSVRJQUxfTVMgKiAyICoqIChhdHRlbXB0IC0gMSksXG4gICAgICAgICAgU1NIX1JFQURZX1JFVFJZX01BWF9NUyxcbiAgICAgICAgKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJMYWtlYm94IFNTSCBnYXRld2F5IGlzIG5vdCByZWFkeTsgcmV0cnlpbmdcIiwge1xuICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgZGVsYXlNcyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclNzaFJldHJ5KGRlbGF5TXMsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoU3NoRW50cnkoZW50cnk6IExha2Vib3hFbnRyeSwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8TGFrZWJveEVudHJ5PiB7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgdGhpcy5jbGllbnQoKS5nZXQoZW50cnkuc2FuZGJveElkLCBzaWduYWwpO1xuICAgIGlmIChyZWZyZXNoZWQuZ2F0ZXdheUhvc3QgIT09IGVudHJ5LmdhdGV3YXlIb3N0KSB7XG4gICAgICBsb2dnZXIuaW5mbyhcIkxha2Vib3ggU1NIIGdhdGV3YXkgYWRkcmVzcyBjaGFuZ2VkIGR1cmluZyBzdGFydHVwXCIsIHtcbiAgICAgICAgcHJldmlvdXNIb3N0OiBlbnRyeS5nYXRld2F5SG9zdCxcbiAgICAgICAgZ2F0ZXdheUhvc3Q6IHJlZnJlc2hlZC5nYXRld2F5SG9zdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNhY2hlZCA9IHsgZW50cnk6IHJlZnJlc2hlZCwgYXQ6IERhdGUubm93KCkgfTtcbiAgICByZXR1cm4gcmVmcmVzaGVkO1xuICB9XG5cbiAgcHJpdmF0ZSB3YWl0Rm9yU3NoUmV0cnkoZGVsYXlNczogbnVtYmVyLCBzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHNsZWVwKGRlbGF5TXMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RPbmNlKGVudHJ5OiBMYWtlYm94RW50cnksIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFNzaFNlc3Npb24+IHtcbiAgICBjb25zdCBhcGkgPSB0aGlzLmNsaWVudCgpO1xuICAgIGNvbnN0IHNjb3BlID0gYXdhaXQgYXBpLndvcmtzcGFjZVNjb3BlKCk7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgdGhpcy5rZXlzLmVuc3VyZVJlZ2lzdGVyZWQoYXBpLCBTU0hfS0VZX09XTkVSLCBzaWduYWwpO1xuICAgIGNvbnN0IGdhdGV3YXlIb3N0ID0gZW50cnkuZ2F0ZXdheUhvc3QgPz8ga2V5LmdhdGV3YXlIb3N0O1xuICAgIGlmICghZ2F0ZXdheUhvc3QpIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3MgTGFrZWJveCBkaWQgbm90IHJldHVybiBhbiBTU0ggZ2F0ZXdheSBob3N0XCIpO1xuICAgIGNvbnN0IHBvcnQgPSB0aGlzLmNvbmZpZy5nYXRld2F5UG9ydDtcbiAgICBjb25zdCBrbm93bkhvc3QgPSBhd2FpdCB0aGlzLmtleXMua25vd25Ib3N0KHNjb3BlLCBTU0hfS0VZX09XTkVSLCBnYXRld2F5SG9zdCwgcG9ydCk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IG5ldyBTc2hTZXNzaW9uKHtcbiAgICAgIGhvc3Q6IGdhdGV3YXlIb3N0LFxuICAgICAgcG9ydCxcbiAgICAgIHVzZXJuYW1lOiBlbnRyeS5zYW5kYm94SWQsXG4gICAgICBwcml2YXRlS2V5OiBrZXkucHJpdmF0ZUtleSxcbiAgICAgIHByaXZhdGVLZXlQYXRoOiBrZXkucHJpdmF0ZUtleVBhdGgsXG4gICAgICBrbm93bkhvc3RzUGF0aDogdGhpcy5rZXlzLmtub3duSG9zdHNQYXRoKHNjb3BlLCBTU0hfS0VZX09XTkVSLCBnYXRld2F5SG9zdCwgcG9ydCksXG4gICAgICBjb25uZWN0VGltZW91dE1zOiB0aGlzLmNvbmZpZy5jb25uZWN0VGltZW91dE1zLFxuICAgICAgc3NoVHJhbnNwb3J0OiB0aGlzLmNvbmZpZy5zc2hUcmFuc3BvcnQsXG4gICAgICBzc2gyUGF0Y2g6IHRoaXMuY29uZmlnLnNzaDJQYXRjaCxcbiAgICAgIC4uLihrbm93bkhvc3QgPyB7IGtub3duSG9zdCB9IDoge30pLFxuICAgICAgcmVtZW1iZXJIb3N0OiAoZmluZ2VycHJpbnQsIGhvc3RLZXkpID0+XG4gICAgICAgIHRoaXMua2V5cy5yZW1lbWJlckhvc3Qoc2NvcGUsIFNTSF9LRVlfT1dORVIsIGdhdGV3YXlIb3N0LCBwb3J0LCBmaW5nZXJwcmludCwgaG9zdEtleSksXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlc3Npb24uY29ubmVjdCgpO1xuICAgICAgcmV0dXJuIHNlc3Npb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHNlc3Npb24uY2xvc2UoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSdW5zIHRoZSBmaXhlZCBwcml2aWxlZ2VkIGJvb3RzdHJhcCBhbmQgcmV0dXJucyB0aGUgcmVzdG9yZWQgdXNlciBoYXNoZXMuICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdHN0cmFwKHNlc3Npb246IFNzaFNlc3Npb24sIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgaGVscGVycyA9IE9iamVjdC5lbnRyaWVzKEhFTFBFUlMpLm1hcChcbiAgICAgIChbbmFtZSwgY29udGVudF0pID0+IGAke25hbWV9PSR7QnVmZmVyLmZyb20oY29udGVudCkudG9TdHJpbmcoXCJiYXNlNjRcIil9YCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRtaW4oc2Vzc2lvbiwgW1wiYm9vdHN0cmFwXCIsIC4uLmhlbHBlcnNdLCBzaWduYWwpO1xuICAgIHJldHVybiByZXN1bHQuc3Rkb3V0XG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChcIl9fTEFLRUJPWF9VU0VSX189XCIpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShcIl9fTEFLRUJPWF9VU0VSX189XCIubGVuZ3RoKS50cmltKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZG1pbihcbiAgICBzZXNzaW9uOiBTc2hTZXNzaW9uLFxuICAgIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHsgc3Rkb3V0OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IGVuY29kZWQgPSBCdWZmZXIuZnJvbShBRE1JTl9TQ1JJUFQpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb24uZXhlY3V0ZVByaXZpbGVnZWQoXG4gICAgICBcInNoXCIsXG4gICAgICBbXCItY1wiLCBgcHJpbnRmICVzICcke2VuY29kZWR9JyB8IGJhc2U2NCAtZCB8IHNoIC1zIC0tICR7YXJncy5tYXAoc2hlbGxRdW90ZSkuam9pbihcIiBcIil9YF0sXG4gICAgICB7IHRpbWVvdXRNczogU0VUVVBfVElNRU9VVF9NUywgLi4uKHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB7fSkgfSxcbiAgICApLnJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBMYWtlYm94ICR7YXJnc1swXX0gZmFpbGVkOiAke3Jlc3VsdC5zdGRlcnIudHJpbSgpIHx8IHJlc3VsdC5zdGRvdXQudHJpbSgpIHx8IGBleGl0ICR7cmVzdWx0LmV4aXRDb2RlfWB9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogTWFya3MgYWN0aXZpdHksIHJlYWRpZXMgdGhlIGN1cnJlbnQgYm9vdCwgYW5kIGNvbnZlcmdlcyB0aGUgdXNlcidzIGFjY291bnQuICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZHlVc2VyKFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIGlkZW50aXR5OiBzdHJpbmcsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8Qm9vdD4ge1xuICAgIHRoaXMudG91Y2goKTtcbiAgICBjb25zdCBib290ID0gYXdhaXQgdGhpcy5yZWFkeShzaWduYWwpO1xuICAgIGF3YWl0IHRoaXMuY29udmVyZ2VVc2VyKGJvb3QsIHVzZXIsIGlkZW50aXR5LCBzaWduYWwpO1xuICAgIHJldHVybiBib290O1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgb3IgdmVyaWZpZXMgdGhlIHVzZXIncyBhY2NvdW50IG9uY2UgcGVyIGJvb3QuICovXG4gIHByaXZhdGUgY29udmVyZ2VVc2VyKFxuICAgIGJvb3Q6IEJvb3QsXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGNvbnZlcmdlZCA9IGJvb3QudXNlcnMuZ2V0KHVzZXIuaGFzaCk7XG4gICAgaWYgKCFjb252ZXJnZWQpIHtcbiAgICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGlkZW50aXR5LnRyaW0oKS50b0xvd2VyQ2FzZSgpKS5kaWdlc3QoXCJoZXhcIik7XG4gICAgICBjb252ZXJnZWQgPSB0aGlzLmFkbWluKFxuICAgICAgICBib290LnNlc3Npb24sXG4gICAgICAgIFtcImVuc3VyZS11c2VyXCIsIHVzZXIuaGFzaCwgU3RyaW5nKHVzZXIudWlkKSwgZGlnZXN0XSxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKS50aGVuKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICBib290LnVzZXJzLnNldCh1c2VyLmhhc2gsIGNvbnZlcmdlZCk7XG4gICAgICBjb252ZXJnZWQuY2F0Y2goKCkgPT4gYm9vdC51c2Vycy5kZWxldGUodXNlci5oYXNoKSk7XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJnZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc3RvcmVVc2VyKGJvb3Q6IEJvb3QsIGhhc2g6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVzZXIgPSB7IG5hbWU6IGBsYWtlYm94LSR7aGFzaH1gLCBob21lOiBgL2hvbWUvbGFrZWJveC0ke2hhc2h9YCB9O1xuICAgIGJvb3QudXNlcnMuc2V0KGhhc2gsIFByb21pc2UucmVzb2x2ZSgpKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYm9vdC5zZXNzaW9uLmV4ZWN1dGUoXCJweXRob24zXCIsIFtDT05UUk9MTEVSLCBcInN0YXJ0LWFsbFwiXSwge1xuICAgICAgICB1c2VyLFxuICAgICAgICB0aW1lb3V0TXM6IFNFVFVQX1RJTUVPVVRfTVMsXG4gICAgICAgIHNpZ25hbDogdGhpcy5zaHV0ZG93bkNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSkucmVzdWx0O1xuICAgICAgaWYgKCFyZXN1bHQuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5zdGRlcnIudHJpbSgpIHx8IGBleGl0ICR7cmVzdWx0LmV4aXRDb2RlfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGxvZ2dlci53YXJuKFwiTGFrZWJveCBzZXJ2aWNlIHJlc3RvcmUgZmFpbGVkXCIsIHtcbiAgICAgICAgdXNlcjogaGFzaCxcbiAgICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250cm9sbGVyKFxuICAgIGJvb3Q6IEJvb3QsXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgY29tbWFuZDogc3RyaW5nLFxuICAgIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBib290LnNlc3Npb24uZXhlY3V0ZShcInB5dGhvbjNcIiwgW0NPTlRST0xMRVIsIGNvbW1hbmQsIC4uLmFyZ3NdLCB7XG4gICAgICB1c2VyLFxuICAgICAgdGltZW91dE1zOiBTRVRVUF9USU1FT1VUX01TLFxuICAgICAgLi4uKHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB7fSksXG4gICAgfSkucmVzdWx0O1xuICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYExha2Vib3ggc2VydmljZSAke2NvbW1hbmR9IGZhaWxlZDogJHtyZXN1bHQuc3RkZXJyLnRyaW0oKSB8fCBgZXhpdCAke3Jlc3VsdC5leGl0Q29kZX1gfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQuc3Rkb3V0KSBhcyB1bmtub3duO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TZXJ2aWNlKFxuICAgIGJvb3Q6IEJvb3QsXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgZGVmaW5pdGlvbjogTGFrZWJveENvbnRyb2xsZXJEZWZpbml0aW9uLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPExha2Vib3hTZXJ2aWNlPiB7XG4gICAgY29uc3Qga2V5ID0gYCR7dXNlci5oYXNofVxcMCR7ZGVmaW5pdGlvbi5uYW1lfWA7XG4gICAgY29uc3QgcGVuZGluZyA9IGJvb3Quc3RhcnRpbmcuZ2V0KGtleSk7XG4gICAgaWYgKHBlbmRpbmcpIHJldHVybiBwZW5kaW5nO1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoZGVmaW5pdGlvbi5raW5kID09PSBcImRlc2t0b3BcIikge1xuICAgICAgICBib290LmRlc2t0b3AgPz89IHRoaXMuYWRtaW4oYm9vdC5zZXNzaW9uLCBbXCJkZXNrdG9wLXByZXJlcXVpc2l0ZXNcIl0sIHNpZ25hbCkudGhlbihcbiAgICAgICAgICAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgICk7XG4gICAgICAgIGJvb3QuZGVza3RvcC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgYm9vdC5kZXNrdG9wID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgYm9vdC5kZXNrdG9wO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hZG1pbihcbiAgICAgICAgYm9vdC5zZXNzaW9uLFxuICAgICAgICBbXCJhbGxvdy1wb3J0XCIsIFN0cmluZyh1c2VyLnVpZCksIFN0cmluZyhkZWZpbml0aW9uLnBvcnQpXSxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBMYWtlYm94Q29udHJvbGxlclNlcnZpY2VTY2hlbWEucGFyc2UoXG4gICAgICAgIGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcInN0YXJ0XCIsIFtkZWZpbml0aW9uLm5hbWVdLCBzaWduYWwpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlKGJvb3QsIHVzZXIsIHN0YXJ0ZWQpO1xuICAgICAgcmV0dXJuIHRvTGFrZWJveFNlcnZpY2Uoc3RhcnRlZCwgdXNlciwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpO1xuICAgIH0pKCkuZmluYWxseSgoKSA9PiBib290LnN0YXJ0aW5nLmRlbGV0ZShrZXkpKTtcbiAgICBib290LnN0YXJ0aW5nLnNldChrZXksIG9wZXJhdGlvbik7XG4gICAgcmV0dXJuIG9wZXJhdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFNlcnZpY2VzKFxuICAgIGJvb3Q6IEJvb3QsXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgaWRlbnRpdHk6IHN0cmluZyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBMYWtlYm94Q29udHJvbGxlclNlcnZpY2U+PiB7XG4gICAgYXdhaXQgdGhpcy5jb252ZXJnZVVzZXIoYm9vdCwgdXNlciwgaWRlbnRpdHksIHNpZ25hbCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5jb250cm9sbGVyKGJvb3QsIHVzZXIsIFwibGlzdFwiLCBbXSwgc2lnbmFsKSkgYXMge1xuICAgICAgc2VydmljZXM/OiB1bmtub3duW107XG4gICAgfTtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IG5ldyBNYXAoXG4gICAgICAocmVzcG9uc2Uuc2VydmljZXMgPz8gW10pLm1hcCgoc2VydmljZSkgPT4ge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBMYWtlYm94Q29udHJvbGxlclNlcnZpY2VTY2hlbWEucGFyc2Uoc2VydmljZSk7XG4gICAgICAgIHJldHVybiBbcGFyc2VkLm5hbWUsIHBhcnNlZF0gYXMgY29uc3Q7XG4gICAgICB9KSxcbiAgICApO1xuICAgIGJvb3Quc2VydmljZXMuc2V0KHVzZXIuaGFzaCwgc2VydmljZXMpO1xuICAgIHRoaXMubGFzdFNlcnZpY2VzLnNldCh1c2VyLmhhc2gsIHNlcnZpY2VzKTtcbiAgICBjb25zdCBvYnNlcnZlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIHRoaXMubGFzdFNlcnZpY2VzT2JzZXJ2ZWRBdC5zZXQodXNlci5oYXNoLCBvYnNlcnZlZEF0KTtcbiAgICBhd2FpdCB0aGlzLnBlcnNpc3RTZXJ2aWNlU25hcHNob3QoYm9vdC5lbnRyeSwgdXNlciwgc2VydmljZXMsIG9ic2VydmVkQXQpO1xuICAgIHJldHVybiBzZXJ2aWNlcztcbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVTZXJ2aWNlKGJvb3Q6IEJvb3QsIHVzZXI6IExha2Vib3hVc2VyLCBzZXJ2aWNlOiBMYWtlYm94Q29udHJvbGxlclNlcnZpY2UpOiB2b2lkIHtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IGJvb3Quc2VydmljZXMuZ2V0KHVzZXIuaGFzaCkgPz8gbmV3IE1hcDxzdHJpbmcsIExha2Vib3hDb250cm9sbGVyU2VydmljZT4oKTtcbiAgICBzZXJ2aWNlcy5zZXQoc2VydmljZS5uYW1lLCBzZXJ2aWNlKTtcbiAgICBib290LnNlcnZpY2VzLnNldCh1c2VyLmhhc2gsIHNlcnZpY2VzKTtcbiAgICB0aGlzLmxhc3RTZXJ2aWNlcy5zZXQodXNlci5oYXNoLCBzZXJ2aWNlcyk7XG4gICAgY29uc3Qgb2JzZXJ2ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICB0aGlzLmxhc3RTZXJ2aWNlc09ic2VydmVkQXQuc2V0KHVzZXIuaGFzaCwgb2JzZXJ2ZWRBdCk7XG4gICAgdm9pZCB0aGlzLnBlcnNpc3RTZXJ2aWNlU25hcHNob3QoYm9vdC5lbnRyeSwgdXNlciwgc2VydmljZXMsIG9ic2VydmVkQXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXJ2aWNlTGlzdGluZyhcbiAgICBpZGVudGl0eTogc3RyaW5nLFxuICAgIHVzZXI6IExha2Vib3hVc2VyLFxuICAgIGVudHJ5OiBMYWtlYm94RW50cnkgfCB1bmRlZmluZWQsXG4gICAgc3RhdHVzOiBMYWtlYm94U3RhdHVzLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFNlcnZpY2VMaXN0aW5nPiB7XG4gICAgaWYgKCFlbnRyeSB8fCBzdGF0dXMgPT09IFwibWlzc2luZ1wiKSB7XG4gICAgICByZXR1cm4geyBzZXJ2aWNlczogdGhpcy5pZGxlU2VydmljZXModXNlciksIHN0YWxlOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSBcInJ1bm5pbmdcIiAmJiB0aGlzLmJvb3Q/LmtleSA9PT0gdGhpcy5ib290S2V5KGVudHJ5KSkge1xuICAgICAgY29uc3Qgc2VydmljZXMgPSBhd2FpdCB0aGlzLnJlZnJlc2hTZXJ2aWNlcyh0aGlzLmJvb3QsIHVzZXIsIGlkZW50aXR5LCBzaWduYWwpO1xuICAgICAgcmV0dXJuIHsgc2VydmljZXM6IHRoaXMud2l0aEJ1aWx0SW5zKHVzZXIsIHNlcnZpY2VzKSwgc3RhbGU6IGZhbHNlIH07XG4gICAgfVxuICAgIGNvbnN0IG1lbW9yeSA9IHRoaXMubGFzdFNlcnZpY2VzLmdldCh1c2VyLmhhc2gpO1xuICAgIGlmIChtZW1vcnkpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVkQXQgPSB0aGlzLmxhc3RTZXJ2aWNlc09ic2VydmVkQXQuZ2V0KHVzZXIuaGFzaCk7XG4gICAgICBjb25zdCBzZXJ2aWNlcyA9XG4gICAgICAgIHN0YXR1cyA9PT0gXCJydW5uaW5nXCJcbiAgICAgICAgICA/IG1lbW9yeVxuICAgICAgICAgIDogc3RvcHBlZFNuYXBzaG90U2VydmljZXMoe1xuICAgICAgICAgICAgICBvYnNlcnZlZEF0OiBvYnNlcnZlZEF0ID8/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgZGVmaW5pdGlvbnM6IFsuLi5tZW1vcnkudmFsdWVzKCldLm1hcCgoc2VydmljZSkgPT4gc2VydmljZS5kZWZpbml0aW9uKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VydmljZXM6IHRoaXMud2l0aEJ1aWx0SW5zKHVzZXIsIHNlcnZpY2VzKSxcbiAgICAgICAgc3RhbGU6IHRydWUsXG4gICAgICAgIC4uLihvYnNlcnZlZEF0ID8geyBvYnNlcnZlZEF0IH0gOiB7fSksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuc2VydmljZVNuYXBzaG90cz8ucmVhZChlbnRyeS5zYW5kYm94SWQsIHVzZXIuaGFzaCk7XG4gICAgcmV0dXJuIHNuYXBzaG90XG4gICAgICA/IHtcbiAgICAgICAgICBzZXJ2aWNlczogdGhpcy53aXRoQnVpbHRJbnModXNlciwgc3RvcHBlZFNuYXBzaG90U2VydmljZXMoc25hcHNob3QpKSxcbiAgICAgICAgICBzdGFsZTogdHJ1ZSxcbiAgICAgICAgICBvYnNlcnZlZEF0OiBzbmFwc2hvdC5vYnNlcnZlZEF0LFxuICAgICAgICB9XG4gICAgICA6IHsgc2VydmljZXM6IHRoaXMuaWRsZVNlcnZpY2VzKHVzZXIpLCBzdGFsZTogdHJ1ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0U2VydmljZVNuYXBzaG90KFxuICAgIGVudHJ5OiBMYWtlYm94RW50cnksXG4gICAgdXNlcjogTGFrZWJveFVzZXIsXG4gICAgc2VydmljZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgTGFrZWJveENvbnRyb2xsZXJTZXJ2aWNlPixcbiAgICBvYnNlcnZlZEF0OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2VydmljZVNuYXBzaG90cz8ud3JpdGUoZW50cnkuc2FuZGJveElkLCB1c2VyLmhhc2gsIHtcbiAgICAgIG9ic2VydmVkQXQsXG4gICAgICBkZWZpbml0aW9uczogWy4uLnNlcnZpY2VzLnZhbHVlcygpXS5tYXAoKHNlcnZpY2UpID0+IHNlcnZpY2UuZGVmaW5pdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdpdGhCdWlsdElucyhcbiAgICB1c2VyOiBMYWtlYm94VXNlcixcbiAgICBzZXJ2aWNlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBMYWtlYm94Q29udHJvbGxlclNlcnZpY2U+LFxuICApOiBMYWtlYm94U2VydmljZVtdIHtcbiAgICBjb25zdCBidWlsdElucyA9IExBS0VCT1hfQlVJTFRfSU5fU0VSVklDRVMubWFwKCh7IG5hbWUgfSkgPT4ge1xuICAgICAgY29uc3Qgc2F2ZWQgPSBzZXJ2aWNlcy5nZXQobmFtZSk7XG4gICAgICByZXR1cm4gc2F2ZWRcbiAgICAgICAgPyB0b0xha2Vib3hTZXJ2aWNlKHNhdmVkLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeClcbiAgICAgICAgOiBpZGxlQnVpbHRJblNlcnZpY2UobmFtZSwgdXNlciwgdGhpcy5jb25maWcucm91dGVQcmVmaXgpO1xuICAgIH0pO1xuICAgIGNvbnN0IGN1c3RvbSA9IFsuLi5zZXJ2aWNlcy52YWx1ZXMoKV1cbiAgICAgIC5maWx0ZXIoKHNlcnZpY2UpID0+ICFMQUtFQk9YX0JVSUxUX0lOX1NFUlZJQ0VTLnNvbWUoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBzZXJ2aWNlLm5hbWUpKVxuICAgICAgLm1hcCgoc2VydmljZSkgPT4gdG9MYWtlYm94U2VydmljZShzZXJ2aWNlLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeCkpO1xuICAgIHJldHVybiBbLi4uYnVpbHRJbnMsIC4uLmN1c3RvbV07XG4gIH1cblxuICBwcml2YXRlIGlkbGVTZXJ2aWNlcyh1c2VyOiBMYWtlYm94VXNlcik6IExha2Vib3hTZXJ2aWNlW10ge1xuICAgIHJldHVybiBMQUtFQk9YX0JVSUxUX0lOX1NFUlZJQ0VTLm1hcCgoeyBuYW1lIH0pID0+XG4gICAgICBpZGxlQnVpbHRJblNlcnZpY2UobmFtZSBhcyBMYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lLCB1c2VyLCB0aGlzLmNvbmZpZy5yb3V0ZVByZWZpeCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlcyBvbmUgcm91dGVkIHJlcXVlc3QsIHdha2luZyB0aGUgTGFrZWJveCBvciBzZXJ2aWNlIGluIHRoZSBiYWNrZ3JvdW5kLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVSb3V0ZSh1c2VyOiBMYWtlYm94VXNlciwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxMYWtlYm94Um91dGVSZXNvbHV0aW9uPiB7XG4gICAgdGhpcy50b3VjaCgpO1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgdGhpcy5lbnRyeSgpO1xuICAgIGNvbnN0IHJ1bm5pbmcgPSBlbnRyeSAmJiBub3JtYWxpemVMYWtlYm94U3RhdHVzKGVudHJ5LnN0YXR1cykgPT09IFwicnVubmluZ1wiO1xuICAgIGNvbnN0IGJvb3QgPSB0aGlzLmJvb3Q7XG4gICAgaWYgKCFydW5uaW5nIHx8ICFib290IHx8IGJvb3Qua2V5ICE9PSB0aGlzLmJvb3RLZXkoZW50cnkpKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnLmF1dG8pIHJldHVybiB7IGtpbmQ6IFwibWlzc2luZ1wiIH07XG4gICAgICB0aGlzLndha2UoKCkgPT4gdGhpcy5yZWFkeSgpKTtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwibG9hZGluZ1wiIH07XG4gICAgfVxuICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5yb3V0ZWRJZGVudGl0aWVzLmdldCh1c2VyLmhhc2gpO1xuICAgIGlmICghaWRlbnRpdHkpIHJldHVybiB7IGtpbmQ6IFwibWlzc2luZ1wiIH07XG4gICAgbGV0IHNlcnZpY2UgPSBib290LnNlcnZpY2VzLmdldCh1c2VyLmhhc2gpPy5nZXQobmFtZSk7XG4gICAgaWYgKCFzZXJ2aWNlKSBzZXJ2aWNlID0gKGF3YWl0IHRoaXMucmVmcmVzaFNlcnZpY2VzKGJvb3QsIHVzZXIsIGlkZW50aXR5KSkuZ2V0KG5hbWUpO1xuICAgIGNvbnN0IGJ1aWx0SW4gPSBsYWtlYm94QnVpbHRJblNlcnZpY2VOYW1lU2NoZW1hLnNhZmVQYXJzZShuYW1lKTtcbiAgICBpZiAoIXNlcnZpY2UgJiYgIWJ1aWx0SW4uc3VjY2VzcykgcmV0dXJuIHsga2luZDogXCJtaXNzaW5nXCIgfTtcbiAgICBpZiAoc2VydmljZT8uc3RhdGUgPT09IFwicmVhZHlcIikge1xuICAgICAgcmV0dXJuIHsga2luZDogXCJyZWFkeVwiLCBzZXNzaW9uOiBib290LnNlc3Npb24sIHJvdXRlOiBzZXJ2aWNlUm91dGUoc2VydmljZS5kZWZpbml0aW9uKSB9O1xuICAgIH1cbiAgICBpZiAoc2VydmljZT8uc3RhdGUgPT09IFwiZXJyb3JcIiAmJiAhYm9vdC5zdGFydGluZy5oYXMoYCR7dXNlci5oYXNofVxcMCR7bmFtZX1gKSkge1xuICAgICAgcmV0dXJuIHsga2luZDogXCJmYWlsZWRcIiwgbWVzc2FnZTogc2VydmljZS5lcnJvciA/PyBcInRoZSBzZXJ2aWNlIGZhaWxlZCB0byBzdGFydFwiIH07XG4gICAgfVxuICAgIGNvbnN0IGRlZmluaXRpb24gPSBzZXJ2aWNlPy5kZWZpbml0aW9uID8/IGJ1aWx0SW5EZWZpbml0aW9uKGJ1aWx0SW4uZGF0YSEsIHVzZXIpO1xuICAgIHRoaXMud2FrZShhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXNlcnZpY2UpIGF3YWl0IHRoaXMuY29udHJvbGxlcihib290LCB1c2VyLCBcInB1dFwiLCBbZW5jb2RlKGRlZmluaXRpb24pXSk7XG4gICAgICBhd2FpdCB0aGlzLnJ1blNlcnZpY2UoYm9vdCwgdXNlciwgZGVmaW5pdGlvbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsga2luZDogXCJsb2FkaW5nXCIgfTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya1VuYXZhaWxhYmxlKHVzZXI6IExha2Vib3hVc2VyLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmJvb3Q/LnNlcnZpY2VzLmdldCh1c2VyLmhhc2gpPy5kZWxldGUobmFtZSk7XG4gICAgdGhpcy5jYWNoZWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHdha2UoYWN0aW9uOiAoKSA9PiBQcm9taXNlPHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2FraW5nKSByZXR1cm47XG4gICAgdGhpcy53YWtpbmcgPSBhY3Rpb24oKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nZ2VyLndhcm4oXCJMYWtlYm94IHdha2UgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pKVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLndha2luZyA9IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkTWV0cmljcyhzaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBib290ID0gdGhpcy5ib290O1xuICAgIGlmICghYm9vdCkgdGhyb3cgbmV3IEVycm9yKFwiTGFrZWJveCBpcyBub3QgcnVubmluZ1wiKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFkbWluKGJvb3Quc2Vzc2lvbiwgW1wibWV0cmljc1wiXSwgc2lnbmFsKSkuc3Rkb3V0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNhY2hlZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbGVhc2VNZXRyaWNzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ib290KSByZXR1cm47XG4gICAgdGhpcy5tZXRyaWNzLnN0YXJ0KCk7XG4gICAgaWYgKHRoaXMubWV0cmljc0xlYXNlKSBjbGVhclRpbWVvdXQodGhpcy5tZXRyaWNzTGVhc2UpO1xuICAgIHRoaXMubWV0cmljc0xlYXNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5tZXRyaWNzLmxpc3RlbmVyQ291bnQoXCJzbmFwc2hvdFwiKSA9PT0gMCkgdGhpcy5tZXRyaWNzLnN0b3AoKTtcbiAgICB9LCBNRVRSSUNTX0xFQVNFX01TKTtcbiAgICB0aGlzLm1ldHJpY3NMZWFzZS51bnJlZj8uKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIFNTSCBzZXNzaW9uIGFmdGVyIHRoZSBpZGxlIHRpbWVvdXQgd2l0aG91dCBjb21tYW5kcywgc2VydmljZVxuICAgKiBvcGVyYXRpb25zLCByb3V0ZWQgdHJhZmZpYywgb3BlbiBzdHJlYW1zLCBvciBtZXRyaWNzIHdhdGNoZXJzLiBBbiBvcGVuXG4gICAqIHNlc3Npb24gY291bnRzIGFzIGFjdGl2aXR5IGZvciB0aGUgcGxhdGZvcm0gd2F0Y2hkb2csIHNvIHJlbGVhc2luZyBpdCBsZXRzXG4gICAqIHRoZSBwbGF0Zm9ybSBzdG9wIHRoZSBMYWtlYm94IGFmdGVyIGl0cyBvd24gaWRsZSB0aW1lb3V0LiBUaGUgbmV4dCByZXF1ZXN0XG4gICAqIHJlY29ubmVjdHMuXG4gICAqL1xuICBwcml2YXRlIHdhdGNoSWRsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pZGxlVGltZXIpIGNsZWFySW50ZXJ2YWwodGhpcy5pZGxlVGltZXIpO1xuICAgIHRoaXMuaWRsZVRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgaWRsZU1zID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEFjdGl2aXR5O1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5ib290IHx8XG4gICAgICAgIHRoaXMuY29udmVyZ2luZyB8fFxuICAgICAgICBpZGxlTXMgPCB0aGlzLmNvbmZpZy5pZGxlVGltZW91dFNlY29uZHMgKiAxXzAwMCB8fFxuICAgICAgICB0aGlzLmFjdGl2ZUNvbW1hbmRzID4gMCB8fFxuICAgICAgICB0aGlzLmJvb3Quc3RhcnRpbmcuc2l6ZSA+IDAgfHxcbiAgICAgICAgdGhpcy5yb3V0ZXMuYWN0aXZlQ29ubmVjdGlvbnMoKSA+IDAgfHxcbiAgICAgICAgdGhpcy5tZXRyaWNzLmxpc3RlbmVyQ291bnQoXCJzbmFwc2hvdFwiKSA+IDBcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5yb3V0ZXMuYWN0aXZlQ29ubmVjdGlvbnMoKSA+IDAgfHwgdGhpcy5hY3RpdmVDb21tYW5kcyA+IDApIHRoaXMudG91Y2goKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmluZm8oXCJyZWxlYXNpbmcgaWRsZSBMYWtlYm94IHNlc3Npb25cIiwgeyBpZGxlU2Vjb25kczogTWF0aC5yb3VuZChpZGxlTXMgLyAxXzAwMCkgfSk7XG4gICAgICB2b2lkIHRoaXMuZGlzY2FyZEJvb3QoKTtcbiAgICB9LCBJRExFX0NIRUNLX01TKTtcbiAgICB0aGlzLmlkbGVUaW1lci51bnJlZj8uKCk7XG4gIH1cblxuICBwcml2YXRlIHRvdWNoKCk6IHZvaWQge1xuICAgIHRoaXMubGFzdEFjdGl2aXR5ID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzY2FyZEJvb3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaWRsZVRpbWVyKSBjbGVhckludGVydmFsKHRoaXMuaWRsZVRpbWVyKTtcbiAgICB0aGlzLmlkbGVUaW1lciA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCBib290ID0gdGhpcy5ib290O1xuICAgIHRoaXMuYm9vdCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1ldHJpY3Muc3RvcCgpO1xuICAgIGF3YWl0IHRoaXMucm91dGVzLmNsb3NlQnJpZGdlcygpO1xuICAgIGF3YWl0IGJvb3Q/LnNlc3Npb24uY2xvc2UoKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZShkZWZpbml0aW9uOiBMYWtlYm94Q29udHJvbGxlckRlZmluaXRpb24pOiBzdHJpbmcge1xuICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoZGVmaW5pdGlvbikpLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xufVxuXG5mdW5jdGlvbiBzaGVsbFF1b3RlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke3ZhbHVlLnJlcGxhY2VBbGwoXCInXCIsIFwiJ1xcXFwnJ1wiKX0nYDtcbn1cblxuLyoqIFJldHVybnMgd2hldGhlciBhbiBlcnJvciBtZWFucyB0aGUgbWFuYWdlZCBMYWtlYm94IG5vIGxvbmdlciBleGlzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMYWtlYm94TWlzc2luZyhlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBMYWtlYm94QXBpRXJyb3IgJiYgZXJyb3Iuc3RhdHVzID09PSA0MDQ7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"projen": "projen"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@dbx-tools/auth": "^0.9.
|
|
22
|
+
"@dbx-tools/auth": "^0.9.165",
|
|
23
23
|
"@types/express": "^5.0.5",
|
|
24
24
|
"@types/json-schema": "^7",
|
|
25
25
|
"@types/node": "^24.6.0",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@databricks/appkit": "0.81.0",
|
|
32
|
-
"@dbx-tools/appkit": "^0.9.
|
|
33
|
-
"@dbx-tools/appkit-mastra": "^0.9.
|
|
34
|
-
"@dbx-tools/core": "^0.9.
|
|
35
|
-
"@dbx-tools/lakebox": "^0.9.
|
|
36
|
-
"@dbx-tools/postgres": "^0.9.
|
|
37
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
38
|
-
"@dbx-tools/shared-lakebox": "^0.9.
|
|
39
|
-
"@dbx-tools/ui": "^0.9.
|
|
32
|
+
"@dbx-tools/appkit": "^0.9.165",
|
|
33
|
+
"@dbx-tools/appkit-mastra": "^0.9.165",
|
|
34
|
+
"@dbx-tools/core": "^0.9.165",
|
|
35
|
+
"@dbx-tools/lakebox": "^0.9.165",
|
|
36
|
+
"@dbx-tools/postgres": "^0.9.165",
|
|
37
|
+
"@dbx-tools/shared-core": "^0.9.165",
|
|
38
|
+
"@dbx-tools/shared-lakebox": "^0.9.165",
|
|
39
|
+
"@dbx-tools/ui": "^0.9.165",
|
|
40
40
|
"@mastra/core": "1.71.0",
|
|
41
41
|
"http-proxy-3": "^1.23.1",
|
|
42
42
|
"zod": "4.3.6"
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"./package.json": "./package.json"
|
|
56
56
|
}
|
|
57
57
|
},
|
|
58
|
-
"version": "0.9.
|
|
58
|
+
"version": "0.9.165",
|
|
59
59
|
"types": "./lib/index.d.ts",
|
|
60
60
|
"dbxToolsConfig": {
|
|
61
61
|
"tags": [
|
|
@@ -75,55 +75,6 @@ export class LakeboxResourceRegistry {
|
|
|
75
75
|
return pending;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
/**
|
|
79
|
-
* Replace one unreachable managed Lakebox. A replica that observes an already
|
|
80
|
-
* replaced ID returns it without locking; the advisory-lock recheck prevents
|
|
81
|
-
* concurrent replicas from creating multiple replacements.
|
|
82
|
-
*/
|
|
83
|
-
async recreate(
|
|
84
|
-
client: LakeboxResourceClient,
|
|
85
|
-
failedSandboxId: string,
|
|
86
|
-
signal?: AbortSignal,
|
|
87
|
-
): Promise<LakeboxEntry> {
|
|
88
|
-
const scope = await client.workspaceScope();
|
|
89
|
-
const current = await this.resolve(client, scope, signal);
|
|
90
|
-
if (current && current.sandboxId !== failedSandboxId) return current;
|
|
91
|
-
const pending = this.pending.get(scope);
|
|
92
|
-
if (pending) return pending;
|
|
93
|
-
const replacement = this.withLock(scope, async () => {
|
|
94
|
-
const rechecked = await this.resolve(client, scope, signal);
|
|
95
|
-
if (rechecked && rechecked.sandboxId !== failedSandboxId) return rechecked;
|
|
96
|
-
if (rechecked) {
|
|
97
|
-
try {
|
|
98
|
-
await client.delete(rechecked.sandboxId, signal);
|
|
99
|
-
} catch (error) {
|
|
100
|
-
throw new Error("Destroying the unreachable Lakebox failed", { cause: error });
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
await this.cache().delete(this.key(scope));
|
|
104
|
-
this.legacyChecked.add(scope);
|
|
105
|
-
let created: LakeboxEntry;
|
|
106
|
-
try {
|
|
107
|
-
created = await client.create(signal);
|
|
108
|
-
} catch (error) {
|
|
109
|
-
throw new Error("Creating a replacement Lakebox failed", { cause: error });
|
|
110
|
-
}
|
|
111
|
-
try {
|
|
112
|
-
await this.write(scope, created.sandboxId);
|
|
113
|
-
} catch (error) {
|
|
114
|
-
await client.delete(created.sandboxId, signal).catch(() => undefined);
|
|
115
|
-
throw error;
|
|
116
|
-
}
|
|
117
|
-
logger.warn("replaced unreachable app Lakebox", {
|
|
118
|
-
previousId: failedSandboxId,
|
|
119
|
-
replacementId: created.sandboxId,
|
|
120
|
-
});
|
|
121
|
-
return created;
|
|
122
|
-
}).finally(() => this.pending.delete(scope));
|
|
123
|
-
this.pending.set(scope, replacement);
|
|
124
|
-
return replacement;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
78
|
/** Clears the persisted pointer after the managed Lakebox is deleted. */
|
|
128
79
|
async clear(client: LakeboxResourceClient): Promise<void> {
|
|
129
80
|
const scope = await client.workspaceScope();
|
package/src/config.ts
CHANGED
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
import { basename } from "node:path";
|
|
2
2
|
import type { BasePluginConfig } from "@databricks/appkit";
|
|
3
|
-
import {
|
|
3
|
+
import { configUtils, string, ENV_ONLY, positiveInt, root } from "@dbx-tools/core";
|
|
4
4
|
import { Ssh2PatchModeSchema, SshTransportModeSchema } from "@dbx-tools/lakebox";
|
|
5
5
|
import { LAKEBOX_DEFAULT_ROUTE_PREFIX } from "@dbx-tools/shared-lakebox";
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
|
|
8
8
|
const APPLICATION_CONFIG_KEY = "LAKEBOX_APPLICATION";
|
|
9
9
|
const IDLE_TIMEOUT_CONFIG_KEY = "LAKEBOX_IDLE_TIMEOUT_SECONDS";
|
|
10
|
-
const DESTROY_AFTER_STARTUP_FAILURE_CONFIG_KEY = "LAKEBOX_DESTROY_AFTER_STARTUP_FAILURE_SECONDS";
|
|
11
10
|
const SSH_TRANSPORT_CONFIG_KEY = "LAKEBOX_SSH_TRANSPORT";
|
|
12
11
|
const SSH2_PATCH_CONFIG_KEY = "LAKEBOX_SSH_SSH2_PATCH";
|
|
13
12
|
|
|
14
|
-
/** Resolve an optional destructive startup-recovery timeout. */
|
|
15
|
-
function _destroyAfterStartupFailureSeconds(configured: unknown): false | number | undefined {
|
|
16
|
-
if (boolean(configured, DESTROY_AFTER_STARTUP_FAILURE_CONFIG_KEY) === false) return false;
|
|
17
|
-
const seconds = positiveInt(configured, DESTROY_AFTER_STARTUP_FAILURE_CONFIG_KEY, 0);
|
|
18
|
-
return seconds > 0 ? seconds : undefined;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
13
|
export const LakeboxPluginConfigSchema = z
|
|
22
14
|
.object({
|
|
23
15
|
auto: z
|
|
@@ -60,12 +52,6 @@ export const LakeboxPluginConfigSchema = z
|
|
|
60
52
|
.positive()
|
|
61
53
|
.default(30_000)
|
|
62
54
|
.describe("SSH connection timeout in milliseconds. Defaults to 30000."),
|
|
63
|
-
destroyAfterStartupFailureSeconds: z
|
|
64
|
-
.union([z.literal(false), z.number().int().min(5).max(600)])
|
|
65
|
-
.default(false)
|
|
66
|
-
.describe(
|
|
67
|
-
`Destroy and recreate the Lakebox when its SSH gateway remains unreachable for this many seconds, from 5 to 600. Defaults to false; configure with ${configUtils.name(DESTROY_AFTER_STARTUP_FAILURE_CONFIG_KEY)}.`,
|
|
68
|
-
),
|
|
69
55
|
commandTimeoutMs: z
|
|
70
56
|
.number()
|
|
71
57
|
.int()
|
|
@@ -125,7 +111,6 @@ export function resolveLakeboxPluginConfig(
|
|
|
125
111
|
streamConfig: _stream,
|
|
126
112
|
application,
|
|
127
113
|
idleTimeoutSeconds,
|
|
128
|
-
destroyAfterStartupFailureSeconds,
|
|
129
114
|
sshTransport,
|
|
130
115
|
ssh2Patch,
|
|
131
116
|
...serializable
|
|
@@ -137,9 +122,6 @@ export function resolveLakeboxPluginConfig(
|
|
|
137
122
|
string(undefined, "DATABRICKS_APP_NAME", ENV_ONLY) ??
|
|
138
123
|
basename(root() ?? process.cwd()),
|
|
139
124
|
idleTimeoutSeconds: positiveInt(idleTimeoutSeconds, IDLE_TIMEOUT_CONFIG_KEY, 3_600),
|
|
140
|
-
destroyAfterStartupFailureSeconds: _destroyAfterStartupFailureSeconds(
|
|
141
|
-
destroyAfterStartupFailureSeconds,
|
|
142
|
-
),
|
|
143
125
|
sshTransport: string(sshTransport, SSH_TRANSPORT_CONFIG_KEY),
|
|
144
126
|
ssh2Patch: string(ssh2Patch, SSH2_PATCH_CONFIG_KEY),
|
|
145
127
|
});
|
package/src/runtime.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import type { IncomingHttpHeaders } from "node:http";
|
|
3
|
-
import { ExecutionError } from "@databricks/appkit";
|
|
4
3
|
import { onParentTerminationSignal } from "@dbx-tools/core";
|
|
5
4
|
import {
|
|
6
5
|
SshKeyStore,
|
|
@@ -544,29 +543,10 @@ export class LakeboxRuntime {
|
|
|
544
543
|
}
|
|
545
544
|
entry = await ensureLakeboxRunning(this.client(), entry, operationSignal);
|
|
546
545
|
this.cached = { entry, at: Date.now() };
|
|
547
|
-
|
|
546
|
+
const key = this.bootKey(entry);
|
|
548
547
|
if (this.boot?.key === key) return this.boot;
|
|
549
548
|
await this.discardBoot();
|
|
550
|
-
|
|
551
|
-
try {
|
|
552
|
-
session = await this.connect(entry, operationSignal, this.startupTimeoutMs());
|
|
553
|
-
} catch (error) {
|
|
554
|
-
if (this.config.destroyAfterStartupFailureSeconds === false) throw error;
|
|
555
|
-
logger.warn("Lakebox SSH startup timed out; replacing the machine", {
|
|
556
|
-
id: entry.sandboxId,
|
|
557
|
-
timeoutSeconds: this.config.destroyAfterStartupFailureSeconds,
|
|
558
|
-
});
|
|
559
|
-
entry = await this.replaceUnreachable(entry, operationSignal);
|
|
560
|
-
key = this.bootKey(entry);
|
|
561
|
-
try {
|
|
562
|
-
session = await this.connect(entry, operationSignal, this.startupTimeoutMs());
|
|
563
|
-
} catch (replacementError) {
|
|
564
|
-
throw new ExecutionError("Replacement Lakebox SSH gateway did not become ready", {
|
|
565
|
-
cause: toError(replacementError),
|
|
566
|
-
clientMessage: "The replacement Lakebox also failed to start.",
|
|
567
|
-
});
|
|
568
|
-
}
|
|
569
|
-
}
|
|
549
|
+
const session = await this.connect(entry, operationSignal);
|
|
570
550
|
const boot: Boot = {
|
|
571
551
|
key,
|
|
572
552
|
entry,
|
|
@@ -591,45 +571,7 @@ export class LakeboxRuntime {
|
|
|
591
571
|
}
|
|
592
572
|
}
|
|
593
573
|
|
|
594
|
-
private
|
|
595
|
-
return this.config.destroyAfterStartupFailureSeconds === false
|
|
596
|
-
? SSH_READY_TIMEOUT_MS
|
|
597
|
-
: this.config.destroyAfterStartupFailureSeconds * 1_000;
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
private async replaceUnreachable(
|
|
601
|
-
entry: LakeboxEntry,
|
|
602
|
-
signal: AbortSignal,
|
|
603
|
-
): Promise<LakeboxEntry> {
|
|
604
|
-
let replacement: LakeboxEntry;
|
|
605
|
-
try {
|
|
606
|
-
replacement = await this.resources().recreate(this.client(), entry.sandboxId, signal);
|
|
607
|
-
} catch (error) {
|
|
608
|
-
const cause = toError(error);
|
|
609
|
-
throw new ExecutionError(`Could not destroy and replace Lakebox ${entry.sandboxId}`, {
|
|
610
|
-
cause,
|
|
611
|
-
clientMessage: cause.message,
|
|
612
|
-
});
|
|
613
|
-
}
|
|
614
|
-
this.cached = undefined;
|
|
615
|
-
this.readyBootKey = undefined;
|
|
616
|
-
if (lakeboxIdleTimeoutSeconds(replacement.idleTimeout) !== this.config.idleTimeoutSeconds) {
|
|
617
|
-
replacement = await this.client().setIdleTimeout(
|
|
618
|
-
replacement.sandboxId,
|
|
619
|
-
this.config.idleTimeoutSeconds,
|
|
620
|
-
signal,
|
|
621
|
-
);
|
|
622
|
-
}
|
|
623
|
-
replacement = await ensureLakeboxRunning(this.client(), replacement, signal);
|
|
624
|
-
this.cached = { entry: replacement, at: Date.now() };
|
|
625
|
-
return replacement;
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
private async connect(
|
|
629
|
-
entry: LakeboxEntry,
|
|
630
|
-
signal: AbortSignal,
|
|
631
|
-
timeoutMs: number,
|
|
632
|
-
): Promise<SshSession> {
|
|
574
|
+
private async connect(entry: LakeboxEntry, signal: AbortSignal): Promise<SshSession> {
|
|
633
575
|
const startedAt = Date.now();
|
|
634
576
|
let attempt = 0;
|
|
635
577
|
while (true) {
|
|
@@ -637,9 +579,10 @@ export class LakeboxRuntime {
|
|
|
637
579
|
return await this.connectOnce(entry, signal);
|
|
638
580
|
} catch (error) {
|
|
639
581
|
attempt += 1;
|
|
640
|
-
if (!_isTransientSshStartupError(error) || Date.now() - startedAt >=
|
|
582
|
+
if (!_isTransientSshStartupError(error) || Date.now() - startedAt >= SSH_READY_TIMEOUT_MS) {
|
|
641
583
|
throw error;
|
|
642
584
|
}
|
|
585
|
+
entry = await this.refreshSshEntry(entry, signal);
|
|
643
586
|
const delayMs = Math.min(
|
|
644
587
|
SSH_READY_RETRY_INITIAL_MS * 2 ** (attempt - 1),
|
|
645
588
|
SSH_READY_RETRY_MAX_MS,
|
|
@@ -653,6 +596,18 @@ export class LakeboxRuntime {
|
|
|
653
596
|
}
|
|
654
597
|
}
|
|
655
598
|
|
|
599
|
+
private async refreshSshEntry(entry: LakeboxEntry, signal: AbortSignal): Promise<LakeboxEntry> {
|
|
600
|
+
const refreshed = await this.client().get(entry.sandboxId, signal);
|
|
601
|
+
if (refreshed.gatewayHost !== entry.gatewayHost) {
|
|
602
|
+
logger.info("Lakebox SSH gateway address changed during startup", {
|
|
603
|
+
previousHost: entry.gatewayHost,
|
|
604
|
+
gatewayHost: refreshed.gatewayHost,
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
this.cached = { entry: refreshed, at: Date.now() };
|
|
608
|
+
return refreshed;
|
|
609
|
+
}
|
|
610
|
+
|
|
656
611
|
private waitForSshRetry(delayMs: number, signal: AbortSignal): Promise<void> {
|
|
657
612
|
return sleep(delayMs, signal);
|
|
658
613
|
}
|