@mnaoumov/typescript-lib 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/dist/lib/cjs/api-contract.cjs +49 -3
- package/dist/lib/cjs/api-contract.d.cts +86 -0
- package/dist/lib/cjs/async.cjs +5 -8
- package/dist/lib/cjs/async.d.cts +3 -6
- package/dist/lib/cjs/debug-switches.cjs +125 -0
- package/dist/lib/cjs/debug-switches.d.cts +124 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/type-guards.cjs +79 -3
- package/dist/lib/cjs/type-guards.d.cts +142 -1
- package/dist/lib/cjs/type.cjs +1 -1
- package/dist/lib/esm/api-contract.d.mts +86 -0
- package/dist/lib/esm/api-contract.mjs +47 -3
- package/dist/lib/esm/async.d.mts +3 -6
- package/dist/lib/esm/async.mjs +5 -8
- package/dist/lib/esm/debug-switches.d.mts +124 -0
- package/dist/lib/esm/debug-switches.mjs +96 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/type-guards.d.mts +142 -1
- package/dist/lib/esm/type-guards.mjs +67 -2
- package/dist/lib/esm/type.mjs +1 -1
- package/package.json +3 -2
|
@@ -6,17 +6,30 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
6
6
|
import { LIBRARY_NAME } from "./library.mjs";
|
|
7
7
|
import { castTo } from "./object-utils.mjs";
|
|
8
8
|
import {
|
|
9
|
+
arrayTypeGuard,
|
|
10
|
+
instanceOfTypeGuard,
|
|
9
11
|
isBoolean,
|
|
10
12
|
isNumber,
|
|
11
13
|
isString,
|
|
12
14
|
isStringArray,
|
|
13
|
-
isUndefined
|
|
15
|
+
isUndefined,
|
|
16
|
+
literalTypeGuard,
|
|
17
|
+
unionTypeGuard
|
|
14
18
|
} from "./type-guards.mjs";
|
|
15
19
|
const BOOLEAN_GUARD = { expected: "a boolean", typeGuard: isBoolean };
|
|
16
20
|
const NUMBER_GUARD = { expected: "a number", typeGuard: isNumber };
|
|
17
21
|
const STRING_GUARD = { expected: "a string", typeGuard: isString };
|
|
18
22
|
const STRING_ARRAY_GUARD = { expected: "an array of strings", typeGuard: isStringArray };
|
|
19
23
|
const UNDEFINED_GUARD = { expected: "undefined", typeGuard: isUndefined };
|
|
24
|
+
function arrayGuard(itemGuard) {
|
|
25
|
+
return createExpectedTypeGuard(`an array whose every item is ${itemGuard.expected}`, arrayTypeGuard(itemGuard.typeGuard));
|
|
26
|
+
}
|
|
27
|
+
function createApiContractSchemaBuilders(vendor) {
|
|
28
|
+
return {
|
|
29
|
+
createArgumentsSchema: (parameters) => createArgumentsSchema(parameters, { vendor }),
|
|
30
|
+
createTypeGuardSchema: (guard) => createTypeGuardSchema({ ...guard, vendor })
|
|
31
|
+
};
|
|
32
|
+
}
|
|
20
33
|
function createArgumentsSchema(parameters, options) {
|
|
21
34
|
const parameterList = castTo(parameters);
|
|
22
35
|
return createSchema((value) => {
|
|
@@ -30,6 +43,9 @@ function createArgumentsSchema(parameters, options) {
|
|
|
30
43
|
return issues.length === 0 ? { value: castTo(value) } : { issues };
|
|
31
44
|
}, options?.vendor);
|
|
32
45
|
}
|
|
46
|
+
function createExpectedTypeGuard(expected, typeGuard) {
|
|
47
|
+
return { expected, typeGuard };
|
|
48
|
+
}
|
|
33
49
|
function createTypeGuardSchema(params) {
|
|
34
50
|
return createSchema(
|
|
35
51
|
(value) => params.typeGuard(value) ? { value } : { issues: [{ message: `Expected ${params.expected}.` }] },
|
|
@@ -39,6 +55,13 @@ function createTypeGuardSchema(params) {
|
|
|
39
55
|
function defineApiContract(contract) {
|
|
40
56
|
return contract;
|
|
41
57
|
}
|
|
58
|
+
function instanceOfGuard(constructor) {
|
|
59
|
+
return createExpectedTypeGuard(`an instance of ${constructor.name}`, instanceOfTypeGuard(constructor));
|
|
60
|
+
}
|
|
61
|
+
function literalGuard(literals) {
|
|
62
|
+
const literalList = isReadonlyArray(literals) ? literals : Object.keys(literals);
|
|
63
|
+
return createExpectedTypeGuard(`one of ${literalList.map((literal) => formatLiteral(literal)).join(", ")}`, literalTypeGuard(literalList));
|
|
64
|
+
}
|
|
42
65
|
function nullableGuard(guard) {
|
|
43
66
|
return {
|
|
44
67
|
expected: `${guard.expected} or null`,
|
|
@@ -51,6 +74,12 @@ function optionalGuard(guard) {
|
|
|
51
74
|
typeGuard: (value) => value === void 0 || guard.typeGuard(value)
|
|
52
75
|
};
|
|
53
76
|
}
|
|
77
|
+
function unionGuard(...guards) {
|
|
78
|
+
return createExpectedTypeGuard(
|
|
79
|
+
guards.map((guard) => guard.expected).join(" or "),
|
|
80
|
+
unionTypeGuard(...guards.map((guard) => guard.typeGuard))
|
|
81
|
+
);
|
|
82
|
+
}
|
|
54
83
|
function createSchema(validate, vendor) {
|
|
55
84
|
return {
|
|
56
85
|
"~standard": {
|
|
@@ -60,16 +89,31 @@ function createSchema(validate, vendor) {
|
|
|
60
89
|
}
|
|
61
90
|
};
|
|
62
91
|
}
|
|
92
|
+
function formatLiteral(literal) {
|
|
93
|
+
if (isString(literal)) {
|
|
94
|
+
return `'${literal}'`;
|
|
95
|
+
}
|
|
96
|
+
return typeof literal === "bigint" ? `${String(literal)}n` : String(literal);
|
|
97
|
+
}
|
|
98
|
+
function isReadonlyArray(value) {
|
|
99
|
+
return Array.isArray(value);
|
|
100
|
+
}
|
|
63
101
|
export {
|
|
64
102
|
BOOLEAN_GUARD,
|
|
65
103
|
NUMBER_GUARD,
|
|
66
104
|
STRING_ARRAY_GUARD,
|
|
67
105
|
STRING_GUARD,
|
|
68
106
|
UNDEFINED_GUARD,
|
|
107
|
+
arrayGuard,
|
|
108
|
+
createApiContractSchemaBuilders,
|
|
69
109
|
createArgumentsSchema,
|
|
110
|
+
createExpectedTypeGuard,
|
|
70
111
|
createTypeGuardSchema,
|
|
71
112
|
defineApiContract,
|
|
113
|
+
instanceOfGuard,
|
|
114
|
+
literalGuard,
|
|
72
115
|
nullableGuard,
|
|
73
|
-
optionalGuard
|
|
116
|
+
optionalGuard,
|
|
117
|
+
unionGuard
|
|
74
118
|
};
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHsgTElCUkFSWV9OQU1FIH0gZnJvbSAnLi9saWJyYXJ5LnRzJztcbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzU3RyaW5nLFxuICBpc1N0cmluZ0FycmF5LFxuICBpc1VuZGVmaW5lZFxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBUaGUgY29udHJhY3QgYW4gQVBJIGRlY2xhcmVzOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBwcm9taXNlcyB0byBleHBvc2UsIGFuZCBpdHMgdmFsdWUgb3B0aW9uYWxseVxuICogY2FycmllcyB0aGUgcGF5bG9hZCBzY2hlbWFzIGZvciB0aGF0IG1ldGhvZC5cbiAqXG4gKiBUeXBlZCBvdmVyIHRoZSBBUEkgd2hlbiBvbmUgaXMgbmFtZWQ6IGBBcGlDb250cmFjdDxNeUFwaT5gIGhhcyBleGFjdGx5IG9uZSBlbnRyeSBwZXIgZnVuY3Rpb24gbWVtYmVyIG9mXG4gKiBgTXlBcGlgIChhIG1pc3NpbmcgbWV0aG9kLCBhbiBleHRyYSBvbmUgb3IgYSBtaXNzcGVsbGVkIG9uZSBkb2VzIG5vdCBjb21waWxlKSwgYW5kIGVhY2ggZW50cnkncyBzY2hlbWFzIG11c3RcbiAqIHByb2R1Y2UgdGhhdCBtZXRob2QncyBwYXJhbWV0ZXJzIGFuZCBhd2FpdGVkIHJldHVybiB2YWx1ZS4gV2l0aG91dCBhIHR5cGUgYXJndW1lbnQsIG9yIGZvciBgb2JqZWN0YCwgaXQgaXMgdGhlXG4gKiBsb29zZSByZWNvcmQgYSByZWFkZXIgdGhhdCBrbm93cyBub3RoaW5nIGFib3V0IHRoZSBBUEkgc2Vlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuIGBvYmplY3RgLCB0aGUgZGVmYXVsdCwgbWVhbnMgXCJub3QgdHlwZWRcIi5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4gPSBvYmplY3QgZXh0ZW5kcyBUQXBpID8gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQXBpTWV0aG9kQ29udHJhY3Q+PlxuICA6IFR5cGVkQXBpQ29udHJhY3Q8VEFwaT47XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBhcyBhIHR1cGxlLCB3aGljaCB0aGUgaW5wdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqIEB0eXBlUGFyYW0gVFJldHVyblZhbHVlIC0gVGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSwgYXdhaXRlZCwgd2hpY2ggdGhlIG91dHB1dCBzY2hlbWEgbXVzdCBwcm9kdWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaU1ldGhvZENvbnRyYWN0PFRQYXJhbWV0ZXJzID0gdW5rbm93biwgVFJldHVyblZhbHVlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRQYXJhbWV0ZXJzPjtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRSZXR1cm5WYWx1ZT47XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbiBtZW1iZXJzIG9mIGFuIEFQSSwgd2hpY2ggYXJlIGV4YWN0bHkgdGhlIGtleXMgYSB0eXBlZCB7QGxpbmsgQXBpQ29udHJhY3R9IGhhcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJLlxuICovXG5leHBvcnQgdHlwZSBBcGlNZXRob2ROYW1lPFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ga2V5b2YgQXBpTWV0aG9kczxUQXBpPiAmIHN0cmluZztcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kczxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVEFwaSBhcyBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IG5ldmVyKSA9PiB1bmtub3duID8gVEtleSA6IG5ldmVyXTogVEFwaVtUS2V5XTtcbn07XG5cbi8qKlxuICogT25lIHR5cGUgZ3VhcmQgcGVyIHBhcmFtZXRlciBvZiBhIG1ldGhvZCwgaW4gb3JkZXIuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgdHlwZSBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+ID0ge1xuICByZWFkb25seSBbVEluZGV4IGluIGtleW9mIFRQYXJhbWV0ZXJzXTogRXhwZWN0ZWRUeXBlR3VhcmQ8VFBhcmFtZXRlcnNbVEluZGV4XT47XG59O1xuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlQXJndW1lbnRzU2NoZW1hfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcmd1bWVudHNTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBTdGFuZGFyZCBTY2hlbWEgYHZlbmRvcmAgdGhlIHNjaGVtYSByZXBvcnRzLiBEZWZhdWx0cyB0byB0aGlzIGxpYnJhcnkncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVuZG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9OiB0aGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4gZXh0ZW5kcyBFeHBlY3RlZFR5cGVHdWFyZDxUPiB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgdmFsdWUgYSBzY2hlbWEgYWNjZXB0cywgZGVzY3JpYmVkIGJ5IGEgdHlwZSBndWFyZCBhbmQgYnkgd2hhdCBpdCBleHBlY3RzLCBmb3IgdGhlIGlzc3VlIG1lc3NhZ2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogV2hhdCB0aGUgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiwgcGhyYXNlZCB0byBmb2xsb3cgXCJFeHBlY3RlZFwiLCBlLmcuIGAnYSBzdHJpbmcnYC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciB0aGUgdmFsdWUgaXMgYWNjZXB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIGBUYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGVHdWFyZDogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBUO1xufVxuXG4vKipcbiAqIFRoZSB7QGxpbmsgQXBpQ29udHJhY3R9IG9mIGEgbmFtZWQgQVBJOiBvbmUgZW50cnkgcGVyIGZ1bmN0aW9uIG1lbWJlciwgZWFjaCB0eXBlZCBhZ2FpbnN0IHRoYXQgbWVtYmVyLiBCb3RoXG4gKiBzY2hlbWFzIGFyZSBSRVFVSVJFRCBoZXJlLCBzbyBhIHR5cGVkIGNvbnRyYWN0IGlzIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiBldmVyeSBzaWduYXR1cmUgYW5kIGEgYHt9YCBlbnRyeSBkb2VzXG4gKiBub3QgY29tcGlsZS4gT25seSB0aGUgbG9vc2UgZm9ybSBsZWF2ZXMgdGhlbSBvcHRpb25hbC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFR5cGVkQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdD4gPSB7XG4gIHJlYWRvbmx5IFtUS2V5IGluIEFwaU1ldGhvZE5hbWU8VEFwaT5dLT86IFRBcGlbVEtleV0gZXh0ZW5kcyAoLi4uYXJndW1lbnRzXzogaW5mZXIgVFBhcmFtZXRlcnMpID0+IGluZmVyIFRSZXR1cm5WYWx1ZSA/IFJlcXVpcmVkPEFwaU1ldGhvZENvbnRyYWN0PFRQYXJhbWV0ZXJzLCBBd2FpdGVkPFRSZXR1cm5WYWx1ZT4+PlxuICAgIDogbmV2ZXI7XG59O1xuXG50eXBlIE11dGFibGVUdXBsZTxUVHVwbGUgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+ID0geyAtcmVhZG9ubHkgW1RJbmRleCBpbiBrZXlvZiBUVHVwbGVdOiBUVHVwbGVbVEluZGV4XSB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYSBib29sZWFuLlxuICovXG5leHBvcnQgY29uc3QgQk9PTEVBTl9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8Ym9vbGVhbj4gPSB7IGV4cGVjdGVkOiAnYSBib29sZWFuJywgdHlwZUd1YXJkOiBpc0Jvb2xlYW4gfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgY29uc3QgTlVNQkVSX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxudW1iZXI+ID0geyBleHBlY3RlZDogJ2EgbnVtYmVyJywgdHlwZUd1YXJkOiBpc051bWJlciB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYSBzdHJpbmcuIFNwcmVhZCBpdCB0byBzYXkgd2hhdCB0aGUgc3RyaW5nIGlzOiBgeyAuLi5TVFJJTkdfR1VBUkQsIGV4cGVjdGVkOiAnYSBwYXRoJyB9YC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUklOR19HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8c3RyaW5nPiA9IHsgZXhwZWN0ZWQ6ICdhIHN0cmluZycsIHR5cGVHdWFyZDogaXNTdHJpbmcgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdfQVJSQVlfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHN0cmluZ1tdPiA9IHsgZXhwZWN0ZWQ6ICdhbiBhcnJheSBvZiBzdHJpbmdzJywgdHlwZUd1YXJkOiBpc1N0cmluZ0FycmF5IH07XG5cbi8qKlxuICogQWNjZXB0cyBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgdGhlIG91dHB1dCBvZiBhIG1ldGhvZCByZXR1cm5pbmcgYHZvaWRgIG9yIGBQcm9taXNlPHZvaWQ+YC5cbiAqL1xuZXhwb3J0IGNvbnN0IFVOREVGSU5FRF9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8dW5kZWZpbmVkPiA9IHsgZXhwZWN0ZWQ6ICd1bmRlZmluZWQnLCB0eXBlR3VhcmQ6IGlzVW5kZWZpbmVkIH07XG5cbi8qKlxuICogQnVpbGRzIHRoZSBpbnB1dCBzY2hlbWEgb2YgYSBtZXRob2QgY29udHJhY3Q6IGEgc2NoZW1hIG92ZXIgdGhlIG1ldGhvZCdzIEFSR1VNRU5UIExJU1QsIG9uZSB0eXBlIGd1YXJkIHBlclxuICogcGFyYW1ldGVyLiBBbiBhcmd1bWVudCB0aGF0IGZhaWxzIGl0cyBndWFyZCBpcyByZXBvcnRlZCB3aXRoIGl0cyBpbmRleCBhcyB0aGUgaXNzdWUgcGF0aCwgYW5kIGFuIGFyZ3VtZW50IGxpc3RcbiAqIGxvbmdlciB0aGFuIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyByZWZ1c2VkLiBBIG1pc3NpbmcgYXJndW1lbnQgcmVhY2hlcyBpdHMgZ3VhcmQgYXMgYHVuZGVmaW5lZGAsIHNvIGFuIG9wdGlvbmFsXG4gKiBwYXJhbWV0ZXIncyBndWFyZCBhY2NlcHRzIGB1bmRlZmluZWRgIChzZWUge0BsaW5rIG9wdGlvbmFsR3VhcmR9KS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXJhbWV0ZXJzIC0gVGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMsIGluZmVycmVkIGZyb20gdGhlIGd1YXJkcyBvciBmcm9tIHRoZSBjb250cmFjdCBlbnRyeS5cbiAqIEBwYXJhbSBwYXJhbWV0ZXJzIC0gT25lIGd1YXJkIHBlciBwYXJhbWV0ZXIsIGluIG9yZGVyLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHNjaGVtYS5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcmd1bWVudHNTY2hlbWE8Y29uc3QgVFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KFxuICBwYXJhbWV0ZXJzOiBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnM+LFxuICBvcHRpb25zPzogQ3JlYXRlQXJndW1lbnRzU2NoZW1hT3B0aW9uc1xuKTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+PiB7XG4gIGNvbnN0IHBhcmFtZXRlckxpc3QgPSBjYXN0VG88cmVhZG9ubHkgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj5bXT4ocGFyYW1ldGVycyk7XG4gIHJldHVybiBjcmVhdGVTY2hlbWEoKHZhbHVlOiB1bmtub3duKTogU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8TXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4gPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGlzc3VlczogW3sgbWVzc2FnZTogJ0V4cGVjdGVkIGFuIGFyZ3VtZW50IGxpc3QuJyB9XSB9O1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBwYXJhbWV0ZXJMaXN0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgaXNzdWVzOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgYXQgbW9zdCAke1N0cmluZyhwYXJhbWV0ZXJMaXN0Lmxlbmd0aCl9IGFyZ3VtZW50KHMpLCBnb3QgJHtTdHJpbmcodmFsdWUubGVuZ3RoKX0uYCB9XSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlzc3VlcyA9IHBhcmFtZXRlckxpc3QuZmxhdE1hcCgocGFyYW1ldGVyLCBpbmRleCk6IFN0YW5kYXJkU2NoZW1hVjEuSXNzdWVbXSA9PiBwYXJhbWV0ZXIudHlwZUd1YXJkKHZhbHVlW2luZGV4XSkgPyBbXSA6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCAke3BhcmFtZXRlci5leHBlY3RlZH0uYCwgcGF0aDogW2luZGV4XSB9XSk7XG4gICAgcmV0dXJuIGlzc3Vlcy5sZW5ndGggPT09IDAgPyB7IHZhbHVlOiBjYXN0VG88TXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4odmFsdWUpIH0gOiB7IGlzc3VlcyB9O1xuICB9LCBvcHRpb25zPy52ZW5kb3IpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHNjaGVtYSBvdmVyIG9uZSB2YWx1ZSBmcm9tIGEgdHlwZSBndWFyZDogdGhlIG91dHB1dCBzY2hlbWEgb2YgYSBtZXRob2QgY29udHJhY3QsIHR5cGljYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlR3VhcmRTY2hlbWE8VD4ocGFyYW1zOiBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4pOiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZVNjaGVtYShcbiAgICAodmFsdWU6IHVua25vd24pOiBTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDxUPiA9PiBwYXJhbXMudHlwZUd1YXJkKHZhbHVlKSA/IHsgdmFsdWUgfSA6IHsgaXNzdWVzOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbXMuZXhwZWN0ZWR9LmAgfV0gfSxcbiAgICBwYXJhbXMudmVuZG9yXG4gICk7XG59XG5cbi8qKlxuICogU3RhdGVzIGEgY29udHJhY3QgYWdhaW5zdCBhbiBBUEkgdHlwZSwgc28gZXZlcnkgZW50cnkgaXMgY2hlY2tlZCBhZ2FpbnN0IGl0cyBtZXRob2QgYW5kIHRoZSBzY2hlbWEgYnVpbGRlcnNcbiAqIGluc2lkZSBpdCBpbmZlciB0aGVpciB0eXBlcyBmcm9tIHRoZSBtZXRob2QgcmF0aGVyIHRoYW4gZnJvbSBhIHJlc3RhdGVkIHR1cGxlLiBJdCByZXR1cm5zIHRoZSBjb250cmFjdCBhcyBpcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuXG4gKiBAcGFyYW0gY29udHJhY3QgLSBUaGUgY29udHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgc2FtZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+KGNvbnRyYWN0OiBUeXBlZEFwaUNvbnRyYWN0PE5vSW5mZXI8VEFwaT4+KTogVHlwZWRBcGlDb250cmFjdDxUQXBpPiB7XG4gIHJldHVybiBjb250cmFjdDtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgbnVsbGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVHdWFyZDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxudWxsIHwgVD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgbnVsbGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgVCA9PiB2YWx1ZSA9PT0gbnVsbCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogV2lkZW5zIGEgZ3VhcmQgdG8gYWxzbyBhY2NlcHQgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHdoYXQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHJlY2VpdmVzIHdoZW4gaXQgaXMgbGVmdCBvdXQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHtcbiAgICBleHBlY3RlZDogYCR7Z3VhcmQuZXhwZWN0ZWR9IG9yIHVuZGVmaW5lZGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUIHwgdW5kZWZpbmVkID0+IHZhbHVlID09PSB1bmRlZmluZWQgfHwgZ3VhcmQudHlwZUd1YXJkKHZhbHVlKVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTY2hlbWE8VD4odmFsaWRhdGU6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8VD4sIHZlbmRvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUPiB7XG4gIHJldHVybiB7XG4gICAgJ35zdGFuZGFyZCc6IHtcbiAgICAgIHZhbGlkYXRlLFxuICAgICAgdmVuZG9yOiB2ZW5kb3IgPz8gTElCUkFSWV9OQU1FLFxuICAgICAgdmVyc2lvbjogMVxuICAgIH1cbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBaUJBLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXNIQSxNQUFNLGdCQUE0QyxFQUFFLFVBQVUsYUFBYSxXQUFXLFVBQVU7QUFLaEcsTUFBTSxlQUEwQyxFQUFFLFVBQVUsWUFBWSxXQUFXLFNBQVM7QUFLNUYsTUFBTSxlQUEwQyxFQUFFLFVBQVUsWUFBWSxXQUFXLFNBQVM7QUFLNUYsTUFBTSxxQkFBa0QsRUFBRSxVQUFVLHVCQUF1QixXQUFXLGNBQWM7QUFLcEgsTUFBTSxrQkFBZ0QsRUFBRSxVQUFVLGFBQWEsV0FBVyxZQUFZO0FBYXRHLFNBQVMsc0JBQ2QsWUFDQSxTQUNzRDtBQUN0RCxRQUFNLGdCQUFnQixPQUE4QyxVQUFVO0FBQzlFLFNBQU8sYUFBYSxDQUFDLFVBQXVFO0FBQzFGLFFBQUksQ0FBQyxNQUFNLFFBQVEsS0FBSyxHQUFHO0FBQ3pCLGFBQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLDZCQUE2QixDQUFDLEVBQUU7QUFBQSxJQUMvRDtBQUVBLFFBQUksTUFBTSxTQUFTLGNBQWMsUUFBUTtBQUN2QyxhQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsU0FBUyxvQkFBb0IsT0FBTyxjQUFjLE1BQU0sQ0FBQyxxQkFBcUIsT0FBTyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUFBLElBQy9IO0FBRUEsVUFBTSxTQUFTLGNBQWMsUUFBUSxDQUFDLFdBQVcsVUFBb0MsVUFBVSxVQUFVLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLFlBQVksVUFBVSxRQUFRLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0wsV0FBTyxPQUFPLFdBQVcsSUFBSSxFQUFFLE9BQU8sT0FBa0MsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPO0FBQUEsRUFDOUYsR0FBRyxTQUFTLE1BQU07QUFDcEI7QUFTTyxTQUFTLHNCQUF5QixRQUFzRTtBQUM3RyxTQUFPO0FBQUEsSUFDTCxDQUFDLFVBQStDLE9BQU8sVUFBVSxLQUFLLElBQUksRUFBRSxNQUFNLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLFlBQVksT0FBTyxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDOUksT0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVVPLFNBQVMsa0JBQXVDLFVBQW1FO0FBQ3hILFNBQU87QUFDVDtBQVNPLFNBQVMsY0FBaUIsT0FBMEQ7QUFDekYsU0FBTztBQUFBLElBQ0wsVUFBVSxHQUFHLE1BQU0sUUFBUTtBQUFBLElBQzNCLFdBQVcsQ0FBQyxVQUFzQyxVQUFVLFFBQVEsTUFBTSxVQUFVLEtBQUs7QUFBQSxFQUMzRjtBQUNGO0FBU08sU0FBUyxjQUFpQixPQUErRDtBQUM5RixTQUFPO0FBQUEsSUFDTCxVQUFVLEdBQUcsTUFBTSxRQUFRO0FBQUEsSUFDM0IsV0FBVyxDQUFDLFVBQTJDLFVBQVUsVUFBYSxNQUFNLFVBQVUsS0FBSztBQUFBLEVBQ3JHO0FBQ0Y7QUFFQSxTQUFTLGFBQWdCLFVBQTBELFFBQTBEO0FBQzNJLFNBQU87QUFBQSxJQUNMLGFBQWE7QUFBQSxNQUNYO0FBQUEsTUFDQSxRQUFRLFVBQVU7QUFBQSxNQUNsQixTQUFTO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHR5cGUge1xuICBHdWFyZGVkVHlwZSxcbiAgTGl0ZXJhbCxcbiAgVHlwZUd1YXJkXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuXG5pbXBvcnQgeyBMSUJSQVJZX05BTUUgfSBmcm9tICcuL2xpYnJhcnkudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYXJyYXlUeXBlR3VhcmQsXG4gIGluc3RhbmNlT2ZUeXBlR3VhcmQsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzU3RyaW5nLFxuICBpc1N0cmluZ0FycmF5LFxuICBpc1VuZGVmaW5lZCxcbiAgbGl0ZXJhbFR5cGVHdWFyZCxcbiAgdW5pb25UeXBlR3VhcmRcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IGFuIEFQSSBkZWNsYXJlczogZXZlcnkga2V5IGlzIGEgbWV0aG9kIHRoZSBBUEkgcHJvbWlzZXMgdG8gZXhwb3NlLCBhbmQgaXRzIHZhbHVlIG9wdGlvbmFsbHlcbiAqIGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVHlwZWQgb3ZlciB0aGUgQVBJIHdoZW4gb25lIGlzIG5hbWVkOiBgQXBpQ29udHJhY3Q8TXlBcGk+YCBoYXMgZXhhY3RseSBvbmUgZW50cnkgcGVyIGZ1bmN0aW9uIG1lbWJlciBvZlxuICogYE15QXBpYCAoYSBtaXNzaW5nIG1ldGhvZCwgYW4gZXh0cmEgb25lIG9yIGEgbWlzc3BlbGxlZCBvbmUgZG9lcyBub3QgY29tcGlsZSksIGFuZCBlYWNoIGVudHJ5J3Mgc2NoZW1hcyBtdXN0XG4gKiBwcm9kdWNlIHRoYXQgbWV0aG9kJ3MgcGFyYW1ldGVycyBhbmQgYXdhaXRlZCByZXR1cm4gdmFsdWUuIFdpdGhvdXQgYSB0eXBlIGFyZ3VtZW50LCBvciBmb3IgYG9iamVjdGAsIGl0IGlzIHRoZVxuICogbG9vc2UgcmVjb3JkIGEgcmVhZGVyIHRoYXQga25vd3Mgbm90aGluZyBhYm91dCB0aGUgQVBJIHNlZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgY29udHJhY3QgZGVzY3JpYmVzLiBgb2JqZWN0YCwgdGhlIGRlZmF1bHQsIG1lYW5zIFwibm90IHR5cGVkXCIuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+ID0gb2JqZWN0IGV4dGVuZHMgVEFwaSA/IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEFwaU1ldGhvZENvbnRyYWN0Pj5cbiAgOiBUeXBlZEFwaUNvbnRyYWN0PFRBcGk+O1xuXG4vKipcbiAqIFRoZSBzY2hlbWEgYnVpbGRlcnMgb2YgdGhpcyBtb2R1bGUgd2l0aCB0aGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIGFscmVhZHkgYm91bmQsIGFzXG4gKiB7QGxpbmsgY3JlYXRlQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVyc30gcmV0dXJucyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnMge1xuICAvKipcbiAgICoge0BsaW5rIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYX0sIHJlcG9ydGluZyB0aGUgYm91bmQgdmVuZG9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRQYXJhbWV0ZXJzIC0gVGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMsIGluZmVycmVkIGZyb20gdGhlIGd1YXJkcyBvciBmcm9tIHRoZSBjb250cmFjdCBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPbmUgZ3VhcmQgcGVyIHBhcmFtZXRlciwgaW4gb3JkZXIuXG4gICAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVBcmd1bWVudHNTY2hlbWE6IDxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4oXG4gICAgcGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPlxuICApID0+IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgTXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj47XG5cbiAgLyoqXG4gICAqIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9LCByZXBvcnRpbmcgdGhlIGJvdW5kIHZlbmRvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gICAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCBhbmQgd2hhdCBpdCBleHBlY3RzLlxuICAgKiBAcmV0dXJucyBUaGUgc2NoZW1hLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlVHlwZUd1YXJkU2NoZW1hOiA8VD4oZ3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KSA9PiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNjaGVtYXMgZm9yIGEgc2luZ2xlIEFQSSBtZXRob2QuIEJvdGggaGFsdmVzIGFyZSBvcHRpb25hbDogYSBtZXRob2QgbWF5IGRlY2xhcmUgb25seSBpdHMgaW5wdXQsXG4gKiBvbmx5IGl0cyBvdXRwdXQsIG5laXRoZXIgKHRoZSBlbnRyeSB0aGVuIGp1c3QgZGVjbGFyZXMgdGhhdCB0aGUgbWV0aG9kIG11c3QgZXhpc3QpLCBvciBib3RoLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycywgYXMgYSB0dXBsZSwgd2hpY2ggdGhlIGlucHV0IHNjaGVtYSBtdXN0IHByb2R1Y2UuXG4gKiBAdHlwZVBhcmFtIFRSZXR1cm5WYWx1ZSAtIFRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIGF3YWl0ZWQsIHdoaWNoIHRoZSBvdXRwdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNZXRob2RDb250cmFjdDxUUGFyYW1ldGVycyA9IHVua25vd24sIFRSZXR1cm5WYWx1ZSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBhcyBhbiBhcnJheS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUUGFyYW1ldGVycz47XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLCBvciwgd2hlbiB0aGUgbWV0aG9kIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHZhbHVlIGl0IHJlc29sdmVzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0PzogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUUmV0dXJuVmFsdWU+O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEksIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBrZXlzIGEgdHlwZWQge0BsaW5rIEFwaUNvbnRyYWN0fSBoYXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kTmFtZTxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IGtleW9mIEFwaU1ldGhvZHM8VEFwaT4gJiBzdHJpbmc7XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9uIG1lbWJlcnMgb2YgYW4gQVBJLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaU1ldGhvZHM8VEFwaSBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtUS2V5IGluIGtleW9mIFRBcGkgYXMgVEFwaVtUS2V5XSBleHRlbmRzICguLi5hcmd1bWVudHNfOiBuZXZlcikgPT4gdW5rbm93biA/IFRLZXkgOiBuZXZlcl06IFRBcGlbVEtleV07XG59O1xuXG4vKipcbiAqIE9uZSB0eXBlIGd1YXJkIHBlciBwYXJhbWV0ZXIgb2YgYSBtZXRob2QsIGluIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPiA9IHtcbiAgcmVhZG9ubHkgW1RJbmRleCBpbiBrZXlvZiBUUGFyYW1ldGVyc106IEV4cGVjdGVkVHlwZUd1YXJkPFRQYXJhbWV0ZXJzW1RJbmRleF0+O1xufTtcbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXJndW1lbnRzU2NoZW1hT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlVHlwZUd1YXJkU2NoZW1hfTogdGhlIGd1YXJkLCB3aGF0IGl0IGV4cGVjdHMsIGFuZCBvcHRpb25hbGx5IHRoZSBzY2hlbWEncyB2ZW5kb3IuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVHlwZUd1YXJkU2NoZW1hUGFyYW1zPFQ+IGV4dGVuZHMgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogVGhlIFN0YW5kYXJkIFNjaGVtYSBgdmVuZG9yYCB0aGUgc2NoZW1hIHJlcG9ydHMuIERlZmF1bHRzIHRvIHRoaXMgbGlicmFyeSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZW5kb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIHZhbHVlIGEgc2NoZW1hIGFjY2VwdHMsIGRlc2NyaWJlZCBieSBhIHR5cGUgZ3VhcmQgYW5kIGJ5IHdoYXQgaXQgZXhwZWN0cywgZm9yIHRoZSBpc3N1ZSBtZXNzYWdlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgLyoqXG4gICAqIFdoYXQgdGhlIHZhbHVlIHNob3VsZCBoYXZlIGJlZW4sIHBocmFzZWQgdG8gZm9sbG93IFwiRXhwZWN0ZWRcIiwgZS5nLiBgJ2Egc3RyaW5nJ2AuXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGFjY2VwdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBgVGAuXG4gICAqL1xuICByZWFkb25seSB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgVDtcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIEFwaUNvbnRyYWN0fSBvZiBhIG5hbWVkIEFQSTogb25lIGVudHJ5IHBlciBmdW5jdGlvbiBtZW1iZXIsIGVhY2ggdHlwZWQgYWdhaW5zdCB0aGF0IG1lbWJlci4gQm90aFxuICogc2NoZW1hcyBhcmUgUkVRVUlSRUQgaGVyZSwgc28gYSB0eXBlZCBjb250cmFjdCBpcyBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgZXZlcnkgc2lnbmF0dXJlIGFuZCBhIGB7fWAgZW50cnkgZG9lc1xuICogbm90IGNvbXBpbGUuIE9ubHkgdGhlIGxvb3NlIGZvcm0gbGVhdmVzIHRoZW0gb3B0aW9uYWwuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgY29udHJhY3QgZGVzY3JpYmVzLlxuICovXG5leHBvcnQgdHlwZSBUeXBlZEFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBBcGlNZXRob2ROYW1lPFRBcGk+XS0/OiBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IGluZmVyIFRQYXJhbWV0ZXJzKSA9PiBpbmZlciBUUmV0dXJuVmFsdWUgPyBSZXF1aXJlZDxBcGlNZXRob2RDb250cmFjdDxUUGFyYW1ldGVycywgQXdhaXRlZDxUUmV0dXJuVmFsdWU+Pj5cbiAgICA6IG5ldmVyO1xufTtcblxudHlwZSBNdXRhYmxlVHVwbGU8VFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPiA9IHsgLXJlYWRvbmx5IFtUSW5kZXggaW4ga2V5b2YgVFR1cGxlXTogVFR1cGxlW1RJbmRleF0gfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgYm9vbGVhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEJPT0xFQU5fR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPGJvb2xlYW4+ID0geyBleHBlY3RlZDogJ2EgYm9vbGVhbicsIHR5cGVHdWFyZDogaXNCb29sZWFuIH07XG5cbi8qKlxuICogQWNjZXB0cyBhIG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE5VTUJFUl9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8bnVtYmVyPiA9IHsgZXhwZWN0ZWQ6ICdhIG51bWJlcicsIHR5cGVHdWFyZDogaXNOdW1iZXIgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgc3RyaW5nLiBTcHJlYWQgaXQgdG8gc2F5IHdoYXQgdGhlIHN0cmluZyBpczogYHsgLi4uU1RSSU5HX0dVQVJELCBleHBlY3RlZDogJ2EgcGF0aCcgfWAuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHN0cmluZz4gPSB7IGV4cGVjdGVkOiAnYSBzdHJpbmcnLCB0eXBlR3VhcmQ6IGlzU3RyaW5nIH07XG5cbi8qKlxuICogQWNjZXB0cyBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5leHBvcnQgY29uc3QgU1RSSU5HX0FSUkFZX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxzdHJpbmdbXT4gPSB7IGV4cGVjdGVkOiAnYW4gYXJyYXkgb2Ygc3RyaW5ncycsIHR5cGVHdWFyZDogaXNTdHJpbmdBcnJheSB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHRoZSBvdXRwdXQgb2YgYSBtZXRob2QgcmV0dXJuaW5nIGB2b2lkYCBvciBgUHJvbWlzZTx2b2lkPmAuXG4gKi9cbmV4cG9ydCBjb25zdCBVTkRFRklORURfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHVuZGVmaW5lZD4gPSB7IGV4cGVjdGVkOiAndW5kZWZpbmVkJywgdHlwZUd1YXJkOiBpc1VuZGVmaW5lZCB9O1xuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFuIGFycmF5IHdob3NlIGV2ZXJ5IGl0ZW0gYGl0ZW1HdWFyZGAgYWNjZXB0cy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBhbiBpdGVtLlxuICogQHBhcmFtIGl0ZW1HdWFyZCAtIFRoZSBndWFyZCBmb3Igb25lIGl0ZW0uXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUd1YXJkPFQ+KGl0ZW1HdWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxUW10+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBhbiBhcnJheSB3aG9zZSBldmVyeSBpdGVtIGlzICR7aXRlbUd1YXJkLmV4cGVjdGVkfWAsIGFycmF5VHlwZUd1YXJkKGl0ZW1HdWFyZC50eXBlR3VhcmQpKTtcbn1cblxuLyoqXG4gKiBCaW5kcyB0aGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIG9uY2UsIHNvIGEgY29udHJhY3QgZG9lcyBub3QgcGFzcyBpdCB0byBldmVyeSBzY2hlbWEgYnVpbGRlci4gRGVzdHJ1Y3R1cmUgdGhlXG4gKiByZXN1bHQgdW5kZXIgdGhlIGJ1aWxkZXJzJyBvd24gbmFtZXMgYW5kIHRoZSBjYWxscyByZWFkIGV4YWN0bHkgYXMgdGhlIHVuYm91bmQgb25lcyBkbzpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgeyBjcmVhdGVBcmd1bWVudHNTY2hlbWEsIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSB9ID0gY3JlYXRlQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVycygnbXktcGx1Z2luJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmVuZG9yIC0gVGhlIHZlbmRvciBldmVyeSBzY2hlbWEgcmVwb3J0cy5cbiAqIEByZXR1cm5zIFRoZSBib3VuZCBidWlsZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnModmVuZG9yOiBzdHJpbmcpOiBBcGlDb250cmFjdFNjaGVtYUJ1aWxkZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVBcmd1bWVudHNTY2hlbWE6IDxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4ocGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPikgPT4gY3JlYXRlQXJndW1lbnRzU2NoZW1hKHBhcmFtZXRlcnMsIHsgdmVuZG9yIH0pLFxuICAgIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYTogPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPikgPT4gY3JlYXRlVHlwZUd1YXJkU2NoZW1hKHsgLi4uZ3VhcmQsIHZlbmRvciB9KVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgaW5wdXQgc2NoZW1hIG9mIGEgbWV0aG9kIGNvbnRyYWN0OiBhIHNjaGVtYSBvdmVyIHRoZSBtZXRob2QncyBBUkdVTUVOVCBMSVNULCBvbmUgdHlwZSBndWFyZCBwZXJcbiAqIHBhcmFtZXRlci4gQW4gYXJndW1lbnQgdGhhdCBmYWlscyBpdHMgZ3VhcmQgaXMgcmVwb3J0ZWQgd2l0aCBpdHMgaW5kZXggYXMgdGhlIGlzc3VlIHBhdGgsIGFuZCBhbiBhcmd1bWVudCBsaXN0XG4gKiBsb25nZXIgdGhhbiB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgcmVmdXNlZC4gQSBtaXNzaW5nIGFyZ3VtZW50IHJlYWNoZXMgaXRzIGd1YXJkIGFzIGB1bmRlZmluZWRgLCBzbyBhbiBvcHRpb25hbFxuICogcGFyYW1ldGVyJ3MgZ3VhcmQgYWNjZXB0cyBgdW5kZWZpbmVkYCAoc2VlIHtAbGluayBvcHRpb25hbEd1YXJkfSkuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBpbmZlcnJlZCBmcm9tIHRoZSBndWFyZHMgb3IgZnJvbSB0aGUgY29udHJhY3QgZW50cnkuXG4gKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9uZSBndWFyZCBwZXIgcGFyYW1ldGVyLCBpbiBvcmRlci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzY2hlbWEuXG4gKiBAcmV0dXJucyBUaGUgc2NoZW1hLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJndW1lbnRzU2NoZW1hPGNvbnN0IFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPihcbiAgcGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPixcbiAgb3B0aW9ucz86IENyZWF0ZUFyZ3VtZW50c1NjaGVtYU9wdGlvbnNcbik6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgTXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4ge1xuICBjb25zdCBwYXJhbWV0ZXJMaXN0ID0gY2FzdFRvPHJlYWRvbmx5IEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+W10+KHBhcmFtZXRlcnMpO1xuICByZXR1cm4gY3JlYXRlU2NoZW1hKCh2YWx1ZTogdW5rbm93bik6IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+ID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBpc3N1ZXM6IFt7IG1lc3NhZ2U6ICdFeHBlY3RlZCBhbiBhcmd1bWVudCBsaXN0LicgfV0gfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoID4gcGFyYW1ldGVyTGlzdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IGlzc3VlczogW3sgbWVzc2FnZTogYEV4cGVjdGVkIGF0IG1vc3QgJHtTdHJpbmcocGFyYW1ldGVyTGlzdC5sZW5ndGgpfSBhcmd1bWVudChzKSwgZ290ICR7U3RyaW5nKHZhbHVlLmxlbmd0aCl9LmAgfV0gfTtcbiAgICB9XG5cbiAgICBjb25zdCBpc3N1ZXMgPSBwYXJhbWV0ZXJMaXN0LmZsYXRNYXAoKHBhcmFtZXRlciwgaW5kZXgpOiBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10gPT4gcGFyYW1ldGVyLnR5cGVHdWFyZCh2YWx1ZVtpbmRleF0pID8gW10gOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbWV0ZXIuZXhwZWN0ZWR9LmAsIHBhdGg6IFtpbmRleF0gfV0pO1xuICAgIHJldHVybiBpc3N1ZXMubGVuZ3RoID09PSAwID8geyB2YWx1ZTogY2FzdFRvPE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+KHZhbHVlKSB9IDogeyBpc3N1ZXMgfTtcbiAgfSwgb3B0aW9ucz8udmVuZG9yKTtcbn1cblxuLyoqXG4gKiBQYWlycyBhIHR5cGUgZ3VhcmQgd2l0aCB3aGF0IGl0IGV4cGVjdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZXhwZWN0ZWQgLSBXaGF0IHRoZSB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuLCBwaHJhc2VkIHRvIGZvbGxvdyBcIkV4cGVjdGVkXCIsIGUuZy4gYCdhIHN0cmluZydgLlxuICogQHBhcmFtIHR5cGVHdWFyZCAtIFRoZSBndWFyZC5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkPFQ+KGV4cGVjdGVkOiBzdHJpbmcsIHR5cGVHdWFyZDogVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICByZXR1cm4geyBleHBlY3RlZCwgdHlwZUd1YXJkIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2NoZW1hIG92ZXIgb25lIHZhbHVlIGZyb20gYSB0eXBlIGd1YXJkOiB0aGUgb3V0cHV0IHNjaGVtYSBvZiBhIG1ldGhvZCBjb250cmFjdCwgdHlwaWNhbGx5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBndWFyZCwgd2hhdCBpdCBleHBlY3RzLCBhbmQgb3B0aW9uYWxseSB0aGUgc2NoZW1hJ3MgdmVuZG9yLlxuICogQHJldHVybnMgVGhlIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYTxUPihwYXJhbXM6IENyZWF0ZVR5cGVHdWFyZFNjaGVtYVBhcmFtczxUPik6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD4ge1xuICByZXR1cm4gY3JlYXRlU2NoZW1hKFxuICAgICh2YWx1ZTogdW5rbm93bik6IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PFQ+ID0+IHBhcmFtcy50eXBlR3VhcmQodmFsdWUpID8geyB2YWx1ZSB9IDogeyBpc3N1ZXM6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCAke3BhcmFtcy5leHBlY3RlZH0uYCB9XSB9LFxuICAgIHBhcmFtcy52ZW5kb3JcbiAgKTtcbn1cblxuLyoqXG4gKiBTdGF0ZXMgYSBjb250cmFjdCBhZ2FpbnN0IGFuIEFQSSB0eXBlLCBzbyBldmVyeSBlbnRyeSBpcyBjaGVja2VkIGFnYWluc3QgaXRzIG1ldGhvZCBhbmQgdGhlIHNjaGVtYSBidWlsZGVyc1xuICogaW5zaWRlIGl0IGluZmVyIHRoZWlyIHR5cGVzIGZyb20gdGhlIG1ldGhvZCByYXRoZXIgdGhhbiBmcm9tIGEgcmVzdGF0ZWQgdHVwbGUuIEl0IHJldHVybnMgdGhlIGNvbnRyYWN0IGFzIGlzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdGhlIGNvbnRyYWN0IGRlc2NyaWJlcy5cbiAqIEBwYXJhbSBjb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIGNvbnRyYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdD4oY29udHJhY3Q6IFR5cGVkQXBpQ29udHJhY3Q8Tm9JbmZlcjxUQXBpPj4pOiBUeXBlZEFwaUNvbnRyYWN0PFRBcGk+IHtcbiAgcmV0dXJuIGNvbnRyYWN0O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLCBvciBvZiBhIGNsYXNzIGRlcml2ZWQgZnJvbSBpdCwgZXhwZWN0aW5nIGBhbiBpbnN0YW5jZSBvZmAgdGhlXG4gKiBjbGFzcydzIG5hbWUuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgY2xhc3MuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YW5jZU9mR3VhcmQ8VD4oY29uc3RydWN0b3I6IGFic3RyYWN0IG5ldyAoLi4uYXJndW1lbnRzXzogbmV2ZXJbXSkgPT4gVCk6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBhbiBpbnN0YW5jZSBvZiAke2NvbnN0cnVjdG9yLm5hbWV9YCwgaW5zdGFuY2VPZlR5cGVHdWFyZChjb25zdHJ1Y3RvcikpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBleGFjdGx5IHRoZSBrZXlzIG9mIGEgcmVjb3JkLCBleHBlY3RpbmcgYG9uZSBvZmAgdGhlbS4gVHlwaW5nIHRoZSByZWNvcmQgb3ZlciBhIHVuaW9uXG4gKiBtYWtlcyBhIG1lbWJlciBsYXRlciBhZGRlZCB0byB0aGUgdW5pb24gZmFpbCB0byBjb21waWxlIHVudGlsIGl0IGlzIGxpc3RlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgc3RyaW5ncy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIEEgcmVjb3JkIHdob3NlIGtleXMgYXJlIHRoZSBhY2NlcHRlZCBzdHJpbmdzLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbEd1YXJkPFQgZXh0ZW5kcyBzdHJpbmc+KGxpdGVyYWxzOiBSZWFkb25seTxSZWNvcmQ8VCwgdHJ1ZT4+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD47XG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBleGFjdGx5IHRoZSBsaXN0ZWQgdmFsdWVzLCBleHBlY3RpbmcgYG9uZSBvZmAgdGhlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLlxuICogQHBhcmFtIGxpdGVyYWxzIC0gVGhlIGFjY2VwdGVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdGVyYWxHdWFyZDxUIGV4dGVuZHMgTGl0ZXJhbD4obGl0ZXJhbHM6IHJlYWRvbmx5IFRbXSk6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+O1xuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUgbGlzdGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gbGl0ZXJhbHMgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLCBhcyBhIGxpc3Qgb3IgYXMgdGhlIGtleXMgb2YgYSByZWNvcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsR3VhcmQobGl0ZXJhbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHRydWU+PiB8IHJlYWRvbmx5IExpdGVyYWxbXSk6IEV4cGVjdGVkVHlwZUd1YXJkPExpdGVyYWw+IHtcbiAgY29uc3QgbGl0ZXJhbExpc3Q6IHJlYWRvbmx5IExpdGVyYWxbXSA9IGlzUmVhZG9ubHlBcnJheShsaXRlcmFscykgPyBsaXRlcmFscyA6IE9iamVjdC5rZXlzKGxpdGVyYWxzKTtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBvbmUgb2YgJHtsaXRlcmFsTGlzdC5tYXAoKGxpdGVyYWwpID0+IGZvcm1hdExpdGVyYWwobGl0ZXJhbCkpLmpvaW4oJywgJyl9YCwgbGl0ZXJhbFR5cGVHdWFyZChsaXRlcmFsTGlzdCkpO1xufVxuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFsc28gYWNjZXB0IGBudWxsYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCB0byB3aWRlbi5cbiAqIEByZXR1cm5zIEEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYGd1YXJkYCBhY2NlcHRzLCBvciBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudWxsYWJsZUd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPG51bGwgfCBUPiB7XG4gIHJldHVybiB7XG4gICAgZXhwZWN0ZWQ6IGAke2d1YXJkLmV4cGVjdGVkfSBvciBudWxsYCxcbiAgICB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCBUID0+IHZhbHVlID09PSBudWxsIHx8IGd1YXJkLnR5cGVHdWFyZCh2YWx1ZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgd2hhdCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgcmVjZWl2ZXMgd2hlbiBpdCBpcyBsZWZ0IG91dC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCB0byB3aWRlbi5cbiAqIEByZXR1cm5zIEEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYGd1YXJkYCBhY2NlcHRzLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsR3VhcmQ8VD4oZ3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgdW5kZWZpbmVkYCxcbiAgICB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFQgfCB1bmRlZmluZWQgPT4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYW55IG9mIHRoZSBnaXZlbiBndWFyZHMgYWNjZXB0cywgZXhwZWN0aW5nIHRoZWlyIGBleHBlY3RlZGAgdGV4dHMgam9pbmVkIGJ5IGBvcmAuXG4gKlxuICogQHR5cGVQYXJhbSBUR3VhcmRzIC0gVGhlIGd1YXJkcy5cbiAqIEBwYXJhbSBndWFyZHMgLSBUaGUgZ3VhcmRzLCB0cmllZCBpbiBvcmRlci5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uR3VhcmQ8Y29uc3QgVEd1YXJkcyBleHRlbmRzIHJlYWRvbmx5IEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+W10+KFxuICAuLi5ndWFyZHM6IFRHdWFyZHNcbik6IEV4cGVjdGVkVHlwZUd1YXJkPEd1YXJkZWRUeXBlPFRHdWFyZHNbbnVtYmVyXVsndHlwZUd1YXJkJ10+PiB7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChcbiAgICBndWFyZHMubWFwKChndWFyZCkgPT4gZ3VhcmQuZXhwZWN0ZWQpLmpvaW4oJyBvciAnKSxcbiAgICB1bmlvblR5cGVHdWFyZCguLi5ndWFyZHMubWFwKChndWFyZCkgPT4gZ3VhcmQudHlwZUd1YXJkKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2NoZW1hPFQ+KHZhbGlkYXRlOiAodmFsdWU6IHVua25vd24pID0+IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PFQ+LCB2ZW5kb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD4ge1xuICByZXR1cm4ge1xuICAgICd+c3RhbmRhcmQnOiB7XG4gICAgICB2YWxpZGF0ZSxcbiAgICAgIHZlbmRvcjogdmVuZG9yID8/IExJQlJBUllfTkFNRSxcbiAgICAgIHZlcnNpb246IDFcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdExpdGVyYWwobGl0ZXJhbDogTGl0ZXJhbCk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZyhsaXRlcmFsKSkge1xuICAgIHJldHVybiBgJyR7bGl0ZXJhbH0nYDtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2YgbGl0ZXJhbCA9PT0gJ2JpZ2ludCcgPyBgJHtTdHJpbmcobGl0ZXJhbCl9bmAgOiBTdHJpbmcobGl0ZXJhbCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVhZG9ubHlBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHJlYWRvbmx5IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBdUJBLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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
|
package/dist/lib/esm/async.d.mts
CHANGED
|
@@ -324,8 +324,7 @@ export declare function chain(chainPromise: null | Promise<void>, promisableFunc
|
|
|
324
324
|
/**
|
|
325
325
|
* Gets whether a {@link runWithTimeout} call without its own `onTimeout` terminates the operation when it times out.
|
|
326
326
|
*
|
|
327
|
-
*
|
|
328
|
-
* the copy each Obsidian plugin bundles, reads the same value.
|
|
327
|
+
* @deprecated Use {@link getTerminateOnTimeoutDebugSwitch}`().isEnabled()`.
|
|
329
328
|
*
|
|
330
329
|
* @returns `true` (the default) if a timed-out operation is terminated, `false` if it is left running.
|
|
331
330
|
*/
|
|
@@ -380,7 +379,7 @@ export declare function retryWithTimeout(params: RetryWithTimeoutParams): Promis
|
|
|
380
379
|
/**
|
|
381
380
|
* Executes a function with a timeout. If the function does not complete within the specified time, it is considered to have timed out.
|
|
382
381
|
*
|
|
383
|
-
* Without an `onTimeout`, a timed-out function is terminated, unless {@link
|
|
382
|
+
* Without an `onTimeout`, a timed-out function is terminated, unless the {@link getTerminateOnTimeoutDebugSwitch} debug switch is off,
|
|
384
383
|
* in which case it is allowed to run indefinitely.
|
|
385
384
|
*
|
|
386
385
|
* @typeParam Result - The type of the result from the asynchronous function.
|
|
@@ -397,9 +396,7 @@ export declare function setImmediateAsync(): Promise<void>;
|
|
|
397
396
|
/**
|
|
398
397
|
* Sets whether a {@link runWithTimeout} call without its own `onTimeout` terminates the operation when it times out.
|
|
399
398
|
*
|
|
400
|
-
*
|
|
401
|
-
* timeout is still logged through the `Async:runWithTimeout` debugger. The value is app-wide, see
|
|
402
|
-
* {@link isTerminationOnTimeoutEnabled}.
|
|
399
|
+
* @deprecated Use {@link getTerminateOnTimeoutDebugSwitch}`().setEnabled(isEnabled)`.
|
|
403
400
|
*
|
|
404
401
|
* @param isEnabled - `true` to terminate a timed-out operation, `false` to leave it running.
|
|
405
402
|
*/
|
package/dist/lib/esm/async.mjs
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
waitForAbort
|
|
11
11
|
} from "./abort-controller.mjs";
|
|
12
12
|
import { notifyAsyncOperationStarted } from "./async-operation-hook.mjs";
|
|
13
|
+
import { getTerminateOnTimeoutDebugSwitch } from "./debug-switches.mjs";
|
|
13
14
|
import {
|
|
14
15
|
getLibDebugger,
|
|
15
16
|
printWithStackTrace
|
|
@@ -32,7 +33,6 @@ import {
|
|
|
32
33
|
assert,
|
|
33
34
|
assertNonNullable
|
|
34
35
|
} from "./type-guards.mjs";
|
|
35
|
-
import { getTypescriptLibState } from "./typescript-lib-state.mjs";
|
|
36
36
|
async function addErrorHandler(asyncFunction, stackTrace) {
|
|
37
37
|
stackTrace ??= getStackTrace(1);
|
|
38
38
|
const wasScheduledWithinIgnoreContext = isAsyncErrorIgnoreContextActive();
|
|
@@ -180,7 +180,7 @@ function chain(chainPromise, promisableFunction) {
|
|
|
180
180
|
return nextChainPromise;
|
|
181
181
|
}
|
|
182
182
|
function isTerminationOnTimeoutEnabled() {
|
|
183
|
-
return
|
|
183
|
+
return getTerminateOnTimeoutDebugSwitch().isEnabled();
|
|
184
184
|
}
|
|
185
185
|
function marksAsTerminateRetry(error) {
|
|
186
186
|
terminateRetryErrors.add(error);
|
|
@@ -369,7 +369,7 @@ async function setImmediateAsync() {
|
|
|
369
369
|
});
|
|
370
370
|
}
|
|
371
371
|
function setTerminationOnTimeoutEnabled(isEnabled) {
|
|
372
|
-
|
|
372
|
+
getTerminateOnTimeoutDebugSwitch().setEnabled(isEnabled);
|
|
373
373
|
}
|
|
374
374
|
async function setTimeoutAsync(delay) {
|
|
375
375
|
await new Promise((resolve) => {
|
|
@@ -408,7 +408,7 @@ async function toArray(iter) {
|
|
|
408
408
|
return array;
|
|
409
409
|
}
|
|
410
410
|
function defaultOnTimeout(context) {
|
|
411
|
-
if (
|
|
411
|
+
if (getTerminateOnTimeoutDebugSwitch().isEnabled()) {
|
|
412
412
|
context.terminateOperation();
|
|
413
413
|
return;
|
|
414
414
|
}
|
|
@@ -416,9 +416,6 @@ function defaultOnTimeout(context) {
|
|
|
416
416
|
`Timeout termination is switched off, so the operation '${context.operationName}' keeps running after ${String(context.duration)} milliseconds`
|
|
417
417
|
);
|
|
418
418
|
}
|
|
419
|
-
function getTerminationOnTimeoutEnabledWrapper() {
|
|
420
|
-
return getTypescriptLibState("isTerminationOnTimeoutEnabled", true);
|
|
421
|
-
}
|
|
422
419
|
export {
|
|
423
420
|
addErrorHandler,
|
|
424
421
|
asyncFilter,
|
|
@@ -450,4 +447,4 @@ export {
|
|
|
450
447
|
timeout,
|
|
451
448
|
toArray
|
|
452
449
|
};
|
|
453
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgR2VuZXJpY0FzeW5jRnVuY3Rpb24sXG4gIEdlbmVyaWNGdW5jdGlvbixcbiAgR2VuZXJpY1ZvaWRGdW5jdGlvblxufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVXcmFwcGVyIH0gZnJvbSAnLi92YWx1ZS13cmFwcGVyLnRzJztcblxuaW1wb3J0IHtcbiAgYWJvcnRTaWduYWxBbnksXG4gIGFib3J0U2lnbmFsTmV2ZXIsXG4gIGFib3J0U2lnbmFsVGltZW91dCxcbiAgd2FpdEZvckFib3J0XG59IGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3RpZnlBc3luY09wZXJhdGlvblN0YXJ0ZWQgfSBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmltcG9ydCB7XG4gIGdldExpYkRlYnVnZ2VyLFxuICBwcmludFdpdGhTdGFja1RyYWNlXG59IGZyb20gJy4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgQVNZTkNfV1JBUFBFUl9FUlJPUl9NRVNTQUdFLFxuICBDdXN0b21TdGFja1RyYWNlRXJyb3IsXG4gIGVtaXRBc3luY0Vycm9yRXZlbnQsXG4gIGdldFN0YWNrVHJhY2UsXG4gIGlzQXN5bmNFcnJvcklnbm9yZUNvbnRleHRBY3RpdmUsXG4gIHByaW50RXJyb3IsXG4gIFNpbGVudEVycm9yXG59IGZyb20gJy4vZXJyb3IudHMnO1xuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0LFxuICBhc3NlcnROb25OdWxsYWJsZVxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IGdldFR5cGVzY3JpcHRMaWJTdGF0ZSB9IGZyb20gJy4vdHlwZXNjcmlwdC1saWItc3RhdGUudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFzeW5jRnVuY3Rpb246IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFja1RyYWNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgdHlwZSByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvbWlzZVJlc29sdmU8VD4gPSB1bmRlZmluZWQgZXh0ZW5kcyBUID8gKHZhbHVlPzogUHJvbWlzZUxpa2U8VD4gfCBUKSA9PiB2b2lkXG4gIDogKHZhbHVlOiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWQ7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJldHJ5V2l0aFRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGFib3J0IHNpZ25hbCB0byBjYW5jZWwgdGhlIHJldHJ5IG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEEgZGVsYXkgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDBgXG4gICAqL1xuICByZWFkb25seSByZXRyeURlbGF5SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0cnkgdGhlIGZ1bmN0aW9uIG9uIGVycm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXRyeU9uRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIG9uIHJldHJ5aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGhhbmRsZXIgdG8gYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBjYXRjaGVzIGFueSBlcnJvcnMgYW5kIGVtaXRzIGFuIGFzeW5jIGVycm9yIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhc3luY0Z1bmN0aW9uIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciB0by5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZW1pdHMgYXN5bmMgZXJyb3IgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRFcnJvckhhbmRsZXIoYXN5bmNGdW5jdGlvbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICAvLyBDYXB0dXJlIHRoZSBpZ25vcmUgY29udGV4dCBzeW5jaHJvbm91c2x5IGF0IHNjaGVkdWxlIHRpbWUsIHNvIGEgZGVmZXJyZWQgcmVqZWN0aW9uIHNldHRsaW5nIGFmdGVyIHRoZSBzY29wZSBleGl0cyBpcyBzdGlsbCBpZ25vcmVkLlxuICBjb25zdCB3YXNTY2hlZHVsZWRXaXRoaW5JZ25vcmVDb250ZXh0ID0gaXNBc3luY0Vycm9ySWdub3JlQ29udGV4dEFjdGl2ZSgpO1xuICB0cnkge1xuICAgIGF3YWl0IGFzeW5jRnVuY3Rpb24oKTtcbiAgfSBjYXRjaCAoYXN5bmNFcnJvcikge1xuICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgY2F1c2U6IGFzeW5jRXJyb3IsXG4gICAgICBtZXNzYWdlOiBBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsXG4gICAgICBzdGFja1RyYWNlXG4gICAgfSk7XG4gICAgaWYgKGhhbmRsZVNpbGVudEVycm9yKHdyYXBwZWRFcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW1pdEFzeW5jRXJyb3JFdmVudCh3cmFwcGVkRXJyb3IsIHdhc1NjaGVkdWxlZFdpdGhpbklnbm9yZUNvbnRleHQpO1xuICB9XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBhcnJheSBhc3luY2hyb25vdXNseSwga2VlcGluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gZmlsdGVyLlxuICogQHBhcmFtIHByZWRpY2F0ZSAtIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbHRlcjxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxib29sZWFuPik6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IGFuczogVFtdID0gW107XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGFycmF5LCBpbmRleCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSBhcnJheVtpbmRleF0gYXMgVDtcbiAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIGFucy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhbnM7XG59XG5cbi8qKlxuICogRmlsdGVycyBhbiBhcnJheSBhc3luY2hyb25vdXNseSBpbiBwbGFjZSwga2VlcGluZyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gZmlsdGVyLlxuICogQHBhcmFtIHByZWRpY2F0ZSAtIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gdGVzdCBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFycmF5IGlzIGZpbHRlcmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaWx0ZXJJblBsYWNlPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgbGV0IHdyaXRlSW5kZXggPSAwO1xuICBmb3IgKGxldCByZWFkSW5kZXggPSAwOyByZWFkSW5kZXggPCBsZW5ndGg7IHJlYWRJbmRleCsrKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGFycmF5LCByZWFkSW5kZXgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50ID0gYXJyYXlbcmVhZEluZGV4XSBhcyBUO1xuICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoY3VycmVudCwgcmVhZEluZGV4LCBhcnJheSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFllcywgaXQgaXMgYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24sIGJ1dCBJIGRvbid0IGFuIGVsZWdhbnQgd2F5IHRvIGZpeCBpdC5cbiAgICAgIGFycmF5W3dyaXRlSW5kZXgrK10gPSBjdXJyZW50O1xuICAgIH1cbiAgfVxuICBhcnJheS5sZW5ndGggPSB3cml0ZUluZGV4O1xufVxuXG4vKipcbiAqIE1hcHMgb3ZlciBhbiBhcnJheSBhc3luY2hyb25vdXNseSwgYXBwbHlpbmcgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudCwgYW5kIHRoZW4gZmxhdHRlbnMgdGhlIHJlc3VsdHMgaW50byBhIHNpbmdsZSBhcnJheS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgb3V0cHV0IGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIG1hcCBvdmVyIGFuZCBmbGF0dGVuLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhIGZsYXR0ZW5lZCBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZsYXRNYXA8VCwgVT4oYXJyYXk6IFRbXSwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxVW10+KTogUHJvbWlzZTxVW10+IHtcbiAgY29uc3QgbmVzdGVkUmVzdWx0cyA9IGF3YWl0IGFzeW5jTWFwKGFycmF5LCBjYWxsYmFjayk7XG4gIHJldHVybiBuZXN0ZWRSZXN1bHRzLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBNYXBzIG92ZXIgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGFwcGx5aW5nIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBtYXAgb3Zlci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNNYXA8VCwgVT4oYXJyYXk6IFRbXSwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxVPik6IFByb21pc2U8VVtdPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWFycmF5LWNhbGxiYWNrLXJlZmVyZW5jZSAtLSBQYXNzaW5nIGBjYWxsYmFja2Agc3RyYWlnaHQgdGhyb3VnaCBpcyB0aGUgY29udHJhY3Q6IGl0IGlzIGRlY2xhcmVkIGFzIGAodmFsdWUsIGluZGV4LCBhcnJheSlgIHNvIHRoYXQgaXQgcmVjZWl2ZXMgZXhhY3RseSB3aGF0IGBBcnJheSNtYXBgIHN1cHBsaWVzLiBXcmFwcGluZyBpdCB0byB0YWtlIG9ubHkgdGhlIHZhbHVlIHdvdWxkIHF1aWV0bHkgc3RvcCBmb3J3YXJkaW5nIHRoZSBvdGhlciB0d28uXG4gIHJldHVybiBhd2FpdCBwcm9taXNlQWxsU2VxdWVudGlhbGx5KGFycmF5Lm1hcChjYWxsYmFjaykpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhIHN5bmNocm9ub3VzIG9uZSBieSBhdXRvbWF0aWNhbGx5IGhhbmRsaW5nIHRoZSBQcm9taXNlIHJlamVjdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHBhcmFtIGFzeW5jRnVuY3Rpb24gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gaW4gYSBzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0QXN5bmNUb1N5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihhc3luY0Z1bmN0aW9uOiBHZW5lcmljQXN5bmNGdW5jdGlvbjxBcmd1bWVudHM+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogR2VuZXJpY1ZvaWRGdW5jdGlvbjxBcmd1bWVudHM+IHtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgcmV0dXJuICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpOiB2b2lkID0+IHtcbiAgICBhc3NlcnROb25OdWxsYWJsZShzdGFja1RyYWNlKTtcbiAgICBjb25zdCBpbm5lclN0YWNrVHJhY2UgPSBnZXRTdGFja1RyYWNlKDEpO1xuICAgIHN0YWNrVHJhY2UgKz0gYFxcbiAgICBhdCAtLS0gY29udmVydEFzeW5jVG9TeW5jIC0tLSAoMClcXG4ke2lubmVyU3RhY2tUcmFjZX1gO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGFzeW5jRnVuY3Rpb24oLi4uJGFyZ3VtZW50cyksIHN0YWNrVHJhY2UpO1xuICB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYW4gYXN5bmNocm9ub3VzIG9uZSBieSB3cmFwcGluZyBpdCBpbiBhIHtAbGluayBQcm9taXNlfS5cbiAqXG4gKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gc3luY0Z1bmN0aW9uIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3luY1RvQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdLCBSZXN1bHQ+KHN5bmNGdW5jdGlvbjogR2VuZXJpY0Z1bmN0aW9uPEFyZ3VtZW50cywgUmVzdWx0Pik6IEdlbmVyaWNBc3luY0Z1bmN0aW9uPEFyZ3VtZW50cywgUmVzdWx0PiB7XG4gIHJldHVybiBhc3luYyAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgICByZXR1cm4gc3luY0Z1bmN0aW9uKC4uLiRhcmd1bWVudHMpO1xuICB9O1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBzaWxlbnQgZXJyb3IuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGhhbmRsZS5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGVycm9yIGlzIGEgc2lsZW50IGVycm9yLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWJvb2xlYW4tbmFtZSAtLSBUaGUgbmFtZSBzdGF0ZXMgdGhlIGFjdGlvbjsgdGhlIGJvb2xlYW4gb25seSByZXBvcnRzIHdoZXRoZXIgdGhlIGVycm9yIHdhcyBoYW5kbGVkLlxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVNpbGVudEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGxldCBjYXVzZSA9IGVycm9yO1xuICB3aGlsZSAoIShjYXVzZSBpbnN0YW5jZW9mIFNpbGVudEVycm9yKSkge1xuICAgIGlmICghKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2F1c2UgPSBjYXVzZS5jYXVzZTtcbiAgfVxuXG4gIGdldExpYkRlYnVnZ2VyKCdBc3luYzpoYW5kbGVTaWxlbnRFcnJvcicpKGVycm9yKTtcbiAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIElnbm9yZXMgYW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gYnkgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdG8gaWdub3JlIHRoZSBlcnJvciBvZi5cbiAqIEBwYXJhbSBmYWxsYmFja1ZhbHVlIC0gQWx3YXlzIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY29tcGxldGVzIG9yIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3IocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPiwgZmFsbGJhY2tWYWx1ZT86IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD47XG4vKipcbiAqIEludm9rZXMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGEgZmFsbGJhY2sgdmFsdWUgaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGFuIGVycm9yIGlzIHRocm93bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvciB0aGUgZmFsbGJhY2sgdmFsdWUgaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgZmFsbGJhY2tWYWx1ZTogVCk6IFByb21pc2U8VD47XG4vKipcbiAqIElnbm9yZXMgYW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gYnkgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGFuIGVycm9yIGlzIHRocm93bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvciB0aGUgZmFsbGJhY2sgdmFsdWUgaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgZmFsbGJhY2tWYWx1ZT86IFQpOiBQcm9taXNlPFQgfCB2b2lkPiB7XG4gIGNvbnN0IGlnbm9yZUVycm9yRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6aWdub3JlRXJyb3InKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IGdldFN0YWNrVHJhY2UoMSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWdub3JlRXJyb3JEZWJ1Z2dlcihcbiAgICAgICdJZ25vcmVkIGVycm9yJyxcbiAgICAgIG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgIG1lc3NhZ2U6ICdJZ25vcmVkIGVycm9yJyxcbiAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja1ZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBhIHtAbGluayBQcm9taXNlfSBhbmQgc2FmZWx5IGhhbmRsZXMgYW55IGVycm9ycyBieSBjYXRjaGluZyB0aGVtIGFuZCBlbWl0dGluZyBhbiBhc3luYyBlcnJvciBldmVudC5cbiAqXG4gKiBAcGFyYW0gYXN5bmNGdW5jdGlvbiAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gaW52b2tlIHNhZmVseS5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VBc3luY1NhZmVseShhc3luY0Z1bmN0aW9uOiAoKSA9PiBQcm9taXNhYmxlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG5cbiAgbGV0IHJlc3VsdDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhc3luY0Z1bmN0aW9uKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzIC0tIFJlLXJlamVjdGluZyB0aGUgb3JpZ2luYWwgY2F1Z2h0IGVycm9yIGFzLWlzLlxuICAgIG5vdGlmeUFzeW5jT3BlcmF0aW9uU3RhcnRlZChhZGRFcnJvckhhbmRsZXIoKCkgPT4gUHJvbWlzZS5yZWplY3QoZXJyb3IpLCBzdGFja1RyYWNlKSk7XG4gIH1cbiAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICBub3RpZnlBc3luY09wZXJhdGlvblN0YXJ0ZWQoYWRkRXJyb3JIYW5kbGVyKCgpID0+IHJlc3VsdCwgc3RhY2tUcmFjZSkpO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYWZ0ZXIgYSBkZWxheS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheShwYXJhbXM6IEludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheVBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgYXN5bmNGdW5jdGlvbixcbiAgICBkZWxheUluTWlsbGlzZWNvbmRzID0gMFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbCA/PyBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBwYXJhbXMuc3RhY2tUcmFjZSA/PyBnZXRTdGFja1RyYWNlKDEpO1xuICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2xlZXAoeyBhYm9ydFNpZ25hbCwgbWlsbGlzZWNvbmRzOiBkZWxheUluTWlsbGlzZWNvbmRzLCBzaG91bGRUaHJvd09uQWJvcnQ6IHRydWUgfSk7XG4gICAgYXdhaXQgYXN5bmNGdW5jdGlvbihhYm9ydFNpZ25hbCk7XG4gIH0sIHN0YWNrVHJhY2UpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGFzeW5jIGZ1bmN0aW9ucyBzZXF1ZW50aWFsbHkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFzeW5jRm5zIC0gVGhlIGFzeW5jIGZ1bmN0aW9ucyB0byBleGVjdXRlIHNlcXVlbnRpYWxseS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgYXN5bmMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbEFzeW5jRm5zU2VxdWVudGlhbGx5PFQ+KGFzeW5jRm5zOiAoKCkgPT4gUHJvbWlzYWJsZTxUPilbXSk6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFzeW5jRnVuY3Rpb24gb2YgYXN5bmNGbnMpIHtcbiAgICByZXN1bHRzLnB1c2goYXdhaXQgYXN5bmNGdW5jdGlvbigpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBwcm9taXNlcyBzZXF1ZW50aWFsbHkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHByb21pc2VzIC0gVGhlIHByb21pc2VzIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBwcm9taXNlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb21pc2VBbGxTZXF1ZW50aWFsbHk8VD4ocHJvbWlzZXM6IFByb21pc2FibGU8VD5bXSk6IFByb21pc2U8VFtdPiB7XG4gIHJldHVybiBhd2FpdCBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHkocHJvbWlzZXMubWFwKChwcm9taXNlKSA9PiAoKSA9PiBwcm9taXNlKSk7XG59XG5cbmNvbnN0IHRlcm1pbmF0ZVJldHJ5RXJyb3JzID0gbmV3IFdlYWtTZXQ8RXJyb3I+KCk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJldHJ5V2l0aFRpbWVvdXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5V2l0aFRpbWVvdXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgdGltZW91dC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgdGltZW91dCBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgb25UaW1lb3V0PzogKGNvbnRleHQ6IFRpbWVvdXRDb250ZXh0KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAgICpcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXRyeSBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnlPcHRpb25zPzogUmV0cnlPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrVHJhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJ1bldpdGhUaW1lb3V0fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5XaXRoVGltZW91dFBhcmFtczxSZXN1bHQ+IHtcbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSB0aW1lb3V0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSB0aW1lb3V0IGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBvblRpbWVvdXQ/OiAoY29udGV4dDogVGltZW91dENvbnRleHQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpb24gZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAgICpcbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8UmVzdWx0PjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFja1RyYWNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNsZWVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbGVlcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFib3J0IHNpZ25hbCBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnRleHQgcHJvdmlkZWQgdG8gdGhlIHRpbWVvdXQgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lb3V0Q29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBvcGVyYXRpb24gc3RhcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqL1xuICBvbk9wZXJhdGlvbkNvbXBsZXRlZDogKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRlcm1pbmF0ZXMgdGhlIG9wZXJhdGlvbiB0aGF0IHRpbWVkIG91dC5cbiAgICovXG4gIHRlcm1pbmF0ZU9wZXJhdGlvbjogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdGltZW91dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZW91dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGFib3J0IHNpZ25hbCBpcyBhYm9ydGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZW91dCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2hhaW5zIGEgcHJvbWlzZSB3aXRoIGFub3RoZXIgcHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0gY2hhaW5Qcm9taXNlIC0gUmVwcmVzZW50cyB0aGUgY2hhaW5lZCBwcm9taXNlLlxuICogQHBhcmFtIHByb21pc2FibGVGdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB0byBjaGFpbi5cbiAqIEByZXR1cm5zIENoYWluZWQgcHJvbWlzZSBvciBgbnVsbGAgaWYgbm8gYXN5bmMgbG9naWMgaXMgY2hhaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYWluKGNoYWluUHJvbWlzZTogbnVsbCB8IFByb21pc2U8dm9pZD4sIHByb21pc2FibGVGdW5jdGlvbjogKCkgPT4gbnVsbCB8IFByb21pc2FibGU8dm9pZD4pOiBudWxsIHwgUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBuZXh0Q2hhaW5Qcm9taXNlID0gY2hhaW5Qcm9taXNlO1xuICBpZiAoY2hhaW5Qcm9taXNlKSB7XG4gICAgbmV4dENoYWluUHJvbWlzZSA9IGNoYWluUHJvbWlzZS50aGVuKCgpID0+IHByb21pc2FibGVGdW5jdGlvbigpID8/IHVuZGVmaW5lZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvbWlzYWJsZSA9IHByb21pc2FibGVGdW5jdGlvbigpO1xuICAgIGlmIChwcm9taXNhYmxlKSB7XG4gICAgICBuZXh0Q2hhaW5Qcm9taXNlID0gcHJvbWlzYWJsZSBpbnN0YW5jZW9mIFByb21pc2UgPyBwcm9taXNhYmxlIGFzIFByb21pc2U8dm9pZD4gOiBQcm9taXNlLnJlc29sdmUocHJvbWlzYWJsZSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dENoYWluUHJvbWlzZT8uY2F0Y2gobm9vcCk7XG4gIHJldHVybiBuZXh0Q2hhaW5Qcm9taXNlO1xufVxuXG4vKipcbiAqIEdldHMgd2hldGhlciBhIHtAbGluayBydW5XaXRoVGltZW91dH0gY2FsbCB3aXRob3V0IGl0cyBvd24gYG9uVGltZW91dGAgdGVybWluYXRlcyB0aGUgb3BlcmF0aW9uIHdoZW4gaXQgdGltZXMgb3V0LlxuICpcbiAqIFRoZSB2YWx1ZSBpcyBhcHAtd2lkZTogaXQgbGl2ZXMgaW4gdGhlIHNoYXJlZCBzdGF0ZSwgc28gZXZlcnkgY29weSBvZiB0aGlzIGxpYnJhcnkgbG9hZGVkIGluIG9uZSByZWFsbSwgc3VjaCBhc1xuICogdGhlIGNvcHkgZWFjaCBPYnNpZGlhbiBwbHVnaW4gYnVuZGxlcywgcmVhZHMgdGhlIHNhbWUgdmFsdWUuXG4gKlxuICogQHJldHVybnMgYHRydWVgICh0aGUgZGVmYXVsdCkgaWYgYSB0aW1lZC1vdXQgb3BlcmF0aW9uIGlzIHRlcm1pbmF0ZWQsIGBmYWxzZWAgaWYgaXQgaXMgbGVmdCBydW5uaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWRXcmFwcGVyKCkudmFsdWU7XG59XG5cbi8qKlxuICogTWFya3MgYW4gZXJyb3IgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBtYXJrIHRvIHRlcm1pbmF0ZSByZXRyeSBsb2dpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtzQXNUZXJtaW5hdGVSZXRyeShlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgdGVybWluYXRlUmV0cnlFcnJvcnMuYWRkKGVycm9yKTtcbn1cblxuLyoqXG4gKiBBbiBhc3luYyBmdW5jdGlvbiB0aGF0IG5ldmVyIGVuZHMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBuZXZlciByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5ldmVyRW5kcygpOiBQcm9taXNlPG5ldmVyPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKCgpID0+IHtcbiAgICBub29wKCk7XG4gIH0pO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXhoYXVzdGl2ZSBzd2l0Y2ggZ3VhcmQ7IHRoZSBhd2FpdCBhYm92ZSBuZXZlciByZXNvbHZlcy4gKi9cbiAgYXNzZXJ0KGZhbHNlLCAnU2hvdWxkIG5ldmVyIGhhcHBlbicpO1xuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgdGljay5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHRpY2sgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV4dFRpY2tBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0byBuYXRpdmUgcHJvbWlzYWJsZSwgY29udmVydGluZyB7QGxpbmsgUHJvbWlzZUxpa2V9IChha2EgVGhlbmFibGUpIHRvIGEgbmF0aXZlIHtAbGluayBQcm9taXNlfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcHJvbWlzYWJsZSAtIFRoZSBwcm9taXNhYmxlIHRvIG5vcm1hbGl6ZS5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBpdHNlbGYgb3IgYSBuYXRpdmUge0BsaW5rIFByb21pc2V9IGlmIHRoZSB2YWx1ZSBpcyBhIHtAbGluayBQcm9taXNlTGlrZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcm9taXNhYmxlPFQ+KHByb21pc2FibGU6IFByb21pc2FibGU8VD4pOiBQcm9taXNlPFQ+IHwgVCB7XG4gIGlmICghcHJvbWlzYWJsZSkge1xuICAgIHJldHVybiBwcm9taXNhYmxlO1xuICB9XG5cbiAgaWYgKHByb21pc2FibGUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgcmV0dXJuIHByb21pc2FibGUgYXMgUHJvbWlzZTxUPjtcbiAgfVxuXG4gIHJldHVybiAocHJvbWlzYWJsZSBhcyBQYXJ0aWFsPFByb21pc2VMaWtlPFQ+PikudGhlbiA/IFByb21pc2UucmVzb2x2ZShwcm9taXNhYmxlKSA6IChwcm9taXNhYmxlIGFzIFQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgcXVldWUgbWljcm90YXNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgcXVldWUgbWljcm90YXNrIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHF1ZXVlTWljcm90YXNrQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCByZXF1ZXN0IGFuaW1hdGlvbiBmcmFtZS5cbiAqXG4gKiBAcGFyYW0gZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgZmFsbGJhY2sgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZSBpZiBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBkb2VzIG5vdCBmaXJlIChlLmcuIHRoZSB3aW5kb3cgaXMgbm90IGFjdGl2ZSkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBgMTAwYCBtaWxsaXNlY29uZHMuIFVzZSBgMGAgdG8gZGlzYWJsZSB0aGUgZmFsbGJhY2suXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lIGlzIGF2YWlsYWJsZSAob3Igd2hlbiB0aGUgZmFsbGJhY2sgdGltZSBpcyByZWFjaGVkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jKGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IERFRkFVTFRfRkFMTEJBQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDA7XG4gIGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzID8/PSBERUZBVUxUX0ZBTExCQUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3JlcXVlc3RBbmltYXRpb25GcmFtZUFzeW5jUHJvbWlzZSwgZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgPiAwID8gc2xlZXAoeyBtaWxsaXNlY29uZHM6IGZhbGxiYWNrVGltZW91dEluTWlsbGlzZWNvbmRzIH0pIDogbmV2ZXJFbmRzKCldKTtcbn1cblxuLyoqXG4gKiBSZXRyaWVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1bnRpbCBpdCByZXR1cm5zIGB0cnVlYCBvciB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBvciByZWplY3RzIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldHJ5V2l0aFRpbWVvdXQocGFyYW1zOiBSZXRyeVdpdGhUaW1lb3V0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpyZXRyeVdpdGhUaW1lb3V0Jyk7XG4gIGNvbnN0IHN0YWNrVHJhY2UgPSBwYXJhbXMuc3RhY2tUcmFjZSA/PyBnZXRTdGFja1RyYWNlKDEpO1xuICBjb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMgPSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRXh0cmFjdGluZyBtYWdpYyBudW1iZXIgYXMgYSBjb25zdGFudCB3b3VsZCBiZSByZXBldGl0aXZlLCBhcyB0aGUgdmFsdWUgaXMgdXNlZCBvbmx5IG9uY2UgYW5kIGl0cyBuYW1lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eS5cbiAgICByZXRyeURlbGF5SW5NaWxsaXNlY29uZHM6IDEwMCxcbiAgICBzaG91bGRSZXRyeU9uRXJyb3I6IGZhbHNlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzIC0tIEV4dHJhY3RpbmcgbWFnaWMgbnVtYmVyIGFzIGEgY29uc3RhbnQgd291bGQgYmUgcmVwZXRpdGl2ZSwgYXMgdGhlIHZhbHVlIGlzIHVzZWQgb25seSBvbmNlIGFuZCBpdHMgbmFtZSB3b3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJvcGVydHkuXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiA1MDAwXG4gIH07XG4gIGNvbnN0IGZ1bGxPcHRpb25zID0geyAuLi5ERUZBVUxUX1JFVFJZX09QVElPTlMsIC4uLnBhcmFtcy5yZXRyeU9wdGlvbnMgfTtcbiAgZnVsbE9wdGlvbnMuYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXdhaXQgcnVuV2l0aFRpbWVvdXQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFJ1bldpdGhUaW1lb3V0UGFyYW1zPHZvaWQ+Pih7XG4gICAgY29udGV4dDogeyBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJywgcmV0cnlGdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uIH0sXG4gICAgb25UaW1lb3V0OiBwYXJhbXMub25UaW1lb3V0LFxuICAgIGFzeW5jIG9wZXJhdGlvbkZ1bmN0aW9uKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgY29tYmluZWRBYm9ydFNpZ25hbCA9IGFib3J0U2lnbmFsQW55KGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsLCBhYm9ydFNpZ25hbCk7XG4gICAgICBjb21iaW5lZEFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICB3aGlsZSAoIWNvbWJpbmVkQWJvcnRTaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgIGxldCBpc1N1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNTdWNjZXNzID0gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uKGNvbWJpbmVkQWJvcnRTaWduYWwpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW5zaWRlIGBmbigpYC4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgICAgICAgIGlmIChjb21iaW5lZEFib3J0U2lnbmFsLmFib3J0ZWQgfHwgIWZ1bGxPcHRpb25zLnNob3VsZFJldHJ5T25FcnJvciB8fCB0ZXJtaW5hdGVSZXRyeUVycm9ycy5oYXMoZXJyb3IgYXMgRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAncmV0cnlXaXRoVGltZW91dCBmYWlsZWQnLFxuICAgICAgICAgICAgICBzdGFja1RyYWNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJpbnRFcnJvcihlcnJvcik7XG4gICAgICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgICAgICAgJGFyZ3VtZW50czogW3tcbiAgICAgICAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IHBhcmFtcy5vcGVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgZGVidWdnZXJJbnN0YW5jZTogcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJldHJ5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgJHtTdHJpbmcoYXR0ZW1wdCl9IGF0dGVtcHRzYCxcbiAgICAgICAgICAgIHN0YWNrVHJhY2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IHBhcmFtcy5vcGVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgZGVidWdnZXJJbnN0YW5jZTogcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICAgIG1lc3NhZ2U6IGBSZXRyeSBhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfSBjb21wbGV0ZWQgdW5zdWNjZXNzZnVsbHkuIFRyeWluZyBhZ2FpbiBpbiAke1N0cmluZyhmdWxsT3B0aW9ucy5yZXRyeURlbGF5SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgLFxuICAgICAgICAgIHN0YWNrVHJhY2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgc2xlZXAoeyBhYm9ydFNpZ25hbCwgbWlsbGlzZWNvbmRzOiBmdWxsT3B0aW9ucy5yZXRyeURlbGF5SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJyxcbiAgICBzdGFja1RyYWNlLFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogZnVsbE9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBhIGZ1bmN0aW9uIHdpdGggYSB0aW1lb3V0LiBJZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgY29tcGxldGUgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSwgaXQgaXMgY29uc2lkZXJlZCB0byBoYXZlIHRpbWVkIG91dC5cbiAqXG4gKiBXaXRob3V0IGFuIGBvblRpbWVvdXRgLCBhIHRpbWVkLW91dCBmdW5jdGlvbiBpcyB0ZXJtaW5hdGVkLCB1bmxlc3Mge0BsaW5rIHNldFRlcm1pbmF0aW9uT25UaW1lb3V0RW5hYmxlZH0gc3dpdGNoZWQgdGhhdCBvZmYgYXBwLXdpZGUsXG4gKiBpbiB3aGljaCBjYXNlIGl0IGlzIGFsbG93ZWQgdG8gcnVuIGluZGVmaW5pdGVseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgZnJvbSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHJlamVjdHMgaWYgaXQgdGltZXMgb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFRpbWVvdXQ8UmVzdWx0PihwYXJhbXM6IFJ1bldpdGhUaW1lb3V0UGFyYW1zPFJlc3VsdD4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICBjb25zdCBzdGFja1RyYWNlID0gcGFyYW1zLnN0YWNrVHJhY2UgPz8gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgY29uc3QgcnVuQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCB0aW1lb3V0QWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGxldCByZXN1bHQ6IG51bGwgfCBSZXN1bHQgPSBudWxsO1xuICBsZXQgaGFzUmVzdWx0ID0gZmFsc2U7XG4gIGxldCBpc0NvbXBsZXRlZCA9IGZhbHNlO1xuICBjb25zdCBydW5XaXRoVGltZW91dERlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0FzeW5jOnJ1bldpdGhUaW1lb3V0Jyk7XG4gIGNvbnN0IG9uVGltZW91dCA9IHBhcmFtcy5vblRpbWVvdXQgPz8gZGVmYXVsdE9uVGltZW91dDtcblxuICBhd2FpdCBQcm9taXNlLnJhY2UoW3J1bigpLCBpbm5lclRpbWVvdXQoKV0pO1xuICAvLyBUaGUgcmVzdWx0IGlzIG9ubHkgdmFsaWQgaWYgdGhlIHJ1biBmaW5pc2hlZCBvbiBpdHMgb3duLiBXaGVuIHRoZSB0aW1lb3V0IHRlcm1pbmF0ZWQgaXQsIHRoZVxuICAvLyBvcGVyYXRpb24gbWlnaHQgc3RpbGwgcmVzb2x2ZSBhZnRlcndhcmRzIChlLmcuIGEgcmV0cnkgbG9vcCB0aGF0IGV4aXRzIG9uIGFib3J0KSwgYnV0IHRoYXQgdmFsdWVcbiAgLy8gaXMgcGFzdCB0aGUgZGVhZGxpbmUgYW5kIG11c3QgYmUgdHJlYXRlZCBhcyBhIGZhaWx1cmUsIG5vdCBhIHN1Y2Nlc3MuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEJvdGggbWlnaHQgY2hhbmdlIGluc2lkZSBgcnVuKClgL2Bpbm5lclRpbWVvdXQoKWAuIEVTTGludCBtaXN0YWtlbmx5IGRvZXMgbm90IHJlY29nbml6ZSBpdC5cbiAgaWYgKGhhc1Jlc3VsdCAmJiAhcnVuQWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKHtcbiAgICBjYXVzZTogcnVuQWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZWFzb24sXG4gICAgbWVzc2FnZTogJ1J1biB3aXRoIHRpbWVvdXQgZmFpbGVkJyxcbiAgICBzdGFja1RyYWNlXG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uKHJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLnRydW5jKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24sXG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgICAgfV0sXG4gICAgICAgIGRlYnVnZ2VySW5zdGFuY2U6IHJ1bldpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgIG1lc3NhZ2U6IGBFeGVjdXRpb24gdGltZTogJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgLFxuICAgICAgICBzdGFja1RyYWNlXG4gICAgICB9KTtcbiAgICAgIGhhc1Jlc3VsdCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJ1bkFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgIHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdDb21wbGV0ZWQnKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaW5uZXJUaW1lb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHNsZWVwKHsgYWJvcnRTaWduYWw6IHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuc2lnbmFsLCBtaWxsaXNlY29uZHM6IHBhcmFtcy50aW1lb3V0SW5NaWxsaXNlY29uZHMgfSk7XG5cbiAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb24gPSBNYXRoLnRydW5jKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTtcbiAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICRhcmd1bWVudHM6IFt7XG4gICAgICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgfV0sXG4gICAgICBkZWJ1Z2dlckluc3RhbmNlOiBydW5XaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgbWVzc2FnZTogYFRpbWVkIG91dCBhZnRlciAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2AsXG4gICAgICBzdGFja1RyYWNlXG4gICAgfSk7XG5cbiAgICBjb25zdCB0aW1lb3V0Q29udGV4dDogVGltZW91dENvbnRleHQgPSBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VGltZW91dENvbnRleHQ+KHtcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgb25PcGVyYXRpb25Db21wbGV0ZWQoY2FsbGJhY2spIHtcbiAgICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYWxsYmFjayk7XG4gICAgICB9LFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJycsXG4gICAgICB0ZXJtaW5hdGVPcGVyYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgKTtcbiAgICAgICAgcnVuQWJvcnRDb250cm9sbGVyLmFib3J0KGVycm9yKTtcbiAgICAgICAgdGltZW91dEFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvblRpbWVvdXQodGltZW91dENvbnRleHQpO1xuICAgIGF3YWl0IHdhaXRGb3JBYm9ydCh0aW1lb3V0QWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHNldCBpbW1lZGlhdGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEltbWVkaWF0ZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTZXRzIHdoZXRoZXIgYSB7QGxpbmsgcnVuV2l0aFRpbWVvdXR9IGNhbGwgd2l0aG91dCBpdHMgb3duIGBvblRpbWVvdXRgIHRlcm1pbmF0ZXMgdGhlIG9wZXJhdGlvbiB3aGVuIGl0IHRpbWVzIG91dC5cbiAqXG4gKiBTd2l0Y2ggaXQgb2ZmIHdoaWxlIGRlYnVnZ2luZywgc28gYW4gb3BlcmF0aW9uIHBhdXNlZCBvbiBhIGJyZWFrcG9pbnQgaXMgbm90IHRlcm1pbmF0ZWQgdW5kZXIgdGhlIGRlYnVnZ2VyLiBUaGVcbiAqIHRpbWVvdXQgaXMgc3RpbGwgbG9nZ2VkIHRocm91Z2ggdGhlIGBBc3luYzpydW5XaXRoVGltZW91dGAgZGVidWdnZXIuIFRoZSB2YWx1ZSBpcyBhcHAtd2lkZSwgc2VlXG4gKiB7QGxpbmsgaXNUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWR9LlxuICpcbiAqIEBwYXJhbSBpc0VuYWJsZWQgLSBgdHJ1ZWAgdG8gdGVybWluYXRlIGEgdGltZWQtb3V0IG9wZXJhdGlvbiwgYGZhbHNlYCB0byBsZWF2ZSBpdCBydW5uaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VGVybWluYXRpb25PblRpbWVvdXRFbmFibGVkKGlzRW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICBnZXRUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWRXcmFwcGVyKCkudmFsdWUgPSBpc0VuYWJsZWQ7XG59XG5cbi8qKlxuICogRGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gZGVsYXkgLSBUaGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFRpbWVvdXRBc3luYyhkZWxheT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKHBhcmFtczogU2xlZXBQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFib3J0U2lnbmFsLFxuICAgIG1pbGxpc2Vjb25kcyxcbiAgICBzaG91bGRUaHJvd09uQWJvcnRcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgd2FpdEZvckFib3J0KGFib3J0U2lnbmFsQW55KGFib3J0U2lnbmFsLCBhYm9ydFNpZ25hbFRpbWVvdXQobWlsbGlzZWNvbmRzKSkpO1xuICBpZiAoc2hvdWxkVGhyb3dPbkFib3J0KSB7XG4gICAgYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVqZWN0cyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgcGVyaW9kLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBhbHdheXMgcmVqZWN0cyB3aXRoIGEgdGltZW91dCBlcnJvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRpbWVvdXQocGFyYW1zOiBUaW1lb3V0UGFyYW1zKTogUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgc2hvdWxkVGhyb3dPbkFib3J0LFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBzbGVlcChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2xlZXBQYXJhbXM+KHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBtaWxsaXNlY29uZHM6IHRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICBzaG91bGRUaHJvd09uQWJvcnRcbiAgfSkpO1xuICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCBpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gYW4gYXJyYXkgYnkgY29uc3VtaW5nIGFsbCBpdHMgZWxlbWVudHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgcHJvZHVjZWQgYnkgdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqIEBwYXJhbSBpdGVyIC0gVGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYXJyYXk6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcikge1xuICAgIGFycmF5LnB1c2goaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0T25UaW1lb3V0KGNvbnRleHQ6IFRpbWVvdXRDb250ZXh0KTogdm9pZCB7XG4gIGlmIChnZXRUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWRXcmFwcGVyKCkudmFsdWUpIHtcbiAgICBjb250ZXh0LnRlcm1pbmF0ZU9wZXJhdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldExpYkRlYnVnZ2VyKCdBc3luYzpydW5XaXRoVGltZW91dCcpKFxuICAgIGBUaW1lb3V0IHRlcm1pbmF0aW9uIGlzIHN3aXRjaGVkIG9mZiwgc28gdGhlIG9wZXJhdGlvbiAnJHtjb250ZXh0Lm9wZXJhdGlvbk5hbWV9JyBrZWVwcyBydW5uaW5nIGFmdGVyICR7U3RyaW5nKGNvbnRleHQuZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFRlcm1pbmF0aW9uT25UaW1lb3V0RW5hYmxlZFdyYXBwZXIoKTogVmFsdWVXcmFwcGVyPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGdldFR5cGVzY3JpcHRMaWJTdGF0ZSgnaXNUZXJtaW5hdGlvbk9uVGltZW91dEVuYWJsZWQnLCB0cnVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBZUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsbUNBQW1DO0FBQzVDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFT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
|
|
450
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgR2VuZXJpY0FzeW5jRnVuY3Rpb24sXG4gIEdlbmVyaWNGdW5jdGlvbixcbiAgR2VuZXJpY1ZvaWRGdW5jdGlvblxufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcblxuaW1wb3J0IHtcbiAgYWJvcnRTaWduYWxBbnksXG4gIGFib3J0U2lnbmFsTmV2ZXIsXG4gIGFib3J0U2lnbmFsVGltZW91dCxcbiAgd2FpdEZvckFib3J0XG59IGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3RpZnlBc3luY09wZXJhdGlvblN0YXJ0ZWQgfSBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmltcG9ydCB7IGdldFRlcm1pbmF0ZU9uVGltZW91dERlYnVnU3dpdGNoIH0gZnJvbSAnLi9kZWJ1Zy1zd2l0Y2hlcy50cyc7XG5pbXBvcnQge1xuICBnZXRMaWJEZWJ1Z2dlcixcbiAgcHJpbnRXaXRoU3RhY2tUcmFjZVxufSBmcm9tICcuL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIEFTWU5DX1dSQVBQRVJfRVJST1JfTUVTU0FHRSxcbiAgQ3VzdG9tU3RhY2tUcmFjZUVycm9yLFxuICBlbWl0QXN5bmNFcnJvckV2ZW50LFxuICBnZXRTdGFja1RyYWNlLFxuICBpc0FzeW5jRXJyb3JJZ25vcmVDb250ZXh0QWN0aXZlLFxuICBwcmludEVycm9yLFxuICBTaWxlbnRFcnJvclxufSBmcm9tICcuL2Vycm9yLnRzJztcbmltcG9ydCB7XG4gIG5vb3AsXG4gIG5vb3BBc3luY1xufSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGFzc2VydCxcbiAgYXNzZXJ0Tm9uTnVsbGFibGVcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2tlQXN5bmNTYWZlbHlBZnRlckRlbGF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqXG4gICAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYXN5bmNGdW5jdGlvbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrVHJhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSB0eXBlIHJlcHJlc2VudGluZyBhIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgYSB7QGxpbmsgUHJvbWlzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBQcm9taXNlUmVzb2x2ZTxUPiA9IHVuZGVmaW5lZCBleHRlbmRzIFQgPyAodmFsdWU/OiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWRcbiAgOiAodmFsdWU6IFByb21pc2VMaWtlPFQ+IHwgVCkgPT4gdm9pZDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmV0cnlXaXRoVGltZW91dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYWJvcnQgc2lnbmFsIHRvIGNhbmNlbCB0aGUgcmV0cnkgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiByZXRyeSBhdHRlbXB0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDEwMGBcbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXRyeSB0aGUgZnVuY3Rpb24gb24gZXJyb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldHJ5T25FcnJvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbWF4aW11bSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgb24gcmV0cnlpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gZXJyb3IgaGFuZGxlciB0byBhIHtAbGluayBQcm9taXNlfSB0aGF0IGNhdGNoZXMgYW55IGVycm9ycyBhbmQgZW1pdHMgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRnVuY3Rpb24gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGFkZCBhbiBlcnJvciBoYW5kbGVyIHRvLlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNvbXBsZXRlcyBvciBlbWl0cyBhc3luYyBlcnJvciBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcihhc3luY0Z1bmN0aW9uOiAoKSA9PiBQcm9taXNlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIC8vIENhcHR1cmUgdGhlIGlnbm9yZSBjb250ZXh0IHN5bmNocm9ub3VzbHkgYXQgc2NoZWR1bGUgdGltZSwgc28gYSBkZWZlcnJlZCByZWplY3Rpb24gc2V0dGxpbmcgYWZ0ZXIgdGhlIHNjb3BlIGV4aXRzIGlzIHN0aWxsIGlnbm9yZWQuXG4gIGNvbnN0IHdhc1NjaGVkdWxlZFdpdGhpbklnbm9yZUNvbnRleHQgPSBpc0FzeW5jRXJyb3JJZ25vcmVDb250ZXh0QWN0aXZlKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYXN5bmNGdW5jdGlvbigpO1xuICB9IGNhdGNoIChhc3luY0Vycm9yKSB7XG4gICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgICBjYXVzZTogYXN5bmNFcnJvcixcbiAgICAgIG1lc3NhZ2U6IEFTWU5DX1dSQVBQRVJfRVJST1JfTUVTU0FHRSxcbiAgICAgIHN0YWNrVHJhY2VcbiAgICB9KTtcbiAgICBpZiAoaGFuZGxlU2lsZW50RXJyb3Iod3JhcHBlZEVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbWl0QXN5bmNFcnJvckV2ZW50KHdyYXBwZWRFcnJvciwgd2FzU2NoZWR1bGVkV2l0aGluSWdub3JlQ29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGaWx0ZXJzIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5LCBrZWVwaW5nIG9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVyPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYW5zOiBUW10gPSBbXTtcblxuICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24oYXJyYXksIGluZGV4KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbSA9IGFycmF5W2luZGV4XSBhcyBUO1xuICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgYW5zLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFucztcbn1cblxuLyoqXG4gKiBGaWx0ZXJzIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5IGluIHBsYWNlLCBrZWVwaW5nIG9ubHkgdGhlIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgcHJlZGljYXRlIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXJyYXkgaXMgZmlsdGVyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbHRlckluUGxhY2U8VD4oYXJyYXk6IFRbXSwgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICBsZXQgd3JpdGVJbmRleCA9IDA7XG4gIGZvciAobGV0IHJlYWRJbmRleCA9IDA7IHJlYWRJbmRleCA8IGxlbmd0aDsgcmVhZEluZGV4KyspIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24oYXJyYXksIHJlYWRJbmRleCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSBhcnJheVtyZWFkSW5kZXhdIGFzIFQ7XG4gICAgaWYgKGF3YWl0IHByZWRpY2F0ZShjdXJyZW50LCByZWFkSW5kZXgsIGFycmF5KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gWWVzLCBpdCBpcyBhIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiwgYnV0IEkgZG9uJ3QgYW4gZWxlZ2FudCB3YXkgdG8gZml4IGl0LlxuICAgICAgYXJyYXlbd3JpdGVJbmRleCsrXSA9IGN1cnJlbnQ7XG4gICAgfVxuICB9XG4gIGFycmF5Lmxlbmd0aCA9IHdyaXRlSW5kZXg7XG59XG5cbi8qKlxuICogTWFwcyBvdmVyIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5LCBhcHBseWluZyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50LCBhbmQgdGhlbiBmbGF0dGVucyB0aGUgcmVzdWx0cyBpbnRvIGEgc2luZ2xlIGFycmF5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBvdXRwdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgdG8gbWFwIG92ZXIgYW5kIGZsYXR0ZW4uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGEgZmxhdHRlbmVkIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmxhdE1hcDxULCBVPihhcnJheTogVFtdLCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPFVbXT4pOiBQcm9taXNlPFVbXT4ge1xuICBjb25zdCBuZXN0ZWRSZXN1bHRzID0gYXdhaXQgYXN5bmNNYXAoYXJyYXksIGNhbGxiYWNrKTtcbiAgcmV0dXJuIG5lc3RlZFJlc3VsdHMuZmxhdCgpO1xufVxuXG4vKipcbiAqIE1hcHMgb3ZlciBhbiBhcnJheSBhc3luY2hyb25vdXNseSwgYXBwbHlpbmcgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgb3V0cHV0IGFycmF5LlxuICogQHBhcmFtIGFycmF5IC0gVGhlIGFycmF5IHRvIG1hcCBvdmVyLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY01hcDxULCBVPihhcnJheTogVFtdLCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPFU+KTogUHJvbWlzZTxVW10+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tYXJyYXktY2FsbGJhY2stcmVmZXJlbmNlIC0tIFBhc3NpbmcgYGNhbGxiYWNrYCBzdHJhaWdodCB0aHJvdWdoIGlzIHRoZSBjb250cmFjdDogaXQgaXMgZGVjbGFyZWQgYXMgYCh2YWx1ZSwgaW5kZXgsIGFycmF5KWAgc28gdGhhdCBpdCByZWNlaXZlcyBleGFjdGx5IHdoYXQgYEFycmF5I21hcGAgc3VwcGxpZXMuIFdyYXBwaW5nIGl0IHRvIHRha2Ugb25seSB0aGUgdmFsdWUgd291bGQgcXVpZXRseSBzdG9wIGZvcndhcmRpbmcgdGhlIG90aGVyIHR3by5cbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxTZXF1ZW50aWFsbHkoYXJyYXkubWFwKGNhbGxiYWNrKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGEgc3luY2hyb25vdXMgb25lIGJ5IGF1dG9tYXRpY2FsbHkgaGFuZGxpbmcgdGhlIFByb21pc2UgcmVqZWN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gKiBAcGFyYW0gYXN5bmNGdW5jdGlvbiAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBpbiBhIHN5bmNocm9ub3VzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBc3luY1RvU3luYzxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10+KGFzeW5jRnVuY3Rpb246IEdlbmVyaWNBc3luY0Z1bmN0aW9uPEFyZ3VtZW50cz4sIHN0YWNrVHJhY2U/OiBzdHJpbmcpOiBHZW5lcmljVm9pZEZ1bmN0aW9uPEFyZ3VtZW50cz4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICByZXR1cm4gKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQgPT4ge1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHN0YWNrVHJhY2UpO1xuICAgIGNvbnN0IGlubmVyU3RhY2tUcmFjZSA9IGdldFN0YWNrVHJhY2UoMSk7XG4gICAgc3RhY2tUcmFjZSArPSBgXFxuICAgIGF0IC0tLSBjb252ZXJ0QXN5bmNUb1N5bmMgLS0tICgwKVxcbiR7aW5uZXJTdGFja1RyYWNlfWA7XG4gICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gYXN5bmNGdW5jdGlvbiguLi4kYXJndW1lbnRzKSwgc3RhY2tUcmFjZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhbiBhc3luY2hyb25vdXMgb25lIGJ5IHdyYXBwaW5nIGl0IGluIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS5cbiAqIEBwYXJhbSBzeW5jRnVuY3Rpb24gLSBUaGUgc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgc3luY2hyb25vdXMgZnVuY3Rpb24gaW4gYW4gYXN5bmNocm9ub3VzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRTeW5jVG9Bc3luYzxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10sIFJlc3VsdD4oc3luY0Z1bmN0aW9uOiBHZW5lcmljRnVuY3Rpb248QXJndW1lbnRzLCBSZXN1bHQ+KTogR2VuZXJpY0FzeW5jRnVuY3Rpb248QXJndW1lbnRzLCBSZXN1bHQ+IHtcbiAgcmV0dXJuIGFzeW5jICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpOiBQcm9taXNlPFJlc3VsdD4gPT4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICAgIHJldHVybiBzeW5jRnVuY3Rpb24oLi4uJGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8qKlxuICogSGFuZGxlcyBhIHNpbGVudCBlcnJvci5cbiAqXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdG8gaGFuZGxlLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZXJyb3IgaXMgYSBzaWxlbnQgZXJyb3IuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtYm9vbGVhbi1uYW1lIC0tIFRoZSBuYW1lIHN0YXRlcyB0aGUgYWN0aW9uOyB0aGUgYm9vbGVhbiBvbmx5IHJlcG9ydHMgd2hldGhlciB0aGUgZXJyb3Igd2FzIGhhbmRsZWQuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlU2lsZW50RXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgbGV0IGNhdXNlID0gZXJyb3I7XG4gIHdoaWxlICghKGNhdXNlIGluc3RhbmNlb2YgU2lsZW50RXJyb3IpKSB7XG4gICAgaWYgKCEoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYXVzZSA9IGNhdXNlLmNhdXNlO1xuICB9XG5cbiAgZ2V0TGliRGVidWdnZXIoJ0FzeW5jOmhhbmRsZVNpbGVudEVycm9yJykoZXJyb3IpO1xuICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogSWdub3JlcyBhbiBlcnJvciB0aGF0IGlzIHRocm93biBieSBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBBbHdheXMgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZmFpbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcihwcm9taXNlOiBQcm9taXNlPHVua25vd24+LCBmYWxsYmFja1ZhbHVlPzogdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPjtcbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlOiBUKTogUHJvbWlzZTxUPjtcbi8qKlxuICogSWdub3JlcyBhbiBlcnJvciB0aGF0IGlzIHRocm93biBieSBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlPzogVCk6IFByb21pc2U8VCB8IHZvaWQ+IHtcbiAgY29uc3QgaWdub3JlRXJyb3JEZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzppZ25vcmVFcnJvcicpO1xuICBjb25zdCBzdGFja1RyYWNlID0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZ25vcmVFcnJvckRlYnVnZ2VyKFxuICAgICAgJ0lnbm9yZWQgZXJyb3InLFxuICAgICAgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgbWVzc2FnZTogJ0lnbm9yZWQgZXJyb3InLFxuICAgICAgICBzdGFja1RyYWNlXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIGZhbGxiYWNrVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2VzIGEge0BsaW5rIFByb21pc2V9IGFuZCBzYWZlbHkgaGFuZGxlcyBhbnkgZXJyb3JzIGJ5IGNhdGNoaW5nIHRoZW0gYW5kIGVtaXR0aW5nIGFuIGFzeW5jIGVycm9yIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhc3luY0Z1bmN0aW9uIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBpbnZva2Ugc2FmZWx5LlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jRnVuY3Rpb246ICgpID0+IFByb21pc2FibGU8dW5rbm93bj4sIHN0YWNrVHJhY2U/OiBzdHJpbmcpOiB2b2lkIHtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcblxuICBsZXQgcmVzdWx0OiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlc3VsdCA9IGFzeW5jRnVuY3Rpb24oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1wcm9taXNlLXJlamVjdC1lcnJvcnMgLS0gUmUtcmVqZWN0aW5nIHRoZSBvcmlnaW5hbCBjYXVnaHQgZXJyb3IgYXMtaXMuXG4gICAgbm90aWZ5QXN5bmNPcGVyYXRpb25TdGFydGVkKGFkZEVycm9ySGFuZGxlcigoKSA9PiBQcm9taXNlLnJlamVjdChlcnJvciksIHN0YWNrVHJhY2UpKTtcbiAgfVxuICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgIG5vdGlmeUFzeW5jT3BlcmF0aW9uU3RhcnRlZChhZGRFcnJvckhhbmRsZXIoKCkgPT4gcmVzdWx0LCBzdGFja1RyYWNlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2VzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBhZnRlciBhIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlQXN5bmNTYWZlbHlBZnRlckRlbGF5KHBhcmFtczogSW52b2tlQXN5bmNTYWZlbHlBZnRlckRlbGF5UGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBhc3luY0Z1bmN0aW9uLFxuICAgIGRlbGF5SW5NaWxsaXNlY29uZHMgPSAwXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsID8/IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHBhcmFtcy5zdGFja1RyYWNlID8/IGdldFN0YWNrVHJhY2UoMSk7XG4gIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBzbGVlcCh7IGFib3J0U2lnbmFsLCBtaWxsaXNlY29uZHM6IGRlbGF5SW5NaWxsaXNlY29uZHMsIHNob3VsZFRocm93T25BYm9ydDogdHJ1ZSB9KTtcbiAgICBhd2FpdCBhc3luY0Z1bmN0aW9uKGFib3J0U2lnbmFsKTtcbiAgfSwgc3RhY2tUcmFjZSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYXN5bmMgZnVuY3Rpb25zIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gYXN5bmNGbnMgLSBUaGUgYXN5bmMgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBhc3luYyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHk8VD4oYXN5bmNGbnM6ICgoKSA9PiBQcm9taXNhYmxlPFQ+KVtdKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGZvciAoY29uc3QgYXN5bmNGdW5jdGlvbiBvZiBhc3luY0Zucykge1xuICAgIHJlc3VsdHMucHVzaChhd2FpdCBhc3luY0Z1bmN0aW9uKCkpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHByb21pc2VzIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcHJvbWlzZXMgLSBUaGUgcHJvbWlzZXMgdG8gZXhlY3V0ZSBzZXF1ZW50aWFsbHkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIHByb21pc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbFNlcXVlbnRpYWxseTxUPihwcm9taXNlczogUHJvbWlzYWJsZTxUPltdKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxBc3luY0Zuc1NlcXVlbnRpYWxseShwcm9taXNlcy5tYXAoKHByb21pc2UpID0+ICgpID0+IHByb21pc2UpKTtcbn1cblxuY29uc3QgdGVybWluYXRlUmV0cnlFcnJvcnMgPSBuZXcgV2Vha1NldDxFcnJvcj4oKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmV0cnlXaXRoVGltZW91dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlXaXRoVGltZW91dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSB0aW1lb3V0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSB0aW1lb3V0IGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBvblRpbWVvdXQ/OiAoY29udGV4dDogVGltZW91dENvbnRleHQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJldHJ5IG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSByZXRyeU9wdGlvbnM/OiBSZXRyeU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tUcmFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcnVuV2l0aFRpbWVvdXR9LlxuICpcbiAqIEB0eXBlUGFyYW0gUmVzdWx0IC0gVGhlIHR5cGUgb2YgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bldpdGhUaW1lb3V0UGFyYW1zPFJlc3VsdD4ge1xuICAvKipcbiAgICogVGhlIGNvbnRleHQgb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dD86IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHRpbWVvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHRpbWVvdXQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9uVGltZW91dD86IChjb250ZXh0OiBUaW1lb3V0Q29udGV4dCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrVHJhY2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2xlZXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNsZWVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBtaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25BYm9ydD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udGV4dCBwcm92aWRlZCB0byB0aGUgdGltZW91dCBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVvdXRDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIG9wZXJhdGlvbiBzdGFydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb246IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAgICovXG4gIG9uT3BlcmF0aW9uQ29tcGxldGVkOiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGVybWluYXRlcyB0aGUgb3BlcmF0aW9uIHRoYXQgdGltZWQgb3V0LlxuICAgKi9cbiAgdGVybWluYXRlT3BlcmF0aW9uOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0aW1lb3V0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lb3V0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gbGlzdGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25BYm9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lb3V0IHBlcmlvZCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDaGFpbnMgYSBwcm9taXNlIHdpdGggYW5vdGhlciBwcm9taXNlLlxuICpcbiAqIEBwYXJhbSBjaGFpblByb21pc2UgLSBSZXByZXNlbnRzIHRoZSBjaGFpbmVkIHByb21pc2UuXG4gKiBAcGFyYW0gcHJvbWlzYWJsZUZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHRvIGNoYWluLlxuICogQHJldHVybnMgQ2hhaW5lZCBwcm9taXNlIG9yIGBudWxsYCBpZiBubyBhc3luYyBsb2dpYyBpcyBjaGFpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhaW4oY2hhaW5Qcm9taXNlOiBudWxsIHwgUHJvbWlzZTx2b2lkPiwgcHJvbWlzYWJsZUZ1bmN0aW9uOiAoKSA9PiBudWxsIHwgUHJvbWlzYWJsZTx2b2lkPik6IG51bGwgfCBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG5leHRDaGFpblByb21pc2UgPSBjaGFpblByb21pc2U7XG4gIGlmIChjaGFpblByb21pc2UpIHtcbiAgICBuZXh0Q2hhaW5Qcm9taXNlID0gY2hhaW5Qcm9taXNlLnRoZW4oKCkgPT4gcHJvbWlzYWJsZUZ1bmN0aW9uKCkgPz8gdW5kZWZpbmVkKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9taXNhYmxlID0gcHJvbWlzYWJsZUZ1bmN0aW9uKCk7XG4gICAgaWYgKHByb21pc2FibGUpIHtcbiAgICAgIG5leHRDaGFpblByb21pc2UgPSBwcm9taXNhYmxlIGluc3RhbmNlb2YgUHJvbWlzZSA/IHByb21pc2FibGUgYXMgUHJvbWlzZTx2b2lkPiA6IFByb21pc2UucmVzb2x2ZShwcm9taXNhYmxlKTtcbiAgICB9XG4gIH1cblxuICBuZXh0Q2hhaW5Qcm9taXNlPy5jYXRjaChub29wKTtcbiAgcmV0dXJuIG5leHRDaGFpblByb21pc2U7XG59XG5cbi8qKlxuICogR2V0cyB3aGV0aGVyIGEge0BsaW5rIHJ1bldpdGhUaW1lb3V0fSBjYWxsIHdpdGhvdXQgaXRzIG93biBgb25UaW1lb3V0YCB0ZXJtaW5hdGVzIHRoZSBvcGVyYXRpb24gd2hlbiBpdCB0aW1lcyBvdXQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBnZXRUZXJtaW5hdGVPblRpbWVvdXREZWJ1Z1N3aXRjaH1gKCkuaXNFbmFibGVkKClgLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCAodGhlIGRlZmF1bHQpIGlmIGEgdGltZWQtb3V0IG9wZXJhdGlvbiBpcyB0ZXJtaW5hdGVkLCBgZmFsc2VgIGlmIGl0IGlzIGxlZnQgcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGVybWluYXRpb25PblRpbWVvdXRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0VGVybWluYXRlT25UaW1lb3V0RGVidWdTd2l0Y2goKS5pc0VuYWJsZWQoKTtcbn1cblxuLyoqXG4gKiBNYXJrcyBhbiBlcnJvciB0byB0ZXJtaW5hdGUgcmV0cnkgbG9naWMuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIG1hcmsgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya3NBc1Rlcm1pbmF0ZVJldHJ5KGVycm9yOiBFcnJvcik6IHZvaWQge1xuICB0ZXJtaW5hdGVSZXRyeUVycm9ycy5hZGQoZXJyb3IpO1xufVxuXG4vKipcbiAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgbmV2ZXIgZW5kcy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IG5ldmVyIHJlc29sdmVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV2ZXJFbmRzKCk6IFByb21pc2U8bmV2ZXI+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKCkgPT4ge1xuICAgIG5vb3AoKTtcbiAgfSk7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBFeGhhdXN0aXZlIHN3aXRjaCBndWFyZDsgdGhlIGF3YWl0IGFib3ZlIG5ldmVyIHJlc29sdmVzLiAqL1xuICBhc3NlcnQoZmFsc2UsICdTaG91bGQgbmV2ZXIgaGFwcGVuJyk7XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCB0aWNrLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgdGljayBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBuZXh0VGlja0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIG5hdGl2ZSBwcm9taXNhYmxlLCBjb252ZXJ0aW5nIHtAbGluayBQcm9taXNlTGlrZX0gKGFrYSBUaGVuYWJsZSkgdG8gYSBuYXRpdmUge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSBwcm9taXNhYmxlIC0gVGhlIHByb21pc2FibGUgdG8gbm9ybWFsaXplLlxuICogQHJldHVybnMgVGhlIHZhbHVlIGl0c2VsZiBvciBhIG5hdGl2ZSB7QGxpbmsgUHJvbWlzZX0gaWYgdGhlIHZhbHVlIGlzIGEge0BsaW5rIFByb21pc2VMaWtlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVByb21pc2FibGU8VD4ocHJvbWlzYWJsZTogUHJvbWlzYWJsZTxUPik6IFByb21pc2U8VD4gfCBUIHtcbiAgaWYgKCFwcm9taXNhYmxlKSB7XG4gICAgcmV0dXJuIHByb21pc2FibGU7XG4gIH1cblxuICBpZiAocHJvbWlzYWJsZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICByZXR1cm4gcHJvbWlzYWJsZSBhcyBQcm9taXNlPFQ+O1xuICB9XG5cbiAgcmV0dXJuIChwcm9taXNhYmxlIGFzIFBhcnRpYWw8UHJvbWlzZUxpa2U8VD4+KS50aGVuID8gUHJvbWlzZS5yZXNvbHZlKHByb21pc2FibGUpIDogKHByb21pc2FibGUgYXMgVCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCBxdWV1ZSBtaWNyb3Rhc2suXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBxdWV1ZSBtaWNyb3Rhc2sgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcXVldWVNaWNyb3Rhc2tBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lLlxuICpcbiAqIEBwYXJhbSBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSBmYWxsYmFjayB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byByZXNvbHZlIHRoZSBwcm9taXNlIGlmIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIGRvZXMgbm90IGZpcmUgKGUuZy4gdGhlIHdpbmRvdyBpcyBub3QgYWN0aXZlKS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGAxMDBgIG1pbGxpc2Vjb25kcy4gVXNlIGAwYCB0byBkaXNhYmxlIHRoZSBmYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgcmVxdWVzdCBhbmltYXRpb24gZnJhbWUgaXMgYXZhaWxhYmxlIChvciB3aGVuIHRoZSBmYWxsYmFjayB0aW1lIGlzIHJlYWNoZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmMoZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmNQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgREVGQVVMVF9GQUxMQkFDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDtcbiAgZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz89IERFRkFVTFRfRkFMTEJBQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgcmV0dXJuIFByb21pc2UucmFjZShbcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmNQcm9taXNlLCBmYWxsYmFja1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA+IDAgPyBzbGVlcCh7IG1pbGxpc2Vjb25kczogZmFsbGJhY2tUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSkgOiBuZXZlckVuZHMoKV0pO1xufVxuXG4vKipcbiAqIFJldHJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVudGlsIGl0IHJldHVybnMgYHRydWVgIG9yIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgYHRydWVgIG9yIHJlamVjdHMgd2hlbiB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV0cnlXaXRoVGltZW91dChwYXJhbXM6IFJldHJ5V2l0aFRpbWVvdXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0FzeW5jOnJldHJ5V2l0aFRpbWVvdXQnKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHBhcmFtcy5zdGFja1RyYWNlID8/IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IERFRkFVTFRfUkVUUllfT1BUSU9OUyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kczogMTAwLFxuICAgIHNob3VsZFJldHJ5T25FcnJvcjogZmFsc2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnMgLS0gRXh0cmFjdGluZyBtYWdpYyBudW1iZXIgYXMgYSBjb25zdGFudCB3b3VsZCBiZSByZXBldGl0aXZlLCBhcyB0aGUgdmFsdWUgaXMgdXNlZCBvbmx5IG9uY2UgYW5kIGl0cyBuYW1lIHdvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBwcm9wZXJ0eS5cbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDUwMDBcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucGFyYW1zLnJldHJ5T3B0aW9ucyB9O1xuICBmdWxsT3B0aW9ucy5hYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcblxuICBhd2FpdCBydW5XaXRoVGltZW91dChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UnVuV2l0aFRpbWVvdXRQYXJhbXM8dm9pZD4+KHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnLCByZXRyeUZ1bmN0aW9uOiBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24gfSxcbiAgICBvblRpbWVvdXQ6IHBhcmFtcy5vblRpbWVvdXQsXG4gICAgYXN5bmMgb3BlcmF0aW9uRnVuY3Rpb24oYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBjb21iaW5lZEFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsKTtcbiAgICAgIGNvbWJpbmVkQWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgIHdoaWxlICghY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgbGV0IGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpc1N1Y2Nlc3MgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uRnVuY3Rpb24oY29tYmluZWRBYm9ydFNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gSXQgbWlnaHQgY2hhbmdlZCBpbnNpZGUgYGZuKClgLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gICAgICAgICAgaWYgKGNvbWJpbmVkQWJvcnRTaWduYWwuYWJvcnRlZCB8fCAhZnVsbE9wdGlvbnMuc2hvdWxkUmV0cnlPbkVycm9yIHx8IHRlcm1pbmF0ZVJldHJ5RXJyb3JzLmhhcyhlcnJvciBhcyBFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3Ioe1xuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdyZXRyeVdpdGhUaW1lb3V0IGZhaWxlZCcsXG4gICAgICAgICAgICAgIHN0YWNrVHJhY2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmludEVycm9yKGVycm9yKTtcbiAgICAgICAgICBpc1N1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdWNjZXNzKSB7XG4gICAgICAgICAgcHJpbnRXaXRoU3RhY2tUcmFjZSh7XG4gICAgICAgICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBwYXJhbXMub3BlcmF0aW9uTmFtZSA/PyAnJ1xuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgICAgICBtZXNzYWdlOiBgUmV0cnkgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhZnRlciAke1N0cmluZyhhdHRlbXB0KX0gYXR0ZW1wdHNgLFxuICAgICAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50V2l0aFN0YWNrVHJhY2Uoe1xuICAgICAgICAgICRhcmd1bWVudHM6IFt7XG4gICAgICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIsXG4gICAgICAgICAgbWVzc2FnZTogYFJldHJ5IGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9IGNvbXBsZXRlZCB1bnN1Y2Nlc3NmdWxseS4gVHJ5aW5nIGFnYWluIGluICR7U3RyaW5nKGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2AsXG4gICAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBzbGVlcCh7IGFib3J0U2lnbmFsLCBtaWxsaXNlY29uZHM6IGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnLFxuICAgIHN0YWNrVHJhY2UsXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBmdWxsT3B0aW9ucy50aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQuIElmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgdGltZWQgb3V0LlxuICpcbiAqIFdpdGhvdXQgYW4gYG9uVGltZW91dGAsIGEgdGltZWQtb3V0IGZ1bmN0aW9uIGlzIHRlcm1pbmF0ZWQsIHVubGVzcyB0aGUge0BsaW5rIGdldFRlcm1pbmF0ZU9uVGltZW91dERlYnVnU3dpdGNofSBkZWJ1ZyBzd2l0Y2ggaXMgb2ZmLFxuICogaW4gd2hpY2ggY2FzZSBpdCBpcyBhbGxvd2VkIHRvIHJ1biBpbmRlZmluaXRlbHkuXG4gKlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IGZyb20gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvciByZWplY3RzIGlmIGl0IHRpbWVzIG91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhUaW1lb3V0PFJlc3VsdD4ocGFyYW1zOiBSdW5XaXRoVGltZW91dFBhcmFtczxSZXN1bHQ+KTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IHBhcmFtcy5zdGFja1RyYWNlID8/IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIGNvbnN0IHJ1bkFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBsZXQgcmVzdWx0OiBudWxsIHwgUmVzdWx0ID0gbnVsbDtcbiAgbGV0IGhhc1Jlc3VsdCA9IGZhbHNlO1xuICBsZXQgaXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgY29uc3QgcnVuV2l0aFRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpydW5XaXRoVGltZW91dCcpO1xuICBjb25zdCBvblRpbWVvdXQgPSBwYXJhbXMub25UaW1lb3V0ID8/IGRlZmF1bHRPblRpbWVvdXQ7XG5cbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtydW4oKSwgaW5uZXJUaW1lb3V0KCldKTtcbiAgLy8gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBydW4gZmluaXNoZWQgb24gaXRzIG93bi4gV2hlbiB0aGUgdGltZW91dCB0ZXJtaW5hdGVkIGl0LCB0aGVcbiAgLy8gb3BlcmF0aW9uIG1pZ2h0IHN0aWxsIHJlc29sdmUgYWZ0ZXJ3YXJkcyAoZS5nLiBhIHJldHJ5IGxvb3AgdGhhdCBleGl0cyBvbiBhYm9ydCksIGJ1dCB0aGF0IHZhbHVlXG4gIC8vIGlzIHBhc3QgdGhlIGRlYWRsaW5lIGFuZCBtdXN0IGJlIHRyZWF0ZWQgYXMgYSBmYWlsdXJlLCBub3QgYSBzdWNjZXNzLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBCb3RoIG1pZ2h0IGNoYW5nZSBpbnNpZGUgYHJ1bigpYC9gaW5uZXJUaW1lb3V0KClgLiBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChoYXNSZXN1bHQgJiYgIXJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybiByZXN1bHQgYXMgUmVzdWx0O1xuICB9XG5cbiAgdGhyb3cgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcih7XG4gICAgY2F1c2U6IHJ1bkFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uLFxuICAgIG1lc3NhZ2U6ICdSdW4gd2l0aCB0aW1lb3V0IGZhaWxlZCcsXG4gICAgc3RhY2tUcmFjZVxuICB9KTtcblxuICBhc3luYyBmdW5jdGlvbiBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5vcGVyYXRpb25GdW5jdGlvbihydW5BYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gTWF0aC50cnVuYyhwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgICBwcmludFdpdGhTdGFja1RyYWNlKHtcbiAgICAgICAgJGFyZ3VtZW50czogW3tcbiAgICAgICAgICBjb250ZXh0OiBwYXJhbXMuY29udGV4dCxcbiAgICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogcGFyYW1zLm9wZXJhdGlvbkZ1bmN0aW9uLFxuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnXG4gICAgICAgIH1dLFxuICAgICAgICBkZWJ1Z2dlckluc3RhbmNlOiBydW5XaXRoVGltZW91dERlYnVnZ2VyLFxuICAgICAgICBtZXNzYWdlOiBgRXhlY3V0aW9uIHRpbWU6ICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCxcbiAgICAgICAgc3RhY2tUcmFjZVxuICAgICAgfSk7XG4gICAgICBoYXNSZXN1bHQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBydW5BYm9ydENvbnRyb2xsZXIuYWJvcnQoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0NvbXBsZXRlZCA9IHRydWU7XG4gICAgICB0aW1lb3V0QWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcignQ29tcGxldGVkJykpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGlubmVyVGltZW91dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzbGVlcCh7IGFib3J0U2lnbmFsOiB0aW1lb3V0QWJvcnRDb250cm9sbGVyLnNpZ25hbCwgbWlsbGlzZWNvbmRzOiBwYXJhbXMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pO1xuXG4gICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGR1cmF0aW9uID0gTWF0aC50cnVuYyhwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZSk7XG4gICAgcHJpbnRXaXRoU3RhY2tUcmFjZSh7XG4gICAgICAkYXJndW1lbnRzOiBbe1xuICAgICAgICBjb250ZXh0OiBwYXJhbXMuY29udGV4dCxcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IHBhcmFtcy5vcGVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUgPz8gJydcbiAgICAgIH1dLFxuICAgICAgZGVidWdnZXJJbnN0YW5jZTogcnVuV2l0aFRpbWVvdXREZWJ1Z2dlcixcbiAgICAgIG1lc3NhZ2U6IGBUaW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgLFxuICAgICAgc3RhY2tUcmFjZVxuICAgIH0pO1xuXG4gICAgY29uc3QgdGltZW91dENvbnRleHQ6IFRpbWVvdXRDb250ZXh0ID0gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFRpbWVvdXRDb250ZXh0Pih7XG4gICAgICBkdXJhdGlvbixcbiAgICAgIG9uT3BlcmF0aW9uQ29tcGxldGVkKGNhbGxiYWNrKSB7XG4gICAgICAgIHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgY2FsbGJhY2spO1xuICAgICAgfSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lID8/ICcnLFxuICAgICAgdGVybWluYXRlT3BlcmF0aW9uKCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgVGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCk7XG4gICAgICAgIHJ1bkFib3J0Q29udHJvbGxlci5hYm9ydChlcnJvcik7XG4gICAgICAgIHRpbWVvdXRBYm9ydENvbnRyb2xsZXIuYWJvcnQoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgb25UaW1lb3V0KHRpbWVvdXRDb250ZXh0KTtcbiAgICBhd2FpdCB3YWl0Rm9yQWJvcnQodGltZW91dEFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgc2V0IGltbWVkaWF0ZSBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRJbW1lZGlhdGVBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2V0cyB3aGV0aGVyIGEge0BsaW5rIHJ1bldpdGhUaW1lb3V0fSBjYWxsIHdpdGhvdXQgaXRzIG93biBgb25UaW1lb3V0YCB0ZXJtaW5hdGVzIHRoZSBvcGVyYXRpb24gd2hlbiBpdCB0aW1lcyBvdXQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBnZXRUZXJtaW5hdGVPblRpbWVvdXREZWJ1Z1N3aXRjaH1gKCkuc2V0RW5hYmxlZChpc0VuYWJsZWQpYC5cbiAqXG4gKiBAcGFyYW0gaXNFbmFibGVkIC0gYHRydWVgIHRvIHRlcm1pbmF0ZSBhIHRpbWVkLW91dCBvcGVyYXRpb24sIGBmYWxzZWAgdG8gbGVhdmUgaXQgcnVubmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRlcm1pbmF0aW9uT25UaW1lb3V0RW5hYmxlZChpc0VuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgZ2V0VGVybWluYXRlT25UaW1lb3V0RGVidWdTd2l0Y2goKS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7XG59XG5cbi8qKlxuICogRGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gZGVsYXkgLSBUaGUgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldFRpbWVvdXRBc3luYyhkZWxheT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KTtcbiAgfSk7XG59XG5cbi8qKlxuICogRGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKHBhcmFtczogU2xlZXBQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFib3J0U2lnbmFsLFxuICAgIG1pbGxpc2Vjb25kcyxcbiAgICBzaG91bGRUaHJvd09uQWJvcnRcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgd2FpdEZvckFib3J0KGFib3J0U2lnbmFsQW55KGFib3J0U2lnbmFsLCBhYm9ydFNpZ25hbFRpbWVvdXQobWlsbGlzZWNvbmRzKSkpO1xuICBpZiAoc2hvdWxkVGhyb3dPbkFib3J0KSB7XG4gICAgYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVqZWN0cyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgcGVyaW9kLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBhbHdheXMgcmVqZWN0cyB3aXRoIGEgdGltZW91dCBlcnJvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRpbWVvdXQocGFyYW1zOiBUaW1lb3V0UGFyYW1zKTogUHJvbWlzZTxuZXZlcj4ge1xuICBjb25zdCB7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgc2hvdWxkVGhyb3dPbkFib3J0LFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBzbGVlcChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2xlZXBQYXJhbXM+KHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBtaWxsaXNlY29uZHM6IHRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICBzaG91bGRUaHJvd09uQWJvcnRcbiAgfSkpO1xuICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCBpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gYW4gYXJyYXkgYnkgY29uc3VtaW5nIGFsbCBpdHMgZWxlbWVudHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgcHJvZHVjZWQgYnkgdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqIEBwYXJhbSBpdGVyIC0gVGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYXJyYXk6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcikge1xuICAgIGFycmF5LnB1c2goaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0T25UaW1lb3V0KGNvbnRleHQ6IFRpbWVvdXRDb250ZXh0KTogdm9pZCB7XG4gIGlmIChnZXRUZXJtaW5hdGVPblRpbWVvdXREZWJ1Z1N3aXRjaCgpLmlzRW5hYmxlZCgpKSB7XG4gICAgY29udGV4dC50ZXJtaW5hdGVPcGVyYXRpb24oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cnVuV2l0aFRpbWVvdXQnKShcbiAgICBgVGltZW91dCB0ZXJtaW5hdGlvbiBpcyBzd2l0Y2hlZCBvZmYsIHNvIHRoZSBvcGVyYXRpb24gJyR7Y29udGV4dC5vcGVyYXRpb25OYW1lfScga2VlcHMgcnVubmluZyBhZnRlciAke1N0cmluZyhjb250ZXh0LmR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYFxuICApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFjQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyx3Q0FBd0M7QUFDakQ7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG1DQUFtQztBQUM1QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQTZFUCxlQUFzQixnQkFBZ0IsZUFBdUMsWUFBb0M7QUFDL0csaUJBQWUsY0FBYyxDQUFDO0FBRTlCLFFBQU0sa0NBQWtDLGdDQUFnQztBQUN4RSxNQUFJO0FBQ0YsVUFBTSxjQUFjO0FBQUEsRUFDdEIsU0FBUyxZQUFZO0FBQ25CLFVBQU0sZUFBZSxJQUFJLHNCQUFzQjtBQUFBLE1BQzdDLE9BQU87QUFBQSxNQUNQLFNBQVM7QUFBQSxNQUNUO0FBQUEsSUFDRixDQUFDO0FBQ0QsUUFBSSxrQkFBa0IsWUFBWSxHQUFHO0FBQ25DO0FBQUEsSUFDRjtBQUNBLHdCQUFvQixjQUFjLCtCQUErQjtBQUFBLEVBQ25FO0FBQ0Y7QUFVQSxlQUFzQixZQUFlLE9BQVksV0FBdUY7QUFDdEksUUFBTSxNQUFXLENBQUM7QUFFbEIsUUFBTSxTQUFTLE1BQU07QUFDckIsV0FBUyxRQUFRLEdBQUcsUUFBUSxRQUFRLFNBQVM7QUFDM0MsUUFBSSxDQUFDLE9BQU8sT0FBTyxPQUFPLEtBQUssR0FBRztBQUNoQztBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8s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
|