footprintjs 9.46.1 → 9.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -300,7 +300,7 @@ exports.foldRows = foldRows;
300
300
  * value the replay writes is its own (`set` / `append` clone the recorded
301
301
  * value; the `merge` arm reads a detached copy of `updates`), so the result
302
302
  * shares no container with `base`, `updates` or `overwrite`. This is the
303
- * public (`footprintjs/advanced`) contract, unchanged by copy-on-write
303
+ * public (`footprintjs/trace`; also `/advanced` until 10.0.0) contract, unchanged by copy-on-write
304
304
  * (9.29.0) — byte-identical to 9.28.0 for every caller. The engine's own
305
305
  * commit does NOT come here: `SharedMemory.applyPatch` builds the next
306
306
  * generation with `nextGeneration`, which copies only the written
@@ -441,4 +441,4 @@ function foldKey(touches, segs, options = {}) {
441
441
  return (0, pathOps_js_1.nativeGet)(state, segs);
442
442
  }
443
443
  exports.foldKey = foldKey;
444
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyYnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS92ZXJicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHOzs7QUFJSCx5Q0FBNEM7QUFDNUMsNkNBQThGO0FBQzlGLHlDQUFpRDtBQVFqRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxNQUFNLEdBQXNFO0lBQ2hGLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUNqQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7SUFDcEMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQ3BDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtDQUNyQyxDQUFDO0FBRUYsNERBQTREO0FBQy9DLFFBQUEsS0FBSyxHQUFvQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFXLENBQUMsQ0FBQztBQUVuRix5RkFBeUY7QUFDekYsU0FBZ0IsTUFBTSxDQUFDLEtBQWM7SUFDbkMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxRixDQUFDO0FBRkQsd0JBRUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixPQUFPLENBQUMsSUFBVTtJQUNoQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDNUIsQ0FBQztBQUZELDBCQUVDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixXQUFXLENBQUMsSUFBVTtJ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LENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsSUFBQSxxQkFBUSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsaUVBQWlFO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSxzQkFBUyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0csSUFBQSxnQkFBRyxFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQixTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLE9BQU87WUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFBLHNCQUFTLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQztRQUFFLFdBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFBLHNCQUFTLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0UsT0FBTyxJQUFBLHNCQUFTLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUExREQsMEJBMERDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB2ZXJicy50cyDigJQgVEhFIFZFUkIgTEFXIChMMSk6IHRoZSBvbmUgcGxhY2UgYSBjb21taXQgcm93IGJlY29tZXMgYSB2YWx1ZS5cbiAqXG4gKiBBIHJvdyBvZiBhIGNvbW1pdCBidW5kbGUncyBgdHJhY2VgIGNhcnJpZXMgb25lIG9mIGZvdXIgdmVyYnMg4oCUXG4gKiBgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVgIOKAlCBhbmQgT05FIHN0ZXAgdHVybnMgaXQgaW50byBhIHZhbHVlOlxuICoge0BsaW5rIGFwcGx5VmVyYn0uIFN0YXRlIGlzIGEgbGVmdCBmb2xkIG9mIHRoYXQgc3RlcCAodGhlIGV2ZW50LXNvdXJjaW5nXG4gKiByZWR1Y2VyKToge0BsaW5rIGZvbGRSb3dzfSBmb2xkcyBvbmUgYnVuZGxlJ3Mgcm93cyBpbnRvIGEgc3RhdGUsIGFuZFxuICoge0BsaW5rIGZvbGRLZXl9IGZvbGRzIE9ORSBLRVkgYWNyb3NzIGEgbG9nIOKAlCBldmVyeSByb3cgdW5kZXIgdGhlIGtleSdzXG4gKiB0b3AtbGV2ZWwga2V5LCByZWFkIGF0IHRoZSBrZXkgKHRoZSB2YWx1ZSBydWxlLCBga2V5UGF0aHMudHNgKS4gRXZlcnkgcmVhZGVyXG4gKiBvZiB0aGUgbG9nIHJ1bnMgb25lIG9mIHRoZSB0d28g4oCUXG4gKlxuICogICAtIHRoZSBsaXZlIGNvbW1pdCBhbmQgdGhlIHJlZGFjdGVkIG1pcnJvciAoYG5leHRHZW5lcmF0aW9uYCksXG4gKiAgIC0gdGhlIHB1YmxpYyByZXBsYXkgKGBhcHBseVNtYXJ0TWVyZ2VgKSwgdGhlIHJlYWQtc2lkZSBmb2xkc1xuICogICAgIChgYXBwbHlTbWFydE1lcmdlSW50b2Ag4oCUIGBFdmVudExvZy5tYXRlcmlhbGlzZWAsIGBzdGF0ZUF0YCkgYW5kIHRoZVxuICogICAgIGFkbWl0dGVkIHJlY29yZCdzIGNvbXBhcmlzb24gKGBkcnlGb2xkYCk6IGFsbCB7QGxpbmsgZm9sZFJvd3N9LFxuICogICAtIGBjb21taXRWYWx1ZUF0YCwgYW5kIGBhcnJheVByb3ZlbmFuY2VgIGFzIGFuIE9CU0VSVkVSIG9mIHRoZSBzYW1lIGZvbGQ6XG4gKiAgICAge0BsaW5rIGZvbGRLZXl9LlxuICpcbiAqIFRocmVlIHF1ZXN0aW9ucyB0aGF0IHVzZWQgdG8gYmUgYW5zd2VyZWQgb25jZSBwZXIgcmVhZGVyIGFyZSBhbnN3ZXJlZCBoZXJlXG4gKiBvbmNlOiB3aGF0IGEgdmVyYiBkb2VzIHRvIHRoZSB2YWx1ZSBiZWZvcmUgaXQgKHtAbGluayBhcHBseVZlcmJ9KSwgaG93IHRoZVxuICogcmVzdWx0IGlzIHBsYWNlZCAoe0BsaW5rIHBsYWNlVmVyYn0pLCBhbmQgaG93IHRoZSBsb2cncyBvd24gdmFsdWVzIGFyZVxuICogdHJlYXRlZCBvbiB0aGUgd2F5IGluICh0aGUgY2xvbmUgZGlzY2lwbGluZSDigJQgYSBQQVJBTUVURVIgb2YgdGhlIGZvbGQsIHNlZVxuICoge0BsaW5rIERpc2NpcGxpbmV9IGFuZCB7QGxpbmsgUmVjb3JkZWRQYXlsb2FkfSkuIEEgbmV3IHZlcmIgaXMgb25lIG5ldyBhcm0gb2ZcbiAqIGBhcHBseVZlcmJgIGFuZCBvbmUgcm93IG9mIHRoZSB0cmFpdHMgdGFibGU7IHRoZSBjb21waWxlciByZWZ1c2VzIGVpdGhlclxuICogbWlzc2luZyAoe0BsaW5rIGlzVG90YWx9LCB7QGxpbmsgcmVjb3Jkc1RhaWx9LCB7QGxpbmsgVkVSQlN9KS5cbiAqXG4gKiBBbiBVTktOT1dOIHZlcmIgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfSwgbmV2ZXIgZm9sZGVkIGFzIGFcbiAqIGBtZXJnZWAgKHRoZSBvbGQgc2lsZW50IGRlZmF1bHQpLiBFbmdpbmUtd3JpdHRlbiBsb2dzIGNhcnJ5IHRoZSBmb3VyLCBzb1xuICogZXZlcnkgZW5naW5lIHJ1biBmb2xkcyBieXRlLWZvci1ieXRlIGFzIGJlZm9yZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdElkeCB9IGZyb20gJy4uL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhSZWxhdGlvbiB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmltcG9ydCB7IG5hdGl2ZURlbGV0ZSwgbmF0aXZlR2V0LCBuYXRpdmVTZXQsIG93biwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIDilIAgVGhlIHZvY2FidWxhcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIGNvbW1pdCByb3cncyB2ZXJiIOKAlCBgVHJhY2VFbnRyeVsndmVyYiddYCwgdGhlIHVuaW9uIHRoZSB0eXBlcyBmaWxlIGRlY2xhcmVzLiAqL1xuZXhwb3J0IHR5cGUgVmVyYiA9IFRyYWNlRW50cnlbJ3ZlcmInXTtcblxuLyoqXG4gKiBUaGUgdm9jYWJ1bGFyeTogZWFjaCB2ZXJiIHdpdGggdGhlIHR3byB0cmFpdHMgcmVhZGVycyBicmFuY2ggb24sIGluIHRoZVxuICogb3JkZXIgdGhlIGNvbnRyYWN0IG5hbWVzIHRoZW0uIEEgYFJlY29yZGAgb3ZlciB0aGUgdW5pb24g4oCUIHRoZSBjb21waWxlclxuICogcmVmdXNlcyBhIHRhYmxlIHRoYXQgbWlzc2VzIChvciBpbnZlbnRzKSBhIHZlcmIsIHNvIGEgdmVyYiBjYW5ub3QgYmUgYWRkZWRcbiAqIHdpdGhvdXQgc2F5aW5nIHdoYXQgaXQgaXMuXG4gKlxuICogICBgdG90YWxgIOKAlCB0aGUgcm93IGRlY2lkZXMgdGhlIHZhbHVlIEFMT05FOyBpdCByZWFkcyBub3RoaW5nIGZyb20gd2hhdCBjYW1lXG4gKiAgICAgYmVmb3JlIGl0ICh7QGxpbmsgaXNUb3RhbH0pLlxuICogICBgdGFpbGAgIOKAlCB0aGUgcm93IHJlY29yZHMgT05MWSB3aGF0IGl0IGFkZHMsIG5vdCB0aGUgd2hvbGUgdmFsdWVcbiAqICAgICAoe0BsaW5rIHJlY29yZHNUYWlsfSkuXG4gKi9cbmNvbnN0IFRSQUlUUzogUmVjb3JkPFZlcmIsIHsgcmVhZG9ubHkgdG90YWw6IGJvb2xlYW47IHJlYWRvbmx5IHRhaWw6IGJvb2xlYW4gfT4gPSB7XG4gIHNldDogeyB0b3RhbDogdHJ1ZSwgdGFpbDogZmFsc2UgfSxcbiAgbWVyZ2U6IHsgdG90YWw6IGZhbHNlLCB0YWlsOiBmYWxzZSB9LFxuICBhcHBlbmQ6IHsgdG90YWw6IGZhbHNlLCB0YWlsOiB0cnVlIH0sXG4gIGRlbGV0ZTogeyB0b3RhbDogdHJ1ZSwgdGFpbDogZmFsc2UgfSxcbn07XG5cbi8qKiBUaGUgZm91ciB2ZXJicywgaW4gdGhlIG9yZGVyIHRoZSBjb250cmFjdCBuYW1lcyB0aGVtLiAqL1xuZXhwb3J0IGNvbnN0IFZFUkJTOiByZWFkb25seSBWZXJiW10gPSBPYmplY3QuZnJlZXplKE9iamVjdC5rZXlzKFRSQUlUUykgYXMgVmVyYltdKTtcblxuLyoqIElzIGB2YWx1ZWAgb25lIG9mIHRoZSBmb3VyPyBUaGUgcXVlc3Rpb24gZXZlcnkgcmVhZGVyIG9mIGEgZm9yZWlnbiBsb2cgYXNrcyBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcmIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJiIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFRSQUlUUywgdmFsdWUpO1xufVxuXG4vKipcbiAqIERvZXMgdGhlIHZlcmIgZGVjaWRlIHRoZSB2YWx1ZSBBTE9ORSDigJQgcmVhZCBub3RoaW5nIGZyb20gd2hhdCBjYW1lIGJlZm9yZVxuICogaXQ/IGBzZXRgIGFuZCBgZGVsZXRlYC4gQSByZWFkZXIgdGhhdCBvbmx5IG5lZWRzIHRoZSBmaW5hbCB2YWx1ZSBtYXkgc3RhcnRcbiAqIGF0IHRoZSBsYXN0IHN1Y2ggcm93ICh7QGxpbmsgZm9sZEtleX0gYGFuY2hvcmVkYCk7IG9uZSB0aGF0IHRyYWNrcyBob3cgdGhlXG4gKiB2YWx1ZSBncmV3IChwcm92ZW5hbmNlKSBzdGFydHMgYXQgdGhlIGZpcnN0LiBQaW5uZWQgYWdhaW5zdFxuICoge0BsaW5rIGFwcGx5VmVyYn0gaXRzZWxmLCBzbyBhIG5ldyB2ZXJiIGNhbm5vdCBtaXNyZXBvcnQgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RvdGFsKHZlcmI6IFZlcmIpOiBib29sZWFuIHtcbiAgcmV0dXJuIFRSQUlUU1t2ZXJiXS50b3RhbDtcbn1cblxuLyoqXG4gKiBEb2VzIHRoZSByb3cgcmVjb3JkIE9OTFkgd2hhdCBpdCBhZGRzIOKAlCBhIHRhaWwg4oCUIHJhdGhlciB0aGFuIHRoZSB3aG9sZVxuICogdmFsdWU/IGBhcHBlbmRgLiBXaGF0IHRoZSByb3cgYWRkZWQgaXMgdGhlbiBrbm93biBleGFjdGx5OiBhIHJlYWRlciB0aGF0XG4gKiB0cmFja3Mgd2hlcmUgYXJyYXkgZWxlbWVudHMgY2FtZSBmcm9tIGF0dHJpYnV0ZXMgdGhlbSB0byB0aGlzIHJvdyB3aXRob3V0XG4gKiBjb21wYXJpbmcgYXJyYXlzLCB3aGVyZSBldmVyeSBvdGhlciB2ZXJiIGhhcyB0byBiZSBpbmZlcnJlZCBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3Jkc1RhaWwodmVyYjogVmVyYik6IGJvb2xlYW4ge1xuICByZXR1cm4gVFJBSVRTW3ZlcmJdLnRhaWw7XG59XG5cbi8qKiBXaGVyZSBpbiBhIGxvZyBhIHJlZnVzZWQgcm93IHNpdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvd1NpdGUge1xuICAvKiogVGhlIHJvdydzIGBwYXRoYCwgREVMSU0tam9pbmVkIGFzIHRoZSB0cmFjZSByZWNvcmRzIGl0LiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKiBUaGUgcm93J3MgcG9zaXRpb24gaW4gaXRzIGJ1bmRsZSdzIGB0cmFjZWAuICovXG4gIHJlYWRvbmx5IHJvdzogbnVtYmVyO1xuICAvKiogVGhlIGJ1bmRsZSdzIHBvc2l0aW9uIGluIHRoZSBjb21taXQgbG9nLCB3aGVuIHRoZSByZWFkZXIga25vd3MgaXQuICovXG4gIHJlYWRvbmx5IGNvbW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgdGhlIHJlYWRlcnMgb2YgYSBjb21taXQgbG9nIOKAlCB7QGxpbmsgZm9sZFJvd3N9IChiZWhpbmRcbiAqIGBhcHBseVNtYXJ0TWVyZ2VgKSwgYGNvbW1pdFZhbHVlQXRgLCBgYXJyYXlQcm92ZW5hbmNlYCDigJQgd2hlbiBhIHJvdyBjYXJyaWVzIGFcbiAqIHZlcmIgb3V0c2lkZSB7QGxpbmsgVkVSQlN9OiBhIGZvcmVpZ24gb3IgY29ycnVwdGVkIGxvZyBmYWlscyBsb3VkbHkgaW5zdGVhZFxuICogb2YgYmVpbmcgcmVwbGF5ZWQgYXMgYSBgbWVyZ2VgLiBgdmVyYmAsIGBwYXRoYCwgYHJvd2AgYW5kIGBjb21taXRgIG5hbWUgdGhlXG4gKiByb3cgKGBwYXRoYCAvIGByb3dgIC8gYGNvbW1pdGAgYXJlIGFic2VudCB3aGVuIHRoZSBjYWxsZXIgaGFuZGVkIG92ZXIgYVxuICogYmFyZSB2ZXJiKTsgYHBhdGhgIGlzIHRoZSB0cmFjZSdzIG93biBERUxJTS1qb2luZWQgZm9ybSDigJQgdGFrZSBpdCBhcGFydCB3aXRoXG4gKiBgcGF0aFNlZ21lbnRzYC4gVGhlIG1lc3NhZ2UgcXVvdGVzIGB2ZXJiYCBhbmQgYHBhdGhgLCBzbyBhIGhvc3RpbGUgbG9nIGNhbm5vdFxuICogcmVzaGFwZSBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFVua25vd25WZXJiRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHZlcmI6IHVua25vd247XG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvdz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY29tbWl0PzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHZlcmI6IHVua25vd24sIHNpdGU/OiBSb3dTaXRlKSB7XG4gICAgY29uc3QgbmFtZWQgPVxuICAgICAgdHlwZW9mIHZlcmIgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkodmVyYikgOiB2ZXJiID09PSB1bmRlZmluZWQgPyAndW5kZWZpbmVkJyA6IGBvZiB0eXBlICR7dHlwZW9mIHZlcmJ9YDtcbiAgICAvLyBUaGUgdmVyYiBhbmQgdGhlIHBhdGggY29tZSBmcm9tIGEgbG9nIG5vYm9keSB2ZXR0ZWQ6IHF1b3RlZCAoSlNPTiksIHNvIGFcbiAgICAvLyBjb250cm9sIGNoYXJhY3RlciBpbiBlaXRoZXIgY2Fubm90IHJlc2hhcGUgdGhlIG1lc3NhZ2UuXG4gICAgY29uc3Qgd2hlcmUgPVxuICAgICAgc2l0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gJydcbiAgICAgICAgOiBgIG9uIHRyYWNlIHJvdyAke3NpdGUucm93fSAocGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGhTZWdtZW50cyhzaXRlLnBhdGgpLmpvaW4oJyDigLogJykpfSR7XG4gICAgICAgICAgICBzaXRlLmNvbW1pdCA9PT0gdW5kZWZpbmVkID8gJycgOiBgLCBjb21taXQgJHtzaXRlLmNvbW1pdH1gXG4gICAgICAgICAgfSlgO1xuICAgIGNvbnN0IG9uZSA9IFZFUkJTLmpvaW4oJyB8ICcpO1xuICAgIHN1cGVyKGB1bmtub3duIHZlcmIgJHtuYW1lZH0ke3doZXJlfTogYSBjb21taXQgcm93IGlzIG9uZSBvZiAke29uZX0g4oCUIHRoZSBsb2cgaXMgcmVmdXNlZCwgbm90IHJlcGxheWVkIGFzIGEgbWVyZ2VgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5rbm93blZlcmJFcnJvcic7XG4gICAgdGhpcy52ZXJiID0gdmVyYjtcbiAgICBpZiAoc2l0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhdGggPSBzaXRlLnBhdGg7XG4gICAgICB0aGlzLnJvdyA9IHNpdGUucm93O1xuICAgICAgaWYgKHNpdGUuY29tbWl0ICE9PSB1bmRlZmluZWQpIHRoaXMuY29tbWl0ID0gc2l0ZS5jb21taXQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnVzZVZlcmIodmVyYjogbmV2ZXIpOiBuZXZlciB7XG4gIHRocm93IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIpO1xufVxuXG4vLyDilIDilIDilIAgVGhlIHN0ZXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2hhdCBhIGBkZWxldGVgIHJvdyBsZWF2ZXMgYmVoaW5kOiB0aGUgS0VZIElTIEdPTkUg4oCUIHdoaWNoIGlzIG5vdCB0aGUgdmFsdWVcbiAqIGB1bmRlZmluZWRgIChhIHJvb3QgcmVwbGF5IHJlbW92ZXMgdGhlIGtleTsgYSBwZXItcGF0aCBmb2xkIHJlYWRzIGl0IGFzXG4gKiBgdW5kZWZpbmVkYCkuIHtAbGluayBhcHBseVZlcmJ9IHJldHVybnMgaXQsIHtAbGluayBwbGFjZVZlcmJ9IGFjdHMgb24gaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBBQlNFTlQ6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2Zvb3RwcmludGpzLnZlcmJzLmFic2VudCcpO1xuXG4vKipcbiAqIE9uZSBidW5kbGUncyByZWNvcmRlZCBwYXlsb2FkLCByZWFkIGJ5IHBhdGggdW5kZXIgYSBjbG9uZSBkaXNjaXBsaW5lIOKAlCB0aGVcbiAqIHZhbHVlcyB7QGxpbmsgYXBwbHlWZXJifSByZWFkcyBvdXQgb2YgdGhlIGxvZy5cbiAqXG4gKiBgZGV0YWNoYCDigJQgYHRydWVgIGZvciBldmVyeSBmb2xkIHRoYXQga2VlcHMgaXRzIHJlc3VsdDogYSBgc2V0YCB2YWx1ZSBvciBhblxuICogYGFwcGVuZGAgdGFpbCBpcyBhIGNsb25lIG9mIHdoYXQgdGhlIGxvZyBob2xkcyBhbmQgdGhlIG1lcmdlIGRlbHRhIGNvbWVzIGZyb21cbiAqIE9ORSBkZXRhY2hlZCBjb3B5IG9mIGB1cGRhdGVzYCwgc28gdGhlIHJlc3VsdCBuZXZlciBhbGlhc2VzIHRoZSBsb2cuIGBmYWxzZWBcbiAqIG9ubHkgZm9yIHRoZSBjb21wYXJpc29uIGZvbGQgKHtAbGluayBkcnlGb2xkfSksIHdoaWNoIHBsYWNlcyByZWNvcmRlZCB2YWx1ZXNcbiAqIGFzIHJlY29yZGVkIGFuZCBkcm9wcyBpdHMgcmVzdWx0LlxuICpcbiAqIFRoZSBkZWx0YSBpcyBkZXRhY2hlZCBPTkNFIHBlciBidW5kbGUsIGxhemlseSDigJQgYSBidW5kbGUgd2l0aCBubyBgbWVyZ2VgIHJvd1xuICogcGF5cyBub3RoaW5nLiBgZGVlcFNtYXJ0TWVyZ2VgIGRlZHVwcyBhbiBhcnJheSB1bmlvbiBCWSBSRUZFUkVOQ0UgYW5kIHR3b1xuICogYG1lcmdlYCByb3dzIG9mIG9uZSBidW5kbGUgcmVwbGF5IHRoZSBzYW1lIGFjY3VtdWxhdGVkIGRlbHRhLCBzbyB0aGUgcm93c1xuICogbXVzdCBrZWVwIHNlZWluZyB0aGUgc2FtZSBvYmplY3RzOyBhIGNsb25lIHBlciByb3cgZHVwbGljYXRlZCB0aGVpciBlbGVtZW50c1xuICogKHRoZSBkaWZmZXJlbnRpYWwgY2F1Z2h0IGl0IGluIHRoZSByZXBsYXk7IGBjb21taXRWYWx1ZUF0YCBjYXJyaWVkIHRoZSBidWdcbiAqIHVudGlsIGl0IGZvbGRlZCB0aHJvdWdoIGhlcmUpLiBgb25seWAgbmFycm93cyB0aGUgY29weSB0byBPTkUgcGF0aCDigJQgYVxuICogcGVyLXBhdGggZm9sZCByZWFkcyBub3RoaW5nIGVsc2UsIGFuZCBtdXN0IG5vdCBwYXkgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogYnVuZGxlLlxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkZWRQYXlsb2FkIHtcbiAgcHJpdmF0ZSBkZWx0YXM6IE1lbW9yeVBhdGNoIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlczogTWVtb3J5UGF0Y2gsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGV0YWNoOiBib29sZWFuLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25seT86IHN0cmluZ1tdLFxuICApIHt9XG5cbiAgLyoqIFdoYXQgYSBgc2V0YCBwbGFjZXMgYW5kIGFuIGBhcHBlbmRgIGFkZHM6IGBvdmVyd3JpdGVbcGF0aF1gLCBjbG9uZWQgd2hlbiBkZXRhY2hpbmcuICovXG4gIHZhbHVlKHNlZ3M6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gICAgY29uc3QgcmVjb3JkZWQgPSBuYXRpdmVHZXQodGhpcy5vdmVyd3JpdGUsIHNlZ3MpO1xuICAgIHJldHVybiB0aGlzLmRldGFjaCA/IHN0cnVjdHVyZWRDbG9uZShyZWNvcmRlZCkgOiByZWNvcmRlZDtcbiAgfVxuXG4gIC8qKiBUaGUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgYXQgYHBhdGhgOiBgdXBkYXRlc1twYXRoXWAsIGZyb20gdGhlIGJ1bmRsZSdzIG9uZSBjb3B5LiAqL1xuICBkZWx0YShzZWdzOiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmRlbHRhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLm9ubHkgPT09IHVuZGVmaW5lZCA/IHRoaXMudXBkYXRlcyA6IGF0UGF0aCh0aGlzLnVwZGF0ZXMsIHRoaXMub25seSk7XG4gICAgICB0aGlzLmRlbHRhcyA9IHRoaXMuZGV0YWNoID8gc3RydWN0dXJlZENsb25lKHNvdXJjZSkgOiBzb3VyY2U7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVHZXQodGhpcy5kZWx0YXMsIHNlZ3MpO1xuICB9XG59XG5cbi8qKiBgdHJlZWAgcmVkdWNlZCB0byBPTkUgcGF0aDogdGhhdCBzdWItdHJlZSwgYnkgcmVmZXJlbmNlLCB1bmRlciBmcmVzaCBjb250YWluZXJzLiAqL1xuZnVuY3Rpb24gYXRQYXRoKHRyZWU6IE1lbW9yeVBhdGNoLCBzZWdzOiBzdHJpbmdbXSk6IE1lbW9yeVBhdGNoIHtcbiAgY29uc3QgbGVhZiA9IG5hdGl2ZUdldCh0cmVlLCBzZWdzKTtcbiAgcmV0dXJuIGxlYWYgPT09IHVuZGVmaW5lZCA/IHt9IDogbmF0aXZlU2V0KHt9LCBzZWdzLCBsZWFmKTtcbn1cblxuLyoqXG4gKiBPTkUgcm93LCBPTkUgc3RlcDogdGhlIHZhbHVlIGF0IHRoZSByb3cncyBwYXRoIEFGVEVSIHRoZSByb3csIGdpdmVuIHRoZVxuICogdmFsdWUgQkVGT1JFIGl0IGFuZCB0aGUgYnVuZGxlJ3MgcmVjb3JkZWQgcGF5bG9hZC4gVEhFIHZlcmIgbGF3IOKAlCBubyBvdGhlclxuICogZnVuY3Rpb24gaW4gdGhlIGxpYnJhcnkgaGFzIGFuIGFybSBwZXIgdmVyYi5cbiAqXG4gKiAgIC0gYCdzZXQnYCAgICDigJQgdGhlIHJlY29yZGVkIHZhbHVlIChgb3ZlcndyaXRlW3BhdGhdYCwgdGhlIGZ1bGwgZmluYWwgdmFsdWUpLlxuICogICAtIGAnbWVyZ2UnYCAg4oCUIGBkZWVwU21hcnRNZXJnZWAgb2YgdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVzW3BhdGhdYCBkZWx0YSBvbnRvXG4gKiAgICAgdGhlIHZhbHVlIGJlZm9yZS5cbiAqICAgLSBgJ2FwcGVuZCdgIOKAlCAoZGVsdGEgbW9kZSkgYG92ZXJ3cml0ZVtwYXRoXWAgaG9sZHMgT05MWSB0aGUgdGFpbDogY29uY2F0ZW5hdGVcbiAqICAgICBpdCBvbnRvIHRoZSB2YWx1ZSBiZWZvcmUuIFdoZW4gZWl0aGVyIGlzIG5vdCBhbiBhcnJheSAoYW4gb3V0LW9mLW9yZGVyXG4gKiAgICAgcmVwbGF5IGJhc2UsIG9yIGEgUkVEQUNURUQgdGFpbCDigJQgYHNjcnViUGF0Y2hgIHJlcGxhY2VzIG1hdGNoZWQgcGF5bG9hZHNcbiAqICAgICB3aXRoIHRoZSBgJ1JFREFDVEVEJ2Agc3RyaW5nKSB0aGUgdGFpbCBCRUNPTUVTIHRoZSB2YWx1ZSDigJQgdGhlIHNhbWVcbiAqICAgICB0ZXJtaW5hbCB2YWx1ZSBhIHJlZGFjdGVkIG9yIGNvcnJ1cHQgYHNldGAgcHJvZHVjZXMuXG4gKiAgIC0gYCdkZWxldGUnYCDigJQge0BsaW5rIEFCU0VOVH06IHRoZSBrZXkgaXMgcmVtb3ZlZC4gVGhlIHBhdGggc3RheXMgZW51bWVyYXRlZFxuICogICAgIGluIGBvdmVyd3JpdGVgICh2YWx1ZSBgdW5kZWZpbmVkYCkgZm9yIGtleS1zZXQgY29uc3VtZXJzOyB0aGUgc3RlcCBpZ25vcmVzXG4gKiAgICAgdGhhdCB2YWx1ZS5cbiAqXG4gKiBQdXJlOiBpdCByZWFkcyB0aGUgcGF5bG9hZCBhbmQgbmV2ZXIgd3JpdGVzLiBgdmVyYmAgbXVzdCBiZSBhIHtAbGluayBWZXJifVxuICogKHRoZSBmb2xkcyBjaGVjayB3aXRoIHtAbGluayBpc1ZlcmJ9IGZpcnN0IGFuZCBuYW1lIHRoZSByb3cpOyBhbnl0aGluZyBlbHNlXG4gKiB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VmVyYih2ZXJiOiBWZXJiLCBiZWZvcmU6IHVua25vd24sIGF0OiBSZWNvcmRlZFBheWxvYWQsIHNlZ3M6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gIGlmICh2ZXJiID09PSAnc2V0JykgcmV0dXJuIGF0LnZhbHVlKHNlZ3MpO1xuICBpZiAodmVyYiA9PT0gJ2FwcGVuZCcpIHtcbiAgICBjb25zdCB0YWlsID0gYXQudmFsdWUoc2Vncyk7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYmVmb3JlKSAmJiBBcnJheS5pc0FycmF5KHRhaWwpID8gWy4uLmJlZm9yZSwgLi4udGFpbF0gOiB0YWlsO1xuICB9XG4gIGlmICh2ZXJiID09PSAnZGVsZXRlJykgcmV0dXJuIEFCU0VOVDtcbiAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHJldHVybiBkZWVwU21hcnRNZXJnZShiZWZvcmUsIGF0LmRlbHRhKHNlZ3MpKTtcbiAgcmV0dXJuIHJlZnVzZVZlcmIodmVyYik7IC8vIGB2ZXJiYCBpcyBgbmV2ZXJgIGhlcmUg4oCUIGEgZmlmdGggdmVyYiBpbiB0aGUgdW5pb24gc3RvcHMgY29tcGlsaW5nXG59XG5cbi8qKiBQdXQgYSBzdGVwJ3MgdmFsdWUgYXQgaXRzIHBhdGggaW4gYG91dGAg4oCUIG9yIHJlbW92ZSB0aGUga2V5LCBmb3Ige0BsaW5rIEFCU0VOVH0uICovXG5leHBvcnQgZnVuY3Rpb24gcGxhY2VWZXJiKG91dDogYW55LCBzZWdzOiBzdHJpbmdbXSwgbmV4dDogdW5rbm93bik6IHZvaWQge1xuICBpZiAobmV4dCA9PT0gQUJTRU5UKSBuYXRpdmVEZWxldGUob3V0LCBzZWdzKTtcbiAgZWxzZSBuYXRpdmVTZXQob3V0LCBzZWdzLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBJcyByb3cgYGlgIGEgYHNldGAgdGhhdCB0aGUgTkVYVCByb3cgc2V0cyBhZ2FpbiDigJQgc2FtZSBwYXRoLCBzYW1lIHZlcmIg4oCUIHNvXG4gKiB0aGF0IGFwcGx5aW5nIGl0IGlzIHdvcmsgdGhlIG5leHQgcm93IHJlZG9lcz9cbiAqXG4gKiBUaGUgb25lIHNraXAgZXZlcnkgcmVwbGF5IGl0ZXJhdG9yIHNoYXJlcyAoOS4yMi4xKS4gQSBgc2V0YCByb3cgd3JpdGVzIGFcbiAqIGNsb25lIG9mIHRoZSByZWNvcmRlZCB2YWx1ZSBhdCBpdHMgcGF0aDsgdGhlIG5leHQgcm93LCBhIGBzZXRgIG9mIHRoZSBzYW1lXG4gKiBwYXRoLCB3cml0ZXMgYSBjbG9uZSBvZiB0aGUgU0FNRSByZWNvcmRlZCB2YWx1ZSBvdmVyIGl0ICh0aGUgYnVuZGxlJ3MgcGF0Y2hcbiAqIHRyZWUgaXMgZml4ZWQpLCBhbmQgbm90aGluZyBydW5zIGluIGJldHdlZW4g4oCUIHNvIHRoZSBmaXJzdCB3cml0ZSBpc1xuICogdW5vYnNlcnZhYmxlLCBjb250YWluZXIgY3JlYXRpb24gYW5kIGtleSBvcmRlciBpbmNsdWRlZC4gT25seSBDT05TRUNVVElWRVxuICogcm93cyBxdWFsaWZ5OiBhIHJvdyBpbiBiZXR3ZWVuIChhbiBhbmNlc3RvciBgbWVyZ2VgLCBhIHNpYmxpbmcgYHNldGAgdGhhdFxuICogY3JlYXRlcyBhIGNvbnRhaW5lcikgY2FuIHNlZSB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlLCBhbmQgYSBgbWVyZ2VgLFxuICogYGFwcGVuZGAgb3IgYGRlbGV0ZWAgbmV4dCByb3cgZGVwZW5kcyBvbiB3aGF0IGlzIHRoZXJlLiBSb3dzIGFyZSBuZXZlclxuICogZHJvcHBlZCBmcm9tIHRoZSBsb2cg4oCUIHRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgcmVjb3JkcyBOXG4gKiB3aG9sZS1hcnJheSBgc2V0YCByb3dzIG9uIG9uZSBwYXRoLCBhbmQgdGhpcyBpcyB3aGF0IG1ha2VzIHJlcGxheWluZyB0aGVtXG4gKiBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHJvd3MpLlxuICpcbiAqIEFza2VkIGJ5IHtAbGluayBmb2xkUm93c30g4oCUIGxpdmUgc3RhdGUgYW5kIHRoZSByZWRhY3RlZCBtaXJyb3IgdGhyb3VnaFxuICoge0BsaW5rIG5leHRHZW5lcmF0aW9ufSwgYEV2ZW50TG9nLm1hdGVyaWFsaXNlYCBhbmQgYHN0YXRlQXRgIHRocm91Z2hcbiAqIHtAbGluayBhcHBseVNtYXJ0TWVyZ2VJbnRvfSwgdGhlIHB1YmxpYyB7QGxpbmsgYXBwbHlTbWFydE1lcmdlfSwgYW5kIHRoZVxuICogYWRtaXR0ZWQgcmVjb3JkJ3Mge0BsaW5rIGRyeUZvbGR9LiB7QGxpbmsgZm9sZEtleX0gbmVlZHMgbm8gc2tpcDogaXRcbiAqIGFuY2hvcnMgYXQgdGhlIHRvcC1sZXZlbCBrZXkncyBMQVNUIGBzZXRgL2BkZWxldGVgLCBvciAocHJvdmVuYW5jZSkgYVxuICogcmVwZWF0ZWQgYHNldGAgb2YgdGhlIG9uZSByZWNvcmRlZCB2YWx1ZSBjaGFuZ2VzIG5vIGJpcnRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJzZWRlZEJ5TmV4dFNldChyb3dzOiByZWFkb25seSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nIH1bXSwgaTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gIGlmIChyb3cudmVyYiAhPT0gJ3NldCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmV4dCA9IHJvd3NbaSArIDFdO1xuICByZXR1cm4gbmV4dCAhPT0gdW5kZWZpbmVkICYmIG5leHQudmVyYiA9PT0gJ3NldCcgJiYgbmV4dC5wYXRoID09PSByb3cucGF0aDtcbn1cblxuLy8g4pSA4pSA4pSAIFRoZSBmb2xkIG92ZXIgb25lIGJ1bmRsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBIb3cge0BsaW5rIGZvbGRSb3dzfSB0cmVhdHMgdGhlIHN0YXRlIGl0IGVkaXRzIGFuZCB0aGUgdmFsdWVzIGl0IHJlYWRzIG91dCBvZlxuICogdGhlIGxvZyDigJQgdGhlIGNsb25lIGRpc2NpcGxpbmUsIGEgcGFyYW1ldGVyIG9mIHRoZSBPTkUgbG9vcDpcbiAqXG4gKiAgIC0gYCdwcml2YXRlJ2Ag4oCUIGBvdXRgIGlzIGEgcHJpdmF0ZSBkZWVwIGNsb25lLCBlZGl0ZWQgaW4gcGxhY2U7IGV2ZXJ5XG4gKiAgICAgcmVjb3JkZWQgdmFsdWUgaXMgY2xvbmVkIGluLiBUaGUgcHVibGljIHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9LlxuICogICAtIGAncGF0aENvcHknYCDigJQgY29weS1vbi13cml0ZSAoOS4yOS4wKTogYmVmb3JlIGEgcm93IHRoYXQgd3JpdGVzIFRIUk9VR0ggYVxuICogICAgIGNvbnRhaW5lciAoYSBuZXN0ZWQgcGF0aCksIHRoZSBjb250YWluZXJzIG9uIGl0cyBwYXRoIHRoYXQgdGhpcyBmb2xkIGRpZFxuICogICAgIG5vdCBjcmVhdGUgYXJlIGNvcGllZCwgc28gbm8gcm93IGVkaXRzIGEgY29udGFpbmVyIGFub3RoZXIgZ2VuZXJhdGlvblxuICogICAgIChvciB0aGUgbG9nKSBob2xkczsgZWFjaCB2YWx1ZSBhIHJvdyBjcmVhdGVzIGlzIG1hcmtlZCBvd25lZCwgc28gbGF0ZXJcbiAqICAgICByb3dzIG9mIHRoZSBidW5kbGUgd3JpdGUgaW50byBpdCBpbiBwbGFjZS4gRXZlcnkgcmVjb3JkZWQgdmFsdWUgaXMgY2xvbmVkXG4gKiAgICAgaW4uIFRoZSBsaXZlIGNvbW1pdCAoe0BsaW5rIG5leHRHZW5lcmF0aW9ufSkgYW5kIHRoZSByZWFkLXNpZGUgZm9sZHNcbiAqICAgICAoe0BsaW5rIGFwcGx5U21hcnRNZXJnZUludG99KS5cbiAqICAgLSBgJ2J5UmVmZXJlbmNlJ2Ag4oCUIGAncGF0aENvcHknYCwgYnV0IHJlY29yZGVkIHZhbHVlcyBhcmUgcGxhY2VkIEFTXG4gKiAgICAgUkVDT1JERUQgKG5vIGNsb25lKSBhbmQgbmV2ZXIgbWFya2VkIG93bmVkIOKAlCBhIGxhdGVyIHJvdyB0aGF0IHdyaXRlc1xuICogICAgIHRocm91Z2ggb25lIGNvcGllcyBpdCBmaXJzdCwgc28gdGhlIHBheWxvYWQgaXMgbmV2ZXIgZWRpdGVkLiBGb3JcbiAqICAgICBDT01QQVJJU09OIG9ubHkgKHtAbGluayBkcnlGb2xkfSk6IHRoZSByZXN1bHQgYWxpYXNlcyB0aGUgbG9nLlxuICovXG5leHBvcnQgdHlwZSBEaXNjaXBsaW5lID0gJ3ByaXZhdGUnIHwgJ3BhdGhDb3B5JyB8ICdieVJlZmVyZW5jZSc7XG5cbi8qKiBEb2VzIGFueSByb3cgd3JpdGUgVEhST1VHSCBhIGNvbnRhaW5lciAoYSBkZWxpbWl0ZWQsIG5lc3RlZCBwYXRoKT8gKi9cbmZ1bmN0aW9uIGhhc05lc3RlZFJvdyhyb3dzOiByZWFkb25seSBUcmFjZUVudHJ5W10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSBpZiAocm93c1tpXS5wYXRoLmluZGV4T2YoREVMSU0pICE9PSAtMSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBGb2xkIG9uZSBidW5kbGUncyByb3dzIGludG8gYG91dGAsIGluIHBsYWNlOiBmb3IgZWFjaCByb3cgKGEgYHNldGAgdGhlIG5leHRcbiAqIHJvdyBzZXRzIGFnYWluIGlzIHNraXBwZWQg4oCUIHtAbGluayBzdXBlcnNlZGVkQnlOZXh0U2V0fSkgdGFrZSB0aGUgc3RlcFxuICogKHtAbGluayBhcHBseVZlcmJ9KSBhbmQgcHV0IGl0cyB2YWx1ZSB3aGVyZSBpdCBiZWxvbmdzICh7QGxpbmsgcGxhY2VWZXJifSkuXG4gKiBgb3V0YCBpcyB0aGUgY2FsbGVyJ3Mg4oCUIHNlZSB7QGxpbmsgRGlzY2lwbGluZX0gZm9yIHdoYXQgaXQgbXVzdCBiZS5cbiAqXG4gKiBBIHJvdyB3aG9zZSB2ZXJiIGlzIG5vdCBvbmUgb2Yge0BsaW5rIFZFUkJTfSBzdG9wcyB0aGUgZm9sZCB3aXRoXG4gKiB7QGxpbmsgVW5rbm93blZlcmJFcnJvcn0gbmFtaW5nIHRoZSByb3c7IHRoZSByb3dzIGJlZm9yZSBpdCBoYXZlIGJlZW5cbiAqIGFwcGxpZWQsIHRvIGEgc3RhdGUgdGhlIGNhbGxlciBkaXNjYXJkcyAoZXZlcnkgaW4tdHJlZSBjYWxsZXIgZG9lcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkUm93cyhcbiAgb3V0OiBhbnksXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLFxuICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICByb3dzOiByZWFkb25seSBUcmFjZUVudHJ5W10sXG4gIGRpc2NpcGxpbmU6IERpc2NpcGxpbmUsXG4pOiBhbnkge1xuICBjb25zdCBkZXRhY2ggPSBkaXNjaXBsaW5lICE9PSAnYnlSZWZlcmVuY2UnO1xuICBjb25zdCBvd25lZCA9IGRpc2NpcGxpbmUgIT09ICdwcml2YXRlJyAmJiBoYXNOZXN0ZWRSb3cocm93cykgPyBuZXcgV2Vha1NldDxvYmplY3Q+KCkgOiB1bmRlZmluZWQ7XG4gIG93bihvdXQsIG93bmVkKTtcbiAgY29uc3QgYXQgPSBuZXcgUmVjb3JkZWRQYXlsb2FkKHVwZGF0ZXMsIG92ZXJ3cml0ZSwgZGV0YWNoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN1cGVyc2VkZWRCeU5leHRTZXQocm93cywgaSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHsgcGF0aCwgdmVyYiB9ID0gcm93c1tpXTtcbiAgICBpZiAoIWlzVmVyYih2ZXJiKSkgdGhyb3cgbmV3IFVua25vd25WZXJiRXJyb3IodmVyYiwgeyBwYXRoLCByb3c6IGkgfSk7XG4gICAgY29uc3Qgc2VncyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIHNlZ3MubGVuZ3RoID4gMSkgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCk7XG4gICAgLy8gQSB0b3RhbCB2ZXJiIHJlYWRzIG5vdGhpbmcgZnJvbSB3aGF0IGNhbWUgYmVmb3JlIGl0IChpc1RvdGFsKSDigJQgc28gdGhlXG4gICAgLy8gZm9sZCBkb2VzIG5vdCBsb29rLlxuICAgIGNvbnN0IG5leHQgPSBhcHBseVZlcmIodmVyYiwgaXNUb3RhbCh2ZXJiKSA/IHVuZGVmaW5lZCA6IG5hdGl2ZUdldChvdXQsIHNlZ3MpLCBhdCwgc2Vncyk7XG4gICAgLy8gQSB2YWx1ZSB0aGlzIGZvbGQgQ1JFQVRFRCBpcyBpdHMgb3duIHRvIGVkaXQgaW4gcGxhY2U7IGEgcmVjb3JkZWQgdmFsdWVcbiAgICAvLyBwbGFjZWQgYnkgcmVmZXJlbmNlIGlzIHRoZSBsb2cncy5cbiAgICBpZiAoZGV0YWNoIHx8IHZlcmIgPT09ICdtZXJnZScpIG93bihuZXh0LCBvd25lZCk7XG4gICAgcGxhY2VWZXJiKG91dCwgc2VncywgbmV4dCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSB0byBhIGJhc2Ugc3RhdGUgYnkgcmVwbGF5aW5nIG9wZXJhdGlvbnMgaW4gb3JkZXIuXG4gKiBHdWFyYW50ZWVzIFwibGFzdCB3cml0ZXIgd2luc1wiIHNlbWFudGljcy5cbiAqXG4gKiBSZXR1cm5zIGEgRlVMTFkgREVUQUNIRUQgcmVzdWx0OiB0aGUgYmFzZSBpcyBkZWVwLWNsb25lZCBmaXJzdCBhbmQgZXZlcnlcbiAqIHZhbHVlIHRoZSByZXBsYXkgd3JpdGVzIGlzIGl0cyBvd24gKGBzZXRgIC8gYGFwcGVuZGAgY2xvbmUgdGhlIHJlY29yZGVkXG4gKiB2YWx1ZTsgdGhlIGBtZXJnZWAgYXJtIHJlYWRzIGEgZGV0YWNoZWQgY29weSBvZiBgdXBkYXRlc2ApLCBzbyB0aGUgcmVzdWx0XG4gKiBzaGFyZXMgbm8gY29udGFpbmVyIHdpdGggYGJhc2VgLCBgdXBkYXRlc2Agb3IgYG92ZXJ3cml0ZWAuIFRoaXMgaXMgdGhlXG4gKiBwdWJsaWMgKGBmb290cHJpbnRqcy9hZHZhbmNlZGApIGNvbnRyYWN0LCB1bmNoYW5nZWQgYnkgY29weS1vbi13cml0ZVxuICogKDkuMjkuMCkg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIDkuMjguMCBmb3IgZXZlcnkgY2FsbGVyLiBUaGUgZW5naW5lJ3Mgb3duXG4gKiBjb21taXQgZG9lcyBOT1QgY29tZSBoZXJlOiBgU2hhcmVkTWVtb3J5LmFwcGx5UGF0Y2hgIGJ1aWxkcyB0aGUgbmV4dFxuICogZ2VuZXJhdGlvbiB3aXRoIGBuZXh0R2VuZXJhdGlvbmAsIHdoaWNoIGNvcGllcyBvbmx5IHRoZSB3cml0dGVuXG4gKiBwYXRocy4gQm90aCBydW4gdGhlIE9ORSBmb2xkLCB7QGxpbmsgZm9sZFJvd3N9OyB0aGUgdmVyYnMgYXJlXG4gKiB7QGxpbmsgYXBwbHlWZXJifSdzLlxuICpcbiAqIFZlcmIgYXJtcyDigJQgc2VlIHtAbGluayBhcHBseVZlcmJ9LiBBIHJvdyB3aXRoIGFueSBvdGhlciB2ZXJiIHRocm93c1xuICoge0BsaW5rIFVua25vd25WZXJiRXJyb3J9LlxuICpcbiAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogYSBgc2V0YCByb3cgdGhlIE5FWFQgcm93IHJlLXNldHMgaXMgc2tpcHBlZFxuICogKHtAbGluayBzdXBlcnNlZGVkQnlOZXh0U2V0fSkg4oCUIHRoZSByb3dzIHN0YXkgaW4gdGhlIGxvZywgb25seSB0aGUgY2xvbmVcbiAqIGVhY2ggd291bGQgaGF2ZSBwYWlkIGlzIG5vdC4gRXZlcnkgY29uc3VtZXIgaW5oZXJpdHMgdGhlIHNraXAgZnJvbVxuICogYGZvbGRSb3dzYDsgdGhlcmUgaXMgbm8gc2Vjb25kIHJlcGxheSBsb29wIHRvIGtlZXAgaW4gc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U21hcnRNZXJnZShiYXNlOiBhbnksIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogYW55IHtcbiAgcmV0dXJuIGZvbGRSb3dzKHN0cnVjdHVyZWRDbG9uZShiYXNlKSwgdXBkYXRlcywgb3ZlcndyaXRlLCB0cmFjZSwgJ3ByaXZhdGUnKTtcbn1cblxuLyoqXG4gKiBUaGUgZW5naW5lJ3MgY29tbWl0IChjb3B5LW9uLXdyaXRlLCA5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi1cbiAqIHdyaXRlLWNvbW1pdC5tZCk6IHRoZSBORVhUIGNvbW1pdHRlZCBnZW5lcmF0aW9uLiBBIGNvcHkgb2YgYGJhc2VgJ3MgUk9PVFxuICogcGx1cyBhIGNvcHkgb2YgZXZlcnkgY29udGFpbmVyIG9uIGVhY2ggd3JpdHRlbiBwYXRoOyBldmVyeSBvdGhlciBzdWJ0cmVlXG4gKiBpcyBTSEFSRUQgd2l0aCBgYmFzZWAsIHdoaWNoIGlzIG5ldmVyIGVkaXRlZCDigJQgY29tbWl0dGVkIHN0YXRlIGlzXG4gKiBpbW11dGFibGUtYWZ0ZXItc3dhcCwgc28gc2hhcmluZyBpcyBzYWZlLCBhbmQgYSBjb21taXQgY29zdHMgTyh3aGF0IGl0XG4gKiB3cm90ZSksIG5vdCBPKHN0YXRlKS4gYFNoYXJlZE1lbW9yeS5hcHBseVBhdGNoYCAobGl2ZSBzdGF0ZSBhbmQgdGhlXG4gKiByZWRhY3RlZCBtaXJyb3IpIGlzIGl0cyBjYWxsZXIuIEludGVybmFsOiB0aGUgcHVibGljIHJlcGxheSBpc1xuICoge0BsaW5rIGFwcGx5U21hcnRNZXJnZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0R2VuZXJhdGlvbihiYXNlOiBhbnksIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogYW55IHtcbiAgcmV0dXJuIGZvbGRSb3dzKG93bmVkUm9vdE9mKGJhc2UpLCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlLCAncGF0aENvcHknKTtcbn1cblxuLyoqXG4gKiBUaGUgc2FtZSByZXBsYXksIElOVE8gYHRhcmdldGAg4oCUIG5vIGNsb25lIG9mIGl0cyBvd24uIEZvciBhIGNhbGxlciB0aGF0XG4gKiBhbHJlYWR5IGhvbGRzIGEgcHJpdmF0ZSB3b3JraW5nIGNvcHkgKHRoZSByZWFkLXNpZGUgZm9sZHM6IGBzdGF0ZUF0YCBpblxuICogYHRpbWUtdHJhdmVsL3N0YXRlQXQudHNgIGFuZCBgRXZlbnRMb2cubWF0ZXJpYWxpc2VgIGNsb25lIHRoZWlyIGJhc2UgT05DRVxuICogYW5kIHRoZW4gYXBwbHkgZXZlcnkgYnVuZGxlIGhlcmUpLCBzbyBhIGZvbGQgb3ZlciBOIGJ1bmRsZXMgY29zdHMgTiByb3dcbiAqIGFwcGxpY2F0aW9ucywgbm90IE4gY2xvbmVzIG9mIHRoZSB3aG9sZSBzdGF0ZS4gTmV2ZXIgaGFuZCBpdCBjb21taXR0ZWRcbiAqIHN0YXRlOiBpdCBtdXRhdGVzIHRoZSBST09UIGluIHBsYWNlLiBCZWxvdyB0aGUgcm9vdCBpdCBmb2xsb3dzIHRoZSBsaXZlXG4gKiBjb21taXQncyBsYXcgKHtAbGluayBuZXh0R2VuZXJhdGlvbn0pIOKAlCBhIGNvbnRhaW5lciB0aGlzIGNhbGwgZGlkIG5vdFxuICogY3JlYXRlIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCDigJQgc28gYSBmb2xkIGFuZCB0aGUgbGl2ZVxuICogc3RhdGUgZ2l2ZSB0aGUgc2FtZSB2YWx1ZSBhdCBldmVyeSBwYXRoLCBhbGlhc2VkIHN1YnRyZWVzIGluY2x1ZGVkLlxuICogVGhlIHZhbHVlcyBpdCB3cml0ZXMgYXJlIGl0cyBvd24sIHNvIGB0YXJnZXRgIG5ldmVyIGFsaWFzZXMgdGhlIGxvZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U21hcnRNZXJnZUludG8oXG4gIHRhcmdldDogYW55LFxuICB1cGRhdGVzOiBNZW1vcnlQYXRjaCxcbiAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCxcbiAgdHJhY2U6IFRyYWNlRW50cnlbXSxcbik6IGFueSB7XG4gIHJldHVybiBmb2xkUm93cyh0YXJnZXQsIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UsICdwYXRoQ29weScpO1xufVxuXG4vKipcbiAqIFRoZSBmb2xkLCBmb3IgQ09NUEFSSVNPTiBvbmx5ICg5LjMwLjAg4oCUIHRoZSBhZG1pdHRlZCByZWNvcmQpOiBgYmFzZWAgd2l0aFxuICogdGhlIGJ1bmRsZSByZXBsYXllZCBieSB0aGUgb25lIHZlcmIgbGF3LCBjb3B5LW9uLXdyaXRlIGJlbG93IHRoZSByb290LFxuICogZXZlcnkgcmVjb3JkZWQgdmFsdWUgcGxhY2VkIEJZIFJFRkVSRU5DRSDigJQgbm8gY2xvbmUsIHNvIGl0IGNvc3RzIHdoYXQgdGhlXG4gKiBidW5kbGUgd3JvdGUgYW5kIG5vdGhpbmcgbW9yZS4gSXQgYWxpYXNlcyB0aGUgcGF5bG9hZCBhbmQgZXZlcnkgc3VidHJlZSBvZlxuICogYGJhc2VgIHRoZSBidW5kbGUgZGlkIG5vdCB3cml0ZSwgYW5kIGVkaXRzIG5laXRoZXIuIE5ldmVyIGhhbmQgaXQgb3V0LFxuICogc3RvcmUgaXQgb3Igd3JpdGUgdGhyb3VnaCBpdDogYFRyYW5zYWN0aW9uQnVmZmVyYCBidWlsZHMgb25lIHRvIGFzayB3aGV0aGVyXG4gKiBhIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHdoYXQgdGhlIHN0YWdlIHJlYWQsIHRoZW4gZHJvcHMgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcnlGb2xkKGJhc2U6IGFueSwgdXBkYXRlczogTWVtb3J5UGF0Y2gsIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsIHRyYWNlOiBUcmFjZUVudHJ5W10pOiBhbnkge1xuICByZXR1cm4gZm9sZFJvd3Mob3duZWRSb290T2YoYmFzZSksIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UsICdieVJlZmVyZW5jZScpO1xufVxuXG4vLyDilIDilIDilIAgVGhlIGZvbGQgb3ZlciBvbmUga2V5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIE9uZSByb3cgb2YgdGhlIGxvZyB1bmRlciB0aGUgZm9sZGVkIGtleSdzIFRPUC1MRVZFTCBrZXkg4oCUIHdoYXQge0BsaW5rIGZvbGRLZXl9XG4gKiBhcHBsaWVzLCBpbiBjb21taXQgb3JkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG91Y2gge1xuICByZWFkb25seSB2ZXJiOiBWZXJiO1xuICByZWFkb25seSBidW5kbGU6IENvbW1pdEJ1bmRsZTtcbiAgLyoqIFRoZSBidW5kbGUncyBwb3NpdGlvbiBpbiB0aGUgY29tbWl0IGxvZy4gKi9cbiAgcmVhZG9ubHkgY29tbWl0SWR4OiBDb21taXRJZHg7XG4gIC8qKiBUaGUgcm93J3Mgb3duIHBhdGggKERFTElNLWpvaW5lZCBgVHJhY2VFbnRyeS5wYXRoYCkuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEhvdyB0aGUgcm93IHNpdHMgYWdhaW5zdCB0aGUgZm9sZGVkIGtleSAoYGtleVBhdGhzIMK3IHJlbGF0aW9uYCkuIEFCU0VOVCBmb3IgYVxuICAgKiByb3cgb24gYW5vdGhlciBwYXRoIHVuZGVyIHRoZSBzYW1lIHRvcC1sZXZlbCBrZXk6IHN1Y2ggYSByb3cgaXMgQVBQTElFRCAoYW5cbiAgICogYXJyYXkgdW5pb24gb24gYSBjb250YWluZXIgYWJvdmUgdGhlIGtleSBkZWR1cHMgdGhlIHdob2xlIGFycmF5LCBzbyBhIHNpYmxpbmdcbiAgICogY2hhbmdlcyB3aGVyZSBpdCBsZWF2ZXMgdGhlIGtleSkgYnV0IG5ldmVyIG9ic2VydmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpb24/OiBQYXRoUmVsYXRpb247XG59XG5cbi8qKiBXaGF0IGEgcmVhZGVyIGFza3Mgb2Yge0BsaW5rIGZvbGRLZXl9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlGb2xkIHtcbiAgLyoqXG4gICAqIFN0YXJ0IGF0IHRoZSBMQVNUIHJvdyB0aGF0IHNldHMgb3IgZGVsZXRlcyB0aGUgd2hvbGUgVE9QLUxFVkVMIGtleSAoe0BsaW5rXG4gICAqIGlzVG90YWx9LCBvbiB0aGUgcm9vdCBwYXRoIGl0c2VsZikg4oCUIHJvd3MgYmVmb3JlIGl0IGNhbm5vdCBjaGFuZ2UgYW55dGhpbmdcbiAgICogdW5kZXIgdGhhdCBrZXksIHNvIGEgcmVhZGVyIHRoYXQgd2FudHMgb25seSB0aGUgdmFsdWUgc2tpcHMgdGhlbS4gQSBgc2V0YCBvZlxuICAgKiBhIHBhdGggYmVsb3cgdGhlIHJvb3QgaXMgTk9UIGFuIGFuY2hvcjogYW4gZWFybGllciBzaWJsaW5nIGNhbiBzdGlsbCBtb3ZlXG4gICAqIHRoZSBrZXkgdGhyb3VnaCBhIGxhdGVyIHVuaW9uLiBPZmYgYnkgZGVmYXVsdDogYSByZWFkZXIgdGhhdCB0cmFja3MgaG93IHRoZVxuICAgKiB2YWx1ZSBHUkVXIG11c3Qgc2VlIGV2ZXJ5IHJvdy5cbiAgICovXG4gIHJlYWRvbmx5IGFuY2hvcmVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciBlYWNoIGFwcGxpZWQgcm93IHRoYXQgaGFzIGEge0BsaW5rIFRvdWNoLnJlbGF0aW9ufSDigJQgb24sIGluc2lkZVxuICAgKiBvciBhcm91bmQgdGhlIGtleSAoZXZlcnkgcm93LCB3aXRoIGBldmVyeVJvd2ApIOKAlCB3aXRoIHRoZSB2YWx1ZSBBVCBUSEUgS0VZIGJlZm9yZSBpdCBhbmQgYWZ0ZXIgaXRcbiAgICogKGB1bmRlZmluZWRgIGZvciBhbiBhYnNlbnQga2V5KS4gVGhlIHNlYW0gYSBwcm92ZW5hbmNlIHRyYWNrIGFuZCB0aGUgd3JpdGVyXG4gICAqIHJ1bGUgaGFuZyBvbjogdGhleSB3YXRjaCB0aGUgZm9sZCwgdGhleSBuZXZlciBoYXZlIGEgdmVyYiBzd2l0Y2ggb2YgdGhlaXJcbiAgICogb3duLiBGb3IgYSByb3cgSU5TSURFIHRoZSBrZXksIGFuIGFycmF5IGBiZWZvcmVgIGlzIGEgc2hhbGxvdyBzbmFwc2hvdDogdGhhdFxuICAgKiByb3cgZWRpdHMgdGhlIGZvbGQncyBvd24gY29weSBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2VydmU/OiAodG91Y2g6IFRvdWNoLCBiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duKSA9PiB2b2lkO1xuICAvKipcbiAgICogT2JzZXJ2ZSBFVkVSWSBhcHBsaWVkIHJvdywgbm90IG9ubHkgdGhlIGtleSdzIG93bi4gVGhlIHdyaXRlciBydWxlIG5lZWRzIGl0OiBpdCBjb21wYXJlcyB0aGUgdmFsdWUgYXQgdGhlXG4gICAqIGtleSBhY3Jvc3MgYSBXSE9MRSBjb21taXQsIGFuZCBhIHNpYmxpbmcgdW5kZXIgdGhlIHNhbWUgdG9wLWxldmVsIGtleSBjYW4gbW92ZSB0aGF0IHZhbHVlIOKAlCBhIHdyaXRlXG4gICAqIHRocm91Z2ggYSBjb250YWluZXIgdGhhdCBob2xkcyBhIHByaW1pdGl2ZSByZXBsYWNlcyB0aGUgY29udGFpbmVyIChgbmF0aXZlU2V0YCksIGFuZCB3aXRoIGl0IHRoZSBrZXkuXG4gICAqL1xuICByZWFkb25seSBldmVyeVJvdz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBLZWVwIEdFTkVSQVRJT05TIGF0IGNob3NlbiBjb21taXRzOiBgYXRgIGlzIGFza2VkIGJlZm9yZSBhIGNvbW1pdCdzIGZpcnN0IHJvdyAod2l0aCB0aGUgZm9sZCdzIHN0YXRlIGFzXG4gICAqIGl0IHN0YW5kcyk7IGZvciBhIGNvbW1pdCBpdCBhY2NlcHRzLCBga2VlcGAgaXMgaGFuZGVkIHRoZSB2YWx1ZSBhdCB0aGUga2V5IGJlZm9yZSB0aGUgY29tbWl0IGFuZCBhZnRlclxuICAgKiBpdCDigJQgY29weS1vbi13cml0ZSBhcm91bmQgdGhhdCBjb21taXQgKHRoZSBmb2xkIGRyb3BzIG93bmVyc2hpcCBvZiBldmVyeSBjb250YWluZXIgYmVmb3JlIGFuZCBhZnRlciBpdCksXG4gICAqIHNvIG5vIGxhdGVyIHJvdyBlZGl0cyBlaXRoZXIgdmFsdWUuIFRoZSB3cml0ZXIgcnVsZSdzIG1lbW9pc2VkIHJvb3QgZm9sZCAoYGNvbW1pdExvZ1V0aWxzIMK3IExvZ01vZGVsYClcbiAgICoga2VlcHMgdGhlIGNvbW1pdHMgYSBrZXkncyB2ZXJkaWN0IG5lZWRzLCBvbmNlIHBlciB0b3AtbGV2ZWwga2V5LlxuICAgKi9cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGUgdG9wLWxldmVsIGtleSBob2xkcyBCRUZPUkUgdGhlIGZpcnN0IHJvdyDigJQgZGVmYXVsdDogYWJzZW50LiBOZXZlciBlZGl0ZWQ6IHRoZSBmb2xkIGNvcGllc1xuICAgKiBpdCBiZWZvcmUgd3JpdGluZyB0aHJvdWdoIGl0LiBgY29tbWl0VmFsdWVBdGAgb24gYSBtZW1vaXNlZCBsb2cgc3RhcnRzIGZyb20gYSBrZXB0IGdlbmVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFydD86IHVua25vd247XG4gIHJlYWRvbmx5IGdlbmVyYXRpb25zPzoge1xuICAgIGF0KGNvbW1pdElkeDogbnVtYmVyLCBzdGF0ZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogYm9vbGVhbjtcbiAgICBrZWVwKGNvbW1pdElkeDogbnVtYmVyLCBiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duKTogdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdmFsdWUgb2YgT05FIGtleSBhZnRlciBgdG91Y2hlc2Ag4oCUIEVWRVJZIHJvdyB1bmRlciBpdHMgdG9wLWxldmVsIGtleSwgaW5cbiAqIGNvbW1pdCBvcmRlciwgZWFjaCBhbHJlYWR5IGNoZWNrZWQgd2l0aCB7QGxpbmsgaXNWZXJifSDigJQgZm9sZGVkIGZyb20gYW4gYWJzZW50XG4gKiBrZXksIHJlYWQgYXQgdGhlIGtleSAoYHNlZ3NgLCBpdHMgREVMSU0gc2VnbWVudHMpOiB0aGUgdmFsdWUgcnVsZSBvZlxuICogYGtleVBhdGhzLnRzYCwgdGhlIGZvbGQgYHN0YXRlQXRgIGRvZXMgcmVzdHJpY3RlZCB0byBvbmUgdG9wLWxldmVsIGtleS4gVG9wLWxldmVsXG4gKiBrZXlzIG5ldmVyIGludGVyYWN0IHVuZGVyIHRoZSBzdGVwLCBzbyB0aGUgcmVzdHJpY3Rpb24gaXMgZXhhY3QuXG4gKlxuICogVGhlIHNhbWUgc3RlcCAoe0BsaW5rIGFwcGx5VmVyYn0pIGFuZCB0aGUgc2FtZSBkaXNjaXBsaW5lIGFzIHtAbGluayBmb2xkUm93c30nc1xuICogYCdwYXRoQ29weSdgOiBgc2V0YCAvIGBhcHBlbmRgIHZhbHVlcyBhcmUgY2xvbmVzLCB0aGUgbWVyZ2UgZGVsdGEgaXMgZGV0YWNoZWRcbiAqIG9uY2UgcGVyIEJVTkRMRSAobmFycm93ZWQgdG8gdGhlIHRvcC1sZXZlbCBrZXkpLCBzbyB0d28gYG1lcmdlYCByb3dzIG9mIG9uZVxuICogYnVuZGxlIHNlZSB0aGUgc2FtZSBvYmplY3RzLCBhbmQgYSByb3cgdGhhdCB3cml0ZXMgdGhyb3VnaCBhIGNvbnRhaW5lciB0aGlzXG4gKiBmb2xkIGRpZCBub3QgY3JlYXRlIGNvcGllcyBpdCBmaXJzdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW4gYWJzZW50IGtleS5cbiAqIE8odGhlIHJvd3MgdW5kZXIgdGhlIGtleSdzIHRvcC1sZXZlbCBrZXkpLCBub3QgTyh0aGUgbG9nKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvbGRLZXkodG91Y2hlczogcmVhZG9ubHkgVG91Y2hbXSwgc2Vnczogc3RyaW5nW10sIG9wdGlvbnM6IEtleUZvbGQgPSB7fSk6IHVua25vd24ge1xuICBjb25zdCByb290ID0gc2Vnc1swXTtcbiAgbGV0IGZyb20gPSAwO1xuICBpZiAob3B0aW9ucy5hbmNob3JlZCA9PT0gdHJ1ZSkge1xuICAgIGZvciAobGV0IGkgPSB0b3VjaGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoaXNUb3RhbCh0b3VjaGVzW2ldLnZlcmIpICYmIHRvdWNoZXNbaV0ucGF0aCA9PT0gcm9vdCkge1xuICAgICAgICBmcm9tID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAob3B0aW9ucy5zdGFydCAhPT0gdW5kZWZpbmVkKSBzdGF0ZVtyb290XSA9IG9wdGlvbnMuc3RhcnQ7XG4gIGxldCBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgb3duZWQuYWRkKHN0YXRlKTtcbiAgY29uc3Qgb2JzZXJ2ZSA9IG9wdGlvbnMub2JzZXJ2ZTtcbiAgY29uc3QgZ2VuZXJhdGlvbnMgPSBvcHRpb25zLmdlbmVyYXRpb25zO1xuICBsZXQga2VwdCA9IC0xO1xuICBsZXQga2VwdEJlZm9yZTogdW5rbm93bjtcbiAgLyoqIERyb3Agb3duZXJzaGlwIG9mIGV2ZXJ5IGNvbnRhaW5lcjogdGhlIG5leHQgd3JpdGUgdGhyb3VnaCBvbmUgY29waWVzIGl0LCBzbyBhIGtlcHQgdmFsdWUgc3RheXMgYXMgaXQgaXMuICovXG4gIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgb3duZWQuYWRkKHN0YXRlKTtcbiAgfTtcbiAgbGV0IGF0OiBSZWNvcmRlZFBheWxvYWQgfCB1bmRlZmluZWQ7XG4gIGxldCBhdENvbW1pdCA9IC0xO1xuICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b3VjaCA9IHRvdWNoZXNbaV07XG4gICAgaWYgKGF0ID09PSB1bmRlZmluZWQgfHwgdG91Y2guY29tbWl0SWR4ICE9PSBhdENvbW1pdCkge1xuICAgICAgaWYgKGtlcHQgIT09IC0xKSB7XG4gICAgICAgIGdlbmVyYXRpb25zIS5rZWVwKGtlcHQsIGtlcHRCZWZvcmUsIG5hdGl2ZUdldChzdGF0ZSwgc2VncykpO1xuICAgICAgICBrZXB0ID0gLTE7XG4gICAgICAgIHJlbGVhc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIGdlbmVyYXRpb25zLmF0KHRvdWNoLmNvbW1pdElkeCwgc3RhdGUpKSB7XG4gICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAga2VwdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAga2VwdEJlZm9yZSA9IG5hdGl2ZUdldChzdGF0ZSwgc2Vncyk7XG4gICAgICB9XG4gICAgICBhdCA9IG5ldyBSZWNvcmRlZFBheWxvYWQodG91Y2guYnVuZGxlLnVwZGF0ZXMsIHRvdWNoLmJ1bmRsZS5vdmVyd3JpdGUsIHRydWUsIFtyb290XSk7XG4gICAgICBhdENvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICB9XG4gICAgY29uc3Qgcm93U2VncyA9IHRvdWNoLnBhdGggPT09IHJvb3QgPyBbcm9vdF0gOiB0b3VjaC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICBjb25zdCB3YXRjaGVkID0gb2JzZXJ2ZSAhPT0gdW5kZWZpbmVkICYmICh0b3VjaC5yZWxhdGlvbiAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuZXZlcnlSb3cgPT09IHRydWUpO1xuICAgIGxldCBiZWZvcmU6IHVua25vd247XG4gICAgaWYgKHdhdGNoZWQpIHtcbiAgICAgIGJlZm9yZSA9IG5hdGl2ZUdldChzdGF0ZSwgc2Vncyk7XG4gICAgICBpZiAodG91Y2gucmVsYXRpb24gPT09ICdpbnNpZGUnICYmIEFycmF5LmlzQXJyYXkoYmVmb3JlKSkgYmVmb3JlID0gYmVmb3JlLnNsaWNlKCk7XG4gICAgfVxuICAgIGlmIChyb3dTZWdzLmxlbmd0aCA+IDEpIG93blNwaW5lKHN0YXRlLCByb3dTZWdzLCBvd25lZCk7XG4gICAgLy8gQSB0b3RhbCB2ZXJiIHJlYWRzIG5vdGhpbmcgZnJvbSB3aGF0IGNhbWUgYmVmb3JlIGl0IChpc1RvdGFsKS5cbiAgICBjb25zdCBuZXh0ID0gYXBwbHlWZXJiKHRvdWNoLnZlcmIsIGlzVG90YWwodG91Y2gudmVyYikgPyB1bmRlZmluZWQgOiBuYXRpdmVHZXQoc3RhdGUsIHJvd1NlZ3MpLCBhdCwgcm93U2Vncyk7XG4gICAgb3duKG5leHQsIG93bmVkKTtcbiAgICBwbGFjZVZlcmIoc3RhdGUsIHJvd1NlZ3MsIG5leHQpO1xuICAgIGlmICh3YXRjaGVkKSBvYnNlcnZlKHRvdWNoLCBiZWZvcmUsIG5hdGl2ZUdldChzdGF0ZSwgc2VncykpO1xuICB9XG4gIGlmIChrZXB0ICE9PSAtMSkgZ2VuZXJhdGlvbnMhLmtlZXAoa2VwdCwga2VwdEJlZm9yZSwgbmF0aXZlR2V0KHN0YXRlLCBzZWdzKSk7XG4gIHJldHVybiBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpO1xufVxuIl19
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyYnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS92ZXJicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHOzs7QUFJSCx5Q0FBNEM7QUFDNUMsNkNBQThGO0FBQzlGLHlDQUFpRDtBQVFqRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxNQUFNLEdBQXNFO0lBQ2hGLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUNqQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7SUFDcEMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQ3BDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtDQUNyQyxDQUFDO0FBRUYsNERBQTREO0FBQy9DLFFBQUEsS0FBSyxHQUFvQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFXLENBQUMsQ0FBQztBQUVuRix5RkFBeUY7QUFDekYsU0FBZ0IsTUFBTSxDQUFDLEtBQWM7SUFDbkMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxRixDQUFDO0FBRkQsd0JBRUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixPQUFPLENBQUMsSUFBVTtJQUNoQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDNUIsQ0FBQztBQUZELDBCQUVDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixXQUFXLENBQUMsSUFBVTtJ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LENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsSUFBQSxxQkFBUSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsaUVBQWlFO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBQSxzQkFBUyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0csSUFBQSxnQkFBRyxFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQixTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLE9BQU87WUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFBLHNCQUFTLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQztRQUFFLFdBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFBLHNCQUFTLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0UsT0FBTyxJQUFBLHNCQUFTLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUExREQsMEJBMERDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB2ZXJicy50cyDigJQgVEhFIFZFUkIgTEFXIChMMSk6IHRoZSBvbmUgcGxhY2UgYSBjb21taXQgcm93IGJlY29tZXMgYSB2YWx1ZS5cbiAqXG4gKiBBIHJvdyBvZiBhIGNvbW1pdCBidW5kbGUncyBgdHJhY2VgIGNhcnJpZXMgb25lIG9mIGZvdXIgdmVyYnMg4oCUXG4gKiBgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVgIOKAlCBhbmQgT05FIHN0ZXAgdHVybnMgaXQgaW50byBhIHZhbHVlOlxuICoge0BsaW5rIGFwcGx5VmVyYn0uIFN0YXRlIGlzIGEgbGVmdCBmb2xkIG9mIHRoYXQgc3RlcCAodGhlIGV2ZW50LXNvdXJjaW5nXG4gKiByZWR1Y2VyKToge0BsaW5rIGZvbGRSb3dzfSBmb2xkcyBvbmUgYnVuZGxlJ3Mgcm93cyBpbnRvIGEgc3RhdGUsIGFuZFxuICoge0BsaW5rIGZvbGRLZXl9IGZvbGRzIE9ORSBLRVkgYWNyb3NzIGEgbG9nIOKAlCBldmVyeSByb3cgdW5kZXIgdGhlIGtleSdzXG4gKiB0b3AtbGV2ZWwga2V5LCByZWFkIGF0IHRoZSBrZXkgKHRoZSB2YWx1ZSBydWxlLCBga2V5UGF0aHMudHNgKS4gRXZlcnkgcmVhZGVyXG4gKiBvZiB0aGUgbG9nIHJ1bnMgb25lIG9mIHRoZSB0d28g4oCUXG4gKlxuICogICAtIHRoZSBsaXZlIGNvbW1pdCBhbmQgdGhlIHJlZGFjdGVkIG1pcnJvciAoYG5leHRHZW5lcmF0aW9uYCksXG4gKiAgIC0gdGhlIHB1YmxpYyByZXBsYXkgKGBhcHBseVNtYXJ0TWVyZ2VgKSwgdGhlIHJlYWQtc2lkZSBmb2xkc1xuICogICAgIChgYXBwbHlTbWFydE1lcmdlSW50b2Ag4oCUIGBFdmVudExvZy5tYXRlcmlhbGlzZWAsIGBzdGF0ZUF0YCkgYW5kIHRoZVxuICogICAgIGFkbWl0dGVkIHJlY29yZCdzIGNvbXBhcmlzb24gKGBkcnlGb2xkYCk6IGFsbCB7QGxpbmsgZm9sZFJvd3N9LFxuICogICAtIGBjb21taXRWYWx1ZUF0YCwgYW5kIGBhcnJheVByb3ZlbmFuY2VgIGFzIGFuIE9CU0VSVkVSIG9mIHRoZSBzYW1lIGZvbGQ6XG4gKiAgICAge0BsaW5rIGZvbGRLZXl9LlxuICpcbiAqIFRocmVlIHF1ZXN0aW9ucyB0aGF0IHVzZWQgdG8gYmUgYW5zd2VyZWQgb25jZSBwZXIgcmVhZGVyIGFyZSBhbnN3ZXJlZCBoZXJlXG4gKiBvbmNlOiB3aGF0IGEgdmVyYiBkb2VzIHRvIHRoZSB2YWx1ZSBiZWZvcmUgaXQgKHtAbGluayBhcHBseVZlcmJ9KSwgaG93IHRoZVxuICogcmVzdWx0IGlzIHBsYWNlZCAoe0BsaW5rIHBsYWNlVmVyYn0pLCBhbmQgaG93IHRoZSBsb2cncyBvd24gdmFsdWVzIGFyZVxuICogdHJlYXRlZCBvbiB0aGUgd2F5IGluICh0aGUgY2xvbmUgZGlzY2lwbGluZSDigJQgYSBQQVJBTUVURVIgb2YgdGhlIGZvbGQsIHNlZVxuICoge0BsaW5rIERpc2NpcGxpbmV9IGFuZCB7QGxpbmsgUmVjb3JkZWRQYXlsb2FkfSkuIEEgbmV3IHZlcmIgaXMgb25lIG5ldyBhcm0gb2ZcbiAqIGBhcHBseVZlcmJgIGFuZCBvbmUgcm93IG9mIHRoZSB0cmFpdHMgdGFibGU7IHRoZSBjb21waWxlciByZWZ1c2VzIGVpdGhlclxuICogbWlzc2luZyAoe0BsaW5rIGlzVG90YWx9LCB7QGxpbmsgcmVjb3Jkc1RhaWx9LCB7QGxpbmsgVkVSQlN9KS5cbiAqXG4gKiBBbiBVTktOT1dOIHZlcmIgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfSwgbmV2ZXIgZm9sZGVkIGFzIGFcbiAqIGBtZXJnZWAgKHRoZSBvbGQgc2lsZW50IGRlZmF1bHQpLiBFbmdpbmUtd3JpdHRlbiBsb2dzIGNhcnJ5IHRoZSBmb3VyLCBzb1xuICogZXZlcnkgZW5naW5lIHJ1biBmb2xkcyBieXRlLWZvci1ieXRlIGFzIGJlZm9yZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdElkeCB9IGZyb20gJy4uL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhSZWxhdGlvbiB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmltcG9ydCB7IG5hdGl2ZURlbGV0ZSwgbmF0aXZlR2V0LCBuYXRpdmVTZXQsIG93biwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIDilIAgVGhlIHZvY2FidWxhcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIGNvbW1pdCByb3cncyB2ZXJiIOKAlCBgVHJhY2VFbnRyeVsndmVyYiddYCwgdGhlIHVuaW9uIHRoZSB0eXBlcyBmaWxlIGRlY2xhcmVzLiAqL1xuZXhwb3J0IHR5cGUgVmVyYiA9IFRyYWNlRW50cnlbJ3ZlcmInXTtcblxuLyoqXG4gKiBUaGUgdm9jYWJ1bGFyeTogZWFjaCB2ZXJiIHdpdGggdGhlIHR3byB0cmFpdHMgcmVhZGVycyBicmFuY2ggb24sIGluIHRoZVxuICogb3JkZXIgdGhlIGNvbnRyYWN0IG5hbWVzIHRoZW0uIEEgYFJlY29yZGAgb3ZlciB0aGUgdW5pb24g4oCUIHRoZSBjb21waWxlclxuICogcmVmdXNlcyBhIHRhYmxlIHRoYXQgbWlzc2VzIChvciBpbnZlbnRzKSBhIHZlcmIsIHNvIGEgdmVyYiBjYW5ub3QgYmUgYWRkZWRcbiAqIHdpdGhvdXQgc2F5aW5nIHdoYXQgaXQgaXMuXG4gKlxuICogICBgdG90YWxgIOKAlCB0aGUgcm93IGRlY2lkZXMgdGhlIHZhbHVlIEFMT05FOyBpdCByZWFkcyBub3RoaW5nIGZyb20gd2hhdCBjYW1lXG4gKiAgICAgYmVmb3JlIGl0ICh7QGxpbmsgaXNUb3RhbH0pLlxuICogICBgdGFpbGAgIOKAlCB0aGUgcm93IHJlY29yZHMgT05MWSB3aGF0IGl0IGFkZHMsIG5vdCB0aGUgd2hvbGUgdmFsdWVcbiAqICAgICAoe0BsaW5rIHJlY29yZHNUYWlsfSkuXG4gKi9cbmNvbnN0IFRSQUlUUzogUmVjb3JkPFZlcmIsIHsgcmVhZG9ubHkgdG90YWw6IGJvb2xlYW47IHJlYWRvbmx5IHRhaWw6IGJvb2xlYW4gfT4gPSB7XG4gIHNldDogeyB0b3RhbDogdHJ1ZSwgdGFpbDogZmFsc2UgfSxcbiAgbWVyZ2U6IHsgdG90YWw6IGZhbHNlLCB0YWlsOiBmYWxzZSB9LFxuICBhcHBlbmQ6IHsgdG90YWw6IGZhbHNlLCB0YWlsOiB0cnVlIH0sXG4gIGRlbGV0ZTogeyB0b3RhbDogdHJ1ZSwgdGFpbDogZmFsc2UgfSxcbn07XG5cbi8qKiBUaGUgZm91ciB2ZXJicywgaW4gdGhlIG9yZGVyIHRoZSBjb250cmFjdCBuYW1lcyB0aGVtLiAqL1xuZXhwb3J0IGNvbnN0IFZFUkJTOiByZWFkb25seSBWZXJiW10gPSBPYmplY3QuZnJlZXplKE9iamVjdC5rZXlzKFRSQUlUUykgYXMgVmVyYltdKTtcblxuLyoqIElzIGB2YWx1ZWAgb25lIG9mIHRoZSBmb3VyPyBUaGUgcXVlc3Rpb24gZXZlcnkgcmVhZGVyIG9mIGEgZm9yZWlnbiBsb2cgYXNrcyBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcmIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJiIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFRSQUlUUywgdmFsdWUpO1xufVxuXG4vKipcbiAqIERvZXMgdGhlIHZlcmIgZGVjaWRlIHRoZSB2YWx1ZSBBTE9ORSDigJQgcmVhZCBub3RoaW5nIGZyb20gd2hhdCBjYW1lIGJlZm9yZVxuICogaXQ/IGBzZXRgIGFuZCBgZGVsZXRlYC4gQSByZWFkZXIgdGhhdCBvbmx5IG5lZWRzIHRoZSBmaW5hbCB2YWx1ZSBtYXkgc3RhcnRcbiAqIGF0IHRoZSBsYXN0IHN1Y2ggcm93ICh7QGxpbmsgZm9sZEtleX0gYGFuY2hvcmVkYCk7IG9uZSB0aGF0IHRyYWNrcyBob3cgdGhlXG4gKiB2YWx1ZSBncmV3IChwcm92ZW5hbmNlKSBzdGFydHMgYXQgdGhlIGZpcnN0LiBQaW5uZWQgYWdhaW5zdFxuICoge0BsaW5rIGFwcGx5VmVyYn0gaXRzZWxmLCBzbyBhIG5ldyB2ZXJiIGNhbm5vdCBtaXNyZXBvcnQgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RvdGFsKHZlcmI6IFZlcmIpOiBib29sZWFuIHtcbiAgcmV0dXJuIFRSQUlUU1t2ZXJiXS50b3RhbDtcbn1cblxuLyoqXG4gKiBEb2VzIHRoZSByb3cgcmVjb3JkIE9OTFkgd2hhdCBpdCBhZGRzIOKAlCBhIHRhaWwg4oCUIHJhdGhlciB0aGFuIHRoZSB3aG9sZVxuICogdmFsdWU/IGBhcHBlbmRgLiBXaGF0IHRoZSByb3cgYWRkZWQgaXMgdGhlbiBrbm93biBleGFjdGx5OiBhIHJlYWRlciB0aGF0XG4gKiB0cmFja3Mgd2hlcmUgYXJyYXkgZWxlbWVudHMgY2FtZSBmcm9tIGF0dHJpYnV0ZXMgdGhlbSB0byB0aGlzIHJvdyB3aXRob3V0XG4gKiBjb21wYXJpbmcgYXJyYXlzLCB3aGVyZSBldmVyeSBvdGhlciB2ZXJiIGhhcyB0byBiZSBpbmZlcnJlZCBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3Jkc1RhaWwodmVyYjogVmVyYik6IGJvb2xlYW4ge1xuICByZXR1cm4gVFJBSVRTW3ZlcmJdLnRhaWw7XG59XG5cbi8qKiBXaGVyZSBpbiBhIGxvZyBhIHJlZnVzZWQgcm93IHNpdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvd1NpdGUge1xuICAvKiogVGhlIHJvdydzIGBwYXRoYCwgREVMSU0tam9pbmVkIGFzIHRoZSB0cmFjZSByZWNvcmRzIGl0LiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKiBUaGUgcm93J3MgcG9zaXRpb24gaW4gaXRzIGJ1bmRsZSdzIGB0cmFjZWAuICovXG4gIHJlYWRvbmx5IHJvdzogbnVtYmVyO1xuICAvKiogVGhlIGJ1bmRsZSdzIHBvc2l0aW9uIGluIHRoZSBjb21taXQgbG9nLCB3aGVuIHRoZSByZWFkZXIga25vd3MgaXQuICovXG4gIHJlYWRvbmx5IGNvbW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgdGhlIHJlYWRlcnMgb2YgYSBjb21taXQgbG9nIOKAlCB7QGxpbmsgZm9sZFJvd3N9IChiZWhpbmRcbiAqIGBhcHBseVNtYXJ0TWVyZ2VgKSwgYGNvbW1pdFZhbHVlQXRgLCBgYXJyYXlQcm92ZW5hbmNlYCDigJQgd2hlbiBhIHJvdyBjYXJyaWVzIGFcbiAqIHZlcmIgb3V0c2lkZSB7QGxpbmsgVkVSQlN9OiBhIGZvcmVpZ24gb3IgY29ycnVwdGVkIGxvZyBmYWlscyBsb3VkbHkgaW5zdGVhZFxuICogb2YgYmVpbmcgcmVwbGF5ZWQgYXMgYSBgbWVyZ2VgLiBgdmVyYmAsIGBwYXRoYCwgYHJvd2AgYW5kIGBjb21taXRgIG5hbWUgdGhlXG4gKiByb3cgKGBwYXRoYCAvIGByb3dgIC8gYGNvbW1pdGAgYXJlIGFic2VudCB3aGVuIHRoZSBjYWxsZXIgaGFuZGVkIG92ZXIgYVxuICogYmFyZSB2ZXJiKTsgYHBhdGhgIGlzIHRoZSB0cmFjZSdzIG93biBERUxJTS1qb2luZWQgZm9ybSDigJQgdGFrZSBpdCBhcGFydCB3aXRoXG4gKiBgcGF0aFNlZ21lbnRzYC4gVGhlIG1lc3NhZ2UgcXVvdGVzIGB2ZXJiYCBhbmQgYHBhdGhgLCBzbyBhIGhvc3RpbGUgbG9nIGNhbm5vdFxuICogcmVzaGFwZSBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFVua25vd25WZXJiRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHZlcmI6IHVua25vd247XG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvdz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY29tbWl0PzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHZlcmI6IHVua25vd24sIHNpdGU/OiBSb3dTaXRlKSB7XG4gICAgY29uc3QgbmFtZWQgPVxuICAgICAgdHlwZW9mIHZlcmIgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkodmVyYikgOiB2ZXJiID09PSB1bmRlZmluZWQgPyAndW5kZWZpbmVkJyA6IGBvZiB0eXBlICR7dHlwZW9mIHZlcmJ9YDtcbiAgICAvLyBUaGUgdmVyYiBhbmQgdGhlIHBhdGggY29tZSBmcm9tIGEgbG9nIG5vYm9keSB2ZXR0ZWQ6IHF1b3RlZCAoSlNPTiksIHNvIGFcbiAgICAvLyBjb250cm9sIGNoYXJhY3RlciBpbiBlaXRoZXIgY2Fubm90IHJlc2hhcGUgdGhlIG1lc3NhZ2UuXG4gICAgY29uc3Qgd2hlcmUgPVxuICAgICAgc2l0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gJydcbiAgICAgICAgOiBgIG9uIHRyYWNlIHJvdyAke3NpdGUucm93fSAocGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGhTZWdtZW50cyhzaXRlLnBhdGgpLmpvaW4oJyDigLogJykpfSR7XG4gICAgICAgICAgICBzaXRlLmNvbW1pdCA9PT0gdW5kZWZpbmVkID8gJycgOiBgLCBjb21taXQgJHtzaXRlLmNvbW1pdH1gXG4gICAgICAgICAgfSlgO1xuICAgIGNvbnN0IG9uZSA9IFZFUkJTLmpvaW4oJyB8ICcpO1xuICAgIHN1cGVyKGB1bmtub3duIHZlcmIgJHtuYW1lZH0ke3doZXJlfTogYSBjb21taXQgcm93IGlzIG9uZSBvZiAke29uZX0g4oCUIHRoZSBsb2cgaXMgcmVmdXNlZCwgbm90IHJlcGxheWVkIGFzIGEgbWVyZ2VgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5rbm93blZlcmJFcnJvcic7XG4gICAgdGhpcy52ZXJiID0gdmVyYjtcbiAgICBpZiAoc2l0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhdGggPSBzaXRlLnBhdGg7XG4gICAgICB0aGlzLnJvdyA9IHNpdGUucm93O1xuICAgICAgaWYgKHNpdGUuY29tbWl0ICE9PSB1bmRlZmluZWQpIHRoaXMuY29tbWl0ID0gc2l0ZS5jb21taXQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnVzZVZlcmIodmVyYjogbmV2ZXIpOiBuZXZlciB7XG4gIHRocm93IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIpO1xufVxuXG4vLyDilIDilIDilIAgVGhlIHN0ZXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2hhdCBhIGBkZWxldGVgIHJvdyBsZWF2ZXMgYmVoaW5kOiB0aGUgS0VZIElTIEdPTkUg4oCUIHdoaWNoIGlzIG5vdCB0aGUgdmFsdWVcbiAqIGB1bmRlZmluZWRgIChhIHJvb3QgcmVwbGF5IHJlbW92ZXMgdGhlIGtleTsgYSBwZXItcGF0aCBmb2xkIHJlYWRzIGl0IGFzXG4gKiBgdW5kZWZpbmVkYCkuIHtAbGluayBhcHBseVZlcmJ9IHJldHVybnMgaXQsIHtAbGluayBwbGFjZVZlcmJ9IGFjdHMgb24gaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBBQlNFTlQ6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2Zvb3RwcmludGpzLnZlcmJzLmFic2VudCcpO1xuXG4vKipcbiAqIE9uZSBidW5kbGUncyByZWNvcmRlZCBwYXlsb2FkLCByZWFkIGJ5IHBhdGggdW5kZXIgYSBjbG9uZSBkaXNjaXBsaW5lIOKAlCB0aGVcbiAqIHZhbHVlcyB7QGxpbmsgYXBwbHlWZXJifSByZWFkcyBvdXQgb2YgdGhlIGxvZy5cbiAqXG4gKiBgZGV0YWNoYCDigJQgYHRydWVgIGZvciBldmVyeSBmb2xkIHRoYXQga2VlcHMgaXRzIHJlc3VsdDogYSBgc2V0YCB2YWx1ZSBvciBhblxuICogYGFwcGVuZGAgdGFpbCBpcyBhIGNsb25lIG9mIHdoYXQgdGhlIGxvZyBob2xkcyBhbmQgdGhlIG1lcmdlIGRlbHRhIGNvbWVzIGZyb21cbiAqIE9ORSBkZXRhY2hlZCBjb3B5IG9mIGB1cGRhdGVzYCwgc28gdGhlIHJlc3VsdCBuZXZlciBhbGlhc2VzIHRoZSBsb2cuIGBmYWxzZWBcbiAqIG9ubHkgZm9yIHRoZSBjb21wYXJpc29uIGZvbGQgKHtAbGluayBkcnlGb2xkfSksIHdoaWNoIHBsYWNlcyByZWNvcmRlZCB2YWx1ZXNcbiAqIGFzIHJlY29yZGVkIGFuZCBkcm9wcyBpdHMgcmVzdWx0LlxuICpcbiAqIFRoZSBkZWx0YSBpcyBkZXRhY2hlZCBPTkNFIHBlciBidW5kbGUsIGxhemlseSDigJQgYSBidW5kbGUgd2l0aCBubyBgbWVyZ2VgIHJvd1xuICogcGF5cyBub3RoaW5nLiBgZGVlcFNtYXJ0TWVyZ2VgIGRlZHVwcyBhbiBhcnJheSB1bmlvbiBCWSBSRUZFUkVOQ0UgYW5kIHR3b1xuICogYG1lcmdlYCByb3dzIG9mIG9uZSBidW5kbGUgcmVwbGF5IHRoZSBzYW1lIGFjY3VtdWxhdGVkIGRlbHRhLCBzbyB0aGUgcm93c1xuICogbXVzdCBrZWVwIHNlZWluZyB0aGUgc2FtZSBvYmplY3RzOyBhIGNsb25lIHBlciByb3cgZHVwbGljYXRlZCB0aGVpciBlbGVtZW50c1xuICogKHRoZSBkaWZmZXJlbnRpYWwgY2F1Z2h0IGl0IGluIHRoZSByZXBsYXk7IGBjb21taXRWYWx1ZUF0YCBjYXJyaWVkIHRoZSBidWdcbiAqIHVudGlsIGl0IGZvbGRlZCB0aHJvdWdoIGhlcmUpLiBgb25seWAgbmFycm93cyB0aGUgY29weSB0byBPTkUgcGF0aCDigJQgYVxuICogcGVyLXBhdGggZm9sZCByZWFkcyBub3RoaW5nIGVsc2UsIGFuZCBtdXN0IG5vdCBwYXkgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogYnVuZGxlLlxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkZWRQYXlsb2FkIHtcbiAgcHJpdmF0ZSBkZWx0YXM6IE1lbW9yeVBhdGNoIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlczogTWVtb3J5UGF0Y2gsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGV0YWNoOiBib29sZWFuLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25seT86IHN0cmluZ1tdLFxuICApIHt9XG5cbiAgLyoqIFdoYXQgYSBgc2V0YCBwbGFjZXMgYW5kIGFuIGBhcHBlbmRgIGFkZHM6IGBvdmVyd3JpdGVbcGF0aF1gLCBjbG9uZWQgd2hlbiBkZXRhY2hpbmcuICovXG4gIHZhbHVlKHNlZ3M6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gICAgY29uc3QgcmVjb3JkZWQgPSBuYXRpdmVHZXQodGhpcy5vdmVyd3JpdGUsIHNlZ3MpO1xuICAgIHJldHVybiB0aGlzLmRldGFjaCA/IHN0cnVjdHVyZWRDbG9uZShyZWNvcmRlZCkgOiByZWNvcmRlZDtcbiAgfVxuXG4gIC8qKiBUaGUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgYXQgYHBhdGhgOiBgdXBkYXRlc1twYXRoXWAsIGZyb20gdGhlIGJ1bmRsZSdzIG9uZSBjb3B5LiAqL1xuICBkZWx0YShzZWdzOiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmRlbHRhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLm9ubHkgPT09IHVuZGVmaW5lZCA/IHRoaXMudXBkYXRlcyA6IGF0UGF0aCh0aGlzLnVwZGF0ZXMsIHRoaXMub25seSk7XG4gICAgICB0aGlzLmRlbHRhcyA9IHRoaXMuZGV0YWNoID8gc3RydWN0dXJlZENsb25lKHNvdXJjZSkgOiBzb3VyY2U7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVHZXQodGhpcy5kZWx0YXMsIHNlZ3MpO1xuICB9XG59XG5cbi8qKiBgdHJlZWAgcmVkdWNlZCB0byBPTkUgcGF0aDogdGhhdCBzdWItdHJlZSwgYnkgcmVmZXJlbmNlLCB1bmRlciBmcmVzaCBjb250YWluZXJzLiAqL1xuZnVuY3Rpb24gYXRQYXRoKHRyZWU6IE1lbW9yeVBhdGNoLCBzZWdzOiBzdHJpbmdbXSk6IE1lbW9yeVBhdGNoIHtcbiAgY29uc3QgbGVhZiA9IG5hdGl2ZUdldCh0cmVlLCBzZWdzKTtcbiAgcmV0dXJuIGxlYWYgPT09IHVuZGVmaW5lZCA/IHt9IDogbmF0aXZlU2V0KHt9LCBzZWdzLCBsZWFmKTtcbn1cblxuLyoqXG4gKiBPTkUgcm93LCBPTkUgc3RlcDogdGhlIHZhbHVlIGF0IHRoZSByb3cncyBwYXRoIEFGVEVSIHRoZSByb3csIGdpdmVuIHRoZVxuICogdmFsdWUgQkVGT1JFIGl0IGFuZCB0aGUgYnVuZGxlJ3MgcmVjb3JkZWQgcGF5bG9hZC4gVEhFIHZlcmIgbGF3IOKAlCBubyBvdGhlclxuICogZnVuY3Rpb24gaW4gdGhlIGxpYnJhcnkgaGFzIGFuIGFybSBwZXIgdmVyYi5cbiAqXG4gKiAgIC0gYCdzZXQnYCAgICDigJQgdGhlIHJlY29yZGVkIHZhbHVlIChgb3ZlcndyaXRlW3BhdGhdYCwgdGhlIGZ1bGwgZmluYWwgdmFsdWUpLlxuICogICAtIGAnbWVyZ2UnYCAg4oCUIGBkZWVwU21hcnRNZXJnZWAgb2YgdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVzW3BhdGhdYCBkZWx0YSBvbnRvXG4gKiAgICAgdGhlIHZhbHVlIGJlZm9yZS5cbiAqICAgLSBgJ2FwcGVuZCdgIOKAlCAoZGVsdGEgbW9kZSkgYG92ZXJ3cml0ZVtwYXRoXWAgaG9sZHMgT05MWSB0aGUgdGFpbDogY29uY2F0ZW5hdGVcbiAqICAgICBpdCBvbnRvIHRoZSB2YWx1ZSBiZWZvcmUuIFdoZW4gZWl0aGVyIGlzIG5vdCBhbiBhcnJheSAoYW4gb3V0LW9mLW9yZGVyXG4gKiAgICAgcmVwbGF5IGJhc2UsIG9yIGEgUkVEQUNURUQgdGFpbCDigJQgYHNjcnViUGF0Y2hgIHJlcGxhY2VzIG1hdGNoZWQgcGF5bG9hZHNcbiAqICAgICB3aXRoIHRoZSBgJ1JFREFDVEVEJ2Agc3RyaW5nKSB0aGUgdGFpbCBCRUNPTUVTIHRoZSB2YWx1ZSDigJQgdGhlIHNhbWVcbiAqICAgICB0ZXJtaW5hbCB2YWx1ZSBhIHJlZGFjdGVkIG9yIGNvcnJ1cHQgYHNldGAgcHJvZHVjZXMuXG4gKiAgIC0gYCdkZWxldGUnYCDigJQge0BsaW5rIEFCU0VOVH06IHRoZSBrZXkgaXMgcmVtb3ZlZC4gVGhlIHBhdGggc3RheXMgZW51bWVyYXRlZFxuICogICAgIGluIGBvdmVyd3JpdGVgICh2YWx1ZSBgdW5kZWZpbmVkYCkgZm9yIGtleS1zZXQgY29uc3VtZXJzOyB0aGUgc3RlcCBpZ25vcmVzXG4gKiAgICAgdGhhdCB2YWx1ZS5cbiAqXG4gKiBQdXJlOiBpdCByZWFkcyB0aGUgcGF5bG9hZCBhbmQgbmV2ZXIgd3JpdGVzLiBgdmVyYmAgbXVzdCBiZSBhIHtAbGluayBWZXJifVxuICogKHRoZSBmb2xkcyBjaGVjayB3aXRoIHtAbGluayBpc1ZlcmJ9IGZpcnN0IGFuZCBuYW1lIHRoZSByb3cpOyBhbnl0aGluZyBlbHNlXG4gKiB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VmVyYih2ZXJiOiBWZXJiLCBiZWZvcmU6IHVua25vd24sIGF0OiBSZWNvcmRlZFBheWxvYWQsIHNlZ3M6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gIGlmICh2ZXJiID09PSAnc2V0JykgcmV0dXJuIGF0LnZhbHVlKHNlZ3MpO1xuICBpZiAodmVyYiA9PT0gJ2FwcGVuZCcpIHtcbiAgICBjb25zdCB0YWlsID0gYXQudmFsdWUoc2Vncyk7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYmVmb3JlKSAmJiBBcnJheS5pc0FycmF5KHRhaWwpID8gWy4uLmJlZm9yZSwgLi4udGFpbF0gOiB0YWlsO1xuICB9XG4gIGlmICh2ZXJiID09PSAnZGVsZXRlJykgcmV0dXJuIEFCU0VOVDtcbiAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHJldHVybiBkZWVwU21hcnRNZXJnZShiZWZvcmUsIGF0LmRlbHRhKHNlZ3MpKTtcbiAgcmV0dXJuIHJlZnVzZVZlcmIodmVyYik7IC8vIGB2ZXJiYCBpcyBgbmV2ZXJgIGhlcmUg4oCUIGEgZmlmdGggdmVyYiBpbiB0aGUgdW5pb24gc3RvcHMgY29tcGlsaW5nXG59XG5cbi8qKiBQdXQgYSBzdGVwJ3MgdmFsdWUgYXQgaXRzIHBhdGggaW4gYG91dGAg4oCUIG9yIHJlbW92ZSB0aGUga2V5LCBmb3Ige0BsaW5rIEFCU0VOVH0uICovXG5leHBvcnQgZnVuY3Rpb24gcGxhY2VWZXJiKG91dDogYW55LCBzZWdzOiBzdHJpbmdbXSwgbmV4dDogdW5rbm93bik6IHZvaWQge1xuICBpZiAobmV4dCA9PT0gQUJTRU5UKSBuYXRpdmVEZWxldGUob3V0LCBzZWdzKTtcbiAgZWxzZSBuYXRpdmVTZXQob3V0LCBzZWdzLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBJcyByb3cgYGlgIGEgYHNldGAgdGhhdCB0aGUgTkVYVCByb3cgc2V0cyBhZ2FpbiDigJQgc2FtZSBwYXRoLCBzYW1lIHZlcmIg4oCUIHNvXG4gKiB0aGF0IGFwcGx5aW5nIGl0IGlzIHdvcmsgdGhlIG5leHQgcm93IHJlZG9lcz9cbiAqXG4gKiBUaGUgb25lIHNraXAgZXZlcnkgcmVwbGF5IGl0ZXJhdG9yIHNoYXJlcyAoOS4yMi4xKS4gQSBgc2V0YCByb3cgd3JpdGVzIGFcbiAqIGNsb25lIG9mIHRoZSByZWNvcmRlZCB2YWx1ZSBhdCBpdHMgcGF0aDsgdGhlIG5leHQgcm93LCBhIGBzZXRgIG9mIHRoZSBzYW1lXG4gKiBwYXRoLCB3cml0ZXMgYSBjbG9uZSBvZiB0aGUgU0FNRSByZWNvcmRlZCB2YWx1ZSBvdmVyIGl0ICh0aGUgYnVuZGxlJ3MgcGF0Y2hcbiAqIHRyZWUgaXMgZml4ZWQpLCBhbmQgbm90aGluZyBydW5zIGluIGJldHdlZW4g4oCUIHNvIHRoZSBmaXJzdCB3cml0ZSBpc1xuICogdW5vYnNlcnZhYmxlLCBjb250YWluZXIgY3JlYXRpb24gYW5kIGtleSBvcmRlciBpbmNsdWRlZC4gT25seSBDT05TRUNVVElWRVxuICogcm93cyBxdWFsaWZ5OiBhIHJvdyBpbiBiZXR3ZWVuIChhbiBhbmNlc3RvciBgbWVyZ2VgLCBhIHNpYmxpbmcgYHNldGAgdGhhdFxuICogY3JlYXRlcyBhIGNvbnRhaW5lcikgY2FuIHNlZSB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlLCBhbmQgYSBgbWVyZ2VgLFxuICogYGFwcGVuZGAgb3IgYGRlbGV0ZWAgbmV4dCByb3cgZGVwZW5kcyBvbiB3aGF0IGlzIHRoZXJlLiBSb3dzIGFyZSBuZXZlclxuICogZHJvcHBlZCBmcm9tIHRoZSBsb2cg4oCUIHRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgcmVjb3JkcyBOXG4gKiB3aG9sZS1hcnJheSBgc2V0YCByb3dzIG9uIG9uZSBwYXRoLCBhbmQgdGhpcyBpcyB3aGF0IG1ha2VzIHJlcGxheWluZyB0aGVtXG4gKiBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHJvd3MpLlxuICpcbiAqIEFza2VkIGJ5IHtAbGluayBmb2xkUm93c30g4oCUIGxpdmUgc3RhdGUgYW5kIHRoZSByZWRhY3RlZCBtaXJyb3IgdGhyb3VnaFxuICoge0BsaW5rIG5leHRHZW5lcmF0aW9ufSwgYEV2ZW50TG9nLm1hdGVyaWFsaXNlYCBhbmQgYHN0YXRlQXRgIHRocm91Z2hcbiAqIHtAbGluayBhcHBseVNtYXJ0TWVyZ2VJbnRvfSwgdGhlIHB1YmxpYyB7QGxpbmsgYXBwbHlTbWFydE1lcmdlfSwgYW5kIHRoZVxuICogYWRtaXR0ZWQgcmVjb3JkJ3Mge0BsaW5rIGRyeUZvbGR9LiB7QGxpbmsgZm9sZEtleX0gbmVlZHMgbm8gc2tpcDogaXRcbiAqIGFuY2hvcnMgYXQgdGhlIHRvcC1sZXZlbCBrZXkncyBMQVNUIGBzZXRgL2BkZWxldGVgLCBvciAocHJvdmVuYW5jZSkgYVxuICogcmVwZWF0ZWQgYHNldGAgb2YgdGhlIG9uZSByZWNvcmRlZCB2YWx1ZSBjaGFuZ2VzIG5vIGJpcnRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJzZWRlZEJ5TmV4dFNldChyb3dzOiByZWFkb25seSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nIH1bXSwgaTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gIGlmIChyb3cudmVyYiAhPT0gJ3NldCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmV4dCA9IHJvd3NbaSArIDFdO1xuICByZXR1cm4gbmV4dCAhPT0gdW5kZWZpbmVkICYmIG5leHQudmVyYiA9PT0gJ3NldCcgJiYgbmV4dC5wYXRoID09PSByb3cucGF0aDtcbn1cblxuLy8g4pSA4pSA4pSAIFRoZSBmb2xkIG92ZXIgb25lIGJ1bmRsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBIb3cge0BsaW5rIGZvbGRSb3dzfSB0cmVhdHMgdGhlIHN0YXRlIGl0IGVkaXRzIGFuZCB0aGUgdmFsdWVzIGl0IHJlYWRzIG91dCBvZlxuICogdGhlIGxvZyDigJQgdGhlIGNsb25lIGRpc2NpcGxpbmUsIGEgcGFyYW1ldGVyIG9mIHRoZSBPTkUgbG9vcDpcbiAqXG4gKiAgIC0gYCdwcml2YXRlJ2Ag4oCUIGBvdXRgIGlzIGEgcHJpdmF0ZSBkZWVwIGNsb25lLCBlZGl0ZWQgaW4gcGxhY2U7IGV2ZXJ5XG4gKiAgICAgcmVjb3JkZWQgdmFsdWUgaXMgY2xvbmVkIGluLiBUaGUgcHVibGljIHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9LlxuICogICAtIGAncGF0aENvcHknYCDigJQgY29weS1vbi13cml0ZSAoOS4yOS4wKTogYmVmb3JlIGEgcm93IHRoYXQgd3JpdGVzIFRIUk9VR0ggYVxuICogICAgIGNvbnRhaW5lciAoYSBuZXN0ZWQgcGF0aCksIHRoZSBjb250YWluZXJzIG9uIGl0cyBwYXRoIHRoYXQgdGhpcyBmb2xkIGRpZFxuICogICAgIG5vdCBjcmVhdGUgYXJlIGNvcGllZCwgc28gbm8gcm93IGVkaXRzIGEgY29udGFpbmVyIGFub3RoZXIgZ2VuZXJhdGlvblxuICogICAgIChvciB0aGUgbG9nKSBob2xkczsgZWFjaCB2YWx1ZSBhIHJvdyBjcmVhdGVzIGlzIG1hcmtlZCBvd25lZCwgc28gbGF0ZXJcbiAqICAgICByb3dzIG9mIHRoZSBidW5kbGUgd3JpdGUgaW50byBpdCBpbiBwbGFjZS4gRXZlcnkgcmVjb3JkZWQgdmFsdWUgaXMgY2xvbmVkXG4gKiAgICAgaW4uIFRoZSBsaXZlIGNvbW1pdCAoe0BsaW5rIG5leHRHZW5lcmF0aW9ufSkgYW5kIHRoZSByZWFkLXNpZGUgZm9sZHNcbiAqICAgICAoe0BsaW5rIGFwcGx5U21hcnRNZXJnZUludG99KS5cbiAqICAgLSBgJ2J5UmVmZXJlbmNlJ2Ag4oCUIGAncGF0aENvcHknYCwgYnV0IHJlY29yZGVkIHZhbHVlcyBhcmUgcGxhY2VkIEFTXG4gKiAgICAgUkVDT1JERUQgKG5vIGNsb25lKSBhbmQgbmV2ZXIgbWFya2VkIG93bmVkIOKAlCBhIGxhdGVyIHJvdyB0aGF0IHdyaXRlc1xuICogICAgIHRocm91Z2ggb25lIGNvcGllcyBpdCBmaXJzdCwgc28gdGhlIHBheWxvYWQgaXMgbmV2ZXIgZWRpdGVkLiBGb3JcbiAqICAgICBDT01QQVJJU09OIG9ubHkgKHtAbGluayBkcnlGb2xkfSk6IHRoZSByZXN1bHQgYWxpYXNlcyB0aGUgbG9nLlxuICovXG5leHBvcnQgdHlwZSBEaXNjaXBsaW5lID0gJ3ByaXZhdGUnIHwgJ3BhdGhDb3B5JyB8ICdieVJlZmVyZW5jZSc7XG5cbi8qKiBEb2VzIGFueSByb3cgd3JpdGUgVEhST1VHSCBhIGNvbnRhaW5lciAoYSBkZWxpbWl0ZWQsIG5lc3RlZCBwYXRoKT8gKi9cbmZ1bmN0aW9uIGhhc05lc3RlZFJvdyhyb3dzOiByZWFkb25seSBUcmFjZUVudHJ5W10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSBpZiAocm93c1tpXS5wYXRoLmluZGV4T2YoREVMSU0pICE9PSAtMSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBGb2xkIG9uZSBidW5kbGUncyByb3dzIGludG8gYG91dGAsIGluIHBsYWNlOiBmb3IgZWFjaCByb3cgKGEgYHNldGAgdGhlIG5leHRcbiAqIHJvdyBzZXRzIGFnYWluIGlzIHNraXBwZWQg4oCUIHtAbGluayBzdXBlcnNlZGVkQnlOZXh0U2V0fSkgdGFrZSB0aGUgc3RlcFxuICogKHtAbGluayBhcHBseVZlcmJ9KSBhbmQgcHV0IGl0cyB2YWx1ZSB3aGVyZSBpdCBiZWxvbmdzICh7QGxpbmsgcGxhY2VWZXJifSkuXG4gKiBgb3V0YCBpcyB0aGUgY2FsbGVyJ3Mg4oCUIHNlZSB7QGxpbmsgRGlzY2lwbGluZX0gZm9yIHdoYXQgaXQgbXVzdCBiZS5cbiAqXG4gKiBBIHJvdyB3aG9zZSB2ZXJiIGlzIG5vdCBvbmUgb2Yge0BsaW5rIFZFUkJTfSBzdG9wcyB0aGUgZm9sZCB3aXRoXG4gKiB7QGxpbmsgVW5rbm93blZlcmJFcnJvcn0gbmFtaW5nIHRoZSByb3c7IHRoZSByb3dzIGJlZm9yZSBpdCBoYXZlIGJlZW5cbiAqIGFwcGxpZWQsIHRvIGEgc3RhdGUgdGhlIGNhbGxlciBkaXNjYXJkcyAoZXZlcnkgaW4tdHJlZSBjYWxsZXIgZG9lcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkUm93cyhcbiAgb3V0OiBhbnksXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLFxuICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICByb3dzOiByZWFkb25seSBUcmFjZUVudHJ5W10sXG4gIGRpc2NpcGxpbmU6IERpc2NpcGxpbmUsXG4pOiBhbnkge1xuICBjb25zdCBkZXRhY2ggPSBkaXNjaXBsaW5lICE9PSAnYnlSZWZlcmVuY2UnO1xuICBjb25zdCBvd25lZCA9IGRpc2NpcGxpbmUgIT09ICdwcml2YXRlJyAmJiBoYXNOZXN0ZWRSb3cocm93cykgPyBuZXcgV2Vha1NldDxvYmplY3Q+KCkgOiB1bmRlZmluZWQ7XG4gIG93bihvdXQsIG93bmVkKTtcbiAgY29uc3QgYXQgPSBuZXcgUmVjb3JkZWRQYXlsb2FkKHVwZGF0ZXMsIG92ZXJ3cml0ZSwgZGV0YWNoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN1cGVyc2VkZWRCeU5leHRTZXQocm93cywgaSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHsgcGF0aCwgdmVyYiB9ID0gcm93c1tpXTtcbiAgICBpZiAoIWlzVmVyYih2ZXJiKSkgdGhyb3cgbmV3IFVua25vd25WZXJiRXJyb3IodmVyYiwgeyBwYXRoLCByb3c6IGkgfSk7XG4gICAgY29uc3Qgc2VncyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIHNlZ3MubGVuZ3RoID4gMSkgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCk7XG4gICAgLy8gQSB0b3RhbCB2ZXJiIHJlYWRzIG5vdGhpbmcgZnJvbSB3aGF0IGNhbWUgYmVmb3JlIGl0IChpc1RvdGFsKSDigJQgc28gdGhlXG4gICAgLy8gZm9sZCBkb2VzIG5vdCBsb29rLlxuICAgIGNvbnN0IG5leHQgPSBhcHBseVZlcmIodmVyYiwgaXNUb3RhbCh2ZXJiKSA/IHVuZGVmaW5lZCA6IG5hdGl2ZUdldChvdXQsIHNlZ3MpLCBhdCwgc2Vncyk7XG4gICAgLy8gQSB2YWx1ZSB0aGlzIGZvbGQgQ1JFQVRFRCBpcyBpdHMgb3duIHRvIGVkaXQgaW4gcGxhY2U7IGEgcmVjb3JkZWQgdmFsdWVcbiAgICAvLyBwbGFjZWQgYnkgcmVmZXJlbmNlIGlzIHRoZSBsb2cncy5cbiAgICBpZiAoZGV0YWNoIHx8IHZlcmIgPT09ICdtZXJnZScpIG93bihuZXh0LCBvd25lZCk7XG4gICAgcGxhY2VWZXJiKG91dCwgc2VncywgbmV4dCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSB0byBhIGJhc2Ugc3RhdGUgYnkgcmVwbGF5aW5nIG9wZXJhdGlvbnMgaW4gb3JkZXIuXG4gKiBHdWFyYW50ZWVzIFwibGFzdCB3cml0ZXIgd2luc1wiIHNlbWFudGljcy5cbiAqXG4gKiBSZXR1cm5zIGEgRlVMTFkgREVUQUNIRUQgcmVzdWx0OiB0aGUgYmFzZSBpcyBkZWVwLWNsb25lZCBmaXJzdCBhbmQgZXZlcnlcbiAqIHZhbHVlIHRoZSByZXBsYXkgd3JpdGVzIGlzIGl0cyBvd24gKGBzZXRgIC8gYGFwcGVuZGAgY2xvbmUgdGhlIHJlY29yZGVkXG4gKiB2YWx1ZTsgdGhlIGBtZXJnZWAgYXJtIHJlYWRzIGEgZGV0YWNoZWQgY29weSBvZiBgdXBkYXRlc2ApLCBzbyB0aGUgcmVzdWx0XG4gKiBzaGFyZXMgbm8gY29udGFpbmVyIHdpdGggYGJhc2VgLCBgdXBkYXRlc2Agb3IgYG92ZXJ3cml0ZWAuIFRoaXMgaXMgdGhlXG4gKiBwdWJsaWMgKGBmb290cHJpbnRqcy90cmFjZWA7IGFsc28gYC9hZHZhbmNlZGAgdW50aWwgMTAuMC4wKSBjb250cmFjdCwgdW5jaGFuZ2VkIGJ5IGNvcHktb24td3JpdGVcbiAqICg5LjI5LjApIOKAlCBieXRlLWlkZW50aWNhbCB0byA5LjI4LjAgZm9yIGV2ZXJ5IGNhbGxlci4gVGhlIGVuZ2luZSdzIG93blxuICogY29tbWl0IGRvZXMgTk9UIGNvbWUgaGVyZTogYFNoYXJlZE1lbW9yeS5hcHBseVBhdGNoYCBidWlsZHMgdGhlIG5leHRcbiAqIGdlbmVyYXRpb24gd2l0aCBgbmV4dEdlbmVyYXRpb25gLCB3aGljaCBjb3BpZXMgb25seSB0aGUgd3JpdHRlblxuICogcGF0aHMuIEJvdGggcnVuIHRoZSBPTkUgZm9sZCwge0BsaW5rIGZvbGRSb3dzfTsgdGhlIHZlcmJzIGFyZVxuICoge0BsaW5rIGFwcGx5VmVyYn0ncy5cbiAqXG4gKiBWZXJiIGFybXMg4oCUIHNlZSB7QGxpbmsgYXBwbHlWZXJifS4gQSByb3cgd2l0aCBhbnkgb3RoZXIgdmVyYiB0aHJvd3NcbiAqIHtAbGluayBVbmtub3duVmVyYkVycm9yfS5cbiAqXG4gKiBXb3JrLCBub3QgYnl0ZXMgKDkuMjIuMSk6IGEgYHNldGAgcm93IHRoZSBORVhUIHJvdyByZS1zZXRzIGlzIHNraXBwZWRcbiAqICh7QGxpbmsgc3VwZXJzZWRlZEJ5TmV4dFNldH0pIOKAlCB0aGUgcm93cyBzdGF5IGluIHRoZSBsb2csIG9ubHkgdGhlIGNsb25lXG4gKiBlYWNoIHdvdWxkIGhhdmUgcGFpZCBpcyBub3QuIEV2ZXJ5IGNvbnN1bWVyIGluaGVyaXRzIHRoZSBza2lwIGZyb21cbiAqIGBmb2xkUm93c2A7IHRoZXJlIGlzIG5vIHNlY29uZCByZXBsYXkgbG9vcCB0byBrZWVwIGluIHN0ZXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNtYXJ0TWVyZ2UoYmFzZTogYW55LCB1cGRhdGVzOiBNZW1vcnlQYXRjaCwgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdHJhY2U6IFRyYWNlRW50cnlbXSk6IGFueSB7XG4gIHJldHVybiBmb2xkUm93cyhzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSksIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UsICdwcml2YXRlJyk7XG59XG5cbi8qKlxuICogVGhlIGVuZ2luZSdzIGNvbW1pdCAoY29weS1vbi13cml0ZSwgOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24tXG4gKiB3cml0ZS1jb21taXQubWQpOiB0aGUgTkVYVCBjb21taXR0ZWQgZ2VuZXJhdGlvbi4gQSBjb3B5IG9mIGBiYXNlYCdzIFJPT1RcbiAqIHBsdXMgYSBjb3B5IG9mIGV2ZXJ5IGNvbnRhaW5lciBvbiBlYWNoIHdyaXR0ZW4gcGF0aDsgZXZlcnkgb3RoZXIgc3VidHJlZVxuICogaXMgU0hBUkVEIHdpdGggYGJhc2VgLCB3aGljaCBpcyBuZXZlciBlZGl0ZWQg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpc1xuICogaW1tdXRhYmxlLWFmdGVyLXN3YXAsIHNvIHNoYXJpbmcgaXMgc2FmZSwgYW5kIGEgY29tbWl0IGNvc3RzIE8od2hhdCBpdFxuICogd3JvdGUpLCBub3QgTyhzdGF0ZSkuIGBTaGFyZWRNZW1vcnkuYXBwbHlQYXRjaGAgKGxpdmUgc3RhdGUgYW5kIHRoZVxuICogcmVkYWN0ZWQgbWlycm9yKSBpcyBpdHMgY2FsbGVyLiBJbnRlcm5hbDogdGhlIHB1YmxpYyByZXBsYXkgaXNcbiAqIHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dEdlbmVyYXRpb24oYmFzZTogYW55LCB1cGRhdGVzOiBNZW1vcnlQYXRjaCwgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdHJhY2U6IFRyYWNlRW50cnlbXSk6IGFueSB7XG4gIHJldHVybiBmb2xkUm93cyhvd25lZFJvb3RPZihiYXNlKSwgdXBkYXRlcywgb3ZlcndyaXRlLCB0cmFjZSwgJ3BhdGhDb3B5Jyk7XG59XG5cbi8qKlxuICogVGhlIHNhbWUgcmVwbGF5LCBJTlRPIGB0YXJnZXRgIOKAlCBubyBjbG9uZSBvZiBpdHMgb3duLiBGb3IgYSBjYWxsZXIgdGhhdFxuICogYWxyZWFkeSBob2xkcyBhIHByaXZhdGUgd29ya2luZyBjb3B5ICh0aGUgcmVhZC1zaWRlIGZvbGRzOiBgc3RhdGVBdGAgaW5cbiAqIGB0aW1lLXRyYXZlbC9zdGF0ZUF0LnRzYCBhbmQgYEV2ZW50TG9nLm1hdGVyaWFsaXNlYCBjbG9uZSB0aGVpciBiYXNlIE9OQ0VcbiAqIGFuZCB0aGVuIGFwcGx5IGV2ZXJ5IGJ1bmRsZSBoZXJlKSwgc28gYSBmb2xkIG92ZXIgTiBidW5kbGVzIGNvc3RzIE4gcm93XG4gKiBhcHBsaWNhdGlvbnMsIG5vdCBOIGNsb25lcyBvZiB0aGUgd2hvbGUgc3RhdGUuIE5ldmVyIGhhbmQgaXQgY29tbWl0dGVkXG4gKiBzdGF0ZTogaXQgbXV0YXRlcyB0aGUgUk9PVCBpbiBwbGFjZS4gQmVsb3cgdGhlIHJvb3QgaXQgZm9sbG93cyB0aGUgbGl2ZVxuICogY29tbWl0J3MgbGF3ICh7QGxpbmsgbmV4dEdlbmVyYXRpb259KSDigJQgYSBjb250YWluZXIgdGhpcyBjYWxsIGRpZCBub3RcbiAqIGNyZWF0ZSBpcyBjb3BpZWQgYmVmb3JlIGEgd3JpdGUgcGFzc2VzIHRocm91Z2ggaXQg4oCUIHNvIGEgZm9sZCBhbmQgdGhlIGxpdmVcbiAqIHN0YXRlIGdpdmUgdGhlIHNhbWUgdmFsdWUgYXQgZXZlcnkgcGF0aCwgYWxpYXNlZCBzdWJ0cmVlcyBpbmNsdWRlZC5cbiAqIFRoZSB2YWx1ZXMgaXQgd3JpdGVzIGFyZSBpdHMgb3duLCBzbyBgdGFyZ2V0YCBuZXZlciBhbGlhc2VzIHRoZSBsb2cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNtYXJ0TWVyZ2VJbnRvKFxuICB0YXJnZXQ6IGFueSxcbiAgdXBkYXRlczogTWVtb3J5UGF0Y2gsXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsXG4gIHRyYWNlOiBUcmFjZUVudHJ5W10sXG4pOiBhbnkge1xuICByZXR1cm4gZm9sZFJvd3ModGFyZ2V0LCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlLCAncGF0aENvcHknKTtcbn1cblxuLyoqXG4gKiBUaGUgZm9sZCwgZm9yIENPTVBBUklTT04gb25seSAoOS4zMC4wIOKAlCB0aGUgYWRtaXR0ZWQgcmVjb3JkKTogYGJhc2VgIHdpdGhcbiAqIHRoZSBidW5kbGUgcmVwbGF5ZWQgYnkgdGhlIG9uZSB2ZXJiIGxhdywgY29weS1vbi13cml0ZSBiZWxvdyB0aGUgcm9vdCxcbiAqIGV2ZXJ5IHJlY29yZGVkIHZhbHVlIHBsYWNlZCBCWSBSRUZFUkVOQ0Ug4oCUIG5vIGNsb25lLCBzbyBpdCBjb3N0cyB3aGF0IHRoZVxuICogYnVuZGxlIHdyb3RlIGFuZCBub3RoaW5nIG1vcmUuIEl0IGFsaWFzZXMgdGhlIHBheWxvYWQgYW5kIGV2ZXJ5IHN1YnRyZWUgb2ZcbiAqIGBiYXNlYCB0aGUgYnVuZGxlIGRpZCBub3Qgd3JpdGUsIGFuZCBlZGl0cyBuZWl0aGVyLiBOZXZlciBoYW5kIGl0IG91dCxcbiAqIHN0b3JlIGl0IG9yIHdyaXRlIHRocm91Z2ggaXQ6IGBUcmFuc2FjdGlvbkJ1ZmZlcmAgYnVpbGRzIG9uZSB0byBhc2sgd2hldGhlclxuICogYSBidW5kbGUgZm9sZHMgYmFjayB0byB3aGF0IHRoZSBzdGFnZSByZWFkLCB0aGVuIGRyb3BzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJ5Rm9sZChiYXNlOiBhbnksIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogYW55IHtcbiAgcmV0dXJuIGZvbGRSb3dzKG93bmVkUm9vdE9mKGJhc2UpLCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlLCAnYnlSZWZlcmVuY2UnKTtcbn1cblxuLy8g4pSA4pSA4pSAIFRoZSBmb2xkIG92ZXIgb25lIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBPbmUgcm93IG9mIHRoZSBsb2cgdW5kZXIgdGhlIGZvbGRlZCBrZXkncyBUT1AtTEVWRUwga2V5IOKAlCB3aGF0IHtAbGluayBmb2xkS2V5fVxuICogYXBwbGllcywgaW4gY29tbWl0IG9yZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdWNoIHtcbiAgcmVhZG9ubHkgdmVyYjogVmVyYjtcbiAgcmVhZG9ubHkgYnVuZGxlOiBDb21taXRCdW5kbGU7XG4gIC8qKiBUaGUgYnVuZGxlJ3MgcG9zaXRpb24gaW4gdGhlIGNvbW1pdCBsb2cuICovXG4gIHJlYWRvbmx5IGNvbW1pdElkeDogQ29tbWl0SWR4O1xuICAvKiogVGhlIHJvdydzIG93biBwYXRoIChERUxJTS1qb2luZWQgYFRyYWNlRW50cnkucGF0aGApLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb3cgdGhlIHJvdyBzaXRzIGFnYWluc3QgdGhlIGZvbGRlZCBrZXkgKGBrZXlQYXRocyDCtyByZWxhdGlvbmApLiBBQlNFTlQgZm9yIGFcbiAgICogcm93IG9uIGFub3RoZXIgcGF0aCB1bmRlciB0aGUgc2FtZSB0b3AtbGV2ZWwga2V5OiBzdWNoIGEgcm93IGlzIEFQUExJRUQgKGFuXG4gICAqIGFycmF5IHVuaW9uIG9uIGEgY29udGFpbmVyIGFib3ZlIHRoZSBrZXkgZGVkdXBzIHRoZSB3aG9sZSBhcnJheSwgc28gYSBzaWJsaW5nXG4gICAqIGNoYW5nZXMgd2hlcmUgaXQgbGVhdmVzIHRoZSBrZXkpIGJ1dCBuZXZlciBvYnNlcnZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aW9uPzogUGF0aFJlbGF0aW9uO1xufVxuXG4vKiogV2hhdCBhIHJlYWRlciBhc2tzIG9mIHtAbGluayBmb2xkS2V5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5Rm9sZCB7XG4gIC8qKlxuICAgKiBTdGFydCBhdCB0aGUgTEFTVCByb3cgdGhhdCBzZXRzIG9yIGRlbGV0ZXMgdGhlIHdob2xlIFRPUC1MRVZFTCBrZXkgKHtAbGlua1xuICAgKiBpc1RvdGFsfSwgb24gdGhlIHJvb3QgcGF0aCBpdHNlbGYpIOKAlCByb3dzIGJlZm9yZSBpdCBjYW5ub3QgY2hhbmdlIGFueXRoaW5nXG4gICAqIHVuZGVyIHRoYXQga2V5LCBzbyBhIHJlYWRlciB0aGF0IHdhbnRzIG9ubHkgdGhlIHZhbHVlIHNraXBzIHRoZW0uIEEgYHNldGAgb2ZcbiAgICogYSBwYXRoIGJlbG93IHRoZSByb290IGlzIE5PVCBhbiBhbmNob3I6IGFuIGVhcmxpZXIgc2libGluZyBjYW4gc3RpbGwgbW92ZVxuICAgKiB0aGUga2V5IHRocm91Z2ggYSBsYXRlciB1bmlvbi4gT2ZmIGJ5IGRlZmF1bHQ6IGEgcmVhZGVyIHRoYXQgdHJhY2tzIGhvdyB0aGVcbiAgICogdmFsdWUgR1JFVyBtdXN0IHNlZSBldmVyeSByb3cuXG4gICAqL1xuICByZWFkb25seSBhbmNob3JlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgZWFjaCBhcHBsaWVkIHJvdyB0aGF0IGhhcyBhIHtAbGluayBUb3VjaC5yZWxhdGlvbn0g4oCUIG9uLCBpbnNpZGVcbiAgICogb3IgYXJvdW5kIHRoZSBrZXkgKGV2ZXJ5IHJvdywgd2l0aCBgZXZlcnlSb3dgKSDigJQgd2l0aCB0aGUgdmFsdWUgQVQgVEhFIEtFWSBiZWZvcmUgaXQgYW5kIGFmdGVyIGl0XG4gICAqIChgdW5kZWZpbmVkYCBmb3IgYW4gYWJzZW50IGtleSkuIFRoZSBzZWFtIGEgcHJvdmVuYW5jZSB0cmFjayBhbmQgdGhlIHdyaXRlclxuICAgKiBydWxlIGhhbmcgb246IHRoZXkgd2F0Y2ggdGhlIGZvbGQsIHRoZXkgbmV2ZXIgaGF2ZSBhIHZlcmIgc3dpdGNoIG9mIHRoZWlyXG4gICAqIG93bi4gRm9yIGEgcm93IElOU0lERSB0aGUga2V5LCBhbiBhcnJheSBgYmVmb3JlYCBpcyBhIHNoYWxsb3cgc25hcHNob3Q6IHRoYXRcbiAgICogcm93IGVkaXRzIHRoZSBmb2xkJ3Mgb3duIGNvcHkgaW4gcGxhY2UuXG4gICAqL1xuICByZWFkb25seSBvYnNlcnZlPzogKHRvdWNoOiBUb3VjaCwgYmVmb3JlOiB1bmtub3duLCBhZnRlcjogdW5rbm93bikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIE9ic2VydmUgRVZFUlkgYXBwbGllZCByb3csIG5vdCBvbmx5IHRoZSBrZXkncyBvd24uIFRoZSB3cml0ZXIgcnVsZSBuZWVkcyBpdDogaXQgY29tcGFyZXMgdGhlIHZhbHVlIGF0IHRoZVxuICAgKiBrZXkgYWNyb3NzIGEgV0hPTEUgY29tbWl0LCBhbmQgYSBzaWJsaW5nIHVuZGVyIHRoZSBzYW1lIHRvcC1sZXZlbCBrZXkgY2FuIG1vdmUgdGhhdCB2YWx1ZSDigJQgYSB3cml0ZVxuICAgKiB0aHJvdWdoIGEgY29udGFpbmVyIHRoYXQgaG9sZHMgYSBwcmltaXRpdmUgcmVwbGFjZXMgdGhlIGNvbnRhaW5lciAoYG5hdGl2ZVNldGApLCBhbmQgd2l0aCBpdCB0aGUga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlcnlSb3c/OiBib29sZWFuO1xuICAvKipcbiAgICogS2VlcCBHRU5FUkFUSU9OUyBhdCBjaG9zZW4gY29tbWl0czogYGF0YCBpcyBhc2tlZCBiZWZvcmUgYSBjb21taXQncyBmaXJzdCByb3cgKHdpdGggdGhlIGZvbGQncyBzdGF0ZSBhc1xuICAgKiBpdCBzdGFuZHMpOyBmb3IgYSBjb21taXQgaXQgYWNjZXB0cywgYGtlZXBgIGlzIGhhbmRlZCB0aGUgdmFsdWUgYXQgdGhlIGtleSBiZWZvcmUgdGhlIGNvbW1pdCBhbmQgYWZ0ZXJcbiAgICogaXQg4oCUIGNvcHktb24td3JpdGUgYXJvdW5kIHRoYXQgY29tbWl0ICh0aGUgZm9sZCBkcm9wcyBvd25lcnNoaXAgb2YgZXZlcnkgY29udGFpbmVyIGJlZm9yZSBhbmQgYWZ0ZXIgaXQpLFxuICAgKiBzbyBubyBsYXRlciByb3cgZWRpdHMgZWl0aGVyIHZhbHVlLiBUaGUgd3JpdGVyIHJ1bGUncyBtZW1vaXNlZCByb290IGZvbGQgKGBjb21taXRMb2dVdGlscyDCtyBMb2dNb2RlbGApXG4gICAqIGtlZXBzIHRoZSBjb21taXRzIGEga2V5J3MgdmVyZGljdCBuZWVkcywgb25jZSBwZXIgdG9wLWxldmVsIGtleS5cbiAgICovXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHRvcC1sZXZlbCBrZXkgaG9sZHMgQkVGT1JFIHRoZSBmaXJzdCByb3cg4oCUIGRlZmF1bHQ6IGFic2VudC4gTmV2ZXIgZWRpdGVkOiB0aGUgZm9sZCBjb3BpZXNcbiAgICogaXQgYmVmb3JlIHdyaXRpbmcgdGhyb3VnaCBpdC4gYGNvbW1pdFZhbHVlQXRgIG9uIGEgbWVtb2lzZWQgbG9nIHN0YXJ0cyBmcm9tIGEga2VwdCBnZW5lcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ/OiB1bmtub3duO1xuICByZWFkb25seSBnZW5lcmF0aW9ucz86IHtcbiAgICBhdChjb21taXRJZHg6IG51bWJlciwgc3RhdGU6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IGJvb2xlYW47XG4gICAga2VlcChjb21taXRJZHg6IG51bWJlciwgYmVmb3JlOiB1bmtub3duLCBhZnRlcjogdW5rbm93bik6IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogVGhlIHZhbHVlIG9mIE9ORSBrZXkgYWZ0ZXIgYHRvdWNoZXNgIOKAlCBFVkVSWSByb3cgdW5kZXIgaXRzIHRvcC1sZXZlbCBrZXksIGluXG4gKiBjb21taXQgb3JkZXIsIGVhY2ggYWxyZWFkeSBjaGVja2VkIHdpdGgge0BsaW5rIGlzVmVyYn0g4oCUIGZvbGRlZCBmcm9tIGFuIGFic2VudFxuICoga2V5LCByZWFkIGF0IHRoZSBrZXkgKGBzZWdzYCwgaXRzIERFTElNIHNlZ21lbnRzKTogdGhlIHZhbHVlIHJ1bGUgb2ZcbiAqIGBrZXlQYXRocy50c2AsIHRoZSBmb2xkIGBzdGF0ZUF0YCBkb2VzIHJlc3RyaWN0ZWQgdG8gb25lIHRvcC1sZXZlbCBrZXkuIFRvcC1sZXZlbFxuICoga2V5cyBuZXZlciBpbnRlcmFjdCB1bmRlciB0aGUgc3RlcCwgc28gdGhlIHJlc3RyaWN0aW9uIGlzIGV4YWN0LlxuICpcbiAqIFRoZSBzYW1lIHN0ZXAgKHtAbGluayBhcHBseVZlcmJ9KSBhbmQgdGhlIHNhbWUgZGlzY2lwbGluZSBhcyB7QGxpbmsgZm9sZFJvd3N9J3NcbiAqIGAncGF0aENvcHknYDogYHNldGAgLyBgYXBwZW5kYCB2YWx1ZXMgYXJlIGNsb25lcywgdGhlIG1lcmdlIGRlbHRhIGlzIGRldGFjaGVkXG4gKiBvbmNlIHBlciBCVU5ETEUgKG5hcnJvd2VkIHRvIHRoZSB0b3AtbGV2ZWwga2V5KSwgc28gdHdvIGBtZXJnZWAgcm93cyBvZiBvbmVcbiAqIGJ1bmRsZSBzZWUgdGhlIHNhbWUgb2JqZWN0cywgYW5kIGEgcm93IHRoYXQgd3JpdGVzIHRocm91Z2ggYSBjb250YWluZXIgdGhpc1xuICogZm9sZCBkaWQgbm90IGNyZWF0ZSBjb3BpZXMgaXQgZmlyc3QuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGFuIGFic2VudCBrZXkuXG4gKiBPKHRoZSByb3dzIHVuZGVyIHRoZSBrZXkncyB0b3AtbGV2ZWwga2V5KSwgbm90IE8odGhlIGxvZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkS2V5KHRvdWNoZXM6IHJlYWRvbmx5IFRvdWNoW10sIHNlZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBLZXlGb2xkID0ge30pOiB1bmtub3duIHtcbiAgY29uc3Qgcm9vdCA9IHNlZ3NbMF07XG4gIGxldCBmcm9tID0gMDtcbiAgaWYgKG9wdGlvbnMuYW5jaG9yZWQgPT09IHRydWUpIHtcbiAgICBmb3IgKGxldCBpID0gdG91Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGlzVG90YWwodG91Y2hlc1tpXS52ZXJiKSAmJiB0b3VjaGVzW2ldLnBhdGggPT09IHJvb3QpIHtcbiAgICAgICAgZnJvbSA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgaWYgKG9wdGlvbnMuc3RhcnQgIT09IHVuZGVmaW5lZCkgc3RhdGVbcm9vdF0gPSBvcHRpb25zLnN0YXJ0O1xuICBsZXQgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gIG93bmVkLmFkZChzdGF0ZSk7XG4gIGNvbnN0IG9ic2VydmUgPSBvcHRpb25zLm9ic2VydmU7XG4gIGNvbnN0IGdlbmVyYXRpb25zID0gb3B0aW9ucy5nZW5lcmF0aW9ucztcbiAgbGV0IGtlcHQgPSAtMTtcbiAgbGV0IGtlcHRCZWZvcmU6IHVua25vd247XG4gIC8qKiBEcm9wIG93bmVyc2hpcCBvZiBldmVyeSBjb250YWluZXI6IHRoZSBuZXh0IHdyaXRlIHRocm91Z2ggb25lIGNvcGllcyBpdCwgc28gYSBrZXB0IHZhbHVlIHN0YXlzIGFzIGl0IGlzLiAqL1xuICBjb25zdCByZWxlYXNlID0gKCkgPT4ge1xuICAgIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgIG93bmVkLmFkZChzdGF0ZSk7XG4gIH07XG4gIGxldCBhdDogUmVjb3JkZWRQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICBsZXQgYXRDb21taXQgPSAtMTtcbiAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG91Y2ggPSB0b3VjaGVzW2ldO1xuICAgIGlmIChhdCA9PT0gdW5kZWZpbmVkIHx8IHRvdWNoLmNvbW1pdElkeCAhPT0gYXRDb21taXQpIHtcbiAgICAgIGlmIChrZXB0ICE9PSAtMSkge1xuICAgICAgICBnZW5lcmF0aW9ucyEua2VlcChrZXB0LCBrZXB0QmVmb3JlLCBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpKTtcbiAgICAgICAga2VwdCA9IC0xO1xuICAgICAgICByZWxlYXNlKCk7XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBnZW5lcmF0aW9ucy5hdCh0b3VjaC5jb21taXRJZHgsIHN0YXRlKSkge1xuICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIGtlcHQgPSB0b3VjaC5jb21taXRJZHg7XG4gICAgICAgIGtlcHRCZWZvcmUgPSBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpO1xuICAgICAgfVxuICAgICAgYXQgPSBuZXcgUmVjb3JkZWRQYXlsb2FkKHRvdWNoLmJ1bmRsZS51cGRhdGVzLCB0b3VjaC5idW5kbGUub3ZlcndyaXRlLCB0cnVlLCBbcm9vdF0pO1xuICAgICAgYXRDb21taXQgPSB0b3VjaC5jb21taXRJZHg7XG4gICAgfVxuICAgIGNvbnN0IHJvd1NlZ3MgPSB0b3VjaC5wYXRoID09PSByb290ID8gW3Jvb3RdIDogdG91Y2gucGF0aC5zcGxpdChERUxJTSk7XG4gICAgY29uc3Qgd2F0Y2hlZCA9IG9ic2VydmUgIT09IHVuZGVmaW5lZCAmJiAodG91Y2gucmVsYXRpb24gIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmV2ZXJ5Um93ID09PSB0cnVlKTtcbiAgICBsZXQgYmVmb3JlOiB1bmtub3duO1xuICAgIGlmICh3YXRjaGVkKSB7XG4gICAgICBiZWZvcmUgPSBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpO1xuICAgICAgaWYgKHRvdWNoLnJlbGF0aW9uID09PSAnaW5zaWRlJyAmJiBBcnJheS5pc0FycmF5KGJlZm9yZSkpIGJlZm9yZSA9IGJlZm9yZS5zbGljZSgpO1xuICAgIH1cbiAgICBpZiAocm93U2Vncy5sZW5ndGggPiAxKSBvd25TcGluZShzdGF0ZSwgcm93U2Vncywgb3duZWQpO1xuICAgIC8vIEEgdG90YWwgdmVyYiByZWFkcyBub3RoaW5nIGZyb20gd2hhdCBjYW1lIGJlZm9yZSBpdCAoaXNUb3RhbCkuXG4gICAgY29uc3QgbmV4dCA9IGFwcGx5VmVyYih0b3VjaC52ZXJiLCBpc1RvdGFsKHRvdWNoLnZlcmIpID8gdW5kZWZpbmVkIDogbmF0aXZlR2V0KHN0YXRlLCByb3dTZWdzKSwgYXQsIHJvd1NlZ3MpO1xuICAgIG93bihuZXh0LCBvd25lZCk7XG4gICAgcGxhY2VWZXJiKHN0YXRlLCByb3dTZWdzLCBuZXh0KTtcbiAgICBpZiAod2F0Y2hlZCkgb2JzZXJ2ZSh0b3VjaCwgYmVmb3JlLCBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpKTtcbiAgfVxuICBpZiAoa2VwdCAhPT0gLTEpIGdlbmVyYXRpb25zIS5rZWVwKGtlcHQsIGtlcHRCZWZvcmUsIG5hdGl2ZUdldChzdGF0ZSwgc2VncykpO1xuICByZXR1cm4gbmF0aXZlR2V0KHN0YXRlLCBzZWdzKTtcbn1cbiJdfQ==
package/dist/trace.js CHANGED
@@ -31,8 +31,8 @@
31
31
  * ```
32
32
  */
33
33
  Object.defineProperty(exports, "__esModule", { value: true });
34
- exports.KeyedStore = exports.BoundaryStateStore = exports.HONESTY_CODES = exports.sliceToJSON = exports.sliceForKey = exports.resolveKeysReadSource = exports.normaliseStateKey = exports.keyTimeline = exports.keysReadFromMap = exports.keysReadFromExecutionTree = exports.forwardSliceToJSON = exports.forwardSliceForKey = exports.formatTimeline = exports.formatSlice = exports.formatForwardSlice = exports.elementProvenance = exports.arrayProvenance = exports.formatCausalChain = exports.flattenCausalDAG = exports.causalChain = exports.timeTravel = exports.tagStops = exports.stateAt = exports.splitAxis = exports.isCommitBundle = exports.filterStops = exports.commitStopsStrategy = exports.commitStops = exports.recordsPhases = exports.inferLegacyPhases = exports.findLastWriterWithBasis = exports.findLastWriter = exports.findCommits = exports.findCommit = exports.commitValueAtWithBasis = exports.commitValueAt = exports.commitIndexOf = exports.buildCommitIndex = exports.UnknownVerbError = exports.pathSegments = exports.walkSubflowSpec = exports.parseBranchSegment = exports.isBranchSegment = exports.hasBranchSegmentMarker = exports.buildBranchSegment = exports.BRANCH_SEGMENT_MARKER = exports.splitStageId = exports.parseRuntimeStageId = exports.createExecutionCounter = exports.buildRuntimeStageId = void 0;
35
- exports.qualityTrace = exports.formatQualityTrace = exports.QualityRecorder = exports.controlDepRecorder = exports.ControlDepRecorder = exports.ROOT_SUBFLOW_ID = exports.ROOT_RUNTIME_STAGE_ID = exports.inOutRecorder = exports.InOutRecorder = exports.topologyRecorder = exports.TopologyRecorder = exports.CommitRangeIndex = exports.SequenceStore = void 0;
34
+ exports.BoundaryStateStore = exports.HONESTY_CODES = exports.sliceToJSON = exports.sliceForKey = exports.resolveKeysReadSource = exports.normaliseStateKey = exports.keyTimeline = exports.keysReadFromMap = exports.keysReadFromExecutionTree = exports.forwardSliceToJSON = exports.forwardSliceForKey = exports.formatTimeline = exports.formatSlice = exports.formatForwardSlice = exports.elementProvenance = exports.arrayProvenance = exports.formatCausalChain = exports.flattenCausalDAG = exports.causalChain = exports.timeTravel = exports.tagStops = exports.stateAt = exports.splitAxis = exports.isCommitBundle = exports.filterStops = exports.commitStopsStrategy = exports.commitStops = exports.recordsPhases = exports.inferLegacyPhases = exports.findLastWriterWithBasis = exports.findLastWriter = exports.findCommits = exports.findCommit = exports.commitValueAtWithBasis = exports.commitValueAt = exports.commitIndexOf = exports.buildCommitIndex = exports.applySmartMerge = exports.UnknownVerbError = exports.pathSegments = exports.walkSubflowSpec = exports.parseBranchSegment = exports.isBranchSegment = exports.hasBranchSegmentMarker = exports.buildBranchSegment = exports.BRANCH_SEGMENT_MARKER = exports.splitStageId = exports.parseRuntimeStageId = exports.createExecutionCounter = exports.buildRuntimeStageId = void 0;
35
+ exports.qualityTrace = exports.formatQualityTrace = exports.QualityRecorder = exports.controlDepRecorder = exports.ControlDepRecorder = exports.ROOT_SUBFLOW_ID = exports.ROOT_RUNTIME_STAGE_ID = exports.inOutRecorder = exports.InOutRecorder = exports.topologyRecorder = exports.TopologyRecorder = exports.CommitRangeIndex = exports.SequenceStore = exports.KeyedStore = void 0;
36
36
  var runtimeStageId_js_1 = require("./lib/ids/runtimeStageId.js");
37
37
  Object.defineProperty(exports, "buildRuntimeStageId", { enumerable: true, get: function () { return runtimeStageId_js_1.buildRuntimeStageId; } });
38
38
  Object.defineProperty(exports, "createExecutionCounter", { enumerable: true, get: function () { return runtimeStageId_js_1.createExecutionCounter; } });
@@ -62,10 +62,12 @@ var utils_js_1 = require("./lib/memory/utils.js");
62
62
  Object.defineProperty(exports, "pathSegments", { enumerable: true, get: function () { return utils_js_1.pathSegments; } });
63
63
  // The refusal the commit-log readers raise for a row whose verb is not
64
64
  // set | merge | append | delete (`commitValueAt`, `arrayProvenance`, and
65
- // `applySmartMerge` on `/advanced`): a foreign or corrupted log fails loudly,
65
+ // `applySmartMerge` below): a foreign or corrupted log fails loudly,
66
66
  // naming the row, instead of being folded as a merge.
67
67
  var index_js_1 = require("./lib/memory/index.js");
68
68
  Object.defineProperty(exports, "UnknownVerbError", { enumerable: true, get: function () { return index_js_1.UnknownVerbError; } });
69
+ var verbs_js_1 = require("./lib/memory/verbs.js");
70
+ Object.defineProperty(exports, "applySmartMerge", { enumerable: true, get: function () { return verbs_js_1.applySmartMerge; } });
69
71
  var commitLogUtils_js_1 = require("./lib/memory/commitLogUtils.js");
70
72
  Object.defineProperty(exports, "buildCommitIndex", { enumerable: true, get: function () { return commitLogUtils_js_1.buildCommitIndex; } });
71
73
  Object.defineProperty(exports, "commitIndexOf", { enumerable: true, get: function () { return commitLogUtils_js_1.commitIndexOf; } });
@@ -138,4 +140,4 @@ Object.defineProperty(exports, "QualityRecorder", { enumerable: true, get: funct
138
140
  var qualityTrace_js_1 = require("./lib/recorder/qualityTrace.js");
139
141
  Object.defineProperty(exports, "formatQualityTrace", { enumerable: true, get: function () { return qualityTrace_js_1.formatQualityTrace; } });
140
142
  Object.defineProperty(exports, "qualityTrace", { enumerable: true, get: function () { return qualityTrace_js_1.qualityTrace; } });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7Ozs7QUFJSCxpRUFLcUM7QUFKbkMsd0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsMkhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsd0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsaUhBQUEsWUFBWSxPQUFBO0FBR2QsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsZ0ZBQWdGO0FBQ2hGLHdFQUF3RTtBQUN4RSx3REFBd0Q7QUFDeEQsNENBQTRDO0FBQzVDLCtEQU1vQztBQUxsQyx5SEFBQSxxQkFBcUIsT0FBQTtBQUNyQixzSEFBQSxrQkFBa0IsT0FBQTtBQUNsQiwwSEFBQSxzQkFBc0IsT0FBQTtBQUN0QixtSEFBQSxlQUFlLE9BQUE7QUFDZixzSEFBQSxrQkFBa0IsT0FBQTtBQU1wQixzRUFBa0U7QUFBekQscUhBQUEsZUFBZSxPQUFBO0FBRXhCLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UseUVBQXlFO0FBQ3pFLDhFQUE4RTtBQUM5RSxvRUFBb0U7QUFDcEUsa0RBQXFEO0FBQTVDLHdHQUFBLFlBQVksT0FBQTtBQUVyQix1RUFBdUU7QUFDdkUseUVBQXlFO0FBQ3pFLDhFQUE4RTtBQUM5RSxzREFBc0Q7QUFDdEQsa0RBQXlEO0FBQWhELDRHQUFBLGdCQUFnQixPQUFBO0FBYXpCLG9FQWN3QztBQWJ0QyxxSEFBQSxnQkFBZ0IsT0FBQTtBQUNoQixrSEFBQSxhQUFhLE9BQUE7QUFDYixrSEFBQSxhQUFhLE9BQUE7QUFDYiwySEFBQSxzQkFBc0IsT0FBQTtBQUN0QiwrR0FBQSxVQUFVLE9BQUE7QUFDVixnSEFBQSxXQUFXLE9BQUE7QUFDWCxtSEFBQSxjQUFjLE9BQUE7QUFDZCw0SEFBQSx1QkFBdUIsT0FBQTtBQUN2QiwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLDhDQUE4QztBQUM5QyxzSEFBQSxpQkFBaUIsT0FBQTtBQUNqQixrSEFBQSxhQUFhLE9BQUE7QUEyQ2YsdURBU29DO0FBUmxDLHVHQUFBLFdBQVcsT0FBQTtBQUNYLCtHQUFBLG1CQUFtQixPQUFBO0FBQ25CLHVHQUFBLFdBQVcsT0FBQTtBQUNYLDBHQUFBLGNBQWMsT0FBQTtBQUNkLHFHQUFBLFNBQVMsT0FBQTtBQUNULG1HQUFBLE9BQU8sT0FBQTtBQUNQLG9HQUFBLFFBQVEsT0FBQTtBQUNSLHNHQUFBLFVBQVUsT0FBQTtBQWdCWiwwREFBNkY7QUFBcEYsMkdBQUEsV0FBVyxPQUFBO0FBQUUsZ0hBQUEsZ0JBQWdCLE9BQUE7QUFBRSxpSEFBQSxpQkFBaUIsT0FBQTtBQTJDekQsaURBZThCO0FBZDVCLDJHQUFBLGVBQWUsT0FBQTtBQUNmLDZHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLDhHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHVHQUFBLFdBQVcsT0FBQTtBQUNYLDBHQUFBLGNBQWMsT0FBQTtBQUNkLDhHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLDhHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHFIQUFBLHlCQUF5QixPQUFBO0FBQ3pCLDJHQUFBLGVBQWUsT0FBQTtBQUNmLHVHQUFBLFdBQVcsT0FBQTtBQUNYLDZHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLGlIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLHVHQUFBLFdBQVcsT0FBQTtBQUNYLHVHQUFBLFdBQVcsT0FBQTtBQWNiLGtEQUFzRDtBQUE3Qyx5R0FBQSxhQUFhLE9BQUE7QUFFdEIsbUVBQW1FO0FBQ25FLGlFQUFpRTtBQUNqRSxpRUFBaUU7QUFDakUsNENBQTRDO0FBQzVDLDhFQUEwRTtBQUFqRSwySEFBQSxrQkFBa0IsT0FBQTtBQUMzQiw4REFBMEQ7QUFBakQsMkdBQUEsVUFBVSxPQUFBO0FBQ25CLG9FQUFnRTtBQUF2RCxpSEFBQSxhQUFhLE9BQUE7QUFTdEIsMEVBQXNFO0FBQTdELHVIQUFBLGdCQUFnQixPQUFBO0FBVXpCLDBFQUF3RjtBQUEvRSx1SEFBQSxnQkFBZ0IsT0FBQTtBQUFFLHVIQUFBLGdCQUFnQixPQUFBO0FBSzNDLG9FQUF1SDtBQUE5RyxpSEFBQSxhQUFhLE9BQUE7QUFBRSxpSEFBQSxhQUFhLE9BQUE7QUFBRSx5SEFBQSxxQkFBcUIsT0FBQTtBQUFFLG1IQUFBLGVBQWUsT0FBQTtBQU83RSw4RUFBOEY7QUFBckYsMkhBQUEsa0JBQWtCLE9BQUE7QUFBRSwySEFBQSxrQkFBa0IsT0FBQTtBQUkvQyx3RUFBb0U7QUFBM0QscUhBQUEsZUFBZSxPQUFBO0FBSXhCLGtFQUFrRjtBQUF6RSxxSEFBQSxrQkFBa0IsT0FBQTtBQUFFLCtHQUFBLFlBQVksT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZm9vdHByaW50anMvdHJhY2Ug4oCUIEV4ZWN1dGlvbiB0cmFjaW5nLCBkZWJ1Z2dpbmcsIGFuZCBiYWNrdHJhY2tpbmcgdXRpbGl0aWVzLlxuICpcbiAqIFJ1bnRpbWUgc3RhZ2UgSURzLCBjb21taXQgbG9nIHF1ZXJpZXMsIGFuZCByZWNvcmRlciBiYXNlIGNsYXNzZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHBhcnNlUnVudGltZVN0YWdlSWQsIGZpbmRMYXN0V3JpdGVyLCBLZXllZFN0b3JlLCBTZXF1ZW5jZVN0b3JlIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIC8vIFBhcnNlIGEgcnVudGltZVN0YWdlSWRcbiAqIGNvbnN0IHsgc3RhZ2VJZCwgZXhlY3V0aW9uSW5kZXggfSA9IHBhcnNlUnVudGltZVN0YWdlSWQoJ2NhbGwtbGxtIzUnKTtcbiAqXG4gKiAvLyBCYWNrdHJhY2s6IHdobyB3cm90ZSAnc3lzdGVtUHJvbXB0JyBiZWZvcmUgY29tbWl0IGF0IGlkeCA4P1xuICogY29uc3Qgd3JpdGVyID0gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCAnc3lzdGVtUHJvbXB0JywgOCk7XG4gKlxuICogLy8gdjUgcHJpbWFyeSBBUEk6IGNvbXBvc2UgYSBTdG9yZSBhcyBhIGZpZWxkIChvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXIpLlxuICogLy8gS2V5ZWRTdG9yZTxUPiDigJQgMToxIChvbmUgZW50cnkgcGVyIHN0ZXApXG4gKiBjbGFzcyBNeVJlY29yZGVyIHtcbiAqICAgcmVhZG9ubHkgaWQgPSAnbXktcmVjb3JkZXInO1xuICogICBwcml2YXRlIHN0b3JlID0gbmV3IEtleWVkU3RvcmU8TXlFbnRyeT4oKTtcbiAqICAgb25Xcml0ZShlKSB7IHRoaXMuc3RvcmUuc2V0KGUucnVudGltZVN0YWdlSWQsIHsgLi4uIH0pOyB9XG4gKiB9XG4gKlxuICogLy8gU2VxdWVuY2VTdG9yZTxUPiDigJQgMTpOIChtdWx0aXBsZSBlbnRyaWVzIHBlciBzdGVwLCBvcmRlcmluZyBtYXR0ZXJzKVxuICogY2xhc3MgQXVkaXRSZWNvcmRlciB7XG4gKiAgIHJlYWRvbmx5IGlkID0gJ2F1ZGl0JztcbiAqICAgcHJpdmF0ZSBzdG9yZSA9IG5ldyBTZXF1ZW5jZVN0b3JlPEF1ZGl0RW50cnk+KCk7XG4gKiAgIG9uUmVhZChlKSB7IHRoaXMuc3RvcmUucHVzaCh7IHJ1bnRpbWVTdGFnZUlkOiBlLnJ1bnRpbWVTdGFnZUlkLCAuLi4gfSk7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5cbi8vIFJ1bnRpbWUgc3RhZ2UgSUQg4oCUIHVuaXF1ZSBleGVjdXRpb24gc3RlcCBpZGVudGlmaWVyc1xuZXhwb3J0IHR5cGUgeyBDb21taXRJZHgsIEV4ZWN1dGlvbkNvdW50ZXIsIEV4ZWN1dGlvbkluZGV4LCBSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4vbGliL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5leHBvcnQge1xuICBidWlsZFJ1bnRpbWVTdGFnZUlkLFxuICBjcmVhdGVFeGVjdXRpb25Db3VudGVyLFxuICBwYXJzZVJ1bnRpbWVTdGFnZUlkLFxuICBzcGxpdFN0YWdlSWQsXG59IGZyb20gJy4vbGliL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5cbi8vIEdlbmVyYXRlZCBicmFuY2ggc2VnbWVudHMg4oCUIHRoZSBzdWJmbG93IHBhdGggc2VnbWVudHMgYGFkZFBhcmFsbGVsRm9yRWFjaGBcbi8vIG1pbnRzIGZvciBpdHMgYnJhbmNoZXMgKGA8c3RhZ2VJZD5+PGluZGV4PmApLiBBIGJyYW5jaCBpcyBhZGRyZXNzZWQgYnkgdGhlXG4vLyBPUkRJTkFSWSBncmFtbWFyIGFib3ZlLCBzbyBub3RoaW5nIGhlcmUgaXMgbmVlZGVkIHRvIFJFQUQgb25lOyB0aGVzZSBleGlzdCBzb1xuLy8gYSBjb25zdW1lciBjYW4gVEVMTCBhIGdlbmVyYXRlZCBicmFuY2ggZnJvbSBhIGhhbmQtYXV0aG9yZWQgc3ViZmxvdyAodG8gbGFiZWxcbi8vIGl0IFwiYnJhbmNoIDIgb2YgcmV2aWV3LWNodW5rc1wiIGluc3RlYWQgb2YgYSBzdWJmbG93IG5hbWUpLCBhbmQgc28gdGhlXG4vLyByZXNlcnZlZCBtYXJrZXIgaXMgZGlzY292ZXJhYmxlIHJhdGhlciB0aGFuIGZvbGtsb3JlLlxuLy8gRGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZC5cbmV4cG9ydCB7XG4gIEJSQU5DSF9TRUdNRU5UX01BUktFUixcbiAgYnVpbGRCcmFuY2hTZWdtZW50LFxuICBoYXNCcmFuY2hTZWdtZW50TWFya2VyLFxuICBpc0JyYW5jaFNlZ21lbnQsXG4gIHBhcnNlQnJhbmNoU2VnbWVudCxcbn0gZnJvbSAnLi9saWIvaWRzL2JyYW5jaFNlZ21lbnQuanMnO1xuXG4vLyB3YWxrU3ViZmxvd1NwZWMg4oCUIGZsYXQgb3JkZXJlZCB0cmF2ZXJzYWwgb2YgYSBzdWJmbG93J3Mgc3RydWN0dXJlXG4vLyAoY29uc3VtZSB2aWEgU3RydWN0dXJlUmVjb3JkZXIub25TdWJmbG93TW91bnRlZCdzIHN1YmZsb3dTcGVjIHBheWxvYWQpXG5leHBvcnQgdHlwZSB7IFdhbGtlckl0ZW0sIFdhbGtlck9wdGlvbnMgfSBmcm9tICcuL2xpYi9lbmdpbmUvd2Fsa1N1YmZsb3dTcGVjLmpzJztcbmV4cG9ydCB7IHdhbGtTdWJmbG93U3BlYyB9IGZyb20gJy4vbGliL2VuZ2luZS93YWxrU3ViZmxvd1NwZWMuanMnO1xuXG4vLyBQYXRoIHNlZ21lbnRzIOKAlCB0aGUgc3VwcG9ydGVkIHdheSB0byB0YWtlIGEgYFRyYWNlRW50cnkucGF0aGAgYXBhcnQuIFBhdGhzXG4vLyBhcmUgam9pbmVkIHdpdGggYW4gQVNDSUkgVW5pdC1TZXBhcmF0b3IgKG5ldmVyIGEgZG90OiBhIHN0YXRlIGtleSBtYXkgaXRzZWxmXG4vLyBjb250YWluIGEgZG90LCBzbyBhIGRvdCBzZXBhcmF0b3Igd291bGQgbWFrZSBgWydhLmInXWAgYW5kIGBbJ2EnLCdiJ11gXG4vLyBpbmRpc3Rpbmd1aXNoYWJsZSksIHdoaWNoIGlzIGFuIGVuY29kaW5nLCBub3QgYSBkaXNwbGF5IGNoYXJhY3Rlci4gUmVuZGVyIGFcbi8vIHBhdGggdGhyb3VnaCB0aGlzIGluc3RlYWQgb2Ygc3BsaXR0aW5nIG9uIHRoZSBkZWxpbWl0ZXIgeW91cnNlbGYuXG5leHBvcnQgeyBwYXRoU2VnbWVudHMgfSBmcm9tICcuL2xpYi9tZW1vcnkvdXRpbHMuanMnO1xuXG4vLyBUaGUgcmVmdXNhbCB0aGUgY29tbWl0LWxvZyByZWFkZXJzIHJhaXNlIGZvciBhIHJvdyB3aG9zZSB2ZXJiIGlzIG5vdFxuLy8gc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGUgKGBjb21taXRWYWx1ZUF0YCwgYGFycmF5UHJvdmVuYW5jZWAsIGFuZFxuLy8gYGFwcGx5U21hcnRNZXJnZWAgb24gYC9hZHZhbmNlZGApOiBhIGZvcmVpZ24gb3IgY29ycnVwdGVkIGxvZyBmYWlscyBsb3VkbHksXG4vLyBuYW1pbmcgdGhlIHJvdywgaW5zdGVhZCBvZiBiZWluZyBmb2xkZWQgYXMgYSBtZXJnZS5cbmV4cG9ydCB7IFVua25vd25WZXJiRXJyb3IgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuXG4vLyBDb21taXQgbG9nIHF1ZXJpZXMg4oCUIHR5cGVkIHV0aWxpdGllcyBmb3IgYmFja3RyYWNraW5nLlxuLy8gY29tbWl0VmFsdWVBdCByZWNvbnN0cnVjdHMgdGhlIEZVTEwgdmFsdWUgb2YgYSBrZXkgYXQgYSBjb21taXQgaW5kZXgg4oCUXG4vLyByZXF1aXJlZCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKSwgd2hlcmUgYW4gYGFwcGVuZGBcbi8vIGJ1bmRsZSdzIGBvdmVyd3JpdGVba2V5XWAgaG9sZHMgb25seSB0aGUgdGFpbC5cbmV4cG9ydCB0eXBlIHtcbiAgVmFsdWVCYXNpcyxcbiAgVmFsdWVCYXNpc09wdGlvbnMsXG4gIFZhbHVlV2l0aEJhc2lzLFxuICBXcml0ZXJCYXNpcyxcbiAgV3JpdGVyV2l0aEJhc2lzLFxufSBmcm9tICcuL2xpYi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuZXhwb3J0IHtcbiAgYnVpbGRDb21taXRJbmRleCxcbiAgY29tbWl0SW5kZXhPZixcbiAgY29tbWl0VmFsdWVBdCxcbiAgY29tbWl0VmFsdWVBdFdpdGhCYXNpcyxcbiAgZmluZENvbW1pdCxcbiAgZmluZENvbW1pdHMsXG4gIGZpbmRMYXN0V3JpdGVyLFxuICBmaW5kTGFzdFdyaXRlcldpdGhCYXNpcyxcbiAgLy8gT25lIHN0YWdlLCBvbmUgcmVjb3JkIChGOCwgOS4zOS4wKTogZG9lcyBhIGxvZyByZWNvcmQgaXRzIGNvbnRpbnVhdGlvbnNcbiAgLy8gKGBDb21taXRCdW5kbGUucGhhc2VgKSwgYW5kIOKAlCBmb3IgYSBsb2cgd3JpdHRlbiBiZWZvcmUgaXQg4oCUIHRoZSBPTkUgbGVnYWN5XG4gIC8vIHJlYWRlciB0aGF0IGluZmVycyB0aGVtIHRoZSB3YXkgOS4zOC4wIGRpZC5cbiAgaW5mZXJMZWdhY3lQaGFzZXMsXG4gIHJlY29yZHNQaGFzZXMsXG59IGZyb20gJy4vbGliL21lbW9yeS9jb21taXRMb2dVdGlscy5qcyc7XG5leHBvcnQgdHlwZSB7IENvbW1pdFBoYXNlIH0gZnJvbSAnLi9saWIvbWVtb3J5L3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIHRpbWUtdHJhdmVsLyDigJQgdGhlIFJFQURFUidTIGN1cnNvciBvdmVyIGEgZmluaXNoZWQgdHJhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBBIFRyYWNlIGlzIHdoYXQgdGhlIHJ1biByZWNvcmRlZDsgdGltZSB0cmF2ZWwgaXMgYSBjdXJzb3Igb3ZlciBpdCB3aXRoIGFcbi8vIEZvbGQgYXQgZWFjaCBzdG9wLiBJdCBpcyBOT1QgdGhlIGVuZ2luZSdzIHdhbGsgYW5kIG5ldmVyIGJlY29tZXMgYSBzZWNvbmRcbi8vIGxpdmUgY3Vyc29yOiBldmVyeXRoaW5nIGJlbG93IGlzIGEgcmVhZC10aW1lIHF1ZXJ5IG92ZXIgYWxyZWFkeS1jb2xsZWN0ZWRcbi8vIGRhdGEuXG4vL1xuLy8gYHN0YXRlQXQoc25hcHNob3QgfCBzdWJ0cmVlLCBjb21taXRJZHgpYCBpcyB0aGUgZm9sZCDigJQgdGhlIHJ1bidzXG4vLyBgaW5pdGlhbFN0YXRlYCByZXBsYXllZCB0aHJvdWdoIGBjb21taXRMb2dbMC4uY29tbWl0SWR4XWAgd2l0aCB0aGUgU0FNRSB2ZXJiXG4vLyBzd2l0Y2ggdGhlIGxpdmUgY29tbWl0IHVzZXMsIHJldHVybmVkIGRldGFjaGVkIGFuZCBmcm96ZW4sIGFuZCBob25lc3QgYWJvdXRcbi8vIGhvdyBpdCB3YXMgZGVyaXZlZCAoYGJhc2lzYCkgYW5kIHdoZXJlIHRoZSBsb2cgd2FzIHNjcnViYmVkIChgcmVkYWN0ZWRgKS5cbi8vXG4vLyBgdGltZVRyYXZlbChzbmFwc2hvdClgIGlzIHRoZSBjdXJzb3I6IHN0b3BzLCBwcmV2L25leHQvanVtcFRvLCBtYXJrcyBiZXNpZGVcbi8vIHRoZSBsb2csIGFuZCBgZHJpbGwobW91bnQpYCBpbnRvIGEgc3ViZmxvdydzIG93biBsb2cg4oCUIHRoZSBzYW1lIGludGVyZmFjZSxcbi8vIGl0cyBvd24gYmFzZS4gSG93IHN0b3BzIGFyZSBERVJJVkVEIGlzIHRoZSBzZWFtIChgVGltZVRyYXZlbFN0cmF0ZWd5YCk7XG4vLyBmb290cHJpbnRqcyBzaGlwcyBgY29tbWl0U3RvcHNgIChvbmUgc3RvcCBwZXIgZXhlY3V0ZWQgc3RhZ2UpIGJlY2F1c2UgdGhhdFxuLy8gaXMgdGhlIG9ubHkgc3RvcCBncmFtbWFyIHRoZSBzdWJzdHJhdGUgaXRzZWxmIGtub3dzIOKAlCBhbmQsIHNpbmNlIDkuMjEuMCxcbi8vIGB0YWdTdG9wcyh0YWdzPylgOiB0aGUgc3RvcHMgYSBjaGFydCBERUNMQVJFRCBhdCBidWlsZCB0aW1lIChgLnRhZygpYCksXG4vLyByZWFkIGJhY2sgb2ZmIGBDb21taXRCdW5kbGUudGFnc2AsIHNvIGEgc3RvcmVkIHJlY29yZGluZyBzY3J1YnMgYnkgaXRzIG93blxuLy8gbWlsZXN0b25lcyB3aXRoIG5vIGlkIGNvbnZlbnRpb25zIGluIHRoZSByZWFkZXIuXG4vLyBTZWUgc3JjL2xpYi90aW1lLXRyYXZlbC9SRUFETUUubWQuXG5leHBvcnQgdHlwZSB7XG4gIEF4aXNSZWZ1c2FsLFxuICBBeGlzU3BsaXQsXG4gIEJvb2tlbmRlZEF4aXMsXG4gIEZvbGRCYXNpcyxcbiAgRm9sZGVkU3RhdGUsXG4gIEZvbGRTb3VyY2UsXG4gIExvZ0dhcCxcbiAgTWFyayxcbiAgTW92ZSxcbiAgTW92ZVJlZnVzYWwsXG4gIFN0b3AsXG4gIFN0b3BGaWx0ZXIsXG4gIFN0b3BLaW5kLFxuICBUaW1lVHJhdmVsLFxuICBUaW1lVHJhdmVsT3B0aW9ucyxcbiAgVGltZVRyYXZlbFNvdXJjZSxcbiAgVGltZVRyYXZlbFN0cmF0ZWd5LFxufSBmcm9tICcuL2xpYi90aW1lLXRyYXZlbC9pbmRleC5qcyc7XG5leHBvcnQge1xuICBjb21taXRTdG9wcyxcbiAgY29tbWl0U3RvcHNTdHJhdGVneSxcbiAgZmlsdGVyU3RvcHMsXG4gIGlzQ29tbWl0QnVuZGxlLFxuICBzcGxpdEF4aXMsXG4gIHN0YXRlQXQsXG4gIHRhZ1N0b3BzLFxuICB0aW1lVHJhdmVsLFxufSBmcm9tICcuL2xpYi90aW1lLXRyYXZlbC9pbmRleC5qcyc7XG5cbi8vIENhdXNhbCBjaGFpbiDigJQgYmFja3dhcmQgcHJvZ3JhbSBzbGljaW5nIG9uIGNvbW1pdCBsb2cgKERBRykuXG4vLyBSRkMtMDAzIEQzOiBgQ2F1c2FsRWRnZWAgKHR5cGVkL2tleWVkL3dlaWdodGVkIHBhcmVudCBsaW5rcyBvblxuLy8gYENhdXNhbE5vZGUucGFyZW50RWRnZXNgKSArIHRoZSBgY29udHJvbERlcHNgIG9wdGlvbiAoYENvbnRyb2xEZXBMb29rdXBgKVxuLy8gYWRkIGNvbnRyb2wtZGVwZW5kZW5jZSBlZGdlcyB0byB0aGUgc2xpY2UuXG5leHBvcnQgdHlwZSB7XG4gIENhdXNhbENoYWluT3B0aW9ucyxcbiAgQ2F1c2FsRWRnZSxcbiAgQ2F1c2FsTm9kZSxcbiAgQ29udHJvbERlcGVuZGVuY3ksXG4gIENvbnRyb2xEZXBMb29rdXAsXG4gIEVkZ2VXZWlnaGVyLFxuICBLZXlzUmVhZExvb2t1cCxcbn0gZnJvbSAnLi9saWIvbWVtb3J5L2JhY2t0cmFjay5qcyc7XG5leHBvcnQgeyBjYXVzYWxDaGFpbiwgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICcuL2xpYi9tZW1vcnkvYmFja3RyYWNrLmpzJztcbi8vIFJGQy0wMDMgRDIg4oCUIGhvbmVzdHkgbWFya2VyczogdGhlIHVudHJhY2tlZCByZWFkIHBhdGhzIGEgc3RhZ2UgY29uc3VtZWRcbi8vIChgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgIOKGkiBgQ2F1c2FsTm9kZS5pbmNvbXBsZXRlU291cmNlc2ApLlxuZXhwb3J0IHR5cGUgeyBVbnRyYWNrZWRTb3VyY2UgfSBmcm9tICcuL2xpYi9tZW1vcnkvdHlwZXMuanMnO1xuXG4vLyDilIDilIAgc2xpY2UvIOKAlCB2YXJpYWJsZS1maXJzdCBzbGljaW5nLCBib3RoIGRpcmVjdGlvbnMgKHRyaWFnZSBxdWVyeSBsYXllcikg4pSA4pSAXG4vLyBPbmUgY29udHJhY3QgZm9yIGV2ZXJ5IHRyaWFnZSBzdXJmYWNlIChVSSBwYW5lbCwgTExNIHRvb2wsIG9mZmxpbmVcbi8vIGF1dG9wc3kgYWdlbnQpOiB2YXJpYWJsZSBpbiDihpIgc2xpY2Ugb3V0LlxuLy9cbi8vIEJBQ0tXQVJEIOKAlCBgc2xpY2VGb3JLZXlgIGFuY2hvcnMgYXQgdGhlIGtleSdzIGxhc3Qgd3JpdGVyIHRoZW4gZGVsZWdhdGVzXG4vLyB0byBjYXVzYWxDaGFpbjsgYGFycmF5UHJvdmVuYW5jZWAgLyBgZWxlbWVudFByb3ZlbmFuY2VgIChhcHBlbmQtZm9sZClcbi8vIGFuc3dlciBlbGVtZW50LWxldmVsIHF1ZXN0aW9ucyBsaWtlIFwid2hpY2ggc3RhZ2UgcHJvZHVjZWQgaGlzdG9yeVs3XT9cIiDigJRcbi8vIHRoZSBmaXggZm9yIHRoZSBhZ2VudCBtZWdhLWtleSBwcm9ibGVtLCB3aXRoIGhvbmVzdCBhdHRyaWJ1dGlvbiBsYWJlbHMuXG4vL1xuLy8gRk9SV0FSRCDigJQgYGZvcndhcmRTbGljZUZvcktleWAgd2Fsa3MgdGhlIG90aGVyIHdheTogZnJvbSBhIHdyaXRlLCB0aHJvdWdoXG4vLyB0aGUgdmFsdWUncyBMSVZFIFJBTkdFIChpdCBsaXZlcyB1bnRpbCB0aGUga2V5J3MgbmV4dCB3cml0ZSksIHRvIGV2ZXJ5XG4vLyBzdGFnZSB0aGF0IHJlYWQgaXQgYW5kIGV2ZXJ5IHdyaXRlIHRob3NlIHJlYWRzIGZlZC4gYGtleVRpbWVsaW5lYCBpcyB0aGVcbi8vIGZsYXQgY2hyb25vbG9naWNhbCB2aWV3IG9mIHRoZSBzYW1lIGZhY3RzLiBGZWQgZWRnZXMgYXJlIEVYQUNUIHVuZGVyIHRoZVxuLy8gYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwgYW5kIHN0YW1wZWQgQ09OU0VSVkFUSVZFIHdpdGhvdXRcbi8vIGl0IOKAlCBuZXZlciB0aGUgb3RoZXIgd2F5IHJvdW5kLiBTZWUgc3JjL2xpYi9zbGljZS9SRUFETUUubWQuXG5leHBvcnQgdHlwZSB7XG4gIEFycmF5UHJvdmVuYW5jZSxcbiAgQXR0cmlidXRpb25CYXNpcyxcbiAgRWxlbWVudEJpcnRoLFxuICBGZWRCYXNpcyxcbiAgRm9yd2FyZEVkZ2UsXG4gIEZvcndhcmROb2RlLFxuICBGb3J3YXJkUmVhZCxcbiAgRm9yd2FyZFNsaWNlLFxuICBGb3J3YXJkU2xpY2VKU09OLFxuICBIb25lc3R5Tm90ZSxcbiAgSG9uZXN0eU5vdGVDb2RlLFxuICBLZXlNb21lbnQsXG4gIEtleXNSZWFkU291cmNlLFxuICBLZXlUaW1lbGluZSxcbiAgTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb24sXG4gIE1pc3NpbmdTbGljZVJlYXNvbixcbiAgUmVhZHNDb3ZlcmFnZSxcbiAgU2xpY2VKU09OLFxuICBTdGF0ZUtleSxcbiAgVmFyaWFibGVTbGljZSxcbn0gZnJvbSAnLi9saWIvc2xpY2UvaW5kZXguanMnO1xuZXhwb3J0IHR5cGUgeyBGb3J3YXJkU2xpY2VGb3JLZXlPcHRpb25zLCBLZXlUaW1lbGluZU9wdGlvbnMsIFNsaWNlRm9yS2V5T3B0aW9ucyB9IGZyb20gJy4vbGliL3NsaWNlL2luZGV4LmpzJztcbmV4cG9ydCB7XG4gIGFycmF5UHJvdmVuYW5jZSxcbiAgZWxlbWVudFByb3ZlbmFuY2UsXG4gIGZvcm1hdEZvcndhcmRTbGljZSxcbiAgZm9ybWF0U2xpY2UsXG4gIGZvcm1hdFRpbWVsaW5lLFxuICBmb3J3YXJkU2xpY2VGb3JLZXksXG4gIGZvcndhcmRTbGljZVRvSlNPTixcbiAga2V5c1JlYWRGcm9tRXhlY3V0aW9uVHJlZSxcbiAga2V5c1JlYWRGcm9tTWFwLFxuICBrZXlUaW1lbGluZSxcbiAgbm9ybWFsaXNlU3RhdGVLZXksXG4gIHJlc29sdmVLZXlzUmVhZFNvdXJjZSxcbiAgc2xpY2VGb3JLZXksXG4gIHNsaWNlVG9KU09OLFxufSBmcm9tICcuL2xpYi9zbGljZS9pbmRleC5qcyc7XG5cbi8vIOKUgOKUgCBob25lc3R5IOKAlCB0aGUgT05FIHJlZ2lzdHJ5IG9mIHdoYXQgYSByZWFkZXIgY2Fubm90IHNlZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFRoZSBob25lc3R5IHNpZ25hbHMgdGhpcyBkb29yJ3MgcmVhZGVycyBwcm9kdWNlIOKAlCBhIHNsaWNlJ3MgYEhvbmVzdHlOb3RlLmNvZGVgIGFuZCBgbWlzc2luZ2Bcbi8vIHJlYXNvbiwgYSBmZWQgZWRnZSdzIGFuZCBhbiBlbGVtZW50IGJpcnRoJ3MgYGJhc2lzYCwgYSBmb2xkJ3MgYGJhc2lzYCBhbmQgYHJlZGFjdGVkYCBwYXRocywgYVxuLy8gYExvZ0dhcGAsIGEgY2F1c2FsIG5vZGUncyBgaW5jb21wbGV0ZVNvdXJjZXNgIGFuZCBgdHJ1bmNhdGVkYCDigJQgZWFjaCBoYXMgYSBjb2RlIGhlcmUgYW5kIHRoZSBPTkVcbi8vIHNlbnRlbmNlIHRoYXQgc2F5cyB3aGF0IGl0IG1lYW5zLCBzbyBhIGxlbnMgb3IgYW4gYWdlbnQgdG9vbCBleHBsYWlucyBhbnkgb2YgdGhlbSBmcm9tIG9uZSBwbGFjZVxuLy8gaW5zdGVhZCBvZiBrZWVwaW5nIGl0cyBvd24gdGFibGUuIFRoZSB1bmlvbnMgb2YgdGhvc2UgY29kZXMgZXhwb3J0ZWQgYWJvdmUgKGBIb25lc3R5Tm90ZUNvZGVgLFxuLy8gYE1pc3NpbmdTbGljZVJlYXNvbmAsIGBNaXNzaW5nUHJvdmVuYW5jZVJlYXNvbmAsIGBGZWRCYXNpc2AsIGBBdHRyaWJ1dGlvbkJhc2lzYCwgYEZvbGRCYXNpc2ApIGFyZVxuLy8gc3Vic2V0cyBvZiBgSG9uZXN0eUNvZGVgLCBhbmQgdGVzdC9hcmNoaXRlY3R1cmUvaG9uZXN0eS12b2NhYnVsYXJ5LnRlc3QudHMgZmFpbHMgb24gYSB1bmlvbiBvZlxuLy8gc3RyaW5nIGxpdGVyYWxzIHRoaXMgZG9vciBleHBvcnRzIHRoYXQgaXMgbmVpdGhlciByZWdpc3RlcmVkIG5vciBuYW1lZCB0aGVyZSBhcyBhIGRpZmZlcmVudCBraW5kXG4vLyBvZiB3b3JkLiBTZWUgc3JjL2xpYi9tZW1vcnkvUkVBRE1FLm1kLlxuZXhwb3J0IHR5cGUgeyBIb25lc3R5Q29kZSB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5leHBvcnQgeyBIT05FU1RZX0NPREVTIH0gZnJvbSAnLi9saWIvbWVtb3J5L2luZGV4LmpzJztcblxuLy8g4pSA4pSAIHY1IFN0b3JlcyAoY29uY3JldGUsIGNvbXBvc2FibGUg4oCUIHByaW1hcnkgcmVjb3JkZXIgQVBJKSDilIDilIDilIDilIDilIBcbi8vIENvbXBvc2UgdGhlc2UgdmlhIGBuZXcgU3RvcmU8VD4oKWAgYXMgYSBmaWVsZCBvbiB5b3VyIHJlY29yZGVyXG4vLyBjbGFzcy4gT25lIHB1cnBvc2UgcGVyIHJlY29yZGVyOiBzdG9yZXMgYXJlIHN0b3JhZ2U7IHJlY29yZGVyc1xuLy8gYXJlIGV2ZW50LWhvb2sgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9ucy5cbmV4cG9ydCB7IEJvdW5kYXJ5U3RhdGVTdG9yZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVTdG9yZS5qcyc7XG5leHBvcnQgeyBLZXllZFN0b3JlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvS2V5ZWRTdG9yZS5qcyc7XG5leHBvcnQgeyBTZXF1ZW5jZVN0b3JlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvU2VxdWVuY2VTdG9yZS5qcyc7XG5cbi8vIOKUgOKUgCB2NS4xIENvbW1pdCBncm91cGluZyBwcmltaXRpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBJbnRlcnZhbCBpbmRleCBvdmVyIGNvbW1pdCBpbmRpY2VzLiBCdWlsdCBpbmNyZW1lbnRhbGx5IGR1cmluZ1xuLy8gdHJhdmVyc2FsOiBvcGVuKCkgb24gYm91bmRhcnkgZW50cnksIGNsb3NlKCkgb24gZXhpdC4gUXVlcnkgYXQgYW55XG4vLyBjb21taXQgcG9zaXRpb24gd2l0aCBlbmNsb3NpbmcoKS9vdmVybGFwcGluZygpLiBHZW5lcmljIG92ZXIgVExhYmVsXG4vLyDigJQgZm9vdHByaW50anMgb3ducyBaRVJPIGtub3dsZWRnZSBvZiB3aGF0IGNvbnN1bWVycyB1c2UgYXMgbGFiZWxzLlxuLy8gU2VlIGRvY3MvZGVzaWduL2NvbW1pdC1yYW5nZS1pbmRleC5tZCBmb3IgdGhlIGZ1bGwgY29udHJhY3QuXG5leHBvcnQgdHlwZSB7IFJhbmdlRW50cnksIFJhbmdlVG9rZW4gfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Db21taXRSYW5nZUluZGV4LmpzJztcbmV4cG9ydCB7IENvbW1pdFJhbmdlSW5kZXggfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Db21taXRSYW5nZUluZGV4LmpzJztcblxuLy8gVG9wb2xvZ3lSZWNvcmRlciDigJQgY29tcG9zaXRpb24gZ3JhcGggYWNjdW11bGF0b3IgKHN1YmZsb3dzICsgY29udHJvbC1mbG93IGVkZ2VzKVxuZXhwb3J0IHR5cGUge1xuICBUb3BvbG9neSxcbiAgVG9wb2xvZ3lFZGdlLFxuICBUb3BvbG9neUluY29taW5nS2luZCxcbiAgVG9wb2xvZ3lOb2RlLFxuICBUb3BvbG9neVJlY29yZGVyT3B0aW9ucyxcbn0gZnJvbSAnLi9saWIvcmVjb3JkZXIvVG9wb2xvZ3lSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBUb3BvbG9neVJlY29yZGVyLCB0b3BvbG9neVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvVG9wb2xvZ3lSZWNvcmRlci5qcyc7XG5cbi8vIEluT3V0UmVjb3JkZXIg4oCUIGNoYXJ0IGluL291dCBzdHJlYW0gKGVudHJ5L2V4aXQgcGFpcnMgYXQgZXZlcnkgY2hhcnQgYm91bmRhcnksXG4vLyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBydW4gYW5kIGV2ZXJ5IHN1YmZsb3cpXG5leHBvcnQgdHlwZSB7IEluT3V0RW50cnksIEluT3V0UGhhc2UsIEluT3V0UmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBJbk91dFJlY29yZGVyLCBpbk91dFJlY29yZGVyLCBST09UX1JVTlRJTUVfU1RBR0VfSUQsIFJPT1RfU1VCRkxPV19JRCB9IGZyb20gJy4vbGliL3JlY29yZGVyL0luT3V0UmVjb3JkZXIuanMnO1xuXG4vLyBDb250cm9sRGVwUmVjb3JkZXIg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSB0cmFja2luZyAoUkZDLTAwMyBENSk6IHJlY29yZHNcbi8vIG9uRGVjaXNpb24vb25TZWxlY3RlZCArIHRoZSBEMSBydW50aW1lIGFuY2VzdG9yIGNoYWluLCBhbnN3ZXJzIFwid2hpY2hcbi8vIGRlY2lzaW9uIGFsbG93ZWQgdGhpcyBzdGFnZSB0byBydW4/XCIg4oCUIHRoZSBidWlsdC1pbiBwcm9kdWNlciBmb3Jcbi8vIGNhdXNhbENoYWluJ3MgYGNvbnRyb2xEZXBzYCBvcHRpb24uXG5leHBvcnQgdHlwZSB7IENvbnRyb2xEZWNpc2lvblJlY29yZCwgQ29udHJvbERlcFJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4vbGliL3JlY29yZGVyL0NvbnRyb2xEZXBSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBDb250cm9sRGVwUmVjb3JkZXIsIGNvbnRyb2xEZXBSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL0NvbnRyb2xEZXBSZWNvcmRlci5qcyc7XG5cbi8vIFF1YWxpdHlSZWNvcmRlciDigJQgcGVyLXN0ZXAgcXVhbGl0eSBzY29yaW5nIHdpdGggYmFja3RyYWNraW5nXG5leHBvcnQgdHlwZSB7IFF1YWxpdHlFbnRyeSwgUXVhbGl0eVJlY29yZGVyT3B0aW9ucywgUXVhbGl0eVNjb3JpbmdGbiB9IGZyb20gJy4vbGliL3JlY29yZGVyL1F1YWxpdHlSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBRdWFsaXR5UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIuanMnO1xuXG4vLyBxdWFsaXR5VHJhY2Ug4oCUIFF1YWxpdHkgU3RhY2sgVHJhY2UgKGJhY2t0cmFjayBmcm9tIGxvdy1zY29yaW5nIHN0ZXBzKVxuZXhwb3J0IHR5cGUgeyBRdWFsaXR5RnJhbWUsIFF1YWxpdHlTdGFja1RyYWNlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvcXVhbGl0eVRyYWNlLmpzJztcbmV4cG9ydCB7IGZvcm1hdFF1YWxpdHlUcmFjZSwgcXVhbGl0eVRyYWNlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvcXVhbGl0eVRyYWNlLmpzJztcbiJdfQ==
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7Ozs7QUFJSCxpRUFLcUM7QUFKbkMsd0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsMkhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsd0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsaUhBQUEsWUFBWSxPQUFBO0FBR2QsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsZ0ZBQWdGO0FBQ2hGLHdFQUF3RTtBQUN4RSx3REFBd0Q7QUFDeEQsNENBQTRDO0FBQzVDLCtEQU1vQztBQUxsQyx5SEFBQSxxQkFBcUIsT0FBQTtBQUNyQixzSEFBQSxrQkFBa0IsT0FBQTtBQUNsQiwwSEFBQSxzQkFBc0IsT0FBQTtBQUN0QixtSEFBQSxlQUFlLE9BQUE7QUFDZixzSEFBQSxrQkFBa0IsT0FBQTtBQU1wQixzRUFBa0U7QUFBekQscUhBQUEsZUFBZSxPQUFBO0FBRXhCLDZFQUE2RTtBQUM3RSwrRUFBK0U7QUFDL0UseUVBQXlFO0FBQ3pFLDhFQUE4RTtBQUM5RSxvRUFBb0U7QUFDcEUsa0RBQXFEO0FBQTVDLHdHQUFBLFlBQVksT0FBQTtBQUVyQix1RUFBdUU7QUFDdkUseUVBQXlFO0FBQ3pFLHFFQUFxRTtBQUNyRSxzREFBc0Q7QUFDdEQsa0RBQXlEO0FBQWhELDRHQUFBLGdCQUFnQixPQUFBO0FBUXpCLGtEQUF3RDtBQUEvQywyR0FBQSxlQUFlLE9BQUE7QUFheEIsb0VBY3dDO0FBYnRDLHFIQUFBLGdCQUFnQixPQUFBO0FBQ2hCLGtIQUFBLGFBQWEsT0FBQTtBQUNiLGtIQUFBLGFBQWEsT0FBQTtBQUNiLDJIQUFBLHNCQUFzQixPQUFBO0FBQ3RCLCtHQUFBLFVBQVUsT0FBQTtBQUNWLGdIQUFBLFdBQVcsT0FBQTtBQUNYLG1IQUFBLGNBQWMsT0FBQTtBQUNkLDRIQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsOENBQThDO0FBQzlDLHNIQUFBLGlCQUFpQixPQUFBO0FBQ2pCLGtIQUFBLGFBQWEsT0FBQTtBQTJDZix1REFTb0M7QUFSbEMsdUdBQUEsV0FBVyxPQUFBO0FBQ1gsK0dBQUEsbUJBQW1CLE9BQUE7QUFDbkIsdUdBQUEsV0FBVyxPQUFBO0FBQ1gsMEdBQUEsY0FBYyxPQUFBO0FBQ2QscUdBQUEsU0FBUyxPQUFBO0FBQ1QsbUdBQUEsT0FBTyxPQUFBO0FBQ1Asb0dBQUEsUUFBUSxPQUFBO0FBQ1Isc0dBQUEsVUFBVSxPQUFBO0FBZ0JaLDBEQUE2RjtBQUFwRiwyR0FBQSxXQUFXLE9BQUE7QUFBRSxnSEFBQSxnQkFBZ0IsT0FBQTtBQUFFLGlIQUFBLGlCQUFpQixPQUFBO0FBMkN6RCxpREFlOEI7QUFkNUIsMkdBQUEsZUFBZSxPQUFBO0FBQ2YsNkdBQUEsaUJBQWlCLE9BQUE7QUFDakIsOEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsdUdBQUEsV0FBVyxPQUFBO0FBQ1gsMEdBQUEsY0FBYyxPQUFBO0FBQ2QsOEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsOEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIscUhBQUEseUJBQXlCLE9BQUE7QUFDekIsMkdBQUEsZUFBZSxPQUFBO0FBQ2YsdUdBQUEsV0FBVyxPQUFBO0FBQ1gsNkdBQUEsaUJBQWlCLE9BQUE7QUFDakIsaUhBQUEscUJBQXFCLE9BQUE7QUFDckIsdUdBQUEsV0FBVyxPQUFBO0FBQ1gsdUdBQUEsV0FBVyxPQUFBO0FBY2Isa0RBQXNEO0FBQTdDLHlHQUFBLGFBQWEsT0FBQTtBQUV0QixtRUFBbUU7QUFDbkUsaUVBQWlFO0FBQ2pFLGlFQUFpRTtBQUNqRSw0Q0FBNEM7QUFDNUMsOEVBQTBFO0FBQWpFLDJIQUFBLGtCQUFrQixPQUFBO0FBQzNCLDhEQUEwRDtBQUFqRCwyR0FBQSxVQUFVLE9BQUE7QUFDbkIsb0VBQWdFO0FBQXZELGlIQUFBLGFBQWEsT0FBQTtBQVN0QiwwRUFBc0U7QUFBN0QsdUhBQUEsZ0JBQWdCLE9BQUE7QUFVekIsMEVBQXdGO0FBQS9FLHVIQUFBLGdCQUFnQixPQUFBO0FBQUUsdUhBQUEsZ0JBQWdCLE9BQUE7QUFLM0Msb0VBQXVIO0FBQTlHLGlIQUFBLGFBQWEsT0FBQTtBQUFFLGlIQUFBLGFBQWEsT0FBQTtBQUFFLHlIQUFBLHFCQUFxQixPQUFBO0FBQUUsbUhBQUEsZUFBZSxPQUFBO0FBTzdFLDhFQUE4RjtBQUFyRiwySEFBQSxrQkFBa0IsT0FBQTtBQUFFLDJIQUFBLGtCQUFrQixPQUFBO0FBSS9DLHdFQUFvRTtBQUEzRCxxSEFBQSxlQUFlLE9BQUE7QUFJeEIsa0VBQWtGO0FBQXpFLHFIQUFBLGtCQUFrQixPQUFBO0FBQUUsK0dBQUEsWUFBWSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBmb290cHJpbnRqcy90cmFjZSDigJQgRXhlY3V0aW9uIHRyYWNpbmcsIGRlYnVnZ2luZywgYW5kIGJhY2t0cmFja2luZyB1dGlsaXRpZXMuXG4gKlxuICogUnVudGltZSBzdGFnZSBJRHMsIGNvbW1pdCBsb2cgcXVlcmllcywgYW5kIHJlY29yZGVyIGJhc2UgY2xhc3Nlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgcGFyc2VSdW50aW1lU3RhZ2VJZCwgZmluZExhc3RXcml0ZXIsIEtleWVkU3RvcmUsIFNlcXVlbmNlU3RvcmUgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogLy8gUGFyc2UgYSBydW50aW1lU3RhZ2VJZFxuICogY29uc3QgeyBzdGFnZUlkLCBleGVjdXRpb25JbmRleCB9ID0gcGFyc2VSdW50aW1lU3RhZ2VJZCgnY2FsbC1sbG0jNScpO1xuICpcbiAqIC8vIEJhY2t0cmFjazogd2hvIHdyb3RlICdzeXN0ZW1Qcm9tcHQnIGJlZm9yZSBjb21taXQgYXQgaWR4IDg/XG4gKiBjb25zdCB3cml0ZXIgPSBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csICdzeXN0ZW1Qcm9tcHQnLCA4KTtcbiAqXG4gKiAvLyB2NSBwcmltYXJ5IEFQSTogY29tcG9zZSBhIFN0b3JlIGFzIGEgZmllbGQgKG9uZSBwdXJwb3NlIHBlciByZWNvcmRlcikuXG4gKiAvLyBLZXllZFN0b3JlPFQ+IOKAlCAxOjEgKG9uZSBlbnRyeSBwZXIgc3RlcClcbiAqIGNsYXNzIE15UmVjb3JkZXIge1xuICogICByZWFkb25seSBpZCA9ICdteS1yZWNvcmRlcic7XG4gKiAgIHByaXZhdGUgc3RvcmUgPSBuZXcgS2V5ZWRTdG9yZTxNeUVudHJ5PigpO1xuICogICBvbldyaXRlKGUpIHsgdGhpcy5zdG9yZS5zZXQoZS5ydW50aW1lU3RhZ2VJZCwgeyAuLi4gfSk7IH1cbiAqIH1cbiAqXG4gKiAvLyBTZXF1ZW5jZVN0b3JlPFQ+IOKAlCAxOk4gKG11bHRpcGxlIGVudHJpZXMgcGVyIHN0ZXAsIG9yZGVyaW5nIG1hdHRlcnMpXG4gKiBjbGFzcyBBdWRpdFJlY29yZGVyIHtcbiAqICAgcmVhZG9ubHkgaWQgPSAnYXVkaXQnO1xuICogICBwcml2YXRlIHN0b3JlID0gbmV3IFNlcXVlbmNlU3RvcmU8QXVkaXRFbnRyeT4oKTtcbiAqICAgb25SZWFkKGUpIHsgdGhpcy5zdG9yZS5wdXNoKHsgcnVudGltZVN0YWdlSWQ6IGUucnVudGltZVN0YWdlSWQsIC4uLiB9KTsgfVxuICogfVxuICogYGBgXG4gKi9cblxuLy8gUnVudGltZSBzdGFnZSBJRCDigJQgdW5pcXVlIGV4ZWN1dGlvbiBzdGVwIGlkZW50aWZpZXJzXG5leHBvcnQgdHlwZSB7IENvbW1pdElkeCwgRXhlY3V0aW9uQ291bnRlciwgRXhlY3V0aW9uSW5kZXgsIFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi9saWIvaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcbmV4cG9ydCB7XG4gIGJ1aWxkUnVudGltZVN0YWdlSWQsXG4gIGNyZWF0ZUV4ZWN1dGlvbkNvdW50ZXIsXG4gIHBhcnNlUnVudGltZVN0YWdlSWQsXG4gIHNwbGl0U3RhZ2VJZCxcbn0gZnJvbSAnLi9saWIvaWRzL3J1bnRpbWVTdGFnZUlkLmpzJztcblxuLy8gR2VuZXJhdGVkIGJyYW5jaCBzZWdtZW50cyDigJQgdGhlIHN1YmZsb3cgcGF0aCBzZWdtZW50cyBgYWRkUGFyYWxsZWxGb3JFYWNoYFxuLy8gbWludHMgZm9yIGl0cyBicmFuY2hlcyAoYDxzdGFnZUlkPn48aW5kZXg+YCkuIEEgYnJhbmNoIGlzIGFkZHJlc3NlZCBieSB0aGVcbi8vIE9SRElOQVJZIGdyYW1tYXIgYWJvdmUsIHNvIG5vdGhpbmcgaGVyZSBpcyBuZWVkZWQgdG8gUkVBRCBvbmU7IHRoZXNlIGV4aXN0IHNvXG4vLyBhIGNvbnN1bWVyIGNhbiBURUxMIGEgZ2VuZXJhdGVkIGJyYW5jaCBmcm9tIGEgaGFuZC1hdXRob3JlZCBzdWJmbG93ICh0byBsYWJlbFxuLy8gaXQgXCJicmFuY2ggMiBvZiByZXZpZXctY2h1bmtzXCIgaW5zdGVhZCBvZiBhIHN1YmZsb3cgbmFtZSksIGFuZCBzbyB0aGVcbi8vIHJlc2VydmVkIG1hcmtlciBpcyBkaXNjb3ZlcmFibGUgcmF0aGVyIHRoYW4gZm9sa2xvcmUuXG4vLyBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kLlxuZXhwb3J0IHtcbiAgQlJBTkNIX1NFR01FTlRfTUFSS0VSLFxuICBidWlsZEJyYW5jaFNlZ21lbnQsXG4gIGhhc0JyYW5jaFNlZ21lbnRNYXJrZXIsXG4gIGlzQnJhbmNoU2VnbWVudCxcbiAgcGFyc2VCcmFuY2hTZWdtZW50LFxufSBmcm9tICcuL2xpYi9pZHMvYnJhbmNoU2VnbWVudC5qcyc7XG5cbi8vIHdhbGtTdWJmbG93U3BlYyDigJQgZmxhdCBvcmRlcmVkIHRyYXZlcnNhbCBvZiBhIHN1YmZsb3cncyBzdHJ1Y3R1cmVcbi8vIChjb25zdW1lIHZpYSBTdHJ1Y3R1cmVSZWNvcmRlci5vblN1YmZsb3dNb3VudGVkJ3Mgc3ViZmxvd1NwZWMgcGF5bG9hZClcbmV4cG9ydCB0eXBlIHsgV2Fsa2VySXRlbSwgV2Fsa2VyT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS93YWxrU3ViZmxvd1NwZWMuanMnO1xuZXhwb3J0IHsgd2Fsa1N1YmZsb3dTcGVjIH0gZnJvbSAnLi9saWIvZW5naW5lL3dhbGtTdWJmbG93U3BlYy5qcyc7XG5cbi8vIFBhdGggc2VnbWVudHMg4oCUIHRoZSBzdXBwb3J0ZWQgd2F5IHRvIHRha2UgYSBgVHJhY2VFbnRyeS5wYXRoYCBhcGFydC4gUGF0aHNcbi8vIGFyZSBqb2luZWQgd2l0aCBhbiBBU0NJSSBVbml0LVNlcGFyYXRvciAobmV2ZXIgYSBkb3Q6IGEgc3RhdGUga2V5IG1heSBpdHNlbGZcbi8vIGNvbnRhaW4gYSBkb3QsIHNvIGEgZG90IHNlcGFyYXRvciB3b3VsZCBtYWtlIGBbJ2EuYiddYCBhbmQgYFsnYScsJ2InXWBcbi8vIGluZGlzdGluZ3Vpc2hhYmxlKSwgd2hpY2ggaXMgYW4gZW5jb2RpbmcsIG5vdCBhIGRpc3BsYXkgY2hhcmFjdGVyLiBSZW5kZXIgYVxuLy8gcGF0aCB0aHJvdWdoIHRoaXMgaW5zdGVhZCBvZiBzcGxpdHRpbmcgb24gdGhlIGRlbGltaXRlciB5b3Vyc2VsZi5cbmV4cG9ydCB7IHBhdGhTZWdtZW50cyB9IGZyb20gJy4vbGliL21lbW9yeS91dGlscy5qcyc7XG5cbi8vIFRoZSByZWZ1c2FsIHRoZSBjb21taXQtbG9nIHJlYWRlcnMgcmFpc2UgZm9yIGEgcm93IHdob3NlIHZlcmIgaXMgbm90XG4vLyBzZXQgfCBtZXJnZSB8IGFwcGVuZCB8IGRlbGV0ZSAoYGNvbW1pdFZhbHVlQXRgLCBgYXJyYXlQcm92ZW5hbmNlYCwgYW5kXG4vLyBgYXBwbHlTbWFydE1lcmdlYCBiZWxvdyk6IGEgZm9yZWlnbiBvciBjb3JydXB0ZWQgbG9nIGZhaWxzIGxvdWRseSxcbi8vIG5hbWluZyB0aGUgcm93LCBpbnN0ZWFkIG9mIGJlaW5nIGZvbGRlZCBhcyBhIG1lcmdlLlxuZXhwb3J0IHsgVW5rbm93blZlcmJFcnJvciB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8vIFRoZSByZWNvcmQncyBvd24gc2hhcGVzIOKAlCBvbmUgYnVuZGxlIHBlciBleGVjdXRlZCBzdGFnZSAoYENvbW1pdEJ1bmRsZWApLCBpdHNcbi8vIHJvd3MgKGBUcmFjZUVudHJ5YCkgYW5kIGl0cyB2YWx1ZSBwYXRjaGVzIChgTWVtb3J5UGF0Y2hgKSDigJQgYW5kIHRoZSBvbmUgZm9sZFxuLy8gb2YgYSBidW5kbGUgb250byBhIHN0YXRlIHRoYXQgaGFuZHMgYmFjayBhIGZ1bGx5IGRldGFjaGVkIHJlc3VsdFxuLy8gKGBhcHBseVNtYXJ0TWVyZ2VgLCB0aGUgdmVyYiBsYXcncyBwdWJsaWMgZG9vcikuIEFsc28gb24gYC9hZHZhbmNlZGAgdW50aWwgMTAuMC4wO1xuLy8gYSByZWNvcmQgaXMgV1JJVFRFTiB0aHJvdWdoIGBmb290cHJpbnRqcy93cml0ZWAuIFNlZSBkb2NzL2d1aWRlcy9yZWNvcmQtY29udHJhY3QubWQuXG5leHBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL2xpYi9tZW1vcnkvdHlwZXMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlIH0gZnJvbSAnLi9saWIvbWVtb3J5L3ZlcmJzLmpzJztcblxuLy8gQ29tbWl0IGxvZyBxdWVyaWVzIOKAlCB0eXBlZCB1dGlsaXRpZXMgZm9yIGJhY2t0cmFja2luZy5cbi8vIGNvbW1pdFZhbHVlQXQgcmVjb25zdHJ1Y3RzIHRoZSBGVUxMIHZhbHVlIG9mIGEga2V5IGF0IGEgY29tbWl0IGluZGV4IOKAlFxuLy8gcmVxdWlyZWQgdW5kZXIgYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AgKCMxM2MtQiksIHdoZXJlIGFuIGBhcHBlbmRgXG4vLyBidW5kbGUncyBgb3ZlcndyaXRlW2tleV1gIGhvbGRzIG9ubHkgdGhlIHRhaWwuXG5leHBvcnQgdHlwZSB7XG4gIFZhbHVlQmFzaXMsXG4gIFZhbHVlQmFzaXNPcHRpb25zLFxuICBWYWx1ZVdpdGhCYXNpcyxcbiAgV3JpdGVyQmFzaXMsXG4gIFdyaXRlcldpdGhCYXNpcyxcbn0gZnJvbSAnLi9saWIvbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmV4cG9ydCB7XG4gIGJ1aWxkQ29tbWl0SW5kZXgsXG4gIGNvbW1pdEluZGV4T2YsXG4gIGNvbW1pdFZhbHVlQXQsXG4gIGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMsXG4gIGZpbmRDb21taXQsXG4gIGZpbmRDb21taXRzLFxuICBmaW5kTGFzdFdyaXRlcixcbiAgZmluZExhc3RXcml0ZXJXaXRoQmFzaXMsXG4gIC8vIE9uZSBzdGFnZSwgb25lIHJlY29yZCAoRjgsIDkuMzkuMCk6IGRvZXMgYSBsb2cgcmVjb3JkIGl0cyBjb250aW51YXRpb25zXG4gIC8vIChgQ29tbWl0QnVuZGxlLnBoYXNlYCksIGFuZCDigJQgZm9yIGEgbG9nIHdyaXR0ZW4gYmVmb3JlIGl0IOKAlCB0aGUgT05FIGxlZ2FjeVxuICAvLyByZWFkZXIgdGhhdCBpbmZlcnMgdGhlbSB0aGUgd2F5IDkuMzguMCBkaWQuXG4gIGluZmVyTGVnYWN5UGhhc2VzLFxuICByZWNvcmRzUGhhc2VzLFxufSBmcm9tICcuL2xpYi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuZXhwb3J0IHR5cGUgeyBDb21taXRQaGFzZSB9IGZyb20gJy4vbGliL21lbW9yeS90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCB0aW1lLXRyYXZlbC8g4oCUIHRoZSBSRUFERVInUyBjdXJzb3Igb3ZlciBhIGZpbmlzaGVkIHRyYWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQSBUcmFjZSBpcyB3aGF0IHRoZSBydW4gcmVjb3JkZWQ7IHRpbWUgdHJhdmVsIGlzIGEgY3Vyc29yIG92ZXIgaXQgd2l0aCBhXG4vLyBGb2xkIGF0IGVhY2ggc3RvcC4gSXQgaXMgTk9UIHRoZSBlbmdpbmUncyB3YWxrIGFuZCBuZXZlciBiZWNvbWVzIGEgc2Vjb25kXG4vLyBsaXZlIGN1cnNvcjogZXZlcnl0aGluZyBiZWxvdyBpcyBhIHJlYWQtdGltZSBxdWVyeSBvdmVyIGFscmVhZHktY29sbGVjdGVkXG4vLyBkYXRhLlxuLy9cbi8vIGBzdGF0ZUF0KHNuYXBzaG90IHwgc3VidHJlZSwgY29tbWl0SWR4KWAgaXMgdGhlIGZvbGQg4oCUIHRoZSBydW4nc1xuLy8gYGluaXRpYWxTdGF0ZWAgcmVwbGF5ZWQgdGhyb3VnaCBgY29tbWl0TG9nWzAuLmNvbW1pdElkeF1gIHdpdGggdGhlIFNBTUUgdmVyYlxuLy8gc3dpdGNoIHRoZSBsaXZlIGNvbW1pdCB1c2VzLCByZXR1cm5lZCBkZXRhY2hlZCBhbmQgZnJvemVuLCBhbmQgaG9uZXN0IGFib3V0XG4vLyBob3cgaXQgd2FzIGRlcml2ZWQgKGBiYXNpc2ApIGFuZCB3aGVyZSB0aGUgbG9nIHdhcyBzY3J1YmJlZCAoYHJlZGFjdGVkYCkuXG4vL1xuLy8gYHRpbWVUcmF2ZWwoc25hcHNob3QpYCBpcyB0aGUgY3Vyc29yOiBzdG9wcywgcHJldi9uZXh0L2p1bXBUbywgbWFya3MgYmVzaWRlXG4vLyB0aGUgbG9nLCBhbmQgYGRyaWxsKG1vdW50KWAgaW50byBhIHN1YmZsb3cncyBvd24gbG9nIOKAlCB0aGUgc2FtZSBpbnRlcmZhY2UsXG4vLyBpdHMgb3duIGJhc2UuIEhvdyBzdG9wcyBhcmUgREVSSVZFRCBpcyB0aGUgc2VhbSAoYFRpbWVUcmF2ZWxTdHJhdGVneWApO1xuLy8gZm9vdHByaW50anMgc2hpcHMgYGNvbW1pdFN0b3BzYCAob25lIHN0b3AgcGVyIGV4ZWN1dGVkIHN0YWdlKSBiZWNhdXNlIHRoYXRcbi8vIGlzIHRoZSBvbmx5IHN0b3AgZ3JhbW1hciB0aGUgc3Vic3RyYXRlIGl0c2VsZiBrbm93cyDigJQgYW5kLCBzaW5jZSA5LjIxLjAsXG4vLyBgdGFnU3RvcHModGFncz8pYDogdGhlIHN0b3BzIGEgY2hhcnQgREVDTEFSRUQgYXQgYnVpbGQgdGltZSAoYC50YWcoKWApLFxuLy8gcmVhZCBiYWNrIG9mZiBgQ29tbWl0QnVuZGxlLnRhZ3NgLCBzbyBhIHN0b3JlZCByZWNvcmRpbmcgc2NydWJzIGJ5IGl0cyBvd25cbi8vIG1pbGVzdG9uZXMgd2l0aCBubyBpZCBjb252ZW50aW9ucyBpbiB0aGUgcmVhZGVyLlxuLy8gU2VlIHNyYy9saWIvdGltZS10cmF2ZWwvUkVBRE1FLm1kLlxuZXhwb3J0IHR5cGUge1xuICBBeGlzUmVmdXNhbCxcbiAgQXhpc1NwbGl0LFxuICBCb29rZW5kZWRBeGlzLFxuICBGb2xkQmFzaXMsXG4gIEZvbGRlZFN0YXRlLFxuICBGb2xkU291cmNlLFxuICBMb2dHYXAsXG4gIE1hcmssXG4gIE1vdmUsXG4gIE1vdmVSZWZ1c2FsLFxuICBTdG9wLFxuICBTdG9wRmlsdGVyLFxuICBTdG9wS2luZCxcbiAgVGltZVRyYXZlbCxcbiAgVGltZVRyYXZlbE9wdGlvbnMsXG4gIFRpbWVUcmF2ZWxTb3VyY2UsXG4gIFRpbWVUcmF2ZWxTdHJhdGVneSxcbn0gZnJvbSAnLi9saWIvdGltZS10cmF2ZWwvaW5kZXguanMnO1xuZXhwb3J0IHtcbiAgY29tbWl0U3RvcHMsXG4gIGNvbW1pdFN0b3BzU3RyYXRlZ3ksXG4gIGZpbHRlclN0b3BzLFxuICBpc0NvbW1pdEJ1bmRsZSxcbiAgc3BsaXRBeGlzLFxuICBzdGF0ZUF0LFxuICB0YWdTdG9wcyxcbiAgdGltZVRyYXZlbCxcbn0gZnJvbSAnLi9saWIvdGltZS10cmF2ZWwvaW5kZXguanMnO1xuXG4vLyBDYXVzYWwgY2hhaW4g4oCUIGJhY2t3YXJkIHByb2dyYW0gc2xpY2luZyBvbiBjb21taXQgbG9nIChEQUcpLlxuLy8gUkZDLTAwMyBEMzogYENhdXNhbEVkZ2VgICh0eXBlZC9rZXllZC93ZWlnaHRlZCBwYXJlbnQgbGlua3Mgb25cbi8vIGBDYXVzYWxOb2RlLnBhcmVudEVkZ2VzYCkgKyB0aGUgYGNvbnRyb2xEZXBzYCBvcHRpb24gKGBDb250cm9sRGVwTG9va3VwYClcbi8vIGFkZCBjb250cm9sLWRlcGVuZGVuY2UgZWRnZXMgdG8gdGhlIHNsaWNlLlxuZXhwb3J0IHR5cGUge1xuICBDYXVzYWxDaGFpbk9wdGlvbnMsXG4gIENhdXNhbEVkZ2UsXG4gIENhdXNhbE5vZGUsXG4gIENvbnRyb2xEZXBlbmRlbmN5LFxuICBDb250cm9sRGVwTG9va3VwLFxuICBFZGdlV2VpZ2hlcixcbiAgS2V5c1JlYWRMb29rdXAsXG59IGZyb20gJy4vbGliL21lbW9yeS9iYWNrdHJhY2suanMnO1xuZXhwb3J0IHsgY2F1c2FsQ2hhaW4sIGZsYXR0ZW5DYXVzYWxEQUcsIGZvcm1hdENhdXNhbENoYWluIH0gZnJvbSAnLi9saWIvbWVtb3J5L2JhY2t0cmFjay5qcyc7XG4vLyBSRkMtMDAzIEQyIOKAlCBob25lc3R5IG1hcmtlcnM6IHRoZSB1bnRyYWNrZWQgcmVhZCBwYXRocyBhIHN0YWdlIGNvbnN1bWVkXG4vLyAoYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYCDihpIgYENhdXNhbE5vZGUuaW5jb21wbGV0ZVNvdXJjZXNgKS5cbmV4cG9ydCB0eXBlIHsgVW50cmFja2VkU291cmNlIH0gZnJvbSAnLi9saWIvbWVtb3J5L3R5cGVzLmpzJztcblxuLy8g4pSA4pSAIHNsaWNlLyDigJQgdmFyaWFibGUtZmlyc3Qgc2xpY2luZywgYm90aCBkaXJlY3Rpb25zICh0cmlhZ2UgcXVlcnkgbGF5ZXIpIOKUgOKUgFxuLy8gT25lIGNvbnRyYWN0IGZvciBldmVyeSB0cmlhZ2Ugc3VyZmFjZSAoVUkgcGFuZWwsIExMTSB0b29sLCBvZmZsaW5lXG4vLyBhdXRvcHN5IGFnZW50KTogdmFyaWFibGUgaW4g4oaSIHNsaWNlIG91dC5cbi8vXG4vLyBCQUNLV0FSRCDigJQgYHNsaWNlRm9yS2V5YCBhbmNob3JzIGF0IHRoZSBrZXkncyBsYXN0IHdyaXRlciB0aGVuIGRlbGVnYXRlc1xuLy8gdG8gY2F1c2FsQ2hhaW47IGBhcnJheVByb3ZlbmFuY2VgIC8gYGVsZW1lbnRQcm92ZW5hbmNlYCAoYXBwZW5kLWZvbGQpXG4vLyBhbnN3ZXIgZWxlbWVudC1sZXZlbCBxdWVzdGlvbnMgbGlrZSBcIndoaWNoIHN0YWdlIHByb2R1Y2VkIGhpc3RvcnlbN10/XCIg4oCUXG4vLyB0aGUgZml4IGZvciB0aGUgYWdlbnQgbWVnYS1rZXkgcHJvYmxlbSwgd2l0aCBob25lc3QgYXR0cmlidXRpb24gbGFiZWxzLlxuLy9cbi8vIEZPUldBUkQg4oCUIGBmb3J3YXJkU2xpY2VGb3JLZXlgIHdhbGtzIHRoZSBvdGhlciB3YXk6IGZyb20gYSB3cml0ZSwgdGhyb3VnaFxuLy8gdGhlIHZhbHVlJ3MgTElWRSBSQU5HRSAoaXQgbGl2ZXMgdW50aWwgdGhlIGtleSdzIG5leHQgd3JpdGUpLCB0byBldmVyeVxuLy8gc3RhZ2UgdGhhdCByZWFkIGl0IGFuZCBldmVyeSB3cml0ZSB0aG9zZSByZWFkcyBmZWQuIGBrZXlUaW1lbGluZWAgaXMgdGhlXG4vLyBmbGF0IGNocm9ub2xvZ2ljYWwgdmlldyBvZiB0aGUgc2FtZSBmYWN0cy4gRmVkIGVkZ2VzIGFyZSBFWEFDVCB1bmRlciB0aGVcbi8vIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsIGFuZCBzdGFtcGVkIENPTlNFUlZBVElWRSB3aXRob3V0XG4vLyBpdCDigJQgbmV2ZXIgdGhlIG90aGVyIHdheSByb3VuZC4gU2VlIHNyYy9saWIvc2xpY2UvUkVBRE1FLm1kLlxuZXhwb3J0IHR5cGUge1xuICBBcnJheVByb3ZlbmFuY2UsXG4gIEF0dHJpYnV0aW9uQmFzaXMsXG4gIEVsZW1lbnRCaXJ0aCxcbiAgRmVkQmFzaXMsXG4gIEZvcndhcmRFZGdlLFxuICBGb3J3YXJkTm9kZSxcbiAgRm9yd2FyZFJlYWQsXG4gIEZvcndhcmRTbGljZSxcbiAgRm9yd2FyZFNsaWNlSlNPTixcbiAgSG9uZXN0eU5vdGUsXG4gIEhvbmVzdHlOb3RlQ29kZSxcbiAgS2V5TW9tZW50LFxuICBLZXlzUmVhZFNvdXJjZSxcbiAgS2V5VGltZWxpbmUsXG4gIE1pc3NpbmdQcm92ZW5hbmNlUmVhc29uLFxuICBNaXNzaW5nU2xpY2VSZWFzb24sXG4gIFJlYWRzQ292ZXJhZ2UsXG4gIFNsaWNlSlNPTixcbiAgU3RhdGVLZXksXG4gIFZhcmlhYmxlU2xpY2UsXG59IGZyb20gJy4vbGliL3NsaWNlL2luZGV4LmpzJztcbmV4cG9ydCB0eXBlIHsgRm9yd2FyZFNsaWNlRm9yS2V5T3B0aW9ucywgS2V5VGltZWxpbmVPcHRpb25zLCBTbGljZUZvcktleU9wdGlvbnMgfSBmcm9tICcuL2xpYi9zbGljZS9pbmRleC5qcyc7XG5leHBvcnQge1xuICBhcnJheVByb3ZlbmFuY2UsXG4gIGVsZW1lbnRQcm92ZW5hbmNlLFxuICBmb3JtYXRGb3J3YXJkU2xpY2UsXG4gIGZvcm1hdFNsaWNlLFxuICBmb3JtYXRUaW1lbGluZSxcbiAgZm9yd2FyZFNsaWNlRm9yS2V5LFxuICBmb3J3YXJkU2xpY2VUb0pTT04sXG4gIGtleXNSZWFkRnJvbUV4ZWN1dGlvblRyZWUsXG4gIGtleXNSZWFkRnJvbU1hcCxcbiAga2V5VGltZWxpbmUsXG4gIG5vcm1hbGlzZVN0YXRlS2V5LFxuICByZXNvbHZlS2V5c1JlYWRTb3VyY2UsXG4gIHNsaWNlRm9yS2V5LFxuICBzbGljZVRvSlNPTixcbn0gZnJvbSAnLi9saWIvc2xpY2UvaW5kZXguanMnO1xuXG4vLyDilIDilIAgaG9uZXN0eSDigJQgdGhlIE9ORSByZWdpc3RyeSBvZiB3aGF0IGEgcmVhZGVyIGNhbm5vdCBzZWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUaGUgaG9uZXN0eSBzaWduYWxzIHRoaXMgZG9vcidzIHJlYWRlcnMgcHJvZHVjZSDigJQgYSBzbGljZSdzIGBIb25lc3R5Tm90ZS5jb2RlYCBhbmQgYG1pc3NpbmdgXG4vLyByZWFzb24sIGEgZmVkIGVkZ2UncyBhbmQgYW4gZWxlbWVudCBiaXJ0aCdzIGBiYXNpc2AsIGEgZm9sZCdzIGBiYXNpc2AgYW5kIGByZWRhY3RlZGAgcGF0aHMsIGFcbi8vIGBMb2dHYXBgLCBhIGNhdXNhbCBub2RlJ3MgYGluY29tcGxldGVTb3VyY2VzYCBhbmQgYHRydW5jYXRlZGAg4oCUIGVhY2ggaGFzIGEgY29kZSBoZXJlIGFuZCB0aGUgT05FXG4vLyBzZW50ZW5jZSB0aGF0IHNheXMgd2hhdCBpdCBtZWFucywgc28gYSBsZW5zIG9yIGFuIGFnZW50IHRvb2wgZXhwbGFpbnMgYW55IG9mIHRoZW0gZnJvbSBvbmUgcGxhY2Vcbi8vIGluc3RlYWQgb2Yga2VlcGluZyBpdHMgb3duIHRhYmxlLiBUaGUgdW5pb25zIG9mIHRob3NlIGNvZGVzIGV4cG9ydGVkIGFib3ZlIChgSG9uZXN0eU5vdGVDb2RlYCxcbi8vIGBNaXNzaW5nU2xpY2VSZWFzb25gLCBgTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb25gLCBgRmVkQmFzaXNgLCBgQXR0cmlidXRpb25CYXNpc2AsIGBGb2xkQmFzaXNgKSBhcmVcbi8vIHN1YnNldHMgb2YgYEhvbmVzdHlDb2RlYCwgYW5kIHRlc3QvYXJjaGl0ZWN0dXJlL2hvbmVzdHktdm9jYWJ1bGFyeS50ZXN0LnRzIGZhaWxzIG9uIGEgdW5pb24gb2Zcbi8vIHN0cmluZyBsaXRlcmFscyB0aGlzIGRvb3IgZXhwb3J0cyB0aGF0IGlzIG5laXRoZXIgcmVnaXN0ZXJlZCBub3IgbmFtZWQgdGhlcmUgYXMgYSBkaWZmZXJlbnQga2luZFxuLy8gb2Ygd29yZC4gU2VlIHNyYy9saWIvbWVtb3J5L1JFQURNRS5tZC5cbmV4cG9ydCB0eXBlIHsgSG9uZXN0eUNvZGUgfSBmcm9tICcuL2xpYi9tZW1vcnkvaW5kZXguanMnO1xuZXhwb3J0IHsgSE9ORVNUWV9DT0RFUyB9IGZyb20gJy4vbGliL21lbW9yeS9pbmRleC5qcyc7XG5cbi8vIOKUgOKUgCB2NSBTdG9yZXMgKGNvbmNyZXRlLCBjb21wb3NhYmxlIOKAlCBwcmltYXJ5IHJlY29yZGVyIEFQSSkg4pSA4pSA4pSA4pSA4pSAXG4vLyBDb21wb3NlIHRoZXNlIHZpYSBgbmV3IFN0b3JlPFQ+KClgIGFzIGEgZmllbGQgb24geW91ciByZWNvcmRlclxuLy8gY2xhc3MuIE9uZSBwdXJwb3NlIHBlciByZWNvcmRlcjogc3RvcmVzIGFyZSBzdG9yYWdlOyByZWNvcmRlcnNcbi8vIGFyZSBldmVudC1ob29rIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMuXG5leHBvcnQgeyBCb3VuZGFyeVN0YXRlU3RvcmUgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Cb3VuZGFyeVN0YXRlU3RvcmUuanMnO1xuZXhwb3J0IHsgS2V5ZWRTdG9yZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL0tleWVkU3RvcmUuanMnO1xuZXhwb3J0IHsgU2VxdWVuY2VTdG9yZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL1NlcXVlbmNlU3RvcmUuanMnO1xuXG4vLyDilIDilIAgdjUuMSBDb21taXQgZ3JvdXBpbmcgcHJpbWl0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSW50ZXJ2YWwgaW5kZXggb3ZlciBjb21taXQgaW5kaWNlcy4gQnVpbHQgaW5jcmVtZW50YWxseSBkdXJpbmdcbi8vIHRyYXZlcnNhbDogb3BlbigpIG9uIGJvdW5kYXJ5IGVudHJ5LCBjbG9zZSgpIG9uIGV4aXQuIFF1ZXJ5IGF0IGFueVxuLy8gY29tbWl0IHBvc2l0aW9uIHdpdGggZW5jbG9zaW5nKCkvb3ZlcmxhcHBpbmcoKS4gR2VuZXJpYyBvdmVyIFRMYWJlbFxuLy8g4oCUIGZvb3RwcmludGpzIG93bnMgWkVSTyBrbm93bGVkZ2Ugb2Ygd2hhdCBjb25zdW1lcnMgdXNlIGFzIGxhYmVscy5cbi8vIFNlZSBkb2NzL2Rlc2lnbi9jb21taXQtcmFuZ2UtaW5kZXgubWQgZm9yIHRoZSBmdWxsIGNvbnRyYWN0LlxuZXhwb3J0IHR5cGUgeyBSYW5nZUVudHJ5LCBSYW5nZVRva2VuIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvQ29tbWl0UmFuZ2VJbmRleC5qcyc7XG5leHBvcnQgeyBDb21taXRSYW5nZUluZGV4IH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvQ29tbWl0UmFuZ2VJbmRleC5qcyc7XG5cbi8vIFRvcG9sb2d5UmVjb3JkZXIg4oCUIGNvbXBvc2l0aW9uIGdyYXBoIGFjY3VtdWxhdG9yIChzdWJmbG93cyArIGNvbnRyb2wtZmxvdyBlZGdlcylcbmV4cG9ydCB0eXBlIHtcbiAgVG9wb2xvZ3ksXG4gIFRvcG9sb2d5RWRnZSxcbiAgVG9wb2xvZ3lJbmNvbWluZ0tpbmQsXG4gIFRvcG9sb2d5Tm9kZSxcbiAgVG9wb2xvZ3lSZWNvcmRlck9wdGlvbnMsXG59IGZyb20gJy4vbGliL3JlY29yZGVyL1RvcG9sb2d5UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgVG9wb2xvZ3lSZWNvcmRlciwgdG9wb2xvZ3lSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL1RvcG9sb2d5UmVjb3JkZXIuanMnO1xuXG4vLyBJbk91dFJlY29yZGVyIOKAlCBjaGFydCBpbi9vdXQgc3RyZWFtIChlbnRyeS9leGl0IHBhaXJzIGF0IGV2ZXJ5IGNoYXJ0IGJvdW5kYXJ5LFxuLy8gaW5jbHVkaW5nIHRoZSB0b3AtbGV2ZWwgcnVuIGFuZCBldmVyeSBzdWJmbG93KVxuZXhwb3J0IHR5cGUgeyBJbk91dEVudHJ5LCBJbk91dFBoYXNlLCBJbk91dFJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4vbGliL3JlY29yZGVyL0luT3V0UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgSW5PdXRSZWNvcmRlciwgaW5PdXRSZWNvcmRlciwgUk9PVF9SVU5USU1FX1NUQUdFX0lELCBST09UX1NVQkZMT1dfSUQgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Jbk91dFJlY29yZGVyLmpzJztcblxuLy8gQ29udHJvbERlcFJlY29yZGVyIOKAlCBjb250cm9sLWRlcGVuZGVuY2UgdHJhY2tpbmcgKFJGQy0wMDMgRDUpOiByZWNvcmRzXG4vLyBvbkRlY2lzaW9uL29uU2VsZWN0ZWQgKyB0aGUgRDEgcnVudGltZSBhbmNlc3RvciBjaGFpbiwgYW5zd2VycyBcIndoaWNoXG4vLyBkZWNpc2lvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuP1wiIOKAlCB0aGUgYnVpbHQtaW4gcHJvZHVjZXIgZm9yXG4vLyBjYXVzYWxDaGFpbidzIGBjb250cm9sRGVwc2Agb3B0aW9uLlxuZXhwb3J0IHR5cGUgeyBDb250cm9sRGVjaXNpb25SZWNvcmQsIENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgQ29udHJvbERlcFJlY29yZGVyLCBjb250cm9sRGVwUmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIuanMnO1xuXG4vLyBRdWFsaXR5UmVjb3JkZXIg4oCUIHBlci1zdGVwIHF1YWxpdHkgc2NvcmluZyB3aXRoIGJhY2t0cmFja2luZ1xuZXhwb3J0IHR5cGUgeyBRdWFsaXR5RW50cnksIFF1YWxpdHlSZWNvcmRlck9wdGlvbnMsIFF1YWxpdHlTY29yaW5nRm4gfSBmcm9tICcuL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgUXVhbGl0eVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvUXVhbGl0eVJlY29yZGVyLmpzJztcblxuLy8gcXVhbGl0eVRyYWNlIOKAlCBRdWFsaXR5IFN0YWNrIFRyYWNlIChiYWNrdHJhY2sgZnJvbSBsb3ctc2NvcmluZyBzdGVwcylcbmV4cG9ydCB0eXBlIHsgUXVhbGl0eUZyYW1lLCBRdWFsaXR5U3RhY2tUcmFjZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL3F1YWxpdHlUcmFjZS5qcyc7XG5leHBvcnQgeyBmb3JtYXRRdWFsaXR5VHJhY2UsIHF1YWxpdHlUcmFjZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL3F1YWxpdHlUcmFjZS5qcyc7XG4iXX0=
@@ -2,11 +2,18 @@
2
2
  * footprintjs/advanced — Low-level internals for custom execution engines and testing.
3
3
  *
4
4
  * Most users never need this. Use `footprintjs` (main) instead.
5
- * This entry point exposes `SharedMemory`, `StageContext`, `FlowchartTraverser`,
6
- * and other primitives that power the engine.
5
+ * This entry point exposes the engine's frame (`StageContext`), the traverser
6
+ * (`FlowchartTraverser`), the scope providers and the other primitives that
7
+ * power the engine. The record has doors of its own: write one with
8
+ * `footprintjs/write` (`SharedMemory`, `EventLog`, `RecordFrame`), read one
9
+ * with `footprintjs/trace` (`CommitBundle`, `applySmartMerge`, the readers).
10
+ * The record's names this door handed out before 9.47.0 stay here until
11
+ * 10.0.0, the same symbols: import those from their own door (the nine record
12
+ * internals among them have none, and leave the public surface at 10.0.0).
7
13
  *
8
14
  * ```ts
