@fgv/ts-utils
Advanced tools
Comparing version 0.3.5 to 0.3.6
@@ -75,3 +75,3 @@ import { BaseConverter, Converter } from './converter'; | ||
*/ | ||
export declare function oneOf<T>(converters: Array<Converter<T>>, onError?: OnError): Converter<T>; | ||
export declare function oneOf<T, TC = unknown>(converters: Array<Converter<T, TC>>, onError?: OnError): Converter<T, TC>; | ||
/** | ||
@@ -126,11 +126,11 @@ * A helper wrapper for converting an array of <T>. If onError is 'failOnError' (default), | ||
export declare function optionalField<T, TC = undefined>(name: string, converter: Converter<T, TC>): Converter<T | undefined, TC>; | ||
export declare type FieldConverters<T> = { | ||
[key in keyof T]: Converter<T[key]>; | ||
export declare type FieldConverters<T, TC = unknown> = { | ||
[key in keyof T]: Converter<T[key], TC>; | ||
}; | ||
export declare class ObjectConverter<T> extends BaseConverter<T> { | ||
export declare class ObjectConverter<T, TC = unknown> extends BaseConverter<T, TC> { | ||
readonly fields: FieldConverters<T>; | ||
readonly optionalFields: (keyof T)[]; | ||
constructor(fields: FieldConverters<T>, optional?: (keyof T)[]); | ||
partial(optional?: (keyof T)[]): ObjectConverter<Partial<T>>; | ||
addPartial(addOptionalFields: (keyof T)[]): ObjectConverter<Partial<T>>; | ||
constructor(fields: FieldConverters<T, TC>, optional?: (keyof T)[]); | ||
partial(optional?: (keyof T)[]): ObjectConverter<Partial<T>, TC>; | ||
addPartial(addOptionalFields: (keyof T)[]): ObjectConverter<Partial<T>, TC>; | ||
} | ||
@@ -164,3 +164,3 @@ /** | ||
*/ | ||
export declare function transform<T>(fields: FieldConverters<T>): Converter<T>; | ||
export declare function transform<T, TC = unknown>(fields: FieldConverters<T, TC>): Converter<T, TC>; | ||
/** | ||
@@ -171,4 +171,4 @@ * A helper wrapper to convert a range of some other comparable type | ||
*/ | ||
export declare function rangeTypeOf<T, RT extends RangeOf<T>>(converter: Converter<T>, constructor: (init: RangeOfProperties<T>) => Result<RT>): Converter<RT>; | ||
export declare function rangeOf<T>(converter: Converter<T>): Converter<RangeOf<T>>; | ||
export declare function rangeTypeOf<T, RT extends RangeOf<T>, TC = unknown>(converter: Converter<T, TC>, constructor: (init: RangeOfProperties<T>) => Result<RT>): Converter<RT, TC>; | ||
export declare function rangeOf<T, TC = unknown>(converter: Converter<T, TC>): Converter<RangeOf<T>, TC>; | ||
export {}; |
@@ -171,6 +171,6 @@ "use strict"; | ||
function oneOf(converters, onError = 'ignoreErrors') { | ||
return new converter_1.BaseConverter((from) => { | ||
return new converter_1.BaseConverter((from, _self, context) => { | ||
const errors = []; | ||
for (const converter of converters) { | ||
const result = converter.convert(from); | ||
const result = converter.convert(from, context); | ||
if (result.isSuccess() && (result.value !== undefined)) { | ||
@@ -345,3 +345,3 @@ return result; | ||
constructor(fields, optional) { | ||
super((from) => { | ||
super((from, _self, context) => { | ||
var _a; | ||
@@ -356,4 +356,4 @@ // eslint bug thinks key is used before defined | ||
const result = isOptional | ||
? optionalField(key, fields[key]).convert(from) | ||
: field(key, fields[key]).convert(from); | ||
? optionalField(key, fields[key]).convert(from, context) | ||
: field(key, fields[key]).convert(from, context); | ||
if (result.isSuccess() && (result.value !== undefined)) { | ||
@@ -411,3 +411,3 @@ converted[key] = result.value; | ||
function transform(fields) { | ||
return new converter_1.BaseConverter((from) => { | ||
return new converter_1.BaseConverter((from, _self, context) => { | ||
// eslint bug thinks key is used before defined | ||
@@ -419,3 +419,3 @@ // eslint-disable-next-line no-use-before-define | ||
if (fields[key]) { | ||
const result = fields[key].convert(from); | ||
const result = fields[key].convert(from, context); | ||
if (result.isSuccess() && (result.value !== undefined)) { | ||
@@ -439,7 +439,7 @@ converted[key] = result.value; | ||
function rangeTypeOf(converter, constructor) { | ||
return new converter_1.BaseConverter((from) => { | ||
return new converter_1.BaseConverter((from, _self, context) => { | ||
const result = object({ | ||
min: converter, | ||
max: converter, | ||
}, ['min', 'max']).convert(from); | ||
}, ['min', 'max']).convert(from, context); | ||
if (result.isSuccess()) { | ||
@@ -456,2 +456,2 @@ return constructor({ min: result.value.min, max: result.value.max }); | ||
exports.rangeOf = rangeOf; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF1RDtBQUN2RCx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBRWhFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsd0RBQWdDO0FBQ2hDLG1DQUFrQztBQUlsQzs7O0dBR0c7QUFDVSxRQUFBLE1BQU0sR0FBRyxJQUFJLHlCQUFhLENBQVMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM5RCxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLGdCQUFPLENBQUMsSUFBYyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxhQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUF3QjtJQUNuRCxPQUFPLElBQUkseUJBQWEsQ0FBa0IsQ0FBQyxJQUFhLEVBQUUsS0FBaUMsRUFBRSxPQUFpQixFQUFFLEVBQUU7UUFDOUcsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDMUIsT0FBTyxhQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxzQkFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBUEQsd0NBT0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFJLE1BQVc7SUFDMUMsT0FBTyxJQUFJLHlCQUFhLENB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WUFDZCxHQUFHLEVBQUUsU0FBUztTQUNqQixFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDeEU7UUFDRCxPQUFPLGFBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBWEQsa0NBV0M7QUFFRCxTQUFnQixPQUFPLENBQUksU0FBdUI7SUFDOUMsT0FBTyxXQUFXLENBQWdCLFNBQVMsRUFBRSxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFGRCwwQkFFQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5pbXBvcnQgeyBCYXNlQ29udmVydGVyLCBDb252ZXJ0ZXIgfSBmcm9tICcuL2NvbnZlcnRlcic7XG5pbXBvcnQgeyBSYW5nZU9mLCBSYW5nZU9mUHJvcGVydGllcyB9IGZyb20gJy4vcmFuZ2VPZic7XG5pbXBvcnQgeyBSZXN1bHQsIGNhcHR1cmVSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XG5cbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgRXh0ZW5kZWRBcnJheSB9IGZyb20gJy4vZXh0ZW5kZWRBcnJheSc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuaW1wb3J0IHsgaXNLZXlPZiB9IGZyb20gJy4vdXRpbHMnO1xuXG50eXBlIE9uRXJyb3IgPSAnZmFpbE9uRXJyb3InIHwgJ2lnbm9yZUVycm9ycyc7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIHN0cmluZy4gVmFsdWVzIG9mIHR5cGVcbiAqIHN0cmluZyBzdWNjZWVkLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZyA9IG5ldyBCYXNlQ29udmVydGVyPHN0cmluZz4oKGZyb206IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIGZyb20gPT09ICdzdHJpbmcnXG4gICAgICAgID8gc3VjY2VlZChmcm9tIGFzIHN0cmluZylcbiAgICAgICAgOiBmYWlsKGBOb3QgYSBzdHJpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG59KTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgY29udmVydGVyIHdoaWNoIGNvbnZlcnRzIHVua25vd24gdG8gc3RyaW5nLCBhcHBseWluZ1xuICogdGVtcGxhdGUgY29udmVyc2lvbnMgc3VwcGxpZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgb3IgYXQgcnVudGltZSBhcyBjb250ZXh0LlxuICogQHBhcmFtIGRlZmF1bHRDb250ZXh0IG9wdGlvbmFsIGRlZmF1bHQgY29udGV4dCB0byB1c2UgZm9yIHRlbXBsYXRlIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVTdHJpbmcoZGVmYXVsdENvbnRleHQ/OiB1bmtub3duKTogQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcjxzdHJpbmcsIHVua25vd24+KChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4sIGNvbnRleHQ/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYSBzdHJpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gTXVzdGFjaGUucmVuZGVyKGZyb20sIGNvbnRleHQpKTtcbiAgICB9LCBkZWZhdWx0Q29udGV4dCk7XG59XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIG9uZSBvZiBhIHNldCBvZiBzdXBwbGllZCBlbnVtZXJhdGVkIHZhbHVlcy4gQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqIEFsbG93ZWQgZW51bWVyYXRlZCB2YWx1ZXMgY2FuIGFsc28gYmUgc3VwcGxpZWQgYXMgY29udGV4dCBhdCBjb252ZXJzaW9uIHRpbWUuXG4gKiBAcGFyYW0gdmFsdWVzIEFycmF5IG9mIGFsbG93ZWQgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnVtZXJhdGVkVmFsdWU8VD4odmFsdWVzOiBUW10pOiBDb252ZXJ0ZXI8VCwgVFtdPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIFRbXT4sIGNvbnRleHQ/OiBUW10pOiBSZXN1bHQ8VD4gPT4ge1xuICAgICAgICBjb25zdCB2ID0gY29udGV4dCA/PyB2YWx1ZXM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdi5pbmRleE9mKGZyb20gYXMgVCk7XG4gICAgICAgIHJldHVybiAoaW5kZXggPj0gMCA/IHN1Y2NlZWQodltpbmRleF0pIDogZmFpbChgSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgdW5rbm93biB0byBhIG51bWJlci4gIE51bWJlcnMgYW5kIHN0cmluZ3NcbiAqIHdpdGggYSBudW1lcmljIGZvcm1hdCBzdWNjZWVkLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IG5ldyBCYXNlQ29udmVydGVyPG51bWJlcj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG51bTogbnVtYmVyID0gKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJyA/IE51bWJlcihmcm9tKSA6IE5hTik7XG4gICAgICAgIHJldHVybiBpc05hTihudW0pXG4gICAgICAgICAgICA/IGZhaWwoYE5vdCBhIG51bWJlcjogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKVxuICAgICAgICAgICAgOiBzdWNjZWVkKG51bSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIGJvb2xlYW4uIEJvb2xlYW4gdmFsdWVzIG9yIHRoZVxuICogY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmdzICd0cnVlJyBhbmQgJ2ZhbHNlJyBzdWNjZWVkLiAgQW55dGhpbmdcbiAqIGVsc2UgZmFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBib29sZWFuID0gbmV3IEJhc2VDb252ZXJ0ZXI8Ym9vbGVhbj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChmcm9tLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3RydWUnOiByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZhbHNlJzogcmV0dXJuIHN1Y2NlZWQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWlsKGBOb3QgYSBib29sZWFuOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBzdHJpbmcgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICogYXJlIHJldHVybmVkLiAgQW55dGhpbmcgZWxzZSByZXR1cm5zIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbFN0cmluZyA9IHN0cmluZy5vcHRpb25hbCgpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb252ZXJ0ZXIgd2hpY2ggY29udmVydHMgYW55IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3NcbiAqIGJ5IHNlcGFyYXRpbmcgYXQgYSBzdXBwbGllZCBkZWxpbWl0ZXIuIERlbGltZXRlciBtYXkgYWxzbyBiZSBzdXBwbGllZFxuICogYXMgY29udGV4dCBhdCBjb252ZXJzaW9uIHRpbWUuXG4gKiBAcGFyYW0gZGVsaW1pdGVyIFRoZSBkZWxpbWl0ZXIgYXQgd2hpY2ggdG8gc3BsaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpbWl0ZWRTdHJpbmcoZGVsaW1pdGVyOiBzdHJpbmcsIG9wdGlvbnM6ICdmaWx0ZXJlZCd8J2FsbCcgPSAnZmlsdGVyZWQnKTogQ29udmVydGVyPHN0cmluZ1tdLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8c3RyaW5nW10sIHN0cmluZz4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8c3RyaW5nW10sIHN0cmluZz4sIGNvbnRleHQ/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaW5nLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIGxldCBzdHJpbmdzID0gcmVzdWx0LnZhbHVlLnNwbGl0KGNvbnRleHQgPz8gZGVsaW1pdGVyKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgIHN0cmluZ3MgPSBzdHJpbmdzLmZpbHRlcigocykgPT4gKHMudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHN0cmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IGFuIGlzbyBmb3JtYXR0ZWQgc3RyaW5nLCBhIG51bWJlciBvciBhIERhdGUgb2JqZWN0IHRvIGEgRGF0ZSBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGlzb0RhdGUgPSBuZXcgQmFzZUNvbnZlcnRlcjxEYXRlPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSVNPKGZyb20pO1xuICAgICAgICBpZiAoZHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZHQudG9KU0RhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYEludmFsaWQgZGF0ZTogJHtkdC5pbnZhbGlkRXhwbGFuYXRpb259YCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBmcm9tID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChuZXcgRGF0ZShmcm9tKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgJHtKU09OLnN0cmluZ2lmeShmcm9tKX0gdG8gRGF0ZWApO1xufSk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBudW1iZXIgdmFsdWUuIFZhbHVlcyBvZiB0eXBlIG51bWJlclxuICogb3IgbnVtZXJpYyBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkLiBBbnl0aGluZyBlbHNlIHJldHVybnNcbiAqIHN1Y2Nlc3Mgd2l0aCBhbiB1bmRlZmluZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbE51bWJlciA9IG51bWJlci5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYm9vbGVhbiB2YWx1ZS4gVmFsdWVzIG9mIHR5cGUgYm9vbGVhblxuICogb3Igc3RyaW5ncyB0aGF0IG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKSAndHJ1ZScgb3IgJ2ZhbHNlJyBhcmUgY29udmVydGVkXG4gKiBhbmQgcmV0dXJuZWQuICBBbnl0aGluZyBlbHNlIHJldHVybnMgc3VjY2VzcyB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsQm9vbGVhbiA9IGJvb2xlYW4ub3B0aW9uYWwoKTtcblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBwb2x5bW9ycGhpYyBmaWVsZHMuIEludm9rZXMgdGhlIHdyYXBwZWQgY29udmVydGVyc1xuICogaW4gc2VxdWVuY2UsIHJldHVybmluZyB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bCByZXN1bHQuICBSZXR1cm5zIGFuIGVycm9yXG4gKiBpZiBub25lIG9mIHRoZSBzdXBwbGllZCBjb252ZXJ0ZXJzIGNhbiBjb252ZXJ0IHRoZSB2YWx1ZS5cbiAqXG4gKiBJZiBvbkVycm9yIGlzICdpZ25vcmVFcnJvcnMnIChkZWZhdWx0KSwgdGhlbiBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlXG4gKiBjb252ZXJ0ZXJzIGFyZSBpZ25vcmVkIHByb3ZpZGVkIHRoYXQgc29tZSBjb252ZXJ0ZXIgc3VjY2VlZHMuICBJZlxuICogb25FcnJvciBpcyAnZmFpbE9uRXJyb3InLCB0aGVuIGFuIGVycm9yIGZyb20gYW55IGNvbnZlcnRlciBmYWlscyB0aGUgZW50aXJlXG4gKiBjb252ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBjb252ZXJ0ZXJzIEFuIG9yZGVyZWQgbGlzdCBvZiBjb252ZXJ0ZXJzIHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBvbkVycm9yIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25lT2Y8VD4oY29udmVydGVyczogQXJyYXk8Q29udmVydGVyPFQ+Piwgb25FcnJvcjogT25FcnJvciA9ICdpZ25vcmVFcnJvcnMnKTogQ29udmVydGVyPFQ+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob25FcnJvciA9PT0gJ2ZhaWxPbkVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYE5vIG1hdGNoaW5nIGNvbnZlcnRlciBmb3IgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06ICR7ZXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgZm9yIGNvbnZlcnRpbmcgYW4gYXJyYXkgb2YgPFQ+LiAgSWYgb25FcnJvciBpcyAnZmFpbE9uRXJyb3InIChkZWZhdWx0KSxcbiAqIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yXG4gKiBpcyAnaWdub3JlRXJyb3JzJywgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlPZjxULCBUQz11bmRlZmluZWQ+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgb25FcnJvcjogT25FcnJvciA9ICdmYWlsT25FcnJvcicpOiBDb252ZXJ0ZXI8VFtdLCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUW10sIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhbiBhcnJheTogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NlczogVFtdID0gW107XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGZyb20pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGl0ZW0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3Nlcy5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlRXJyb3JzJylcbiAgICAgICAgICAgID8gc3VjY2VlZChzdWNjZXNzZXMpXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBjb252ZXJ0aW5nIHRvIEl0ZW1ycmF5PFQ+LiAgSWYgb25FcnJvciBpcyAnZmFpbE9uRXJyb3InIChkZWZhdWx0KSxcbiAqIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yXG4gKiBpcyAnaWdub3JlRXJyb3JzJywgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kZWRBcnJheU9mPFQsIFRDPXVuZGVmaW5lZD4obGFiZWw6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LCBvbkVycm9yOiBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyk6IENvbnZlcnRlcjxFeHRlbmRlZEFycmF5PFQ+LCBUQz4ge1xuICAgIHJldHVybiBhcnJheU9mKGNvbnZlcnRlciwgb25FcnJvcikubWFwKChpdGVtczogVFtdKSA9PiB7XG4gICAgICAgIHJldHVybiBjYXB0dXJlUmVzdWx0KCgpID0+IG5ldyBFeHRlbmRlZEFycmF5KGxhYmVsLCAuLi5pdGVtcykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgdG8gY29udmVydCB0aGUgc3RyaW5nLWtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IHRvIGEgUmVjb3JkIG9mIFQuXG4gKiBJZiBvbkVycm9yIGlzICdmYWlsJyAoZGVmYXVsdCksICB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkgZWxlbWVudFxuICogY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmIG9uRXJyb3IgaXMgJ2lnbm9yZScgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHJlY29yZFxuICogQHBhcmFtIGlnbm9yZUVycm9ycyBTcGVjaWZpZXMgdHJlYXRtZW50IG9mIHVuY29udmVydGFibGUgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE9mPFQsIFRDPXVuZGVmaW5lZD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LCBvbkVycm9yOiAnZmFpbCd8J2lnbm9yZScgPSAnZmFpbCcpOiBDb252ZXJ0ZXI8UmVjb3JkPHN0cmluZywgVD4sIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFJlY29yZDxzdHJpbmcsIFQ+LCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFQ+ID0ge307XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihrZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQoZnJvbVtrZXldIGFzIHVua25vd24sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSB8fCAob25FcnJvciA9PT0gJ2lnbm9yZScpXG4gICAgICAgICAgICA/IHN1Y2NlZWQocmVjb3JkKVxuICAgICAgICAgICAgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IHRoZSBzdHJpbmcta2V5ZWQgcHJvcGVydGllcyBvZiBhbiBvYmplY3QgdG8gYSBNYXAgb2YgVC5cbiAqIElmIG9uRXJyb3IgaXMgJ2ZhaWwnIChkZWZhdWx0KSwgIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50XG4gKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgb25FcnJvciBpcyAnaWdub3JlJyBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgcmVjb3JkXG4gKiBAcGFyYW0gaWdub3JlRXJyb3JzIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0YWJsZSBlbGVtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwT2Y8VCwgVEM9dW5kZWZpbmVkPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sIG9uRXJyb3I6ICdmYWlsJ3wnaWdub3JlJyA9ICdmYWlsJyk6IENvbnZlcnRlcjxNYXA8c3RyaW5nLCBUPiwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8TWFwPHN0cmluZywgVD4sIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICgodHlwZW9mIGZyb20gIT09ICdvYmplY3QnKSB8fCBBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGEgc3RyaW5nLWtleWVkIG9iamVjdDogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb21ba2V5XSBhcyB1bmtub3duLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCByZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgfHwgKG9uRXJyb3IgPT09ICdpZ25vcmUnKVxuICAgICAgICAgICAgPyBzdWNjZWVkKG1hcClcbiAgICAgICAgICAgIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgYW5kIGNvbnZlcnQgYSBmaWVsZCBmcm9tIGFuIG9iamVjdC4gU3VjY2VlZHMgYW5kIHJldHVybnNcbiAqIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaWYgdGhlIGZpZWxkIGV4aXN0cyBpbiB0aGUgc3VwcGxpZWQgcGFyYW1ldGVyIGFuZCBjYW4gYmUgY29udmVydGVkLlxuICogRmFpbHMgb3RoZXJ3aXNlLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGQ8VCwgVEM9dW5kZWZpbmVkPihuYW1lOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxULCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdvYmplY3QnICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKG5hbWUsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0sIGNvbnRleHQpLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgRmllbGQgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYEZpZWxkICR7bmFtZX0gbm90IGZvdW5kIGluOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGFuZCBjb252ZXJ0IGFuIG9wdGlvbmFsIGZpZWxkIGZyb20gYW4gb2JqZWN0LiBTdWNjZWVkc1xuICogYW5kIHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpZiB0aGUgZmllbGQgZXhpc3RzIGluIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgYW5kIGNhblxuICogYmUgY29udmVydGVkLiBTdWNjZWVkcyB3aXRoIHVuZGVmaW5lZCBpZiB0aGUgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBidXQgdGhlIG5hbWVkIGZpZWxkXG4gKiBpcyBub3QgcHJlc2VudC4gRmFpbHMgaWYgdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0LlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGV4dHJhY3RlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgZXh0cmFjdGVkIGZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxGaWVsZDxULCBUQz11bmRlZmluZWQ+KG5hbWU6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxUfHVuZGVmaW5lZCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0JyAmJiBmcm9tICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihuYW1lLCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb21bbmFtZV0sIGNvbnRleHQpLm9uRmFpbHVyZSgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtuYW1lfTogJHttZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCBvciBpbnB1dCB3YXMgdW5kZWZpbmVkIHdlXG4gICAgICAgICAgICAgICAgLy8gc3VjY2VlZCB3aXRoICd1bmRlZmluZWQnLCBidXQgd2UgcHJvcGFnYXRlIGFjdHVhbFxuICAgICAgICAgICAgICAgIC8vIGZhaWx1cmVzLlxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgfHwgKGZyb21bbmFtZV0gIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCBmaWVsZCBcIiR7bmFtZX1cIiBmcm9tIG5vbi1vYmplY3QgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgRmllbGRDb252ZXJ0ZXJzPFQ+ID0geyBbIGtleSBpbiBrZXlvZiBUIF06IENvbnZlcnRlcjxUW2tleV0+IH07XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RDb252ZXJ0ZXI8VD4gZXh0ZW5kcyBCYXNlQ29udmVydGVyPFQ+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD47XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbmFsRmllbGRzOiAoa2V5b2YgVClbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxUPiwgb3B0aW9uYWw/OiAoa2V5b2YgVClbXSkge1xuICAgICAgICBzdXBlcigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50IGJ1ZyB0aGlua3Mga2V5IGlzIHVzZWQgYmVmb3JlIGRlZmluZWRcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBba2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc09wdGlvbmFsID0gb3B0aW9uYWw/LmluY2x1ZGVzKGtleSkgPz8gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzT3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9uYWxGaWVsZChrZXksIGZpZWxkc1trZXldKS5jb252ZXJ0KGZyb20pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkKGtleSwgZmllbGRzW2tleV0pLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApID8gc3VjY2VlZChjb252ZXJ0ZWQpIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgdGhpcy5vcHRpb25hbEZpZWxkcyA9IG9wdGlvbmFsID8/IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJ0aWFsKG9wdGlvbmFsPzogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPj4ge1xuICAgICAgICByZXR1cm4gbmV3IE9iamVjdENvbnZlcnRlcjxQYXJ0aWFsPFQ+Pih0aGlzLmZpZWxkcyBhcyBGaWVsZENvbnZlcnRlcnM8UGFydGlhbDxUPj4sIG9wdGlvbmFsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUGFydGlhbChhZGRPcHRpb25hbEZpZWxkczogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8UGFydGlhbDxUPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJ0aWFsKFsuLi50aGlzLm9wdGlvbmFsRmllbGRzLCAuLi5hZGRPcHRpb25hbEZpZWxkc10pO1xuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gY29udmVydCBhbiBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBzaGFwZS4gVGhlIHNvdXJjZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0IHdpdGhcbiAqIGtleSBuYW1lcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHRhcmdldCBvYmplY3QgYW5kIHRoZSBhcHByb3ByaWF0ZSBjb3JyZXNwb25kaW5nIGNvbnZlcnRlclxuICogYXMgdGhlIHByb3BlcnR5IHZhbHVlLiBJZiBhbGwgb2YgdGhlIHJlcXVlc3RlZCBmaWVsZHMgZXhpc3QgYW5kIGNhbiBiZSBjb252ZXJ0ZWQsIHJldHVybnMgYVxuICogbmV3IG9iamVjdCB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWVzIHVuZGVyIHRoZSBvcmlnaW5hbCBrZXkgbmFtZXMuICBJZiBhbnkgZmllbGRzIGRvIG5vdCBleGlzdFxuICogb3IgY2Fubm90IGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLlxuICpcbiAqIEZpZWxkcyB0aGF0IHN1Y2NlZWQgYnV0IGNvbnZlcnQgdG8gdW5kZWZpbmVkIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdCBvYmplY3QgYnV0IGRvIG5vdFxuICogZmFpbCB0aGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBmaWVsZHMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGVmaW5pbmcgdGhlIHNoYXBlIGFuZCBjb252ZXJ0ZXJzIHRvIGJlIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3Q8VD4oZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD4sIG9wdGlvbmFsPzogKGtleW9mIFQpW10pOiBPYmplY3RDb252ZXJ0ZXI8VD4ge1xuICAgIHJldHVybiBuZXcgT2JqZWN0Q29udmVydGVyKGZpZWxkcywgb3B0aW9uYWwpO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBjb252ZXJ0IGFuIG9iamVjdCB0byBhIG5ldyBvYmplY3Qgd2l0aCBhIGRpZmZlcmVudCBzaGFwZS4gVGhlIHNvdXJjZSBwYXJhbWV0ZXIgaXNcbiAqIGFuIG9iamVjdCB3aXRoIGtleSBuYW1lcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHRhcmdldCBvYmplY3QsIGFuZCBhbiBhcHByb3JpYXRlIF9maWVsZF9cbiAqIGNvbnZlcnRlciB0aGF0IHdpbGwgZXh0cmFjdCBhbmQgY29udmVydCBhIHNpbmdsZSBmaWVsZCBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICpcbiAqIElmIGFsbCBvZiB0aGUgZXh0cmFjdGVkIGZpZWxkcyBleGlzdCBhbmQgY2FuIGJlIGNvbnZlcnRlZCwgcmV0dXJucyBhIG5ldyBvYmplY3Qgd2l0aCB0aGVcbiAqIGNvbnZlcnRlZCB2YWx1ZXMgdW5kZXIgdGhlIG9yaWdpbmFsIGtleSBuYW1lcy4gIElmIGFueSBmaWVsZHMgdG8gYmUgZXh0cmFjdGVkIGRvIG5vdCBleGlzdFxuICogb3IgY2Fubm90IGJlIGNvbnZlcnRlZCwgdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzLlxuICpcbiAqIEZpZWxkcyB0aGF0IHN1Y2NlZWQgYnV0IGNvbnZlcnQgdG8gdW5kZWZpbmVkIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdCBvYmplY3QgYnV0IGRvIG5vdFxuICogZmFpbCB0aGUgY29udmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gZmllbGRzIEFuIG9iamVjdCBkZWZpbmluZyB0aGUgc2hhcGUgb2YgdGhlIHRhcmdldCBvYmplY3QgYW5kIHRoZSBmaWVsZCBjb252ZXJ0ZXJzXG4gKiB0byBiZSB1c2VkIHRvIGNvbnN0cnVjdCBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybTxUPihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxUPik6IENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7fSBhcyB7IFsga2V5IGluIGtleW9mIFRdOiBUW2tleV0gfTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZmllbGRzW2tleV0uY29udmVydChmcm9tKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIChyZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSA/IHN1Y2NlZWQoY29udmVydGVkKSA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnZlcnQgYSByYW5nZSBvZiBzb21lIG90aGVyIGNvbXBhcmFibGUgdHlwZVxuICogQHBhcmFtIGNvbnZlcnRlciBDb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IG1pbiBhbmQgbWF4IGV4dGVudCBvZiB0aGUgcmFpZFxuICogQHBhcmFtIGNvbnN0cnVjdG9yIE9wdGlvbmFsIHN0YXRpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZVR5cGVPZjxULCBSVCBleHRlbmRzIFJhbmdlT2Y8VD4+KGNvbnZlcnRlcjogQ29udmVydGVyPFQ+LCBjb25zdHJ1Y3RvcjogKGluaXQ6IFJhbmdlT2ZQcm9wZXJ0aWVzPFQ+KSA9PiBSZXN1bHQ8UlQ+KTogQ29udmVydGVyPFJUPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9iamVjdCh7XG4gICAgICAgICAgICBtaW46IGNvbnZlcnRlcixcbiAgICAgICAgICAgIG1heDogY29udmVydGVyLFxuICAgICAgICB9LCBbJ21pbicsICdtYXgnXSkuY29udmVydChmcm9tKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKHsgbWluOiByZXN1bHQudmFsdWUubWluLCBtYXg6IHJlc3VsdC52YWx1ZS5tYXggfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0Lm1lc3NhZ2UpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VPZjxUPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxUPik6IENvbnZlcnRlcjxSYW5nZU9mPFQ+PiB7XG4gICAgcmV0dXJuIHJhbmdlVHlwZU9mPFQsIFJhbmdlT2Y8VD4+KGNvbnZlcnRlciwgUmFuZ2VPZi5jcmVhdGVSYW5nZSk7XG59XG4iXX0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF1RDtBQUN2RCx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBRWhFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsd0RBQWdDO0FBQ2hDLG1DQUFrQztBQUlsQzs7O0dBR0c7QUFDVSxRQUFBLE1BQU0sR0FBRyxJQUFJLHlCQUFhLENBQVMsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM5RCxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLGdCQUFPLENBQUMsSUFBYyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxhQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUF3QjtJQUNuRCxPQUFPLElBQUkseUJBQWEsQ0FBa0IsQ0FBQyxJQUFhLEVBQUUsS0FBaUMsRUFBRSxPQUFpQixFQUFFLEVBQUU7UUFDOUcsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDMUIsT0FBTyxhQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxzQkFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBUEQsd0NBT0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFJLE1BQVc7SUFDMUMsT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsS0FBd0IsRUFBRSxPQUFhLEVBQWEsRUFBRTtRQUMzRixNQUFNLENBQUMsR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxNQUFNLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFTLENBQUMsQ0FBQztRQUNuQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBSSxDQUFDLDRCQUE0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQU5ELDBDQU1DO0FBRUQ7OztHQUdHO0FBQ1UsUUFBQSxNQUFNLEdBQUcsSUFBSSx5QkFBYSxDQUFTLENBQUMsSUFBYSxFQUFFLEVBQUU7SUFDOUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDMUIsTUFBTSxHQUFHLEdBQVcsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEUsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLGFBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9DLENBQUMsQ0FBQyxnQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ3RCO0lBQ0QsT0FBTyxnQkFBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNVLFFBQUEsT0FBTyxHQUFHLElBQUkseUJBQWEsQ0FBVSxDQUFDLElBQWEsRUFBRSxFQUFFO0lBQ2hFLElBQUksT0FBTyxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQzNCLE9BQU8sZ0JBQU8sQ0FBQyxJQUFlLENBQUMsQ0FBQztLQUNuQztTQUNJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQy9CLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3hCLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxnQkFBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxnQkFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3ZDO0tBQ0o7SUFDRCxPQUFPLGFBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQyxDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxjQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFFaEQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixlQUFlLENBQUMsU0FBaUIsRUFBRSxVQUE0QixVQUFVO0lBQ3JGLE9BQU8sSUFBSSx5QkFBYSxDQUFtQixDQUFDLElBQWEsRUFBRSxLQUFrQyxFQUFFLE9BQWdCLEVBQUUsRUFBRTtRQUMvRyxNQUFNLE1BQU0sR0FBRyxjQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtnQkFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsT0FBTyxnQkFBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsT0FBTyxhQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVpELDBDQVlDO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLE9BQU8sR0FBRyxJQUFJLHlCQUFhLENBQU8sQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUM3RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUMxQixNQUFNLEVBQUUsR0FBRyxnQkFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLGdCQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDakM7UUFDRCxPQUFPLGFBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztLQUN6RDtTQUNJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQy9CLE9BQU8sZ0JBQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ2xDO1NBQ0ksSUFBSSxJQUFJLFlBQVksSUFBSSxFQUFFO1FBQzNCLE9BQU8sZ0JBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN4QjtJQUNELE9BQU8sYUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNsRSxDQUFDLENBQUMsQ0FBQztBQUVIOzs7O0dBSUc7QUFDVSxRQUFBLGNBQWMsR0FBRyxjQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFFaEQ7Ozs7R0FJRztBQUNVLFFBQUEsZUFBZSxHQUFHLGVBQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixLQUFLLENBQWdCLFVBQW1DLEVBQUUsVUFBbUIsY0FBYztJQUN2RyxPQUFPLElBQUkseUJBQWEsQ0FBQyxDQUFDLElBQWEsRUFBRSxLQUFLLEVBQUUsT0FBWSxFQUFFLEVBQUU7UUFDNUQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBQzVCLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO1lBQ2hDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsRUFBRTtnQkFDcEQsT0FBTyxNQUFNLENBQUM7YUFDakI7WUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDcEIsSUFBSSxPQUFPLEtBQUssYUFBYSxFQUFFO29CQUMzQixPQUFPLE1BQU0sQ0FBQztpQkFDakI7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDL0I7U0FDSjtRQUNELE9BQU8sYUFBSSxDQUFDLDZCQUE2QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNGLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWxCRCxzQkFrQkM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixPQUFPLENBQWtCLFNBQTJCLEVBQUUsVUFBbUIsYUFBYTtJQUNsRyxPQUFPLElBQUkseUJBQWEsQ0FBQyxDQUFDLElBQWEsRUFBRSxLQUF5QixFQUFFLE9BQVksRUFBRSxFQUFFO1FBQ2hGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLE9BQU8sYUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUVELE1BQU0sU0FBUyxHQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDckIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7Z0JBQ2xELFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hDO2lCQUNJLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMvQjtTQUNKO1FBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssY0FBYyxDQUFDO1lBQ3hELENBQUMsQ0FBQyxnQkFBTyxDQUFDLFNBQVMsQ0FBQztZQUNwQixDQUFDLENBQUMsYUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUF0QkQsMEJBc0JDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZUFBZSxDQUFrQixLQUFhLEVBQUUsU0FBMkIsRUFBRSxVQUFtQixhQUFhO0lBQ3pILE9BQU8sT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtRQUNsRCxPQUFPLHNCQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSw2QkFBYSxDQUFDLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBSkQsMENBSUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixRQUFRLENBQWtCLFNBQTJCLEVBQUUsVUFBMkIsTUFBTTtJQUNwRyxPQUFPLElBQUkseUJBQWEsQ0FBQyxDQUFDLElBQWEsRUFBRSxLQUF1QyxFQUFFLE9BQVksRUFBRSxFQUFFO1FBQzlGLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25ELE9BQU8sYUFBSSxDQUFDLDhCQUE4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNyRTtRQUVELE1BQU0sTUFBTSxHQUFzQixFQUFFLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3BCLElBQUksZUFBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDcEIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDOUI7cUJBQ0k7b0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQy9CO2FBQ0o7U0FDSjtRQUVELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQztZQUNsRCxDQUFDLENBQUMsZ0JBQU8sQ0FBQyxNQUFNLENBQUM7WUFDakIsQ0FBQyxDQUFDLGFBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBekJELDRCQXlCQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLEtBQUssQ0FBa0IsU0FBMkIsRUFBRSxVQUEyQixNQUFNO0lBQ2pHLE9BQU8sSUFBSSx5QkFBYSxDQUFDLENBQUMsSUFBYSxFQUFFLEtBQW9DLEVBQUUsT0FBWSxFQUFFLEVBQUU7UUFDM0YsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkQsT0FBTyxhQUFJLENBQUMsOEJBQThCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3JFO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQWEsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFNUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxlQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNwQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUU7b0JBQ3BCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDOUI7cUJBQ0k7b0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQy9CO2FBQ0o7U0FDSjtRQUVELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQztZQUNsRCxDQUFDLENBQUMsZ0JBQU8sQ0FBQyxHQUFHLENBQUM7WUFDZCxDQUFDLENBQUMsYUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUF6QkQsc0JBeUJDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsS0FBSyxDQUFrQixJQUFZLEVBQUUsU0FBMkI7SUFDNUUsT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsS0FBdUIsRUFBRSxPQUFZLEVBQUUsRUFBRTtRQUM5RSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQzNDLElBQUksZUFBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDckIsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDaEUsT0FBTyxhQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxDQUFDLENBQUM7YUFDTjtZQUNELE9BQU8sYUFBSSxDQUFDLFNBQVMsSUFBSSxrQkFBa0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEU7UUFDRCxPQUFPLGFBQUksQ0FBQyx5QkFBeUIsSUFBSSxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBWkQsc0JBWUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsYUFBYSxDQUFrQixJQUFZLEVBQUUsU0FBMkI7SUFDcEYsT0FBTyxJQUFJLHlCQUFhLENBQUMsQ0FBQyxJQUFhLEVBQUUsS0FBaUMsRUFBRSxPQUFZLEVBQUUsRUFBRTtRQUN4RixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQzNDLElBQUksZUFBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDckIsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQ3hFLE9BQU8sYUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQyxDQUFDO2dCQUVILHlEQUF5RDtnQkFDekQsb0RBQW9EO2dCQUNwRCxZQUFZO2dCQUNaLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxFQUFFO29CQUNsRCxPQUFPLE1BQU0sQ0FBQztpQkFDakI7YUFDSjtZQUNELE9BQU8sZ0JBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM3QjtRQUNELE9BQU8sYUFBSSxDQUFDLHlCQUF5QixJQUFJLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFuQkQsc0NBbUJDO0FBSUQsTUFBYSxlQUErQixTQUFRLHlCQUFvQjtJQUlwRSxZQUFtQixNQUE4QixFQUFFLFFBQXNCO1FBQ3JFLEtBQUssQ0FBQyxDQUFDLElBQWEsRUFBRSxLQUFLLEVBQUUsT0FBWSxFQUFFLEVBQUU7O1lBQ3pDLCtDQUErQztZQUMvQyxnREFBZ0Q7WUFDaEQsTUFBTSxTQUFTLEdBQUcsRUFBa0MsQ0FBQztZQUNyRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7WUFDNUIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUU7Z0JBQ3RCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNiLE1BQU0sVUFBVSxTQUFHLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxRQUFRLENBQUMsR0FBRyxvQ0FBSyxLQUFLLENBQUM7b0JBQ3BELE1BQU0sTUFBTSxHQUFHLFVBQVU7d0JBQ3JCLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO3dCQUN4RCxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNyRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLEVBQUU7d0JBQ3BELFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO3FCQUNqQzt5QkFDSSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTt3QkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQy9CO2lCQUNKO2FBQ0o7WUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLEdBQUksRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFTSxPQUFPLENBQUMsUUFBc0I7UUFDakMsT0FBTyxJQUFJLGVBQWUsQ0FBaUIsSUFBSSxDQUFDLE1BQXlDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUVNLFVBQVUsQ0FBQyxpQkFBOEI7UUFDNUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7Q0FDSjtBQXRDRCwwQ0FzQ0M7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsTUFBTSxDQUFJLE1BQTBCLEVBQUUsUUFBc0I7SUFDeEUsT0FBTyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUZELHdCQUVDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFnQixTQUFTLENBQWdCLE1BQThCO0lBQ25FLE9BQU8sSUFBSSx5QkFBYSxDQUFDLENBQUMsSUFBYSxFQUFFLEtBQUssRUFBRSxPQUFZLEVBQUUsRUFBRTtRQUM1RCwrQ0FBK0M7UUFDL0MsZ0RBQWdEO1FBQ2hELE1BQU0sU0FBUyxHQUFHLEVBQW1DLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO1FBRTVCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFO1lBQ3RCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLEVBQUU7b0JBQ3BELFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUNqQztxQkFDSSxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQy9CO2FBQ0o7U0FDSjtRQUVELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQXJCRCw4QkFxQkM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsV0FBVyxDQUF1QyxTQUEyQixFQUFFLFdBQXVEO0lBQ2xKLE9BQU8sSUFBSSx5QkFBYSxDQUFDLENBQUMsSUFBYSxFQUFFLEtBQUssRUFBRSxPQUFZLEVBQUUsRUFBRTtRQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDbEIsR0FBRyxFQUFFLFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztTQUNqQixFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixPQUFPLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3hFO1FBQ0QsT0FBTyxhQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQVhELGtDQVdDO0FBRUQsU0FBZ0IsT0FBTyxDQUFnQixTQUEyQjtJQUM5RCxPQUFPLFdBQVcsQ0FBb0IsU0FBUyxFQUFFLGlCQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUZELDBCQUVDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEJhc2VDb252ZXJ0ZXIsIENvbnZlcnRlciB9IGZyb20gJy4vY29udmVydGVyJztcbmltcG9ydCB7IFJhbmdlT2YsIFJhbmdlT2ZQcm9wZXJ0aWVzIH0gZnJvbSAnLi9yYW5nZU9mJztcbmltcG9ydCB7IFJlc3VsdCwgY2FwdHVyZVJlc3VsdCwgZmFpbCwgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcblxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgeyBFeHRlbmRlZEFycmF5IH0gZnJvbSAnLi9leHRlbmRlZEFycmF5JztcbmltcG9ydCBNdXN0YWNoZSBmcm9tICdtdXN0YWNoZSc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgT25FcnJvciA9ICdmYWlsT25FcnJvcicgfCAnaWdub3JlRXJyb3JzJztcblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IHVua25vd24gdG8gc3RyaW5nLiBWYWx1ZXMgb2YgdHlwZVxuICogc3RyaW5nIHN1Y2NlZWQuICBBbnl0aGluZyBlbHNlIGZhaWxzLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nID0gbmV3IEJhc2VDb252ZXJ0ZXI8c3RyaW5nPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBzdWNjZWVkKGZyb20gYXMgc3RyaW5nKVxuICAgICAgICA6IGZhaWwoYE5vdCBhIHN0cmluZzogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbn0pO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBjb252ZXJ0ZXIgd2hpY2ggY29udmVydHMgdW5rbm93biB0byBzdHJpbmcsIGFwcGx5aW5nXG4gKiB0ZW1wbGF0ZSBjb252ZXJzaW9ucyBzdXBwbGllZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSBvciBhdCBydW50aW1lIGFzIGNvbnRleHQuXG4gKiBAcGFyYW0gZGVmYXVsdENvbnRleHQgb3B0aW9uYWwgZGVmYXVsdCBjb250ZXh0IHRvIHVzZSBmb3IgdGVtcGxhdGUgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZVN0cmluZyhkZWZhdWx0Q29udGV4dD86IHVua25vd24pOiBDb252ZXJ0ZXI8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8c3RyaW5nLCB1bmtub3duPiwgY29udGV4dD86IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZzogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBNdXN0YWNoZS5yZW5kZXIoZnJvbSwgY29udGV4dCkpO1xuICAgIH0sIGRlZmF1bHRDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IHVua25vd24gdG8gb25lIG9mIGEgc2V0IG9mIHN1cHBsaWVkIGVudW1lcmF0ZWQgdmFsdWVzLiBBbnl0aGluZyBlbHNlIGZhaWxzLlxuICogQWxsb3dlZCBlbnVtZXJhdGVkIHZhbHVlcyBjYW4gYWxzbyBiZSBzdXBwbGllZCBhcyBjb250ZXh0IGF0IGNvbnZlcnNpb24gdGltZS5cbiAqIEBwYXJhbSB2YWx1ZXMgQXJyYXkgb2YgYWxsb3dlZCB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudW1lcmF0ZWRWYWx1ZTxUPih2YWx1ZXM6IFRbXSk6IENvbnZlcnRlcjxULCBUW10+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgVFtdPiwgY29udGV4dD86IFRbXSk6IFJlc3VsdDxUPiA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBjb250ZXh0ID8/IHZhbHVlcztcbiAgICAgICAgY29uc3QgaW5kZXggPSB2LmluZGV4T2YoZnJvbSBhcyBUKTtcbiAgICAgICAgcmV0dXJuIChpbmRleCA+PSAwID8gc3VjY2VlZCh2W2luZGV4XSkgOiBmYWlsKGBJbnZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIGEgbnVtYmVyLiAgTnVtYmVycyBhbmQgc3RyaW5nc1xuICogd2l0aCBhIG51bWVyaWMgZm9ybWF0IHN1Y2NlZWQuICBBbnl0aGluZyBlbHNlIGZhaWxzLlxuICovXG5leHBvcnQgY29uc3QgbnVtYmVyID0gbmV3IEJhc2VDb252ZXJ0ZXI8bnVtYmVyPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgbnVtOiBudW1iZXIgPSAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnID8gTnVtYmVyKGZyb20pIDogTmFOKTtcbiAgICAgICAgcmV0dXJuIGlzTmFOKG51bSlcbiAgICAgICAgICAgID8gZmFpbChgTm90IGEgbnVtYmVyOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApXG4gICAgICAgICAgICA6IHN1Y2NlZWQobnVtKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1Y2NlZWQoZnJvbSk7XG59KTtcblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IHVua25vd24gdG8gYm9vbGVhbi4gQm9vbGVhbiB2YWx1ZXMgb3IgdGhlXG4gKiBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZ3MgJ3RydWUnIGFuZCAnZmFsc2UnIHN1Y2NlZWQuICBBbnl0aGluZ1xuICogZWxzZSBmYWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSBuZXcgQmFzZUNvbnZlcnRlcjxib29sZWFuPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20gYXMgYm9vbGVhbik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJykge1xuICAgICAgICBzd2l0Y2ggKGZyb20udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSAndHJ1ZSc6IHJldHVybiBzdWNjZWVkKHRydWUpO1xuICAgICAgICAgICAgY2FzZSAnZmFsc2UnOiByZXR1cm4gc3VjY2VlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhaWwoYE5vdCBhIGJvb2xlYW46ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG59KTtcblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IGFuIG9wdGlvbmFsIHN0cmluZyB2YWx1ZS4gVmFsdWVzIG9mIHR5cGUgc3RyaW5nXG4gKiBhcmUgcmV0dXJuZWQuICBBbnl0aGluZyBlbHNlIHJldHVybnMgc3VjY2VzcyB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsU3RyaW5nID0gc3RyaW5nLm9wdGlvbmFsKCk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbnZlcnRlciB3aGljaCBjb252ZXJ0cyBhbnkgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICogYnkgc2VwYXJhdGluZyBhdCBhIHN1cHBsaWVkIGRlbGltaXRlci4gRGVsaW1ldGVyIG1heSBhbHNvIGJlIHN1cHBsaWVkXG4gKiBhcyBjb250ZXh0IGF0IGNvbnZlcnNpb24gdGltZS5cbiAqIEBwYXJhbSBkZWxpbWl0ZXIgVGhlIGRlbGltaXRlciBhdCB3aGljaCB0byBzcGxpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGltaXRlZFN0cmluZyhkZWxpbWl0ZXI6IHN0cmluZywgb3B0aW9uczogJ2ZpbHRlcmVkJ3wnYWxsJyA9ICdmaWx0ZXJlZCcpOiBDb252ZXJ0ZXI8c3RyaW5nW10sIHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcjxzdHJpbmdbXSwgc3RyaW5nPigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxzdHJpbmdbXSwgc3RyaW5nPiwgY29udGV4dD86IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdHJpbmcuY29udmVydChmcm9tKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgbGV0IHN0cmluZ3MgPSByZXN1bHQudmFsdWUuc3BsaXQoY29udGV4dCA/PyBkZWxpbWl0ZXIpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMgIT09ICdhbGwnKSB7XG4gICAgICAgICAgICAgICAgc3RyaW5ncyA9IHN0cmluZ3MuZmlsdGVyKChzKSA9PiAocy50cmltKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoc3RyaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0Lm1lc3NhZ2UpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgY29udmVydGVyIHRvIGNvbnZlcnQgYW4gaXNvIGZvcm1hdHRlZCBzdHJpbmcsIGEgbnVtYmVyIG9yIGEgRGF0ZSBvYmplY3QgdG8gYSBEYXRlIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgaXNvRGF0ZSA9IG5ldyBCYXNlQ29udmVydGVyPERhdGU+KChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBkdCA9IERhdGVUaW1lLmZyb21JU08oZnJvbSk7XG4gICAgICAgIGlmIChkdC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VjY2VlZChkdC50b0pTRGF0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgSW52YWxpZCBkYXRlOiAke2R0LmludmFsaWRFeHBsYW5hdGlvbn1gKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGZyb20gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKG5ldyBEYXRlKGZyb20pKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZnJvbSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnJvbSk7XG4gICAgfVxuICAgIHJldHVybiBmYWlsKGBDYW5ub3QgY29udmVydCAke0pTT04uc3RyaW5naWZ5KGZyb20pfSB0byBEYXRlYCk7XG59KTtcblxuLyoqXG4gKiBBIGNvbnZlcnRlciB0byBjb252ZXJ0IGFuIG9wdGlvbmFsIG51bWJlciB2YWx1ZS4gVmFsdWVzIG9mIHR5cGUgbnVtYmVyXG4gKiBvciBudW1lcmljIHN0cmluZ3MgYXJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQuIEFueXRoaW5nIGVsc2UgcmV0dXJuc1xuICogc3VjY2VzcyB3aXRoIGFuIHVuZGVmaW5lZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbmFsTnVtYmVyID0gbnVtYmVyLm9wdGlvbmFsKCk7XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCBhbiBvcHRpb25hbCBib29sZWFuIHZhbHVlLiBWYWx1ZXMgb2YgdHlwZSBib29sZWFuXG4gKiBvciBzdHJpbmdzIHRoYXQgbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUpICd0cnVlJyBvciAnZmFsc2UnIGFyZSBjb252ZXJ0ZWRcbiAqIGFuZCByZXR1cm5lZC4gIEFueXRoaW5nIGVsc2UgcmV0dXJucyBzdWNjZXNzIHdpdGggYW4gdW5kZWZpbmVkIHZhbHVlLlxuICovXG5leHBvcnQgY29uc3Qgb3B0aW9uYWxCb29sZWFuID0gYm9vbGVhbi5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgZm9yIHBvbHltb3JwaGljIGZpZWxkcy4gSW52b2tlcyB0aGUgd3JhcHBlZCBjb252ZXJ0ZXJzXG4gKiBpbiBzZXF1ZW5jZSwgcmV0dXJuaW5nIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJlc3VsdC4gIFJldHVybnMgYW4gZXJyb3JcbiAqIGlmIG5vbmUgb2YgdGhlIHN1cHBsaWVkIGNvbnZlcnRlcnMgY2FuIGNvbnZlcnQgdGhlIHZhbHVlLlxuICpcbiAqIElmIG9uRXJyb3IgaXMgJ2lnbm9yZUVycm9ycycgKGRlZmF1bHQpLCB0aGVuIGVycm9ycyBmcm9tIGFueSBvZiB0aGVcbiAqIGNvbnZlcnRlcnMgYXJlIGlnbm9yZWQgcHJvdmlkZWQgdGhhdCBzb21lIGNvbnZlcnRlciBzdWNjZWVkcy4gIElmXG4gKiBvbkVycm9yIGlzICdmYWlsT25FcnJvcicsIHRoZW4gYW4gZXJyb3IgZnJvbSBhbnkgY29udmVydGVyIGZhaWxzIHRoZSBlbnRpcmVcbiAqIGNvbnZlcnNpb24uXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlcnMgQW4gb3JkZXJlZCBsaXN0IG9mIGNvbnZlcnRlcnMgdG8gYmUgY29uc2lkZXJlZFxuICogQHBhcmFtIG9uRXJyb3IgU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRhYmxlIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVPZjxULCBUQz11bmtub3duPihjb252ZXJ0ZXJzOiBBcnJheTxDb252ZXJ0ZXI8VCwgVEM+Piwgb25FcnJvcjogT25FcnJvciA9ICdpZ25vcmVFcnJvcnMnKTogQ29udmVydGVyPFQsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjb252ZXJ0ZXIgb2YgY29udmVydGVycykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQoZnJvbSwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIChyZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IgPT09ICdmYWlsT25FcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBObyBtYXRjaGluZyBjb252ZXJ0ZXIgZm9yICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9OiAke2Vycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIGZvciBjb252ZXJ0aW5nIGFuIGFycmF5IG9mIDxUPi4gIElmIG9uRXJyb3IgaXMgJ2ZhaWxPbkVycm9yJyAoZGVmYXVsdCksXG4gKiB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkgZWxlbWVudCBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgb25FcnJvclxuICogaXMgJ2lnbm9yZUVycm9ycycsIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBhcnJheVxuICogQHBhcmFtIGlnbm9yZUVycm9ycyBTcGVjaWZpZXMgdHJlYXRtZW50IG9mIHVuY29udmVydGFibGUgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5T2Y8VCwgVEM9dW5kZWZpbmVkPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sIG9uRXJyb3I6IE9uRXJyb3IgPSAnZmFpbE9uRXJyb3InKTogQ29udmVydGVyPFRbXSwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VFtdLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYW4gYXJyYXk6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWNjZXNzZXM6IFRbXSA9IFtdO1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmcm9tKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChpdGVtLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgcmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzZXMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSB8fCAob25FcnJvciA9PT0gJ2lnbm9yZUVycm9ycycpXG4gICAgICAgICAgICA/IHN1Y2NlZWQoc3VjY2Vzc2VzKVxuICAgICAgICAgICAgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciBmb3IgY29udmVydGluZyB0byBJdGVtcnJheTxUPi4gIElmIG9uRXJyb3IgaXMgJ2ZhaWxPbkVycm9yJyAoZGVmYXVsdCksXG4gKiB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkgZWxlbWVudCBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgb25FcnJvclxuICogaXMgJ2lnbm9yZUVycm9ycycsIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBhcnJheVxuICogQHBhcmFtIGlnbm9yZUVycm9ycyBTcGVjaWZpZXMgdHJlYXRtZW50IG9mIHVuY29udmVydGFibGUgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZGVkQXJyYXlPZjxULCBUQz11bmRlZmluZWQ+KGxhYmVsOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgb25FcnJvcjogT25FcnJvciA9ICdmYWlsT25FcnJvcicpOiBDb252ZXJ0ZXI8RXh0ZW5kZWRBcnJheTxUPiwgVEM+IHtcbiAgICByZXR1cm4gYXJyYXlPZihjb252ZXJ0ZXIsIG9uRXJyb3IpLm1hcCgoaXRlbXM6IFRbXSkgPT4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgRXh0ZW5kZWRBcnJheShsYWJlbCwgLi4uaXRlbXMpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnZlcnQgdGhlIHN0cmluZy1rZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCB0byBhIFJlY29yZCBvZiBULlxuICogSWYgb25FcnJvciBpcyAnZmFpbCcgKGRlZmF1bHQpLCAgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGVsZW1lbnRcbiAqIGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBvbkVycm9yIGlzICdpZ25vcmUnIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSByZWNvcmRcbiAqIEBwYXJhbSBpZ25vcmVFcnJvcnMgU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRhYmxlIGVsZW1lbnRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRPZjxULCBUQz11bmRlZmluZWQ+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgb25FcnJvcjogJ2ZhaWwnfCdpZ25vcmUnID0gJ2ZhaWwnKTogQ29udmVydGVyPFJlY29yZDxzdHJpbmcsIFQ+LCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxSZWNvcmQ8c3RyaW5nLCBUPiwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKCh0eXBlb2YgZnJvbSAhPT0gJ29iamVjdCcpIHx8IEFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYSBzdHJpbmcta2V5ZWQgb2JqZWN0OiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBUPiA9IHt9O1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnZlcnRlci5jb252ZXJ0KGZyb21ba2V5XSBhcyB1bmtub3duLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgfHwgKG9uRXJyb3IgPT09ICdpZ25vcmUnKVxuICAgICAgICAgICAgPyBzdWNjZWVkKHJlY29yZClcbiAgICAgICAgICAgIDogZmFpbChlcnJvcnMuam9pbignXFxuJykpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIHdyYXBwZXIgdG8gY29udmVydCB0aGUgc3RyaW5nLWtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IHRvIGEgTWFwIG9mIFQuXG4gKiBJZiBvbkVycm9yIGlzICdmYWlsJyAoZGVmYXVsdCksICB0aGVuIHRoZSBlbnRpcmUgY29udmVyc2lvbiBmYWlscyBpZiBhbnkgZWxlbWVudFxuICogY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmIG9uRXJyb3IgaXMgJ2lnbm9yZScgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHJlY29yZFxuICogQHBhcmFtIGlnbm9yZUVycm9ycyBTcGVjaWZpZXMgdHJlYXRtZW50IG9mIHVuY29udmVydGFibGUgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcE9mPFQsIFRDPXVuZGVmaW5lZD4oY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+LCBvbkVycm9yOiAnZmFpbCd8J2lnbm9yZScgPSAnZmFpbCcpOiBDb252ZXJ0ZXI8TWFwPHN0cmluZywgVD4sIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPE1hcDxzdHJpbmcsIFQ+LCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoKHR5cGVvZiBmcm9tICE9PSAnb2JqZWN0JykgfHwgQXJyYXkuaXNBcnJheShmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZy1rZXllZCBvYmplY3Q6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgVD4oKTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKGtleSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW2tleV0gYXMgdW5rbm93biwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGtleSwgcmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApIHx8IChvbkVycm9yID09PSAnaWdub3JlJylcbiAgICAgICAgICAgID8gc3VjY2VlZChtYXApXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBleHRyYWN0IGFuZCBjb252ZXJ0IGEgZmllbGQgZnJvbSBhbiBvYmplY3QuIFN1Y2NlZWRzIGFuZCByZXR1cm5zXG4gKiB0aGUgY29udmVydGVkIHZhbHVlIGlmIHRoZSBmaWVsZCBleGlzdHMgaW4gdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBhbmQgY2FuIGJlIGNvbnZlcnRlZC5cbiAqIEZhaWxzIG90aGVyd2lzZS5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4dHJhY3RlZCBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkPFQsIFRDPXVuZGVmaW5lZD4obmFtZTogc3RyaW5nLCBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4pOiBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0JyAmJiBmcm9tICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihuYW1lLCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tW25hbWVdLCBjb250ZXh0KS5vbkZhaWx1cmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYEZpZWxkICR7bmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBGaWVsZCAke25hbWV9IG5vdCBmb3VuZCBpbjogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgZmllbGQgXCIke25hbWV9XCIgZnJvbSBub24tb2JqZWN0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCBhbmQgY29udmVydCBhbiBvcHRpb25hbCBmaWVsZCBmcm9tIGFuIG9iamVjdC4gU3VjY2VlZHNcbiAqIGFuZCByZXR1cm5zIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaWYgdGhlIGZpZWxkIGV4aXN0cyBpbiB0aGUgc3VwcGxpZWQgcGFyYW1ldGVyIGFuZCBjYW5cbiAqIGJlIGNvbnZlcnRlZC4gU3VjY2VlZHMgd2l0aCB1bmRlZmluZWQgaWYgdGhlIHBhcmFtZXRlciBpcyBhbiBvYmplY3QgYnV0IHRoZSBuYW1lZCBmaWVsZFxuICogaXMgbm90IHByZXNlbnQuIEZhaWxzIGlmIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdC5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIENvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4dHJhY3RlZCBmaWVsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsRmllbGQ8VCwgVEM9dW5kZWZpbmVkPihuYW1lOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxUfHVuZGVmaW5lZCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcgJiYgZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2YobmFtZSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW25hbWVdLCBjb250ZXh0KS5vbkZhaWx1cmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwgb3IgaW5wdXQgd2FzIHVuZGVmaW5lZCB3ZVxuICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWQgd2l0aCAndW5kZWZpbmVkJywgYnV0IHdlIHByb3BhZ2F0ZSBhY3R1YWxcbiAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpIHx8IChmcm9tW25hbWVdICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgZmllbGQgXCIke25hbWV9XCIgZnJvbSBub24tb2JqZWN0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkQ29udmVydGVyczxULCBUQz11bmtub3duPiA9IHsgWyBrZXkgaW4ga2V5b2YgVCBdOiBDb252ZXJ0ZXI8VFtrZXldLCBUQz4gfTtcblxuZXhwb3J0IGNsYXNzIE9iamVjdENvbnZlcnRlcjxULCBUQz11bmtub3duPiBleHRlbmRzIEJhc2VDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VD47XG4gICAgcHVibGljIHJlYWRvbmx5IG9wdGlvbmFsRmllbGRzOiAoa2V5b2YgVClbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxULCBUQz4sIG9wdGlvbmFsPzogKGtleW9mIFQpW10pIHtcbiAgICAgICAgc3VwZXIoKGZyb206IHVua25vd24sIF9zZWxmLCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IHt9IGFzIHsgW2tleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9IG9wdGlvbmFsPy5pbmNsdWRlcyhrZXkpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBpc09wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbmFsRmllbGQoa2V5LCBmaWVsZHNba2V5XSkuY29udmVydChmcm9tLCBjb250ZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZChrZXksIGZpZWxkc1trZXldKS5jb252ZXJ0KGZyb20sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpICYmIChyZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5pc0ZhaWx1cmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSA/IHN1Y2NlZWQoY29udmVydGVkKSA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgICAgIHRoaXMub3B0aW9uYWxGaWVsZHMgPSBvcHRpb25hbCA/PyBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFydGlhbChvcHRpb25hbD86IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4sIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4sIFRDPih0aGlzLmZpZWxkcyBhcyBGaWVsZENvbnZlcnRlcnM8UGFydGlhbDxUPiwgVEM+LCBvcHRpb25hbCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhcnRpYWwoYWRkT3B0aW9uYWxGaWVsZHM6IChrZXlvZiBUKVtdKTogT2JqZWN0Q29udmVydGVyPFBhcnRpYWw8VD4sIFRDPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRpYWwoWy4uLnRoaXMub3B0aW9uYWxGaWVsZHMsIC4uLmFkZE9wdGlvbmFsRmllbGRzXSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBjb252ZXJ0IGFuIG9iamVjdCB3aXRob3V0IGNoYW5naW5nIHNoYXBlLiBUaGUgc291cmNlIHBhcmFtZXRlciBpcyBhbiBvYmplY3Qgd2l0aFxuICoga2V5IG5hbWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgdGFyZ2V0IG9iamVjdCBhbmQgdGhlIGFwcHJvcHJpYXRlIGNvcnJlc3BvbmRpbmcgY29udmVydGVyXG4gKiBhcyB0aGUgcHJvcGVydHkgdmFsdWUuIElmIGFsbCBvZiB0aGUgcmVxdWVzdGVkIGZpZWxkcyBleGlzdCBhbmQgY2FuIGJlIGNvbnZlcnRlZCwgcmV0dXJucyBhXG4gKiBuZXcgb2JqZWN0IHdpdGggdGhlIGNvbnZlcnRlZCB2YWx1ZXMgdW5kZXIgdGhlIG9yaWdpbmFsIGtleSBuYW1lcy4gIElmIGFueSBmaWVsZHMgZG8gbm90IGV4aXN0XG4gKiBvciBjYW5ub3QgYmUgY29udmVydGVkLCB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMuXG4gKlxuICogRmllbGRzIHRoYXQgc3VjY2VlZCBidXQgY29udmVydCB0byB1bmRlZmluZWQgYXJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0IG9iamVjdCBidXQgZG8gbm90XG4gKiBmYWlsIHRoZSBjb252ZXJzaW9uLlxuICogQHBhcmFtIGZpZWxkcyBBbiBvYmplY3QgY29udGFpbmluZyBkZWZpbmluZyB0aGUgc2hhcGUgYW5kIGNvbnZlcnRlcnMgdG8gYmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdDxUPihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxUPiwgb3B0aW9uYWw/OiAoa2V5b2YgVClbXSk6IE9iamVjdENvbnZlcnRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RDb252ZXJ0ZXIoZmllbGRzLCBvcHRpb25hbCk7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGNvbnZlcnQgYW4gb2JqZWN0IHRvIGEgbmV3IG9iamVjdCB3aXRoIGEgZGlmZmVyZW50IHNoYXBlLiBUaGUgc291cmNlIHBhcmFtZXRlciBpc1xuICogYW4gb2JqZWN0IHdpdGgga2V5IG5hbWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgdGFyZ2V0IG9iamVjdCwgYW5kIGFuIGFwcHJvcmlhdGUgX2ZpZWxkX1xuICogY29udmVydGVyIHRoYXQgd2lsbCBleHRyYWN0IGFuZCBjb252ZXJ0IGEgc2luZ2xlIGZpZWxkIGZyb20gdGhlIHNvdXJjZSBvYmplY3QuXG4gKlxuICogSWYgYWxsIG9mIHRoZSBleHRyYWN0ZWQgZmllbGRzIGV4aXN0IGFuZCBjYW4gYmUgY29udmVydGVkLCByZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIHRoZVxuICogY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUgb3JpZ2luYWwga2V5IG5hbWVzLiAgSWYgYW55IGZpZWxkcyB0byBiZSBleHRyYWN0ZWQgZG8gbm90IGV4aXN0XG4gKiBvciBjYW5ub3QgYmUgY29udmVydGVkLCB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMuXG4gKlxuICogRmllbGRzIHRoYXQgc3VjY2VlZCBidXQgY29udmVydCB0byB1bmRlZmluZWQgYXJlIG9taXR0ZWQgZnJvbSB0aGUgcmVzdWx0IG9iamVjdCBidXQgZG8gbm90XG4gKiBmYWlsIHRoZSBjb252ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBmaWVsZHMgQW4gb2JqZWN0IGRlZmluaW5nIHRoZSBzaGFwZSBvZiB0aGUgdGFyZ2V0IG9iamVjdCBhbmQgdGhlIGZpZWxkIGNvbnZlcnRlcnNcbiAqIHRvIGJlIHVzZWQgdG8gY29uc3RydWN0IGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtPFQsIFRDPXVua25vd24+KGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQsIFRDPik6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGYsIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAvLyBlc2xpbnQgYnVnIHRoaW5rcyBrZXkgaXMgdXNlZCBiZWZvcmUgZGVmaW5lZFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBbIGtleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGZpZWxkc1trZXldLmNvbnZlcnQoZnJvbSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiAocmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtrZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgPyBzdWNjZWVkKGNvbnZlcnRlZCkgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb252ZXJ0IGEgcmFuZ2Ugb2Ygc29tZSBvdGhlciBjb21wYXJhYmxlIHR5cGVcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgQ29udmVydGVyIHVzZWQgdG8gY29udmVydCBtaW4gYW5kIG1heCBleHRlbnQgb2YgdGhlIHJhaWRcbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciBPcHRpb25hbCBzdGF0aWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VUeXBlT2Y8VCwgUlQgZXh0ZW5kcyBSYW5nZU9mPFQ+LCBUQz11bmtub3duPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sIGNvbnN0cnVjdG9yOiAoaW5pdDogUmFuZ2VPZlByb3BlcnRpZXM8VD4pID0+IFJlc3VsdDxSVD4pOiBDb252ZXJ0ZXI8UlQsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9iamVjdCh7XG4gICAgICAgICAgICBtaW46IGNvbnZlcnRlcixcbiAgICAgICAgICAgIG1heDogY29udmVydGVyLFxuICAgICAgICB9LCBbJ21pbicsICdtYXgnXSkuY29udmVydChmcm9tLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yKHsgbWluOiByZXN1bHQudmFsdWUubWluLCBtYXg6IHJlc3VsdC52YWx1ZS5tYXggfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwocmVzdWx0Lm1lc3NhZ2UpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VPZjxULCBUQz11bmtub3duPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4pOiBDb252ZXJ0ZXI8UmFuZ2VPZjxUPiwgVEM+IHtcbiAgICByZXR1cm4gcmFuZ2VUeXBlT2Y8VCwgUmFuZ2VPZjxUPiwgVEM+KGNvbnZlcnRlciwgUmFuZ2VPZi5jcmVhdGVSYW5nZSk7XG59XG4iXX0= |
{ | ||
"name": "@fgv/ts-utils", | ||
"version": "0.3.5", | ||
"version": "0.3.6", | ||
"description": "Assorted Typescript Utilities", | ||
@@ -34,15 +34,15 @@ "main": "index.js", | ||
"@types/mustache": "^4.0.1", | ||
"@types/node": "^14.11.2", | ||
"@typescript-eslint/eslint-plugin": "^4.2.0", | ||
"@typescript-eslint/parser": "^4.2.0", | ||
"eslint": "^7.9.0", | ||
"@types/node": "^14.11.4", | ||
"@typescript-eslint/eslint-plugin": "^4.4.0", | ||
"@typescript-eslint/parser": "^4.4.0", | ||
"eslint": "^7.10.0", | ||
"eslint-config-standard": "^14.1.1", | ||
"eslint-plugin-import": "^2.22.0", | ||
"eslint-plugin-import": "^2.22.1", | ||
"eslint-plugin-node": "^11.1.0", | ||
"eslint-plugin-promise": "^4.2.1", | ||
"eslint-plugin-standard": "^4.0.1", | ||
"jest": "^26.4.2", | ||
"jest": "^26.5.0", | ||
"jest-extended": "^0.11.5", | ||
"rimraf": "^3.0.2", | ||
"ts-jest": "^26.4.0", | ||
"ts-jest": "^26.4.1", | ||
"ts-node": "^9.0.0", | ||
@@ -49,0 +49,0 @@ "typescript": "^4.0.3" |
207966