velocious 1.0.488 → 1.0.492

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 (108) hide show
  1. package/README.md +2 -0
  2. package/build/application.js +3 -0
  3. package/build/cli/commands/db/tenants/create.js +7 -5
  4. package/build/cli/commands/db/tenants/drop.js +6 -6
  5. package/build/configuration-types.js +9 -0
  6. package/build/configuration.js +58 -0
  7. package/build/database/query/index.js +30 -0
  8. package/build/database/query/model-class-query.js +17 -0
  9. package/build/database/record/index.js +16 -0
  10. package/build/environment-handlers/node.js +22 -6
  11. package/build/src/application.d.ts.map +1 -1
  12. package/build/src/application.js +3 -1
  13. package/build/src/cli/commands/db/tenants/create.d.ts.map +1 -1
  14. package/build/src/cli/commands/db/tenants/create.js +8 -5
  15. package/build/src/cli/commands/db/tenants/drop.d.ts +1 -1
  16. package/build/src/cli/commands/db/tenants/drop.d.ts.map +1 -1
  17. package/build/src/cli/commands/db/tenants/drop.js +7 -6
  18. package/build/src/configuration-types.d.ts +29 -0
  19. package/build/src/configuration-types.d.ts.map +1 -1
  20. package/build/src/configuration-types.js +9 -1
  21. package/build/src/configuration.d.ts +17 -0
  22. package/build/src/configuration.d.ts.map +1 -1
  23. package/build/src/configuration.js +52 -1
  24. package/build/src/database/query/index.d.ts +25 -0
  25. package/build/src/database/query/index.d.ts.map +1 -1
  26. package/build/src/database/query/index.js +26 -1
  27. package/build/src/database/query/model-class-query.d.ts +10 -0
  28. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  29. package/build/src/database/query/model-class-query.js +16 -1
  30. package/build/src/database/record/index.d.ts +7 -0
  31. package/build/src/database/record/index.d.ts.map +1 -1
  32. package/build/src/database/record/index.js +15 -1
  33. package/build/src/environment-handlers/node.d.ts.map +1 -1
  34. package/build/src/environment-handlers/node.js +20 -8
  35. package/build/src/sync/query-scope.d.ts +18 -0
  36. package/build/src/sync/query-scope.d.ts.map +1 -0
  37. package/build/src/sync/query-scope.js +77 -0
  38. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  39. package/build/src/sync/server-change-feed.js +2 -24
  40. package/build/src/sync/stable-json.d.ts +9 -0
  41. package/build/src/sync/stable-json.d.ts.map +1 -0
  42. package/build/src/sync/stable-json.js +27 -0
  43. package/build/src/sync/sync-api-client.d.ts +185 -5
  44. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  45. package/build/src/sync/sync-api-client.js +309 -17
  46. package/build/src/sync/sync-api-controller.d.ts +8 -0
  47. package/build/src/sync/sync-api-controller.d.ts.map +1 -1
  48. package/build/src/sync/sync-api-controller.js +17 -1
  49. package/build/src/sync/sync-client-registry.d.ts +12 -0
  50. package/build/src/sync/sync-client-registry.d.ts.map +1 -0
  51. package/build/src/sync/sync-client-registry.js +27 -0
  52. package/build/src/sync/sync-client-types.d.ts +127 -0
  53. package/build/src/sync/sync-client-types.d.ts.map +1 -0
  54. package/build/src/sync/sync-client-types.js +3 -0
  55. package/build/src/sync/sync-client.d.ts +176 -0
  56. package/build/src/sync/sync-client.d.ts.map +1 -0
  57. package/build/src/sync/sync-client.js +380 -0
  58. package/build/src/sync/sync-envelope-replay-service.d.ts +38 -4
  59. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  60. package/build/src/sync/sync-envelope-replay-service.js +73 -6
  61. package/build/src/sync/sync-resource-base.d.ts +98 -0
  62. package/build/src/sync/sync-resource-base.d.ts.map +1 -0
  63. package/build/src/sync/sync-resource-base.js +122 -0
  64. package/build/src/sync/sync-scope-store.d.ts +128 -0
  65. package/build/src/sync/sync-scope-store.d.ts.map +1 -0
  66. package/build/src/sync/sync-scope-store.js +282 -0
  67. package/build/src/tenants/default-tenant-database-provisioning.d.ts +21 -0
  68. package/build/src/tenants/default-tenant-database-provisioning.d.ts.map +1 -0
  69. package/build/src/tenants/default-tenant-database-provisioning.js +106 -0
  70. package/build/src/tenants/tenant.d.ts.map +1 -1
  71. package/build/src/tenants/tenant.js +6 -5
  72. package/build/sync/query-scope.js +84 -0
  73. package/build/sync/server-change-feed.js +1 -25
  74. package/build/sync/stable-json.js +28 -0
  75. package/build/sync/sync-api-client.js +331 -17
  76. package/build/sync/sync-api-controller.js +20 -0
  77. package/build/sync/sync-client-registry.js +30 -0
  78. package/build/sync/sync-client-types.js +41 -0
  79. package/build/sync/sync-client.js +433 -0
  80. package/build/sync/sync-envelope-replay-service.js +77 -5
  81. package/build/sync/sync-resource-base.js +143 -0
  82. package/build/sync/sync-scope-store.js +327 -0
  83. package/build/tenants/default-tenant-database-provisioning.js +124 -0
  84. package/build/tenants/tenant.js +5 -5
  85. package/build/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +1 -1
  87. package/src/application.js +3 -0
  88. package/src/cli/commands/db/tenants/create.js +7 -5
  89. package/src/cli/commands/db/tenants/drop.js +6 -6
  90. package/src/configuration-types.js +9 -0
  91. package/src/configuration.js +58 -0
  92. package/src/database/query/index.js +30 -0
  93. package/src/database/query/model-class-query.js +17 -0
  94. package/src/database/record/index.js +16 -0
  95. package/src/environment-handlers/node.js +22 -6
  96. package/src/sync/query-scope.js +84 -0
  97. package/src/sync/server-change-feed.js +1 -25
  98. package/src/sync/stable-json.js +28 -0
  99. package/src/sync/sync-api-client.js +331 -17
  100. package/src/sync/sync-api-controller.js +20 -0
  101. package/src/sync/sync-client-registry.js +30 -0
  102. package/src/sync/sync-client-types.js +41 -0
  103. package/src/sync/sync-client.js +433 -0
  104. package/src/sync/sync-envelope-replay-service.js +77 -5
  105. package/src/sync/sync-resource-base.js +143 -0
  106. package/src/sync/sync-scope-store.js +327 -0
  107. package/src/tenants/default-tenant-database-provisioning.js +124 -0
  108. package/src/tenants/tenant.js +5 -5
@@ -1,6 +1,7 @@
1
1
  // @ts-check
2
2
  import { randomUUID } from "crypto";
3
3
  import TableData from "../database/table-data/index.js";
4
+ import stableJsonStringify from "./stable-json.js";
4
5
  const DEFAULT_RETENTION_SIZE = 10000;
5
6
  const DEFAULT_PAGE_SIZE = 100;
6
7
  const MAX_PAGE_SIZE = 1000;
@@ -417,29 +418,6 @@ function scopesEqual(changeScope, requestedScope) {
417
418
  return true;
418
419
  return stableJsonStringify(changeScope || null) === stableJsonStringify(requestedScope);
419
420
  }
420
- /**
421
- * Stable JSON serialization for persisted sync scopes.
422
- * @param {?} value - JSON-compatible value.
423
- * @returns {string} - Stable JSON representation.
424
- */
425
- function stableJsonStringify(value) {
426
- return JSON.stringify(stableJsonValue(value));
427
- }
428
- /**
429
- * Produces a recursively key-sorted JSON value.
430
- * @param {?} value - JSON-compatible value.
431
- * @returns {?} - Stable JSON-compatible value.
432
- */
433
- function stableJsonValue(value) {
434
- if (Array.isArray(value))
435
- return value.map((item) => stableJsonValue(item));
436
- if (!value || typeof value !== "object")
437
- return value;
438
- return Object.keys(value).sort().reduce((memo, key) => {
439
- memo[key] = stableJsonValue(value[key]);
440
- return memo;
441
- }, /** @type {Record<string, ?>} */ ({}));
442
- }
443
421
  /**
444
422
  * @typedef {object} ServerChangeFeedEntry
445
423
  * @property {string | null} actorDeviceId - Signed mutation actor device id when available.
@@ -472,4 +450,4 @@ function stableJsonValue(value) {
472
450
  * @property {string | null} scope_json - Scope JSON.
473
451
  * @property {number | string} server_sequence - Server sequence.
474
452
  */