9
- * import { SharedMemory, StageContext } from 'footprintjs/advanced';
15
+ * import { StageContext } from 'footprintjs/advanced';
16
+ * import { SharedMemory } from 'footprintjs/write';
10
17
  * ```
11
18
  *
12
19
  * @module advanced
@@ -19,14 +26,16 @@
19
26
  *
20
27
  * Import via: import { ... } from 'footprint/advanced'
21
28
  */
22
- export type { CommitBundle, FlowControlType, FlowMessage, MemoryPatch, ReadSummaryMarker, ReadTrackingMode, RetentionPolicy, StageSnapshot, TraceEntry, UntrackedSource, WriteSummaryMarker, WriteTrackingMode, } from './lib/memory/index.js';
29
+ export type { FlowControlType, FlowMessage, ReadSummaryMarker, ReadTrackingMode, RetentionPolicy, StageSnapshot, WriteSummaryMarker, WriteTrackingMode, } from './lib/memory/index.js';
23
30
  export type { RedactionVerdict } from './lib/memory/index.js';
24
- export { SharedMemory } from './lib/memory/index.js';
25
31
  export { StageContext } from './lib/memory/index.js';
26
- export { EventLog } from './lib/memory/index.js';
27
- export { TransactionBuffer } from './lib/memory/index.js';
28
32
  export { DiagnosticCollector } from './lib/memory/index.js';
29
33
  export { RedactionRule } from './lib/memory/index.js';
34
+ export type { ExecutionCounter } from './lib/ids/runtimeStageId.js';
35
+ export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId } from './lib/ids/runtimeStageId.js';
36
+ export { findCommit, findCommits, findLastWriter } from './lib/memory/commitLogUtils.js';
37
+ export type { CommitBundle, MemoryPatch, TraceEntry, UntrackedSource } from './lib/memory/index.js';
38
+ export { EventLog, SharedMemory, TransactionBuffer } from './lib/memory/index.js';
30
39
  export { applySmartMerge, deepSmartMerge, getNestedValue, getRunAndGlobalPaths, normalisePath, pathSegments, redactPatch, setNestedValue, updateNestedValue, updateValue, } from './lib/memory/index.js';
31
40
  export type { ExecOptions, FlowChartOptions, FlowChartSpec, ILogger, ScopeProtectionMode, SerializedPipelineStructure, SimplifiedParallelSpec, StageFn, StageNode, StreamCallback, StreamLifecycleHandler, StreamTokenHandler, SubflowMountOptions, SubflowRef, } from './lib/builder/index.js';
32
41
  export { ArrayMergeMode, DeciderList, SelectorFnList, specToStageNode } from './lib/builder/index.js';
@@ -54,9 +63,6 @@ export type { BranchResult, BranchResults, SerializedPipelineStructure as Engine
54
63
  export { NullControlFlowNarrativeGenerator } from './lib/engine/index.js';
55
64
  export type { ExecuteNodeFn, QueuedPause, ResumeHop, RunStageFn } from './lib/engine/index.js';
56
65
  export { applyOutputMapping, ChildrenExecutor, computeNodeType, ContinuationResolver, createSubflowHandlerDeps, DeciderHandler, DEFAULT_MAX_ITERATIONS, extractParentScopeValues, getInitialScopeValues, NodeResolver, ResumeEntry, RuntimeStructureManager, seedSubflowGlobalStore, SelectorHandler, StageRunner, SubflowExecutor, } from './lib/engine/index.js';
57
- export type { ExecutionCounter } from './lib/ids/runtimeStageId.js';
58
- export { buildRuntimeStageId, createExecutionCounter, parseRuntimeStageId } from './lib/ids/runtimeStageId.js';
59
- export { findCommit, findCommits, findLastWriter } from './lib/memory/commitLogUtils.js';
60
66
  export type { FilterCondition } from './lib/decide/index.js';
61
67
  export { evaluateFilter } from './lib/decide/index.js';
62
68
  export { normalizeSchema, zodToJsonSchema } from './lib/contract/index.js';
@@ -4,11 +4,13 @@
4
4
  * The flowchart pattern for backend code.
5
5
  * Build → Run → Observe.
6
6
  *
7
- * **Three import paths:**
7
+ * **The common import paths:**
8
8
  * ```ts
