@workflow/world-local 5.0.0-beta.23 → 5.0.0-beta.25
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 +9 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -5
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +26 -21
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -5
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +7 -8
- package/dist/storage/events-storage.d.ts.map +1 -1
- package/dist/storage/events-storage.js +178 -20
- package/dist/storage/helpers.d.ts +37 -0
- package/dist/storage/helpers.d.ts.map +1 -1
- package/dist/storage/helpers.js +95 -21
- package/dist/storage/hook-index.d.ts +50 -0
- package/dist/storage/hook-index.d.ts.map +1 -0
- package/dist/storage/hook-index.js +259 -0
- package/dist/storage/hooks-storage.d.ts.map +1 -1
- package/dist/storage/hooks-storage.js +86 -68
- package/dist/storage/runs-storage.d.ts.map +1 -1
- package/dist/storage/runs-storage.js +6 -3
- package/dist/streamer.d.ts.map +1 -1
- package/dist/streamer.js +79 -62
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -6,3 +6,12 @@ Stores workflow data as JSON files on disk and provides in-memory queuing. Autom
|
|
|
6
6
|
|
|
7
7
|
Used by default on `next dev` and `next start`.
|
|
8
8
|
|
|
9
|
+
## Programmatic configuration
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { createWorld } from '@workflow/world-local';
|
|
13
|
+
|
|
14
|
+
const world = createWorld({
|
|
15
|
+
dataDir: './custom-workflow-data',
|
|
16
|
+
});
|
|
17
|
+
```
|
package/dist/config.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ export type Config = {
|
|
|
25
25
|
export declare const config: {
|
|
26
26
|
readonly value: Config;
|
|
27
27
|
};
|
|
28
|
+
export declare function resolveDirectBaseUrl(config: Partial<Config>): string;
|
|
28
29
|
/**
|
|
29
30
|
* Resolves the base URL for queue requests following the priority order:
|
|
30
31
|
* 1. config.baseUrl (highest priority - full override from args)
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAMjD,MAAM,MAAM,MAAM,GAAG;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,MAAM;;CAKjB,CAAC;AAEH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAMpE;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA2B7E"}
|
package/dist/config.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createWorkflowBaseUrl, createWorkflowHealthEndpoint, } from '@workflow/utils';
|
|
1
2
|
import { getWorkflowPort } from '@workflow/utils/get-port';
|
|
2
3
|
import { once } from './util.js';
|
|
3
4
|
const getDataDirFromEnv = () => {
|
|
@@ -12,6 +13,11 @@ export const config = once(() => {
|
|
|
12
13
|
const baseUrl = getBaseUrlFromEnv();
|
|
13
14
|
return { dataDir, baseUrl };
|
|
14
15
|
});
|
|
16
|
+
export function resolveDirectBaseUrl(config) {
|
|
17
|
+
return (config.baseUrl ??
|
|
18
|
+
process.env.WORKFLOW_LOCAL_BASE_URL ??
|
|
19
|
+
createWorkflowBaseUrl('http://localhost'));
|
|
20
|
+
}
|
|
15
21
|
/**
|
|
16
22
|
* Resolves the base URL for queue requests following the priority order:
|
|
17
23
|
* 1. config.baseUrl (highest priority - full override from args)
|
|
@@ -30,15 +36,17 @@ export async function resolveBaseUrl(config) {
|
|
|
30
36
|
return process.env.WORKFLOW_LOCAL_BASE_URL;
|
|
31
37
|
}
|
|
32
38
|
if (typeof config.port === 'number') {
|
|
33
|
-
return `http://localhost:${config.port}
|
|
39
|
+
return createWorkflowBaseUrl(`http://localhost:${config.port}`);
|
|
34
40
|
}
|
|
35
41
|
if (process.env.PORT) {
|
|
36
|
-
return `http://localhost:${process.env.PORT}
|
|
42
|
+
return createWorkflowBaseUrl(`http://localhost:${process.env.PORT}`);
|
|
37
43
|
}
|
|
38
|
-
const detectedPort = await getWorkflowPort(
|
|
44
|
+
const detectedPort = await getWorkflowPort({
|
|
45
|
+
endpoint: createWorkflowHealthEndpoint(),
|
|
46
|
+
});
|
|
39
47
|
if (detectedPort) {
|
|
40
|
-
return `http://localhost:${detectedPort}
|
|
48
|
+
return createWorkflowBaseUrl(`http://localhost:${detectedPort}`);
|
|
41
49
|
}
|
|
42
50
|
throw new Error('Unable to resolve base URL for workflow queue.');
|
|
43
51
|
}
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDRCQUE0QixHQUM3QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFO0lBQzdCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxnQkFBZ0IsQ0FBQztBQUNqRSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLENBQUM7QUFFakQsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEVBQUU7SUFDN0IsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDO0FBQzdDLENBQUMsQ0FBQztBQTBCRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFTLEdBQUcsRUFBRTtJQUN0QyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFFcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5QixDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUF1QjtJQUMxRCxPQUFPLENBQ0wsTUFBTSxDQUFDLE9BQU87UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QjtRQUNuQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUMxQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxNQUF1QjtJQUMxRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSwyRUFBMkU7SUFDM0UsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDeEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxPQUFPLHFCQUFxQixDQUFDLG9CQUFvQixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLE9BQU8scUJBQXFCLENBQUMsb0JBQW9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxlQUFlLENBQUM7UUFDekMsUUFBUSxFQUFFLDRCQUE0QixFQUFFO0tBQ3pDLENBQUMsQ0FBQztJQUNILElBQUksWUFBWSxFQUFFLENBQUM7UUFDakIsT0FBTyxxQkFBcUIsQ0FBQyxvQkFBb0IsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwsXG4gIGNyZWF0ZVdvcmtmbG93SGVhbHRoRW5kcG9pbnQsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1BvcnQgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvZ2V0LXBvcnQnO1xuaW1wb3J0IHsgb25jZSB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbmNvbnN0IGdldERhdGFEaXJGcm9tRW52ID0gKCkgPT4ge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTE9DQUxfREFUQV9ESVIgfHwgJy53b3JrZmxvdy1kYXRhJztcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1JFU09MVkVfREFUQV9PUFRJT04gPSAnYWxsJztcblxuY29uc3QgZ2V0QmFzZVVybEZyb21FbnYgPSAoKSA9PiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9CQVNFX1VSTDtcbn07XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IHtcbiAgZGF0YURpcjogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hldGhlciBzdGFydCgpIHNob3VsZCByZS1lbnF1ZXVlIHBlbmRpbmcvcnVubmluZyBydW5zIGZyb20gc3RvcmFnZS5cbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS4gVGVzdCBoYXJuZXNzZXMgdGhhdCBhbHdheXMgc3RhcnQgZnJvbSBhIGNsZWFuIHNsYXRlIGNhblxuICAgKiBkaXNhYmxlIHJlY292ZXJ5IHRvIGF2b2lkIHJlcGxheWluZyBzdGFsZSBydW5zLlxuICAgKi9cbiAgcmVjb3ZlckFjdGl2ZVJ1bnM/OiBib29sZWFuO1xuICAvKipcbiAgICogT3B0aW9uYWwgdGFnIHRvIHNjb3BlIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucy5cbiAgICogV2hlbiBzZXQsIGZpbGVzIGFyZSB3cml0dGVuIGFzIGB7aWR9Lnt0YWd9Lmpzb25gIGFuZCBgY2xlYXIoKWAgb25seSBkZWxldGVzXG4gICAqIGZpbGVzIG1hdGNoaW5nIHRoaXMgdGFnLiBVc2VkIGJ5IHZpdGVzdCB0byBpc29sYXRlIHRlc3QgZGF0YSBpbiB0aGUgc2hhcmVkXG4gICAqIGAud29ya2Zsb3ctZGF0YWAgZGlyZWN0b3J5LlxuICAgKi9cbiAgdGFnPzogc3RyaW5nO1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGZsdXNoIGludGVydmFsIChpbiBtcykgZm9yIGJ1ZmZlcmVkIHN0cmVhbSB3cml0ZXMuXG4gICAqIERlZmF1bHQgaXMgMTBtcy4gU2V0IHRvIDAgZm9yIGltbWVkaWF0ZSBmbHVzaGluZy5cbiAgICovXG4gIHN0cmVhbUZsdXNoSW50ZXJ2YWxNcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBjb25maWcgPSBvbmNlPENvbmZpZz4oKCkgPT4ge1xuICBjb25zdCBkYXRhRGlyID0gZ2V0RGF0YURpckZyb21FbnYoKTtcbiAgY29uc3QgYmFzZVVybCA9IGdldEJhc2VVcmxGcm9tRW52KCk7XG5cbiAgcmV0dXJuIHsgZGF0YURpciwgYmFzZVVybCB9O1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGlyZWN0QmFzZVVybChjb25maWc6IFBhcnRpYWw8Q29uZmlnPik6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmJhc2VVcmwgPz9cbiAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9CQVNFX1VSTCA/P1xuICAgIGNyZWF0ZVdvcmtmbG93QmFzZVVybCgnaHR0cDovL2xvY2FsaG9zdCcpXG4gICk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGJhc2UgVVJMIGZvciBxdWV1ZSByZXF1ZXN0cyBmb2xsb3dpbmcgdGhlIHByaW9yaXR5IG9yZGVyOlxuICogMS4gY29uZmlnLmJhc2VVcmwgKGhpZ2hlc3QgcHJpb3JpdHkgLSBmdWxsIG92ZXJyaWRlIGZyb20gYXJncylcbiAqIDIuIFdPUktGTE9XX0xPQ0FMX0JBU0VfVVJMIGVudiB2YXIgKGNoZWNrZWQgZGlyZWN0bHkgdG8gaGFuZGxlIGxhdGUgZW52IHZhciBzZXR0aW5nKVxuICogMy4gY29uZmlnLnBvcnQgKGV4cGxpY2l0IHBvcnQgb3ZlcnJpZGUgZnJvbSBhcmdzKVxuICogNC4gUE9SVCBlbnYgdmFyIChleHBsaWNpdCBjb25maWd1cmF0aW9uKVxuICogNS4gQXV0by1kZXRlY3RlZCBwb3J0IHZpYSBnZXRQb3J0IChkZXRlY3QgYWN0dWFsIGxpc3RlbmluZyBwb3J0KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJhc2VVcmwoY29uZmlnOiBQYXJ0aWFsPENvbmZpZz4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmJhc2VVcmwpIHtcbiAgICByZXR1cm4gY29uZmlnLmJhc2VVcmw7XG4gIH1cblxuICAvLyBDaGVjayBlbnYgdmFyIGRpcmVjdGx5IGluIGNhc2UgaXQgd2FzIHNldCBhZnRlciB0aGUgY29uZmlnIHdhcyBjYWNoZWRcbiAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIENMSSB0b29scyB0aGF0IHNldCB0aGUgZW52IHZhciBhZnRlciBtb2R1bGUgaW1wb3J0XG4gIGlmIChwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9CQVNFX1VSTCkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9CQVNFX1VSTDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29uZmlnLnBvcnQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVdvcmtmbG93QmFzZVVybChgaHR0cDovL2xvY2FsaG9zdDoke2NvbmZpZy5wb3J0fWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52LlBPUlQpIHtcbiAgICByZXR1cm4gY3JlYXRlV29ya2Zsb3dCYXNlVXJsKGBodHRwOi8vbG9jYWxob3N0OiR7cHJvY2Vzcy5lbnYuUE9SVH1gKTtcbiAgfVxuXG4gIGNvbnN0IGRldGVjdGVkUG9ydCA9IGF3YWl0IGdldFdvcmtmbG93UG9ydCh7XG4gICAgZW5kcG9pbnQ6IGNyZWF0ZVdvcmtmbG93SGVhbHRoRW5kcG9pbnQoKSxcbiAgfSk7XG4gIGlmIChkZXRlY3RlZFBvcnQpIHtcbiAgICByZXR1cm4gY3JlYXRlV29ya2Zsb3dCYXNlVXJsKGBodHRwOi8vbG9jYWxob3N0OiR7ZGV0ZWN0ZWRQb3J0fWApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBiYXNlIFVSTCBmb3Igd29ya2Zsb3cgcXVldWUuJyk7XG59XG4iXX0=
|
package/dist/fs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
|
package/dist/fs.js
CHANGED
|
@@ -474,30 +474,35 @@ export async function paginatedFileSystemQuery(config) {
|
|
|
474
474
|
return true;
|
|
475
475
|
});
|
|
476
476
|
}
|
|
477
|
-
// 4. Load files
|
|
477
|
+
// 4. Load files with bounded concurrency and collect valid items.
|
|
478
|
+
// Reads are independent; ordering is restored by the sort below.
|
|
479
|
+
const readConcurrency = 32;
|
|
478
480
|
const validItems = [];
|
|
479
|
-
for (
|
|
480
|
-
const
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
cachedItem === undefined
|
|
481
|
+
for (let batchStart = 0; batchStart < candidateFileIds.length; batchStart += readConcurrency) {
|
|
482
|
+
const batch = candidateFileIds.slice(batchStart, batchStart + readConcurrency);
|
|
483
|
+
const loadedBatch = await Promise.all(batch.map(async (fileId) => {
|
|
484
|
+
const filePath = path.join(resolvedDirectory, `${fileId}.json`);
|
|
485
|
+
try {
|
|
486
|
+
const cachedItem = cachedItems?.get(filePath);
|
|
487
|
+
return cachedItem === undefined
|
|
486
488
|
? await readJSON(filePath, schema)
|
|
487
489
|
: structuredClone(cachedItem);
|
|
488
|
-
}
|
|
489
|
-
catch (error) {
|
|
490
|
-
// We don't expect zod errors to happen, but if the JSON does get malformed,
|
|
491
|
-
// we skip the item. Preferably, we'd have a way to mark items as malformed,
|
|
492
|
-
// so that the UI can display them as such, with richer messaging. In the meantime,
|
|
493
|
-
// we just log a warning and skip the item.
|
|
494
|
-
if (error instanceof z.ZodError) {
|
|
495
|
-
console.warn(`Skipping item ${fileId} due to malformed JSON: ${error.message}`);
|
|
496
|
-
continue;
|
|
497
490
|
}
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
491
|
+
catch (error) {
|
|
492
|
+
// We don't expect zod errors to happen, but if the JSON does get malformed,
|
|
493
|
+
// we skip the item. Preferably, we'd have a way to mark items as malformed,
|
|
494
|
+
// so that the UI can display them as such, with richer messaging. In the meantime,
|
|
495
|
+
// we just log a warning and skip the item.
|
|
496
|
+
if (error instanceof z.ZodError) {
|
|
497
|
+
console.warn(`Skipping item ${fileId} due to malformed JSON: ${error.message}`);
|
|
498
|
+
return null;
|
|
499
|
+
}
|
|
500
|
+
throw error;
|
|
501
|
+
}
|
|
502
|
+
}));
|
|
503
|
+
for (const item of loadedBatch) {
|
|
504
|
+
if (!item)
|
|
505
|
+
continue;
|
|
501
506
|
// Apply custom filter early if provided
|
|
502
507
|
if (filter && !filter(item))
|
|
503
508
|
continue;
|
|
@@ -559,4 +564,4 @@ export async function paginatedFileSystemQuery(config) {
|
|
|
559
564
|
hasMore,
|
|
560
565
|
};
|
|
561
566
|
}
|
|
562
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUVILHNCQUFzQjtJQUN0QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDaEUsTUFBTSxVQUFVLEdBQ2QsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLFlBQVksQ0FDVixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ2pDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ2pDO1FBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVYLE9BQU87UUFDTCxJQUFJLEVBQUUsS0FBSztRQUNYLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgRW50aXR5Q29uZmxpY3RFcnJvciwgV29ya2Zsb3dXb3JsZEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2luYXRlZFJlc3BvbnNlIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLyoqXG4gKiBUcnVuY2F0ZSBhIHBvc3NpYmx5LXVudHJ1c3RlZCB2YWx1ZSBmb3IgaW5jbHVzaW9uIGluIGFuIGVycm9yIG1lc3NhZ2UuXG4gKiBLZWVwcyBlcnJvciBvdXRwdXQgYWN0aW9uYWJsZSBmb3IgZGV2ZWxvcGVycyBpbiBkZXYgbW9kZSB3aGlsZSBsaW1pdGluZ1xuICogdGhlIGFtb3VudCBvZiBhdHRhY2tlci1jb250cm9sbGVkIGRhdGEgcmVmbGVjdGVkIGJhY2sgaWYgYSBgd29ybGQtbG9jYWxgXG4gKiBiYWNrZW5kIGlzIGV2ZXIgcnVuIGluIGEgY29udGV4dCB0aGF0IHN1cmZhY2VzIHRoZXNlIG1lc3NhZ2VzIHRvIGNsaWVudHMuXG4gKi9cbmZ1bmN0aW9uIHRydW5jYXRlRm9yRXJyb3IodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBzID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKTtcbiAgY29uc3QgTUFYID0gNDg7XG4gIHJldHVybiBzLmxlbmd0aCA+IE1BWCA/IGAke3Muc2xpY2UoMCwgTUFYKX3igKZgIDogcztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGNhbGxlci1zdXBwbGllZCBlbnRpdHkgSUQgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IHdvdWxkXG4gKiBlc2NhcGUgdGhlIHN0b3JhZ2Ugcm9vdCAocGF0aCB0cmF2ZXJzYWwpIG9yIG90aGVyd2lzZSBwcm9kdWNlIGFuIHVuc2FmZVxuICogZmlsZW5hbWUuIEV4dGVuZHMge0BsaW5rIFdvcmtmbG93V29ybGRFcnJvcn0gc28gdGhlIHBsYXRmb3JtJ3Mgc3RhbmRhcmRcbiAqIGVycm9yLXRvLUhUVFAgbWFwcGluZyBoYW5kbGVzIGl0IGFsb25nc2lkZSBvdGhlciB3b3JsZC1sYXllciBlcnJvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnNhZmVFbnRpdHlJZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dXb3JsZEVycm9yIHtcbiAgY29uc3RydWN0b3Ioa2luZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVW5zYWZlICR7a2luZH0gXCIke3RydW5jYXRlRm9yRXJyb3IodmFsdWUpfVwiOiBtdXN0IG5vdCBiZSBlbXB0eSwgY29udGFpbiBcIi5cIiwgXCIvXCIsIFwiXFxcXFwiLCBvciBudWxsIGJ5dGVzYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1Vuc2FmZUVudGl0eUlkRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVW5zYWZlRW50aXR5SWRFcnJvciB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiYgdmFsdWUubmFtZSA9PT0gJ1Vuc2FmZUVudGl0eUlkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIHN0cmluZyBpcyBzYWZlIHRvIGVtYmVkIGluIGEgZmlsZXN5c3RlbSBwYXRoIGFzIGEgc2luZ2xlXG4gKiBwYXRoIGNvbXBvbmVudC4gUmVqZWN0cyB2YWx1ZXMgdGhhdCBhcmU6XG4gKiAgIC0gZW1wdHlcbiAqICAgLSBzdGFydGluZyB3aXRoIGAuYCAoYmxvY2tzIGAuYCwgYC4uYCwgYC5sb2Nrc2AsIGAudG1wYCwgYW5kIG90aGVyXG4gKiAgICAgaGlkZGVuIG9yIHJlc2VydmVkIGZpbGVuYW1lcylcbiAqICAgLSBjb250YWluaW5nIGAuYCAod291bGQgY29sbGlkZSB3aXRoIHRoZSBgLnRhZ2AgLyBgLmpzb25gIHN1ZmZpeCB0aGVcbiAqICAgICB0YWdnaW5nIGxvZ2ljIHN0cmlwcyBmcm9tIGZpbGVuYW1lczsgc2VlIHtAbGluayBzdHJpcFRhZ30gL1xuICogICAgIHtAbGluayBnZXRPYmplY3RDcmVhdGVkQXR9KVxuICogICAtIGNvbnRhaW5pbmcgYC9gLCBgXFxgLCBvciBhIE5VTCBieXRlXG4gKlxuICogVGhpcyBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlIGFnYWluc3QgcGF0aC10cmF2ZXJzYWwgYXR0YWNrcyB3aGVyZSBhXG4gKiByZXF1ZXN0IGJvZHkgc3VwcGxpZXMgYSBgcnVuSWRgIC8gYHN0ZXBJZGAgLyBgY29ycmVsYXRpb25JZGAgY29udGFpbmluZ1xuICogYC4uL2Agc2VxdWVuY2VzIHRvIHJlYWQgb3Igd3JpdGUgZmlsZXMgb3V0c2lkZSB0aGUgc3RvcmFnZSByb290LlxuICoge0BsaW5rIHJlc29sdmVXaXRoaW5CYXNlfSBwcm92aWRlcyBhIGJlbHQtYW5kLXN1c3BlbmRlcnMgY29udGFpbm1lbnRcbiAqIGNoZWNrIGF0IHRoZSBwb2ludCBvZiBgcGF0aC5qb2luYCBmb3IgZGVmZW5zZSBpbiBkZXB0aC5cbiAqXG4gKiBAcGFyYW0ga2luZCAtIEh1bWFuLXJlYWRhYmxlIGxhYmVsIHVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgKGUuZy4gXCJydW5JZFwiKVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlOyB0aHJvd3Mge0BsaW5rIFVuc2FmZUVudGl0eUlkRXJyb3J9XG4gKiAgIGlmIHRoZSB2YWx1ZSBpcyBub3Qgc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVFbnRpdHlJZChraW5kOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFxuICAgIHZhbHVlLmxlbmd0aCA9PT0gMCB8fFxuICAgIHZhbHVlLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCcvJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnXFxcXCcpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJ1xcMCcpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJy4nKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zYWZlRW50aXR5SWRFcnJvcihraW5kLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBKb2luIGBiYXNlZGlyYCB3aXRoIGFuIGVudGl0eS1yZWxhdGl2ZSBwYXRoIGFuZCBhc3NlcnQgdGhlIHJlc3VsdCBzdGF5c1xuICogaW5zaWRlIGBiYXNlZGlyYC4gQ29tcGxlbWVudHMge0BsaW5rIGFzc2VydFNhZmVFbnRpdHlJZH06IHBlci1lbnRyeS1wb2ludFxuICogdmFsaWRhdGlvbiBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlLCBhbmQgdGhpcyBmaW5hbCBjaGVjayBjYXRjaGVzIGFueSBwYXRoXG4gKiBlc2NhcGUgdGhhdCBzbGlwcGVkIHBhc3QgKGUuZy4gYSBuZXcgY2FsbCBzaXRlIHRoYXQgZm9yZ290IHRvIHZhbGlkYXRlLFxuICogb3IgYW4gdW51c3VhbCBjaGFyYWN0ZXIgY29tYmluYXRpb24gb24gYSBmdXR1cmUgZmlsZXN5c3RlbSkuIFRocm93c1xuICoge0BsaW5rIFVuc2FmZUVudGl0eUlkRXJyb3J9IGlmIHRoZSBqb2luZWQgcGF0aCBlc2NhcGVzIGBiYXNlZGlyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoaW5CYXNlKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIC4uLnNlZ21lbnRzOiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcGF0aC5yZXNvbHZlKGJhc2VkaXIpO1xuICBjb25zdCBqb2luZWQgPSBwYXRoLnJlc29sdmUoYmFzZWRpciwgLi4uc2VnbWVudHMpO1xuICBpZiAoam9pbmVkICE9PSByZXNvbHZlZEJhc2UgJiYgIWpvaW5lZC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSArIHBhdGguc2VwKSkge1xuICAgIHRocm93IG5ldyBVbnNhZmVFbnRpdHlJZEVycm9yKCdwYXRoJywgc2VnbWVudHMuam9pbignLycpKTtcbiAgfVxuICByZXR1cm4gam9pbmVkO1xufVxuXG5jb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vKipcbiAqIEV4ZWN1dGUgYSBmaWxlc3lzdGVtIG9wZXJhdGlvbiB3aXRoIHJldHJ5IGxvZ2ljIG9uIFdpbmRvd3MuXG4gKiBPbiBXaW5kb3dzLCBmaWxlIG9wZXJhdGlvbnMgY2FuIGZhaWwgd2l0aCBFUEVSTS9FQlVTWS9FQUNDRVMgd2hlbiBmaWxlc1xuICogYXJlIGJyaWVmbHkgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2VzcyBvciBhbnRpdmlydXMuIFRoaXMgd3JhcHBlciBhZGRzXG4gKiBleHBvbmVudGlhbCBiYWNrb2ZmIHJldHJ5IGxvZ2ljLiBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIGV4ZWN1dGVzIGRpcmVjdGx5LlxuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoV2luZG93c1JldHJ5PFQ+KFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgbWF4UmV0cmllcyA9IDVcbik6IFByb21pc2U8VD4ge1xuICBpZiAoIWlzV2luZG93cykgcmV0dXJuIGZuKCk7XG5cbiAgY29uc3QgcmV0cnlhYmxlRXJyb3JzID0gWydFUEVSTScsICdFQlVTWScsICdFQUNDRVMnXTtcbiAgY29uc3QgYmFzZURlbGF5TXMgPSAxMDtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3QgaXNSZXRyeWFibGUgPVxuICAgICAgICBhdHRlbXB0IDwgbWF4UmV0cmllcyAmJiByZXRyeWFibGVFcnJvcnMuaW5jbHVkZXMoZXJyb3IuY29kZSk7XG4gICAgICBpZiAoIWlzUmV0cnlhYmxlKSB0aHJvdyBlcnJvcjtcbiAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmYgd2l0aCBqaXR0ZXJcbiAgICAgIGNvbnN0IGRlbGF5ID0gYmFzZURlbGF5TXMgKiAyICoqIGF0dGVtcHQgKyBNYXRoLnJhbmRvbSgpICogYmFzZURlbGF5TXM7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgIH1cbiAgfVxuICAvLyBUeXBlU2NyaXB0OiB1bnJlYWNoYWJsZSwgYnV0IHNhdGlzZmllcyByZXR1cm4gdHlwZVxuICB0aHJvdyBuZXcgRXJyb3IoJ1JldHJ5IGxvb3AgZXhpdGVkIHVuZXhwZWN0ZWRseScpO1xufVxuXG4vLyBJbi1tZW1vcnkgY2FjaGUgb2YgY3JlYXRlZCBmaWxlcyB0byBhdm9pZCBleHBlbnNpdmUgZnMuYWNjZXNzKCkgY2FsbHNcbi8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIG9ubHkgd3JpdGUgb25jZSBwZXIgZmlsZSBwYXRoIChubyBvdmVyd3JpdGVzIHdpdGhvdXQgZXhwbGljaXQgZmxhZylcbmNvbnN0IGNyZWF0ZWRGaWxlc0NhY2hlID0gbmV3IFNldDxzdHJpbmc+KCk7XG4vLyBXcml0ZXMgcmVwZWF0ZWRseSB0YXJnZXQgYSBzbWFsbCBmaXhlZCBzZXQgb2YgZW50aXR5IGRpcmVjdG9yaWVzLiBPbmNlIG9uZVxuLy8gZXhpc3RzIGluIHRoaXMgcHJvY2VzcywgYXZvaWQgYW5vdGhlciByZWN1cnNpdmUgbWtkaXIgc3lzY2FsbCBwZXIgZXZlbnQuXG5jb25zdCBjcmVhdGVkRGlyZWN0b3JpZXNDYWNoZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4vKipcbiAqIENsZWFyIHdyaXRlLXBhdGggY2FjaGVzLiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiBmaWxlcyBhcmUgZGVsZXRlZCBleHRlcm5hbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSgpOiB2b2lkIHtcbiAgY3JlYXRlZEZpbGVzQ2FjaGUuY2xlYXIoKTtcbiAgY3JlYXRlZERpcmVjdG9yaWVzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZXhwb3J0IHsgdWxpZFRvRGF0ZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbi8qKlxuICogUmVnZXggbWF0Y2hpbmcgYSB0YWcgc3VmZml4IG9uIGEgZmlsZUlkIChhZnRlciBgLmpzb25gIGhhcyBiZWVuIHN0cmlwcGVkKS5cbiAqIEUuZy4sIGB3cnVuX0FCQy52aXRlc3QtMGAg4oaSIHRoZSBgLnZpdGVzdC0wYCBwYXJ0LlxuICogVGFncyBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjb250YWluIGFscGhhbnVtZXJpYyBjaGFycyBhbmQgaHlwaGVucy5cbiAqIEVudGl0eSBJRHMgKFVMSURzLCBzdGVwX04sIGV0Yy4pIG5ldmVyIGNvbnRhaW4gZG90cywgc28gdGhlIGZpcnN0IGRvdFxuICogYWx3YXlzIG1hcmtzIHRoZSB0YWcgYm91bmRhcnkuXG4gKi9cbmNvbnN0IFRBR19QQVRURVJOID0gL1xcLlthLXpBLVpdW2EtekEtWjAtOS1dKiQvO1xuXG4vKipcbiAqIFN0cmlwIGEgdGFnIHN1ZmZpeCBmcm9tIGEgZmlsZUlkLlxuICogYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgYHdydW5fQUJDYFxuICogYHdydW5fQUJDYCDihpIgYHdydW5fQUJDYCAobm8tb3AgaWYgbm8gdGFnKVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBUYWcoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmlsZUlkLnJlcGxhY2UoVEFHX1BBVFRFUk4sICcnKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZmlsZUlkIGJlbG9uZ3MgdG8gYSBzcGVjaWZpYyB0YWcuXG4gKiBgd3J1bl9BQkMudml0ZXN0LTBgIGJlbG9uZ3MgdG8gYHZpdGVzdC0wYC5cbiAqIFVudGFnZ2VkIGZpbGVJZHMgbmV2ZXIgbWF0Y2ggYSB0YWctc2NvcGVkIGxvb2t1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RhZyhmaWxlSWQ6IHN0cmluZywgdGFnOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbGVJZC5lbmRzV2l0aChgLiR7dGFnfWApO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBmaWxlSWQgY2FycmllcyBubyB0YWcgc3VmZml4IGF0IGFsbC5cbiAqIGB3cnVuX0FCQ2Ag4oaSIHRydWUsIGB3cnVuX0FCQy52aXRlc3QtMGAg4oaSIGZhbHNlLlxuICpcbiAqIEFuIHVudGFnZ2VkIHdvcmxkJ3MgcmVhZHMgKGByZWFkSlNPTldpdGhGYWxsYmFja2ApIGNhbiBvbmx5IHJlc29sdmUgdW50YWdnZWRcbiAqIGZpbGVzLCBzbyB3aGVuIGl0IGxpc3RzIGVudGl0aWVzIGZvciByZWNvdmVyeSBpdCBtdXN0IHNraXAgZmlsZXMgdGFnZ2VkIGJ5XG4gKiBvdGhlciB3b3JsZHMgKGUuZy4gdGhlIHZpdGVzdCBoYXJuZXNzKSBzaGFyaW5nIHRoZSBzYW1lIGRhdGEgZGlyZWN0b3J5IOKAlFxuICogb3RoZXJ3aXNlIGl0IHdvdWxkIHJlLWVucXVldWUgcnVucyBpdCBjYW5ub3Qgc3Vic2VxdWVudGx5IHJlYWQgYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW50YWdnZWQoZmlsZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFUQUdfUEFUVEVSTi50ZXN0KGZpbGVJZCk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGZpbGUgcGF0aCBmb3IgYW4gZW50aXR5LCB3aXRoIG9wdGlvbmFsIHRhZyBlbWJlZGRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gKiBgdGFnZ2VkUGF0aCgnL2RhdGEnLCAncnVucycsICd3cnVuX0FCQycsICd2aXRlc3QtMCcpYCDihpIgYC9kYXRhL3J1bnMvd3J1bl9BQkMudml0ZXN0LTAuanNvbmBcbiAqIGB0YWdnZWRQYXRoKCcvZGF0YScsICdydW5zJywgJ3dydW5fQUJDJylgIOKGkiBgL2RhdGEvcnVucy93cnVuX0FCQy5qc29uYFxuICpcbiAqIFRoZSBgZmlsZUlkYCBhbmQgYHRhZ2AgYXJlIHZhbGlkYXRlZCB3aXRoIHtAbGluayBhc3NlcnRTYWZlRW50aXR5SWR9IGFuZFxuICogdGhlIHJlc3VsdCBpcyBjb250YWlubWVudC1jaGVja2VkIHdpdGgge0BsaW5rIHJlc29sdmVXaXRoaW5CYXNlfSB0b1xuICogcHJldmVudCBwYXRoLXRyYXZlcnNhbCBhdHRhY2tzIHdoZW4gdmFsdWVzIGFyZSBkZXJpdmVkIGZyb20gdW50cnVzdGVkXG4gKiByZXF1ZXN0IGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnZ2VkUGF0aChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBlbnRpdHlEaXI6IHN0cmluZyxcbiAgZmlsZUlkOiBzdHJpbmcsXG4gIHRhZz86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlSWQnLCBmaWxlSWQpO1xuICBpZiAodGFnICE9PSB1bmRlZmluZWQpIGFzc2VydFNhZmVFbnRpdHlJZCgndGFnJywgdGFnKTtcbiAgY29uc3QgZmlsZW5hbWUgPSB0YWcgPyBgJHtmaWxlSWR9LiR7dGFnfS5qc29uYCA6IGAke2ZpbGVJZH0uanNvbmA7XG4gIHJldHVybiByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGZpbGVuYW1lKTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgSlNPTiBlbnRpdHkgd2l0aCB0YWdnZWQgZmFsbGJhY2suXG4gKiBXaGVuIGEgdGFnIGlzIHNldCwgdHJpZXMgdGhlIHRhZ2dlZCBwYXRoIGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiB1bnRhZ2dlZCBwYXRoIChzbyBhIHRhZ2dlZCB3b3JsZCBjYW4gcmVhZCBlbnRpdGllcyB3cml0dGVuIHdpdGhvdXQgYSB0YWcpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEpTT05XaXRoRmFsbGJhY2s8VD4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgZW50aXR5RGlyOiBzdHJpbmcsXG4gIGZpbGVJZDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnZmlsZUlkJywgZmlsZUlkKTtcbiAgaWYgKHRhZyAhPT0gdW5kZWZpbmVkKSBhc3NlcnRTYWZlRW50aXR5SWQoJ3RhZycsIHRhZyk7XG4gIGlmICh0YWcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkSlNPTihcbiAgICAgIHJlc29sdmVXaXRoaW5CYXNlKGJhc2VkaXIsIGVudGl0eURpciwgYCR7ZmlsZUlkfS4ke3RhZ30uanNvbmApLFxuICAgICAgc2NoZW1hXG4gICAgKTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiByZWFkSlNPTihcbiAgICByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGAke2ZpbGVJZH0uanNvbmApLFxuICAgIHNjaGVtYVxuICApO1xufVxuXG4vKipcbiAqIExpc3QgYWxsIGZpbGVuYW1lcyBpbiBhIGRpcmVjdG9yeSB0aGF0IGhhdmUgYSBzcGVjaWZpYyB0YWcuXG4gKiBSZXR1cm5zIGZ1bGwgZmlsZW5hbWVzIChlLmcuLCBgd3J1bl9BQkMudml0ZXN0LTAuanNvbmApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFRhZ2dlZEZpbGVzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHN1ZmZpeCA9IGAuJHt0YWd9Lmpzb25gO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKHN1ZmZpeCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogTGlzdCBhbGwgZmlsZW5hbWVzIGluIGEgZGlyZWN0b3J5IHRoYXQgaGF2ZSBhIHNwZWNpZmljIHRhZyBhbmQgZXh0ZW5zaW9uLlxuICogUmV0dXJucyBmdWxsIGZpbGVuYW1lcyAoZS5nLiwgYHN0cmVhbS1jaG5rX0FCQy52aXRlc3QtMC5iaW5gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYWdnZWRGaWxlc0J5RXh0ZW5zaW9uKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzdWZmaXggPSBgLiR7dGFnfSR7ZXh0ZW5zaW9ufWA7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoc3VmZml4KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcihkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICBpZiAoY3JlYXRlZERpcmVjdG9yaWVzQ2FjaGUuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ta2RpcihyZXNvbHZlZFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNyZWF0ZWREaXJlY3Rvcmllc0NhY2hlLmFkZChyZXNvbHZlZFBhdGgpO1xuICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAvLyBJZ25vcmUgaWYgYWxyZWFkeSBleGlzdHNcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3aXRoRW5zdXJlZERpcmVjdG9yeTxUPihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBhd2FpdCBlbnN1cmVEaXIoZGlyUGF0aCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gQSBkZXYgc2VydmVyIG1heSBvdXRsaXZlIGFuIGV4dGVybmFsIGNsZWFudXAgb2YgaXRzIGRhdGEgZGlyZWN0b3J5LlxuICAgIC8vIEZvcmdldCB0aGUgY2FjaGVkIGRpcmVjdG9yeSBhbmQgcmV0cnkgb25jZSBhZnRlciByZWNyZWF0aW5nIGl0LlxuICAgIGNyZWF0ZWREaXJlY3Rvcmllc0NhY2hlLmRlbGV0ZShwYXRoLnJlc29sdmUoZGlyUGF0aCkpO1xuICAgIGF3YWl0IGVuc3VyZURpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gb3BlcmF0aW9uKCk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFdyaXRlT3B0aW9ucyB7XG4gIG92ZXJ3cml0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gcmVwbGFjZXIgdGhhdCBlbmNvZGVzIFVpbnQ4QXJyYXkgYXMgYmFzZTY0IHN0cmluZ3MuXG4gKiBGb3JtYXQ6IHsgX190eXBlOiAnVWludDhBcnJheScsIGRhdGE6ICc8YmFzZTY0PicgfVxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJlcGxhY2VyKF9rZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdVaW50OEFycmF5JyxcbiAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gcmV2aXZlciB0aGF0IGRlY29kZXMgYmFzZTY0IHN0cmluZ3MgYmFjayB0byBVaW50OEFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJldml2ZXIoX2tleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgKHZhbHVlIGFzIGFueSkuX190eXBlID09PSAnVWludDhBcnJheScgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIGFueSkuZGF0YSA9PT0gJ3N0cmluZydcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCh2YWx1ZSBhcyBhbnkpLmRhdGEsICdiYXNlNjQnKSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVKU09OKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBhbnksXG4gIG9wdHM/OiBXcml0ZU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gd3JpdGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIGpzb25SZXBsYWNlciwgMiksIG9wdHMpO1xufVxuXG4vKipcbiAqIFdyaXRlcyBkYXRhIHRvIGEgZmlsZSB1c2luZyBhdG9taWMgd3JpdGUtcmVuYW1lIHBhdHRlcm4uXG4gKlxuICogTm90ZTogV2hpbGUgdGhpcyBmdW5jdGlvbiB1c2VzIHRlbXAgZmlsZXMgdG8gYXZvaWQgcGFydGlhbCB3cml0ZXMsXG4gKiBpdCBkb2VzIG5vdCBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBjb25jdXJyZW50IHdyaXRlcyBmcm9tIG11bHRpcGxlXG4gKiBwcm9jZXNzZXMuIEluIGEgbXVsdGktd3JpdGVyIHNjZW5hcmlvLCB0aGUgbGFzdCB3cml0ZXIgd2lucy5cbiAqIEZvciBwcm9kdWN0aW9uIHVzZSB3aXRoIG11bHRpcGxlIHdyaXRlcnMsIGNvbnNpZGVyIHVzaW5nIGEgcHJvcGVyXG4gKiBkYXRhYmFzZSBvciBsb2NraW5nIG1lY2hhbmlzbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBzdHJpbmcgfCBCdWZmZXIsXG4gIG9wdHM/OiBXcml0ZU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW9wdHM/Lm92ZXJ3cml0ZSkge1xuICAgIC8vIEZhc3QgcGF0aDogY2hlY2sgaW4tbWVtb3J5IGNhY2hlIGZpcnN0IHRvIGF2b2lkIGV4cGVuc2l2ZSBmcy5hY2Nlc3MoKSBjYWxsc1xuICAgIC8vIFRoaXMgcHJvdmlkZXMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2hlbiBjcmVhdGluZyBtYW55IGZpbGVzXG4gICAgaWYgKGNyZWF0ZWRGaWxlc0NhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICBgRmlsZSAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0cyBhbmQgJ292ZXJ3cml0ZScgaXMgZmFsc2VgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNsb3cgcGF0aDogY2hlY2sgZmlsZXN5c3RlbSBmb3IgZmlsZXMgY3JlYXRlZCBiZWZvcmUgdGhpcyBwcm9jZXNzIHN0YXJ0ZWRcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgIC8vIEZpbGUgZXhpc3RzIG9uIGRpc2ssIGFkZCB0byBjYWNoZSBmb3IgZnV0dXJlIGNoZWNrc1xuICAgICAgY3JlYXRlZEZpbGVzQ2FjaGUuYWRkKGZpbGVQYXRoKTtcbiAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICBgRmlsZSAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0cyBhbmQgJ292ZXJ3cml0ZScgaXMgZmFsc2VgXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIElmIGZpbGUgZG9lc24ndCBleGlzdCAoRU5PRU5UKSwgY29udGludWUgd2l0aCB3cml0ZVxuICAgICAgaWYgKGVycm9yLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRlbXBQYXRoID0gYCR7ZmlsZVBhdGh9LnRtcC4ke3VsaWQoKX1gO1xuICBsZXQgdGVtcEZpbGVDcmVhdGVkID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2l0aEVuc3VyZWREaXJlY3RvcnkocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBQYXRoLCBkYXRhKTtcbiAgICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnJlbmFtZSh0ZW1wUGF0aCwgZmlsZVBhdGgpKTtcbiAgICB9KTtcbiAgICAvLyBUcmFjayB0aGlzIGZpbGUgaW4gY2FjaGUgc28gZnV0dXJlIHdyaXRlcyBrbm93IGl0IGV4aXN0c1xuICAgIGNyZWF0ZWRGaWxlc0NhY2hlLmFkZChmaWxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gT25seSB0cnkgdG8gY2xlYW4gdXAgdGVtcCBmaWxlIGlmIGl0IHdhcyBhY3R1YWxseSBjcmVhdGVkXG4gICAgaWYgKHRlbXBGaWxlQ3JlYXRlZCkge1xuICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy51bmxpbmsodGVtcFBhdGgpLCAzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSlNPTjxUPihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGVjb2Rlcjogei5ab2RUeXBlPFQ+XG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICByZXR1cm4gZGVjb2Rlci5wYXJzZShKU09OLnBhcnNlKGNvbnRlbnQsIGpzb25SZXZpdmVyKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEJ1ZmZlcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlyc3RCeXRlKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmaWxlID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBieXRlID0gQnVmZmVyLmFsbG9jVW5zYWZlKDEpO1xuICAgIGNvbnN0IHsgYnl0ZXNSZWFkIH0gPSBhd2FpdCBmaWxlLnJlYWQoYnl0ZSwgMCwgMSwgMCk7XG4gICAgcmV0dXJuIGJ5dGVzUmVhZCA9PT0gMCA/IHVuZGVmaW5lZCA6IGJ5dGVbMF07XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZmlsZS5jbG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVKU09OKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy51bmxpbmsoZmlsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBBdG9taWNhbGx5IHB1Ymxpc2ggYSBmdWxseS13cml0dGVuIGZpbGUgd2l0aG91dCBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUuXG4gKlxuICogV3JpdGluZyBkaXJlY3RseSB3aXRoIE9fQ1JFQVQgfCBPX0VYQ0wgbWFrZXMgdGhlIGRlc3RpbmF0aW9uIHZpc2libGUgYmVmb3JlXG4gKiBpdHMgY29udGVudHMgYXJlIGNvbXBsZXRlLCBzbyBjb25jdXJyZW50IHJlYWRlcnMgY2FuIG9ic2VydmUgYSBwYXJ0aWFsIGZpbGUuXG4gKiBJbnN0ZWFkLCB3cml0ZSB0byBhIHVuaXF1ZSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgdGhlbiBoYXJkLWxpbmsgaXQgaW50b1xuICogcGxhY2UuIENyZWF0aW5nIHRoZSBsaW5rIGlzIGF0b21pYyBhbmQgZmFpbHMgd2l0aCBFRVhJU1QgaWYgYW5vdGhlciB3cml0ZXJcbiAqIHB1Ymxpc2hlZCB0aGUgZGVzdGluYXRpb24gZmlyc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUV4Y2x1c2l2ZShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGF0YTogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgdGVtcFBhdGggPSBgJHtmaWxlUGF0aH0udG1wLiR7dWxpZCgpfWA7XG4gIGxldCB0ZW1wRmlsZUNyZWF0ZWQgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB3aXRoRW5zdXJlZERpcmVjdG9yeShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGRhdGEsIHsgZmxhZzogJ3d4JyB9KTtcbiAgICAgIHRlbXBGaWxlQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMubGluayh0ZW1wUGF0aCwgZmlsZVBhdGgpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRUVYSVNUJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcEZpbGVDcmVhdGVkKSB7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnVubGluayh0ZW1wUGF0aCksIDMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RKU09ORmlsZXMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gbGlzdEZpbGVzQnlFeHRlbnNpb24oZGlyUGF0aCwgJy5qc29uJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0RmlsZXNCeUV4dGVuc2lvbihcbiAgZGlyUGF0aDogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXNcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoZXh0ZW5zaW9uKSlcbiAgICAgIC5tYXAoKGYpID0+IGYuc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5pbnRlcmZhY2UgUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+IHtcbiAgZGlyZWN0b3J5OiBzdHJpbmc7XG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+O1xuICAvKipcbiAgICogT3B0aW9uYWwgaW1tdXRhYmxlLWl0ZW0gY2FjaGUsIGtleWVkIGJ5IGFic29sdXRlIGZpbGUgcGF0aC4gRXZlbnQgZmlsZXNcbiAgICogYXJlIGFwcGVuZC1vbmx5LCBzbyB3b3JsZC1sb2NhbCBjYW4gcmVwbGF5IGV2ZW50cyBpdCBqdXN0IHBlcnNpc3RlZFxuICAgKiB3aXRob3V0IHJlcmVhZGluZyBhbmQgcmVwYXJzaW5nIHRoZW0gZnJvbSBkaXNrLlxuICAgKi9cbiAgY2FjaGVkSXRlbXM/OiBSZWFkb25seU1hcDxzdHJpbmcsIFQ+O1xuICBmaWxlUHJlZml4Pzogc3RyaW5nO1xuICBmaWxlSWRGaWx0ZXI/OiAoZmlsZUlkOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIGZpbHRlcj86IChpdGVtOiBUKSA9PiBib29sZWFuO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbiAgbGltaXQ/OiBudW1iZXI7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgZ2V0Q3JlYXRlZEF0KGZpbGVuYW1lOiBzdHJpbmcpOiBEYXRlIHwgbnVsbDtcbiAgZ2V0SWQ/KGl0ZW06IFQpOiBzdHJpbmc7XG59XG4vLyBDdXJzb3IgZm9ybWF0OiBcInRpbWVzdGFtcHxpZFwiIGZvciB0aWUtYnJlYWtpbmdcbmludGVyZmFjZSBQYXJzZWRDdXJzb3Ige1xuICB0aW1lc3RhbXA6IERhdGU7XG4gIGlkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUN1cnNvcihjdXJzb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFBhcnNlZEN1cnNvciB8IG51bGwge1xuICBpZiAoIWN1cnNvcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcGFydHMgPSBjdXJzb3Iuc3BsaXQoJ3wnKTtcbiAgcmV0dXJuIHtcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHBhcnRzWzBdKSxcbiAgICBpZDogcGFydHNbMV0gfHwgbnVsbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKHRpbWVzdGFtcDogRGF0ZSwgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBpZCA/IGAke3RpbWVzdGFtcC50b0lTT1N0cmluZygpfXwke2lkfWAgOiB0aW1lc3RhbXAudG9JU09TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhZ2luYXRlZEZpbGVTeXN0ZW1RdWVyeTxUIGV4dGVuZHMgeyBjcmVhdGVkQXQ6IERhdGUgfT4oXG4gIGNvbmZpZzogUGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5Q29uZmlnPFQ+XG4pOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPFQ+PiB7XG4gIGNvbnN0IHtcbiAgICBkaXJlY3RvcnksXG4gICAgc2NoZW1hLFxuICAgIGNhY2hlZEl0ZW1zLFxuICAgIGZpbGVQcmVmaXgsXG4gICAgZmlsZUlkRmlsdGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0T3JkZXIgPSAnZGVzYycsXG4gICAgbGltaXQgPSAyMCxcbiAgICBjdXJzb3IsXG4gICAgZ2V0Q3JlYXRlZEF0LFxuICAgIGdldElkLFxuICB9ID0gY29uZmlnO1xuXG4gIC8vIFZhbGlkYXRlIGZpbGVQcmVmaXggKHR5cGljYWxseSBgJHtydW5JZH0tYCkgc28gcmVxdWVzdC1kZXJpdmVkIHByZWZpeGVzXG4gIC8vIGNvbnNpc3RlbnRseSByZWplY3QgdW5zYWZlIGNoYXJhY3RlcnMuIGZpbGVQcmVmaXggaXMgb25seSB1c2VkIGJlbG93IHRvXG4gIC8vIGZpbHRlciByZWFkZGlyKCkgcmVzdWx0cyBieSBwcmVmaXgg4oCUIGl0IGRvZXNuJ3QgcGFydGljaXBhdGUgaW4gcGF0aFxuICAvLyBjb25zdHJ1Y3Rpb24g4oCUIGJ1dCBrZWVwaW5nIHRoZSB2YWxpZGF0aW9uIHJ1bGUgdW5pZm9ybSBhY3Jvc3MgdGhlXG4gIC8vIHN0b3JhZ2UgbGF5ZXIgYXZvaWRzIHNwZWNpYWwgY2FzZXMgYW5kIGNhdGNoZXMgYmFkIHZhbHVlcyBlYXJsaWVyLlxuICBpZiAoZmlsZVByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlUHJlZml4JywgZmlsZVByZWZpeCk7XG4gIH1cblxuICBjb25zdCByZXNvbHZlZERpcmVjdG9yeSA9IHBhdGgucmVzb2x2ZShkaXJlY3RvcnkpO1xuXG4gIC8vIDEuIEdldCBhbGwgSlNPTiBmaWxlcyBpbiBkaXJlY3RvcnlcbiAgY29uc3QgZmlsZUlkcyA9IGF3YWl0IGxpc3RKU09ORmlsZXMocmVzb2x2ZWREaXJlY3RvcnkpO1xuXG4gIC8vIDIuIEZpbHRlciBieSBwcmVmaXggaWYgcHJvdmlkZWRcbiAgY29uc3QgcmVsZXZhbnRGaWxlSWRzID0gZmlsZVByZWZpeFxuICAgID8gZmlsZUlkcy5maWx0ZXIoKGZpbGVJZCkgPT4gZmlsZUlkLnN0YXJ0c1dpdGgoZmlsZVByZWZpeCkpXG4gICAgOiBmaWxlSWRzO1xuICBjb25zdCBmaWx0ZXJlZEZpbGVJZHMgPSBmaWxlSWRGaWx0ZXJcbiAgICA/IHJlbGV2YW50RmlsZUlkcy5maWx0ZXIoZmlsZUlkRmlsdGVyKVxuICAgIDogcmVsZXZhbnRGaWxlSWRzO1xuXG4gIC8vIDMuIFVMSUQgT3B0aW1pemF0aW9uOiBGaWx0ZXIgYnkgY3Vyc29yIHVzaW5nIGZpbGVuYW1lIHRpbWVzdGFtcHMgYmVmb3JlIGxvYWRpbmcgSlNPTlxuICBjb25zdCBwYXJzZWRDdXJzb3IgPSBwYXJzZUN1cnNvcihjdXJzb3IpO1xuICBsZXQgY2FuZGlkYXRlRmlsZUlkcyA9IGZpbHRlcmVkRmlsZUlkcztcblxuICBpZiAocGFyc2VkQ3Vyc29yKSB7XG4gICAgY2FuZGlkYXRlRmlsZUlkcyA9IGZpbHRlcmVkRmlsZUlkcy5maWx0ZXIoKGZpbGVJZCkgPT4ge1xuICAgICAgY29uc3QgZmlsZW5hbWVEYXRlID0gZ2V0Q3JlYXRlZEF0KGAke2ZpbGVJZH0uanNvbmApO1xuICAgICAgaWYgKGZpbGVuYW1lRGF0ZSkge1xuICAgICAgICAvLyBVc2UgZmlsZW5hbWUgdGltZXN0YW1wIGZvciBjdXJzb3IgZmlsdGVyaW5nXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBoZXJlOiBpZiBwYXJzZWRDdXJzb3IgaGFzIGFuIElEIChmb3IgdGllLWJyZWFraW5nKSxcbiAgICAgICAgLy8gd2UgbmVlZCB0byBpbmNsdWRlIGl0ZW1zIHdpdGggdGhlIHNhbWUgdGltZXN0YW1wIGZvciBsYXRlciBJRC1iYXNlZCBmaWx0ZXJpbmcuXG4gICAgICAgIC8vIElmIG5vIElELCB3ZSBjYW4gdXNlIHN0cmljdCBpbmVxdWFsaXR5IGZvciBvcHRpbWl6YXRpb24uXG4gICAgICAgIGNvbnN0IGN1cnNvclRpbWUgPSBwYXJzZWRDdXJzb3IudGltZXN0YW1wLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgZmlsZVRpbWUgPSBmaWxlbmFtZURhdGUuZ2V0VGltZSgpO1xuXG4gICAgICAgIGlmIChwYXJzZWRDdXJzb3IuaWQpIHtcbiAgICAgICAgICAvLyBUaWUtYnJlYWtpbmcgbW9kZTogaW5jbHVkZSBpdGVtcyBhdCBvciBuZWFyIGN1cnNvciB0aW1lc3RhbXBcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyID09PSAnZGVzYydcbiAgICAgICAgICAgID8gZmlsZVRpbWUgPD0gY3Vyc29yVGltZVxuICAgICAgICAgICAgOiBmaWxlVGltZSA+PSBjdXJzb3JUaW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHRpZS1icmVha2luZzogc3RyaWN0IGluZXF1YWxpdHlcbiAgICAgICAgICByZXR1cm4gc29ydE9yZGVyID09PSAnZGVzYydcbiAgICAgICAgICAgID8gZmlsZVRpbWUgPCBjdXJzb3JUaW1lXG4gICAgICAgICAgICA6IGZpbGVUaW1lID4gY3Vyc29yVGltZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2FuJ3QgZXh0cmFjdCB0aW1lc3RhbXAgZnJvbSBmaWxlbmFtZSAoZS5nLiwgc3RlcHMgdXNlIHNlcXVlbnRpYWwgSURzKS5cbiAgICAgIC8vIEluY2x1ZGUgdGhlIGZpbGUgYW5kIGRlZmVyIHRvIEpTT04tYmFzZWQgZmlsdGVyaW5nIGJlbG93LlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICAvLyA0LiBMb2FkIGZpbGVzIGluZGl2aWR1YWxseSBhbmQgY29sbGVjdCB2YWxpZCBpdGVtc1xuICBjb25zdCB2YWxpZEl0ZW1zOiBUW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZpbGVJZCBvZiBjYW5kaWRhdGVGaWxlSWRzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWREaXJlY3RvcnksIGAke2ZpbGVJZH0uanNvbmApO1xuICAgIGxldCBpdGVtOiBUIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZEl0ZW0gPSBjYWNoZWRJdGVtcz8uZ2V0KGZpbGVQYXRoKTtcbiAgICAgIGl0ZW0gPVxuICAgICAgICBjYWNoZWRJdGVtID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGF3YWl0IHJlYWRKU09OKGZpbGVQYXRoLCBzY2hlbWEpXG4gICAgICAgICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoY2FjaGVkSXRlbSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIFdlIGRvbid0IGV4cGVjdCB6b2QgZXJyb3JzIHRvIGhhcHBlbiwgYnV0IGlmIHRoZSBKU09OIGRvZXMgZ2V0IG1hbGZvcm1lZCxcbiAgICAgIC8vIHdlIHNraXAgdGhlIGl0ZW0uIFByZWZlcmFibHksIHdlJ2QgaGF2ZSBhIHdheSB0byBtYXJrIGl0ZW1zIGFzIG1hbGZvcm1lZCxcbiAgICAgIC8vIHNvIHRoYXQgdGhlIFVJIGNhbiBkaXNwbGF5IHRoZW0gYXMgc3VjaCwgd2l0aCByaWNoZXIgbWVzc2FnaW5nLiBJbiB0aGUgbWVhbnRpbWUsXG4gICAgICAvLyB3ZSBqdXN0IGxvZyBhIHdhcm5pbmcgYW5kIHNraXAgdGhlIGl0ZW0uXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU2tpcHBpbmcgaXRlbSAke2ZpbGVJZH0gZHVlIHRvIG1hbGZvcm1lZCBKU09OOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChpdGVtKSB7XG4gICAgICAvLyBBcHBseSBjdXN0b20gZmlsdGVyIGVhcmx5IGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZmlsdGVyICYmICFmaWx0ZXIoaXRlbSkpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBEb3VibGUtY2hlY2sgY3Vyc29yIGZpbHRlcmluZyB3aXRoIGFjdHVhbCBjcmVhdGVkQXQgZnJvbSBKU09OXG4gICAgICAvLyAoaW4gY2FzZSBVTElEIHRpbWVzdGFtcCBkaWZmZXJzIGZyb20gc3RvcmVkIGNyZWF0ZWRBdClcbiAgICAgIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICAgICAgY29uc3QgaXRlbVRpbWUgPSBpdGVtLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGN1cnNvclRpbWUgPSBwYXJzZWRDdXJzb3IudGltZXN0YW1wLmdldFRpbWUoKTtcblxuICAgICAgICBpZiAoc29ydE9yZGVyID09PSAnZGVzYycpIHtcbiAgICAgICAgICAvLyBGb3IgZGVzY2VuZGluZyBvcmRlciwgc2tpcCBpdGVtcyA+PSBjdXJzb3JcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPiBjdXJzb3JUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCwgdXNlIElEIGZvciB0aWUtYnJlYWtpbmcgKHNraXAgaWYgSUQgPj0gY3Vyc29ySWQpXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID09PSBjdXJzb3JUaW1lICYmIHBhcnNlZEN1cnNvci5pZCAmJiBnZXRJZCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SWQoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbUlkID49IHBhcnNlZEN1cnNvci5pZCkgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBhc2NlbmRpbmcgb3JkZXIsIHNraXAgaXRlbXMgPD0gY3Vyc29yXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lIDwgY3Vyc29yVGltZSkgY29udGludWU7XG4gICAgICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwsIHVzZSBJRCBmb3IgdGllLWJyZWFraW5nIChza2lwIGlmIElEIDw9IGN1cnNvcklkKVxuICAgICAgICAgIGlmIChpdGVtVGltZSA9PT0gY3Vyc29yVGltZSAmJiBwYXJzZWRDdXJzb3IuaWQgJiYgZ2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldElkKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1JZCA8PSBwYXJzZWRDdXJzb3IuaWQpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YWxpZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLy8gNS4gU29ydCBieSBjcmVhdGVkQXQgKGFuZCBieSBJRCBmb3IgdGllLWJyZWFraW5nIGlmIGdldElkIGlzIHByb3ZpZGVkKVxuICB2YWxpZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhVGltZSA9IGEuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICBjb25zdCBiVGltZSA9IGIuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICBjb25zdCB0aW1lQ29tcGFyaXNvbiA9IHNvcnRPcmRlciA9PT0gJ2FzYycgPyBhVGltZSAtIGJUaW1lIDogYlRpbWUgLSBhVGltZTtcblxuICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsIGFuZCB3ZSBoYXZlIGdldElkLCB1c2UgSUQgZm9yIHN0YWJsZSBzb3J0aW5nXG4gICAgaWYgKHRpbWVDb21wYXJpc29uID09PSAwICYmIGdldElkKSB7XG4gICAgICBjb25zdCBhSWQgPSBnZXRJZChhKTtcbiAgICAgIGNvbnN0IGJJZCA9IGdldElkKGIpO1xuICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2FzYydcbiAgICAgICAgPyBhSWQubG9jYWxlQ29tcGFyZShiSWQpXG4gICAgICAgIDogYklkLmxvY2FsZUNvbXBhcmUoYUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZUNvbXBhcmlzb247XG4gIH0pO1xuXG4gIC8vIDYuIEFwcGx5IHBhZ2luYXRpb25cbiAgY29uc3QgaGFzTW9yZSA9IHZhbGlkSXRlbXMubGVuZ3RoID4gbGltaXQ7XG4gIGNvbnN0IGl0ZW1zID0gaGFzTW9yZSA/IHZhbGlkSXRlbXMuc2xpY2UoMCwgbGltaXQpIDogdmFsaWRJdGVtcztcbiAgY29uc3QgbmV4dEN1cnNvciA9XG4gICAgaXRlbXMubGVuZ3RoID4gMFxuICAgICAgPyBjcmVhdGVDdXJzb3IoXG4gICAgICAgICAgaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uY3JlYXRlZEF0LFxuICAgICAgICAgIGdldElkPy4oaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0pXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIGRhdGE6IGl0ZW1zLFxuICAgIGN1cnNvcjogbmV4dEN1cnNvcixcbiAgICBoYXNNb3JlLFxuICB9O1xufVxuIl19
|
|
567
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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dCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBFbnRpdHlDb25mbGljdEVycm9yLCBXb3JrZmxvd1dvcmxkRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGFnaW5hdGVkUmVzcG9uc2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCgpID0+IE1hdGgucmFuZG9tKCkpO1xuXG4vKipcbiAqIFRydW5jYXRlIGEgcG9zc2libHktdW50cnVzdGVkIHZhbHVlIGZvciBpbmNsdXNpb24gaW4gYW4gZXJyb3IgbWVzc2FnZS5cbiAqIEtlZXBzIGVycm9yIG91dHB1dCBhY3Rpb25hYmxlIGZvciBkZXZlbG9wZXJzIGluIGRldiBtb2RlIHdoaWxlIGxpbWl0aW5nXG4gKiB0aGUgYW1vdW50IG9mIGF0dGFja2VyLWNvbnRyb2xsZWQgZGF0YSByZWZsZWN0ZWQgYmFjayBpZiBhIGB3b3JsZC1sb2NhbGBcbiAqIGJhY2tlbmQgaXMgZXZlciBydW4gaW4gYSBjb250ZXh0IHRoYXQgc3VyZmFjZXMgdGhlc2UgbWVzc2FnZXMgdG8gY2xpZW50cy5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVGb3JFcnJvcih2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xuICBjb25zdCBNQVggPSA0ODtcbiAgcmV0dXJuIHMubGVuZ3RoID4gTUFYID8gYCR7cy5zbGljZSgwLCBNQVgpfeKApmAgOiBzO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgY2FsbGVyLXN1cHBsaWVkIGVudGl0eSBJRCBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgd291bGRcbiAqIGVzY2FwZSB0aGUgc3RvcmFnZSByb290IChwYXRoIHRyYXZlcnNhbCkgb3Igb3RoZXJ3aXNlIHByb2R1Y2UgYW4gdW5zYWZlXG4gKiBmaWxlbmFtZS4gRXh0ZW5kcyB7QGxpbmsgV29ya2Zsb3dXb3JsZEVycm9yfSBzbyB0aGUgcGxhdGZvcm0ncyBzdGFuZGFyZFxuICogZXJyb3ItdG8tSFRUUCBtYXBwaW5nIGhhbmRsZXMgaXQgYWxvbmdzaWRlIG90aGVyIHdvcmxkLWxheWVyIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFVuc2FmZUVudGl0eUlkRXJyb3IgZXh0ZW5kcyBXb3JrZmxvd1dvcmxkRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihraW5kOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGBVbnNhZmUgJHtraW5kfSBcIiR7dHJ1bmNhdGVGb3JFcnJvcih2YWx1ZSl9XCI6IG11c3Qgbm90IGJlIGVtcHR5LCBjb250YWluIFwiLlwiLCBcIi9cIiwgXCJcXFxcXCIsIG9yIG51bGwgYnl0ZXNgXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5zYWZlRW50aXR5SWRFcnJvcic7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBVbnNhZmVFbnRpdHlJZEVycm9yIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBFcnJvciAmJiB2YWx1ZS5uYW1lID09PSAnVW5zYWZlRW50aXR5SWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgc3RyaW5nIGlzIHNhZmUgdG8gZW1iZWQgaW4gYSBmaWxlc3lzdGVtIHBhdGggYXMgYSBzaW5nbGVcbiAqIHBhdGggY29tcG9uZW50LiBSZWplY3RzIHZhbHVlcyB0aGF0IGFyZTpcbiAqICAgLSBlbXB0eVxuICogICAtIHN0YXJ0aW5nIHdpdGggYC5gIChibG9ja3MgYC5gLCBgLi5gLCBgLmxvY2tzYCwgYC50bXBgLCBhbmQgb3RoZXJcbiAqICAgICBoaWRkZW4gb3IgcmVzZXJ2ZWQgZmlsZW5hbWVzKVxuICogICAtIGNvbnRhaW5pbmcgYC5gICh3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGAudGFnYCAvIGAuanNvbmAgc3VmZml4IHRoZVxuICogICAgIHRhZ2dpbmcgbG9naWMgc3RyaXBzIGZyb20gZmlsZW5hbWVzOyBzZWUge0BsaW5rIHN0cmlwVGFnfSAvXG4gKiAgICAge0BsaW5rIGdldE9iamVjdENyZWF0ZWRBdH0pXG4gKiAgIC0gY29udGFpbmluZyBgL2AsIGBcXGAsIG9yIGEgTlVMIGJ5dGVcbiAqXG4gKiBUaGlzIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UgYWdhaW5zdCBwYXRoLXRyYXZlcnNhbCBhdHRhY2tzIHdoZXJlIGFcbiAqIHJlcXVlc3QgYm9keSBzdXBwbGllcyBhIGBydW5JZGAgLyBgc3RlcElkYCAvIGBjb3JyZWxhdGlvbklkYCBjb250YWluaW5nXG4gKiBgLi4vYCBzZXF1ZW5jZXMgdG8gcmVhZCBvciB3cml0ZSBmaWxlcyBvdXRzaWRlIHRoZSBzdG9yYWdlIHJvb3QuXG4gKiB7QGxpbmsgcmVzb2x2ZVdpdGhpbkJhc2V9IHByb3ZpZGVzIGEgYmVsdC1hbmQtc3VzcGVuZGVycyBjb250YWlubWVudFxuICogY2hlY2sgYXQgdGhlIHBvaW50IG9mIGBwYXRoLmpvaW5gIGZvciBkZWZlbnNlIGluIGRlcHRoLlxuICpcbiAqIEBwYXJhbSBraW5kIC0gSHVtYW4tcmVhZGFibGUgbGFiZWwgdXNlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZSAoZS5nLiBcInJ1bklkXCIpXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGU7IHRocm93cyB7QGxpbmsgVW5zYWZlRW50aXR5SWRFcnJvcn1cbiAqICAgaWYgdGhlIHZhbHVlIGlzIG5vdCBzYWZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZUVudGl0eUlkKGtpbmQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoXG4gICAgdmFsdWUubGVuZ3RoID09PSAwIHx8XG4gICAgdmFsdWUuc3RhcnRzV2l0aCgnLicpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJy8nKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCdcXFxcJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnXFwwJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnLicpXG4gICkge1xuICAgIHRocm93IG5ldyBVbnNhZmVFbnRpdHlJZEVycm9yKGtpbmQsIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEpvaW4gYGJhc2VkaXJgIHdpdGggYW4gZW50aXR5LXJlbGF0aXZlIHBhdGggYW5kIGFzc2VydCB0aGUgcmVzdWx0IHN0YXlzXG4gKiBpbnNpZGUgYGJhc2VkaXJgLiBDb21wbGVtZW50cyB7QGxpbmsgYXNzZXJ0U2FmZUVudGl0eUlkfTogcGVyLWVudHJ5LXBvaW50XG4gKiB2YWxpZGF0aW9uIGlzIHRoZSBwcmltYXJ5IGRlZmVuc2UsIGFuZCB0aGlzIGZpbmFsIGNoZWNrIGNhdGNoZXMgYW55IHBhdGhcbiAqIGVzY2FwZSB0aGF0IHNsaXBwZWQgcGFzdCAoZS5nLiBhIG5ldyBjYWxsIHNpdGUgdGhhdCBmb3Jnb3QgdG8gdmFsaWRhdGUsXG4gKiBvciBhbiB1bnVzdWFsIGNoYXJhY3RlciBjb21iaW5hdGlvbiBvbiBhIGZ1dHVyZSBmaWxlc3lzdGVtKS4gVGhyb3dzXG4gKiB7QGxpbmsgVW5zYWZlRW50aXR5SWRFcnJvcn0gaWYgdGhlIGpvaW5lZCBwYXRoIGVzY2FwZXMgYGJhc2VkaXJgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpdGhpbkJhc2UoXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgLi4uc2VnbWVudHM6IHN0cmluZ1tdXG4pOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUoYmFzZWRpcik7XG4gIGNvbnN0IGpvaW5lZCA9IHBhdGgucmVzb2x2ZShiYXNlZGlyLCAuLi5zZWdtZW50cyk7XG4gIGlmIChqb2luZWQgIT09IHJlc29sdmVkQmFzZSAmJiAham9pbmVkLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlICsgcGF0aC5zZXApKSB7XG4gICAgdGhyb3cgbmV3IFVuc2FmZUVudGl0eUlkRXJyb3IoJ3BhdGgnLCBzZWdtZW50cy5qb2luKCcvJykpO1xuICB9XG4gIHJldHVybiBqb2luZWQ7XG59XG5cbmNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG5cbi8qKlxuICogRXhlY3V0ZSBhIGZpbGVzeXN0ZW0gb3BlcmF0aW9uIHdpdGggcmV0cnkgbG9naWMgb24gV2luZG93cy5cbiAqIE9uIFdpbmRvd3MsIGZpbGUgb3BlcmF0aW9ucyBjYW4gZmFpbCB3aXRoIEVQRVJNL0VCVVNZL0VBQ0NFUyB3aGVuIGZpbGVzXG4gKiBhcmUgYnJpZWZseSBsb2NrZWQgYnkgYW5vdGhlciBwcm9jZXNzIG9yIGFudGl2aXJ1cy4gVGhpcyB3cmFwcGVyIGFkZHNcbiAqIGV4cG9uZW50aWFsIGJhY2tvZmYgcmV0cnkgbG9naWMuIE9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcywgZXhlY3V0ZXMgZGlyZWN0bHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhXaW5kb3dzUmV0cnk8VD4oXG4gIGZuOiAoKSA9PiBQcm9taXNlPFQ+LFxuICBtYXhSZXRyaWVzID0gNVxuKTogUHJvbWlzZTxUPiB7XG4gIGlmICghaXNXaW5kb3dzKSByZXR1cm4gZm4oKTtcblxuICBjb25zdCByZXRyeWFibGVFcnJvcnMgPSBbJ0VQRVJNJywgJ0VCVVNZJywgJ0VBQ0NFUyddO1xuICBjb25zdCBiYXNlRGVsYXlNcyA9IDEwO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IG1heFJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBpc1JldHJ5YWJsZSA9XG4gICAgICAgIGF0dGVtcHQgPCBtYXhSZXRyaWVzICYmIHJldHJ5YWJsZUVycm9ycy5pbmNsdWRlcyhlcnJvci5jb2RlKTtcbiAgICAgIGlmICghaXNSZXRyeWFibGUpIHRocm93IGVycm9yO1xuICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZiB3aXRoIGppdHRlclxuICAgICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXlNcyAqIDIgKiogYXR0ZW1wdCArIE1hdGgucmFuZG9tKCkgKiBiYXNlRGVsYXlNcztcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgfVxuICB9XG4gIC8vIFR5cGVTY3JpcHQ6IHVucmVhY2hhYmxlLCBidXQgc2F0aXNmaWVzIHJldHVybiB0eXBlXG4gIHRocm93IG5ldyBFcnJvcignUmV0cnkgbG9vcCBleGl0ZWQgdW5leHBlY3RlZGx5Jyk7XG59XG5cbi8vIEluLW1lbW9yeSBjYWNoZSBvZiBjcmVhdGVkIGZpbGVzIHRvIGF2b2lkIGV4cGVuc2l2ZSBmcy5hY2Nlc3MoKSBjYWxsc1xuLy8gVGhpcyBpcyBzYWZlIGJlY2F1c2Ugd2Ugb25seSB3cml0ZSBvbmNlIHBlciBmaWxlIHBhdGggKG5vIG92ZXJ3cml0ZXMgd2l0aG91dCBleHBsaWNpdCBmbGFnKVxuY29uc3QgY3JlYXRlZEZpbGVzQ2FjaGUgPSBuZXcgU2V0PHN0cmluZz4oKTtcbi8vIFdyaXRlcyByZXBlYXRlZGx5IHRhcmdldCBhIHNtYWxsIGZpeGVkIHNldCBvZiBlbnRpdHkgZGlyZWN0b3JpZXMuIE9uY2Ugb25lXG4vLyBleGlzdHMgaW4gdGhpcyBwcm9jZXNzLCBhdm9pZCBhbm90aGVyIHJlY3Vyc2l2ZSBta2RpciBzeXNjYWxsIHBlciBldmVudC5cbmNvbnN0IGNyZWF0ZWREaXJlY3Rvcmllc0NhY2hlID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogQ2xlYXIgd3JpdGUtcGF0aCBjYWNoZXMuIFVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIGZpbGVzIGFyZSBkZWxldGVkIGV4dGVybmFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlKCk6IHZvaWQge1xuICBjcmVhdGVkRmlsZXNDYWNoZS5jbGVhcigpO1xuICBjcmVhdGVkRGlyZWN0b3JpZXNDYWNoZS5jbGVhcigpO1xufVxuXG5leHBvcnQgeyB1bGlkVG9EYXRlIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBSZWdleCBtYXRjaGluZyBhIHRhZyBzdWZmaXggb24gYSBmaWxlSWQgKGFmdGVyIGAuanNvbmAgaGFzIGJlZW4gc3RyaXBwZWQpLlxuICogRS5nLiwgYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgdGhlIGAudml0ZXN0LTBgIHBhcnQuXG4gKiBUYWdzIHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJzIGFuZCBoeXBoZW5zLlxuICogRW50aXR5IElEcyAoVUxJRHMsIHN0ZXBfTiwgZXRjLikgbmV2ZXIgY29udGFpbiBkb3RzLCBzbyB0aGUgZmlyc3QgZG90XG4gKiBhbHdheXMgbWFya3MgdGhlIHRhZyBib3VuZGFyeS5cbiAqL1xuY29uc3QgVEFHX1BBVFRFUk4gPSAvXFwuW2EtekEtWl1bYS16QS1aMC05LV0qJC87XG5cbi8qKlxuICogU3RyaXAgYSB0YWcgc3VmZml4IGZyb20gYSBmaWxlSWQuXG4gKiBgd3J1bl9BQkMudml0ZXN0LTBgIOKGkiBgd3J1bl9BQkNgXG4gKiBgd3J1bl9BQkNgIOKGkiBgd3J1bl9BQkNgIChuby1vcCBpZiBubyB0YWcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFRhZyhmaWxlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmaWxlSWQucmVwbGFjZShUQUdfUEFUVEVSTiwgJycpO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBmaWxlSWQgYmVsb25ncyB0byBhIHNwZWNpZmljIHRhZy5cbiAqIGB3cnVuX0FCQy52aXRlc3QtMGAgYmVsb25ncyB0byBgdml0ZXN0LTBgLlxuICogVW50YWdnZWQgZmlsZUlkcyBuZXZlciBtYXRjaCBhIHRhZy1zY29wZWQgbG9va3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVGFnKGZpbGVJZDogc3RyaW5nLCB0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZUlkLmVuZHNXaXRoKGAuJHt0YWd9YCk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGZpbGVJZCBjYXJyaWVzIG5vIHRhZyBzdWZmaXggYXQgYWxsLlxuICogYHdydW5fQUJDYCDihpIgdHJ1ZSwgYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgZmFsc2UuXG4gKlxuICogQW4gdW50YWdnZWQgd29ybGQncyByZWFkcyAoYHJlYWRKU09OV2l0aEZhbGxiYWNrYCkgY2FuIG9ubHkgcmVzb2x2ZSB1bnRhZ2dlZFxuICogZmlsZXMsIHNvIHdoZW4gaXQgbGlzdHMgZW50aXRpZXMgZm9yIHJlY292ZXJ5IGl0IG11c3Qgc2tpcCBmaWxlcyB0YWdnZWQgYnlcbiAqIG90aGVyIHdvcmxkcyAoZS5nLiB0aGUgdml0ZXN0IGhhcm5lc3MpIHNoYXJpbmcgdGhlIHNhbWUgZGF0YSBkaXJlY3Rvcnkg4oCUXG4gKiBvdGhlcndpc2UgaXQgd291bGQgcmUtZW5xdWV1ZSBydW5zIGl0IGNhbm5vdCBzdWJzZXF1ZW50bHkgcmVhZCBiYWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVbnRhZ2dlZChmaWxlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIVRBR19QQVRURVJOLnRlc3QoZmlsZUlkKTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgZmlsZSBwYXRoIGZvciBhbiBlbnRpdHksIHdpdGggb3B0aW9uYWwgdGFnIGVtYmVkZGVkIGluIHRoZSBmaWxlbmFtZS5cbiAqIGB0YWdnZWRQYXRoKCcvZGF0YScsICdydW5zJywgJ3dydW5fQUJDJywgJ3ZpdGVzdC0wJylgIOKGkiBgL2RhdGEvcnVucy93cnVuX0FCQy52aXRlc3QtMC5qc29uYFxuICogYHRhZ2dlZFBhdGgoJy9kYXRhJywgJ3J1bnMnLCAnd3J1bl9BQkMnKWAg4oaSIGAvZGF0YS9ydW5zL3dydW5fQUJDLmpzb25gXG4gKlxuICogVGhlIGBmaWxlSWRgIGFuZCBgdGFnYCBhcmUgdmFsaWRhdGVkIHdpdGgge0BsaW5rIGFzc2VydFNhZmVFbnRpdHlJZH0gYW5kXG4gKiB0aGUgcmVzdWx0IGlzIGNvbnRhaW5tZW50LWNoZWNrZWQgd2l0aCB7QGxpbmsgcmVzb2x2ZVdpdGhpbkJhc2V9IHRvXG4gKiBwcmV2ZW50IHBhdGgtdHJhdmVyc2FsIGF0dGFja3Mgd2hlbiB2YWx1ZXMgYXJlIGRlcml2ZWQgZnJvbSB1bnRydXN0ZWRcbiAqIHJlcXVlc3QgaW5wdXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdnZWRQYXRoKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIGVudGl0eURpcjogc3RyaW5nLFxuICBmaWxlSWQ6IHN0cmluZyxcbiAgdGFnPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVJZCcsIGZpbGVJZCk7XG4gIGlmICh0YWcgIT09IHVuZGVmaW5lZCkgYXNzZXJ0U2FmZUVudGl0eUlkKCd0YWcnLCB0YWcpO1xuICBjb25zdCBmaWxlbmFtZSA9IHRhZyA/IGAke2ZpbGVJZH0uJHt0YWd9Lmpzb25gIDogYCR7ZmlsZUlkfS5qc29uYDtcbiAgcmV0dXJuIHJlc29sdmVXaXRoaW5CYXNlKGJhc2VkaXIsIGVudGl0eURpciwgZmlsZW5hbWUpO1xufVxuXG4vKipcbiAqIFJlYWQgYSBKU09OIGVudGl0eSB3aXRoIHRhZ2dlZCBmYWxsYmFjay5cbiAqIFdoZW4gYSB0YWcgaXMgc2V0LCB0cmllcyB0aGUgdGFnZ2VkIHBhdGggZmlyc3QsIHRoZW4gZmFsbHMgYmFjayB0byB0aGVcbiAqIHVudGFnZ2VkIHBhdGggKHNvIGEgdGFnZ2VkIHdvcmxkIGNhbiByZWFkIGVudGl0aWVzIHdyaXR0ZW4gd2l0aG91dCBhIHRhZykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSlNPTldpdGhGYWxsYmFjazxUPihcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBlbnRpdHlEaXI6IHN0cmluZyxcbiAgZmlsZUlkOiBzdHJpbmcsXG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+LFxuICB0YWc/OiBzdHJpbmdcbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlSWQnLCBmaWxlSWQpO1xuICBpZiAodGFnICE9PSB1bmRlZmluZWQpIGFzc2VydFNhZmVFbnRpdHlJZCgndGFnJywgdGFnKTtcbiAgaWYgKHRhZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgcmVzb2x2ZVdpdGhpbkJhc2UoYmFzZWRpciwgZW50aXR5RGlyLCBgJHtmaWxlSWR9LiR7dGFnfS5qc29uYCksXG4gICAgICBzY2hlbWFcbiAgICApO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIHJlYWRKU09OKFxuICAgIHJlc29sdmVXaXRoaW5CYXNlKGJhc2VkaXIsIGVudGl0eURpciwgYCR7ZmlsZUlkfS5qc29uYCksXG4gICAgc2NoZW1hXG4gICk7XG59XG5cbi8qKlxuICogTGlzdCBhbGwgZmlsZW5hbWVzIGluIGEgZGlyZWN0b3J5IHRoYXQgaGF2ZSBhIHNwZWNpZmljIHRhZy5cbiAqIFJldHVybnMgZnVsbCBmaWxlbmFtZXMgKGUuZy4sIGB3cnVuX0FCQy52aXRlc3QtMC5qc29uYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0VGFnZ2VkRmlsZXMoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc3VmZml4ID0gYC4ke3RhZ30uanNvbmA7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoc3VmZml4KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBmaWxlbmFtZXMgaW4gYSBkaXJlY3RvcnkgdGhhdCBoYXZlIGEgc3BlY2lmaWMgdGFnIGFuZCBleHRlbnNpb24uXG4gKiBSZXR1cm5zIGZ1bGwgZmlsZW5hbWVzIChlLmcuLCBgc3RyZWFtLWNobmtfQUJDLnZpdGVzdC0wLmJpbmApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFRhZ2dlZEZpbGVzQnlFeHRlbnNpb24oXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgdGFnOiBzdHJpbmcsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHN1ZmZpeCA9IGAuJHt0YWd9JHtleHRlbnNpb259YDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZGlyUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChzdWZmaXgpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBbXTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIGlmIChjcmVhdGVkRGlyZWN0b3JpZXNDYWNoZS5oYXMocmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGZzLm1rZGlyKHJlc29sdmVkUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY3JlYXRlZERpcmVjdG9yaWVzQ2FjaGUuYWRkKHJlc29sdmVkUGF0aCk7XG4gIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgIC8vIElnbm9yZSBpZiBhbHJlYWR5IGV4aXN0c1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdpdGhFbnN1cmVkRGlyZWN0b3J5PFQ+KFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGF3YWl0IGVuc3VyZURpcihkaXJQYXRoKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBBIGRldiBzZXJ2ZXIgbWF5IG91dGxpdmUgYW4gZXh0ZXJuYWwgY2xlYW51cCBvZiBpdHMgZGF0YSBkaXJlY3RvcnkuXG4gICAgLy8gRm9yZ2V0IHRoZSBjYWNoZWQgZGlyZWN0b3J5IGFuZCByZXRyeSBvbmNlIGFmdGVyIHJlY3JlYXRpbmcgaXQuXG4gICAgY3JlYXRlZERpcmVjdG9yaWVzQ2FjaGUuZGVsZXRlKHBhdGgucmVzb2x2ZShkaXJQYXRoKSk7XG4gICAgYXdhaXQgZW5zdXJlRGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBvcGVyYXRpb24oKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgV3JpdGVPcHRpb25zIHtcbiAgb3ZlcndyaXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gSlNPTiByZXBsYWNlciB0aGF0IGVuY29kZXMgVWludDhBcnJheSBhcyBiYXNlNjQgc3RyaW5ncy5cbiAqIEZvcm1hdDogeyBfX3R5cGU6ICdVaW50OEFycmF5JywgZGF0YTogJzxiYXNlNjQ+JyB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUmVwbGFjZXIoX2tleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fdHlwZTogJ1VpbnQ4QXJyYXknLFxuICAgICAgZGF0YTogQnVmZmVyLmZyb20odmFsdWUpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBDdXN0b20gSlNPTiByZXZpdmVyIHRoYXQgZGVjb2RlcyBiYXNlNjQgc3RyaW5ncyBiYWNrIHRvIFVpbnQ4QXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uUmV2aXZlcihfa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAodmFsdWUgYXMgYW55KS5fX3R5cGUgPT09ICdVaW50OEFycmF5JyAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgYW55KS5kYXRhID09PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oKHZhbHVlIGFzIGFueSkuZGF0YSwgJ2Jhc2U2NCcpKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUpTT04oXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IGFueSxcbiAgb3B0cz86IFdyaXRlT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiB3cml0ZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoZGF0YSwganNvblJlcGxhY2VyLCAyKSwgb3B0cyk7XG59XG5cbi8qKlxuICogV3JpdGVzIGRhdGEgdG8gYSBmaWxlIHVzaW5nIGF0b21pYyB3cml0ZS1yZW5hbWUgcGF0dGVybi5cbiAqXG4gKiBOb3RlOiBXaGlsZSB0aGlzIGZ1bmN0aW9uIHVzZXMgdGVtcCBmaWxlcyB0byBhdm9pZCBwYXJ0aWFsIHdyaXRlcyxcbiAqIGl0IGRvZXMgbm90IHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGNvbmN1cnJlbnQgd3JpdGVzIGZyb20gbXVsdGlwbGVcbiAqIHByb2Nlc3Nlcy4gSW4gYSBtdWx0aS13cml0ZXIgc2NlbmFyaW8sIHRoZSBsYXN0IHdyaXRlciB3aW5zLlxuICogRm9yIHByb2R1Y3Rpb24gdXNlIHdpdGggbXVsdGlwbGUgd3JpdGVycywgY29uc2lkZXIgdXNpbmcgYSBwcm9wZXJcbiAqIGRhdGFiYXNlIG9yIGxvY2tpbmcgbWVjaGFuaXNtLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcixcbiAgb3B0cz86IFdyaXRlT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghb3B0cz8ub3ZlcndyaXRlKSB7XG4gICAgLy8gRmFzdCBwYXRoOiBjaGVjayBpbi1tZW1vcnkgY2FjaGUgZmlyc3QgdG8gYXZvaWQgZXhwZW5zaXZlIGZzLmFjY2VzcygpIGNhbGxzXG4gICAgLy8gVGhpcyBwcm92aWRlcyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB3aGVuIGNyZWF0aW5nIG1hbnkgZmlsZXNcbiAgICBpZiAoY3JlYXRlZEZpbGVzQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgIGBGaWxlICR7ZmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzIGFuZCAnb3ZlcndyaXRlJyBpcyBmYWxzZWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2xvdyBwYXRoOiBjaGVjayBmaWxlc3lzdGVtIGZvciBmaWxlcyBjcmVhdGVkIGJlZm9yZSB0aGlzIHByb2Nlc3Mgc3RhcnRlZFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgLy8gRmlsZSBleGlzdHMgb24gZGlzaywgYWRkIHRvIGNhY2hlIGZvciBmdXR1cmUgY2hlY2tzXG4gICAgICBjcmVhdGVkRmlsZXNDYWNoZS5hZGQoZmlsZVBhdGgpO1xuICAgICAgdGhyb3cgbmV3IEVudGl0eUNvbmZsaWN0RXJyb3IoXG4gICAgICAgIGBGaWxlICR7ZmlsZVBhdGh9IGFscmVhZHkgZXhpc3RzIGFuZCAnb3ZlcndyaXRlJyBpcyBmYWxzZWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSWYgZmlsZSBkb2Vzbid0IGV4aXN0IChFTk9FTlQpLCBjb250aW51ZSB3aXRoIHdyaXRlXG4gICAgICBpZiAoZXJyb3IuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGVtcFBhdGggPSBgJHtmaWxlUGF0aH0udG1wLiR7dWxpZCgpfWA7XG4gIGxldCB0ZW1wRmlsZUNyZWF0ZWQgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3aXRoRW5zdXJlZERpcmVjdG9yeShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGRhdGEpO1xuICAgICAgdGVtcEZpbGVDcmVhdGVkID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMucmVuYW1lKHRlbXBQYXRoLCBmaWxlUGF0aCkpO1xuICAgIH0pO1xuICAgIC8vIFRyYWNrIHRoaXMgZmlsZSBpbiBjYWNoZSBzbyBmdXR1cmUgd3JpdGVzIGtub3cgaXQgZXhpc3RzXG4gICAgY3JlYXRlZEZpbGVzQ2FjaGUuYWRkKGZpbGVQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IHRyeSB0byBjbGVhbiB1cCB0ZW1wIGZpbGUgaWYgaXQgd2FzIGFjdHVhbGx5IGNyZWF0ZWRcbiAgICBpZiAodGVtcEZpbGVDcmVhdGVkKSB7XG4gICAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnVubGluayh0ZW1wUGF0aCksIDMpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRKU09OPFQ+KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkZWNvZGVyOiB6LlpvZFR5cGU8VD5cbik6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgIHJldHVybiBkZWNvZGVyLnBhcnNlKEpTT04ucGFyc2UoY29udGVudCwganNvblJldml2ZXIpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQnVmZmVyKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICByZXR1cm4gY29udGVudDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRGaXJzdEJ5dGUoXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGZpbGUgPSBhd2FpdCBmcy5vcGVuKGZpbGVQYXRoLCAncicpO1xuICB0cnkge1xuICAgIGNvbnN0IGJ5dGUgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMSk7XG4gICAgY29uc3QgeyBieXRlc1JlYWQgfSA9IGF3YWl0IGZpbGUucmVhZChieXRlLCAwLCAxLCAwKTtcbiAgICByZXR1cm4gYnl0ZXNSZWFkID09PSAwID8gdW5kZWZpbmVkIDogYnl0ZVswXTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmaWxlLmNsb3NlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUpTT04oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEF0b21pY2FsbHkgcHVibGlzaCBhIGZ1bGx5LXdyaXR0ZW4gZmlsZSB3aXRob3V0IG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZS5cbiAqXG4gKiBXcml0aW5nIGRpcmVjdGx5IHdpdGggT19DUkVBVCB8IE9fRVhDTCBtYWtlcyB0aGUgZGVzdGluYXRpb24gdmlzaWJsZSBiZWZvcmVcbiAqIGl0cyBjb250ZW50cyBhcmUgY29tcGxldGUsIHNvIGNvbmN1cnJlbnQgcmVhZGVycyBjYW4gb2JzZXJ2ZSBhIHBhcnRpYWwgZmlsZS5cbiAqIEluc3RlYWQsIHdyaXRlIHRvIGEgdW5pcXVlIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGVuIGhhcmQtbGluayBpdCBpbnRvXG4gKiBwbGFjZS4gQ3JlYXRpbmcgdGhlIGxpbmsgaXMgYXRvbWljIGFuZCBmYWlscyB3aXRoIEVFWElTVCBpZiBhbm90aGVyIHdyaXRlclxuICogcHVibGlzaGVkIHRoZSBkZXN0aW5hdGlvbiBmaXJzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRXhjbHVzaXZlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB0ZW1wUGF0aCA9IGAke2ZpbGVQYXRofS50bXAuJHt1bGlkKCl9YDtcbiAgbGV0IHRlbXBGaWxlQ3JlYXRlZCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHdpdGhFbnN1cmVkRGlyZWN0b3J5KHBhdGguZGlybmFtZShmaWxlUGF0aCksIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgICAgdGVtcEZpbGVDcmVhdGVkID0gdHJ1ZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy5saW5rKHRlbXBQYXRoLCBmaWxlUGF0aCkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdFRVhJU1QnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0ZW1wRmlsZUNyZWF0ZWQpIHtcbiAgICAgIGF3YWl0IHdpdGhXaW5kb3dzUmV0cnkoKCkgPT4gZnMudW5saW5rKHRlbXBQYXRoKSwgMykuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEpTT05GaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHJldHVybiBsaXN0RmlsZXNCeUV4dGVuc2lvbihkaXJQYXRoLCAnLmpzb24nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RGaWxlc0J5RXh0ZW5zaW9uKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlc1xuICAgICAgLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChleHRlbnNpb24pKVxuICAgICAgLm1hcCgoZikgPT4gZi5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmludGVyZmFjZSBQYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnlDb25maWc8VD4ge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD47XG4gIC8qKlxuICAgKiBPcHRpb25hbCBpbW11dGFibGUtaXRlbSBjYWNoZSwga2V5ZWQgYnkgYWJzb2x1dGUgZmlsZSBwYXRoLiBFdmVudCBmaWxlc1xuICAgKiBhcmUgYXBwZW5kLW9ubHksIHNvIHdvcmxkLWxvY2FsIGNhbiByZXBsYXkgZXZlbnRzIGl0IGp1c3QgcGVyc2lzdGVkXG4gICAqIHdpdGhvdXQgcmVyZWFkaW5nIGFuZCByZXBhcnNpbmcgdGhlbSBmcm9tIGRpc2suXG4gICAqL1xuICBjYWNoZWRJdGVtcz86IFJlYWRvbmx5TWFwPHN0cmluZywgVD47XG4gIGZpbGVQcmVmaXg/OiBzdHJpbmc7XG4gIGZpbGVJZEZpbHRlcj86IChmaWxlSWQ6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgZmlsdGVyPzogKGl0ZW06IFQpID0+IGJvb2xlYW47XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBsaW1pdD86IG51bWJlcjtcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBnZXRDcmVhdGVkQXQoZmlsZW5hbWU6IHN0cmluZyk6IERhdGUgfCBudWxsO1xuICBnZXRJZD8oaXRlbTogVCk6IHN0cmluZztcbn1cbi8vIEN1cnNvciBmb3JtYXQ6IFwidGltZXN0YW1wfGlkXCIgZm9yIHRpZS1icmVha2luZ1xuaW50ZXJmYWNlIFBhcnNlZEN1cnNvciB7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbiAgaWQ6IHN0cmluZyB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3Vyc29yKGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogUGFyc2VkQ3Vyc29yIHwgbnVsbCB7XG4gIGlmICghY3Vyc29yKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBwYXJ0cyA9IGN1cnNvci5zcGxpdCgnfCcpO1xuICByZXR1cm4ge1xuICAgIHRpbWVzdGFtcDogbmV3IERhdGUocGFydHNbMF0pLFxuICAgIGlkOiBwYXJ0c1sxXSB8fCBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IodGltZXN0YW1wOiBEYXRlLCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlkID8gYCR7dGltZXN0YW1wLnRvSVNPU3RyaW5nKCl9fCR7aWR9YCA6IHRpbWVzdGFtcC50b0lTT1N0cmluZygpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5PFQgZXh0ZW5kcyB7IGNyZWF0ZWRBdDogRGF0ZSB9PihcbiAgY29uZmlnOiBQYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnlDb25maWc8VD5cbik6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8VD4+IHtcbiAgY29uc3Qge1xuICAgIGRpcmVjdG9yeSxcbiAgICBzY2hlbWEsXG4gICAgY2FjaGVkSXRlbXMsXG4gICAgZmlsZVByZWZpeCxcbiAgICBmaWxlSWRGaWx0ZXIsXG4gICAgZmlsdGVyLFxuICAgIHNvcnRPcmRlciA9ICdkZXNjJyxcbiAgICBsaW1pdCA9IDIwLFxuICAgIGN1cnNvcixcbiAgICBnZXRDcmVhdGVkQXQsXG4gICAgZ2V0SWQsXG4gIH0gPSBjb25maWc7XG5cbiAgLy8gVmFsaWRhdGUgZmlsZVByZWZpeCAodHlwaWNhbGx5IGAke3J1bklkfS1gKSBzbyByZXF1ZXN0LWRlcml2ZWQgcHJlZml4ZXNcbiAgLy8gY29uc2lzdGVudGx5IHJlamVjdCB1bnNhZmUgY2hhcmFjdGVycy4gZmlsZVByZWZpeCBpcyBvbmx5IHVzZWQgYmVsb3cgdG9cbiAgLy8gZmlsdGVyIHJlYWRkaXIoKSByZXN1bHRzIGJ5IHByZWZpeCDigJQgaXQgZG9lc24ndCBwYXJ0aWNpcGF0ZSBpbiBwYXRoXG4gIC8vIGNvbnN0cnVjdGlvbiDigJQgYnV0IGtlZXBpbmcgdGhlIHZhbGlkYXRpb24gcnVsZSB1bmlmb3JtIGFjcm9zcyB0aGVcbiAgLy8gc3RvcmFnZSBsYXllciBhdm9pZHMgc3BlY2lhbCBjYXNlcyBhbmQgY2F0Y2hlcyBiYWQgdmFsdWVzIGVhcmxpZXIuXG4gIGlmIChmaWxlUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVQcmVmaXgnLCBmaWxlUHJlZml4KTtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRGlyZWN0b3J5ID0gcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSk7XG5cbiAgLy8gMS4gR2V0IGFsbCBKU09OIGZpbGVzIGluIGRpcmVjdG9yeVxuICBjb25zdCBmaWxlSWRzID0gYXdhaXQgbGlzdEpTT05GaWxlcyhyZXNvbHZlZERpcmVjdG9yeSk7XG5cbiAgLy8gMi4gRmlsdGVyIGJ5IHByZWZpeCBpZiBwcm92aWRlZFxuICBjb25zdCByZWxldmFudEZpbGVJZHMgPSBmaWxlUHJlZml4XG4gICAgPyBmaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiBmaWxlSWQuc3RhcnRzV2l0aChmaWxlUHJlZml4KSlcbiAgICA6IGZpbGVJZHM7XG4gIGNvbnN0IGZpbHRlcmVkRmlsZUlkcyA9IGZpbGVJZEZpbHRlclxuICAgID8gcmVsZXZhbnRGaWxlSWRzLmZpbHRlcihmaWxlSWRGaWx0ZXIpXG4gICAgOiByZWxldmFudEZpbGVJZHM7XG5cbiAgLy8gMy4gVUxJRCBPcHRpbWl6YXRpb246IEZpbHRlciBieSBjdXJzb3IgdXNpbmcgZmlsZW5hbWUgdGltZXN0YW1wcyBiZWZvcmUgbG9hZGluZyBKU09OXG4gIGNvbnN0IHBhcnNlZEN1cnNvciA9IHBhcnNlQ3Vyc29yKGN1cnNvcik7XG4gIGxldCBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzO1xuXG4gIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICBjYW5kaWRhdGVGaWxlSWRzID0gZmlsdGVyZWRGaWxlSWRzLmZpbHRlcigoZmlsZUlkKSA9PiB7XG4gICAgICBjb25zdCBmaWxlbmFtZURhdGUgPSBnZXRDcmVhdGVkQXQoYCR7ZmlsZUlkfS5qc29uYCk7XG4gICAgICBpZiAoZmlsZW5hbWVEYXRlKSB7XG4gICAgICAgIC8vIFVzZSBmaWxlbmFtZSB0aW1lc3RhbXAgZm9yIGN1cnNvciBmaWx0ZXJpbmdcbiAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBjYXJlZnVsIGhlcmU6IGlmIHBhcnNlZEN1cnNvciBoYXMgYW4gSUQgKGZvciB0aWUtYnJlYWtpbmcpLFxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGluY2x1ZGUgaXRlbXMgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAgZm9yIGxhdGVyIElELWJhc2VkIGZpbHRlcmluZy5cbiAgICAgICAgLy8gSWYgbm8gSUQsIHdlIGNhbiB1c2Ugc3RyaWN0IGluZXF1YWxpdHkgZm9yIG9wdGltaXphdGlvbi5cbiAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHBhcnNlZEN1cnNvci50aW1lc3RhbXAuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBmaWxlVGltZSA9IGZpbGVuYW1lRGF0ZS5nZXRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHBhcnNlZEN1cnNvci5pZCkge1xuICAgICAgICAgIC8vIFRpZS1icmVha2luZyBtb2RlOiBpbmNsdWRlIGl0ZW1zIGF0IG9yIG5lYXIgY3Vyc29yIHRpbWVzdGFtcFxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8PSBjdXJzb3JUaW1lXG4gICAgICAgICAgICA6IGZpbGVUaW1lID49IGN1cnNvclRpbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gdGllLWJyZWFraW5nOiBzdHJpY3QgaW5lcXVhbGl0eVxuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJ1xuICAgICAgICAgICAgPyBmaWxlVGltZSA8IGN1cnNvclRpbWVcbiAgICAgICAgICAgIDogZmlsZVRpbWUgPiBjdXJzb3JUaW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBDYW4ndCBleHRyYWN0IHRpbWVzdGFtcCBmcm9tIGZpbGVuYW1lIChlLmcuLCBzdGVwcyB1c2Ugc2VxdWVudGlhbCBJRHMpLlxuICAgICAgLy8gSW5jbHVkZSB0aGUgZmlsZSBhbmQgZGVmZXIgdG8gSlNPTi1iYXNlZCBmaWx0ZXJpbmcgYmVsb3cuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDQuIExvYWQgZmlsZXMgd2l0aCBib3VuZGVkIGNvbmN1cnJlbmN5IGFuZCBjb2xsZWN0IHZhbGlkIGl0ZW1zLlxuICAvLyBSZWFkcyBhcmUgaW5kZXBlbmRlbnQ7IG9yZGVyaW5nIGlzIHJlc3RvcmVkIGJ5IHRoZSBzb3J0IGJlbG93LlxuICBjb25zdCByZWFkQ29uY3VycmVuY3kgPSAzMjtcbiAgY29uc3QgdmFsaWRJdGVtczogVFtdID0gW107XG5cbiAgZm9yIChcbiAgICBsZXQgYmF0Y2hTdGFydCA9IDA7XG4gICAgYmF0Y2hTdGFydCA8IGNhbmRpZGF0ZUZpbGVJZHMubGVuZ3RoO1xuICAgIGJhdGNoU3RhcnQgKz0gcmVhZENvbmN1cnJlbmN5XG4gICkge1xuICAgIGNvbnN0IGJhdGNoID0gY2FuZGlkYXRlRmlsZUlkcy5zbGljZShcbiAgICAgIGJhdGNoU3RhcnQsXG4gICAgICBiYXRjaFN0YXJ0ICsgcmVhZENvbmN1cnJlbmN5XG4gICAgKTtcbiAgICBjb25zdCBsb2FkZWRCYXRjaCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYmF0Y2gubWFwKGFzeW5jIChmaWxlSWQpOiBQcm9taXNlPFQgfCBudWxsPiA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHJlc29sdmVkRGlyZWN0b3J5LCBgJHtmaWxlSWR9Lmpzb25gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjYWNoZWRJdGVtID0gY2FjaGVkSXRlbXM/LmdldChmaWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIGNhY2hlZEl0ZW0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBhd2FpdCByZWFkSlNPTihmaWxlUGF0aCwgc2NoZW1hKVxuICAgICAgICAgICAgOiBzdHJ1Y3R1cmVkQ2xvbmUoY2FjaGVkSXRlbSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHpvZCBlcnJvcnMgdG8gaGFwcGVuLCBidXQgaWYgdGhlIEpTT04gZG9lcyBnZXQgbWFsZm9ybWVkLFxuICAgICAgICAgIC8vIHdlIHNraXAgdGhlIGl0ZW0uIFByZWZlcmFibHksIHdlJ2QgaGF2ZSBhIHdheSB0byBtYXJrIGl0ZW1zIGFzIG1hbGZvcm1lZCxcbiAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBVSSBjYW4gZGlzcGxheSB0aGVtIGFzIHN1Y2gsIHdpdGggcmljaGVyIG1lc3NhZ2luZy4gSW4gdGhlIG1lYW50aW1lLFxuICAgICAgICAgIC8vIHdlIGp1c3QgbG9nIGEgd2FybmluZyBhbmQgc2tpcCB0aGUgaXRlbS5cbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiB6LlpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBTa2lwcGluZyBpdGVtICR7ZmlsZUlkfSBkdWUgdG8gbWFsZm9ybWVkIEpTT046ICR7ZXJyb3IubWVzc2FnZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbG9hZGVkQmF0Y2gpIHtcbiAgICAgIGlmICghaXRlbSkgY29udGludWU7XG4gICAgICAvLyBBcHBseSBjdXN0b20gZmlsdGVyIGVhcmx5IGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZmlsdGVyICYmICFmaWx0ZXIoaXRlbSkpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBEb3VibGUtY2hlY2sgY3Vyc29yIGZpbHRlcmluZyB3aXRoIGFjdHVhbCBjcmVhdGVkQXQgZnJvbSBKU09OXG4gICAgICAvLyAoaW4gY2FzZSBVTElEIHRpbWVzdGFtcCBkaWZmZXJzIGZyb20gc3RvcmVkIGNyZWF0ZWRBdClcbiAgICAgIGlmIChwYXJzZWRDdXJzb3IpIHtcbiAgICAgICAgY29uc3QgaXRlbVRpbWUgPSBpdGVtLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGN1cnNvclRpbWUgPSBwYXJzZWRDdXJzb3IudGltZXN0YW1wLmdldFRpbWUoKTtcblxuICAgICAgICBpZiAoc29ydE9yZGVyID09PSAnZGVzYycpIHtcbiAgICAgICAgICAvLyBGb3IgZGVzY2VuZGluZyBvcmRlciwgc2tpcCBpdGVtcyA+PSBjdXJzb3JcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPiBjdXJzb3JUaW1lKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCwgdXNlIElEIGZvciB0aWUtYnJlYWtpbmcgKHNraXAgaWYgSUQgPj0gY3Vyc29ySWQpXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID09PSBjdXJzb3JUaW1lICYmIHBhcnNlZEN1cnNvci5pZCAmJiBnZXRJZCkge1xuICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gZ2V0SWQoaXRlbSk7XG4gICAgICAgICAgICBpZiAoaXRlbUlkID49IHBhcnNlZEN1cnNvci5pZCkgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBhc2NlbmRpbmcgb3JkZXIsIHNraXAgaXRlbXMgPD0gY3Vyc29yXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lIDwgY3Vyc29yVGltZSkgY29udGludWU7XG4gICAgICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwsIHVzZSBJRCBmb3IgdGllLWJyZWFraW5nIChza2lwIGlmIElEIDw9IGN1cnNvcklkKVxuICAgICAgICAgIGlmIChpdGVtVGltZSA9PT0gY3Vyc29yVGltZSAmJiBwYXJzZWRDdXJzb3IuaWQgJiYgZ2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldElkKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1JZCA8PSBwYXJzZWRDdXJzb3IuaWQpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YWxpZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLy8gNS4gU29ydCBieSBjcmVhdGVkQXQgKGFuZCBieSBJRCBmb3IgdGllLWJyZWFraW5nIGlmIGdldElkIGlzIHByb3ZpZGVkKVxuICB2YWxpZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhVGltZSA9IGEuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICBjb25zdCBiVGltZSA9IGIuY3JlYXRlZEF0LmdldFRpbWUoKTtcbiAgICBjb25zdCB0aW1lQ29tcGFyaXNvbiA9IHNvcnRPcmRlciA9PT0gJ2FzYycgPyBhVGltZSAtIGJUaW1lIDogYlRpbWUgLSBhVGltZTtcblxuICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsIGFuZCB3ZSBoYXZlIGdldElkLCB1c2UgSUQgZm9yIHN0YWJsZSBzb3J0aW5nXG4gICAgaWYgKHRpbWVDb21wYXJpc29uID09PSAwICYmIGdldElkKSB7XG4gICAgICBjb25zdCBhSWQgPSBnZXRJZChhKTtcbiAgICAgIGNvbnN0IGJJZCA9IGdldElkKGIpO1xuICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2FzYydcbiAgICAgICAgPyBhSWQubG9jYWxlQ29tcGFyZShiSWQpXG4gICAgICAgIDogYklkLmxvY2FsZUNvbXBhcmUoYUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGltZUNvbXBhcmlzb247XG4gIH0pO1xuXG4gIC8vIDYuIEFwcGx5IHBhZ2luYXRpb25cbiAgY29uc3QgaGFzTW9yZSA9IHZhbGlkSXRlbXMubGVuZ3RoID4gbGltaXQ7XG4gIGNvbnN0IGl0ZW1zID0gaGFzTW9yZSA/IHZhbGlkSXRlbXMuc2xpY2UoMCwgbGltaXQpIDogdmFsaWRJdGVtcztcbiAgY29uc3QgbmV4dEN1cnNvciA9XG4gICAgaXRlbXMubGVuZ3RoID4gMFxuICAgICAgPyBjcmVhdGVDdXJzb3IoXG4gICAgICAgICAgaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uY3JlYXRlZEF0LFxuICAgICAgICAgIGdldElkPy4oaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0pXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIGRhdGE6IGl0ZW1zLFxuICAgIGN1cnNvcjogbmV4dEN1cnNvcixcbiAgICBoYXNNb3JlLFxuICB9O1xufVxuIl19
|
package/dist/index.d.ts
CHANGED
|
@@ -22,5 +22,9 @@ export type LocalWorld = World & {
|
|
|
22
22
|
* @throws {DataDirAccessError} If the data directory cannot be created or accessed
|
|
23
23
|
* @throws {DataDirVersionError} If the data directory version is incompatible
|
|
24
24
|
*/
|
|
25
|
+
export declare function createWorld(args?: Partial<Config>): LocalWorld;
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated Use `createWorld()` instead.
|
|
28
|
+
*/
|
|
25
29
|
export declare function createLocalWorld(args?: Partial<Config>): LocalWorld;
|
|
26
30
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAa1C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAa1C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAO7D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,+EAA+E;IAC/E,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACnE,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAkL9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAEnE"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import { initDataDir } from './init.js';
|
|
|
8
8
|
import { instrumentObject } from './instrumentObject.js';
|
|
9
9
|
import { createQueue } from './queue.js';
|
|
10
10
|
import { hashToken, hookRecoveryMarkerPath } from './storage/helpers.js';
|
|
11
|
+
import { resetHookIndexEnsureCache } from './storage/hook-index.js';
|
|
11
12
|
import { createStorage } from './storage.js';
|
|
12
13
|
import { createStreamer } from './streamer.js';
|
|
13
14
|
// Re-export init types and utilities for consumers
|
|
@@ -25,7 +26,7 @@ export { DataDirAccessError, DataDirVersionError, ensureDataDir, initDataDir, pa
|
|
|
25
26
|
* @throws {DataDirAccessError} If the data directory cannot be created or accessed
|
|
26
27
|
* @throws {DataDirVersionError} If the data directory version is incompatible
|
|
27
28
|
*/
|
|
28
|
-
export function
|
|
29
|
+
export function createWorld(args) {
|
|
29
30
|
const definedArgs = args
|
|
30
31
|
? Object.fromEntries(Object.entries(args).filter(([, value]) => value !== undefined))
|
|
31
32
|
: {};
|
|
@@ -99,6 +100,7 @@ export function createLocalWorld(args) {
|
|
|
99
100
|
'steps',
|
|
100
101
|
'events',
|
|
101
102
|
'hooks',
|
|
103
|
+
'hooks/by-run',
|
|
102
104
|
'waits',
|
|
103
105
|
'streams/runs',
|
|
104
106
|
];
|
|
@@ -107,24 +109,69 @@ export function createLocalWorld(args) {
|
|
|
107
109
|
const files = await listTaggedFiles(fullDir, tag);
|
|
108
110
|
await Promise.all(files.map((f) => deleteJSON(path.join(fullDir, f))));
|
|
109
111
|
}));
|
|
112
|
+
// Delete tagged hook-index entries (nested per-key directories)
|
|
113
|
+
for (const indexDir of ['token-index', 'id-index']) {
|
|
114
|
+
const fullIndexDir = path.join(basedir, 'hooks', indexDir);
|
|
115
|
+
let keyDirEntries;
|
|
116
|
+
try {
|
|
117
|
+
keyDirEntries = await fs.readdir(fullIndexDir, {
|
|
118
|
+
withFileTypes: true,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
keyDirEntries = [];
|
|
123
|
+
}
|
|
124
|
+
await Promise.all(keyDirEntries
|
|
125
|
+
.filter((entry) => entry.isDirectory())
|
|
126
|
+
.map(async (entry) => {
|
|
127
|
+
const keyDir = path.join(fullIndexDir, entry.name);
|
|
128
|
+
const taggedEntryFiles = await listTaggedFiles(keyDir, tag);
|
|
129
|
+
await Promise.all(taggedEntryFiles.map((f) => deleteJSON(path.join(keyDir, f))));
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
110
132
|
// Clean up lock files used for atomic terminal-state guards
|
|
111
133
|
await fs
|
|
112
134
|
.rm(path.join(basedir, '.locks'), { recursive: true, force: true })
|
|
113
135
|
.catch(() => { });
|
|
114
|
-
// Delete tagged stream chunks (.{tag}.bin files)
|
|
136
|
+
// Delete tagged stream chunks (.{tag}.bin files). Chunks are sharded
|
|
137
|
+
// one directory per stream (streams/chunks/<streamName>/<chunkId>.{tag}.bin),
|
|
138
|
+
// so iterate each per-stream directory — the top-level chunks dir now
|
|
139
|
+
// holds only subdirectories, so listing it directly would match nothing
|
|
140
|
+
// and silently leak tagged chunk files across test sessions.
|
|
115
141
|
const chunksDir = path.join(basedir, 'streams', 'chunks');
|
|
116
|
-
|
|
117
|
-
|
|
142
|
+
let streamDirEntries;
|
|
143
|
+
try {
|
|
144
|
+
streamDirEntries = await fs.readdir(chunksDir, {
|
|
145
|
+
withFileTypes: true,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
streamDirEntries = [];
|
|
150
|
+
}
|
|
151
|
+
await Promise.all(streamDirEntries
|
|
152
|
+
.filter((entry) => entry.isDirectory())
|
|
153
|
+
.map(async (entry) => {
|
|
154
|
+
const streamChunkDir = path.join(chunksDir, entry.name);
|
|
155
|
+
const taggedBinFiles = await listTaggedFilesByExtension(streamChunkDir, tag, '.bin');
|
|
156
|
+
await Promise.all(taggedBinFiles.map((f) => fs.unlink(path.join(streamChunkDir, f)).catch(() => { })));
|
|
157
|
+
}));
|
|
118
158
|
// Clear the in-memory write cache so deleted paths are forgotten
|
|
119
159
|
clearCreatedFilesCache();
|
|
120
160
|
}
|
|
121
161
|
else {
|
|
122
162
|
// `rm()` removes directories that the write path may have cached.
|
|
123
163
|
clearCreatedFilesCache();
|
|
164
|
+
resetHookIndexEnsureCache();
|
|
124
165
|
await rm(mergedConfig.dataDir, { recursive: true, force: true });
|
|
125
166
|
await initDataDir(mergedConfig.dataDir);
|
|
126
167
|
}
|
|
127
168
|
},
|
|
128
169
|
};
|
|
129
170
|
}
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsZUFBZSxFQUNmLDBCQUEwQixFQUMxQixRQUFRLEdBQ1QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFzQixNQUFNLFlBQVksQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLG1EQUFtRDtBQUNuRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsV0FBVyxFQUVYLFlBQVksR0FDYixNQUFNLFdBQVcsQ0FBQztBQVduQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBc0I7SUFDckQsTUFBTSxXQUFXLEdBQUcsSUFBSTtRQUN0QixDQUFDLENBQUMsTUFBTSxDQUFD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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHJtIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZVByZWZpeCwgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcmVlbnF1ZXVlQWN0aXZlUnVucywgU1BFQ19WRVJTSU9OX0NVUlJFTlQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlLFxuICBkZWxldGVKU09OLFxuICBoYXNUYWcsXG4gIGlzVW50YWdnZWQsXG4gIGxpc3RUYWdnZWRGaWxlcyxcbiAgbGlzdFRhZ2dlZEZpbGVzQnlFeHRlbnNpb24sXG4gIHJlYWRKU09OLFxufSBmcm9tICcuL2ZzLmpzJztcbmltcG9ydCB7IGluaXREYXRhRGlyIH0gZnJvbSAnLi9pbml0LmpzJztcbmltcG9ydCB7IGluc3RydW1lbnRPYmplY3QgfSBmcm9tICcuL2luc3RydW1lbnRPYmplY3QuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVldWUsIHR5cGUgRGlyZWN0SGFuZGxlciB9IGZyb20gJy4vcXVldWUuanMnO1xuaW1wb3J0IHsgaGFzaFRva2VuLCBob29rUmVjb3ZlcnlNYXJrZXJQYXRoIH0gZnJvbSAnLi9zdG9yYWdlL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmFnZSB9IGZyb20gJy4vc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJlYW1lciB9IGZyb20gJy4vc3RyZWFtZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgaW5pdCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBjb25zdW1lcnNcbmV4cG9ydCB7XG4gIERhdGFEaXJBY2Nlc3NFcnJvcixcbiAgRGF0YURpclZlcnNpb25FcnJvcixcbiAgZW5zdXJlRGF0YURpcixcbiAgaW5pdERhdGFEaXIsXG4gIHR5cGUgUGFyc2VkVmVyc2lvbixcbiAgcGFyc2VWZXJzaW9uLFxufSBmcm9tICcuL2luaXQuanMnO1xuXG5leHBvcnQgdHlwZSB7IERpcmVjdEhhbmRsZXIgfSBmcm9tICcuL3F1ZXVlLmpzJztcblxuZXhwb3J0IHR5cGUgTG9jYWxXb3JsZCA9IFdvcmxkICYge1xuICAvKiogUmVnaXN0ZXIgYSBkaXJlY3QgaW4tcHJvY2VzcyBoYW5kbGVyIGZvciBhIHF1ZXVlIHByZWZpeCwgYnlwYXNzaW5nIEhUVFAuICovXG4gIHJlZ2lzdGVySGFuZGxlcihwcmVmaXg6IFF1ZXVlUHJlZml4LCBoYW5kbGVyOiBEaXJlY3RIYW5kbGVyKTogdm9pZDtcbiAgLyoqIENsZWFyIGFsbCB3b3JrZmxvdyBkYXRhIChydW5zLCBzdGVwcywgZXZlbnRzLCBob29rcywgc3RyZWFtcykuICovXG4gIGNsZWFyKCk6IFByb21pc2U8dm9pZD47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBsb2NhbCB3b3JsZCBpbnN0YW5jZSB0aGF0IGNvbWJpbmVzIHF1ZXVlLCBzdG9yYWdlLCBhbmQgc3RyZWFtZXIgZnVuY3Rpb25hbGl0aWVzLlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBhcmdzLmRhdGFEaXIgLSBEaXJlY3RvcnkgZm9yIHN0b3Jpbmcgd29ya2Zsb3cgZGF0YSAoZGVmYXVsdDogYC53b3JrZmxvdy1kYXRhL2ApXG4gKiBAcGFyYW0gYXJncy5wb3J0IC0gUG9ydCBvdmVycmlkZSBmb3IgcXVldWUgdHJhbnNwb3J0IChkZWZhdWx0OiBhdXRvLWRldGVjdGVkKVxuICogQHBhcmFtIGFyZ3MuYmFzZVVybCAtIEZ1bGwgYmFzZSBVUkwgb3ZlcnJpZGUgZm9yIHF1ZXVlIHRyYW5zcG9ydCAoZGVmYXVsdDogYGh0dHA6Ly9sb2NhbGhvc3Q6e3BvcnR9YClcbiAqIEBwYXJhbSBhcmdzLnJlY292ZXJBY3RpdmVSdW5zIC0gV2hldGhlciBgc3RhcnQoKWAgc2hvdWxkIHJlLWVucXVldWUgcGVuZGluZy9ydW5uaW5nIHJ1bnMgZnJvbSBzdG9yYWdlIChkZWZhdWx0OiBgdHJ1ZWApXG4gKiBAcGFyYW0gYXJncy50YWcgLSBPcHRpb25hbCB0YWcgdG8gc2NvcGUgZmlsZXMgKGUuZy4sIGB2aXRlc3QtMGApLiBXaGVuIHNldCwgZmlsZXMgYXJlIHdyaXR0ZW5cbiAqICAgYXMgYHtpZH0ue3RhZ30uanNvbmAgYW5kIGBjbGVhcigpYCBvbmx5IGRlbGV0ZXMgZmlsZXMgbWF0Y2hpbmcgdGhpcyB0YWcuXG4gKiBAdGhyb3dzIHtEYXRhRGlyQWNjZXNzRXJyb3J9IElmIHRoZSBkYXRhIGRpcmVjdG9yeSBjYW5ub3QgYmUgY3JlYXRlZCBvciBhY2Nlc3NlZFxuICogQHRocm93cyB7RGF0YURpclZlcnNpb25FcnJvcn0gSWYgdGhlIGRhdGEgZGlyZWN0b3J5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2NhbFdvcmxkKGFyZ3M/OiBQYXJ0aWFsPENvbmZpZz4pOiBMb2NhbFdvcmxkIHtcbiAgY29uc3QgZGVmaW5lZEFyZ3MgPSBhcmdzXG4gICAgPyBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGFyZ3MpLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgKVxuICAgIDoge307XG4gIGNvbnN0IG1lcmdlZENvbmZpZyA9IHsgLi4uY29uZmlnLnZhbHVlLCAuLi5kZWZpbmVkQXJncyB9O1xuICBjb25zdCB0YWcgPSBtZXJnZWRDb25maWcudGFnO1xuICBjb25zdCBxdWV1ZSA9IGNyZWF0ZVF1ZXVlKG1lcmdlZENvbmZpZyk7XG4gIGNvbnN0IHsgY2xlYXJDYWNoZTogY2xlYXJTdG9yYWdlQ2FjaGUsIC4uLnN0b3JhZ2UgfSA9IGNyZWF0ZVN0b3JhZ2UoXG4gICAgbWVyZ2VkQ29uZmlnLmRhdGFEaXIsXG4gICAgdGFnXG4gICk7XG4gIGNvbnN0IHJlY292ZXJBY3RpdmVSdW5zID0gbWVyZ2VkQ29uZmlnLnJlY292ZXJBY3RpdmVSdW5zID8/IHRydWU7XG4gIHJldHVybiB7XG4gICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgIC4uLnF1ZXVlLFxuICAgIC4uLnN0b3JhZ2UsXG4gICAgLi4uaW5zdHJ1bWVudE9iamVjdCgnd29ybGQuc3RyZWFtcycsIHtcbiAgICAgIC4uLmNyZWF0ZVN0cmVhbWVyKG1lcmdlZENvbmZpZy5kYXRhRGlyLCB0YWcpLFxuICAgICAgLi4uKG1lcmdlZENvbmZpZy5zdHJlYW1GbHVzaEludGVydmFsTXMgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIHN0cmVhbUZsdXNoSW50ZXJ2YWxNczogbWVyZ2VkQ29uZmlnLnN0cmVhbUZsdXNoSW50ZXJ2YWxNcyxcbiAgICAgIH0pLFxuICAgIH0pLFxuICAgIGFzeW5jIHN0YXJ0KCkge1xuICAgICAgYXdhaXQgaW5pdERhdGFEaXIobWVyZ2VkQ29uZmlnLmRhdGFEaXIpO1xuICAgICAgaWYgKCFyZWNvdmVyQWN0aXZlUnVucykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTY29wZSByZWNvdmVyeSB0byB0aGlzIHdvcmxkJ3Mgb3duIGZpbGVzLiBBIHRhZ2dlZCB3b3JsZCByZWNvdmVycyBvbmx5XG4gICAgICAvLyBpdHMgdGFnOyBhbiB1bnRhZ2dlZCB3b3JsZCByZWNvdmVycyBvbmx5IHVudGFnZ2VkIGZpbGVzLiBXaXRob3V0IHRoZVxuICAgICAgLy8gdW50YWdnZWQgZmlsdGVyLCBhbiB1bnRhZ2dlZCBkZXYgc2VydmVyIHNoYXJpbmcgdGhlIGRhdGEgZGlyZWN0b3J5IHdpdGhcbiAgICAgIC8vIHRoZSB2aXRlc3QgaGFybmVzcyB3b3VsZCBsaXN0IHRhZ2dlZCBydW5zIChsaXN0IGVudW1lcmF0ZXMgZXZlcnkgZmlsZSlcbiAgICAgIC8vIGFuZCByZS1lbnF1ZXVlIHRoZW0sIGJ1dCBydW5fc3RhcnRlZCdzIHRhZ2dlZC1vci11bnRhZ2dlZCByZWFkIGNhbid0XG4gICAgICAvLyByZXNvbHZlIGEgZm9yZWlnbiB0YWcg4oCUIHlpZWxkaW5nIFwiZGlkIG5vdCByZXR1cm4gdGhlIHJ1biBlbnRpdHlcIiA1MDBzXG4gICAgICAvLyBvbiBzdGFydHVwIHVudGlsIHRoZSBtZXNzYWdlIGV4aGF1c3RzIGl0cyBkZWxpdmVyaWVzLlxuICAgICAgY29uc3QgZmlsZUlkRmlsdGVyID0gdGFnXG4gICAgICAgID8gKGZpbGVJZDogc3RyaW5nKSA9PiBoYXNUYWcoZmlsZUlkLCB0YWcpXG4gICAgICAgIDogaXNVbnRhZ2dlZDtcbiAgICAgIGNvbnN0IHJlY292ZXJ5UnVucyA9IHtcbiAgICAgICAgLi4uc3RvcmFnZS5ydW5zLFxuICAgICAgICBsaXN0OiAoKHBhcmFtcykgPT5cbiAgICAgICAgICBzdG9yYWdlLnJ1bnMubGlzdCh7XG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICBmaWxlSWRGaWx0ZXIsXG4gICAgICAgICAgfSkpIGFzIHR5cGVvZiBzdG9yYWdlLnJ1bnMubGlzdCxcbiAgICAgIH07XG4gICAgICBhd2FpdCByZWVucXVldWVBY3RpdmVSdW5zKHJlY292ZXJ5UnVucywgcXVldWUucXVldWUsICd3b3JsZC1sb2NhbCcpO1xuICAgIH0sXG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICBjbGVhclN0b3JhZ2VDYWNoZSgpO1xuICAgICAgYXdhaXQgcXVldWUuY2xvc2UoKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsZWFyKCkge1xuICAgICAgY2xlYXJTdG9yYWdlQ2FjaGUoKTtcbiAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgLy8gU2VsZWN0aXZlbHkgZGVsZXRlIG9ubHkgZmlsZXMgbWF0Y2hpbmcgdGhpcyB0YWdcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IG1lcmdlZENvbmZpZy5kYXRhRGlyO1xuXG4gICAgICAgIC8vIERlbGV0ZSBob29rIHRva2VuIGNvbnN0cmFpbnQgZmlsZXMgKGFuZCByZWNvdmVyeSBtYXJrZXJzLFxuICAgICAgICAvLyBmb3IgZGlzayBoeWdpZW5lKSBCRUZPUkUgZGVsZXRpbmcgdGhlIGhvb2tzLCBzaW5jZSB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIHJlYWQgZWFjaCBob29rIHRvIGV4dHJhY3QgaXRzIHRva2VuIGhhc2guIENvbnN0cmFpbnRcbiAgICAgICAgLy8gZmlsZXMgYW5kIG1hcmtlcnMgYXJlIHVudGFnZ2VkIChge3NoYTI1Nn0uanNvbmAgYW5kXG4gICAgICAgIC8vIGB7c2hhMjU2fS5yZWNvdmVyeS5qc29uYCkgc28gbGlzdFRhZ2dlZEZpbGVzIHdvbid0IGZpbmRcbiAgICAgICAgLy8gdGhlbSDigJQgd2UgbXVzdCByZXNvbHZlIHRoZW0gdmlhIHRoZSBob29rIGRhdGEuXG4gICAgICAgIGNvbnN0IGhvb2tzRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdob29rcycpO1xuICAgICAgICBjb25zdCB0YWdnZWRIb29rRmlsZXMgPSBhd2FpdCBsaXN0VGFnZ2VkRmlsZXMoaG9va3NEaXIsIHRhZyk7XG4gICAgICAgIGNvbnN0IHsgSG9va1NjaGVtYSB9ID0gYXdhaXQgaW1wb3J0KCdAd29ya2Zsb3cvd29ybGQnKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGFnZ2VkSG9va0ZpbGVzLm1hcChhc3luYyAoaG9va0ZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSBhd2FpdCByZWFkSlNPTihcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGhvb2tzRGlyLCBob29rRmlsZSksXG4gICAgICAgICAgICAgIEhvb2tTY2hlbWFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaG9vaz8udG9rZW4pIHtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4oaG9va3NEaXIsICd0b2tlbnMnLCBgJHtoYXNoVG9rZW4oaG9vay50b2tlbil9Lmpzb25gKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICAgIGhvb2tSZWNvdmVyeU1hcmtlclBhdGgoXG4gICAgICAgICAgICAgICAgICBiYXNlZGlyLFxuICAgICAgICAgICAgICAgICAgaG9vay50b2tlbixcbiAgICAgICAgICAgICAgICAgIGhvb2sucnVuSWQsXG4gICAgICAgICAgICAgICAgICBob29rLmhvb2tJZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERlbGV0ZSB0YWdnZWQgZW50aXR5IGZpbGVzIGFjcm9zcyBhbGwgZGlyZWN0b3JpZXNcbiAgICAgICAgY29uc3QgZW50aXR5RGlycyA9IFtcbiAgICAgICAgICAncnVucycsXG4gICAgICAgICAgJ3N0ZXBzJyxcbiAgICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgICAnaG9va3MnLFxuICAgICAgICAgICd3YWl0cycsXG4gICAgICAgICAgJ3N0cmVhbXMvcnVucycsXG4gICAgICAgIF07XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGVudGl0eURpcnMubWFwKGFzeW5jIChkaXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgZGlyKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzKGZ1bGxEaXIsIHRhZyk7XG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgZmlsZXMubWFwKChmKSA9PiBkZWxldGVKU09OKHBhdGguam9pbihmdWxsRGlyLCBmKSkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIC8vIENsZWFuIHVwIGxvY2sgZmlsZXMgdXNlZCBmb3IgYXRvbWljIHRlcm1pbmFsLXN0YXRlIGd1YXJkc1xuICAgICAgICBhd2FpdCBmc1xuICAgICAgICAgIC5ybShwYXRoLmpvaW4oYmFzZWRpciwgJy5sb2NrcycpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIHN0cmVhbSBjaHVua3MgKC57dGFnfS5iaW4gZmlsZXMpXG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkQmluRmlsZXMgPSBhd2FpdCBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbihcbiAgICAgICAgICBjaHVua3NEaXIsXG4gICAgICAgICAgdGFnLFxuICAgICAgICAgICcuYmluJ1xuICAgICAgICApO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0YWdnZWRCaW5GaWxlcy5tYXAoKGYpID0+XG4gICAgICAgICAgICBmcy51bmxpbmsocGF0aC5qb2luKGNodW5rc0RpciwgZikpLmNhdGNoKCgpID0+IHt9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGluLW1lbW9yeSB3cml0ZSBjYWNoZSBzbyBkZWxldGVkIHBhdGhzIGFyZSBmb3Jnb3R0ZW5cbiAgICAgICAgY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYHJtKClgIHJlbW92ZXMgZGlyZWN0b3JpZXMgdGhhdCB0aGUgd3JpdGUgcGF0aCBtYXkgaGF2ZSBjYWNoZWQuXG4gICAgICAgIGNsZWFyQ3JlYXRlZEZpbGVzQ2FjaGUoKTtcbiAgICAgICAgYXdhaXQgcm0obWVyZ2VkQ29uZmlnLmRhdGFEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgaW5pdERhdGFEaXIobWVyZ2VkQ29uZmlnLmRhdGFEaXIpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
171
|
+
/**
|
|
172
|
+
* @deprecated Use `createWorld()` instead.
|
|
173
|
+
*/
|
|
174
|
+
export function createLocalWorld(args) {
|
|
175
|
+
return createWorld(args);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixVQUFVLEVBQ1YsZUFBZSxFQUNmLDBCQUEwQixFQUMxQixRQUFRLEdBQ1QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFzQixNQUFNLFlBQVksQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLG1EQUFtRDtBQUNuRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsV0FBVyxFQUVYLFlBQVksR0FDYixNQUFNLFdBQVcsQ0FBQztBQVduQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQXNCO0lBQ2hELE1B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QUcsQ0FDZixjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDdkIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FDeEQsQ0FDRixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUNMLENBQUM7Z0JBQ0YsaUVBQWlFO2dCQUNqRSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixrRUFBa0U7Z0JBQ2xFLHNCQUFzQixFQUFFLENBQUM7Z0JBQ3pCLHlCQUF5QixFQUFFLENBQUM7Z0JBQzVCLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQXNCO0lBQ3JELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgcm0gfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlUHJlZml4LCBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyByZWVucXVldWVBY3RpdmVSdW5zLCBTUEVDX1ZFUlNJT05fQ1VSUkVOVCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGNsZWFyQ3JlYXRlZEZpbGVzQ2FjaGUsXG4gIGRlbGV0ZUpTT04sXG4gIGhhc1RhZyxcbiAgaXNVbnRhZ2dlZCxcbiAgbGlzdFRhZ2dlZEZpbGVzLFxuICBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbixcbiAgcmVhZEpTT04sXG59IGZyb20gJy4vZnMuanMnO1xuaW1wb3J0IHsgaW5pdERhdGFEaXIgfSBmcm9tICcuL2luaXQuanMnO1xuaW1wb3J0IHsgaW5zdHJ1bWVudE9iamVjdCB9IGZyb20gJy4vaW5zdHJ1bWVudE9iamVjdC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWV1ZSwgdHlwZSBEaXJlY3RIYW5kbGVyIH0gZnJvbSAnLi9xdWV1ZS5qcyc7XG5pbXBvcnQgeyBoYXNoVG9rZW4sIGhvb2tSZWNvdmVyeU1hcmtlclBhdGggfSBmcm9tICcuL3N0b3JhZ2UvaGVscGVycy5qcyc7XG5pbXBvcnQgeyByZXNldEhvb2tJbmRleEVuc3VyZUNhY2hlIH0gZnJvbSAnLi9zdG9yYWdlL2hvb2staW5kZXguanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmFnZSB9IGZyb20gJy4vc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJlYW1lciB9IGZyb20gJy4vc3RyZWFtZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgaW5pdCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBjb25zdW1lcnNcbmV4cG9ydCB7XG4gIERhdGFEaXJBY2Nlc3NFcnJvcixcbiAgRGF0YURpclZlcnNpb25FcnJvcixcbiAgZW5zdXJlRGF0YURpcixcbiAgaW5pdERhdGFEaXIsXG4gIHR5cGUgUGFyc2VkVmVyc2lvbixcbiAgcGFyc2VWZXJzaW9uLFxufSBmcm9tICcuL2luaXQuanMnO1xuXG5leHBvcnQgdHlwZSB7IERpcmVjdEhhbmRsZXIgfSBmcm9tICcuL3F1ZXVlLmpzJztcblxuZXhwb3J0IHR5cGUgTG9jYWxXb3JsZCA9IFdvcmxkICYge1xuICAvKiogUmVnaXN0ZXIgYSBkaXJlY3QgaW4tcHJvY2VzcyBoYW5kbGVyIGZvciBhIHF1ZXVlIHByZWZpeCwgYnlwYXNzaW5nIEhUVFAuICovXG4gIHJlZ2lzdGVySGFuZGxlcihwcmVmaXg6IFF1ZXVlUHJlZml4LCBoYW5kbGVyOiBEaXJlY3RIYW5kbGVyKTogdm9pZDtcbiAgLyoqIENsZWFyIGFsbCB3b3JrZmxvdyBkYXRhIChydW5zLCBzdGVwcywgZXZlbnRzLCBob29rcywgc3RyZWFtcykuICovXG4gIGNsZWFyKCk6IFByb21pc2U8dm9pZD47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBsb2NhbCB3b3JsZCBpbnN0YW5jZSB0aGF0IGNvbWJpbmVzIHF1ZXVlLCBzdG9yYWdlLCBhbmQgc3RyZWFtZXIgZnVuY3Rpb25hbGl0aWVzLlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBwYXJhbSBhcmdzLmRhdGFEaXIgLSBEaXJlY3RvcnkgZm9yIHN0b3Jpbmcgd29ya2Zsb3cgZGF0YSAoZGVmYXVsdDogYC53b3JrZmxvdy1kYXRhL2ApXG4gKiBAcGFyYW0gYXJncy5wb3J0IC0gUG9ydCBvdmVycmlkZSBmb3IgcXVldWUgdHJhbnNwb3J0IChkZWZhdWx0OiBhdXRvLWRldGVjdGVkKVxuICogQHBhcmFtIGFyZ3MuYmFzZVVybCAtIEZ1bGwgYmFzZSBVUkwgb3ZlcnJpZGUgZm9yIHF1ZXVlIHRyYW5zcG9ydCAoZGVmYXVsdDogYGh0dHA6Ly9sb2NhbGhvc3Q6e3BvcnR9YClcbiAqIEBwYXJhbSBhcmdzLnJlY292ZXJBY3RpdmVSdW5zIC0gV2hldGhlciBgc3RhcnQoKWAgc2hvdWxkIHJlLWVucXVldWUgcGVuZGluZy9ydW5uaW5nIHJ1bnMgZnJvbSBzdG9yYWdlIChkZWZhdWx0OiBgdHJ1ZWApXG4gKiBAcGFyYW0gYXJncy50YWcgLSBPcHRpb25hbCB0YWcgdG8gc2NvcGUgZmlsZXMgKGUuZy4sIGB2aXRlc3QtMGApLiBXaGVuIHNldCwgZmlsZXMgYXJlIHdyaXR0ZW5cbiAqICAgYXMgYHtpZH0ue3RhZ30uanNvbmAgYW5kIGBjbGVhcigpYCBvbmx5IGRlbGV0ZXMgZmlsZXMgbWF0Y2hpbmcgdGhpcyB0YWcuXG4gKiBAdGhyb3dzIHtEYXRhRGlyQWNjZXNzRXJyb3J9IElmIHRoZSBkYXRhIGRpcmVjdG9yeSBjYW5ub3QgYmUgY3JlYXRlZCBvciBhY2Nlc3NlZFxuICogQHRocm93cyB7RGF0YURpclZlcnNpb25FcnJvcn0gSWYgdGhlIGRhdGEgZGlyZWN0b3J5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXb3JsZChhcmdzPzogUGFydGlhbDxDb25maWc+KTogTG9jYWxXb3JsZCB7XG4gIGNvbnN0IGRlZmluZWRBcmdzID0gYXJnc1xuICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhhcmdzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIClcbiAgICA6IHt9O1xuICBjb25zdCBtZXJnZWRDb25maWcgPSB7IC4uLmNvbmZpZy52YWx1ZSwgLi4uZGVmaW5lZEFyZ3MgfTtcbiAgY29uc3QgdGFnID0gbWVyZ2VkQ29uZmlnLnRhZztcbiAgY29uc3QgcXVldWUgPSBjcmVhdGVRdWV1ZShtZXJnZWRDb25maWcpO1xuICBjb25zdCB7IGNsZWFyQ2FjaGU6IGNsZWFyU3RvcmFnZUNhY2hlLCAuLi5zdG9yYWdlIH0gPSBjcmVhdGVTdG9yYWdlKFxuICAgIG1lcmdlZENvbmZpZy5kYXRhRGlyLFxuICAgIHRhZ1xuICApO1xuICBjb25zdCByZWNvdmVyQWN0aXZlUnVucyA9IG1lcmdlZENvbmZpZy5yZWNvdmVyQWN0aXZlUnVucyA/PyB0cnVlO1xuICByZXR1cm4ge1xuICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAuLi5xdWV1ZSxcbiAgICAuLi5zdG9yYWdlLFxuICAgIC4uLmluc3RydW1lbnRPYmplY3QoJ3dvcmxkLnN0cmVhbXMnLCB7XG4gICAgICAuLi5jcmVhdGVTdHJlYW1lcihtZXJnZWRDb25maWcuZGF0YURpciwgdGFnKSxcbiAgICAgIC4uLihtZXJnZWRDb25maWcuc3RyZWFtRmx1c2hJbnRlcnZhbE1zICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBzdHJlYW1GbHVzaEludGVydmFsTXM6IG1lcmdlZENvbmZpZy5zdHJlYW1GbHVzaEludGVydmFsTXMsXG4gICAgICB9KSxcbiAgICB9KSxcbiAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgIGF3YWl0IGluaXREYXRhRGlyKG1lcmdlZENvbmZpZy5kYXRhRGlyKTtcbiAgICAgIGlmICghcmVjb3ZlckFjdGl2ZVJ1bnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU2NvcGUgcmVjb3ZlcnkgdG8gdGhpcyB3b3JsZCdzIG93biBmaWxlcy4gQSB0YWdnZWQgd29ybGQgcmVjb3ZlcnMgb25seVxuICAgICAgLy8gaXRzIHRhZzsgYW4gdW50YWdnZWQgd29ybGQgcmVjb3ZlcnMgb25seSB1bnRhZ2dlZCBmaWxlcy4gV2l0aG91dCB0aGVcbiAgICAgIC8vIHVudGFnZ2VkIGZpbHRlciwgYW4gdW50YWdnZWQgZGV2IHNlcnZlciBzaGFyaW5nIHRoZSBkYXRhIGRpcmVjdG9yeSB3aXRoXG4gICAgICAvLyB0aGUgdml0ZXN0IGhhcm5lc3Mgd291bGQgbGlzdCB0YWdnZWQgcnVucyAobGlzdCBlbnVtZXJhdGVzIGV2ZXJ5IGZpbGUpXG4gICAgICAvLyBhbmQgcmUtZW5xdWV1ZSB0aGVtLCBidXQgcnVuX3N0YXJ0ZWQncyB0YWdnZWQtb3ItdW50YWdnZWQgcmVhZCBjYW4ndFxuICAgICAgLy8gcmVzb2x2ZSBhIGZvcmVpZ24gdGFnIOKAlCB5aWVsZGluZyBcImRpZCBub3QgcmV0dXJuIHRoZSBydW4gZW50aXR5XCIgNTAwc1xuICAgICAgLy8gb24gc3RhcnR1cCB1bnRpbCB0aGUgbWVzc2FnZSBleGhhdXN0cyBpdHMgZGVsaXZlcmllcy5cbiAgICAgIGNvbnN0IGZpbGVJZEZpbHRlciA9IHRhZ1xuICAgICAgICA/IChmaWxlSWQ6IHN0cmluZykgPT4gaGFzVGFnKGZpbGVJZCwgdGFnKVxuICAgICAgICA6IGlzVW50YWdnZWQ7XG4gICAgICBjb25zdCByZWNvdmVyeVJ1bnMgPSB7XG4gICAgICAgIC4uLnN0b3JhZ2UucnVucyxcbiAgICAgICAgbGlzdDogKChwYXJhbXMpID0+XG4gICAgICAgICAgc3RvcmFnZS5ydW5zLmxpc3Qoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgZmlsZUlkRmlsdGVyLFxuICAgICAgICAgIH0pKSBhcyB0eXBlb2Ygc3RvcmFnZS5ydW5zLmxpc3QsXG4gICAgICB9O1xuICAgICAgYXdhaXQgcmVlbnF1ZXVlQWN0aXZlUnVucyhyZWNvdmVyeVJ1bnMsIHF1ZXVlLnF1ZXVlLCAnd29ybGQtbG9jYWwnKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgY2xlYXJTdG9yYWdlQ2FjaGUoKTtcbiAgICAgIGF3YWl0IHF1ZXVlLmNsb3NlKCk7XG4gICAgfSxcbiAgICBhc3luYyBjbGVhcigpIHtcbiAgICAgIGNsZWFyU3RvcmFnZUNhY2hlKCk7XG4gICAgICBpZiAodGFnKSB7XG4gICAgICAgIC8vIFNlbGVjdGl2ZWx5IGRlbGV0ZSBvbmx5IGZpbGVzIG1hdGNoaW5nIHRoaXMgdGFnXG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBtZXJnZWRDb25maWcuZGF0YURpcjtcblxuICAgICAgICAvLyBEZWxldGUgaG9vayB0b2tlbiBjb25zdHJhaW50IGZpbGVzIChhbmQgcmVjb3ZlcnkgbWFya2VycyxcbiAgICAgICAgLy8gZm9yIGRpc2sgaHlnaWVuZSkgQkVGT1JFIGRlbGV0aW5nIHRoZSBob29rcywgc2luY2Ugd2UgbmVlZFxuICAgICAgICAvLyB0byByZWFkIGVhY2ggaG9vayB0byBleHRyYWN0IGl0cyB0b2tlbiBoYXNoLiBDb25zdHJhaW50XG4gICAgICAgIC8vIGZpbGVzIGFuZCBtYXJrZXJzIGFyZSB1bnRhZ2dlZCAoYHtzaGEyNTZ9Lmpzb25gIGFuZFxuICAgICAgICAvLyBge3NoYTI1Nn0ucmVjb3ZlcnkuanNvbmApIHNvIGxpc3RUYWdnZWRGaWxlcyB3b24ndCBmaW5kXG4gICAgICAgIC8vIHRoZW0g4oCUIHdlIG11c3QgcmVzb2x2ZSB0aGVtIHZpYSB0aGUgaG9vayBkYXRhLlxuICAgICAgICBjb25zdCBob29rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnaG9va3MnKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkSG9va0ZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzKGhvb2tzRGlyLCB0YWcpO1xuICAgICAgICBjb25zdCB7IEhvb2tTY2hlbWEgfSA9IGF3YWl0IGltcG9ydCgnQHdvcmtmbG93L3dvcmxkJyk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRhZ2dlZEhvb2tGaWxlcy5tYXAoYXN5bmMgKGhvb2tGaWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBob29rID0gYXdhaXQgcmVhZEpTT04oXG4gICAgICAgICAgICAgIHBhdGguam9pbihob29rc0RpciwgaG9va0ZpbGUpLFxuICAgICAgICAgICAgICBIb29rU2NoZW1hXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGhvb2s/LnRva2VuKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUpTT04oXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKGhvb2tzRGlyLCAndG9rZW5zJywgYCR7aGFzaFRva2VuKGhvb2sudG9rZW4pfS5qc29uYClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlSlNPTihcbiAgICAgICAgICAgICAgICBob29rUmVjb3ZlcnlNYXJrZXJQYXRoKFxuICAgICAgICAgICAgICAgICAgYmFzZWRpcixcbiAgICAgICAgICAgICAgICAgIGhvb2sudG9rZW4sXG4gICAgICAgICAgICAgICAgICBob29rLnJ1bklkLFxuICAgICAgICAgICAgICAgICAgaG9vay5ob29rSWRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIGVudGl0eSBmaWxlcyBhY3Jvc3MgYWxsIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IGVudGl0eURpcnMgPSBbXG4gICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAnaG9va3MvYnktcnVuJyxcbiAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICdzdHJlYW1zL3J1bnMnLFxuICAgICAgICBdO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlbnRpdHlEaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdWxsRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsIGRpcik7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RUYWdnZWRGaWxlcyhmdWxsRGlyLCB0YWcpO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGZpbGVzLm1hcCgoZikgPT4gZGVsZXRlSlNPTihwYXRoLmpvaW4oZnVsbERpciwgZikpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIGhvb2staW5kZXggZW50cmllcyAobmVzdGVkIHBlci1rZXkgZGlyZWN0b3JpZXMpXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXhEaXIgb2YgWyd0b2tlbi1pbmRleCcsICdpZC1pbmRleCddKSB7XG4gICAgICAgICAgY29uc3QgZnVsbEluZGV4RGlyID0gcGF0aC5qb2luKGJhc2VkaXIsICdob29rcycsIGluZGV4RGlyKTtcbiAgICAgICAgICBsZXQga2V5RGlyRW50cmllczogaW1wb3J0KCdub2RlOmZzJykuRGlyZW50W107XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleURpckVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGZ1bGxJbmRleERpciwge1xuICAgICAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBrZXlEaXJFbnRyaWVzID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAga2V5RGlyRW50cmllc1xuICAgICAgICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAgICAgLm1hcChhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlEaXIgPSBwYXRoLmpvaW4oZnVsbEluZGV4RGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdnZWRFbnRyeUZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzKGtleURpciwgdGFnKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgIHRhZ2dlZEVudHJ5RmlsZXMubWFwKChmKSA9PiBkZWxldGVKU09OKHBhdGguam9pbihrZXlEaXIsIGYpKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYW4gdXAgbG9jayBmaWxlcyB1c2VkIGZvciBhdG9taWMgdGVybWluYWwtc3RhdGUgZ3VhcmRzXG4gICAgICAgIGF3YWl0IGZzXG4gICAgICAgICAgLnJtKHBhdGguam9pbihiYXNlZGlyLCAnLmxvY2tzJyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KVxuICAgICAgICAgIC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIC8vIERlbGV0ZSB0YWdnZWQgc3RyZWFtIGNodW5rcyAoLnt0YWd9LmJpbiBmaWxlcykuIENodW5rcyBhcmUgc2hhcmRlZFxuICAgICAgICAvLyBvbmUgZGlyZWN0b3J5IHBlciBzdHJlYW0gKHN0cmVhbXMvY2h1bmtzLzxzdHJlYW1OYW1lPi88Y2h1bmtJZD4ue3RhZ30uYmluKSxcbiAgICAgICAgLy8gc28gaXRlcmF0ZSBlYWNoIHBlci1zdHJlYW0gZGlyZWN0b3J5IOKAlCB0aGUgdG9wLWxldmVsIGNodW5rcyBkaXIgbm93XG4gICAgICAgIC8vIGhvbGRzIG9ubHkgc3ViZGlyZWN0b3JpZXMsIHNvIGxpc3RpbmcgaXQgZGlyZWN0bHkgd291bGQgbWF0Y2ggbm90aGluZ1xuICAgICAgICAvLyBhbmQgc2lsZW50bHkgbGVhayB0YWdnZWQgY2h1bmsgZmlsZXMgYWNyb3NzIHRlc3Qgc2Vzc2lvbnMuXG4gICAgICAgIGNvbnN0IGNodW5rc0RpciA9IHBhdGguam9pbihiYXNlZGlyLCAnc3RyZWFtcycsICdjaHVua3MnKTtcbiAgICAgICAgbGV0IHN0cmVhbURpckVudHJpZXM6IGltcG9ydCgnbm9kZTpmcycpLkRpcmVudFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0cmVhbURpckVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGNodW5rc0Rpciwge1xuICAgICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgc3RyZWFtRGlyRW50cmllcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHN0cmVhbURpckVudHJpZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgLm1hcChhc3luYyAoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtQ2h1bmtEaXIgPSBwYXRoLmpvaW4oY2h1bmtzRGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgICAgICAgICAgY29uc3QgdGFnZ2VkQmluRmlsZXMgPSBhd2FpdCBsaXN0VGFnZ2VkRmlsZXNCeUV4dGVuc2lvbihcbiAgICAgICAgICAgICAgICBzdHJlYW1DaHVua0RpcixcbiAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgJy5iaW4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHRhZ2dlZEJpbkZpbGVzLm1hcCgoZikgPT5cbiAgICAgICAgICAgICAgICAgIGZzLnVubGluayhwYXRoLmpvaW4oc3RyZWFtQ2h1bmtEaXIsIGYpKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICAvLyBDbGVhciB0aGUgaW4tbWVtb3J5IHdyaXRlIGNhY2hlIHNvIGRlbGV0ZWQgcGF0aHMgYXJlIGZvcmdvdHRlblxuICAgICAgICBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBgcm0oKWAgcmVtb3ZlcyBkaXJlY3RvcmllcyB0aGF0IHRoZSB3cml0ZSBwYXRoIG1heSBoYXZlIGNhY2hlZC5cbiAgICAgICAgY2xlYXJDcmVhdGVkRmlsZXNDYWNoZSgpO1xuICAgICAgICByZXNldEhvb2tJbmRleEVuc3VyZUNhY2hlKCk7XG4gICAgICAgIGF3YWl0IHJtKG1lcmdlZENvbmZpZy5kYXRhRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGluaXREYXRhRGlyKG1lcmdlZENvbmZpZy5kYXRhRGlyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgY3JlYXRlV29ybGQoKWAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvY2FsV29ybGQoYXJncz86IFBhcnRpYWw8Q29uZmlnPik6IExvY2FsV29ybGQge1xuICByZXR1cm4gY3JlYXRlV29ybGQoYXJncyk7XG59XG4iXX0=
|