sonamu 0.12.0 → 0.13.1

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 (275) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/ai/agents/agent.js +2 -3
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/index.js +1 -2
  5. package/dist/ai/providers/rtzr/api.js +1 -2
  6. package/dist/ai/providers/rtzr/error.js +2 -3
  7. package/dist/ai/providers/rtzr/model.js +1 -2
  8. package/dist/ai/providers/rtzr/options.js +1 -2
  9. package/dist/ai/providers/rtzr/provider.js +1 -2
  10. package/dist/ai/providers/rtzr/utils.js +1 -2
  11. package/dist/api/base-frame.js +4 -4
  12. package/dist/api/caster.d.ts +1 -1
  13. package/dist/api/caster.d.ts.map +1 -1
  14. package/dist/api/caster.js +9 -9
  15. package/dist/api/code-converters.js +6 -5
  16. package/dist/api/config.d.ts +1 -1
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +2 -3
  19. package/dist/api/context.d.ts +2 -3
  20. package/dist/api/context.d.ts.map +1 -1
  21. package/dist/api/context.js +2 -3
  22. package/dist/api/decorators.js +2 -3
  23. package/dist/api/http-validator.js +2 -3
  24. package/dist/api/index.js +8 -3
  25. package/dist/api/secret.js +1 -2
  26. package/dist/api/sonamu.d.ts +3 -5
  27. package/dist/api/sonamu.d.ts.map +1 -1
  28. package/dist/api/sonamu.js +19 -18
  29. package/dist/api/validator.js +1 -2
  30. package/dist/api/websocket-helpers.js +2 -3
  31. package/dist/auth/audit-log/builders.js +1 -2
  32. package/dist/auth/audit-log/client-ip.js +2 -3
  33. package/dist/auth/audit-log/events.js +1 -2
  34. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  35. package/dist/auth/audit-log/plugin.js +2 -3
  36. package/dist/auth/audit-log-ingestor.js +2 -3
  37. package/dist/auth/auth-generator.js +2 -3
  38. package/dist/auth/better-auth-entities.js +1 -2
  39. package/dist/auth/better-auth-request.js +2 -3
  40. package/dist/auth/index.js +2 -3
  41. package/dist/auth/knex-adapter.js +2 -3
  42. package/dist/auth/plugins/entity-definitions/admin.js +1 -2
  43. package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
  44. package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
  45. package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
  46. package/dist/auth/plugins/entity-definitions/index.js +1 -2
  47. package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
  48. package/dist/auth/plugins/entity-definitions/organization.js +1 -2
  49. package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
  50. package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
  51. package/dist/auth/plugins/entity-definitions/sso.js +1 -2
  52. package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
  53. package/dist/auth/plugins/entity-definitions/username.js +1 -2
  54. package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
  55. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  56. package/dist/auth/plugins/wrappers/admin.js +2 -3
  57. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  58. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  59. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  60. package/dist/auth/plugins/wrappers/organization.js +2 -3
  61. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  62. package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
  63. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  64. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  65. package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
  66. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  67. package/dist/auth/plugins/wrappers/sso.js +1 -2
  68. package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
  69. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  70. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  71. package/dist/auth/plugins/wrappers/username.d.ts +39 -5
  72. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  73. package/dist/auth/plugins/wrappers/username.js +2 -3
  74. package/dist/bin/build-config.js +5 -5
  75. package/dist/bin/compiler-policy.js +2 -3
  76. package/dist/bin/fixture.js +7 -5
  77. package/dist/bin/hmr-hook-register.js +1 -2
  78. package/dist/bin/migrate-targets.js +2 -3
  79. package/dist/bin/test-command.js +2 -3
  80. package/dist/bin/ts-loader-register.js +2 -3
  81. package/dist/bin/ts-loader-registration.js +2 -3
  82. package/dist/bin/typecheck-web.js +2 -3
  83. package/dist/cache/cache-manager.js +1 -2
  84. package/dist/cache/decorator.js +2 -3
  85. package/dist/cache/drivers.js +1 -2
  86. package/dist/cache/index.js +2 -3
  87. package/dist/cache-control/cache-control.js +1 -2
  88. package/dist/code-formatting/index.js +2 -3
  89. package/dist/code-formatting/oxfmt.js +2 -3
  90. package/dist/code-formatting/oxlint.js +2 -3
  91. package/dist/compress/compress.js +1 -2
  92. package/dist/compress/index.js +2 -2
  93. package/dist/compress/types.d.ts +1 -1
  94. package/dist/compress/types.d.ts.map +1 -1
  95. package/dist/cone/cone-generator.js +2 -3
  96. package/dist/database/_batch_update.js +1 -2
  97. package/dist/database/base-model.js +4 -4
  98. package/dist/database/db.js +4 -4
  99. package/dist/database/knex.js +2 -3
  100. package/dist/database/puri-wrapper.js +2 -3
  101. package/dist/database/puri.js +23 -22
  102. package/dist/database/puri.types.js +1 -2
  103. package/dist/database/transaction-context.js +1 -2
  104. package/dist/database/upsert-builder.js +2 -3
  105. package/dist/dict/en.js +2 -3
  106. package/dist/dict/index.js +3 -3
  107. package/dist/dict/ko.js +2 -3
  108. package/dist/dict/rc-keys.js +1 -2
  109. package/dist/dict/sd.js +2 -3
  110. package/dist/dict/sonamu-dictionary.js +7 -6
  111. package/dist/dict/utils.js +2 -3
  112. package/dist/entity/entity-manager.d.ts +66 -66
  113. package/dist/entity/entity-manager.js +4 -4
  114. package/dist/entity/entity-template-cone.js +2 -3
  115. package/dist/entity/entity.js +21 -18
  116. package/dist/env.js +1 -2
  117. package/dist/exceptions/error-handler.d.ts.map +1 -1
  118. package/dist/exceptions/error-handler.js +2 -3
  119. package/dist/exceptions/so-exceptions.js +2 -3
  120. package/dist/filter/index.js +3 -2
  121. package/dist/filter/types.js +1 -2
  122. package/dist/filter/utils.js +7 -6
  123. package/dist/index.js +39 -5
  124. package/dist/logger/category.js +2 -3
  125. package/dist/logger/configure.js +5 -5
  126. package/dist/migration/code-generation.js +23 -16
  127. package/dist/migration/index-where-predicate.js +2 -3
  128. package/dist/migration/migration-set.js +2 -3
  129. package/dist/migration/migrator.js +2 -3
  130. package/dist/migration/postgresql-schema-reader.js +6 -9
  131. package/dist/migration/slack-confirm.js +2 -3
  132. package/dist/naite/naite-reporter.js +2 -3
  133. package/dist/naite/naite.js +10 -8
  134. package/dist/runtime-type.js +2 -3
  135. package/dist/ssr/hmr-opt-out.js +1 -2
  136. package/dist/ssr/index.js +7 -4
  137. package/dist/ssr/registry.js +1 -2
  138. package/dist/ssr/renderer.js +2 -3
  139. package/dist/storage/base-file.js +1 -2
  140. package/dist/storage/buffered-file.js +2 -3
  141. package/dist/storage/drivers.js +1 -2
  142. package/dist/storage/index.js +2 -3
  143. package/dist/storage/s3-driver.js +1 -2
  144. package/dist/storage/storage-manager.js +2 -3
  145. package/dist/storage/uploaded-file.js +2 -3
  146. package/dist/stream/__tests__/ws-test-helpers.js +2 -3
  147. package/dist/stream/index.js +11 -2
  148. package/dist/stream/sse.js +1 -2
  149. package/dist/stream/ws-audience-resolver.js +2 -3
  150. package/dist/stream/ws-audience.js +1 -2
  151. package/dist/stream/ws-cluster-bus.js +1 -2
  152. package/dist/stream/ws-delivery.js +2 -3
  153. package/dist/stream/ws-frame.js +1 -2
  154. package/dist/stream/ws-local-connection-store.js +2 -3
  155. package/dist/stream/ws-presence-index.js +1 -2
  156. package/dist/stream/ws-presence-store.js +2 -3
  157. package/dist/stream/ws-registry.js +2 -3
  158. package/dist/stream/ws-session-id.js +1 -2
  159. package/dist/stream/ws-telemetry-memory.js +3 -4
  160. package/dist/stream/ws-telemetry-trace.js +1 -2
  161. package/dist/stream/ws-telemetry.js +2 -3
  162. package/dist/stream/ws.js +2 -3
  163. package/dist/syncer/api-parser.js +2 -3
  164. package/dist/syncer/checksum.js +4 -4
  165. package/dist/syncer/code-generator.js +4 -4
  166. package/dist/syncer/entity-operations.js +2 -3
  167. package/dist/syncer/event-batcher.js +1 -2
  168. package/dist/syncer/file-copy.js +2 -3
  169. package/dist/syncer/file-patterns.js +2 -3
  170. package/dist/syncer/file-tracking.js +2 -3
  171. package/dist/syncer/filesystem-dependencies.js +1 -2
  172. package/dist/syncer/index.js +8 -2
  173. package/dist/syncer/module-loader.js +8 -6
  174. package/dist/syncer/syncer-actions.js +8 -7
  175. package/dist/syncer/syncer.js +13 -8
  176. package/dist/syncer/watcher.js +2 -3
  177. package/dist/tasks/decorator.js +1 -2
  178. package/dist/tasks/step-wrapper.js +2 -3
  179. package/dist/tasks/workflow-manager.js +2 -3
  180. package/dist/template/entity-converter.js +17 -16
  181. package/dist/template/helpers.js +2 -3
  182. package/dist/template/implementations/entity.template.js +2 -3
  183. package/dist/template/implementations/entry-server.template.js +2 -3
  184. package/dist/template/implementations/generated.template.js +2 -3
  185. package/dist/template/implementations/generated_http.template.js +6 -6
  186. package/dist/template/implementations/generated_sso.template.js +2 -3
  187. package/dist/template/implementations/http_validators.template.js +2 -3
  188. package/dist/template/implementations/init_types.template.js +2 -3
  189. package/dist/template/implementations/model.template.js +4 -4
  190. package/dist/template/implementations/model_test.template.js +2 -3
  191. package/dist/template/implementations/queries.template.js +2 -3
  192. package/dist/template/implementations/sd.template.js +2 -3
  193. package/dist/template/implementations/services.template.js +2 -3
  194. package/dist/template/implementations/view_form.template.js +12 -9
  195. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  196. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  197. package/dist/template/implementations/view_list.template.js +19 -17
  198. package/dist/template/implementations/view_search_input.template.js +2 -3
  199. package/dist/template/index.js +9 -3
  200. package/dist/template/template-manager.js +2 -3
  201. package/dist/template/template-types.js +1 -2
  202. package/dist/template/template.js +2 -3
  203. package/dist/template/zod-converter.js +54 -47
  204. package/dist/testing/_relation-graph.js +2 -3
  205. package/dist/testing/bootstrap.js +2 -3
  206. package/dist/testing/data-explorer.js +2 -3
  207. package/dist/testing/dev-test-routes.js +2 -3
  208. package/dist/testing/dev-vitest-manager.js +15 -12
  209. package/dist/testing/faker-mappings.js +1 -2
  210. package/dist/testing/filesystem.js +2 -3
  211. package/dist/testing/fixture-generator.js +2 -3
  212. package/dist/testing/fixture-loader.js +1 -2
  213. package/dist/testing/fixture-manager.js +12 -9
  214. package/dist/testing/global-setup.js +5 -5
  215. package/dist/testing/index.js +6 -3
  216. package/dist/testing/naite-vitest-reporter.js +1 -2
  217. package/dist/testing/parallel-db-manager.js +2 -3
  218. package/dist/testing/vitest-helpers.js +2 -3
  219. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
  220. package/dist/tooling/cdd-service.js +1 -2
  221. package/dist/tooling/cli-tooling.js +1 -2
  222. package/dist/tooling/fixture-service.js +1 -2
  223. package/dist/tooling/index.js +1 -2
  224. package/dist/tooling/test-run-client.js +2 -3
  225. package/dist/tsdown.api.config.js +1 -2
  226. package/dist/types/types.js +2 -3
  227. package/dist/ui/ai-api.d.ts.map +1 -1
  228. package/dist/ui/ai-api.js +4 -5
  229. package/dist/ui/ai-client.d.ts +2 -2
  230. package/dist/ui/ai-client.d.ts.map +1 -1
  231. package/dist/ui/ai-client.js +9 -8
  232. package/dist/ui/api.d.ts.map +1 -1
  233. package/dist/ui/api.js +11 -8
  234. package/dist/ui/async-route.js +1 -2
  235. package/dist/ui/cdd-service.js +22 -21
  236. package/dist/ui/migrations-api.js +6 -5
  237. package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
  238. package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
  239. package/dist/ui-web/index.html +2 -2
  240. package/dist/utils/async-utils.js +1 -2
  241. package/dist/utils/class-name.js +1 -2
  242. package/dist/utils/console-util.js +1 -2
  243. package/dist/utils/controller.js +2 -3
  244. package/dist/utils/esm-utils.js +1 -2
  245. package/dist/utils/fs-utils.js +2 -3
  246. package/dist/utils/lodash-able.js +1 -2
  247. package/dist/utils/model.js +1 -2
  248. package/dist/utils/object-utils.js +2 -3
  249. package/dist/utils/path-utils.js +2 -3
  250. package/dist/utils/process-utils.js +2 -3
  251. package/dist/utils/runtime-value.js +1 -2
  252. package/dist/utils/sql-parser.js +2 -3
  253. package/dist/utils/type-utils.js +8 -8
  254. package/dist/utils/utils.js +2 -3
  255. package/dist/utils/zod-error.js +2 -3
  256. package/dist/vector/chunking.js +1 -2
  257. package/dist/vector/config.js +1 -2
  258. package/dist/vector/embedding.js +4 -4
  259. package/package.json +67 -67
  260. package/src/ai/agents/agent.ts +1 -1
  261. package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
  262. package/src/api/__tests__/sonamu.websocket.test.ts +6 -10
  263. package/src/api/config.ts +1 -1
  264. package/src/api/context.ts +2 -8
  265. package/src/api/sonamu.ts +26 -21
  266. package/src/auth/audit-log/plugin.ts +2 -0
  267. package/src/compress/types.ts +1 -1
  268. package/src/exceptions/error-handler.ts +3 -2
  269. package/src/template/implementations/model.template.ts +3 -3
  270. package/src/template/implementations/view_list.template.ts +12 -13
  271. package/src/ui/ai-api.ts +4 -2
  272. package/src/ui/ai-client.ts +2 -2
  273. package/src/ui/api.ts +58 -62
  274. package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
  275. package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
