velocious 1.0.557 → 1.0.559

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 (75) hide show
  1. package/README.md +17 -3
  2. package/build/background-jobs/main.js +35 -12
  3. package/build/background-jobs/store.js +262 -16
  4. package/build/background-jobs/web/authorization.js +5 -4
  5. package/build/background-jobs/web/controller.js +13 -16
  6. package/build/background-jobs/web/counts-channel.js +79 -0
  7. package/build/background-jobs/web/index.js +2 -0
  8. package/build/background-jobs/web/registry.js +1 -1
  9. package/build/background-jobs/worker.js +53 -28
  10. package/build/database/record/index.js +12 -0
  11. package/build/frontend-models/base.js +192 -41
  12. package/build/http-client/websocket-client.js +48 -0
  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/store.d.ts +79 -0
  17. package/build/src/background-jobs/store.d.ts.map +1 -1
  18. package/build/src/background-jobs/store.js +235 -17
  19. package/build/src/background-jobs/web/authorization.d.ts +5 -3
  20. package/build/src/background-jobs/web/authorization.d.ts.map +1 -1
  21. package/build/src/background-jobs/web/authorization.js +6 -5
  22. package/build/src/background-jobs/web/controller.d.ts.map +1 -1
  23. package/build/src/background-jobs/web/controller.js +14 -15
  24. package/build/src/background-jobs/web/counts-channel.d.ts +31 -0
  25. package/build/src/background-jobs/web/counts-channel.d.ts.map +1 -0
  26. package/build/src/background-jobs/web/counts-channel.js +71 -0
  27. package/build/src/background-jobs/web/index.d.ts.map +1 -1
  28. package/build/src/background-jobs/web/index.js +3 -1
  29. package/build/src/background-jobs/web/registry.d.ts +1 -1
  30. package/build/src/background-jobs/web/registry.d.ts.map +1 -1
  31. package/build/src/background-jobs/web/registry.js +2 -2
  32. package/build/src/background-jobs/worker.d.ts +18 -1
  33. package/build/src/background-jobs/worker.d.ts.map +1 -1
  34. package/build/src/background-jobs/worker.js +55 -31
  35. package/build/src/database/record/index.d.ts.map +1 -1
  36. package/build/src/database/record/index.js +9 -1
  37. package/build/src/frontend-models/base.d.ts +13 -4
  38. package/build/src/frontend-models/base.d.ts.map +1 -1
  39. package/build/src/frontend-models/base.js +173 -44
  40. package/build/src/http-client/websocket-client.d.ts +3 -0
  41. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  42. package/build/src/http-client/websocket-client.js +42 -1
  43. package/build/src/tenants/tenant.d.ts +20 -9
  44. package/build/src/tenants/tenant.d.ts.map +1 -1
  45. package/build/src/tenants/tenant.js +47 -12
  46. package/build/src/testing/factory/factory-registry.d.ts +22 -3
  47. package/build/src/testing/factory/factory-registry.d.ts.map +1 -1
  48. package/build/src/testing/factory/factory-registry.js +32 -9
  49. package/build/src/testing/factory/factory-runner.d.ts +16 -4
  50. package/build/src/testing/factory/factory-runner.d.ts.map +1 -1
  51. package/build/src/testing/factory/factory-runner.js +33 -10
  52. package/build/src/utils/shutdown-lifecycle.d.ts +12 -0
  53. package/build/src/utils/shutdown-lifecycle.d.ts.map +1 -0
  54. package/build/src/utils/shutdown-lifecycle.js +36 -0
  55. package/build/tenants/tenant.js +51 -11
  56. package/build/testing/factory/factory-registry.js +33 -8
  57. package/build/testing/factory/factory-runner.js +38 -12
  58. package/build/tsconfig.tsbuildinfo +1 -1
  59. package/build/utils/shutdown-lifecycle.js +41 -0
  60. package/package.json +3 -2
  61. package/src/background-jobs/main.js +35 -12
  62. package/src/background-jobs/store.js +262 -16
  63. package/src/background-jobs/web/authorization.js +5 -4
  64. package/src/background-jobs/web/controller.js +13 -16
  65. package/src/background-jobs/web/counts-channel.js +79 -0
  66. package/src/background-jobs/web/index.js +2 -0
  67. package/src/background-jobs/web/registry.js +1 -1
  68. package/src/background-jobs/worker.js +53 -28
  69. package/src/database/record/index.js +12 -0
  70. package/src/frontend-models/base.js +192 -41
  71. package/src/http-client/websocket-client.js +48 -0
  72. package/src/tenants/tenant.js +51 -11
  73. package/src/testing/factory/factory-registry.js +33 -8
  74. package/src/testing/factory/factory-runner.js +38 -12
  75. package/src/utils/shutdown-lifecycle.js +41 -0
@@ -11,6 +11,9 @@ export default class VelociousWebsocketClient extends SnapReqWebSocketClient {
11
11
  * @param {Partial<ConstructorParameters<typeof SnapReqWebSocketClient>[0]>} [args] - Options forwarded to `SnapReqWebSocketClient`.
12
12
  */
13
13
  constructor(args?: Partial<ConstructorParameters<typeof SnapReqWebSocketClient>[0]>);
14
+ reconnectGeneration: number;
15
+ /** @type {Set<Promise<void>>} */
16
+ runningReconnectTasks: Set<Promise<void>>;
14
17
  }
15
18
  import SnapReqWebSocketClient from "snapreq/websocket";
16
19
  //# sourceMappingURL=websocket-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../../src/http-client/websocket-client.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH;IACE;;;OAGG;IACH,mBAFW,OAAO,CAAC,qBAAqB,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,EAQ1E;CACF;mCAxBkC,mBAAmB"}
1
+ {"version":3,"file":"websocket-client.d.ts","sourceRoot":"","sources":["../../../src/http-client/websocket-client.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH;IACE;;;OAGG;IACH,mBAFW,OAAO,CAAC,qBAAqB,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,EAW1E;IAHC,4BAA4B;IAC5B,iCAAiC;IACjC,uBADW,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACS;CA+CzC;mCAxEkC,mBAAmB"}
@@ -20,6 +20,47 @@ export default class VelociousWebsocketClient extends SnapReqWebSocketClient {
20
20
  url: args.url ?? DEFAULT_URL,
21
21
  deserialize: args.deserialize ?? deserializeFrontendModelTransportValue
22
22
  });
23
+ this.reconnectGeneration = 0;
24
+ /** @type {Set<Promise<void>>} */
25
+ this.runningReconnectTasks = new Set();
26
+ }
27
+ /**
28
+ * Ignores an online result resolved after reconnect teardown began.
29
+ * @returns {Promise<boolean>} - Whether this client generation is online.
30
+ */
31
+ async _isOnline() {
32
+ const generation = this.reconnectGeneration;
33
+ const isOnline = await super._isOnline();
34
+ return generation === this.reconnectGeneration && isOnline;
35
+ }
36
+ /**
37
+ * Tracks automatic reconnect work so teardown can drain stale attempts.
38
+ * @returns {Promise<void>} - Resolves after the reconnect attempt settles.
39
+ */
40
+ async _attemptReconnect() {
41
+ const reconnectTask = super._attemptReconnect();
42
+ this.runningReconnectTasks.add(reconnectTask);
43
+ try {
44
+ await reconnectTask;
45
+ }
46
+ finally {
47
+ this.runningReconnectTasks.delete(reconnectTask);
48
+ }
49
+ }
50
+ /**
51
+ * Stops reconnect, drains work that already passed SnapReq's reconnect guard,
52
+ * and clears state changed by a stale attempt while it settled.
53
+ * @returns {Promise<void>} - Resolves once no reconnect can resurrect a socket.
54
+ */
55
+ async disconnectAndStopReconnect() {
56
+ this.reconnectGeneration += 1;
57
+ await super.disconnectAndStopReconnect();
58
+ if (this.runningReconnectTasks.size === 0)
59
+ return;
60
+ while (this.runningReconnectTasks.size > 0) {
61
+ await Promise.all(this.runningReconnectTasks);
62
+ }
63
+ await super.disconnectAndStopReconnect();
23
64
  }
