@dbx-tools/shared-core 0.6.210 → 0.6.212

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/lib/src/object.js CHANGED
@@ -1180,4 +1180,4 @@ export function deepEqual(a, b, comparator) {
1180
1180
  }
1181
1181
  return true;
1182
1182
  }
1183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUEyQkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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QUFDO1FBQ3hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQTRCLENBQUMsQ0FBQztJQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hFLElBQ0UsQ0FBQyxTQUFTLENBQ1AsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbEMsQ0FBNkIsQ0FBQyxHQUFHLENBQUMsRUFDbkMsVUFBVSxDQUNYLEVBQ0QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlcGVuZGVuY3ktZnJlZSBvYmplY3QgKyBpdGVyYWJsZSB1dGlsaXRpZXMuXG4gKlxuICogVmFsdWUgZ3VhcmRzIC8gY29lcmNpb25zIC8gc2hhcGUgdHlwZXM6IHtAbGluayBpc1JlY29yZH0gbmFycm93cyBwYXJzZWQgSlNPTlxuICogdG8gYSByZWNvcmQsIHtAbGluayB0b051bWJlcn0gY29lcmNlcyBhIGhhbmQtdHlwZWQgbnVtZXJhbCwge0BsaW5rIHRvQm9vbGVhbn1cbiAqIGNvZXJjZXMgbG9vc2UgdHJ1dGh5L2ZhbHN5IHZhbHVlcywge0BsaW5rIHRvRHVyYXRpb259IHBhcnNlcyBgMWgzMG1gIC9cbiAqIGAyIG1pbGxpc2Vjb25kc2AgdG8gbWlsbGlzLCB7QGxpbmsgdG9EYXRlfSBjb2VyY2VzIGEgZGF0ZS9JU08gc3RyaW5nL2Vwb2NoXG4gKiBudW1iZXIvcmVsYXRpdmUgZHVyYXRpb24gKGB0b0RhdGVgIGFuZCBgdG9EdXJhdGlvbmAgZmFsbCBiYWNrIHRvIGVhY2ggb3RoZXIsIHNvXG4gKiBlaXRoZXIgYWNjZXB0cyBib3RoIHJlYWRpbmdzKSwge0BsaW5rIG9wdGlvbmFsfVxuICogc3ByZWFkcyBhIGZpZWxkIG9ubHkgd2hlbiBpdCBpcyBwcmVzZW50LCB7QGxpbmsgZGVlcEVxdWFsfSBjb21wYXJlc1xuICogc3RydWN0dXJhbGx5LCB7QGxpbmsgaXNTZXJpYWxpemFibGVWYWx1ZX0gcmVqZWN0cyBhbnl0aGluZyBhIEpTT04gcm91bmQgdHJpcFxuICogd291bGQgbG9zZSBvciBjb2VyY2UsIHtAbGluayB0b1N0YWJsZUtleX0gY2Fub25pY2FsaXplcyBhIHZhbHVlIHNvIGFuIGlkZW50aXR5XG4gKiBjYW4gYmUgZGVyaXZlZCBmcm9tIGl0LCBhbmQge0BsaW5rIE5hbWVMaWtlfS97QGxpbmsgTm9uRnVuY3Rpb25LZXlzfSBkZXNjcmliZVxuICogb2JqZWN0IHNoYXBlcy5cbiAqXG4gKiBJdGVyYWJsZSBoZWxwZXJzOiB7QGxpbmsgZ2VuZXJhdG9yfSBmbGF0dGVucyBtaXhlZCBhcmd1bWVudHM7IHtAbGluayBzZXF1ZW5jZX1cbiAqIHdyYXBzIHNvdXJjZShzKSBpbiBhIGxhenksIGBBcnJheWAtY29tcGF0aWJsZSB7QGxpbmsgU2VxdWVuY2V9LiBFdmVyeVxuICogdHJhbnNmb3JtL3Rlcm1pbmFsIGlzIGEgc3RhbmRhbG9uZSBmdW5jdGlvbiBvcGVyYXRpbmcgb24gcGxhaW4ge0BsaW5rXG4gKiBDb250YWluZXJ9cyAoc2VlIHtAbGluayBtYXB9LCB7QGxpbmsgZmlsdGVyfSwge0BsaW5rIGdyb3VwfSwgLi4uKTsgdGhlIHtAbGlua1xuICogU2VxdWVuY2V9IG1ldGhvZHMgYXJlIHRoaW4gZm9yd2FyZGVycyBvdmVyIHRoZW0gc28gdGhlIHNhbWUgbG9naWMgYmFja3MgYm90aFxuICogdGhlIGZyZWUtZnVuY3Rpb24gYW5kIHRoZSBmbHVlbnQvY2hhaW5lZCBzdHlsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBMYXp5IHNlcXVlbmNlIG92ZXIgaXRlcmFibGUgc291cmNlKHMpLiBTZWUge0BsaW5rIHNlcXVlbmNlfS4gKi9cbmV4cG9ydCB0eXBlIFNlcXVlbmNlPFQ+ID0gU2VxdWVuY2VJbXBsPFQ+O1xuXG50eXBlIFNlcXVlbmNlU291cmNlPFQ+ID1cbiAgSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPiB8IE9uZU9yTWFueTxUPiB8IEV4dHJhY3Q8VCwgc3RyaW5nPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBub24tc2NhbGFyIHtAbGluayBJdGVyYWJsZX0gLSBvbmUgdG8gdHJlYXQgYXMgYSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzXG4gKiByYXRoZXIgdGhhbiBhIHNjYWxhci4ge0BsaW5rIGlzQ29udGFpbmVyfSBuYXJyb3dzIHRvIHRoaXMsIGV4Y2x1ZGluZyBzdHJpbmdzLFxuICogYFN0cmluZ2AvYFJlZ0V4cGAgb2JqZWN0cywgYW5kIGZ1bmN0aW9ucy4ge0BsaW5rIENvbGxlY3Rpb259IGlzIHRoZSBlYWdlcmx5LVxuICogc2l6ZWQgc3Vic2V0LiBUaGUgZWxlbWVudCBkZWZhdWx0cyB0byBgdW5rbm93bmAgc28gYW55IGBDb2xsZWN0aW9uYCBpc1xuICogYXNzaWduYWJsZSB0byBhIGJhcmUgYENvbnRhaW5lcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRhaW5lcjxUID0gdW5rbm93bj4gPSBJdGVyYWJsZTxUPjtcblxuLyoqXG4gKiBBIGJ1aWx0LWluLCBlYWdlcmx5LXNpemVkIHtAbGluayBDb250YWluZXJ9OiBhbiB7QGxpbmsgQXJyYXl9LCB7QGxpbmsgU2V0fSwgb3JcbiAqIHtAbGluayBNYXB9ICh3aG9zZSAqdmFsdWVzKiBhcmUgYFRgIC0gYSBNYXAgaXRlcmF0ZXMgYFtrZXksIHZhbHVlXWAgZW50cmllcyxcbiAqIHNvIGl0cyBlbGVtZW50IHR5cGUgZGlmZmVycywgYnV0IGl0cyB2YWx1ZSB0eXBlIGlzIGBUYCkuIEFsbCBzaGFyZSBhIGNoZWFwXG4gKiBlbXB0aW5lc3MgY2hlY2sgKHtAbGluayBpc0VtcHR5fSkuXG4gKi9cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb248VD4gPSBSZWFkb25seUFycmF5PFQ+IHwgUmVhZG9ubHlTZXQ8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPjtcblxuZXhwb3J0IHR5cGUgT25lT3JNYW55PFQ+ID0gW1QsIC4uLlRbXV07XG5cbi8qKiBOYXJyb3cgYSByZWFkb25seSBhcnJheSB0byBhIG5vbi1lbXB0eSB7QGxpbmsgT25lT3JNYW55fSB0dXBsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09uZU9yTWFueTxUID0gdW5rbm93bj4odmFsdWU6IHJlYWRvbmx5IFRbXSk6IHZhbHVlIGlzIE9uZU9yTWFueTxUPiB7XG4gIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKiogQSBzb3VyY2UgYWNjZXB0ZWQgYnkgYSB2YXJpYWRpYyBvcDogYSB7QGxpbmsgQ29udGFpbmVyfSBvZiBgVGAsIG9yIG5vdGhpbmcuICovXG50eXBlIFNvdXJjZTxUPiA9IENvbnRhaW5lcjxUPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRWxlbWVudCB0eXBlIG9mIGEge0BsaW5rIGdyb3VwfSBidWNrZXQgYXJyYXk6IHdoZW4gdGhlIHByZWRpY2F0ZSBgUGAgaXMgYSB0eXBlXG4gKiBndWFyZCAoYHZhbHVlIGlzIFNgKSwgdGhlIGJ1Y2tldCBpcyBuYXJyb3dlZCB0byBgUyAmIFRgOyBvdGhlcndpc2UgaXQgc3RheXMgYFRgLlxuICovXG50eXBlIEdyb3VwVmFsdWU8VCwgUD4gPSBQIGV4dGVuZHMgKHZhbHVlOiBhbnksIC4uLnJlc3Q6IGFueVtdKSA9PiB2YWx1ZSBpcyBpbmZlciBTID8gUyAmIFQgOiBUO1xuXG4vKiogQSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUsIGFzIGFjY2VwdGVkIGJ5IHtAbGluayBncm91cH0uICovXG50eXBlIEdyb3VwUHJlZGljYXRlczxUPiA9IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbj47XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29sbGVjdGlvbn06IGFuIHtAbGluayBBcnJheX0sIHtAbGluayBTZXR9LCBvclxuICoge0BsaW5rIE1hcH0uIE5hcnJvd3MgYHZhbHVlYCBzbyBpdHMgZWxlbWVudC92YWx1ZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgKG9yIE1hcCB2YWx1ZSkgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIChuYXJyb3dpbmcgYHZhbHVlYCB0byB7QGxpbmsgQ29sbGVjdGlvbn08YFRgPikgZm9yIGFcbiAqICAgYnVpbHQtaW4gYXJyYXkvc2V0L21hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvbjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb2xsZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG4vKipcbiAqIGB0cnVlYCB3aGVuIGEge0BsaW5rIENvbGxlY3Rpb259IGhhcyBubyBlbGVtZW50cy4gVXNlcyBgbGVuZ3RoYCBmb3IgYXJyYXlzXG4gKiBhbmQgYHNpemVgIGZvciB7QGxpbmsgU2V0fS97QGxpbmsgTWFwfS5cbiAqXG4gKiBAcGFyYW0gY29sbGVjdGlvbiAtIFRoZSBhcnJheSwgc2V0LCBvciBtYXAgdG8gdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb248dW5rbm93bj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9LFxuKTogYm9vbGVhbiB7XG4gIGZ1bmN0aW9uIHZpc2l0KHZhbHVlOiB1bmtub3duLCBzZWVuPzogU2V0PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoc2Vlbj8uaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgICBzZWVuPy5hZGQodmFsdWUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT09IDAgfHwgKHNlZW4gPyB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zaXplID09PSAwIHx8IChzZWVuID8gWy4uLnZhbHVlXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdmFsdWUuc2l6ZSA9PT0gMCB8fFxuICAgICAgICAgIChzZWVuID8gWy4uLnZhbHVlLnZhbHVlcygpXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzZWVuKSB7XG4gICAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+IHZpc2l0KCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgc2VlbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB2aXNpdChjb2xsZWN0aW9uLCBvcHRpb25zPy5yZWN1cnNpdmUgPyBuZXcgU2V0KCkgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzb3VyY2UgdG8gYW4gaXRlcmFibGUgb2YgaXRzIGBUYCB2YWx1ZXMsIHNvIE1hcHMgYXJlIHRyZWF0ZWRcbiAqIHVuaWZvcm1seSB3aXRoIGFycmF5cy9zZXRzOiBhIHtAbGluayBNYXB9IHlpZWxkcyBpdHMgKnZhbHVlcyogKG1hdGNoaW5nXG4gKiB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGApLCBhbnkgb3RoZXIgaXRlcmFibGUgeWllbGRzIGl0c2VsZi4gVGhpc1xuICogaXMgd2hhdCB7QGxpbmsgc2VxdWVuY2V9IGNvbnN1bWVzLCBzbyBhIGBNYXBgIGNvbnRyaWJ1dGVzIHZhbHVlcyBldmVyeXdoZXJlXG4gKiByYXRoZXIgdGhhbiBgW2tleSwgdmFsdWVdYCBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzPFQ+KHNvdXJjZTogSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPik6IEl0ZXJhYmxlPFQ+IHtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE1hcCA/IHNvdXJjZS52YWx1ZXMoKSA6IChzb3VyY2UgYXMgSXRlcmFibGU8VD4pO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGEge0BsaW5rIENvbnRhaW5lcn0gLSBhbiBpdGVyYWJsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29sbGVjdGlvblxuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIHZhbHVlcyB0aGF0IGFyZSB0ZWNobmljYWxseSBpdGVyYWJsZSBidXQgc2hvdWxkIGJlXG4gKiB0cmVhdGVkIGFzIHNjYWxhcnMgaGVyZSAtIHN0cmluZ3MsIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMgLVxuICogc28gYSBsb25lIHN0cmluZyBpcyBuZXZlciBzcHJlYWQgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgYXNzZXJ0ZWQgZm9yIHRoZSBpdGVyYWJsZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb250YWluZXJ9PGBUYD4pIGZvciBhIG5vbi1zdHJpbmdcbiAqICAgaXRlcmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRhaW5lcjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250YWluZXI8VD4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAhKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgW1N5bWJvbC5pdGVyYXRvcl0/OiB1bmtub3duIH0pW1N5bWJvbC5pdGVyYXRvcl0gPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW5jZVNvdXJjZXM8VD4oLi4uc291cmNlczogU2VxdWVuY2VTb3VyY2U8VD5bXSk6IEl0ZXJhYmxlPFQ+W10ge1xuICBjb25zdCBzb3VyY2VJdGVyYWJsZXM6IEl0ZXJhYmxlPFQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCAoaXNDb2xsZWN0aW9uKHNvdXJjZSkgJiYgaXNFbXB0eShzb3VyY2UpKSkgY29udGludWU7XG4gICAgc291cmNlSXRlcmFibGVzLnB1c2goaXNDb250YWluZXI8VD4oc291cmNlKSA/IHZhbHVlcyhzb3VyY2UpIDogW3NvdXJjZSBhcyBUXSk7XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUl0ZXJhYmxlcztcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBuZXN0ZWQgYXJyYXlzIGZvciB7QGxpbmsgZmxhdH0uIE5vbi1hcnJheSB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgYVxuICogc2luZ2xlLWVsZW1lbnQgaXRlcmFibGU7IGRlcHRoIGRlY3JlbWVudHMgcGVyIGFycmF5IGxldmVsLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuVmFsdWUodmFsdWU6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiBJdGVyYWJsZTx1bmtub3duPiB7XG4gIGlmIChkZXB0aCA+IDAgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBuZXh0RGVwdGggPSBOdW1iZXIuaXNGaW5pdGUoZGVwdGgpID8gZGVwdGggLSAxIDogZGVwdGg7XG4gICAgcmV0dXJuIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB5aWVsZCogZmxhdHRlblZhbHVlKGl0ZW0sIG5leHREZXB0aCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZV07XG59XG5cbi8qKiBXcmFwIGEgcGVyLWVsZW1lbnQgdHJhbnNmb3JtIChlYWNoIGVsZW1lbnQgLT4gYW4gaXRlcmFibGUpIGFzIGEgbGF6eSB7QGxpbmsgU2VxdWVuY2V9LiAqL1xuZnVuY3Rpb24gZGVyaXZlPFQsIFU+KFxuICBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICBmbjogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBJdGVyYWJsZTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkKiBmbih2YWx1ZSwgaW5kZXgrKyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKiBMaWtlIHtAbGluayBkZXJpdmV9LCBidXQgeWllbGRzIG9uZSB2YWx1ZSBwZXIgc291cmNlIGVsZW1lbnQgKG5vIHdyYXBwZXIgaXRlcmFibGUpLiAqL1xuZnVuY3Rpb24gZGVyaXZlT25lPFQsIFU+KHNvdXJjZTogSXRlcmFibGU8VD4sIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB5aWVsZCBmbih2YWx1ZSwgaW5kZXgrKyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5tYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHBlciBlbGVtZW50IHdpdGggaXRzIGluZGV4OyBpdHMgcmVzdWx0IGlzIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVLFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gZGVyaXZlT25lKHNlcXVlbmNlKHNvdXJjZSksIGNhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBBIHR5cGUtZ3VhcmQgcHJlZGljYXRlIG5hcnJvd3MgdGhlIHJlc3VsdGluZyBlbGVtZW50IHR5cGUuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gZmlsdGVyIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gS2VlcHMgZWxlbWVudHMgZm9yIHdoaWNoIGl0IHJldHVybnMgYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogU2VxdWVuY2U8Uz47XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBTZXF1ZW5jZTxUPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgeWllbGQgdmFsdWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyB0aGUgc291cmNlcyBhbmQgeWllbGRzIG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgbm90IGBudWxsYCBvclxuICogYHVuZGVmaW5lZGAsIG5hcnJvd2luZyB0aGUgZWxlbWVudCB0eXBlIHRvIHtAbGluayBOb25OdWxsYWJsZX08YFRgPi5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub25OdWxsPFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgcmV0dXJuIGZpbHRlcihzZXF1ZW5jZSguLi5zb3VyY2VzKSwgKHZhbHVlKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4gPT4gdmFsdWUgIT0gbnVsbCk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mbGF0TWFwYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBtYXAgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFJldHVybnMgYSB2YWx1ZSBvciBhcnJheSBvZiB2YWx1ZXMsIGZsYXR0ZW5lZCBvbmUgbGV2ZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0TWFwPFQsIFU+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSB8IFJlYWRvbmx5QXJyYXk8VT4sXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmUoc2VxdWVuY2Uoc291cmNlKSwgZnVuY3Rpb24qICh2YWx1ZSwgaW5kZXgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHlpZWxkKiByZXN1bHQ7XG4gICAgZWxzZSB5aWVsZCByZXN1bHQgYXMgVTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mbGF0YCAoYXJyYXlzIG9ubHkpLiBgZGVwdGhgIGxlYWRzIHNvIHRoZVxuICogc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYzsgdXNlIGBkZXB0aCA8IDFgIGZvciBhIG5vLW9wIHBhc3N0aHJvdWdoLlxuICpcbiAqIEBwYXJhbSBkZXB0aCAtIEhvdyBtYW55IGFycmF5IGxldmVscyB0byBmbGF0dGVuLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlLCB0aGVuIGZsYXR0ZW4gKG51bGxpc2ggc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0PFQ+KGRlcHRoOiBudW1iZXIsIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGRlcHRoIDwgMSkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIGRlcml2ZShzcmMsICh2YWx1ZSkgPT4gZmxhdHRlblZhbHVlKHZhbHVlLCBkZXB0aCkpIGFzIFNlcXVlbmNlPFQ+O1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyB0aGUgc291cmNlcywgdGhlbiBsYXppbHkgeWllbGRzIHZhbHVlcyBpbiBlbmNvdW50ZXIgb3JkZXIsXG4gKiBza2lwcGluZyBhIHZhbHVlIG9ubHkgd2hlbiBhbiBlcXVhbCBvbmUgd2FzIGFscmVhZHkgeWllbGRlZCAoYFNldGAgL1xuICogU2FtZVZhbHVlWmVybykuIFVuaXF1ZW5lc3MgaXMgY2hlY2tlZCBwZXIgZWxlbWVudCBhcyBpdCBpcyBjb25zdW1lZC5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdDxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8VD4oKTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFlpZWxkcyBgc291cmNlYCwgdGhlbiBlYWNoIGFwcGVuZGVkIGBpdGVtYCBpbiBvcmRlciAoYXJyYXlzIHNwcmVhZCBvbmUgbGV2ZWwpLFxuICogbWlycm9yaW5nIGBBcnJheS5wcm90b3R5cGUuY29uY2F0YC4gYGl0ZW1zYCBhcmUgc2NhbGFyIHZhbHVlcy9hcnJheXMsIG5vdFxuICogY29udGFpbmVycywgc28gYHNvdXJjZWAgc3RheXMgYSBzaW5nbGUgbGVhZGluZyBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGxlYWRpbmcgY29udGFpbmVyIChudWxsaXNoIHlpZWxkcyBqdXN0IHRoZSBpdGVtcykuXG4gKiBAcGFyYW0gaXRlbXMgLSBWYWx1ZXMgKG9yIGFycmF5cyBvZiB2YWx1ZXMpIGFwcGVuZGVkIGFmdGVyIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBSZWFkb25seUFycmF5PFQ+KVtdXG4pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKHNvdXJjZSk7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBzcmM7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgeWllbGQqIHNyYztcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkgeWllbGQqIGl0ZW07XG4gICAgICAgIGVsc2UgeWllbGQgaXRlbSBhcyBUO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFlpZWxkcyBhdCBtb3N0IGBjb3VudGAgZWxlbWVudHMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogYGNvdW50YCBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAcGFyYW0gY291bnQgLSBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byB5aWVsZCAoYDw9IDBgIHlpZWxkcyBub25lKS5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRha2U8VD4oY291bnQ6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGlmIChjb3VudCA8PSAwKSByZXR1cm4gZW1wdHlTZXF1ZW5jZSBhcyBTZXF1ZW5jZTxUPjtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IHRha2VuID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgICBpZiAoKyt0YWtlbiA+PSBjb3VudCkgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0cyB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMgaW50byBvbmUgYXJyYXkgcGVyIG5hbWVkIHByZWRpY2F0ZS4gQ29uc3VtZXNcbiAqIHRoZSBpbnB1dCBvbmNlLCByb3V0aW5nIGVhY2ggZWxlbWVudCB0byB0aGUgRklSU1QgcHJlZGljYXRlIGl0IHNhdGlzZmllcyAoc29cbiAqIGdyb3VwcyBhcmUgZGlzam9pbnQpOyBlbGVtZW50cyBtYXRjaGluZyBubyBwcmVkaWNhdGUgYXJlIGRyb3BwZWQuIFR5cGUtZ3VhcmRcbiAqIHByZWRpY2F0ZXMgbmFycm93IHRoZWlyIGdyb3VwJ3MgZWxlbWVudCB0eXBlIChzZWUge0BsaW5rIEdyb3VwVmFsdWV9KS5cbiAqIGBwcmVkaWNhdGVzYCBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAdHlwZVBhcmFtIEcgLSBUaGUgbWFwIG9mIGdyb3VwIG5hbWUgLT4gcHJlZGljYXRlLlxuICogQHBhcmFtIHByZWRpY2F0ZXMgLSBOYW1lZCBwcmVkaWNhdGVzOyBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzLCBlYWNoIGFuIGFycmF5IG9mIGl0cyBncm91cCdzIGVsZW1lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGNvbnN0IHsgc3RyaW5ncywgZm5zIH0gPSBncm91cCh7IHN0cmluZ3M6IGlzU3RyaW5nLCBmbnM6IGlzRnVuY3Rpb24gfSwgeHMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXA8VCwgRyBleHRlbmRzIEdyb3VwUHJlZGljYXRlczxUPj4oXG4gIHByZWRpY2F0ZXM6IEcsXG4gIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdXG4pOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcmVkaWNhdGVzKSBhcyAoa2V5b2YgRylbXTtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8a2V5b2YgRywgVFtdPihrZXlzLm1hcCgoa2V5KSA9PiBba2V5LCBbXV0pKTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZSguLi5zb3VyY2VzKSkge1xuICAgIGNvbnN0IGkgPSBpbmRleCsrO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChwcmVkaWNhdGVzW2tleV0hKHZhbHVlLCBpKSkge1xuICAgICAgICBidWNrZXRzLmdldChrZXkpIS5wdXNoKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgcmVzdWx0W2tleV0gPSBidWNrZXRzLmdldChrZXkpISBhcyBHcm91cFZhbHVlPFQsIEdbdHlwZW9mIGtleV0+W107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgZWxlbWVudHMgdW50aWwgYSBtYXRjaC4gQSB0eXBlIGd1YXJkIG5hcnJvd3MgdGhlIHJldHVybiB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZDxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFMgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgdGhlIGZ1bGwgc291cmNlLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFMgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2g6IFQgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSBtYXRjaCA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBtYXRjaDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCkpIHJldHVybiBpbmRleDtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgLCBvdmVyIGEgc2luZ2xlXG4gKiB7QGxpbmsgQ29udGFpbmVyfS4gQ29uc3VtZXMgdGhlIGZ1bGwgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RJbmRleDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1hdGNoID0gLTE7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgbWF0Y2ggPSBpbmRleDtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBtYXRjaDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLnNvbWVgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogU2hvcnQtY2lyY3VpdHMgb24gdGhlIGZpcnN0IG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29tZTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5ldmVyeWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgaWYgKCFwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaDxUPihzb3VyY2U6IFNvdXJjZTxUPiwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIGNhbGxiYWNrKHZhbHVlLCBpbmRleCsrKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmF0YCBvdmVyIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcy5cbiAqIE5vbi1uZWdhdGl2ZSBpbmRpY2VzIHNjYW4gbGF6aWx5OyBuZWdhdGl2ZSBpbmRpY2VzIG1hdGVyaWFsaXplIGZpcnN0LiBgaW5kZXhgXG4gKiBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAcGFyYW0gaW5kZXggLSBaZXJvLWJhc2VkIHBvc2l0aW9uOyBuZWdhdGl2ZSBjb3VudHMgZnJvbSB0aGUgZW5kLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXQ8VD4oaW5kZXg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIGlmIChpbmRleCA8IDApIHJldHVybiB0b0FycmF5KHNyYykuYXQoaW5kZXgpO1xuICBsZXQgaSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgaWYgKGkrKyA9PT0gaW5kZXgpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PbmVPck1hbnk8VD4oaW5wdXQ6IFQgfCBPbmVPck1hbnk8VD4pOiBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF07XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemVzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBzaW5nbGUtcGFzc1xuICogc291cmNlcy5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogcmVhZG9ubHkgVFtdIHtcbiAgcmV0dXJuIFsuLi5zZXF1ZW5jZSguLi5zb3VyY2VzKV07XG59XG5cbi8qKlxuICogTGF6eSBpdGVyYWJsZSBzZXF1ZW5jZSB3aXRoIGBBcnJheWAtY29tcGF0aWJsZSB0cmFuc2Zvcm1zIGFuZCB0ZXJtaW5hbFxuICogbWV0aG9kcy4gU2luZ2xlLXBhc3MgYnkgZGVmYXVsdDsgY2FsbCB7QGxpbmsgU2VxdWVuY2VJbXBsLmNhY2hlfSB0byByZXRhaW5cbiAqIHB1bGxlZCB2YWx1ZXMgZm9yIHJlLWl0ZXJhdGlvbi4gQnVpbHQgZm9yIGdlbmVyYXRvcnMgYW5kIG90aGVyIHNvdXJjZXMgd2hlcmVcbiAqIGEgc2Vjb25kIHBhc3MgaXMgbm90IGd1YXJhbnRlZWQuXG4gKlxuICogVGhlIG1ldGhvZHMgZm9yd2FyZCB0byB0aGUgc3RhbmRhbG9uZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSAtIHNlZSBlYWNoXG4gKiBtZXRob2QncyBgQHNlZWAgLSBzbyB0aGUgZnJlZS1mdW5jdGlvbiBhbmQgY2hhaW5lZCBzdHlsZXMgc2hhcmUgb25lIGltcGwuXG4gKi9cbmNsYXNzIFNlcXVlbmNlSW1wbDxUPiB7XG4gIHByaXZhdGUgaXRlcmF0b3I/OiBJdGVyYXRvcjxUPjtcbiAgcHJpdmF0ZSBleGhhdXN0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBUW10gfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IHsgcmVhZG9ubHkgZXhoYXVzdGVkPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIHRoaXMuZXhoYXVzdGVkID0gc3RhdGUuZXhoYXVzdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvbmNlLCBjcmVhdGluZyB0aGUgaXRlcmF0b3Igb24gZmlyc3QgdXNlLiAqL1xuICBwcml2YXRlIHB1bGwoKTogSXRlcmF0b3JSZXN1bHQ8VD4ge1xuICAgIHRoaXMuaXRlcmF0b3IgPz89IHRoaXMuc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGlmICghdGhpcy5jYWNoaW5nKSB7XG4gICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgIGZvciAobGV0IG5leHQgPSB0aGlzLnB1bGwoKTsgIW5leHQuZG9uZTsgbmV4dCA9IHRoaXMucHVsbCgpKSB7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhY2hlZDogaXRlcmF0ZSBsaWtlIGEgbGlzdC4gQWx3YXlzIHJlcGxheSB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YXJ0LFxuICAgICAgLy8gZXh0ZW5kaW5nIGl0IGZyb20gdGhlIHNvdXJjZSBvbiBkZW1hbmQgdW50aWwgZXhoYXVzdGVkLiBBIGJyb2tlbiBsb29wXG4gICAgICAvLyBsZWF2ZXMgdGhlIGJ1ZmZlciBpbnRhY3QsIHNvIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMgb3ZlciBmcm9tIHRoZVxuICAgICAgLy8gYmVnaW5uaW5nLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIhO1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGluZGV4IDwgYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcltpbmRleCsrXSE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnB1bGwoKTtcbiAgICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gobmV4dC52YWx1ZSk7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG1hcH0gKi9cbiAgbWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIG1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmlsdGVyfSAqL1xuICBmaWx0ZXI8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogU2VxdWVuY2U8Uz47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZpbHRlcih0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG5vbk51bGx9ICovXG4gIG5vbk51bGwoKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgICByZXR1cm4gbm9uTnVsbCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0TWFwfSAqL1xuICBmbGF0TWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+KTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBmbGF0TWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0fSAqL1xuICBmbGF0KGRlcHRoID0gMSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmxhdChkZXB0aCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZGlzdGluY3R9ICovXG4gIGRpc3RpbmN0KCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZGlzdGluY3QodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgY29uY2F0fSAqL1xuICBjb25jYXQoLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gY29uY2F0KHRoaXMsIC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgeWllbGRzIHRoaXMgc2VxdWVuY2UgZm9sbG93ZWQgYnkgZWFjaCBpdGVyYWJsZSBgc291cmNlYCBpbiBvcmRlci5cbiAgICogTGlrZSB7QGxpbmsgY29uY2F0fSwgYnV0IGZvciBpdGVyYWJsZSBzb3VyY2VzIChnZW5lcmF0b3JzLCBvdGhlciBzZXF1ZW5jZXMsXG4gICAqIGBTZXRgLCBgTWFwYCwgZXRjLikgcmF0aGVyIHRoYW4gc2NhbGFyIHZhbHVlcyBvciBhcnJheXMuIEEge0BsaW5rIE1hcH1cbiAgICogc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHNlcXVlbmNlfVxuICAgKi9cbiAgam9pbiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAgIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyh0aGlzLCAuLi5zb3VyY2VzKTtcbiAgICByZXR1cm4gc2VxdWVuY2VTb3VyY2VzLmxlbmd0aCA9PT0gMCA/IHRoaXMgOiBzZXF1ZW5jZSguLi5zb3VyY2VJdGVyYWJsZXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHRha2V9ICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGFrZShjb3VudCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZ3JvdXB9ICovXG4gIGdyb3VwPEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KHByZWRpY2F0ZXM6IEcpOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gICAgcmV0dXJuIGdyb3VwKHByZWRpY2F0ZXMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYWNoZWQsIHJlLWl0ZXJhYmxlIHZpZXcgb2YgdGhpcyBzZXF1ZW5jZS4gQW4gYWxyZWFkeS1jYWNoaW5nXG4gICAqIHNlcXVlbmNlIHJldHVybnMgaXRzZWxmOyBvdGhlcndpc2UgdGhpcyBvbmUtcGFzcyBzZXF1ZW5jZSBpcyB3cmFwcGVkIGluIGFcbiAgICogbmV3IGluc3RhbmNlIHRoYXQgcmV0YWlucyBwdWxsZWQgdmFsdWVzLiBJdGVyYXRlIHRoZSByZXR1cm5lZCBpbnN0YW5jZSwgbm90XG4gICAqIHRoZSBvcmlnaW5hbCwgdG8gYXZvaWQgY29tcGV0aW5nIGZvciB0aGUgc2FtZSBzaW5nbGUtcGFzcyBzb3VyY2UuXG4gICAqL1xuICBjYWNoZSgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGluZyA/IHRoaXMgOiBuZXcgU2VxdWVuY2VJbXBsKHRoaXMsIFtdKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kfSAqL1xuICBmaW5kPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmQodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdH0gKi9cbiAgZmluZExhc3Q8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRJbmRleH0gKi9cbiAgZmluZEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3RJbmRleH0gKi9cbiAgZmluZExhc3RJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRMYXN0SW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBzb21lfSAqL1xuICBzb21lKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvbWUodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBldmVyeX0gKHRoZSBgUyBleHRlbmRzIFRgIG92ZXJsb2FkIG5hcnJvd3MgYXQgY29tcGlsZSB0aW1lIG9ubHkpLiAqL1xuICBldmVyeTxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiB0aGlzIGlzIFNlcXVlbmNlPFM+O1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZXJ5KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZm9yRWFjaH0gKi9cbiAgZm9yRWFjaChjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZm9yRWFjaCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgYXR9ICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYXQoaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBzZXF1ZW5jZSBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBhIHNpbmdsZS1wYXNzIHNvdXJjZTsgYVxuICAgKiBjYWNoZWQsIGV4aGF1c3RlZCBzZXF1ZW5jZSBjb3BpZXMgaXRzIGJ1ZmZlciBkaXJlY3RseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgdG9BcnJheX1cbiAgICovXG4gIHRvQXJyYXkoKTogcmVhZG9ubHkgVFtdIHtcbiAgICBpZiAodGhpcy5jYWNoaW5nICYmIHRoaXMuZXhoYXVzdGVkKSByZXR1cm4gWy4uLnRoaXMuYnVmZmVyIV07XG4gICAgcmV0dXJuIHRvQXJyYXkodGhpcyk7XG4gIH1cbn1cblxuLyoqIFNoYXJlZCBlbXB0eSBzZXF1ZW5jZSBzaW5nbGV0b24sIHJldXNhYmxlIGZvciBhbnkgZWxlbWVudCB0eXBlLiAqL1xuY29uc3QgZW1wdHlTZXF1ZW5jZTogU2VxdWVuY2U8bmV2ZXI+ID0gbmV3IFNlcXVlbmNlSW1wbChbXSwgdW5kZWZpbmVkLCB7XG4gIGV4aGF1c3RlZDogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIFdyYXAgb25lIG9yIG1vcmUgaXRlcmFibGUgYHNvdXJjZXNgIGluIGEgc2luZ2xlIGxhenkge0BsaW5rIFNlcXVlbmNlfSxcbiAqIGl0ZXJhdGVkIGluIG9yZGVyLiBgbnVsbGAvYHVuZGVmaW5lZGAgc291cmNlcyBhcmUgc2tpcHBlZDsgd2hlbiBub3RoaW5nXG4gKiByZW1haW5zIChldmVyeSBzb3VyY2Ugb21pdHRlZCwgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgYW4gZW1wdHkgYXJyYXkgL1xuICogYFNldGAgLyBgTWFwYCksIHtAbGluayBlbXB0eVNlcXVlbmNlfSBpcyByZXR1cm5lZC4gVGhlIHJlc3VsdCBpcyBzaW5nbGUtcGFzc1xuICogLSBjYWxsIGAuY2FjaGUoKWAgdG8gbWFrZSBpdCByZS1pdGVyYWJsZS5cbiAqXG4gKiBBIHtAbGluayBNYXB9IHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzIChzZWUge0BsaW5rIHZhbHVlc30pLCBjb25zaXN0ZW50XG4gKiB3aXRoIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHNvdXJjZXMgLSBJdGVyYWJsZXMgdG8gY29uY2F0ZW5hdGUsIGluIG9yZGVyIChgTWFwYCBzb3VyY2VzIHVzZSB2YWx1ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2U8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgLy8gU2tpcCBudWxsaXNoIHNvdXJjZXMgYW5kIGtub3duLWVtcHR5IGNvbGxlY3Rpb25zOyBub3JtYWxpemUgdGhlIHJlc3QgdG9cbiAgLy8gdGhlaXIgdmFsdWVzIHNvIGEgTWFwIGNvbnRyaWJ1dGVzIHZhbHVlcyByYXRoZXIgdGhhbiBba2V5LCB2YWx1ZV0gZW50cmllcy5cbiAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKC4uLnNvdXJjZXMpO1xuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIC8vIFJldXNlIGFuIGV4aXN0aW5nIHNlcXVlbmNlIGFzLWlzIHJhdGhlciB0aGFuIHJlLXdyYXBwaW5nIGl0LlxuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG9ubHkgPSBzb3VyY2VJdGVyYWJsZXNbMF0hO1xuICAgIHJldHVybiBvbmx5IGluc3RhbmNlb2YgU2VxdWVuY2VJbXBsID8gKG9ubHkgYXMgU2VxdWVuY2U8VD4pIDogbmV3IFNlcXVlbmNlSW1wbChvbmx5LCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiBuZXcgU2VxdWVuY2VJbXBsKFxuICAgIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlSXRlcmFibGVzKSB5aWVsZCogc291cmNlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBhIG1peCBvZiBzaW5nbGUgaXRlbXMgYW5kIGl0ZXJhYmxlcyBpbnRvIG9uZSBsYXp5IHtAbGluayBHZW5lcmF0b3J9LlxuICpcbiAqIEFyZ3VtZW50cyBhcmUgZW1pdHRlZCBpbiBvcmRlcjogYG51bGxgL2B1bmRlZmluZWRgIGFyZSBza2lwcGVkLCBub24tc3RyaW5nXG4gKiBpdGVyYWJsZXMgKHBlciB7QGxpbmsgaXNDb250YWluZXJ9KSBhcmUgeWllbGRlZCBlbGVtZW50LWJ5LWVsZW1lbnQsIGFuZFxuICogYW55dGhpbmcgZWxzZSAoaW5jbHVkaW5nIHN0cmluZ3MpIGlzIHlpZWxkZWQgYXMgYSBzaW5nbGUgaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci5cbiAqIEBwYXJhbSBpdGVtcyAtIEl0ZW1zIGFuZC9vciBpdGVyYWJsZXMgdG8gZmxhdHRlbiwgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvdmVyIHRoZSBmbGF0dGVuZWQgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2VuZXJhdG9yPFQ+KFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBJdGVyYWJsZTxUPiB8IG51bGwgfCB1bmRlZmluZWQpW11cbik6IEdlbmVyYXRvcjxUPiB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChpc0NvbnRhaW5lcihpdGVtKSkge1xuICAgICAgeWllbGQqIGl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JqZWN0IHZhbHVlIGd1YXJkcywgY29lcmNpb25zLCBhbmQgc3RydWN0dXJhbCBlcXVhbGl0eVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNaW5pbWFsIHNoYXBlIGZvciBvYmplY3RzIHRoYXQgZXhwb3NlIGFuIG9wdGlvbmFsIGBuYW1lYCAoZS5nLiBBcHBLaXQgcGx1Z2lucykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVMaWtlIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTm9uRnVuY3Rpb25LZXlzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBOYXJyb3cgYHZhbHVlYCB0byBhIHBsYWluIChub24tYXJyYXkpIG9iamVjdC4gVXNlIGFzIGEgdHlwZSBndWFyZFxuICogYmVmb3JlIGluZGV4aW5nIGludG8gLyBtdXRhdGluZyBwYXJzZWQgSlNPTiBzbyB0aGUgYWNjZXNzIGlzXG4gKiB0eXBlLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc1JlY29yZChwYXJzZWQpKSBwYXJzZWQuZm9vID0gMTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqIEEgSlNPTiBzY2FsYXIuIGB1bmRlZmluZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgLSBgSlNPTi5zdHJpbmdpZnlgIGRyb3BzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbi8qKlxuICogQW55IHZhbHVlIHRoYXQgc3Vydml2ZXMgYSBgSlNPTi5zdHJpbmdpZnlgL2BKU09OLnBhcnNlYCByb3VuZCB0cmlwIHVuY2hhbmdlZC5cbiAqXG4gKiBVc2UgaXQgaW5zdGVhZCBvZiBgdW5rbm93bmAgb24gYSBib3VuZGFyeSB0aGF0IHdpbGwgc2VyaWFsaXplIGl0cyBpbnB1dCAtIGFcbiAqIG1lc3NhZ2UgcGF5bG9hZCwgYSBjYWNoZSBlbnRyeSwgYSBjb25maWcgYmxvYiB3cml0dGVuIHRvIGRpc2sgLSBzbyBhIGBEYXRlYCxcbiAqIGEgYE1hcGAsIG9yIGEgY2xhc3MgaW5zdGFuY2UgaXMgYSBjb21waWxlIGVycm9yIGF0IHRoZSBjYWxsIHNpdGUgcmF0aGVyIHRoYW4gYVxuICogcmVjZWl2ZXIgcXVpZXRseSBnZXR0aW5nIGEgc3RyaW5nIG9yIGB7fWAuIHtAbGluayBpc1NlcmlhbGl6YWJsZVZhbHVlfSBpcyB0aGVcbiAqIHJ1bnRpbWUgaGFsZiwgZm9yIGlucHV0IHRoZSBjb21waWxlciBjYW5ub3Qgdm91Y2ggZm9yLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9XG4gIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSB8IFNlcmlhbGl6YWJsZVZhbHVlW10gfCB7IFtrZXk6IHN0cmluZ106IFNlcmlhbGl6YWJsZVZhbHVlIH07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGB2YWx1ZWAgc3Vydml2ZXMgYSBKU09OIHJvdW5kIHRyaXAgd2l0aCBubyBsb3NzIGFuZCBubyBjb2VyY2lvbi5cbiAqXG4gKiBTdHJpY3RlciB0aGFuIFwiYEpTT04uc3RyaW5naWZ5YCBkaWQgbm90IHRocm93XCIsIGJlY2F1c2UgdGhhdCBzdWNjZWVkcyB3aGlsZVxuICogc2lsZW50bHkgQ0hBTkdJTkcgdGhlIHZhbHVlOiBhIGBEYXRlYCBiZWNvbWVzIGEgc3RyaW5nLCBgTmFOYCBhbmQgYEluZmluaXR5YFxuICogYmVjb21lIGBudWxsYCwgYSBgTWFwYCBiZWNvbWVzIGB7fWAsIGFuZCBgdW5kZWZpbmVkYCBkaXNhcHBlYXJzIGZyb20gYW4gb2JqZWN0XG4gKiBvciB0dXJucyBpbnRvIGBudWxsYCBpbnNpZGUgYW4gYXJyYXkuIEVhY2ggb2YgdGhvc2UgcmVhY2hlcyB0aGUgZmFyIHNpZGUgYXNcbiAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgd2FzIHNlbnQsIHNvIGFsbCBvZiB0aGVtIGFyZSByZWplY3RlZCBoZXJlLlxuICpcbiAqIFJlamVjdGVkOiBub24tZmluaXRlIG51bWJlcnMsIGB1bmRlZmluZWRgLCBmdW5jdGlvbnMsIHN5bWJvbHMsIGJpZ2ludHMsIGNsYXNzXG4gKiBpbnN0YW5jZXMgYW5kIGFueXRoaW5nIGVsc2Ugd2l0aCBhIHByb3RvdHlwZSBvdGhlciB0aGFuIGBPYmplY3QucHJvdG90eXBlYCBvclxuICogYG51bGxgIChgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgYFJlZ0V4cGAsIGBCdWZmZXJgKSwgYW5kIGFueSBvYmplY3QgZ3JhcGhcbiAqIGNvbnRhaW5pbmcgYSBjeWNsZS4gQWNjZXB0ZWQ6IHN0cmluZ3MsIGJvb2xlYW5zLCBgbnVsbGAsIGZpbml0ZSBudW1iZXJzLCBwbGFpblxuICogb2JqZWN0cywgYXJyYXlzLCBhbmQgbmVzdGluZ3Mgb2YgdGhvc2UuXG4gKlxuICogTmFycm93cyB0byB7QGxpbmsgU2VyaWFsaXphYmxlVmFsdWV9IHJhdGhlciB0aGFuIGFzc2VydGluZywgc28gaXQgYWxzbyBzZXJ2ZXNcbiAqIGFzIHRoZSB2YWxpZGF0b3IgZm9yIHVudHJ1c3RlZCBpbnB1dCAtIGEgcmVxdWVzdCBib2R5LCBhIGRlY29kZWQgbm90aWZpY2F0aW9uXG4gKiBwYXlsb2FkIC0gd2hlcmUgdGhlIGFuc3dlciBzaG91bGQgYmUgYSA0MDAgYW5kIG5vdCBhIHRocm93LiBOZXZlciB0aHJvd3MuXG4gKlxuICogRGlzdGluY3QgZnJvbSB7QGxpbmsgZGVlcEVxdWFsfSdzIG5vdGlvbiBvZiBjb21wYXJhYmxlOiB0aGF0IG9uZSBIQU5ETEVTXG4gKiBgRGF0ZWAvYE1hcGAvYFNldGAgc3RydWN0dXJhbGx5LCB3aGlsZSB0aGlzIG9uZSByZWplY3RzIHRoZW0gcHJlY2lzZWx5IGJlY2F1c2VcbiAqIEpTT04gY2Fubm90IGNhcnJ5IHRoZW0uXG4gKlxuICogQHBhcmFtIGFuY2VzdG9ycyBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKHsgYTogWzEsIFwieFwiLCBudWxsXSB9KTsgLy8gdHJ1ZVxuICogaXNTZXJpYWxpemFibGVWYWx1ZSh7IGF0OiBuZXcgRGF0ZSgpIH0pOyAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBhIHN0cmluZ1xuICogaXNTZXJpYWxpemFibGVWYWx1ZShOdW1iZXIuTmFOKTsgICAgICAgICAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcmlhbGl6YWJsZVZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHZhbHVlIGlzIFNlcmlhbGl6YWJsZVZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICA/IHZhbHVlLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSlcbiAgICA6IE9iamVjdC52YWx1ZXModmFsdWUpLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIHN0cmluZyBmb3IgYSBzdHJ1Y3R1cmVkIHZhbHVlLCBmb3IgZGVyaXZpbmcgYSBTVEFCTEUgSURFTlRJVFkgZnJvbVxuICogaXQgLSBhbiBhZHZpc29yeS1sb2NrIGlkLCBhIGNoYW5uZWwgbmFtZSwgYSBjYWNoZSBrZXkuXG4gKlxuICogVGhlIGd1YXJhbnRlZSBpcyB0d28td2F5LCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHNhZmUgdG8gaGFzaDogdmFsdWVzIHRoYXRcbiAqIHNob3VsZCBzaGFyZSBhbiBpZGVudGl0eSBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZyAob2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdFxuICogbWF0dGVyKSwgYW5kIHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYXJlIG5ldmVyIGNvbmZsYXRlZC4gRXZlcnkgdG9rZW4gY2Fycmllc1xuICogaXRzIHR5cGUsIHNvIGAxYCBhbmQgYFwiMVwiYCBkaWZmZXI7IGEgc3RyaW5nIGNhcnJpZXMgaXRzIGxlbmd0aCwgc29cbiAqIGBbXCJhXCIsIFwiYmNcIl1gIGFuZCBgW1wiYWJcIiwgXCJjXCJdYCBkaWZmZXI7IGFycmF5cyBrZWVwIG9yZGVyIHdoaWxlIG9iamVjdCBrZXlzXG4gKiBhcmUgc29ydGVkLlxuICpcbiAqIGBKU09OLnN0cmluZ2lmeWAgY2Fubm90IGRvIHRoaXMgam9iIC0ga2V5IG9yZGVyIGxlYWtzIGluLCBgdW5kZWZpbmVkYCB2YW5pc2hlcyxcbiAqIGAxYCBhbmQgYFwiMVwiYCBjb2xsaWRlIGFmdGVyIHF1b3RpbmcgaXMgc3RyaXBwZWQsIGFuZCBhIGN5Y2xlIHRocm93cyBhXG4gKiBgVHlwZUVycm9yYCBuYW1pbmcgbmVpdGhlciB0aGUgdmFsdWUgbm9yIHRoZSBjYWxsZXIncyBpbnRlbnQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IHN0cmljdCB3aGVyZSBhIHNpbGVudCBhbnN3ZXIgd291bGQgYmUgYSBXUk9ORyBpZGVudGl0eSByYXRoZXJcbiAqIHRoYW4gYSBtaXNzaW5nIG9uZSwgc2luY2UgdHdvIGNhbGxlcnMgZGlzYWdyZWVpbmcgYWJvdXQgYSBsb2NrIG9yIGEgY2hhbm5lbCBpc1xuICogaW52aXNpYmxlIHVudGlsIGl0IGNvcnJ1cHRzIHNvbWV0aGluZy4gVGhyb3dzIGBUeXBlRXJyb3JgIG9uIGEgY3ljbGUsIG9uIGFcbiAqIG5vbi1maW5pdGUgbnVtYmVyIChgTmFOYCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLCBzbyBpdCBjYW5ub3QgaGF2ZSBhIHN0YWJsZVxuICogaWRlbnRpdHkpLCBhbmQgb24gYSBgZnVuY3Rpb25gIG9yIGBzeW1ib2xgIChubyBtZWFuaW5nZnVsIHZhbHVlIGlkZW50aXR5KS5cbiAqIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgYXJlIGFjY2VwdGVkIGFzIGRpc3RpbmN0IHRva2Vucy5cbiAqXG4gKiBgRGF0ZWAgaXMgY2Fub25pY2FsaXplZCBieSBpbnN0YW50LCB1bmxpa2UgdGhlIGhhc2ggY2Fub25pY2FsaXplciBpblxuICogYC4vaGFzaC50c2AsIHdoaWNoIGZvbGRzIGV2ZXJ5IGBEYXRlYCBvbnRvIG9uZSB0b2tlbi4gUHJlZmVyIHRoaXMgZnVuY3Rpb24gd2hlblxuICogZGlzdGluY3RuZXNzIGlzIGEgY29ycmVjdG5lc3MgcmVxdWlyZW1lbnQ7IHByZWZlciBgaGFzaC5mbnZIYXNoYCB3aGVuIGEgc2hvcnQsXG4gKiBjb2xsaXNpb24tdG9sZXJhbnQgZGlnZXN0IGlzIGVub3VnaC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2Fub25pY2FsaXplLlxuICogQHBhcmFtIHNlZW4gLSBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b1N0YWJsZUtleSh7IGE6IDEsIGI6IDIgfSkgPT09IHRvU3RhYmxlS2V5KHsgYjogMiwgYTogMSB9KTsgLy8gdHJ1ZVxuICogdG9TdGFibGVLZXkoMSkgIT09IHRvU3RhYmxlS2V5KFwiMVwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdGFibGVLZXkodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAvLyBMZW5ndGgtcHJlZml4ZWQgc28gY29uY2F0ZW5hdGVkIG5laWdoYm91cnMgY2Fubm90IGJlIHJlLXNwbGl0XG4gICAgICAvLyBkaWZmZXJlbnRseTogYFtcImFcIixcImJjXCJdYCBhbmQgYFtcImFiXCIsXCJjXCJdYCBtdXN0IG5vdCBhZ3JlZS5cbiAgICAgIHJldHVybiBgc3RyaW5nOiR7dmFsdWUubGVuZ3RofToke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBgYm9vbGVhbjoke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIGBiaWdpbnQ6JHt2YWx1ZX1gO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YWJsZSBrZXlzIHJlcXVpcmUgZmluaXRlIG51bWJlcnNcIik7XG4gICAgICAvLyBgLTAgPT09IDBgIGJ1dCB0aGV5IHN0cmluZ2lmeSBkaWZmZXJlbnRseSwgc28gcGljayBvbmUgc3BlbGxpbmcuXG4gICAgICByZXR1cm4gYG51bWJlcjoke09iamVjdC5pcyh2YWx1ZSwgLTApID8gXCItMFwiIDogdmFsdWV9YDtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFibGUga2V5cyBjYW5ub3QgY29udGFpbiBjeWNsZXNcIik7XG4gICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gYGRhdGU6JHt2YWx1ZS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgYXJyYXk6WyR7dmFsdWUubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSkuam9pbihcIixcIil9XWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgLy8gU29ydGVkIGJ5IGNhbm9uaWNhbCBmb3JtLCBzbyBpbnNlcnRpb24gb3JkZXIgZG9lcyBub3QgbGVhay5cbiAgICAgICAgICByZXR1cm4gYHNldDpbJHtbLi4udmFsdWVdXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSlcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzOiBJdGVyYWJsZTxbdW5rbm93biwgdW5rbm93bl0+ID1cbiAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IHZhbHVlIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgICAgICByZXR1cm4gYCR7dmFsdWUgaW5zdGFuY2VvZiBNYXAgPyBcIm1hcFwiIDogXCJvYmplY3RcIn06eyR7Wy4uLmVudHJpZXNdXG4gICAgICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IGAke3RvU3RhYmxlS2V5KGtleSwgc2Vlbil9PSR7dG9TdGFibGVLZXkoaXRlbSwgc2Vlbil9YClcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmpvaW4oXCIsXCIpfX1gO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5kZWxldGUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc3RhYmxlIGtleSB0eXBlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIGB7IFtrZXldOiB2YWx1ZSB9YCB3aGVuIGB2YWx1ZWAgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgIC0gc28gYW5cbiAqIGFic2VudCBvcHRpb25hbCBmaWVsZCBzdGF5cyBBQlNFTlQgd2hlbiBzcHJlYWQsIHJhdGhlciB0aGFuIGJlY29taW5nIGFuXG4gKiBleHBsaWNpdCBgdW5kZWZpbmVkYCB0aGF0IGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlc2AgcmVqZWN0cy5cbiAqXG4gKiBTcGVsbGluZyB0aGF0IGlubGluZSBjb3N0cyBhIHJlcGVhdGVkLCBkb3VibGUtZXZhbHVhdGVkIHRlcm5hcnkgcGVyIGZpZWxkXG4gKiAoYC4uLih2ID8geyBrZXk6IHYgfSA6IHt9KWApLCB3aGljaCBpcyBob3cgY29uZmlnIHJlc29sdmVycyBlbmQgdXAgY29tcHV0aW5nXG4gKiB0aGUgc2FtZSB2YWx1ZSB0d2ljZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogcmV0dXJuIHtcbiAqICAgLi4ub3B0aW9uYWwoXCJhcHBJZFwiLCBjb25maWd1cmVkQXBwSWQpLFxuICogICAuLi5vcHRpb25hbChcImVuZHBvaW50XCIsIGNvbmZpZy5lbmRwb2ludCksXG4gKiB9O1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWw8SyBleHRlbmRzIHN0cmluZywgVj4oXG4gIGtleTogSyxcbiAgdmFsdWU6IFYgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPEssIFY+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAoeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8SywgVj4pO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b051bWJlcn0uXG4gKlxuICogQm90aCBzd2l0Y2hlcyB0dXJuIE9GRiBhIGxlbmllbmN5IHRoYXQgaXMgaGVscGZ1bCBmb3IgYSBoYW5kLXR5cGVkIHNldHRpbmcgYnV0XG4gKiB3cm9uZyB3aGVuIHRoZSBzdHJpbmcncyBvdGhlciBjaGFyYWN0ZXJzIGNhcnJ5IG1lYW5pbmcuIHtAbGluayB0b0RhdGV9IGFuZFxuICoge0BsaW5rIHRvRHVyYXRpb259IGRpc2FibGUgYm90aCwgc2luY2UgYSBzcGFjZSBpbnNpZGUgYDIwMjYgMDggMDJgIGlzIGEgZmllbGRcbiAqIHNlcGFyYXRvciBhbmQgYSBwZXJjZW50IGhhcyBubyBlcG9jaCBvciBtaWxsaXNlY29uZCByZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvTnVtYmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGludGVybmFsIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgYXJlIHN0cmlwcGVkLCBzbyBgXCIxLDAwMFwiYCBhbmRcbiAgICogYFwiMSAwMDBcImAgcmVhZCBhcyBgMTAwMGAuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogUGxhY2VtZW50IGlzIG5vdCB2YWxpZGF0ZWQgd2hlbiBlbmFibGVkLCBzbyBgXCIxLDAwLDBcImAgYWxzbyByZWFkcyBhcyBgMTAwMGAuXG4gICAqIERpc2FibGUgaXQgd2hlbiB3aGl0ZXNwYWNlIG9yIGEgY29tbWEgZGVsaW1pdHMgRklFTERTIHJhdGhlciB0aGFuIGdyb3VwaW5nXG4gICAqIGRpZ2l0cywgYmVjYXVzZSBzdHJpcHBpbmcgdGhlbSBzaWxlbnRseSBmdXNlcyB0aG9zZSBmaWVsZHMgaW50byBvbmUgbnVtYmVyLlxuICAgKi9cbiAgc2VwYXJhdG9ycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdHJhaWxpbmcgcGVyY2VudCBzaWduIGRpdmlkZXMgdGhlIHJlc3VsdCBieSBgMTAwYCwgc28gYFwiMjUlXCJgIHJlYWRzXG4gICAqIGFzIGAwLjI1YC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBEaXNhYmxlIGl0IHdoZXJlIGEgcGVyY2VudGFnZSBoYXMgbm8gbWVhbmluZywgc28gYFwiMjUlXCJgIGlzIGEgbWlzcyByYXRoZXJcbiAgICogdGhhbiBhIG51bWJlciB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBhd2F5IGZyb20gd2hhdCB0aGUgdGV4dCBzYXlzLlxuICAgKi9cbiAgcGVyY2VudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgbnVtZXJpYyB2YWx1ZSB0byBhIHJlYWwsIEZJTklURSBgbnVtYmVyYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdFxuICogY2FycmllcyBubyBudW1lcmljIG1lYW5pbmcuXG4gKlxuICogVGhlIG9uZSBwbGFjZSBhIGhhbmQtdHlwZWQgbnVtYmVyIGlzIGludGVycHJldGVkLCBhbG9uZ3NpZGUge0BsaW5rIHRvQm9vbGVhbn0sXG4gKiB7QGxpbmsgdG9EYXRlfSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS4gUmVhY2ggZm9yIGl0IGluc3RlYWQgb2YgYE51bWJlcih4KWAgb3IgYVxuICogaGFuZC1yb2xsZWQgbnVtZXJpYyByZWdleDogYmFyZSBgTnVtYmVyYCBtYXBzIGBcIlwiYCwgYG51bGxgLCBgW11gLCBhbmRcbiAqIHdoaXRlc3BhY2UgdG8gYDBgIGFuZCBhbnl0aGluZyBlbHNlIHRvIGBOYU5gLCBzbyBhIGNhbGxlciBoYXMgdG8gcmUtY2hlY2sgdGhlXG4gKiByZXN1bHQgZXZlcnkgdGltZSwgYW5kIGFkIGhvYyByZWdleGVzIHRlbmQgdG8gZHJpZnQgaW4gd2hhdCB0aGV5IGFjY2VwdC5cbiAqXG4gKiBBY2NlcHRzOiBhIGZpbml0ZSBgbnVtYmVyYDsgYSBgYmlnaW50YDsgb3IgYSBkZWNpbWFsIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsXG4gKiBsZWFkaW5nIHNpZ24sIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciB0aGUgc2lnbixcbiAqIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgKGBcIjEsMDAwXCJgLCBgXCIxIDAwMFwiYCksIGEgYmFyZSBmcmFjdGlvbiAoYFwiLjVcImApLCBhXG4gKiB0cmFpbGluZyBwb2ludCAoYFwiMS5cImApLCBzY2llbnRpZmljIG5vdGF0aW9uIChgXCIxZTNcImApLCBhbmQgYW4gb3B0aW9uYWxcbiAqIHRyYWlsaW5nIHBlcmNlbnQgc2lnbiAoYFwiMjUlXCJgLCBgXCIxLjUgJVwiYCkuIEEgdHJhaWxpbmcgYCVgIGRpdmlkZXMgdGhlIHBhcnNlZFxuICogdmFsdWUgYnkgYDEwMGAsIHNvIGBcIjI1JVwiYCBiZWNvbWVzIGAwLjI1YC5cbiAqXG4gKiBTZXBhcmF0b3JzIGFyZSBzdHJpcHBlZCB3aXRob3V0IHZhbGlkYXRpbmcgdGhlaXIgcGxhY2VtZW50LCBzbyBgXCIxLDAwLDBcImAgcmVhZHNcbiAqIGFzIGAxMDAwYDsgdGhpcyBpcyBhIGNvZXJjaW9uIGZvciBoYW5kLXR5cGVkIGNvbmZpZ3VyYXRpb24sIG5vdCBhIGxvY2FsZS1hd2FyZVxuICogdmFsaWRhdG9yLiBBbnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgYE5hTmAsIGBJbmZpbml0eWAsIGFuIGVtcHR5IG9yXG4gKiB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nLCBgbnVsbGAsIGB1bmRlZmluZWRgLCBhIGJvb2xlYW4sIG11bHRpcGxlIHNpZ25zLFxuICogbWFsZm9ybWVkIGV4cG9uZW50cywgbWlzcGxhY2VkIHBlcmNlbnQgc2lnbnMsIG9yIGBcIjEycHhcImAsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiB0aHJvd2luZywgbWF0Y2hpbmcgdGhlIG90aGVyIGNvZXJjaW9ucywgc28gaXRcbiAqIGNvbXBvc2VzIG5hdHVyYWxseSB3aXRoIGA/P2AgZmFsbGJhY2tzLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b051bWJlcihcIjEsMDAwXCIpOyAgIC8vIDEwMDBcbiAqIHRvTnVtYmVyKFwiIC0yLjUgXCIpOyAgLy8gLTIuNVxuICogdG9OdW1iZXIoXCIxZTNcIik7ICAgICAvLyAxMDAwXG4gKiB0b051bWJlcihcIjEyLjUgJVwiKTsgIC8vIDAuMTI1XG4gKiB0b051bWJlcihcIlwiKTsgICAgICAgIC8vIHVuZGVmaW5lZCAgKE51bWJlcihcIlwiKSB3b3VsZCBiZSAwKVxuICogdG9OdW1iZXIoXCIxMnB4XCIpOyAgICAvLyB1bmRlZmluZWRcbiAqIHRvTnVtYmVyKFwiMSAwMDBcIiwgeyBzZXBhcmF0b3JzOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogdW5rbm93biwgb3B0aW9uczogVG9OdW1iZXJPcHRpb25zID0ge30pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gdG9OdW1iZXIoTnVtYmVyKHZhbHVlKSwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gU3RyaXAgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciBhIGxlYWRpbmcgc2lnbiwgZGlnaXQtZ3JvdXBcbiAgICAvLyBzZXBhcmF0b3JzIChib3RoIGAsYCBhbmQgdGhlIHNwYWNlIGluIGBcIjEgMDAwXCJgKSwgbGVhdmluZyBhIGJhcmUgbnVtZXJhbCBmb3JcbiAgICAvLyB0aGUgc2hhcGUgdGVzdCBiZWxvdyB0byBhY2NlcHQgb3IgcmVqZWN0LlxuICAgIGNvbnN0IHRleHQgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgb3B0aW9ucy5zZXBhcmF0b3JzID09PSBmYWxzZSA/IC8oXlxccyt8XFxzKyQpL2cgOiAvKF5cXHMrfFxccyskfCg/PD1eWystXSlcXHMrfCg/PD1cXGQpXFxzK3wsKS9nLFxuICAgICAgXCJcIixcbiAgICApO1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL14oWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSglKT8kL2kpO1xuICAgICAgaWYgKG1hdGNoICYmICEobWF0Y2hbMl0gJiYgb3B0aW9ucy5wZXJjZW50ID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICAgICAgcmV0dXJuIHRvTnVtYmVyKG1hdGNoWzJdID8gbnVtYmVyIC8gMTAwIDogbnVtYmVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQSBib3hlZCBgTnVtYmVyYCwgb3IgYW55dGhpbmcgd2l0aCBhIG51bWVyaWMgYHRvU3RyaW5nYC4gYFN0cmluZyh2YWx1ZSlgXG4gICAgLy8gcm91dGVzIGl0IGJhY2sgdGhyb3VnaCB0aGUgc3RyaW5nIGJyYW5jaCwgd2hpY2ggcmVqZWN0cyB3aGF0IGlzIG5vdCBudW1lcmljLlxuICAgIHJldHVybiB0b051bWJlcihTdHJpbmcodmFsdWUpLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGJvb2xlYW4taXNoIHZhbHVlIHRvIGEgcmVhbCBgYm9vbGVhbmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGl0IGNhbid0IGJlIGludGVycHJldGVkLiBSZWNvZ25pemVzIGB0cnVlYC9gdGAvYG9uYC9gMWAvYHllc2AvYHlgXG4gKiBhbmQgdGhlaXIgbmVnYXRpdmVzIChjYXNlLSBhbmQgd2hpdGVzcGFjZS1pbnNlbnNpdGl2ZSBmb3Igc3RyaW5ncyksIGFzXG4gKiB3ZWxsIGFzIHRoZSBudW1iZXJzIGAxYCBhbmQgYDBgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09IFwidHJ1ZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcInRcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib25cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiMVwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5ZXNcIiB8fFxuICAgICAgdmFsdWUgPT09IFwieVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdmFsdWUgPT09IFwiZmFsc2VcIiB8fFxuICAgICAgdmFsdWUgPT0gXCJmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm9mZlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIwXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5vXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5cIlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlO1xuICAgIGVsc2UgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMYXJnZXN0IHZhbHVlIHJlYWQgYXMgZXBvY2ggU0VDT05EUyByYXRoZXIgdGhhbiBtaWxsaXNlY29uZHMuXG4gKlxuICogYDFlMTFgIHNlY29uZHMgaXMgdGhlIHllYXIgNTEzOCBhbmQgYDFlMTFgIG1zIGlzIDE5NzMtMDMtMDMsIHNvIGV2ZXJ5IHZhbHVlIGFcbiAqIGNhbGxlciByZWFsaXN0aWNhbGx5IG1lYW5zIGFzIG1pbGxpcyBpcyBhYm92ZSB0aGUgbGluZSBhbmQgZXZlcnkgdmFsdWUgdGhleVxuICogbWVhbiBhcyBzZWNvbmRzIGlzIGJlbG93IGl0LiBUaGUgYW1iaWd1aXR5IGlzIHVuYXZvaWRhYmxlIC0gdGhlIHR3byB1bml0cyBzaGFyZVxuICogYSBudW1iZXIgbGluZSAtIHNvIHRoZSBzcGxpdCBpcyBwbGFjZWQgd2hlcmUgbmVpdGhlciBzaWRlIGhhcyBhIHBsYXVzaWJsZVxuICogY2xhaW0uXG4gKi9cbmNvbnN0IFNFQ09ORFNfQ0VJTElORyA9IDFlMTE7XG5cbi8qKlxuICogQSBudW1iZXIgZm9yIHtAbGluayB0b0RhdGV9IGFuZCB7QGxpbmsgdG9EdXJhdGlvbn0sIHJlYWQgd2l0aCBub25lIG9mXG4gKiB7QGxpbmsgdG9OdW1iZXJ9J3Mgc3RyaW5nIGxlbmllbmNpZXMuXG4gKlxuICogQm90aCBsZW5pZW5jaWVzIGFyZSBhY3RpdmVseSBoYXJtZnVsIGhlcmUuIEEgc3BhY2Ugb3IgY29tbWEgc2VwYXJhdGVzIEZJRUxEUyBpblxuICogYSBkYXRlIChgMjAyNiAwOCAwMmAgd291bGQgZnVzZSBpbnRvIHRoZSBlcG9jaCBgMjAyNjA4MDJgKSwgYW5kIGEgcGVyY2VudGFnZSBoYXNcbiAqIG5vIHJlYWRpbmcgYXMgYW4gaW5zdGFudCBvciBhIGxlbmd0aCBvZiB0aW1lLCBzbyBgMjUlYCBtdXN0IGJlIGEgbWlzcyByYXRoZXJcbiAqIHRoYW4gYDI1MG1zYC5cbiAqL1xuZnVuY3Rpb24gdG9CYXJlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlLCB7IHNlcGFyYXRvcnM6IGZhbHNlLCBwZXJjZW50OiBmYWxzZSB9KTtcbn1cblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgcGVyIHVuaXQsIGtleWVkIGJ5IFNJTkdVTEFSIGFsaWFzLiB7QGxpbmsgdG9EdXJhdGlvbn0gcmV0cmllcyBhXG4gKiBsb29rdXAgd2l0aG91dCBhIHRyYWlsaW5nIGBzYCwgc28gZXZlcnkgcGx1cmFsIHNwZWxsaW5nIGlzIGNvdmVyZWQgd2l0aG91dFxuICogbGlzdGluZyBpdCAoYG1zYCBpcyBhbHJlYWR5IHNpbmd1bGFyLCBoZW5jZSBpdHMgb3duIGVudHJ5KS5cbiAqXG4gKiBgbWAgaXMgTUlOVVRFUyBhbmQgbW9udGhzIG5lZWQgYG1vYCwgZm9sbG93aW5nIHRoZSBuZWFyLXVuaXZlcnNhbCBjb252ZW50aW9uXG4gKiAoYG1zYCwgYGRhdGVgLCBjcm9uIHByb3NlKTsgbW9udGggYW5kIHllYXIgYXJlIGNhbGVuZGFyIGFwcHJveGltYXRpb25zICgzMCAvXG4gKiAzNjUgZGF5cykgYmVjYXVzZSBhIGR1cmF0aW9uIGhhcyBubyBhbmNob3IgZGF0ZSB0byBiZSBleGFjdCBhZ2FpbnN0LlxuICovXG5jb25zdCBEVVJBVElPTl9VTklUUzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbbXM6IG51bWJlciwgYWxpYXNlczogcmVhZG9ubHkgc3RyaW5nW11dPiA9IFtcbiAgWzEsIFtcIm1zXCIsIFwibXNlY1wiLCBcIm1pbGxpc2Vjb25kXCIsIFwibWlsbGlcIl1dLFxuICBbMTAwMCwgW1wic1wiLCBcInNlY1wiLCBcInNlY29uZFwiXV0sXG4gIFs2MF8wMDAsIFtcIm1cIiwgXCJtaW5cIiwgXCJtaW51dGVcIl1dLFxuICBbM182MDBfMDAwLCBbXCJoXCIsIFwiaHJcIiwgXCJob3VyXCJdXSxcbiAgWzg2XzQwMF8wMDAsIFtcImRcIiwgXCJkYXlcIl1dLFxuICBbNjA0XzgwMF8wMDAsIFtcIndcIiwgXCJ3a1wiLCBcIndlZWtcIl1dLFxuICBbMl81OTJfMDAwXzAwMCwgW1wibW9cIiwgXCJtb25cIiwgXCJtb250aFwiXV0sXG4gIFszMV81MzZfMDAwXzAwMCwgW1wieVwiLCBcInlyXCIsIFwieWVhclwiXV0sXG5dO1xuXG5jb25zdCBEVVJBVElPTl9VTklUX01TOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKFxuICBEVVJBVElPTl9VTklUUy5mbGF0TWFwKChbbXMsIGFsaWFzZXNdKSA9PiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IFthbGlhcywgbXNdIGFzIGNvbnN0KSksXG4pO1xuXG4vKiogT25lIGA8YW1vdW50Pjx1bml0PmAgdGVybSBpbnNpZGUgYSBkdXJhdGlvbiBzdHJpbmcuICovXG5jb25zdCBEVVJBVElPTl9URVJNID0gLyhbKy1dPykoXFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXpdKykvZztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdG9EYXRlfS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0R1cmF0aW9uT3B0aW9uc306IGVhY2ggZnVuY3Rpb24gY2FuIGZhbGwgYmFjayB0byB0aGVcbiAqIG90aGVyLCBzbyBlYWNoIGhhcyBvbmUgc3dpdGNoIHR1cm5pbmcgdGhhdCBmYWxsYmFjayBvZmYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9EYXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24gaXMgcmVhZCBhcyBhbiBpbnN0YW50IHJlbGF0aXZlIHRvXG4gICAqIG5vdywgc28gYC03ZGAgYW5kIGA3IGRheXMgYWdvYCBiZWNvbWUgYG5vdyAtIDcgZGF5c2AuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgd2hlbiB0aGUgdmFsdWUgbXVzdCBiZSBhIHJlYWwgZGF0ZSBhbmQgYSByZWxhdGl2ZSBleHByZXNzaW9uXG4gICAqIHNob3VsZCBiZSBhIG1pc3MgLSBhIHN0b3JlZCB0aW1lc3RhbXAsIGEgdXNlci1zdXBwbGllZCBgRGF0ZWAgaGVhZGVyLCBhblxuICAgKiBgZXhwaXJlc19hdGAgZmllbGQgLSBzaW5jZSBhIGR1cmF0aW9uIHNpbGVudGx5IHJlc29sdmluZyBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gICAqIGNsb2NrIG1ha2VzIHRoZSBzYW1lIGlucHV0IG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBvbiBldmVyeSBjYWxsLiBBbHNvIHdoYXRcbiAgICoge0BsaW5rIHRvRHVyYXRpb259IHBhc3NlcyB3aGVuIGl0IHJlY3Vyc2VzLCBzbyB0aGUgdHdvIGNhbm5vdCBib3VuY2UgYSB2YWx1ZVxuICAgKiBiZXR3ZWVuIHRoZW0gZm9yZXZlci5cbiAgICovXG4gIHBhcnNlRHVyYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0R1cmF0aW9ufS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0RhdGVPcHRpb25zfTogZWFjaCBmdW5jdGlvbiBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvdGhlcixcbiAqIHNvIGVhY2ggaGFzIG9uZSBzd2l0Y2ggdHVybmluZyB0aGF0IGZhbGxiYWNrIG9mZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRGF0ZX0gdmFsdWUgaXMgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdywgc29cbiAgICogYDIwMjYtMDgtMDJgIGJlY29tZXMgaG93ZXZlciBsb25nIHVudGlsIChvciBzaW5jZSkgdGhhdCBpbnN0YW50LiBEZWZhdWx0cyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqXG4gICAqIFNldCBgZmFsc2VgIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIGlzIG1lYW5pbmdmdWwgLSBhIHRpbWVvdXQsIGEgcG9sbFxuICAgKiBpbnRlcnZhbCwgYSBjYWNoZSBUVEwgLSBiZWNhdXNlIGEgZGF0ZSB3b3VsZCBvdGhlcndpc2UgeWllbGQgYSBwbGF1c2libGUgYnV0XG4gICAqIHdyb25nIG51bWJlciB0aGF0IGFsc28gZHJpZnRzIHdpdGggdGhlIGNsb2NrLiBBbHNvIHdoYXQge0BsaW5rIHRvRGF0ZX0gcGFzc2VzXG4gICAqIHdoZW4gaXQgcmVjdXJzZXMuXG4gICAqL1xuICBwYXJzZURhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGR1cmF0aW9uIHRvIE1JTExJU0VDT05EUywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGxlbmllbnQsIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSB0eXBlZCBieSBoYW5kIGludG8gZW52IHZhcnMsXG4gKiBDTEkgZmxhZ3MsIGFuZCBjb25maWcgZmlsZXM6IHdoaXRlc3BhY2UgYmV0d2VlbiBhbW91bnQgYW5kIHVuaXQgaXMgb3B0aW9uYWwgYW5kXG4gKiB1bmxpbWl0ZWQsIHVuaXRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBwbHVyYWxzIGFuZCB0aGUgY29tbW9uIGFiYnJldmlhdGlvbnMgYXJlXG4gKiBlcXVpdmFsZW50IChgMm1zYCA9PT0gYDIgbWlsbGlzZWNvbmRzYCwgYDFoYCA9PT0gYDEgaHJgID09PSBgMSBIb3VyYCksIGBhbmRgIGFuZFxuICogdGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGlnbm9yZWQgKGAxLDUwMCBtc2AsIGAxIGhvdXIgYW5kIDMwIG1pbnV0ZXNgKSwgYW5kXG4gKiB0ZXJtcyBjb21wb3NlIChgMWgzMG1gKS4gQSBwbGFpbiBgbnVtYmVyYCBwYXNzZXMgdGhyb3VnaCBhcyBtaWxsaXNlY29uZHMuXG4gKlxuICogU2lnbnMgYXJlIHN1cHBvcnRlZCBzbyBhIGR1cmF0aW9uIGNhbiBleHByZXNzIGFuIE9GRlNFVCByYXRoZXIgdGhhbiBvbmx5IGFcbiAqIGxlbmd0aDogYSBsZWFkaW5nIGAtYCAob3IgYSB0cmFpbGluZyBgYWdvYCkgbWFrZXMgdGhlIHJlc3VsdCBuZWdhdGl2ZSwgYW5kIGFuXG4gKiB1bnNpZ25lZCB0ZXJtIGluaGVyaXRzIHRoZSBwcmV2aW91cyB0ZXJtJ3Mgc2lnbiwgc28gYC0xaDMwbWAgaXMgLTkwIG1pbnV0ZXNcbiAqIHJhdGhlciB0aGFuIC02MCArIDMwLiB7QGxpbmsgdG9EYXRlfSB1c2VzIHRoYXQgdG8gdHVybiBgLTdkYCAvIGA3IGRheXMgYWdvYFxuICogaW50byBhbiBpbnN0YW50IHJlbGF0aXZlIHRvIG5vdy5cbiAqXG4gKiBBbiBVTktOT1dOIHVuaXQgZmFpbHMgdGhlIHdob2xlIHBhcnNlIHJhdGhlciB0aGFuIGJlaW5nIHNraXBwZWQgLSBgMSBmb3J0bmlnaHRgXG4gKiByZXR1cm5pbmcgYDFgIHNpbGVudGx5IHdvdWxkIGJlIHdvcnNlIHRoYW4gcmV0dXJuaW5nIG5vdGhpbmcgLSB3aGljaCBpcyBhbHNvXG4gKiB3aGF0IGtlZXBzIHtAbGluayB0b0RhdGV9IGZyb20gbWlzdGFraW5nIGAxIEphbiAyMDI2YCBmb3IgYSBkdXJhdGlvbi5cbiAqXG4gKiBBIHZhbHVlIHRoYXQgaXMgbm90IGEgZHVyYXRpb24gYXQgYWxsIGlzIG9mZmVyZWQgdG8ge0BsaW5rIHRvRGF0ZX0gYW5kLCB3aGVuIGl0XG4gKiBJUyBhIGRhdGUsIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3cgKGBkYXRlIC0gbm93YCksIHdoaWNoIG1ha2VzIHRoZVxuICogdHdvIGZ1bmN0aW9ucyBpbnZlcnNlczogYSBwYXN0IGluc3RhbnQgaXMgbmVnYXRpdmUsIGEgZnV0dXJlIG9uZSBwb3NpdGl2ZS5cbiAqIGBvcHRpb25zLnBhcnNlRGF0ZTogZmFsc2VgIHR1cm5zIHRoYXQgb2ZmIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIG1ha2VzXG4gKiBzZW5zZSAtIHNlZSB7QGxpbmsgVG9EdXJhdGlvbk9wdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0R1cmF0aW9uKFwiMzBzXCIpOyAgICAgICAgICAgICAgICAgICAgLy8gMzBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMSBob3VyIDMwIG1pbnV0ZXNcIik7ICAgICAgLy8gNV80MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiLTcgZGF5c1wiKTsgICAgICAgICAgICAgICAgLy8gLTYwNF84MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMiB3ZWVrcyBhZ29cIik7ICAgICAgICAgICAgLy8gLTFfMjA5XzYwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgICAgICAvLyBtcyBmcm9tIG5vdyB0byB0aGF0IGluc3RhbnRcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIsIHsgcGFyc2VEYXRlOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKiB0b0R1cmF0aW9uKFwic29vblwiKTsgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0R1cmF0aW9uKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0R1cmF0aW9uT3B0aW9ucyA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgLy8gQSBiYXJlIG51bWJlciBpcyBhbHJlYWR5IG1pbGxpc2Vjb25kcywgdGhlIHNhbWUgcmVhZGluZyBgdG9EYXRlYCBnaXZlcyBhblxuICAvLyBlcG9jaCB2YWx1ZSwgc28gdGhpcyBtdXN0IHJ1biBiZWZvcmUgYW55IGRhdGUgaW50ZXJwcmV0YXRpb24uXG4gIGNvbnN0IG51bSA9IHRvQmFyZU51bWJlcih2YWx1ZSk7XG4gIGlmIChudW0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cbiAgbGV0IHRleHQgPSB2YWx1ZVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2VBbGwoL1ssX10vZywgXCJcIilcbiAgICAucmVwbGFjZUFsbCgvXFxiYW5kXFxiL2csIFwiIFwiKVxuICAgIC50cmltKCk7XG4gIGxldCBuZWdhdGUgPSBmYWxzZTtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJhZ29cIikpIHtcbiAgICBuZWdhdGUgPSB0cnVlO1xuICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIC1cImFnb1wiLmxlbmd0aCk7XG4gIH1cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXmluXFxiLywgXCJcIikudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGVybXMgPSBbLi4udGV4dC5tYXRjaEFsbChEVVJBVElPTl9URVJNKV07XG4gIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgLy8gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBtYXRjaGVkIHRlcm1zIG11c3QgYmUgc2VwYXJhdG9ycyBvbmx5OyBvdGhlcndpc2UgdGhlXG4gIC8vIHN0cmluZyBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IG1lcmVseSBDT05UQUlOUyBhIGR1cmF0aW9uLXNoYXBlZCBmcmFnbWVudC5cbiAgbGV0IGxlZnRvdmVyID0gdGV4dDtcbiAgZm9yIChjb25zdCB0ZXJtIG9mIHRlcm1zKSBsZWZ0b3ZlciA9IGxlZnRvdmVyLnJlcGxhY2UodGVybVswXSwgXCIgXCIpO1xuICBpZiAobGVmdG92ZXIudHJpbSgpKSB7XG4gICAgLy8gQSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQgaW5zaWRlIG90aGVyIHRleHQgaXMgdXN1YWxseSBhIERBVEUgLSBgXCIyMDI2LTA4LTAyXCJgXG4gICAgLy8gbWF0Y2hlcyB0d28gdGVybXMgYW5kIGxlYXZlcyBzZXBhcmF0b3JzIGJlaGluZC5cbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgbGV0IHRvdGFsID0gMDtcbiAgbGV0IHNpZ24gPSAxO1xuICBmb3IgKGNvbnN0IFssIGV4cGxpY2l0U2lnbiwgYW1vdW50LCB1bml0XSBvZiB0ZXJtcykge1xuICAgIGlmIChleHBsaWNpdFNpZ24pIHNpZ24gPSBleHBsaWNpdFNpZ24gPT09IFwiLVwiID8gLTEgOiAxO1xuICAgIGNvbnN0IHVuaXRNcyA9IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQpID8/IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQucmVwbGFjZSgvcyQvLCBcIlwiKSk7XG4gICAgaWYgKHVuaXRNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICAgIH1cbiAgICB0b3RhbCArPSBzaWduICogTnVtYmVyKGFtb3VudCkgKiB1bml0TXM7XG4gIH1cbiAgcmV0dXJuIG5lZ2F0ZSA/IC10b3RhbCA6IHRvdGFsO1xufVxuXG4vKipcbiAqIEEgZGF0ZSByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93IChgZGF0ZSAtIG5vd2ApLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiB7QGxpbmsgdG9EdXJhdGlvbn0gYW5kIHtAbGluayB0b0RhdGV9IGludmVyc2VzIG9mIGVhY2ggb3RoZXIuIFJlY3Vyc2VzIHdpdGhcbiAqIGR1cmF0aW9uIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kIGZvcnRoXG4gKiBmb3JldmVyLlxuICovXG5mdW5jdGlvbiBkYXRlQXNEdXJhdGlvbih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGUgPSB0b0RhdGUodmFsdWUsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7XG4gIHJldHVybiBkYXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgZGF0ZS1pc2ggdmFsdWUgdG8gYSByZWFsIGBEYXRlYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuIEFjY2VwdHMsIGluIHRoaXMgb3JkZXI6XG4gKlxuICogICAtIGEgYERhdGVgIChwYXNzZWQgdGhyb3VnaDsgYW4gaW52YWxpZCBvbmUgaXMgYSBtaXNzKTtcbiAqICAgLSBhbiBlcG9jaCBOVU1CRVIgb3IgbnVtZXJpYyBzdHJpbmcsIGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIChzZWVcbiAqICAgICB7QGxpbmsgU0VDT05EU19DRUlMSU5HfSk7XG4gKiAgIC0gYG5vd2AgKGFuZCBpdHMgYHRvZGF5YCBzcGVsbGluZyksIGZvciB0aGUgY3VycmVudCBpbnN0YW50O1xuICogICAtIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24sIHJlc29sdmVkIFJFTEFUSVZFIFRPIE5PVywgc28gYC03ZGAsXG4gKiAgICAgYDcgZGF5cyBhZ29gLCBhbmQgYGluIDMwIG1pbnV0ZXNgIGFyZSBhbGwgdmFsaWQgaW5zdGFudHM7XG4gKiAgIC0gYW55dGhpbmcgYERhdGUucGFyc2VgIHVuZGVyc3RhbmRzIChgMjAyNi0wOC0wMmAsIGFuIElTTy9VVEMgaW5zdGFudCkuXG4gKlxuICogVGhlIGVwb2NoIHVuaXQgaW5mZXJlbmNlIGlzIHRoZSByZWFzb24gdGhpcyBleGlzdHMgcmF0aGVyIHRoYW5cbiAqIGBuZXcgRGF0ZSh2YWx1ZSlgOiBhIGJhcmUgZXBvY2ggYXJyaXZlcyBhcyBhIFNUUklORyBmcm9tIGFuIGVudiB2YXIgb3IgYSBDTElcbiAqIGZsYWcgYXMgb2Z0ZW4gYXMgaXQgYXJyaXZlcyBhcyBhIG51bWJlciAoYGRhdGUgKyVzYCwgYSBKU09OIGZpZWxkLCBhIGNvcGllZCBsb2dcbiAqIGxpbmUpLCBhbmQgYERhdGUucGFyc2UoXCIxNzg1Njk3ODk5XCIpYCByZWFkcyB0aGF0IGFzIGEgWUVBUiwgc2lsZW50bHkgbGFuZGluZ1xuICogMS43IGJpbGxpb24geWVhcnMgb3V0LiBOdW1lcmljIHN0cmluZ3MgYXJlIHRoZXJlZm9yZSByb3V0ZWQgdG8gdGhlIGVwb2NoIHBhdGgsXG4gKiBuZXZlciB0byBgRGF0ZS5wYXJzZWAuXG4gKlxuICogVGhlIGR1cmF0aW9uIGZhbGxiYWNrIHJ1bnMgTEFTVCwgYWZ0ZXIgYERhdGUucGFyc2VgLCBzbyBhIHJlYWwgZGF0ZSBpcyBuZXZlclxuICogbWlzdGFrZW4gZm9yIGFuIG9mZnNldC4gYG9wdGlvbnMucGFyc2VEdXJhdGlvbjogZmFsc2VgIHJlbW92ZXMgaXQgZW50aXJlbHkgd2hlblxuICogdGhlIHZhbHVlIG11c3QgYmUgYW4gYWJzb2x1dGUgaW5zdGFudCAtIHNlZSB7QGxpbmsgVG9EYXRlT3B0aW9uc30uXG4gKlxuICogTGlrZSB7QGxpbmsgdG9Cb29sZWFufSB0aGlzIE5FVkVSIHRocm93cyBhbmQgcmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmdcbiAqIHVuaW50ZXJwcmV0YWJsZSwgc28gYSBjYWxsZXIgZGVjaWRlcyB3aGV0aGVyIGEgYmFkIHZhbHVlIGlzIGZhdGFsLCBhIHdhcm5pbmcsXG4gKiBvciBhIGZhbGxiYWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0RhdGUoXCJub3dcIik7ICAgICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW50XG4gKiB0b0RhdGUoXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgLy8gMjAyNi0wOC0wMlQwMDowMDowMC4wMDBaXG4gKiB0b0RhdGUoXCIxNzg1Njk3ODk5XCIpOyAgICAgICAgLy8gc2Vjb25kcyAtPiAyMDI2LTA4LTAyVC4uLlxuICogdG9EYXRlKDE3ODU2OTc4OTkwMDApOyAgICAgICAvLyBtaWxsaXMgIC0+IHRoZSBzYW1lIGluc3RhbnRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIpOyAgICAgICAvLyBub3cgLSAzMGRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7IC8vIHVuZGVmaW5lZFxuICogdG9EYXRlKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0RhdGVPcHRpb25zID0ge30pOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXBvY2hNcyA9IHRvRXBvY2hNcyh2YWx1ZSk7XG4gIGlmIChlcG9jaE1zICE9PSB1bmRlZmluZWQpIHJldHVybiBmcm9tTXMoZXBvY2hNcyk7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB0ZXh0ID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0ZXh0ID09PSBcIm5vd1wiIHx8IHRleHQgPT09IFwidG9kYXlcIikgcmV0dXJuIG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh2YWx1ZS50cmltKCkpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQpKSByZXR1cm4gbmV3IERhdGUocGFyc2VkKTtcblxuICBpZiAob3B0aW9ucy5wYXJzZUR1cmF0aW9uID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gUmVjdXJzZXMgd2l0aCBkYXRlIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kXG4gIC8vIGZvcnRoIGZvcmV2ZXIuXG4gIGNvbnN0IG9mZnNldE1zID0gdG9EdXJhdGlvbih2YWx1ZSwgeyBwYXJzZURhdGU6IGZhbHNlIH0pO1xuICByZXR1cm4gb2Zmc2V0TXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGZyb21NcyhEYXRlLm5vdygpICsgb2Zmc2V0TXMpO1xufVxuXG4vKiogQSBgRGF0ZWAgZm9yIGVwb2NoIGBtc2AsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgb3V0IG9mIHJlcHJlc2VudGFibGUgcmFuZ2UuICovXG5mdW5jdGlvbiBmcm9tTXMobXM6IG51bWJlcik6IERhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGRhdGU7XG59XG5cbi8qKlxuICogRXBvY2ggbWlsbGlzZWNvbmRzIGZvciBhIG51bWVyaWMgdmFsdWUvc3RyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBvbmUsXG4gKiBhcHBseWluZyB0aGUgc2Vjb25kcy12cy1taWxsaXMgaW5mZXJlbmNlIGF0IHtAbGluayBTRUNPTkRTX0NFSUxJTkd9LlxuICovXG5mdW5jdGlvbiB0b0Vwb2NoTXModmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBudW1lcmljID0gdG9CYXJlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguYWJzKG51bWVyaWMpIDwgU0VDT05EU19DRUlMSU5HID8gbnVtZXJpYyAqIDEwMDAgOiBudW1lcmljO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcC1lcXVhbGl0eSB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSBjb21wYXJhdG9yLlxuICpcbiAqIHtAbGluayBkZWVwRXF1YWx9IG1pcnJvcnMgdGhlIHNlbWFudGljcyBvZiB0aGUgYGZhc3QtZGVlcC1lcXVhbGBcbiAqIHBhY2thZ2UgKGhhbmRsZWQ6IG5lc3RlZCBwbGFpbiBvYmplY3RzL2FycmF5cywgYE1hcGAsIGBTZXRgLCBgRGF0ZWAsXG4gKiBgUmVnRXhwYCwgdHlwZWQgYXJyYXlzLCBgTmFOYCwgYW5kIGArMGAvYC0wYCB0cmVhdGVkIGFzIGVxdWFsKSBidXQgaXNcbiAqIGRlcGVuZGVuY3ktZnJlZSBzbyBgQGRieC10b29scy9zaGFyZWQtY29yZWAga2VlcHMgbm8gcnVudGltZSBkZXBzLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgY29tcGFyYXRvcmAgc2hvcnQtY2lyY3VpdHMgdGhlIHN0cnVjdHVyYWwgd2FsayBhdCBhbnlcbiAqIG5vZGU6IHJldHVybiBgdHJ1ZWAvYGZhbHNlYCB0byBmb3JjZSB0aGUgcmVzdWx0IGZvciB0aGF0IHBhaXIsIG9yXG4gKiBgdW5kZWZpbmVkYCB0byBkZWZlciB0byB0aGUgYnVpbHQtaW4gY29tcGFyaXNvbi4gSXQgaXMgaW52b2tlZCBmb3IgdGhlXG4gKiByb290IHBhaXIgYW5kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIG5lc3RlZCBwYWlyLCBzbyBhIGNhbGxlciBjYW4sIGUuZy4sXG4gKiBjb21wYXJlIHR3byBkb21haW4gb2JqZWN0cyBieSBpZCB3aGlsZSBsZXR0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBmYWxsXG4gKiBiYWNrIHRvIHN0cnVjdHVyYWwgZXF1YWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKFsxLCAyXSwgWzEsIDJdKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKGEsIGIsICh4LCB5KSA9PlxuICogICBpc0VudGl0eSh4KSAmJiBpc0VudGl0eSh5KSA/IHguaWQgPT09IHkuaWQgOiB1bmRlZmluZWQpO1xuICovXG5leHBvcnQgdHlwZSBEZWVwRXF1YWxDb21wYXJhdG9yID0gKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoYTogdW5rbm93biwgYjogdW5rbm93biwgY29tcGFyYXRvcj86IERlZXBFcXVhbENvbXBhcmF0b3IpOiBib29sZWFuIHtcbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBjb25zdCBkZWNpZGVkID0gY29tcGFyYXRvcihhLCBiKTtcbiAgICBpZiAoZGVjaWRlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjaWRlZDtcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgYSA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIiB8fCBiID09PSBudWxsKSB7XG4gICAgLy8gTmFOIGlzIHRoZSBvbmx5IHZhbHVlIG5vdCBlcXVhbCB0byBpdHNlbGYgdW5kZXIgYD09PWAuXG4gICAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbiAgfVxuXG4gIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBjb25zdCBiQXJyID0gYiBhcyB1bmtub3duW107XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYkFycltpXSwgY29tcGFyYXRvcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGNvbnN0IGJNYXAgPSBiIGFzIE1hcDx1bmtub3duLCB1bmtub3duPjtcbiAgICBpZiAoYS5zaXplICE9PSBiTWFwLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgICBpZiAoIWJNYXAuaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghZGVlcEVxdWFsKHZhbHVlLCBiTWFwLmdldChrZXkpLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgY29uc3QgYlNldCA9IGIgYXMgU2V0PHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJTZXQuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYSkge1xuICAgICAgaWYgKCFiU2V0Lmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IChiIGFzIERhdGUpLmdldFRpbWUoKTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgY29uc3QgYlJlID0gYiBhcyBSZWdFeHA7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiUmUuc291cmNlICYmIGEuZmxhZ3MgPT09IGJSZS5mbGFncztcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgIShhIGluc3RhbmNlb2YgRGF0YVZpZXcpKSB7XG4gICAgY29uc3QgYUFyciA9IGEgYXMgdW5rbm93biBhcyBBcnJheUxpa2U8bnVtYmVyPjtcbiAgICBjb25zdCBiQXJyID0gYiBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGlmIChhQXJyLmxlbmd0aCAhPT0gYkFyci5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhQXJyW2ldICE9PSBiQXJyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIGFLZXlzKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChcbiAgICAgICFkZWVwRXF1YWwoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgY29tcGFyYXRvcixcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
1183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29iamVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUE0Qkgsc0VBQXNFO0FBQ3RFLE1BQU0sVUFBVSxXQUFXLENBQWMsS0FBbUI7SUFDMUQsT0FBTyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBY0Q7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFjLEtBQWM7SUFDdEQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxHQUFHLElBQUksS0FBSyxZQUFZLEdBQUcsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUNyQixVQUF5RCxFQUN6RCxPQUFpQztJQUVqQyxTQUFTLEtBQUssQ0FBQyxLQUFjLEVBQUUsSUFBbUI7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ2xDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FB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Q0FBQztRQUN4QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7SUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUE0QixDQUFDLENBQUM7SUFDeEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNoRSxJQUNFLENBQUMsU0FBUyxDQUNQLENBQTZCLENBQUMsR0FBRyxDQUFDLEVBQ2xDLENBQTZCLENBQUMsR0FBRyxDQUFDLEVBQ25DLFVBQVUsQ0FDWCxFQUNELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXBlbmRlbmN5LWZyZWUgb2JqZWN0ICsgaXRlcmFibGUgdXRpbGl0aWVzLlxuICpcbiAqIFZhbHVlIGd1YXJkcyAvIGNvZXJjaW9ucyAvIHNoYXBlIHR5cGVzOiB7QGxpbmsgaXNSZWNvcmR9IG5hcnJvd3MgcGFyc2VkIEpTT05cbiAqIHRvIGEgcmVjb3JkLCB7QGxpbmsgdG9OdW1iZXJ9IGNvZXJjZXMgYSBoYW5kLXR5cGVkIG51bWVyYWwsIHtAbGluayB0b0Jvb2xlYW59XG4gKiBjb2VyY2VzIGxvb3NlIHRydXRoeS9mYWxzeSB2YWx1ZXMsIHtAbGluayB0b0R1cmF0aW9ufSBwYXJzZXMgYDFoMzBtYCAvXG4gKiBgMiBtaWxsaXNlY29uZHNgIHRvIG1pbGxpcywge0BsaW5rIHRvRGF0ZX0gY29lcmNlcyBhIGRhdGUvSVNPIHN0cmluZy9lcG9jaFxuICogbnVtYmVyL3JlbGF0aXZlIGR1cmF0aW9uIChgdG9EYXRlYCBhbmQgYHRvRHVyYXRpb25gIGZhbGwgYmFjayB0byBlYWNoIG90aGVyLCBzb1xuICogZWl0aGVyIGFjY2VwdHMgYm90aCByZWFkaW5ncyksIHtAbGluayBvcHRpb25hbH1cbiAqIHNwcmVhZHMgYSBmaWVsZCBvbmx5IHdoZW4gaXQgaXMgcHJlc2VudCwge0BsaW5rIGRlZXBFcXVhbH0gY29tcGFyZXNcbiAqIHN0cnVjdHVyYWxseSwge0BsaW5rIGlzU2VyaWFsaXphYmxlVmFsdWV9IHJlamVjdHMgYW55dGhpbmcgYSBKU09OIHJvdW5kIHRyaXBcbiAqIHdvdWxkIGxvc2Ugb3IgY29lcmNlLCB7QGxpbmsgdG9TdGFibGVLZXl9IGNhbm9uaWNhbGl6ZXMgYSB2YWx1ZSBzbyBhbiBpZGVudGl0eVxuICogY2FuIGJlIGRlcml2ZWQgZnJvbSBpdCwgYW5kIHtAbGluayBOYW1lTGlrZX0ve0BsaW5rIE5vbkZ1bmN0aW9uS2V5c30gZGVzY3JpYmVcbiAqIG9iamVjdCBzaGFwZXMuXG4gKlxuICogSXRlcmFibGUgaGVscGVyczoge0BsaW5rIGdlbmVyYXRvcn0gZmxhdHRlbnMgbWl4ZWQgYXJndW1lbnRzOyB7QGxpbmsgc2VxdWVuY2V9XG4gKiB3cmFwcyBzb3VyY2UocykgaW4gYSBsYXp5LCBgQXJyYXlgLWNvbXBhdGlibGUge0BsaW5rIFNlcXVlbmNlfS4gRXZlcnlcbiAqIHRyYW5zZm9ybS90ZXJtaW5hbCBpcyBhIHN0YW5kYWxvbmUgZnVuY3Rpb24gb3BlcmF0aW5nIG9uIHBsYWluIHtAbGlua1xuICogQ29udGFpbmVyfXMgKHNlZSB7QGxpbmsgbWFwfSwge0BsaW5rIGZpbHRlcn0sIHtAbGluayBncm91cH0sIC4uLik7IHRoZSB7QGxpbmtcbiAqIFNlcXVlbmNlfSBtZXRob2RzIGFyZSB0aGluIGZvcndhcmRlcnMgb3ZlciB0aGVtIHNvIHRoZSBzYW1lIGxvZ2ljIGJhY2tzIGJvdGhcbiAqIHRoZSBmcmVlLWZ1bmN0aW9uIGFuZCB0aGUgZmx1ZW50L2NoYWluZWQgc3R5bGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vKiogTGF6eSBzZXF1ZW5jZSBvdmVyIGl0ZXJhYmxlIHNvdXJjZShzKS4gU2VlIHtAbGluayBzZXF1ZW5jZX0uICovXG5leHBvcnQgdHlwZSBTZXF1ZW5jZTxUPiA9IFNlcXVlbmNlSW1wbDxUPjtcblxudHlwZSBTZXF1ZW5jZVNvdXJjZTxUPiA9XG4gIEl0ZXJhYmxlPFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD4gfCBPbmVPck1hbnk8VD4gfCBFeHRyYWN0PFQsIHN0cmluZz4gfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgbm9uLXNjYWxhciB7QGxpbmsgSXRlcmFibGV9IC0gb25lIHRvIHRyZWF0IGFzIGEgY29sbGVjdGlvbiBvZiBlbGVtZW50c1xuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuIHtAbGluayBpc0NvbnRhaW5lcn0gbmFycm93cyB0byB0aGlzLCBleGNsdWRpbmcgc3RyaW5ncyxcbiAqIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMuIHtAbGluayBDb2xsZWN0aW9ufSBpcyB0aGUgZWFnZXJseS1cbiAqIHNpemVkIHN1YnNldC4gVGhlIGVsZW1lbnQgZGVmYXVsdHMgdG8gYHVua25vd25gIHNvIGFueSBgQ29sbGVjdGlvbmAgaXNcbiAqIGFzc2lnbmFibGUgdG8gYSBiYXJlIGBDb250YWluZXJgLlxuICovXG5leHBvcnQgdHlwZSBDb250YWluZXI8VCA9IHVua25vd24+ID0gSXRlcmFibGU8VD47XG5cbi8qKlxuICogQSBidWlsdC1pbiwgZWFnZXJseS1zaXplZCB7QGxpbmsgQ29udGFpbmVyfTogYW4ge0BsaW5rIEFycmF5fSwge0BsaW5rIFNldH0sIG9yXG4gKiB7QGxpbmsgTWFwfSAod2hvc2UgKnZhbHVlcyogYXJlIGBUYCAtIGEgTWFwIGl0ZXJhdGVzIGBba2V5LCB2YWx1ZV1gIGVudHJpZXMsXG4gKiBzbyBpdHMgZWxlbWVudCB0eXBlIGRpZmZlcnMsIGJ1dCBpdHMgdmFsdWUgdHlwZSBpcyBgVGApLiBBbGwgc2hhcmUgYSBjaGVhcFxuICogZW1wdGluZXNzIGNoZWNrICh7QGxpbmsgaXNFbXB0eX0pLlxuICovXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uPFQ+ID0gUmVhZG9ubHlBcnJheTxUPiB8IFJlYWRvbmx5U2V0PFQ+IHwgUmVhZG9ubHlNYXA8dW5rbm93biwgVD47XG5cbi8qKiBOb24tZW1wdHkgdHVwbGUgdXNlZCB3aGVyZSBhbiBBUEkgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHZhbHVlLiAqL1xuZXhwb3J0IHR5cGUgT25lT3JNYW55PFQ+ID0gW1QsIC4uLlRbXV07XG5cbi8qKiBOYXJyb3cgYSByZWFkb25seSBhcnJheSB0byBhIG5vbi1lbXB0eSB7QGxpbmsgT25lT3JNYW55fSB0dXBsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09uZU9yTWFueTxUID0gdW5rbm93bj4odmFsdWU6IHJlYWRvbmx5IFRbXSk6IHZhbHVlIGlzIE9uZU9yTWFueTxUPiB7XG4gIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xufVxuXG4vKiogQSBzb3VyY2UgYWNjZXB0ZWQgYnkgYSB2YXJpYWRpYyBvcDogYSB7QGxpbmsgQ29udGFpbmVyfSBvZiBgVGAsIG9yIG5vdGhpbmcuICovXG50eXBlIFNvdXJjZTxUPiA9IENvbnRhaW5lcjxUPiB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRWxlbWVudCB0eXBlIG9mIGEge0BsaW5rIGdyb3VwfSBidWNrZXQgYXJyYXk6IHdoZW4gdGhlIHByZWRpY2F0ZSBgUGAgaXMgYSB0eXBlXG4gKiBndWFyZCAoYHZhbHVlIGlzIFNgKSwgdGhlIGJ1Y2tldCBpcyBuYXJyb3dlZCB0byBgUyAmIFRgOyBvdGhlcndpc2UgaXQgc3RheXMgYFRgLlxuICovXG50eXBlIEdyb3VwVmFsdWU8VCwgUD4gPSBQIGV4dGVuZHMgKHZhbHVlOiBhbnksIC4uLnJlc3Q6IGFueVtdKSA9PiB2YWx1ZSBpcyBpbmZlciBTID8gUyAmIFQgOiBUO1xuXG4vKiogQSBtYXAgb2YgZ3JvdXAgbmFtZSAtPiBwcmVkaWNhdGUsIGFzIGFjY2VwdGVkIGJ5IHtAbGluayBncm91cH0uICovXG50eXBlIEdyb3VwUHJlZGljYXRlczxUPiA9IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbj47XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYSB7QGxpbmsgQ29sbGVjdGlvbn06IGFuIHtAbGluayBBcnJheX0sIHtAbGluayBTZXR9LCBvclxuICoge0BsaW5rIE1hcH0uIE5hcnJvd3MgYHZhbHVlYCBzbyBpdHMgZWxlbWVudC92YWx1ZSB0eXBlIGlzIHRyZWF0ZWQgYXMgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIEVsZW1lbnQgKG9yIE1hcCB2YWx1ZSkgdHlwZSBhc3NlcnRlZCBmb3IgdGhlIGNvbGxlY3Rpb24uXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIChuYXJyb3dpbmcgYHZhbHVlYCB0byB7QGxpbmsgQ29sbGVjdGlvbn08YFRgPikgZm9yIGFcbiAqICAgYnVpbHQtaW4gYXJyYXkvc2V0L21hcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sbGVjdGlvbjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb2xsZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8IHZhbHVlIGluc3RhbmNlb2YgTWFwO1xufVxuXG4vKipcbiAqIGB0cnVlYCB3aGVuIGEge0BsaW5rIENvbGxlY3Rpb259IGhhcyBubyBlbGVtZW50cy4gVXNlcyBgbGVuZ3RoYCBmb3IgYXJyYXlzXG4gKiBhbmQgYHNpemVgIGZvciB7QGxpbmsgU2V0fS97QGxpbmsgTWFwfS5cbiAqXG4gKiBAcGFyYW0gY29sbGVjdGlvbiAtIFRoZSBhcnJheSwgc2V0LCBvciBtYXAgdG8gdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkoXG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb248dW5rbm93bj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9LFxuKTogYm9vbGVhbiB7XG4gIGZ1bmN0aW9uIHZpc2l0KHZhbHVlOiB1bmtub3duLCBzZWVuPzogU2V0PHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoc2Vlbj8uaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgICBzZWVuPy5hZGQodmFsdWUpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT09IDAgfHwgKHNlZW4gPyB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zaXplID09PSAwIHx8IChzZWVuID8gWy4uLnZhbHVlXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdmFsdWUuc2l6ZSA9PT0gMCB8fFxuICAgICAgICAgIChzZWVuID8gWy4uLnZhbHVlLnZhbHVlcygpXS5ldmVyeSgoaXRlbSkgPT4gdmlzaXQoaXRlbSwgc2VlbikpIDogZmFsc2UpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChzZWVuKSB7XG4gICAgICAgIHJldHVybiBrZXlzLmV2ZXJ5KChrZXkpID0+IHZpc2l0KCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSwgc2VlbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB2aXNpdChjb2xsZWN0aW9uLCBvcHRpb25zPy5yZWN1cnNpdmUgPyBuZXcgU2V0KCkgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzb3VyY2UgdG8gYW4gaXRlcmFibGUgb2YgaXRzIGBUYCB2YWx1ZXMsIHNvIE1hcHMgYXJlIHRyZWF0ZWRcbiAqIHVuaWZvcm1seSB3aXRoIGFycmF5cy9zZXRzOiBhIHtAbGluayBNYXB9IHlpZWxkcyBpdHMgKnZhbHVlcyogKG1hdGNoaW5nXG4gKiB7QGxpbmsgQ29sbGVjdGlvbn0ncyB2YWx1ZS10eXBlZCBgVGApLCBhbnkgb3RoZXIgaXRlcmFibGUgeWllbGRzIGl0c2VsZi4gVGhpc1xuICogaXMgd2hhdCB7QGxpbmsgc2VxdWVuY2V9IGNvbnN1bWVzLCBzbyBhIGBNYXBgIGNvbnRyaWJ1dGVzIHZhbHVlcyBldmVyeXdoZXJlXG4gKiByYXRoZXIgdGhhbiBgW2tleSwgdmFsdWVdYCBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzPFQ+KHNvdXJjZTogSXRlcmFibGU8VD4gfCBSZWFkb25seU1hcDx1bmtub3duLCBUPik6IEl0ZXJhYmxlPFQ+IHtcbiAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIE1hcCA/IHNvdXJjZS52YWx1ZXMoKSA6IChzb3VyY2UgYXMgSXRlcmFibGU8VD4pO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGEge0BsaW5rIENvbnRhaW5lcn0gLSBhbiBpdGVyYWJsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29sbGVjdGlvblxuICogcmF0aGVyIHRoYW4gYSBzY2FsYXIuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGV4Y2x1ZGVzIHZhbHVlcyB0aGF0IGFyZSB0ZWNobmljYWxseSBpdGVyYWJsZSBidXQgc2hvdWxkIGJlXG4gKiB0cmVhdGVkIGFzIHNjYWxhcnMgaGVyZSAtIHN0cmluZ3MsIGBTdHJpbmdgL2BSZWdFeHBgIG9iamVjdHMsIGFuZCBmdW5jdGlvbnMgLVxuICogc28gYSBsb25lIHN0cmluZyBpcyBuZXZlciBzcHJlYWQgY2hhcmFjdGVyLWJ5LWNoYXJhY3Rlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgYXNzZXJ0ZWQgZm9yIHRoZSBpdGVyYWJsZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgKG5hcnJvd2luZyBgdmFsdWVgIHRvIHtAbGluayBDb250YWluZXJ9PGBUYD4pIGZvciBhIG5vbi1zdHJpbmdcbiAqICAgaXRlcmFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRhaW5lcjxUID0gdW5rbm93bj4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250YWluZXI8VD4ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAhKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSAmJlxuICAgICEodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgW1N5bWJvbC5pdGVyYXRvcl0/OiB1bmtub3duIH0pW1N5bWJvbC5pdGVyYXRvcl0gPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuXG5mdW5jdGlvbiBzZXF1ZW5jZVNvdXJjZXM8VD4oLi4uc291cmNlczogU2VxdWVuY2VTb3VyY2U8VD5bXSk6IEl0ZXJhYmxlPFQ+W10ge1xuICBjb25zdCBzb3VyY2VJdGVyYWJsZXM6IEl0ZXJhYmxlPFQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCAoaXNDb2xsZWN0aW9uKHNvdXJjZSkgJiYgaXNFbXB0eShzb3VyY2UpKSkgY29udGludWU7XG4gICAgc291cmNlSXRlcmFibGVzLnB1c2goaXNDb250YWluZXI8VD4oc291cmNlKSA/IHZhbHVlcyhzb3VyY2UpIDogW3NvdXJjZSBhcyBUXSk7XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUl0ZXJhYmxlcztcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBuZXN0ZWQgYXJyYXlzIGZvciB7QGxpbmsgZmxhdH0uIE5vbi1hcnJheSB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgYVxuICogc2luZ2xlLWVsZW1lbnQgaXRlcmFibGU7IGRlcHRoIGRlY3JlbWVudHMgcGVyIGFycmF5IGxldmVsLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuVmFsdWUodmFsdWU6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiBJdGVyYWJsZTx1bmtub3duPiB7XG4gIGlmIChkZXB0aCA+IDAgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBuZXh0RGVwdGggPSBOdW1iZXIuaXNGaW5pdGUoZGVwdGgpID8gZGVwdGggLSAxIDogZGVwdGg7XG4gICAgcmV0dXJuIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB5aWVsZCogZmxhdHRlblZhbHVlKGl0ZW0sIG5leHREZXB0aCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZV07XG59XG5cbi8qKiBXcmFwIGEgcGVyLWVsZW1lbnQgdHJhbnNmb3JtIChlYWNoIGVsZW1lbnQgLT4gYW4gaXRlcmFibGUpIGFzIGEgbGF6eSB7QGxpbmsgU2VxdWVuY2V9LiAqL1xuZnVuY3Rpb24gZGVyaXZlPFQsIFU+KFxuICBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICBmbjogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBJdGVyYWJsZTxVPixcbik6IFNlcXVlbmNlPFU+IHtcbiAgcmV0dXJuIHNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHlpZWxkKiBmbih2YWx1ZSwgaW5kZXgrKyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKiBMaWtlIHtAbGluayBkZXJpdmV9LCBidXQgeWllbGRzIG9uZSB2YWx1ZSBwZXIgc291cmNlIGVsZW1lbnQgKG5vIHdyYXBwZXIgaXRlcmFibGUpLiAqL1xuZnVuY3Rpb24gZGVyaXZlT25lPFQsIFU+KHNvdXJjZTogSXRlcmFibGU8VD4sIGZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB5aWVsZCBmbih2YWx1ZSwgaW5kZXgrKyk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5tYXBgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY29udGFpbmVyIHRvIG1hcCAobnVsbGlzaCB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UpLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHBlciBlbGVtZW50IHdpdGggaXRzIGluZGV4OyBpdHMgcmVzdWx0IGlzIGVtaXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXA8VCwgVT4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBVLFxuKTogU2VxdWVuY2U8VT4ge1xuICByZXR1cm4gZGVyaXZlT25lKHNlcXVlbmNlKHNvdXJjZSksIGNhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbHRlcmAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBBIHR5cGUtZ3VhcmQgcHJlZGljYXRlIG5hcnJvd3MgdGhlIHJlc3VsdGluZyBlbGVtZW50IHR5cGUuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBjb250YWluZXIgdG8gZmlsdGVyIChudWxsaXNoIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZSkuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gS2VlcHMgZWxlbWVudHMgZm9yIHdoaWNoIGl0IHJldHVybnMgYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogU2VxdWVuY2U8Uz47XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBTZXF1ZW5jZTxUPjtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFNlcXVlbmNlPFQ+IHtcbiAgcmV0dXJuIGRlcml2ZShzZXF1ZW5jZShzb3VyY2UpLCBmdW5jdGlvbiogKHZhbHVlLCBpbmRleCkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgeWllbGQgdmFsdWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyB0aGUgc291cmNlcyBhbmQgeWllbGRzIG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgbm90IGBudWxsYCBvclxuICogYHVuZGVmaW5lZGAsIG5hcnJvd2luZyB0aGUgZWxlbWVudCB0eXBlIHRvIHtAbGluayBOb25OdWxsYWJsZX08YFRgPi5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub25OdWxsPFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgcmV0dXJuIGZpbHRlcihzZXF1ZW5jZSguLi5zb3VyY2VzKSwgKHZhbHVlKTogdmFsdWUgaXMgTm9uTnVsbGFibGU8VD4gPT4gdmFsdWUgIT0gbnVsbCk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mbGF0TWFwYCwgb3ZlciBhIHNpbmdsZSB7QGxpbmsgQ29udGFpbmVyfS5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGNvbnRhaW5lciB0byBtYXAgKG51bGxpc2ggeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlKS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFJldHVybnMgYSB2YWx1ZSBvciBhcnJheSBvZiB2YWx1ZXMsIGZsYXR0ZW5lZCBvbmUgbGV2ZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0TWFwPFQsIFU+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gVSB8IFJlYWRvbmx5QXJyYXk8VT4sXG4pOiBTZXF1ZW5jZTxVPiB7XG4gIHJldHVybiBkZXJpdmUoc2VxdWVuY2Uoc291cmNlKSwgZnVuY3Rpb24qICh2YWx1ZSwgaW5kZXgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayh2YWx1ZSwgaW5kZXgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHlpZWxkKiByZXN1bHQ7XG4gICAgZWxzZSB5aWVsZCByZXN1bHQgYXMgVTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5mbGF0YCAoYXJyYXlzIG9ubHkpLiBgZGVwdGhgIGxlYWRzIHNvIHRoZVxuICogc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYzsgdXNlIGBkZXB0aCA8IDFgIGZvciBhIG5vLW9wIHBhc3N0aHJvdWdoLlxuICpcbiAqIEBwYXJhbSBkZXB0aCAtIEhvdyBtYW55IGFycmF5IGxldmVscyB0byBmbGF0dGVuLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlLCB0aGVuIGZsYXR0ZW4gKG51bGxpc2ggc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0PFQ+KGRlcHRoOiBudW1iZXIsIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICBjb25zdCBzcmMgPSBzZXF1ZW5jZSguLi5zb3VyY2VzKTtcbiAgaWYgKGRlcHRoIDwgMSkgcmV0dXJuIHNyYztcbiAgcmV0dXJuIGRlcml2ZShzcmMsICh2YWx1ZSkgPT4gZmxhdHRlblZhbHVlKHZhbHVlLCBkZXB0aCkpIGFzIFNlcXVlbmNlPFQ+O1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyB0aGUgc291cmNlcywgdGhlbiBsYXppbHkgeWllbGRzIHZhbHVlcyBpbiBlbmNvdW50ZXIgb3JkZXIsXG4gKiBza2lwcGluZyBhIHZhbHVlIG9ubHkgd2hlbiBhbiBlcXVhbCBvbmUgd2FzIGFscmVhZHkgeWllbGRlZCAoYFNldGAgL1xuICogU2FtZVZhbHVlWmVybykuIFVuaXF1ZW5lc3MgaXMgY2hlY2tlZCBwZXIgZWxlbWVudCBhcyBpdCBpcyBjb25zdW1lZC5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdDxUPiguLi5zb3VyY2VzOiByZWFkb25seSBTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8VD4oKTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFlpZWxkcyBgc291cmNlYCwgdGhlbiBlYWNoIGFwcGVuZGVkIGBpdGVtYCBpbiBvcmRlciAoYXJyYXlzIHNwcmVhZCBvbmUgbGV2ZWwpLFxuICogbWlycm9yaW5nIGBBcnJheS5wcm90b3R5cGUuY29uY2F0YC4gYGl0ZW1zYCBhcmUgc2NhbGFyIHZhbHVlcy9hcnJheXMsIG5vdFxuICogY29udGFpbmVycywgc28gYHNvdXJjZWAgc3RheXMgYSBzaW5nbGUgbGVhZGluZyBhcmd1bWVudC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGxlYWRpbmcgY29udGFpbmVyIChudWxsaXNoIHlpZWxkcyBqdXN0IHRoZSBpdGVtcykuXG4gKiBAcGFyYW0gaXRlbXMgLSBWYWx1ZXMgKG9yIGFycmF5cyBvZiB2YWx1ZXMpIGFwcGVuZGVkIGFmdGVyIHRoZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQ8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBSZWFkb25seUFycmF5PFQ+KVtdXG4pOiBTZXF1ZW5jZTxUPiB7XG4gIGNvbnN0IHNyYyA9IHNlcXVlbmNlKHNvdXJjZSk7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBzcmM7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgeWllbGQqIHNyYztcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkgeWllbGQqIGl0ZW07XG4gICAgICAgIGVsc2UgeWllbGQgaXRlbSBhcyBUO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFlpZWxkcyBhdCBtb3N0IGBjb3VudGAgZWxlbWVudHMgZnJvbSB0aGUgZnJvbnQgb2YgdGhlIGNvbmNhdGVuYXRlZCBzb3VyY2VzLlxuICogYGNvdW50YCBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAcGFyYW0gY291bnQgLSBNYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byB5aWVsZCAoYDw9IDBgIHlpZWxkcyBub25lKS5cbiAqIEBwYXJhbSBzb3VyY2VzIC0gQ29udGFpbmVycyB0byBjb25jYXRlbmF0ZSAobnVsbGlzaCBzb3VyY2VzIGFyZSBza2lwcGVkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRha2U8VD4oY291bnQ6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBTZXF1ZW5jZTxUPiB7XG4gIGlmIChjb3VudCA8PSAwKSByZXR1cm4gZW1wdHlTZXF1ZW5jZSBhcyBTZXF1ZW5jZTxUPjtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIHJldHVybiBzZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgbGV0IHRha2VuID0gMDtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgICBpZiAoKyt0YWtlbiA+PSBjb3VudCkgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFNwbGl0cyB0aGUgY29uY2F0ZW5hdGVkIHNvdXJjZXMgaW50byBvbmUgYXJyYXkgcGVyIG5hbWVkIHByZWRpY2F0ZS4gQ29uc3VtZXNcbiAqIHRoZSBpbnB1dCBvbmNlLCByb3V0aW5nIGVhY2ggZWxlbWVudCB0byB0aGUgRklSU1QgcHJlZGljYXRlIGl0IHNhdGlzZmllcyAoc29cbiAqIGdyb3VwcyBhcmUgZGlzam9pbnQpOyBlbGVtZW50cyBtYXRjaGluZyBubyBwcmVkaWNhdGUgYXJlIGRyb3BwZWQuIFR5cGUtZ3VhcmRcbiAqIHByZWRpY2F0ZXMgbmFycm93IHRoZWlyIGdyb3VwJ3MgZWxlbWVudCB0eXBlIChzZWUge0BsaW5rIEdyb3VwVmFsdWV9KS5cbiAqIGBwcmVkaWNhdGVzYCBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAdHlwZVBhcmFtIEcgLSBUaGUgbWFwIG9mIGdyb3VwIG5hbWUgLT4gcHJlZGljYXRlLlxuICogQHBhcmFtIHByZWRpY2F0ZXMgLSBOYW1lZCBwcmVkaWNhdGVzOyBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBrZXlzLCBlYWNoIGFuIGFycmF5IG9mIGl0cyBncm91cCdzIGVsZW1lbnRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGNvbnN0IHsgc3RyaW5ncywgZm5zIH0gPSBncm91cCh7IHN0cmluZ3M6IGlzU3RyaW5nLCBmbnM6IGlzRnVuY3Rpb24gfSwgeHMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXA8VCwgRyBleHRlbmRzIEdyb3VwUHJlZGljYXRlczxUPj4oXG4gIHByZWRpY2F0ZXM6IEcsXG4gIC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdXG4pOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcmVkaWNhdGVzKSBhcyAoa2V5b2YgRylbXTtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8a2V5b2YgRywgVFtdPihrZXlzLm1hcCgoa2V5KSA9PiBba2V5LCBbXV0pKTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZSguLi5zb3VyY2VzKSkge1xuICAgIGNvbnN0IGkgPSBpbmRleCsrO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChwcmVkaWNhdGVzW2tleV0hKHZhbHVlLCBpKSkge1xuICAgICAgICBidWNrZXRzLmdldChrZXkpIS5wdXNoKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHsgW0sgaW4ga2V5b2YgR106IEdyb3VwVmFsdWU8VCwgR1tLXT5bXSB9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgcmVzdWx0W2tleV0gPSBidWNrZXRzLmdldChrZXkpISBhcyBHcm91cFZhbHVlPFQsIEdbdHlwZW9mIGtleV0+W107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgZWxlbWVudHMgdW50aWwgYSBtYXRjaC4gQSB0eXBlIGd1YXJkIG5hcnJvd3MgdGhlIHJldHVybiB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZDxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFMgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogVCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBmaW5kPFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzZXF1ZW5jZShzb3VyY2UpKSB7XG4gICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZmluZExhc3RgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogQ29uc3VtZXMgdGhlIGZ1bGwgc291cmNlLiBBIHR5cGUgZ3VhcmQgbmFycm93cyB0aGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdDxULCBTIGV4dGVuZHMgVD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyxcbik6IFMgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3Q8VD4oXG4gIHNvdXJjZTogU291cmNlPFQ+LFxuICBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbixcbik6IFQgfCB1bmRlZmluZWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgbWF0Y2g6IFQgfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSBtYXRjaCA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBtYXRjaDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyBlbGVtZW50cyB1bnRpbCBhIG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEluZGV4PFQ+KFxuICBzb3VyY2U6IFNvdXJjZTxUPixcbiAgcHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4sXG4pOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCkpIHJldHVybiBpbmRleDtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0SW5kZXhgLCBvdmVyIGEgc2luZ2xlXG4gKiB7QGxpbmsgQ29udGFpbmVyfS4gQ29uc3VtZXMgdGhlIGZ1bGwgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RJbmRleDxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1hdGNoID0gLTE7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4KSkgbWF0Y2ggPSBpbmRleDtcbiAgICBpbmRleCsrO1xuICB9XG4gIHJldHVybiBtYXRjaDtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLnNvbWVgLCBvdmVyIGEgc2luZ2xlIHtAbGluayBDb250YWluZXJ9LlxuICogU2hvcnQtY2lyY3VpdHMgb24gdGhlIGZpcnN0IG1hdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29tZTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgrKykpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU2FtZSBzZW1hbnRpY3MgYXMgYEFycmF5LnByb3RvdHlwZS5ldmVyeWAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBTaG9ydC1jaXJjdWl0cyBvbiB0aGUgZmlyc3QgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQsIFMgZXh0ZW5kcyBUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTLFxuKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBldmVyeTxUPihcbiAgc291cmNlOiBTb3VyY2U8VD4sXG4gIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc2VxdWVuY2Uoc291cmNlKSkgaWYgKCFwcmVkaWNhdGUodmFsdWUsIGluZGV4KyspKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFNhbWUgc2VtYW50aWNzIGFzIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAsIG92ZXIgYSBzaW5nbGUge0BsaW5rIENvbnRhaW5lcn0uXG4gKiBDb25zdW1lcyB0aGUgc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaDxUPihzb3VyY2U6IFNvdXJjZTxUPiwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHNlcXVlbmNlKHNvdXJjZSkpIGNhbGxiYWNrKHZhbHVlLCBpbmRleCsrKTtcbn1cblxuLyoqXG4gKiBTYW1lIHNlbWFudGljcyBhcyBgQXJyYXkucHJvdG90eXBlLmF0YCBvdmVyIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcy5cbiAqIE5vbi1uZWdhdGl2ZSBpbmRpY2VzIHNjYW4gbGF6aWx5OyBuZWdhdGl2ZSBpbmRpY2VzIG1hdGVyaWFsaXplIGZpcnN0LiBgaW5kZXhgXG4gKiBsZWFkcyBzbyB0aGUgc291cmNlcyBjYW4gc3RheSB2YXJpYWRpYy5cbiAqXG4gKiBAcGFyYW0gaW5kZXggLSBaZXJvLWJhc2VkIHBvc2l0aW9uOyBuZWdhdGl2ZSBjb3VudHMgZnJvbSB0aGUgZW5kLlxuICogQHBhcmFtIHNvdXJjZXMgLSBDb250YWluZXJzIHRvIGNvbmNhdGVuYXRlIChudWxsaXNoIHNvdXJjZXMgYXJlIHNraXBwZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXQ8VD4oaW5kZXg6IG51bWJlciwgLi4uc291cmNlczogcmVhZG9ubHkgU291cmNlPFQ+W10pOiBUIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3JjID0gc2VxdWVuY2UoLi4uc291cmNlcyk7XG4gIGlmIChpbmRleCA8IDApIHJldHVybiB0b0FycmF5KHNyYykuYXQoaW5kZXgpO1xuICBsZXQgaSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc3JjKSB7XG4gICAgaWYgKGkrKyA9PT0gaW5kZXgpIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PbmVPck1hbnk8VD4oaW5wdXQ6IFQgfCBPbmVPck1hbnk8VD4pOiBPbmVPck1hbnk8VD4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF07XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemVzIHRoZSBjb25jYXRlbmF0ZWQgc291cmNlcyBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBzaW5nbGUtcGFzc1xuICogc291cmNlcy5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIENvbnRhaW5lcnMgdG8gY29uY2F0ZW5hdGUgKG51bGxpc2ggc291cmNlcyBhcmUgc2tpcHBlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KC4uLnNvdXJjZXM6IHJlYWRvbmx5IFNvdXJjZTxUPltdKTogcmVhZG9ubHkgVFtdIHtcbiAgcmV0dXJuIFsuLi5zZXF1ZW5jZSguLi5zb3VyY2VzKV07XG59XG5cbi8qKlxuICogTGF6eSBpdGVyYWJsZSBzZXF1ZW5jZSB3aXRoIGBBcnJheWAtY29tcGF0aWJsZSB0cmFuc2Zvcm1zIGFuZCB0ZXJtaW5hbFxuICogbWV0aG9kcy4gU2luZ2xlLXBhc3MgYnkgZGVmYXVsdDsgY2FsbCB7QGxpbmsgU2VxdWVuY2VJbXBsLmNhY2hlfSB0byByZXRhaW5cbiAqIHB1bGxlZCB2YWx1ZXMgZm9yIHJlLWl0ZXJhdGlvbi4gQnVpbHQgZm9yIGdlbmVyYXRvcnMgYW5kIG90aGVyIHNvdXJjZXMgd2hlcmVcbiAqIGEgc2Vjb25kIHBhc3MgaXMgbm90IGd1YXJhbnRlZWQuXG4gKlxuICogVGhlIG1ldGhvZHMgZm9yd2FyZCB0byB0aGUgc3RhbmRhbG9uZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSAtIHNlZSBlYWNoXG4gKiBtZXRob2QncyBgQHNlZWAgLSBzbyB0aGUgZnJlZS1mdW5jdGlvbiBhbmQgY2hhaW5lZCBzdHlsZXMgc2hhcmUgb25lIGltcGwuXG4gKi9cbmNsYXNzIFNlcXVlbmNlSW1wbDxUPiB7XG4gIHByaXZhdGUgaXRlcmF0b3I/OiBJdGVyYXRvcjxUPjtcbiAgcHJpdmF0ZSBleGhhdXN0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2U6IEl0ZXJhYmxlPFQ+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBUW10gfCB1bmRlZmluZWQsXG4gICAgc3RhdGU6IHsgcmVhZG9ubHkgZXhoYXVzdGVkPzogYm9vbGVhbiB9ID0ge30sXG4gICkge1xuICAgIHRoaXMuZXhoYXVzdGVkID0gc3RhdGUuZXhoYXVzdGVkID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlIHRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvbmNlLCBjcmVhdGluZyB0aGUgaXRlcmF0b3Igb24gZmlyc3QgdXNlLiAqL1xuICBwcml2YXRlIHB1bGwoKTogSXRlcmF0b3JSZXN1bHQ8VD4ge1xuICAgIHRoaXMuaXRlcmF0b3IgPz89IHRoaXMuc291cmNlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICByZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gIH1cblxuICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogSXRlcmF0b3I8VD4ge1xuICAgIGlmICghdGhpcy5jYWNoaW5nKSB7XG4gICAgICBpZiAodGhpcy5leGhhdXN0ZWQpIHJldHVybjtcbiAgICAgIGZvciAobGV0IG5leHQgPSB0aGlzLnB1bGwoKTsgIW5leHQuZG9uZTsgbmV4dCA9IHRoaXMucHVsbCgpKSB7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmV4aGF1c3RlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhY2hlZDogaXRlcmF0ZSBsaWtlIGEgbGlzdC4gQWx3YXlzIHJlcGxheSB0aGUgYnVmZmVyIGZyb20gdGhlIHN0YXJ0LFxuICAgICAgLy8gZXh0ZW5kaW5nIGl0IGZyb20gdGhlIHNvdXJjZSBvbiBkZW1hbmQgdW50aWwgZXhoYXVzdGVkLiBBIGJyb2tlbiBsb29wXG4gICAgICAvLyBsZWF2ZXMgdGhlIGJ1ZmZlciBpbnRhY3QsIHNvIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGFydHMgb3ZlciBmcm9tIHRoZVxuICAgICAgLy8gYmVnaW5uaW5nLlxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIhO1xuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaWYgKGluZGV4IDwgYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgIHlpZWxkIGJ1ZmZlcltpbmRleCsrXSE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhoYXVzdGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnB1bGwoKTtcbiAgICAgICAgaWYgKG5leHQuZG9uZSkge1xuICAgICAgICAgIHRoaXMuZXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYnVmZmVyLnB1c2gobmV4dC52YWx1ZSk7XG4gICAgICAgIHlpZWxkIG5leHQudmFsdWU7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG1hcH0gKi9cbiAgbWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUpOiBTZXF1ZW5jZTxVPiB7XG4gICAgcmV0dXJuIG1hcCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmlsdGVyfSAqL1xuICBmaWx0ZXI8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogU2VxdWVuY2U8Uz47XG4gIGZpbHRlcihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFNlcXVlbmNlPFQ+O1xuICBmaWx0ZXIocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIGZpbHRlcih0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIG5vbk51bGx9ICovXG4gIG5vbk51bGwoKTogU2VxdWVuY2U8Tm9uTnVsbGFibGU8VD4+IHtcbiAgICByZXR1cm4gbm9uTnVsbCh0aGlzKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0TWFwfSAqL1xuICBmbGF0TWFwPFU+KGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IFUgfCBSZWFkb25seUFycmF5PFU+KTogU2VxdWVuY2U8VT4ge1xuICAgIHJldHVybiBmbGF0TWFwKHRoaXMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmbGF0fSAqL1xuICBmbGF0KGRlcHRoID0gMSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZmxhdChkZXB0aCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZGlzdGluY3R9ICovXG4gIGRpc3RpbmN0KCk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gZGlzdGluY3QodGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgY29uY2F0fSAqL1xuICBjb25jYXQoLi4uaXRlbXM6IHJlYWRvbmx5IChUIHwgUmVhZG9ubHlBcnJheTxUPilbXSk6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gY29uY2F0KHRoaXMsIC4uLml0ZW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXppbHkgeWllbGRzIHRoaXMgc2VxdWVuY2UgZm9sbG93ZWQgYnkgZWFjaCBpdGVyYWJsZSBgc291cmNlYCBpbiBvcmRlci5cbiAgICogTGlrZSB7QGxpbmsgY29uY2F0fSwgYnV0IGZvciBpdGVyYWJsZSBzb3VyY2VzIChnZW5lcmF0b3JzLCBvdGhlciBzZXF1ZW5jZXMsXG4gICAqIGBTZXRgLCBgTWFwYCwgZXRjLikgcmF0aGVyIHRoYW4gc2NhbGFyIHZhbHVlcyBvciBhcnJheXMuIEEge0BsaW5rIE1hcH1cbiAgICogc291cmNlIGNvbnRyaWJ1dGVzIGl0cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIHNlcXVlbmNlfVxuICAgKi9cbiAgam9pbiguLi5zb3VyY2VzOiByZWFkb25seSBTZXF1ZW5jZVNvdXJjZTxUPltdKTogU2VxdWVuY2U8VD4ge1xuICAgIGNvbnN0IHNvdXJjZUl0ZXJhYmxlcyA9IHNlcXVlbmNlU291cmNlcyh0aGlzLCAuLi5zb3VyY2VzKTtcbiAgICByZXR1cm4gc2VxdWVuY2VTb3VyY2VzLmxlbmd0aCA9PT0gMCA/IHRoaXMgOiBzZXF1ZW5jZSguLi5zb3VyY2VJdGVyYWJsZXMpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIHRha2V9ICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IFNlcXVlbmNlPFQ+IHtcbiAgICByZXR1cm4gdGFrZShjb3VudCwgdGhpcyk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZ3JvdXB9ICovXG4gIGdyb3VwPEcgZXh0ZW5kcyBHcm91cFByZWRpY2F0ZXM8VD4+KHByZWRpY2F0ZXM6IEcpOiB7IFtLIGluIGtleW9mIEddOiBHcm91cFZhbHVlPFQsIEdbS10+W10gfSB7XG4gICAgcmV0dXJuIGdyb3VwKHByZWRpY2F0ZXMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjYWNoZWQsIHJlLWl0ZXJhYmxlIHZpZXcgb2YgdGhpcyBzZXF1ZW5jZS4gQW4gYWxyZWFkeS1jYWNoaW5nXG4gICAqIHNlcXVlbmNlIHJldHVybnMgaXRzZWxmOyBvdGhlcndpc2UgdGhpcyBvbmUtcGFzcyBzZXF1ZW5jZSBpcyB3cmFwcGVkIGluIGFcbiAgICogbmV3IGluc3RhbmNlIHRoYXQgcmV0YWlucyBwdWxsZWQgdmFsdWVzLiBJdGVyYXRlIHRoZSByZXR1cm5lZCBpbnN0YW5jZSwgbm90XG4gICAqIHRoZSBvcmlnaW5hbCwgdG8gYXZvaWQgY29tcGV0aW5nIGZvciB0aGUgc2FtZSBzaW5nbGUtcGFzcyBzb3VyY2UuXG4gICAqL1xuICBjYWNoZSgpOiBTZXF1ZW5jZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGluZyA/IHRoaXMgOiBuZXcgU2VxdWVuY2VJbXBsKHRoaXMsIFtdKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kfSAqL1xuICBmaW5kPFMgZXh0ZW5kcyBUPihwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gdmFsdWUgaXMgUyk6IFMgfCB1bmRlZmluZWQ7XG4gIGZpbmQocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZpbmQodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBmaW5kTGFzdH0gKi9cbiAgZmluZExhc3Q8UyBleHRlbmRzIFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2YWx1ZSBpcyBTKTogUyB8IHVuZGVmaW5lZDtcbiAgZmluZExhc3QocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW4pOiBUIHwgdW5kZWZpbmVkO1xuICBmaW5kTGFzdChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBmaW5kTGFzdCh0aGlzLCBwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqIEBzZWUge0BsaW5rIGZpbmRJbmRleH0gKi9cbiAgZmluZEluZGV4KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZmluZEluZGV4KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZmluZExhc3RJbmRleH0gKi9cbiAgZmluZExhc3RJbmRleChwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IG51bWJlciB7XG4gICAgcmV0dXJuIGZpbmRMYXN0SW5kZXgodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBzb21lfSAqL1xuICBzb21lKHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvbWUodGhpcywgcHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKiBAc2VlIHtAbGluayBldmVyeX0gKHRoZSBgUyBleHRlbmRzIFRgIG92ZXJsb2FkIG5hcnJvd3MgYXQgY29tcGlsZSB0aW1lIG9ubHkpLiAqL1xuICBldmVyeTxTIGV4dGVuZHMgVD4ocHJlZGljYXRlOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IHZhbHVlIGlzIFMpOiB0aGlzIGlzIFNlcXVlbmNlPFM+O1xuICBldmVyeShwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbik6IGJvb2xlYW47XG4gIGV2ZXJ5KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV2ZXJ5KHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgZm9yRWFjaH0gKi9cbiAgZm9yRWFjaChjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZm9yRWFjaCh0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHNlZSB7QGxpbmsgYXR9ICovXG4gIGF0KGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYXQoaW5kZXgsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBzZXF1ZW5jZSBpbnRvIGEgbmV3IGFycmF5LiBDb25zdW1lcyBhIHNpbmdsZS1wYXNzIHNvdXJjZTsgYVxuICAgKiBjYWNoZWQsIGV4aGF1c3RlZCBzZXF1ZW5jZSBjb3BpZXMgaXRzIGJ1ZmZlciBkaXJlY3RseS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgdG9BcnJheX1cbiAgICovXG4gIHRvQXJyYXkoKTogcmVhZG9ubHkgVFtdIHtcbiAgICBpZiAodGhpcy5jYWNoaW5nICYmIHRoaXMuZXhoYXVzdGVkKSByZXR1cm4gWy4uLnRoaXMuYnVmZmVyIV07XG4gICAgcmV0dXJuIHRvQXJyYXkodGhpcyk7XG4gIH1cbn1cblxuLyoqIFNoYXJlZCBlbXB0eSBzZXF1ZW5jZSBzaW5nbGV0b24sIHJldXNhYmxlIGZvciBhbnkgZWxlbWVudCB0eXBlLiAqL1xuY29uc3QgZW1wdHlTZXF1ZW5jZTogU2VxdWVuY2U8bmV2ZXI+ID0gbmV3IFNlcXVlbmNlSW1wbChbXSwgdW5kZWZpbmVkLCB7XG4gIGV4aGF1c3RlZDogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIFdyYXAgb25lIG9yIG1vcmUgaXRlcmFibGUgYHNvdXJjZXNgIGluIGEgc2luZ2xlIGxhenkge0BsaW5rIFNlcXVlbmNlfSxcbiAqIGl0ZXJhdGVkIGluIG9yZGVyLiBgbnVsbGAvYHVuZGVmaW5lZGAgc291cmNlcyBhcmUgc2tpcHBlZDsgd2hlbiBub3RoaW5nXG4gKiByZW1haW5zIChldmVyeSBzb3VyY2Ugb21pdHRlZCwgYG51bGxgLCBgdW5kZWZpbmVkYCwgb3IgYW4gZW1wdHkgYXJyYXkgL1xuICogYFNldGAgLyBgTWFwYCksIHtAbGluayBlbXB0eVNlcXVlbmNlfSBpcyByZXR1cm5lZC4gVGhlIHJlc3VsdCBpcyBzaW5nbGUtcGFzc1xuICogLSBjYWxsIGAuY2FjaGUoKWAgdG8gbWFrZSBpdCByZS1pdGVyYWJsZS5cbiAqXG4gKiBBIHtAbGluayBNYXB9IHNvdXJjZSBjb250cmlidXRlcyBpdHMgdmFsdWVzIChzZWUge0BsaW5rIHZhbHVlc30pLCBjb25zaXN0ZW50XG4gKiB3aXRoIHtAbGluayBDb2xsZWN0aW9ufSdzIHZhbHVlLXR5cGVkIGBUYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHNvdXJjZXMgLSBJdGVyYWJsZXMgdG8gY29uY2F0ZW5hdGUsIGluIG9yZGVyIChgTWFwYCBzb3VyY2VzIHVzZSB2YWx1ZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VxdWVuY2U8VD4oLi4uc291cmNlczogcmVhZG9ubHkgU2VxdWVuY2VTb3VyY2U8VD5bXSk6IFNlcXVlbmNlPFQ+IHtcbiAgLy8gU2tpcCBudWxsaXNoIHNvdXJjZXMgYW5kIGtub3duLWVtcHR5IGNvbGxlY3Rpb25zOyBub3JtYWxpemUgdGhlIHJlc3QgdG9cbiAgLy8gdGhlaXIgdmFsdWVzIHNvIGEgTWFwIGNvbnRyaWJ1dGVzIHZhbHVlcyByYXRoZXIgdGhhbiBba2V5LCB2YWx1ZV0gZW50cmllcy5cbiAgY29uc3Qgc291cmNlSXRlcmFibGVzID0gc2VxdWVuY2VTb3VyY2VzKC4uLnNvdXJjZXMpO1xuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5U2VxdWVuY2UgYXMgU2VxdWVuY2U8VD47XG4gIC8vIFJldXNlIGFuIGV4aXN0aW5nIHNlcXVlbmNlIGFzLWlzIHJhdGhlciB0aGFuIHJlLXdyYXBwaW5nIGl0LlxuICBpZiAoc291cmNlSXRlcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IG9ubHkgPSBzb3VyY2VJdGVyYWJsZXNbMF0hO1xuICAgIHJldHVybiBvbmx5IGluc3RhbmNlb2YgU2VxdWVuY2VJbXBsID8gKG9ubHkgYXMgU2VxdWVuY2U8VD4pIDogbmV3IFNlcXVlbmNlSW1wbChvbmx5LCB1bmRlZmluZWQpO1xuICB9XG4gIHJldHVybiBuZXcgU2VxdWVuY2VJbXBsKFxuICAgIHtcbiAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlSXRlcmFibGVzKSB5aWVsZCogc291cmNlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqXG4gKiBGbGF0dGVucyBhIG1peCBvZiBzaW5nbGUgaXRlbXMgYW5kIGl0ZXJhYmxlcyBpbnRvIG9uZSBsYXp5IHtAbGluayBHZW5lcmF0b3J9LlxuICpcbiAqIEFyZ3VtZW50cyBhcmUgZW1pdHRlZCBpbiBvcmRlcjogYG51bGxgL2B1bmRlZmluZWRgIGFyZSBza2lwcGVkLCBub24tc3RyaW5nXG4gKiBpdGVyYWJsZXMgKHBlciB7QGxpbmsgaXNDb250YWluZXJ9KSBhcmUgeWllbGRlZCBlbGVtZW50LWJ5LWVsZW1lbnQsIGFuZFxuICogYW55dGhpbmcgZWxzZSAoaW5jbHVkaW5nIHN0cmluZ3MpIGlzIHlpZWxkZWQgYXMgYSBzaW5nbGUgaXRlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBFbGVtZW50IHR5cGUgcHJvZHVjZWQgYnkgdGhlIGdlbmVyYXRvci5cbiAqIEBwYXJhbSBpdGVtcyAtIEl0ZW1zIGFuZC9vciBpdGVyYWJsZXMgdG8gZmxhdHRlbiwgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvdmVyIHRoZSBmbGF0dGVuZWQgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiogZ2VuZXJhdG9yPFQ+KFxuICAuLi5pdGVtczogcmVhZG9ubHkgKFQgfCBJdGVyYWJsZTxUPiB8IG51bGwgfCB1bmRlZmluZWQpW11cbik6IEdlbmVyYXRvcjxUPiB7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChpc0NvbnRhaW5lcihpdGVtKSkge1xuICAgICAgeWllbGQqIGl0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHlpZWxkIGl0ZW07XG4gICAgfVxuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gT2JqZWN0IHZhbHVlIGd1YXJkcywgY29lcmNpb25zLCBhbmQgc3RydWN0dXJhbCBlcXVhbGl0eVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNaW5pbWFsIHNoYXBlIGZvciBvYmplY3RzIHRoYXQgZXhwb3NlIGFuIG9wdGlvbmFsIGBuYW1lYCAoZS5nLiBBcHBLaXQgcGx1Z2lucykuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVMaWtlIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuLyoqIFByb3BlcnR5IGtleXMgb2YgYFRgIHdob3NlIHZhbHVlcyBhcmUgbm90IGNhbGxhYmxlLiAqL1xuZXhwb3J0IHR5cGUgTm9uRnVuY3Rpb25LZXlzPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcblxuLyoqXG4gKiBOYXJyb3cgYHZhbHVlYCB0byBhIHBsYWluIChub24tYXJyYXkpIG9iamVjdC4gVXNlIGFzIGEgdHlwZSBndWFyZFxuICogYmVmb3JlIGluZGV4aW5nIGludG8gLyBtdXRhdGluZyBwYXJzZWQgSlNPTiBzbyB0aGUgYWNjZXNzIGlzXG4gKiB0eXBlLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc1JlY29yZChwYXJzZWQpKSBwYXJzZWQuZm9vID0gMTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLyoqIEEgSlNPTiBzY2FsYXIuIGB1bmRlZmluZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQgLSBgSlNPTi5zdHJpbmdpZnlgIGRyb3BzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlUHJpbWl0aXZlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG5cbi8qKlxuICogQW55IHZhbHVlIHRoYXQgc3Vydml2ZXMgYSBgSlNPTi5zdHJpbmdpZnlgL2BKU09OLnBhcnNlYCByb3VuZCB0cmlwIHVuY2hhbmdlZC5cbiAqXG4gKiBVc2UgaXQgaW5zdGVhZCBvZiBgdW5rbm93bmAgb24gYSBib3VuZGFyeSB0aGF0IHdpbGwgc2VyaWFsaXplIGl0cyBpbnB1dCAtIGFcbiAqIG1lc3NhZ2UgcGF5bG9hZCwgYSBjYWNoZSBlbnRyeSwgYSBjb25maWcgYmxvYiB3cml0dGVuIHRvIGRpc2sgLSBzbyBhIGBEYXRlYCxcbiAqIGEgYE1hcGAsIG9yIGEgY2xhc3MgaW5zdGFuY2UgaXMgYSBjb21waWxlIGVycm9yIGF0IHRoZSBjYWxsIHNpdGUgcmF0aGVyIHRoYW4gYVxuICogcmVjZWl2ZXIgcXVpZXRseSBnZXR0aW5nIGEgc3RyaW5nIG9yIGB7fWAuIHtAbGluayBpc1NlcmlhbGl6YWJsZVZhbHVlfSBpcyB0aGVcbiAqIHJ1bnRpbWUgaGFsZiwgZm9yIGlucHV0IHRoZSBjb21waWxlciBjYW5ub3Qgdm91Y2ggZm9yLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVWYWx1ZSA9XG4gIFNlcmlhbGl6YWJsZVByaW1pdGl2ZSB8IFNlcmlhbGl6YWJsZVZhbHVlW10gfCB7IFtrZXk6IHN0cmluZ106IFNlcmlhbGl6YWJsZVZhbHVlIH07XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGB2YWx1ZWAgc3Vydml2ZXMgYSBKU09OIHJvdW5kIHRyaXAgd2l0aCBubyBsb3NzIGFuZCBubyBjb2VyY2lvbi5cbiAqXG4gKiBTdHJpY3RlciB0aGFuIFwiYEpTT04uc3RyaW5naWZ5YCBkaWQgbm90IHRocm93XCIsIGJlY2F1c2UgdGhhdCBzdWNjZWVkcyB3aGlsZVxuICogc2lsZW50bHkgQ0hBTkdJTkcgdGhlIHZhbHVlOiBhIGBEYXRlYCBiZWNvbWVzIGEgc3RyaW5nLCBgTmFOYCBhbmQgYEluZmluaXR5YFxuICogYmVjb21lIGBudWxsYCwgYSBgTWFwYCBiZWNvbWVzIGB7fWAsIGFuZCBgdW5kZWZpbmVkYCBkaXNhcHBlYXJzIGZyb20gYW4gb2JqZWN0XG4gKiBvciB0dXJucyBpbnRvIGBudWxsYCBpbnNpZGUgYW4gYXJyYXkuIEVhY2ggb2YgdGhvc2UgcmVhY2hlcyB0aGUgZmFyIHNpZGUgYXNcbiAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoYXQgd2FzIHNlbnQsIHNvIGFsbCBvZiB0aGVtIGFyZSByZWplY3RlZCBoZXJlLlxuICpcbiAqIFJlamVjdGVkOiBub24tZmluaXRlIG51bWJlcnMsIGB1bmRlZmluZWRgLCBmdW5jdGlvbnMsIHN5bWJvbHMsIGJpZ2ludHMsIGNsYXNzXG4gKiBpbnN0YW5jZXMgYW5kIGFueXRoaW5nIGVsc2Ugd2l0aCBhIHByb3RvdHlwZSBvdGhlciB0aGFuIGBPYmplY3QucHJvdG90eXBlYCBvclxuICogYG51bGxgIChgRGF0ZWAsIGBNYXBgLCBgU2V0YCwgYFJlZ0V4cGAsIGBCdWZmZXJgKSwgYW5kIGFueSBvYmplY3QgZ3JhcGhcbiAqIGNvbnRhaW5pbmcgYSBjeWNsZS4gQWNjZXB0ZWQ6IHN0cmluZ3MsIGJvb2xlYW5zLCBgbnVsbGAsIGZpbml0ZSBudW1iZXJzLCBwbGFpblxuICogb2JqZWN0cywgYXJyYXlzLCBhbmQgbmVzdGluZ3Mgb2YgdGhvc2UuXG4gKlxuICogTmFycm93cyB0byB7QGxpbmsgU2VyaWFsaXphYmxlVmFsdWV9IHJhdGhlciB0aGFuIGFzc2VydGluZywgc28gaXQgYWxzbyBzZXJ2ZXNcbiAqIGFzIHRoZSB2YWxpZGF0b3IgZm9yIHVudHJ1c3RlZCBpbnB1dCAtIGEgcmVxdWVzdCBib2R5LCBhIGRlY29kZWQgbm90aWZpY2F0aW9uXG4gKiBwYXlsb2FkIC0gd2hlcmUgdGhlIGFuc3dlciBzaG91bGQgYmUgYSA0MDAgYW5kIG5vdCBhIHRocm93LiBOZXZlciB0aHJvd3MuXG4gKlxuICogRGlzdGluY3QgZnJvbSB7QGxpbmsgZGVlcEVxdWFsfSdzIG5vdGlvbiBvZiBjb21wYXJhYmxlOiB0aGF0IG9uZSBIQU5ETEVTXG4gKiBgRGF0ZWAvYE1hcGAvYFNldGAgc3RydWN0dXJhbGx5LCB3aGlsZSB0aGlzIG9uZSByZWplY3RzIHRoZW0gcHJlY2lzZWx5IGJlY2F1c2VcbiAqIEpTT04gY2Fubm90IGNhcnJ5IHRoZW0uXG4gKlxuICogQHBhcmFtIGFuY2VzdG9ycyBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpc1NlcmlhbGl6YWJsZVZhbHVlKHsgYTogWzEsIFwieFwiLCBudWxsXSB9KTsgLy8gdHJ1ZVxuICogaXNTZXJpYWxpemFibGVWYWx1ZSh7IGF0OiBuZXcgRGF0ZSgpIH0pOyAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBhIHN0cmluZ1xuICogaXNTZXJpYWxpemFibGVWYWx1ZShOdW1iZXIuTmFOKTsgICAgICAgICAgICAvLyBmYWxzZSAtIHdvdWxkIGJlY29tZSBudWxsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcmlhbGl6YWJsZVZhbHVlKFxuICB2YWx1ZTogdW5rbm93bixcbiAgYW5jZXN0b3JzOiBTZXQ8b2JqZWN0PiA9IG5ldyBTZXQoKSxcbik6IHZhbHVlIGlzIFNlcmlhbGl6YWJsZVZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBwcm90b3R5cGUgIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgaWYgKGFuY2VzdG9ycy5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICA/IHZhbHVlLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSlcbiAgICA6IE9iamVjdC52YWx1ZXModmFsdWUpLmV2ZXJ5KChlbnRyeSkgPT4gaXNTZXJpYWxpemFibGVWYWx1ZShlbnRyeSwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIHN0cmluZyBmb3IgYSBzdHJ1Y3R1cmVkIHZhbHVlLCBmb3IgZGVyaXZpbmcgYSBTVEFCTEUgSURFTlRJVFkgZnJvbVxuICogaXQgLSBhbiBhZHZpc29yeS1sb2NrIGlkLCBhIGNoYW5uZWwgbmFtZSwgYSBjYWNoZSBrZXkuXG4gKlxuICogVGhlIGd1YXJhbnRlZSBpcyB0d28td2F5LCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHNhZmUgdG8gaGFzaDogdmFsdWVzIHRoYXRcbiAqIHNob3VsZCBzaGFyZSBhbiBpZGVudGl0eSBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZyAob2JqZWN0IGtleSBvcmRlciBkb2VzIG5vdFxuICogbWF0dGVyKSwgYW5kIHZhbHVlcyB0aGF0IHNob3VsZCBub3QgYXJlIG5ldmVyIGNvbmZsYXRlZC4gRXZlcnkgdG9rZW4gY2Fycmllc1xuICogaXRzIHR5cGUsIHNvIGAxYCBhbmQgYFwiMVwiYCBkaWZmZXI7IGEgc3RyaW5nIGNhcnJpZXMgaXRzIGxlbmd0aCwgc29cbiAqIGBbXCJhXCIsIFwiYmNcIl1gIGFuZCBgW1wiYWJcIiwgXCJjXCJdYCBkaWZmZXI7IGFycmF5cyBrZWVwIG9yZGVyIHdoaWxlIG9iamVjdCBrZXlzXG4gKiBhcmUgc29ydGVkLlxuICpcbiAqIGBKU09OLnN0cmluZ2lmeWAgY2Fubm90IGRvIHRoaXMgam9iIC0ga2V5IG9yZGVyIGxlYWtzIGluLCBgdW5kZWZpbmVkYCB2YW5pc2hlcyxcbiAqIGAxYCBhbmQgYFwiMVwiYCBjb2xsaWRlIGFmdGVyIHF1b3RpbmcgaXMgc3RyaXBwZWQsIGFuZCBhIGN5Y2xlIHRocm93cyBhXG4gKiBgVHlwZUVycm9yYCBuYW1pbmcgbmVpdGhlciB0aGUgdmFsdWUgbm9yIHRoZSBjYWxsZXIncyBpbnRlbnQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IHN0cmljdCB3aGVyZSBhIHNpbGVudCBhbnN3ZXIgd291bGQgYmUgYSBXUk9ORyBpZGVudGl0eSByYXRoZXJcbiAqIHRoYW4gYSBtaXNzaW5nIG9uZSwgc2luY2UgdHdvIGNhbGxlcnMgZGlzYWdyZWVpbmcgYWJvdXQgYSBsb2NrIG9yIGEgY2hhbm5lbCBpc1xuICogaW52aXNpYmxlIHVudGlsIGl0IGNvcnJ1cHRzIHNvbWV0aGluZy4gVGhyb3dzIGBUeXBlRXJyb3JgIG9uIGEgY3ljbGUsIG9uIGFcbiAqIG5vbi1maW5pdGUgbnVtYmVyIChgTmFOYCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLCBzbyBpdCBjYW5ub3QgaGF2ZSBhIHN0YWJsZVxuICogaWRlbnRpdHkpLCBhbmQgb24gYSBgZnVuY3Rpb25gIG9yIGBzeW1ib2xgIChubyBtZWFuaW5nZnVsIHZhbHVlIGlkZW50aXR5KS5cbiAqIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgYXJlIGFjY2VwdGVkIGFzIGRpc3RpbmN0IHRva2Vucy5cbiAqXG4gKiBgRGF0ZWAgaXMgY2Fub25pY2FsaXplZCBieSBpbnN0YW50LCB1bmxpa2UgdGhlIGhhc2ggY2Fub25pY2FsaXplciBpblxuICogYC4vaGFzaC50c2AsIHdoaWNoIGZvbGRzIGV2ZXJ5IGBEYXRlYCBvbnRvIG9uZSB0b2tlbi4gUHJlZmVyIHRoaXMgZnVuY3Rpb24gd2hlblxuICogZGlzdGluY3RuZXNzIGlzIGEgY29ycmVjdG5lc3MgcmVxdWlyZW1lbnQ7IHByZWZlciBgaGFzaC5mbnZIYXNoYCB3aGVuIGEgc2hvcnQsXG4gKiBjb2xsaXNpb24tdG9sZXJhbnQgZGlnZXN0IGlzIGVub3VnaC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2Fub25pY2FsaXplLlxuICogQHBhcmFtIHNlZW4gLSBDeWNsZS1kZXRlY3Rpb24gc2V0IGZvciB0aGUgcmVjdXJzaXZlIHdhbGsuIEludGVybmFsOyBjYWxsZXJzXG4gKiAgIHBhc3Mgb25lIHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b1N0YWJsZUtleSh7IGE6IDEsIGI6IDIgfSkgPT09IHRvU3RhYmxlS2V5KHsgYjogMiwgYTogMSB9KTsgLy8gdHJ1ZVxuICogdG9TdGFibGVLZXkoMSkgIT09IHRvU3RhYmxlS2V5KFwiMVwiKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdGFibGVLZXkodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+ID0gbmV3IFNldCgpKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJudWxsXCI7XG5cbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAvLyBMZW5ndGgtcHJlZml4ZWQgc28gY29uY2F0ZW5hdGVkIG5laWdoYm91cnMgY2Fubm90IGJlIHJlLXNwbGl0XG4gICAgICAvLyBkaWZmZXJlbnRseTogYFtcImFcIixcImJjXCJdYCBhbmQgYFtcImFiXCIsXCJjXCJdYCBtdXN0IG5vdCBhZ3JlZS5cbiAgICAgIHJldHVybiBgc3RyaW5nOiR7dmFsdWUubGVuZ3RofToke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBgYm9vbGVhbjoke3ZhbHVlfWA7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIGBiaWdpbnQ6JHt2YWx1ZX1gO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YWJsZSBrZXlzIHJlcXVpcmUgZmluaXRlIG51bWJlcnNcIik7XG4gICAgICAvLyBgLTAgPT09IDBgIGJ1dCB0aGV5IHN0cmluZ2lmeSBkaWZmZXJlbnRseSwgc28gcGljayBvbmUgc3BlbGxpbmcuXG4gICAgICByZXR1cm4gYG51bWJlcjoke09iamVjdC5pcyh2YWx1ZSwgLTApID8gXCItMFwiIDogdmFsdWV9YDtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdGFibGUga2V5cyBjYW5ub3QgY29udGFpbiBjeWNsZXNcIik7XG4gICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gYGRhdGU6JHt2YWx1ZS50b0lTT1N0cmluZygpfWA7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgYXJyYXk6WyR7dmFsdWUubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSkuam9pbihcIixcIil9XWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgLy8gU29ydGVkIGJ5IGNhbm9uaWNhbCBmb3JtLCBzbyBpbnNlcnRpb24gb3JkZXIgZG9lcyBub3QgbGVhay5cbiAgICAgICAgICByZXR1cm4gYHNldDpbJHtbLi4udmFsdWVdXG4gICAgICAgICAgICAubWFwKChpdGVtKSA9PiB0b1N0YWJsZUtleShpdGVtLCBzZWVuKSlcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5qb2luKFwiLFwiKX1dYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyaWVzOiBJdGVyYWJsZTxbdW5rbm93biwgdW5rbm93bl0+ID1cbiAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IHZhbHVlIDogT2JqZWN0LmVudHJpZXModmFsdWUpO1xuICAgICAgICByZXR1cm4gYCR7dmFsdWUgaW5zdGFuY2VvZiBNYXAgPyBcIm1hcFwiIDogXCJvYmplY3RcIn06eyR7Wy4uLmVudHJpZXNdXG4gICAgICAgICAgLm1hcCgoW2tleSwgaXRlbV0pID0+IGAke3RvU3RhYmxlS2V5KGtleSwgc2Vlbil9PSR7dG9TdGFibGVLZXkoaXRlbSwgc2Vlbil9YClcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgLmpvaW4oXCIsXCIpfX1gO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vlbi5kZWxldGUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5zdXBwb3J0ZWQgc3RhYmxlIGtleSB0eXBlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIGB7IFtrZXldOiB2YWx1ZSB9YCB3aGVuIGB2YWx1ZWAgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgIC0gc28gYW5cbiAqIGFic2VudCBvcHRpb25hbCBmaWVsZCBzdGF5cyBBQlNFTlQgd2hlbiBzcHJlYWQsIHJhdGhlciB0aGFuIGJlY29taW5nIGFuXG4gKiBleHBsaWNpdCBgdW5kZWZpbmVkYCB0aGF0IGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlc2AgcmVqZWN0cy5cbiAqXG4gKiBTcGVsbGluZyB0aGF0IGlubGluZSBjb3N0cyBhIHJlcGVhdGVkLCBkb3VibGUtZXZhbHVhdGVkIHRlcm5hcnkgcGVyIGZpZWxkXG4gKiAoYC4uLih2ID8geyBrZXk6IHYgfSA6IHt9KWApLCB3aGljaCBpcyBob3cgY29uZmlnIHJlc29sdmVycyBlbmQgdXAgY29tcHV0aW5nXG4gKiB0aGUgc2FtZSB2YWx1ZSB0d2ljZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogcmV0dXJuIHtcbiAqICAgLi4ub3B0aW9uYWwoXCJhcHBJZFwiLCBjb25maWd1cmVkQXBwSWQpLFxuICogICAuLi5vcHRpb25hbChcImVuZHBvaW50XCIsIGNvbmZpZy5lbmRwb2ludCksXG4gKiB9O1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWw8SyBleHRlbmRzIHN0cmluZywgVj4oXG4gIGtleTogSyxcbiAgdmFsdWU6IFYgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPEssIFY+IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiAoeyBba2V5XTogdmFsdWUgfSBhcyBSZWNvcmQ8SywgVj4pO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b051bWJlcn0uXG4gKlxuICogQm90aCBzd2l0Y2hlcyB0dXJuIE9GRiBhIGxlbmllbmN5IHRoYXQgaXMgaGVscGZ1bCBmb3IgYSBoYW5kLXR5cGVkIHNldHRpbmcgYnV0XG4gKiB3cm9uZyB3aGVuIHRoZSBzdHJpbmcncyBvdGhlciBjaGFyYWN0ZXJzIGNhcnJ5IG1lYW5pbmcuIHtAbGluayB0b0RhdGV9IGFuZFxuICoge0BsaW5rIHRvRHVyYXRpb259IGRpc2FibGUgYm90aCwgc2luY2UgYSBzcGFjZSBpbnNpZGUgYDIwMjYgMDggMDJgIGlzIGEgZmllbGRcbiAqIHNlcGFyYXRvciBhbmQgYSBwZXJjZW50IGhhcyBubyBlcG9jaCBvciBtaWxsaXNlY29uZCByZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvTnVtYmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGludGVybmFsIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgYXJlIHN0cmlwcGVkLCBzbyBgXCIxLDAwMFwiYCBhbmRcbiAgICogYFwiMSAwMDBcImAgcmVhZCBhcyBgMTAwMGAuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogUGxhY2VtZW50IGlzIG5vdCB2YWxpZGF0ZWQgd2hlbiBlbmFibGVkLCBzbyBgXCIxLDAwLDBcImAgYWxzbyByZWFkcyBhcyBgMTAwMGAuXG4gICAqIERpc2FibGUgaXQgd2hlbiB3aGl0ZXNwYWNlIG9yIGEgY29tbWEgZGVsaW1pdHMgRklFTERTIHJhdGhlciB0aGFuIGdyb3VwaW5nXG4gICAqIGRpZ2l0cywgYmVjYXVzZSBzdHJpcHBpbmcgdGhlbSBzaWxlbnRseSBmdXNlcyB0aG9zZSBmaWVsZHMgaW50byBvbmUgbnVtYmVyLlxuICAgKi9cbiAgc2VwYXJhdG9ycz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdHJhaWxpbmcgcGVyY2VudCBzaWduIGRpdmlkZXMgdGhlIHJlc3VsdCBieSBgMTAwYCwgc28gYFwiMjUlXCJgIHJlYWRzXG4gICAqIGFzIGAwLjI1YC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBEaXNhYmxlIGl0IHdoZXJlIGEgcGVyY2VudGFnZSBoYXMgbm8gbWVhbmluZywgc28gYFwiMjUlXCJgIGlzIGEgbWlzcyByYXRoZXJcbiAgICogdGhhbiBhIG51bWJlciB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBhd2F5IGZyb20gd2hhdCB0aGUgdGV4dCBzYXlzLlxuICAgKi9cbiAgcGVyY2VudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgbnVtZXJpYyB2YWx1ZSB0byBhIHJlYWwsIEZJTklURSBgbnVtYmVyYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdFxuICogY2FycmllcyBubyBudW1lcmljIG1lYW5pbmcuXG4gKlxuICogVGhlIG9uZSBwbGFjZSBhIGhhbmQtdHlwZWQgbnVtYmVyIGlzIGludGVycHJldGVkLCBhbG9uZ3NpZGUge0BsaW5rIHRvQm9vbGVhbn0sXG4gKiB7QGxpbmsgdG9EYXRlfSwgYW5kIHtAbGluayB0b0R1cmF0aW9ufS4gUmVhY2ggZm9yIGl0IGluc3RlYWQgb2YgYE51bWJlcih4KWAgb3IgYVxuICogaGFuZC1yb2xsZWQgbnVtZXJpYyByZWdleDogYmFyZSBgTnVtYmVyYCBtYXBzIGBcIlwiYCwgYG51bGxgLCBgW11gLCBhbmRcbiAqIHdoaXRlc3BhY2UgdG8gYDBgIGFuZCBhbnl0aGluZyBlbHNlIHRvIGBOYU5gLCBzbyBhIGNhbGxlciBoYXMgdG8gcmUtY2hlY2sgdGhlXG4gKiByZXN1bHQgZXZlcnkgdGltZSwgYW5kIGFkIGhvYyByZWdleGVzIHRlbmQgdG8gZHJpZnQgaW4gd2hhdCB0aGV5IGFjY2VwdC5cbiAqXG4gKiBBY2NlcHRzOiBhIGZpbml0ZSBgbnVtYmVyYDsgYSBgYmlnaW50YDsgb3IgYSBkZWNpbWFsIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsXG4gKiBsZWFkaW5nIHNpZ24sIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciB0aGUgc2lnbixcbiAqIGRpZ2l0LWdyb3VwIHNlcGFyYXRvcnMgKGBcIjEsMDAwXCJgLCBgXCIxIDAwMFwiYCksIGEgYmFyZSBmcmFjdGlvbiAoYFwiLjVcImApLCBhXG4gKiB0cmFpbGluZyBwb2ludCAoYFwiMS5cImApLCBzY2llbnRpZmljIG5vdGF0aW9uIChgXCIxZTNcImApLCBhbmQgYW4gb3B0aW9uYWxcbiAqIHRyYWlsaW5nIHBlcmNlbnQgc2lnbiAoYFwiMjUlXCJgLCBgXCIxLjUgJVwiYCkuIEEgdHJhaWxpbmcgYCVgIGRpdmlkZXMgdGhlIHBhcnNlZFxuICogdmFsdWUgYnkgYDEwMGAsIHNvIGBcIjI1JVwiYCBiZWNvbWVzIGAwLjI1YC5cbiAqXG4gKiBTZXBhcmF0b3JzIGFyZSBzdHJpcHBlZCB3aXRob3V0IHZhbGlkYXRpbmcgdGhlaXIgcGxhY2VtZW50LCBzbyBgXCIxLDAwLDBcImAgcmVhZHNcbiAqIGFzIGAxMDAwYDsgdGhpcyBpcyBhIGNvZXJjaW9uIGZvciBoYW5kLXR5cGVkIGNvbmZpZ3VyYXRpb24sIG5vdCBhIGxvY2FsZS1hd2FyZVxuICogdmFsaWRhdG9yLiBBbnl0aGluZyBlbHNlLCBpbmNsdWRpbmcgYE5hTmAsIGBJbmZpbml0eWAsIGFuIGVtcHR5IG9yXG4gKiB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nLCBgbnVsbGAsIGB1bmRlZmluZWRgLCBhIGJvb2xlYW4sIG11bHRpcGxlIHNpZ25zLFxuICogbWFsZm9ybWVkIGV4cG9uZW50cywgbWlzcGxhY2VkIHBlcmNlbnQgc2lnbnMsIG9yIGBcIjEycHhcImAsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiB0aHJvd2luZywgbWF0Y2hpbmcgdGhlIG90aGVyIGNvZXJjaW9ucywgc28gaXRcbiAqIGNvbXBvc2VzIG5hdHVyYWxseSB3aXRoIGA/P2AgZmFsbGJhY2tzLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b051bWJlcihcIjEsMDAwXCIpOyAgIC8vIDEwMDBcbiAqIHRvTnVtYmVyKFwiIC0yLjUgXCIpOyAgLy8gLTIuNVxuICogdG9OdW1iZXIoXCIxZTNcIik7ICAgICAvLyAxMDAwXG4gKiB0b051bWJlcihcIjEyLjUgJVwiKTsgIC8vIDAuMTI1XG4gKiB0b051bWJlcihcIlwiKTsgICAgICAgIC8vIHVuZGVmaW5lZCAgKE51bWJlcihcIlwiKSB3b3VsZCBiZSAwKVxuICogdG9OdW1iZXIoXCIxMnB4XCIpOyAgICAvLyB1bmRlZmluZWRcbiAqIHRvTnVtYmVyKFwiMSAwMDBcIiwgeyBzZXBhcmF0b3JzOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcih2YWx1ZTogdW5rbm93biwgb3B0aW9uczogVG9OdW1iZXJPcHRpb25zID0ge30pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcbiAgICByZXR1cm4gdG9OdW1iZXIoTnVtYmVyKHZhbHVlKSwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgLy8gU3RyaXAgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwgd2hpdGVzcGFjZSBhZnRlciBhIGxlYWRpbmcgc2lnbiwgZGlnaXQtZ3JvdXBcbiAgICAvLyBzZXBhcmF0b3JzIChib3RoIGAsYCBhbmQgdGhlIHNwYWNlIGluIGBcIjEgMDAwXCJgKSwgbGVhdmluZyBhIGJhcmUgbnVtZXJhbCBmb3JcbiAgICAvLyB0aGUgc2hhcGUgdGVzdCBiZWxvdyB0byBhY2NlcHQgb3IgcmVqZWN0LlxuICAgIGNvbnN0IHRleHQgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgb3B0aW9ucy5zZXBhcmF0b3JzID09PSBmYWxzZSA/IC8oXlxccyt8XFxzKyQpL2cgOiAvKF5cXHMrfFxccyskfCg/PD1eWystXSlcXHMrfCg/PD1cXGQpXFxzK3wsKS9nLFxuICAgICAgXCJcIixcbiAgICApO1xuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL14oWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSglKT8kL2kpO1xuICAgICAgaWYgKG1hdGNoICYmICEobWF0Y2hbMl0gJiYgb3B0aW9ucy5wZXJjZW50ID09PSBmYWxzZSkpIHtcbiAgICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKG1hdGNoWzFdKTtcbiAgICAgICAgcmV0dXJuIHRvTnVtYmVyKG1hdGNoWzJdID8gbnVtYmVyIC8gMTAwIDogbnVtYmVyLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gQSBib3hlZCBgTnVtYmVyYCwgb3IgYW55dGhpbmcgd2l0aCBhIG51bWVyaWMgYHRvU3RyaW5nYC4gYFN0cmluZyh2YWx1ZSlgXG4gICAgLy8gcm91dGVzIGl0IGJhY2sgdGhyb3VnaCB0aGUgc3RyaW5nIGJyYW5jaCwgd2hpY2ggcmVqZWN0cyB3aGF0IGlzIG5vdCBudW1lcmljLlxuICAgIHJldHVybiB0b051bWJlcihTdHJpbmcodmFsdWUpLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGJvb2xlYW4taXNoIHZhbHVlIHRvIGEgcmVhbCBgYm9vbGVhbmAsIG9yIGB1bmRlZmluZWRgXG4gKiB3aGVuIGl0IGNhbid0IGJlIGludGVycHJldGVkLiBSZWNvZ25pemVzIGB0cnVlYC9gdGAvYG9uYC9gMWAvYHllc2AvYHlgXG4gKiBhbmQgdGhlaXIgbmVnYXRpdmVzIChjYXNlLSBhbmQgd2hpdGVzcGFjZS1pbnNlbnNpdGl2ZSBmb3Igc3RyaW5ncyksIGFzXG4gKiB3ZWxsIGFzIHRoZSBudW1iZXJzIGAxYCBhbmQgYDBgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09IFwidHJ1ZVwiIHx8XG4gICAgICB2YWx1ZSA9PSBcInRcIiB8fFxuICAgICAgdmFsdWUgPT09IFwib25cIiB8fFxuICAgICAgdmFsdWUgPT09IFwiMVwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCJ5ZXNcIiB8fFxuICAgICAgdmFsdWUgPT09IFwieVwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdmFsdWUgPT09IFwiZmFsc2VcIiB8fFxuICAgICAgdmFsdWUgPT0gXCJmXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm9mZlwiIHx8XG4gICAgICB2YWx1ZSA9PT0gXCIwXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5vXCIgfHxcbiAgICAgIHZhbHVlID09PSBcIm5cIlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlO1xuICAgIGVsc2UgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMYXJnZXN0IHZhbHVlIHJlYWQgYXMgZXBvY2ggU0VDT05EUyByYXRoZXIgdGhhbiBtaWxsaXNlY29uZHMuXG4gKlxuICogYDFlMTFgIHNlY29uZHMgaXMgdGhlIHllYXIgNTEzOCBhbmQgYDFlMTFgIG1zIGlzIDE5NzMtMDMtMDMsIHNvIGV2ZXJ5IHZhbHVlIGFcbiAqIGNhbGxlciByZWFsaXN0aWNhbGx5IG1lYW5zIGFzIG1pbGxpcyBpcyBhYm92ZSB0aGUgbGluZSBhbmQgZXZlcnkgdmFsdWUgdGhleVxuICogbWVhbiBhcyBzZWNvbmRzIGlzIGJlbG93IGl0LiBUaGUgYW1iaWd1aXR5IGlzIHVuYXZvaWRhYmxlIC0gdGhlIHR3byB1bml0cyBzaGFyZVxuICogYSBudW1iZXIgbGluZSAtIHNvIHRoZSBzcGxpdCBpcyBwbGFjZWQgd2hlcmUgbmVpdGhlciBzaWRlIGhhcyBhIHBsYXVzaWJsZVxuICogY2xhaW0uXG4gKi9cbmNvbnN0IFNFQ09ORFNfQ0VJTElORyA9IDFlMTE7XG5cbi8qKlxuICogQSBudW1iZXIgZm9yIHtAbGluayB0b0RhdGV9IGFuZCB7QGxpbmsgdG9EdXJhdGlvbn0sIHJlYWQgd2l0aCBub25lIG9mXG4gKiB7QGxpbmsgdG9OdW1iZXJ9J3Mgc3RyaW5nIGxlbmllbmNpZXMuXG4gKlxuICogQm90aCBsZW5pZW5jaWVzIGFyZSBhY3RpdmVseSBoYXJtZnVsIGhlcmUuIEEgc3BhY2Ugb3IgY29tbWEgc2VwYXJhdGVzIEZJRUxEUyBpblxuICogYSBkYXRlIChgMjAyNiAwOCAwMmAgd291bGQgZnVzZSBpbnRvIHRoZSBlcG9jaCBgMjAyNjA4MDJgKSwgYW5kIGEgcGVyY2VudGFnZSBoYXNcbiAqIG5vIHJlYWRpbmcgYXMgYW4gaW5zdGFudCBvciBhIGxlbmd0aCBvZiB0aW1lLCBzbyBgMjUlYCBtdXN0IGJlIGEgbWlzcyByYXRoZXJcbiAqIHRoYW4gYDI1MG1zYC5cbiAqL1xuZnVuY3Rpb24gdG9CYXJlTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRvTnVtYmVyKHZhbHVlLCB7IHNlcGFyYXRvcnM6IGZhbHNlLCBwZXJjZW50OiBmYWxzZSB9KTtcbn1cblxuLyoqXG4gKiBNaWxsaXNlY29uZHMgcGVyIHVuaXQsIGtleWVkIGJ5IFNJTkdVTEFSIGFsaWFzLiB7QGxpbmsgdG9EdXJhdGlvbn0gcmV0cmllcyBhXG4gKiBsb29rdXAgd2l0aG91dCBhIHRyYWlsaW5nIGBzYCwgc28gZXZlcnkgcGx1cmFsIHNwZWxsaW5nIGlzIGNvdmVyZWQgd2l0aG91dFxuICogbGlzdGluZyBpdCAoYG1zYCBpcyBhbHJlYWR5IHNpbmd1bGFyLCBoZW5jZSBpdHMgb3duIGVudHJ5KS5cbiAqXG4gKiBgbWAgaXMgTUlOVVRFUyBhbmQgbW9udGhzIG5lZWQgYG1vYCwgZm9sbG93aW5nIHRoZSBuZWFyLXVuaXZlcnNhbCBjb252ZW50aW9uXG4gKiAoYG1zYCwgYGRhdGVgLCBjcm9uIHByb3NlKTsgbW9udGggYW5kIHllYXIgYXJlIGNhbGVuZGFyIGFwcHJveGltYXRpb25zICgzMCAvXG4gKiAzNjUgZGF5cykgYmVjYXVzZSBhIGR1cmF0aW9uIGhhcyBubyBhbmNob3IgZGF0ZSB0byBiZSBleGFjdCBhZ2FpbnN0LlxuICovXG5jb25zdCBEVVJBVElPTl9VTklUUzogUmVhZG9ubHlBcnJheTxyZWFkb25seSBbbXM6IG51bWJlciwgYWxpYXNlczogcmVhZG9ubHkgc3RyaW5nW11dPiA9IFtcbiAgWzEsIFtcIm1zXCIsIFwibXNlY1wiLCBcIm1pbGxpc2Vjb25kXCIsIFwibWlsbGlcIl1dLFxuICBbMTAwMCwgW1wic1wiLCBcInNlY1wiLCBcInNlY29uZFwiXV0sXG4gIFs2MF8wMDAsIFtcIm1cIiwgXCJtaW5cIiwgXCJtaW51dGVcIl1dLFxuICBbM182MDBfMDAwLCBbXCJoXCIsIFwiaHJcIiwgXCJob3VyXCJdXSxcbiAgWzg2XzQwMF8wMDAsIFtcImRcIiwgXCJkYXlcIl1dLFxuICBbNjA0XzgwMF8wMDAsIFtcIndcIiwgXCJ3a1wiLCBcIndlZWtcIl1dLFxuICBbMl81OTJfMDAwXzAwMCwgW1wibW9cIiwgXCJtb25cIiwgXCJtb250aFwiXV0sXG4gIFszMV81MzZfMDAwXzAwMCwgW1wieVwiLCBcInlyXCIsIFwieWVhclwiXV0sXG5dO1xuXG5jb25zdCBEVVJBVElPTl9VTklUX01TOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKFxuICBEVVJBVElPTl9VTklUUy5mbGF0TWFwKChbbXMsIGFsaWFzZXNdKSA9PiBhbGlhc2VzLm1hcCgoYWxpYXMpID0+IFthbGlhcywgbXNdIGFzIGNvbnN0KSksXG4pO1xuXG4vKiogT25lIGA8YW1vdW50Pjx1bml0PmAgdGVybSBpbnNpZGUgYSBkdXJhdGlvbiBzdHJpbmcuICovXG5jb25zdCBEVVJBVElPTl9URVJNID0gLyhbKy1dPykoXFxkKyg/OlxcLlxcZCspPylcXHMqKFthLXpdKykvZztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdG9EYXRlfS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0R1cmF0aW9uT3B0aW9uc306IGVhY2ggZnVuY3Rpb24gY2FuIGZhbGwgYmFjayB0byB0aGVcbiAqIG90aGVyLCBzbyBlYWNoIGhhcyBvbmUgc3dpdGNoIHR1cm5pbmcgdGhhdCBmYWxsYmFjayBvZmYuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9EYXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24gaXMgcmVhZCBhcyBhbiBpbnN0YW50IHJlbGF0aXZlIHRvXG4gICAqIG5vdywgc28gYC03ZGAgYW5kIGA3IGRheXMgYWdvYCBiZWNvbWUgYG5vdyAtIDcgZGF5c2AuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogU2V0IGBmYWxzZWAgd2hlbiB0aGUgdmFsdWUgbXVzdCBiZSBhIHJlYWwgZGF0ZSBhbmQgYSByZWxhdGl2ZSBleHByZXNzaW9uXG4gICAqIHNob3VsZCBiZSBhIG1pc3MgLSBhIHN0b3JlZCB0aW1lc3RhbXAsIGEgdXNlci1zdXBwbGllZCBgRGF0ZWAgaGVhZGVyLCBhblxuICAgKiBgZXhwaXJlc19hdGAgZmllbGQgLSBzaW5jZSBhIGR1cmF0aW9uIHNpbGVudGx5IHJlc29sdmluZyBhZ2FpbnN0IHRoZSBjdXJyZW50XG4gICAqIGNsb2NrIG1ha2VzIHRoZSBzYW1lIGlucHV0IG1lYW4gc29tZXRoaW5nIGRpZmZlcmVudCBvbiBldmVyeSBjYWxsLiBBbHNvIHdoYXRcbiAgICoge0BsaW5rIHRvRHVyYXRpb259IHBhc3NlcyB3aGVuIGl0IHJlY3Vyc2VzLCBzbyB0aGUgdHdvIGNhbm5vdCBib3VuY2UgYSB2YWx1ZVxuICAgKiBiZXR3ZWVuIHRoZW0gZm9yZXZlci5cbiAgICovXG4gIHBhcnNlRHVyYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB0b0R1cmF0aW9ufS5cbiAqXG4gKiBUaGUgbWlycm9yIG9mIHtAbGluayBUb0RhdGVPcHRpb25zfTogZWFjaCBmdW5jdGlvbiBjYW4gZmFsbCBiYWNrIHRvIHRoZSBvdGhlcixcbiAqIHNvIGVhY2ggaGFzIG9uZSBzd2l0Y2ggdHVybmluZyB0aGF0IGZhbGxiYWNrIG9mZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb0R1cmF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEge0BsaW5rIHRvRGF0ZX0gdmFsdWUgaXMgcmVhZCBhcyB0aGUgc2lnbmVkIG9mZnNldCBmcm9tIG5vdywgc29cbiAgICogYDIwMjYtMDgtMDJgIGJlY29tZXMgaG93ZXZlciBsb25nIHVudGlsIChvciBzaW5jZSkgdGhhdCBpbnN0YW50LiBEZWZhdWx0cyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqXG4gICAqIFNldCBgZmFsc2VgIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIGlzIG1lYW5pbmdmdWwgLSBhIHRpbWVvdXQsIGEgcG9sbFxuICAgKiBpbnRlcnZhbCwgYSBjYWNoZSBUVEwgLSBiZWNhdXNlIGEgZGF0ZSB3b3VsZCBvdGhlcndpc2UgeWllbGQgYSBwbGF1c2libGUgYnV0XG4gICAqIHdyb25nIG51bWJlciB0aGF0IGFsc28gZHJpZnRzIHdpdGggdGhlIGNsb2NrLiBBbHNvIHdoYXQge0BsaW5rIHRvRGF0ZX0gcGFzc2VzXG4gICAqIHdoZW4gaXQgcmVjdXJzZXMuXG4gICAqL1xuICBwYXJzZURhdGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvZXJjZSBhIGxvb3NlIGR1cmF0aW9uIHRvIE1JTExJU0VDT05EUywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGxlbmllbnQsIGJlY2F1c2UgdGhlc2UgdmFsdWVzIGFyZSB0eXBlZCBieSBoYW5kIGludG8gZW52IHZhcnMsXG4gKiBDTEkgZmxhZ3MsIGFuZCBjb25maWcgZmlsZXM6IHdoaXRlc3BhY2UgYmV0d2VlbiBhbW91bnQgYW5kIHVuaXQgaXMgb3B0aW9uYWwgYW5kXG4gKiB1bmxpbWl0ZWQsIHVuaXRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBwbHVyYWxzIGFuZCB0aGUgY29tbW9uIGFiYnJldmlhdGlvbnMgYXJlXG4gKiBlcXVpdmFsZW50IChgMm1zYCA9PT0gYDIgbWlsbGlzZWNvbmRzYCwgYDFoYCA9PT0gYDEgaHJgID09PSBgMSBIb3VyYCksIGBhbmRgIGFuZFxuICogdGhvdXNhbmRzIHNlcGFyYXRvcnMgYXJlIGlnbm9yZWQgKGAxLDUwMCBtc2AsIGAxIGhvdXIgYW5kIDMwIG1pbnV0ZXNgKSwgYW5kXG4gKiB0ZXJtcyBjb21wb3NlIChgMWgzMG1gKS4gQSBwbGFpbiBgbnVtYmVyYCBwYXNzZXMgdGhyb3VnaCBhcyBtaWxsaXNlY29uZHMuXG4gKlxuICogU2lnbnMgYXJlIHN1cHBvcnRlZCBzbyBhIGR1cmF0aW9uIGNhbiBleHByZXNzIGFuIE9GRlNFVCByYXRoZXIgdGhhbiBvbmx5IGFcbiAqIGxlbmd0aDogYSBsZWFkaW5nIGAtYCAob3IgYSB0cmFpbGluZyBgYWdvYCkgbWFrZXMgdGhlIHJlc3VsdCBuZWdhdGl2ZSwgYW5kIGFuXG4gKiB1bnNpZ25lZCB0ZXJtIGluaGVyaXRzIHRoZSBwcmV2aW91cyB0ZXJtJ3Mgc2lnbiwgc28gYC0xaDMwbWAgaXMgLTkwIG1pbnV0ZXNcbiAqIHJhdGhlciB0aGFuIC02MCArIDMwLiB7QGxpbmsgdG9EYXRlfSB1c2VzIHRoYXQgdG8gdHVybiBgLTdkYCAvIGA3IGRheXMgYWdvYFxuICogaW50byBhbiBpbnN0YW50IHJlbGF0aXZlIHRvIG5vdy5cbiAqXG4gKiBBbiBVTktOT1dOIHVuaXQgZmFpbHMgdGhlIHdob2xlIHBhcnNlIHJhdGhlciB0aGFuIGJlaW5nIHNraXBwZWQgLSBgMSBmb3J0bmlnaHRgXG4gKiByZXR1cm5pbmcgYDFgIHNpbGVudGx5IHdvdWxkIGJlIHdvcnNlIHRoYW4gcmV0dXJuaW5nIG5vdGhpbmcgLSB3aGljaCBpcyBhbHNvXG4gKiB3aGF0IGtlZXBzIHtAbGluayB0b0RhdGV9IGZyb20gbWlzdGFraW5nIGAxIEphbiAyMDI2YCBmb3IgYSBkdXJhdGlvbi5cbiAqXG4gKiBBIHZhbHVlIHRoYXQgaXMgbm90IGEgZHVyYXRpb24gYXQgYWxsIGlzIG9mZmVyZWQgdG8ge0BsaW5rIHRvRGF0ZX0gYW5kLCB3aGVuIGl0XG4gKiBJUyBhIGRhdGUsIHJlYWQgYXMgdGhlIHNpZ25lZCBvZmZzZXQgZnJvbSBub3cgKGBkYXRlIC0gbm93YCksIHdoaWNoIG1ha2VzIHRoZVxuICogdHdvIGZ1bmN0aW9ucyBpbnZlcnNlczogYSBwYXN0IGluc3RhbnQgaXMgbmVnYXRpdmUsIGEgZnV0dXJlIG9uZSBwb3NpdGl2ZS5cbiAqIGBvcHRpb25zLnBhcnNlRGF0ZTogZmFsc2VgIHR1cm5zIHRoYXQgb2ZmIHdoZW4gb25seSBhIGxlbmd0aCBvZiB0aW1lIG1ha2VzXG4gKiBzZW5zZSAtIHNlZSB7QGxpbmsgVG9EdXJhdGlvbk9wdGlvbnN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0R1cmF0aW9uKFwiMzBzXCIpOyAgICAgICAgICAgICAgICAgICAgLy8gMzBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMSBob3VyIDMwIG1pbnV0ZXNcIik7ICAgICAgLy8gNV80MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiLTcgZGF5c1wiKTsgICAgICAgICAgICAgICAgLy8gLTYwNF84MDBfMDAwXG4gKiB0b0R1cmF0aW9uKFwiMiB3ZWVrcyBhZ29cIik7ICAgICAgICAgICAgLy8gLTFfMjA5XzYwMF8wMDBcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgICAgICAvLyBtcyBmcm9tIG5vdyB0byB0aGF0IGluc3RhbnRcbiAqIHRvRHVyYXRpb24oXCIyMDI2LTA4LTAyXCIsIHsgcGFyc2VEYXRlOiBmYWxzZSB9KTsgLy8gdW5kZWZpbmVkXG4gKiB0b0R1cmF0aW9uKFwic29vblwiKTsgICAgICAgICAgICAgICAgICAgLy8gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0R1cmF0aW9uKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0R1cmF0aW9uT3B0aW9ucyA9IHt9KTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgLy8gQSBiYXJlIG51bWJlciBpcyBhbHJlYWR5IG1pbGxpc2Vjb25kcywgdGhlIHNhbWUgcmVhZGluZyBgdG9EYXRlYCBnaXZlcyBhblxuICAvLyBlcG9jaCB2YWx1ZSwgc28gdGhpcyBtdXN0IHJ1biBiZWZvcmUgYW55IGRhdGUgaW50ZXJwcmV0YXRpb24uXG4gIGNvbnN0IG51bSA9IHRvQmFyZU51bWJlcih2YWx1ZSk7XG4gIGlmIChudW0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBvcHRpb25zLnBhcnNlRGF0ZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBkYXRlQXNEdXJhdGlvbih2YWx1ZSk7XG4gIH1cbiAgbGV0IHRleHQgPSB2YWx1ZVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2VBbGwoL1ssX10vZywgXCJcIilcbiAgICAucmVwbGFjZUFsbCgvXFxiYW5kXFxiL2csIFwiIFwiKVxuICAgIC50cmltKCk7XG4gIGxldCBuZWdhdGUgPSBmYWxzZTtcbiAgaWYgKHRleHQuZW5kc1dpdGgoXCJhZ29cIikpIHtcbiAgICBuZWdhdGUgPSB0cnVlO1xuICAgIHRleHQgPSB0ZXh0LnNsaWNlKDAsIC1cImFnb1wiLmxlbmd0aCk7XG4gIH1cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXmluXFxiLywgXCJcIikudHJpbSgpO1xuICBpZiAoIXRleHQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdGVybXMgPSBbLi4udGV4dC5tYXRjaEFsbChEVVJBVElPTl9URVJNKV07XG4gIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgLy8gRXZlcnl0aGluZyBvdXRzaWRlIHRoZSBtYXRjaGVkIHRlcm1zIG11c3QgYmUgc2VwYXJhdG9ycyBvbmx5OyBvdGhlcndpc2UgdGhlXG4gIC8vIHN0cmluZyBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IG1lcmVseSBDT05UQUlOUyBhIGR1cmF0aW9uLXNoYXBlZCBmcmFnbWVudC5cbiAgbGV0IGxlZnRvdmVyID0gdGV4dDtcbiAgZm9yIChjb25zdCB0ZXJtIG9mIHRlcm1zKSBsZWZ0b3ZlciA9IGxlZnRvdmVyLnJlcGxhY2UodGVybVswXSwgXCIgXCIpO1xuICBpZiAobGVmdG92ZXIudHJpbSgpKSB7XG4gICAgLy8gQSBkdXJhdGlvbi1zaGFwZWQgZnJhZ21lbnQgaW5zaWRlIG90aGVyIHRleHQgaXMgdXN1YWxseSBhIERBVEUgLSBgXCIyMDI2LTA4LTAyXCJgXG4gICAgLy8gbWF0Y2hlcyB0d28gdGVybXMgYW5kIGxlYXZlcyBzZXBhcmF0b3JzIGJlaGluZC5cbiAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICB9XG5cbiAgbGV0IHRvdGFsID0gMDtcbiAgbGV0IHNpZ24gPSAxO1xuICBmb3IgKGNvbnN0IFssIGV4cGxpY2l0U2lnbiwgYW1vdW50LCB1bml0XSBvZiB0ZXJtcykge1xuICAgIGlmIChleHBsaWNpdFNpZ24pIHNpZ24gPSBleHBsaWNpdFNpZ24gPT09IFwiLVwiID8gLTEgOiAxO1xuICAgIGNvbnN0IHVuaXRNcyA9IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQpID8/IERVUkFUSU9OX1VOSVRfTVMuZ2V0KHVuaXQucmVwbGFjZSgvcyQvLCBcIlwiKSk7XG4gICAgaWYgKHVuaXRNcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5wYXJzZURhdGUgPT09IGZhbHNlID8gdW5kZWZpbmVkIDogZGF0ZUFzRHVyYXRpb24odmFsdWUpO1xuICAgIH1cbiAgICB0b3RhbCArPSBzaWduICogTnVtYmVyKGFtb3VudCkgKiB1bml0TXM7XG4gIH1cbiAgcmV0dXJuIG5lZ2F0ZSA/IC10b3RhbCA6IHRvdGFsO1xufVxuXG4vKipcbiAqIEEgZGF0ZSByZWFkIGFzIHRoZSBzaWduZWQgb2Zmc2V0IGZyb20gbm93IChgZGF0ZSAtIG5vd2ApLCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiB7QGxpbmsgdG9EdXJhdGlvbn0gYW5kIHtAbGluayB0b0RhdGV9IGludmVyc2VzIG9mIGVhY2ggb3RoZXIuIFJlY3Vyc2VzIHdpdGhcbiAqIGR1cmF0aW9uIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kIGZvcnRoXG4gKiBmb3JldmVyLlxuICovXG5mdW5jdGlvbiBkYXRlQXNEdXJhdGlvbih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGUgPSB0b0RhdGUodmFsdWUsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7XG4gIHJldHVybiBkYXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkYXRlLmdldFRpbWUoKSAtIERhdGUubm93KCk7XG59XG5cbi8qKlxuICogQ29lcmNlIGEgbG9vc2UgZGF0ZS1pc2ggdmFsdWUgdG8gYSByZWFsIGBEYXRlYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW4ndCBiZVxuICogaW50ZXJwcmV0ZWQuIEFjY2VwdHMsIGluIHRoaXMgb3JkZXI6XG4gKlxuICogICAtIGEgYERhdGVgIChwYXNzZWQgdGhyb3VnaDsgYW4gaW52YWxpZCBvbmUgaXMgYSBtaXNzKTtcbiAqICAgLSBhbiBlcG9jaCBOVU1CRVIgb3IgbnVtZXJpYyBzdHJpbmcsIGluIHNlY29uZHMgb3IgbWlsbGlzZWNvbmRzIChzZWVcbiAqICAgICB7QGxpbmsgU0VDT05EU19DRUlMSU5HfSk7XG4gKiAgIC0gYG5vd2AgKGFuZCBpdHMgYHRvZGF5YCBzcGVsbGluZyksIGZvciB0aGUgY3VycmVudCBpbnN0YW50O1xuICogICAtIGEge0BsaW5rIHRvRHVyYXRpb259IGV4cHJlc3Npb24sIHJlc29sdmVkIFJFTEFUSVZFIFRPIE5PVywgc28gYC03ZGAsXG4gKiAgICAgYDcgZGF5cyBhZ29gLCBhbmQgYGluIDMwIG1pbnV0ZXNgIGFyZSBhbGwgdmFsaWQgaW5zdGFudHM7XG4gKiAgIC0gYW55dGhpbmcgYERhdGUucGFyc2VgIHVuZGVyc3RhbmRzIChgMjAyNi0wOC0wMmAsIGFuIElTTy9VVEMgaW5zdGFudCkuXG4gKlxuICogVGhlIGVwb2NoIHVuaXQgaW5mZXJlbmNlIGlzIHRoZSByZWFzb24gdGhpcyBleGlzdHMgcmF0aGVyIHRoYW5cbiAqIGBuZXcgRGF0ZSh2YWx1ZSlgOiBhIGJhcmUgZXBvY2ggYXJyaXZlcyBhcyBhIFNUUklORyBmcm9tIGFuIGVudiB2YXIgb3IgYSBDTElcbiAqIGZsYWcgYXMgb2Z0ZW4gYXMgaXQgYXJyaXZlcyBhcyBhIG51bWJlciAoYGRhdGUgKyVzYCwgYSBKU09OIGZpZWxkLCBhIGNvcGllZCBsb2dcbiAqIGxpbmUpLCBhbmQgYERhdGUucGFyc2UoXCIxNzg1Njk3ODk5XCIpYCByZWFkcyB0aGF0IGFzIGEgWUVBUiwgc2lsZW50bHkgbGFuZGluZ1xuICogMS43IGJpbGxpb24geWVhcnMgb3V0LiBOdW1lcmljIHN0cmluZ3MgYXJlIHRoZXJlZm9yZSByb3V0ZWQgdG8gdGhlIGVwb2NoIHBhdGgsXG4gKiBuZXZlciB0byBgRGF0ZS5wYXJzZWAuXG4gKlxuICogVGhlIGR1cmF0aW9uIGZhbGxiYWNrIHJ1bnMgTEFTVCwgYWZ0ZXIgYERhdGUucGFyc2VgLCBzbyBhIHJlYWwgZGF0ZSBpcyBuZXZlclxuICogbWlzdGFrZW4gZm9yIGFuIG9mZnNldC4gYG9wdGlvbnMucGFyc2VEdXJhdGlvbjogZmFsc2VgIHJlbW92ZXMgaXQgZW50aXJlbHkgd2hlblxuICogdGhlIHZhbHVlIG11c3QgYmUgYW4gYWJzb2x1dGUgaW5zdGFudCAtIHNlZSB7QGxpbmsgVG9EYXRlT3B0aW9uc30uXG4gKlxuICogTGlrZSB7QGxpbmsgdG9Cb29sZWFufSB0aGlzIE5FVkVSIHRocm93cyBhbmQgcmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW55dGhpbmdcbiAqIHVuaW50ZXJwcmV0YWJsZSwgc28gYSBjYWxsZXIgZGVjaWRlcyB3aGV0aGVyIGEgYmFkIHZhbHVlIGlzIGZhdGFsLCBhIHdhcm5pbmcsXG4gKiBvciBhIGZhbGxiYWNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiB0b0RhdGUoXCJub3dcIik7ICAgICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW50XG4gKiB0b0RhdGUoXCIyMDI2LTA4LTAyXCIpOyAgICAgICAgLy8gMjAyNi0wOC0wMlQwMDowMDowMC4wMDBaXG4gKiB0b0RhdGUoXCIxNzg1Njk3ODk5XCIpOyAgICAgICAgLy8gc2Vjb25kcyAtPiAyMDI2LTA4LTAyVC4uLlxuICogdG9EYXRlKDE3ODU2OTc4OTkwMDApOyAgICAgICAvLyBtaWxsaXMgIC0+IHRoZSBzYW1lIGluc3RhbnRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIpOyAgICAgICAvLyBub3cgLSAzMGRcbiAqIHRvRGF0ZShcIjMwIGRheXMgYWdvXCIsIHsgcGFyc2VEdXJhdGlvbjogZmFsc2UgfSk7IC8vIHVuZGVmaW5lZFxuICogdG9EYXRlKFwibm9wZVwiKTsgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBUb0RhdGVPcHRpb25zID0ge30pOiBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXBvY2hNcyA9IHRvRXBvY2hNcyh2YWx1ZSk7XG4gIGlmIChlcG9jaE1zICE9PSB1bmRlZmluZWQpIHJldHVybiBmcm9tTXMoZXBvY2hNcyk7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCB0ZXh0ID0gdmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0ZXh0ID09PSBcIm5vd1wiIHx8IHRleHQgPT09IFwidG9kYXlcIikgcmV0dXJuIG5ldyBEYXRlKCk7XG5cbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh2YWx1ZS50cmltKCkpO1xuICBpZiAoIU51bWJlci5pc05hTihwYXJzZWQpKSByZXR1cm4gbmV3IERhdGUocGFyc2VkKTtcblxuICBpZiAob3B0aW9ucy5wYXJzZUR1cmF0aW9uID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gUmVjdXJzZXMgd2l0aCBkYXRlIHBhcnNpbmcgRElTQUJMRUQgc28gdGhlIHR3byBjYW5ub3QgaGFuZCBhIHZhbHVlIGJhY2sgYW5kXG4gIC8vIGZvcnRoIGZvcmV2ZXIuXG4gIGNvbnN0IG9mZnNldE1zID0gdG9EdXJhdGlvbih2YWx1ZSwgeyBwYXJzZURhdGU6IGZhbHNlIH0pO1xuICByZXR1cm4gb2Zmc2V0TXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGZyb21NcyhEYXRlLm5vdygpICsgb2Zmc2V0TXMpO1xufVxuXG4vKiogQSBgRGF0ZWAgZm9yIGVwb2NoIGBtc2AsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgb3V0IG9mIHJlcHJlc2VudGFibGUgcmFuZ2UuICovXG5mdW5jdGlvbiBmcm9tTXMobXM6IG51bWJlcik6IERhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobXMpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IHVuZGVmaW5lZCA6IGRhdGU7XG59XG5cbi8qKlxuICogRXBvY2ggbWlsbGlzZWNvbmRzIGZvciBhIG51bWVyaWMgdmFsdWUvc3RyaW5nLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vdCBvbmUsXG4gKiBhcHBseWluZyB0aGUgc2Vjb25kcy12cy1taWxsaXMgaW5mZXJlbmNlIGF0IHtAbGluayBTRUNPTkRTX0NFSUxJTkd9LlxuICovXG5mdW5jdGlvbiB0b0Vwb2NoTXModmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBudW1lcmljID0gdG9CYXJlTnVtYmVyKHZhbHVlKTtcbiAgaWYgKG51bWVyaWMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGguYWJzKG51bWVyaWMpIDwgU0VDT05EU19DRUlMSU5HID8gbnVtZXJpYyAqIDEwMDAgOiBudW1lcmljO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWwgZGVlcC1lcXVhbGl0eSB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSBjb21wYXJhdG9yLlxuICpcbiAqIHtAbGluayBkZWVwRXF1YWx9IG1pcnJvcnMgdGhlIHNlbWFudGljcyBvZiB0aGUgYGZhc3QtZGVlcC1lcXVhbGBcbiAqIHBhY2thZ2UgKGhhbmRsZWQ6IG5lc3RlZCBwbGFpbiBvYmplY3RzL2FycmF5cywgYE1hcGAsIGBTZXRgLCBgRGF0ZWAsXG4gKiBgUmVnRXhwYCwgdHlwZWQgYXJyYXlzLCBgTmFOYCwgYW5kIGArMGAvYC0wYCB0cmVhdGVkIGFzIGVxdWFsKSBidXQgaXNcbiAqIGRlcGVuZGVuY3ktZnJlZSBzbyBgQGRieC10b29scy9zaGFyZWQtY29yZWAga2VlcHMgbm8gcnVudGltZSBkZXBzLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgY29tcGFyYXRvcmAgc2hvcnQtY2lyY3VpdHMgdGhlIHN0cnVjdHVyYWwgd2FsayBhdCBhbnlcbiAqIG5vZGU6IHJldHVybiBgdHJ1ZWAvYGZhbHNlYCB0byBmb3JjZSB0aGUgcmVzdWx0IGZvciB0aGF0IHBhaXIsIG9yXG4gKiBgdW5kZWZpbmVkYCB0byBkZWZlciB0byB0aGUgYnVpbHQtaW4gY29tcGFyaXNvbi4gSXQgaXMgaW52b2tlZCBmb3IgdGhlXG4gKiByb290IHBhaXIgYW5kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIG5lc3RlZCBwYWlyLCBzbyBhIGNhbGxlciBjYW4sIGUuZy4sXG4gKiBjb21wYXJlIHR3byBkb21haW4gb2JqZWN0cyBieSBpZCB3aGlsZSBsZXR0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBmYWxsXG4gKiBiYWNrIHRvIHN0cnVjdHVyYWwgZXF1YWxpdHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGRlZXBFcXVhbCh7IGE6IDEgfSwgeyBhOiAxIH0pOyAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKFsxLCAyXSwgWzEsIDJdKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZVxuICogZGVlcEVxdWFsKGEsIGIsICh4LCB5KSA9PlxuICogICBpc0VudGl0eSh4KSAmJiBpc0VudGl0eSh5KSA/IHguaWQgPT09IHkuaWQgOiB1bmRlZmluZWQpO1xuICovXG5leHBvcnQgdHlwZSBEZWVwRXF1YWxDb21wYXJhdG9yID0gKGE6IHVua25vd24sIGI6IHVua25vd24pID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoYTogdW5rbm93biwgYjogdW5rbm93biwgY29tcGFyYXRvcj86IERlZXBFcXVhbENvbXBhcmF0b3IpOiBib29sZWFuIHtcbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBjb25zdCBkZWNpZGVkID0gY29tcGFyYXRvcihhLCBiKTtcbiAgICBpZiAoZGVjaWRlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjaWRlZDtcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGEgIT09IFwib2JqZWN0XCIgfHwgYSA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gXCJvYmplY3RcIiB8fCBiID09PSBudWxsKSB7XG4gICAgLy8gTmFOIGlzIHRoZSBvbmx5IHZhbHVlIG5vdCBlcXVhbCB0byBpdHNlbGYgdW5kZXIgYD09PWAuXG4gICAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbiAgfVxuXG4gIGlmIChhLmNvbnN0cnVjdG9yICE9PSBiLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICBjb25zdCBiQXJyID0gYiBhcyB1bmtub3duW107XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiQXJyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwoYVtpXSwgYkFycltpXSwgY29tcGFyYXRvcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGNvbnN0IGJNYXAgPSBiIGFzIE1hcDx1bmtub3duLCB1bmtub3duPjtcbiAgICBpZiAoYS5zaXplICE9PSBiTWFwLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgICBpZiAoIWJNYXAuaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghZGVlcEVxdWFsKHZhbHVlLCBiTWFwLmdldChrZXkpLCBjb21wYXJhdG9yKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgY29uc3QgYlNldCA9IGIgYXMgU2V0PHVua25vd24+O1xuICAgIGlmIChhLnNpemUgIT09IGJTZXQuc2l6ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYSkge1xuICAgICAgaWYgKCFiU2V0Lmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IChiIGFzIERhdGUpLmdldFRpbWUoKTtcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgY29uc3QgYlJlID0gYiBhcyBSZWdFeHA7XG4gICAgcmV0dXJuIGEuc291cmNlID09PSBiUmUuc291cmNlICYmIGEuZmxhZ3MgPT09IGJSZS5mbGFncztcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYSkgJiYgIShhIGluc3RhbmNlb2YgRGF0YVZpZXcpKSB7XG4gICAgY29uc3QgYUFyciA9IGEgYXMgdW5rbm93biBhcyBBcnJheUxpa2U8bnVtYmVyPjtcbiAgICBjb25zdCBiQXJyID0gYiBhcyB1bmtub3duIGFzIEFycmF5TGlrZTxudW1iZXI+O1xuICAgIGlmIChhQXJyLmxlbmd0aCAhPT0gYkFyci5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhQXJyW2ldICE9PSBiQXJyW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IG9mIGFLZXlzKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChcbiAgICAgICFkZWVwRXF1YWwoXG4gICAgICAgIChhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLFxuICAgICAgICAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgY29tcGFyYXRvcixcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
@@ -20,11 +20,16 @@ export type TokenizeOptions = {
20
20
  omitEmailDomain?: boolean;
21
21
  camelCase?: boolean;
22
22
  };
23
+ /**
24
+ * Tokenization and overflow controls for lowercase keys and slugs. The default
25
+ * length is unlimited; overflow uses a six-character hash unless overridden.
26
+ */
23
27
  export type KeyOptions = Omit<TokenizeOptions, "lowerCase" | "capitalize"> & {
24
28
  maxLength?: number;
25
29
  truncateStrategy?: "hash" | "trim" | "empty";
26
30
  truncateHashLength?: number;
27
31
  };
32
+ /** {@link KeyOptions} plus the token delimiter used by identifier generation. */
28
33
  export type IdentifierOptions = KeyOptions & {
29
34
  delimiter?: string;
30
35
  };