velocious 1.0.563 → 1.0.564

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 (211) hide show
  1. package/README.md +2 -0
  2. package/build/background-jobs/cron-expression.js +12 -13
  3. package/build/background-jobs/main.js +6 -6
  4. package/build/background-jobs/runner-graceful-shutdown.js +2 -3
  5. package/build/background-jobs/scheduler.js +3 -3
  6. package/build/background-jobs/worker.js +8 -9
  7. package/build/beacon/client.js +3 -4
  8. package/build/database/drivers/sqlite/web-persistence.js +2 -5
  9. package/build/database/pool/async-tracked-multi-connection.js +65 -15
  10. package/build/database/pool/base.js +23 -7
  11. package/build/database/query/index.js +21 -22
  12. package/build/database/query/model-class-query.js +5 -6
  13. package/build/database/record/attachments/normalize-input.js +9 -10
  14. package/build/database/record/attachments/store.js +2 -2
  15. package/build/database/record/auditing.js +7 -8
  16. package/build/database/record/index.js +4 -5
  17. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
  18. package/build/frontend-model-controller.js +49 -56
  19. package/build/frontend-models/base.js +17 -19
  20. package/build/frontend-models/outgoing-event-buffer.js +3 -4
  21. package/build/frontend-models/query.js +40 -44
  22. package/build/frontend-models/resource-definition.js +7 -8
  23. package/build/frontend-models/transport-serialization.js +10 -12
  24. package/build/frontend-models/websocket-channel.js +12 -13
  25. package/build/http-server/client/websocket-session.js +4 -5
  26. package/build/http-server/client-delivery-queue.js +7 -8
  27. package/build/http-server/websocket-event-log-store.js +4 -6
  28. package/build/plugins/sqljs-wasm-route.js +3 -5
  29. package/build/src/background-jobs/cron-expression.d.ts +0 -12
  30. package/build/src/background-jobs/cron-expression.d.ts.map +1 -1
  31. package/build/src/background-jobs/cron-expression.js +13 -13
  32. package/build/src/background-jobs/main.d.ts.map +1 -1
  33. package/build/src/background-jobs/main.js +7 -7
  34. package/build/src/background-jobs/runner-graceful-shutdown.d.ts +0 -6
  35. package/build/src/background-jobs/runner-graceful-shutdown.d.ts.map +1 -1
  36. package/build/src/background-jobs/runner-graceful-shutdown.js +3 -3
  37. package/build/src/background-jobs/scheduler.d.ts +0 -3
  38. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  39. package/build/src/background-jobs/scheduler.js +4 -4
  40. package/build/src/background-jobs/worker.d.ts +0 -8
  41. package/build/src/background-jobs/worker.d.ts.map +1 -1
  42. package/build/src/background-jobs/worker.js +9 -9
  43. package/build/src/beacon/client.d.ts +0 -4
  44. package/build/src/beacon/client.d.ts.map +1 -1
  45. package/build/src/beacon/client.js +4 -4
  46. package/build/src/database/drivers/sqlite/web-persistence.d.ts +0 -14
  47. package/build/src/database/drivers/sqlite/web-persistence.d.ts.map +1 -1
  48. package/build/src/database/drivers/sqlite/web-persistence.js +3 -3
  49. package/build/src/database/pool/async-tracked-multi-connection.d.ts +29 -1
  50. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  51. package/build/src/database/pool/async-tracked-multi-connection.js +57 -15
  52. package/build/src/database/pool/base.d.ts +53 -4
  53. package/build/src/database/pool/base.d.ts.map +1 -1
  54. package/build/src/database/pool/base.js +23 -6
  55. package/build/src/database/query/index.d.ts +18 -39
  56. package/build/src/database/query/index.d.ts.map +1 -1
  57. package/build/src/database/query/index.js +22 -22
  58. package/build/src/database/query/model-class-query.d.ts +0 -5
  59. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  60. package/build/src/database/query/model-class-query.js +6 -6
  61. package/build/src/database/record/attachments/normalize-input.d.ts +0 -9
  62. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  63. package/build/src/database/record/attachments/normalize-input.js +10 -10
  64. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  65. package/build/src/database/record/attachments/store.js +2 -2
  66. package/build/src/database/record/auditing.d.ts +17 -24
  67. package/build/src/database/record/auditing.d.ts.map +1 -1
  68. package/build/src/database/record/auditing.js +8 -8
  69. package/build/src/database/record/index.d.ts +4 -4
  70. package/build/src/database/record/index.d.ts.map +1 -1
  71. package/build/src/database/record/index.js +5 -5
  72. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +0 -39
  73. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  74. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +2 -2
  75. package/build/src/frontend-model-controller.d.ts +1 -1
  76. package/build/src/frontend-model-controller.d.ts.map +1 -1
  77. package/build/src/frontend-model-controller.js +50 -50
  78. package/build/src/frontend-models/base.d.ts.map +1 -1
  79. package/build/src/frontend-models/base.js +18 -18
  80. package/build/src/frontend-models/outgoing-event-buffer.d.ts.map +1 -1
  81. package/build/src/frontend-models/outgoing-event-buffer.js +3 -3
  82. package/build/src/frontend-models/query.d.ts +56 -37
  83. package/build/src/frontend-models/query.d.ts.map +1 -1
  84. package/build/src/frontend-models/query.js +39 -39
  85. package/build/src/frontend-models/resource-definition.d.ts +0 -7
  86. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  87. package/build/src/frontend-models/resource-definition.js +8 -8
  88. package/build/src/frontend-models/transport-serialization.d.ts +0 -10
  89. package/build/src/frontend-models/transport-serialization.d.ts.map +1 -1
  90. package/build/src/frontend-models/transport-serialization.js +11 -11
  91. package/build/src/frontend-models/websocket-channel.d.ts +0 -12
  92. package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
  93. package/build/src/frontend-models/websocket-channel.js +13 -13
  94. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  95. package/build/src/http-server/client/websocket-session.js +5 -5
  96. package/build/src/http-server/client-delivery-queue.d.ts +7 -7
  97. package/build/src/http-server/client-delivery-queue.d.ts.map +1 -1
  98. package/build/src/http-server/client-delivery-queue.js +8 -8
  99. package/build/src/http-server/websocket-event-log-store.d.ts +0 -14
  100. package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
  101. package/build/src/http-server/websocket-event-log-store.js +5 -5
  102. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  103. package/build/src/plugins/sqljs-wasm-route.js +4 -4
  104. package/build/src/sync/conflict-strategy.d.ts +0 -15
  105. package/build/src/sync/conflict-strategy.d.ts.map +1 -1
  106. package/build/src/sync/conflict-strategy.js +3 -3
  107. package/build/src/sync/device-identity.d.ts +0 -45
  108. package/build/src/sync/device-identity.d.ts.map +1 -1
  109. package/build/src/sync/device-identity.js +4 -4
  110. package/build/src/sync/local-mutation-log.d.ts +0 -41
  111. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  112. package/build/src/sync/local-mutation-log.js +9 -9
  113. package/build/src/sync/offline-grant.d.ts +0 -26
  114. package/build/src/sync/offline-grant.d.ts.map +1 -1
  115. package/build/src/sync/offline-grant.js +4 -4
  116. package/build/src/sync/peer-mutation-bundle.d.ts +0 -14
  117. package/build/src/sync/peer-mutation-bundle.d.ts.map +1 -1
  118. package/build/src/sync/peer-mutation-bundle.js +3 -3
  119. package/build/src/sync/server-change-feed.d.ts.map +1 -1
  120. package/build/src/sync/server-change-feed.js +33 -33
  121. package/build/src/sync/sync-api-client.d.ts +0 -9
  122. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  123. package/build/src/sync/sync-api-client.js +2 -2
  124. package/build/src/sync/sync-envelope-replay-service.d.ts +38 -21
  125. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  126. package/build/src/sync/sync-envelope-replay-service.js +18 -18
  127. package/build/src/sync/sync-resource-base.d.ts +0 -7
  128. package/build/src/sync/sync-resource-base.d.ts.map +1 -1
  129. package/build/src/sync/sync-resource-base.js +2 -2
  130. package/build/src/sync/sync-scope-store.d.ts +0 -9
  131. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  132. package/build/src/sync/sync-scope-store.js +10 -10
  133. package/build/src/testing/test-filter-parser.d.ts +0 -10
  134. package/build/src/testing/test-filter-parser.d.ts.map +1 -1
  135. package/build/src/testing/test-filter-parser.js +11 -11
  136. package/build/src/testing/test-runner.d.ts +25 -91
  137. package/build/src/testing/test-runner.d.ts.map +1 -1
  138. package/build/src/testing/test-runner.js +113 -98
  139. package/build/src/testing/test.d.ts +8 -0
  140. package/build/src/testing/test.d.ts.map +1 -1
  141. package/build/src/testing/test.js +9 -9
  142. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  143. package/build/src/utils/backtrace-cleaner.js +9 -9
  144. package/build/src/utils/model-scope.d.ts +0 -8
  145. package/build/src/utils/model-scope.d.ts.map +1 -1
  146. package/build/src/utils/model-scope.js +3 -3
  147. package/build/src/utils/ransack.d.ts +52 -19
  148. package/build/src/utils/ransack.d.ts.map +1 -1
  149. package/build/src/utils/ransack.js +26 -26
  150. package/build/sync/conflict-strategy.js +3 -6
  151. package/build/sync/device-identity.js +4 -9
  152. package/build/sync/local-mutation-log.js +9 -14
  153. package/build/sync/offline-grant.js +4 -7
  154. package/build/sync/peer-mutation-bundle.js +2 -4
  155. package/build/sync/server-change-feed.js +32 -34
  156. package/build/sync/sync-api-client.js +1 -2
  157. package/build/sync/sync-envelope-replay-service.js +17 -19
  158. package/build/sync/sync-resource-base.js +1 -2
  159. package/build/sync/sync-scope-store.js +9 -10
  160. package/build/testing/test-filter-parser.js +10 -11
  161. package/build/testing/test-runner.js +116 -108
  162. package/build/testing/test.js +8 -9
  163. package/build/utils/backtrace-cleaner.js +8 -9
  164. package/build/utils/model-scope.js +3 -4
  165. package/build/utils/ransack.js +27 -34
  166. package/package.json +2 -1
  167. package/scripts/eslint-rules/typedefs-first.js +67 -0
  168. package/scripts/prewarm-chromedriver.js +26 -0
  169. package/src/background-jobs/cron-expression.js +12 -13
  170. package/src/background-jobs/main.js +6 -6
  171. package/src/background-jobs/runner-graceful-shutdown.js +2 -3
  172. package/src/background-jobs/scheduler.js +3 -3
  173. package/src/background-jobs/worker.js +8 -9
  174. package/src/beacon/client.js +3 -4
  175. package/src/database/drivers/sqlite/web-persistence.js +2 -5
  176. package/src/database/pool/async-tracked-multi-connection.js +65 -15
  177. package/src/database/pool/base.js +23 -7
  178. package/src/database/query/index.js +21 -22
  179. package/src/database/query/model-class-query.js +5 -6
  180. package/src/database/record/attachments/normalize-input.js +9 -10
  181. package/src/database/record/attachments/store.js +2 -2
  182. package/src/database/record/auditing.js +7 -8
  183. package/src/database/record/index.js +4 -5
  184. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +1 -2
  185. package/src/frontend-model-controller.js +49 -56
  186. package/src/frontend-models/base.js +17 -19
  187. package/src/frontend-models/outgoing-event-buffer.js +3 -4
  188. package/src/frontend-models/query.js +40 -44
  189. package/src/frontend-models/resource-definition.js +7 -8
  190. package/src/frontend-models/transport-serialization.js +10 -12
  191. package/src/frontend-models/websocket-channel.js +12 -13
  192. package/src/http-server/client/websocket-session.js +4 -5
  193. package/src/http-server/client-delivery-queue.js +7 -8
  194. package/src/http-server/websocket-event-log-store.js +4 -6
  195. package/src/plugins/sqljs-wasm-route.js +3 -5
  196. package/src/sync/conflict-strategy.js +3 -6
  197. package/src/sync/device-identity.js +4 -9
  198. package/src/sync/local-mutation-log.js +9 -14
  199. package/src/sync/offline-grant.js +4 -7
  200. package/src/sync/peer-mutation-bundle.js +2 -4
  201. package/src/sync/server-change-feed.js +32 -34
  202. package/src/sync/sync-api-client.js +1 -2
  203. package/src/sync/sync-envelope-replay-service.js +17 -19
  204. package/src/sync/sync-resource-base.js +1 -2
  205. package/src/sync/sync-scope-store.js +9 -10
  206. package/src/testing/test-filter-parser.js +10 -11
  207. package/src/testing/test-runner.js +116 -108
  208. package/src/testing/test.js +8 -9
  209. package/src/utils/backtrace-cleaner.js +8 -9
  210. package/src/utils/model-scope.js +3 -4
  211. package/src/utils/ransack.js +27 -34
@@ -1,6 +1,3 @@
1
- // @ts-check
2
- const OFFLINE_GRANT_SIGNATURE_ALGORITHM = "HS256";
3
- const OFFLINE_GRANT_SIGNATURE_PREFIX = "hmac-sha256-";
4
1
  /**
5
2
  * Signed offline grant envelope.
6
3
  * @typedef {object} SignedOfflineGrant
@@ -27,6 +24,9 @@ const OFFLINE_GRANT_SIGNATURE_PREFIX = "hmac-sha256-";
27
24
  * @property {string} id - Public key id included in signed grant envelopes.
28
25
  * @property {string} secret - Private HMAC secret. Never expose this to clients.
29
26
  */