@@ -9,7 +9,7 @@ import { WebSocketDeliveryEngine, init_ws_delivery } from "./ws-delivery.js";
9
9
  import { WebSocketLocalConnectionStore, init_ws_local_connection_store } from "./ws-local-connection-store.js";
10
10
  import { WebSocketPresenceIndex, init_ws_presence_index } from "./ws-presence-index.js";
11
11
  import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./ws-presence-store.js";
12
- //#region src/stream/ws-registry.ts
12
+ // src/stream/ws-registry.ts
13
13
  function callStore(call) {
14
14
  return Promise.resolve().then(call);
15
15
  }
@@ -371,8 +371,7 @@ var init_ws_registry = __esmMin((() => {
371
371
  }
372
372
  };
373
373
  }));
374
- //#endregion
375
374
  init_ws_registry();
376
375
  export { WebSocketRegistry, init_ws_registry };
377
376
 
378
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcmVnaXN0cnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJ1bnRpbWVUeXBlT2YgfSBmcm9tIFwiLi4vcnVudGltZS10eXBlXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0QXVkaWVuY2UsIHR5cGUgV2ViU29ja2V0QXVkaWVuY2UgYXMgV2ViU29ja2V0QXVkaWVuY2VTcGVjIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IFdlYlNvY2tldEF1ZGllbmNlUmVzb2x2ZXIgfSBmcm9tIFwiLi93cy1hdWRpZW5jZS1yZXNvbHZlclwiO1xuaW1wb3J0IHsgTm9vcFdlYlNvY2tldENsdXN0ZXJCdXMsIHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQge1xuICB0eXBlIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uLFxuICB0eXBlIE1heWJlUHJvbWlzZSxcbiAgdHlwZSBXZWJTb2NrZXRGcmFtZUNvbm5lY3Rpb24sXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgdHlwZSBXZWJTb2NrZXRSb29tSWQsXG4gIHR5cGUgV2ViU29ja2V0VXNlcklkLFxufSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSwgdHlwZSBXZWJTb2NrZXRSb3V0ZURlZmluaXRpb24gfSBmcm9tIFwiLi93cy1kZWxpdmVyeVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0TG9jYWxDb25uZWN0aW9uU3RvcmUgfSBmcm9tIFwiLi93cy1sb2NhbC1jb25uZWN0aW9uLXN0b3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRQcmVzZW5jZUluZGV4IH0gZnJvbSBcIi4vd3MtcHJlc2VuY2UtaW5kZXhcIjtcbmltcG9ydCB7XG4gIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSxcbiAgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSxcbn0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyLFxuICBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyLFxufSBmcm9tIFwiLi93cy10ZWxlbWV0cnlcIjtcblxuZXhwb3J0IHR5cGUge1xuICBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgV2ViU29ja2V0Um9vbUlkLFxuICBXZWJTb2NrZXRVc2VySWQsXG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbk1ldGEgPSBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG5leHBvcnQgdHlwZSBXZWJTb2NrZXRSb29tTWVtYmVyQ291bnQgPSB7XG4gIGNvdW50OiBudW1iZXI7XG4gIC8vIHN0b3JlIOyhsO2ajOyXkCDsi6TtjKjtlbQg64W465OcIOuhnOy7rCDsiJjroZwg64yA7LK07ZaI7Jy866m0IHRydWVcbiAgcGFydGlhbDogYm9vbGVhbjtcbn07XG5cbmNvbnN0IERFRkFVTFRfRFJBSU5fVElNRU9VVF9NUyA9IDUwMDA7XG5cbnR5cGUgU3RvcmVNdXRhdGlvbk9wZXJhdGlvbiA9XG4gIHwgXCJyZWdpc3RlclwiXG4gIHwgXCJhY3RpdmF0ZVwiXG4gIHwgXCJ1bnJlZ2lzdGVyXCJcbiAgfCBcInNldFVzZXJJZFwiXG4gIHwgXCJjbGVhclVzZXJJZFwiXG4gIHwgXCJqb2luXCJcbiAgfCBcImxlYXZlXCI7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgLy8g67aE7IKwIO2ZmOqyveyXkOyEnCDrhbjrk5wg6rCEIOudvOyasO2MhSDsi53rs4TsnpDroZwg7JOw7J2066+A66GcIOuwmOuTnOyLnCDtmLjstpwg7LihKFdlYlNvY2tldFJ1bnRpbWUp7JeQ7IScIOqysOygle2VtCDrhJjquLTri6RcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5Q29udHJvbGxlcj86IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIC8vIHNodXRkb3duIOyLnCDsp4Ttlokg7KSR7J24IHN0b3JlIG11dGF0aW9u6rO8IHB1Ymxpc2jrpbwg6riw64uk66as64qUIOyDge2VnFxuICBkcmFpblRpbWVvdXRNcz86IG51bWJlcjtcbn07XG5cbi8qKlxuICog64W465OcIOuhnOy7rCBwcmVzZW5jZeulvCDrqZTrqqjrpqzsl5Ag7IaM7Jyg7ZWY6rOgLCDshKTsoJXrkJwgc3RvcmXsl5DripQg7IS47IWY67OEIOyInOyEnOuMgOuhnCByZXBsaWNh66W8IOuwmOyYge2VnOuLpC5cbiAqIG11dGF0aW9u6rO8IHB1Ymxpc2jripQg7Zi47LacIOyLnOygkOyXkCDrqZTrqqjrpqzrpbwg64+Z6riw66GcIOqwseyLoO2VmOqzoCwgc3RvcmUg7Iuk7Yyo64qUIHRlbGVtZXRyeeuhnOunjCDquLDroZ3tlZjrqbAgcmVqZWN07ZWY7KeAIOyViuuKlOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFJlZ2lzdHJ5IHtcbiAgcmVhZG9ubHkgbm9kZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvY2FsQ29ubmVjdGlvbnMgPSBuZXcgV2ViU29ja2V0TG9jYWxDb25uZWN0aW9uU3RvcmUoKTtcbiAgcmVhZG9ubHkgcHJlc2VuY2VTdG9yZTogV2ViU29ja2V0UHJlc2VuY2VTdG9yZTtcbiAgcmVhZG9ubHkgY2x1c3RlckJ1czogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgcmVhZG9ubHkgdGVsZW1ldHJ5Q29udHJvbGxlcjogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnkgPSBuZXcgV2ViU29ja2V0UHJlc2VuY2VJbmRleCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGl2ZXJ5RW5naW5lOiBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZTtcbiAgcHJpdmF0ZSByZWFkb25seSBkcmFpblRpbWVvdXRNczogbnVtYmVyO1xuICAvLyDshLjshZjrs4Qgc3RvcmUgbXV0YXRpb24g7YGQ7J2YIOq8rOumrC4g6rCZ7J2AIOyEuOyFmOydmCDtmLjstpzsnYAg7J20IHByb21pc2Ug65Kk7JeQIOydtOyWtCDrtpnslrQg7Zi47LacIOyInOyEnOuMgOuhnCBzdG9yZeyXkCDrj4Tri6ztlZzri6RcbiAgcHJpdmF0ZSByZWFkb25seSBtdXRhdGlvblF1ZXVlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucykge1xuICAgIHRoaXMubm9kZUlkID0gb3B0aW9ucy5ub2RlSWQ7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlID0gb3B0aW9ucy5wcmVzZW5jZVN0b3JlID8/IG5ldyBJbk1lbW9yeVdlYlNvY2tldFByZXNlbmNlU3RvcmUoKTtcbiAgICB0aGlzLmNsdXN0ZXJCdXMgPSBvcHRpb25zLmNsdXN0ZXJCdXMgPz8gbmV3IE5vb3BXZWJTb2NrZXRDbHVzdGVyQnVzKCk7XG4gICAgdGhpcy5kcmFpblRpbWVvdXRNcyA9IG9wdGlvbnMuZHJhaW5UaW1lb3V0TXMgPz8gREVGQVVMVF9EUkFJTl9USU1FT1VUX01TO1xuICAgIGFzc2VydE1hdGNoaW5nTm9kZUlkKFwicHJlc2VuY2VTdG9yZVwiLCB0aGlzLnByZXNlbmNlU3RvcmUubm9kZUlkLCB0aGlzLm5vZGVJZCk7XG4gICAgYXNzZXJ0TWF0Y2hpbmdOb2RlSWQoXCJjbHVzdGVyQnVzXCIsIHRoaXMuY2x1c3RlckJ1cy5ub2RlSWQsIHRoaXMubm9kZUlkKTtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIgPVxuICAgICAgb3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyID8/IG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUgPSBuZXcgV2ViU29ja2V0RGVsaXZlcnlFbmdpbmUoe1xuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IHRoaXMubG9jYWxDb25uZWN0aW9ucyxcbiAgICAgIHJlc29sdmVMb2NhbFNlc3Npb25JZHM6IChhdWRpZW5jZSkgPT5cbiAgICAgICAgdGhpcy5tZW1vcnkucXVlcnlBdWRpZW5jZShhdWRpZW5jZSkubWFwKChzZXNzaW9uKSA9PiBzZXNzaW9uLnNlc3Npb25JZCksXG4gICAgICBhdWRpZW5jZVJlc29sdmVyOiBuZXcgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcih7XG4gICAgICAgIG5vZGVJZDogdGhpcy5ub2RlSWQsXG4gICAgICAgIHByZXNlbmNlU3RvcmU6IHRoaXMucHJlc2VuY2VTdG9yZSxcbiAgICAgIH0pLFxuICAgICAgY2x1c3RlckJ1czogdGhpcy5jbHVzdGVyQnVzLFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH0pO1xuXG4gICAgLy8gdGVsZW1ldHJ564qUIOuFuOuTnCDroZzsu6wg66mU66qo66as66eMIOynkeqzhO2VnOuLpC4g7YG065+s7Iqk7YSwIO2VqeqzhOulvCDrqqjrk6Ag64W465Oc6rCAIOuztOqzoO2VmOuptCDsp5Hqs4Qg7IucIOykkeuzteuQmOq4sCDrlYzrrLjsnbTri6RcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVnaXN0ZXJNZXRyaWNTb3VyY2Uoe1xuICAgICAgY29sbGVjdDogKF9ub3cpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLm1lbW9yeS5nZXRTdGF0cygpO1xuICAgICAgICBjb25zdCBsb2NhbFNuYXBzaG90ID0gdGhpcy5sb2NhbENvbm5lY3Rpb25zLmdldFRlbGVtZXRyeVNuYXBzaG90KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aXZlQ29ubmVjdGlvbnM6IHN0YXRzLnRvdGFsQ29ubmVjdGlvbnMsXG4gICAgICAgICAgYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZTogc3RhdHMuYnlOYW1lc3BhY2UsXG4gICAgICAgICAgcm9vbUNvdW50OiBzdGF0cy50b3RhbFJvb21zLFxuICAgICAgICAgIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IGxvY2FsU25hcHNob3QucGVuZGluZ0luYm91bmRNZXNzYWdlcyxcbiAgICAgICAgICBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogbG9jYWxTbmFwc2hvdC5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcyxcbiAgICAgICAgICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiBsb2NhbFNuYXBzaG90LnNvY2tldEJ1ZmZlcmVkQnl0ZXMsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJSb3V0ZShyb3V0ZUtleTogc3RyaW5nLCBvdXRFdmVudHM6IHouWm9kT2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5kZWxpdmVyeUVuZ2luZS5yZWdpc3RlclJvdXRlKHJvdXRlS2V5LCBvdXRFdmVudHMpO1xuICB9XG5cbiAgcmVwbGFjZVJvdXRlcyhyb3V0ZXM6IFdlYlNvY2tldFJvdXRlRGVmaW5pdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5kZWxpdmVyeUVuZ2luZS5yZXBsYWNlUm91dGVzKHJvdXRlcyk7XG4gIH1cblxuICAvKipcbiAgICog7Jew6rKw7J2EIOuplOuqqOumrOyXkCDsponsi5wg65Ox66Gd7ZWY6rOgIHN0b3JlLnJlZ2lzdGVy6rCAIOuBneuCmOuptCByZXNvbHZl7ZWc64ukLlxuICAgKiBzdG9yZeqwgCDsi6TtjKjtlbTrj4Qg66mU66qo66asIOyghOyaqSDrk7HroZ3snLzroZwgcmVzb2x2Ze2VnOuLpC5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIGNvbm5lY3Rpb246IFdlYlNvY2tldEZyYW1lQ29ubmVjdGlvbixcbiAgICBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPFdlYlNvY2tldENvbm5lY3Rpb25NZXRhPiB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0ge1xuICAgICAgc2Vzc2lvbklkOiBjb25uZWN0aW9uLmlkLFxuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UsXG4gICAgICBhY3RpdmUsXG4gICAgICBjb25uZWN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICB9O1xuICAgIHRoaXMubG9jYWxDb25uZWN0aW9ucy5yZWdpc3Rlcihjb25uZWN0aW9uKTtcbiAgICB0aGlzLm1lbW9yeS5yZWdpc3RlcihyZWdpc3RyYXRpb24pO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MuY29ubmVjdGlvbi5yZWdpc3RlcmVkXCIsXG4gICAgICBsZXZlbDogXCJpbmZvXCIsXG4gICAgICBjb25uZWN0aW9uSWQ6IGNvbm5lY3Rpb24uaWQsXG4gICAgICBuYW1lc3BhY2U6IGNvbm5lY3Rpb24ubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uLnVzZXJJZCxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pLFxuICAgIH0pO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRNZXRyaWMoe1xuICAgICAgbmFtZTogXCJzb25hbXUud3MuY29ubmVjdGlvbnNcIixcbiAgICAgIGtpbmQ6IFwiY291bnRlclwiLFxuICAgICAgdmFsdWU6IDEsXG4gICAgICB1bml0OiBcIjFcIixcbiAgICAgIHRhZ3M6IHsgb3V0Y29tZTogXCJyZWdpc3RlcmVkXCIsIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UgfSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbi51c2VySWQsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmVucXVldWVTdG9yZU11dGF0aW9uKGNvbm5lY3Rpb24uaWQsIFwicmVnaXN0ZXJcIiwgKCkgPT5cbiAgICAgIHRoaXMucHJlc2VuY2VTdG9yZS5yZWdpc3RlcihyZWdpc3RyYXRpb24pLFxuICAgICk7XG4gICAgLy8g65Ox66GdIOuPhOykkSDri6vtmJTsnLzrqbQg66mU66qo66as7JeQ7IScIOydtOuvuCDruaDsoYzsnLzrr4DroZwg65Ox66GdIOyLnOygkCDqsJLsnYQg64+M66Ck7KSA64ukXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubWVtb3J5LmdldENvbm5lY3Rpb24oY29ubmVjdGlvbi5pZCkgPz8ge1xuICAgICAgICAuLi5yZWdpc3RyYXRpb24sXG4gICAgICAgIHJvb21zOiBuZXcgU2V0KCksXG4gICAgICAgIGxhc3RTZWVuQXQ6IHJlZ2lzdHJhdGlvbi5jb25uZWN0ZWRBdCxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWN0aXZhdGUoY29ubmVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubWVtb3J5Lmhhcyhjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJhY3RpdmF0ZVwiIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHRoaXMubWVtb3J5LmFjdGl2YXRlKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLmFjdGl2YXRlZFwiLFxuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uPy51c2VySWQsXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dChjb25uZWN0aW9uKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlU3RvcmVNdXRhdGlvbihjb25uZWN0aW9uSWQsIFwiYWN0aXZhdGVcIiwgKCkgPT5cbiAgICAgIHRoaXMucHJlc2VuY2VTdG9yZS5hY3RpdmF0ZShjb25uZWN0aW9uSWQpLFxuICAgICk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgdGVsZW1ldHJ5Q29udGV4dCA9IGdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLm1lbW9yeS51bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgdXNlcklkID0gY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhPy51c2VySWQpO1xuICAgIHRoaXMubG9jYWxDb25uZWN0aW9ucy51bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnVucmVnaXN0ZXJlZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIG5hbWVzcGFjZTogbWV0YT8ubmFtZXNwYWNlLFxuICAgICAgdXNlcklkLFxuICAgICAgLi4udGVsZW1ldHJ5Q29udGV4dCxcbiAgICB9KTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgIG5hbWU6IFwic29uYW11LndzLmNvbm5lY3Rpb25zXCIsXG4gICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgIHZhbHVlOiAxLFxuICAgICAgdW5pdDogXCIxXCIsXG4gICAgICB0YWdzOiB7IG91dGNvbWU6IFwidW5yZWdpc3RlcmVkXCIsIG5hbWVzcGFjZTogbWV0YS5uYW1lc3BhY2UgfSxcbiAgICAgIHVzZXJJZCxcbiAgICB9KTtcbiAgICAvLyDqsJnsnYAg7IS47IWYIO2BkOyXkCDsnbTslrQg67aZ7Jy866+A66GcIOynhO2WiSDspJHsnbggcmVnaXN0ZXLrs7Tri6Qg66i87KCAIHN0b3Jl7JeQIOuPhOuLrO2VmOyngCDslYrripTri6RcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlU3RvcmVNdXRhdGlvbihjb25uZWN0aW9uSWQsIFwidW5yZWdpc3RlclwiLCAoKSA9PlxuICAgICAgdGhpcy5wcmVzZW5jZVN0b3JlLnVucmVnaXN0ZXIoY29ubmVjdGlvbklkKSxcbiAgICApO1xuICB9XG5cbiAgLy8gbGFzdFNlZW5BdOydgCDrqZTrqqjrpqzrp4wg6rCx7Iug7ZWc64ukLiBzdG9yZeyXkOuKlCDrp4jsp4Drp4kgbXV0YXRpb24g7Iuc7KCQIOqwkuydtCDrgqjripTri6RcbiAgdG91Y2goY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1lbW9yeS50b3VjaChjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgc2V0VXNlcklkKGNvbm5lY3Rpb25JZDogc3RyaW5nLCB1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLm1lbW9yeS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJzZXRVc2VySWRcIiwgdXNlcklkIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHRoaXMubWVtb3J5LnNldFVzZXJJZChjb25uZWN0aW9uSWQsIHVzZXJJZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy51c2VyLmJvdW5kXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogU3RyaW5nKHVzZXJJZCksXG4gICAgICBkZXRhaWw6IHsgdXNlcklkIH0sXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dCh0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlU3RvcmVNdXRhdGlvbihjb25uZWN0aW9uSWQsIFwic2V0VXNlcklkXCIsICgpID0+XG4gICAgICB0aGlzLnByZXNlbmNlU3RvcmUuc2V0VXNlcklkKGNvbm5lY3Rpb25JZCwgdXNlcklkKSxcbiAgICApO1xuICB9XG5cbiAgY2xlYXJVc2VySWQoY29ubmVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5tZW1vcnkuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgdGhpcy5lbWl0TXV0YXRpb25Ta2lwcGVkKGNvbm5lY3Rpb25JZCwgeyBvcGVyYXRpb246IFwiY2xlYXJVc2VySWRcIiB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VySWQgPSBtZXRhLnVzZXJJZDtcbiAgICB0aGlzLm1lbW9yeS5jbGVhclVzZXJJZChjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MudXNlci5jbGVhcmVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogZm9ybWF0VXNlcklkKHVzZXJJZCksXG4gICAgICBkZXRhaWw6IHVzZXJJZCAhPT0gdW5kZWZpbmVkID8geyB1c2VySWQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkpLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmVucXVldWVTdG9yZU11dGF0aW9uKGNvbm5lY3Rpb25JZCwgXCJjbGVhclVzZXJJZFwiLCAoKSA9PlxuICAgICAgdGhpcy5wcmVzZW5jZVN0b3JlLmNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZCksXG4gICAgKTtcbiAgfVxuXG4gIGpvaW4oY29ubmVjdGlvbklkOiBzdHJpbmcsIHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMubWVtb3J5LmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHRoaXMuZW1pdE11dGF0aW9uU2tpcHBlZChjb25uZWN0aW9uSWQsIHsgb3BlcmF0aW9uOiBcImpvaW5cIiwgcm9vbUlkIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHRoaXMubWVtb3J5LmpvaW4oY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5qb2luZWRcIixcbiAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBuYW1lc3BhY2U6IG1ldGEubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uPy51c2VySWQgPz8gZm9ybWF0VXNlcklkKG1ldGEudXNlcklkKSxcbiAgICAgIGRldGFpbDogeyByb29tSWQgfSxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmVucXVldWVTdG9yZU11dGF0aW9uKGNvbm5lY3Rpb25JZCwgXCJqb2luXCIsICgpID0+XG4gICAgICB0aGlzLnByZXNlbmNlU3RvcmUuam9pbihjb25uZWN0aW9uSWQsIHJvb21JZCksXG4gICAgKTtcbiAgfVxuXG4gIGxlYXZlKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLm1lbW9yeS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJsZWF2ZVwiLCByb29tSWQgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tZW1vcnkubGVhdmUoY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5sZWZ0XCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhLnVzZXJJZCksXG4gICAgICBkZXRhaWw6IHsgcm9vbUlkIH0sXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dChjb25uZWN0aW9uKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlU3RvcmVNdXRhdGlvbihjb25uZWN0aW9uSWQsIFwibGVhdmVcIiwgKCkgPT5cbiAgICAgIHRoaXMucHJlc2VuY2VTdG9yZS5sZWF2ZShjb25uZWN0aW9uSWQsIHJvb21JZCksXG4gICAgKTtcbiAgfVxuXG4gIGJyb2FkY2FzdDxEYXRhPihldmVudDogc3RyaW5nLCBkYXRhOiBEYXRhLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5hbGwobmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbTxEYXRhPihcbiAgICByb29tSWQ6IFdlYlNvY2tldFJvb21JZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5yb29tKHJvb21JZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvVXNlcjxEYXRhPihcbiAgICB1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS51c2VyKHVzZXJJZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvQXVkaWVuY2U8RGF0YT4oXG4gICAgYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlU3BlYyxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRlbGl2ZXJ5RW5naW5lLnB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlLCBldmVudCwgZGF0YSk7XG4gIH1cblxuICAvLyDslYTrnpgg7J296riwIEFQSeuKlCDrhbjrk5wg66Gc7LusIHNuYXBzaG90KOuzteyCrOuzuCnsnbTri6RcbiAgZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZW1vcnkuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbkNvdW50KG5hbWVzcGFjZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5LmdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhW10ge1xuICAgIHJldHVybiB0aGlzLm1lbW9yeS5nZXRSb29tTWVtYmVycyhyb29tSWQsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBXZWJTb2NrZXRSZWdpc3RyeVN0YXRzIHtcbiAgICByZXR1cm4gdGhpcy5tZW1vcnkuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtgbTrn6zsiqTthLAg7KCE7LK07J2YIO2ZnOyEsSDrsKkg7J247JuQ7IiYLiBzdG9yZeqwgCDsi6TtjKjtlZjrqbQg64W465OcIOuhnOy7rCDsiJjsl5AgcGFydGlhbDogdHJ1ZeulvCDrtpnsl6wg67CY7ZmY7ZWY66mwIHJlamVjdO2VmOyngCDslYrripTri6QuXG4gICAqL1xuICBhc3luYyBnZXRSb29tTWVtYmVyQ291bnQoXG4gICAgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFdlYlNvY2tldFJvb21NZW1iZXJDb3VudD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb3VudCA9IGF3YWl0IGNhbGxTdG9yZSgoKSA9PiB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Um9vbU1lbWJlckNvdW50KHJvb21JZCwgbmFtZXNwYWNlKSk7XG4gICAgICByZXR1cm4geyBjb3VudCwgcGFydGlhbDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLnJlZ2lzdHJ5LnJlYWQuZmFpbGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7IG9wZXJhdGlvbjogXCJnZXRSb29tTWVtYmVyQ291bnRcIiwgcm9vbUlkLCBlcnJvclR5cGU6IGRlc2NyaWJlRXJyb3IoY2F1c2UpIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IGNvdW50OiB0aGlzLm1lbW9yeS5nZXRSb29tTWVtYmVyQ291bnQocm9vbUlkLCBuYW1lc3BhY2UpLCBwYXJ0aWFsOiB0cnVlIH07XG4gICAgfVxuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog66Gc7LusIOyXsOqysOydhCDri6vqs6AsIOynhO2WiSDspJHsnbggc3RvcmUgbXV0YXRpb27qs7wgcHVibGlzaOulvCBkcmFpblRpbWVvdXRNc+q5jOyngCDquLDri6TrprAg65KkIHN0b3Jl7JmAIGJ1c+ulvCDsooXro4ztlZzri6QuXG4gICAqL1xuICBhc3luYyBzaHV0ZG93bihjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG5cbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChyZXNvbHZlLCB0aGlzLmRyYWluVGltZW91dE1zKTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgUHJvbWlzZS5hbGwoWy4uLnRoaXMubXV0YXRpb25RdWV1ZXMudmFsdWVzKCksIHRoaXMuZGVsaXZlcnlFbmdpbmUuZHJhaW5QdWJsaXNoZXMoKV0pLFxuICAgICAgICBkZWFkbGluZSxcbiAgICAgIF0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWxsU3RvcmUoKCkgPT4gdGhpcy5wcmVzZW5jZVN0b3JlLnNodXRkb3duPy4oKSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5yZWdpc3RyeS5zaHV0ZG93bi5mYWlsZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgICAgZGV0YWlsOiB7IGVycm9yVHlwZTogZGVzY3JpYmVFcnJvcihjYXVzZSkgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyDqtazrj4Ug7ZW07KCc64qUIGRyYWlu7J20IOuBneuCrOycvOuvgOuhnCDsponsi5wg7Y+s6riw7ZWgIOyImCDsnojqsowg7J2066+4IOuBneuCnCBkZWFkbGluZeydhCDrhJjquLTri6RcbiAgICBhd2FpdCB0aGlzLmRlbGl2ZXJ5RW5naW5lLnNodXRkb3duKFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshLjshZjrs4Qg7YGQIOuSpOyXkCBzdG9yZSDtmLjstpzsnYQg7J207Ja0IOu2meyduOuLpC4g7Iuk7Yyo64qUIHRlbGVtZXRyeeuhnOunjCDquLDroZ3tlZjqs6AsIOuwmO2ZmO2VnCBwcm9taXNl64qUIHJlamVjdO2VmOyngCDslYrripTri6QuXG4gICAqL1xuICBwcml2YXRlIGVucXVldWVTdG9yZU11dGF0aW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogU3RvcmVNdXRhdGlvbk9wZXJhdGlvbixcbiAgICBjYWxsOiAoKSA9PiBNYXliZVByb21pc2U8dm9pZD4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5tdXRhdGlvblF1ZXVlcy5nZXQoc2Vzc2lvbklkKSA/PyBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBjb25zdCBuZXh0OiBQcm9taXNlPHZvaWQ+ID0gcHJldmlvdXNcbiAgICAgIC50aGVuKGNhbGwpXG4gICAgICAudGhlbihcbiAgICAgICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgICBuYW1lOiBcIndzLnJlZ2lzdHJ5Lm11dGF0aW9uLmZhaWxlZFwiLFxuICAgICAgICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgICAgICAgY29ubmVjdGlvbklkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICBkZXRhaWw6IHsgb3BlcmF0aW9uLCBlcnJvclR5cGU6IGRlc2NyaWJlRXJyb3IoY2F1c2UpIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIOuniOyngOuniSBtdXRhdGlvbuydtCDrgZ3rgpjrqbQg7YGQ66W8IOu5hOybjCDshLjshZgg7IiY66eM7YG8IHByb21pc2XqsIAg7IyT7J207KeAIOyViuqyjCDtlZzri6RcbiAgICAgICAgaWYgKHRoaXMubXV0YXRpb25RdWV1ZXMuZ2V0KHNlc3Npb25JZCkgPT09IG5leHQpIHtcbiAgICAgICAgICB0aGlzLm11dGF0aW9uUXVldWVzLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uUXVldWVzLnNldChzZXNzaW9uSWQsIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TXV0YXRpb25Ta2lwcGVkKFxuICAgIGNvbm5lY3Rpb25JZDogc3RyaW5nLFxuICAgIGRldGFpbDoge1xuICAgICAgb3BlcmF0aW9uOiBcImFjdGl2YXRlXCIgfCBcInNldFVzZXJJZFwiIHwgXCJjbGVhclVzZXJJZFwiIHwgXCJqb2luXCIgfCBcImxlYXZlXCI7XG4gICAgICByb29tSWQ/OiBXZWJTb2NrZXRSb29tSWQ7XG4gICAgICB1c2VySWQ/OiBXZWJTb2NrZXRVc2VySWQ7XG4gICAgfSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5yZWdpc3RyeS5tdXRhdGlvbi5za2lwcGVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgZGV0YWlsOiB7IC4uLmRldGFpbCwgcmVhc29uOiBcImNvbm5lY3Rpb25NaXNzaW5nXCIgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBzdG9yZSDtmLjstpzsnZgg64+Z6riwIHRocm9366W8IHJlamVjdGlvbuycvOuhnCDrsJTqvrzri6RcbmZ1bmN0aW9uIGNhbGxTdG9yZTxUPihjYWxsOiAoKSA9PiBNYXliZVByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oY2FsbCk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydE1hdGNoaW5nTm9kZUlkKFxuICBzb3VyY2U6IFwicHJlc2VuY2VTdG9yZVwiIHwgXCJjbHVzdGVyQnVzXCIsXG4gIHNvdXJjZU5vZGVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBub2RlSWQ6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAoc291cmNlTm9kZUlkICE9PSB1bmRlZmluZWQgJiYgc291cmNlTm9kZUlkICE9PSBub2RlSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgV2ViU29ja2V0ICR7c291cmNlfS5ub2RlSWQgKCR7c291cmNlTm9kZUlkfSkgbXVzdCBtYXRjaCB0aGUgcnVudGltZSBub2RlSWQgKCR7bm9kZUlkfSkuYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRXJyb3IoY2F1c2U6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm5hbWUgOiBydW50aW1lVHlwZU9mKGNhdXNlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoXG4gIGNvbm5lY3Rpb246IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uIHwgdW5kZWZpbmVkLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICBpZiAoIWNvbm5lY3Rpb24gfHwgIWlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKGNvbm5lY3Rpb24pKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0VGVsZW1ldHJ5Q29udGV4dCgpO1xufVxuXG4vLyB0ZWxlbWV0cnkgcmVjb3Jk7J2YIHVzZXJJZOuKlCBzdHJpbmcg7KCV6rec7ZmUIOKAlCBwcmVzZW5jZeuKlCBudW1iZXIgfCBzdHJpbmcg6re464yA66GcIOuztOq0gO2VqFxuZnVuY3Rpb24gZm9ybWF0VXNlcklkKHVzZXJJZDogV2ViU29ja2V0VXNlcklkIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHVzZXJJZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RyaW5nKHVzZXJJZCk7XG59XG5cbmZ1bmN0aW9uIGlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKFxuICBjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbik6IGNvbm5lY3Rpb24gaXMgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gJiBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICByZXR1cm4gXCJnZXRUZWxlbWV0cnlDb250ZXh0XCIgaW4gY29ubmVjdGlvbiAmJiBpc0Z1bmN0aW9uVmFsdWUoY29ubmVjdGlvbi5nZXRUZWxlbWV0cnlDb250ZXh0KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBMmRBLFNBQVMsVUFBYSxNQUF5QztDQUM3RCxPQUFPLFFBQVEsUUFBUSxDQUFDLENBQUMsS0FBSyxJQUFJO0FBQ3BDO0FBRUEsU0FBUyxxQkFDUCxRQUNBLGNBQ0EsUUFDTTtDQUNOLElBQUksaUJBQWlCLFVBQWEsaUJBQWlCLFFBQ2pELE1BQU0sSUFBSSxNQUNSLGFBQWEs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
377
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcmVnaXN0cnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJ1bnRpbWVUeXBlT2YgfSBmcm9tIFwiLi4vcnVudGltZS10eXBlXCI7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0QXVkaWVuY2UsIHR5cGUgV2ViU29ja2V0QXVkaWVuY2UgYXMgV2ViU29ja2V0QXVkaWVuY2VTcGVjIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IFdlYlNvY2tldEF1ZGllbmNlUmVzb2x2ZXIgfSBmcm9tIFwiLi93cy1hdWRpZW5jZS1yZXNvbHZlclwiO1xuaW1wb3J0IHsgTm9vcFdlYlNvY2tldENsdXN0ZXJCdXMsIHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyB9IGZyb20gXCIuL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQge1xuICB0eXBlIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uLFxuICB0eXBlIE1heWJlUHJvbWlzZSxcbiAgdHlwZSBXZWJTb2NrZXRGcmFtZUNvbm5lY3Rpb24sXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgdHlwZSBXZWJTb2NrZXRSb29tSWQsXG4gIHR5cGUgV2ViU29ja2V0VXNlcklkLFxufSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSwgdHlwZSBXZWJTb2NrZXRSb3V0ZURlZmluaXRpb24gfSBmcm9tIFwiLi93cy1kZWxpdmVyeVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0TG9jYWxDb25uZWN0aW9uU3RvcmUgfSBmcm9tIFwiLi93cy1sb2NhbC1jb25uZWN0aW9uLXN0b3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRQcmVzZW5jZUluZGV4IH0gZnJvbSBcIi4vd3MtcHJlc2VuY2UtaW5kZXhcIjtcbmltcG9ydCB7XG4gIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSxcbiAgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSxcbn0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyLFxuICBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyLFxufSBmcm9tIFwiLi93cy10ZWxlbWV0cnlcIjtcblxuZXhwb3J0IHR5cGUge1xuICBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgV2ViU29ja2V0Um9vbUlkLFxuICBXZWJTb2NrZXRVc2VySWQsXG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbk1ldGEgPSBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG5leHBvcnQgdHlwZSBXZWJTb2NrZXRSb29tTWVtYmVyQ291bnQgPSB7XG4gIGNvdW50OiBudW1iZXI7XG4gIC8vIHN0b3JlIOyhsO2ajOyXkCDsi6TtjKjtlbQg64W465OcIOuhnOy7rCDsiJjroZwg64yA7LK07ZaI7Jy866m0IHRydWVcbiAgcGFydGlhbDogYm9vbGVhbjtcbn07XG5cbmNvbnN0IERFRkFVTFRfRFJBSU5fVElNRU9VVF9NUyA9IDUwMDA7XG5cbnR5cGUgU3RvcmVNdXRhdGlvbk9wZXJhdGlvbiA9XG4gIHwgXCJyZWdpc3RlclwiXG4gIHwgXCJhY3RpdmF0ZVwiXG4gIHwgXCJ1bnJlZ2lzdGVyXCJcbiAgfCBcInNldFVzZXJJZFwiXG4gIHwgXCJjbGVhclVzZXJJZFwiXG4gIHwgXCJqb2luXCJcbiAgfCBcImxlYXZlXCI7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgLy8g67aE7IKwIO2ZmOqyveyXkOyEnCDrhbjrk5wg6rCEIOudvOyasO2MhSDsi53rs4TsnpDroZwg7JOw7J2066+A66GcIOuwmOuTnOyLnCDtmLjstpwg7LihKFdlYlNvY2tldFJ1bnRpbWUp7JeQ7IScIOqysOygle2VtCDrhJjquLTri6RcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5Q29udHJvbGxlcj86IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIC8vIHNodXRkb3duIOyLnCDsp4Ttlokg7KSR7J24IHN0b3JlIG11dGF0aW9u6rO8IHB1Ymxpc2jrpbwg6riw64uk66as64qUIOyDge2VnFxuICBkcmFpblRpbWVvdXRNcz86IG51bWJlcjtcbn07XG5cbi8qKlxuICog64W465OcIOuhnOy7rCBwcmVzZW5jZeulvCDrqZTrqqjrpqzsl5Ag7IaM7Jyg7ZWY6rOgLCDshKTsoJXrkJwgc3RvcmXsl5DripQg7IS47IWY67OEIOyInOyEnOuMgOuhnCByZXBsaWNh66W8IOuwmOyYge2VnOuLpC5cbiAqIG11dGF0aW9u6rO8IHB1Ymxpc2jripQg7Zi47LacIOyLnOygkOyXkCDrqZTrqqjrpqzrpbwg64+Z6riw66GcIOqwseyLoO2VmOqzoCwgc3RvcmUg7Iuk7Yyo64qUIHRlbGVtZXRyeeuhnOunjCDquLDroZ3tlZjrqbAgcmVqZWN07ZWY7KeAIOyViuuKlOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFJlZ2lzdHJ5IHtcbiAgcmVhZG9ubHkgbm9kZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvY2FsQ29ubmVjdGlvbnMgPSBuZXcgV2ViU29ja2V0TG9jYWxDb25uZWN0aW9uU3RvcmUoKTtcbiAgcmVhZG9ubHkgcHJlc2VuY2VTdG9yZTogV2ViU29ja2V0UHJlc2VuY2VTdG9yZTtcbiAgcmVhZG9ubHkgY2x1c3RlckJ1czogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgcmVhZG9ubHkgdGVsZW1ldHJ5Q29udHJvbGxlcjogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnkgPSBuZXcgV2ViU29ja2V0UHJlc2VuY2VJbmRleCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGl2ZXJ5RW5naW5lOiBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZTtcbiAgcHJpdmF0ZSByZWFkb25seSBkcmFpblRpbWVvdXRNczogbnVtYmVyO1xuICAvLyDshLjshZjrs4Qgc3RvcmUgbXV0YXRpb24g7YGQ7J2YIOq8rOumrC4g6rCZ7J2AIOyEuOyFmOydmCDtmLjstpzsnYAg7J20IHByb21pc2Ug65Kk7JeQIOydtOyWtCDrtpnslrQg7Zi47LacIOyInOyEnOuMgOuhnCBzdG9yZeyXkCDrj4Tri6ztlZzri6RcbiAgcHJpdmF0ZSByZWFkb25seSBtdXRhdGlvblF1ZXVlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucykge1xuICAgIHRoaXMubm9kZUlkID0gb3B0aW9ucy5ub2RlSWQ7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlID0gb3B0aW9ucy5wcmVzZW5jZVN0b3JlID8/IG5ldyBJbk1lbW9yeVdlYlNvY2tldFByZXNlbmNlU3RvcmUoKTtcbiAgICB0aGlzLmNsdXN0ZXJCdXMgPSBvcHRpb25zLmNsdXN0ZXJCdXMgPz8gbmV3IE5vb3BXZWJTb2NrZXRDbHVzdGVyQnVzKCk7XG4gICAgdGhpcy5kcmFpblRpbWVvdXRNcyA9IG9wdGlvbnMuZHJhaW5UaW1lb3V0TXMgPz8gREVGQVVMVF9EUkFJTl9USU1FT1VUX01TO1xuICAgIGFzc2VydE1hdGNoaW5nTm9kZUlkKFwicHJlc2VuY2VTdG9yZVwiLCB0aGlzLnByZXNlbmNlU3RvcmUubm9kZUlkLCB0aGlzLm5vZGVJZCk7XG4gICAgYXNzZXJ0TWF0Y2hpbmdOb2RlSWQoXCJjbHVzdGVyQnVzXCIsIHRoaXMuY2x1c3RlckJ1cy5ub2RlSWQsIHRoaXMubm9kZUlkKTtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIgPVxuICAgICAgb3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyID8/IG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUgPSBuZXcgV2ViU29ja2V0RGVsaXZlcnlFbmdpbmUoe1xuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IHRoaXMubG9jYWxDb25uZWN0aW9ucyxcbiAgICAgIHJlc29sdmVMb2NhbFNlc3Npb25JZHM6IChhdWRpZW5jZSkgPT5cbiAgICAgICAgdGhpcy5tZW1vcnkucXVlcnlBdWRpZW5jZShhdWRpZW5jZSkubWFwKChzZXNzaW9uKSA9PiBzZXNzaW9uLnNlc3Npb25JZCksXG4gICAgICBhdWRpZW5jZVJlc29sdmVyOiBuZXcgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcih7XG4gICAgICAgIG5vZGVJZDogdGhpcy5ub2RlSWQsXG4gICAgICAgIHByZXNlbmNlU3RvcmU6IHRoaXMucHJlc2VuY2VTdG9yZSxcbiAgICAgIH0pLFxuICAgICAgY2x1c3RlckJ1czogdGhpcy5jbHVzdGVyQnVzLFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH0pO1xuXG4gICAgLy8gdGVsZW1ldHJ564qUIOuFuOuTnCDroZzsu6wg66mU66qo66as66eMIOynkeqzhO2VnOuLpC4g7YG065+s7Iqk7YSwIO2VqeqzhOulvCDrqqjrk6Ag64W465Oc6rCAIOuztOqzoO2VmOuptCDsp5Hqs4Qg7IucIOykkeuzteuQmOq4sCDrlYzrrLjsnbTri6RcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVnaXN0ZXJNZXRyaWNTb3VyY2Uoe1xuICAgICAgY29sbGVjdDogKF9ub3cpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLm1lbW9yeS5nZXRTdGF0cygpO1xuICAgICAgICBjb25zdCBsb2NhbFNuYXBzaG90ID0gdGhpcy5sb2NhbENvbm5lY3Rpb25zLmdldFRlbGVtZXRyeVNuYXBzaG90KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWN0aXZlQ29ubmVjdGlvbnM6IHN0YXRzLnRvdGFsQ29ubmVjdGlvbnMsXG4gICAgICAgICAgYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZTogc3RhdHMuYnlOYW1lc3BhY2UsXG4gICAgICAgICAgcm9vbUNvdW50OiBzdGF0cy50b3RhbFJvb21zLFxuICAgICAgICAgIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IGxvY2FsU25hcHNob3QucGVuZGluZ0luYm91bmRNZXNzYWdlcyxcbiAgICAgICAgICBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogbG9jYWxTbmFwc2hvdC5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcyxcbiAgICAgICAgICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiBsb2NhbFNuYXBzaG90LnNvY2tldEJ1ZmZlcmVkQnl0ZXMsXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcmVnaXN0ZXJSb3V0ZShyb3V0ZUtleTogc3RyaW5nLCBvdXRFdmVudHM6IHouWm9kT2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5kZWxpdmVyeUVuZ2luZS5yZWdpc3RlclJvdXRlKHJvdXRlS2V5LCBvdXRFdmVudHMpO1xuICB9XG5cbiAgcmVwbGFjZVJvdXRlcyhyb3V0ZXM6IFdlYlNvY2tldFJvdXRlRGVmaW5pdGlvbltdKTogdm9pZCB7XG4gICAgdGhpcy5kZWxpdmVyeUVuZ2luZS5yZXBsYWNlUm91dGVzKHJvdXRlcyk7XG4gIH1cblxuICAvKipcbiAgICog7Jew6rKw7J2EIOuplOuqqOumrOyXkCDsponsi5wg65Ox66Gd7ZWY6rOgIHN0b3JlLnJlZ2lzdGVy6rCAIOuBneuCmOuptCByZXNvbHZl7ZWc64ukLlxuICAgKiBzdG9yZeqwgCDsi6TtjKjtlbTrj4Qg66mU66qo66asIOyghOyaqSDrk7HroZ3snLzroZwgcmVzb2x2Ze2VnOuLpC5cbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyKFxuICAgIGNvbm5lY3Rpb246IFdlYlNvY2tldEZyYW1lQ29ubmVjdGlvbixcbiAgICBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPFdlYlNvY2tldENvbm5lY3Rpb25NZXRhPiB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0ge1xuICAgICAgc2Vzc2lvbklkOiBjb25uZWN0aW9uLmlkLFxuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UsXG4gICAgICBhY3RpdmUsXG4gICAgICBjb25uZWN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICB9O1xuICAgIHRoaXMubG9jYWxDb25uZWN0aW9ucy5yZWdpc3Rlcihjb25uZWN0aW9uKTtcbiAgICB0aGlzLm1lbW9yeS5yZWdpc3RlcihyZWdpc3RyYXRpb24pO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MuY29ubmVjdGlvbi5yZWdpc3RlcmVkXCIsXG4gICAgICBsZXZlbDogXCJpbmZvXCIsXG4gICAgICBjb25uZWN0aW9uSWQ6IGNvbm5lY3Rpb24uaWQsXG4gICAgICBuYW1lc3BhY2U6IGNvbm5lY3Rpb24ubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uLnVzZXJJZCxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pLFxuICAgIH0pO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5yZWNvcmRNZXRyaWMoe1xuICAgICAgbmFtZTogXCJzb25hbXUud3MuY29ubmVjdGlvbnNcIixcbiAgICAgIGtpbmQ6IFwiY291bnRlclwiLFxuICAgICAgdmFsdWU6IDEsXG4gICAgICB1bml0OiBcIjFcIixcbiAgICAgIHRhZ3M6IHsgb3V0Y29tZTogXCJyZWdpc3RlcmVkXCIsIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UgfSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbi51c2VySWQsXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmVucXVldWVTdG9yZU11dGF0aW9uKGNvbm5lY3Rpb24uaWQsIFwicmVnaXN0ZXJcIiwgKCkgPT5cbiAgICAgIHRoaXMucHJlc2VuY2VTdG9yZS5yZWdpc3RlcihyZWdpc3RyYXRpb24pLFxuICAgICk7XG4gICAgLy8g65Ox66GdIOuPhOykkSDri6vtmJTsnLzrqbQg66mU66qo66as7JeQ7IScIOydtOuvuCDruaDsoYzsnLzrr4DroZwg65Ox66GdIOyLnOygkCDqsJLsnYQg64+M66Ck7KSA64ukXG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubWVtb3J5LmdldENvbm5lY3Rpb24oY29ubmVjdGlvbi5pZCkgPz8ge1xuICAgICAgICAuLi5yZWdpc3RyYXRpb24sXG4gICAgICAgIHJvb21zOiBuZXcgU2V0KCksXG4gICAgICAgIGxhc3RTZWVuQXQ6IHJlZ2lzdHJhdGlvbi5jb25uZWN0ZWRBdCxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYWN0aXZhdGUoY29ubmVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubWVtb3J5Lmhhcyhjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJhY3RpdmF0ZVwiIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHRoaXMubWVtb3J5LmFjdGl2YXRlKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLmFjdGl2YXRlZFwiLFxuICAgICAgbGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uPy51c2VySWQsXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dChjb25uZWN0aW9uKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlU3RvcmVNdXRhdGlvbihjb25uZWN0aW9uSWQsIFwiYWN0aXZhdGVcIiwgKCkgPT5cbiAgICAgIHRoaXMucHJlc2VuY2VTdG9yZS5hY3RpdmF0ZShjb25uZWN0aW9uSWQpLFxuICAgICk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgdGVsZW1ldHJ5Q29udGV4dCA9IGdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLm1lbW9yeS51bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgdXNlcklkID0gY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhPy51c2VySWQpO1xuICAgIHRoaXMubG9jYWxDb25uZWN0aW9ucy51bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnVucmVnaXN0ZXJlZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIG5hbWVzcGFjZTogbWV0YT8ubmFtZXNwYWNlLFxuICAgICAgdXNlcklkLFxuICAgICAgLi4udGVsZW1ldHJ5Q29udGV4dCxcbiAgICB9KTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgIG5hbWU6IFwic29uYW11LndzLmNvbm5lY3Rpb25zXCIsXG4gICAgICBraW5kOiBcImNvdW50ZXJcIixcbiAgICAgIHZhbHVlOiAxLFxuICAgICAgdW5pdDogXCIxXCIsXG4gICAgICB0YWdzOiB7IG91dGNvbWU6IFwidW5yZWdpc3RlcmVkXCIsIG5hbWVzcGFjZTogbWV0YS5uYW1lc3BhY2UgfSxcbiAgICAgIHVzZXJJZCxcbiAgICB9KTtcbiAgICAvLyDqsJnsnYAg7IS47IWYIO2BkOyXkCDsnbTslrQg67aZ7Jy866+A66GcIOynhO2WiSDspJHsnbggcmVnaXN0ZXLrs7Tri6Qg66i87KCAIHN0b3Jl7JeQIOuPhOuLrO2VmOyngCDslYrripTri6RcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlU3RvcmVNdXRhdGlvbihjb25uZWN0aW9uSWQsIFwidW5yZWdpc3RlclwiLCAoKSA9PlxuICAgICAgdGhpcy5wcmVzZW5jZVN0b3JlLnVucmVnaXN0ZXIoY29ubmVjdGlvbklkKSxcbiAgICApO1xuICB9XG5cbiAgLy8gbGFzdFNlZW5BdOydgCDrqZTrqqjrpqzrp4wg6rCx7Iug7ZWc64ukLiBzdG9yZeyXkOuKlCDrp4jsp4Drp4kgbXV0YXRpb24g7Iuc7KCQIOqwkuydtCDrgqjripTri6RcbiAgdG91Y2goY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1lbW9yeS50b3VjaChjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgc2V0VXNlcklkKGNvbm5lY3Rpb25JZDogc3RyaW5nLCB1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLm1lbW9yeS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJzZXRVc2VySWRcIiwgdXNlcklkIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHRoaXMubWVtb3J5LnNldFVzZXJJZChjb25uZWN0aW9uSWQsIHVzZXJJZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy51c2VyLmJvdW5kXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogU3RyaW5nKHVzZXJJZCksXG4gICAgICBkZXRhaWw6IHsgdXNlcklkIH0sXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dCh0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlU3RvcmVNdXRhdGlvbihjb25uZWN0aW9uSWQsIFwic2V0VXNlcklkXCIsICgpID0+XG4gICAgICB0aGlzLnByZXNlbmNlU3RvcmUuc2V0VXNlcklkKGNvbm5lY3Rpb25JZCwgdXNlcklkKSxcbiAgICApO1xuICB9XG5cbiAgY2xlYXJVc2VySWQoY29ubmVjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5tZW1vcnkuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIGlmICghbWV0YSkge1xuICAgICAgdGhpcy5lbWl0TXV0YXRpb25Ta2lwcGVkKGNvbm5lY3Rpb25JZCwgeyBvcGVyYXRpb246IFwiY2xlYXJVc2VySWRcIiB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VySWQgPSBtZXRhLnVzZXJJZDtcbiAgICB0aGlzLm1lbW9yeS5jbGVhclVzZXJJZChjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MudXNlci5jbGVhcmVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogZm9ybWF0VXNlcklkKHVzZXJJZCksXG4gICAgICBkZXRhaWw6IHVzZXJJZCAhPT0gdW5kZWZpbmVkID8geyB1c2VySWQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkpLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmVucXVldWVTdG9yZU11dGF0aW9uKGNvbm5lY3Rpb25JZCwgXCJjbGVhclVzZXJJZFwiLCAoKSA9PlxuICAgICAgdGhpcy5wcmVzZW5jZVN0b3JlLmNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZCksXG4gICAgKTtcbiAgfVxuXG4gIGpvaW4oY29ubmVjdGlvbklkOiBzdHJpbmcsIHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMubWVtb3J5LmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHRoaXMuZW1pdE11dGF0aW9uU2tpcHBlZChjb25uZWN0aW9uSWQsIHsgb3BlcmF0aW9uOiBcImpvaW5cIiwgcm9vbUlkIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIHRoaXMubWVtb3J5LmpvaW4oY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5qb2luZWRcIixcbiAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBuYW1lc3BhY2U6IG1ldGEubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uPy51c2VySWQgPz8gZm9ybWF0VXNlcklkKG1ldGEudXNlcklkKSxcbiAgICAgIGRldGFpbDogeyByb29tSWQgfSxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmVucXVldWVTdG9yZU11dGF0aW9uKGNvbm5lY3Rpb25JZCwgXCJqb2luXCIsICgpID0+XG4gICAgICB0aGlzLnByZXNlbmNlU3RvcmUuam9pbihjb25uZWN0aW9uSWQsIHJvb21JZCksXG4gICAgKTtcbiAgfVxuXG4gIGxlYXZlKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLm1lbW9yeS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJsZWF2ZVwiLCByb29tSWQgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tZW1vcnkubGVhdmUoY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5sZWZ0XCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhLnVzZXJJZCksXG4gICAgICBkZXRhaWw6IHsgcm9vbUlkIH0sXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dChjb25uZWN0aW9uKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlU3RvcmVNdXRhdGlvbihjb25uZWN0aW9uSWQsIFwibGVhdmVcIiwgKCkgPT5cbiAgICAgIHRoaXMucHJlc2VuY2VTdG9yZS5sZWF2ZShjb25uZWN0aW9uSWQsIHJvb21JZCksXG4gICAgKTtcbiAgfVxuXG4gIGJyb2FkY2FzdDxEYXRhPihldmVudDogc3RyaW5nLCBkYXRhOiBEYXRhLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5hbGwobmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbTxEYXRhPihcbiAgICByb29tSWQ6IFdlYlNvY2tldFJvb21JZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5yb29tKHJvb21JZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvVXNlcjxEYXRhPihcbiAgICB1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS51c2VyKHVzZXJJZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvQXVkaWVuY2U8RGF0YT4oXG4gICAgYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlU3BlYyxcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRhdGE6IERhdGEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRlbGl2ZXJ5RW5naW5lLnB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlLCBldmVudCwgZGF0YSk7XG4gIH1cblxuICAvLyDslYTrnpgg7J296riwIEFQSeuKlCDrhbjrk5wg66Gc7LusIHNuYXBzaG90KOuzteyCrOuzuCnsnbTri6RcbiAgZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tZW1vcnkuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbkNvdW50KG5hbWVzcGFjZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5LmdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhW10ge1xuICAgIHJldHVybiB0aGlzLm1lbW9yeS5nZXRSb29tTWVtYmVycyhyb29tSWQsIG5hbWVzcGFjZSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBXZWJTb2NrZXRSZWdpc3RyeVN0YXRzIHtcbiAgICByZXR1cm4gdGhpcy5tZW1vcnkuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtgbTrn6zsiqTthLAg7KCE7LK07J2YIO2ZnOyEsSDrsKkg7J247JuQ7IiYLiBzdG9yZeqwgCDsi6TtjKjtlZjrqbQg64W465OcIOuhnOy7rCDsiJjsl5AgcGFydGlhbDogdHJ1ZeulvCDrtpnsl6wg67CY7ZmY7ZWY66mwIHJlamVjdO2VmOyngCDslYrripTri6QuXG4gICAqL1xuICBhc3luYyBnZXRSb29tTWVtYmVyQ291bnQoXG4gICAgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFdlYlNvY2tldFJvb21NZW1iZXJDb3VudD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb3VudCA9IGF3YWl0IGNhbGxTdG9yZSgoKSA9PiB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Um9vbU1lbWJlckNvdW50KHJvb21JZCwgbmFtZXNwYWNlKSk7XG4gICAgICByZXR1cm4geyBjb3VudCwgcGFydGlhbDogZmFsc2UgfTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLnJlZ2lzdHJ5LnJlYWQuZmFpbGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7IG9wZXJhdGlvbjogXCJnZXRSb29tTWVtYmVyQ291bnRcIiwgcm9vbUlkLCBlcnJvclR5cGU6IGRlc2NyaWJlRXJyb3IoY2F1c2UpIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IGNvdW50OiB0aGlzLm1lbW9yeS5nZXRSb29tTWVtYmVyQ291bnQocm9vbUlkLCBuYW1lc3BhY2UpLCBwYXJ0aWFsOiB0cnVlIH07XG4gICAgfVxuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICog66Gc7LusIOyXsOqysOydhCDri6vqs6AsIOynhO2WiSDspJHsnbggc3RvcmUgbXV0YXRpb27qs7wgcHVibGlzaOulvCBkcmFpblRpbWVvdXRNc+q5jOyngCDquLDri6TrprAg65KkIHN0b3Jl7JmAIGJ1c+ulvCDsooXro4ztlZzri6QuXG4gICAqL1xuICBhc3luYyBzaHV0ZG93bihjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG5cbiAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChyZXNvbHZlLCB0aGlzLmRyYWluVGltZW91dE1zKTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgUHJvbWlzZS5hbGwoWy4uLnRoaXMubXV0YXRpb25RdWV1ZXMudmFsdWVzKCksIHRoaXMuZGVsaXZlcnlFbmdpbmUuZHJhaW5QdWJsaXNoZXMoKV0pLFxuICAgICAgICBkZWFkbGluZSxcbiAgICAgIF0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWxsU3RvcmUoKCkgPT4gdGhpcy5wcmVzZW5jZVN0b3JlLnNodXRkb3duPy4oKSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5yZWdpc3RyeS5zaHV0ZG93bi5mYWlsZWRcIixcbiAgICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgICAgZGV0YWlsOiB7IGVycm9yVHlwZTogZGVzY3JpYmVFcnJvcihjYXVzZSkgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyDqtazrj4Ug7ZW07KCc64qUIGRyYWlu7J20IOuBneuCrOycvOuvgOuhnCDsponsi5wg7Y+s6riw7ZWgIOyImCDsnojqsowg7J2066+4IOuBneuCnCBkZWFkbGluZeydhCDrhJjquLTri6RcbiAgICBhd2FpdCB0aGlzLmRlbGl2ZXJ5RW5naW5lLnNodXRkb3duKFByb21pc2UucmVzb2x2ZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshLjshZjrs4Qg7YGQIOuSpOyXkCBzdG9yZSDtmLjstpzsnYQg7J207Ja0IOu2meyduOuLpC4g7Iuk7Yyo64qUIHRlbGVtZXRyeeuhnOunjCDquLDroZ3tlZjqs6AsIOuwmO2ZmO2VnCBwcm9taXNl64qUIHJlamVjdO2VmOyngCDslYrripTri6QuXG4gICAqL1xuICBwcml2YXRlIGVucXVldWVTdG9yZU11dGF0aW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogU3RvcmVNdXRhdGlvbk9wZXJhdGlvbixcbiAgICBjYWxsOiAoKSA9PiBNYXliZVByb21pc2U8dm9pZD4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5tdXRhdGlvblF1ZXVlcy5nZXQoc2Vzc2lvbklkKSA/PyBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBjb25zdCBuZXh0OiBQcm9taXNlPHZvaWQ+ID0gcHJldmlvdXNcbiAgICAgIC50aGVuKGNhbGwpXG4gICAgICAudGhlbihcbiAgICAgICAgKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgICBuYW1lOiBcIndzLnJlZ2lzdHJ5Lm11dGF0aW9uLmZhaWxlZFwiLFxuICAgICAgICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgICAgICAgY29ubmVjdGlvbklkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICBkZXRhaWw6IHsgb3BlcmF0aW9uLCBlcnJvclR5cGU6IGRlc2NyaWJlRXJyb3IoY2F1c2UpIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIC8vIOuniOyngOuniSBtdXRhdGlvbuydtCDrgZ3rgpjrqbQg7YGQ66W8IOu5hOybjCDshLjshZgg7IiY66eM7YG8IHByb21pc2XqsIAg7IyT7J207KeAIOyViuqyjCDtlZzri6RcbiAgICAgICAgaWYgKHRoaXMubXV0YXRpb25RdWV1ZXMuZ2V0KHNlc3Npb25JZCkgPT09IG5leHQpIHtcbiAgICAgICAgICB0aGlzLm11dGF0aW9uUXVldWVzLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uUXVldWVzLnNldChzZXNzaW9uSWQsIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0TXV0YXRpb25Ta2lwcGVkKFxuICAgIGNvbm5lY3Rpb25JZDogc3RyaW5nLFxuICAgIGRldGFpbDoge1xuICAgICAgb3BlcmF0aW9uOiBcImFjdGl2YXRlXCIgfCBcInNldFVzZXJJZFwiIHwgXCJjbGVhclVzZXJJZFwiIHwgXCJqb2luXCIgfCBcImxlYXZlXCI7XG4gICAgICByb29tSWQ/OiBXZWJTb2NrZXRSb29tSWQ7XG4gICAgICB1c2VySWQ/OiBXZWJTb2NrZXRVc2VySWQ7XG4gICAgfSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5yZWdpc3RyeS5tdXRhdGlvbi5za2lwcGVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgZGV0YWlsOiB7IC4uLmRldGFpbCwgcmVhc29uOiBcImNvbm5lY3Rpb25NaXNzaW5nXCIgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBzdG9yZSDtmLjstpzsnZgg64+Z6riwIHRocm9366W8IHJlamVjdGlvbuycvOuhnCDrsJTqvrzri6RcbmZ1bmN0aW9uIGNhbGxTdG9yZTxUPihjYWxsOiAoKSA9PiBNYXliZVByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oY2FsbCk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydE1hdGNoaW5nTm9kZUlkKFxuICBzb3VyY2U6IFwicHJlc2VuY2VTdG9yZVwiIHwgXCJjbHVzdGVyQnVzXCIsXG4gIHNvdXJjZU5vZGVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBub2RlSWQ6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAoc291cmNlTm9kZUlkICE9PSB1bmRlZmluZWQgJiYgc291cmNlTm9kZUlkICE9PSBub2RlSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgV2ViU29ja2V0ICR7c291cmNlfS5ub2RlSWQgKCR7c291cmNlTm9kZUlkfSkgbXVzdCBtYXRjaCB0aGUgcnVudGltZSBub2RlSWQgKCR7bm9kZUlkfSkuYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRXJyb3IoY2F1c2U6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm5hbWUgOiBydW50aW1lVHlwZU9mKGNhdXNlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoXG4gIGNvbm5lY3Rpb246IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uIHwgdW5kZWZpbmVkLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICBpZiAoIWNvbm5lY3Rpb24gfHwgIWlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKGNvbm5lY3Rpb24pKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0VGVsZW1ldHJ5Q29udGV4dCgpO1xufVxuXG4vLyB0ZWxlbWV0cnkgcmVjb3Jk7J2YIHVzZXJJZOuKlCBzdHJpbmcg7KCV6rec7ZmUIOKAlCBwcmVzZW5jZeuKlCBudW1iZXIgfCBzdHJpbmcg6re464yA66GcIOuztOq0gO2VqFxuZnVuY3Rpb24gZm9ybWF0VXNlcklkKHVzZXJJZDogV2ViU29ja2V0VXNlcklkIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHVzZXJJZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RyaW5nKHVzZXJJZCk7XG59XG5cbmZ1bmN0aW9uIGlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKFxuICBjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbik6IGNvbm5lY3Rpb24gaXMgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gJiBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICByZXR1cm4gXCJnZXRUZWxlbWV0cnlDb250ZXh0XCIgaW4gY29ubmVjdGlvbiAmJiBpc0Z1bmN0aW9uVmFsdWUoY29ubmVjdGlvbi5nZXRUZWxlbWV0cnlDb250ZXh0KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBMmRBLFNBQVMsVUFBYSxNQUF5QztDQUM3RCxPQUFPLFFBQVEsUUFBUSxDQUFDLENBQUMsS0FBSyxJQUFJO0FBQ3BDO0FBRUEsU0FBUyxxQkFDUCxRQUNBLGNBQ0EsUUFDTTtDQUNOLElBQUksaUJBQWlCLFVBQWEsaUJBQWlCLFFBQ2pELE1BQU0sSUFBSSxNQUNSLGFBQWEs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
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { randomBytes, randomUUID } from "node:crypto";
3
3
  import { hostname } from "node:os";
