@fgv/ts-utils 1.7.2 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/converters.d.ts +4 -4
- package/converters.d.ts.map +1 -1
- package/converters.js +2 -2
- package/csvHelpers.d.ts +2 -1
- package/csvHelpers.d.ts.map +1 -1
- package/csvHelpers.js +1 -1
- package/normalize.js +2 -2
- package/package.json +9 -9
- package/result.d.ts +44 -2
- package/result.d.ts.map +1 -1
- package/result.js +29 -1
package/README.md
CHANGED
|
@@ -38,7 +38,7 @@ Also includes a few other much less-developed odds-and-ends borrowed from one pr
|
|
|
38
38
|
|
|
39
39
|
With npm:
|
|
40
40
|
```sh
|
|
41
|
-
npm install ts-utils
|
|
41
|
+
npm install @fgv/ts-utils
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
## API Documentation
|
|
@@ -71,20 +71,20 @@ function thisFunctionFails(): number {
|
|
|
71
71
|
}
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
Use *
|
|
74
|
+
Use *orDefault* when a failure can be safely ignored:
|
|
75
75
|
```ts
|
|
76
76
|
// returns undefined on failure
|
|
77
|
-
const value1: string|undefined = functionReturningResult('whatever').
|
|
77
|
+
const value1: string|undefined = functionReturningResult('whatever').orDefault();
|
|
78
78
|
|
|
79
79
|
// returns 'oops' on failure
|
|
80
|
-
const value2: string = functionReturningResult('whatever').
|
|
80
|
+
const value2: string = functionReturningResult('whatever').orDefault('oops');
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
The *
|
|
83
|
+
The *orThrow* method converts a failure result to an exception, for use in contexts (such as constructors) in which an exception is the most appropriate way to handle errors.
|
|
84
84
|
|
|
85
85
|
```ts
|
|
86
86
|
constructor(param: string) {
|
|
87
|
-
this._param = validateReturnsResult(param).
|
|
87
|
+
this._param = validateReturnsResult(param).orThrow();
|
|
88
88
|
}
|
|
89
89
|
```
|
|
90
90
|
|
|
@@ -128,7 +128,7 @@ const thingConverter = Converters.object<Thing>({
|
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
// gets a Thing or throws an error
|
|
131
|
-
const thing: Things = thingConverter.convert(json).
|
|
131
|
+
const thing: Things = thingConverter.convert(json).orThrow();
|
|
132
132
|
```
|
|
133
133
|
|
|
134
134
|
Everything is strongly-typed, so Intellisense will autocomplete properties and highlight errors in the object supplied to *Converters.object*.
|
package/converters.d.ts
CHANGED
|
@@ -260,7 +260,7 @@ export declare const stringArray: Converter<string[], unknown>;
|
|
|
260
260
|
*/
|
|
261
261
|
export declare const numberArray: Converter<number[], undefined>;
|
|
262
262
|
/**
|
|
263
|
-
* Options for {@link Converters.(
|
|
263
|
+
* Options for {@link Converters.recordOf.(:withOptions)} and {@link Converters.mapOf.(:withOptions)}
|
|
264
264
|
* helper functions.
|
|
265
265
|
* @public
|
|
266
266
|
*/
|
|
@@ -547,11 +547,11 @@ export declare function object<T>(properties: FieldConverters<T>, options?: Obje
|
|
|
547
547
|
* {@label withKeys}
|
|
548
548
|
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} which applies the specified conversions.
|
|
549
549
|
* @public
|
|
550
|
-
* @deprecated Use {@link Converters.(
|
|
550
|
+
* @deprecated Use {@link Converters.object.(:withOptions) | Converters.object(fields, options)} instead.
|
|
551
551
|
*/
|
|
552
552
|
export declare function object<T>(properties: FieldConverters<T>, optional: (keyof T)[]): ObjectConverter<T>;
|
|
553
553
|
/**
|
|
554
|
-
* Options for the {@link Converters.(
|
|
554
|
+
* Options for the {@link Converters.strictObject.(:withOptions)} helper function.
|
|
555
555
|
* @public
|
|
556
556
|
*/
|
|
557
557
|
export type StrictObjectConverterOptions<T> = Omit<ObjectConverterOptions<T>, 'strict'>;
|
|
@@ -590,7 +590,7 @@ export declare function strictObject<T>(properties: FieldConverters<T>, options?
|
|
|
590
590
|
* @param optional - An array of `keyof T` containing keys to be considered optional.
|
|
591
591
|
* @returns A new {@link Converters.ObjectConverter | ObjectConverter} which applies the specified conversions.
|
|
592
592
|
* {@label withKeys}
|
|
593
|
-
* @deprecated Use {@link Converters.(
|
|
593
|
+
* @deprecated Use {@link Converters.strictObject(:withOptions) | Converters.strictObject(options)} instead.
|
|
594
594
|
* @public
|
|
595
595
|
*/
|
|
596
596
|
export declare function strictObject<T>(properties: FieldConverters<T>, optional: (keyof T)[]): ObjectConverter<T>;
|
package/converters.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"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"}
|
package/converters.js
CHANGED
|
@@ -717,7 +717,7 @@ function object(properties, options) {
|
|
|
717
717
|
}
|
|
718
718
|
exports.object = object;
|
|
719
719
|
/**
|
|
720
|
-
* Concrete implementation for {@link Converters.(
|
|
720
|
+
* Concrete implementation for {@link Converters.strictObject(:withOptions) | Converters.strictObject(fields, options)}
|
|
721
721
|
* and {@link Converters.(strictObject:withKeys) | Converters.strictObject(fields, optional)}.
|
|
722
722
|
* @internal
|
|
723
723
|
*/
|
|
@@ -893,4 +893,4 @@ function rangeOf(converter) {
|
|
|
893
893
|
return rangeTypeOf(converter, rangeOf_1.RangeOf.createRange);
|
|
894
894
|
}
|
|
895
895
|
exports.rangeOf = rangeOf;
|
|
896
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF3RTtBQUN4RSx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBR2hFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsd0RBQWdDO0FBQ2hDLG1DQUFrQztBQWlCbEM7Ozs7R0FJRztBQUNILE1BQWEsZUFBeUQsU0FBUSx5QkFBb0I7SUFDOUY7Ozs7O09BS0c7SUFDSCxZQUNJLGNBQW1CLEVBQ25CLE1BQXdCLEVBQ3hCLFlBQWdGLGVBQWUsQ0FBQyxRQUFRO1FBRXhHLEtBQUssQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNPLE1BQU0sQ0FBQyxRQUFRLENBQW1CLElBQWE7UUFDckQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRO1lBQzNCLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsSUFBUyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxJQUFBLGFBQUksRUFBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ08sTUFBTSxDQUFDLEtBQUssQ0FDbEIsT0FBK0IsRUFDL0IsU0FBaUMsRUFDakMsTUFBd0I7UUFFeEIsT0FBTyxJQUFJLGVBQWUsQ0FBUSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsSUFBYSxFQUFFLEVBQUU7WUFDdEUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3RD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QUMsQ0FBQztBQUNQLENBQUM7QUFYRCxrQ0FXQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsT0FBTyxDQUFnQixTQUEyQjtJQUM5RCxPQUFPLFdBQVcsQ0FBb0IsU0FBUyxFQUFFLGlCQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUZELDBCQUVDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEJhc2VDb252ZXJ0ZXIsIENvbnZlcnRlciwgQ29udmVydGVyVHJhaXRzIH0gZnJvbSAnLi9jb252ZXJ0ZXInO1xuaW1wb3J0IHsgUmFuZ2VPZiwgUmFuZ2VPZlByb3BlcnRpZXMgfSBmcm9tICcuL3JhbmdlT2YnO1xuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHsgVHlwZUd1YXJkV2l0aENvbnRleHQsIFZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcnJheSB9IGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuaW1wb3J0IHsgaXNLZXlPZiB9IGZyb20gJy4vdXRpbHMnO1xuXG50eXBlIE9uRXJyb3IgPSAnZmFpbE9uRXJyb3InIHwgJ2lnbm9yZUVycm9ycyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfVxuICogbWF0Y2hpbmcgbWV0aG9kXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nTWF0Y2hPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBpZiBhIG5vbi1tYXRjaGluZyBzdHJpbmdcbiAgICAgKiBpcyBlbmNvdW50ZXJlZC5cbiAgICAgKi9cbiAgICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9IGNsYXNzIGV4dGVuZHMge0BsaW5rIEJhc2VDb252ZXJ0ZXJ9XG4gKiB0byBwcm92aWRlIHN0cmluZy1zcGVjaWZpYyBoZWxwZXIgbWV0aG9kcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ0NvbnZlcnRlcjxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLCBUQyA9IHVua25vd24+IGV4dGVuZHMgQmFzZUNvbnZlcnRlcjxULCBUQz4ge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIG5ldyB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9LlxuICAgICAqIEBwYXJhbSBkZWZhdWx0Q29udGV4dCAtIE9wdGlvbmFsIGNvbnRleHQgdXNlZCBieSB0aGUgY29udmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gdHJhaXRzIC0gT3B0aW9uYWwgdHJhaXRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvbnZlcnNpb24uXG4gICAgICogQHBhcmFtIGNvbnZlcnRlciAtIE9wdGlvbmFsIGNvbnZlcnNpb24gZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgdGhlIGNvbnZlcnNpb24uXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBkZWZhdWx0Q29udGV4dD86IFRDLFxuICAgICAgICB0cmFpdHM/OiBDb252ZXJ0ZXJUcmFpdHMsXG4gICAgICAgIGNvbnZlcnRlcjogKGZyb206IHVua25vd24sIHNlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4gUmVzdWx0PFQ+ID0gU3RyaW5nQ29udmVydGVyLl9jb252ZXJ0LFxuICAgICkge1xuICAgICAgICBzdXBlcihjb252ZXJ0ZXIsIGRlZmF1bHRDb250ZXh0LCB0cmFpdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2NvbnZlcnQ8VCBleHRlbmRzIHN0cmluZz4oZnJvbTogdW5rbm93bik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gc3VjY2VlZChmcm9tIGFzIFQpXG4gICAgICAgICAgICA6IGZhaWwoYE5vdCBhIHN0cmluZzogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF93cmFwPFQgZXh0ZW5kcyBzdHJpbmcsIFRDPihcbiAgICAgICAgd3JhcHBlZDogU3RyaW5nQ29udmVydGVyPFQsIFRDPixcbiAgICAgICAgY29udmVydGVyOiAoZnJvbTogVCkgPT4gUmVzdWx0PFQ+LFxuICAgICAgICB0cmFpdHM/OiBDb252ZXJ0ZXJUcmFpdHNcbiAgICApOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+KHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydChmcm9tKS5vblN1Y2Nlc3MoY29udmVydGVyKTtcbiAgICAgICAgfSkuX3dpdGgod3JhcHBlZC5fdHJhaXRzKHRyYWl0cykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9IHdoaWNoIGNvbnN0cmFpbnMgdGhlIHJlc3VsdCB0byBtYXRjaFxuICAgICAqIGEgc3VwcGxpZWQgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBtYXRjaCAtIFRoZSBzdHJpbmcgdG8gYmUgbWF0Y2hlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nTWF0Y2hPcHRpb25zfSBmb3IgdGhpcyBjb252ZXJzaW9uLlxuICAgICAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGEgbWF0Y2hpbmcgc3RyaW5nIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGluZm9ybWF0aXZlXG4gICAgICogZXJyb3IgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBtYXRjaC5cbiAgICAgKiB7QGxhYmVsIHN0cmluZ31cbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hpbmcobWF0Y2g6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8U3RyaW5nTWF0Y2hPcHRpb25zPik6IFN0cmluZ0NvbnZlcnRlcjxULCBUQz47XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfSB3aGljaCBjb25zdHJhaW5zIHRoZSByZXN1bHQgdG8gbWF0Y2hcbiAgICAgKiBvbmUgb2YgYSBzdXBwbGllZCBhcnJheSBvZiBzdHJpbmdzLlxuICAgICAqIEBwYXJhbSBtYXRjaCAtIFRoZSBhcnJheSBvZiBhbGxvd2VkIHN0cmluZ3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdNYXRjaE9wdGlvbnN9IGZvciB0aGlzIGNvbnZlcnNpb24uXG4gICAgICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYSBtYXRjaGluZyBzdHJpbmcgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gaW5mb3JtYXRpdmVcbiAgICAgKiBlcnJvciBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoLlxuICAgICAqIHtAbGFiZWwgYXJyYXl9XG4gICAgICovXG4gICAgcHVibGljIG1hdGNoaW5nKG1hdGNoOiBzdHJpbmdbXSwgb3B0aW9ucz86IFBhcnRpYWw8U3RyaW5nTWF0Y2hPcHRpb25zPik6IFN0cmluZ0NvbnZlcnRlcjxULCBUQz47XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfSB3aGljaCBjb25zdHJhaW5zIHRoZSByZXN1bHQgdG8gbWF0Y2hcbiAgICAgKiBvbmUgb2YgYSBzdXBwbGllZCBgU2V0YCBvZiBzdHJpbmdzLlxuICAgICAqIEBwYXJhbSBtYXRjaCAtIFRoZSBgU2V0YCBvZiBhbGxvd2VkIHN0cmluZ3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdNYXRjaE9wdGlvbnN9IGZvciB0aGlzIGNvbnZlcnNpb24uXG4gICAgICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYSBtYXRjaGluZyBzdHJpbmcgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gaW5mb3JtYXRpdmVcbiAgICAgKiBlcnJvciBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoLlxuICAgICAqIHtAbGFiZWwgc2V0fVxuICAgICAqL1xuICAgIHB1YmxpYyBtYXRjaGluZyhtYXRjaDogU2V0PFQ+LCBvcHRpb25zPzogUGFydGlhbDxTdHJpbmdNYXRjaE9wdGlvbnM+KTogU3RyaW5nQ29udmVydGVyPFQsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9IHdoaWNoIGNvbnN0cmFpbnMgdGhlIHJlc3VsdCB0byBtYXRjaFxuICAgICAqIGEgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgICAqIEBwYXJhbSBtYXRjaCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgdXNlZCBhcyBhIGNvbnN0cmFpbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdNYXRjaE9wdGlvbnN9IGZvciB0aGlzIGNvbnZlcnNpb25cbiAgICAgKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG1hdGNoaW5nIHN0cmluZyBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBpbmZvcm1hdGl2ZVxuICAgICAqIGVycm9yIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2guXG4gICAgICoge0BsYWJlbCByZWdleHB9XG4gICAgICovXG4gICAgcHVibGljIG1hdGNoaW5nKG1hdGNoOiBSZWdFeHAsIG9wdGlvbnM/OiBQYXJ0aWFsPFN0cmluZ01hdGNoT3B0aW9ucz4pOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyLihtYXRjaGluZyNzdHJpbmcpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKHN0cmluZyl9LFxuICAgICAqIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlci4obWF0Y2hpbmcjYXJyYXkpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKHN0cmluZ1tdKX0sXG4gICAgICoge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyLihtYXRjaGluZyNzZXQpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKFNldDxzdHJpbmc+KX0sIGFuZFxuICAgICAqIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlci4obWF0Y2hpbmcjcmVnZXhwKSB8IFN0cmluZ0NvbnZlcnRlci5tYXRjaGluZyhSZWdFeHApfS5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hpbmcobWF0Y2g6IHN0cmluZyB8IHN0cmluZ1tdIHwgU2V0PFQ+IHwgUmVnRXhwLCBvcHRpb25zPzogUGFydGlhbDxTdHJpbmdNYXRjaE9wdGlvbnM+KTogU3RyaW5nQ29udmVydGVyPFQsIFRDPiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBvcHRpb25zPy5tZXNzYWdlO1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0NvbnZlcnRlci5fd3JhcDxULCBUQz4odGhpcywgKGZyb206IFQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG1hdGNoID09PSBmcm9tKVxuICAgICAgICAgICAgICAgICAgICA/IHN1Y2NlZWQoZnJvbSBhcyBUKVxuICAgICAgICAgICAgICAgICAgICA6IGZhaWwobWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgXCIke2Zyb219XCI6ICR7bWVzc2FnZX1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBcIiR7ZnJvbX1cIjogZG9lcyBub3QgbWF0Y2ggXCIke21hdGNofVwiYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXRjaCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0NvbnZlcnRlci5fd3JhcDxULCBUQz4odGhpcywgKGZyb206IFQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG1hdGNoLnRlc3QoZnJvbSkpXG4gICAgICAgICAgICAgICAgICAgID8gc3VjY2VlZChmcm9tIGFzIFQpXG4gICAgICAgICAgICAgICAgICAgIDogZmFpbChtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBcIiR7ZnJvbX1cIjogJHttZXNzYWdlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYFwiJHtmcm9tfVwiOiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2h9XCJgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nQ29udmVydGVyLl93cmFwPFQsIFRDPih0aGlzLCAoZnJvbTogVCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAobWF0Y2guaGFzKGZyb20pKVxuICAgICAgICAgICAgICAgICAgICA/IHN1Y2NlZWQoZnJvbSBhcyBUKVxuICAgICAgICAgICAgICAgICAgICA6IGZhaWwobWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgXCIke2Zyb219XCI6ICR7bWVzc2FnZX1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBcIiR7ZnJvbX1cIjogbm90IGZvdW5kIGluIHNldGApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nQ29udmVydGVyLl93cmFwPFQsIFRDPih0aGlzLCAoZnJvbTogVCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAobWF0Y2guaW5jbHVkZXMoZnJvbSkpXG4gICAgICAgICAgICAgICAgICAgID8gc3VjY2VlZChmcm9tIGFzIFQpXG4gICAgICAgICAgICAgICAgICAgIDogZmFpbChtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBcIiR7ZnJvbX1cIjogJHttZXNzYWdlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYFwiJHtmcm9tfVwiOiBub3QgZm91bmQgaW4gWyR7bWF0Y2guam9pbignLCcpfV1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBzdHJpbmcuIFZhbHVlcyBvZiB0eXBlXG4gKiBzdHJpbmcgc3VjY2VlZC4gIEFueXRoaW5nIGVsc2UgZmFpbHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmcgPSBuZXcgU3RyaW5nQ29udmVydGVyKCk7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn0gd2hpY2ggY29udmVydHNcbiAqIGB1bmtub3duYCB0byBgc3RyaW5nYCwgYXBwbHlpbmcgdGVtcGxhdGUgY29udmVyc2lvbnMgc3VwcGxpZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgb3IgYXRcbiAqIHJ1bnRpbWUgYXMgY29udGV4dC5cbiAqIEByZW1hcmtzXG4gKiBUZW1wbGF0ZSBjb252ZXJzaW9ucyBhcmUgYXBwbGllZCB1c2luZyBgbXVzdGFjaGVgIHN5bnRheC5cbiAqIEBwYXJhbSBkZWZhdWx0Q29udGV4dCAtIE9wdGlvbmFsIGRlZmF1bHQgY29udGV4dCB0byB1c2UgZm9yIHRlbXBsYXRlIHZhbHVlcy5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybmluZyBgc3RyaW5nYC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlU3RyaW5nKGRlZmF1bHRDb250ZXh0PzogdW5rbm93bik6IFN0cmluZ0NvbnZlcnRlcjxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxzdHJpbmcsIHVua25vd24+KGRlZmF1bHRDb250ZXh0LCB1bmRlZmluZWQsIChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4sIGNvbnRleHQ/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYSBzdHJpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gTXVzdGFjaGUucmVuZGVyKGZyb20sIGNvbnRleHQpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYHVua25vd25gIHRvIG9uZSBvZiBhIHNldCBvZiBzdXBwbGllZFxuICogZW51bWVyYXRlZCB2YWx1ZXMuIEFueXRoaW5nIGVsc2UgZmFpbHMuXG4gKlxuICogQHJlbWFya3NcbiAqIEFsbG93ZWQgZW51bWVyYXRlZCB2YWx1ZXMgY2FuIGFsc28gYmUgc3VwcGxpZWQgYXMgY29udGV4dCBhdCBjb252ZXJzaW9uIHRpbWUuXG4gKiBAcGFyYW0gdmFsdWVzIC0gQXJyYXkgb2YgYWxsb3dlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5pbmcgYDxUPmAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnVtZXJhdGVkVmFsdWU8VD4odmFsdWVzOiBUW10pOiBDb252ZXJ0ZXI8VCwgVFtdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIFRbXT4sIGNvbnRleHQ/OiBUW10pOiBSZXN1bHQ8VD4gPT4ge1xuICAgICAgICBjb25zdCB2ID0gY29udGV4dCA/PyB2YWx1ZXM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdi5pbmRleE9mKGZyb20gYXMgVCk7XG4gICAgICAgIHJldHVybiAoaW5kZXggPj0gMCA/IHN1Y2NlZWQodltpbmRleF0pIDogZmFpbChgSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBgdW5rbm93bmAgdG8gb25lIG9mIGEgc2V0IG9mIHN1cHBsaWVkIGVudW1lcmF0ZWRcbiAqIHZhbHVlcywgbWFwcGluZyBhbnkgb2YgbXVsdGlwbGUgc3VwcGxpZWQgdmFsdWVzIHRvIHRoZSBlbnVtZXJhdGlvbi5cbiAqIEByZW1hcmtzXG4gKiBFbmFibGVzIG1hcHBpbmcgb2YgbXVsdGlwbGUgaW5wdXQgdmFsdWVzIHRvIGEgY29uc2lzdGVudCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAoc28gZS5nLiBgJ3knYCwgYCd5ZXMnYCxcbiAqIGAndHJ1ZSdgLCBgMWAgYW5kIGB0cnVlYCBjYW4gYWxsIG1hcCB0byBib29sZWFuIGB0cnVlYClcbiAqIEBwYXJhbSBtYXAgLSBBbiBhcnJheSBvZiB0dXBsZXMgZGVzY3JpYmluZyB0aGUgbWFwcGluZy4gVGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCB0dXBsZSBpcyB0aGUgcmVzdWx0XG4gKiB2YWx1ZSwgdGhlIHNlY29uZCBpcyB0aGUgc2V0IG9mIHZhbHVlcyB0aGF0IG1hcCB0byB0aGUgcmVzdWx0LiAgVHVwbGVzIGFyZSBldmFsdWF0ZWQgaW4gdGhlIG9yZGVyXG4gKiBzdXBwbGllZCBhbmQgYXJlIG5vdCBjaGVja2VkIGZvciBkdXBsaWNhdGVzLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBBbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlLlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBhcHBsaWVzIHRoZSBtYXBwaW5nIGFuZCB5aWVsZHMgYDxUPmAgb24gc3VjY2Vzcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcHBlZEVudW1lcmF0ZWRWYWx1ZTxUPihtYXA6IFtULCB1bmtub3duW11dW10sIG1lc3NhZ2U/OiBzdHJpbmcpOiBDb252ZXJ0ZXI8VCwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIHVuZGVmaW5lZD4sIF9jb250ZXh0PzogdW5rbm93bikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWFwKSB7XG4gICAgICAgICAgICBpZiAoaXRlbVsxXS5pbmNsdWRlcyhmcm9tKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGl0ZW1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKG1lc3NhZ2UgPyBgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06ICR7bWVzc2FnZX1gIDogYENhbm5vdCBtYXAgJyR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9JyB0byBhIHN1cHBvcnRlZCB2YWx1ZWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBgdW5rbm93bmAgdG8gc29tZSBzdXBwbGllZCBsaXRlcmFsIHZhbHVlLiBTdWNjZWVkcyB3aXRoXG4gKiB0aGUgc3VwcGxpZWQgdmFsdWUgaWYgYW4gaWRlbnRpdHkgY29tcGFyaXNvbiBzdWNjZWVkcywgZmFpbHMgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbXBhcmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIHRoZSBzdXBwbGllZCB2YWx1ZSBvbiBzdWNjZXNzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbDxUPih2YWx1ZTogVCk6IENvbnZlcnRlcjxULCB1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFQsIHVua25vd24+KChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIHVua25vd24+LCBfY29udGV4dD86IHVua25vd24pOiBSZXN1bHQ8VD4gPT4ge1xuICAgICAgICByZXR1cm4gKGZyb20gPT09IHZhbHVlKSA/IHN1Y2NlZWQodmFsdWUpIDogZmFpbChgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06IGRvZXMgbm90IG1hdGNoICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIERlcHJlY2F0ZWQgYWxpYXMgZm9yIEBzZWUgbGl0ZXJhbFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbXBhcmVkLlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDb252ZXJ0ZXJzLmxpdGVyYWx9IGluc3RlYWQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbHVlID0gbGl0ZXJhbDtcblxuLyoqXG4gKiBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGB1bmtub3duYCB0byBhIGBudW1iZXJgLlxuICogQHJlbWFya3NcbiAqIE51bWJlcnMgYW5kIHN0cmluZ3Mgd2l0aCBhIG51bWVyaWMgZm9ybWF0IHN1Y2NlZWQuIEFueXRoaW5nIGVsc2UgZmFpbHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBudW1iZXIgPSBuZXcgQmFzZUNvbnZlcnRlcjxudW1iZXI+KChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmcm9tICE9PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBudW06IG51bWJlciA9ICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycgPyBOdW1iZXIoZnJvbSkgOiBOYU4pO1xuICAgICAgICByZXR1cm4gaXNOYU4obnVtKVxuICAgICAgICAgICAgPyBmYWlsKGBOb3QgYSBudW1iZXI6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YClcbiAgICAgICAgICAgIDogc3VjY2VlZChudW0pO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbn0pO1xuXG4vKipcbiAqIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYHVua25vd25gIHRvIGBib29sZWFuYC5cbiAqIEByZW1hcmtzXG4gKiBCb29sZWFuIHZhbHVlcyBvciB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmdzIGAndHJ1ZSdgIGFuZCBgJ2ZhbHNlJ2Agc3VjY2VlZC5cbiAqIEFueXRoaW5nIGVsc2UgZmFpbHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBib29sZWFuID0gbmV3IEJhc2VDb252ZXJ0ZXI8Ym9vbGVhbj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChmcm9tLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RydWUnOiByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzogcmV0dXJuIHN1Y2NlZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWlsKGBOb3QgYSBib29sZWFuOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xufSk7XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBvcHRpb25hbCBgc3RyaW5nYCB2YWx1ZS4gVmFsdWVzIG9mIHR5cGVcbiAqIGBzdHJpbmdgIGFyZSByZXR1cm5lZC4gIEFueXRoaW5nIGVsc2UgcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB2YWx1ZSBgdW5kZWZpbmVkYC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsU3RyaW5nID0gc3RyaW5nLm9wdGlvbmFsKCk7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGFueSBgc3RyaW5nYCBpbnRvIGFuXG4gKiBhcnJheSBvZiBgc3RyaW5nYCwgYnkgc2VwYXJhdGluZyBhdCBhIHN1cHBsaWVkIGRlbGltaXRlci5cbiAqIEByZW1hcmtzXG4gKiBEZWxpbWl0ZXIgbWF5IGFsc28gYmUgc3VwcGxpZWQgYXMgY29udGV4dCBhdCBjb252ZXJzaW9uIHRpbWUuXG4gKiBAcGFyYW0gZGVsaW1pdGVyIC0gVGhlIGRlbGltaXRlciBhdCB3aGljaCB0byBzcGxpdC5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybmluZyBgc3RyaW5nW11gLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsaW1pdGVkU3RyaW5nKGRlbGltaXRlcjogc3RyaW5nLCBvcHRpb25zOiAnZmlsdGVyZWQnfCdhbGwnID0gJ2ZpbHRlcmVkJyk6IENvbnZlcnRlcjxzdHJpbmdbXSwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPHN0cmluZ1tdLCBzdHJpbmc+KChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPHN0cmluZ1tdLCBzdHJpbmc+LCBjb250ZXh0Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0cmluZy5jb252ZXJ0KGZyb20pO1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBsZXQgc3RyaW5ncyA9IHJlc3VsdC52YWx1ZS5zcGxpdChjb250ZXh0ID8/IGRlbGltaXRlcik7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyAhPT0gJ2FsbCcpIHtcbiAgICAgICAgICAgICAgICBzdHJpbmdzID0gc3RyaW5ncy5maWx0ZXIoKHMpID0+IChzLnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChzdHJpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQubWVzc2FnZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBpc28gZm9ybWF0dGVkIHN0cmluZywgYSBudW1iZXIgb3IgYSBgRGF0ZWAgb2JqZWN0IHRvXG4gKiBhIGBEYXRlYCBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpc29EYXRlID0gbmV3IEJhc2VDb252ZXJ0ZXI8RGF0ZT4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUlTTyhmcm9tKTtcbiAgICAgICAgaWYgKGR0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGR0LnRvSlNEYXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBJbnZhbGlkIGRhdGU6ICR7ZHQuaW52YWxpZEV4cGxhbmF0aW9ufWApO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQobmV3IERhdGUoZnJvbSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChmcm9tIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWwoYENhbm5vdCBjb252ZXJ0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9IHRvIERhdGVgKTtcbn0pO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSBmcm9tIGFueSB7QGxpbmsgVmFsaWRhdGlvbi5WYWxpZGF0b3J9XG4gKiBAcGFyYW0gdmFsaWRhdG9yIC0gdGhlIHZhbGlkYXRvciB0byBiZSB3cmFwcGVkXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHVzZXMgdGhlIHN1cHBsaWVkIHZhbGlkYXRvci5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlZDxULCBUQz11bmtub3duPih2YWxpZGF0b3I6IFZhbGlkYXRvcjxULCBUQz4pOiBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmPzogQ29udmVydGVyPFQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGUoZnJvbSwgY29udGV4dCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IGZyb20gYSBzdXBwbGllZCB0eXBlIGd1YXJkIGZ1bmN0aW9uLlxuICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gYSBkZXNjcmlwdGlvbiBvZiB0aGUgdGhpbmcgdG8gYmUgdmFsaWRhdGVkIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZXNcbiAqIEBwYXJhbSBndWFyZCAtIGEge0BsaW5rIFZhbGlkYXRpb24uVHlwZUd1YXJkV2l0aENvbnRleHR9IHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggdmFsaWRhdGVzIHRoZSB2YWx1ZXMgdXNpbmcgdGhlIHN1cHBsaWVkIHR5cGUgZ3VhcmRcbiAqIGFuZCByZXR1cm5zIHRoZW0gaW4gcGxhY2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0E8VCwgVEM9dW5rbm93bj4oZGVzY3JpcHRpb246IHN0cmluZywgZ3VhcmQ6IFR5cGVHdWFyZFdpdGhDb250ZXh0PFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY/OiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKGd1YXJkKGZyb20sIGNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgaW52YWxpZCAke2Rlc2NyaXB0aW9ufSAoJHtKU09OLnN0cmluZ2lmeShmcm9tKX0pYCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBvcHRpb25hbCBgbnVtYmVyYCB2YWx1ZS5cbiAqIEByZW1hcmtzXG4gKiBWYWx1ZXMgb2YgdHlwZSBgbnVtYmVyYCBvciBudW1lcmljIHN0cmluZ3MgYXJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQuXG4gKiBBbnl0aGluZyBlbHNlIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdmFsdWUgYHVuZGVmaW5lZGAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbE51bWJlciA9IG51bWJlci5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEge0BsaW5rIENvbnZlcnRlcn0gdG8gY29udmVydCBhbiBvcHRpb25hbCBgYm9vbGVhbmAgdmFsdWUuXG4gKiBAcmVtYXJrc1xuICogVmFsdWVzIG9mIHR5cGUgYGJvb2xlYW5gIG9yIHN0cmluZ3MgdGhhdCBtYXRjaCAoY2FzZS1pbnNlbnNpdGl2ZSkgYCd0cnVlJ2BcbiAqIG9yIGAnZmFsc2UnYCBhcmUgY29udmVydGVkIGFuZCByZXR1cm5lZC4gIEFueXRoaW5nIGVsc2UgcmV0dXJucyB7QGxpbmsgU3VjY2Vzc31cbiAqIHdpdGggdmFsdWUgYHVuZGVmaW5lZGAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbEJvb2xlYW4gPSBib29sZWFuLm9wdGlvbmFsKCk7XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gZm9yIHBvbHltb3JwaGljIHZhbHVlcy4gIFJldHVybnMgYVxuICogY29udmVydGVyIHdoaWNoIEludm9rZXMgdGhlIHdyYXBwZWQgY29udmVydGVycyBpbiBzZXF1ZW5jZSwgcmV0dXJuaW5nIHRoZSBmaXJzdCBzdWNjZXNzZnVsXG4gKiByZXN1bHQuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vbmUgb2YgdGhlIHN1cHBsaWVkIGNvbnZlcnRlcnMgY2FuIGNvbnZlcnQgdGhlIHZhbHVlLlxuICogQHJlbWFya3NcbiAqIElmIGBvbkVycm9yYCBpcyBgaWdub3JlRXJyb3JzYCAoZGVmYXVsdCksIHRoZW4gZXJyb3JzIGZyb20gYW55IG9mIHRoZVxuICogY29udmVydGVycyBhcmUgaWdub3JlZCBwcm92aWRlZCB0aGF0IHNvbWUgY29udmVydGVyIHN1Y2NlZWRzLiAgSWZcbiAqIG9uRXJyb3IgaXMgYGZhaWxPbkVycm9yYCwgdGhlbiBhbiBlcnJvciBmcm9tIGFueSBjb252ZXJ0ZXIgZmFpbHMgdGhlIGVudGlyZVxuICogY29udmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVycyAtIEFuIG9yZGVyZWQgbGlzdCBvZiB7QGxpbmsgQ29udmVydGVyIHwgY29udmVydGVyc30gdG8gYmUgY29uc2lkZXJlZC5cbiAqIEBwYXJhbSBvbkVycm9yIC0gU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRpYmxlIGVsZW1lbnRzLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggeWllbGRzIGEgdmFsdWUgZnJvbSB0aGUgdW5pb24gb2YgdGhlIHR5cGVzIHJldHVybmVkXG4gKiBieSB0aGUgd3JhcHBlZCBjb252ZXJ0ZXJzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25lT2Y8VCwgVEM9dW5rbm93bj4oY29udmVydGVyczogQXJyYXk8Q29udmVydGVyPFQsIFRDPj4sIG9uRXJyb3I6IE9uRXJyb3IgPSAnaWdub3JlRXJyb3JzJyk6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGYsIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb20sIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChvbkVycm9yID09PSAnZmFpbE9uRXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgTm8gbWF0Y2hpbmcgY29udmVydGVyIGZvciAke0pTT04uc3RyaW5naWZ5KGZyb20pfTogJHtlcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYHVua25vd25gIHRvIGFuIGFycmF5IG9mIGA8VD5gLlxuICogQHJlbWFya3NcbiAqIElmIGBvbkVycm9yYCBpcyBgJ2ZhaWxPbkVycm9yJ2AgKGRlZmF1bHQpLCB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkgZWxlbWVudCBjYW5ub3RcbiAqIGJlIGNvbnZlcnRlZC4gIElmIGBvbkVycm9yYCBpcyBgJ2lnbm9yZUVycm9ycydgLCB0aGVuIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIC0gU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRpYmxlIGVsZW1lbnRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIGFuIGFycmF5IG9mIGA8VD5gLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlPZjxULCBUQz11bmRlZmluZWQ+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgb25FcnJvcjogT25FcnJvciA9ICdmYWlsT25FcnJvcicpOiBDb252ZXJ0ZXI8VFtdLCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUW10sIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhbiBhcnJheTogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NlczogVFtdID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGZyb20pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGl0ZW0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3Nlcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlRXJyb3JzJylcbiAgICAgICAgICAgID8gc3VjY2VlZChzdWNjZXNzZXMpXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBgdW5rbm93bmAgdG8ge0BsaW5rIEV4dGVuZGVkQXJyYXkgfCBFeHRlbmRlZEFycmF5PFQ+fS5cbiAqIEByZW1hcmtzXG4gKiBJZiBgb25FcnJvcmAgaXMgYCdmYWlsT25FcnJvcidgIChkZWZhdWx0KSwgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGVsZW1lbnQgY2Fubm90XG4gKiBiZSBjb252ZXJ0ZWQuICBJZiBgb25FcnJvcmAgaXMgYCdpZ25vcmVFcnJvcnMnYCwgdGhlbiBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIC0gU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRpYmxlIGVsZW1lbnRzXG4gKiBAYmV0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kZWRBcnJheU9mPFQsIFRDPXVuZGVmaW5lZD4obGFiZWw6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LCBvbkVycm9yOiBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyk6IENvbnZlcnRlcjxFeHRlbmRlZEFycmF5PFQ+LCBUQz4ge1xuICAgIHJldHVybiBhcnJheU9mKGNvbnZlcnRlciwgb25FcnJvcikubWFwKChpdGVtczogVFtdKSA9PiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBFeHRlbmRlZEFycmF5KGxhYmVsLCAuLi5pdGVtcykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHtAbGluayBDb252ZXJ0ZXJ9IHRvIGNvbnZlcnQgYW4gYHVua25vd25gIHRvIGFuIGFycmF5IG9mIGBzdHJpbmdgLlxuICogQHJlbWFya3NcbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHRoZSBzdXBwbGllZCB2YWx1ZSBpZiBpdCBhcyBhbiBhcnJheVxuICogb2Ygc3RyaW5ncywgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZ0FycmF5ID0gYXJyYXlPZihzdHJpbmcpO1xuXG4vKipcbiAqIHtAbGluayBDb252ZXJ0ZXJ9IHRvIGNvbnZlcnQgYW4gYHVua25vd25gIHRvIGFuIGFycmF5IG9mIGBudW1iZXJgLlxuICogQHJlbWFya3NcbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHRoZSBzdXBwbGllZCB2YWx1ZSBpZiBpdCBhcyBhbiBhcnJheVxuICogb2YgbnVtYmVycywgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlckFycmF5ID0gYXJyYXlPZihudW1iZXIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBDb252ZXJ0ZXJzLihyZWNvcmRPZjp3aXRoT3B0aW9ucyl9IGFuZCB7QGxpbmsgQ29udmVydGVycy4obWFwT2Y6d2l0aE9wdGlvbnMpfVxuICogaGVscGVyIGZ1bmN0aW9ucy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXllZENvbnZlcnRlck9wdGlvbnM8VCBleHRlbmRzIHN0cmluZyA9IHN0cmluZywgVEM9dW5kZWZpbmVkPiB7XG4gICAgLyoqXG4gICAgICogaWYgYG9uRXJyb3JgIGlzIGAnZmFpbCdgIChkZWZhdWx0KSwgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGtleSBvciBlbGVtZW50XG4gICAgICogY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmIGBvbkVycm9yYCBpcyBgJ2lnbm9yZSdgLCBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICAgICAqL1xuICAgIG9uRXJyb3I/OiAnZmFpbCd8J2lnbm9yZSc7XG4gICAgLyoqXG4gICAgICogSWYgcHJlc2VudCwgYGtleUNvbnZlcnRlcmAgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBzb3VyY2Ugb2JqZWN0IHByb3BlcnR5IG5hbWVzIHRvXG4gICAgICoga2V5cyBpbiB0aGUgcmVzdWx0aW5nIG1hcCBvciByZWNvcmQuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBDYW4gYmUgdXNlZCB0byBjb2VyY2Uga2V5IG5hbWVzIHRvIHN1cHBvcnRlZCB2YWx1ZXMgYW5kL29yIHN0cm9uZyB0eXBlcy5cbiAgICAgKi9cbiAgICBrZXlDb252ZXJ0ZXI/OiBDb252ZXJ0ZXI8VCwgVEM+O1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRoZSBgc3RyaW5nYC1rZXllZCBwcm9wZXJ0aWVzXG4gKiB1c2luZyBhIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHRvIHByb2R1Y2UgYSBgUmVjb3JkPHN0cmluZywgVD5gLlxuICogQHJlbWFya3NcbiAqIFRoZSByZXN1bHRpbmcgY29udmVydGVyIGZhaWxzIGNvbnZlcnNpb24gaWYgYW55IGVsZW1lbnQgY2Fubm90IGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIGBSZWNvcmQ8c3RyaW5nLCBUPmAuXG4gKiB7QGxhYmVsIGRlZmF1bHR9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPZjxULCBUQz11bmRlZmluZWQsIFRLIGV4dGVuZHMgc3RyaW5nPXN0cmluZz4oY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFJlY29yZDxUSywgVD4sIFRDPjtcblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0aGUgYHN0cmluZ2Ata2V5ZWQgcHJvcGVydGllc1xuICogdXNpbmcgYSBzdXBwbGllZCB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB0byBwcm9kdWNlIGEgYFJlY29yZDxzdHJpbmcsIFQ+YCBhbmQgb3B0aW9uYWxseVxuICogc3BlY2lmaWVkIGhhbmRsaW5nIG9mIGVsZW1lbnRzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZC5cbiAqIEByZW1hcmtzXG4gKiBpZiBgb25FcnJvcmAgaXMgYCdmYWlsJ2AgKGRlZmF1bHQpLCB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkga2V5IG9yIGVsZW1lbnRcbiAqIGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBgb25FcnJvcmAgaXMgYCdpZ25vcmUnYCwgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIGBSZWNvcmQ8c3RyaW5nLCBUPmAuXG4gKiB7QGxhYmVsIHdpdGhPbkVycm9yfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkT2Y8VCwgVEM9dW5kZWZpbmVkLCBUSyBleHRlbmRzIHN0cmluZz1zdHJpbmc+KFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPixcbiAgICBvbkVycm9yOiAnZmFpbCd8J2lnbm9yZSdcbik6IENvbnZlcnRlcjxSZWNvcmQ8VEssIFQ+LCBUQz47XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgdGhlIGBzdHJpbmdgLWtleWVkIHByb3BlcnRpZXNcbiAqIHVzaW5nIGEgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gdG8gcHJvZHVjZSBhIGBSZWNvcmQ8VEssIFQ+YC5cbiAqIEByZW1hcmtzXG4gKiBJZiBwcmVzZW50LCB0aGUgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlcnMuS2V5ZWRDb252ZXJ0ZXJPcHRpb25zIHwgb3B0aW9uc30gY2FuIHByb3ZpZGUgYSBzdHJvbmdseS10eXBlZFxuICogY29udmVydGVyIGZvciBrZXlzIGFuZC9vciBjb250cm9sIHRoZSBoYW5kbGluZyBvZiBlbGVtZW50cyB0aGF0IGZhaWwgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5LZXllZENvbnZlcnRlck9wdGlvbnMgfCBLZXllZENvbnZlcnRlck9wdGlvbnM8VEssIFRDPn0gd2hpY2hcbiAqIHN1cHBsaWVzIGEga2V5IGNvbnZlcnRlciBhbmQvb3IgZXJyb3ItaGFuZGxpbmcgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggcmV0dXJucyBgUmVjb3JkPFRLLCBUPmAuXG4gKiB7QGxhYmVsIHdpdGhPcHRpb25zfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkT2Y8VCwgVEM9dW5kZWZpbmVkLCBUSyBleHRlbmRzIHN0cmluZz1zdHJpbmc+KFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPixcbiAgICBvcHRpb25zOiBLZXllZENvbnZlcnRlck9wdGlvbnM8VEssIFRDPlxuKTogQ29udmVydGVyPFJlY29yZDxUSywgVD4sIFRDPjtcblxuLyoqXG4gKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29udmVydGVycy4ocmVjb3JkT2Y6ZGVmYXVsdCkgfCBDb252ZXJ0ZXJzLnJlY29yZE9mKENvbnZlcnRlcjxUPil9LFxuICoge0BsaW5rIENvbnZlcnRlcnMuKHJlY29yZE9mOndpdGhPbkVycm9yKSB8IENvbnZlcnRlcnMucmVjb3JkT2YoQ29udmVydGVyPFQ+LCAnZmFpbCd8J2lnbm9yZScpfSwgYW5kXG4gKiB7QGxpbmsgQ29udmVydGVycy4ocmVjb3JkT2Y6d2l0aE9wdGlvbnMpIHwgQ29udmVydGVycy5yZWNvcmRPZihDb252ZXJ0ZXI8VD4sIEtleWVkQ29udmVydGVyT3B0aW9ucyl9LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPZjxULCBUQz11bmRlZmluZWQsIFRLIGV4dGVuZHMgc3RyaW5nPXN0cmluZz4oXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LFxuICAgIG9wdGlvbjogJ2ZhaWwnfCdpZ25vcmUnfEtleWVkQ29udmVydGVyT3B0aW9uczxUSywgVEM+ID0gJ2ZhaWwnXG4pOiBDb252ZXJ0ZXI8UmVjb3JkPFRLLCBUPiwgVEM+IHtcbiAgICBjb25zdCBvcHRpb25zOiBLZXllZENvbnZlcnRlck9wdGlvbnM8VEssIFRDPiA9ICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgPyB7IG9uRXJyb3I6IG9wdGlvbiB9IDogeyBvbkVycm9yOiAnZmFpbCcsIC4uLm9wdGlvbiB9O1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxSZWNvcmQ8VEssIFQ+LCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgKGZyb20gPT09IG51bGwpIHx8IEFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYSBzdHJpbmcta2V5ZWQgb2JqZWN0OiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBUPiA9IHt9O1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlS2V5UmVzdWx0ID0gb3B0aW9ucy5rZXlDb252ZXJ0ZXI/LmNvbnZlcnQoa2V5LCBjb250ZXh0KSA/PyBzdWNjZWVkKGtleSk7XG5cbiAgICAgICAgICAgICAgICB3cml0ZUtleVJlc3VsdC5vblN1Y2Nlc3MoKHdyaXRlS2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tW2tleV0gYXMgdW5rbm93biwgY29udGV4dCkub25TdWNjZXNzKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW3dyaXRlS2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvcHRpb25zLm9uRXJyb3IgPT09ICdpZ25vcmUnKVxuICAgICAgICAgICAgPyBzdWNjZWVkKHJlY29yZClcbiAgICAgICAgICAgIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRoZSBgc3RyaW5nYC1rZXllZCBwcm9wZXJ0aWVzXG4gKiB1c2luZyBhIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHRvIHByb2R1Y2UgYSBgTWFwPHN0cmluZywgVD5gLlxuICogQHJlbWFya3NcbiAqIFRoZSByZXN1bHRpbmcgY29udmVydGVyIGZhaWxzIGNvbnZlcnNpb24gaWYgYW55IGVsZW1lbnQgY2Fubm90IGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIGBNYXA8c3RyaW5nLCBUPmAuXG4gKiB7QGxhYmVsIGRlZmF1bHR9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBPZjxULCBUQyA9IHVuZGVmaW5lZCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxNYXA8VEssIFQ+LCBUQz47XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgdGhlIGBzdHJpbmdgLWtleWVkIHByb3BlcnRpZXNcbiAqIHVzaW5nIGEgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gdG8gcHJvZHVjZSBhIGBNYXA8c3RyaW5nLCBUPmAgYW5kIG9wdGlvbmFsbHlcbiAqIHNwZWNpZmllZCBoYW5kbGluZyBvZiBlbGVtZW50cyB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQuXG4gKiBAcmVtYXJrc1xuICogaWYgYG9uRXJyb3JgIGlzIGAnZmFpbCdgIChkZWZhdWx0KSwgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGtleSBvciBlbGVtZW50XG4gKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgYG9uRXJyb3JgIGlzIGAnaWdub3JlJ2AsIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggcmV0dXJucyBgTWFwPHN0cmluZywgVD5gLlxuICoge0BsYWJlbCB3aXRoT25FcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcE9mPFQsIFRDID0gdW5kZWZpbmVkLCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LFxuICAgIG9uRXJyb3I6ICdmYWlsJyB8ICdpZ25vcmUnXG4pOiBDb252ZXJ0ZXI8TWFwPFRLLCBUPiwgVEM+O1xuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRoZSBgc3RyaW5nYC1rZXllZCBwcm9wZXJ0aWVzXG4gKiB1c2luZyBhIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHRvIHByb2R1Y2UgYSBgTWFwPFRLLCBUPmAuXG4gKiBAcmVtYXJrc1xuICogSWYgcHJlc2VudCwgdGhlIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXJzLktleWVkQ29udmVydGVyT3B0aW9ucyB8IG9wdGlvbnN9IGNhbiBwcm92aWRlIGEgc3Ryb25nbHktdHlwZWRcbiAqIGNvbnZlcnRlciBmb3Iga2V5cyBhbmQvb3IgY29udHJvbCB0aGUgaGFuZGxpbmcgb2YgZWxlbWVudHMgdGhhdCBmYWlsIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwge0BsaW5rIENvbnZlcnRlcnMuS2V5ZWRDb252ZXJ0ZXJPcHRpb25zIHwgS2V5ZWRDb252ZXJ0ZXJPcHRpb25zPFRLLCBUQz59IHdoaWNoXG4gKiBzdXBwbGllcyBhIGtleSBjb252ZXJ0ZXIgYW5kL29yIGVycm9yLWhhbmRsaW5nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHJldHVybnMgYE1hcDxUSywgVD5gLlxuICoge0BsYWJlbCB3aXRoT3B0aW9uc31cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcE9mPFQsIFRDID0gdW5kZWZpbmVkLCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LFxuICAgIG9wdGlvbnM6IEtleWVkQ29udmVydGVyT3B0aW9uczxUSywgVEM+XG4pOiBDb252ZXJ0ZXI8TWFwPFRLLCBUPiwgVEM+O1xuXG4vKipcbiAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb252ZXJ0ZXJzLihtYXBPZjpkZWZhdWx0KSB8IENvbnZlcnRlcnMubWFwT2YoQ29udmVydGVyPFQ+KX0sXG4gKiB7QGxpbmsgQ29udmVydGVycy4obWFwT2Y6d2l0aE9uRXJyb3IpIHwgQ29udmVydGVycy5tYXBPZihDb252ZXJ0ZXI8VD4sICdmYWlsJ3wnaWdub3JlJyl9LCBhbmRcbiAqIHtAbGluayBDb252ZXJ0ZXJzLihtYXBPZjp3aXRoT3B0aW9ucykgfCBDb252ZXJ0ZXJzLm1hcE9mKENvbnZlcnRlcjxUPiwgS2V5ZWRDb252ZXJ0ZXJPcHRpb25zKX0uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcE9mPFQsIFRDID0gdW5kZWZpbmVkLCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LFxuICAgIG9wdGlvbjogJ2ZhaWwnIHwgJ2lnbm9yZScgfCBLZXllZENvbnZlcnRlck9wdGlvbnM8VEssIFRDPiA9ICdmYWlsJ1xuKTogQ29udmVydGVyPE1hcDxUSywgVD4sIFRDPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9ICh0eXBlb2Ygb3B0aW9uID09PSAnc3RyaW5nJykgPyB7IG9uRXJyb3I6IG9wdGlvbiB9IDogeyBvbkVycm9yOiAnZmFpbCcsIC4uLm9wdGlvbiB9O1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxNYXA8VEssIFQ+LCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgKGZyb20gPT09IG51bGwpIHx8IEFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYSBzdHJpbmcta2V5ZWQgb2JqZWN0OiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxUSywgVD4oKTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKGtleSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3cml0ZUtleVJlc3VsdCA9IG9wdGlvbnMua2V5Q29udmVydGVyPy5jb252ZXJ0KGtleSwgY29udGV4dCkgPz8gc3VjY2VlZChrZXkpO1xuXG4gICAgICAgICAgICAgICAgd3JpdGVLZXlSZXN1bHQub25TdWNjZXNzKCh3cml0ZUtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQoZnJvbVtrZXldIGFzIHVua25vd24sIGNvbnRleHQpLm9uU3VjY2VzcygodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXQod3JpdGVLZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KS5vbkZhaWx1cmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSB8fCAob3B0aW9ucy5vbkVycm9yID09PSAnaWdub3JlJylcbiAgICAgICAgICAgID8gc3VjY2VlZChtYXApXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlICBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHZhbGlkYXRlcyB0aGF0IGEgc3VwcGxpZWQgdmFsdWUgaXNcbiAqIG9mIGEgdHlwZSB2YWxpZGF0ZWQgYnkgYSBzdXBwbGllZCB2YWxpZGF0b3IgZnVuY3Rpb24gYW5kIHJldHVybnMgaXQuXG4gKiBAcmVtYXJrc1xuICogSWYgYHZhbGlkYXRvcmAgc3VjY2VlZHMsIHRoaXMge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgc3VwcGxpZWRcbiAqIHZhbHVlIG9mIGBmcm9tYCBjb2VyY2VkIHRvIHR5cGUgYDxUPmAuICBSZXR1cm5zIGEge0BsaW5rIEZhaWx1cmV9IHdpdGggYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gb3RoZXJ3aXNlLlxuICogQHBhcmFtIHZhbGlkYXRvciAtIEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIHZhbGlkLlxuICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gQSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFsaWRhdGVkIHR5cGUgZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlcy5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHdoaWNoIGFwcGxpZXMgdGhlIHN1cHBsaWVkIHZhbGlkYXRpb24uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVdpdGg8VCwgVEM9dW5kZWZpbmVkPih2YWxpZGF0b3I6IChmcm9tOiB1bmtub3duKSA9PiBmcm9tIGlzIFQsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogQ29udmVydGVyPFQsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIFRDPiwgX2NvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAodmFsaWRhdG9yKGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06IGludmFsaWQgJHtkZXNjcmlwdGlvbiA/PyAndmFsdWUnfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGV4dHJhY3RzIGFuZCBjb252ZXJ0cyBhbiBlbGVtZW50IGZyb20gYW4gYXJyYXkuXG4gKiBAcmVtYXJrc1xuICogVGhlIHJldHVybmVkIHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIGNvbnZlcnRlZCB2YWx1ZSBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAqIGluIHRoZSBzdXBwbGllZCBhcnJheSBhbmQgY2FuIGJlIGNvbnZlcnRlZC4gUmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS5cbiAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0gQSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4dHJhY3RlZCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB3aGljaCBleHRyYWN0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSBhbiBhcnJheS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnQ8VCwgVEM9dW5kZWZpbmVkPihpbmRleDogbnVtYmVyLCBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4pOiBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7aW5kZXh9OiBjYW5ub3QgY29udmVydCBmb3IgYSBuZWdhdGl2ZSBlbGVtZW50IGluZGV4YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKCdlbGVtZW50IGNvbnZlcnRlcjogc291cmNlIGlzIG5vdCBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID49IGZyb20ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgJHtpbmRleH06IGVsZW1lbnQgY29udmVydGVyIGluZGV4IG91dCBvZiByYW5nZSAoMC4uJHtmcm9tLmxlbmd0aCAtIDF9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tW2luZGV4XSwgY29udGV4dCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggZXh0cmFjdHMgYW5kIGNvbnZlcnRzIGFuIG9wdGlvbmFsIGVsZW1lbnQgZnJvbSBhbiBhcnJheS5cbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVzdWx0aW5nIHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIGNvbnZlcnRlZCB2YWx1ZSBpZiB0aGUgZWxlbWVudCBleGlzdHNcbiAqIGluIHRoZSBzdXBwbGllZCBhcnJheSBhbmQgY2FuIGJlIGNvbnZlcnRlZC4gUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB2YWx1ZSBgdW5kZWZpbmVkYCBpZiB0aGUgcGFyYW1ldGVyXG4gKiBpcyBhbiBhcnJheSBidXQgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZS4gUmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIG1lc3NhZ2UgaWYgdGhlIHN1cHBsaWVkIHBhcmFtZXRlclxuICogaXMgbm90IGFuIGFycmF5LCBpZiB0aGUgcmVxdWVzdGVkIGluZGV4IGlzIG5lZ2F0aXZlLCBvciBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgY29udmVydGVkLlxuICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSBBIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHdoaWNoIGV4dHJhY3RzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIGFuIGFycmF5LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxFbGVtZW50PFQsIFRDPXVuZGVmaW5lZD4oaW5kZXg6IG51bWJlciwgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUfHVuZGVmaW5lZCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7aW5kZXh9OiBjYW5ub3QgY29udmVydCBmb3IgYSBuZWdhdGl2ZSBlbGVtZW50IGluZGV4YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKCdlbGVtZW50IGNvbnZlcnRlcjogc291cmNlIGlzIG5vdCBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGluZGV4ID49IGZyb20ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tW2luZGV4XSwgY29udGV4dCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggZXh0cmFjdHMgYW5kIGNvbnZlcnQgYSBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqIGJ5IG5hbWUgZnJvbSBhbiBvYmplY3QuXG4gKiBAcmVtYXJrc1xuICogVGhlIHJlc3VsdGluZyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG9iamVjdCBwcm9wZXJ0eSBpZiB0aGUgZmllbGQgZXhpc3RzIGFuZCBjYW4gYmUgY29udmVydGVkLiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGVycm9yIG1lc3NhZ2VcbiAqIG90aGVyd2lzZS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4dHJhY3RlZCBmaWVsZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkPFQsIFRDPXVuZGVmaW5lZD4obmFtZTogc3RyaW5nLCBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4pOiBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0JyAmJiAoIUFycmF5LmlzQXJyYXkoZnJvbSkpICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKG5hbWUsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0sIGNvbnRleHQpLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgRmllbGQgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYEZpZWxkICR7bmFtZX0gbm90IGZvdW5kIGluOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBleHRyYWN0cyBhbmQgY29udmVydCBhIHByb3BlcnR5IHNwZWNpZmllZFxuICogYnkgbmFtZSBmcm9tIGFuIG9iamVjdC5cbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVzdWx0aW5nIHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIGNvbnZlcnRlZCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICogb2JqZWN0IHByb3BlcnR5IGlmIHRoZSBmaWVsZCBleGlzdHMgYW5kIGNhbiBiZSBjb252ZXJ0ZWQuIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdmFsdWUgYHVuZGVmaW5lZGBcbiAqIGlmIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IGJ1dCB0aGUgbmFtZWQgZmllbGQgaXMgbm90IHByZXNlbnQuICBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoXG4gKiBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4dHJhY3RlZCBmaWVsZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsRmllbGQ8VCwgVEM9dW5kZWZpbmVkPihuYW1lOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxUfHVuZGVmaW5lZCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcgJiYgKCFBcnJheS5pc0FycmF5KGZyb20pKSAmJiBmcm9tICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihuYW1lLCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0sIGNvbnRleHQpLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCBvciBpbnB1dCB3YXMgdW5kZWZpbmVkIHdlXG4gICAgICAgICAgICAgICAgLy8gc3VjY2VlZCB3aXRoICd1bmRlZmluZWQnLCBidXQgd2UgcHJvcGFnYXRlIGFjdHVhbFxuICAgICAgICAgICAgICAgIC8vIGZhaWx1cmVzLlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgfHwgKGZyb21bbmFtZV0gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9LCB1bmRlZmluZWQsIHsgaXNPcHRpb25hbDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhbiB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD4ge1xuICAgIC8qKlxuICAgICAqIElmIHByZXNlbnQsIGxpc3RzIG9wdGlvbmFsIGZpZWxkcy4gTWlzc2luZyBub24tb3B0aW9uYWwgZmllbGRzIGNhdXNlIGFuIGVycm9yLlxuICAgICAqL1xuICAgIG9wdGlvbmFsRmllbGRzPzogKGtleW9mIFQpW107XG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgdW5yZWNvZ25pemVkIGZpZWxkcyB5aWVsZCBhbiBlcnJvci4gIElmIGZhbHNlIG9yIHVuZGVmaW5lZCAoZGVmYXVsdCksXG4gICAgICogdW5yZWNvZ25pemVkIGZpZWxkcyBhcmUgaWdub3JlZC5cbiAgICAgKi9cbiAgICBzdHJpY3Q/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIHRvIGJlIGluY2x1ZGVkIGluIGVycm9yIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlci1wcm9wZXJ0eSBjb252ZXJ0ZXJzIGZvciBlYWNoIG9mIHRoZSBwcm9wZXJ0aWVzIGluIHR5cGUgVC5cbiAqIEByZW1hcmtzXG4gKiBVc2VkIHRvIGNvbnN0cnVjdCBhIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRmllbGRDb252ZXJ0ZXJzPFQsIFRDPXVua25vd24+ID0geyBbIGtleSBpbiBrZXlvZiBUIF06IENvbnZlcnRlcjxUW2tleV0sIFRDPiB9O1xuXG4vKipcbiAqIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgYDxUPmAgd2l0aG91dCBjaGFuZ2luZyBzaGFwZSwgZ2l2ZW5cbiAqIGEge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJzPFQ+fSBmb3IgdGhlIGZpZWxkcyBpbiB0aGUgb2JqZWN0LlxuICogQHJlbWFya3NcbiAqIEJ5IGRlZmF1bHQsIGlmIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzIGV4aXN0IGFuZCBjYW4gYmUgY29udmVydGVkLCByZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoXG4gKiB0aGUgY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUgb3JpZ2luYWwga2V5IG5hbWVzLiAgSWYgYW55IHJlcXVpcmVkIGZpZWxkcyBkbyBub3QgZXhpc3Qgb3IgY2Fubm90XG4gKiBiZSBjb252ZXJ0ZWQsIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscy4gU2VlIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlck9wdGlvbnMgfCBPYmplY3RDb252ZXJ0ZXJPcHRpb25zfVxuICogZm9yIG90aGVyIGNvbnZlcnNpb24gb3B0aW9ucy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE9iamVjdENvbnZlcnRlcjxULCBUQz11bmtub3duPiBleHRlbmRzIEJhc2VDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICAvKipcbiAgICAgKiBGaWVsZHMgY29udmVydGVkIGJ5IHRoaXMge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD47XG4gICAgLyoqXG4gICAgICogT3B0aW9ucyB1c2VkIHRvIGluaXRpYWxpemUgdGhpcyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+O1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXI8VD59IHVzaW5nIG9wdGlvbnNcbiAgICAgKiBzdXBwbGllZCBpbiBhIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlck9wdGlvbnMgfCBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+fS5cbiAgICAgKiBAcGFyYW0gZmllbGRzIC0gQSB7QGxpbmsgQ29udmVydGVycy5GaWVsZENvbnZlcnRlcnMgfCBGaWVsZENvbnZlcnRlcnM8VD59IGNvbnRhaW5pbmdcbiAgICAgKiBhIHtAbGluayBDb252ZXJ0ZXJ9IGZvciBlYWNoIGZpZWxkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25hbCBAc2VlIE9iamVjdENvbnZlcnRlck9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBjb252ZXJzaW9uXG4gICAgICoge0BsYWJlbCB3aXRoT3B0aW9uc31cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VCwgVEM+LCBvcHRpb25zPzogT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPilcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyPFQ+fSB3aXRoIG9wdGlvbmFsXG4gICAgICogcHJvcGVydGllcyBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2YgYGtleW9mIFRgLlxuICAgICAqIEBwYXJhbSBmaWVsZHMgLSBBIHtAbGluayBDb252ZXJ0ZXJzLkZpZWxkQ29udmVydGVycyB8IEZpZWxkQ29udmVydGVyczxUPn0gY29udGFpbmluZ1xuICAgICAqIGEge0BsaW5rIENvbnZlcnRlcn0gZm9yIGVhY2ggZmllbGQuXG4gICAgICogQHBhcmFtIG9wdGlvbmFsIC0gQW4gYXJyYXkgb2YgYGtleW9mIFRgIGxpc3RpbmcgZmllbGRzIHRoYXQgYXJlIG5vdCByZXF1aXJlZC5cbiAgICAgKiB7QGxhYmVsIHdpdGhLZXlzfVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxULCBUQz4sIG9wdGlvbmFsPzogKGtleW9mIFQpW10pO1xuICAgIC8qKlxuICAgICAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlci4oY29uc3RydWN0b3I6d2l0aE9wdGlvbnMpfVxuICAgICAqIGFuZCB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIuKGNvbnN0cnVjdG9yOndpdGhLZXlzKX0uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQsIFRDPiwgb3B0PzogT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPnwoa2V5b2YgVClbXSkge1xuICAgICAgICBzdXBlcigoZnJvbTogdW5rbm93biwgX3NlbGYsIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50IGJ1ZyB0aGlua3Mga2V5IGlzIHVzZWQgYmVmb3JlIGRlZmluZWRcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBba2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc09wdGlvbmFsID0gKGZpZWxkc1trZXldLmlzT3B0aW9uYWwgfHwgdGhpcy5vcHRpb25zLm9wdGlvbmFsRmllbGRzPy5pbmNsdWRlcyhrZXkpKSA/PyBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gaXNPcHRpb25hbFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25hbEZpZWxkKGtleSwgZmllbGRzW2tleV0pLmNvbnZlcnQoZnJvbSwgY29udGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZmllbGQoa2V5LCBmaWVsZHNba2V5XSkuY29udmVydChmcm9tLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRba2V5XSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdHJpY3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0JykgJiYgKCFBcnJheS5pc0FycmF5KGZyb20pKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICghaXNLZXlPZihrZXksIGZpZWxkcykgfHwgKGZpZWxkc1trZXldID09PSB1bmRlZmluZWQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06IHVuZXhwZWN0ZWQgcHJvcGVydHkgaW4gc291cmNlIG9iamVjdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCgnc291cmNlIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApID8gc3VjY2VlZChjb252ZXJ0ZWQpIDogZmFpbCh0aGlzLm9wdGlvbnMuZGVzY3JpcHRpb24gPyBgJHt0aGlzLm9wdGlvbnMuZGVzY3JpcHRpb259OiAke2Vycm9ycy5qb2luKCdcXG4nKX1gIDogZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdCkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHsgb3B0aW9uYWxGaWVsZHM6IG9wdCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0ID8/IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IGRlcml2ZWQgZnJvbSB0aGlzIG9uZSBidXQgd2l0aFxuICAgICAqIG5ldyBvcHRpb25hbCBwcm9wZXJ0aWVzIGFzIHNwZWNpZmllZCBieSBhIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlck9wdGlvbnMgfCBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+fS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXJPcHRpb25zIHwgb3B0aW9uc30gdG8gYmUgYXBwbGllZCB0byB0aGUgbmV3XG4gICAgICogY29udmVydGVyLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0gd2l0aCB0aGUgYWRkaXRpb25hbCBvcHRpb25hbCBzb3VyY2UgcHJvcGVydGllcy5cbiAgICAgKiB7QGxhYmVsIHdpdGhPcHRpb25zfVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0aWFsKG9wdGlvbnM6IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD4pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPiwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IGRlcml2ZWQgZnJvbSB0aGlzIG9uZSBidXQgd2l0aFxuICAgICAqIG5ldyBvcHRpb25hbCBwcm9wZXJ0aWVzIGFzIHNwZWNpZmllZCBieSBhIHN1cHBsaWVkIGFycmF5IG9mIGBrZXlvZiBUYC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uYWwgLSBUaGUga2V5cyBvZiB0aGUgc291cmNlIG9iamVjdCBwcm9wZXJ0aWVzIHRvIGJlIG1hZGUgb3B0aW9uYWwuXG4gICAgICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSB3aXRoIHRoZSBhZGRpdGlvbmFsIG9wdGlvbmFsIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuXG4gICAgICoge0BsYWJlbCB3aXRoS2V5c31cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydGlhbChvcHRpb25hbD86IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4sIFRDPjtcbiAgICAvKipcbiAgICAgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZlxuICAgICAqIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlci4ocGFydGlhbDp3aXRoT3B0aW9ucykgfCBPYmplY3RDb252ZXJ0ZXIucGFydGlhbChPYmplY3RDb252ZXJ0ZXJPcHRpb25zKX0gYW5kXG4gICAgICoge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyLihwYXJ0aWFsOndpdGhLZXlzKSB8IE9iamVjdENvbnZlcnRlci5wYXJ0aWFsKChrZXlvZiBUKVtdfS5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydGlhbChvcHQ/OiBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+fChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4sIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4sIFRDPih0aGlzLmZpZWxkcyBhcyBGaWVsZENvbnZlcnRlcnM8UGFydGlhbDxUPiwgVEM+LCBvcHQgYXMgT2JqZWN0Q29udmVydGVyT3B0aW9uczxQYXJ0aWFsPFQ+PikuX3dpdGgodGhpcy5fdHJhaXRzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSBkZXJpdmVkIGZyb20gdGhpcyBvbmUgYnV0IHdpdGhcbiAgICAgKiBuZXcgb3B0aW9uYWwgcHJvcGVydGllcyBhcyBzcGVjaWZpZWQgYnkgYSBzdXBwbGllZCBhcnJheSBvZiBga2V5b2YgVGAuXG4gICAgICogQHBhcmFtIGFkZE9wdGlvbmFsUHJvcGVydGllcyAtIFRoZSBrZXlzIHRvIGJlIG1hZGUgb3B0aW9uYWwuXG4gICAgICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSB3aXRoIHRoZSBhZGRpdGlvbmFsIG9wdGlvbmFsIHNvdXJjZVxuICAgICAqIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgcHVibGljIGFkZFBhcnRpYWwoYWRkT3B0aW9uYWxQcm9wZXJ0aWVzOiAoa2V5b2YgVClbXSk6IE9iamVjdENvbnZlcnRlcjxQYXJ0aWFsPFQ+LCBUQz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJ0aWFsKFsuLi50aGlzLm9wdGlvbnMub3B0aW9uYWxGaWVsZHMgPz8gW10sIC4uLmFkZE9wdGlvbmFsUHJvcGVydGllc10pLl93aXRoKHRoaXMuX3RyYWl0cygpKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcjxUPn0gd2hpY2ggY29udmVydHMgYW4gb2JqZWN0XG4gKiB3aXRob3V0IGNoYW5naW5nIHNoYXBlLCBnaXZlbiBhIHtAbGluayBDb252ZXJ0ZXJzLkZpZWxkQ29udmVydGVycyB8IEZpZWxkQ29udmVydGVyczxUPn0gYW5kIGFuIG9wdGlvbmFsXG4gKiB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXJPcHRpb25zIHwgT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPn0gdG8gZnVydGhlciByZWZpbmUgY29udmVyc2lvbiBiZWhhdmlvci5cbiAqIEByZW1hcmtzXG4gKiBCeSBkZWZhdWx0LCBpZiBhbGwgb2YgdGhlIHJlcXVlc3RlZCBmaWVsZHMgZXhpc3QgYW5kIGNhbiBiZSBjb252ZXJ0ZWQsIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9XG4gKiB3aXRoIGEgbmV3IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjb252ZXJ0ZWQgdmFsdWVzIHVuZGVyIHRoZSBvcmlnaW5hbCBrZXkgbmFtZXMuICBJZiBhbnkgcmVxdWlyZWQgcHJvcGVydGllc1xuICogZG8gbm90IGV4aXN0IG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQsIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscywgcmV0dXJuaW5nIHtAbGluayBGYWlsdXJlfSB3aXRoIGFkZGl0aW9uYWxcbiAqIGVycm9yIGluZm9ybWF0aW9uLlxuICpcbiAqIEZpZWxkcyB0aGF0IHN1Y2NlZWQgYnV0IGNvbnZlcnQgdG8gdW5kZWZpbmVkIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdCBvYmplY3QgYnV0IGRvIG5vdFxuICogZmFpbCB0aGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gQW4ge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJzPFQ+fSBkZWZpbmluZyB0aGUgc2hhcGUgb2YgdGhlXG4gKiBzb3VyY2Ugb2JqZWN0IGFuZCB7QGxpbmsgQ29udmVydGVyIHwgY29udmVydGVyc30gdG8gYmUgYXBwbGllZCB0byBlYWNoIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlck9wdGlvbnMgfCBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+fSBjb250YWluaW5nIG9wdGlvbnNcbiAqIGZvciB0aGUgb2JqZWN0IGNvbnZlcnRlci5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0gd2hpY2ggYXBwbGllcyB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb25zLlxuICoge0BsYWJlbCB3aXRoT3B0aW9uc31cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdDxUPihwcm9wZXJ0aWVzOiBGaWVsZENvbnZlcnRlcnM8VD4sIG9wdGlvbnM/OiBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+KTogT2JqZWN0Q29udmVydGVyPFQ+O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXI8VD59IHdoaWNoIGNvbnZlcnRzIGFuIG9iamVjdFxuICogd2l0aG91dCBjaGFuZ2luZyBzaGFwZSwgZ2l2ZW4gYSB7QGxpbmsgQ29udmVydGVycy5GaWVsZENvbnZlcnRlcnMgfCBGaWVsZENvbnZlcnRlcnM8VD59IGFuZCBhIHNldCBvZlxuICogb3B0aW9uYWwgcHJvcGVydGllcy5cbiAqIEByZW1hcmtzXG4gKiBCeSBkZWZhdWx0LCBpZiBhbGwgb2YgdGhlIHJlcXVlc3RlZCBmaWVsZHMgZXhpc3QgYW5kIGNhbiBiZSBjb252ZXJ0ZWQsIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9XG4gKiB3aXRoIGEgbmV3IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjb252ZXJ0ZWQgdmFsdWVzIHVuZGVyIHRoZSBvcmlnaW5hbCBrZXkgbmFtZXMuICBJZiBhbnkgcmVxdWlyZWQgcHJvcGVydGllc1xuICogZG8gbm90IGV4aXN0IG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQsIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscywgcmV0dXJuaW5nIHtAbGluayBGYWlsdXJlfSB3aXRoIGFkZGl0aW9uYWxcbiAqIGVycm9yIGluZm9ybWF0aW9uLlxuICpcbiAqIEZpZWxkcyB0aGF0IHN1Y2NlZWQgYnV0IGNvbnZlcnQgdG8gdW5kZWZpbmVkIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdCBvYmplY3QgYnV0IGRvIG5vdFxuICogZmFpbCB0aGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIC0gQW4ge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJzPFQ+fSBkZWZpbmluZyB0aGUgc2hhcGUgb2YgdGhlXG4gKiBzb3VyY2Ugb2JqZWN0IGFuZCB7QGxpbmsgQ29udmVydGVyIHwgY29udmVydGVyc30gdG8gYmUgYXBwbGllZCB0byBlYWNoIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gb3B0aW9uYWwgLSBBbiBhcnJheSBvZiBgKGtleW9mIFQpYCBsaXN0aW5nIHRoZSBrZXlzIHRvIGJlIGNvbnNpZGVyZWQgb3B0aW9uYWwuXG4gKiB7QGxhYmVsIHdpdGhLZXlzfVxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSB3aGljaCBhcHBsaWVzIHRoZSBzcGVjaWZpZWQgY29udmVyc2lvbnMuXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIENvbnZlcnRlcnMuKG9iamVjdDp3aXRoT3B0aW9ucykgfCBDb252ZXJ0ZXJzLm9iamVjdChmaWVsZHMsIG9wdGlvbnMpfSBpbnN0ZWFkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Q8VD4ocHJvcGVydGllczogRmllbGRDb252ZXJ0ZXJzPFQ+LCBvcHRpb25hbDogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8VD47XG4vKipcbiAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb252ZXJ0ZXJzLihvYmplY3Q6d2l0aE9wdGlvbnMpIHwgQ29udmVydGVycy5vYmplY3QoZmllbGRzLCBvcHRpb25zKX1cbiAqIGFuZCB7QGxpbmsgQ29udmVydGVycy4ob2JqZWN0OndpdGhLZXlzKSB8IENvbnZlcnRlcnMub2JqZWN0cyhmaWVsZHMsIG9wdGlvbmFsS2V5cyl9LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Q8VD4ocHJvcGVydGllczogRmllbGRDb252ZXJ0ZXJzPFQ+LCBvcHRpb25zPzogKGtleW9mIFQpW118T2JqZWN0Q29udmVydGVyT3B0aW9uczxUPik6IE9iamVjdENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RDb252ZXJ0ZXIocHJvcGVydGllcywgb3B0aW9ucyBhcyBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+KTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIENvbnZlcnRlcnMuKHN0cmljdE9iamVjdDp3aXRoT3B0aW9ucyl9IGhlbHBlciBmdW5jdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgU3RyaWN0T2JqZWN0Q29udmVydGVyT3B0aW9uczxUPiA9IE9taXQ8T2JqZWN0Q29udmVydGVyT3B0aW9uczxUPiwgJ3N0cmljdCc+O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGFuIG9iamVjdFxuICogd2l0aG91dCBjaGFuZ2luZyBzaGFwZSwgYSB7QGxpbmsgQ29udmVydGVycy5GaWVsZENvbnZlcnRlcnMgfCBGaWVsZENvbnZlcnRlcnM8VD59IGFuZCBhbiBvcHRpb25hbFxuICoge0BsaW5rIENvbnZlcnRlcnMuU3RyaWN0T2JqZWN0Q29udmVydGVyT3B0aW9ucyB8IFN0cmljdE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD59IHRvIGZ1cnRoZXIgcmVmaW5lXG4gKiBjb252ZXJzaW9uIGJlaGF2aW9yLlxuICpcbiAqIEByZW1hcmtzXG4gKiBGaWVsZHMgdGhhdCBzdWNjZWVkIGJ1dCBjb252ZXJ0IHRvIHVuZGVmaW5lZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQgb2JqZWN0IGJ1dCBkbyBub3RcbiAqIGZhaWwgdGhlIGNvbnZlcnNpb24uXG4gKlxuICogVGhlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IHVuZXhwZWN0ZWQgZmllbGRzIGFyZSBlbmNvdW50ZXJlZC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydGllcyAtIEFuIG9iamVjdCBjb250YWluaW5nIGRlZmluaW5nIHRoZSBzaGFwZSBhbmQgY29udmVydGVycyB0byBiZSBhcHBsaWVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25hbCBAc2VlIFN0cmljdE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD4gY29udGFpbmluZyBvcHRpb25zIGZvciB0aGUgb2JqZWN0IGNvbnZlcnRlci5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0gd2hpY2ggYXBwbGllcyB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb25zLlxuICoge0BsYWJlbCB3aXRoT3B0aW9uc31cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdE9iamVjdDxUPihwcm9wZXJ0aWVzOiBGaWVsZENvbnZlcnRlcnM8VD4sIG9wdGlvbnM/OiBTdHJpY3RPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+KTogT2JqZWN0Q29udmVydGVyPFQ+O1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGFuIG9iamVjdFxuICogd2l0aG91dCBjaGFuZ2luZyBzaGFwZSwgYSB7QGxpbmsgQ29udmVydGVycy5GaWVsZENvbnZlcnRlcnMgfCBGaWVsZENvbnZlcnRlcnM8VD59IGFuZCBhbiBvcHRpb25hbFxuICoge0BsaW5rIENvbnZlcnRlcnMuU3RyaWN0T2JqZWN0Q29udmVydGVyT3B0aW9ucyB8IFN0cmljdE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD59IHRvIGZ1cnRoZXIgcmVmaW5lXG4gKiBjb252ZXJzaW9uIGJlaGF2aW9yLlxuICpcbiAqIEByZW1hcmtzXG4gKiBGaWVsZHMgdGhhdCBzdWNjZWVkIGJ1dCBjb252ZXJ0IHRvIHVuZGVmaW5lZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQgb2JqZWN0IGJ1dCBkbyBub3RcbiAqIGZhaWwgdGhlIGNvbnZlcnNpb24uXG4gKlxuICogVGhlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IHVuZXhwZWN0ZWQgZmllbGRzIGFyZSBlbmNvdW50ZXJlZC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydGllcyAtIEFuIG9iamVjdCBjb250YWluaW5nIGRlZmluaW5nIHRoZSBzaGFwZSBhbmQgY29udmVydGVycyB0byBiZSBhcHBsaWVkLlxuICogQHBhcmFtIG9wdGlvbmFsIC0gQW4gYXJyYXkgb2YgYGtleW9mIFRgIGNvbnRhaW5pbmcga2V5cyB0byBiZSBjb25zaWRlcmVkIG9wdGlvbmFsLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSB3aGljaCBhcHBsaWVzIHRoZSBzcGVjaWZpZWQgY29udmVyc2lvbnMuXG4gKiB7QGxhYmVsIHdpdGhLZXlzfVxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDb252ZXJ0ZXJzLihzdHJpY3RPYmplY3Q6d2l0aE9wdGlvbnMpIHwgQ29udmVydGVycy5zdHJpY3RPYmplY3Qob3B0aW9ucyl9IGluc3RlYWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RPYmplY3Q8VD4ocHJvcGVydGllczogRmllbGRDb252ZXJ0ZXJzPFQ+LCBvcHRpb25hbDogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8VD47XG4vKipcbiAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgQ29udmVydGVycy4oc3RyaWN0T2JqZWN0OndpdGhPcHRpb25zKSB8IENvbnZlcnRlcnMuc3RyaWN0T2JqZWN0KGZpZWxkcywgb3B0aW9ucyl9XG4gKiBhbmQge0BsaW5rIENvbnZlcnRlcnMuKHN0cmljdE9iamVjdDp3aXRoS2V5cykgfCBDb252ZXJ0ZXJzLnN0cmljdE9iamVjdChmaWVsZHMsIG9wdGlvbmFsKX0uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdE9iamVjdDxUPihcbiAgICBwcm9wZXJ0aWVzOiBGaWVsZENvbnZlcnRlcnM8VD4sXG4gICAgb3B0PzogKGtleW9mIFQpW118U3RyaWN0T2JqZWN0Q29udmVydGVyT3B0aW9uczxUPixcbik6IE9iamVjdENvbnZlcnRlcjxUPiB7XG4gICAgY29uc3Qgb3B0aW9uczogT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPiA9IChvcHQgJiYgQXJyYXkuaXNBcnJheShvcHQpKVxuICAgICAgICA/IHsgc3RyaWN0OiB0cnVlLCBvcHRpb25hbEZpZWxkczogb3B0IH1cbiAgICAgICAgOiB7IC4uLihvcHQgPz8ge30pLCBzdHJpY3Q6IHRydWUgfTtcbiAgICByZXR1cm4gbmV3IE9iamVjdENvbnZlcnRlcihwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBBIHN0cmluZy1rZXllZCBgUmVjb3JkPHN0cmluZywgQ29udmVydGVyPmAgd2hpY2ggbWFwcyBzcGVjaWZpYyB7QGxpbmsgQ29udmVydGVyIHwgY29udmVydGVyc30gdG8gdGhlXG4gKiB2YWx1ZSBvZiBhIGRpc2NyaW1pbmF0b3IgcHJvcGVydHkuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIERpc2NyaW1pbmF0ZWRPYmplY3RDb252ZXJ0ZXJzPFQsIFREIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLCBUQz11bmtub3duPiA9IFJlY29yZDxURCwgQ29udmVydGVyPFQsIFRDPj47XG5cbi8qKlxuICogSGVscGVyIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGEgZGlzY3JpbWluYXRlZCBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBzaGFwZS5cbiAqIEByZW1hcmtzXG4gKiBUYWtlcyB0aGUgbmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBwcm9wZXJ0eSBhbmQgYVxuICoge0BsaW5rIENvbnZlcnRlcnMuRGlzY3JpbWluYXRlZE9iamVjdENvbnZlcnRlcnMgfCBzdHJpbmcta2V5ZWQgUmVjb3JkIG9mIGNvbnZlcnRlcnN9LiBEdXJpbmcgY29udmVyc2lvbixcbiAqIHRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gaW52b2tlcyB0aGUgY29udmVydGVyIGZyb20gYGNvbnZlcnRlcnNgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mXG4gKiB0aGUgZGlzY3JpbWluYXRvciBwcm9wZXJ0eSBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqXG4gKiBJZiB0aGUgc291cmNlIGlzIG5vdCBhbiBvYmplY3QsIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5IGlzIG1pc3NpbmcsIG9yIHRoZSBkaXNjcmltaW5hdG9yIGhhc1xuICogYSB2YWx1ZSBub3QgcHJlc2VudCBpbiB0aGUgY29udmVydGVycywgY29udmVyc2lvbiBmYWlscyBhbmQgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBtb3JlIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGRpc2NyaW1pbmF0b3JQcm9wIC0gTmFtZSBvZiB0aGUgcHJvcGVydHkgdXNlZCB0byBkaXNjcmltaW5hdGUgdHlwZXMuXG4gKiBAcGFyYW0gY29udmVydGVycyAtIHtAbGluayBDb252ZXJ0ZXJzLkRpc2NyaW1pbmF0ZWRPYmplY3RDb252ZXJ0ZXJzIHwgU3RyaW5nLWtleWVkIHJlY29yZCBvZiBjb252ZXJ0ZXJzfSB0b1xuICogaW52b2tlLCB3aGVyZSBlYWNoIGtleSBjb3JyZXNwb25kcyB0byBhIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5LlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0aGUgY29ycmVzcG9uZGluZyBkaXNjcmltaW5hdGVkIG9iamVjdC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyaW1pbmF0ZWRPYmplY3Q8VCwgVEQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFRDPXVua25vd24+KGRpc2NyaW1pbmF0b3JQcm9wOiBzdHJpbmcsIGNvbnZlcnRlcnM6IERpc2NyaW1pbmF0ZWRPYmplY3RDb252ZXJ0ZXJzPFQsIFREPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSB8fCBmcm9tID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGEgZGlzY3JpbWluYXRlZCBvYmplY3Q6IFwiJHtKU09OLnN0cmluZ2lmeShmcm9tKX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIWlzS2V5T2YoZGlzY3JpbWluYXRvclByb3AsIGZyb20pKSB8fCAoIWZyb21bZGlzY3JpbWluYXRvclByb3BdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtkaXNjcmltaW5hdG9yUHJvcH0gbm90IHByZXNlbnQgaW4gXCIke0pTT04uc3RyaW5naWZ5KGZyb20pfVwiYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWUgPSBmcm9tW2Rpc2NyaW1pbmF0b3JQcm9wXSBhcyBURDtcbiAgICAgICAgY29uc3QgY29udmVydGVyID0gY29udmVydGVyc1tkaXNjcmltaW5hdG9yVmFsdWVdO1xuICAgICAgICBpZiAoY29udmVydGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBObyBjb252ZXJ0ZXIgZm9yIGRpc2NyaW1pbmF0b3IgJHtkaXNjcmltaW5hdG9yUHJvcH09XCIke2Rpc2NyaW1pbmF0b3JWYWx1ZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tKTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEhlbHBlciB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhIHNvdXJjZSBvYmplY3QgdG8gYSBuZXcgb2JqZWN0IHdpdGggYVxuICogZGlmZmVyZW50IHNoYXBlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24sIHRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG5ld1xuICogb2JqZWN0LCB3aGljaCBjb250YWlucyB0aGUgY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUga2V5IG5hbWVzIHNwZWNpZmllZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLlxuICogSXQgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIGFueSBmaWVsZHMgdG8gYmUgZXh0cmFjdGVkIGRvIG5vdCBleGlzdFxuICogb3IgY2Fubm90IGJlIGNvbnZlcnRlZC5cbiAqXG4gKiBGaWVsZHMgdGhhdCBzdWNjZWVkIGJ1dCBjb252ZXJ0IHRvIHVuZGVmaW5lZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQgb2JqZWN0IGJ1dCBkbyBub3RcbiAqIGZhaWwgdGhlIGNvbnZlcnNpb24uXG4gKlxuICogQHBhcmFtIHByb3BlcnRpZXMgLSBBbiBvYmplY3Qgd2l0aCBrZXkgbmFtZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCBhblxuICogYXBwcm9wcmlhdGUge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJ9IHdoaWNoIGV4dHJhY3RzIGFuZCBjb252ZXJ0c1xuICogYSBzaW5nbGUgZmlsZWQgZnJvbSB0aGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb24gYmVoYXZpb3IuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm08VCwgVEM9dW5rbm93bj4ocHJvcGVydGllczogRmllbGRDb252ZXJ0ZXJzPFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGYsIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAvLyBlc2xpbnQgYnVnIHRoaW5rcyBrZXkgaXMgdXNlZCBiZWZvcmUgZGVmaW5lZFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBbIGtleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcHJvcGVydGllc1trZXldLmNvbnZlcnQoZnJvbSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgPyBzdWNjZWVkKGNvbnZlcnRlZCkgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogUGVyLXByb3BlcnR5IGNvbnZlcnRlcnMgYW5kIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggZmllbGQgaW4gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBvZlxuICogYSB7QGxpbmsgQ29udmVydGVycy50cmFuc2Zvcm1PYmplY3R9IGNhbGwuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkVHJhbnNmb3JtZXJzPFRTUkMsIFRERVNULCBUQz11bmtub3duPiA9IHsgWyBrZXkgaW4ga2V5b2YgVERFU1QgXToge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgc291cmNlIG9iamVjdCB0byBiZSBjb252ZXJ0ZXIuXG4gICAgICovXG4gICAgZnJvbToga2V5b2YgVFNSQyxcbiAgICAvKipcbiAgICAgKiBUaGUgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgcHJvcGVydHkuXG4gICAgICovXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXI8VERFU1Rba2V5XSwgVEM+LFxuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCB0aGVuIGEgbWlzc2luZyBzb3VyY2UgcHJvcGVydHkgaXMgaWdub3JlZC4gIElmIGBmYWxzZWAgb3Igb21pdHRlZFxuICAgICAqIHRoZW4gYSBtaXNzaW5nIHNvdXJjZSBwcm9wZXJ0eSBjYXVzZXMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgb3B0aW9uYWw/OiBib29sZWFuLFxufSB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEge0BsaW5rIENvbnZlcnRlcnMudHJhbnNmb3JtT2JqZWN0fSBjYWxsLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybU9iamVjdE9wdGlvbnM8VFNSQz4ge1xuICAgIC8qKlxuICAgICAqIElmIGBzdHJpY3RgIGlzIGB0cnVlYCB0aGVuIHVudXNlZCBwcm9wZXJ0aWVzIGluIHRoZSBzb3VyY2Ugb2JqZWN0IGNhdXNlXG4gICAgICogYW4gZXJyb3IsIG90aGVyd2lzZSB0aGV5IGFyZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIHN0cmljdDogdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2Ygc291cmNlIHByb3BlcnRpZXMgdG8gYmUgaWdub3JlZCB3aGVuIHN0cmljdCBtb2RlXG4gICAgICogaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpZ25vcmU/OiAoa2V5b2YgVFNSQylbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgdHJhbnNmb3JtIHRvIGJlIHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBjcmVhdGUgYSBzdHJvbmdseS10eXBlZCB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhIHNvdXJjZSBvYmplY3QgdG8gYVxuICogbmV3IG9iamVjdCB3aXRoIGEgZGlmZmVyZW50IHNoYXBlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24sIHRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG5ld1xuICogb2JqZWN0LCB3aGljaCBjb250YWlucyB0aGUgY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUga2V5IG5hbWVzIHNwZWNpZmllZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLlxuICpcbiAqIEl0IHJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBhbnkgZmllbGRzIHRvIGJlIGV4dHJhY3RlZCBkbyBub3QgZXhpc3RcbiAqIG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQuXG4gKlxuICogQHBhcmFtIGRlc3RpbmF0aW9uRmllbGRzIC0gQW4gb2JqZWN0IHdpdGgga2V5IG5hbWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgdGFyZ2V0IG9iamVjdCBhbmQgYW5cbiAqIGFwcHJvcHJpYXRlIHtAbGluayBDb252ZXJ0ZXJzLkZpZWxkVHJhbnNmb3JtZXJzIHwgRmllbGRUcmFuc2Zvcm1lcnN9IHdoaWNoIHNwZWNpZmllcyB0aGUgbmFtZVxuICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaW4gdGhlIHNvdXJjZSBvYmplY3QsIHRoZSBjb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBzb3VyY2VcbiAqIHByb3BlcnR5IGFuZCBhbnkgY29uZmlndXJhdGlvbiB0byBndWlkZSB0aGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB3aGljaCBhZmZlY3QgdGhlIHRyYW5zZm9ybWF0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb24gYmVoYXZpb3IuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1PYmplY3Q8VFNSQywgVERFU1QsIFRDPXVua25vd24+KFxuICAgIGRlc3RpbmF0aW9uRmllbGRzOiBGaWVsZFRyYW5zZm9ybWVyczxUU1JDLCBUREVTVCwgVEM+LFxuICAgIG9wdGlvbnM/OiBUcmFuc2Zvcm1PYmplY3RPcHRpb25zPFRTUkM+XG4pOiBDb252ZXJ0ZXI8VERFU1QsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7fSBhcyB7IFsga2V5IGluIGtleW9mIFRERVNUIF06IFRERVNUW2tleV0gfTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCB1c2VkOiBTZXQ8a2V5b2YgVFNSQz4gPSBuZXcgU2V0KG9wdGlvbnM/Lmlnbm9yZSk7XG5cbiAgICAgICAgaWYgKCh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcpICYmICghQXJyYXkuaXNBcnJheShmcm9tKSkgJiYgKGZyb20gIT09IG51bGwpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlc3RpbmF0aW9uS2V5IGluIGRlc3RpbmF0aW9uRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uRmllbGRzW2Rlc3RpbmF0aW9uS2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcmNLZXkgPSBkZXN0aW5hdGlvbkZpZWxkc1tkZXN0aW5hdGlvbktleV0uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gZGVzdGluYXRpb25GaWVsZHNbZGVzdGluYXRpb25LZXldLmNvbnZlcnRlcjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNLZXlPZihzcmNLZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW3NyY0tleV0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtkZXN0aW5hdGlvbktleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzcmNLZXl9LT4ke2Rlc3RpbmF0aW9uS2V5fTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuYWRkKHNyY0tleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVzdGluYXRpb25GaWVsZHNbZGVzdGluYXRpb25LZXldLm9wdGlvbmFsICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtTdHJpbmcoc3JjS2V5KX06IHJlcXVpcmVkIHByb3BlcnR5IG1pc3NpbmcgaW4gc291cmNlIG9iamVjdC5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnN0cmljdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSAmJiAoIXVzZWQuaGFzKGtleSBhcyBrZXlvZiBUU1JDKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06IHVuZXhwZWN0ZWQgcHJvcGVydHkgaW4gc291cmNlIG9iamVjdGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goJ3NvdXJjZSBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApID8gc3VjY2VlZChjb252ZXJ0ZWQpIDogZmFpbChvcHRpb25zPy5kZXNjcmlwdGlvbiA/IGAke29wdGlvbnMuZGVzY3JpcHRpb259OlxcbiAgJHtlcnJvcnMuam9pbignXFxuICAnKX1gIDogZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnN0cnVjdCBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRvIGFuIGFyYml0cmFyeSBzdHJvbmdseS10eXBlZFxuICogcmFuZ2Ugb2Ygc29tZSBjb21wYXJhYmxlIHR5cGUuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGBtaW5gIGFuZCBgbWF4YCBleHRlbnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gU3RhdGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZVR5cGVPZjxULCBSVCBleHRlbmRzIFJhbmdlT2Y8VD4sIFRDPXVua25vd24+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgY29uc3RydWN0b3I6IChpbml0OiBSYW5nZU9mUHJvcGVydGllczxUPikgPT4gUmVzdWx0PFJUPik6IENvbnZlcnRlcjxSVCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmLCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gb2JqZWN0KHtcbiAgICAgICAgICAgIG1pbjogY29udmVydGVyLFxuICAgICAgICAgICAgbWF4OiBjb252ZXJ0ZXIsXG4gICAgICAgIH0sIHsgb3B0aW9uYWxGaWVsZHM6IFsnbWluJywgJ21heCddIH0pLmNvbnZlcnQoZnJvbSwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvcih7IG1pbjogcmVzdWx0LnZhbHVlLm1pbiwgbWF4OiByZXN1bHQudmFsdWUubWF4IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnN0cnVjdCBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRvIHtAbGluayBSYW5nZU9mIHwgUmFuZ2VPZjxUPn1cbiAqIHdoZXJlIGA8VD5gIGlzIHNvbWUgY29tcGFyYWJsZSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBgbWluYCBhbmQgYG1heGAgZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlT2Y8VCwgVEM9dW5rbm93bj4oY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFJhbmdlT2Y8VD4sIFRDPiB7XG4gICAgcmV0dXJuIHJhbmdlVHlwZU9mPFQsIFJhbmdlT2Y8VD4sIFRDPihjb252ZXJ0ZXIsIFJhbmdlT2YuY3JlYXRlUmFuZ2UpO1xufVxuIl19
|
|
896
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF3RTtBQUN4RSx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBR2hFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsd0RBQWdDO0FBQ2hDLG1DQUFrQztBQWlCbEM7Ozs7R0FJRztBQUNILE1BQWEsZUFBeUQsU0FBUSx5QkFBb0I7SUFDOUY7Ozs7O09BS0c7SUFDSCxZQUNJLGNBQW1CLEVBQ25CLE1BQXdCLEVBQ3hCLFlBQWdGLGVBQWUsQ0FBQyxRQUFRO1FBRXhHLEtBQUssQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNPLE1BQU0sQ0FBQyxRQUFRLENBQW1CLElBQWE7UUFDckQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRO1lBQzNCLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsSUFBUyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxJQUFBLGFBQUksRUFBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ08sTUFBTSxDQUFDLEtBQUssQ0FDbEIsT0FBK0IsRUFDL0IsU0FBaUMsRUFDakMsTUFBd0I7UUFFeEIsT0FBTyxJQUFJLGVBQWUsQ0FBUSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsSUFBYSxFQUFFLEVBQUU7WUFDdEUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3RD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QUMsQ0FBQztBQUNQLENBQUM7QUFYRCxrQ0FXQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsT0FBTyxDQUFnQixTQUEyQjtJQUM5RCxPQUFPLFdBQVcsQ0FBb0IsU0FBUyxFQUFFLGlCQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUZELDBCQUVDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEJhc2VDb252ZXJ0ZXIsIENvbnZlcnRlciwgQ29udmVydGVyVHJhaXRzIH0gZnJvbSAnLi9jb252ZXJ0ZXInO1xuaW1wb3J0IHsgUmFuZ2VPZiwgUmFuZ2VPZlByb3BlcnRpZXMgfSBmcm9tICcuL3JhbmdlT2YnO1xuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuaW1wb3J0IHsgVHlwZUd1YXJkV2l0aENvbnRleHQsIFZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdGlvbic7XG5cbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcnJheSB9IGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuaW1wb3J0IHsgaXNLZXlPZiB9IGZyb20gJy4vdXRpbHMnO1xuXG50eXBlIE9uRXJyb3IgPSAnZmFpbE9uRXJyb3InIHwgJ2lnbm9yZUVycm9ycyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfVxuICogbWF0Y2hpbmcgbWV0aG9kXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nTWF0Y2hPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBpZiBhIG5vbi1tYXRjaGluZyBzdHJpbmdcbiAgICAgKiBpcyBlbmNvdW50ZXJlZC5cbiAgICAgKi9cbiAgICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9IGNsYXNzIGV4dGVuZHMge0BsaW5rIEJhc2VDb252ZXJ0ZXJ9XG4gKiB0byBwcm92aWRlIHN0cmluZy1zcGVjaWZpYyBoZWxwZXIgbWV0aG9kcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ0NvbnZlcnRlcjxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLCBUQyA9IHVua25vd24+IGV4dGVuZHMgQmFzZUNvbnZlcnRlcjxULCBUQz4ge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIG5ldyB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9LlxuICAgICAqIEBwYXJhbSBkZWZhdWx0Q29udGV4dCAtIE9wdGlvbmFsIGNvbnRleHQgdXNlZCBieSB0aGUgY29udmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gdHJhaXRzIC0gT3B0aW9uYWwgdHJhaXRzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvbnZlcnNpb24uXG4gICAgICogQHBhcmFtIGNvbnZlcnRlciAtIE9wdGlvbmFsIGNvbnZlcnNpb24gZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgdGhlIGNvbnZlcnNpb24uXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBkZWZhdWx0Q29udGV4dD86IFRDLFxuICAgICAgICB0cmFpdHM/OiBDb252ZXJ0ZXJUcmFpdHMsXG4gICAgICAgIGNvbnZlcnRlcjogKGZyb206IHVua25vd24sIHNlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4gUmVzdWx0PFQ+ID0gU3RyaW5nQ29udmVydGVyLl9jb252ZXJ0LFxuICAgICkge1xuICAgICAgICBzdXBlcihjb252ZXJ0ZXIsIGRlZmF1bHRDb250ZXh0LCB0cmFpdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX2NvbnZlcnQ8VCBleHRlbmRzIHN0cmluZz4oZnJvbTogdW5rbm93bik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gc3VjY2VlZChmcm9tIGFzIFQpXG4gICAgICAgICAgICA6IGZhaWwoYE5vdCBhIHN0cmluZzogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF93cmFwPFQgZXh0ZW5kcyBzdHJpbmcsIFRDPihcbiAgICAgICAgd3JhcHBlZDogU3RyaW5nQ29udmVydGVyPFQsIFRDPixcbiAgICAgICAgY29udmVydGVyOiAoZnJvbTogVCkgPT4gUmVzdWx0PFQ+LFxuICAgICAgICB0cmFpdHM/OiBDb252ZXJ0ZXJUcmFpdHNcbiAgICApOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+KHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuY29udmVydChmcm9tKS5vblN1Y2Nlc3MoY29udmVydGVyKTtcbiAgICAgICAgfSkuX3dpdGgod3JhcHBlZC5fdHJhaXRzKHRyYWl0cykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9IHdoaWNoIGNvbnN0cmFpbnMgdGhlIHJlc3VsdCB0byBtYXRjaFxuICAgICAqIGEgc3VwcGxpZWQgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBtYXRjaCAtIFRoZSBzdHJpbmcgdG8gYmUgbWF0Y2hlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nTWF0Y2hPcHRpb25zfSBmb3IgdGhpcyBjb252ZXJzaW9uLlxuICAgICAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGEgbWF0Y2hpbmcgc3RyaW5nIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGluZm9ybWF0aXZlXG4gICAgICogZXJyb3IgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBtYXRjaC5cbiAgICAgKiB7QGxhYmVsIHN0cmluZ31cbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hpbmcobWF0Y2g6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8U3RyaW5nTWF0Y2hPcHRpb25zPik6IFN0cmluZ0NvbnZlcnRlcjxULCBUQz47XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfSB3aGljaCBjb25zdHJhaW5zIHRoZSByZXN1bHQgdG8gbWF0Y2hcbiAgICAgKiBvbmUgb2YgYSBzdXBwbGllZCBhcnJheSBvZiBzdHJpbmdzLlxuICAgICAqIEBwYXJhbSBtYXRjaCAtIFRoZSBhcnJheSBvZiBhbGxvd2VkIHN0cmluZ3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdNYXRjaE9wdGlvbnN9IGZvciB0aGlzIGNvbnZlcnNpb24uXG4gICAgICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYSBtYXRjaGluZyBzdHJpbmcgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gaW5mb3JtYXRpdmVcbiAgICAgKiBlcnJvciBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoLlxuICAgICAqIHtAbGFiZWwgYXJyYXl9XG4gICAgICovXG4gICAgcHVibGljIG1hdGNoaW5nKG1hdGNoOiBzdHJpbmdbXSwgb3B0aW9ucz86IFBhcnRpYWw8U3RyaW5nTWF0Y2hPcHRpb25zPik6IFN0cmluZ0NvbnZlcnRlcjxULCBUQz47XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfSB3aGljaCBjb25zdHJhaW5zIHRoZSByZXN1bHQgdG8gbWF0Y2hcbiAgICAgKiBvbmUgb2YgYSBzdXBwbGllZCBgU2V0YCBvZiBzdHJpbmdzLlxuICAgICAqIEBwYXJhbSBtYXRjaCAtIFRoZSBgU2V0YCBvZiBhbGxvd2VkIHN0cmluZ3MuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdNYXRjaE9wdGlvbnN9IGZvciB0aGlzIGNvbnZlcnNpb24uXG4gICAgICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYSBtYXRjaGluZyBzdHJpbmcgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gaW5mb3JtYXRpdmVcbiAgICAgKiBlcnJvciBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoLlxuICAgICAqIHtAbGFiZWwgc2V0fVxuICAgICAqL1xuICAgIHB1YmxpYyBtYXRjaGluZyhtYXRjaDogU2V0PFQ+LCBvcHRpb25zPzogUGFydGlhbDxTdHJpbmdNYXRjaE9wdGlvbnM+KTogU3RyaW5nQ29udmVydGVyPFQsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9IHdoaWNoIGNvbnN0cmFpbnMgdGhlIHJlc3VsdCB0byBtYXRjaFxuICAgICAqIGEgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgICAqIEBwYXJhbSBtYXRjaCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgdXNlZCBhcyBhIGNvbnN0cmFpbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdNYXRjaE9wdGlvbnN9IGZvciB0aGlzIGNvbnZlcnNpb25cbiAgICAgKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG1hdGNoaW5nIHN0cmluZyBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBpbmZvcm1hdGl2ZVxuICAgICAqIGVycm9yIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2guXG4gICAgICoge0BsYWJlbCByZWdleHB9XG4gICAgICovXG4gICAgcHVibGljIG1hdGNoaW5nKG1hdGNoOiBSZWdFeHAsIG9wdGlvbnM/OiBQYXJ0aWFsPFN0cmluZ01hdGNoT3B0aW9ucz4pOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyLihtYXRjaGluZyNzdHJpbmcpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKHN0cmluZyl9LFxuICAgICAqIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlci4obWF0Y2hpbmcjYXJyYXkpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKHN0cmluZ1tdKX0sXG4gICAgICoge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyLihtYXRjaGluZyNzZXQpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKFNldDxzdHJpbmc+KX0sIGFuZFxuICAgICAqIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlci4obWF0Y2hpbmcjcmVnZXhwKSB8IFN0cmluZ0NvbnZlcnRlci5tYXRjaGluZyhSZWdFeHApfS5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hpbmcobWF0Y2g6IHN0cmluZyB8IHN0cmluZ1tdIHwgU2V0PFQ+IHwgUmVnRXhwLCBvcHRpb25zPzogUGFydGlhbDxTdHJpbmdNYXRjaE9wdGlvbnM+KTogU3RyaW5nQ29udmVydGVyPFQsIFRDPiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBvcHRpb25zPy5tZXNzYWdlO1xuICAgICAgICBpZiAodHlwZW9mIG1hdGNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0NvbnZlcnRlci5fd3JhcDxULCBUQz4odGhpcywgKGZyb206IFQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG1hdGNoID09PSBmcm9tKVxuICAgICAgICAgICAgICAgICAgICA/IHN1Y2NlZWQoZnJvbSBhcyBUKVxuICAgICAgICAgICAgICAgICAgICA6IGZhaWwobWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgXCIke2Zyb219XCI6ICR7bWVzc2FnZX1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBcIiR7ZnJvbX1cIjogZG9lcyBub3QgbWF0Y2ggXCIke21hdGNofVwiYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXRjaCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0NvbnZlcnRlci5fd3JhcDxULCBUQz4odGhpcywgKGZyb206IFQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG1hdGNoLnRlc3QoZnJvbSkpXG4gICAgICAgICAgICAgICAgICAgID8gc3VjY2VlZChmcm9tIGFzIFQpXG4gICAgICAgICAgICAgICAgICAgIDogZmFpbChtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBcIiR7ZnJvbX1cIjogJHttZXNzYWdlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYFwiJHtmcm9tfVwiOiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2h9XCJgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nQ29udmVydGVyLl93cmFwPFQsIFRDPih0aGlzLCAoZnJvbTogVCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAobWF0Y2guaGFzKGZyb20pKVxuICAgICAgICAgICAgICAgICAgICA/IHN1Y2NlZWQoZnJvbSBhcyBUKVxuICAgICAgICAgICAgICAgICAgICA6IGZhaWwobWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgXCIke2Zyb219XCI6ICR7bWVzc2FnZX1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBcIiR7ZnJvbX1cIjogbm90IGZvdW5kIGluIHNldGApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nQ29udmVydGVyLl93cmFwPFQsIFRDPih0aGlzLCAoZnJvbTogVCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAobWF0Y2guaW5jbHVkZXMoZnJvbSkpXG4gICAgICAgICAgICAgICAgICAgID8gc3VjY2VlZChmcm9tIGFzIFQpXG4gICAgICAgICAgICAgICAgICAgIDogZmFpbChtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBcIiR7ZnJvbX1cIjogJHttZXNzYWdlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYFwiJHtmcm9tfVwiOiBub3QgZm91bmQgaW4gWyR7bWF0Y2guam9pbignLCcpfV1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBzdHJpbmcuIFZhbHVlcyBvZiB0eXBlXG4gKiBzdHJpbmcgc3VjY2VlZC4gIEFueXRoaW5nIGVsc2UgZmFpbHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmcgPSBuZXcgU3RyaW5nQ29udmVydGVyKCk7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn0gd2hpY2ggY29udmVydHNcbiAqIGB1bmtub3duYCB0byBgc3RyaW5nYCwgYXBwbHlpbmcgdGVtcGxhdGUgY29udmVyc2lvbnMgc3VwcGxpZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgb3IgYXRcbiAqIHJ1bnRpbWUgYXMgY29udGV4dC5cbiAqIEByZW1hcmtzXG4gKiBUZW1wbGF0ZSBjb252ZXJzaW9ucyBhcmUgYXBwbGllZCB1c2luZyBgbXVzdGFjaGVgIHN5bnRheC5cbiAqIEBwYXJhbSBkZWZhdWx0Q29udGV4dCAtIE9wdGlvbmFsIGRlZmF1bHQgY29udGV4dCB0byB1c2UgZm9yIHRlbXBsYXRlIHZhbHVlcy5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybmluZyBgc3RyaW5nYC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbXBsYXRlU3RyaW5nKGRlZmF1bHRDb250ZXh0PzogdW5rbm93bik6IFN0cmluZ0NvbnZlcnRlcjxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxzdHJpbmcsIHVua25vd24+KGRlZmF1bHRDb250ZXh0LCB1bmRlZmluZWQsIChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4sIGNvbnRleHQ/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYSBzdHJpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gTXVzdGFjaGUucmVuZGVyKGZyb20sIGNvbnRleHQpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYHVua25vd25gIHRvIG9uZSBvZiBhIHNldCBvZiBzdXBwbGllZFxuICogZW51bWVyYXRlZCB2YWx1ZXMuIEFueXRoaW5nIGVsc2UgZmFpbHMuXG4gKlxuICogQHJlbWFya3NcbiAqIEFsbG93ZWQgZW51bWVyYXRlZCB2YWx1ZXMgY2FuIGFsc28gYmUgc3VwcGxpZWQgYXMgY29udGV4dCBhdCBjb252ZXJzaW9uIHRpbWUuXG4gKiBAcGFyYW0gdmFsdWVzIC0gQXJyYXkgb2YgYWxsb3dlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5pbmcgYDxUPmAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnVtZXJhdGVkVmFsdWU8VD4odmFsdWVzOiBUW10pOiBDb252ZXJ0ZXI8VCwgVFtdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIFRbXT4sIGNvbnRleHQ/OiBUW10pOiBSZXN1bHQ8VD4gPT4ge1xuICAgICAgICBjb25zdCB2ID0gY29udGV4dCA/PyB2YWx1ZXM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdi5pbmRleE9mKGZyb20gYXMgVCk7XG4gICAgICAgIHJldHVybiAoaW5kZXggPj0gMCA/IHN1Y2NlZWQodltpbmRleF0pIDogZmFpbChgSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBgdW5rbm93bmAgdG8gb25lIG9mIGEgc2V0IG9mIHN1cHBsaWVkIGVudW1lcmF0ZWRcbiAqIHZhbHVlcywgbWFwcGluZyBhbnkgb2YgbXVsdGlwbGUgc3VwcGxpZWQgdmFsdWVzIHRvIHRoZSBlbnVtZXJhdGlvbi5cbiAqIEByZW1hcmtzXG4gKiBFbmFibGVzIG1hcHBpbmcgb2YgbXVsdGlwbGUgaW5wdXQgdmFsdWVzIHRvIGEgY29uc2lzdGVudCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAoc28gZS5nLiBgJ3knYCwgYCd5ZXMnYCxcbiAqIGAndHJ1ZSdgLCBgMWAgYW5kIGB0cnVlYCBjYW4gYWxsIG1hcCB0byBib29sZWFuIGB0cnVlYClcbiAqIEBwYXJhbSBtYXAgLSBBbiBhcnJheSBvZiB0dXBsZXMgZGVzY3JpYmluZyB0aGUgbWFwcGluZy4gVGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCB0dXBsZSBpcyB0aGUgcmVzdWx0XG4gKiB2YWx1ZSwgdGhlIHNlY29uZCBpcyB0aGUgc2V0IG9mIHZhbHVlcyB0aGF0IG1hcCB0byB0aGUgcmVzdWx0LiAgVHVwbGVzIGFyZSBldmFsdWF0ZWQgaW4gdGhlIG9yZGVyXG4gKiBzdXBwbGllZCBhbmQgYXJlIG5vdCBjaGVja2VkIGZvciBkdXBsaWNhdGVzLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBBbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlLlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBhcHBsaWVzIHRoZSBtYXBwaW5nIGFuZCB5aWVsZHMgYDxUPmAgb24gc3VjY2Vzcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcHBlZEVudW1lcmF0ZWRWYWx1ZTxUPihtYXA6IFtULCB1bmtub3duW11dW10sIG1lc3NhZ2U/OiBzdHJpbmcpOiBDb252ZXJ0ZXI8VCwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIHVuZGVmaW5lZD4sIF9jb250ZXh0PzogdW5rbm93bikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWFwKSB7XG4gICAgICAgICAgICBpZiAoaXRlbVsxXS5pbmNsdWRlcyhmcm9tKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGl0ZW1bMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKG1lc3NhZ2UgPyBgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06ICR7bWVzc2FnZX1gIDogYENhbm5vdCBtYXAgJyR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9JyB0byBhIHN1cHBvcnRlZCB2YWx1ZWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBgdW5rbm93bmAgdG8gc29tZSBzdXBwbGllZCBsaXRlcmFsIHZhbHVlLiBTdWNjZWVkcyB3aXRoXG4gKiB0aGUgc3VwcGxpZWQgdmFsdWUgaWYgYW4gaWRlbnRpdHkgY29tcGFyaXNvbiBzdWNjZWVkcywgZmFpbHMgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbXBhcmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIHRoZSBzdXBwbGllZCB2YWx1ZSBvbiBzdWNjZXNzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbDxUPih2YWx1ZTogVCk6IENvbnZlcnRlcjxULCB1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPFQsIHVua25vd24+KChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIHVua25vd24+LCBfY29udGV4dD86IHVua25vd24pOiBSZXN1bHQ8VD4gPT4ge1xuICAgICAgICByZXR1cm4gKGZyb20gPT09IHZhbHVlKSA/IHN1Y2NlZWQodmFsdWUpIDogZmFpbChgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06IGRvZXMgbm90IG1hdGNoICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIERlcHJlY2F0ZWQgYWxpYXMgZm9yIEBzZWUgbGl0ZXJhbFxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIGNvbXBhcmVkLlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBDb252ZXJ0ZXJzLmxpdGVyYWx9IGluc3RlYWQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHZhbHVlID0gbGl0ZXJhbDtcblxuLyoqXG4gKiBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGB1bmtub3duYCB0byBhIGBudW1iZXJgLlxuICogQHJlbWFya3NcbiAqIE51bWJlcnMgYW5kIHN0cmluZ3Mgd2l0aCBhIG51bWVyaWMgZm9ybWF0IHN1Y2NlZWQuIEFueXRoaW5nIGVsc2UgZmFpbHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBudW1iZXIgPSBuZXcgQmFzZUNvbnZlcnRlcjxudW1iZXI+KChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmcm9tICE9PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBudW06IG51bWJlciA9ICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycgPyBOdW1iZXIoZnJvbSkgOiBOYU4pO1xuICAgICAgICByZXR1cm4gaXNOYU4obnVtKVxuICAgICAgICAgICAgPyBmYWlsKGBOb3QgYSBudW1iZXI6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YClcbiAgICAgICAgICAgIDogc3VjY2VlZChudW0pO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbn0pO1xuXG4vKipcbiAqIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYHVua25vd25gIHRvIGBib29sZWFuYC5cbiAqIEByZW1hcmtzXG4gKiBCb29sZWFuIHZhbHVlcyBvciB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmdzIGAndHJ1ZSdgIGFuZCBgJ2ZhbHNlJ2Agc3VjY2VlZC5cbiAqIEFueXRoaW5nIGVsc2UgZmFpbHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBib29sZWFuID0gbmV3IEJhc2VDb252ZXJ0ZXI8Ym9vbGVhbj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChmcm9tLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RydWUnOiByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzogcmV0dXJuIHN1Y2NlZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWlsKGBOb3QgYSBib29sZWFuOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xufSk7XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBvcHRpb25hbCBgc3RyaW5nYCB2YWx1ZS4gVmFsdWVzIG9mIHR5cGVcbiAqIGBzdHJpbmdgIGFyZSByZXR1cm5lZC4gIEFueXRoaW5nIGVsc2UgcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB2YWx1ZSBgdW5kZWZpbmVkYC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsU3RyaW5nID0gc3RyaW5nLm9wdGlvbmFsKCk7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGFueSBgc3RyaW5nYCBpbnRvIGFuXG4gKiBhcnJheSBvZiBgc3RyaW5nYCwgYnkgc2VwYXJhdGluZyBhdCBhIHN1cHBsaWVkIGRlbGltaXRlci5cbiAqIEByZW1hcmtzXG4gKiBEZWxpbWl0ZXIgbWF5IGFsc28gYmUgc3VwcGxpZWQgYXMgY29udGV4dCBhdCBjb252ZXJzaW9uIHRpbWUuXG4gKiBAcGFyYW0gZGVsaW1pdGVyIC0gVGhlIGRlbGltaXRlciBhdCB3aGljaCB0byBzcGxpdC5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybmluZyBgc3RyaW5nW11gLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsaW1pdGVkU3RyaW5nKGRlbGltaXRlcjogc3RyaW5nLCBvcHRpb25zOiAnZmlsdGVyZWQnfCdhbGwnID0gJ2ZpbHRlcmVkJyk6IENvbnZlcnRlcjxzdHJpbmdbXSwgc3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPHN0cmluZ1tdLCBzdHJpbmc+KChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPHN0cmluZ1tdLCBzdHJpbmc+LCBjb250ZXh0Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHN0cmluZy5jb252ZXJ0KGZyb20pO1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBsZXQgc3RyaW5ncyA9IHJlc3VsdC52YWx1ZS5zcGxpdChjb250ZXh0ID8/IGRlbGltaXRlcik7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyAhPT0gJ2FsbCcpIHtcbiAgICAgICAgICAgICAgICBzdHJpbmdzID0gc3RyaW5ncy5maWx0ZXIoKHMpID0+IChzLnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChzdHJpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQubWVzc2FnZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBpc28gZm9ybWF0dGVkIHN0cmluZywgYSBudW1iZXIgb3IgYSBgRGF0ZWAgb2JqZWN0IHRvXG4gKiBhIGBEYXRlYCBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpc29EYXRlID0gbmV3IEJhc2VDb252ZXJ0ZXI8RGF0ZT4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUlTTyhmcm9tKTtcbiAgICAgICAgaWYgKGR0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGR0LnRvSlNEYXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBJbnZhbGlkIGRhdGU6ICR7ZHQuaW52YWxpZEV4cGxhbmF0aW9ufWApO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQobmV3IERhdGUoZnJvbSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChmcm9tIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWwoYENhbm5vdCBjb252ZXJ0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9IHRvIERhdGVgKTtcbn0pO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSBmcm9tIGFueSB7QGxpbmsgVmFsaWRhdGlvbi5WYWxpZGF0b3J9XG4gKiBAcGFyYW0gdmFsaWRhdG9yIC0gdGhlIHZhbGlkYXRvciB0byBiZSB3cmFwcGVkXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHVzZXMgdGhlIHN1cHBsaWVkIHZhbGlkYXRvci5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlZDxULCBUQz11bmtub3duPih2YWxpZGF0b3I6IFZhbGlkYXRvcjxULCBUQz4pOiBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmPzogQ29udmVydGVyPFQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGUoZnJvbSwgY29udGV4dCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IGZyb20gYSBzdXBwbGllZCB0eXBlIGd1YXJkIGZ1bmN0aW9uLlxuICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gYSBkZXNjcmlwdGlvbiBvZiB0aGUgdGhpbmcgdG8gYmUgdmFsaWRhdGVkIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZXNcbiAqIEBwYXJhbSBndWFyZCAtIGEge0BsaW5rIFZhbGlkYXRpb24uVHlwZUd1YXJkV2l0aENvbnRleHR9IHdoaWNoIHBlcmZvcm1zIHRoZSB2YWxpZGF0aW9uLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggdmFsaWRhdGVzIHRoZSB2YWx1ZXMgdXNpbmcgdGhlIHN1cHBsaWVkIHR5cGUgZ3VhcmRcbiAqIGFuZCByZXR1cm5zIHRoZW0gaW4gcGxhY2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0E8VCwgVEM9dW5rbm93bj4oZGVzY3JpcHRpb246IHN0cmluZywgZ3VhcmQ6IFR5cGVHdWFyZFdpdGhDb250ZXh0PFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY/OiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKGd1YXJkKGZyb20sIGNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgaW52YWxpZCAke2Rlc2NyaXB0aW9ufSAoJHtKU09OLnN0cmluZ2lmeShmcm9tKX0pYCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBvcHRpb25hbCBgbnVtYmVyYCB2YWx1ZS5cbiAqIEByZW1hcmtzXG4gKiBWYWx1ZXMgb2YgdHlwZSBgbnVtYmVyYCBvciBudW1lcmljIHN0cmluZ3MgYXJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQuXG4gKiBBbnl0aGluZyBlbHNlIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdmFsdWUgYHVuZGVmaW5lZGAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbE51bWJlciA9IG51bWJlci5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEge0BsaW5rIENvbnZlcnRlcn0gdG8gY29udmVydCBhbiBvcHRpb25hbCBgYm9vbGVhbmAgdmFsdWUuXG4gKiBAcmVtYXJrc1xuICogVmFsdWVzIG9mIHR5cGUgYGJvb2xlYW5gIG9yIHN0cmluZ3MgdGhhdCBtYXRjaCAoY2FzZS1pbnNlbnNpdGl2ZSkgYCd0cnVlJ2BcbiAqIG9yIGAnZmFsc2UnYCBhcmUgY29udmVydGVkIGFuZCByZXR1cm5lZC4gIEFueXRoaW5nIGVsc2UgcmV0dXJucyB7QGxpbmsgU3VjY2Vzc31cbiAqIHdpdGggdmFsdWUgYHVuZGVmaW5lZGAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbEJvb2xlYW4gPSBib29sZWFuLm9wdGlvbmFsKCk7XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gZm9yIHBvbHltb3JwaGljIHZhbHVlcy4gIFJldHVybnMgYVxuICogY29udmVydGVyIHdoaWNoIEludm9rZXMgdGhlIHdyYXBwZWQgY29udmVydGVycyBpbiBzZXF1ZW5jZSwgcmV0dXJuaW5nIHRoZSBmaXJzdCBzdWNjZXNzZnVsXG4gKiByZXN1bHQuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vbmUgb2YgdGhlIHN1cHBsaWVkIGNvbnZlcnRlcnMgY2FuIGNvbnZlcnQgdGhlIHZhbHVlLlxuICogQHJlbWFya3NcbiAqIElmIGBvbkVycm9yYCBpcyBgaWdub3JlRXJyb3JzYCAoZGVmYXVsdCksIHRoZW4gZXJyb3JzIGZyb20gYW55IG9mIHRoZVxuICogY29udmVydGVycyBhcmUgaWdub3JlZCBwcm92aWRlZCB0aGF0IHNvbWUgY29udmVydGVyIHN1Y2NlZWRzLiAgSWZcbiAqIG9uRXJyb3IgaXMgYGZhaWxPbkVycm9yYCwgdGhlbiBhbiBlcnJvciBmcm9tIGFueSBjb252ZXJ0ZXIgZmFpbHMgdGhlIGVudGlyZVxuICogY29udmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVycyAtIEFuIG9yZGVyZWQgbGlzdCBvZiB7QGxpbmsgQ29udmVydGVyIHwgY29udmVydGVyc30gdG8gYmUgY29uc2lkZXJlZC5cbiAqIEBwYXJhbSBvbkVycm9yIC0gU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRpYmxlIGVsZW1lbnRzLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggeWllbGRzIGEgdmFsdWUgZnJvbSB0aGUgdW5pb24gb2YgdGhlIHR5cGVzIHJldHVybmVkXG4gKiBieSB0aGUgd3JhcHBlZCBjb252ZXJ0ZXJzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25lT2Y8VCwgVEM9dW5rbm93bj4oY29udmVydGVyczogQXJyYXk8Q29udmVydGVyPFQsIFRDPj4sIG9uRXJyb3I6IE9uRXJyb3IgPSAnaWdub3JlRXJyb3JzJyk6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGYsIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29udmVydGVyIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb20sIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgIGlmIChvbkVycm9yID09PSAnZmFpbE9uRXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgTm8gbWF0Y2hpbmcgY29udmVydGVyIGZvciAke0pTT04uc3RyaW5naWZ5KGZyb20pfTogJHtlcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYHVua25vd25gIHRvIGFuIGFycmF5IG9mIGA8VD5gLlxuICogQHJlbWFya3NcbiAqIElmIGBvbkVycm9yYCBpcyBgJ2ZhaWxPbkVycm9yJ2AgKGRlZmF1bHQpLCB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkgZWxlbWVudCBjYW5ub3RcbiAqIGJlIGNvbnZlcnRlZC4gIElmIGBvbkVycm9yYCBpcyBgJ2lnbm9yZUVycm9ycydgLCB0aGVuIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIC0gU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRpYmxlIGVsZW1lbnRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIGFuIGFycmF5IG9mIGA8VD5gLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlPZjxULCBUQz11bmRlZmluZWQ+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgb25FcnJvcjogT25FcnJvciA9ICdmYWlsT25FcnJvcicpOiBDb252ZXJ0ZXI8VFtdLCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUW10sIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhbiBhcnJheTogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NlczogVFtdID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGZyb20pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGl0ZW0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3Nlcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlRXJyb3JzJylcbiAgICAgICAgICAgID8gc3VjY2VlZChzdWNjZXNzZXMpXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBgdW5rbm93bmAgdG8ge0BsaW5rIEV4dGVuZGVkQXJyYXkgfCBFeHRlbmRlZEFycmF5PFQ+fS5cbiAqIEByZW1hcmtzXG4gKiBJZiBgb25FcnJvcmAgaXMgYCdmYWlsT25FcnJvcidgIChkZWZhdWx0KSwgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGVsZW1lbnQgY2Fubm90XG4gKiBiZSBjb252ZXJ0ZWQuICBJZiBgb25FcnJvcmAgaXMgYCdpZ25vcmVFcnJvcnMnYCwgdGhlbiBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIC0gU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRpYmxlIGVsZW1lbnRzXG4gKiBAYmV0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kZWRBcnJheU9mPFQsIFRDPXVuZGVmaW5lZD4obGFiZWw6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LCBvbkVycm9yOiBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyk6IENvbnZlcnRlcjxFeHRlbmRlZEFycmF5PFQ+LCBUQz4ge1xuICAgIHJldHVybiBhcnJheU9mKGNvbnZlcnRlciwgb25FcnJvcikubWFwKChpdGVtczogVFtdKSA9PiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBFeHRlbmRlZEFycmF5KGxhYmVsLCAuLi5pdGVtcykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHtAbGluayBDb252ZXJ0ZXJ9IHRvIGNvbnZlcnQgYW4gYHVua25vd25gIHRvIGFuIGFycmF5IG9mIGBzdHJpbmdgLlxuICogQHJlbWFya3NcbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHRoZSBzdXBwbGllZCB2YWx1ZSBpZiBpdCBhcyBhbiBhcnJheVxuICogb2Ygc3RyaW5ncywgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZ0FycmF5ID0gYXJyYXlPZihzdHJpbmcpO1xuXG4vKipcbiAqIHtAbGluayBDb252ZXJ0ZXJ9IHRvIGNvbnZlcnQgYW4gYHVua25vd25gIHRvIGFuIGFycmF5IG9mIGBudW1iZXJgLlxuICogQHJlbWFya3NcbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHRoZSBzdXBwbGllZCB2YWx1ZSBpZiBpdCBhcyBhbiBhcnJheVxuICogb2YgbnVtYmVycywgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlckFycmF5ID0gYXJyYXlPZihudW1iZXIpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBDb252ZXJ0ZXJzLnJlY29yZE9mLig6d2l0aE9wdGlvbnMpfSBhbmQge0BsaW5rIENvbnZlcnRlcnMubWFwT2YuKDp3aXRoT3B0aW9ucyl9XG4gKiBoZWxwZXIgZnVuY3Rpb25zLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEtleWVkQ29udmVydGVyT3B0aW9uczxUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLCBUQz11bmRlZmluZWQ+IHtcbiAgICAvKipcbiAgICAgKiBpZiBgb25FcnJvcmAgaXMgYCdmYWlsJ2AgKGRlZmF1bHQpLCB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkga2V5IG9yIGVsZW1lbnRcbiAgICAgKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgYG9uRXJyb3JgIGlzIGAnaWdub3JlJ2AsIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gICAgICovXG4gICAgb25FcnJvcj86ICdmYWlsJ3wnaWdub3JlJztcbiAgICAvKipcbiAgICAgKiBJZiBwcmVzZW50LCBga2V5Q29udmVydGVyYCBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIHNvdXJjZSBvYmplY3QgcHJvcGVydHkgbmFtZXMgdG9cbiAgICAgKiBrZXlzIGluIHRoZSByZXN1bHRpbmcgbWFwIG9yIHJlY29yZC5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIENhbiBiZSB1c2VkIHRvIGNvZXJjZSBrZXkgbmFtZXMgdG8gc3VwcG9ydGVkIHZhbHVlcyBhbmQvb3Igc3Ryb25nIHR5cGVzLlxuICAgICAqL1xuICAgIGtleUNvbnZlcnRlcj86IENvbnZlcnRlcjxULCBUQz47XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgdGhlIGBzdHJpbmdgLWtleWVkIHByb3BlcnRpZXNcbiAqIHVzaW5nIGEgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gdG8gcHJvZHVjZSBhIGBSZWNvcmQ8c3RyaW5nLCBUPmAuXG4gKiBAcmVtYXJrc1xuICogVGhlIHJlc3VsdGluZyBjb252ZXJ0ZXIgZmFpbHMgY29udmVyc2lvbiBpZiBhbnkgZWxlbWVudCBjYW5ub3QgYmUgY29udmVydGVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHJldHVybnMgYFJlY29yZDxzdHJpbmcsIFQ+YC5cbiAqIHtAbGFiZWwgZGVmYXVsdH1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE9mPFQsIFRDPXVuZGVmaW5lZCwgVEsgZXh0ZW5kcyBzdHJpbmc9c3RyaW5nPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4pOiBDb252ZXJ0ZXI8UmVjb3JkPFRLLCBUPiwgVEM+O1xuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRoZSBgc3RyaW5nYC1rZXllZCBwcm9wZXJ0aWVzXG4gKiB1c2luZyBhIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHRvIHByb2R1Y2UgYSBgUmVjb3JkPHN0cmluZywgVD5gIGFuZCBvcHRpb25hbGx5XG4gKiBzcGVjaWZpZWQgaGFuZGxpbmcgb2YgZWxlbWVudHMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLlxuICogQHJlbWFya3NcbiAqIGlmIGBvbkVycm9yYCBpcyBgJ2ZhaWwnYCAoZGVmYXVsdCksIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBrZXkgb3IgZWxlbWVudFxuICogY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmIGBvbkVycm9yYCBpcyBgJ2lnbm9yZSdgLCBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHJldHVybnMgYFJlY29yZDxzdHJpbmcsIFQ+YC5cbiAqIHtAbGFiZWwgd2l0aE9uRXJyb3J9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPZjxULCBUQz11bmRlZmluZWQsIFRLIGV4dGVuZHMgc3RyaW5nPXN0cmluZz4oXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LFxuICAgIG9uRXJyb3I6ICdmYWlsJ3wnaWdub3JlJ1xuKTogQ29udmVydGVyPFJlY29yZDxUSywgVD4sIFRDPjtcblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0aGUgYHN0cmluZ2Ata2V5ZWQgcHJvcGVydGllc1xuICogdXNpbmcgYSBzdXBwbGllZCB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB0byBwcm9kdWNlIGEgYFJlY29yZDxUSywgVD5gLlxuICogQHJlbWFya3NcbiAqIElmIHByZXNlbnQsIHRoZSBzdXBwbGllZCB7QGxpbmsgQ29udmVydGVycy5LZXllZENvbnZlcnRlck9wdGlvbnMgfCBvcHRpb25zfSBjYW4gcHJvdmlkZSBhIHN0cm9uZ2x5LXR5cGVkXG4gKiBjb252ZXJ0ZXIgZm9yIGtleXMgYW5kL29yIGNvbnRyb2wgdGhlIGhhbmRsaW5nIG9mIGVsZW1lbnRzIHRoYXQgZmFpbCBjb252ZXJzaW9uLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHtAbGluayBDb252ZXJ0ZXJzLktleWVkQ29udmVydGVyT3B0aW9ucyB8IEtleWVkQ29udmVydGVyT3B0aW9uczxUSywgVEM+fSB3aGljaFxuICogc3VwcGxpZXMgYSBrZXkgY29udmVydGVyIGFuZC9vciBlcnJvci1oYW5kbGluZyBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIGBSZWNvcmQ8VEssIFQ+YC5cbiAqIHtAbGFiZWwgd2l0aE9wdGlvbnN9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPZjxULCBUQz11bmRlZmluZWQsIFRLIGV4dGVuZHMgc3RyaW5nPXN0cmluZz4oXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LFxuICAgIG9wdGlvbnM6IEtleWVkQ29udmVydGVyT3B0aW9uczxUSywgVEM+XG4pOiBDb252ZXJ0ZXI8UmVjb3JkPFRLLCBUPiwgVEM+O1xuXG4vKipcbiAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb252ZXJ0ZXJzLihyZWNvcmRPZjpkZWZhdWx0KSB8IENvbnZlcnRlcnMucmVjb3JkT2YoQ29udmVydGVyPFQ+KX0sXG4gKiB7QGxpbmsgQ29udmVydGVycy4ocmVjb3JkT2Y6d2l0aE9uRXJyb3IpIHwgQ29udmVydGVycy5yZWNvcmRPZihDb252ZXJ0ZXI8VD4sICdmYWlsJ3wnaWdub3JlJyl9LCBhbmRcbiAqIHtAbGluayBDb252ZXJ0ZXJzLihyZWNvcmRPZjp3aXRoT3B0aW9ucykgfCBDb252ZXJ0ZXJzLnJlY29yZE9mKENvbnZlcnRlcjxUPiwgS2V5ZWRDb252ZXJ0ZXJPcHRpb25zKX0uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE9mPFQsIFRDPXVuZGVmaW5lZCwgVEsgZXh0ZW5kcyBzdHJpbmc9c3RyaW5nPihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sXG4gICAgb3B0aW9uOiAnZmFpbCd8J2lnbm9yZSd8S2V5ZWRDb252ZXJ0ZXJPcHRpb25zPFRLLCBUQz4gPSAnZmFpbCdcbik6IENvbnZlcnRlcjxSZWNvcmQ8VEssIFQ+LCBUQz4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IEtleWVkQ29udmVydGVyT3B0aW9uczxUSywgVEM+ID0gKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSA/IHsgb25FcnJvcjogb3B0aW9uIH0gOiB7IG9uRXJyb3I6ICdmYWlsJywgLi4ub3B0aW9uIH07XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFJlY29yZDxUSywgVD4sIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICgodHlwZW9mIGZyb20gIT09ICdvYmplY3QnKSB8fCAoZnJvbSA9PT0gbnVsbCkgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFQ+ID0ge307XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihrZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JpdGVLZXlSZXN1bHQgPSBvcHRpb25zLmtleUNvbnZlcnRlcj8uY29udmVydChrZXksIGNvbnRleHQpID8/IHN1Y2NlZWQoa2V5KTtcblxuICAgICAgICAgICAgICAgIHdyaXRlS2V5UmVzdWx0Lm9uU3VjY2Vzcygod3JpdGVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21ba2V5XSBhcyB1bmtub3duLCBjb250ZXh0KS5vblN1Y2Nlc3MoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRbd3JpdGVLZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkub25GYWlsdXJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgfHwgKG9wdGlvbnMub25FcnJvciA9PT0gJ2lnbm9yZScpXG4gICAgICAgICAgICA/IHN1Y2NlZWQocmVjb3JkKVxuICAgICAgICAgICAgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgdGhlIGBzdHJpbmdgLWtleWVkIHByb3BlcnRpZXNcbiAqIHVzaW5nIGEgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gdG8gcHJvZHVjZSBhIGBNYXA8c3RyaW5nLCBUPmAuXG4gKiBAcmVtYXJrc1xuICogVGhlIHJlc3VsdGluZyBjb252ZXJ0ZXIgZmFpbHMgY29udmVyc2lvbiBpZiBhbnkgZWxlbWVudCBjYW5ub3QgYmUgY29udmVydGVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHJldHVybnMgYE1hcDxzdHJpbmcsIFQ+YC5cbiAqIHtAbGFiZWwgZGVmYXVsdH1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcE9mPFQsIFRDID0gdW5kZWZpbmVkLCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPE1hcDxUSywgVD4sIFRDPjtcblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0aGUgYHN0cmluZ2Ata2V5ZWQgcHJvcGVydGllc1xuICogdXNpbmcgYSBzdXBwbGllZCB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB0byBwcm9kdWNlIGEgYE1hcDxzdHJpbmcsIFQ+YCBhbmQgb3B0aW9uYWxseVxuICogc3BlY2lmaWVkIGhhbmRsaW5nIG9mIGVsZW1lbnRzIHRoYXQgY2Fubm90IGJlIGNvbnZlcnRlZC5cbiAqIEByZW1hcmtzXG4gKiBpZiBgb25FcnJvcmAgaXMgYCdmYWlsJ2AgKGRlZmF1bHQpLCB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkga2V5IG9yIGVsZW1lbnRcbiAqIGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBgb25FcnJvcmAgaXMgYCdpZ25vcmUnYCwgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIGBNYXA8c3RyaW5nLCBUPmAuXG4gKiB7QGxhYmVsIHdpdGhPbkVycm9yfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwT2Y8VCwgVEMgPSB1bmRlZmluZWQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sXG4gICAgb25FcnJvcjogJ2ZhaWwnIHwgJ2lnbm9yZSdcbik6IENvbnZlcnRlcjxNYXA8VEssIFQ+LCBUQz47XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgdGhlIGBzdHJpbmdgLWtleWVkIHByb3BlcnRpZXNcbiAqIHVzaW5nIGEgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gdG8gcHJvZHVjZSBhIGBNYXA8VEssIFQ+YC5cbiAqIEByZW1hcmtzXG4gKiBJZiBwcmVzZW50LCB0aGUgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlcnMuS2V5ZWRDb252ZXJ0ZXJPcHRpb25zIHwgb3B0aW9uc30gY2FuIHByb3ZpZGUgYSBzdHJvbmdseS10eXBlZFxuICogY29udmVydGVyIGZvciBrZXlzIGFuZC9vciBjb250cm9sIHRoZSBoYW5kbGluZyBvZiBlbGVtZW50cyB0aGF0IGZhaWwgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5LZXllZENvbnZlcnRlck9wdGlvbnMgfCBLZXllZENvbnZlcnRlck9wdGlvbnM8VEssIFRDPn0gd2hpY2hcbiAqIHN1cHBsaWVzIGEga2V5IGNvbnZlcnRlciBhbmQvb3IgZXJyb3ItaGFuZGxpbmcgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggcmV0dXJucyBgTWFwPFRLLCBUPmAuXG4gKiB7QGxhYmVsIHdpdGhPcHRpb25zfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwT2Y8VCwgVEMgPSB1bmRlZmluZWQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sXG4gICAgb3B0aW9uczogS2V5ZWRDb252ZXJ0ZXJPcHRpb25zPFRLLCBUQz5cbik6IENvbnZlcnRlcjxNYXA8VEssIFQ+LCBUQz47XG5cbi8qKlxuICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnZlcnRlcnMuKG1hcE9mOmRlZmF1bHQpIHwgQ29udmVydGVycy5tYXBPZihDb252ZXJ0ZXI8VD4pfSxcbiAqIHtAbGluayBDb252ZXJ0ZXJzLihtYXBPZjp3aXRoT25FcnJvcikgfCBDb252ZXJ0ZXJzLm1hcE9mKENvbnZlcnRlcjxUPiwgJ2ZhaWwnfCdpZ25vcmUnKX0sIGFuZFxuICoge0BsaW5rIENvbnZlcnRlcnMuKG1hcE9mOndpdGhPcHRpb25zKSB8IENvbnZlcnRlcnMubWFwT2YoQ29udmVydGVyPFQ+LCBLZXllZENvbnZlcnRlck9wdGlvbnMpfS5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwT2Y8VCwgVEMgPSB1bmRlZmluZWQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sXG4gICAgb3B0aW9uOiAnZmFpbCcgfCAnaWdub3JlJyB8IEtleWVkQ29udmVydGVyT3B0aW9uczxUSywgVEM+ID0gJ2ZhaWwnXG4pOiBDb252ZXJ0ZXI8TWFwPFRLLCBUPiwgVEM+IHtcbiAgICBjb25zdCBvcHRpb25zID0gKHR5cGVvZiBvcHRpb24gPT09ICdzdHJpbmcnKSA/IHsgb25FcnJvcjogb3B0aW9uIH0gOiB7IG9uRXJyb3I6ICdmYWlsJywgLi4ub3B0aW9uIH07XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPE1hcDxUSywgVD4sIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICgodHlwZW9mIGZyb20gIT09ICdvYmplY3QnKSB8fCAoZnJvbSA9PT0gbnVsbCkgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwPFRLLCBUPigpO1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRlS2V5UmVzdWx0ID0gb3B0aW9ucy5rZXlDb252ZXJ0ZXI/LmNvbnZlcnQoa2V5LCBjb250ZXh0KSA/PyBzdWNjZWVkKGtleSk7XG5cbiAgICAgICAgICAgICAgICB3cml0ZUtleVJlc3VsdC5vblN1Y2Nlc3MoKHdyaXRlS2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tW2tleV0gYXMgdW5rbm93biwgY29udGV4dCkub25TdWNjZXNzKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNldCh3cml0ZUtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvcHRpb25zLm9uRXJyb3IgPT09ICdpZ25vcmUnKVxuICAgICAgICAgICAgPyBzdWNjZWVkKG1hcClcbiAgICAgICAgICAgIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggdmFsaWRhdGVzIHRoYXQgYSBzdXBwbGllZCB2YWx1ZSBpc1xuICogb2YgYSB0eXBlIHZhbGlkYXRlZCBieSBhIHN1cHBsaWVkIHZhbGlkYXRvciBmdW5jdGlvbiBhbmQgcmV0dXJucyBpdC5cbiAqIEByZW1hcmtzXG4gKiBJZiBgdmFsaWRhdG9yYCBzdWNjZWVkcywgdGhpcyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSBzdXBwbGllZFxuICogdmFsdWUgb2YgYGZyb21gIGNvZXJjZWQgdG8gdHlwZSBgPFQ+YC4gIFJldHVybnMgYSB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhZGRpdGlvbmFsXG4gKiBpbmZvcm1hdGlvbiBvdGhlcndpc2UuXG4gKiBAcGFyYW0gdmFsaWRhdG9yIC0gQSB2YWxpZGF0b3IgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgdmFsaWQuXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWxpZGF0ZWQgdHlwZSBmb3IgdXNlIGluIGVycm9yIG1lc3NhZ2VzLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gd2hpY2ggYXBwbGllcyB0aGUgc3VwcGxpZWQgdmFsaWRhdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlV2l0aDxULCBUQz11bmRlZmluZWQ+KHZhbGlkYXRvcjogKGZyb206IHVua25vd24pID0+IGZyb20gaXMgVCwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgVEM+LCBfY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICh2YWxpZGF0b3IoZnJvbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGAke0pTT04uc3RyaW5naWZ5KGZyb20pfTogaW52YWxpZCAke2Rlc2NyaXB0aW9uID8/ICd2YWx1ZSd9YCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggZXh0cmFjdHMgYW5kIGNvbnZlcnRzIGFuIGVsZW1lbnQgZnJvbSBhbiBhcnJheS5cbiAqIEByZW1hcmtzXG4gKiBUaGUgcmV0dXJuZWQge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgY29udmVydGVkIHZhbHVlIGlmIHRoZSBlbGVtZW50IGV4aXN0c1xuICogaW4gdGhlIHN1cHBsaWVkIGFycmF5IGFuZCBjYW4gYmUgY29udmVydGVkLiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLlxuICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSBBIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHdoaWNoIGV4dHJhY3RzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIGFuIGFycmF5LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudDxULCBUQz11bmRlZmluZWQ+KGluZGV4OiBudW1iZXIsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgJHtpbmRleH06IGNhbm5vdCBjb252ZXJ0IGZvciBhIG5lZ2F0aXZlIGVsZW1lbnQgaW5kZXhgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ2VsZW1lbnQgY29udmVydGVyOiBzb3VyY2UgaXMgbm90IGFuIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPj0gZnJvbS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGAke2luZGV4fTogZWxlbWVudCBjb252ZXJ0ZXIgaW5kZXggb3V0IG9mIHJhbmdlICgwLi4ke2Zyb20ubGVuZ3RoIC0gMX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21baW5kZXhdLCBjb250ZXh0KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBleHRyYWN0cyBhbmQgY29udmVydHMgYW4gb3B0aW9uYWwgZWxlbWVudCBmcm9tIGFuIGFycmF5LlxuICogQHJlbWFya3NcbiAqIFRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgY29udmVydGVkIHZhbHVlIGlmIHRoZSBlbGVtZW50IGV4aXN0c1xuICogaW4gdGhlIHN1cHBsaWVkIGFycmF5IGFuZCBjYW4gYmUgY29udmVydGVkLiBSZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHZhbHVlIGB1bmRlZmluZWRgIGlmIHRoZSBwYXJhbWV0ZXJcbiAqIGlzIGFuIGFycmF5IGJ1dCB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgbWVzc2FnZSBpZiB0aGUgc3VwcGxpZWQgcGFyYW1ldGVyXG4gKiBpcyBub3QgYW4gYXJyYXksIGlmIHRoZSByZXF1ZXN0ZWQgaW5kZXggaXMgbmVnYXRpdmUsIG9yIGlmIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuXG4gKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIEEge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IHRoZSBleHRyYWN0ZWQgZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gd2hpY2ggZXh0cmFjdHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gYW4gYXJyYXkuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEVsZW1lbnQ8VCwgVEM9dW5kZWZpbmVkPihpbmRleDogbnVtYmVyLCBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4pOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgJHtpbmRleH06IGNhbm5vdCBjb252ZXJ0IGZvciBhIG5lZ2F0aXZlIGVsZW1lbnQgaW5kZXhgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoJ2VsZW1lbnQgY29udmVydGVyOiBzb3VyY2UgaXMgbm90IGFuIGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPj0gZnJvbS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21baW5kZXhdLCBjb250ZXh0KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBleHRyYWN0cyBhbmQgY29udmVydCBhIHByb3BlcnR5IHNwZWNpZmllZFxuICogYnkgbmFtZSBmcm9tIGFuIG9iamVjdC5cbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVzdWx0aW5nIHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIGNvbnZlcnRlZCB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZ1xuICogb2JqZWN0IHByb3BlcnR5IGlmIHRoZSBmaWVsZCBleGlzdHMgYW5kIGNhbiBiZSBjb252ZXJ0ZWQuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZVxuICogb3RoZXJ3aXNlLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGQ8VCwgVEM9dW5kZWZpbmVkPihuYW1lOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdvYmplY3QnICYmICghQXJyYXkuaXNBcnJheShmcm9tKSkgJiYgZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2YobmFtZSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQoZnJvbVtuYW1lXSwgY29udGV4dCkub25GYWlsdXJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGBGaWVsZCAke25hbWV9OiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgRmllbGQgJHtuYW1lfSBub3QgZm91bmQgaW46ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYENhbm5vdCBjb252ZXJ0IGZpZWxkIFwiJHtuYW1lfVwiIGZyb20gbm9uLW9iamVjdCAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGV4dHJhY3RzIGFuZCBjb252ZXJ0IGEgcHJvcGVydHkgc3BlY2lmaWVkXG4gKiBieSBuYW1lIGZyb20gYW4gb2JqZWN0LlxuICogQHJlbWFya3NcbiAqIFRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgY29udmVydGVkIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBvYmplY3QgcHJvcGVydHkgaWYgdGhlIGZpZWxkIGV4aXN0cyBhbmQgY2FuIGJlIGNvbnZlcnRlZC4gUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB2YWx1ZSBgdW5kZWZpbmVkYFxuICogaWYgdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBpcyBhbiBvYmplY3QgYnV0IHRoZSBuYW1lZCBmaWVsZCBpcyBub3QgcHJlc2VudC4gIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGhcbiAqIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxGaWVsZDxULCBUQz11bmRlZmluZWQ+KG5hbWU6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUfHVuZGVmaW5lZCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0JyAmJiAoIUFycmF5LmlzQXJyYXkoZnJvbSkpICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKG5hbWUsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQoZnJvbVtuYW1lXSwgY29udGV4dCkub25GYWlsdXJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKGAke25hbWV9OiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsIG9yIGlucHV0IHdhcyB1bmRlZmluZWQgd2VcbiAgICAgICAgICAgICAgICAvLyBzdWNjZWVkIHdpdGggJ3VuZGVmaW5lZCcsIGJ1dCB3ZSBwcm9wYWdhdGUgYWN0dWFsXG4gICAgICAgICAgICAgICAgLy8gZmFpbHVyZXMuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSB8fCAoZnJvbVtuYW1lXSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYENhbm5vdCBjb252ZXJ0IGZpZWxkIFwiJHtuYW1lfVwiIGZyb20gbm9uLW9iamVjdCAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgIH0sIHVuZGVmaW5lZCwgeyBpc09wdGlvbmFsOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGFuIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPiB7XG4gICAgLyoqXG4gICAgICogSWYgcHJlc2VudCwgbGlzdHMgb3B0aW9uYWwgZmllbGRzLiBNaXNzaW5nIG5vbi1vcHRpb25hbCBmaWVsZHMgY2F1c2UgYW4gZXJyb3IuXG4gICAgICovXG4gICAgb3B0aW9uYWxGaWVsZHM/OiAoa2V5b2YgVClbXTtcbiAgICAvKipcbiAgICAgKiBJZiB0cnVlLCB1bnJlY29nbml6ZWQgZmllbGRzIHlpZWxkIGFuIGVycm9yLiAgSWYgZmFsc2Ugb3IgdW5kZWZpbmVkIChkZWZhdWx0KSxcbiAgICAgKiB1bnJlY29nbml6ZWQgZmllbGRzIGFyZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIHN0cmljdD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gdG8gYmUgaW5jbHVkZWQgaW4gZXJyb3IgbWVzc2FnZXMuXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGVyLXByb3BlcnR5IGNvbnZlcnRlcnMgZm9yIGVhY2ggb2YgdGhlIHByb3BlcnRpZXMgaW4gdHlwZSBULlxuICogQHJlbWFya3NcbiAqIFVzZWQgdG8gY29uc3RydWN0IGEge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGaWVsZENvbnZlcnRlcnM8VCwgVEM9dW5rbm93bj4gPSB7IFsga2V5IGluIGtleW9mIFQgXTogQ29udmVydGVyPFRba2V5XSwgVEM+IH07XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSBgPFQ+YCB3aXRob3V0IGNoYW5naW5nIHNoYXBlLCBnaXZlblxuICogYSB7QGxpbmsgQ29udmVydGVycy5GaWVsZENvbnZlcnRlcnMgfCBGaWVsZENvbnZlcnRlcnM8VD59IGZvciB0aGUgZmllbGRzIGluIHRoZSBvYmplY3QuXG4gKiBAcmVtYXJrc1xuICogQnkgZGVmYXVsdCwgaWYgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMgZXhpc3QgYW5kIGNhbiBiZSBjb252ZXJ0ZWQsIHJldHVybnMgYSBuZXcgb2JqZWN0IHdpdGhcbiAqIHRoZSBjb252ZXJ0ZWQgdmFsdWVzIHVuZGVyIHRoZSBvcmlnaW5hbCBrZXkgbmFtZXMuICBJZiBhbnkgcmVxdWlyZWQgZmllbGRzIGRvIG5vdCBleGlzdCBvciBjYW5ub3RcbiAqIGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLiBTZWUge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyT3B0aW9ucyB8IE9iamVjdENvbnZlcnRlck9wdGlvbnN9XG4gKiBmb3Igb3RoZXIgY29udmVyc2lvbiBvcHRpb25zLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgT2JqZWN0Q29udmVydGVyPFQsIFRDPXVua25vd24+IGV4dGVuZHMgQmFzZUNvbnZlcnRlcjxULCBUQz4ge1xuICAgIC8qKlxuICAgICAqIEZpZWxkcyBjb252ZXJ0ZWQgYnkgdGhpcyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBmaWVsZHM6IEZpZWxkQ29udmVydGVyczxUPjtcbiAgICAvKipcbiAgICAgKiBPcHRpb25zIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGlzIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0uXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD47XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcjxUPn0gdXNpbmcgb3B0aW9uc1xuICAgICAqIHN1cHBsaWVkIGluIGEge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyT3B0aW9ucyB8IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD59LlxuICAgICAqIEBwYXJhbSBmaWVsZHMgLSBBIHtAbGluayBDb252ZXJ0ZXJzLkZpZWxkQ29udmVydGVycyB8IEZpZWxkQ29udmVydGVyczxUPn0gY29udGFpbmluZ1xuICAgICAqIGEge0BsaW5rIENvbnZlcnRlcn0gZm9yIGVhY2ggZmllbGRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9wdGlvbmFsIEBzZWUgT2JqZWN0Q29udmVydGVyT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGNvbnZlcnNpb25cbiAgICAgKiB7QGxhYmVsIHdpdGhPcHRpb25zfVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxULCBUQz4sIG9wdGlvbnM/OiBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+KVxuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXI8VD59IHdpdGggb3B0aW9uYWxcbiAgICAgKiBwcm9wZXJ0aWVzIHNwZWNpZmllZCBhcyBhbiBhcnJheSBvZiBga2V5b2YgVGAuXG4gICAgICogQHBhcmFtIGZpZWxkcyAtIEEge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJzPFQ+fSBjb250YWluaW5nXG4gICAgICogYSB7QGxpbmsgQ29udmVydGVyfSBmb3IgZWFjaCBmaWVsZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9uYWwgLSBBbiBhcnJheSBvZiBga2V5b2YgVGAgbGlzdGluZyBmaWVsZHMgdGhhdCBhcmUgbm90IHJlcXVpcmVkLlxuICAgICAqIHtAbGFiZWwgd2l0aEtleXN9XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQsIFRDPiwgb3B0aW9uYWw/OiAoa2V5b2YgVClbXSk7XG4gICAgLyoqXG4gICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyLihjb25zdHJ1Y3Rvcjp3aXRoT3B0aW9ucyl9XG4gICAgICogYW5kIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlci4oY29uc3RydWN0b3I6d2l0aEtleXMpfS5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VCwgVEM+LCBvcHQ/OiBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+fChrZXlvZiBUKVtdKSB7XG4gICAgICAgIHN1cGVyKChmcm9tOiB1bmtub3duLCBfc2VsZiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQgYnVnIHRoaW5rcyBrZXkgaXMgdXNlZCBiZWZvcmUgZGVmaW5lZFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7fSBhcyB7IFtrZXkgaW4ga2V5b2YgVF06IFRba2V5XSB9O1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT3B0aW9uYWwgPSAoZmllbGRzW2tleV0uaXNPcHRpb25hbCB8fCB0aGlzLm9wdGlvbnMub3B0aW9uYWxGaWVsZHM/LmluY2x1ZGVzKGtleSkpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpc09wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbmFsRmllbGQoa2V5LCBmaWVsZHNba2V5XSkuY29udmVydChmcm9tLCBjb250ZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZChrZXksIGZpZWxkc1trZXldKS5jb252ZXJ0KGZyb20sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIChyZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0cmljdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGlmICgodHlwZW9mIGZyb20gPT09ICdvYmplY3QnKSAmJiAoIUFycmF5LmlzQXJyYXkoZnJvbSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm9tLmhhc093blByb3BlcnR5KGtleSkgJiYgKCFpc0tleU9mKGtleSwgZmllbGRzKSB8fCAoZmllbGRzW2tleV0gPT09IHVuZGVmaW5lZCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7a2V5fTogdW5leHBlY3RlZCBwcm9wZXJ0eSBpbiBzb3VyY2Ugb2JqZWN0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKCdzb3VyY2UgaXMgbm90IGFuIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgPyBzdWNjZWVkKGNvbnZlcnRlZCkgOiBmYWlsKHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiA/IGAke3RoaXMub3B0aW9ucy5kZXNjcmlwdGlvbn06ICR7ZXJyb3JzLmpvaW4oJ1xcbicpfWAgOiBlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0KSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0geyBvcHRpb25hbEZpZWxkczogb3B0IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHQgPz8ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0gZGVyaXZlZCBmcm9tIHRoaXMgb25lIGJ1dCB3aXRoXG4gICAgICogbmV3IG9wdGlvbmFsIHByb3BlcnRpZXMgYXMgc3BlY2lmaWVkIGJ5IGEgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyT3B0aW9ucyB8IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD59LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlck9wdGlvbnMgfCBvcHRpb25zfSB0byBiZSBhcHBsaWVkIHRvIHRoZSBuZXdcbiAgICAgKiBjb252ZXJ0ZXIuXG4gICAgICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSB3aXRoIHRoZSBhZGRpdGlvbmFsIG9wdGlvbmFsIHNvdXJjZSBwcm9wZXJ0aWVzLlxuICAgICAqIHtAbGFiZWwgd2l0aE9wdGlvbnN9XG4gICAgICovXG4gICAgcHVibGljIHBhcnRpYWwob3B0aW9uczogT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPik6IE9iamVjdENvbnZlcnRlcjxQYXJ0aWFsPFQ+LCBUQz47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0gZGVyaXZlZCBmcm9tIHRoaXMgb25lIGJ1dCB3aXRoXG4gICAgICogbmV3IG9wdGlvbmFsIHByb3BlcnRpZXMgYXMgc3BlY2lmaWVkIGJ5IGEgc3VwcGxpZWQgYXJyYXkgb2YgYGtleW9mIFRgLlxuICAgICAqIEBwYXJhbSBvcHRpb25hbCAtIFRoZSBrZXlzIG9mIHRoZSBzb3VyY2Ugb2JqZWN0IHByb3BlcnRpZXMgdG8gYmUgbWFkZSBvcHRpb25hbC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IHdpdGggdGhlIGFkZGl0aW9uYWwgb3B0aW9uYWwgc291cmNlXG4gICAgICogcHJvcGVydGllcy5cbiAgICAgKiB7QGxhYmVsIHdpdGhLZXlzfVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0aWFsKG9wdGlvbmFsPzogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPiwgVEM+O1xuICAgIC8qKlxuICAgICAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mXG4gICAgICoge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyLihwYXJ0aWFsOndpdGhPcHRpb25zKSB8IE9iamVjdENvbnZlcnRlci5wYXJ0aWFsKE9iamVjdENvbnZlcnRlck9wdGlvbnMpfSBhbmRcbiAgICAgKiB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIuKHBhcnRpYWw6d2l0aEtleXMpIHwgT2JqZWN0Q29udmVydGVyLnBhcnRpYWwoKGtleW9mIFQpW119LlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0aWFsKG9wdD86IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD58KGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPiwgVEM+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPiwgVEM+KHRoaXMuZmllbGRzIGFzIEZpZWxkQ29udmVydGVyczxQYXJ0aWFsPFQ+LCBUQz4sIG9wdCBhcyBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFBhcnRpYWw8VD4+KS5fd2l0aCh0aGlzLl90cmFpdHMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IGRlcml2ZWQgZnJvbSB0aGlzIG9uZSBidXQgd2l0aFxuICAgICAqIG5ldyBvcHRpb25hbCBwcm9wZXJ0aWVzIGFzIHNwZWNpZmllZCBieSBhIHN1cHBsaWVkIGFycmF5IG9mIGBrZXlvZiBUYC5cbiAgICAgKiBAcGFyYW0gYWRkT3B0aW9uYWxQcm9wZXJ0aWVzIC0gVGhlIGtleXMgdG8gYmUgbWFkZSBvcHRpb25hbC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IHdpdGggdGhlIGFkZGl0aW9uYWwgb3B0aW9uYWwgc291cmNlXG4gICAgICogcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUGFydGlhbChhZGRPcHRpb25hbFByb3BlcnRpZXM6IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4sIFRDPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRpYWwoWy4uLnRoaXMub3B0aW9ucy5vcHRpb25hbEZpZWxkcyA/PyBbXSwgLi4uYWRkT3B0aW9uYWxQcm9wZXJ0aWVzXSkuX3dpdGgodGhpcy5fdHJhaXRzKCkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyPFQ+fSB3aGljaCBjb252ZXJ0cyBhbiBvYmplY3RcbiAqIHdpdGhvdXQgY2hhbmdpbmcgc2hhcGUsIGdpdmVuIGEge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJzPFQ+fSBhbmQgYW4gb3B0aW9uYWxcbiAqIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlck9wdGlvbnMgfCBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+fSB0byBmdXJ0aGVyIHJlZmluZSBjb252ZXJzaW9uIGJlaGF2aW9yLlxuICogQHJlbWFya3NcbiAqIEJ5IGRlZmF1bHQsIGlmIGFsbCBvZiB0aGUgcmVxdWVzdGVkIGZpZWxkcyBleGlzdCBhbmQgY2FuIGJlIGNvbnZlcnRlZCwgcmV0dXJucyB7QGxpbmsgU3VjY2Vzc31cbiAqIHdpdGggYSBuZXcgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNvbnZlcnRlZCB2YWx1ZXMgdW5kZXIgdGhlIG9yaWdpbmFsIGtleSBuYW1lcy4gIElmIGFueSByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gKiBkbyBub3QgZXhpc3Qgb3IgY2Fubm90IGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLCByZXR1cm5pbmcge0BsaW5rIEZhaWx1cmV9IHdpdGggYWRkaXRpb25hbFxuICogZXJyb3IgaW5mb3JtYXRpb24uXG4gKlxuICogRmllbGRzIHRoYXQgc3VjY2VlZCBidXQgY29udmVydCB0byB1bmRlZmluZWQgYXJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0IG9iamVjdCBidXQgZG8gbm90XG4gKiBmYWlsIHRoZSBjb252ZXJzaW9uLlxuICogQHBhcmFtIHByb3BlcnRpZXMgLSBBbiB7QGxpbmsgQ29udmVydGVycy5GaWVsZENvbnZlcnRlcnMgfCBGaWVsZENvbnZlcnRlcnM8VD59IGRlZmluaW5nIHRoZSBzaGFwZSBvZiB0aGVcbiAqIHNvdXJjZSBvYmplY3QgYW5kIHtAbGluayBDb252ZXJ0ZXIgfCBjb252ZXJ0ZXJzfSB0byBiZSBhcHBsaWVkIHRvIGVhY2ggcHJvcGVydGllcy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4ge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyT3B0aW9ucyB8IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD59IGNvbnRhaW5pbmcgb3B0aW9uc1xuICogZm9yIHRoZSBvYmplY3QgY29udmVydGVyLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSB3aGljaCBhcHBsaWVzIHRoZSBzcGVjaWZpZWQgY29udmVyc2lvbnMuXG4gKiB7QGxhYmVsIHdpdGhPcHRpb25zfVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0PFQ+KHByb3BlcnRpZXM6IEZpZWxkQ29udmVydGVyczxUPiwgb3B0aW9ucz86IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD4pOiBPYmplY3RDb252ZXJ0ZXI8VD47XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcjxUPn0gd2hpY2ggY29udmVydHMgYW4gb2JqZWN0XG4gKiB3aXRob3V0IGNoYW5naW5nIHNoYXBlLCBnaXZlbiBhIHtAbGluayBDb252ZXJ0ZXJzLkZpZWxkQ29udmVydGVycyB8IEZpZWxkQ29udmVydGVyczxUPn0gYW5kIGEgc2V0IG9mXG4gKiBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICogQHJlbWFya3NcbiAqIEJ5IGRlZmF1bHQsIGlmIGFsbCBvZiB0aGUgcmVxdWVzdGVkIGZpZWxkcyBleGlzdCBhbmQgY2FuIGJlIGNvbnZlcnRlZCwgcmV0dXJucyB7QGxpbmsgU3VjY2Vzc31cbiAqIHdpdGggYSBuZXcgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNvbnZlcnRlZCB2YWx1ZXMgdW5kZXIgdGhlIG9yaWdpbmFsIGtleSBuYW1lcy4gIElmIGFueSByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gKiBkbyBub3QgZXhpc3Qgb3IgY2Fubm90IGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLCByZXR1cm5pbmcge0BsaW5rIEZhaWx1cmV9IHdpdGggYWRkaXRpb25hbFxuICogZXJyb3IgaW5mb3JtYXRpb24uXG4gKlxuICogRmllbGRzIHRoYXQgc3VjY2VlZCBidXQgY29udmVydCB0byB1bmRlZmluZWQgYXJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0IG9iamVjdCBidXQgZG8gbm90XG4gKiBmYWlsIHRoZSBjb252ZXJzaW9uLlxuICogQHBhcmFtIHByb3BlcnRpZXMgLSBBbiB7QGxpbmsgQ29udmVydGVycy5GaWVsZENvbnZlcnRlcnMgfCBGaWVsZENvbnZlcnRlcnM8VD59IGRlZmluaW5nIHRoZSBzaGFwZSBvZiB0aGVcbiAqIHNvdXJjZSBvYmplY3QgYW5kIHtAbGluayBDb252ZXJ0ZXIgfCBjb252ZXJ0ZXJzfSB0byBiZSBhcHBsaWVkIHRvIGVhY2ggcHJvcGVydGllcy5cbiAqIEBwYXJhbSBvcHRpb25hbCAtIEFuIGFycmF5IG9mIGAoa2V5b2YgVClgIGxpc3RpbmcgdGhlIGtleXMgdG8gYmUgY29uc2lkZXJlZCBvcHRpb25hbC5cbiAqIHtAbGFiZWwgd2l0aEtleXN9XG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IHdoaWNoIGFwcGxpZXMgdGhlIHNwZWNpZmllZCBjb252ZXJzaW9ucy5cbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ29udmVydGVycy5vYmplY3QuKDp3aXRoT3B0aW9ucykgfCBDb252ZXJ0ZXJzLm9iamVjdChmaWVsZHMsIG9wdGlvbnMpfSBpbnN0ZWFkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Q8VD4ocHJvcGVydGllczogRmllbGRDb252ZXJ0ZXJzPFQ+LCBvcHRpb25hbDogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8VD47XG4vKipcbiAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb252ZXJ0ZXJzLihvYmplY3Q6d2l0aE9wdGlvbnMpIHwgQ29udmVydGVycy5vYmplY3QoZmllbGRzLCBvcHRpb25zKX1cbiAqIGFuZCB7QGxpbmsgQ29udmVydGVycy4ob2JqZWN0OndpdGhLZXlzKSB8IENvbnZlcnRlcnMub2JqZWN0cyhmaWVsZHMsIG9wdGlvbmFsS2V5cyl9LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Q8VD4ocHJvcGVydGllczogRmllbGRDb252ZXJ0ZXJzPFQ+LCBvcHRpb25zPzogKGtleW9mIFQpW118T2JqZWN0Q29udmVydGVyT3B0aW9uczxUPik6IE9iamVjdENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RDb252ZXJ0ZXIocHJvcGVydGllcywgb3B0aW9ucyBhcyBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+KTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIENvbnZlcnRlcnMuc3RyaWN0T2JqZWN0Lig6d2l0aE9wdGlvbnMpfSBoZWxwZXIgZnVuY3Rpb24uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFN0cmljdE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD4gPSBPbWl0PE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD4sICdzdHJpY3QnPjtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBvYmplY3RcbiAqIHdpdGhvdXQgY2hhbmdpbmcgc2hhcGUsIGEge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJzPFQ+fSBhbmQgYW4gb3B0aW9uYWxcbiAqIHtAbGluayBDb252ZXJ0ZXJzLlN0cmljdE9iamVjdENvbnZlcnRlck9wdGlvbnMgfCBTdHJpY3RPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+fSB0byBmdXJ0aGVyIHJlZmluZVxuICogY29udmVyc2lvbiBiZWhhdmlvci5cbiAqXG4gKiBAcmVtYXJrc1xuICogRmllbGRzIHRoYXQgc3VjY2VlZCBidXQgY29udmVydCB0byB1bmRlZmluZWQgYXJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0IG9iamVjdCBidXQgZG8gbm90XG4gKiBmYWlsIHRoZSBjb252ZXJzaW9uLlxuICpcbiAqIFRoZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSB1bmV4cGVjdGVkIGZpZWxkcyBhcmUgZW5jb3VudGVyZWQuXG4gKlxuICogQHBhcmFtIHByb3BlcnRpZXMgLSBBbiBvYmplY3QgY29udGFpbmluZyBkZWZpbmluZyB0aGUgc2hhcGUgYW5kIGNvbnZlcnRlcnMgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb3B0aW9uYWwgQHNlZSBTdHJpY3RPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+IGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgdGhlIG9iamVjdCBjb252ZXJ0ZXIuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9IHdoaWNoIGFwcGxpZXMgdGhlIHNwZWNpZmllZCBjb252ZXJzaW9ucy5cbiAqIHtAbGFiZWwgd2l0aE9wdGlvbnN9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpY3RPYmplY3Q8VD4ocHJvcGVydGllczogRmllbGRDb252ZXJ0ZXJzPFQ+LCBvcHRpb25zPzogU3RyaWN0T2JqZWN0Q29udmVydGVyT3B0aW9uczxUPik6IE9iamVjdENvbnZlcnRlcjxUPjtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBvYmplY3RcbiAqIHdpdGhvdXQgY2hhbmdpbmcgc2hhcGUsIGEge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJzPFQ+fSBhbmQgYW4gb3B0aW9uYWxcbiAqIHtAbGluayBDb252ZXJ0ZXJzLlN0cmljdE9iamVjdENvbnZlcnRlck9wdGlvbnMgfCBTdHJpY3RPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+fSB0byBmdXJ0aGVyIHJlZmluZVxuICogY29udmVyc2lvbiBiZWhhdmlvci5cbiAqXG4gKiBAcmVtYXJrc1xuICogRmllbGRzIHRoYXQgc3VjY2VlZCBidXQgY29udmVydCB0byB1bmRlZmluZWQgYXJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0IG9iamVjdCBidXQgZG8gbm90XG4gKiBmYWlsIHRoZSBjb252ZXJzaW9uLlxuICpcbiAqIFRoZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSB1bmV4cGVjdGVkIGZpZWxkcyBhcmUgZW5jb3VudGVyZWQuXG4gKlxuICogQHBhcmFtIHByb3BlcnRpZXMgLSBBbiBvYmplY3QgY29udGFpbmluZyBkZWZpbmluZyB0aGUgc2hhcGUgYW5kIGNvbnZlcnRlcnMgdG8gYmUgYXBwbGllZC5cbiAqIEBwYXJhbSBvcHRpb25hbCAtIEFuIGFycmF5IG9mIGBrZXlvZiBUYCBjb250YWluaW5nIGtleXMgdG8gYmUgY29uc2lkZXJlZCBvcHRpb25hbC5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0gd2hpY2ggYXBwbGllcyB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb25zLlxuICoge0BsYWJlbCB3aXRoS2V5c31cbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgQ29udmVydGVycy5zdHJpY3RPYmplY3QoOndpdGhPcHRpb25zKSB8IENvbnZlcnRlcnMuc3RyaWN0T2JqZWN0KG9wdGlvbnMpfSBpbnN0ZWFkLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaWN0T2JqZWN0PFQ+KHByb3BlcnRpZXM6IEZpZWxkQ29udmVydGVyczxUPiwgb3B0aW9uYWw6IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFQ+O1xuXG4vKipcbiAqIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgQ29udmVydGVycy5zdHJpY3RPYmplY3QoOndpdGhPcHRpb25zKSB8IENvbnZlcnRlcnMuc3RyaWN0T2JqZWN0KGZpZWxkcywgb3B0aW9ucyl9XG4gKiBhbmQge0BsaW5rIENvbnZlcnRlcnMuKHN0cmljdE9iamVjdDp3aXRoS2V5cykgfCBDb252ZXJ0ZXJzLnN0cmljdE9iamVjdChmaWVsZHMsIG9wdGlvbmFsKX0uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmljdE9iamVjdDxUPihcbiAgICBwcm9wZXJ0aWVzOiBGaWVsZENvbnZlcnRlcnM8VD4sXG4gICAgb3B0PzogKGtleW9mIFQpW118U3RyaWN0T2JqZWN0Q29udmVydGVyT3B0aW9uczxUPixcbik6IE9iamVjdENvbnZlcnRlcjxUPiB7XG4gICAgY29uc3Qgb3B0aW9uczogT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPiA9IChvcHQgJiYgQXJyYXkuaXNBcnJheShvcHQpKVxuICAgICAgICA/IHsgc3RyaWN0OiB0cnVlLCBvcHRpb25hbEZpZWxkczogb3B0IH1cbiAgICAgICAgOiB7IC4uLihvcHQgPz8ge30pLCBzdHJpY3Q6IHRydWUgfTtcbiAgICByZXR1cm4gbmV3IE9iamVjdENvbnZlcnRlcihwcm9wZXJ0aWVzLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBBIHN0cmluZy1rZXllZCBgUmVjb3JkPHN0cmluZywgQ29udmVydGVyPmAgd2hpY2ggbWFwcyBzcGVjaWZpYyB7QGxpbmsgQ29udmVydGVyIHwgY29udmVydGVyc30gdG8gdGhlXG4gKiB2YWx1ZSBvZiBhIGRpc2NyaW1pbmF0b3IgcHJvcGVydHkuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIERpc2NyaW1pbmF0ZWRPYmplY3RDb252ZXJ0ZXJzPFQsIFREIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLCBUQz11bmtub3duPiA9IFJlY29yZDxURCwgQ29udmVydGVyPFQsIFRDPj47XG5cbi8qKlxuICogSGVscGVyIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGEgZGlzY3JpbWluYXRlZCBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBzaGFwZS5cbiAqIEByZW1hcmtzXG4gKiBUYWtlcyB0aGUgbmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBwcm9wZXJ0eSBhbmQgYVxuICoge0BsaW5rIENvbnZlcnRlcnMuRGlzY3JpbWluYXRlZE9iamVjdENvbnZlcnRlcnMgfCBzdHJpbmcta2V5ZWQgUmVjb3JkIG9mIGNvbnZlcnRlcnN9LiBEdXJpbmcgY29udmVyc2lvbixcbiAqIHRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gaW52b2tlcyB0aGUgY29udmVydGVyIGZyb20gYGNvbnZlcnRlcnNgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mXG4gKiB0aGUgZGlzY3JpbWluYXRvciBwcm9wZXJ0eSBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqXG4gKiBJZiB0aGUgc291cmNlIGlzIG5vdCBhbiBvYmplY3QsIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5IGlzIG1pc3NpbmcsIG9yIHRoZSBkaXNjcmltaW5hdG9yIGhhc1xuICogYSB2YWx1ZSBub3QgcHJlc2VudCBpbiB0aGUgY29udmVydGVycywgY29udmVyc2lvbiBmYWlscyBhbmQgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBtb3JlIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIGRpc2NyaW1pbmF0b3JQcm9wIC0gTmFtZSBvZiB0aGUgcHJvcGVydHkgdXNlZCB0byBkaXNjcmltaW5hdGUgdHlwZXMuXG4gKiBAcGFyYW0gY29udmVydGVycyAtIHtAbGluayBDb252ZXJ0ZXJzLkRpc2NyaW1pbmF0ZWRPYmplY3RDb252ZXJ0ZXJzIHwgU3RyaW5nLWtleWVkIHJlY29yZCBvZiBjb252ZXJ0ZXJzfSB0b1xuICogaW52b2tlLCB3aGVyZSBlYWNoIGtleSBjb3JyZXNwb25kcyB0byBhIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5LlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0aGUgY29ycmVzcG9uZGluZyBkaXNjcmltaW5hdGVkIG9iamVjdC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NyaW1pbmF0ZWRPYmplY3Q8VCwgVEQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFRDPXVua25vd24+KGRpc2NyaW1pbmF0b3JQcm9wOiBzdHJpbmcsIGNvbnZlcnRlcnM6IERpc2NyaW1pbmF0ZWRPYmplY3RDb252ZXJ0ZXJzPFQsIFREPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSB8fCBmcm9tID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGEgZGlzY3JpbWluYXRlZCBvYmplY3Q6IFwiJHtKU09OLnN0cmluZ2lmeShmcm9tKX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIWlzS2V5T2YoZGlzY3JpbWluYXRvclByb3AsIGZyb20pKSB8fCAoIWZyb21bZGlzY3JpbWluYXRvclByb3BdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtkaXNjcmltaW5hdG9yUHJvcH0gbm90IHByZXNlbnQgaW4gXCIke0pTT04uc3RyaW5naWZ5KGZyb20pfVwiYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWUgPSBmcm9tW2Rpc2NyaW1pbmF0b3JQcm9wXSBhcyBURDtcbiAgICAgICAgY29uc3QgY29udmVydGVyID0gY29udmVydGVyc1tkaXNjcmltaW5hdG9yVmFsdWVdO1xuICAgICAgICBpZiAoY29udmVydGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBObyBjb252ZXJ0ZXIgZm9yIGRpc2NyaW1pbmF0b3IgJHtkaXNjcmltaW5hdG9yUHJvcH09XCIke2Rpc2NyaW1pbmF0b3JWYWx1ZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tKTtcbiAgICB9KTtcbn1cblxuXG4vKipcbiAqIEhlbHBlciB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhIHNvdXJjZSBvYmplY3QgdG8gYSBuZXcgb2JqZWN0IHdpdGggYVxuICogZGlmZmVyZW50IHNoYXBlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24sIHRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG5ld1xuICogb2JqZWN0LCB3aGljaCBjb250YWlucyB0aGUgY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUga2V5IG5hbWVzIHNwZWNpZmllZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLlxuICogSXQgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIGFueSBmaWVsZHMgdG8gYmUgZXh0cmFjdGVkIGRvIG5vdCBleGlzdFxuICogb3IgY2Fubm90IGJlIGNvbnZlcnRlZC5cbiAqXG4gKiBGaWVsZHMgdGhhdCBzdWNjZWVkIGJ1dCBjb252ZXJ0IHRvIHVuZGVmaW5lZCBhcmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHQgb2JqZWN0IGJ1dCBkbyBub3RcbiAqIGZhaWwgdGhlIGNvbnZlcnNpb24uXG4gKlxuICogQHBhcmFtIHByb3BlcnRpZXMgLSBBbiBvYmplY3Qgd2l0aCBrZXkgbmFtZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCBhblxuICogYXBwcm9wcmlhdGUge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJ9IHdoaWNoIGV4dHJhY3RzIGFuZCBjb252ZXJ0c1xuICogYSBzaW5nbGUgZmlsZWQgZnJvbSB0aGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb24gYmVoYXZpb3IuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm08VCwgVEM9dW5rbm93bj4ocHJvcGVydGllczogRmllbGRDb252ZXJ0ZXJzPFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGYsIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAvLyBlc2xpbnQgYnVnIHRoaW5rcyBrZXkgaXMgdXNlZCBiZWZvcmUgZGVmaW5lZFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBbIGtleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcHJvcGVydGllc1trZXldLmNvbnZlcnQoZnJvbSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgPyBzdWNjZWVkKGNvbnZlcnRlZCkgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogUGVyLXByb3BlcnR5IGNvbnZlcnRlcnMgYW5kIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggZmllbGQgaW4gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBvZlxuICogYSB7QGxpbmsgQ29udmVydGVycy50cmFuc2Zvcm1PYmplY3R9IGNhbGwuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkVHJhbnNmb3JtZXJzPFRTUkMsIFRERVNULCBUQz11bmtub3duPiA9IHsgWyBrZXkgaW4ga2V5b2YgVERFU1QgXToge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgc291cmNlIG9iamVjdCB0byBiZSBjb252ZXJ0ZXIuXG4gICAgICovXG4gICAgZnJvbToga2V5b2YgVFNSQyxcbiAgICAvKipcbiAgICAgKiBUaGUgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgcHJvcGVydHkuXG4gICAgICovXG4gICAgY29udmVydGVyOiBDb252ZXJ0ZXI8VERFU1Rba2V5XSwgVEM+LFxuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCB0aGVuIGEgbWlzc2luZyBzb3VyY2UgcHJvcGVydHkgaXMgaWdub3JlZC4gIElmIGBmYWxzZWAgb3Igb21pdHRlZFxuICAgICAqIHRoZW4gYSBtaXNzaW5nIHNvdXJjZSBwcm9wZXJ0eSBjYXVzZXMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgb3B0aW9uYWw/OiBib29sZWFuLFxufSB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEge0BsaW5rIENvbnZlcnRlcnMudHJhbnNmb3JtT2JqZWN0fSBjYWxsLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybU9iamVjdE9wdGlvbnM8VFNSQz4ge1xuICAgIC8qKlxuICAgICAqIElmIGBzdHJpY3RgIGlzIGB0cnVlYCB0aGVuIHVudXNlZCBwcm9wZXJ0aWVzIGluIHRoZSBzb3VyY2Ugb2JqZWN0IGNhdXNlXG4gICAgICogYW4gZXJyb3IsIG90aGVyd2lzZSB0aGV5IGFyZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIHN0cmljdDogdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2Ygc291cmNlIHByb3BlcnRpZXMgdG8gYmUgaWdub3JlZCB3aGVuIHN0cmljdCBtb2RlXG4gICAgICogaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpZ25vcmU/OiAoa2V5b2YgVFNSQylbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgdHJhbnNmb3JtIHRvIGJlIHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBjcmVhdGUgYSBzdHJvbmdseS10eXBlZCB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhIHNvdXJjZSBvYmplY3QgdG8gYVxuICogbmV3IG9iamVjdCB3aXRoIGEgZGlmZmVyZW50IHNoYXBlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24sIHRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG5ld1xuICogb2JqZWN0LCB3aGljaCBjb250YWlucyB0aGUgY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUga2V5IG5hbWVzIHNwZWNpZmllZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLlxuICpcbiAqIEl0IHJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBhbnkgZmllbGRzIHRvIGJlIGV4dHJhY3RlZCBkbyBub3QgZXhpc3RcbiAqIG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQuXG4gKlxuICogQHBhcmFtIGRlc3RpbmF0aW9uRmllbGRzIC0gQW4gb2JqZWN0IHdpdGgga2V5IG5hbWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgdGFyZ2V0IG9iamVjdCBhbmQgYW5cbiAqIGFwcHJvcHJpYXRlIHtAbGluayBDb252ZXJ0ZXJzLkZpZWxkVHJhbnNmb3JtZXJzIHwgRmllbGRUcmFuc2Zvcm1lcnN9IHdoaWNoIHNwZWNpZmllcyB0aGUgbmFtZVxuICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaW4gdGhlIHNvdXJjZSBvYmplY3QsIHRoZSBjb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBzb3VyY2VcbiAqIHByb3BlcnR5IGFuZCBhbnkgY29uZmlndXJhdGlvbiB0byBndWlkZSB0aGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB3aGljaCBhZmZlY3QgdGhlIHRyYW5zZm9ybWF0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb24gYmVoYXZpb3IuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1PYmplY3Q8VFNSQywgVERFU1QsIFRDPXVua25vd24+KFxuICAgIGRlc3RpbmF0aW9uRmllbGRzOiBGaWVsZFRyYW5zZm9ybWVyczxUU1JDLCBUREVTVCwgVEM+LFxuICAgIG9wdGlvbnM/OiBUcmFuc2Zvcm1PYmplY3RPcHRpb25zPFRTUkM+XG4pOiBDb252ZXJ0ZXI8VERFU1QsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7fSBhcyB7IFsga2V5IGluIGtleW9mIFRERVNUIF06IFRERVNUW2tleV0gfTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCB1c2VkOiBTZXQ8a2V5b2YgVFNSQz4gPSBuZXcgU2V0KG9wdGlvbnM/Lmlnbm9yZSk7XG5cbiAgICAgICAgaWYgKCh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcpICYmICghQXJyYXkuaXNBcnJheShmcm9tKSkgJiYgKGZyb20gIT09IG51bGwpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlc3RpbmF0aW9uS2V5IGluIGRlc3RpbmF0aW9uRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uRmllbGRzW2Rlc3RpbmF0aW9uS2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcmNLZXkgPSBkZXN0aW5hdGlvbkZpZWxkc1tkZXN0aW5hdGlvbktleV0uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gZGVzdGluYXRpb25GaWVsZHNbZGVzdGluYXRpb25LZXldLmNvbnZlcnRlcjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNLZXlPZihzcmNLZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW3NyY0tleV0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtkZXN0aW5hdGlvbktleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzcmNLZXl9LT4ke2Rlc3RpbmF0aW9uS2V5fTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuYWRkKHNyY0tleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVzdGluYXRpb25GaWVsZHNbZGVzdGluYXRpb25LZXldLm9wdGlvbmFsICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtTdHJpbmcoc3JjS2V5KX06IHJlcXVpcmVkIHByb3BlcnR5IG1pc3NpbmcgaW4gc291cmNlIG9iamVjdC5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnN0cmljdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSAmJiAoIXVzZWQuaGFzKGtleSBhcyBrZXlvZiBUU1JDKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06IHVuZXhwZWN0ZWQgcHJvcGVydHkgaW4gc291cmNlIG9iamVjdGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goJ3NvdXJjZSBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApID8gc3VjY2VlZChjb252ZXJ0ZWQpIDogZmFpbChvcHRpb25zPy5kZXNjcmlwdGlvbiA/IGAke29wdGlvbnMuZGVzY3JpcHRpb259OlxcbiAgJHtlcnJvcnMuam9pbignXFxuICAnKX1gIDogZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnN0cnVjdCBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRvIGFuIGFyYml0cmFyeSBzdHJvbmdseS10eXBlZFxuICogcmFuZ2Ugb2Ygc29tZSBjb21wYXJhYmxlIHR5cGUuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGBtaW5gIGFuZCBgbWF4YCBleHRlbnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gU3RhdGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZVR5cGVPZjxULCBSVCBleHRlbmRzIFJhbmdlT2Y8VD4sIFRDPXVua25vd24+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgY29uc3RydWN0b3I6IChpbml0OiBSYW5nZU9mUHJvcGVydGllczxUPikgPT4gUmVzdWx0PFJUPik6IENvbnZlcnRlcjxSVCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmLCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gb2JqZWN0KHtcbiAgICAgICAgICAgIG1pbjogY29udmVydGVyLFxuICAgICAgICAgICAgbWF4OiBjb252ZXJ0ZXIsXG4gICAgICAgIH0sIHsgb3B0aW9uYWxGaWVsZHM6IFsnbWluJywgJ21heCddIH0pLmNvbnZlcnQoZnJvbSwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvcih7IG1pbjogcmVzdWx0LnZhbHVlLm1pbiwgbWF4OiByZXN1bHQudmFsdWUubWF4IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnN0cnVjdCBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRvIHtAbGluayBSYW5nZU9mIHwgUmFuZ2VPZjxUPn1cbiAqIHdoZXJlIGA8VD5gIGlzIHNvbWUgY29tcGFyYWJsZSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBgbWluYCBhbmQgYG1heGAgZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlT2Y8VCwgVEM9dW5rbm93bj4oY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFJhbmdlT2Y8VD4sIFRDPiB7XG4gICAgcmV0dXJuIHJhbmdlVHlwZU9mPFQsIFJhbmdlT2Y8VD4sIFRDPihjb252ZXJ0ZXIsIFJhbmdlT2YuY3JlYXRlUmFuZ2UpO1xufVxuIl19
|
package/csvHelpers.d.ts
CHANGED
package/csvHelpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csvHelpers.d.ts","sourceRoot":"","sources":["../src/csvHelpers.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,MAAM,EAAiB,MAAM,UAAU,CAAC;AAGjD
|
|
1
|
+
{"version":3,"file":"csvHelpers.d.ts","sourceRoot":"","sources":["../src/csvHelpers.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,MAAM,EAAiB,MAAM,UAAU,CAAC;AAGjD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAQtF"}
|
package/csvHelpers.js
CHANGED
|
@@ -66,4 +66,4 @@ function readCsvFileSync(srcPath, options) {
|
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
68
|
exports.readCsvFileSync = readCsvFileSync;
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2SGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jc3ZIZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixxQ0FBaUQ7QUFDakQseUNBQXVDO0FBVXZDOzs7Ozs7R0FNRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxPQUFlLEVBQUUsT0FBb0I7SUFDakUsT0FBTyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUQsT0FBTyxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQztRQUN4QiwyQkFBMkI7UUFDM0IsT0FBTyxJQUFBLFlBQUssRUFBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVJELDBDQVFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQgfSBmcm9tICcuL3Jlc3VsdCc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ2Nzdi1wYXJzZS9zeW5jJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgQ3N2LnJlYWRDc3ZGaWxlU3luY31cbiAqIEBiZXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3N2T3B0aW9ucyB7XG4gICAgZGVsaW1pdGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgQ1NWIGZpbGUgZnJvbSBhIHN1cHBsaWVkIHBhdGguXG4gKiBAcGFyYW0gc3JjUGF0aCAtIFNvdXJjZSBwYXRoIGZyb20gd2hpY2ggdGhlIGZpbGUgaXMgcmVhZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gb3B0aW9uYWwgcGFyYW1ldGVycyB0byBjb250cm9sIHRoZSBwcm9jZXNzaW5nXG4gKiBAcmV0dXJucyBUaGUgY29udGVudHMgb2YgdGhlIGZpbGUuXG4gKiBAYmV0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENzdkZpbGVTeW5jKHNyY1BhdGg6IHN0cmluZywgb3B0aW9ucz86IENzdk9wdGlvbnMpOiBSZXN1bHQ8dW5rbm93bj4ge1xuICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUoc3JjUGF0aCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsICd1dGY4JykudG9TdHJpbmcoKTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICByZXR1cm4gcGFyc2UoYm9keSwgeyB0cmltOiB0cnVlLCBmcm9tX2xpbmU6IDIsIC4uLm9wdGlvbnMgfSk7XG4gICAgfSk7XG59XG4iXX0=
|
package/normalize.js
CHANGED
|
@@ -98,7 +98,7 @@ class Normalizer {
|
|
|
98
98
|
.sort((e1, e2) => this._compareKeys(e1[0], e2[0]))
|
|
99
99
|
.map((e) => [e[0], this.normalize(e[1])])
|
|
100
100
|
.filter((e) => e[1].isSuccess())
|
|
101
|
-
.map((e) => [e[0], e[1].
|
|
101
|
+
.map((e) => [e[0], e[1].orThrow()]);
|
|
102
102
|
}
|
|
103
103
|
_normalizeArray(from) {
|
|
104
104
|
return (0, result_1.mapResults)(from.map((v) => this.normalize(v)));
|
|
@@ -136,4 +136,4 @@ class Normalizer {
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
exports.Normalizer = Normalizer;
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vcm1hbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFFSCxxQ0FBNkQ7QUFLN0Q7OztHQUdHO0FBQ0gsTUFBYSxVQUFVO0lBQ25COzs7OztPQUtHO0lBQ0ksU0FBUyxDQUFJLElBQU87UUFDdkIsUUFBUSxPQUFPLElBQUksRUFBRTtZQUNqQixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxXQUFXO2dCQUNaLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLEtBQUssUUFBUTtnQkFDVCxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLE1BQU0sQ0FBQyxFQUFFO29CQUN2RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdkM7cUJBQ0ksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUMxQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUF5QixDQUFDO2lCQUM3RDtxQkFDSSxJQUFJLElBQUksWUFBWSxHQUFHLEVBQUU7b0JBQzFCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBaUIsQ0FBQyxDQUFDO2lCQUNuRjtxQkFDSSxJQUFJLElBQUksWUFBWSxHQUFHLEVBQUU7b0JBQzFCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLElBQUksR0FBRyxDQUFDLElB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SUFBSSxDQUFDLENBQUM7U0FDeEI7UUFDRCx1QkFBdUI7UUFDdkIsSUFBSSxJQUFJLFlBQVksTUFBTSxFQUFFO1lBQ3hCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsdUJBQXVCO1FBQ3ZCLE9BQU8sSUFBQSxhQUFJLEVBQUMsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDSjtBQWhIRCxnQ0FnSEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgUmVzdWx0LCBmYWlsLCBtYXBSZXN1bHRzLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuXG5leHBvcnQgdHlwZSBFbnRyeTxUPiA9IFtzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIFRdO1xuZXhwb3J0IHR5cGUgUmVzdWx0RW50cnk8VD4gPSBbc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBSZXN1bHQ8VD5dO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gYXJiaXRyYXJ5IEpTT04gb2JqZWN0XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3JtYWxpemVyIHtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIHRoZSBzdXBwbGllZCB2YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGZyb20gLSBUaGUgdmFsdWUgdG8gYmUgbm9ybWFsaXplZFxuICAgICAqIEByZXR1cm5zIEEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBub3JtYWxpemU8VD4oZnJvbTogVCk6IFJlc3VsdDxUPiB7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGZyb20pIHtcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZUxpdGVyYWwoZnJvbSk7XG4gICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgIGlmICgoZnJvbSA9PT0gbnVsbCkgfHwgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB8fCAoZnJvbSBpbnN0YW5jZW9mIFJlZ0V4cCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZUxpdGVyYWwoZnJvbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZUFycmF5KGZyb20pIGFzIHVua25vd24gYXMgUmVzdWx0PFQ+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmcm9tIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKG5ldyBNYXAodGhpcy5fbm9ybWFsaXplRW50cmllcyhmcm9tLmVudHJpZXMoKSkpIGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZyb20gaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQobmV3IFNldCh0aGlzLl9ub3JtYWxpemVFbnRyaWVzKGZyb20uZW50cmllcygpKSkgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqOiB7IFtrZXkgaW4gbnVtYmVyIHwgc3RyaW5nIHwgc3ltYm9sXTogdW5rbm93biB9ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuX25vcm1hbGl6ZUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZnJvbSBhcyB1bmtub3duIGFzIG9iamVjdCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtlWzBdXSA9IGVbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKG9iaiBhcyBUKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgbm9ybWFsaXplOiBVbmV4cGVjdGVkIHR5cGUgLSBjYW5ub3Qgbm9ybWFsaXplICcke3R5cGVvZiBmcm9tfSdgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gcHJvcGVydHkgbmFtZXMgZnJvbSBzb21lIG9iamVjdCBiZWluZyBub3JtYWxpemVkLlxuICAgICAqIEBwYXJhbSBrMSAtIEZpcnN0IGtleSB0byBiZSBjb21wYXJlZC5cbiAgICAgKiBAcGFyYW0gazIgLSBTZWNvbmQga2V5IHRvIGJlIGNvbXBhcmVkLlxuICAgICAqIEByZXR1cm5zIGAxYCBpZiBgazFgIGlzIGdyZWF0ZXIsIGAtMWAgaWYgYGsyYCBpcyBncmVhdGVyIGFuZFxuICAgICAqIGAwYCBpZiB0aGV5IGFyZSBlcXVhbC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbXBhcmVLZXlzKGsxOiB1bmtub3duLCBrMjogdW5rbm93bik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNzMSA9IFN0cmluZyhrMSk7XG4gICAgICAgIGNvbnN0IGNzMiA9IFN0cmluZyhrMik7XG4gICAgICAgIGlmIChjczEgPiBjczIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgICAgIGlmIChjczIgPiBjczEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHByb3BlcnR5IGVudHJpZXMgKGUuZy4gYXMgcmV0dXJuZWQgYnkgYE9iamVjdC5lbnRyaWVzKClgKS5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIENvbnZlcnRzIHByb3BlcnR5IG5hbWVzIChlbnRyeSBrZXkpIHRvIHN0cmluZyBhbmQgdGhlbiBzb3J0cyBhcyBzdHJpbmcuXG4gICAgICogQHBhcmFtIGVudHJpZXMgLSBUaGUgZW50cmllcyB0byBiZSBub3JtYWxpemVkLlxuICAgICAqIEByZXR1cm5zIEEgbm9ybWFsaXplZCBzb3J0ZWQgYXJyYXkgb2YgZW50cmllcy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX25vcm1hbGl6ZUVudHJpZXM8VCA9IHVua25vd24+KGVudHJpZXM6IEl0ZXJhYmxlPEVudHJ5PFQ+Pik6IEVudHJ5PFQ+W10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbnRyaWVzKVxuICAgICAgICAgICAgLnNvcnQoKGUxLCBlMikgPT4gdGhpcy5fY29tcGFyZUtleXMoZTFbMF0sIGUyWzBdKSlcbiAgICAgICAgICAgIC5tYXAoKGUpID0+IFtlWzBdLCB0aGlzLm5vcm1hbGl6ZShlWzFdKV0gYXMgUmVzdWx0RW50cnk8VD4pXG4gICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlWzFdLmlzU3VjY2VzcygpKVxuICAgICAgICAgICAgLm1hcCgoZSkgPT4gW2VbMF0sIGVbMV0uZ2V0VmFsdWVPclRocm93KCldKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX25vcm1hbGl6ZUFycmF5KGZyb206IHVua25vd25bXSk6IFJlc3VsdDx1bmtub3duW10+IHtcbiAgICAgICAgcmV0dXJuIG1hcFJlc3VsdHMoZnJvbS5tYXAoKHYpID0+IHRoaXMubm9ybWFsaXplKHYpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyB0aGUgc3VwcGxpZWQgbGl0ZXJhbCB2YWx1ZVxuICAgICAqIEBwYXJhbSBmcm9tIC0gVGhlIGxpdGVyYWwgdmFsdWUgdG8gYmUgbm9ybWFsaXplZC5cbiAgICAgKiBAcmV0dXJucyBBIG5vcm1hbGl6ZWQgdmFsdWUgZm9yIHRoZSBsaXRlcmFsLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbm9ybWFsaXplTGl0ZXJhbDxUPihmcm9tOiBUKTogUmVzdWx0PFQ+IHtcbiAgICAgICAgLy8gVE9ETzogQXBwbHkgY29uZmlndXJhYmxlIG5vcm1hbGl6YXRpb24gcnVsZXNcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgZnJvbSkge1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICAgICAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnJvbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZVxuICAgICAgICBpZiAoZnJvbSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgcmV0dXJuIGZhaWwoYGNhbm5vdCBub3JtYWxpemUgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9XG59XG4iXX0=
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vcm1hbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFFSCxxQ0FBNkQ7QUFLN0Q7OztHQUdHO0FBQ0gsTUFBYSxVQUFVO0lBQ25COzs7OztPQUtHO0lBQ0ksU0FBUyxDQUFJLElBQU87UUFDdkIsUUFBUSxPQUFPLElBQUksRUFBRTtZQUNqQixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxXQUFXO2dCQUNaLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLEtBQUssUUFBUTtnQkFDVCxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLE1BQU0sQ0FBQyxFQUFFO29CQUN2RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdkM7cUJBQ0ksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUMxQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUF5QixDQUFDO2lCQUM3RDtxQkFDSSxJQUFJLElBQUksWUFBWSxHQUFHLEVBQUU7b0JBQzFCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBaUIsQ0FBQyxDQUFDO2lCQUNuRjtxQkFDSSxJQUFJLElBQUksWUFBWSxHQUFHLEVBQUU7b0JBQzFCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLElBQUksR0FBRyxDQUFDLElB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SUFBSSxDQUFDLENBQUM7U0FDeEI7UUFDRCx1QkFBdUI7UUFDdkIsSUFBSSxJQUFJLFlBQVksTUFBTSxFQUFFO1lBQ3hCLE9BQU8sSUFBQSxnQkFBTyxFQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsdUJBQXVCO1FBQ3ZCLE9BQU8sSUFBQSxhQUFJLEVBQUMsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDSjtBQWhIRCxnQ0FnSEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgUmVzdWx0LCBmYWlsLCBtYXBSZXN1bHRzLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuXG5leHBvcnQgdHlwZSBFbnRyeTxUPiA9IFtzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIFRdO1xuZXhwb3J0IHR5cGUgUmVzdWx0RW50cnk8VD4gPSBbc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBSZXN1bHQ8VD5dO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW4gYXJiaXRyYXJ5IEpTT04gb2JqZWN0XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3JtYWxpemVyIHtcbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIHRoZSBzdXBwbGllZCB2YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIGZyb20gLSBUaGUgdmFsdWUgdG8gYmUgbm9ybWFsaXplZFxuICAgICAqIEByZXR1cm5zIEEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSB2YWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBub3JtYWxpemU8VD4oZnJvbTogVCk6IFJlc3VsdDxUPiB7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGZyb20pIHtcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZUxpdGVyYWwoZnJvbSk7XG4gICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgIGlmICgoZnJvbSA9PT0gbnVsbCkgfHwgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB8fCAoZnJvbSBpbnN0YW5jZW9mIFJlZ0V4cCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZUxpdGVyYWwoZnJvbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZUFycmF5KGZyb20pIGFzIHVua25vd24gYXMgUmVzdWx0PFQ+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmcm9tIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKG5ldyBNYXAodGhpcy5fbm9ybWFsaXplRW50cmllcyhmcm9tLmVudHJpZXMoKSkpIGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZyb20gaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQobmV3IFNldCh0aGlzLl9ub3JtYWxpemVFbnRyaWVzKGZyb20uZW50cmllcygpKSkgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqOiB7IFtrZXkgaW4gbnVtYmVyIHwgc3RyaW5nIHwgc3ltYm9sXTogdW5rbm93biB9ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIHRoaXMuX25vcm1hbGl6ZUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZnJvbSBhcyB1bmtub3duIGFzIG9iamVjdCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtlWzBdXSA9IGVbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKG9iaiBhcyBUKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgbm9ybWFsaXplOiBVbmV4cGVjdGVkIHR5cGUgLSBjYW5ub3Qgbm9ybWFsaXplICcke3R5cGVvZiBmcm9tfSdgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gcHJvcGVydHkgbmFtZXMgZnJvbSBzb21lIG9iamVjdCBiZWluZyBub3JtYWxpemVkLlxuICAgICAqIEBwYXJhbSBrMSAtIEZpcnN0IGtleSB0byBiZSBjb21wYXJlZC5cbiAgICAgKiBAcGFyYW0gazIgLSBTZWNvbmQga2V5IHRvIGJlIGNvbXBhcmVkLlxuICAgICAqIEByZXR1cm5zIGAxYCBpZiBgazFgIGlzIGdyZWF0ZXIsIGAtMWAgaWYgYGsyYCBpcyBncmVhdGVyIGFuZFxuICAgICAqIGAwYCBpZiB0aGV5IGFyZSBlcXVhbC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbXBhcmVLZXlzKGsxOiB1bmtub3duLCBrMjogdW5rbm93bik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNzMSA9IFN0cmluZyhrMSk7XG4gICAgICAgIGNvbnN0IGNzMiA9IFN0cmluZyhrMik7XG4gICAgICAgIGlmIChjczEgPiBjczIpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgICAgIGlmIChjczIgPiBjczEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHByb3BlcnR5IGVudHJpZXMgKGUuZy4gYXMgcmV0dXJuZWQgYnkgYE9iamVjdC5lbnRyaWVzKClgKS5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIENvbnZlcnRzIHByb3BlcnR5IG5hbWVzIChlbnRyeSBrZXkpIHRvIHN0cmluZyBhbmQgdGhlbiBzb3J0cyBhcyBzdHJpbmcuXG4gICAgICogQHBhcmFtIGVudHJpZXMgLSBUaGUgZW50cmllcyB0byBiZSBub3JtYWxpemVkLlxuICAgICAqIEByZXR1cm5zIEEgbm9ybWFsaXplZCBzb3J0ZWQgYXJyYXkgb2YgZW50cmllcy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX25vcm1hbGl6ZUVudHJpZXM8VCA9IHVua25vd24+KGVudHJpZXM6IEl0ZXJhYmxlPEVudHJ5PFQ+Pik6IEVudHJ5PFQ+W10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbnRyaWVzKVxuICAgICAgICAgICAgLnNvcnQoKGUxLCBlMikgPT4gdGhpcy5fY29tcGFyZUtleXMoZTFbMF0sIGUyWzBdKSlcbiAgICAgICAgICAgIC5tYXAoKGUpID0+IFtlWzBdLCB0aGlzLm5vcm1hbGl6ZShlWzFdKV0gYXMgUmVzdWx0RW50cnk8VD4pXG4gICAgICAgICAgICAuZmlsdGVyKChlKSA9PiBlWzFdLmlzU3VjY2VzcygpKVxuICAgICAgICAgICAgLm1hcCgoZSkgPT4gW2VbMF0sIGVbMV0ub3JUaHJvdygpXSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9ub3JtYWxpemVBcnJheShmcm9tOiB1bmtub3duW10pOiBSZXN1bHQ8dW5rbm93bltdPiB7XG4gICAgICAgIHJldHVybiBtYXBSZXN1bHRzKGZyb20ubWFwKCh2KSA9PiB0aGlzLm5vcm1hbGl6ZSh2KSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgdGhlIHN1cHBsaWVkIGxpdGVyYWwgdmFsdWVcbiAgICAgKiBAcGFyYW0gZnJvbSAtIFRoZSBsaXRlcmFsIHZhbHVlIHRvIGJlIG5vcm1hbGl6ZWQuXG4gICAgICogQHJldHVybnMgQSBub3JtYWxpemVkIHZhbHVlIGZvciB0aGUgbGl0ZXJhbC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX25vcm1hbGl6ZUxpdGVyYWw8VD4oZnJvbTogVCk6IFJlc3VsdDxUPiB7XG4gICAgICAgIC8vIFRPRE86IEFwcGx5IGNvbmZpZ3VyYWJsZSBub3JtYWxpemF0aW9uIHJ1bGVzXG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGZyb20pIHtcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnJvbSk7XG4gICAgICAgICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZyb20gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmcm9tIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICAgICAgaWYgKGZyb20gaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHJldHVybiBmYWlsKGBjYW5ub3Qgbm9ybWFsaXplICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgfVxufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fgv/ts-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "Assorted Typescript Utilities",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -37,19 +37,19 @@
|
|
|
37
37
|
"@jest/expect-utils": "^29.3.1",
|
|
38
38
|
"@microsoft/api-documenter": "^7.19.27",
|
|
39
39
|
"@microsoft/api-extractor": "^7.19.5",
|
|
40
|
-
"@types/jest": "^29.2.
|
|
41
|
-
"@types/luxon": "^3.
|
|
40
|
+
"@types/jest": "^29.2.5",
|
|
41
|
+
"@types/luxon": "^3.2.0",
|
|
42
42
|
"@types/mustache": "^4.1.2",
|
|
43
|
-
"@types/node": "^18.11.
|
|
44
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
45
|
-
"@typescript-eslint/parser": "^5.
|
|
46
|
-
"eslint": "^8.
|
|
43
|
+
"@types/node": "^18.11.18",
|
|
44
|
+
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
|
45
|
+
"@typescript-eslint/parser": "^5.48.0",
|
|
46
|
+
"eslint": "^8.31.0",
|
|
47
47
|
"eslint-config-standard": "^17.0.0-1",
|
|
48
48
|
"eslint-plugin-import": "^2.24.2",
|
|
49
49
|
"eslint-plugin-node": "^11.1.0",
|
|
50
50
|
"eslint-plugin-promise": "^6.0.0",
|
|
51
51
|
"jest": "^29.3.1",
|
|
52
|
-
"jest-extended": "^3.2.
|
|
52
|
+
"jest-extended": "^3.2.1",
|
|
53
53
|
"jest-matcher-utils": "^29.3.1",
|
|
54
54
|
"rimraf": "^3.0.2",
|
|
55
55
|
"ts-jest": "^29.0.3",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"csv-parse": "^5.3.3",
|
|
61
|
-
"luxon": "^3.
|
|
61
|
+
"luxon": "^3.2.0",
|
|
62
62
|
"mustache": "^4.0.1"
|
|
63
63
|
}
|
|
64
64
|
}
|
package/result.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export type FailureContinuation<T> = (message: string) => Result<T>;
|
|
|
24
24
|
*/
|
|
25
25
|
export type ResultValueType<T> = T extends Result<infer TV> ? TV : never;
|
|
26
26
|
/**
|
|
27
|
-
* Simple logger interface used by {@link IResult.
|
|
27
|
+
* Simple logger interface used by {@link IResult.orThrow}.
|
|
28
28
|
* @public
|
|
29
29
|
*/
|
|
30
30
|
export interface IResultLogger {
|
|
@@ -59,7 +59,11 @@ export interface IResult<T> {
|
|
|
59
59
|
/**
|
|
60
60
|
* Gets the value associated with a successful {@link IResult | result},
|
|
61
61
|
* or throws the error message if the corresponding operation failed.
|
|
62
|
-
*
|
|
62
|
+
*
|
|
63
|
+
* Note that `getValueOrThrow` is being superseded by `orThrow` and
|
|
64
|
+
* will eventually be deprecated. Please use orDefault instead.
|
|
65
|
+
*
|
|
66
|
+
* @param logger - An optional {@link IResultLogger | logger} to which the
|
|
63
67
|
* error will also be reported.
|
|
64
68
|
* @returns The return value, if the operation was successful.
|
|
65
69
|
* @throws The error message if the operation failed.
|
|
@@ -70,10 +74,32 @@ export interface IResult<T> {
|
|
|
70
74
|
* or a default value if the corresponding operation failed.
|
|
71
75
|
* @param dflt - The value to be returned if the operation failed (default is
|
|
72
76
|
* `undefined`).
|
|
77
|
+
*
|
|
78
|
+
* Note that `getValueOrDefault` is being superseded by `orDefault` and
|
|
79
|
+
* will eventually be deprecated. Please use orDefault instead.
|
|
80
|
+
*
|
|
73
81
|
* @returns The return value, if the operation was successful. Returns
|
|
74
82
|
* the supplied default value or `undefined` if no default is supplied.
|
|
75
83
|
*/
|
|
76
84
|
getValueOrDefault(dflt?: T): T | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Gets the value associated with a successful {@link IResult | result},
|
|
87
|
+
* or throws the error message if the corresponding operation failed.
|
|
88
|
+
* @param logger - An optional {@link IResultLogger | logger} to which the
|
|
89
|
+
* error will also be reported.
|
|
90
|
+
* @returns The return value, if the operation was successful.
|
|
91
|
+
* @throws The error message if the operation failed.
|
|
92
|
+
*/
|
|
93
|
+
orThrow(logger?: IResultLogger): T;
|
|
94
|
+
/**
|
|
95
|
+
* Gets the value associated with a successful {@link IResult | result},
|
|
96
|
+
* or a default value if the corresponding operation failed.
|
|
97
|
+
* @param dflt - The value to be returned if the operation failed (default is
|
|
98
|
+
* `undefined`).
|
|
99
|
+
* @returns The return value, if the operation was successful. Returns
|
|
100
|
+
* the supplied default value or `undefined` if no default is supplied.
|
|
101
|
+
*/
|
|
102
|
+
orDefault(dflt?: T): T | undefined;
|
|
77
103
|
/**
|
|
78
104
|
* Calls a supplied {@link SuccessContinuation | success continuation} if
|
|
79
105
|
* the operation was a success.
|
|
@@ -151,6 +177,14 @@ export declare class Success<T> implements IResult<T> {
|
|
|
151
177
|
* {@inheritdoc IResult.isFailure}
|
|
152
178
|
*/
|
|
153
179
|
isFailure(): this is Failure<T>;
|
|
180
|
+
/**
|
|
181
|
+
* {@inheritdoc IResult.orThrow}
|
|
182
|
+
*/
|
|
183
|
+
orThrow(_logger?: IResultLogger): T;
|
|
184
|
+
/**
|
|
185
|
+
* {@inheritdoc IResult.orDefault}
|
|
186
|
+
*/
|
|
187
|
+
orDefault(dflt?: T): T | undefined;
|
|
154
188
|
/**
|
|
155
189
|
* {@inheritdoc IResult.getValueOrThrow}
|
|
156
190
|
*/
|
|
@@ -206,6 +240,14 @@ export declare class Failure<T> implements IResult<T> {
|
|
|
206
240
|
* {@inheritdoc IResult.isFailure}
|
|
207
241
|
*/
|
|
208
242
|
isFailure(): this is Failure<T>;
|
|
243
|
+
/**
|
|
244
|
+
* {@inheritdoc IResult.orThrow}
|
|
245
|
+
*/
|
|
246
|
+
orThrow(logger?: IResultLogger): never;
|
|
247
|
+
/**
|
|
248
|
+
* {@inheritdoc IResult.orDefault}
|
|
249
|
+
*/
|
|
250
|
+
orDefault(dflt?: T): T | undefined;
|
|
209
251
|
/**
|
|
210
252
|
* {@inheritdoc IResult.getValueOrThrow}
|
|
211
253
|
*/
|
package/result.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAChD;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AAClE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;AACpE;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAEzE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhC;;;OAGG;IACH,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhC
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAuBA;;;;;;GAMG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAChD;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AAClE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;AACpE;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAEzE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhC;;;OAGG;IACH,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhC;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC;IAE3C;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,SAAS,CAAC;IAEzC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC;IAEnC;;;;;;;OAOG;IACH,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,SAAS,CAAC;IAEjC;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAE1D;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAEjD;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzD;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACzE;AAED;;;;GAIG;AACH,qBAAa,OAAO,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IACzC;;OAEG;IACH,SAAgB,OAAO,QAAQ;IAC/B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAI;IAE3B;;;OAGG;gBACS,KAAK,EAAE,CAAC;IAIpB;;OAEG;IACH,IAAW,KAAK,IAAI,CAAC,CAEpB;IAED;;OAEG;IACI,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC;IAItC;;OAEG;IACI,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC;IAItC;;OAEG;IACI,OAAO,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,CAAC;IAI1C;;OAEG;IACI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,SAAS;IAIvC;;OAEG;IACI,eAAe,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,CAAC;IAIlD;;OAEG;IACI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,SAAS;IAI/C;;OAEG;IACI,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAIhE;;OAEG;IACI,SAAS,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAItD;;OAEG;IACI,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC;IAIhE;;OAEG;IACI,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC;CAG/E;AAED;;;GAGG;AACH,qBAAa,OAAO,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IACzC;;OAEG;IACH,SAAgB,OAAO,SAAS;IAEhC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC;;;OAGG;gBACS,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACH,IAAW,OAAO,IAAI,MAAM,CAE3B;IAED;;OAEG;IACI,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC;IAItC;;OAEG;IACI,SAAS,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC;IAItC;;OAEG;IACI,OAAO,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,KAAK;IAO7C;;OAEG;IACI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,SAAS;IAIvC;;OAEG;IACI,eAAe,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,KAAK;IAOrD;;OAEG;IACI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,SAAS;IAI/C;;OAEG;IACI,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;IAI/D;;OAEG;IACI,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAIvD;;OAEG;IACI,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC;IAI/D;;OAEG;IACI,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC;IAI7E;;;;;OAKG;IACI,QAAQ,IAAI,MAAM;CAG5B;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAEnD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAEvG;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAExG;;;;GAIG;AACH,qBAAa,eAAe,CAAC,CAAC,EAAE,EAAE,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAClD;;OAEG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;IAEvB;;;;;;OAMG;gBACgB,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE;IAKxC;;;OAGG;IACH,IAAW,MAAM,IAAI,EAAE,GAAC,SAAS,CAEhC;IAED;;;;;;;OAOG;IACI,SAAS,IAAI,IAAI,IAAI,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC;IAIlD;;;;;;;OAOG;IACI,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,2BAA2B,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC;IAIxF;;;;;;;OAOG;IACI,SAAS,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC;CAGnF;AAED;;;;GAIG;AACH,qBAAa,eAAe,CAAC,CAAC,EAAE,EAAE,CAAE,SAAQ,OAAO,CAAC,CAAC,CAAC;IAClD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;IAEtB;;;;;OAKG;gBACgB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;IAK9C;;OAEG;IACH,IAAW,MAAM,IAAI,EAAE,CAEtB;IAED;;;;;;;OAOG;IACI,SAAS,IAAI,IAAI,IAAI,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC;IAIlD;;;;;;;;;OASG;IACI,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,2BAA2B,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC;IAIzF;;;;;OAKG;IACI,SAAS,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC;CAGlF;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,EAAE,IAAI,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,GAAC,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAElF;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAE3F;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAEtF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAEzF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAInH;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAOzD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAiBvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAiB7G;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAiBvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAQrE;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAgB5F;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;KAAI,GAAG,IAAI,MAAM,CAAC,GAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CAAE,CAAC;AAEjG;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACpC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IAEpB;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CAC7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAErH;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC"}
|
package/result.js
CHANGED
|
@@ -57,6 +57,19 @@ class Success {
|
|
|
57
57
|
isFailure() {
|
|
58
58
|
return false;
|
|
59
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* {@inheritdoc IResult.orThrow}
|
|
62
|
+
*/
|
|
63
|
+
orThrow(_logger) {
|
|
64
|
+
return this._value;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* {@inheritdoc IResult.orDefault}
|
|
68
|
+
*/
|
|
69
|
+
orDefault(dflt) {
|
|
70
|
+
var _a;
|
|
71
|
+
return (_a = this._value) !== null && _a !== void 0 ? _a : dflt;
|
|
72
|
+
}
|
|
60
73
|
/**
|
|
61
74
|
* {@inheritdoc IResult.getValueOrThrow}
|
|
62
75
|
*/
|
|
@@ -130,6 +143,21 @@ class Failure {
|
|
|
130
143
|
isFailure() {
|
|
131
144
|
return true;
|
|
132
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* {@inheritdoc IResult.orThrow}
|
|
148
|
+
*/
|
|
149
|
+
orThrow(logger) {
|
|
150
|
+
if (logger !== undefined) {
|
|
151
|
+
logger.error(this._message);
|
|
152
|
+
}
|
|
153
|
+
throw new Error(this._message);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* {@inheritdoc IResult.orDefault}
|
|
157
|
+
*/
|
|
158
|
+
orDefault(dflt) {
|
|
159
|
+
return dflt;
|
|
160
|
+
}
|
|
133
161
|
/**
|
|
134
162
|
* {@inheritdoc IResult.getValueOrThrow}
|
|
135
163
|
*/
|
|
@@ -538,4 +566,4 @@ function populateObject(initializers, optionsOrOrder) {
|
|
|
538
566
|
return succeed(state);
|
|
539
567
|
}
|
|
540
568
|
exports.populateObject = populateObject;
|
|
541
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUF3SUg7Ozs7R0FJRztBQUNILE1BQWEsT0FBTztJQVVoQjs7O09BR0c7SUFDSCxZQUFZLEtBQVE7UUFicEI7O1dBRUc7UUFDYSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBVzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNaLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxPQUF1QjtRQUMxQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsSUFBUTs7UUFDN0IsT0FBTyxNQUFBLElBQUksQ0FBQyxNQUFNLG1DQUFJLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUssRUFBOEI7UUFDL0MsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxDQUF5QjtRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBSyxPQUFXO1FBQ3BDLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBSyxNQUFVLEVBQUUsYUFBa0I7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RyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQzdCO2lCQUNJO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9CO1NBQ0o7YUFDSTtZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RjtLQUNKO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDbEM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFVLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBMUNELHdDQTBDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0gb2Ygc29tZSBvcGVyYXRpb24gb3Igc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucy5cbiAqIEByZW1hcmtzXG4gKiB7QGxpbmsgU3VjY2VzcyB8IFN1Y2Nlc3M8VD59IGFuZCB7QGxpbmsgRmFpbHVyZSB8IEZhaWx1cmU8VD59IHNoYXJlIHRoZSBjb21tb25cbiAqIGNvbnRyYWN0IHtAbGluayBJUmVzdWx0fSwgZW5hYmxpbmcgY29tbWluZ2xlZCBkaXNjcmltaW5hdGVkIHVzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VD4gPSBTdWNjZXNzPFQ+IHwgRmFpbHVyZTxUPjtcbi8qKlxuICogQ29udGludWF0aW9uIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiB0aGUgZXZlbnQgdGhhdCBhblxuICoge0BsaW5rIFJlc3VsdH0gaXMgc3VjY2Vzc2Z1bC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4gPSAodmFsdWU6IFQpID0+IFJlc3VsdDxUTj47XG4vKipcbiAqIENvbnRpbnVhdGlvbiBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IHRoYXQgYW5cbiAqIHtAbGluayBSZXN1bHR9IGZhaWxzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGYWlsdXJlQ29udGludWF0aW9uPFQ+ID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gUmVzdWx0PFQ+O1xuLyoqXG4gKiBUeXBlIGluZmVyZW5jZSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIG9mIGFuIHtAbGluayBSZXN1bHR9LlxuICogQGJldGFcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0VmFsdWVUeXBlPFQ+ID0gVCBleHRlbmRzIFJlc3VsdDxpbmZlciBUVj4gPyBUViA6IG5ldmVyO1xuXG4vKipcbiAqIFNpbXBsZSBsb2dnZXIgaW50ZXJmYWNlIHVzZWQgYnkge0BsaW5rIElSZXN1bHQuZ2V0VmFsdWVPclRocm93fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVzdWx0TG9nZ2VyIHtcbiAgICAvKipcbiAgICAgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICAgKi9cbiAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBzb21lIG9wZXJhdGlvbiBvZiBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zLlxuICogQHJlbWFya3NcbiAqIFRoaXMgY29tbW9uIGNvbnRyYWN0IGVuYWJsZXMgY29tbWluZ2xlZCBkaXNjcmltaW5hdGVkIHVzYWdlIG9mIHtAbGluayBTdWNjZXNzIHwgU3VjY2VzczxUPn1cbiAqIGFuZCB7QGxpbmsgRmFpbHVyZSB8IEZhaWx1cmU8VD59LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElSZXN1bHQ8VD4ge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAgICovXG4gICAgcmVhZG9ubHkgc3VjY2VzczogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLiAgRnVuY3Rpb25zXG4gICAgICogYXMgYSB0eXBlIGd1YXJkIGZvciB7QGxpbmsgU3VjY2VzcyB8IFN1Y2Nlc3M8VD59LlxuICAgICAqL1xuICAgIGlzU3VjY2VzcygpOiB0aGlzIGlzIFN1Y2Nlc3M8VD47XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9wZXJhdGlvbiBmYWlsZWQuICBGdW5jdGlvbnNcbiAgICAgKiBhcyBhIHR5cGUgZ3VhcmQgZm9yIHtAbGluayBGYWlsdXJlIHwgRmFpbHVyZTxUPn0uXG4gICAgICovXG4gICAgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPjtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHN1Y2Nlc3NmdWwge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9LFxuICAgICAqIG9yIHRocm93cyB0aGUgZXJyb3IgbWVzc2FnZSBpZiB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqIEBwYXJhbSBsb2dnZXIgLSBBbiBvcHRpb25hbCB7QGxpbmsgSVJlc3VsdExvZ2dlciB8IGxvZ2dlcn0gdG8gd2hpY2ggdGhlXG4gICAgICogZXJyb3Igd2lsbCBhbHNvIGJlIHJlcG9ydGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUsIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAgICogQHRocm93cyBUaGUgZXJyb3IgbWVzc2FnZSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKi9cbiAgICBnZXRWYWx1ZU9yVGhyb3cobG9nZ2VyPzogSVJlc3VsdExvZ2dlcik6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBzdWNjZXNzZnVsIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSxcbiAgICAgKiBvciBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcGFyYW0gZGZsdCAtIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZCAoZGVmYXVsdCBpc1xuICAgICAqIGB1bmRlZmluZWRgKS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlLCBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLiAgUmV0dXJuc1xuICAgICAqIHRoZSBzdXBwbGllZCBkZWZhdWx0IHZhbHVlIG9yIGB1bmRlZmluZWRgIGlmIG5vIGRlZmF1bHQgaXMgc3VwcGxpZWQuXG4gICAgICovXG4gICAgZ2V0VmFsdWVPckRlZmF1bHQoZGZsdD86IFQpOiBUfHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgc3VwcGxpZWQge0BsaW5rIFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNvbnRpbnVhdGlvbn0gaWZcbiAgICAgKiB0aGUgb3BlcmF0aW9uIHdhcyBhIHN1Y2Nlc3MuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUge0BsaW5rIFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNvbnRpbnVhdGlvbn0gbWlnaHQgcmV0dXJuIGFcbiAgICAgKiBkaWZmZXJlbnQgcmVzdWx0IHR5cGUgdGhhbiB7QGxpbmsgSVJlc3VsdH0gb24gd2hpY2ggaXQgaXMgaW52b2tlZC4gVGhpc1xuICAgICAqIGVuYWJsZXMgY2hhaW5pbmcgb2Ygb3BlcmF0aW9ucyB3aXRoIGhldGVyb2dlbm91cyByZXR1cm4gdHlwZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2IgLSBUaGUge0BsaW5rIFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNvbnRpbnVhdGlvbn0gdG9cbiAgICAgKiBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IG9mIHN1Y2Nlc3MuXG4gICAgICogQHJldHVybnMgSWYgdGhpcyBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkXG4gICAgICogYnkgdGhlIHtAbGluayBTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjb250aW51YXRpb259LiAgSWYgdGhpcyByZXN1bHRcbiAgICAgKiBmYWlsZWQsIHByb3BhZ2F0ZXMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGlzIGZhaWx1cmUuXG4gICAgICovXG4gICAgb25TdWNjZXNzPFROPihjYjogU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4pOiBSZXN1bHQ8VE4+O1xuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBzdXBwbGllZCB7QGxpbmsgRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWxlZCBjb250aW51YXRpb259IGlmXG4gICAgICogdGhlIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICogQHBhcmFtIGNiIC0gVGhlIHtAbGluayBGYWlsdXJlQ29udGludWF0aW9uIHwgZmFpbHVyZSBjb250aW51YXRpb259IHRvXG4gICAgICogYmUgY2FsbGVkIGluIHRoZSBldmVudCBvZiBmYWlsdXJlLlxuICAgICAqIEByZXR1cm5zIElmIHRoaXMgb3BlcmF0aW9uIGZhaWxlZCwgcmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlXG4gICAgICoge0BsaW5rIEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsdXJlIGNvbnRpbnVhdGlvbn0uICBJZiB0aGlzIHJlc3VsdFxuICAgICAqIHdhcyBzdWNjZXNzZnVsLCBwcm9wYWdhdGVzIHRoZSByZXN1bHQgdmFsdWUgZnJvbSB0aGUgc3VjY2Vzc2Z1bCBldmVudC5cbiAgICAgKi9cbiAgICBvbkZhaWx1cmUoY2I6IEZhaWx1cmVDb250aW51YXRpb248VD4pOiBSZXN1bHQ8VD47XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIHtAbGluayBJUmVzdWx0IHwgSVJlc3VsdDxUPn0gdG8gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59LFxuICAgICAqIGFkZGluZyBhIHN1cHBsaWVkIGRldGFpbCBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIC0gVGhlIGRldGFpbCB0byBiZSBhZGRlZCBpZiB0aGlzIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICogQHJldHVybnMgQSBuZXcge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSB3aXRoIGVpdGhlclxuICAgICAqIHRoZSBzdWNjZXNzIHJlc3VsdCBvciB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoaXMge0BsaW5rIElSZXN1bHR9LCB3aXRoXG4gICAgICogdGhlIHN1cHBsaWVkIGRldGFpbCAoaWYgdGhpcyBldmVudCBmYWlsZWQpIG9yIGRldGFpbCBgdW5kZWZpbmVkYCAoaWZcbiAgICAgKiB0aGlzIHJlc3VsdCBzdWNjZWVkZWQpLlxuICAgICAqL1xuICAgIHdpdGhGYWlsdXJlRGV0YWlsPFREPihkZXRhaWw6IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSB7QGxpbmsgSVJlc3VsdCB8IElSZXN1bHQ8VD59IHRvIGEge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSxcbiAgICAgKiBhZGRpbmcgc3VwcGxpZWQgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIC0gVGhlIGRlZmF1bHQgZGV0YWlsIHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcge0BsaW5rIERldGFpbGVkUmVzdWx0fS5cbiAgICAgKiBAcGFyYW0gc3VjY2Vzc0RldGFpbCAtIEFuIG9wdGlvbmFsIGRldGFpbCB0byBiZSBhZGRlZCBpZiB0aGlzIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHdpdGggZWl0aGVyXG4gICAgICogdGhlIHN1Y2Nlc3MgcmVzdWx0IG9yIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhpcyB7QGxpbmsgSVJlc3VsdH0gYW5kIHRoZVxuICAgICAqIGFwcHJvcHJpYXRlIGFkZGVkIGRldGFpbC5cbiAgICAgKi9cbiAgICB3aXRoRGV0YWlsPFREPihkZXRhaWw6IFRELCBzdWNjZXNzRGV0YWlsPzogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG59XG5cbi8qKlxuICogUmVwb3J0cyBhIHN1Y2Nlc3NmdWwge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9IGZyb20gc29tZSBvcGVyYXRpb24gYW5kIHRoZVxuICogY29ycmVzcG9uZGluZyB2YWx1ZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFN1Y2Nlc3M8VD4gaW1wbGVtZW50cyBJUmVzdWx0PFQ+IHtcbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5zdWNjZXNzfVxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzdWNjZXNzID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF92YWx1ZTogVDtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBUKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlc3VsdCB2YWx1ZSByZXR1cm5lZCBieSB0aGUgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzU3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzRmFpbHVyZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5nZXRWYWx1ZU9yVGhyb3d9XG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlT3JUaHJvdyhfbG9nZ2VyPzogSVJlc3VsdExvZ2dlcik6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPckRlZmF1bHR9XG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVlT3JEZWZhdWx0KGRmbHQ/OiBUKTogVHx1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUgPz8gZGZsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vblN1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIG9uU3VjY2VzczxUTj4oY2I6IFN1Y2Nlc3NDb250aW51YXRpb248VCwgVE4+KTogUmVzdWx0PFROPiB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vbkZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIG9uRmFpbHVyZShfOiBGYWlsdXJlQ29udGludWF0aW9uPFQ+KTogUmVzdWx0PFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQud2l0aEZhaWx1cmVEZXRhaWx9XG4gICAgICovXG4gICAgcHVibGljIHdpdGhGYWlsdXJlRGV0YWlsPFREPihfZGV0YWlsOiBURCk6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkV2l0aERldGFpbCh0aGlzLnZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC53aXRoRGV0YWlsfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRGV0YWlsPFREPihkZXRhaWw6IFRELCBzdWNjZXNzRGV0YWlsPzogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwodGhpcy52YWx1ZSwgc3VjY2Vzc0RldGFpbCA/PyBkZXRhaWwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXBvcnRzIGEgZmFpbGVkIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSBmcm9tIHNvbWUgb3BlcmF0aW9uLCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWlsdXJlPFQ+IGltcGxlbWVudHMgSVJlc3VsdDxUPiB7XG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuc3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIHtAbGluayBGYWlsdXJlfSB3aXRoIHRoZSBzdXBwbGllZCBtZXNzYWdlLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSByZXBvcnRlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlcnJvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuaXNTdWNjZXNzfVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1N1Y2Nlc3MoKTogdGhpcyBpcyBTdWNjZXNzPFQ+IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzRmFpbHVyZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmdldFZhbHVlT3JUaHJvd31cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWVPclRocm93KGxvZ2dlcj86IElSZXN1bHRMb2dnZXIpOiBuZXZlciB7XG4gICAgICAgIGlmIChsb2dnZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHRoaXMuX21lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLl9tZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5nZXRWYWx1ZU9yRGVmYXVsdH1cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWVPckRlZmF1bHQoZGZsdD86IFQpOiBUfHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBkZmx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0Lm9uU3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgb25TdWNjZXNzPFROPihfOiBTdWNjZXNzQ29udGludWF0aW9uPFQsIFROPik6IFJlc3VsdDxUTj4ge1xuICAgICAgICByZXR1cm4gbmV3IEZhaWx1cmUodGhpcy5tZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vbkZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIG9uRmFpbHVyZShjYjogRmFpbHVyZUNvbnRpbnVhdGlvbjxUPik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LndpdGhGYWlsdXJlRGV0YWlsfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmFpbHVyZURldGFpbDxURD4oZGV0YWlsOiBURCk6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbCh0aGlzLm1lc3NhZ2UsIGRldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQud2l0aERldGFpbH1cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgX3N1Y2Nlc3NEZXRhaWw/OiBURCk6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbCh0aGlzLm1lc3NhZ2UsIGRldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgJ2ZyaWVuZGx5JyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIEZhaWx1cmV9IHZhbHVlIGlzIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB7QGxpbmsgU3VjY2VzcyB8IFN1Y2Nlc3M8VD59IHdpdGggdGhlIHN1cHBsaWVkIHJlc3VsdCB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzdWNjZXNzZnVsIHJlc3VsdCB2YWx1ZSB0byBiZSByZXR1cm5lZFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VlZDxUPih2YWx1ZTogVCk6IFN1Y2Nlc3M8VD4ge1xuICAgIHJldHVybiBuZXcgU3VjY2VzczxUPih2YWx1ZSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB7QGxpbmsgRmFpbHVyZSB8IEZhaWx1cmU8VD59IHdpdGggdGhlIHN1cHBsaWVkIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWlsPFQ+KG1lc3NhZ2U6IHN0cmluZyk6IEZhaWx1cmU8VD4ge1xuICAgIHJldHVybiBuZXcgRmFpbHVyZTxUPihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdH0gZW5jb3VudGVycyBzdWNjZXNzLlxuICogQHJlbWFya3NcbiAqIEEgc3VjY2VzcyBjYWxsYmFjayBjYW4gcmV0dXJuIGEgZGlmZmVyZW50IHJlc3VsdCB0eXBlIHRoYW4gaXQgcmVjZWl2ZXMsIGFsbG93aW5nXG4gKiBzdWNjZXNzIHJlc3VsdHMgdG8gY2hhaW4gdGhyb3VnaCBpbnRlcm1lZGlhdGUgcmVzdWx0IHR5cGVzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb248VCwgVEQsIFROPiA9ICh2YWx1ZTogVCwgZGV0YWlsPzogVEQpID0+IERldGFpbGVkUmVzdWx0PFROLCBURD47XG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9IGVuY291bnRlcnMgYSBmYWlsdXJlLlxuICogQHJlbWFya3NcbiAqIEEgZmFpbHVyZSBjYWxsYmFjayBjYW4gY2hhbmdlIHtAbGluayBGYWlsdXJlfSB0byB7QGxpbmsgU3VjY2Vzc30gKGUuZy4gYnkgcmV0dXJuaW5nIGEgZGVmYXVsdCB2YWx1ZSlcbiAqIG9yIGl0IGNhbiBjaGFuZ2Ugb3IgZW1iZWxsaXNoIHRoZSBlcnJvciBtZXNzYWdlLCBidXQgaXQgY2Fubm90IGNoYW5nZSB0aGUgc3VjY2VzcyByZXR1cm4gdHlwZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uPFQsIFREPiA9IChtZXNzYWdlOiBzdHJpbmcsIGRldGFpbDogVEQpID0+IERldGFpbGVkUmVzdWx0PFQsIFREPjtcblxuLyoqXG4gKiBBIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9IGV4dGVuZHMge0BsaW5rIFN1Y2Nlc3N9IHRvIHJlcG9ydCBvcHRpb25hbCBzdWNjZXNzIGRldGFpbHMgaW5cbiAqIGFkZGl0aW9uIHRvIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRGV0YWlsZWRTdWNjZXNzPFQsIFREPiBleHRlbmRzIFN1Y2Nlc3M8VD4ge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGV0YWlsPzogVEQ7XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBEZXRhaWxlZFN1Y2Nlc3MgfCBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+fSB3aXRoIHRoZSBzdXBwbGllZFxuICAgICAqIHZhbHVlIGFuZCBkZXRhaWwuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgLSBBbiBvcHRpb25hbCBzdWNjZXNzZnVsIGRldGFpbCB0byBiZSByZXR1cm5lZC4gIElmIG9taXR0ZWQsIGRldGFpbFxuICAgICAqIHdpbGwgYmUgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHZhbHVlOiBULCBkZXRhaWw/OiBURCkge1xuICAgICAgICBzdXBlcih2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2RldGFpbCA9IGRldGFpbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3VjY2VzcyBkZXRhaWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0BsaW5rIERldGFpbGVkU3VjY2Vzc30sIG9yIGB1bmRlZmluZWRgIGlmXG4gICAgICogbm8gZGV0YWlsIHdhcyBzdXBwbGllZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRldGFpbCgpOiBURHx1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGV0YWlsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgdGhhdCB0aGlzIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9IGlzIGEgc3VjY2Vzcy5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsd2F5cyB0cnVlIGZvciB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBidXQgY2FuIGJlIHVzZWQgYXMgdHlwZSBndWFyZFxuICAgICAqIHRvIGRpc2NyaW1pbmF0ZSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBmcm9tIHtAbGluayBEZXRhaWxlZEZhaWx1cmV9IGluXG4gICAgICogYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9LlxuICAgICAqIEByZXR1cm5zIGB0cnVlYFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1N1Y2Nlc3MoKTogdGhpcyBpcyBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgc3VwcGxpZWQge0BsaW5rIERldGFpbGVkU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY2FsbGJhY2t9IGFuZCBwcm9wYWdhdGVzXG4gICAgICogaXRzIHJldHVybmVkIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFROLCBURD59LlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIHN1Y2Nlc3MgY2FsbGJhY2sgbXV0YXRlcyB0aGUgcmV0dXJuIHR5cGUgZnJvbSBgPFQ+YCB0byBgPFROPmAuXG4gICAgICogQHBhcmFtIGNiIC0gVGhlIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNhbGxiYWNrfSB0byBiZSBpbnZva2VkLlxuICAgICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHJldHVybmVkIGJ5IHRoZSBzdWNjZXNzIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KGNiOiBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb248VCwgVEQsIFROPik6IERldGFpbGVkUmVzdWx0PFROLCBURD4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52YWx1ZSwgdGhpcy5fZGV0YWlsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9wYWdhdGVzIHRoaXMge0BsaW5rIERldGFpbGVkU3VjY2Vzc30uXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBGYWlsdXJlIGRvZXMgbm90IG11dGF0ZSByZXR1cm4gdHlwZSBzbyB3ZSBjYW4gcmV0dXJuIHRoaXMgZXZlbnQgZGlyZWN0bHkuXG4gICAgICogQHBhcmFtIF9jYiAtIHtAbGluayBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb24gfCBGYWlsdXJlIGNhbGxiYWNrfSB0byBiZSBjYWxsZWRcbiAgICAgKiBvbiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdH0gaW4gY2FzZSBvZiBmYWlsdXJlIChpZ25vcmVkKS5cbiAgICAgKiBAcmV0dXJucyBgdGhpc2BcbiAgICAgKi9cbiAgICBwdWJsaWMgb25GYWlsdXJlKF9jYjogRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uPFQsIFREPik6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHtAbGluayBEZXRhaWxlZEZhaWx1cmV9IGV4dGVuZHMge0BsaW5rIEZhaWx1cmV9IHRvIHJlcG9ydCBvcHRpb25hbCBmYWlsdXJlIGRldGFpbHMgaW5cbiAqIGFkZGl0aW9uIHRvIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRGV0YWlsZWRGYWlsdXJlPFQsIFREPiBleHRlbmRzIEZhaWx1cmU8VD4ge1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGV0YWlsOiBURDtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIERldGFpbGVkRmFpbHVyZSB8IERldGFpbGVkRmFpbHVyZTxULCBURD59IHdpdGggdGhlIHN1cHBsaWVkXG4gICAgICogbWVzc2FnZSBhbmQgZGV0YWlsLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQuXG4gICAgICogQHBhcmFtIGRldGFpbCAtIFRoZSBlcnJvciBkZXRhaWwgdG8gYmUgcmV0dXJuZWQuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgZGV0YWlsOiBURCkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5fZGV0YWlsID0gZGV0YWlsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBkZXRhaWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMge0BsaW5rIERldGFpbGVkRmFpbHVyZX0uXG4gICAgICovXG4gICAgcHVibGljIGdldCBkZXRhaWwoKTogVEQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGV0YWlsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgdGhhdCB0aGlzIHtAbGluayBEZXRhaWxlZEZhaWx1cmV9IGlzIGEgZmFpbHVyZS5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsd2F5cyB0cnVlIGZvciB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfSBidXQgY2FuIGJlIHVzZWQgYXMgdHlwZSBndWFyZFxuICAgICAqIHRvIGRpc2NyaW1pbmF0ZSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSBmcm9tIHtAbGluayBEZXRhaWxlZEZhaWx1cmV9IGluXG4gICAgICogYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9LlxuICAgICAqIEByZXR1cm5zIGB0cnVlYFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0ZhaWx1cmUoKTogdGhpcyBpcyBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvcGFnYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgZGV0YWlsIGZyb20gdGhpcyByZXN1bHQuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBNdXRhdGVzIHRoZSBzdWNjZXNzIHR5cGUgYXMgdGhlIHN1Y2Nlc3MgY2FsbGJhY2sgd291bGQgaGF2ZSwgYnV0IGRvZXMgbm90XG4gICAgICogY2FsbCB0aGUgc3VjY2VzcyBjYWxsYmFjay5cbiAgICAgKiBAcGFyYW0gX2NiIC0ge0BsaW5rIERldGFpbGVkU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IFN1Y2Nlc3MgY2FsbGJhY2t9IHRvIGJlIGNhbGxlZFxuICAgICAqIG9uIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fSBpbiBjYXNlIG9mIHN1Y2Nlc3MgKGlnbm9yZWQpLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBEZXRhaWxlZEZhaWx1cmUgfCBEZXRhaWxlZEZhaWx1cmU8VE4sIFREPn0gd2hpY2ggY29udGFpbnNcbiAgICAgKiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgZGV0YWlsIGZyb20gdGhpcyBvbmUuXG4gICAgICovXG4gICAgcHVibGljIG9uU3VjY2VzczxUTj4oX2NiOiBEZXRhaWxlZFN1Y2Nlc3NDb250aW51YXRpb248VCwgVEQsIFROPik6IERldGFpbGVkUmVzdWx0PFROLCBURD4ge1xuICAgICAgICByZXR1cm4gbmV3IERldGFpbGVkRmFpbHVyZTxUTiwgVEQ+KHRoaXMubWVzc2FnZSwgdGhpcy5fZGV0YWlsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBzdXBwbGllZCB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uIHwgZmFpbHVyZSBjYWxsYmFja30gYW5kIHByb3BhZ2F0ZXNcbiAgICAgKiBpdHMgcmV0dXJuZWQge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fS5cbiAgICAgKiBAcGFyYW0gY2IgLSBUaGUge0BsaW5rIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWx1cmUgY2FsbGJhY2t9IHRvIGJlIGludm9rZWQuXG4gICAgICogQHJldHVybnMgVGhlIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0gcmV0dXJuZWQgYnkgdGhlIGZhaWx1cmUgY2FsbGJhY2suXG4gICAgICovXG4gICAgcHVibGljIG9uRmFpbHVyZShjYjogRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uPFQsIFREPik6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLm1lc3NhZ2UsIHRoaXMuX2RldGFpbCk7XG4gICAgfVxufVxuXG4vKipcbiAqIFR5cGUgaW5mZXJlbmNlIHRvIGRldGVybWluZSB0aGUgcmVzdWx0IHR5cGUgYFRgIG9mIGEge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fS5cbiAqIEBiZXRhXG4gKi9cbmV4cG9ydCB0eXBlIERldGFpbGVkUmVzdWx0PFQsIFREPiA9IERldGFpbGVkU3VjY2VzczxULCBURD58RGV0YWlsZWRGYWlsdXJlPFQsIFREPjtcblxuLyoqXG4gKiBUeXBlIGluZmVyZW5jZSB0byBkZXRlcm1pbmUgdGhlIGRldGFpbCB0eXBlIGBURGAgb2YgYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59LlxuICogQGJldGFcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0RGV0YWlsVHlwZTxUPiA9IFQgZXh0ZW5kcyBEZXRhaWxlZFJlc3VsdDx1bmtub3duLCBpbmZlciBURD4gPyBURCA6IG5ldmVyO1xuXG4vKipcbiAqIFJldHVybnMge0BsaW5rIERldGFpbGVkU3VjY2VzcyB8IERldGFpbGVkU3VjY2VzczxULCBURD59IHdpdGggYSBzdXBwbGllZCB2YWx1ZSBhbmQgb3B0aW9uYWxcbiAqIGRldGFpbC5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSBvZiB0eXBlIGA8VD5gIHRvIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGRldGFpbCAtIEFuIG9wdGlvbmFsIGRldGFpbCBvZiB0eXBlIGA8VEQ+YCB0byBiZSByZXR1cm5lZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERldGFpbGVkU3VjY2VzcyB8IERldGFpbGVkU3VjY2VzczxULCBURD59IHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlXG4gKiBhbmQgZGV0YWlsLCBpZiBzdXBwbGllZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Y2NlZWRXaXRoRGV0YWlsPFQsIFREPih2YWx1ZTogVCwgZGV0YWlsPzogVEQpOiBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+IHtcbiAgICByZXR1cm4gbmV3IERldGFpbGVkU3VjY2VzczxULCBURD4odmFsdWUsIGRldGFpbCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlIHwgRGV0YWlsZWRGYWlsdXJlPFQsIFREPn0gd2l0aCBhIHN1cHBsaWVkIGVycm9yIG1lc3NhZ2UgYW5kIGRldGFpbC5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gZGV0YWlsIC0gVGhlIGV2ZW50IGRldGFpbCB0byBiZSByZXR1cm5lZC5cbiAqIEByZXR1cm5zIEFuIHtAbGluayBEZXRhaWxlZEZhaWx1cmUgfCBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+fSB3aXRoIHRoZSBzdXBwbGllZCBlcnJvclxuICogbWVzc2FnZSBhbmQgZGV0YWlsLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbFdpdGhEZXRhaWw8VCwgVEQ+KG1lc3NhZ2U6IHN0cmluZywgZGV0YWlsOiBURCk6IERldGFpbGVkRmFpbHVyZTxULCBURD4ge1xuICAgIHJldHVybiBuZXcgRGV0YWlsZWRGYWlsdXJlPFQsIFREPihtZXNzYWdlLCBkZXRhaWwpO1xufVxuXG4vKipcbiAqIFByb3BhZ2F0ZXMgYSB7QGxpbmsgU3VjY2Vzc30gb3Ige0BsaW5rIEZhaWx1cmV9IHtAbGluayBSZXN1bHR9LCBhZGRpbmcgc3VwcGxpZWRcbiAqIGV2ZW50IGRldGFpbHMgYXMgYXBwcm9wcmlhdGUuXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHtAbGluayBSZXN1bHR9IHRvIGJlIHByb3BhZ2F0ZWQuXG4gKiBAcGFyYW0gZGV0YWlsIC0gVGhlIGV2ZW50IGRldGFpbCAodHlwZSBgPFREPmApIHRvIGJlIGFkZGVkIHRvIHRoZSB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0fS5cbiAqIEBwYXJhbSBzdWNjZXNzRGV0YWlsIC0gQW4gb3B0aW9uYWwgZGlzdGluY3QgZXZlbnQgZGV0YWlsIHRvIGJlIGFkZGVkIHRvIHtAbGluayBTdWNjZXNzfSByZXN1bHRzLiAgSWYgYHN1Y2Nlc3NEZXRhaWxgXG4gKiBpcyBvbWl0dGVkIG9yIGB1bmRlZmluZWRgLCB0aGVuIGBkZXRhaWxgIHdpbGwgYmUgYXBwbGllZCB0byB7QGxpbmsgU3VjY2Vzc30gcmVzdWx0cy5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0gd2l0aCB0aGUgc3VjY2VzcyB2YWx1ZSBvciBlcnJvclxuICogbWVzc2FnZSBmcm9tIHRoZSBvcmlnaW5hbCBgcmVzdWx0YCBidXQgd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBhZGRlZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BhZ2F0ZVdpdGhEZXRhaWw8VCwgVEQ+KHJlc3VsdDogUmVzdWx0PFQ+LCBkZXRhaWw6IFRELCBzdWNjZXNzRGV0YWlsPzogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgIHJldHVybiByZXN1bHQuaXNTdWNjZXNzKClcbiAgICAgICAgPyBzdWNjZWVkV2l0aERldGFpbChyZXN1bHQudmFsdWUsIHN1Y2Nlc3NEZXRhaWwgPz8gZGV0YWlsKVxuICAgICAgICA6IGZhaWxXaXRoRGV0YWlsKHJlc3VsdC5tZXNzYWdlLCBkZXRhaWwpO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgZnVuY3Rpb24gd2hpY2ggbWlnaHQgdGhyb3cgdG8gY29udmVydCBleGNlcHRpb24gcmVzdWx0c1xuICogdG8ge0BsaW5rIEZhaWx1cmV9LlxuICogQHBhcmFtIGZ1bmMgLSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FwdHVyZWQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGEgdmFsdWUgb2YgdHlwZSBgPFQ+YCBvblxuICogc3VjY2VzcyAsIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIHRoZSB0aHJvd24gZXJyb3IgbWVzc2FnZSBpZlxuICogYGZ1bmNgIHRocm93cyBhbiBgRXJyb3JgLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZVJlc3VsdDxUPihmdW5jOiAoKSA9PiBUKTogUmVzdWx0PFQ+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmdW5jKCkpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBmYWlsKChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBZ2dyZWdhdGVzIHN1Y2Nlc3NmdWwgcmVzdWx0IHZhbHVlcyBmcm9tIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fS5cbiAqIEBwYXJhbSByZXN1bHRzIC0gVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gdG8gYmUgbWFwcGVkLlxuICogQHJldHVybnMgIElmIGFsbCB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gYXJlIHN1Y2Nlc3NmdWwsIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYW5cbiAqIGFycmF5IGNvbnRhaW5pbmcgYWxsIHJldHVybmVkIHZhbHVlcy4gIElmIGFueSB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gZmFpbGVkLCByZXR1cm5zXG4gKiB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIGNvbmNhdGVuYXRlZCBzdW1tYXJ5IG9mIGFsbCBlcnJvciBtZXNzYWdlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFJlc3VsdHM8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IFJlc3VsdDxUW10+IHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZWxlbWVudHM6IFRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICBlbGVtZW50cy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoZWxlbWVudHMpO1xufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgc3VjY2Vzc2Z1bCByZXN1bHRzIGZyb20gYSBjb2xsZWN0aW9uIG9mIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0sXG4gKiBvcHRpb25hbGx5IGlnbm9yaW5nIGNlcnRhaW4gZXJyb3IgZGV0YWlscy5cbiAqIEBwYXJhbSByZXN1bHRzIC0gVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSB0byBiZSBtYXBwZWQuXG4gKiBAcGFyYW0gaWdub3JlIC0gQW4gYXJyYXkgb2YgZXJyb3IgZGV0YWlsIHZhbHVlcyAob2YgdHlwZSBgPFREPmApIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhbiBhcnJheSBjb250YWluaW5nIGFsbCBzdWNjZXNzZnVsIHJlc3VsdHMgaWYgYWxsIHJlc3VsdHMgZWl0aGVyXG4gKiBzdWNjZWVkZWQgb3IgcmV0dXJuZWQgZXJyb3IgZGV0YWlscyBsaXN0ZWQgaW4gYGlnbm9yZWAuICBJZiBhbnkgcmVzdWx0cyBmYWlsZWQgd2l0aCBkZXRhaWxzXG4gKiB0aGF0IGNhbm5vdCBiZSBpZ25vcmVkLCByZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGNvbmNhdGVuYXRlZCBzdW1tYXJ5IG9mIGFsbCBub24taWdub3JhYmxlXG4gKiBlcnJvciBtZXNzYWdlcy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcERldGFpbGVkUmVzdWx0czxULCBURD4ocmVzdWx0czogSXRlcmFibGU8RGV0YWlsZWRSZXN1bHQ8VCwgVEQ+PiwgaWdub3JlOiBURFtdKTogUmVzdWx0PFRbXT4ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbGVtZW50czogVFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaWdub3JlLmluY2x1ZGVzKHJlc3VsdC5kZXRhaWwpKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoZWxlbWVudHMpO1xufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgc3VjY2Vzc2Z1bCByZXN1bHRzIGZyb20gYSBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0uXG4gKiBAcGFyYW0gcmVzdWx0cyAtIEFuIGBJdGVyYWJsZWAgb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gZnJvbSB3aGljaCBzdWNjZXNzXG4gKiByZXN1bHRzIGFyZSB0byBiZSBhZ2dyZWdhdGVkLlxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYW4gYXJyYXkgb2YgYDxUPmAgaWYgYW55IHJlc3VsdHMgd2VyZSBzdWNjZXNzZnVsLiBJZlxuICogYWxsIHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBmYWlsZWQsIHJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBjb25jYXRlbmF0ZWRcbiAqIHN1bW1hcnkgb2YgYWxsIGVycm9yIG1lc3NhZ2VzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwU3VjY2VzczxUPihyZXN1bHRzOiBJdGVyYWJsZTxSZXN1bHQ8VD4+KTogUmVzdWx0PFRbXT4ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbGVtZW50czogVFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZWxlbWVudHMubGVuZ3RoID09PSAwKSAmJiAoZXJyb3JzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIHJldHVybiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGVsZW1lbnRzKTtcbn1cblxuLyoqXG4gKiBBZ2dyZWdhdGVzIGVycm9yIG1lc3NhZ2VzIGZyb20gYSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59LlxuICogQHBhcmFtIHJlc3VsdHMgLSBBbiBpdGVyYWJsZSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59IGZvciB3aGljaFxuICogZXJyb3IgbWVzc2FnZXMgYXJlIGFnZ3JlZ2F0ZWQuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzIGNvbnNpc3Rpbmcgb2YgYWxsIGVycm9yIG1lc3NhZ2VzIHJldHVybmVkIGJ5XG4gKiB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gaW4gdGhlIHNvdXJjZSBjb2xsZWN0aW9uLiBJZ25vcmVzIHtAbGluayBTdWNjZXNzfVxuICogcmVzdWx0cyBhbmQgcmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSB3ZXJlIG5vIGVycm9ycy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEZhaWx1cmVzPFQ+KHJlc3VsdHM6IEl0ZXJhYmxlPFJlc3VsdDxUPj4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhbiBpdGVyYWJsZSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59IHdlcmUgYWxsIHN1Y2Nlc3NmdWwuXG4gKiBAcGFyYW0gcmVzdWx0cyAtIFRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59IHRvIGJlIHRlc3RlZC5cbiAqIEByZXR1cm5zIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYHRydWVgIGlmIGFsbCB7QGxpbmsgUmVzdWx0IHwgcmVzdWx0c30gYXJlIHN1Y2Nlc3NmdWwuXG4gKiBJZiBhbnkgYXJlIHVuc3VjY2Vzc2Z1bCwgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIGNvbmNhdGVuYXRlZCBzdW1tYXJ5IHRoZSBlcnJvclxuICogbWVzc2FnZXMgZnJvbSBhbGwgZmFpbGVkIGVsZW1lbnRzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsU3VjY2VlZDxUPihyZXN1bHRzOiBJdGVyYWJsZTxSZXN1bHQ8dW5rbm93bj4+LCBzdWNjZXNzVmFsdWU6IFQpOiBSZXN1bHQ8VD4ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlXG4gICAgaWYgKHJlc3VsdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKHN1Y2Nlc3NWYWx1ZSk7XG59XG5cbi8qKlxuICogU3RyaW5nLWtleWVkIHJlY29yZCBvZiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHtAbGluayBwb3B1bGF0ZU9iamVjdC4oOndpdGhPcHRpb25zKX0uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkSW5pdGlhbGl6ZXJzPFQ+ID0geyBbIGtleSBpbiBrZXlvZiBUIF06IChzdGF0ZTogUGFydGlhbDxUPikgPT4gUmVzdWx0PFRba2V5XT4gfTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUge0BsaW5rIHBvcHVsYXRlT2JqZWN0Lig6d2l0aE9wdGlvbnMpfSBmdW5jdGlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3B1bGF0ZU9iamVjdE9wdGlvbnM8VD4ge1xuICAgIC8qKlxuICAgICAqIElmIHByZXNlbnQsIHNwZWNpZmllcyB0aGUgb3JkZXIgaW4gd2hpY2ggcHJvcGVydHkgdmFsdWVzIHNob3VsZFxuICAgICAqIGJlIGV2YWx1YXRlZC4gIEFueSBrZXlzIG5vdCBsaXN0ZWQgYXJlIGV2YWx1YXRlZCBhZnRlciBhbGwgbGlzdGVkXG4gICAgICoga2V5cyBpbiBpbmRldGVybWluYXRlIG9yZGVyLiAgSWYgJ29yZGVyJyBpcyBub3QgcHJlc2VudCwga2V5c1xuICAgICAqIGFyZSBldmFsdWF0ZWQgaW4gaW5kZXRlcm1pbmF0ZSBvcmRlci5cbiAgICAgKi9cbiAgICBvcmRlcj86IChrZXlvZiBUKVtdO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBoYW5kbGluZyBvZiBgdW5kZWZpbmVkYCB2YWx1ZXMuICBCeSBkZWZhdWx0LCBzdWNjZXNzZnVsXG4gICAgICogYHVuZGVmaW5lZGAgcmVzdWx0cyBhcmUgd3JpdHRlbiB0byB0aGUgcmVzdWx0IG9iamVjdC4gIElmIHRoaXMgdmFsdWVcbiAgICAgKiBpcyBgdHJ1ZWAgdGhlbiBgdW5kZWZpbmVkYCByZXN1bHRzIGFyZSBzdXBwcmVzc2VkIGZvciBhbGwgcHJvcGVydGllcy5cbiAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIGFuIGFycmF5IG9mIHByb3BlcnR5IGtleXMgdGhlbiBgdW5kZWZpbmVkYCByZXN1bHRzXG4gICAgICogYXJlIHN1cHByZXNzZWQgZm9yIHRob3NlIHByb3BlcnRpZXMgb25seS5cbiAgICAgKi9cbiAgICBzdXBwcmVzc1VuZGVmaW5lZD86IGJvb2xlYW4gfCAoa2V5b2YgVClbXTtcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZXMgYW4gYW4gb2JqZWN0IGJhc2VkIG9uIGEgcHJvdG90eXBlIGZ1bGwgb2YgZmllbGQgaW5pdGlhbGl6ZXJzIHRoYXQgcmV0dXJuIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VFtrZXldPn0uXG4gKiBSZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSBwb3B1bGF0ZWQgb2JqZWN0IGlmIGFsbCBpbml0aWFsaXplcnMgc3VjY2VlZCwgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYVxuICogY29uY2F0ZW5hdGVkIGxpc3Qgb2YgYWxsIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIGluaXRpYWxpemVycyAtIEFuIG9iamVjdCB3aXRoIHRoZSBzaGFwZSBvZiB0aGUgdGFyZ2V0IGJ1dCB3aXRoIGluaXRpYWxpemVyIGZ1bmN0aW9ucyBmb3JcbiAqIGVhY2ggcHJvcGVydHkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9wdGlvbmFsIHtAbGluayBQb3B1bGF0ZU9iamVjdE9wdGlvbnMgfCBzZXQgb2Ygb3B0aW9uc30gd2hpY2hcbiAqIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBjYWxsLlxuICogQHB1YmxpY1xuICoge0BsYWJlbCB3aXRoT3B0aW9uc31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvcHVsYXRlT2JqZWN0PFQ+KGluaXRpYWxpemVyczogRmllbGRJbml0aWFsaXplcnM8VD4sIG9wdGlvbnM/OiBQb3B1bGF0ZU9iamVjdE9wdGlvbnM8VD4pOiBSZXN1bHQ8VD47XG5cbi8qKlxuICogUG9wdWxhdGVzIGFuIGFuIG9iamVjdCBiYXNlZCBvbiBhIHByb3RvdHlwZSBmdWxsIG9mIGZpZWxkIGluaXRpYWxpemVycyB0aGF0IHJldHVybiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFRba2V5XT59LlxuICogUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgcG9wdWxhdGVkIG9iamVjdCBpZiBhbGwgaW5pdGlhbGl6ZXJzIHN1Y2NlZWQsIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFcbiAqIGNvbmNhdGVuYXRlZCBsaXN0IG9mIGFsbCBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSBpbml0aWFsaXplcnMgLSBBbiBvYmplY3Qgd2l0aCB0aGUgc2hhcGUgb2YgdGhlIHRhcmdldCBidXQgd2l0aCBpbml0aWFsaXplciBmdW5jdGlvbnMgZm9yXG4gKiBlYWNoIHByb3BlcnR5LlxuICogQHBhcmFtIG9yZGVyIC0gT3B0aW9uYWwgb3JkZXIgaW4gd2hpY2gga2V5cyBzaG91bGQgYmUgd3JpdHRlbi5cbiAqIEBwdWJsaWNcbiAqIHtAbGFiZWwgd2l0aE9yZGVyfVxuICogQGRlcHJlY2F0ZWQgUGFzcyB7QGxpbmsgUG9wdWxhdGVPYmplY3RPcHRpb25zfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9wdWxhdGVPYmplY3Q8VD4oaW5pdGlhbGl6ZXJzOiBGaWVsZEluaXRpYWxpemVyczxUPiwgb3JkZXI6IChrZXlvZiBUKVtdKTogUmVzdWx0PFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHBvcHVsYXRlT2JqZWN0PFQ+KGluaXRpYWxpemVyczogRmllbGRJbml0aWFsaXplcnM8VD4sIG9wdGlvbnNPck9yZGVyPzogUG9wdWxhdGVPYmplY3RPcHRpb25zPFQ+IHwgKGtleW9mIFQpW10pOiBSZXN1bHQ8VD4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IFBvcHVsYXRlT2JqZWN0T3B0aW9uczxUPiA9IG9wdGlvbnNPck9yZGVyXG4gICAgICAgID8gQXJyYXkuaXNBcnJheShvcHRpb25zT3JPcmRlcikgPyB7IG9yZGVyOiBvcHRpb25zT3JPcmRlciB9IDogb3B0aW9uc09yT3JkZXJcbiAgICAgICAgOiB7fTtcbiAgICBjb25zdCBzdGF0ZSA9IHt9IGFzIHsgW2tleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGtleXM6IChrZXlvZiBUKVtdID0gQXJyYXkuZnJvbShvcHRpb25zLm9yZGVyID8/IFtdKTtcbiAgICBjb25zdCBmb3VuZEtleXMgPSBuZXcgU2V0PGtleW9mIFQ+KG9wdGlvbnMub3JkZXIpO1xuXG4gICAgLy8gc3RhcnQgd2l0aCB0aGUgc3VwcGxpZWQgb3JkZXIgdGhlbiBhcHBlbmQgYW55dGhpbmcgZWxzZSB3ZSBmaW5kXG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5pdGlhbGl6ZXJzKSB7XG4gICAgICAgIGlmICghZm91bmRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIGZvdW5kS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKGluaXRpYWxpemVyc1trZXldKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpbml0aWFsaXplcnNba2V5XShzdGF0ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgob3B0aW9ucy5zdXBwcmVzc1VuZGVmaW5lZCA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucy5zdXBwcmVzc1VuZGVmaW5lZCkgJiYgb3B0aW9ucy5zdXBwcmVzc1VuZGVmaW5lZC5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZVtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goYHBvcHVsYXRlT2JqZWN0OiBLZXkgJHtTdHJpbmcoa2V5KX0gaXMgcHJlc2VudCBidXQgaGFzIG5vIGluaXRpYWxpemVyYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoc3RhdGUgYXMgVCk7XG59XG4iXX0=
|
|
569
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3VsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFvS0g7Ozs7R0FJRztBQUNILE1BQWEsT0FBTztJQVVoQjs7O09BR0c7SUFDSCxZQUFZLEtBQVE7UUFicEI7O1dBRUc7UUFDYSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBVzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ1osT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNaLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU8sQ0FBQyxPQUF1QjtRQUNsQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLElBQVE7O1FBQ3JCLE9BQU8sTUFBQSxJQUFJLENBQUMsTUFBTSxtQ0FBSSxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLE9BQXVCO1FBQzFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBQyxJQUFROztRQUM3QixPQUFPLE1BQUEsSUFBSSxDQUFDLE1BQU0sbUNBQUksSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBSyxFQUE4QjtRQUMvQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLENBQXlCO1FB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S0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDcEIsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNwQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO29CQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixLQUFLLElBQUksQ0FBQzsyQkFDakMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUN4RixTQUFTO3FCQUNaO2lCQUNKO2dCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQzdCO2lCQUNJO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQy9CO1NBQ0o7YUFDSTtZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RjtLQUNKO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDbEM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFVLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBMUNELHdDQTBDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0gb2Ygc29tZSBvcGVyYXRpb24gb3Igc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucy5cbiAqIEByZW1hcmtzXG4gKiB7QGxpbmsgU3VjY2VzcyB8IFN1Y2Nlc3M8VD59IGFuZCB7QGxpbmsgRmFpbHVyZSB8IEZhaWx1cmU8VD59IHNoYXJlIHRoZSBjb21tb25cbiAqIGNvbnRyYWN0IHtAbGluayBJUmVzdWx0fSwgZW5hYmxpbmcgY29tbWluZ2xlZCBkaXNjcmltaW5hdGVkIHVzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VD4gPSBTdWNjZXNzPFQ+IHwgRmFpbHVyZTxUPjtcbi8qKlxuICogQ29udGludWF0aW9uIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiB0aGUgZXZlbnQgdGhhdCBhblxuICoge0BsaW5rIFJlc3VsdH0gaXMgc3VjY2Vzc2Z1bC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4gPSAodmFsdWU6IFQpID0+IFJlc3VsdDxUTj47XG4vKipcbiAqIENvbnRpbnVhdGlvbiBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IHRoYXQgYW5cbiAqIHtAbGluayBSZXN1bHR9IGZhaWxzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBGYWlsdXJlQ29udGludWF0aW9uPFQ+ID0gKG1lc3NhZ2U6IHN0cmluZykgPT4gUmVzdWx0PFQ+O1xuLyoqXG4gKiBUeXBlIGluZmVyZW5jZSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdCB0eXBlIG9mIGFuIHtAbGluayBSZXN1bHR9LlxuICogQGJldGFcbiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0VmFsdWVUeXBlPFQ+ID0gVCBleHRlbmRzIFJlc3VsdDxpbmZlciBUVj4gPyBUViA6IG5ldmVyO1xuXG4vKipcbiAqIFNpbXBsZSBsb2dnZXIgaW50ZXJmYWNlIHVzZWQgYnkge0BsaW5rIElSZXN1bHQub3JUaHJvd30uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJlc3VsdExvZ2dlciB7XG4gICAgLyoqXG4gICAgICogTG9nIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgZXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2Ygc29tZSBvcGVyYXRpb24gb2Ygc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucy5cbiAqIEByZW1hcmtzXG4gKiBUaGlzIGNvbW1vbiBjb250cmFjdCBlbmFibGVzIGNvbW1pbmdsZWQgZGlzY3JpbWluYXRlZCB1c2FnZSBvZiB7QGxpbmsgU3VjY2VzcyB8IFN1Y2Nlc3M8VD59XG4gKiBhbmQge0BsaW5rIEZhaWx1cmUgfCBGYWlsdXJlPFQ+fS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVzdWx0PFQ+IHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHN1Y2Nlc3M6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIEZ1bmN0aW9uc1xuICAgICAqIGFzIGEgdHlwZSBndWFyZCBmb3Ige0BsaW5rIFN1Y2Nlc3MgfCBTdWNjZXNzPFQ+fS5cbiAgICAgKi9cbiAgICBpc1N1Y2Nlc3MoKTogdGhpcyBpcyBTdWNjZXNzPFQ+O1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gZmFpbGVkLiAgRnVuY3Rpb25zXG4gICAgICogYXMgYSB0eXBlIGd1YXJkIGZvciB7QGxpbmsgRmFpbHVyZSB8IEZhaWx1cmU8VD59LlxuICAgICAqL1xuICAgIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBzdWNjZXNzZnVsIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSxcbiAgICAgKiBvciB0aHJvd3MgdGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBgZ2V0VmFsdWVPclRocm93YCBpcyBiZWluZyBzdXBlcnNlZGVkIGJ5IGBvclRocm93YCBhbmRcbiAgICAgKiB3aWxsIGV2ZW50dWFsbHkgYmUgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2Ugb3JEZWZhdWx0IGluc3RlYWQuXG4gICAgICpcbiAgICAqIEBwYXJhbSBsb2dnZXIgLSBBbiBvcHRpb25hbCB7QGxpbmsgSVJlc3VsdExvZ2dlciB8IGxvZ2dlcn0gdG8gd2hpY2ggdGhlXG4gICAgICogZXJyb3Igd2lsbCBhbHNvIGJlIHJlcG9ydGVkLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUsIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gICAgICogQHRocm93cyBUaGUgZXJyb3IgbWVzc2FnZSBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKi9cbiAgICBnZXRWYWx1ZU9yVGhyb3cobG9nZ2VyPzogSVJlc3VsdExvZ2dlcik6IFQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBzdWNjZXNzZnVsIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSxcbiAgICAgKiBvciBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcGFyYW0gZGZsdCAtIFRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZCAoZGVmYXVsdCBpc1xuICAgICAqIGB1bmRlZmluZWRgKS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBgZ2V0VmFsdWVPckRlZmF1bHRgIGlzIGJlaW5nIHN1cGVyc2VkZWQgYnkgYG9yRGVmYXVsdGAgYW5kXG4gICAgICogd2lsbCBldmVudHVhbGx5IGJlIGRlcHJlY2F0ZWQuICBQbGVhc2UgdXNlIG9yRGVmYXVsdCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIHJldHVybiB2YWx1ZSwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIFJldHVybnNcbiAgICAgKiB0aGUgc3VwcGxpZWQgZGVmYXVsdCB2YWx1ZSBvciBgdW5kZWZpbmVkYCBpZiBubyBkZWZhdWx0IGlzIHN1cHBsaWVkLlxuICAgICAqL1xuICAgIGdldFZhbHVlT3JEZWZhdWx0KGRmbHQ/OiBUKTogVHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBzdWNjZXNzZnVsIHtAbGluayBJUmVzdWx0IHwgcmVzdWx0fSxcbiAgICAgKiBvciB0aHJvd3MgdGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcGFyYW0gbG9nZ2VyIC0gQW4gb3B0aW9uYWwge0BsaW5rIElSZXN1bHRMb2dnZXIgfCBsb2dnZXJ9IHRvIHdoaWNoIHRoZVxuICAgICAqIGVycm9yIHdpbGwgYWxzbyBiZSByZXBvcnRlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlLCBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAqIEB0aHJvd3MgVGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICovXG4gICAgb3JUaHJvdyhsb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogVDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHN1Y2Nlc3NmdWwge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9LFxuICAgICAqIG9yIGEgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gZmFpbGVkLlxuICAgICAqIEBwYXJhbSBkZmx0IC0gVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkIChkZWZhdWx0IGlzXG4gICAgICogYHVuZGVmaW5lZGApLlxuICAgICAqIEByZXR1cm5zIFRoZSByZXR1cm4gdmFsdWUsIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuICBSZXR1cm5zXG4gICAgICogdGhlIHN1cHBsaWVkIGRlZmF1bHQgdmFsdWUgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZGVmYXVsdCBpcyBzdXBwbGllZC5cbiAgICAgKi9cbiAgICBvckRlZmF1bHQoZGZsdD86IFQpOiBUfHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIENhbGxzIGEgc3VwcGxpZWQge0BsaW5rIFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNvbnRpbnVhdGlvbn0gaWZcbiAgICAgKiB0aGUgb3BlcmF0aW9uIHdhcyBhIHN1Y2Nlc3MuXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUge0BsaW5rIFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNvbnRpbnVhdGlvbn0gbWlnaHQgcmV0dXJuIGFcbiAgICAgKiBkaWZmZXJlbnQgcmVzdWx0IHR5cGUgdGhhbiB7QGxpbmsgSVJlc3VsdH0gb24gd2hpY2ggaXQgaXMgaW52b2tlZC4gVGhpc1xuICAgICAqIGVuYWJsZXMgY2hhaW5pbmcgb2Ygb3BlcmF0aW9ucyB3aXRoIGhldGVyb2dlbm91cyByZXR1cm4gdHlwZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2IgLSBUaGUge0BsaW5rIFN1Y2Nlc3NDb250aW51YXRpb24gfCBzdWNjZXNzIGNvbnRpbnVhdGlvbn0gdG9cbiAgICAgKiBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IG9mIHN1Y2Nlc3MuXG4gICAgICogQHJldHVybnMgSWYgdGhpcyBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkXG4gICAgICogYnkgdGhlIHtAbGluayBTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjb250aW51YXRpb259LiAgSWYgdGhpcyByZXN1bHRcbiAgICAgKiBmYWlsZWQsIHByb3BhZ2F0ZXMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGlzIGZhaWx1cmUuXG4gICAgICovXG4gICAgb25TdWNjZXNzPFROPihjYjogU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBUTj4pOiBSZXN1bHQ8VE4+O1xuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYSBzdXBwbGllZCB7QGxpbmsgRmFpbHVyZUNvbnRpbnVhdGlvbiB8IGZhaWxlZCBjb250aW51YXRpb259IGlmXG4gICAgICogdGhlIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICogQHBhcmFtIGNiIC0gVGhlIHtAbGluayBGYWlsdXJlQ29udGludWF0aW9uIHwgZmFpbHVyZSBjb250aW51YXRpb259IHRvXG4gICAgICogYmUgY2FsbGVkIGluIHRoZSBldmVudCBvZiBmYWlsdXJlLlxuICAgICAqIEByZXR1cm5zIElmIHRoaXMgb3BlcmF0aW9uIGZhaWxlZCwgcmV0dXJucyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlXG4gICAgICoge0BsaW5rIEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsdXJlIGNvbnRpbnVhdGlvbn0uICBJZiB0aGlzIHJlc3VsdFxuICAgICAqIHdhcyBzdWNjZXNzZnVsLCBwcm9wYWdhdGVzIHRoZSByZXN1bHQgdmFsdWUgZnJvbSB0aGUgc3VjY2Vzc2Z1bCBldmVudC5cbiAgICAgKi9cbiAgICBvbkZhaWx1cmUoY2I6IEZhaWx1cmVDb250aW51YXRpb248VD4pOiBSZXN1bHQ8VD47XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIHtAbGluayBJUmVzdWx0IHwgSVJlc3VsdDxUPn0gdG8gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59LFxuICAgICAqIGFkZGluZyBhIHN1cHBsaWVkIGRldGFpbCBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIC0gVGhlIGRldGFpbCB0byBiZSBhZGRlZCBpZiB0aGlzIG9wZXJhdGlvbiBmYWlsZWQuXG4gICAgICogQHJldHVybnMgQSBuZXcge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSB3aXRoIGVpdGhlclxuICAgICAqIHRoZSBzdWNjZXNzIHJlc3VsdCBvciB0aGUgZXJyb3IgbWVzc2FnZSBmcm9tIHRoaXMge0BsaW5rIElSZXN1bHR9LCB3aXRoXG4gICAgICogdGhlIHN1cHBsaWVkIGRldGFpbCAoaWYgdGhpcyBldmVudCBmYWlsZWQpIG9yIGRldGFpbCBgdW5kZWZpbmVkYCAoaWZcbiAgICAgKiB0aGlzIHJlc3VsdCBzdWNjZWVkZWQpLlxuICAgICAqL1xuICAgIHdpdGhGYWlsdXJlRGV0YWlsPFREPihkZXRhaWw6IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSB7QGxpbmsgSVJlc3VsdCB8IElSZXN1bHQ8VD59IHRvIGEge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSxcbiAgICAgKiBhZGRpbmcgc3VwcGxpZWQgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIC0gVGhlIGRlZmF1bHQgZGV0YWlsIHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcge0BsaW5rIERldGFpbGVkUmVzdWx0fS5cbiAgICAgKiBAcGFyYW0gc3VjY2Vzc0RldGFpbCAtIEFuIG9wdGlvbmFsIGRldGFpbCB0byBiZSBhZGRlZCBpZiB0aGlzIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHdpdGggZWl0aGVyXG4gICAgICogdGhlIHN1Y2Nlc3MgcmVzdWx0IG9yIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhpcyB7QGxpbmsgSVJlc3VsdH0gYW5kIHRoZVxuICAgICAqIGFwcHJvcHJpYXRlIGFkZGVkIGRldGFpbC5cbiAgICAgKi9cbiAgICB3aXRoRGV0YWlsPFREPihkZXRhaWw6IFRELCBzdWNjZXNzRGV0YWlsPzogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD47XG59XG5cbi8qKlxuICogUmVwb3J0cyBhIHN1Y2Nlc3NmdWwge0BsaW5rIElSZXN1bHQgfCByZXN1bHR9IGZyb20gc29tZSBvcGVyYXRpb24gYW5kIHRoZVxuICogY29ycmVzcG9uZGluZyB2YWx1ZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFN1Y2Nlc3M8VD4gaW1wbGVtZW50cyBJUmVzdWx0PFQ+IHtcbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5zdWNjZXNzfVxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzdWNjZXNzID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF92YWx1ZTogVDtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHJldHVybmVkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBUKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlc3VsdCB2YWx1ZSByZXR1cm5lZCBieSB0aGUgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzU3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzRmFpbHVyZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNGYWlsdXJlKCk6IHRoaXMgaXMgRmFpbHVyZTxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vclRocm93fVxuICAgICAqL1xuICAgIHB1YmxpYyBvclRocm93KF9sb2dnZXI/OiBJUmVzdWx0TG9nZ2VyKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vckRlZmF1bHR9XG4gICAgICovXG4gICAgcHVibGljIG9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IGRmbHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPclRocm93fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yVGhyb3coX2xvZ2dlcj86IElSZXN1bHRMb2dnZXIpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmdldFZhbHVlT3JEZWZhdWx0fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlID8/IGRmbHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25TdWNjZXNzfVxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KGNiOiBTdWNjZXNzQ29udGludWF0aW9uPFQsIFROPik6IFJlc3VsdDxUTj4ge1xuICAgICAgICByZXR1cm4gY2IodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25GYWlsdXJlfVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoXzogRmFpbHVyZUNvbnRpbnVhdGlvbjxUPik6IFJlc3VsdDxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LndpdGhGYWlsdXJlRGV0YWlsfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRmFpbHVyZURldGFpbDxURD4oX2RldGFpbDogVEQpOiBEZXRhaWxlZFJlc3VsdDxULCBURD4ge1xuICAgICAgICByZXR1cm4gc3VjY2VlZFdpdGhEZXRhaWwodGhpcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQud2l0aERldGFpbH1cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aERldGFpbDxURD4oZGV0YWlsOiBURCwgc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWRXaXRoRGV0YWlsKHRoaXMudmFsdWUsIHN1Y2Nlc3NEZXRhaWwgPz8gZGV0YWlsKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwb3J0cyBhIGZhaWxlZCB7QGxpbmsgSVJlc3VsdCB8IHJlc3VsdH0gZnJvbSBzb21lIG9wZXJhdGlvbiwgd2l0aCBhbiBlcnJvciBtZXNzYWdlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRmFpbHVyZTxUPiBpbXBsZW1lbnRzIElSZXN1bHQ8VD4ge1xuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LnN1Y2Nlc3N9XG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX21lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgRmFpbHVyZX0gd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZS5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2UgdG8gYmUgcmVwb3J0ZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXJyb3IuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmlzU3VjY2Vzc31cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTdWNjZXNzKCk6IHRoaXMgaXMgU3VjY2VzczxUPiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5pc0ZhaWx1cmV9XG4gICAgICovXG4gICAgcHVibGljIGlzRmFpbHVyZSgpOiB0aGlzIGlzIEZhaWx1cmU8VD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vclRocm93fVxuICAgICAqL1xuICAgIHB1YmxpYyBvclRocm93KGxvZ2dlcj86IElSZXN1bHRMb2dnZXIpOiBuZXZlciB7XG4gICAgICAgIGlmIChsb2dnZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHRoaXMuX21lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLl9tZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC5vckRlZmF1bHR9XG4gICAgICovXG4gICAgcHVibGljIG9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGRmbHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQuZ2V0VmFsdWVPclRocm93fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yVGhyb3cobG9nZ2VyPzogSVJlc3VsdExvZ2dlcik6IG5ldmVyIHtcbiAgICAgICAgaWYgKGxvZ2dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IodGhpcy5fbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuX21lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0LmdldFZhbHVlT3JEZWZhdWx0fVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1ZU9yRGVmYXVsdChkZmx0PzogVCk6IFR8dW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGRmbHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQub25TdWNjZXNzfVxuICAgICAqL1xuICAgIHB1YmxpYyBvblN1Y2Nlc3M8VE4+KF86IFN1Y2Nlc3NDb250aW51YXRpb248VCwgVE4+KTogUmVzdWx0PFROPiB7XG4gICAgICAgIHJldHVybiBuZXcgRmFpbHVyZSh0aGlzLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtAaW5oZXJpdGRvYyBJUmVzdWx0Lm9uRmFpbHVyZX1cbiAgICAgKi9cbiAgICBwdWJsaWMgb25GYWlsdXJlKGNiOiBGYWlsdXJlQ29udGludWF0aW9uPFQ+KTogUmVzdWx0PFQ+IHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMubWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge0Bpbmhlcml0ZG9jIElSZXN1bHQud2l0aEZhaWx1cmVEZXRhaWx9XG4gICAgICovXG4gICAgcHVibGljIHdpdGhGYWlsdXJlRGV0YWlsPFREPihkZXRhaWw6IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIGZhaWxXaXRoRGV0YWlsKHRoaXMubWVzc2FnZSwgZGV0YWlsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgSVJlc3VsdC53aXRoRGV0YWlsfVxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoRGV0YWlsPFREPihkZXRhaWw6IFRELCBfc3VjY2Vzc0RldGFpbD86IFREKTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIGZhaWxXaXRoRGV0YWlsKHRoaXMubWVzc2FnZSwgZGV0YWlsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSAnZnJpZW5kbHknIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgRmFpbHVyZX0gdmFsdWUgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHtAbGluayBTdWNjZXNzIHwgU3VjY2VzczxUPn0gd2l0aCB0aGUgc3VwcGxpZWQgcmVzdWx0IHZhbHVlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHN1Y2Nlc3NmdWwgcmVzdWx0IHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWNjZWVkPFQ+KHZhbHVlOiBUKTogU3VjY2VzczxUPiB7XG4gICAgcmV0dXJuIG5ldyBTdWNjZXNzPFQ+KHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHtAbGluayBGYWlsdXJlIHwgRmFpbHVyZTxUPn0gd2l0aCB0aGUgc3VwcGxpZWQgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWw8VD4obWVzc2FnZTogc3RyaW5nKTogRmFpbHVyZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBGYWlsdXJlPFQ+KG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fSBlbmNvdW50ZXJzIHN1Y2Nlc3MuXG4gKiBAcmVtYXJrc1xuICogQSBzdWNjZXNzIGNhbGxiYWNrIGNhbiByZXR1cm4gYSBkaWZmZXJlbnQgcmVzdWx0IHR5cGUgdGhhbiBpdCByZWNlaXZlcywgYWxsb3dpbmdcbiAqIHN1Y2Nlc3MgcmVzdWx0cyB0byBjaGFpbiB0aHJvdWdoIGludGVybWVkaWF0ZSByZXN1bHQgdHlwZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIERldGFpbGVkU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBURCwgVE4+ID0gKHZhbHVlOiBULCBkZXRhaWw/OiBURCkgPT4gRGV0YWlsZWRSZXN1bHQ8VE4sIFREPjtcblxuLyoqXG4gKiBDYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdH0gZW5jb3VudGVycyBhIGZhaWx1cmUuXG4gKiBAcmVtYXJrc1xuICogQSBmYWlsdXJlIGNhbGxiYWNrIGNhbiBjaGFuZ2Uge0BsaW5rIEZhaWx1cmV9IHRvIHtAbGluayBTdWNjZXNzfSAoZS5nLiBieSByZXR1cm5pbmcgYSBkZWZhdWx0IHZhbHVlKVxuICogb3IgaXQgY2FuIGNoYW5nZSBvciBlbWJlbGxpc2ggdGhlIGVycm9yIG1lc3NhZ2UsIGJ1dCBpdCBjYW5ub3QgY2hhbmdlIHRoZSBzdWNjZXNzIHJldHVybiB0eXBlLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb248VCwgVEQ+ID0gKG1lc3NhZ2U6IHN0cmluZywgZGV0YWlsOiBURCkgPT4gRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+O1xuXG4vKipcbiAqIEEge0BsaW5rIERldGFpbGVkU3VjY2Vzc30gZXh0ZW5kcyB7QGxpbmsgU3VjY2Vzc30gdG8gcmVwb3J0IG9wdGlvbmFsIHN1Y2Nlc3MgZGV0YWlscyBpblxuICogYWRkaXRpb24gdG8gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXRhaWxlZFN1Y2Nlc3M8VCwgVEQ+IGV4dGVuZHMgU3VjY2VzczxUPiB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kZXRhaWw/OiBURDtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIERldGFpbGVkU3VjY2VzcyB8IERldGFpbGVkU3VjY2VzczxULCBURD59IHdpdGggdGhlIHN1cHBsaWVkXG4gICAgICogdmFsdWUgYW5kIGRldGFpbC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQuXG4gICAgICogQHBhcmFtIGRldGFpbCAtIEFuIG9wdGlvbmFsIHN1Y2Nlc3NmdWwgZGV0YWlsIHRvIGJlIHJldHVybmVkLiAgSWYgb21pdHRlZCwgZGV0YWlsXG4gICAgICogd2lsbCBiZSBgdW5kZWZpbmVkYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IodmFsdWU6IFQsIGRldGFpbD86IFREKSB7XG4gICAgICAgIHN1cGVyKHZhbHVlKTtcbiAgICAgICAgdGhpcy5fZGV0YWlsID0gZGV0YWlsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzdWNjZXNzIGRldGFpbCBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfSwgb3IgYHVuZGVmaW5lZGAgaWZcbiAgICAgKiBubyBkZXRhaWwgd2FzIHN1cHBsaWVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGV0YWlsKCk6IFREfHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZXRhaWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwb3J0cyB0aGF0IHRoaXMge0BsaW5rIERldGFpbGVkU3VjY2Vzc30gaXMgYSBzdWNjZXNzLlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQWx3YXlzIHRydWUgZm9yIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9IGJ1dCBjYW4gYmUgdXNlZCBhcyB0eXBlIGd1YXJkXG4gICAgICogdG8gZGlzY3JpbWluYXRlIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9IGZyb20ge0BsaW5rIERldGFpbGVkRmFpbHVyZX0gaW5cbiAgICAgKiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdH0uXG4gICAgICogQHJldHVybnMgYHRydWVgXG4gICAgICovXG4gICAgcHVibGljIGlzU3VjY2VzcygpOiB0aGlzIGlzIERldGFpbGVkU3VjY2VzczxULCBURD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBzdXBwbGllZCB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uIHwgc3VjY2VzcyBjYWxsYmFja30gYW5kIHByb3BhZ2F0ZXNcbiAgICAgKiBpdHMgcmV0dXJuZWQge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VE4sIFREPn0uXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgc3VjY2VzcyBjYWxsYmFjayBtdXRhdGVzIHRoZSByZXR1cm4gdHlwZSBmcm9tIGA8VD5gIHRvIGA8VE4+YC5cbiAgICAgKiBAcGFyYW0gY2IgLSBUaGUge0BsaW5rIERldGFpbGVkU3VjY2Vzc0NvbnRpbnVhdGlvbiB8IHN1Y2Nlc3MgY2FsbGJhY2t9IHRvIGJlIGludm9rZWQuXG4gICAgICogQHJldHVybnMgVGhlIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0gcmV0dXJuZWQgYnkgdGhlIHN1Y2Nlc3MgY2FsbGJhY2suXG4gICAgICovXG4gICAgcHVibGljIG9uU3VjY2VzczxUTj4oY2I6IERldGFpbGVkU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBURCwgVE4+KTogRGV0YWlsZWRSZXN1bHQ8VE4sIFREPiB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnZhbHVlLCB0aGlzLl9kZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3BhZ2F0ZXMgdGhpcyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzfS5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEZhaWx1cmUgZG9lcyBub3QgbXV0YXRlIHJldHVybiB0eXBlIHNvIHdlIGNhbiByZXR1cm4gdGhpcyBldmVudCBkaXJlY3RseS5cbiAgICAgKiBAcGFyYW0gX2NiIC0ge0BsaW5rIERldGFpbGVkRmFpbHVyZUNvbnRpbnVhdGlvbiB8IEZhaWx1cmUgY2FsbGJhY2t9IHRvIGJlIGNhbGxlZFxuICAgICAqIG9uIGEge0BsaW5rIERldGFpbGVkUmVzdWx0fSBpbiBjYXNlIG9mIGZhaWx1cmUgKGlnbm9yZWQpLlxuICAgICAqIEByZXR1cm5zIGB0aGlzYFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkZhaWx1cmUoX2NiOiBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb248VCwgVEQ+KTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG4vKipcbiAqIEEge0BsaW5rIERldGFpbGVkRmFpbHVyZX0gZXh0ZW5kcyB7QGxpbmsgRmFpbHVyZX0gdG8gcmVwb3J0IG9wdGlvbmFsIGZhaWx1cmUgZGV0YWlscyBpblxuICogYWRkaXRpb24gdG8gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+IGV4dGVuZHMgRmFpbHVyZTxUPiB7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kZXRhaWw6IFREO1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlIHwgRGV0YWlsZWRGYWlsdXJlPFQsIFREPn0gd2l0aCB0aGUgc3VwcGxpZWRcbiAgICAgKiBtZXNzYWdlIGFuZCBkZXRhaWwuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBiZSByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIC0gVGhlIGVycm9yIGRldGFpbCB0byBiZSByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBkZXRhaWw6IFREKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLl9kZXRhaWwgPSBkZXRhaWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGRldGFpbCBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlfS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRldGFpbCgpOiBURCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZXRhaWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVwb3J0cyB0aGF0IHRoaXMge0BsaW5rIERldGFpbGVkRmFpbHVyZX0gaXMgYSBmYWlsdXJlLlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQWx3YXlzIHRydWUgZm9yIHtAbGluayBEZXRhaWxlZEZhaWx1cmV9IGJ1dCBjYW4gYmUgdXNlZCBhcyB0eXBlIGd1YXJkXG4gICAgICogdG8gZGlzY3JpbWluYXRlIHtAbGluayBEZXRhaWxlZFN1Y2Nlc3N9IGZyb20ge0BsaW5rIERldGFpbGVkRmFpbHVyZX0gaW5cbiAgICAgKiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdH0uXG4gICAgICogQHJldHVybnMgYHRydWVgXG4gICAgICovXG4gICAgcHVibGljIGlzRmFpbHVyZSgpOiB0aGlzIGlzIERldGFpbGVkRmFpbHVyZTxULCBURD4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9wYWdhdGVzIHRoZSBlcnJvciBtZXNzYWdlIGFuZCBkZXRhaWwgZnJvbSB0aGlzIHJlc3VsdC5cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE11dGF0ZXMgdGhlIHN1Y2Nlc3MgdHlwZSBhcyB0aGUgc3VjY2VzcyBjYWxsYmFjayB3b3VsZCBoYXZlLCBidXQgZG9lcyBub3RcbiAgICAgKiBjYWxsIHRoZSBzdWNjZXNzIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSBfY2IgLSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzQ29udGludWF0aW9uIHwgU3VjY2VzcyBjYWxsYmFja30gdG8gYmUgY2FsbGVkXG4gICAgICogb24gYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHR9IGluIGNhc2Ugb2Ygc3VjY2VzcyAoaWdub3JlZCkuXG4gICAgICogQHJldHVybnMgQSBuZXcge0BsaW5rIERldGFpbGVkRmFpbHVyZSB8IERldGFpbGVkRmFpbHVyZTxUTiwgVEQ+fSB3aGljaCBjb250YWluc1xuICAgICAqIHRoZSBlcnJvciBtZXNzYWdlIGFuZCBkZXRhaWwgZnJvbSB0aGlzIG9uZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25TdWNjZXNzPFROPihfY2I6IERldGFpbGVkU3VjY2Vzc0NvbnRpbnVhdGlvbjxULCBURCwgVE4+KTogRGV0YWlsZWRSZXN1bHQ8VE4sIFREPiB7XG4gICAgICAgIHJldHVybiBuZXcgRGV0YWlsZWRGYWlsdXJlPFROLCBURD4odGhpcy5tZXNzYWdlLCB0aGlzLl9kZXRhaWwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIHN1cHBsaWVkIHtAbGluayBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb24gfCBmYWlsdXJlIGNhbGxiYWNrfSBhbmQgcHJvcGFnYXRlc1xuICAgICAqIGl0cyByZXR1cm5lZCB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59LlxuICAgICAqIEBwYXJhbSBjYiAtIFRoZSB7QGxpbmsgRGV0YWlsZWRGYWlsdXJlQ29udGludWF0aW9uIHwgZmFpbHVyZSBjYWxsYmFja30gdG8gYmUgaW52b2tlZC5cbiAgICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSByZXR1cm5lZCBieSB0aGUgZmFpbHVyZSBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25GYWlsdXJlKGNiOiBEZXRhaWxlZEZhaWx1cmVDb250aW51YXRpb248VCwgVEQ+KTogRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+IHtcbiAgICAgICAgcmV0dXJuIGNiKHRoaXMubWVzc2FnZSwgdGhpcy5fZGV0YWlsKTtcbiAgICB9XG59XG5cbi8qKlxuICogVHlwZSBpbmZlcmVuY2UgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQgdHlwZSBgVGAgb2YgYSB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59LlxuICogQGJldGFcbiAqL1xuZXhwb3J0IHR5cGUgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+ID0gRGV0YWlsZWRTdWNjZXNzPFQsIFREPnxEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+O1xuXG4vKipcbiAqIFR5cGUgaW5mZXJlbmNlIHRvIGRldGVybWluZSB0aGUgZGV0YWlsIHR5cGUgYFREYCBvZiBhIHtAbGluayBEZXRhaWxlZFJlc3VsdCB8IERldGFpbGVkUmVzdWx0PFQsIFREPn0uXG4gKiBAYmV0YVxuICovXG5leHBvcnQgdHlwZSBSZXN1bHREZXRhaWxUeXBlPFQ+ID0gVCBleHRlbmRzIERldGFpbGVkUmVzdWx0PHVua25vd24sIGluZmVyIFREPiA/IFREIDogbmV2ZXI7XG5cbi8qKlxuICogUmV0dXJucyB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzIHwgRGV0YWlsZWRTdWNjZXNzPFQsIFREPn0gd2l0aCBhIHN1cHBsaWVkIHZhbHVlIGFuZCBvcHRpb25hbFxuICogZGV0YWlsLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHR5cGUgYDxUPmAgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gZGV0YWlsIC0gQW4gb3B0aW9uYWwgZGV0YWlsIG9mIHR5cGUgYDxURD5gIHRvIGJlIHJldHVybmVkLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGV0YWlsZWRTdWNjZXNzIHwgRGV0YWlsZWRTdWNjZXNzPFQsIFREPn0gd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVcbiAqIGFuZCBkZXRhaWwsIGlmIHN1cHBsaWVkLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VlZFdpdGhEZXRhaWw8VCwgVEQ+KHZhbHVlOiBULCBkZXRhaWw/OiBURCk6IERldGFpbGVkU3VjY2VzczxULCBURD4ge1xuICAgIHJldHVybiBuZXcgRGV0YWlsZWRTdWNjZXNzPFQsIFREPih2YWx1ZSwgZGV0YWlsKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHtAbGluayBEZXRhaWxlZEZhaWx1cmUgfCBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+fSB3aXRoIGEgc3VwcGxpZWQgZXJyb3IgbWVzc2FnZSBhbmQgZGV0YWlsLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZXZlbnQgZGV0YWlsIHRvIGJlIHJldHVybmVkLlxuICogQHJldHVybnMgQW4ge0BsaW5rIERldGFpbGVkRmFpbHVyZSB8IERldGFpbGVkRmFpbHVyZTxULCBURD59IHdpdGggdGhlIHN1cHBsaWVkIGVycm9yXG4gKiBtZXNzYWdlIGFuZCBkZXRhaWwuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYWlsV2l0aERldGFpbDxULCBURD4obWVzc2FnZTogc3RyaW5nLCBkZXRhaWw6IFREKTogRGV0YWlsZWRGYWlsdXJlPFQsIFREPiB7XG4gICAgcmV0dXJuIG5ldyBEZXRhaWxlZEZhaWx1cmU8VCwgVEQ+KG1lc3NhZ2UsIGRldGFpbCk7XG59XG5cbi8qKlxuICogUHJvcGFnYXRlcyBhIHtAbGluayBTdWNjZXNzfSBvciB7QGxpbmsgRmFpbHVyZX0ge0BsaW5rIFJlc3VsdH0sIGFkZGluZyBzdXBwbGllZFxuICogZXZlbnQgZGV0YWlscyBhcyBhcHByb3ByaWF0ZS5cbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUge0BsaW5rIFJlc3VsdH0gdG8gYmUgcHJvcGFnYXRlZC5cbiAqIEBwYXJhbSBkZXRhaWwgLSBUaGUgZXZlbnQgZGV0YWlsICh0eXBlIGA8VEQ+YCkgdG8gYmUgYWRkZWQgdG8gdGhlIHtAbGluayBSZXN1bHQgfCByZXN1bHR9LlxuICogQHBhcmFtIHN1Y2Nlc3NEZXRhaWwgLSBBbiBvcHRpb25hbCBkaXN0aW5jdCBldmVudCBkZXRhaWwgdG8gYmUgYWRkZWQgdG8ge0BsaW5rIFN1Y2Nlc3N9IHJlc3VsdHMuICBJZiBgc3VjY2Vzc0RldGFpbGBcbiAqIGlzIG9taXR0ZWQgb3IgYHVuZGVmaW5lZGAsIHRoZW4gYGRldGFpbGAgd2lsbCBiZSBhcHBsaWVkIHRvIHtAbGluayBTdWNjZXNzfSByZXN1bHRzLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSB3aXRoIHRoZSBzdWNjZXNzIHZhbHVlIG9yIGVycm9yXG4gKiBtZXNzYWdlIGZyb20gdGhlIG9yaWdpbmFsIGByZXN1bHRgIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIGFkZGVkLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGFnYXRlV2l0aERldGFpbDxULCBURD4ocmVzdWx0OiBSZXN1bHQ8VD4sIGRldGFpbDogVEQsIHN1Y2Nlc3NEZXRhaWw/OiBURCk6IERldGFpbGVkUmVzdWx0PFQsIFREPiB7XG4gICAgcmV0dXJuIHJlc3VsdC5pc1N1Y2Nlc3MoKVxuICAgICAgICA/IHN1Y2NlZWRXaXRoRGV0YWlsKHJlc3VsdC52YWx1ZSwgc3VjY2Vzc0RldGFpbCA/PyBkZXRhaWwpXG4gICAgICAgIDogZmFpbFdpdGhEZXRhaWwocmVzdWx0Lm1lc3NhZ2UsIGRldGFpbCk7XG59XG5cbi8qKlxuICogV3JhcHMgYSBmdW5jdGlvbiB3aGljaCBtaWdodCB0aHJvdyB0byBjb252ZXJ0IGV4Y2VwdGlvbiByZXN1bHRzXG4gKiB0byB7QGxpbmsgRmFpbHVyZX0uXG4gKiBAcGFyYW0gZnVuYyAtIFRoZSBmdW5jdGlvbiB0byBiZSBjYXB0dXJlZC5cbiAqIEByZXR1cm5zIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYSB2YWx1ZSBvZiB0eXBlIGA8VD5gIG9uXG4gKiBzdWNjZXNzICwgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggdGhlIHRocm93biBlcnJvciBtZXNzYWdlIGlmXG4gKiBgZnVuY2AgdGhyb3dzIGFuIGBFcnJvcmAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlUmVzdWx0PFQ+KGZ1bmM6ICgpID0+IFQpOiBSZXN1bHQ8VD4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZ1bmMoKSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoKGVyciBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgc3VjY2Vzc2Z1bCByZXN1bHQgdmFsdWVzIGZyb20gYSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VD59LlxuICogQHBhcmFtIHJlc3VsdHMgLSBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fSB0byBiZSBtYXBwZWQuXG4gKiBAcmV0dXJucyAgSWYgYWxsIHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBhcmUgc3VjY2Vzc2Z1bCwgcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhblxuICogYXJyYXkgY29udGFpbmluZyBhbGwgcmV0dXJuZWQgdmFsdWVzLiAgSWYgYW55IHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBmYWlsZWQsIHJldHVybnNcbiAqIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgY29uY2F0ZW5hdGVkIHN1bW1hcnkgb2YgYWxsIGVycm9yIG1lc3NhZ2VzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwUmVzdWx0czxUPihyZXN1bHRzOiBJdGVyYWJsZTxSZXN1bHQ8VD4+KTogUmVzdWx0PFRbXT4ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbGVtZW50czogVFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChlbGVtZW50cyk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBzdWNjZXNzZnVsIHJlc3VsdHMgZnJvbSBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERldGFpbGVkUmVzdWx0IHwgRGV0YWlsZWRSZXN1bHQ8VCwgVEQ+fSxcbiAqIG9wdGlvbmFsbHkgaWdub3JpbmcgY2VydGFpbiBlcnJvciBkZXRhaWxzLlxuICogQHBhcmFtIHJlc3VsdHMgLSBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGV0YWlsZWRSZXN1bHQgfCBEZXRhaWxlZFJlc3VsdDxULCBURD59IHRvIGJlIG1hcHBlZC5cbiAqIEBwYXJhbSBpZ25vcmUgLSBBbiBhcnJheSBvZiBlcnJvciBkZXRhaWwgdmFsdWVzIChvZiB0eXBlIGA8VEQ+YCkgdGhhdCBzaG91bGQgYmUgaWdub3JlZC5cbiAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHN1Y2Nlc3NmdWwgcmVzdWx0cyBpZiBhbGwgcmVzdWx0cyBlaXRoZXJcbiAqIHN1Y2NlZWRlZCBvciByZXR1cm5lZCBlcnJvciBkZXRhaWxzIGxpc3RlZCBpbiBgaWdub3JlYC4gIElmIGFueSByZXN1bHRzIGZhaWxlZCB3aXRoIGRldGFpbHNcbiAqIHRoYXQgY2Fubm90IGJlIGlnbm9yZWQsIHJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gY29uY2F0ZW5hdGVkIHN1bW1hcnkgb2YgYWxsIG5vbi1pZ25vcmFibGVcbiAqIGVycm9yIG1lc3NhZ2VzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwRGV0YWlsZWRSZXN1bHRzPFQsIFREPihyZXN1bHRzOiBJdGVyYWJsZTxEZXRhaWxlZFJlc3VsdDxULCBURD4+LCBpZ25vcmU6IFREW10pOiBSZXN1bHQ8VFtdPiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVsZW1lbnRzOiBUW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpZ25vcmUuaW5jbHVkZXMocmVzdWx0LmRldGFpbCkpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChlbGVtZW50cyk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBzdWNjZXNzZnVsIHJlc3VsdHMgZnJvbSBhIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fS5cbiAqIEBwYXJhbSByZXN1bHRzIC0gQW4gYEl0ZXJhYmxlYCBvZiB7QGxpbmsgUmVzdWx0IHwgUmVzdWx0PFQ+fSBmcm9tIHdoaWNoIHN1Y2Nlc3NcbiAqIHJlc3VsdHMgYXJlIHRvIGJlIGFnZ3JlZ2F0ZWQuXG4gKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhbiBhcnJheSBvZiBgPFQ+YCBpZiBhbnkgcmVzdWx0cyB3ZXJlIHN1Y2Nlc3NmdWwuIElmXG4gKiBhbGwge0BsaW5rIFJlc3VsdCB8IHJlc3VsdHN9IGZhaWxlZCwgcmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhIGNvbmNhdGVuYXRlZFxuICogc3VtbWFyeSBvZiBhbGwgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBTdWNjZXNzPFQ+KHJlc3VsdHM6IEl0ZXJhYmxlPFJlc3VsdDxUPj4pOiBSZXN1bHQ8VFtdPiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVsZW1lbnRzOiBUW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgZWxlbWVudHMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKChlbGVtZW50cy5sZW5ndGggPT09IDApICYmIChlcnJvcnMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoZWxlbWVudHMpO1xufVxuXG4vKipcbiAqIEFnZ3JlZ2F0ZXMgZXJyb3IgbWVzc2FnZXMgZnJvbSBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0uXG4gKiBAcGFyYW0gcmVzdWx0cyAtIEFuIGl0ZXJhYmxlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gZm9yIHdoaWNoXG4gKiBlcnJvciBtZXNzYWdlcyBhcmUgYWdncmVnYXRlZC5cbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MgY29uc2lzdGluZyBvZiBhbGwgZXJyb3IgbWVzc2FnZXMgcmV0dXJuZWQgYnlcbiAqIHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBpbiB0aGUgc291cmNlIGNvbGxlY3Rpb24uIElnbm9yZXMge0BsaW5rIFN1Y2Nlc3N9XG4gKiByZXN1bHRzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIHdlcmUgbm8gZXJyb3JzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwRmFpbHVyZXM8VD4ocmVzdWx0czogSXRlcmFibGU8UmVzdWx0PFQ+Pik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIGFuIGl0ZXJhYmxlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gd2VyZSBhbGwgc3VjY2Vzc2Z1bC5cbiAqIEBwYXJhbSByZXN1bHRzIC0gVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUPn0gdG8gYmUgdGVzdGVkLlxuICogQHJldHVybnMgUmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBgdHJ1ZWAgaWYgYWxsIHtAbGluayBSZXN1bHQgfCByZXN1bHRzfSBhcmUgc3VjY2Vzc2Z1bC5cbiAqIElmIGFueSBhcmUgdW5zdWNjZXNzZnVsLCByZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgY29uY2F0ZW5hdGVkIHN1bW1hcnkgdGhlIGVycm9yXG4gKiBtZXNzYWdlcyBmcm9tIGFsbCBmYWlsZWQgZWxlbWVudHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxTdWNjZWVkPFQ+KHJlc3VsdHM6IEl0ZXJhYmxlPFJlc3VsdDx1bmtub3duPj4sIHN1Y2Nlc3NWYWx1ZTogVCk6IFJlc3VsdDxUPiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2VcbiAgICBpZiAocmVzdWx0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoc3VjY2Vzc1ZhbHVlKTtcbn1cblxuLyoqXG4gKiBTdHJpbmcta2V5ZWQgcmVjb3JkIG9mIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyB0byBiZSBwYXNzZWQgdG8ge0BsaW5rIHBvcHVsYXRlT2JqZWN0Lig6d2l0aE9wdGlvbnMpfS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRmllbGRJbml0aWFsaXplcnM8VD4gPSB7IFsga2V5IGluIGtleW9mIFQgXTogKHN0YXRlOiBQYXJ0aWFsPFQ+KSA9PiBSZXN1bHQ8VFtrZXldPiB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgcG9wdWxhdGVPYmplY3QuKDp3aXRoT3B0aW9ucyl9IGZ1bmN0aW9uLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvcHVsYXRlT2JqZWN0T3B0aW9uczxUPiB7XG4gICAgLyoqXG4gICAgICogSWYgcHJlc2VudCwgc3BlY2lmaWVzIHRoZSBvcmRlciBpbiB3aGljaCBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkXG4gICAgICogYmUgZXZhbHVhdGVkLiAgQW55IGtleXMgbm90IGxpc3RlZCBhcmUgZXZhbHVhdGVkIGFmdGVyIGFsbCBsaXN0ZWRcbiAgICAgKiBrZXlzIGluIGluZGV0ZXJtaW5hdGUgb3JkZXIuICBJZiAnb3JkZXInIGlzIG5vdCBwcmVzZW50LCBrZXlzXG4gICAgICogYXJlIGV2YWx1YXRlZCBpbiBpbmRldGVybWluYXRlIG9yZGVyLlxuICAgICAqL1xuICAgIG9yZGVyPzogKGtleW9mIFQpW107XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGhhbmRsaW5nIG9mIGB1bmRlZmluZWRgIHZhbHVlcy4gIEJ5IGRlZmF1bHQsIHN1Y2Nlc3NmdWxcbiAgICAgKiBgdW5kZWZpbmVkYCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIHRoZSByZXN1bHQgb2JqZWN0LiAgSWYgdGhpcyB2YWx1ZVxuICAgICAqIGlzIGB0cnVlYCB0aGVuIGB1bmRlZmluZWRgIHJlc3VsdHMgYXJlIHN1cHByZXNzZWQgZm9yIGFsbCBwcm9wZXJ0aWVzLlxuICAgICAqIElmIHRoaXMgdmFsdWUgaXMgYW4gYXJyYXkgb2YgcHJvcGVydHkga2V5cyB0aGVuIGB1bmRlZmluZWRgIHJlc3VsdHNcbiAgICAgKiBhcmUgc3VwcHJlc3NlZCBmb3IgdGhvc2UgcHJvcGVydGllcyBvbmx5LlxuICAgICAqL1xuICAgIHN1cHByZXNzVW5kZWZpbmVkPzogYm9vbGVhbiB8IChrZXlvZiBUKVtdO1xufVxuXG4vKipcbiAqIFBvcHVsYXRlcyBhbiBhbiBvYmplY3QgYmFzZWQgb24gYSBwcm90b3R5cGUgZnVsbCBvZiBmaWVsZCBpbml0aWFsaXplcnMgdGhhdCByZXR1cm4ge0BsaW5rIFJlc3VsdCB8IFJlc3VsdDxUW2tleV0+fS5cbiAqIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHBvcHVsYXRlZCBvYmplY3QgaWYgYWxsIGluaXRpYWxpemVycyBzdWNjZWVkLCBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhXG4gKiBjb25jYXRlbmF0ZWQgbGlzdCBvZiBhbGwgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gaW5pdGlhbGl6ZXJzIC0gQW4gb2JqZWN0IHdpdGggdGhlIHNoYXBlIG9mIHRoZSB0YXJnZXQgYnV0IHdpdGggaW5pdGlhbGl6ZXIgZnVuY3Rpb25zIGZvclxuICogZWFjaCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb3B0aW9uYWwge0BsaW5rIFBvcHVsYXRlT2JqZWN0T3B0aW9ucyB8IHNldCBvZiBvcHRpb25zfSB3aGljaFxuICogbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiB0aGlzIGNhbGwuXG4gKiBAcHVibGljXG4gKiB7QGxhYmVsIHdpdGhPcHRpb25zfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9wdWxhdGVPYmplY3Q8VD4oaW5pdGlhbGl6ZXJzOiBGaWVsZEluaXRpYWxpemVyczxUPiwgb3B0aW9ucz86IFBvcHVsYXRlT2JqZWN0T3B0aW9uczxUPik6IFJlc3VsdDxUPjtcblxuLyoqXG4gKiBQb3B1bGF0ZXMgYW4gYW4gb2JqZWN0IGJhc2VkIG9uIGEgcHJvdG90eXBlIGZ1bGwgb2YgZmllbGQgaW5pdGlhbGl6ZXJzIHRoYXQgcmV0dXJuIHtAbGluayBSZXN1bHQgfCBSZXN1bHQ8VFtrZXldPn0uXG4gKiBSZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSBwb3B1bGF0ZWQgb2JqZWN0IGlmIGFsbCBpbml0aWFsaXplcnMgc3VjY2VlZCwgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYVxuICogY29uY2F0ZW5hdGVkIGxpc3Qgb2YgYWxsIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIGluaXRpYWxpemVycyAtIEFuIG9iamVjdCB3aXRoIHRoZSBzaGFwZSBvZiB0aGUgdGFyZ2V0IGJ1dCB3aXRoIGluaXRpYWxpemVyIGZ1bmN0aW9ucyBmb3JcbiAqIGVhY2ggcHJvcGVydHkuXG4gKiBAcGFyYW0gb3JkZXIgLSBPcHRpb25hbCBvcmRlciBpbiB3aGljaCBrZXlzIHNob3VsZCBiZSB3cml0dGVuLlxuICogQHB1YmxpY1xuICoge0BsYWJlbCB3aXRoT3JkZXJ9XG4gKiBAZGVwcmVjYXRlZCBQYXNzIHtAbGluayBQb3B1bGF0ZU9iamVjdE9wdGlvbnN9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3B1bGF0ZU9iamVjdDxUPihpbml0aWFsaXplcnM6IEZpZWxkSW5pdGlhbGl6ZXJzPFQ+LCBvcmRlcjogKGtleW9mIFQpW10pOiBSZXN1bHQ8VD47XG5leHBvcnQgZnVuY3Rpb24gcG9wdWxhdGVPYmplY3Q8VD4oaW5pdGlhbGl6ZXJzOiBGaWVsZEluaXRpYWxpemVyczxUPiwgb3B0aW9uc09yT3JkZXI/OiBQb3B1bGF0ZU9iamVjdE9wdGlvbnM8VD4gfCAoa2V5b2YgVClbXSk6IFJlc3VsdDxUPiB7XG4gICAgY29uc3Qgb3B0aW9uczogUG9wdWxhdGVPYmplY3RPcHRpb25zPFQ+ID0gb3B0aW9uc09yT3JkZXJcbiAgICAgICAgPyBBcnJheS5pc0FycmF5KG9wdGlvbnNPck9yZGVyKSA/IHsgb3JkZXI6IG9wdGlvbnNPck9yZGVyIH0gOiBvcHRpb25zT3JPcmRlclxuICAgICAgICA6IHt9O1xuICAgIGNvbnN0IHN0YXRlID0ge30gYXMgeyBba2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qga2V5czogKGtleW9mIFQpW10gPSBBcnJheS5mcm9tKG9wdGlvbnMub3JkZXIgPz8gW10pO1xuICAgIGNvbnN0IGZvdW5kS2V5cyA9IG5ldyBTZXQ8a2V5b2YgVD4ob3B0aW9ucy5vcmRlcik7XG5cbiAgICAvLyBzdGFydCB3aXRoIHRoZSBzdXBwbGllZCBvcmRlciB0aGVuIGFwcGVuZCBhbnl0aGluZyBlbHNlIHdlIGZpbmRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbml0aWFsaXplcnMpIHtcbiAgICAgICAgaWYgKCFmb3VuZEtleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgZm91bmRLZXlzLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAoaW5pdGlhbGl6ZXJzW2tleV0pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGluaXRpYWxpemVyc1trZXldKHN0YXRlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zLnN1cHByZXNzVW5kZWZpbmVkID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgQXJyYXkuaXNBcnJheShvcHRpb25zLnN1cHByZXNzVW5kZWZpbmVkKSAmJiBvcHRpb25zLnN1cHByZXNzVW5kZWZpbmVkLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXRlW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChgcG9wdWxhdGVPYmplY3Q6IEtleSAke1N0cmluZyhrZXkpfSBpcyBwcmVzZW50IGJ1dCBoYXMgbm8gaW5pdGlhbGl6ZXJgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VlZChzdGF0ZSBhcyBUKTtcbn1cbiJdfQ==
|