27
+ // @ts-check
28
+ const OFFLINE_GRANT_SIGNATURE_ALGORITHM = "HS256";
29
+ const OFFLINE_GRANT_SIGNATURE_PREFIX = "hmac-sha256-";
30
30
  /**
31
31
  * Creates a signed offline grant envelope.
32
32
  * @param {object} args - Arguments.
@@ -289,4 +289,4 @@ function deterministicJson({ label, value }) {
289
289
  }
290
290
  throw new Error(`Offline grant ${label} must be deterministic JSON`);
291
291
  }
292
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZS1ncmFudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL29mZmxpbmUtZ3JhbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE1BQU0saUNBQWlDLEdBQUcsT0FBTyxDQUFBO0FBQ2pELE1BQU0sOEJBQThCLEdBQUcsY0FBYyxDQUFBO0FBRXJEOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7OztHQVVHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUM7SUFDMUQsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEQsTUFBTSxvQkFBb0IsR0FBRywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN4RSxNQUFNLGNBQWMsR0FBRywwQkFBMEIsQ0FBQztRQUNoRCxTQUFTLEVBQUUsaUNBQWlDO1FBQzVDLEtBQUssRUFBRSxlQUFlO1FBQ3RCLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO0tBQy9CLENBQUMsQ0FBQTtJQUVGLE9BQU87UUFDTCxTQUFTLEVBQUUsaUNBQWlDO1FBQzVDLEtBQUssRUFBRSxlQUFlO1FBQ3RCLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO1FBQzlCLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQyxFQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sRUFBQyxDQUFDO0tBQy9GLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsRUFBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFDO0lBQ25GLE1BQU0scUJBQXFCLEdBQUcsMkJBQTJCLENBQUMsV0FB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QUFJLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbkcsQ0FBQztJQUVELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1Riw2RkFBNkY7UUFDN0YsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBRXJCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sVUFBVSxHQUFHLHNDQUFzQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFdEUsSUFBSSxVQUFVLEtBQUssU0FBUztnQkFBRSxTQUFRO1lBQ3RDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtRQUNwRixDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssNkJBQTZCLENBQUMsQ0FBQTtBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmNvbnN0IE9GRkxJTkVfR1JBTlRfU0lHTkFUVVJFX0FMR09SSVRITSA9IFwiSFMyNTZcIlxuY29uc3QgT0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfUFJFRklYID0gXCJobWFjLXNoYTI1Ni1cIlxuXG4vKipcbiAqIFNpZ25lZCBvZmZsaW5lIGdyYW50IGVudmVsb3BlLlxuICogQHR5cGVkZWYge29iamVjdH0gU2lnbmVkT2ZmbGluZUdyYW50XG4gKiBAcHJvcGVydHkge1wiSFMyNTZcIn0gYWxnb3JpdGhtIC0gU2lnbmF0dXJlIGFsZ29yaXRobS5cbiAqIEBwcm9wZXJ0eSB7T2ZmbGluZUdyYW50fSBncmFudCAtIFNpZ25lZCBncmFudCBwYXlsb2FkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleUlkIC0gU2lnbmluZyBrZXkgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2lnbmF0dXJlIC0gSGV4IEhNQUMgc2lnbmF0dXJlIHdpdGggYSBobWFjLXNoYTI1NiBwcmVmaXguXG4gKi9cblxuLyoqXG4gKiBCYWNrZW5kLWlzc3VlZCBvZmZsaW5lIGdyYW50IHBheWxvYWQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZsaW5lR3JhbnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXZpY2VJZCAtIERldmljZSBpZCBhbGxvd2VkIHRvIHVzZSB0aGUgZ3JhbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhwaXJlc0F0IC0gSVNPIHRpbWVzdGFtcCBhZnRlciB3aGljaCByZXBsYXkgbXVzdCByZWplY3QgdGhlIGdyYW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGdyYW50SWQgLSBTdGFibGUgZ3JhbnQgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaXNzdWVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIGJhY2tlbmQgaXNzdWVkIHRoZSBncmFudC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IHJlc291cmNlcyAtIFN5bmMgbWFuaWZlc3QvbWF0ZXJpYWxpemVkIHJlc291cmNlIG1ldGFkYXRhLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gc2NvcGVzIC0gTWF0ZXJpYWxpemVkIGdyYW50IHNjb3Blcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1c2VySWQgLSBBY3RvciB1c2VyIGlkIGFsbG93ZWQgdG8gdXNlIHRoZSBncmFudC5cbiAqL1xuXG4vKipcbiAqIE9mZmxpbmUgZ3JhbnQgc2lnbmluZyBrZXkuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZsaW5lR3JhbnRTaWduaW5nS2V5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjdXJyZW50XSAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgYWN0aXZlIGtleSBmb3IgbmV3IGdyYW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFB1YmxpYyBrZXkgaWQgaW5jbHVkZWQgaW4gc2lnbmVkIGdyYW50IGVudmVsb3Blcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWNyZXQgLSBQcml2YXRlIEhNQUMgc2VjcmV0LiBOZXZlciBleHBvc2UgdGhpcyB0byBjbGllbnRzLlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpZ25lZCBvZmZsaW5lIGdyYW50IGVudmVsb3BlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge09mZmxpbmVHcmFudH0gYXJncy5ncmFudCAtIEdyYW50IHBheWxvYWQuXG4gKiBAcGFyYW0ge09mZmxpbmVHcmFudFNpZ25pbmdLZXl9IGFyZ3Muc2lnbmluZ0tleSAtIEN1cnJlbnQgc2lnbmluZyBrZXkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRPZmZsaW5lR3JhbnQ+fSAtIFNpZ25lZCBncmFudCBlbnZlbG9wZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU9mZmxpbmVHcmFudCh7Z3JhbnQsIHNpZ25pbmdLZXl9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRHcmFudCA9IG5vcm1hbGl6ZU9mZmxpbmVHcmFudChncmFudClcbiAgY29uc3Qgbm9ybWFsaXplZFNpZ25pbmdLZXkgPSBub3JtYWxpemVPZmZsaW5lR3JhbnRTaWduaW5nS2V5KHNpZ25pbmdLZXkpXG4gIGNvbnN0IHNpZ25hdHVyZUlucHV0ID0gb2ZmbGluZUdyYW50U2lnbmF0dXJlSW5wdXQoe1xuICAgIGFsZ29yaXRobTogT0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfQUxHT1JJVEhNLFxuICAgIGdyYW50OiBub3JtYWxpemVkR3JhbnQsXG4gICAga2V5SWQ6IG5vcm1hbGl6ZWRTaWduaW5nS2V5LmlkXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IE9GRkxJTkVfR1JBTlRfU0lHTkFUVVJFX0FMR09SSVRITSxcbiAgICBncmFudDogbm9ybWFsaXplZEdyYW50LFxuICAgIGtleUlkOiBub3JtYWxpemVkU2lnbmluZ0tleS5pZCxcbiAgICBzaWduYXR1cmU6IGF3YWl0IGhtYWNTaGEyNTZIZXgoe21lc3NhZ2U6IHNpZ25hdHVyZUlucHV0LCBzZWNyZXQ6IG5vcm1hbGl6ZWRTaWduaW5nS2V5LnNlY3JldH0pXG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBhIHNpZ25lZCBvZmZsaW5lIGdyYW50IGFuZCByZXR1cm5zIHRoZSB0cnVzdGVkIGdyYW50IHBheWxvYWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Mubm93XSAtIFZlcmlmaWNhdGlvbiB0aW1lLiBEZWZhdWx0cyB0byBjdXJyZW50IHRpbWUuXG4gKiBAcGFyYW0ge1NpZ25lZE9mZmxpbmVHcmFudH0gYXJncy5zaWduZWRHcmFudCAtIFNpZ25lZCBncmFudCBlbnZlbG9wZS5cbiAqIEBwYXJhbSB7T2ZmbGluZUdyYW50U2lnbmluZ0tleVtdfSBhcmdzLnNpZ25pbmdLZXlzIC0gQ2FuZGlkYXRlIHZlcmlmaWNhdGlvbiBrZXlzLlxuICogQHJldHVybnMge1Byb21pc2U8T2ZmbGluZUdyYW50Pn0gLSBWZXJpZmllZCBncmFudCBwYXlsb2FkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5T2ZmbGluZUdyYW50KHtub3cgPSBuZXcgRGF0ZSgpLCBzaWduZWRHcmFudCwgc2lnbmluZ0tleXN9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTaWduZWRHcmFudCA9IG5vcm1hbGl6ZVNpZ25lZE9mZmxpbmVHcmFudChzaWduZWRHcmFudClcblxuICBpZiAobm9ybWFsaXplZFNpZ25lZEdyYW50LmFsZ29yaXRobSAhPT0gT0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfQUxHT1JJVEhNKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBvZmZsaW5lIGdyYW50IHNpZ25hdHVyZSBhbGdvcml0aG0gJyR7bm9ybWFsaXplZFNpZ25lZEdyYW50LmFsZ29yaXRobX0nYClcbiAgfVxuXG4gIGNvbnN0IHNpZ25pbmdLZXkgPSBzaWduaW5nS2V5c1xuICAgIC5tYXAoKGtleSkgPT4gbm9ybWFsaXplT2ZmbGluZUdyYW50U2lnbmluZ0tleShrZXkpKVxuICAgIC5maW5kKChrZXkpID0+IGtleS5pZCA9PT0gbm9ybWFsaXplZFNpZ25lZEdyYW50LmtleUlkKVxuXG4gIGlmICghc2lnbmluZ0tleSkgdGhyb3cgbmV3IEVycm9yKGBObyBvZmZsaW5lIGdyYW50IHNpZ25pbmcga2V5IGZvciBrZXkgaWQgJyR7bm9ybWFsaXplZFNpZ25lZEdyYW50LmtleUlkfSdgKVxuXG4gIGNvbnN0IGV4cGVjdGVkU2lnbmF0dXJlID0gYXdhaXQgaG1hY1NoYTI1NkhleCh7XG4gICAgbWVzc2FnZTogb2ZmbGluZUdyYW50U2lnbmF0dXJlSW5wdXQobm9ybWFsaXplZFNpZ25lZEdyYW50KSxcbiAgICBzZWNyZXQ6IHNpZ25pbmdLZXkuc2VjcmV0XG4gIH0pXG5cbiAgaWYgKGV4cGVjdGVkU2lnbmF0dXJlICE9PSBub3JtYWxpemVkU2lnbmVkR3JhbnQuc2lnbmF0dXJlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiT2ZmbGluZSBncmFudCBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaFwiKVxuICB9XG5cbiAgaWYgKE51bWJlci5pc05hTihub3cuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBvZmZsaW5lIGdyYW50IHZlcmlmaWNhdGlvbiB0aW1lXCIpXG4gIGlmIChuZXcgRGF0ZShub3JtYWxpemVkU2lnbmVkR3JhbnQuZ3JhbnQuZXhwaXJlc0F0KS5nZXRUaW1lKCkgPD0gbm93LmdldFRpbWUoKSkgdGhyb3cgbmV3IEVycm9yKFwiT2ZmbGluZSBncmFudCBleHBpcmVkXCIpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRTaWduZWRHcmFudC5ncmFudFxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHNpZ25lZCBncmFudCBmcm9tIGJvb3RzdHJhcCByZXF1ZXN0IGlucHV0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGV2aWNlSWQgLSBEZXZpY2UgaWQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2FyZ3MuZ3JhbnRJZF0gLSBPcHRpb25hbCBkZXRlcm1pbmlzdGljIGdyYW50IGlkIGZvciB0ZXN0cy9jdXN0b20gY2FsbGVycy5cbiAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBbYXJncy5ncmFudFR0bE1zXSAtIEdyYW50IFRUTCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0ge0RhdGV9IGFyZ3Mubm93IC0gSXNzdWUgdGltZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IGFyZ3MucmVzb3VyY2VzIC0gUmVzb3VyY2Ugc3luYyBtYW5pZmVzdC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IGFyZ3Muc2NvcGVzIC0gR3JhbnQgc2NvcGVzLlxuICogQHBhcmFtIHtPZmZsaW5lR3JhbnRTaWduaW5nS2V5fSBhcmdzLnNpZ25pbmdLZXkgLSBDdXJyZW50IHNpZ25pbmcga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXNlcklkIC0gQWN0b3IgdXNlciBpZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFNpZ25lZE9mZmxpbmVHcmFudD59IC0gU2lnbmVkIGdyYW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlT2ZmbGluZUdyYW50RnJvbUJvb3RzdHJhcCh7ZGV2aWNlSWQsIGdyYW50SWQsIGdyYW50VHRsTXMsIG5vdywgcmVzb3VyY2VzLCBzY29wZXMsIHNpZ25pbmdLZXksIHVzZXJJZH0pIHtcbiAgY29uc3QgaXNzdWVkQXQgPSBpc29EYXRlU3RyaW5nKG5vdywgXCJpc3N1ZWRBdFwiKVxuICBjb25zdCB0dGxNcyA9IGdyYW50VHRsTXMgPT09IHVuZGVmaW5lZCA/IDI0ICogNjAgKiA2MCAqIDEwMDAgOiBncmFudFR0bE1zXG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHR0bE1zKSB8fCB0dGxNcyA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJPZmZsaW5lIGdyYW50IFRUTCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXCIpXG5cbiAgcmV0dXJuIGF3YWl0IGNyZWF0ZU9mZmxpbmVHcmFudCh7XG4gICAgZ3JhbnQ6IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgdHRsTXMpLnRvSVNPU3RyaW5nKCksXG4gICAgICBncmFudElkOiBncmFudElkIHx8IHJhbmRvbUdyYW50SWQoKSxcbiAgICAgIGlzc3VlZEF0LFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgc2NvcGVzLFxuICAgICAgdXNlcklkXG4gICAgfSxcbiAgICBzaWduaW5nS2V5XG4gIH0pXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBzaWduZWQgZ3JhbnQgc2lnbmF0dXJlIGlucHV0LlxuICogQHBhcmFtIHt7YWxnb3JpdGhtOiBcIkhTMjU2XCIsIGdyYW50OiBPZmZsaW5lR3JhbnQsIGtleUlkOiBzdHJpbmd9fSBzaWduZWRHcmFudCAtIEdyYW50IHNpZ25hdHVyZSBmaWVsZHMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0YWJsZSBzaWduYXR1cmUgaW5wdXQuXG4gKi9cbmZ1bmN0aW9uIG9mZmxpbmVHcmFudFNpZ25hdHVyZUlucHV0KHNpZ25lZEdyYW50KSB7XG4gIHJldHVybiBzdGFibGVKc29uU3RyaW5naWZ5KHtcbiAgICBhbGdvcml0aG06IHNpZ25lZEdyYW50LmFsZ29yaXRobSxcbiAgICBncmFudDogc2lnbmVkR3JhbnQuZ3JhbnQsXG4gICAga2V5SWQ6IHNpZ25lZEdyYW50LmtleUlkXG4gIH0pXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNpZ25lZCBvZmZsaW5lIGdyYW50IGVudmVsb3BlLlxuICogQHBhcmFtIHtTaWduZWRPZmZsaW5lR3JhbnR9IHNpZ25lZEdyYW50IC0gU2lnbmVkIGdyYW50LlxuICogQHJldHVybnMge1NpZ25lZE9mZmxpbmVHcmFudH0gLSBOb3JtYWxpemVkIHNpZ25lZCBncmFudC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2lnbmVkT2ZmbGluZUdyYW50KHNpZ25lZEdyYW50KSB7XG4gIGlmICghc2lnbmVkR3JhbnQgfHwgdHlwZW9mIHNpZ25lZEdyYW50ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2lnbmVkR3JhbnQpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzaWduZWQgb2ZmbGluZSBncmFudCBvYmplY3RcIilcbiAgaWYgKHNpZ25lZEdyYW50LmFsZ29yaXRobSAhPT0gT0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfQUxHT1JJVEhNKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG9mZmxpbmUgZ3JhbnQgc2lnbmF0dXJlIGFsZ29yaXRobSAnJHtTdHJpbmcoc2lnbmVkR3JhbnQuYWxnb3JpdGhtKX0nYClcbiAgaWYgKHR5cGVvZiBzaWduZWRHcmFudC5rZXlJZCAhPT0gXCJzdHJpbmdcIiB8fCBzaWduZWRHcmFudC5rZXlJZC5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBvZmZsaW5lIGdyYW50IGtleSBpZFwiKVxuICBpZiAodHlwZW9mIHNpZ25lZEdyYW50LnNpZ25hdHVyZSAhPT0gXCJzdHJpbmdcIiB8fCAhc2lnbmVkR3JhbnQuc2lnbmF0dXJlLm1hdGNoKC9eaG1hYy1zaGEyNTYtW2EtZjAtOV17NjR9JC8pKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBvZmZsaW5lIGdyYW50IHNpZ25hdHVyZVwiKVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBzaWduZWRHcmFudC5hbGdvcml0aG0sXG4gICAgZ3JhbnQ6IG5vcm1hbGl6ZU9mZmxpbmVHcmFudChzaWduZWRHcmFudC5ncmFudCksXG4gICAga2V5SWQ6IHNpZ25lZEdyYW50LmtleUlkLFxuICAgIHNpZ25hdHVyZTogc2lnbmVkR3JhbnQuc2lnbmF0dXJlXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuIG9mZmxpbmUgZ3JhbnQgcGF5bG9hZC5cbiAqIEBwYXJhbSB7T2ZmbGluZUdyYW50fSBncmFudCAtIEdyYW50IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7T2ZmbGluZUdyYW50fSAtIE5vcm1hbGl6ZWQgZ3JhbnQgcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplT2ZmbGluZUdyYW50KGdyYW50KSB7XG4gIGlmICghZ3JhbnQgfHwgdHlwZW9mIGdyYW50ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZ3JhbnQpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBvZmZsaW5lIGdyYW50IG9iamVjdFwiKVxuXG4gIHJldHVybiB7XG4gICAgZGV2aWNlSWQ6IHJlcXVpcmVkU3RyaW5nKGdyYW50LmRldmljZUlkLCBcImRldmljZUlkXCIpLFxuICAgIGV4cGlyZXNBdDogaXNvRGF0ZVN0cmluZyhuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhncmFudC5leHBpcmVzQXQsIFwiZXhwaXJlc0F0XCIpKSwgXCJleHBpcmVzQXRcIiksXG4gICAgZ3JhbnRJZDogcmVxdWlyZWRTdHJpbmcoZ3JhbnQuZ3JhbnRJZCwgXCJncmFudElkXCIpLFxuICAgIGlzc3VlZEF0OiBpc29EYXRlU3RyaW5nKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKGdyYW50Lmlzc3VlZEF0LCBcImlzc3VlZEF0XCIpKSwgXCJpc3N1ZWRBdFwiKSxcbiAgICByZXNvdXJjZXM6IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJyZXNvdXJjZXNcIiwgdmFsdWU6IGdyYW50LnJlc291cmNlc30pLFxuICAgIHNjb3BlczogZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcInNjb3Blc1wiLCB2YWx1ZTogZ3JhbnQuc2NvcGVzfSksXG4gICAgdXNlcklkOiByZXF1aXJlZFN0cmluZyhncmFudC51c2VySWQsIFwidXNlcklkXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuIG9mZmxpbmUgZ3JhbnQgc2lnbmluZyBrZXkuXG4gKiBAcGFyYW0ge09mZmxpbmVHcmFudFNpZ25pbmdLZXl9IHNpZ25pbmdLZXkgLSBTaWduaW5nIGtleS5cbiAqIEByZXR1cm5zIHtPZmZsaW5lR3JhbnRTaWduaW5nS2V5fSAtIE5vcm1hbGl6ZWQgc2lnbmluZyBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPZmZsaW5lR3JhbnRTaWduaW5nS2V5KHNpZ25pbmdLZXkpIHtcbiAgaWYgKCFzaWduaW5nS2V5IHx8IHR5cGVvZiBzaWduaW5nS2V5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2lnbmluZ0tleSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG9mZmxpbmUgZ3JhbnQgc2lnbmluZyBrZXkgb2JqZWN0XCIpXG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBzaWduaW5nS2V5LmN1cnJlbnQgPT09IHRydWUsXG4gICAgaWQ6IHJlcXVpcmVkU3RyaW5nKHNpZ25pbmdLZXkuaWQsIFwic2lnbmluZ0tleS5pZFwiKSxcbiAgICBzZWNyZXQ6IHJlcXVpcmVkU3RyaW5nKHNpZ25pbmdLZXkuc2VjcmV0LCBcInNpZ25pbmdLZXkuc2VjcmV0XCIpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGtleSB1c2VkIHRvIHNpZ24gbmV3IGdyYW50cy5cbiAqIEBwYXJhbSB7T2ZmbGluZUdyYW50U2lnbmluZ0tleVtdfSBzaWduaW5nS2V5cyAtIENvbmZpZ3VyZWQgc2lnbmluZyBrZXlzLlxuICogQHJldHVybnMge09mZmxpbmVHcmFudFNpZ25pbmdLZXl9IC0gQ3VycmVudCBzaWduaW5nIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRPZmZsaW5lR3JhbnRTaWduaW5nS2V5KHNpZ25pbmdLZXlzKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRLZXlzID0gc2lnbmluZ0tleXMubWFwKChrZXkpID0+IG5vcm1hbGl6ZU9mZmxpbmVHcmFudFNpZ25pbmdLZXkoa2V5KSlcbiAgY29uc3QgY3VycmVudEtleXMgPSBub3JtYWxpemVkS2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5LmN1cnJlbnQgPT09IHRydWUpXG5cbiAgaWYgKG5vcm1hbGl6ZWRLZXlzLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBvZmZsaW5lIGdyYW50IHNpZ25pbmcga2V5IGlzIHJlcXVpcmVkXCIpXG4gIGlmIChjdXJyZW50S2V5cy5sZW5ndGggPiAxKSB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IG9uZSBvZmZsaW5lIGdyYW50IHNpZ25pbmcga2V5IGNhbiBiZSBjdXJyZW50XCIpXG5cbiAgcmV0dXJuIGN1cnJlbnRLZXlzWzBdIHx8IG5vcm1hbGl6ZWRLZXlzWzBdXG59XG5cbi8qKlxuICogU2lnbnMgYSBtZXNzYWdlIHVzaW5nIEhNQUMtU0hBMjU2IGFuZCByZXR1cm5zIGEgcHJlZml4ZWQgaGV4IHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWVzc2FnZSAtIE1lc3NhZ2UgdG8gc2lnbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNlY3JldCAtIEhNQUMgc2VjcmV0LlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmVmaXhlZCBoZXggc2lnbmF0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiBobWFjU2hhMjU2SGV4KHttZXNzYWdlLCBzZWNyZXR9KSB7XG4gIGNvbnN0IGNyeXB0b1Byb3ZpZGVyID0gZ2xvYmFsVGhpcy5jcnlwdG9cblxuICBpZiAoIWNyeXB0b1Byb3ZpZGVyPy5zdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIldlYkNyeXB0byBzdWJ0bGUgQVBJIGlzIHJlcXVpcmVkIGZvciBvZmZsaW5lIGdyYW50IHNpZ25pbmdcIilcblxuICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG9Qcm92aWRlci5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgIFwicmF3XCIsXG4gICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHNlY3JldCksXG4gICAge2hhc2g6IFwiU0hBLTI1NlwiLCBuYW1lOiBcIkhNQUNcIn0sXG4gICAgZmFsc2UsXG4gICAgW1wic2lnblwiXVxuICApXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IGNyeXB0b1Byb3ZpZGVyLnN1YnRsZS5zaWduKFwiSE1BQ1wiLCBrZXksIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtZXNzYWdlKSlcblxuICByZXR1cm4gYCR7T0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfUFJFRklYfSR7aGV4KG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSkpfWBcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBieXRlcyB0byBsb3dlci1jYXNlIGhleC5cbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXMgLSBCeXRlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSGV4IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gaGV4KGJ5dGVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKS5tYXAoKGJ5dGUpID0+IGJ5dGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZyBmaWVsZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RyaW5nIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2ZmbGluZSBncmFudCAke25hbWV9YClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgRGF0ZSB0byBhbiBJU08gdGltZXN0YW1wLlxuICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gRGF0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBJU08gdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBpc29EYXRlU3RyaW5nKGRhdGUsIGxhYmVsKSB7XG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2ZmbGluZSBncmFudCAke2xhYmVsfWApXG5cbiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZhbGxiYWNrIHJhbmRvbSBncmFudCBpZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gR3JhbnQgaWQuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUdyYW50SWQoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0bz8ucmFuZG9tVVVJRCA/IGdsb2JhbFRoaXMuY3J5cHRvLnJhbmRvbVVVSUQoKSA6IGBncmFudC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMil9YFxufVxuXG4vKipcbiAqIFN0YWJsZSBKU09OIHN0cmluZ2lmaWVyIHdpdGggc29ydGVkIG9iamVjdCBrZXlzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBKU09OIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsOiBcInJvb3RcIiwgdmFsdWV9KSlcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgdmFsdWUgYXMgYSBKU09OIG9iamVjdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubGFiZWwgLSBEaWFnbm9zdGljIGxhYmVsLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gSlNPTiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbCwgdmFsdWV9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWwsIHZhbHVlfSlcblxuICBpZiAoIW5vcm1hbGl6ZWQgfHwgdHlwZW9mIG5vcm1hbGl6ZWQgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShub3JtYWxpemVkKSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvZmZsaW5lIGdyYW50ICR7bGFiZWx9IG9iamVjdGApXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgZGV0ZXJtaW5pc3RpYyBKU09OIHdpdGggc29ydGVkIG9iamVjdCBrZXlzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIERpYWdub3N0aWMgbGFiZWwuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlfSAtIE5vcm1hbGl6ZWQgSlNPTiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsLCB2YWx1ZX0pIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHZhbHVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2luZGV4fWAsIHZhbHVlOiBlbnRyeX0pKVxuICB9XG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi9cbiAgICBjb25zdCBub3JtYWxpemVkID0ge31cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkVmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpW2tleV1cblxuICAgICAgaWYgKGNoaWxkVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGRldGVybWluaXN0aWNKc29uKHtsYWJlbDogYCR7bGFiZWx9LyR7a2V5fWAsIHZhbHVlOiBjaGlsZFZhbHVlfSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBPZmZsaW5lIGdyYW50ICR7bGFiZWx9IG11c3QgYmUgZGV0ZXJtaW5pc3RpYyBKU09OYClcbn1cbiJdfQ==
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZS1ncmFudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zeW5jL29mZmxpbmUtZ3JhbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNIOzs7Ozs7Ozs7O0dBVUc7QUFDSDs7Ozs7O0dBTUc7QUFDSCxZQUFZO0FBRVosTUFBTSxpQ0FBaUMsR0FBRyxPQUFPLENBQUE7QUFDakQsTUFBTSw4QkFBOEIsR0FBRyxjQUFjLENBQUE7QUFFckQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUM7SUFDMUQsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEQsTUFBTSxvQkFBb0IsR0FBRywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN4RSxNQUFNLGNBQWMsR0FBRywwQkFBMEIsQ0FBQztRQUNoRCxTQUFTLEVBQUUsaUNBQWlDO1FBQzVDLEtBQUssRUFBRSxlQUFlO1FBQ3RCLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO0tBQy9CLENBQUMsQ0FBQTtJQUVGLE9BQU87UUFDTCxTQUFTLEVBQUUsaUNBQWlDO1FBQzVDLEtBQUssRUFBRSxlQUFlO1FBQ3RCLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxFQUFFO1FBQzlCLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQyxFQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sRUFBQyxDQUFDO0tBQy9GLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsRUFBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFDO0lBQ25GLE1BQU0scUJBQXFCLEdBQUcsMkJBQTJCLENBQUMsV0FB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QUFJLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUE7SUFDbkcsQ0FBQztJQUVELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1Riw2RkFBNkY7UUFDN0YsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBRXJCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sVUFBVSxHQUFHLHNDQUFzQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFdEUsSUFBSSxVQUFVLEtBQUssU0FBUztnQkFBRSxTQUFRO1lBQ3RDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxFQUFDLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtRQUNwRixDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssNkJBQTZCLENBQUMsQ0FBQTtBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaWduZWQgb2ZmbGluZSBncmFudCBlbnZlbG9wZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpZ25lZE9mZmxpbmVHcmFudFxuICogQHByb3BlcnR5IHtcIkhTMjU2XCJ9IGFsZ29yaXRobSAtIFNpZ25hdHVyZSBhbGdvcml0aG0uXG4gKiBAcHJvcGVydHkge09mZmxpbmVHcmFudH0gZ3JhbnQgLSBTaWduZWQgZ3JhbnQgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBrZXlJZCAtIFNpZ25pbmcga2V5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNpZ25hdHVyZSAtIEhleCBITUFDIHNpZ25hdHVyZSB3aXRoIGEgaG1hYy1zaGEyNTYgcHJlZml4LlxuICovXG4vKipcbiAqIEJhY2tlbmQtaXNzdWVkIG9mZmxpbmUgZ3JhbnQgcGF5bG9hZC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9mZmxpbmVHcmFudFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRldmljZUlkIC0gRGV2aWNlIGlkIGFsbG93ZWQgdG8gdXNlIHRoZSBncmFudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHBpcmVzQXQgLSBJU08gdGltZXN0YW1wIGFmdGVyIHdoaWNoIHJlcGxheSBtdXN0IHJlamVjdCB0aGUgZ3JhbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ3JhbnRJZCAtIFN0YWJsZSBncmFudCBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpc3N1ZWRBdCAtIElTTyB0aW1lc3RhbXAgd2hlbiB0aGUgYmFja2VuZCBpc3N1ZWQgdGhlIGdyYW50LlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gcmVzb3VyY2VzIC0gU3luYyBtYW5pZmVzdC9tYXRlcmlhbGl6ZWQgcmVzb3VyY2UgbWV0YWRhdGEuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBzY29wZXMgLSBNYXRlcmlhbGl6ZWQgZ3JhbnQgc2NvcGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHVzZXJJZCAtIEFjdG9yIHVzZXIgaWQgYWxsb3dlZCB0byB1c2UgdGhlIGdyYW50LlxuICovXG4vKipcbiAqIE9mZmxpbmUgZ3JhbnQgc2lnbmluZyBrZXkuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZsaW5lR3JhbnRTaWduaW5nS2V5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjdXJyZW50XSAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgYWN0aXZlIGtleSBmb3IgbmV3IGdyYW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFB1YmxpYyBrZXkgaWQgaW5jbHVkZWQgaW4gc2lnbmVkIGdyYW50IGVudmVsb3Blcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWNyZXQgLSBQcml2YXRlIEhNQUMgc2VjcmV0LiBOZXZlciBleHBvc2UgdGhpcyB0byBjbGllbnRzLlxuICovXG4vLyBAdHMtY2hlY2tcblxuY29uc3QgT0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfQUxHT1JJVEhNID0gXCJIUzI1NlwiXG5jb25zdCBPRkZMSU5FX0dSQU5UX1NJR05BVFVSRV9QUkVGSVggPSBcImhtYWMtc2hhMjU2LVwiXG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpZ25lZCBvZmZsaW5lIGdyYW50IGVudmVsb3BlLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge09mZmxpbmVHcmFudH0gYXJncy5ncmFudCAtIEdyYW50IHBheWxvYWQuXG4gKiBAcGFyYW0ge09mZmxpbmVHcmFudFNpZ25pbmdLZXl9IGFyZ3Muc2lnbmluZ0tleSAtIEN1cnJlbnQgc2lnbmluZyBrZXkuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRPZmZsaW5lR3JhbnQ+fSAtIFNpZ25lZCBncmFudCBlbnZlbG9wZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU9mZmxpbmVHcmFudCh7Z3JhbnQsIHNpZ25pbmdLZXl9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRHcmFudCA9IG5vcm1hbGl6ZU9mZmxpbmVHcmFudChncmFudClcbiAgY29uc3Qgbm9ybWFsaXplZFNpZ25pbmdLZXkgPSBub3JtYWxpemVPZmZsaW5lR3JhbnRTaWduaW5nS2V5KHNpZ25pbmdLZXkpXG4gIGNvbnN0IHNpZ25hdHVyZUlucHV0ID0gb2ZmbGluZUdyYW50U2lnbmF0dXJlSW5wdXQoe1xuICAgIGFsZ29yaXRobTogT0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfQUxHT1JJVEhNLFxuICAgIGdyYW50OiBub3JtYWxpemVkR3JhbnQsXG4gICAga2V5SWQ6IG5vcm1hbGl6ZWRTaWduaW5nS2V5LmlkXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBhbGdvcml0aG06IE9GRkxJTkVfR1JBTlRfU0lHTkFUVVJFX0FMR09SSVRITSxcbiAgICBncmFudDogbm9ybWFsaXplZEdyYW50LFxuICAgIGtleUlkOiBub3JtYWxpemVkU2lnbmluZ0tleS5pZCxcbiAgICBzaWduYXR1cmU6IGF3YWl0IGhtYWNTaGEyNTZIZXgoe21lc3NhZ2U6IHNpZ25hdHVyZUlucHV0LCBzZWNyZXQ6IG5vcm1hbGl6ZWRTaWduaW5nS2V5LnNlY3JldH0pXG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZmllcyBhIHNpZ25lZCBvZmZsaW5lIGdyYW50IGFuZCByZXR1cm5zIHRoZSB0cnVzdGVkIGdyYW50IHBheWxvYWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Mubm93XSAtIFZlcmlmaWNhdGlvbiB0aW1lLiBEZWZhdWx0cyB0byBjdXJyZW50IHRpbWUuXG4gKiBAcGFyYW0ge1NpZ25lZE9mZmxpbmVHcmFudH0gYXJncy5zaWduZWRHcmFudCAtIFNpZ25lZCBncmFudCBlbnZlbG9wZS5cbiAqIEBwYXJhbSB7T2ZmbGluZUdyYW50U2lnbmluZ0tleVtdfSBhcmdzLnNpZ25pbmdLZXlzIC0gQ2FuZGlkYXRlIHZlcmlmaWNhdGlvbiBrZXlzLlxuICogQHJldHVybnMge1Byb21pc2U8T2ZmbGluZUdyYW50Pn0gLSBWZXJpZmllZCBncmFudCBwYXlsb2FkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5T2ZmbGluZUdyYW50KHtub3cgPSBuZXcgRGF0ZSgpLCBzaWduZWRHcmFudCwgc2lnbmluZ0tleXN9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTaWduZWRHcmFudCA9IG5vcm1hbGl6ZVNpZ25lZE9mZmxpbmVHcmFudChzaWduZWRHcmFudClcblxuICBpZiAobm9ybWFsaXplZFNpZ25lZEdyYW50LmFsZ29yaXRobSAhPT0gT0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfQUxHT1JJVEhNKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBvZmZsaW5lIGdyYW50IHNpZ25hdHVyZSBhbGdvcml0aG0gJyR7bm9ybWFsaXplZFNpZ25lZEdyYW50LmFsZ29yaXRobX0nYClcbiAgfVxuXG4gIGNvbnN0IHNpZ25pbmdLZXkgPSBzaWduaW5nS2V5c1xuICAgIC5tYXAoKGtleSkgPT4gbm9ybWFsaXplT2ZmbGluZUdyYW50U2lnbmluZ0tleShrZXkpKVxuICAgIC5maW5kKChrZXkpID0+IGtleS5pZCA9PT0gbm9ybWFsaXplZFNpZ25lZEdyYW50LmtleUlkKVxuXG4gIGlmICghc2lnbmluZ0tleSkgdGhyb3cgbmV3IEVycm9yKGBObyBvZmZsaW5lIGdyYW50IHNpZ25pbmcga2V5IGZvciBrZXkgaWQgJyR7bm9ybWFsaXplZFNpZ25lZEdyYW50LmtleUlkfSdgKVxuXG4gIGNvbnN0IGV4cGVjdGVkU2lnbmF0dXJlID0gYXdhaXQgaG1hY1NoYTI1NkhleCh7XG4gICAgbWVzc2FnZTogb2ZmbGluZUdyYW50U2lnbmF0dXJlSW5wdXQobm9ybWFsaXplZFNpZ25lZEdyYW50KSxcbiAgICBzZWNyZXQ6IHNpZ25pbmdLZXkuc2VjcmV0XG4gIH0pXG5cbiAgaWYgKGV4cGVjdGVkU2lnbmF0dXJlICE9PSBub3JtYWxpemVkU2lnbmVkR3JhbnQuc2lnbmF0dXJlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiT2ZmbGluZSBncmFudCBzaWduYXR1cmUgZGlkIG5vdCBtYXRjaFwiKVxuICB9XG5cbiAgaWYgKE51bWJlci5pc05hTihub3cuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBvZmZsaW5lIGdyYW50IHZlcmlmaWNhdGlvbiB0aW1lXCIpXG4gIGlmIChuZXcgRGF0ZShub3JtYWxpemVkU2lnbmVkR3JhbnQuZ3JhbnQuZXhwaXJlc0F0KS5nZXRUaW1lKCkgPD0gbm93LmdldFRpbWUoKSkgdGhyb3cgbmV3IEVycm9yKFwiT2ZmbGluZSBncmFudCBleHBpcmVkXCIpXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRTaWduZWRHcmFudC5ncmFudFxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHNpZ25lZCBncmFudCBmcm9tIGJvb3RzdHJhcCByZXF1ZXN0IGlucHV0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGV2aWNlSWQgLSBEZXZpY2UgaWQuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2FyZ3MuZ3JhbnRJZF0gLSBPcHRpb25hbCBkZXRlcm1pbmlzdGljIGdyYW50IGlkIGZvciB0ZXN0cy9jdXN0b20gY2FsbGVycy5cbiAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBbYXJncy5ncmFudFR0bE1zXSAtIEdyYW50IFRUTCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0ge0RhdGV9IGFyZ3Mubm93IC0gSXNzdWUgdGltZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IGFyZ3MucmVzb3VyY2VzIC0gUmVzb3VyY2Ugc3luYyBtYW5pZmVzdC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IGFyZ3Muc2NvcGVzIC0gR3JhbnQgc2NvcGVzLlxuICogQHBhcmFtIHtPZmZsaW5lR3JhbnRTaWduaW5nS2V5fSBhcmdzLnNpZ25pbmdLZXkgLSBDdXJyZW50IHNpZ25pbmcga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudXNlcklkIC0gQWN0b3IgdXNlciBpZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFNpZ25lZE9mZmxpbmVHcmFudD59IC0gU2lnbmVkIGdyYW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlT2ZmbGluZUdyYW50RnJvbUJvb3RzdHJhcCh7ZGV2aWNlSWQsIGdyYW50SWQsIGdyYW50VHRsTXMsIG5vdywgcmVzb3VyY2VzLCBzY29wZXMsIHNpZ25pbmdLZXksIHVzZXJJZH0pIHtcbiAgY29uc3QgaXNzdWVkQXQgPSBpc29EYXRlU3RyaW5nKG5vdywgXCJpc3N1ZWRBdFwiKVxuICBjb25zdCB0dGxNcyA9IGdyYW50VHRsTXMgPT09IHVuZGVmaW5lZCA/IDI0ICogNjAgKiA2MCAqIDEwMDAgOiBncmFudFR0bE1zXG5cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHR0bE1zKSB8fCB0dGxNcyA8PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJPZmZsaW5lIGdyYW50IFRUTCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXCIpXG5cbiAgcmV0dXJuIGF3YWl0IGNyZWF0ZU9mZmxpbmVHcmFudCh7XG4gICAgZ3JhbnQ6IHtcbiAgICAgIGRldmljZUlkLFxuICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgdHRsTXMpLnRvSVNPU3RyaW5nKCksXG4gICAgICBncmFudElkOiBncmFudElkIHx8IHJhbmRvbUdyYW50SWQoKSxcbiAgICAgIGlzc3VlZEF0LFxuICAgICAgcmVzb3VyY2VzLFxuICAgICAgc2NvcGVzLFxuICAgICAgdXNlcklkXG4gICAgfSxcbiAgICBzaWduaW5nS2V5XG4gIH0pXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBzaWduZWQgZ3JhbnQgc2lnbmF0dXJlIGlucHV0LlxuICogQHBhcmFtIHt7YWxnb3JpdGhtOiBcIkhTMjU2XCIsIGdyYW50OiBPZmZsaW5lR3JhbnQsIGtleUlkOiBzdHJpbmd9fSBzaWduZWRHcmFudCAtIEdyYW50IHNpZ25hdHVyZSBmaWVsZHMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0YWJsZSBzaWduYXR1cmUgaW5wdXQuXG4gKi9cbmZ1bmN0aW9uIG9mZmxpbmVHcmFudFNpZ25hdHVyZUlucHV0KHNpZ25lZEdyYW50KSB7XG4gIHJldHVybiBzdGFibGVKc29uU3RyaW5naWZ5KHtcbiAgICBhbGdvcml0aG06IHNpZ25lZEdyYW50LmFsZ29yaXRobSxcbiAgICBncmFudDogc2lnbmVkR3JhbnQuZ3JhbnQsXG4gICAga2V5SWQ6IHNpZ25lZEdyYW50LmtleUlkXG4gIH0pXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHNpZ25lZCBvZmZsaW5lIGdyYW50IGVudmVsb3BlLlxuICogQHBhcmFtIHtTaWduZWRPZmZsaW5lR3JhbnR9IHNpZ25lZEdyYW50IC0gU2lnbmVkIGdyYW50LlxuICogQHJldHVybnMge1NpZ25lZE9mZmxpbmVHcmFudH0gLSBOb3JtYWxpemVkIHNpZ25lZCBncmFudC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2lnbmVkT2ZmbGluZUdyYW50KHNpZ25lZEdyYW50KSB7XG4gIGlmICghc2lnbmVkR3JhbnQgfHwgdHlwZW9mIHNpZ25lZEdyYW50ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2lnbmVkR3JhbnQpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBzaWduZWQgb2ZmbGluZSBncmFudCBvYmplY3RcIilcbiAgaWYgKHNpZ25lZEdyYW50LmFsZ29yaXRobSAhPT0gT0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfQUxHT1JJVEhNKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIG9mZmxpbmUgZ3JhbnQgc2lnbmF0dXJlIGFsZ29yaXRobSAnJHtTdHJpbmcoc2lnbmVkR3JhbnQuYWxnb3JpdGhtKX0nYClcbiAgaWYgKHR5cGVvZiBzaWduZWRHcmFudC5rZXlJZCAhPT0gXCJzdHJpbmdcIiB8fCBzaWduZWRHcmFudC5rZXlJZC5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBvZmZsaW5lIGdyYW50IGtleSBpZFwiKVxuICBpZiAodHlwZW9mIHNpZ25lZEdyYW50LnNpZ25hdHVyZSAhPT0gXCJzdHJpbmdcIiB8fCAhc2lnbmVkR3JhbnQuc2lnbmF0dXJlLm1hdGNoKC9eaG1hYy1zaGEyNTYtW2EtZjAtOV17NjR9JC8pKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBvZmZsaW5lIGdyYW50IHNpZ25hdHVyZVwiKVxuXG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBzaWduZWRHcmFudC5hbGdvcml0aG0sXG4gICAgZ3JhbnQ6IG5vcm1hbGl6ZU9mZmxpbmVHcmFudChzaWduZWRHcmFudC5ncmFudCksXG4gICAga2V5SWQ6IHNpZ25lZEdyYW50LmtleUlkLFxuICAgIHNpZ25hdHVyZTogc2lnbmVkR3JhbnQuc2lnbmF0dXJlXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuIG9mZmxpbmUgZ3JhbnQgcGF5bG9hZC5cbiAqIEBwYXJhbSB7T2ZmbGluZUdyYW50fSBncmFudCAtIEdyYW50IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7T2ZmbGluZUdyYW50fSAtIE5vcm1hbGl6ZWQgZ3JhbnQgcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplT2ZmbGluZUdyYW50KGdyYW50KSB7XG4gIGlmICghZ3JhbnQgfHwgdHlwZW9mIGdyYW50ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZ3JhbnQpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBvZmZsaW5lIGdyYW50IG9iamVjdFwiKVxuXG4gIHJldHVybiB7XG4gICAgZGV2aWNlSWQ6IHJlcXVpcmVkU3RyaW5nKGdyYW50LmRldmljZUlkLCBcImRldmljZUlkXCIpLFxuICAgIGV4cGlyZXNBdDogaXNvRGF0ZVN0cmluZyhuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhncmFudC5leHBpcmVzQXQsIFwiZXhwaXJlc0F0XCIpKSwgXCJleHBpcmVzQXRcIiksXG4gICAgZ3JhbnRJZDogcmVxdWlyZWRTdHJpbmcoZ3JhbnQuZ3JhbnRJZCwgXCJncmFudElkXCIpLFxuICAgIGlzc3VlZEF0OiBpc29EYXRlU3RyaW5nKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKGdyYW50Lmlzc3VlZEF0LCBcImlzc3VlZEF0XCIpKSwgXCJpc3N1ZWRBdFwiKSxcbiAgICByZXNvdXJjZXM6IGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbDogXCJyZXNvdXJjZXNcIiwgdmFsdWU6IGdyYW50LnJlc291cmNlc30pLFxuICAgIHNjb3BlczogZGV0ZXJtaW5pc3RpY0pzb25PYmplY3Qoe2xhYmVsOiBcInNjb3Blc1wiLCB2YWx1ZTogZ3JhbnQuc2NvcGVzfSksXG4gICAgdXNlcklkOiByZXF1aXJlZFN0cmluZyhncmFudC51c2VySWQsIFwidXNlcklkXCIpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuIG9mZmxpbmUgZ3JhbnQgc2lnbmluZyBrZXkuXG4gKiBAcGFyYW0ge09mZmxpbmVHcmFudFNpZ25pbmdLZXl9IHNpZ25pbmdLZXkgLSBTaWduaW5nIGtleS5cbiAqIEByZXR1cm5zIHtPZmZsaW5lR3JhbnRTaWduaW5nS2V5fSAtIE5vcm1hbGl6ZWQgc2lnbmluZyBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPZmZsaW5lR3JhbnRTaWduaW5nS2V5KHNpZ25pbmdLZXkpIHtcbiAgaWYgKCFzaWduaW5nS2V5IHx8IHR5cGVvZiBzaWduaW5nS2V5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoc2lnbmluZ0tleSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG9mZmxpbmUgZ3JhbnQgc2lnbmluZyBrZXkgb2JqZWN0XCIpXG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBzaWduaW5nS2V5LmN1cnJlbnQgPT09IHRydWUsXG4gICAgaWQ6IHJlcXVpcmVkU3RyaW5nKHNpZ25pbmdLZXkuaWQsIFwic2lnbmluZ0tleS5pZFwiKSxcbiAgICBzZWNyZXQ6IHJlcXVpcmVkU3RyaW5nKHNpZ25pbmdLZXkuc2VjcmV0LCBcInNpZ25pbmdLZXkuc2VjcmV0XCIpXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGtleSB1c2VkIHRvIHNpZ24gbmV3IGdyYW50cy5cbiAqIEBwYXJhbSB7T2ZmbGluZUdyYW50U2lnbmluZ0tleVtdfSBzaWduaW5nS2V5cyAtIENvbmZpZ3VyZWQgc2lnbmluZyBrZXlzLlxuICogQHJldHVybnMge09mZmxpbmVHcmFudFNpZ25pbmdLZXl9IC0gQ3VycmVudCBzaWduaW5nIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRPZmZsaW5lR3JhbnRTaWduaW5nS2V5KHNpZ25pbmdLZXlzKSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRLZXlzID0gc2lnbmluZ0tleXMubWFwKChrZXkpID0+IG5vcm1hbGl6ZU9mZmxpbmVHcmFudFNpZ25pbmdLZXkoa2V5KSlcbiAgY29uc3QgY3VycmVudEtleXMgPSBub3JtYWxpemVkS2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5LmN1cnJlbnQgPT09IHRydWUpXG5cbiAgaWYgKG5vcm1hbGl6ZWRLZXlzLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihcIkF0IGxlYXN0IG9uZSBvZmZsaW5lIGdyYW50IHNpZ25pbmcga2V5IGlzIHJlcXVpcmVkXCIpXG4gIGlmIChjdXJyZW50S2V5cy5sZW5ndGggPiAxKSB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IG9uZSBvZmZsaW5lIGdyYW50IHNpZ25pbmcga2V5IGNhbiBiZSBjdXJyZW50XCIpXG5cbiAgcmV0dXJuIGN1cnJlbnRLZXlzWzBdIHx8IG5vcm1hbGl6ZWRLZXlzWzBdXG59XG5cbi8qKlxuICogU2lnbnMgYSBtZXNzYWdlIHVzaW5nIEhNQUMtU0hBMjU2IGFuZCByZXR1cm5zIGEgcHJlZml4ZWQgaGV4IHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWVzc2FnZSAtIE1lc3NhZ2UgdG8gc2lnbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNlY3JldCAtIEhNQUMgc2VjcmV0LlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmVmaXhlZCBoZXggc2lnbmF0dXJlLlxuICovXG5hc3luYyBmdW5jdGlvbiBobWFjU2hhMjU2SGV4KHttZXNzYWdlLCBzZWNyZXR9KSB7XG4gIGNvbnN0IGNyeXB0b1Byb3ZpZGVyID0gZ2xvYmFsVGhpcy5jcnlwdG9cblxuICBpZiAoIWNyeXB0b1Byb3ZpZGVyPy5zdWJ0bGUpIHRocm93IG5ldyBFcnJvcihcIldlYkNyeXB0byBzdWJ0bGUgQVBJIGlzIHJlcXVpcmVkIGZvciBvZmZsaW5lIGdyYW50IHNpZ25pbmdcIilcblxuICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG9Qcm92aWRlci5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgIFwicmF3XCIsXG4gICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHNlY3JldCksXG4gICAge2hhc2g6IFwiU0hBLTI1NlwiLCBuYW1lOiBcIkhNQUNcIn0sXG4gICAgZmFsc2UsXG4gICAgW1wic2lnblwiXVxuICApXG4gIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IGNyeXB0b1Byb3ZpZGVyLnN1YnRsZS5zaWduKFwiSE1BQ1wiLCBrZXksIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShtZXNzYWdlKSlcblxuICByZXR1cm4gYCR7T0ZGTElORV9HUkFOVF9TSUdOQVRVUkVfUFJFRklYfSR7aGV4KG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSkpfWBcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBieXRlcyB0byBsb3dlci1jYXNlIGhleC5cbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXMgLSBCeXRlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSGV4IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gaGV4KGJ5dGVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKS5tYXAoKGJ5dGUpID0+IGJ5dGUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSkuam9pbihcIlwiKVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZyBmaWVsZC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RyaW5nIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb2ZmbGluZSBncmFudCAke25hbWV9YClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgRGF0ZSB0byBhbiBJU08gdGltZXN0YW1wLlxuICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gRGF0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIEZpZWxkIGxhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBJU08gdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBpc29EYXRlU3RyaW5nKGRhdGUsIGxhYmVsKSB7XG4gIGlmIChOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2ZmbGluZSBncmFudCAke2xhYmVsfWApXG5cbiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZhbGxiYWNrIHJhbmRvbSBncmFudCBpZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gR3JhbnQgaWQuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUdyYW50SWQoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0bz8ucmFuZG9tVVVJRCA/IGdsb2JhbFRoaXMuY3J5cHRvLnJhbmRvbVVVSUQoKSA6IGBncmFudC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMil9YFxufVxuXG4vKipcbiAqIFN0YWJsZSBKU09OIHN0cmluZ2lmaWVyIHdpdGggc29ydGVkIG9iamVjdCBrZXlzLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBKU09OIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlSnNvblN0cmluZ2lmeSh2YWx1ZSkge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsOiBcInJvb3RcIiwgdmFsdWV9KSlcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgdmFsdWUgYXMgYSBKU09OIG9iamVjdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubGFiZWwgLSBEaWFnbm9zdGljIGxhYmVsLlxuICogQHBhcmFtIHt1bmtub3dufSBhcmdzLnZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IC0gSlNPTiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluaXN0aWNKc29uT2JqZWN0KHtsYWJlbCwgdmFsdWV9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWwsIHZhbHVlfSlcblxuICBpZiAoIW5vcm1hbGl6ZWQgfHwgdHlwZW9mIG5vcm1hbGl6ZWQgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShub3JtYWxpemVkKSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvZmZsaW5lIGdyYW50ICR7bGFiZWx9IG9iamVjdGApXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChub3JtYWxpemVkKVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgZGV0ZXJtaW5pc3RpYyBKU09OIHdpdGggc29ydGVkIG9iamVjdCBrZXlzLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5sYWJlbCAtIERpYWdub3N0aWMgbGFiZWwuXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZ3MudmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlfSAtIE5vcm1hbGl6ZWQgSlNPTiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5pc3RpY0pzb24oe2xhYmVsLCB2YWx1ZX0pIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIHZhbHVlXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgoZW50cnksIGluZGV4KSA9PiBkZXRlcm1pbmlzdGljSnNvbih7bGFiZWw6IGAke2xhYmVsfS8ke2luZGV4fWAsIHZhbHVlOiBlbnRyeX0pKVxuICB9XG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi9cbiAgICBjb25zdCBub3JtYWxpemVkID0ge31cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKS5zb3J0KCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkVmFsdWUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpW2tleV1cblxuICAgICAgaWYgKGNoaWxkVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWVcbiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGRldGVybWluaXN0aWNKc29uKHtsYWJlbDogYCR7bGFiZWx9LyR7a2V5fWAsIHZhbHVlOiBjaGlsZFZhbHVlfSlcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBPZmZsaW5lIGdyYW50ICR7bGFiZWx9IG11c3QgYmUgZGV0ZXJtaW5pc3RpYyBKU09OYClcbn1cbiJdfQ==
@@ -1,17 +1,3 @@
1
- /**
2
- * Peer mutation bundle exported by a device for offline/P2P transfer.
3
- * @typedef {object} PeerMutationBundle
4
- * @property {string} exportedAt - ISO timestamp when the bundle was exported.
5
- * @property {"velocious.sync.peer-mutation-bundle.v1"} format - Bundle format identifier.
6
- * @property {PeerMutationBundleEntry[]} mutations - Signed mutations in local sequence order.
7
- */
8
- /**
9
- * One peer mutation bundle entry.
10
- * @typedef {object} PeerMutationBundleEntry
11
- * @property {string} [localRecordId] - Exporting device's local mutation record id.
12
- * @property {number} [localSequence] - Exporting device's local mutation sequence.
13
- * @property {import("./device-identity.js").SignedSyncMutation} signedMutation - Device-signed mutation envelope.
14
- */
15
1
  /**
16
2
  * Exports local non-terminal mutations as a signed peer-transfer bundle.
17
3
  * @param {object} args - Arguments.
@@ -1 +1 @@
1
- {"version":3,"file":"peer-mutation-bundle.d.ts","sourceRoot":"","sources":["../../../src/sync/peer-mutation-bundle.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AAEH;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,8GAPG;IAA+D,iBAAiB,EAAxE,OAAO,sBAAsB,EAAE,iBAAiB;IACI,gBAAgB,EAApE,OAAO,sBAAsB,EAAE,cAAc;IACG,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO;IACvB,GAAG,UAAf,IAAI;IACqD,QAAQ;CAC/E,GAAU,OAAO,CAAC,kBAAkB,CAAC,CA2BvC;AAED;;;;;;;;GAQG;AACH,yFANG;IAA4D,gBAAgB,EAApE,OAAO,sBAAsB,EAAE,cAAc;IACpB,MAAM,EAA/B,kBAAkB;IAC8B,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO;IAC7B,GAAG;CACvB,GAAU,OAAO,CAAC;IAAC,QAAQ,EAAE;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAAC,QAAQ,EAAE;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAAC,OAAO,EAAE;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,EAAE,CAAA;CAAC,CAAC,CAsC1Q;;;;;;;;gBA/Fa,MAAM;;;;YACN,wCAAwC;;;;eACxC,uBAAuB,EAAE;;;;;;;;;;;;;;;;;oBAQzB,OAAO,sBAAsB,EAAE,kBAAkB"}
1
+ {"version":3,"file":"peer-mutation-bundle.d.ts","sourceRoot":"","sources":["../../../src/sync/peer-mutation-bundle.js"],"names":[],"mappings":"AAqBA;;;;;;;;;GASG;AACH,8GAPG;IAA+D,iBAAiB,EAAxE,OAAO,sBAAsB,EAAE,iBAAiB;IACI,gBAAgB,EAApE,OAAO,sBAAsB,EAAE,cAAc;IACG,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO;IACvB,GAAG,UAAf,IAAI;IACqD,QAAQ;CAC/E,GAAU,OAAO,CAAC,kBAAkB,CAAC,CA2BvC;AAED;;;;;;;;GAQG;AACH,yFANG;IAA4D,gBAAgB,EAApE,OAAO,sBAAsB,EAAE,cAAc;IACpB,MAAM,EAA/B,kBAAkB;IAC8B,WAAW,EAA3D,OAAO,yBAAyB,EAAE,OAAO;IAC7B,GAAG;CACvB,GAAU,OAAO,CAAC;IAAC,QAAQ,EAAE;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAAC,QAAQ,EAAE;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAAC,OAAO,EAAE;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAC,EAAE,CAAA;CAAC,CAAC,CAsC1Q;;;;;;;;gBAhGa,MAAM;;;;YACN,wCAAwC;;;;eACxC,uBAAuB,EAAE;;;;;;;;;;;;;;;;;oBAOzB,OAAO,sBAAsB,EAAE,kBAAkB"}
@@ -1,7 +1,5 @@
1
1
  // @ts-check
2
2
  import { createSignedMutation, mutationIdempotencyKey, verifySignedMutation } from "./device-identity.js";
3
- const PEER_MUTATION_BUNDLE_FORMAT = "velocious.sync.peer-mutation-bundle.v1";
4
- const EXPORTABLE_STATUSES = new Set(["pending", "applied-locally", "conflict"]);
5
3
  /**
6
4
  * Peer mutation bundle exported by a device for offline/P2P transfer.
7
5
  * @typedef {object} PeerMutationBundle
@@ -16,6 +14,8 @@ const EXPORTABLE_STATUSES = new Set(["pending", "applied-locally", "conflict"]);
16
14
  * @property {number} [localSequence] - Exporting device's local mutation sequence.
17
15
  * @property {import("./device-identity.js").SignedSyncMutation} signedMutation - Device-signed mutation envelope.
18
16
  */