4
- //#region src/stream/ws-session-id.ts
4
+ // src/stream/ws-session-id.ts
5
5
  /**
6
6
  * 기본 노드 ID를 만든다. 형식은 `${hostname()}-${process.pid}-${짧은 랜덤}`이다.
7
7
  * 컨테이너 재시작 뒤 hostname과 pid가 같아도 이전 노드의 stale 상태를 물려받지 않도록 랜덤 접미사를 붙인다.
@@ -30,7 +30,6 @@ var init_ws_session_id = __esmMin((() => {
30
30
  SESSION_ID_SEPARATOR = ":";
31
31
  SESSION_SUFFIX_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
32
32
  }));
33
- //#endregion
34
33
  init_ws_session_id();
35
34
  export { createWebSocketNodeId, createWebSocketSessionId, init_ws_session_id, parseWebSocketSessionNodeId };
36
35
 
@@ -1,5 +1,5 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
- //#region src/stream/ws-telemetry-memory.ts
2
+ // src/stream/ws-telemetry-memory.ts
3
3
  function applyTimeWindow(record, since, until) {
4
4
  if (since !== void 0 && record.timestamp < since) return false;
5
5
  if (until !== void 0 && record.timestamp > until) return false;
@@ -28,7 +28,7 @@ function estimateSpanBytes(_record) {
28
28
  var DEFAULT_MAX_RECORDS, DEFAULT_MAX_BYTES, InMemoryRingBuffer, InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore;
29
29
  var init_ws_telemetry_memory = __esmMin((() => {
30
30
  DEFAULT_MAX_RECORDS = 1e4;
31
- DEFAULT_MAX_BYTES = 10 * 1024 * 1024;
31
+ DEFAULT_MAX_BYTES = 10485760;
32
32
  InMemoryRingBuffer = class {
33
33
  slots;
34
34
  slotBytes;
@@ -166,8 +166,7 @@ var init_ws_telemetry_memory = __esmMin((() => {
166
166
  }
167
167
  };
168
168
  }));
169
- //#endregion
170
169
  init_ws_telemetry_memory();
171
170
  export { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, init_ws_telemetry_memory };
172
171
 
173
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LW1lbW9yeS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLXRlbGVtZXRyeS1tZW1vcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFF1ZXJ5RmlsdGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2luayxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTaW5rLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5RdWVyeUZpbHRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSxcbn0gZnJvbSBcIi4vd3MtdGVsZW1ldHJ5XCI7XG5cbnR5cGUgSW5NZW1vcnlTdG9yZU9wdGlvbnMgPSB7XG4gIG1heFJlY29yZHM/OiBudW1iZXI7XG4gIG1heEJ5dGVzPzogbnVtYmVyO1xufTtcblxuY29uc3QgREVGQVVMVF9NQVhfUkVDT1JEUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNDsgLy8gMTAgTWlCXG5cbnR5cGUgRXN0aW1hdGVCeXRlczxUUmVjb3JkPiA9IChyZWNvcmQ6IFRSZWNvcmQpID0+IG51bWJlcjtcblxuLy8g64uo7J28IEZJRk8gcmluZyBidWZmZXIuIGNyaXRpY2FsL25vbi1jcml0aWNhbCDsmrDshKDsiJzsnITripQg65GQ7KeAIOyViuuKlOuLpCDigJRcbi8vIOyduOuplOuqqOumrCBzdG9yZeuKlCDtnJjrsJzshLEg65SU67KE6rmFIOyaqeuPhOydtOuvgOuhnCBjcml0aWNhbCDrs7TsobTsnbQg7ZWE7JqU7ZWY66m0XG4vLyDrs4Trj4TsnZgg7JiB7IaNIHNpbmvrpbwg65Ox66Gd7ZW07IScIOyymOumrO2VnOuLpC5cbmNsYXNzIEluTWVtb3J5UmluZ0J1ZmZlcjxUUmVjb3JkIGV4dGVuZHMgeyB0aW1lc3RhbXA6IG51bWJlciB9PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2xvdHM6IEFycmF5PFRSZWNvcmQgfCB1bmRlZmluZWQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IHNsb3RCeXRlczogbnVtYmVyW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FwYWNpdHk6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVzdGltYXRlQnl0ZXM6IEVzdGltYXRlQnl0ZXM8VFJlY29yZD47XG4gIHByaXZhdGUgaGVhZCA9IDA7XG4gIHByaXZhdGUgY291bnQgPSAwO1xuICBwcml2YXRlIGN1cnJlbnRCeXRlcyA9IDA7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5NZW1vcnlTdG9yZU9wdGlvbnMsIGVzdGltYXRlQnl0ZXM6IEVzdGltYXRlQnl0ZXM8VFJlY29yZD4pIHtcbiAgICB0aGlzLmNhcGFjaXR5ID0gb3B0aW9ucy5tYXhSZWNvcmRzID8/IERFRkFVTFRfTUFYX1JFQ09SRFM7XG4gICAgdGhpcy5tYXhCeXRlcyA9IG9wdGlvbnMubWF4Qnl0ZXMgPz8gREVGQVVMVF9NQVhfQllURVM7XG4gICAgdGhpcy5lc3RpbWF0ZUJ5dGVzID0gZXN0aW1hdGVCeXRlcztcbiAgICB0aGlzLnNsb3RzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5jYXBhY2l0eSB9KTtcbiAgICB0aGlzLnNsb3RCeXRlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuY2FwYWNpdHkgfSwgKCkgPT4gMCk7XG4gIH1cblxuICBwdXNoKHJlY29yZDogVFJlY29yZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhcGFjaXR5IDw9IDApIHJldHVybjtcblxuICAgIGNvbnN0IHJlY29yZFNpemUgPSB0aGlzLmVzdGltYXRlQnl0ZXMocmVjb3JkKTtcbiAgICAvLyDri6jsnbwgcmVjb3Jk6rCAIG1heEJ5dGVz66W8IOuEmOycvOuptCDrsJvslYTrk6TsnbTsp4Ag7JWK64qU64ukLlxuICAgIGlmIChyZWNvcmRTaXplID4gdGhpcy5tYXhCeXRlcykgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuY291bnQgPT09IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgIC8vIOqwgOyepSDsmKTrnpjrkJwg7Iqs66Gv7J2EIOuNruyWtOyTtOuLpC5cbiAgICAgIHRoaXMuY3VycmVudEJ5dGVzIC09IHRoaXMuc2xvdEJ5dGVzW3RoaXMuaGVhZF07XG4gICAgICB0aGlzLnNsb3RzW3RoaXMuaGVhZF0gPSByZWNvcmQ7XG4gICAgICB0aGlzLnNsb3RCeXRlc1t0aGlzLmhlYWRdID0gcmVjb3JkU2l6ZTtcbiAgICAgIHRoaXMuY3VycmVudEJ5dGVzICs9IHJlY29yZFNpemU7XG4gICAgICB0aGlzLmhlYWQgPSAodGhpcy5oZWFkICsgMSkgJSB0aGlzLmNhcGFjaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YWlsID0gKHRoaXMuaGVhZCArIHRoaXMuY291bnQpICUgdGhpcy5jYXBhY2l0eTtcbiAgICAgIHRoaXMuc2xvdHNbdGFpbF0gPSByZWNvcmQ7XG4gICAgICB0aGlzLnNsb3RCeXRlc1t0YWlsXSA9IHJlY29yZFNpemU7XG4gICAgICB0aGlzLmN1cnJlbnRCeXRlcyArPSByZWNvcmRTaXplO1xuICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLmN1cnJlbnRCeXRlcyA+IHRoaXMubWF4Qnl0ZXMgJiYgdGhpcy5jb3VudCA+IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudEJ5dGVzIC09IHRoaXMuc2xvdEJ5dGVzW3RoaXMuaGVhZF07XG4gICAgICB0aGlzLnNsb3RzW3RoaXMuaGVhZF0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnNsb3RCeXRlc1t0aGlzLmhlYWRdID0gMDtcbiAgICAgIHRoaXMuaGVhZCA9ICh0aGlzLmhlYWQgKyAxKSAlIHRoaXMuY2FwYWNpdHk7XG4gICAgICB0aGlzLmNvdW50IC09IDE7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyKHByZWRpY2F0ZTogKHJlY29yZDogVFJlY29yZCkgPT4gYm9vbGVhbiwgbGltaXQ/OiBudW1iZXIpOiBUUmVjb3JkW10ge1xuICAgIGNvbnN0IG1hdGNoZWQ6IFRSZWNvcmRbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnNsb3RzWyh0aGlzLmhlYWQgKyBpKSAlIHRoaXMuY2FwYWNpdHldO1xuICAgICAgaWYgKHJlY29yZCAhPT0gdW5kZWZpbmVkICYmIHByZWRpY2F0ZShyZWNvcmQpKSBtYXRjaGVkLnB1c2gocmVjb3JkKTtcbiAgICB9XG4gICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgPiAwICYmIG1hdGNoZWQubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIHJldHVybiBtYXRjaGVkLnNsaWNlKC1saW1pdCk7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNhcGFjaXR5OyBpKyspIHtcbiAgICAgIHRoaXMuc2xvdHNbaV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnNsb3RCeXRlc1tpXSA9IDA7XG4gICAgfVxuICAgIHRoaXMuaGVhZCA9IDA7XG4gICAgdGhpcy5jb3VudCA9IDA7XG4gICAgdGhpcy5jdXJyZW50Qnl0ZXMgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VGltZVdpbmRvdzxUUmVjb3JkIGV4dGVuZHMgeyB0aW1lc3RhbXA6IG51bWJlciB9PihcbiAgcmVjb3JkOiBUUmVjb3JkLFxuICBzaW5jZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICB1bnRpbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIGlmIChzaW5jZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC50aW1lc3RhbXAgPCBzaW5jZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodW50aWwgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudGltZXN0YW1wID4gdW50aWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGVzdGltYXRlRXZlbnRCeXRlcyhyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogbnVtYmVyIHtcbiAgbGV0IHNpemUgPSAyMDA7XG4gIGlmIChyZWNvcmQucGF5bG9hZFByZXZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBzaXplICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KHJlY29yZC5wYXlsb2FkUHJldmlldyksIFwidXRmLThcIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzaXplICs9IDEwMDtcbiAgICB9XG4gIH1cbiAgaWYgKHJlY29yZC5kZXRhaWwpIHtcbiAgICB0cnkge1xuICAgICAgc2l6ZSArPSBCdWZmZXIuYnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShyZWNvcmQuZGV0YWlsKSwgXCJ1dGYtOFwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHNpemUgKz0gMTAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuZnVuY3Rpb24gZXN0aW1hdGVNZXRyaWNCeXRlcyhfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBudW1iZXIge1xuICByZXR1cm4gMjAwO1xufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZVNwYW5CeXRlcyhfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKTogbnVtYmVyIHtcbiAgcmV0dXJuIDIwMDtcbn1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5RXZlbnRTdG9yZSBpbXBsZW1lbnRzIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUge1xuICByZWFkb25seSBzaW5rOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbms7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5NZW1vcnlTdG9yZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYnVmZmVyID0gbmV3IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZD4oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXN0aW1hdGVFdmVudEJ5dGVzLFxuICAgICk7XG5cbiAgICB0aGlzLnNpbmsgPSB7XG4gICAgICBlbWl0OiAocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHJlY29yZCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtdIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuZmlsdGVyKChyZWNvcmQpID0+IHtcbiAgICAgIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5uYW1lICE9PSBmaWx0ZXIubmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci5sZXZlbCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5sZXZlbCAhPT0gZmlsdGVyLmxldmVsKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLmNvbm5lY3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5jb25uZWN0aW9uSWQgIT09IGZpbHRlci5jb25uZWN0aW9uSWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIudXNlcklkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLnVzZXJJZCAhPT0gZmlsdGVyLnVzZXJJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQubmFtZXNwYWNlICE9PSBmaWx0ZXIubmFtZXNwYWNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLnRyYWNlSWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudHJhY2VJZCAhPT0gZmlsdGVyLnRyYWNlSWQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghYXBwbHlUaW1lV2luZG93KHJlY29yZCwgZmlsdGVyLnNpbmNlLCBmaWx0ZXIudW50aWwpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LCBmaWx0ZXIubGltaXQpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXIuY2xlYXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlNZXRyaWNTdG9yZSBpbXBsZW1lbnRzIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luaztcblxuICBwcml2YXRlIHJlYWRvbmx5IGJ1ZmZlcjogSW5NZW1vcnlSaW5nQnVmZmVyPFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5NZW1vcnlTdG9yZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYnVmZmVyID0gbmV3IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQ+KFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGVzdGltYXRlTWV0cmljQnl0ZXMsXG4gICAgKTtcblxuICAgIHRoaXMuc2luayA9IHtcbiAgICAgIGVtaXQ6IChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHJlY29yZCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkW10ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5maWx0ZXIoKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLm5hbWUgIT09IGZpbHRlci5uYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLmtpbmQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQua2luZCAhPT0gZmlsdGVyLmtpbmQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIuY29ubmVjdGlvbklkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLmNvbm5lY3Rpb25JZCAhPT0gZmlsdGVyLmNvbm5lY3Rpb25JZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci51c2VySWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudXNlcklkICE9PSBmaWx0ZXIudXNlcklkKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5uYW1lc3BhY2UgIT09IGZpbHRlci5uYW1lc3BhY2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIudHJhY2VJZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC50cmFjZUlkICE9PSBmaWx0ZXIudHJhY2VJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFhcHBseVRpbWVXaW5kb3cocmVjb3JkLCBmaWx0ZXIuc2luY2UsIGZpbHRlci51bnRpbCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIGZpbHRlci5saW1pdCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlci5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVNwYW5TdG9yZSBpbXBsZW1lbnRzIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB7XG4gIHJlYWRvbmx5IHNpbms6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBJbk1lbW9yeVJpbmdCdWZmZXI8V2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5NZW1vcnlTdG9yZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYnVmZmVyID0gbmV3IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkPihvcHRpb25zLCBlc3RpbWF0ZVNwYW5CeXRlcyk7XG5cbiAgICB0aGlzLnNpbmsgPSB7XG4gICAgICBlbWl0OiAocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2gocmVjb3JkKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHF1ZXJ5KGZpbHRlcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZFtdIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuZmlsdGVyKChyZWNvcmQpID0+IHtcbiAgICAgIGlmIChmaWx0ZXIub3BlcmF0aW9uTmFtZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5vcGVyYXRpb25OYW1lICE9PSBmaWx0ZXIub3BlcmF0aW9uTmFtZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci5raW5kICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLmtpbmQgIT09IGZpbHRlci5raW5kKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5zdGF0dXMgIT09IGZpbHRlci5zdGF0dXMpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIuY29ubmVjdGlvbklkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLmNvbm5lY3Rpb25JZCAhPT0gZmlsdGVyLmNvbm5lY3Rpb25JZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci51c2VySWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudXNlcklkICE9PSBmaWx0ZXIudXNlcklkKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5uYW1lc3BhY2UgIT09IGZpbHRlci5uYW1lc3BhY2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIudHJhY2VJZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC50cmFjZUlkICE9PSBmaWx0ZXIudHJhY2VJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFhcHBseVRpbWVXaW5kb3cocmVjb3JkLCBmaWx0ZXIuc2luY2UsIGZpbHRlci51bnRpbCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIGZpbHRlci5saW1pdCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlci5jbGVhcigpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBb0dBLFNBQVMsZ0JBQ1AsUUFDQSxPQUNBLE9BQ1M7Q0FDVCxJQUFJLFVB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
172
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LW1lbW9yeS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLXRlbGVtZXRyeS1tZW1vcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFF1ZXJ5RmlsdGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2luayxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTaW5rLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5RdWVyeUZpbHRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSxcbn0gZnJvbSBcIi4vd3MtdGVsZW1ldHJ5XCI7XG5cbnR5cGUgSW5NZW1vcnlTdG9yZU9wdGlvbnMgPSB7XG4gIG1heFJlY29yZHM/OiBudW1iZXI7XG4gIG1heEJ5dGVzPzogbnVtYmVyO1xufTtcblxuY29uc3QgREVGQVVMVF9NQVhfUkVDT1JEUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfTUFYX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNDsgLy8gMTAgTWlCXG5cbnR5cGUgRXN0aW1hdGVCeXRlczxUUmVjb3JkPiA9IChyZWNvcmQ6IFRSZWNvcmQpID0+IG51bWJlcjtcblxuLy8g64uo7J28IEZJRk8gcmluZyBidWZmZXIuIGNyaXRpY2FsL25vbi1jcml0aWNhbCDsmrDshKDsiJzsnITripQg65GQ7KeAIOyViuuKlOuLpCDigJRcbi8vIOyduOuplOuqqOumrCBzdG9yZeuKlCDtnJjrsJzshLEg65SU67KE6rmFIOyaqeuPhOydtOuvgOuhnCBjcml0aWNhbCDrs7TsobTsnbQg7ZWE7JqU7ZWY66m0XG4vLyDrs4Trj4TsnZgg7JiB7IaNIHNpbmvrpbwg65Ox66Gd7ZW07IScIOyymOumrO2VnOuLpC5cbmNsYXNzIEluTWVtb3J5UmluZ0J1ZmZlcjxUUmVjb3JkIGV4dGVuZHMgeyB0aW1lc3RhbXA6IG51bWJlciB9PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2xvdHM6IEFycmF5PFRSZWNvcmQgfCB1bmRlZmluZWQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IHNsb3RCeXRlczogbnVtYmVyW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FwYWNpdHk6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhCeXRlczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVzdGltYXRlQnl0ZXM6IEVzdGltYXRlQnl0ZXM8VFJlY29yZD47XG4gIHByaXZhdGUgaGVhZCA9IDA7XG4gIHByaXZhdGUgY291bnQgPSAwO1xuICBwcml2YXRlIGN1cnJlbnRCeXRlcyA9IDA7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5NZW1vcnlTdG9yZU9wdGlvbnMsIGVzdGltYXRlQnl0ZXM6IEVzdGltYXRlQnl0ZXM8VFJlY29yZD4pIHtcbiAgICB0aGlzLmNhcGFjaXR5ID0gb3B0aW9ucy5tYXhSZWNvcmRzID8/IERFRkFVTFRfTUFYX1JFQ09SRFM7XG4gICAgdGhpcy5tYXhCeXRlcyA9IG9wdGlvbnMubWF4Qnl0ZXMgPz8gREVGQVVMVF9NQVhfQllURVM7XG4gICAgdGhpcy5lc3RpbWF0ZUJ5dGVzID0gZXN0aW1hdGVCeXRlcztcbiAgICB0aGlzLnNsb3RzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5jYXBhY2l0eSB9KTtcbiAgICB0aGlzLnNsb3RCeXRlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuY2FwYWNpdHkgfSwgKCkgPT4gMCk7XG4gIH1cblxuICBwdXNoKHJlY29yZDogVFJlY29yZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhcGFjaXR5IDw9IDApIHJldHVybjtcblxuICAgIGNvbnN0IHJlY29yZFNpemUgPSB0aGlzLmVzdGltYXRlQnl0ZXMocmVjb3JkKTtcbiAgICAvLyDri6jsnbwgcmVjb3Jk6rCAIG1heEJ5dGVz66W8IOuEmOycvOuptCDrsJvslYTrk6TsnbTsp4Ag7JWK64qU64ukLlxuICAgIGlmIChyZWNvcmRTaXplID4gdGhpcy5tYXhCeXRlcykgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuY291bnQgPT09IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgIC8vIOqwgOyepSDsmKTrnpjrkJwg7Iqs66Gv7J2EIOuNruyWtOyTtOuLpC5cbiAgICAgIHRoaXMuY3VycmVudEJ5dGVzIC09IHRoaXMuc2xvdEJ5dGVzW3RoaXMuaGVhZF07XG4gICAgICB0aGlzLnNsb3RzW3RoaXMuaGVhZF0gPSByZWNvcmQ7XG4gICAgICB0aGlzLnNsb3RCeXRlc1t0aGlzLmhlYWRdID0gcmVjb3JkU2l6ZTtcbiAgICAgIHRoaXMuY3VycmVudEJ5dGVzICs9IHJlY29yZFNpemU7XG4gICAgICB0aGlzLmhlYWQgPSAodGhpcy5oZWFkICsgMSkgJSB0aGlzLmNhcGFjaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0YWlsID0gKHRoaXMuaGVhZCArIHRoaXMuY291bnQpICUgdGhpcy5jYXBhY2l0eTtcbiAgICAgIHRoaXMuc2xvdHNbdGFpbF0gPSByZWNvcmQ7XG4gICAgICB0aGlzLnNsb3RCeXRlc1t0YWlsXSA9IHJlY29yZFNpemU7XG4gICAgICB0aGlzLmN1cnJlbnRCeXRlcyArPSByZWNvcmRTaXplO1xuICAgICAgdGhpcy5jb3VudCArPSAxO1xuICAgIH1cblxuICAgIHdoaWxlICh0aGlzLmN1cnJlbnRCeXRlcyA+IHRoaXMubWF4Qnl0ZXMgJiYgdGhpcy5jb3VudCA+IDEpIHtcbiAgICAgIHRoaXMuY3VycmVudEJ5dGVzIC09IHRoaXMuc2xvdEJ5dGVzW3RoaXMuaGVhZF07XG4gICAgICB0aGlzLnNsb3RzW3RoaXMuaGVhZF0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnNsb3RCeXRlc1t0aGlzLmhlYWRdID0gMDtcbiAgICAgIHRoaXMuaGVhZCA9ICh0aGlzLmhlYWQgKyAxKSAlIHRoaXMuY2FwYWNpdHk7XG4gICAgICB0aGlzLmNvdW50IC09IDE7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyKHByZWRpY2F0ZTogKHJlY29yZDogVFJlY29yZCkgPT4gYm9vbGVhbiwgbGltaXQ/OiBudW1iZXIpOiBUUmVjb3JkW10ge1xuICAgIGNvbnN0IG1hdGNoZWQ6IFRSZWNvcmRbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnNsb3RzWyh0aGlzLmhlYWQgKyBpKSAlIHRoaXMuY2FwYWNpdHldO1xuICAgICAgaWYgKHJlY29yZCAhPT0gdW5kZWZpbmVkICYmIHByZWRpY2F0ZShyZWNvcmQpKSBtYXRjaGVkLnB1c2gocmVjb3JkKTtcbiAgICB9XG4gICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgPiAwICYmIG1hdGNoZWQubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgIHJldHVybiBtYXRjaGVkLnNsaWNlKC1saW1pdCk7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNhcGFjaXR5OyBpKyspIHtcbiAgICAgIHRoaXMuc2xvdHNbaV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnNsb3RCeXRlc1tpXSA9IDA7XG4gICAgfVxuICAgIHRoaXMuaGVhZCA9IDA7XG4gICAgdGhpcy5jb3VudCA9IDA7XG4gICAgdGhpcy5jdXJyZW50Qnl0ZXMgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VGltZVdpbmRvdzxUUmVjb3JkIGV4dGVuZHMgeyB0aW1lc3RhbXA6IG51bWJlciB9PihcbiAgcmVjb3JkOiBUUmVjb3JkLFxuICBzaW5jZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICB1bnRpbDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuKTogYm9vbGVhbiB7XG4gIGlmIChzaW5jZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC50aW1lc3RhbXAgPCBzaW5jZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodW50aWwgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudGltZXN0YW1wID4gdW50aWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGVzdGltYXRlRXZlbnRCeXRlcyhyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogbnVtYmVyIHtcbiAgbGV0IHNpemUgPSAyMDA7XG4gIGlmIChyZWNvcmQucGF5bG9hZFByZXZpZXcgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICBzaXplICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KHJlY29yZC5wYXlsb2FkUHJldmlldyksIFwidXRmLThcIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzaXplICs9IDEwMDtcbiAgICB9XG4gIH1cbiAgaWYgKHJlY29yZC5kZXRhaWwpIHtcbiAgICB0cnkge1xuICAgICAgc2l6ZSArPSBCdWZmZXIuYnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShyZWNvcmQuZGV0YWlsKSwgXCJ1dGYtOFwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHNpemUgKz0gMTAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuZnVuY3Rpb24gZXN0aW1hdGVNZXRyaWNCeXRlcyhfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBudW1iZXIge1xuICByZXR1cm4gMjAwO1xufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZVNwYW5CeXRlcyhfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKTogbnVtYmVyIHtcbiAgcmV0dXJuIDIwMDtcbn1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5RXZlbnRTdG9yZSBpbXBsZW1lbnRzIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUge1xuICByZWFkb25seSBzaW5rOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbms7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5NZW1vcnlTdG9yZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYnVmZmVyID0gbmV3IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZD4oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXN0aW1hdGVFdmVudEJ5dGVzLFxuICAgICk7XG5cbiAgICB0aGlzLnNpbmsgPSB7XG4gICAgICBlbWl0OiAocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHJlY29yZCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtdIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuZmlsdGVyKChyZWNvcmQpID0+IHtcbiAgICAgIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5uYW1lICE9PSBmaWx0ZXIubmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci5sZXZlbCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5sZXZlbCAhPT0gZmlsdGVyLmxldmVsKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLmNvbm5lY3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5jb25uZWN0aW9uSWQgIT09IGZpbHRlci5jb25uZWN0aW9uSWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIudXNlcklkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLnVzZXJJZCAhPT0gZmlsdGVyLnVzZXJJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQubmFtZXNwYWNlICE9PSBmaWx0ZXIubmFtZXNwYWNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLnRyYWNlSWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudHJhY2VJZCAhPT0gZmlsdGVyLnRyYWNlSWQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghYXBwbHlUaW1lV2luZG93KHJlY29yZCwgZmlsdGVyLnNpbmNlLCBmaWx0ZXIudW50aWwpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LCBmaWx0ZXIubGltaXQpO1xuICB9XG5cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXIuY2xlYXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlNZXRyaWNTdG9yZSBpbXBsZW1lbnRzIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luaztcblxuICBwcml2YXRlIHJlYWRvbmx5IGJ1ZmZlcjogSW5NZW1vcnlSaW5nQnVmZmVyPFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5NZW1vcnlTdG9yZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYnVmZmVyID0gbmV3IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQ+KFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGVzdGltYXRlTWV0cmljQnl0ZXMsXG4gICAgKTtcblxuICAgIHRoaXMuc2luayA9IHtcbiAgICAgIGVtaXQ6IChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHJlY29yZCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkW10ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5maWx0ZXIoKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLm5hbWUgIT09IGZpbHRlci5uYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLmtpbmQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQua2luZCAhPT0gZmlsdGVyLmtpbmQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIuY29ubmVjdGlvbklkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLmNvbm5lY3Rpb25JZCAhPT0gZmlsdGVyLmNvbm5lY3Rpb25JZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci51c2VySWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudXNlcklkICE9PSBmaWx0ZXIudXNlcklkKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5uYW1lc3BhY2UgIT09IGZpbHRlci5uYW1lc3BhY2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIudHJhY2VJZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC50cmFjZUlkICE9PSBmaWx0ZXIudHJhY2VJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFhcHBseVRpbWVXaW5kb3cocmVjb3JkLCBmaWx0ZXIuc2luY2UsIGZpbHRlci51bnRpbCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIGZpbHRlci5saW1pdCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlci5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVNwYW5TdG9yZSBpbXBsZW1lbnRzIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB7XG4gIHJlYWRvbmx5IHNpbms6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBJbk1lbW9yeVJpbmdCdWZmZXI8V2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZD47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5NZW1vcnlTdG9yZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYnVmZmVyID0gbmV3IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkPihvcHRpb25zLCBlc3RpbWF0ZVNwYW5CeXRlcyk7XG5cbiAgICB0aGlzLnNpbmsgPSB7XG4gICAgICBlbWl0OiAocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2gocmVjb3JkKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHF1ZXJ5KGZpbHRlcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZFtdIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIuZmlsdGVyKChyZWNvcmQpID0+IHtcbiAgICAgIGlmIChmaWx0ZXIub3BlcmF0aW9uTmFtZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5vcGVyYXRpb25OYW1lICE9PSBmaWx0ZXIub3BlcmF0aW9uTmFtZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci5raW5kICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLmtpbmQgIT09IGZpbHRlci5raW5kKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5zdGF0dXMgIT09IGZpbHRlci5zdGF0dXMpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIuY29ubmVjdGlvbklkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLmNvbm5lY3Rpb25JZCAhPT0gZmlsdGVyLmNvbm5lY3Rpb25JZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci51c2VySWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudXNlcklkICE9PSBmaWx0ZXIudXNlcklkKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5uYW1lc3BhY2UgIT09IGZpbHRlci5uYW1lc3BhY2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIudHJhY2VJZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC50cmFjZUlkICE9PSBmaWx0ZXIudHJhY2VJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFhcHBseVRpbWVXaW5kb3cocmVjb3JkLCBmaWx0ZXIuc2luY2UsIGZpbHRlci51bnRpbCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIGZpbHRlci5saW1pdCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlci5jbGVhcigpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBb0dBLFNBQVMsZ0JBQ1AsUUFDQSxPQUNBLE9BQ1M7Q0FDVCxJQUFJLFVB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
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { randomBytes } from "node:crypto";
3
- //#region src/stream/ws-telemetry-trace.ts
3
+ // src/stream/ws-telemetry-trace.ts
4
4
  function parseTraceParent(header) {
5
5
  const trimmed = header.trim().toLowerCase();
6
6
  const match = TRACEPARENT_REGEX.exec(trimmed);
@@ -32,7 +32,6 @@ var init_ws_telemetry_trace = __esmMin((() => {
32
32
  ALL_ZERO_TRACE_ID = "00000000000000000000000000000000";
33
33
  ALL_ZERO_SPAN_ID = "0000000000000000";
34
34
  }));
35
- //#endregion
36
35
  init_ws_telemetry_trace();
37
36
  export { formatTraceParent, generateSpanId, generateTraceId, init_ws_telemetry_trace, parseTraceParent };
38
37