velocious 1.0.593 → 1.0.595

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 (136) hide show
  1. package/README.md +3 -2
  2. package/build/configuration.js +109 -14
  3. package/build/database/drivers/base.js +30 -0
  4. package/build/database/migrator.js +90 -24
  5. package/build/database/operation.js +55 -4
  6. package/build/database/query/join-object.js +7 -4
  7. package/build/database/query/model-class-query.js +38 -7
  8. package/build/database/query/preloader/belongs-to.js +9 -6
  9. package/build/database/query/preloader/has-many.js +25 -14
  10. package/build/database/query/preloader/has-one.js +7 -4
  11. package/build/database/query/preloader/query-for-model.js +16 -1
  12. package/build/database/query/preloader.js +6 -4
  13. package/build/database/query/query-data.js +3 -3
  14. package/build/database/query/where-model-class-hash.js +8 -4
  15. package/build/database/query/with-count.js +4 -3
  16. package/build/database/record/index.js +148 -5
  17. package/build/database/record/instance-relationships/base.js +13 -0
  18. package/build/database/record/instance-relationships/belongs-to.js +1 -1
  19. package/build/database/record/instance-relationships/has-many.js +5 -2
  20. package/build/database/record/instance-relationships/has-one.js +1 -1
  21. package/build/database/record/relationships/base.js +17 -0
  22. package/build/database/use-database.js +81 -28
  23. package/build/src/configuration.d.ts +31 -4
  24. package/build/src/configuration.d.ts.map +1 -1
  25. package/build/src/configuration.js +88 -17
  26. package/build/src/database/drivers/base.d.ts +11 -0
  27. package/build/src/database/drivers/base.d.ts.map +1 -1
  28. package/build/src/database/drivers/base.js +28 -1
  29. package/build/src/database/migrator.d.ts +34 -0
  30. package/build/src/database/migrator.d.ts.map +1 -1
  31. package/build/src/database/migrator.js +83 -23
  32. package/build/src/database/operation.d.ts +15 -1
  33. package/build/src/database/operation.d.ts.map +1 -1
  34. package/build/src/database/operation.js +52 -5
  35. package/build/src/database/query/join-object.d.ts.map +1 -1
  36. package/build/src/database/query/join-object.js +7 -5
  37. package/build/src/database/query/model-class-query.d.ts +6 -0
  38. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  39. package/build/src/database/query/model-class-query.js +33 -8
  40. package/build/src/database/query/preloader/belongs-to.d.ts.map +1 -1
  41. package/build/src/database/query/preloader/belongs-to.js +9 -7
  42. package/build/src/database/query/preloader/has-many.d.ts.map +1 -1
  43. package/build/src/database/query/preloader/has-many.js +23 -16
  44. package/build/src/database/query/preloader/has-one.d.ts.map +1 -1
  45. package/build/src/database/query/preloader/has-one.js +7 -5
  46. package/build/src/database/query/preloader/query-for-model.d.ts +8 -0
  47. package/build/src/database/query/preloader/query-for-model.d.ts.map +1 -1
  48. package/build/src/database/query/preloader/query-for-model.js +15 -2
  49. package/build/src/database/query/preloader.d.ts.map +1 -1
  50. package/build/src/database/query/preloader.js +6 -5
  51. package/build/src/database/query/query-data.js +4 -4
  52. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  53. package/build/src/database/query/where-model-class-hash.js +7 -5
  54. package/build/src/database/query/with-count.js +5 -4
  55. package/build/src/database/record/index.d.ts +95 -0
  56. package/build/src/database/record/index.d.ts.map +1 -1
  57. package/build/src/database/record/index.js +126 -6
  58. package/build/src/database/record/instance-relationships/base.d.ts +6 -0
  59. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  60. package/build/src/database/record/instance-relationships/base.js +12 -1
  61. package/build/src/database/record/instance-relationships/belongs-to.js +2 -2
  62. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  63. package/build/src/database/record/instance-relationships/has-many.js +6 -3
  64. package/build/src/database/record/instance-relationships/has-one.js +2 -2
  65. package/build/src/database/record/relationships/base.d.ts +11 -0
  66. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  67. package/build/src/database/record/relationships/base.js +15 -1
  68. package/build/src/database/use-database.d.ts +33 -5
  69. package/build/src/database/use-database.d.ts.map +1 -1
  70. package/build/src/database/use-database.js +81 -30
  71. package/build/src/sync/server-change-feed.d.ts +14 -2
  72. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  73. package/build/src/sync/server-change-feed.js +50 -10
  74. package/build/src/sync/sync-scope-store.d.ts +13 -2
  75. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  76. package/build/src/sync/sync-scope-store.js +48 -7
  77. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts +43 -1
  78. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.d.ts.map +1 -1
  79. package/build/src/tenants/frontend-tenant-sqlite-lifecycle.js +141 -17
  80. package/build/src/tenants/tenant-handle.d.ts +36 -0
  81. package/build/src/tenants/tenant-handle.d.ts.map +1 -1
  82. package/build/src/tenants/tenant-handle.js +73 -3
  83. package/build/src/testing/browser-test-app.js +3 -1
  84. package/build/src/testing/browser-use-database-hook-scenarios.d.ts +16 -0
  85. package/build/src/testing/browser-use-database-hook-scenarios.d.ts.map +1 -0
  86. package/build/src/testing/browser-use-database-hook-scenarios.js +182 -0
  87. package/build/src/testing/test-runner.d.ts.map +1 -1
  88. package/build/src/testing/test-runner.js +9 -8
  89. package/build/src/utils/model-scope.d.ts +2 -2
  90. package/build/src/utils/model-scope.d.ts.map +1 -1
  91. package/build/src/utils/model-scope.js +5 -3
  92. package/build/src/utils/ransack.d.ts.map +1 -1
  93. package/build/src/utils/ransack.js +5 -3
  94. package/build/sync/server-change-feed.js +58 -8
  95. package/build/sync/sync-scope-store.js +55 -5
  96. package/build/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
  97. package/build/tenants/tenant-handle.js +90 -6
  98. package/build/testing/browser-test-app.js +2 -0
  99. package/build/testing/browser-use-database-hook-scenarios.js +204 -0
  100. package/build/testing/test-runner.js +8 -7
  101. package/build/tsconfig.tsbuildinfo +1 -1
  102. package/build/utils/model-scope.js +5 -2
  103. package/build/utils/ransack.js +5 -2
  104. package/package.json +2 -1
  105. package/scripts/browser-test-session.js +60 -0
  106. package/scripts/test-browser.js +7 -7
  107. package/src/configuration.js +109 -14
  108. package/src/database/drivers/base.js +30 -0
  109. package/src/database/migrator.js +90 -24
  110. package/src/database/operation.js +55 -4
  111. package/src/database/query/join-object.js +7 -4
  112. package/src/database/query/model-class-query.js +38 -7
  113. package/src/database/query/preloader/belongs-to.js +9 -6
  114. package/src/database/query/preloader/has-many.js +25 -14
  115. package/src/database/query/preloader/has-one.js +7 -4
  116. package/src/database/query/preloader/query-for-model.js +16 -1
  117. package/src/database/query/preloader.js +6 -4
  118. package/src/database/query/query-data.js +3 -3
  119. package/src/database/query/where-model-class-hash.js +8 -4
  120. package/src/database/query/with-count.js +4 -3
  121. package/src/database/record/index.js +148 -5
  122. package/src/database/record/instance-relationships/base.js +13 -0
  123. package/src/database/record/instance-relationships/belongs-to.js +1 -1
  124. package/src/database/record/instance-relationships/has-many.js +5 -2
  125. package/src/database/record/instance-relationships/has-one.js +1 -1
  126. package/src/database/record/relationships/base.js +17 -0
  127. package/src/database/use-database.js +81 -28
  128. package/src/sync/server-change-feed.js +58 -8
  129. package/src/sync/sync-scope-store.js +55 -5
  130. package/src/tenants/frontend-tenant-sqlite-lifecycle.js +150 -15
  131. package/src/tenants/tenant-handle.js +90 -6
  132. package/src/testing/browser-test-app.js +2 -0
  133. package/src/testing/browser-use-database-hook-scenarios.js +204 -0
  134. package/src/testing/test-runner.js +8 -7
  135. package/src/utils/model-scope.js +5 -2
  136. package/src/utils/ransack.js +5 -2
@@ -1,10 +1,11 @@
1
1
  // @ts-check
2
+ import Migrator from "../database/migrator.js";
2
3
  /**
3
4
  * TenantDescriptorValue type.
4
5
  * @typedef {null | boolean | number | string | TenantDescriptorValue[] | {[key: string]: TenantDescriptorValue}} TenantDescriptorValue
5
6
  */
6
7
  /** @typedef {{[key: string]: TenantDescriptorValue}} TenantDescriptor */
7
- /** @typedef {{databaseIdentifier: string, dirty: boolean, lastUsed: number, pinCount: number, state: "closed" | "closing" | "deleting" | "open" | "opening"}} TenantSqliteLifecycleSnapshot */
8
+ /** @typedef {{databaseIdentifier: string, dirty: boolean, lastUsed: number, pinCount: number, ready: boolean, schemaGeneration: string | undefined, state: "closed" | "closing" | "deleting" | "open" | "opening"}} TenantSqliteLifecycleSnapshot */
8
9
  /**
9
10
  * Returns a readable path for a captured descriptor/configuration value.
10
11
  * @param {string} path - Parent path.
@@ -176,6 +177,16 @@ export default class TenantHandle {
176
177
  tenant() {
177
178
  return this._tenant;
178
179
  }
180
+ /**
181
+ * Rejects using this handle with a different Configuration instance.
182
+ * @param {import("../configuration.js").default} configuration - Expected owner.
183
+ * @returns {void}
184
+ */
185
+ assertConfiguration(configuration) {
186
+ if (configuration !== this._configuration) {
187
+ throw new Error("Tenant handle belongs to a different Velocious configuration");
188
+ }
189
+ }
179
190
  /**
180
191
  * Returns the captured physical configuration for an active identifier.
181
192
  * @param {string} databaseIdentifier - Logical database identifier.
@@ -197,6 +208,53 @@ export default class TenantHandle {
197
208
  const { databaseIdentifier } = options;
198
209
  return await this._configuration.getFrontendTenantSqliteLifecycle().open(databaseIdentifier, this.databaseConfiguration(databaseIdentifier));
199
210
  }
211
+ /**
212
+ * Opens, migrates, and initializes record metadata for one captured physical
213
+ * tenant SQLite database and application schema generation.
214
+ * @param {object} options - Initialization options.
215
+ * @param {string} options.databaseIdentifier - Tenant-only logical database identifier.
216
+ * @param {import("../database/migrator/types.js").RequireMigrationContextType} options.migrations - Frontend migration require context.
217
+ * @param {string} options.schemaGeneration - Stable application schema generation.
218
+ * @returns {Promise<Readonly<TenantSqliteLifecycleSnapshot>>} - Ready lifecycle snapshot.
219
+ */
220
+ async initialize({ databaseIdentifier, migrations, schemaGeneration }) {
221
+ if (!migrations || typeof migrations !== "function" || typeof migrations.keys !== "function") {
222
+ throw new TypeError("TenantHandle.initialize requires a migrations require context");
223
+ }
224
+ const databaseConfiguration = this.databaseConfiguration(databaseIdentifier);
225
+ const lifecycle = this._configuration.getFrontendTenantSqliteLifecycle();
226
+ return await lifecycle.initialize(databaseIdentifier, databaseConfiguration, schemaGeneration, async () => {
227
+ await this._databaseOperation({
228
+ databaseIdentifier,
229
+ name: `Initialize frontend tenant database: ${databaseIdentifier}`,
230
+ requireReady: false,
231
+ schemaGeneration
232
+ }, async (operation) => {
233
+ const migrator = new Migrator({ configuration: this._configuration, databaseIdentifiers: [databaseIdentifier] });
234
+ operation.connection().clearSchemaCache();
235
+ await migrator.migrateRequireContextForDatabase({
236
+ databaseConfiguration,
237
+ databaseIdentifier,
238
+ db: operation.connection(),
239
+ requireContext: migrations
240
+ });
241
+ await this._configuration.initializeModels({ type: "frontend-tenant" });
242
+ for (const modelClass of Object.values(this._configuration.getModelClasses())) {
243
+ if (modelClass.getDatabaseIdentifier({ tenant: this._tenant }) !== databaseIdentifier)
244
+ continue;
245
+ const table = await operation.connection().getTableByName(modelClass.tableName(), { throwError: false });
246
+ if (!table && !modelClass.getEagerLoadRecordMetadata())
247
+ continue;
248
+ if (Object.keys(modelClass.getTranslationsMap()).length > 0) {
249
+ const translationsTable = await operation.connection().getTableByName(modelClass.getTranslationsTableName(), { throwError: false });
250
+ if (!translationsTable && !modelClass.getEagerLoadRecordMetadata())
251
+ continue;
252
+ }
253
+ await operation.ensureModelInitialized(modelClass);
254
+ }
255
+ });
256
+ });
257
+ }
200
258
  /**
201
259
  * Flushes this captured SQLite identity.
202
260
  * @param {{databaseIdentifier: string}} options - Lifecycle options.
@@ -253,11 +311,23 @@ export default class TenantHandle {
253
311
  * @returns {Promise<T>} - Callback result.
254
312
  */