17
+ const PEER_MUTATION_BUNDLE_FORMAT = "velocious.sync.peer-mutation-bundle.v1";
18
+ const EXPORTABLE_STATUSES = new Set(["pending", "applied-locally", "conflict"]);
19
19
  /**
20
20
  * Exports local non-terminal mutations as a signed peer-transfer bundle.
21
21
  * @param {object} args - Arguments.
@@ -212,4 +212,4 @@ function errorMessage(error) {
212
212
  return error.message;
213
213
  return String(error);
214
214
  }
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlci1tdXRhdGlvbi1idW5kbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9wZWVyLW11dGF0aW9uLWJ1bmRsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFFdkcsTUFBTSwyQkFBMkIsR0FBRyx3Q0FBd0MsQ0FBQTtBQUM1RSxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFFL0U7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FBQyxFQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUM7SUFDakksTUFBTSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMxRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDbkQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkQsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDeEQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFB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T0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSztJQUMvQixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBRXJILE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQzNCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixJQUFJLEtBQUssWUFBWSxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFBO0lBRWhELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjcmVhdGVTaWduZWRNdXRhdGlvbiwgbXV0YXRpb25JZGVtcG90ZW5jeUtleSwgdmVyaWZ5U2lnbmVkTXV0YXRpb259IGZyb20gXCIuL2RldmljZS1pZGVudGl0eS5qc1wiXG5cbmNvbnN0IFBFRVJfTVVUQVRJT05fQlVORExFX0ZPUk1BVCA9IFwidmVsb2Npb3VzLnN5bmMucGVlci1tdXRhdGlvbi1idW5kbGUudjFcIlxuY29uc3QgRVhQT1JUQUJMRV9TVEFUVVNFUyA9IG5ldyBTZXQoW1wicGVuZGluZ1wiLCBcImFwcGxpZWQtbG9jYWxseVwiLCBcImNvbmZsaWN0XCJdKVxuXG4vKipcbiAqIFBlZXIgbXV0YXRpb24gYnVuZGxlIGV4cG9ydGVkIGJ5IGEgZGV2aWNlIGZvciBvZmZsaW5lL1AyUCB0cmFuc2Zlci5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBlZXJNdXRhdGlvbkJ1bmRsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cG9ydGVkQXQgLSBJU08gdGltZXN0YW1wIHdoZW4gdGhlIGJ1bmRsZSB3YXMgZXhwb3J0ZWQuXG4gKiBAcHJvcGVydHkge1widmVsb2Npb3VzLnN5bmMucGVlci1tdXRhdGlvbi1idW5kbGUudjFcIn0gZm9ybWF0IC0gQnVuZGxlIGZvcm1hdCBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtQZWVyTXV0YXRpb25CdW5kbGVFbnRyeVtdfSBtdXRhdGlvbnMgLSBTaWduZWQgbXV0YXRpb25zIGluIGxvY2FsIHNlcXVlbmNlIG9yZGVyLlxuICovXG5cbi8qKlxuICogT25lIHBlZXIgbXV0YXRpb24gYnVuZGxlIGVudHJ5LlxuICogQHR5cGVkZWYge29iamVjdH0gUGVlck11dGF0aW9uQnVuZGxlRW50cnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbG9jYWxSZWNvcmRJZF0gLSBFeHBvcnRpbmcgZGV2aWNlJ3MgbG9jYWwgbXV0YXRpb24gcmVjb3JkIGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsb2NhbFNlcXVlbmNlXSAtIEV4cG9ydGluZyBkZXZpY2UncyBsb2NhbCBtdXRhdGlvbiBzZXF1ZW5jZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU2lnbmVkU3luY011dGF0aW9ufSBzaWduZWRNdXRhdGlvbiAtIERldmljZS1zaWduZWQgbXV0YXRpb24gZW52ZWxvcGUuXG4gKi9cblxuLyoqXG4gKiBFeHBvcnRzIGxvY2FsIG5vbi10ZXJtaW5hbCBtdXRhdGlvbnMgYXMgYSBzaWduZWQgcGVlci10cmFuc2ZlciBidW5kbGUuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuRGV2aWNlQ2VydGlmaWNhdGV9IGFyZ3MuZGV2aWNlQ2VydGlmaWNhdGUgLSBEZXZpY2UgY2VydGlmaWNhdGUgZm9yIHNpZ25pbmcgcmVjb3Jkcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY0pzb25XZWJLZXl9IGFyZ3MuZGV2aWNlUHJpdmF0ZUtleSAtIERldmljZSBwcml2YXRlIGtleSBmb3Igc2lnbmluZyByZWNvcmRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5kZWZhdWx0fSBhcmdzLm11dGF0aW9uTG9nIC0gTG9jYWwgbXV0YXRpb24gbG9nLlxuICogQHBhcmFtIHsoKSA9PiBEYXRlfSBbYXJncy5ub3ddIC0gRXhwb3J0IGNsb2NrLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uU3RhdHVzW119IFthcmdzLnN0YXR1c2VzXSAtIFN0YXR1c2VzIHRvIGV4cG9ydC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBlZXJNdXRhdGlvbkJ1bmRsZT59IC0gU2lnbmVkIHBlZXIgbXV0YXRpb24gYnVuZGxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwb3J0UGVlck11dGF0aW9uQnVuZGxlKHtkZXZpY2VDZXJ0aWZpY2F0ZSwgZGV2aWNlUHJpdmF0ZUtleSwgbXV0YXRpb25Mb2csIG5vdyA9ICgpID0+IG5ldyBEYXRlKCksIHN0YXR1c2VzfSkge1xuICBjb25zdCBzZWxlY3RlZFN0YXR1c2VzID0gbm9ybWFsaXplRXhwb3J0U3RhdHVzZXMoc3RhdHVzZXMpXG4gIGNvbnN0IHRpbWVzdGFtcCA9IGlzb1RpbWVzdGFtcChub3coKSwgXCJleHBvcnRlZEF0XCIpXG4gIGNvbnN0IHJlY29yZHMgPSAoYXdhaXQgbXV0YXRpb25Mb2cucmVjb3JkcygpKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2VsZWN0ZWRTdGF0dXNlcy5oYXMocmVjb3JkLnN0YXR1cykpXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LnNlcXVlbmNlIC0gcmlnaHQuc2VxdWVuY2UpXG4gIGNvbnN0IG11dGF0aW9ucyA9IFtdXG5cbiAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgIG11dGF0aW9ucy5wdXNoKHtcbiAgICAgIGxvY2FsUmVjb3JkSWQ6IHJlY29yZC5pZCxcbiAgICAgIGxvY2FsU2VxdWVuY2U6IHJlY29yZC5zZXF1ZW5jZSxcbiAgICAgIHNpZ25lZE11dGF0aW9uOiBhd2FpdCBjcmVhdGVTaWduZWRNdXRhdGlvbih7XG4gICAgICAgIGRldmljZUNlcnRpZmljYXRlLFxuICAgICAgICBkZXZpY2VQcml2YXRlS2V5LFxuICAgICAgICBtdXRhdGlvbjogcmVjb3JkLm11dGF0aW9uXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV4cG9ydGVkQXQ6IHRpbWVzdGFtcCxcbiAgICBmb3JtYXQ6IFBFRVJfTVVUQVRJT05fQlVORExFX0ZPUk1BVCxcbiAgICBtdXRhdGlvbnNcbiAgfVxufVxuXG4vKipcbiAqIEltcG9ydHMgdmVyaWZpZWQgcGVlciBtdXRhdGlvbnMgaW50byB0aGUgbG9jYWwgbXV0YXRpb24gbG9nLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNKc29uV2ViS2V5fSBhcmdzLmJhY2tlbmRQdWJsaWNLZXkgLSBCYWNrZW5kIHB1YmxpYyBrZXkgZm9yIHZlcmlmeWluZyBwZWVyIGNlcnRpZmljYXRlcy5cbiAqIEBwYXJhbSB7UGVlck11dGF0aW9uQnVuZGxlfSBhcmdzLmJ1bmRsZSAtIFBlZXIgYnVuZGxlIHRvIGltcG9ydC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuZGVmYXVsdH0gYXJncy5tdXRhdGlvbkxvZyAtIExvY2FsIG11dGF0aW9uIGxvZy5cbiAqIEBwYXJhbSB7RGF0ZX0gW2FyZ3Mubm93XSAtIFZlcmlmaWNhdGlvbiB0aW1lLlxuICogQHJldHVybnMge1Byb21pc2U8e2ltcG9ydGVkOiB7Y2xpZW50TXV0YXRpb25JZDogc3RyaW5nLCBpZGVtcG90ZW5jeUtleTogc3RyaW5nLCBsb2NhbFJlY29yZElkOiBzdHJpbmd9W10sIHJlamVjdGVkOiB7ZXJyb3JNZXNzYWdlOiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9W10sIHNraXBwZWQ6IHtjbGllbnRNdXRhdGlvbklkOiBzdHJpbmcsIGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcsIGxvY2FsUmVjb3JkSWQ6IHN0cmluZywgcmVhc29uOiBcImR1cGxpY2F0ZVwifVtdfT59IC0gSW1wb3J0IHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFBlZXJNdXRhdGlvbkJ1bmRsZSh7YmFja2VuZFB1YmxpY0tleSwgYnVuZGxlLCBtdXRhdGlvbkxvZywgbm93ID0gbmV3IERhdGUoKX0pIHtcbiAgY29uc3Qgbm9ybWFsaXplZEJ1bmRsZSA9IG5vcm1hbGl6ZVBlZXJNdXRhdGlvbkJ1bmRsZShidW5kbGUpXG4gIGNvbnN0IGV4aXN0aW5nUmVjb3JkcyA9IGF3YWl0IG11dGF0aW9uTG9nLnJlY29yZHMoKVxuICBjb25zdCBleGlzdGluZ0J5SWRlbXBvdGVuY3lLZXkgPSBuZXcgTWFwKGV4aXN0aW5nUmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gW211dGF0aW9uSWRlbXBvdGVuY3lLZXkoe211dGF0aW9uOiByZWNvcmQubXV0YXRpb259KSwgcmVjb3JkXSkpXG4gIC8qKiBAdHlwZSB7e2NsaWVudE11dGF0aW9uSWQ6IHN0cmluZywgaWRlbXBvdGVuY3lLZXk6IHN0cmluZywgbG9jYWxSZWNvcmRJZDogc3RyaW5nfVtdfSAqL1xuICBjb25zdCBpbXBvcnRlZCA9IFtdXG4gIC8qKiBAdHlwZSB7e2Vycm9yTWVzc2FnZTogc3RyaW5nLCBpbmRleDogbnVtYmVyfVtdfSAqL1xuICBjb25zdCByZWplY3RlZCA9IFtdXG4gIC8qKiBAdHlwZSB7e2NsaWVudE11dGF0aW9uSWQ6IHN0cmluZywgaWRlbXBvdGVuY3lLZXk6IHN0cmluZywgbG9jYWxSZWNvcmRJZDogc3RyaW5nLCByZWFzb246IFwiZHVwbGljYXRlXCJ9W119ICovXG4gIGNvbnN0IHNraXBwZWQgPSBbXVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2Ygbm9ybWFsaXplZEJ1bmRsZS5tdXRhdGlvbnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgbXV0YXRpb24gPSBhd2FpdCB2ZXJpZmllZEJ1bmRsZU11dGF0aW9uKHtiYWNrZW5kUHVibGljS2V5LCBlbnRyeSwgaW5kZXgsIG5vdywgcmVqZWN0ZWR9KVxuXG4gICAgaWYgKCFtdXRhdGlvbikgY29udGludWVcblxuICAgIGNvbnN0IGlkZW1wb3RlbmN5S2V5ID0gbXV0YXRpb25JZGVtcG90ZW5jeUtleShlbnRyeS5zaWduZWRNdXRhdGlvbilcbiAgICBjb25zdCBkdXBsaWNhdGVSZWNvcmQgPSBleGlzdGluZ0J5SWRlbXBvdGVuY3lLZXkuZ2V0KGlkZW1wb3RlbmN5S2V5KVxuXG4gICAgaWYgKGR1cGxpY2F0ZVJlY29yZCkge1xuICAgICAgc2tpcHBlZC5wdXNoKHtcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZDogbXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCxcbiAgICAgICAgaWRlbXBvdGVuY3lLZXksXG4gICAgICAgIGxvY2FsUmVjb3JkSWQ6IGR1cGxpY2F0ZVJlY29yZC5pZCxcbiAgICAgICAgcmVhc29uOiAvKiogQHR5cGUge1wiZHVwbGljYXRlXCJ9ICovIChcImR1cGxpY2F0ZVwiKVxuICAgICAgfSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgbXV0YXRpb25Mb2cuYXBwZW5kKHttdXRhdGlvbn0pXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IG11dGF0aW9uTG9nLnVwZGF0ZVN0YXR1cyh7aWQ6IHJlY29yZC5pZCwgc3RhdHVzOiBcInBlZXItYXBwbGllZFwifSlcbiAgICBleGlzdGluZ0J5SWRlbXBvdGVuY3lLZXkuc2V0KGlkZW1wb3RlbmN5S2V5LCB1cGRhdGVkKVxuICAgIGltcG9ydGVkLnB1c2goe2NsaWVudE11dGF0aW9uSWQ6IG11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIGlkZW1wb3RlbmN5S2V5LCBsb2NhbFJlY29yZElkOiB1cGRhdGVkLmlkfSlcbiAgfVxuXG4gIHJldHVybiB7aW1wb3J0ZWQsIHJlamVjdGVkLCBza2lwcGVkfVxufVxuXG4vKipcbiAqIFZlcmlmaWVzIGEgYnVuZGxlIG11dGF0aW9uIGFuZCByZWNvcmRzIG5vcm1hbCBwZXItZW50cnkgdmVyaWZpY2F0aW9uIHJlamVjdGlvbnMuXG4gKiBTdG9yYWdlIHdyaXRlcyBpbnRlbnRpb25hbGx5IGhhcHBlbiBvdXRzaWRlIHRoaXMgaGVscGVyIHNvIHN0b3JhZ2UgZmFpbHVyZXMgZXNjYXBlIGltcG9ydC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jSnNvbldlYktleX0gYXJncy5iYWNrZW5kUHVibGljS2V5IC0gQmFja2VuZCBwdWJsaWMga2V5LlxuICogQHBhcmFtIHtQZWVyTXV0YXRpb25CdW5kbGVFbnRyeX0gYXJncy5lbnRyeSAtIEJ1bmRsZSBlbnRyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmluZGV4IC0gRW50cnkgaW5kZXguXG4gKiBAcGFyYW0ge0RhdGV9IGFyZ3Mubm93IC0gVmVyaWZpY2F0aW9uIHRpbWUuXG4gKiBAcGFyYW0ge3tlcnJvck1lc3NhZ2U6IHN0cmluZywgaW5kZXg6IG51bWJlcn1bXX0gYXJncy5yZWplY3RlZCAtIFJlamVjdGlvbiBhY2N1bXVsYXRvci5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNNdXRhdGlvbiB8IG51bGw+fSAtIFZlcmlmaWVkIG11dGF0aW9uLCBvciBudWxsIHdoZW4gcmVqZWN0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmaWVkQnVuZGxlTXV0YXRpb24oe2JhY2tlbmRQdWJsaWNLZXksIGVudHJ5LCBpbmRleCwgbm93LCByZWplY3RlZH0pIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdmVyaWZ5U2lnbmVkTXV0YXRpb24oe2JhY2tlbmRQdWJsaWNLZXksIG5vdywgc2lnbmVkTXV0YXRpb246IGVudHJ5LnNpZ25lZE11dGF0aW9ufSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3RlZC5wdXNoKHtlcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZShlcnJvciksIGluZGV4fSlcblxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGV4cG9ydCBzdGF0dXMgZmlsdGVycy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvblN0YXR1c1tdIHwgdW5kZWZpbmVkfSBzdGF0dXNlcyAtIE9wdGlvbmFsIHN0YXR1c2VzLlxuICogQHJldHVybnMge1NldDxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uU3RhdHVzPn0gLSBTdGF0dXMgc2V0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVFeHBvcnRTdGF0dXNlcyhzdGF0dXNlcykge1xuICBpZiAoc3RhdHVzZXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25TdGF0dXM+fSAqLyAobmV3IFNldChFWFBPUlRBQkxFX1NUQVRVU0VTKSlcbiAgaWYgKCFBcnJheS5pc0FycmF5KHN0YXR1c2VzKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgcGVlciBtdXRhdGlvbiBleHBvcnQgc3RhdHVzZXMgYXJyYXlcIilcblxuICBjb25zdCBub3JtYWxpemVkID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBzdGF0dXMgb2Ygc3RhdHVzZXMpIHtcbiAgICBpZiAoIUVYUE9SVEFCTEVfU1RBVFVTRVMuaGFzKHN0YXR1cykpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcGVlciBtdXRhdGlvbiBleHBvcnQgc3RhdHVzICcke1N0cmluZyhzdGF0dXMpfSdgKVxuICAgIG5vcm1hbGl6ZWQuYWRkKHN0YXR1cylcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge1NldDxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uU3RhdHVzPn0gKi8gKG5vcm1hbGl6ZWQpXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBlZXIgbXV0YXRpb24gYnVuZGxlLlxuICogQHBhcmFtIHtQZWVyTXV0YXRpb25CdW5kbGV9IGJ1bmRsZSAtIEJ1bmRsZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQZWVyTXV0YXRpb25CdW5kbGV9IC0gTm9ybWFsaXplZCBidW5kbGUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBlZXJNdXRhdGlvbkJ1bmRsZShidW5kbGUpIHtcbiAgaWYgKCFidW5kbGUgfHwgdHlwZW9mIGJ1bmRsZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGJ1bmRsZSkpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIHBlZXIgbXV0YXRpb24gYnVuZGxlIG9iamVjdFwiKVxuICBpZiAoYnVuZGxlLmZvcm1hdCAhPT0gUEVFUl9NVVRBVElPTl9CVU5ETEVfRk9STUFUKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHBlZXIgbXV0YXRpb24gYnVuZGxlIGZvcm1hdCAnJHtTdHJpbmcoYnVuZGxlLmZvcm1hdCl9J2ApXG4gIGlzb1RpbWVzdGFtcChuZXcgRGF0ZShyZXF1aXJlZFN0cmluZyhidW5kbGUuZXhwb3J0ZWRBdCwgXCJleHBvcnRlZEF0XCIpKSwgXCJleHBvcnRlZEF0XCIpXG4gIGlmICghQXJyYXkuaXNBcnJheShidW5kbGUubXV0YXRpb25zKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgcGVlciBtdXRhdGlvbiBidW5kbGUgbXV0YXRpb25zIGFycmF5XCIpXG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRlZEF0OiBidW5kbGUuZXhwb3J0ZWRBdCxcbiAgICBmb3JtYXQ6IGJ1bmRsZS5mb3JtYXQsXG4gICAgbXV0YXRpb25zOiBidW5kbGUubXV0YXRpb25zLm1hcCgoZW50cnksIGluZGV4KSA9PiBub3JtYWxpemVQZWVyTXV0YXRpb25CdW5kbGVFbnRyeShlbnRyeSwgaW5kZXgpKVxuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBvbmUgcGVlciBtdXRhdGlvbiBidW5kbGUgZW50cnkuXG4gKiBAcGFyYW0ge1BlZXJNdXRhdGlvbkJ1bmRsZUVudHJ5fSBlbnRyeSAtIEJ1bmRsZSBlbnRyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIEVudHJ5IGluZGV4LlxuICogQHJldHVybnMge1BlZXJNdXRhdGlvbkJ1bmRsZUVudHJ5fSAtIE5vcm1hbGl6ZWQgZW50cnkuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBlZXJNdXRhdGlvbkJ1bmRsZUVudHJ5KGVudHJ5LCBpbmRleCkge1xuICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGVudHJ5KSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBwZWVyIG11dGF0aW9uIGJ1bmRsZSBlbnRyeSAke2luZGV4fSBvYmplY3RgKVxuICBpZiAoIWVudHJ5LnNpZ25lZE11dGF0aW9uIHx8IHR5cGVvZiBlbnRyeS5zaWduZWRNdXRhdGlvbiAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGVudHJ5LnNpZ25lZE11dGF0aW9uKSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBwZWVyIG11dGF0aW9uIGJ1bmRsZSBlbnRyeSAke2luZGV4fSBzaWduZWRNdXRhdGlvbiBvYmplY3RgKVxuXG4gIC8qKiBAdHlwZSB7UGVlck11dGF0aW9uQnVuZGxlRW50cnl9ICovXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgc2lnbmVkTXV0YXRpb246IGVudHJ5LnNpZ25lZE11dGF0aW9uXG4gIH1cblxuICBpZiAoZW50cnkubG9jYWxSZWNvcmRJZCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLmxvY2FsUmVjb3JkSWQgPSByZXF1aXJlZFN0cmluZyhlbnRyeS5sb2NhbFJlY29yZElkLCBgZW50cnkgJHtpbmRleH0gbG9jYWxSZWNvcmRJZGApXG4gIGlmIChlbnRyeS5sb2NhbFNlcXVlbmNlICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQubG9jYWxTZXF1ZW5jZSA9IHBvc2l0aXZlSW50ZWdlcihlbnRyeS5sb2NhbFNlcXVlbmNlLCBgZW50cnkgJHtpbmRleH0gbG9jYWxTZXF1ZW5jZWApXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBMYWJlbC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RyaW5nLlxuICovXG5mdW5jdGlvbiByZXF1aXJlZFN0cmluZyh2YWx1ZSwgbGFiZWwpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHBlZXIgbXV0YXRpb24gYnVuZGxlICR7bGFiZWx9YClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIHBvc2l0aXZlIGludGVnZXIuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gVmFsdWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBMYWJlbC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gSW50ZWdlci5cbiAqL1xuZnVuY3Rpb24gcG9zaXRpdmVJbnRlZ2VyKHZhbHVlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcGVlciBtdXRhdGlvbiBidW5kbGUgJHtsYWJlbH0gcG9zaXRpdmUgaW50ZWdlcmApXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBJU08gdGltZXN0YW1wIGZyb20gYSB2YWxpZCBEYXRlLlxuICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gRGF0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIExhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBJU08gdGltZXN0YW1wLlxuICovXG5mdW5jdGlvbiBpc29UaW1lc3RhbXAoZGF0ZSwgbGFiZWwpIHtcbiAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHx8IE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwZWVyIG11dGF0aW9uIGJ1bmRsZSAke2xhYmVsfWApXG5cbiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBzYWZlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIC0gRXJyb3IuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnJvcikge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGVycm9yLm1lc3NhZ2VcblxuICByZXR1cm4gU3RyaW5nKGVycm9yKVxufVxuIl19
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlci1tdXRhdGlvbi1idW5kbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9wZWVyLW11dGF0aW9uLWJ1bmRsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFFdkc7Ozs7OztHQU1HO0FBQ0g7Ozs7OztHQU1HO0FBQ0gsTUFBTSwyQkFBMkIsR0FBRyx3Q0FBd0MsQ0FBQTtBQUM1RSxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFFL0U7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FBQyxFQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUM7SUFDakksTUFBTSxnQkFBZ0IsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMxRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDbkQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkQsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDeEQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFB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T0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSztJQUMvQixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBRXJILE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQzNCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixJQUFJLEtBQUssWUFBWSxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFBO0lBRWhELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtjcmVhdGVTaWduZWRNdXRhdGlvbiwgbXV0YXRpb25JZGVtcG90ZW5jeUtleSwgdmVyaWZ5U2lnbmVkTXV0YXRpb259IGZyb20gXCIuL2RldmljZS1pZGVudGl0eS5qc1wiXG5cbi8qKlxuICogUGVlciBtdXRhdGlvbiBidW5kbGUgZXhwb3J0ZWQgYnkgYSBkZXZpY2UgZm9yIG9mZmxpbmUvUDJQIHRyYW5zZmVyLlxuICogQHR5cGVkZWYge29iamVjdH0gUGVlck11dGF0aW9uQnVuZGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZXhwb3J0ZWRBdCAtIElTTyB0aW1lc3RhbXAgd2hlbiB0aGUgYnVuZGxlIHdhcyBleHBvcnRlZC5cbiAqIEBwcm9wZXJ0eSB7XCJ2ZWxvY2lvdXMuc3luYy5wZWVyLW11dGF0aW9uLWJ1bmRsZS52MVwifSBmb3JtYXQgLSBCdW5kbGUgZm9ybWF0IGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge1BlZXJNdXRhdGlvbkJ1bmRsZUVudHJ5W119IG11dGF0aW9ucyAtIFNpZ25lZCBtdXRhdGlvbnMgaW4gbG9jYWwgc2VxdWVuY2Ugb3JkZXIuXG4gKi9cbi8qKlxuICogT25lIHBlZXIgbXV0YXRpb24gYnVuZGxlIGVudHJ5LlxuICogQHR5cGVkZWYge29iamVjdH0gUGVlck11dGF0aW9uQnVuZGxlRW50cnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbG9jYWxSZWNvcmRJZF0gLSBFeHBvcnRpbmcgZGV2aWNlJ3MgbG9jYWwgbXV0YXRpb24gcmVjb3JkIGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtsb2NhbFNlcXVlbmNlXSAtIEV4cG9ydGluZyBkZXZpY2UncyBsb2NhbCBtdXRhdGlvbiBzZXF1ZW5jZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU2lnbmVkU3luY011dGF0aW9ufSBzaWduZWRNdXRhdGlvbiAtIERldmljZS1zaWduZWQgbXV0YXRpb24gZW52ZWxvcGUuXG4gKi9cbmNvbnN0IFBFRVJfTVVUQVRJT05fQlVORExFX0ZPUk1BVCA9IFwidmVsb2Npb3VzLnN5bmMucGVlci1tdXRhdGlvbi1idW5kbGUudjFcIlxuY29uc3QgRVhQT1JUQUJMRV9TVEFUVVNFUyA9IG5ldyBTZXQoW1wicGVuZGluZ1wiLCBcImFwcGxpZWQtbG9jYWxseVwiLCBcImNvbmZsaWN0XCJdKVxuXG4vKipcbiAqIEV4cG9ydHMgbG9jYWwgbm9uLXRlcm1pbmFsIG11dGF0aW9ucyBhcyBhIHNpZ25lZCBwZWVyLXRyYW5zZmVyIGJ1bmRsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5EZXZpY2VDZXJ0aWZpY2F0ZX0gYXJncy5kZXZpY2VDZXJ0aWZpY2F0ZSAtIERldmljZSBjZXJ0aWZpY2F0ZSBmb3Igc2lnbmluZyByZWNvcmRzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jSnNvbldlYktleX0gYXJncy5kZXZpY2VQcml2YXRlS2V5IC0gRGV2aWNlIHByaXZhdGUga2V5IGZvciBzaWduaW5nIHJlY29yZHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLmRlZmF1bHR9IGFyZ3MubXV0YXRpb25Mb2cgLSBMb2NhbCBtdXRhdGlvbiBsb2cuXG4gKiBAcGFyYW0geygpID0+IERhdGV9IFthcmdzLm5vd10gLSBFeHBvcnQgY2xvY2suXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25TdGF0dXNbXX0gW2FyZ3Muc3RhdHVzZXNdIC0gU3RhdHVzZXMgdG8gZXhwb3J0LlxuICogQHJldHVybnMge1Byb21pc2U8UGVlck11dGF0aW9uQnVuZGxlPn0gLSBTaWduZWQgcGVlciBtdXRhdGlvbiBidW5kbGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBvcnRQZWVyTXV0YXRpb25CdW5kbGUoe2RldmljZUNlcnRpZmljYXRlLCBkZXZpY2VQcml2YXRlS2V5LCBtdXRhdGlvbkxvZywgbm93ID0gKCkgPT4gbmV3IERhdGUoKSwgc3RhdHVzZXN9KSB7XG4gIGNvbnN0IHNlbGVjdGVkU3RhdHVzZXMgPSBub3JtYWxpemVFeHBvcnRTdGF0dXNlcyhzdGF0dXNlcylcbiAgY29uc3QgdGltZXN0YW1wID0gaXNvVGltZXN0YW1wKG5vdygpLCBcImV4cG9ydGVkQXRcIilcbiAgY29uc3QgcmVjb3JkcyA9IChhd2FpdCBtdXRhdGlvbkxvZy5yZWNvcmRzKCkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBzZWxlY3RlZFN0YXR1c2VzLmhhcyhyZWNvcmQuc3RhdHVzKSlcbiAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQuc2VxdWVuY2UgLSByaWdodC5zZXF1ZW5jZSlcbiAgY29uc3QgbXV0YXRpb25zID0gW11cblxuICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgbXV0YXRpb25zLnB1c2goe1xuICAgICAgbG9jYWxSZWNvcmRJZDogcmVjb3JkLmlkLFxuICAgICAgbG9jYWxTZXF1ZW5jZTogcmVjb3JkLnNlcXVlbmNlLFxuICAgICAgc2lnbmVkTXV0YXRpb246IGF3YWl0IGNyZWF0ZVNpZ25lZE11dGF0aW9uKHtcbiAgICAgICAgZGV2aWNlQ2VydGlmaWNhdGUsXG4gICAgICAgIGRldmljZVByaXZhdGVLZXksXG4gICAgICAgIG11dGF0aW9uOiByZWNvcmQubXV0YXRpb25cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhwb3J0ZWRBdDogdGltZXN0YW1wLFxuICAgIGZvcm1hdDogUEVFUl9NVVRBVElPTl9CVU5ETEVfRk9STUFULFxuICAgIG11dGF0aW9uc1xuICB9XG59XG5cbi8qKlxuICogSW1wb3J0cyB2ZXJpZmllZCBwZWVyIG11dGF0aW9ucyBpbnRvIHRoZSBsb2NhbCBtdXRhdGlvbiBsb2cuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY0pzb25XZWJLZXl9IGFyZ3MuYmFja2VuZFB1YmxpY0tleSAtIEJhY2tlbmQgcHVibGljIGtleSBmb3IgdmVyaWZ5aW5nIHBlZXIgY2VydGlmaWNhdGVzLlxuICogQHBhcmFtIHtQZWVyTXV0YXRpb25CdW5kbGV9IGFyZ3MuYnVuZGxlIC0gUGVlciBidW5kbGUgdG8gaW1wb3J0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5kZWZhdWx0fSBhcmdzLm11dGF0aW9uTG9nIC0gTG9jYWwgbXV0YXRpb24gbG9nLlxuICogQHBhcmFtIHtEYXRlfSBbYXJncy5ub3ddIC0gVmVyaWZpY2F0aW9uIHRpbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7aW1wb3J0ZWQ6IHtjbGllbnRNdXRhdGlvbklkOiBzdHJpbmcsIGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcsIGxvY2FsUmVjb3JkSWQ6IHN0cmluZ31bXSwgcmVqZWN0ZWQ6IHtlcnJvck1lc3NhZ2U6IHN0cmluZywgaW5kZXg6IG51bWJlcn1bXSwgc2tpcHBlZDoge2NsaWVudE11dGF0aW9uSWQ6IHN0cmluZywgaWRlbXBvdGVuY3lLZXk6IHN0cmluZywgbG9jYWxSZWNvcmRJZDogc3RyaW5nLCByZWFzb246IFwiZHVwbGljYXRlXCJ9W119Pn0gLSBJbXBvcnQgcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0UGVlck11dGF0aW9uQnVuZGxlKHtiYWNrZW5kUHVibGljS2V5LCBidW5kbGUsIG11dGF0aW9uTG9nLCBub3cgPSBuZXcgRGF0ZSgpfSkge1xuICBjb25zdCBub3JtYWxpemVkQnVuZGxlID0gbm9ybWFsaXplUGVlck11dGF0aW9uQnVuZGxlKGJ1bmRsZSlcbiAgY29uc3QgZXhpc3RpbmdSZWNvcmRzID0gYXdhaXQgbXV0YXRpb25Mb2cucmVjb3JkcygpXG4gIGNvbnN0IGV4aXN0aW5nQnlJZGVtcG90ZW5jeUtleSA9IG5ldyBNYXAoZXhpc3RpbmdSZWNvcmRzLm1hcCgocmVjb3JkKSA9PiBbbXV0YXRpb25JZGVtcG90ZW5jeUtleSh7bXV0YXRpb246IHJlY29yZC5tdXRhdGlvbn0pLCByZWNvcmRdKSlcbiAgLyoqIEB0eXBlIHt7Y2xpZW50TXV0YXRpb25JZDogc3RyaW5nLCBpZGVtcG90ZW5jeUtleTogc3RyaW5nLCBsb2NhbFJlY29yZElkOiBzdHJpbmd9W119ICovXG4gIGNvbnN0IGltcG9ydGVkID0gW11cbiAgLyoqIEB0eXBlIHt7ZXJyb3JNZXNzYWdlOiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9W119ICovXG4gIGNvbnN0IHJlamVjdGVkID0gW11cbiAgLyoqIEB0eXBlIHt7Y2xpZW50TXV0YXRpb25JZDogc3RyaW5nLCBpZGVtcG90ZW5jeUtleTogc3RyaW5nLCBsb2NhbFJlY29yZElkOiBzdHJpbmcsIHJlYXNvbjogXCJkdXBsaWNhdGVcIn1bXX0gKi9cbiAgY29uc3Qgc2tpcHBlZCA9IFtdXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGVudHJ5XSBvZiBub3JtYWxpemVkQnVuZGxlLm11dGF0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBtdXRhdGlvbiA9IGF3YWl0IHZlcmlmaWVkQnVuZGxlTXV0YXRpb24oe2JhY2tlbmRQdWJsaWNLZXksIGVudHJ5LCBpbmRleCwgbm93LCByZWplY3RlZH0pXG5cbiAgICBpZiAoIW11dGF0aW9uKSBjb250aW51ZVxuXG4gICAgY29uc3QgaWRlbXBvdGVuY3lLZXkgPSBtdXRhdGlvbklkZW1wb3RlbmN5S2V5KGVudHJ5LnNpZ25lZE11dGF0aW9uKVxuICAgIGNvbnN0IGR1cGxpY2F0ZVJlY29yZCA9IGV4aXN0aW5nQnlJZGVtcG90ZW5jeUtleS5nZXQoaWRlbXBvdGVuY3lLZXkpXG5cbiAgICBpZiAoZHVwbGljYXRlUmVjb3JkKSB7XG4gICAgICBza2lwcGVkLnB1c2goe1xuICAgICAgICBjbGllbnRNdXRhdGlvbklkOiBtdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkLFxuICAgICAgICBpZGVtcG90ZW5jeUtleSxcbiAgICAgICAgbG9jYWxSZWNvcmRJZDogZHVwbGljYXRlUmVjb3JkLmlkLFxuICAgICAgICByZWFzb246IC8qKiBAdHlwZSB7XCJkdXBsaWNhdGVcIn0gKi8gKFwiZHVwbGljYXRlXCIpXG4gICAgICB9KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBtdXRhdGlvbkxvZy5hcHBlbmQoe211dGF0aW9ufSlcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgbXV0YXRpb25Mb2cudXBkYXRlU3RhdHVzKHtpZDogcmVjb3JkLmlkLCBzdGF0dXM6IFwicGVlci1hcHBsaWVkXCJ9KVxuICAgIGV4aXN0aW5nQnlJZGVtcG90ZW5jeUtleS5zZXQoaWRlbXBvdGVuY3lLZXksIHVwZGF0ZWQpXG4gICAgaW1wb3J0ZWQucHVzaCh7Y2xpZW50TXV0YXRpb25JZDogbXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgaWRlbXBvdGVuY3lLZXksIGxvY2FsUmVjb3JkSWQ6IHVwZGF0ZWQuaWR9KVxuICB9XG5cbiAgcmV0dXJuIHtpbXBvcnRlZCwgcmVqZWN0ZWQsIHNraXBwZWR9XG59XG5cbi8qKlxuICogVmVyaWZpZXMgYSBidW5kbGUgbXV0YXRpb24gYW5kIHJlY29yZHMgbm9ybWFsIHBlci1lbnRyeSB2ZXJpZmljYXRpb24gcmVqZWN0aW9ucy5cbiAqIFN0b3JhZ2Ugd3JpdGVzIGludGVudGlvbmFsbHkgaGFwcGVuIG91dHNpZGUgdGhpcyBoZWxwZXIgc28gc3RvcmFnZSBmYWlsdXJlcyBlc2NhcGUgaW1wb3J0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNKc29uV2ViS2V5fSBhcmdzLmJhY2tlbmRQdWJsaWNLZXkgLSBCYWNrZW5kIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0ge1BlZXJNdXRhdGlvbkJ1bmRsZUVudHJ5fSBhcmdzLmVudHJ5IC0gQnVuZGxlIGVudHJ5LlxuICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuaW5kZXggLSBFbnRyeSBpbmRleC5cbiAqIEBwYXJhbSB7RGF0ZX0gYXJncy5ub3cgLSBWZXJpZmljYXRpb24gdGltZS5cbiAqIEBwYXJhbSB7e2Vycm9yTWVzc2FnZTogc3RyaW5nLCBpbmRleDogbnVtYmVyfVtdfSBhcmdzLnJlamVjdGVkIC0gUmVqZWN0aW9uIGFjY3VtdWxhdG9yLlxuICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9kZXZpY2UtaWRlbnRpdHkuanNcIikuU3luY011dGF0aW9uIHwgbnVsbD59IC0gVmVyaWZpZWQgbXV0YXRpb24sIG9yIG51bGwgd2hlbiByZWplY3RlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyaWZpZWRCdW5kbGVNdXRhdGlvbih7YmFja2VuZFB1YmxpY0tleSwgZW50cnksIGluZGV4LCBub3csIHJlamVjdGVkfSkge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB2ZXJpZnlTaWduZWRNdXRhdGlvbih7YmFja2VuZFB1YmxpY0tleSwgbm93LCBzaWduZWRNdXRhdGlvbjogZW50cnkuc2lnbmVkTXV0YXRpb259KVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdGVkLnB1c2goe2Vycm9yTWVzc2FnZTogZXJyb3JNZXNzYWdlKGVycm9yKSwgaW5kZXh9KVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgZXhwb3J0IHN0YXR1cyBmaWx0ZXJzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uU3RhdHVzW10gfCB1bmRlZmluZWR9IHN0YXR1c2VzIC0gT3B0aW9uYWwgc3RhdHVzZXMuXG4gKiBAcmV0dXJucyB7U2V0PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25TdGF0dXM+fSAtIFN0YXR1cyBzZXQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4cG9ydFN0YXR1c2VzKHN0YXR1c2VzKSB7XG4gIGlmIChzdGF0dXNlcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gLyoqIEB0eXBlIHtTZXQ8aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvblN0YXR1cz59ICovIChuZXcgU2V0KEVYUE9SVEFCTEVfU1RBVFVTRVMpKVxuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdHVzZXMpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBwZWVyIG11dGF0aW9uIGV4cG9ydCBzdGF0dXNlcyBhcnJheVwiKVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHN0YXR1cyBvZiBzdGF0dXNlcykge1xuICAgIGlmICghRVhQT1JUQUJMRV9TVEFUVVNFUy5oYXMoc3RhdHVzKSkgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwZWVyIG11dGF0aW9uIGV4cG9ydCBzdGF0dXMgJyR7U3RyaW5nKHN0YXR1cyl9J2ApXG4gICAgbm9ybWFsaXplZC5hZGQoc3RhdHVzKVxuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7U2V0PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25TdGF0dXM+fSAqLyAobm9ybWFsaXplZClcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGVlciBtdXRhdGlvbiBidW5kbGUuXG4gKiBAcGFyYW0ge1BlZXJNdXRhdGlvbkJ1bmRsZX0gYnVuZGxlIC0gQnVuZGxlIHZhbHVlLlxuICogQHJldHVybnMge1BlZXJNdXRhdGlvbkJ1bmRsZX0gLSBOb3JtYWxpemVkIGJ1bmRsZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGVlck11dGF0aW9uQnVuZGxlKGJ1bmRsZSkge1xuICBpZiAoIWJ1bmRsZSB8fCB0eXBlb2YgYnVuZGxlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYnVuZGxlKSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgcGVlciBtdXRhdGlvbiBidW5kbGUgb2JqZWN0XCIpXG4gIGlmIChidW5kbGUuZm9ybWF0ICE9PSBQRUVSX01VVEFUSU9OX0JVTkRMRV9GT1JNQVQpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcGVlciBtdXRhdGlvbiBidW5kbGUgZm9ybWF0ICcke1N0cmluZyhidW5kbGUuZm9ybWF0KX0nYClcbiAgaXNvVGltZXN0YW1wKG5ldyBEYXRlKHJlcXVpcmVkU3RyaW5nKGJ1bmRsZS5leHBvcnRlZEF0LCBcImV4cG9ydGVkQXRcIikpLCBcImV4cG9ydGVkQXRcIilcbiAgaWYgKCFBcnJheS5pc0FycmF5KGJ1bmRsZS5tdXRhdGlvbnMpKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBwZWVyIG11dGF0aW9uIGJ1bmRsZSBtdXRhdGlvbnMgYXJyYXlcIilcblxuICByZXR1cm4ge1xuICAgIGV4cG9ydGVkQXQ6IGJ1bmRsZS5leHBvcnRlZEF0LFxuICAgIGZvcm1hdDogYnVuZGxlLmZvcm1hdCxcbiAgICBtdXRhdGlvbnM6IGJ1bmRsZS5tdXRhdGlvbnMubWFwKChlbnRyeSwgaW5kZXgpID0+IG5vcm1hbGl6ZVBlZXJNdXRhdGlvbkJ1bmRsZUVudHJ5KGVudHJ5LCBpbmRleCkpXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG9uZSBwZWVyIG11dGF0aW9uIGJ1bmRsZSBlbnRyeS5cbiAqIEBwYXJhbSB7UGVlck11dGF0aW9uQnVuZGxlRW50cnl9IGVudHJ5IC0gQnVuZGxlIGVudHJ5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gRW50cnkgaW5kZXguXG4gKiBAcmV0dXJucyB7UGVlck11dGF0aW9uQnVuZGxlRW50cnl9IC0gTm9ybWFsaXplZCBlbnRyeS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGVlck11dGF0aW9uQnVuZGxlRW50cnkoZW50cnksIGluZGV4KSB7XG4gIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHBlZXIgbXV0YXRpb24gYnVuZGxlIGVudHJ5ICR7aW5kZXh9IG9iamVjdGApXG4gIGlmICghZW50cnkuc2lnbmVkTXV0YXRpb24gfHwgdHlwZW9mIGVudHJ5LnNpZ25lZE11dGF0aW9uICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkuc2lnbmVkTXV0YXRpb24pKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHBlZXIgbXV0YXRpb24gYnVuZGxlIGVudHJ5ICR7aW5kZXh9IHNpZ25lZE11dGF0aW9uIG9iamVjdGApXG5cbiAgLyoqIEB0eXBlIHtQZWVyTXV0YXRpb25CdW5kbGVFbnRyeX0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICBzaWduZWRNdXRhdGlvbjogZW50cnkuc2lnbmVkTXV0YXRpb25cbiAgfVxuXG4gIGlmIChlbnRyeS5sb2NhbFJlY29yZElkICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQubG9jYWxSZWNvcmRJZCA9IHJlcXVpcmVkU3RyaW5nKGVudHJ5LmxvY2FsUmVjb3JkSWQsIGBlbnRyeSAke2luZGV4fSBsb2NhbFJlY29yZElkYClcbiAgaWYgKGVudHJ5LmxvY2FsU2VxdWVuY2UgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5sb2NhbFNlcXVlbmNlID0gcG9zaXRpdmVJbnRlZ2VyKGVudHJ5LmxvY2FsU2VxdWVuY2UsIGBlbnRyeSAke2luZGV4fSBsb2NhbFNlcXVlbmNlYClcblxuICByZXR1cm4gbm9ybWFsaXplZFxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgbm9uLWVtcHR5IHN0cmluZy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIExhYmVsLlxuICogQHJldHVybnMge3N0cmluZ30gLSBTdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVkU3RyaW5nKHZhbHVlLCBsYWJlbCkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLmxlbmd0aCA8IDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcGVlciBtdXRhdGlvbiBidW5kbGUgJHtsYWJlbH1gKVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBWYWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAtIExhYmVsLlxuICogQHJldHVybnMge251bWJlcn0gLSBJbnRlZ2VyLlxuICovXG5mdW5jdGlvbiBwb3NpdGl2ZUludGVnZXIodmFsdWUsIGxhYmVsKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpIHx8IHZhbHVlIDwgMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBwZWVyIG11dGF0aW9uIGJ1bmRsZSAke2xhYmVsfSBwb3NpdGl2ZSBpbnRlZ2VyYClcblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFuIElTTyB0aW1lc3RhbXAgZnJvbSBhIHZhbGlkIERhdGUuXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBEYXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gTGFiZWwuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIElTTyB0aW1lc3RhbXAuXG4gKi9cbmZ1bmN0aW9uIGlzb1RpbWVzdGFtcChkYXRlLCBsYWJlbCkge1xuICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkgfHwgTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBlZXIgbXV0YXRpb24gYnVuZGxlICR7bGFiZWx9YClcblxuICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNhZmUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBFcnJvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZXJyb3JNZXNzYWdlKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZXJyb3IubWVzc2FnZVxuXG4gIHJldHVybiBTdHJpbmcoZXJyb3IpXG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"server-change-feed.d.ts","sourceRoot":"","sources":["../../../src/sync/server-change-feed.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-change-feed.d.ts","sourceRoot":"","sources":["../../../src/sync/server-change-feed.js"],"names":[],"mappings":"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"}
@@ -2,6 +2,38 @@
2
2
  import { randomUUID } from "crypto";
3
3
  import TableData from "../database/table-data/index.js";
4
4
  import stableJsonStringify from "./stable-json.js";
5
+ /**
6
+ * @typedef {object} ServerChangeFeedEntry
7
+ * @property {string | null} actorDeviceId - Signed mutation actor device id when available.
8
+ * @property {string | null} actorUserId - Signed mutation actor user id when available.
9
+ * @property {Record<string, ?> | null} attributes - Serialized mutation attributes.
10
+ * @property {string} createdAt - Server change creation timestamp.
11
+ * @property {string} id - Server change id.
12
+ * @property {string | null} idempotencyKey - Mutation idempotency key when available.
13
+ * @property {string} model - Frontend model name.
14
+ * @property {string} operation - Mutation operation.
15
+ * @property {Record<string, ?> | null} payload - Serialized mutation payload.
16
+ * @property {string | null} recordId - Changed record id when known.
17
+ * @property {Record<string, ?> | null} response - Command response payload.
18
+ * @property {Record<string, ?> | null} scope - Offline grant scope.
19
+ * @property {number} serverSequence - Monotonic server sequence.
20
+ */
21
+ /**
22
+ * @typedef {object} ServerChangeFeedRow
23
+ * @property {string | null} actor_device_id - Actor device id.
24
+ * @property {string | null} actor_user_id - Actor user id.
25
+ * @property {string | null} attributes_json - Attributes JSON.
26
+ * @property {Date | string} created_at - Creation time.
27
+ * @property {string} id - Entry id.
28
+ * @property {string | null} idempotency_key - Mutation idempotency key.
29
+ * @property {string} model - Frontend model name.
30
+ * @property {string} operation - Mutation operation.
31
+ * @property {string | null} payload_json - Mutation payload JSON.
32
+ * @property {string | null} record_id - Record id.
33
+ * @property {string | null} response_json - Response JSON.
34
+ * @property {string | null} scope_json - Scope JSON.
35
+ * @property {number | string} server_sequence - Server sequence.
36
+ */
5
37
  const DEFAULT_RETENTION_SIZE = 10000;
