@fgv/ts-utils 1.5.0 → 1.5.2

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/converters.d.ts CHANGED
@@ -413,6 +413,10 @@ export interface ObjectConverterOptions<T> {
413
413
  * unrecognized fields are ignored.
414
414
  */
415
415
  strict?: boolean;
416
+ /**
417
+ * Optional description to be included in error messages.
418
+ */
419
+ description?: string;
416
420
  }
417
421
  /**
418
422
  * Per-property converters for each of the properties in type T.
@@ -652,6 +656,10 @@ export interface TransformObjectOptions<TSRC> {
652
656
  * is enabled.
653
657
  */
654
658
  ignore?: (keyof TSRC)[];
659
+ /**
660
+ * An optional description of this transform to be used for error messages.
661
+ */
662
+ description?: string;
655
663
  }
656
664
  /**
657
665
  * Helper to create a strongly-typed {@link Converter} which converts a source object to a
@@ -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
@@ -646,7 +646,7 @@ class ObjectConverter extends converter_1.BaseConverter {
646
646
  errors.push('source is not an object');
647
647
  }
648
648
  }
649
- return (errors.length === 0) ? (0, result_1.succeed)(converted) : (0, result_1.fail)(errors.join('\n'));
649
+ return (errors.length === 0) ? (0, result_1.succeed)(converted) : (0, result_1.fail)(this.options.description ? `${this.options.description}: ${errors.join('\n')}` : errors.join('\n'));
650
650
  });
651
651
  this.fields = fields;
652
652
  if (Array.isArray(opt)) {
@@ -806,13 +806,13 @@ function transformObject(destinationFields, options) {
806
806
  const converter = destinationFields[destinationKey].converter;
807
807
  if ((0, utils_1.isKeyOf)(srcKey, from)) {
808
808
  const result = converter.convert(from[srcKey], context);
809
- if (result.isSuccess()) {
809
+ if (result.isSuccess() && result.value !== undefined) {
810
810
  converted[destinationKey] = result.value;
811
- used.add(srcKey);
812
811
  }
813
- else {
812
+ else if (result.isFailure()) {
814
813
  errors.push(`${srcKey}->${destinationKey}: ${result.message}`);
815
814
  }
815
+ used.add(srcKey);
816
816
  }
817
817
  else if (destinationFields[destinationKey].optional !== true) {
818
818
  errors.push(`${String(srcKey)}: required property missing in source object.`);
@@ -830,7 +830,7 @@ function transformObject(destinationFields, options) {
830
830
  else {
831
831
  errors.push('source is not an object');
832
832
  }
833
- return (errors.length === 0) ? (0, result_1.succeed)(converted) : (0, result_1.fail)(errors.join('\n'));
833
+ return (errors.length === 0) ? (0, result_1.succeed)(converted) : (0, result_1.fail)((options === null || options === void 0 ? void 0 : options.description) ? `${options.description}:\n ${errors.join('\n ')}` : errors.join('\n'));
834
834
  });
835
835
  }
836
836
  exports.transformObject = transformObject;
@@ -864,4 +864,4 @@ function rangeOf(converter) {
864
864
  return rangeTypeOf(converter, rangeOf_1.RangeOf.createRange);
865
865
  }
866
866
  exports.rangeOf = rangeOf;
867
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF3RTtBQUN4RSx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBRWhFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsd0RBQWdDO0FBQ2hDLG1DQUFrQztBQWlCbEM7Ozs7R0FJRztBQUNILE1BQWEsZUFBeUQsU0FBUSx5QkFBb0I7SUFDOUY7Ozs7O09BS0c7SUFDSCxZQUNJLGNBQW1CLEVBQ25CLE1BQXdCLEVBQ3hCLFlBQWdGLGVBQWUsQ0FBQyxRQUFRO1FBRXhHLEtBQUssQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNPLE1BQU0sQ0FBQyxRQUFRLENBQW1CLElBQWE7UUFDckQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRO1lBQzNCLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsSUFBUyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxJQUFBLGFBQUksRUFBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ08sTUFBTSxDQUFDLEtBQUssQ0FDbEIsT0FBK0IsRUFDL0IsU0FBaUMsRUFDakMsTUFBd0I7UUFFeEIsT0FBTyxJQUFJLGVBQWUsQ0FBUSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsSUFBYSxFQUFFLEVBQUU7WUFDdEUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3RD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QUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBWEQsa0NBV0M7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLE9BQU8sQ0FBZ0IsU0FBMkI7SUFDOUQsT0FBTyxXQUFXLENBQW9CLFNBQVMsRUFBRSxpQkFBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFGRCwwQkFFQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5pbXBvcnQgeyBCYXNlQ29udmVydGVyLCBDb252ZXJ0ZXIsIENvbnZlcnRlclRyYWl0cyB9IGZyb20gJy4vY29udmVydGVyJztcbmltcG9ydCB7IFJhbmdlT2YsIFJhbmdlT2ZQcm9wZXJ0aWVzIH0gZnJvbSAnLi9yYW5nZU9mJztcbmltcG9ydCB7IFJlc3VsdCwgY2FwdHVyZVJlc3VsdCwgZmFpbCwgc3VjY2VlZCB9IGZyb20gJy4vcmVzdWx0JztcblxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgeyBFeHRlbmRlZEFycmF5IH0gZnJvbSAnLi9leHRlbmRlZEFycmF5JztcbmltcG9ydCBNdXN0YWNoZSBmcm9tICdtdXN0YWNoZSc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgT25FcnJvciA9ICdmYWlsT25FcnJvcicgfCAnaWdub3JlRXJyb3JzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9XG4gKiBtYXRjaGluZyBtZXRob2RcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdNYXRjaE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGlmIGEgbm9uLW1hdGNoaW5nIHN0cmluZ1xuICAgICAqIGlzIGVuY291bnRlcmVkLlxuICAgICAqL1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn0gY2xhc3MgZXh0ZW5kcyB7QGxpbmsgQmFzZUNvbnZlcnRlcn1cbiAqIHRvIHByb3ZpZGUgc3RyaW5nLXNwZWNpZmljIGhlbHBlciBtZXRob2RzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgU3RyaW5nQ29udmVydGVyPFQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFRDID0gdW5rbm93bj4gZXh0ZW5kcyBCYXNlQ29udmVydGVyPFQsIFRDPiB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn0uXG4gICAgICogQHBhcmFtIGRlZmF1bHRDb250ZXh0IC0gT3B0aW9uYWwgY29udGV4dCB1c2VkIGJ5IHRoZSBjb252ZXJzaW9uLlxuICAgICAqIEBwYXJhbSB0cmFpdHMgLSBPcHRpb25hbCB0cmFpdHMgdG8gYmUgYXBwbGllZCB0byB0aGUgY29udmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udmVydGVyIC0gT3B0aW9uYWwgY29udmVyc2lvbiBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciB0aGUgY29udmVyc2lvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIGRlZmF1bHRDb250ZXh0PzogVEMsXG4gICAgICAgIHRyYWl0cz86IENvbnZlcnRlclRyYWl0cyxcbiAgICAgICAgY29udmVydGVyOiAoZnJvbTogdW5rbm93biwgc2VsZjogQ29udmVydGVyPFQsIFRDPiwgY29udGV4dD86IFRDKSA9PiBSZXN1bHQ8VD4gPSBTdHJpbmdDb252ZXJ0ZXIuX2NvbnZlcnQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbnZlcnRlciwgZGVmYXVsdENvbnRleHQsIHRyYWl0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfY29udmVydDxUIGV4dGVuZHMgc3RyaW5nPihmcm9tOiB1bmtub3duKTogUmVzdWx0PFQ+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBzdWNjZWVkKGZyb20gYXMgVClcbiAgICAgICAgICAgIDogZmFpbChgTm90IGEgc3RyaW5nOiAke0pTT04uc3RyaW5naWZ5KGZyb20pfWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGF0aWMgX3dyYXA8VCBleHRlbmRzIHN0cmluZywgVEM+KFxuICAgICAgICB3cmFwcGVkOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+LFxuICAgICAgICBjb252ZXJ0ZXI6IChmcm9tOiBUKSA9PiBSZXN1bHQ8VD4sXG4gICAgICAgIHRyYWl0cz86IENvbnZlcnRlclRyYWl0c1xuICAgICk6IFN0cmluZ0NvbnZlcnRlcjxULCBUQz4ge1xuICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxULCBUQz4odW5kZWZpbmVkLCB1bmRlZmluZWQsIChmcm9tOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5jb252ZXJ0KGZyb20pLm9uU3VjY2Vzcyhjb252ZXJ0ZXIpO1xuICAgICAgICB9KS5fd2l0aCh3cmFwcGVkLl90cmFpdHModHJhaXRzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn0gd2hpY2ggY29uc3RyYWlucyB0aGUgcmVzdWx0IHRvIG1hdGNoXG4gICAgICogYSBzdXBwbGllZCBzdHJpbmcuXG4gICAgICogQHBhcmFtIG1hdGNoIC0gVGhlIHN0cmluZyB0byBiZSBtYXRjaGVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdNYXRjaE9wdGlvbnN9IGZvciB0aGlzIGNvbnZlcnNpb24uXG4gICAgICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYSBtYXRjaGluZyBzdHJpbmcgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gaW5mb3JtYXRpdmVcbiAgICAgKiBlcnJvciBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoLlxuICAgICAqIHtAbGFiZWwgc3RyaW5nfVxuICAgICAqL1xuICAgIHB1YmxpYyBtYXRjaGluZyhtYXRjaDogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxTdHJpbmdNYXRjaE9wdGlvbnM+KTogU3RyaW5nQ29udmVydGVyPFQsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9IHdoaWNoIGNvbnN0cmFpbnMgdGhlIHJlc3VsdCB0byBtYXRjaFxuICAgICAqIG9uZSBvZiBhIHN1cHBsaWVkIGFycmF5IG9mIHN0cmluZ3MuXG4gICAgICogQHBhcmFtIG1hdGNoIC0gVGhlIGFycmF5IG9mIGFsbG93ZWQgc3RyaW5ncy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ01hdGNoT3B0aW9uc30gZm9yIHRoaXMgY29udmVyc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG1hdGNoaW5nIHN0cmluZyBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBpbmZvcm1hdGl2ZVxuICAgICAqIGVycm9yIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2guXG4gICAgICoge0BsYWJlbCBhcnJheX1cbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hpbmcobWF0Y2g6IHN0cmluZ1tdLCBvcHRpb25zPzogUGFydGlhbDxTdHJpbmdNYXRjaE9wdGlvbnM+KTogU3RyaW5nQ29udmVydGVyPFQsIFRDPjtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIgfCBTdHJpbmdDb252ZXJ0ZXJ9IHdoaWNoIGNvbnN0cmFpbnMgdGhlIHJlc3VsdCB0byBtYXRjaFxuICAgICAqIG9uZSBvZiBhIHN1cHBsaWVkIGBTZXRgIG9mIHN0cmluZ3MuXG4gICAgICogQHBhcmFtIG1hdGNoIC0gVGhlIGBTZXRgIG9mIGFsbG93ZWQgc3RyaW5ncy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ01hdGNoT3B0aW9uc30gZm9yIHRoaXMgY29udmVyc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG1hdGNoaW5nIHN0cmluZyBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBpbmZvcm1hdGl2ZVxuICAgICAqIGVycm9yIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2guXG4gICAgICoge0BsYWJlbCBzZXR9XG4gICAgICovXG4gICAgcHVibGljIG1hdGNoaW5nKG1hdGNoOiBTZXQ8VD4sIG9wdGlvbnM/OiBQYXJ0aWFsPFN0cmluZ01hdGNoT3B0aW9ucz4pOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn0gd2hpY2ggY29uc3RyYWlucyB0aGUgcmVzdWx0IHRvIG1hdGNoXG4gICAgICogYSBzdXBwbGllZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAgICogQHBhcmFtIG1hdGNoIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBiZSB1c2VkIGFzIGEgY29uc3RyYWludC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ01hdGNoT3B0aW9uc30gZm9yIHRoaXMgY29udmVyc2lvblxuICAgICAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGEgbWF0Y2hpbmcgc3RyaW5nIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGluZm9ybWF0aXZlXG4gICAgICogZXJyb3IgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBtYXRjaC5cbiAgICAgKiB7QGxhYmVsIHJlZ2V4cH1cbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hpbmcobWF0Y2g6IFJlZ0V4cCwgb3B0aW9ucz86IFBhcnRpYWw8U3RyaW5nTWF0Y2hPcHRpb25zPik6IFN0cmluZ0NvbnZlcnRlcjxULCBUQz47XG4gICAgLyoqXG4gICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyLihtYXRjaGluZyNzdHJpbmcpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKHN0cmluZyl9LFxuICAgICAqIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlci4obWF0Y2hpbmcjYXJyYXkpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKHN0cmluZ1tdKX0sXG4gICAgICoge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyLihtYXRjaGluZyNzZXQpIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKFNldDxzdHJpbmc+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+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUlTTyhmcm9tKTtcbiAgICAgICAgaWYgKGR0LmlzVmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGR0LnRvSlNEYXRlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBJbnZhbGlkIGRhdGU6ICR7ZHQuaW52YWxpZEV4cGxhbmF0aW9ufWApO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZnJvbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHN1Y2NlZWQobmV3IERhdGUoZnJvbSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChmcm9tIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChmcm9tKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhaWwoYENhbm5vdCBjb252ZXJ0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9IHRvIERhdGVgKTtcbn0pO1xuXG4vKipcbiAqIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYW4gb3B0aW9uYWwgYG51bWJlcmAgdmFsdWUuXG4gKiBAcmVtYXJrc1xuICogVmFsdWVzIG9mIHR5cGUgYG51bWJlcmAgb3IgbnVtZXJpYyBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgYW5kIHJldHVybmVkLlxuICogQW55dGhpbmcgZWxzZSByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHZhbHVlIGB1bmRlZmluZWRgLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgb3B0aW9uYWxOdW1iZXIgPSBudW1iZXIub3B0aW9uYWwoKTtcblxuLyoqXG4gKiBBIHtAbGluayBDb252ZXJ0ZXJ9IHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYGJvb2xlYW5gIHZhbHVlLlxuICogQHJlbWFya3NcbiAqIFZhbHVlcyBvZiB0eXBlIGBib29sZWFuYCBvciBzdHJpbmdzIHRoYXQgbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUpIGAndHJ1ZSdgXG4gKiBvciBgJ2ZhbHNlJ2AgYXJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQuICBBbnl0aGluZyBlbHNlIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9XG4gKiB3aXRoIHZhbHVlIGB1bmRlZmluZWRgLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgb3B0aW9uYWxCb29sZWFuID0gYm9vbGVhbi5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IGZvciBwb2x5bW9ycGhpYyB2YWx1ZXMuICBSZXR1cm5zIGFcbiAqIGNvbnZlcnRlciB3aGljaCBJbnZva2VzIHRoZSB3cmFwcGVkIGNvbnZlcnRlcnMgaW4gc2VxdWVuY2UsIHJldHVybmluZyB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bFxuICogcmVzdWx0LiAgUmV0dXJucyBhbiBlcnJvciBpZiBub25lIG9mIHRoZSBzdXBwbGllZCBjb252ZXJ0ZXJzIGNhbiBjb252ZXJ0IHRoZSB2YWx1ZS5cbiAqIEByZW1hcmtzXG4gKiBJZiBgb25FcnJvcmAgaXMgYGlnbm9yZUVycm9yc2AgKGRlZmF1bHQpLCB0aGVuIGVycm9ycyBmcm9tIGFueSBvZiB0aGVcbiAqIGNvbnZlcnRlcnMgYXJlIGlnbm9yZWQgcHJvdmlkZWQgdGhhdCBzb21lIGNvbnZlcnRlciBzdWNjZWVkcy4gIElmXG4gKiBvbkVycm9yIGlzIGBmYWlsT25FcnJvcmAsIHRoZW4gYW4gZXJyb3IgZnJvbSBhbnkgY29udmVydGVyIGZhaWxzIHRoZSBlbnRpcmVcbiAqIGNvbnZlcnNpb24uXG4gKlxuICogQHBhcmFtIGNvbnZlcnRlcnMgLSBBbiBvcmRlcmVkIGxpc3Qgb2Yge0BsaW5rIENvbnZlcnRlciB8IGNvbnZlcnRlcnN9IHRvIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gb25FcnJvciAtIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0aWJsZSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHlpZWxkcyBhIHZhbHVlIGZyb20gdGhlIHVuaW9uIG9mIHRoZSB0eXBlcyByZXR1cm5lZFxuICogYnkgdGhlIHdyYXBwZWQgY29udmVydGVycy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZU9mPFQsIFRDPXVua25vd24+KGNvbnZlcnRlcnM6IEFycmF5PENvbnZlcnRlcjxULCBUQz4+LCBvbkVycm9yOiBPbkVycm9yID0gJ2lnbm9yZUVycm9ycycpOiBDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmLCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiBjb252ZXJ0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAob25FcnJvciA9PT0gJ2ZhaWxPbkVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYE5vIG1hdGNoaW5nIGNvbnZlcnRlciBmb3IgJHtKU09OLnN0cmluZ2lmeShmcm9tKX06ICR7ZXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGB1bmtub3duYCB0byBhbiBhcnJheSBvZiBgPFQ+YC5cbiAqIEByZW1hcmtzXG4gKiBJZiBgb25FcnJvcmAgaXMgYCdmYWlsT25FcnJvcidgIChkZWZhdWx0KSwgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGVsZW1lbnQgY2Fubm90XG4gKiBiZSBjb252ZXJ0ZWQuICBJZiBgb25FcnJvcmAgaXMgYCdpZ25vcmVFcnJvcnMnYCwgdGhlbiBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LlxuICogQHBhcmFtIGlnbm9yZUVycm9ycyAtIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0aWJsZSBlbGVtZW50cy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBgPFQ+YC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5T2Y8VCwgVEM9dW5kZWZpbmVkPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sIG9uRXJyb3I6IE9uRXJyb3IgPSAnZmFpbE9uRXJyb3InKTogQ29udmVydGVyPFRbXSwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VFtdLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZnJvbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBOb3QgYW4gYXJyYXk6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWNjZXNzZXM6IFRbXSA9IFtdO1xuICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmcm9tKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChpdGVtLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgcmVzdWx0LnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzZXMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSB8fCAob25FcnJvciA9PT0gJ2lnbm9yZUVycm9ycycpXG4gICAgICAgICAgICA/IHN1Y2NlZWQoc3VjY2Vzc2VzKVxuICAgICAgICAgICAgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYHVua25vd25gIHRvIHtAbGluayBFeHRlbmRlZEFycmF5IHwgRXh0ZW5kZWRBcnJheTxUPn0uXG4gKiBAcmVtYXJrc1xuICogSWYgYG9uRXJyb3JgIGlzIGAnZmFpbE9uRXJyb3InYCAoZGVmYXVsdCksIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBlbGVtZW50IGNhbm5vdFxuICogYmUgY29udmVydGVkLiAgSWYgYG9uRXJyb3JgIGlzIGAnaWdub3JlRXJyb3JzJ2AsIHRoZW4gZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSBhcnJheVxuICogQHBhcmFtIGlnbm9yZUVycm9ycyAtIFNwZWNpZmllcyB0cmVhdG1lbnQgb2YgdW5jb252ZXJ0aWJsZSBlbGVtZW50c1xuICogQGJldGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZGVkQXJyYXlPZjxULCBUQz11bmRlZmluZWQ+KGxhYmVsOiBzdHJpbmcsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgb25FcnJvcjogT25FcnJvciA9ICdmYWlsT25FcnJvcicpOiBDb252ZXJ0ZXI8RXh0ZW5kZWRBcnJheTxUPiwgVEM+IHtcbiAgICByZXR1cm4gYXJyYXlPZihjb252ZXJ0ZXIsIG9uRXJyb3IpLm1hcCgoaXRlbXM6IFRbXSkgPT4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgRXh0ZW5kZWRBcnJheShsYWJlbCwgLi4uaXRlbXMpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgQ29udmVydGVyfSB0byBjb252ZXJ0IGFuIGB1bmtub3duYCB0byBhbiBhcnJheSBvZiBgc3RyaW5nYC5cbiAqIEByZW1hcmtzXG4gKiBSZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSB0aGUgc3VwcGxpZWQgdmFsdWUgaWYgaXQgYXMgYW4gYXJyYXlcbiAqIG9mIHN0cmluZ3MsIHJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdBcnJheSA9IGFycmF5T2Yoc3RyaW5nKTtcblxuLyoqXG4gKiB7QGxpbmsgQ29udmVydGVyfSB0byBjb252ZXJ0IGFuIGB1bmtub3duYCB0byBhbiBhcnJheSBvZiBgbnVtYmVyYC5cbiAqIEByZW1hcmtzXG4gKiBSZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSB0aGUgc3VwcGxpZWQgdmFsdWUgaWYgaXQgYXMgYW4gYXJyYXlcbiAqIG9mIG51bWJlcnMsIHJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBudW1iZXJBcnJheSA9IGFycmF5T2YobnVtYmVyKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgQ29udmVydGVycy4ocmVjb3JkT2Y6d2l0aE9wdGlvbnMpfSBhbmQge0BsaW5rIENvbnZlcnRlcnMuKG1hcE9mOndpdGhPcHRpb25zKX1cbiAqIGhlbHBlciBmdW5jdGlvbnMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5ZWRDb252ZXJ0ZXJPcHRpb25zPFQgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFRDPXVuZGVmaW5lZD4ge1xuICAgIC8qKlxuICAgICAqIGlmIGBvbkVycm9yYCBpcyBgJ2ZhaWwnYCAoZGVmYXVsdCksIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBrZXkgb3IgZWxlbWVudFxuICAgICAqIGNhbm5vdCBiZSBjb252ZXJ0ZWQuICBJZiBgb25FcnJvcmAgaXMgYCdpZ25vcmUnYCwgZmFpbGluZyBlbGVtZW50cyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAgICAgKi9cbiAgICBvbkVycm9yPzogJ2ZhaWwnfCdpZ25vcmUnO1xuICAgIC8qKlxuICAgICAqIElmIHByZXNlbnQsIGBrZXlDb252ZXJ0ZXJgIGlzIHVzZWQgdG8gY29udmVydCB0aGUgc291cmNlIG9iamVjdCBwcm9wZXJ0eSBuYW1lcyB0b1xuICAgICAqIGtleXMgaW4gdGhlIHJlc3VsdGluZyBtYXAgb3IgcmVjb3JkLlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQ2FuIGJlIHVzZWQgdG8gY29lcmNlIGtleSBuYW1lcyB0byBzdXBwb3J0ZWQgdmFsdWVzIGFuZC9vciBzdHJvbmcgdHlwZXMuXG4gICAgICovXG4gICAga2V5Q29udmVydGVyPzogQ29udmVydGVyPFQsIFRDPjtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0aGUgYHN0cmluZ2Ata2V5ZWQgcHJvcGVydGllc1xuICogdXNpbmcgYSBzdXBwbGllZCB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB0byBwcm9kdWNlIGEgYFJlY29yZDxzdHJpbmcsIFQ+YC5cbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVzdWx0aW5nIGNvbnZlcnRlciBmYWlscyBjb252ZXJzaW9uIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggcmV0dXJucyBgUmVjb3JkPHN0cmluZywgVD5gLlxuICoge0BsYWJlbCBkZWZhdWx0fVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkT2Y8VCwgVEM9dW5kZWZpbmVkLCBUSyBleHRlbmRzIHN0cmluZz1zdHJpbmc+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxSZWNvcmQ8VEssIFQ+LCBUQz47XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgdGhlIGBzdHJpbmdgLWtleWVkIHByb3BlcnRpZXNcbiAqIHVzaW5nIGEgc3VwcGxpZWQge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gdG8gcHJvZHVjZSBhIGBSZWNvcmQ8c3RyaW5nLCBUPmAgYW5kIG9wdGlvbmFsbHlcbiAqIHNwZWNpZmllZCBoYW5kbGluZyBvZiBlbGVtZW50cyB0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQuXG4gKiBAcmVtYXJrc1xuICogaWYgYG9uRXJyb3JgIGlzIGAnZmFpbCdgIChkZWZhdWx0KSwgdGhlbiB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMgaWYgYW55IGtleSBvciBlbGVtZW50XG4gKiBjYW5ub3QgYmUgY29udmVydGVkLiAgSWYgYG9uRXJyb3JgIGlzIGAnaWdub3JlJ2AsIGZhaWxpbmcgZWxlbWVudHMgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggcmV0dXJucyBgUmVjb3JkPHN0cmluZywgVD5gLlxuICoge0BsYWJlbCB3aXRoT25FcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE9mPFQsIFRDPXVuZGVmaW5lZCwgVEsgZXh0ZW5kcyBzdHJpbmc9c3RyaW5nPihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sXG4gICAgb25FcnJvcjogJ2ZhaWwnfCdpZ25vcmUnXG4pOiBDb252ZXJ0ZXI8UmVjb3JkPFRLLCBUPiwgVEM+O1xuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRoZSBgc3RyaW5nYC1rZXllZCBwcm9wZXJ0aWVzXG4gKiB1c2luZyBhIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHRvIHByb2R1Y2UgYSBgUmVjb3JkPFRLLCBUPmAuXG4gKiBAcmVtYXJrc1xuICogSWYgcHJlc2VudCwgdGhlIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXJzLktleWVkQ29udmVydGVyT3B0aW9ucyB8IG9wdGlvbnN9IGNhbiBwcm92aWRlIGEgc3Ryb25nbHktdHlwZWRcbiAqIGNvbnZlcnRlciBmb3Iga2V5cyBhbmQvb3IgY29udHJvbCB0aGUgaGFuZGxpbmcgb2YgZWxlbWVudHMgdGhhdCBmYWlsIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwge0BsaW5rIENvbnZlcnRlcnMuS2V5ZWRDb252ZXJ0ZXJPcHRpb25zIHwgS2V5ZWRDb252ZXJ0ZXJPcHRpb25zPFRLLCBUQz59IHdoaWNoXG4gKiBzdXBwbGllcyBhIGtleSBjb252ZXJ0ZXIgYW5kL29yIGVycm9yLWhhbmRsaW5nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHJldHVybnMgYFJlY29yZDxUSywgVD5gLlxuICoge0BsYWJlbCB3aXRoT3B0aW9uc31cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZE9mPFQsIFRDPXVuZGVmaW5lZCwgVEsgZXh0ZW5kcyBzdHJpbmc9c3RyaW5nPihcbiAgICBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sXG4gICAgb3B0aW9uczogS2V5ZWRDb252ZXJ0ZXJPcHRpb25zPFRLLCBUQz5cbik6IENvbnZlcnRlcjxSZWNvcmQ8VEssIFQ+LCBUQz47XG5cbi8qKlxuICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnZlcnRlcnMuKHJlY29yZE9mOmRlZmF1bHQpIHwgQ29udmVydGVycy5yZWNvcmRPZihDb252ZXJ0ZXI8VD4pfSxcbiAqIHtAbGluayBDb252ZXJ0ZXJzLihyZWNvcmRPZjp3aXRoT25FcnJvcikgfCBDb252ZXJ0ZXJzLnJlY29yZE9mKENvbnZlcnRlcjxUPiwgJ2ZhaWwnfCdpZ25vcmUnKX0sIGFuZFxuICoge0BsaW5rIENvbnZlcnRlcnMuKHJlY29yZE9mOndpdGhPcHRpb25zKSB8IENvbnZlcnRlcnMucmVjb3JkT2YoQ29udmVydGVyPFQ+LCBLZXllZENvbnZlcnRlck9wdGlvbnMpfS5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkT2Y8VCwgVEM9dW5kZWZpbmVkLCBUSyBleHRlbmRzIHN0cmluZz1zdHJpbmc+KFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPixcbiAgICBvcHRpb246ICdmYWlsJ3wnaWdub3JlJ3xLZXllZENvbnZlcnRlck9wdGlvbnM8VEssIFRDPiA9ICdmYWlsJ1xuKTogQ29udmVydGVyPFJlY29yZDxUSywgVD4sIFRDPiB7XG4gICAgY29uc3Qgb3B0aW9uczogS2V5ZWRDb252ZXJ0ZXJPcHRpb25zPFRLLCBUQz4gPSAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpID8geyBvbkVycm9yOiBvcHRpb24gfSA6IHsgb25FcnJvcjogJ2ZhaWwnLCAuLi5vcHRpb24gfTtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8UmVjb3JkPFRLLCBUPiwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKCh0eXBlb2YgZnJvbSAhPT0gJ29iamVjdCcpIHx8IChmcm9tID09PSBudWxsKSB8fCBBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGEgc3RyaW5nLWtleWVkIG9iamVjdDogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgVD4gPSB7fTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgIGlmIChpc0tleU9mKGtleSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3cml0ZUtleVJlc3VsdCA9IG9wdGlvbnMua2V5Q29udmVydGVyPy5jb252ZXJ0KGtleSwgY29udGV4dCkgPz8gc3VjY2VlZChrZXkpO1xuXG4gICAgICAgICAgICAgICAgd3JpdGVLZXlSZXN1bHQub25TdWNjZXNzKCh3cml0ZUtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQoZnJvbVtrZXldIGFzIHVua25vd24sIGNvbnRleHQpLm9uU3VjY2VzcygodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFt3cml0ZUtleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KS5vbkZhaWx1cmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSB8fCAob3B0aW9ucy5vbkVycm9yID09PSAnaWdub3JlJylcbiAgICAgICAgICAgID8gc3VjY2VlZChyZWNvcmQpXG4gICAgICAgICAgICA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0aGUgYHN0cmluZ2Ata2V5ZWQgcHJvcGVydGllc1xuICogdXNpbmcgYSBzdXBwbGllZCB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB0byBwcm9kdWNlIGEgYE1hcDxzdHJpbmcsIFQ+YC5cbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVzdWx0aW5nIGNvbnZlcnRlciBmYWlscyBjb252ZXJzaW9uIGlmIGFueSBlbGVtZW50IGNhbm5vdCBiZSBjb252ZXJ0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgc291cmNlIG9iamVjdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggcmV0dXJucyBgTWFwPHN0cmluZywgVD5gLlxuICoge0BsYWJlbCBkZWZhdWx0fVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwT2Y8VCwgVEMgPSB1bmRlZmluZWQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4pOiBDb252ZXJ0ZXI8TWFwPFRLLCBUPiwgVEM+O1xuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRoZSBgc3RyaW5nYC1rZXllZCBwcm9wZXJ0aWVzXG4gKiB1c2luZyBhIHN1cHBsaWVkIHtAbGluayBDb252ZXJ0ZXIgfCBDb252ZXJ0ZXI8VD59IHRvIHByb2R1Y2UgYSBgTWFwPHN0cmluZywgVD5gIGFuZCBvcHRpb25hbGx5XG4gKiBzcGVjaWZpZWQgaGFuZGxpbmcgb2YgZWxlbWVudHMgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkLlxuICogQHJlbWFya3NcbiAqIGlmIGBvbkVycm9yYCBpcyBgJ2ZhaWwnYCAoZGVmYXVsdCksIHRoZW4gdGhlIGVudGlyZSBjb252ZXJzaW9uIGZhaWxzIGlmIGFueSBrZXkgb3IgZWxlbWVudFxuICogY2Fubm90IGJlIGNvbnZlcnRlZC4gIElmIGBvbkVycm9yYCBpcyBgJ2lnbm9yZSdgLCBmYWlsaW5nIGVsZW1lbnRzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHJldHVybnMgYE1hcDxzdHJpbmcsIFQ+YC5cbiAqIHtAbGFiZWwgd2l0aE9uRXJyb3J9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBPZjxULCBUQyA9IHVuZGVmaW5lZCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPixcbiAgICBvbkVycm9yOiAnZmFpbCcgfCAnaWdub3JlJ1xuKTogQ29udmVydGVyPE1hcDxUSywgVD4sIFRDPjtcblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0aGUgYHN0cmluZ2Ata2V5ZWQgcHJvcGVydGllc1xuICogdXNpbmcgYSBzdXBwbGllZCB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB0byBwcm9kdWNlIGEgYE1hcDxUSywgVD5gLlxuICogQHJlbWFya3NcbiAqIElmIHByZXNlbnQsIHRoZSBzdXBwbGllZCB7QGxpbmsgQ29udmVydGVycy5LZXllZENvbnZlcnRlck9wdGlvbnMgfCBvcHRpb25zfSBjYW4gcHJvdmlkZSBhIHN0cm9uZ2x5LXR5cGVkXG4gKiBjb252ZXJ0ZXIgZm9yIGtleXMgYW5kL29yIGNvbnRyb2wgdGhlIGhhbmRsaW5nIG9mIGVsZW1lbnRzIHRoYXQgZmFpbCBjb252ZXJzaW9uLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHtAbGluayBDb252ZXJ0ZXJzLktleWVkQ29udmVydGVyT3B0aW9ucyB8IEtleWVkQ29udmVydGVyT3B0aW9uczxUSywgVEM+fSB3aGljaFxuICogc3VwcGxpZXMgYSBrZXkgY29udmVydGVyIGFuZC9vciBlcnJvci1oYW5kbGluZyBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCByZXR1cm5zIGBNYXA8VEssIFQ+YC5cbiAqIHtAbGFiZWwgd2l0aE9wdGlvbnN9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBPZjxULCBUQyA9IHVuZGVmaW5lZCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPixcbiAgICBvcHRpb25zOiBLZXllZENvbnZlcnRlck9wdGlvbnM8VEssIFRDPlxuKTogQ29udmVydGVyPE1hcDxUSywgVD4sIFRDPjtcblxuLyoqXG4gKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29udmVydGVycy4obWFwT2Y6ZGVmYXVsdCkgfCBDb252ZXJ0ZXJzLm1hcE9mKENvbnZlcnRlcjxUPil9LFxuICoge0BsaW5rIENvbnZlcnRlcnMuKG1hcE9mOndpdGhPbkVycm9yKSB8IENvbnZlcnRlcnMubWFwT2YoQ29udmVydGVyPFQ+LCAnZmFpbCd8J2lnbm9yZScpfSwgYW5kXG4gKiB7QGxpbmsgQ29udmVydGVycy4obWFwT2Y6d2l0aE9wdGlvbnMpIHwgQ29udmVydGVycy5tYXBPZihDb252ZXJ0ZXI8VD4sIEtleWVkQ29udmVydGVyT3B0aW9ucyl9LlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBPZjxULCBUQyA9IHVuZGVmaW5lZCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPixcbiAgICBvcHRpb246ICdmYWlsJyB8ICdpZ25vcmUnIHwgS2V5ZWRDb252ZXJ0ZXJPcHRpb25zPFRLLCBUQz4gPSAnZmFpbCdcbik6IENvbnZlcnRlcjxNYXA8VEssIFQ+LCBUQz4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodHlwZW9mIG9wdGlvbiA9PT0gJ3N0cmluZycpID8geyBvbkVycm9yOiBvcHRpb24gfSA6IHsgb25FcnJvcjogJ2ZhaWwnLCAuLi5vcHRpb24gfTtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8TWFwPFRLLCBUPiwgVEM+LCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKCh0eXBlb2YgZnJvbSAhPT0gJ29iamVjdCcpIHx8IChmcm9tID09PSBudWxsKSB8fCBBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbChgTm90IGEgc3RyaW5nLWtleWVkIG9iamVjdDogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8VEssIFQ+KCk7XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihrZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JpdGVLZXlSZXN1bHQgPSBvcHRpb25zLmtleUNvbnZlcnRlcj8uY29udmVydChrZXksIGNvbnRleHQpID8/IHN1Y2NlZWQoa2V5KTtcblxuICAgICAgICAgICAgICAgIHdyaXRlS2V5UmVzdWx0Lm9uU3VjY2Vzcygod3JpdGVLZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KGZyb21ba2V5XSBhcyB1bmtub3duLCBjb250ZXh0KS5vblN1Y2Nlc3MoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KHdyaXRlS2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSkub25GYWlsdXJlKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgfHwgKG9wdGlvbnMub25FcnJvciA9PT0gJ2lnbm9yZScpXG4gICAgICAgICAgICA/IHN1Y2NlZWQobWFwKVxuICAgICAgICAgICAgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSAgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCB2YWxpZGF0ZXMgdGhhdCBhIHN1cHBsaWVkIHZhbHVlIGlzXG4gKiBvZiBhIHR5cGUgdmFsaWRhdGVkIGJ5IGEgc3VwcGxpZWQgdmFsaWRhdG9yIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGl0LlxuICogQHJlbWFya3NcbiAqIElmIGB2YWxpZGF0b3JgIHN1Y2NlZWRzLCB0aGlzIHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHN1cHBsaWVkXG4gKiB2YWx1ZSBvZiBgZnJvbWAgY29lcmNlZCB0byB0eXBlIGA8VD5gLiAgUmV0dXJucyBhIHtAbGluayBGYWlsdXJlfSB3aXRoIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIG90aGVyd2lzZS5cbiAqIEBwYXJhbSB2YWxpZGF0b3IgLSBBIHZhbGlkYXRvciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyB2YWxpZC5cbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEEgZGVzY3JpcHRpb24gb2YgdGhlIHZhbGlkYXRlZCB0eXBlIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZXMuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB3aGljaCBhcHBsaWVzIHRoZSBzdXBwbGllZCB2YWxpZGF0aW9uLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVXaXRoPFQsIFRDPXVuZGVmaW5lZD4odmFsaWRhdG9yOiAoZnJvbTogdW5rbm93bikgPT4gZnJvbSBpcyBULCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGY6IENvbnZlcnRlcjxULCBUQz4sIF9jb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgaWYgKHZhbGlkYXRvcihmcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYCR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9OiBpbnZhbGlkICR7ZGVzY3JpcHRpb24gPz8gJ3ZhbHVlJ31gKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBleHRyYWN0cyBhbmQgY29udmVydHMgYW4gZWxlbWVudCBmcm9tIGFuIGFycmF5LlxuICogQHJlbWFya3NcbiAqIFRoZSByZXR1cm5lZCB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG4gKiBpbiB0aGUgc3VwcGxpZWQgYXJyYXkgYW5kIGNhbiBiZSBjb252ZXJ0ZWQuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuXG4gKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIEEge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IHRoZSBleHRyYWN0ZWQgZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlciB8IENvbnZlcnRlcjxUPn0gd2hpY2ggZXh0cmFjdHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gYW4gYXJyYXkuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50PFQsIFRDPXVuZGVmaW5lZD4oaW5kZXg6IG51bWJlciwgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFQsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGAke2luZGV4fTogY2Fubm90IGNvbnZlcnQgZm9yIGEgbmVnYXRpdmUgZWxlbWVudCBpbmRleGApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbCgnZWxlbWVudCBjb252ZXJ0ZXI6IHNvdXJjZSBpcyBub3QgYW4gYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA+PSBmcm9tLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7aW5kZXh9OiBlbGVtZW50IGNvbnZlcnRlciBpbmRleCBvdXQgb2YgcmFuZ2UgKDAuLiR7ZnJvbS5sZW5ndGggLSAxfSlgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQoZnJvbVtpbmRleF0sIGNvbnRleHQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGV4dHJhY3RzIGFuZCBjb252ZXJ0cyBhbiBvcHRpb25hbCBlbGVtZW50IGZyb20gYW4gYXJyYXkuXG4gKiBAcmVtYXJrc1xuICogVGhlIHJlc3VsdGluZyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG4gKiBpbiB0aGUgc3VwcGxpZWQgYXJyYXkgYW5kIGNhbiBiZSBjb252ZXJ0ZWQuIFJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdmFsdWUgYHVuZGVmaW5lZGAgaWYgdGhlIHBhcmFtZXRlclxuICogaXMgYW4gYXJyYXkgYnV0IHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJcbiAqIGlzIG5vdCBhbiBhcnJheSwgaWYgdGhlIHJlcXVlc3RlZCBpbmRleCBpcyBuZWdhdGl2ZSwgb3IgaWYgdGhlIGVsZW1lbnQgY2Fubm90IGJlIGNvbnZlcnRlZC5cbiAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0gQSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4dHJhY3RlZCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgQ29udmVydGVyIHwgQ29udmVydGVyPFQ+fSB3aGljaCBleHRyYWN0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSBhbiBhcnJheS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsRWxlbWVudDxULCBUQz11bmRlZmluZWQ+KGluZGV4OiBudW1iZXIsIGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxUfHVuZGVmaW5lZCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsKGAke2luZGV4fTogY2Fubm90IGNvbnZlcnQgZm9yIGEgbmVnYXRpdmUgZWxlbWVudCBpbmRleGApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGZyb20pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFpbCgnZWxlbWVudCBjb252ZXJ0ZXI6IHNvdXJjZSBpcyBub3QgYW4gYXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA+PSBmcm9tLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVyLmNvbnZlcnQoZnJvbVtpbmRleF0sIGNvbnRleHQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGV4dHJhY3RzIGFuZCBjb252ZXJ0IGEgcHJvcGVydHkgc3BlY2lmaWVkXG4gKiBieSBuYW1lIGZyb20gYW4gb2JqZWN0LlxuICogQHJlbWFya3NcbiAqIFRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCB0aGUgY29udmVydGVkIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBvYmplY3QgcHJvcGVydHkgaWYgdGhlIGZpZWxkIGV4aXN0cyBhbmQgY2FuIGJlIGNvbnZlcnRlZC4gUmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBlcnJvciBtZXNzYWdlXG4gKiBvdGhlcndpc2UuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IHRoZSBleHRyYWN0ZWQgZmllbGQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWVsZDxULCBUQz11bmRlZmluZWQ+KG5hbWU6IHN0cmluZywgY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFQsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFQsIFRDPiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcgJiYgKCFBcnJheS5pc0FycmF5KGZyb20pKSAmJiBmcm9tICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaXNLZXlPZihuYW1lLCBmcm9tKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tW25hbWVdLCBjb250ZXh0KS5vbkZhaWx1cmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYEZpZWxkICR7bmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWlsKGBGaWVsZCAke25hbWV9IG5vdCBmb3VuZCBpbjogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgZmllbGQgXCIke25hbWV9XCIgZnJvbSBub24tb2JqZWN0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggZXh0cmFjdHMgYW5kIGNvbnZlcnQgYSBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqIGJ5IG5hbWUgZnJvbSBhbiBvYmplY3QuXG4gKiBAcmVtYXJrc1xuICogVGhlIHJlc3VsdGluZyB7QGxpbmsgQ29udmVydGVyfSByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG9iamVjdCBwcm9wZXJ0eSBpZiB0aGUgZmllbGQgZXhpc3RzIGFuZCBjYW4gYmUgY29udmVydGVkLiBSZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHZhbHVlIGB1bmRlZmluZWRgXG4gKiBpZiB0aGUgc3VwcGxpZWQgcGFyYW1ldGVyIGlzIGFuIG9iamVjdCBidXQgdGhlIG5hbWVkIGZpZWxkIGlzIG5vdCBwcmVzZW50LiAgUmV0dXJucyB7QGxpbmsgRmFpbHVyZX0gd2l0aFxuICogYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBleHRyYWN0ZWQuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IHRoZSBleHRyYWN0ZWQgZmllbGQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEZpZWxkPFQsIFRDPXVuZGVmaW5lZD4obmFtZTogc3RyaW5nLCBjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4pOiBDb252ZXJ0ZXI8VHx1bmRlZmluZWQsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZjogQ29udmVydGVyPFR8dW5kZWZpbmVkLCBUQz4sIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGZyb20gPT09ICdvYmplY3QnICYmICghQXJyYXkuaXNBcnJheShmcm9tKSkgJiYgZnJvbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGlzS2V5T2YobmFtZSwgZnJvbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW25hbWVdLCBjb250ZXh0KS5vbkZhaWx1cmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7bmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwgb3IgaW5wdXQgd2FzIHVuZGVmaW5lZCB3ZVxuICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWQgd2l0aCAndW5kZWZpbmVkJywgYnV0IHdlIHByb3BhZ2F0ZSBhY3R1YWxcbiAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcy5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpIHx8IChmcm9tW25hbWVdICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgZmllbGQgXCIke25hbWV9XCIgZnJvbSBub24tb2JqZWN0ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgfSwgdW5kZWZpbmVkLCB7IGlzT3B0aW9uYWw6IHRydWUgfSk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYW4ge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYmplY3RDb252ZXJ0ZXJPcHRpb25zPFQ+IHtcbiAgICAvKipcbiAgICAgKiBJZiBwcmVzZW50LCBsaXN0cyBvcHRpb25hbCBmaWVsZHMuIE1pc3Npbmcgbm9uLW9wdGlvbmFsIGZpZWxkcyBjYXVzZSBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBvcHRpb25hbEZpZWxkcz86IChrZXlvZiBUKVtdO1xuICAgIC8qKlxuICAgICAqIElmIHRydWUsIHVucmVjb2duaXplZCBmaWVsZHMgeWllbGQgYW4gZXJyb3IuICBJZiBmYWxzZSBvciB1bmRlZmluZWQgKGRlZmF1bHQpLFxuICAgICAqIHVucmVjb2duaXplZCBmaWVsZHMgYXJlIGlnbm9yZWQuXG4gICAgICovXG4gICAgc3RyaWN0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQZXItcHJvcGVydHkgY29udmVydGVycyBmb3IgZWFjaCBvZiB0aGUgcHJvcGVydGllcyBpbiB0eXBlIFQuXG4gKiBAcmVtYXJrc1xuICogVXNlZCB0byBjb25zdHJ1Y3QgYSB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIgfCBPYmplY3RDb252ZXJ0ZXJ9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkQ29udmVydGVyczxULCBUQz11bmtub3duPiA9IHsgWyBrZXkgaW4ga2V5b2YgVCBdOiBDb252ZXJ0ZXI8VFtrZXldLCBUQz4gfTtcblxuLyoqXG4gKiBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlIGA8VD5gIHdpdGhvdXQgY2hhbmdpbmcgc2hhcGUsIGdpdmVuXG4gKiBhIHtAbGluayBDb252ZXJ0ZXJzLkZpZWxkQ29udmVydGVycyB8IEZpZWxkQ29udmVydGVyczxUPn0gZm9yIHRoZSBmaWVsZHMgaW4gdGhlIG9iamVjdC5cbiAqIEByZW1hcmtzXG4gKiBCeSBkZWZhdWx0LCBpZiBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcyBleGlzdCBhbmQgY2FuIGJlIGNvbnZlcnRlZCwgcmV0dXJucyBhIG5ldyBvYmplY3Qgd2l0aFxuICogdGhlIGNvbnZlcnRlZCB2YWx1ZXMgdW5kZXIgdGhlIG9yaWdpbmFsIGtleSBuYW1lcy4gIElmIGFueSByZXF1aXJlZCBmaWVsZHMgZG8gbm90IGV4aXN0IG9yIGNhbm5vdFxuICogYmUgY29udmVydGVkLCB0aGUgZW50aXJlIGNvbnZlcnNpb24gZmFpbHMuIFNlZSB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXJPcHRpb25zIHwgT2JqZWN0Q29udmVydGVyT3B0aW9uc31cbiAqIGZvciBvdGhlciBjb252ZXJzaW9uIG9wdGlvbnMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBPYmplY3RDb252ZXJ0ZXI8VCwgVEM9dW5rbm93bj4gZXh0ZW5kcyBCYXNlQ29udmVydGVyPFQsIFRDPiB7XG4gICAgLyoqXG4gICAgICogRmllbGRzIGNvbnZlcnRlZCBieSB0aGlzIHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcn0uXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQ+O1xuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgdXNlZCB0byBpbml0aWFsaXplIHRoaXMge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyfS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPjtcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyIHwgT2JqZWN0Q29udmVydGVyPFQ+fSB1c2luZyBvcHRpb25zXG4gICAgICogc3VwcGxpZWQgaW4gYSB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXJPcHRpb25zIHwgT2JqZWN0Q29udmVydGVyT3B0aW9uczxUPn0uXG4gICAgICogQHBhcmFtIGZpZWxkcyAtIEEge0BsaW5rIENvbnZlcnRlcnMuRmllbGRDb252ZXJ0ZXJzIHwgRmllbGRDb252ZXJ0ZXJzPFQ+fSBjb250YWluaW5nXG4gICAgICogYSB7QGxpbmsgQ29udmVydGVyfSBmb3IgZWFjaCBmaWVsZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb3B0aW9uYWwgQHNlZSBPYmplY3RDb252ZXJ0ZXJPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY29udmVyc2lvblxuICAgICAqIHtAbGFiZWwgd2l0aE9wdGlvbnN9XG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGZpZWxkczogRmllbGRDb252ZXJ0ZXJzPFQsIFRDPiwgb3B0aW9ucz86IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD4pXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDb252ZXJ0ZXJzLk9iamVjdENvbnZlcnRlciB8IE9iamVjdENvbnZlcnRlcjxUPn0gd2l0aCBvcHRpb25hbFxuICAgICAqIHByb3BlcnRpZXMgc3BlY2lmaWVkIGFzIGFuIGFycmF5IG9mIGBrZXlvZiBUYC5cbiAgICAgKiBAcGFyYW0gZmllbGRzIC0gQSB7QGxpbmsgQ29udmVydGVycy5GaWVsZENvbnZlcnRlcnMgfCBGaWVsZENvbnZlcnRlcnM8VD59IGNvbnRhaW5pbmdcbiAgICAgKiBhIHtAbGluayBDb252ZXJ0ZXJ9IGZvciBlYWNoIGZpZWxkLlxuICAgICAqIEBwYXJhbSBvcHRpb25hbCAtIEFuIGFycmF5IG9mIGBrZXlvZiBUYCBsaXN0aW5nIGZpZWxkcyB0aGF0IGFyZSBub3QgcmVxdWlyZWQuXG4gICAgICoge0BsYWJlbCB3aXRoS2V5c31cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZmllbGRzOiBGaWVsZENvbnZlcnRlcnM8VCwgVEM+LCBvcHRpb25hbD86IChrZXlvZiBUKVtdKTtcbiAgICAvKipcbiAgICAgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29udmVydGVycy5PYmplY3RDb252ZXJ0ZXIuKGNvbnN0cnVjdG9yOndpdGhPcHRpb25zKX1cbiAgICAgKiBhbmQge0BsaW5rIENvbnZlcnRlcnMuT2JqZWN0Q29udmVydGVyLihjb25zdHJ1Y3Rvcjp3aXRoS2V5cyl9LlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWVsZHM6IEZpZWxkQ29udmVydGVyczxULCBUQz4sIG9wdD86IE9iamVjdENvbnZlcnRlck9wdGlvbnM8VD58KGtleW9mIFQpW10pIHtcbiAgICAgICAgc3VwZXIoKGZyb206IHVua25vd24sIF9zZWxmLCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IHt9IGFzIHsgW2tleSBpbiBrZXlvZiBUXTogVFtrZXldIH07XG4gICAgICAgICAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPcHRpb25hbCA9IChmaWVsZHNba2V5XS5pc09wdGlvbmFsIHx8IHRoaXMub3B0aW9ucy5vcHRpb25hbEZpZWxkcz8uaW5jbHVkZXMoa2V5KSkgPz8gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzT3B0aW9uYWxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0aW9uYWxGaWVsZChrZXksIGZpZWxkc1trZXldKS5jb252ZXJ0KGZyb20sIGNvbnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkKGtleSwgZmllbGRzW2tleV0pLmNvbnZlcnQoZnJvbSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgKHJlc3VsdC52YWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkW2tleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RyaWN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcpICYmICghQXJyYXkuaXNBcnJheShmcm9tKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20uaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoIWlzS2V5T2Yoa2V5LCBmaWVsZHMpIHx8IChmaWVsZHNba2V5XSA9PT0gdW5kZWZpbmVkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtrZXl9OiB1bmV4cGVjdGVkIHByb3BlcnR5IGluIHNvdXJjZSBvYmplY3RgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goJ3NvdXJjZSBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChlcnJvcnMubGVuZ3RoID09PSAwKSA/IHN1Y2NlZWQoY29udmVydGVkKSA6IGZhaWwoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdCkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHsgb3B0aW9uYWxGaWVsZHM6IG9wdCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0ID8/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/OiBib29sZWFuLFxufSB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEge0BsaW5rIENvbnZlcnRlcnMudHJhbnNmb3JtT2JqZWN0fSBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybU9iamVjdE9wdGlvbnM8VFNSQz4ge1xuICAgIC8qKlxuICAgICAqIElmIGBzdHJpY3RgIGlzIGB0cnVlYCB0aGVuIHVudXNlZCBwcm9wZXJ0aWVzIGluIHRoZSBzb3VyY2Ugb2JqZWN0IGNhdXNlXG4gICAgICogYW4gZXJyb3IsIG90aGVyd2lzZSB0aGV5IGFyZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIHN0cmljdDogdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2Ygc291cmNlIHByb3BlcnRpZXMgdG8gYmUgaWdub3JlZCB3aGVuIHN0cmljdCBtb2RlXG4gICAgICogaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpZ25vcmU/OiAoa2V5b2YgVFNSQylbXTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gY3JlYXRlIGEgc3Ryb25nbHktdHlwZWQge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYSBzb3VyY2Ugb2JqZWN0IHRvIGFcbiAqIG5ldyBvYmplY3Qgd2l0aCBhIGRpZmZlcmVudCBzaGFwZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogT24gc3VjY2Vzc2Z1bCBjb252ZXJzaW9uLCB0aGUgcmVzdWx0aW5nIHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYSBuZXdcbiAqIG9iamVjdCwgd2hpY2ggY29udGFpbnMgdGhlIGNvbnZlcnRlZCB2YWx1ZXMgdW5kZXIgdGhlIGtleSBuYW1lcyBzcGVjaWZpZWQgYXQgaW5pdGlhbGl6YXRpb24gdGltZS5cbiAqXG4gKiBJdCByZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgYW55IGZpZWxkcyB0byBiZSBleHRyYWN0ZWQgZG8gbm90IGV4aXN0XG4gKiBvciBjYW5ub3QgYmUgY29udmVydGVkLlxuICpcbiAqIEBwYXJhbSBkZXN0aW5hdGlvbkZpZWxkcyAtIEFuIG9iamVjdCB3aXRoIGtleSBuYW1lcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHRhcmdldCBvYmplY3QgYW5kIGFuXG4gKiBhcHByb3ByaWF0ZSB7QGxpbmsgQ29udmVydGVycy5GaWVsZFRyYW5zZm9ybWVycyB8IEZpZWxkVHJhbnNmb3JtZXJzfSB3aGljaCBzcGVjaWZpZXMgdGhlIG5hbWVcbiAqIG9mIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGluIHRoZSBzb3VyY2Ugb2JqZWN0LCB0aGUgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgc291cmNlXG4gKiBwcm9wZXJ0eSBhbmQgYW55IGNvbmZpZ3VyYXRpb24gdG8gZ3VpZGUgdGhlIGNvbnZlcnNpb24uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgd2hpY2ggYWZmZWN0IHRoZSB0cmFuc2Zvcm1hdGlvbi5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdpdGggdGhlIHNwZWNpZmllZCBjb252ZXJzaW9uIGJlaGF2aW9yLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtT2JqZWN0PFRTUkMsIFRERVNULCBUQz11bmtub3duPihcbiAgICBkZXN0aW5hdGlvbkZpZWxkczogRmllbGRUcmFuc2Zvcm1lcnM8VFNSQywgVERFU1QsIFRDPixcbiAgICBvcHRpb25zPzogVHJhbnNmb3JtT2JqZWN0T3B0aW9uczxUU1JDPlxuKTogQ29udmVydGVyPFRERVNULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGYsIGNvbnRleHQ/OiBUQykgPT4ge1xuICAgICAgICAvLyBlc2xpbnQgYnVnIHRoaW5rcyBrZXkgaXMgdXNlZCBiZWZvcmUgZGVmaW5lZFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgY29uc3QgY29udmVydGVkID0ge30gYXMgeyBbIGtleSBpbiBrZXlvZiBUREVTVCBdOiBUREVTVFtrZXldIH07XG4gICAgICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgdXNlZDogU2V0PGtleW9mIFRTUkM+ID0gbmV3IFNldChvcHRpb25zPy5pZ25vcmUpO1xuXG4gICAgICAgIGlmICgodHlwZW9mIGZyb20gPT09ICdvYmplY3QnKSAmJiAoIUFycmF5LmlzQXJyYXkoZnJvbSkpICYmIChmcm9tICE9PSBudWxsKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkZXN0aW5hdGlvbktleSBpbiBkZXN0aW5hdGlvbkZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkZpZWxkc1tkZXN0aW5hdGlvbktleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjS2V5ID0gZGVzdGluYXRpb25GaWVsZHNbZGVzdGluYXRpb25LZXldLmZyb207XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IGRlc3RpbmF0aW9uRmllbGRzW2Rlc3RpbmF0aW9uS2V5XS5jb252ZXJ0ZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5T2Yoc3JjS2V5LCBmcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVydGVyLmNvbnZlcnQoZnJvbVtzcmNLZXldLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRbZGVzdGluYXRpb25LZXldID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuYWRkKHNyY0tleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzcmNLZXl9LT4ke2Rlc3RpbmF0aW9uS2V5fTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkZXN0aW5hdGlvbkZpZWxkc1tkZXN0aW5hdGlvbktleV0ub3B0aW9uYWwgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke1N0cmluZyhzcmNLZXkpfTogcmVxdWlyZWQgcHJvcGVydHkgbWlzc2luZyBpbiBzb3VyY2Ugb2JqZWN0LmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uc3RyaWN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNLZXlPZihrZXksIGZyb20pICYmICghdXNlZC5oYXMoa2V5IGFzIGtleW9mIFRTUkMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYCR7a2V5fTogdW5leHBlY3RlZCBwcm9wZXJ0eSBpbiBzb3VyY2Ugb2JqZWN0YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCgnc291cmNlIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgPyBzdWNjZWVkKGNvbnZlcnRlZCkgOiBmYWlsKGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb25zdHJ1Y3QgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0byBhbiBhcmJpdHJhcnkgc3Ryb25nbHktdHlwZWRcbiAqIHJhbmdlIG9mIHNvbWUgY29tcGFyYWJsZSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBgbWluYCBhbmQgYG1heGAgZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciAtIFN0YXRpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2VUeXBlT2Y8VCwgUlQgZXh0ZW5kcyBSYW5nZU9mPFQ+LCBUQz11bmtub3duPihjb252ZXJ0ZXI6IENvbnZlcnRlcjxULCBUQz4sIGNvbnN0cnVjdG9yOiAoaW5pdDogUmFuZ2VPZlByb3BlcnRpZXM8VD4pID0+IFJlc3VsdDxSVD4pOiBDb252ZXJ0ZXI8UlQsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9iamVjdCh7XG4gICAgICAgICAgICBtaW46IGNvbnZlcnRlcixcbiAgICAgICAgICAgIG1heDogY29udmVydGVyLFxuICAgICAgICB9LCB7IG9wdGlvbmFsRmllbGRzOiBbJ21pbicsICdtYXgnXSB9KS5jb252ZXJ0KGZyb20sIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IoeyBtaW46IHJlc3VsdC52YWx1ZS5taW4sIG1heDogcmVzdWx0LnZhbHVlLm1heCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFpbChyZXN1bHQubWVzc2FnZSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQSBoZWxwZXIgd3JhcHBlciB0byBjb25zdHJ1Y3QgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyB0byB7QGxpbmsgUmFuZ2VPZiB8IFJhbmdlT2Y8VD59XG4gKiB3aGVyZSBgPFQ+YCBpcyBzb21lIGNvbXBhcmFibGUgdHlwZS5cbiAqIEBwYXJhbSBjb252ZXJ0ZXIgLSB7QGxpbmsgQ29udmVydGVyfSB1c2VkIHRvIGNvbnZlcnQgYG1pbmAgYW5kIGBtYXhgIGV4dGVudCBvZiB0aGUgcmFuZ2UuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZU9mPFQsIFRDPXVua25vd24+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPik6IENvbnZlcnRlcjxSYW5nZU9mPFQ+LCBUQz4ge1xuICAgIHJldHVybiByYW5nZVR5cGVPZjxULCBSYW5nZU9mPFQ+LCBUQz4oY29udmVydGVyLCBSYW5nZU9mLmNyZWF0ZVJhbmdlKTtcbn1cbiJdfQ==
867
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILDJDQUF3RTtBQUN4RSx1Q0FBdUQ7QUFDdkQscUNBQWdFO0FBRWhFLGlDQUFpQztBQUNqQyxtREFBZ0Q7QUFDaEQsd0RBQWdDO0FBQ2hDLG1DQUFrQztBQWlCbEM7Ozs7R0FJRztBQUNILE1BQWEsZUFBeUQsU0FBUSx5QkFBb0I7SUFDOUY7Ozs7O09BS0c7SUFDSCxZQUNJLGNBQW1CLEVBQ25CLE1BQXdCLEVBQ3hCLFlBQWdGLGVBQWUsQ0FBQyxRQUFRO1FBRXhHLEtBQUssQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNPLE1BQU0sQ0FBQyxRQUFRLENBQW1CLElBQWE7UUFDckQsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRO1lBQzNCLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsSUFBUyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxJQUFBLGFBQUksRUFBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ08sTUFBTSxDQUFDLEtBQUssQ0FDbEIsT0FBK0IsRUFDL0IsU0FBaUMsRUFDakMsTUFBd0I7UUFFeEIsT0FBTyxJQUFJLGVBQWUsQ0FBUSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsSUFBYSxFQUFFLEVBQUU7WUFDdEUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3RD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LFNBQVM7WUFDZCxHQUFHLEVBQUUsU0FBUztTQUNqQixFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlELElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3BCLE9BQU8sV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDeEU7UUFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFYRCxrQ0FXQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsT0FBTyxDQUFnQixTQUEyQjtJQUM5RCxPQUFPLFdBQVcsQ0FBb0IsU0FBUyxFQUFFLGlCQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUZELDBCQUVDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKlxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7IEJhc2VDb252ZXJ0ZXIsIENvbnZlcnRlciwgQ29udmVydGVyVHJhaXRzIH0gZnJvbSAnLi9jb252ZXJ0ZXInO1xuaW1wb3J0IHsgUmFuZ2VPZiwgUmFuZ2VPZlByb3BlcnRpZXMgfSBmcm9tICcuL3JhbmdlT2YnO1xuaW1wb3J0IHsgUmVzdWx0LCBjYXB0dXJlUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xuXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IEV4dGVuZGVkQXJyYXkgfSBmcm9tICcuL2V4dGVuZGVkQXJyYXknO1xuaW1wb3J0IE11c3RhY2hlIGZyb20gJ211c3RhY2hlJztcbmltcG9ydCB7IGlzS2V5T2YgfSBmcm9tICcuL3V0aWxzJztcblxudHlwZSBPbkVycm9yID0gJ2ZhaWxPbkVycm9yJyB8ICdpZ25vcmVFcnJvcnMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn1cbiAqIG1hdGNoaW5nIG1ldGhvZFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ01hdGNoT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaWYgYSBub24tbWF0Y2hpbmcgc3RyaW5nXG4gICAgICogaXMgZW5jb3VudGVyZWQuXG4gICAgICovXG4gICAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfSBjbGFzcyBleHRlbmRzIHtAbGluayBCYXNlQ29udmVydGVyfVxuICogdG8gcHJvdmlkZSBzdHJpbmctc3BlY2lmaWMgaGVscGVyIG1ldGhvZHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJpbmdDb252ZXJ0ZXI8VCBleHRlbmRzIHN0cmluZyA9IHN0cmluZywgVEMgPSB1bmtub3duPiBleHRlbmRzIEJhc2VDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfS5cbiAgICAgKiBAcGFyYW0gZGVmYXVsdENvbnRleHQgLSBPcHRpb25hbCBjb250ZXh0IHVzZWQgYnkgdGhlIGNvbnZlcnNpb24uXG4gICAgICogQHBhcmFtIHRyYWl0cyAtIE9wdGlvbmFsIHRyYWl0cyB0byBiZSBhcHBsaWVkIHRvIHRoZSBjb252ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgLSBPcHRpb25hbCBjb252ZXJzaW9uIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIHRoZSBjb252ZXJzaW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgZGVmYXVsdENvbnRleHQ/OiBUQyxcbiAgICAgICAgdHJhaXRzPzogQ29udmVydGVyVHJhaXRzLFxuICAgICAgICBjb252ZXJ0ZXI6IChmcm9tOiB1bmtub3duLCBzZWxmOiBDb252ZXJ0ZXI8VCwgVEM+LCBjb250ZXh0PzogVEMpID0+IFJlc3VsdDxUPiA9IFN0cmluZ0NvbnZlcnRlci5fY29udmVydCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoY29udmVydGVyLCBkZWZhdWx0Q29udGV4dCwgdHJhaXRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9jb252ZXJ0PFQgZXh0ZW5kcyBzdHJpbmc+KGZyb206IHVua25vd24pOiBSZXN1bHQ8VD4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGZyb20gPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHN1Y2NlZWQoZnJvbSBhcyBUKVxuICAgICAgICAgICAgOiBmYWlsKGBOb3QgYSBzdHJpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfd3JhcDxUIGV4dGVuZHMgc3RyaW5nLCBUQz4oXG4gICAgICAgIHdyYXBwZWQ6IFN0cmluZ0NvbnZlcnRlcjxULCBUQz4sXG4gICAgICAgIGNvbnZlcnRlcjogKGZyb206IFQpID0+IFJlc3VsdDxUPixcbiAgICAgICAgdHJhaXRzPzogQ29udmVydGVyVHJhaXRzXG4gICAgKTogU3RyaW5nQ29udmVydGVyPFQsIFRDPiB7XG4gICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFQsIFRDPih1bmRlZmluZWQsIHVuZGVmaW5lZCwgKGZyb206IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmNvbnZlcnQoZnJvbSkub25TdWNjZXNzKGNvbnZlcnRlcik7XG4gICAgICAgIH0pLl93aXRoKHdyYXBwZWQuX3RyYWl0cyh0cmFpdHMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfSB3aGljaCBjb25zdHJhaW5zIHRoZSByZXN1bHQgdG8gbWF0Y2hcbiAgICAgKiBhIHN1cHBsaWVkIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gbWF0Y2ggLSBUaGUgc3RyaW5nIHRvIGJlIG1hdGNoZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ01hdGNoT3B0aW9uc30gZm9yIHRoaXMgY29udmVyc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG1hdGNoaW5nIHN0cmluZyBvciB7QGxpbmsgRmFpbHVyZX0gd2l0aCBhbiBpbmZvcm1hdGl2ZVxuICAgICAqIGVycm9yIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2guXG4gICAgICoge0BsYWJlbCBzdHJpbmd9XG4gICAgICovXG4gICAgcHVibGljIG1hdGNoaW5nKG1hdGNoOiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPFN0cmluZ01hdGNoT3B0aW9ucz4pOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn0gd2hpY2ggY29uc3RyYWlucyB0aGUgcmVzdWx0IHRvIG1hdGNoXG4gICAgICogb25lIG9mIGEgc3VwcGxpZWQgYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICAgKiBAcGFyYW0gbWF0Y2ggLSBUaGUgYXJyYXkgb2YgYWxsb3dlZCBzdHJpbmdzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nTWF0Y2hPcHRpb25zfSBmb3IgdGhpcyBjb252ZXJzaW9uLlxuICAgICAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGEgbWF0Y2hpbmcgc3RyaW5nIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGluZm9ybWF0aXZlXG4gICAgICogZXJyb3IgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBtYXRjaC5cbiAgICAgKiB7QGxhYmVsIGFycmF5fVxuICAgICAqL1xuICAgIHB1YmxpYyBtYXRjaGluZyhtYXRjaDogc3RyaW5nW10sIG9wdGlvbnM/OiBQYXJ0aWFsPFN0cmluZ01hdGNoT3B0aW9ucz4pOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBDb252ZXJ0ZXJzLlN0cmluZ0NvbnZlcnRlciB8IFN0cmluZ0NvbnZlcnRlcn0gd2hpY2ggY29uc3RyYWlucyB0aGUgcmVzdWx0IHRvIG1hdGNoXG4gICAgICogb25lIG9mIGEgc3VwcGxpZWQgYFNldGAgb2Ygc3RyaW5ncy5cbiAgICAgKiBAcGFyYW0gbWF0Y2ggLSBUaGUgYFNldGAgb2YgYWxsb3dlZCBzdHJpbmdzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nTWF0Y2hPcHRpb25zfSBmb3IgdGhpcyBjb252ZXJzaW9uLlxuICAgICAqIEByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIGEgbWF0Y2hpbmcgc3RyaW5nIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGluZm9ybWF0aXZlXG4gICAgICogZXJyb3IgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBtYXRjaC5cbiAgICAgKiB7QGxhYmVsIHNldH1cbiAgICAgKi9cbiAgICBwdWJsaWMgbWF0Y2hpbmcobWF0Y2g6IFNldDxUPiwgb3B0aW9ucz86IFBhcnRpYWw8U3RyaW5nTWF0Y2hPcHRpb25zPik6IFN0cmluZ0NvbnZlcnRlcjxULCBUQz47XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfSB3aGljaCBjb25zdHJhaW5zIHRoZSByZXN1bHQgdG8gbWF0Y2hcbiAgICAgKiBhIHN1cHBsaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICAgKiBAcGFyYW0gbWF0Y2ggLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHRvIGJlIHVzZWQgYXMgYSBjb25zdHJhaW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nTWF0Y2hPcHRpb25zfSBmb3IgdGhpcyBjb252ZXJzaW9uXG4gICAgICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggYSBtYXRjaGluZyBzdHJpbmcgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gaW5mb3JtYXRpdmVcbiAgICAgKiBlcnJvciBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoLlxuICAgICAqIHtAbGFiZWwgcmVnZXhwfVxuICAgICAqL1xuICAgIHB1YmxpYyBtYXRjaGluZyhtYXRjaDogUmVnRXhwLCBvcHRpb25zPzogUGFydGlhbDxTdHJpbmdNYXRjaE9wdGlvbnM+KTogU3RyaW5nQ29udmVydGVyPFQsIFRDPjtcbiAgICAvKipcbiAgICAgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIuKG1hdGNoaW5nI3N0cmluZykgfCBTdHJpbmdDb252ZXJ0ZXIubWF0Y2hpbmcoc3RyaW5nKX0sXG4gICAgICoge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyLihtYXRjaGluZyNhcnJheSkgfCBTdHJpbmdDb252ZXJ0ZXIubWF0Y2hpbmcoc3RyaW5nW10pfSxcbiAgICAgKiB7QGxpbmsgQ29udmVydGVycy5TdHJpbmdDb252ZXJ0ZXIuKG1hdGNoaW5nI3NldCkgfCBTdHJpbmdDb252ZXJ0ZXIubWF0Y2hpbmcoU2V0PHN0cmluZz4pfSwgYW5kXG4gICAgICoge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyLihtYXRjaGluZyNyZWdleHApIHwgU3RyaW5nQ29udmVydGVyLm1hdGNoaW5nKFJlZ0V4cCl9LlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXRjaGluZyhtYXRjaDogc3RyaW5nIHwgc3RyaW5nW10gfCBTZXQ8VD4gfCBSZWdFeHAsIG9wdGlvbnM/OiBQYXJ0aWFsPFN0cmluZ01hdGNoT3B0aW9ucz4pOiBTdHJpbmdDb252ZXJ0ZXI8VCwgVEM+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG9wdGlvbnM/Lm1lc3NhZ2U7XG4gICAgICAgIGlmICh0eXBlb2YgbWF0Y2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nQ29udmVydGVyLl93cmFwPFQsIFRDPih0aGlzLCAoZnJvbTogVCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAobWF0Y2ggPT09IGZyb20pXG4gICAgICAgICAgICAgICAgICAgID8gc3VjY2VlZChmcm9tIGFzIFQpXG4gICAgICAgICAgICAgICAgICAgIDogZmFpbChtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBcIiR7ZnJvbX1cIjogJHttZXNzYWdlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYFwiJHtmcm9tfVwiOiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2h9XCJgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hdGNoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nQ29udmVydGVyLl93cmFwPFQsIFRDPih0aGlzLCAoZnJvbTogVCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAobWF0Y2gudGVzdChmcm9tKSlcbiAgICAgICAgICAgICAgICAgICAgPyBzdWNjZWVkKGZyb20gYXMgVClcbiAgICAgICAgICAgICAgICAgICAgOiBmYWlsKG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYFwiJHtmcm9tfVwiOiAke21lc3NhZ2V9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgXCIke2Zyb219XCI6IGRvZXMgbm90IG1hdGNoIFwiJHttYXRjaH1cImApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmdDb252ZXJ0ZXIuX3dyYXA8VCwgVEM+KHRoaXMsIChmcm9tOiBUKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChtYXRjaC5oYXMoZnJvbSkpXG4gICAgICAgICAgICAgICAgICAgID8gc3VjY2VlZChmcm9tIGFzIFQpXG4gICAgICAgICAgICAgICAgICAgIDogZmFpbChtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBcIiR7ZnJvbX1cIjogJHttZXNzYWdlfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYFwiJHtmcm9tfVwiOiBub3QgZm91bmQgaW4gc2V0YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmdDb252ZXJ0ZXIuX3dyYXA8VCwgVEM+KHRoaXMsIChmcm9tOiBUKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChtYXRjaC5pbmNsdWRlcyhmcm9tKSlcbiAgICAgICAgICAgICAgICAgICAgPyBzdWNjZWVkKGZyb20gYXMgVClcbiAgICAgICAgICAgICAgICAgICAgOiBmYWlsKG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYFwiJHtmcm9tfVwiOiAke21lc3NhZ2V9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgXCIke2Zyb219XCI6IG5vdCBmb3VuZCBpbiBbJHttYXRjaC5qb2luKCcsJyl9XWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQSBjb252ZXJ0ZXIgdG8gY29udmVydCB1bmtub3duIHRvIHN0cmluZy4gVmFsdWVzIG9mIHR5cGVcbiAqIHN0cmluZyBzdWNjZWVkLiAgQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZyA9IG5ldyBTdHJpbmdDb252ZXJ0ZXIoKTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcnMuU3RyaW5nQ29udmVydGVyIHwgU3RyaW5nQ29udmVydGVyfSB3aGljaCBjb252ZXJ0c1xuICogYHVua25vd25gIHRvIGBzdHJpbmdgLCBhcHBseWluZyB0ZW1wbGF0ZSBjb252ZXJzaW9ucyBzdXBwbGllZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSBvciBhdFxuICogcnVudGltZSBhcyBjb250ZXh0LlxuICogQHJlbWFya3NcbiAqIFRlbXBsYXRlIGNvbnZlcnNpb25zIGFyZSBhcHBsaWVkIHVzaW5nIGBtdXN0YWNoZWAgc3ludGF4LlxuICogQHBhcmFtIGRlZmF1bHRDb250ZXh0IC0gT3B0aW9uYWwgZGVmYXVsdCBjb250ZXh0IHRvIHVzZSBmb3IgdGVtcGxhdGUgdmFsdWVzLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJuaW5nIGBzdHJpbmdgLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGVTdHJpbmcoZGVmYXVsdENvbnRleHQ/OiB1bmtub3duKTogU3RyaW5nQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPHN0cmluZywgdW5rbm93bj4oZGVmYXVsdENvbnRleHQsIHVuZGVmaW5lZCwgKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8c3RyaW5nLCB1bmtub3duPiwgY29udGV4dD86IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhaWwoYE5vdCBhIHN0cmluZzogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBNdXN0YWNoZS5yZW5kZXIoZnJvbSwgY29udGV4dCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBgdW5rbm93bmAgdG8gb25lIG9mIGEgc2V0IG9mIHN1cHBsaWVkXG4gKiBlbnVtZXJhdGVkIHZhbHVlcy4gQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqXG4gKiBAcmVtYXJrc1xuICogQWxsb3dlZCBlbnVtZXJhdGVkIHZhbHVlcyBjYW4gYWxzbyBiZSBzdXBwbGllZCBhcyBjb250ZXh0IGF0IGNvbnZlcnNpb24gdGltZS5cbiAqIEBwYXJhbSB2YWx1ZXMgLSBBcnJheSBvZiBhbGxvd2VkIHZhbHVlcy5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBDb252ZXJ0ZXJ9IHJldHVybmluZyBgPFQ+YC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudW1lcmF0ZWRWYWx1ZTxUPih2YWx1ZXM6IFRbXSk6IENvbnZlcnRlcjxULCBUW10+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgVFtdPiwgY29udGV4dD86IFRbXSk6IFJlc3VsdDxUPiA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBjb250ZXh0ID8/IHZhbHVlcztcbiAgICAgICAgY29uc3QgaW5kZXggPSB2LmluZGV4T2YoZnJvbSBhcyBUKTtcbiAgICAgICAgcmV0dXJuIChpbmRleCA+PSAwID8gc3VjY2VlZCh2W2luZGV4XSkgOiBmYWlsKGBJbnZhbGlkIGVudW1lcmF0ZWQgdmFsdWUgJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGB1bmtub3duYCB0byBvbmUgb2YgYSBzZXQgb2Ygc3VwcGxpZWQgZW51bWVyYXRlZFxuICogdmFsdWVzLCBtYXBwaW5nIGFueSBvZiBtdWx0aXBsZSBzdXBwbGllZCB2YWx1ZXMgdG8gdGhlIGVudW1lcmF0aW9uLlxuICogQHJlbWFya3NcbiAqIEVuYWJsZXMgbWFwcGluZyBvZiBtdWx0aXBsZSBpbnB1dCB2YWx1ZXMgdG8gYSBjb25zaXN0ZW50IGludGVybmFsIHJlcHJlc2VudGF0aW9uIChzbyBlLmcuIGAneSdgLCBgJ3llcydgLFxuICogYCd0cnVlJ2AsIGAxYCBhbmQgYHRydWVgIGNhbiBhbGwgbWFwIHRvIGJvb2xlYW4gYHRydWVgKVxuICogQHBhcmFtIG1hcCAtIEFuIGFycmF5IG9mIHR1cGxlcyBkZXNjcmliaW5nIHRoZSBtYXBwaW5nLiBUaGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHR1cGxlIGlzIHRoZSByZXN1bHRcbiAqIHZhbHVlLCB0aGUgc2Vjb25kIGlzIHRoZSBzZXQgb2YgdmFsdWVzIHRoYXQgbWFwIHRvIHRoZSByZXN1bHQuICBUdXBsZXMgYXJlIGV2YWx1YXRlZCBpbiB0aGUgb3JkZXJcbiAqIHN1cHBsaWVkIGFuZCBhcmUgbm90IGNoZWNrZWQgZm9yIGR1cGxpY2F0ZXMuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIEFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGFwcGxpZXMgdGhlIG1hcHBpbmcgYW5kIHlpZWxkcyBgPFQ+YCBvbiBzdWNjZXNzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwcGVkRW51bWVyYXRlZFZhbHVlPFQ+KG1hcDogW1QsIHVua25vd25bXV1bXSwgbWVzc2FnZT86IHN0cmluZyk6IENvbnZlcnRlcjxULCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgdW5kZWZpbmVkPiwgX2NvbnRleHQ/OiB1bmtub3duKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtYXApIHtcbiAgICAgICAgICAgIGlmIChpdGVtWzFdLmluY2x1ZGVzKGZyb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoaXRlbVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwobWVzc2FnZSA/IGAke0pTT04uc3RyaW5naWZ5KGZyb20pfTogJHttZXNzYWdlfWAgOiBgQ2Fubm90IG1hcCAnJHtKU09OLnN0cmluZ2lmeShmcm9tKX0nIHRvIGEgc3VwcG9ydGVkIHZhbHVlYCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGB1bmtub3duYCB0byBzb21lIHN1cHBsaWVkIGxpdGVyYWwgdmFsdWUuIFN1Y2NlZWRzIHdpdGhcbiAqIHRoZSBzdXBwbGllZCB2YWx1ZSBpZiBhbiBpZGVudGl0eSBjb21wYXJpc29uIHN1Y2NlZWRzLCBmYWlscyBvdGhlcndpc2UuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgY29tcGFyZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIHJldHVybnMgdGhlIHN1cHBsaWVkIHZhbHVlIG9uIHN1Y2Nlc3MuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsPFQ+KHZhbHVlOiBUKTogQ29udmVydGVyPFQsIHVua25vd24+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8VCwgdW5rbm93bj4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8VCwgdW5rbm93bj4sIF9jb250ZXh0PzogdW5rbm93bik6IFJlc3VsdDxUPiA9PiB7XG4gICAgICAgIHJldHVybiAoZnJvbSA9PT0gdmFsdWUpID8gc3VjY2VlZCh2YWx1ZSkgOiBmYWlsKGAke0pTT04uc3RyaW5naWZ5KGZyb20pfTogZG9lcyBub3QgbWF0Y2ggJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRGVwcmVjYXRlZCBhbGlhcyBmb3IgQHNlZSBsaXRlcmFsXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgY29tcGFyZWQuXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIENvbnZlcnRlcnMubGl0ZXJhbH0gaW5zdGVhZC5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgdmFsdWUgPSBsaXRlcmFsO1xuXG4vKipcbiAqIEEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYHVua25vd25gIHRvIGEgYG51bWJlcmAuXG4gKiBAcmVtYXJrc1xuICogTnVtYmVycyBhbmQgc3RyaW5ncyB3aXRoIGEgbnVtZXJpYyBmb3JtYXQgc3VjY2VlZC4gQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG51bWJlciA9IG5ldyBCYXNlQ29udmVydGVyPG51bWJlcj4oKGZyb206IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGZyb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IG51bTogbnVtYmVyID0gKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJyA/IE51bWJlcihmcm9tKSA6IE5hTik7XG4gICAgICAgIHJldHVybiBpc05hTihudW0pXG4gICAgICAgICAgICA/IGZhaWwoYE5vdCBhIG51bWJlcjogJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKVxuICAgICAgICAgICAgOiBzdWNjZWVkKG51bSk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xufSk7XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBgdW5rbm93bmAgdG8gYGJvb2xlYW5gLlxuICogQHJlbWFya3NcbiAqIEJvb2xlYW4gdmFsdWVzIG9yIHRoZSBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZ3MgYCd0cnVlJ2AgYW5kIGAnZmFsc2UnYCBzdWNjZWVkLlxuICogQW55dGhpbmcgZWxzZSBmYWlscy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSBuZXcgQmFzZUNvbnZlcnRlcjxib29sZWFuPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20gYXMgYm9vbGVhbik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJykge1xuICAgICAgICBzd2l0Y2ggKGZyb20udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSAndHJ1ZSc6IHJldHVybiBzdWNjZWVkKHRydWUpO1xuICAgICAgICAgICAgY2FzZSAnZmFsc2UnOiByZXR1cm4gc3VjY2VlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhaWwoYE5vdCBhIGJvb2xlYW46ICR7SlNPTi5zdHJpbmdpZnkoZnJvbSl9YCk7XG59KTtcblxuLyoqXG4gKiBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGFuIG9wdGlvbmFsIGBzdHJpbmdgIHZhbHVlLiBWYWx1ZXMgb2YgdHlwZVxuICogYHN0cmluZ2AgYXJlIHJldHVybmVkLiAgQW55dGhpbmcgZWxzZSByZXR1cm5zIHtAbGluayBTdWNjZXNzfSB3aXRoIHZhbHVlIGB1bmRlZmluZWRgLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgb3B0aW9uYWxTdHJpbmcgPSBzdHJpbmcub3B0aW9uYWwoKTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggY29udmVydHMgYW55IGBzdHJpbmdgIGludG8gYW5cbiAqIGFycmF5IG9mIGBzdHJpbmdgLCBieSBzZXBhcmF0aW5nIGF0IGEgc3VwcGxpZWQgZGVsaW1pdGVyLlxuICogQHJlbWFya3NcbiAqIERlbGltaXRlciBtYXkgYWxzbyBiZSBzdXBwbGllZCBhcyBjb250ZXh0IGF0IGNvbnZlcnNpb24gdGltZS5cbiAqIEBwYXJhbSBkZWxpbWl0ZXIgLSBUaGUgZGVsaW1pdGVyIGF0IHdoaWNoIHRvIHNwbGl0LlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJuaW5nIGBzdHJpbmdbXWAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpbWl0ZWRTdHJpbmcoZGVsaW1pdGVyOiBzdHJpbmcsIG9wdGlvbnM6ICdmaWx0ZXJlZCd8J2FsbCcgPSAnZmlsdGVyZWQnKTogQ29udmVydGVyPHN0cmluZ1tdLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXI8c3RyaW5nW10sIHN0cmluZz4oKGZyb206IHVua25vd24sIF9zZWxmOiBDb252ZXJ0ZXI8c3RyaW5nW10sIHN0cmluZz4sIGNvbnRleHQ/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RyaW5nLmNvbnZlcnQoZnJvbSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIGxldCBzdHJpbmdzID0gcmVzdWx0LnZhbHVlLnNwbGl0KGNvbnRleHQgPz8gZGVsaW1pdGVyKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgIHN0cmluZ3MgPSBzdHJpbmdzLmZpbHRlcigocykgPT4gKHMudHJpbSgpLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKHN0cmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIGFuIGlzbyBmb3JtYXR0ZWQgc3RyaW5nLCBhIG51bWJlciBvciBhIGBEYXRlYCBvYmplY3QgdG9cbiAqIGEgYERhdGVgIG9iamVjdC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzb0RhdGUgPSBuZXcgQmFzZUNvbnZlcnRlcjxEYXRlPigoZnJvbTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSVNPKGZyb20pO1xuICAgICAgICBpZiAoZHQuaXNWYWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoZHQudG9KU0RhdGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhaWwoYEludmFsaWQgZGF0ZTogJHtkdC5pbnZhbGlkRXhwbGFuYXRpb259YCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBmcm9tID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gc3VjY2VlZChuZXcgRGF0ZShmcm9tKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGZyb20gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBzdWNjZWVkKGZyb20pO1xuICAgIH1cbiAgICByZXR1cm4gZmFpbChgQ2Fubm90IGNvbnZlcnQgJHtKU09OLnN0cmluZ2lmeShmcm9tKX0gdG8gRGF0ZWApO1xufSk7XG5cbi8qKlxuICogQSB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhbiBvcHRpb25hbCBgbnVtYmVyYCB2YWx1ZS5cbiAqIEByZW1hcmtzXG4gKiBWYWx1ZXMgb2YgdHlwZSBgbnVtYmVyYCBvciBudW1lcmljIHN0cmluZ3MgYXJlIGNvbnZlcnRlZCBhbmQgcmV0dXJuZWQuXG4gKiBBbnl0aGluZyBlbHNlIHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdmFsdWUgYHVuZGVmaW5lZGAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbE51bWJlciA9IG51bWJlci5vcHRpb25hbCgpO1xuXG4vKipcbiAqIEEge0BsaW5rIENvbnZlcnRlcn0gdG8gY29udmVydCBhbiBvcHRpb25hbCBgYm9vbGVhbmAgdmFsdWUuXG4gKiBAcmVtYXJrc1xuICogVmFsdWVzIG9mIHR5cGUgYGJvb2xlYW5gIG9yIHN0cmluZ3MgdGhhdCBtYXRjaCAoY2FzZS1pbnNlbnNpdGl2ZSkgYCd0cnVlJ2BcbiAqIG9yIGAnZmFsc2UnYCBhcmUgY29udmVydGVkIGFuZCByZXR1cm5lZC4gIEFueXRoaW5nIGVsc2UgcmV0dXJucyB7QGxpbmsgU3VjY2Vzc31cbiAqIHdpdGggdmFsdWUgYHVuZGVmaW5lZGAuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBvcHRpb25hbEJvb2xlYW4gPSBib29sZWFuLm9wdGlvbmFsKCk7XG5cbi8qKlxuICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEge0BsaW5rIENvbnZlcnRlcn0gZm9yIHBvbHltb3JwaGljIHZhbHVlcy4gIFJldHVybnMgYVxuICogY29udmVydGVyIHdoaWNoIEludm9rZXMgdGhlIHdyYXBwZWQgY29udmVydGVycyBpbiBzZXF1ZW5jZSwgcmV0dXJuaW5nIHRoZSBmaXJzdCBzdWNjZXNzZnVsXG4gKiByZXN1bHQuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vbmUgb2YgdGhlIHN1cHBsaWVkIGNvbnZlcnRlcnMgY2FuIGNvbnZlcnQgdGhlIHZhbHVlLlxuICogQHJlbWFya3NcbiAqIElmIGBvbkVycm9yYCBpcyBgaWdub3JlRXJyb3JzYCAoZGVmYXVsdCksIHRoZW4gZXJyb3JzIGZyb20gYW55IG9mIHRoZVxuICogY29udmVydGVycyBhcmUgaWdub3JlZCBwcm92aWRlZCB0aGF0IHNvbWUgY29udmVydGVyIHN1Y2NlZWRzLiAgSWZcbiAqIG9uRXJyb3IgaXMgYGZhaWxPbkVycm9yYCwgdGhlbiBhbiBlcnJvciBmcm9tIGFueSBjb252ZXJ0ZXIgZmFpbHMgdGhlIGVudGlyZVxuICogY29udmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gY29udmVydGVycyAtIEFuIG9yZGVyZWQgbGlzdCBvZiB7QGxpbmsgQ29udmVydGVyIHwgY29udmVydGVyc30gdG8gYmUgY29uc2lkZXJlZC5cbiAqIEBwYXJhbSBvbkVycm9yIC0gU3BlY2lmaWVzIHRyZWF0bWVudCBvZiB1bmNvbnZlcnRpYmxlIGVsZW1lbnRzLlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIENvbnZlcnRlcn0gd2hpY2ggeWllbGRzIGEgdmFsdWUgZnJvbSB0aGUgdW5pb24gb2YgdGhlIHR5cGVzIHJldHVybmVkXG4gKiBieSB0aGUgd3JhcHBlZCBjb252ZXJ0ZXJzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25lT2Y8VCwgVEM9dW5rbm93bj4oY29udmVydGVyczogQXJyYXk8Q29udmVydGVyPFQsIFRDPj4sIG9uRXJyb3I6IE9uRXJyb3IgPSAnaWdub3JlRXJyb3JzJyk6IENvbnZlcnRlcjxULCBUQz4ge1xuICAgIHJldHVybiBuZXcgQmFzZUNvbnZlcnRlcigoZnJvbTogdW5rbm93biwgX3NlbGYsIGNvbnRleHQ/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/OiBib29sZWFuLFxufSB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEge0BsaW5rIENvbnZlcnRlcnMudHJhbnNmb3JtT2JqZWN0fSBjYWxsLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybU9iamVjdE9wdGlvbnM8VFNSQz4ge1xuICAgIC8qKlxuICAgICAqIElmIGBzdHJpY3RgIGlzIGB0cnVlYCB0aGVuIHVudXNlZCBwcm9wZXJ0aWVzIGluIHRoZSBzb3VyY2Ugb2JqZWN0IGNhdXNlXG4gICAgICogYW4gZXJyb3IsIG90aGVyd2lzZSB0aGV5IGFyZSBpZ25vcmVkLlxuICAgICAqL1xuICAgIHN0cmljdDogdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2Ygc291cmNlIHByb3BlcnRpZXMgdG8gYmUgaWdub3JlZCB3aGVuIHN0cmljdCBtb2RlXG4gICAgICogaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpZ25vcmU/OiAoa2V5b2YgVFNSQylbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoaXMgdHJhbnNmb3JtIHRvIGJlIHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBjcmVhdGUgYSBzdHJvbmdseS10eXBlZCB7QGxpbmsgQ29udmVydGVyfSB3aGljaCBjb252ZXJ0cyBhIHNvdXJjZSBvYmplY3QgdG8gYVxuICogbmV3IG9iamVjdCB3aXRoIGEgZGlmZmVyZW50IHNoYXBlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24sIHRoZSByZXN1bHRpbmcge0BsaW5rIENvbnZlcnRlcn0gcmV0dXJucyB7QGxpbmsgU3VjY2Vzc30gd2l0aCBhIG5ld1xuICogb2JqZWN0LCB3aGljaCBjb250YWlucyB0aGUgY29udmVydGVkIHZhbHVlcyB1bmRlciB0aGUga2V5IG5hbWVzIHNwZWNpZmllZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLlxuICpcbiAqIEl0IHJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBhbnkgZmllbGRzIHRvIGJlIGV4dHJhY3RlZCBkbyBub3QgZXhpc3RcbiAqIG9yIGNhbm5vdCBiZSBjb252ZXJ0ZWQuXG4gKlxuICogQHBhcmFtIGRlc3RpbmF0aW9uRmllbGRzIC0gQW4gb2JqZWN0IHdpdGgga2V5IG5hbWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgdGFyZ2V0IG9iamVjdCBhbmQgYW5cbiAqIGFwcHJvcHJpYXRlIHtAbGluayBDb252ZXJ0ZXJzLkZpZWxkVHJhbnNmb3JtZXJzIHwgRmllbGRUcmFuc2Zvcm1lcnN9IHdoaWNoIHNwZWNpZmllcyB0aGUgbmFtZVxuICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaW4gdGhlIHNvdXJjZSBvYmplY3QsIHRoZSBjb252ZXJ0ZXIgdXNlZCB0byBjb252ZXJ0IHRoZSBzb3VyY2VcbiAqIHByb3BlcnR5IGFuZCBhbnkgY29uZmlndXJhdGlvbiB0byBndWlkZSB0aGUgY29udmVyc2lvbi5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB3aGljaCBhZmZlY3QgdGhlIHRyYW5zZm9ybWF0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIENvbnZlcnRlcn0gd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnZlcnNpb24gYmVoYXZpb3IuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1PYmplY3Q8VFNSQywgVERFU1QsIFRDPXVua25vd24+KFxuICAgIGRlc3RpbmF0aW9uRmllbGRzOiBGaWVsZFRyYW5zZm9ybWVyczxUU1JDLCBUREVTVCwgVEM+LFxuICAgIG9wdGlvbnM/OiBUcmFuc2Zvcm1PYmplY3RPcHRpb25zPFRTUkM+XG4pOiBDb252ZXJ0ZXI8VERFU1QsIFRDPiB7XG4gICAgcmV0dXJuIG5ldyBCYXNlQ29udmVydGVyKChmcm9tOiB1bmtub3duLCBfc2VsZiwgY29udGV4dD86IFRDKSA9PiB7XG4gICAgICAgIC8vIGVzbGludCBidWcgdGhpbmtzIGtleSBpcyB1c2VkIGJlZm9yZSBkZWZpbmVkXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBjb25zdCBjb252ZXJ0ZWQgPSB7fSBhcyB7IFsga2V5IGluIGtleW9mIFRERVNUIF06IFRERVNUW2tleV0gfTtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBjb25zdCB1c2VkOiBTZXQ8a2V5b2YgVFNSQz4gPSBuZXcgU2V0KG9wdGlvbnM/Lmlnbm9yZSk7XG5cbiAgICAgICAgaWYgKCh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcpICYmICghQXJyYXkuaXNBcnJheShmcm9tKSkgJiYgKGZyb20gIT09IG51bGwpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlc3RpbmF0aW9uS2V5IGluIGRlc3RpbmF0aW9uRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uRmllbGRzW2Rlc3RpbmF0aW9uS2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcmNLZXkgPSBkZXN0aW5hdGlvbkZpZWxkc1tkZXN0aW5hdGlvbktleV0uZnJvbTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udmVydGVyID0gZGVzdGluYXRpb25GaWVsZHNbZGVzdGluYXRpb25LZXldLmNvbnZlcnRlcjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNLZXlPZihzcmNLZXksIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJ0ZXIuY29udmVydChmcm9tW3NyY0tleV0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZFtkZXN0aW5hdGlvbktleV0gPSByZXN1bHQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuaXNGYWlsdXJlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzcmNLZXl9LT4ke2Rlc3RpbmF0aW9uS2V5fTogJHtyZXN1bHQubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuYWRkKHNyY0tleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVzdGluYXRpb25GaWVsZHNbZGVzdGluYXRpb25LZXldLm9wdGlvbmFsICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgJHtTdHJpbmcoc3JjS2V5KX06IHJlcXVpcmVkIHByb3BlcnR5IG1pc3NpbmcgaW4gc291cmNlIG9iamVjdC5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnN0cmljdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzS2V5T2Yoa2V5LCBmcm9tKSAmJiAoIXVzZWQuaGFzKGtleSBhcyBrZXlvZiBUU1JDKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke2tleX06IHVuZXhwZWN0ZWQgcHJvcGVydHkgaW4gc291cmNlIG9iamVjdGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goJ3NvdXJjZSBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGVycm9ycy5sZW5ndGggPT09IDApID8gc3VjY2VlZChjb252ZXJ0ZWQpIDogZmFpbChvcHRpb25zPy5kZXNjcmlwdGlvbiA/IGAke29wdGlvbnMuZGVzY3JpcHRpb259OlxcbiAgJHtlcnJvcnMuam9pbignXFxuICAnKX1gIDogZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnN0cnVjdCBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRvIGFuIGFyYml0cmFyeSBzdHJvbmdseS10eXBlZFxuICogcmFuZ2Ugb2Ygc29tZSBjb21wYXJhYmxlIHR5cGUuXG4gKiBAcGFyYW0gY29udmVydGVyIC0ge0BsaW5rIENvbnZlcnRlcn0gdXNlZCB0byBjb252ZXJ0IGBtaW5gIGFuZCBgbWF4YCBleHRlbnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gU3RhdGljIGNvbnN0cnVjdG9yIHRvIGluc3RhbnRpYXRlIHRoZSBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZVR5cGVPZjxULCBSVCBleHRlbmRzIFJhbmdlT2Y8VD4sIFRDPXVua25vd24+KGNvbnZlcnRlcjogQ29udmVydGVyPFQsIFRDPiwgY29uc3RydWN0b3I6IChpbml0OiBSYW5nZU9mUHJvcGVydGllczxUPikgPT4gUmVzdWx0PFJUPik6IENvbnZlcnRlcjxSVCwgVEM+IHtcbiAgICByZXR1cm4gbmV3IEJhc2VDb252ZXJ0ZXIoKGZyb206IHVua25vd24sIF9zZWxmLCBjb250ZXh0PzogVEMpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gb2JqZWN0KHtcbiAgICAgICAgICAgIG1pbjogY29udmVydGVyLFxuICAgICAgICAgICAgbWF4OiBjb252ZXJ0ZXIsXG4gICAgICAgIH0sIHsgb3B0aW9uYWxGaWVsZHM6IFsnbWluJywgJ21heCddIH0pLmNvbnZlcnQoZnJvbSwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvcih7IG1pbjogcmVzdWx0LnZhbHVlLm1pbiwgbWF4OiByZXN1bHQudmFsdWUubWF4IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKHJlc3VsdC5tZXNzYWdlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBIGhlbHBlciB3cmFwcGVyIHRvIGNvbnN0cnVjdCBhIHtAbGluayBDb252ZXJ0ZXJ9IHdoaWNoIGNvbnZlcnRzIHRvIHtAbGluayBSYW5nZU9mIHwgUmFuZ2VPZjxUPn1cbiAqIHdoZXJlIGA8VD5gIGlzIHNvbWUgY29tcGFyYWJsZSB0eXBlLlxuICogQHBhcmFtIGNvbnZlcnRlciAtIHtAbGluayBDb252ZXJ0ZXJ9IHVzZWQgdG8gY29udmVydCBgbWluYCBhbmQgYG1heGAgZXh0ZW50IG9mIHRoZSByYW5nZS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlT2Y8VCwgVEM9dW5rbm93bj4oY29udmVydGVyOiBDb252ZXJ0ZXI8VCwgVEM+KTogQ29udmVydGVyPFJhbmdlT2Y8VD4sIFRDPiB7XG4gICAgcmV0dXJuIHJhbmdlVHlwZU9mPFQsIFJhbmdlT2Y8VD4sIFRDPihjb252ZXJ0ZXIsIFJhbmdlT2YuY3JlYXRlUmFuZ2UpO1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fgv/ts-utils",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "Assorted Typescript Utilities",
5
5
  "main": "index.js",
6
6
  "scripts": {