255
313
  async databaseOperation({ databaseIdentifier, name = "TenantHandle.databaseOperation" }, callback) {
314
+ return await this._databaseOperation({ databaseIdentifier, name, requireReady: true }, callback);
315
+ }
316
+ /**
317
+ * Runs a captured operation with explicit readiness policy. Initialization is
318
+ * the only caller allowed to enter an unready schema generation.
319
+ * @template T
320
+ * @param {{databaseIdentifier: string, name: string, requireReady: boolean, schemaGeneration?: string}} options - Internal operation options.
321
+ * @param {(operation: import("../database/operation.js").default) => Promise<T>} callback - Operation callback.
322
+ * @returns {Promise<T>} - Callback result.
323
+ */
324
+ async _databaseOperation({ databaseIdentifier, name, requireReady, schemaGeneration }, callback) {
256
325
  const databaseConfiguration = this.databaseConfiguration(databaseIdentifier);
257
- return await this._configuration.getFrontendTenantSqliteLifecycle().databaseOperation(databaseIdentifier, databaseConfiguration, async () => await this._configuration.withDatabaseOperation({
326
+ return await this._configuration.getFrontendTenantSqliteLifecycle().databaseOperation(databaseIdentifier, databaseConfiguration, { requireReady, schemaGeneration }, async (operationSchemaGeneration) => await this._configuration.withDatabaseOperation({
258
327
  databaseConfiguration,
259
328
  databaseIdentifier,
260
329
  name,
330
+ schemaGeneration: operationSchemaGeneration,
261
331
  tenant: this._tenant
262
332
  }, callback));
263
333
  }
@@ -275,4 +345,4 @@ export default class TenantHandle {
275
345
  });
276
346
  }
277
347
  }
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWhhbmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW5hbnRzL3RlbmFudC1oYW5kbGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7R0FHRztBQUNILHlFQUF5RTtBQUN6RSwrTEFBK0w7QUFFL0w7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRztJQUMxQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFBO0lBRXJELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO0FBQ3RDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQTtBQUM1QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUs7SUFDcEQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLFlBQVksRUFBRSxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLEtBQUs7UUFDTCxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUztJQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMzRixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMs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QUFFLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLGtCQUFrQixFQUFFLElBQUksR0FBRyxnQ0FBZ0MsRUFBQyxFQUFFLFFBQVE7UUFDN0YsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUM1RSxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDO1lBQzNMLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsSUFBSTtZQUNKLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTztTQUNyQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBQyxrQkFBa0IsRUFBRSxJQUFJLEdBQUcsMEJBQTBCLEVBQUMsRUFBRSxRQUFRO1FBQ2pGLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUU7WUFDbEYsT0FBTyxNQUFNLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQzNFLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogVGVuYW50RGVzY3JpcHRvclZhbHVlIHR5cGUuXG4gKiBAdHlwZWRlZiB7bnVsbCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBUZW5hbnREZXNjcmlwdG9yVmFsdWVbXSB8IHtba2V5OiBzdHJpbmddOiBUZW5hbnREZXNjcmlwdG9yVmFsdWV9fSBUZW5hbnREZXNjcmlwdG9yVmFsdWVcbiAqL1xuLyoqIEB0eXBlZGVmIHt7W2tleTogc3RyaW5nXTogVGVuYW50RGVzY3JpcHRvclZhbHVlfX0gVGVuYW50RGVzY3JpcHRvciAqL1xuLyoqIEB0eXBlZGVmIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIGRpcnR5OiBib29sZWFuLCBsYXN0VXNlZDogbnVtYmVyLCBwaW5Db3VudDogbnVtYmVyLCBzdGF0ZTogXCJjbG9zZWRcIiB8IFwiY2xvc2luZ1wiIHwgXCJkZWxldGluZ1wiIHwgXCJvcGVuXCIgfCBcIm9wZW5pbmdcIn19IFRlbmFudFNxbGl0ZUxpZmVjeWNsZVNuYXBzaG90ICovXG5cbi8qKlxuICogUmV0dXJucyBhIHJlYWRhYmxlIHBhdGggZm9yIGEgY2FwdHVyZWQgZGVzY3JpcHRvci9jb25maWd1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXJlbnQgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBDaGlsZCBrZXkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIENoaWxkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGNoaWxkUGF0aChwYXRoLCBrZXkpIHtcbiAgaWYgKHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIpIHJldHVybiBgJHtwYXRofVske2tleX1dYFxuXG4gIHJldHVybiBwYXRoID8gYCR7cGF0aH0uJHtrZXl9YCA6IGtleVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY2xhc3MgbGFiZWwgZm9yIGFuIHVuc3VwcG9ydGVkIGNhcHR1cmUgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWUgLSBVbnN1cHBvcnRlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUnVudGltZSBjbGFzcyBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gdmFsdWVDbGFzc05hbWUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lIHx8IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBEZWZpbmVzIG9uZSBjYXB0dXJlZCBrZXkgd2l0aG91dCBpbnZva2luZyBpbmhlcml0ZWQgc2V0dGVycyBzdWNoIGFzXG4gKiBgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX19gLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHRhcmdldCAtIENhcHR1cmVkIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBPd24ga2V5IHRvIGRlZmluZS5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FwdHVyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUNhcHR1cmVkRGF0YVByb3BlcnR5KHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIERlZXBseSBjb3BpZXMgYW5kIGZyZWV6ZXMgYSBKU09OLWNvbXBhdGlibGUgdGVuYW50IGRlc2NyaXB0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIGNhcHR1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIERlc2NyaXB0b3IgcGF0aC5cbiAqIEBwYXJhbSB7U2V0PG9iamVjdD59IGFuY2VzdG9ycyAtIEFjdGl2ZSBhbmNlc3RvciBvYmplY3RzIHVzZWQgZm9yIGN5Y2xlIGRldGVjdGlvbi5cbiAqIEByZXR1cm5zIHtUZW5hbnREZXNjcmlwdG9yVmFsdWV9IC0gSW1tdXRhYmxlIGNhcHR1cmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlVGVuYW50VmFsdWUodmFsdWUsIHBhdGgsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRlc2NyaXB0b3IgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt0eXBlb2YgdmFsdWV9YClcbiAgfVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkZXNjcmlwdG9yIGNvbnRhaW5zIGEgY3ljbGUgYXQgJHtwYXRofWApXG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSlcblxuICB0cnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgY2FwdHVyZWRFbnRyaWVzID0gdmFsdWUubWFwKChlbnRyeSwgaW5kZXgpID0+IGNhcHR1cmVUZW5hbnRWYWx1ZShlbnRyeSwgY2hpbGRQYXRoKHBhdGgsIGluZGV4KSwgYW5jZXN0b3JzKSlcblxuICAgICAgT2JqZWN0LmZyZWV6ZShjYXB0dXJlZEVudHJpZXMpXG5cbiAgICAgIHJldHVybiBjYXB0dXJlZEVudHJpZXNcbiAgICB9XG5cbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRlc2NyaXB0b3IgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt2YWx1ZUNsYXNzTmFtZSh2YWx1ZSl9YClcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1RlbmFudERlc2NyaXB0b3J9ICovXG4gICAgY29uc3QgY2FwdHVyZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBkZWZpbmVDYXB0dXJlZERhdGFQcm9wZXJ0eShjYXB0dXJlZCwga2V5LCBjYXB0dXJlVGVuYW50VmFsdWUoZW50cnksIGNoaWxkUGF0aChwYXRoLCBrZXkpLCBhbmNlc3RvcnMpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNhcHR1cmVkKVxuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBDYXB0dXJlcyBhIHJvb3QgYXBwbGljYXRpb24gdGVuYW50IGRlc2NyaXB0b3IuXG4gKiBAcGFyYW0ge29iamVjdH0gdGVuYW50IC0gT3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgSlNPTi1jb21wYXRpYmxlIHRlbmFudCBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1RlbmFudERlc2NyaXB0b3J9IC0gSW1tdXRhYmxlIGRlc2NyaXB0b3Igc25hcHNob3QuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVUZW5hbnQodGVuYW50KSB7XG4gIHJldHVybiAvKiogQHR5cGUge1RlbmFudERlc2NyaXB0b3J9ICovIChjYXB0dXJlVGVuYW50VmFsdWUodGVuYW50LCBcIlwiLCBuZXcgU2V0KCkpKVxufVxuXG4vKipcbiAqIERlZXBseSBjYXB0dXJlcyBjb25maWd1cmF0aW9uIHZhbHVlcyB3aGlsZSByZXRhaW5pbmcgZnVuY3Rpb24vY2xhc3MgaWRlbnRpdGllcy5cbiAqIE11dGFibGUgbm9uLXBsYWluIHJ1bnRpbWUgb2JqZWN0cyBhcmUgcmVqZWN0ZWQgYmVjYXVzZSByZXRhaW5pbmcgdGhlbSB3b3VsZCBsZXRcbiAqIGNhbGxlcnMgcmVkaXJlY3QgYSBoYW5kbGUgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBDb25maWd1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBDb25maWd1cmF0aW9uIHBhdGguXG4gKiBAcGFyYW0ge1NldDxvYmplY3Q+fSBhbmNlc3RvcnMgLSBBY3RpdmUgYW5jZXN0b3Igb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBJbW11dGFibGUgY2FwdHVyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVDb25maWd1cmF0aW9uVmFsdWUodmFsdWUsIHBhdGgsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt0eXBlb2YgdmFsdWV9YClcbiAgfVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGEgY3ljbGUgYXQgJHtwYXRofWApXG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmIChPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIG11dGFibGUgdmFsdWUgYXQgJHtwYXRofTogJHt2YWx1ZUNsYXNzTmFtZSh2YWx1ZSl9YClcbiAgfVxuXG4gIGFuY2VzdG9ycy5hZGQodmFsdWUpXG5cbiAgdHJ5IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBjYXB0dXJlQ29uZmlndXJhdGlvblZhbHVlKGVudHJ5LCBjaGlsZFBhdGgocGF0aCwgaW5kZXgpLCBhbmNlc3RvcnMpKSlcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCBjYXB0dXJlZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGRlZmluZUNhcHR1cmVkRGF0YVByb3BlcnR5KGNhcHR1cmVkLCBrZXksIGNhcHR1cmVDb25maWd1cmF0aW9uVmFsdWUoZW50cnksIGNoaWxkUGF0aChwYXRoLCBrZXkpLCBhbmNlc3RvcnMpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNhcHR1cmVkKVxuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBDb3BpZXMgYW5kIGRlZXBseSBmcmVlemVzIGEgcmVzb2x2ZWQgcGh5c2ljYWwgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gLSBDYXB0dXJlZCBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlRGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIChcbiAgICBjYXB0dXJlQ29uZmlndXJhdGlvblZhbHVlKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgXCJkYXRhYmFzZUNvbmZpZ3VyYXRpb25cIiwgbmV3IFNldCgpKVxuICApXG59XG5cbi8qKlxuICogSW1tdXRhYmxlIHRlbmFudC9kYXRhYmFzZSBoYW5kbGUuIFBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb25zIGFyZVxuICogcmVzb2x2ZWQgYW5kIGNhcHR1cmVkIGF0IGNvbnN0cnVjdGlvbiwgc28gbGF0ZXIgYW1iaWVudCB0ZW5hbnQgY2hhbmdlc1xuICogY2Fubm90IHJlZGlyZWN0IHdvcmsgcGVyZm9ybWVkIHRocm91Z2ggdGhpcyBoYW5kbGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbmFudEhhbmRsZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEhhbmRsZSBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBPd25pbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MudGVuYW50IC0gT3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgSlNPTi1jb21wYXRpYmxlIGFwcGxpY2F0aW9uIHRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHRlbmFudH0pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIlRlbmFudEhhbmRsZSByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb25cIilcbiAgICBpZiAoIXRlbmFudCB8fCB0eXBlb2YgdGVuYW50ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodGVuYW50KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRlbmFudEhhbmRsZSByZXF1aXJlcyBhIHRlbmFudCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBjb25zdCBjYXB0dXJlZFRlbmFudCA9IGNhcHR1cmVUZW5hbnQodGVuYW50KVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlPn0gKi9cbiAgICBjb25zdCBkYXRhYmFzZUNvbmZpZ3VyYXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGNvbnN0IGRpc2FibGVkSWRlbnRpZmllcnMgPSBjb25maWd1cmF0aW9uLmdldERpc2FibGVkRGF0YWJhc2VJZGVudGlmaWVycygpXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKSkpIHtcbiAgICAgIGlmIChkaXNhYmxlZElkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkgY29udGludWVcbiAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc0RhdGFiYXNlSWRlbnRpZmllckFjdGl2ZShpZGVudGlmaWVyLCBjYXB0dXJlZFRlbmFudCkpIGNvbnRpbnVlXG5cbiAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbnNbaWRlbnRpZmllcl0gPSBjYXB0dXJlRGF0YWJhc2VDb25maWd1cmF0aW9uKFxuICAgICAgICBjb25maWd1cmF0aW9uLnJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24oaWRlbnRpZmllciwgY2FwdHVyZWRUZW5hbnQpXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUNvbmZpZ3VyYXRpb25zID0gT2JqZWN0LmZyZWV6ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb25zKVxuICAgIHRoaXMuX3RlbmFudCA9IGNhcHR1cmVkVGVuYW50XG5cbiAgICBPYmplY3QuZnJlZXplKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FwdHVyZWQgdGVuYW50IGRlc2NyaXB0b3IuIFJvdXRpbmcgbmV2ZXIgcmUtcmVzb2x2ZXMgcGh5c2ljYWxcbiAgICogaWRlbnRpdHkgZnJvbSB0aGlzIHZhbHVlIGFmdGVyIGhhbmRsZSBjb25zdHJ1Y3Rpb24uXG4gICAqIEByZXR1cm5zIHtUZW5hbnREZXNjcmlwdG9yfSAtIFRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgdGVuYW50KCkge1xuICAgIHJldHVybiB0aGlzLl90ZW5hbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjYXB0dXJlZCBwaHlzaWNhbCBjb25maWd1cmF0aW9uIGZvciBhbiBhY3RpdmUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRlbnRpZmllciAtIExvZ2ljYWwgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gLSBDYXB0dXJlZCByZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcikge1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlndXJhdGlvbiA9IHRoaXMuX2RhdGFiYXNlQ29uZmlndXJhdGlvbnNbZGF0YWJhc2VJZGVudGlmaWVyXVxuXG4gICAgaWYgKCFkYXRhYmFzZUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBvciBpbmFjdGl2ZSBkYXRhYmFzZSBpZGVudGlmaWVyIGZvciB0ZW5hbnQgaGFuZGxlOiAke2RhdGFiYXNlSWRlbnRpZmllcn1gKVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhYmFzZUNvbmZpZ3VyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBvcHRpb25zIC0gTGlmZWN5Y2xlIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRvbmx5PFRlbmFudFNxbGl0ZUxpZmVjeWNsZVNuYXBzaG90Pj59IC0gU2FmZSBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBhc3luYyBvcGVuKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7ZGF0YWJhc2VJZGVudGlmaWVyfSA9IG9wdGlvbnNcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLm9wZW4oZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpKVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoZXMgdGhpcyBjYXB0dXJlZCBTUUxpdGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nfX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxUZW5hbnRTcWxpdGVMaWZlY3ljbGVTbmFwc2hvdD4+fSAtIFNhZmUgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgYXN5bmMgZmx1c2gob3B0aW9ucykge1xuICAgIGNvbnN0IHtkYXRhYmFzZUlkZW50aWZpZXJ9ID0gb3B0aW9uc1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuZmx1c2goZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIGZsdXNoPzogYm9vbGVhbn19IG9wdGlvbnMgLSBMaWZlY3ljbGUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+Pn0gLSBTYWZlIGxpZmVjeWNsZSBzbmFwc2hvdC5cbiAgICovXG4gIGFzeW5jIGNsb3NlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7ZGF0YWJhc2VJZGVudGlmaWVyLCBmbHVzaCA9IGZhbHNlfSA9IG9wdGlvbnNcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLmNsb3NlKGRhdGFiYXNlSWRlbnRpZmllciwgdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSwge2ZsdXNofSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoaXMgY2FwdHVyZWQgU1FMaXRlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3tkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZ319IG9wdGlvbnMgLSBMaWZlY3ljbGUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+Pn0gLSBDbG9zZWQgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKG9wdGlvbnMpIHtcbiAgICBjb25zdCB7ZGF0YWJhc2VJZGVudGlmaWVyfSA9IG9wdGlvbnNcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLmRlbGV0ZShkYXRhYmFzZUlkZW50aWZpZXIsIHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcikpXG4gIH1cblxuICAvKipcbiAgICogSW5zcGVjdHMgdGhpcyBjYXB0dXJlZCBTUUxpdGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nfX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+fSAtIFNhZmUgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgaW5zcGVjdChvcHRpb25zKSB7XG4gICAgY29uc3Qge2RhdGFiYXNlSWRlbnRpZmllcn0gPSBvcHRpb25zXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb24uZ2V0RnJvbnRlbmRUZW5hbnRTcWxpdGVMaWZlY3ljbGUoKS5pbnNwZWN0KGRhdGFiYXNlSWRlbnRpZmllciwgdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdvcmsgd2hpbGUgdGhpcyBjYXB0dXJlZCBTUUxpdGUgaWRlbnRpdHkgaXMgcHJvdGVjdGVkIGZyb20gZXZpY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nfX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gUGlubmVkIHdvcmsuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhQaW4oe2RhdGFiYXNlSWRlbnRpZmllcn0sIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb24uZ2V0RnJvbnRlbmRUZW5hbnRTcWxpdGVMaWZlY3ljbGUoKS53aXRoUGluKGRhdGFiYXNlSWRlbnRpZmllciwgdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyBleHBsaWNpdCBPUk0gd29yayBvbiBvbmUgcGlubmVkIGNvbm5lY3Rpb24gZm9yIHRoaXMgaGFuZGxlJ3MgY2FwdHVyZWRcbiAgICogcGh5c2ljYWwgZGF0YWJhc2UuIFVzZSBgb3BlcmF0aW9uLmZvck1vZGVsKE1vZGVsQ2xhc3MpYCBmb3IgcXVlcmllcyBhbmRcbiAgICogd3JpdGVzOyBsb2FkZWQgcmVjb3JkcyBhbmQgYXNzb2NpYXRpb24vcHJlbG9hZCB3b3JrIHJldGFpbiB0aGF0IG9wZXJhdGlvbi5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmd9fSBvcHRpb25zIC0gTG9naWNhbCBkYXRhYmFzZSBhbmQgY2hlY2tvdXQgbmFtZS5cbiAgICogQHBhcmFtIHsob3BlcmF0aW9uOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9vcGVyYXRpb24uanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPd25lZCB3b3JrIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBkYXRhYmFzZU9wZXJhdGlvbih7ZGF0YWJhc2VJZGVudGlmaWVyLCBuYW1lID0gXCJUZW5hbnRIYW5kbGUuZGF0YWJhc2VPcGVyYXRpb25cIn0sIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgZGF0YWJhc2VDb25maWd1cmF0aW9uID0gdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKVxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuZGF0YWJhc2VPcGVyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb24ud2l0aERhdGFiYXNlT3BlcmF0aW9uKHtcbiAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbixcbiAgICAgIGRhdGFiYXNlSWRlbnRpZmllcixcbiAgICAgIG5hbWUsXG4gICAgICB0ZW5hbnQ6IHRoaXMuX3RlbmFudFxuICAgIH0sIGNhbGxiYWNrKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IE9STSB3b3JrIGluIGEgdHJhbnNhY3Rpb24gcGlubmVkIHRvIHRoaXMgaGFuZGxlJ3MgY2FwdHVyZWRcbiAgICogcGh5c2ljYWwgZGF0YWJhc2UuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nLCBuYW1lPzogc3RyaW5nfX0gb3B0aW9ucyAtIExvZ2ljYWwgZGF0YWJhc2UgYW5kIGNoZWNrb3V0IG5hbWUuXG4gICAqIEBwYXJhbSB7KG9wZXJhdGlvbjogaW1wb3J0KFwiLi4vZGF0YWJhc2Uvb3BlcmF0aW9uLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gVHJhbnNhY3Rpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHRyYW5zYWN0aW9uKHtkYXRhYmFzZUlkZW50aWZpZXIsIG5hbWUgPSBcIlRlbmFudEhhbmRsZS50cmFuc2FjdGlvblwifSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5kYXRhYmFzZU9wZXJhdGlvbih7ZGF0YWJhc2VJZGVudGlmaWVyLCBuYW1lfSwgYXN5bmMgKG9wZXJhdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbi50cmFuc2FjdGlvbihhc3luYyAoKSA9PiBhd2FpdCBjYWxsYmFjayhvcGVyYXRpb24pKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWhhbmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW5hbnRzL3RlbmFudC1oYW5kbGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sUUFBUSxNQUFNLHlCQUF5QixDQUFBO0FBRTlDOzs7R0FHRztBQUNILHlFQUF5RTtBQUN6RSxxUEFBcVA7QUFFclA7Ozs7O0dBS0c7QUFDSCxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRztJQUMxQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFBO0lBRXJELE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO0FBQ3RDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixPQUFPLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQTtBQUM1QyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUs7SUFDcEQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ2pDLFlBQVksRUFBRSxJQUFJO1FBQ2xCLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLEtBQUs7UUFDTCxRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUztJQUNoRCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUMzRixJQUFJLE9B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QUFDLENBQ2IsQ0FBQTtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFDLGtCQUFrQixFQUFFLElBQUksR0FBRywwQkFBMEIsRUFBQyxFQUFFLFFBQVE7UUFDakYsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLGtCQUFrQixFQUFFLElBQUksRUFBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUNsRixPQUFPLE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFDM0UsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IE1pZ3JhdG9yIGZyb20gXCIuLi9kYXRhYmFzZS9taWdyYXRvci5qc1wiXG5cbi8qKlxuICogVGVuYW50RGVzY3JpcHRvclZhbHVlIHR5cGUuXG4gKiBAdHlwZWRlZiB7bnVsbCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBUZW5hbnREZXNjcmlwdG9yVmFsdWVbXSB8IHtba2V5OiBzdHJpbmddOiBUZW5hbnREZXNjcmlwdG9yVmFsdWV9fSBUZW5hbnREZXNjcmlwdG9yVmFsdWVcbiAqL1xuLyoqIEB0eXBlZGVmIHt7W2tleTogc3RyaW5nXTogVGVuYW50RGVzY3JpcHRvclZhbHVlfX0gVGVuYW50RGVzY3JpcHRvciAqL1xuLyoqIEB0eXBlZGVmIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIGRpcnR5OiBib29sZWFuLCBsYXN0VXNlZDogbnVtYmVyLCBwaW5Db3VudDogbnVtYmVyLCByZWFkeTogYm9vbGVhbiwgc2NoZW1hR2VuZXJhdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBzdGF0ZTogXCJjbG9zZWRcIiB8IFwiY2xvc2luZ1wiIHwgXCJkZWxldGluZ1wiIHwgXCJvcGVuXCIgfCBcIm9wZW5pbmdcIn19IFRlbmFudFNxbGl0ZUxpZmVjeWNsZVNuYXBzaG90ICovXG5cbi8qKlxuICogUmV0dXJucyBhIHJlYWRhYmxlIHBhdGggZm9yIGEgY2FwdHVyZWQgZGVzY3JpcHRvci9jb25maWd1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXJlbnQgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBrZXkgLSBDaGlsZCBrZXkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIENoaWxkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIGNoaWxkUGF0aChwYXRoLCBrZXkpIHtcbiAgaWYgKHR5cGVvZiBrZXkgPT09IFwibnVtYmVyXCIpIHJldHVybiBgJHtwYXRofVske2tleX1dYFxuXG4gIHJldHVybiBwYXRoID8gYCR7cGF0aH0uJHtrZXl9YCA6IGtleVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJ1bnRpbWUgY2xhc3MgbGFiZWwgZm9yIGFuIHVuc3VwcG9ydGVkIGNhcHR1cmUgdmFsdWUuXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWUgLSBVbnN1cHBvcnRlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUnVudGltZSBjbGFzcyBsYWJlbC5cbiAqL1xuZnVuY3Rpb24gdmFsdWVDbGFzc05hbWUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lIHx8IFwib2JqZWN0XCJcbn1cblxuLyoqXG4gKiBEZWZpbmVzIG9uZSBjYXB0dXJlZCBrZXkgd2l0aG91dCBpbnZva2luZyBpbmhlcml0ZWQgc2V0dGVycyBzdWNoIGFzXG4gKiBgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX19gLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHRhcmdldCAtIENhcHR1cmVkIG9iamVjdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBPd24ga2V5IHRvIGRlZmluZS5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gQ2FwdHVyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUNhcHR1cmVkRGF0YVByb3BlcnR5KHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIERlZXBseSBjb3BpZXMgYW5kIGZyZWV6ZXMgYSBKU09OLWNvbXBhdGlibGUgdGVuYW50IGRlc2NyaXB0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlIHRvIGNhcHR1cmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIERlc2NyaXB0b3IgcGF0aC5cbiAqIEBwYXJhbSB7U2V0PG9iamVjdD59IGFuY2VzdG9ycyAtIEFjdGl2ZSBhbmNlc3RvciBvYmplY3RzIHVzZWQgZm9yIGN5Y2xlIGRldGVjdGlvbi5cbiAqIEByZXR1cm5zIHtUZW5hbnREZXNjcmlwdG9yVmFsdWV9IC0gSW1tdXRhYmxlIGNhcHR1cmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlVGVuYW50VmFsdWUodmFsdWUsIHBhdGgsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiB2YWx1ZVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRlc2NyaXB0b3IgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt0eXBlb2YgdmFsdWV9YClcbiAgfVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkZXNjcmlwdG9yIGNvbnRhaW5zIGEgY3ljbGUgYXQgJHtwYXRofWApXG5cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSlcblxuICB0cnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgY2FwdHVyZWRFbnRyaWVzID0gdmFsdWUubWFwKChlbnRyeSwgaW5kZXgpID0+IGNhcHR1cmVUZW5hbnRWYWx1ZShlbnRyeSwgY2hpbGRQYXRoKHBhdGgsIGluZGV4KSwgYW5jZXN0b3JzKSlcblxuICAgICAgT2JqZWN0LmZyZWV6ZShjYXB0dXJlZEVudHJpZXMpXG5cbiAgICAgIHJldHVybiBjYXB0dXJlZEVudHJpZXNcbiAgICB9XG5cbiAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRlc2NyaXB0b3IgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt2YWx1ZUNsYXNzTmFtZSh2YWx1ZSl9YClcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1RlbmFudERlc2NyaXB0b3J9ICovXG4gICAgY29uc3QgY2FwdHVyZWQgPSB7fVxuXG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBkZWZpbmVDYXB0dXJlZERhdGFQcm9wZXJ0eShjYXB0dXJlZCwga2V5LCBjYXB0dXJlVGVuYW50VmFsdWUoZW50cnksIGNoaWxkUGF0aChwYXRoLCBrZXkpLCBhbmNlc3RvcnMpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNhcHR1cmVkKVxuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBDYXB0dXJlcyBhIHJvb3QgYXBwbGljYXRpb24gdGVuYW50IGRlc2NyaXB0b3IuXG4gKiBAcGFyYW0ge29iamVjdH0gdGVuYW50IC0gT3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgSlNPTi1jb21wYXRpYmxlIHRlbmFudCBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1RlbmFudERlc2NyaXB0b3J9IC0gSW1tdXRhYmxlIGRlc2NyaXB0b3Igc25hcHNob3QuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVUZW5hbnQodGVuYW50KSB7XG4gIHJldHVybiAvKiogQHR5cGUge1RlbmFudERlc2NyaXB0b3J9ICovIChjYXB0dXJlVGVuYW50VmFsdWUodGVuYW50LCBcIlwiLCBuZXcgU2V0KCkpKVxufVxuXG4vKipcbiAqIERlZXBseSBjYXB0dXJlcyBjb25maWd1cmF0aW9uIHZhbHVlcyB3aGlsZSByZXRhaW5pbmcgZnVuY3Rpb24vY2xhc3MgaWRlbnRpdGllcy5cbiAqIE11dGFibGUgbm9uLXBsYWluIHJ1bnRpbWUgb2JqZWN0cyBhcmUgcmVqZWN0ZWQgYmVjYXVzZSByZXRhaW5pbmcgdGhlbSB3b3VsZCBsZXRcbiAqIGNhbGxlcnMgcmVkaXJlY3QgYSBoYW5kbGUgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBDb25maWd1cmF0aW9uIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBDb25maWd1cmF0aW9uIHBhdGguXG4gKiBAcGFyYW0ge1NldDxvYmplY3Q+fSBhbmNlc3RvcnMgLSBBY3RpdmUgYW5jZXN0b3Igb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gLSBJbW11dGFibGUgY2FwdHVyZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNhcHR1cmVDb25maWd1cmF0aW9uVmFsdWUodmFsdWUsIHBhdGgsIGFuY2VzdG9ycykge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGVuYW50IGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdmFsdWUgYXQgJHtwYXRofTogJHt0eXBlb2YgdmFsdWV9YClcbiAgfVxuICBpZiAoYW5jZXN0b3JzLmhhcyh2YWx1ZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGEgY3ljbGUgYXQgJHtwYXRofWApXG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgcHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmIChPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFRlbmFudCBkYXRhYmFzZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIG11dGFibGUgdmFsdWUgYXQgJHtwYXRofTogJHt2YWx1ZUNsYXNzTmFtZSh2YWx1ZSl9YClcbiAgfVxuXG4gIGFuY2VzdG9ycy5hZGQodmFsdWUpXG5cbiAgdHJ5IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBjYXB0dXJlQ29uZmlndXJhdGlvblZhbHVlKGVudHJ5LCBjaGlsZFBhdGgocGF0aCwgaW5kZXgpLCBhbmNlc3RvcnMpKSlcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi9cbiAgICBjb25zdCBjYXB0dXJlZCA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGRlZmluZUNhcHR1cmVkRGF0YVByb3BlcnR5KGNhcHR1cmVkLCBrZXksIGNhcHR1cmVDb25maWd1cmF0aW9uVmFsdWUoZW50cnksIGNoaWxkUGF0aChwYXRoLCBrZXkpLCBhbmNlc3RvcnMpKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGNhcHR1cmVkKVxuICB9IGZpbmFsbHkge1xuICAgIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpXG4gIH1cbn1cblxuLyoqXG4gKiBDb3BpZXMgYW5kIGRlZXBseSBmcmVlemVzIGEgcmVzb2x2ZWQgcGh5c2ljYWwgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gLSBSZXNvbHZlZCBkYXRhYmFzZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gLSBDYXB0dXJlZCBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBjYXB0dXJlRGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkRhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9ICovIChcbiAgICBjYXB0dXJlQ29uZmlndXJhdGlvblZhbHVlKGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgXCJkYXRhYmFzZUNvbmZpZ3VyYXRpb25cIiwgbmV3IFNldCgpKVxuICApXG59XG5cbi8qKlxuICogSW1tdXRhYmxlIHRlbmFudC9kYXRhYmFzZSBoYW5kbGUuIFBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb25zIGFyZVxuICogcmVzb2x2ZWQgYW5kIGNhcHR1cmVkIGF0IGNvbnN0cnVjdGlvbiwgc28gbGF0ZXIgYW1iaWVudCB0ZW5hbnQgY2hhbmdlc1xuICogY2Fubm90IHJlZGlyZWN0IHdvcmsgcGVyZm9ybWVkIHRocm91Z2ggdGhpcyBoYW5kbGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlbmFudEhhbmRsZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEhhbmRsZSBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBPd25pbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MudGVuYW50IC0gT3JkaW5hcnkgb3IgbnVsbC1wcm90b3R5cGUgSlNPTi1jb21wYXRpYmxlIGFwcGxpY2F0aW9uIHRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHRlbmFudH0pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIlRlbmFudEhhbmRsZSByZXF1aXJlcyBhIGNvbmZpZ3VyYXRpb25cIilcbiAgICBpZiAoIXRlbmFudCB8fCB0eXBlb2YgdGVuYW50ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodGVuYW50KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRlbmFudEhhbmRsZSByZXF1aXJlcyBhIHRlbmFudCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBjb25zdCBjYXB0dXJlZFRlbmFudCA9IGNhcHR1cmVUZW5hbnQodGVuYW50KVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlPn0gKi9cbiAgICBjb25zdCBkYXRhYmFzZUNvbmZpZ3VyYXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGNvbnN0IGRpc2FibGVkSWRlbnRpZmllcnMgPSBjb25maWd1cmF0aW9uLmdldERpc2FibGVkRGF0YWJhc2VJZGVudGlmaWVycygpXG5cbiAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgT2JqZWN0LmtleXMoY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKSkpIHtcbiAgICAgIGlmIChkaXNhYmxlZElkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkgY29udGludWVcbiAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc0RhdGFiYXNlSWRlbnRpZmllckFjdGl2ZShpZGVudGlmaWVyLCBjYXB0dXJlZFRlbmFudCkpIGNvbnRpbnVlXG5cbiAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbnNbaWRlbnRpZmllcl0gPSBjYXB0dXJlRGF0YWJhc2VDb25maWd1cmF0aW9uKFxuICAgICAgICBjb25maWd1cmF0aW9uLnJlc29sdmVEYXRhYmFzZUNvbmZpZ3VyYXRpb24oaWRlbnRpZmllciwgY2FwdHVyZWRUZW5hbnQpXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUNvbmZpZ3VyYXRpb25zID0gT2JqZWN0LmZyZWV6ZShkYXRhYmFzZUNvbmZpZ3VyYXRpb25zKVxuICAgIHRoaXMuX3RlbmFudCA9IGNhcHR1cmVkVGVuYW50XG5cbiAgICBPYmplY3QuZnJlZXplKHRoaXMpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2FwdHVyZWQgdGVuYW50IGRlc2NyaXB0b3IuIFJvdXRpbmcgbmV2ZXIgcmUtcmVzb2x2ZXMgcGh5c2ljYWxcbiAgICogaWRlbnRpdHkgZnJvbSB0aGlzIHZhbHVlIGFmdGVyIGhhbmRsZSBjb25zdHJ1Y3Rpb24uXG4gICAqIEByZXR1cm5zIHtUZW5hbnREZXNjcmlwdG9yfSAtIFRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgdGVuYW50KCkge1xuICAgIHJldHVybiB0aGlzLl90ZW5hbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3RzIHVzaW5nIHRoaXMgaGFuZGxlIHdpdGggYSBkaWZmZXJlbnQgQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBFeHBlY3RlZCBvd25lci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnRDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAhPT0gdGhpcy5fY29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGVuYW50IGhhbmRsZSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IFZlbG9jaW91cyBjb25maWd1cmF0aW9uXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNhcHR1cmVkIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGFjdGl2ZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZGVudGlmaWVyIC0gTG9naWNhbCBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSAtIENhcHR1cmVkIHJlc29sdmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBkYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSB7XG4gICAgY29uc3QgZGF0YWJhc2VDb25maWd1cmF0aW9uID0gdGhpcy5fZGF0YWJhc2VDb25maWd1cmF0aW9uc1tkYXRhYmFzZUlkZW50aWZpZXJdXG5cbiAgICBpZiAoIWRhdGFiYXNlQ29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9yIGluYWN0aXZlIGRhdGFiYXNlIGlkZW50aWZpZXIgZm9yIHRlbmFudCBoYW5kbGU6ICR7ZGF0YWJhc2VJZGVudGlmaWVyfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFiYXNlQ29uZmlndXJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoaXMgY2FwdHVyZWQgU1FMaXRlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3tkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZ319IG9wdGlvbnMgLSBMaWZlY3ljbGUgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+Pn0gLSBTYWZlIGxpZmVjeWNsZSBzbmFwc2hvdC5cbiAgICovXG4gIGFzeW5jIG9wZW4ob3B0aW9ucykge1xuICAgIGNvbnN0IHtkYXRhYmFzZUlkZW50aWZpZXJ9ID0gb3B0aW9uc1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkub3BlbihkYXRhYmFzZUlkZW50aWZpZXIsIHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcikpXG4gIH1cblxuICAvKipcbiAgICogT3BlbnMsIG1pZ3JhdGVzLCBhbmQgaW5pdGlhbGl6ZXMgcmVjb3JkIG1ldGFkYXRhIGZvciBvbmUgY2FwdHVyZWQgcGh5c2ljYWxcbiAgICogdGVuYW50IFNRTGl0ZSBkYXRhYmFzZSBhbmQgYXBwbGljYXRpb24gc2NoZW1hIGdlbmVyYXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gSW5pdGlhbGl6YXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZGF0YWJhc2VJZGVudGlmaWVyIC0gVGVuYW50LW9ubHkgbG9naWNhbCBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdG9yL3R5cGVzLmpzXCIpLlJlcXVpcmVNaWdyYXRpb25Db250ZXh0VHlwZX0gb3B0aW9ucy5taWdyYXRpb25zIC0gRnJvbnRlbmQgbWlncmF0aW9uIHJlcXVpcmUgY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2NoZW1hR2VuZXJhdGlvbiAtIFN0YWJsZSBhcHBsaWNhdGlvbiBzY2hlbWEgZ2VuZXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVhZG9ubHk8VGVuYW50U3FsaXRlTGlmZWN5Y2xlU25hcHNob3Q+Pn0gLSBSZWFkeSBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKHtkYXRhYmFzZUlkZW50aWZpZXIsIG1pZ3JhdGlvbnMsIHNjaGVtYUdlbmVyYXRpb259KSB7XG4gICAgaWYgKCFtaWdyYXRpb25zIHx8IHR5cGVvZiBtaWdyYXRpb25zICE9PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIG1pZ3JhdGlvbnMua2V5cyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGVuYW50SGFuZGxlLmluaXRpYWxpemUgcmVxdWlyZXMgYSBtaWdyYXRpb25zIHJlcXVpcmUgY29udGV4dFwiKVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlndXJhdGlvbiA9IHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcilcbiAgICBjb25zdCBsaWZlY3ljbGUgPSB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKClcblxuICAgIHJldHVybiBhd2FpdCBsaWZlY3ljbGUuaW5pdGlhbGl6ZShkYXRhYmFzZUlkZW50aWZpZXIsIGRhdGFiYXNlQ29uZmlndXJhdGlvbiwgc2NoZW1hR2VuZXJhdGlvbiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fZGF0YWJhc2VPcGVyYXRpb24oe1xuICAgICAgICBkYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICAgIG5hbWU6IGBJbml0aWFsaXplIGZyb250ZW5kIHRlbmFudCBkYXRhYmFzZTogJHtkYXRhYmFzZUlkZW50aWZpZXJ9YCxcbiAgICAgICAgcmVxdWlyZVJlYWR5OiBmYWxzZSxcbiAgICAgICAgc2NoZW1hR2VuZXJhdGlvblxuICAgICAgfSwgYXN5bmMgKG9wZXJhdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcih7Y29uZmlndXJhdGlvbjogdGhpcy5fY29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyczogW2RhdGFiYXNlSWRlbnRpZmllcl19KVxuXG4gICAgICAgIG9wZXJhdGlvbi5jb25uZWN0aW9uKCkuY2xlYXJTY2hlbWFDYWNoZSgpXG4gICAgICAgIGF3YWl0IG1pZ3JhdG9yLm1pZ3JhdGVSZXF1aXJlQ29udGV4dEZvckRhdGFiYXNlKHtcbiAgICAgICAgICBkYXRhYmFzZUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgICAgIGRiOiBvcGVyYXRpb24uY29ubmVjdGlvbigpLFxuICAgICAgICAgIHJlcXVpcmVDb250ZXh0OiBtaWdyYXRpb25zXG4gICAgICAgIH0pXG4gICAgICAgIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZU1vZGVscyh7dHlwZTogXCJmcm9udGVuZC10ZW5hbnRcIn0pXG5cbiAgICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzIG9mIE9iamVjdC52YWx1ZXModGhpcy5fY29uZmlndXJhdGlvbi5nZXRNb2RlbENsYXNzZXMoKSkpIHtcbiAgICAgICAgICBpZiAobW9kZWxDbGFzcy5nZXREYXRhYmFzZUlkZW50aWZpZXIoe3RlbmFudDogdGhpcy5fdGVuYW50fSkgIT09IGRhdGFiYXNlSWRlbnRpZmllcikgY29udGludWVcbiAgICAgICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IG9wZXJhdGlvbi5jb25uZWN0aW9uKCkuZ2V0VGFibGVCeU5hbWUobW9kZWxDbGFzcy50YWJsZU5hbWUoKSwge3Rocm93RXJyb3I6IGZhbHNlfSlcblxuICAgICAgICAgIGlmICghdGFibGUgJiYgIW1vZGVsQ2xhc3MuZ2V0RWFnZXJMb2FkUmVjb3JkTWV0YWRhdGEoKSkgY29udGludWVcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobW9kZWxDbGFzcy5nZXRUcmFuc2xhdGlvbnNNYXAoKSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zVGFibGUgPSBhd2FpdCBvcGVyYXRpb24uY29ubmVjdGlvbigpLmdldFRhYmxlQnlOYW1lKG1vZGVsQ2xhc3MuZ2V0VHJhbnNsYXRpb25zVGFibGVOYW1lKCksIHt0aHJvd0Vycm9yOiBmYWxzZX0pXG5cbiAgICAgICAgICAgIGlmICghdHJhbnNsYXRpb25zVGFibGUgJiYgIW1vZGVsQ2xhc3MuZ2V0RWFnZXJMb2FkUmVjb3JkTWV0YWRhdGEoKSkgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBvcGVyYXRpb24uZW5zdXJlTW9kZWxJbml0aWFsaXplZChtb2RlbENsYXNzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmx1c2hlcyB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBvcHRpb25zIC0gTGlmZWN5Y2xlIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRvbmx5PFRlbmFudFNxbGl0ZUxpZmVjeWNsZVNuYXBzaG90Pj59IC0gU2FmZSBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBhc3luYyBmbHVzaChvcHRpb25zKSB7XG4gICAgY29uc3Qge2RhdGFiYXNlSWRlbnRpZmllcn0gPSBvcHRpb25zXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb24uZ2V0RnJvbnRlbmRUZW5hbnRTcWxpdGVMaWZlY3ljbGUoKS5mbHVzaChkYXRhYmFzZUlkZW50aWZpZXIsIHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcikpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoaXMgY2FwdHVyZWQgU1FMaXRlIGlkZW50aXR5LlxuICAgKiBAcGFyYW0ge3tkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgZmx1c2g/OiBib29sZWFufX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxUZW5hbnRTcWxpdGVMaWZlY3ljbGVTbmFwc2hvdD4+fSAtIFNhZmUgbGlmZWN5Y2xlIHNuYXBzaG90LlxuICAgKi9cbiAgYXN5bmMgY2xvc2Uob3B0aW9ucykge1xuICAgIGNvbnN0IHtkYXRhYmFzZUlkZW50aWZpZXIsIGZsdXNoID0gZmFsc2V9ID0gb3B0aW9uc1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuY2xvc2UoZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpLCB7Zmx1c2h9KVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhpcyBjYXB0dXJlZCBTUUxpdGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nfX0gb3B0aW9ucyAtIExpZmVjeWNsZSBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxUZW5hbnRTcWxpdGVMaWZlY3ljbGVTbmFwc2hvdD4+fSAtIENsb3NlZCBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBhc3luYyBkZWxldGUob3B0aW9ucykge1xuICAgIGNvbnN0IHtkYXRhYmFzZUlkZW50aWZpZXJ9ID0gb3B0aW9uc1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuZGVsZXRlKGRhdGFiYXNlSWRlbnRpZmllciwgdGhpcy5kYXRhYmFzZUNvbmZpZ3VyYXRpb24oZGF0YWJhc2VJZGVudGlmaWVyKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNwZWN0cyB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBvcHRpb25zIC0gTGlmZWN5Y2xlIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtSZWFkb25seTxUZW5hbnRTcWxpdGVMaWZlY3ljbGVTbmFwc2hvdD59IC0gU2FmZSBsaWZlY3ljbGUgc25hcHNob3QuXG4gICAqL1xuICBpbnNwZWN0KG9wdGlvbnMpIHtcbiAgICBjb25zdCB7ZGF0YWJhc2VJZGVudGlmaWVyfSA9IG9wdGlvbnNcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLmluc3BlY3QoZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd29yayB3aGlsZSB0aGlzIGNhcHR1cmVkIFNRTGl0ZSBpZGVudGl0eSBpcyBwcm90ZWN0ZWQgZnJvbSBldmljdGlvbi5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmd9fSBvcHRpb25zIC0gTGlmZWN5Y2xlIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBQaW5uZWQgd29yay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2l0aFBpbih7ZGF0YWJhc2VJZGVudGlmaWVyfSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvbi5nZXRGcm9udGVuZFRlbmFudFNxbGl0ZUxpZmVjeWNsZSgpLndpdGhQaW4oZGF0YWJhc2VJZGVudGlmaWVyLCB0aGlzLmRhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIpLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IE9STSB3b3JrIG9uIG9uZSBwaW5uZWQgY29ubmVjdGlvbiBmb3IgdGhpcyBoYW5kbGUncyBjYXB0dXJlZFxuICAgKiBwaHlzaWNhbCBkYXRhYmFzZS4gVXNlIGBvcGVyYXRpb24uZm9yTW9kZWwoTW9kZWxDbGFzcylgIGZvciBxdWVyaWVzIGFuZFxuICAgKiB3cml0ZXM7IGxvYWRlZCByZWNvcmRzIGFuZCBhc3NvY2lhdGlvbi9wcmVsb2FkIHdvcmsgcmV0YWluIHRoYXQgb3BlcmF0aW9uLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge3tkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgbmFtZT86IHN0cmluZ319IG9wdGlvbnMgLSBMb2dpY2FsIGRhdGFiYXNlIGFuZCBjaGVja291dCBuYW1lLlxuICAgKiBAcGFyYW0geyhvcGVyYXRpb246IGltcG9ydChcIi4uL2RhdGFiYXNlL29wZXJhdGlvbi5qc1wiKS5kZWZhdWx0KSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIE93bmVkIHdvcmsgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGRhdGFiYXNlT3BlcmF0aW9uKHtkYXRhYmFzZUlkZW50aWZpZXIsIG5hbWUgPSBcIlRlbmFudEhhbmRsZS5kYXRhYmFzZU9wZXJhdGlvblwifSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGF0YWJhc2VPcGVyYXRpb24oe2RhdGFiYXNlSWRlbnRpZmllciwgbmFtZSwgcmVxdWlyZVJlYWR5OiB0cnVlfSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhcHR1cmVkIG9wZXJhdGlvbiB3aXRoIGV4cGxpY2l0IHJlYWRpbmVzcyBwb2xpY3kuIEluaXRpYWxpemF0aW9uIGlzXG4gICAqIHRoZSBvbmx5IGNhbGxlciBhbGxvd2VkIHRvIGVudGVyIGFuIHVucmVhZHkgc2NoZW1hIGdlbmVyYXRpb24uXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7e2RhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHJlcXVpcmVSZWFkeTogYm9vbGVhbiwgc2NoZW1hR2VuZXJhdGlvbj86IHN0cmluZ319IG9wdGlvbnMgLSBJbnRlcm5hbCBvcGVyYXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsob3BlcmF0aW9uOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9vcGVyYXRpb24uanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBPcGVyYXRpb24gY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF9kYXRhYmFzZU9wZXJhdGlvbih7ZGF0YWJhc2VJZGVudGlmaWVyLCBuYW1lLCByZXF1aXJlUmVhZHksIHNjaGVtYUdlbmVyYXRpb259LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGRhdGFiYXNlQ29uZmlndXJhdGlvbiA9IHRoaXMuZGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllcilcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLmdldEZyb250ZW5kVGVuYW50U3FsaXRlTGlmZWN5Y2xlKCkuZGF0YWJhc2VPcGVyYXRpb24oXG4gICAgICBkYXRhYmFzZUlkZW50aWZpZXIsXG4gICAgICBkYXRhYmFzZUNvbmZpZ3VyYXRpb24sXG4gICAgICB7cmVxdWlyZVJlYWR5LCBzY2hlbWFHZW5lcmF0aW9ufSxcbiAgICAgIGFzeW5jIChvcGVyYXRpb25TY2hlbWFHZW5lcmF0aW9uKSA9PiBhd2FpdCB0aGlzLl9jb25maWd1cmF0aW9uLndpdGhEYXRhYmFzZU9wZXJhdGlvbih7XG4gICAgICAgIGRhdGFiYXNlQ29uZmlndXJhdGlvbixcbiAgICAgICAgZGF0YWJhc2VJZGVudGlmaWVyLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzY2hlbWFHZW5lcmF0aW9uOiBvcGVyYXRpb25TY2hlbWFHZW5lcmF0aW9uLFxuICAgICAgICB0ZW5hbnQ6IHRoaXMuX3RlbmFudFxuICAgICAgfSwgY2FsbGJhY2spXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhwbGljaXQgT1JNIHdvcmsgaW4gYSB0cmFuc2FjdGlvbiBwaW5uZWQgdG8gdGhpcyBoYW5kbGUncyBjYXB0dXJlZFxuICAgKiBwaHlzaWNhbCBkYXRhYmFzZS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHt7ZGF0YWJhc2VJZGVudGlmaWVyOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmd9fSBvcHRpb25zIC0gTG9naWNhbCBkYXRhYmFzZSBhbmQgY2hlY2tvdXQgbmFtZS5cbiAgICogQHBhcmFtIHsob3BlcmF0aW9uOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9vcGVyYXRpb24uanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBUcmFuc2FjdGlvbiBjYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgdHJhbnNhY3Rpb24oe2RhdGFiYXNlSWRlbnRpZmllciwgbmFtZSA9IFwiVGVuYW50SGFuZGxlLnRyYW5zYWN0aW9uXCJ9LCBjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmRhdGFiYXNlT3BlcmF0aW9uKHtkYXRhYmFzZUlkZW50aWZpZXIsIG5hbWV9LCBhc3luYyAob3BlcmF0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgb3BlcmF0aW9uLnRyYW5zYWN0aW9uKGFzeW5jICgpID0+IGF3YWl0IGNhbGxiYWNrKG9wZXJhdGlvbikpXG4gICAgfSlcbiAgfVxufVxuIl19
@@ -2,6 +2,7 @@
2
2
  import SystemTestBrowserHelper from "system-testing/build/system-test-browser-helper.js";