24
65
  }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHNCQUFzQixNQUFNLG1CQUFtQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxzQ0FBc0MsRUFBQyxNQUFNLCtDQUErQyxDQUFBO0FBRXBHLE1BQU0sV0FBVyxHQUFHLCtCQUErQixDQUFBO0FBRW5EOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXlCLFNBQVEsc0JBQXNCO0lBQzFFOzs7T0FHRztJQUNILFlBQVksSUFBSSxHQUFHLEVBQUU7UUFDbkIsS0FBSyxDQUFDO1lBQ0osR0FBRyxJQUFJO1lBQ1AsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVztZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxzQ0FBc0M7U0FDeEUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBTbmFwUmVxV2ViU29ja2V0Q2xpZW50IGZyb20gXCJzbmFwcmVxL3dlYnNvY2tldFwiXG5pbXBvcnQge2Rlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL3RyYW5zcG9ydC1zZXJpYWxpemF0aW9uLmpzXCJcblxuY29uc3QgREVGQVVMVF9VUkwgPSBcIndzOi8vMTI3LjAuMC4xOjMwMDYvd2Vic29ja2V0XCJcblxuLyoqXG4gKiBWZWxvY2lvdXMncyBXZWJTb2NrZXQgY2xpZW50LiBUaGUgY3Jvc3MtcGxhdGZvcm0gY29ubmVjdGlvbi9zZXNzaW9uL2NoYW5uZWxcbiAqIG1hY2hpbmVyeSBsaXZlcyBpbiBzbmFwcmVxJ3MgYFNuYXBSZXFXZWJTb2NrZXRDbGllbnRgOyB0aGlzIHRoaW4gc3ViY2xhc3Mgb25seVxuICogcHJlLXdpcmVzIHRoZSB0d28gVmVsb2Npb3VzLXNwZWNpZmljIGRlZmF1bHRzOiB0aGUgbG9jYWwgZGV2ZWxvcG1lbnQgd2Vic29ja2V0XG4gKiBVUkwgYW5kIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCBkZXNlcmlhbGl6YXRpb24gaW5zaWRlIGByZXNwb25zZS5qc29uKClgLlxuICogQGF1Z21lbnRzIFNuYXBSZXFXZWJTb2NrZXRDbGllbnRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IGV4dGVuZHMgU25hcFJlcVdlYlNvY2tldENsaWVudCB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Q29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBTbmFwUmVxV2ViU29ja2V0Q2xpZW50PlswXT59IFthcmdzXSAtIE9wdGlvbnMgZm9yd2FyZGVkIHRvIGBTbmFwUmVxV2ViU29ja2V0Q2xpZW50YC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmFyZ3MsXG4gICAgICB1cmw6IGFyZ3MudXJsID8/IERFRkFVTFRfVVJMLFxuICAgICAgZGVzZXJpYWxpemU6IGFyZ3MuZGVzZXJpYWxpemUgPz8gZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVcbiAgICB9KVxuICB9XG59XG4iXX0=
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHNCQUFzQixNQUFNLG1CQUFtQixDQUFBO0FBQ3RELE9BQU8sRUFBQyxzQ0FBc0MsRUFBQyxNQUFNLCtDQUErQyxDQUFBO0FBRXBHLE1BQU0sV0FBVyxHQUFHLCtCQUErQixDQUFBO0FBRW5EOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXlCLFNBQVEsc0JBQXNCO0lBQzFFOzs7T0FHRztJQUNILFlBQVksSUFBSSxHQUFHLEVBQUU7UUFDbkIsS0FBSyxDQUFDO1lBQ0osR0FBRyxJQUFJO1lBQ1AsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksV0FBVztZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxzQ0FBc0M7U0FDeEUsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtRQUM1QixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxTQUFTO1FBQ2IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFBO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRXhDLE9BQU8sVUFBVSxLQUFLLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxRQUFRLENBQUE7SUFDNUQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFL0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUU3QyxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsQ0FBQTtRQUNyQixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywwQkFBMEI7UUFDOUIsSUFBSSxDQUFDLG1CQUFtQixJQUFJLENBQUMsQ0FBQTtRQUM3QixNQUFNLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxDQUFBO1FBRXhDLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUVqRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFFRCxNQUFNLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxDQUFBO0lBQzFDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgU25hcFJlcVdlYlNvY2tldENsaWVudCBmcm9tIFwic25hcHJlcS93ZWJzb2NrZXRcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5cbmNvbnN0IERFRkFVTFRfVVJMID0gXCJ3czovLzEyNy4wLjAuMTozMDA2L3dlYnNvY2tldFwiXG5cbi8qKlxuICogVmVsb2Npb3VzJ3MgV2ViU29ja2V0IGNsaWVudC4gVGhlIGNyb3NzLXBsYXRmb3JtIGNvbm5lY3Rpb24vc2Vzc2lvbi9jaGFubmVsXG4gKiBtYWNoaW5lcnkgbGl2ZXMgaW4gc25hcHJlcSdzIGBTbmFwUmVxV2ViU29ja2V0Q2xpZW50YDsgdGhpcyB0aGluIHN1YmNsYXNzIG9ubHlcbiAqIHByZS13aXJlcyB0aGUgdHdvIFZlbG9jaW91cy1zcGVjaWZpYyBkZWZhdWx0czogdGhlIGxvY2FsIGRldmVsb3BtZW50IHdlYnNvY2tldFxuICogVVJMIGFuZCBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgZGVzZXJpYWxpemF0aW9uIGluc2lkZSBgcmVzcG9uc2UuanNvbigpYC5cbiAqIEBhdWdtZW50cyBTbmFwUmVxV2ViU29ja2V0Q2xpZW50XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1dlYnNvY2tldENsaWVudCBleHRlbmRzIFNuYXBSZXFXZWJTb2NrZXRDbGllbnQge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgU25hcFJlcVdlYlNvY2tldENsaWVudD5bMF0+fSBbYXJnc10gLSBPcHRpb25zIGZvcndhcmRlZCB0byBgU25hcFJlcVdlYlNvY2tldENsaWVudGAuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmdzID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5hcmdzLFxuICAgICAgdXJsOiBhcmdzLnVybCA/PyBERUZBVUxUX1VSTCxcbiAgICAgIGRlc2VyaWFsaXplOiBhcmdzLmRlc2VyaWFsaXplID8/IGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlXG4gICAgfSlcbiAgICB0aGlzLnJlY29ubmVjdEdlbmVyYXRpb24gPSAwXG4gICAgLyoqIEB0eXBlIHtTZXQ8UHJvbWlzZTx2b2lkPj59ICovXG4gICAgdGhpcy5ydW5uaW5nUmVjb25uZWN0VGFza3MgPSBuZXcgU2V0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBJZ25vcmVzIGFuIG9ubGluZSByZXN1bHQgcmVzb2x2ZWQgYWZ0ZXIgcmVjb25uZWN0IHRlYXJkb3duIGJlZ2FuLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoaXMgY2xpZW50IGdlbmVyYXRpb24gaXMgb25saW5lLlxuICAgKi9cbiAgYXN5bmMgX2lzT25saW5lKCkge1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLnJlY29ubmVjdEdlbmVyYXRpb25cbiAgICBjb25zdCBpc09ubGluZSA9IGF3YWl0IHN1cGVyLl9pc09ubGluZSgpXG5cbiAgICByZXR1cm4gZ2VuZXJhdGlvbiA9PT0gdGhpcy5yZWNvbm5lY3RHZW5lcmF0aW9uICYmIGlzT25saW5lXG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGF1dG9tYXRpYyByZWNvbm5lY3Qgd29yayBzbyB0ZWFyZG93biBjYW4gZHJhaW4gc3RhbGUgYXR0ZW1wdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHRoZSByZWNvbm5lY3QgYXR0ZW1wdCBzZXR0bGVzLlxuICAgKi9cbiAgYXN5bmMgX2F0dGVtcHRSZWNvbm5lY3QoKSB7XG4gICAgY29uc3QgcmVjb25uZWN0VGFzayA9IHN1cGVyLl9hdHRlbXB0UmVjb25uZWN0KClcblxuICAgIHRoaXMucnVubmluZ1JlY29ubmVjdFRhc2tzLmFkZChyZWNvbm5lY3RUYXNrKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlY29ubmVjdFRhc2tcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5ydW5uaW5nUmVjb25uZWN0VGFza3MuZGVsZXRlKHJlY29ubmVjdFRhc2spXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHJlY29ubmVjdCwgZHJhaW5zIHdvcmsgdGhhdCBhbHJlYWR5IHBhc3NlZCBTbmFwUmVxJ3MgcmVjb25uZWN0IGd1YXJkLFxuICAgKiBhbmQgY2xlYXJzIHN0YXRlIGNoYW5nZWQgYnkgYSBzdGFsZSBhdHRlbXB0IHdoaWxlIGl0IHNldHRsZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIG9uY2Ugbm8gcmVjb25uZWN0IGNhbiByZXN1cnJlY3QgYSBzb2NrZXQuXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0QW5kU3RvcFJlY29ubmVjdCgpIHtcbiAgICB0aGlzLnJlY29ubmVjdEdlbmVyYXRpb24gKz0gMVxuICAgIGF3YWl0IHN1cGVyLmRpc2Nvbm5lY3RBbmRTdG9wUmVjb25uZWN0KClcblxuICAgIGlmICh0aGlzLnJ1bm5pbmdSZWNvbm5lY3RUYXNrcy5zaXplID09PSAwKSByZXR1cm5cblxuICAgIHdoaWxlICh0aGlzLnJ1bm5pbmdSZWNvbm5lY3RUYXNrcy5zaXplID4gMCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5ydW5uaW5nUmVjb25uZWN0VGFza3MpXG4gICAgfVxuXG4gICAgYXdhaXQgc3VwZXIuZGlzY29ubmVjdEFuZFN0b3BSZWNvbm5lY3QoKVxuICB9XG59XG4iXX0=
@@ -4,19 +4,21 @@
4
4
  * class is the single discoverable home for switching into a tenant's context, reading the
5
5
  * current one, iterating every tenant of a database identifier, and dropping a tenant's
6
6
  * database. Switching delegates to {@link Current} (which owns the async-context tenant
7
- * state) and additionally runs the callback inside `ensureConnections`, so entering a tenant
7
+ * state) and additionally runs the callback inside `ensureConnections`, initializing registered
8
+ * tenant-switched models whose tables exist before the callback runs. Entering a tenant therefore
8
9
  * makes its database immediately queryable — the apartment-style "switch" semantics — without
9
- * the caller establishing connections itself; iteration and drop drive the app's tenant
10
- * database provider hooks.
10
+ * the caller establishing connections or model metadata itself; iteration and drop drive the
11
+ * app's tenant database provider hooks.
11
12
  */
