footprintjs 9.44.1 → 9.44.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CLAUDE.md +4 -3
  2. package/dist/esm/lib/capture/freeze.d.ts +51 -7
  3. package/dist/esm/lib/capture/freeze.js +289 -24
  4. package/dist/esm/lib/capture/valueKinds.d.ts +57 -0
  5. package/dist/esm/lib/capture/valueKinds.js +142 -0
  6. package/dist/esm/lib/memory/EventLog.d.ts +24 -6
  7. package/dist/esm/lib/memory/EventLog.js +30 -10
  8. package/dist/esm/lib/memory/admission.js +4 -3
  9. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  10. package/dist/esm/lib/memory/equality.d.ts +55 -19
  11. package/dist/esm/lib/memory/equality.js +154 -51
  12. package/dist/esm/lib/memory/logModel.js +11 -4
  13. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -1
  14. package/dist/esm/lib/runner/ExecutionRuntime.js +15 -10
  15. package/dist/esm/lib/runner/snapshot.js +17 -3
  16. package/dist/esm/lib/slice/elementProvenance.js +2 -2
  17. package/dist/esm/lib/time-travel/chain.js +28 -26
  18. package/dist/lib/capture/freeze.js +292 -25
  19. package/dist/lib/capture/valueKinds.js +146 -0
  20. package/dist/lib/memory/EventLog.js +29 -9
  21. package/dist/lib/memory/admission.js +4 -3
  22. package/dist/lib/memory/borrowedMutation.js +2 -2
  23. package/dist/lib/memory/equality.js +154 -51
  24. package/dist/lib/memory/logModel.js +11 -4
  25. package/dist/lib/runner/ExecutionRuntime.js +14 -9
  26. package/dist/lib/runner/snapshot.js +16 -2
  27. package/dist/lib/slice/elementProvenance.js +2 -2
  28. package/dist/lib/time-travel/chain.js +27 -25
  29. package/dist/types/lib/capture/freeze.d.ts +51 -7
  30. package/dist/types/lib/capture/valueKinds.d.ts +57 -0
  31. package/dist/types/lib/memory/EventLog.d.ts +24 -6
  32. package/dist/types/lib/memory/equality.d.ts +55 -19
  33. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -1
  34. package/package.json +2 -1
@@ -226,7 +226,7 @@ export class LogModel {
226
226
  commit = touch.commitIdx;
227
227
  start = before;
228
228
  }
229
- verdict.set(commit, !deepEqual(start, after));
229
+ verdict.set(commit, !deepEqual(start, after, 'copies'));
230
230
  },
231
231
  });
232
232
  changes = [...verdict].filter(([, changed]) => changed).map(([c]) => c);
@@ -255,7 +255,7 @@ export class LogModel {
255
255
  queryWork.units += candidates.length;
256
256
  return candidates.filter((c) => {
257
257
  const g = h.kept.get(c);
258
- return g !== undefined && !deepEqual(nativeGet(g.before, rest), nativeGet(g.after, rest));
258
+ return g !== undefined && !deepEqual(nativeGet(g.before, rest), nativeGet(g.after, rest), 'copies');
259
259
  });
260
260
  }
261
261
  // ── the writer rule ──────────────────────────────────────────────────────
@@ -339,12 +339,19 @@ export class LogModel {
339
339
  const kept = lastBefore(h.keptAt, idx + 1);
340
340
  if (kept !== -1) {
341
341
  const after = rows.filter((row) => row.commitIdx > kept);
342
- return foldKey(after, segs, { anchored: true, start: h.kept.get(kept)?.after });
342
+ // Folded FROM the kept generation, the answer can BE it (no row after it) or share its parts, and
343
+ // the memo answers every later question: detach it, as the value rule promises (until 9.44.2 an
344
+ // edit of one answer changed the next).
345
+ return detached(foldKey(after, segs, { anchored: true, start: h.kept.get(kept)?.after }));
343
346
  }
344
347
  }
345
348
  return foldKey(rows, segs, { anchored: true });
346
349
  }
347
350
  }
351
+ /** A value the caller owns: a container is cloned, a primitive is itself. */
352
+ function detached(value) {
353
+ return value !== null && typeof value === 'object' ? structuredClone(value) : value;
354
+ }
348
355
  /** Is the last `set` / `delete` row ON `key` in this commit a `set`? */
