sonamu 0.12.0 → 0.13.0

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 +63 -63
  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
@@ -16,7 +16,7 @@ import { readFile, writeFile } from "node:fs/promises";
16
16
  import assert from "node:assert";
17
17
  import { spawn } from "node:child_process";
18
18
  import { inspect } from "node:util";
19
- //#region src/testing/fixture-manager.ts
19
+ // src/testing/fixture-manager.ts
20
20
  function waitForFixtureCommand(child, executable) {
21
21
  return new Promise((resolve, reject) => {
22
22
  child.once("error", reject);
@@ -264,9 +264,10 @@ var init_fixture_manager = __esmMin((() => {
264
264
  id: relationId
265
265
  };
266
266
  }).filter((arg) => arg.id !== null);
267
- return [...unique((await Promise.all(args.map(async (relationArgs) => {
267
+ const relQueries = await Promise.all(args.map(async (relationArgs) => {
268
268
  return this.getImportQueries(relationArgs.entityId, relationArgs.field, relationArgs.id);
269
- }))).toReversed().flat()), selfQuery];
269
+ }));
270
+ return [...unique(relQueries.toReversed().flat()), selfQuery];
270
271
  }
271
272
  async destroy() {
272
273
  if (this.testingDb) {
@@ -405,7 +406,7 @@ var init_fixture_manager = __esmMin((() => {
405
406
  this.builder = new UpsertBuilder();
406
407
  this.fixtureRefMap = /* @__PURE__ */ new Map();
407
408
  this.skippedFixtures = /* @__PURE__ */ new Map();
408
- const db = createKnexInstance(process.env.SONAMU_WORKER_DB === "true" && process.env.VITEST_POOL_ID ? (() => {
409
+ const dbConfig = process.env.SONAMU_WORKER_DB === "true" && process.env.VITEST_POOL_ID ? (() => {
409
410
  const workerId = parseInt(process.env.VITEST_POOL_ID ?? "1", 10);
410
411
  const baseConfig = Sonamu.dbConfig[dbName];
411
412
  const connection = databaseConnectionSchema.parse(baseConfig.connection);
@@ -420,7 +421,8 @@ var init_fixture_manager = __esmMin((() => {
420
421
  max: 1
421
422
  }
422
423
  };
423
- })() : Sonamu.dbConfig[dbName]);
424
+ })() : Sonamu.dbConfig[dbName];
425
+ const db = createKnexInstance(dbConfig);
424
426
  const results = [];
425
427
  try {
426
428
  this.relationGraph.buildGraph(fixtures);
@@ -711,14 +713,15 @@ var init_fixture_manager = __esmMin((() => {
711
713
  const content = await readFile(path, "utf8");
712
714
  const fixtureLoaderStart = content.indexOf("const fixtureLoader = {");
713
715
  const fixtureLoaderEnd = content.indexOf("};", fixtureLoaderStart);
714
- if (fixtureLoaderStart !== -1 && fixtureLoaderEnd !== -1) await writeFile(path, `${content.slice(0, fixtureLoaderEnd)} ${code}\n${content.slice(fixtureLoaderEnd)}`);
715
- else throw new Error("Failed to find fixtureLoader in fixture.ts");
716
+ if (fixtureLoaderStart !== -1 && fixtureLoaderEnd !== -1) {
717
+ const newContent = `${content.slice(0, fixtureLoaderEnd)} ${code}\n${content.slice(fixtureLoaderEnd)}`;
718
+ await writeFile(path, newContent);
719
+ } else throw new Error("Failed to find fixtureLoader in fixture.ts");
716
720
  }
717
721
  };
718
722
  FixtureManager = new FixtureManagerClass();
719
723
  }));
720
- //#endregion
721
724
  init_fixture_manager();
722
725
  export { FixtureManager, FixtureManagerClass, init_fixture_manager };
723
726
 
724
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYW5hZ2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuaW1wb3J0IHsgc3Bhd24sIHR5cGUgQ2hpbGRQcm9jZXNzLCB0eXBlIFNwYXduT3B0aW9ucyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJub2RlOnV0aWxcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHsgdHlwZSBVQlJlZiB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbFByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIHR5cGUgT25lVG9PbmVSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uR3JhcGggfSBmcm9tIFwiLi9fcmVsYXRpb24tZ3JhcGhcIjtcbmltcG9ydCB7IGRhdGFFeHBsb3JlclJlY29yZFNjaGVtYSB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRGF0YUV4cGxvcmVyUmVjb3JkLCB0eXBlIERhdGFFeHBsb3JlclZhbHVlIH0gZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuXG5jb25zdCBwZ0Nvbm5lY3Rpb25TY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgdXNlcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpO1xuY29uc3QgZGF0YWJhc2VDb25uZWN0aW9uU2NoZW1hID0gei5vYmplY3QoeyBkYXRhYmFzZTogei5zdHJpbmcoKSB9KS5wYXNzdGhyb3VnaCgpO1xuY29uc3QgZml4dHVyZVJlY29yZElkc1NjaGVtYSA9IHouYXJyYXkoei51bmlvbihbei5udW1iZXIoKSwgei5zdHJpbmcoKV0pKTtcbmNvbnN0IHJlbGF0aW9uSWRTY2hlbWEgPSB6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpLCB6Lm51bGwoKV0pO1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlU291cmNlUmVjb3JkID0gRGF0YUV4cGxvcmVyUmVjb3JkICYge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nO1xufTtcblxudHlwZSBVcHNlcnRSb3dWYWx1ZSA9IERhdGFFeHBsb3JlclZhbHVlIHwgVUJSZWY7XG50eXBlIFVwc2VydFJvdyA9IHtcbiAgW2NvbHVtbk5hbWU6IHN0cmluZ106IFVwc2VydFJvd1ZhbHVlO1xufTtcblxuZnVuY3Rpb24gd2FpdEZvckZpeHR1cmVDb21tYW5kKGNoaWxkOiBDaGlsZFByb2Nlc3MsIGV4ZWN1dGFibGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIGNoaWxkLm9uY2UoXCJleGl0XCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSByZXNvbHZlKCk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoYCR7ZXhlY3V0YWJsZX0g66qF66C57J20ICR7Y29kZSA/PyBzaWduYWwgPz8gXCJ1bmtub3duXCJ9IOyDge2DnOuhnCDsi6TtjKjtlojsirXri4jri6QuYCksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gIGV4ZWN1dGFibGU6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IFBpY2s8U3Bhd25PcHRpb25zLCBcImVudlwiIHwgXCJzdGRpb1wiPixcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gd2FpdEZvckZpeHR1cmVDb21tYW5kKHNwYXduKGV4ZWN1dGFibGUsIGFyZ3MsIG9wdGlvbnMpLCBleGVjdXRhYmxlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGlwZUZpeHR1cmVDb21tYW5kcyhcbiAgc291cmNlOiB7IGV4ZWN1dGFibGU6IHN0cmluZzsgYXJnczogc3RyaW5nW107IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgZGVzdGluYXRpb246IHsgZXhlY3V0YWJsZTogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZVByb2Nlc3MgPSBzcGF3bihzb3VyY2UuZXhlY3V0YWJsZSwgc291cmNlLmFyZ3MsIHtcbiAgICBlbnY6IHNvdXJjZS5lbnYsXG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpbmhlcml0XCJdLFxuICB9KTtcbiAgY29uc3QgZGVzdGluYXRpb25Qcm9jZXNzID0gc3Bhd24oZGVzdGluYXRpb24uZXhlY3V0YWJsZSwgZGVzdGluYXRpb24uYXJncywge1xuICAgIGVudjogZGVzdGluYXRpb24uZW52LFxuICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gIH0pO1xuICBhc3NlcnQoc291cmNlUHJvY2Vzcy5zdGRvdXQpO1xuICBhc3NlcnQoZGVzdGluYXRpb25Qcm9jZXNzLnN0ZGluKTtcbiAgc291cmNlUHJvY2Vzcy5zdGRvdXQucGlwZShkZXN0aW5hdGlvblByb2Nlc3Muc3RkaW4pO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgd2FpdEZvckZpeHR1cmVDb21tYW5kKHNvdXJjZVByb2Nlc3MsIHNvdXJjZS5leGVjdXRhYmxlKSxcbiAgICAgIHdhaXRGb3JGaXh0dXJlQ29tbWFuZChkZXN0aW5hdGlvblByb2Nlc3MsIGRlc3RpbmF0aW9uLmV4ZWN1dGFibGUpLFxuICAgIF0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNvdXJjZVByb2Nlc3Mua2lsbCgpO1xuICAgIGRlc3RpbmF0aW9uUHJvY2Vzcy5raWxsKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZSBkYXRhYmFzZSBzeW5jaHJvbml6YXRpb24gY29tbWFuZCBmYWlsZWRcIiwgeyBjYXVzZTogZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqIOyCrOyaqeyekCDsp4DsoJUg7KSR67O1IO2ZleyduCDsu6zrn7wgKGVudGl0eUlk67OE66GcIOyngOyglSkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlQ2hlY2tPcHRpb25zIHtcbiAgY29sdW1ucz86IHtcbiAgICBbZW50aXR5SWQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgbWF4RGVwdGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBGaXh0dXJlTWFuYWdlckNsYXNzIHtcbiAgcHJpdmF0ZSB0ZXN0aW5nRGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLnRlc3RpbmdEYiA9IHRkYjtcbiAgfVxuICBnZXQgdGRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLnRlc3RpbmdEYiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZU1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXN0aW5nRGI7XG4gIH1cblxuICBwcml2YXRlIGZpeHR1cmVEYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgZmRiKGZkYjogS25leCkge1xuICAgIHRoaXMuZml4dHVyZURiID0gZmRiO1xuICB9XG4gIGdldCBmZGIoKTogS25leCB7XG4gICAgaWYgKHRoaXMuZml4dHVyZURiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVEYjtcbiAgfVxuICBjYWNoZWRUYWJsZU5hbWVzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVsYXRpb25HcmFwaCA9IG5ldyBSZWxhdGlvbkdyYXBoKCk7XG5cbiAgLy8gVXBzZXJ0QnVpbGRlciDquLDrsJggaW1wb3J066W8IOychO2VnCDsg4Htg5xcbiAgcHJpdmF0ZSBidWlsZGVyOiBVcHNlcnRCdWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgcHJpdmF0ZSBmaXh0dXJlUmVmTWFwOiBNYXA8c3RyaW5nLCBVQlJlZj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2tpcHBlZEZpeHR1cmVzOiBNYXA8c3RyaW5nLCB7IGVudGl0eUlkOiBzdHJpbmc7IGV4aXN0aW5nSWQ6IG51bWJlciB8IHN0cmluZyB9PiA9XG4gICAgbmV3IE1hcCgpO1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMudGVzdGluZ0RiICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChTb25hbXUuZGJDb25maWcudGVzdCAmJiBTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbikge1xuICAgICAgY29uc3QgdENvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbik7XG4gICAgICBjb25zdCBwQ29ubiA9IHBnQ29ubmVjdGlvblNjaGVtYS5wYXJzZShTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbi5jb25uZWN0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgYCR7dENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3RDb25uLnBvcnQgPz8gNTQzMn0vJHt0Q29ubi5kYXRhYmFzZX1gID09PVxuICAgICAgICBgJHtwQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7cENvbm4ucG9ydCA/PyA1NDMyfS8ke3BDb25uLmRhdGFiYXNlfWBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2FjOyKpO2KuERC7JmAIO2UhOuhnOuNleyFmERC7JeQIOuPmeydvO2VnCDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7IKs7Jqp65CY7JeI7Iq164uI64ukLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGRiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgICB0aGlzLmZkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gIH1cblxuICAvKipcbiAgICDsm5DqsqkgZml4dHVyZSBEQuulvCDroZzsu6wgdGVzdCBEQuuhnCDrs7Xsgqztlanri4jri6QuXG4gICAgcGdfZHVtcOuhnCDsm5DqsqkgRELrpbwg642k7ZSE7ZWY6rOgLCBwZ19yZXN0b3Jl66GcIOuhnOy7rOyXkCDrs7Xsm5Dtlanri4jri6QuXG4gICovXG4gIGFzeW5jIHN5bmMoKSB7XG4gICAgY29uc3QgZml4dHVyZUNvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbik7XG4gICAgY29uc3QgdGVzdENvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbik7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBjb25zdCB0ZXN0UHNxbEFyZ3MgPSBbXG4gICAgICBcIi1oXCIsXG4gICAgICB0ZXN0Q29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICBcIi1wXCIsXG4gICAgICBTdHJpbmcodGVzdENvbm4ucG9ydCA/PyA1NDMyKSxcbiAgICAgIFwiLVVcIixcbiAgICAgIHRlc3RDb25uLnVzZXIgPz8gXCJcIixcbiAgICAgIFwiLWRcIixcbiAgICAgIFwicG9zdGdyZXNcIixcbiAgICAgIFwiLWNcIixcbiAgICBdO1xuICAgIGF3YWl0IGV4ZWN1dGVGaXh0dXJlQ29tbWFuZChcbiAgICAgIFwicHNxbFwiLFxuICAgICAgW1xuICAgICAgICAuLi50ZXN0UHNxbEFyZ3MsXG4gICAgICAgIGBcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBgLFxuICAgICAgXSxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IH0sXG4gICAgKTtcbiAgICBhd2FpdCBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gICAgICBcInBzcWxcIixcbiAgICAgIFsuLi50ZXN0UHNxbEFyZ3MsIGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcIiR7dGVzdENvbm4uZGF0YWJhc2V9XCJgXSxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IH0sXG4gICAgKTtcbiAgICBhd2FpdCBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gICAgICBcInBzcWxcIixcbiAgICAgIFsuLi50ZXN0UHNxbEFyZ3MsIGBDUkVBVEUgREFUQUJBU0UgXCIke3Rlc3RDb25uLmRhdGFiYXNlfVwiYF0sXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSB9LFxuICAgICk7XG5cbiAgICAvLyAyLiDsm5DqsqkgZml4dHVyZSBEQiDihpIg66Gc7LusIHRlc3QgRELroZwg67O17IKsIChwZ19kdW1wIHwgcGdfcmVzdG9yZSlcbiAgICBjb25zdCBmaXh0dXJlUGdFbnYgPSB7IFBHUEFTU1dPUkQ6IGZpeHR1cmVDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBhd2FpdCBwaXBlRml4dHVyZUNvbW1hbmRzKFxuICAgICAge1xuICAgICAgICBleGVjdXRhYmxlOiBcInBnX2R1bXBcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWhcIixcbiAgICAgICAgICBmaXh0dXJlQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICAgICAgXCItcFwiLFxuICAgICAgICAgIFN0cmluZyhmaXh0dXJlQ29ubi5wb3J0ID8/IDU0MzIpLFxuICAgICAgICAgIFwiLVVcIixcbiAgICAgICAgICBmaXh0dXJlQ29ubi51c2VyID8/IFwiXCIsXG4gICAgICAgICAgXCItZFwiLFxuICAgICAgICAgIGZpeHR1cmVDb25uLmRhdGFiYXNlLFxuICAgICAgICAgIFwiLUZjXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBleGVjdXRhYmxlOiBcInBnX3Jlc3RvcmVcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWhcIixcbiAgICAgICAgICB0ZXN0Q29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICAgICAgXCItcFwiLFxuICAgICAgICAgIFN0cmluZyh0ZXN0Q29ubi5wb3J0ID8/IDU0MzIpLFxuICAgICAgICAgIFwiLVVcIixcbiAgICAgICAgICB0ZXN0Q29ubi51c2VyID8/IFwiXCIsXG4gICAgICAgICAgXCItZFwiLFxuICAgICAgICAgIHRlc3RDb25uLmRhdGFiYXNlLFxuICAgICAgICAgIFwiLS1uby1vd25lclwiLFxuICAgICAgICAgIFwiLS1uby1hY2xcIixcbiAgICAgICAgXSxcbiAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyAzLiDsi5ztgIDsiqQg66as7IWLICjrjbDsnbTthLAg67O17IKsIO2bhCDsi5ztgIDsiqTrpbwgTUFYKGlkKeuhnCDsoJXroKwpXG4gICAgYXdhaXQgdGhpcy5yZXNldFNlcXVlbmNlcyhTb25hbXUuZGJDb25maWcudGVzdCk7XG4gIH1cblxuICAvKipcbiAgICog66qo65OgIO2FjOydtOu4lOydmCDsi5ztgIDsiqTrpbwg7ZiE7J6sIE1BWChpZCnroZwg66as7IWL7ZWp64uI64ukLlxuICAgKiBmaXh0dXJlIHN5bmMg7ZuEIOyLnO2AgOyKpOqwgCDsi6TsoJwg642w7J207YSw7JmAIOunnuyngCDslYrripQg66y47KCc66W8IO2VtOqysO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRTZXF1ZW5jZXMoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnW1widGVzdFwiXSkge1xuICAgIGNvbnN0IHRlc3REYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShkYkNvbmZpZyk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZW50aXR5LnRhYmxlIHx8IGVudGl0eS5pZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIGlkIO2VhOuTnOydmCDtg4DsnoXsnYQg7ZmV7J247ZWp64uI64ukXG4gICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGBTa2lwcGluZyBzZXF1ZW5jZSByZXNldCBmb3IgJHt0YWJsZU5hbWV9IChpZCB0eXBlOiAke2lkVHlwZSB8fCBcInVua25vd25cIn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb3N0Z3JlU1FMIOyLnO2AgOyKpOulvCDtmITsnqwg7YWM7J2067iU7J2YIE1BWChpZCnroZwg66as7IWL7ZWp64uI64ukLlxuICAgICAgICAvLyBzdHJpbmcg7YOA7J6F7J2YIOqyveyasCDsiKvsnpAg7LqQ7Iqk7YyF7J20IO2VhOyalO2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgbWF4RXhwciA9IGlkVHlwZSA9PT0gXCJzdHJpbmdcIiA/IFwiTUFYKGlkOjpiaWdpbnQpXCIgOiBcIk1BWChpZClcIjtcbiAgICAgICAgYXdhaXQgdGVzdERiLnJhdyhgXG4gICAgICAgICAgU0VMRUNUIHNldHZhbChcbiAgICAgICAgICAgIHBnX2dldF9zZXJpYWxfc2VxdWVuY2UoJ3B1YmxpYy4ke3RhYmxlTmFtZX0nLCAnaWQnKSxcbiAgICAgICAgICAgIENPQUxFU0NFKChTRUxFQ1QgJHttYXhFeHByfSBGUk9NICR7dGFibGVOYW1lfSksIDEpXG4gICAgICAgICAgKVxuICAgICAgICBgKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGVzdERiLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZpc2l0ZWRSZWNvcmRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGFzeW5jIGltcG9ydEZpeHR1cmUoZW50aXR5SWQ6IHN0cmluZywgaWRzOiBudW1iZXJbXSkge1xuICAgIC8vIOuwqeusuCDquLDroZ0g7LSI6riw7ZmUICjsg4jroZzsmrQgaW1wb3J0IOyekeyXhSDsi5zsnpEpXG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5jbGVhcigpO1xuXG4gICAgY29uc3QgcXVlcmllcyA9IHVuaXF1ZShcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgaWRzLm1hcChhc3luYyAoaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEltcG9ydFF1ZXJpZXMoZW50aXR5SWQsIFwiaWRcIiwgaWQpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICApLmZsYXQoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICBmb3IgKGNvbnN0IHF1ZXJ5IG9mIHF1ZXJpZXMpIHtcbiAgICAgIGF3YWl0IHdkYi5yYXcocXVlcnkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEltcG9ydFF1ZXJpZXMoZW50aXR5SWQ6IHN0cmluZywgZmllbGQ6IHN0cmluZywgaWQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtmaWVsZH0jJHtpZH1gO1xuXG4gICAgLy8g7Iic7ZmYIOywuOyhsCDrsKnsp4A6IOydtOuvuCDrsKnrrLjtlZwg66CI7L2U65Oc64qUIOyKpO2CtVxuICAgIGlmICh0aGlzLnZpc2l0ZWRSZWNvcmRzLmhhcyhyZWNvcmRLZXkpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRoaXMudmlzaXRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcblxuICAgIC8vIOyXrOq4sOyEnCDsi6REQuydmCByb3cg6rCA7KC47Ji0XG4gICAgY29uc3QgW3Jvd10gPSBhd2FpdCB3ZGIoZW50aXR5LnRhYmxlKS53aGVyZShmaWVsZCwgaWQpLmxpbWl0KDEpO1xuICAgIGlmIChyb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfSMke2lkfSByb3frpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7ZS97Iqk7LOQREIsIOyLpERCXG4gICAgY29uc3QgZml4dHVyZURhdGFiYXNlID0gZGF0YWJhc2VDb25uZWN0aW9uU2NoZW1hLnBhcnNlKFxuICAgICAgU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbixcbiAgICApLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IGRhdGFiYXNlQ29ubmVjdGlvblNjaGVtYS5wYXJzZShcbiAgICAgIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uLmNvbm5lY3Rpb24sXG4gICAgKS5kYXRhYmFzZTtcblxuICAgIGNvbnN0IHNlbGZRdWVyeSA9IGBJTlNFUlQgSUdOT1JFIElOVE8gXFxgJHtmaXh0dXJlRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCAoU0VMRUNUICogRlJPTSBcXGAke3JlYWxEYXRhYmFzZX1cXGAuXFxgJHtlbnRpdHkudGFibGV9XFxgIFdIRVJFIFxcYGlkXFxgID0gJHtpZH0pYDtcblxuICAgIGNvbnN0IGFyZ3MgPSBPYmplY3QuZW50cmllcyhlbnRpdHkucmVsYXRpb25zKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFssIHJlbGF0aW9uXSkgPT5cbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSA9PT0gdW5kZWZpbmVkKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKFssIHJlbGF0aW9uXSkgPT4ge1xuICAgICAgICAvKlxuICAgICAgICBCZWxvbmdzVG9PbmXsnbgg6rK97JqwXG4gICAgICAgICAgQ2F0ZWdvcnkgLyAnaWQnIC8gcm93W2NhdGVnb3J5X2lkXSDtmLjstpxcbiAgICAgICAgT25lVG9PbmXsl5Agam9pbkNvbHVtbiA9PT0gdHJ1ZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdpZCcgLyByb3dbcHJvZmlsZV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IGZhbHNlIOyduCDqsr3smrBcbiAgICAgICAgICBQcm9maWxlIC8gJ3Byb2ZpbGVfaWQnIC8gcm93WydpZCddIO2YuOy2nFxuICAgICAgICAqL1xuICAgICAgICBsZXQgcmVsYXRpb25GaWVsZDogc3RyaW5nO1xuICAgICAgICBsZXQgcmVsYXRpb25JZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWxhdGlvbkZpZWxkID0gYCR7cmVsYXRlZElkQ29sdW1uTmFtZX1faWRgO1xuICAgICAgICAgIHJlbGF0aW9uSWQgPSByb3cuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVsYXRpb25GaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICByZWxhdGlvbklkID0gcm93W2Ake3JlbGF0aW9uLm5hbWV9X2lkYF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbnRpdHlJZDogcmVsYXRpb24ud2l0aCxcbiAgICAgICAgICBmaWVsZDogcmVsYXRpb25GaWVsZCxcbiAgICAgICAgICBpZDogcmVsYXRpb25JZCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChhcmcpID0+IGFyZy5pZCAhPT0gbnVsbCk7XG5cbiAgICBjb25zdCByZWxRdWVyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhcmdzLm1hcChhc3luYyAocmVsYXRpb25BcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEltcG9ydFF1ZXJpZXMocmVsYXRpb25BcmdzLmVudGl0eUlkLCByZWxhdGlvbkFyZ3MuZmllbGQsIHJlbGF0aW9uQXJncy5pZCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIFsuLi51bmlxdWUocmVsUXVlcmllcy50b1JldmVyc2VkKCkuZmxhdCgpKSwgc2VsZlF1ZXJ5XTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGVzdGluZ0RiKSB7XG4gICAgICBhd2FpdCB0aGlzLnRlc3RpbmdEYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnRlc3RpbmdEYiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpeHR1cmVEYikge1xuICAgICAgYXdhaXQgdGhpcy5maXh0dXJlRGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5maXh0dXJlRGIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rml4dHVyZXMoXG4gICAgc291cmNlREJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICB0YXJnZXREQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHNlYXJjaE9wdGlvbnM6IEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICAgIGR1cGxpY2F0ZUNoZWNrPzogRHVwbGljYXRlQ2hlY2tPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VEQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbc291cmNlREJOYW1lXSk7XG4gICAgY29uc3QgdGFyZ2V0REIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW3RhcmdldERCTmFtZV0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGZpZWxkLCB2YWx1ZSwgc2VhcmNoVHlwZSB9ID0gc2VhcmNoT3B0aW9ucztcblxuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgZW50aXR5LnByb3BzLmZpbmQoKHByb3ApID0+IHByb3AubmFtZSA9PT0gZmllbGQpPy50eXBlID09PSBcInJlbGF0aW9uXCJcbiAgICAgICAgICA/IGAke2ZpZWxkfV9pZGBcbiAgICAgICAgICA6IGZpZWxkO1xuXG4gICAgICBsZXQgcXVlcnkgPSBzb3VyY2VEQihlbnRpdHkudGFibGUpO1xuICAgICAgaWYgKHNlYXJjaFR5cGUgPT09IFwiZXF1YWxzXCIpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VhcmNoVHlwZSA9PT0gXCJsaWtlXCIpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIFwibGlrZVwiLCBgJSR7dmFsdWV9JWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnk7XG4gICAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjb3JkcyBmb3VuZFwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCBpbml0aWFsUmVjb3Jkc0xlbmd0aCA9IGZpeHR1cmVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV3UmVjb3JkcyA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIHJvdywge1xuICAgICAgICAgIGRiOiBzb3VyY2VEQixcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiBkdXBsaWNhdGVDaGVjaz8uaW5jbHVkZVJlbGF0aW9ucyxcbiAgICAgICAgICBtYXhEZXB0aDogZHVwbGljYXRlQ2hlY2s/Lm1heERlcHRoLFxuICAgICAgICB9KTtcbiAgICAgICAgZml4dHVyZXMucHVzaCguLi5uZXdSZWNvcmRzKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpeHR1cmVSZWNvcmQgPSBmaXh0dXJlcy5maW5kKChyKSA9PiByLmZpeHR1cmVJZCA9PT0gYCR7ZW50aXR5SWR9IyR7cm93LmlkfWApO1xuXG4gICAgICAgIGlmIChjdXJyZW50Rml4dHVyZVJlY29yZCkge1xuICAgICAgICAgIC8vIO2YhOyerCBmaXh0dXJl66Gc67aA7YSwIOyDneyEseuQnCBmZXRjaGVkUmVjb3JkcyDshKTsoJVcbiAgICAgICAgICBjdXJyZW50Rml4dHVyZVJlY29yZC5mZXRjaGVkUmVjb3JkcyA9IGZpeHR1cmVzXG4gICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmZpeHR1cmVJZCAhPT0gY3VycmVudEZpeHR1cmVSZWNvcmQuZml4dHVyZUlkKVxuICAgICAgICAgICAgLnNsaWNlKGluaXRpYWxSZWNvcmRzTGVuZ3RoKVxuICAgICAgICAgICAgLm1hcCgocikgPT4gci5maXh0dXJlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBjb25zdCBmaXh0dXJlRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZml4dHVyZUVudGl0eSxcbiAgICAgICAgICAgIGZpeHR1cmUsXG4gICAgICAgICAgICBjdXN0b21Db2x1bW5zLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGN1c3RvbUR1cGxpY2F0ZVJvdykge1xuICAgICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZml4dHVyZUVudGl0eSwgY3VzdG9tRHVwbGljYXRlUm93LCB7XG4gICAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZGI6IHRhcmdldERCLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaXh0dXJlLnRhcmdldCA9IHJlY29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmlxdWUgaW5kZXgg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIGZpeHR1cmUudW5pcXVlXG4gICAgICAgIGNvbnN0IHVuaXF1ZVJvdyA9IGF3YWl0IHRoaXMuY2hlY2tVbmlxdWVWaW9sYXRpb24odGFyZ2V0REIsIGZpeHR1cmVFbnRpdHksIGZpeHR1cmUpO1xuICAgICAgICBpZiAodW5pcXVlUm93KSB7XG4gICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZml4dHVyZUVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBkYjogdGFyZ2V0REIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZml4dHVyZS51bmlxdWUgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaXF1ZShmaXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFt0YXJnZXREQi5kZXN0cm95KCksIHNvdXJjZURCLmRlc3Ryb3koKV0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgcm9vdEVudGl0eTogRW50aXR5LFxuICAgIHJvb3RSb3c6IEZpeHR1cmVTb3VyY2VSZWNvcmQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBkYj86IEtuZXg7XG4gICAgICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoZW50aXR5OiBFbnRpdHksIHJvdzogRml4dHVyZVNvdXJjZVJlY29yZCwgZGVwdGg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZml4dHVyZUlkID0gYCR7ZW50aXR5LmlkfSMke3Jvdy5pZH1gO1xuICAgICAgaWYgKHZpc2l0ZWRFbnRpdGllcy5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aXNpdGVkRW50aXRpZXMuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IHJlY29yZDogRml4dHVyZVJlY29yZCA9IHtcbiAgICAgICAgZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICBjb2x1bW5zOiB7fSxcbiAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICBiZWxvbmdzUmVjb3JkczogW10sXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTQUZFVFk6IEZpeHR1cmVSZWNvcmTsnZgg66CI6rGw7IucIOqwkiDtg4DsnoXrs7Tri6Qg7Iuk7KCcIERCL0pTT04gZml4dHVyZSDqsJIg6rOE7JW97J20IOuEk+yKteuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSByb3dbcHJvcC5uYW1lXSBhcyBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXVtzdHJpbmddW1widmFsdWVcIl07XG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogY29sdW1uVmFsdWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5kYiA/PyBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgdGhyb3VnaFRhYmxlID0gcHJvcC5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgZnJvbUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRvQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGF3YWl0IGRiKHRocm91Z2hUYWJsZSkud2hlcmUoZnJvbUNvbHVtbiwgcm93LmlkKS5wbHVjayh0b0NvbHVtbik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpXG4gICAgICAgICAgICAud2hlcmUocHJvcC5qb2luQ29sdW1uLCByb3cuaWQpXG4gICAgICAgICAgICAucGx1Y2soXCJpZFwiKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmICFwcm9wLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAvLyDsl63rsKntlqUgT25lVG9PbmU6IEZL66W8IOqwgOynhCDqtIDroKgg7JeU7Yuw7Yuw66W8IOywvuyKteuLiOuLpFxuICAgICAgICAgIC8vIOyYiOyLnDogVXNlciBPbmVUb09uZSBFbXBsb3llZSAoRW1wbG95ZWXqsIAgdXNlcl9pZCBGS+ulvCDqsIDsp5ApXG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3AgJiYgaXNSZWxhdGlvblByb3AocmVsYXRlZFByb3ApKSB7XG4gICAgICAgICAgICAvLyDqtIDroKgg7JeU7Yuw7Yuw7JeQ7IScIEZLIOy7rOufvOycvOuhnCDsv7zrpqztlanri4jri6QgKGlk6rCAIOyVhOuLmClcbiAgICAgICAgICAgIGNvbnN0IGZrQ29sdW1uID0gYCR7cmVsYXRlZFByb3AubmFtZX1faWRgO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKGZrQ29sdW1uLCByb3cuaWQpLmZpcnN0KCk7XG4gICAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZFJvdz8uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gcmVsYXRpb25JZFNjaGVtYS5wYXJzZShyb3dbYCR7cHJvcC5uYW1lfV9pZGBdKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWxvbmdzUmVjb3Jkcy5wdXNoKGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiZcbiAgICAgICAgICAgIG9wdGlvbnM/LmluY2x1ZGVSZWxhdGlvbnMgIT09IGZhbHNlICYmXG4gICAgICAgICAgICBkZXB0aCA8IChvcHRpb25zPy5tYXhEZXB0aCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpICYmXG4gICAgICAgICAgICByZWxhdGVkSWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgcmVsYXRlZElkKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlKFxuICAgICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4uZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hLnBhcnNlKHJlbGF0ZWRSb3cpLFxuICAgICAgICAgICAgICAgICAgaWQ6IHoudW5pb24oW3oubnVtYmVyKCksIHouc3RyaW5nKCldKS5wYXJzZShyZWxhdGVkUm93LmlkKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlcHRoICsgMSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShyb290RW50aXR5LCByb290Um93LCAwKTtcblxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrAgKHNlbGYtcmVmZXJlbmNlIO2PrO2VqClcbiAgICogMi4g7YWM7J2067iU67OEIOugiOuyqOuzhOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSDrsI8gdXBzZXJ0IOyLpO2WiVxuICAgKiAzLiDsiJzshJwg6riw67CYIHV1aWTihpJpZCDrp6TtlZEgKFVwc2VydEJ1aWxkZXLqsIAgdXVpZOulvCBEQuyXkCDsoIDsnqXtlZjsp4Ag7JWK7Jy866+A66GcKVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy64qUIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWY7JesIOqwgSB1cHNlcnQg7Zi47Lac7JeQ7ISc64qUXG4gICAqIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuPhOuhnSDtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBpbnNlcnRGaXh0dXJlcyhcbiAgICBkYk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIF9maXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGZpeHR1cmVzID0gdW5pcXVlKF9maXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcblxuICAgIC8vIOy0iOq4sO2ZlFxuICAgIHRoaXMuYnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8g67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsl5DshJzripQgd29ya2Vy67OEIERC7JeQIOyggOyepVxuICAgIGNvbnN0IGRiQ29uZmlnID1cbiAgICAgIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiICYmIHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEXG4gICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBkYXRhYmFzZUNvbm5lY3Rpb25TY2hlbWEucGFyc2UoYmFzZUNvbmZpZy5jb25uZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmJhc2VDb25maWcsXG4gICAgICAgICAgICAgIGNvbm5lY3Rpb246IHsgLi4uY29ubmVjdGlvbiwgZGF0YWJhc2U6IGAke2Nvbm5lY3Rpb24uZGF0YWJhc2V9XyR7d29ya2VySWR9YCB9LFxuICAgICAgICAgICAgICBwb29sOiB7IG1pbjogMSwgbWF4OiAxIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKClcbiAgICAgICAgOiBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICBjb25zdCBkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShkYkNvbmZpZyk7XG4gICAgY29uc3QgcmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsFxuICAgICAgdGhpcy5yZWxhdGlvbkdyYXBoLmJ1aWxkR3JhcGgoZml4dHVyZXMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uT3JkZXIgPSB0aGlzLnJlbGF0aW9uR3JhcGguZ2V0SW5zZXJ0aW9uT3JkZXIoKTtcblxuICAgICAgLy8gMi4g7Iqk7YK17ZWgIGZpeHR1cmUg66i87KCAIOyymOumrCAob3ZlcnJpZGUg7LK07YGsKVxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGhhc1RhcmdldCA9ICEhZml4dHVyZS50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGhhc1VuaXF1ZSA9ICEhZml4dHVyZS51bmlxdWU7XG4gICAgICAgIGNvbnN0IGhhc0R1cGxpY2F0ZSA9IGhhc1RhcmdldCB8fCBoYXNVbmlxdWU7XG5cbiAgICAgICAgLy8g7KSR67O17J20IOyeiOqzoCBvdmVycmlkZT1mYWxzZeyduCDqsr3smrA6IOyKpO2CtVxuICAgICAgICBpZiAoaGFzRHVwbGljYXRlICYmICFmaXh0dXJlLm92ZXJyaWRlKSB7XG4gICAgICAgICAgLy8g6riw7KG0IOugiOy9lOuTnCBJRCDsoIDsnqUgKHVuaXF1ZSDsmrDshKAsIOyXhuycvOuptCB0YXJnZXQpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGZpeHR1cmUudW5pcXVlPy5pZCA/PyBmaXh0dXJlLnRhcmdldD8uaWQ7XG4gICAgICAgICAgYXNzZXJ0KGV4aXN0aW5nSWQpO1xuICAgICAgICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzLnNldChmaXh0dXJlSWQsIHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgZXhpc3RpbmdJZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgU2tpcHBlZCAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH0gKGV4aXN0aW5nOiAjJHtleGlzdGluZ0lkfSwgb3ZlcnJpZGU6IGZhbHNlKWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIO2FjOydtOu4lOuzhCBmaXh0dXJlIOq3uOujue2ZlCAoaW5zZXJ0aW9uT3JkZXIg7Iic7IScIOq4sOuwmClcbiAgICAgIGNvbnN0IGZpeHR1cmVzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBGaXh0dXJlUmVjb3JkW10+KCk7XG4gICAgICBjb25zdCB0YWJsZU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICAvLyDsiqTtgrXrkJwgZml4dHVyZSDsoJzsmbhcbiAgICAgICAgaWYgKHRoaXMuc2tpcHBlZEZpeHR1cmVzLmhhcyhmaXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGVudGl0eS50YWJsZTtcblxuICAgICAgICBpZiAoIWZpeHR1cmVzQnlUYWJsZS5oYXModGFibGVOYW1lKSkge1xuICAgICAgICAgIGZpeHR1cmVzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBbXSk7XG4gICAgICAgICAgdGFibGVPcmRlci5wdXNoKHRhYmxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4dHVyZXNCeVRhYmxlLmdldCh0YWJsZU5hbWUpPy5wdXNoKGZpeHR1cmUpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydGVkSWRzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PigpO1xuXG4gICAgICAgIC8vIDQuIO2FjOydtOu4lOuzhCDroIjrsqjrs4Qg7LKY66asXG4gICAgICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlT3JkZXIpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZUZpeHR1cmVzID0gZml4dHVyZXNCeVRhYmxlLmdldCh0YWJsZU5hbWUpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IGxldmVscyA9IHRoaXMuZ3JvdXBGaXh0dXJlc0J5TGV2ZWwodGFibGVGaXh0dXJlcyk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGxldmVsRml4dHVyZXMgb2YgbGV2ZWxzKSB7XG4gICAgICAgICAgICAvLyDtlbTri7kg66CI67Ko7J2YIGZpeHR1cmXrk6QgcmVnaXN0ZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBsZXZlbEZpeHR1cmVzKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmUsIGluc2VydGVkSWRzQnlUYWJsZSk7XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUpYCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBzZXJ0IOyLpO2WiSDsoIQgdXVpZCDrqqnroZ0g7KCA7J6lXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuYnVpbGRlci5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdXVpZHMgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiB6LnN0cmluZygpLnBhcnNlKHJvdy51dWlkKSk7XG5cbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgICAgYFVwc2VydGluZyAke3RhYmxlTmFtZX0gd2l0aCAke3V1aWRzLmxlbmd0aH0gcm93cyAobGV2ZWwgJHtsZXZlbHMuaW5kZXhPZihsZXZlbEZpeHR1cmVzKSArIDF9LyR7bGV2ZWxzLmxlbmd0aH0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gU0FGRVRZOiB0YWJsZU5hbWXsnYAg65Ox66Gd65CcIEVudGl0eeydmCDsi6TsoJwg7YWM7J2067iU66qF7JeQ7ISc66eMIOyDneyEseuQqeuLiOuLpC5cbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYVRhYmxlTmFtZSA9IHRhYmxlTmFtZSBhcyBrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZDtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IGZpeHR1cmVSZWNvcmRJZHNTY2hlbWEucGFyc2UoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRlci51cHNlcnQodHJ4LCBzY2hlbWFUYWJsZU5hbWUpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8g7Iic7IScIOq4sOuwmCB1dWlkIC0+IGlkIOunpO2VkVxuICAgICAgICAgICAgLy8gc2VsZi1yZWZlcmVuY2XqsIAg7JeG7Jy866+A66GcIOuTseuhnSDsiJzshJwgPSDrsJjtmZgg7Iic7IScIOuztOyepVxuICAgICAgICAgICAgaWYgKHV1aWRzLmxlbmd0aCA+IDAgJiYgdXVpZHMubGVuZ3RoID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWFwID1cbiAgICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHRhYmxlTmFtZSkgPz8gbmV3IE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1dWlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nTWFwLnNldCh1dWlkc1tpXSwgaWRzW2ldKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgZXhpc3RpbmdNYXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1dWlkcy5sZW5ndGggIT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgIGBXYXJuaW5nOiB1dWlkIGNvdW50ICgke3V1aWRzLmxlbmd0aH0pICE9IGlkIGNvdW50ICgke2lkcy5sZW5ndGh9KSBmb3IgJHt0YWJsZU5hbWV9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIE1hbnlUb01hbnkg6rSA6rOEIOyymOumrFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKHRyeCwgZml4dHVyZXMsIGluc2VydGVkSWRzQnlUYWJsZSk7XG5cbiAgICAgICAgLy8gNi4gUG9zdGdyZVNRTCDsi5ztgIDsiqQg66as7IWLXG4gICAgICAgIC8vIEZpeHR1cmUg7IK97J6FIO2bhCDqsIEg7YWM7J2067iU7J2YIElEIOyLnO2AgOyKpOulvCDstZzrjIAgSUQg6rCS7Jy866GcIOyXheuNsOydtO2KuO2VqeuLiOuLpC5cbiAgICAgICAgLy8g7J2066CH6rKMIO2VmOyngCDslYrsnLzrqbQg64uk7J2MIElOU0VSVCDsi5wgSUTqsIAgMjAwMOuyiOuMgOuhnCDsg53shLHrkKAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJSZXNldHRpbmcgc2VxdWVuY2VzLi4uXCIpKTtcbiAgICAgICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVPcmRlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBFbnRpdHnrpbwg7LC+7JWE7IScIGlkIO2DgOyehSDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgICBjb25zdCBpZFByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICAgICAgICBjb25zdCBpZFR5cGUgPSBpZFByb3A/LnR5cGU7XG5cbiAgICAgICAgICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2Vy7J206rGw64KYLCBzdHJpbmfsnbTsp4Drp4wgZml4dHVyZVN0cmF0ZWd5PXNlcXVlbmNl7J24IOqyveyasOyXkOunjCDrpqzshYvtlanri4jri6RcbiAgICAgICAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRUeXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCI7XG5cbiAgICAgICAgICAgICAgaWYgKCF1c2VzU2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICAgICAgICAgIGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDthYzsnbTruJTsnZgg7LWc64yAIElEIOyhsO2ajCAoc3RyaW5nIO2DgOyeheydgCDsiKvsnpAg7LqQ7Iqk7YyFIO2VhOyalClcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eTIgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCkuZmluZChcbiAgICAgICAgICAgICAgKGUpID0+IGUudGFibGUgPT09IHRhYmxlTmFtZSB8fCBlLmlkLnRvTG93ZXJDYXNlKCkgPT09IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpZFR5cGUyID0gZW50aXR5Mj8ucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpPy50eXBlO1xuICAgICAgICAgICAgY29uc3QgbWF4SWRSZXN1bHQgPVxuICAgICAgICAgICAgICBpZFR5cGUyID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgPyBhd2FpdCB0cnhcbiAgICAgICAgICAgICAgICAgICAgLnJhdyhgU0VMRUNUIE1BWChpZDo6YmlnaW50KSBhcyBtYXhfaWQgRlJPTSBcIiR7dGFibGVOYW1lfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHIpID0+IHIucm93c1swXSlcbiAgICAgICAgICAgICAgICA6IGF3YWl0IHRyeCh0YWJsZU5hbWUpLm1heChcImlkIGFzIG1heF9pZFwiKS5maXJzdCgpO1xuICAgICAgICAgICAgY29uc3QgbWF4SWQgPSBtYXhJZFJlc3VsdD8ubWF4X2lkO1xuXG4gICAgICAgICAgICBpZiAobWF4SWQgIT09IG51bGwgJiYgbWF4SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyDsi5ztgIDsiqTrqoXsnYQgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZeuhnCDslYjsoITtlZjqsowg7KGw7ZqMXG4gICAgICAgICAgICAgIGF3YWl0IHRyeC5yYXcoYFNFTEVDVCBzZXR2YWwocGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSg/LCAnaWQnKSwgPylgLCBbXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIG1heElkLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBSZXNldCBzZXF1ZW5jZSBmb3IgJHt0YWJsZU5hbWV9OiAke21heElkfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIOyLnO2AgOyKpOqwgCDsl4bripQg7YWM7J2067iUKGpvaW4gdGFibGUg65OxKeydgCDrrLTsi5xcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNy4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZShyZXN1bHRzLCAocikgPT4gYCR7ci5lbnRpdHlJZH0jJHtyLmRhdGEuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZVJlY29yZOulvCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnVxuICAgKiBAcGFyYW0gaW5zZXJ0ZWRJZHNCeVRhYmxlIOydtOuvuCB1cHNlcnTrkJwg7YWM7J2067iU7J2YIHV1aWTihpJpZCDrp6TtlZEgKOugiOuyqOuzhCDsspjrpqwg7IucIOyCrOyaqSlcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICBjb25zdCByb3c6IFVwc2VydFJvdyA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZWQgY29sdW1u7J2AIElOU0VSVOyXkOyEnCDsoJzsmbggKERC6rCAIOyekOuPmSDsg53shLEpXG4gICAgICBpZiAoXCJnZW5lcmF0ZWRcIiBpbiBwcm9wICYmIHByb3AuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZCDsspjrpqxcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIC8vIHBhcmVudElkIOyXlO2LsO2LsOydmCBpZOuKlCDrtoDrqqgg7JeU7Yuw7Yuw7J2YIEZL7J2066+A66GcIOyLnO2AgOyKpCDrr7jsgqzsmqkgKOuqheyLnOyggeycvOuhnCDtj6ztlagpXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgIWVudGl0eS5wYXJlbnRJZCAmJlxuICAgICAgICAgIChpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgICBpZFByb3A/LnR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKTtcblxuICAgICAgICBpZiAoaXNPdmVycmlkZU1vZGUgJiYgZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgICAvLyBPdmVycmlkZTog6riw7KG0IOugiOy9lOuTnOydmCDqsJIg7IKs7JqpIOKGkiBVUERBVEVcbiAgICAgICAgICByb3dbcHJvcE5hbWVdID0gZXhpc3RpbmdSZWNvcmQuY29sdW1uc1twcm9wTmFtZV0/LnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKCF1c2VzU2VxdWVuY2UpIHtcbiAgICAgICAgICAvLyBzdHJpbmcgUEsg65iQ64qUIHBhcmVudElkIOyXlO2LsO2LsCBGSzog7IOd7ISx65CcIGlkIOqwkuydhCBJTlNFUlTsl5Ag7Y+s7ZWoXG4gICAgICAgICAgcm93W3Byb3BOYW1lXSA9IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEs6IERCIOyLnO2AgOyKpOyXkCDrp6HquYAgKOqwkiDsoJzsmbgpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByZWxhdGlvbklkU2NoZW1hLnBhcnNlKGNvbHVtbi52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCwgY29sdW1uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICB2YWx1ZTogRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdLFxuICApOiBEYXRhRXhwbG9yZXJWYWx1ZSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAvLyBVcHNlcnRCdWlsZGVyLnJlZ2lzdGVy7JeQ7IScIEpTT04uc3RyaW5naWZ5IOyymOumrO2VmOuvgOuhnCBvYmplY3Qg6re464yA66GcIOyghOuLrFxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBkYXRlU291cmNlID0gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLnNhZmVQYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKGRhdGVTb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVTb3VyY2UuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmJ1aWxkZXIuaGFzVGFibGUodGFyZ2V0VGFibGUudGFibGUpKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBmaXh0dXJlUmVjb3JkSWRzU2NoZW1hLnBhcnNlKGNvbHVtbi52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwmeydgCDthYzsnbTruJQg64K0IGZpeHR1cmXrk6TsnYQgc2VsZi1yZWZlcmVuY2Ug66CI67Ko67OE66GcIOu2hO2VoFxuICAgKiAtIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuKlCBmaXh0dXJl65OkOiBMZXZlbCAwXG4gICAqIC0gTGV2ZWwgMOydhCDssLjsobDtlZjripQgZml4dHVyZeuTpDogTGV2ZWwgMVxuICAgKiAtIOuwmOuztVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy6rCAIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0IEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBncm91cEZpeHR1cmVzQnlMZXZlbChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogRml4dHVyZVJlY29yZFtdW10ge1xuICAgIGlmIChmaXh0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlc1swXS5lbnRpdHlJZCk7XG5cbiAgICAvLyBzZWxmLXJlZmVyZW5jZSByZWxhdGlvbiBwcm9wIOywvuq4sFxuICAgIGNvbnN0IHNlbGZSZWZQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIHwgT25lVG9PbmVSZWxhdGlvblByb3AgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZlJlZlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc2VsZi1yZWZlcmVuY2Ug7JeG7J2MIOKGkiDri6jsnbwg66CI67KoXG4gICAgICByZXR1cm4gW2ZpeHR1cmVzXTtcbiAgICB9XG5cbiAgICAvLyDroIjrsqjrs4Qg67aE7ZWgICh0b3BvbG9naWNhbCBzb3J0KVxuICAgIGNvbnN0IGxldmVsczogRml4dHVyZVJlY29yZFtdW10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KGZpeHR1cmVzLm1hcCgoZikgPT4gZi5maXh0dXJlSWQpKTtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBpZiAoIXJlbWFpbmluZy5oYXMoZml4dHVyZS5maXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDrqqjrkZAg7J2066+4IOyymOumrOuQkOqxsOuCmCBudWxs7J24IOqyveyasFxuICAgICAgICBjb25zdCBjYW5Qcm9jZXNzID0gc2VsZlJlZlByb3BzLmV2ZXJ5KChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmSWQgPSByZWxhdGlvbklkU2NoZW1hLnBhcnNlKGZpeHR1cmUuY29sdW1uc1twcm9wLm5hbWVdPy52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlZklkID09PSBudWxsIHx8IHJlZklkID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAgIGNvbnN0IHJlZkZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWZJZH1gO1xuICAgICAgICAgIC8vIOydtOuvuCDsspjrpqzrkJDqsbDrgpgsIO2YhOyerCBmaXh0dXJlc+yXkCDtj6ztlajrkJjsp4Ag7JWK7J2AIOqyveyasCAo7Jm467aAIOywuOyhsClcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkLmhhcyhyZWZGaXh0dXJlSWQpIHx8ICFyZW1haW5pbmcuaGFzKHJlZkZpeHR1cmVJZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjYW5Qcm9jZXNzKSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2goZml4dHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRMZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nSWRzID0gQXJyYXkuZnJvbShyZW1haW5pbmcpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDaXJjdWxhciBzZWxmLXJlZmVyZW5jZSBkZXRlY3RlZCBpbiAke2VudGl0eS50YWJsZX0uIFJlbWFpbmluZyBmaXh0dXJlczogJHtyZW1haW5pbmdJZHN9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGN1cnJlbnRMZXZlbCkge1xuICAgICAgICByZW1haW5pbmcuZGVsZXRlKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgcHJvY2Vzc2VkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICB9XG5cbiAgICAgIGxldmVscy5wdXNoKGN1cnJlbnRMZXZlbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxldmVscztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tVbmlxdWVWaW9sYXRpb24oZGI6IEtuZXgsIGVudGl0eTogRW50aXR5LCBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkKSB7XG4gICAgY29uc3QgZW50aXR5VW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gZW50aXR5VW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogRGF0YUV4cGxvcmVyUmVjb3JkID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0ZjhcIik7XG5cbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyU3RhcnQgPSBjb250ZW50LmluZGV4T2YoXCJjb25zdCBmaXh0dXJlTG9hZGVyID0ge1wiKTtcbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyRW5kID0gY29udGVudC5pbmRleE9mKFwifTtcIiwgZml4dHVyZUxvYWRlclN0YXJ0KTtcblxuICAgIGlmIChmaXh0dXJlTG9hZGVyU3RhcnQgIT09IC0xICYmIGZpeHR1cmVMb2FkZXJFbmQgIT09IC0xKSB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7Y29udGVudC5zbGljZSgwLCBmaXh0dXJlTG9hZGVyRW5kKX0gICR7Y29kZX1cXG4ke2NvbnRlbnQuc2xpY2UoZml4dHVyZUxvYWRlckVuZCl9YDtcblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErREEsU0FBUyxzQkFBc0IsT0FBcUIsWUFBbUM7Q0FDckYsT0FBTyxJQUFJLFNBQVMsU0FBUyxXQUFXO0VBQ3RDLE1BQU0sS0FBSyxTQUFTLE1BQU07RUFDMUIsTUFBTSxLQUFLLFNBQVMsTUFBTSxXQUFXO0dBQ25DLElBQUksU0FBUyxHQUFHLFFBQVE7UUFFdEIsdUJBQ0UsSUFBSSxNQUFNLEdBQUcsV0FBVyxPQUFPLFFBQVEsVUFBVSxVQUFVLGFBQWEsQ0FDMUU7RUFDSixDQUFDO0NBQ0gsQ0FBQztBQUNIO0FBRUEsU0FBUyxzQkFDUCxZQUNBLE1BQ0EsU0FDZTtDQUNmLE9BQU8sc0JBQXNCLE1BQU0sWUFBWSxNQUFNLE9BQU8sR0FBRyxVQUFVO0FBQzNFO0FBRUEsZUFBZSxvQkFDYixRQUNBLGFBQ2U7Q0FDZixNQUFNLGdCQUFnQixN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
727
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYW5hZ2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuaW1wb3J0IHsgc3Bhd24sIHR5cGUgQ2hpbGRQcm9jZXNzLCB0eXBlIFNwYXduT3B0aW9ucyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJub2RlOnV0aWxcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHsgdHlwZSBVQlJlZiB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbFByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIHR5cGUgT25lVG9PbmVSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJlbGF0aW9uR3JhcGggfSBmcm9tIFwiLi9fcmVsYXRpb24tZ3JhcGhcIjtcbmltcG9ydCB7IGRhdGFFeHBsb3JlclJlY29yZFNjaGVtYSB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRGF0YUV4cGxvcmVyUmVjb3JkLCB0eXBlIERhdGFFeHBsb3JlclZhbHVlIH0gZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuXG5jb25zdCBwZ0Nvbm5lY3Rpb25TY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgdXNlcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpO1xuY29uc3QgZGF0YWJhc2VDb25uZWN0aW9uU2NoZW1hID0gei5vYmplY3QoeyBkYXRhYmFzZTogei5zdHJpbmcoKSB9KS5wYXNzdGhyb3VnaCgpO1xuY29uc3QgZml4dHVyZVJlY29yZElkc1NjaGVtYSA9IHouYXJyYXkoei51bmlvbihbei5udW1iZXIoKSwgei5zdHJpbmcoKV0pKTtcbmNvbnN0IHJlbGF0aW9uSWRTY2hlbWEgPSB6LnVuaW9uKFt6Lm51bWJlcigpLCB6LnN0cmluZygpLCB6Lm51bGwoKV0pO1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlU291cmNlUmVjb3JkID0gRGF0YUV4cGxvcmVyUmVjb3JkICYge1xuICBpZDogbnVtYmVyIHwgc3RyaW5nO1xufTtcblxudHlwZSBVcHNlcnRSb3dWYWx1ZSA9IERhdGFFeHBsb3JlclZhbHVlIHwgVUJSZWY7XG50eXBlIFVwc2VydFJvdyA9IHtcbiAgW2NvbHVtbk5hbWU6IHN0cmluZ106IFVwc2VydFJvd1ZhbHVlO1xufTtcblxuZnVuY3Rpb24gd2FpdEZvckZpeHR1cmVDb21tYW5kKGNoaWxkOiBDaGlsZFByb2Nlc3MsIGV4ZWN1dGFibGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNoaWxkLm9uY2UoXCJlcnJvclwiLCByZWplY3QpO1xuICAgIGNoaWxkLm9uY2UoXCJleGl0XCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSByZXNvbHZlKCk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoYCR7ZXhlY3V0YWJsZX0g66qF66C57J20ICR7Y29kZSA/PyBzaWduYWwgPz8gXCJ1bmtub3duXCJ9IOyDge2DnOuhnCDsi6TtjKjtlojsirXri4jri6QuYCksXG4gICAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gIGV4ZWN1dGFibGU6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IFBpY2s8U3Bhd25PcHRpb25zLCBcImVudlwiIHwgXCJzdGRpb1wiPixcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gd2FpdEZvckZpeHR1cmVDb21tYW5kKHNwYXduKGV4ZWN1dGFibGUsIGFyZ3MsIG9wdGlvbnMpLCBleGVjdXRhYmxlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGlwZUZpeHR1cmVDb21tYW5kcyhcbiAgc291cmNlOiB7IGV4ZWN1dGFibGU6IHN0cmluZzsgYXJnczogc3RyaW5nW107IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgZGVzdGluYXRpb246IHsgZXhlY3V0YWJsZTogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXTsgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZVByb2Nlc3MgPSBzcGF3bihzb3VyY2UuZXhlY3V0YWJsZSwgc291cmNlLmFyZ3MsIHtcbiAgICBlbnY6IHNvdXJjZS5lbnYsXG4gICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJpbmhlcml0XCJdLFxuICB9KTtcbiAgY29uc3QgZGVzdGluYXRpb25Qcm9jZXNzID0gc3Bhd24oZGVzdGluYXRpb24uZXhlY3V0YWJsZSwgZGVzdGluYXRpb24uYXJncywge1xuICAgIGVudjogZGVzdGluYXRpb24uZW52LFxuICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwiaW5oZXJpdFwiLCBcImluaGVyaXRcIl0sXG4gIH0pO1xuICBhc3NlcnQoc291cmNlUHJvY2Vzcy5zdGRvdXQpO1xuICBhc3NlcnQoZGVzdGluYXRpb25Qcm9jZXNzLnN0ZGluKTtcbiAgc291cmNlUHJvY2Vzcy5zdGRvdXQucGlwZShkZXN0aW5hdGlvblByb2Nlc3Muc3RkaW4pO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgd2FpdEZvckZpeHR1cmVDb21tYW5kKHNvdXJjZVByb2Nlc3MsIHNvdXJjZS5leGVjdXRhYmxlKSxcbiAgICAgIHdhaXRGb3JGaXh0dXJlQ29tbWFuZChkZXN0aW5hdGlvblByb2Nlc3MsIGRlc3RpbmF0aW9uLmV4ZWN1dGFibGUpLFxuICAgIF0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHNvdXJjZVByb2Nlc3Mua2lsbCgpO1xuICAgIGRlc3RpbmF0aW9uUHJvY2Vzcy5raWxsKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZSBkYXRhYmFzZSBzeW5jaHJvbml6YXRpb24gY29tbWFuZCBmYWlsZWRcIiwgeyBjYXVzZTogZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqIOyCrOyaqeyekCDsp4DsoJUg7KSR67O1IO2ZleyduCDsu6zrn7wgKGVudGl0eUlk67OE66GcIOyngOyglSkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHVwbGljYXRlQ2hlY2tPcHRpb25zIHtcbiAgY29sdW1ucz86IHtcbiAgICBbZW50aXR5SWQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgbWF4RGVwdGg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBGaXh0dXJlTWFuYWdlckNsYXNzIHtcbiAgcHJpdmF0ZSB0ZXN0aW5nRGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLnRlc3RpbmdEYiA9IHRkYjtcbiAgfVxuICBnZXQgdGRiKCk6IEtuZXgge1xuICAgIGlmICh0aGlzLnRlc3RpbmdEYiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRml4dHVyZU1hbmFnZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXN0aW5nRGI7XG4gIH1cblxuICBwcml2YXRlIGZpeHR1cmVEYjogS25leCB8IG51bGwgPSBudWxsO1xuICBzZXQgZmRiKGZkYjogS25leCkge1xuICAgIHRoaXMuZml4dHVyZURiID0gZmRiO1xuICB9XG4gIGdldCBmZGIoKTogS25leCB7XG4gICAgaWYgKHRoaXMuZml4dHVyZURiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpeHR1cmVEYjtcbiAgfVxuICBjYWNoZWRUYWJsZU5hbWVzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVsYXRpb25HcmFwaCA9IG5ldyBSZWxhdGlvbkdyYXBoKCk7XG5cbiAgLy8gVXBzZXJ0QnVpbGRlciDquLDrsJggaW1wb3J066W8IOychO2VnCDsg4Htg5xcbiAgcHJpdmF0ZSBidWlsZGVyOiBVcHNlcnRCdWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgcHJpdmF0ZSBmaXh0dXJlUmVmTWFwOiBNYXA8c3RyaW5nLCBVQlJlZj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc2tpcHBlZEZpeHR1cmVzOiBNYXA8c3RyaW5nLCB7IGVudGl0eUlkOiBzdHJpbmc7IGV4aXN0aW5nSWQ6IG51bWJlciB8IHN0cmluZyB9PiA9XG4gICAgbmV3IE1hcCgpO1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMudGVzdGluZ0RiICE9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChTb25hbXUuZGJDb25maWcudGVzdCAmJiBTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbikge1xuICAgICAgY29uc3QgdENvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbik7XG4gICAgICBjb25zdCBwQ29ubiA9IHBnQ29ubmVjdGlvblNjaGVtYS5wYXJzZShTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbi5jb25uZWN0aW9uKTtcbiAgICAgIGlmIChcbiAgICAgICAgYCR7dENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3RDb25uLnBvcnQgPz8gNTQzMn0vJHt0Q29ubi5kYXRhYmFzZX1gID09PVxuICAgICAgICBgJHtwQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7cENvbm4ucG9ydCA/PyA1NDMyfS8ke3BDb25uLmRhdGFiYXNlfWBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2FjOyKpO2KuERC7JmAIO2UhOuhnOuNleyFmERC7JeQIOuPmeydvO2VnCDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7IKs7Jqp65CY7JeI7Iq164uI64ukLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGRiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy50ZXN0KTtcbiAgICB0aGlzLmZkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gIH1cblxuICAvKipcbiAgICDsm5DqsqkgZml4dHVyZSBEQuulvCDroZzsu6wgdGVzdCBEQuuhnCDrs7Xsgqztlanri4jri6QuXG4gICAgcGdfZHVtcOuhnCDsm5DqsqkgRELrpbwg642k7ZSE7ZWY6rOgLCBwZ19yZXN0b3Jl66GcIOuhnOy7rOyXkCDrs7Xsm5Dtlanri4jri6QuXG4gICovXG4gIGFzeW5jIHN5bmMoKSB7XG4gICAgY29uc3QgZml4dHVyZUNvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbik7XG4gICAgY29uc3QgdGVzdENvbm4gPSBwZ0Nvbm5lY3Rpb25TY2hlbWEucGFyc2UoU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbik7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBjb25zdCB0ZXN0UHNxbEFyZ3MgPSBbXG4gICAgICBcIi1oXCIsXG4gICAgICB0ZXN0Q29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICBcIi1wXCIsXG4gICAgICBTdHJpbmcodGVzdENvbm4ucG9ydCA/PyA1NDMyKSxcbiAgICAgIFwiLVVcIixcbiAgICAgIHRlc3RDb25uLnVzZXIgPz8gXCJcIixcbiAgICAgIFwiLWRcIixcbiAgICAgIFwicG9zdGdyZXNcIixcbiAgICAgIFwiLWNcIixcbiAgICBdO1xuICAgIGF3YWl0IGV4ZWN1dGVGaXh0dXJlQ29tbWFuZChcbiAgICAgIFwicHNxbFwiLFxuICAgICAgW1xuICAgICAgICAuLi50ZXN0UHNxbEFyZ3MsXG4gICAgICAgIGBcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBgLFxuICAgICAgXSxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IH0sXG4gICAgKTtcbiAgICBhd2FpdCBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gICAgICBcInBzcWxcIixcbiAgICAgIFsuLi50ZXN0UHNxbEFyZ3MsIGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcIiR7dGVzdENvbm4uZGF0YWJhc2V9XCJgXSxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IH0sXG4gICAgKTtcbiAgICBhd2FpdCBleGVjdXRlRml4dHVyZUNvbW1hbmQoXG4gICAgICBcInBzcWxcIixcbiAgICAgIFsuLi50ZXN0UHNxbEFyZ3MsIGBDUkVBVEUgREFUQUJBU0UgXCIke3Rlc3RDb25uLmRhdGFiYXNlfVwiYF0sXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSB9LFxuICAgICk7XG5cbiAgICAvLyAyLiDsm5DqsqkgZml4dHVyZSBEQiDihpIg66Gc7LusIHRlc3QgRELroZwg67O17IKsIChwZ19kdW1wIHwgcGdfcmVzdG9yZSlcbiAgICBjb25zdCBmaXh0dXJlUGdFbnYgPSB7IFBHUEFTU1dPUkQ6IGZpeHR1cmVDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBhd2FpdCBwaXBlRml4dHVyZUNvbW1hbmRzKFxuICAgICAge1xuICAgICAgICBleGVjdXRhYmxlOiBcInBnX2R1bXBcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWhcIixcbiAgICAgICAgICBmaXh0dXJlQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICAgICAgXCItcFwiLFxuICAgICAgICAgIFN0cmluZyhmaXh0dXJlQ29ubi5wb3J0ID8/IDU0MzIpLFxuICAgICAgICAgIFwiLVVcIixcbiAgICAgICAgICBmaXh0dXJlQ29ubi51c2VyID8/IFwiXCIsXG4gICAgICAgICAgXCItZFwiLFxuICAgICAgICAgIGZpeHR1cmVDb25uLmRhdGFiYXNlLFxuICAgICAgICAgIFwiLUZjXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBleGVjdXRhYmxlOiBcInBnX3Jlc3RvcmVcIixcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIFwiLWhcIixcbiAgICAgICAgICB0ZXN0Q29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCIsXG4gICAgICAgICAgXCItcFwiLFxuICAgICAgICAgIFN0cmluZyh0ZXN0Q29ubi5wb3J0ID8/IDU0MzIpLFxuICAgICAgICAgIFwiLVVcIixcbiAgICAgICAgICB0ZXN0Q29ubi51c2VyID8/IFwiXCIsXG4gICAgICAgICAgXCItZFwiLFxuICAgICAgICAgIHRlc3RDb25uLmRhdGFiYXNlLFxuICAgICAgICAgIFwiLS1uby1vd25lclwiLFxuICAgICAgICAgIFwiLS1uby1hY2xcIixcbiAgICAgICAgXSxcbiAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyAzLiDsi5ztgIDsiqQg66as7IWLICjrjbDsnbTthLAg67O17IKsIO2bhCDsi5ztgIDsiqTrpbwgTUFYKGlkKeuhnCDsoJXroKwpXG4gICAgYXdhaXQgdGhpcy5yZXNldFNlcXVlbmNlcyhTb25hbXUuZGJDb25maWcudGVzdCk7XG4gIH1cblxuICAvKipcbiAgICog66qo65OgIO2FjOydtOu4lOydmCDsi5ztgIDsiqTrpbwg7ZiE7J6sIE1BWChpZCnroZwg66as7IWL7ZWp64uI64ukLlxuICAgKiBmaXh0dXJlIHN5bmMg7ZuEIOyLnO2AgOyKpOqwgCDsi6TsoJwg642w7J207YSw7JmAIOunnuyngCDslYrripQg66y47KCc66W8IO2VtOqysO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRTZXF1ZW5jZXMoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnW1widGVzdFwiXSkge1xuICAgIGNvbnN0IHRlc3REYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShkYkNvbmZpZyk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZW50aXR5LnRhYmxlIHx8IGVudGl0eS5pZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIGlkIO2VhOuTnOydmCDtg4DsnoXsnYQg7ZmV7J247ZWp64uI64ukXG4gICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIGNvbnN0IGlkVHlwZSA9IGlkUHJvcD8udHlwZTtcblxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXLsnbTqsbDrgpgsIHN0cmluZ+ydtOyngOunjCBmaXh0dXJlU3RyYXRlZ3k9c2VxdWVuY2Xsnbgg6rK97Jqw7JeQ66eMIOumrOyFi+2VqeuLiOuLpFxuICAgICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAgIGlkVHlwZSA9PT0gXCJpbnRlZ2VyXCIgfHxcbiAgICAgICAgICBpZFR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgaWRQcm9wPy5jb25lPy5maXh0dXJlU3RyYXRlZ3kgPT09IFwic2VxdWVuY2VcIjtcblxuICAgICAgICBpZiAoIXVzZXNTZXF1ZW5jZSkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGBTa2lwcGluZyBzZXF1ZW5jZSByZXNldCBmb3IgJHt0YWJsZU5hbWV9IChpZCB0eXBlOiAke2lkVHlwZSB8fCBcInVua25vd25cIn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQb3N0Z3JlU1FMIOyLnO2AgOyKpOulvCDtmITsnqwg7YWM7J2067iU7J2YIE1BWChpZCnroZwg66as7IWL7ZWp64uI64ukLlxuICAgICAgICAvLyBzdHJpbmcg7YOA7J6F7J2YIOqyveyasCDsiKvsnpAg7LqQ7Iqk7YyF7J20IO2VhOyalO2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgbWF4RXhwciA9IGlkVHlwZSA9PT0gXCJzdHJpbmdcIiA/IFwiTUFYKGlkOjpiaWdpbnQpXCIgOiBcIk1BWChpZClcIjtcbiAgICAgICAgYXdhaXQgdGVzdERiLnJhdyhgXG4gICAgICAgICAgU0VMRUNUIHNldHZhbChcbiAgICAgICAgICAgIHBnX2dldF9zZXJpYWxfc2VxdWVuY2UoJ3B1YmxpYy4ke3RhYmxlTmFtZX0nLCAnaWQnKSxcbiAgICAgICAgICAgIENPQUxFU0NFKChTRUxFQ1QgJHttYXhFeHByfSBGUk9NICR7dGFibGVOYW1lfSksIDEpXG4gICAgICAgICAgKVxuICAgICAgICBgKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGVzdERiLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZpc2l0ZWRSZWNvcmRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGFzeW5jIGltcG9ydEZpeHR1cmUoZW50aXR5SWQ6IHN0cmluZywgaWRzOiBudW1iZXJbXSkge1xuICAgIC8vIOuwqeusuCDquLDroZ0g7LSI6riw7ZmUICjsg4jroZzsmrQgaW1wb3J0IOyekeyXhSDsi5zsnpEpXG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5jbGVhcigpO1xuXG4gICAgY29uc3QgcXVlcmllcyA9IHVuaXF1ZShcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgaWRzLm1hcChhc3luYyAoaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEltcG9ydFF1ZXJpZXMoZW50aXR5SWQsIFwiaWRcIiwgaWQpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICApLmZsYXQoKSxcbiAgICApO1xuXG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICBmb3IgKGNvbnN0IHF1ZXJ5IG9mIHF1ZXJpZXMpIHtcbiAgICAgIGF3YWl0IHdkYi5yYXcocXVlcnkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEltcG9ydFF1ZXJpZXMoZW50aXR5SWQ6IHN0cmluZywgZmllbGQ6IHN0cmluZywgaWQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtmaWVsZH0jJHtpZH1gO1xuXG4gICAgLy8g7Iic7ZmYIOywuOyhsCDrsKnsp4A6IOydtOuvuCDrsKnrrLjtlZwg66CI7L2U65Oc64qUIOyKpO2CtVxuICAgIGlmICh0aGlzLnZpc2l0ZWRSZWNvcmRzLmhhcyhyZWNvcmRLZXkpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRoaXMudmlzaXRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcblxuICAgIC8vIOyXrOq4sOyEnCDsi6REQuydmCByb3cg6rCA7KC47Ji0XG4gICAgY29uc3QgW3Jvd10gPSBhd2FpdCB3ZGIoZW50aXR5LnRhYmxlKS53aGVyZShmaWVsZCwgaWQpLmxpbWl0KDEpO1xuICAgIGlmIChyb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfSMke2lkfSByb3frpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7ZS97Iqk7LOQREIsIOyLpERCXG4gICAgY29uc3QgZml4dHVyZURhdGFiYXNlID0gZGF0YWJhc2VDb25uZWN0aW9uU2NoZW1hLnBhcnNlKFxuICAgICAgU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbixcbiAgICApLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IGRhdGFiYXNlQ29ubmVjdGlvblNjaGVtYS5wYXJzZShcbiAgICAgIFNvbmFtdS5kYkNvbmZpZy5wcm9kdWN0aW9uLmNvbm5lY3Rpb24sXG4gICAgKS5kYXRhYmFzZTtcblxuICAgIGNvbnN0IHNlbGZRdWVyeSA9IGBJTlNFUlQgSUdOT1JFIElOVE8gXFxgJHtmaXh0dXJlRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCAoU0VMRUNUICogRlJPTSBcXGAke3JlYWxEYXRhYmFzZX1cXGAuXFxgJHtlbnRpdHkudGFibGV9XFxgIFdIRVJFIFxcYGlkXFxgID0gJHtpZH0pYDtcblxuICAgIGNvbnN0IGFyZ3MgPSBPYmplY3QuZW50cmllcyhlbnRpdHkucmVsYXRpb25zKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFssIHJlbGF0aW9uXSkgPT5cbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSA9PT0gdW5kZWZpbmVkKSxcbiAgICAgIClcbiAgICAgIC5tYXAoKFssIHJlbGF0aW9uXSkgPT4ge1xuICAgICAgICAvKlxuICAgICAgICBCZWxvbmdzVG9PbmXsnbgg6rK97JqwXG4gICAgICAgICAgQ2F0ZWdvcnkgLyAnaWQnIC8gcm93W2NhdGVnb3J5X2lkXSDtmLjstpxcbiAgICAgICAgT25lVG9PbmXsl5Agam9pbkNvbHVtbiA9PT0gdHJ1ZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdpZCcgLyByb3dbcHJvZmlsZV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IGZhbHNlIOyduCDqsr3smrBcbiAgICAgICAgICBQcm9maWxlIC8gJ3Byb2ZpbGVfaWQnIC8gcm93WydpZCddIO2YuOy2nFxuICAgICAgICAqL1xuICAgICAgICBsZXQgcmVsYXRpb25GaWVsZDogc3RyaW5nO1xuICAgICAgICBsZXQgcmVsYXRpb25JZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZWxhdGlvbkZpZWxkID0gYCR7cmVsYXRlZElkQ29sdW1uTmFtZX1faWRgO1xuICAgICAgICAgIHJlbGF0aW9uSWQgPSByb3cuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVsYXRpb25GaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICByZWxhdGlvbklkID0gcm93W2Ake3JlbGF0aW9uLm5hbWV9X2lkYF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbnRpdHlJZDogcmVsYXRpb24ud2l0aCxcbiAgICAgICAgICBmaWVsZDogcmVsYXRpb25GaWVsZCxcbiAgICAgICAgICBpZDogcmVsYXRpb25JZCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChhcmcpID0+IGFyZy5pZCAhPT0gbnVsbCk7XG5cbiAgICBjb25zdCByZWxRdWVyaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBhcmdzLm1hcChhc3luYyAocmVsYXRpb25BcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEltcG9ydFF1ZXJpZXMocmVsYXRpb25BcmdzLmVudGl0eUlkLCByZWxhdGlvbkFyZ3MuZmllbGQsIHJlbGF0aW9uQXJncy5pZCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIFsuLi51bmlxdWUocmVsUXVlcmllcy50b1JldmVyc2VkKCkuZmxhdCgpKSwgc2VsZlF1ZXJ5XTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGVzdGluZ0RiKSB7XG4gICAgICBhd2FpdCB0aGlzLnRlc3RpbmdEYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnRlc3RpbmdEYiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmZpeHR1cmVEYikge1xuICAgICAgYXdhaXQgdGhpcy5maXh0dXJlRGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5maXh0dXJlRGIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rml4dHVyZXMoXG4gICAgc291cmNlREJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICB0YXJnZXREQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHNlYXJjaE9wdGlvbnM6IEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICAgIGR1cGxpY2F0ZUNoZWNrPzogRHVwbGljYXRlQ2hlY2tPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VEQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbc291cmNlREJOYW1lXSk7XG4gICAgY29uc3QgdGFyZ2V0REIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW3RhcmdldERCTmFtZV0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGZpZWxkLCB2YWx1ZSwgc2VhcmNoVHlwZSB9ID0gc2VhcmNoT3B0aW9ucztcblxuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgZW50aXR5LnByb3BzLmZpbmQoKHByb3ApID0+IHByb3AubmFtZSA9PT0gZmllbGQpPy50eXBlID09PSBcInJlbGF0aW9uXCJcbiAgICAgICAgICA/IGAke2ZpZWxkfV9pZGBcbiAgICAgICAgICA6IGZpZWxkO1xuXG4gICAgICBsZXQgcXVlcnkgPSBzb3VyY2VEQihlbnRpdHkudGFibGUpO1xuICAgICAgaWYgKHNlYXJjaFR5cGUgPT09IFwiZXF1YWxzXCIpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VhcmNoVHlwZSA9PT0gXCJsaWtlXCIpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIFwibGlrZVwiLCBgJSR7dmFsdWV9JWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnk7XG4gICAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjb3JkcyBmb3VuZFwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCBpbml0aWFsUmVjb3Jkc0xlbmd0aCA9IGZpeHR1cmVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbmV3UmVjb3JkcyA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIHJvdywge1xuICAgICAgICAgIGRiOiBzb3VyY2VEQixcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiBkdXBsaWNhdGVDaGVjaz8uaW5jbHVkZVJlbGF0aW9ucyxcbiAgICAgICAgICBtYXhEZXB0aDogZHVwbGljYXRlQ2hlY2s/Lm1heERlcHRoLFxuICAgICAgICB9KTtcbiAgICAgICAgZml4dHVyZXMucHVzaCguLi5uZXdSZWNvcmRzKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpeHR1cmVSZWNvcmQgPSBmaXh0dXJlcy5maW5kKChyKSA9PiByLmZpeHR1cmVJZCA9PT0gYCR7ZW50aXR5SWR9IyR7cm93LmlkfWApO1xuXG4gICAgICAgIGlmIChjdXJyZW50Rml4dHVyZVJlY29yZCkge1xuICAgICAgICAgIC8vIO2YhOyerCBmaXh0dXJl66Gc67aA7YSwIOyDneyEseuQnCBmZXRjaGVkUmVjb3JkcyDshKTsoJVcbiAgICAgICAgICBjdXJyZW50Rml4dHVyZVJlY29yZC5mZXRjaGVkUmVjb3JkcyA9IGZpeHR1cmVzXG4gICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmZpeHR1cmVJZCAhPT0gY3VycmVudEZpeHR1cmVSZWNvcmQuZml4dHVyZUlkKVxuICAgICAgICAgICAgLnNsaWNlKGluaXRpYWxSZWNvcmRzTGVuZ3RoKVxuICAgICAgICAgICAgLm1hcCgocikgPT4gci5maXh0dXJlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBjb25zdCBmaXh0dXJlRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgICAgaWYgKGN1c3RvbUNvbHVtbnMgJiYgY3VzdG9tQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgICAgZml4dHVyZUVudGl0eSxcbiAgICAgICAgICAgIGZpeHR1cmUsXG4gICAgICAgICAgICBjdXN0b21Db2x1bW5zLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGN1c3RvbUR1cGxpY2F0ZVJvdykge1xuICAgICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZml4dHVyZUVudGl0eSwgY3VzdG9tRHVwbGljYXRlUm93LCB7XG4gICAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZGI6IHRhcmdldERCLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmaXh0dXJlLnRhcmdldCA9IHJlY29yZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVbmlxdWUgaW5kZXgg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIGZpeHR1cmUudW5pcXVlXG4gICAgICAgIGNvbnN0IHVuaXF1ZVJvdyA9IGF3YWl0IHRoaXMuY2hlY2tVbmlxdWVWaW9sYXRpb24odGFyZ2V0REIsIGZpeHR1cmVFbnRpdHksIGZpeHR1cmUpO1xuICAgICAgICBpZiAodW5pcXVlUm93KSB7XG4gICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZml4dHVyZUVudGl0eSwgdW5pcXVlUm93LCB7XG4gICAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgICBkYjogdGFyZ2V0REIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZml4dHVyZS51bmlxdWUgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVuaXF1ZShmaXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFt0YXJnZXREQi5kZXN0cm95KCksIHNvdXJjZURCLmRlc3Ryb3koKV0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgcm9vdEVudGl0eTogRW50aXR5LFxuICAgIHJvb3RSb3c6IEZpeHR1cmVTb3VyY2VSZWNvcmQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBkYj86IEtuZXg7XG4gICAgICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoZW50aXR5OiBFbnRpdHksIHJvdzogRml4dHVyZVNvdXJjZVJlY29yZCwgZGVwdGg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZml4dHVyZUlkID0gYCR7ZW50aXR5LmlkfSMke3Jvdy5pZH1gO1xuICAgICAgaWYgKHZpc2l0ZWRFbnRpdGllcy5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aXNpdGVkRW50aXRpZXMuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IHJlY29yZDogRml4dHVyZVJlY29yZCA9IHtcbiAgICAgICAgZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICBjb2x1bW5zOiB7fSxcbiAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICBiZWxvbmdzUmVjb3JkczogW10sXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTQUZFVFk6IEZpeHR1cmVSZWNvcmTsnZgg66CI6rGw7IucIOqwkiDtg4DsnoXrs7Tri6Qg7Iuk7KCcIERCL0pTT04gZml4dHVyZSDqsJIg6rOE7JW97J20IOuEk+yKteuLiOuLpC5cbiAgICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSByb3dbcHJvcC5uYW1lXSBhcyBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXVtzdHJpbmddW1widmFsdWVcIl07XG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogY29sdW1uVmFsdWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5kYiA/PyBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgdGhyb3VnaFRhYmxlID0gcHJvcC5qb2luVGFibGU7XG4gICAgICAgICAgY29uc3QgZnJvbUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRvQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGF3YWl0IGRiKHRocm91Z2hUYWJsZSkud2hlcmUoZnJvbUNvbHVtbiwgcm93LmlkKS5wbHVjayh0b0NvbHVtbik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpXG4gICAgICAgICAgICAud2hlcmUocHJvcC5qb2luQ29sdW1uLCByb3cuaWQpXG4gICAgICAgICAgICAucGx1Y2soXCJpZFwiKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmICFwcm9wLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAvLyDsl63rsKntlqUgT25lVG9PbmU6IEZL66W8IOqwgOynhCDqtIDroKgg7JeU7Yuw7Yuw66W8IOywvuyKteuLiOuLpFxuICAgICAgICAgIC8vIOyYiOyLnDogVXNlciBPbmVUb09uZSBFbXBsb3llZSAoRW1wbG95ZWXqsIAgdXNlcl9pZCBGS+ulvCDqsIDsp5ApXG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3AgJiYgaXNSZWxhdGlvblByb3AocmVsYXRlZFByb3ApKSB7XG4gICAgICAgICAgICAvLyDqtIDroKgg7JeU7Yuw7Yuw7JeQ7IScIEZLIOy7rOufvOycvOuhnCDsv7zrpqztlanri4jri6QgKGlk6rCAIOyVhOuLmClcbiAgICAgICAgICAgIGNvbnN0IGZrQ29sdW1uID0gYCR7cmVsYXRlZFByb3AubmFtZX1faWRgO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKGZrQ29sdW1uLCByb3cuaWQpLmZpcnN0KCk7XG4gICAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZFJvdz8uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gcmVsYXRpb25JZFNjaGVtYS5wYXJzZShyb3dbYCR7cHJvcC5uYW1lfV9pZGBdKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWxvbmdzUmVjb3Jkcy5wdXNoKGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiZcbiAgICAgICAgICAgIG9wdGlvbnM/LmluY2x1ZGVSZWxhdGlvbnMgIT09IGZhbHNlICYmXG4gICAgICAgICAgICBkZXB0aCA8IChvcHRpb25zPy5tYXhEZXB0aCA/PyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpICYmXG4gICAgICAgICAgICByZWxhdGVkSWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJvdyA9IGF3YWl0IGRiKHJlbGF0ZWRFbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgcmVsYXRlZElkKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY3JlYXRlKFxuICAgICAgICAgICAgICAgIHJlbGF0ZWRFbnRpdHksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4uZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hLnBhcnNlKHJlbGF0ZWRSb3cpLFxuICAgICAgICAgICAgICAgICAgaWQ6IHoudW5pb24oW3oubnVtYmVyKCksIHouc3RyaW5nKCldKS5wYXJzZShyZWxhdGVkUm93LmlkKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlcHRoICsgMSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShyb290RW50aXR5LCByb290Um93LCAwKTtcblxuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrAgKHNlbGYtcmVmZXJlbmNlIO2PrO2VqClcbiAgICogMi4g7YWM7J2067iU67OEIOugiOuyqOuzhOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSDrsI8gdXBzZXJ0IOyLpO2WiVxuICAgKiAzLiDsiJzshJwg6riw67CYIHV1aWTihpJpZCDrp6TtlZEgKFVwc2VydEJ1aWxkZXLqsIAgdXVpZOulvCBEQuyXkCDsoIDsnqXtlZjsp4Ag7JWK7Jy866+A66GcKVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy64qUIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWY7JesIOqwgSB1cHNlcnQg7Zi47Lac7JeQ7ISc64qUXG4gICAqIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuPhOuhnSDtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBpbnNlcnRGaXh0dXJlcyhcbiAgICBkYk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIF9maXh0dXJlczogRml4dHVyZVJlY29yZFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGZpeHR1cmVzID0gdW5pcXVlKF9maXh0dXJlcywgKGYpID0+IGYuZml4dHVyZUlkKTtcblxuICAgIC8vIOy0iOq4sO2ZlFxuICAgIHRoaXMuYnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzID0gbmV3IE1hcCgpO1xuXG4gICAgLy8g67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsl5DshJzripQgd29ya2Vy67OEIERC7JeQIOyggOyepVxuICAgIGNvbnN0IGRiQ29uZmlnID1cbiAgICAgIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiICYmIHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEXG4gICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VDb25maWcgPSBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBkYXRhYmFzZUNvbm5lY3Rpb25TY2hlbWEucGFyc2UoYmFzZUNvbmZpZy5jb25uZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmJhc2VDb25maWcsXG4gICAgICAgICAgICAgIGNvbm5lY3Rpb246IHsgLi4uY29ubmVjdGlvbiwgZGF0YWJhc2U6IGAke2Nvbm5lY3Rpb24uZGF0YWJhc2V9XyR7d29ya2VySWR9YCB9LFxuICAgICAgICAgICAgICBwb29sOiB7IG1pbjogMSwgbWF4OiAxIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKClcbiAgICAgICAgOiBTb25hbXUuZGJDb25maWdbZGJOYW1lXTtcbiAgICBjb25zdCBkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShkYkNvbmZpZyk7XG4gICAgY29uc3QgcmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsFxuICAgICAgdGhpcy5yZWxhdGlvbkdyYXBoLmJ1aWxkR3JhcGgoZml4dHVyZXMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uT3JkZXIgPSB0aGlzLnJlbGF0aW9uR3JhcGguZ2V0SW5zZXJ0aW9uT3JkZXIoKTtcblxuICAgICAgLy8gMi4g7Iqk7YK17ZWgIGZpeHR1cmUg66i87KCAIOyymOumrCAob3ZlcnJpZGUg7LK07YGsKVxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGhhc1RhcmdldCA9ICEhZml4dHVyZS50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGhhc1VuaXF1ZSA9ICEhZml4dHVyZS51bmlxdWU7XG4gICAgICAgIGNvbnN0IGhhc0R1cGxpY2F0ZSA9IGhhc1RhcmdldCB8fCBoYXNVbmlxdWU7XG5cbiAgICAgICAgLy8g7KSR67O17J20IOyeiOqzoCBvdmVycmlkZT1mYWxzZeyduCDqsr3smrA6IOyKpO2CtVxuICAgICAgICBpZiAoaGFzRHVwbGljYXRlICYmICFmaXh0dXJlLm92ZXJyaWRlKSB7XG4gICAgICAgICAgLy8g6riw7KG0IOugiOy9lOuTnCBJRCDsoIDsnqUgKHVuaXF1ZSDsmrDshKAsIOyXhuycvOuptCB0YXJnZXQpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGZpeHR1cmUudW5pcXVlPy5pZCA/PyBmaXh0dXJlLnRhcmdldD8uaWQ7XG4gICAgICAgICAgYXNzZXJ0KGV4aXN0aW5nSWQpO1xuICAgICAgICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzLnNldChmaXh0dXJlSWQsIHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgZXhpc3RpbmdJZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICBgU2tpcHBlZCAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH0gKGV4aXN0aW5nOiAjJHtleGlzdGluZ0lkfSwgb3ZlcnJpZGU6IGZhbHNlKWAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIO2FjOydtOu4lOuzhCBmaXh0dXJlIOq3uOujue2ZlCAoaW5zZXJ0aW9uT3JkZXIg7Iic7IScIOq4sOuwmClcbiAgICAgIGNvbnN0IGZpeHR1cmVzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBGaXh0dXJlUmVjb3JkW10+KCk7XG4gICAgICBjb25zdCB0YWJsZU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICAvLyDsiqTtgrXrkJwgZml4dHVyZSDsoJzsmbhcbiAgICAgICAgaWYgKHRoaXMuc2tpcHBlZEZpeHR1cmVzLmhhcyhmaXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGVudGl0eS50YWJsZTtcblxuICAgICAgICBpZiAoIWZpeHR1cmVzQnlUYWJsZS5oYXModGFibGVOYW1lKSkge1xuICAgICAgICAgIGZpeHR1cmVzQnlUYWJsZS5zZXQodGFibGVOYW1lLCBbXSk7XG4gICAgICAgICAgdGFibGVPcmRlci5wdXNoKHRhYmxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgZml4dHVyZXNCeVRhYmxlLmdldCh0YWJsZU5hbWUpPy5wdXNoKGZpeHR1cmUpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydGVkSWRzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PigpO1xuXG4gICAgICAgIC8vIDQuIO2FjOydtOu4lOuzhCDroIjrsqjrs4Qg7LKY66asXG4gICAgICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlT3JkZXIpIHtcbiAgICAgICAgICBjb25zdCB0YWJsZUZpeHR1cmVzID0gZml4dHVyZXNCeVRhYmxlLmdldCh0YWJsZU5hbWUpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IGxldmVscyA9IHRoaXMuZ3JvdXBGaXh0dXJlc0J5TGV2ZWwodGFibGVGaXh0dXJlcyk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGxldmVsRml4dHVyZXMgb2YgbGV2ZWxzKSB7XG4gICAgICAgICAgICAvLyDtlbTri7kg66CI67Ko7J2YIGZpeHR1cmXrk6QgcmVnaXN0ZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBsZXZlbEZpeHR1cmVzKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmUsIGluc2VydGVkSWRzQnlUYWJsZSk7XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUpYCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBzZXJ0IOyLpO2WiSDsoIQgdXVpZCDrqqnroZ0g7KCA7J6lXG4gICAgICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuYnVpbGRlci5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuICAgICAgICAgICAgY29uc3QgdXVpZHMgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiB6LnN0cmluZygpLnBhcnNlKHJvdy51dWlkKSk7XG5cbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgICAgICAgYFVwc2VydGluZyAke3RhYmxlTmFtZX0gd2l0aCAke3V1aWRzLmxlbmd0aH0gcm93cyAobGV2ZWwgJHtsZXZlbHMuaW5kZXhPZihsZXZlbEZpeHR1cmVzKSArIDF9LyR7bGV2ZWxzLmxlbmd0aH0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gU0FGRVRZOiB0YWJsZU5hbWXsnYAg65Ox66Gd65CcIEVudGl0eeydmCDsi6TsoJwg7YWM7J2067iU66qF7JeQ7ISc66eMIOyDneyEseuQqeuLiOuLpC5cbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYVRhYmxlTmFtZSA9IHRhYmxlTmFtZSBhcyBrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZDtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IGZpeHR1cmVSZWNvcmRJZHNTY2hlbWEucGFyc2UoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRlci51cHNlcnQodHJ4LCBzY2hlbWFUYWJsZU5hbWUpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8g7Iic7IScIOq4sOuwmCB1dWlkIC0+IGlkIOunpO2VkVxuICAgICAgICAgICAgLy8gc2VsZi1yZWZlcmVuY2XqsIAg7JeG7Jy866+A66GcIOuTseuhnSDsiJzshJwgPSDrsJjtmZgg7Iic7IScIOuztOyepVxuICAgICAgICAgICAgaWYgKHV1aWRzLmxlbmd0aCA+IDAgJiYgdXVpZHMubGVuZ3RoID09PSBpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTWFwID1cbiAgICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KHRhYmxlTmFtZSkgPz8gbmV3IE1hcDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1dWlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nTWFwLnNldCh1dWlkc1tpXSwgaWRzW2ldKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgZXhpc3RpbmdNYXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh1dWlkcy5sZW5ndGggIT09IGlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgIGBXYXJuaW5nOiB1dWlkIGNvdW50ICgke3V1aWRzLmxlbmd0aH0pICE9IGlkIGNvdW50ICgke2lkcy5sZW5ndGh9KSBmb3IgJHt0YWJsZU5hbWV9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIE1hbnlUb01hbnkg6rSA6rOEIOyymOumrFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKHRyeCwgZml4dHVyZXMsIGluc2VydGVkSWRzQnlUYWJsZSk7XG5cbiAgICAgICAgLy8gNi4gUG9zdGdyZVNRTCDsi5ztgIDsiqQg66as7IWLXG4gICAgICAgIC8vIEZpeHR1cmUg7IK97J6FIO2bhCDqsIEg7YWM7J2067iU7J2YIElEIOyLnO2AgOyKpOulvCDstZzrjIAgSUQg6rCS7Jy866GcIOyXheuNsOydtO2KuO2VqeuLiOuLpC5cbiAgICAgICAgLy8g7J2066CH6rKMIO2VmOyngCDslYrsnLzrqbQg64uk7J2MIElOU0VSVCDsi5wgSUTqsIAgMjAwMOuyiOuMgOuhnCDsg53shLHrkKAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJSZXNldHRpbmcgc2VxdWVuY2VzLi4uXCIpKTtcbiAgICAgICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVPcmRlcikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBFbnRpdHnrpbwg7LC+7JWE7IScIGlkIO2DgOyehSDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKS5maW5kKFxuICAgICAgICAgICAgICAoZSkgPT4gZS50YWJsZSA9PT0gdGFibGVOYW1lIHx8IGUuaWQudG9Mb3dlckNhc2UoKSA9PT0gdGFibGVOYW1lLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgICAgICBjb25zdCBpZFByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICAgICAgICAgICAgICBjb25zdCBpZFR5cGUgPSBpZFByb3A/LnR5cGU7XG5cbiAgICAgICAgICAgICAgLy8gaW50ZWdlci9iaWdJbnRlZ2Vy7J206rGw64KYLCBzdHJpbmfsnbTsp4Drp4wgZml4dHVyZVN0cmF0ZWd5PXNlcXVlbmNl7J24IOqyveyasOyXkOunjCDrpqzshYvtlanri4jri6RcbiAgICAgICAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICAgICAgICBpZFR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgICAgICAgaWRUeXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgICAgICAgIGlkUHJvcD8uY29uZT8uZml4dHVyZVN0cmF0ZWd5ID09PSBcInNlcXVlbmNlXCI7XG5cbiAgICAgICAgICAgICAgaWYgKCF1c2VzU2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICAgICAgICAgIGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX0gKGlkIHR5cGU6ICR7aWRUeXBlIHx8IFwidW5rbm93blwifSlgLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDthYzsnbTruJTsnZgg7LWc64yAIElEIOyhsO2ajCAoc3RyaW5nIO2DgOyeheydgCDsiKvsnpAg7LqQ7Iqk7YyFIO2VhOyalClcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eTIgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbEVudGl0aWVzKCkuZmluZChcbiAgICAgICAgICAgICAgKGUpID0+IGUudGFibGUgPT09IHRhYmxlTmFtZSB8fCBlLmlkLnRvTG93ZXJDYXNlKCkgPT09IHRhYmxlTmFtZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpZFR5cGUyID0gZW50aXR5Mj8ucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpPy50eXBlO1xuICAgICAgICAgICAgY29uc3QgbWF4SWRSZXN1bHQgPVxuICAgICAgICAgICAgICBpZFR5cGUyID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgPyBhd2FpdCB0cnhcbiAgICAgICAgICAgICAgICAgICAgLnJhdyhgU0VMRUNUIE1BWChpZDo6YmlnaW50KSBhcyBtYXhfaWQgRlJPTSBcIiR7dGFibGVOYW1lfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHIpID0+IHIucm93c1swXSlcbiAgICAgICAgICAgICAgICA6IGF3YWl0IHRyeCh0YWJsZU5hbWUpLm1heChcImlkIGFzIG1heF9pZFwiKS5maXJzdCgpO1xuICAgICAgICAgICAgY29uc3QgbWF4SWQgPSBtYXhJZFJlc3VsdD8ubWF4X2lkO1xuXG4gICAgICAgICAgICBpZiAobWF4SWQgIT09IG51bGwgJiYgbWF4SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyDsi5ztgIDsiqTrqoXsnYQgcGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZeuhnCDslYjsoITtlZjqsowg7KGw7ZqMXG4gICAgICAgICAgICAgIGF3YWl0IHRyeC5yYXcoYFNFTEVDVCBzZXR2YWwocGdfZ2V0X3NlcmlhbF9zZXF1ZW5jZSg/LCAnaWQnKSwgPylgLCBbXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIG1heElkLFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBSZXNldCBzZXF1ZW5jZSBmb3IgJHt0YWJsZU5hbWV9OiAke21heElkfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIOyLnO2AgOyKpOqwgCDsl4bripQg7YWM7J2067iUKGpvaW4gdGFibGUg65OxKeydgCDrrLTsi5xcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBTa2lwcGVkIHNlcXVlbmNlIHJlc2V0IGZvciAke3RhYmxlTmFtZX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNy4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuaXF1ZShyZXN1bHRzLCAocikgPT4gYCR7ci5lbnRpdHlJZH0jJHtyLmRhdGEuaWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZVJlY29yZOulvCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnVxuICAgKiBAcGFyYW0gaW5zZXJ0ZWRJZHNCeVRhYmxlIOydtOuvuCB1cHNlcnTrkJwg7YWM7J2067iU7J2YIHV1aWTihpJpZCDrp6TtlZEgKOugiOuyqOuzhCDsspjrpqwg7IucIOyCrOyaqSlcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKFxuICAgIGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQsXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPj4sXG4gICk6IFVCUmVmIHtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICBjb25zdCByb3c6IFVwc2VydFJvdyA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZWQgY29sdW1u7J2AIElOU0VSVOyXkOyEnCDsoJzsmbggKERC6rCAIOyekOuPmSDsg53shLEpXG4gICAgICBpZiAoXCJnZW5lcmF0ZWRcIiBpbiBwcm9wICYmIHByb3AuZ2VuZXJhdGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZCDsspjrpqxcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICAgIC8vIHBhcmVudElkIOyXlO2LsO2LsOydmCBpZOuKlCDrtoDrqqgg7JeU7Yuw7Yuw7J2YIEZL7J2066+A66GcIOyLnO2AgOyKpCDrr7jsgqzsmqkgKOuqheyLnOyggeycvOuhnCDtj6ztlagpXG4gICAgICAgIGNvbnN0IHVzZXNTZXF1ZW5jZSA9XG4gICAgICAgICAgIWVudGl0eS5wYXJlbnRJZCAmJlxuICAgICAgICAgIChpZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgICBpZFByb3A/LnR5cGUgPT09IFwiYmlnSW50ZWdlclwiIHx8XG4gICAgICAgICAgICBpZFByb3A/LmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKTtcblxuICAgICAgICBpZiAoaXNPdmVycmlkZU1vZGUgJiYgZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgICAvLyBPdmVycmlkZTog6riw7KG0IOugiOy9lOuTnOydmCDqsJIg7IKs7JqpIOKGkiBVUERBVEVcbiAgICAgICAgICByb3dbcHJvcE5hbWVdID0gZXhpc3RpbmdSZWNvcmQuY29sdW1uc1twcm9wTmFtZV0/LnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKCF1c2VzU2VxdWVuY2UpIHtcbiAgICAgICAgICAvLyBzdHJpbmcgUEsg65iQ64qUIHBhcmVudElkIOyXlO2LsO2LsCBGSzog7IOd7ISx65CcIGlkIOqwkuydhCBJTlNFUlTsl5Ag7Y+s7ZWoXG4gICAgICAgICAgcm93W3Byb3BOYW1lXSA9IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEs6IERCIOyLnO2AgOyKpOyXkCDrp6HquYAgKOqwkiDsoJzsmbgpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByZWxhdGlvbklkU2NoZW1hLnBhcnNlKGNvbHVtbi52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7ggdXBzZXJ065CcIOqwmeydgCDthYzsnbTruJQgZml4dHVyZSDtmZXsnbhcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkSW5zZXJ0ZWRJZHMgPSBpbnNlcnRlZElkc0J5VGFibGU/LmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxJZCA9IHJlbGF0ZWRJbnNlcnRlZElkcz8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0dWFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgLy8g7J2066+4IHVwc2VydOuQqCDihpIg7Iuk7KCcIElEIOyCrOyaqVxuICAgICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gYWN0dWFsSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIOyVhOyngSB1cHNlcnQg7JWI65CoIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCwgY29sdW1uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICB2YWx1ZTogRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdLFxuICApOiBEYXRhRXhwbG9yZXJWYWx1ZSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAvLyBVcHNlcnRCdWlsZGVyLnJlZ2lzdGVy7JeQ7IScIEpTT04uc3RyaW5naWZ5IOyymOumrO2VmOuvgOuhnCBvYmplY3Qg6re464yA66GcIOyghOuLrFxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBkYXRlU291cmNlID0gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLnNhZmVQYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKGRhdGVTb3VyY2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVTb3VyY2UuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKCF0aGlzLmJ1aWxkZXIuaGFzVGFibGUodGFyZ2V0VGFibGUudGFibGUpKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBmaXh0dXJlUmVjb3JkSWRzU2NoZW1hLnBhcnNlKGNvbHVtbi52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlciB8IHN0cmluZztcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOqwmeydgCDthYzsnbTruJQg64K0IGZpeHR1cmXrk6TsnYQgc2VsZi1yZWZlcmVuY2Ug66CI67Ko67OE66GcIOu2hO2VoFxuICAgKiAtIHNlbGYtcmVmZXJlbmNl6rCAIOyXhuuKlCBmaXh0dXJl65OkOiBMZXZlbCAwXG4gICAqIC0gTGV2ZWwgMOydhCDssLjsobDtlZjripQgZml4dHVyZeuTpDogTGV2ZWwgMVxuICAgKiAtIOuwmOuztVxuICAgKlxuICAgKiBVcHNlcnRCdWlsZGVy6rCAIHNlbGYtcmVmZXJlbmNl6rCAIOyeiOycvOuptCBidWlsZEluc2VydExldmVscygp66GcIOyerOygleugrO2VmOyXrFxuICAgKiDrk7HroZ0g7Iic7ISc7JmAIOuwmO2ZmCDsiJzshJzqsIAg64us65287KeIIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOulvCDrsKnsp4DtlZjquLAg7JyE7ZW0IEZpeHR1cmVNYW5hZ2Vy6rCAIOugiOuyqOuzhOuhnCDrgpjriKDshJwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBncm91cEZpeHR1cmVzQnlMZXZlbChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogRml4dHVyZVJlY29yZFtdW10ge1xuICAgIGlmIChmaXh0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlc1swXS5lbnRpdHlJZCk7XG5cbiAgICAvLyBzZWxmLXJlZmVyZW5jZSByZWxhdGlvbiBwcm9wIOywvuq4sFxuICAgIGNvbnN0IHNlbGZSZWZQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocCk6IHAgaXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIHwgT25lVG9PbmVSZWxhdGlvblByb3AgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICk7XG5cbiAgICBpZiAoc2VsZlJlZlByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc2VsZi1yZWZlcmVuY2Ug7JeG7J2MIOKGkiDri6jsnbwg66CI67KoXG4gICAgICByZXR1cm4gW2ZpeHR1cmVzXTtcbiAgICB9XG5cbiAgICAvLyDroIjrsqjrs4Qg67aE7ZWgICh0b3BvbG9naWNhbCBzb3J0KVxuICAgIGNvbnN0IGxldmVsczogRml4dHVyZVJlY29yZFtdW10gPSBbXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KGZpeHR1cmVzLm1hcCgoZikgPT4gZi5maXh0dXJlSWQpKTtcbiAgICBjb25zdCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICBpZiAoIXJlbWFpbmluZy5oYXMoZml4dHVyZS5maXh0dXJlSWQpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzZWxmLXJlZmVyZW5jZeqwgCDrqqjrkZAg7J2066+4IOyymOumrOuQkOqxsOuCmCBudWxs7J24IOqyveyasFxuICAgICAgICBjb25zdCBjYW5Qcm9jZXNzID0gc2VsZlJlZlByb3BzLmV2ZXJ5KChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmSWQgPSByZWxhdGlvbklkU2NoZW1hLnBhcnNlKGZpeHR1cmUuY29sdW1uc1twcm9wLm5hbWVdPy52YWx1ZSk7XG4gICAgICAgICAgaWYgKHJlZklkID09PSBudWxsIHx8IHJlZklkID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgICAgICAgIGNvbnN0IHJlZkZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWZJZH1gO1xuICAgICAgICAgIC8vIOydtOuvuCDsspjrpqzrkJDqsbDrgpgsIO2YhOyerCBmaXh0dXJlc+yXkCDtj6ztlajrkJjsp4Ag7JWK7J2AIOqyveyasCAo7Jm467aAIOywuOyhsClcbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkLmhhcyhyZWZGaXh0dXJlSWQpIHx8ICFyZW1haW5pbmcuaGFzKHJlZkZpeHR1cmVJZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjYW5Qcm9jZXNzKSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2goZml4dHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRMZXZlbC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc3QgcmVtYWluaW5nSWRzID0gQXJyYXkuZnJvbShyZW1haW5pbmcpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDaXJjdWxhciBzZWxmLXJlZmVyZW5jZSBkZXRlY3RlZCBpbiAke2VudGl0eS50YWJsZX0uIFJlbWFpbmluZyBmaXh0dXJlczogJHtyZW1haW5pbmdJZHN9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGN1cnJlbnRMZXZlbCkge1xuICAgICAgICByZW1haW5pbmcuZGVsZXRlKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgcHJvY2Vzc2VkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICB9XG5cbiAgICAgIGxldmVscy5wdXNoKGN1cnJlbnRMZXZlbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxldmVscztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tVbmlxdWVWaW9sYXRpb24oZGI6IEtuZXgsIGVudGl0eTogRW50aXR5LCBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkKSB7XG4gICAgY29uc3QgZW50aXR5VW5pcXVlSW5kZXhlcyA9IGVudGl0eS5pbmRleGVzPy5maWx0ZXIoKGkpID0+IGkudHlwZSA9PT0gXCJ1bmlxdWVcIikgPz8gW107XG5cbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gZW50aXR5VW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogRGF0YUV4cGxvcmVyUmVjb3JkID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAvLyByZWxhdGlvbiDtlYTrk5zsnbgg6rK97JqwIF9pZCDrtpnsnbTquLBcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW4pO1xuICAgICAgY29uc3QgZGJDb2x1bW4gPSBwcm9wICYmIGlzUmVsYXRpb25Qcm9wKHByb3ApID8gYCR7Y29sdW1ufV9pZGAgOiBjb2x1bW47XG4gICAgICBjb25zdCB2YWx1ZSA9IGZpeHR1cmUuY29sdW1uc1tjb2x1bW5dPy52YWx1ZTtcblxuICAgICAgLy8gbnVsbCDqsJLsnbQg7Y+s7ZWo65CcIOqyveyasCDspJHrs7Ug7ZmV7J24IOyKpO2CtVxuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHdoZXJlQ2xhdXNlW2RiQ29sdW1uXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IFtmb3VuZF0gPSBhd2FpdCBkYihlbnRpdHkudGFibGUpLndoZXJlKHdoZXJlQ2xhdXNlKS5saW1pdCgxKTtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBhc3luYyBhZGRGaXh0dXJlTG9hZGVyKGNvZGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy90ZXN0aW5nL2ZpeHR1cmUudHNgO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShwYXRoLCBcInV0ZjhcIik7XG5cbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyU3RhcnQgPSBjb250ZW50LmluZGV4T2YoXCJjb25zdCBmaXh0dXJlTG9hZGVyID0ge1wiKTtcbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyRW5kID0gY29udGVudC5pbmRleE9mKFwifTtcIiwgZml4dHVyZUxvYWRlclN0YXJ0KTtcblxuICAgIGlmIChmaXh0dXJlTG9hZGVyU3RhcnQgIT09IC0xICYmIGZpeHR1cmVMb2FkZXJFbmQgIT09IC0xKSB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7Y29udGVudC5zbGljZSgwLCBmaXh0dXJlTG9hZGVyRW5kKX0gICR7Y29kZX1cXG4ke2NvbnRlbnQuc2xpY2UoZml4dHVyZUxvYWRlckVuZCl9YDtcblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZmluZCBmaXh0dXJlTG9hZGVyIGluIGZpeHR1cmUudHNcIik7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBGaXh0dXJlTWFuYWdlciA9IG5ldyBGaXh0dXJlTWFuYWdlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErREEsU0FBUyxzQkFBc0IsT0FBcUIsWUFBbUM7Q0FDckYsT0FBTyxJQUFJLFNBQVMsU0FBUyxXQUFXO0VBQ3RDLE1BQU0sS0FBSyxTQUFTLE1BQU07RUFDMUIsTUFBTSxLQUFLLFNBQVMsTUFBTSxXQUFXO0dBQ25DLElBQUksU0FBUyxHQUFHLFFBQVE7UUFFdEIsdUJBQ0UsSUFBSSxNQUFNLEdBQUcsV0FBVyxPQUFPLFFBQVEsVUFBVSxVQUFVLGFBQWEsQ0FDMUU7RUFDSixDQUFDO0NBQ0gsQ0FBQztBQUNIO0FBRUEsU0FBUyxzQkFDUCxZQUNBLE1BQ0EsU0FDZTtDQUNmLE9BQU8sc0JBQXNCLE1BQU0sWUFBWSxNQUFNLE9BQU8sR0FBRyxVQUFVO0FBQzNFO0FBRUEsZUFBZSxvQkFDYixRQUNBLGFBQ2U7Q0FDZixNQUFNLGdCQUFnQixN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
@@ -2,7 +2,7 @@ import { DB, init_db } from "../database/db.js";
2
2
  import { init_config, loadConfig } from "../api/config.js";
3
3
  import { ParallelDBManager } from "./parallel-db-manager.js";
4
4
  import { z } from "zod";
5
- //#region src/testing/global-setup.ts
5
+ // src/testing/global-setup.ts
6
6
  init_config();
7
7
  init_db();
8
8
  const postgresConnectionSchema = z.object({ database: z.string() }).passthrough();
@@ -43,10 +43,11 @@ function createGlobalSetup() {
43
43
  ...testConnection,
44
44
  database: "postgres"
45
45
  };
46
- const manager = new ParallelDBManager(maxWorkers, {
46
+ const connectionConfig = {
47
47
  client: config.database.database ?? "pg",
48
48
  connection: adminConnection
49
- }, templateDb);
49
+ };
50
+ const manager = new ParallelDBManager(maxWorkers, connectionConfig, templateDb);
50
51
  await manager.createWorkerDatabases();
51
52
  return async function teardown() {
52
53
  await manager.dropWorkerDatabases();
@@ -67,7 +68,6 @@ function createGlobalSetup() {
67
68
  * ```
68
69
  */
69
70
  const setup = createGlobalSetup();
70
- //#endregion
71
71
  export { createGlobalSetup, setup };
72
72
 
73
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLXNldHVwLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2dsb2JhbC1zZXR1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBQYXJhbGxlbERCTWFuYWdlciB9IGZyb20gXCIuL3BhcmFsbGVsLWRiLW1hbmFnZXJcIjtcblxuY29uc3QgcG9zdGdyZXNDb25uZWN0aW9uU2NoZW1hID0gei5vYmplY3QoeyBkYXRhYmFzZTogei5zdHJpbmcoKSB9KS5wYXNzdGhyb3VnaCgpO1xuXG5mdW5jdGlvbiByZXN0b3JlUHJvY2Vzc0VudihzbmFwc2hvdDogTm9kZUpTLlByb2Nlc3NFbnYpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgaWYgKCEoa2V5IGluIHNuYXBzaG90KSkge1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52W2tleV07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc25hcHNob3QpKSB7XG4gICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogdml0ZXN0IGdsb2JhbFNldHVwIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKiBzb25hbXUuY29uZmlnLnRz7J2YIHRlc3Qg7ISk7KCV7J2EIOydveyWtOyEnCDrs5HroKwg7YWM7Iqk7Yq4IO2ZmOqyveydhCDqtazshLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHNyYy90ZXN0aW5nL2dsb2JhbC50c1xuICogZXhwb3J0IHsgc2V0dXAgfSBmcm9tIFwic29uYW11L3Rlc3RcIjtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBzcmMvdGVzdGluZy9nbG9iYWwudHNcbiAqIGltcG9ydCB7IGNyZWF0ZUdsb2JhbFNldHVwIH0gZnJvbSBcInNvbmFtdS90ZXN0XCI7XG4gKiBleHBvcnQgY29uc3Qgc2V0dXAgPSBjcmVhdGVHbG9iYWxTZXR1cCh7IHJvb3RQYXRoOiBwcm9jZXNzLmN3ZCgpIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHbG9iYWxTZXR1cCgpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgICBjb25zdCByb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICAgIGNvbnN0IGVudkJlZm9yZUNvbmZpZ0xvYWQgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhyb290UGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8g67OR66CsIO2FjOyKpO2KuOqwgCDruYTtmZzshLHtmZTrkJwg6rK97JqwIOyVhOustOqyg+uPhCDtlZjsp4Ag7JWK7J2MXG4gICAgICBpZiAoIWNvbmZpZy50ZXN0Py5wYXJhbGxlbCkge1xuICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdGVhcmRvd24oKSB7XG4gICAgICAgICAgLy8gbm8tb3BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4V29ya2VycyA9IGNvbmZpZy50ZXN0Lm1heFdvcmtlcnMgPz8gNDtcbiAgICAgIGNvbnN0IGRiQ29uZmlnID0gREIuZ2VuZXJhdGVEQkNvbmZpZyhjb25maWcuZGF0YWJhc2UsIGNvbmZpZy5wcm9qZWN0TmFtZSk7XG4gICAgICBjb25zdCB0ZXN0Q29ubmVjdGlvbiA9IHBvc3RncmVzQ29ubmVjdGlvblNjaGVtYS5wYXJzZShkYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24pO1xuICAgICAgY29uc3QgdGVtcGxhdGVEYiA9IHRlc3RDb25uZWN0aW9uLmRhdGFiYXNlO1xuXG4gICAgICBjb25zdCBhZG1pbkNvbm5lY3Rpb24gPSB7XG4gICAgICAgIC4uLnRlc3RDb25uZWN0aW9uLFxuICAgICAgICBkYXRhYmFzZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29ubmVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgY2xpZW50OiBjb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gKFwicGdcIiBhcyBjb25zdCksXG4gICAgICAgIGNvbm5lY3Rpb246IGFkbWluQ29ubmVjdGlvbixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgUGFyYWxsZWxEQk1hbmFnZXIobWF4V29ya2VycywgY29ubmVjdGlvbkNvbmZpZywgdGVtcGxhdGVEYik7XG4gICAgICBhd2FpdCBtYW5hZ2VyLmNyZWF0ZVdvcmtlckRhdGFiYXNlcygpO1xuXG4gICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdGVhcmRvd24oKSB7XG4gICAgICAgIGF3YWl0IG1hbmFnZXIuZHJvcFdvcmtlckRhdGFiYXNlcygpO1xuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVzdG9yZVByb2Nlc3NFbnYoZW52QmVmb3JlQ29uZmlnTG9hZCk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIOq4sOuzuCBnbG9iYWxTZXR1cCDtlajsiJjsnoXri4jri6QuXG4gKiBzb25hbXUuY29uZmlnLnRz7J2YIHRlc3Qg7ISk7KCV7J2EIOydveyWtOyEnCDrs5HroKwg7YWM7Iqk7Yq4IO2ZmOqyveydhCDqtazshLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHNyYy90ZXN0aW5nL2dsb2JhbC50c1xuICogZXhwb3J0IHsgc2V0dXAgfSBmcm9tIFwic29uYW11L3Rlc3RcIjtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2V0dXAgPSBjcmVhdGVHbG9iYWxTZXR1cCgpO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztZQUUwQztRQUNQO0FBR25DLE1BQU0sMkJBQTJCLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWTtBQUVoRixTQUFTLGtCQUFrQixVQUFtQztDQUM1RCxLQUFLLE1BQU0sT0FBTyxPQUFPLEtBQUssUUFBUSxHQUFHLEdBQ3ZDLElBQUksRUFBRSxPQUFPLFdBQ1gsT0FBTyxRQUFRLElBQUk7Q0FJdkIsS0FBSyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sUUFBUSxRQUFRLEdBQ2hELFFBQVEsSUFBSSxPQUFPO0FBRXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsU0FBZ0Isb0JBQW9CO0NBQ2xDLE9BQU8sZUFBZSxRQUFRO0VBQzVCLE1BQU0sRUFBRSxvQkFBb0IsTUFBTSxPQUFPO0VBQ3pDLE1BQU0sV0FBVyxnQkFBZ0I7RUFDakMsTUFBTSxzQkFBc0IsRUFBRSxHQUFHLFFBQVEsSUFBSTtFQUM3QyxNQUFNLFNBQVMsTUFBTSxXQUFXLFFBQVE7RUFFeEMsSUFBSTtHQUVGLElBQUksQ0FBQyxPQUFPLE1BQU0sVUFDaEIsT0FBTyxlQUFlLFdBQVcsQ0FFakM7R0FHRixNQUFNLGFBQWEsT0FBTyxLQUFLLGNBQWM7R0FDN0MsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLE9BQU8sVUFBVSxPQUFPLFdBQVc7R0FDeEUsTUFBTSxpQkFBaUIseUJBQXlCLE1BQU0sU0FBUyxLQUFLLFVBQVU7R0FDOUUsTUFBTSxhQUFhLGVBQWU7R0FFbEMsTUFBTSxrQkFBa0I7SUFDdEIsR0FBRztJQUNILFVBQVU7R0FDWjtHQU9BLE1BQU0sVUFBVSxJQUFJLGtCQUFrQixZQUFZO0lBSmhELFFBQVEsT0FBTyxTQUFTLFlBQWE7SUFDckMsWUFBWTtHQUdvQyxHQUFrQixVQUFVO0dBQzlFLE1BQU0sUUFBUSxzQkFBc0I7R0FFcEMsT0FBTyxlQUFlLFdBQVc7SUFDL0IsTUFBTSxRQUFRLG9CQUFvQjtHQUNwQztFQUNGLFVBQVU7R0FDUixrQkFBa0IsbUJBQW1CO0VBQ3ZDO0NBQ0Y7QUFDRjs7Ozs7Ozs7Ozs7QUFZQSxNQUFhLFFBQVEsa0JBQWtCIn0=
73
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLXNldHVwLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2dsb2JhbC1zZXR1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBQYXJhbGxlbERCTWFuYWdlciB9IGZyb20gXCIuL3BhcmFsbGVsLWRiLW1hbmFnZXJcIjtcblxuY29uc3QgcG9zdGdyZXNDb25uZWN0aW9uU2NoZW1hID0gei5vYmplY3QoeyBkYXRhYmFzZTogei5zdHJpbmcoKSB9KS5wYXNzdGhyb3VnaCgpO1xuXG5mdW5jdGlvbiByZXN0b3JlUHJvY2Vzc0VudihzbmFwc2hvdDogTm9kZUpTLlByb2Nlc3NFbnYpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgaWYgKCEoa2V5IGluIHNuYXBzaG90KSkge1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52W2tleV07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc25hcHNob3QpKSB7XG4gICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogdml0ZXN0IGdsb2JhbFNldHVwIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKiBzb25hbXUuY29uZmlnLnRz7J2YIHRlc3Qg7ISk7KCV7J2EIOydveyWtOyEnCDrs5HroKwg7YWM7Iqk7Yq4IO2ZmOqyveydhCDqtazshLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHNyYy90ZXN0aW5nL2dsb2JhbC50c1xuICogZXhwb3J0IHsgc2V0dXAgfSBmcm9tIFwic29uYW11L3Rlc3RcIjtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBzcmMvdGVzdGluZy9nbG9iYWwudHNcbiAqIGltcG9ydCB7IGNyZWF0ZUdsb2JhbFNldHVwIH0gZnJvbSBcInNvbmFtdS90ZXN0XCI7XG4gKiBleHBvcnQgY29uc3Qgc2V0dXAgPSBjcmVhdGVHbG9iYWxTZXR1cCh7IHJvb3RQYXRoOiBwcm9jZXNzLmN3ZCgpIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHbG9iYWxTZXR1cCgpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHNldHVwKCkge1xuICAgIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgICBjb25zdCByb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICAgIGNvbnN0IGVudkJlZm9yZUNvbmZpZ0xvYWQgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhyb290UGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8g67OR66CsIO2FjOyKpO2KuOqwgCDruYTtmZzshLHtmZTrkJwg6rK97JqwIOyVhOustOqyg+uPhCDtlZjsp4Ag7JWK7J2MXG4gICAgICBpZiAoIWNvbmZpZy50ZXN0Py5wYXJhbGxlbCkge1xuICAgICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdGVhcmRvd24oKSB7XG4gICAgICAgICAgLy8gbm8tb3BcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF4V29ya2VycyA9IGNvbmZpZy50ZXN0Lm1heFdvcmtlcnMgPz8gNDtcbiAgICAgIGNvbnN0IGRiQ29uZmlnID0gREIuZ2VuZXJhdGVEQkNvbmZpZyhjb25maWcuZGF0YWJhc2UsIGNvbmZpZy5wcm9qZWN0TmFtZSk7XG4gICAgICBjb25zdCB0ZXN0Q29ubmVjdGlvbiA9IHBvc3RncmVzQ29ubmVjdGlvblNjaGVtYS5wYXJzZShkYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24pO1xuICAgICAgY29uc3QgdGVtcGxhdGVEYiA9IHRlc3RDb25uZWN0aW9uLmRhdGFiYXNlO1xuXG4gICAgICBjb25zdCBhZG1pbkNvbm5lY3Rpb24gPSB7XG4gICAgICAgIC4uLnRlc3RDb25uZWN0aW9uLFxuICAgICAgICBkYXRhYmFzZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29ubmVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgY2xpZW50OiBjb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gKFwicGdcIiBhcyBjb25zdCksXG4gICAgICAgIGNvbm5lY3Rpb246IGFkbWluQ29ubmVjdGlvbixcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgUGFyYWxsZWxEQk1hbmFnZXIobWF4V29ya2VycywgY29ubmVjdGlvbkNvbmZpZywgdGVtcGxhdGVEYik7XG4gICAgICBhd2FpdCBtYW5hZ2VyLmNyZWF0ZVdvcmtlckRhdGFiYXNlcygpO1xuXG4gICAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdGVhcmRvd24oKSB7XG4gICAgICAgIGF3YWl0IG1hbmFnZXIuZHJvcFdvcmtlckRhdGFiYXNlcygpO1xuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVzdG9yZVByb2Nlc3NFbnYoZW52QmVmb3JlQ29uZmlnTG9hZCk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIOq4sOuzuCBnbG9iYWxTZXR1cCDtlajsiJjsnoXri4jri6QuXG4gKiBzb25hbXUuY29uZmlnLnRz7J2YIHRlc3Qg7ISk7KCV7J2EIOydveyWtOyEnCDrs5HroKwg7YWM7Iqk7Yq4IO2ZmOqyveydhCDqtazshLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHNyYy90ZXN0aW5nL2dsb2JhbC50c1xuICogZXhwb3J0IHsgc2V0dXAgfSBmcm9tIFwic29uYW11L3Rlc3RcIjtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2V0dXAgPSBjcmVhdGVHbG9iYWxTZXR1cCgpO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUUwQyxZQUFBO0FBQ1AsUUFBQTtBQUduQyxNQUFNLDJCQUEyQixFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVk7QUFFaEYsU0FBUyxrQkFBa0IsVUFBbUM7Q0FDNUQsS0FBSyxNQUFNLE9BQU8sT0FBTyxLQUFLLFFBQVEsR0FBRyxHQUN2QyxJQUFJLEVBQUUsT0FBTyxXQUNYLE9BQU8sUUFBUSxJQUFJO0NBSXZCLEtBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsUUFBUSxHQUNoRCxRQUFRLElBQUksT0FBTztBQUV2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUJBLFNBQWdCLG9CQUFvQjtDQUNsQyxPQUFPLGVBQWUsUUFBUTtFQUM1QixNQUFNLEVBQUUsb0JBQW9CLE1BQU0sT0FBTztFQUN6QyxNQUFNLFdBQVcsZ0JBQWdCO0VBQ2pDLE1BQU0sc0JBQXNCLEVBQUUsR0FBRyxRQUFRLElBQUk7RUFDN0MsTUFBTSxTQUFTLE1BQU0sV0FBVyxRQUFRO0VBRXhDLElBQUk7R0FFRixJQUFJLENBQUMsT0FBTyxNQUFNLFVBQ2hCLE9BQU8sZUFBZSxXQUFXLENBRWpDO0dBR0YsTUFBTSxhQUFhLE9BQU8sS0FBSyxjQUFjO0dBQzdDLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixPQUFPLFVBQVUsT0FBTyxXQUFXO0dBQ3hFLE1BQU0saUJBQWlCLHlCQUF5QixNQUFNLFNBQVMsS0FBSyxVQUFVO0dBQzlFLE1BQU0sYUFBYSxlQUFlO0dBRWxDLE1BQU0sa0JBQWtCO0lBQ3RCLEdBQUc7SUFDSCxVQUFVO0dBQ1o7R0FFQSxNQUFNLG1CQUFtQjtJQUN2QixRQUFRLE9BQU8sU0FBUyxZQUFhO0lBQ3JDLFlBQVk7R0FDZDtHQUVBLE1BQU0sVUFBVSxJQUFJLGtCQUFrQixZQUFZLGtCQUFrQixVQUFVO0dBQzlFLE1BQU0sUUFBUSxzQkFBc0I7R0FFcEMsT0FBTyxlQUFlLFdBQVc7SUFDL0IsTUFBTSxRQUFRLG9CQUFvQjtHQUNwQztFQUNGLFVBQVU7R0FDUixrQkFBa0IsbUJBQW1CO0VBQ3ZDO0NBQ0Y7QUFDRjs7Ozs7Ozs7Ozs7QUFZQSxNQUFhLFFBQVEsa0JBQWtCIn0=
@@ -11,14 +11,17 @@ import { ParallelDBManager } from "./parallel-db-manager.js";
11
11
  import { createGlobalSetup, setup } from "./global-setup.js";
12
12
  import { NaiteVitestReporter } from "./naite-vitest-reporter.js";
13
13
  import { getSonamuTestConfig } from "./vitest-helpers.js";
14
- //#region src/testing/index.ts
14
+ // src/testing/index.ts
15
15
  init_better_auth_request();
16
16
  init_filesystem_dependencies();
17
17
  init_data_explorer();
18
+ init_fixture_manager();
19
+ init_fixture_generator();
20
+ init_dev_vitest_manager();
21
+ init_data_explorer();
18
22
  init_dev_vitest_manager();
19
23
  init_fixture_generator();
20
24
  init_fixture_manager();
21
- //#endregion
22
25
  export { DataExplorer, DevVitestManager, FixtureGenerator, FixtureManager, FixtureManagerClass, NaiteVitestReporter, ParallelDBManager, bootstrap, configureSyncerFilesystem, createBetterAuthRequest, createFixtureLoader, createGlobalSetup, dataExplorerRecordSchema, dataExplorerRecordsSchema, dataExplorerValueSchema, dataSourceConfigSchema, syncerFileExists as exists, getSonamuTestConfig, runWithContext, runWithMockContext, setup, test, testAs };
23
26
 
24
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgY3JlYXRlQmV0dGVyQXV0aFJlcXVlc3QgfSBmcm9tIFwiLi4vYXV0aC9iZXR0ZXItYXV0aC1yZXF1ZXN0XCI7XG5leHBvcnQge1xuICBjb25maWd1cmVTeW5jZXJGaWxlc3lzdGVtLFxuICB0eXBlIFN5bmNlckZpbGVzeXN0ZW1EZXBlbmRlbmNpZXMsXG59IGZyb20gXCIuLi9zeW5jZXIvZmlsZXN5c3RlbS1kZXBlbmRlbmNpZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Jvb3RzdHJhcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maXh0dXJlLWdlbmVyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZml4dHVyZS1sb2FkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmlsZXN5c3RlbVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2xvYmFsLXNldHVwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uYWl0ZS12aXRlc3QtcmVwb3J0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BhcmFsbGVsLWRiLW1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZpdGVzdC1oZWxwZXJzXCI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O3lCQUFxRTs2QkFJM0IifQ==
27
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgY3JlYXRlQmV0dGVyQXV0aFJlcXVlc3QgfSBmcm9tIFwiLi4vYXV0aC9iZXR0ZXItYXV0aC1yZXF1ZXN0XCI7XG5leHBvcnQge1xuICBjb25maWd1cmVTeW5jZXJGaWxlc3lzdGVtLFxuICB0eXBlIFN5bmNlckZpbGVzeXN0ZW1EZXBlbmRlbmNpZXMsXG59IGZyb20gXCIuLi9zeW5jZXIvZmlsZXN5c3RlbS1kZXBlbmRlbmNpZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Jvb3RzdHJhcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9maXh0dXJlLWdlbmVyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZml4dHVyZS1sb2FkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmlsZXN5c3RlbVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZ2xvYmFsLXNldHVwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uYWl0ZS12aXRlc3QtcmVwb3J0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3BhcmFsbGVsLWRiLW1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZpdGVzdC1oZWxwZXJzXCI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQXFFLHlCQUFBO0FBSTNCLDZCQUFBIn0=
@@ -1,5 +1,5 @@
1
1
  import { NaiteReporter } from "../naite/naite-reporter.js";
2
- //#region src/testing/naite-vitest-reporter.ts
2
+ // src/testing/naite-vitest-reporter.ts
3
3
  /**
4
4
  * Naite Vitest Reporter
5
5
  *
@@ -15,7 +15,6 @@ const NaiteVitestReporter = {
15
15
  await NaiteReporter.endTestRun();
16
16
  }
17
17
  };
18
- //#endregion
19
18
  export { NaiteVitestReporter };
20
19
 
21
20
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtdml0ZXN0LXJlcG9ydGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL25haXRlLXZpdGVzdC1yZXBvcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOYWl0ZVJlcG9ydGVyIH0gZnJvbSBcIi4uL25haXRlL25haXRlLXJlcG9ydGVyXCI7XG5cbi8qKlxuICogTmFpdGUgVml0ZXN0IFJlcG9ydGVyXG4gKlxuICog7YWM7Iqk7Yq4IOufsCDsi5zsnpEv7KKF66OM66W8IOygle2Zle2eiCDqsJDsp4DtlZjsl6wgTmFpdGVSZXBvcnRlcuyXkCDslYzrpr3ri4jri6QuXG4gKiAtIG9uVGVzdFJ1blN0YXJ0OiDthYzsiqTtirgg65+wIOyLnOyekSDsi5wgKOyyqyDsi6Ttlokg67CPIHdhdGNoIOyerOyLpO2WiSDtj6ztlagpXG4gKiAtIG9uVGVzdFJ1bkVuZDog6rCBIOufsCDsooXro4wg7IucXG4gKi9cbmV4cG9ydCBjb25zdCBOYWl0ZVZpdGVzdFJlcG9ydGVyID0ge1xuICBhc3luYyBvblRlc3RSdW5TdGFydCgpIHtcbiAgICBhd2FpdCBOYWl0ZVJlcG9ydGVyLnN0YXJ0VGVzdFJ1bigpO1xuICB9LFxuXG4gIGFzeW5jIG9uVGVzdFJ1bkVuZCgpIHtcbiAgICBhd2FpdCBOYWl0ZVJlcG9ydGVyLmVuZFRlc3RSdW4oKTtcbiAgfSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVNBLE1BQWEsc0JBQXNCO0NBQ2pDLE1BQU0saUJBQWlCO0VBQ3JCLE1BQU0sY0FBYyxhQUFhO0NBQ25DO0NBRUEsTUFBTSxlQUFlO0VBQ25CLE1BQU0sY0FBYyxXQUFXO0NBQ2pDO0FBQ0YifQ==
@@ -1,5 +1,5 @@
1
1
  import { createKnexInstance, init_knex } from "../database/knex.js";
2
- //#region src/testing/parallel-db-manager.ts
2
+ // src/testing/parallel-db-manager.ts
3
3
  init_knex();
4
4
  /**
5
5
  * 병렬 테스트를 위한 Worker별 DB 관리 클래스입니다.
@@ -69,7 +69,6 @@ var ParallelDBManager = class {
69
69
  return process.env.SONAMU_WORKER_DB === "true";
70
70
  }
71
71
  };
72
- //#endregion
73
72
  export { ParallelDBManager };
74
73
 
75
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYWxsZWwtZGItbWFuYWdlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9wYXJhbGxlbC1kYi1tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuLi9kYXRhYmFzZS9rbmV4XCI7XG5cbi8qKlxuICog67OR66CsIO2FjOyKpO2KuOulvCDsnITtlZwgV29ya2Vy67OEIERCIOq0gOumrCDtgbTrnpjsiqTsnoXri4jri6QuXG4gKlxuICogVml0ZXN07J2YIGdsb2JhbFNldHVwL2dsb2JhbFRlYXJkb3du7JeQ7IScIOyCrOyaqe2VmOyXrFxuICog7YWc7ZSM66a/IERC7JeQ7IScIHdvcmtlciDsiJjrp4ztgbwg7YWM7Iqk7Yq4IERC66W8IOuzteygnC/sgq3soJztlanri4jri6QuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbGxlbERCTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4V29ya2VyczogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGJDb25maWc6IEtuZXguQ29uZmlnLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVEYjogc3RyaW5nLFxuICApIHt9XG4gIC8qKlxuICAgKiBXb3JrZXLrs4Qg7YWM7Iqk7Yq4IERC66W8IO2FnO2UjOumv+yXkOyEnCDrs7XsoJztlZjsl6wg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBnbG9iYWxTZXR1cOyXkOyEnCDtmLjstpzrkKnri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVXb3JrZXJEYXRhYmFzZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gcG9zdGdyZXMgRELsl5Ag7Jew6rKw7ZWY7JesIENSRUFURSBEQVRBQkFTRSDsi6TtlolcbiAgICBjb25zdCBhZG1pbkRiID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgIC4uLnRoaXMuZGJDb25maWcsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2VyRGJOYW1lcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHsgbGVuZ3RoOiB0aGlzLm1heFdvcmtlcnMgfSxcbiAgICAgICAgKF8sIGkpID0+IGAke3RoaXMudGVtcGxhdGVEYn1fJHtpICsgMX1gLFxuICAgICAgKTtcblxuICAgICAgLy8gMS4g6riw7KG0IOyXsOqysCDsooXro4wgKOuzkeugrCkgd29ya2VyIERCICsgdGVtcGxhdGUgREIgKFBHIDE47JeQ7IScIEZJTEVfQ09QWSDsi5wgdGVtcGxhdGXsl5AgZXhjbHVzaXZlIGFjY2VzcyDtlYTsmpQpXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLndvcmtlckRiTmFtZXMsIHRoaXMudGVtcGxhdGVEYl0ubWFwKChkYk5hbWUpID0+XG4gICAgICAgICAgYWRtaW5EYi5yYXcoXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgICAgIFdIRVJFIHBnX3N0YXRfYWN0aXZpdHkuZGF0bmFtZSA9ID9cbiAgICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKVxuICAgICAgICAgIGAsXG4gICAgICAgICAgICBbZGJOYW1lXSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgLy8gMi4g6riw7KG0IERCIOyCreygnCAo67OR66CsKVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHdvcmtlckRiTmFtZXMubWFwKChkYk5hbWUpID0+IGFkbWluRGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcIiR7ZGJOYW1lfVwiYCkpLFxuICAgICAgKTtcblxuICAgICAgLy8gMy4g7YWc7ZSM66a/7JeQ7IScIOuzteygnCAo67OR66CsKVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHdvcmtlckRiTmFtZXMubWFwKChkYk5hbWUpID0+XG4gICAgICAgICAgYWRtaW5EYi5yYXcoXG4gICAgICAgICAgICBgQ1JFQVRFIERBVEFCQVNFIFwiJHtkYk5hbWV9XCIgVEVNUExBVEUgXCIke3RoaXMudGVtcGxhdGVEYn1cIiBTVFJBVEVHWSBGSUxFX0NPUFlgLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBhZG1pbkRiLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7IOd7ISx7ZWcIFdvcmtlciBEQuuTpOydhCDsgq3soJztlanri4jri6QuXG4gICAqIGdsb2JhbFRlYXJkb3du7JeQ7IScIO2YuOy2nOuQqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRyb3BXb3JrZXJEYXRhYmFzZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWRtaW5EYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAuLi50aGlzLmRiQ29uZmlnLFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtlckRiTmFtZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB7IGxlbmd0aDogdGhpcy5tYXhXb3JrZXJzIH0sXG4gICAgICAgIChfLCBpKSA9PiBgJHt0aGlzLnRlbXBsYXRlRGJ9XyR7aSArIDF9YCxcbiAgICAgICk7XG5cbiAgICAgIC8vIOyXsOqysCDsooXro4wgKOuzkeugrClcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB3b3JrZXJEYk5hbWVzLm1hcCgoZGJOYW1lKSA9PlxuICAgICAgICAgIGFkbWluRGIucmF3KFxuICAgICAgICAgICAgYFxuICAgICAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICAgICAgRlJPTSBwZ19zdGF0X2FjdGl2aXR5XG4gICAgICAgICAgICBXSEVSRSBwZ19zdGF0X2FjdGl2aXR5LmRhdG5hbWUgPSA/XG4gICAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKClcbiAgICAgICAgICBgLFxuICAgICAgICAgICAgW2RiTmFtZV0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIERCIOyCreygnCAo67OR66CsKVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHdvcmtlckRiTmFtZXMubWFwKChkYk5hbWUpID0+IGFkbWluRGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcIiR7ZGJOYW1lfVwiYCkpLFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgYWRtaW5EYi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIO2YhOyerCBXb3JrZXLsnZggSUTrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBWaXRlc3TripQgVklURVNUX1BPT0xfSUQg7ZmY6rK967OA7IiY66GcIHdvcmtlcuulvCDsi53rs4Ttlanri4jri6QuXG4gICAqL1xuICBnZXRXb3JrZXJJZCgpOiBudW1iZXIge1xuICAgIC8vIFZJVEVTVF9QT09MX0lE64qUIDHrtoDthLAg7Iuc7J6RXG4gICAgcmV0dXJuIHBhcnNlSW50KHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEID8/IFwiMVwiLCAxMCk7XG4gIH1cblxuICAvKipcbiAgICog67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsnbjsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKi9cbiAgaXNQYXJhbGxlbE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O1VBRXFEOzs7Ozs7O0FBUXJELElBQWEsb0JBQWIsTUFBK0I7Q0FFVjtDQUNBO0NBQ0E7Q0FIbkIsWUFDRSxZQUNBLFVBQ0EsWUFDQTtFQUhpQixLQUFBLGFBQUE7RUFDQSxLQUFBLFdBQUE7RUFDQSxLQUFBLGFBQUE7Q0FDaEI7Ozs7O0NBS0gsTUFBTSx3QkFBdUM7RUFFM0MsTUFBTSxVQUFVLG1CQUFtQixFQUNqQyxHQUFHLEtBQUssU0FDVixDQUFDO0VBRUQsSUFBSTtHQUNGLE1BQU0sZ0JBQWdCLE1BQU0sS0FDMUIsRUFBRSxRQUFRLEtBQUssV0FBVyxJQUN6QixHQUFHLE1BQU0sR0FBRyxLQUFLLFdBQVcsR0FBRyxJQUFJLEdBQ3RDO0dBR0EsTUFBTSxRQUFRLElBQ1osQ0FBQyxHQUFHLGVBQWUsS0FBSyxVQUFVLENBQUMsQ0FBQyxLQUFLLFdBQ3ZDLFFBQVEsSUFDTjs7Ozs7YUFNQSxDQUFDLE1BQU0sQ0FDVCxDQUNGLENBQ0Y7R0FHQSxNQUFNLFFBQVEsSUFDWixjQUFjLEtBQUssV0FBVyxRQUFRLElBQUksNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQ2xGO0dBR0EsTUFBTSxRQUFRLElBQ1osY0FBYyxLQUFLLFdBQ2pCLFFBQVEsSUFDTixvQkFBb0IsT0FBTyxjQUFjLEtBQUssV0FBVyxxQkFDM0QsQ0FDRixDQUNGO0VBQ0YsVUFBVTtHQUNSLE1BQU0sUUFBUSxRQUFRO0VBQ3hCO0NBQ0Y7Ozs7O0NBTUEsTUFBTSxzQkFBcUM7RUFDekMsTUFBTSxVQUFVLG1CQUFtQixFQUNqQyxHQUFHLEtBQUssU0FDVixDQUFDO0VBRUQsSUFBSTtHQUNGLE1BQU0sZ0JBQWdCLE1BQU0sS0FDMUIsRUFBRSxRQUFRLEtBQUssV0FBVyxJQUN6QixHQUFHLE1BQU0sR0FBRyxLQUFLLFdBQVcsR0FBRyxJQUFJLEdBQ3RDO0dBR0EsTUFBTSxRQUFRLElBQ1osY0FBYyxLQUFLLFdBQ2pCLFFBQVEsSUFDTjs7Ozs7YUFNQSxDQUFDLE1BQU0sQ0FDVCxDQUNGLENBQ0Y7R0FHQSxNQUFNLFFBQVEsSUFDWixjQUFjLEtBQUssV0FBVyxRQUFRLElBQUksNEJBQTRCLE9BQU8sRUFBRSxDQUFDLENBQ2xGO0VBQ0YsVUFBVTtHQUNSLE1BQU0sUUFBUSxRQUFRO0VBQ3hCO0NBQ0Y7Ozs7O0NBTUEsY0FBc0I7RUFFcEIsT0FBTyxTQUFTLFFBQVEsSUFBSSxrQkFBa0IsS0FBSyxFQUFFO0NBQ3ZEOzs7O0NBS0EsaUJBQTBCO0VBQ3hCLE9BQU8sUUFBUSxJQUFJLHFCQUFxQjtDQUMxQztBQUNGIn0=
74
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYWxsZWwtZGItbWFuYWdlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9wYXJhbGxlbC1kYi1tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuLi9kYXRhYmFzZS9rbmV4XCI7XG5cbi8qKlxuICog67OR66CsIO2FjOyKpO2KuOulvCDsnITtlZwgV29ya2Vy67OEIERCIOq0gOumrCDtgbTrnpjsiqTsnoXri4jri6QuXG4gKlxuICogVml0ZXN07J2YIGdsb2JhbFNldHVwL2dsb2JhbFRlYXJkb3du7JeQ7IScIOyCrOyaqe2VmOyXrFxuICog7YWc7ZSM66a/IERC7JeQ7IScIHdvcmtlciDsiJjrp4ztgbwg7YWM7Iqk7Yq4IERC66W8IOuzteygnC/sgq3soJztlanri4jri6QuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbGxlbERCTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4V29ya2VyczogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGJDb25maWc6IEtuZXguQ29uZmlnLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGVEYjogc3RyaW5nLFxuICApIHt9XG4gIC8qKlxuICAgKiBXb3JrZXLrs4Qg7YWM7Iqk7Yq4IERC66W8IO2FnO2UjOumv+yXkOyEnCDrs7XsoJztlZjsl6wg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBnbG9iYWxTZXR1cOyXkOyEnCDtmLjstpzrkKnri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVXb3JrZXJEYXRhYmFzZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gcG9zdGdyZXMgRELsl5Ag7Jew6rKw7ZWY7JesIENSRUFURSBEQVRBQkFTRSDsi6TtlolcbiAgICBjb25zdCBhZG1pbkRiID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgIC4uLnRoaXMuZGJDb25maWcsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2VyRGJOYW1lcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHsgbGVuZ3RoOiB0aGlzLm1heFdvcmtlcnMgfSxcbiAgICAgICAgKF8sIGkpID0+IGAke3RoaXMudGVtcGxhdGVEYn1fJHtpICsgMX1gLFxuICAgICAgKTtcblxuICAgICAgLy8gMS4g6riw7KG0IOyXsOqysCDsooXro4wgKOuzkeugrCkgd29ya2VyIERCICsgdGVtcGxhdGUgREIgKFBHIDE47JeQ7IScIEZJTEVfQ09QWSDsi5wgdGVtcGxhdGXsl5AgZXhjbHVzaXZlIGFjY2VzcyDtlYTsmpQpXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgWy4uLndvcmtlckRiTmFtZXMsIHRoaXMudGVtcGxhdGVEYl0ubWFwKChkYk5hbWUpID0+XG4gICAgICAgICAgYWRtaW5EYi5yYXcoXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgICAgIFdIRVJFIHBnX3N0YXRfYWN0aXZpdHkuZGF0bmFtZSA9ID9cbiAgICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKVxuICAgICAgICAgIGAsXG4gICAgICAgICAgICBbZGJOYW1lXSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgLy8gMi4g6riw7KG0IERCIOyCreygnCAo67OR66CsKVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHdvcmtlckRiTmFtZXMubWFwKChkYk5hbWUpID0+IGFkbWluRGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcIiR7ZGJOYW1lfVwiYCkpLFxuICAgICAgKTtcblxuICAgICAgLy8gMy4g7YWc7ZSM66a/7JeQ7IScIOuzteygnCAo67OR66CsKVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHdvcmtlckRiTmFtZXMubWFwKChkYk5hbWUpID0+XG4gICAgICAgICAgYWRtaW5EYi5yYXcoXG4gICAgICAgICAgICBgQ1JFQVRFIERBVEFCQVNFIFwiJHtkYk5hbWV9XCIgVEVNUExBVEUgXCIke3RoaXMudGVtcGxhdGVEYn1cIiBTVFJBVEVHWSBGSUxFX0NPUFlgLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBhZG1pbkRiLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7IOd7ISx7ZWcIFdvcmtlciBEQuuTpOydhCDsgq3soJztlanri4jri6QuXG4gICAqIGdsb2JhbFRlYXJkb3du7JeQ7IScIO2YuOy2nOuQqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRyb3BXb3JrZXJEYXRhYmFzZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWRtaW5EYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAuLi50aGlzLmRiQ29uZmlnLFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtlckRiTmFtZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB7IGxlbmd0aDogdGhpcy5tYXhXb3JrZXJzIH0sXG4gICAgICAgIChfLCBpKSA9PiBgJHt0aGlzLnRlbXBsYXRlRGJ9XyR7aSArIDF9YCxcbiAgICAgICk7XG5cbiAgICAgIC8vIOyXsOqysCDsooXro4wgKOuzkeugrClcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB3b3JrZXJEYk5hbWVzLm1hcCgoZGJOYW1lKSA9PlxuICAgICAgICAgIGFkbWluRGIucmF3KFxuICAgICAgICAgICAgYFxuICAgICAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICAgICAgRlJPTSBwZ19zdGF0X2FjdGl2aXR5XG4gICAgICAgICAgICBXSEVSRSBwZ19zdGF0X2FjdGl2aXR5LmRhdG5hbWUgPSA/XG4gICAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKClcbiAgICAgICAgICBgLFxuICAgICAgICAgICAgW2RiTmFtZV0sXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIC8vIERCIOyCreygnCAo67OR66CsKVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHdvcmtlckRiTmFtZXMubWFwKChkYk5hbWUpID0+IGFkbWluRGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcIiR7ZGJOYW1lfVwiYCkpLFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgYWRtaW5EYi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIO2YhOyerCBXb3JrZXLsnZggSUTrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBWaXRlc3TripQgVklURVNUX1BPT0xfSUQg7ZmY6rK967OA7IiY66GcIHdvcmtlcuulvCDsi53rs4Ttlanri4jri6QuXG4gICAqL1xuICBnZXRXb3JrZXJJZCgpOiBudW1iZXIge1xuICAgIC8vIFZJVEVTVF9QT09MX0lE64qUIDHrtoDthLAg7Iuc7J6RXG4gICAgcmV0dXJuIHBhcnNlSW50KHByb2Nlc3MuZW52LlZJVEVTVF9QT09MX0lEID8/IFwiMVwiLCAxMCk7XG4gIH1cblxuICAvKipcbiAgICog67OR66CsIO2FjOyKpO2KuCDrqqjrk5zsnbjsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKi9cbiAgaXNQYXJhbGxlbE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBRXFELFVBQUE7Ozs7Ozs7QUFRckQsSUFBYSxvQkFBYixNQUErQjtDQUVWO0NBQ0E7Q0FDQTtDQUhuQixZQUNFLFlBQ0EsVUFDQSxZQUNBO0VBSGlCLEtBQUEsYUFBQTtFQUNBLEtBQUEsV0FBQTtFQUNBLEtBQUEsYUFBQTtDQUNoQjs7Ozs7Q0FLSCxNQUFNLHdCQUF1QztFQUUzQyxNQUFNLFVBQVUsbUJBQW1CLEVBQ2pDLEdBQUcsS0FBSyxTQUNWLENBQUM7RUFFRCxJQUFJO0dBQ0YsTUFBTSxnQkFBZ0IsTUFBTSxLQUMxQixFQUFFLFFBQVEsS0FBSyxXQUFXLElBQ3pCLEdBQUcsTUFBTSxHQUFHLEtBQUssV0FBVyxHQUFHLElBQUksR0FDdEM7R0FHQSxNQUFNLFFBQVEsSUFDWixDQUFDLEdBQUcsZUFBZSxLQUFLLFVBQVUsQ0FBQyxDQUFDLEtBQUssV0FDdkMsUUFBUSxJQUNOOzs7OzthQU1BLENBQUMsTUFBTSxDQUNULENBQ0YsQ0FDRjtHQUdBLE1BQU0sUUFBUSxJQUNaLGNBQWMsS0FBSyxXQUFXLFFBQVEsSUFBSSw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FDbEY7R0FHQSxNQUFNLFFBQVEsSUFDWixjQUFjLEtBQUssV0FDakIsUUFBUSxJQUNOLG9CQUFvQixPQUFPLGNBQWMsS0FBSyxXQUFXLHFCQUMzRCxDQUNGLENBQ0Y7RUFDRixVQUFVO0dBQ1IsTUFBTSxRQUFRLFFBQVE7RUFDeEI7Q0FDRjs7Ozs7Q0FNQSxNQUFNLHNCQUFxQztFQUN6QyxNQUFNLFVBQVUsbUJBQW1CLEVBQ2pDLEdBQUcsS0FBSyxTQUNWLENBQUM7RUFFRCxJQUFJO0dBQ0YsTUFBTSxnQkFBZ0IsTUFBTSxLQUMxQixFQUFFLFFBQVEsS0FBSyxXQUFXLElBQ3pCLEdBQUcsTUFBTSxHQUFHLEtBQUssV0FBVyxHQUFHLElBQUksR0FDdEM7R0FHQSxNQUFNLFFBQVEsSUFDWixjQUFjLEtBQUssV0FDakIsUUFBUSxJQUNOOzs7OzthQU1BLENBQUMsTUFBTSxDQUNULENBQ0YsQ0FDRjtHQUdBLE1BQU0sUUFBUSxJQUNaLGNBQWMsS0FBSyxXQUFXLFFBQVEsSUFBSSw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FDbEY7RUFDRixVQUFVO0dBQ1IsTUFBTSxRQUFRLFFBQVE7RUFDeEI7Q0FDRjs7Ozs7Q0FNQSxjQUFzQjtFQUVwQixPQUFPLFNBQVMsUUFBUSxJQUFJLGtCQUFrQixLQUFLLEVBQUU7Q0FDdkQ7Ozs7Q0FLQSxpQkFBMEI7RUFDeEIsT0FBTyxRQUFRLElBQUkscUJBQXFCO0NBQzFDO0FBQ0YifQ==