12
13
  export default class Tenant {
13
14
  /**
14
15
  * Runs `callback` with `tenant` as the current tenant, restoring the previous tenant after.
15
16
  * The callback runs inside `ensureConnections`, so every database identifier the tenant
16
17
  * activates (the global database plus the tenant's database) has a checked-out connection
17
- * available for the callback's duration: switching into a tenant makes it queryable without
18
- * the caller wiring up connections. Already-checked-out connections are reused, so nesting
19
- * `Tenant.with` calls does not open redundant connections. The callback receives the active
18
+ * available for the callback's duration. Registered tenant-switched models whose tables exist
19
+ * are initialized before the callback runs, so switching into a tenant makes it queryable
20
+ * without the caller wiring up connections or model metadata. Already-checked-out connections
21
+ * and in-progress model initialization promises are reused. The callback receives the active
20
22
  * connections keyed by identifier, the same as `ensureConnections`.
21
23
  * @template T
22
24
  * @param {object} tenant Descriptor understood by the app's tenantDatabaseResolver.
@@ -24,6 +26,14 @@ export default class Tenant {
24
26
  * @returns {Promise<T>} - Callback result from within the tenant context.
25
27
  */
26
28
  static with<T>(tenant: object, callback: (connections: Record<string, import("../database/drivers/base.js").default>) => Promise<T>): Promise<T>;
29
+ /**
30
+ * Initializes registered tenant-switched models whose tables exist in the
31
+ * current tenant before runtime callbacks can build synchronous query scopes.
32
+ * Models for absent optional tables remain deferred until they are used.
33
+ * @param {import("../configuration.js").default} configuration - Current configuration.
34
+ * @returns {Promise<void>} - Resolves when available tenant models are initialized.
35
+ */
36
+ static _ensureCurrentTenantModelsInitialized(configuration: import("../configuration.js").default): Promise<void>;
27
37
  /**
28
38
  * The current tenant descriptor, or undefined when running outside any tenant context.
29
39
  * @returns {Record<string, unknown> | undefined} - Current async-context tenant descriptor, if any.
@@ -32,9 +42,10 @@ export default class Tenant {
32
42
  /**
33
43
  * Lists the tenants for a database identifier through the provider and runs `callback`
34
44
  * within each tenant's context, optionally filtered and several at a time. Like
35
- * {@link Tenant.with}, the callback runs inside `ensureConnections` so each tenant's
36
- * database is queryable without the caller wiring up connections. Returns how many tenants
37
- * the callback ran for (after filtering).
45
+ * {@link Tenant.with}, the callback runs inside `ensureConnections` after available
46
+ * tenant-switched models are initialized, so each tenant's database is queryable without the
47
+ * caller wiring up connections or model metadata. Returns how many tenants the callback ran
48
+ * for (after filtering).
38
49
  * @param {{identifier: string, callback: function({databaseConfiguration: import("../configuration-types.js").DatabaseConfigurationType, tenant: ?}) : Promise<void>, parallel?: number, filter?: (tenant: ?) => boolean, configuration?: import("../configuration.js").default}} args - Tenant database identifier, per-tenant operation, filtering, and concurrency settings.
39
50
  * @returns {Promise<number>} - Number of processed tenants.
40
51
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/tenants/tenant.js"],"names":[],"mappings":"AAOA;;;;;;;;;;GAUG;AACH;IACE;;;;;;;;;;;;OAYG;IACH,YALa,CAAC,UACH,MAAM,YACN,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GACxF,OAAO,CAAC,CAAC,CAAC,CAMtB;IAED;;;OAGG;IACH,kBAFa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAI/C;IAED;;;;;;;;OAQG;IACH,uEAHW;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,CAAS,IAAiG,EAAjG;YAAC,qBAAqB,EAAE,OAAO,2BAA2B,EAAE,yBAAyB,CAAC;YAAC,MAAM,EAAE,OAAC,CAAA;SAAC,KAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,GACpQ,OAAO,CAAC,MAAM,CAAC,CAsB3B;IAED;;;;;;;;;;;OAWG;IACH,gCAHW,OAAO,wBAAwB,EAAE,sBAAsB,GACrD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAC,CAI7C;IAED;;;;OAIG;IACH,mDAHW;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,GACzF,OAAO,CAAC,IAAI,CAAC,CAwBzB;CACF"}
1
+ {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/tenants/tenant.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;GAWG;AACH;IACE;;;;;;;;;;;;;OAaG;IACH,YALa,CAAC,UACH,MAAM,YACN,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GACxF,OAAO,CAAC,CAAC,CAAC,CAUtB;IAED;;;;;;OAMG;IACH,4DAHW,OAAO,qBAAqB,EAAE,OAAO,GACnC,OAAO,CAAC,IAAI,CAAC,CAuBzB;IAED;;;OAGG;IACH,kBAFa,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAI/C;IAED;;;;;;;;;OASG;IACH,uEAHW;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,CAAS,IAAiG,EAAjG;YAAC,qBAAqB,EAAE,OAAO,2BAA2B,EAAE,yBAAyB,CAAC;YAAC,MAAM,EAAE,OAAC,CAAA;SAAC,KAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,GACpQ,OAAO,CAAC,MAAM,CAAC,CAyB3B;IAED;;;;;;;;;;;OAWG;IACH,gCAHW,OAAO,wBAAwB,EAAE,sBAAsB,GACrD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC,CAAC,CAI7C;IAED;;;;OAIG;IACH,mDAHW;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAA;KAAC,GACzF,OAAO,CAAC,IAAI,CAAC,CAwBzB;CACF"}
@@ -9,19 +9,21 @@ import TenantIterator from "./tenant-iterator.js";
9
9
  * class is the single discoverable home for switching into a tenant's context, reading the
10
10
  * current one, iterating every tenant of a database identifier, and dropping a tenant's
11
11
  * database. Switching delegates to {@link Current} (which owns the async-context tenant
12
- * state) and additionally runs the callback inside `ensureConnections`, so entering a tenant
12
+ * state) and additionally runs the callback inside `ensureConnections`, initializing registered
13
+ * tenant-switched models whose tables exist before the callback runs. Entering a tenant therefore
13
14
  * makes its database immediately queryable — the apartment-style "switch" semantics — without
14
- * the caller establishing connections itself; iteration and drop drive the app's tenant
15
- * database provider hooks.
15
+ * the caller establishing connections or model metadata itself; iteration and drop drive the
16
+ * app's tenant database provider hooks.
16
17
  */
17
18
  export default class Tenant {
18
19
  /**
19
20
  * Runs `callback` with `tenant` as the current tenant, restoring the previous tenant after.
20
21
  * The callback runs inside `ensureConnections`, so every database identifier the tenant
21
22
  * activates (the global database plus the tenant's database) has a checked-out connection
22
- * available for the callback's duration: switching into a tenant makes it queryable without
23
- * the caller wiring up connections. Already-checked-out connections are reused, so nesting
24
- * `Tenant.with` calls does not open redundant connections. The callback receives the active
23
+ * available for the callback's duration. Registered tenant-switched models whose tables exist
24
+ * are initialized before the callback runs, so switching into a tenant makes it queryable
25
+ * without the caller wiring up connections or model metadata. Already-checked-out connections
26
+ * and in-progress model initialization promises are reused. The callback receives the active
25
27
  * connections keyed by identifier, the same as `ensureConnections`.
26
28
  * @template T
27
29
  * @param {object} tenant Descriptor understood by the app's tenantDatabaseResolver.
@@ -30,7 +32,36 @@ export default class Tenant {
30
32
  */
31
33
  static async with(tenant, callback) {
32
34
  const configuration = Current.configuration();
33
- return await Current.withTenant(tenant, async () => await configuration.ensureConnections(callback));
35
+ return await Current.withTenant(tenant, async () => await configuration.ensureConnections(async (connections) => {
36
+ await this._ensureCurrentTenantModelsInitialized(configuration);
37
+ return await callback(connections);
38
+ }));
39
+ }
40
+ /**
41
+ * Initializes registered tenant-switched models whose tables exist in the
42
+ * current tenant before runtime callbacks can build synchronous query scopes.
43
+ * Models for absent optional tables remain deferred until they are used.
44
+ * @param {import("../configuration.js").default} configuration - Current configuration.
45
+ * @returns {Promise<void>} - Resolves when available tenant models are initialized.
46
+ */
47
+ static async _ensureCurrentTenantModelsInitialized(configuration) {
48
+ for (const modelClass of Object.values(configuration.getModelClasses())) {
49
+ if (modelClass.isInitialized() || !modelClass.hasTenantDatabaseIdentifierResolver())
50
+ continue;
51
+ const databaseIdentifier = modelClass.getTenantDatabaseIdentifier();
52
+ if (!databaseIdentifier || !configuration.isDatabaseIdentifierActive(databaseIdentifier))
53
+ continue;
54
+ const connection = modelClass.connection();
55
+ const table = await connection.getTableByName(modelClass.tableName(), { throwError: false });
56
+ if (!table)
57
+ continue;
58
+ if (Object.keys(modelClass.getTranslationsMap()).length > 0) {
59
+ const translationsTable = await connection.getTableByName(modelClass.getTranslationsTableName(), { throwError: false });
60
+ if (!translationsTable)
61
+ continue;
62
+ }
63
+ await modelClass.ensureInitialized({ configuration });
64
+ }
34
65
  }
35
66
  /**
36
67
  * The current tenant descriptor, or undefined when running outside any tenant context.
@@ -42,9 +73,10 @@ export default class Tenant {
42
73
  /**
43
74
  * Lists the tenants for a database identifier through the provider and runs `callback`
44
75
  * within each tenant's context, optionally filtered and several at a time. Like
45
- * {@link Tenant.with}, the callback runs inside `ensureConnections` so each tenant's
46
- * database is queryable without the caller wiring up connections. Returns how many tenants
47
- * the callback ran for (after filtering).
76
+ * {@link Tenant.with}, the callback runs inside `ensureConnections` after available
77
+ * tenant-switched models are initialized, so each tenant's database is queryable without the
78
+ * caller wiring up connections or model metadata. Returns how many tenants the callback ran
79
+ * for (after filtering).
48
80
  * @param {{identifier: string, callback: function({databaseConfiguration: import("../configuration-types.js").DatabaseConfigurationType, tenant: ?}) : Promise<void>, parallel?: number, filter?: (tenant: ?) => boolean, configuration?: import("../configuration.js").default}} args - Tenant database identifier, per-tenant operation, filtering, and concurrency settings.
49
81
  * @returns {Promise<number>} - Number of processed tenants.
50
82
  */
@@ -63,7 +95,10 @@ export default class Tenant {
63
95
  // their callbacks, such as create, before the tenant database exists) while runtime
64
96
  // iteration here gets the tenant's connections established the same way Tenant.with does.
65
97
  return await iterator.run(tenants, async (callbackArgs) => {
66
- await configuration.ensureConnections({ name: `Tenant.each: ${identifier}` }, async () => await callback(callbackArgs));
98
+ await configuration.ensureConnections({ name: `Tenant.each: ${identifier}` }, async () => {
99
+ await this._ensureCurrentTenantModelsInitialized(configuration);
100
+ await callback(callbackArgs);
101
+ });
67
102
  });
68
103
  }
69
104
  /**
@@ -108,4 +143,4 @@ export default class Tenant {
108
143
  });
109
144
  }
110
145
  }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbmFudHMvdGVuYW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDNUUsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUNyRCxPQUFPLGNBQWMsTUFBTSxzQkFBc0IsQ0FBQTtBQUVqRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxNQUFNO0lBQ3pCOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRO1FBQ2hDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUU3QyxPQUFPLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBQ3RHLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsT0FBTztRQUNaLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFDO1FBQ3JHLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNwRSxNQUFNLGFBQWEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLElBQUksRUFBRSxnQkFBZ0IsVUFBVSxFQUFFLEVBQUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRyxPQUFPLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBQ2hFLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxVQUFVLHdDQUF3QyxDQUFDLENBQUE7UUFDckcsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFBO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUV6Riw0RUFBNEU7UUFDNUUsdUZBQXVGO1FBQ3ZGLG9GQUFvRjtRQUNwRiwwRkFBMEY7UUFDMUYsT0FBTyxNQUFNLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUN4RCxNQUFNLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLElBQUksRUFBRSxnQkFBZ0IsVUFBVSxFQUFFLEVBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7UUFDdkgsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1FBQ2xDLE9BQU8sTUFBTSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ2xELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sWUFBWSxHQUFHLE9BQU8sUUFBUSxDQUFDLFlBQVksS0FBSyxVQUFVO1lBQzlELENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLGtCQUFrQixDQUFBO1FBRXRCLE1BQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkQscUZBQXFGO1lBQ3JGLHFGQUFxRjtZQUNyRix3RkFBd0Y7WUFDeEYsd0VBQXdFO1lBQ3hFLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsVUFBVSw0QkFBNEIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDM0gsQ0FBQztZQUVELE1BQU0sWUFBWSxDQUFDO2dCQUNqQixhQUFhO2dCQUNiLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUM7Z0JBQzdFLFVBQVU7Z0JBQ1YsTUFBTTthQUNQLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDdXJyZW50IGZyb20gXCIuLi9jdXJyZW50LmpzXCJcbmltcG9ydCB7ZHJvcFRlbmFudERhdGFiYXNlfSBmcm9tIFwiLi9kZWZhdWx0LXRlbmFudC1kYXRhYmFzZS1wcm92aXNpb25pbmcuanNcIlxuaW1wb3J0IFRlbmFudEFnZ3JlZ2F0b3IgZnJvbSBcIi4vdGVuYW50LWFnZ3JlZ2F0b3IuanNcIlxuaW1wb3J0IFRlbmFudEl0ZXJhdG9yIGZyb20gXCIuL3RlbmFudC1pdGVyYXRvci5qc1wiXG5cbi8qKlxuICogQXBhcnRtZW50LXN0eWxlIHJ1bnRpbWUgZmHDp2FkZSBmb3IgbXVsdGktdGVuYW50IGFwcHMuIEEgXCJ0ZW5hbnRcIiBpcyB3aGF0ZXZlciBkZXNjcmlwdG9yXG4gKiBvYmplY3QgdGhlIGFwcCdzIGB0ZW5hbnREYXRhYmFzZVJlc29sdmVyYCB1bmRlcnN0YW5kcyAoYW4gYWNjb3VudCwgYSBwcm9qZWN0LCDigKYpOyB0aGlzXG4gKiBjbGFzcyBpcyB0aGUgc2luZ2xlIGRpc2NvdmVyYWJsZSBob21lIGZvciBzd2l0Y2hpbmcgaW50byBhIHRlbmFudCdzIGNvbnRleHQsIHJlYWRpbmcgdGhlXG4gKiBjdXJyZW50IG9uZSwgaXRlcmF0aW5nIGV2ZXJ5IHRlbmFudCBvZiBhIGRhdGFiYXNlIGlkZW50aWZpZXIsIGFuZCBkcm9wcGluZyBhIHRlbmFudCdzXG4gKiBkYXRhYmFzZS4gU3dpdGNoaW5nIGRlbGVnYXRlcyB0byB7QGxpbmsgQ3VycmVudH0gKHdoaWNoIG93bnMgdGhlIGFzeW5jLWNvbnRleHQgdGVuYW50XG4gKiBzdGF0ZSkgYW5kIGFkZGl0aW9uYWxseSBydW5zIHRoZSBjYWxsYmFjayBpbnNpZGUgYGVuc3VyZUNvbm5lY3Rpb25zYCwgc28gZW50ZXJpbmcgYSB0ZW5hbnRcbiAqIG1ha2VzIGl0cyBkYXRhYmFzZSBpbW1lZGlhdGVseSBxdWVyeWFibGUg4oCUIHRoZSBhcGFydG1lbnQtc3R5bGUgXCJzd2l0Y2hcIiBzZW1hbnRpY3Mg4oCUIHdpdGhvdXRcbiAqIHRoZSBjYWxsZXIgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb25zIGl0c2VsZjsgaXRlcmF0aW9uIGFuZCBkcm9wIGRyaXZlIHRoZSBhcHAncyB0ZW5hbnRcbiAqIGRhdGFiYXNlIHByb3ZpZGVyIGhvb2tzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW5hbnQge1xuICAvKipcbiAgICogUnVucyBgY2FsbGJhY2tgIHdpdGggYHRlbmFudGAgYXMgdGhlIGN1cnJlbnQgdGVuYW50LCByZXN0b3JpbmcgdGhlIHByZXZpb3VzIHRlbmFudCBhZnRlci5cbiAgICogVGhlIGNhbGxiYWNrIHJ1bnMgaW5zaWRlIGBlbnN1cmVDb25uZWN0aW9uc2AsIHNvIGV2ZXJ5IGRhdGFiYXNlIGlkZW50aWZpZXIgdGhlIHRlbmFudFxuICAgKiBhY3RpdmF0ZXMgKHRoZSBnbG9iYWwgZGF0YWJhc2UgcGx1cyB0aGUgdGVuYW50J3MgZGF0YWJhc2UpIGhhcyBhIGNoZWNrZWQtb3V0IGNvbm5lY3Rpb25cbiAgICogYXZhaWxhYmxlIGZvciB0aGUgY2FsbGJhY2sncyBkdXJhdGlvbjogc3dpdGNoaW5nIGludG8gYSB0ZW5hbnQgbWFrZXMgaXQgcXVlcnlhYmxlIHdpdGhvdXRcbiAgICogdGhlIGNhbGxlciB3aXJpbmcgdXAgY29ubmVjdGlvbnMuIEFscmVhZHktY2hlY2tlZC1vdXQgY29ubmVjdGlvbnMgYXJlIHJldXNlZCwgc28gbmVzdGluZ1xuICAgKiBgVGVuYW50LndpdGhgIGNhbGxzIGRvZXMgbm90IG9wZW4gcmVkdW5kYW50IGNvbm5lY3Rpb25zLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGFjdGl2ZVxuICAgKiBjb25uZWN0aW9ucyBrZXllZCBieSBpZGVudGlmaWVyLCB0aGUgc2FtZSBhcyBgZW5zdXJlQ29ubmVjdGlvbnNgLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge29iamVjdH0gdGVuYW50IERlc2NyaXB0b3IgdW5kZXJzdG9vZCBieSB0aGUgYXBwJ3MgdGVuYW50RGF0YWJhc2VSZXNvbHZlci5cbiAgICogQHBhcmFtIHsoY29ubmVjdGlvbnM6IFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0PikgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24gdG8gcnVuIHdpdGggdGhlIHRlbmFudCdzIGFjdGl2ZSBjb25uZWN0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0IGZyb20gd2l0aGluIHRoZSB0ZW5hbnQgY29udGV4dC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyB3aXRoKHRlbmFudCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gQ3VycmVudC5jb25maWd1cmF0aW9uKClcblxuICAgIHJldHVybiBhd2FpdCBDdXJyZW50LndpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKGNhbGxiYWNrKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB0ZW5hbnQgZGVzY3JpcHRvciwgb3IgdW5kZWZpbmVkIHdoZW4gcnVubmluZyBvdXRzaWRlIGFueSB0ZW5hbnQgY29udGV4dC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkfSAtIEN1cnJlbnQgYXN5bmMtY29udGV4dCB0ZW5hbnQgZGVzY3JpcHRvciwgaWYgYW55LlxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIEN1cnJlbnQudGVuYW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgdGVuYW50cyBmb3IgYSBkYXRhYmFzZSBpZGVudGlmaWVyIHRocm91Z2ggdGhlIHByb3ZpZGVyIGFuZCBydW5zIGBjYWxsYmFja2BcbiAgICogd2l0aGluIGVhY2ggdGVuYW50J3MgY29udGV4dCwgb3B0aW9uYWxseSBmaWx0ZXJlZCBhbmQgc2V2ZXJhbCBhdCBhIHRpbWUuIExpa2VcbiAgICoge0BsaW5rIFRlbmFudC53aXRofSwgdGhlIGNhbGxiYWNrIHJ1bnMgaW5zaWRlIGBlbnN1cmVDb25uZWN0aW9uc2Agc28gZWFjaCB0ZW5hbnQnc1xuICAgKiBkYXRhYmFzZSBpcyBxdWVyeWFibGUgd2l0aG91dCB0aGUgY2FsbGVyIHdpcmluZyB1cCBjb25uZWN0aW9ucy4gUmV0dXJucyBob3cgbWFueSB0ZW5hbnRzXG4gICAqIHRoZSBjYWxsYmFjayByYW4gZm9yIChhZnRlciBmaWx0ZXJpbmcpLlxuICAgKiBAcGFyYW0ge3tpZGVudGlmaWVyOiBzdHJpbmcsIGNhbGxiYWNrOiBmdW5jdGlvbih7ZGF0YWJhc2VDb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIHRlbmFudDogP30pIDogUHJvbWlzZTx2b2lkPiwgcGFyYWxsZWw/OiBudW1iZXIsIGZpbHRlcj86ICh0ZW5hbnQ6ID8pID0+IGJvb2xlYW4sIGNvbmZpZ3VyYXRpb24/OiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gVGVuYW50IGRhdGFiYXNlIGlkZW50aWZpZXIsIHBlci10ZW5hbnQgb3BlcmF0aW9uLCBmaWx0ZXJpbmcsIGFuZCBjb25jdXJyZW5jeSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBOdW1iZXIgb2YgcHJvY2Vzc2VkIHRlbmFudHMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZWFjaCh7aWRlbnRpZmllciwgY2FsbGJhY2ssIHBhcmFsbGVsID0gMSwgZmlsdGVyLCBjb25maWd1cmF0aW9uID0gQ3VycmVudC5jb25maWd1cmF0aW9uKCl9KSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldFRlbmFudERhdGFiYXNlUHJvdmlkZXIoaWRlbnRpZmllcilcbiAgICBjb25zdCBsaXN0ZWRUZW5hbnRzID0gYXdhaXQgY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYFRlbmFudC5lYWNoOiAke2lkZW50aWZpZXJ9YH0sIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCBwcm92aWRlci5saXN0VGVuYW50cyh7Y29uZmlndXJhdGlvbiwgaWRlbnRpZmllcn0pXG4gICAgfSlcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0ZWRUZW5hbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5hbnQgZGF0YWJhc2UgcHJvdmlkZXIgZm9yICR7aWRlbnRpZmllcn0gbXVzdCByZXR1cm4gYW4gYXJyYXkgZnJvbSBsaXN0VGVuYW50c2ApXG4gICAgfVxuXG4gICAgY29uc3QgdGVuYW50cyA9IGZpbHRlciA/IGxpc3RlZFRlbmFudHMuZmlsdGVyKGZpbHRlcikgOiBsaXN0ZWRUZW5hbnRzXG4gICAgY29uc3QgaXRlcmF0b3IgPSBuZXcgVGVuYW50SXRlcmF0b3Ioe2NvbmZpZ3VyYXRpb24sIGlkZW50aWZpZXIsIHBhcmFsbGVsQ291bnQ6IHBhcmFsbGVsfSlcblxuICAgIC8vIFJ1biBlYWNoIHRlbmFudCdzIGNhbGxiYWNrIGluc2lkZSBlbnN1cmVDb25uZWN0aW9ucyBzbyB0aGUgaXRlcmF0b3Igc3RheXNcbiAgICAvLyBjb25uZWN0aW9uLWFnbm9zdGljICh0aGUgZGI6dGVuYW50czoqIENMSSBjb21tYW5kcyBzaGFyZSBUZW5hbnRJdGVyYXRvciBhbmQgbXVzdCBydW5cbiAgICAvLyB0aGVpciBjYWxsYmFja3MsIHN1Y2ggYXMgY3JlYXRlLCBiZWZvcmUgdGhlIHRlbmFudCBkYXRhYmFzZSBleGlzdHMpIHdoaWxlIHJ1bnRpbWVcbiAgICAvLyBpdGVyYXRpb24gaGVyZSBnZXRzIHRoZSB0ZW5hbnQncyBjb25uZWN0aW9ucyBlc3RhYmxpc2hlZCB0aGUgc2FtZSB3YXkgVGVuYW50LndpdGggZG9lcy5cbiAgICByZXR1cm4gYXdhaXQgaXRlcmF0b3IucnVuKHRlbmFudHMsIGFzeW5jIChjYWxsYmFja0FyZ3MpID0+IHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IGBUZW5hbnQuZWFjaDogJHtpZGVudGlmaWVyfWB9LCBhc3luYyAoKSA9PiBhd2FpdCBjYWxsYmFjayhjYWxsYmFja0FyZ3MpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbmUgYWdncmVnYXRlIHF1ZXJ5IGFjcm9zcyBtYW55IHRlbmFudCBkYXRhYmFzZXMgYW5kIHJldHVybnMgdGhlIG1lcmdlZCByZXN1bHQuIFRoZVxuICAgKiB0ZW5hbnRzIG1heSBiZSBjby1sb2NhdGVkIG9uIHRoZSBkZWZhdWx0IHNlcnZlciBvciBzcHJlYWQgYWNyb3NzIG90aGVyIHNlcnZlcnMsIGFuZCBjYW4gYmVcbiAgICogY3JlYXRlZCBvciBkcm9wcGVkIGF0IHJ1bnRpbWU7IHRoZSBsaXZlIHRlbmFudCBsaXN0IGlzIHJlc29sdmVkIChmcm9tIGB0ZW5hbnRzYCBvciB0aGVcbiAgICogcHJvdmlkZXIncyBgbGlzdFRlbmFudHNgKSwgZ3JvdXBlZCBieSBzZXJ2ZXIsIGFnZ3JlZ2F0ZWQgd2l0aCBhIHNpbmdsZSBjcm9zcy1kYXRhYmFzZVxuICAgKiBgVU5JT04gQUxMYCB3aGVyZSB0aGUgZHJpdmVyIHN1cHBvcnRzIGl0IChNeVNRTC9NU1NRTCkgb3Igb25lIHF1ZXJ5IHBlciB0ZW5hbnQgb3RoZXJ3aXNlXG4gICAqIChQb3N0Z3JlU1FML1NRTGl0ZSksIGFuZCBtZXJnZWQgd2l0aCBlYWNoIGFnZ3JlZ2F0ZSdzIG93biBvcGVyYXRpb24uIFRoZSBjYWxsZXIgd3JpdGVzIG9ubHkgb25lXG4gICAqIHBlci10ZW5hbnQgc3VicXVlcnkgYW5kIGRlY2xhcmVzIHRoZSBrZXkgY29sdW1ucyBhbmQgYWdncmVnYXRlczsgc2VlXG4gICAqIHtAbGluayBpbXBvcnQoXCIuL3RlbmFudC1hZ2dyZWdhdG9yLmpzXCIpLlRlbmFudEFnZ3JlZ2F0ZU9wdGlvbnN9LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdGVuYW50LWFnZ3JlZ2F0b3IuanNcIikuVGVuYW50QWdncmVnYXRlT3B0aW9uc30gb3B0aW9ucyAtIEFnZ3JlZ2F0ZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCA/Pj4+fSAtIE9uZSBtZXJnZWQgcm93IHBlciBkaXN0aW5jdCBrZXktY29sdW1uIGNvbWJpbmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFnZ3JlZ2F0ZUFjcm9zcyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBUZW5hbnRBZ2dyZWdhdG9yKG9wdGlvbnMpLnJ1bigpXG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgb25lIHRlbmFudCdzIGRhdGFiYXNlL3NjaGVtYSB0aHJvdWdoIHRoZSBwcm92aWRlcidzIGBkcm9wRGF0YWJhc2VgIGhvb2suXG4gICAqIEBwYXJhbSB7e2lkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiBvYmplY3QsIGNvbmZpZ3VyYXRpb24/OiBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9fSBhcmdzIC0gVGVuYW50IGRlc2NyaXB0b3IgYW5kIGRhdGFiYXNlIGlkZW50aWZpZXIgdG8gZHJvcC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZHJvcCh7aWRlbnRpZmllciwgdGVuYW50LCBjb25maWd1cmF0aW9uID0gQ3VycmVudC5jb25maWd1cmF0aW9uKCl9KSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBjb25maWd1cmF0aW9uLmdldFRlbmFudERhdGFiYXNlUHJvdmlkZXIoaWRlbnRpZmllcilcbiAgICBjb25zdCBkcm9wRGF0YWJhc2UgPSB0eXBlb2YgcHJvdmlkZXIuZHJvcERhdGFiYXNlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcHJvdmlkZXIuZHJvcERhdGFiYXNlLmJpbmQocHJvdmlkZXIpXG4gICAgICA6IGRyb3BUZW5hbnREYXRhYmFzZVxuXG4gICAgYXdhaXQgY29uZmlndXJhdGlvbi5ydW5XaXRoVGVuYW50KHRlbmFudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gR3VhcmQgYWdhaW5zdCBhbiB1bnJlc29sdmVkIHRlbmFudC4gcmVzb2x2ZURhdGFiYXNlQ29uZmlndXJhdGlvbiBmYWxscyBiYWNrIHRvIHRoZVxuICAgICAgLy8gYmFzZSAodGVtcGxhdGUvZGVmYXVsdCkgdGVuYW50IGRhdGFiYXNlIHdoZW4gdGhlIHJlc29sdmVyIHJldHVybnMgbm90aGluZyBmb3IgdGhpc1xuICAgICAgLy8gZGVzY3JpcHRvciwgc28gd2l0aG91dCB0aGlzIGNoZWNrIGEgcHJvdmlkZXIgdGhhdCBkcm9wcyBieSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24ubmFtZVxuICAgICAgLy8gd291bGQgZHJvcCB0aGUgdGVtcGxhdGUgZGF0YWJhc2UgaW5zdGVhZCBvZiByZWplY3RpbmcgdGhlIGJhZCB0ZW5hbnQuXG4gICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uaXNEYXRhYmFzZUlkZW50aWZpZXJBY3RpdmUoaWRlbnRpZmllcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5hbnQgZGF0YWJhc2UgaWRlbnRpZmllciAke2lkZW50aWZpZXJ9IGlzIGluYWN0aXZlIGZvciB0ZW5hbnQ6ICR7VGVuYW50SXRlcmF0b3IudGVuYW50TGFiZWwodGVuYW50KX1gKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkcm9wRGF0YWJhc2Uoe1xuICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZURhdGFiYXNlQ29uZmlndXJhdGlvbihpZGVudGlmaWVyKSxcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgdGVuYW50XG4gICAgICB9KVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbmFudHMvdGVuYW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUE7QUFDbkMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDNUUsT0FBTyxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQTtBQUNyRCxPQUFPLGNBQWMsTUFBTSxzQkFBc0IsQ0FBQTtBQUVqRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTTtJQUN6Qjs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVE7UUFDaEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBRTdDLE9BQU8sTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sYUFBYSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtZQUM5RyxNQUFNLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUUvRCxPQUFPLE1BQU0sUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3BDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxhQUFhO1FBQzlELEtBQUssTUFBTSxVQUFVLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hFLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxFQUFFO2dCQUFFLFNBQVE7WUFFN0Ys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SyxDQUFDLGVBQWUsQ0FBQyxPQUFPO1FBQ2xDLE9BQU8sTUFBTSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQ2xELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sWUFBWSxHQUFHLE9BQU8sUUFBUSxDQUFDLFlBQVksS0FBSyxVQUFVO1lBQzlELENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLGtCQUFrQixDQUFBO1FBRXRCLE1BQU0sYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkQscUZBQXFGO1lBQ3JGLHFGQUFxRjtZQUNyRix3RkFBd0Y7WUFDeEYsd0VBQXdFO1lBQ3hFLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsVUFBVSw0QkFBNEIsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDM0gsQ0FBQztZQUVELE1BQU0sWUFBWSxDQUFDO2dCQUNqQixhQUFhO2dCQUNiLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUM7Z0JBQzdFLFVBQVU7Z0JBQ1YsTUFBTTthQUNQLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDdXJyZW50IGZyb20gXCIuLi9jdXJyZW50LmpzXCJcbmltcG9ydCB7ZHJvcFRlbmFudERhdGFiYXNlfSBmcm9tIFwiLi9kZWZhdWx0LXRlbmFudC1kYXRhYmFzZS1wcm92aXNpb25pbmcuanNcIlxuaW1wb3J0IFRlbmFudEFnZ3JlZ2F0b3IgZnJvbSBcIi4vdGVuYW50LWFnZ3JlZ2F0b3IuanNcIlxuaW1wb3J0IFRlbmFudEl0ZXJhdG9yIGZyb20gXCIuL3RlbmFudC1pdGVyYXRvci5qc1wiXG5cbi8qKlxuICogQXBhcnRtZW50LXN0eWxlIHJ1bnRpbWUgZmHDp2FkZSBmb3IgbXVsdGktdGVuYW50IGFwcHMuIEEgXCJ0ZW5hbnRcIiBpcyB3aGF0ZXZlciBkZXNjcmlwdG9yXG4gKiBvYmplY3QgdGhlIGFwcCdzIGB0ZW5hbnREYXRhYmFzZVJlc29sdmVyYCB1bmRlcnN0YW5kcyAoYW4gYWNjb3VudCwgYSBwcm9qZWN0LCDigKYpOyB0aGlzXG4gKiBjbGFzcyBpcyB0aGUgc2luZ2xlIGRpc2NvdmVyYWJsZSBob21lIGZvciBzd2l0Y2hpbmcgaW50byBhIHRlbmFudCdzIGNvbnRleHQsIHJlYWRpbmcgdGhlXG4gKiBjdXJyZW50IG9uZSwgaXRlcmF0aW5nIGV2ZXJ5IHRlbmFudCBvZiBhIGRhdGFiYXNlIGlkZW50aWZpZXIsIGFuZCBkcm9wcGluZyBhIHRlbmFudCdzXG4gKiBkYXRhYmFzZS4gU3dpdGNoaW5nIGRlbGVnYXRlcyB0byB7QGxpbmsgQ3VycmVudH0gKHdoaWNoIG93bnMgdGhlIGFzeW5jLWNvbnRleHQgdGVuYW50XG4gKiBzdGF0ZSkgYW5kIGFkZGl0aW9uYWxseSBydW5zIHRoZSBjYWxsYmFjayBpbnNpZGUgYGVuc3VyZUNvbm5lY3Rpb25zYCwgaW5pdGlhbGl6aW5nIHJlZ2lzdGVyZWRcbiAqIHRlbmFudC1zd2l0Y2hlZCBtb2RlbHMgd2hvc2UgdGFibGVzIGV4aXN0IGJlZm9yZSB0aGUgY2FsbGJhY2sgcnVucy4gRW50ZXJpbmcgYSB0ZW5hbnQgdGhlcmVmb3JlXG4gKiBtYWtlcyBpdHMgZGF0YWJhc2UgaW1tZWRpYXRlbHkgcXVlcnlhYmxlIOKAlCB0aGUgYXBhcnRtZW50LXN0eWxlIFwic3dpdGNoXCIgc2VtYW50aWNzIOKAlCB3aXRob3V0XG4gKiB0aGUgY2FsbGVyIGVzdGFibGlzaGluZyBjb25uZWN0aW9ucyBvciBtb2RlbCBtZXRhZGF0YSBpdHNlbGY7IGl0ZXJhdGlvbiBhbmQgZHJvcCBkcml2ZSB0aGVcbiAqIGFwcCdzIHRlbmFudCBkYXRhYmFzZSBwcm92aWRlciBob29rcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuYW50IHtcbiAgLyoqXG4gICAqIFJ1bnMgYGNhbGxiYWNrYCB3aXRoIGB0ZW5hbnRgIGFzIHRoZSBjdXJyZW50IHRlbmFudCwgcmVzdG9yaW5nIHRoZSBwcmV2aW91cyB0ZW5hbnQgYWZ0ZXIuXG4gICAqIFRoZSBjYWxsYmFjayBydW5zIGluc2lkZSBgZW5zdXJlQ29ubmVjdGlvbnNgLCBzbyBldmVyeSBkYXRhYmFzZSBpZGVudGlmaWVyIHRoZSB0ZW5hbnRcbiAgICogYWN0aXZhdGVzICh0aGUgZ2xvYmFsIGRhdGFiYXNlIHBsdXMgdGhlIHRlbmFudCdzIGRhdGFiYXNlKSBoYXMgYSBjaGVja2VkLW91dCBjb25uZWN0aW9uXG4gICAqIGF2YWlsYWJsZSBmb3IgdGhlIGNhbGxiYWNrJ3MgZHVyYXRpb24uIFJlZ2lzdGVyZWQgdGVuYW50LXN3aXRjaGVkIG1vZGVscyB3aG9zZSB0YWJsZXMgZXhpc3RcbiAgICogYXJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgcnVucywgc28gc3dpdGNoaW5nIGludG8gYSB0ZW5hbnQgbWFrZXMgaXQgcXVlcnlhYmxlXG4gICAqIHdpdGhvdXQgdGhlIGNhbGxlciB3aXJpbmcgdXAgY29ubmVjdGlvbnMgb3IgbW9kZWwgbWV0YWRhdGEuIEFscmVhZHktY2hlY2tlZC1vdXQgY29ubmVjdGlvbnNcbiAgICogYW5kIGluLXByb2dyZXNzIG1vZGVsIGluaXRpYWxpemF0aW9uIHByb21pc2VzIGFyZSByZXVzZWQuIFRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgYWN0aXZlXG4gICAqIGNvbm5lY3Rpb25zIGtleWVkIGJ5IGlkZW50aWZpZXIsIHRoZSBzYW1lIGFzIGBlbnN1cmVDb25uZWN0aW9uc2AuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0ZW5hbnQgRGVzY3JpcHRvciB1bmRlcnN0b29kIGJ5IHRoZSBhcHAncyB0ZW5hbnREYXRhYmFzZVJlc29sdmVyLlxuICAgKiBAcGFyYW0geyhjb25uZWN0aW9uczogUmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQ+KSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIE9wZXJhdGlvbiB0byBydW4gd2l0aCB0aGUgdGVuYW50J3MgYWN0aXZlIGNvbm5lY3Rpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQgZnJvbSB3aXRoaW4gdGhlIHRlbmFudCBjb250ZXh0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHdpdGgodGVuYW50LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBDdXJyZW50LmNvbmZpZ3VyYXRpb24oKVxuXG4gICAgcmV0dXJuIGF3YWl0IEN1cnJlbnQud2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoYXN5bmMgKGNvbm5lY3Rpb25zKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl9lbnN1cmVDdXJyZW50VGVuYW50TW9kZWxzSW5pdGlhbGl6ZWQoY29uZmlndXJhdGlvbilcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGNvbm5lY3Rpb25zKVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHJlZ2lzdGVyZWQgdGVuYW50LXN3aXRjaGVkIG1vZGVscyB3aG9zZSB0YWJsZXMgZXhpc3QgaW4gdGhlXG4gICAqIGN1cnJlbnQgdGVuYW50IGJlZm9yZSBydW50aW1lIGNhbGxiYWNrcyBjYW4gYnVpbGQgc3luY2hyb25vdXMgcXVlcnkgc2NvcGVzLlxuICAgKiBNb2RlbHMgZm9yIGFic2VudCBvcHRpb25hbCB0YWJsZXMgcmVtYWluIGRlZmVycmVkIHVudGlsIHRoZXkgYXJlIHVzZWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ3VycmVudCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGF2YWlsYWJsZSB0ZW5hbnQgbW9kZWxzIGFyZSBpbml0aWFsaXplZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBfZW5zdXJlQ3VycmVudFRlbmFudE1vZGVsc0luaXRpYWxpemVkKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3Mgb2YgT2JqZWN0LnZhbHVlcyhjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpKSkge1xuICAgICAgaWYgKG1vZGVsQ2xhc3MuaXNJbml0aWFsaXplZCgpIHx8ICFtb2RlbENsYXNzLmhhc1RlbmFudERhdGFiYXNlSWRlbnRpZmllclJlc29sdmVyKCkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGRhdGFiYXNlSWRlbnRpZmllciA9IG1vZGVsQ2xhc3MuZ2V0VGVuYW50RGF0YWJhc2VJZGVudGlmaWVyKClcblxuICAgICAgaWYgKCFkYXRhYmFzZUlkZW50aWZpZXIgfHwgIWNvbmZpZ3VyYXRpb24uaXNEYXRhYmFzZUlkZW50aWZpZXJBY3RpdmUoZGF0YWJhc2VJZGVudGlmaWVyKSkgY29udGludWVcblxuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IG1vZGVsQ2xhc3MuY29ubmVjdGlvbigpXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0VGFibGVCeU5hbWUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSwge3Rocm93RXJyb3I6IGZhbHNlfSlcblxuICAgICAgaWYgKCF0YWJsZSkgY29udGludWVcblxuICAgICAgaWYgKE9iamVjdC5rZXlzKG1vZGVsQ2xhc3MuZ2V0VHJhbnNsYXRpb25zTWFwKCkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zVGFibGUgPSBhd2FpdCBjb25uZWN0aW9uLmdldFRhYmxlQnlOYW1lKG1vZGVsQ2xhc3MuZ2V0VHJhbnNsYXRpb25zVGFibGVOYW1lKCksIHt0aHJvd0Vycm9yOiBmYWxzZX0pXG5cbiAgICAgICAgaWYgKCF0cmFuc2xhdGlvbnNUYWJsZSkgY29udGludWVcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbW9kZWxDbGFzcy5lbnN1cmVJbml0aWFsaXplZCh7Y29uZmlndXJhdGlvbn0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHRlbmFudCBkZXNjcmlwdG9yLCBvciB1bmRlZmluZWQgd2hlbiBydW5uaW5nIG91dHNpZGUgYW55IHRlbmFudCBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWR9IC0gQ3VycmVudCBhc3luYy1jb250ZXh0IHRlbmFudCBkZXNjcmlwdG9yLCBpZiBhbnkuXG4gICAqL1xuICBzdGF0aWMgY3VycmVudCgpIHtcbiAgICByZXR1cm4gQ3VycmVudC50ZW5hbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSB0ZW5hbnRzIGZvciBhIGRhdGFiYXNlIGlkZW50aWZpZXIgdGhyb3VnaCB0aGUgcHJvdmlkZXIgYW5kIHJ1bnMgYGNhbGxiYWNrYFxuICAgKiB3aXRoaW4gZWFjaCB0ZW5hbnQncyBjb250ZXh0LCBvcHRpb25hbGx5IGZpbHRlcmVkIGFuZCBzZXZlcmFsIGF0IGEgdGltZS4gTGlrZVxuICAgKiB7QGxpbmsgVGVuYW50LndpdGh9LCB0aGUgY2FsbGJhY2sgcnVucyBpbnNpZGUgYGVuc3VyZUNvbm5lY3Rpb25zYCBhZnRlciBhdmFpbGFibGVcbiAgICogdGVuYW50LXN3aXRjaGVkIG1vZGVscyBhcmUgaW5pdGlhbGl6ZWQsIHNvIGVhY2ggdGVuYW50J3MgZGF0YWJhc2UgaXMgcXVlcnlhYmxlIHdpdGhvdXQgdGhlXG4gICAqIGNhbGxlciB3aXJpbmcgdXAgY29ubmVjdGlvbnMgb3IgbW9kZWwgbWV0YWRhdGEuIFJldHVybnMgaG93IG1hbnkgdGVuYW50cyB0aGUgY2FsbGJhY2sgcmFuXG4gICAqIGZvciAoYWZ0ZXIgZmlsdGVyaW5nKS5cbiAgICogQHBhcmFtIHt7aWRlbnRpZmllcjogc3RyaW5nLCBjYWxsYmFjazogZnVuY3Rpb24oe2RhdGFiYXNlQ29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCB0ZW5hbnQ6ID99KSA6IFByb21pc2U8dm9pZD4sIHBhcmFsbGVsPzogbnVtYmVyLCBmaWx0ZXI/OiAodGVuYW50OiA/KSA9PiBib29sZWFuLCBjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fX0gYXJncyAtIFRlbmFudCBkYXRhYmFzZSBpZGVudGlmaWVyLCBwZXItdGVuYW50IG9wZXJhdGlvbiwgZmlsdGVyaW5nLCBhbmQgY29uY3VycmVuY3kgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gTnVtYmVyIG9mIHByb2Nlc3NlZCB0ZW5hbnRzLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVhY2goe2lkZW50aWZpZXIsIGNhbGxiYWNrLCBwYXJhbGxlbCA9IDEsIGZpbHRlciwgY29uZmlndXJhdGlvbiA9IEN1cnJlbnQuY29uZmlndXJhdGlvbigpfSkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRUZW5hbnREYXRhYmFzZVByb3ZpZGVyKGlkZW50aWZpZXIpXG4gICAgY29uc3QgbGlzdGVkVGVuYW50cyA9IGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IGBUZW5hbnQuZWFjaDogJHtpZGVudGlmaWVyfWB9LCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvdmlkZXIubGlzdFRlbmFudHMoe2NvbmZpZ3VyYXRpb24sIGlkZW50aWZpZXJ9KVxuICAgIH0pXG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdGVkVGVuYW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuYW50IGRhdGFiYXNlIHByb3ZpZGVyIGZvciAke2lkZW50aWZpZXJ9IG11c3QgcmV0dXJuIGFuIGFycmF5IGZyb20gbGlzdFRlbmFudHNgKVxuICAgIH1cblxuICAgIGNvbnN0IHRlbmFudHMgPSBmaWx0ZXIgPyBsaXN0ZWRUZW5hbnRzLmZpbHRlcihmaWx0ZXIpIDogbGlzdGVkVGVuYW50c1xuICAgIGNvbnN0IGl0ZXJhdG9yID0gbmV3IFRlbmFudEl0ZXJhdG9yKHtjb25maWd1cmF0aW9uLCBpZGVudGlmaWVyLCBwYXJhbGxlbENvdW50OiBwYXJhbGxlbH0pXG5cbiAgICAvLyBSdW4gZWFjaCB0ZW5hbnQncyBjYWxsYmFjayBpbnNpZGUgZW5zdXJlQ29ubmVjdGlvbnMgc28gdGhlIGl0ZXJhdG9yIHN0YXlzXG4gICAgLy8gY29ubmVjdGlvbi1hZ25vc3RpYyAodGhlIGRiOnRlbmFudHM6KiBDTEkgY29tbWFuZHMgc2hhcmUgVGVuYW50SXRlcmF0b3IgYW5kIG11c3QgcnVuXG4gICAgLy8gdGhlaXIgY2FsbGJhY2tzLCBzdWNoIGFzIGNyZWF0ZSwgYmVmb3JlIHRoZSB0ZW5hbnQgZGF0YWJhc2UgZXhpc3RzKSB3aGlsZSBydW50aW1lXG4gICAgLy8gaXRlcmF0aW9uIGhlcmUgZ2V0cyB0aGUgdGVuYW50J3MgY29ubmVjdGlvbnMgZXN0YWJsaXNoZWQgdGhlIHNhbWUgd2F5IFRlbmFudC53aXRoIGRvZXMuXG4gICAgcmV0dXJuIGF3YWl0IGl0ZXJhdG9yLnJ1bih0ZW5hbnRzLCBhc3luYyAoY2FsbGJhY2tBcmdzKSA9PiB7XG4gICAgICBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBgVGVuYW50LmVhY2g6ICR7aWRlbnRpZmllcn1gfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9lbnN1cmVDdXJyZW50VGVuYW50TW9kZWxzSW5pdGlhbGl6ZWQoY29uZmlndXJhdGlvbilcbiAgICAgICAgYXdhaXQgY2FsbGJhY2soY2FsbGJhY2tBcmdzKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIGFnZ3JlZ2F0ZSBxdWVyeSBhY3Jvc3MgbWFueSB0ZW5hbnQgZGF0YWJhc2VzIGFuZCByZXR1cm5zIHRoZSBtZXJnZWQgcmVzdWx0LiBUaGVcbiAgICogdGVuYW50cyBtYXkgYmUgY28tbG9jYXRlZCBvbiB0aGUgZGVmYXVsdCBzZXJ2ZXIgb3Igc3ByZWFkIGFjcm9zcyBvdGhlciBzZXJ2ZXJzLCBhbmQgY2FuIGJlXG4gICAqIGNyZWF0ZWQgb3IgZHJvcHBlZCBhdCBydW50aW1lOyB0aGUgbGl2ZSB0ZW5hbnQgbGlzdCBpcyByZXNvbHZlZCAoZnJvbSBgdGVuYW50c2Agb3IgdGhlXG4gICAqIHByb3ZpZGVyJ3MgYGxpc3RUZW5hbnRzYCksIGdyb3VwZWQgYnkgc2VydmVyLCBhZ2dyZWdhdGVkIHdpdGggYSBzaW5nbGUgY3Jvc3MtZGF0YWJhc2VcbiAgICogYFVOSU9OIEFMTGAgd2hlcmUgdGhlIGRyaXZlciBzdXBwb3J0cyBpdCAoTXlTUUwvTVNTUUwpIG9yIG9uZSBxdWVyeSBwZXIgdGVuYW50IG90aGVyd2lzZVxuICAgKiAoUG9zdGdyZVNRTC9TUUxpdGUpLCBhbmQgbWVyZ2VkIHdpdGggZWFjaCBhZ2dyZWdhdGUncyBvd24gb3BlcmF0aW9uLiBUaGUgY2FsbGVyIHdyaXRlcyBvbmx5IG9uZVxuICAgKiBwZXItdGVuYW50IHN1YnF1ZXJ5IGFuZCBkZWNsYXJlcyB0aGUga2V5IGNvbHVtbnMgYW5kIGFnZ3JlZ2F0ZXM7IHNlZVxuICAgKiB7QGxpbmsgaW1wb3J0KFwiLi90ZW5hbnQtYWdncmVnYXRvci5qc1wiKS5UZW5hbnRBZ2dyZWdhdGVPcHRpb25zfS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3RlbmFudC1hZ2dyZWdhdG9yLmpzXCIpLlRlbmFudEFnZ3JlZ2F0ZU9wdGlvbnN9IG9wdGlvbnMgLSBBZ2dyZWdhdGUgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgPz4+Pn0gLSBPbmUgbWVyZ2VkIHJvdyBwZXIgZGlzdGluY3Qga2V5LWNvbHVtbiBjb21iaW5hdGlvbi5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhZ2dyZWdhdGVBY3Jvc3Mob3B0aW9ucykge1xuICAgIHJldHVybiBhd2FpdCBuZXcgVGVuYW50QWdncmVnYXRvcihvcHRpb25zKS5ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIG9uZSB0ZW5hbnQncyBkYXRhYmFzZS9zY2hlbWEgdGhyb3VnaCB0aGUgcHJvdmlkZXIncyBgZHJvcERhdGFiYXNlYCBob29rLlxuICAgKiBAcGFyYW0ge3tpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogb2JqZWN0LCBjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fX0gYXJncyAtIFRlbmFudCBkZXNjcmlwdG9yIGFuZCBkYXRhYmFzZSBpZGVudGlmaWVyIHRvIGRyb3AuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRyb3Aoe2lkZW50aWZpZXIsIHRlbmFudCwgY29uZmlndXJhdGlvbiA9IEN1cnJlbnQuY29uZmlndXJhdGlvbigpfSkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gY29uZmlndXJhdGlvbi5nZXRUZW5hbnREYXRhYmFzZVByb3ZpZGVyKGlkZW50aWZpZXIpXG4gICAgY29uc3QgZHJvcERhdGFiYXNlID0gdHlwZW9mIHByb3ZpZGVyLmRyb3BEYXRhYmFzZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHByb3ZpZGVyLmRyb3BEYXRhYmFzZS5iaW5kKHByb3ZpZGVyKVxuICAgICAgOiBkcm9wVGVuYW50RGF0YWJhc2VcblxuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEd1YXJkIGFnYWluc3QgYW4gdW5yZXNvbHZlZCB0ZW5hbnQuIHJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24gZmFsbHMgYmFjayB0byB0aGVcbiAgICAgIC8vIGJhc2UgKHRlbXBsYXRlL2RlZmF1bHQpIHRlbmFudCBkYXRhYmFzZSB3aGVuIHRoZSByZXNvbHZlciByZXR1cm5zIG5vdGhpbmcgZm9yIHRoaXNcbiAgICAgIC8vIGRlc2NyaXB0b3IsIHNvIHdpdGhvdXQgdGhpcyBjaGVjayBhIHByb3ZpZGVyIHRoYXQgZHJvcHMgYnkgZGF0YWJhc2VDb25maWd1cmF0aW9uLm5hbWVcbiAgICAgIC8vIHdvdWxkIGRyb3AgdGhlIHRlbXBsYXRlIGRhdGFiYXNlIGluc3RlYWQgb2YgcmVqZWN0aW5nIHRoZSBiYWQgdGVuYW50LlxuICAgICAgaWYgKCFjb25maWd1cmF0aW9uLmlzRGF0YWJhc2VJZGVudGlmaWVyQWN0aXZlKGlkZW50aWZpZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuYW50IGRhdGFiYXNlIGlkZW50aWZpZXIgJHtpZGVudGlmaWVyfSBpcyBpbmFjdGl2ZSBmb3IgdGVuYW50OiAke1RlbmFudEl0ZXJhdG9yLnRlbmFudExhYmVsKHRlbmFudCl9YClcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZHJvcERhdGFiYXNlKHtcbiAgICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICAgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBjb25maWd1cmF0aW9uLnJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24oaWRlbnRpZmllciksXG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHRlbmFudFxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG4iXX0=
@@ -187,8 +187,7 @@ export default class FactoryRegistry {
187
187
  */
188
188
  _runList(strategy: "attributesFor" | "build" | "create", factoryName: string, count: number, args: Array<unknown>): Promise<Array<unknown>>;
189
189
  /**
190
- * Compiles and runs a factory invocation under a strategy, tracking active
191
- * evaluations for the mutation guard.
190
+ * Compiles and runs a factory invocation under a strategy.
192
191
  * @param {object} args - Options.
193
192
  * @param {string} args.factoryName - Factory name.
194
193
  * @param {string[]} args.traits - Ordered traits.
@@ -196,12 +195,32 @@ export default class FactoryRegistry {
196
195
  * @param {"attributesFor" | "build" | "create"} args.strategy - Strategy name.
197
196
  * @returns {Promise<?>} - The strategy result.
198
197
  */
199
- _runFactory({ factoryName, traits, overrides, strategy }: {
198
+ _runFactory(args: {
200
199
  factoryName: string;
201
200
  traits: string[];
202
201
  overrides: Record<string, unknown>;
203
202
  strategy: "attributesFor" | "build" | "create";
204
203
  }): Promise<unknown>;
204
+ /**
205
+ * Runs one event-tracked invocation, optionally reusing declaration planning.
206
+ * @param {object} args - Options.
207
+ * @param {string} args.factoryName - Factory name.
208
+ * @param {string[]} args.traits - Ordered traits.
209
+ * @param {Record<string, ?>} args.overrides - Overrides.
210
+ * @param {"attributesFor" | "build" | "create"} args.strategy - Strategy name.
211
+ * @param {import("./factory-runner.js").CompiledPlan} [args.planTemplate] - Reusable declaration plan.
212
+ * @returns {Promise<{result: ?, planTemplate: import("./factory-runner.js").CompiledPlan}>} - Result and declaration plan.
213
+ */
214
+ _runFactoryInvocation({ factoryName, traits, overrides, strategy, planTemplate }: {
215
+ factoryName: string;
216
+ traits: string[];
217
+ overrides: Record<string, unknown>;
218
+ strategy: "attributesFor" | "build" | "create";
219
+ planTemplate?: import("./factory-runner.js").CompiledPlan | undefined;
220
+ }): Promise<{
221
+ result: unknown;
222
+ planTemplate: import("./factory-runner.js").CompiledPlan;
223
+ }>;
205
224
  /**
206
225
  * Registers an immutable factory definition and its aliases.
207
226
  * @param {import("./factory-definition.js").default} definition - Compiled factory.
@@ -1 +1 @@
1
- {"version":3,"file":"factory-registry.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/factory-registry.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"factory-registry.d.ts","sourceRoot":"","sources":["../../../../src/testing/factory/factory-registry.js"],"names":[],"mappings":"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"}