6
38
  const DEFAULT_PAGE_SIZE = 100;
7
39
  const MAX_PAGE_SIZE = 1000;
@@ -418,36 +450,4 @@ function scopesEqual(changeScope, requestedScope) {
418
450
  return true;
419
451
  return stableJsonStringify(changeScope || null) === stableJsonStringify(requestedScope);
420
452
  }
421
- /**
422
- * @typedef {object} ServerChangeFeedEntry
423
- * @property {string | null} actorDeviceId - Signed mutation actor device id when available.
424
- * @property {string | null} actorUserId - Signed mutation actor user id when available.
425
- * @property {Record<string, ?> | null} attributes - Serialized mutation attributes.
426
- * @property {string} createdAt - Server change creation timestamp.
427
- * @property {string} id - Server change id.
428
- * @property {string | null} idempotencyKey - Mutation idempotency key when available.
429
- * @property {string} model - Frontend model name.
430
- * @property {string} operation - Mutation operation.
431
- * @property {Record<string, ?> | null} payload - Serialized mutation payload.
432
- * @property {string | null} recordId - Changed record id when known.
433
- * @property {Record<string, ?> | null} response - Command response payload.
434
- * @property {Record<string, ?> | null} scope - Offline grant scope.
435
- * @property {number} serverSequence - Monotonic server sequence.
436
- */
437
- /**
438
- * @typedef {object} ServerChangeFeedRow
439
- * @property {string | null} actor_device_id - Actor device id.
440
- * @property {string | null} actor_user_id - Actor user id.
441
- * @property {string | null} attributes_json - Attributes JSON.
442
- * @property {Date | string} created_at - Creation time.
443
- * @property {string} id - Entry id.
444
- * @property {string | null} idempotency_key - Mutation idempotency key.
445
- * @property {string} model - Frontend model name.
446
- * @property {string} operation - Mutation operation.
447
- * @property {string | null} payload_json - Mutation payload JSON.
448
- * @property {string | null} record_id - Record id.
449
- * @property {string | null} response_json - Response JSON.
450
- * @property {string | null} scope_json - Scope JSON.
451
- * @property {number | string} server_sequence - Server sequence.
452
- */
453
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNoYW5nZS1mZWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc2VydmVyLWNoYW5nZS1mZWVkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sbUJBQW1CLE1BQU0sa0JBQWtCLENBQUE7QUFFbEQsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUE7QUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUE7QUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFBO0FBQzFCLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFBO0FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQ0FBcUMsQ0FBQyxhQUFhO0lBQ2pFLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHFCQUFxQjtJQUN4Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxhQUFhLEVBQUM7UUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtRQUU5RCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtR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UUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBRW5HLE9BQU8saUJBQWlCLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLO0lBQzVCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTlELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxXQUFXLEVBQUUsY0FBYztJQUM5QyxJQUFJLGNBQWMsS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFN0MsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDekYsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7R0FlRyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5pbXBvcnQgc3RhYmxlSnNvblN0cmluZ2lmeSBmcm9tIFwiLi9zdGFibGUtanNvbi5qc1wiXG5cbmNvbnN0IERFRkFVTFRfUkVURU5USU9OX1NJWkUgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9QQUdFX1NJWkUgPSAxMDBcbmNvbnN0IE1BWF9QQUdFX1NJWkUgPSAxMDAwXG5jb25zdCBUQUJMRV9OQU1FID0gXCJmcm9udGVuZF9tb2RlbF9zeW5jX2NoYW5nZXNcIlxuY29uc3Qgc3RvcmVzID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFNoYXJlZCBzZXJ2ZXIgY2hhbmdlLWZlZWQgc3RvcmUgZm9yIGEgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkU3RvcmV9IC0gU3RvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZXJDaGFuZ2VGZWVkU3RvcmVGb3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgbGV0IHN0b3JlID0gc3RvcmVzLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmICghc3RvcmUpIHtcbiAgICBzdG9yZSA9IG5ldyBTZXJ2ZXJDaGFuZ2VGZWVkU3RvcmUoe2NvbmZpZ3VyYXRpb259KVxuICAgIHN0b3Jlcy5zZXQoY29uZmlndXJhdGlvbiwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4gc3RvcmVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmVyQ2hhbmdlRmVlZFN0b3JlIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kYXRhYmFzZUlkZW50aWZpZXJdIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnJldGVudGlvblNpemVdIC0gTnVtYmVyIG9mIGZlZWQgZW50cmllcyB0byByZXRhaW4uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyID0gXCJkZWZhdWx0XCIsIHJldGVudGlvblNpemV9KSB7XG4gICAgY29uc3Qgc3luY0NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKClcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmRhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMucmV0ZW50aW9uU2l6ZSA9IHJldGVudGlvblNpemUgfHwgc3luY0NvbmZpZ3VyYXRpb24uY2hhbmdlRmVlZFJldGVudGlvblNpemUgfHwgREVGQVVMVF9SRVRFTlRJT05fU0laRVxuICAgIC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5W119ICovXG4gICAgdGhpcy5fbWVtb3J5Q2hhbmdlcyA9IFtdXG4gICAgdGhpcy5fbWVtb3J5U2VxdWVuY2UgPSAwXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGJhY2tpbmcgdGFibGUgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHtcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5fc2NoZW1hUmVhZHkoKSkgcmV0dXJuXG4gICAgaWYgKHRoaXMuX3JlYWR5UHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlQ2hhbmdlc1RhYmxlKGRiKVxuICAgICAgfSlcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgfSkoKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVhZHkpIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNoYW5nZSBhbmQgYXNzaWducyB0aGUgbmV4dCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7T21pdDxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnksIFwiY3JlYXRlZEF0XCIgfCBcImlkXCIgfCBcInNlcnZlclNlcXVlbmNlXCI+ICYge2NyZWF0ZWRBdD86IHN0cmluZywgaWQ/OiBzdHJpbmd9fSBjaGFuZ2UgLSBDaGFuZ2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmVyQ2hhbmdlRmVlZEVudHJ5Pn0gLSBQZXJzaXN0ZWQgY2hhbmdlLlxuICAgKi9cbiAgYXN5bmMgYXBwZW5kKGNoYW5nZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgaWQgPSBjaGFuZ2UuaWQgfHwgcmFuZG9tVVVJRCgpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gY2hhbmdlLmNyZWF0ZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSByZXR1cm4gdGhpcy5fYXBwZW5kTWVtb3J5KHsuLi5jaGFuZ2UsIGNyZWF0ZWRBdCwgaWR9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGF3YWl0IGRiLmluc2VydCh7XG4gICAgICAgIHRhYmxlTmFtZTogVEFCTEVfTkFNRSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGFjdG9yX2RldmljZV9pZDogY2hhbmdlLmFjdG9yRGV2aWNlSWQsXG4gICAgICAgICAgYWN0b3JfdXNlcl9pZDogY2hhbmdlLmFjdG9yVXNlcklkLFxuICAgICAgICAgIGF0dHJpYnV0ZXNfanNvbjogSlNPTi5zdHJpbmdpZnkoY2hhbmdlLmF0dHJpYnV0ZXMgfHwgbnVsbCksXG4gICAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoY3JlYXRlZEF0KSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBpZGVtcG90ZW5jeV9rZXk6IGNoYW5nZS5pZGVtcG90ZW5jeUtleSxcbiAgICAgICAgICBtb2RlbDogY2hhbmdlLm1vZGVsLFxuICAgICAgICAgIG9wZXJhdGlvbjogY2hhbmdlLm9wZXJhdGlvbixcbiAgICAgICAgICBwYXlsb2FkX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5wYXlsb2FkIHx8IG51bGwpLFxuICAgICAgICAgIHJlY29yZF9pZDogY2hhbmdlLnJlY29yZElkID09PSBudWxsIHx8IGNoYW5nZS5yZWNvcmRJZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhjaGFuZ2UucmVjb3JkSWQpLFxuICAgICAgICAgIHJlc3BvbnNlX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5yZXNwb25zZSB8fCBudWxsKSxcbiAgICAgICAgICBzY29wZV9qc29uOiBzdGFibGVKc29uU3RyaW5naWZ5KGNoYW5nZS5zY29wZSB8fCBudWxsKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLl9jaGFuZ2VCeUlkKGRiLCBpZClcbiAgICAgIGlmICghcm93KSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGVyc2lzdCBzZXJ2ZXIgY2hhbmdlLWZlZWQgZW50cnlcIilcblxuICAgICAgYXdhaXQgdGhpcy5fcHJ1bmVSZXRhaW5lZENoYW5nZXMoZGIsIHJvdy5zZXJ2ZXJTZXF1ZW5jZSlcblxuICAgICAgcmV0dXJuIHJvd1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50IGxhdGVzdCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gTGF0ZXN0IHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgbGF0ZXN0U2VxdWVuY2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeVNlcXVlbmNlXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBERVNDXCIpXG4gICAgICAgIC5saW1pdCgxKVxuICAgICAgICAucmVzdWx0cygpXG4gICAgICBjb25zdCByb3cgPSAvKiogQHR5cGUge3tzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9IHwgdW5kZWZpbmVkfSAqLyAocm93c1swXSlcblxuICAgICAgcmV0dXJuIHJvdyA/IE51bWJlcihyb3cuc2VydmVyX3NlcXVlbmNlKSA6IDBcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb2xkZXN0IHJldGFpbmVkIHNlcnZlciBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59IC0gT2xkZXN0IHJldGFpbmVkIHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgb2xkZXN0U2VxdWVuY2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeUNoYW5nZXNbMF0/LnNlcnZlclNlcXVlbmNlIHx8IG51bGxcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiBhd2FpdCB0aGlzLl9vbGRlc3RTZXF1ZW5jZShkYikpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvcmRlcmVkIGNoYW5nZXMgYWZ0ZXIgYSBjdXJzb3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hZnRlclNlcXVlbmNlIC0gRXhjbHVzaXZlIGxvd2VyIGJvdW5kLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubGltaXRdIC0gTWF4aW11bSBudW1iZXIgb2YgY2hhbmdlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnVwVG9TZXF1ZW5jZV0gLSBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLnNjb3BlXSAtIENhbGxlciBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9Pn0gLSBPcmRlcmVkIHBhZ2UuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0ID0gREVGQVVMVF9QQUdFX1NJWkUsIHNjb3BlLCB1cFRvU2VxdWVuY2V9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IG5vcm1hbGl6ZUxpbWl0KGxpbWl0KVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0OiBwYWdlU2l6ZSwgc2NvcGUsIHVwVG9TZXF1ZW5jZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3QgbGF0ZXN0U2VxdWVuY2UgPSB0eXBlb2YgdXBUb1NlcXVlbmNlID09PSBcIm51bWJlclwiID8gdXBUb1NlcXVlbmNlIDogYXdhaXQgdGhpcy5fbGF0ZXN0U2VxdWVuY2UoZGIpXG4gICAgICBjb25zdCBvbGRlc3RTZXF1ZW5jZSA9IGF3YWl0IHRoaXMuX29sZGVzdFNlcXVlbmNlKGRiKVxuICAgICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgICAgaWYgKHNuYXBzaG90UmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICBuZXh0U2VxdWVuY2U6IGFmdGVyU2VxdWVuY2UsXG4gICAgICAgICAgb2xkZXN0U2VxdWVuY2UsXG4gICAgICAgICAgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB1cFRvU2VxdWVuY2U6IGxhdGVzdFNlcXVlbmNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZFJvd1tdfSAqLyAoYXdhaXQgZGJcbiAgICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgICAgLndoZXJlKGBzZXJ2ZXJfc2VxdWVuY2UgPiAke2RiLnF1b3RlKGFmdGVyU2VxdWVuY2UpfWApXG4gICAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlIDw9ICR7ZGIucXVvdGUobGF0ZXN0U2VxdWVuY2UpfWApXG4gICAgICAgIC53aGVyZShzY29wZSA9PT0gdW5kZWZpbmVkID8gXCIxID0gMVwiIDoge3Njb3BlX2pzb246IHN0YWJsZUpzb25TdHJpbmdpZnkoc2NvcGUpfSlcbiAgICAgICAgLm9yZGVyKFwic2VydmVyX3NlcXVlbmNlIEFTQ1wiKVxuICAgICAgICAubGltaXQocGFnZVNpemUgKyAxKVxuICAgICAgICAucmVzdWx0cygpKVxuICAgICAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gcGFnZVNpemVcbiAgICAgIGNvbnN0IHBhZ2VSb3dzID0gcm93cy5zbGljZSgwLCBwYWdlU2l6ZSlcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBwYWdlUm93cy5tYXAoKHJvdykgPT4gdGhpcy5fbm9ybWFsaXplQ2hhbmdlUm93KHJvdykpXG4gICAgICBjb25zdCBsYXN0Q2hhbmdlID0gY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXMsXG4gICAgICAgIGhhc01vcmUsXG4gICAgICAgIG5leHRTZXF1ZW5jZTogbGFzdENoYW5nZSA/IGxhc3RDaGFuZ2Uuc2VydmVyU2VxdWVuY2UgOiBhZnRlclNlcXVlbmNlLFxuICAgICAgICBvbGRlc3RTZXF1ZW5jZSxcbiAgICAgICAgc25hcHNob3RSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgc2NoZW1hIGlzIHN0aWxsIHByZXNlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgcmVhZHkuXG4gICAqL1xuICBhc3luYyBfc2NoZW1hUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9pc1JlYWR5XG4gICAgaWYgKCF0aGlzLl9pc1JlYWR5KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4gYXdhaXQgZGIudGFibGVFeGlzdHMoVEFCTEVfTkFNRSkpKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBjaGFuZ2VzIHRhYmxlIGV4aXN0cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZUNoYW5nZXNUYWJsZShkYikge1xuICAgIGlmIChhd2FpdCBkYi50YWJsZUV4aXN0cyhUQUJMRV9OQU1FKSkgcmV0dXJuXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZURhdGEoVEFCTEVfTkFNRSwge2lmTm90RXhpc3RzOiB0cnVlfSlcblxuICAgIHRhYmxlLmludGVnZXIoXCJzZXJ2ZXJfc2VxdWVuY2VcIiwge2F1dG9JbmNyZW1lbnQ6IHRydWUsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJtb2RlbFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJvcGVyYXRpb25cIiwge251bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJyZWNvcmRfaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwicGF5bG9hZF9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwiYXR0cmlidXRlc19qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZGVtcG90ZW5jeV9rZXlcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJhY3Rvcl91c2VyX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiYWN0b3JfZGV2aWNlX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcInNjb3BlX2pzb25cIiwge251bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJyZXNwb25zZV9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5kYXRldGltZShcImNyZWF0ZWRfYXRcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG5cbiAgICBhd2FpdCBkYi5jcmVhdGVUYWJsZSh0YWJsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHBlcnNpc3RlZCBjaGFuZ2UgYnkgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gRW50cnkgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckNoYW5nZUZlZWRFbnRyeSB8IG51bGw+fSAtIEVudHJ5IG9yIG51bGwuXG4gICAqL1xuICBhc3luYyBfY2hhbmdlQnlJZChkYiwgaWQpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93W119ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAud2hlcmUoe2lkfSlcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gdGhpcy5fbm9ybWFsaXplQ2hhbmdlUm93KHJvd3NbMF0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGN1cnJlbnQgbGF0ZXN0IHNlcXVlbmNlIHdpdGhvdXQgcmVhZGluZXNzIGNoZWNrcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIExhdGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIF9sYXRlc3RTZXF1ZW5jZShkYikge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBERVNDXCIpXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IE51bWJlcihyb3dzWzBdLnNlcnZlcl9zZXF1ZW5jZSkgOiAwXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY3VycmVudCBvbGRlc3Qgc2VxdWVuY2Ugd2l0aG91dCByZWFkaW5lc3MgY2hlY2tzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIE9sZGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIF9vbGRlc3RTZXF1ZW5jZShkYikge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBBU0NcIilcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gTnVtYmVyKHJvd3NbMF0uc2VydmVyX3NlcXVlbmNlKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBQcnVuZXMgb2xkIHJldGFpbmVkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxhdGVzdFNlcXVlbmNlIC0gTGF0ZXN0IHNlcXVlbmNlIGFmdGVyIGFwcGVuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9wcnVuZVJldGFpbmVkQ2hhbmdlcyhkYiwgbGF0ZXN0U2VxdWVuY2UpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodGhpcy5yZXRlbnRpb25TaXplKSB8fCB0aGlzLnJldGVudGlvblNpemUgPCAxKSByZXR1cm5cblxuICAgIGNvbnN0IHBydW5lQmVmb3JlT3JBdCA9IGxhdGVzdFNlcXVlbmNlIC0gdGhpcy5yZXRlbnRpb25TaXplXG4gICAgaWYgKHBydW5lQmVmb3JlT3JBdCA8IDEpIHJldHVyblxuXG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e2lkOiBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlIDw9ICR7ZGIucXVvdGUocHJ1bmVCZWZvcmVPckF0KX1gKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IGRiLmRlbGV0ZSh7Y29uZGl0aW9uczoge2lkOiByb3cuaWR9LCB0YWJsZU5hbWU6IFRBQkxFX05BTUV9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGEgY2hhbmdlIHJvdy5cbiAgICogQHBhcmFtIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93fSByb3cgLSBSYXcgZGF0YWJhc2Ugcm93LlxuICAgKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAtIE5vcm1hbGl6ZWQgY2hhbmdlLlxuICAgKi9cbiAgX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3cpIHtcbiAgICBjb25zdCBjcmVhdGVkQXRWYWx1ZSA9IHJvdy5jcmVhdGVkX2F0XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0b3JEZXZpY2VJZDogcm93LmFjdG9yX2RldmljZV9pZCB8fCBudWxsLFxuICAgICAgYWN0b3JVc2VySWQ6IHJvdy5hY3Rvcl91c2VyX2lkIHx8IG51bGwsXG4gICAgICBhdHRyaWJ1dGVzOiBwYXJzZUpzb25Pck51bGwocm93LmF0dHJpYnV0ZXNfanNvbiksXG4gICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWRBdFZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGNyZWF0ZWRBdFZhbHVlLnRvSVNPU3RyaW5nKCkgOiBuZXcgRGF0ZShjcmVhdGVkQXRWYWx1ZSkudG9JU09TdHJpbmcoKSxcbiAgICAgIGlkOiByb3cuaWQsXG4gICAgICBpZGVtcG90ZW5jeUtleTogcm93LmlkZW1wb3RlbmN5X2tleSB8fCBudWxsLFxuICAgICAgbW9kZWw6IHJvdy5tb2RlbCxcbiAgICAgIG9wZXJhdGlvbjogcm93Lm9wZXJhdGlvbixcbiAgICAgIHBheWxvYWQ6IHBhcnNlSnNvbk9yTnVsbChyb3cucGF5bG9hZF9qc29uKSxcbiAgICAgIHJlY29yZElkOiByb3cucmVjb3JkX2lkIHx8IG51bGwsXG4gICAgICByZXNwb25zZTogcGFyc2VKc29uT3JOdWxsKHJvdy5yZXNwb25zZV9qc29uKSxcbiAgICAgIHNjb3BlOiBwYXJzZUpzb25Pck51bGwocm93LnNjb3BlX2pzb24pLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IE51bWJlcihyb3cuc2VydmVyX3NlcXVlbmNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3RvcmUgc2hvdWxkIHVzZSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBiZWNhdXNlIG5vIGRhdGFiYXNlIGlkZW50aWZpZXIgaXMgY29uZmlndXJlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBtZW1vcnkgc3RvcmFnZSBpcyBhY3RpdmUuXG4gICAqL1xuICBfdXNlc01lbW9yeVN0b3JhZ2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlQ29uZmlndXJhdGlvbigpW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIHByb2Nlc3MtbG9jYWwgbWVtb3J5IGVudHJ5IHdoZW4gbm8gZGF0YWJhc2UgaXMgY29uZmlndXJlZC5cbiAgICogQHBhcmFtIHtPbWl0PFNlcnZlckNoYW5nZUZlZWRFbnRyeSwgXCJzZXJ2ZXJTZXF1ZW5jZVwiPn0gY2hhbmdlIC0gQ2hhbmdlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9IC0gQXBwZW5kZWQgZW50cnkuXG4gICAqL1xuICBfYXBwZW5kTWVtb3J5KGNoYW5nZSkge1xuICAgIGNvbnN0IGVudHJ5ID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9ICovICh7XG4gICAgICBhY3RvckRldmljZUlkOiBjaGFuZ2UuYWN0b3JEZXZpY2VJZCxcbiAgICAgIGFjdG9yVXNlcklkOiBjaGFuZ2UuYWN0b3JVc2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBjaGFuZ2UuYXR0cmlidXRlcyB8fCBudWxsLFxuICAgICAgY3JlYXRlZEF0OiBjaGFuZ2UuY3JlYXRlZEF0LFxuICAgICAgaWQ6IGNoYW5nZS5pZCxcbiAgICAgIGlkZW1wb3RlbmN5S2V5OiBjaGFuZ2UuaWRlbXBvdGVuY3lLZXksXG4gICAgICBtb2RlbDogY2hhbmdlLm1vZGVsLFxuICAgICAgb3BlcmF0aW9uOiBjaGFuZ2Uub3BlcmF0aW9uLFxuICAgICAgcGF5bG9hZDogY2hhbmdlLnBheWxvYWQgfHwgbnVsbCxcbiAgICAgIHJlY29yZElkOiBjaGFuZ2UucmVjb3JkSWQgPT09IG51bGwgfHwgY2hhbmdlLnJlY29yZElkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGNoYW5nZS5yZWNvcmRJZCksXG4gICAgICByZXNwb25zZTogY2hhbmdlLnJlc3BvbnNlIHx8IG51bGwsXG4gICAgICBzY29wZTogY2hhbmdlLnNjb3BlIHx8IG51bGwsXG4gICAgICBzZXJ2ZXJTZXF1ZW5jZTogKyt0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICB0aGlzLl9tZW1vcnlDaGFuZ2VzLnB1c2goZW50cnkpXG4gICAgaWYgKHRoaXMuX21lbW9yeUNoYW5nZXMubGVuZ3RoID4gdGhpcy5yZXRlbnRpb25TaXplKSB0aGlzLl9tZW1vcnlDaGFuZ2VzLnNwbGljZSgwLCB0aGlzLl9tZW1vcnlDaGFuZ2VzLmxlbmd0aCAtIHRoaXMucmV0ZW50aW9uU2l6ZSlcblxuICAgIHJldHVybiBlbnRyeVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBjaGFuZ2UgcGFnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmFmdGVyU2VxdWVuY2UgLSBFeGNsdXNpdmUgbG93ZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmxpbWl0IC0gUGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudXBUb1NlcXVlbmNlXSAtIEluY2x1c2l2ZSB1cHBlciBib3VuZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3Muc2NvcGVdIC0gQ2FsbGVyIHN5bmMgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9fSAtIE9yZGVyZWQgcGFnZS5cbiAgICovXG4gIF9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0LCBzY29wZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGNvbnN0IGxhdGVzdFNlcXVlbmNlID0gdHlwZW9mIHVwVG9TZXF1ZW5jZSA9PT0gXCJudW1iZXJcIiA/IHVwVG9TZXF1ZW5jZSA6IHRoaXMuX21lbW9yeVNlcXVlbmNlXG4gICAgY29uc3Qgb2xkZXN0U2VxdWVuY2UgPSB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG4gICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgIGlmIChzbmFwc2hvdFJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4ge2NoYW5nZXM6IFtdLCBoYXNNb3JlOiBmYWxzZSwgbmV4dFNlcXVlbmNlOiBhZnRlclNlcXVlbmNlLCBvbGRlc3RTZXF1ZW5jZSwgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fbWVtb3J5Q2hhbmdlcy5maWx0ZXIoKGNoYW5nZSkgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgJiYgY2hhbmdlLnNlcnZlclNlcXVlbmNlIDw9IGxhdGVzdFNlcXVlbmNlICYmIHNjb3Blc0VxdWFsKGNoYW5nZS5zY29wZSwgc2NvcGUpXG4gICAgfSlcbiAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdFxuICAgIGNvbnN0IGNoYW5nZXMgPSByb3dzLnNsaWNlKDAsIGxpbWl0KVxuICAgIGNvbnN0IGxhc3RDaGFuZ2UgPSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV1cblxuICAgIHJldHVybiB7Y2hhbmdlcywgaGFzTW9yZSwgbmV4dFNlcXVlbmNlOiBsYXN0Q2hhbmdlID8gbGFzdENoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA6IGFmdGVyU2VxdWVuY2UsIG9sZGVzdFNlcXVlbmNlLCBzbmFwc2hvdFJlcXVpcmVkOiBmYWxzZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZGIuXG4gICAqIEBwYXJhbSB7KGRiOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTw/Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX3dpdGhEYihjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe2RhdGFiYXNlSWRlbnRpZmllcnM6IFt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl0sIG5hbWU6IFwiU2VydmVyIGNoYW5nZS1mZWVkIHN0b3JlXCJ9LCBhc3luYyAoZGJzKSA9PiB7XG4gICAgICBjb25zdCBkYiA9IGRic1t0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cblxuICAgICAgaWYgKCFkYikgdGhyb3cgbmV3IEVycm9yKGBObyBkYXRhYmFzZSBjb25uZWN0aW9uIGF2YWlsYWJsZSBmb3IgaWRlbnRpZmllcjogJHt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcn1gKVxuXG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soZGIpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcGFnZSBsaW1pdC5cbiAqIEBwYXJhbSB7P30gbGltaXQgLSBSZXF1ZXN0ZWQgbGltaXQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFBhZ2Ugc2l6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTGltaXQobGltaXQpIHtcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSAmJiBsaW1pdCA+IDApIHJldHVybiBNYXRoLm1pbihsaW1pdCwgTUFYX1BBR0VfU0laRSlcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCskLy50ZXN0KGxpbWl0KSkgcmV0dXJuIE1hdGgubWluKE51bWJlcihsaW1pdCksIE1BWF9QQUdFX1NJWkUpXG5cbiAgcmV0dXJuIERFRkFVTFRfUEFHRV9TSVpFXG59XG5cbi8qKlxuICogUGFyc2VzIEpTT04taXNoIHZhbHVlcy5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBKU09OIHN0cmluZy5cbiAqIEByZXR1cm5zIHs/fSAtIFBhcnNlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uT3JOdWxsKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGxcblxuICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBzeW5jIHNjb3BlcyBieSBzdGFibGUgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBjaGFuZ2VTY29wZSAtIFBlcnNpc3RlZCBjaGFuZ2Ugc2NvcGUuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSByZXF1ZXN0ZWRTY29wZSAtIENhbGxlciBzY29wZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNoYW5nZSBpcyB2aXNpYmxlIGZvciB0aGUgcmVxdWVzdGVkIHNjb3BlLlxuICovXG5mdW5jdGlvbiBzY29wZXNFcXVhbChjaGFuZ2VTY29wZSwgcmVxdWVzdGVkU2NvcGUpIHtcbiAgaWYgKHJlcXVlc3RlZFNjb3BlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIHN0YWJsZUpzb25TdHJpbmdpZnkoY2hhbmdlU2NvcGUgfHwgbnVsbCkgPT09IHN0YWJsZUpzb25TdHJpbmdpZnkocmVxdWVzdGVkU2NvcGUpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZEVudHJ5XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yRGV2aWNlSWQgLSBTaWduZWQgbXV0YXRpb24gYWN0b3IgZGV2aWNlIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3RvclVzZXJJZCAtIFNpZ25lZCBtdXRhdGlvbiBhY3RvciB1c2VyIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IGF0dHJpYnV0ZXMgLSBTZXJpYWxpemVkIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3JlYXRlZEF0IC0gU2VydmVyIGNoYW5nZSBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTZXJ2ZXIgY2hhbmdlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpZGVtcG90ZW5jeUtleSAtIE11dGF0aW9uIGlkZW1wb3RlbmN5IGtleSB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gTXV0YXRpb24gb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IHBheWxvYWQgLSBTZXJpYWxpemVkIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlY29yZElkIC0gQ2hhbmdlZCByZWNvcmQgaWQgd2hlbiBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSByZXNwb25zZSAtIENvbW1hbmQgcmVzcG9uc2UgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBzY29wZSAtIE9mZmxpbmUgZ3JhbnQgc2NvcGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2VydmVyU2VxdWVuY2UgLSBNb25vdG9uaWMgc2VydmVyIHNlcXVlbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZFJvd1xuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3Rvcl9kZXZpY2VfaWQgLSBBY3RvciBkZXZpY2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yX3VzZXJfaWQgLSBBY3RvciB1c2VyIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhdHRyaWJ1dGVzX2pzb24gLSBBdHRyaWJ1dGVzIEpTT04uXG4gKiBAcHJvcGVydHkge0RhdGUgfCBzdHJpbmd9IGNyZWF0ZWRfYXQgLSBDcmVhdGlvbiB0aW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRW50cnkgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGlkZW1wb3RlbmN5X2tleSAtIE11dGF0aW9uIGlkZW1wb3RlbmN5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gTXV0YXRpb24gb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBwYXlsb2FkX2pzb24gLSBNdXRhdGlvbiBwYXlsb2FkIEpTT04uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlY29yZF9pZCAtIFJlY29yZCBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcmVzcG9uc2VfanNvbiAtIFJlc3BvbnNlIEpTT04uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHNjb3BlX2pzb24gLSBTY29wZSBKU09OLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IHNlcnZlcl9zZXF1ZW5jZSAtIFNlcnZlciBzZXF1ZW5jZS5cbiAqL1xuIl19
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLWNoYW5nZS1mZWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc2VydmVyLWNoYW5nZS1mZWVkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGlDQUFpQyxDQUFBO0FBQ3ZELE9BQU8sbUJBQW1CLE1BQU0sa0JBQWtCLENBQUE7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUE7QUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUE7QUFDN0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFBO0FBQzFCLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFBO0FBQ2hELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQ0FBcUMsQ0FBQyxhQUFhO0lBQ2pFLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLHFCQUFxQjtJQUN4Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxhQUFhLEVBQUM7UUFDeEUsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtRQUU5RCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUE7UUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLElBQUksaUJBQWlCLENBQUMsdUJBQXVCLElBQUksc0JBQXNCLENBQUE7UUFDekcsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsV0FBVztRQUNmLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtZQUNwQixPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQUUsT0FBTTtRQUNyQyxJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUE7UUFFdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUE7WUFDL0IsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDcEMsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtRQUN0QixDQUFDLENBQUMsRUFBRSxDQUFBO1FBRUosSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFBO1FBQzFCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtnQkFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDakIsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFeEIsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxVQUFVLEVBQUUsQ0FBQTtRQUNwQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFOUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBQyxHQUFHLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQTtRQUVwRixPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDckMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUNkLFNBQVMsRUFBRSxVQUFVO2dCQUNyQixJQUFJLEVBQUU7b0JBQ0osZUFBZSxFQUFFLE1BQU0sQ0FBQyxhQUFhO29CQUNyQyxhQUFhLEVBQUUsTUFBTSxDQUFDLFdBQVc7b0JBQ2pDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO29CQUMxRCxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUMvQixFQUFFO29CQUNGLGVBQWUsRUFBRSxNQUFNLENBQUMsY0FBYztvQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7b0JBQzNCLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDO29CQUNwRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7b0JBQ3JHLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO29CQUN0RCxVQUFVLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7aUJBQ3REO2FBQ0YsQ0FBQyxDQUFBO1lBRUYsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUMxQyxJQUFJLENBQUMsR0FBRztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7WUFFdkUsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUV4RCxPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBRXhCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFBO1FBRTFELE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUU7aUJBQ2xCLFFBQVEsRUFBRTtpQkFDVixJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNoQixLQUFLLENBQUMsc0JBQXNCLENBQUM7aUJBQzdCLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ1IsT0FBTyxFQUFFLENBQUE7WUFDWixNQUFNLEdBQUcsR0FBRyw4REFBOEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRXBGLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDOUMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFeEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQTtRQUVwRixPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN6RSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUMsYUFBYSxFQUFFLEtBQUssR0FBRyxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFDO1FBQ2hGLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBRXhCLE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV0QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7UUFFckgsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sY0FBYyxHQUFHLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDdkcsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxHQUFHLENBQUMsSUFBSSxjQUFjLEtBQUssSUFBSSxJQUFJLGNBQWMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFBO1lBRTNHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsT0FBTztvQkFDTCxPQUFPLEVBQUUsRUFBRTtvQkFDWCxPQUFPLEVBQUUsS0FBSztvQkFDZCxZQUFZLEVBQUUsYUFBYTtvQkFDM0IsY0FBYztvQkFDZCxnQkFBZ0IsRUFBRSxJQUFJO29CQUN0QixZQUFZLEVBQUUsY0FBYztpQkFDN0IsQ0FBQTtZQUNILENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxvQ0FBb0MsQ0FBQyxDQUFDLE1BQU0sRUFBRTtpQkFDeEQsUUFBUSxFQUFFO2lCQUNWLElBQUksQ0FBQyxVQUFVLENBQUM7aUJBQ2hCLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2lCQUNyRCxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztpQkFDdkQsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztpQkFDL0UsS0FBSyxDQUFDLHFCQUFxQixDQUFDO2lCQUM1QixLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztpQkFDbkIsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUNiLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFBO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ3hDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ3BFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBRTlDLE9BQU87Z0JBQ0wsT0FBTztnQkFDUCxPQUFPO2dCQUNQLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWE7Z0JBQ3BFLGNBQWM7Z0JBQ2QsZ0JBQWdCLEVBQUUsS0FBSztnQkFDdkIsWUFBWSxFQUFFLGNBQWM7YUFDN0IsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxZQUFZO1FBQ2hCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFBO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFBO1FBQ2hDLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRW5GLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1FBRXpCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFBRTtRQUMxQixJQUFJLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFBRSxPQUFNO1FBRTVDLE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBRTVELEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDdEYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBQzlDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtRQUNqRCxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBQ3hDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUNwRCxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUMzQyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUMxRCxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDeEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDMUQsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ3pDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtRQUV4RCxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRTtRQUN0QixNQUFNLElBQUksR0FBRyxvQ0FBb0MsQ0FBQyxDQUFDLE1BQU0sRUFBRTthQUN4RCxRQUFRLEVBQUU7YUFDVixJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ2hCLEtBQUssQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDO2FBQ1gsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNSLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFFYixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7SUFDM0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUU7UUFDdEIsTUFBTSxJQUFJLEdBQUcseURBQXlELENBQUMsQ0FBQyxNQUFNLEVBQUU7YUFDN0UsUUFBUSxFQUFFO2FBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNoQixLQUFLLENBQUMsc0JBQXNCLENBQUM7YUFDN0IsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUNSLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFFYixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLHlEQUF5RCxDQUFDLENBQUMsTUFBTSxFQUFFO2FBQzdFLFFBQVEsRUFBRTthQUNWLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDaEIsS0FBSyxDQUFDLHFCQUFxQixDQUFDO2FBQzVCLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDUixPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBRWIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUN6RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLGNBQWM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQztZQUFFLE9BQU07UUFFM0UsTUFBTSxlQUFlLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUE7UUFDM0QsSUFBSSxlQUFlLEdBQUcsQ0FBQztZQUFFLE9BQU07UUFFL0IsTUFBTSxJQUFJLEdBQUcsa0NBQWtDLENBQUMsQ0FBQyxNQUFNLEVBQUU7YUFDdEQsUUFBUSxFQUFFO2FBQ1YsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNoQixLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQzthQUN4RCxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBRWIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBQyxVQUFVLEVBQUUsRUFBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBQyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLEdBQUc7UUFDckIsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQTtRQUVyQyxPQUFPO1lBQ0wsYUFBYSxFQUFFLEdBQUcsQ0FBQyxlQUFlLElBQUksSUFBSTtZQUMxQyxXQUFXLEVBQUUsR0FBRyxDQUFDLGFBQWEsSUFBSSxJQUFJO1lBQ3RDLFVBQVUsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUNoRCxTQUFTLEVBQUUsY0FBYyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDakgsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQ1YsY0FBYyxFQUFFLEdBQUcsQ0FBQyxlQUFlLElBQUksSUFBSTtZQUMzQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7WUFDaEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQ3hCLE9BQU8sRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztZQUMxQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFNBQVMsSUFBSSxJQUFJO1lBQy9CLFFBQVEsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztZQUM1QyxLQUFLLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFDdEMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO1NBQzVDLENBQUE7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQztZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDaEYsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLE1BQU07UUFDbEIsTUFBTSxLQUFLLEdBQUcsb0NBQW9DLENBQUMsQ0FBQztZQUNsRCxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7WUFDbkMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQy9CLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUk7WUFDckMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNiLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYztZQUNyQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7WUFDbkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUk7WUFDL0IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ3BHLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDakMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSTtZQUMzQixjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZTtTQUN2QyxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMvQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhO1lBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVuSSxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILG1CQUFtQixDQUFDLEVBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFDO1FBQzdELE1BQU0sY0FBYyxHQUFHLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFBO1FBQzdGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQTtRQUNyRSxNQUFNLGdCQUFnQixHQUFHLGFBQWEsR0FBRyxDQUFDLElBQUksY0FBYyxLQUFLLElBQUksSUFBSSxjQUFjLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQTtRQUUzRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsT0FBTyxFQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBQyxDQUFBO1FBQ3pJLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2pELE9BQU8sTUFBTSxDQUFDLGNBQWMsR0FBRyxhQUFhLElBQUksTUFBTSxDQUFDLGNBQWMsSUFBSSxjQUFjLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDN0gsQ0FBQyxDQUFDLENBQUE7UUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNwQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUU5QyxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFDLENBQUE7SUFDeEssQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7UUFDcEIsT0FBTyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsRUFBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNsSixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUE7WUFFdkMsSUFBSSxDQUFDLEVBQUU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQTtZQUV2RyxPQUFPLE1BQU0sUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzNCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLEtBQUs7SUFDM0IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDNUcsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBRW5HLE9BQU8saUJBQWlCLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWUsQ0FBQyxLQUFLO0lBQzVCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTlELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxXQUFXLEVBQUUsY0FBYztJQUM5QyxJQUFJLGNBQWMsS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFN0MsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDekYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vZGF0YWJhc2UvdGFibGUtZGF0YS9pbmRleC5qc1wiXG5pbXBvcnQgc3RhYmxlSnNvblN0cmluZ2lmeSBmcm9tIFwiLi9zdGFibGUtanNvbi5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VydmVyQ2hhbmdlRmVlZEVudHJ5XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGFjdG9yRGV2aWNlSWQgLSBTaWduZWQgbXV0YXRpb24gYWN0b3IgZGV2aWNlIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3RvclVzZXJJZCAtIFNpZ25lZCBtdXRhdGlvbiBhY3RvciB1c2VyIGlkIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IGF0dHJpYnV0ZXMgLSBTZXJpYWxpemVkIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3JlYXRlZEF0IC0gU2VydmVyIGNoYW5nZSBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTZXJ2ZXIgY2hhbmdlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpZGVtcG90ZW5jeUtleSAtIE11dGF0aW9uIGlkZW1wb3RlbmN5IGtleSB3aGVuIGF2YWlsYWJsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2RlbCAtIEZyb250ZW5kIG1vZGVsIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uIC0gTXV0YXRpb24gb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/PiB8IG51bGx9IHBheWxvYWQgLSBTZXJpYWxpemVkIG11dGF0aW9uIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlY29yZElkIC0gQ2hhbmdlZCByZWNvcmQgaWQgd2hlbiBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSByZXNwb25zZSAtIENvbW1hbmQgcmVzcG9uc2UgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBzY29wZSAtIE9mZmxpbmUgZ3JhbnQgc2NvcGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2VydmVyU2VxdWVuY2UgLSBNb25vdG9uaWMgc2VydmVyIHNlcXVlbmNlLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlcnZlckNoYW5nZUZlZWRSb3dcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYWN0b3JfZGV2aWNlX2lkIC0gQWN0b3IgZGV2aWNlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBhY3Rvcl91c2VyX2lkIC0gQWN0b3IgdXNlciBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gYXR0cmlidXRlc19qc29uIC0gQXR0cmlidXRlcyBKU09OLlxuICogQHByb3BlcnR5IHtEYXRlIHwgc3RyaW5nfSBjcmVhdGVkX2F0IC0gQ3JlYXRpb24gdGltZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIEVudHJ5IGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBpZGVtcG90ZW5jeV9rZXkgLSBNdXRhdGlvbiBpZGVtcG90ZW5jeSBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbW9kZWwgLSBGcm9udGVuZCBtb2RlbCBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcGF5bG9hZF9qc29uIC0gTXV0YXRpb24gcGF5bG9hZCBKU09OLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZWNvcmRfaWQgLSBSZWNvcmQgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJlc3BvbnNlX2pzb24gLSBSZXNwb25zZSBKU09OLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBzY29wZV9qc29uIC0gU2NvcGUgSlNPTi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nfSBzZXJ2ZXJfc2VxdWVuY2UgLSBTZXJ2ZXIgc2VxdWVuY2UuXG4gKi9cbmNvbnN0IERFRkFVTFRfUkVURU5USU9OX1NJWkUgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9QQUdFX1NJWkUgPSAxMDBcbmNvbnN0IE1BWF9QQUdFX1NJWkUgPSAxMDAwXG5jb25zdCBUQUJMRV9OQU1FID0gXCJmcm9udGVuZF9tb2RlbF9zeW5jX2NoYW5nZXNcIlxuY29uc3Qgc3RvcmVzID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIFNoYXJlZCBzZXJ2ZXIgY2hhbmdlLWZlZWQgc3RvcmUgZm9yIGEgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkU3RvcmV9IC0gU3RvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZXJDaGFuZ2VGZWVkU3RvcmVGb3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgbGV0IHN0b3JlID0gc3RvcmVzLmdldChjb25maWd1cmF0aW9uKVxuXG4gIGlmICghc3RvcmUpIHtcbiAgICBzdG9yZSA9IG5ldyBTZXJ2ZXJDaGFuZ2VGZWVkU3RvcmUoe2NvbmZpZ3VyYXRpb259KVxuICAgIHN0b3Jlcy5zZXQoY29uZmlndXJhdGlvbiwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4gc3RvcmVcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VydmVyQ2hhbmdlRmVlZFN0b3JlIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5kYXRhYmFzZUlkZW50aWZpZXJdIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnJldGVudGlvblNpemVdIC0gTnVtYmVyIG9mIGZlZWQgZW50cmllcyB0byByZXRhaW4uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyID0gXCJkZWZhdWx0XCIsIHJldGVudGlvblNpemV9KSB7XG4gICAgY29uc3Qgc3luY0NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uLmdldFN5bmNDb25maWd1cmF0aW9uKClcblxuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmRhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMucmV0ZW50aW9uU2l6ZSA9IHJldGVudGlvblNpemUgfHwgc3luY0NvbmZpZ3VyYXRpb24uY2hhbmdlRmVlZFJldGVudGlvblNpemUgfHwgREVGQVVMVF9SRVRFTlRJT05fU0laRVxuICAgIC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5W119ICovXG4gICAgdGhpcy5fbWVtb3J5Q2hhbmdlcyA9IFtdXG4gICAgdGhpcy5fbWVtb3J5U2VxdWVuY2UgPSAwXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGJhY2tpbmcgdGFibGUgZXhpc3RzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHJlYWR5LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHtcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5fc2NoZW1hUmVhZHkoKSkgcmV0dXJuXG4gICAgaWYgKHRoaXMuX3JlYWR5UHJvbWlzZSkgcmV0dXJuIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5zZXRDdXJyZW50KClcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZW5zdXJlQ2hhbmdlc1RhYmxlKGRiKVxuICAgICAgfSlcbiAgICAgIHRoaXMuX2lzUmVhZHkgPSB0cnVlXG4gICAgfSkoKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYWR5UHJvbWlzZVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVhZHkpIHRoaXMuX3JlYWR5UHJvbWlzZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGNoYW5nZSBhbmQgYXNzaWducyB0aGUgbmV4dCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7T21pdDxTZXJ2ZXJDaGFuZ2VGZWVkRW50cnksIFwiY3JlYXRlZEF0XCIgfCBcImlkXCIgfCBcInNlcnZlclNlcXVlbmNlXCI+ICYge2NyZWF0ZWRBdD86IHN0cmluZywgaWQ/OiBzdHJpbmd9fSBjaGFuZ2UgLSBDaGFuZ2UgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2VydmVyQ2hhbmdlRmVlZEVudHJ5Pn0gLSBQZXJzaXN0ZWQgY2hhbmdlLlxuICAgKi9cbiAgYXN5bmMgYXBwZW5kKGNoYW5nZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUmVhZHkoKVxuXG4gICAgY29uc3QgaWQgPSBjaGFuZ2UuaWQgfHwgcmFuZG9tVVVJRCgpXG4gICAgY29uc3QgY3JlYXRlZEF0ID0gY2hhbmdlLmNyZWF0ZWRBdCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcblxuICAgIGlmICh0aGlzLl91c2VzTWVtb3J5U3RvcmFnZSgpKSByZXR1cm4gdGhpcy5fYXBwZW5kTWVtb3J5KHsuLi5jaGFuZ2UsIGNyZWF0ZWRBdCwgaWR9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhEYihhc3luYyAoZGIpID0+IHtcbiAgICAgIGF3YWl0IGRiLmluc2VydCh7XG4gICAgICAgIHRhYmxlTmFtZTogVEFCTEVfTkFNRSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGFjdG9yX2RldmljZV9pZDogY2hhbmdlLmFjdG9yRGV2aWNlSWQsXG4gICAgICAgICAgYWN0b3JfdXNlcl9pZDogY2hhbmdlLmFjdG9yVXNlcklkLFxuICAgICAgICAgIGF0dHJpYnV0ZXNfanNvbjogSlNPTi5zdHJpbmdpZnkoY2hhbmdlLmF0dHJpYnV0ZXMgfHwgbnVsbCksXG4gICAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoY3JlYXRlZEF0KSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBpZGVtcG90ZW5jeV9rZXk6IGNoYW5nZS5pZGVtcG90ZW5jeUtleSxcbiAgICAgICAgICBtb2RlbDogY2hhbmdlLm1vZGVsLFxuICAgICAgICAgIG9wZXJhdGlvbjogY2hhbmdlLm9wZXJhdGlvbixcbiAgICAgICAgICBwYXlsb2FkX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5wYXlsb2FkIHx8IG51bGwpLFxuICAgICAgICAgIHJlY29yZF9pZDogY2hhbmdlLnJlY29yZElkID09PSBudWxsIHx8IGNoYW5nZS5yZWNvcmRJZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhjaGFuZ2UucmVjb3JkSWQpLFxuICAgICAgICAgIHJlc3BvbnNlX2pzb246IEpTT04uc3RyaW5naWZ5KGNoYW5nZS5yZXNwb25zZSB8fCBudWxsKSxcbiAgICAgICAgICBzY29wZV9qc29uOiBzdGFibGVKc29uU3RyaW5naWZ5KGNoYW5nZS5zY29wZSB8fCBudWxsKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLl9jaGFuZ2VCeUlkKGRiLCBpZClcbiAgICAgIGlmICghcm93KSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGVyc2lzdCBzZXJ2ZXIgY2hhbmdlLWZlZWQgZW50cnlcIilcblxuICAgICAgYXdhaXQgdGhpcy5fcHJ1bmVSZXRhaW5lZENoYW5nZXMoZGIsIHJvdy5zZXJ2ZXJTZXF1ZW5jZSlcblxuICAgICAgcmV0dXJuIHJvd1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50IGxhdGVzdCBzZXJ2ZXIgc2VxdWVuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IC0gTGF0ZXN0IHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgbGF0ZXN0U2VxdWVuY2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeVNlcXVlbmNlXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IGRiXG4gICAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBERVNDXCIpXG4gICAgICAgIC5saW1pdCgxKVxuICAgICAgICAucmVzdWx0cygpXG4gICAgICBjb25zdCByb3cgPSAvKiogQHR5cGUge3tzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9IHwgdW5kZWZpbmVkfSAqLyAocm93c1swXSlcblxuICAgICAgcmV0dXJuIHJvdyA/IE51bWJlcihyb3cuc2VydmVyX3NlcXVlbmNlKSA6IDBcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgb2xkZXN0IHJldGFpbmVkIHNlcnZlciBzZXF1ZW5jZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59IC0gT2xkZXN0IHJldGFpbmVkIHNlcXVlbmNlLlxuICAgKi9cbiAgYXN5bmMgb2xkZXN0U2VxdWVuY2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBpZiAodGhpcy5fdXNlc01lbW9yeVN0b3JhZ2UoKSkgcmV0dXJuIHRoaXMuX21lbW9yeUNoYW5nZXNbMF0/LnNlcnZlclNlcXVlbmNlIHx8IG51bGxcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRGIoYXN5bmMgKGRiKSA9PiBhd2FpdCB0aGlzLl9vbGRlc3RTZXF1ZW5jZShkYikpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBvcmRlcmVkIGNoYW5nZXMgYWZ0ZXIgYSBjdXJzb3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hZnRlclNlcXVlbmNlIC0gRXhjbHVzaXZlIGxvd2VyIGJvdW5kLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubGltaXRdIC0gTWF4aW11bSBudW1iZXIgb2YgY2hhbmdlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLnVwVG9TZXF1ZW5jZV0gLSBJbmNsdXNpdmUgdXBwZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLnNjb3BlXSAtIENhbGxlciBzeW5jIHNjb3BlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9Pn0gLSBPcmRlcmVkIHBhZ2UuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0ID0gREVGQVVMVF9QQUdFX1NJWkUsIHNjb3BlLCB1cFRvU2VxdWVuY2V9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVSZWFkeSgpXG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IG5vcm1hbGl6ZUxpbWl0KGxpbWl0KVxuXG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0OiBwYWdlU2l6ZSwgc2NvcGUsIHVwVG9TZXF1ZW5jZX0pXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4ge1xuICAgICAgY29uc3QgbGF0ZXN0U2VxdWVuY2UgPSB0eXBlb2YgdXBUb1NlcXVlbmNlID09PSBcIm51bWJlclwiID8gdXBUb1NlcXVlbmNlIDogYXdhaXQgdGhpcy5fbGF0ZXN0U2VxdWVuY2UoZGIpXG4gICAgICBjb25zdCBvbGRlc3RTZXF1ZW5jZSA9IGF3YWl0IHRoaXMuX29sZGVzdFNlcXVlbmNlKGRiKVxuICAgICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgICAgaWYgKHNuYXBzaG90UmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGFuZ2VzOiBbXSxcbiAgICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgICBuZXh0U2VxdWVuY2U6IGFmdGVyU2VxdWVuY2UsXG4gICAgICAgICAgb2xkZXN0U2VxdWVuY2UsXG4gICAgICAgICAgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB1cFRvU2VxdWVuY2U6IGxhdGVzdFNlcXVlbmNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7U2VydmVyQ2hhbmdlRmVlZFJvd1tdfSAqLyAoYXdhaXQgZGJcbiAgICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgICAgLndoZXJlKGBzZXJ2ZXJfc2VxdWVuY2UgPiAke2RiLnF1b3RlKGFmdGVyU2VxdWVuY2UpfWApXG4gICAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlIDw9ICR7ZGIucXVvdGUobGF0ZXN0U2VxdWVuY2UpfWApXG4gICAgICAgIC53aGVyZShzY29wZSA9PT0gdW5kZWZpbmVkID8gXCIxID0gMVwiIDoge3Njb3BlX2pzb246IHN0YWJsZUpzb25TdHJpbmdpZnkoc2NvcGUpfSlcbiAgICAgICAgLm9yZGVyKFwic2VydmVyX3NlcXVlbmNlIEFTQ1wiKVxuICAgICAgICAubGltaXQocGFnZVNpemUgKyAxKVxuICAgICAgICAucmVzdWx0cygpKVxuICAgICAgY29uc3QgaGFzTW9yZSA9IHJvd3MubGVuZ3RoID4gcGFnZVNpemVcbiAgICAgIGNvbnN0IHBhZ2VSb3dzID0gcm93cy5zbGljZSgwLCBwYWdlU2l6ZSlcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBwYWdlUm93cy5tYXAoKHJvdykgPT4gdGhpcy5fbm9ybWFsaXplQ2hhbmdlUm93KHJvdykpXG4gICAgICBjb25zdCBsYXN0Q2hhbmdlID0gY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNoYW5nZXMsXG4gICAgICAgIGhhc01vcmUsXG4gICAgICAgIG5leHRTZXF1ZW5jZTogbGFzdENoYW5nZSA/IGxhc3RDaGFuZ2Uuc2VydmVyU2VxdWVuY2UgOiBhZnRlclNlcXVlbmNlLFxuICAgICAgICBvbGRlc3RTZXF1ZW5jZSxcbiAgICAgICAgc25hcHNob3RSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIHVwVG9TZXF1ZW5jZTogbGF0ZXN0U2VxdWVuY2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgc2NoZW1hIGlzIHN0aWxsIHByZXNlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgcmVhZHkuXG4gICAqL1xuICBhc3luYyBfc2NoZW1hUmVhZHkoKSB7XG4gICAgaWYgKHRoaXMuX3VzZXNNZW1vcnlTdG9yYWdlKCkpIHJldHVybiB0aGlzLl9pc1JlYWR5XG4gICAgaWYgKCF0aGlzLl9pc1JlYWR5KSByZXR1cm4gZmFsc2VcbiAgICBpZiAoYXdhaXQgdGhpcy5fd2l0aERiKGFzeW5jIChkYikgPT4gYXdhaXQgZGIudGFibGVFeGlzdHMoVEFCTEVfTkFNRSkpKSByZXR1cm4gdHJ1ZVxuXG4gICAgdGhpcy5faXNSZWFkeSA9IGZhbHNlXG4gICAgdGhpcy5fcmVhZHlQcm9taXNlID0gbnVsbFxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBjaGFuZ2VzIHRhYmxlIGV4aXN0cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2Vuc3VyZUNoYW5nZXNUYWJsZShkYikge1xuICAgIGlmIChhd2FpdCBkYi50YWJsZUV4aXN0cyhUQUJMRV9OQU1FKSkgcmV0dXJuXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZURhdGEoVEFCTEVfTkFNRSwge2lmTm90RXhpc3RzOiB0cnVlfSlcblxuICAgIHRhYmxlLmludGVnZXIoXCJzZXJ2ZXJfc2VxdWVuY2VcIiwge2F1dG9JbmNyZW1lbnQ6IHRydWUsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJtb2RlbFwiLCB7aW5kZXg6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJvcGVyYXRpb25cIiwge251bGw6IGZhbHNlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJyZWNvcmRfaWRcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwicGF5bG9hZF9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS50ZXh0KFwiYXR0cmlidXRlc19qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJpZGVtcG90ZW5jeV9rZXlcIiwge2luZGV4OiB0cnVlLCBudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5zdHJpbmcoXCJhY3Rvcl91c2VyX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUuc3RyaW5nKFwiYWN0b3JfZGV2aWNlX2lkXCIsIHtpbmRleDogdHJ1ZSwgbnVsbDogdHJ1ZX0pXG4gICAgdGFibGUudGV4dChcInNjb3BlX2pzb25cIiwge251bGw6IHRydWV9KVxuICAgIHRhYmxlLnRleHQoXCJyZXNwb25zZV9qc29uXCIsIHtudWxsOiB0cnVlfSlcbiAgICB0YWJsZS5kYXRldGltZShcImNyZWF0ZWRfYXRcIiwge2luZGV4OiB0cnVlLCBudWxsOiBmYWxzZX0pXG5cbiAgICBhd2FpdCBkYi5jcmVhdGVUYWJsZSh0YWJsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHBlcnNpc3RlZCBjaGFuZ2UgYnkgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gRW50cnkgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlcnZlckNoYW5nZUZlZWRFbnRyeSB8IG51bGw+fSAtIEVudHJ5IG9yIG51bGwuXG4gICAqL1xuICBhc3luYyBfY2hhbmdlQnlJZChkYiwgaWQpIHtcbiAgICBjb25zdCByb3dzID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93W119ICovIChhd2FpdCBkYlxuICAgICAgLm5ld1F1ZXJ5KClcbiAgICAgIC5mcm9tKFRBQkxFX05BTUUpXG4gICAgICAud2hlcmUoe2lkfSlcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gdGhpcy5fbm9ybWFsaXplQ2hhbmdlUm93KHJvd3NbMF0pIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGN1cnJlbnQgbGF0ZXN0IHNlcXVlbmNlIHdpdGhvdXQgcmVhZGluZXNzIGNoZWNrcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXI+fSAtIExhdGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIF9sYXRlc3RTZXF1ZW5jZShkYikge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBERVNDXCIpXG4gICAgICAubGltaXQoMSlcbiAgICAgIC5yZXN1bHRzKCkpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IE51bWJlcihyb3dzWzBdLnNlcnZlcl9zZXF1ZW5jZSkgOiAwXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY3VycmVudCBvbGRlc3Qgc2VxdWVuY2Ugd2l0aG91dCByZWFkaW5lc3MgY2hlY2tzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBkYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSAtIE9sZGVzdCBzZXF1ZW5jZS5cbiAgICovXG4gIGFzeW5jIF9vbGRlc3RTZXF1ZW5jZShkYikge1xuICAgIGNvbnN0IHJvd3MgPSAvKiogQHR5cGUge0FycmF5PHtzZXJ2ZXJfc2VxdWVuY2U/OiBudW1iZXIgfCBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC5vcmRlcihcInNlcnZlcl9zZXF1ZW5jZSBBU0NcIilcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIHJldHVybiByb3dzWzBdID8gTnVtYmVyKHJvd3NbMF0uc2VydmVyX3NlcXVlbmNlKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBQcnVuZXMgb2xkIHJldGFpbmVkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxhdGVzdFNlcXVlbmNlIC0gTGF0ZXN0IHNlcXVlbmNlIGFmdGVyIGFwcGVuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9wcnVuZVJldGFpbmVkQ2hhbmdlcyhkYiwgbGF0ZXN0U2VxdWVuY2UpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodGhpcy5yZXRlbnRpb25TaXplKSB8fCB0aGlzLnJldGVudGlvblNpemUgPCAxKSByZXR1cm5cblxuICAgIGNvbnN0IHBydW5lQmVmb3JlT3JBdCA9IGxhdGVzdFNlcXVlbmNlIC0gdGhpcy5yZXRlbnRpb25TaXplXG4gICAgaWYgKHBydW5lQmVmb3JlT3JBdCA8IDEpIHJldHVyblxuXG4gICAgY29uc3Qgcm93cyA9IC8qKiBAdHlwZSB7QXJyYXk8e2lkOiBzdHJpbmd9Pn0gKi8gKGF3YWl0IGRiXG4gICAgICAubmV3UXVlcnkoKVxuICAgICAgLmZyb20oVEFCTEVfTkFNRSlcbiAgICAgIC53aGVyZShgc2VydmVyX3NlcXVlbmNlIDw9ICR7ZGIucXVvdGUocHJ1bmVCZWZvcmVPckF0KX1gKVxuICAgICAgLnJlc3VsdHMoKSlcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IGRiLmRlbGV0ZSh7Y29uZGl0aW9uczoge2lkOiByb3cuaWR9LCB0YWJsZU5hbWU6IFRBQkxFX05BTUV9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGEgY2hhbmdlIHJvdy5cbiAgICogQHBhcmFtIHtTZXJ2ZXJDaGFuZ2VGZWVkUm93fSByb3cgLSBSYXcgZGF0YWJhc2Ugcm93LlxuICAgKiBAcmV0dXJucyB7U2VydmVyQ2hhbmdlRmVlZEVudHJ5fSAtIE5vcm1hbGl6ZWQgY2hhbmdlLlxuICAgKi9cbiAgX25vcm1hbGl6ZUNoYW5nZVJvdyhyb3cpIHtcbiAgICBjb25zdCBjcmVhdGVkQXRWYWx1ZSA9IHJvdy5jcmVhdGVkX2F0XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0b3JEZXZpY2VJZDogcm93LmFjdG9yX2RldmljZV9pZCB8fCBudWxsLFxuICAgICAgYWN0b3JVc2VySWQ6IHJvdy5hY3Rvcl91c2VyX2lkIHx8IG51bGwsXG4gICAgICBhdHRyaWJ1dGVzOiBwYXJzZUpzb25Pck51bGwocm93LmF0dHJpYnV0ZXNfanNvbiksXG4gICAgICBjcmVhdGVkQXQ6IGNyZWF0ZWRBdFZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGNyZWF0ZWRBdFZhbHVlLnRvSVNPU3RyaW5nKCkgOiBuZXcgRGF0ZShjcmVhdGVkQXRWYWx1ZSkudG9JU09TdHJpbmcoKSxcbiAgICAgIGlkOiByb3cuaWQsXG4gICAgICBpZGVtcG90ZW5jeUtleTogcm93LmlkZW1wb3RlbmN5X2tleSB8fCBudWxsLFxuICAgICAgbW9kZWw6IHJvdy5tb2RlbCxcbiAgICAgIG9wZXJhdGlvbjogcm93Lm9wZXJhdGlvbixcbiAgICAgIHBheWxvYWQ6IHBhcnNlSnNvbk9yTnVsbChyb3cucGF5bG9hZF9qc29uKSxcbiAgICAgIHJlY29yZElkOiByb3cucmVjb3JkX2lkIHx8IG51bGwsXG4gICAgICByZXNwb25zZTogcGFyc2VKc29uT3JOdWxsKHJvdy5yZXNwb25zZV9qc29uKSxcbiAgICAgIHNjb3BlOiBwYXJzZUpzb25Pck51bGwocm93LnNjb3BlX2pzb24pLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IE51bWJlcihyb3cuc2VydmVyX3NlcXVlbmNlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3RvcmUgc2hvdWxkIHVzZSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBiZWNhdXNlIG5vIGRhdGFiYXNlIGlkZW50aWZpZXIgaXMgY29uZmlndXJlZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBtZW1vcnkgc3RvcmFnZSBpcyBhY3RpdmUuXG4gICAqL1xuICBfdXNlc01lbW9yeVN0b3JhZ2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhdGhpcy5jb25maWd1cmF0aW9uLmdldERhdGFiYXNlQ29uZmlndXJhdGlvbigpW3RoaXMuZGF0YWJhc2VJZGVudGlmaWVyXVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIHByb2Nlc3MtbG9jYWwgbWVtb3J5IGVudHJ5IHdoZW4gbm8gZGF0YWJhc2UgaXMgY29uZmlndXJlZC5cbiAgICogQHBhcmFtIHtPbWl0PFNlcnZlckNoYW5nZUZlZWRFbnRyeSwgXCJzZXJ2ZXJTZXF1ZW5jZVwiPn0gY2hhbmdlIC0gQ2hhbmdlIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9IC0gQXBwZW5kZWQgZW50cnkuXG4gICAqL1xuICBfYXBwZW5kTWVtb3J5KGNoYW5nZSkge1xuICAgIGNvbnN0IGVudHJ5ID0gLyoqIEB0eXBlIHtTZXJ2ZXJDaGFuZ2VGZWVkRW50cnl9ICovICh7XG4gICAgICBhY3RvckRldmljZUlkOiBjaGFuZ2UuYWN0b3JEZXZpY2VJZCxcbiAgICAgIGFjdG9yVXNlcklkOiBjaGFuZ2UuYWN0b3JVc2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBjaGFuZ2UuYXR0cmlidXRlcyB8fCBudWxsLFxuICAgICAgY3JlYXRlZEF0OiBjaGFuZ2UuY3JlYXRlZEF0LFxuICAgICAgaWQ6IGNoYW5nZS5pZCxcbiAgICAgIGlkZW1wb3RlbmN5S2V5OiBjaGFuZ2UuaWRlbXBvdGVuY3lLZXksXG4gICAgICBtb2RlbDogY2hhbmdlLm1vZGVsLFxuICAgICAgb3BlcmF0aW9uOiBjaGFuZ2Uub3BlcmF0aW9uLFxuICAgICAgcGF5bG9hZDogY2hhbmdlLnBheWxvYWQgfHwgbnVsbCxcbiAgICAgIHJlY29yZElkOiBjaGFuZ2UucmVjb3JkSWQgPT09IG51bGwgfHwgY2hhbmdlLnJlY29yZElkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGNoYW5nZS5yZWNvcmRJZCksXG4gICAgICByZXNwb25zZTogY2hhbmdlLnJlc3BvbnNlIHx8IG51bGwsXG4gICAgICBzY29wZTogY2hhbmdlLnNjb3BlIHx8IG51bGwsXG4gICAgICBzZXJ2ZXJTZXF1ZW5jZTogKyt0aGlzLl9tZW1vcnlTZXF1ZW5jZVxuICAgIH0pXG5cbiAgICB0aGlzLl9tZW1vcnlDaGFuZ2VzLnB1c2goZW50cnkpXG4gICAgaWYgKHRoaXMuX21lbW9yeUNoYW5nZXMubGVuZ3RoID4gdGhpcy5yZXRlbnRpb25TaXplKSB0aGlzLl9tZW1vcnlDaGFuZ2VzLnNwbGljZSgwLCB0aGlzLl9tZW1vcnlDaGFuZ2VzLmxlbmd0aCAtIHRoaXMucmV0ZW50aW9uU2l6ZSlcblxuICAgIHJldHVybiBlbnRyeVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwcm9jZXNzLWxvY2FsIG1lbW9yeSBjaGFuZ2UgcGFnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmFmdGVyU2VxdWVuY2UgLSBFeGNsdXNpdmUgbG93ZXIgYm91bmQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmxpbWl0IC0gUGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MudXBUb1NlcXVlbmNlXSAtIEluY2x1c2l2ZSB1cHBlciBib3VuZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3Muc2NvcGVdIC0gQ2FsbGVyIHN5bmMgc2NvcGUuXG4gICAqIEByZXR1cm5zIHt7Y2hhbmdlczogU2VydmVyQ2hhbmdlRmVlZEVudHJ5W10sIGhhc01vcmU6IGJvb2xlYW4sIG5leHRTZXF1ZW5jZTogbnVtYmVyLCBvbGRlc3RTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgc25hcHNob3RSZXF1aXJlZDogYm9vbGVhbiwgdXBUb1NlcXVlbmNlOiBudW1iZXJ9fSAtIE9yZGVyZWQgcGFnZS5cbiAgICovXG4gIF9tZW1vcnlDaGFuZ2VzQWZ0ZXIoe2FmdGVyU2VxdWVuY2UsIGxpbWl0LCBzY29wZSwgdXBUb1NlcXVlbmNlfSkge1xuICAgIGNvbnN0IGxhdGVzdFNlcXVlbmNlID0gdHlwZW9mIHVwVG9TZXF1ZW5jZSA9PT0gXCJudW1iZXJcIiA/IHVwVG9TZXF1ZW5jZSA6IHRoaXMuX21lbW9yeVNlcXVlbmNlXG4gICAgY29uc3Qgb2xkZXN0U2VxdWVuY2UgPSB0aGlzLl9tZW1vcnlDaGFuZ2VzWzBdPy5zZXJ2ZXJTZXF1ZW5jZSB8fCBudWxsXG4gICAgY29uc3Qgc25hcHNob3RSZXF1aXJlZCA9IGFmdGVyU2VxdWVuY2UgPiAwICYmIG9sZGVzdFNlcXVlbmNlICE9PSBudWxsICYmIG9sZGVzdFNlcXVlbmNlID4gYWZ0ZXJTZXF1ZW5jZSArIDFcblxuICAgIGlmIChzbmFwc2hvdFJlcXVpcmVkKSB7XG4gICAgICByZXR1cm4ge2NoYW5nZXM6IFtdLCBoYXNNb3JlOiBmYWxzZSwgbmV4dFNlcXVlbmNlOiBhZnRlclNlcXVlbmNlLCBvbGRlc3RTZXF1ZW5jZSwgc25hcHNob3RSZXF1aXJlZDogdHJ1ZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5fbWVtb3J5Q2hhbmdlcy5maWx0ZXIoKGNoYW5nZSkgPT4ge1xuICAgICAgcmV0dXJuIGNoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA+IGFmdGVyU2VxdWVuY2UgJiYgY2hhbmdlLnNlcnZlclNlcXVlbmNlIDw9IGxhdGVzdFNlcXVlbmNlICYmIHNjb3Blc0VxdWFsKGNoYW5nZS5zY29wZSwgc2NvcGUpXG4gICAgfSlcbiAgICBjb25zdCBoYXNNb3JlID0gcm93cy5sZW5ndGggPiBsaW1pdFxuICAgIGNvbnN0IGNoYW5nZXMgPSByb3dzLnNsaWNlKDAsIGxpbWl0KVxuICAgIGNvbnN0IGxhc3RDaGFuZ2UgPSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV1cblxuICAgIHJldHVybiB7Y2hhbmdlcywgaGFzTW9yZSwgbmV4dFNlcXVlbmNlOiBsYXN0Q2hhbmdlID8gbGFzdENoYW5nZS5zZXJ2ZXJTZXF1ZW5jZSA6IGFmdGVyU2VxdWVuY2UsIG9sZGVzdFNlcXVlbmNlLCBzbmFwc2hvdFJlcXVpcmVkOiBmYWxzZSwgdXBUb1NlcXVlbmNlOiBsYXRlc3RTZXF1ZW5jZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdpdGggZGIuXG4gICAqIEBwYXJhbSB7KGRiOiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdCkgPT4gUHJvbWlzZTw/Pn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8Pz59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX3dpdGhEYihjYWxsYmFjaykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe2RhdGFiYXNlSWRlbnRpZmllcnM6IFt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl0sIG5hbWU6IFwiU2VydmVyIGNoYW5nZS1mZWVkIHN0b3JlXCJ9LCBhc3luYyAoZGJzKSA9PiB7XG4gICAgICBjb25zdCBkYiA9IGRic1t0aGlzLmRhdGFiYXNlSWRlbnRpZmllcl1cblxuICAgICAgaWYgKCFkYikgdGhyb3cgbmV3IEVycm9yKGBObyBkYXRhYmFzZSBjb25uZWN0aW9uIGF2YWlsYWJsZSBmb3IgaWRlbnRpZmllcjogJHt0aGlzLmRhdGFiYXNlSWRlbnRpZmllcn1gKVxuXG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soZGIpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgcGFnZSBsaW1pdC5cbiAqIEBwYXJhbSB7P30gbGltaXQgLSBSZXF1ZXN0ZWQgbGltaXQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIFBhZ2Ugc2l6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTGltaXQobGltaXQpIHtcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSAmJiBsaW1pdCA+IDApIHJldHVybiBNYXRoLm1pbihsaW1pdCwgTUFYX1BBR0VfU0laRSlcbiAgaWYgKHR5cGVvZiBsaW1pdCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcZCskLy50ZXN0KGxpbWl0KSkgcmV0dXJuIE1hdGgubWluKE51bWJlcihsaW1pdCksIE1BWF9QQUdFX1NJWkUpXG5cbiAgcmV0dXJuIERFRkFVTFRfUEFHRV9TSVpFXG59XG5cbi8qKlxuICogUGFyc2VzIEpTT04taXNoIHZhbHVlcy5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBKU09OIHN0cmluZy5cbiAqIEByZXR1cm5zIHs/fSAtIFBhcnNlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VKc29uT3JOdWxsKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGxcblxuICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSlcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBzeW5jIHNjb3BlcyBieSBzdGFibGUgSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz4gfCBudWxsfSBjaGFuZ2VTY29wZSAtIFBlcnNpc3RlZCBjaGFuZ2Ugc2NvcGUuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+IHwgdW5kZWZpbmVkfSByZXF1ZXN0ZWRTY29wZSAtIENhbGxlciBzY29wZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNoYW5nZSBpcyB2aXNpYmxlIGZvciB0aGUgcmVxdWVzdGVkIHNjb3BlLlxuICovXG5mdW5jdGlvbiBzY29wZXNFcXVhbChjaGFuZ2VTY29wZSwgcmVxdWVzdGVkU2NvcGUpIHtcbiAgaWYgKHJlcXVlc3RlZFNjb3BlID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIHN0YWJsZUpzb25TdHJpbmdpZnkoY2hhbmdlU2NvcGUgfHwgbnVsbCkgPT09IHN0YWJsZUpzb25TdHJpbmdpZnkocmVxdWVzdGVkU2NvcGUpXG59XG4iXX0=
@@ -1,12 +1,3 @@
1
- /** @typedef {import("./sync-api-client-types.js").SyncChangeApplyResult} SyncChangeApplyResult */
2
- /** @typedef {import("./sync-api-client-types.js").SyncChangeEnvelope} SyncChangeEnvelope */
3
- /** @typedef {import("./sync-api-client-types.js").SyncChangesRequest} SyncChangesRequest */
4
- /** @typedef {import("./sync-api-client-types.js").SyncChangesResponse} SyncChangesResponse */
5
- /** @typedef {import("./sync-api-client-types.js").SyncChangesResult} SyncChangesResult */
6
- /** @typedef {import("./sync-api-client-types.js").SyncCursor} SyncCursor */
7
- /** @typedef {import("./sync-api-client-types.js").SyncReplayItem} SyncReplayItem */
8
- /** @typedef {import("./sync-api-client-types.js").SyncReplayResponse} SyncReplayResponse */
9
- /** @typedef {import("./sync-api-client-types.js").SyncResourceConfig} SyncResourceConfig */
10
1
  /**
11
2
  * Generic client-side helper for replaying pending sync envelopes through the
12
3
  * framework-owned `/velocious/sync/replay` endpoint. Apps provide only local