velocious 1.0.556 → 1.0.558

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 (67) hide show
  1. package/README.md +16 -2
  2. package/build/background-jobs/forked-runner-child.js +20 -2
  3. package/build/background-jobs/main.js +35 -12
  4. package/build/background-jobs/pooled-runner-child.js +20 -2
  5. package/build/background-jobs/runner-graceful-shutdown.js +73 -0
  6. package/build/background-jobs/worker.js +53 -28
  7. package/build/configuration.js +77 -12
  8. package/build/database/advisory-lock-runner.js +12 -3
  9. package/build/database/record/index.js +12 -0
  10. package/build/frontend-models/base.js +192 -41
  11. package/build/http-client/websocket-client.js +48 -0
  12. package/build/src/background-jobs/forked-runner-child.js +20 -3
  13. package/build/src/background-jobs/main.d.ts +14 -1
  14. package/build/src/background-jobs/main.d.ts.map +1 -1
  15. package/build/src/background-jobs/main.js +37 -14
  16. package/build/src/background-jobs/pooled-runner-child.js +19 -3
  17. package/build/src/background-jobs/runner-graceful-shutdown.d.ts +49 -0
  18. package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -0
  19. package/build/src/background-jobs/runner-graceful-shutdown.js +70 -0
  20. package/build/src/background-jobs/worker.d.ts +18 -1
  21. package/build/src/background-jobs/worker.d.ts.map +1 -1
  22. package/build/src/background-jobs/worker.js +55 -31
  23. package/build/src/configuration.d.ts +29 -0
  24. package/build/src/configuration.d.ts.map +1 -1
  25. package/build/src/configuration.js +71 -11
  26. package/build/src/database/advisory-lock-runner.d.ts.map +1 -1
  27. package/build/src/database/advisory-lock-runner.js +12 -4
  28. package/build/src/database/record/index.d.ts.map +1 -1
  29. package/build/src/database/record/index.js +9 -1
  30. package/build/src/frontend-models/base.d.ts +13 -4
  31. package/build/src/frontend-models/base.d.ts.map +1 -1
  32. package/build/src/frontend-models/base.js +173 -44
  33. package/build/src/http-client/websocket-client.d.ts +3 -0
  34. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  35. package/build/src/http-client/websocket-client.js +42 -1
  36. package/build/src/tenants/tenant.d.ts +20 -9
  37. package/build/src/tenants/tenant.d.ts.map +1 -1
  38. package/build/src/tenants/tenant.js +47 -12
  39. package/build/src/testing/factory/factory-registry.d.ts +22 -3
  40. package/build/src/testing/factory/factory-registry.d.ts.map +1 -1
  41. package/build/src/testing/factory/factory-registry.js +32 -9
  42. package/build/src/testing/factory/factory-runner.d.ts +16 -4
  43. package/build/src/testing/factory/factory-runner.d.ts.map +1 -1
  44. package/build/src/testing/factory/factory-runner.js +33 -10
  45. package/build/src/utils/shutdown-lifecycle.d.ts +12 -0
  46. package/build/src/utils/shutdown-lifecycle.d.ts.map +1 -0
  47. package/build/src/utils/shutdown-lifecycle.js +36 -0
  48. package/build/tenants/tenant.js +51 -11
  49. package/build/testing/factory/factory-registry.js +33 -8
  50. package/build/testing/factory/factory-runner.js +38 -12
  51. package/build/tsconfig.tsbuildinfo +1 -1
  52. package/build/utils/shutdown-lifecycle.js +41 -0
  53. package/package.json +5 -4
  54. package/src/background-jobs/forked-runner-child.js +20 -2
  55. package/src/background-jobs/main.js +35 -12
  56. package/src/background-jobs/pooled-runner-child.js +20 -2
  57. package/src/background-jobs/runner-graceful-shutdown.js +73 -0
  58. package/src/background-jobs/worker.js +53 -28
  59. package/src/configuration.js +77 -12
  60. package/src/database/advisory-lock-runner.js +12 -3
  61. package/src/database/record/index.js +12 -0
  62. package/src/frontend-models/base.js +192 -41
  63. package/src/http-client/websocket-client.js +48 -0
  64. package/src/tenants/tenant.js +51 -11
  65. package/src/testing/factory/factory-registry.js +33 -8
  66. package/src/testing/factory/factory-runner.js +38 -12
  67. package/src/utils/shutdown-lifecycle.js +41 -0