349
356
  function lastTotalIsSet(bundle, key) {
350
357
  for (let i = bundle.trace.length - 1; i >= 0; i--) {
@@ -354,4 +361,4 @@ function lastTotalIsSet(bundle, key) {
354
361
  }
355
362
  return false;
356
363
  }
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9sb2dNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsY0FBYyxFQUNkLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBbUIzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxXQUFXLENBQUMsR0FBNEI7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsZ0dBQWdHO0lBQ2hHLG9GQUFvRjtJQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FB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QUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2dNb2RlbC50cyDigJQgdGhlIHJlYWQgbW9kZWwgb2YgT05FIGNvbW1pdCBsb2c6IHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCxcbiAqIGFuc3dlcmVkIGF0IGEgY29zdCBwcm9wb3J0aW9uYWwgdG8gdGhlIGFuc3dlciwgbm90IHRvIHRoZSBsb2cgKEYzLCA5LjMzLjApLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgRVhJU1RTLiBUaGUgcnVsZXMgYXJlIHNpbXBsZSB0byBzdGF0ZSBhbmQgZXhwZW5zaXZlIHRvIGFwcGx5IG5haXZlbHk6IGEga2V5J3Mgd3JpdGVyc1xuICogaW5jbHVkZSB0aGUgY29tbWl0cyBBUk9VTkQgaXQgd2hvc2UgY2hhbmdlIHJlYWNoZWQgaXQsIGFuZCBkZWNpZGluZyB0aGF0IG5lZWRzIHRoZSB2YWx1ZSBhdCB0aGUga2V5XG4gKiBiZWZvcmUgYW5kIGFmdGVyIHN1Y2ggYSBjb21taXQg4oCUIGEgZm9sZCBvZiBpdHMgdG9wLWxldmVsIGtleS4gRm9sZGluZyBvbmNlIHBlciBLRVkgbWFkZSBhIGNhdXNhbCB3YWxrXG4gKiBvdmVyIG5lc3RlZCBrZXlzIGN1YmljIGluIHRoZSBsb2cgKGV2ZXJ5IGtleSByZS1zY2FubmVkIHRoZSBsb2cgYW5kIHJlLWZvbGRlZCBpdHMgcm9vdCkuIEhlcmU6XG4gKlxuICogICAtIHRoZSBsb2cgaXMgaW5kZXhlZCBPTkNFIChga2V5UGF0aHMgwrcgYnVpbGRXcml0ZXJJbmRleGAsIGEgcGF0aCB0cmllKTogYSBrZXkncyBjYW5kaWRhdGVzIGNvc3RcbiAqICAgICBPKGRlcHRoICsgbWF0Y2hlcykg4oCUIGl0cyBub2RlLCBpdHMgYW5jZXN0b3JzLCBpdHMgc3VidHJlZSDigJQgYW5kIHRoZSByb3dzIHVuZGVyIGEgdG9wLWxldmVsIGtleSBhcmVcbiAqICAgICByZWFjaGVkIHRocm91Z2ggdGhlIGluZGV4LCBuZXZlciBhIHNjYW47XG4gKiAgIC0gZWFjaCB0b3AtbGV2ZWwga2V5IGlzIGZvbGRlZCBPTkNFIChgdmVyYnMgwrcgZm9sZEtleWAsIGNvcHktb24td3JpdGUpLCBrZWVwaW5nIGl0cyB2YWx1ZSBiZWZvcmUgYW5kXG4gKiAgICAgYWZ0ZXIgZXZlcnkgY29tbWl0IGEgdmVyZGljdCBjYW4gYXNrIGFib3V0OiBhIGNvbW1pdCB3aXRoIGEgcm93IG9uIGEgcGF0aCB0aGF0IGhhcyB3cml0dGVuIHBhdGhzXG4gKiAgICAgYmVsb3cgaXQgKGl0IGNhbiBiZSBBUk9VTkQgYSB3cml0dGVuIGtleSksIGFuZCBhIGNvbW1pdCB0aGF0IHdyaXRlcyBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZFxuICogICAgIGNvbnRhaW5lciAoYG5hdGl2ZVNldGAgcmVwbGFjZXMgdGhlIHN0cmluZywgYW5kIHRoZSBjaGFyYWN0ZXJzIGEga2V5IHJlYWQgZnJvbSBpdCB2YW5pc2gg4oCUIHRoZSBvbmVcbiAqICAgICB3YXkgYSByb3cgQkVTSURFIGEga2V5IG1vdmVzIGl0KS4gQSBrZXkncyB2ZXJkaWN0IGlzIHRoZW4gdHdvIGBuYXRpdmVHZXRgcyBhbmQgYSBgZGVlcEVxdWFsYDtcbiAqICAgLSB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGEgcG9pbnQgaXMgZm91bmQgTEFaSUxZOiB0aGUgbGFzdCB3cml0ZSBvbiBvciBpbnNpZGUgdGhlIGtleSwgdGhlbiBvbmx5IHRoZVxuICogICAgIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0IOKAlCBtb3N0IHF1ZXN0aW9ucyBuZWVkIG5vIHZlcmRpY3QgYXQgYWxsLlxuICpcbiAqIE9uZSBzaGFwZSBrZWVwcyBhIHBlci1rZXkgZm9sZCAobWVtb2lzZWQgcGVyIGtleSk6IGEga2V5IHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIHRoYXRcbiAqIHdhcyBvbmx5IGV2ZXIgd3JpdHRlbiBXSE9MRSAoaXRzIG5vZGUgaGFzIG5vIHdyaXR0ZW4gY2hpbGRyZW4sIHNvIG5vIGdlbmVyYXRpb24gaXMga2VwdCB0aGVyZSkuXG4gKlxuICogQSBtb2RlbCBvZiBhIEZST1pFTiBsb2cgKGV2ZXJ5IGVuZ2luZSBsb2cgc2luY2UgRjM6IGBFdmVudExvZyDCtyByZWNvcmRgIGZyZWV6ZXMgZWFjaCBidW5kbGUgYW5kXG4gKiBgZ2V0U25hcHNob3RgIGZyZWV6ZXMgdGhlIGFycmF5KSBpcyBtZW1vaXNlZCBvbiB0aGUgbG9nIOKAlCB0aGUgcmVjb3JkIGNhbm5vdCBjaGFuZ2UgdW5kZXIgaXQuIEEgbG9nIHRoYXRcbiAqIGlzIG5vdCBmcm96ZW4gKGhhbmQtYnVpbHQsIHBhcnNlZCBmcm9tIEpTT04pIGdldHMgYSBmcmVzaCBtb2RlbCBwZXIgcXVlc3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBhdGhOb2RlLFxuICB0eXBlIFdyaXRlckluZGV4LFxuICBhbmNlc3Rvck5vZGVzLFxuICBhc2NlbmRpbmdVbmlvbixcbiAgYmV0d2VlbixcbiAgYnVpbGRXcml0ZXJJbmRleCxcbiAgbGFzdEJlZm9yZSxcbiAgbm9kZUF0LFxuICBxdWVyeVdvcmssXG4gIHJlbGF0aW9uLFxuICByb290T2YsXG4gIHN1YnRyZWVQb3NpdGlvbnMsXG59IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgaXNWZXJiLCBVbmtub3duVmVyYkVycm9yIH0gZnJvbSAnLi92ZXJicy5qcyc7XG5cbi8qKiBUaGUgcm93cyB1bmRlciBvbmUgdG9wLWxldmVsIGtleSwgaW4gY29tbWl0IG9yZGVyIOKAlCB1cCB0byB0aGUgZmlyc3Qgcm93IHRoZSB2ZXJiIGxhdyByZWZ1c2VzLiAqL1xuaW50ZXJmYWNlIFJvb3RSb3dzIHtcbiAgcmVhZG9ubHkgcm93czogVG91Y2hbXTtcbiAgLyoqIFRoZSBmaXJzdCByb3cgdW5kZXIgdGhlIGtleSB3aG9zZSB2ZXJiIGlzIG5vbmUgb2YgdGhlIGZvdXIg4oCUIGV2ZXJ5IGFuc3dlciB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgcmVmdXNlZD86IFVua25vd25WZXJiRXJyb3I7XG4gIHJlYWRvbmx5IHJlZnVzZWRBdDogbnVtYmVyO1xufVxuXG4vKiogT25lIHRvcC1sZXZlbCBrZXkgZm9sZGVkIG9uY2U6IGl0cyB2YWx1ZSBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGNvbW1pdCBhIHZlcmRpY3QgY2FuIGFzayBhYm91dC4gKi9cbmludGVyZmFjZSBSb290SGlzdG9yeSB7XG4gIHJlYWRvbmx5IGtlcHQ6IE1hcDxudW1iZXIsIHsgcmVhZG9ubHkgYmVmb3JlOiB1bmtub3duOyByZWFkb25seSBhZnRlcjogdW5rbm93biB9PjtcbiAgLyoqIFRoZSBrZXB0IGNvbW1pdHMsIGFzY2VuZGluZy4gKi9cbiAgcmVhZG9ubHkga2VwdEF0OiByZWFkb25seSBudW1iZXJbXTtcbiAgLyoqIENvbW1pdHMgdGhhdCB3cm90ZSBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZCBjb250YWluZXIsIGJ5IHRoZSBub2RlIG9mIHRoYXQgY29udGFpbmVyLiAqL1xuICByZWFkb25seSByZXBsYWNlZDogTWFwPFBhdGhOb2RlLCBudW1iZXJbXT47XG59XG5cbmNvbnN0IE1PREVMUyA9IG5ldyBXZWFrTWFwPHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBMb2dNb2RlbD4oKTtcblxuLyoqIElzIHRoZSBsb2cgaW1tdXRhYmxlIOKAlCB0aGUgYXJyYXkgYW5kIGV2ZXJ5IGJ1bmRsZSBhbmQgdHJhY2UgZnJvemVuIChhbiBlbmdpbmUgc25hcHNob3QncyBsb2cpPyAqL1xuZnVuY3Rpb24gaXNGcm96ZW5Mb2cobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IGJvb2xlYW4ge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbihsb2cpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZSBzaGFwZSBgRXZlbnRMb2cgwrcgcmVjb3JkYCBsZWF2ZXM6IHRoZSBidW5kbGUsIGl0cyBwYXlsb2FkcyBhbmQgaXRzIHJvd3MuIEEgaGFuZC1idWlsdCBsb2dcbiAgLy8gZnJvemVuIGxlc3MgZGVlcGx5IHRoYW4gdGhhdCBjb3VsZCBjaGFuZ2UgYWZ0ZXIgYSBxdWVyeSwgc28gaXQgaXMgbmV2ZXIgbWVtb2lzZWQuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGJ1bmRsZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudHJhY2UpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4oYnVuZGxlLm92ZXJ3cml0ZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudXBkYXRlcykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJ1bmRsZS50cmFjZS5ldmVyeSgocm93KSA9PiBPYmplY3QuaXNGcm96ZW4ocm93KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSByZWFkIG1vZGVsIG9mIGBsb2dgIOKAlCBtZW1vaXNlZCB3aGVuIHRoZSBsb2cgaXMgZnJvemVuLCBmcmVzaCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTW9kZWwobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IExvZ01vZGVsIHtcbiAgY29uc3QgbWVtbyA9IE1PREVMUy5nZXQobG9nKTtcbiAgaWYgKG1lbW8gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW87XG4gIGNvbnN0IG1vZGVsID0gbmV3IExvZ01vZGVsKGxvZyk7XG4gIGlmIChpc0Zyb3plbkxvZyhsb2cpKSBNT0RFTFMuc2V0KGxvZywgbW9kZWwpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKiBUaGUgbWVtb2lzZWQgbW9kZWwgb2YgYSBmcm96ZW4gbG9nIChidWlsdCBvbiBmaXJzdCBhc2spLCBvciB1bmRlZmluZWQgZm9yIGEgbG9nIHRoYXQgaXMgbm90IGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXNlZE1vZGVsKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBMb2dNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNT0RFTFMuZ2V0KGxvZykgPz8gKGlzRnJvemVuTG9nKGxvZykgPyBsb2dNb2RlbChsb2cpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqIERvZXMgdGhlIGNvbW1pdCBob2xkIGEgbm9uLWBkZWxldGVgIHJvdyBvbiBga2V5YCBvciBpbnNpZGUgaXQ/IChBIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lci4pICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVzQXRPckluc2lkZShidW5kbGU6IENvbW1pdEJ1bmRsZSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0IG9mIGJ1bmRsZS50cmFjZSkge1xuICAgIGlmICh0LnZlcmIgPT09ICdkZWxldGUnKSBjb250aW51ZTtcbiAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2FuIHRoaXMgY29tbWl0IGxlYXZlIGEgU1RSSU5HLXZhbHVlZCBjb250YWluZXIgYWJvdmUgYGtleWAg4oCUIGEgcm93IGFyb3VuZCB0aGUga2V5IHdob3NlIHJlY29yZGVkIHZhbHVlXG4gKiBob2xkcyBhIHN0cmluZyBhdCB0aGUgcm93J3MgcGF0aCBvciBhbnl3aGVyZSBiZXR3ZWVuIGl0IGFuZCB0aGUga2V5PyBPbmx5IHRoZW4gY2FuIGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZVxuICoga2V5IG1vdmUgaXQgKGBuYXRpdmVTZXRgIHJlcGxhY2VzIHRoZSBzdHJpbmcpLiBBIGNvbnNlcnZhdGl2ZSwgcGF5bG9hZC1vbmx5IGNoZWNrOiBubyBmb2xkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhdmVzU3RyaW5nQWJvdmUoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlLnRyYWNlKSB7XG4gICAgaWYgKHQudmVyYiA9PT0gJ2RlbGV0ZScgfHwgcmVsYXRpb24odC5wYXRoLCBrZXkpICE9PSAnYXJvdW5kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VncyA9IHQucGF0aC5zcGxpdChERUxJTSk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gbmF0aXZlR2V0KHQudmVyYiA9PT0gJ21lcmdlJyA/IGJ1bmRsZS51cGRhdGVzIDogYnVuZGxlLm92ZXJ3cml0ZSwgc2Vncyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWdzLmxlbmd0aDsgZGVwdGggPCBrZXlTZWdzLmxlbmd0aDsgZGVwdGgrKykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGJyZWFrO1xuICAgICAgdmFsdWUgPSBuYXRpdmVHZXQodmFsdWUsIFtrZXlTZWdzW2RlcHRoXV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dNb2RlbCB7XG4gIHJlYWRvbmx5IGluZGV4OiBXcml0ZXJJbmRleDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290cyA9IG5ldyBNYXA8c3RyaW5nLCBSb290Um93cz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3JpZXMgPSBuZXcgTWFwPHN0cmluZywgUm9vdEhpc3Rvcnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKSB7XG4gICAgdGhpcy5pbmRleCA9IGJ1aWxkV3JpdGVySW5kZXgobG9nKTtcbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBsb2cpIHF1ZXJ5V29yay51bml0cyArPSBidW5kbGUudHJhY2UubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSByb290Um93cyhyb290OiBzdHJpbmcpOiBSb290Um93cyB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5yb290cy5nZXQocm9vdCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5pbmRleC5yb290cy5nZXQocm9vdCk7XG4gICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgIGxldCByZWZ1c2VkOiBVbmtub3duVmVyYkVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWZ1c2VkQXQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHN1YnRyZWVQb3NpdGlvbnMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoICYmIHJlZnVzZWQgPT09IHVuZGVmaW5lZDsgcm93KyspIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICAgICAgaWYgKHBhdGggIT09IHJvb3QgJiYgcmVsYXRpb24ocGF0aCwgcm9vdCkgIT09ICdpbnNpZGUnKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWlzVmVyYih2ZXJiKSkge1xuICAgICAgICAgICAgcmVmdXNlZCA9IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICAgICAgICByZWZ1c2VkQXQgPSBjO1xuICAgICAgICAgICAgLy8gdGhlIHJlZnVzZWQgY29tbWl0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IGFyZSBsZWZ0IG91dDogYW4gYW5zd2VyIHRoYXQgcmVhY2hlcyB0aGVtIGlzIHJlZnVzZWRcbiAgICAgICAgICAgIHdoaWxlIChyb3dzLmxlbmd0aCA+IDAgJiYgcm93c1tyb3dzLmxlbmd0aCAtIDFdLmNvbW1pdElkeCA9PT0gYykgcm93cy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Ugcm93cy5wdXNoKHsgdmVyYiwgYnVuZGxlOiB0aGlzLmxvZ1tjXSwgY29tbWl0SWR4OiBjIGFzIENvbW1pdElkeCwgcGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmdXNlZCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPSB7IHJvd3MsIC4uLihyZWZ1c2VkICE9PSB1bmRlZmluZWQgJiYgeyByZWZ1c2VkIH0pLCByZWZ1c2VkQXQgfTtcbiAgICB0aGlzLnJvb3RzLnNldChyb290LCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqIFJlZnVzZSBhbiBhbnN3ZXIgdGhhdCByZWFjaGVzIGEgcm93IHdob3NlIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93IChvbmUgaW4gY29tbWl0cyBgYWZ0ZXJgIDwgYyDiiaQgYGVuZGApLiAqL1xuICBwcml2YXRlIHJlZnVzZVRocm91Z2gocm9vdDogc3RyaW5nLCBlbmQ6IG51bWJlciwgYWZ0ZXIgPSAtMSk6IFJvb3RSb3dzIHtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgaWYgKHJyLnJlZnVzZWQgIT09IHVuZGVmaW5lZCAmJiByci5yZWZ1c2VkQXQgPD0gZW5kICYmIHJyLnJlZnVzZWRBdCA+IGFmdGVyKSB0aHJvdyByci5yZWZ1c2VkO1xuICAgIHJldHVybiBycjtcbiAgfVxuXG4gIC8qKiBFdmVyeSByb3cgdW5kZXIgYGtleWAncyB0b3AtbGV2ZWwga2V5IHVwIHRvIGBlbmRgLCB3aXRoIGl0cyByZWxhdGlvbiB0byBga2V5YCDigJQgdGhyb3VnaCB0aGUgaW5kZXguICovXG4gIHJvd3NVbmRlclJvb3Qoa2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gICAgY29uc3QgcnIgPSB0aGlzLnJlZnVzZVRocm91Z2gocm9vdE9mKGtleSksIGVuZCk7XG4gICAgY29uc3Qgb3V0OiBUb3VjaFtdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHJyLnJvd3MpIHtcbiAgICAgIGlmICh0LmNvbW1pdElkeCA+IGVuZCkgYnJlYWs7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgICAgb3V0LnB1c2gociA9PT0gdW5kZWZpbmVkID8gdCA6IHsgLi4udCwgcmVsYXRpb246IHIgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHJvb3QgZm9sZCwgb25jZSBwZXIgdG9wLWxldmVsIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGhpc3Rvcnkocm9vdDogc3RyaW5nKTogUm9vdEhpc3Rvcnkge1xuICAgIGxldCBoID0gdGhpcy5oaXN0b3JpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChoICE9PSB1bmRlZmluZWQpIHJldHVybiBoO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwPG51bWJlciwgeyBiZWZvcmU6IHVua25vd247IGFmdGVyOiB1bmtub3duIH0+KCk7XG4gICAgY29uc3QgcmVwbGFjZWQgPSBuZXcgTWFwPFBhdGhOb2RlLCBudW1iZXJbXT4oKTtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJyLnJvd3MubGVuZ3RoO1xuICAgIGZvbGRLZXkocnIucm93cywgW3Jvb3RdLCB7XG4gICAgICBnZW5lcmF0aW9uczoge1xuICAgICAgICBhdDogKGMsIHN0YXRlKSA9PiB7XG4gICAgICAgICAgbGV0IGtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBxdWVyeVdvcmsudW5pdHMgKz0gdGhpcy5sb2dbY10udHJhY2UubGVuZ3RoO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmxvZ1tjXS50cmFjZSkge1xuICAgICAgICAgICAgaWYgKHQucGF0aCAhPT0gcm9vdCAmJiByZWxhdGlvbih0LnBhdGgsIHJvb3QpICE9PSAnaW5zaWRlJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKG5vZGVBdCh0aGlzLmluZGV4LCB0LnBhdGgpPy5jaGlsZHJlbi5zaXplID8/IDApID4gMCkga2VlcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzZWdzID0gdC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2Vncy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUdldChzdGF0ZSwgc2Vncy5zbGljZSgwLCBqKSkgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9kZUF0KHRoaXMuaW5kZXgsIHNlZ3Muc2xpY2UoMCwgaikuam9pbihERUxJTSkpO1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gcmVwbGFjZWQuZ2V0KGNvbnRhaW5lcikgPz8gW107XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbbGlzdC5sZW5ndGggLSAxXSAhPT0gYykgbGlzdC5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkLnNldChjb250YWluZXIsIGxpc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGtlZXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ga2VlcDtcbiAgICAgICAgfSxcbiAgICAgICAga2VlcDogKGMsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgICAgICBrZXB0LnNldChjLCB7IGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGggPSB7IGtlcHQsIGtlcHRBdDogWy4uLmtlcHQua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhIC0gYiksIHJlcGxhY2VkIH07XG4gICAgdGhpcy5oaXN0b3JpZXMuc2V0KHJvb3QsIGgpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgLyoqIEEga2V5IG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIG9ubHkgZXZlciB3cml0dGVuIHdob2xlOiBubyBnZW5lcmF0aW9uIGlzIGtlcHQgZm9yIGl0LiAqL1xuICBwcml2YXRlIG5lZWRzT3duRm9sZChrZXk6IHN0cmluZywgYW5jZXN0b3JzOiByZWFkb25seSBQYXRoTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpID09PSB1bmRlZmluZWQgJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXS5jaGlsZHJlbi5zaXplID09PSAwO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlIGF0IGBrZXlgIGNoYW5nZWQg4oCUIG9uZSBmb2xkIGZvciB0aGlzIGtleSAodGhlIGZhbGxiYWNrIHNoYXBlKS4gKi9cbiAgcHJpdmF0ZSBvd25DaGFuZ2VzKGtleTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNoYW5nZXM7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgdmVyZGljdCA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICAgIGxldCBjb21taXQgPSAtMTtcbiAgICBsZXQgc3RhcnQ6IHVua25vd247XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRoaXMucm9vdFJvd3Moc2Vnc1swXSkucm93cy5sZW5ndGg7XG4gICAgZm9sZEtleSh0aGlzLnJvb3RSb3dzKHNlZ3NbMF0pLnJvd3MsIHNlZ3MsIHtcbiAgICAgIGV2ZXJ5Um93OiB0cnVlLFxuICAgICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICAgIGlmICh0b3VjaC5jb21taXRJZHggIT09IGNvbW1pdCkge1xuICAgICAgICAgIGNvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAgICBzdGFydCA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJkaWN0LnNldChjb21taXQsICFkZWVwRXF1YWwoc3RhcnQsIGFmdGVyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNoYW5nZXMgPSBbLi4udmVyZGljdF0uZmlsdGVyKChbLCBjaGFuZ2VkXSkgPT4gY2hhbmdlZCkubWFwKChbY10pID0+IGMpO1xuICAgIHRoaXMuY2hhbmdlc0J5S2V5LnNldChrZXksIGNoYW5nZXMpO1xuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXRzIGluIHRoZSBPUEVOIHJhbmdlIChgYWZ0ZXJgLCBgYmVmb3JlYCkgd2l0aCBubyByb3cgb24gb3IgaW5zaWRlIGBrZXlgIGFjcm9zcyB3aGljaCB0aGUgdmFsdWVcbiAgICogYXQgYGtleWAgY2hhbmdlZCDigJQgdGhlIEFST1VORCBoYWxmIG9mIHRoZSB3cml0ZXIgcnVsZSAoYW5kIHRoZSBzdHJpbmctY29udGFpbmVyIGNhc2UgYmVzaWRlIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZEFyb3VuZChrZXk6IHN0cmluZywgYWZ0ZXI6IG51bWJlciwgYmVmb3JlOiBudW1iZXIpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JOb2Rlcyh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGlmIChhbmNlc3RvcnMubGVuZ3RoID09PSAwIHx8IGFuY2VzdG9ycy5ldmVyeSgoYSkgPT4gYS5wb3NpdGlvbnMubGVuZ3RoID09PSAwKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHJvb3QgPSBhbmNlc3RvcnNbMF0ucGF0aDtcbiAgICAvLyBUaGUgYW5zd2VyIHJlYWRzIHRoZSByb3dzIG9mIHRoZSB3aW5kb3c6IHJlZnVzZSBpdCB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgdmVyYiB0aGUgbGF3IGRvZXMgbm90IGtub3cuXG4gICAgdGhpcy5yZWZ1c2VUaHJvdWdoKHJvb3QsIGJlZm9yZSAtIDEsIGFmdGVyKTtcbiAgICBpZiAodGhpcy5uZWVkc093bkZvbGQoa2V5LCBhbmNlc3RvcnMpKSByZXR1cm4gYmV0d2Vlbih0aGlzLm93bkNoYW5nZXMoa2V5KSwgYWZ0ZXIsIGJlZm9yZSk7XG4gICAgY29uc3QgaCA9IHRoaXMuaGlzdG9yeShyb290KTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gYXNjZW5kaW5nVW5pb24oW1xuICAgICAgLi4uYW5jZXN0b3JzLm1hcCgoYSkgPT4gYmV0d2VlbihhLnBvc2l0aW9ucywgYWZ0ZXIsIGJlZm9yZSkpLFxuICAgICAgLi4uYW5jZXN0b3JzLm1hcCgoYSkgPT4gYmV0d2VlbihoLnJlcGxhY2VkLmdldChhKSA/PyBbXSwgYWZ0ZXIsIGJlZm9yZSkpLFxuICAgIF0pO1xuICAgIGNvbnN0IHJlc3QgPSBrZXkuc3BsaXQoREVMSU0pLnNsaWNlKDEpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICByZXR1cm4gY2FuZGlkYXRlcy5maWx0ZXIoKGMpID0+IHtcbiAgICAgIGNvbnN0IGcgPSBoLmtlcHQuZ2V0KGMpO1xuICAgICAgcmV0dXJuIGcgIT09IHVuZGVmaW5lZCAmJiAhZGVlcEVxdWFsKG5hdGl2ZUdldChnLmJlZm9yZSwgcmVzdCksIG5hdGl2ZUdldChnLmFmdGVyLCByZXN0KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHdyaXRlciBydWxlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFdmVyeSBjb21taXQgdGhhdCBXUk9URSBga2V5YCwgYXNjZW5kaW5nIChtZW1vaXNlZCBwZXIga2V5KS4gKi9cbiAgd3JpdGVyc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIGxldCB3cml0ZXJzID0gdGhpcy53cml0ZXJzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKHdyaXRlcnMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHdyaXRlcnM7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGNvbnN0IGF0T3JJbnNpZGUgPSBub2RlID09PSB1bmRlZmluZWQgPyBbXSA6IHN1YnRyZWVQb3NpdGlvbnMobm9kZSk7XG4gICAgY29uc3QgYXJvdW5kID0gdGhpcy5jaGFuZ2VkQXJvdW5kKGtleSwgLTEsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgd3JpdGVycyA9IGFyb3VuZC5sZW5ndGggPT09IDAgPyBhdE9ySW5zaWRlLnNsaWNlKCkgOiBhc2NlbmRpbmdVbmlvbihbYXRPckluc2lkZSwgYXJvdW5kXSk7XG4gICAgdGhpcy53cml0ZXJzQnlLZXkuc2V0KGtleSwgd3JpdGVycyk7XG4gICAgcmV0dXJuIHdyaXRlcnM7XG4gIH1cblxuICAvKiogVGhlIEFSUkFZIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNvbW1pdCBiZWZvcmUgYGJlZm9yZWAgdGhhdCB3cm90ZSBga2V5YCwgb3IgLTEuICovXG4gIGxhc3RXcml0ZXJCZWZvcmUoa2V5OiBzdHJpbmcsIGJlZm9yZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gMTtcbiAgICBjb25zdCBub2RlID0gbm9kZUF0KHRoaXMuaW5kZXgsIGtleSk7XG4gICAgY29uc3QgbGFzdEFJID0gbm9kZSA9PT0gdW5kZWZpbmVkID8gLTEgOiBsYXN0QmVmb3JlKHN1YnRyZWVQb3NpdGlvbnMobm9kZSksIGJlZm9yZSk7XG4gICAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JOb2Rlcyh0aGlzLmluZGV4LCBrZXkpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBhbmNlc3RvcnMubGVuZ3RoOyAvLyB0aGUgc2NhbnMgb3ZlciB0aGVtIGJlbG93XG4gICAgaWYgKGFuY2VzdG9ycy5sZW5ndGggPT09IDApIHJldHVybiBsYXN0QUk7XG4gICAgLy8gQSByb3cgYXJvdW5kIHRoZSBrZXkgaW4gdGhlIGxhc3Qgd3JpdGUncyBPV04gY29tbWl0IGNvdW50cyB3aGVuIGl0IGNhbiBsZWF2ZSBhIHN0cmluZyBjb250YWluZXIgYWJvdmVcbiAgICAvLyB0aGUga2V5IChhIGxhdGVyIHdyaXRlIGJlc2lkZSB0aGUga2V5IHRoZW4gcmVwbGFjZXMgaXQpLlxuICAgIGNvbnN0IGFyb3VuZEluV2luZG93ID1cbiAgICAgIGFuY2VzdG9ycy5zb21lKChhKSA9PiBiZXR3ZWVuKGEucG9zaXRpb25zLCBsYXN0QUksIGJlZm9yZSkubGVuZ3RoID4gMCkgfHxcbiAgICAgIChsYXN0QUkgIT09IC0xICYmIGxlYXZlc1N0cmluZ0Fib3ZlKHRoaXMubG9nW2xhc3RBSV0sIGtleSkpO1xuICAgIC8vIEEgYGRlbGV0ZWAgY2Fubm90IHJlcGxhY2UgYSBzdHJpbmcgY29udGFpbmVyLCBzbyBhIGNoYXJhY3RlciByZWFkIHRocm91Z2ggb25lIGNhbiBzdGlsbCBtb3ZlIGFmdGVyIGl0LlxuICAgIGNvbnN0IGRlbGV0ZU9ubHkgPSBsYXN0QUkgIT09IC0xICYmICF3cml0ZXNBdE9ySW5zaWRlKHRoaXMubG9nW2xhc3RBSV0sIGtleSk7XG4gICAgaWYgKCFhcm91bmRJbldpbmRvdyAmJiAhKGRlbGV0ZU9ubHkgJiYgYW5jZXN0b3JzLnNvbWUoKGEpID0+IGEucG9zaXRpb25zLmxlbmd0aCA+IDApKSkgcmV0dXJuIGxhc3RBSTtcbiAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5jaGFuZ2VkQXJvdW5kKGtleSwgbGFzdEFJLCBiZWZvcmUpO1xuICAgIHJldHVybiBjaGFuZ2VkLmxlbmd0aCA+IDAgPyBjaGFuZ2VkW2NoYW5nZWQubGVuZ3RoIC0gMV0gOiBsYXN0QUk7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHZhbHVlIHJ1bGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiBga2V5YCBhZnRlciBjb21taXQgYGlkeGAgKGluY2x1c2l2ZSkuIFRoZSBmb2xkIG9mIHRoZSByb3dzIHVuZGVyIGl0cyB0b3AtbGV2ZWwga2V5IOKAlCBidXRcbiAgICogd2hlbiBpdHMgbGFzdCB0b3RhbCByb3cgdXAgdG8gYGlkeGAgaXMgYSBgc2V0YCBPTiB0aGUga2V5IGFuZCBub3RoaW5nIGFyb3VuZCBpdCB3YXMgd3JpdHRlbiBzaW5jZSwgb25seVxuICAgKiB0aGUgcm93cyBvbiBhbmQgaW5zaWRlIHRoZSBrZXkgZnJvbSB0aGF0IGBzZXRgIG9uIGNhbiBtb3ZlIGl0LCBhbmQgb25seSB0aGV5IGFyZSBmb2xkZWQuXG4gICAqL1xuICB2YWx1ZUF0KGtleTogc3RyaW5nLCBpZHg6IG51bWJlcik6IHVua25vd24ge1xuICAgIGNvbnN0IHNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICAgIHRoaXMucmVmdXNlVGhyb3VnaChzZWdzWzBdLCBpZHgpO1xuICAgIGNvbnN0IG5vZGUgPSBub2RlQXQodGhpcy5pbmRleCwga2V5KTtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3Rvck5vZGVzKHRoaXMuaW5kZXgsIGtleSk7XG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCAmJiBhbmNlc3RvcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGxhc3RCZWZvcmUobm9kZS50b3RhbHMsIGlkeCArIDEpO1xuICAgICAgaWYgKFxuICAgICAgICBhbmNob3IgIT09IC0xICYmXG4gICAgICAgIGxhc3RUb3RhbElzU2V0KHRoaXMubG9nW2FuY2hvcl0sIGtleSkgJiZcbiAgICAgICAgYW5jZXN0b3JzLmV2ZXJ5KChhKSA9PiBiZXR3ZWVuKGEucG9zaXRpb25zLCBhbmNob3IgLSAxLCBpZHggKyAxKS5sZW5ndGggPT09IDApXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgYmV0d2VlbihzdWJ0cmVlUG9zaXRpb25zKG5vZGUpLCBhbmNob3IgLSAxLCBpZHggKyAxKSkge1xuICAgICAgICAgIGNvbnN0IHRyYWNlID0gdGhpcy5sb2dbY10udHJhY2U7XG4gICAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoOyByb3crKykge1xuICAgICAgICAgICAgY29uc3QgciA9IHJlbGF0aW9uKHRyYWNlW3Jvd10ucGF0aCwga2V5KTtcbiAgICAgICAgICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSB7XG4gICAgICAgICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgdmVyYjogdHJhY2Vbcm93XS52ZXJiIGFzIFRvdWNoWyd2ZXJiJ10sXG4gICAgICAgICAgICAgICAgYnVuZGxlOiB0aGlzLmxvZ1tjXSxcbiAgICAgICAgICAgICAgICBjb21taXRJZHg6IGMgYXMgQ29tbWl0SWR4LFxuICAgICAgICAgICAgICAgIHBhdGg6IHRyYWNlW3Jvd10ucGF0aCxcbiAgICAgICAgICAgICAgICByZWxhdGlvbjogcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5V29yay51bml0cyArPSByb3dzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2Vncyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd3NVbmRlclJvb3Qoa2V5LCBpZHgpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSByb3dzLmxlbmd0aDtcbiAgICBpZiAoIXJvd3Muc29tZSgocm93KSA9PiByb3cucmVsYXRpb24gIT09IHVuZGVmaW5lZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gQSBtZW1vaXNlZCBtb2RlbCBmb2xkcyBmcm9tIHRoZSBsYXN0IGdlbmVyYXRpb24gaXQga2VlcHMgYXQgb3IgYmVmb3JlIGBpZHhgIOKAlCB0aGUgcm93cyBhZnRlciBpdCBvbmx5LlxuICAgIGlmIChNT0RFTFMuZ2V0KHRoaXMubG9nKSA9PT0gdGhpcykge1xuICAgICAgY29uc3QgaCA9IHRoaXMuaGlzdG9yeShzZWdzWzBdKTtcbiAgICAgIGNvbnN0IGtlcHQgPSBsYXN0QmVmb3JlKGgua2VwdEF0LCBpZHggKyAxKTtcbiAgICAgIGlmIChrZXB0ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBhZnRlciA9IHJvd3MuZmlsdGVyKChyb3cpID0+IHJvdy5jb21taXRJZHggPiBrZXB0KTtcbiAgICAgICAgcmV0dXJuIGZvbGRLZXkoYWZ0ZXIsIHNlZ3MsIHsgYW5jaG9yZWQ6IHRydWUsIHN0YXJ0OiBoLmtlcHQuZ2V0KGtlcHQpPy5hZnRlciB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2VncywgeyBhbmNob3JlZDogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKiogSXMgdGhlIGxhc3QgYHNldGAgLyBgZGVsZXRlYCByb3cgT04gYGtleWAgaW4gdGhpcyBjb21taXQgYSBgc2V0YD8gKi9cbmZ1bmN0aW9uIGxhc3RUb3RhbElzU2V0KGJ1bmRsZTogQ29tbWl0QnVuZGxlLCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpID0gYnVuZGxlLnRyYWNlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdCA9IGJ1bmRsZS50cmFjZVtpXTtcbiAgICBpZiAodC5wYXRoID09PSBrZXkgJiYgKHQudmVyYiA9PT0gJ3NldCcgfHwgdC52ZXJiID09PSAnZGVsZXRlJykpIHJldHVybiB0LnZlcmIgPT09ICdzZXQnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9sb2dNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsY0FBYyxFQUNkLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBbUIzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxXQUFXLENBQUMsR0FBNEI7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsZ0dBQWdHO0lBQ2hHLG9GQUFvRjtJQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FB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S0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEYsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLEdBQVc7SUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2dNb2RlbC50cyDigJQgdGhlIHJlYWQgbW9kZWwgb2YgT05FIGNvbW1pdCBsb2c6IHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCxcbiAqIGFuc3dlcmVkIGF0IGEgY29zdCBwcm9wb3J0aW9uYWwgdG8gdGhlIGFuc3dlciwgbm90IHRvIHRoZSBsb2cgKEYzLCA5LjMzLjApLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgRVhJU1RTLiBUaGUgcnVsZXMgYXJlIHNpbXBsZSB0byBzdGF0ZSBhbmQgZXhwZW5zaXZlIHRvIGFwcGx5IG5haXZlbHk6IGEga2V5J3Mgd3JpdGVyc1xuICogaW5jbHVkZSB0aGUgY29tbWl0cyBBUk9VTkQgaXQgd2hvc2UgY2hhbmdlIHJlYWNoZWQgaXQsIGFuZCBkZWNpZGluZyB0aGF0IG5lZWRzIHRoZSB2YWx1ZSBhdCB0aGUga2V5XG4gKiBiZWZvcmUgYW5kIGFmdGVyIHN1Y2ggYSBjb21taXQg4oCUIGEgZm9sZCBvZiBpdHMgdG9wLWxldmVsIGtleS4gRm9sZGluZyBvbmNlIHBlciBLRVkgbWFkZSBhIGNhdXNhbCB3YWxrXG4gKiBvdmVyIG5lc3RlZCBrZXlzIGN1YmljIGluIHRoZSBsb2cgKGV2ZXJ5IGtleSByZS1zY2FubmVkIHRoZSBsb2cgYW5kIHJlLWZvbGRlZCBpdHMgcm9vdCkuIEhlcmU6XG4gKlxuICogICAtIHRoZSBsb2cgaXMgaW5kZXhlZCBPTkNFIChga2V5UGF0aHMgwrcgYnVpbGRXcml0ZXJJbmRleGAsIGEgcGF0aCB0cmllKTogYSBrZXkncyBjYW5kaWRhdGVzIGNvc3RcbiAqICAgICBPKGRlcHRoICsgbWF0Y2hlcykg4oCUIGl0cyBub2RlLCBpdHMgYW5jZXN0b3JzLCBpdHMgc3VidHJlZSDigJQgYW5kIHRoZSByb3dzIHVuZGVyIGEgdG9wLWxldmVsIGtleSBhcmVcbiAqICAgICByZWFjaGVkIHRocm91Z2ggdGhlIGluZGV4LCBuZXZlciBhIHNjYW47XG4gKiAgIC0gZWFjaCB0b3AtbGV2ZWwga2V5IGlzIGZvbGRlZCBPTkNFIChgdmVyYnMgwrcgZm9sZEtleWAsIGNvcHktb24td3JpdGUpLCBrZWVwaW5nIGl0cyB2YWx1ZSBiZWZvcmUgYW5kXG4gKiAgICAgYWZ0ZXIgZXZlcnkgY29tbWl0IGEgdmVyZGljdCBjYW4gYXNrIGFib3V0OiBhIGNvbW1pdCB3aXRoIGEgcm93IG9uIGEgcGF0aCB0aGF0IGhhcyB3cml0dGVuIHBhdGhzXG4gKiAgICAgYmVsb3cgaXQgKGl0IGNhbiBiZSBBUk9VTkQgYSB3cml0dGVuIGtleSksIGFuZCBhIGNvbW1pdCB0aGF0IHdyaXRlcyBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZFxuICogICAgIGNvbnRhaW5lciAoYG5hdGl2ZVNldGAgcmVwbGFjZXMgdGhlIHN0cmluZywgYW5kIHRoZSBjaGFyYWN0ZXJzIGEga2V5IHJlYWQgZnJvbSBpdCB2YW5pc2gg4oCUIHRoZSBvbmVcbiAqICAgICB3YXkgYSByb3cgQkVTSURFIGEga2V5IG1vdmVzIGl0KS4gQSBrZXkncyB2ZXJkaWN0IGlzIHRoZW4gdHdvIGBuYXRpdmVHZXRgcyBhbmQgYSBgZGVlcEVxdWFsYDtcbiAqICAgLSB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGEgcG9pbnQgaXMgZm91bmQgTEFaSUxZOiB0aGUgbGFzdCB3cml0ZSBvbiBvciBpbnNpZGUgdGhlIGtleSwgdGhlbiBvbmx5IHRoZVxuICogICAgIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0IOKAlCBtb3N0IHF1ZXN0aW9ucyBuZWVkIG5vIHZlcmRpY3QgYXQgYWxsLlxuICpcbiAqIE9uZSBzaGFwZSBrZWVwcyBhIHBlci1rZXkgZm9sZCAobWVtb2lzZWQgcGVyIGtleSk6IGEga2V5IHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIHRoYXRcbiAqIHdhcyBvbmx5IGV2ZXIgd3JpdHRlbiBXSE9MRSAoaXRzIG5vZGUgaGFzIG5vIHdyaXR0ZW4gY2hpbGRyZW4sIHNvIG5vIGdlbmVyYXRpb24gaXMga2VwdCB0aGVyZSkuXG4gKlxuICogQSBtb2RlbCBvZiBhIEZST1pFTiBsb2cgKGV2ZXJ5IGVuZ2luZSBsb2cgc2luY2UgRjM6IGBFdmVudExvZyDCtyByZWNvcmRgIGZyZWV6ZXMgZWFjaCBidW5kbGUgYW5kXG4gKiBgZ2V0U25hcHNob3RgIGZyZWV6ZXMgdGhlIGFycmF5KSBpcyBtZW1vaXNlZCBvbiB0aGUgbG9nIOKAlCB0aGUgcmVjb3JkIGNhbm5vdCBjaGFuZ2UgdW5kZXIgaXQuIEEgbG9nIHRoYXRcbiAqIGlzIG5vdCBmcm96ZW4gKGhhbmQtYnVpbHQsIHBhcnNlZCBmcm9tIEpTT04pIGdldHMgYSBmcmVzaCBtb2RlbCBwZXIgcXVlc3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBhdGhOb2RlLFxuICB0eXBlIFdyaXRlckluZGV4LFxuICBhbmNlc3Rvck5vZGVzLFxuICBhc2NlbmRpbmdVbmlvbixcbiAgYmV0d2VlbixcbiAgYnVpbGRXcml0ZXJJbmRleCxcbiAgbGFzdEJlZm9yZSxcbiAgbm9kZUF0LFxuICBxdWVyeVdvcmssXG4gIHJlbGF0aW9uLFxuICByb290T2YsXG4gIHN1YnRyZWVQb3NpdGlvbnMsXG59IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgaXNWZXJiLCBVbmtub3duVmVyYkVycm9yIH0gZnJvbSAnLi92ZXJicy5qcyc7XG5cbi8qKiBUaGUgcm93cyB1bmRlciBvbmUgdG9wLWxldmVsIGtleSwgaW4gY29tbWl0IG9yZGVyIOKAlCB1cCB0byB0aGUgZmlyc3Qgcm93IHRoZSB2ZXJiIGxhdyByZWZ1c2VzLiAqL1xuaW50ZXJmYWNlIFJvb3RSb3dzIHtcbiAgcmVhZG9ubHkgcm93czogVG91Y2hbXTtcbiAgLyoqIFRoZSBmaXJzdCByb3cgdW5kZXIgdGhlIGtleSB3aG9zZSB2ZXJiIGlzIG5vbmUgb2YgdGhlIGZvdXIg4oCUIGV2ZXJ5IGFuc3dlciB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgcmVmdXNlZD86IFVua25vd25WZXJiRXJyb3I7XG4gIHJlYWRvbmx5IHJlZnVzZWRBdDogbnVtYmVyO1xufVxuXG4vKiogT25lIHRvcC1sZXZlbCBrZXkgZm9sZGVkIG9uY2U6IGl0cyB2YWx1ZSBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGNvbW1pdCBhIHZlcmRpY3QgY2FuIGFzayBhYm91dC4gKi9cbmludGVyZmFjZSBSb290SGlzdG9yeSB7XG4gIHJlYWRvbmx5IGtlcHQ6IE1hcDxudW1iZXIsIHsgcmVhZG9ubHkgYmVmb3JlOiB1bmtub3duOyByZWFkb25seSBhZnRlcjogdW5rbm93biB9PjtcbiAgLyoqIFRoZSBrZXB0IGNvbW1pdHMsIGFzY2VuZGluZy4gKi9cbiAgcmVhZG9ubHkga2VwdEF0OiByZWFkb25seSBudW1iZXJbXTtcbiAgLyoqIENvbW1pdHMgdGhhdCB3cm90ZSBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZCBjb250YWluZXIsIGJ5IHRoZSBub2RlIG9mIHRoYXQgY29udGFpbmVyLiAqL1xuICByZWFkb25seSByZXBsYWNlZDogTWFwPFBhdGhOb2RlLCBudW1iZXJbXT47XG59XG5cbmNvbnN0IE1PREVMUyA9IG5ldyBXZWFrTWFwPHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBMb2dNb2RlbD4oKTtcblxuLyoqIElzIHRoZSBsb2cgaW1tdXRhYmxlIOKAlCB0aGUgYXJyYXkgYW5kIGV2ZXJ5IGJ1bmRsZSBhbmQgdHJhY2UgZnJvemVuIChhbiBlbmdpbmUgc25hcHNob3QncyBsb2cpPyAqL1xuZnVuY3Rpb24gaXNGcm96ZW5Mb2cobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IGJvb2xlYW4ge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbihsb2cpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZSBzaGFwZSBgRXZlbnRMb2cgwrcgcmVjb3JkYCBsZWF2ZXM6IHRoZSBidW5kbGUsIGl0cyBwYXlsb2FkcyBhbmQgaXRzIHJvd3MuIEEgaGFuZC1idWlsdCBsb2dcbiAgLy8gZnJvemVuIGxlc3MgZGVlcGx5IHRoYW4gdGhhdCBjb3VsZCBjaGFuZ2UgYWZ0ZXIgYSBxdWVyeSwgc28gaXQgaXMgbmV2ZXIgbWVtb2lzZWQuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGJ1bmRsZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudHJhY2UpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4oYnVuZGxlLm92ZXJ3cml0ZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudXBkYXRlcykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJ1bmRsZS50cmFjZS5ldmVyeSgocm93KSA9PiBPYmplY3QuaXNGcm96ZW4ocm93KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSByZWFkIG1vZGVsIG9mIGBsb2dgIOKAlCBtZW1vaXNlZCB3aGVuIHRoZSBsb2cgaXMgZnJvemVuLCBmcmVzaCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTW9kZWwobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IExvZ01vZGVsIHtcbiAgY29uc3QgbWVtbyA9IE1PREVMUy5nZXQobG9nKTtcbiAgaWYgKG1lbW8gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW87XG4gIGNvbnN0IG1vZGVsID0gbmV3IExvZ01vZGVsKGxvZyk7XG4gIGlmIChpc0Zyb3plbkxvZyhsb2cpKSBNT0RFTFMuc2V0KGxvZywgbW9kZWwpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKiBUaGUgbWVtb2lzZWQgbW9kZWwgb2YgYSBmcm96ZW4gbG9nIChidWlsdCBvbiBmaXJzdCBhc2spLCBvciB1bmRlZmluZWQgZm9yIGEgbG9nIHRoYXQgaXMgbm90IGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXNlZE1vZGVsKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBMb2dNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNT0RFTFMuZ2V0KGxvZykgPz8gKGlzRnJvemVuTG9nKGxvZykgPyBsb2dNb2RlbChsb2cpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqIERvZXMgdGhlIGNvbW1pdCBob2xkIGEgbm9uLWBkZWxldGVgIHJvdyBvbiBga2V5YCBvciBpbnNpZGUgaXQ/IChBIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lci4pICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVzQXRPckluc2lkZShidW5kbGU6IENvbW1pdEJ1bmRsZSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0IG9mIGJ1bmRsZS50cmFjZSkge1xuICAgIGlmICh0LnZlcmIgPT09ICdkZWxldGUnKSBjb250aW51ZTtcbiAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2FuIHRoaXMgY29tbWl0IGxlYXZlIGEgU1RSSU5HLXZhbHVlZCBjb250YWluZXIgYWJvdmUgYGtleWAg4oCUIGEgcm93IGFyb3VuZCB0aGUga2V5IHdob3NlIHJlY29yZGVkIHZhbHVlXG4gKiBob2xkcyBhIHN0cmluZyBhdCB0aGUgcm93J3MgcGF0aCBvciBhbnl3aGVyZSBiZXR3ZWVuIGl0IGFuZCB0aGUga2V5PyBPbmx5IHRoZW4gY2FuIGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZVxuICoga2V5IG1vdmUgaXQgKGBuYXRpdmVTZXRgIHJlcGxhY2VzIHRoZSBzdHJpbmcpLiBBIGNvbnNlcnZhdGl2ZSwgcGF5bG9hZC1vbmx5IGNoZWNrOiBubyBmb2xkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhdmVzU3RyaW5nQWJvdmUoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlLnRyYWNlKSB7XG4gICAgaWYgKHQudmVyYiA9PT0gJ2RlbGV0ZScgfHwgcmVsYXRpb24odC5wYXRoLCBrZXkpICE9PSAnYXJvdW5kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VncyA9IHQucGF0aC5zcGxpdChERUxJTSk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gbmF0aXZlR2V0KHQudmVyYiA9PT0gJ21lcmdlJyA/IGJ1bmRsZS51cGRhdGVzIDogYnVuZGxlLm92ZXJ3cml0ZSwgc2Vncyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWdzLmxlbmd0aDsgZGVwdGggPCBrZXlTZWdzLmxlbmd0aDsgZGVwdGgrKykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGJyZWFrO1xuICAgICAgdmFsdWUgPSBuYXRpdmVHZXQodmFsdWUsIFtrZXlTZWdzW2RlcHRoXV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dNb2RlbCB7XG4gIHJlYWRvbmx5IGluZGV4OiBXcml0ZXJJbmRleDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290cyA9IG5ldyBNYXA8c3RyaW5nLCBSb290Um93cz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3JpZXMgPSBuZXcgTWFwPHN0cmluZywgUm9vdEhpc3Rvcnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKSB7XG4gICAgdGhpcy5pbmRleCA9IGJ1aWxkV3JpdGVySW5kZXgobG9nKTtcbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBsb2cpIHF1ZXJ5V29yay51bml0cyArPSBidW5kbGUudHJhY2UubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSByb290Um93cyhyb290OiBzdHJpbmcpOiBSb290Um93cyB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5yb290cy5nZXQocm9vdCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5pbmRleC5yb290cy5nZXQocm9vdCk7XG4gICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgIGxldCByZWZ1c2VkOiBVbmtub3duVmVyYkVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWZ1c2VkQXQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHN1YnRyZWVQb3NpdGlvbnMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoICYmIHJlZnVzZWQgPT09IHVuZGVmaW5lZDsgcm93KyspIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICAgICAgaWYgKHBhdGggIT09IHJvb3QgJiYgcmVsYXRpb24ocGF0aCwgcm9vdCkgIT09ICdpbnNpZGUnKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWlzVmVyYih2ZXJiKSkge1xuICAgICAgICAgICAgcmVmdXNlZCA9IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICAgICAgICByZWZ1c2VkQXQgPSBjO1xuICAgICAgICAgICAgLy8gdGhlIHJlZnVzZWQgY29tbWl0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IGFyZSBsZWZ0IG91dDogYW4gYW5zd2VyIHRoYXQgcmVhY2hlcyB0aGVtIGlzIHJlZnVzZWRcbiAgICAgICAgICAgIHdoaWxlIChyb3dzLmxlbmd0aCA+IDAgJiYgcm93c1tyb3dzLmxlbmd0aCAtIDFdLmNvbW1pdElkeCA9PT0gYykgcm93cy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Ugcm93cy5wdXNoKHsgdmVyYiwgYnVuZGxlOiB0aGlzLmxvZ1tjXSwgY29tbWl0SWR4OiBjIGFzIENvbW1pdElkeCwgcGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmdXNlZCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPSB7IHJvd3MsIC4uLihyZWZ1c2VkICE9PSB1bmRlZmluZWQgJiYgeyByZWZ1c2VkIH0pLCByZWZ1c2VkQXQgfTtcbiAgICB0aGlzLnJvb3RzLnNldChyb290LCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqIFJlZnVzZSBhbiBhbnN3ZXIgdGhhdCByZWFjaGVzIGEgcm93IHdob3NlIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93IChvbmUgaW4gY29tbWl0cyBgYWZ0ZXJgIDwgYyDiiaQgYGVuZGApLiAqL1xuICBwcml2YXRlIHJlZnVzZVRocm91Z2gocm9vdDogc3RyaW5nLCBlbmQ6IG51bWJlciwgYWZ0ZXIgPSAtMSk6IFJvb3RSb3dzIHtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgaWYgKHJyLnJlZnVzZWQgIT09IHVuZGVmaW5lZCAmJiByci5yZWZ1c2VkQXQgPD0gZW5kICYmIHJyLnJlZnVzZWRBdCA+IGFmdGVyKSB0aHJvdyByci5yZWZ1c2VkO1xuICAgIHJldHVybiBycjtcbiAgfVxuXG4gIC8qKiBFdmVyeSByb3cgdW5kZXIgYGtleWAncyB0b3AtbGV2ZWwga2V5IHVwIHRvIGBlbmRgLCB3aXRoIGl0cyByZWxhdGlvbiB0byBga2V5YCDigJQgdGhyb3VnaCB0aGUgaW5kZXguICovXG4gIHJvd3NVbmRlclJvb3Qoa2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gICAgY29uc3QgcnIgPSB0aGlzLnJlZnVzZVRocm91Z2gocm9vdE9mKGtleSksIGVuZCk7XG4gICAgY29uc3Qgb3V0OiBUb3VjaFtdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHJyLnJvd3MpIHtcbiAgICAgIGlmICh0LmNvbW1pdElkeCA+IGVuZCkgYnJlYWs7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgICAgb3V0LnB1c2gociA9PT0gdW5kZWZpbmVkID8gdCA6IHsgLi4udCwgcmVsYXRpb246IHIgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHJvb3QgZm9sZCwgb25jZSBwZXIgdG9wLWxldmVsIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGhpc3Rvcnkocm9vdDogc3RyaW5nKTogUm9vdEhpc3Rvcnkge1xuICAgIGxldCBoID0gdGhpcy5oaXN0b3JpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChoICE9PSB1bmRlZmluZWQpIHJldHVybiBoO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwPG51bWJlciwgeyBiZWZvcmU6IHVua25vd247IGFmdGVyOiB1bmtub3duIH0+KCk7XG4gICAgY29uc3QgcmVwbGFjZWQgPSBuZXcgTWFwPFBhdGhOb2RlLCBudW1iZXJbXT4oKTtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJyLnJvd3MubGVuZ3RoO1xuICAgIGZvbGRLZXkocnIucm93cywgW3Jvb3RdLCB7XG4gICAgICBnZW5lcmF0aW9uczoge1xuICAgICAgICBhdDogKGMsIHN0YXRlKSA9PiB7XG4gICAgICAgICAgbGV0IGtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBxdWVyeVdvcmsudW5pdHMgKz0gdGhpcy5sb2dbY10udHJhY2UubGVuZ3RoO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmxvZ1tjXS50cmFjZSkge1xuICAgICAgICAgICAgaWYgKHQucGF0aCAhPT0gcm9vdCAmJiByZWxhdGlvbih0LnBhdGgsIHJvb3QpICE9PSAnaW5zaWRlJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKG5vZGVBdCh0aGlzLmluZGV4LCB0LnBhdGgpPy5jaGlsZHJlbi5zaXplID8/IDApID4gMCkga2VlcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzZWdzID0gdC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2Vncy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUdldChzdGF0ZSwgc2Vncy5zbGljZSgwLCBqKSkgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9kZUF0KHRoaXMuaW5kZXgsIHNlZ3Muc2xpY2UoMCwgaikuam9pbihERUxJTSkpO1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gcmVwbGFjZWQuZ2V0KGNvbnRhaW5lcikgPz8gW107XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbbGlzdC5sZW5ndGggLSAxXSAhPT0gYykgbGlzdC5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkLnNldChjb250YWluZXIsIGxpc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGtlZXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ga2VlcDtcbiAgICAgICAgfSxcbiAgICAgICAga2VlcDogKGMsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgICAgICBrZXB0LnNldChjLCB7IGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGggPSB7IGtlcHQsIGtlcHRBdDogWy4uLmtlcHQua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhIC0gYiksIHJlcGxhY2VkIH07XG4gICAgdGhpcy5oaXN0b3JpZXMuc2V0KHJvb3QsIGgpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgLyoqIEEga2V5IG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIG9ubHkgZXZlciB3cml0dGVuIHdob2xlOiBubyBnZW5lcmF0aW9uIGlzIGtlcHQgZm9yIGl0LiAqL1xuICBwcml2YXRlIG5lZWRzT3duRm9sZChrZXk6IHN0cmluZywgYW5jZXN0b3JzOiByZWFkb25seSBQYXRoTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpID09PSB1bmRlZmluZWQgJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXS5jaGlsZHJlbi5zaXplID09PSAwO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlIGF0IGBrZXlgIGNoYW5nZWQg4oCUIG9uZSBmb2xkIGZvciB0aGlzIGtleSAodGhlIGZhbGxiYWNrIHNoYXBlKS4gKi9cbiAgcHJpdmF0ZSBvd25DaGFuZ2VzKGtleTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNoYW5nZXM7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgdmVyZGljdCA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICAgIGxldCBjb21taXQgPSAtMTtcbiAgICBsZXQgc3RhcnQ6IHVua25vd247XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRoaXMucm9vdFJvd3Moc2Vnc1swXSkucm93cy5sZW5ndGg7XG4gICAgZm9sZEtleSh0aGlzLnJvb3RSb3dzKHNlZ3NbMF0pLnJvd3MsIHNlZ3MsIHtcbiAgICAgIGV2ZXJ5Um93OiB0cnVlLFxuICAgICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICAgIGlmICh0b3VjaC5jb21taXRJZHggIT09IGNvbW1pdCkge1xuICAgICAgICAgIGNvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAgICBzdGFydCA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJkaWN0LnNldChjb21taXQsICFkZWVwRXF1YWwoc3RhcnQsIGFmdGVyLCAnY29waWVzJykpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBjaGFuZ2VzID0gWy4uLnZlcmRpY3RdLmZpbHRlcigoWywgY2hhbmdlZF0pID0+IGNoYW5nZWQpLm1hcCgoW2NdKSA9PiBjKTtcbiAgICB0aGlzLmNoYW5nZXNCeUtleS5zZXQoa2V5LCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0cyBpbiB0aGUgT1BFTiByYW5nZSAoYGFmdGVyYCwgYGJlZm9yZWApIHdpdGggbm8gcm93IG9uIG9yIGluc2lkZSBga2V5YCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlXG4gICAqIGF0IGBrZXlgIGNoYW5nZWQg4oCUIHRoZSBBUk9VTkQgaGFsZiBvZiB0aGUgd3JpdGVyIHJ1bGUgKGFuZCB0aGUgc3RyaW5nLWNvbnRhaW5lciBjYXNlIGJlc2lkZSBpdCkuXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZWRBcm91bmQoa2V5OiBzdHJpbmcsIGFmdGVyOiBudW1iZXIsIGJlZm9yZTogbnVtYmVyKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCB8fCBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGEucG9zaXRpb25zLmxlbmd0aCA9PT0gMCkpIHJldHVybiBbXTtcbiAgICBjb25zdCByb290ID0gYW5jZXN0b3JzWzBdLnBhdGg7XG4gICAgLy8gVGhlIGFuc3dlciByZWFkcyB0aGUgcm93cyBvZiB0aGUgd2luZG93OiByZWZ1c2UgaXQgd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93LlxuICAgIHRoaXMucmVmdXNlVGhyb3VnaChyb290LCBiZWZvcmUgLSAxLCBhZnRlcik7XG4gICAgaWYgKHRoaXMubmVlZHNPd25Gb2xkKGtleSwgYW5jZXN0b3JzKSkgcmV0dXJuIGJldHdlZW4odGhpcy5vd25DaGFuZ2VzKGtleSksIGFmdGVyLCBiZWZvcmUpO1xuICAgIGNvbnN0IGggPSB0aGlzLmhpc3Rvcnkocm9vdCk7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGFzY2VuZGluZ1VuaW9uKFtcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFmdGVyLCBiZWZvcmUpKSxcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oaC5yZXBsYWNlZC5nZXQoYSkgPz8gW10sIGFmdGVyLCBiZWZvcmUpKSxcbiAgICBdKTtcbiAgICBjb25zdCByZXN0ID0ga2V5LnNwbGl0KERFTElNKS5zbGljZSgxKTtcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMuZmlsdGVyKChjKSA9PiB7XG4gICAgICBjb25zdCBnID0gaC5rZXB0LmdldChjKTtcbiAgICAgIHJldHVybiBnICE9PSB1bmRlZmluZWQgJiYgIWRlZXBFcXVhbChuYXRpdmVHZXQoZy5iZWZvcmUsIHJlc3QpLCBuYXRpdmVHZXQoZy5hZnRlciwgcmVzdCksICdjb3BpZXMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgd3JpdGVyIHJ1bGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCB0aGF0IFdST1RFIGBrZXlgLCBhc2NlbmRpbmcgKG1lbW9pc2VkIHBlciBrZXkpLiAqL1xuICB3cml0ZXJzT2Yoa2V5OiBzdHJpbmcpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgbGV0IHdyaXRlcnMgPSB0aGlzLndyaXRlcnNCeUtleS5nZXQoa2V5KTtcbiAgICBpZiAod3JpdGVycyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd3JpdGVycztcbiAgICBjb25zdCBub2RlID0gbm9kZUF0KHRoaXMuaW5kZXgsIGtleSk7XG4gICAgY29uc3QgYXRPckluc2lkZSA9IG5vZGUgPT09IHVuZGVmaW5lZCA/IFtdIDogc3VidHJlZVBvc2l0aW9ucyhub2RlKTtcbiAgICBjb25zdCBhcm91bmQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCAtMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICB3cml0ZXJzID0gYXJvdW5kLmxlbmd0aCA9PT0gMCA/IGF0T3JJbnNpZGUuc2xpY2UoKSA6IGFzY2VuZGluZ1VuaW9uKFthdE9ySW5zaWRlLCBhcm91bmRdKTtcbiAgICB0aGlzLndyaXRlcnNCeUtleS5zZXQoa2V5LCB3cml0ZXJzKTtcbiAgICByZXR1cm4gd3JpdGVycztcbiAgfVxuXG4gIC8qKiBUaGUgQVJSQVkgcG9zaXRpb24gb2YgdGhlIGxhc3QgY29tbWl0IGJlZm9yZSBgYmVmb3JlYCB0aGF0IHdyb3RlIGBrZXlgLCBvciAtMS4gKi9cbiAgbGFzdFdyaXRlckJlZm9yZShrZXk6IHN0cmluZywgYmVmb3JlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxO1xuICAgIGNvbnN0IG5vZGUgPSBub2RlQXQodGhpcy5pbmRleCwga2V5KTtcbiAgICBjb25zdCBsYXN0QUkgPSBub2RlID09PSB1bmRlZmluZWQgPyAtMSA6IGxhc3RCZWZvcmUoc3VidHJlZVBvc2l0aW9ucyhub2RlKSwgYmVmb3JlKTtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3Rvck5vZGVzKHRoaXMuaW5kZXgsIGtleSk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IGFuY2VzdG9ycy5sZW5ndGg7IC8vIHRoZSBzY2FucyBvdmVyIHRoZW0gYmVsb3dcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGxhc3RBSTtcbiAgICAvLyBBIHJvdyBhcm91bmQgdGhlIGtleSBpbiB0aGUgbGFzdCB3cml0ZSdzIE9XTiBjb21taXQgY291bnRzIHdoZW4gaXQgY2FuIGxlYXZlIGEgc3RyaW5nIGNvbnRhaW5lciBhYm92ZVxuICAgIC8vIHRoZSBrZXkgKGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZSBrZXkgdGhlbiByZXBsYWNlcyBpdCkuXG4gICAgY29uc3QgYXJvdW5kSW5XaW5kb3cgPVxuICAgICAgYW5jZXN0b3JzLnNvbWUoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGxhc3RBSSwgYmVmb3JlKS5sZW5ndGggPiAwKSB8fFxuICAgICAgKGxhc3RBSSAhPT0gLTEgJiYgbGVhdmVzU3RyaW5nQWJvdmUodGhpcy5sb2dbbGFzdEFJXSwga2V5KSk7XG4gICAgLy8gQSBgZGVsZXRlYCBjYW5ub3QgcmVwbGFjZSBhIHN0cmluZyBjb250YWluZXIsIHNvIGEgY2hhcmFjdGVyIHJlYWQgdGhyb3VnaCBvbmUgY2FuIHN0aWxsIG1vdmUgYWZ0ZXIgaXQuXG4gICAgY29uc3QgZGVsZXRlT25seSA9IGxhc3RBSSAhPT0gLTEgJiYgIXdyaXRlc0F0T3JJbnNpZGUodGhpcy5sb2dbbGFzdEFJXSwga2V5KTtcbiAgICBpZiAoIWFyb3VuZEluV2luZG93ICYmICEoZGVsZXRlT25seSAmJiBhbmNlc3RvcnMuc29tZSgoYSkgPT4gYS5wb3NpdGlvbnMubGVuZ3RoID4gMCkpKSByZXR1cm4gbGFzdEFJO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCBsYXN0QUksIGJlZm9yZSk7XG4gICAgcmV0dXJuIGNoYW5nZWQubGVuZ3RoID4gMCA/IGNoYW5nZWRbY2hhbmdlZC5sZW5ndGggLSAxXSA6IGxhc3RBSTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgdmFsdWUgcnVsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIGBrZXlgIGFmdGVyIGNvbW1pdCBgaWR4YCAoaW5jbHVzaXZlKS4gVGhlIGZvbGQgb2YgdGhlIHJvd3MgdW5kZXIgaXRzIHRvcC1sZXZlbCBrZXkg4oCUIGJ1dFxuICAgKiB3aGVuIGl0cyBsYXN0IHRvdGFsIHJvdyB1cCB0byBgaWR4YCBpcyBhIGBzZXRgIE9OIHRoZSBrZXkgYW5kIG5vdGhpbmcgYXJvdW5kIGl0IHdhcyB3cml0dGVuIHNpbmNlLCBvbmx5XG4gICAqIHRoZSByb3dzIG9uIGFuZCBpbnNpZGUgdGhlIGtleSBmcm9tIHRoYXQgYHNldGAgb24gY2FuIG1vdmUgaXQsIGFuZCBvbmx5IHRoZXkgYXJlIGZvbGRlZC5cbiAgICovXG4gIHZhbHVlQXQoa2V5OiBzdHJpbmcsIGlkeDogbnVtYmVyKTogdW5rbm93biB7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgdGhpcy5yZWZ1c2VUaHJvdWdoKHNlZ3NbMF0sIGlkeCk7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIGFuY2VzdG9ycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYW5jaG9yID0gbGFzdEJlZm9yZShub2RlLnRvdGFscywgaWR4ICsgMSk7XG4gICAgICBpZiAoXG4gICAgICAgIGFuY2hvciAhPT0gLTEgJiZcbiAgICAgICAgbGFzdFRvdGFsSXNTZXQodGhpcy5sb2dbYW5jaG9yXSwga2V5KSAmJlxuICAgICAgICBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFuY2hvciAtIDEsIGlkeCArIDEpLmxlbmd0aCA9PT0gMClcbiAgICAgICkge1xuICAgICAgICBjb25zdCByb3dzOiBUb3VjaFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBiZXR3ZWVuKHN1YnRyZWVQb3NpdGlvbnMobm9kZSksIGFuY2hvciAtIDEsIGlkeCArIDEpKSB7XG4gICAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0cmFjZS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICAgICAgICBjb25zdCByID0gcmVsYXRpb24odHJhY2Vbcm93XS5wYXRoLCBrZXkpO1xuICAgICAgICAgICAgaWYgKHIgPT09ICdleGFjdCcgfHwgciA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB2ZXJiOiB0cmFjZVtyb3ddLnZlcmIgYXMgVG91Y2hbJ3ZlcmInXSxcbiAgICAgICAgICAgICAgICBidW5kbGU6IHRoaXMubG9nW2NdLFxuICAgICAgICAgICAgICAgIGNvbW1pdElkeDogYyBhcyBDb21taXRJZHgsXG4gICAgICAgICAgICAgICAgcGF0aDogdHJhY2Vbcm93XS5wYXRoLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uOiByLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZm9sZEtleShyb3dzLCBzZWdzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93c1VuZGVyUm9vdChrZXksIGlkeCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgIGlmICghcm93cy5zb21lKChyb3cpID0+IHJvdy5yZWxhdGlvbiAhPT0gdW5kZWZpbmVkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBBIG1lbW9pc2VkIG1vZGVsIGZvbGRzIGZyb20gdGhlIGxhc3QgZ2VuZXJhdGlvbiBpdCBrZWVwcyBhdCBvciBiZWZvcmUgYGlkeGAg4oCUIHRoZSByb3dzIGFmdGVyIGl0IG9ubHkuXG4gICAgaWYgKE1PREVMUy5nZXQodGhpcy5sb2cpID09PSB0aGlzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5oaXN0b3J5KHNlZ3NbMF0pO1xuICAgICAgY29uc3Qga2VwdCA9IGxhc3RCZWZvcmUoaC5rZXB0QXQsIGlkeCArIDEpO1xuICAgICAgaWYgKGtlcHQgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gcm93cy5maWx0ZXIoKHJvdykgPT4gcm93LmNvbW1pdElkeCA+IGtlcHQpO1xuICAgICAgICAvLyBGb2xkZWQgRlJPTSB0aGUga2VwdCBnZW5lcmF0aW9uLCB0aGUgYW5zd2VyIGNhbiBCRSBpdCAobm8gcm93IGFmdGVyIGl0KSBvciBzaGFyZSBpdHMgcGFydHMsIGFuZFxuICAgICAgICAvLyB0aGUgbWVtbyBhbnN3ZXJzIGV2ZXJ5IGxhdGVyIHF1ZXN0aW9uOiBkZXRhY2ggaXQsIGFzIHRoZSB2YWx1ZSBydWxlIHByb21pc2VzICh1bnRpbCA5LjQ0LjIgYW5cbiAgICAgICAgLy8gZWRpdCBvZiBvbmUgYW5zd2VyIGNoYW5nZWQgdGhlIG5leHQpLlxuICAgICAgICByZXR1cm4gZGV0YWNoZWQoZm9sZEtleShhZnRlciwgc2VncywgeyBhbmNob3JlZDogdHJ1ZSwgc3RhcnQ6IGgua2VwdC5nZXQoa2VwdCk/LmFmdGVyIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2VncywgeyBhbmNob3JlZDogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKiogQSB2YWx1ZSB0aGUgY2FsbGVyIG93bnM6IGEgY29udGFpbmVyIGlzIGNsb25lZCwgYSBwcmltaXRpdmUgaXMgaXRzZWxmLiAqL1xuZnVuY3Rpb24gZGV0YWNoZWQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cbi8qKiBJcyB0aGUgbGFzdCBgc2V0YCAvIGBkZWxldGVgIHJvdyBPTiBga2V5YCBpbiB0aGlzIGNvbW1pdCBhIGBzZXRgPyAqL1xuZnVuY3Rpb24gbGFzdFRvdGFsSXNTZXQoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSBidW5kbGUudHJhY2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB0ID0gYnVuZGxlLnRyYWNlW2ldO1xuICAgIGlmICh0LnBhdGggPT09IGtleSAmJiAodC52ZXJiID09PSAnc2V0JyB8fCB0LnZlcmIgPT09ICdkZWxldGUnKSkgcmV0dXJuIHQudmVyYiA9PT0gJ3NldCc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
@@ -187,7 +187,10 @@ export declare class ExecutionRuntime {
187
187
  * The frozen, detached fold base served as {@link RuntimeSnapshot.initialState}.
188
188
  * Computed once (the base never changes after construction) and shared —
189
189
  * safe because it is deeply frozen, so no holder can mutate it or reach the
190
- * engine through it.
190
+ * engine through it; a base holding a Date, Map, buffer … (what freezing
191
+ * cannot seal) is served by the public snapshot as a copy of its open paths
192
+ * (`runner/snapshot.ts · servedSnapshot`, `capture/freeze.ts · serveRecord`,
193
+ * 9.44.2).
191
194
  */
192
195
  private getFoldBase;
193
196
  getPipelines(): string[];
@@ -9,7 +9,7 @@
9
9
  * The engine (FlowchartTraverser) receives this as its runtime parameter.
10
10
  * After execution, consumers query it for the full execution state.
11
11
  */
12
- import { deepFreeze } from '../capture/freeze.js';
12
+ import { freezeRecord } from '../capture/freeze.js';
13
13
  import { EventLog } from '../memory/EventLog.js';
14
14
  import { LOG_PLACEHOLDER } from '../memory/placeholders.js';
15
15
  import { DEFAULT_RUN_POLICY } from '../memory/runPolicy.js';
@@ -110,12 +110,15 @@ export class ExecutionRuntime {
110
110
  * The frozen, detached fold base served as {@link RuntimeSnapshot.initialState}.
111
111
  * Computed once (the base never changes after construction) and shared —
112
112
  * safe because it is deeply frozen, so no holder can mutate it or reach the
113
- * engine through it.
113
+ * engine through it; a base holding a Date, Map, buffer … (what freezing
114
+ * cannot seal) is served by the public snapshot as a copy of its open paths
115
+ * (`runner/snapshot.ts · servedSnapshot`, `capture/freeze.ts · serveRecord`,
116
+ * 9.44.2).
114
117
  */
115
118
  getFoldBase() {
116
119
  if (!this._foldBase) {
117
120
  const base = this.executionHistory.getInitialState();
118
- this._foldBase = deepFreeze(base && typeof base === 'object' ? base : {});
121
+ this._foldBase = freezeRecord(base && typeof base === 'object' ? base : {});
119
122
  }
120
123
  return this._foldBase;
121
124
  }
@@ -171,16 +174,18 @@ export class ExecutionRuntime {
171
174
  // rather than leak it — `stateAt` degrades to `basis: 'log-only'`.
172
175
  ...(useRedacted ? {} : { initialState: this.getFoldBase() }),
173
176
  // DETACHED: the engine keeps its live EventLog; the snapshot gets a
174
- // frozen copy of the array. Serving `list()` directly aliased the
175
- // internal array, so a snapshot taken mid-run kept growing under its
176
- // holder and a consumer could splice the engine's own history. The
177
- // bundles in it are the log's own, frozen at `EventLog · record` (F3).
178
- // The copy stays: it is what keeps a holder's array from growing.
179
- commitLog: Object.freeze(this.executionHistory.list().slice()),
177
+ // frozen array of its own (`recorded()` builds a new one). Serving the
178
+ // internal array aliased it, so a snapshot taken mid-run kept growing
179
+ // under its holder and a consumer could splice the engine's own history.
180
+ // The bundles in it are the log's own, frozen at `EventLog · record`
181
+ // (F3). The public snapshot serves them (`runner/snapshot.ts ·
182
+ // servedSnapshot`, 9.44.2); this one is also the engine's own — a
183
+ // subflow mount takes it once per mount — so the run path serves nothing.
184
+ commitLog: Object.freeze(this.executionHistory.recorded()),
180
185
  ...(this.executionHistory.address === undefined ? {} : { logAddress: this.executionHistory.address }),
181
186
  commitValues: this.policy.commitValues,
182
187
  writeProvenance: this.policy.writeProvenance,
183
188
  };
184
189
  }
185
190
  }
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFtSHpELE1BQU0sT0FBTyxnQkFBZ0I7SUFDcEIsV0FBVyxDQUFlO0lBQ2pDOzs7Ozs7OztPQVFHO0lBQ0ksYUFBYSxDQUFnQjtJQUM3QixnQkFBZ0IsQ0FBZTtJQUMvQixnQkFBZ0IsQ0FBVztJQUNsQyxvRkFBb0Y7SUFDNUUsYUFBYSxDQUFnQjtJQUM3QixhQUFhLENBQVU7SUFDdkIsY0FBYyxDQUFVO0lBQ2hDO21GQUMrRTtJQUN2RSxNQUFNLENBQVk7SUFFMUIsNEVBQTRFO0lBQ3BFLFNBQVMsQ0FBMkI7SUFFNUM7Ozs7OztPQU1HO0lBQ0gsWUFDRSxRQUFnQixFQUNoQixNQUFjLEVBQ2QsYUFBdUIsRUFDdkIsWUFBc0IsRUFDdEIsU0FBb0Isa0JBQWtCO1FBRXRDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLHlFQUF5RTtRQUN6RSwwRUFBMEU7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QUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JHLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVk7WUFDdEMsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZTtTQUM3QyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeGVjdXRpb25SdW50aW1lIOKAlCBUaGUgcnVudGltZSBlbnZpcm9ubWVudCBmb3Igb25lIGZsb3djaGFydCBleGVjdXRpb24uXG4gKlxuICogV2lyZXMgdXAgdGhlIHRocmVlIG1lbW9yeSBwcmltaXRpdmVzIGludG8gYSBzaW5nbGUgY29udGFpbmVyOlxuICogICAtIFNoYXJlZE1lbW9yeSAodGhlIGhlYXAg4oCUIHNoYXJlZCBzdGF0ZSBhY3Jvc3MgYWxsIHN0YWdlcylcbiAqICAgLSBTdGFnZUNvbnRleHQgICh0aGUgY2FsbCBzdGFjayDigJQgcGVyLXN0YWdlIGV4ZWN1dGlvbiB0cmVlKVxuICogICAtIEV2ZW50TG9nICAgICAgKHRoZSB0cmFuc2FjdGlvbiBsb2cg4oCUIGNvbW1pdCBoaXN0b3J5IGZvciByZXBsYXkpXG4gKlxuICogVGhlIGVuZ2luZSAoRmxvd2NoYXJ0VHJhdmVyc2VyKSByZWNlaXZlcyB0aGlzIGFzIGl0cyBydW50aW1lIHBhcmFtZXRlci5cbiAqIEFmdGVyIGV4ZWN1dGlvbiwgY29uc3VtZXJzIHF1ZXJ5IGl0IGZvciB0aGUgZnVsbCBleGVjdXRpb24gc3RhdGUuXG4gKi9cblxuaW1wb3J0IHsgZGVlcEZyZWV6ZSB9IGZyb20gJy4uL2NhcHR1cmUvZnJlZXplLmpzJztcbmltcG9ydCB7IEV2ZW50TG9nIH0gZnJvbSAnLi4vbWVtb3J5L0V2ZW50TG9nLmpzJztcbmltcG9ydCB0eXBlIHsgTG9nQWRkcmVzcyB9IGZyb20gJy4uL21lbW9yeS9ldmVudFBvc2l0aW9uLmpzJztcbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJy4uL21lbW9yeS9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IERFRkFVTFRfUlVOX1BPTElDWSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi4vbWVtb3J5L1NoYXJlZE1lbW9yeS5qcyc7XG5pbXBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBDb21taXRWYWx1ZXNNb2RlLCBTdGFnZVNuYXBzaG90LCBXcml0ZVByb3ZlbmFuY2VNb2RlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgT2JzZXJ2ZXJTdGF0cyB9IGZyb20gJy4vRGVmZXJyZWRPYnNlcnZlclRpZXIuanMnO1xuXG4vKiogU25hcHNob3Qgb2YgYSBzaW5nbGUgcmVjb3JkZXIncyBjb2xsZWN0ZWQgZGF0YS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkZXJTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFNjb3BlUmVjb3JkZXIgdHlwZSBhbmQgcGF0dGVybiBkZXNjcmlwdGlvbiAoZS5nLiwgXCJUcmFuc2xhdG9yIChLZXllZFN0b3JlKSDigJQgcGVyLXN0ZXAgdG9rZW4gdXNhZ2VcIikuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogUHJlZmVycmVkIHJlYWQtdGltZSBvcGVyYXRpb24g4oCUIGhpbnRzIHRoZSBVSSBhYm91dCB3aGljaCB2aWV3IHRvIHNob3cgcHJvbWluZW50bHkuICovXG4gIHByZWZlcnJlZE9wZXJhdGlvbj86ICd0cmFuc2xhdGUnIHwgJ2FjY3VtdWxhdGUnIHwgJ2FnZ3JlZ2F0ZSc7XG4gIGRhdGE6IHVua25vd247XG4gIC8qKlxuICAgKiBTbWFsbCBtYWNoaW5lLXJlYWRhYmxlIGZhY3RzIGFib3V0IHRoZSBCVU5ETEUg4oCUIGhvdyBpdCB3YXMgcHJvZHVjZWQsXG4gICAqIHdoaWNoIHByb2plY3Rpb24gb2YgdGhlIHJlY29yZGVyJ3MgZGF0YSBpdCBpcywgd2hhdCBpdCBkZWxpYmVyYXRlbHlcbiAgICogbGVmdCBvdXQuIFdoYXRldmVyIHRoZSByZWNvcmRlcidzIGB0b1NuYXBzaG90KClgIHB1dCBoZXJlLCBjb3BpZWRcbiAgICogdGhyb3VnaCB1bmNoYW5nZWQuXG4gICAqXG4gICAqIFRoZSBzcGxpdCB3aXRoIGBkZXNjcmlwdGlvbmA6IGBkZXNjcmlwdGlvbmAgaXMgdGhlIHNlbnRlbmNlIGEgaHVtYW5cbiAgICogcmVhZHM7IGBtZXRhYCBpcyB3aGF0IGFuIG9mZmxpbmUgY29uc3VtZXIgQlJBTkNIRVMgb24uIEEgcmVjb3JkZXIgd2l0aFxuICAgKiBhIFwiZnVsbFwiIGFuZCBhIFwibGVhblwiIGJ1bmRsZSBzaGFwZSB0aGF0IHNheXMgc28gb25seSBpbiBpdHNcbiAgICogZGVzY3JpcHRpb24gZm9yY2VzIGV2ZXJ5IHJlYWRlciB0byBzdHJpbmctbWF0Y2ggcHJvc2Ug4oCUIGFuZCBhIHJlYWRlclxuICAgKiB0aGF0IGRvZXNuJ3QgcmVuZGVycyBhbiBlbXB0eSBwYW5lbCBpbnN0ZWFkIG9mIHNheWluZyBcInRoaXMgcmVjb3JkaW5nXG4gICAqIGNhcnJpZXMgc3RydWN0dXJlIG9ubHlcIi5cbiAgICpcbiAgICogTm90IGludGVycHJldGVkIGJ5IHRoZSBlbmdpbmUsIHNvIGtleXMgYXJlIHRoZSByZWNvcmRlcidzIHRvIGNob29zZTtcbiAgICoga2VlcCB0aGUgdmFsdWVzIEpTT04tc2FmZSwgc2luY2UgdGhpcyByaWRlcyB0aGUgc25hcHNob3Qgb3V0IHRvIGRpc2suXG4gICAqL1xuICBtZXRhPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG5leHBvcnQgdHlwZSBSdW50aW1lU25hcHNob3QgPSB7XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgc25hcHNob3QgYmVsb25ncyB0byDigJQgdGhlIHNhbWUgYHJ1bklkYCBzdGFtcGVkIG9uIGV2ZXJ5XG4gICAqIGBUcmF2ZXJzYWxDb250ZXh0YCAoYW5kIHRodXMgZXZlcnkgcmVjb3JkZXIgZXZlbnQpIG9mIHRoZSBydW4sIHNvIGFcbiAgICogc25hcHNob3QgY2FuIGJlIGpvaW5lZCBhZ2FpbnN0IGFuIGV2ZW50IHN0cmVhbSBvciBhbiBleHRlcm5hbFxuICAgKiBjb3JyZWxhdGlvbiB0YWJsZS4gUmVhZC1vbmx5IGJ5IGNvbnRyYWN0OiBnZW5lcmF0ZWQgYnkgdGhlIGV4ZWN1dG9yXG4gICAqIChgcnVubmVyL3J1bklkLnRzYCksIG5ldmVyIGRlcml2ZWQgZnJvbSBzbmFwc2hvdCBjb250ZW50cy5cbiAgICpcbiAgICogTGlmZWN5Y2xlIChtYXRjaGVzIHRoZSBldmVudCBtb2RlbCk6IGZyZXNoIHBlciBgcnVuKClgIEFORCBwZXJcbiAgICogYHJlc3VtZSgpYCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1biwgc28gYSBwb3N0LXJlc3VtZVxuICAgKiBzbmFwc2hvdCBjYXJyaWVzIGEgRElGRkVSRU5UIHJ1bklkIHRoYW4gdGhlIHBhdXNlZCBydW4ncyBzbmFwc2hvdC5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHNoYXJlZFN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZXhlY3V0aW9uVHJlZTogU3RhZ2VTbmFwc2hvdDtcbiAgLyoqXG4gICAqIFRoZSBjb21taXQgbG9nJ3MgZm9sZCBCQVNFIOKAlCB0aGUgcnVuJ3Mgc3RhdGUgYmVmb3JlIGl0cyBmaXJzdCBjb21taXRcbiAgICogKGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGggYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YDsgb24gYSByZXN1bWUsIHRoZVxuICAgKiBjaGVja3BvaW50J3Mgc3RhdGUpLiBEZWVwbHkgZnJvemVuIGFuZCBmdWxseSBkZXRhY2hlZCBmcm9tIHRoZSBlbmdpbmUuXG4gICAqXG4gICAqIENvbW1pdCBidW5kbGVzIGFyZSBESUZGUywgc28gdGhlIGxvZyBhbG9uZSBjYW5ub3QgcmVidWlsZCBhIHZhbHVlIHRoYXRcbiAgICogd2FzIHNlZWRlZCBiZWZvcmUgdGhlIHJ1biBhbmQgb25seSBldmVyIG1lcmdlZCBhZnRlcndhcmRzLiBTaGlwcGluZyB0aGVcbiAgICogYmFzZSBXSVRIIHRoZSBsb2cgaXMgd2hhdCBtYWtlcyBhbiBvZmZsaW5lIGZvbGQg4oCUIGBzdGF0ZUF0KHNuYXBzaG90LCBpKWBcbiAgICogZnJvbSBgZm9vdHByaW50anMvdHJhY2VgIOKAlCByZXByb2R1Y2UgdGhlIHN0YXRlIGEgc3RhZ2UgYWN0dWFsbHkgc2F3LlxuICAgKlxuICAgKiBPUFRJT05BTCBCWSBUWVBFLCBhbmQgYWJzZW50IGluIGV4YWN0bHkgdHdvIGNhc2VzLiBBIHBsYWluIGBnZXRTbmFwc2hvdCgpYFxuICAgKiBhbHdheXMgY2FycmllcyBpdCwgc28gYSBsaXZlIGZvbGQgcmVwb3J0cyBgYmFzaXM6ICdpbml0aWFsK2xvZydgLiBVbmRlclxuICAgKiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGl0IGlzIE9NSVRURUQg4oCUIHRoZSBiYXNlIGlzIHRoZSByYXcgcHJlLXJ1blxuICAgKiBzZWVkIGFuZCB0aGUgcmVkYWN0aW9uIHBvbGljeSBpcyBub3QgcGx1bWJlZCBpbnRvIHRoZSBmb2xkIOKAlCBzbyBhIGZvbGQgb2ZcbiAgICogYSByZWRhY3RlZCBzbmFwc2hvdCBkZWdyYWRlcyBob25lc3RseSB0byBgYmFzaXM6ICdsb2ctb25seSdgLiBBbmQgaXQgaXNcbiAgICogZGVjbGFyZWQgb3B0aW9uYWwgc28gdGhhdCBjb2RlIHdyaXR0ZW4gYWdhaW5zdCA5LjE2Lngg4oCUIGEgdGVzdCBmaXh0dXJlIG9yXG4gICAqIGEgVUkgbW9jayB0aGF0IENPTlNUUlVDVFMgYSBgUnVudGltZVNuYXBzaG90YCBsaXRlcmFsIOKAlCBzdGlsbCBjb21waWxlcy5cbiAgICogYHN0YXRlQXRgIGhhbmRsZXMgYWJzZW5jZSBieSBzYXlpbmcgc28sIG5ldmVyIGJ5IGZvbGRpbmcgYSBsaWUuXG4gICAqL1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBjb21taXQgYnVuZGxlcywgb25lIHBlciBleGVjdXRlZCBzdGFnZSwgaW4gZXhlY3V0aW9uIG9yZGVyIOKAlFxuICAgKiBhIERFVEFDSEVELCBmcm96ZW4gY29weSBvZiB0aGUgZW5naW5lJ3MgbGl2ZSBsb2cgKGEgc25hcHNob3QgaXMgYSBmb2xkXG4gICAqIHJlc3VsdDogaXQgbXVzdCBub3Qga2VlcCBjaGFuZ2luZyB1bmRlciB0aGUgY29uc3VtZXIgdGhhdCBob2xkcyBpdCkuXG4gICAqIFRoZSBidW5kbGVzIGluc2lkZSBhcmUgdGhlIGVuZ2luZSdzIG93biBvYmplY3RzLCBpbW11dGFibGUgYWZ0ZXIgcmVjb3JkLlxuICAgKi9cbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXTtcbiAgLyoqIElkZW50aXR5IG9mIHRoaXMgbG9nLCBzdGFibGUgYWNyb3NzIHNhbWUtZXhlY3V0b3IgcmVzdW1lLiBBYnNlbnQgYmVmb3JlIGJpbmRpbmcgb3IgaW4gb2xkZXIgc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgbG9nQWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gIC8qKlxuICAgKiBFbmNvZGluZyBkaXNjcmltaW5hbnQgZm9yIGBjb21taXRMb2dgICgjMTNjLUIpOiBgJ2Z1bGwnYCDigJQgZXZlcnkgYHNldGBcbiAgICogYnVuZGxlIHN0b3JlcyB0aGUgZnVsbCBmaW5hbCB2YWx1ZSAoaGlzdG9yaWNhbCk7IGAnZGVsdGEnYCDigJQgYnVuZGxlcyBtYXlcbiAgICogY2FycnkgYGFwcGVuZGAvYGRlbGV0ZWAgdHJhY2UgdmVyYnMgd2l0aCB2ZXJiLXF1YWxpZmllZCBgb3ZlcndyaXRlYFxuICAgKiBwYXlsb2FkcyAodGFpbHMpLiBPZmZsaW5lIHRvb2xpbmcga2V5cyBvbiB0aGlzIGZpZWxkOyBhIGJ1bmRsZSBzdHJlYW1cbiAgICogd2l0aG91dCBjb250ZXh0IHJlbWFpbnMgc2VsZi1kZXNjcmliaW5nIHZpYSB0aGUgdmVyYnMgdGhlbXNlbHZlcy5cbiAgICovXG4gIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcbiAgLyoqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2UgZGlhbCAoI1AxKSB0aGUgcnVuIGV4ZWN1dGVkIHVuZGVyIOKAlCB0aGVcbiAgICogIG9mZmxpbmUtdG9vbGluZyBkaXNjcmltaW5hbnQgZm9yIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCBhdmFpbGFiaWxpdHkuICovXG4gIHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbiAgLyoqXG4gICAqIFBlci1zdWJmbG93IGV4ZWN1dGlvbiByZXN1bHRzLCBEVUFMLUtFWUVEIChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpOlxuICAgKiAgIC0gYnkgc3ViZmxvdyBQQVRIIChgc3ViZmxvd0lkYCwgZS5nLiBgJ3NmLXBheSdgKSDihpIgdGhlIExBU1QgaXRlcmF0aW9uIChiYWNrLWNvbXBhdCk7IHRoaXNcbiAgICogICAgIGlzIHdoYXQgYGdldFN1YnRyZWVTbmFwc2hvdChwYXRoKWAgYW5kIGBsaXN0U3ViZmxvd1BhdGhzKClgIHJlc29sdmUuXG4gICAqICAgLSBieSBwZXItZXhlY3V0aW9uIG1vdW50IGBydW50aW1lU3RhZ2VJZGAgKGUuZy4gYCdzZi1wYXkjNSdgKSDihpIgVEhBVCBpdGVyYXRpb24ncyByZXN1bHQsIHNvXG4gICAqICAgICBhIExPT1BJTkcgc3ViZmxvdyByZXRhaW5zIEVWRVJZIGl0ZXJhdGlvbiAobm90IGp1c3QgdGhlIGxhc3QpLiBMb29rIHVwIGEgc3BlY2lmaWNcbiAgICogICAgIGl0ZXJhdGlvbiBhcyBgc3ViZmxvd1Jlc3VsdHNbbm9kZS5ydW50aW1lU3RhZ2VJZF0gPz8gc3ViZmxvd1Jlc3VsdHNbbm9kZS5zdWJmbG93SWRdYC5cbiAgICogQm90aCBrZXlzIHBvaW50IGF0IHRoZSBzYW1lIG9iamVjdCBmb3IgYSBzaW5nbGUgbW91bnQ7IGl0ZXJhdGUgd2l0aCBjYXJlIChjb3VudCB2aWEgdGhlXG4gICAqIHBhdGgga2V5cyDigJQgdGhvc2Ugd2l0aG91dCBgJyMnYCkuIFRoZSBwYXVzZSBjaGVja3BvaW50IGNhcnJpZXMgb25seSB0aGUgcGF0aCBrZXlzLCBsZWFuLlxuICAgKlxuICAgKiBVbmRlciBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIGVhY2ggZW50cnkncyBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgaXMgdGhhdFxuICAgKiBzdWJmbG93J3MgT1dOIHJlZGFjdGVkIG1pcnJvciAoOS4yMC4wKSDigJQgdGhlIGZvbGQgb2YgaXRzIHNjcnViYmVkIGBoaXN0b3J5YCDigJQgc2VydmVkIGFzXG4gICAqIG9uZSBzdWJzdGl0dXRlZCBvYmplY3QgcGVyIG1vdW50IChib3RoIGtleXMgc3RpbGwgYWdyZWUpIOKAlCB0aGUgd3JhcHBlciBpcyBmcmVzaCBwZXJcbiAgICogYGdldFNuYXBzaG90YCBjYWxsLCB0aGUgYGdsb2JhbENvbnRleHRgIGluc2lkZSBpdCBpcyB0aGUgc3RhYmxlIG1pcnJvcjsgcGxhaW4sIGl0IGlzIHRoZSBzdWJmbG93J3NcbiAgICogbGl2ZSBoZWFwLiBXaXRob3V0IGEgcG9saWN5IHRoZXJlIGlzIG5vIG1pcnJvciBhbmQgdGhlIHR3byB2aWV3cyBhcmUgdGhlIHNhbWUgb2JqZWN0cy5cbiAgICovXG4gIHN1YmZsb3dSZXN1bHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBTbmFwc2hvdCBkYXRhIGZyb20gcmVjb3JkZXJzIHRoYXQgaW1wbGVtZW50IHRvU25hcHNob3QoKS4gKi9cbiAgcmVjb3JkZXJzPzogUmVjb3JkZXJTbmFwc2hvdFtdO1xuICAvKipcbiAgICogRGVmZXJyZWQtb2JzZXJ2ZXIgYWNjb3VudGluZyAoUkZDLTAwMSBCbG9jayA5KSDigJQgcXVldWUgZGVwdGgsIGRyb3BzLFxuICAgKiBmbHVzaC9idWRnZXQgY291bnRlcnMsIHBlci1saXN0ZW5lciB0aW1lIGF0dHJpYnV0aW9uLCBhbmQgdGhlXG4gICAqIHRlcm1pbmFsLWZsdXNoIHN0cmFuZGluZyBjb3VudC4gQUJTRU5UIHVubGVzcyBhIHJlY29yZGVyIHdhcyBhdHRhY2hlZFxuICAgKiB3aXRoIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIG9uIHRoaXMgZXhlY3V0b3IgKHplcm8tY29zdCBkaXNjaXBsaW5lKS5cbiAgICovXG4gIG9ic2VydmVyU3RhdHM/OiBPYnNlcnZlclN0YXRzO1xufTtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGlvblJ1bnRpbWUge1xuICBwdWJsaWMgZ2xvYmFsU3RvcmU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqXG4gICAqIFBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciBvZiBgZ2xvYmFsU3RvcmVgLiBQb3B1bGF0ZWQgZHVyaW5nIHRyYXZlcnNhbCB2aWFcbiAgICogYFN0YWdlQ29udGV4dC5jb21taXQoKWAgdXNpbmcgdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcy5cbiAgICogT25seSBleGlzdHMgd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGEgbWlycm9yIChgUnVuUG9saWN5Lm1pcnJvcmAg4oCUXG4gICAqIGBGbG93Q2hhcnRFeGVjdXRvcmAgc2V0cyBpdCB3aGVuIGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZCkuXG4gICAqIE90aGVyd2lzZSB1bmRlZmluZWQgYW5kIHplcm8gY29zdC5cbiAgICpcbiAgICogUmVhZCB2aWEgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYC5cbiAgICovXG4gIHB1YmxpYyByZWRhY3RlZFN0b3JlPzogU2hhcmVkTWVtb3J5O1xuICBwdWJsaWMgcm9vdFN0YWdlQ29udGV4dDogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgZXhlY3V0aW9uSGlzdG9yeTogRXZlbnRMb2c7XG4gIC8qKiBPcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIOKAlCBzZXQgYmVmb3JlIHJlc3VtZSBjaGFuZ2VzIHJvb3RTdGFnZUNvbnRleHQuICovXG4gIHByaXZhdGUgX3NuYXBzaG90Um9vdD86IFN0YWdlQ29udGV4dDtcbiAgcHJpdmF0ZSBfaW5pdGlhbFN0YXRlOiB1bmtub3duO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWVzOiB1bmtub3duO1xuICAvKiogVGhlIHJ1bidzIHBvbGljeSAoYG1lbW9yeS9ydW5Qb2xpY3kudHNgKSDigJQgaW5zdGFsbGVkIG9uIHRoZSByb290IGZyYW1lO1xuICAgKiAgaXRzIGBjb21taXRWYWx1ZXNgIGFuZCBgd3JpdGVQcm92ZW5hbmNlYCBhcmUgdGhlIHNuYXBzaG90IGRpc2NyaW1pbmFudHMuICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3k7XG5cbiAgLyoqIE1lbW9pemVkIGZyb3plbiBmb2xkIGJhc2Ug4oCUIHNlZSB7QGxpbmsgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZX0uICovXG4gIHByaXZhdGUgX2ZvbGRCYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwb2xpY3kgVGhlIHJ1bidzIHBvbGljeSAoYHJ1blBvbGljeS50c2AsIEY1KSDigJQgdGhlIGZvdXIgZGlhbHMsIHRoZVxuICAgKiAgIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWcuIEluc3RhbGxlZCBvbiB0aGUgcm9vdCBmcmFtZSBoZXJlLCBzb1xuICAgKiAgIHRoZSBGSVJTVCBjb21taXQgKGEgc3ViZmxvdydzIHNlZWQsIGBoaXN0b3J5WzBdYCkgYWxyZWFkeSBydW5zIHVuZGVyIGl0O1xuICAgKiAgIGV2ZXJ5IGZyYW1lIGFmdGVyIGluaGVyaXRzIHRoZSBzYW1lIHJlZmVyZW5jZS4gRGVmYXVsdDogZXZlcnkgZGlhbCBhdFxuICAgKiAgIGl0cyBkZWZhdWx0LCBubyBydWxlLCBubyBtaXJyb3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICByb290TmFtZTogc3RyaW5nLFxuICAgIHJvb3RJZDogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuICAgIGluaXRpYWxTdGF0ZT86IHVua25vd24sXG4gICAgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1ksXG4gICkge1xuICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICB0aGlzLmdsb2JhbFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShkZWZhdWx0VmFsdWVzLCBpbml0aWFsU3RhdGUpO1xuICAgIC8vIFRoZSBldmVudCBsb2cncyBmb2xkIGJhc2UgbXVzdCBiZSB0aGUgU0FNRSBzdGF0ZSB0aGUgc3RvcmUgc3RhcnRzIGZyb21cbiAgICAvLyDigJQgYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aCBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyB3aGF0XG4gICAgLy8gYFNoYXJlZE1lbW9yeWAgY29tcHV0ZWQgYWJvdmUuIFNlZWRpbmcgdGhlIGxvZyBmcm9tIGBpbml0aWFsU3RhdGVgIGFsb25lXG4gICAgLy8gbGVmdCBgZGVmYXVsdFZhbHVlc2Agb3V0IG9mIGV2ZXJ5IHJlcGxheSwgc28gYSBmb2xkIGNvdWxkIG5vdCByZXByb2R1Y2VcbiAgICAvLyB0aGUgc3RhdGUgYSBzdGFnZSBhY3R1YWxseSBzYXcuIGBnZXRTdGF0ZSgpYCBpcyB0aGUgbGl2ZSBjb250ZXh0OyB0aGVcbiAgICAvLyBFdmVudExvZyBjb25zdHJ1Y3RvciBjbG9uZXMgaXQsIHNvIHRoZSBiYXNlIHN0YXlzIGRldGFjaGVkLlxuICAgIHRoaXMuZXhlY3V0aW9uSGlzdG9yeSA9IG5ldyBFdmVudExvZyh0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCkpO1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucm9vdFN0YWdlQ29udGV4dCA9IHRoaXMubmV3Um9vdChyb290TmFtZSwgcm9vdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZyZXNoIHJvb3QgZnJhbWUgZm9yIHRoaXMgcnVudGltZSDigJQgYGdsb2JhbFN0b3JlYCwgYGV4ZWN1dGlvbkhpc3RvcnlgLFxuICAgKiB0aGUgcnVuJ3MgcG9saWN5IGFuZCAod2hlbiBrZXB0KSB0aGUgbWlycm9yLiBBbHNvIGhvdyBgU3ViZmxvd0V4ZWN1dG9yYFxuICAgKiByZXBsYWNlcyBhIHN1YmZsb3cncyBzZWVkIGZyYW1lIHdpdGggdGhlIGZyYW1lIGl0cyBmaXJzdCBzdGFnZSBydW5zIG9uLlxuICAgKi9cbiAgbmV3Um9vdChuYW1lOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIGNvbnN0IHJvb3QgPSBuZXcgU3RhZ2VDb250ZXh0KCcnLCBuYW1lLCBpZCwgdGhpcy5nbG9iYWxTdG9yZSwgJycsIHRoaXMuZXhlY3V0aW9uSGlzdG9yeSk7XG4gICAgdGhpcy5pbnN0YWxsUG9saWN5KHJvb3QpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIHBvbGljeSBvbiB0aGUgQ1VSUkVOVCByb290IGZyYW1lIOKAlCBhIHNhbWUtZXhlY3V0b3JcbiAgICogcmVzdW1lLCB3aG9zZSBjb250aW51YXRpb24gcm9vdCAoYGxlYWYuY3JlYXRlTmV4dGApIGlzIGFkdmFuY2VkIGJlZm9yZVxuICAgKiB0aGUgZXhlY3V0b3IgYnVpbGRzIHRoaXMgbGVnJ3MgcG9saWN5IChhIGZyZXNoIHJ1bGUgcGVyIGxlZykuIEV2ZXJ5XG4gICAqIGRlc2NlbmRhbnQgdGFrZXMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZXJlLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5pbnN0YWxsUG9saWN5KHRoaXMucm9vdFN0YWdlQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBvbGljeSBvbiBgcm9vdGAsIGFuZCB0aGUgbWlycm9yIHN0b3JlIHdoZW4gdGhlIHBvbGljeSBrZWVwcyBvbmUuXG4gICAqIFRoZSBtaXJyb3IgaXMgYSBTRVJWRUQgc3VyZmFjZSwgc28gaXRzIHNlZWQgbXVzdCBhbHJlYWR5IGJlIHRoZSBwb2xpY3knc1xuICAgKiB2aWV3IG9mIHRoZSBzdGFydGluZyBzdGF0ZTogYSBwb2xpY3kga2V5IHRoYXQgYXJyaXZlcyBieSBgaW5pdGlhbENvbnRleHRgXG4gICAqIC8gYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCAob3IsIG9uIGEgY3Jvc3MtZXhlY3V0b3IgcmVzdW1lLCBieSB0aGVcbiAgICogY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWApIGFuZCBpcyBuZXZlciByZS13cml0dGVuIHdvdWxkIG90aGVyd2lzZSBzaXRcbiAgICogaW4gYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpbiBwbGFpbnRleHQg4oCUIHNvIHRoZSBzZWVkIGlzIHNjcnViYmVkXG4gICAqIHdpdGggdGhlIExPRydzIHBsYWNlaG9sZGVyLCB0aGUgc2FtZSBzdHJpbmcgdGhlIHJlZGFjdGVkIHBhdGNoZXMgY2FycnkuXG4gICAqIENyZWF0ZWQgb25jZSBwZXIgcnVudGltZSAoYSBzdWJmbG93J3MgcnVudGltZSBrZWVwcyBpdHMgb3duOyBpdHMgc2VlZCBpc1xuICAgKiBlbXB0eSDigJQgdGhlIGlucHV0IGFycml2ZXMgYXMgYSBjb21taXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsUG9saWN5KHJvb3Q6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIHJvb3QudXNlUG9saWN5KHRoaXMucG9saWN5KTtcbiAgICBpZiAoIXRoaXMucG9saWN5Lm1pcnJvcikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5yZWRhY3RlZFN0b3JlKSB7XG4gICAgICBjb25zdCBydWxlID0gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICAgICAgdGhpcy5yZWRhY3RlZFN0b3JlID0gbmV3IFNoYXJlZE1lbW9yeShcbiAgICAgICAgcnVsZSA/IHJ1bGUucmV0YWluU3RhdGUodGhpcy5fZGVmYXVsdFZhbHVlcywgTE9HX1BMQUNFSE9MREVSKSA6IHRoaXMuX2RlZmF1bHRWYWx1ZXMsXG4gICAgICAgIHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKHRoaXMuX2luaXRpYWxTdGF0ZSwgTE9HX1BMQUNFSE9MREVSKSA6IHRoaXMuX2luaXRpYWxTdGF0ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJvb3QudXNlUmVkYWN0ZWRNaXJyb3IodGhpcy5yZWRhY3RlZFN0b3JlKTtcbiAgfVxuXG4gIC8qKiBQcmVzZXJ2ZSB0aGUgY3VycmVudCByb290U3RhZ2VDb250ZXh0IGZvciBzbmFwc2hvdHMgYmVmb3JlIGNoYW5naW5nIGl0IGZvciByZXN1bWUuICovXG4gIHByZXNlcnZlU25hcHNob3RSb290KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc25hcHNob3RSb290KSB7XG4gICAgICB0aGlzLl9zbmFwc2hvdFJvb3QgPSB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmcm96ZW4sIGRldGFjaGVkIGZvbGQgYmFzZSBzZXJ2ZWQgYXMge0BsaW5rIFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGV9LlxuICAgKiBDb21wdXRlZCBvbmNlICh0aGUgYmFzZSBuZXZlciBjaGFuZ2VzIGFmdGVyIGNvbnN0cnVjdGlvbikgYW5kIHNoYXJlZCDigJRcbiAgICogc2FmZSBiZWNhdXNlIGl0IGlzIGRlZXBseSBmcm96ZW4sIHNvIG5vIGhvbGRlciBjYW4gbXV0YXRlIGl0IG9yIHJlYWNoIHRoZVxuICAgKiBlbmdpbmUgdGhyb3VnaCBpdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Rm9sZEJhc2UoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5fZm9sZEJhc2UpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gICAgICB0aGlzLl9mb2xkQmFzZSA9IGRlZXBGcmVlemUoYmFzZSAmJiB0eXBlb2YgYmFzZSA9PT0gJ29iamVjdCcgPyBiYXNlIDoge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZm9sZEJhc2U7XG4gIH1cblxuICBnZXRQaXBlbGluZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpO1xuICAgIHJldHVybiBzdGF0ZS5waXBlbGluZXMgPyBPYmplY3Qua2V5cyhzdGF0ZS5waXBlbGluZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogW107XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQuc2V0T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcnVudGltZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucmVkYWN0ICBXaGVuIGB0cnVlYCwgcmV0dXJucyBgc2hhcmVkU3RhdGVgIGZyb20gdGhlXG4gICAqICAgcGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yIChpZiBvbmUgd2FzIGVuYWJsZWQpLiBUaGlzIGlzIHRoZSBzYWZlIHZpZXdcbiAgICogICBmb3Igc2hhcmluZyB0cmFjZXMgZXh0ZXJuYWxseSDigJQgcGFzdGUgaW50byBhIHZpZXdlciwgc2hpcCB0byBzdXBwb3J0LFxuICAgKiAgIGV0Yy4gV2hlbiB0aGUgbWlycm9yIHdhcyBuZXZlciBlbmFibGVkLCBmYWxscyBiYWNrIHRvIHJhdyBgZ2xvYmFsU3RvcmVgXG4gICAqICAgYW5kIGEgZGV2LW1vZGUgd2FybmluZyBpcyBlbWl0dGVkIChzaWxlbnQgaW4gcHJvZHVjdGlvbikuXG4gICAqXG4gICAqICAgRGVmYXVsdCBgZmFsc2VgIHByZXNlcnZlcyB0aGUgcnVudGltZSB2aWV3IOKAlCBuZWNlc3NhcnkgZm9yIHBhdXNlIC9cbiAgICogICByZXN1bWUgKHJlc3VtcHRpb24gbXVzdCByZXBsYXkgYWdhaW5zdCB0aGUgcmVhbCB2YWx1ZXMsIG5vdFxuICAgKiAgICdbUkVEQUNURURdJykuXG4gICAqXG4gICAqIE90aGVyIGZpZWxkcyAoYGV4ZWN1dGlvblRyZWVgLCBgY29tbWl0TG9nYCkgYXJlIHRoZSBzYW1lIGVpdGhlciB3YXkg4oCUXG4gICAqIHRoZSBjb21taXQgbG9nIGlzIGFscmVhZHkgcmVkYWN0ZWQgYXQgd3JpdGUtdGltZSwgYW5kIHRoZSBleGVjdXRpb25cbiAgICogdHJlZSBvbmx5IGNhcnJpZXMgc3RydWN0dXJhbCBtZXRhZGF0YS5cbiAgICpcbiAgICogYGluaXRpYWxTdGF0ZWAgKHRoZSBmb2xkIGJhc2UpIGlzIE9NSVRURUQgdW5kZXIgYHJlZGFjdDogdHJ1ZWAuIEl0IGlzIHRoZVxuICAgKiBydW4ncyByYXcgcHJlLXJ1biBzZWVkIOKAlCBgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoXG4gICAqIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAg4oCUIGFuZCBpdCBuZXZlciBwYXNzZWQgdGhyb3VnaCBhIHJlZGFjdGlvblxuICAgKiBwb2xpY3k6IHRoZSBwb2xpY3kgc2NydWJzIFdSSVRFUyBhdCB0aGUgc2NvcGUgZmFjYWRlLCBhbmQgdGhlIGJhc2Ugd2FzXG4gICAqIG5ldmVyIHdyaXR0ZW4gYnkgYSBzdGFnZS4gU2VydmluZyBpdCBvbiB0aGUgcmVkYWN0ZWQgc3VyZmFjZSB3b3VsZCBoYW5kXG4gICAqIGJhY2sgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIGEgc2VlZGVkIHNlY3JldCB0aGF0IGEgbGF0ZXIgY29tbWl0IGhhZFxuICAgKiBzY3J1YmJlZC4gQSBjb25zdW1lciBmb2xkaW5nIHdpdGhvdXQgaXQgZ2V0cyBgYmFzaXM6ICdsb2ctb25seSdgIGZyb21cbiAgICogYHN0YXRlQXRgLCB3aGljaCBpcyB0aGUgaG9uZXN0IHNpZ25hbCB0aGF0IHRoZSBiYXNlIGRpZCBub3QgdHJhdmVsIHdpdGhcbiAgICogdGhpcyBsb2cg4oCUIGEgcGFydGlhbCBhbnN3ZXIgdGhhdCBzYXlzIGl0IGlzIHBhcnRpYWwsIG5ldmVyIGEgc2lsZW50IG9uZS5cbiAgICpcbiAgICogUmV0dXJucyBgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+YDogdGhlIHJ1bnRpbWUgaXMgdGhlIG1lbW9yeVxuICAgKiBjb250YWluZXIgYW5kIGRvZXNuJ3Qga25vdyB3aGljaCBydW4gaXQgc2VydmVzIOKAlCBgcnVuSWRgIGlzIHBlci1ydW5cbiAgICogZXhlY3V0b3Igc3RhdGUsIHN0YW1wZWQgYnkgYEZsb3djaGFydFRyYXZlcnNlci5nZXRTbmFwc2hvdCgpYCAod2hpY2hcbiAgICogb3ducyB0aGUgcnVuJ3MgaWQgYW5kIGFscmVhZHkgc3RhbXBzIGl0IG9uIGV2ZXJ5IGV2ZW50KS4gU3ViZmxvd3MnXG4gICAqIG5lc3RlZCBydW50aW1lcyBkZWxpYmVyYXRlbHkgaGF2ZSBOTyBydW5JZCBvZiB0aGVpciBvd24gKGEgc3ViZmxvdyBpc1xuICAgKiBwYXJ0IG9mIHRoZSBwYXJlbnQncyBsb2dpY2FsIHJ1bikuXG4gICAqL1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiBPbWl0PFJ1bnRpbWVTbmFwc2hvdCwgJ3J1bklkJz4ge1xuICAgIGNvbnN0IHNuYXBzaG90Um9vdCA9IHRoaXMuX3NuYXBzaG90Um9vdCA/PyB0aGlzLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgY29uc3QgdXNlUmVkYWN0ZWQgPSBvcHRpb25zPy5yZWRhY3QgPT09IHRydWUgJiYgdGhpcy5yZWRhY3RlZFN0b3JlICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoYXJlZFN0YXRlOiB1c2VSZWRhY3RlZCA/IHRoaXMucmVkYWN0ZWRTdG9yZSEuZ2V0U3RhdGUoKSA6IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90Um9vdC5nZXRTbmFwc2hvdCgpLFxuICAgICAgLy8gUkVEQUNUSU9OOiB0aGUgZm9sZCBiYXNlIGlzIHRoZSByYXcgcHJlLXJ1biBzZWVkIGFuZCBubyBwb2xpY3kgZXZlclxuICAgICAgLy8gdG91Y2hlZCBpdCAocG9saWNpZXMgc2NydWIgd3JpdGVzOyBub3RoaW5nIHdyb3RlIHRoZSBiYXNlKS4gT21pdCBpdFxuICAgICAgLy8gcmF0aGVyIHRoYW4gbGVhayBpdCDigJQgYHN0YXRlQXRgIGRlZ3JhZGVzIHRvIGBiYXNpczogJ2xvZy1vbmx5J2AuXG4gICAgICAuLi4odXNlUmVkYWN0ZWQgPyB7fSA6IHsgaW5pdGlhbFN0YXRlOiB0aGlzLmdldEZvbGRCYXNlKCkgfSksXG4gICAgICAvLyBERVRBQ0hFRDogdGhlIGVuZ2luZSBrZWVwcyBpdHMgbGl2ZSBFdmVudExvZzsgdGhlIHNuYXBzaG90IGdldHMgYVxuICAgICAgLy8gZnJvemVuIGNvcHkgb2YgdGhlIGFycmF5LiBTZXJ2aW5nIGBsaXN0KClgIGRpcmVjdGx5IGFsaWFzZWQgdGhlXG4gICAgICAvLyBpbnRlcm5hbCBhcnJheSwgc28gYSBzbmFwc2hvdCB0YWtlbiBtaWQtcnVuIGtlcHQgZ3Jvd2luZyB1bmRlciBpdHNcbiAgICAgIC8vIGhvbGRlciBhbmQgYSBjb25zdW1lciBjb3VsZCBzcGxpY2UgdGhlIGVuZ2luZSdzIG93biBoaXN0b3J5LiBUaGVcbiAgICAgIC8vIGJ1bmRsZXMgaW4gaXQgYXJlIHRoZSBsb2cncyBvd24sIGZyb3plbiBhdCBgRXZlbnRMb2cgwrcgcmVjb3JkYCAoRjMpLlxuICAgICAgLy8gVGhlIGNvcHkgc3RheXM6IGl0IGlzIHdoYXQga2VlcHMgYSBob2xkZXIncyBhcnJheSBmcm9tIGdyb3dpbmcuXG4gICAgICBjb21taXRMb2c6IE9iamVjdC5mcmVlemUodGhpcy5leGVjdXRpb25IaXN0b3J5Lmxpc3QoKS5zbGljZSgpKSBhcyBDb21taXRCdW5kbGVbXSxcbiAgICAgIC4uLih0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzIH0pLFxuICAgICAgY29tbWl0VmFsdWVzOiB0aGlzLnBvbGljeS5jb21taXRWYWx1ZXMsXG4gICAgICB3cml0ZVByb3ZlbmFuY2U6IHRoaXMucG9saWN5LndyaXRlUHJvdmVuYW5jZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhlY3V0aW9uUnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcnVubmVyL0V4ZWN1dGlvblJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFtSHpELE1BQU0sT0FBTyxnQkFBZ0I7SUFDcEIsV0FBVyxDQUFlO0lBQ2pDOzs7Ozs7OztPQVFHO0lBQ0ksYUFBYSxDQUFnQjtJQUM3QixnQkFBZ0IsQ0FBZTtJQUMvQixnQkFBZ0IsQ0FBVztJQUNsQyxvRkFBb0Y7SUFDNUUsYUFBYSxDQUFnQjtJQUM3QixhQUFhLENBQVU7SUFDdkIsY0FBYyxDQUFVO0lBQ2hDO21GQUMrRTtJQUN2RSxNQUFNLENBQVk7SUFFMUIsNEVBQTRFO0lBQ3BFLFNBQVMsQ0FBMkI7SUFFNUM7Ozs7OztPQU1HO0lBQ0gsWUFDRSxRQUFnQixFQUNoQixNQUFjLEVBQ2QsYUFBdUIsRUFDdkIsWUFBc0IsRUFDdEIsU0FBb0Isa0JBQWtCO1FBRXRDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLHlFQUF5RTtRQUN6RSwwRUFBMEU7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QyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckcsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTtZQUN0QyxlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlO1NBQzdDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4ZWN1dGlvblJ1bnRpbWUg4oCUIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBvbmUgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAqXG4gKiBXaXJlcyB1cCB0aGUgdGhyZWUgbWVtb3J5IHByaW1pdGl2ZXMgaW50byBhIHNpbmdsZSBjb250YWluZXI6XG4gKiAgIC0gU2hhcmVkTWVtb3J5ICh0aGUgaGVhcCDigJQgc2hhcmVkIHN0YXRlIGFjcm9zcyBhbGwgc3RhZ2VzKVxuICogICAtIFN0YWdlQ29udGV4dCAgKHRoZSBjYWxsIHN0YWNrIOKAlCBwZXItc3RhZ2UgZXhlY3V0aW9uIHRyZWUpXG4gKiAgIC0gRXZlbnRMb2cgICAgICAodGhlIHRyYW5zYWN0aW9uIGxvZyDigJQgY29tbWl0IGhpc3RvcnkgZm9yIHJlcGxheSlcbiAqXG4gKiBUaGUgZW5naW5lIChGbG93Y2hhcnRUcmF2ZXJzZXIpIHJlY2VpdmVzIHRoaXMgYXMgaXRzIHJ1bnRpbWUgcGFyYW1ldGVyLlxuICogQWZ0ZXIgZXhlY3V0aW9uLCBjb25zdW1lcnMgcXVlcnkgaXQgZm9yIHRoZSBmdWxsIGV4ZWN1dGlvbiBzdGF0ZS5cbiAqL1xuXG5pbXBvcnQgeyBmcmVlemVSZWNvcmQgfSBmcm9tICcuLi9jYXB0dXJlL2ZyZWV6ZS5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4uL21lbW9yeS9FdmVudExvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICcuLi9tZW1vcnkvZXZlbnRQb3NpdGlvbi5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1kgfSBmcm9tICcuLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4uL21lbW9yeS9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0VmFsdWVzTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmVyU3RhdHMgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcblxuLyoqIFNuYXBzaG90IG9mIGEgc2luZ2xlIHJlY29yZGVyJ3MgY29sbGVjdGVkIGRhdGEuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVyU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTY29wZVJlY29yZGVyIHR5cGUgYW5kIHBhdHRlcm4gZGVzY3JpcHRpb24gKGUuZy4sIFwiVHJhbnNsYXRvciAoS2V5ZWRTdG9yZSkg4oCUIHBlci1zdGVwIHRva2VuIHVzYWdlXCIpLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZWZlcnJlZCByZWFkLXRpbWUgb3BlcmF0aW9uIOKAlCBoaW50cyB0aGUgVUkgYWJvdXQgd2hpY2ggdmlldyB0byBzaG93IHByb21pbmVudGx5LiAqL1xuICBwcmVmZXJyZWRPcGVyYXRpb24/OiAndHJhbnNsYXRlJyB8ICdhY2N1bXVsYXRlJyB8ICdhZ2dyZWdhdGUnO1xuICBkYXRhOiB1bmtub3duO1xuICAvKipcbiAgICogU21hbGwgbWFjaGluZS1yZWFkYWJsZSBmYWN0cyBhYm91dCB0aGUgQlVORExFIOKAlCBob3cgaXQgd2FzIHByb2R1Y2VkLFxuICAgKiB3aGljaCBwcm9qZWN0aW9uIG9mIHRoZSByZWNvcmRlcidzIGRhdGEgaXQgaXMsIHdoYXQgaXQgZGVsaWJlcmF0ZWx5XG4gICAqIGxlZnQgb3V0LiBXaGF0ZXZlciB0aGUgcmVjb3JkZXIncyBgdG9TbmFwc2hvdCgpYCBwdXQgaGVyZSwgY29waWVkXG4gICAqIHRocm91Z2ggdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUaGUgc3BsaXQgd2l0aCBgZGVzY3JpcHRpb25gOiBgZGVzY3JpcHRpb25gIGlzIHRoZSBzZW50ZW5jZSBhIGh1bWFuXG4gICAqIHJlYWRzOyBgbWV0YWAgaXMgd2hhdCBhbiBvZmZsaW5lIGNvbnN1bWVyIEJSQU5DSEVTIG9uLiBBIHJlY29yZGVyIHdpdGhcbiAgICogYSBcImZ1bGxcIiBhbmQgYSBcImxlYW5cIiBidW5kbGUgc2hhcGUgdGhhdCBzYXlzIHNvIG9ubHkgaW4gaXRzXG4gICAqIGRlc2NyaXB0aW9uIGZvcmNlcyBldmVyeSByZWFkZXIgdG8gc3RyaW5nLW1hdGNoIHByb3NlIOKAlCBhbmQgYSByZWFkZXJcbiAgICogdGhhdCBkb2Vzbid0IHJlbmRlcnMgYW4gZW1wdHkgcGFuZWwgaW5zdGVhZCBvZiBzYXlpbmcgXCJ0aGlzIHJlY29yZGluZ1xuICAgKiBjYXJyaWVzIHN0cnVjdHVyZSBvbmx5XCIuXG4gICAqXG4gICAqIE5vdCBpbnRlcnByZXRlZCBieSB0aGUgZW5naW5lLCBzbyBrZXlzIGFyZSB0aGUgcmVjb3JkZXIncyB0byBjaG9vc2U7XG4gICAqIGtlZXAgdGhlIHZhbHVlcyBKU09OLXNhZmUsIHNpbmNlIHRoaXMgcmlkZXMgdGhlIHNuYXBzaG90IG91dCB0byBkaXNrLlxuICAgKi9cbiAgbWV0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn1cblxuZXhwb3J0IHR5cGUgUnVudGltZVNuYXBzaG90ID0ge1xuICAvKipcbiAgICogVGhlIHJ1biB0aGlzIHNuYXBzaG90IGJlbG9uZ3MgdG8g4oCUIHRoZSBzYW1lIGBydW5JZGAgc3RhbXBlZCBvbiBldmVyeVxuICAgKiBgVHJhdmVyc2FsQ29udGV4dGAgKGFuZCB0aHVzIGV2ZXJ5IHJlY29yZGVyIGV2ZW50KSBvZiB0aGUgcnVuLCBzbyBhXG4gICAqIHNuYXBzaG90IGNhbiBiZSBqb2luZWQgYWdhaW5zdCBhbiBldmVudCBzdHJlYW0gb3IgYW4gZXh0ZXJuYWxcbiAgICogY29ycmVsYXRpb24gdGFibGUuIFJlYWQtb25seSBieSBjb250cmFjdDogZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRvclxuICAgKiAoYHJ1bm5lci9ydW5JZC50c2ApLCBuZXZlciBkZXJpdmVkIGZyb20gc25hcHNob3QgY29udGVudHMuXG4gICAqXG4gICAqIExpZmVjeWNsZSAobWF0Y2hlcyB0aGUgZXZlbnQgbW9kZWwpOiBmcmVzaCBwZXIgYHJ1bigpYCBBTkQgcGVyXG4gICAqIGByZXN1bWUoKWAg4oCUIHJlc3VtZSBpcyBsb2dpY2FsbHkgYSBkaXN0aW5jdCBydW4sIHNvIGEgcG9zdC1yZXN1bWVcbiAgICogc25hcHNob3QgY2FycmllcyBhIERJRkZFUkVOVCBydW5JZCB0aGFuIHRoZSBwYXVzZWQgcnVuJ3Mgc25hcHNob3QuXG4gICAqL1xuICByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IGxvZydzIGZvbGQgQkFTRSDigJQgdGhlIHJ1bidzIHN0YXRlIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0XG4gICAqIChgaW5pdGlhbENvbnRleHRgIG1lcmdlZCB3aXRoIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGA7IG9uIGEgcmVzdW1lLCB0aGVcbiAgICogY2hlY2twb2ludCdzIHN0YXRlKS4gRGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLlxuICAgKlxuICAgKiBDb21taXQgYnVuZGxlcyBhcmUgRElGRlMsIHNvIHRoZSBsb2cgYWxvbmUgY2Fubm90IHJlYnVpbGQgYSB2YWx1ZSB0aGF0XG4gICAqIHdhcyBzZWVkZWQgYmVmb3JlIHRoZSBydW4gYW5kIG9ubHkgZXZlciBtZXJnZWQgYWZ0ZXJ3YXJkcy4gU2hpcHBpbmcgdGhlXG4gICAqIGJhc2UgV0lUSCB0aGUgbG9nIGlzIHdoYXQgbWFrZXMgYW4gb2ZmbGluZSBmb2xkIOKAlCBgc3RhdGVBdChzbmFwc2hvdCwgaSlgXG4gICAqIGZyb20gYGZvb3RwcmludGpzL3RyYWNlYCDigJQgcmVwcm9kdWNlIHRoZSBzdGF0ZSBhIHN0YWdlIGFjdHVhbGx5IHNhdy5cbiAgICpcbiAgICogT1BUSU9OQUwgQlkgVFlQRSwgYW5kIGFic2VudCBpbiBleGFjdGx5IHR3byBjYXNlcy4gQSBwbGFpbiBgZ2V0U25hcHNob3QoKWBcbiAgICogYWx3YXlzIGNhcnJpZXMgaXQsIHNvIGEgbGl2ZSBmb2xkIHJlcG9ydHMgYGJhc2lzOiAnaW5pdGlhbCtsb2cnYC4gVW5kZXJcbiAgICogYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBpdCBpcyBPTUlUVEVEIOKAlCB0aGUgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW5cbiAgICogc2VlZCBhbmQgdGhlIHJlZGFjdGlvbiBwb2xpY3kgaXMgbm90IHBsdW1iZWQgaW50byB0aGUgZm9sZCDigJQgc28gYSBmb2xkIG9mXG4gICAqIGEgcmVkYWN0ZWQgc25hcHNob3QgZGVncmFkZXMgaG9uZXN0bHkgdG8gYGJhc2lzOiAnbG9nLW9ubHknYC4gQW5kIGl0IGlzXG4gICAqIGRlY2xhcmVkIG9wdGlvbmFsIHNvIHRoYXQgY29kZSB3cml0dGVuIGFnYWluc3QgOS4xNi54IOKAlCBhIHRlc3QgZml4dHVyZSBvclxuICAgKiBhIFVJIG1vY2sgdGhhdCBDT05TVFJVQ1RTIGEgYFJ1bnRpbWVTbmFwc2hvdGAgbGl0ZXJhbCDigJQgc3RpbGwgY29tcGlsZXMuXG4gICAqIGBzdGF0ZUF0YCBoYW5kbGVzIGFic2VuY2UgYnkgc2F5aW5nIHNvLCBuZXZlciBieSBmb2xkaW5nIGEgbGllLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgY29tbWl0IGJ1bmRsZXMsIG9uZSBwZXIgZXhlY3V0ZWQgc3RhZ2UsIGluIGV4ZWN1dGlvbiBvcmRlciDigJRcbiAgICogYSBERVRBQ0hFRCwgZnJvemVuIGNvcHkgb2YgdGhlIGVuZ2luZSdzIGxpdmUgbG9nIChhIHNuYXBzaG90IGlzIGEgZm9sZFxuICAgKiByZXN1bHQ6IGl0IG11c3Qgbm90IGtlZXAgY2hhbmdpbmcgdW5kZXIgdGhlIGNvbnN1bWVyIHRoYXQgaG9sZHMgaXQpLlxuICAgKiBUaGUgYnVuZGxlcyBpbnNpZGUgYXJlIHRoZSBlbmdpbmUncyBvd24gb2JqZWN0cywgaW1tdXRhYmxlIGFmdGVyIHJlY29yZC5cbiAgICovXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW107XG4gIC8qKiBJZGVudGl0eSBvZiB0aGlzIGxvZywgc3RhYmxlIGFjcm9zcyBzYW1lLWV4ZWN1dG9yIHJlc3VtZS4gQWJzZW50IGJlZm9yZSBiaW5kaW5nIG9yIGluIG9sZGVyIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGxvZ0FkZHJlc3M/OiBMb2dBZGRyZXNzO1xuICAvKipcbiAgICogRW5jb2RpbmcgZGlzY3JpbWluYW50IGZvciBgY29tbWl0TG9nYCAoIzEzYy1CKTogYCdmdWxsJ2Ag4oCUIGV2ZXJ5IGBzZXRgXG4gICAqIGJ1bmRsZSBzdG9yZXMgdGhlIGZ1bGwgZmluYWwgdmFsdWUgKGhpc3RvcmljYWwpOyBgJ2RlbHRhJ2Ag4oCUIGJ1bmRsZXMgbWF5XG4gICAqIGNhcnJ5IGBhcHBlbmRgL2BkZWxldGVgIHRyYWNlIHZlcmJzIHdpdGggdmVyYi1xdWFsaWZpZWQgYG92ZXJ3cml0ZWBcbiAgICogcGF5bG9hZHMgKHRhaWxzKS4gT2ZmbGluZSB0b29saW5nIGtleXMgb24gdGhpcyBmaWVsZDsgYSBidW5kbGUgc3RyZWFtXG4gICAqIHdpdGhvdXQgY29udGV4dCByZW1haW5zIHNlbGYtZGVzY3JpYmluZyB2aWEgdGhlIHZlcmJzIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIC8qKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIGRpYWwgKCNQMSkgdGhlIHJ1biBleGVjdXRlZCB1bmRlciDigJQgdGhlXG4gICAqICBvZmZsaW5lLXRvb2xpbmcgZGlzY3JpbWluYW50IGZvciBgVHJhY2VFbnRyeS5yZWFkS2V5c2AgYXZhaWxhYmlsaXR5LiAqL1xuICB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGU7XG4gIC8qKlxuICAgKiBQZXItc3ViZmxvdyBleGVjdXRpb24gcmVzdWx0cywgRFVBTC1LRVlFRCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKTpcbiAgICogICAtIGJ5IHN1YmZsb3cgUEFUSCAoYHN1YmZsb3dJZGAsIGUuZy4gYCdzZi1wYXknYCkg4oaSIHRoZSBMQVNUIGl0ZXJhdGlvbiAoYmFjay1jb21wYXQpOyB0aGlzXG4gICAqICAgICBpcyB3aGF0IGBnZXRTdWJ0cmVlU25hcHNob3QocGF0aClgIGFuZCBgbGlzdFN1YmZsb3dQYXRocygpYCByZXNvbHZlLlxuICAgKiAgIC0gYnkgcGVyLWV4ZWN1dGlvbiBtb3VudCBgcnVudGltZVN0YWdlSWRgIChlLmcuIGAnc2YtcGF5IzUnYCkg4oaSIFRIQVQgaXRlcmF0aW9uJ3MgcmVzdWx0LCBzb1xuICAgKiAgICAgYSBMT09QSU5HIHN1YmZsb3cgcmV0YWlucyBFVkVSWSBpdGVyYXRpb24gKG5vdCBqdXN0IHRoZSBsYXN0KS4gTG9vayB1cCBhIHNwZWNpZmljXG4gICAqICAgICBpdGVyYXRpb24gYXMgYHN1YmZsb3dSZXN1bHRzW25vZGUucnVudGltZVN0YWdlSWRdID8/IHN1YmZsb3dSZXN1bHRzW25vZGUuc3ViZmxvd0lkXWAuXG4gICAqIEJvdGgga2V5cyBwb2ludCBhdCB0aGUgc2FtZSBvYmplY3QgZm9yIGEgc2luZ2xlIG1vdW50OyBpdGVyYXRlIHdpdGggY2FyZSAoY291bnQgdmlhIHRoZVxuICAgKiBwYXRoIGtleXMg4oCUIHRob3NlIHdpdGhvdXQgYCcjJ2ApLiBUaGUgcGF1c2UgY2hlY2twb2ludCBjYXJyaWVzIG9ubHkgdGhlIHBhdGgga2V5cywgbGVhbi5cbiAgICpcbiAgICogVW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCBlYWNoIGVudHJ5J3MgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIGlzIHRoYXRcbiAgICogc3ViZmxvdydzIE9XTiByZWRhY3RlZCBtaXJyb3IgKDkuMjAuMCkg4oCUIHRoZSBmb2xkIG9mIGl0cyBzY3J1YmJlZCBgaGlzdG9yeWAg4oCUIHNlcnZlZCBhc1xuICAgKiBvbmUgc3Vic3RpdHV0ZWQgb2JqZWN0IHBlciBtb3VudCAoYm90aCBrZXlzIHN0aWxsIGFncmVlKSDigJQgdGhlIHdyYXBwZXIgaXMgZnJlc2ggcGVyXG4gICAqIGBnZXRTbmFwc2hvdGAgY2FsbCwgdGhlIGBnbG9iYWxDb250ZXh0YCBpbnNpZGUgaXQgaXMgdGhlIHN0YWJsZSBtaXJyb3I7IHBsYWluLCBpdCBpcyB0aGUgc3ViZmxvdydzXG4gICAqIGxpdmUgaGVhcC4gV2l0aG91dCBhIHBvbGljeSB0aGVyZSBpcyBubyBtaXJyb3IgYW5kIHRoZSB0d28gdmlld3MgYXJlIHRoZSBzYW1lIG9iamVjdHMuXG4gICAqL1xuICBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KCkuICovXG4gIHJlY29yZGVycz86IFJlY29yZGVyU25hcHNob3RbXTtcbiAgLyoqXG4gICAqIERlZmVycmVkLW9ic2VydmVyIGFjY291bnRpbmcgKFJGQy0wMDEgQmxvY2sgOSkg4oCUIHF1ZXVlIGRlcHRoLCBkcm9wcyxcbiAgICogZmx1c2gvYnVkZ2V0IGNvdW50ZXJzLCBwZXItbGlzdGVuZXIgdGltZSBhdHRyaWJ1dGlvbiwgYW5kIHRoZVxuICAgKiB0ZXJtaW5hbC1mbHVzaCBzdHJhbmRpbmcgY291bnQuIEFCU0VOVCB1bmxlc3MgYSByZWNvcmRlciB3YXMgYXR0YWNoZWRcbiAgICogd2l0aCBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBvbiB0aGlzIGV4ZWN1dG9yICh6ZXJvLWNvc3QgZGlzY2lwbGluZSkuXG4gICAqL1xuICBvYnNlcnZlclN0YXRzPzogT2JzZXJ2ZXJTdGF0cztcbn07XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25SdW50aW1lIHtcbiAgcHVibGljIGdsb2JhbFN0b3JlOiBTaGFyZWRNZW1vcnk7XG4gIC8qKlxuICAgKiBQYXJhbGxlbCByZWRhY3RlZCBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYC4gUG9wdWxhdGVkIGR1cmluZyB0cmF2ZXJzYWwgdmlhXG4gICAqIGBTdGFnZUNvbnRleHQuY29tbWl0KClgIHVzaW5nIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMuXG4gICAqIE9ubHkgZXhpc3RzIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvciAoYFJ1blBvbGljeS5taXJyb3JgIOKAlFxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgIHNldHMgaXQgd2hlbiBhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQpLlxuICAgKiBPdGhlcndpc2UgdW5kZWZpbmVkIGFuZCB6ZXJvIGNvc3QuXG4gICAqXG4gICAqIFJlYWQgdmlhIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAuXG4gICAqL1xuICBwdWJsaWMgcmVkYWN0ZWRTdG9yZT86IFNoYXJlZE1lbW9yeTtcbiAgcHVibGljIHJvb3RTdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGV4ZWN1dGlvbkhpc3Rvcnk6IEV2ZW50TG9nO1xuICAvKiogT3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSDigJQgc2V0IGJlZm9yZSByZXN1bWUgY2hhbmdlcyByb290U3RhZ2VDb250ZXh0LiAqL1xuICBwcml2YXRlIF9zbmFwc2hvdFJvb3Q/OiBTdGFnZUNvbnRleHQ7XG4gIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogdW5rbm93bjtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlczogdW5rbm93bjtcbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgKGBtZW1vcnkvcnVuUG9saWN5LnRzYCkg4oCUIGluc3RhbGxlZCBvbiB0aGUgcm9vdCBmcmFtZTtcbiAgICogIGl0cyBgY29tbWl0VmFsdWVzYCBhbmQgYHdyaXRlUHJvdmVuYW5jZWAgYXJlIHRoZSBzbmFwc2hvdCBkaXNjcmltaW5hbnRzLiAqL1xuICBwcml2YXRlIHBvbGljeTogUnVuUG9saWN5O1xuXG4gIC8qKiBNZW1vaXplZCBmcm96ZW4gZm9sZCBiYXNlIOKAlCBzZWUge0BsaW5rIFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGV9LiAqL1xuICBwcml2YXRlIF9mb2xkQmFzZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcG9saWN5IFRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgLCBGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGVcbiAgICogICByZWRhY3Rpb24gcnVsZSwgdGhlIG1pcnJvciBmbGFnLiBJbnN0YWxsZWQgb24gdGhlIHJvb3QgZnJhbWUgaGVyZSwgc29cbiAgICogICB0aGUgRklSU1QgY29tbWl0IChhIHN1YmZsb3cncyBzZWVkLCBgaGlzdG9yeVswXWApIGFscmVhZHkgcnVucyB1bmRlciBpdDtcbiAgICogICBldmVyeSBmcmFtZSBhZnRlciBpbmhlcml0cyB0aGUgc2FtZSByZWZlcmVuY2UuIERlZmF1bHQ6IGV2ZXJ5IGRpYWwgYXRcbiAgICogICBpdHMgZGVmYXVsdCwgbm8gcnVsZSwgbm8gbWlycm9yLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdE5hbWU6IHN0cmluZyxcbiAgICByb290SWQ6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbiAgICBpbml0aWFsU3RhdGU/OiB1bmtub3duLFxuICAgIHBvbGljeTogUnVuUG9saWN5ID0gREVGQVVMVF9SVU5fUE9MSUNZLFxuICApIHtcbiAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgdGhpcy5nbG9iYWxTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoZGVmYXVsdFZhbHVlcywgaW5pdGlhbFN0YXRlKTtcbiAgICAvLyBUaGUgZXZlbnQgbG9nJ3MgZm9sZCBiYXNlIG11c3QgYmUgdGhlIFNBTUUgc3RhdGUgdGhlIHN0b3JlIHN0YXJ0cyBmcm9tXG4gICAgLy8g4oCUIGBpbml0aWFsQ29udGV4dGAgbWVyZ2VkIHdpdGggYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgd2hpY2ggaXMgd2hhdFxuICAgIC8vIGBTaGFyZWRNZW1vcnlgIGNvbXB1dGVkIGFib3ZlLiBTZWVkaW5nIHRoZSBsb2cgZnJvbSBgaW5pdGlhbFN0YXRlYCBhbG9uZVxuICAgIC8vIGxlZnQgYGRlZmF1bHRWYWx1ZXNgIG91dCBvZiBldmVyeSByZXBsYXksIHNvIGEgZm9sZCBjb3VsZCBub3QgcmVwcm9kdWNlXG4gICAgLy8gdGhlIHN0YXRlIGEgc3RhZ2UgYWN0dWFsbHkgc2F3LiBgZ2V0U3RhdGUoKWAgaXMgdGhlIGxpdmUgY29udGV4dDsgdGhlXG4gICAgLy8gRXZlbnRMb2cgY29uc3RydWN0b3IgY2xvbmVzIGl0LCBzbyB0aGUgYmFzZSBzdGF5cyBkZXRhY2hlZC5cbiAgICB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkgPSBuZXcgRXZlbnRMb2codGhpcy5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJvb3RTdGFnZUNvbnRleHQgPSB0aGlzLm5ld1Jvb3Qocm9vdE5hbWUsIHJvb3RJZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBmcmVzaCByb290IGZyYW1lIGZvciB0aGlzIHJ1bnRpbWUg4oCUIGBnbG9iYWxTdG9yZWAsIGBleGVjdXRpb25IaXN0b3J5YCxcbiAgICogdGhlIHJ1bidzIHBvbGljeSBhbmQgKHdoZW4ga2VwdCkgdGhlIG1pcnJvci4gQWxzbyBob3cgYFN1YmZsb3dFeGVjdXRvcmBcbiAgICogcmVwbGFjZXMgYSBzdWJmbG93J3Mgc2VlZCBmcmFtZSB3aXRoIHRoZSBmcmFtZSBpdHMgZmlyc3Qgc3RhZ2UgcnVucyBvbi5cbiAgICovXG4gIG5ld1Jvb3QobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICBjb25zdCByb290ID0gbmV3IFN0YWdlQ29udGV4dCgnJywgbmFtZSwgaWQsIHRoaXMuZ2xvYmFsU3RvcmUsICcnLCB0aGlzLmV4ZWN1dGlvbkhpc3RvcnkpO1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeShyb290KTtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgb24gdGhlIENVUlJFTlQgcm9vdCBmcmFtZSDigJQgYSBzYW1lLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSwgd2hvc2UgY29udGludWF0aW9uIHJvb3QgKGBsZWFmLmNyZWF0ZU5leHRgKSBpcyBhZHZhbmNlZCBiZWZvcmVcbiAgICogdGhlIGV4ZWN1dG9yIGJ1aWxkcyB0aGlzIGxlZydzIHBvbGljeSAoYSBmcmVzaCBydWxlIHBlciBsZWcpLiBFdmVyeVxuICAgKiBkZXNjZW5kYW50IHRha2VzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGVyZS5cbiAgICovXG4gIHVzZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMuaW5zdGFsbFBvbGljeSh0aGlzLnJvb3RTdGFnZUNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kgb24gYHJvb3RgLCBhbmQgdGhlIG1pcnJvciBzdG9yZSB3aGVuIHRoZSBwb2xpY3kga2VlcHMgb25lLlxuICAgKiBUaGUgbWlycm9yIGlzIGEgU0VSVkVEIHN1cmZhY2UsIHNvIGl0cyBzZWVkIG11c3QgYWxyZWFkeSBiZSB0aGUgcG9saWN5J3NcbiAgICogdmlldyBvZiB0aGUgc3RhcnRpbmcgc3RhdGU6IGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgYGluaXRpYWxDb250ZXh0YFxuICAgKiAvIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAgKG9yLCBvbiBhIGNyb3NzLWV4ZWN1dG9yIHJlc3VtZSwgYnkgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBgc2hhcmVkU3RhdGVgKSBhbmQgaXMgbmV2ZXIgcmUtd3JpdHRlbiB3b3VsZCBvdGhlcndpc2Ugc2l0XG4gICAqIGluIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgaW4gcGxhaW50ZXh0IOKAlCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgKiB3aXRoIHRoZSBMT0cncyBwbGFjZWhvbGRlciwgdGhlIHNhbWUgc3RyaW5nIHRoZSByZWRhY3RlZCBwYXRjaGVzIGNhcnJ5LlxuICAgKiBDcmVhdGVkIG9uY2UgcGVyIHJ1bnRpbWUgKGEgc3ViZmxvdydzIHJ1bnRpbWUga2VlcHMgaXRzIG93bjsgaXRzIHNlZWQgaXNcbiAgICogZW1wdHkg4oCUIHRoZSBpbnB1dCBhcnJpdmVzIGFzIGEgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFBvbGljeShyb290OiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICByb290LnVzZVBvbGljeSh0aGlzLnBvbGljeSk7XG4gICAgaWYgKCF0aGlzLnBvbGljeS5taXJyb3IpIHJldHVybjtcbiAgICBpZiAoIXRoaXMucmVkYWN0ZWRTdG9yZSkge1xuICAgICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICAgIHRoaXMucmVkYWN0ZWRTdG9yZSA9IG5ldyBTaGFyZWRNZW1vcnkoXG4gICAgICAgIHJ1bGUgPyBydWxlLnJldGFpblN0YXRlKHRoaXMuX2RlZmF1bHRWYWx1ZXMsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9kZWZhdWx0VmFsdWVzLFxuICAgICAgICBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZSh0aGlzLl9pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiB0aGlzLl9pbml0aWFsU3RhdGUsXG4gICAgICApO1xuICAgIH1cbiAgICByb290LnVzZVJlZGFjdGVkTWlycm9yKHRoaXMucmVkYWN0ZWRTdG9yZSk7XG4gIH1cblxuICAvKiogUHJlc2VydmUgdGhlIGN1cnJlbnQgcm9vdFN0YWdlQ29udGV4dCBmb3Igc25hcHNob3RzIGJlZm9yZSBjaGFuZ2luZyBpdCBmb3IgcmVzdW1lLiAqL1xuICBwcmVzZXJ2ZVNuYXBzaG90Um9vdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3NuYXBzaG90Um9vdCkge1xuICAgICAgdGhpcy5fc25hcHNob3RSb290ID0gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnJvemVuLCBkZXRhY2hlZCBmb2xkIGJhc2Ugc2VydmVkIGFzIHtAbGluayBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlfS5cbiAgICogQ29tcHV0ZWQgb25jZSAodGhlIGJhc2UgbmV2ZXIgY2hhbmdlcyBhZnRlciBjb25zdHJ1Y3Rpb24pIGFuZCBzaGFyZWQg4oCUXG4gICAqIHNhZmUgYmVjYXVzZSBpdCBpcyBkZWVwbHkgZnJvemVuLCBzbyBubyBob2xkZXIgY2FuIG11dGF0ZSBpdCBvciByZWFjaCB0aGVcbiAgICogZW5naW5lIHRocm91Z2ggaXQ7IGEgYmFzZSBob2xkaW5nIGEgRGF0ZSwgTWFwLCBidWZmZXIg4oCmICh3aGF0IGZyZWV6aW5nXG4gICAqIGNhbm5vdCBzZWFsKSBpcyBzZXJ2ZWQgYnkgdGhlIHB1YmxpYyBzbmFwc2hvdCBhcyBhIGNvcHkgb2YgaXRzIG9wZW4gcGF0aHNcbiAgICogKGBydW5uZXIvc25hcHNob3QudHMgwrcgc2VydmVkU25hcHNob3RgLCBgY2FwdHVyZS9mcmVlemUudHMgwrcgc2VydmVSZWNvcmRgLFxuICAgKiA5LjQ0LjIpLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRGb2xkQmFzZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLl9mb2xkQmFzZSkge1xuICAgICAgY29uc3QgYmFzZSA9IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5nZXRJbml0aWFsU3RhdGUoKTtcbiAgICAgIHRoaXMuX2ZvbGRCYXNlID0gZnJlZXplUmVjb3JkKGJhc2UgJiYgdHlwZW9mIGJhc2UgPT09ICdvYmplY3QnID8gYmFzZSA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvbGRCYXNlO1xuICB9XG5cbiAgZ2V0UGlwZWxpbmVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICByZXR1cm4gc3RhdGUucGlwZWxpbmVzID8gT2JqZWN0LmtleXMoc3RhdGUucGlwZWxpbmVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IFtdO1xuICB9XG5cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yb290U3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIHJldHVybnMgYHNoYXJlZFN0YXRlYCBmcm9tIHRoZVxuICAgKiAgIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgb25lIHdhcyBlbmFibGVkKS4gVGhpcyBpcyB0aGUgc2FmZSB2aWV3XG4gICAqICAgZm9yIHNoYXJpbmcgdHJhY2VzIGV4dGVybmFsbHkg4oCUIHBhc3RlIGludG8gYSB2aWV3ZXIsIHNoaXAgdG8gc3VwcG9ydCxcbiAgICogICBldGMuIFdoZW4gdGhlIG1pcnJvciB3YXMgbmV2ZXIgZW5hYmxlZCwgZmFsbHMgYmFjayB0byByYXcgYGdsb2JhbFN0b3JlYFxuICAgKiAgIGFuZCBhIGRldi1tb2RlIHdhcm5pbmcgaXMgZW1pdHRlZCAoc2lsZW50IGluIHByb2R1Y3Rpb24pLlxuICAgKlxuICAgKiAgIERlZmF1bHQgYGZhbHNlYCBwcmVzZXJ2ZXMgdGhlIHJ1bnRpbWUgdmlldyDigJQgbmVjZXNzYXJ5IGZvciBwYXVzZSAvXG4gICAqICAgcmVzdW1lIChyZXN1bXB0aW9uIG11c3QgcmVwbGF5IGFnYWluc3QgdGhlIHJlYWwgdmFsdWVzLCBub3RcbiAgICogICAnW1JFREFDVEVEXScpLlxuICAgKlxuICAgKiBPdGhlciBmaWVsZHMgKGBleGVjdXRpb25UcmVlYCwgYGNvbW1pdExvZ2ApIGFyZSB0aGUgc2FtZSBlaXRoZXIgd2F5IOKAlFxuICAgKiB0aGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUsIGFuZCB0aGUgZXhlY3V0aW9uXG4gICAqIHRyZWUgb25seSBjYXJyaWVzIHN0cnVjdHVyYWwgbWV0YWRhdGEuXG4gICAqXG4gICAqIGBpbml0aWFsU3RhdGVgICh0aGUgZm9sZCBiYXNlKSBpcyBPTUlUVEVEIHVuZGVyIGByZWRhY3Q6IHRydWVgLiBJdCBpcyB0aGVcbiAgICogcnVuJ3MgcmF3IHByZS1ydW4gc2VlZCDigJQgYGluaXRpYWxDb250ZXh0YCBtZXJnZWQgd2l0aFxuICAgKiBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgIOKAlCBhbmQgaXQgbmV2ZXIgcGFzc2VkIHRocm91Z2ggYSByZWRhY3Rpb25cbiAgICogcG9saWN5OiB0aGUgcG9saWN5IHNjcnVicyBXUklURVMgYXQgdGhlIHNjb3BlIGZhY2FkZSwgYW5kIHRoZSBiYXNlIHdhc1xuICAgKiBuZXZlciB3cml0dGVuIGJ5IGEgc3RhZ2UuIFNlcnZpbmcgaXQgb24gdGhlIHJlZGFjdGVkIHN1cmZhY2Ugd291bGQgaGFuZFxuICAgKiBiYWNrIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBhIHNlZWRlZCBzZWNyZXQgdGhhdCBhIGxhdGVyIGNvbW1pdCBoYWRcbiAgICogc2NydWJiZWQuIEEgY29uc3VtZXIgZm9sZGluZyB3aXRob3V0IGl0IGdldHMgYGJhc2lzOiAnbG9nLW9ubHknYCBmcm9tXG4gICAqIGBzdGF0ZUF0YCwgd2hpY2ggaXMgdGhlIGhvbmVzdCBzaWduYWwgdGhhdCB0aGUgYmFzZSBkaWQgbm90IHRyYXZlbCB3aXRoXG4gICAqIHRoaXMgbG9nIOKAlCBhIHBhcnRpYWwgYW5zd2VyIHRoYXQgc2F5cyBpdCBpcyBwYXJ0aWFsLCBuZXZlciBhIHNpbGVudCBvbmUuXG4gICAqXG4gICAqIFJldHVybnMgYE9taXQ8UnVudGltZVNuYXBzaG90LCAncnVuSWQnPmA6IHRoZSBydW50aW1lIGlzIHRoZSBtZW1vcnlcbiAgICogY29udGFpbmVyIGFuZCBkb2Vzbid0IGtub3cgd2hpY2ggcnVuIGl0IHNlcnZlcyDigJQgYHJ1bklkYCBpcyBwZXItcnVuXG4gICAqIGV4ZWN1dG9yIHN0YXRlLCBzdGFtcGVkIGJ5IGBGbG93Y2hhcnRUcmF2ZXJzZXIuZ2V0U25hcHNob3QoKWAgKHdoaWNoXG4gICAqIG93bnMgdGhlIHJ1bidzIGlkIGFuZCBhbHJlYWR5IHN0YW1wcyBpdCBvbiBldmVyeSBldmVudCkuIFN1YmZsb3dzJ1xuICAgKiBuZXN0ZWQgcnVudGltZXMgZGVsaWJlcmF0ZWx5IGhhdmUgTk8gcnVuSWQgb2YgdGhlaXIgb3duIChhIHN1YmZsb3cgaXNcbiAgICogcGFydCBvZiB0aGUgcGFyZW50J3MgbG9naWNhbCBydW4pLlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+IHtcbiAgICBjb25zdCBzbmFwc2hvdFJvb3QgPSB0aGlzLl9zbmFwc2hvdFJvb3QgPz8gdGhpcy5yb290U3RhZ2VDb250ZXh0O1xuICAgIGNvbnN0IHVzZVJlZGFjdGVkID0gb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlICYmIHRoaXMucmVkYWN0ZWRTdG9yZSAhPT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBzaGFyZWRTdGF0ZTogdXNlUmVkYWN0ZWQgPyB0aGlzLnJlZGFjdGVkU3RvcmUhLmdldFN0YXRlKCkgOiB0aGlzLmdsb2JhbFN0b3JlLmdldFN0YXRlKCksXG4gICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdFJvb3QuZ2V0U25hcHNob3QoKSxcbiAgICAgIC8vIFJFREFDVElPTjogdGhlIGZvbGQgYmFzZSBpcyB0aGUgcmF3IHByZS1ydW4gc2VlZCBhbmQgbm8gcG9saWN5IGV2ZXJcbiAgICAgIC8vIHRvdWNoZWQgaXQgKHBvbGljaWVzIHNjcnViIHdyaXRlczsgbm90aGluZyB3cm90ZSB0aGUgYmFzZSkuIE9taXQgaXRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGxlYWsgaXQg4oCUIGBzdGF0ZUF0YCBkZWdyYWRlcyB0byBgYmFzaXM6ICdsb2ctb25seSdgLlxuICAgICAgLi4uKHVzZVJlZGFjdGVkID8ge30gOiB7IGluaXRpYWxTdGF0ZTogdGhpcy5nZXRGb2xkQmFzZSgpIH0pLFxuICAgICAgLy8gREVUQUNIRUQ6IHRoZSBlbmdpbmUga2VlcHMgaXRzIGxpdmUgRXZlbnRMb2c7IHRoZSBzbmFwc2hvdCBnZXRzIGFcbiAgICAgIC8vIGZyb3plbiBhcnJheSBvZiBpdHMgb3duIChgcmVjb3JkZWQoKWAgYnVpbGRzIGEgbmV3IG9uZSkuIFNlcnZpbmcgdGhlXG4gICAgICAvLyBpbnRlcm5hbCBhcnJheSBhbGlhc2VkIGl0LCBzbyBhIHNuYXBzaG90IHRha2VuIG1pZC1ydW4ga2VwdCBncm93aW5nXG4gICAgICAvLyB1bmRlciBpdHMgaG9sZGVyIGFuZCBhIGNvbnN1bWVyIGNvdWxkIHNwbGljZSB0aGUgZW5naW5lJ3Mgb3duIGhpc3RvcnkuXG4gICAgICAvLyBUaGUgYnVuZGxlcyBpbiBpdCBhcmUgdGhlIGxvZydzIG93biwgZnJvemVuIGF0IGBFdmVudExvZyDCtyByZWNvcmRgXG4gICAgICAvLyAoRjMpLiBUaGUgcHVibGljIHNuYXBzaG90IHNlcnZlcyB0aGVtIChgcnVubmVyL3NuYXBzaG90LnRzIMK3XG4gICAgICAvLyBzZXJ2ZWRTbmFwc2hvdGAsIDkuNDQuMik7IHRoaXMgb25lIGlzIGFsc28gdGhlIGVuZ2luZSdzIG93biDigJQgYVxuICAgICAgLy8gc3ViZmxvdyBtb3VudCB0YWtlcyBpdCBvbmNlIHBlciBtb3VudCDigJQgc28gdGhlIHJ1biBwYXRoIHNlcnZlcyBub3RoaW5nLlxuICAgICAgY29tbWl0TG9nOiBPYmplY3QuZnJlZXplKHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5yZWNvcmRlZCgpKSBhcyBDb21taXRCdW5kbGVbXSxcbiAgICAgIC4uLih0aGlzLmV4ZWN1dGlvbkhpc3RvcnkuYWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHRoaXMuZXhlY3V0aW9uSGlzdG9yeS5hZGRyZXNzIH0pLFxuICAgICAgY29tbWl0VmFsdWVzOiB0aGlzLnBvbGljeS5jb21taXRWYWx1ZXMsXG4gICAgICB3cml0ZVByb3ZlbmFuY2U6IHRoaXMucG9saWN5LndyaXRlUHJvdmVuYW5jZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -5,7 +5,7 @@
5
5
  * served subflow results (each subflow's own mirror under `redact: true`), one
6
6
  * recorder row per recorder id, and the deferred tier's accounting.
7
7
  */
8
- import { deepFreeze } from '../capture/freeze.js';
8
+ import { deepFreeze, serveRecord } from '../capture/freeze.js';
9
9
  import { isDevMode } from '../devMode.js';
10
10
  import { servedSubflowResults } from '../engine/handlers/servedSubflowResults.js';
11
11
  import { copyBundle } from '../recorder/snapshot.js';
@@ -15,7 +15,7 @@ import { copyBundle } from '../recorder/snapshot.js';
15
15
  * instead of corrupting engine state.
16
16
  */
17
17
  export function servedSnapshot(traverser, observers, options) {
18
- const snapshot = traverser.getSnapshot(options);
18
+ const snapshot = servedLog(traverser.getSnapshot(options));
19
19
  if (isDevMode()) {
20
20
  // Dev-mode mutation guard: freeze a CLONE, never the live engine
21
21
  // state — `snapshot.sharedState` IS SharedMemory's current generation,
@@ -47,6 +47,20 @@ export function servedSnapshot(traverser, observers, options) {
47
47
  }
48
48
  return snapshot;
49
49
  }
50
+ /**
51
+ * The commit log and the fold base as a reader may hold them (9.44.2): a record freezing sealed whole
52
+ * is served as itself; one holding what freezing cannot seal — a Date, a Map, a buffer … — as a copy
53
+ * of its open paths, the reader's own (`capture/freeze.ts · serveRecord`). Here, at the public door:
54
+ * the engine's own snapshot of a log (a subflow mount's) is not served, so the run pays nothing.
55
+ */
56
+ function servedLog(snapshot) {
57
+ const { initialState } = snapshot;
58
+ return {
59
+ ...snapshot,
60
+ commitLog: Object.freeze(snapshot.commitLog.map(serveRecord)),
61
+ ...(initialState === undefined ? {} : { initialState: serveRecord(initialState) }),
62
+ };
63
+ }
50
64
  /**
51
65
  * Collect `toSnapshot()` bundles from every attached recorder — ONE entry
52
66
  * per recorder id, across all channels and both delivery tiers.
@@ -90,4 +104,4 @@ export function collectRecorderSnapshots(observers) {
90
104
  }
91
105
  return out;
92
106
  }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUdsRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFLckQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLFNBQXVDLEVBQ3ZDLFNBQXVCLEVBQ3ZCLE9BQThCO0lBRTlCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFvQixDQUFDO0lBQ25FLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztRQUNoQixpRUFBaUU7UUFDakUsdUVBQXVFO1FBQ3ZFLHlEQUF5RDtRQUN6RCwyQkFBMkI7UUFDM0Isa0VBQWtFO1FBQ2xFLDhEQUE4RDtRQUM5RCxtRUFBbUU7UUFDbkUsc0VBQXNFO1FBQ3RFLDJEQUEyRDtRQUMzRCxRQUFRLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2hELElBQUksU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2Qix3RUFBd0U7UUFDeEUsd0RBQXdEO1FBQ3hELDRFQUE0RTtRQUM1RSxRQUFRLENBQUMsY0FBYyxHQUFHLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxNQUFNLGlCQUFpQixHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7SUFDekMsQ0FBQztJQUVELHFFQUFxRTtJQUNyRSxnRUFBZ0U7SUFDaEUsMENBQTBDO0lBQzFDLElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNCLFFBQVEsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsU0FBdUI7SUFDOUQsTUFBTSxHQUFHLEdBQXVCLEVBQUUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBK0IsRUFBUSxFQUFFO1FBQ3hELElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU87UUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDO0lBQ0YsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsY0FBYztRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxhQUFhO1FBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNCLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRTtZQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUU7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc25hcHNob3Qg4oCUIHdoYXQgYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KClgIHNlcnZlcyAoRjkpLlxuICpcbiAqIFRoZSB0cmF2ZXJzZXIncyBydW50aW1lIHNuYXBzaG90LCBwbHVzIHdoYXQgb25seSB0aGUgZXhlY3V0b3Iga25vd3M6IHRoZVxuICogc2VydmVkIHN1YmZsb3cgcmVzdWx0cyAoZWFjaCBzdWJmbG93J3Mgb3duIG1pcnJvciB1bmRlciBgcmVkYWN0OiB0cnVlYCksIG9uZVxuICogcmVjb3JkZXIgcm93IHBlciByZWNvcmRlciBpZCwgYW5kIHRoZSBkZWZlcnJlZCB0aWVyJ3MgYWNjb3VudGluZy5cbiAqL1xuXG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSAnLi4vY2FwdHVyZS9mcmVlemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRTdWJmbG93UmVzdWx0cyB9IGZyb20gJy4uL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQgeyBjb3B5QnVuZGxlIH0gZnJvbSAnLi4vcmVjb3JkZXIvc25hcHNob3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5PYnNlcnZlcnMgfSBmcm9tICcuL2F0dGFjaC5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyU25hcHNob3QsIFJ1bnRpbWVTbmFwc2hvdCB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5cbi8qKlxuICogVGhlIHNlcnZlZCBzbmFwc2hvdC4gYHNoYXJlZFN0YXRlYCBpcyB0aGUgTElWRSB2aWV3IGluIHByb2R1Y3Rpb24gKHplcm9cbiAqIGNvcHkpOyBpbiBkZXYgbW9kZSBpdCBpcyBhIGRlZXAtZnJvemVuIENMT05FLCBzbyBhIGNvbnN1bWVyIG11dGF0aW9uIHRocm93c1xuICogaW5zdGVhZCBvZiBjb3JydXB0aW5nIGVuZ2luZSBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZlZFNuYXBzaG90KFxuICB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxhbnksIGFueT4sXG4gIG9ic2VydmVyczogUnVuT2JzZXJ2ZXJzLFxuICBvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0sXG4pOiBSdW50aW1lU25hcHNob3Qge1xuICBjb25zdCBzbmFwc2hvdCA9IHRyYXZlcnNlci5nZXRTbmFwc2hvdChvcHRpb25zKSBhcyBSdW50aW1lU25hcHNob3Q7XG4gIGlmIChpc0Rldk1vZGUoKSkge1xuICAgIC8vIERldi1tb2RlIG11dGF0aW9uIGd1YXJkOiBmcmVlemUgYSBDTE9ORSwgbmV2ZXIgdGhlIGxpdmUgZW5naW5lXG4gICAgLy8gc3RhdGUg4oCUIGBzbmFwc2hvdC5zaGFyZWRTdGF0ZWAgSVMgU2hhcmVkTWVtb3J5J3MgY3VycmVudCBnZW5lcmF0aW9uLFxuICAgIC8vIHdob3NlIHVuY2hhbmdlZCBzdWJ0cmVlcyBldmVyeSBsYXRlciBnZW5lcmF0aW9uIHNoYXJlc1xuICAgIC8vIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgIC8vIFByb2R1Y3Rpb24gc3RheXMgemVyby1jb3B5OyBjbG9uZS1hbHdheXMgaXMgYSBtZWFzdXJlZCBkZWNpc2lvblxuICAgIC8vIGRlZmVycmVkIHVudGlsIHRoZSBiZW5jaCBzYXlzIGl0J3MgYWZmb3JkYWJsZSAoQkFDS0xPRyAjOCkuXG4gICAgLy8gTk9URTogZGVlcEZyZWV6ZSAoY2FwdHVyZS9mcmVlemUudHMg4oCUIHRoZSBvbmUgd2FsaykgY2Fubm90IHJlYWNoXG4gICAgLy8gTWFwL1NldCBJTlRFUk5BTFMgKGBtYXAuc2V0KClgIG9uIHRoZSBmcm96ZW4gY2xvbmUgd29uJ3QgdGhyb3cpIGFuZFxuICAgIC8vIHNraXBzIHR5cGVkIGFycmF5cy4gVGhlIENMT05FIHN0aWxsIGlzb2xhdGVzIHRoZSBlbmdpbmUuXG4gICAgc25hcHNob3Quc2hhcmVkU3RhdGUgPSBkZWVwRnJlZXplKHN0cnVjdHVyZWRDbG9uZShzbmFwc2hvdC5zaGFyZWRTdGF0ZSkpO1xuICB9XG4gIGNvbnN0IHNmUmVzdWx0cyA9IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICBpZiAoc2ZSZXN1bHRzLnNpemUgPiAwKSB7XG4gICAgLy8gVW5kZXIgYHJlZGFjdDogdHJ1ZWAgZWFjaCBzdWJmbG93J3MgYGdsb2JhbENvbnRleHRgIGlzIGl0cyBvd24gbWlycm9yXG4gICAgLy8gKDkuMjAuMCkg4oCUIHNlcnZlZCwgbmV2ZXIgd3JpdHRlbiBpbnRvIHRoZSByZWNvcmQgKHNlZVxuICAgIC8vIGVuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cykuIFBsYWluOiB0aGUgcmVjb3JkcyBhcyB0aGV5IGFyZS5cbiAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IHNlcnZlZFN1YmZsb3dSZXN1bHRzKHNmUmVzdWx0cywgb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZGVyU25hcHNob3RzID0gY29sbGVjdFJlY29yZGVyU25hcHNob3RzKG9ic2VydmVycyk7XG4gIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gIH1cblxuICAvLyBSRkMtMDAxIEJsb2NrIDk6IHRoZSBkZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIHN1cmZhY2UuIFByZXNlbnRcbiAgLy8gT05MWSB3aGVuIGEgZGVmZXJyZWQgb2JzZXJ2ZXIgd2FzIGF0dGFjaGVkIG9uIHRoaXMgZXhlY3V0b3Ig4oCUXG4gIC8vIHplcm8tY29zdCBkaXNjaXBsaW5lIGZvciBldmVyeW9uZSBlbHNlLlxuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMgPSBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmdldFN0YXRzKCk7XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG59XG5cbi8qKlxuICogQ29sbGVjdCBgdG9TbmFwc2hvdCgpYCBidW5kbGVzIGZyb20gZXZlcnkgYXR0YWNoZWQgcmVjb3JkZXIg4oCUIE9ORSBlbnRyeVxuICogcGVyIHJlY29yZGVyIGlkLCBhY3Jvc3MgYWxsIGNoYW5uZWxzIGFuZCBib3RoIGRlbGl2ZXJ5IHRpZXJzLlxuICpcbiAqIFRoZSBkZWR1cGUgaXMgbG9hZC1iZWFyaW5nLCBub3QgdGlkaW5lc3MuIEEgcmVjb3JkZXIgdGhhdCBpbXBsZW1lbnRzIGFcbiAqIHNoYXJlZC1uYW1lIGhvb2sgKGBvbkVycm9yYCAvIGBvblBhdXNlYCAvIGBvblJlc3VtZWAg4oCUIGRlY2xhcmVkIG9uIEJPVEhcbiAqIHRoZSBzY29wZSBhbmQgZmxvdyBpbnRlcmZhY2VzKSBpcyBsZWdpdGltYXRlbHkgcmVnaXN0ZXJlZCBvbiBCT1RIIGlubGluZVxuICogbGlzdHMgYnkgYGF0dGFjaENvbWJpbmVkUmVjb3JkZXJgLCBhbmQgdGhhdCBpcyBieSBkZXNpZ246IGVhY2ggY2hhbm5lbFxuICogY2FsbHMgdGhlIGhvb2sgd2l0aCBpdHMgb3duIHBheWxvYWQgdmFyaWFudC4gYE1ldHJpY1JlY29yZGVyLm9uUGF1c2VgIGlzXG4gKiB0aGUgZXZlcnlkYXkgY2FzZS4gV2Fsa2luZyB0aGUgbGlzdHMgd2l0aG91dCBhIHNoYXJlZCBgc2VlbmAgc2V0IHR1cm5lZFxuICogdGhhdCBpbnRvIGEgRFVQTElDQVRFRCBzbmFwc2hvdCBlbnRyeSAoc2FtZSBpZCB0d2ljZSksIHdoaWNoIGJyZWFrcyBldmVyeVxuICogY29uc3VtZXIgdGhhdCBpbmRleGVzIGBzbmFwc2hvdC5yZWNvcmRlcnNgIGJ5IGlkLlxuICpcbiAqIE9yZGVyaW5nIGlzIHNjb3BlIGxpc3Qg4oaSIGZsb3cgbGlzdCDihpIgZGVmZXJyZWQgdGllciwgYW5kIHRoZSBGSVJTVCBidW5kbGVcbiAqIGZvciBhbiBpZCB3aW5zLiBBIHJlY29yZGVyIHdpdGggbm8gYHRvU25hcHNob3RgIG5ldmVyIGNsYWltcyBhbiBpZCwgc28gaXRcbiAqIGNhbm5vdCBzaGFkb3cgYSBzYW1lLWlkIHJlY29yZGVyIHRoYXQgZG9lcyBoYXZlIG9uZS5cbiAqXG4gKiBUaGUgcm93IGlzIFJFQlVJTFQgZmllbGQgYnkgZmllbGQgYnkgdGhlIG9uZSBjb3BpZXIgKGByZWNvcmRlci9zbmFwc2hvdC50c1xuICogwrcgY29weUJ1bmRsZWAsIHNoYXJlZCB3aXRoIGBDb21wb3NpdGVSZWNvcmRlcmApIHJhdGhlciB0aGFuIHNwcmVhZCwgc28gYVxuICogcmVjb3JkZXIgY2Fubm90IHNtdWdnbGUgYW4gYGlkYCBvZiBpdHMgb3duIGNob29zaW5nIGludG8gdGhlIHNuYXBzaG90ICh0aGVcbiAqIGlkIGlzIHRoZSBleGVjdXRvcidzLCBhbmQgY29uc3VtZXJzIGluZGV4IGJ5IGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RSZWNvcmRlclNuYXBzaG90cyhvYnNlcnZlcnM6IFJ1bk9ic2VydmVycyk6IFJlY29yZGVyU25hcHNob3RbXSB7XG4gIGNvbnN0IG91dDogUmVjb3JkZXJTbmFwc2hvdFtdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgY29sbGVjdCA9IChyOiBTY29wZVJlY29yZGVyIHwgRmxvd1JlY29yZGVyKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyLnRvU25hcHNob3QgfHwgc2Vlbi5oYXMoci5pZCkpIHJldHVybjtcbiAgICBzZWVuLmFkZChyLmlkKTtcbiAgICBvdXQucHVzaChjb3B5QnVuZGxlKHIuaWQsIHIudG9TbmFwc2hvdCgpKSk7XG4gIH07XG4gIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuc2NvcGVSZWNvcmRlcnMpIGNvbGxlY3Qocik7XG4gIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuZmxvd1JlY29yZGVycykgY29sbGVjdChyKTtcbiAgaWYgKG9ic2VydmVycy5kZWZlcnJlZFRpZXIpIHtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5zY29wZUxpc3RSZWNvcmRlcnMoKSkgY29sbGVjdChyKTtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5mbG93TGlzdFJlY29yZGVycygpKSBjb2xsZWN0KHIpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9zbmFwc2hvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFJbEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBS3JEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixTQUF1QyxFQUN2QyxTQUF1QixFQUN2QixPQUE4QjtJQUU5QixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQW9CLENBQUMsQ0FBQztJQUM5RSxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7UUFDaEIsaUVBQWlFO1FBQ2pFLHVFQUF1RTtRQUN2RSx5REFBeUQ7UUFDekQsMkJBQTJCO1FBQzNCLGtFQUFrRTtRQUNsRSw4REFBOEQ7UUFDOUQsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSwyREFBMkQ7UUFDM0QsUUFBUSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNoRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsd0VBQXdFO1FBQ3hFLHdEQUF3RDtRQUN4RCw0RUFBNEU7UUFDNUUsUUFBUSxDQUFDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxRQUFRLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDO0lBQ3pDLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsZ0VBQWdFO0lBQ2hFLDBDQUEwQztJQUMxQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixRQUFRLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsU0FBUyxDQUFDLFFBQXlCO0lBQzFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxRQUFRLENBQUM7SUFDbEMsT0FBTztRQUNMLEdBQUcsUUFBUTtRQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFtQjtRQUMvRSxHQUFHLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztLQUNuRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsU0FBdUI7SUFDOUQsTUFBTSxHQUFHLEdBQXVCLEVBQUUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBK0IsRUFBUSxFQUFFO1FBQ3hELElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU87UUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDO0lBQ0YsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsY0FBYztRQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxhQUFhO1FBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNCLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRTtZQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUU7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc25hcHNob3Qg4oCUIHdoYXQgYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KClgIHNlcnZlcyAoRjkpLlxuICpcbiAqIFRoZSB0cmF2ZXJzZXIncyBydW50aW1lIHNuYXBzaG90LCBwbHVzIHdoYXQgb25seSB0aGUgZXhlY3V0b3Iga25vd3M6IHRoZVxuICogc2VydmVkIHN1YmZsb3cgcmVzdWx0cyAoZWFjaCBzdWJmbG93J3Mgb3duIG1pcnJvciB1bmRlciBgcmVkYWN0OiB0cnVlYCksIG9uZVxuICogcmVjb3JkZXIgcm93IHBlciByZWNvcmRlciBpZCwgYW5kIHRoZSBkZWZlcnJlZCB0aWVyJ3MgYWNjb3VudGluZy5cbiAqL1xuXG5pbXBvcnQgeyBkZWVwRnJlZXplLCBzZXJ2ZVJlY29yZCB9IGZyb20gJy4uL2NhcHR1cmUvZnJlZXplLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgc2VydmVkU3ViZmxvd1Jlc3VsdHMgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvc2VydmVkU3ViZmxvd1Jlc3VsdHMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi4vZW5naW5lL3RyYXZlcnNhbC9GbG93Y2hhcnRUcmF2ZXJzZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgY29weUJ1bmRsZSB9IGZyb20gJy4uL3JlY29yZGVyL3NuYXBzaG90LmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuT2JzZXJ2ZXJzIH0gZnJvbSAnLi9hdHRhY2guanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRlclNuYXBzaG90LCBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgc25hcHNob3QuIGBzaGFyZWRTdGF0ZWAgaXMgdGhlIExJVkUgdmlldyBpbiBwcm9kdWN0aW9uICh6ZXJvXG4gKiBjb3B5KTsgaW4gZGV2IG1vZGUgaXQgaXMgYSBkZWVwLWZyb3plbiBDTE9ORSwgc28gYSBjb25zdW1lciBtdXRhdGlvbiB0aHJvd3NcbiAqIGluc3RlYWQgb2YgY29ycnVwdGluZyBlbmdpbmUgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTbmFwc2hvdChcbiAgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8YW55LCBhbnk+LFxuICBvYnNlcnZlcnM6IFJ1bk9ic2VydmVycyxcbiAgb3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9LFxuKTogUnVudGltZVNuYXBzaG90IHtcbiAgY29uc3Qgc25hcHNob3QgPSBzZXJ2ZWRMb2codHJhdmVyc2VyLmdldFNuYXBzaG90KG9wdGlvbnMpIGFzIFJ1bnRpbWVTbmFwc2hvdCk7XG4gIGlmIChpc0Rldk1vZGUoKSkge1xuICAgIC8vIERldi1tb2RlIG11dGF0aW9uIGd1YXJkOiBmcmVlemUgYSBDTE9ORSwgbmV2ZXIgdGhlIGxpdmUgZW5naW5lXG4gICAgLy8gc3RhdGUg4oCUIGBzbmFwc2hvdC5zaGFyZWRTdGF0ZWAgSVMgU2hhcmVkTWVtb3J5J3MgY3VycmVudCBnZW5lcmF0aW9uLFxuICAgIC8vIHdob3NlIHVuY2hhbmdlZCBzdWJ0cmVlcyBldmVyeSBsYXRlciBnZW5lcmF0aW9uIHNoYXJlc1xuICAgIC8vIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgIC8vIFByb2R1Y3Rpb24gc3RheXMgemVyby1jb3B5OyBjbG9uZS1hbHdheXMgaXMgYSBtZWFzdXJlZCBkZWNpc2lvblxuICAgIC8vIGRlZmVycmVkIHVudGlsIHRoZSBiZW5jaCBzYXlzIGl0J3MgYWZmb3JkYWJsZSAoQkFDS0xPRyAjOCkuXG4gICAgLy8gTk9URTogZGVlcEZyZWV6ZSAoY2FwdHVyZS9mcmVlemUudHMg4oCUIHRoZSBvbmUgd2FsaykgY2Fubm90IHJlYWNoXG4gICAgLy8gTWFwL1NldCBJTlRFUk5BTFMgKGBtYXAuc2V0KClgIG9uIHRoZSBmcm96ZW4gY2xvbmUgd29uJ3QgdGhyb3cpIGFuZFxuICAgIC8vIHNraXBzIHR5cGVkIGFycmF5cy4gVGhlIENMT05FIHN0aWxsIGlzb2xhdGVzIHRoZSBlbmdpbmUuXG4gICAgc25hcHNob3Quc2hhcmVkU3RhdGUgPSBkZWVwRnJlZXplKHN0cnVjdHVyZWRDbG9uZShzbmFwc2hvdC5zaGFyZWRTdGF0ZSkpO1xuICB9XG4gIGNvbnN0IHNmUmVzdWx0cyA9IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICBpZiAoc2ZSZXN1bHRzLnNpemUgPiAwKSB7XG4gICAgLy8gVW5kZXIgYHJlZGFjdDogdHJ1ZWAgZWFjaCBzdWJmbG93J3MgYGdsb2JhbENvbnRleHRgIGlzIGl0cyBvd24gbWlycm9yXG4gICAgLy8gKDkuMjAuMCkg4oCUIHNlcnZlZCwgbmV2ZXIgd3JpdHRlbiBpbnRvIHRoZSByZWNvcmQgKHNlZVxuICAgIC8vIGVuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cykuIFBsYWluOiB0aGUgcmVjb3JkcyBhcyB0aGV5IGFyZS5cbiAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IHNlcnZlZFN1YmZsb3dSZXN1bHRzKHNmUmVzdWx0cywgb3B0aW9ucz8ucmVkYWN0ID09PSB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZGVyU25hcHNob3RzID0gY29sbGVjdFJlY29yZGVyU25hcHNob3RzKG9ic2VydmVycyk7XG4gIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gIH1cblxuICAvLyBSRkMtMDAxIEJsb2NrIDk6IHRoZSBkZWZlcnJlZC1vYnNlcnZlciBhY2NvdW50aW5nIHN1cmZhY2UuIFByZXNlbnRcbiAgLy8gT05MWSB3aGVuIGEgZGVmZXJyZWQgb2JzZXJ2ZXIgd2FzIGF0dGFjaGVkIG9uIHRoaXMgZXhlY3V0b3Ig4oCUXG4gIC8vIHplcm8tY29zdCBkaXNjaXBsaW5lIGZvciBldmVyeW9uZSBlbHNlLlxuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIHNuYXBzaG90Lm9ic2VydmVyU3RhdHMgPSBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmdldFN0YXRzKCk7XG4gIH1cblxuICByZXR1cm4gc25hcHNob3Q7XG59XG5cbi8qKlxuICogVGhlIGNvbW1pdCBsb2cgYW5kIHRoZSBmb2xkIGJhc2UgYXMgYSByZWFkZXIgbWF5IGhvbGQgdGhlbSAoOS40NC4yKTogYSByZWNvcmQgZnJlZXppbmcgc2VhbGVkIHdob2xlXG4gKiBpcyBzZXJ2ZWQgYXMgaXRzZWxmOyBvbmUgaG9sZGluZyB3aGF0IGZyZWV6aW5nIGNhbm5vdCBzZWFsIOKAlCBhIERhdGUsIGEgTWFwLCBhIGJ1ZmZlciDigKYg4oCUIGFzIGEgY29weVxuICogb2YgaXRzIG9wZW4gcGF0aHMsIHRoZSByZWFkZXIncyBvd24gKGBjYXB0dXJlL2ZyZWV6ZS50cyDCtyBzZXJ2ZVJlY29yZGApLiBIZXJlLCBhdCB0aGUgcHVibGljIGRvb3I6XG4gKiB0aGUgZW5naW5lJ3Mgb3duIHNuYXBzaG90IG9mIGEgbG9nIChhIHN1YmZsb3cgbW91bnQncykgaXMgbm90IHNlcnZlZCwgc28gdGhlIHJ1biBwYXlzIG5vdGhpbmcuXG4gKi9cbmZ1bmN0aW9uIHNlcnZlZExvZyhzbmFwc2hvdDogUnVudGltZVNuYXBzaG90KTogUnVudGltZVNuYXBzaG90IHtcbiAgY29uc3QgeyBpbml0aWFsU3RhdGUgfSA9IHNuYXBzaG90O1xuICByZXR1cm4ge1xuICAgIC4uLnNuYXBzaG90LFxuICAgIGNvbW1pdExvZzogT2JqZWN0LmZyZWV6ZShzbmFwc2hvdC5jb21taXRMb2cubWFwKHNlcnZlUmVjb3JkKSkgYXMgQ29tbWl0QnVuZGxlW10sXG4gICAgLi4uKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGluaXRpYWxTdGF0ZTogc2VydmVSZWNvcmQoaW5pdGlhbFN0YXRlKSB9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGB0b1NuYXBzaG90KClgIGJ1bmRsZXMgZnJvbSBldmVyeSBhdHRhY2hlZCByZWNvcmRlciDigJQgT05FIGVudHJ5XG4gKiBwZXIgcmVjb3JkZXIgaWQsIGFjcm9zcyBhbGwgY2hhbm5lbHMgYW5kIGJvdGggZGVsaXZlcnkgdGllcnMuXG4gKlxuICogVGhlIGRlZHVwZSBpcyBsb2FkLWJlYXJpbmcsIG5vdCB0aWRpbmVzcy4gQSByZWNvcmRlciB0aGF0IGltcGxlbWVudHMgYVxuICogc2hhcmVkLW5hbWUgaG9vayAoYG9uRXJyb3JgIC8gYG9uUGF1c2VgIC8gYG9uUmVzdW1lYCDigJQgZGVjbGFyZWQgb24gQk9USFxuICogdGhlIHNjb3BlIGFuZCBmbG93IGludGVyZmFjZXMpIGlzIGxlZ2l0aW1hdGVseSByZWdpc3RlcmVkIG9uIEJPVEggaW5saW5lXG4gKiBsaXN0cyBieSBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAsIGFuZCB0aGF0IGlzIGJ5IGRlc2lnbjogZWFjaCBjaGFubmVsXG4gKiBjYWxscyB0aGUgaG9vayB3aXRoIGl0cyBvd24gcGF5bG9hZCB2YXJpYW50LiBgTWV0cmljUmVjb3JkZXIub25QYXVzZWAgaXNcbiAqIHRoZSBldmVyeWRheSBjYXNlLiBXYWxraW5nIHRoZSBsaXN0cyB3aXRob3V0IGEgc2hhcmVkIGBzZWVuYCBzZXQgdHVybmVkXG4gKiB0aGF0IGludG8gYSBEVVBMSUNBVEVEIHNuYXBzaG90IGVudHJ5IChzYW1lIGlkIHR3aWNlKSwgd2hpY2ggYnJlYWtzIGV2ZXJ5XG4gKiBjb25zdW1lciB0aGF0IGluZGV4ZXMgYHNuYXBzaG90LnJlY29yZGVyc2AgYnkgaWQuXG4gKlxuICogT3JkZXJpbmcgaXMgc2NvcGUgbGlzdCDihpIgZmxvdyBsaXN0IOKGkiBkZWZlcnJlZCB0aWVyLCBhbmQgdGhlIEZJUlNUIGJ1bmRsZVxuICogZm9yIGFuIGlkIHdpbnMuIEEgcmVjb3JkZXIgd2l0aCBubyBgdG9TbmFwc2hvdGAgbmV2ZXIgY2xhaW1zIGFuIGlkLCBzbyBpdFxuICogY2Fubm90IHNoYWRvdyBhIHNhbWUtaWQgcmVjb3JkZXIgdGhhdCBkb2VzIGhhdmUgb25lLlxuICpcbiAqIFRoZSByb3cgaXMgUkVCVUlMVCBmaWVsZCBieSBmaWVsZCBieSB0aGUgb25lIGNvcGllciAoYHJlY29yZGVyL3NuYXBzaG90LnRzXG4gKiDCtyBjb3B5QnVuZGxlYCwgc2hhcmVkIHdpdGggYENvbXBvc2l0ZVJlY29yZGVyYCkgcmF0aGVyIHRoYW4gc3ByZWFkLCBzbyBhXG4gKiByZWNvcmRlciBjYW5ub3Qgc211Z2dsZSBhbiBgaWRgIG9mIGl0cyBvd24gY2hvb3NpbmcgaW50byB0aGUgc25hcHNob3QgKHRoZVxuICogaWQgaXMgdGhlIGV4ZWN1dG9yJ3MsIGFuZCBjb25zdW1lcnMgaW5kZXggYnkgaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlY29yZGVyU25hcHNob3RzKG9ic2VydmVyczogUnVuT2JzZXJ2ZXJzKTogUmVjb3JkZXJTbmFwc2hvdFtdIHtcbiAgY29uc3Qgb3V0OiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBjb2xsZWN0ID0gKHI6IFNjb3BlUmVjb3JkZXIgfCBGbG93UmVjb3JkZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoIXIudG9TbmFwc2hvdCB8fCBzZWVuLmhhcyhyLmlkKSkgcmV0dXJuO1xuICAgIHNlZW4uYWRkKHIuaWQpO1xuICAgIG91dC5wdXNoKGNvcHlCdW5kbGUoci5pZCwgci50b1NuYXBzaG90KCkpKTtcbiAgfTtcbiAgZm9yIChjb25zdCByIG9mIG9ic2VydmVycy5zY29wZVJlY29yZGVycykgY29sbGVjdChyKTtcbiAgZm9yIChjb25zdCByIG9mIG9ic2VydmVycy5mbG93UmVjb3JkZXJzKSBjb2xsZWN0KHIpO1xuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLnNjb3BlTGlzdFJlY29yZGVycygpKSBjb2xsZWN0KHIpO1xuICAgIGZvciAoY29uc3QgciBvZiBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmZsb3dMaXN0UmVjb3JkZXJzKCkpIGNvbGxlY3Qocik7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==