9
9
  * import { flowChart, decide, narrative } from 'footprintjs'; // main — start here
10
10
  * import { metrics, debug, manifest } from 'footprintjs/recorders'; // recorder factories
11
- * import { SharedMemory, StageContext } from 'footprintjs/advanced'; // internals
11
+ * import { stateAt, causalChain } from 'footprintjs/trace'; // read a finished run
12
+ * import { RecordFrame, EventLog } from 'footprintjs/write'; // write a record yourself
13
+ * import { StageContext } from 'footprintjs/advanced'; // engine internals
12
14
  * ```
13
15
  *
14
16
  * @module
@@ -74,7 +74,7 @@ export declare class EventLog {
74
74
  /**
75
75
  * Persists a commit bundle for a finished stage, and FREEZES it (see the module doc): the bundle
76
76
  * is stamped with its position, then deep-frozen, then appended. The engine hands it a bundle
77
- * built for the log alone; a caller of this class (`footprintjs/advanced`) hands over a bundle it
77
+ * built for the log alone; a caller of this class (`footprintjs/write`) hands over a bundle it
78
78
  * will no longer edit — its own object is the one frozen.
79
79
  */
80
80
  record(bundle: CommitBundle): void;
@@ -46,6 +46,8 @@ export declare function scrubPatch(patch: MemoryPatch, redactedPaths: Iterable<s
46
46
  * its contract unchanged since 4.x: a fresh deep copy of `patch` (`structuredClone`) with
47
47
  * {@link LOG_PLACEHOLDER} at every listed path that holds a defined value. Shares nothing with `patch`
48
48
  * and never edits it. (It lived in `memory/utils.ts` until 9.33.0 and in `memory/redaction.ts` until
49
- * C4; the engine's own commit path uses the clone-free {@link scrubPatch}.)
49
+ * C4; the engine's own commit path uses the clone-free {@link scrubPatch}.) No caller inside the
50
+ * library: it stays on `footprintjs/advanced` for the consumers that import it until 10.0.0 (the trace
51
+ * extraction, E6), which takes it off every door.
50
52
  */
51
53
  export declare function redactPatch(patch: MemoryPatch, redactedSet: Set<string>): MemoryPatch;
@@ -204,7 +204,7 @@ export declare function foldRows(out: any, updates: MemoryPatch, overwrite: Memo
204
204
  * value the replay writes is its own (`set` / `append` clone the recorded
205
205
  * value; the `merge` arm reads a detached copy of `updates`), so the result
206
206
  * shares no container with `base`, `updates` or `overwrite`. This is the
207
- * public (`footprintjs/advanced`) contract, unchanged by copy-on-write
207
+ * public (`footprintjs/trace`; also `/advanced` until 10.0.0) contract, unchanged by copy-on-write
208
208
  * (9.29.0) — byte-identical to 9.28.0 for every caller. The engine's own
209
209
  * commit does NOT come here: `SharedMemory.applyPatch` builds the next
210
210
  * generation with `nextGeneration`, which copies only the written
@@ -36,6 +36,8 @@ export type { WalkerItem, WalkerOptions } from './lib/engine/walkSubflowSpec.js'
36
36
  export { walkSubflowSpec } from './lib/engine/walkSubflowSpec.js';
37
37
  export { pathSegments } from './lib/memory/utils.js';
38
38
  export { UnknownVerbError } from './lib/memory/index.js';
39
+ export type { CommitBundle, MemoryPatch, TraceEntry } from './lib/memory/types.js';
40
+ export { applySmartMerge } from './lib/memory/verbs.js';
39
41
  export type { ValueBasis, ValueBasisOptions, ValueWithBasis, WriterBasis, WriterWithBasis, } from './lib/memory/commitLogUtils.js';
40
42
  export { buildCommitIndex, commitIndexOf, commitValueAt, commitValueAtWithBasis, findCommit, findCommits, findLastWriter, findLastWriterWithBasis, inferLegacyPhases, recordsPhases, } from './lib/memory/commitLogUtils.js';
41
43
  export type { CommitPhase } from './lib/memory/types.js';
@@ -0,0 +1,47 @@
1
+ /**
2
+ * footprintjs/write — the public way to write a record.
3
+ *
4
+ * A record is what a run wrote: a frozen base and an append-only log of bundles, one per step
5
+ * (docs/guides/record-contract.md). This door hands out the classes the engine itself writes one
6
+ * with — there is no wrapper, so a record written here and one a flowchart wrote come from the same
7
+ * code and the same bytes:
8
+ *
9
+ * - `SharedMemory` — the heap: live state, one generation per commit (copy-on-write);
10
+ * - `EventLog` — the log: the fold base and the bundles, frozen as they are recorded;
11
+ * - `RecordFrame` — one step's frame: what it read (`read`, `noteRead`), what it staged
12
+ * (`write`, with a redaction verdict's bytes as `WriteScrub`), and its
13
+ * commit onto the heap and the log (`commit`, named by a `CommitStamp`).
14
+ *
15
+ * The step's encoding is two dials (`RecordEncoding`): `commitValues` (`'full'` | `'delta'`) and
16
+ * `writeProvenance` (`'off'` | `'reads-prefix'`, `WriteProvenanceMode`).
17
+ *
18
+ * Every type this door names is the record's own: nothing here loads or names the engine
19
+ * (test/architecture/write-door.test.ts). Its names and the bytes they write are promised under the
20
+ * record fixtures' re-pin policy (test/fixtures/README.md): a refactor never moves a byte.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * import { EventLog, RecordFrame, SharedMemory } from 'footprintjs/write';
25
+ * import { stateAt } from 'footprintjs/trace';
26
+ *
27
+ * const state = new SharedMemory(undefined, { count: 0 }); // the heap, seeded
28
+ * const log = new EventLog(state.getState()); // its fold base is the seed
29
+ *
30
+ * const frame = new RecordFrame(state, log); // one step, at the root
31
+ * frame.useEncoding({ commitValues: 'full', writeProvenance: 'reads-prefix' });
32
+ * const count = frame.read([], 'count') as number;
33
+ * frame.noteRead([], 'count'); // the bundle names the read
34
+ * frame.write(frame.at([], 'count'), count + 1, 'set');
35
+ * frame.commit(() => ({ stage: 'Increment', stageId: 'increment', runtimeStageId: 'increment#0' }));
36
+ *
37
+ * stateAt({ initialState: log.getInitialState(), commitLog: log.list() }, 0).state; // { count: 1 }
38
+ * ```
39
+ *
40
+ * @module write
41
+ */
42
+ export { EventLog } from './lib/memory/EventLog.js';
43
+ export { SharedMemory } from './lib/memory/SharedMemory.js';
44
+ export type { CommitStamp } from './lib/memory/recordCommit.js';
45
+ export type { RecordEncoding, WriteScrub, WriteVerb } from './lib/memory/RecordFrame.js';
46
+ export { RecordFrame } from './lib/memory/RecordFrame.js';
47
+ export type { WriteProvenanceMode } from './lib/memory/types.js';
package/dist/write.js ADDED
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * footprintjs/write — the public way to write a record.
4
+ *
5
+ * A record is what a run wrote: a frozen base and an append-only log of bundles, one per step
6
+ * (docs/guides/record-contract.md). This door hands out the classes the engine itself writes one
7
+ * with — there is no wrapper, so a record written here and one a flowchart wrote come from the same
8
+ * code and the same bytes:
9
+ *
10
+ * - `SharedMemory` — the heap: live state, one generation per commit (copy-on-write);
11
+ * - `EventLog` — the log: the fold base and the bundles, frozen as they are recorded;
12
+ * - `RecordFrame` — one step's frame: what it read (`read`, `noteRead`), what it staged
13
+ * (`write`, with a redaction verdict's bytes as `WriteScrub`), and its
14
+ * commit onto the heap and the log (`commit`, named by a `CommitStamp`).
15
+ *
16
+ * The step's encoding is two dials (`RecordEncoding`): `commitValues` (`'full'` | `'delta'`) and
17
+ * `writeProvenance` (`'off'` | `'reads-prefix'`, `WriteProvenanceMode`).
18
+ *
19
+ * Every type this door names is the record's own: nothing here loads or names the engine
20
+ * (test/architecture/write-door.test.ts). Its names and the bytes they write are promised under the
21
+ * record fixtures' re-pin policy (test/fixtures/README.md): a refactor never moves a byte.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * import { EventLog, RecordFrame, SharedMemory } from 'footprintjs/write';
26
+ * import { stateAt } from 'footprintjs/trace';
27
+ *
28
+ * const state = new SharedMemory(undefined, { count: 0 }); // the heap, seeded
29
+ * const log = new EventLog(state.getState()); // its fold base is the seed
30
+ *
31
+ * const frame = new RecordFrame(state, log); // one step, at the root
32
+ * frame.useEncoding({ commitValues: 'full', writeProvenance: 'reads-prefix' });
33
+ * const count = frame.read([], 'count') as number;
34
+ * frame.noteRead([], 'count'); // the bundle names the read
35
+ * frame.write(frame.at([], 'count'), count + 1, 'set');
36
+ * frame.commit(() => ({ stage: 'Increment', stageId: 'increment', runtimeStageId: 'increment#0' }));
37
+ *
38
+ * stateAt({ initialState: log.getInitialState(), commitLog: log.list() }, 0).state; // { count: 1 }
39
+ * ```
40
+ *
41
+ * @module write
42
+ */
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.RecordFrame = exports.SharedMemory = exports.EventLog = void 0;
45
+ // The heap and the log.
46
+ var EventLog_js_1 = require("./lib/memory/EventLog.js");
47
+ Object.defineProperty(exports, "EventLog", { enumerable: true, get: function () { return EventLog_js_1.EventLog; } });
48
+ var SharedMemory_js_1 = require("./lib/memory/SharedMemory.js");
49
+ Object.defineProperty(exports, "SharedMemory", { enumerable: true, get: function () { return SharedMemory_js_1.SharedMemory; } });
50
+ var RecordFrame_js_1 = require("./lib/memory/RecordFrame.js");
51
+ Object.defineProperty(exports, "RecordFrame", { enumerable: true, get: function () { return RecordFrame_js_1.RecordFrame; } });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd3JpdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHOzs7QUFFSCx3QkFBd0I7QUFDeEIsd0RBQW9EO0FBQTNDLHVHQUFBLFFBQVEsT0FBQTtBQUNqQixnRUFBNEQ7QUFBbkQsK0dBQUEsWUFBWSxPQUFBO0FBS3JCLDhEQUEwRDtBQUFqRCw2R0FBQSxXQUFXLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL3dyaXRlIOKAlCB0aGUgcHVibGljIHdheSB0byB3cml0ZSBhIHJlY29yZC5cbiAqXG4gKiBBIHJlY29yZCBpcyB3aGF0IGEgcnVuIHdyb3RlOiBhIGZyb3plbiBiYXNlIGFuZCBhbiBhcHBlbmQtb25seSBsb2cgb2YgYnVuZGxlcywgb25lIHBlciBzdGVwXG4gKiAoZG9jcy9ndWlkZXMvcmVjb3JkLWNvbnRyYWN0Lm1kKS4gVGhpcyBkb29yIGhhbmRzIG91dCB0aGUgY2xhc3NlcyB0aGUgZW5naW5lIGl0c2VsZiB3cml0ZXMgb25lXG4gKiB3aXRoIOKAlCB0aGVyZSBpcyBubyB3cmFwcGVyLCBzbyBhIHJlY29yZCB3cml0dGVuIGhlcmUgYW5kIG9uZSBhIGZsb3djaGFydCB3cm90ZSBjb21lIGZyb20gdGhlIHNhbWVcbiAqIGNvZGUgYW5kIHRoZSBzYW1lIGJ5dGVzOlxuICpcbiAqICAgLSBgU2hhcmVkTWVtb3J5YCDigJQgdGhlIGhlYXA6IGxpdmUgc3RhdGUsIG9uZSBnZW5lcmF0aW9uIHBlciBjb21taXQgKGNvcHktb24td3JpdGUpO1xuICogICAtIGBFdmVudExvZ2AgICAgIOKAlCB0aGUgbG9nOiB0aGUgZm9sZCBiYXNlIGFuZCB0aGUgYnVuZGxlcywgZnJvemVuIGFzIHRoZXkgYXJlIHJlY29yZGVkO1xuICogICAtIGBSZWNvcmRGcmFtZWAgIOKAlCBvbmUgc3RlcCdzIGZyYW1lOiB3aGF0IGl0IHJlYWQgKGByZWFkYCwgYG5vdGVSZWFkYCksIHdoYXQgaXQgc3RhZ2VkXG4gKiAgICAgICAgICAgICAgICAgICAgICAoYHdyaXRlYCwgd2l0aCBhIHJlZGFjdGlvbiB2ZXJkaWN0J3MgYnl0ZXMgYXMgYFdyaXRlU2NydWJgKSwgYW5kIGl0c1xuICogICAgICAgICAgICAgICAgICAgICAgY29tbWl0IG9udG8gdGhlIGhlYXAgYW5kIHRoZSBsb2cgKGBjb21taXRgLCBuYW1lZCBieSBhIGBDb21taXRTdGFtcGApLlxuICpcbiAqIFRoZSBzdGVwJ3MgZW5jb2RpbmcgaXMgdHdvIGRpYWxzIChgUmVjb3JkRW5jb2RpbmdgKTogYGNvbW1pdFZhbHVlc2AgKGAnZnVsbCdgIHwgYCdkZWx0YSdgKSBhbmRcbiAqIGB3cml0ZVByb3ZlbmFuY2VgIChgJ29mZidgIHwgYCdyZWFkcy1wcmVmaXgnYCwgYFdyaXRlUHJvdmVuYW5jZU1vZGVgKS5cbiAqXG4gKiBFdmVyeSB0eXBlIHRoaXMgZG9vciBuYW1lcyBpcyB0aGUgcmVjb3JkJ3Mgb3duOiBub3RoaW5nIGhlcmUgbG9hZHMgb3IgbmFtZXMgdGhlIGVuZ2luZVxuICogKHRlc3QvYXJjaGl0ZWN0dXJlL3dyaXRlLWRvb3IudGVzdC50cykuIEl0cyBuYW1lcyBhbmQgdGhlIGJ5dGVzIHRoZXkgd3JpdGUgYXJlIHByb21pc2VkIHVuZGVyIHRoZVxuICogcmVjb3JkIGZpeHR1cmVzJyByZS1waW4gcG9saWN5ICh0ZXN0L2ZpeHR1cmVzL1JFQURNRS5tZCk6IGEgcmVmYWN0b3IgbmV2ZXIgbW92ZXMgYSBieXRlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFdmVudExvZywgUmVjb3JkRnJhbWUsIFNoYXJlZE1lbW9yeSB9IGZyb20gJ2Zvb3RwcmludGpzL3dyaXRlJztcbiAqIGltcG9ydCB7IHN0YXRlQXQgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3Qgc3RhdGUgPSBuZXcgU2hhcmVkTWVtb3J5KHVuZGVmaW5lZCwgeyBjb3VudDogMCB9KTsgLy8gdGhlIGhlYXAsIHNlZWRlZFxuICogY29uc3QgbG9nID0gbmV3IEV2ZW50TG9nKHN0YXRlLmdldFN0YXRlKCkpOyAgICAgICAgICAgICAgLy8gaXRzIGZvbGQgYmFzZSBpcyB0aGUgc2VlZFxuICpcbiAqIGNvbnN0IGZyYW1lID0gbmV3IFJlY29yZEZyYW1lKHN0YXRlLCBsb2cpOyAgICAgICAgICAgICAgIC8vIG9uZSBzdGVwLCBhdCB0aGUgcm9vdFxuICogZnJhbWUudXNlRW5jb2RpbmcoeyBjb21taXRWYWx1ZXM6ICdmdWxsJywgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4JyB9KTtcbiAqIGNvbnN0IGNvdW50ID0gZnJhbWUucmVhZChbXSwgJ2NvdW50JykgYXMgbnVtYmVyO1xuICogZnJhbWUubm90ZVJlYWQoW10sICdjb3VudCcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJ1bmRsZSBuYW1lcyB0aGUgcmVhZFxuICogZnJhbWUud3JpdGUoZnJhbWUuYXQoW10sICdjb3VudCcpLCBjb3VudCArIDEsICdzZXQnKTtcbiAqIGZyYW1lLmNvbW1pdCgoKSA9PiAoeyBzdGFnZTogJ0luY3JlbWVudCcsIHN0YWdlSWQ6ICdpbmNyZW1lbnQnLCBydW50aW1lU3RhZ2VJZDogJ2luY3JlbWVudCMwJyB9KSk7XG4gKlxuICogc3RhdGVBdCh7IGluaXRpYWxTdGF0ZTogbG9nLmdldEluaXRpYWxTdGF0ZSgpLCBjb21taXRMb2c6IGxvZy5saXN0KCkgfSwgMCkuc3RhdGU7IC8vIHsgY291bnQ6IDEgfVxuICogYGBgXG4gKlxuICogQG1vZHVsZSB3cml0ZVxuICovXG5cbi8vIFRoZSBoZWFwIGFuZCB0aGUgbG9nLlxuZXhwb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL2xpYi9tZW1vcnkvRXZlbnRMb2cuanMnO1xuZXhwb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9saWIvbWVtb3J5L1NoYXJlZE1lbW9yeS5qcyc7XG5cbi8vIE9uZSBzdGVwJ3MgZnJhbWUsIGFuZCB3aGF0IGl0IHRha2VzOiB0aGUgZGlhbHMsIHRoZSB2ZXJicywgYSB2ZXJkaWN0J3MgYnl0ZXMsIHRoZSBuYW1lcyBvbiBpdHMgYnVuZGxlLlxuZXhwb3J0IHR5cGUgeyBDb21taXRTdGFtcCB9IGZyb20gJy4vbGliL21lbW9yeS9yZWNvcmRDb21taXQuanMnO1xuZXhwb3J0IHR5cGUgeyBSZWNvcmRFbmNvZGluZywgV3JpdGVTY3J1YiwgV3JpdGVWZXJiIH0gZnJvbSAnLi9saWIvbWVtb3J5L1JlY29yZEZyYW1lLmpzJztcbmV4cG9ydCB7IFJlY29yZEZyYW1lIH0gZnJvbSAnLi9saWIvbWVtb3J5L1JlY29yZEZyYW1lLmpzJztcbmV4cG9ydCB0eXBlIHsgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vbGliL21lbW9yeS90eXBlcy5qcyc7XG4iXX0=