475
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNoYW5nZS1mZWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc2VydmVyLWNoYW5nZS1mZWVkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBRXZELE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFBO0FBQ3BDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFBO0FBQzdCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQTtBQUMxQixNQUFNLFVBQVUsR0FBRyw2QkFBNkIsQ0FBQTtBQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBRTVCOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUNBQXFDLENBQUMsYUFBYTtJQUNqRSxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBRXJDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLEtBQUssR0FBRyxJQUFJLHFCQUFxQixDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtRQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyxxQkFBcUI7SUFDeEM7Ozs7OztPQU1HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsR0FBRyxTQUFTLEVBQUUsYUFBYSxFQUFDO1FBQ3hFLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUE7UUFFOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixD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QyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFDM0MsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7R0FlRyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5cbmNvbnN0IERFRkFVTFRfUkVURU5USU9OX1NJWkUgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9QQUdFX1NJWkUgPSAxMDBcbmNvbnN0IE1BWF9QQUdFX1NJWkUgPSAxMDAwXG5jb25zdCBUQUJMRV9OQU1FID0gXCJmcm9udGVuZF9tb2RlbF9zeW5jX2NoYW5nZXNcIlxuY29uc3Qgc3RvcmVzID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFNoYXJlZCBzZXJ2ZXIgY2hhbmdlLWZlZWQgc3RvcmUgZm9yIGEgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkU3RvcmV9IC0gU3RvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZXJDaGFuZ2VGZWVkU3RvcmVGb3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgbGV0IHN0b3JlID0gc3RvcmVzLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmICghc3RvcmUpIHtcbiAgICBzdG9yZSA9IG5ldyBTZXJ2ZXJDaGFuZ2VGZWVkU3RvcmUoe2NvbmZpZ3VyYXRpb259KVxuICAgIHN0b3Jlcy5zZXQoY29uZmlndXJhdGlvbiwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4gc3RvcmVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmVyQ2hhbmdlRmVlZFN0b3JlIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kYXRhYmFzZUlkZW50aWZpZXJdIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnJldGVudGlvblNpemVdIC0gTnVtYmVyIG9mIGZlZWQgZW50cmllcyB0byByZXRhaW4uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyID0gXCJkZWZhdWx0XCIsIHJldGVudGlvblNpemV9KSB7XG4gICAgY29uc3Qgc3luY0NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKClcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmRhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMucmV0ZW50aW9uU2l6ZSA9IHJldGVudGlvblNpemUgfHwgc3luY0NvbmZpZ3VyYXRpb24uY2hhbmdlRmVlZFJldGVudGlvblNpemUgfHwgREVGQVVMVF9SRVRFTlRJT05fU0laRVxuICAgIC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5W119ICovXG4gICAgdGhpcy5fbWVtb3J5Q2hhbmdlcyA9IFtdXG4gICAgdGhpcy5fbWVtb3J5U2VxdWVuY2UgPSAwXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGJhY2tpbmcgdGFibGUgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHtcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5fc2NoZW1hUmVhZHkoKSkgcmV0dXJuXG4gICAgaWYgKHRoaXMuX3JlYWR5UHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlQ2hhbmdlc1RhYmxlKGRiKVxuICAgICAgfSlcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgfSkoKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVhZHkpIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNoYW5nZSBhbmQgYXNzaWducyB0aGUgbmV4dCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7T21pdDxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnksIFwiY3JlYXRlZEF0XCIgfCBcImlkXCIgfCBcInNlcnZlclNlcXVlbmNlXCI+ICYge2NyZWF0ZWRBdD86IHN0cmluZywgaWQ/OiBzdHJpbmd9fSBjaGFuZ2UgLSBDaGFuZ2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmVyQ2hhbmdlRmVlZEVudHJ5Pn0gLSBQZXJzaXN0ZWQgY2hhbmdlLlxuICAgKi9cbiAgYXN5bmMgYXBwZW5kKGNoYW5nZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgaWQgPSBjaGFuZ2UuaWQgfHwgcmFuZG9tVVVJRCgpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gY2hhbmdlLmNyZWF0ZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSByZXR1cm4gdGhpcy5fYXBwZW5kTWVtb3J5KHsuLi5jaGFuZ2UsIGNyZWF0ZWRBdCwgaWR9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGF3YWl0IGRiLmluc2VydCh7XG4gICAgICAgIHRhYmxlTmFtZTogVEFCTEVfTkFNRSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGFjdG9yX2RldmljZV9pZDogY2hhbmdlLmFjdG9yRGV2aWNlSWQsXG4gICAgICAgICAgYWN0b3JfdXNlcl9pZDogY2hhbmdlLmFjdG9yVXNlcklkLFxuICAgICAgICAgIGF0dHJpYnV0ZXNfanNvbjogSlNPTi5zdHJpbmdpZnkoY2hhbmdlLmF0dHJpYnV0ZXMgfHwgbnVsbCksXG4gICAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoY3JlYXRlZEF0KSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBpZGVtcG90ZW5jeV9rZXk6IGNoYW5nZS5pZGVtcG90ZW5jeUtleSxcbiAgICAgICAgICBtb2RlbDogY2hhbmdlLm1vZGVsLFxuICAgICAgICAgIG9wZXJhdGlvbjogY2hhbmdlLm9wZXJhdGlvbixcbiAgICAgICAgICBwYXlsb2FkX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5wYXlsb2FkIHx8IG51bGwpLFxuICAgICAgICAgIHJlY29yZF9pZDogY2hhbmdlLnJlY29yZElkID09PSBudWxsIHx8IGNoYW5nZS5yZWNvcmRJZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhjaGFuZ2UucmVjb3JkSWQpLFxuICAgICAgICAgIHJlc3BvbnNlX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5yZXNwb25zZSB8fCBudWxsKSxcbiAgICAgICAgICBzY29wZV9qc29uOiBzdGFibGVKc29uU3RyaW5naWZ5KGNoYW5nZS5zY29wZSB8fCBudWxsKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLl9jaGFuZ2VCeUlkKGRiLCBpZClcbiAgICAgIGlmICghcm93KSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGVyc2lzdCBzZXJ2ZXIgY2hhbmdlLWZlZWQgZW50cnlcIilcblxuICAgICAgYXdhaXQgdGhpcy5fcHJ1bmVSZXRhaW5lZENoYW5nZXMoZGIsIHJvdy5zZXJ2ZXJTZXF1ZW5jZSlcblxuICAgICAgcmV0dXJuIHJvd1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50IGxhdGVzdCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gTGF0ZXN0IHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgbGF0ZXN0U2VxdWVuY2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeVNlcXVlbmNlXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBERVNDXCIpXG4gICAgICAgIC5saW1pdCgxKVxuICAgICAgICAucmVzdWx0cygpXG4gICAgICBjb25zdCByb3cgPSAvKiogQHR5cGUge3tzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9IHwgdW5kZWZpbmVkfSAqLyAocm93c1swXSlcblxuICAgICAgcmV0dXJuIHJvdyA/IE51bWJlcihyb3cuc2VydmVyX3NlcXVlbmNlKSA6IDBcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb2xkZXN0IHJldGFpbmVkIHNlcnZlciBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59IC0gT2xkZXN0IHJldGFpbmVkIHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgb2xkZXN0U2VxdWVuY2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeUNoYW5nZXNbMF0/LnNlcnZlclNlcXVlbmNlIHx8IG51bGxcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiBhd2FpdCB0aGlzLl9vbGRlc3RTZXF1ZW5jZShkYikpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvcmRlcmVkIGNoYW5nZXMgYWZ0ZXIgYSBjdXJzb3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hZnRlclNlcXVlbmNlIC0gRXhjbHVzaXZlIGxvd2VyIGJvdW5kLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubGltaXRdIC0gTWF4aW11bSBudW1iZXIgb2YgY2hhbmdlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnVwVG9TZXF1ZW5jZV0gLSBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLnNjb3BlXSAtIENhbGxlciBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9Pn0gLSBPcmRlcmVkIHBhZ2UuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0ID0gREVGQVVMVF9QQUdFX1NJWkUsIHNjb3BlLCB1cFRvU2VxdWVuY2V9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IG5vcm1hbGl6ZUxpbWl0KGxpbWl0KVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0OiBwYWdlU2l6ZSwgc2NvcGUsIHVwVG9TZXF1ZW5jZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3QgbGF0ZXN0U2VxdWVuY2UgPSB0eXBlb2YgdXBUb1NlcXVlbmNlID09PSBcIm51bWJlclwiID8gdXBUb1NlcXVlbmNlIDogYXdhaXQgdGhpcy5fbGF0ZXN0U2VxdWVuY2UoZGIpXG4gICAgICBjb25zdCBvbGRlc3RTZXF1ZW5jZSA9IGF3YWl0IHRoaXMuX29sZGVzdFNlcXVlbmNlKGRiKVxuICAgICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgICAgaWYgKHNuYXBzaG90UmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICBuZXh0U2VxdWVuY2U6IGFmdGVyU2VxdWVuY2UsXG4gICAgICAgICAgb2xkZXN0U2VxdWVuY2UsXG4gICAgICAgICAgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB1cFRvU2VxdWVuY2U6IGxhdGVzdFNlcXVlbmNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZFJvd1tdfSAqLyAoYXdhaXQgZGJcbiAgICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgICAgLndoZXJlKGBzZXJ2ZXJfc2VxdWVuY2UgPiAke2RiLnF1b3RlKGFmdGVyU2VxdWVuY2UpfWApXG4gICAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlIDw9ICR7ZGIucXVvdGUobGF0ZXN0U2VxdWVuY2UpfWApXG4gICAgICAgIC53aGVyZShzY29wZSA9PT0gdW5kZWZpbmVkID8gXCIxID0gMVwiIDoge3Njb3BlX2pzb246IHN0YWJsZUpzb25TdHJpbmdpZnkoc2NvcGUpfSlcbiAgICAgICAgLm9yZGVyKFwic2VydmVyX3NlcXVlbmNlIEFTQ1wiKVxuICAgICAgICAubGltaXQocGFnZVNpemUgKyAxKVxuICAgICAgICAucmVzdWx0cygpKVxuICAgICAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gcGFnZVNpemVcbiAgICAgIGNvbnN0IHBhZ2VSb3dzID0gcm93cy5zbGljZSgwLCBwYWdlU2l6ZSlcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBwYWdlUm93cy5tYXAoKHJvdykgPT4gdGhpcy5fbm9ybWFsaXplQ2hhbmdlUm93KHJvdykpXG4gICAgICBjb25zdCBsYXN0Q2hhbmdlID0gY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXMsXG4gICAgICAgIGhhc01vcmUsXG4gICAgICAgIG5leHRTZXF1ZW5jZTogbGFzdENoYW5nZSA/IGxhc3RDaGFuZ2Uuc2VydmVyU2VxdWVuY2UgOiBhZnRlclNlcXVlbmNlLFxuICAgICAgICBvbGRlc3RTZXF1ZW5jZSxcbiAgICAgICAgc25hcHNob3RSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgc2NoZW1hIGlzIHN0aWxsIHByZXNlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgcmVhZHkuXG4gICAqL1xuICBhc3luYyBfc2NoZW1hUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9pc1JlYWR5XG4gICAgaWYgKCF0aGlzLl9pc1JlYWR5KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4gYXdhaXQgZGIudGFibGVFeGlzdHMoVEFCTEVfTkFNRSkpKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBjaGFuZ2VzIHRhYmxlIGV4aXN0cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZUNoYW5nZXNUYWJsZShkYikge1xuICAgIGlmIChhd2FpdCBkYi50YWJsZUV4aXN0cyhUQUJMRV9OQU1FKSkgcmV0dXJuXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZURhdGEoVEFCTEVfTkFNRSwge2lmTm90RXhpc3RzOiB0cnVlfSlcblxuICAgIHRhYmxlLmludGVnZXIoXCJzZXJ2ZXJfc2VxdWVuY2VcIiwge2F1dG9JbmNyZW1lbnQ6IHRydWUsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJtb2RlbFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJvcGVyYXRpb25cIiwge251bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJyZWNvcmRfaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwicGF5bG9hZF9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwiYXR0cmlidXRlc19qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZGVtcG90ZW5jeV9rZXlcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJhY3Rvcl91c2VyX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiYWN0b3JfZGV2aWNlX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcInNjb3BlX2pzb25cIiwge251bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJyZXNwb25zZV9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5kYXRldGltZShcImNyZWF0ZWRfYXRcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG5cbiAgICBhd2FpdCBkYi5jcmVhdGVUYWJsZSh0YWJsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHBlcnNpc3RlZCBjaGFuZ2UgYnkgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gRW50cnkgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckNoYW5nZUZlZWRFbnRyeSB8IG51bGw+fSAtIEVudHJ5IG9yIG51bGwuXG4gICAqL1xuICBhc3luYyBfY2hhbmdlQnlJZChkYiwgaWQpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93W119ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAud2hlcmUoe2lkfSlcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gdGhpcy5fbm9ybWFsaXplQ2hhbmdlUm93KHJvd3NbMF0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGN1cnJlbnQgbGF0ZXN0IHNlcXVlbmNlIHdpdGhvdXQgcmVhZGluZXNzIGNoZWNrcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIExhdGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIF9sYXRlc3RTZXF1ZW5jZShkYikge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBERVNDXCIpXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IE51bWJlcihyb3dzWzBdLnNlcnZlcl9zZXF1ZW5jZSkgOiAwXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY3VycmVudCBvbGRlc3Qgc2VxdWVuY2Ugd2l0aG91dCByZWFkaW5lc3MgY2hlY2tzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIE9sZGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIF9vbGRlc3RTZXF1ZW5jZShkYikge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBBU0NcIilcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gTnVtYmVyKHJvd3NbMF0uc2VydmVyX3NlcXVlbmNlKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBQcnVuZXMgb2xkIHJldGFpbmVkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxhdGVzdFNlcXVlbmNlIC0gTGF0ZXN0IHNlcXVlbmNlIGFmdGVyIGFwcGVuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9wcnVuZVJldGFpbmVkQ2hhbmdlcyhkYiwgbGF0ZXN0U2VxdWVuY2UpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodGhpcy5yZXRlbnRpb25TaXplKSB8fCB0aGlzLnJldGVudGlvblNpemUgPCAxKSByZXR1cm5cblxuICAgIGNvbnN0IHBydW5lQmVmb3JlT3JBdCA9IGxhdGVzdFNlcXVlbmNlIC0gdGhpcy5yZXRlbnRpb25TaXplXG4gICAgaWYgKHBydW5lQmVmb3JlT3JBdCA8IDEpIHJldHVyblxuXG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e2lkOiBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlIDw9ICR7ZGIucXVvdGUocHJ1bmVCZWZvcmVPckF0KX1gKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IGRiLmRlbGV0ZSh7Y29uZGl0aW9uczoge2lkOiByb3cuaWR9LCB0YWJsZU5hbWU6IFRBQkxFX05BTUV9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGEgY2hhbmdlIHJvdy5cbiAgICogQHBhcmFtIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93fSByb3cgLSBSYXcgZGF0YWJhc2Ugcm93LlxuICAgKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAtIE5vcm1hbGl6ZWQgY2hhbmdlLlxuICAgKi9cbiAgX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3cpIHtcbiAgICBjb25zdCBjcmVhdGVkQXRWYWx1ZSA9IHJvdy5jcmVhdGVkX2F0XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0b3JEZXZpY2VJZDogcm93LmFjdG9yX2RldmljZV9pZCB8fCBudWxsLFxuICAgICAgYWN0b3JVc2VySWQ6IHJvdy5hY3Rvcl91c2VyX2lkIHx8IG51bGwsXG4gICAgICBhdHRyaWJ1dGVzOiBwYXJzZUpzb25Pck51bGwocm93LmF0dHJpYnV0ZXNfanNvbiksXG4gICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWRBdFZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGNyZWF0ZWRBdFZhbHVlLnRvSVNPU3RyaW5nKCkgOiBuZXcgRGF0ZShjcmVhdGVkQXRWYWx1ZSkudG9JU09TdHJpbmcoKSxcbiAgICAgIGlkOiByb3cuaWQsXG4gICAgICBpZGVtcG90ZW5jeUtleTogcm93LmlkZW1wb3RlbmN5X2tleSB8fCBudWxsLFxuICAgICAgbW9kZWw6IHJvdy5tb2RlbCxcbiAgICAgIG9wZXJhdGlvbjogcm93Lm9wZXJhdGlvbixcbiAgICAgIHBheWxvYWQ6IHBhcnNlSnNvbk9yTnVsbChyb3cucGF5bG9hZF9qc29uKSxcbiAgICAgIHJlY29yZElkOiByb3cucmVjb3JkX2lkIHx8IG51bGwsXG4gICAgICByZXNwb25zZTogcGFyc2VKc29uT3JOdWxsKHJvdy5yZXNwb25zZV9qc29uKSxcbiAgICAgIHNjb3BlOiBwYXJzZUpzb25Pck51bGwocm93LnNjb3BlX2pzb24pLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IE51bWJlcihyb3cuc2VydmVyX3NlcXVlbmNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3RvcmUgc2hvdWxkIHVzZSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBiZWNhdXNlIG5vIGRhdGFiYXNlIGlkZW50aWZpZXIgaXMgY29uZmlndXJlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBtZW1vcnkgc3RvcmFnZSBpcyBhY3RpdmUuXG4gICAqL1xuICBfdXNlc01lbW9yeVN0b3JhZ2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlQ29uZmlndXJhdGlvbigpW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIHByb2Nlc3MtbG9jYWwgbWVtb3J5IGVudHJ5IHdoZW4gbm8gZGF0YWJhc2UgaXMgY29uZmlndXJlZC5cbiAgICogQHBhcmFtIHtPbWl0PFNlcnZlckNoYW5nZUZlZWRFbnRyeSwgXCJzZXJ2ZXJTZXF1ZW5jZVwiPn0gY2hhbmdlIC0gQ2hhbmdlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9IC0gQXBwZW5kZWQgZW50cnkuXG4gICAqL1xuICBfYXBwZW5kTWVtb3J5KGNoYW5nZSkge1xuICAgIGNvbnN0IGVudHJ5ID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9ICovICh7XG4gICAgICBhY3RvckRldmljZUlkOiBjaGFuZ2UuYWN0b3JEZXZpY2VJZCxcbiAgICAgIGFjdG9yVXNlcklkOiBjaGFuZ2UuYWN0b3JVc2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBjaGFuZ2UuYXR0cmlidXRlcyB8fCBudWxsLFxuICAgICAgY3JlYXRlZEF0OiBjaGFuZ2UuY3JlYXRlZEF0LFxuICAgICAgaWQ6IGNoYW5nZS5pZCxcbiAgICAgIGlkZW1wb3RlbmN5S2V5OiBjaGFuZ2UuaWRlbXBvdGVuY3lLZXksXG4gICAgICBtb2RlbDogY2hhbmdlLm1vZGVsLFxuICAgICAgb3BlcmF0aW9uOiBjaGFuZ2Uub3BlcmF0aW9uLFxuICAgICAgcGF5bG9hZDogY2hhbmdlLnBheWxvYWQgfHwgbnVsbCxcbiAgICAgIHJlY29yZElkOiBjaGFuZ2UucmVjb3JkSWQgPT09IG51bGwgfHwgY2hhbmdlLnJlY29yZElkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGNoYW5nZS5yZWNvcmRJZCksXG4gICAgICByZXNwb25zZTogY2hhbmdlLnJlc3BvbnNlIHx8IG51bGwsXG4gICAgICBzY29wZTogY2hhbmdlLnNjb3BlIHx8IG51bGwsXG4gICAgICBzZXJ2ZXJTZXF1ZW5jZTogKyt0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICB0aGlzLl9tZW1vcnlDaGFuZ2VzLnB1c2goZW50cnkpXG4gICAgaWYgKHRoaXMuX21lbW9yeUNoYW5nZXMubGVuZ3RoID4gdGhpcy5yZXRlbnRpb25TaXplKSB0aGlzLl9tZW1vcnlDaGFuZ2VzLnNwbGljZSgwLCB0aGlzLl9tZW1vcnlDaGFuZ2VzLmxlbmd0aCAtIHRoaXMucmV0ZW50aW9uU2l6ZSlcblxuICAgIHJldHVybiBlbnRyeVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBjaGFuZ2UgcGFnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmFmdGVyU2VxdWVuY2UgLSBFeGNsdXNpdmUgbG93ZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmxpbWl0IC0gUGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudXBUb1NlcXVlbmNlXSAtIEluY2x1c2l2ZSB1cHBlciBib3VuZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3Muc2NvcGVdIC0gQ2FsbGVyIHN5bmMgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9fSAtIE9yZGVyZWQgcGFnZS5cbiAgICovXG4gIF9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0LCBzY29wZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGNvbnN0IGxhdGVzdFNlcXVlbmNlID0gdHlwZW9mIHVwVG9TZXF1ZW5jZSA9PT0gXCJudW1iZXJcIiA/IHVwVG9TZXF1ZW5jZSA6IHRoaXMuX21lbW9yeVNlcXVlbmNlXG4gICAgY29uc3Qgb2xkZXN0U2VxdWVuY2UgPSB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG4gICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgIGlmIChzbmFwc2hvdFJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4ge2NoYW5nZXM6IFtdLCBoYXNNb3JlOiBmYWxzZSwgbmV4dFNlcXVlbmNlOiBhZnRlclNlcXVlbmNlLCBvbGRlc3RTZXF1ZW5jZSwgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fbWVtb3J5Q2hhbmdlcy5maWx0ZXIoKGNoYW5nZSkgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgJiYgY2hhbmdlLnNlcnZlclNlcXVlbmNlIDw9IGxhdGVzdFNlcXVlbmNlICYmIHNjb3Blc0VxdWFsKGNoYW5nZS5zY29wZSwgc2NvcGUpXG4gICAgfSlcbiAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdFxuICAgIGNvbnN0IGNoYW5nZXMgPSByb3dzLnNsaWNlKDAsIGxpbWl0KVxuICAgIGNvbnN0IGxhc3RDaGFuZ2UgPSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV1cblxuICAgIHJldHVybiB7Y2hhbmdlcywgaGFzTW9yZSwgbmV4dFNlcXVlbmNlOiBsYXN0Q2hhbmdlID8gbGFzdENoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA6IGFmdGVyU2VxdWVuY2UsIG9sZGVzdFNlcXVlbmNlLCBzbmFwc2hvdFJlcXVpcmVkOiBmYWxzZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZGIuXG4gICAqIEBwYXJhbSB7KGRiOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTw/Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX3dpdGhEYihjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiU2VydmVyIGNoYW5nZS1mZWVkIHN0b3JlXCJ9LCBhc3luYyAoZGJzKSA9PiB7XG4gICAgICBjb25zdCBkYiA9IGRic1t0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cblxuICAgICAgaWYgKCFkYikgdGhyb3cgbmV3IEVycm9yKGBObyBkYXRhYmFzZSBjb25uZWN0aW9uIGF2YWlsYWJsZSBmb3IgaWRlbnRpZmllcjogJHt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcn1gKVxuXG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soZGIpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcGFnZSBsaW1pdC5cbiAqIEBwYXJhbSB7P30gbGltaXQgLSBSZXF1ZXN0ZWQgbGltaXQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFBhZ2Ugc2l6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTGltaXQobGltaXQpIHtcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSAmJiBsaW1pdCA+IDApIHJldHVybiBNYXRoLm1pbihsaW1pdCwgTUFYX1BBR0VfU0laRSlcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCskLy50ZXN0KGxpbWl0KSkgcmV0dXJuIE1hdGgubWluKE51bWJlcihsaW1pdCksIE1BWF9QQUdFX1NJWkUpXG5cbiAgcmV0dXJuIERFRkFVTFRfUEFHRV9TSVpFXG59XG5cbi8qKlxuICogUGFyc2VzIEpTT04taXNoIHZhbHVlcy5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBKU09OIHN0cmluZy5cbiAqIEByZXR1cm5zIHs/fSAtIFBhcnNlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uT3JOdWxsKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGxcblxuICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBzeW5jIHNjb3BlcyBieSBzdGFibGUgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBjaGFuZ2VTY29wZSAtIFBlcnNpc3RlZCBjaGFuZ2Ugc2NvcGUuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSByZXF1ZXN0ZWRTY29wZSAtIENhbGxlciBzY29wZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNoYW5nZSBpcyB2aXNpYmxlIGZvciB0aGUgcmVxdWVzdGVkIHNjb3BlLlxuICovXG5mdW5jdGlvbiBzY29wZXNFcXVhbChjaGFuZ2VTY29wZSwgcmVxdWVzdGVkU2NvcGUpIHtcbiAgaWYgKHJlcXVlc3RlZFNjb3BlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIHN0YWJsZUpzb25TdHJpbmdpZnkoY2hhbmdlU2NvcGUgfHwgbnVsbCkgPT09IHN0YWJsZUpzb25TdHJpbmdpZnkocmVxdWVzdGVkU2NvcGUpXG59XG5cbi8qKlxuICogU3RhYmxlIEpTT04gc2VyaWFsaXphdGlvbiBmb3IgcGVyc2lzdGVkIHN5bmMgc2NvcGVzLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25TdHJpbmdpZnkodmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHN0YWJsZUpzb25WYWx1ZSh2YWx1ZSkpXG59XG5cbi8qKlxuICogUHJvZHVjZXMgYSByZWN1cnNpdmVseSBrZXktc29ydGVkIEpTT04gdmFsdWUuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gSlNPTi1jb21wYXRpYmxlIHZhbHVlLlxuICogQHJldHVybnMgez99IC0gU3RhYmxlIEpTT04tY29tcGF0aWJsZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblZhbHVlKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gc3RhYmxlSnNvblZhbHVlKGl0ZW0pKVxuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHZhbHVlXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkucmVkdWNlKChtZW1vLCBrZXkpID0+IHtcbiAgICBtZW1vW2tleV0gPSBzdGFibGVKc29uVmFsdWUodmFsdWVba2V5XSlcblxuICAgIHJldHVybiBtZW1vXG4gIH0sIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh7fSkpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZEVudHJ5XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yRGV2aWNlSWQgLSBTaWduZWQgbXV0YXRpb24gYWN0b3IgZGV2aWNlIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3RvclVzZXJJZCAtIFNpZ25lZCBtdXRhdGlvbiBhY3RvciB1c2VyIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IGF0dHJpYnV0ZXMgLSBTZXJpYWxpemVkIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3JlYXRlZEF0IC0gU2VydmVyIGNoYW5nZSBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTZXJ2ZXIgY2hhbmdlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpZGVtcG90ZW5jeUtleSAtIE11dGF0aW9uIGlkZW1wb3RlbmN5IGtleSB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gTXV0YXRpb24gb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IHBheWxvYWQgLSBTZXJpYWxpemVkIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlY29yZElkIC0gQ2hhbmdlZCByZWNvcmQgaWQgd2hlbiBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSByZXNwb25zZSAtIENvbW1hbmQgcmVzcG9uc2UgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBzY29wZSAtIE9mZmxpbmUgZ3JhbnQgc2NvcGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2VydmVyU2VxdWVuY2UgLSBNb25vdG9uaWMgc2VydmVyIHNlcXVlbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZFJvd1xuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3Rvcl9kZXZpY2VfaWQgLSBBY3RvciBkZXZpY2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yX3VzZXJfaWQgLSBBY3RvciB1c2VyIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhdHRyaWJ1dGVzX2pzb24gLSBBdHRyaWJ1dGVzIEpTT04uXG4gKiBAcHJvcGVydHkge0RhdGUgfCBzdHJpbmd9IGNyZWF0ZWRfYXQgLSBDcmVhdGlvbiB0aW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRW50cnkgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGlkZW1wb3RlbmN5X2tleSAtIE11dGF0aW9uIGlkZW1wb3RlbmN5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gTXV0YXRpb24gb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBwYXlsb2FkX2pzb24gLSBNdXRhdGlvbiBwYXlsb2FkIEpTT04uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlY29yZF9pZCAtIFJlY29yZCBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVzcG9uc2VfanNvbiAtIFJlc3BvbnNlIEpTT04uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHNjb3BlX2pzb24gLSBTY29wZSBKU09OLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IHNlcnZlcl9zZXF1ZW5jZSAtIFNlcnZlciBzZXF1ZW5jZS5cbiAqL1xuIl19
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNoYW5nZS1mZWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc2VydmVyLWNoYW5nZS1mZWVkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sbUJBQW1CLE1BQU0sa0JBQWtCLENBQUE7QUFFbEQsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUE7QUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUE7QUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFBO0FBQzFCLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFBO0FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQ0FBcUMsQ0FBQyxhQUFhO0lBQ2pFLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHFCQUFxQjtJQUN4Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxhQUFhLEVBQUM7UUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtRQUU5RCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtR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LENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUVuRyxPQUFPLGlCQUFpQixDQUFBO0FBQzFCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBSztJQUM1QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUU5RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxXQUFXLENBQUMsV0FBVyxFQUFFLGNBQWM7SUFDOUMsSUFBSSxjQUFjLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTdDLE9BQU8sbUJBQW1CLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxLQUFLLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBQ3pGLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7O0dBZUciLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtyYW5kb21VVUlEfSBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCBUYWJsZURhdGEgZnJvbSBcIi4uL2RhdGFiYXNlL3RhYmxlLWRhdGEvaW5kZXguanNcIlxuaW1wb3J0IHN0YWJsZUpzb25TdHJpbmdpZnkgZnJvbSBcIi4vc3RhYmxlLWpzb24uanNcIlxuXG5jb25zdCBERUZBVUxUX1JFVEVOVElPTl9TSVpFID0gMTAwMDBcbmNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gMTAwXG5jb25zdCBNQVhfUEFHRV9TSVpFID0gMTAwMFxuY29uc3QgVEFCTEVfTkFNRSA9IFwiZnJvbnRlbmRfbW9kZWxfc3luY19jaGFuZ2VzXCJcbmNvbnN0IHN0b3JlcyA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBTaGFyZWQgc2VydmVyIGNoYW5nZS1mZWVkIHN0b3JlIGZvciBhIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZFN0b3JlfSAtIFN0b3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmVyQ2hhbmdlRmVlZFN0b3JlRm9yQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIGxldCBzdG9yZSA9IHN0b3Jlcy5nZXQoY29uZmlndXJhdGlvbilcblxuICBpZiAoIXN0b3JlKSB7XG4gICAgc3RvcmUgPSBuZXcgU2VydmVyQ2hhbmdlRmVlZFN0b3JlKHtjb25maWd1cmF0aW9ufSlcbiAgICBzdG9yZXMuc2V0KGNvbmZpZ3VyYXRpb24sIHN0b3JlKVxuICB9XG5cbiAgcmV0dXJuIHN0b3JlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcnZlckNoYW5nZUZlZWRTdG9yZSB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGF0YWJhc2VJZGVudGlmaWVyXSAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5yZXRlbnRpb25TaXplXSAtIE51bWJlciBvZiBmZWVkIGVudHJpZXMgdG8gcmV0YWluLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGRhdGFiYXNlSWRlbnRpZmllciA9IFwiZGVmYXVsdFwiLCByZXRlbnRpb25TaXplfSkge1xuICAgIGNvbnN0IHN5bmNDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5nZXRTeW5jQ29uZmlndXJhdGlvbigpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLnJldGVudGlvblNpemUgPSByZXRlbnRpb25TaXplIHx8IHN5bmNDb25maWd1cmF0aW9uLmNoYW5nZUZlZWRSZXRlbnRpb25TaXplIHx8IERFRkFVTFRfUkVURU5USU9OX1NJWkVcbiAgICAvKiogQHR5cGUge1NlcnZlckNoYW5nZUZlZWRFbnRyeVtdfSAqL1xuICAgIHRoaXMuX21lbW9yeUNoYW5nZXMgPSBbXVxuICAgIHRoaXMuX21lbW9yeVNlcXVlbmNlID0gMFxuICAgIHRoaXMuX2lzUmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZSBiYWNraW5nIHRhYmxlIGV4aXN0cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiByZWFkeS5cbiAgICovXG4gIGFzeW5jIGVuc3VyZVJlYWR5KCkge1xuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSB7XG4gICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGF3YWl0IHRoaXMuX3NjaGVtYVJlYWR5KCkpIHJldHVyblxuICAgIGlmICh0aGlzLl9yZWFkeVByb21pc2UpIHJldHVybiBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcblxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uc2V0Q3VycmVudCgpXG4gICAgICBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Vuc3VyZUNoYW5nZXNUYWJsZShkYilcbiAgICAgIH0pXG4gICAgICB0aGlzLl9pc1JlYWR5ID0gdHJ1ZVxuICAgIH0pKClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWFkeVByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCF0aGlzLl9pc1JlYWR5KSB0aGlzLl9yZWFkeVByb21pc2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjaGFuZ2UgYW5kIGFzc2lnbnMgdGhlIG5leHQgc2VydmVyIHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge09taXQ8U2VydmVyQ2hhbmdlRmVlZEVudHJ5LCBcImNyZWF0ZWRBdFwiIHwgXCJpZFwiIHwgXCJzZXJ2ZXJTZXF1ZW5jZVwiPiAmIHtjcmVhdGVkQXQ/OiBzdHJpbmcsIGlkPzogc3RyaW5nfX0gY2hhbmdlIC0gQ2hhbmdlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckNoYW5nZUZlZWRFbnRyeT59IC0gUGVyc2lzdGVkIGNoYW5nZS5cbiAgICovXG4gIGFzeW5jIGFwcGVuZChjaGFuZ2UpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVJlYWR5KClcblxuICAgIGNvbnN0IGlkID0gY2hhbmdlLmlkIHx8IHJhbmRvbVVVSUQoKVxuICAgIGNvbnN0IGNyZWF0ZWRBdCA9IGNoYW5nZS5jcmVhdGVkQXQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX2FwcGVuZE1lbW9yeSh7Li4uY2hhbmdlLCBjcmVhdGVkQXQsIGlkfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiB7XG4gICAgICBhd2FpdCBkYi5pbnNlcnQoe1xuICAgICAgICB0YWJsZU5hbWU6IFRBQkxFX05BTUUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBhY3Rvcl9kZXZpY2VfaWQ6IGNoYW5nZS5hY3RvckRldmljZUlkLFxuICAgICAgICAgIGFjdG9yX3VzZXJfaWQ6IGNoYW5nZS5hY3RvclVzZXJJZCxcbiAgICAgICAgICBhdHRyaWJ1dGVzX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5hdHRyaWJ1dGVzIHx8IG51bGwpLFxuICAgICAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKGNyZWF0ZWRBdCksXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgaWRlbXBvdGVuY3lfa2V5OiBjaGFuZ2UuaWRlbXBvdGVuY3lLZXksXG4gICAgICAgICAgbW9kZWw6IGNoYW5nZS5tb2RlbCxcbiAgICAgICAgICBvcGVyYXRpb246IGNoYW5nZS5vcGVyYXRpb24sXG4gICAgICAgICAgcGF5bG9hZF9qc29uOiBKU09OLnN0cmluZ2lmeShjaGFuZ2UucGF5bG9hZCB8fCBudWxsKSxcbiAgICAgICAgICByZWNvcmRfaWQ6IGNoYW5nZS5yZWNvcmRJZCA9PT0gbnVsbCB8fCBjaGFuZ2UucmVjb3JkSWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoY2hhbmdlLnJlY29yZElkKSxcbiAgICAgICAgICByZXNwb25zZV9qc29uOiBKU09OLnN0cmluZ2lmeShjaGFuZ2UucmVzcG9uc2UgfHwgbnVsbCksXG4gICAgICAgICAgc2NvcGVfanNvbjogc3RhYmxlSnNvblN0cmluZ2lmeShjaGFuZ2Uuc2NvcGUgfHwgbnVsbClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5fY2hhbmdlQnlJZChkYiwgaWQpXG4gICAgICBpZiAoIXJvdykgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHBlcnNpc3Qgc2VydmVyIGNoYW5nZS1mZWVkIGVudHJ5XCIpXG5cbiAgICAgIGF3YWl0IHRoaXMuX3BydW5lUmV0YWluZWRDaGFuZ2VzKGRiLCByb3cuc2VydmVyU2VxdWVuY2UpXG5cbiAgICAgIHJldHVybiByb3dcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudCBsYXRlc3Qgc2VydmVyIHNlcXVlbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIExhdGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIGxhdGVzdFNlcXVlbmNlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkYlxuICAgICAgICAubmV3UXVlcnkoKVxuICAgICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgREVTQ1wiKVxuICAgICAgICAubGltaXQoMSlcbiAgICAgICAgLnJlc3VsdHMoKVxuICAgICAgY29uc3Qgcm93ID0gLyoqIEB0eXBlIHt7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfSB8IHVuZGVmaW5lZH0gKi8gKHJvd3NbMF0pXG5cbiAgICAgIHJldHVybiByb3cgPyBOdW1iZXIocm93LnNlcnZlcl9zZXF1ZW5jZSkgOiAwXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG9sZGVzdCByZXRhaW5lZCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIE9sZGVzdCByZXRhaW5lZCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIG9sZGVzdFNlcXVlbmNlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4gYXdhaXQgdGhpcy5fb2xkZXN0U2VxdWVuY2UoZGIpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb3JkZXJlZCBjaGFuZ2VzIGFmdGVyIGEgY3Vyc29yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYWZ0ZXJTZXF1ZW5jZSAtIEV4Y2x1c2l2ZSBsb3dlciBib3VuZC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmxpbWl0XSAtIE1heGltdW0gbnVtYmVyIG9mIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy51cFRvU2VxdWVuY2VdIC0gSW5jbHVzaXZlIHVwcGVyIGJvdW5kLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbYXJncy5zY29wZV0gLSBDYWxsZXIgc3luYyBzY29wZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2NoYW5nZXM6IFNlcnZlckNoYW5nZUZlZWRFbnRyeVtdLCBoYXNNb3JlOiBib29sZWFuLCBuZXh0U2VxdWVuY2U6IG51bWJlciwgb2xkZXN0U2VxdWVuY2U6IG51bWJlciB8IG51bGwsIHNuYXBzaG90UmVxdWlyZWQ6IGJvb2xlYW4sIHVwVG9TZXF1ZW5jZTogbnVtYmVyfT59IC0gT3JkZXJlZCBwYWdlLlxuICAgKi9cbiAgYXN5bmMgY2hhbmdlc0FmdGVyKHthZnRlclNlcXVlbmNlLCBsaW1pdCA9IERFRkFVTFRfUEFHRV9TSVpFLCBzY29wZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSBub3JtYWxpemVMaW1pdChsaW1pdClcblxuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSByZXR1cm4gdGhpcy5fbWVtb3J5Q2hhbmdlc0FmdGVyKHthZnRlclNlcXVlbmNlLCBsaW1pdDogcGFnZVNpemUsIHNjb3BlLCB1cFRvU2VxdWVuY2V9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGNvbnN0IGxhdGVzdFNlcXVlbmNlID0gdHlwZW9mIHVwVG9TZXF1ZW5jZSA9PT0gXCJudW1iZXJcIiA/IHVwVG9TZXF1ZW5jZSA6IGF3YWl0IHRoaXMuX2xhdGVzdFNlcXVlbmNlKGRiKVxuICAgICAgY29uc3Qgb2xkZXN0U2VxdWVuY2UgPSBhd2FpdCB0aGlzLl9vbGRlc3RTZXF1ZW5jZShkYilcbiAgICAgIGNvbnN0IHNuYXBzaG90UmVxdWlyZWQgPSBhZnRlclNlcXVlbmNlID4gMCAmJiBvbGRlc3RTZXF1ZW5jZSAhPT0gbnVsbCAmJiBvbGRlc3RTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgKyAxXG5cbiAgICAgIGlmIChzbmFwc2hvdFJlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2hhbmdlczogW10sXG4gICAgICAgICAgaGFzTW9yZTogZmFsc2UsXG4gICAgICAgICAgbmV4dFNlcXVlbmNlOiBhZnRlclNlcXVlbmNlLFxuICAgICAgICAgIG9sZGVzdFNlcXVlbmNlLFxuICAgICAgICAgIHNuYXBzaG90UmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge1NlcnZlckNoYW5nZUZlZWRSb3dbXX0gKi8gKGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlID4gJHtkYi5xdW90ZShhZnRlclNlcXVlbmNlKX1gKVxuICAgICAgICAud2hlcmUoYHNlcnZlcl9zZXF1ZW5jZSA8PSAke2RiLnF1b3RlKGxhdGVzdFNlcXVlbmNlKX1gKVxuICAgICAgICAud2hlcmUoc2NvcGUgPT09IHVuZGVmaW5lZCA/IFwiMSA9IDFcIiA6IHtzY29wZV9qc29uOiBzdGFibGVKc29uU3RyaW5naWZ5KHNjb3BlKX0pXG4gICAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBBU0NcIilcbiAgICAgICAgLmxpbWl0KHBhZ2VTaXplICsgMSlcbiAgICAgICAgLnJlc3VsdHMoKSlcbiAgICAgIGNvbnN0IGhhc01vcmUgPSByb3dzLmxlbmd0aCA+IHBhZ2VTaXplXG4gICAgICBjb25zdCBwYWdlUm93cyA9IHJvd3Muc2xpY2UoMCwgcGFnZVNpemUpXG4gICAgICBjb25zdCBjaGFuZ2VzID0gcGFnZVJvd3MubWFwKChyb3cpID0+IHRoaXMuX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3cpKVxuICAgICAgY29uc3QgbGFzdENoYW5nZSA9IGNoYW5nZXNbY2hhbmdlcy5sZW5ndGggLSAxXVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGFuZ2VzLFxuICAgICAgICBoYXNNb3JlLFxuICAgICAgICBuZXh0U2VxdWVuY2U6IGxhc3RDaGFuZ2UgPyBsYXN0Q2hhbmdlLnNlcnZlclNlcXVlbmNlIDogYWZ0ZXJTZXF1ZW5jZSxcbiAgICAgICAgb2xkZXN0U2VxdWVuY2UsXG4gICAgICAgIHNuYXBzaG90UmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB1cFRvU2VxdWVuY2U6IGxhdGVzdFNlcXVlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHNjaGVtYSBpcyBzdGlsbCBwcmVzZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgX3NjaGVtYVJlYWR5KCkge1xuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSByZXR1cm4gdGhpcy5faXNSZWFkeVxuICAgIGlmICghdGhpcy5faXNSZWFkeSkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IGF3YWl0IGRiLnRhYmxlRXhpc3RzKFRBQkxFX05BTUUpKSkgcmV0dXJuIHRydWVcblxuICAgIHRoaXMuX2lzUmVhZHkgPSBmYWxzZVxuICAgIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgY2hhbmdlcyB0YWJsZSBleGlzdHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9lbnN1cmVDaGFuZ2VzVGFibGUoZGIpIHtcbiAgICBpZiAoYXdhaXQgZGIudGFibGVFeGlzdHMoVEFCTEVfTkFNRSkpIHJldHVyblxuXG4gICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGVEYXRhKFRBQkxFX05BTUUsIHtpZk5vdEV4aXN0czogdHJ1ZX0pXG5cbiAgICB0YWJsZS5pbnRlZ2VyKFwic2VydmVyX3NlcXVlbmNlXCIsIHthdXRvSW5jcmVtZW50OiB0cnVlLCBudWxsOiBmYWxzZSwgcHJpbWFyeUtleTogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgdGFibGUuc3RyaW5nKFwibW9kZWxcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgdGFibGUuc3RyaW5nKFwib3BlcmF0aW9uXCIsIHtudWxsOiBmYWxzZX0pXG4gICAgdGFibGUuc3RyaW5nKFwicmVjb3JkX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcInBheWxvYWRfanNvblwiLCB7bnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcImF0dHJpYnV0ZXNfanNvblwiLCB7bnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiaWRlbXBvdGVuY3lfa2V5XCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiYWN0b3JfdXNlcl9pZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IHRydWV9KVxuICAgIHRhYmxlLnN0cmluZyhcImFjdG9yX2RldmljZV9pZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJzY29wZV9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwicmVzcG9uc2VfanNvblwiLCB7bnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuZGF0ZXRpbWUoXCJjcmVhdGVkX2F0XCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuXG4gICAgYXdhaXQgZGIuY3JlYXRlVGFibGUodGFibGUpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBwZXJzaXN0ZWQgY2hhbmdlIGJ5IGlkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIEVudHJ5IGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnkgfCBudWxsPn0gLSBFbnRyeSBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgX2NoYW5nZUJ5SWQoZGIsIGlkKSB7XG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZFJvd1tdfSAqLyAoYXdhaXQgZGJcbiAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAuZnJvbShUQUJMRV9OQU1FKVxuICAgICAgLndoZXJlKHtpZH0pXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IHRoaXMuX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3dzWzBdKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjdXJyZW50IGxhdGVzdCBzZXF1ZW5jZSB3aXRob3V0IHJlYWRpbmVzcyBjaGVja3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gLSBMYXRlc3Qgc2VxdWVuY2UuXG4gICAqL1xuICBhc3luYyBfbGF0ZXN0U2VxdWVuY2UoZGIpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgREVTQ1wiKVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAucmVzdWx0cygpKVxuXG4gICAgcmV0dXJuIHJvd3NbMF0gPyBOdW1iZXIocm93c1swXS5zZXJ2ZXJfc2VxdWVuY2UpIDogMFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGN1cnJlbnQgb2xkZXN0IHNlcXVlbmNlIHdpdGhvdXQgcmVhZGluZXNzIGNoZWNrcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXIgfCBudWxsPn0gLSBPbGRlc3Qgc2VxdWVuY2UuXG4gICAqL1xuICBhc3luYyBfb2xkZXN0U2VxdWVuY2UoZGIpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtBcnJheTx7c2VydmVyX3NlcXVlbmNlPzogbnVtYmVyIHwgc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAub3JkZXIoXCJzZXJ2ZXJfc2VxdWVuY2UgQVNDXCIpXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IE51bWJlcihyb3dzWzBdLnNlcnZlcl9zZXF1ZW5jZSkgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUHJ1bmVzIG9sZCByZXRhaW5lZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsYXRlc3RTZXF1ZW5jZSAtIExhdGVzdCBzZXF1ZW5jZSBhZnRlciBhcHBlbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfcHJ1bmVSZXRhaW5lZENoYW5nZXMoZGIsIGxhdGVzdFNlcXVlbmNlKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHRoaXMucmV0ZW50aW9uU2l6ZSkgfHwgdGhpcy5yZXRlbnRpb25TaXplIDwgMSkgcmV0dXJuXG5cbiAgICBjb25zdCBwcnVuZUJlZm9yZU9yQXQgPSBsYXRlc3RTZXF1ZW5jZSAtIHRoaXMucmV0ZW50aW9uU2l6ZVxuICAgIGlmIChwcnVuZUJlZm9yZU9yQXQgPCAxKSByZXR1cm5cblxuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtpZDogc3RyaW5nfT59ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAud2hlcmUoYHNlcnZlcl9zZXF1ZW5jZSA8PSAke2RiLnF1b3RlKHBydW5lQmVmb3JlT3JBdCl9YClcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBhd2FpdCBkYi5kZWxldGUoe2NvbmRpdGlvbnM6IHtpZDogcm93LmlkfSwgdGFibGVOYW1lOiBUQUJMRV9OQU1FfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBhIGNoYW5nZSByb3cuXG4gICAqIEBwYXJhbSB7U2VydmVyQ2hhbmdlRmVlZFJvd30gcm93IC0gUmF3IGRhdGFiYXNlIHJvdy5cbiAgICogQHJldHVybnMge1NlcnZlckNoYW5nZUZlZWRFbnRyeX0gLSBOb3JtYWxpemVkIGNoYW5nZS5cbiAgICovXG4gIF9ub3JtYWxpemVDaGFuZ2VSb3cocm93KSB7XG4gICAgY29uc3QgY3JlYXRlZEF0VmFsdWUgPSByb3cuY3JlYXRlZF9hdFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdG9yRGV2aWNlSWQ6IHJvdy5hY3Rvcl9kZXZpY2VfaWQgfHwgbnVsbCxcbiAgICAgIGFjdG9yVXNlcklkOiByb3cuYWN0b3JfdXNlcl9pZCB8fCBudWxsLFxuICAgICAgYXR0cmlidXRlczogcGFyc2VKc29uT3JOdWxsKHJvdy5hdHRyaWJ1dGVzX2pzb24pLFxuICAgICAgY3JlYXRlZEF0OiBjcmVhdGVkQXRWYWx1ZSBpbnN0YW5jZW9mIERhdGUgPyBjcmVhdGVkQXRWYWx1ZS50b0lTT1N0cmluZygpIDogbmV3IERhdGUoY3JlYXRlZEF0VmFsdWUpLnRvSVNPU3RyaW5nKCksXG4gICAgICBpZDogcm93LmlkLFxuICAgICAgaWRlbXBvdGVuY3lLZXk6IHJvdy5pZGVtcG90ZW5jeV9rZXkgfHwgbnVsbCxcbiAgICAgIG1vZGVsOiByb3cubW9kZWwsXG4gICAgICBvcGVyYXRpb246IHJvdy5vcGVyYXRpb24sXG4gICAgICBwYXlsb2FkOiBwYXJzZUpzb25Pck51bGwocm93LnBheWxvYWRfanNvbiksXG4gICAgICByZWNvcmRJZDogcm93LnJlY29yZF9pZCB8fCBudWxsLFxuICAgICAgcmVzcG9uc2U6IHBhcnNlSnNvbk9yTnVsbChyb3cucmVzcG9uc2VfanNvbiksXG4gICAgICBzY29wZTogcGFyc2VKc29uT3JOdWxsKHJvdy5zY29wZV9qc29uKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiBOdW1iZXIocm93LnNlcnZlcl9zZXF1ZW5jZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHN0b3JlIHNob3VsZCB1c2UgcHJvY2Vzcy1sb2NhbCBtZW1vcnkgYmVjYXVzZSBubyBkYXRhYmFzZSBpZGVudGlmaWVyIGlzIGNvbmZpZ3VyZWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbWVtb3J5IHN0b3JhZ2UgaXMgYWN0aXZlLlxuICAgKi9cbiAgX3VzZXNNZW1vcnlTdG9yYWdlKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIXRoaXMuY29uZmlndXJhdGlvbi5nZXREYXRhYmFzZUNvbmZpZ3VyYXRpb24oKVt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBlbnRyeSB3aGVuIG5vIGRhdGFiYXNlIGlzIGNvbmZpZ3VyZWQuXG4gICAqIEBwYXJhbSB7T21pdDxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnksIFwic2VydmVyU2VxdWVuY2VcIj59IGNoYW5nZSAtIENoYW5nZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAtIEFwcGVuZGVkIGVudHJ5LlxuICAgKi9cbiAgX2FwcGVuZE1lbW9yeShjaGFuZ2UpIHtcbiAgICBjb25zdCBlbnRyeSA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAqLyAoe1xuICAgICAgYWN0b3JEZXZpY2VJZDogY2hhbmdlLmFjdG9yRGV2aWNlSWQsXG4gICAgICBhY3RvclVzZXJJZDogY2hhbmdlLmFjdG9yVXNlcklkLFxuICAgICAgYXR0cmlidXRlczogY2hhbmdlLmF0dHJpYnV0ZXMgfHwgbnVsbCxcbiAgICAgIGNyZWF0ZWRBdDogY2hhbmdlLmNyZWF0ZWRBdCxcbiAgICAgIGlkOiBjaGFuZ2UuaWQsXG4gICAgICBpZGVtcG90ZW5jeUtleTogY2hhbmdlLmlkZW1wb3RlbmN5S2V5LFxuICAgICAgbW9kZWw6IGNoYW5nZS5tb2RlbCxcbiAgICAgIG9wZXJhdGlvbjogY2hhbmdlLm9wZXJhdGlvbixcbiAgICAgIHBheWxvYWQ6IGNoYW5nZS5wYXlsb2FkIHx8IG51bGwsXG4gICAgICByZWNvcmRJZDogY2hhbmdlLnJlY29yZElkID09PSBudWxsIHx8IGNoYW5nZS5yZWNvcmRJZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhjaGFuZ2UucmVjb3JkSWQpLFxuICAgICAgcmVzcG9uc2U6IGNoYW5nZS5yZXNwb25zZSB8fCBudWxsLFxuICAgICAgc2NvcGU6IGNoYW5nZS5zY29wZSB8fCBudWxsLFxuICAgICAgc2VydmVyU2VxdWVuY2U6ICsrdGhpcy5fbWVtb3J5U2VxdWVuY2VcbiAgICB9KVxuXG4gICAgdGhpcy5fbWVtb3J5Q2hhbmdlcy5wdXNoKGVudHJ5KVxuICAgIGlmICh0aGlzLl9tZW1vcnlDaGFuZ2VzLmxlbmd0aCA+IHRoaXMucmV0ZW50aW9uU2l6ZSkgdGhpcy5fbWVtb3J5Q2hhbmdlcy5zcGxpY2UoMCwgdGhpcy5fbWVtb3J5Q2hhbmdlcy5sZW5ndGggLSB0aGlzLnJldGVudGlvblNpemUpXG5cbiAgICByZXR1cm4gZW50cnlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvY2Vzcy1sb2NhbCBtZW1vcnkgY2hhbmdlIHBhZ2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hZnRlclNlcXVlbmNlIC0gRXhjbHVzaXZlIGxvd2VyIGJvdW5kLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5saW1pdCAtIFBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnVwVG9TZXF1ZW5jZV0gLSBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLnNjb3BlXSAtIENhbGxlciBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7e2NoYW5nZXM6IFNlcnZlckNoYW5nZUZlZWRFbnRyeVtdLCBoYXNNb3JlOiBib29sZWFuLCBuZXh0U2VxdWVuY2U6IG51bWJlciwgb2xkZXN0U2VxdWVuY2U6IG51bWJlciB8IG51bGwsIHNuYXBzaG90UmVxdWlyZWQ6IGJvb2xlYW4sIHVwVG9TZXF1ZW5jZTogbnVtYmVyfX0gLSBPcmRlcmVkIHBhZ2UuXG4gICAqL1xuICBfbWVtb3J5Q2hhbmdlc0FmdGVyKHthZnRlclNlcXVlbmNlLCBsaW1pdCwgc2NvcGUsIHVwVG9TZXF1ZW5jZX0pIHtcbiAgICBjb25zdCBsYXRlc3RTZXF1ZW5jZSA9IHR5cGVvZiB1cFRvU2VxdWVuY2UgPT09IFwibnVtYmVyXCIgPyB1cFRvU2VxdWVuY2UgOiB0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuICAgIGNvbnN0IG9sZGVzdFNlcXVlbmNlID0gdGhpcy5fbWVtb3J5Q2hhbmdlc1swXT8uc2VydmVyU2VxdWVuY2UgfHwgbnVsbFxuICAgIGNvbnN0IHNuYXBzaG90UmVxdWlyZWQgPSBhZnRlclNlcXVlbmNlID4gMCAmJiBvbGRlc3RTZXF1ZW5jZSAhPT0gbnVsbCAmJiBvbGRlc3RTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgKyAxXG5cbiAgICBpZiAoc25hcHNob3RSZXF1aXJlZCkge1xuICAgICAgcmV0dXJuIHtjaGFuZ2VzOiBbXSwgaGFzTW9yZTogZmFsc2UsIG5leHRTZXF1ZW5jZTogYWZ0ZXJTZXF1ZW5jZSwgb2xkZXN0U2VxdWVuY2UsIHNuYXBzaG90UmVxdWlyZWQ6IHRydWUsIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2V9XG4gICAgfVxuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX21lbW9yeUNoYW5nZXMuZmlsdGVyKChjaGFuZ2UpID0+IHtcbiAgICAgIHJldHVybiBjaGFuZ2Uuc2VydmVyU2VxdWVuY2UgPiBhZnRlclNlcXVlbmNlICYmIGNoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA8PSBsYXRlc3RTZXF1ZW5jZSAmJiBzY29wZXNFcXVhbChjaGFuZ2Uuc2NvcGUsIHNjb3BlKVxuICAgIH0pXG4gICAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gbGltaXRcbiAgICBjb25zdCBjaGFuZ2VzID0gcm93cy5zbGljZSgwLCBsaW1pdClcbiAgICBjb25zdCBsYXN0Q2hhbmdlID0gY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdXG5cbiAgICByZXR1cm4ge2NoYW5nZXMsIGhhc01vcmUsIG5leHRTZXF1ZW5jZTogbGFzdENoYW5nZSA/IGxhc3RDaGFuZ2Uuc2VydmVyU2VxdWVuY2UgOiBhZnRlclNlcXVlbmNlLCBvbGRlc3RTZXF1ZW5jZSwgc25hcHNob3RSZXF1aXJlZDogZmFsc2UsIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2V9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aXRoIGRiLlxuICAgKiBAcGFyYW0geyhkYjogaW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHQpID0+IFByb21pc2U8Pz59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPD8+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIF93aXRoRGIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIlNlcnZlciBjaGFuZ2UtZmVlZCBzdG9yZVwifSwgYXN5bmMgKGRicykgPT4ge1xuICAgICAgY29uc3QgZGIgPSBkYnNbdGhpcy5kYXRhYmFzZUlkZW50aWZpZXJdXG5cbiAgICAgIGlmICghZGIpIHRocm93IG5ldyBFcnJvcihgTm8gZGF0YWJhc2UgY29ubmVjdGlvbiBhdmFpbGFibGUgZm9yIGlkZW50aWZpZXI6ICR7dGhpcy5kYXRhYmFzZUlkZW50aWZpZXJ9YClcblxuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKGRiKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHBhZ2UgbGltaXQuXG4gKiBAcGFyYW0gez99IGxpbWl0IC0gUmVxdWVzdGVkIGxpbWl0LlxuICogQHJldHVybnMge251bWJlcn0gLSBQYWdlIHNpemUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbWl0KGxpbWl0KSB7XG4gIGlmICh0eXBlb2YgbGltaXQgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzSW50ZWdlcihsaW1pdCkgJiYgbGltaXQgPiAwKSByZXR1cm4gTWF0aC5taW4obGltaXQsIE1BWF9QQUdFX1NJWkUpXG4gIGlmICh0eXBlb2YgbGltaXQgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrJC8udGVzdChsaW1pdCkpIHJldHVybiBNYXRoLm1pbihOdW1iZXIobGltaXQpLCBNQVhfUEFHRV9TSVpFKVxuXG4gIHJldHVybiBERUZBVUxUX1BBR0VfU0laRVxufVxuXG4vKipcbiAqIFBhcnNlcyBKU09OLWlzaCB2YWx1ZXMuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gSlNPTiBzdHJpbmcuXG4gKiBAcmV0dXJucyB7P30gLSBQYXJzZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSnNvbk9yTnVsbCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpXG59XG5cbi8qKlxuICogQ29tcGFyZXMgc3luYyBzY29wZXMgYnkgc3RhYmxlIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gY2hhbmdlU2NvcGUgLSBQZXJzaXN0ZWQgY2hhbmdlIHNjb3BlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/PiB8IHVuZGVmaW5lZH0gcmVxdWVzdGVkU2NvcGUgLSBDYWxsZXIgc2NvcGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjaGFuZ2UgaXMgdmlzaWJsZSBmb3IgdGhlIHJlcXVlc3RlZCBzY29wZS5cbiAqL1xuZnVuY3Rpb24gc2NvcGVzRXF1YWwoY2hhbmdlU2NvcGUsIHJlcXVlc3RlZFNjb3BlKSB7XG4gIGlmIChyZXF1ZXN0ZWRTY29wZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBzdGFibGVKc29uU3RyaW5naWZ5KGNoYW5nZVNjb3BlIHx8IG51bGwpID09PSBzdGFibGVKc29uU3RyaW5naWZ5KHJlcXVlc3RlZFNjb3BlKVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlcnZlckNoYW5nZUZlZWRFbnRyeVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3RvckRldmljZUlkIC0gU2lnbmVkIG11dGF0aW9uIGFjdG9yIGRldmljZSBpZCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYWN0b3JVc2VySWQgLSBTaWduZWQgbXV0YXRpb24gYWN0b3IgdXNlciBpZCB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBhdHRyaWJ1dGVzIC0gU2VyaWFsaXplZCBtdXRhdGlvbiBhdHRyaWJ1dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWF0ZWRBdCAtIFNlcnZlciBjaGFuZ2UgY3JlYXRpb24gdGltZXN0YW1wLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gU2VydmVyIGNoYW5nZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaWRlbXBvdGVuY3lLZXkgLSBNdXRhdGlvbiBpZGVtcG90ZW5jeSBrZXkgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBGcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBwYXlsb2FkIC0gU2VyaWFsaXplZCBtdXRhdGlvbiBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZWNvcmRJZCAtIENoYW5nZWQgcmVjb3JkIGlkIHdoZW4ga25vd24uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gcmVzcG9uc2UgLSBDb21tYW5kIHJlc3BvbnNlIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+IHwgbnVsbH0gc2NvcGUgLSBPZmZsaW5lIGdyYW50IHNjb3BlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNlcnZlclNlcXVlbmNlIC0gTW9ub3RvbmljIHNlcnZlciBzZXF1ZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlcnZlckNoYW5nZUZlZWRSb3dcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYWN0b3JfZGV2aWNlX2lkIC0gQWN0b3IgZGV2aWNlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3Rvcl91c2VyX2lkIC0gQWN0b3IgdXNlciBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYXR0cmlidXRlc19qc29uIC0gQXR0cmlidXRlcyBKU09OLlxuICogQHByb3BlcnR5IHtEYXRlIHwgc3RyaW5nfSBjcmVhdGVkX2F0IC0gQ3JlYXRpb24gdGltZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEVudHJ5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpZGVtcG90ZW5jeV9rZXkgLSBNdXRhdGlvbiBpZGVtcG90ZW5jeSBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBGcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcGF5bG9hZF9qc29uIC0gTXV0YXRpb24gcGF5bG9hZCBKU09OLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZWNvcmRfaWQgLSBSZWNvcmQgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlc3BvbnNlX2pzb24gLSBSZXNwb25zZSBKU09OLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBzY29wZV9qc29uIC0gU2NvcGUgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nfSBzZXJ2ZXJfc2VxdWVuY2UgLSBTZXJ2ZXIgc2VxdWVuY2UuXG4gKi9cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Serializes a JSON-compatible value with recursively sorted object keys, so
3
+ * equal values always produce byte-identical strings (used for sync scope and
4
+ * change-feed identity comparisons).
5
+ * @param {?} value - JSON-compatible value.
6
+ * @returns {string} - Stable JSON string.
7
+ */
8
+ export default function stableJsonStringify(value: unknown): string;
9
+ //# sourceMappingURL=stable-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stable-json.d.ts","sourceRoot":"","sources":["../../../src/sync/stable-json.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,mDAHW,OAAC,GACC,MAAM,CAIlB"}
@@ -0,0 +1,27 @@
1
+ // @ts-check
2
+ /**
3
+ * Serializes a JSON-compatible value with recursively sorted object keys, so
4
+ * equal values always produce byte-identical strings (used for sync scope and
5
+ * change-feed identity comparisons).
6
+ * @param {?} value - JSON-compatible value.
7
+ * @returns {string} - Stable JSON string.
8
+ */
9
+ export default function stableJsonStringify(value) {
10
+ return JSON.stringify(stableJsonValue(value));
11
+ }
12
+ /**
13
+ * Produces a recursively key-sorted JSON value.
14
+ * @param {?} value - JSON-compatible value.
15
+ * @returns {?} - Stable JSON-compatible value.
16
+ */
17
+ function stableJsonValue(value) {
18
+ if (Array.isArray(value))
19
+ return value.map((item) => stableJsonValue(item));
20
+ if (!value || typeof value !== "object")
21
+ return value;
22
+ return Object.keys(value).sort().reduce((memo, key) => {
23
+ memo[key] = stableJsonValue(value[key]);
24
+ return memo;
25
+ }, /** @type {Record<string, ?>} */ ({}));
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhYmxlLWpzb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zdGFibGUtanNvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxtQkFBbUIsQ0FBQyxLQUFLO0lBQy9DLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUMvQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQUs7SUFDNUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDM0UsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFckQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBRXZDLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQyxFQUFFLGdDQUFnQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogU2VyaWFsaXplcyBhIEpTT04tY29tcGF0aWJsZSB2YWx1ZSB3aXRoIHJlY3Vyc2l2ZWx5IHNvcnRlZCBvYmplY3Qga2V5cywgc29cbiAqIGVxdWFsIHZhbHVlcyBhbHdheXMgcHJvZHVjZSBieXRlLWlkZW50aWNhbCBzdHJpbmdzICh1c2VkIGZvciBzeW5jIHNjb3BlIGFuZFxuICogY2hhbmdlLWZlZWQgaWRlbnRpdHkgY29tcGFyaXNvbnMpLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RhYmxlIEpTT04gc3RyaW5nLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdGFibGVKc29uU3RyaW5naWZ5KHZhbHVlKSB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzdGFibGVKc29uVmFsdWUodmFsdWUpKVxufVxuXG4vKipcbiAqIFByb2R1Y2VzIGEgcmVjdXJzaXZlbHkga2V5LXNvcnRlZCBKU09OIHZhbHVlLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHs/fSAtIFN0YWJsZSBKU09OLWNvbXBhdGlibGUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZUpzb25WYWx1ZSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHN0YWJsZUpzb25WYWx1ZShpdGVtKSlcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiB2YWx1ZVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLnJlZHVjZSgobWVtbywga2V5KSA9PiB7XG4gICAgbWVtb1trZXldID0gc3RhYmxlSnNvblZhbHVlKHZhbHVlW2tleV0pXG5cbiAgICByZXR1cm4gbWVtb1xuICB9LCAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAoe30pKVxufVxuIl19
@@ -13,6 +13,56 @@
13
13
  * persistence/auth hooks.
14
14
  */
15
15
  export default class SyncApiClient {
16
+ /**
17
+ * Serializes sync work with the same key so callers do not have to keep app-local locks.
18
+ * @param {string} key - Lock key.
19
+ * @param {() => Promise<void>} callback - Work to run once previous work finished.
20
+ * @returns {Promise<void>}
21
+ */
22
+ static singleFlight(key: string, callback: () => Promise<void>): Promise<void>;
23
+ /**
24
+ * Pulls backend sync changes with a framework-managed cursor row.
25
+ * @param {object} args - Pull args.
26
+ * @param {string} args.authenticationToken - Auth token to send with change requests.
27
+ * @param {number} [args.batchSize] - Max syncs per request.
28
+ * @param {?} args.cursorModel - Model that responds to findBy/findOrInitializeBy for cursor persistence.
29
+ * @param {string} args.cursorKey - Cursor option key.
30
+ * @param {(payload: SyncChangesRequest) => Promise<SyncChangesResponse>} args.postChanges - Posts one changes request.
31
+ * @param {Record<string, SyncResourceConfig>} args.resources - Resource policies.
32
+ * @param {(progress: {pages: number, syncedCount: number}) => void} [args.onProgress] - Progress callback.
33
+ * @returns {Promise<SyncChangesResult>} Pull result.
34
+ */
35
+ static pullChangesWithCursor(args: {
36
+ authenticationToken: string;
37
+ batchSize?: number | undefined;
38
+ cursorModel: unknown;
39
+ cursorKey: string;
40
+ postChanges: (payload: SyncChangesRequest) => Promise<SyncChangesResponse>;
41
+ resources: Record<string, SyncResourceConfig>;
42
+ onProgress?: ((progress: {
43
+ pages: number;
44
+ syncedCount: number;
45
+ }) => void) | undefined;
46
+ }): Promise<SyncChangesResult>;
47
+ /**
48
+ * Loads a persisted sync cursor from a model row with a value column.
49
+ * @param {{cursorKey: string, cursorModel: ?}} args - Cursor args.
50
+ * @returns {Promise<string | null>} Persisted cursor payload.
51
+ */
52
+ static loadSyncCursor({ cursorKey, cursorModel }: {
53
+ cursorKey: string;
54
+ cursorModel: unknown;
55
+ }): Promise<string | null>;
56
+ /**
57
+ * Saves a persisted sync cursor to a model row with a value column.
58
+ * @param {{cursor: SyncCursor, cursorKey: string, cursorModel: ?}} args - Cursor args.
59
+ * @returns {Promise<void>}
60
+ */
61
+ static saveSyncCursor({ cursor, cursorKey, cursorModel }: {
62
+ cursor: SyncCursor;
63
+ cursorKey: string;
64
+ cursorModel: unknown;
65
+ }): Promise<void>;
16
66
  /**
17
67
  * Pulls backend sync changes in stable pages, applies them locally, and stores
18
68
  * the acknowledged cursor. Apps provide only auth, persistence, transport, and
@@ -90,26 +140,29 @@ export default class SyncApiClient {
90
140
  * mechanics stay here; apps only declare which models/attributes/hooks are
91
141
  * allowed for each resource type.
92
142
  * @param {Record<string, SyncResourceConfig>} resources - Resource policy map.
143
+ * @param {(record: ?) => () => void} [onRecord] - Called with each record about to be written; returns a release callback invoked after the write (used for echo suppression).
93
144
  * @returns {(sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>} Sync apply callback.
94
145
  */
95
- static resourceApplier(resources: Record<string, SyncResourceConfig>): (sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>;
146
+ static resourceApplier(resources: Record<string, SyncResourceConfig>, onRecord?: (record: unknown) => () => void): (sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>;
96
147
  /**
97
148
  * Applies one sync row using declarative resource policy.
98
- * @param {{resources: Record<string, SyncResourceConfig>, sync: SyncChangeEnvelope}} args - Apply args.
149
+ * @param {{resources: Record<string, SyncResourceConfig>, sync: SyncChangeEnvelope, onRecord?: (record: ?) => () => void}} args - Apply args.
99
150
  * @returns {Promise<SyncChangeApplyResult>} Apply result.
100
151
  */
101
- static applyResourceSync({ resources, sync }: {
152
+ static applyResourceSync({ onRecord, resources, sync }: {
102
153
  resources: Record<string, SyncResourceConfig>;
103
154
  sync: SyncChangeEnvelope;
155
+ onRecord?: (record: unknown) => () => void;
104
156
  }): Promise<SyncChangeApplyResult>;
105
157
  /**
106
158
  * Destroys a synced resource via its declared model policy.
107
- * @param {{resource: SyncResourceConfig, sync: SyncChangeEnvelope}} args - Destroy args.
159
+ * @param {{resource: SyncResourceConfig, sync: SyncChangeEnvelope, onRecord?: (record: ?) => () => void}} args - Destroy args.
108
160
  * @returns {Promise<boolean>} Whether a local row was destroyed.
109
161
  */
110
- static destroySyncedResource({ resource, sync }: {
162
+ static destroySyncedResource({ onRecord, resource, sync }: {
111
163
  resource: SyncResourceConfig;
112
164
  sync: SyncChangeEnvelope;
165
+ onRecord?: (record: unknown) => () => void;
113
166
  }): Promise<boolean>;
114
167
  /**
115
168
  * Parses the embedded sync data JSON/object.
@@ -117,6 +170,133 @@ export default class SyncApiClient {
117
170
  * @returns {Record<string, unknown>} Sync data object.
118
171
  */
119
172
  static syncData(sync: SyncChangeEnvelope): Record<string, unknown>;
173
+ /**
174
+ * Drains pending sync records from a local Velocious model in stable order.
175
+ * @param {object} args - Replay args.
176
+ * @param {string} args.authenticationToken - Auth token to send with replay requests.
177
+ * @param {number} [args.batchSize] - Max syncs per request.
178
+ * @param {?} args.syncModel - Local Sync model class.
179
+ * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ?>>}) => Promise<SyncReplayResponse>} args.postReplay - Replay poster.
180
+ * @returns {Promise<void>}
181
+ */
182
+ static replayLocalSyncs(args: {
183
+ authenticationToken: string;
184
+ batchSize?: number | undefined;
185
+ syncModel: unknown;
186
+ postReplay: (payload: {
187
+ authenticationToken: string;
188
+ syncs: Array<Record<string, unknown>>;
189
+ }) => Promise<SyncReplayResponse>;
190
+ }): Promise<void>;
191
+ /**
192
+ * Serializes the replay-relevant state of a local sync row for in-flight comparisons.
193
+ * @param {?} sync - Local sync row.
194
+ * @returns {string} Stable snapshot of the row's replayed payload.
195
+ */
196
+ static localSyncReplaySnapshot(sync: unknown): string;
197
+ /**
198
+ * Builds one replay envelope from a local sync row.
199
+ * @param {?} sync - Local sync row.
200
+ * @returns {{clientUpdatedAt?: string, data: Record<string, unknown>, id: number, resourceId: string, resourceType: string, syncType: string}} Sync replay envelope.
201
+ */
202
+ static localSyncPayload(sync: unknown): {
203
+ clientUpdatedAt?: string;
204
+ data: Record<string, unknown>;
205
+ id: number;
206
+ resourceId: string;
207
+ resourceType: string;
208
+ syncType: string;
209
+ };
210
+ /**
211
+ * Resolves one local sync row payload, falling back to preloaded resource attributes.
212
+ * @param {?} sync - Local sync row.
213
+ * @returns {Record<string, unknown>} Sync data.
214
+ */
215
+ static localSyncData(sync: unknown): Record<string, unknown>;
216
+ /**
217
+ * Queues a local sync row for a Velocious model resource.
218
+ * @param {object} args - Queue args.
219
+ * @param {?} args.resource - Resource being synced.
220
+ * @param {?} args.syncModel - Local Sync model class.
221
+ * @param {Record<string, unknown>} [args.data] - Explicit sync data.
222
+ * @param {string} [args.syncType] - Sync operation type.
223
+ * @param {string[]} [args.localOnlyAttributes] - Attributes to strip from queued payloads.
224
+ * @param {string[]} [args.booleanAttributes] - Attributes to coerce through sync boolean parsing.
225
+ * @param {(data: Record<string, unknown>) => Record<string, unknown>} [args.normalizeData] - App-specific data normalizer.
226
+ * @returns {Promise<?>} Local sync row.
227
+ */
228
+ static queueLocalSync(args: {
229
+ resource: unknown;
230
+ syncModel: unknown;
231
+ data?: Record<string, unknown> | undefined;
232
+ syncType?: string | undefined;
233
+ localOnlyAttributes?: string[] | undefined;
234
+ booleanAttributes?: string[] | undefined;
235
+ normalizeData?: ((data: Record<string, unknown>) => Record<string, unknown>) | undefined;
236
+ }): Promise<unknown>;
237
+ /**
238
+ * Builds backend-safe queued sync data without mutating caller data.
239
+ * @param {{resource: ?, data?: Record<string, unknown>, localOnlyAttributes?: string[], booleanAttributes?: string[], normalizeData?: (data: Record<string, unknown>) => Record<string, unknown>}} args - Data args.
240
+ * @returns {Record<string, unknown>} Queued data.
241
+ */
242
+ static queuedSyncData(args: {
243
+ resource: unknown;
244
+ data?: Record<string, unknown>;
245
+ localOnlyAttributes?: string[];
246
+ booleanAttributes?: string[];
247
+ normalizeData?: (data: Record<string, unknown>) => Record<string, unknown>;
248
+ }): Record<string, unknown>;
249
+ /**
250
+ * Builds a small app-facing local sync queue facade from declarative model config.
251
+ * @param {object} args - Queue config.
252
+ * @param {?} args.syncModel - Local Sync model class.
253
+ * @param {string} args.singleFlightKey - Key used to serialize backend replay.
254
+ * @param {() => Promise<void>} args.syncPending - Backend replay callback.
255
+ * @param {(resource: ?) => string[]} [args.localOnlyAttributes] - Resource-specific local-only attributes.
256
+ * @param {(resource: ?) => string[]} [args.booleanAttributes] - Resource-specific SQLite boolean attributes.
257
+ * @returns {{queue: (queueArgs: {resource: ?, data?: Record<string, unknown>, syncType?: string}) => Promise<?>, syncPending: () => Promise<void>}} Configured local sync queue.
258
+ */
259
+ static localSyncQueue(args: {
260
+ syncModel: unknown;
261
+ singleFlightKey: string;
262
+ syncPending: () => Promise<void>;
263
+ localOnlyAttributes?: ((resource: unknown) => string[]) | undefined;
264
+ booleanAttributes?: ((resource: unknown) => string[]) | undefined;
265
+ }): {
266
+ queue: (queueArgs: {
267
+ resource: unknown;
268
+ data?: Record<string, unknown>;
269
+ syncType?: string;
270
+ }) => Promise<unknown>;
271
+ syncPending: () => Promise<void>;
272
+ };
273
+ /**
274
+ * Parses booleans commonly used by SQLite/offline sync payloads.
275
+ * @param {unknown} value - Sync decision value.
276
+ * @param {string} [description] - Error context.
277
+ * @returns {boolean | null} Parsed boolean-like backend/local value.
278
+ */
279
+ static optionalBooleanSyncValue(value: unknown, description?: string): boolean | null;
280
+ /**
281
+ * Converts a boolean sync value to SQLite boolean storage.
282
+ * @param {boolean | null} value - Sync boolean value.
283
+ * @returns {0 | 1} SQLite-compatible boolean value.
284
+ */
285
+ static sqliteBooleanSyncValue(value: boolean | null): 0 | 1;
286
+ /**
287
+ * Projects generic sync counters into app-specific result keys.
288
+ * @param {object} args - Result args.
289
+ * @param {SyncChangesResult} args.result - Generic Velocious sync result.
290
+ * @param {Record<string, {changedKey: string, countKey: string}>} args.resources - Resource result key map.
291
+ * @returns {Record<string, unknown>} Projected result.
292
+ */
293
+ static syncResultForResources({ result, resources }: {
294
+ result: SyncChangesResult;
295
+ resources: Record<string, {
296
+ changedKey: string;
297
+ countKey: string;
298
+ }>;
299
+ }): Record<string, unknown>;
120
300
  /**
121
301
  * Drains pending sync records in stable order and marks acknowledged rows.
122
302
  * @param {object} args - Replay args.
@@ -1 +1 @@
1
- {"version":3,"file":"sync-api-client.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-api-client.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-api-client.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-api-client.js"],"names":[],"mappings":"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"}