3
3
  import BrowserEnvironmentHandler from "../environment-handlers/browser.js";
4
4
  import runFrontendModelEventHookScenario from "./browser-frontend-model-event-hook-scenarios.js";
5
+ import runUseDatabaseSelectionTransitionScenario from "./browser-use-database-hook-scenarios.js";
5
6
  const root = document.getElementById("root") || (() => {
6
7
  const element = document.createElement("div");
7
8
  element.id = "root";
@@ -21,6 +22,7 @@ systemTestBrowserHelper.enableOnBrowser();
21
22
  Object.assign(globalThis, { velociousBrowserTest: {
22
23
  BrowserEnvironmentHandler,
23
24
  runFrontendModelEventHookScenario,
25
+ runUseDatabaseSelectionTransitionScenario,
24
26
  systemTestBrowserHelper
25
27
  } });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10ZXN0LWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Jyb3dzZXItdGVzdC1hcHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sdUJBQXVCLE1BQU0sb0RBQW9ELENBQUE7QUFDeEYsT0FBTyx5QkFBeUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMxRSxPQUFPLGlDQUFpQyxNQUFNLGtEQUFrRCxDQUFBO0FBRWhHLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFDcEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QyxPQUFPLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQTtJQUNuQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNsQyxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDLENBQUMsRUFBRSxDQUFBO0FBRUosTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzVELHNCQUFzQixDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsd0JBQXdCLENBQUMsQ0FBQTtBQUM1RSxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBRTVELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0MsU0FBUyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7QUFDbEQsU0FBUyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUE7QUFFL0Isc0JBQXNCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtBQUV4QyxNQUFNLHVCQUF1QixHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQTtBQUM3RCx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtBQUV6QyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFDLG9CQUFvQixFQUFFO1FBQy9DLHlCQUF5QjtRQUN6QixpQ0FBaUM7UUFDakMsdUJBQXVCO0tBQ3hCLEVBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlciBmcm9tIFwic3lzdGVtLXRlc3RpbmcvYnVpbGQvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanNcIlxuaW1wb3J0IEJyb3dzZXJFbnZpcm9ubWVudEhhbmRsZXIgZnJvbSBcIi4uL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jyb3dzZXIuanNcIlxuaW1wb3J0IHJ1bkZyb250ZW5kTW9kZWxFdmVudEhvb2tTY2VuYXJpbyBmcm9tIFwiLi9icm93c2VyLWZyb250ZW5kLW1vZGVsLWV2ZW50LWhvb2stc2NlbmFyaW9zLmpzXCJcblxuY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdFwiKSB8fCAoKCkgPT4ge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuICBlbGVtZW50LmlkID0gXCJyb290XCJcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KVxuICByZXR1cm4gZWxlbWVudFxufSkoKVxuXG5jb25zdCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuc3lzdGVtVGVzdGluZ0NvbXBvbmVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRlc3RpZFwiLCBcInN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbnN5c3RlbVRlc3RpbmdDb21wb25lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1mb2N1c3NlZFwiLCBcInRydWVcIilcblxuY29uc3QgYmxhbmtUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKVxuYmxhbmtUZXh0LnNldEF0dHJpYnV0ZShcImRhdGEtdGVzdGlkXCIsIFwiYmxhbmtUZXh0XCIpXG5ibGFua1RleHQudGV4dENvbnRlbnQgPSBcImJsYW5rXCJcblxuc3lzdGVtVGVzdGluZ0NvbXBvbmVudC5hcHBlbmRDaGlsZChibGFua1RleHQpXG5yb290LmFwcGVuZENoaWxkKHN5c3RlbVRlc3RpbmdDb21wb25lbnQpXG5cbmNvbnN0IHN5c3RlbVRlc3RCcm93c2VySGVscGVyID0gbmV3IFN5c3RlbVRlc3RCcm93c2VySGVscGVyKClcbnN5c3RlbVRlc3RCcm93c2VySGVscGVyLmVuYWJsZU9uQnJvd3NlcigpXG5cbk9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywge3ZlbG9jaW91c0Jyb3dzZXJUZXN0OiB7XG4gIEJyb3dzZXJFbnZpcm9ubWVudEhhbmRsZXIsXG4gIHJ1bkZyb250ZW5kTW9kZWxFdmVudEhvb2tTY2VuYXJpbyxcbiAgc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJcbn19KVxuIl19
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci10ZXN0LWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZXN0aW5nL2Jyb3dzZXItdGVzdC1hcHAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sdUJBQXVCLE1BQU0sb0RBQW9ELENBQUE7QUFDeEYsT0FBTyx5QkFBeUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUMxRSxPQUFPLGlDQUFpQyxNQUFNLGtEQUFrRCxDQUFBO0FBQ2hHLE9BQU8seUNBQXlDLE1BQU0sMENBQTBDLENBQUE7QUFFaEcsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFBO0lBQ25CLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xDLE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFFSixNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDNUQsc0JBQXNCLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBO0FBQzVFLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFFNUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMvQyxTQUFTLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQTtBQUNsRCxTQUFTLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQTtBQUUvQixzQkFBc0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO0FBRXhDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFBO0FBQzdELHVCQUF1QixDQUFDLGVBQWUsRUFBRSxDQUFBO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsb0JBQW9CLEVBQUU7UUFDL0MseUJBQXlCO1FBQ3pCLGlDQUFpQztRQUNqQyx5Q0FBeUM7UUFDekMsdUJBQXVCO0tBQ3hCLEVBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlciBmcm9tIFwic3lzdGVtLXRlc3RpbmcvYnVpbGQvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanNcIlxuaW1wb3J0IEJyb3dzZXJFbnZpcm9ubWVudEhhbmRsZXIgZnJvbSBcIi4uL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jyb3dzZXIuanNcIlxuaW1wb3J0IHJ1bkZyb250ZW5kTW9kZWxFdmVudEhvb2tTY2VuYXJpbyBmcm9tIFwiLi9icm93c2VyLWZyb250ZW5kLW1vZGVsLWV2ZW50LWhvb2stc2NlbmFyaW9zLmpzXCJcbmltcG9ydCBydW5Vc2VEYXRhYmFzZVNlbGVjdGlvblRyYW5zaXRpb25TY2VuYXJpbyBmcm9tIFwiLi9icm93c2VyLXVzZS1kYXRhYmFzZS1ob29rLXNjZW5hcmlvcy5qc1wiXG5cbmNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RcIikgfHwgKCgpID0+IHtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgZWxlbWVudC5pZCA9IFwicm9vdFwiXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudClcbiAgcmV0dXJuIGVsZW1lbnRcbn0pKClcblxuY29uc3Qgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbnN5c3RlbVRlc3RpbmdDb21wb25lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS10ZXN0aWRcIiwgXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG5zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LnNldEF0dHJpYnV0ZShcImRhdGEtZm9jdXNzZWRcIiwgXCJ0cnVlXCIpXG5cbmNvbnN0IGJsYW5rVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbmJsYW5rVGV4dC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXRlc3RpZFwiLCBcImJsYW5rVGV4dFwiKVxuYmxhbmtUZXh0LnRleHRDb250ZW50ID0gXCJibGFua1wiXG5cbnN5c3RlbVRlc3RpbmdDb21wb25lbnQuYXBwZW5kQ2hpbGQoYmxhbmtUZXh0KVxucm9vdC5hcHBlbmRDaGlsZChzeXN0ZW1UZXN0aW5nQ29tcG9uZW50KVxuXG5jb25zdCBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IG5ldyBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlcigpXG5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlci5lbmFibGVPbkJyb3dzZXIoKVxuXG5PYmplY3QuYXNzaWduKGdsb2JhbFRoaXMsIHt2ZWxvY2lvdXNCcm93c2VyVGVzdDoge1xuICBCcm93c2VyRW52aXJvbm1lbnRIYW5kbGVyLFxuICBydW5Gcm9udGVuZE1vZGVsRXZlbnRIb29rU2NlbmFyaW8sXG4gIHJ1blVzZURhdGFiYXNlU2VsZWN0aW9uVHJhbnNpdGlvblNjZW5hcmlvLFxuICBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxufX0pXG4iXX0=
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Flushes real React hook transitions and reports synchronous selection state,
3
+ * inline loader stability, and stale completion suppression.
4
+ * @returns {Promise<{firstChangedLoaded: boolean, initialLoaded: boolean, loaderCalls: string[], loadedAfterInlineLoaderRerender: boolean, thirdAfterStaleCompletion: {error: string | null, loaded: boolean}}>} - Render observations.
5
+ */
6
+ export default function runUseDatabaseSelectionTransitionScenario(): Promise<{
7
+ firstChangedLoaded: boolean;
8
+ initialLoaded: boolean;
9
+ loaderCalls: string[];
10
+ loadedAfterInlineLoaderRerender: boolean;
11
+ thirdAfterStaleCompletion: {
12
+ error: string | null;
13
+ loaded: boolean;
14
+ };
15
+ }>;
16
+ //# sourceMappingURL=browser-use-database-hook-scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-use-database-hook-scenarios.d.ts","sourceRoot":"","sources":["../../../src/testing/browser-use-database-hook-scenarios.js"],"names":[],"mappings":"AA6DA;;;;GAIG;AACH,wBAA8B,yCAAyC,IAF1D,OAAO,CAAC;IAAC,kBAAkB,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,+BAA+B,EAAE,OAAO,CAAC;IAAC,yBAAyB,EAAE;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAC,CAAA;CAAC,CAAC,CA2I/M"}
@@ -0,0 +1,182 @@
1
+ // @ts-check
2
+ import React, { act } from "react";
3
+ import { createRoot } from "react-dom/client";
4
+ import Configuration, { CurrentConfigurationNotSetError } from "../configuration.js";
5
+ import BrowserEnvironmentHandler from "../environment-handlers/browser.js";
6
+ import Migration from "../database/migration/index.js";
7
+ import SingleMultiUsePool from "../database/pool/single-multi-use.js";
8
+ import SqliteWebDriver from "../database/drivers/sqlite/index.web.js";
9
+ import TenantHandle from "../tenants/tenant-handle.js";
10
+ import useDatabase from "../database/use-database.js";
11
+ /**
12
+ * Returns the current configuration without requiring one to exist.
13
+ * @returns {Configuration | undefined} - Current configuration when installed.
14
+ */
15
+ function currentConfigurationOrUndefined() {
16
+ try {
17
+ return Configuration.current();
18
+ }
19
+ catch (error) {
20
+ if (!(error instanceof CurrentConfigurationNotSetError))
21
+ throw error;
22
+ return undefined;
23
+ }
24
+ }
25
+ /**
26
+ * Builds the scoped browser configuration used by the real hook scenario.
27
+ * @returns {Configuration} - Browser test configuration.
28
+ */
29
+ function buildHookConfiguration() {
30
+ return new Configuration({
31
+ database: {
32
+ test: {
33
+ projectTenant: {
34
+ driver: SqliteWebDriver,
35
+ getConnection: async () => { throw new Error("Hook scenario must not open a physical database"); },
36
+ migrations: true,
37
+ name: "use-database-hook-template",
38
+ poolType: SingleMultiUsePool,
39
+ tenantOnly: true,
40
+ type: "sqlite"
41
+ }
42
+ }
43
+ },
44
+ directory: "/use-database-hook-scenario",
45
+ environment: "test",
46
+ environmentHandler: new BrowserEnvironmentHandler(),
47
+ initializeModels: async () => { },
48
+ locale: "en",
49
+ localeFallbacks: { en: ["en"] },
50
+ locales: ["en"],
51
+ tenantDatabaseResolver: ({ identifier, tenant }) => {
52
+ if (identifier !== "projectTenant" || !tenant || typeof tenant !== "object")
53
+ return;
54
+ return { name: `use-database-hook-${String(/** @type {{slug?: string}} */ (tenant).slug)}` };
55
+ }
56
+ });
57
+ }
58
+ /**
59
+ * Flushes real React hook transitions and reports synchronous selection state,
60
+ * inline loader stability, and stale completion suppression.
61
+ * @returns {Promise<{firstChangedLoaded: boolean, initialLoaded: boolean, loaderCalls: string[], loadedAfterInlineLoaderRerender: boolean, thirdAfterStaleCompletion: {error: string | null, loaded: boolean}}>} - Render observations.
62
+ */
63
+ export default async function runUseDatabaseSelectionTransitionScenario() {
64
+ const container = document.createElement("div");
65
+ document.body.appendChild(container);
66
+ const root = createRoot(container);
67
+ /** @type {{error: string | null, loaded: boolean, selection: "first" | "second" | "third"}[]} */
68
+ const renders = [];
69
+ /** @type {string[]} */
70
+ const loaderCalls = [];
71
+ /**
72
+ * Releases the deliberately stale second initialization.
73
+ * @type {() => void}
74
+ */
75
+ let releaseSecondInitialization = () => { };
76
+ const secondInitializationRelease = new Promise((resolve) => { releaseSecondInitialization = () => resolve(undefined); });
77
+ /**
78
+ * Signals that the deliberately stale second initialization started.
79
+ * @type {() => void}
80
+ */
81
+ let signalSecondInitialization = () => { };
82
+ const secondInitializationStarted = new Promise((resolve) => { signalSecondInitialization = () => resolve(undefined); });
83
+ class HookTenantHandle extends TenantHandle {
84
+ /**
85
+ * Runs test initialization without touching a physical database.
86
+ * @param {{migrations: import("../database/migrator/types.js").RequireMigrationContextType}} args - Hook initialization arguments.
87
+ * @returns {Promise<Readonly<ReturnType<TenantHandle["inspect"]>>>} - Ready test snapshot.
88
+ */
89
+ async initialize({ migrations }) {
90
+ loaderCalls.push(migrations.id);
91
+ if (this.tenant().slug === "second") {
92
+ signalSecondInitialization();
93
+ await secondInitializationRelease;
94
+ throw new Error("SECOND_SELECTION_FAILED");
95
+ }
96
+ return Object.freeze({ databaseIdentifier: "projectTenant", dirty: false, lastUsed: 0, pinCount: 0, ready: true, schemaGeneration: "generation-1", state: "open" });
97
+ }
98
+ }
99
+ const previousConfiguration = currentConfigurationOrUndefined();
100
+ const restorationConfiguration = previousConfiguration || buildHookConfiguration();
101
+ const configuration = buildHookConfiguration();
102
+ configuration.setCurrent();
103
+ const firstHandle = new HookTenantHandle({ configuration, tenant: { slug: "first" } });
104
+ const secondHandle = new HookTenantHandle({ configuration, tenant: { slug: "second" } });
105
+ const thirdHandle = new HookTenantHandle({ configuration, tenant: { slug: "third" } });
106
+ const renderCounts = { first: 0, second: 0, third: 0 };
107
+ /**
108
+ * Runs hook probe.
109
+ * @param {{selection: "first" | "second" | "third", tenantHandle: HookTenantHandle}} props - Probe props.
110
+ * @returns {React.ReactElement} - Empty host element.
111
+ */
112
+ function HookProbe({ selection, tenantHandle }) {
113
+ const state = useDatabase({
114
+ databaseIdentifier: "projectTenant",
115
+ migrationsRequireContextCallback: async () => {
116
+ /**
117
+ * Looks up an empty migration context entry recreated by every probe render.
118
+ * @param {string} fileName - Requested migration file.
119
+ * @returns {{default: typeof Migration}} - Placeholder migration module.
120
+ * @type {import("../database/migrator/types.js").RequireMigrationContextType}
121
+ */
122
+ const emptyMigrations = (fileName) => {
123
+ if (!fileName)
124
+ throw new Error("Migration context lookup requires a file name");
125
+ return { default: Migration };
126
+ };
127
+ emptyMigrations.keys = () => [];
128
+ emptyMigrations.id = selection;
129
+ return emptyMigrations;
130
+ },
131
+ schemaGeneration: "generation-1",
132
+ tenantHandle
133
+ });
134
+ renderCounts[selection]++;
135
+ if (renderCounts[selection] > 20)
136
+ throw new Error(`useDatabase render loop for ${selection}`);
137
+ renders.push({ error: state.error?.message || null, loaded: state.loaded, selection });
138
+ return React.createElement("div");
139
+ }
140
+ try {
141
+ await act(async () => {
142
+ root.render(React.createElement(HookProbe, { selection: "first", tenantHandle: firstHandle }));
143
+ });
144
+ const initialRender = renders.at(-1);
145
+ await act(async () => {
146
+ root.render(React.createElement(HookProbe, { selection: "first", tenantHandle: firstHandle }));
147
+ });
148
+ const loadedAfterInlineLoaderRerender = renders.at(-1)?.loaded;
149
+ act(() => {
150
+ root.render(React.createElement(HookProbe, { selection: "second", tenantHandle: secondHandle }));
151
+ });
152
+ const firstChangedRender = renders.find((render) => render.selection === "second");
153
+ await secondInitializationStarted;
154
+ await act(async () => {
155
+ root.render(React.createElement(HookProbe, { selection: "third", tenantHandle: thirdHandle }));
156
+ });
157
+ releaseSecondInitialization();
158
+ await act(async () => { await secondInitializationRelease; });
159
+ const thirdAfterStaleCompletion = renders.at(-1);
160
+ if (!initialRender || !firstChangedRender || !thirdAfterStaleCompletion || loadedAfterInlineLoaderRerender === undefined) {
161
+ throw new Error("useDatabase hook scenario did not render every selection");
162
+ }
163
+ return {
164
+ firstChangedLoaded: firstChangedRender.loaded,
165
+ initialLoaded: initialRender.loaded,
166
+ loaderCalls,
167
+ loadedAfterInlineLoaderRerender,
168
+ thirdAfterStaleCompletion: {
169
+ error: thirdAfterStaleCompletion.error,
170
+ loaded: thirdAfterStaleCompletion.loaded
171
+ }
172
+ };
173
+ }
174
+ finally {
175
+ releaseSecondInitialization();
176
+ await act(async () => { root.unmount(); });
177
+ container.remove();
178
+ restorationConfiguration.setCurrent();
179
+ await configuration.closeDatabaseConnections();
180
+ }
181
+ }
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci11c2UtZGF0YWJhc2UtaG9vay1zY2VuYXJpb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdGluZy9icm93c2VyLXVzZS1kYXRhYmFzZS1ob29rLXNjZW5hcmlvcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDbEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRTNDLE9BQU8sYUFBYSxFQUFFLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUNsRixPQUFPLHlCQUF5QixNQUFNLG9DQUFvQyxDQUFBO0FBQzFFLE9BQU8sU0FBUyxNQUFNLGdDQUFnQyxDQUFBO0FBQ3RELE9BQU8sa0JBQWtCLE1BQU0sc0NBQXNDLENBQUE7QUFDckUsT0FBTyxlQUFlLE1BQU0seUNBQXlDLENBQUE7QUFDckUsT0FBTyxZQUFZLE1BQU0sNkJBQTZCLENBQUE7QUFDdEQsT0FBTyxXQUFXLE1BQU0sNkJBQTZCLENBQUE7QUFFckQ7OztHQUdHO0FBQ0gsU0FBUywrQkFBK0I7SUFDdEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksK0JBQStCLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQTtRQUVwRSxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLE9BQU8sSUFBSSxhQUFhLENBQUM7UUFDdkIsUUFBUSxFQUFFO1lBQ1IsSUFBSSxFQUFFO2dCQUNKLGFBQWEsRUFBRTtvQkFDYixNQUFNLEVBQUUsZUFBZTtvQkFDdkIsYUFBYSxFQUFFLEtBQUss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QztRQUVELE9BQU87WUFDTCxrQkFBa0IsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNO1lBQzdDLGFBQWEsRUFBRSxhQUFhLENBQUMsTUFBTTtZQUNuQyxXQUFXO1lBQ1gsK0JBQStCO1lBQy9CLHlCQUF5QixFQUFFO2dCQUN6QixLQUFLLEVBQUUseUJBQXlCLENBQUMsS0FBSztnQkFDdEMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLE1BQU07YUFDekM7U0FDRixDQUFBO0lBQ0gsQ0FBQztZQUFTLENBQUM7UUFDVCwyQkFBMkIsRUFBRSxDQUFBO1FBQzdCLE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDekMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2xCLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3JDLE1BQU0sYUFBYSxDQUFDLHdCQUF3QixFQUFFLENBQUE7SUFDaEQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFJlYWN0LCB7IGFjdCB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQge2NyZWF0ZVJvb3R9IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCJcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24sIHtDdXJyZW50Q29uZmlndXJhdGlvbk5vdFNldEVycm9yfSBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQgQnJvd3NlckVudmlyb25tZW50SGFuZGxlciBmcm9tIFwiLi4vZW52aXJvbm1lbnQtaGFuZGxlcnMvYnJvd3Nlci5qc1wiXG5pbXBvcnQgTWlncmF0aW9uIGZyb20gXCIuLi9kYXRhYmFzZS9taWdyYXRpb24vaW5kZXguanNcIlxuaW1wb3J0IFNpbmdsZU11bHRpVXNlUG9vbCBmcm9tIFwiLi4vZGF0YWJhc2UvcG9vbC9zaW5nbGUtbXVsdGktdXNlLmpzXCJcbmltcG9ydCBTcWxpdGVXZWJEcml2ZXIgZnJvbSBcIi4uL2RhdGFiYXNlL2RyaXZlcnMvc3FsaXRlL2luZGV4LndlYi5qc1wiXG5pbXBvcnQgVGVuYW50SGFuZGxlIGZyb20gXCIuLi90ZW5hbnRzL3RlbmFudC1oYW5kbGUuanNcIlxuaW1wb3J0IHVzZURhdGFiYXNlIGZyb20gXCIuLi9kYXRhYmFzZS91c2UtZGF0YWJhc2UuanNcIlxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB3aXRob3V0IHJlcXVpcmluZyBvbmUgdG8gZXhpc3QuXG4gKiBAcmV0dXJucyB7Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZH0gLSBDdXJyZW50IGNvbmZpZ3VyYXRpb24gd2hlbiBpbnN0YWxsZWQuXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnRDb25maWd1cmF0aW9uT3JVbmRlZmluZWQoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIENvbmZpZ3VyYXRpb24uY3VycmVudCgpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBDdXJyZW50Q29uZmlndXJhdGlvbk5vdFNldEVycm9yKSkgdGhyb3cgZXJyb3JcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc2NvcGVkIGJyb3dzZXIgY29uZmlndXJhdGlvbiB1c2VkIGJ5IHRoZSByZWFsIGhvb2sgc2NlbmFyaW8uXG4gKiBAcmV0dXJucyB7Q29uZmlndXJhdGlvbn0gLSBCcm93c2VyIHRlc3QgY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gYnVpbGRIb29rQ29uZmlndXJhdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uKHtcbiAgICBkYXRhYmFzZToge1xuICAgICAgdGVzdDoge1xuICAgICAgICBwcm9qZWN0VGVuYW50OiB7XG4gICAgICAgICAgZHJpdmVyOiBTcWxpdGVXZWJEcml2ZXIsXG4gICAgICAgICAgZ2V0Q29ubmVjdGlvbjogYXN5bmMgKCkgPT4geyB0aHJvdyBuZXcgRXJyb3IoXCJIb29rIHNjZW5hcmlvIG11c3Qgbm90IG9wZW4gYSBwaHlzaWNhbCBkYXRhYmFzZVwiKSB9LFxuICAgICAgICAgIG1pZ3JhdGlvbnM6IHRydWUsXG4gICAgICAgICAgbmFtZTogXCJ1c2UtZGF0YWJhc2UtaG9vay10ZW1wbGF0ZVwiLFxuICAgICAgICAgIHBvb2xUeXBlOiBTaW5nbGVNdWx0aVVzZVBvb2wsXG4gICAgICAgICAgdGVuYW50T25seTogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBcInNxbGl0ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRpcmVjdG9yeTogXCIvdXNlLWRhdGFiYXNlLWhvb2stc2NlbmFyaW9cIixcbiAgICBlbnZpcm9ubWVudDogXCJ0ZXN0XCIsXG4gICAgZW52aXJvbm1lbnRIYW5kbGVyOiBuZXcgQnJvd3NlckVudmlyb25tZW50SGFuZGxlcigpLFxuICAgIGluaXRpYWxpemVNb2RlbHM6IGFzeW5jICgpID0+IHt9LFxuICAgIGxvY2FsZTogXCJlblwiLFxuICAgIGxvY2FsZUZhbGxiYWNrczoge2VuOiBbXCJlblwiXX0sXG4gICAgbG9jYWxlczogW1wiZW5cIl0sXG4gICAgdGVuYW50RGF0YWJhc2VSZXNvbHZlcjogKHtpZGVudGlmaWVyLCB0ZW5hbnR9KSA9PiB7XG4gICAgICBpZiAoaWRlbnRpZmllciAhPT0gXCJwcm9qZWN0VGVuYW50XCIgfHwgIXRlbmFudCB8fCB0eXBlb2YgdGVuYW50ICE9PSBcIm9iamVjdFwiKSByZXR1cm5cblxuICAgICAgcmV0dXJuIHtuYW1lOiBgdXNlLWRhdGFiYXNlLWhvb2stJHtTdHJpbmcoLyoqIEB0eXBlIHt7c2x1Zz86IHN0cmluZ319ICovICh0ZW5hbnQpLnNsdWcpfWB9XG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIEZsdXNoZXMgcmVhbCBSZWFjdCBob29rIHRyYW5zaXRpb25zIGFuZCByZXBvcnRzIHN5bmNocm9ub3VzIHNlbGVjdGlvbiBzdGF0ZSxcbiAqIGlubGluZSBsb2FkZXIgc3RhYmlsaXR5LCBhbmQgc3RhbGUgY29tcGxldGlvbiBzdXBwcmVzc2lvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtmaXJzdENoYW5nZWRMb2FkZWQ6IGJvb2xlYW4sIGluaXRpYWxMb2FkZWQ6IGJvb2xlYW4sIGxvYWRlckNhbGxzOiBzdHJpbmdbXSwgbG9hZGVkQWZ0ZXJJbmxpbmVMb2FkZXJSZXJlbmRlcjogYm9vbGVhbiwgdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbjoge2Vycm9yOiBzdHJpbmcgfCBudWxsLCBsb2FkZWQ6IGJvb2xlYW59fT59IC0gUmVuZGVyIG9ic2VydmF0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcnVuVXNlRGF0YWJhc2VTZWxlY3Rpb25UcmFuc2l0aW9uU2NlbmFyaW8oKSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpXG4gIGNvbnN0IHJvb3QgPSBjcmVhdGVSb290KGNvbnRhaW5lcilcbiAgLyoqIEB0eXBlIHt7ZXJyb3I6IHN0cmluZyB8IG51bGwsIGxvYWRlZDogYm9vbGVhbiwgc2VsZWN0aW9uOiBcImZpcnN0XCIgfCBcInNlY29uZFwiIHwgXCJ0aGlyZFwifVtdfSAqL1xuICBjb25zdCByZW5kZXJzID0gW11cbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgbG9hZGVyQ2FsbHMgPSBbXVxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIGRlbGliZXJhdGVseSBzdGFsZSBzZWNvbmQgaW5pdGlhbGl6YXRpb24uXG4gICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgKi9cbiAgbGV0IHJlbGVhc2VTZWNvbmRJbml0aWFsaXphdGlvbiA9ICgpID0+IHt9XG4gIGNvbnN0IHNlY29uZEluaXRpYWxpemF0aW9uUmVsZWFzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7IHJlbGVhc2VTZWNvbmRJbml0aWFsaXphdGlvbiA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKSB9KVxuICAvKipcbiAgICogU2lnbmFscyB0aGF0IHRoZSBkZWxpYmVyYXRlbHkgc3RhbGUgc2Vjb25kIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQuXG4gICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgKi9cbiAgbGV0IHNpZ25hbFNlY29uZEluaXRpYWxpemF0aW9uID0gKCkgPT4ge31cbiAgY29uc3Qgc2Vjb25kSW5pdGlhbGl6YXRpb25TdGFydGVkID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsgc2lnbmFsU2Vjb25kSW5pdGlhbGl6YXRpb24gPSAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkgfSlcblxuICBjbGFzcyBIb29rVGVuYW50SGFuZGxlIGV4dGVuZHMgVGVuYW50SGFuZGxlIHtcbiAgICAvKipcbiAgICAgKiBSdW5zIHRlc3QgaW5pdGlhbGl6YXRpb24gd2l0aG91dCB0b3VjaGluZyBhIHBoeXNpY2FsIGRhdGFiYXNlLlxuICAgICAqIEBwYXJhbSB7e21pZ3JhdGlvbnM6IGltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdG9yL3R5cGVzLmpzXCIpLlJlcXVpcmVNaWdyYXRpb25Db250ZXh0VHlwZX19IGFyZ3MgLSBIb29rIGluaXRpYWxpemF0aW9uIGFyZ3VtZW50cy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxSZXR1cm5UeXBlPFRlbmFudEhhbmRsZVtcImluc3BlY3RcIl0+Pj59IC0gUmVhZHkgdGVzdCBzbmFwc2hvdC5cbiAgICAgKi9cbiAgICBhc3luYyBpbml0aWFsaXplKHttaWdyYXRpb25zfSkge1xuICAgICAgbG9hZGVyQ2FsbHMucHVzaChtaWdyYXRpb25zLmlkKVxuXG4gICAgICBpZiAodGhpcy50ZW5hbnQoKS5zbHVnID09PSBcInNlY29uZFwiKSB7XG4gICAgICAgIHNpZ25hbFNlY29uZEluaXRpYWxpemF0aW9uKClcbiAgICAgICAgYXdhaXQgc2Vjb25kSW5pdGlhbGl6YXRpb25SZWxlYXNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNFQ09ORF9TRUxFQ1RJT05fRkFJTEVEXCIpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtkYXRhYmFzZUlkZW50aWZpZXI6IFwicHJvamVjdFRlbmFudFwiLCBkaXJ0eTogZmFsc2UsIGxhc3RVc2VkOiAwLCBwaW5Db3VudDogMCwgcmVhZHk6IHRydWUsIHNjaGVtYUdlbmVyYXRpb246IFwiZ2VuZXJhdGlvbi0xXCIsIHN0YXRlOiBcIm9wZW5cIn0pXG4gICAgfVxuICB9XG4gIGNvbnN0IHByZXZpb3VzQ29uZmlndXJhdGlvbiA9IGN1cnJlbnRDb25maWd1cmF0aW9uT3JVbmRlZmluZWQoKVxuICBjb25zdCByZXN0b3JhdGlvbkNvbmZpZ3VyYXRpb24gPSBwcmV2aW91c0NvbmZpZ3VyYXRpb24gfHwgYnVpbGRIb29rQ29uZmlndXJhdGlvbigpXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBidWlsZEhvb2tDb25maWd1cmF0aW9uKClcblxuICBjb25maWd1cmF0aW9uLnNldEN1cnJlbnQoKVxuXG4gIGNvbnN0IGZpcnN0SGFuZGxlID0gbmV3IEhvb2tUZW5hbnRIYW5kbGUoe2NvbmZpZ3VyYXRpb24sIHRlbmFudDoge3NsdWc6IFwiZmlyc3RcIn19KVxuICBjb25zdCBzZWNvbmRIYW5kbGUgPSBuZXcgSG9va1RlbmFudEhhbmRsZSh7Y29uZmlndXJhdGlvbiwgdGVuYW50OiB7c2x1ZzogXCJzZWNvbmRcIn19KVxuICBjb25zdCB0aGlyZEhhbmRsZSA9IG5ldyBIb29rVGVuYW50SGFuZGxlKHtjb25maWd1cmF0aW9uLCB0ZW5hbnQ6IHtzbHVnOiBcInRoaXJkXCJ9fSlcbiAgY29uc3QgcmVuZGVyQ291bnRzID0ge2ZpcnN0OiAwLCBzZWNvbmQ6IDAsIHRoaXJkOiAwfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhvb2sgcHJvYmUuXG4gICAqIEBwYXJhbSB7e3NlbGVjdGlvbjogXCJmaXJzdFwiIHwgXCJzZWNvbmRcIiB8IFwidGhpcmRcIiwgdGVuYW50SGFuZGxlOiBIb29rVGVuYW50SGFuZGxlfX0gcHJvcHMgLSBQcm9iZSBwcm9wcy5cbiAgICogQHJldHVybnMge1JlYWN0LlJlYWN0RWxlbWVudH0gLSBFbXB0eSBob3N0IGVsZW1lbnQuXG4gICAqL1xuICBmdW5jdGlvbiBIb29rUHJvYmUoe3NlbGVjdGlvbiwgdGVuYW50SGFuZGxlfSkge1xuICAgIGNvbnN0IHN0YXRlID0gdXNlRGF0YWJhc2Uoe1xuICAgICAgZGF0YWJhc2VJZGVudGlmaWVyOiBcInByb2plY3RUZW5hbnRcIixcbiAgICAgIG1pZ3JhdGlvbnNSZXF1aXJlQ29udGV4dENhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29rcyB1cCBhbiBlbXB0eSBtaWdyYXRpb24gY29udGV4dCBlbnRyeSByZWNyZWF0ZWQgYnkgZXZlcnkgcHJvYmUgcmVuZGVyLlxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZU5hbWUgLSBSZXF1ZXN0ZWQgbWlncmF0aW9uIGZpbGUuXG4gICAgICAgICAqIEByZXR1cm5zIHt7ZGVmYXVsdDogdHlwZW9mIE1pZ3JhdGlvbn19IC0gUGxhY2Vob2xkZXIgbWlncmF0aW9uIG1vZHVsZS5cbiAgICAgICAgICogQHR5cGUge2ltcG9ydChcIi4uL2RhdGFiYXNlL21pZ3JhdG9yL3R5cGVzLmpzXCIpLlJlcXVpcmVNaWdyYXRpb25Db250ZXh0VHlwZX1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGVtcHR5TWlncmF0aW9ucyA9IChmaWxlTmFtZSkgPT4ge1xuICAgICAgICAgIGlmICghZmlsZU5hbWUpIHRocm93IG5ldyBFcnJvcihcIk1pZ3JhdGlvbiBjb250ZXh0IGxvb2t1cCByZXF1aXJlcyBhIGZpbGUgbmFtZVwiKVxuXG4gICAgICAgICAgcmV0dXJuIHtkZWZhdWx0OiBNaWdyYXRpb259XG4gICAgICAgIH1cblxuICAgICAgICBlbXB0eU1pZ3JhdGlvbnMua2V5cyA9ICgpID0+IFtdXG4gICAgICAgIGVtcHR5TWlncmF0aW9ucy5pZCA9IHNlbGVjdGlvblxuXG4gICAgICAgIHJldHVybiBlbXB0eU1pZ3JhdGlvbnNcbiAgICAgIH0sXG4gICAgICBzY2hlbWFHZW5lcmF0aW9uOiBcImdlbmVyYXRpb24tMVwiLFxuICAgICAgdGVuYW50SGFuZGxlXG4gICAgfSlcblxuICAgIHJlbmRlckNvdW50c1tzZWxlY3Rpb25dKytcbiAgICBpZiAocmVuZGVyQ291bnRzW3NlbGVjdGlvbl0gPiAyMCkgdGhyb3cgbmV3IEVycm9yKGB1c2VEYXRhYmFzZSByZW5kZXIgbG9vcCBmb3IgJHtzZWxlY3Rpb259YClcbiAgICByZW5kZXJzLnB1c2goe2Vycm9yOiBzdGF0ZS5lcnJvcj8ubWVzc2FnZSB8fCBudWxsLCBsb2FkZWQ6IHN0YXRlLmxvYWRlZCwgc2VsZWN0aW9ufSlcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICByb290LnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KEhvb2tQcm9iZSwge3NlbGVjdGlvbjogXCJmaXJzdFwiLCB0ZW5hbnRIYW5kbGU6IGZpcnN0SGFuZGxlfSkpXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRpYWxSZW5kZXIgPSByZW5kZXJzLmF0KC0xKVxuXG4gICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgIHJvb3QucmVuZGVyKFJlYWN0LmNyZWF0ZUVsZW1lbnQoSG9va1Byb2JlLCB7c2VsZWN0aW9uOiBcImZpcnN0XCIsIHRlbmFudEhhbmRsZTogZmlyc3RIYW5kbGV9KSlcbiAgICB9KVxuXG4gICAgY29uc3QgbG9hZGVkQWZ0ZXJJbmxpbmVMb2FkZXJSZXJlbmRlciA9IHJlbmRlcnMuYXQoLTEpPy5sb2FkZWRcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICByb290LnJlbmRlcihSZWFjdC5jcmVhdGVFbGVtZW50KEhvb2tQcm9iZSwge3NlbGVjdGlvbjogXCJzZWNvbmRcIiwgdGVuYW50SGFuZGxlOiBzZWNvbmRIYW5kbGV9KSlcbiAgICB9KVxuXG4gICAgY29uc3QgZmlyc3RDaGFuZ2VkUmVuZGVyID0gcmVuZGVycy5maW5kKChyZW5kZXIpID0+IHJlbmRlci5zZWxlY3Rpb24gPT09IFwic2Vjb25kXCIpXG4gICAgYXdhaXQgc2Vjb25kSW5pdGlhbGl6YXRpb25TdGFydGVkXG5cbiAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgcm9vdC5yZW5kZXIoUmVhY3QuY3JlYXRlRWxlbWVudChIb29rUHJvYmUsIHtzZWxlY3Rpb246IFwidGhpcmRcIiwgdGVuYW50SGFuZGxlOiB0aGlyZEhhbmRsZX0pKVxuICAgIH0pXG5cbiAgICByZWxlYXNlU2Vjb25kSW5pdGlhbGl6YXRpb24oKVxuICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7IGF3YWl0IHNlY29uZEluaXRpYWxpemF0aW9uUmVsZWFzZSB9KVxuXG4gICAgY29uc3QgdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbiA9IHJlbmRlcnMuYXQoLTEpXG5cbiAgICBpZiAoIWluaXRpYWxSZW5kZXIgfHwgIWZpcnN0Q2hhbmdlZFJlbmRlciB8fCAhdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbiB8fCBsb2FkZWRBZnRlcklubGluZUxvYWRlclJlcmVuZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVzZURhdGFiYXNlIGhvb2sgc2NlbmFyaW8gZGlkIG5vdCByZW5kZXIgZXZlcnkgc2VsZWN0aW9uXCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpcnN0Q2hhbmdlZExvYWRlZDogZmlyc3RDaGFuZ2VkUmVuZGVyLmxvYWRlZCxcbiAgICAgIGluaXRpYWxMb2FkZWQ6IGluaXRpYWxSZW5kZXIubG9hZGVkLFxuICAgICAgbG9hZGVyQ2FsbHMsXG4gICAgICBsb2FkZWRBZnRlcklubGluZUxvYWRlclJlcmVuZGVyLFxuICAgICAgdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbjoge1xuICAgICAgICBlcnJvcjogdGhpcmRBZnRlclN0YWxlQ29tcGxldGlvbi5lcnJvcixcbiAgICAgICAgbG9hZGVkOiB0aGlyZEFmdGVyU3RhbGVDb21wbGV0aW9uLmxvYWRlZFxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlU2Vjb25kSW5pdGlhbGl6YXRpb24oKVxuICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7IHJvb3QudW5tb3VudCgpIH0pXG4gICAgY29udGFpbmVyLnJlbW92ZSgpXG4gICAgcmVzdG9yYXRpb25Db25maWd1cmF0aW9uLnNldEN1cnJlbnQoKVxuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uY2xvc2VEYXRhYmFzZUNvbm5lY3Rpb25zKClcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/testing/test-runner.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../../src/testing/test-runner.js"],"names":[],"mappings":"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"}