@@ -291,14 +291,23 @@ export default class FactoryRegistry {
291
291
  const { traits, overrides } = normalizeInvocationArgs(args);
292
292
  /** @type {Array<?>} */
293
293
  const results = [];
294
- for (let index = 0; index < count; index++) {
295
- results.push(await this._runFactory({ factoryName, traits, overrides, strategy }));
294
+ /** @type {import("./factory-runner.js").CompiledPlan | undefined} */
295
+ let planTemplate;
296
+ this._activeEvaluations += 1;
297
+ try {
298
+ for (let index = 0; index < count; index++) {
299
+ const invocation = await this._runFactoryInvocation({ factoryName, traits, overrides, strategy, planTemplate });
300
+ planTemplate = invocation.planTemplate;
301
+ results.push(invocation.result);
302
+ }
303
+ }
304
+ finally {
305
+ this._activeEvaluations -= 1;
296
306
  }
297
307
  return results;
298
308
  }
299
309
  /**
300
- * Compiles and runs a factory invocation under a strategy, tracking active
301
- * evaluations for the mutation guard.
310
+ * Compiles and runs a factory invocation under a strategy.
302
311
  * @param {object} args - Options.
303
312
  * @param {string} args.factoryName - Factory name.
304
313
  * @param {string[]} args.traits - Ordered traits.
@@ -306,16 +315,30 @@ export default class FactoryRegistry {
306
315
  * @param {"attributesFor" | "build" | "create"} args.strategy - Strategy name.
307
316
  * @returns {Promise<?>} - The strategy result.
308
317
  */
309
- async _runFactory({ factoryName, traits, overrides, strategy }) {
318
+ async _runFactory(args) {
319
+ return (await this._runFactoryInvocation(args)).result;
320
+ }
321
+ /**
322
+ * Runs one event-tracked invocation, optionally reusing declaration planning.
323
+ * @param {object} args - Options.
324
+ * @param {string} args.factoryName - Factory name.
325
+ * @param {string[]} args.traits - Ordered traits.
326
+ * @param {Record<string, ?>} args.overrides - Overrides.
327
+ * @param {"attributesFor" | "build" | "create"} args.strategy - Strategy name.
328
+ * @param {import("./factory-runner.js").CompiledPlan} [args.planTemplate] - Reusable declaration plan.
329
+ * @returns {Promise<{result: ?, planTemplate: import("./factory-runner.js").CompiledPlan}>} - Result and declaration plan.
330
+ */
331
+ async _runFactoryInvocation({ factoryName, traits, overrides, strategy, planTemplate }) {
310
332
  this._activeEvaluations += 1;
311
333
  const invocationId = this._events.nextInvocationId();
312
334
  const startedAt = Date.now();
313
335
  try {
314
336
  this._events.emit("start", { invocationId, factory: factoryName, strategy, traits });
315
- const plan = this._runner.compile(factoryName, traits, overrides);
316
- const result = await this._strategies[strategy].run({ registry: this, plan });
337
+ const compiledPlanTemplate = planTemplate || this._runner.compileTemplate(factoryName, traits);
338
+ const compiledPlan = this._runner.applyOverrides(compiledPlanTemplate, overrides);
339
+ const result = await this._strategies[strategy].run({ registry: this, plan: compiledPlan });
317
340
  this._events.emit("success", { invocationId, factory: factoryName, strategy, traits, durationMs: Date.now() - startedAt });
318
- return result;
341
+ return { result, planTemplate: compiledPlanTemplate };
319
342
  }
320
343
  catch (error) {
321
344
  this._events.emit("failure", { invocationId, factory: factoryName, strategy, traits, durationMs: Date.now() - startedAt, error });
@@ -435,4 +458,4 @@ export default class FactoryRegistry {
435
458
  }
436
459
  }
437
460
  }
438
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90ZXN0aW5nL2ZhY3RvcnkvZmFjdG9yeS1yZWdpc3RyeS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHdCQUF3QixFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQy9GLE9BQU8scUJBQXFCLE1BQU0sZ0NBQWdDLENBQUE7QUFDbEUsT0FBTyxhQUFhLE1BQU0sdUJBQXVCLENBQUE7QUFDakQsT0FBTyxjQUFjLE1BQU0sd0JBQXdCLENBQUE7QUFDbkQsT0FBTyxpQkFBaUIsTUFBTSx5QkFBeUIsQ0FBQTtBQUN2RCxPQUFPLG1CQUFtQixNQUFNLGFBQWEsQ0FBQTtBQUM3QyxPQUFPLGFBQWEsTUFBTSxhQUFhLENBQUE7QUFDdkMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBRTdDOzs7OztHQUtHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxJQUFJO0lBQ25DLHVCQUF1QjtJQUN2QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7SUFDakIsZ0NBQWdDO0lBQ2hDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFFeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbEIsQ0FBQzthQUFNLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0MsU0FBUyxHQUFHLEdBQUcsQ0FBQTtZQUNmLFlBQVks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aXRpb25FcnJvciwgUmVnaXN0cnlCdXN5RXJyb3IsIFVuZGVmaW5lZFNlcXVlbmNlRXJyb3J9IGZyb20gXCIuL2Vycm9ycy5qc1wiXG5pbXBvcnQgQXR0cmlidXRlc0ZvclN0cmF0ZWd5IGZyb20gXCIuL3N0cmF0ZWdpZXMvYXR0cmlidXRlcy1mb3IuanNcIlxuaW1wb3J0IEJ1aWxkU3RyYXRlZ3kgZnJvbSBcIi4vc3RyYXRlZ2llcy9idWlsZC5qc1wiXG5pbXBvcnQgQ3JlYXRlU3RyYXRlZ3kgZnJvbSBcIi4vc3RyYXRlZ2llcy9jcmVhdGUuanNcIlxuaW1wb3J0IERlZmluaXRpb25TZXNzaW9uIGZyb20gXCIuL2RlZmluaXRpb24tYnVpbGRlci5qc1wiXG5pbXBvcnQgRmFjdG9yeUV2ZW50RW1pdHRlciBmcm9tIFwiLi9ldmVudHMuanNcIlxuaW1wb3J0IEZhY3RvcnlMaW50ZXIgZnJvbSBcIi4vbGludGVyLmpzXCJcbmltcG9ydCBGYWN0b3J5UnVubmVyIGZyb20gXCIuL2ZhY3RvcnktcnVubmVyLmpzXCJcbmltcG9ydCB7aXNQbGFpbk9iamVjdH0gZnJvbSBcImlzLXBsYWluLW9iamVjdFwiXG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHN0cmF0ZWd5IGludm9jYXRpb24ncyB2YXJpYWRpYyB0YWlsIGludG8gb3JkZXJlZCB0cmFpdCBuYW1lcyBwbHVzXG4gKiBhIHNpbmdsZSBmaW5hbCBvdmVycmlkZXMgb2JqZWN0IChgc3RyYXRlZ3kobmFtZSwgLi4udHJhaXRzLCBvdmVycmlkZXM/KWApLlxuICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIEFyZ3VtZW50cyBhZnRlciB0aGUgZmFjdG9yeSBuYW1lIChhbmQgY291bnQgZm9yIGxpc3RzKS5cbiAqIEByZXR1cm5zIHt7dHJhaXRzOiBzdHJpbmdbXSwgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCA/Pn19IC0gTm9ybWFsaXplZCBpbnZvY2F0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVJbnZvY2F0aW9uQXJncyhhcmdzKSB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IHRyYWl0cyA9IFtdXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gIGxldCBvdmVycmlkZXMgPSB7fVxuICBsZXQgc2F3T3ZlcnJpZGVzID0gZmFsc2VcblxuICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIgJiYgIXNhd092ZXJyaWRlcykge1xuICAgICAgdHJhaXRzLnB1c2goYXJnKVxuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhcmcpICYmICFzYXdPdmVycmlkZXMpIHtcbiAgICAgIG92ZXJyaWRlcyA9IGFyZ1xuICAgICAgc2F3T3ZlcnJpZGVzID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoYXJnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgZmFjdG9yeSBpbnZvY2F0aW9uIGFyZ3VtZW50OiAke1N0cmluZyhhcmcpfS4gRXhwZWN0ZWQgdHJhaXQgbmFtZXMgdGhlbiBhIHNpbmdsZSBmaW5hbCBvdmVycmlkZXMgb2JqZWN0LmApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt0cmFpdHMsIG92ZXJyaWRlc31cbn1cblxuLyoqXG4gKiBPd25zIGFsbCBmYWN0b3JpZXMsIHRyYWl0cywgc2VxdWVuY2VzLCBjYWxsYmFja3MgYW5kIGNvbnN0cnVjdGlvbiBkZWZhdWx0cyBmb3JcbiAqIG9uZSBpc29sYXRlZCBzY29wZSwgYW5kIGV4cG9zZXMgdGhlIHN0cmF0ZWd5IGVudHJ5IHBvaW50cy4gUmVnaXN0cnkgbXV0YXRpb24gaXNcbiAqIHNldHVwLXRpbWUgb25seSBhbmQgaXMgcmVqZWN0ZWQgd2hpbGUgZXZhbHVhdGlvbnMgYXJlIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmFjdG9yeVJlZ2lzdHJ5IHtcbiAgLyoqIEJ1aWxkcyBhbiBlbXB0eSByZWdpc3RyeSB3aXRoIHRoZSBidWlsdC1pbiBzdHJhdGVnaWVzIGluc3RhbGxlZC4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0Pn0gLSBGYWN0b3JpZXMgYW5kIGFsaWFzZXMuICovXG4gICAgdGhpcy5fZmFjdG9yaWVzID0gbmV3IE1hcCgpXG5cbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHJhaXQtZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0Pn0gLSBHbG9iYWwgdHJhaXRzLiAqL1xuICAgIHRoaXMuX2dsb2JhbFRyYWl0cyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlcXVlbmNlLmpzXCIpLmRlZmF1bHQ+fSAtIEdsb2JhbCBzZXF1ZW5jZXMgYW5kIGFsaWFzZXMuICovXG4gICAgdGhpcy5fc2VxdWVuY2VzID0gbmV3IE1hcCgpXG5cbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VxdWVuY2UuanNcIikuZGVmYXVsdD4+fSAtIEZhY3Rvcnktc2NvcGVkIHNlcXVlbmNlcy4gKi9cbiAgICB0aGlzLl9mYWN0b3J5U2VxdWVuY2VzID0gbmV3IE1hcCgpXG5cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkRlY2xhcmF0aW9uW119IC0gUmVnaXN0cnktbGV2ZWwgZGVmYXVsdCBkZWNsYXJhdGlvbnMuICovXG4gICAgdGhpcy5fZ2xvYmFsRGVjbGFyYXRpb25zID0gW11cblxuICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAtIEluLWZsaWdodCBldmFsdWF0aW9uIGNvdW50IChtdXRhdGlvbiBndWFyZCkuICovXG4gICAgdGhpcy5fYWN0aXZlRXZhbHVhdGlvbnMgPSAwXG5cbiAgICAvKiogQHR5cGUge0ZhY3RvcnlSdW5uZXJ9IC0gUGxhbiBjb21waWxlci4gKi9cbiAgICB0aGlzLl9ydW5uZXIgPSBuZXcgRmFjdG9yeVJ1bm5lcih0aGlzKVxuXG4gICAgLyoqIEB0eXBlIHtGYWN0b3J5RXZlbnRFbWl0dGVyfSAtIERlYnVnL3BlcmZvcm1hbmNlIGV2ZW50IGVtaXR0ZXIuICovXG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEZhY3RvcnlFdmVudEVtaXR0ZXIoKVxuXG4gICAgLyoqIEB0eXBlIHt7YXR0cmlidXRlc0ZvcjogQXR0cmlidXRlc0ZvclN0cmF0ZWd5LCBidWlsZDogQnVpbGRTdHJhdGVneSwgY3JlYXRlOiBDcmVhdGVTdHJhdGVneX19IC0gSW5zdGFsbGVkIHN0cmF0ZWdpZXMuICovXG4gICAgdGhpcy5fc3RyYXRlZ2llcyA9IHtcbiAgICAgIGF0dHJpYnV0ZXNGb3I6IG5ldyBBdHRyaWJ1dGVzRm9yU3RyYXRlZ3koKSxcbiAgICAgIGJ1aWxkOiBuZXcgQnVpbGRTdHJhdGVneSgpLFxuICAgICAgY3JlYXRlOiBuZXcgQ3JlYXRlU3RyYXRlZ3koKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgZmFjdG9yaWVzL3RyYWl0cy9zZXF1ZW5jZXMvY2FsbGJhY2tzIHZpYSBhIGJ1aWxkZXIgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7KGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZH0gY2FsbGJhY2sgLSBUaGUgZGVmaW5pdGlvbiBjYWxsYmFjay5cbiAgICogQHJldHVybnMge3RoaXN9IC0gVGhpcyByZWdpc3RyeSAoZm9yIGNoYWluaW5nKS5cbiAgICovXG4gIGRlZmluZShjYWxsYmFjaykge1xuICAgIHRoaXMuX2Fzc2VydE5vdEV2YWx1YXRpbmcoXCJkZWZpbmVcIilcbiAgICBuZXcgRGVmaW5pdGlvblNlc3Npb24odGhpcykucnVuKGNhbGxiYWNrKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW9wZW5zIGV4aXN0aW5nIGZhY3RvcmllcyB0byBhcHBlbmQvb3ZlcnJpZGUgZGVjbGFyYXRpb25zLCByZWNvbXBpbGluZyBlYWNoXG4gICAqIGludG8gYSBmcmVzaCBpbW11dGFibGUgZGVmaW5pdGlvbi4gUmVqZWN0ZWQgd2hpbGUgZXZhbHVhdGlvbnMgYXJlIGFjdGl2ZS5cbiAgICogQHBhcmFtIHsoYnVpbGRlcjogb2JqZWN0KSA9PiB2b2lkfSBjYWxsYmFjayAtIFRoZSBtb2RpZnkgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHt0aGlzfSAtIFRoaXMgcmVnaXN0cnkgKGZvciBjaGFpbmluZykuXG4gICAqL1xuICBtb2RpZnkoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9hc3NlcnROb3RFdmFsdWF0aW5nKFwibW9kaWZ5XCIpXG4gICAgbmV3IERlZmluaXRpb25TZXNzaW9uKHRoaXMpLnJ1bk1vZGlmeShjYWxsYmFjaylcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogTGludHMgZmFjdG9yaWVzL3RyYWl0cywgYWdncmVnYXRpbmcgZXZlcnkgZmFpbHVyZS4gQ3JlYXRlLXN0cmF0ZWd5IGNhc2VzIHJvbGxcbiAgICogYmFjayB0aGVpciBkYXRhYmFzZSB3cml0ZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBMaW50IG9wdGlvbnMgKGZhY3RvcmllcywgdHJhaXRzLCBzdHJhdGVneSkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gYWxsIGNhc2VzIHBhc3M7IHJlamVjdHMgd2l0aCBhbiBhZ2dyZWdhdGUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYXN5bmMgbGludChvcHRpb25zKSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBGYWN0b3J5TGludGVyKHRoaXMpLmxpbnQob3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIGZhY3RvcnkgZGVidWcgZXZlbnRzIChgc3RhcnRgLCBgc3VjY2Vzc2AsIGBmYWlsdXJlYCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHtpbnZvY2F0aW9uSWQ6IHN0cmluZywgZmFjdG9yeTogc3RyaW5nLCBzdHJhdGVneTogc3RyaW5nLCB0cmFpdHM6IHN0cmluZ1tdLCBkdXJhdGlvbk1zPzogbnVtYmVyLCBlcnJvcj86ID99KSA9PiB2b2lkfSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlci5cbiAgICogQHJldHVybnMge3RoaXN9IC0gVGhpcyByZWdpc3RyeSAoZm9yIGNoYWluaW5nKS5cbiAgICovXG4gIG9uKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgdGhpcy5fZXZlbnRzLm9uKGV2ZW50LCBoYW5kbGVyKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgYSBwcmV2aW91c2x5LXJlZ2lzdGVyZWQgZXZlbnQgaGFuZGxlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgbmFtZS5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogPykgPT4gdm9pZH0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBUaGlzIHJlZ2lzdHJ5IChmb3IgY2hhaW5pbmcpLlxuICAgKi9cbiAgb2ZmKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgdGhpcy5fZXZlbnRzLm9mZihldmVudCwgaGFuZGxlcilcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYXR0cmlidXRlcyB3aXRob3V0IGNvbnN0cnVjdGluZyBhIG1vZGVsIG9yIGJ1aWxkaW5nIGFzc29jaWF0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZhY3RvcnlOYW1lIC0gRmFjdG9yeSBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXQgbmFtZXMgdGhlbiBhbiBvcHRpb25hbCBvdmVycmlkZXMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IC0gVGhlIHJlc29sdmVkIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBhc3luYyBhdHRyaWJ1dGVzRm9yKGZhY3RvcnlOYW1lLCAuLi5hcmdzKSB7XG4gICAgY29uc3Qge3RyYWl0cywgb3ZlcnJpZGVzfSA9IG5vcm1hbGl6ZUludm9jYXRpb25BcmdzKGFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcnVuRmFjdG9yeSh7ZmFjdG9yeU5hbWUsIHRyYWl0cywgb3ZlcnJpZGVzLCBzdHJhdGVneTogXCJhdHRyaWJ1dGVzRm9yXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiB1bnNhdmVkIHJlY29yZCBncmFwaC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZhY3RvcnlOYW1lIC0gRmFjdG9yeSBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXQgbmFtZXMgdGhlbiBhbiBvcHRpb25hbCBvdmVycmlkZXMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBUaGUgYnVpbHQgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgYnVpbGQoZmFjdG9yeU5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCB7dHJhaXRzLCBvdmVycmlkZXN9ID0gbm9ybWFsaXplSW52b2NhdGlvbkFyZ3MoYXJncylcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9ydW5GYWN0b3J5KHtmYWN0b3J5TmFtZSwgdHJhaXRzLCBvdmVycmlkZXMsIHN0cmF0ZWd5OiBcImJ1aWxkXCJ9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgcGVyc2lzdHMgYSByZWNvcmQgZ3JhcGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIFRyYWl0IG5hbWVzIHRoZW4gYW4gb3B0aW9uYWwgb3ZlcnJpZGVzIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gVGhlIHBlcnNpc3RlZCByZWNvcmQuXG4gICAqL1xuICBhc3luYyBjcmVhdGUoZmFjdG9yeU5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCB7dHJhaXRzLCBvdmVycmlkZXN9ID0gbm9ybWFsaXplSW52b2NhdGlvbkFyZ3MoYXJncylcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9ydW5GYWN0b3J5KHtmYWN0b3J5TmFtZSwgdHJhaXRzLCBvdmVycmlkZXMsIHN0cmF0ZWd5OiBcImNyZWF0ZVwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhdHRyaWJ1dGVzIGZvciBhIGxpc3Qgb2YgcmVjb3JkcyBzZXF1ZW50aWFsbHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gTnVtYmVyIG9mIGVudHJpZXMuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IGFyZ3MgLSBUcmFpdCBuYW1lcyB0aGVuIGFuIG9wdGlvbmFsIG92ZXJyaWRlcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsID8+Pj59IC0gVGhlIHJlc29sdmVkIGF0dHJpYnV0ZSBvYmplY3RzLlxuICAgKi9cbiAgYXN5bmMgYXR0cmlidXRlc0Zvckxpc3QoZmFjdG9yeU5hbWUsIGNvdW50LCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3J1bkxpc3QoXCJhdHRyaWJ1dGVzRm9yXCIsIGZhY3RvcnlOYW1lLCBjb3VudCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBsaXN0IG9mIHVuc2F2ZWQgcmVjb3JkcyBzZXF1ZW50aWFsbHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gTnVtYmVyIG9mIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IGFyZ3MgLSBUcmFpdCBuYW1lcyB0aGVuIGFuIG9wdGlvbmFsIG92ZXJyaWRlcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PD8+Pn0gLSBUaGUgYnVpbHQgcmVjb3Jkcy5cbiAgICovXG4gIGFzeW5jIGJ1aWxkTGlzdChmYWN0b3J5TmFtZSwgY291bnQsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcnVuTGlzdChcImJ1aWxkXCIsIGZhY3RvcnlOYW1lLCBjb3VudCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbGlzdCBvZiBwZXJzaXN0ZWQgcmVjb3JkcyBzZXF1ZW50aWFsbHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gTnVtYmVyIG9mIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IGFyZ3MgLSBUcmFpdCBuYW1lcyB0aGVuIGFuIG9wdGlvbmFsIG92ZXJyaWRlcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PD8+Pn0gLSBUaGUgcGVyc2lzdGVkIHJlY29yZHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVMaXN0KGZhY3RvcnlOYW1lLCBjb3VudCwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9ydW5MaXN0KFwiY3JlYXRlXCIsIGZhY3RvcnlOYW1lLCBjb3VudCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhdHRyaWJ1dGVzIGZvciBleGFjdGx5IHR3byByZWNvcmRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IGFyZ3MgLSBUcmFpdCBuYW1lcyB0aGVuIGFuIG9wdGlvbmFsIG92ZXJyaWRlcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsID8+Pj59IC0gVGhlIHR3byByZXNvbHZlZCBhdHRyaWJ1dGUgb2JqZWN0cy5cbiAgICovXG4gIGFzeW5jIGF0dHJpYnV0ZXNGb3JQYWlyKGZhY3RvcnlOYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3J1bkxpc3QoXCJhdHRyaWJ1dGVzRm9yXCIsIGZhY3RvcnlOYW1lLCAyLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBleGFjdGx5IHR3byB1bnNhdmVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIFRyYWl0IG5hbWVzIHRoZW4gYW4gb3B0aW9uYWwgb3ZlcnJpZGVzIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8Pz4+fSAtIFRoZSB0d28gYnVpbHQgcmVjb3Jkcy5cbiAgICovXG4gIGFzeW5jIGJ1aWxkUGFpcihmYWN0b3J5TmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9ydW5MaXN0KFwiYnVpbGRcIiwgZmFjdG9yeU5hbWUsIDIsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBleGFjdGx5IHR3byBwZXJzaXN0ZWQgcmVjb3Jkcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZhY3RvcnlOYW1lIC0gRmFjdG9yeSBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXQgbmFtZXMgdGhlbiBhbiBvcHRpb25hbCBvdmVycmlkZXMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTw/Pj59IC0gVGhlIHR3byBwZXJzaXN0ZWQgcmVjb3Jkcy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBhaXIoZmFjdG9yeU5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcnVuTGlzdChcImNyZWF0ZVwiLCBmYWN0b3J5TmFtZSwgMiwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBBZHZhbmNlcyBhIHNlcXVlbmNlIGFuZCByZXR1cm5zIGl0cyBmb3JtYXR0ZWQgdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXF1ZW5jZU5hbWUgLSBTZXF1ZW5jZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBUaGUgZm9ybWF0dGVkIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGUoc2VxdWVuY2VOYW1lKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2dlbmVyYXRlU2NvcGVkKHNlcXVlbmNlTmFtZSwgW10pXG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZXMgYSBzZXF1ZW5jZSBgY291bnRgIHRpbWVzIGFuZCByZXR1cm5zIHRoZSBmb3JtYXR0ZWQgdmFsdWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VxdWVuY2VOYW1lIC0gU2VxdWVuY2UgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gTnVtYmVyIG9mIHZhbHVlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8Pz4+fSAtIFRoZSBmb3JtYXR0ZWQgdmFsdWVzLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVMaXN0KHNlcXVlbmNlTmFtZSwgY291bnQpIHtcbiAgICAvKiogQHR5cGUge0FycmF5PD8+fSAqL1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHtcbiAgICAgIHZhbHVlcy5wdXNoKGF3YWl0IHRoaXMuX2dlbmVyYXRlU2NvcGVkKHNlcXVlbmNlTmFtZSwgW10pKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBuZXh0IHJhdyB2YWx1ZSBhIGdsb2JhbCBzZXF1ZW5jZSB3b3VsZCBhbGxvY2F0ZSB3aXRob3V0IGNvbnN1bWluZyBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcXVlbmNlTmFtZSAtIFNlcXVlbmNlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHVwY29taW5nIHJhdyB2YWx1ZS5cbiAgICovXG4gIHBlZWtTZXF1ZW5jZShzZXF1ZW5jZU5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZUdsb2JhbFNlcXVlbmNlKHNlcXVlbmNlTmFtZSkucGVlaygpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbmV4dCB2YWx1ZSBhIGdsb2JhbCBzZXF1ZW5jZSB3aWxsIGFsbG9jYXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VxdWVuY2VOYW1lIC0gU2VxdWVuY2UgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gTmV4dCByYXcgdmFsdWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0U2VxdWVuY2Uoc2VxdWVuY2VOYW1lLCB2YWx1ZSkge1xuICAgIHRoaXMuX2Fzc2VydE5vdEV2YWx1YXRpbmcoXCJzZXRTZXF1ZW5jZVwiKVxuICAgIHRoaXMuX3Jlc29sdmVHbG9iYWxTZXF1ZW5jZShzZXF1ZW5jZU5hbWUpLnNldCh2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXdpbmRzIGEgc2luZ2xlIGdsb2JhbCBzZXF1ZW5jZSB0byBpdHMgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcXVlbmNlTmFtZSAtIFNlcXVlbmNlIG5hbWUuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmV3aW5kU2VxdWVuY2Uoc2VxdWVuY2VOYW1lKSB7XG4gICAgdGhpcy5fYXNzZXJ0Tm90RXZhbHVhdGluZyhcInJld2luZFNlcXVlbmNlXCIpXG4gICAgdGhpcy5fcmVzb2x2ZUdsb2JhbFNlcXVlbmNlKHNlcXVlbmNlTmFtZSkucmV3aW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXdpbmRzIGV2ZXJ5IGdsb2JhbCBhbmQgZmFjdG9yeS1zY29wZWQgc2VxdWVuY2UgdG8gaXRzIGluaXRpYWwgdmFsdWUgd2hpbGVcbiAgICogbGVhdmluZyBhbGwgZGVmaW5pdGlvbnMgaW50YWN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJld2luZFNlcXVlbmNlcygpIHtcbiAgICB0aGlzLl9hc3NlcnROb3RFdmFsdWF0aW5nKFwicmV3aW5kU2VxdWVuY2VzXCIpXG5cbiAgICBmb3IgKGNvbnN0IHNlcXVlbmNlIG9mIG5ldyBTZXQodGhpcy5fc2VxdWVuY2VzLnZhbHVlcygpKSkgc2VxdWVuY2UucmV3aW5kKClcblxuICAgIGZvciAoY29uc3Qgc2NvcGUgb2YgdGhpcy5fZmFjdG9yeVNlcXVlbmNlcy52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiBuZXcgU2V0KHNjb3BlLnZhbHVlcygpKSkgc2VxdWVuY2UucmV3aW5kKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFsbCBkZWZpbml0aW9ucywgdHJhaXRzLCBzZXF1ZW5jZXMgYW5kIHJlZ2lzdHJ5IGRlZmF1bHRzLCByZXN0b3JpbmcgYW5cbiAgICogZW1wdHkgcmVnaXN0cnkgd2l0aCB0aGUgYnVpbHQtaW4gc3RyYXRlZ2llcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLl9hc3NlcnROb3RFdmFsdWF0aW5nKFwicmVzZXRcIilcbiAgICB0aGlzLl9mYWN0b3JpZXMuY2xlYXIoKVxuICAgIHRoaXMuX2dsb2JhbFRyYWl0cy5jbGVhcigpXG4gICAgdGhpcy5fc2VxdWVuY2VzLmNsZWFyKClcbiAgICB0aGlzLl9mYWN0b3J5U2VxdWVuY2VzLmNsZWFyKClcbiAgICB0aGlzLl9nbG9iYWxEZWNsYXJhdGlvbnMgPSBbXVxuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBGYWN0b3J5RXZlbnRFbWl0dGVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGBjb3VudGAgc2VxdWVudGlhbCBzdHJhdGVneSBpbnZvY2F0aW9ucy5cbiAgICogQHBhcmFtIHtcImF0dHJpYnV0ZXNGb3JcIiB8IFwiYnVpbGRcIiB8IFwiY3JlYXRlXCJ9IHN0cmF0ZWd5IC0gU3RyYXRlZ3kgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZhY3RvcnlOYW1lIC0gRmFjdG9yeSBuYW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgLSBOdW1iZXIgb2YgZW50cmllcy5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIFRyYWl0IG5hbWVzIHRoZW4gYW4gb3B0aW9uYWwgb3ZlcnJpZGVzIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8Pz4+fSAtIFRoZSByZXN1bHRzLlxuICAgKi9cbiAgYXN5bmMgX3J1bkxpc3Qoc3RyYXRlZ3ksIGZhY3RvcnlOYW1lLCBjb3VudCwgYXJncykge1xuICAgIGNvbnN0IHt0cmFpdHMsIG92ZXJyaWRlc30gPSBub3JtYWxpemVJbnZvY2F0aW9uQXJncyhhcmdzKVxuICAgIC8qKiBAdHlwZSB7QXJyYXk8Pz59ICovXG4gICAgY29uc3QgcmVzdWx0cyA9IFtdXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHtcbiAgICAgIHJlc3VsdHMucHVzaChhd2FpdCB0aGlzLl9ydW5GYWN0b3J5KHtmYWN0b3J5TmFtZSwgdHJhaXRzLCBvdmVycmlkZXMsIHN0cmF0ZWd5fSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlcyBhbmQgcnVucyBhIGZhY3RvcnkgaW52b2NhdGlvbiB1bmRlciBhIHN0cmF0ZWd5LCB0cmFja2luZyBhY3RpdmVcbiAgICogZXZhbHVhdGlvbnMgZm9yIHRoZSBtdXRhdGlvbiBndWFyZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5mYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy50cmFpdHMgLSBPcmRlcmVkIHRyYWl0cy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gYXJncy5vdmVycmlkZXMgLSBPdmVycmlkZXMuXG4gICAqIEBwYXJhbSB7XCJhdHRyaWJ1dGVzRm9yXCIgfCBcImJ1aWxkXCIgfCBcImNyZWF0ZVwifSBhcmdzLnN0cmF0ZWd5IC0gU3RyYXRlZ3kgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gVGhlIHN0cmF0ZWd5IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF9ydW5GYWN0b3J5KHtmYWN0b3J5TmFtZSwgdHJhaXRzLCBvdmVycmlkZXMsIHN0cmF0ZWd5fSkge1xuICAgIHRoaXMuX2FjdGl2ZUV2YWx1YXRpb25zICs9IDFcblxuICAgIGNvbnN0IGludm9jYXRpb25JZCA9IHRoaXMuX2V2ZW50cy5uZXh0SW52b2NhdGlvbklkKClcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fZXZlbnRzLmVtaXQoXCJzdGFydFwiLCB7aW52b2NhdGlvbklkLCBmYWN0b3J5OiBmYWN0b3J5TmFtZSwgc3RyYXRlZ3ksIHRyYWl0c30pXG5cbiAgICAgIGNvbnN0IHBsYW4gPSB0aGlzLl9ydW5uZXIuY29tcGlsZShmYWN0b3J5TmFtZSwgdHJhaXRzLCBvdmVycmlkZXMpXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9zdHJhdGVnaWVzW3N0cmF0ZWd5XS5ydW4oe3JlZ2lzdHJ5OiB0aGlzLCBwbGFufSlcblxuICAgICAgdGhpcy5fZXZlbnRzLmVtaXQoXCJzdWNjZXNzXCIsIHtpbnZvY2F0aW9uSWQsIGZhY3Rvcnk6IGZhY3RvcnlOYW1lLCBzdHJhdGVneSwgdHJhaXRzLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0fSlcblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9ldmVudHMuZW1pdChcImZhaWx1cmVcIiwge2ludm9jYXRpb25JZCwgZmFjdG9yeTogZmFjdG9yeU5hbWUsIHN0cmF0ZWd5LCB0cmFpdHMsIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsIGVycm9yfSlcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fYWN0aXZlRXZhbHVhdGlvbnMgLT0gMVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gaW1tdXRhYmxlIGZhY3RvcnkgZGVmaW5pdGlvbiBhbmQgaXRzIGFsaWFzZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gZGVmaW5pdGlvbiAtIENvbXBpbGVkIGZhY3RvcnkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlZ2lzdGVyRmFjdG9yeURlZmluaXRpb24oZGVmaW5pdGlvbikge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBbZGVmaW5pdGlvbi5uYW1lLCAuLi5kZWZpbml0aW9uLmFsaWFzZXNdKSB7XG4gICAgICBpZiAodGhpcy5fZmFjdG9yaWVzLmhhcyhuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRHVwbGljYXRlRGVmaW5pdGlvbkVycm9yKGBGYWN0b3J5IFwiJHtuYW1lfVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFtkZWZpbml0aW9uLm5hbWUsIC4uLmRlZmluaXRpb24uYWxpYXNlc10pIHtcbiAgICAgIHRoaXMuX2ZhY3Rvcmllcy5zZXQobmFtZSwgZGVmaW5pdGlvbilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYW4gZXhpc3RpbmcgZmFjdG9yeSBkZWZpbml0aW9uIChhbmQgaXRzIGFsaWFzZXMpIHdpdGggYSByZWNvbXBpbGVkXG4gICAqIG9uZS4gVXNlZCBieSBgbW9kaWZ5YDsgbm8gZHVwbGljYXRlIGNoZWNrIGJlY2F1c2UgaXQgaW50ZW50aW9uYWxseSBvdmVyd3JpdGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IGRlZmluaXRpb24gLSBSZWNvbXBpbGVkIGZhY3RvcnkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlcGxhY2VGYWN0b3J5RGVmaW5pdGlvbihkZWZpbml0aW9uKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFtkZWZpbml0aW9uLm5hbWUsIC4uLmRlZmluaXRpb24uYWxpYXNlc10pIHtcbiAgICAgIHRoaXMuX2ZhY3Rvcmllcy5zZXQobmFtZSwgZGVmaW5pdGlvbilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgZ2xvYmFsIHRyYWl0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHJhaXQtZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0fSB0cmFpdCAtIENvbXBpbGVkIHRyYWl0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWdpc3Rlckdsb2JhbFRyYWl0KHRyYWl0KSB7XG4gICAgaWYgKHRoaXMuX2dsb2JhbFRyYWl0cy5oYXModHJhaXQubmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBEdXBsaWNhdGVEZWZpbml0aW9uRXJyb3IoYFRyYWl0IFwiJHt0cmFpdC5uYW1lfVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApXG4gICAgfVxuXG4gICAgdGhpcy5fZ2xvYmFsVHJhaXRzLnNldCh0cmFpdC5uYW1lLCB0cmFpdClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzZXF1ZW5jZSAoYW5kIGl0cyBhbGlhc2VzKSBlaXRoZXIgZ2xvYmFsbHkgb3IgdW5kZXIgYSBmYWN0b3J5IHNjb3BlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc2VxdWVuY2UuanNcIikuZGVmYXVsdH0gc2VxdWVuY2UgLSBTZXF1ZW5jZSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBmYWN0b3J5U2NvcGUgLSBGYWN0b3J5IG5hbWUgdG8gc2NvcGUgdW5kZXIsIG9yIG51bGwgZm9yIGdsb2JhbC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVnaXN0ZXJTZXF1ZW5jZShzZXF1ZW5jZSwgZmFjdG9yeVNjb3BlKSB7XG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlcXVlbmNlLmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIGxldCB0YXJnZXRcblxuICAgIGlmIChmYWN0b3J5U2NvcGUpIHtcbiAgICAgIGlmICghdGhpcy5fZmFjdG9yeVNlcXVlbmNlcy5oYXMoZmFjdG9yeVNjb3BlKSkgdGhpcy5fZmFjdG9yeVNlcXVlbmNlcy5zZXQoZmFjdG9yeVNjb3BlLCBuZXcgTWFwKCkpXG4gICAgICB0YXJnZXQgPSAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VxdWVuY2UuanNcIikuZGVmYXVsdD59ICovICh0aGlzLl9mYWN0b3J5U2VxdWVuY2VzLmdldChmYWN0b3J5U2NvcGUpKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLl9zZXF1ZW5jZXNcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW3NlcXVlbmNlLm5hbWUsIC4uLnNlcXVlbmNlLmFsaWFzZXNdKSB7XG4gICAgICBpZiAodGFyZ2V0LmhhcyhuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRHVwbGljYXRlRGVmaW5pdGlvbkVycm9yKGBTZXF1ZW5jZSBcIiR7bmFtZX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQke2ZhY3RvcnlTY29wZSA/IGAgZm9yIGZhY3RvcnkgXCIke2ZhY3RvcnlTY29wZX1cImAgOiBcIlwifWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFtzZXF1ZW5jZS5uYW1lLCAuLi5zZXF1ZW5jZS5hbGlhc2VzXSkge1xuICAgICAgdGFyZ2V0LnNldChuYW1lLCBzZXF1ZW5jZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIHJlZ2lzdHJ5LWxldmVsIGRlZmF1bHQgZGVjbGFyYXRpb24gKGNhbGxiYWNrcy9jb25zdHJ1Y3Rpb24gZGVmYXVsdHMpLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIERlY2xhcmF0aW9uIHRvIGFkZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfYWRkR2xvYmFsRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pIHtcbiAgICB0aGlzLl9nbG9iYWxEZWNsYXJhdGlvbnMucHVzaChkZWNsYXJhdGlvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHNlcXVlbmNlIG5hbWUgYWdhaW5zdCBhIGZhY3Rvcnkgc2NvcGUgY2hhaW4gKGNoaWxkIGZpcnN0KSB0aGVuIHRoZVxuICAgKiBnbG9iYWwgc2NvcGUgYW5kIGFkdmFuY2VzIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VxdWVuY2VOYW1lIC0gU2VxdWVuY2UgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gY2hhaW5OYW1lcyAtIEluaGVyaXRhbmNlIGNoYWluIG5hbWVzIChjaGlsZCBsYXN0KS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gVGhlIGZvcm1hdHRlZCB2YWx1ZS5cbiAgICovXG4gIGFzeW5jIF9nZW5lcmF0ZVNjb3BlZChzZXF1ZW5jZU5hbWUsIGNoYWluTmFtZXMpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IGNoYWluTmFtZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLl9mYWN0b3J5U2VxdWVuY2VzLmdldChjaGFpbk5hbWVzW2luZGV4XSlcblxuICAgICAgaWYgKHNjb3BlICYmIHNjb3BlLmhhcyhzZXF1ZW5jZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCAvKiogQHR5cGUge2ltcG9ydChcIi4vc2VxdWVuY2UuanNcIikuZGVmYXVsdH0gKi8gKHNjb3BlLmdldChzZXF1ZW5jZU5hbWUpKS5uZXh0KClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVzb2x2ZUdsb2JhbFNlcXVlbmNlKHNlcXVlbmNlTmFtZSkubmV4dCgpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBnbG9iYWwgc2VxdWVuY2UgYnkgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcXVlbmNlTmFtZSAtIFNlcXVlbmNlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3NlcXVlbmNlLmpzXCIpLmRlZmF1bHR9IC0gVGhlIHNlcXVlbmNlLlxuICAgKi9cbiAgX3Jlc29sdmVHbG9iYWxTZXF1ZW5jZShzZXF1ZW5jZU5hbWUpIHtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IHRoaXMuX3NlcXVlbmNlcy5nZXQoc2VxdWVuY2VOYW1lKVxuXG4gICAgaWYgKCFzZXF1ZW5jZSkge1xuICAgICAgdGhyb3cgbmV3IFVuZGVmaW5lZFNlcXVlbmNlRXJyb3IoYE5vIHNlcXVlbmNlIHJlZ2lzdGVyZWQgY2FsbGVkIFwiJHtzZXF1ZW5jZU5hbWV9XCJgKVxuICAgIH1cblxuICAgIHJldHVybiBzZXF1ZW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdHMgc2V0dXAtdGltZSBtdXRhdGlvbiB3aGlsZSBldmFsdWF0aW9ucyBhcmUgYWN0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUsIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfYXNzZXJ0Tm90RXZhbHVhdGluZyhvcGVyYXRpb24pIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlRXZhbHVhdGlvbnMgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmVnaXN0cnlCdXN5RXJyb3IoYENhbm5vdCAke29wZXJhdGlvbn0gd2hpbGUgZmFjdG9yeSBldmFsdWF0aW9ucyBhcmUgYWN0aXZlLiBSZWdpc3RyeSBtdXRhdGlvbiBpcyBzZXR1cC10aW1lIG9ubHkuYClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
461
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS1yZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90ZXN0aW5nL2ZhY3RvcnkvZmFjdG9yeS1yZWdpc3RyeS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLHdCQUF3QixFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQy9GLE9BQU8scUJBQXFCLE1BQU0sZ0NBQWdDLENBQUE7QUFDbEUsT0FBTyxhQUFhLE1BQU0sdUJBQXVCLENBQUE7QUFDakQsT0FBTyxjQUFjLE1BQU0sd0JBQXdCLENBQUE7QUFDbkQsT0FBTyxpQkFBaUIsTUFBTSx5QkFBeUIsQ0FBQTtBQUN2RCxPQUFPLG1CQUFtQixNQUFNLGFBQWEsQ0FBQTtBQUM3QyxPQUFPLGFBQWEsTUFBTSxhQUFhLENBQUE7QUFDdkMsT0FBTyxhQUFhLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBRTdDOzs7OztHQUtHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxJQUFJO0lBQ25DLHVCQUF1QjtJQUN2QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7SUFDakIsZ0NBQWdDO0lBQ2hDLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFFeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbEIsQ0FBQzthQUFNLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0MsU0FBUyxHQUFHLEdBQUcsQ0FBQTtZQUNmLFlBQVks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LElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUMvRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHNCQUFzQixDQUFDLFlBQVk7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFbEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLHNCQUFzQixDQUFDLGtDQUFrQyxZQUFZLEdBQUcsQ0FBQyxDQUFBO1FBQ3JGLENBQUM7UUFFRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG9CQUFvQixDQUFDLFNBQVM7UUFDNUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLFVBQVUsU0FBUyw4RUFBOEUsQ0FBQyxDQUFBO1FBQ2hJLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtEdXBsaWNhdGVEZWZpbml0aW9uRXJyb3IsIFJlZ2lzdHJ5QnVzeUVycm9yLCBVbmRlZmluZWRTZXF1ZW5jZUVycm9yfSBmcm9tIFwiLi9lcnJvcnMuanNcIlxuaW1wb3J0IEF0dHJpYnV0ZXNGb3JTdHJhdGVneSBmcm9tIFwiLi9zdHJhdGVnaWVzL2F0dHJpYnV0ZXMtZm9yLmpzXCJcbmltcG9ydCBCdWlsZFN0cmF0ZWd5IGZyb20gXCIuL3N0cmF0ZWdpZXMvYnVpbGQuanNcIlxuaW1wb3J0IENyZWF0ZVN0cmF0ZWd5IGZyb20gXCIuL3N0cmF0ZWdpZXMvY3JlYXRlLmpzXCJcbmltcG9ydCBEZWZpbml0aW9uU2Vzc2lvbiBmcm9tIFwiLi9kZWZpbml0aW9uLWJ1aWxkZXIuanNcIlxuaW1wb3J0IEZhY3RvcnlFdmVudEVtaXR0ZXIgZnJvbSBcIi4vZXZlbnRzLmpzXCJcbmltcG9ydCBGYWN0b3J5TGludGVyIGZyb20gXCIuL2xpbnRlci5qc1wiXG5pbXBvcnQgRmFjdG9yeVJ1bm5lciBmcm9tIFwiLi9mYWN0b3J5LXJ1bm5lci5qc1wiXG5pbXBvcnQge2lzUGxhaW5PYmplY3R9IGZyb20gXCJpcy1wbGFpbi1vYmplY3RcIlxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBzdHJhdGVneSBpbnZvY2F0aW9uJ3MgdmFyaWFkaWMgdGFpbCBpbnRvIG9yZGVyZWQgdHJhaXQgbmFtZXMgcGx1c1xuICogYSBzaW5nbGUgZmluYWwgb3ZlcnJpZGVzIG9iamVjdCAoYHN0cmF0ZWd5KG5hbWUsIC4uLnRyYWl0cywgb3ZlcnJpZGVzPylgKS5cbiAqIEBwYXJhbSB7QXJyYXk8Pz59IGFyZ3MgLSBBcmd1bWVudHMgYWZ0ZXIgdGhlIGZhY3RvcnkgbmFtZSAoYW5kIGNvdW50IGZvciBsaXN0cykuXG4gKiBAcmV0dXJucyB7e3RyYWl0czogc3RyaW5nW10sIG92ZXJyaWRlczogUmVjb3JkPHN0cmluZywgPz59fSAtIE5vcm1hbGl6ZWQgaW52b2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSW52b2NhdGlvbkFyZ3MoYXJncykge1xuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCB0cmFpdHMgPSBbXVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICBsZXQgb3ZlcnJpZGVzID0ge31cbiAgbGV0IHNhd092ZXJyaWRlcyA9IGZhbHNlXG5cbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGlmICh0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmICFzYXdPdmVycmlkZXMpIHtcbiAgICAgIHRyYWl0cy5wdXNoKGFyZylcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoYXJnKSAmJiAhc2F3T3ZlcnJpZGVzKSB7XG4gICAgICBvdmVycmlkZXMgPSBhcmdcbiAgICAgIHNhd092ZXJyaWRlcyA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGZhY3RvcnkgaW52b2NhdGlvbiBhcmd1bWVudDogJHtTdHJpbmcoYXJnKX0uIEV4cGVjdGVkIHRyYWl0IG5hbWVzIHRoZW4gYSBzaW5nbGUgZmluYWwgb3ZlcnJpZGVzIG9iamVjdC5gKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7dHJhaXRzLCBvdmVycmlkZXN9XG59XG5cbi8qKlxuICogT3ducyBhbGwgZmFjdG9yaWVzLCB0cmFpdHMsIHNlcXVlbmNlcywgY2FsbGJhY2tzIGFuZCBjb25zdHJ1Y3Rpb24gZGVmYXVsdHMgZm9yXG4gKiBvbmUgaXNvbGF0ZWQgc2NvcGUsIGFuZCBleHBvc2VzIHRoZSBzdHJhdGVneSBlbnRyeSBwb2ludHMuIFJlZ2lzdHJ5IG11dGF0aW9uIGlzXG4gKiBzZXR1cC10aW1lIG9ubHkgYW5kIGlzIHJlamVjdGVkIHdoaWxlIGV2YWx1YXRpb25zIGFyZSBhY3RpdmUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZhY3RvcnlSZWdpc3RyeSB7XG4gIC8qKiBCdWlsZHMgYW4gZW1wdHkgcmVnaXN0cnkgd2l0aCB0aGUgYnVpbHQtaW4gc3RyYXRlZ2llcyBpbnN0YWxsZWQuICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdD59IC0gRmFjdG9yaWVzIGFuZCBhbGlhc2VzLiAqL1xuICAgIHRoaXMuX2ZhY3RvcmllcyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3RyYWl0LWRlZmluaXRpb24uanNcIikuZGVmYXVsdD59IC0gR2xvYmFsIHRyYWl0cy4gKi9cbiAgICB0aGlzLl9nbG9iYWxUcmFpdHMgPSBuZXcgTWFwKClcblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZXF1ZW5jZS5qc1wiKS5kZWZhdWx0Pn0gLSBHbG9iYWwgc2VxdWVuY2VzIGFuZCBhbGlhc2VzLiAqL1xuICAgIHRoaXMuX3NlcXVlbmNlcyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlcXVlbmNlLmpzXCIpLmRlZmF1bHQ+Pn0gLSBGYWN0b3J5LXNjb3BlZCBzZXF1ZW5jZXMuICovXG4gICAgdGhpcy5fZmFjdG9yeVNlcXVlbmNlcyA9IG5ldyBNYXAoKVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbltdfSAtIFJlZ2lzdHJ5LWxldmVsIGRlZmF1bHQgZGVjbGFyYXRpb25zLiAqL1xuICAgIHRoaXMuX2dsb2JhbERlY2xhcmF0aW9ucyA9IFtdXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gLSBJbi1mbGlnaHQgZXZhbHVhdGlvbiBjb3VudCAobXV0YXRpb24gZ3VhcmQpLiAqL1xuICAgIHRoaXMuX2FjdGl2ZUV2YWx1YXRpb25zID0gMFxuXG4gICAgLyoqIEB0eXBlIHtGYWN0b3J5UnVubmVyfSAtIFBsYW4gY29tcGlsZXIuICovXG4gICAgdGhpcy5fcnVubmVyID0gbmV3IEZhY3RvcnlSdW5uZXIodGhpcylcblxuICAgIC8qKiBAdHlwZSB7RmFjdG9yeUV2ZW50RW1pdHRlcn0gLSBEZWJ1Zy9wZXJmb3JtYW5jZSBldmVudCBlbWl0dGVyLiAqL1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBGYWN0b3J5RXZlbnRFbWl0dGVyKClcblxuICAgIC8qKiBAdHlwZSB7e2F0dHJpYnV0ZXNGb3I6IEF0dHJpYnV0ZXNGb3JTdHJhdGVneSwgYnVpbGQ6IEJ1aWxkU3RyYXRlZ3ksIGNyZWF0ZTogQ3JlYXRlU3RyYXRlZ3l9fSAtIEluc3RhbGxlZCBzdHJhdGVnaWVzLiAqL1xuICAgIHRoaXMuX3N0cmF0ZWdpZXMgPSB7XG4gICAgICBhdHRyaWJ1dGVzRm9yOiBuZXcgQXR0cmlidXRlc0ZvclN0cmF0ZWd5KCksXG4gICAgICBidWlsZDogbmV3IEJ1aWxkU3RyYXRlZ3koKSxcbiAgICAgIGNyZWF0ZTogbmV3IENyZWF0ZVN0cmF0ZWd5KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGZhY3Rvcmllcy90cmFpdHMvc2VxdWVuY2VzL2NhbGxiYWNrcyB2aWEgYSBidWlsZGVyIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0geyhidWlsZGVyOiBvYmplY3QpID0+IHZvaWR9IGNhbGxiYWNrIC0gVGhlIGRlZmluaXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHt0aGlzfSAtIFRoaXMgcmVnaXN0cnkgKGZvciBjaGFpbmluZykuXG4gICAqL1xuICBkZWZpbmUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9hc3NlcnROb3RFdmFsdWF0aW5nKFwiZGVmaW5lXCIpXG4gICAgbmV3IERlZmluaXRpb25TZXNzaW9uKHRoaXMpLnJ1bihjYWxsYmFjaylcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogUmVvcGVucyBleGlzdGluZyBmYWN0b3JpZXMgdG8gYXBwZW5kL292ZXJyaWRlIGRlY2xhcmF0aW9ucywgcmVjb21waWxpbmcgZWFjaFxuICAgKiBpbnRvIGEgZnJlc2ggaW1tdXRhYmxlIGRlZmluaXRpb24uIFJlamVjdGVkIHdoaWxlIGV2YWx1YXRpb25zIGFyZSBhY3RpdmUuXG4gICAqIEBwYXJhbSB7KGJ1aWxkZXI6IG9iamVjdCkgPT4gdm9pZH0gY2FsbGJhY2sgLSBUaGUgbW9kaWZ5IGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7dGhpc30gLSBUaGlzIHJlZ2lzdHJ5IChmb3IgY2hhaW5pbmcpLlxuICAgKi9cbiAgbW9kaWZ5KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fYXNzZXJ0Tm90RXZhbHVhdGluZyhcIm1vZGlmeVwiKVxuICAgIG5ldyBEZWZpbml0aW9uU2Vzc2lvbih0aGlzKS5ydW5Nb2RpZnkoY2FsbGJhY2spXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIExpbnRzIGZhY3Rvcmllcy90cmFpdHMsIGFnZ3JlZ2F0aW5nIGV2ZXJ5IGZhaWx1cmUuIENyZWF0ZS1zdHJhdGVneSBjYXNlcyByb2xsXG4gICAqIGJhY2sgdGhlaXIgZGF0YWJhc2Ugd3JpdGVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gTGludCBvcHRpb25zIChmYWN0b3JpZXMsIHRyYWl0cywgc3RyYXRlZ3kpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGFsbCBjYXNlcyBwYXNzOyByZWplY3RzIHdpdGggYW4gYWdncmVnYXRlIG90aGVyd2lzZS5cbiAgICovXG4gIGFzeW5jIGxpbnQob3B0aW9ucykge1xuICAgIHJldHVybiBhd2FpdCBuZXcgRmFjdG9yeUxpbnRlcih0aGlzKS5saW50KG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBmYWN0b3J5IGRlYnVnIGV2ZW50cyAoYHN0YXJ0YCwgYHN1Y2Nlc3NgLCBgZmFpbHVyZWApLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBFdmVudCBuYW1lLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7aW52b2NhdGlvbklkOiBzdHJpbmcsIGZhY3Rvcnk6IHN0cmluZywgc3RyYXRlZ3k6IHN0cmluZywgdHJhaXRzOiBzdHJpbmdbXSwgZHVyYXRpb25Ncz86IG51bWJlciwgZXJyb3I/OiA/fSkgPT4gdm9pZH0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIuXG4gICAqIEByZXR1cm5zIHt0aGlzfSAtIFRoaXMgcmVnaXN0cnkgKGZvciBjaGFpbmluZykuXG4gICAqL1xuICBvbihldmVudCwgaGFuZGxlcikge1xuICAgIHRoaXMuX2V2ZW50cy5vbihldmVudCwgaGFuZGxlcilcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGEgcHJldmlvdXNseS1yZWdpc3RlcmVkIGV2ZW50IGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6ID8pID0+IHZvaWR9IGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge3RoaXN9IC0gVGhpcyByZWdpc3RyeSAoZm9yIGNoYWluaW5nKS5cbiAgICovXG4gIG9mZihldmVudCwgaGFuZGxlcikge1xuICAgIHRoaXMuX2V2ZW50cy5vZmYoZXZlbnQsIGhhbmRsZXIpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGF0dHJpYnV0ZXMgd2l0aG91dCBjb25zdHJ1Y3RpbmcgYSBtb2RlbCBvciBidWlsZGluZyBhc3NvY2lhdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIFRyYWl0IG5hbWVzIHRoZW4gYW4gb3B0aW9uYWwgb3ZlcnJpZGVzIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSAtIFRoZSByZXNvbHZlZCBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgYXN5bmMgYXR0cmlidXRlc0ZvcihmYWN0b3J5TmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHt0cmFpdHMsIG92ZXJyaWRlc30gPSBub3JtYWxpemVJbnZvY2F0aW9uQXJncyhhcmdzKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3J1bkZhY3Rvcnkoe2ZhY3RvcnlOYW1lLCB0cmFpdHMsIG92ZXJyaWRlcywgc3RyYXRlZ3k6IFwiYXR0cmlidXRlc0ZvclwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gdW5zYXZlZCByZWNvcmQgZ3JhcGguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIFRyYWl0IG5hbWVzIHRoZW4gYW4gb3B0aW9uYWwgb3ZlcnJpZGVzIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gVGhlIGJ1aWx0IHJlY29yZC5cbiAgICovXG4gIGFzeW5jIGJ1aWxkKGZhY3RvcnlOYW1lLCAuLi5hcmdzKSB7XG4gICAgY29uc3Qge3RyYWl0cywgb3ZlcnJpZGVzfSA9IG5vcm1hbGl6ZUludm9jYXRpb25BcmdzKGFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcnVuRmFjdG9yeSh7ZmFjdG9yeU5hbWUsIHRyYWl0cywgb3ZlcnJpZGVzLCBzdHJhdGVneTogXCJidWlsZFwifSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHBlcnNpc3RzIGEgcmVjb3JkIGdyYXBoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IGFyZ3MgLSBUcmFpdCBuYW1lcyB0aGVuIGFuIG9wdGlvbmFsIG92ZXJyaWRlcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIFRoZSBwZXJzaXN0ZWQgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGZhY3RvcnlOYW1lLCAuLi5hcmdzKSB7XG4gICAgY29uc3Qge3RyYWl0cywgb3ZlcnJpZGVzfSA9IG5vcm1hbGl6ZUludm9jYXRpb25BcmdzKGFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcnVuRmFjdG9yeSh7ZmFjdG9yeU5hbWUsIHRyYWl0cywgb3ZlcnJpZGVzLCBzdHJhdGVneTogXCJjcmVhdGVcIn0pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYXR0cmlidXRlcyBmb3IgYSBsaXN0IG9mIHJlY29yZHMgc2VxdWVudGlhbGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIE51bWJlciBvZiBlbnRyaWVzLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXQgbmFtZXMgdGhlbiBhbiBvcHRpb25hbCBvdmVycmlkZXMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj4+fSAtIFRoZSByZXNvbHZlZCBhdHRyaWJ1dGUgb2JqZWN0cy5cbiAgICovXG4gIGFzeW5jIGF0dHJpYnV0ZXNGb3JMaXN0KGZhY3RvcnlOYW1lLCBjb3VudCwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9ydW5MaXN0KFwiYXR0cmlidXRlc0ZvclwiLCBmYWN0b3J5TmFtZSwgY291bnQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgbGlzdCBvZiB1bnNhdmVkIHJlY29yZHMgc2VxdWVudGlhbGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIE51bWJlciBvZiByZWNvcmRzLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXQgbmFtZXMgdGhlbiBhbiBvcHRpb25hbCBvdmVycmlkZXMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTw/Pj59IC0gVGhlIGJ1aWx0IHJlY29yZHMuXG4gICAqL1xuICBhc3luYyBidWlsZExpc3QoZmFjdG9yeU5hbWUsIGNvdW50LCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3J1bkxpc3QoXCJidWlsZFwiLCBmYWN0b3J5TmFtZSwgY291bnQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgcGVyc2lzdGVkIHJlY29yZHMgc2VxdWVudGlhbGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIE51bWJlciBvZiByZWNvcmRzLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXQgbmFtZXMgdGhlbiBhbiBvcHRpb25hbCBvdmVycmlkZXMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTw/Pj59IC0gVGhlIHBlcnNpc3RlZCByZWNvcmRzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlTGlzdChmYWN0b3J5TmFtZSwgY291bnQsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcnVuTGlzdChcImNyZWF0ZVwiLCBmYWN0b3J5TmFtZSwgY291bnQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYXR0cmlidXRlcyBmb3IgZXhhY3RseSB0d28gcmVjb3Jkcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZhY3RvcnlOYW1lIC0gRmFjdG9yeSBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBhcmdzIC0gVHJhaXQgbmFtZXMgdGhlbiBhbiBvcHRpb25hbCBvdmVycmlkZXMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj4+fSAtIFRoZSB0d28gcmVzb2x2ZWQgYXR0cmlidXRlIG9iamVjdHMuXG4gICAqL1xuICBhc3luYyBhdHRyaWJ1dGVzRm9yUGFpcihmYWN0b3J5TmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9ydW5MaXN0KFwiYXR0cmlidXRlc0ZvclwiLCBmYWN0b3J5TmFtZSwgMiwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgZXhhY3RseSB0d28gdW5zYXZlZCByZWNvcmRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IGFyZ3MgLSBUcmFpdCBuYW1lcyB0aGVuIGFuIG9wdGlvbmFsIG92ZXJyaWRlcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PD8+Pn0gLSBUaGUgdHdvIGJ1aWx0IHJlY29yZHMuXG4gICAqL1xuICBhc3luYyBidWlsZFBhaXIoZmFjdG9yeU5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcnVuTGlzdChcImJ1aWxkXCIsIGZhY3RvcnlOYW1lLCAyLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZXhhY3RseSB0d28gcGVyc2lzdGVkIHJlY29yZHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gYXJncyAtIFRyYWl0IG5hbWVzIHRoZW4gYW4gb3B0aW9uYWwgb3ZlcnJpZGVzIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8Pz4+fSAtIFRoZSB0d28gcGVyc2lzdGVkIHJlY29yZHMuXG4gICAqL1xuICBhc3luYyBjcmVhdGVQYWlyKGZhY3RvcnlOYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3J1bkxpc3QoXCJjcmVhdGVcIiwgZmFjdG9yeU5hbWUsIDIsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZXMgYSBzZXF1ZW5jZSBhbmQgcmV0dXJucyBpdHMgZm9ybWF0dGVkIHZhbHVlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VxdWVuY2VOYW1lIC0gU2VxdWVuY2UgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gVGhlIGZvcm1hdHRlZCB2YWx1ZS5cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlKHNlcXVlbmNlTmFtZSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9nZW5lcmF0ZVNjb3BlZChzZXF1ZW5jZU5hbWUsIFtdKVxuICB9XG5cbiAgLyoqXG4gICAqIEFkdmFuY2VzIGEgc2VxdWVuY2UgYGNvdW50YCB0aW1lcyBhbmQgcmV0dXJucyB0aGUgZm9ybWF0dGVkIHZhbHVlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcXVlbmNlTmFtZSAtIFNlcXVlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIE51bWJlciBvZiB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PD8+Pn0gLSBUaGUgZm9ybWF0dGVkIHZhbHVlcy5cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlTGlzdChzZXF1ZW5jZU5hbWUsIGNvdW50KSB7XG4gICAgLyoqIEB0eXBlIHtBcnJheTw/Pn0gKi9cbiAgICBjb25zdCB2YWx1ZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7XG4gICAgICB2YWx1ZXMucHVzaChhd2FpdCB0aGlzLl9nZW5lcmF0ZVNjb3BlZChzZXF1ZW5jZU5hbWUsIFtdKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmV4dCByYXcgdmFsdWUgYSBnbG9iYWwgc2VxdWVuY2Ugd291bGQgYWxsb2NhdGUgd2l0aG91dCBjb25zdW1pbmcgaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXF1ZW5jZU5hbWUgLSBTZXF1ZW5jZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIFRoZSB1cGNvbWluZyByYXcgdmFsdWUuXG4gICAqL1xuICBwZWVrU2VxdWVuY2Uoc2VxdWVuY2VOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVHbG9iYWxTZXF1ZW5jZShzZXF1ZW5jZU5hbWUpLnBlZWsoKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG5leHQgdmFsdWUgYSBnbG9iYWwgc2VxdWVuY2Ugd2lsbCBhbGxvY2F0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcXVlbmNlTmFtZSAtIFNlcXVlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIE5leHQgcmF3IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldFNlcXVlbmNlKHNlcXVlbmNlTmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLl9hc3NlcnROb3RFdmFsdWF0aW5nKFwic2V0U2VxdWVuY2VcIilcbiAgICB0aGlzLl9yZXNvbHZlR2xvYmFsU2VxdWVuY2Uoc2VxdWVuY2VOYW1lKS5zZXQodmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogUmV3aW5kcyBhIHNpbmdsZSBnbG9iYWwgc2VxdWVuY2UgdG8gaXRzIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXF1ZW5jZU5hbWUgLSBTZXF1ZW5jZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJld2luZFNlcXVlbmNlKHNlcXVlbmNlTmFtZSkge1xuICAgIHRoaXMuX2Fzc2VydE5vdEV2YWx1YXRpbmcoXCJyZXdpbmRTZXF1ZW5jZVwiKVxuICAgIHRoaXMuX3Jlc29sdmVHbG9iYWxTZXF1ZW5jZShzZXF1ZW5jZU5hbWUpLnJld2luZCgpXG4gIH1cblxuICAvKipcbiAgICogUmV3aW5kcyBldmVyeSBnbG9iYWwgYW5kIGZhY3Rvcnktc2NvcGVkIHNlcXVlbmNlIHRvIGl0cyBpbml0aWFsIHZhbHVlIHdoaWxlXG4gICAqIGxlYXZpbmcgYWxsIGRlZmluaXRpb25zIGludGFjdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZXdpbmRTZXF1ZW5jZXMoKSB7XG4gICAgdGhpcy5fYXNzZXJ0Tm90RXZhbHVhdGluZyhcInJld2luZFNlcXVlbmNlc1wiKVxuXG4gICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiBuZXcgU2V0KHRoaXMuX3NlcXVlbmNlcy52YWx1ZXMoKSkpIHNlcXVlbmNlLnJld2luZCgpXG5cbiAgICBmb3IgKGNvbnN0IHNjb3BlIG9mIHRoaXMuX2ZhY3RvcnlTZXF1ZW5jZXMudmFsdWVzKCkpIHtcbiAgICAgIGZvciAoY29uc3Qgc2VxdWVuY2Ugb2YgbmV3IFNldChzY29wZS52YWx1ZXMoKSkpIHNlcXVlbmNlLnJld2luZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgZGVmaW5pdGlvbnMsIHRyYWl0cywgc2VxdWVuY2VzIGFuZCByZWdpc3RyeSBkZWZhdWx0cywgcmVzdG9yaW5nIGFuXG4gICAqIGVtcHR5IHJlZ2lzdHJ5IHdpdGggdGhlIGJ1aWx0LWluIHN0cmF0ZWdpZXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5fYXNzZXJ0Tm90RXZhbHVhdGluZyhcInJlc2V0XCIpXG4gICAgdGhpcy5fZmFjdG9yaWVzLmNsZWFyKClcbiAgICB0aGlzLl9nbG9iYWxUcmFpdHMuY2xlYXIoKVxuICAgIHRoaXMuX3NlcXVlbmNlcy5jbGVhcigpXG4gICAgdGhpcy5fZmFjdG9yeVNlcXVlbmNlcy5jbGVhcigpXG4gICAgdGhpcy5fZ2xvYmFsRGVjbGFyYXRpb25zID0gW11cbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRmFjdG9yeUV2ZW50RW1pdHRlcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBgY291bnRgIHNlcXVlbnRpYWwgc3RyYXRlZ3kgaW52b2NhdGlvbnMuXG4gICAqIEBwYXJhbSB7XCJhdHRyaWJ1dGVzRm9yXCIgfCBcImJ1aWxkXCIgfCBcImNyZWF0ZVwifSBzdHJhdGVneSAtIFN0cmF0ZWd5IG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IC0gTnVtYmVyIG9mIGVudHJpZXMuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IGFyZ3MgLSBUcmFpdCBuYW1lcyB0aGVuIGFuIG9wdGlvbmFsIG92ZXJyaWRlcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PD8+Pn0gLSBUaGUgcmVzdWx0cy5cbiAgICovXG4gIGFzeW5jIF9ydW5MaXN0KHN0cmF0ZWd5LCBmYWN0b3J5TmFtZSwgY291bnQsIGFyZ3MpIHtcbiAgICBjb25zdCB7dHJhaXRzLCBvdmVycmlkZXN9ID0gbm9ybWFsaXplSW52b2NhdGlvbkFyZ3MoYXJncylcbiAgICAvKiogQHR5cGUge0FycmF5PD8+fSAqL1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9mYWN0b3J5LXJ1bm5lci5qc1wiKS5Db21waWxlZFBsYW4gfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHBsYW5UZW1wbGF0ZVxuXG4gICAgdGhpcy5fYWN0aXZlRXZhbHVhdGlvbnMgKz0gMVxuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBpbnZvY2F0aW9uID0gYXdhaXQgdGhpcy5fcnVuRmFjdG9yeUludm9jYXRpb24oe2ZhY3RvcnlOYW1lLCB0cmFpdHMsIG92ZXJyaWRlcywgc3RyYXRlZ3ksIHBsYW5UZW1wbGF0ZX0pXG5cbiAgICAgICAgcGxhblRlbXBsYXRlID0gaW52b2NhdGlvbi5wbGFuVGVtcGxhdGVcbiAgICAgICAgcmVzdWx0cy5wdXNoKGludm9jYXRpb24ucmVzdWx0KVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9hY3RpdmVFdmFsdWF0aW9ucyAtPSAxXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlcyBhbmQgcnVucyBhIGZhY3RvcnkgaW52b2NhdGlvbiB1bmRlciBhIHN0cmF0ZWd5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZhY3RvcnlOYW1lIC0gRmFjdG9yeSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnRyYWl0cyAtIE9yZGVyZWQgdHJhaXRzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLm92ZXJyaWRlcyAtIE92ZXJyaWRlcy5cbiAgICogQHBhcmFtIHtcImF0dHJpYnV0ZXNGb3JcIiB8IFwiYnVpbGRcIiB8IFwiY3JlYXRlXCJ9IGFyZ3Muc3RyYXRlZ3kgLSBTdHJhdGVneSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBUaGUgc3RyYXRlZ3kgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX3J1bkZhY3RvcnkoYXJncykge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5fcnVuRmFjdG9yeUludm9jYXRpb24oYXJncykpLnJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIGV2ZW50LXRyYWNrZWQgaW52b2NhdGlvbiwgb3B0aW9uYWxseSByZXVzaW5nIGRlY2xhcmF0aW9uIHBsYW5uaW5nLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZhY3RvcnlOYW1lIC0gRmFjdG9yeSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLnRyYWl0cyAtIE9yZGVyZWQgdHJhaXRzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLm92ZXJyaWRlcyAtIE92ZXJyaWRlcy5cbiAgICogQHBhcmFtIHtcImF0dHJpYnV0ZXNGb3JcIiB8IFwiYnVpbGRcIiB8IFwiY3JlYXRlXCJ9IGFyZ3Muc3RyYXRlZ3kgLSBTdHJhdGVneSBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZmFjdG9yeS1ydW5uZXIuanNcIikuQ29tcGlsZWRQbGFufSBbYXJncy5wbGFuVGVtcGxhdGVdIC0gUmV1c2FibGUgZGVjbGFyYXRpb24gcGxhbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3Jlc3VsdDogPywgcGxhblRlbXBsYXRlOiBpbXBvcnQoXCIuL2ZhY3RvcnktcnVubmVyLmpzXCIpLkNvbXBpbGVkUGxhbn0+fSAtIFJlc3VsdCBhbmQgZGVjbGFyYXRpb24gcGxhbi5cbiAgICovXG4gIGFzeW5jIF9ydW5GYWN0b3J5SW52b2NhdGlvbih7ZmFjdG9yeU5hbWUsIHRyYWl0cywgb3ZlcnJpZGVzLCBzdHJhdGVneSwgcGxhblRlbXBsYXRlfSkge1xuICAgIHRoaXMuX2FjdGl2ZUV2YWx1YXRpb25zICs9IDFcblxuICAgIGNvbnN0IGludm9jYXRpb25JZCA9IHRoaXMuX2V2ZW50cy5uZXh0SW52b2NhdGlvbklkKClcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpXG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fZXZlbnRzLmVtaXQoXCJzdGFydFwiLCB7aW52b2NhdGlvbklkLCBmYWN0b3J5OiBmYWN0b3J5TmFtZSwgc3RyYXRlZ3ksIHRyYWl0c30pXG5cbiAgICAgIGNvbnN0IGNvbXBpbGVkUGxhblRlbXBsYXRlID0gcGxhblRlbXBsYXRlIHx8IHRoaXMuX3J1bm5lci5jb21waWxlVGVtcGxhdGUoZmFjdG9yeU5hbWUsIHRyYWl0cylcbiAgICAgIGNvbnN0IGNvbXBpbGVkUGxhbiA9IHRoaXMuX3J1bm5lci5hcHBseU92ZXJyaWRlcyhjb21waWxlZFBsYW5UZW1wbGF0ZSwgb3ZlcnJpZGVzKVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fc3RyYXRlZ2llc1tzdHJhdGVneV0ucnVuKHtyZWdpc3RyeTogdGhpcywgcGxhbjogY29tcGlsZWRQbGFufSlcblxuICAgICAgdGhpcy5fZXZlbnRzLmVtaXQoXCJzdWNjZXNzXCIsIHtpbnZvY2F0aW9uSWQsIGZhY3Rvcnk6IGZhY3RvcnlOYW1lLCBzdHJhdGVneSwgdHJhaXRzLCBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc3RhcnRlZEF0fSlcblxuICAgICAgcmV0dXJuIHtyZXN1bHQsIHBsYW5UZW1wbGF0ZTogY29tcGlsZWRQbGFuVGVtcGxhdGV9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2V2ZW50cy5lbWl0KFwiZmFpbHVyZVwiLCB7aW52b2NhdGlvbklkLCBmYWN0b3J5OiBmYWN0b3J5TmFtZSwgc3RyYXRlZ3ksIHRyYWl0cywgZHVyYXRpb25NczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCwgZXJyb3J9KVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9hY3RpdmVFdmFsdWF0aW9ucyAtPSAxXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBpbW11dGFibGUgZmFjdG9yeSBkZWZpbml0aW9uIGFuZCBpdHMgYWxpYXNlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0fSBkZWZpbml0aW9uIC0gQ29tcGlsZWQgZmFjdG9yeS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVnaXN0ZXJGYWN0b3J5RGVmaW5pdGlvbihkZWZpbml0aW9uKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIFtkZWZpbml0aW9uLm5hbWUsIC4uLmRlZmluaXRpb24uYWxpYXNlc10pIHtcbiAgICAgIGlmICh0aGlzLl9mYWN0b3JpZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBEdXBsaWNhdGVEZWZpbml0aW9uRXJyb3IoYEZhY3RvcnkgXCIke25hbWV9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW2RlZmluaXRpb24ubmFtZSwgLi4uZGVmaW5pdGlvbi5hbGlhc2VzXSkge1xuICAgICAgdGhpcy5fZmFjdG9yaWVzLnNldChuYW1lLCBkZWZpbml0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbiBleGlzdGluZyBmYWN0b3J5IGRlZmluaXRpb24gKGFuZCBpdHMgYWxpYXNlcykgd2l0aCBhIHJlY29tcGlsZWRcbiAgICogb25lLiBVc2VkIGJ5IGBtb2RpZnlgOyBubyBkdXBsaWNhdGUgY2hlY2sgYmVjYXVzZSBpdCBpbnRlbnRpb25hbGx5IG92ZXJ3cml0ZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gZGVmaW5pdGlvbiAtIFJlY29tcGlsZWQgZmFjdG9yeS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVwbGFjZUZhY3RvcnlEZWZpbml0aW9uKGRlZmluaXRpb24pIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW2RlZmluaXRpb24ubmFtZSwgLi4uZGVmaW5pdGlvbi5hbGlhc2VzXSkge1xuICAgICAgdGhpcy5fZmFjdG9yaWVzLnNldChuYW1lLCBkZWZpbml0aW9uKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBnbG9iYWwgdHJhaXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90cmFpdC1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IHRyYWl0IC0gQ29tcGlsZWQgdHJhaXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlZ2lzdGVyR2xvYmFsVHJhaXQodHJhaXQpIHtcbiAgICBpZiAodGhpcy5fZ2xvYmFsVHJhaXRzLmhhcyh0cmFpdC5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZURlZmluaXRpb25FcnJvcihgVHJhaXQgXCIke3RyYWl0Lm5hbWV9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkYClcbiAgICB9XG5cbiAgICB0aGlzLl9nbG9iYWxUcmFpdHMuc2V0KHRyYWl0Lm5hbWUsIHRyYWl0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHNlcXVlbmNlIChhbmQgaXRzIGFsaWFzZXMpIGVpdGhlciBnbG9iYWxseSBvciB1bmRlciBhIGZhY3Rvcnkgc2NvcGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zZXF1ZW5jZS5qc1wiKS5kZWZhdWx0fSBzZXF1ZW5jZSAtIFNlcXVlbmNlIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGZhY3RvcnlTY29wZSAtIEZhY3RvcnkgbmFtZSB0byBzY29wZSB1bmRlciwgb3IgbnVsbCBmb3IgZ2xvYmFsLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZWdpc3RlclNlcXVlbmNlKHNlcXVlbmNlLCBmYWN0b3J5U2NvcGUpIHtcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vc2VxdWVuY2UuanNcIikuZGVmYXVsdD59ICovXG4gICAgbGV0IHRhcmdldFxuXG4gICAgaWYgKGZhY3RvcnlTY29wZSkge1xuICAgICAgaWYgKCF0aGlzLl9mYWN0b3J5U2VxdWVuY2VzLmhhcyhmYWN0b3J5U2NvcGUpKSB0aGlzLl9mYWN0b3J5U2VxdWVuY2VzLnNldChmYWN0b3J5U2NvcGUsIG5ldyBNYXAoKSlcbiAgICAgIHRhcmdldCA9IC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9zZXF1ZW5jZS5qc1wiKS5kZWZhdWx0Pn0gKi8gKHRoaXMuX2ZhY3RvcnlTZXF1ZW5jZXMuZ2V0KGZhY3RvcnlTY29wZSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHRoaXMuX3NlcXVlbmNlc1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbmFtZSBvZiBbc2VxdWVuY2UubmFtZSwgLi4uc2VxdWVuY2UuYWxpYXNlc10pIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBEdXBsaWNhdGVEZWZpbml0aW9uRXJyb3IoYFNlcXVlbmNlIFwiJHtuYW1lfVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCR7ZmFjdG9yeVNjb3BlID8gYCBmb3IgZmFjdG9yeSBcIiR7ZmFjdG9yeVNjb3BlfVwiYCA6IFwiXCJ9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW3NlcXVlbmNlLm5hbWUsIC4uLnNlcXVlbmNlLmFsaWFzZXNdKSB7XG4gICAgICB0YXJnZXQuc2V0KG5hbWUsIHNlcXVlbmNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgcmVnaXN0cnktbGV2ZWwgZGVmYXVsdCBkZWNsYXJhdGlvbiAoY2FsbGJhY2tzL2NvbnN0cnVjdGlvbiBkZWZhdWx0cykuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gRGVjbGFyYXRpb24gdG8gYWRkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9hZGRHbG9iYWxEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikge1xuICAgIHRoaXMuX2dsb2JhbERlY2xhcmF0aW9ucy5wdXNoKGRlY2xhcmF0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgc2VxdWVuY2UgbmFtZSBhZ2FpbnN0IGEgZmFjdG9yeSBzY29wZSBjaGFpbiAoY2hpbGQgZmlyc3QpIHRoZW4gdGhlXG4gICAqIGdsb2JhbCBzY29wZSBhbmQgYWR2YW5jZXMgaXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXF1ZW5jZU5hbWUgLSBTZXF1ZW5jZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjaGFpbk5hbWVzIC0gSW5oZXJpdGFuY2UgY2hhaW4gbmFtZXMgKGNoaWxkIGxhc3QpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBUaGUgZm9ybWF0dGVkIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgX2dlbmVyYXRlU2NvcGVkKHNlcXVlbmNlTmFtZSwgY2hhaW5OYW1lcykge1xuICAgIGZvciAobGV0IGluZGV4ID0gY2hhaW5OYW1lcy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICBjb25zdCBzY29wZSA9IHRoaXMuX2ZhY3RvcnlTZXF1ZW5jZXMuZ2V0KGNoYWluTmFtZXNbaW5kZXhdKVxuXG4gICAgICBpZiAoc2NvcGUgJiYgc2NvcGUuaGFzKHNlcXVlbmNlTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZXF1ZW5jZS5qc1wiKS5kZWZhdWx0fSAqLyAoc2NvcGUuZ2V0KHNlcXVlbmNlTmFtZSkpLm5leHQoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9yZXNvbHZlR2xvYmFsU2VxdWVuY2Uoc2VxdWVuY2VOYW1lKS5uZXh0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGdsb2JhbCBzZXF1ZW5jZSBieSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VxdWVuY2VOYW1lIC0gU2VxdWVuY2UgbmFtZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vc2VxdWVuY2UuanNcIikuZGVmYXVsdH0gLSBUaGUgc2VxdWVuY2UuXG4gICAqL1xuICBfcmVzb2x2ZUdsb2JhbFNlcXVlbmNlKHNlcXVlbmNlTmFtZSkge1xuICAgIGNvbnN0IHNlcXVlbmNlID0gdGhpcy5fc2VxdWVuY2VzLmdldChzZXF1ZW5jZU5hbWUpXG5cbiAgICBpZiAoIXNlcXVlbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgVW5kZWZpbmVkU2VxdWVuY2VFcnJvcihgTm8gc2VxdWVuY2UgcmVnaXN0ZXJlZCBjYWxsZWQgXCIke3NlcXVlbmNlTmFtZX1cImApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcXVlbmNlXG4gIH1cblxuICAvKipcbiAgICogUmVqZWN0cyBzZXR1cC10aW1lIG11dGF0aW9uIHdoaWxlIGV2YWx1YXRpb25zIGFyZSBhY3RpdmUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRpb24gLSBPcGVyYXRpb24gbmFtZSwgZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9hc3NlcnROb3RFdmFsdWF0aW5nKG9wZXJhdGlvbikge1xuICAgIGlmICh0aGlzLl9hY3RpdmVFdmFsdWF0aW9ucyA+IDApIHtcbiAgICAgIHRocm93IG5ldyBSZWdpc3RyeUJ1c3lFcnJvcihgQ2Fubm90ICR7b3BlcmF0aW9ufSB3aGlsZSBmYWN0b3J5IGV2YWx1YXRpb25zIGFyZSBhY3RpdmUuIFJlZ2lzdHJ5IG11dGF0aW9uIGlzIHNldHVwLXRpbWUgb25seS5gKVxuICAgIH1cbiAgfVxufVxuIl19
@@ -39,6 +39,20 @@ export default class FactoryRunner {
39
39
  * @returns {CompiledPlan} - The compiled plan.
40
40
  */
41
41
  compile(factoryName: string, requestedTraits: string[], overrides: Record<string, unknown>): CompiledPlan;
42
+ /**
43
+ * Compiles inheritance, traits and declarations without call-site overrides.
44
+ * @param {string} factoryName - Factory to run.
45
+ * @param {string[]} requestedTraits - Traits requested at the call site, in order.
46
+ * @returns {CompiledPlan} - Reusable declaration plan.
47
+ */
48
+ compileTemplate(factoryName: string, requestedTraits: string[]): CompiledPlan;
49
+ /**
50
+ * Applies the current call-site overrides without mutating the reusable template.
51
+ * @param {CompiledPlan} planTemplate - Reusable declaration plan.
52
+ * @param {Record<string, ?>} overrides - Current call-site overrides.
53
+ * @returns {CompiledPlan} - Per-invocation plan.
54
+ */
55
+ applyOverrides(planTemplate: CompiledPlan, overrides: Record<string, unknown>): CompiledPlan;
42
56
  /**
43
57
  * Resolves the inheritance chain from the root parent down to the target.
44
58
  * @param {string} factoryName - Target factory name.
@@ -89,20 +103,18 @@ export default class FactoryRunner {
89
103
  scope: import("./factory-definition.js").default;
90
104
  } | undefined;
91
105
  /**
92
- * Folds flattened declarations plus overrides into a compiled plan.
106
+ * Folds flattened declarations into a reusable compiled plan.
93
107
  * @param {object} args - Options.
94
108
  * @param {Array<{decl: import("./declarations.js").Declaration}>} args.flattened - Flattened declarations.
95
- * @param {Record<string, ?>} args.overrides - Call-site overrides.
96
109
  * @param {(new (attributes?: Record<string, ?>) => ?) | null} args.modelClass - Resolved model class.
97
110
  * @param {import("./factory-definition.js").default} args.target - Target factory definition.
98
111
  * @param {string[]} args.chainNames - Inheritance chain names.
99
112
  * @returns {CompiledPlan} - The compiled plan.
100
113
  */
101
- _buildPlan({ flattened, overrides, modelClass, target, chainNames }: {
114
+ _buildPlan({ flattened, modelClass, target, chainNames }: {
102
115
  flattened: Array<{
103
116
  decl: import("./declarations.js").Declaration;
104
117
  }>;
105
- overrides: Record<string, unknown>;
106
118
  modelClass: (new (attributes?: Record<string, unknown>) => unknown) | null;
107
119
  target: import("./factory-definition.js").default;
108
120
  chainNames: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"factory-runner.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/factory-runner.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"factory-runner.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/factory-runner.js"],"names":[],"mappings":"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"}
@@ -43,6 +43,15 @@ export default class FactoryRunner {
43
43
  * @returns {CompiledPlan} - The compiled plan.
44
44
  */
45
45
  compile(factoryName, requestedTraits, overrides) {
46
+ return this.applyOverrides(this.compileTemplate(factoryName, requestedTraits), overrides);
47
+ }
48
+ /**
49
+ * Compiles inheritance, traits and declarations without call-site overrides.
50
+ * @param {string} factoryName - Factory to run.
51
+ * @param {string[]} requestedTraits - Traits requested at the call site, in order.
52
+ * @returns {CompiledPlan} - Reusable declaration plan.
53
+ */
54
+ compileTemplate(factoryName, requestedTraits) {
46
55
  const chain = this._resolveChain(factoryName);
47
56
  const target = chain[chain.length - 1];
48
57
  const modelClass = this._resolveModelClass(chain);
@@ -57,7 +66,25 @@ export default class FactoryRunner {
57
66
  for (const traitName of requestedTraits) {
58
67
  this._expandTrait(traitName, target, flattened, []);
59
68
  }
60
- return this._buildPlan({ flattened, overrides, modelClass, target, chainNames: chain.map((definition) => definition.name) });
69
+ return this._buildPlan({ flattened, modelClass, target, chainNames: chain.map((definition) => definition.name) });
70
+ }
71
+ /**
72
+ * Applies the current call-site overrides without mutating the reusable template.
73
+ * @param {CompiledPlan} planTemplate - Reusable declaration plan.
74
+ * @param {Record<string, ?>} overrides - Current call-site overrides.
75
+ * @returns {CompiledPlan} - Per-invocation plan.
76
+ */
77
+ applyOverrides(planTemplate, overrides) {
78
+ const overrideKeys = Object.keys(overrides);
79
+ if (overrideKeys.length === 0)
80
+ return planTemplate;
81
+ const resolved = new Map(planTemplate.resolved);
82
+ for (const key of overrideKeys) {
83
+ const prior = resolved.get(key);
84
+ resolved.set(key, { slotKind: prior ? prior.slotKind : "attribute", value: overrides[key], isOverride: true });
85
+ }
86
+ this._arbitrateAssociationOverrides(resolved, overrides, planTemplate.modelClass);
87
+ return { ...planTemplate, resolved };
61
88
  }
62
89
  /**
63
90
  * Resolves the inheritance chain from the root parent down to the target.
@@ -167,16 +194,15 @@ export default class FactoryRunner {
167
194
  return undefined;
168
195
  }
169
196
  /**
170
- * Folds flattened declarations plus overrides into a compiled plan.
197
+ * Folds flattened declarations into a reusable compiled plan.
171
198
  * @param {object} args - Options.
172
199
  * @param {Array<{decl: import("./declarations.js").Declaration}>} args.flattened - Flattened declarations.
173
- * @param {Record<string, ?>} args.overrides - Call-site overrides.
174
200
  * @param {(new (attributes?: Record<string, ?>) => ?) | null} args.modelClass - Resolved model class.
175
201
  * @param {import("./factory-definition.js").default} args.target - Target factory definition.
176
202
  * @param {string[]} args.chainNames - Inheritance chain names.
177
203
  * @returns {CompiledPlan} - The compiled plan.
178
204
  */
179
- _buildPlan({ flattened, overrides, modelClass, target, chainNames }) {
205
+ _buildPlan({ flattened, modelClass, target, chainNames }) {
180
206
  /** @type {Map<string, Slot>} */
181
207
  const resolved = new Map();
182
208
  /** @type {Map<string, import("./declarations.js").CallbackDeclaration[]>} */
@@ -213,11 +239,6 @@ export default class FactoryRunner {
213
239
  skipCreate = true;
214
240
  }
215
241
  }
216
- for (const key of Object.keys(overrides)) {
217
- const prior = resolved.get(key);
218
- resolved.set(key, { slotKind: prior ? prior.slotKind : "attribute", value: overrides[key], isOverride: true });
219
- }
220
- this._arbitrateAssociationOverrides(resolved, overrides, modelClass);
221
242
  return {
222
243
  factoryName: target.name,
223
244
  factoryDefinition: target,
@@ -240,6 +261,8 @@ export default class FactoryRunner {
240
261
  * @returns {void}
241
262
  */
242
263
  _arbitrateAssociationOverrides(resolved, overrides, modelClass) {
264
+ if (Object.keys(overrides).length === 0)
265
+ return;
243
266
  if (typeof modelClass !== "function" || !(modelClass.prototype instanceof DatabaseRecord))
244
267
  return;
245
268
  const backendModelClass = /** @type {typeof DatabaseRecord} */ (modelClass);
@@ -263,4 +286,4 @@ export default class FactoryRunner {
263
286
  }
264
287
  }
265
288
  }
266
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVzdGluZy9mYWN0b3J5L2ZhY3RvcnktcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFekY7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7O09BR0c7SUFDSCxZQUFZLFFBQVE7UUFDbEIseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQzFCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxTQUFTO1FBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDN0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWpELHFFQUFxRTtRQUNyRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFFcEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDNUQsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1FBQ3JDLENBQUM7UUFFRCxLQUFLLE1BQU0saUJBQWlCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLDBCQUEwQixD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LG9DQUFvQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0UsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQywrQkFBK0IsRUFBRSxDQUFBO1FBRTdFLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssYUFBYTtnQkFBRSxTQUFRO1lBRTdDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBRWxFLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVc7Z0JBQUUsU0FBUTtZQUVwRCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUNyRCxNQUFNLG1CQUFtQixHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLElBQUksZ0JBQWdCLENBQUE7WUFFbkYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDO2dCQUFFLFNBQVE7WUFFNUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLFFBQVEsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtZQUN0QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgRGF0YWJhc2VSZWNvcmQgZnJvbSBcIi4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG5pbXBvcnQge0ZhY3RvcnlDeWNsZUVycm9yLCBVbmRlZmluZWRGYWN0b3J5RXJyb3IsIFVuZGVmaW5lZFRyYWl0RXJyb3J9IGZyb20gXCIuL2Vycm9ycy5qc1wiXG5cbi8qKlxuICogQSByZXNvbHZlZCBhdHRyaWJ1dGUvdHJhbnNpZW50L2Fzc29jaWF0aW9uIHNsb3QgaW4gYSBjb21waWxlZCBwbGFuLlxuICogQHR5cGVkZWYge29iamVjdH0gU2xvdFxuICogQHByb3BlcnR5IHtcImF0dHJpYnV0ZVwiIHwgXCJ0cmFuc2llbnRcIiB8IFwiYXNzb2NpYXRpb25cIn0gc2xvdEtpbmQgLSBTbG90IG5hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7P30gdmFsdWUgLSBMaXRlcmFsL2xhenkgdmFsdWUsIG92ZXJyaWRlIHZhbHVlLCBvciBBc3NvY2lhdGlvbkRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBpc092ZXJyaWRlIC0gV2hldGhlciB0aGUgdmFsdWUgY2FtZSBmcm9tIGEgY2FsbC1zaXRlIG92ZXJyaWRlLlxuICovXG5cbi8qKlxuICogVGhlIGltbXV0YWJsZSByZXN1bHQgb2YgY29tcGlsaW5nIGEgZmFjdG9yeSBpbnZvY2F0aW9uLlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGlsZWRQbGFuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBUYXJnZXQgZmFjdG9yeSBuYW1lLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0fSBmYWN0b3J5RGVmaW5pdGlvbiAtIFRhcmdldCBkZWZpbml0aW9uLlxuICogQHByb3BlcnR5IHsobmV3IChhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgPz4pID0+ID8pIHwgbnVsbH0gbW9kZWxDbGFzcyAtIFJlc29sdmVkIG1vZGVsIGNsYXNzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY2hhaW5OYW1lcyAtIEluaGVyaXRhbmNlIGNoYWluIG5hbWVzIChjaGlsZCBsYXN0KSBmb3Igc2VxdWVuY2Ugc2NvcGUuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIFNsb3Q+fSByZXNvbHZlZCAtIE5hbWXihpJzbG90IG1hcCAobGFzdCBkZWNsYXJhdGlvbiB3aW5zKS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuQ2FsbGJhY2tEZWNsYXJhdGlvbltdPn0gY2FsbGJhY2tzIC0gRGVkdXBlZCBjYWxsYmFja3MgYnkgZXZlbnQuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkluaXRpYWxpemVXaXRoRGVjbGFyYXRpb25bXCJmblwiXSB8IG51bGx9IGluaXRpYWxpemVXaXRoIC0gQ3VzdG9tIGNvbnN0cnVjdG9yLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5Ub0NyZWF0ZURlY2xhcmF0aW9uW1wiZm5cIl0gfCBudWxsfSB0b0NyZWF0ZSAtIEN1c3RvbSBwZXJzaXN0ZW5jZSwgb3IgbnVsbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2tpcENyZWF0ZSAtIFdoZXRoZXIgcGVyc2lzdGVuY2UgaXMgc2tpcHBlZC5cbiAqL1xuXG4vKipcbiAqIENvbXBpbGVzIGZhY3RvcnkgaW52b2NhdGlvbnMgaW50byBpbW11dGFibGUgcGxhbnMgYnkgcmVzb2x2aW5nIHRoZSBpbmhlcml0YW5jZVxuICogY2hhaW4sIGV4cGFuZGluZyBiYXNlIGFuZCByZXF1ZXN0ZWQgdHJhaXRzLCBhbmQgZm9sZGluZyBkZWNsYXJhdGlvbnMgaW50byBhXG4gKiBuYW1l4oaSc2xvdCBtYXAgcGx1cyBhIGRlZHVwZWQsIG9yZGVyZWQgY2FsbGJhY2sgc2V0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYWN0b3J5UnVubmVyIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHJ1bm5lci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gcmVnaXN0cnkgLSBPd25pbmcgcmVnaXN0cnkuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWdpc3RyeSkge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9mYWN0b3J5LXJlZ2lzdHJ5LmpzXCIpLmRlZmF1bHR9IC0gT3duaW5nIHJlZ2lzdHJ5LiAqL1xuICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGVzIGEgZmFjdG9yeSBpbnZvY2F0aW9uIGludG8gYSBwbGFuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IHRvIHJ1bi5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcmVxdWVzdGVkVHJhaXRzIC0gVHJhaXRzIHJlcXVlc3RlZCBhdCB0aGUgY2FsbCBzaXRlLCBpbiBvcmRlci5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gb3ZlcnJpZGVzIC0gQ2FsbC1zaXRlIG92ZXJyaWRlcyAoaGlnaGVzdCBwcmVjZWRlbmNlKS5cbiAgICogQHJldHVybnMge0NvbXBpbGVkUGxhbn0gLSBUaGUgY29tcGlsZWQgcGxhbi5cbiAgICovXG4gIGNvbXBpbGUoZmFjdG9yeU5hbWUsIHJlcXVlc3RlZFRyYWl0cywgb3ZlcnJpZGVzKSB7XG4gICAgY29uc3QgY2hhaW4gPSB0aGlzLl9yZXNvbHZlQ2hhaW4oZmFjdG9yeU5hbWUpXG4gICAgY29uc3QgdGFyZ2V0ID0gY2hhaW5bY2hhaW4ubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5fcmVzb2x2ZU1vZGVsQ2xhc3MoY2hhaW4pXG5cbiAgICAvKiogQHR5cGUge0FycmF5PHtkZWNsOiBpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbn0+fSAqL1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHRoaXMucmVnaXN0cnkuX2dsb2JhbERlY2xhcmF0aW9ucykge1xuICAgICAgZmxhdHRlbmVkLnB1c2goe2RlY2w6IGRlY2xhcmF0aW9ufSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZhY3RvcnlEZWZpbml0aW9uIG9mIGNoYWluKSB7XG4gICAgICB0aGlzLl9leHBhbmRGYWN0b3J5RGVjbGFyYXRpb25zKGZhY3RvcnlEZWZpbml0aW9uLCBmYWN0b3J5RGVmaW5pdGlvbiwgZmxhdHRlbmVkKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgdHJhaXROYW1lIG9mIHJlcXVlc3RlZFRyYWl0cykge1xuICAgICAgdGhpcy5fZXhwYW5kVHJhaXQodHJhaXROYW1lLCB0YXJnZXQsIGZsYXR0ZW5lZCwgW10pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkUGxhbih7ZmxhdHRlbmVkLCBvdmVycmlkZXMsIG1vZGVsQ2xhc3MsIHRhcmdldCwgY2hhaW5OYW1lczogY2hhaW4ubWFwKChkZWZpbml0aW9uKSA9PiBkZWZpbml0aW9uLm5hbWUpfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gZnJvbSB0aGUgcm9vdCBwYXJlbnQgZG93biB0byB0aGUgdGFyZ2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBUYXJnZXQgZmFjdG9yeSBuYW1lLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdFtdfSAtIENoYWluIChyb290IGZpcnN0LCB0YXJnZXQgbGFzdCkuXG4gICAqL1xuICBfcmVzb2x2ZUNoYWluKGZhY3RvcnlOYW1lKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0W119ICovXG4gICAgY29uc3QgY2hhaW4gPSBbXVxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9yZXNvbHZlRmFjdG9yeShmYWN0b3J5TmFtZSlcblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBpZiAoc2Vlbi5oYXMoY3VycmVudC5uYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRmFjdG9yeUN5Y2xlRXJyb3IoYEZhY3RvcnkgaW5oZXJpdGFuY2UgY3ljbGUgZGV0ZWN0ZWQ6ICR7Wy4uLnNlZW4sIGN1cnJlbnQubmFtZV0uam9pbihcIiAtPiBcIil9YClcbiAgICAgIH1cblxuICAgICAgc2Vlbi5hZGQoY3VycmVudC5uYW1lKVxuICAgICAgY2hhaW4udW5zaGlmdChjdXJyZW50KVxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50TmFtZSA/IHRoaXMuX3Jlc29sdmVGYWN0b3J5KGN1cnJlbnQucGFyZW50TmFtZSkgOiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoYWluXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBmYWN0b3J5IGRlZmluaXRpb24gYnkgbmFtZSAob3IgYWxpYXMpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFjdG9yeU5hbWUgLSBGYWN0b3J5IG5hbWUuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0fSAtIFRoZSBkZWZpbml0aW9uLlxuICAgKi9cbiAgX3Jlc29sdmVGYWN0b3J5KGZhY3RvcnlOYW1lKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMucmVnaXN0cnkuX2ZhY3Rvcmllcy5nZXQoZmFjdG9yeU5hbWUpXG5cbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBVbmRlZmluZWRGYWN0b3J5RXJyb3IoYE5vIGZhY3RvcnkgcmVnaXN0ZXJlZCBjYWxsZWQgXCIke2ZhY3RvcnlOYW1lfVwiLiBSZWdpc3RlcmVkOiAke1suLi50aGlzLnJlZ2lzdHJ5Ll9mYWN0b3JpZXMua2V5cygpXS5qb2luKFwiLCBcIikgfHwgXCIobm9uZSlcIn1gKVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbml0aW9uXG4gIH1cblxuICAvKipcbiAgICogUGlja3MgdGhlIG5lYXJlc3QgZGVjbGFyZWQgbW9kZWwgY2xhc3MgaW4gdGhlIGNoYWluIChjaGlsZCBvdmVycmlkZXMgcGFyZW50KS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0W119IGNoYWluIC0gSW5oZXJpdGFuY2UgY2hhaW4uXG4gICAqIEByZXR1cm5zIHsobmV3IChhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgPz4pID0+ID8pIHwgbnVsbH0gLSBUaGUgbW9kZWwgY2xhc3MsIG9yIG51bGwuXG4gICAqL1xuICBfcmVzb2x2ZU1vZGVsQ2xhc3MoY2hhaW4pIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IGNoYWluLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbiAgICAgIGlmIChjaGFpbltpbmRleF0ubW9kZWxDbGFzcykgcmV0dXJuIGNoYWluW2luZGV4XS5tb2RlbENsYXNzXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzIG9uZSBmYWN0b3J5J3Mgb3duIGRlY2xhcmF0aW9ucywgaW5saW5pbmcgYmFzZS10cmFpdCBpbmNsdXNpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IGZhY3RvcnlEZWZpbml0aW9uIC0gRmFjdG9yeSB3aG9zZSBkZWNsYXJhdGlvbnMgYXJlIGV4cGFuZGVkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IHNjb3BlIC0gVGFyZ2V0IGZhY3RvcnkgKGZvciBsb2NhbC10cmFpdCByZXNvbHV0aW9uKS5cbiAgICogQHBhcmFtIHtBcnJheTx7ZGVjbDogaW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuRGVjbGFyYXRpb259Pn0gb3V0IC0gRmxhdHRlbmVkIG91dHB1dCBzaW5rLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9leHBhbmRGYWN0b3J5RGVjbGFyYXRpb25zKGZhY3RvcnlEZWZpbml0aW9uLCBzY29wZSwgb3V0KSB7XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBmYWN0b3J5RGVmaW5pdGlvbi5kZWNsYXJhdGlvbnMpIHtcbiAgICAgIGlmIChkZWNsYXJhdGlvbi5raW5kID09PSBcInRyYWl0SW5jbHVkZVwiKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZFRyYWl0KGRlY2xhcmF0aW9uLm5hbWUsIHNjb3BlLCBvdXQsIFtdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0LnB1c2goe2RlY2w6IGRlY2xhcmF0aW9ufSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kcyBhIHRyYWl0IChyZXNvbHZpbmcgZmFjdG9yeS1sb2NhbCBiZWZvcmUgZ2xvYmFsKSBhbmQgaXRzIGluY2x1c2lvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFpdE5hbWUgLSBUcmFpdCB0byBleHBhbmQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gc2NvcGUgLSBUYXJnZXQgZmFjdG9yeSAoZm9yIGxvY2FsLXRyYWl0IHJlc29sdXRpb24pLlxuICAgKiBAcGFyYW0ge0FycmF5PHtkZWNsOiBpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbn0+fSBvdXQgLSBGbGF0dGVuZWQgb3V0cHV0IHNpbmsuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFjdGl2ZVBhdGggLSBUcmFpdCBpbmNsdXNpb24gcGF0aCAoZm9yIGN5Y2xlIGRldGVjdGlvbikuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2V4cGFuZFRyYWl0KHRyYWl0TmFtZSwgc2NvcGUsIG91dCwgYWN0aXZlUGF0aCkge1xuICAgIGlmIChhY3RpdmVQYXRoLmluY2x1ZGVzKHRyYWl0TmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBGYWN0b3J5Q3ljbGVFcnJvcihgVHJhaXQgaW5jbHVzaW9uIGN5Y2xlIGRldGVjdGVkOiAke1suLi5hY3RpdmVQYXRoLCB0cmFpdE5hbWVdLmpvaW4oXCIgLT4gXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxUcmFpdCA9IHRoaXMuX3Jlc29sdmVMb2NhbFRyYWl0KHRyYWl0TmFtZSwgc2NvcGUpXG4gICAgY29uc3QgdHJhaXQgPSBsb2NhbFRyYWl0Py50cmFpdCB8fCB0aGlzLnJlZ2lzdHJ5Ll9nbG9iYWxUcmFpdHMuZ2V0KHRyYWl0TmFtZSlcbiAgICBjb25zdCBpbmNsdXNpb25TY29wZSA9IGxvY2FsVHJhaXQ/LnNjb3BlIHx8IHNjb3BlXG5cbiAgICBpZiAoIXRyYWl0KSB7XG4gICAgICB0aHJvdyBuZXcgVW5kZWZpbmVkVHJhaXRFcnJvcihgTm8gdHJhaXQgcmVnaXN0ZXJlZCBjYWxsZWQgXCIke3RyYWl0TmFtZX1cIiBmb3IgZmFjdG9yeSBcIiR7c2NvcGUubmFtZX1cImApXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB0cmFpdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgIGlmIChkZWNsYXJhdGlvbi5raW5kID09PSBcInRyYWl0SW5jbHVkZVwiKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuZFRyYWl0KGRlY2xhcmF0aW9uLm5hbWUsIGluY2x1c2lvblNjb3BlLCBvdXQsIFsuLi5hY3RpdmVQYXRoLCB0cmFpdE5hbWVdKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0LnB1c2goe2RlY2w6IGRlY2xhcmF0aW9ufSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBsb2NhbCB0cmFpdCBmcm9tIHRoZSBjdXJyZW50IGZhY3RvcnkgdXB3YXJkIHRocm91Z2ggaXRzIHBhcmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmFpdE5hbWUgLSBUcmFpdCBuYW1lIHRvIHJlc29sdmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gc2NvcGUgLSBEZWNsYXJpbmcvcmVxdWVzdGluZyBmYWN0b3J5IHNjb3BlLlxuICAgKiBAcmV0dXJucyB7e3RyYWl0OiBpbXBvcnQoXCIuL3RyYWl0LWRlZmluaXRpb24uanNcIikuZGVmYXVsdCwgc2NvcGU6IGltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IHwgdW5kZWZpbmVkfSAtIE5lYXJlc3QgbG9jYWwgdHJhaXQgYW5kIGl0cyBkZWNsYXJpbmcgc2NvcGUsIGlmIGFueS5cbiAgICovXG4gIF9yZXNvbHZlTG9jYWxUcmFpdCh0cmFpdE5hbWUsIHNjb3BlKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBjdXJyZW50ID0gc2NvcGVcblxuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICBjb25zdCB0cmFpdCA9IGN1cnJlbnQubG9jYWxUcmFpdHMuZ2V0KHRyYWl0TmFtZSlcblxuICAgICAgaWYgKHRyYWl0KSByZXR1cm4ge3RyYWl0LCBzY29wZTogY3VycmVudH1cblxuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50TmFtZSA/IHRoaXMuX3Jlc29sdmVGYWN0b3J5KGN1cnJlbnQucGFyZW50TmFtZSkgOiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogRm9sZHMgZmxhdHRlbmVkIGRlY2xhcmF0aW9ucyBwbHVzIG92ZXJyaWRlcyBpbnRvIGEgY29tcGlsZWQgcGxhbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge0FycmF5PHtkZWNsOiBpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbn0+fSBhcmdzLmZsYXR0ZW5lZCAtIEZsYXR0ZW5lZCBkZWNsYXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IGFyZ3Mub3ZlcnJpZGVzIC0gQ2FsbC1zaXRlIG92ZXJyaWRlcy5cbiAgICogQHBhcmFtIHsobmV3IChhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgPz4pID0+ID8pIHwgbnVsbH0gYXJncy5tb2RlbENsYXNzIC0gUmVzb2x2ZWQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gYXJncy50YXJnZXQgLSBUYXJnZXQgZmFjdG9yeSBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLmNoYWluTmFtZXMgLSBJbmhlcml0YW5jZSBjaGFpbiBuYW1lcy5cbiAgICogQHJldHVybnMge0NvbXBpbGVkUGxhbn0gLSBUaGUgY29tcGlsZWQgcGxhbi5cbiAgICovXG4gIF9idWlsZFBsYW4oe2ZsYXR0ZW5lZCwgb3ZlcnJpZGVzLCBtb2RlbENsYXNzLCB0YXJnZXQsIGNoYWluTmFtZXN9KSB7XG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTbG90Pn0gKi9cbiAgICBjb25zdCByZXNvbHZlZCA9IG5ldyBNYXAoKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuQ2FsbGJhY2tEZWNsYXJhdGlvbltdPn0gKi9cbiAgICBjb25zdCBjYWxsYmFja3MgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge1NldDxpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5DYWxsYmFja0RlY2xhcmF0aW9uPn0gKi9cbiAgICBjb25zdCBzZWVuQ2FsbGJhY2tzID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5Jbml0aWFsaXplV2l0aERlY2xhcmF0aW9uW1wiZm5cIl0gfCBudWxsfSAqL1xuICAgIGxldCBpbml0aWFsaXplV2l0aCA9IG51bGxcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLlRvQ3JlYXRlRGVjbGFyYXRpb25bXCJmblwiXSB8IG51bGx9ICovXG4gICAgbGV0IHRvQ3JlYXRlID0gbnVsbFxuICAgIGxldCBza2lwQ3JlYXRlID0gZmFsc2VcblxuICAgIGZvciAoY29uc3Qge2RlY2x9IG9mIGZsYXR0ZW5lZCkge1xuICAgICAgaWYgKGRlY2wua2luZCA9PT0gXCJhdHRyaWJ1dGVcIikge1xuICAgICAgICByZXNvbHZlZC5zZXQoZGVjbC5uYW1lLCB7c2xvdEtpbmQ6IGRlY2wuaXNUcmFuc2llbnQgPyBcInRyYW5zaWVudFwiIDogXCJhdHRyaWJ1dGVcIiwgdmFsdWU6IGRlY2wudmFsdWUsIGlzT3ZlcnJpZGU6IGZhbHNlfSlcbiAgICAgIH0gZWxzZSBpZiAoZGVjbC5raW5kID09PSBcImFzc29jaWF0aW9uXCIpIHtcbiAgICAgICAgcmVzb2x2ZWQuc2V0KGRlY2wubmFtZSwge3Nsb3RLaW5kOiBcImFzc29jaWF0aW9uXCIsIHZhbHVlOiBkZWNsLCBpc092ZXJyaWRlOiBmYWxzZX0pXG4gICAgICB9IGVsc2UgaWYgKGRlY2wua2luZCA9PT0gXCJjYWxsYmFja1wiKSB7XG4gICAgICAgIGlmICghc2VlbkNhbGxiYWNrcy5oYXMoZGVjbCkpIHtcbiAgICAgICAgICBzZWVuQ2FsbGJhY2tzLmFkZChkZWNsKVxuXG4gICAgICAgICAgY29uc3QgZXZlbnRDYWxsYmFja3MgPSBjYWxsYmFja3MuZ2V0KGRlY2wuZXZlbnQpIHx8IFtdXG5cbiAgICAgICAgICBldmVudENhbGxiYWNrcy5wdXNoKGRlY2wpXG4gICAgICAgICAgY2FsbGJhY2tzLnNldChkZWNsLmV2ZW50LCBldmVudENhbGxiYWNrcylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkZWNsLmtpbmQgPT09IFwiaW5pdGlhbGl6ZVdpdGhcIikge1xuICAgICAgICBpbml0aWFsaXplV2l0aCA9IGRlY2wuZm5cbiAgICAgIH0gZWxzZSBpZiAoZGVjbC5raW5kID09PSBcInRvQ3JlYXRlXCIpIHtcbiAgICAgICAgdG9DcmVhdGUgPSBkZWNsLmZuXG4gICAgICB9IGVsc2UgaWYgKGRlY2wua2luZCA9PT0gXCJza2lwQ3JlYXRlXCIpIHtcbiAgICAgICAgc2tpcENyZWF0ZSA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdmVycmlkZXMpKSB7XG4gICAgICBjb25zdCBwcmlvciA9IHJlc29sdmVkLmdldChrZXkpXG5cbiAgICAgIHJlc29sdmVkLnNldChrZXksIHtzbG90S2luZDogcHJpb3IgPyBwcmlvci5zbG90S2luZCA6IFwiYXR0cmlidXRlXCIsIHZhbHVlOiBvdmVycmlkZXNba2V5XSwgaXNPdmVycmlkZTogdHJ1ZX0pXG4gICAgfVxuXG4gICAgdGhpcy5fYXJiaXRyYXRlQXNzb2NpYXRpb25PdmVycmlkZXMocmVzb2x2ZWQsIG92ZXJyaWRlcywgbW9kZWxDbGFzcylcblxuICAgIHJldHVybiB7XG4gICAgICBmYWN0b3J5TmFtZTogdGFyZ2V0Lm5hbWUsXG4gICAgICBmYWN0b3J5RGVmaW5pdGlvbjogdGFyZ2V0LFxuICAgICAgbW9kZWxDbGFzcyxcbiAgICAgIGNoYWluTmFtZXMsXG4gICAgICByZXNvbHZlZCxcbiAgICAgIGNhbGxiYWNrcyxcbiAgICAgIGluaXRpYWxpemVXaXRoLFxuICAgICAgdG9DcmVhdGUsXG4gICAgICBza2lwQ3JlYXRlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYmVsb25ncy10byBvdmVycmlkZSBwcmVjZWRlbmNlIHVzaW5nIHRoZSBkZWNsYXJlZCBtb2RlbCByZWxhdGlvbnNoaXAnc1xuICAgKiByZWFsIGZvcmVpZ24ta2V5IG1ldGFkYXRhLiBBbiBleHBsaWNpdCBhc3NvY2lhdGlvbiBvYmplY3Qgd2lucyBvdmVyIGl0cyBrZXk7XG4gICAqIG90aGVyd2lzZSBhbiBleHBsaWNpdCBrZXkgc3VwcHJlc3NlcyB0aGUgZmFjdG9yeS1kZWNsYXJlZCBhc3NvY2lhdGlvbi5cbiAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTbG90Pn0gcmVzb2x2ZWQgLSBGb2xkZWQgc2xvdHMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG92ZXJyaWRlcyAtIENhbGwtc2l0ZSBvdmVycmlkZXMuXG4gICAqIEBwYXJhbSB7KG5ldyAoYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsID8+KSA9PiA/KSB8IG51bGx9IG1vZGVsQ2xhc3MgLSBSZXNvbHZlZCBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfYXJiaXRyYXRlQXNzb2NpYXRpb25PdmVycmlkZXMocmVzb2x2ZWQsIG92ZXJyaWRlcywgbW9kZWxDbGFzcykge1xuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcyAhPT0gXCJmdW5jdGlvblwiIHx8ICEobW9kZWxDbGFzcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBEYXRhYmFzZVJlY29yZCkpIHJldHVyblxuXG4gICAgY29uc3QgYmFja2VuZE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge3R5cGVvZiBEYXRhYmFzZVJlY29yZH0gKi8gKG1vZGVsQ2xhc3MpXG4gICAgY29uc3QgY29sdW1uVG9BdHRyaWJ1dGUgPSBiYWNrZW5kTW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lVG9BdHRyaWJ1dGVOYW1lTWFwKClcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHNsb3RdIG9mIFsuLi5yZXNvbHZlZF0pIHtcbiAgICAgIGlmIChzbG90LnNsb3RLaW5kICE9PSBcImFzc29jaWF0aW9uXCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IGJhY2tlbmRNb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShuYW1lKVxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSAhPT0gXCJiZWxvbmdzVG9cIikgY29udGludWVcblxuICAgICAgY29uc3QgZm9yZWlnbktleUNvbHVtbiA9IHJlbGF0aW9uc2hpcC5nZXRGb3JlaWduS2V5KClcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlBdHRyaWJ1dGUgPSBjb2x1bW5Ub0F0dHJpYnV0ZVtmb3JlaWduS2V5Q29sdW1uXSB8fCBmb3JlaWduS2V5Q29sdW1uXG5cbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihvdmVycmlkZXMsIGZvcmVpZ25LZXlBdHRyaWJ1dGUpKSBjb250aW51ZVxuXG4gICAgICBpZiAoc2xvdC5pc092ZXJyaWRlKSB7XG4gICAgICAgIHJlc29sdmVkLmRlbGV0ZShmb3JlaWduS2V5QXR0cmlidXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZWQuZGVsZXRlKG5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVzdGluZy9mYWN0b3J5L2ZhY3RvcnktcnVubmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUMzRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFFekY7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7O09BR0c7SUFDSCxZQUFZLFFBQVE7UUFDbEIseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQzFCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxTQUFTO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUMzRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsV0FBVyxFQUFFLGVBQWU7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM3QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUN0QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFakQscUVBQXFFO1FBQ3JFLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQTtRQUVwQixLQUFLLE1BQU0sV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVB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QUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUM7Z0JBQUUsU0FBUTtZQUU1RCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1lBQ3RDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBEYXRhYmFzZVJlY29yZCBmcm9tIFwiLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbmltcG9ydCB7RmFjdG9yeUN5Y2xlRXJyb3IsIFVuZGVmaW5lZEZhY3RvcnlFcnJvciwgVW5kZWZpbmVkVHJhaXRFcnJvcn0gZnJvbSBcIi4vZXJyb3JzLmpzXCJcblxuLyoqXG4gKiBBIHJlc29sdmVkIGF0dHJpYnV0ZS90cmFuc2llbnQvYXNzb2NpYXRpb24gc2xvdCBpbiBhIGNvbXBpbGVkIHBsYW4uXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTbG90XG4gKiBAcHJvcGVydHkge1wiYXR0cmlidXRlXCIgfCBcInRyYW5zaWVudFwiIHwgXCJhc3NvY2lhdGlvblwifSBzbG90S2luZCAtIFNsb3QgbmF0dXJlLlxuICogQHByb3BlcnR5IHs/fSB2YWx1ZSAtIExpdGVyYWwvbGF6eSB2YWx1ZSwgb3ZlcnJpZGUgdmFsdWUsIG9yIEFzc29jaWF0aW9uRGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzT3ZlcnJpZGUgLSBXaGV0aGVyIHRoZSB2YWx1ZSBjYW1lIGZyb20gYSBjYWxsLXNpdGUgb3ZlcnJpZGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgaW1tdXRhYmxlIHJlc3VsdCBvZiBjb21waWxpbmcgYSBmYWN0b3J5IGludm9jYXRpb24uXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21waWxlZFBsYW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIFRhcmdldCBmYWN0b3J5IG5hbWUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IGZhY3RvcnlEZWZpbml0aW9uIC0gVGFyZ2V0IGRlZmluaXRpb24uXG4gKiBAcHJvcGVydHkgeyhuZXcgKGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gPykgfCBudWxsfSBtb2RlbENsYXNzIC0gUmVzb2x2ZWQgbW9kZWwgY2xhc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBjaGFpbk5hbWVzIC0gSW5oZXJpdGFuY2UgY2hhaW4gbmFtZXMgKGNoaWxkIGxhc3QpIGZvciBzZXF1ZW5jZSBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgU2xvdD59IHJlc29sdmVkIC0gTmFtZeKGknNsb3QgbWFwIChsYXN0IGRlY2xhcmF0aW9uIHdpbnMpLlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5DYWxsYmFja0RlY2xhcmF0aW9uW10+fSBjYWxsYmFja3MgLSBEZWR1cGVkIGNhbGxiYWNrcyBieSBldmVudC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuSW5pdGlhbGl6ZVdpdGhEZWNsYXJhdGlvbltcImZuXCJdIHwgbnVsbH0gaW5pdGlhbGl6ZVdpdGggLSBDdXN0b20gY29uc3RydWN0b3IsIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLlRvQ3JlYXRlRGVjbGFyYXRpb25bXCJmblwiXSB8IG51bGx9IHRvQ3JlYXRlIC0gQ3VzdG9tIHBlcnNpc3RlbmNlLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtib29sZWFufSBza2lwQ3JlYXRlIC0gV2hldGhlciBwZXJzaXN0ZW5jZSBpcyBza2lwcGVkLlxuICovXG5cbi8qKlxuICogQ29tcGlsZXMgZmFjdG9yeSBpbnZvY2F0aW9ucyBpbnRvIGltbXV0YWJsZSBwbGFucyBieSByZXNvbHZpbmcgdGhlIGluaGVyaXRhbmNlXG4gKiBjaGFpbiwgZXhwYW5kaW5nIGJhc2UgYW5kIHJlcXVlc3RlZCB0cmFpdHMsIGFuZCBmb2xkaW5nIGRlY2xhcmF0aW9ucyBpbnRvIGFcbiAqIG5hbWXihpJzbG90IG1hcCBwbHVzIGEgZGVkdXBlZCwgb3JkZXJlZCBjYWxsYmFjayBzZXQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZhY3RvcnlSdW5uZXIge1xuICAvKipcbiAgICogQnVpbGRzIGEgcnVubmVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZmFjdG9yeS1yZWdpc3RyeS5qc1wiKS5kZWZhdWx0fSByZWdpc3RyeSAtIE93bmluZyByZWdpc3RyeS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5KSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2ZhY3RvcnktcmVnaXN0cnkuanNcIikuZGVmYXVsdH0gLSBPd25pbmcgcmVnaXN0cnkuICovXG4gICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5XG4gIH1cblxuICAvKipcbiAgICogQ29tcGlsZXMgYSBmYWN0b3J5IGludm9jYXRpb24gaW50byBhIHBsYW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgdG8gcnVuLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSByZXF1ZXN0ZWRUcmFpdHMgLSBUcmFpdHMgcmVxdWVzdGVkIGF0IHRoZSBjYWxsIHNpdGUsIGluIG9yZGVyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBvdmVycmlkZXMgLSBDYWxsLXNpdGUgb3ZlcnJpZGVzIChoaWdoZXN0IHByZWNlZGVuY2UpLlxuICAgKiBAcmV0dXJucyB7Q29tcGlsZWRQbGFufSAtIFRoZSBjb21waWxlZCBwbGFuLlxuICAgKi9cbiAgY29tcGlsZShmYWN0b3J5TmFtZSwgcmVxdWVzdGVkVHJhaXRzLCBvdmVycmlkZXMpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBseU92ZXJyaWRlcyh0aGlzLmNvbXBpbGVUZW1wbGF0ZShmYWN0b3J5TmFtZSwgcmVxdWVzdGVkVHJhaXRzKSwgb3ZlcnJpZGVzKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBpbGVzIGluaGVyaXRhbmNlLCB0cmFpdHMgYW5kIGRlY2xhcmF0aW9ucyB3aXRob3V0IGNhbGwtc2l0ZSBvdmVycmlkZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgdG8gcnVuLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSByZXF1ZXN0ZWRUcmFpdHMgLSBUcmFpdHMgcmVxdWVzdGVkIGF0IHRoZSBjYWxsIHNpdGUsIGluIG9yZGVyLlxuICAgKiBAcmV0dXJucyB7Q29tcGlsZWRQbGFufSAtIFJldXNhYmxlIGRlY2xhcmF0aW9uIHBsYW4uXG4gICAqL1xuICBjb21waWxlVGVtcGxhdGUoZmFjdG9yeU5hbWUsIHJlcXVlc3RlZFRyYWl0cykge1xuICAgIGNvbnN0IGNoYWluID0gdGhpcy5fcmVzb2x2ZUNoYWluKGZhY3RvcnlOYW1lKVxuICAgIGNvbnN0IHRhcmdldCA9IGNoYWluW2NoYWluLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IHRoaXMuX3Jlc29sdmVNb2RlbENsYXNzKGNoYWluKVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7ZGVjbDogaW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuRGVjbGFyYXRpb259Pn0gKi9cbiAgICBjb25zdCBmbGF0dGVuZWQgPSBbXVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB0aGlzLnJlZ2lzdHJ5Ll9nbG9iYWxEZWNsYXJhdGlvbnMpIHtcbiAgICAgIGZsYXR0ZW5lZC5wdXNoKHtkZWNsOiBkZWNsYXJhdGlvbn0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmYWN0b3J5RGVmaW5pdGlvbiBvZiBjaGFpbikge1xuICAgICAgdGhpcy5fZXhwYW5kRmFjdG9yeURlY2xhcmF0aW9ucyhmYWN0b3J5RGVmaW5pdGlvbiwgZmFjdG9yeURlZmluaXRpb24sIGZsYXR0ZW5lZClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRyYWl0TmFtZSBvZiByZXF1ZXN0ZWRUcmFpdHMpIHtcbiAgICAgIHRoaXMuX2V4cGFuZFRyYWl0KHRyYWl0TmFtZSwgdGFyZ2V0LCBmbGF0dGVuZWQsIFtdKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9idWlsZFBsYW4oe2ZsYXR0ZW5lZCwgbW9kZWxDbGFzcywgdGFyZ2V0LCBjaGFpbk5hbWVzOiBjaGFpbi5tYXAoKGRlZmluaXRpb24pID0+IGRlZmluaXRpb24ubmFtZSl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGN1cnJlbnQgY2FsbC1zaXRlIG92ZXJyaWRlcyB3aXRob3V0IG11dGF0aW5nIHRoZSByZXVzYWJsZSB0ZW1wbGF0ZS5cbiAgICogQHBhcmFtIHtDb21waWxlZFBsYW59IHBsYW5UZW1wbGF0ZSAtIFJldXNhYmxlIGRlY2xhcmF0aW9uIHBsYW4uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IG92ZXJyaWRlcyAtIEN1cnJlbnQgY2FsbC1zaXRlIG92ZXJyaWRlcy5cbiAgICogQHJldHVybnMge0NvbXBpbGVkUGxhbn0gLSBQZXItaW52b2NhdGlvbiBwbGFuLlxuICAgKi9cbiAgYXBwbHlPdmVycmlkZXMocGxhblRlbXBsYXRlLCBvdmVycmlkZXMpIHtcbiAgICBjb25zdCBvdmVycmlkZUtleXMgPSBPYmplY3Qua2V5cyhvdmVycmlkZXMpXG5cbiAgICBpZiAob3ZlcnJpZGVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHBsYW5UZW1wbGF0ZVxuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgTWFwKHBsYW5UZW1wbGF0ZS5yZXNvbHZlZClcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIG92ZXJyaWRlS2V5cykge1xuICAgICAgY29uc3QgcHJpb3IgPSByZXNvbHZlZC5nZXQoa2V5KVxuXG4gICAgICByZXNvbHZlZC5zZXQoa2V5LCB7c2xvdEtpbmQ6IHByaW9yID8gcHJpb3Iuc2xvdEtpbmQgOiBcImF0dHJpYnV0ZVwiLCB2YWx1ZTogb3ZlcnJpZGVzW2tleV0sIGlzT3ZlcnJpZGU6IHRydWV9KVxuICAgIH1cblxuICAgIHRoaXMuX2FyYml0cmF0ZUFzc29jaWF0aW9uT3ZlcnJpZGVzKHJlc29sdmVkLCBvdmVycmlkZXMsIHBsYW5UZW1wbGF0ZS5tb2RlbENsYXNzKVxuXG4gICAgcmV0dXJuIHsuLi5wbGFuVGVtcGxhdGUsIHJlc29sdmVkfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBpbmhlcml0YW5jZSBjaGFpbiBmcm9tIHRoZSByb290IHBhcmVudCBkb3duIHRvIHRoZSB0YXJnZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIFRhcmdldCBmYWN0b3J5IG5hbWUuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0W119IC0gQ2hhaW4gKHJvb3QgZmlyc3QsIHRhcmdldCBsYXN0KS5cbiAgICovXG4gIF9yZXNvbHZlQ2hhaW4oZmFjdG9yeU5hbWUpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHRbXX0gKi9cbiAgICBjb25zdCBjaGFpbiA9IFtdXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0IHwgbnVsbH0gKi9cbiAgICBsZXQgY3VycmVudCA9IHRoaXMuX3Jlc29sdmVGYWN0b3J5KGZhY3RvcnlOYW1lKVxuXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGlmIChzZWVuLmhhcyhjdXJyZW50Lm5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBGYWN0b3J5Q3ljbGVFcnJvcihgRmFjdG9yeSBpbmhlcml0YW5jZSBjeWNsZSBkZXRlY3RlZDogJHtbLi4uc2VlbiwgY3VycmVudC5uYW1lXS5qb2luKFwiIC0+IFwiKX1gKVxuICAgICAgfVxuXG4gICAgICBzZWVuLmFkZChjdXJyZW50Lm5hbWUpXG4gICAgICBjaGFpbi51bnNoaWZ0KGN1cnJlbnQpXG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnROYW1lID8gdGhpcy5fcmVzb2x2ZUZhY3RvcnkoY3VycmVudC5wYXJlbnROYW1lKSA6IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGZhY3RvcnkgZGVmaW5pdGlvbiBieSBuYW1lIChvciBhbGlhcykuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYWN0b3J5TmFtZSAtIEZhY3RvcnkgbmFtZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHR9IC0gVGhlIGRlZmluaXRpb24uXG4gICAqL1xuICBfcmVzb2x2ZUZhY3RvcnkoZmFjdG9yeU5hbWUpIHtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gdGhpcy5yZWdpc3RyeS5fZmFjdG9yaWVzLmdldChmYWN0b3J5TmFtZSlcblxuICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFVuZGVmaW5lZEZhY3RvcnlFcnJvcihgTm8gZmFjdG9yeSByZWdpc3RlcmVkIGNhbGxlZCBcIiR7ZmFjdG9yeU5hbWV9XCIuIFJlZ2lzdGVyZWQ6ICR7Wy4uLnRoaXMucmVnaXN0cnkuX2ZhY3Rvcmllcy5rZXlzKCldLmpvaW4oXCIsIFwiKSB8fCBcIihub25lKVwifWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluaXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgbmVhcmVzdCBkZWNsYXJlZCBtb2RlbCBjbGFzcyBpbiB0aGUgY2hhaW4gKGNoaWxkIG92ZXJyaWRlcyBwYXJlbnQpLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHRbXX0gY2hhaW4gLSBJbmhlcml0YW5jZSBjaGFpbi5cbiAgICogQHJldHVybnMgeyhuZXcgKGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCA/PikgPT4gPykgfCBudWxsfSAtIFRoZSBtb2RlbCBjbGFzcywgb3IgbnVsbC5cbiAgICovXG4gIF9yZXNvbHZlTW9kZWxDbGFzcyhjaGFpbikge1xuICAgIGZvciAobGV0IGluZGV4ID0gY2hhaW4ubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgaWYgKGNoYWluW2luZGV4XS5tb2RlbENsYXNzKSByZXR1cm4gY2hhaW5baW5kZXhdLm1vZGVsQ2xhc3NcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZHMgb25lIGZhY3RvcnkncyBvd24gZGVjbGFyYXRpb25zLCBpbmxpbmluZyBiYXNlLXRyYWl0IGluY2x1c2lvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gZmFjdG9yeURlZmluaXRpb24gLSBGYWN0b3J5IHdob3NlIGRlY2xhcmF0aW9ucyBhcmUgZXhwYW5kZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gc2NvcGUgLSBUYXJnZXQgZmFjdG9yeSAoZm9yIGxvY2FsLXRyYWl0IHJlc29sdXRpb24pLlxuICAgKiBAcGFyYW0ge0FycmF5PHtkZWNsOiBpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5EZWNsYXJhdGlvbn0+fSBvdXQgLSBGbGF0dGVuZWQgb3V0cHV0IHNpbmsuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX2V4cGFuZEZhY3RvcnlEZWNsYXJhdGlvbnMoZmFjdG9yeURlZmluaXRpb24sIHNjb3BlLCBvdXQpIHtcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGZhY3RvcnlEZWZpbml0aW9uLmRlY2xhcmF0aW9ucykge1xuICAgICAgaWYgKGRlY2xhcmF0aW9uLmtpbmQgPT09IFwidHJhaXRJbmNsdWRlXCIpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kVHJhaXQoZGVjbGFyYXRpb24ubmFtZSwgc2NvcGUsIG91dCwgW10pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQucHVzaCh7ZGVjbDogZGVjbGFyYXRpb259KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmRzIGEgdHJhaXQgKHJlc29sdmluZyBmYWN0b3J5LWxvY2FsIGJlZm9yZSBnbG9iYWwpIGFuZCBpdHMgaW5jbHVzaW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYWl0TmFtZSAtIFRyYWl0IHRvIGV4cGFuZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0fSBzY29wZSAtIFRhcmdldCBmYWN0b3J5IChmb3IgbG9jYWwtdHJhaXQgcmVzb2x1dGlvbikuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2RlY2w6IGltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkRlY2xhcmF0aW9ufT59IG91dCAtIEZsYXR0ZW5lZCBvdXRwdXQgc2luay5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYWN0aXZlUGF0aCAtIFRyYWl0IGluY2x1c2lvbiBwYXRoIChmb3IgY3ljbGUgZGV0ZWN0aW9uKS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfZXhwYW5kVHJhaXQodHJhaXROYW1lLCBzY29wZSwgb3V0LCBhY3RpdmVQYXRoKSB7XG4gICAgaWYgKGFjdGl2ZVBhdGguaW5jbHVkZXModHJhaXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEZhY3RvcnlDeWNsZUVycm9yKGBUcmFpdCBpbmNsdXNpb24gY3ljbGUgZGV0ZWN0ZWQ6ICR7Wy4uLmFjdGl2ZVBhdGgsIHRyYWl0TmFtZV0uam9pbihcIiAtPiBcIil9YClcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhbFRyYWl0ID0gdGhpcy5fcmVzb2x2ZUxvY2FsVHJhaXQodHJhaXROYW1lLCBzY29wZSlcbiAgICBjb25zdCB0cmFpdCA9IGxvY2FsVHJhaXQ/LnRyYWl0IHx8IHRoaXMucmVnaXN0cnkuX2dsb2JhbFRyYWl0cy5nZXQodHJhaXROYW1lKVxuICAgIGNvbnN0IGluY2x1c2lvblNjb3BlID0gbG9jYWxUcmFpdD8uc2NvcGUgfHwgc2NvcGVcblxuICAgIGlmICghdHJhaXQpIHtcbiAgICAgIHRocm93IG5ldyBVbmRlZmluZWRUcmFpdEVycm9yKGBObyB0cmFpdCByZWdpc3RlcmVkIGNhbGxlZCBcIiR7dHJhaXROYW1lfVwiIGZvciBmYWN0b3J5IFwiJHtzY29wZS5uYW1lfVwiYClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHRyYWl0LmRlY2xhcmF0aW9ucykge1xuICAgICAgaWYgKGRlY2xhcmF0aW9uLmtpbmQgPT09IFwidHJhaXRJbmNsdWRlXCIpIHtcbiAgICAgICAgdGhpcy5fZXhwYW5kVHJhaXQoZGVjbGFyYXRpb24ubmFtZSwgaW5jbHVzaW9uU2NvcGUsIG91dCwgWy4uLmFjdGl2ZVBhdGgsIHRyYWl0TmFtZV0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQucHVzaCh7ZGVjbDogZGVjbGFyYXRpb259KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGxvY2FsIHRyYWl0IGZyb20gdGhlIGN1cnJlbnQgZmFjdG9yeSB1cHdhcmQgdGhyb3VnaCBpdHMgcGFyZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyYWl0TmFtZSAtIFRyYWl0IG5hbWUgdG8gcmVzb2x2ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2ZhY3RvcnktZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0fSBzY29wZSAtIERlY2xhcmluZy9yZXF1ZXN0aW5nIGZhY3Rvcnkgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt7dHJhaXQ6IGltcG9ydChcIi4vdHJhaXQtZGVmaW5pdGlvbi5qc1wiKS5kZWZhdWx0LCBzY29wZTogaW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gfCB1bmRlZmluZWR9IC0gTmVhcmVzdCBsb2NhbCB0cmFpdCBhbmQgaXRzIGRlY2xhcmluZyBzY29wZSwgaWYgYW55LlxuICAgKi9cbiAgX3Jlc29sdmVMb2NhbFRyYWl0KHRyYWl0TmFtZSwgc2NvcGUpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vZmFjdG9yeS1kZWZpbml0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGN1cnJlbnQgPSBzY29wZVxuXG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IHRyYWl0ID0gY3VycmVudC5sb2NhbFRyYWl0cy5nZXQodHJhaXROYW1lKVxuXG4gICAgICBpZiAodHJhaXQpIHJldHVybiB7dHJhaXQsIHNjb3BlOiBjdXJyZW50fVxuXG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnROYW1lID8gdGhpcy5fcmVzb2x2ZUZhY3RvcnkoY3VycmVudC5wYXJlbnROYW1lKSA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2xkcyBmbGF0dGVuZWQgZGVjbGFyYXRpb25zIGludG8gYSByZXVzYWJsZSBjb21waWxlZCBwbGFuLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7QXJyYXk8e2RlY2w6IGltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkRlY2xhcmF0aW9ufT59IGFyZ3MuZmxhdHRlbmVkIC0gRmxhdHRlbmVkIGRlY2xhcmF0aW9ucy5cbiAgICogQHBhcmFtIHsobmV3IChhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgPz4pID0+ID8pIHwgbnVsbH0gYXJncy5tb2RlbENsYXNzIC0gUmVzb2x2ZWQgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9mYWN0b3J5LWRlZmluaXRpb24uanNcIikuZGVmYXVsdH0gYXJncy50YXJnZXQgLSBUYXJnZXQgZmFjdG9yeSBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzLmNoYWluTmFtZXMgLSBJbmhlcml0YW5jZSBjaGFpbiBuYW1lcy5cbiAgICogQHJldHVybnMge0NvbXBpbGVkUGxhbn0gLSBUaGUgY29tcGlsZWQgcGxhbi5cbiAgICovXG4gIF9idWlsZFBsYW4oe2ZsYXR0ZW5lZCwgbW9kZWxDbGFzcywgdGFyZ2V0LCBjaGFpbk5hbWVzfSkge1xuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgU2xvdD59ICovXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vZGVjbGFyYXRpb25zLmpzXCIpLkNhbGxiYWNrRGVjbGFyYXRpb25bXT59ICovXG4gICAgY29uc3QgY2FsbGJhY2tzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtTZXQ8aW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuQ2FsbGJhY2tEZWNsYXJhdGlvbj59ICovXG4gICAgY29uc3Qgc2VlbkNhbGxiYWNrcyA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9kZWNsYXJhdGlvbnMuanNcIikuSW5pdGlhbGl6ZVdpdGhEZWNsYXJhdGlvbltcImZuXCJdIHwgbnVsbH0gKi9cbiAgICBsZXQgaW5pdGlhbGl6ZVdpdGggPSBudWxsXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RlY2xhcmF0aW9ucy5qc1wiKS5Ub0NyZWF0ZURlY2xhcmF0aW9uW1wiZm5cIl0gfCBudWxsfSAqL1xuICAgIGxldCB0b0NyZWF0ZSA9IG51bGxcbiAgICBsZXQgc2tpcENyZWF0ZSA9IGZhbHNlXG5cbiAgICBmb3IgKGNvbnN0IHtkZWNsfSBvZiBmbGF0dGVuZWQpIHtcbiAgICAgIGlmIChkZWNsLmtpbmQgPT09IFwiYXR0cmlidXRlXCIpIHtcbiAgICAgICAgcmVzb2x2ZWQuc2V0KGRlY2wubmFtZSwge3Nsb3RLaW5kOiBkZWNsLmlzVHJhbnNpZW50ID8gXCJ0cmFuc2llbnRcIiA6IFwiYXR0cmlidXRlXCIsIHZhbHVlOiBkZWNsLnZhbHVlLCBpc092ZXJyaWRlOiBmYWxzZX0pXG4gICAgICB9IGVsc2UgaWYgKGRlY2wua2luZCA9PT0gXCJhc3NvY2lhdGlvblwiKSB7XG4gICAgICAgIHJlc29sdmVkLnNldChkZWNsLm5hbWUsIHtzbG90S2luZDogXCJhc3NvY2lhdGlvblwiLCB2YWx1ZTogZGVjbCwgaXNPdmVycmlkZTogZmFsc2V9KVxuICAgICAgfSBlbHNlIGlmIChkZWNsLmtpbmQgPT09IFwiY2FsbGJhY2tcIikge1xuICAgICAgICBpZiAoIXNlZW5DYWxsYmFja3MuaGFzKGRlY2wpKSB7XG4gICAgICAgICAgc2VlbkNhbGxiYWNrcy5hZGQoZGVjbClcblxuICAgICAgICAgIGNvbnN0IGV2ZW50Q2FsbGJhY2tzID0gY2FsbGJhY2tzLmdldChkZWNsLmV2ZW50KSB8fCBbXVxuXG4gICAgICAgICAgZXZlbnRDYWxsYmFja3MucHVzaChkZWNsKVxuICAgICAgICAgIGNhbGxiYWNrcy5zZXQoZGVjbC5ldmVudCwgZXZlbnRDYWxsYmFja3MpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGVjbC5raW5kID09PSBcImluaXRpYWxpemVXaXRoXCIpIHtcbiAgICAgICAgaW5pdGlhbGl6ZVdpdGggPSBkZWNsLmZuXG4gICAgICB9IGVsc2UgaWYgKGRlY2wua2luZCA9PT0gXCJ0b0NyZWF0ZVwiKSB7XG4gICAgICAgIHRvQ3JlYXRlID0gZGVjbC5mblxuICAgICAgfSBlbHNlIGlmIChkZWNsLmtpbmQgPT09IFwic2tpcENyZWF0ZVwiKSB7XG4gICAgICAgIHNraXBDcmVhdGUgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZhY3RvcnlOYW1lOiB0YXJnZXQubmFtZSxcbiAgICAgIGZhY3RvcnlEZWZpbml0aW9uOiB0YXJnZXQsXG4gICAgICBtb2RlbENsYXNzLFxuICAgICAgY2hhaW5OYW1lcyxcbiAgICAgIHJlc29sdmVkLFxuICAgICAgY2FsbGJhY2tzLFxuICAgICAgaW5pdGlhbGl6ZVdpdGgsXG4gICAgICB0b0NyZWF0ZSxcbiAgICAgIHNraXBDcmVhdGVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBiZWxvbmdzLXRvIG92ZXJyaWRlIHByZWNlZGVuY2UgdXNpbmcgdGhlIGRlY2xhcmVkIG1vZGVsIHJlbGF0aW9uc2hpcCdzXG4gICAqIHJlYWwgZm9yZWlnbi1rZXkgbWV0YWRhdGEuIEFuIGV4cGxpY2l0IGFzc29jaWF0aW9uIG9iamVjdCB3aW5zIG92ZXIgaXRzIGtleTtcbiAgICogb3RoZXJ3aXNlIGFuIGV4cGxpY2l0IGtleSBzdXBwcmVzc2VzIHRoZSBmYWN0b3J5LWRlY2xhcmVkIGFzc29jaWF0aW9uLlxuICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNsb3Q+fSByZXNvbHZlZCAtIEZvbGRlZCBzbG90cy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gb3ZlcnJpZGVzIC0gQ2FsbC1zaXRlIG92ZXJyaWRlcy5cbiAgICogQHBhcmFtIHsobmV3IChhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgPz4pID0+ID8pIHwgbnVsbH0gbW9kZWxDbGFzcyAtIFJlc29sdmVkIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9hcmJpdHJhdGVBc3NvY2lhdGlvbk92ZXJyaWRlcyhyZXNvbHZlZCwgb3ZlcnJpZGVzLCBtb2RlbENsYXNzKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBpZiAodHlwZW9mIG1vZGVsQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiB8fCAhKG1vZGVsQ2xhc3MucHJvdG90eXBlIGluc3RhbmNlb2YgRGF0YWJhc2VSZWNvcmQpKSByZXR1cm5cblxuICAgIGNvbnN0IGJhY2tlbmRNb2RlbENsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgRGF0YWJhc2VSZWNvcmR9ICovIChtb2RlbENsYXNzKVxuICAgIGNvbnN0IGNvbHVtblRvQXR0cmlidXRlID0gYmFja2VuZE1vZGVsQ2xhc3MuZ2V0Q29sdW1uTmFtZVRvQXR0cmlidXRlTmFtZU1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBzbG90XSBvZiBbLi4ucmVzb2x2ZWRdKSB7XG4gICAgICBpZiAoc2xvdC5zbG90S2luZCAhPT0gXCJhc3NvY2lhdGlvblwiKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBiYWNrZW5kTW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUobmFtZSlcblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgIT09IFwiYmVsb25nc1RvXCIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlDb2x1bW4gPSByZWxhdGlvbnNoaXAuZ2V0Rm9yZWlnbktleSgpXG4gICAgICBjb25zdCBmb3JlaWduS2V5QXR0cmlidXRlID0gY29sdW1uVG9BdHRyaWJ1dGVbZm9yZWlnbktleUNvbHVtbl0gfHwgZm9yZWlnbktleUNvbHVtblxuXG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24ob3ZlcnJpZGVzLCBmb3JlaWduS2V5QXR0cmlidXRlKSkgY29udGludWVcblxuICAgICAgaWYgKHNsb3QuaXNPdmVycmlkZSkge1xuICAgICAgICByZXNvbHZlZC5kZWxldGUoZm9yZWlnbktleUF0dHJpYnV0ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkLmRlbGV0ZShuYW1lKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Runs service shutdown and its completion hook while preserving both failures.
3
+ * @param {object} args - Lifecycle callbacks.
4
+ * @param {() => Promise<void>} args.shutdown - Primary service shutdown.
5
+ * @param {() => void | Promise<void>} [args.onStopped] - Completion hook.
6
+ * @returns {Promise<void>} - Resolves after shutdown and the hook finish.
7
+ */
8
+ export default function shutdownLifecycle({ shutdown, onStopped }: {
9
+ shutdown: () => Promise<void>;
10
+ onStopped?: (() => void | Promise<void>) | undefined;
11
+ }): Promise<void>;
12
+ //# sourceMappingURL=shutdown-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/utils/shutdown-lifecycle.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,mEAJG;IAAkC,QAAQ,EAAlC,MAAM,OAAO,CAAC,IAAI,CAAC;IACe,SAAS,UAArC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAClC,GAAU,OAAO,CAAC,IAAI,CAAC,CAiCzB"}
@@ -0,0 +1,36 @@
1
+ // @ts-check
2
+ /**
3
+ * Runs service shutdown and its completion hook while preserving both failures.
4
+ * @param {object} args - Lifecycle callbacks.
5
+ * @param {() => Promise<void>} args.shutdown - Primary service shutdown.
6
+ * @param {() => void | Promise<void>} [args.onStopped] - Completion hook.
7
+ * @returns {Promise<void>} - Resolves after shutdown and the hook finish.
8
+ */
9
+ export default async function shutdownLifecycle({ shutdown, onStopped }) {
10
+ let shutdownFailed = false;
11
+ let shutdownError;
12
+ try {
13
+ await shutdown();
14
+ }
15
+ catch (error) {
16
+ shutdownFailed = true;
17
+ shutdownError = error;
18
+ }
19
+ let hookFailed = false;
20
+ let hookError;
21
+ try {
22
+ await onStopped?.();
23
+ }
24
+ catch (error) {
25
+ hookFailed = true;
26
+ hookError = error;
27
+ }
28
+ if (shutdownFailed && hookFailed) {
29
+ throw new AggregateError([shutdownError, hookError], "Service shutdown and onStopped hook failed", { cause: shutdownError });
30
+ }
31
+ if (hookFailed)
32
+ throw hookError;
33
+ if (shutdownFailed)
34
+ throw shutdownError;
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2h1dGRvd24tbGlmZWN5Y2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3NodXRkb3duLWxpZmVjeWNsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQUMsRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFDO0lBQ25FLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQTtJQUMxQixJQUFJLGFBQWEsQ0FBQTtJQUVqQixJQUFJLENBQUM7UUFDSCxNQUFNLFFBQVEsRUFBRSxDQUFBO0lBQ2xCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsY0FBYyxHQUFHLElBQUksQ0FBQTtRQUNyQixhQUFhLEdBQUcsS0FBSyxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUE7SUFDdEIsSUFBSSxTQUFTLENBQUE7SUFFYixJQUFJLENBQUM7UUFDSCxNQUFNLFNBQVMsRUFBRSxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLFNBQVMsR0FBRyxLQUFLLENBQUE7SUFDbkIsQ0FBQztJQUVELElBQUksY0FBYyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxjQUFjLENBQ3RCLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUMxQiw0Q0FBNEMsRUFDNUMsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLENBQ3ZCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQUUsTUFBTSxTQUFTLENBQUE7SUFDL0IsSUFBSSxjQUFjO1FBQUUsTUFBTSxhQUFhLENBQUE7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJ1bnMgc2VydmljZSBzaHV0ZG93biBhbmQgaXRzIGNvbXBsZXRpb24gaG9vayB3aGlsZSBwcmVzZXJ2aW5nIGJvdGggZmFpbHVyZXMuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIExpZmVjeWNsZSBjYWxsYmFja3MuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGFyZ3Muc2h1dGRvd24gLSBQcmltYXJ5IHNlcnZpY2Ugc2h1dGRvd24uXG4gKiBAcGFyYW0geygpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbYXJncy5vblN0b3BwZWRdIC0gQ29tcGxldGlvbiBob29rLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgc2h1dGRvd24gYW5kIHRoZSBob29rIGZpbmlzaC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc2h1dGRvd25MaWZlY3ljbGUoe3NodXRkb3duLCBvblN0b3BwZWR9KSB7XG4gIGxldCBzaHV0ZG93bkZhaWxlZCA9IGZhbHNlXG4gIGxldCBzaHV0ZG93bkVycm9yXG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzaHV0ZG93bigpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc2h1dGRvd25GYWlsZWQgPSB0cnVlXG4gICAgc2h1dGRvd25FcnJvciA9IGVycm9yXG4gIH1cblxuICBsZXQgaG9va0ZhaWxlZCA9IGZhbHNlXG4gIGxldCBob29rRXJyb3JcblxuICB0cnkge1xuICAgIGF3YWl0IG9uU3RvcHBlZD8uKClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBob29rRmFpbGVkID0gdHJ1ZVxuICAgIGhvb2tFcnJvciA9IGVycm9yXG4gIH1cblxuICBpZiAoc2h1dGRvd25GYWlsZWQgJiYgaG9va0ZhaWxlZCkge1xuICAgIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICAgIFtzaHV0ZG93bkVycm9yLCBob29rRXJyb3JdLFxuICAgICAgXCJTZXJ2aWNlIHNodXRkb3duIGFuZCBvblN0b3BwZWQgaG9vayBmYWlsZWRcIixcbiAgICAgIHtjYXVzZTogc2h1dGRvd25FcnJvcn1cbiAgICApXG4gIH1cblxuICBpZiAoaG9va0ZhaWxlZCkgdGhyb3cgaG9va0Vycm9yXG4gIGlmIChzaHV0ZG93bkZhaWxlZCkgdGhyb3cgc2h1dGRvd25FcnJvclxufVxuIl19