@dbx-tools/appkit-mastra 0.9.118 → 0.9.119
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 +83 -76
- package/index.ts +3 -6
- package/lib/index.d.ts +3 -6
- package/lib/index.js +3 -5
- package/lib/src/agents.js +2 -2
- package/lib/src/config.d.ts +18 -15
- package/lib/src/config.js +4 -4
- package/lib/src/defaults.js +4 -4
- package/lib/src/genie.js +8 -8
- package/lib/src/plugin.js +2 -2
- package/lib/src/remote-skills.d.ts +32 -28
- package/lib/src/remote-skills.js +103 -29
- package/lib/src/workspaces.d.ts +4 -7
- package/lib/src/workspaces.js +55 -52
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -24
- package/src/agents.ts +1 -1
- package/src/config.ts +25 -18
- package/src/defaults.ts +3 -3
- package/src/genie.ts +9 -9
- package/src/plugin.ts +1 -1
- package/src/remote-skills.ts +158 -38
- package/src/workspaces.ts +58 -74
- package/lib/src/sandbox.d.ts +0 -107
- package/lib/src/sandbox.js +0 -461
- package/src/sandbox.ts +0 -556
package/lib/src/remote-skills.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* {@link AITOOLS_SOURCE} constant, a GitHub `owner/repo`, any git / GitLab URL,
|
|
6
6
|
* or a direct download URL - and optional per-source policy.
|
|
7
7
|
* {@link provisionRemoteSkills} materializes every source into a local
|
|
8
|
-
* `SKILL.md` tree at app boot and returns read-only
|
|
8
|
+
* `SKILL.md` tree at app boot and returns read-only filesystem backings plus
|
|
9
9
|
* their stable virtual workspace mounts.
|
|
10
10
|
*
|
|
11
11
|
* Resolution per source, in order:
|
|
@@ -26,25 +26,16 @@
|
|
|
26
26
|
* source (or the top-level call) sets `failOnError: false`, in which case it is
|
|
27
27
|
* logged and skipped so one bad source never takes the app down.
|
|
28
28
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* record travels WITH the tree rather than in process memory, so the reuse
|
|
35
|
-
* survives a restart - which is the only way it helps a Databricks App at all.
|
|
36
|
-
* Pass `refreshTtlMs: 0` to download on every boot.
|
|
29
|
+
* AI Tools uses the shared `@dbx-tools/cache` project cache with a one-day TTL,
|
|
30
|
+
* then hydrates one process-memory filesystem mounted at
|
|
31
|
+
* {@link AITOOLS_SKILLS_MOUNT} for every default workspace. Other sources keep
|
|
32
|
+
* a {@link METADATA_FILE} beside their provisioned tree and default to a
|
|
33
|
+
* seven-day refresh window. Pass `refreshTtlMs: 0` to download on every boot.
|
|
37
34
|
*
|
|
38
|
-
*
|
|
39
|
-
* (`/Workspace/.assistant/skills`)
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* instead. When no Databricks client is resolvable at startup - or the resolved
|
|
43
|
-
* identity cannot WRITE the destination, which is the normal case for a
|
|
44
|
-
* Databricks App service principal against the admin-owned shared tree (see
|
|
45
|
-
* {@link openWritableWorkspace}) - the tree is written under
|
|
46
|
-
* {@link localFS.tmpFS} and exposed through a stable read-only virtual mount
|
|
47
|
-
* for the current process. Storage location degrades; the skills themselves do not.
|
|
35
|
+
* For non-AI-Tools sources, the default destination is the Databricks workspace
|
|
36
|
+
* Assistant skills tree (`/Workspace/.assistant/skills`). Pass `userEmail` or
|
|
37
|
+
* `databricksBasePath` to select another destination. When it is unavailable,
|
|
38
|
+
* the tree is exposed through a stable read-only local mount instead.
|
|
48
39
|
*
|
|
49
40
|
* @module
|
|
50
41
|
*/
|
|
@@ -52,11 +43,13 @@ import { mkdir, readdir, readFile, rm, stat, writeFile } from "node:fs/promises"
|
|
|
52
43
|
import { createRequire } from "node:module";
|
|
53
44
|
import { dirname, join, posix } from "node:path";
|
|
54
45
|
import { appkit } from "@dbx-tools/appkit";
|
|
46
|
+
import { flushCache, getOrSet, projectCache } from "@dbx-tools/cache/cache";
|
|
55
47
|
import { exec } from "@dbx-tools/core";
|
|
56
48
|
import { DatabricksFileSystem, workspaceClient } from "@dbx-tools/databricks";
|
|
57
49
|
import { localFS } from "@dbx-tools/fs";
|
|
58
50
|
import { find } from "@dbx-tools/path";
|
|
59
51
|
import { asyncUtils, errorUtils, hash, json, log, net, object, stringUtils, } from "@dbx-tools/shared-core";
|
|
52
|
+
import { MemoryFileSystem } from "@dbx-tools/shared-fs";
|
|
60
53
|
import { ORGANIZATION_SKILLS_PATH, personalSkillsPath } from "./skill-paths.js";
|
|
61
54
|
const logger = log.logger("mastra/remote-skills");
|
|
62
55
|
/**
|
|
@@ -90,8 +83,14 @@ export const REMOTE_SKILLS_MOUNT = "/.skills";
|
|
|
90
83
|
const METADATA_FILE = ".metadata.json";
|
|
91
84
|
/** Shape marker for {@link METADATA_FILE}; an unknown version is ignored, not read. */
|
|
92
85
|
const METADATA_VERSION = 1;
|
|
93
|
-
/** How long a provisioned source is reused before being downloaded again. */
|
|
86
|
+
/** How long a general provisioned source is reused before being downloaded again. */
|
|
94
87
|
const DEFAULT_REFRESH_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
88
|
+
/** How long the shared Databricks AI Tools snapshot is reused. */
|
|
89
|
+
export const AITOOLS_REFRESH_TTL_MS = 24 * 60 * 60 * 1000;
|
|
90
|
+
const aiToolsCache = projectCache("mastra-aitools", {
|
|
91
|
+
ttl: AITOOLS_REFRESH_TTL_MS,
|
|
92
|
+
maxEntries: 32,
|
|
93
|
+
});
|
|
95
94
|
/* ------------------------------ AI Tools ------------------------------ */
|
|
96
95
|
/**
|
|
97
96
|
* Source constant selecting Databricks' own AI Tools skill set.
|
|
@@ -198,9 +197,11 @@ function remoteSourceIdentifier(source) {
|
|
|
198
197
|
const path = url.pathname.replace(/\.(git|md|zip|tar|tgz|gz)$/i, "");
|
|
199
198
|
return `${url.hostname}-${path}`;
|
|
200
199
|
}
|
|
201
|
-
/** The effective reuse window: per-source,
|
|
200
|
+
/** The effective reuse window: per-source, top-level, then the source default. */
|
|
202
201
|
function resolveRefreshTtl(sourceOptions, options) {
|
|
203
|
-
return sourceOptions.refreshTtlMs ??
|
|
202
|
+
return (sourceOptions.refreshTtlMs ??
|
|
203
|
+
options.refreshTtlMs ??
|
|
204
|
+
(isAiToolsSource(sourceOptions.source) ? AITOOLS_REFRESH_TTL_MS : DEFAULT_REFRESH_TTL_MS));
|
|
204
205
|
}
|
|
205
206
|
/**
|
|
206
207
|
* Read the metadata document at the root of a provisioned tree, or `undefined`
|
|
@@ -273,12 +274,15 @@ export async function provisionRemoteSkills(option) {
|
|
|
273
274
|
if (!options)
|
|
274
275
|
return empty;
|
|
275
276
|
const failDefault = options.failOnError !== false;
|
|
277
|
+
const sources = (Array.isArray(options.sources) ? options.sources : [options.sources]).map(toSourceOptions);
|
|
276
278
|
const client = options.client ?? appkit.tryGetExecutionContext()?.client;
|
|
277
279
|
// Probed rather than assumed: an identity that cannot write the workspace
|
|
278
280
|
// tree falls back to the local one instead of failing startup. The probe also
|
|
279
281
|
// creates the root, which the first cache READ needs - `copySkillDirs` would
|
|
280
282
|
// otherwise be the first thing to create it, which is too late.
|
|
281
|
-
const requestedBasePath =
|
|
283
|
+
const requestedBasePath = sources.some((source) => !isAiToolsSource(source.source))
|
|
284
|
+
? resolveDatabricksBasePath(options, client)
|
|
285
|
+
: undefined;
|
|
282
286
|
const destination = requestedBasePath
|
|
283
287
|
? await openWritableWorkspace(requestedBasePath, client)
|
|
284
288
|
: undefined;
|
|
@@ -287,15 +291,30 @@ export async function provisionRemoteSkills(option) {
|
|
|
287
291
|
const skillNames = [];
|
|
288
292
|
let staging;
|
|
289
293
|
try {
|
|
290
|
-
const
|
|
291
|
-
for (const entry of sources) {
|
|
292
|
-
const sourceOptions = toSourceOptions(entry);
|
|
294
|
+
for (const sourceOptions of sources) {
|
|
293
295
|
const failOnError = sourceOptions.failOnError ?? failDefault;
|
|
294
296
|
try {
|
|
295
297
|
// Where this source's bookkeeping lives: the shared Databricks tree, or
|
|
296
298
|
// the source's own stable local dir.
|
|
297
299
|
const key = cacheKey(sourceOptions);
|
|
298
300
|
const mountPath = localSkillMountPath(sourceOptions, key);
|
|
301
|
+
if (isAiToolsSource(sourceOptions.source)) {
|
|
302
|
+
staging ??= await initializedScratch("mastra-remote-skills");
|
|
303
|
+
const tree = await cachedAiToolsTree(sourceOptions, staging.root, options, key);
|
|
304
|
+
localSkillMounts.push({
|
|
305
|
+
filesystem: await memorySkillTree(tree.files, `aitools-${key}`),
|
|
306
|
+
mountPath,
|
|
307
|
+
});
|
|
308
|
+
skillNames.push(...tree.record.skills);
|
|
309
|
+
logger.info("remote skill ready", {
|
|
310
|
+
source: sourceOptions.source,
|
|
311
|
+
destination: mountPath,
|
|
312
|
+
downloadedAt: tree.record.downloadedAt,
|
|
313
|
+
skills: tree.record.skills,
|
|
314
|
+
cached: tree.cached,
|
|
315
|
+
});
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
299
318
|
const cacheFS = destination ?? localSkillsFS(key);
|
|
300
319
|
const metadata = await readMetadata(cacheFS);
|
|
301
320
|
const cached = metadata?.sources[key];
|
|
@@ -367,15 +386,70 @@ export async function provisionRemoteSkills(option) {
|
|
|
367
386
|
assertUniqueLocalSkillMounts(localSkillMounts);
|
|
368
387
|
return { localSkillMounts, databricksBasePath, skillNames };
|
|
369
388
|
}
|
|
389
|
+
async function cachedAiToolsTree(sourceOptions, stagingRoot, options, key) {
|
|
390
|
+
const ttl = resolveRefreshTtl(sourceOptions, options);
|
|
391
|
+
let loaded = false;
|
|
392
|
+
const load = async () => {
|
|
393
|
+
loaded = true;
|
|
394
|
+
const stagedDir = await stageAiTools(sourceOptions, join(stagingRoot, `aitools-${hash.id()}`), options);
|
|
395
|
+
const staged = await collectSkillDirs(stagedDir);
|
|
396
|
+
if (staged.length === 0) {
|
|
397
|
+
throw new Error(`no SKILL.md found for source "${sourceOptions.source}"`);
|
|
398
|
+
}
|
|
399
|
+
const policy = cachePolicy(sourceOptions);
|
|
400
|
+
return {
|
|
401
|
+
files: await serializeSkillDirs(staged),
|
|
402
|
+
record: {
|
|
403
|
+
source: sourceOptions.source,
|
|
404
|
+
downloadedAt: new Date().toISOString(),
|
|
405
|
+
skills: staged.map((dir) => dir.name),
|
|
406
|
+
...(policy ? { policy } : {}),
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
};
|
|
410
|
+
const tree = ttl <= 0
|
|
411
|
+
? await load()
|
|
412
|
+
: await getOrSet(aiToolsCache, key, load, {
|
|
413
|
+
ttl,
|
|
414
|
+
throwErrors: true,
|
|
415
|
+
});
|
|
416
|
+
if (!tree)
|
|
417
|
+
throw new Error(`AI Tools cache returned no tree for ${key}`);
|
|
418
|
+
await flushCache(aiToolsCache);
|
|
419
|
+
return { ...tree, cached: !loaded };
|
|
420
|
+
}
|
|
421
|
+
async function serializeSkillDirs(dirs) {
|
|
422
|
+
const files = [];
|
|
423
|
+
for (const dir of dirs) {
|
|
424
|
+
for (const relative of find.findFiles("**/*", { cwd: dir.absolutePath, nodir: true })) {
|
|
425
|
+
files.push({
|
|
426
|
+
path: posix.join(dir.name, relative.split(/[\\/]/).join("/")),
|
|
427
|
+
content: (await readFile(join(dir.absolutePath, relative))).toString("base64"),
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return files;
|
|
432
|
+
}
|
|
433
|
+
async function memorySkillTree(files, id) {
|
|
434
|
+
const filesystem = new MemoryFileSystem({ id, root: "/" });
|
|
435
|
+
await filesystem.init();
|
|
436
|
+
for (const file of files) {
|
|
437
|
+
await filesystem.writeFile(file.path, Buffer.from(file.content, "base64"), {
|
|
438
|
+
overwrite: true,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
return filesystem;
|
|
442
|
+
}
|
|
370
443
|
/** Fail before workspace composition when two sources claim one virtual mount. */
|
|
371
444
|
function assertUniqueLocalSkillMounts(mounts) {
|
|
372
445
|
const rootsByMount = new Map();
|
|
373
446
|
for (const mount of mounts) {
|
|
447
|
+
const identity = "root" in mount ? mount.root : mount.filesystem.id;
|
|
374
448
|
const previousRoot = rootsByMount.get(mount.mountPath);
|
|
375
|
-
if (previousRoot && previousRoot !==
|
|
449
|
+
if (previousRoot && previousRoot !== identity) {
|
|
376
450
|
throw new Error(`multiple remote skill sources resolve to virtual mount "${mount.mountPath}"; give each source a unique name`);
|
|
377
451
|
}
|
|
378
|
-
rootsByMount.set(mount.mountPath,
|
|
452
|
+
rootsByMount.set(mount.mountPath, identity);
|
|
379
453
|
}
|
|
380
454
|
}
|
|
381
455
|
/** Remove directories dropped by one source unless another source still owns them. */
|
|
@@ -668,4 +742,4 @@ async function pathExists(path) {
|
|
|
668
742
|
return false;
|
|
669
743
|
}
|
|
670
744
|
}
|
|
671
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaURHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLE9BQU8sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILEdBQUcsRUFDSCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFJaEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEYsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRWxEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDO0FBRXJDLCtFQUErRTtBQUMvRSxNQUFN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U0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YXJ0dXAgcHJvdmlzaW9uaW5nIG9mIHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIGZvciBhIE1hc3RyYSB3b3Jrc3BhY2UuXG4gKlxuICogQSB7QGxpbmsgUmVtb3RlU2tpbGxTb3VyY2V9IG5hbWVzIFdIRVJFIGEgYFNLSUxMLm1kYCB0cmVlIGNvbWVzIGZyb20gLSB0aGVcbiAqIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgR2l0SHViIGBvd25lci9yZXBvYCwgYW55IGdpdCAvIEdpdExhYiBVUkwsXG4gKiBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgLSBhbmQgb3B0aW9uYWwgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKiB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSBtYXRlcmlhbGl6ZXMgZXZlcnkgc291cmNlIGludG8gYSBsb2NhbFxuICogYFNLSUxMLm1kYCB0cmVlIGF0IGFwcCBib290IGFuZCByZXR1cm5zIHJlYWQtb25seSBiYWNraW5nIGRpcmVjdG9yaWVzIHBsdXNcbiAqIHRoZWlyIHN0YWJsZSB2aXJ0dWFsIHdvcmtzcGFjZSBtb3VudHMuXG4gKlxuICogUmVzb2x1dGlvbiBwZXIgc291cmNlLCBpbiBvcmRlcjpcbiAqXG4gKiAxLiB0aGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBjb25zdGFudCAoYFwiYWl0b29sc1wiYCk6IERhdGFicmlja3MnIG93biBza2lsbFxuICogICAgc2V0LCByZWFkIHN0cmFpZ2h0IGZyb20gdGhlIHB1YmxpYyByZXBvIHRoZSBgZGF0YWJyaWNrcyBhaXRvb2xzYCBDTElcbiAqICAgIHNvdXJjZXMgZnJvbS4gTm8gQ0xJLCBubyBEYXRhYnJpY2tzIGF1dGggLSB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHVzYWJsZVxuICogICAgaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyLCB3aGVyZSB0aGUgQ0xJIGlzIG5vdCBpbnN0YWxsZWQ7XG4gKiAyLiB0aGUgT1BUSU9OQUwgYHNraWxsc2AgbnBtIENMSSAocGVlciBkZXApOiBpZiBpbnN0YWxsZWQsIGVhY2ggc291cmNlIGlzXG4gKiAgICBjb3BpZWQgaW50byBhIHN0YWdpbmcgZGlyIHdpdGggYHNraWxscyBhZGQgPHNvdXJjZT4gLS1hZ2VudCA8ZGlyPiAtLWNvcHlgLFxuICogICAgd2hpY2ggdW5kZXJzdGFuZHMgZXZlcnkgc291cmNlIGZvcm1hdCB0aGUgZWNvc3lzdGVtIGRvZXMgKEdpdEh1YlxuICogICAgc2hvcnRoYW5kLCBnaXQgVVJMcywgYXJjaGl2ZS9kb3dubG9hZCBVUkxzKTtcbiAqIDMuIG90aGVyd2lzZSBhIHBsYWluIHtAbGluayBmZXRjaH0gb2YgdGhlIHNvdXJjZSBVUkwgKGJ1aWx0IHdpdGhcbiAqICAgIHtAbGluayBuZXQudXJsQnVpbGRlcn0pLCB3cml0aW5nIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdG8gYSBzdGFnaW5nXG4gKiAgICBkaXIuXG4gKlxuICogQSBzb3VyY2UgdGhhdCByZXNvbHZlcyB0aHJvdWdoIG5laXRoZXIgcGF0aCBmYWlscyBhcHAgc3RhcnR1cCwgdW5sZXNzIHRoZVxuICogc291cmNlIChvciB0aGUgdG9wLWxldmVsIGNhbGwpIHNldHMgYGZhaWxPbkVycm9yOiBmYWxzZWAsIGluIHdoaWNoIGNhc2UgaXQgaXNcbiAqIGxvZ2dlZCBhbmQgc2tpcHBlZCBzbyBvbmUgYmFkIHNvdXJjZSBuZXZlciB0YWtlcyB0aGUgYXBwIGRvd24uXG4gKlxuICogRXZlcnkgcHJvdmlzaW9uZWQgdHJlZSBjYXJyaWVzIGEge0BsaW5rIE1FVEFEQVRBX0ZJTEV9IHJlY29yZGluZyB3aGVuIGVhY2hcbiAqIHNvdXJjZSB3YXMgbGFzdCBkb3dubG9hZGVkLCBhbmQgYSBzb3VyY2UgaXMgb25seSByZS1kb3dubG9hZGVkIG9uY2UgdGhhdFxuICogcmVjb3JkIGlzIG9sZGVyIHRoYW4ge0BsaW5rIERFRkFVTFRfUkVGUkVTSF9UVExfTVN9IChzZXZlbiBkYXlzKS4gVGhpcyBydW5zIGF0IGFwcFxuICogQk9PVCwgc28gd2l0aG91dCBpdCBhIGNvbnRhaW5lciB0aGF0IHJlc3RhcnRzIGEgZG96ZW4gdGltZXMgYW4gaG91ciByZS1wdWxsc1xuICogdGhlIHdob2xlIEFJIFRvb2xzIHNldCBhIGRvemVuIHRpbWVzIGZvciBjb250ZW50IHRoYXQgY2hhbmdlcyByYXJlbHkuIFRoZVxuICogcmVjb3JkIHRyYXZlbHMgV0lUSCB0aGUgdHJlZSByYXRoZXIgdGhhbiBpbiBwcm9jZXNzIG1lbW9yeSwgc28gdGhlIHJldXNlXG4gKiBzdXJ2aXZlcyBhIHJlc3RhcnQgLSB3aGljaCBpcyB0aGUgb25seSB3YXkgaXQgaGVscHMgYSBEYXRhYnJpY2tzIEFwcCBhdCBhbGwuXG4gKiBQYXNzIGByZWZyZXNoVHRsTXM6IDBgIHRvIGRvd25sb2FkIG9uIGV2ZXJ5IGJvb3QuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZVxuICogKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCksIHNvIHByb3Zpc2lvbmVkIHNraWxscyBwZXJzaXN0IGFjcm9zcyByZXN0YXJ0cyBhbmQgYXJlXG4gKiBkaXNjb3ZlcmVkIGJ5IHRoZSBidWlsdC1pbiBBc3Npc3RhbnQtc2tpbGxzIG1vdW50LiBQYXNzIGB1c2VyRW1haWxgIChvciBhblxuICogZXhwbGljaXQgYGRhdGFicmlja3NCYXNlUGF0aGApIHRvIHRhcmdldCBgL1dvcmtzcGFjZS9Vc2Vycy88ZW1haWw+Ly5hc3Npc3RhbnQvc2tpbGxzYFxuICogaW5zdGVhZC4gV2hlbiBubyBEYXRhYnJpY2tzIGNsaWVudCBpcyByZXNvbHZhYmxlIGF0IHN0YXJ0dXAgLSBvciB0aGUgcmVzb2x2ZWRcbiAqIGlkZW50aXR5IGNhbm5vdCBXUklURSB0aGUgZGVzdGluYXRpb24sIHdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgYVxuICogRGF0YWJyaWNrcyBBcHAgc2VydmljZSBwcmluY2lwYWwgYWdhaW5zdCB0aGUgYWRtaW4tb3duZWQgc2hhcmVkIHRyZWUgKHNlZVxuICoge0BsaW5rIG9wZW5Xcml0YWJsZVdvcmtzcGFjZX0pIC0gdGhlIHRyZWUgaXMgd3JpdHRlbiB1bmRlclxuICoge0BsaW5rIGxvY2FsRlMudG1wRlN9IGFuZCBleHBvc2VkIHRocm91Z2ggYSBzdGFibGUgcmVhZC1vbmx5IHZpcnR1YWwgbW91bnRcbiAqIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLiBTdG9yYWdlIGxvY2F0aW9uIGRlZ3JhZGVzOyB0aGUgc2tpbGxzIHRoZW1zZWx2ZXMgZG8gbm90LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzdGF0LCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcG9zaXggfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0sIHdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmltcG9ydCB7IGxvY2FsRlMsIHR5cGUgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGZpbmQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQge1xuICBhc3luY1V0aWxzLFxuICBlcnJvclV0aWxzLFxuICBoYXNoLFxuICBqc29uLFxuICBsb2csXG4gIG5ldCxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgT25lT3JNYW55IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5pbXBvcnQgeyBPUkdBTklaQVRJT05fU0tJTExTX1BBVEgsIHBlcnNvbmFsU2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvcmVtb3RlLXNraWxsc1wiKTtcblxuLyoqXG4gKiBBZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuXG4gKlxuICogYHVuaXZlcnNhbGAgaXMgdGhlIENMSSdzIG93biBuYW1lIGZvciBcIm5vIHBhcnRpY3VsYXIgYWdlbnQsIGp1c3QgdGhlIHBsYWluXG4gKiB0cmVlXCIsIHdoaWNoIGlzIHdoYXQgdGhpcyBtb2R1bGUgd2FudHMgLSBpdCByZS1ob3N0cyB0aGUgcmVzdWx0IGl0c2VsZi4gVGhlXG4gKiBpZCBtdXN0IGJlIG9uZSB0aGUgaW5zdGFsbGVkIENMSSBrbm93czogYW4gdW5yZWNvZ25pemVkIG9uZSBpcyByZWplY3RlZFxuICogb3V0cmlnaHQgKGBJbnZhbGlkIGFnZW50czogLi4uYCksIHRha2luZyBldmVyeSBub24tYGFpdG9vbHNgIHNvdXJjZSBkb3duIHdpdGhcbiAqIGl0LCBzaW5jZSBhIENMSSBmYWlsdXJlIGlzIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgZmFsbC10aHJvdWdoIHRvXG4gKiB7QGxpbmsgc3RhZ2VWaWFGZXRjaH0uXG4gKi9cbmNvbnN0IFNLSUxMU19DTElfQUdFTlQgPSBcInVuaXZlcnNhbFwiO1xuXG4vKiogV2hlcmUgdGhlIGBza2lsbHNgIENMSSBkcm9wcyBhIHBsYWluIGBTS0lMTC5tZGAgdHJlZSB1bmRlciBhIHRhcmdldCBkaXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0xBWU9VVCA9IFtcIi5hZ2VudHNcIiwgXCJza2lsbHNcIl0gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgYm9keSwgbWF0Y2hpbmcgdGhlIGBza2lsbHNgIENMSSBkZWZhdWx0LiAqL1xuY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogTWF4aW11bSB0aW1lIG9uZSByZW1vdGUgZmlsZSBkb3dubG9hZCBtYXkgYmxvY2sgc3RhcnR1cC4gKi9cbmNvbnN0IERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIFN0YWJsZSB0ZW1wIGRpcmVjdG9yeSBob2xkaW5nIG9uZSByZWJ1aWx0IHNraWxsIHRyZWUgcGVyIHJlbW90ZSBzb3VyY2UuICovXG5jb25zdCBMT0NBTF9TS0lMTFNfRElSID0gXCJtYXN0cmEtbG9jYWwtc2tpbGxzXCI7XG5cbi8qKiBWaXJ0dWFsIHdvcmtzcGFjZSBwYXRoIHJlc2VydmVkIGZvciBsb2NhbGx5IHByb3Zpc2lvbmVkIERhdGFicmlja3MgQUkgVG9vbHMuICovXG5leHBvcnQgY29uc3QgQUlUT09MU19TS0lMTFNfTU9VTlQgPSBcIi8uZGF0YWJyaWNrcy9za2lsbHNcIjtcblxuLyoqIFZpcnR1YWwgd29ya3NwYWNlIHJvb3QgZm9yIGV2ZXJ5IG90aGVyIGxvY2FsbHkgcHJvdmlzaW9uZWQgcmVtb3RlIHNvdXJjZS4gKi9cbmV4cG9ydCBjb25zdCBSRU1PVEVfU0tJTExTX01PVU5UID0gXCIvLnNraWxsc1wiO1xuXG4vKipcbiAqIEJvb2trZWVwaW5nIGZpbGUgd3JpdHRlbiBhdCB0aGUgcm9vdCBvZiBldmVyeSBwcm92aXNpb25lZCBza2lsbCB0cmVlLCBuYW1pbmdcbiAqIHdoZW4gZWFjaCBzb3VyY2Ugd2FzIGxhc3QgZG93bmxvYWRlZC4gQSBkb3RmaWxlIHNvIHRoZSBza2lsbCBzY2FubmVycywgd2hpY2hcbiAqIGxvb2sgZm9yIGA8ZGlyPi9TS0lMTC5tZGAsIG5ldmVyIG1pc3Rha2UgaXQgZm9yIGEgc2tpbGwuXG4gKi9cbmNvbnN0IE1FVEFEQVRBX0ZJTEUgPSBcIi5tZXRhZGF0YS5qc29uXCI7XG5cbi8qKiBTaGFwZSBtYXJrZXIgZm9yIHtAbGluayBNRVRBREFUQV9GSUxFfTsgYW4gdW5rbm93biB2ZXJzaW9uIGlzIGlnbm9yZWQsIG5vdCByZWFkLiAqL1xuY29uc3QgTUVUQURBVEFfVkVSU0lPTiA9IDE7XG5cbi8qKiBIb3cgbG9uZyBhIHByb3Zpc2lvbmVkIHNvdXJjZSBpcyByZXVzZWQgYmVmb3JlIGJlaW5nIGRvd25sb2FkZWQgYWdhaW4uICovXG5jb25zdCBERUZBVUxUX1JFRlJFU0hfVFRMX01TID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBSSBUb29scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTb3VyY2UgY29uc3RhbnQgc2VsZWN0aW5nIERhdGFicmlja3MnIG93biBBSSBUb29scyBza2lsbCBzZXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIG1hc3RyYSh7IHJlbW90ZVNraWxsczogXCJhaXRvb2xzXCIgfSk7XG4gKi9cbmV4cG9ydCBjb25zdCBBSVRPT0xTX1NPVVJDRSA9IFwiYWl0b29sc1wiO1xuXG4vKiogVGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gbGl0ZXJhbCwgZm9yIGNhbGxlcnMgc3BlbGxpbmcgdGhlIHVuaW9uIG91dC4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbHNTb3VyY2UgPSB0eXBlb2YgQUlUT09MU19TT1VSQ0U7XG5cbi8qKlxuICogVGhlIFBVQkxJQyByZXBvIGBkYXRhYnJpY2tzIGFpdG9vbHMgaW5zdGFsbGAgc291cmNlcyBmcm9tLiBSZWFkaW5nIGl0XG4gKiBkaXJlY3RseSBpcyB3aGF0IGxldHMgYW4gYXBwIGdldCB0aGUgc2FtZSBza2lsbHMgdGhlIENMSSBpbnN0YWxscyB3aXRob3V0XG4gKiB0aGUgQ0xJIC0gd2hpY2ggYSBEYXRhYnJpY2tzIEFwcCBjb250YWluZXIgZG9lcyBub3Qgc2hpcC5cbiAqL1xuY29uc3QgQUlUT09MU19SRVBPID0gXCJkYXRhYnJpY2tzL2RhdGFicmlja3MtYWdlbnQtc2tpbGxzXCI7XG5cbi8qKiBSZXBvIHJlZiB0aGUgc2tpbGxzIGFyZSByZWFkIGZyb20uIE92ZXJyaWRlIHBlciBzb3VyY2Ugd2l0aCBgcmVmYC4gKi9cbmNvbnN0IEFJVE9PTFNfUkVGID0gXCJtYWluXCI7XG5cbi8qKiBTa2lsbCBmaWxlcyBkb3dubG9hZGVkIGF0IG9uY2U7IHRoZSBzZXQgaXMgfjMwIHNraWxscyBvZiBhIGZldyBmaWxlcyBlYWNoLiAqL1xuY29uc3QgQUlUT09MU19DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIHRoZSByZXBvJ3MgZ2VuZXJhdGVkIGBtYW5pZmVzdC5qc29uYCB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBBaVRvb2xzTWFuaWZlc3Qge1xuICBza2lsbHM/OiBSZWNvcmQ8c3RyaW5nLCB7IGZpbGVzPzogc3RyaW5nW107IHJlcG9fZGlyPzogc3RyaW5nIH0+O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSByZW1vdGUgc2tpbGwgc291cmNlIGFuZCBpdHMgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYHNvdXJjZWAgaXMge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBvciBhbnl0aGluZyB0aGUgYHNraWxsc2AgZWNvc3lzdGVtXG4gKiB1bmRlcnN0YW5kczogYSBHaXRIdWIgYG93bmVyL3JlcG9gIHNob3J0aGFuZCwgYSBmdWxsIEdpdEh1YiAvIEdpdExhYiAvIGdpdFxuICogVVJMLCBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgdG8gYSBgU0tJTEwubWRgIG9yIGFyY2hpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zIHtcbiAgLyoqIGBcImFpdG9vbHNcImAsIGEgR2l0SHViIHNob3J0aGFuZCwgYSBnaXQgLyBHaXRMYWIgVVJMLCBvciBhIGRvd25sb2FkIFVSTC4gKi9cbiAgc291cmNlOiBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2U7XG4gIC8qKiBTdGFibGUgdmlydHVhbCBtb3VudCBuYW1lIHVuZGVyIGAvLnNraWxsc2A7IGdlbmVyYXRlZCBmcm9tIHRoZSBzb3VyY2Ugd2hlbiBvbWl0dGVkLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogSW5zdGFsbCBvbmx5IHRoZXNlIHNraWxsIG5hbWVzIGZyb20gdGhlIHNvdXJjZS4gKi9cbiAgc2tpbGxzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBJbmNsdWRlIGV4cGVyaW1lbnRhbCBza2lsbHMuIGBcImFpdG9vbHNcImAgb25seS4gKi9cbiAgZXhwZXJpbWVudGFsPzogYm9vbGVhbjtcbiAgLyoqIFBpbiB0aGUgcmVwbyByZWYgKHRhZyAvIGJyYW5jaCAvIHNoYSkuIGBcImFpdG9vbHNcImAgb25seTsgZGVmYXVsdHMgdG8gYG1haW5gLiAqL1xuICByZWY/OiBzdHJpbmc7XG4gIC8qKiBPdmVycmlkZSB0aGUgYnl0ZSBjZWlsaW5nIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkIGZvciB0aGlzIHNvdXJjZS4gKi9cbiAgbWF4RG93bmxvYWRCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoaXMgc291cmNlJ3MgcHJvdmlzaW9uZWQgdHJlZSBpcyByZXVzZWQgYmVmb3JlIGl0IGlzIGRvd25sb2FkZWRcbiAgICogYWdhaW4sIGluIG1pbGxpc2Vjb25kcy4gT3ZlcnJpZGVzIHRoZSB0b3AtbGV2ZWxcbiAgICoge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMucmVmcmVzaFR0bE1zfTsgYDBgIHJlLWRvd25sb2FkcyBvblxuICAgKiBldmVyeSBib290LlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiBgZmFsc2VgLCBhIHNvdXJjZSB0aGF0IGZhaWxzIHRvIHJlc29sdmUgaXMgbG9nZ2VkIGFuZCBza2lwcGVkIGluc3RlYWRcbiAgICogb2YgZmFpbGluZyBhcHAgc3RhcnR1cC4gT3ZlcnJpZGVzIHRoZSB0b3AtbGV2ZWwge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMuZmFpbE9uRXJyb3J9LlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgcmVtb3RlIHNraWxsIHNvdXJjZTogdGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgVVJMLWxpa2VcbiAqIChzdHJpbmcgLyBgVVJMYCAvIGB7IHVybCB9YCksIG9yIGEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlT3B0aW9uc30gYmFnIHdpdGhcbiAqIHBlci1zb3VyY2UgcG9saWN5LlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbFNvdXJjZSA9IG5ldC5VcmxMaWtlIHwgQWlUb29sc1NvdXJjZSB8IFJlbW90ZVNraWxsU291cmNlT3B0aW9ucztcblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlIGByZW1vdGVTa2lsbHNgIG9wdGlvbjogb25lIHNvdXJjZSwgYSBub24tZW1wdHkgbGlzdCBvZiB0aGVtLCBvclxuICogYSB7QGxpbmsgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9uc30gYmFnIHdoZW4gdG9wLWxldmVsIHBvbGljeSBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbW90ZVNraWxsc09wdGlvbiA9XG4gIFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPiB8IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnM7XG5cbi8qKiBBIHNvdXJjZSBlbnRyeSB3aXRoIGl0cyBgc291cmNlYCBmbGF0dGVuZWQgdG8gYSBwbGFpbiBzdHJpbmcuICovXG50eXBlIE5vcm1hbGl6ZWRTb3VyY2UgPSBPbWl0PFJlbW90ZVNraWxsU291cmNlT3B0aW9ucywgXCJzb3VyY2VcIj4gJiB7IHNvdXJjZTogc3RyaW5nIH07XG5cbi8qKiBSZWFkLW9ubHkgbG9jYWwgYmFja2luZyBzdG9yYWdlIGV4cG9zZWQgYXQgYSBzdGFibGUgdmlydHVhbCB3b3Jrc3BhY2UgcGF0aC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxTa2lsbE1vdW50IHtcbiAgLyoqIFBoeXNpY2FsIGxvY2FsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcm92aXNpb25lZCBgU0tJTEwubWRgIHRyZWUuICovXG4gIHJvb3Q6IHN0cmluZztcbiAgLyoqIFZpcnR1YWwgcGF0aCBhZ2VudHMgc2VlIGluc2lkZSB0aGUgY29tcG9zZWQgTWFzdHJhIHdvcmtzcGFjZS4gKi9cbiAgbW91bnRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKiBUb3AtbGV2ZWwgcmVtb3RlLXNraWxscyBwcm92aXNpb25pbmcgb3B0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB7XG4gIC8qKiBTb3VyY2VzIHRvIG1hdGVyaWFsaXplIGF0IHN0YXJ0dXAuICovXG4gIHNvdXJjZXM6IFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPjtcbiAgLyoqXG4gICAqIEZhaWwgYXBwIHN0YXJ0dXAgd2hlbiBhIHNvdXJjZSBjYW4ndCBiZSByZXNvbHZlZC4gRGVmYXVsdHMgdG8gYHRydWVgLiBBXG4gICAqIHBlci1zb3VyY2UgYGZhaWxPbkVycm9yYCB3aW5zIG92ZXIgdGhpcy5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFic29sdXRlIERhdGFicmlja3MgcGF0aCB0aGF0IHJvb3RzIHRoZSBkZXN0aW5hdGlvbiBBc3Npc3RhbnQgc2tpbGxzIHRyZWUuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBPQk8gdXNlcidzIGAvV29ya3NwYWNlL1VzZXJzLzxlbWFpbD4vLmFzc2lzdGFudC9za2lsbHNgLlxuICAgKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKiogQXV0aC1zY29wZWQgRGF0YWJyaWNrcyBjbGllbnQuIERlZmF1bHRzIHRvIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQuICovXG4gIGNsaWVudD86IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIC8qKiBVc2VyIGVtYWlsIHVzZWQgdG8gZGVyaXZlIHRoZSBkZWZhdWx0IERhdGFicmlja3MgZGVzdGluYXRpb24uICovXG4gIHVzZXJFbWFpbD86IHN0cmluZztcbiAgLyoqIEJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZC4gRGVmYXVsdHMgdG8gMTAgTWlCLiAqL1xuICBtYXhEb3dubG9hZEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogSG93IGxvbmcgYSBwcm92aXNpb25lZCB0cmVlIGlzIHJldXNlZCBiZWZvcmUgaXRzIHNvdXJjZSBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIHNldmVuIGRheXM7IGAwYCByZS1kb3dubG9hZHMgb24gZXZlcnlcbiAgICogYm9vdC4gQSBwZXItc291cmNlIGByZWZyZXNoVHRsTXNgIHdpbnMgb3ZlciB0aGlzLlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSByZXNvbHZlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMge1xuICAvKipcbiAgICogRXh0cmEgcmVhZC1vbmx5IExPQ0FMIHNraWxsIG1vdW50cyB0byBoYW5kIE1hc3RyYSB3aGVuIGEgc291cmNlIGNvdWxkbid0XG4gICAqIGJlIHdyaXR0ZW4gdG8gRGF0YWJyaWNrcy4gUGh5c2ljYWwgdGVtcC9jYWNoZSBwYXRocyByZW1haW4gaGlkZGVuIGJlaGluZFxuICAgKiBzdGFibGUgdmlydHVhbCB3b3Jrc3BhY2UgcGF0aHMuXG4gICAqL1xuICBsb2NhbFNraWxsTW91bnRzOiBMb2NhbFNraWxsTW91bnRbXTtcbiAgLyoqIEFic29sdXRlIERhdGFicmlja3MgZGVzdGluYXRpb24gZWFjaCBzb3VyY2Ugd2FzIHdyaXR0ZW4gdG8sIGlmIGFueS4gKi9cbiAgZGF0YWJyaWNrc0Jhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogTmFtZXMgb2YgZXZlcnkgc2tpbGwgZGlyZWN0b3J5IG5vdyBhdmFpbGFibGUsIHdoZXRoZXIgaXQgd2FzIGRvd25sb2FkZWQgb25cbiAgICogdGhpcyBib290IG9yIHJldXNlZCBmcm9tIGEgc3RpbGwtZnJlc2ggdHJlZSAoc2VlIHtAbGluayBNRVRBREFUQV9GSUxFfSkuXG4gICAqL1xuICBza2lsbE5hbWVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBXaGF0IG9uZSBzb3VyY2UncyBsYXN0IGRvd25sb2FkIGxlZnQgYmVoaW5kLCBhcyByZWNvcmRlZCBpblxuICoge0BsaW5rIE1FVEFEQVRBX0ZJTEV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsQ2FjaGVFbnRyeSB7XG4gIC8qKiBUaGUgc291cmNlIHN0cmluZyB0aGlzIGVudHJ5IHdhcyBkb3dubG9hZGVkIGZyb20sIGZvciByZWFkYWJpbGl0eS4gKi9cbiAgc291cmNlOiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRoZSBkb3dubG9hZCBjb21wbGV0ZWQsIElTTy04NjAxLiAqL1xuICBkb3dubG9hZGVkQXQ6IHN0cmluZztcbiAgLyoqIFNraWxsIGRpcmVjdG9yeSBuYW1lcyB0aGUgZG93bmxvYWQgcHJvZHVjZWQuICovXG4gIHNraWxsczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgY29udGVudC1hZmZlY3RpbmcgcG9saWN5IHRoYXQgZG93bmxvYWQgdXNlZC4gQWxzbyBmb2xkZWQgaW50byB0aGUgZW50cnlcbiAgICogS0VZLCBzbyBuYXJyb3dpbmcgYHNraWxsc2Agb3IgbW92aW5nIGByZWZgIG1pc3NlcyB0aGUgY2FjaGUgaW5zdGVhZCBvZlxuICAgKiBzaWxlbnRseSBzZXJ2aW5nIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gICAqL1xuICBwb2xpY3k/OiB7IHNraWxscz86IHN0cmluZ1tdOyBleHBlcmltZW50YWw/OiBib29sZWFuOyByZWY/OiBzdHJpbmcgfTtcbn1cblxuLyoqIFRoZSB7QGxpbmsgTUVUQURBVEFfRklMRX0gZG9jdW1lbnQ6IG9uZSBlbnRyeSBwZXIgcHJvdmlzaW9uZWQgc291cmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbHNNZXRhZGF0YSB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgc291cmNlczogUmVjb3JkPHN0cmluZywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5Pjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE5vcm1hbGl6ZSB0aGUgYHJlbW90ZVNraWxsc2Agb3B0aW9uIGludG8gYSBmbGF0IG9wdGlvbnMgYmFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlbW90ZVNraWxsc09wdGlvbihcbiAgb3B0aW9uOiBSZW1vdGVTa2lsbHNPcHRpb24gfCB1bmRlZmluZWQsXG4pOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9wdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBiYWcgPSBpc1Byb3Zpc2lvbk9wdGlvbnMob3B0aW9uKSA/IG9wdGlvbiA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc291cmNlcyA9IHRvU291cmNlTGlzdChiYWcgPyBiYWcuc291cmNlcyA6IChvcHRpb24gYXMgUmVtb3RlU2tpbGxTb3VyY2UpKTtcbiAgLy8gQW4gZW1wdHkgbGlzdCBpcyB0aGUgc2FtZSBhcyBubyBjb25maWd1cmF0aW9uIGF0IGFsbC5cbiAgaWYgKCFvYmplY3QuaXNPbmVPck1hbnkoc291cmNlcykpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7IC4uLmJhZywgc291cmNlcyB9O1xufVxuXG4vKiogQSBgc291cmNlc2AtYmVhcmluZyBiYWcgaXMgdGhlIHRvcC1sZXZlbCBvcHRpb25zIHNoYXBlLCBub3QgYSBzaW5nbGUgc291cmNlLiAqL1xuZnVuY3Rpb24gaXNQcm92aXNpb25PcHRpb25zKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB7XG4gIHJldHVybiBvYmplY3QuaXNSZWNvcmQodmFsdWUpICYmIFwic291cmNlc1wiIGluIHZhbHVlO1xufVxuXG4vKiogT25lIHNvdXJjZSBvciBtYW55LCBhcyBhIHBsYWluIGFycmF5LiBBIHNvdXJjZSBpcyBuZXZlciBpdHNlbGYgYW4gYXJyYXkuICovXG5mdW5jdGlvbiB0b1NvdXJjZUxpc3QoXG4gIGlucHV0OiBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT4sXG4pOiBSZW1vdGVTa2lsbFNvdXJjZVtdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gWy4uLmlucHV0XSA6IFtpbnB1dF07XG59XG5cbi8qKiBGbGF0dGVuIGEgc291cmNlIGVudHJ5IC0gc3RyaW5nLCBgVVJMYCwgYHsgdXJsIH1gLCBvciBvcHRpb25zIGJhZyAtIHRvIGEge0BsaW5rIE5vcm1hbGl6ZWRTb3VyY2V9LiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2VPcHRpb25zKHNvdXJjZTogUmVtb3RlU2tpbGxTb3VyY2UpOiBOb3JtYWxpemVkU291cmNlIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHJldHVybiB7IHNvdXJjZSB9O1xuICBpZiAoc291cmNlIGluc3RhbmNlb2YgVVJMKSByZXR1cm4geyBzb3VyY2U6IHNvdXJjZS50b1N0cmluZygpIH07XG4gIGlmIChcInNvdXJjZVwiIGluIHNvdXJjZSkgcmV0dXJuIHsgLi4uc291cmNlLCBzb3VyY2U6IHRvU291cmNlU3RyaW5nKHNvdXJjZS5zb3VyY2UpIH07XG4gIHJldHVybiB7IHNvdXJjZTogc291cmNlLnVybCB9O1xufVxuXG4vKiogQSB7QGxpbmsgbmV0LlVybExpa2V9IGFzIHRoZSBwbGFpbiBzdHJpbmcgdGhlIHN0YWdpbmcgcGF0aHMgd29yayB3aXRoLiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2VTdHJpbmcoc291cmNlOiBuZXQuVXJsTGlrZSk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSByZXR1cm4gc291cmNlO1xuICByZXR1cm4gc291cmNlIGluc3RhbmNlb2YgVVJMID8gc291cmNlLnRvU3RyaW5nKCkgOiBzb3VyY2UudXJsO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGEgc291cmNlIHNlbGVjdHMgdGhlIGJ1aWx0LWluIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGwgc2V0LiAqL1xuZnVuY3Rpb24gaXNBaVRvb2xzU291cmNlKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzb3VyY2UudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IEFJVE9PTFNfU09VUkNFO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjYWNoZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRoZSBwb2xpY3kgdGhhdCBkZWNpZGVzIHdoYXQgYSBzb3VyY2UncyBkb3dubG9hZCBDT05UQUlOUy5cbiAqXG4gKiBPbmx5IHRoZXNlIHRocmVlIGNoYW5nZSB0aGUgcmVzdWx0aW5nIHRyZWUsIHNvIG9ubHkgdGhlc2UgYmVsb25nIGluIHRoZSBjYWNoZVxuICoga2V5IC0gYGZhaWxPbkVycm9yYCBhbmQgYG1heERvd25sb2FkQnl0ZXNgIGdvdmVybiBob3cgYSBmYWlsdXJlIGlzIGhhbmRsZWQsXG4gKiBub3Qgd2hhdCBhIHN1Y2Nlc3MgcHJvZHVjZXMuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UpOiBSZW1vdGVTa2lsbENhY2hlRW50cnlbXCJwb2xpY3lcIl0ge1xuICBjb25zdCBza2lsbHMgPSBzdHJpbmdVdGlscy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpO1xuICBjb25zdCBwb2xpY3kgPSB7XG4gICAgLi4uKHNraWxscy5sZW5ndGggPiAwID8geyBza2lsbHM6IFsuLi5za2lsbHNdLnNvcnQoKSB9IDoge30pLFxuICAgIC4uLihzb3VyY2VPcHRpb25zLmV4cGVyaW1lbnRhbCA9PT0gdHJ1ZSA/IHsgZXhwZXJpbWVudGFsOiB0cnVlIH0gOiB7fSksXG4gICAgLi4uKHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5yZWYpID8geyByZWY6IHNvdXJjZU9wdGlvbnMucmVmIS50cmltKCkgfSA6IHt9KSxcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBvbGljeSkubGVuZ3RoID4gMCA/IHBvbGljeSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGFibGUgaWRlbnRpdHkgb2YgYSBzb3VyY2UgQU5EIGl0cyBjb250ZW50LWFmZmVjdGluZyBwb2xpY3kuXG4gKlxuICogS2V5aW5nIG9uIHRoZSBzb3VyY2UgYWxvbmUgd291bGQgbGV0IGEgY2hhbmdlZCBgc2tpbGxzYCBmaWx0ZXIgb3IgYHJlZmAgcmVhZFxuICogYmFjayB0aGUgcHJldmlvdXMgZG93bmxvYWQgZm9yIGEgZGF5OyBrZXlpbmcgb24gYm90aCB0dXJucyB0aGF0IGludG8gYSBtaXNzLlxuICogVGhlIHNraWxsIGxpc3QgaXMgc29ydGVkIGZpcnN0IHNvIGEgcmVvcmRlcmVkIGFycmF5IGlzIHN0aWxsIHRoZSBzYW1lIGtleS5cbiAqL1xuZnVuY3Rpb24gY2FjaGVLZXkoc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNoLmZudkhhc2goXG4gICAgSlNPTi5zdHJpbmdpZnkoeyBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLCBwb2xpY3k6IGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnMpID8/IG51bGwgfSksXG4gICk7XG59XG5cbi8qKiBTdGFibGUgdmlydHVhbCB3b3Jrc3BhY2UgcGF0aCBmb3Igb25lIGxvY2FsbHkgcHJvdmlzaW9uZWQgc291cmNlLiAqL1xuZnVuY3Rpb24gbG9jYWxTa2lsbE1vdW50UGF0aChzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc0FpVG9vbHNTb3VyY2Uoc291cmNlT3B0aW9ucy5zb3VyY2UpKSByZXR1cm4gQUlUT09MU19TS0lMTFNfTU9VTlQ7XG4gIGNvbnN0IGNvbmZpZ3VyZWROYW1lID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLm5hbWUpO1xuICBjb25zdCBpZGVudGlmaWVyID0gY29uZmlndXJlZE5hbWVcbiAgICA/IHN0cmluZ1V0aWxzLnRvU2x1Zyhjb25maWd1cmVkTmFtZSlcbiAgICA6IHN0cmluZ1V0aWxzLnRvU2x1ZyhyZW1vdGVTb3VyY2VJZGVudGlmaWVyKHNvdXJjZU9wdGlvbnMuc291cmNlKSkgfHwgXCJzb3VyY2VcIjtcbiAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJlbW90ZSBza2lsbCBzb3VyY2UgbmFtZSBtdXN0IGNvbnRhaW4gbGV0dGVycyBvciBudW1iZXJzOiBcIiR7Y29uZmlndXJlZE5hbWV9XCJgLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBvc2l4LmpvaW4oUkVNT1RFX1NLSUxMU19NT1VOVCwgY29uZmlndXJlZE5hbWUgPyBpZGVudGlmaWVyIDogYCR7aWRlbnRpZmllcn0tJHtrZXl9YCk7XG59XG5cbi8qKiBIdW1hbi1yZWFkYWJsZSBzb3VyY2UgcG9ydGlvbiB1c2VkIGJ5IGdlbmVyYXRlZCB2aXJ0dWFsIG1vdW50IGlkZW50aWZpZXJzLiAqL1xuZnVuY3Rpb24gcmVtb3RlU291cmNlSWRlbnRpZmllcihzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHNvdXJjZSk7XG4gIGlmICghdXJsKSByZXR1cm4gc291cmNlO1xuICBjb25zdCBwYXRoID0gdXJsLnBhdGhuYW1lLnJlcGxhY2UoL1xcLihnaXR8bWR8emlwfHRhcnx0Z3p8Z3opJC9pLCBcIlwiKTtcbiAgcmV0dXJuIGAke3VybC5ob3N0bmFtZX0tJHtwYXRofWA7XG59XG5cbi8qKiBUaGUgZWZmZWN0aXZlIHJldXNlIHdpbmRvdzogcGVyLXNvdXJjZSwgdGhlbiB0b3AtbGV2ZWwsIHRoZW4gc2V2ZW4gZGF5cy4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZWZyZXNoVHRsKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNvdXJjZU9wdGlvbnMucmVmcmVzaFR0bE1zID8/IG9wdGlvbnMucmVmcmVzaFR0bE1zID8/IERFRkFVTFRfUkVGUkVTSF9UVExfTVM7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgbWV0YWRhdGEgZG9jdW1lbnQgYXQgdGhlIHJvb3Qgb2YgYSBwcm92aXNpb25lZCB0cmVlLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiB0aGVyZSBpcyBub25lLCBpdCBpcyB1bnJlYWRhYmxlLCBvciBpdCB3YXMgd3JpdHRlbiBieSBhIHNoYXBlIHRoaXNcbiAqIHZlcnNpb24gZG9lcyBub3Qga25vdy5cbiAqXG4gKiBOZXZlciB0aHJvd3M6IGEgbWlzc2luZyBvciBjb3JydXB0IHJlY29yZCBpcyBhIGNhY2hlIE1JU1MsIHdoaWNoIGNvc3RzIGFcbiAqIGRvd25sb2FkIC0gd2hpbGUgbGV0dGluZyBpdCBmYWlsIHdvdWxkIHRha2UgYXBwIHN0YXJ0dXAgZG93biBvdmVyXG4gKiBib29ra2VlcGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZE1ldGFkYXRhKGZzOiBGaWxlU3lzdGVtKTogUHJvbWlzZTxSZW1vdGVTa2lsbHNNZXRhZGF0YSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyhNRVRBREFUQV9GSUxFKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoTUVUQURBVEFfRklMRSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZShyYXcsIHVuZGVmaW5lZCkgYXMgUmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFyc2VkKSB8fCBwYXJzZWQudmVyc2lvbiAhPT0gTUVUQURBVEFfVkVSU0lPTikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHBhcnNlZC5zb3VyY2VzKSA/IHBhcnNlZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2FjaGU6dW5yZWFkYWJsZVwiLCB7IGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGVudHJ5IGlzIHN0aWxsIGluc2lkZSBpdHMgcmV1c2Ugd2luZG93LlxuICpcbiAqIEEgYHR0bE1zYCBvZiBgMGAgZGlzYWJsZXMgcmV1c2Ugb3V0cmlnaHQsIGFuZCBhbiB1bnBhcnNlYWJsZSBvciBGVVRVUkVcbiAqIHRpbWVzdGFtcCBjb3VudHMgYXMgc3RhbGUgLSBhIGNsb2NrIHRoYXQgbW92ZWQgYmFja3dhcmRzIHNob3VsZCBjb3N0IG9uZVxuICogZXh0cmEgZG93bmxvYWQsIG5vdCBwaW4gYSB0cmVlIGFzIGZyZXNoIGluZGVmaW5pdGVseS5cbiAqL1xuZnVuY3Rpb24gaXNGcmVzaChlbnRyeTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCB0dGxNczogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmICh0dGxNcyA8PSAwIHx8ICFBcnJheS5pc0FycmF5KGVudHJ5LnNraWxscykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZG93bmxvYWRlZEF0ID0gb2JqZWN0LnRvRGF0ZShlbnRyeS5kb3dubG9hZGVkQXQpO1xuICBpZiAoIWRvd25sb2FkZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gZG93bmxvYWRlZEF0LmdldFRpbWUoKTtcbiAgcmV0dXJuIGFnZSA+PSAwICYmIGFnZSA8IHR0bE1zO1xufVxuXG4vKipcbiAqIE1lcmdlIG9uZSBzb3VyY2UncyBlbnRyeSBpbnRvIHRoZSB0cmVlJ3MgbWV0YWRhdGEgZG9jdW1lbnQsIHByZXNlcnZpbmcgd2hhdFxuICogb3RoZXIgc291cmNlcyByZWNvcmRlZCAtIHRoZSBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uIGlzIFNIQVJFRCwgc28gYSBibGluZFxuICogb3ZlcndyaXRlIHdvdWxkIGRyb3AgZXZlcnkgc2libGluZyBzb3VyY2UncyB0aW1lc3RhbXAgYW5kIHJlLWRvd25sb2FkIHRoZVxuICogbG90IG9uIHRoZSBuZXh0IGJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWV0YWRhdGEoXG4gIGZzOiBGaWxlU3lzdGVtLFxuICBrZXk6IHN0cmluZyxcbiAgZW50cnk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjdXJyZW50ID0gYXdhaXQgcmVhZE1ldGFkYXRhKGZzKTtcbiAgY29uc3QgbmV4dDogUmVtb3RlU2tpbGxzTWV0YWRhdGEgPSB7XG4gICAgdmVyc2lvbjogTUVUQURBVEFfVkVSU0lPTixcbiAgICBzb3VyY2VzOiB7IC4uLmN1cnJlbnQ/LnNvdXJjZXMsIFtrZXldOiBlbnRyeSB9LFxuICB9O1xuICBhd2FpdCBmcy53cml0ZUZpbGUoTUVUQURBVEFfRklMRSwgYCR7SlNPTi5zdHJpbmdpZnkobmV4dCwgbnVsbCwgMil9XFxuYCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG59XG5cbi8qKiBUaGUgc3RhYmxlIGxvY2FsIHRyZWUgYSBzb3VyY2UgaXMgcmVidWlsdCBpbnRvLCBrZXllZCBieSB7QGxpbmsgY2FjaGVLZXl9LiAqL1xuZnVuY3Rpb24gbG9jYWxTa2lsbHNGUyhrZXk6IHN0cmluZyk6IExvY2FsRmlsZVN5c3RlbSB7XG4gIHJldHVybiBsb2NhbEZTLnRtcEZTKGAke0xPQ0FMX1NLSUxMU19ESVJ9LyR7a2V5fWApO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplIGV2ZXJ5IGNvbmZpZ3VyZWQgcmVtb3RlIHNraWxsIHNvdXJjZSBhdCBhcHAgc3RhcnR1cC5cbiAqXG4gKiBXcml0ZXMgZWFjaCByZXNvbHZlZCBgU0tJTEwubWRgIHRyZWUgdG8gdGhlIERhdGFicmlja3MgdXNlciBBc3Npc3RhbnQgc2tpbGxzXG4gKiBmb2xkZXIgd2hlbiBhIHdyaXRhYmxlIHdvcmtzcGFjZSBpcyBhdmFpbGFibGUsIGVsc2UgdW5kZXJcbiAqIHtAbGluayBsb2NhbEZTLnRtcEZTfSByZXR1cm5lZCBpbiB7QGxpbmsgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMubG9jYWxTa2lsbE1vdW50c30uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25SZW1vdGVTa2lsbHMoXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxQcm92aXNpb25lZFJlbW90ZVNraWxscz4ge1xuICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKG9wdGlvbik7XG4gIGNvbnN0IGVtcHR5OiBQcm92aXNpb25lZFJlbW90ZVNraWxscyA9IHsgbG9jYWxTa2lsbE1vdW50czogW10sIHNraWxsTmFtZXM6IFtdIH07XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIGVtcHR5O1xuXG4gIGNvbnN0IGZhaWxEZWZhdWx0ID0gb3B0aW9ucy5mYWlsT25FcnJvciAhPT0gZmFsc2U7XG4gIGNvbnN0IGNsaWVudCA9IG9wdGlvbnMuY2xpZW50ID8/IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAgLy8gUHJvYmVkIHJhdGhlciB0aGFuIGFzc3VtZWQ6IGFuIGlkZW50aXR5IHRoYXQgY2Fubm90IHdyaXRlIHRoZSB3b3Jrc3BhY2VcbiAgLy8gdHJlZSBmYWxscyBiYWNrIHRvIHRoZSBsb2NhbCBvbmUgaW5zdGVhZCBvZiBmYWlsaW5nIHN0YXJ0dXAuIFRoZSBwcm9iZSBhbHNvXG4gIC8vIGNyZWF0ZXMgdGhlIHJvb3QsIHdoaWNoIHRoZSBmaXJzdCBjYWNoZSBSRUFEIG5lZWRzIC0gYGNvcHlTa2lsbERpcnNgIHdvdWxkXG4gIC8vIG90aGVyd2lzZSBiZSB0aGUgZmlyc3QgdGhpbmcgdG8gY3JlYXRlIGl0LCB3aGljaCBpcyB0b28gbGF0ZS5cbiAgY29uc3QgcmVxdWVzdGVkQmFzZVBhdGggPSByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudCk7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gcmVxdWVzdGVkQmFzZVBhdGhcbiAgICA/IGF3YWl0IG9wZW5Xcml0YWJsZVdvcmtzcGFjZShyZXF1ZXN0ZWRCYXNlUGF0aCwgY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudClcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGF0YWJyaWNrc0Jhc2VQYXRoID0gZGVzdGluYXRpb24gPyByZXF1ZXN0ZWRCYXNlUGF0aCA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBsb2NhbFNraWxsTW91bnRzOiBMb2NhbFNraWxsTW91bnRbXSA9IFtdO1xuICBjb25zdCBza2lsbE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgc3RhZ2luZzogTG9jYWxGaWxlU3lzdGVtIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5zb3VyY2VzKSA/IG9wdGlvbnMuc291cmNlcyA6IFtvcHRpb25zLnNvdXJjZXNdO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc291cmNlcykge1xuICAgICAgY29uc3Qgc291cmNlT3B0aW9ucyA9IHRvU291cmNlT3B0aW9ucyhlbnRyeSk7XG4gICAgICBjb25zdCBmYWlsT25FcnJvciA9IHNvdXJjZU9wdGlvbnMuZmFpbE9uRXJyb3IgPz8gZmFpbERlZmF1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXaGVyZSB0aGlzIHNvdXJjZSdzIGJvb2trZWVwaW5nIGxpdmVzOiB0aGUgc2hhcmVkIERhdGFicmlja3MgdHJlZSwgb3JcbiAgICAgICAgLy8gdGhlIHNvdXJjZSdzIG93biBzdGFibGUgbG9jYWwgZGlyLlxuICAgICAgICBjb25zdCBrZXkgPSBjYWNoZUtleShzb3VyY2VPcHRpb25zKTtcbiAgICAgICAgY29uc3QgbW91bnRQYXRoID0gbG9jYWxTa2lsbE1vdW50UGF0aChzb3VyY2VPcHRpb25zLCBrZXkpO1xuICAgICAgICBjb25zdCBjYWNoZUZTID0gZGVzdGluYXRpb24gPz8gbG9jYWxTa2lsbHNGUyhrZXkpO1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHJlYWRNZXRhZGF0YShjYWNoZUZTKTtcbiAgICAgICAgY29uc3QgY2FjaGVkID0gbWV0YWRhdGE/LnNvdXJjZXNba2V5XTtcbiAgICAgICAgaWYgKGNhY2hlZCAmJiBpc0ZyZXNoKGNhY2hlZCwgcmVzb2x2ZVJlZnJlc2hUdGwoc291cmNlT3B0aW9ucywgb3B0aW9ucykpKSB7XG4gICAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLmNhY2hlZC5za2lsbHMpO1xuICAgICAgICAgIGlmICghZGVzdGluYXRpb24pIGxvY2FsU2tpbGxNb3VudHMucHVzaCh7IHJvb3Q6IGNhY2hlRlMucm9vdCwgbW91bnRQYXRoIH0pO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxsIHJlYWR5XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogZGF0YWJyaWNrc0Jhc2VQYXRoID8/IG1vdW50UGF0aCxcbiAgICAgICAgICAgIGRvd25sb2FkZWRBdDogY2FjaGVkLmRvd25sb2FkZWRBdCxcbiAgICAgICAgICAgIHNraWxsczogY2FjaGVkLnNraWxscyxcbiAgICAgICAgICAgIGNhY2hlZDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5pbmZvKFwiaW5zdGFsbGluZyByZW1vdGUgc2tpbGxcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFnaW5nID8/PSBhd2FpdCBpbml0aWFsaXplZFNjcmF0Y2goXCJtYXN0cmEtcmVtb3RlLXNraWxsc1wiKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VkRGlyID0gYXdhaXQgc3RhZ2VTb3VyY2Uoc291cmNlT3B0aW9ucywgc3RhZ2luZy5yb290LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VkID0gYXdhaXQgY29sbGVjdFNraWxsRGlycyhzdGFnZWREaXIpO1xuICAgICAgICBpZiAoc3RhZ2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gU0tJTEwubWQgZm91bmQgZm9yIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2xpY3kgPSBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zKTtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZW1vdGVTa2lsbENhY2hlRW50cnkgPSB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBkb3dubG9hZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBza2lsbHM6IHN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpLFxuICAgICAgICAgIC4uLihwb2xpY3kgPyB7IHBvbGljeSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoZGVzdGluYXRpb24gJiYgZGF0YWJyaWNrc0Jhc2VQYXRoKSB7XG4gICAgICAgICAgYXdhaXQgcmVtb3ZlRGVsZXRlZFNraWxscyhkZXN0aW5hdGlvbiwga2V5LCBtZXRhZGF0YSwgcmVjb3JkLnNraWxscyk7XG4gICAgICAgICAgYXdhaXQgY29weVNraWxsRGlycyhkZXN0aW5hdGlvbiwgc3RhZ2VkKTtcbiAgICAgICAgICAvLyBPbmx5IGFmdGVyIHRoZSBjb3B5IGxhbmRzOiBhIG1ldGFkYXRhIGVudHJ5IHdyaXR0ZW4gZmlyc3Qgd291bGRcbiAgICAgICAgICAvLyBtYXJrIGEgZmFpbGVkIHByb3Zpc2lvbiBhcyBmcmVzaCBhbmQgc3VwcHJlc3MgdGhlIHJldHJ5IGZvciBhIGRheS5cbiAgICAgICAgICBhd2FpdCB3cml0ZU1ldGFkYXRhKGRlc3RpbmF0aW9uLCBrZXksIHJlY29yZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYWxTa2lsbE1vdW50cy5wdXNoKHtcbiAgICAgICAgICAgIHJvb3Q6IGF3YWl0IHBlcnNpc3RMb2NhbGx5KGtleSwgc3RhZ2VkLCByZWNvcmQpLFxuICAgICAgICAgICAgbW91bnRQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5yZWNvcmQuc2tpbGxzKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGwgaW5zdGFsbGVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGRlc3RpbmF0aW9uOiBkYXRhYnJpY2tzQmFzZVBhdGggPz8gbG9jYWxTa2lsbE1vdW50cy5hdCgtMSk/Lm1vdW50UGF0aCxcbiAgICAgICAgICBza2lsbHM6IHJlY29yZC5za2lsbHMsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChmYWlsT25FcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBmYWlsZWQgdG8gcHJvdmlzaW9uIHJlbW90ZSBza2lsbCBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiOiAke2Vycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycil9YCxcbiAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIud2FybihcInNvdXJjZTpza2lwcGVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHN0YWdpbmcpIHtcbiAgICAgIGF3YWl0IHJtKHN0YWdpbmcucm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgYXNzZXJ0VW5pcXVlTG9jYWxTa2lsbE1vdW50cyhsb2NhbFNraWxsTW91bnRzKTtcbiAgcmV0dXJuIHsgbG9jYWxTa2lsbE1vdW50cywgZGF0YWJyaWNrc0Jhc2VQYXRoLCBza2lsbE5hbWVzIH07XG59XG5cbi8qKiBGYWlsIGJlZm9yZSB3b3Jrc3BhY2UgY29tcG9zaXRpb24gd2hlbiB0d28gc291cmNlcyBjbGFpbSBvbmUgdmlydHVhbCBtb3VudC4gKi9cbmZ1bmN0aW9uIGFzc2VydFVuaXF1ZUxvY2FsU2tpbGxNb3VudHMobW91bnRzOiByZWFkb25seSBMb2NhbFNraWxsTW91bnRbXSk6IHZvaWQge1xuICBjb25zdCByb290c0J5TW91bnQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IG1vdW50IG9mIG1vdW50cykge1xuICAgIGNvbnN0IHByZXZpb3VzUm9vdCA9IHJvb3RzQnlNb3VudC5nZXQobW91bnQubW91bnRQYXRoKTtcbiAgICBpZiAocHJldmlvdXNSb290ICYmIHByZXZpb3VzUm9vdCAhPT0gbW91bnQucm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbXVsdGlwbGUgcmVtb3RlIHNraWxsIHNvdXJjZXMgcmVzb2x2ZSB0byB2aXJ0dWFsIG1vdW50IFwiJHttb3VudC5tb3VudFBhdGh9XCI7IGdpdmUgZWFjaCBzb3VyY2UgYSB1bmlxdWUgbmFtZWAsXG4gICAgICApO1xuICAgIH1cbiAgICByb290c0J5TW91bnQuc2V0KG1vdW50Lm1vdW50UGF0aCwgbW91bnQucm9vdCk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBkaXJlY3RvcmllcyBkcm9wcGVkIGJ5IG9uZSBzb3VyY2UgdW5sZXNzIGFub3RoZXIgc291cmNlIHN0aWxsIG93bnMgdGhlbS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlbGV0ZWRTa2lsbHMoXG4gIGRlc3RpbmF0aW9uOiBGaWxlU3lzdGVtLFxuICBrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFJlbW90ZVNraWxsc01ldGFkYXRhIHwgdW5kZWZpbmVkLFxuICBuZXh0U2tpbGxzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmV2aW91cyA9IG1ldGFkYXRhPy5zb3VyY2VzW2tleV0/LnNraWxscyA/PyBbXTtcbiAgY29uc3QgcmV0YWluZWQgPSBuZXcgU2V0KG5leHRTa2lsbHMpO1xuICBmb3IgKGNvbnN0IFtzb3VyY2VLZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YT8uc291cmNlcyA/PyB7fSkpIHtcbiAgICBpZiAoc291cmNlS2V5ID09PSBrZXkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgZW50cnkuc2tpbGxzKSByZXRhaW5lZC5hZGQoc2tpbGwpO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByZXZpb3VzXG4gICAgICAuZmlsdGVyKChza2lsbCkgPT4gIXJldGFpbmVkLmhhcyhza2lsbCkpXG4gICAgICAubWFwKChza2lsbCkgPT4gZGVzdGluYXRpb24ucm1kaXIoc2tpbGwsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSksXG4gICk7XG59XG5cbi8qKiBQcm9iZSBmaWxlIHtAbGluayBvcGVuV3JpdGFibGVXb3Jrc3BhY2V9IHdyaXRlcyBhbmQgcmVtb3Zlcy4gKi9cbmNvbnN0IFdSSVRFX1BST0JFX0ZJTEUgPSBcIi5kYngtdG9vbHMtd3JpdGUtcHJvYmVcIjtcblxuLyoqXG4gKiBPcGVuIHRoZSBEYXRhYnJpY2tzIHNraWxscyBkZXN0aW5hdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlkZW50aXR5XG4gKiBjYW5ub3Qgd3JpdGUgdGhlcmUuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCkgaXMgY29tbW9ubHlcbiAqIGFkbWlucy1vbmx5LCBhbmQgYW4gYXBwIHNlcnZpY2UgcHJpbmNpcGFsIGlzIG5vdCBhbiBhZG1pbiAtIHNvIGEgRGF0YWJyaWNrc1xuICogQXBwIHdyaXRpbmcgdGhlcmUgZmFpbHMgd2l0aCBgUkVTT1VSQ0VfRE9FU19OT1RfRVhJU1RgLCB3aGljaCBpcyBob3cgdGhlXG4gKiB3b3Jrc3BhY2UgQVBJIHJlcG9ydHMgYSBwYXRoIHRoZSBjYWxsZXIgaXMgbm90IGFsbG93ZWQgdG8gc2VlLiBUaGF0IGlzIGEgZmFjdFxuICogYWJvdXQgV0hFUkUgdGhlIHRyZWUgaXMgc3RvcmVkLCBub3QgYWJvdXQgd2hldGhlciB0aGUgc2tpbGxzIGFyZSB1c2FibGUsIHNvIGl0XG4gKiBkZWdyYWRlcyB0byB0aGUgbG9jYWwgdHJlZSAoaGFuZGVkIHRvIE1hc3RyYSBhcyBhbiBleHRyYSBzY2FuIHBhdGgpIHJhdGhlclxuICogdGhhbiB0YWtpbmcgYXBwIHN0YXJ0dXAgZG93biBvdmVyIGJvb2trZWVwaW5nIGxvY2F0aW9uLlxuICpcbiAqIFRoZSBwcm9iZSBpcyBhIHJlYWwgd3JpdGU6IGBta2RpcnNgIHN1Y2NlZWRzIG9uIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBldmVuIGZvclxuICogYW4gaWRlbnRpdHkgdGhhdCBjYW5ub3Qgd3JpdGUgaW50byBpdCwgc28gaW5pdCBhbG9uZSBwcm92ZXMgbm90aGluZy4gUmVtb3ZpbmdcbiAqIHRoZSBwcm9iZSBmaWxlIGlzIGJlc3QtZWZmb3J0IC0gYSBmYWlsZWQgY2xlYW51cCBtdXN0IG5vdCBkZWNpZGUgd3JpdGFiaWxpdHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Xcml0YWJsZVdvcmtzcGFjZShcbiAgYmFzZVBhdGg6IHN0cmluZyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPERhdGFicmlja3NGaWxlU3lzdGVtIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6IHdvcmtzcGFjZUNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChjbGllbnQpLFxuICAgIHJvb3Q6IGJhc2VQYXRoLFxuICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICBjcmVhdGVSb290OiB0cnVlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5pbml0KCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGVzdGluYXRpb246dW53cml0YWJsZVwiLCB7XG4gICAgICBkZXN0aW5hdGlvbjogYmFzZVBhdGgsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGF3YWl0IGZzLmRlbGV0ZUZpbGUoV1JJVEVfUFJPQkVfRklMRSwgeyBmb3JjZTogdHJ1ZSB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gZnM7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSBEYXRhYnJpY2tzIEFzc2lzdGFudCBza2lsbHMgZGVzdGluYXRpb24sIG9yIGB1bmRlZmluZWRgIGZvciBsb2NhbCB0ZW1wLiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NCYXNlUGF0aChcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjbGllbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aCkgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub1VuZGVmaW5lZChvcHRpb25zLmRhdGFicmlja3NCYXNlUGF0aCk7XG4gIGNvbnN0IGVtYWlsID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChvcHRpb25zLnVzZXJFbWFpbCk7XG4gIC8vIEEgbmFtZWQgdXNlciB0YXJnZXRzIHRoZWlyIHBlcnNvbmFsIEFzc2lzdGFudCB0cmVlICh0aGUgXCJzYXZlIGEgc2tpbGxcIlxuICAvLyB0YXJnZXQpOyBvdGhlcndpc2UgdGhlIHNoYXJlZCB3b3Jrc3BhY2UgQXNzaXN0YW50IHRyZWUsIHdoaWNoIHRoZSBidWlsdC1pblxuICAvLyBBc3Npc3RhbnQtc2tpbGxzIG1vdW50IGFscmVhZHkgc2NhbnMuXG4gIHJldHVybiBlbWFpbCA/IHBlcnNvbmFsU2tpbGxzUGF0aChlbWFpbCkgOiBPUkdBTklaQVRJT05fU0tJTExTX1BBVEg7XG59XG5cbi8qKlxuICogU3RhZ2Ugb25lIHNvdXJjZSBpbnRvIGEgZnJlc2ggZGlyIHVuZGVyIGBzdGFnaW5nUm9vdGAsIHByZWZlcnJpbmcgdGhlIG9wdGlvbmFsXG4gKiBgc2tpbGxzYCBDTEkgYW5kIGZhbGxpbmcgYmFjayB0byBhIGRpcmVjdCBmZXRjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VTb3VyY2UoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHN0YWdpbmdSb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB0YXJnZXQgPSBqb2luKHN0YWdpbmdSb290LCBgc3JjLSR7aGFzaC5pZCgpfWApO1xuICBhd2FpdCBta2Rpcih0YXJnZXQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBBSSBUb29scyByZXNvbHZlcyBmcm9tIGEga25vd24gcmVwbyBsYXlvdXQsIHNvIGl0IG5ldmVyIG5lZWRzIHRoZSBDTEkuXG4gIGlmIChpc0FpVG9vbHNTb3VyY2Uoc291cmNlT3B0aW9ucy5zb3VyY2UpKSByZXR1cm4gc3RhZ2VBaVRvb2xzKHNvdXJjZU9wdGlvbnMsIHRhcmdldCwgb3B0aW9ucyk7XG4gIGNvbnN0IHZpYUNsaSA9IGF3YWl0IHN0YWdlVmlhU2tpbGxzQ2xpKHNvdXJjZU9wdGlvbnMsIHRhcmdldCk7XG4gIGlmICh2aWFDbGkpIHJldHVybiB2aWFDbGk7XG4gIHJldHVybiBzdGFnZVZpYUZldGNoKHNvdXJjZU9wdGlvbnMsIHRhcmdldCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgdGhlIERhdGFicmlja3MgQUkgVG9vbHMgc2tpbGxzIGludG8gYHRhcmdldGAuXG4gKlxuICogUmVhZHMgdGhlIHJlcG8ncyBvd24gZ2VuZXJhdGVkIGBtYW5pZmVzdC5qc29uYCAod2hpY2ggbmFtZXMgZWFjaCBza2lsbCdzXG4gKiBmaWxlcyBhbmQgd2hldGhlciBpdCBsaXZlcyB1bmRlciBgc2tpbGxzL2Agb3IgYGV4cGVyaW1lbnRhbC9gKSBhbmQgZG93bmxvYWRzXG4gKiB0aGVtIC0gdGhlIHNhbWUgdGhpbmcgYGRhdGFicmlja3MgYWl0b29scyBpbnN0YWxsYCBkb2VzLCBtaW51cyB0aGUgQ0xJIGFuZFxuICogbWludXMgYW55IERhdGFicmlja3MgYXV0aCwgc2luY2UgdGhlIHJlcG8gaXMgcHVibGljLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZUFpVG9vbHMoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbWF4Qnl0ZXMgPSByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucyk7XG4gIGNvbnN0IHJlZiA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5yZWYpID8/IEFJVE9PTFNfUkVGO1xuICBjb25zdCBtYW5pZmVzdCA9IGpzb24ucGFyc2UoXG4gICAgKGF3YWl0IGRvd25sb2FkKGFpVG9vbHNSYXdVcmwocmVmLCBcIm1hbmlmZXN0Lmpzb25cIiksIG1heEJ5dGVzKSkudG9TdHJpbmcoXCJ1dGY4XCIpLFxuICAgIHVuZGVmaW5lZCxcbiAgKSBhcyBBaVRvb2xzTWFuaWZlc3QgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgd2FudGVkID0gbmV3IFNldChzdHJpbmdVdGlscy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpKTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdD8uc2tpbGxzID8/IHt9KS5maWx0ZXIoKFtuYW1lLCBlbnRyeV0pID0+XG4gICAgd2FudGVkLnNpemUgPiAwXG4gICAgICA/IHdhbnRlZC5oYXMobmFtZSlcbiAgICAgIDogZW50cnkucmVwb19kaXIgIT09IFwiZXhwZXJpbWVudGFsXCIgfHwgc291cmNlT3B0aW9ucy5leHBlcmltZW50YWwgPT09IHRydWUsXG4gICk7XG4gIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIG1hdGNoaW5nIHNraWxscyBpbiAke0FJVE9PTFNfUkVQT31AJHtyZWZ9YCk7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IHNlbGVjdGVkLmZsYXRNYXAoKFtuYW1lLCBlbnRyeV0pID0+XG4gICAgKGVudHJ5LmZpbGVzID8/IFtdKS5tYXAoKGZpbGUpID0+ICh7XG4gICAgICB1cmw6IGFpVG9vbHNSYXdVcmwocmVmLCBgJHtlbnRyeS5yZXBvX2RpciA/PyBcInNraWxsc1wifS8ke25hbWV9LyR7ZmlsZX1gKSxcbiAgICAgIHBhdGg6IGpvaW4odGFyZ2V0LCBuYW1lLCAuLi5maWxlLnNwbGl0KFwiL1wiKSksXG4gICAgfSkpLFxuICApO1xuICBhd2FpdCBhc3luY1V0aWxzLm1hcENvbmN1cnJlbnQoXG4gICAgZmlsZXMsXG4gICAgYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBkb3dubG9hZChpdGVtLnVybCwgbWF4Qnl0ZXMpO1xuICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShpdGVtLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShpdGVtLnBhdGgsIGJvZHkpO1xuICAgIH0sXG4gICAgeyBjb25jdXJyZW5jeTogQUlUT09MU19DT05DVVJSRU5DWSB9LFxuICApO1xuXG4gIGxvZ2dlci5kZWJ1ZyhcImFpdG9vbHM6c3RhZ2VkXCIsIHsgcmVmLCBza2lsbHM6IHNlbGVjdGVkLmxlbmd0aCwgZmlsZXM6IGZpbGVzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIFJhdy1jb250ZW50IFVSTCBmb3IgYSBwYXRoIGluIHRoZSBBSSBUb29scyByZXBvIGF0IGByZWZgLiAqL1xuZnVuY3Rpb24gYWlUb29sc1Jhd1VybChyZWY6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHtBSVRPT0xTX1JFUE99LyR7cmVmfS8ke3BhdGh9YDtcbn1cblxuLyoqXG4gKiBDb3B5IGEgc291cmNlIGludG8gYHRhcmdldGAgd2l0aCB0aGUgYHNraWxsc2AgQ0xJIHdoZW4gaXQgaXMgaW5zdGFsbGVkLlxuICogUmV0dXJucyB0aGUgZGlyIGhvbGRpbmcgdGhlIGNvcGllZCBgU0tJTEwubWRgIHRyZWVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICogQ0xJIGlzIGFic2VudCAoc28gdGhlIGNhbGxlciBjYW4gZmFsbCBiYWNrIHRvIGEgZmV0Y2gpLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVZpYVNraWxsc0NsaShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjbGkgPSBhd2FpdCByZXNvbHZlU2tpbGxzQ2xpKCk7XG4gIGlmICghY2xpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgLi4uY2xpLmFyZ3MsXG4gICAgXCJhZGRcIixcbiAgICBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICBcIi0tYWdlbnRcIixcbiAgICBTS0lMTFNfQ0xJX0FHRU5ULFxuICAgIFwiLS1jb3B5XCIsXG4gICAgXCIteVwiLFxuICBdO1xuICBmb3IgKGNvbnN0IHNraWxsIG9mIHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykpIHtcbiAgICBhcmdzLnB1c2goXCItLXNraWxsXCIsIHNraWxsKTtcbiAgfVxuICBpZiAoc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKS5sZW5ndGggPT09IDApIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgXCIqXCIpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMuc3Bhd24oY2xpLmNvbW1hbmQsIGFyZ3MsIHtcbiAgICBjd2Q6IHRhcmdldCxcbiAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgY2hlY2s6IGZhbHNlLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBza2lsbHMgQ0xJIGZhaWxlZCAoZXhpdCAke3Jlc3VsdC5leGl0Q29kZX0pOiAke3Jlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGpvaW4odGFyZ2V0LCAuLi5TS0lMTFNfQ0xJX0xBWU9VVCk7XG59XG5cbi8qKlxuICogTG9jYXRlIHRoZSBvcHRpb25hbCBgc2tpbGxzYCBDTEkgYmluLCByZXNvbHZlZCBmcm9tIFRISVMgcGFja2FnZSdzIG1vZHVsZVxuICogZ3JhcGguIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGVlciBkZXAgaXNuJ3QgaW5zdGFsbGVkLCBzbyB0aGUgY2FsbGVyXG4gKiBmYWxscyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxzQ2xpKCk6IFByb21pc2U8eyBjb21tYW5kOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0gfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICAgIGNvbnN0IHBrZ1BhdGggPSByZXF1aXJlLnJlc29sdmUoXCJza2lsbHMvcGFja2FnZS5qc29uXCIpO1xuICAgIGNvbnN0IGJpbiA9IGpvaW4ocGtnUGF0aCwgXCIuLlwiLCBcImJpblwiLCBcImNsaS5tanNcIik7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoYmluKSkgcmV0dXJuIHsgY29tbWFuZDogcHJvY2Vzcy5leGVjUGF0aCwgYXJnczogW2Jpbl0gfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gcGVlciBkZXAgYWJzZW50IG9yIHVucmVzb2x2YWJsZSAtIGZldGNoIGZhbGxiYWNrIGhhbmRsZXMgaXRcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZldGNoIGEgc291cmNlIFVSTCBhbmQgd3JpdGUgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB1bmRlciBgdGFyZ2V0YC5cbiAqIFVzZWQgd2hlbiB0aGUgYHNraWxsc2AgQ0xJIGlzbid0IGluc3RhbGxlZDsgc3VwcG9ydHMgYSBkaXJlY3QgYFNLSUxMLm1kYCBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhRmV0Y2goXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoc291cmNlT3B0aW9ucy5zb3VyY2UpO1xuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiIGlzIG5vdCBhIFVSTCBhbmQgdGhlIG9wdGlvbmFsIFwic2tpbGxzXCIgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGRvd25sb2FkKHVybC50b1N0cmluZygpLCByZXNvbHZlTWF4Qnl0ZXMoc291cmNlT3B0aW9ucywgb3B0aW9ucykpO1xuICBjb25zdCBuYW1lID0gc3RyaW5nVXRpbHMudG9TbHVnKGRlcml2ZVNraWxsTmFtZSh1cmwudG9TdHJpbmcoKSkpIHx8IFwicmVtb3RlLXNraWxsXCI7XG4gIGNvbnN0IHNraWxsRGlyID0gam9pbih0YXJnZXQsIG5hbWUpO1xuICBhd2FpdCBta2Rpcihza2lsbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHNraWxsRGlyLCBcIlNLSUxMLm1kXCIpLCBidWZmZXIpO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogVGhlIGVmZmVjdGl2ZSBkb3dubG9hZCBjZWlsaW5nOiBwZXItc291cmNlLCB0aGVuIHRvcC1sZXZlbCwgdGhlbiB0aGUgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNYXhCeXRlcyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIHJldHVybiBzb3VyY2VPcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gb3B0aW9ucy5tYXhEb3dubG9hZEJ5dGVzID8/IERFRkFVTFRfTUFYX0RPV05MT0FEX0JZVEVTO1xufVxuXG4vKiogR0VUIGEgVVJMLCBmYWlsaW5nIGxvdWRseSBvbiBhIG5vbi0yeHggc3RhdHVzIG9yIGFuIG92ZXJzaXplZCBib2R5LiAqL1xuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWQodXJsOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChERUZBVUxUX0RPV05MT0FEX1RJTUVPVVRfTVMpLFxuICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBmYWlsZWQgKCR7dXJsfSk6ICR7ZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKX1gLCB7XG4gICAgICBjYXVzZTogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9ICgke3VybH0pYCk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChidWZmZXIuYnl0ZUxlbmd0aCA+IG1heEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkb3dubG9hZCBleGNlZWRzICR7bWF4Qnl0ZXN9IGJ5dGVzICgke3VybH0pYCk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuLyoqIERlcml2ZSBhIHNraWxsIGRpcmVjdG9yeSBuYW1lIGZyb20gYSBkb3dubG9hZCBVUkwncyBsYXN0IHBhdGggc2VnbWVudC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVNraWxsTmFtZSh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHVybFN0cmluZyk7XG4gIGNvbnN0IGxhc3QgPSB1cmw/LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gXCJcIjtcbiAgcmV0dXJuIGxhc3QucmVwbGFjZSgvXFwuKG1kfHppcHx0YXJ8dGd6fGd6KSQvaSwgXCJcIik7XG59XG5cbi8qKiBBIHNraWxsIGRpcmVjdG9yeSAoaG9sZGluZyBhIGBTS0lMTC5tZGApIHN0YWdlZCBvbiBsb2NhbCBkaXNrLiAqL1xuaW50ZXJmYWNlIFN0YWdlZFNraWxsRGlyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBhYnNvbHV0ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSB1bmRlciBgcm9vdGA6IGEgYHJvb3QvU0tJTEwubWRgIChyb290IElTIHRoZVxuICogc2tpbGwpIG9yIGVhY2ggaW1tZWRpYXRlIGNoaWxkIGRpciB0aGF0IGNvbnRhaW5zIGEgYFNLSUxMLm1kYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFNraWxsRGlycyhyb290OiBzdHJpbmcpOiBQcm9taXNlPFN0YWdlZFNraWxsRGlyW10+IHtcbiAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhyb290KSkpIHJldHVybiBbXTtcbiAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihyb290LCBcIlNLSUxMLm1kXCIpKSkge1xuICAgIGNvbnN0IG5hbWUgPSBwb3NpeC5iYXNlbmFtZShyb290LnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpO1xuICAgIHJldHVybiBbeyBuYW1lLCBhYnNvbHV0ZVBhdGg6IHJvb3QgfV07XG4gIH1cbiAgY29uc3QgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF3YWl0IHJlYWRkaXIocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICBjb25zdCBkaXIgPSBqb2luKHJvb3QsIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGpvaW4oZGlyLCBcIlNLSUxMLm1kXCIpKSkge1xuICAgICAgZGlycy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgYWJzb2x1dGVQYXRoOiBkaXIgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkaXJzO1xufVxuXG4vKipcbiAqIENvcHkgZXZlcnkgc3RhZ2VkIHNraWxsIGRpcmVjdG9yeSBpbnRvIHtAbGluayBkZXN0aW5hdGlvbn0sIHByZXNlcnZpbmcgdGhlXG4gKiBgPHNraWxsPi88cmVsYXRpdmU+YCBsYXlvdXQuIFRoZSBkZXN0aW5hdGlvbiBpcyBqdXN0IGEge0BsaW5rIEZpbGVTeXN0ZW19LFxuICogc28gdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHRyZWUgYW5kIHRoZSBsb2NhbCBmYWxsYmFjayBzaGFyZSBvbmUgY29waWVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uOiBGaWxlU3lzdGVtLCBkaXJzOiBTdGFnZWRTa2lsbERpcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGRlc3RpbmF0aW9uLmluaXQoKTtcbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGZvciAoY29uc3QgcmVsYXRpdmUgb2YgZmluZC5maW5kRmlsZXMoXCIqKi8qXCIsIHsgY3dkOiBkaXIuYWJzb2x1dGVQYXRoLCBub2RpcjogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoam9pbihkaXIuYWJzb2x1dGVQYXRoLCByZWxhdGl2ZSkpO1xuICAgICAgY29uc3Qgc2tpbGxQYXRoID0gcG9zaXguam9pbihkaXIubmFtZSwgcmVsYXRpdmUuc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgICBhd2FpdCBkZXN0aW5hdGlvbi53cml0ZUZpbGUoc2tpbGxQYXRoLCBidWZmZXIsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgc3RhZ2VkIHNraWxsIGRpcnMgaW50byBhIFNUQUJMRSBsb2NhbCB0cmVlIGtleWVkIGJ5IHRoZSBzb3VyY2UsIGFuZFxuICogcmV0dXJuIGl0cyByb290IHBhdGguXG4gKlxuICogQSBnaXZlbiBzb3VyY2UgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgY29udGVudCBvbiBhbG1vc3QgZXZlcnkgYm9vdCwgc28gZWFjaFxuICogb25lIG93bnMgYSBkaXJlY3RvcnkgbmFtZWQgZm9yIGl0cyB7QGxpbmsgY2FjaGVLZXl9IHJhdGhlciB0aGFuIGxlYXZpbmcgYVxuICogZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIHBlciByZXN0YXJ0LiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbmQgaXRzIHBvbGljeVxuICogKG5vdCB0aGUgY29udGVudCkgaXMgd2hhdCBrZWVwcyB0d28gZGlmZmVyZW50IHNvdXJjZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoXG4gKiBvdGhlci5cbiAqXG4gKiBUaGUgbWV0YWRhdGEgaXMgd3JpdHRlbiBJTlNJREUgdGhlIHJlYnVpbGQgcmF0aGVyIHRoYW4gYWZ0ZXIgaXQ6IGByZWJ1aWxkRlNgXG4gKiByZXBsYWNlcyB0aGUgc3RhYmxlIHJvb3Qgd2hvbGVzYWxlLCBzbyBhbnl0aGluZyB3cml0dGVuIGFmdGVyd2FyZHMgd291bGRcbiAqIHN1cnZpdmUgb25seSB1bnRpbCB0aGUgbmV4dCByZWZyZXNoLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBiZWZvcmUgd291bGQgYmVcbiAqIHRocm93biBhd2F5IGJ5IHRoZSBzd2FwLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0TG9jYWxseShcbiAga2V5OiBzdHJpbmcsXG4gIGRpcnM6IFN0YWdlZFNraWxsRGlyW10sXG4gIHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3RhYmxlID0gYXdhaXQgbG9jYWxGUy5yZWJ1aWxkRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCwgYXN5bmMgKHNjcmF0Y2gpID0+IHtcbiAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKHNjcmF0Y2gsIGRpcnMpO1xuICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoc2NyYXRjaCwga2V5LCByZWNvcmQpO1xuICB9KTtcbiAgcmV0dXJuIHN0YWJsZS5yb290O1xufVxuXG4vKipcbiAqIEEgc2NyYXRjaCBmaWxlc3lzdGVtIHdob3NlIHJvb3QgZXhpc3RzIG9uIGRpc2ssIGZvciB0aGUgcGF0aHMgdGhhdCBoYW5kIGFcbiAqIHJlYWwgZGlyZWN0b3J5IHRvIGBub2RlOmZzYCBvciBhIGNoaWxkIHByb2Nlc3MgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICogdGhlIHtAbGluayBGaWxlU3lzdGVtfSBBUEkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVkU2NyYXRjaChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8TG9jYWxGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IHNjcmF0Y2ggPSBsb2NhbEZTLnNjcmF0Y2hGUyhwcmVmaXgpO1xuICBhd2FpdCBzY3JhdGNoLmluaXQoKTtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBleGlzdGVuY2UgY2hlY2suICovXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
745
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLE9BQU8sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILEdBQUcsRUFDSCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFtQixNQUFNLHNCQUFzQixDQUFDO0FBRXpFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxN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LElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFydHVwIHByb3Zpc2lvbmluZyBvZiByZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBmb3IgYSBNYXN0cmEgd29ya3NwYWNlLlxuICpcbiAqIEEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlfSBuYW1lcyBXSEVSRSBhIGBTS0lMTC5tZGAgdHJlZSBjb21lcyBmcm9tIC0gdGhlXG4gKiB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGFueSBnaXQgLyBHaXRMYWIgVVJMLFxuICogb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMIC0gYW5kIG9wdGlvbmFsIHBlci1zb3VyY2UgcG9saWN5LlxuICoge0BsaW5rIHByb3Zpc2lvblJlbW90ZVNraWxsc30gbWF0ZXJpYWxpemVzIGV2ZXJ5IHNvdXJjZSBpbnRvIGEgbG9jYWxcbiAqIGBTS0lMTC5tZGAgdHJlZSBhdCBhcHAgYm9vdCBhbmQgcmV0dXJucyByZWFkLW9ubHkgZmlsZXN5c3RlbSBiYWNraW5ncyBwbHVzXG4gKiB0aGVpciBzdGFibGUgdmlydHVhbCB3b3Jrc3BhY2UgbW91bnRzLlxuICpcbiAqIFJlc29sdXRpb24gcGVyIHNvdXJjZSwgaW4gb3JkZXI6XG4gKlxuICogMS4gdGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQgKGBcImFpdG9vbHNcImApOiBEYXRhYnJpY2tzJyBvd24gc2tpbGxcbiAqICAgIHNldCwgcmVhZCBzdHJhaWdodCBmcm9tIHRoZSBwdWJsaWMgcmVwbyB0aGUgYGRhdGFicmlja3MgYWl0b29sc2AgQ0xJXG4gKiAgICBzb3VyY2VzIGZyb20uIE5vIENMSSwgbm8gRGF0YWJyaWNrcyBhdXRoIC0gd2hpY2ggaXMgd2hhdCBtYWtlcyBpdCB1c2FibGVcbiAqICAgIGluc2lkZSBhIERhdGFicmlja3MgQXBwIGNvbnRhaW5lciwgd2hlcmUgdGhlIENMSSBpcyBub3QgaW5zdGFsbGVkO1xuICogMi4gdGhlIE9QVElPTkFMIGBza2lsbHNgIG5wbSBDTEkgKHBlZXIgZGVwKTogaWYgaW5zdGFsbGVkLCBlYWNoIHNvdXJjZSBpc1xuICogICAgY29waWVkIGludG8gYSBzdGFnaW5nIGRpciB3aXRoIGBza2lsbHMgYWRkIDxzb3VyY2U+IC0tYWdlbnQgPGRpcj4gLS1jb3B5YCxcbiAqICAgIHdoaWNoIHVuZGVyc3RhbmRzIGV2ZXJ5IHNvdXJjZSBmb3JtYXQgdGhlIGVjb3N5c3RlbSBkb2VzIChHaXRIdWJcbiAqICAgIHNob3J0aGFuZCwgZ2l0IFVSTHMsIGFyY2hpdmUvZG93bmxvYWQgVVJMcyk7XG4gKiAzLiBvdGhlcndpc2UgYSBwbGFpbiB7QGxpbmsgZmV0Y2h9IG9mIHRoZSBzb3VyY2UgVVJMIChidWlsdCB3aXRoXG4gKiAgICB7QGxpbmsgbmV0LnVybEJ1aWxkZXJ9KSwgd3JpdGluZyB0aGUgZG93bmxvYWRlZCBgU0tJTEwubWRgIHRvIGEgc3RhZ2luZ1xuICogICAgZGlyLlxuICpcbiAqIEEgc291cmNlIHRoYXQgcmVzb2x2ZXMgdGhyb3VnaCBuZWl0aGVyIHBhdGggZmFpbHMgYXBwIHN0YXJ0dXAsIHVubGVzcyB0aGVcbiAqIHNvdXJjZSAob3IgdGhlIHRvcC1sZXZlbCBjYWxsKSBzZXRzIGBmYWlsT25FcnJvcjogZmFsc2VgLCBpbiB3aGljaCBjYXNlIGl0IGlzXG4gKiBsb2dnZWQgYW5kIHNraXBwZWQgc28gb25lIGJhZCBzb3VyY2UgbmV2ZXIgdGFrZXMgdGhlIGFwcCBkb3duLlxuICpcbiAqIEFJIFRvb2xzIHVzZXMgdGhlIHNoYXJlZCBgQGRieC10b29scy9jYWNoZWAgcHJvamVjdCBjYWNoZSB3aXRoIGEgb25lLWRheSBUVEwsXG4gKiB0aGVuIGh5ZHJhdGVzIG9uZSBwcm9jZXNzLW1lbW9yeSBmaWxlc3lzdGVtIG1vdW50ZWQgYXRcbiAqIHtAbGluayBBSVRPT0xTX1NLSUxMU19NT1VOVH0gZm9yIGV2ZXJ5IGRlZmF1bHQgd29ya3NwYWNlLiBPdGhlciBzb3VyY2VzIGtlZXBcbiAqIGEge0BsaW5rIE1FVEFEQVRBX0ZJTEV9IGJlc2lkZSB0aGVpciBwcm92aXNpb25lZCB0cmVlIGFuZCBkZWZhdWx0IHRvIGFcbiAqIHNldmVuLWRheSByZWZyZXNoIHdpbmRvdy4gUGFzcyBgcmVmcmVzaFR0bE1zOiAwYCB0byBkb3dubG9hZCBvbiBldmVyeSBib290LlxuICpcbiAqIEZvciBub24tQUktVG9vbHMgc291cmNlcywgdGhlIGRlZmF1bHQgZGVzdGluYXRpb24gaXMgdGhlIERhdGFicmlja3Mgd29ya3NwYWNlXG4gKiBBc3Npc3RhbnQgc2tpbGxzIHRyZWUgKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCkuIFBhc3MgYHVzZXJFbWFpbGAgb3JcbiAqIGBkYXRhYnJpY2tzQmFzZVBhdGhgIHRvIHNlbGVjdCBhbm90aGVyIGRlc3RpbmF0aW9uLiBXaGVuIGl0IGlzIHVuYXZhaWxhYmxlLFxuICogdGhlIHRyZWUgaXMgZXhwb3NlZCB0aHJvdWdoIGEgc3RhYmxlIHJlYWQtb25seSBsb2NhbCBtb3VudCBpbnN0ZWFkLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzdGF0LCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcG9zaXggfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBmbHVzaENhY2hlLCBnZXRPclNldCwgcHJvamVjdENhY2hlIH0gZnJvbSBcIkBkYngtdG9vbHMvY2FjaGUvY2FjaGVcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgbG9jYWxGUywgdHlwZSBMb2NhbEZpbGVTeXN0ZW0gfSBmcm9tIFwiQGRieC10b29scy9mc1wiO1xuaW1wb3J0IHsgZmluZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3BhdGhcIjtcbmltcG9ydCB7XG4gIGFzeW5jVXRpbHMsXG4gIGVycm9yVXRpbHMsXG4gIGhhc2gsXG4gIGpzb24sXG4gIGxvZyxcbiAgbmV0LFxuICBvYmplY3QsXG4gIHN0cmluZ1V0aWxzLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBPbmVPck1hbnkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgTWVtb3J5RmlsZVN5c3RlbSwgdHlwZSBGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5cbmltcG9ydCB7IE9SR0FOSVpBVElPTl9TS0lMTFNfUEFUSCwgcGVyc29uYWxTa2lsbHNQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS9yZW1vdGUtc2tpbGxzXCIpO1xuXG4vKipcbiAqIEFnZW50IGlkIHRoZSBgc2tpbGxzYCBDTEkgaW5zdGFsbHMgYSBiYXJlIGBTS0lMTC5tZGAgdHJlZSB1bmRlci5cbiAqXG4gKiBgdW5pdmVyc2FsYCBpcyB0aGUgQ0xJJ3Mgb3duIG5hbWUgZm9yIFwibm8gcGFydGljdWxhciBhZ2VudCwganVzdCB0aGUgcGxhaW5cbiAqIHRyZWVcIiwgd2hpY2ggaXMgd2hhdCB0aGlzIG1vZHVsZSB3YW50cyAtIGl0IHJlLWhvc3RzIHRoZSByZXN1bHQgaXRzZWxmLiBUaGVcbiAqIGlkIG11c3QgYmUgb25lIHRoZSBpbnN0YWxsZWQgQ0xJIGtub3dzOiBhbiB1bnJlY29nbml6ZWQgb25lIGlzIHJlamVjdGVkXG4gKiBvdXRyaWdodCAoYEludmFsaWQgYWdlbnRzOiAuLi5gKSwgdGFraW5nIGV2ZXJ5IG5vbi1gYWl0b29sc2Agc291cmNlIGRvd24gd2l0aFxuICogaXQsIHNpbmNlIGEgQ0xJIGZhaWx1cmUgaXMgYSBoYXJkIGZhaWx1cmUgcmF0aGVyIHRoYW4gYSBmYWxsLXRocm91Z2ggdG9cbiAqIHtAbGluayBzdGFnZVZpYUZldGNofS5cbiAqL1xuY29uc3QgU0tJTExTX0NMSV9BR0VOVCA9IFwidW5pdmVyc2FsXCI7XG5cbi8qKiBXaGVyZSB0aGUgYHNraWxsc2AgQ0xJIGRyb3BzIGEgcGxhaW4gYFNLSUxMLm1kYCB0cmVlIHVuZGVyIGEgdGFyZ2V0IGRpci4gKi9cbmNvbnN0IFNLSUxMU19DTElfTEFZT1VUID0gW1wiLmFnZW50c1wiLCBcInNraWxsc1wiXSBhcyBjb25zdDtcblxuLyoqIENhcCBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBib2R5LCBtYXRjaGluZyB0aGUgYHNraWxsc2AgQ0xJIGRlZmF1bHQuICovXG5jb25zdCBERUZBVUxUX01BWF9ET1dOTE9BRF9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQ7XG5cbi8qKiBNYXhpbXVtIHRpbWUgb25lIHJlbW90ZSBmaWxlIGRvd25sb2FkIG1heSBibG9jayBzdGFydHVwLiAqL1xuY29uc3QgREVGQVVMVF9ET1dOTE9BRF9USU1FT1VUX01TID0gNjBfMDAwO1xuXG4vKiogU3RhYmxlIHRlbXAgZGlyZWN0b3J5IGhvbGRpbmcgb25lIHJlYnVpbHQgc2tpbGwgdHJlZSBwZXIgcmVtb3RlIHNvdXJjZS4gKi9cbmNvbnN0IExPQ0FMX1NLSUxMU19ESVIgPSBcIm1hc3RyYS1sb2NhbC1za2lsbHNcIjtcblxuLyoqIFZpcnR1YWwgd29ya3NwYWNlIHBhdGggcmVzZXJ2ZWQgZm9yIGxvY2FsbHkgcHJvdmlzaW9uZWQgRGF0YWJyaWNrcyBBSSBUb29scy4gKi9cbmV4cG9ydCBjb25zdCBBSVRPT0xTX1NLSUxMU19NT1VOVCA9IFwiLy5kYXRhYnJpY2tzL3NraWxsc1wiO1xuXG4vKiogVmlydHVhbCB3b3Jrc3BhY2Ugcm9vdCBmb3IgZXZlcnkgb3RoZXIgbG9jYWxseSBwcm92aXNpb25lZCByZW1vdGUgc291cmNlLiAqL1xuZXhwb3J0IGNvbnN0IFJFTU9URV9TS0lMTFNfTU9VTlQgPSBcIi8uc2tpbGxzXCI7XG5cbi8qKlxuICogQm9va2tlZXBpbmcgZmlsZSB3cml0dGVuIGF0IHRoZSByb290IG9mIGV2ZXJ5IHByb3Zpc2lvbmVkIHNraWxsIHRyZWUsIG5hbWluZ1xuICogd2hlbiBlYWNoIHNvdXJjZSB3YXMgbGFzdCBkb3dubG9hZGVkLiBBIGRvdGZpbGUgc28gdGhlIHNraWxsIHNjYW5uZXJzLCB3aGljaFxuICogbG9vayBmb3IgYDxkaXI+L1NLSUxMLm1kYCwgbmV2ZXIgbWlzdGFrZSBpdCBmb3IgYSBza2lsbC5cbiAqL1xuY29uc3QgTUVUQURBVEFfRklMRSA9IFwiLm1ldGFkYXRhLmpzb25cIjtcblxuLyoqIFNoYXBlIG1hcmtlciBmb3Ige0BsaW5rIE1FVEFEQVRBX0ZJTEV9OyBhbiB1bmtub3duIHZlcnNpb24gaXMgaWdub3JlZCwgbm90IHJlYWQuICovXG5jb25zdCBNRVRBREFUQV9WRVJTSU9OID0gMTtcblxuLyoqIEhvdyBsb25nIGEgZ2VuZXJhbCBwcm92aXNpb25lZCBzb3VyY2UgaXMgcmV1c2VkIGJlZm9yZSBiZWluZyBkb3dubG9hZGVkIGFnYWluLiAqL1xuY29uc3QgREVGQVVMVF9SRUZSRVNIX1RUTF9NUyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogSG93IGxvbmcgdGhlIHNoYXJlZCBEYXRhYnJpY2tzIEFJIFRvb2xzIHNuYXBzaG90IGlzIHJldXNlZC4gKi9cbmV4cG9ydCBjb25zdCBBSVRPT0xTX1JFRlJFU0hfVFRMX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcblxuY29uc3QgYWlUb29sc0NhY2hlID0gcHJvamVjdENhY2hlKFwibWFzdHJhLWFpdG9vbHNcIiwge1xuICB0dGw6IEFJVE9PTFNfUkVGUkVTSF9UVExfTVMsXG4gIG1heEVudHJpZXM6IDMyLFxufSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBSSBUb29scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTb3VyY2UgY29uc3RhbnQgc2VsZWN0aW5nIERhdGFicmlja3MnIG93biBBSSBUb29scyBza2lsbCBzZXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIG1hc3RyYSh7IHJlbW90ZVNraWxsczogXCJhaXRvb2xzXCIgfSk7XG4gKi9cbmV4cG9ydCBjb25zdCBBSVRPT0xTX1NPVVJDRSA9IFwiYWl0b29sc1wiO1xuXG4vKiogVGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gbGl0ZXJhbCwgZm9yIGNhbGxlcnMgc3BlbGxpbmcgdGhlIHVuaW9uIG91dC4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbHNTb3VyY2UgPSB0eXBlb2YgQUlUT09MU19TT1VSQ0U7XG5cbi8qKlxuICogVGhlIFBVQkxJQyByZXBvIGBkYXRhYnJpY2tzIGFpdG9vbHMgaW5zdGFsbGAgc291cmNlcyBmcm9tLiBSZWFkaW5nIGl0XG4gKiBkaXJlY3RseSBpcyB3aGF0IGxldHMgYW4gYXBwIGdldCB0aGUgc2FtZSBza2lsbHMgdGhlIENMSSBpbnN0YWxscyB3aXRob3V0XG4gKiB0aGUgQ0xJIC0gd2hpY2ggYSBEYXRhYnJpY2tzIEFwcCBjb250YWluZXIgZG9lcyBub3Qgc2hpcC5cbiAqL1xuY29uc3QgQUlUT09MU19SRVBPID0gXCJkYXRhYnJpY2tzL2RhdGFicmlja3MtYWdlbnQtc2tpbGxzXCI7XG5cbi8qKiBSZXBvIHJlZiB0aGUgc2tpbGxzIGFyZSByZWFkIGZyb20uIE92ZXJyaWRlIHBlciBzb3VyY2Ugd2l0aCBgcmVmYC4gKi9cbmNvbnN0IEFJVE9PTFNfUkVGID0gXCJtYWluXCI7XG5cbi8qKiBTa2lsbCBmaWxlcyBkb3dubG9hZGVkIGF0IG9uY2U7IHRoZSBzZXQgaXMgfjMwIHNraWxscyBvZiBhIGZldyBmaWxlcyBlYWNoLiAqL1xuY29uc3QgQUlUT09MU19DT05DVVJSRU5DWSA9IDg7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIHRoZSByZXBvJ3MgZ2VuZXJhdGVkIGBtYW5pZmVzdC5qc29uYCB0aGlzIG1vZHVsZSByZWFkcy4gKi9cbmludGVyZmFjZSBBaVRvb2xzTWFuaWZlc3Qge1xuICBza2lsbHM/OiBSZWNvcmQ8c3RyaW5nLCB7IGZpbGVzPzogc3RyaW5nW107IHJlcG9fZGlyPzogc3RyaW5nIH0+O1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSByZW1vdGUgc2tpbGwgc291cmNlIGFuZCBpdHMgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKlxuICogYHNvdXJjZWAgaXMge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBvciBhbnl0aGluZyB0aGUgYHNraWxsc2AgZWNvc3lzdGVtXG4gKiB1bmRlcnN0YW5kczogYSBHaXRIdWIgYG93bmVyL3JlcG9gIHNob3J0aGFuZCwgYSBmdWxsIEdpdEh1YiAvIEdpdExhYiAvIGdpdFxuICogVVJMLCBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgdG8gYSBgU0tJTEwubWRgIG9yIGFyY2hpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zIHtcbiAgLyoqIGBcImFpdG9vbHNcImAsIGEgR2l0SHViIHNob3J0aGFuZCwgYSBnaXQgLyBHaXRMYWIgVVJMLCBvciBhIGRvd25sb2FkIFVSTC4gKi9cbiAgc291cmNlOiBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2U7XG4gIC8qKiBTdGFibGUgdmlydHVhbCBtb3VudCBuYW1lIHVuZGVyIGAvLnNraWxsc2A7IGdlbmVyYXRlZCBmcm9tIHRoZSBzb3VyY2Ugd2hlbiBvbWl0dGVkLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogSW5zdGFsbCBvbmx5IHRoZXNlIHNraWxsIG5hbWVzIGZyb20gdGhlIHNvdXJjZS4gKi9cbiAgc2tpbGxzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBJbmNsdWRlIGV4cGVyaW1lbnRhbCBza2lsbHMuIGBcImFpdG9vbHNcImAgb25seS4gKi9cbiAgZXhwZXJpbWVudGFsPzogYm9vbGVhbjtcbiAgLyoqIFBpbiB0aGUgcmVwbyByZWYgKHRhZyAvIGJyYW5jaCAvIHNoYSkuIGBcImFpdG9vbHNcImAgb25seTsgZGVmYXVsdHMgdG8gYG1haW5gLiAqL1xuICByZWY/OiBzdHJpbmc7XG4gIC8qKiBPdmVycmlkZSB0aGUgYnl0ZSBjZWlsaW5nIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkIGZvciB0aGlzIHNvdXJjZS4gKi9cbiAgbWF4RG93bmxvYWRCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoaXMgc291cmNlJ3MgcHJvdmlzaW9uZWQgdHJlZSBpcyByZXVzZWQgYmVmb3JlIGl0IGlzIGRvd25sb2FkZWRcbiAgICogYWdhaW4sIGluIG1pbGxpc2Vjb25kcy4gT3ZlcnJpZGVzIHRoZSB0b3AtbGV2ZWxcbiAgICoge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMucmVmcmVzaFR0bE1zfTsgYDBgIHJlLWRvd25sb2FkcyBvblxuICAgKiBldmVyeSBib290LlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hlbiBgZmFsc2VgLCBhIHNvdXJjZSB0aGF0IGZhaWxzIHRvIHJlc29sdmUgaXMgbG9nZ2VkIGFuZCBza2lwcGVkIGluc3RlYWRcbiAgICogb2YgZmFpbGluZyBhcHAgc3RhcnR1cC4gT3ZlcnJpZGVzIHRoZSB0b3AtbGV2ZWwge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMuZmFpbE9uRXJyb3J9LlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgcmVtb3RlIHNraWxsIHNvdXJjZTogdGhlIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgVVJMLWxpa2VcbiAqIChzdHJpbmcgLyBgVVJMYCAvIGB7IHVybCB9YCksIG9yIGEge0BsaW5rIFJlbW90ZVNraWxsU291cmNlT3B0aW9uc30gYmFnIHdpdGhcbiAqIHBlci1zb3VyY2UgcG9saWN5LlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbFNvdXJjZSA9IG5ldC5VcmxMaWtlIHwgQWlUb29sc1NvdXJjZSB8IFJlbW90ZVNraWxsU291cmNlT3B0aW9ucztcblxuLyoqXG4gKiBUaGUgd29ya3NwYWNlIGByZW1vdGVTa2lsbHNgIG9wdGlvbjogb25lIHNvdXJjZSwgYSBub24tZW1wdHkgbGlzdCBvZiB0aGVtLCBvclxuICogYSB7QGxpbmsgUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9uc30gYmFnIHdoZW4gdG9wLWxldmVsIHBvbGljeSBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFJlbW90ZVNraWxsc09wdGlvbiA9XG4gIFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPiB8IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnM7XG5cbi8qKiBBIHNvdXJjZSBlbnRyeSB3aXRoIGl0cyBgc291cmNlYCBmbGF0dGVuZWQgdG8gYSBwbGFpbiBzdHJpbmcuICovXG50eXBlIE5vcm1hbGl6ZWRTb3VyY2UgPSBPbWl0PFJlbW90ZVNraWxsU291cmNlT3B0aW9ucywgXCJzb3VyY2VcIj4gJiB7IHNvdXJjZTogc3RyaW5nIH07XG5cbi8qKiBSZWFkLW9ubHkgbG9jYWwgZGlyZWN0b3J5IGV4cG9zZWQgYXQgYSBzdGFibGUgdmlydHVhbCB3b3Jrc3BhY2UgcGF0aC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxTa2lsbERpcmVjdG9yeU1vdW50IHtcbiAgLyoqIFBoeXNpY2FsIGxvY2FsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwcm92aXNpb25lZCBgU0tJTEwubWRgIHRyZWUuICovXG4gIHJvb3Q6IHN0cmluZztcbiAgLyoqIFZpcnR1YWwgcGF0aCBhZ2VudHMgc2VlIGluc2lkZSB0aGUgY29tcG9zZWQgTWFzdHJhIHdvcmtzcGFjZS4gKi9cbiAgbW91bnRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKiBSZWFkLW9ubHkgcHJvY2Vzcy1sb2NhbCBmaWxlc3lzdGVtIGV4cG9zZWQgYXQgYSBzdGFibGUgdmlydHVhbCB3b3Jrc3BhY2UgcGF0aC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5U2tpbGxNb3VudCB7XG4gIC8qKiBQcm9jZXNzLXNoYXJlZCBmaWxlc3lzdGVtIGNvbnRhaW5pbmcgdGhlIHByb3Zpc2lvbmVkIGBTS0lMTC5tZGAgdHJlZS4gKi9cbiAgZmlsZXN5c3RlbTogRmlsZVN5c3RlbTtcbiAgLyoqIFZpcnR1YWwgcGF0aCBhZ2VudHMgc2VlIGluc2lkZSB0aGUgY29tcG9zZWQgTWFzdHJhIHdvcmtzcGFjZS4gKi9cbiAgbW91bnRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKiBMb2NhbCBza2lsbCBiYWNraW5nIGFjY2VwdGVkIGJ5IGV2ZXJ5IGF1dG8tY3JlYXRlZCB3b3Jrc3BhY2UuICovXG5leHBvcnQgdHlwZSBMb2NhbFNraWxsTW91bnQgPSBMb2NhbFNraWxsRGlyZWN0b3J5TW91bnQgfCBNZW1vcnlTa2lsbE1vdW50O1xuXG4vKiogVG9wLWxldmVsIHJlbW90ZS1za2lsbHMgcHJvdmlzaW9uaW5nIG9wdGlvbnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICAvKiogU291cmNlcyB0byBtYXRlcmlhbGl6ZSBhdCBzdGFydHVwLiAqL1xuICBzb3VyY2VzOiBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT47XG4gIC8qKlxuICAgKiBGYWlsIGFwcCBzdGFydHVwIHdoZW4gYSBzb3VyY2UgY2FuJ3QgYmUgcmVzb2x2ZWQuIERlZmF1bHRzIHRvIGB0cnVlYC4gQVxuICAgKiBwZXItc291cmNlIGBmYWlsT25FcnJvcmAgd2lucyBvdmVyIHRoaXMuXG4gICAqL1xuICBmYWlsT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIHBhdGggdGhhdCByb290cyB0aGUgZGVzdGluYXRpb24gQXNzaXN0YW50IHNraWxscyB0cmVlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgT0JPIHVzZXIncyBgL1dvcmtzcGFjZS9Vc2Vycy88ZW1haWw+Ly5hc3Npc3RhbnQvc2tpbGxzYC5cbiAgICovXG4gIGRhdGFicmlja3NCYXNlUGF0aD86IHN0cmluZztcbiAgLyoqIEF1dGgtc2NvcGVkIERhdGFicmlja3MgY2xpZW50LiBEZWZhdWx0cyB0byB0aGUgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xuICBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnRMaWtlO1xuICAvKiogVXNlciBlbWFpbCB1c2VkIHRvIGRlcml2ZSB0aGUgZGVmYXVsdCBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uLiAqL1xuICB1c2VyRW1haWw/OiBzdHJpbmc7XG4gIC8qKiBCeXRlIGNlaWxpbmcgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQuIERlZmF1bHRzIHRvIDEwIE1pQi4gKi9cbiAgbWF4RG93bmxvYWRCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIEhvdyBsb25nIGEgcHJvdmlzaW9uZWQgdHJlZSBpcyByZXVzZWQgYmVmb3JlIGl0cyBzb3VyY2UgaXMgZG93bmxvYWRlZFxuICAgKiBhZ2FpbiwgaW4gbWlsbGlzZWNvbmRzLiBBSSBUb29scyBkZWZhdWx0cyB0byBvbmUgZGF5IGFuZCBvdGhlciBzb3VyY2VzIHRvXG4gICAqIHNldmVuIGRheXM7IGAwYCByZS1kb3dubG9hZHMgb24gZXZlcnkgYm9vdC4gQSBwZXItc291cmNlIGByZWZyZXNoVHRsTXNgIHdpbnMuXG4gICAqL1xuICByZWZyZXNoVHRsTXM/OiBudW1iZXI7XG59XG5cbi8qKiBXaGF0IHtAbGluayBwcm92aXNpb25SZW1vdGVTa2lsbHN9IHJlc29sdmVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25lZFJlbW90ZVNraWxscyB7XG4gIC8qKlxuICAgKiBFeHRyYSByZWFkLW9ubHkgbG9jYWwgb3IgcHJvY2Vzcy1tZW1vcnkgc2tpbGwgbW91bnRzIHRvIGhhbmQgTWFzdHJhLiBBSVxuICAgKiBUb29scyBhbHdheXMgdXNlcyBwcm9jZXNzIG1lbW9yeTsgb3RoZXIgc291cmNlcyB1c2UgdGhpcyBmYWxsYmFjayB3aGVuXG4gICAqIHRoZXkgY291bGQgbm90IGJlIHdyaXR0ZW4gdG8gRGF0YWJyaWNrcy4gUGh5c2ljYWwgcGF0aHMgcmVtYWluIGhpZGRlblxuICAgKiBiZWhpbmQgc3RhYmxlIHZpcnR1YWwgd29ya3NwYWNlIHBhdGhzLlxuICAgKi9cbiAgbG9jYWxTa2lsbE1vdW50czogTG9jYWxTa2lsbE1vdW50W107XG4gIC8qKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uIGVhY2ggc291cmNlIHdhcyB3cml0dGVuIHRvLCBpZiBhbnkuICovXG4gIGRhdGFicmlja3NCYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIE5hbWVzIG9mIGV2ZXJ5IHNraWxsIGRpcmVjdG9yeSBub3cgYXZhaWxhYmxlLCB3aGV0aGVyIGl0IHdhcyBkb3dubG9hZGVkIG9uXG4gICAqIHRoaXMgYm9vdCBvciByZXVzZWQgZnJvbSBhIHN0aWxsLWZyZXNoIHRyZWUgKHNlZSB7QGxpbmsgTUVUQURBVEFfRklMRX0pLlxuICAgKi9cbiAgc2tpbGxOYW1lczogc3RyaW5nW107XG59XG5cbi8qKlxuICogTWV0YWRhdGEgZm9yIG9uZSByZXNvbHZlZCBzb3VyY2Ugc25hcHNob3QuIEdlbmVyYWwgcmVtb3RlIHNvdXJjZXMgc3RvcmUgaXRcbiAqIGluIHtAbGluayBNRVRBREFUQV9GSUxFfTsgQUkgVG9vbHMgc3RvcmVzIGl0IHdpdGggdGhlIGNhY2hlLXBhY2thZ2UgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlU2tpbGxDYWNoZUVudHJ5IHtcbiAgLyoqIFRoZSBzb3VyY2Ugc3RyaW5nIHRoaXMgZW50cnkgd2FzIGRvd25sb2FkZWQgZnJvbSwgZm9yIHJlYWRhYmlsaXR5LiAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhlIGRvd25sb2FkIGNvbXBsZXRlZCwgSVNPLTg2MDEuICovXG4gIGRvd25sb2FkZWRBdDogc3RyaW5nO1xuICAvKiogU2tpbGwgZGlyZWN0b3J5IG5hbWVzIHRoZSBkb3dubG9hZCBwcm9kdWNlZC4gKi9cbiAgc2tpbGxzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBjb250ZW50LWFmZmVjdGluZyBwb2xpY3kgdGhhdCBkb3dubG9hZCB1c2VkLiBBbHNvIGZvbGRlZCBpbnRvIHRoZSBlbnRyeVxuICAgKiBLRVksIHNvIG5hcnJvd2luZyBgc2tpbGxzYCBvciBtb3ZpbmcgYHJlZmAgbWlzc2VzIHRoZSBjYWNoZSBpbnN0ZWFkIG9mXG4gICAqIHNpbGVudGx5IHNlcnZpbmcgdGhlIHByZXZpb3VzIHNlbGVjdGlvbi5cbiAgICovXG4gIHBvbGljeT86IHsgc2tpbGxzPzogc3RyaW5nW107IGV4cGVyaW1lbnRhbD86IGJvb2xlYW47IHJlZj86IHN0cmluZyB9O1xufVxuXG4vKiogVGhlIHtAbGluayBNRVRBREFUQV9GSUxFfSBkb2N1bWVudDogb25lIGVudHJ5IHBlciBwcm92aXNpb25lZCBzb3VyY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsc01ldGFkYXRhIHtcbiAgdmVyc2lvbjogbnVtYmVyO1xuICBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBSZW1vdGVTa2lsbENhY2hlRW50cnk+O1xufVxuXG5pbnRlcmZhY2UgQ2FjaGVkU2tpbGxGaWxlIHtcbiAgcGF0aDogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDYWNoZWRBaVRvb2xzVHJlZSB7XG4gIGZpbGVzOiBDYWNoZWRTa2lsbEZpbGVbXTtcbiAgcmVjb3JkOiBSZW1vdGVTa2lsbENhY2hlRW50cnk7XG59XG5cbmludGVyZmFjZSBSZXNvbHZlZEFpVG9vbHNUcmVlIGV4dGVuZHMgQ2FjaGVkQWlUb29sc1RyZWUge1xuICBjYWNoZWQ6IGJvb2xlYW47XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBOb3JtYWxpemUgdGhlIGByZW1vdGVTa2lsbHNgIG9wdGlvbiBpbnRvIGEgZmxhdCBvcHRpb25zIGJhZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZW1vdGVTa2lsbHNPcHRpb24oXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgYmFnID0gaXNQcm92aXNpb25PcHRpb25zKG9wdGlvbikgPyBvcHRpb24gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNvdXJjZXMgPSB0b1NvdXJjZUxpc3QoYmFnID8gYmFnLnNvdXJjZXMgOiAob3B0aW9uIGFzIFJlbW90ZVNraWxsU291cmNlKSk7XG4gIC8vIEFuIGVtcHR5IGxpc3QgaXMgdGhlIHNhbWUgYXMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwuXG4gIGlmICghb2JqZWN0LmlzT25lT3JNYW55KHNvdXJjZXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4geyAuLi5iYWcsIHNvdXJjZXMgfTtcbn1cblxuLyoqIEEgYHNvdXJjZXNgLWJlYXJpbmcgYmFnIGlzIHRoZSB0b3AtbGV2ZWwgb3B0aW9ucyBzaGFwZSwgbm90IGEgc2luZ2xlIHNvdXJjZS4gKi9cbmZ1bmN0aW9uIGlzUHJvdmlzaW9uT3B0aW9ucyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMge1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSAmJiBcInNvdXJjZXNcIiBpbiB2YWx1ZTtcbn1cblxuLyoqIE9uZSBzb3VyY2Ugb3IgbWFueSwgYXMgYSBwbGFpbiBhcnJheS4gQSBzb3VyY2UgaXMgbmV2ZXIgaXRzZWxmIGFuIGFycmF5LiAqL1xuZnVuY3Rpb24gdG9Tb3VyY2VMaXN0KFxuICBpbnB1dDogUmVtb3RlU2tpbGxTb3VyY2UgfCBPbmVPck1hbnk8UmVtb3RlU2tpbGxTb3VyY2U+LFxuKTogUmVtb3RlU2tpbGxTb3VyY2VbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IFsuLi5pbnB1dF0gOiBbaW5wdXRdO1xufVxuXG4vKiogRmxhdHRlbiBhIHNvdXJjZSBlbnRyeSAtIHN0cmluZywgYFVSTGAsIGB7IHVybCB9YCwgb3Igb3B0aW9ucyBiYWcgLSB0byBhIHtAbGluayBOb3JtYWxpemVkU291cmNlfS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlT3B0aW9ucyhzb3VyY2U6IFJlbW90ZVNraWxsU291cmNlKTogTm9ybWFsaXplZFNvdXJjZSB7XG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBzb3VyY2UgfTtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVSTCkgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudG9TdHJpbmcoKSB9O1xuICBpZiAoXCJzb3VyY2VcIiBpbiBzb3VyY2UpIHJldHVybiB7IC4uLnNvdXJjZSwgc291cmNlOiB0b1NvdXJjZVN0cmluZyhzb3VyY2Uuc291cmNlKSB9O1xuICByZXR1cm4geyBzb3VyY2U6IHNvdXJjZS51cmwgfTtcbn1cblxuLyoqIEEge0BsaW5rIG5ldC5VcmxMaWtlfSBhcyB0aGUgcGxhaW4gc3RyaW5nIHRoZSBzdGFnaW5nIHBhdGhzIHdvcmsgd2l0aC4gKi9cbmZ1bmN0aW9uIHRvU291cmNlU3RyaW5nKHNvdXJjZTogbmV0LlVybExpa2UpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHNvdXJjZTtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIFVSTCA/IHNvdXJjZS50b1N0cmluZygpIDogc291cmNlLnVybDtcbn1cblxuLyoqIFRydWUgd2hlbiBhIHNvdXJjZSBzZWxlY3RzIHRoZSBidWlsdC1pbiBEYXRhYnJpY2tzIEFJIFRvb2xzIHNraWxsIHNldC4gKi9cbmZ1bmN0aW9uIGlzQWlUb29sc1NvdXJjZShzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc291cmNlLnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBBSVRPT0xTX1NPVVJDRTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2FjaGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgcG9saWN5IHRoYXQgZGVjaWRlcyB3aGF0IGEgc291cmNlJ3MgZG93bmxvYWQgQ09OVEFJTlMuXG4gKlxuICogT25seSB0aGVzZSB0aHJlZSBjaGFuZ2UgdGhlIHJlc3VsdGluZyB0cmVlLCBzbyBvbmx5IHRoZXNlIGJlbG9uZyBpbiB0aGUgY2FjaGVcbiAqIGtleSAtIGBmYWlsT25FcnJvcmAgYW5kIGBtYXhEb3dubG9hZEJ5dGVzYCBnb3Zlcm4gaG93IGEgZmFpbHVyZSBpcyBoYW5kbGVkLFxuICogbm90IHdoYXQgYSBzdWNjZXNzIHByb2R1Y2VzLlxuICovXG5mdW5jdGlvbiBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5W1wicG9saWN5XCJdIHtcbiAgY29uc3Qgc2tpbGxzID0gc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKTtcbiAgY29uc3QgcG9saWN5ID0ge1xuICAgIC4uLihza2lsbHMubGVuZ3RoID4gMCA/IHsgc2tpbGxzOiBbLi4uc2tpbGxzXS5zb3J0KCkgfSA6IHt9KSxcbiAgICAuLi4oc291cmNlT3B0aW9ucy5leHBlcmltZW50YWwgPT09IHRydWUgPyB7IGV4cGVyaW1lbnRhbDogdHJ1ZSB9IDoge30pLFxuICAgIC4uLihzdHJpbmdVdGlscy50cmltVG9OdWxsKHNvdXJjZU9wdGlvbnMucmVmKSA/IHsgcmVmOiBzb3VyY2VPcHRpb25zLnJlZiEudHJpbSgpIH0gOiB7fSksXG4gIH07XG4gIHJldHVybiBPYmplY3Qua2V5cyhwb2xpY3kpLmxlbmd0aCA+IDAgPyBwb2xpY3kgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RhYmxlIGlkZW50aXR5IG9mIGEgc291cmNlIEFORCBpdHMgY29udGVudC1hZmZlY3RpbmcgcG9saWN5LlxuICpcbiAqIEtleWluZyBvbiB0aGUgc291cmNlIGFsb25lIHdvdWxkIGxldCBhIGNoYW5nZWQgYHNraWxsc2AgZmlsdGVyIG9yIGByZWZgIHJlYWRcbiAqIGJhY2sgdGhlIHByZXZpb3VzIGRvd25sb2FkIGZvciBhIGRheTsga2V5aW5nIG9uIGJvdGggdHVybnMgdGhhdCBpbnRvIGEgbWlzcy5cbiAqIFRoZSBza2lsbCBsaXN0IGlzIHNvcnRlZCBmaXJzdCBzbyBhIHJlb3JkZXJlZCBhcnJheSBpcyBzdGlsbCB0aGUgc2FtZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGNhY2hlS2V5KHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UpOiBzdHJpbmcge1xuICByZXR1cm4gaGFzaC5mbnZIYXNoKFxuICAgIEpTT04uc3RyaW5naWZ5KHsgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSwgcG9saWN5OiBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zKSA/PyBudWxsIH0pLFxuICApO1xufVxuXG4vKiogU3RhYmxlIHZpcnR1YWwgd29ya3NwYWNlIHBhdGggZm9yIG9uZSBsb2NhbGx5IHByb3Zpc2lvbmVkIHNvdXJjZS4gKi9cbmZ1bmN0aW9uIGxvY2FsU2tpbGxNb3VudFBhdGgoc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaXNBaVRvb2xzU291cmNlKHNvdXJjZU9wdGlvbnMuc291cmNlKSkgcmV0dXJuIEFJVE9PTFNfU0tJTExTX01PVU5UO1xuICBjb25zdCBjb25maWd1cmVkTmFtZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoc291cmNlT3B0aW9ucy5uYW1lKTtcbiAgY29uc3QgaWRlbnRpZmllciA9IGNvbmZpZ3VyZWROYW1lXG4gICAgPyBzdHJpbmdVdGlscy50b1NsdWcoY29uZmlndXJlZE5hbWUpXG4gICAgOiBzdHJpbmdVdGlscy50b1NsdWcocmVtb3RlU291cmNlSWRlbnRpZmllcihzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHx8IFwic291cmNlXCI7XG4gIGlmICghaWRlbnRpZmllcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByZW1vdGUgc2tpbGwgc291cmNlIG5hbWUgbXVzdCBjb250YWluIGxldHRlcnMgb3IgbnVtYmVyczogXCIke2NvbmZpZ3VyZWROYW1lfVwiYCxcbiAgICApO1xuICB9XG4gIHJldHVybiBwb3NpeC5qb2luKFJFTU9URV9TS0lMTFNfTU9VTlQsIGNvbmZpZ3VyZWROYW1lID8gaWRlbnRpZmllciA6IGAke2lkZW50aWZpZXJ9LSR7a2V5fWApO1xufVxuXG4vKiogSHVtYW4tcmVhZGFibGUgc291cmNlIHBvcnRpb24gdXNlZCBieSBnZW5lcmF0ZWQgdmlydHVhbCBtb3VudCBpZGVudGlmaWVycy4gKi9cbmZ1bmN0aW9uIHJlbW90ZVNvdXJjZUlkZW50aWZpZXIoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcihzb3VyY2UpO1xuICBpZiAoIXVybCkgcmV0dXJuIHNvdXJjZTtcbiAgY29uc3QgcGF0aCA9IHVybC5wYXRobmFtZS5yZXBsYWNlKC9cXC4oZ2l0fG1kfHppcHx0YXJ8dGd6fGd6KSQvaSwgXCJcIik7XG4gIHJldHVybiBgJHt1cmwuaG9zdG5hbWV9LSR7cGF0aH1gO1xufVxuXG4vKiogVGhlIGVmZmVjdGl2ZSByZXVzZSB3aW5kb3c6IHBlci1zb3VyY2UsIHRvcC1sZXZlbCwgdGhlbiB0aGUgc291cmNlIGRlZmF1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlUmVmcmVzaFR0bChcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIHJldHVybiAoXG4gICAgc291cmNlT3B0aW9ucy5yZWZyZXNoVHRsTXMgPz9cbiAgICBvcHRpb25zLnJlZnJlc2hUdGxNcyA/P1xuICAgIChpc0FpVG9vbHNTb3VyY2Uoc291cmNlT3B0aW9ucy5zb3VyY2UpID8gQUlUT09MU19SRUZSRVNIX1RUTF9NUyA6IERFRkFVTFRfUkVGUkVTSF9UVExfTVMpXG4gICk7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgbWV0YWRhdGEgZG9jdW1lbnQgYXQgdGhlIHJvb3Qgb2YgYSBwcm92aXNpb25lZCB0cmVlLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiB0aGVyZSBpcyBub25lLCBpdCBpcyB1bnJlYWRhYmxlLCBvciBpdCB3YXMgd3JpdHRlbiBieSBhIHNoYXBlIHRoaXNcbiAqIHZlcnNpb24gZG9lcyBub3Qga25vdy5cbiAqXG4gKiBOZXZlciB0aHJvd3M6IGEgbWlzc2luZyBvciBjb3JydXB0IHJlY29yZCBpcyBhIGNhY2hlIE1JU1MsIHdoaWNoIGNvc3RzIGFcbiAqIGRvd25sb2FkIC0gd2hpbGUgbGV0dGluZyBpdCBmYWlsIHdvdWxkIHRha2UgYXBwIHN0YXJ0dXAgZG93biBvdmVyXG4gKiBib29ra2VlcGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZE1ldGFkYXRhKGZzOiBGaWxlU3lzdGVtKTogUHJvbWlzZTxSZW1vdGVTa2lsbHNNZXRhZGF0YSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyhNRVRBREFUQV9GSUxFKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZnMucmVhZEZpbGUoTUVUQURBVEFfRklMRSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgY29uc3QgcGFyc2VkID0ganNvbi5wYXJzZShyYXcsIHVuZGVmaW5lZCkgYXMgUmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFyc2VkKSB8fCBwYXJzZWQudmVyc2lvbiAhPT0gTUVUQURBVEFfVkVSU0lPTikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHBhcnNlZC5zb3VyY2VzKSA/IHBhcnNlZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiY2FjaGU6dW5yZWFkYWJsZVwiLCB7IGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGVudHJ5IGlzIHN0aWxsIGluc2lkZSBpdHMgcmV1c2Ugd2luZG93LlxuICpcbiAqIEEgYHR0bE1zYCBvZiBgMGAgZGlzYWJsZXMgcmV1c2Ugb3V0cmlnaHQsIGFuZCBhbiB1bnBhcnNlYWJsZSBvciBGVVRVUkVcbiAqIHRpbWVzdGFtcCBjb3VudHMgYXMgc3RhbGUgLSBhIGNsb2NrIHRoYXQgbW92ZWQgYmFja3dhcmRzIHNob3VsZCBjb3N0IG9uZVxuICogZXh0cmEgZG93bmxvYWQsIG5vdCBwaW4gYSB0cmVlIGFzIGZyZXNoIGluZGVmaW5pdGVseS5cbiAqL1xuZnVuY3Rpb24gaXNGcmVzaChlbnRyeTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCB0dGxNczogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmICh0dGxNcyA8PSAwIHx8ICFBcnJheS5pc0FycmF5KGVudHJ5LnNraWxscykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZG93bmxvYWRlZEF0ID0gb2JqZWN0LnRvRGF0ZShlbnRyeS5kb3dubG9hZGVkQXQpO1xuICBpZiAoIWRvd25sb2FkZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gZG93bmxvYWRlZEF0LmdldFRpbWUoKTtcbiAgcmV0dXJuIGFnZSA+PSAwICYmIGFnZSA8IHR0bE1zO1xufVxuXG4vKipcbiAqIE1lcmdlIG9uZSBzb3VyY2UncyBlbnRyeSBpbnRvIHRoZSB0cmVlJ3MgbWV0YWRhdGEgZG9jdW1lbnQsIHByZXNlcnZpbmcgd2hhdFxuICogb3RoZXIgc291cmNlcyByZWNvcmRlZCAtIHRoZSBEYXRhYnJpY2tzIGRlc3RpbmF0aW9uIGlzIFNIQVJFRCwgc28gYSBibGluZFxuICogb3ZlcndyaXRlIHdvdWxkIGRyb3AgZXZlcnkgc2libGluZyBzb3VyY2UncyB0aW1lc3RhbXAgYW5kIHJlLWRvd25sb2FkIHRoZVxuICogbG90IG9uIHRoZSBuZXh0IGJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWV0YWRhdGEoXG4gIGZzOiBGaWxlU3lzdGVtLFxuICBrZXk6IHN0cmluZyxcbiAgZW50cnk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjdXJyZW50ID0gYXdhaXQgcmVhZE1ldGFkYXRhKGZzKTtcbiAgY29uc3QgbmV4dDogUmVtb3RlU2tpbGxzTWV0YWRhdGEgPSB7XG4gICAgdmVyc2lvbjogTUVUQURBVEFfVkVSU0lPTixcbiAgICBzb3VyY2VzOiB7IC4uLmN1cnJlbnQ/LnNvdXJjZXMsIFtrZXldOiBlbnRyeSB9LFxuICB9O1xuICBhd2FpdCBmcy53cml0ZUZpbGUoTUVUQURBVEFfRklMRSwgYCR7SlNPTi5zdHJpbmdpZnkobmV4dCwgbnVsbCwgMil9XFxuYCwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG59XG5cbi8qKiBUaGUgc3RhYmxlIGxvY2FsIHRyZWUgYSBzb3VyY2UgaXMgcmVidWlsdCBpbnRvLCBrZXllZCBieSB7QGxpbmsgY2FjaGVLZXl9LiAqL1xuZnVuY3Rpb24gbG9jYWxTa2lsbHNGUyhrZXk6IHN0cmluZyk6IExvY2FsRmlsZVN5c3RlbSB7XG4gIHJldHVybiBsb2NhbEZTLnRtcEZTKGAke0xPQ0FMX1NLSUxMU19ESVJ9LyR7a2V5fWApO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplIGV2ZXJ5IGNvbmZpZ3VyZWQgcmVtb3RlIHNraWxsIHNvdXJjZSBhdCBhcHAgc3RhcnR1cC5cbiAqXG4gKiBXcml0ZXMgZWFjaCByZXNvbHZlZCBgU0tJTEwubWRgIHRyZWUgdG8gdGhlIERhdGFicmlja3MgdXNlciBBc3Npc3RhbnQgc2tpbGxzXG4gKiBmb2xkZXIgd2hlbiBhIHdyaXRhYmxlIHdvcmtzcGFjZSBpcyBhdmFpbGFibGUsIGVsc2UgdW5kZXJcbiAqIHtAbGluayBsb2NhbEZTLnRtcEZTfSByZXR1cm5lZCBpbiB7QGxpbmsgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMubG9jYWxTa2lsbE1vdW50c30uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aXNpb25SZW1vdGVTa2lsbHMoXG4gIG9wdGlvbjogUmVtb3RlU2tpbGxzT3B0aW9uIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxQcm92aXNpb25lZFJlbW90ZVNraWxscz4ge1xuICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKG9wdGlvbik7XG4gIGNvbnN0IGVtcHR5OiBQcm92aXNpb25lZFJlbW90ZVNraWxscyA9IHsgbG9jYWxTa2lsbE1vdW50czogW10sIHNraWxsTmFtZXM6IFtdIH07XG4gIGlmICghb3B0aW9ucykgcmV0dXJuIGVtcHR5O1xuXG4gIGNvbnN0IGZhaWxEZWZhdWx0ID0gb3B0aW9ucy5mYWlsT25FcnJvciAhPT0gZmFsc2U7XG4gIGNvbnN0IHNvdXJjZXMgPSAoQXJyYXkuaXNBcnJheShvcHRpb25zLnNvdXJjZXMpID8gb3B0aW9ucy5zb3VyY2VzIDogW29wdGlvbnMuc291cmNlc10pLm1hcChcbiAgICB0b1NvdXJjZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGNsaWVudCA9IG9wdGlvbnMuY2xpZW50ID8/IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudDtcbiAgLy8gUHJvYmVkIHJhdGhlciB0aGFuIGFzc3VtZWQ6IGFuIGlkZW50aXR5IHRoYXQgY2Fubm90IHdyaXRlIHRoZSB3b3Jrc3BhY2VcbiAgLy8gdHJlZSBmYWxscyBiYWNrIHRvIHRoZSBsb2NhbCBvbmUgaW5zdGVhZCBvZiBmYWlsaW5nIHN0YXJ0dXAuIFRoZSBwcm9iZSBhbHNvXG4gIC8vIGNyZWF0ZXMgdGhlIHJvb3QsIHdoaWNoIHRoZSBmaXJzdCBjYWNoZSBSRUFEIG5lZWRzIC0gYGNvcHlTa2lsbERpcnNgIHdvdWxkXG4gIC8vIG90aGVyd2lzZSBiZSB0aGUgZmlyc3QgdGhpbmcgdG8gY3JlYXRlIGl0LCB3aGljaCBpcyB0b28gbGF0ZS5cbiAgY29uc3QgcmVxdWVzdGVkQmFzZVBhdGggPSBzb3VyY2VzLnNvbWUoKHNvdXJjZSkgPT4gIWlzQWlUb29sc1NvdXJjZShzb3VyY2Uuc291cmNlKSlcbiAgICA/IHJlc29sdmVEYXRhYnJpY2tzQmFzZVBhdGgob3B0aW9ucywgY2xpZW50KVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IHJlcXVlc3RlZEJhc2VQYXRoXG4gICAgPyBhd2FpdCBvcGVuV3JpdGFibGVXb3Jrc3BhY2UocmVxdWVzdGVkQmFzZVBhdGgsIGNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRhdGFicmlja3NCYXNlUGF0aCA9IGRlc3RpbmF0aW9uID8gcmVxdWVzdGVkQmFzZVBhdGggOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgbG9jYWxTa2lsbE1vdW50czogTG9jYWxTa2lsbE1vdW50W10gPSBbXTtcbiAgY29uc3Qgc2tpbGxOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IHN0YWdpbmc6IExvY2FsRmlsZVN5c3RlbSB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAoY29uc3Qgc291cmNlT3B0aW9ucyBvZiBzb3VyY2VzKSB7XG4gICAgICBjb25zdCBmYWlsT25FcnJvciA9IHNvdXJjZU9wdGlvbnMuZmFpbE9uRXJyb3IgPz8gZmFpbERlZmF1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXaGVyZSB0aGlzIHNvdXJjZSdzIGJvb2trZWVwaW5nIGxpdmVzOiB0aGUgc2hhcmVkIERhdGFicmlja3MgdHJlZSwgb3JcbiAgICAgICAgLy8gdGhlIHNvdXJjZSdzIG93biBzdGFibGUgbG9jYWwgZGlyLlxuICAgICAgICBjb25zdCBrZXkgPSBjYWNoZUtleShzb3VyY2VPcHRpb25zKTtcbiAgICAgICAgY29uc3QgbW91bnRQYXRoID0gbG9jYWxTa2lsbE1vdW50UGF0aChzb3VyY2VPcHRpb25zLCBrZXkpO1xuICAgICAgICBpZiAoaXNBaVRvb2xzU291cmNlKHNvdXJjZU9wdGlvbnMuc291cmNlKSkge1xuICAgICAgICAgIHN0YWdpbmcgPz89IGF3YWl0IGluaXRpYWxpemVkU2NyYXRjaChcIm1hc3RyYS1yZW1vdGUtc2tpbGxzXCIpO1xuICAgICAgICAgIGNvbnN0IHRyZWUgPSBhd2FpdCBjYWNoZWRBaVRvb2xzVHJlZShzb3VyY2VPcHRpb25zLCBzdGFnaW5nLnJvb3QsIG9wdGlvbnMsIGtleSk7XG4gICAgICAgICAgbG9jYWxTa2lsbE1vdW50cy5wdXNoKHtcbiAgICAgICAgICAgIGZpbGVzeXN0ZW06IGF3YWl0IG1lbW9yeVNraWxsVHJlZSh0cmVlLmZpbGVzLCBgYWl0b29scy0ke2tleX1gKSxcbiAgICAgICAgICAgIG1vdW50UGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBza2lsbE5hbWVzLnB1c2goLi4udHJlZS5yZWNvcmQuc2tpbGxzKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbCByZWFkeVwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgICAgZGVzdGluYXRpb246IG1vdW50UGF0aCxcbiAgICAgICAgICAgIGRvd25sb2FkZWRBdDogdHJlZS5yZWNvcmQuZG93bmxvYWRlZEF0LFxuICAgICAgICAgICAgc2tpbGxzOiB0cmVlLnJlY29yZC5za2lsbHMsXG4gICAgICAgICAgICBjYWNoZWQ6IHRyZWUuY2FjaGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlRlMgPSBkZXN0aW5hdGlvbiA/PyBsb2NhbFNraWxsc0ZTKGtleSk7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgcmVhZE1ldGFkYXRhKGNhY2hlRlMpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSBtZXRhZGF0YT8uc291cmNlc1trZXldO1xuICAgICAgICBpZiAoY2FjaGVkICYmIGlzRnJlc2goY2FjaGVkLCByZXNvbHZlUmVmcmVzaFR0bChzb3VyY2VPcHRpb25zLCBvcHRpb25zKSkpIHtcbiAgICAgICAgICBza2lsbE5hbWVzLnB1c2goLi4uY2FjaGVkLnNraWxscyk7XG4gICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbikgbG9jYWxTa2lsbE1vdW50cy5wdXNoKHsgcm9vdDogY2FjaGVGUy5yb290LCBtb3VudFBhdGggfSk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGwgcmVhZHlcIiwge1xuICAgICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBkYXRhYnJpY2tzQmFzZVBhdGggPz8gbW91bnRQYXRoLFxuICAgICAgICAgICAgZG93bmxvYWRlZEF0OiBjYWNoZWQuZG93bmxvYWRlZEF0LFxuICAgICAgICAgICAgc2tpbGxzOiBjYWNoZWQuc2tpbGxzLFxuICAgICAgICAgICAgY2FjaGVkOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIHJlbW90ZSBza2lsbFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YWdpbmcgPz89IGF3YWl0IGluaXRpYWxpemVkU2NyYXRjaChcIm1hc3RyYS1yZW1vdGUtc2tpbGxzXCIpO1xuICAgICAgICBjb25zdCBzdGFnZWREaXIgPSBhd2FpdCBzdGFnZVNvdXJjZShzb3VyY2VPcHRpb25zLCBzdGFnaW5nLnJvb3QsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFnZWQgPSBhd2FpdCBjb2xsZWN0U2tpbGxEaXJzKHN0YWdlZERpcik7XG4gICAgICAgIGlmIChzdGFnZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSA9IHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGRvd25sb2FkZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHNraWxsczogc3RhZ2VkLm1hcCgoZGlyKSA9PiBkaXIubmFtZSksXG4gICAgICAgICAgLi4uKHBvbGljeSA/IHsgcG9saWN5IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkYXRhYnJpY2tzQmFzZVBhdGgpIHtcbiAgICAgICAgICBhd2FpdCByZW1vdmVEZWxldGVkU2tpbGxzKGRlc3RpbmF0aW9uLCBrZXksIG1ldGFkYXRhLCByZWNvcmQuc2tpbGxzKTtcbiAgICAgICAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uLCBzdGFnZWQpO1xuICAgICAgICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIGNvcHkgbGFuZHM6IGEgbWV0YWRhdGEgZW50cnkgd3JpdHRlbiBmaXJzdCB3b3VsZFxuICAgICAgICAgIC8vIG1hcmsgYSBmYWlsZWQgcHJvdmlzaW9uIGFzIGZyZXNoIGFuZCBzdXBwcmVzcyB0aGUgcmV0cnkgZm9yIGEgZGF5LlxuICAgICAgICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoZGVzdGluYXRpb24sIGtleSwgcmVjb3JkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NhbFNraWxsTW91bnRzLnB1c2goe1xuICAgICAgICAgICAgcm9vdDogYXdhaXQgcGVyc2lzdExvY2FsbHkoa2V5LCBzdGFnZWQsIHJlY29yZCksXG4gICAgICAgICAgICBtb3VudFBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLnJlY29yZC5za2lsbHMpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbCBpbnN0YWxsZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBsb2NhbFNraWxsTW91bnRzLmF0KC0xKT8ubW91bnRQYXRoLFxuICAgICAgICAgIHNraWxsczogcmVjb3JkLnNraWxscyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYGZhaWxlZCB0byBwcm92aXNpb24gcmVtb3RlIHNraWxsIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCI6ICR7ZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyb3JVdGlscy50b0Vycm9yKGVycikgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKFwic291cmNlOnNraXBwZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc3RhZ2luZykge1xuICAgICAgYXdhaXQgcm0oc3RhZ2luZy5yb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBhc3NlcnRVbmlxdWVMb2NhbFNraWxsTW91bnRzKGxvY2FsU2tpbGxNb3VudHMpO1xuICByZXR1cm4geyBsb2NhbFNraWxsTW91bnRzLCBkYXRhYnJpY2tzQmFzZVBhdGgsIHNraWxsTmFtZXMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FjaGVkQWlUb29sc1RyZWUoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHN0YWdpbmdSb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4gIGtleTogc3RyaW5nLFxuKTogUHJvbWlzZTxSZXNvbHZlZEFpVG9vbHNUcmVlPiB7XG4gIGNvbnN0IHR0bCA9IHJlc29sdmVSZWZyZXNoVHRsKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpO1xuICBsZXQgbG9hZGVkID0gZmFsc2U7XG4gIGNvbnN0IGxvYWQgPSBhc3luYyAoKTogUHJvbWlzZTxDYWNoZWRBaVRvb2xzVHJlZT4gPT4ge1xuICAgIGxvYWRlZCA9IHRydWU7XG4gICAgY29uc3Qgc3RhZ2VkRGlyID0gYXdhaXQgc3RhZ2VBaVRvb2xzKFxuICAgICAgc291cmNlT3B0aW9ucyxcbiAgICAgIGpvaW4oc3RhZ2luZ1Jvb3QsIGBhaXRvb2xzLSR7aGFzaC5pZCgpfWApLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIGNvbnN0IHN0YWdlZCA9IGF3YWl0IGNvbGxlY3RTa2lsbERpcnMoc3RhZ2VkRGlyKTtcbiAgICBpZiAoc3RhZ2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgIH1cbiAgICBjb25zdCBwb2xpY3kgPSBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZXM6IGF3YWl0IHNlcmlhbGl6ZVNraWxsRGlycyhzdGFnZWQpLFxuICAgICAgcmVjb3JkOiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgIGRvd25sb2FkZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBza2lsbHM6IHN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpLFxuICAgICAgICAuLi4ocG9saWN5ID8geyBwb2xpY3kgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiAgY29uc3QgdHJlZSA9XG4gICAgdHRsIDw9IDBcbiAgICAgID8gYXdhaXQgbG9hZCgpXG4gICAgICA6IGF3YWl0IGdldE9yU2V0KGFpVG9vbHNDYWNoZSwga2V5LCBsb2FkLCB7XG4gICAgICAgICAgdHRsLFxuICAgICAgICAgIHRocm93RXJyb3JzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgaWYgKCF0cmVlKSB0aHJvdyBuZXcgRXJyb3IoYEFJIFRvb2xzIGNhY2hlIHJldHVybmVkIG5vIHRyZWUgZm9yICR7a2V5fWApO1xuICBhd2FpdCBmbHVzaENhY2hlKGFpVG9vbHNDYWNoZSk7XG4gIHJldHVybiB7IC4uLnRyZWUsIGNhY2hlZDogIWxvYWRlZCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXJpYWxpemVTa2lsbERpcnMoZGlyczogcmVhZG9ubHkgU3RhZ2VkU2tpbGxEaXJbXSk6IFByb21pc2U8Q2FjaGVkU2tpbGxGaWxlW10+IHtcbiAgY29uc3QgZmlsZXM6IENhY2hlZFNraWxsRmlsZVtdID0gW107XG4gIGZvciAoY29uc3QgZGlyIG9mIGRpcnMpIHtcbiAgICBmb3IgKGNvbnN0IHJlbGF0aXZlIG9mIGZpbmQuZmluZEZpbGVzKFwiKiovKlwiLCB7IGN3ZDogZGlyLmFic29sdXRlUGF0aCwgbm9kaXI6IHRydWUgfSkpIHtcbiAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiBwb3NpeC5qb2luKGRpci5uYW1lLCByZWxhdGl2ZS5zcGxpdCgvW1xcXFwvXS8pLmpvaW4oXCIvXCIpKSxcbiAgICAgICAgY29udGVudDogKGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlyLmFic29sdXRlUGF0aCwgcmVsYXRpdmUpKSkudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtZW1vcnlTa2lsbFRyZWUoXG4gIGZpbGVzOiByZWFkb25seSBDYWNoZWRTa2lsbEZpbGVbXSxcbiAgaWQ6IHN0cmluZyxcbik6IFByb21pc2U8TWVtb3J5RmlsZVN5c3RlbT4ge1xuICBjb25zdCBmaWxlc3lzdGVtID0gbmV3IE1lbW9yeUZpbGVTeXN0ZW0oeyBpZCwgcm9vdDogXCIvXCIgfSk7XG4gIGF3YWl0IGZpbGVzeXN0ZW0uaW5pdCgpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBmaWxlc3lzdGVtLndyaXRlRmlsZShmaWxlLnBhdGgsIEJ1ZmZlci5mcm9tKGZpbGUuY29udGVudCwgXCJiYXNlNjRcIiksIHtcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZmlsZXN5c3RlbTtcbn1cblxuLyoqIEZhaWwgYmVmb3JlIHdvcmtzcGFjZSBjb21wb3NpdGlvbiB3aGVuIHR3byBzb3VyY2VzIGNsYWltIG9uZSB2aXJ0dWFsIG1vdW50LiAqL1xuZnVuY3Rpb24gYXNzZXJ0VW5pcXVlTG9jYWxTa2lsbE1vdW50cyhtb3VudHM6IHJlYWRvbmx5IExvY2FsU2tpbGxNb3VudFtdKTogdm9pZCB7XG4gIGNvbnN0IHJvb3RzQnlNb3VudCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbW91bnQgb2YgbW91bnRzKSB7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBcInJvb3RcIiBpbiBtb3VudCA/IG1vdW50LnJvb3QgOiBtb3VudC5maWxlc3lzdGVtLmlkO1xuICAgIGNvbnN0IHByZXZpb3VzUm9vdCA9IHJvb3RzQnlNb3VudC5nZXQobW91bnQubW91bnRQYXRoKTtcbiAgICBpZiAocHJldmlvdXNSb290ICYmIHByZXZpb3VzUm9vdCAhPT0gaWRlbnRpdHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG11bHRpcGxlIHJlbW90ZSBza2lsbCBzb3VyY2VzIHJlc29sdmUgdG8gdmlydHVhbCBtb3VudCBcIiR7bW91bnQubW91bnRQYXRofVwiOyBnaXZlIGVhY2ggc291cmNlIGEgdW5pcXVlIG5hbWVgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdHNCeU1vdW50LnNldChtb3VudC5tb3VudFBhdGgsIGlkZW50aXR5KTtcbiAgfVxufVxuXG4vKiogUmVtb3ZlIGRpcmVjdG9yaWVzIGRyb3BwZWQgYnkgb25lIHNvdXJjZSB1bmxlc3MgYW5vdGhlciBzb3VyY2Ugc3RpbGwgb3ducyB0aGVtLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVsZXRlZFNraWxscyhcbiAgZGVzdGluYXRpb246IEZpbGVTeXN0ZW0sXG4gIGtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogUmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQsXG4gIG5leHRTa2lsbHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByZXZpb3VzID0gbWV0YWRhdGE/LnNvdXJjZXNba2V5XT8uc2tpbGxzID8/IFtdO1xuICBjb25zdCByZXRhaW5lZCA9IG5ldyBTZXQobmV4dFNraWxscyk7XG4gIGZvciAoY29uc3QgW3NvdXJjZUtleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhPy5zb3VyY2VzID8/IHt9KSkge1xuICAgIGlmIChzb3VyY2VLZXkgPT09IGtleSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBza2lsbCBvZiBlbnRyeS5za2lsbHMpIHJldGFpbmVkLmFkZChza2lsbCk7XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJldmlvdXNcbiAgICAgIC5maWx0ZXIoKHNraWxsKSA9PiAhcmV0YWluZWQuaGFzKHNraWxsKSlcbiAgICAgIC5tYXAoKHNraWxsKSA9PiBkZXN0aW5hdGlvbi5ybWRpcihza2lsbCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKSxcbiAgKTtcbn1cblxuLyoqIFByb2JlIGZpbGUge0BsaW5rIG9wZW5Xcml0YWJsZVdvcmtzcGFjZX0gd3JpdGVzIGFuZCByZW1vdmVzLiAqL1xuY29uc3QgV1JJVEVfUFJPQkVfRklMRSA9IFwiLmRieC10b29scy13cml0ZS1wcm9iZVwiO1xuXG4vKipcbiAqIE9wZW4gdGhlIERhdGFicmlja3Mgc2tpbGxzIGRlc3RpbmF0aW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaWRlbnRpdHlcbiAqIGNhbm5vdCB3cml0ZSB0aGVyZS5cbiAqXG4gKiBUaGUgZGVmYXVsdCBkZXN0aW5hdGlvbiAoYC9Xb3Jrc3BhY2UvLmFzc2lzdGFudC9za2lsbHNgKSBpcyBjb21tb25seVxuICogYWRtaW5zLW9ubHksIGFuZCBhbiBhcHAgc2VydmljZSBwcmluY2lwYWwgaXMgbm90IGFuIGFkbWluIC0gc28gYSBEYXRhYnJpY2tzXG4gKiBBcHAgd3JpdGluZyB0aGVyZSBmYWlscyB3aXRoIGBSRVNPVVJDRV9ET0VTX05PVF9FWElTVGAsIHdoaWNoIGlzIGhvdyB0aGVcbiAqIHdvcmtzcGFjZSBBUEkgcmVwb3J0cyBhIHBhdGggdGhlIGNhbGxlciBpcyBub3QgYWxsb3dlZCB0byBzZWUuIFRoYXQgaXMgYSBmYWN0XG4gKiBhYm91dCBXSEVSRSB0aGUgdHJlZSBpcyBzdG9yZWQsIG5vdCBhYm91dCB3aGV0aGVyIHRoZSBza2lsbHMgYXJlIHVzYWJsZSwgc28gaXRcbiAqIGRlZ3JhZGVzIHRvIHRoZSBsb2NhbCB0cmVlIChoYW5kZWQgdG8gTWFzdHJhIGFzIGFuIGV4dHJhIHNjYW4gcGF0aCkgcmF0aGVyXG4gKiB0aGFuIHRha2luZyBhcHAgc3RhcnR1cCBkb3duIG92ZXIgYm9va2tlZXBpbmcgbG9jYXRpb24uXG4gKlxuICogVGhlIHByb2JlIGlzIGEgcmVhbCB3cml0ZTogYG1rZGlyc2Agc3VjY2VlZHMgb24gYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGV2ZW4gZm9yXG4gKiBhbiBpZGVudGl0eSB0aGF0IGNhbm5vdCB3cml0ZSBpbnRvIGl0LCBzbyBpbml0IGFsb25lIHByb3ZlcyBub3RoaW5nLiBSZW1vdmluZ1xuICogdGhlIHByb2JlIGZpbGUgaXMgYmVzdC1lZmZvcnQgLSBhIGZhaWxlZCBjbGVhbnVwIG11c3Qgbm90IGRlY2lkZSB3cml0YWJpbGl0eS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlbldyaXRhYmxlV29ya3NwYWNlKFxuICBiYXNlUGF0aDogc3RyaW5nLFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8RGF0YWJyaWNrc0ZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogd29ya3NwYWNlQ2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KGNsaWVudCksXG4gICAgcm9vdDogYmFzZVBhdGgsXG4gICAgcmVhZE9ubHk6IGZhbHNlLFxuICAgIGNyZWF0ZVJvb3Q6IHRydWUsXG4gIH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLmluaXQoKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoV1JJVEVfUFJPQkVfRklMRSwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJkZXN0aW5hdGlvbjp1bndyaXRhYmxlXCIsIHtcbiAgICAgIGRlc3RpbmF0aW9uOiBiYXNlUGF0aCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgYXdhaXQgZnMuZGVsZXRlRmlsZShXUklURV9QUk9CRV9GSUxFLCB7IGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIHJldHVybiBmcztcbn1cblxuLyoqIFJlc29sdmUgdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHNraWxscyBkZXN0aW5hdGlvbiwgb3IgYHVuZGVmaW5lZGAgZm9yIGxvY2FsIHRlbXAuICovXG5mdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNsaWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoKSByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoKTtcbiAgY29uc3QgZW1haWwgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG9wdGlvbnMudXNlckVtYWlsKTtcbiAgLy8gQSBuYW1lZCB1c2VyIHRhcmdldHMgdGhlaXIgcGVyc29uYWwgQXNzaXN0YW50IHRyZWUgKHRoZSBcInNhdmUgYSBza2lsbFwiXG4gIC8vIHRhcmdldCk7IG90aGVyd2lzZSB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluXG4gIC8vIEFzc2lzdGFudC1za2lsbHMgbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgcmV0dXJuIGVtYWlsID8gcGVyc29uYWxTa2lsbHNQYXRoKGVtYWlsKSA6IE9SR0FOSVpBVElPTl9TS0lMTFNfUEFUSDtcbn1cblxuLyoqXG4gKiBTdGFnZSBvbmUgc291cmNlIGludG8gYSBmcmVzaCBkaXIgdW5kZXIgYHN0YWdpbmdSb290YCwgcHJlZmVycmluZyB0aGUgb3B0aW9uYWxcbiAqIGBza2lsbHNgIENMSSBhbmQgZmFsbGluZyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVNvdXJjZShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgc3RhZ2luZ1Jvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHRhcmdldCA9IGpvaW4oc3RhZ2luZ1Jvb3QsIGBzcmMtJHtoYXNoLmlkKCl9YCk7XG4gIGF3YWl0IG1rZGlyKHRhcmdldCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIEFJIFRvb2xzIHJlc29sdmVzIGZyb20gYSBrbm93biByZXBvIGxheW91dCwgc28gaXQgbmV2ZXIgbmVlZHMgdGhlIENMSS5cbiAgaWYgKGlzQWlUb29sc1NvdXJjZShzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHJldHVybiBzdGFnZUFpVG9vbHMoc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbiAgY29uc3QgdmlhQ2xpID0gYXdhaXQgc3RhZ2VWaWFTa2lsbHNDbGkoc291cmNlT3B0aW9ucywgdGFyZ2V0KTtcbiAgaWYgKHZpYUNsaSkgcmV0dXJuIHZpYUNsaTtcbiAgcmV0dXJuIHN0YWdlVmlhRmV0Y2goc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSB0aGUgRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbHMgaW50byBgdGFyZ2V0YC5cbiAqXG4gKiBSZWFkcyB0aGUgcmVwbydzIG93biBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gICh3aGljaCBuYW1lcyBlYWNoIHNraWxsJ3NcbiAqIGZpbGVzIGFuZCB3aGV0aGVyIGl0IGxpdmVzIHVuZGVyIGBza2lsbHMvYCBvciBgZXhwZXJpbWVudGFsL2ApIGFuZCBkb3dubG9hZHNcbiAqIHRoZW0gLSB0aGUgc2FtZSB0aGluZyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGxgIGRvZXMsIG1pbnVzIHRoZSBDTEkgYW5kXG4gKiBtaW51cyBhbnkgRGF0YWJyaWNrcyBhdXRoLCBzaW5jZSB0aGUgcmVwbyBpcyBwdWJsaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlQWlUb29scyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBtYXhCeXRlcyA9IHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKTtcbiAgY29uc3QgcmVmID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPz8gQUlUT09MU19SRUY7XG4gIGNvbnN0IG1hbmlmZXN0ID0ganNvbi5wYXJzZShcbiAgICAoYXdhaXQgZG93bmxvYWQoYWlUb29sc1Jhd1VybChyZWYsIFwibWFuaWZlc3QuanNvblwiKSwgbWF4Qnl0ZXMpKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICAgdW5kZWZpbmVkLFxuICApIGFzIEFpVG9vbHNNYW5pZmVzdCB8IHVuZGVmaW5lZDtcblxuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0KHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykpO1xuICBjb25zdCBzZWxlY3RlZCA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0Py5za2lsbHMgPz8ge30pLmZpbHRlcigoW25hbWUsIGVudHJ5XSkgPT5cbiAgICB3YW50ZWQuc2l6ZSA+IDBcbiAgICAgID8gd2FudGVkLmhhcyhuYW1lKVxuICAgICAgOiBlbnRyeS5yZXBvX2RpciAhPT0gXCJleHBlcmltZW50YWxcIiB8fCBzb3VyY2VPcHRpb25zLmV4cGVyaW1lbnRhbCA9PT0gdHJ1ZSxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gbWF0Y2hpbmcgc2tpbGxzIGluICR7QUlUT09MU19SRVBPfUAke3JlZn1gKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gc2VsZWN0ZWQuZmxhdE1hcCgoW25hbWUsIGVudHJ5XSkgPT5cbiAgICAoZW50cnkuZmlsZXMgPz8gW10pLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIHVybDogYWlUb29sc1Jhd1VybChyZWYsIGAke2VudHJ5LnJlcG9fZGlyID8/IFwic2tpbGxzXCJ9LyR7bmFtZX0vJHtmaWxlfWApLFxuICAgICAgcGF0aDogam9pbih0YXJnZXQsIG5hbWUsIC4uLmZpbGUuc3BsaXQoXCIvXCIpKSxcbiAgICB9KSksXG4gICk7XG4gIGF3YWl0IGFzeW5jVXRpbHMubWFwQ29uY3VycmVudChcbiAgICBmaWxlcyxcbiAgICBhc3luYyAoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGRvd25sb2FkKGl0ZW0udXJsLCBtYXhCeXRlcyk7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKGl0ZW0ucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGl0ZW0ucGF0aCwgYm9keSk7XG4gICAgfSxcbiAgICB7IGNvbmN1cnJlbmN5OiBBSVRPT0xTX0NPTkNVUlJFTkNZIH0sXG4gICk7XG5cbiAgbG9nZ2VyLmRlYnVnKFwiYWl0b29sczpzdGFnZWRcIiwgeyByZWYsIHNraWxsczogc2VsZWN0ZWQubGVuZ3RoLCBmaWxlczogZmlsZXMubGVuZ3RoIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogUmF3LWNvbnRlbnQgVVJMIGZvciBhIHBhdGggaW4gdGhlIEFJIFRvb2xzIHJlcG8gYXQgYHJlZmAuICovXG5mdW5jdGlvbiBhaVRvb2xzUmF3VXJsKHJlZjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke0FJVE9PTFNfUkVQT30vJHtyZWZ9LyR7cGF0aH1gO1xufVxuXG4vKipcbiAqIENvcHkgYSBzb3VyY2UgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBgc2tpbGxzYCBDTEkgd2hlbiBpdCBpcyBpbnN0YWxsZWQuXG4gKiBSZXR1cm5zIHRoZSBkaXIgaG9sZGluZyB0aGUgY29waWVkIGBTS0lMTC5tZGAgdHJlZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gKiBDTEkgaXMgYWJzZW50IChzbyB0aGUgY2FsbGVyIGNhbiBmYWxsIGJhY2sgdG8gYSBmZXRjaCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhU2tpbGxzQ2xpKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICB0YXJnZXQ6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNsaSA9IGF3YWl0IHJlc29sdmVTa2lsbHNDbGkoKTtcbiAgaWYgKCFjbGkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAuLi5jbGkuYXJncyxcbiAgICBcImFkZFwiLFxuICAgIHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgIFwiLS1hZ2VudFwiLFxuICAgIFNLSUxMU19DTElfQUdFTlQsXG4gICAgXCItLWNvcHlcIixcbiAgICBcIi15XCIsXG4gIF07XG4gIGZvciAoY29uc3Qgc2tpbGwgb2Ygc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSkge1xuICAgIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgc2tpbGwpO1xuICB9XG4gIGlmIChzdHJpbmdVdGlscy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpLmxlbmd0aCA9PT0gMCkgYXJncy5wdXNoKFwiLS1za2lsbFwiLCBcIipcIik7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYy5zcGF3bihjbGkuY29tbWFuZCwgYXJncywge1xuICAgIGN3ZDogdGFyZ2V0LFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICBjaGVjazogZmFsc2UsXG4gIH0pO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNraWxscyBDTEkgZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSk6ICR7cmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0fWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gam9pbih0YXJnZXQsIC4uLlNLSUxMU19DTElfTEFZT1VUKTtcbn1cblxuLyoqXG4gKiBMb2NhdGUgdGhlIG9wdGlvbmFsIGBza2lsbHNgIENMSSBiaW4sIHJlc29sdmVkIGZyb20gVEhJUyBwYWNrYWdlJ3MgbW9kdWxlXG4gKiBncmFwaC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwZWVyIGRlcCBpc24ndCBpbnN0YWxsZWQsIHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gYSBkaXJlY3QgZmV0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbHNDbGkoKTogUHJvbWlzZTx7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgcGtnUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShcInNraWxscy9wYWNrYWdlLmpzb25cIik7XG4gICAgY29uc3QgYmluID0gam9pbihwa2dQYXRoLCBcIi4uXCIsIFwiYmluXCIsIFwiY2xpLm1qc1wiKTtcbiAgICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhiaW4pKSByZXR1cm4geyBjb21tYW5kOiBwcm9jZXNzLmV4ZWNQYXRoLCBhcmdzOiBbYmluXSB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBwZWVyIGRlcCBhYnNlbnQgb3IgdW5yZXNvbHZhYmxlIC0gZmV0Y2ggZmFsbGJhY2sgaGFuZGxlcyBpdFxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmV0Y2ggYSBzb3VyY2UgVVJMIGFuZCB3cml0ZSB0aGUgZG93bmxvYWRlZCBgU0tJTEwubWRgIHVuZGVyIGB0YXJnZXRgLlxuICogVXNlZCB3aGVuIHRoZSBgc2tpbGxzYCBDTEkgaXNuJ3QgaW5zdGFsbGVkOyBzdXBwb3J0cyBhIGRpcmVjdCBgU0tJTEwubWRgIFVSTC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VWaWFGZXRjaChcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcihzb3VyY2VPcHRpb25zLnNvdXJjZSk7XG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCIgaXMgbm90IGEgVVJMIGFuZCB0aGUgb3B0aW9uYWwgXCJza2lsbHNcIiBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWRgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgZG93bmxvYWQodXJsLnRvU3RyaW5nKCksIHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKSk7XG4gIGNvbnN0IG5hbWUgPSBzdHJpbmdVdGlscy50b1NsdWcoZGVyaXZlU2tpbGxOYW1lKHVybC50b1N0cmluZygpKSkgfHwgXCJyZW1vdGUtc2tpbGxcIjtcbiAgY29uc3Qgc2tpbGxEaXIgPSBqb2luKHRhcmdldCwgbmFtZSk7XG4gIGF3YWl0IG1rZGlyKHNraWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oc2tpbGxEaXIsIFwiU0tJTEwubWRcIiksIGJ1ZmZlcik7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKiBUaGUgZWZmZWN0aXZlIGRvd25sb2FkIGNlaWxpbmc6IHBlci1zb3VyY2UsIHRoZW4gdG9wLWxldmVsLCB0aGVuIHRoZSBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1heEJ5dGVzKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNvdXJjZU9wdGlvbnMubWF4RG93bmxvYWRCeXRlcyA/PyBvcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVM7XG59XG5cbi8qKiBHRVQgYSBVUkwsIGZhaWxpbmcgbG91ZGx5IG9uIGEgbm9uLTJ4eCBzdGF0dXMgb3IgYW4gb3ZlcnNpemVkIGJvZHkuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZCh1cmw6IHN0cmluZywgbWF4Qnl0ZXM6IG51bWJlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyksXG4gIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGZhaWxlZCAoJHt1cmx9KTogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpfWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7dXJsfSlgKTtcbiAgfVxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoID4gbWF4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGV4Y2VlZHMgJHttYXhCeXRlc30gYnl0ZXMgKCR7dXJsfSlgKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyO1xufVxuXG4vKiogRGVyaXZlIGEgc2tpbGwgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGRvd25sb2FkIFVSTCdzIGxhc3QgcGF0aCBzZWdtZW50LiAqL1xuZnVuY3Rpb24gZGVyaXZlU2tpbGxOYW1lKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIodXJsU3RyaW5nKTtcbiAgY29uc3QgbGFzdCA9IHVybD8ucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA/PyBcIlwiO1xuICByZXR1cm4gbGFzdC5yZXBsYWNlKC9cXC4obWR8emlwfHRhcnx0Z3p8Z3opJC9pLCBcIlwiKTtcbn1cblxuLyoqIEEgc2tpbGwgZGlyZWN0b3J5IChob2xkaW5nIGEgYFNLSUxMLm1kYCkgc3RhZ2VkIG9uIGxvY2FsIGRpc2suICovXG5pbnRlcmZhY2UgU3RhZ2VkU2tpbGxEaXIge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgc2tpbGwgZGlyZWN0b3J5IHVuZGVyIGByb290YDogYSBgcm9vdC9TS0lMTC5tZGAgKHJvb3QgSVMgdGhlXG4gKiBza2lsbCkgb3IgZWFjaCBpbW1lZGlhdGUgY2hpbGQgZGlyIHRoYXQgY29udGFpbnMgYSBgU0tJTEwubWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0U2tpbGxEaXJzKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8U3RhZ2VkU2tpbGxEaXJbXT4ge1xuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKHJvb3QpKSkgcmV0dXJuIFtdO1xuICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhqb2luKHJvb3QsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgY29uc3QgbmFtZSA9IHBvc2l4LmJhc2VuYW1lKHJvb3Quc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgcmV0dXJuIFt7IG5hbWUsIGFic29sdXRlUGF0aDogcm9vdCB9XTtcbiAgfVxuICBjb25zdCBkaXJzOiBTdGFnZWRTa2lsbERpcltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgcmVhZGRpcihyb290LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IGpvaW4ocm9vdCwgZW50cnkubmFtZSk7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihkaXIsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgICBkaXJzLnB1c2goeyBuYW1lOiBlbnRyeS5uYW1lLCBhYnNvbHV0ZVBhdGg6IGRpciB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpcnM7XG59XG5cbi8qKlxuICogQ29weSBldmVyeSBzdGFnZWQgc2tpbGwgZGlyZWN0b3J5IGludG8ge0BsaW5rIGRlc3RpbmF0aW9ufSwgcHJlc2VydmluZyB0aGVcbiAqIGA8c2tpbGw+LzxyZWxhdGl2ZT5gIGxheW91dC4gVGhlIGRlc3RpbmF0aW9uIGlzIGp1c3QgYSB7QGxpbmsgRmlsZVN5c3RlbX0sXG4gKiBzbyB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSBhbmQgdGhlIGxvY2FsIGZhbGxiYWNrIHNoYXJlIG9uZSBjb3BpZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlTa2lsbERpcnMoZGVzdGluYXRpb246IEZpbGVTeXN0ZW0sIGRpcnM6IFN0YWdlZFNraWxsRGlyW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZGVzdGluYXRpb24uaW5pdCgpO1xuICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgZm9yIChjb25zdCByZWxhdGl2ZSBvZiBmaW5kLmZpbmRGaWxlcyhcIioqLypcIiwgeyBjd2Q6IGRpci5hYnNvbHV0ZVBhdGgsIG5vZGlyOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCByZWFkRmlsZShqb2luKGRpci5hYnNvbHV0ZVBhdGgsIHJlbGF0aXZlKSk7XG4gICAgICBjb25zdCBza2lsbFBhdGggPSBwb3NpeC5qb2luKGRpci5uYW1lLCByZWxhdGl2ZS5zcGxpdCgvW1xcXFwvXS8pLmpvaW4oXCIvXCIpKTtcbiAgICAgIGF3YWl0IGRlc3RpbmF0aW9uLndyaXRlRmlsZShza2lsbFBhdGgsIGJ1ZmZlciwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29weSBzdGFnZWQgc2tpbGwgZGlycyBpbnRvIGEgU1RBQkxFIGxvY2FsIHRyZWUga2V5ZWQgYnkgdGhlIHNvdXJjZSwgYW5kXG4gKiByZXR1cm4gaXRzIHJvb3QgcGF0aC5cbiAqXG4gKiBBIGdpdmVuIHNvdXJjZSByZXNvbHZlcyB0byB0aGUgc2FtZSBjb250ZW50IG9uIGFsbW9zdCBldmVyeSBib290LCBzbyBlYWNoXG4gKiBvbmUgb3ducyBhIGRpcmVjdG9yeSBuYW1lZCBmb3IgaXRzIHtAbGluayBjYWNoZUtleX0gcmF0aGVyIHRoYW4gbGVhdmluZyBhXG4gKiBmcmVzaCBzY3JhdGNoIGRpciBiZWhpbmQgcGVyIHJlc3RhcnQuIEtleWluZyBvbiB0aGUgc291cmNlIGFuZCBpdHMgcG9saWN5XG4gKiAobm90IHRoZSBjb250ZW50KSBpcyB3aGF0IGtlZXBzIHR3byBkaWZmZXJlbnQgc291cmNlcyBmcm9tIG92ZXJ3cml0aW5nIGVhY2hcbiAqIG90aGVyLlxuICpcbiAqIFRoZSBtZXRhZGF0YSBpcyB3cml0dGVuIElOU0lERSB0aGUgcmVidWlsZCByYXRoZXIgdGhhbiBhZnRlciBpdDogYHJlYnVpbGRGU2BcbiAqIHJlcGxhY2VzIHRoZSBzdGFibGUgcm9vdCB3aG9sZXNhbGUsIHNvIGFueXRoaW5nIHdyaXR0ZW4gYWZ0ZXJ3YXJkcyB3b3VsZFxuICogc3Vydml2ZSBvbmx5IHVudGlsIHRoZSBuZXh0IHJlZnJlc2gsIGFuZCBhbnl0aGluZyB3cml0dGVuIGJlZm9yZSB3b3VsZCBiZVxuICogdGhyb3duIGF3YXkgYnkgdGhlIHN3YXAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBlcnNpc3RMb2NhbGx5KFxuICBrZXk6IHN0cmluZyxcbiAgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSxcbiAgcmVjb3JkOiBSZW1vdGVTa2lsbENhY2hlRW50cnksXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzdGFibGUgPSBhd2FpdCBsb2NhbEZTLnJlYnVpbGRGUyhgJHtMT0NBTF9TS0lMTFNfRElSfS8ke2tleX1gLCBhc3luYyAoc2NyYXRjaCkgPT4ge1xuICAgIGF3YWl0IGNvcHlTa2lsbERpcnMoc2NyYXRjaCwgZGlycyk7XG4gICAgYXdhaXQgd3JpdGVNZXRhZGF0YShzY3JhdGNoLCBrZXksIHJlY29yZCk7XG4gIH0pO1xuICByZXR1cm4gc3RhYmxlLnJvb3Q7XG59XG5cbi8qKlxuICogQSBzY3JhdGNoIGZpbGVzeXN0ZW0gd2hvc2Ugcm9vdCBleGlzdHMgb24gZGlzaywgZm9yIHRoZSBwYXRocyB0aGF0IGhhbmQgYVxuICogcmVhbCBkaXJlY3RvcnkgdG8gYG5vZGU6ZnNgIG9yIGEgY2hpbGQgcHJvY2VzcyByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoXG4gKiB0aGUge0BsaW5rIEZpbGVTeXN0ZW19IEFQSS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZWRTY3JhdGNoKHByZWZpeDogc3RyaW5nKTogUHJvbWlzZTxMb2NhbEZpbGVTeXN0ZW0+IHtcbiAgY29uc3Qgc2NyYXRjaCA9IGxvY2FsRlMuc2NyYXRjaEZTKHByZWZpeCk7XG4gIGF3YWl0IHNjcmF0Y2guaW5pdCgpO1xuICByZXR1cm4gc2NyYXRjaDtcbn1cblxuLyoqIEJlc3QtZWZmb3J0IGV4aXN0ZW5jZSBjaGVjay4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBhdGhFeGlzdHMocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgc3RhdChwYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
|