footprintjs 9.43.0 → 9.44.1
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/CLAUDE.md +2 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +14 -18
- package/dist/esm/lib/engine/handlers/servedSubflowResults.d.ts +3 -2
- package/dist/esm/lib/engine/handlers/servedSubflowResults.js +4 -3
- package/dist/esm/lib/memory/redaction.d.ts +21 -0
- package/dist/esm/lib/memory/redaction.js +64 -7
- package/dist/esm/lib/pause/record.d.ts +28 -14
- package/dist/esm/lib/pause/record.js +29 -17
- package/dist/esm/lib/pause/types.d.ts +23 -38
- package/dist/esm/lib/pause/types.js +9 -6
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +4 -1
- package/dist/esm/lib/runner/checkpoint.d.ts +35 -30
- package/dist/esm/lib/runner/checkpoint.js +47 -162
- package/dist/lib/engine/handlers/SubflowExecutor.js +14 -18
- package/dist/lib/engine/handlers/servedSubflowResults.js +4 -3
- package/dist/lib/memory/redaction.js +66 -8
- package/dist/lib/pause/record.js +29 -17
- package/dist/lib/pause/types.js +9 -6
- package/dist/lib/runner/FlowChartExecutor.js +4 -1
- package/dist/lib/runner/checkpoint.js +47 -162
- package/dist/types/lib/engine/handlers/servedSubflowResults.d.ts +3 -2
- package/dist/types/lib/memory/redaction.d.ts +21 -0
- package/dist/types/lib/pause/record.d.ts +28 -14
- package/dist/types/lib/pause/types.d.ts +23 -38
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +3 -0
- package/dist/types/lib/runner/checkpoint.d.ts +35 -30
- package/package.json +1 -1
|
@@ -12,33 +12,47 @@
|
|
|
12
12
|
* {@link decodePauseRecord}.
|
|
13
13
|
*
|
|
14
14
|
* VERSIONING. A checkpoint written by this release carries
|
|
15
|
-
* `checkpointVersion:
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
15
|
+
* `checkpointVersion: 2`. Every older one is read by the ONE upcaster,
|
|
16
|
+
* {@link upcastCheckpoint}, and every step so far only DROPS fields — what a
|
|
17
|
+
* later format added is optional and read as absent:
|
|
18
|
+
*
|
|
19
|
+
* - version 0 (no `checkpointVersion`, before 9.39.0) → 1: drop
|
|
20
|
+
* `continuationStageId`, a record no resume has read since 9.28.0 (what
|
|
21
|
+
* runs after a resume comes from the chart);
|
|
22
|
+
* - version 1 (9.39.0–9.43.x) → 2 (the LEAN checkpoint): drop
|
|
23
|
+
* `executionTree` and `subflowResults` — the run's served record (the
|
|
24
|
+
* whole execution tree, the finished subflows' results), which no resume
|
|
25
|
+
* ever read and which grew with every finished iteration
|
|
26
|
+
* (`runner/checkpoint.ts`).
|
|
27
|
+
*
|
|
28
|
+
* A dropped field never survives, whatever version claims to carry it. A
|
|
29
|
+
* version this release does not know is refused, never guessed at.
|
|
22
30
|
*
|
|
23
31
|
* Borrowed: LangGraph's checkpoint `v` field; io-ts's decode-at-the-boundary
|
|
24
32
|
* (one decoder turns `unknown` into the type, or refuses with a path).
|
|
25
33
|
*/
|
|
26
34
|
import type { FlowchartCheckpoint, PendingPause } from './types.js';
|
|
27
35
|
/** The checkpoint format this release writes (`FlowchartCheckpoint.checkpointVersion`). */
|
|
28
|
-
export declare const CHECKPOINT_VERSION:
|
|
36
|
+
export declare const CHECKPOINT_VERSION: 2;
|
|
29
37
|
/**
|
|
30
|
-
* Fields only
|
|
31
|
-
*
|
|
38
|
+
* Fields only an OLDER checkpoint can carry, each dropped by the format named
|
|
39
|
+
* beside it. The upcaster removes them and the current shape never has them.
|
|
32
40
|
*/
|
|
33
41
|
export interface LegacyCheckpointFields {
|
|
34
|
-
/**
|
|
42
|
+
/** Version 0 only: the invoker's `.next` id — a record since 9.28.0, never read. Dropped by version 1. */
|
|
35
43
|
readonly continuationStageId?: string;
|
|
44
|
+
/** Versions 0–1: the run's execution tree at the pause — never read by a resume. Dropped by version 2. */
|
|
45
|
+
readonly executionTree?: unknown;
|
|
46
|
+
/** Versions 0–1: the subflows finished before the pause — never read by a resume. Dropped by version 2. */
|
|
47
|
+
readonly subflowResults?: Record<string, unknown>;
|
|
36
48
|
}
|
|
37
49
|
/**
|
|
38
50
|
* Bring a stored checkpoint of ANY release to the current shape — the one
|
|
39
|
-
* upcaster.
|
|
40
|
-
*
|
|
41
|
-
*
|
|
51
|
+
* upcaster. Versions 0 (no `checkpointVersion`) and 1: drop the fields their
|
|
52
|
+
* successors dropped ({@link LegacyCheckpointFields}), stamp the current
|
|
53
|
+
* version as the first key. The current version: as is, minus any dropped
|
|
54
|
+
* field it claims to carry. Anything else: refused. Returns a new object; the
|
|
55
|
+
* caller's is never edited.
|
|
42
56
|
*/
|
|
43
57
|
export declare function upcastCheckpoint(stored: Record<string, unknown>): Record<string, unknown>;
|
|
44
58
|
/**
|
|
@@ -12,20 +12,30 @@
|
|
|
12
12
|
* {@link decodePauseRecord}.
|
|
13
13
|
*
|
|
14
14
|
* VERSIONING. A checkpoint written by this release carries
|
|
15
|
-
* `checkpointVersion:
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
15
|
+
* `checkpointVersion: 2`. Every older one is read by the ONE upcaster,
|
|
16
|
+
* {@link upcastCheckpoint}, and every step so far only DROPS fields — what a
|
|
17
|
+
* later format added is optional and read as absent:
|
|
18
|
+
*
|
|
19
|
+
* - version 0 (no `checkpointVersion`, before 9.39.0) → 1: drop
|
|
20
|
+
* `continuationStageId`, a record no resume has read since 9.28.0 (what
|
|
21
|
+
* runs after a resume comes from the chart);
|
|
22
|
+
* - version 1 (9.39.0–9.43.x) → 2 (the LEAN checkpoint): drop
|
|
23
|
+
* `executionTree` and `subflowResults` — the run's served record (the
|
|
24
|
+
* whole execution tree, the finished subflows' results), which no resume
|
|
25
|
+
* ever read and which grew with every finished iteration
|
|
26
|
+
* (`runner/checkpoint.ts`).
|
|
27
|
+
*
|
|
28
|
+
* A dropped field never survives, whatever version claims to carry it. A
|
|
29
|
+
* version this release does not know is refused, never guessed at.
|
|
22
30
|
*
|
|
23
31
|
* Borrowed: LangGraph's checkpoint `v` field; io-ts's decode-at-the-boundary
|
|
24
32
|
* (one decoder turns `unknown` into the type, or refuses with a path).
|
|
25
33
|
*/
|
|
26
34
|
import { isPausedExecution } from './types.js';
|
|
27
35
|
/** The checkpoint format this release writes (`FlowchartCheckpoint.checkpointVersion`). */
|
|
28
|
-
export const CHECKPOINT_VERSION =
|
|
36
|
+
export const CHECKPOINT_VERSION = 2;
|
|
37
|
+
/** The formats this release reads: the current one and every one it upcasts (absent = version 0). */
|
|
38
|
+
const READABLE_VERSIONS = [1, CHECKPOINT_VERSION];
|
|
29
39
|
/** The one message shape: `Invalid checkpoint: <where> <what>.` */
|
|
30
40
|
function refuse(what) {
|
|
31
41
|
throw new Error(`Invalid checkpoint: ${what}.`);
|
|
@@ -35,19 +45,21 @@ function isPlainRecord(value) {
|
|
|
35
45
|
}
|
|
36
46
|
/**
|
|
37
47
|
* Bring a stored checkpoint of ANY release to the current shape — the one
|
|
38
|
-
* upcaster.
|
|
39
|
-
*
|
|
40
|
-
*
|
|
48
|
+
* upcaster. Versions 0 (no `checkpointVersion`) and 1: drop the fields their
|
|
49
|
+
* successors dropped ({@link LegacyCheckpointFields}), stamp the current
|
|
50
|
+
* version as the first key. The current version: as is, minus any dropped
|
|
51
|
+
* field it claims to carry. Anything else: refused. Returns a new object; the
|
|
52
|
+
* caller's is never edited.
|
|
41
53
|
*/
|
|
42
54
|
export function upcastCheckpoint(stored) {
|
|
43
55
|
const version = stored.checkpointVersion;
|
|
44
|
-
if (version !== undefined && version
|
|
56
|
+
if (version !== undefined && !READABLE_VERSIONS.includes(version)) {
|
|
45
57
|
refuse(`checkpointVersion ${JSON.stringify(version) ?? String(version)} is not one this release reads ` +
|
|
46
|
-
`(${
|
|
58
|
+
`(${READABLE_VERSIONS.join(' or ')}, or none for a checkpoint written before 9.39.0)`);
|
|
47
59
|
}
|
|
48
|
-
//
|
|
49
|
-
const { continuationStageId:
|
|
50
|
-
return
|
|
60
|
+
// A dropped field never survives, whatever version claims to carry it.
|
|
61
|
+
const { checkpointVersion: _version, continuationStageId: _invokerNext, executionTree: _tree, subflowResults: _finishedSubflows, ...current } = stored;
|
|
62
|
+
return { checkpointVersion: CHECKPOINT_VERSION, ...current };
|
|
51
63
|
}
|
|
52
64
|
/**
|
|
53
65
|
* Check ONE pause record — the paused stage's own fields on the checkpoint,
|
|
@@ -154,4 +166,4 @@ export function decodePendingPauses(pending) {
|
|
|
154
166
|
function isCount(value) {
|
|
155
167
|
return typeof value === 'number' && Number.isInteger(value) && value >= 0;
|
|
156
168
|
}
|
|
157
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wYXVzZS9yZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUdILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUvQywyRkFBMkY7QUFDM0YsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBVSxDQUFDO0FBVzdDLG1FQUFtRTtBQUNuRSxTQUFTLE1BQU0sQ0FBQyxJQUFZO0lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQWM7SUFDbkMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQStCO0lBQzlELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUN6QyxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDNUQsTUFBTSxDQUNKLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUNBQWlDO1lBQzlGLElBQUksa0JBQWtCLG1EQUFtRCxDQUM1RSxDQUFDO0lBQ0osQ0FBQztJQUNELHdFQUF3RTtJQUN4RSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsTUFBMEQsQ0FBQztJQUNoSCxPQUFPLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlC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aUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFjO0lBQzdCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwYXVzZS9yZWNvcmQudHMg4oCUIHRoZSBjaGVja3BvaW50IENPREVDIChGOCwgOS4zOS4wKTogb25lIHZlcnNpb24sIG9uZVxuICogdXBjYXN0ZXIsIG9uZSB2YWxpZGF0b3IsIG9uZSBtZXNzYWdlIHNldC5cbiAqXG4gKiBBIGNoZWNrcG9pbnQgaXMgc3RvcmVkIGRhdGEg4oCUIFJlZGlzLCBQb3N0Z3JlcywgYSBmaWxlIOKAlCBhbmQgY29tZXMgYmFjayB0b1xuICogYHJlc3VtZSgpYCBmcm9tIHdoaWNoZXZlciByZWxlYXNlIHdyb3RlIGl0LiBVbnRpbCA5LjM4LjAgaXQgd2FzIGNoZWNrZWQgaW5cbiAqIFRXTyBwbGFjZXMgd2l0aCB0d28gbWVzc2FnZSBzZXRzOiBgRmxvd0NoYXJ0RXhlY3V0b3IgwrcgcmVzdW1lYCBjaGVja2VkIHRoZVxuICogcGF1c2VkIHJlY29yZCdzIGZpZWxkcywgYFJlc3VtZUVudHJ5YCBjaGVja2VkIGVhY2ggd2FpdGluZyBzaWJsaW5nJ3NcbiAqIChgcGVuZGluZ1BhdXNlc1tuXWApIOKAlCB0aGUgU0FNRSByZWNvcmQgc2hhcGUsIGNoZWNrZWQgdHdpY2UsIGRpZmZlcmVudGx5XG4gKiAodGhlIHRvcC1sZXZlbCBgcGF1c2VkQnlgIGFuZCBgc3ViZmxvd1N0YXRlc2Agd2VyZSBuZXZlciBjaGVja2VkIGF0IGFsbCkuXG4gKiBCb3RoIG5vdyBjYWxsIHtAbGluayBkZWNvZGVDaGVja3BvaW50fTsgZXZlcnkgcmVjb3JkIGlzIGNoZWNrZWQgYnlcbiAqIHtAbGluayBkZWNvZGVQYXVzZVJlY29yZH0uXG4gKlxuICogVkVSU0lPTklORy4gQSBjaGVja3BvaW50IHdyaXR0ZW4gYnkgdGhpcyByZWxlYXNlIGNhcnJpZXNcbiAqIGBjaGVja3BvaW50VmVyc2lvbjogMWAuIE9uZSB3cml0dGVuIGJlZm9yZSBjYXJyaWVzIG5vbmUgYW5kIGlzIHJlYWQgYXNcbiAqIHZlcnNpb24gMCBieSB0aGUgT05FIHVwY2FzdGVyLCB7QGxpbmsgdXBjYXN0Q2hlY2twb2ludH06IGV2ZXJ5IGZpZWxkXG4gKiA5LjE04oCTOS4zNyBhZGRlZCBpcyBvcHRpb25hbCBhbmQgcmVhZCBhcyBhYnNlbnQsIHNvIHRoZSBvbmx5IHN0ZXAgaXNcbiAqIGRyb3BwaW5nIGBjb250aW51YXRpb25TdGFnZUlkYCDigJQgYSByZWNvcmQgbm8gcmVzdW1lIGhhcyByZWFkIHNpbmNlIDkuMjguMFxuICogKHdoYXQgcnVucyBhZnRlciBhIHJlc3VtZSBjb21lcyBmcm9tIHRoZSBjaGFydCksIG5vIGxvbmdlciB3cml0dGVuLCBhbmRcbiAqIGxlZ2FjeS1vbmx5IGZyb20gaGVyZSBvbi4gQSB2ZXJzaW9uIHRoaXMgcmVsZWFzZSBkb2VzIG5vdCBrbm93IGlzIHJlZnVzZWQsXG4gKiBuZXZlciBndWVzc2VkIGF0LlxuICpcbiAqIEJvcnJvd2VkOiBMYW5nR3JhcGgncyBjaGVja3BvaW50IGB2YCBmaWVsZDsgaW8tdHMncyBkZWNvZGUtYXQtdGhlLWJvdW5kYXJ5XG4gKiAob25lIGRlY29kZXIgdHVybnMgYHVua25vd25gIGludG8gdGhlIHR5cGUsIG9yIHJlZnVzZXMgd2l0aCBhIHBhdGgpLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0Q2hlY2twb2ludCwgUGVuZGluZ1BhdXNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlZEV4ZWN1dGlvbiB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogVGhlIGNoZWNrcG9pbnQgZm9ybWF0IHRoaXMgcmVsZWFzZSB3cml0ZXMgKGBGbG93Y2hhcnRDaGVja3BvaW50LmNoZWNrcG9pbnRWZXJzaW9uYCkuICovXG5leHBvcnQgY29uc3QgQ0hFQ0tQT0lOVF9WRVJTSU9OID0gMSBhcyBjb25zdDtcblxuLyoqXG4gKiBGaWVsZHMgb25seSBhIGNoZWNrcG9pbnQgd3JpdHRlbiBCRUZPUkUgOS4zOS4wIGNhbiBjYXJyeS4gVGhlIHVwY2FzdGVyXG4gKiByZWFkcyB0aGVtIGFuZCB0aGUgY3VycmVudCBzaGFwZSBuZXZlciBoYXMgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWdhY3lDaGVja3BvaW50RmllbGRzIHtcbiAgLyoqIFRoZSBpbnZva2VyJ3MgYC5uZXh0YCBpZCDigJQgYSByZWNvcmQgc2luY2UgOS4yOC4wLCBuZXZlciByZWFkOyBkcm9wcGVkIGJ5IHRoZSB1cGNhc3Rlci4gKi9cbiAgcmVhZG9ubHkgY29udGludWF0aW9uU3RhZ2VJZD86IHN0cmluZztcbn1cblxuLyoqIFRoZSBvbmUgbWVzc2FnZSBzaGFwZTogYEludmFsaWQgY2hlY2twb2ludDogPHdoZXJlPiA8d2hhdD4uYCAqL1xuZnVuY3Rpb24gcmVmdXNlKHdoYXQ6IHN0cmluZyk6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoZWNrcG9pbnQ6ICR7d2hhdH0uYCk7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5SZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBCcmluZyBhIHN0b3JlZCBjaGVja3BvaW50IG9mIEFOWSByZWxlYXNlIHRvIHRoZSBjdXJyZW50IHNoYXBlIOKAlCB0aGUgb25lXG4gKiB1cGNhc3Rlci4gVmVyc2lvbiAwIChubyBgY2hlY2twb2ludFZlcnNpb25gKTogZHJvcCB0aGUgbGVnYWN5XG4gKiBgY29udGludWF0aW9uU3RhZ2VJZGAsIHN0YW1wIHRoZSB2ZXJzaW9uLiBWZXJzaW9uIDE6IGFzIGlzLiBBbnl0aGluZyBlbHNlOlxuICogcmVmdXNlZC4gUmV0dXJucyBhIG5ldyBvYmplY3Q7IHRoZSBjYWxsZXIncyBpcyBuZXZlciBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RDaGVja3BvaW50KHN0b3JlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHZlcnNpb24gPSBzdG9yZWQuY2hlY2twb2ludFZlcnNpb247XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgdmVyc2lvbiAhPT0gQ0hFQ0tQT0lOVF9WRVJTSU9OKSB7XG4gICAgcmVmdXNlKFxuICAgICAgYGNoZWNrcG9pbnRWZXJzaW9uICR7SlNPTi5zdHJpbmdpZnkodmVyc2lvbikgPz8gU3RyaW5nKHZlcnNpb24pfSBpcyBub3Qgb25lIHRoaXMgcmVsZWFzZSByZWFkcyBgICtcbiAgICAgICAgYCgke0NIRUNLUE9JTlRfVkVSU0lPTn0sIG9yIG5vbmUgZm9yIGEgY2hlY2twb2ludCB3cml0dGVuIGJlZm9yZSA5LjM5LjApYCxcbiAgICApO1xuICB9XG4gIC8vIFRoZSBsZWdhY3kgZmllbGQgbmV2ZXIgc3Vydml2ZXMsIHdoYXRldmVyIHZlcnNpb24gY2xhaW1zIHRvIGNhcnJ5IGl0LlxuICBjb25zdCB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IF9sZWdhY3ksIC4uLmN1cnJlbnQgfSA9IHN0b3JlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIExlZ2FjeUNoZWNrcG9pbnRGaWVsZHM7XG4gIHJldHVybiB2ZXJzaW9uID09PSB1bmRlZmluZWQgPyB7IGNoZWNrcG9pbnRWZXJzaW9uOiBDSEVDS1BPSU5UX1ZFUlNJT04sIC4uLmN1cnJlbnQgfSA6IGN1cnJlbnQ7XG59XG5cbi8qKlxuICogQ2hlY2sgT05FIHBhdXNlIHJlY29yZCDigJQgdGhlIHBhdXNlZCBzdGFnZSdzIG93biBmaWVsZHMgb24gdGhlIGNoZWNrcG9pbnQsXG4gKiBvciBhIHdhaXRpbmcgc2libGluZydzIGBwZW5kaW5nUGF1c2VzW25dYCDigJQgYW5kIHJldHVybiBpdCBhcyBhXG4gKiB7QGxpbmsgUGVuZGluZ1BhdXNlfS4gYGF0YCBuYW1lcyB3aGVyZSB0aGUgcmVjb3JkIHNpdHMgKGAnJ2AgZm9yIHRoZVxuICogY2hlY2twb2ludCBpdHNlbGYsIGAncGVuZGluZ1BhdXNlc1swXSdgIGZvciBhIHNpYmxpbmcpLCBzbyBib3RoIHNpdGVzIHNwZWFrXG4gKiB0aGUgc2FtZSBzZW50ZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQYXVzZVJlY29yZChyYXc6IHVua25vd24sIGF0ID0gJycpOiBQZW5kaW5nUGF1c2Uge1xuICBjb25zdCBmaWVsZCA9IChuYW1lOiBzdHJpbmcpID0+IChhdCA/IGAke2F0fS4ke25hbWV9YCA6IG5hbWUpO1xuICBpZiAoIWlzUGxhaW5SZWNvcmQocmF3KSkgcmVmdXNlKGAke2F0IHx8ICd0aGUgY2hlY2twb2ludCd9IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIGlmICh0eXBlb2YgcmF3LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IHJhdy5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgIHJlZnVzZShgJHtmaWVsZCgncGF1c2VkU3RhZ2VJZCcpfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO1xuICB9XG4gIGNvbnN0IHN1YmZsb3dQYXRoID0gcmF3LnN1YmZsb3dQYXRoO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3ViZmxvd1BhdGgpIHx8ICFzdWJmbG93UGF0aC5ldmVyeSgocykgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKSkge1xuICAgIHJlZnVzZShgJHtmaWVsZCgnc3ViZmxvd1BhdGgnKX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7XG4gIH1cbiAgY29uc3Qgc3RhdGVzID0gcmF3LnN1YmZsb3dTdGF0ZXM7XG4gIGlmIChzdGF0ZXMgIT09IHVuZGVmaW5lZCAmJiAhaXNQbGFpblJlY29yZChzdGF0ZXMpKSByZWZ1c2UoYCR7ZmllbGQoJ3N1YmZsb3dTdGF0ZXMnKX0gbXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgLy8gRWFjaCBjYXB0dXJlIHNlZWRzIGEgc3ViZmxvdydzIHJ1bnRpbWUg4oCUIGEgcGxhaW4gb2JqZWN0LCBsaWtlIGBzaGFyZWRTdGF0ZWAuXG4gIGZvciAoY29uc3QgW3N1YmZsb3dJZCwgY2FwdHVyZV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGVzID8/IHt9KSkge1xuICAgIGlmICghaXNQbGFpblJlY29yZChjYXB0dXJlKSkgcmVmdXNlKGAke2ZpZWxkKCdzdWJmbG93U3RhdGVzJyl9WyR7SlNPTi5zdHJpbmdpZnkoc3ViZmxvd0lkKX1dIG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIH1cbiAgaWYgKHJhdy5wYXVzZWRCeSAhPT0gdW5kZWZpbmVkICYmIHJhdy5wYXVzZWRCeSAhPT0gJ2ludGVycnVwdCcpIHtcbiAgICByZWZ1c2UoYCR7ZmllbGQoJ3BhdXNlZEJ5Jyl9IG11c3QgYmUgJ2ludGVycnVwdCcgd2hlbiBwcmVzZW50YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYXVzZWRTdGFnZUlkOiByYXcucGF1c2VkU3RhZ2VJZCBhcyBzdHJpbmcsXG4gICAgc3ViZmxvd1BhdGg6IHN1YmZsb3dQYXRoIGFzIHN0cmluZ1tdLFxuICAgIHN1YmZsb3dTdGF0ZXM6IChzdGF0ZXMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkKSA/PyB7fSxcbiAgICAuLi4ocmF3LnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiByYXcucGF1c2VEYXRhIH0pLFxuICAgIC4uLihyYXcucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnICYmIHsgcGF1c2VkQnk6ICdpbnRlcnJ1cHQnIGFzIGNvbnN0IH0pLFxuICAgIC8vIEEgcmVjb3JkLCBuZXZlciBhIHBsYW4gaW5wdXQ6IGtlcHQgb25seSB3aGVuIHdlbGwtZm9ybWVkIChhbiBvbGRlciBvclxuICAgIC8vIGhhbmQtZWRpdGVkIGVudHJ5IHNpbXBseSByZXN1bWVzIHdpdGhvdXQgYSBsaW5rKS5cbiAgICAuLi4oaXNQYXVzZWRFeGVjdXRpb24ocmF3LnBhdXNlZEV4ZWN1dGlvbikgJiYge1xuICAgICAgcGF1c2VkRXhlY3V0aW9uOiB7IHJ1bklkOiByYXcucGF1c2VkRXhlY3V0aW9uLnJ1bklkLCBydW50aW1lU3RhZ2VJZDogcmF3LnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCB9LFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIFRIRSBjaGVja3BvaW50IGRlY29kZXI6IHVwY2FzdCwgdGhlbiBjaGVjayDigJQgdGhlIGNoZWNrcG9pbnQgaXMgYW4gb2JqZWN0LFxuICogaXRzIGBzaGFyZWRTdGF0ZWAgYSBwbGFpbiBvYmplY3QsIGl0cyBvd24gcGF1c2UgcmVjb3JkIHdlbGwtZm9ybWVkLCBhbmRcbiAqIGV2ZXJ5IGBwZW5kaW5nUGF1c2VzYCBlbnRyeSB3ZWxsLWZvcm1lZCAoZWFjaCByZXR1cm5lZCBkZWNvZGVkKS4gVGhyb3dzXG4gKiBgSW52YWxpZCBjaGVja3BvaW50OiDigKZgIG5hbWluZyB0aGUgZmlyc3QgZmllbGQgdGhhdCBpcyBub3Q7IG5ldmVyIGVkaXRzXG4gKiB0aGUgY2FsbGVyJ3Mgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQ2hlY2twb2ludChzdG9yZWQ6IHVua25vd24pOiBGbG93Y2hhcnRDaGVja3BvaW50IHtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKHN0b3JlZCkpIHJlZnVzZSgndGhlIGNoZWNrcG9pbnQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgY29uc3QgY2hlY2twb2ludCA9IHVwY2FzdENoZWNrcG9pbnQoc3RvcmVkKTtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpKSByZWZ1c2UoJ3NoYXJlZFN0YXRlIG11c3QgYmUgYSBwbGFpbiBvYmplY3QnKTtcbiAgZGVjb2RlUGF1c2VSZWNvcmQoY2hlY2twb2ludCk7XG4gIC8vIEEgcmVjb3JkLCBuZXZlciBhIHBsYW4gaW5wdXQg4oCUIHRoZSBTQU1FIHJ1bGUgYXMgYSBzaWJsaW5nJ3M6IGEgbWFsZm9ybWVkXG4gIC8vIGxpbmsgaXMgZHJvcHBlZCAodGhlIHJlc3VtZSBydW5zIHdpdGhvdXQgaXQpLCBuZXZlciB0cnVzdGVkLlxuICBpZiAoY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb24gIT09IHVuZGVmaW5lZCAmJiAhaXNQYXVzZWRFeGVjdXRpb24oY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb24pKSB7XG4gICAgZGVsZXRlIGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uO1xuICB9XG4gIC8vIFRoZSBjb3VudGVycyBzZWVkIHRoZSByZXN1bWVkIHJ1bidzIGlkcyBhbmQgbG9vcCBidWRnZXQ6IGFic2VudCBpcyBhbiBvbGRcbiAgLy8gY2hlY2twb2ludCAodGhlIGNvdW50ZXIgcmVzdGFydHMpLCBwcmVzZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuXG4gIGlmIChjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50ICE9PSB1bmRlZmluZWQgJiYgIWlzQ291bnQoY2hlY2twb2ludC5leGVjdXRpb25Db3VudCkpIHtcbiAgICByZWZ1c2UoJ2V4ZWN1dGlvbkNvdW50IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICB9XG4gIGNvbnN0IHZpc2l0cyA9IGNoZWNrcG9pbnQudmlzaXRDb3VudHM7XG4gIGlmICh2aXNpdHMgIT09IHVuZGVmaW5lZCAmJiAoIWlzUGxhaW5SZWNvcmQodmlzaXRzKSB8fCAhT2JqZWN0LnZhbHVlcyh2aXNpdHMpLmV2ZXJ5KGlzQ291bnQpKSkge1xuICAgIHJlZnVzZSgndmlzaXRDb3VudHMgbXVzdCBtYXAgc3RhZ2UgaWRzIHRvIG5vbi1uZWdhdGl2ZSBpbnRlZ2VycycpO1xuICB9XG4gIGlmIChjaGVja3BvaW50LnBlbmRpbmdQYXVzZXMgIT09IHVuZGVmaW5lZCkgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzID0gZGVjb2RlUGVuZGluZ1BhdXNlcyhjaGVja3BvaW50LnBlbmRpbmdQYXVzZXMpO1xuICAvLyBUaGUgcmVkYWN0aW9uIGEgcGF1c2UgY2FycmllcyAobmFtZXMgb25seSkgc2VlZHMgdGhlIHJlc3VtZWQgcnVuJ3MgcnVsZSDigJQgYSBtYWxmb3JtZWQgb25lXG4gIC8vIGlzIHJlZnVzZWQsIG5ldmVyIGRyb3BwZWQ6IGRyb3BwaW5nIGl0IHdvdWxkIHNlcnZlIGluIHBsYWluIHdoYXQgdGhlIHJ1biBoYWQgbWFza2VkLlxuICBpZiAoY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyAhPT0gdW5kZWZpbmVkKSBkZWNvZGVSZWRhY3Rpb25NYXJrcyhjaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzKTtcbiAgcmV0dXJuIGNoZWNrcG9pbnQgYXMgdW5rbm93biBhcyBGbG93Y2hhcnRDaGVja3BvaW50O1xufVxuXG4vKiogYHJlZGFjdGlvbk1hcmtzYDogYGtleXNgIGFuIGFycmF5IG9mIHN0cmluZ3M7IGBmaWVsZHNgLCB3aGVuIHByZXNlbnQsIGtleXMg4oaSIGFycmF5cyBvZiBzdHJpbmdzLiAqL1xuZnVuY3Rpb24gZGVjb2RlUmVkYWN0aW9uTWFya3MobWFya3M6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKG1hcmtzKSkgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBpZiAoIWlzU3RyaW5ncyhtYXJrcy5rZXlzKSkgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcy5rZXlzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICBjb25zdCBmaWVsZHMgPSBtYXJrcy5maWVsZHM7XG4gIGlmIChmaWVsZHMgIT09IHVuZGVmaW5lZCAmJiAoIWlzUGxhaW5SZWNvcmQoZmllbGRzKSB8fCAhT2JqZWN0LnZhbHVlcyhmaWVsZHMpLmV2ZXJ5KGlzU3RyaW5ncykpKSB7XG4gICAgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcy5maWVsZHMgbXVzdCBtYXAga2V5cyB0byBhcnJheXMgb2Ygc3RyaW5ncycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5ncyh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbi8qKlxuICogYHBlbmRpbmdQYXVzZXNgIChzdG9yZWQsIHVudHJ1c3RlZCkgYXMgZGVjb2RlZCByZWNvcmRzIOKAlCB0aGUgb25lIGNoZWNrXG4gKiBgZGVjb2RlQ2hlY2twb2ludGAgcnVucywgYW5kIHRoZSBvbmUgYFJlc3VtZUVudHJ5LnBsYW5gIHJ1bnMgb24gd2hhdCBpdCBpc1xuICogaGFuZGVkIGRpcmVjdGx5LCBzbyBuZWl0aGVyIGRvb3IgdGFrZXMgYW4gdW5jaGVja2VkIHNpYmxpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQZW5kaW5nUGF1c2VzKHBlbmRpbmc6IHVua25vd24pOiBQZW5kaW5nUGF1c2VbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwZW5kaW5nKSkgcmVmdXNlKCdwZW5kaW5nUGF1c2VzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgcmV0dXJuIHBlbmRpbmcubWFwKChyYXc6IHVua25vd24sIG4pID0+IGRlY29kZVBhdXNlUmVjb3JkKHJhdywgYHBlbmRpbmdQYXVzZXNbJHtufV1gKSk7XG59XG5cbmZ1bmN0aW9uIGlzQ291bnQodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMDtcbn1cbiJdfQ==
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wYXVzZS9yZWNvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBR0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9DLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFVLENBQUM7QUFFN0MscUdBQXFHO0FBQ3JHLE1BQU0saUJBQWlCLEdBQXVCLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFldEUsbUVBQW1FO0FBQ25FLFNBQVMsTUFBTSxDQUFDLElBQVk7SUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUErQjtJQUM5RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDekMsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxDQUNKLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUNBQWlDO1lBQzlGLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtREFBbUQsQ0FDeEYsQ0FBQztJQUNKLENBQUM7SUFDRCx1RUFB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QU8sQ0FBQyxPQUFPLENBQUM7UUFBRSxNQUFNLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUN0RSxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsS0FBYztJQUM3QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDNUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcGF1c2UvcmVjb3JkLnRzIOKAlCB0aGUgY2hlY2twb2ludCBDT0RFQyAoRjgsIDkuMzkuMCk6IG9uZSB2ZXJzaW9uLCBvbmVcbiAqIHVwY2FzdGVyLCBvbmUgdmFsaWRhdG9yLCBvbmUgbWVzc2FnZSBzZXQuXG4gKlxuICogQSBjaGVja3BvaW50IGlzIHN0b3JlZCBkYXRhIOKAlCBSZWRpcywgUG9zdGdyZXMsIGEgZmlsZSDigJQgYW5kIGNvbWVzIGJhY2sgdG9cbiAqIGByZXN1bWUoKWAgZnJvbSB3aGljaGV2ZXIgcmVsZWFzZSB3cm90ZSBpdC4gVW50aWwgOS4zOC4wIGl0IHdhcyBjaGVja2VkIGluXG4gKiBUV08gcGxhY2VzIHdpdGggdHdvIG1lc3NhZ2Ugc2V0czogYEZsb3dDaGFydEV4ZWN1dG9yIMK3IHJlc3VtZWAgY2hlY2tlZCB0aGVcbiAqIHBhdXNlZCByZWNvcmQncyBmaWVsZHMsIGBSZXN1bWVFbnRyeWAgY2hlY2tlZCBlYWNoIHdhaXRpbmcgc2libGluZydzXG4gKiAoYHBlbmRpbmdQYXVzZXNbbl1gKSDigJQgdGhlIFNBTUUgcmVjb3JkIHNoYXBlLCBjaGVja2VkIHR3aWNlLCBkaWZmZXJlbnRseVxuICogKHRoZSB0b3AtbGV2ZWwgYHBhdXNlZEJ5YCBhbmQgYHN1YmZsb3dTdGF0ZXNgIHdlcmUgbmV2ZXIgY2hlY2tlZCBhdCBhbGwpLlxuICogQm90aCBub3cgY2FsbCB7QGxpbmsgZGVjb2RlQ2hlY2twb2ludH07IGV2ZXJ5IHJlY29yZCBpcyBjaGVja2VkIGJ5XG4gKiB7QGxpbmsgZGVjb2RlUGF1c2VSZWNvcmR9LlxuICpcbiAqIFZFUlNJT05JTkcuIEEgY2hlY2twb2ludCB3cml0dGVuIGJ5IHRoaXMgcmVsZWFzZSBjYXJyaWVzXG4gKiBgY2hlY2twb2ludFZlcnNpb246IDJgLiBFdmVyeSBvbGRlciBvbmUgaXMgcmVhZCBieSB0aGUgT05FIHVwY2FzdGVyLFxuICoge0BsaW5rIHVwY2FzdENoZWNrcG9pbnR9LCBhbmQgZXZlcnkgc3RlcCBzbyBmYXIgb25seSBEUk9QUyBmaWVsZHMg4oCUIHdoYXQgYVxuICogbGF0ZXIgZm9ybWF0IGFkZGVkIGlzIG9wdGlvbmFsIGFuZCByZWFkIGFzIGFic2VudDpcbiAqXG4gKiAgIC0gdmVyc2lvbiAwIChubyBgY2hlY2twb2ludFZlcnNpb25gLCBiZWZvcmUgOS4zOS4wKSDihpIgMTogZHJvcFxuICogICAgIGBjb250aW51YXRpb25TdGFnZUlkYCwgYSByZWNvcmQgbm8gcmVzdW1lIGhhcyByZWFkIHNpbmNlIDkuMjguMCAod2hhdFxuICogICAgIHJ1bnMgYWZ0ZXIgYSByZXN1bWUgY29tZXMgZnJvbSB0aGUgY2hhcnQpO1xuICogICAtIHZlcnNpb24gMSAoOS4zOS4w4oCTOS40My54KSDihpIgMiAodGhlIExFQU4gY2hlY2twb2ludCk6IGRyb3BcbiAqICAgICBgZXhlY3V0aW9uVHJlZWAgYW5kIGBzdWJmbG93UmVzdWx0c2Ag4oCUIHRoZSBydW4ncyBzZXJ2ZWQgcmVjb3JkICh0aGVcbiAqICAgICB3aG9sZSBleGVjdXRpb24gdHJlZSwgdGhlIGZpbmlzaGVkIHN1YmZsb3dzJyByZXN1bHRzKSwgd2hpY2ggbm8gcmVzdW1lXG4gKiAgICAgZXZlciByZWFkIGFuZCB3aGljaCBncmV3IHdpdGggZXZlcnkgZmluaXNoZWQgaXRlcmF0aW9uXG4gKiAgICAgKGBydW5uZXIvY2hlY2twb2ludC50c2ApLlxuICpcbiAqIEEgZHJvcHBlZCBmaWVsZCBuZXZlciBzdXJ2aXZlcywgd2hhdGV2ZXIgdmVyc2lvbiBjbGFpbXMgdG8gY2FycnkgaXQuIEFcbiAqIHZlcnNpb24gdGhpcyByZWxlYXNlIGRvZXMgbm90IGtub3cgaXMgcmVmdXNlZCwgbmV2ZXIgZ3Vlc3NlZCBhdC5cbiAqXG4gKiBCb3Jyb3dlZDogTGFuZ0dyYXBoJ3MgY2hlY2twb2ludCBgdmAgZmllbGQ7IGlvLXRzJ3MgZGVjb2RlLWF0LXRoZS1ib3VuZGFyeVxuICogKG9uZSBkZWNvZGVyIHR1cm5zIGB1bmtub3duYCBpbnRvIHRoZSB0eXBlLCBvciByZWZ1c2VzIHdpdGggYSBwYXRoKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBlbmRpbmdQYXVzZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24gfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSBjaGVja3BvaW50IGZvcm1hdCB0aGlzIHJlbGVhc2Ugd3JpdGVzIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5jaGVja3BvaW50VmVyc2lvbmApLiAqL1xuZXhwb3J0IGNvbnN0IENIRUNLUE9JTlRfVkVSU0lPTiA9IDIgYXMgY29uc3Q7XG5cbi8qKiBUaGUgZm9ybWF0cyB0aGlzIHJlbGVhc2UgcmVhZHM6IHRoZSBjdXJyZW50IG9uZSBhbmQgZXZlcnkgb25lIGl0IHVwY2FzdHMgKGFic2VudCA9IHZlcnNpb24gMCkuICovXG5jb25zdCBSRUFEQUJMRV9WRVJTSU9OUzogcmVhZG9ubHkgdW5rbm93bltdID0gWzEsIENIRUNLUE9JTlRfVkVSU0lPTl07XG5cbi8qKlxuICogRmllbGRzIG9ubHkgYW4gT0xERVIgY2hlY2twb2ludCBjYW4gY2FycnksIGVhY2ggZHJvcHBlZCBieSB0aGUgZm9ybWF0IG5hbWVkXG4gKiBiZXNpZGUgaXQuIFRoZSB1cGNhc3RlciByZW1vdmVzIHRoZW0gYW5kIHRoZSBjdXJyZW50IHNoYXBlIG5ldmVyIGhhcyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2FjeUNoZWNrcG9pbnRGaWVsZHMge1xuICAvKiogVmVyc2lvbiAwIG9ubHk6IHRoZSBpbnZva2VyJ3MgYC5uZXh0YCBpZCDigJQgYSByZWNvcmQgc2luY2UgOS4yOC4wLCBuZXZlciByZWFkLiBEcm9wcGVkIGJ5IHZlcnNpb24gMS4gKi9cbiAgcmVhZG9ubHkgY29udGludWF0aW9uU3RhZ2VJZD86IHN0cmluZztcbiAgLyoqIFZlcnNpb25zIDDigJMxOiB0aGUgcnVuJ3MgZXhlY3V0aW9uIHRyZWUgYXQgdGhlIHBhdXNlIOKAlCBuZXZlciByZWFkIGJ5IGEgcmVzdW1lLiBEcm9wcGVkIGJ5IHZlcnNpb24gMi4gKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVHJlZT86IHVua25vd247XG4gIC8qKiBWZXJzaW9ucyAw4oCTMTogdGhlIHN1YmZsb3dzIGZpbmlzaGVkIGJlZm9yZSB0aGUgcGF1c2Ug4oCUIG5ldmVyIHJlYWQgYnkgYSByZXN1bWUuIERyb3BwZWQgYnkgdmVyc2lvbiAyLiAqL1xuICByZWFkb25seSBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogVGhlIG9uZSBtZXNzYWdlIHNoYXBlOiBgSW52YWxpZCBjaGVja3BvaW50OiA8d2hlcmU+IDx3aGF0Pi5gICovXG5mdW5jdGlvbiByZWZ1c2Uod2hhdDogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hlY2twb2ludDogJHt3aGF0fS5gKTtcbn1cblxuZnVuY3Rpb24gaXNQbGFpblJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG4vKipcbiAqIEJyaW5nIGEgc3RvcmVkIGNoZWNrcG9pbnQgb2YgQU5ZIHJlbGVhc2UgdG8gdGhlIGN1cnJlbnQgc2hhcGUg4oCUIHRoZSBvbmVcbiAqIHVwY2FzdGVyLiBWZXJzaW9ucyAwIChubyBgY2hlY2twb2ludFZlcnNpb25gKSBhbmQgMTogZHJvcCB0aGUgZmllbGRzIHRoZWlyXG4gKiBzdWNjZXNzb3JzIGRyb3BwZWQgKHtAbGluayBMZWdhY3lDaGVja3BvaW50RmllbGRzfSksIHN0YW1wIHRoZSBjdXJyZW50XG4gKiB2ZXJzaW9uIGFzIHRoZSBmaXJzdCBrZXkuIFRoZSBjdXJyZW50IHZlcnNpb246IGFzIGlzLCBtaW51cyBhbnkgZHJvcHBlZFxuICogZmllbGQgaXQgY2xhaW1zIHRvIGNhcnJ5LiBBbnl0aGluZyBlbHNlOiByZWZ1c2VkLiBSZXR1cm5zIGEgbmV3IG9iamVjdDsgdGhlXG4gKiBjYWxsZXIncyBpcyBuZXZlciBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RDaGVja3BvaW50KHN0b3JlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IHZlcnNpb24gPSBzdG9yZWQuY2hlY2twb2ludFZlcnNpb247XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgIVJFQURBQkxFX1ZFUlNJT05TLmluY2x1ZGVzKHZlcnNpb24pKSB7XG4gICAgcmVmdXNlKFxuICAgICAgYGNoZWNrcG9pbnRWZXJzaW9uICR7SlNPTi5zdHJpbmdpZnkodmVyc2lvbikgPz8gU3RyaW5nKHZlcnNpb24pfSBpcyBub3Qgb25lIHRoaXMgcmVsZWFzZSByZWFkcyBgICtcbiAgICAgICAgYCgke1JFQURBQkxFX1ZFUlNJT05TLmpvaW4oJyBvciAnKX0sIG9yIG5vbmUgZm9yIGEgY2hlY2twb2ludCB3cml0dGVuIGJlZm9yZSA5LjM5LjApYCxcbiAgICApO1xuICB9XG4gIC8vIEEgZHJvcHBlZCBmaWVsZCBuZXZlciBzdXJ2aXZlcywgd2hhdGV2ZXIgdmVyc2lvbiBjbGFpbXMgdG8gY2FycnkgaXQuXG4gIGNvbnN0IHtcbiAgICBjaGVja3BvaW50VmVyc2lvbjogX3ZlcnNpb24sXG4gICAgY29udGludWF0aW9uU3RhZ2VJZDogX2ludm9rZXJOZXh0LFxuICAgIGV4ZWN1dGlvblRyZWU6IF90cmVlLFxuICAgIHN1YmZsb3dSZXN1bHRzOiBfZmluaXNoZWRTdWJmbG93cyxcbiAgICAuLi5jdXJyZW50XG4gIH0gPSBzdG9yZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiBMZWdhY3lDaGVja3BvaW50RmllbGRzO1xuICByZXR1cm4geyBjaGVja3BvaW50VmVyc2lvbjogQ0hFQ0tQT0lOVF9WRVJTSU9OLCAuLi5jdXJyZW50IH07XG59XG5cbi8qKlxuICogQ2hlY2sgT05FIHBhdXNlIHJlY29yZCDigJQgdGhlIHBhdXNlZCBzdGFnZSdzIG93biBmaWVsZHMgb24gdGhlIGNoZWNrcG9pbnQsXG4gKiBvciBhIHdhaXRpbmcgc2libGluZydzIGBwZW5kaW5nUGF1c2VzW25dYCDigJQgYW5kIHJldHVybiBpdCBhcyBhXG4gKiB7QGxpbmsgUGVuZGluZ1BhdXNlfS4gYGF0YCBuYW1lcyB3aGVyZSB0aGUgcmVjb3JkIHNpdHMgKGAnJ2AgZm9yIHRoZVxuICogY2hlY2twb2ludCBpdHNlbGYsIGAncGVuZGluZ1BhdXNlc1swXSdgIGZvciBhIHNpYmxpbmcpLCBzbyBib3RoIHNpdGVzIHNwZWFrXG4gKiB0aGUgc2FtZSBzZW50ZW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQYXVzZVJlY29yZChyYXc6IHVua25vd24sIGF0ID0gJycpOiBQZW5kaW5nUGF1c2Uge1xuICBjb25zdCBmaWVsZCA9IChuYW1lOiBzdHJpbmcpID0+IChhdCA/IGAke2F0fS4ke25hbWV9YCA6IG5hbWUpO1xuICBpZiAoIWlzUGxhaW5SZWNvcmQocmF3KSkgcmVmdXNlKGAke2F0IHx8ICd0aGUgY2hlY2twb2ludCd9IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIGlmICh0eXBlb2YgcmF3LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IHJhdy5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgIHJlZnVzZShgJHtmaWVsZCgncGF1c2VkU3RhZ2VJZCcpfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO1xuICB9XG4gIGNvbnN0IHN1YmZsb3dQYXRoID0gcmF3LnN1YmZsb3dQYXRoO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3ViZmxvd1BhdGgpIHx8ICFzdWJmbG93UGF0aC5ldmVyeSgocykgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKSkge1xuICAgIHJlZnVzZShgJHtmaWVsZCgnc3ViZmxvd1BhdGgnKX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7XG4gIH1cbiAgY29uc3Qgc3RhdGVzID0gcmF3LnN1YmZsb3dTdGF0ZXM7XG4gIGlmIChzdGF0ZXMgIT09IHVuZGVmaW5lZCAmJiAhaXNQbGFpblJlY29yZChzdGF0ZXMpKSByZWZ1c2UoYCR7ZmllbGQoJ3N1YmZsb3dTdGF0ZXMnKX0gbXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgLy8gRWFjaCBjYXB0dXJlIHNlZWRzIGEgc3ViZmxvdydzIHJ1bnRpbWUg4oCUIGEgcGxhaW4gb2JqZWN0LCBsaWtlIGBzaGFyZWRTdGF0ZWAuXG4gIGZvciAoY29uc3QgW3N1YmZsb3dJZCwgY2FwdHVyZV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGVzID8/IHt9KSkge1xuICAgIGlmICghaXNQbGFpblJlY29yZChjYXB0dXJlKSkgcmVmdXNlKGAke2ZpZWxkKCdzdWJmbG93U3RhdGVzJyl9WyR7SlNPTi5zdHJpbmdpZnkoc3ViZmxvd0lkKX1dIG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gIH1cbiAgaWYgKHJhdy5wYXVzZWRCeSAhPT0gdW5kZWZpbmVkICYmIHJhdy5wYXVzZWRCeSAhPT0gJ2ludGVycnVwdCcpIHtcbiAgICByZWZ1c2UoYCR7ZmllbGQoJ3BhdXNlZEJ5Jyl9IG11c3QgYmUgJ2ludGVycnVwdCcgd2hlbiBwcmVzZW50YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYXVzZWRTdGFnZUlkOiByYXcucGF1c2VkU3RhZ2VJZCBhcyBzdHJpbmcsXG4gICAgc3ViZmxvd1BhdGg6IHN1YmZsb3dQYXRoIGFzIHN0cmluZ1tdLFxuICAgIHN1YmZsb3dTdGF0ZXM6IChzdGF0ZXMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkKSA/PyB7fSxcbiAgICAuLi4ocmF3LnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiByYXcucGF1c2VEYXRhIH0pLFxuICAgIC4uLihyYXcucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnICYmIHsgcGF1c2VkQnk6ICdpbnRlcnJ1cHQnIGFzIGNvbnN0IH0pLFxuICAgIC8vIEEgcmVjb3JkLCBuZXZlciBhIHBsYW4gaW5wdXQ6IGtlcHQgb25seSB3aGVuIHdlbGwtZm9ybWVkIChhbiBvbGRlciBvclxuICAgIC8vIGhhbmQtZWRpdGVkIGVudHJ5IHNpbXBseSByZXN1bWVzIHdpdGhvdXQgYSBsaW5rKS5cbiAgICAuLi4oaXNQYXVzZWRFeGVjdXRpb24ocmF3LnBhdXNlZEV4ZWN1dGlvbikgJiYge1xuICAgICAgcGF1c2VkRXhlY3V0aW9uOiB7IHJ1bklkOiByYXcucGF1c2VkRXhlY3V0aW9uLnJ1bklkLCBydW50aW1lU3RhZ2VJZDogcmF3LnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCB9LFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIFRIRSBjaGVja3BvaW50IGRlY29kZXI6IHVwY2FzdCwgdGhlbiBjaGVjayDigJQgdGhlIGNoZWNrcG9pbnQgaXMgYW4gb2JqZWN0LFxuICogaXRzIGBzaGFyZWRTdGF0ZWAgYSBwbGFpbiBvYmplY3QsIGl0cyBvd24gcGF1c2UgcmVjb3JkIHdlbGwtZm9ybWVkLCBhbmRcbiAqIGV2ZXJ5IGBwZW5kaW5nUGF1c2VzYCBlbnRyeSB3ZWxsLWZvcm1lZCAoZWFjaCByZXR1cm5lZCBkZWNvZGVkKS4gVGhyb3dzXG4gKiBgSW52YWxpZCBjaGVja3BvaW50OiDigKZgIG5hbWluZyB0aGUgZmlyc3QgZmllbGQgdGhhdCBpcyBub3Q7IG5ldmVyIGVkaXRzXG4gKiB0aGUgY2FsbGVyJ3Mgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlQ2hlY2twb2ludChzdG9yZWQ6IHVua25vd24pOiBGbG93Y2hhcnRDaGVja3BvaW50IHtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKHN0b3JlZCkpIHJlZnVzZSgndGhlIGNoZWNrcG9pbnQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgY29uc3QgY2hlY2twb2ludCA9IHVwY2FzdENoZWNrcG9pbnQoc3RvcmVkKTtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpKSByZWZ1c2UoJ3NoYXJlZFN0YXRlIG11c3QgYmUgYSBwbGFpbiBvYmplY3QnKTtcbiAgZGVjb2RlUGF1c2VSZWNvcmQoY2hlY2twb2ludCk7XG4gIC8vIEEgcmVjb3JkLCBuZXZlciBhIHBsYW4gaW5wdXQg4oCUIHRoZSBTQU1FIHJ1bGUgYXMgYSBzaWJsaW5nJ3M6IGEgbWFsZm9ybWVkXG4gIC8vIGxpbmsgaXMgZHJvcHBlZCAodGhlIHJlc3VtZSBydW5zIHdpdGhvdXQgaXQpLCBuZXZlciB0cnVzdGVkLlxuICBpZiAoY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb24gIT09IHVuZGVmaW5lZCAmJiAhaXNQYXVzZWRFeGVjdXRpb24oY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb24pKSB7XG4gICAgZGVsZXRlIGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uO1xuICB9XG4gIC8vIFRoZSBjb3VudGVycyBzZWVkIHRoZSByZXN1bWVkIHJ1bidzIGlkcyBhbmQgbG9vcCBidWRnZXQ6IGFic2VudCBpcyBhbiBvbGRcbiAgLy8gY2hlY2twb2ludCAodGhlIGNvdW50ZXIgcmVzdGFydHMpLCBwcmVzZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuXG4gIGlmIChjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50ICE9PSB1bmRlZmluZWQgJiYgIWlzQ291bnQoY2hlY2twb2ludC5leGVjdXRpb25Db3VudCkpIHtcbiAgICByZWZ1c2UoJ2V4ZWN1dGlvbkNvdW50IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICB9XG4gIGNvbnN0IHZpc2l0cyA9IGNoZWNrcG9pbnQudmlzaXRDb3VudHM7XG4gIGlmICh2aXNpdHMgIT09IHVuZGVmaW5lZCAmJiAoIWlzUGxhaW5SZWNvcmQodmlzaXRzKSB8fCAhT2JqZWN0LnZhbHVlcyh2aXNpdHMpLmV2ZXJ5KGlzQ291bnQpKSkge1xuICAgIHJlZnVzZSgndmlzaXRDb3VudHMgbXVzdCBtYXAgc3RhZ2UgaWRzIHRvIG5vbi1uZWdhdGl2ZSBpbnRlZ2VycycpO1xuICB9XG4gIGlmIChjaGVja3BvaW50LnBlbmRpbmdQYXVzZXMgIT09IHVuZGVmaW5lZCkgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzID0gZGVjb2RlUGVuZGluZ1BhdXNlcyhjaGVja3BvaW50LnBlbmRpbmdQYXVzZXMpO1xuICAvLyBUaGUgcmVkYWN0aW9uIGEgcGF1c2UgY2FycmllcyAobmFtZXMgb25seSkgc2VlZHMgdGhlIHJlc3VtZWQgcnVuJ3MgcnVsZSDigJQgYSBtYWxmb3JtZWQgb25lXG4gIC8vIGlzIHJlZnVzZWQsIG5ldmVyIGRyb3BwZWQ6IGRyb3BwaW5nIGl0IHdvdWxkIHNlcnZlIGluIHBsYWluIHdoYXQgdGhlIHJ1biBoYWQgbWFza2VkLlxuICBpZiAoY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyAhPT0gdW5kZWZpbmVkKSBkZWNvZGVSZWRhY3Rpb25NYXJrcyhjaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzKTtcbiAgcmV0dXJuIGNoZWNrcG9pbnQgYXMgdW5rbm93biBhcyBGbG93Y2hhcnRDaGVja3BvaW50O1xufVxuXG4vKiogYHJlZGFjdGlvbk1hcmtzYDogYGtleXNgIGFuIGFycmF5IG9mIHN0cmluZ3M7IGBmaWVsZHNgLCB3aGVuIHByZXNlbnQsIGtleXMg4oaSIGFycmF5cyBvZiBzdHJpbmdzLiAqL1xuZnVuY3Rpb24gZGVjb2RlUmVkYWN0aW9uTWFya3MobWFya3M6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKCFpc1BsYWluUmVjb3JkKG1hcmtzKSkgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICBpZiAoIWlzU3RyaW5ncyhtYXJrcy5rZXlzKSkgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcy5rZXlzIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycpO1xuICBjb25zdCBmaWVsZHMgPSBtYXJrcy5maWVsZHM7XG4gIGlmIChmaWVsZHMgIT09IHVuZGVmaW5lZCAmJiAoIWlzUGxhaW5SZWNvcmQoZmllbGRzKSB8fCAhT2JqZWN0LnZhbHVlcyhmaWVsZHMpLmV2ZXJ5KGlzU3RyaW5ncykpKSB7XG4gICAgcmVmdXNlKCdyZWRhY3Rpb25NYXJrcy5maWVsZHMgbXVzdCBtYXAga2V5cyB0byBhcnJheXMgb2Ygc3RyaW5ncycpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5ncyh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbi8qKlxuICogYHBlbmRpbmdQYXVzZXNgIChzdG9yZWQsIHVudHJ1c3RlZCkgYXMgZGVjb2RlZCByZWNvcmRzIOKAlCB0aGUgb25lIGNoZWNrXG4gKiBgZGVjb2RlQ2hlY2twb2ludGAgcnVucywgYW5kIHRoZSBvbmUgYFJlc3VtZUVudHJ5LnBsYW5gIHJ1bnMgb24gd2hhdCBpdCBpc1xuICogaGFuZGVkIGRpcmVjdGx5LCBzbyBuZWl0aGVyIGRvb3IgdGFrZXMgYW4gdW5jaGVja2VkIHNpYmxpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQZW5kaW5nUGF1c2VzKHBlbmRpbmc6IHVua25vd24pOiBQZW5kaW5nUGF1c2VbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShwZW5kaW5nKSkgcmVmdXNlKCdwZW5kaW5nUGF1c2VzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgcmV0dXJuIHBlbmRpbmcubWFwKChyYXc6IHVua25vd24sIG4pID0+IGRlY29kZVBhdXNlUmVjb3JkKHJhdywgYHBlbmRpbmdQYXVzZXNbJHtufV1gKSk7XG59XG5cbmZ1bmN0aW9uIGlzQ291bnQodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMDtcbn1cbiJdfQ==
|
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
* The signal bubbles up through SubflowExecutor → FlowchartTraverser → FlowChartExecutor,
|
|
6
6
|
* each level adding its subflow ID to the path.
|
|
7
7
|
*
|
|
8
|
-
* The checkpoint captures
|
|
9
|
-
*
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
8
|
+
* The checkpoint captures what a resume reads, and the pause's own record —
|
|
9
|
+
* never the run's history (that is `getSnapshot()`'s):
|
|
10
|
+
* - pausedStageId + subflowPath (+ pausedBy): the cursor
|
|
11
|
+
* - sharedState + subflowStates: the state at the pause — the root's, and
|
|
12
|
+
* each subflow's on the pause path
|
|
13
|
+
* - executionCount + visitCounts: the counters the resumed run continues
|
|
14
|
+
* - pendingPauses, redactionMarks: waiting siblings, redaction names
|
|
15
|
+
* - pauseData, pausedExecution, invokerStageId, pausedAt: the record
|
|
13
16
|
*
|
|
14
17
|
* Resume rebuilds the flowchart, restores scope, navigates to the paused stage,
|
|
15
18
|
* injects resumeInput, and continues traversal.
|
|
@@ -228,29 +231,15 @@ export interface PauseResult {
|
|
|
228
231
|
readonly data?: unknown;
|
|
229
232
|
}
|
|
230
233
|
/**
|
|
231
|
-
* Serializable checkpoint — everything needed to resume a paused flowchart
|
|
234
|
+
* Serializable checkpoint — everything needed to resume a paused flowchart,
|
|
235
|
+
* and nothing a resume never reads.
|
|
232
236
|
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
* const checkpoint = executor.getCheckpoint(); // after pause
|
|
240
|
-
* await redis.set(`session:${id}`, JSON.stringify(checkpoint));
|
|
241
|
-
*
|
|
242
|
-
* // Resume (hours later, possibly different server)
|
|
243
|
-
* const checkpoint = JSON.parse(await redis.get(`session:${id}`));
|
|
244
|
-
* const executor = new FlowChartExecutor(chart);
|
|
245
|
-
* await executor.resume(checkpoint, { approved: true });
|
|
246
|
-
* ```
|
|
247
|
-
*/
|
|
248
|
-
/**
|
|
249
|
-
* Serializable checkpoint — everything needed to resume a paused flowchart.
|
|
250
|
-
*
|
|
251
|
-
* The execution tree IS the traversed path. The leaf node with status 'paused'
|
|
252
|
-
* IS the cursor. No separate path array needed — the tree structure captures
|
|
253
|
-
* the full nesting (including subflows).
|
|
237
|
+
* LEAN (format 2): its size is the STATE's, never the run's length. The cursor
|
|
238
|
+
* is `pausedStageId` + `subflowPath`; the state is `sharedState` plus the
|
|
239
|
+
* captures of the subflows on that path (`subflowStates`). The run's history —
|
|
240
|
+
* the execution tree, the finished subflows' results, the commit log — is not
|
|
241
|
+
* here: read it from `executor.getSnapshot()` before `resume()` (format 1
|
|
242
|
+
* carried `executionTree` and `subflowResults`; no resume read them).
|
|
254
243
|
*
|
|
255
244
|
* JSON-safe: no functions, no class instances, no SDK clients.
|
|
256
245
|
* Store anywhere: Redis, Postgres, localStorage, a file.
|
|
@@ -268,18 +257,16 @@ export interface PauseResult {
|
|
|
268
257
|
*/
|
|
269
258
|
export interface FlowchartCheckpoint {
|
|
270
259
|
/**
|
|
271
|
-
* The checkpoint FORMAT (9.39.0
|
|
272
|
-
* before
|
|
273
|
-
* (`pause/record.ts · upcastCheckpoint`)
|
|
274
|
-
*
|
|
275
|
-
*
|
|
260
|
+
* The checkpoint FORMAT: `2`, the lean checkpoint (`1` from 9.39.0; absent
|
|
261
|
+
* before). `resume()` reads every older one through the one upcaster
|
|
262
|
+
* (`pause/record.ts · upcastCheckpoint`), which drops what later formats
|
|
263
|
+
* dropped — format 1's `executionTree` and `subflowResults`, the legacy
|
|
264
|
+
* `continuationStageId` — none of which a resume ever read. A version this
|
|
265
|
+
* release does not know is refused.
|
|
276
266
|
*/
|
|
277
|
-
readonly checkpointVersion?:
|
|
267
|
+
readonly checkpointVersion?: 2;
|
|
278
268
|
/** Scope state at the pause point — all shared memory key/values. */
|
|
279
269
|
readonly sharedState: Record<string, unknown>;
|
|
280
|
-
/** Execution tree — the traversed path. The leaf with status 'paused' is the cursor.
|
|
281
|
-
* Contains subflow nesting. Used for BTS visualization and to find the resume point. */
|
|
282
|
-
readonly executionTree: unknown;
|
|
283
270
|
/** ID of the stage that paused. Used by resume() to find the node in the graph. */
|
|
284
271
|
readonly pausedStageId: string;
|
|
285
272
|
/**
|
|
@@ -307,8 +294,6 @@ export interface FlowchartCheckpoint {
|
|
|
307
294
|
* pausable stage runs its separate `resumeFn`.
|
|
308
295
|
*/
|
|
309
296
|
readonly pausedBy?: 'interrupt';
|
|
310
|
-
/** Subflow results collected before the pause. */
|
|
311
|
-
readonly subflowResults?: Record<string, unknown>;
|
|
312
297
|
/**
|
|
313
298
|
* Subflow scope capture — one entry per subflow boundary on the path
|
|
314
299
|
* to the paused stage. Keyed by path-prefixed subflow id (matches
|
|
@@ -5,11 +5,14 @@
|
|
|
5
5
|
* The signal bubbles up through SubflowExecutor → FlowchartTraverser → FlowChartExecutor,
|
|
6
6
|
* each level adding its subflow ID to the path.
|
|
7
7
|
*
|
|
8
|
-
* The checkpoint captures
|
|
9
|
-
*
|
|
10
|
-
* -
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
8
|
+
* The checkpoint captures what a resume reads, and the pause's own record —
|
|
9
|
+
* never the run's history (that is `getSnapshot()`'s):
|
|
10
|
+
* - pausedStageId + subflowPath (+ pausedBy): the cursor
|
|
11
|
+
* - sharedState + subflowStates: the state at the pause — the root's, and
|
|
12
|
+
* each subflow's on the pause path
|
|
13
|
+
* - executionCount + visitCounts: the counters the resumed run continues
|
|
14
|
+
* - pendingPauses, redactionMarks: waiting siblings, redaction names
|
|
15
|
+
* - pauseData, pausedExecution, invokerStageId, pausedAt: the record
|
|
13
16
|
*
|
|
14
17
|
* Resume rebuilds the flowchart, restores scope, navigates to the paused stage,
|
|
15
18
|
* injects resumeInput, and continues traversal.
|
|
@@ -241,4 +244,4 @@ export function isPauseSignal(error) {
|
|
|
241
244
|
return false;
|
|
242
245
|
}
|
|
243
246
|
}
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BhdXNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQTRCSCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBeUUsQ0FBQztJQUNwRixPQUFPLENBQ0wsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUNsSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNwQyx1REFBdUQ7SUFDOUMsU0FBUyxDQUFVO0lBQzVCLDRDQUE0QztJQUNuQyxPQUFPLENBQVM7SUFDekI7Ozs7Ozs7T0FPRztJQUNNLFFBQVEsQ0FBZTtJQUNoQyx5RUFBeUU7SUFDakUsWUFBWSxDQUFXO0lBRS9COzs7Ozs7Ozs7T0FTRztJQUNLLGVBQWUsQ0FBVTtJQUVqQzs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGNBQWMsR0FBNEMsRUFBRSxDQUFDO0lBRXJFOzs7Ozs7O09BT0c7SUFDSyxjQUFjLEdBQTBCLEVBQUUsQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQThDO0lBRXRFLFlBQVksSUFBYSxFQUFFLE9BQWUsRUFBRSxRQUFzQjtRQUNoRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJ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U0QsK0RBQStEO0FBRS9ELGdFQUFnRTtBQUNoRSxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSyxLQUFxQixDQUFDLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDOUYsQ0FBQztBQUVELHdHQUF3RztBQUN4RyxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMseUVBQXlFO0lBQ3pFLHVFQUF1RTtJQUN2RSwyREFBMkQ7SUFDM0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUNMLEtBQUssWUFBWSxXQUFXO1lBQzVCLENBQUMsS0FBSyxZQUFZLEtBQUs7Z0JBQ3JCLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYTtnQkFDNUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7Z0JBQ3hELE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXVzZS9SZXN1bWUg4oCUIHNlcmlhbGl6YWJsZSBjaGVja3BvaW50IGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3MuXG4gKlxuICogQSBzdGFnZSBzaWduYWxzIHBhdXNlIGJ5IGNhbGxpbmcgYHNjb3BlLiRwYXVzZShkYXRhKWAgd2hpY2ggdGhyb3dzIGEgUGF1c2VTaWduYWwuXG4gKiBUaGUgc2lnbmFsIGJ1YmJsZXMgdXAgdGhyb3VnaCBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlciDihpIgRmxvd0NoYXJ0RXhlY3V0b3IsXG4gKiBlYWNoIGxldmVsIGFkZGluZyBpdHMgc3ViZmxvdyBJRCB0byB0aGUgcGF0aC5cbiAqXG4gKiBUaGUgY2hlY2twb2ludCBjYXB0dXJlczpcbiAqICAgLSBwYXVzZWRTdGFnZUlkICsgc3ViZmxvd1BhdGg6IHRoZSBwYXVzZWQgc3RhZ2UncyBpZCBhbmQgaXRzIHN1YmZsb3cgcGF0aFxuICogICAtIHNoYXJlZFN0YXRlOiBzY29wZSBhdCB0aGUgcGF1c2UgcG9pbnRcbiAqICAgLSBleGVjdXRpb25UcmVlOiBjb21wbGV0ZWQgc3RhZ2VzIGZvciBCVFMvbmFycmF0aXZlXG4gKiAgIC0gcGF1c2VEYXRhOiBxdWVzdGlvbiwgcmVhc29uLCBvciBtZXRhZGF0YSBmcm9tICRwYXVzZSgpXG4gKlxuICogUmVzdW1lIHJlYnVpbGRzIHRoZSBmbG93Y2hhcnQsIHJlc3RvcmVzIHNjb3BlLCBuYXZpZ2F0ZXMgdG8gdGhlIHBhdXNlZCBzdGFnZSxcbiAqIGluamVjdHMgcmVzdW1lSW5wdXQsIGFuZCBjb250aW51ZXMgdHJhdmVyc2FsLlxuICpcbiAqIFN1cHBvcnRlZCB0b3BvbG9naWVzOiBsaW5lYXIsIHN1YmZsb3cgKGF0IGFueSBkZXB0aCDigJQgbW91bnRlZCBsaW5lYXJseSwgYXMgYVxuICogZGVjaWRlciBvciBzZWxlY3RvciBicmFuY2gsIG9yIGFzIGEgZm9yayBjaGlsZCksIGxvb3AsIG5lc3RlZCBzdWJmbG93IGluXG4gKiBsb29wLCBhbmQgc2V2ZXJhbCBwYXJhbGxlbCBzaWJsaW5ncyBwYXVzaW5nIGluIG9uZSBmYW4tb3V0IChlYWNoIGFza3MgaW5cbiAqIHR1cm4g4oCUIGBGbG93Y2hhcnRDaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgKS5cbiAqXG4gKiBOT1QgcmVzdW1hYmxlIHlldDogYSBwYXVzZSBpbnNpZGUgYSBMQVpZIHN1YmZsb3cgKGBhZGRMYXp5U3ViRmxvd0NoYXJ0KmApIG9yXG4gKiBpbnNpZGUgYW4gYGFkZFBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoLiBUaGVpciBncmFwaHMgYXJlIHJlc29sdmVkIGF0IHJ1biB0aW1lXG4gKiBhbmQgYXJlIG5vdCBpbiB0aGUgY2hhcnQgYSByZXN1bWUgd2Fsa3MsIHNvIGByZXN1bWUoKWAgcmVmdXNlcyB0aGVcbiAqIGNoZWNrcG9pbnQgKFwibm90IGZvdW5kXCIpIGluc3RlYWQgb2YgZ3Vlc3NpbmcuIFBpbm5lZCBpblxuICogdGVzdC9saWIvcGF1c2UvcmVzdW1lLWtub3duLWxpbWl0YXRpb25zLnRlc3QudHMuXG4gKi9cblxuLy8g4pSA4pSAIFBhdXNlU2lnbmFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRoZSBwYXVzZWQgRVhFQ1VUSU9OICg5LjM3LjApOiB0aGUgcnVuIHRoYXQgcGF1c2VkIGFuZCB0aGUgcGF1c2VkIHN0YWdlJ3NcbiAqIHJ1bnRpbWVTdGFnZUlkIGluIGl0LiBSZWNvcmRlZCBvbiB0aGUgY2hlY2twb2ludCAoYW5kIG9uIGVhY2ggcXVldWVkXG4gKiBzaWJsaW5nJ3MgcGVuZGluZyByZWNvcmQpIHNvIGEgcmVzdW1lIGNhbiBMSU5LIHRvIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdXNlZEV4ZWN1dGlvbiB7XG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlZGFjdGlvbiBhIHBhdXNlIGNhcnJpZXMgdG8gdGhlIHJlc3VtZWQgcnVuIOKAlCBOQU1FUyBvbmx5LCBuZXZlciBhIHZhbHVlXG4gKiAodGhlIGNoZWNrcG9pbnQgc3RheXMgcmVhbCk6IHRoZSBrZXlzIG1hcmtlZCBzZWNyZXQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW5cbiAqIChhIHBlci1jYWxsIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAsIGEga2V5IHRoZSBwb2xpY3kgcmVkYWN0ZWQgd2hvbGUsIGFcbiAqIHN1YmZsb3cgbWFwcGVyJ3MgdGFpbnQpIGFuZCB0aGUgZmllbGRzIGEgbWFwcGVyIGhhbmRlZCB0byBhIG5ldyBrZXkuIFJlc3VtZVxuICogc2VlZHMgdGhlIHJlc3VtZWQgcnVuJ3MgcnVsZSB3aXRoIHRoZW0sIHNvIGEgY29weSBtYWRlIGJlZm9yZSB0aGUgcGF1c2UgaXNcbiAqIHN0aWxsIG1hc2tlZCBhZnRlciBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25NYXJrcyB7XG4gIHJlYWRvbmx5IGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogS2V5IOKGkiB0aGUgZmllbGQgcGF0aHMgYSBtYXBwZXIgaGFuZGVkIGl0LiBBYnNlbnQgd2hlbiBub25lLiAqL1xuICByZWFkb25seSBmaWVsZHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+O1xufVxuXG4vKiogVHJ1ZSBmb3IgYSB3ZWxsLWZvcm1lZCB7QGxpbmsgUGF1c2VkRXhlY3V0aW9ufSAodHdvIG5vbi1lbXB0eSBzdHJpbmdzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhdXNlZEV4ZWN1dGlvbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFBhdXNlZEV4ZWN1dGlvbiB7XG4gIGNvbnN0IHYgPSB2YWx1ZSBhcyB7IHJ1bklkPzogdW5rbm93bjsgcnVudGltZVN0YWdlSWQ/OiB1bmtub3duIH0gfCBudWxsIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2Py5ydW5JZCA9PT0gJ3N0cmluZycgJiYgdi5ydW5JZCAhPT0gJycgJiYgdHlwZW9mIHYucnVudGltZVN0YWdlSWQgPT09ICdzdHJpbmcnICYmIHYucnVudGltZVN0YWdlSWQgIT09ICcnXG4gICk7XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IGBzY29wZS4kcGF1c2UoKWAgdG8gc2lnbmFsIHRoYXQgZXhlY3V0aW9uIHNob3VsZCBzdG9wXG4gKiBhbmQgY3JlYXRlIGEgc2VyaWFsaXphYmxlIGNoZWNrcG9pbnQuXG4gKlxuICogQnViYmxlcyB1cCB0aHJvdWdoIFN1YmZsb3dFeGVjdXRvciAod2hpY2ggcHJlcGVuZHMgc3ViZmxvdyBJRCB0byBwYXRoKVxuICogYW5kIGlzIGNhdWdodCBieSBGbG93Y2hhcnRUcmF2ZXJzZXIvRmxvd0NoYXJ0RXhlY3V0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXVzZVNpZ25hbCBleHRlbmRzIEVycm9yIHtcbiAgLyoqIERhdGEgZnJvbSAkcGF1c2UoKSDigJQgcXVlc3Rpb24sIHJlYXNvbiwgbWV0YWRhdGEuICovXG4gIHJlYWRvbmx5IHBhdXNlRGF0YTogdW5rbm93bjtcbiAgLyoqIElEIG9mIHRoZSBzdGFnZSB0aGF0IGNhbGxlZCAkcGF1c2UoKS4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VJZDogc3RyaW5nO1xuICAvKipcbiAgICogSE9XIHRoZSBwYXVzZSB3YXMgcmFpc2VkIOKAlCBgJ2ludGVycnVwdCdgIHdoZW4gYSBzdGFnZSBib2R5IGNhbGxlZFxuICAgKiBgaW50ZXJydXB0KHNjb3BlLCBwYXlsb2FkKWAsIGFic2VudCBmb3IgdGhlIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYFxuICAgKiBleGVjdXRlL3Jlc3VtZSBwYXRoLiBTZXQgYXQgdGhlIHN0YWdlIGJvdW5kYXJ5IChgU3RhZ2VSdW5uZXJgKSwgY2FycmllZFxuICAgKiBvbnRvIHRoZSBjaGVja3BvaW50LCBhbmQgcmVhZCBieSBgcmVzdW1lKClgIHRvIHBpY2sgdGhlIHJlLWVudHJ5OiBhblxuICAgKiBpbnRlcnJ1cHRlZCBzdGFnZSByZS1ydW5zIGl0cyBPV04gZnVuY3Rpb24gZnJvbSB0aGUgdG9wIChzdGFnZXMgYXJlXG4gICAqIGF0b21pYyksIGEgcGF1c2FibGUgc3RhZ2UgcnVucyBpdHMgYHJlc3VtZUZuYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdXNlZEJ5PzogJ2ludGVycnVwdCc7XG4gIC8qKiBQYXRoIHRocm91Z2ggc3ViZmxvd3MgdG8gdGhlIHBhdXNlZCBzdGFnZS4gQnVpbHQgZHVyaW5nIGJ1YmJsZS11cC4gKi9cbiAgcHJpdmF0ZSBfc3ViZmxvd1BhdGg6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBJbnZva2VyIGNvbnRleHQg4oCUIGVucmljaGVkIGR1cmluZyBidWJibGUtdXAgd2hlbiBhIFBhdXNlU2lnbmFsIHBhc3Nlc1xuICAgKiB0aHJvdWdoIGEgZGVjaWRlciwgc2VsZWN0b3IsIG9yIGZvcmsgaGFuZGxlci5cbiAgICpcbiAgICogVGhlIGludm9rZXIgaXMgdGhlIHN0YWdlIHRoYXQgY2FsbGVkIGV4ZWN1dGVOb2RlKCkgb24gdGhlIHBhdXNlZCBjaGlsZC5cbiAgICogQ2FwdHVyZWQgZHVyaW5nIHRyYXZlcnNhbCAobm90IHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgdHJlZSkuIChUaGVcbiAgICogaW52b2tlcidzIGAubmV4dGAgaWQgcm9kZSBiZXNpZGUgaXQgdW50aWwgOS4zOS4wIGFzXG4gICAqIGBjb250aW51YXRpb25TdGFnZUlkYDsgd2hhdCBydW5zIGFmdGVyIGEgcmVzdW1lIGNvbWVzIGZyb20gdGhlIGNoYXJ0XG4gICAqIHNpbmNlIDkuMjguMCwgc28gaXQgaXMgbm8gbG9uZ2VyIGNhcnJpZWQuKVxuICAgKi9cbiAgcHJpdmF0ZSBfaW52b2tlclN0YWdlSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN1YmZsb3cgc2NvcGUgY2FwdHVyZSDigJQgcG9wdWxhdGVkIGR1cmluZyBidWJibGUtdXAgYnlcbiAgICogYFN1YmZsb3dFeGVjdXRvcmAgcmlnaHQgYmVmb3JlIHJlLXRocm93LiBFYWNoIGVudHJ5IGlzIG9uZVxuICAgKiBzdWJmbG93J3MgcHJlLXBhdXNlIHNoYXJlZCBzdGF0ZSwga2V5ZWQgYnkgdGhlIHBhdGgtcHJlZml4ZWRcbiAgICogc3ViZmxvdyBpZCAobWF0Y2hlcyBgc3ViZmxvd1BhdGhgKS5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzLCB0aGUgbmVzdGVkIGBTaGFyZWRNZW1vcnlgIGlzIGdhcmJhZ2UtY29sbGVjdGVkXG4gICAqIGJlZm9yZSB0aGUgY2hlY2twb2ludCBpcyBidWlsdC4gT24gcmVzdW1lLCB0aGUgaW5uZXIgcnVudGltZSBpc1xuICAgKiByZS1jcmVhdGVkIGVtcHR5IGFuZCByZXN1bWUgaGFuZGxlcnMgcmVhZGluZyBwcmUtcGF1c2Ugc2NvcGVcbiAgICogKGUuZy4sIGFuIEFnZW50J3MgYHNjb3BlLmhpc3RvcnlgLCBgc2NvcGUucGF1c2VkVG9vbENhbGxJZGApXG4gICAqIGNyYXNoIHdpdGggXCJYIGlzIG5vdCBpdGVyYWJsZVwiIC8gdW5kZWZpbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge307XG5cbiAgLyoqXG4gICAqIFBhdXNlcyB0aGF0IFBBUkFMTEVMIFNJQkxJTkdTIHJhaXNlZCBpbiB0aGUgc2FtZSBmYW4tb3V0IGFzIHRoaXMgb25lLFxuICAgKiB3YWl0aW5nIHRoZWlyIHR1cm4gKDkuMjguMCkuIFJlY29yZGVkIGJ5IGBDaGlsZHJlbkV4ZWN1dG9yYCB3aGVuIG1vcmVcbiAgICogdGhhbiBvbmUgY2hpbGQgb2YgYSBmb3JrIChvciBtb3JlIHRoYW4gb25lIHNlbGVjdGVkIGJyYW5jaCkgcGF1c2VzOiB0aGVcbiAgICogZmlyc3QgcGF1c2UgaXMgdGhlIG9uZSB0aGF0IGlzIGFza2VkLCB0aGUgb3RoZXJzIHJpZGUgaGVyZSBpbnN0ZWFkIG9mXG4gICAqIGJlaW5nIGRyb3BwZWQuIEVhY2ggcGF0aCBpcyByZWxhdGl2ZSB0byB3aGVyZSB0aGUgc2lnbmFsIGN1cnJlbnRseSBpc1xuICAgKiBhbmQgZ3Jvd3Mgd2l0aCBpdCDigJQgYHByZXBlbmRTdWJmbG93YCBwcmVwZW5kcyB0byBldmVyeSBlbnRyeSB0b28uXG4gICAqL1xuICBwcml2YXRlIF9wZW5kaW5nUGF1c2VzOiBNdXRhYmxlUGVuZGluZ1BhdXNlW10gPSBbXTtcblxuICAvKipcbiAgICogV0hJQ0ggZXhlY3V0aW9uIHBhdXNlZCDigJQgaXRzIHJ1bnRpbWVTdGFnZUlkIHN0YW1wZWQgb25jZSBhdCB0aGUgc3RhZ2VcbiAgICogYm91bmRhcnkgKGBTdGFnZVJ1bm5lcmApLCBpdHMgcnVuIGFkZGVkIHdoZW4gdGhlIGNoZWNrcG9pbnQgaXMgYnVpbHRcbiAgICogKGBjb21wbGV0ZUV4ZWN1dGlvbmApLCBvciBib3RoIGNhcnJpZWQgb3ZlciBmb3IgYSBxdWV1ZWQgc2libGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BhdXNlZEV4ZWN1dGlvbj86IHsgcnVudGltZVN0YWdlSWQ6IHN0cmluZzsgcnVuSWQ/OiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiB1bmtub3duLCBzdGFnZUlkOiBzdHJpbmcsIHBhdXNlZEJ5PzogJ2ludGVycnVwdCcpIHtcbiAgICBzdXBlcignRXhlY3V0aW9uIHBhdXNlZCcpO1xuICAgIHRoaXMubmFtZSA9ICdQYXVzZVNpZ25hbCc7XG4gICAgdGhpcy5wYXVzZURhdGEgPSBkYXRhO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgaWYgKHBhdXNlZEJ5KSB0aGlzLnBhdXNlZEJ5ID0gcGF1c2VkQnk7XG4gICAgdGhpcy5fc3ViZmxvd1BhdGggPSBbXTtcbiAgICAvLyBQYXVzZVNpZ25hbCBpcyBjb250cm9sIGZsb3csIG5vdCBhIHJlYWwgZXJyb3Ig4oCUIHN0YWNrIHRyYWNlIGhhcyBubyBkaWFnbm9zdGljIHZhbHVlLlxuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgfVxuXG4gIGdldCBzdWJmbG93UGF0aCgpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YmZsb3dQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBwYXVzZWQgZXhlY3V0aW9uIChpdHMgcnVuIGFuZCBgW3BhdGgvXXN0YWdlSWQjTmApLCBvbmNlIGJvdGggYXJlIGtub3duLiAqL1xuICBnZXQgcGF1c2VkRXhlY3V0aW9uKCk6IFBhdXNlZEV4ZWN1dGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZSA9IHRoaXMuX3BhdXNlZEV4ZWN1dGlvbjtcbiAgICByZXR1cm4gZT8ucnVuSWQgIT09IHVuZGVmaW5lZCA/IHsgcnVuSWQ6IGUucnVuSWQsIHJ1bnRpbWVTdGFnZUlkOiBlLnJ1bnRpbWVTdGFnZUlkIH0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIHdoaWNoIEVYRUNVVElPTiBwYXVzZWQuIEZpcnN0IHN0YW1wIHdpbnM6IHRoZSBzaWduYWwgYnViYmxlc1xuICAgKiB0aHJvdWdoIG91dGVyIGJvdW5kYXJpZXMgdGhhdCBtdXN0IG5vdCBvdmVyd3JpdGUgaXQuIFRoZSBzdGFnZSBib3VuZGFyeVxuICAgKiBrbm93cyBvbmx5IHRoZSBydW50aW1lU3RhZ2VJZDsgYSBxdWV1ZWQgc2libGluZyByYWlzZWQgYWdhaW4gb24gcmVzdW1lXG4gICAqIGNhcnJpZXMgYm90aCAoaXQgcGF1c2VkIGluIGFuIEVBUkxJRVIgcnVuKS5cbiAgICovXG4gIHN0YW1wRXhlY3V0aW9uKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIHJ1bklkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhdXNlZEV4ZWN1dGlvbiAhPT0gdW5kZWZpbmVkIHx8ICFydW50aW1lU3RhZ2VJZCkgcmV0dXJuO1xuICAgIHRoaXMuX3BhdXNlZEV4ZWN1dGlvbiA9IHsgcnVudGltZVN0YWdlSWQsIC4uLihydW5JZCAhPT0gdW5kZWZpbmVkICYmIHsgcnVuSWQgfSkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYW1lIHRoZSBydW4gZm9yIGV2ZXJ5IHBhdXNlIG9uIHRoaXMgc2lnbmFsIHRoYXQgcGF1c2VkIGluIGl0IOKAlCB0aGlzIG9uZVxuICAgKiBhbmQgaXRzIHF1ZXVlZCBzaWJsaW5ncyB0aGF0IGRvIG5vdCBhbHJlYWR5IGNhcnJ5IGEgcnVuIChhIHNpYmxpbmcgcmFpc2VkXG4gICAqIGFnYWluIG9uIHJlc3VtZSBrZWVwcyB0aGUgcnVuIGl0IHBhdXNlZCBpbikuIENhbGxlZCBvbmNlLCB3aGVuIHRoZVxuICAgKiBjaGVja3BvaW50IGlzIGJ1aWx0LlxuICAgKi9cbiAgY29tcGxldGVFeGVjdXRpb24ocnVuSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wYXVzZWRFeGVjdXRpb24gJiYgdGhpcy5fcGF1c2VkRXhlY3V0aW9uLnJ1bklkID09PSB1bmRlZmluZWQpIHRoaXMuX3BhdXNlZEV4ZWN1dGlvbi5ydW5JZCA9IHJ1bklkO1xuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUGF1c2VzKSB7XG4gICAgICBpZiAocGVuZGluZy5wYXVzZWRFeGVjdXRpb24gJiYgcGVuZGluZy5wYXVzZWRFeGVjdXRpb24ucnVuSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbiA9IHsgcnVudGltZVN0YWdlSWQ6IHBlbmRpbmcucGF1c2VkRXhlY3V0aW9uLnJ1bnRpbWVTdGFnZUlkLCBydW5JZCB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kIGEgc3ViZmxvdyBJRCB0byB0aGUgcGF0aCAoY2FsbGVkIGR1cmluZyBidWJibGUtdXApLiBUaGUgcGVuZGluZ1xuICAgKiBzaWJsaW5nIHBhdXNlcyByaWRlIHRoZSBzYW1lIGJvdW5kYXJ5LCBzbyB0aGVpciBwYXRocyBncm93IHdpdGggaXQuXG4gICAqL1xuICBwcmVwZW5kU3ViZmxvdyhzdWJmbG93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N1YmZsb3dQYXRoLnVuc2hpZnQoc3ViZmxvd0lkKTtcbiAgICBmb3IgKGNvbnN0IHBlbmRpbmcgb2YgdGhpcy5fcGVuZGluZ1BhdXNlcykgcGVuZGluZy5zdWJmbG93UGF0aC51bnNoaWZ0KHN1YmZsb3dJZCk7XG4gIH1cblxuICAvKipcbiAgICogUXVldWUgYSBwYXJhbGxlbCBzaWJsaW5nJ3MgcGF1c2UgYmVoaW5kIHRoaXMgb25lIChpdHMgcGF0aCByZWxhdGl2ZSB0b1xuICAgKiB0aGlzIHNpZ25hbCdzIGN1cnJlbnQgbGV2ZWwpLiBDb3BpZWQgaW46IHRoZSBlbnRyeSBpcyBvd25lZCBieSB0aGVcbiAgICogc2lnbmFsIGZyb20gaGVyZSBvbi5cbiAgICovXG4gIGFkZFBlbmRpbmdQYXVzZShwYXVzZTogUGVuZGluZ1BhdXNlKTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZ1BhdXNlcy5wdXNoKHtcbiAgICAgIHBhdXNlZFN0YWdlSWQ6IHBhdXNlLnBhdXNlZFN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogWy4uLnBhdXNlLnN1YmZsb3dQYXRoXSxcbiAgICAgIHN1YmZsb3dTdGF0ZXM6IHsgLi4ucGF1c2Uuc3ViZmxvd1N0YXRlcyB9LFxuICAgICAgLi4uKHBhdXNlLnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiBwYXVzZS5wYXVzZURhdGEgfSksXG4gICAgICAuLi4ocGF1c2UucGF1c2VkQnkgJiYgeyBwYXVzZWRCeTogcGF1c2UucGF1c2VkQnkgfSksXG4gICAgICAuLi4ocGF1c2UucGF1c2VkRXhlY3V0aW9uICYmXG4gICAgICAgIHR5cGVvZiBwYXVzZS5wYXVzZWRFeGVjdXRpb24ucnVudGltZVN0YWdlSWQgPT09ICdzdHJpbmcnICYmIHsgcGF1c2VkRXhlY3V0aW9uOiB7IC4uLnBhdXNlLnBhdXNlZEV4ZWN1dGlvbiB9IH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcmFsbGVsIHNpYmxpbmdzJyBwYXVzZXMgd2FpdGluZyBiZWhpbmQgdGhpcyBvbmUsIGluIHRoZSBvcmRlciB0aGV5IHdpbGxcbiAgICogYmUgYXNrZWQuIEluIGZsaWdodCwgYSBzaWJsaW5nIHRoYXQgcGF1c2VkIGluIFRISVMgcnVuIGNhcnJpZXMgb25seSBpdHNcbiAgICogcnVudGltZVN0YWdlSWQ7IGBjb21wbGV0ZUV4ZWN1dGlvbmAgKGF0IGNoZWNrcG9pbnQgYnVpbGQpIGFkZHMgdGhlIHJ1bi5cbiAgICovXG4gIGdldCBwZW5kaW5nUGF1c2VzKCk6IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZ1BhdXNlcyBhcyByZWFkb25seSBQZW5kaW5nUGF1c2VbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHBhdXNlIGFzIGEge0BsaW5rIFBlbmRpbmdQYXVzZX0g4oCUIHdoYXQgYENoaWxkcmVuRXhlY3V0b3JgIHF1ZXVlc1xuICAgKiBiZWhpbmQgYSBzaWJsaW5nJ3MgcGF1c2Ugd2hlbiBib3RoIHBhdXNlZCBpbiBvbmUgZmFuLW91dC5cbiAgICovXG4gIHRvUGVuZGluZ1BhdXNlKCk6IFBlbmRpbmdQYXVzZSB7XG4gICAgLy8gSW4gZmxpZ2h0IChzZWUgYHBlbmRpbmdQYXVzZXNgKTogdGhlIHJ1biBpcyBhZGRlZCBhdCBjaGVja3BvaW50IGJ1aWxkLlxuICAgIHJldHVybiA8UGVuZGluZ1BhdXNlPntcbiAgICAgIHBhdXNlZFN0YWdlSWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBbLi4udGhpcy5fc3ViZmxvd1BhdGhdLFxuICAgICAgc3ViZmxvd1N0YXRlczogeyAuLi50aGlzLl9zdWJmbG93U3RhdGVzIH0sXG4gICAgICAuLi4odGhpcy5wYXVzZURhdGEgIT09IHVuZGVmaW5lZCAmJiB7IHBhdXNlRGF0YTogdGhpcy5wYXVzZURhdGEgfSksXG4gICAgICAuLi4odGhpcy5wYXVzZWRCeSAmJiB7IHBhdXNlZEJ5OiB0aGlzLnBhdXNlZEJ5IH0pLFxuICAgICAgLi4uKHRoaXMuX3BhdXNlZEV4ZWN1dGlvbiAmJiB7IHBhdXNlZEV4ZWN1dGlvbjogeyAuLi50aGlzLl9wYXVzZWRFeGVjdXRpb24gfSB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBzdGFnZSB0aGF0IGludm9rZWQgdGhlIHBhdXNlZCBjaGlsZCAoZGVjaWRlciwgc2VsZWN0b3IsIGZvcmspLiAqL1xuICBnZXQgaW52b2tlclN0YWdlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlclN0YWdlSWQ7XG4gIH1cblxuICAvKipcbiAgICogU3RhbXAgdGhlIGludm9rZXIgY29udGV4dCBkdXJpbmcgYnViYmxlLXVwLlxuICAgKiBDYWxsZWQgYnkgZGVjaWRlci9zZWxlY3Rvci9mb3JrIGhhbmRsZXJzIHdoZW4gY2F0Y2hpbmcgYSBjaGlsZCdzIFBhdXNlU2lnbmFsLlxuICAgKiBGaXJzdCBpbnZva2VyIHdpbnMgKGlubmVybW9zdCkg4oCUIHN1YnNlcXVlbnQgY2FsbHMgYXJlIG5vLW9wcy5cbiAgICovXG4gIHNldEludm9rZXIoaW52b2tlclN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW52b2tlclN0YWdlSWQpIHRoaXMuX2ludm9rZXJTdGFnZUlkID0gaW52b2tlclN0YWdlSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZSBhIHN1YmZsb3cncyBpc29sYXRlZCBTaGFyZWRNZW1vcnkgYXQgdGhlIG1vbWVudCBpdHNcbiAgICogdHJhdmVyc2FsIHRocmV3LiBDYWxsZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgb25jZSBwZXIgc3ViZmxvd1xuICAgKiBib3VuZGFyeSBvbiB0aGUgYnViYmxlLXVwIHBhdGguIEVhY2ggY2FwdHVyZSBpcyBrZXllZCBieSB0aGVcbiAgICogcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkICh0aGUgc2FtZSBpZCB1c2VkIGluIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBJbm5lcm1vc3QtZmlyc3Q6IGEgZGVlcCBgU2VxdWVuY2UoQWdlbnQoLi4uKSlgIHBhdXNlIGNhcHR1cmVzIHRoZVxuICAgKiBhZ2VudCdzIHN1YmZsb3cgZmlyc3QsIHRoZW4gaXRzIHBhcmVudCdzLCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdFxuICAgKiBtb3VudC4gVGhlIGZ1bGwgbmVzdCBzdXJ2aXZlcyBpbnRvIGBjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXNgLlxuICAgKi9cbiAgY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQ6IHN0cmluZywgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgLy8gRGVmZW5zaXZlIHNoYWxsb3cgY2xvbmUgc28gbGF0ZXIgbXV0YXRpb25zIG9uIHRoZSBzb3VyY2UgZG9uJ3RcbiAgICAvLyBibGVlZCBpbnRvIHRoZSBjYXB0dXJlZCBzbmFwc2hvdC4gRGVlcCBjbG9uaW5nIGlzIHRoZSBjb25zdW1lcidzXG4gICAgLy8gcmVzcG9uc2liaWxpdHkgKHRoZSByZXN1bWUgdGFyZ2V0IG1heSBub3QgZXZlbiBiZSBvbiB0aGlzXG4gICAgLy8gcHJvY2Vzcyk7IFNoYXJlZE1lbW9yeSB2YWx1ZXMgYXJlIGNvbnZlbnRpb25hbGx5IEpTT04tZnJpZW5kbHkuXG4gICAgdGhpcy5fc3ViZmxvd1N0YXRlc1tzdWJmbG93SWRdID0geyAuLi5zdGF0ZSB9O1xuICB9XG5cbiAgLyoqIENhcHR1cmVkIHN1YmZsb3cgc2NvcGVzIChyZWFkLW9ubHkgdmlldykuICovXG4gIGdldCBzdWJmbG93U3RhdGVzKCk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJmbG93U3RhdGVzO1xuICB9XG59XG5cbi8vIOKUgOKUgCBQZW5kaW5nUGF1c2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQSBwYXVzZSBhIFBBUkFMTEVMIFNJQkxJTkcgb2YgdGhlIHBhdXNlZCBzdGFnZSByYWlzZWQgaW4gdGhlIHNhbWUgZmFuLW91dCDigJRcbiAqIHR3byBjaGlsZHJlbiBvZiBvbmUgZm9yayAob3IgdHdvIHNlbGVjdGVkIGJyYW5jaGVzIG9mIG9uZSBzZWxlY3RvcikgdGhhdFxuICogYm90aCBwYXVzZWQgKDkuMjguMCkuIE9ubHkgb25lIHBhdXNlIGlzIGFza2VkIGF0IGEgdGltZTogdGhlIGNoZWNrcG9pbnQnc1xuICogb3duIChgcGF1c2VkU3RhZ2VJZGApLCB0aGVuIGVhY2ggb2YgdGhlc2UgaW4gdHVybiwgd2l0aCB0aGUgZmFuLW91dCdzIGpvaW5cbiAqIHJ1bm5pbmcgb25seSBvbmNlIGV2ZXJ5IGNoaWxkIGlzIGRvbmUuXG4gKlxuICogRXZlcnl0aGluZyBuZWVkZWQgdG8gcmFpc2UgdGhlIHNpYmxpbmcncyBwYXVzZSBhZ2FpbiBsYXRlciBXSVRIT1VUIHJlLXJ1bm5pbmdcbiAqIHRoZSBzaWJsaW5nOiBpdHMgc3RhZ2UsIGl0cyBwYXRoLCBpdHMgY2FwdHVyZWQgc3ViZmxvdyBzdGF0ZSwgaXRzIHF1ZXN0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGZvcmsgd2hvc2UgdHdvIGNoaWxkcmVuIGJvdGggYXNrOiB0aGUgZmlyc3QgY2hlY2twb2ludCBhc2tzIGMxIGFuZFxuICogLy8gY2FycmllcyBjMidzIHBhdXNlOyByZXN1bWluZyBpdCBmaW5pc2hlcyBjMSwgdGhlbiBwYXVzZXMgd2l0aCBjMidzXG4gKiAvLyBxdWVzdGlvbjsgcmVzdW1pbmcgVEhBVCBmaW5pc2hlcyBjMiBhbmQgcnVucyB0aGUgam9pbi5cbiAqIGNvbnN0IGNwID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAqIGNwLnBhdXNlZFN0YWdlSWQ7ICAgICAgICAgICAgICAgICAgLy8gJ2MxL2FzaydcbiAqIGNwLnBlbmRpbmdQYXVzZXM/LlswXS5wYXVzZWRTdGFnZUlkOyAvLyAnYzIvYXNrJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ1BhdXNlIHtcbiAgLyoqIFRoZSBzaWJsaW5nJ3MgcGF1c2VkIHN0YWdlIChwYXRoLXByZWZpeGVkIGlkLCBhcyBgcGF1c2VkU3RhZ2VJZGApLiAqL1xuICByZWFkb25seSBwYXVzZWRTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRocm91Z2ggc3ViZmxvd3MgdG8gdGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UgKGFzIGBzdWJmbG93UGF0aGApLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgc2libGluZydzIG93biBzdWJmbG93IGNhcHR1cmVzIOKAlCB0aGUgc3ViZmxvd3Mgb24gSVRTIHBhdGggYmVsb3cgdGhlXG4gICAqIGZhbi1vdXQuIFRoZSBzdWJmbG93cyBhYm92ZSB0aGUgZmFuLW91dCBhcmUgc2hhcmVkIHdpdGggdGhlIGNoZWNrcG9pbnQnc1xuICAgKiBvd24gcGF1c2UgYW5kIGFyZSBjYXB0dXJlZCBhZ2FpbiB3aGVuIHRoaXMgcGF1c2UgaXMgcmFpc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogVGhlIHNpYmxpbmcncyBxdWVzdGlvbiAoYXMgYHBhdXNlRGF0YWApLiAqL1xuICByZWFkb25seSBwYXVzZURhdGE/OiB1bmtub3duO1xuICAvKiogSG93IHRoZSBzaWJsaW5nIHBhdXNlZCAoYXMgYHBhdXNlZEJ5YCkuICovXG4gIHJlYWRvbmx5IHBhdXNlZEJ5PzogJ2ludGVycnVwdCc7XG4gIC8qKiBXaGljaCBleGVjdXRpb24gdGhlIHNpYmxpbmcgcGF1c2VkIGluIChhcyBgcGF1c2VkRXhlY3V0aW9uYCwgOS4zNy4wKSDigJQga2VwdCBzbyBpdHMgb3duIHJlc3VtZSBsaW5rcyB0byBpdC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkRXhlY3V0aW9uPzogUGF1c2VkRXhlY3V0aW9uO1xufVxuXG4vKiogQSBwZW5kaW5nIHBhdXNlIHdob3NlIHBhdGggc3RpbGwgZ3Jvd3MgYXMgaXRzIHNpZ25hbCBidWJibGVzIHVwIChpbnRlcm5hbCkuICovXG4vKipcbiAqIFRoZSBzaWduYWwncyBvd24gY29weSBvZiBhIHBlbmRpbmcgcGF1c2UuIEl0cyBgcGF1c2VkRXhlY3V0aW9uYCBtYXkgc3RpbGxcbiAqIGxhY2sgdGhlIHJ1biAoYSBzaWJsaW5nIHRoYXQgcGF1c2VkIGluIFRISVMgcnVuKSB1bnRpbCBgY29tcGxldGVFeGVjdXRpb25gLlxuICovXG50eXBlIE11dGFibGVQZW5kaW5nUGF1c2UgPSBPbWl0PFBlbmRpbmdQYXVzZSwgJ3N1YmZsb3dQYXRoJyB8ICdwYXVzZWRFeGVjdXRpb24nPiAmIHtcbiAgc3ViZmxvd1BhdGg6IHN0cmluZ1tdO1xuICBwYXVzZWRFeGVjdXRpb24/OiB7IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7IHJ1bklkPzogc3RyaW5nIH07XG59O1xuXG4vLyDilIDilIAgUGF1c2VSZXN1bHQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmV0dXJuZWQgYnkgYSBwYXVzYWJsZSBzdGFnZSdzIGV4ZWN1dGUvcmVzdW1lIGZ1bmN0aW9uIHRvIHNpZ25hbCBwYXVzZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gKiAgIHNjb3BlLm9yZGVySWQgPSAnMTIzJztcbiAqICAgcmV0dXJuIHsgcGF1c2U6IHRydWUsIGRhdGE6IHsgcXVlc3Rpb246ICdBcHByb3ZlIG9yZGVyIDEyMz8nIH0gfTtcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdXNlUmVzdWx0IHtcbiAgcmVhZG9ubHkgcGF1c2U6IHRydWU7XG4gIC8qKiBEYXRhIHRvIGluY2x1ZGUgaW4gdGhlIGNoZWNrcG9pbnQg4oCUIHF1ZXN0aW9uLCByZWFzb24sIG1ldGFkYXRhLiAqL1xuICByZWFkb25seSBkYXRhPzogdW5rbm93bjtcbn1cblxuLy8g4pSA4pSAIEZsb3djaGFydENoZWNrcG9pbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogU2VyaWFsaXphYmxlIGNoZWNrcG9pbnQg4oCUIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlc3VtZSBhIHBhdXNlZCBmbG93Y2hhcnQuXG4gKlxuICogSlNPTi1zYWZlOiBubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcywgbm8gU0RLIGNsaWVudHMuXG4gKiBTdG9yZSBhbnl3aGVyZTogUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2UsIGEgZmlsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gU2F2ZVxuICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKTsgLy8gYWZ0ZXIgcGF1c2VcbiAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAqXG4gKiAvLyBSZXN1bWUgKGhvdXJzIGxhdGVyLCBwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyKVxuICogY29uc3QgY2hlY2twb2ludCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICogYXdhaXQgZXhlY3V0b3IucmVzdW1lKGNoZWNrcG9pbnQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuLyoqXG4gKiBTZXJpYWxpemFibGUgY2hlY2twb2ludCDigJQgZXZlcnl0aGluZyBuZWVkZWQgdG8gcmVzdW1lIGEgcGF1c2VkIGZsb3djaGFydC5cbiAqXG4gKiBUaGUgZXhlY3V0aW9uIHRyZWUgSVMgdGhlIHRyYXZlcnNlZCBwYXRoLiBUaGUgbGVhZiBub2RlIHdpdGggc3RhdHVzICdwYXVzZWQnXG4gKiBJUyB0aGUgY3Vyc29yLiBObyBzZXBhcmF0ZSBwYXRoIGFycmF5IG5lZWRlZCDigJQgdGhlIHRyZWUgc3RydWN0dXJlIGNhcHR1cmVzXG4gKiB0aGUgZnVsbCBuZXN0aW5nIChpbmNsdWRpbmcgc3ViZmxvd3MpLlxuICpcbiAqIEpTT04tc2FmZTogbm8gZnVuY3Rpb25zLCBubyBjbGFzcyBpbnN0YW5jZXMsIG5vIFNESyBjbGllbnRzLlxuICogU3RvcmUgYW55d2hlcmU6IFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdlLCBhIGZpbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCk7IC8vIGFmdGVyIHBhdXNlXG4gKiBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gKlxuICogLy8gUmVzdW1lIChob3VycyBsYXRlciwgcG9zc2libHkgZGlmZmVyZW50IHNlcnZlcilcbiAqIGNvbnN0IGNoZWNrcG9pbnQgPSBKU09OLnBhcnNlKGF3YWl0IHJlZGlzLmdldChgc2Vzc2lvbjoke2lkfWApKTtcbiAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShjaGVja3BvaW50LCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd2NoYXJ0Q2hlY2twb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgY2hlY2twb2ludCBGT1JNQVQgKDkuMzkuMCk6IGAxYC4gQWJzZW50IG9uIGEgY2hlY2twb2ludCB3cml0dGVuXG4gICAqIGJlZm9yZSA5LjM5LjAsIHdoaWNoIGByZXN1bWUoKWAgcmVhZHMgdGhyb3VnaCB0aGUgb25lIHVwY2FzdGVyXG4gICAqIChgcGF1c2UvcmVjb3JkLnRzIMK3IHVwY2FzdENoZWNrcG9pbnRgKSDigJQgaXQgZHJvcHMgdGhlIGxlZ2FjeVxuICAgKiBgY29udGludWF0aW9uU3RhZ2VJZGAgKGEgcmVjb3JkIG5vIHJlc3VtZSBoYXMgcmVhZCBzaW5jZSA5LjI4LjApLiBBXG4gICAqIHZlcnNpb24gdGhpcyByZWxlYXNlIGRvZXMgbm90IGtub3cgaXMgcmVmdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNoZWNrcG9pbnRWZXJzaW9uPzogMTtcblxuICAvKiogU2NvcGUgc3RhdGUgYXQgdGhlIHBhdXNlIHBvaW50IOKAlCBhbGwgc2hhcmVkIG1lbW9yeSBrZXkvdmFsdWVzLiAqL1xuICByZWFkb25seSBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4ZWN1dGlvbiB0cmVlIOKAlCB0aGUgdHJhdmVyc2VkIHBhdGguIFRoZSBsZWFmIHdpdGggc3RhdHVzICdwYXVzZWQnIGlzIHRoZSBjdXJzb3IuXG4gICAqICBDb250YWlucyBzdWJmbG93IG5lc3RpbmcuIFVzZWQgZm9yIEJUUyB2aXN1YWxpemF0aW9uIGFuZCB0byBmaW5kIHRoZSByZXN1bWUgcG9pbnQuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblRyZWU6IHVua25vd247XG5cbiAgLyoqIElEIG9mIHRoZSBzdGFnZSB0aGF0IHBhdXNlZC4gVXNlZCBieSByZXN1bWUoKSB0byBmaW5kIHRoZSBub2RlIGluIHRoZSBncmFwaC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkU3RhZ2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF1c2VkIEVYRUNVVElPTiAoOS4zNy4wKTogdGhlIHJ1biB0aGF0IHBhdXNlZCBhbmQgdGhlIHBhdXNlZCBzdGFnZSdzXG4gICAqIHJ1bnRpbWVTdGFnZUlkIGluIGl0ICh0aGUgaWQgaXRzIGBvblBhdXNlYCBldmVudCBhbmQgaXRzIGNvbW1pdCBjYXJyeSkuXG4gICAqIFJlYWQgYnkgYHJlc3VtZSgpYCBpbnRvIHRoZSBgb25SZXN1bWVgIGV2ZW50J3MgYHRyYXZlcnNhbENvbnRleHQucmVzdW1lZEZyb21gXG4gICAqIGxpbmsg4oCUIG5ldmVyIHVzZWQgdG8gcGxhbiB0aGUgcmUtZW50cnkuIEFic2VudCBvbiBhbiBvbGRlciBjaGVja3BvaW50LFxuICAgKiB3aGljaCB0aGVuIHJlc3VtZXMgd2l0aG91dCBhIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBwYXVzZWRFeGVjdXRpb24/OiBQYXVzZWRFeGVjdXRpb247XG5cbiAgLyoqIFBhdGggdGhyb3VnaCBzdWJmbG93cyB0byB0aGUgcGF1c2VkIHN0YWdlIChlLmcuLCBbJ3NmLXBheW1lbnQnLCAnc2YtdmFsaWRhdGlvbiddKS5cbiAgICogIEVtcHR5IGFycmF5IHdoZW4gcGF1c2VkIGF0IHRoZSB0b3AgbGV2ZWwuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogRGF0YSBmcm9tICRwYXVzZSgpIOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgcGF1c2VEYXRhPzogdW5rbm93bjtcblxuICAvKipcbiAgICogSE9XIHRoZSBwYXVzZSB3YXMgcmFpc2VkLiBgJ2ludGVycnVwdCdgIG1lYW5zIGEgc3RhZ2UgYm9keSBjYWxsZWRcbiAgICogYGludGVycnVwdChzY29wZSwgeyByZWFzb24sIGV4cGVjdHM/IH0pYCBhbmQgYHBhdXNlRGF0YWAgSVMgdGhhdCBwYXlsb2FkO1xuICAgKiBhYnNlbnQgbWVhbnMgdGhlIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCBleGVjdXRlL3Jlc3VtZSBwYXRoIChldmVyeVxuICAgKiBjaGVja3BvaW50IHdyaXR0ZW4gYmVmb3JlIDkuMTQuMCBvbWl0cyBpdCwgd2hpY2ggaXMgZXhhY3RseSByaWdodCkuXG4gICAqXG4gICAqIGByZXN1bWUoKWAgcmVhZHMgdGhpcyB0byBwaWNrIHRoZSByZS1lbnRyeSwgYW5kIHRoZSB0d28gZGlmZmVyIGJ5IGxhdzpcbiAgICogYW4gaW50ZXJydXB0ZWQgc3RhZ2UgUkUtUlVOUyBJVFMgT1dOIEZVTkNUSU9OIEZST00gVEhFIFRPUCAoc3RhZ2VzIGFyZVxuICAgKiBhdG9taWMg4oCUIHRoZSBhbnN3ZXIgY29tZXMgYmFjayBvdXQgb2YgdGhlIGBpbnRlcnJ1cHQoKWAgY2FsbCksIHdoaWxlIGFcbiAgICogcGF1c2FibGUgc3RhZ2UgcnVucyBpdHMgc2VwYXJhdGUgYHJlc3VtZUZuYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdXNlZEJ5PzogJ2ludGVycnVwdCc7XG5cbiAgLyoqIFN1YmZsb3cgcmVzdWx0cyBjb2xsZWN0ZWQgYmVmb3JlIHRoZSBwYXVzZS4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBvbmUgZW50cnkgcGVyIHN1YmZsb3cgYm91bmRhcnkgb24gdGhlIHBhdGhcbiAgICogdG8gdGhlIHBhdXNlZCBzdGFnZS4gS2V5ZWQgYnkgcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkIChtYXRjaGVzXG4gICAqIGBzdWJmbG93UGF0aGAgZW50cmllcykuIEVhY2ggdmFsdWUgaXMgdGhlIHN1YmZsb3cncyBwcmUtcGF1c2VcbiAgICogc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiBBbHdheXMgcHJlc2VudCAoZW1wdHkgYHt9YCBmb3Igcm9vdC1sZXZlbCBwYXVzZXMgd2hlcmUgbm8gc3ViZmxvd3NcbiAgICogd2VyZSBlbnRlcmVkKS4gT24gcmVzdW1lLCBgU3ViZmxvd0V4ZWN1dG9yYCBzZWVkcyBlYWNoIG5lc3RlZCBydW50aW1lXG4gICAqIG9uIHRoZSBwYXRoIGZyb20gdGhpcyBtYXAg4oCUIE9OQ0UsIG9uIGl0cyBmaXJzdCBlbnRyeSwgaW4gcGxhY2Ugb2YgdGhlXG4gICAqIGlucHV0TWFwcGVyJ3MgdmFsdWVzICh0aGUgbWFwcGVyIHN0aWxsIHJ1bnMsIGZvciB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICogYXJncykg4oCUIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgcHJlLXBhdXNlIHNjb3BlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIEFORFxuICAgKiBjcm9zcy1leGVjdXRvciByZXN0YXJ0cy4gT25seSB0aGUgc3ViZmxvd3MgT04gYHN1YmZsb3dQYXRoYCByZWFkIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGF0IHRoZSBtb21lbnQgb2YgcGF1c2Ug4oCUIHRoZSBudW1iZXIgb2Ygc3RhZ2VzXG4gICAqIGV4ZWN1dGVkIHNvIGZhciB0aGlzIHJ1bi4gUmVzdW1lIHNlZWRzIGl0IHNvIHBvc3QtcmVzdW1lIGBydW50aW1lU3RhZ2VJZGBzXG4gICAqIChgc3RhZ2VJZCNleGVjdXRpb25JbmRleGApIGtlZXAgY2xpbWJpbmcgYW5kIG5ldmVyIGNvbGxpZGUgd2l0aCBwcmUtcGF1c2VcbiAgICogb25lcywgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUgZXZlbnQtY29ycmVsYXRpb24gbW9kZWwgcmVzdHMgb24uXG4gICAqXG4gICAqIE9wdGlvbmFsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhIGNoZWNrcG9pbnQgcGVyc2lzdGVkIGJlZm9yZSB0aGlzXG4gICAqIGZpZWxkIGV4aXN0ZWQgKG9sZGVyIFJlZGlzL1Bvc3RncmVzIHJvd3MpIHN0aWxsIHZhbGlkYXRlcyBhbmQgcmVzdW1lcyB3aXRoXG4gICAqIHRoZSBwcmV2aW91cyAoY291bnRlci1yZXN0YXJ0aW5nKSBiZWhhdmlvci5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItYHN0YWdlSWRgIGxvb3AgdmlzaXQgY291bnRzIGF0IHRoZSBtb21lbnQgb2YgcGF1c2UuIFJlc3VtZSBzZWVkcyB0aGVtXG4gICAqIHNvIGBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb25gIHN0YXlzIGNvbnRpbnVvdXMgYWNyb3NzIHRoZSBwYXVzZSAoYVxuICAgKiBtaWQtbG9vcCByZXN1bWUga2VlcHMgY291bnRpbmcgdXAsIG5vdCByZXN0YXJ0aW5nIGF0IDApIGFuZCB0aGVcbiAgICogQ29udGludWF0aW9uUmVzb2x2ZXIgaXRlcmF0aW9uIGJ1ZGdldCBpcyBub3Qgc2lsZW50bHkgcmVmaWxsZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsIGZvciB0aGUgc2FtZSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHJlYXNvbiBhcyBgZXhlY3V0aW9uQ291bnRgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaXRDb3VudHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcblxuICAvKiogU3RhZ2UgdGhhdCBpbnZva2VkIHRoZSBwYXVzZWQgY2hpbGQgKGRlY2lkZXIsIHNlbGVjdG9yLCBmb3JrKS4gQWJzZW50IGZvciBsaW5lYXIgcGF1c2VzLiAqL1xuICByZWFkb25seSBpbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF1c2VzIHJhaXNlZCBieSBQQVJBTExFTCBTSUJMSU5HUyBvZiB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBzYW1lXG4gICAqIGZhbi1vdXQsIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKSDigJQgc2VlIHtAbGluayBQZW5kaW5nUGF1c2V9LiBBYnNlbnRcbiAgICogd2hlbiBvbmx5IG9uZSBjaGlsZCBwYXVzZWQgKGV2ZXJ5IGNoZWNrcG9pbnQgYmVmb3JlIDkuMjguMCBvbWl0cyBpdCwgYW5kXG4gICAqIHJlc3VtZXMgZXhhY3RseSBhcyBiZWZvcmUpLiBSZXN1bWluZyB0aGlzIGNoZWNrcG9pbnQgZmluaXNoZXMgdGhlIHBhdXNlZFxuICAgKiBzdGFnZSdzIGNoaWxkLCB0aGVuIHBhdXNlcyBhZ2FpbiB3aXRoIHRoZSBmaXJzdCBvZiB0aGVzZTsgdGhlIGZhbi1vdXQnc1xuICAgKiBqb2luIHJ1bnMgb25jZSBldmVyeSBjaGlsZCBpcyBkb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIG1hcmtzIG9mIHRoZSBwYXVzZWQgcnVuIOKAlCBOQU1FUyBvbmx5IChzZWVcbiAgICoge0BsaW5rIFJlZGFjdGlvbk1hcmtzfSkuIEFic2VudCB3aGVuIHRoZSBydW4gbWFya2VkIG5vdGhpbmcgKG5vIHBvbGljeVxuICAgKiBhbmQgbm8gcGVyLWNhbGwgbWFyaywgb3IgYW4gb2xkZXIgY2hlY2twb2ludCk6IHRoZSByZXN1bWVkIHJ1biB0aGVuIHN0YXJ0c1xuICAgKiBmcm9tIGl0cyBwb2xpY3kgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSByZWRhY3Rpb25NYXJrcz86IFJlZGFjdGlvbk1hcmtzO1xuXG4gIC8qKiBUaW1lc3RhbXAgb2Ygd2hlbiB0aGUgcGF1c2Ugb2NjdXJyZWQuICovXG4gIHJlYWRvbmx5IHBhdXNlZEF0OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgCBQYXVzYWJsZUhhbmRsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSGFuZGxlciBmb3IgYSBwYXVzYWJsZSBzdGFnZSDigJQgaGFzIHR3byBwaGFzZXM6IGV4ZWN1dGUgYW5kIHJlc3VtZS5cbiAqXG4gKiBgZXhlY3V0ZWAgcnVucyB0aGUgZmlyc3QgdGltZS4gUmV0dXJuIGFueSBub24tdm9pZCB2YWx1ZSB0byBwYXVzZSAodGhhdCB2YWx1ZVxuICogYmVjb21lcyB0aGUgY2hlY2twb2ludCdzIGBwYXVzZURhdGFgKTsgcmV0dXJuIHZvaWQvdW5kZWZpbmVkIHRvIGNvbnRpbnVlIG5vcm1hbGx5LlxuICogYHJlc3VtZWAgcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZC4gSXQgcmVjZWl2ZXMgdGhlIHJlc3VtZSBpbnB1dC5cbiAqXG4gKiBCb3RoIHBoYXNlcyByZWNlaXZlIHRoZSBzYW1lIHNjb3BlLiBBZnRlciBleGVjdXRlIHBhdXNlcywgdGhlIHNjb3BlIHN0YXRlXG4gKiBpcyBwcmVzZXJ2ZWQgaW4gdGhlIGNoZWNrcG9pbnQuIE9uIHJlc3VtZSwgdGhlIHNjb3BlIGlzIHJlc3RvcmVkIGJlZm9yZVxuICogY2FsbGluZyByZXN1bWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gKiAgIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICogICAgIHNjb3BlLm9yZGVySWQgPSAnMTIzJztcbiAqICAgICBzY29wZS5hbW91bnQgPSAyOTk7XG4gKiAgICAgcmV0dXJuIHsgcXVlc3Rpb246IGBBcHByb3ZlICQke3Njb3BlLmFtb3VudH0gcmVmdW5kP2AgfTtcbiAqICAgfSxcbiAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gKiAgICAgc2NvcGUuYXBwcm92ZWQgPSBpbnB1dC5hcHByb3ZlZDtcbiAqICAgICBzY29wZS5hcHByb3ZlciA9IGlucHV0LmFwcHJvdmVyO1xuICogICB9LFxuICogfSwgJ2FwcHJvdmUtb3JkZXInLCAnTWFuYWdlciBhcHByb3ZhbCBnYXRlJylcbiAqXG4gKiAvLyBMYXRlciDigJQgcmVzdW1lIHdpdGggaHVtYW4ncyBhbnN3ZXJcbiAqIGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShjaGVja3BvaW50LCB7IGFwcHJvdmVkOiB0cnVlLCBhcHByb3ZlcjogJ0phbmUnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2FibGVIYW5kbGVyPFRTY29wZSA9IGFueSwgVElucHV0ID0gdW5rbm93biwgVFBhdXNlRGF0YSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIEZpcnN0LXJ1biBwaGFzZS4gUmV0dXJuIGRhdGEgdG8gcGF1c2UsIG9yIHZvaWQvdW5kZWZpbmVkIHRvIGNvbnRpbnVlIG5vcm1hbGx5LlxuICAgKlxuICAgKiBBbnkgbm9uLXZvaWQgcmV0dXJuIHZhbHVlIGJlY29tZXMgdGhlIGBwYXVzZURhdGFgIGluIHRoZSBjaGVja3BvaW50LlxuICAgKiBUaGUgY29uc3VtZXIgZGVmaW5lcyB0aGUgYFRQYXVzZURhdGFgIHR5cGUg4oCUIHRoZSBGRSB1c2VzIGl0IHRvIHJlbmRlclxuICAgKiB0aGUgcmlnaHQgVUkgKGZvcm0gZmllbGRzLCBhcHByb3ZhbCBidXR0b25zLCBldGMuKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBUUGF1c2VEYXRhID0geyBxdWVzdGlvbjogc3RyaW5nOyByaXNrTGV2ZWw6IHN0cmluZyB9XG4gICAqIGNvbnN0IGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxNeVN0YXRlLCB7IGFwcHJvdmVkOiBib29sZWFuIH0sIHsgcXVlc3Rpb246IHN0cmluZzsgcmlza0xldmVsOiBzdHJpbmcgfT4gPSB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICByZXR1cm4geyBxdWVzdGlvbjogYEFwcHJvdmUgb3JkZXIgJHtzY29wZS5vcmRlcklkfT9gLCByaXNrTGV2ZWw6ICdoaWdoJyB9O1xuICAgKiAgIH0sXG4gICAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gICAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICAgKiAgIH0sXG4gICAqIH07XG4gICAqIGBgYFxuICAgKi9cbiAgZXhlY3V0ZTogKHNjb3BlOiBUU2NvcGUpID0+IFByb21pc2U8VFBhdXNlRGF0YSB8IHZvaWQ+IHwgVFBhdXNlRGF0YSB8IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXN1bWUgcGhhc2UuIENhbGxlZCB3aXRoIHRoZSByZXN1bWUgaW5wdXQgd2hlbiBleGVjdXRpb24gY29udGludWVzLlxuICAgKlxuICAgKiBUaGUgc2NvcGUgaXMgcmVzdG9yZWQgZnJvbSB0aGUgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAuIFdyaXRlcyBkdXJpbmdcbiAgICogYHJlc3VtZWAgYXJlIGNvbW1pdHRlZCBhbmQgdmlzaWJsZSB0byBzdWJzZXF1ZW50IHN0YWdlcy5cbiAgICovXG4gIHJlc3VtZTogKHNjb3BlOiBUU2NvcGUsIGlucHV0OiBUSW5wdXQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufVxuXG4vLyDilIDilIAgVHlwZSBndWFyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBQYXVzZVJlc3VsdCAoc3RhZ2Ugd2FudHMgdG8gcGF1c2UpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VSZXN1bHQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQYXVzZVJlc3VsdCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBQYXVzZVJlc3VsdCkucGF1c2UgPT09IHRydWU7XG59XG5cbi8qKiBDaGVjayBpZiBhbiBlcnJvciBpcyBhIFBhdXNlU2lnbmFsLiBVc2VzIGluc3RhbmNlb2YgKyBuYW1lIGJyYW5kIGZhbGxiYWNrIGZvciBjcm9zcy1yZWFsbSBzYWZldHkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXVzZVNpZ25hbChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIFBhdXNlU2lnbmFsIHtcbiAgLy8gVG90YWw6IGEgUHJveHkgd2hvc2UgYGdldFByb3RvdHlwZU9mYCB0cmFwIHRocm93cyAob3IgYSByZXZva2VkIFByb3h5KVxuICAvLyBpcyBub3QgYSBzaWduYWwg4oCUIHRoZSBlbmdpbmUncyBjYXRjaCBibG9ja3MgYXNrIHRoaXMgZmlyc3QsIGFuZCBtdXN0XG4gIC8vIG5vdCB0cmFkZSB0aGUgc3RhZ2UncyB0aHJvd24gdmFsdWUgZm9yIHRoZSB0cmFwJ3MgZXJyb3IuXG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgUGF1c2VTaWduYWwgfHxcbiAgICAgIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgIGVycm9yLm5hbWUgPT09ICdQYXVzZVNpZ25hbCcgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAncGF1c2VEYXRhJykgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAnc3RhZ2VJZCcpKVxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
247
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3BhdXNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQTRCSCw4RUFBOEU7QUFDOUUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsTUFBTSxDQUFDLEdBQUcsS0FBeUUsQ0FBQztJQUNwRixPQUFPLENBQ0wsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxPQUFPLENBQUMsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxjQUFjLEtBQUssRUFBRSxDQUNsSCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNwQyx1REFBdUQ7SUFDOUMsU0FBUyxDQUFVO0lBQzVCLDRDQUE0QztJQUNuQyxPQUFPLENBQVM7SUFDekI7Ozs7Ozs7T0FPRztJQUNNLFFBQVEsQ0FBZTtJQUNoQyx5RUFBeUU7SUFDakUsWUFBWSxDQUFXO0lBRS9COzs7Ozs7Ozs7T0FTRztJQUNLLGVBQWUsQ0FBVTtJQUVqQzs7Ozs7Ozs7Ozs7T0FXRztJQUNLLGNBQWMsR0FBNEMsRUFBRSxDQUFDO0lBRXJFOzs7Ozs7O09BT0c7SUFDSyxjQUFjLEdBQTBCLEVBQUUsQ0FBQztJQUVuRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQThDO0lBRXRFLFlBQVksSUFBYSxFQUFFLE9BQWUsRUFBRSxRQUFzQjtRQUNoRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2Qix1RkFBdUY7UUFDdkYsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLElBQUksZUFBZTtRQUNqQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDaEMsT0FBTyxDQUFDLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLGNBQXNCLEVBQUUsS0FBYztRQUNuRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENBQUMsS0FBYTtRQUM3QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM1RyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLElBQUksT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNFLE9BQU8sQ0FBQyxlQUFlLEdBQUcsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDOUYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLFNBQWlCO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxLQUFtQjtRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN2QixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7WUFDbEMsV0FBVyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1lBQ25DLGFBQWEsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUN6QyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BFLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWU7Z0JBQ3ZCLE9BQU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEtBQUssUUFBUSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztTQUNqSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQXlDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWix5RUFBeUU7UUFDekUsT0FBcUI7WUFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQzNCLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUNuQyxhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsRSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztTQUNoRixDQUFDO0lBQ0osQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLGNBQXNCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLEtBQThCO1FBQ25FLGlFQUFpRTtRQUNqRSxtRUFBbUU7UUFDbkUsNERBQTREO1FBQzVELGtFQUFrRTtRQUNsRSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUE2UUQsK0RBQStEO0FBRS9ELGdFQUFnRTtBQUNoRSxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSyxLQUFxQixDQUFDLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDOUYsQ0FBQztBQUVELHdHQUF3RztBQUN4RyxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMseUVBQXlFO0lBQ3pFLHVFQUF1RTtJQUN2RSwyREFBMkQ7SUFDM0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUNMLEtBQUssWUFBWSxXQUFXO1lBQzVCLENBQUMsS0FBSyxZQUFZLEtBQUs7Z0JBQ3JCLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYTtnQkFDNUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7Z0JBQ3hELE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXVzZS9SZXN1bWUg4oCUIHNlcmlhbGl6YWJsZSBjaGVja3BvaW50IGZvciBsb25nLXJ1bm5pbmcgb3IgaHVtYW4taW4tdGhlLWxvb3AgZmxvd3MuXG4gKlxuICogQSBzdGFnZSBzaWduYWxzIHBhdXNlIGJ5IGNhbGxpbmcgYHNjb3BlLiRwYXVzZShkYXRhKWAgd2hpY2ggdGhyb3dzIGEgUGF1c2VTaWduYWwuXG4gKiBUaGUgc2lnbmFsIGJ1YmJsZXMgdXAgdGhyb3VnaCBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlciDihpIgRmxvd0NoYXJ0RXhlY3V0b3IsXG4gKiBlYWNoIGxldmVsIGFkZGluZyBpdHMgc3ViZmxvdyBJRCB0byB0aGUgcGF0aC5cbiAqXG4gKiBUaGUgY2hlY2twb2ludCBjYXB0dXJlcyB3aGF0IGEgcmVzdW1lIHJlYWRzLCBhbmQgdGhlIHBhdXNlJ3Mgb3duIHJlY29yZCDigJRcbiAqIG5ldmVyIHRoZSBydW4ncyBoaXN0b3J5ICh0aGF0IGlzIGBnZXRTbmFwc2hvdCgpYCdzKTpcbiAqICAgLSBwYXVzZWRTdGFnZUlkICsgc3ViZmxvd1BhdGggKCsgcGF1c2VkQnkpOiB0aGUgY3Vyc29yXG4gKiAgIC0gc2hhcmVkU3RhdGUgKyBzdWJmbG93U3RhdGVzOiB0aGUgc3RhdGUgYXQgdGhlIHBhdXNlIOKAlCB0aGUgcm9vdCdzLCBhbmRcbiAqICAgICBlYWNoIHN1YmZsb3cncyBvbiB0aGUgcGF1c2UgcGF0aFxuICogICAtIGV4ZWN1dGlvbkNvdW50ICsgdmlzaXRDb3VudHM6IHRoZSBjb3VudGVycyB0aGUgcmVzdW1lZCBydW4gY29udGludWVzXG4gKiAgIC0gcGVuZGluZ1BhdXNlcywgcmVkYWN0aW9uTWFya3M6IHdhaXRpbmcgc2libGluZ3MsIHJlZGFjdGlvbiBuYW1lc1xuICogICAtIHBhdXNlRGF0YSwgcGF1c2VkRXhlY3V0aW9uLCBpbnZva2VyU3RhZ2VJZCwgcGF1c2VkQXQ6IHRoZSByZWNvcmRcbiAqXG4gKiBSZXN1bWUgcmVidWlsZHMgdGhlIGZsb3djaGFydCwgcmVzdG9yZXMgc2NvcGUsIG5hdmlnYXRlcyB0byB0aGUgcGF1c2VkIHN0YWdlLFxuICogaW5qZWN0cyByZXN1bWVJbnB1dCwgYW5kIGNvbnRpbnVlcyB0cmF2ZXJzYWwuXG4gKlxuICogU3VwcG9ydGVkIHRvcG9sb2dpZXM6IGxpbmVhciwgc3ViZmxvdyAoYXQgYW55IGRlcHRoIOKAlCBtb3VudGVkIGxpbmVhcmx5LCBhcyBhXG4gKiBkZWNpZGVyIG9yIHNlbGVjdG9yIGJyYW5jaCwgb3IgYXMgYSBmb3JrIGNoaWxkKSwgbG9vcCwgbmVzdGVkIHN1YmZsb3cgaW5cbiAqIGxvb3AsIGFuZCBzZXZlcmFsIHBhcmFsbGVsIHNpYmxpbmdzIHBhdXNpbmcgaW4gb25lIGZhbi1vdXQgKGVhY2ggYXNrcyBpblxuICogdHVybiDigJQgYEZsb3djaGFydENoZWNrcG9pbnQucGVuZGluZ1BhdXNlc2ApLlxuICpcbiAqIE5PVCByZXN1bWFibGUgeWV0OiBhIHBhdXNlIGluc2lkZSBhIExBWlkgc3ViZmxvdyAoYGFkZExhenlTdWJGbG93Q2hhcnQqYCkgb3JcbiAqIGluc2lkZSBhbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBicmFuY2guIFRoZWlyIGdyYXBocyBhcmUgcmVzb2x2ZWQgYXQgcnVuIHRpbWVcbiAqIGFuZCBhcmUgbm90IGluIHRoZSBjaGFydCBhIHJlc3VtZSB3YWxrcywgc28gYHJlc3VtZSgpYCByZWZ1c2VzIHRoZVxuICogY2hlY2twb2ludCAoXCJub3QgZm91bmRcIikgaW5zdGVhZCBvZiBndWVzc2luZy4gUGlubmVkIGluXG4gKiB0ZXN0L2xpYi9wYXVzZS9yZXN1bWUta25vd24tbGltaXRhdGlvbnMudGVzdC50cy5cbiAqL1xuXG4vLyDilIDilIAgUGF1c2VTaWduYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhlIHBhdXNlZCBFWEVDVVRJT04gKDkuMzcuMCk6IHRoZSBydW4gdGhhdCBwYXVzZWQgYW5kIHRoZSBwYXVzZWQgc3RhZ2Unc1xuICogcnVudGltZVN0YWdlSWQgaW4gaXQuIFJlY29yZGVkIG9uIHRoZSBjaGVja3BvaW50IChhbmQgb24gZWFjaCBxdWV1ZWRcbiAqIHNpYmxpbmcncyBwZW5kaW5nIHJlY29yZCkgc28gYSByZXN1bWUgY2FuIExJTksgdG8gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2VkRXhlY3V0aW9uIHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcmVkYWN0aW9uIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4g4oCUIE5BTUVTIG9ubHksIG5ldmVyIGEgdmFsdWVcbiAqICh0aGUgY2hlY2twb2ludCBzdGF5cyByZWFsKTogdGhlIGtleXMgbWFya2VkIHNlY3JldCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1blxuICogKGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCwgYSBrZXkgdGhlIHBvbGljeSByZWRhY3RlZCB3aG9sZSwgYVxuICogc3ViZmxvdyBtYXBwZXIncyB0YWludCkgYW5kIHRoZSBmaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleS4gUmVzdW1lXG4gKiBzZWVkcyB0aGUgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlbSwgc28gYSBjb3B5IG1hZGUgYmVmb3JlIHRoZSBwYXVzZSBpc1xuICogc3RpbGwgbWFza2VkIGFmdGVyIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvbk1hcmtzIHtcbiAgcmVhZG9ubHkga2V5czogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBLZXkg4oaSIHRoZSBmaWVsZCBwYXRocyBhIG1hcHBlciBoYW5kZWQgaXQuIEFic2VudCB3aGVuIG5vbmUuICovXG4gIHJlYWRvbmx5IGZpZWxkcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj47XG59XG5cbi8qKiBUcnVlIGZvciBhIHdlbGwtZm9ybWVkIHtAbGluayBQYXVzZWRFeGVjdXRpb259ICh0d28gbm9uLWVtcHR5IHN0cmluZ3MpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VkRXhlY3V0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUGF1c2VkRXhlY3V0aW9uIHtcbiAgY29uc3QgdiA9IHZhbHVlIGFzIHsgcnVuSWQ/OiB1bmtub3duOyBydW50aW1lU3RhZ2VJZD86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHY/LnJ1bklkID09PSAnc3RyaW5nJyAmJiB2LnJ1bklkICE9PSAnJyAmJiB0eXBlb2Ygdi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgdi5ydW50aW1lU3RhZ2VJZCAhPT0gJydcbiAgKTtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgYHNjb3BlLiRwYXVzZSgpYCB0byBzaWduYWwgdGhhdCBleGVjdXRpb24gc2hvdWxkIHN0b3BcbiAqIGFuZCBjcmVhdGUgYSBzZXJpYWxpemFibGUgY2hlY2twb2ludC5cbiAqXG4gKiBCdWJibGVzIHVwIHRocm91Z2ggU3ViZmxvd0V4ZWN1dG9yICh3aGljaCBwcmVwZW5kcyBzdWJmbG93IElEIHRvIHBhdGgpXG4gKiBhbmQgaXMgY2F1Z2h0IGJ5IEZsb3djaGFydFRyYXZlcnNlci9GbG93Q2hhcnRFeGVjdXRvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhdXNlU2lnbmFsIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRGF0YSBmcm9tICRwYXVzZSgpIOKAlCBxdWVzdGlvbiwgcmVhc29uLCBtZXRhZGF0YS4gKi9cbiAgcmVhZG9ubHkgcGF1c2VEYXRhOiB1bmtub3duO1xuICAvKiogSUQgb2YgdGhlIHN0YWdlIHRoYXQgY2FsbGVkICRwYXVzZSgpLiAqL1xuICByZWFkb25seSBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQg4oCUIGAnaW50ZXJydXB0J2Agd2hlbiBhIHN0YWdlIGJvZHkgY2FsbGVkXG4gICAqIGBpbnRlcnJ1cHQoc2NvcGUsIHBheWxvYWQpYCwgYWJzZW50IGZvciB0aGUgYGFkZFBhdXNhYmxlRnVuY3Rpb25gXG4gICAqIGV4ZWN1dGUvcmVzdW1lIHBhdGguIFNldCBhdCB0aGUgc3RhZ2UgYm91bmRhcnkgKGBTdGFnZVJ1bm5lcmApLCBjYXJyaWVkXG4gICAqIG9udG8gdGhlIGNoZWNrcG9pbnQsIGFuZCByZWFkIGJ5IGByZXN1bWUoKWAgdG8gcGljayB0aGUgcmUtZW50cnk6IGFuXG4gICAqIGludGVycnVwdGVkIHN0YWdlIHJlLXJ1bnMgaXRzIE9XTiBmdW5jdGlvbiBmcm9tIHRoZSB0b3AgKHN0YWdlcyBhcmVcbiAgICogYXRvbWljKSwgYSBwYXVzYWJsZSBzdGFnZSBydW5zIGl0cyBgcmVzdW1lRm5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcbiAgLyoqIFBhdGggdGhyb3VnaCBzdWJmbG93cyB0byB0aGUgcGF1c2VkIHN0YWdlLiBCdWlsdCBkdXJpbmcgYnViYmxlLXVwLiAqL1xuICBwcml2YXRlIF9zdWJmbG93UGF0aDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEludm9rZXIgY29udGV4dCDigJQgZW5yaWNoZWQgZHVyaW5nIGJ1YmJsZS11cCB3aGVuIGEgUGF1c2VTaWduYWwgcGFzc2VzXG4gICAqIHRocm91Z2ggYSBkZWNpZGVyLCBzZWxlY3Rvciwgb3IgZm9yayBoYW5kbGVyLlxuICAgKlxuICAgKiBUaGUgaW52b2tlciBpcyB0aGUgc3RhZ2UgdGhhdCBjYWxsZWQgZXhlY3V0ZU5vZGUoKSBvbiB0aGUgcGF1c2VkIGNoaWxkLlxuICAgKiBDYXB0dXJlZCBkdXJpbmcgdHJhdmVyc2FsIChub3QgcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSB0cmVlKS4gKFRoZVxuICAgKiBpbnZva2VyJ3MgYC5uZXh0YCBpZCByb2RlIGJlc2lkZSBpdCB1bnRpbCA5LjM5LjAgYXNcbiAgICogYGNvbnRpbnVhdGlvblN0YWdlSWRgOyB3aGF0IHJ1bnMgYWZ0ZXIgYSByZXN1bWUgY29tZXMgZnJvbSB0aGUgY2hhcnRcbiAgICogc2luY2UgOS4yOC4wLCBzbyBpdCBpcyBubyBsb25nZXIgY2FycmllZC4pXG4gICAqL1xuICBwcml2YXRlIF9pbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBwb3B1bGF0ZWQgZHVyaW5nIGJ1YmJsZS11cCBieVxuICAgKiBgU3ViZmxvd0V4ZWN1dG9yYCByaWdodCBiZWZvcmUgcmUtdGhyb3cuIEVhY2ggZW50cnkgaXMgb25lXG4gICAqIHN1YmZsb3cncyBwcmUtcGF1c2Ugc2hhcmVkIHN0YXRlLCBrZXllZCBieSB0aGUgcGF0aC1wcmVmaXhlZFxuICAgKiBzdWJmbG93IGlkIChtYXRjaGVzIGBzdWJmbG93UGF0aGApLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMsIHRoZSBuZXN0ZWQgYFNoYXJlZE1lbW9yeWAgaXMgZ2FyYmFnZS1jb2xsZWN0ZWRcbiAgICogYmVmb3JlIHRoZSBjaGVja3BvaW50IGlzIGJ1aWx0LiBPbiByZXN1bWUsIHRoZSBpbm5lciBydW50aW1lIGlzXG4gICAqIHJlLWNyZWF0ZWQgZW1wdHkgYW5kIHJlc3VtZSBoYW5kbGVycyByZWFkaW5nIHByZS1wYXVzZSBzY29wZVxuICAgKiAoZS5nLiwgYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWAsIGBzY29wZS5wYXVzZWRUb29sQ2FsbElkYClcbiAgICogY3Jhc2ggd2l0aCBcIlggaXMgbm90IGl0ZXJhYmxlXCIgLyB1bmRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7fTtcblxuICAvKipcbiAgICogUGF1c2VzIHRoYXQgUEFSQUxMRUwgU0lCTElOR1MgcmFpc2VkIGluIHRoZSBzYW1lIGZhbi1vdXQgYXMgdGhpcyBvbmUsXG4gICAqIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKS4gUmVjb3JkZWQgYnkgYENoaWxkcmVuRXhlY3V0b3JgIHdoZW4gbW9yZVxuICAgKiB0aGFuIG9uZSBjaGlsZCBvZiBhIGZvcmsgKG9yIG1vcmUgdGhhbiBvbmUgc2VsZWN0ZWQgYnJhbmNoKSBwYXVzZXM6IHRoZVxuICAgKiBmaXJzdCBwYXVzZSBpcyB0aGUgb25lIHRoYXQgaXMgYXNrZWQsIHRoZSBvdGhlcnMgcmlkZSBoZXJlIGluc3RlYWQgb2ZcbiAgICogYmVpbmcgZHJvcHBlZC4gRWFjaCBwYXRoIGlzIHJlbGF0aXZlIHRvIHdoZXJlIHRoZSBzaWduYWwgY3VycmVudGx5IGlzXG4gICAqIGFuZCBncm93cyB3aXRoIGl0IOKAlCBgcHJlcGVuZFN1YmZsb3dgIHByZXBlbmRzIHRvIGV2ZXJ5IGVudHJ5IHRvby5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdQYXVzZXM6IE11dGFibGVQZW5kaW5nUGF1c2VbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXSElDSCBleGVjdXRpb24gcGF1c2VkIOKAlCBpdHMgcnVudGltZVN0YWdlSWQgc3RhbXBlZCBvbmNlIGF0IHRoZSBzdGFnZVxuICAgKiBib3VuZGFyeSAoYFN0YWdlUnVubmVyYCksIGl0cyBydW4gYWRkZWQgd2hlbiB0aGUgY2hlY2twb2ludCBpcyBidWlsdFxuICAgKiAoYGNvbXBsZXRlRXhlY3V0aW9uYCksIG9yIGJvdGggY2FycmllZCBvdmVyIGZvciBhIHF1ZXVlZCBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGF1c2VkRXhlY3V0aW9uPzogeyBydW50aW1lU3RhZ2VJZDogc3RyaW5nOyBydW5JZD86IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IHVua25vd24sIHN0YWdlSWQ6IHN0cmluZywgcGF1c2VkQnk/OiAnaW50ZXJydXB0Jykge1xuICAgIHN1cGVyKCdFeGVjdXRpb24gcGF1c2VkJyk7XG4gICAgdGhpcy5uYW1lID0gJ1BhdXNlU2lnbmFsJztcbiAgICB0aGlzLnBhdXNlRGF0YSA9IGRhdGE7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICBpZiAocGF1c2VkQnkpIHRoaXMucGF1c2VkQnkgPSBwYXVzZWRCeTtcbiAgICB0aGlzLl9zdWJmbG93UGF0aCA9IFtdO1xuICAgIC8vIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgcmVhbCBlcnJvciDigJQgc3RhY2sgdHJhY2UgaGFzIG5vIGRpYWdub3N0aWMgdmFsdWUuXG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG5cbiAgZ2V0IHN1YmZsb3dQYXRoKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc3ViZmxvd1BhdGg7XG4gIH1cblxuICAvKiogVGhlIHBhdXNlZCBleGVjdXRpb24gKGl0cyBydW4gYW5kIGBbcGF0aC9dc3RhZ2VJZCNOYCksIG9uY2UgYm90aCBhcmUga25vd24uICovXG4gIGdldCBwYXVzZWRFeGVjdXRpb24oKTogUGF1c2VkRXhlY3V0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlID0gdGhpcy5fcGF1c2VkRXhlY3V0aW9uO1xuICAgIHJldHVybiBlPy5ydW5JZCAhPT0gdW5kZWZpbmVkID8geyBydW5JZDogZS5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQgfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgd2hpY2ggRVhFQ1VUSU9OIHBhdXNlZC4gRmlyc3Qgc3RhbXAgd2luczogdGhlIHNpZ25hbCBidWJibGVzXG4gICAqIHRocm91Z2ggb3V0ZXIgYm91bmRhcmllcyB0aGF0IG11c3Qgbm90IG92ZXJ3cml0ZSBpdC4gVGhlIHN0YWdlIGJvdW5kYXJ5XG4gICAqIGtub3dzIG9ubHkgdGhlIHJ1bnRpbWVTdGFnZUlkOyBhIHF1ZXVlZCBzaWJsaW5nIHJhaXNlZCBhZ2FpbiBvbiByZXN1bWVcbiAgICogY2FycmllcyBib3RoIChpdCBwYXVzZWQgaW4gYW4gRUFSTElFUiBydW4pLlxuICAgKi9cbiAgc3RhbXBFeGVjdXRpb24ocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcnVuSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGF1c2VkRXhlY3V0aW9uICE9PSB1bmRlZmluZWQgfHwgIXJ1bnRpbWVTdGFnZUlkKSByZXR1cm47XG4gICAgdGhpcy5fcGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZCwgLi4uKHJ1bklkICE9PSB1bmRlZmluZWQgJiYgeyBydW5JZCB9KSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE5hbWUgdGhlIHJ1biBmb3IgZXZlcnkgcGF1c2Ugb24gdGhpcyBzaWduYWwgdGhhdCBwYXVzZWQgaW4gaXQg4oCUIHRoaXMgb25lXG4gICAqIGFuZCBpdHMgcXVldWVkIHNpYmxpbmdzIHRoYXQgZG8gbm90IGFscmVhZHkgY2FycnkgYSBydW4gKGEgc2libGluZyByYWlzZWRcbiAgICogYWdhaW4gb24gcmVzdW1lIGtlZXBzIHRoZSBydW4gaXQgcGF1c2VkIGluKS4gQ2FsbGVkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGNoZWNrcG9pbnQgaXMgYnVpbHQuXG4gICAqL1xuICBjb21wbGV0ZUV4ZWN1dGlvbihydW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3BhdXNlZEV4ZWN1dGlvbiAmJiB0aGlzLl9wYXVzZWRFeGVjdXRpb24ucnVuSWQgPT09IHVuZGVmaW5lZCkgdGhpcy5fcGF1c2VkRXhlY3V0aW9uLnJ1bklkID0gcnVuSWQ7XG4gICAgZm9yIChjb25zdCBwZW5kaW5nIG9mIHRoaXMuX3BlbmRpbmdQYXVzZXMpIHtcbiAgICAgIGlmIChwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbiAmJiBwZW5kaW5nLnBhdXNlZEV4ZWN1dGlvbi5ydW5JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBlbmRpbmcucGF1c2VkRXhlY3V0aW9uID0geyBydW50aW1lU3RhZ2VJZDogcGVuZGluZy5wYXVzZWRFeGVjdXRpb24ucnVudGltZVN0YWdlSWQsIHJ1bklkIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmQgYSBzdWJmbG93IElEIHRvIHRoZSBwYXRoIChjYWxsZWQgZHVyaW5nIGJ1YmJsZS11cCkuIFRoZSBwZW5kaW5nXG4gICAqIHNpYmxpbmcgcGF1c2VzIHJpZGUgdGhlIHNhbWUgYm91bmRhcnksIHNvIHRoZWlyIHBhdGhzIGdyb3cgd2l0aCBpdC5cbiAgICovXG4gIHByZXBlbmRTdWJmbG93KHN1YmZsb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fc3ViZmxvd1BhdGgudW5zaGlmdChzdWJmbG93SWQpO1xuICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUGF1c2VzKSBwZW5kaW5nLnN1YmZsb3dQYXRoLnVuc2hpZnQoc3ViZmxvd0lkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZSBhIHBhcmFsbGVsIHNpYmxpbmcncyBwYXVzZSBiZWhpbmQgdGhpcyBvbmUgKGl0cyBwYXRoIHJlbGF0aXZlIHRvXG4gICAqIHRoaXMgc2lnbmFsJ3MgY3VycmVudCBsZXZlbCkuIENvcGllZCBpbjogdGhlIGVudHJ5IGlzIG93bmVkIGJ5IHRoZVxuICAgKiBzaWduYWwgZnJvbSBoZXJlIG9uLlxuICAgKi9cbiAgYWRkUGVuZGluZ1BhdXNlKHBhdXNlOiBQZW5kaW5nUGF1c2UpOiB2b2lkIHtcbiAgICB0aGlzLl9wZW5kaW5nUGF1c2VzLnB1c2goe1xuICAgICAgcGF1c2VkU3RhZ2VJZDogcGF1c2UucGF1c2VkU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBbLi4ucGF1c2Uuc3ViZmxvd1BhdGhdLFxuICAgICAgc3ViZmxvd1N0YXRlczogeyAuLi5wYXVzZS5zdWJmbG93U3RhdGVzIH0sXG4gICAgICAuLi4ocGF1c2UucGF1c2VEYXRhICE9PSB1bmRlZmluZWQgJiYgeyBwYXVzZURhdGE6IHBhdXNlLnBhdXNlRGF0YSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRCeSAmJiB7IHBhdXNlZEJ5OiBwYXVzZS5wYXVzZWRCeSB9KSxcbiAgICAgIC4uLihwYXVzZS5wYXVzZWRFeGVjdXRpb24gJiZcbiAgICAgICAgdHlwZW9mIHBhdXNlLnBhdXNlZEV4ZWN1dGlvbi5ydW50aW1lU3RhZ2VJZCA9PT0gJ3N0cmluZycgJiYgeyBwYXVzZWRFeGVjdXRpb246IHsgLi4ucGF1c2UucGF1c2VkRXhlY3V0aW9uIH0gfSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyYWxsZWwgc2libGluZ3MnIHBhdXNlcyB3YWl0aW5nIGJlaGluZCB0aGlzIG9uZSwgaW4gdGhlIG9yZGVyIHRoZXkgd2lsbFxuICAgKiBiZSBhc2tlZC4gSW4gZmxpZ2h0LCBhIHNpYmxpbmcgdGhhdCBwYXVzZWQgaW4gVEhJUyBydW4gY2FycmllcyBvbmx5IGl0c1xuICAgKiBydW50aW1lU3RhZ2VJZDsgYGNvbXBsZXRlRXhlY3V0aW9uYCAoYXQgY2hlY2twb2ludCBidWlsZCkgYWRkcyB0aGUgcnVuLlxuICAgKi9cbiAgZ2V0IHBlbmRpbmdQYXVzZXMoKTogcmVhZG9ubHkgUGVuZGluZ1BhdXNlW10ge1xuICAgIHJldHVybiB0aGlzLl9wZW5kaW5nUGF1c2VzIGFzIHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgcGF1c2UgYXMgYSB7QGxpbmsgUGVuZGluZ1BhdXNlfSDigJQgd2hhdCBgQ2hpbGRyZW5FeGVjdXRvcmAgcXVldWVzXG4gICAqIGJlaGluZCBhIHNpYmxpbmcncyBwYXVzZSB3aGVuIGJvdGggcGF1c2VkIGluIG9uZSBmYW4tb3V0LlxuICAgKi9cbiAgdG9QZW5kaW5nUGF1c2UoKTogUGVuZGluZ1BhdXNlIHtcbiAgICAvLyBJbiBmbGlnaHQgKHNlZSBgcGVuZGluZ1BhdXNlc2ApOiB0aGUgcnVuIGlzIGFkZGVkIGF0IGNoZWNrcG9pbnQgYnVpbGQuXG4gICAgcmV0dXJuIDxQZW5kaW5nUGF1c2U+e1xuICAgICAgcGF1c2VkU3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IFsuLi50aGlzLl9zdWJmbG93UGF0aF0sXG4gICAgICBzdWJmbG93U3RhdGVzOiB7IC4uLnRoaXMuX3N1YmZsb3dTdGF0ZXMgfSxcbiAgICAgIC4uLih0aGlzLnBhdXNlRGF0YSAhPT0gdW5kZWZpbmVkICYmIHsgcGF1c2VEYXRhOiB0aGlzLnBhdXNlRGF0YSB9KSxcbiAgICAgIC4uLih0aGlzLnBhdXNlZEJ5ICYmIHsgcGF1c2VkQnk6IHRoaXMucGF1c2VkQnkgfSksXG4gICAgICAuLi4odGhpcy5fcGF1c2VkRXhlY3V0aW9uICYmIHsgcGF1c2VkRXhlY3V0aW9uOiB7IC4uLnRoaXMuX3BhdXNlZEV4ZWN1dGlvbiB9IH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlIHRoYXQgaW52b2tlZCB0aGUgcGF1c2VkIGNoaWxkIChkZWNpZGVyLCBzZWxlY3RvciwgZm9yaykuICovXG4gIGdldCBpbnZva2VyU3RhZ2VJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2VyU3RhZ2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFtcCB0aGUgaW52b2tlciBjb250ZXh0IGR1cmluZyBidWJibGUtdXAuXG4gICAqIENhbGxlZCBieSBkZWNpZGVyL3NlbGVjdG9yL2ZvcmsgaGFuZGxlcnMgd2hlbiBjYXRjaGluZyBhIGNoaWxkJ3MgUGF1c2VTaWduYWwuXG4gICAqIEZpcnN0IGludm9rZXIgd2lucyAoaW5uZXJtb3N0KSDigJQgc3Vic2VxdWVudCBjYWxscyBhcmUgbm8tb3BzLlxuICAgKi9cbiAgc2V0SW52b2tlcihpbnZva2VyU3RhZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pbnZva2VyU3RhZ2VJZCkgdGhpcy5faW52b2tlclN0YWdlSWQgPSBpbnZva2VyU3RhZ2VJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlIGEgc3ViZmxvdydzIGlzb2xhdGVkIFNoYXJlZE1lbW9yeSBhdCB0aGUgbW9tZW50IGl0c1xuICAgKiB0cmF2ZXJzYWwgdGhyZXcuIENhbGxlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCBvbmNlIHBlciBzdWJmbG93XG4gICAqIGJvdW5kYXJ5IG9uIHRoZSBidWJibGUtdXAgcGF0aC4gRWFjaCBjYXB0dXJlIGlzIGtleWVkIGJ5IHRoZVxuICAgKiBwYXRoLXByZWZpeGVkIHN1YmZsb3cgaWQgKHRoZSBzYW1lIGlkIHVzZWQgaW4gYHN1YmZsb3dQYXRoYCkuXG4gICAqXG4gICAqIElubmVybW9zdC1maXJzdDogYSBkZWVwIGBTZXF1ZW5jZShBZ2VudCguLi4pKWAgcGF1c2UgY2FwdHVyZXMgdGhlXG4gICAqIGFnZW50J3Mgc3ViZmxvdyBmaXJzdCwgdGhlbiBpdHMgcGFyZW50J3MsIGFsbCB0aGUgd2F5IHRvIHRoZSByb290XG4gICAqIG1vdW50LiBUaGUgZnVsbCBuZXN0IHN1cnZpdmVzIGludG8gYGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlc2AuXG4gICAqL1xuICBjYXB0dXJlU3ViZmxvd1Njb3BlKHN1YmZsb3dJZDogc3RyaW5nLCBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICAvLyBEZWZlbnNpdmUgc2hhbGxvdyBjbG9uZSBzbyBsYXRlciBtdXRhdGlvbnMgb24gdGhlIHNvdXJjZSBkb24ndFxuICAgIC8vIGJsZWVkIGludG8gdGhlIGNhcHR1cmVkIHNuYXBzaG90LiBEZWVwIGNsb25pbmcgaXMgdGhlIGNvbnN1bWVyJ3NcbiAgICAvLyByZXNwb25zaWJpbGl0eSAodGhlIHJlc3VtZSB0YXJnZXQgbWF5IG5vdCBldmVuIGJlIG9uIHRoaXNcbiAgICAvLyBwcm9jZXNzKTsgU2hhcmVkTWVtb3J5IHZhbHVlcyBhcmUgY29udmVudGlvbmFsbHkgSlNPTi1mcmllbmRseS5cbiAgICB0aGlzLl9zdWJmbG93U3RhdGVzW3N1YmZsb3dJZF0gPSB7IC4uLnN0YXRlIH07XG4gIH1cblxuICAvKiogQ2FwdHVyZWQgc3ViZmxvdyBzY29wZXMgKHJlYWQtb25seSB2aWV3KS4gKi9cbiAgZ2V0IHN1YmZsb3dTdGF0ZXMoKTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YmZsb3dTdGF0ZXM7XG4gIH1cbn1cblxuLy8g4pSA4pSAIFBlbmRpbmdQYXVzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBIHBhdXNlIGEgUEFSQUxMRUwgU0lCTElORyBvZiB0aGUgcGF1c2VkIHN0YWdlIHJhaXNlZCBpbiB0aGUgc2FtZSBmYW4tb3V0IOKAlFxuICogdHdvIGNoaWxkcmVuIG9mIG9uZSBmb3JrIChvciB0d28gc2VsZWN0ZWQgYnJhbmNoZXMgb2Ygb25lIHNlbGVjdG9yKSB0aGF0XG4gKiBib3RoIHBhdXNlZCAoOS4yOC4wKS4gT25seSBvbmUgcGF1c2UgaXMgYXNrZWQgYXQgYSB0aW1lOiB0aGUgY2hlY2twb2ludCdzXG4gKiBvd24gKGBwYXVzZWRTdGFnZUlkYCksIHRoZW4gZWFjaCBvZiB0aGVzZSBpbiB0dXJuLCB3aXRoIHRoZSBmYW4tb3V0J3Mgam9pblxuICogcnVubmluZyBvbmx5IG9uY2UgZXZlcnkgY2hpbGQgaXMgZG9uZS5cbiAqXG4gKiBFdmVyeXRoaW5nIG5lZWRlZCB0byByYWlzZSB0aGUgc2libGluZydzIHBhdXNlIGFnYWluIGxhdGVyIFdJVEhPVVQgcmUtcnVubmluZ1xuICogdGhlIHNpYmxpbmc6IGl0cyBzdGFnZSwgaXRzIHBhdGgsIGl0cyBjYXB0dXJlZCBzdWJmbG93IHN0YXRlLCBpdHMgcXVlc3Rpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEEgZm9yayB3aG9zZSB0d28gY2hpbGRyZW4gYm90aCBhc2s6IHRoZSBmaXJzdCBjaGVja3BvaW50IGFza3MgYzEgYW5kXG4gKiAvLyBjYXJyaWVzIGMyJ3MgcGF1c2U7IHJlc3VtaW5nIGl0IGZpbmlzaGVzIGMxLCB0aGVuIHBhdXNlcyB3aXRoIGMyJ3NcbiAqIC8vIHF1ZXN0aW9uOyByZXN1bWluZyBUSEFUIGZpbmlzaGVzIGMyIGFuZCBydW5zIHRoZSBqb2luLlxuICogY29uc3QgY3AgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICogY3AucGF1c2VkU3RhZ2VJZDsgICAgICAgICAgICAgICAgICAvLyAnYzEvYXNrJ1xuICogY3AucGVuZGluZ1BhdXNlcz8uWzBdLnBhdXNlZFN0YWdlSWQ7IC8vICdjMi9hc2snXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nUGF1c2Uge1xuICAvKiogVGhlIHNpYmxpbmcncyBwYXVzZWQgc3RhZ2UgKHBhdGgtcHJlZml4ZWQgaWQsIGFzIGBwYXVzZWRTdGFnZUlkYCkuICovXG4gIHJlYWRvbmx5IHBhdXNlZFN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFBhdGggdGhyb3VnaCBzdWJmbG93cyB0byB0aGUgc2libGluZydzIHBhdXNlZCBzdGFnZSAoYXMgYHN1YmZsb3dQYXRoYCkuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBzaWJsaW5nJ3Mgb3duIHN1YmZsb3cgY2FwdHVyZXMg4oCUIHRoZSBzdWJmbG93cyBvbiBJVFMgcGF0aCBiZWxvdyB0aGVcbiAgICogZmFuLW91dC4gVGhlIHN1YmZsb3dzIGFib3ZlIHRoZSBmYW4tb3V0IGFyZSBzaGFyZWQgd2l0aCB0aGUgY2hlY2twb2ludCdzXG4gICAqIG93biBwYXVzZSBhbmQgYXJlIGNhcHR1cmVkIGFnYWluIHdoZW4gdGhpcyBwYXVzZSBpcyByYWlzZWQuXG4gICAqL1xuICByZWFkb25seSBzdWJmbG93U3RhdGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBUaGUgc2libGluZydzIHF1ZXN0aW9uIChhcyBgcGF1c2VEYXRhYCkuICovXG4gIHJlYWRvbmx5IHBhdXNlRGF0YT86IHVua25vd247XG4gIC8qKiBIb3cgdGhlIHNpYmxpbmcgcGF1c2VkIChhcyBgcGF1c2VkQnlgKS4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcbiAgLyoqIFdoaWNoIGV4ZWN1dGlvbiB0aGUgc2libGluZyBwYXVzZWQgaW4gKGFzIGBwYXVzZWRFeGVjdXRpb25gLCA5LjM3LjApIOKAlCBrZXB0IHNvIGl0cyBvd24gcmVzdW1lIGxpbmtzIHRvIGl0LiAqL1xuICByZWFkb25seSBwYXVzZWRFeGVjdXRpb24/OiBQYXVzZWRFeGVjdXRpb247XG59XG5cbi8qKiBBIHBlbmRpbmcgcGF1c2Ugd2hvc2UgcGF0aCBzdGlsbCBncm93cyBhcyBpdHMgc2lnbmFsIGJ1YmJsZXMgdXAgKGludGVybmFsKS4gKi9cbi8qKlxuICogVGhlIHNpZ25hbCdzIG93biBjb3B5IG9mIGEgcGVuZGluZyBwYXVzZS4gSXRzIGBwYXVzZWRFeGVjdXRpb25gIG1heSBzdGlsbFxuICogbGFjayB0aGUgcnVuIChhIHNpYmxpbmcgdGhhdCBwYXVzZWQgaW4gVEhJUyBydW4pIHVudGlsIGBjb21wbGV0ZUV4ZWN1dGlvbmAuXG4gKi9cbnR5cGUgTXV0YWJsZVBlbmRpbmdQYXVzZSA9IE9taXQ8UGVuZGluZ1BhdXNlLCAnc3ViZmxvd1BhdGgnIHwgJ3BhdXNlZEV4ZWN1dGlvbic+ICYge1xuICBzdWJmbG93UGF0aDogc3RyaW5nW107XG4gIHBhdXNlZEV4ZWN1dGlvbj86IHsgcnVudGltZVN0YWdlSWQ6IHN0cmluZzsgcnVuSWQ/OiBzdHJpbmcgfTtcbn07XG5cbi8vIOKUgOKUgCBQYXVzZVJlc3VsdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBSZXR1cm5lZCBieSBhIHBhdXNhYmxlIHN0YWdlJ3MgZXhlY3V0ZS9yZXN1bWUgZnVuY3Rpb24gdG8gc2lnbmFsIHBhdXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleGVjdXRlOiBhc3luYyAoc2NvcGUpID0+IHtcbiAqICAgc2NvcGUub3JkZXJJZCA9ICcxMjMnO1xuICogICByZXR1cm4geyBwYXVzZTogdHJ1ZSwgZGF0YTogeyBxdWVzdGlvbjogJ0FwcHJvdmUgb3JkZXIgMTIzPycgfSB9O1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2VSZXN1bHQge1xuICByZWFkb25seSBwYXVzZTogdHJ1ZTtcbiAgLyoqIERhdGEgdG8gaW5jbHVkZSBpbiB0aGUgY2hlY2twb2ludCDigJQgcXVlc3Rpb24sIHJlYXNvbiwgbWV0YWRhdGEuICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xufVxuXG4vLyDilIDilIAgRmxvd2NoYXJ0Q2hlY2twb2ludCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBTZXJpYWxpemFibGUgY2hlY2twb2ludCDigJQgZXZlcnl0aGluZyBuZWVkZWQgdG8gcmVzdW1lIGEgcGF1c2VkIGZsb3djaGFydCxcbiAqIGFuZCBub3RoaW5nIGEgcmVzdW1lIG5ldmVyIHJlYWRzLlxuICpcbiAqIExFQU4gKGZvcm1hdCAyKTogaXRzIHNpemUgaXMgdGhlIFNUQVRFJ3MsIG5ldmVyIHRoZSBydW4ncyBsZW5ndGguIFRoZSBjdXJzb3JcbiAqIGlzIGBwYXVzZWRTdGFnZUlkYCArIGBzdWJmbG93UGF0aGA7IHRoZSBzdGF0ZSBpcyBgc2hhcmVkU3RhdGVgIHBsdXMgdGhlXG4gKiBjYXB0dXJlcyBvZiB0aGUgc3ViZmxvd3Mgb24gdGhhdCBwYXRoIChgc3ViZmxvd1N0YXRlc2ApLiBUaGUgcnVuJ3MgaGlzdG9yeSDigJRcbiAqIHRoZSBleGVjdXRpb24gdHJlZSwgdGhlIGZpbmlzaGVkIHN1YmZsb3dzJyByZXN1bHRzLCB0aGUgY29tbWl0IGxvZyDigJQgaXMgbm90XG4gKiBoZXJlOiByZWFkIGl0IGZyb20gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgIGJlZm9yZSBgcmVzdW1lKClgIChmb3JtYXQgMVxuICogY2FycmllZCBgZXhlY3V0aW9uVHJlZWAgYW5kIGBzdWJmbG93UmVzdWx0c2A7IG5vIHJlc3VtZSByZWFkIHRoZW0pLlxuICpcbiAqIEpTT04tc2FmZTogbm8gZnVuY3Rpb25zLCBubyBjbGFzcyBpbnN0YW5jZXMsIG5vIFNESyBjbGllbnRzLlxuICogU3RvcmUgYW55d2hlcmU6IFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdlLCBhIGZpbGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCk7IC8vIGFmdGVyIHBhdXNlXG4gKiBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gKlxuICogLy8gUmVzdW1lIChob3VycyBsYXRlciwgcG9zc2libHkgZGlmZmVyZW50IHNlcnZlcilcbiAqIGNvbnN0IGNoZWNrcG9pbnQgPSBKU09OLnBhcnNlKGF3YWl0IHJlZGlzLmdldChgc2Vzc2lvbjoke2lkfWApKTtcbiAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShjaGVja3BvaW50LCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd2NoYXJ0Q2hlY2twb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgY2hlY2twb2ludCBGT1JNQVQ6IGAyYCwgdGhlIGxlYW4gY2hlY2twb2ludCAoYDFgIGZyb20gOS4zOS4wOyBhYnNlbnRcbiAgICogYmVmb3JlKS4gYHJlc3VtZSgpYCByZWFkcyBldmVyeSBvbGRlciBvbmUgdGhyb3VnaCB0aGUgb25lIHVwY2FzdGVyXG4gICAqIChgcGF1c2UvcmVjb3JkLnRzIMK3IHVwY2FzdENoZWNrcG9pbnRgKSwgd2hpY2ggZHJvcHMgd2hhdCBsYXRlciBmb3JtYXRzXG4gICAqIGRyb3BwZWQg4oCUIGZvcm1hdCAxJ3MgYGV4ZWN1dGlvblRyZWVgIGFuZCBgc3ViZmxvd1Jlc3VsdHNgLCB0aGUgbGVnYWN5XG4gICAqIGBjb250aW51YXRpb25TdGFnZUlkYCDigJQgbm9uZSBvZiB3aGljaCBhIHJlc3VtZSBldmVyIHJlYWQuIEEgdmVyc2lvbiB0aGlzXG4gICAqIHJlbGVhc2UgZG9lcyBub3Qga25vdyBpcyByZWZ1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2twb2ludFZlcnNpb24/OiAyO1xuXG4gIC8qKiBTY29wZSBzdGF0ZSBhdCB0aGUgcGF1c2UgcG9pbnQg4oCUIGFsbCBzaGFyZWQgbWVtb3J5IGtleS92YWx1ZXMuICovXG4gIHJlYWRvbmx5IHNoYXJlZFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKiogSUQgb2YgdGhlIHN0YWdlIHRoYXQgcGF1c2VkLiBVc2VkIGJ5IHJlc3VtZSgpIHRvIGZpbmQgdGhlIG5vZGUgaW4gdGhlIGdyYXBoLiAqL1xuICByZWFkb25seSBwYXVzZWRTdGFnZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXVzZWQgRVhFQ1VUSU9OICg5LjM3LjApOiB0aGUgcnVuIHRoYXQgcGF1c2VkIGFuZCB0aGUgcGF1c2VkIHN0YWdlJ3NcbiAgICogcnVudGltZVN0YWdlSWQgaW4gaXQgKHRoZSBpZCBpdHMgYG9uUGF1c2VgIGV2ZW50IGFuZCBpdHMgY29tbWl0IGNhcnJ5KS5cbiAgICogUmVhZCBieSBgcmVzdW1lKClgIGludG8gdGhlIGBvblJlc3VtZWAgZXZlbnQncyBgdHJhdmVyc2FsQ29udGV4dC5yZXN1bWVkRnJvbWBcbiAgICogbGluayDigJQgbmV2ZXIgdXNlZCB0byBwbGFuIHRoZSByZS1lbnRyeS4gQWJzZW50IG9uIGFuIG9sZGVyIGNoZWNrcG9pbnQsXG4gICAqIHdoaWNoIHRoZW4gcmVzdW1lcyB3aXRob3V0IGEgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdXNlZEV4ZWN1dGlvbj86IFBhdXNlZEV4ZWN1dGlvbjtcblxuICAvKiogUGF0aCB0aHJvdWdoIHN1YmZsb3dzIHRvIHRoZSBwYXVzZWQgc3RhZ2UgKGUuZy4sIFsnc2YtcGF5bWVudCcsICdzZi12YWxpZGF0aW9uJ10pLlxuICAgKiAgRW1wdHkgYXJyYXkgd2hlbiBwYXVzZWQgYXQgdGhlIHRvcCBsZXZlbC4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBEYXRhIGZyb20gJHBhdXNlKCkg4oCUIHF1ZXN0aW9uLCByZWFzb24sIG1ldGFkYXRhLiAqL1xuICByZWFkb25seSBwYXVzZURhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQuIGAnaW50ZXJydXB0J2AgbWVhbnMgYSBzdGFnZSBib2R5IGNhbGxlZFxuICAgKiBgaW50ZXJydXB0KHNjb3BlLCB7IHJlYXNvbiwgZXhwZWN0cz8gfSlgIGFuZCBgcGF1c2VEYXRhYCBJUyB0aGF0IHBheWxvYWQ7XG4gICAqIGFic2VudCBtZWFucyB0aGUgYGFkZFBhdXNhYmxlRnVuY3Rpb25gIGV4ZWN1dGUvcmVzdW1lIHBhdGggKGV2ZXJ5XG4gICAqIGNoZWNrcG9pbnQgd3JpdHRlbiBiZWZvcmUgOS4xNC4wIG9taXRzIGl0LCB3aGljaCBpcyBleGFjdGx5IHJpZ2h0KS5cbiAgICpcbiAgICogYHJlc3VtZSgpYCByZWFkcyB0aGlzIHRvIHBpY2sgdGhlIHJlLWVudHJ5LCBhbmQgdGhlIHR3byBkaWZmZXIgYnkgbGF3OlxuICAgKiBhbiBpbnRlcnJ1cHRlZCBzdGFnZSBSRS1SVU5TIElUUyBPV04gRlVOQ1RJT04gRlJPTSBUSEUgVE9QIChzdGFnZXMgYXJlXG4gICAqIGF0b21pYyDigJQgdGhlIGFuc3dlciBjb21lcyBiYWNrIG91dCBvZiB0aGUgYGludGVycnVwdCgpYCBjYWxsKSwgd2hpbGUgYVxuICAgKiBwYXVzYWJsZSBzdGFnZSBydW5zIGl0cyBzZXBhcmF0ZSBgcmVzdW1lRm5gLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF1c2VkQnk/OiAnaW50ZXJydXB0JztcblxuICAvKipcbiAgICogU3ViZmxvdyBzY29wZSBjYXB0dXJlIOKAlCBvbmUgZW50cnkgcGVyIHN1YmZsb3cgYm91bmRhcnkgb24gdGhlIHBhdGhcbiAgICogdG8gdGhlIHBhdXNlZCBzdGFnZS4gS2V5ZWQgYnkgcGF0aC1wcmVmaXhlZCBzdWJmbG93IGlkIChtYXRjaGVzXG4gICAqIGBzdWJmbG93UGF0aGAgZW50cmllcykuIEVhY2ggdmFsdWUgaXMgdGhlIHN1YmZsb3cncyBwcmUtcGF1c2VcbiAgICogc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiBBbHdheXMgcHJlc2VudCAoZW1wdHkgYHt9YCBmb3Igcm9vdC1sZXZlbCBwYXVzZXMgd2hlcmUgbm8gc3ViZmxvd3NcbiAgICogd2VyZSBlbnRlcmVkKS4gT24gcmVzdW1lLCBgU3ViZmxvd0V4ZWN1dG9yYCBzZWVkcyBlYWNoIG5lc3RlZCBydW50aW1lXG4gICAqIG9uIHRoZSBwYXRoIGZyb20gdGhpcyBtYXAg4oCUIE9OQ0UsIG9uIGl0cyBmaXJzdCBlbnRyeSwgaW4gcGxhY2Ugb2YgdGhlXG4gICAqIGlucHV0TWFwcGVyJ3MgdmFsdWVzICh0aGUgbWFwcGVyIHN0aWxsIHJ1bnMsIGZvciB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICogYXJncykg4oCUIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgcHJlLXBhdXNlIHNjb3BlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIEFORFxuICAgKiBjcm9zcy1leGVjdXRvciByZXN0YXJ0cy4gT25seSB0aGUgc3ViZmxvd3MgT04gYHN1YmZsb3dQYXRoYCByZWFkIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1N0YXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGF0IHRoZSBtb21lbnQgb2YgcGF1c2Ug4oCUIHRoZSBudW1iZXIgb2Ygc3RhZ2VzXG4gICAqIGV4ZWN1dGVkIHNvIGZhciB0aGlzIHJ1bi4gUmVzdW1lIHNlZWRzIGl0IHNvIHBvc3QtcmVzdW1lIGBydW50aW1lU3RhZ2VJZGBzXG4gICAqIChgc3RhZ2VJZCNleGVjdXRpb25JbmRleGApIGtlZXAgY2xpbWJpbmcgYW5kIG5ldmVyIGNvbGxpZGUgd2l0aCBwcmUtcGF1c2VcbiAgICogb25lcywgd2hpY2ggaXMgd2hhdCB0aGUgd2hvbGUgZXZlbnQtY29ycmVsYXRpb24gbW9kZWwgcmVzdHMgb24uXG4gICAqXG4gICAqIE9wdGlvbmFsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBhIGNoZWNrcG9pbnQgcGVyc2lzdGVkIGJlZm9yZSB0aGlzXG4gICAqIGZpZWxkIGV4aXN0ZWQgKG9sZGVyIFJlZGlzL1Bvc3RncmVzIHJvd3MpIHN0aWxsIHZhbGlkYXRlcyBhbmQgcmVzdW1lcyB3aXRoXG4gICAqIHRoZSBwcmV2aW91cyAoY291bnRlci1yZXN0YXJ0aW5nKSBiZWhhdmlvci5cbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvbkNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItYHN0YWdlSWRgIGxvb3AgdmlzaXQgY291bnRzIGF0IHRoZSBtb21lbnQgb2YgcGF1c2UuIFJlc3VtZSBzZWVkcyB0aGVtXG4gICAqIHNvIGBUcmF2ZXJzYWxDb250ZXh0Lmxvb3BJdGVyYXRpb25gIHN0YXlzIGNvbnRpbnVvdXMgYWNyb3NzIHRoZSBwYXVzZSAoYVxuICAgKiBtaWQtbG9vcCByZXN1bWUga2VlcHMgY291bnRpbmcgdXAsIG5vdCByZXN0YXJ0aW5nIGF0IDApIGFuZCB0aGVcbiAgICogQ29udGludWF0aW9uUmVzb2x2ZXIgaXRlcmF0aW9uIGJ1ZGdldCBpcyBub3Qgc2lsZW50bHkgcmVmaWxsZWQuXG4gICAqXG4gICAqIE9wdGlvbmFsIGZvciB0aGUgc2FtZSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHJlYXNvbiBhcyBgZXhlY3V0aW9uQ291bnRgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaXRDb3VudHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PjtcblxuICAvKiogU3RhZ2UgdGhhdCBpbnZva2VkIHRoZSBwYXVzZWQgY2hpbGQgKGRlY2lkZXIsIHNlbGVjdG9yLCBmb3JrKS4gQWJzZW50IGZvciBsaW5lYXIgcGF1c2VzLiAqL1xuICByZWFkb25seSBpbnZva2VyU3RhZ2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF1c2VzIHJhaXNlZCBieSBQQVJBTExFTCBTSUJMSU5HUyBvZiB0aGUgcGF1c2VkIHN0YWdlIGluIHRoZSBzYW1lXG4gICAqIGZhbi1vdXQsIHdhaXRpbmcgdGhlaXIgdHVybiAoOS4yOC4wKSDigJQgc2VlIHtAbGluayBQZW5kaW5nUGF1c2V9LiBBYnNlbnRcbiAgICogd2hlbiBvbmx5IG9uZSBjaGlsZCBwYXVzZWQgKGV2ZXJ5IGNoZWNrcG9pbnQgYmVmb3JlIDkuMjguMCBvbWl0cyBpdCwgYW5kXG4gICAqIHJlc3VtZXMgZXhhY3RseSBhcyBiZWZvcmUpLiBSZXN1bWluZyB0aGlzIGNoZWNrcG9pbnQgZmluaXNoZXMgdGhlIHBhdXNlZFxuICAgKiBzdGFnZSdzIGNoaWxkLCB0aGVuIHBhdXNlcyBhZ2FpbiB3aXRoIHRoZSBmaXJzdCBvZiB0aGVzZTsgdGhlIGZhbi1vdXQnc1xuICAgKiBqb2luIHJ1bnMgb25jZSBldmVyeSBjaGlsZCBpcyBkb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFBlbmRpbmdQYXVzZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIG1hcmtzIG9mIHRoZSBwYXVzZWQgcnVuIOKAlCBOQU1FUyBvbmx5IChzZWVcbiAgICoge0BsaW5rIFJlZGFjdGlvbk1hcmtzfSkuIEFic2VudCB3aGVuIHRoZSBydW4gbWFya2VkIG5vdGhpbmcgKG5vIHBvbGljeVxuICAgKiBhbmQgbm8gcGVyLWNhbGwgbWFyaywgb3IgYW4gb2xkZXIgY2hlY2twb2ludCk6IHRoZSByZXN1bWVkIHJ1biB0aGVuIHN0YXJ0c1xuICAgKiBmcm9tIGl0cyBwb2xpY3kgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSByZWRhY3Rpb25NYXJrcz86IFJlZGFjdGlvbk1hcmtzO1xuXG4gIC8qKiBUaW1lc3RhbXAgb2Ygd2hlbiB0aGUgcGF1c2Ugb2NjdXJyZWQuICovXG4gIHJlYWRvbmx5IHBhdXNlZEF0OiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgCBQYXVzYWJsZUhhbmRsZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogSGFuZGxlciBmb3IgYSBwYXVzYWJsZSBzdGFnZSDigJQgaGFzIHR3byBwaGFzZXM6IGV4ZWN1dGUgYW5kIHJlc3VtZS5cbiAqXG4gKiBgZXhlY3V0ZWAgcnVucyB0aGUgZmlyc3QgdGltZS4gUmV0dXJuIGFueSBub24tdm9pZCB2YWx1ZSB0byBwYXVzZSAodGhhdCB2YWx1ZVxuICogYmVjb21lcyB0aGUgY2hlY2twb2ludCdzIGBwYXVzZURhdGFgKTsgcmV0dXJuIHZvaWQvdW5kZWZpbmVkIHRvIGNvbnRpbnVlIG5vcm1hbGx5LlxuICogYHJlc3VtZWAgcnVucyB3aGVuIHRoZSBmbG93Y2hhcnQgaXMgcmVzdW1lZC4gSXQgcmVjZWl2ZXMgdGhlIHJlc3VtZSBpbnB1dC5cbiAqXG4gKiBCb3RoIHBoYXNlcyByZWNlaXZlIHRoZSBzYW1lIHNjb3BlLiBBZnRlciBleGVjdXRlIHBhdXNlcywgdGhlIHNjb3BlIHN0YXRlXG4gKiBpcyBwcmVzZXJ2ZWQgaW4gdGhlIGNoZWNrcG9pbnQuIE9uIHJlc3VtZSwgdGhlIHNjb3BlIGlzIHJlc3RvcmVkIGJlZm9yZVxuICogY2FsbGluZyByZXN1bWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC5hZGRQYXVzYWJsZUZ1bmN0aW9uKCdBcHByb3ZlT3JkZXInLCB7XG4gKiAgIGV4ZWN1dGU6IGFzeW5jIChzY29wZSkgPT4ge1xuICogICAgIHNjb3BlLm9yZGVySWQgPSAnMTIzJztcbiAqICAgICBzY29wZS5hbW91bnQgPSAyOTk7XG4gKiAgICAgcmV0dXJuIHsgcXVlc3Rpb246IGBBcHByb3ZlICQke3Njb3BlLmFtb3VudH0gcmVmdW5kP2AgfTtcbiAqICAgfSxcbiAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gKiAgICAgc2NvcGUuYXBwcm92ZWQgPSBpbnB1dC5hcHByb3ZlZDtcbiAqICAgICBzY29wZS5hcHByb3ZlciA9IGlucHV0LmFwcHJvdmVyO1xuICogICB9LFxuICogfSwgJ2FwcHJvdmUtb3JkZXInLCAnTWFuYWdlciBhcHByb3ZhbCBnYXRlJylcbiAqXG4gKiAvLyBMYXRlciDigJQgcmVzdW1lIHdpdGggaHVtYW4ncyBhbnN3ZXJcbiAqIGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShjaGVja3BvaW50LCB7IGFwcHJvdmVkOiB0cnVlLCBhcHByb3ZlcjogJ0phbmUnIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF1c2FibGVIYW5kbGVyPFRTY29wZSA9IGFueSwgVElucHV0ID0gdW5rbm93biwgVFBhdXNlRGF0YSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIEZpcnN0LXJ1biBwaGFzZS4gUmV0dXJuIGRhdGEgdG8gcGF1c2UsIG9yIHZvaWQvdW5kZWZpbmVkIHRvIGNvbnRpbnVlIG5vcm1hbGx5LlxuICAgKlxuICAgKiBBbnkgbm9uLXZvaWQgcmV0dXJuIHZhbHVlIGJlY29tZXMgdGhlIGBwYXVzZURhdGFgIGluIHRoZSBjaGVja3BvaW50LlxuICAgKiBUaGUgY29uc3VtZXIgZGVmaW5lcyB0aGUgYFRQYXVzZURhdGFgIHR5cGUg4oCUIHRoZSBGRSB1c2VzIGl0IHRvIHJlbmRlclxuICAgKiB0aGUgcmlnaHQgVUkgKGZvcm0gZmllbGRzLCBhcHByb3ZhbCBidXR0b25zLCBldGMuKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBUUGF1c2VEYXRhID0geyBxdWVzdGlvbjogc3RyaW5nOyByaXNrTGV2ZWw6IHN0cmluZyB9XG4gICAqIGNvbnN0IGhhbmRsZXI6IFBhdXNhYmxlSGFuZGxlcjxNeVN0YXRlLCB7IGFwcHJvdmVkOiBib29sZWFuIH0sIHsgcXVlc3Rpb246IHN0cmluZzsgcmlza0xldmVsOiBzdHJpbmcgfT4gPSB7XG4gICAqICAgZXhlY3V0ZTogYXN5bmMgKHNjb3BlKSA9PiB7XG4gICAqICAgICByZXR1cm4geyBxdWVzdGlvbjogYEFwcHJvdmUgb3JkZXIgJHtzY29wZS5vcmRlcklkfT9gLCByaXNrTGV2ZWw6ICdoaWdoJyB9O1xuICAgKiAgIH0sXG4gICAqICAgcmVzdW1lOiBhc3luYyAoc2NvcGUsIGlucHV0KSA9PiB7XG4gICAqICAgICBzY29wZS5hcHByb3ZlZCA9IGlucHV0LmFwcHJvdmVkO1xuICAgKiAgIH0sXG4gICAqIH07XG4gICAqIGBgYFxuICAgKi9cbiAgZXhlY3V0ZTogKHNjb3BlOiBUU2NvcGUpID0+IFByb21pc2U8VFBhdXNlRGF0YSB8IHZvaWQ+IHwgVFBhdXNlRGF0YSB8IHZvaWQ7XG4gIC8qKlxuICAgKiBSZXN1bWUgcGhhc2UuIENhbGxlZCB3aXRoIHRoZSByZXN1bWUgaW5wdXQgd2hlbiBleGVjdXRpb24gY29udGludWVzLlxuICAgKlxuICAgKiBUaGUgc2NvcGUgaXMgcmVzdG9yZWQgZnJvbSB0aGUgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAuIFdyaXRlcyBkdXJpbmdcbiAgICogYHJlc3VtZWAgYXJlIGNvbW1pdHRlZCBhbmQgdmlzaWJsZSB0byBzdWJzZXF1ZW50IHN0YWdlcy5cbiAgICovXG4gIHJlc3VtZTogKHNjb3BlOiBUU2NvcGUsIGlucHV0OiBUSW5wdXQpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufVxuXG4vLyDilIDilIAgVHlwZSBndWFyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYSBQYXVzZVJlc3VsdCAoc3RhZ2Ugd2FudHMgdG8gcGF1c2UpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGF1c2VSZXN1bHQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQYXVzZVJlc3VsdCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBQYXVzZVJlc3VsdCkucGF1c2UgPT09IHRydWU7XG59XG5cbi8qKiBDaGVjayBpZiBhbiBlcnJvciBpcyBhIFBhdXNlU2lnbmFsLiBVc2VzIGluc3RhbmNlb2YgKyBuYW1lIGJyYW5kIGZhbGxiYWNrIGZvciBjcm9zcy1yZWFsbSBzYWZldHkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXVzZVNpZ25hbChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIFBhdXNlU2lnbmFsIHtcbiAgLy8gVG90YWw6IGEgUHJveHkgd2hvc2UgYGdldFByb3RvdHlwZU9mYCB0cmFwIHRocm93cyAob3IgYSByZXZva2VkIFByb3h5KVxuICAvLyBpcyBub3QgYSBzaWduYWwg4oCUIHRoZSBlbmdpbmUncyBjYXRjaCBibG9ja3MgYXNrIHRoaXMgZmlyc3QsIGFuZCBtdXN0XG4gIC8vIG5vdCB0cmFkZSB0aGUgc3RhZ2UncyB0aHJvd24gdmFsdWUgZm9yIHRoZSB0cmFwJ3MgZXJyb3IuXG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgUGF1c2VTaWduYWwgfHxcbiAgICAgIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgIGVycm9yLm5hbWUgPT09ICdQYXVzZVNpZ25hbCcgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAncGF1c2VEYXRhJykgJiZcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCAnc3RhZ2VJZCcpKVxuICAgICk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
@@ -105,6 +105,9 @@ export declare class FlowChartExecutor<TOut = any, TScope = any> {
|
|
|
105
105
|
* JSON-serializable (store it in Redis, Postgres, localStorage…) and fully
|
|
106
106
|
* DETACHED from engine state (`checkpoint.ts`): mutating or persisting it
|
|
107
107
|
* cannot affect the executor, nor a later resume a checkpoint you stored.
|
|
108
|
+
* LEAN: what `resume()` reads and the pause's own record — its size is the
|
|
109
|
+
* state's, never the run's length. The run's history (execution tree,
|
|
110
|
+
* commit log, subflow results) is {@link getSnapshot}'s.
|
|
108
111
|
*
|
|
109
112
|
* @example
|
|
110
113
|
* ```typescript
|