sonamu 0.10.13 → 0.11.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 (230) hide show
  1. package/dist/ai/agents/agent.d.ts.map +1 -1
  2. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  3. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  4. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  5. package/dist/api/base-frame.d.ts.map +1 -1
  6. package/dist/api/decorators.d.ts.map +1 -1
  7. package/dist/api/sonamu.d.ts.map +1 -1
  8. package/dist/api/sonamu.js +3 -2
  9. package/dist/api/validator.d.ts.map +1 -1
  10. package/dist/auth/audit-log/events.d.ts.map +1 -1
  11. package/dist/auth/index.d.ts +1 -1
  12. package/dist/auth/index.d.ts.map +1 -1
  13. package/dist/auth/index.js +3 -3
  14. package/dist/auth/knex-adapter.d.ts.map +1 -1
  15. package/dist/auth/plugins/wrappers/admin.d.ts +4 -4
  16. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  17. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
  18. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
  19. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
  20. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
  21. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
  22. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  23. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  24. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  25. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  26. package/dist/bin/build-config.d.ts +10 -0
  27. package/dist/bin/build-config.d.ts.map +1 -1
  28. package/dist/bin/build-config.js +130 -6
  29. package/dist/bin/fixture.d.ts +7 -4
  30. package/dist/bin/fixture.d.ts.map +1 -1
  31. package/dist/bin/fixture.js +161 -13
  32. package/dist/bin/test-command.d.ts +7 -0
  33. package/dist/bin/test-command.d.ts.map +1 -1
  34. package/dist/bin/test-command.js +18 -4
  35. package/dist/bin/typecheck-web.d.ts +2 -0
  36. package/dist/bin/typecheck-web.d.ts.map +1 -0
  37. package/dist/bin/typecheck-web.js +36 -0
  38. package/dist/cache/decorator.d.ts.map +1 -1
  39. package/dist/cache/drivers.d.ts.map +1 -1
  40. package/dist/cache-control/cache-control.d.ts.map +1 -1
  41. package/dist/compress/compress.d.ts.map +1 -1
  42. package/dist/cone/cone-generator.js +1 -1
  43. package/dist/database/base-model.d.ts.map +1 -1
  44. package/dist/database/base-model.types.d.ts +0 -1
  45. package/dist/database/base-model.types.d.ts.map +1 -1
  46. package/dist/database/db.d.ts.map +1 -1
  47. package/dist/database/puri-subset.types.d.ts +0 -1
  48. package/dist/database/puri-subset.types.d.ts.map +1 -1
  49. package/dist/database/puri-wrapper.d.ts +0 -1
  50. package/dist/database/puri-wrapper.d.ts.map +1 -1
  51. package/dist/database/puri.d.ts +0 -1
  52. package/dist/database/puri.d.ts.map +1 -1
  53. package/dist/database/puri.types.d.ts +0 -1
  54. package/dist/database/puri.types.d.ts.map +1 -1
  55. package/dist/database/transaction-context.d.ts.map +1 -1
  56. package/dist/database/upsert-builder.d.ts.map +1 -1
  57. package/dist/dict/en.d.ts +58 -58
  58. package/dist/dict/en.d.ts.map +1 -1
  59. package/dist/dict/ko.d.ts +58 -58
  60. package/dist/dict/ko.d.ts.map +1 -1
  61. package/dist/dict/rc-keys.d.ts.map +1 -1
  62. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  63. package/dist/dict/sonamu-dictionary.js +2 -2
  64. package/dist/dict/utils.d.ts.map +1 -1
  65. package/dist/entity/entity-manager.d.ts +115 -113
  66. package/dist/entity/entity-manager.d.ts.map +1 -1
  67. package/dist/entity/entity-manager.js +25 -19
  68. package/dist/entity/entity-template-cone.d.ts +4 -4
  69. package/dist/entity/entity.d.ts +6 -1
  70. package/dist/entity/entity.d.ts.map +1 -1
  71. package/dist/entity/entity.js +8 -3
  72. package/dist/env.d.ts.map +1 -1
  73. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  74. package/dist/filter/types.d.ts.map +1 -1
  75. package/dist/index.js +6 -6
  76. package/dist/logger/configure.d.ts +10 -1
  77. package/dist/logger/configure.d.ts.map +1 -1
  78. package/dist/logger/configure.js +30 -5
  79. package/dist/migration/migrator.d.ts +12 -1
  80. package/dist/migration/migrator.d.ts.map +1 -1
  81. package/dist/migration/migrator.js +77 -30
  82. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  83. package/dist/migration/slack-confirm.d.ts.map +1 -1
  84. package/dist/naite/messaging-types.d.ts +0 -1
  85. package/dist/naite/messaging-types.d.ts.map +1 -1
  86. package/dist/naite/naite-reporter.d.ts +0 -1
  87. package/dist/naite/naite-reporter.d.ts.map +1 -1
  88. package/dist/naite/naite.d.ts.map +1 -1
  89. package/dist/storage/base-file.d.ts.map +1 -1
  90. package/dist/storage/buffered-file.d.ts.map +1 -1
  91. package/dist/storage/drivers.d.ts.map +1 -1
  92. package/dist/storage/s3-driver.d.ts.map +1 -1
  93. package/dist/storage/storage-manager.d.ts.map +1 -1
  94. package/dist/storage/uploaded-file.d.ts.map +1 -1
  95. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  96. package/dist/stream/ws-audience.d.ts.map +1 -1
  97. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  98. package/dist/stream/ws-delivery.d.ts.map +1 -1
  99. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  100. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  101. package/dist/stream/ws-registry.d.ts.map +1 -1
  102. package/dist/stream/ws-telemetry-memory.d.ts.map +1 -1
  103. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  104. package/dist/stream/ws.d.ts.map +1 -1
  105. package/dist/syncer/api-parser.js +2 -2
  106. package/dist/syncer/file-patterns.d.ts +17 -17
  107. package/dist/syncer/filesystem-dependencies.js +1 -1
  108. package/dist/syncer/syncer.d.ts.map +1 -1
  109. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  110. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  111. package/dist/template/implementations/entity.template.d.ts +2 -2
  112. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  113. package/dist/template/implementations/entry-server.template.d.ts +2 -2
  114. package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
  115. package/dist/template/implementations/generated.template.d.ts +2 -2
  116. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  117. package/dist/template/implementations/generated_http.template.d.ts +2 -2
  118. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  119. package/dist/template/implementations/generated_sso.template.d.ts +2 -2
  120. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  121. package/dist/template/implementations/http_validators.template.d.ts +2 -2
  122. package/dist/template/implementations/http_validators.template.d.ts.map +1 -1
  123. package/dist/template/implementations/init_types.template.d.ts +2 -2
  124. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  125. package/dist/template/implementations/model.template.d.ts +2 -2
  126. package/dist/template/implementations/model.template.d.ts.map +1 -1
  127. package/dist/template/implementations/model_test.template.d.ts +2 -2
  128. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  129. package/dist/template/implementations/queries.template.d.ts +2 -2
  130. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  131. package/dist/template/implementations/sd.template.d.ts +2 -2
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +1 -1
  134. package/dist/template/implementations/services.template.d.ts +2 -2
  135. package/dist/template/implementations/services.template.d.ts.map +1 -1
  136. package/dist/template/implementations/view_form.template.d.ts +3 -3
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  139. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  140. package/dist/template/implementations/view_list.template.d.ts +2 -2
  141. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  142. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  143. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  144. package/dist/template/template-manager.d.ts.map +1 -1
  145. package/dist/template/template.d.ts.map +1 -1
  146. package/dist/template/zod-converter.d.ts.map +1 -1
  147. package/dist/testing/_relation-graph.d.ts.map +1 -1
  148. package/dist/testing/data-explorer.d.ts +2 -2
  149. package/dist/testing/data-explorer.d.ts.map +1 -1
  150. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  151. package/dist/testing/faker-mappings.d.ts.map +1 -1
  152. package/dist/testing/fixture-generator.d.ts.map +1 -1
  153. package/dist/testing/fixture-generator.js +1 -1
  154. package/dist/testing/fixture-loader.d.ts.map +1 -1
  155. package/dist/testing/fixture-manager.d.ts +4 -0
  156. package/dist/testing/fixture-manager.d.ts.map +1 -1
  157. package/dist/testing/fixture-manager.js +99 -25
  158. package/dist/testing/naite-vitest-reporter.d.ts.map +1 -1
  159. package/dist/testing/parallel-db-manager.d.ts.map +1 -1
  160. package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts +10 -0
  161. package/dist/tooling/__tests__/helpers/sonamu-test-root.d.ts.map +1 -0
  162. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +42 -0
  163. package/dist/tooling/cdd-service.d.ts +87 -0
  164. package/dist/tooling/cdd-service.d.ts.map +1 -0
  165. package/dist/tooling/cdd-service.js +215 -0
  166. package/dist/tooling/cli-tooling.d.ts +11 -0
  167. package/dist/tooling/cli-tooling.d.ts.map +1 -0
  168. package/dist/tooling/cli-tooling.js +901 -0
  169. package/dist/tooling/fixture-service.d.ts +29 -0
  170. package/dist/tooling/fixture-service.d.ts.map +1 -0
  171. package/dist/tooling/fixture-service.js +53 -0
  172. package/dist/tooling/index.d.ts +2 -0
  173. package/dist/tooling/index.d.ts.map +1 -0
  174. package/dist/tooling/index.js +2 -0
  175. package/dist/tooling/test-run-client.d.ts +27 -0
  176. package/dist/tooling/test-run-client.d.ts.map +1 -0
  177. package/dist/tooling/test-run-client.js +120 -0
  178. package/dist/tsdown.api.config.js +48 -0
  179. package/dist/types/types.d.ts +527 -527
  180. package/dist/types/types.d.ts.map +1 -1
  181. package/dist/ui/ai-client.d.ts.map +1 -1
  182. package/dist/utils/formatter.d.ts +6 -0
  183. package/dist/utils/formatter.d.ts.map +1 -1
  184. package/dist/utils/formatter.js +42 -11
  185. package/dist/utils/model.d.ts +1 -1
  186. package/dist/vector/chunking.d.ts.map +1 -1
  187. package/dist/vector/embedding.d.ts.map +1 -1
  188. package/package.json +13 -12
  189. package/src/api/sonamu.ts +2 -1
  190. package/src/auth/index.ts +1 -1
  191. package/src/bin/__tests__/zod-compiler-build.test.ts +67 -0
  192. package/src/bin/build-config.ts +151 -5
  193. package/src/bin/fixture.ts +204 -21
  194. package/src/bin/test-command.ts +27 -4
  195. package/src/bin/typecheck-web.ts +56 -0
  196. package/src/dict/sonamu-dictionary.ts +1 -1
  197. package/src/entity/__tests__/entity-manager-autoload.contract.test.ts +55 -0
  198. package/src/entity/__tests__/entity-manager-explicit-root-registration.contract.test.ts +107 -0
  199. package/src/entity/entity-manager.ts +31 -19
  200. package/src/entity/entity.ts +7 -2
  201. package/src/logger/__tests__/configure.test.ts +33 -0
  202. package/src/logger/configure.ts +45 -3
  203. package/src/migration/__tests__/migrator.test.ts +51 -0
  204. package/src/migration/migrator.ts +103 -34
  205. package/src/syncer/api-parser.ts +1 -1
  206. package/src/testing/fixture-manager.ts +124 -32
  207. package/src/tooling/__tests__/cdd-rule-bootstrap.contract.test.ts +118 -0
  208. package/src/tooling/__tests__/cli-tooling-auth.contract.test.ts +72 -0
  209. package/src/tooling/__tests__/cli-tooling-cone-locale.contract.test.ts +150 -0
  210. package/src/tooling/__tests__/cli-tooling-entity-patch.contract.test.ts +131 -0
  211. package/src/tooling/__tests__/cli-tooling-fixture-transfer.contract.test.ts +255 -0
  212. package/src/tooling/__tests__/cli-tooling-i18n-update.contract.test.ts +104 -0
  213. package/src/tooling/__tests__/cli-tooling-scaffold.contract.test.ts +86 -0
  214. package/src/tooling/__tests__/cli-tooling-stub-practice.contract.test.ts +147 -0
  215. package/src/tooling/__tests__/default-cdd-adapter.contract.test.ts +73 -0
  216. package/src/tooling/__tests__/helpers/sonamu-test-root.ts +42 -0
  217. package/src/tooling/__tests__/test-run-client-config.contract.test.ts +154 -0
  218. package/src/tooling/cdd-service.ts +256 -0
  219. package/src/tooling/cli-tooling.ts +937 -0
  220. package/src/tooling/fixture-service.ts +72 -0
  221. package/src/tooling/index.ts +1 -0
  222. package/src/tooling/test-run-client.ts +196 -0
  223. package/src/utils/__tests__/formatter-bin.test.ts +99 -0
  224. package/src/utils/formatter.ts +74 -10
  225. package/tsdown.api.config.ts +8 -10
  226. package/bin/cli.js +0 -75
  227. package/dist/bin/cli.d.ts +0 -2
  228. package/dist/bin/cli.d.ts.map +0 -1
  229. package/dist/bin/cli.js +0 -956
  230. package/src/bin/cli.ts +0 -1166
@@ -3,6 +3,12 @@ import { init_category, isSameCategory } from "./category.js";
3
3
  import { configure, getConsoleSink } from "@logtape/logtape";
4
4
  import { getPrettyFormatter } from "@logtape/pretty";
5
5
  //#region src/logger/configure.ts
6
+ function getExternalLogTapeConfiguration() {
7
+ return globalThis.sonamuKitCliLogTapeOverride;
8
+ }
9
+ function hasExternalLogTapeConfiguration() {
10
+ return getExternalLogTapeConfiguration() !== void 0;
11
+ }
6
12
  function defaultFastifySink(fastifyCategory) {
7
13
  return getConsoleSink({ formatter: ((formatRecord, record) => {
8
14
  const filterFastify = (request, requestRecord, responseCode) => {
@@ -44,16 +50,34 @@ function defaultFastifyFilter(fastifyCategory) {
44
50
  };
45
51
  }
46
52
  async function configureLogTape(options) {
53
+ const external = getExternalLogTapeConfiguration();
47
54
  const fastifyCategory = options.fastifyCategory ?? ["fastify"];
48
- const sinks = {
55
+ const projectSinks = {
49
56
  "fastify-console": defaultFastifySink(fastifyCategory),
50
57
  ...options.sinks
51
58
  };
59
+ const externalSinkIds = /* @__PURE__ */ new Map();
60
+ const externalSinks = {};
61
+ for (const [sinkId, sink] of Object.entries(external?.config.sinks ?? {})) {
62
+ let namespacedId = `sonamu-cli:${sinkId}`;
63
+ while (Object.hasOwn(projectSinks, namespacedId) || Object.hasOwn(externalSinks, namespacedId)) namespacedId = `${namespacedId}-`;
64
+ externalSinkIds.set(sinkId, namespacedId);
65
+ externalSinks[namespacedId] = sink;
66
+ }
67
+ const sinks = {
68
+ ...projectSinks,
69
+ ...externalSinks
70
+ };
52
71
  const filters = {
53
72
  "fastify-console": defaultFastifyFilter(fastifyCategory),
54
- ...options.filters
73
+ ...options.filters,
74
+ ...external?.config.filters
55
75
  };
56
- const loggers = new Set(options.loggers ?? []);
76
+ const externalLoggers = (external?.config.loggers ?? []).map((logger) => ({
77
+ ...logger,
78
+ sinks: logger.sinks?.map((sinkId) => externalSinkIds.get(sinkId) ?? sinkId)
79
+ }));
80
+ const loggers = /* @__PURE__ */ new Set([...externalLoggers, ...options.loggers ?? []]);
57
81
  loggers.add({
58
82
  category: ["logtape", "meta"],
59
83
  lowestLevel: "fatal"
@@ -64,6 +88,7 @@ async function configureLogTape(options) {
64
88
  lowestLevel: "info",
65
89
  filters: ["fastify-console"]
66
90
  });
91
+ if (external !== void 0) external.applied = true;
67
92
  return configure({
68
93
  sinks,
69
94
  filters,
@@ -75,6 +100,6 @@ async function configureLogTape(options) {
75
100
  __esmMin((() => {
76
101
  init_category();
77
102
  }))();
78
- export { configureLogTape };
103
+ export { configureLogTape, hasExternalLogTapeConfiguration };
79
104
 
80
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2dnZXIvY29uZmlndXJlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZ3VyZSwgZ2V0Q29uc29sZVNpbmsgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBGaWx0ZXIsXG4gIHR5cGUgRmlsdGVyTGlrZSxcbiAgdHlwZSBMb2dnZXJDb25maWcsXG4gIHR5cGUgTG9nUmVjb3JkLFxuICB0eXBlIFNpbmssXG4gIHR5cGUgVGV4dEZvcm1hdHRlcixcbn0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldFByZXR0eUZvcm1hdHRlciB9IGZyb20gXCJAbG9ndGFwZS9wcmV0dHlcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgaXNTYW1lQ2F0ZWdvcnkgfSBmcm9tIFwiLi9jYXRlZ29yeVwiO1xuXG5leHBvcnQgdHlwZSBTb25hbXVMb2dnaW5nT3B0aW9uczxUU2lua0lkIGV4dGVuZHMgc3RyaW5nLCBURmlsdGVySWQgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICAvLyBmYXN0aWZ5IOuhnOq5hSDsubTthYzqs6DrpqwgKGEuYi5j7J2YIO2Yle2DnOuhnCDrhKPsnLzrqbQgW2EsIGIsIGNd66GcIOuTpOyWtOqwkeuLiOuLpC4pXG4gIC8vIOq4sOuzuOqwkuydgCBbXCJmYXN0aWZ5XCJdIOyeheuLiOuLpC5cbiAgZmFzdGlmeUNhdGVnb3J5PzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLy8g6rCBIO2VreuqqeuTpOydhCDshKTsoJXtlaAg65WMIFwiZmFzdGlmeS1jb25zb2xlXCLsnbQg65Ok7Ja06rCIIOqyveyasCwg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICBzaW5rcz86IFJlY29yZDxUU2lua0lkLCBTaW5rPjtcbiAgZmlsdGVycz86IFJlY29yZDxURmlsdGVySWQsIEZpbHRlckxpa2U+O1xuXG4gIC8vIOqwgSDtla3rqqnsnYQg7ISk7KCV7ZWgIOuVjCBmYXN0aWZ5Q2F0ZWdvcnnsl5Ag7ISk7KCV65CcIOy5tO2FjOqzoOumrOqwgCDsnojsnYQg6rK97JqwLCDquLDrs7ggbG9nZ2VyIOyEpOygleydgCDstpTqsIDrkJjsp4Ag7JWK7Iq164uI64ukLlxuICBsb2dnZXJzPzogTG9nZ2VyQ29uZmlnPFRTaW5rSWQsIFRGaWx0ZXJJZD5bXTtcbn07XG5cbi8vIGZhc3RpZnnsl5Ag64yA7ZWcIOq4sOuzuCBzaW5rIOyEpOyglVxuZnVuY3Rpb24gZGVmYXVsdEZhc3RpZnlTaW5rKGZhc3RpZnlDYXRlZ29yeTogcmVhZG9ubHkgc3RyaW5nW10pOiBTaW5rIHtcbiAgY29uc3QgZmFzdGlmeUZvcm1hdHRlciA9ICgoZm9ybWF0UmVjb3JkOiBUZXh0Rm9ybWF0dGVyLCByZWNvcmQ6IExvZ1JlY29yZCkgPT4ge1xuICAgIC8vIEZhc3RpZnkgQVBJIFJvdXRl7JeQIOuMgO2VnCBMb2dnZXLsnZgg6rK97JqwLCDsnZHri7Ug7L2U65Oc7JmAIOyalOyyrSBVUkzsnYQg7LaU6rCAXG4gICAgY29uc3QgZmlsdGVyRmFzdGlmeSA9IChcbiAgICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgcmVxdWVzdFJlY29yZDogTG9nUmVjb3JkLFxuICAgICAgcmVzcG9uc2VDb2RlPzogbnVtYmVyLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0UmVjb3JkKHJlcXVlc3RSZWNvcmQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYXN0SXRlbSA9IC8qIFNBRkVUWTogTG9nVGFwZSDqtazshLEg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmVxdWVzdFJlY29yZFxuICAgICAgICAubWVzc2FnZVtyZXF1ZXN0UmVjb3JkLm1lc3NhZ2UubGVuZ3RoIC0gMV0gYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIGZvcm1hdFJlY29yZCh7XG4gICAgICAgIC4uLnJlcXVlc3RSZWNvcmQsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICAuLi5yZXF1ZXN0UmVjb3JkLm1lc3NhZ2Uuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgIGBbJHtyZXF1ZXN0Lm1ldGhvZH0ke3Jlc3BvbnNlQ29kZSA/IGA6JHtyZXNwb25zZUNvZGV9YCA6IFwiXCJ9XSAke3JlcXVlc3Qub3JpZ2luYWxVcmx9IC0gJHtsYXN0SXRlbX1gLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICghaXNTYW1lQ2F0ZWdvcnkoZmFzdGlmeUNhdGVnb3J5LCBbLi4ucmVjb3JkLmNhdGVnb3J5XSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRSZWNvcmQocmVjb3JkKTtcbiAgICB9XG5cbiAgICBpZiAoXCJyZXFcIiBpbiByZWNvcmQucHJvcGVydGllcyAmJiByZWNvcmQucHJvcGVydGllcy5yZXEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSAvKiBTQUZFVFk6IExvZ1RhcGUg6rWs7ISxIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJlY29yZC5wcm9wZXJ0aWVzXG4gICAgICAgIC5yZXEgYXMgRmFzdGlmeVJlcXVlc3Q7XG4gICAgICByZXR1cm4gZmlsdGVyRmFzdGlmeShyZXF1ZXN0LCByZWNvcmQpO1xuICAgIH1cblxuICAgIGlmIChcInJlc1wiIGluIHJlY29yZC5wcm9wZXJ0aWVzICYmIHJlY29yZC5wcm9wZXJ0aWVzLnJlcyAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVwbHkgPSAvKiBTQUZFVFk6IExvZ1RhcGUg6rWs7ISxIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJlY29yZC5wcm9wZXJ0aWVzXG4gICAgICAgIC5yZXMgYXMgRmFzdGlmeVJlcGx5O1xuICAgICAgcmV0dXJuIGZpbHRlckZhc3RpZnkocmVwbHkucmVxdWVzdCwgcmVjb3JkLCByZXBseS5zdGF0dXNDb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0UmVjb3JkKHJlY29yZCk7XG4gIH0pLmJpbmQoXG4gICAgbnVsbCxcbiAgICBnZXRQcmV0dHlGb3JtYXR0ZXIoe1xuICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgIGNhdGVnb3J5V2lkdGg6IDIwLFxuICAgICAgY2F0ZWdvcnlUcnVuY2F0ZTogXCJtaWRkbGVcIixcbiAgICB9KSxcbiAgKTtcblxuICByZXR1cm4gZ2V0Q29uc29sZVNpbmsoe1xuICAgIGZvcm1hdHRlcjogZmFzdGlmeUZvcm1hdHRlcixcbiAgfSk7XG59XG5cbi8vIGZhc3RpZnnsl5Ag64yA7ZWcIOq4sOuzuCBmaWx0ZXIg7ISk7KCVICgvYXBpIOqyveuhnOydmCDsmpTssq3rp4wg66Gc6rmFKVxuZnVuY3Rpb24gZGVmYXVsdEZhc3RpZnlGaWx0ZXIoZmFzdGlmeUNhdGVnb3J5OiByZWFkb25seSBzdHJpbmdbXSk6IEZpbHRlciB7XG4gIHJldHVybiAocmVjb3JkOiBMb2dSZWNvcmQpID0+IHtcbiAgICBpZiAoIWlzU2FtZUNhdGVnb3J5KFsuLi5mYXN0aWZ5Q2F0ZWdvcnldLCBbLi4ucmVjb3JkLmNhdGVnb3J5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXCJyZXFcIiBpbiByZWNvcmQucHJvcGVydGllcyAmJiByZWNvcmQucHJvcGVydGllcy5yZXEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSAvKiBTQUZFVFk6IExvZ1RhcGUg6rWs7ISxIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJlY29yZC5wcm9wZXJ0aWVzXG4gICAgICAgIC5yZXEgYXMgRmFzdGlmeVJlcXVlc3Q7XG4gICAgICByZXR1cm4gcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgJiYgcmVxdWVzdC51cmwgIT09IFwiL2FwaS9oZWFsdGhjaGVja1wiO1xuICAgIH1cblxuICAgIGlmIChcInJlc1wiIGluIHJlY29yZC5wcm9wZXJ0aWVzICYmIHJlY29yZC5wcm9wZXJ0aWVzLnJlcyAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVwbHkgPSAvKiBTQUZFVFk6IExvZ1RhcGUg6rWs7ISxIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJlY29yZC5wcm9wZXJ0aWVzXG4gICAgICAgIC5yZXMgYXMgRmFzdGlmeVJlcGx5O1xuICAgICAgcmV0dXJuIHJlcGx5LnJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpICYmIHJlcGx5LnJlcXVlc3QudXJsICE9PSBcIi9hcGkvaGVhbHRoY2hlY2tcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLy8g7KCE7LK0IGxvZ3RhcGUg7ISk7KCVXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uZmlndXJlTG9nVGFwZTxUU2lua0lkIGV4dGVuZHMgc3RyaW5nLCBURmlsdGVySWQgZXh0ZW5kcyBzdHJpbmc+KFxuICBvcHRpb25zOiBTb25hbXVMb2dnaW5nT3B0aW9uczxUU2lua0lkLCBURmlsdGVySWQ+LFxuKSB7XG4gIGNvbnN0IGZhc3RpZnlDYXRlZ29yeSA9IG9wdGlvbnMuZmFzdGlmeUNhdGVnb3J5ID8/IFtcImZhc3RpZnlcIl07XG5cbiAgY29uc3Qgc2lua3MgPSB7XG4gICAgXCJmYXN0aWZ5LWNvbnNvbGVcIjogZGVmYXVsdEZhc3RpZnlTaW5rKGZhc3RpZnlDYXRlZ29yeSksXG4gICAgLi4ub3B0aW9ucy5zaW5rcyxcbiAgfTtcblxuICBjb25zdCBmaWx0ZXJzID0ge1xuICAgIFwiZmFzdGlmeS1jb25zb2xlXCI6IGRlZmF1bHRGYXN0aWZ5RmlsdGVyKGZhc3RpZnlDYXRlZ29yeSksXG4gICAgLi4ub3B0aW9ucy5maWx0ZXJzLFxuICB9O1xuXG4gIGNvbnN0IGxvZ2dlcnMgPSBuZXcgU2V0PExvZ2dlckNvbmZpZzxzdHJpbmcsIHN0cmluZz4+KG9wdGlvbnMubG9nZ2VycyA/PyBbXSk7XG5cbiAgLy8gbG9ndGFwZeydmCBtZXRhIGxvZ2dlciDtkZzsi5zrpbwg67mE7Zmc7ISx7ZmUXG4gIGxvZ2dlcnMuYWRkKHtcbiAgICBjYXRlZ29yeTogW1wibG9ndGFwZVwiLCBcIm1ldGFcIl0sXG4gICAgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIixcbiAgfSk7XG5cbiAgaWYgKFsuLi5sb2dnZXJzXS5ldmVyeSgobG9nZ2VyKSA9PiAhaXNTYW1lQ2F0ZWdvcnkoWy4uLmZhc3RpZnlDYXRlZ29yeV0sIGxvZ2dlci5jYXRlZ29yeSkpKSB7XG4gICAgbG9nZ2Vycy5hZGQoe1xuICAgICAgY2F0ZWdvcnk6IFsuLi5mYXN0aWZ5Q2F0ZWdvcnldLFxuICAgICAgc2lua3M6IFtcImZhc3RpZnktY29uc29sZVwiXSxcbiAgICAgIGxvd2VzdExldmVsOiBcImluZm9cIixcbiAgICAgIGZpbHRlcnM6IFtcImZhc3RpZnktY29uc29sZVwiXSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb25maWd1cmUoeyBzaW5rcywgZmlsdGVycywgbG9nZ2VyczogWy4uLmxvZ2dlcnNdLCByZXNldDogdHJ1ZSB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE0QkEsU0FBUyxtQkFBbUIsaUJBQTBDO0NBaURwRSxPQUFPLGVBQWUsRUFDcEIsYUFqRHlCLGNBQTZCLFdBQXNCO0VBRTVFLE1BQU0saUJBQ0osU0FDQSxlQUNBLGlCQUNHO0dBQ0gsSUFBSSxDQUFDLFFBQVEsSUFBSSxXQUFXLE1BQU0sR0FDaEMsT0FBTyxhQUFhLGFBQWE7R0FHbkMsTUFBTSxXQUF3RCxjQUMzRCxRQUFRLGNBQWMsUUFBUSxTQUFTO0dBQzFDLE9BQU8sYUFBYTtJQUNsQixHQUFHO0lBQ0gsU0FBUyxDQUNQLEdBQUcsY0FBYyxRQUFRLE1BQU0sR0FBRyxFQUFFLEdBQ3BDLElBQUksUUFBUSxTQUFTLGVBQWUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLFFBQVEsWUFBWSxLQUFLLFVBQzNGO0dBQ0YsQ0FBQztFQUNIO0VBRUEsSUFBSSxDQUFDLGVBQWUsaUJBQWlCLENBQUMsR0FBRyxPQUFPLFFBQVEsQ0FBQyxHQUN2RCxPQUFPLGFBQWEsTUFBTTtFQUc1QixJQUFJLFNBQVMsT0FBTyxjQUFjLE9BQU8sV0FBVyxRQUFRLE1BQU07R0FDaEUsTUFBTSxVQUF1RCxPQUFPLFdBQ2pFO0dBQ0gsT0FBTyxjQUFjLFNBQVMsTUFBTTtFQUN0QztFQUVBLElBQUksU0FBUyxPQUFPLGNBQWMsT0FBTyxXQUFXLFFBQVEsTUFBTTtHQUNoRSxNQUFNLFFBQXFELE9BQU8sV0FDL0Q7R0FDSCxPQUFPLGNBQWMsTUFBTSxTQUFTLFFBQVEsTUFBTSxVQUFVO0VBQzlEO0VBRUEsT0FBTyxhQUFhLE1BQU07Q0FDNUIsRUFBQSxDQUFHLEtBQ0QsTUFDQSxtQkFBbUI7RUFDakIsV0FBVztFQUNYLGVBQWU7RUFDZixrQkFBa0I7Q0FDcEIsQ0FBQyxDQUlVLEVBQ2IsQ0FBQztBQUNIO0FBR0EsU0FBUyxxQkFBcUIsaUJBQTRDO0NBQ3hFLFFBQVEsV0FBc0I7RUFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLGVBQWUsR0FBRyxDQUFDLEdBQUcsT0FBTyxRQUFRLENBQUMsR0FDNUQsT0FBTztFQUdULElBQUksU0FBUyxPQUFPLGNBQWMsT0FBTyxXQUFXLFFBQVEsTUFBTTtHQUNoRSxNQUFNLFVBQXVELE9BQU8sV0FDakU7R0FDSCxPQUFPLFFBQVEsSUFBSSxXQUFXLE1BQU0sS0FBSyxRQUFRLFFBQVE7RUFDM0Q7RUFFQSxJQUFJLFNBQVMsT0FBTyxjQUFjLE9BQU8sV0FBVyxRQUFRLE1BQU07R0FDaEUsTUFBTSxRQUFxRCxPQUFPLFdBQy9EO0dBQ0gsT0FBTyxNQUFNLFFBQVEsSUFBSSxXQUFXLE1BQU0sS0FBSyxNQUFNLFFBQVEsUUFBUTtFQUN2RTtFQUVBLE9BQU87Q0FDVDtBQUNGO0FBR0EsZUFBc0IsaUJBQ3BCLFNBQ0E7Q0FDQSxNQUFNLGtCQUFrQixRQUFRLG1CQUFtQixDQUFDLFNBQVM7Q0FFN0QsTUFBTSxRQUFRO0VBQ1osbUJBQW1CLG1CQUFtQixlQUFlO0VBQ3JELEdBQUcsUUFBUTtDQUNiO0NBRUEsTUFBTSxVQUFVO0VBQ2QsbUJBQW1CLHFCQUFxQixlQUFlO0VBQ3ZELEdBQUcsUUFBUTtDQUNiO0NBRUEsTUFBTSxVQUFVLElBQUksSUFBa0MsUUFBUSxXQUFXLENBQUMsQ0FBQztDQUczRSxRQUFRLElBQUk7RUFDVixVQUFVLENBQUMsV0FBVyxNQUFNO0VBQzVCLGFBQWE7Q0FDZixDQUFDO0NBRUQsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUMsZUFBZSxDQUFDLEdBQUcsZUFBZSxHQUFHLE9BQU8sUUFBUSxDQUFDLEdBQ3ZGLFFBQVEsSUFBSTtFQUNWLFVBQVUsQ0FBQyxHQUFHLGVBQWU7RUFDN0IsT0FBTyxDQUFDLGlCQUFpQjtFQUN6QixhQUFhO0VBQ2IsU0FBUyxDQUFDLGlCQUFpQjtDQUM3QixDQUFDO0NBR0gsT0FBTyxVQUFVO0VBQUU7RUFBTztFQUFTLFNBQVMsQ0FBQyxHQUFHLE9BQU87RUFBRyxPQUFPO0NBQUssQ0FBQztBQUN6RTs7O2VBL0gyQyJ9
105
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2dnZXIvY29uZmlndXJlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZ3VyZSwgZ2V0Q29uc29sZVNpbmsgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25maWcsXG4gIHR5cGUgRmlsdGVyLFxuICB0eXBlIEZpbHRlckxpa2UsXG4gIHR5cGUgTG9nZ2VyQ29uZmlnLFxuICB0eXBlIExvZ1JlY29yZCxcbiAgdHlwZSBTaW5rLFxuICB0eXBlIFRleHRGb3JtYXR0ZXIsXG59IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5cbmltcG9ydCB7IGlzU2FtZUNhdGVnb3J5IH0gZnJvbSBcIi4vY2F0ZWdvcnlcIjtcblxuaW50ZXJmYWNlIEV4dGVybmFsTG9nVGFwZUNvbmZpZ3VyYXRpb24ge1xuICByZWFkb25seSBjb25maWc6IENvbmZpZzxzdHJpbmcsIHN0cmluZz47XG4gIGFwcGxpZWQ6IGJvb2xlYW47XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdmFyIHNvbmFtdUtpdENsaUxvZ1RhcGVPdmVycmlkZTogRXh0ZXJuYWxMb2dUYXBlQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RXh0ZXJuYWxMb2dUYXBlQ29uZmlndXJhdGlvbigpOiBFeHRlcm5hbExvZ1RhcGVDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMuc29uYW11S2l0Q2xpTG9nVGFwZU92ZXJyaWRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzRXh0ZXJuYWxMb2dUYXBlQ29uZmlndXJhdGlvbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldEV4dGVybmFsTG9nVGFwZUNvbmZpZ3VyYXRpb24oKSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBTb25hbXVMb2dnaW5nT3B0aW9uczxUU2lua0lkIGV4dGVuZHMgc3RyaW5nLCBURmlsdGVySWQgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICAvLyBmYXN0aWZ5IOuhnOq5hSDsubTthYzqs6DrpqwgKGEuYi5j7J2YIO2Yle2DnOuhnCDrhKPsnLzrqbQgW2EsIGIsIGNd66GcIOuTpOyWtOqwkeuLiOuLpC4pXG4gIC8vIOq4sOuzuOqwkuydgCBbXCJmYXN0aWZ5XCJdIOyeheuLiOuLpC5cbiAgZmFzdGlmeUNhdGVnb3J5PzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLy8g6rCBIO2VreuqqeuTpOydhCDshKTsoJXtlaAg65WMIFwiZmFzdGlmeS1jb25zb2xlXCLsnbQg65Ok7Ja06rCIIOqyveyasCwg642u7Ja07JSM7JuM7KeR64uI64ukLlxuICBzaW5rcz86IFJlY29yZDxUU2lua0lkLCBTaW5rPjtcbiAgZmlsdGVycz86IFJlY29yZDxURmlsdGVySWQsIEZpbHRlckxpa2U+O1xuXG4gIC8vIOqwgSDtla3rqqnsnYQg7ISk7KCV7ZWgIOuVjCBmYXN0aWZ5Q2F0ZWdvcnnsl5Ag7ISk7KCV65CcIOy5tO2FjOqzoOumrOqwgCDsnojsnYQg6rK97JqwLCDquLDrs7ggbG9nZ2VyIOyEpOygleydgCDstpTqsIDrkJjsp4Ag7JWK7Iq164uI64ukLlxuICBsb2dnZXJzPzogTG9nZ2VyQ29uZmlnPFRTaW5rSWQsIFRGaWx0ZXJJZD5bXTtcbn07XG5cbi8vIGZhc3RpZnnsl5Ag64yA7ZWcIOq4sOuzuCBzaW5rIOyEpOyglVxuZnVuY3Rpb24gZGVmYXVsdEZhc3RpZnlTaW5rKGZhc3RpZnlDYXRlZ29yeTogcmVhZG9ubHkgc3RyaW5nW10pOiBTaW5rIHtcbiAgY29uc3QgZmFzdGlmeUZvcm1hdHRlciA9ICgoZm9ybWF0UmVjb3JkOiBUZXh0Rm9ybWF0dGVyLCByZWNvcmQ6IExvZ1JlY29yZCkgPT4ge1xuICAgIC8vIEZhc3RpZnkgQVBJIFJvdXRl7JeQIOuMgO2VnCBMb2dnZXLsnZgg6rK97JqwLCDsnZHri7Ug7L2U65Oc7JmAIOyalOyyrSBVUkzsnYQg7LaU6rCAXG4gICAgY29uc3QgZmlsdGVyRmFzdGlmeSA9IChcbiAgICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgcmVxdWVzdFJlY29yZDogTG9nUmVjb3JkLFxuICAgICAgcmVzcG9uc2VDb2RlPzogbnVtYmVyLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0UmVjb3JkKHJlcXVlc3RSZWNvcmQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYXN0SXRlbSA9IC8qIFNBRkVUWTogTG9nVGFwZSDqtazshLEg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcmVxdWVzdFJlY29yZFxuICAgICAgICAubWVzc2FnZVtyZXF1ZXN0UmVjb3JkLm1lc3NhZ2UubGVuZ3RoIC0gMV0gYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIGZvcm1hdFJlY29yZCh7XG4gICAgICAgIC4uLnJlcXVlc3RSZWNvcmQsXG4gICAgICAgIG1lc3NhZ2U6IFtcbiAgICAgICAgICAuLi5yZXF1ZXN0UmVjb3JkLm1lc3NhZ2Uuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgIGBbJHtyZXF1ZXN0Lm1ldGhvZH0ke3Jlc3BvbnNlQ29kZSA/IGA6JHtyZXNwb25zZUNvZGV9YCA6IFwiXCJ9XSAke3JlcXVlc3Qub3JpZ2luYWxVcmx9IC0gJHtsYXN0SXRlbX1gLFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICghaXNTYW1lQ2F0ZWdvcnkoZmFzdGlmeUNhdGVnb3J5LCBbLi4ucmVjb3JkLmNhdGVnb3J5XSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRSZWNvcmQocmVjb3JkKTtcbiAgICB9XG5cbiAgICBpZiAoXCJyZXFcIiBpbiByZWNvcmQucHJvcGVydGllcyAmJiByZWNvcmQucHJvcGVydGllcy5yZXEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSAvKiBTQUZFVFk6IExvZ1RhcGUg6rWs7ISxIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJlY29yZC5wcm9wZXJ0aWVzXG4gICAgICAgIC5yZXEgYXMgRmFzdGlmeVJlcXVlc3Q7XG4gICAgICByZXR1cm4gZmlsdGVyRmFzdGlmeShyZXF1ZXN0LCByZWNvcmQpO1xuICAgIH1cblxuICAgIGlmIChcInJlc1wiIGluIHJlY29yZC5wcm9wZXJ0aWVzICYmIHJlY29yZC5wcm9wZXJ0aWVzLnJlcyAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVwbHkgPSAvKiBTQUZFVFk6IExvZ1RhcGUg6rWs7ISxIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJlY29yZC5wcm9wZXJ0aWVzXG4gICAgICAgIC5yZXMgYXMgRmFzdGlmeVJlcGx5O1xuICAgICAgcmV0dXJuIGZpbHRlckZhc3RpZnkocmVwbHkucmVxdWVzdCwgcmVjb3JkLCByZXBseS5zdGF0dXNDb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0UmVjb3JkKHJlY29yZCk7XG4gIH0pLmJpbmQoXG4gICAgbnVsbCxcbiAgICBnZXRQcmV0dHlGb3JtYXR0ZXIoe1xuICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgIGNhdGVnb3J5V2lkdGg6IDIwLFxuICAgICAgY2F0ZWdvcnlUcnVuY2F0ZTogXCJtaWRkbGVcIixcbiAgICB9KSxcbiAgKTtcblxuICByZXR1cm4gZ2V0Q29uc29sZVNpbmsoe1xuICAgIGZvcm1hdHRlcjogZmFzdGlmeUZvcm1hdHRlcixcbiAgfSk7XG59XG5cbi8vIGZhc3RpZnnsl5Ag64yA7ZWcIOq4sOuzuCBmaWx0ZXIg7ISk7KCVICgvYXBpIOqyveuhnOydmCDsmpTssq3rp4wg66Gc6rmFKVxuZnVuY3Rpb24gZGVmYXVsdEZhc3RpZnlGaWx0ZXIoZmFzdGlmeUNhdGVnb3J5OiByZWFkb25seSBzdHJpbmdbXSk6IEZpbHRlciB7XG4gIHJldHVybiAocmVjb3JkOiBMb2dSZWNvcmQpID0+IHtcbiAgICBpZiAoIWlzU2FtZUNhdGVnb3J5KFsuLi5mYXN0aWZ5Q2F0ZWdvcnldLCBbLi4ucmVjb3JkLmNhdGVnb3J5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXCJyZXFcIiBpbiByZWNvcmQucHJvcGVydGllcyAmJiByZWNvcmQucHJvcGVydGllcy5yZXEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSAvKiBTQUZFVFk6IExvZ1RhcGUg6rWs7ISxIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJlY29yZC5wcm9wZXJ0aWVzXG4gICAgICAgIC5yZXEgYXMgRmFzdGlmeVJlcXVlc3Q7XG4gICAgICByZXR1cm4gcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgJiYgcmVxdWVzdC51cmwgIT09IFwiL2FwaS9oZWFsdGhjaGVja1wiO1xuICAgIH1cblxuICAgIGlmIChcInJlc1wiIGluIHJlY29yZC5wcm9wZXJ0aWVzICYmIHJlY29yZC5wcm9wZXJ0aWVzLnJlcyAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVwbHkgPSAvKiBTQUZFVFk6IExvZ1RhcGUg6rWs7ISxIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHJlY29yZC5wcm9wZXJ0aWVzXG4gICAgICAgIC5yZXMgYXMgRmFzdGlmeVJlcGx5O1xuICAgICAgcmV0dXJuIHJlcGx5LnJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpICYmIHJlcGx5LnJlcXVlc3QudXJsICE9PSBcIi9hcGkvaGVhbHRoY2hlY2tcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxuLy8g7KCE7LK0IGxvZ3RhcGUg7ISk7KCVXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uZmlndXJlTG9nVGFwZTxUU2lua0lkIGV4dGVuZHMgc3RyaW5nLCBURmlsdGVySWQgZXh0ZW5kcyBzdHJpbmc+KFxuICBvcHRpb25zOiBTb25hbXVMb2dnaW5nT3B0aW9uczxUU2lua0lkLCBURmlsdGVySWQ+LFxuKSB7XG4gIGNvbnN0IGV4dGVybmFsID0gZ2V0RXh0ZXJuYWxMb2dUYXBlQ29uZmlndXJhdGlvbigpO1xuICBjb25zdCBmYXN0aWZ5Q2F0ZWdvcnkgPSBvcHRpb25zLmZhc3RpZnlDYXRlZ29yeSA/PyBbXCJmYXN0aWZ5XCJdO1xuXG4gIGNvbnN0IHByb2plY3RTaW5rcyA9IHtcbiAgICBcImZhc3RpZnktY29uc29sZVwiOiBkZWZhdWx0RmFzdGlmeVNpbmsoZmFzdGlmeUNhdGVnb3J5KSxcbiAgICAuLi5vcHRpb25zLnNpbmtzLFxuICB9IHNhdGlzZmllcyBSZWNvcmQ8c3RyaW5nLCBTaW5rPjtcbiAgY29uc3QgZXh0ZXJuYWxTaW5rSWRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgZXh0ZXJuYWxTaW5rczogUmVjb3JkPHN0cmluZywgU2luaz4gPSB7fTtcbiAgZm9yIChjb25zdCBbc2lua0lkLCBzaW5rXSBvZiBPYmplY3QuZW50cmllcyhleHRlcm5hbD8uY29uZmlnLnNpbmtzID8/IHt9KSkge1xuICAgIGxldCBuYW1lc3BhY2VkSWQgPSBgc29uYW11LWNsaToke3NpbmtJZH1gO1xuICAgIHdoaWxlIChcbiAgICAgIE9iamVjdC5oYXNPd24ocHJvamVjdFNpbmtzLCBuYW1lc3BhY2VkSWQpIHx8XG4gICAgICBPYmplY3QuaGFzT3duKGV4dGVybmFsU2lua3MsIG5hbWVzcGFjZWRJZClcbiAgICApIHtcbiAgICAgIG5hbWVzcGFjZWRJZCA9IGAke25hbWVzcGFjZWRJZH0tYDtcbiAgICB9XG4gICAgZXh0ZXJuYWxTaW5rSWRzLnNldChzaW5rSWQsIG5hbWVzcGFjZWRJZCk7XG4gICAgZXh0ZXJuYWxTaW5rc1tuYW1lc3BhY2VkSWRdID0gc2luaztcbiAgfVxuICBjb25zdCBzaW5rcyA9IHsgLi4ucHJvamVjdFNpbmtzLCAuLi5leHRlcm5hbFNpbmtzIH07XG5cbiAgY29uc3QgZmlsdGVycyA9IHtcbiAgICBcImZhc3RpZnktY29uc29sZVwiOiBkZWZhdWx0RmFzdGlmeUZpbHRlcihmYXN0aWZ5Q2F0ZWdvcnkpLFxuICAgIC4uLm9wdGlvbnMuZmlsdGVycyxcbiAgICAuLi5leHRlcm5hbD8uY29uZmlnLmZpbHRlcnMsXG4gIH07XG5cbiAgY29uc3QgZXh0ZXJuYWxMb2dnZXJzID0gKGV4dGVybmFsPy5jb25maWcubG9nZ2VycyA/PyBbXSkubWFwKChsb2dnZXIpID0+ICh7XG4gICAgLi4ubG9nZ2VyLFxuICAgIHNpbmtzOiBsb2dnZXIuc2lua3M/Lm1hcCgoc2lua0lkKSA9PiBleHRlcm5hbFNpbmtJZHMuZ2V0KHNpbmtJZCkgPz8gc2lua0lkKSxcbiAgfSkpO1xuICBjb25zdCBsb2dnZXJzID0gbmV3IFNldDxMb2dnZXJDb25maWc8c3RyaW5nLCBzdHJpbmc+PihbXG4gICAgLi4uZXh0ZXJuYWxMb2dnZXJzLFxuICAgIC4uLihvcHRpb25zLmxvZ2dlcnMgPz8gW10pLFxuICBdKTtcblxuICAvLyBsb2d0YXBl7J2YIG1ldGEgbG9nZ2VyIO2RnOyLnOulvCDruYTtmZzshLHtmZRcbiAgbG9nZ2Vycy5hZGQoe1xuICAgIGNhdGVnb3J5OiBbXCJsb2d0YXBlXCIsIFwibWV0YVwiXSxcbiAgICBsb3dlc3RMZXZlbDogXCJmYXRhbFwiLFxuICB9KTtcblxuICBpZiAoWy4uLmxvZ2dlcnNdLmV2ZXJ5KChsb2dnZXIpID0+ICFpc1NhbWVDYXRlZ29yeShbLi4uZmFzdGlmeUNhdGVnb3J5XSwgbG9nZ2VyLmNhdGVnb3J5KSkpIHtcbiAgICBsb2dnZXJzLmFkZCh7XG4gICAgICBjYXRlZ29yeTogWy4uLmZhc3RpZnlDYXRlZ29yeV0sXG4gICAgICBzaW5rczogW1wiZmFzdGlmeS1jb25zb2xlXCJdLFxuICAgICAgbG93ZXN0TGV2ZWw6IFwiaW5mb1wiLFxuICAgICAgZmlsdGVyczogW1wiZmFzdGlmeS1jb25zb2xlXCJdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsICE9PSB1bmRlZmluZWQpIGV4dGVybmFsLmFwcGxpZWQgPSB0cnVlO1xuICByZXR1cm4gY29uZmlndXJlKHsgc2lua3MsIGZpbHRlcnMsIGxvZ2dlcnM6IFsuLi5sb2dnZXJzXSwgcmVzZXQ6IHRydWUgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBd0JBLFNBQVMsa0NBQTRFO0NBQ25GLE9BQU8sV0FBVztBQUNwQjtBQUVBLFNBQWdCLGtDQUEyQztDQUN6RCxPQUFPLGdDQUFnQyxNQUFNO0FBQy9DO0FBZ0JBLFNBQVMsbUJBQW1CLGlCQUEwQztDQWlEcEUsT0FBTyxlQUFlLEVBQ3BCLGFBakR5QixjQUE2QixXQUFzQjtFQUU1RSxNQUFNLGlCQUNKLFNBQ0EsZUFDQSxpQkFDRztHQUNILElBQUksQ0FBQyxRQUFRLElBQUksV0FBVyxNQUFNLEdBQ2hDLE9BQU8sYUFBYSxhQUFhO0dBR25DLE1BQU0sV0FBd0QsY0FDM0QsUUFBUSxjQUFjLFFBQVEsU0FBUztHQUMxQyxPQUFPLGFBQWE7SUFDbEIsR0FBRztJQUNILFNBQVMsQ0FDUCxHQUFHLGNBQWMsUUFBUSxNQUFNLEdBQUcsRUFBRSxHQUNwQyxJQUFJLFFBQVEsU0FBUyxlQUFlLElBQUksaUJBQWlCLEdBQUcsSUFBSSxRQUFRLFlBQVksS0FBSyxVQUMzRjtHQUNGLENBQUM7RUFDSDtFQUVBLElBQUksQ0FBQyxlQUFlLGlCQUFpQixDQUFDLEdBQUcsT0FBTyxRQUFRLENBQUMsR0FDdkQsT0FBTyxhQUFhLE1BQU07RUFHNUIsSUFBSSxTQUFTLE9BQU8sY0FBYyxPQUFPLFdBQVcsUUFBUSxNQUFNO0dBQ2hFLE1BQU0sVUFBdUQsT0FB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
@@ -45,6 +45,15 @@ export declare class Migrator {
45
45
  * @category 분리형 마이그레이션 API
46
46
  */
47
47
  getConnectionStatus(connKey: MigrationTarget): Promise<MigrationConnectionStatus>;
48
+ /**
49
+ * 대상 DB에서 가장 최근에 적용된 migration batch를 반환합니다.
50
+ *
51
+ * @category 분리형 마이그레이션 API
52
+ */
53
+ getLatestAppliedBatch(connKey: MigrationTarget): Promise<{
54
+ batchNo: number;
55
+ files: string[];
56
+ }>;
48
57
  /**
49
58
  * 최신 상태인 기준 DB와 엔티티 정의를 비교해 생성 예정 코드를 반환합니다.
50
59
  *
@@ -95,6 +104,8 @@ export declare class Migrator {
95
104
  *
96
105
  * @category 분리형 마이그레이션 API
97
106
  */
98
- runShadowTest(options?: MigrationRunOptions): Promise<MigrationResult>;
107
+ runShadowTest(options?: MigrationRunOptions & {
108
+ target?: MigrationTarget;
109
+ }): Promise<MigrationResult>;
99
110
  }
100
111
  //# sourceMappingURL=migrator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAQ1E,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAE9B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAMJ,qBAAa,6BAA8B,SAAQ,KAAK;aAEpC,OAAO,EAAE,eAAe,GAAG,QAAQ;gBAAnC,OAAO,EAAE,eAAe,GAAG,QAAQ,EACnD,KAAK,EAAE,OAAO;CAKjB;AA4BD;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,4BAA4B;IAiBpC,yCAAyC;IACzC,sBAAsB,IAAI,eAAe,EAAE;YAc7B,yBAAyB;IAsCvC,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,qBAAqB;IAQ7B;;;;;OAKG;IACH,cAAc,IAAI,uBAAuB,EAAE;IAoB3C;;;;OAIG;IACG,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAqBnD;;;;;OAKG;IACG,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA0FvF;;;;OAIG;IACG,gBAAgB,CAAC,cAAc,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAWtE,qBAAqB;IASnC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IA4C3C;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;IAIhG;;;;;OAKG;IACG,QAAQ,CACZ,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,eAAe,CAAC;IAI3B;;;;OAIG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC;YAIb,qBAAqB;IAuDnC,OAAO,CAAC,UAAU;IAYlB;;;;;;OAMG;IACG,qBAAqB,CAAC,cAAc,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BxE,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAqErE;;;;;OAKG;IACG,aAAa,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;CA2F7E"}
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOrD,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,gBAAgB,CAAC;AAQ1E,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAE9B,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAQJ,qBAAa,6BAA8B,SAAQ,KAAK;aAEpC,OAAO,EAAE,eAAe,GAAG,QAAQ;IADrD,YACkB,OAAO,EAAE,eAAe,GAAG,QAAQ,EACnD,KAAK,EAAE,OAAO,EAIf;CACF;AA4BD;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,4BAA4B;IAapC,yCAAyC;IACzC,sBAAsB,IAAI,eAAe,EAAE,CAY1C;YAEa,yBAAyB;IAsCvC,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,qBAAqB;IAQ7B;;;;;OAKG;IACH,cAAc,IAAI,uBAAuB,EAAE,CAkB1C;IAED;;;;OAIG;IACG,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAmBlD;IAED;;;;;OAKG;IACG,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAwFtF;IAED;;;;OAIG;IACG,qBAAqB,CACzB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CA8C/C;IAED;;;;OAIG;IACG,gBAAgB,CAAC,cAAc,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CASnF;YAEa,qBAAqB;IASnC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CA0C1C;IAED;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAE/F;IAED;;;;;OAKG;IACG,QAAQ,CACZ,OAAO,EAAE,eAAe,EAAE,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAE1B;IAED;;;;OAIG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC,CAE1B;YAEa,qBAAqB;IAuDnC,OAAO,CAAC,UAAU;IAYlB;;;;;;OAMG;IACG,qBAAqB,CAAC,cAAc,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB7E;IAEK,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmEpE;IAED;;;;;OAKG;IACG,aAAa,CACjB,OAAO,CAAC,EAAE,mBAAmB,GAAG;QAAE,MAAM,CAAC,EAAE,eAAe,CAAA;KAAE,GAC3D,OAAO,CAAC,eAAe,CAAC,CAwG1B;CACF"}
@@ -74,8 +74,7 @@ var init_migrator = __esmMin((() => {
74
74
  Migrator = class {
75
75
  isMissingMigrationTableError(error) {
76
76
  if (!isObjectValue(error) || error === null) return false;
77
- const maybePostgresError = error;
78
- return maybePostgresError.code === "42P01" && isStringValue(maybePostgresError.message) && maybePostgresError.message.includes("knex_migrations");
77
+ return error.code === "42P01";
79
78
  }
80
79
  /** 현재 실행 환경에서 허용된 마이그레이션 대상 키를 반환합니다. */
81
80
  getMigrationTargetKeys() {
@@ -272,6 +271,53 @@ var init_migrator = __esmMin((() => {
272
271
  }
273
272
  }
274
273
  /**
274
+ * 대상 DB에서 가장 최근에 적용된 migration batch를 반환합니다.
275
+ *
276
+ * @category 분리형 마이그레이션 API
277
+ */
278
+ async getLatestAppliedBatch(connKey) {
279
+ this.assertMigrationTarget(connKey);
280
+ const knexOptions = Sonamu.dbConfig[connKey];
281
+ const connection = knexOptions.connection;
282
+ const tConn = createKnexInstance({
283
+ ...knexOptions,
284
+ connection: {
285
+ ...connection,
286
+ connectionTimeoutMillis: MIGRATION_CONN_TIMEOUT_MS
287
+ },
288
+ pool: {
289
+ ...knexOptions.pool,
290
+ min: 0,
291
+ acquireTimeoutMillis: MIGRATION_CONN_TIMEOUT_MS,
292
+ createTimeoutMillis: MIGRATION_CONN_TIMEOUT_MS,
293
+ propagateCreateError: true
294
+ }
295
+ });
296
+ try {
297
+ const tableName = knexOptions.migrations?.tableName ?? "knex_migrations";
298
+ const schemaName = knexOptions.migrations?.schemaName;
299
+ const migrationsTable = schemaName === void 0 ? tConn(tableName) : tConn(tableName).withSchema(schemaName);
300
+ const latest = await migrationsTable.clone().select("batch").orderBy("batch", "desc").first();
301
+ if (latest === void 0) return {
302
+ batchNo: 0,
303
+ files: []
304
+ };
305
+ const rows = await migrationsTable.clone().select("name").where("batch", latest.batch).orderBy("id", "asc");
306
+ return {
307
+ batchNo: latest.batch,
308
+ files: rows.map(({ name }) => name.replace(/\.ts$/, ""))
309
+ };
310
+ } catch (caught) {
311
+ if (this.isMissingMigrationTableError(caught)) return {
312
+ batchNo: 0,
313
+ files: []
314
+ };
315
+ throw caught;
316
+ } finally {
317
+ await tConn.destroy();
318
+ }
319
+ }
320
+ /**
275
321
  * 최신 상태인 기준 DB와 엔티티 정의를 비교해 생성 예정 코드를 반환합니다.
276
322
  *
277
323
  * @category 분리형 마이그레이션 API
@@ -436,43 +482,44 @@ var init_migrator = __esmMin((() => {
436
482
  * @category 분리형 마이그레이션 API
437
483
  */
438
484
  async runShadowTest(options) {
439
- const baseTestConn = Sonamu.dbConfig.test.connection;
440
- const workerId = process.env.SONAMU_WORKER_DB === "true" ? process.env.VITEST_POOL_ID : null;
441
- const templateDatabase = workerId !== null ? `${baseTestConn.database}_${workerId ?? "1"}` : baseTestConn.database;
442
- const tdbConn = {
443
- ...baseTestConn,
444
- database: templateDatabase
445
- };
485
+ const target = options?.target ?? "test";
486
+ if (target !== "test" && target !== "fixture") throw Object.assign(/* @__PURE__ */ new Error(`지원하지 않는 Shadow 마이그레이션 대상입니다: ${target}`), {
487
+ code: "INVALID_SHADOW_MIGRATION_TARGET",
488
+ target
489
+ });
490
+ const shadowTarget = target;
491
+ const baseTargetConn = Sonamu.dbConfig[shadowTarget].connection;
492
+ const configuredDatabase = baseTargetConn.database;
493
+ if (!configuredDatabase) throw Object.assign(/* @__PURE__ */ new Error(`Shadow 대상 DB 이름이 없습니다: ${shadowTarget}`), {
494
+ code: "INVALID_SHADOW_DATABASE_CONFIG",
495
+ target: shadowTarget
496
+ });
497
+ const workerId = shadowTarget === "test" && process.env.SONAMU_WORKER_DB === "true" ? process.env.VITEST_POOL_ID : null;
498
+ const templateDatabase = workerId !== null ? `${configuredDatabase}_${workerId ?? "1"}` : configuredDatabase;
446
499
  const shadowDatabase = `${templateDatabase}__migration_shadow`;
500
+ const createShadowConnection = (database) => createKnexInstance({
501
+ ...Sonamu.dbConfig[shadowTarget],
502
+ connection: {
503
+ ...baseTargetConn,
504
+ database
505
+ }
506
+ });
447
507
  if (isTest()) {
448
508
  await DB.clearTestTransaction();
449
509
  await DB.destroy();
450
510
  }
451
- const tdb = createKnexInstance({
452
- ...Sonamu.dbConfig.test,
453
- connection: {
454
- ...baseTestConn,
455
- database: "postgres"
456
- }
457
- });
511
+ const tdb = createShadowConnection("postgres");
458
512
  try {
459
513
  !isTest() && console.log(chalk.magenta(`${shadowDatabase} 삭제`));
460
- await tdb.raw(`DROP DATABASE IF EXISTS ${shadowDatabase}`);
514
+ await tdb.raw("DROP DATABASE IF EXISTS ??", [shadowDatabase]);
461
515
  await tdb.raw(`
462
516
  SELECT pg_terminate_backend(pg_stat_activity.pid)
463
517
  FROM pg_stat_activity
464
- WHERE datname = '${tdbConn.database}'
518
+ WHERE datname = ?
465
519
  AND pid <> pg_backend_pid();
466
- `);
467
- await tdb.raw(`CREATE DATABASE ${shadowDatabase} TEMPLATE ${tdbConn.database}`);
468
- const sdb = createKnexInstance({
469
- ...Sonamu.dbConfig.test,
470
- connection: {
471
- ...tdbConn,
472
- database: shadowDatabase,
473
- password: tdbConn.password
474
- }
475
- });
520
+ `, [templateDatabase]);
521
+ await tdb.raw("CREATE DATABASE ?? TEMPLATE ??", [shadowDatabase, templateDatabase]);
522
+ const sdb = createShadowConnection(shadowDatabase);
476
523
  try {
477
524
  const progress = this.createProgressHooks("shadow", "shadow", options);
478
525
  const [batchNo, applied] = await sdb.migrate.latest(progress);
@@ -501,7 +548,7 @@ var init_migrator = __esmMin((() => {
501
548
  } finally {
502
549
  !isTest() && console.log(chalk.magenta(`${shadowDatabase} 삭제`));
503
550
  try {
504
- await tdb.raw(`DROP DATABASE IF EXISTS ${shadowDatabase}`);
551
+ await tdb.raw("DROP DATABASE IF EXISTS ??", [shadowDatabase]);
505
552
  } catch (e) {
506
553
  console.error("Shadow DB 정리 실패:", e);
507
554
  } finally {
@@ -515,4 +562,4 @@ var init_migrator = __esmMin((() => {
515
562
  init_migrator();
516
563
  export { MigrationTargetExecutionError, Migrator, init_migrator };
517
564
 
518
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgR2VuTWlncmF0aW9uQ29kZSwgdHlwZSBNaWdyYXRpb25TZXQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzTG9jYWwsIGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbHRlckNvZGUsIGdlbmVyYXRlQ3JlYXRlQ29kZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHsgZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSB9IGZyb20gXCIuL21pZ3JhdGlvbi1zZXRcIjtcbmltcG9ydCB7IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgfSBmcm9tIFwiLi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmltcG9ydCB7IFNsYWNrQ29uZmlybSB9IGZyb20gXCIuL3NsYWNrLWNvbmZpcm1cIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ublN0cmluZyxcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uTWV0YSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzLFxuICB0eXBlIE1pZ3JhdGlvblByb2dyZXNzRXZlbnQsXG4gIHR5cGUgTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgdHlwZSBNaWdyYXRpb25TdGF0dXMsXG4gIHR5cGUgTWlncmF0aW9uVGFyZ2V0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBNaWdyYXRpb25SZXN1bHQgPSB7XG4gIGNvbm5LZXk6IHN0cmluZztcbiAgYmF0Y2hObzogbnVtYmVyO1xuICBhcHBsaWVkOiBzdHJpbmdbXTtcbn1bXTtcblxuZnVuY3Rpb24gcGFkRGF0ZVBhcnQobnVtYmVyOiBudW1iZXIsIHNpemU6IG51bWJlciA9IDIpOiBzdHJpbmcge1xuICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucGFkU3RhcnQoc2l6ZSwgXCIwXCIpO1xufVxuXG5leHBvcnQgY2xhc3MgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfCBcInNoYWRvd1wiLFxuICAgIGNhdXNlOiB1bmtub3duLFxuICApIHtcbiAgICBzdXBlcihjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSkpO1xuICAgIHRoaXMubmFtZSA9IFwiTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG4vLyDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOcIOyhsO2ajCDsi5wgREIg7Jew6rKwIO2ZleyduCDtg4DsnoTslYTsm4MobXMpLlxuLy8gY3JlYXRlS25leEluc3RhbmNl7J2YIOy7pOuEpeyFmCDtmo3rk50g7YOA7J6E7JWE7JuDKDMw7LSIKeyXkCBzdGF0dXMvbGlzdC9jdXJyZW50VmVyc2lvbuydtFxuLy8g6rCB6rCBIOqxuOumrOuptCBDTEkvVUnqsIAg7LWc64yAIOyImOyLrSDstIggaGFuZ+2VnOuLpC4g7KCV7IOBIOydkeuLteydgCDsiJjrsLEgbXPsnbTrr4DroZwgNey0iOuptCDstqnrtoTtlZjri6QuXG5jb25zdCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IExPQ0FMX0RCX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcblxuLyoqXG4gKiDso7zslrTsp4QgUHJvbWlzZeqwgCBtcyDslYjsl5Ag7JmE66OM65CY7KeAIOyViuycvOuptCBvblRpbWVvdXQg7JeQ65+s66GcIHJlamVjdO2VnOuLpC5cbiAqIOybkOuzuCBQcm9taXNlIOyekOyytOuKlCDqs4Tsho0g7KeE7ZaJ65CY66+A66GcLCDtmLjstpzsuKHsl5DshJwg7Luk64Sl7IWYIOygleumrChkZXN0cm95KeulvCDssYXsnoTsp4Tri6QuXG4gKi9cbmZ1bmN0aW9uIHdpdGhUaW1lb3V0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIG1zOiBudW1iZXIsIG9uVGltZW91dDogKCkgPT4gRXJyb3IpOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG9uVGltZW91dCgpKSwgbXMpO1xuICAgIHByb21pc2UudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTm90ZSAyMDI2LTA4LTI2LCDrs5HspIBcbiAqIOydtCDtgbTrnpjsiqTsl5DshJwgZGVwcmVjYXRlZCDrtpnslrTsnojripQg7Lmc6rWs65Ok7J2AIO2YhCBDTEnrpbwg7JyE7ZWcIO2VmOychCDtmLjtmZjsnbTri4gsXG4gKiBDTEkg66as7Yyp7Yag66eBIOyLnOygkOyXkOyEnCDsoJzqsbDtlbTso7zshZTrj4Qg66y067Cp7ZWp64uI64ukLlxuICovXG5leHBvcnQgY2xhc3MgTWlncmF0b3Ige1xuICBwcml2YXRlIGlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3I8VmFsdWU+KGVycm9yOiBWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNPYmplY3RWYWx1ZShlcnJvcikgfHwgZXJyb3IgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXliZVBvc3RncmVzRXJyb3IgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBlcnJvciBhcyB7XG4gICAgICAgIGNvZGU/OiB1bmtub3duO1xuICAgICAgICBtZXNzYWdlPzogdW5rbm93bjtcbiAgICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIG1heWJlUG9zdGdyZXNFcnJvci5jb2RlID09PSBcIjQyUDAxXCIgJiZcbiAgICAgIGlzU3RyaW5nVmFsdWUobWF5YmVQb3N0Z3Jlc0Vycm9yLm1lc3NhZ2UpICYmXG4gICAgICBtYXliZVBvc3RncmVzRXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcImtuZXhfbWlncmF0aW9uc1wiKVxuICAgICk7XG4gIH1cblxuICAvKiog7ZiE7J6sIOyLpO2WiSDtmZjqsr3sl5DshJwg7ZeI7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDrjIDsg4Eg7YKk66W8IOuwmO2ZmO2VqeuLiOuLpC4gKi9cbiAgZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpOiBNaWdyYXRpb25UYXJnZXRbXSB7XG4gICAgY29uc3QgY29ubktleXMgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBPYmplY3Qua2V5cyhcbiAgICAgICAgU29uYW11LmRiQ29uZmlnLFxuICAgICAgKS5maWx0ZXIoKGtleSkgPT4gIWtleS5lbmRzV2l0aChcIl9yZWFkb25seVwiKSkgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgcmV0dXJuIGNvbm5LZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gY29ubktleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KFxuICAgIGNvbm5zOiB7IGNvbm5LZXk6IGtleW9mIFNvbmFtdURCQ29uZmlnOyBrbmV4OiBLbmV4IH1bXSxcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyBjb25uS2V5LCBrbmV4IH0gb2YgY29ubnMpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKGFjdGlvbiwgY29ubktleSwgb3B0aW9ucyk7XG4gICAgICBsZXQgbWlncmF0aW9uUmVzdWx0OiBbbnVtYmVyLCBzdHJpbmdbXV07XG4gICAgICB0cnkge1xuICAgICAgICBtaWdyYXRpb25SZXN1bHQgPVxuICAgICAgICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiXG4gICAgICAgICAgICA/IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpXG4gICAgICAgICAgICA6IGF3YWl0IGtuZXgubWlncmF0ZS5yb2xsYmFjayhwcm9ncmVzcyk7XG4gICAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgICAgLy8gbGlmZWN5Y2xlIGhvb2sg7J207KCE7J2YIOyXsOqysMK3bG9ja8K366qp66GdIOyhsO2ajCDsi6TtjKjrj4Qg7Iuk7KCcIOuMgOyDgSBEQuyXkCDqt4Dsho3tlanri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25UYXJnZXRFeGVjdXRpb25FcnJvcihjb25uS2V5LCBjYXVnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gbWlncmF0aW9uUmVzdWx0O1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBjb25uS2V5LFxuICAgICAgICBiYXRjaE5vLFxuICAgICAgICBhcHBsaWVkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgZmlsZXM6IGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgbWlncmF0aW9uTmFtZTxWYWx1ZT4obWlncmF0aW9uOiBWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGlzU3RyaW5nVmFsdWUobWlncmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUobWlncmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUobWlncmF0aW9uKSAmJiBtaWdyYXRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbWlncmF0aW9uIGFzIHtcbiAgICAgICAgICBmaWxlPzogdW5rbm93bjtcbiAgICAgICAgICBuYW1lPzogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNhbmRpZGF0ZS5maWxlKSkge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjYW5kaWRhdGUuZmlsZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShjYW5kaWRhdGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoY2FuZGlkYXRlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG1pZ3JhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm9ncmVzcyhvcHRpb25zOiBNaWdyYXRpb25SdW5PcHRpb25zIHwgdW5kZWZpbmVkLCBldmVudDogTWlncmF0aW9uUHJvZ3Jlc3NFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zPy5vblByb2dyZXNzPy4oZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDsp4TtlonrpaAg7IaM67mE7J6Q7J2YIOyLpO2MqOqwgCDsnbTrr7gg7Iuc7J6R7ZWcIERCIOyekeyXheqzvCDsoJXrpqzrpbwg67Cp7ZW07ZWY66m0IOyViCDrkKnri4jri6QuXG4gICAgICBjb25zb2xlLndhcm4oXCJNaWdyYXRpb24gcHJvZ3Jlc3Mgb2JzZXJ2ZXIgZmFpbGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQcm9ncmVzc0hvb2tzKFxuICAgIGFjdGlvbjogTWlncmF0aW9uQWN0aW9uLFxuICAgIGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCB8IFwic2hhZG93XCIsXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IEtuZXguTWlncmF0b3JDb25maWdXaXRoTGlmZWN5Y2xlSG9va3Mge1xuICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbWl0RmlsZSA9IDxWYWx1ZT4odHlwZTogXCJmaWxlLXN0YXJ0XCIgfCBcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uOiBWYWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMubWlncmF0aW9uTmFtZShtaWdyYXRpb24pO1xuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLm1heChmaWxlcy5pbmRleE9mKGZpbGUpLCAwKTtcbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb25uS2V5LFxuICAgICAgICBmaWxlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdG90YWw6IGZpbGVzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlQWxsOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgZmlsZXMgPSBtaWdyYXRpb25zLm1hcCgobWlncmF0aW9uKSA9PiB0aGlzLm1pZ3JhdGlvbk5hbWUobWlncmF0aW9uKSk7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHsgdHlwZTogXCJ0YXJnZXQtc3RhcnRcIiwgYWN0aW9uLCBjb25uS2V5LCBmaWxlcyB9KTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVFYWNoOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgbWlncmF0aW9ucy5mb3JFYWNoKChtaWdyYXRpb24pID0+IGVtaXRGaWxlKFwiZmlsZS1zdGFydFwiLCBtaWdyYXRpb24pKTtcbiAgICAgIH0sXG4gICAgICBhZnRlckVhY2g6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBtaWdyYXRpb25zLmZvckVhY2goKG1pZ3JhdGlvbikgPT4gZW1pdEZpbGUoXCJmaWxlLWV4ZWN1dGVkXCIsIG1pZ3JhdGlvbikpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5pbmNsdWRlcyhjb25uS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIHRhcmdldCBpcyBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke1N0cmluZyhjb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuMgOyDgSDsu6TrhKXshZjsnZgg7KCV7KCBIOuplO2DgOuNsOydtO2EsOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIERC7JeQIOyXsOqysO2VmOyngCDslYrsnLzrr4DroZwgQ0xJ7JmAIFdlYuydtCDsg4Htg5wg7KGw7ZqMIOyghOyXkCDsponsi5wg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvbnMoKTogTWlncmF0aW9uQ29ubmVjdGlvbk1ldGFbXSB7XG4gICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgIHJldHVybiB0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5tYXAoKGNvbm5LZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uS2V5XG4gICAgICAgIF0uY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIGNvbnN0IGhvc3QgPSBjb25uZWN0aW9uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIG5hbWU6IFN0cmluZyhjb25uS2V5KSxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydDogY29ubmVjdGlvbi5wb3J0ID8/IDU0MzIsXG4gICAgICAgIGRhdGFiYXNlOiBjb25uZWN0aW9uLmRhdGFiYXNlID8/IFwiXCIsXG4gICAgICAgIHJlbW90ZTogIUxPQ0FMX0RCX0hPU1RTLmhhcyhob3N0LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsOiBzbGFja0NvbmZpcm0uaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKGNvbm5LZXkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshozsiqTsl5Ag7KG07J6s7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDtjIzsnbwg66qp66Gd7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7Luk64Sl7IWYIO2VmOuCmOydmCDtmITsnqwg67KE7KCE6rO8IHBlbmRpbmcg66qp66Gd7J2EIOuPheumveyggeycvOuhnCDsobDtmoztlanri4jri6QuXG4gICAqIOyXrOufrCDrjIDsg4HsnYAg7Zi47Lac7J6Q6rCAIOuzkeugrOuhnCDsobDrpr3tlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8TWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cz4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIC8vIFNBRkVUWTogS25leOqwgCDsoJzqs7XtlZwgUG9zdGdyZVNRTCDsl7DqsrAg6rWs7ISx7J2EIOuzteyCrO2VtCB0aW1lb3V0IO2VhOuTnOunjCDrja7slrTsk7Tri6QuXG4gICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5lY3Rpb24sXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHtcbiAgICAgICAgLi4ua25leE9wdGlvbnMucG9vbCxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgY3JlYXRlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgcHJvcGFnYXRlQ3JlYXRlRXJyb3I6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KHRDb25uLnJhdyhcInNlbGVjdCAxXCIpLCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgICAgYERCIOyXsOqysCDsi5zqsIQg7LSI6rO8ICgke01JR1JBVElPTl9DT05OX1RJTUVPVVRfTVN9bXMpIOKAlCAke2Nvbm5lY3Rpb24uaG9zdH06JHtjb25uZWN0aW9uLnBvcnR9LyR7Y29ubmVjdGlvbi5kYXRhYmFzZX1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc3RhdHVzOiBudW1iZXIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlLnN0YXR1cygpLmNhdGNoKChjYXVnaHQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihjYXVnaHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvZGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvciA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgICAgcmV0dXJuIFwiZXJyb3JcIiBhcyBjb25zdDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGVuZGluZzogc3RyaW5nW10gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKS50aGVuKFxuICAgICAgICAoWywgZmlsZXNdOiBbdW5rbm93bltdLCB7IGZpbGU6IHN0cmluZyB9W11dKSA9PlxuICAgICAgICAgIGZpbGVzLm1hcCgoeyBmaWxlIH0pID0+IGZpbGUucmVwbGFjZSgvXFwudHMkLywgXCJcIikpLFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVzLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgXCJub25lXCIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlXG4gICAgICAgIC5jdXJyZW50VmVyc2lvbigpXG4gICAgICAgIC5jYXRjaCgoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwibm9uZVwiIGFzIGNvbnN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBcImVycm9yXCIgYXMgY29uc3Q7XG4gICAgICAgIH0pO1xuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpzdGF0dXNcIiwgc3RhdHVzKTtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25TdGF0dXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXMgPSB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHBlbmRpbmcsXG4gICAgICAgIGxhdGVuY3lNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIGNvbm5lY3Rpb25TdGF0dXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIHJldHVybiBjb25uZWN0aW9uU3RhdHVzO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBjYXVnaHQgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodC5tZXNzYWdlIDogU3RyaW5nKGNhdWdodCk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgJHtTdHJpbmcoY29ubktleSl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuXFxuJHtlcnJvcn1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBcImVycm9yXCIsXG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBwZW5kaW5nOiBbXSxcbiAgICAgICAgbGF0ZW5jeU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB3aXRoVGltZW91dCh0Q29ubi5kZXN0cm95KCksIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZGVzdHJveSB0aW1lb3V0XCIpO1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDstZzsi6Ag7IOB7YOc7J24IOq4sOykgCBEQuyZgCDsl5Tti7Dti7Ag7KCV7J2Y66W8IOu5hOq1kO2VtCDsg53shLEg7JiI7KCVIOy9lOuTnOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgZ2V0UHJlcGFyZWRDb2Rlcyhjb21wYXJlQ29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3Rpb25TdGF0dXMoY29tcGFyZUNvbm5LZXkpO1xuICAgIGlmIChzdGF0dXMuc3RhdHVzICE9PSAwIHx8IHN0YXR1cy5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaWdyYXRpb24gY29tcGFyaXNvbiByZXF1aXJlcyBhbiB1cC10by1kYXRlIGRhdGFiYXNlOiAke1N0cmluZyhjb21wYXJlQ29ubktleSl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQpIHtcbiAgICBjb25zdCBjb21wYXJlREIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnW2NvbXBhcmVDb25uS2V5XSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbXBhcmVNaWdyYXRpb25zKGNvbXBhcmVEQik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNvbXBhcmVEQi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIOyLoOq3nCBVSeyXkOyEnOuKlCDsu6TrhKXshZjrs4Qg7KGw7ZqMIEFQSeulvCDsgqzsmqntlanri4jri6QuXG4gICAqIOq4sOyhtCBDTEnsmYAg7Iqk7YGs66a97Yq4IO2YuO2ZmOydhCDsnITtlbQg7KCE7LK0IOyDge2DnOulvCDsobDrpr3tlanri4jri6QuXG4gICAqIEBjYXRlZ29yeSDtmLjtmZjsmqkg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8TWlncmF0aW9uU3RhdHVzPiB7XG4gICAgY29uc3QgW2NvZGVzLCBjb25uZWN0aW9uc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLmdldE1pZ3JhdGlvbkNvZGVzKCksXG4gICAgICBQcm9taXNlLnJlc29sdmUodGhpcy5nZXRDb25uZWN0aW9ucygpKSxcbiAgICBdKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvZGVzXCIsIGNvZGVzKTtcblxuICAgIGNvbnN0IGNvbm5lY3Rpb25TdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29ubmVjdGlvbnMubWFwKCh7IGNvbm5LZXkgfSkgPT4gdGhpcy5nZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5LZXkpKSxcbiAgICApO1xuICAgIGNvbnN0IGNvbm5zID0gY29ubmVjdGlvbnMubWFwKChjb25uZWN0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzID0gY29ubmVjdGlvblN0YXR1c2VzW2luZGV4XTtcbiAgICAgIGFzc2VydChzdGF0dXMgIT09IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBjb25maWd1cmVkID1cbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXUuZGJDb25maWdbXG4gICAgICAgICAgY29ubmVjdGlvbi5jb25uS2V5XG4gICAgICAgIF0uY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGNvbm5lY3Rpb24ubmFtZSxcbiAgICAgICAgY29ubktleTogY29ubmVjdGlvbi5jb25uS2V5LFxuICAgICAgICBjb25uU3RyaW5nOlxuICAgICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gYHBnOi8vJHtjb25maWd1cmVkLnVzZXIgPz8gXCJcIn1AJHtjb25maWd1cmVkLmhvc3R9OiR7Y29uZmlndXJlZC5wb3J0fS8ke2NvbmZpZ3VyZWQuZGF0YWJhc2V9YCBhcyBDb25uU3RyaW5nLFxuICAgICAgICBjdXJyZW50VmVyc2lvbjogc3RhdHVzLmN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXM6IHN0YXR1cy5zdGF0dXMsXG4gICAgICAgIHBlbmRpbmc6IHN0YXR1cy5wZW5kaW5nLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOmNvbm5zXCIsIGNvbm5zKTtcblxuICAgIGNvbnN0IGNvbXBhcmVDb25uID0gY29ubmVjdGlvblN0YXR1c2VzLmZpbmQoXG4gICAgICAoeyBzdGF0dXMsIGVycm9yIH0pID0+IHN0YXR1cyA9PT0gMCAmJiBlcnJvciA9PT0gdW5kZWZpbmVkLFxuICAgICk7XG4gICAgY29uc3QgcHJlcGFyZWRDb2RlcyA9XG4gICAgICBjb21wYXJlQ29ubiA9PT0gdW5kZWZpbmVkID8gW10gOiBhd2FpdCB0aGlzLmNvbXBhcmVXaXRoQ29ubmVjdGlvbihjb21wYXJlQ29ubi5jb25uS2V5KTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29ubnMsXG4gICAgICBjb2RlcyxcbiAgICAgIHByZXBhcmVkQ29kZXMsXG4gICAgICBlcnJvcjogY29ubmVjdGlvblN0YXR1c2VzLmZpbmQoKHsgZXJyb3IgfSkgPT4gZXJyb3IgIT09IHVuZGVmaW5lZCk/LmVycm9yLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog64yA7IOBIERC7JeQIHBlbmRpbmcg66eI7J206re466CI7J207IWY7J2EIOyggeyaqe2VqeuLiOuLpC5cbiAgICogQ0xJ7JmAIFdlYuydgCDqsJnsnYAg66mU7ISc65Oc66W8IOyCrOyaqe2VmOupsCwgV2Vi7J2AIGBvblByb2dyZXNzYOulvCBzdHJlYW3snLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGFwcGx5KHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLCBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQWN0aW9uV2l0aFByb2dyZXNzKFwiYXBwbHlcIiwgdGFyZ2V0cywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog64yA7IOBIERC7JeQ7IScIOqwgOyepSDstZzqt7wgbWlncmF0aW9uIGJhdGNo66W8IOuhpOuwse2VqeuLiOuLpC5cbiAgICogQ0xJ7JmAIFdlYuydgCDqsJnsnYAg66mU7ISc65Oc66W8IOyCrOyaqe2VmOupsCwgV2Vi7J2AIGBvblByb2dyZXNzYOulvCBzdHJlYW3snLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIHJvbGxiYWNrKFxuICAgIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bkFjdGlvbldpdGhQcm9ncmVzcyhcInJvbGxiYWNrXCIsIHRhcmdldHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIGFjdGlvbiDrrLjsnpDsl7Qg64yA7IugIHtAbGluayBhcHBseX0g65iQ64qUIHtAbGluayByb2xsYmFja33snYQg7KeB7KCRIOyCrOyaqe2VqeuLiOuLpC5cbiAgICog6riw7KG0IOyZuOu2gCDtmLjstpzsnZgg7ZWY7JyEIO2YuO2ZmOunjOydhCDsnITtlbQg7Jyg7KeA7ZWp64uI64ukLlxuICAgKiBAY2F0ZWdvcnkg7Zi47ZmY7JqpIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIHJ1bkFjdGlvbihcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW10sXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIGFjdGlvbiA9PT0gXCJhcHBseVwiID8gdGhpcy5hcHBseSh0YXJnZXRzKSA6IHRoaXMucm9sbGJhY2sodGFyZ2V0cyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkFjdGlvbldpdGhQcm9ncmVzcyhcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOmFjdGlvblwiLCBhY3Rpb24pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246dGFyZ2V0c1wiLCB0YXJnZXRzKTtcblxuICAgIGNvbnN0IGFsbG93ZWRUYXJnZXRzID0gbmV3IFNldCh0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKSk7XG4gICAgY29uc3QgZGlzYWxsb3dlZFRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhYWxsb3dlZFRhcmdldHMuaGFzKHRhcmdldCkpO1xuICAgIGlmIChkaXNhbGxvd2VkVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaWdyYXRpb24gdGFyZ2V0cyBhcmUgbm90IGFsbG93ZWQgaW4gTk9ERV9FTlY9JHtnZXRTb25hbXVFbnZpcm9ubWVudCgpfTogJHtkaXNhbGxvd2VkVGFyZ2V0cy5qb2luKFwiLCBcIil9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHVuaXEga25leCBjb25maWdzXG4gICAgY29uc3QgY29uZmlncyA9IHVuaXF1ZShcbiAgICAgIHRhcmdldHNcbiAgICAgICAgLm1hcCgodGFyZ2V0KSA9PiAoe1xuICAgICAgICAgIGNvbm5LZXk6IHRhcmdldCxcbiAgICAgICAgICBvcHRpb25zOiBTb25hbXUuZGJDb25maWdbdGFyZ2V0XSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5maWx0ZXIoKGMpID0+IGMub3B0aW9ucyAhPT0gdW5kZWZpbmVkKSxcbiAgICAgICh7IG9wdGlvbnM6IGRiT3B0aW9ucyB9KSA9PlxuICAgICAgICBgJHsvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChkYk9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykuaG9zdH06JHtcbiAgICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICAgIGRiT3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnXG4gICAgICAgICAgKS5wb3J0ID8/IDU0MzJcbiAgICAgICAgfS8key8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGRiT3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5kYXRhYmFzZX1gLFxuICAgICk7XG5cbiAgICAvLyBnZXQgY29ubmVjdGlvbnNcbiAgICBjb25zdCBjb25ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29uZmlncy5tYXAoYXN5bmMgKGNvbmZpZykgPT4gKHtcbiAgICAgICAgY29ubktleTogY29uZmlnLmNvbm5LZXksXG4gICAgICAgIGtuZXg6IGNyZWF0ZUtuZXhJbnN0YW5jZShjb25maWcub3B0aW9ucyksXG4gICAgICB9KSksXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bk1pZ3JhdGlvbnNTZXF1ZW50aWFsbHkoY29ubnMsIGFjdGlvbiwgb3B0aW9ucyk7XG5cbiAgICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246cmVzdWx0XCIsIHJlc3VsdCk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjb25ucy5tYXAoKHsga25leCB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGtuZXguZGVzdHJveSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZW5EYXRlVGFnKGluZGV4OiBudW1iZXIsIGJhc2VEYXRlOiBEYXRlID0gbmV3IERhdGUoKSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGJhc2VEYXRlLmdldFRpbWUoKSArIGluZGV4ICogMTAwMCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0TW9udGgoKSArIDEpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0RGF0ZSgpKSArXG4gICAgICBwYWREYXRlUGFydChkYXRlLmdldEhvdXJzKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0TWludXRlcygpKSArXG4gICAgICBwYWREYXRlUGFydChkYXRlLmdldFNlY29uZHMoKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogU29uYW11IFVJ7JeQ7IScIOyCrOyaqeuQqeuLiOuLpC5cbiAgICpcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5wg7YyM7J28IOqwnOyImFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBwcmVwYXJlZENvZGVzID1cbiAgICAgIGNvbXBhcmVDb25uS2V5ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyAoYXdhaXQgdGhpcy5nZXRTdGF0dXMoKSkucHJlcGFyZWRDb2Rlc1xuICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0UHJlcGFyZWRDb2Rlcyhjb21wYXJlQ29ubktleSk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlUHJlcGFyZWRDb2RlczpwcmVwYXJlZENvZGVzXCIsIHByZXBhcmVkQ29kZXMpO1xuICAgIGlmIChwcmVwYXJlZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJcXG7tmITsnqwg66qo65GQIOyLse2BrOuQnCDsg4Htg5zsnoXri4jri6QuXCIpKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIOyLpOygnCDsvZTrk5wg7IOd7ISxXG4gICAgY29uc3QgbWlncmF0aW9uc0RpciA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL21pZ3JhdGlvbnNgO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHBjb2RlXSBvZiBwcmVwYXJlZENvZGVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHBjb2RlLmZvcm1hdHRlZCkge1xuICAgICAgICBjb25zdCBkYXRlVGFnID0gdGhpcy5nZW5EYXRlVGFnKGluZGV4KTtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgJHttaWdyYXRpb25zRGlyfS8ke2RhdGVUYWd9XyR7cGNvZGUudGl0bGV9LnRzYDtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBwY29kZS5mb3JtYXR0ZWQpO1xuICAgICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYE1JR1JBVElPTiBDUkVBVEVEICR7ZmlsZVBhdGh9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcmVwYXJlZENvZGVzLmxlbmd0aDtcbiAgfVxuXG4gIGFzeW5jIGNvbXBhcmVNaWdyYXRpb25zKGNvbXBhcmVEQjogS25leCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gICAgLy8gRW50aXR5IOyInO2ajO2VmOyXrCDsi7HtgaxcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iUIO2PrO2VqO2VmOyXrCBFbnRpdHnsl5DshJwgTWlncmF0aW9uU2V0IOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eVNldHNXaXRoSm9pblRhYmxlID0gZW50aXR5SWRzXG4gICAgICAuZmlsdGVyKChlbnRpdHlJZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmxlbmd0aCA+IDApXG4gICAgICAubWFwKChlbnRpdHlJZCkgPT4gZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eShFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkpKTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lOunjCDstpTstpxcbiAgICBjb25zdCBqb2luVGFibGVzV2l0aER1cCA9IGVudGl0eVNldHNXaXRoSm9pblRhYmxlLmZsYXRNYXAoKGVudGl0eVNldCkgPT4gZW50aXR5U2V0LmpvaW5UYWJsZXMpO1xuICAgIC8vIOykkeuztSDsoJzqsbAgKOykkeuzteyduCDqsr3smrAgaW5kZXhlc+ulvCDrs5HtlakpXG4gICAgY29uc3Qgam9pblRhYmxlcyA9IE9iamVjdC52YWx1ZXMoZ3JvdXAoam9pblRhYmxlc1dpdGhEdXAsIChqdCkgPT4ganQudGFibGUpKS5tYXAoKHRhYmxlcykgPT4ge1xuICAgICAgYXNzZXJ0KHRhYmxlcyAhPT0gdW5kZWZpbmVkLCBcInRhYmxlcyBpcyB1bmRlZmluZWRcIik7XG4gICAgICBpZiAodGFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGFibGVzWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGFibGVzWzBdLFxuICAgICAgICBpbmRleGVzOiB1bmlxdWUoXG4gICAgICAgICAgdGFibGVzLmZsYXRNYXAoKHQpID0+IHQuaW5kZXhlcyksXG4gICAgICAgICAgKGluZGV4KSA9PiBbaW5kZXgudHlwZSwgLi4uaW5kZXguY29sdW1uc10uam9pbihcIi1cIiksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iUIO2PrO2VqO2VmOyXrCBNaWdyYXRpb25TZXQg67Cw7Je0XG4gICAgY29uc3QgZW50aXR5U2V0czogTWlncmF0aW9uU2V0W10gPSBbLi4uZW50aXR5U2V0c1dpdGhKb2luVGFibGUsIC4uLmpvaW5UYWJsZXNdO1xuXG4gICAgY29uc3QgY29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXSA9IFtdO1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0eVNldHMubGVuZ3RoOyBpICs9IGJhdGNoU2l6ZSkge1xuICAgICAgY29uc3QgYmF0Y2hDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBlbnRpdHlTZXRzLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpLm1hcChhc3luYyAoZW50aXR5U2V0KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGJTZXQgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldE1pZ3JhdGlvblNldEZyb21EQihcbiAgICAgICAgICAgIGNvbXBhcmVEQixcbiAgICAgICAgICAgIGVudGl0eVNldC50YWJsZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIE5haXRlLnQoYG1pZ3JhdG9yOmNvbXBhcmVNaWdyYXRpb25zOmVudGl0eVNldDoke2VudGl0eVNldC50YWJsZX1gLCBlbnRpdHlTZXQpO1xuICAgICAgICAgIE5haXRlLnQoYG1pZ3JhdG9yOmNvbXBhcmVNaWdyYXRpb25zOmRiU2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGRiU2V0KTtcblxuICAgICAgICAgIGlmIChkYlNldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsl4bsnYwsIOyDiOuhnCDthYzsnbTruJQg7IOd7ISxXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVDcmVhdGVDb2RlKGVudGl0eVNldCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOq4sOyhtCDthYzsnbTruJQg7KG07J6s7ZWY64qUIOy8gOydtOyKpFxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlQWx0ZXJDb2RlKGVudGl0eVNldCwgZGJTZXQsIGNvbXBhcmVEQik7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIGNvZGVzLnB1c2goLi4uYmF0Y2hDb2Rlcy5mbGF0KCkpO1xuICAgIH1cblxuICAgIC8vIG5vcm1hbCDtg4DsnoXsnbQg7JWe7Jy866GcLCBmb3JlaWdu7J20IOuSpOuhnFxuICAgIGNvZGVzLnNvcnQoKGNvZGVBLCBjb2RlQikgPT4ge1xuICAgICAgaWYgKGNvZGVBLnR5cGUgPT09IFwiZm9yZWlnblwiICYmIGNvZGVCLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKGNvZGVBLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgY29kZUIudHlwZSA9PT0gXCJmb3JlaWduXCIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICogdGVzdCBEQuydmCBzbmFwc2hvdOycvOuhnCDsnoTsi5wgU2hhZG93IERC66W8IOunjOuTpOqzoCDsoITssrQg66eI7J206re466CI7J207IWY7J2EIOqygOymne2VqeuLiOuLpC5cbiAgICogQ0xJ7JmAIFdlYuydgCBgb25Qcm9ncmVzc2Ag7Jyg66y066eMIOuLrOumrO2VtCDqsJnsnYAg7Iuk7ZaJIOydmOuvuOulvCDqs7XsnKDtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBydW5TaGFkb3dUZXN0KG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBiYXNlVGVzdENvbm4gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXUuZGJDb25maWdcbiAgICAgICAgLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB3b3JrZXJJZCA9IHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiID8gcHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgOiBudWxsO1xuICAgIGNvbnN0IHRlbXBsYXRlRGF0YWJhc2UgPVxuICAgICAgd29ya2VySWQgIT09IG51bGwgPyBgJHtiYXNlVGVzdENvbm4uZGF0YWJhc2V9XyR7d29ya2VySWQgPz8gXCIxXCJ9YCA6IGJhc2VUZXN0Q29ubi5kYXRhYmFzZTtcbiAgICBjb25zdCB0ZGJDb25uID0geyAuLi5iYXNlVGVzdENvbm4sIGRhdGFiYXNlOiB0ZW1wbGF0ZURhdGFiYXNlIH07XG4gICAgY29uc3Qgc2hhZG93RGF0YWJhc2UgPSBgJHt0ZW1wbGF0ZURhdGFiYXNlfV9fbWlncmF0aW9uX3NoYWRvd2A7XG5cbiAgICAvLyDthYzsiqTtirgg7IOB7Zmp7JeQ7ISc64qUIO2KuOuenOyereyFmOydhCDstIjquLDtmZTtlZjqs6AsIOyDiCDrjbDsnbTthLDrsqDsnbTsiqQg7Luk64Sl7IWY7J2EIOqwgOyguOyZgOyVvCDtlahcbiAgICBpZiAoaXNUZXN0KCkpIHtcbiAgICAgIGF3YWl0IERCLmNsZWFyVGVzdFRyYW5zYWN0aW9uKCk7XG4gICAgICBhd2FpdCBEQi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8g6riw7KG0IFNoYWRvdyBEQiDsgq3soJwg7ZuEIFNoYWRvdyBEQiDsg53shLFcbiAgICBjb25zdCB0ZGIgPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4uU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmJhc2VUZXN0Q29ubixcbiAgICAgICAgZGF0YWJhc2U6IFwicG9zdGdyZXNcIixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhKGAke3NoYWRvd0RhdGFiYXNlfSDsgq3soJxgKSk7XG4gICAgICBhd2FpdCB0ZGIucmF3KGBEUk9QIERBVEFCQVNFIElGIEVYSVNUUyAke3NoYWRvd0RhdGFiYXNlfWApO1xuICAgICAgYXdhaXQgdGRiLnJhdyhgXG4gICAgICAgIFNFTEVDVCBwZ190ZXJtaW5hdGVfYmFja2VuZChwZ19zdGF0X2FjdGl2aXR5LnBpZClcbiAgICAgICAgRlJPTSBwZ19zdGF0X2FjdGl2aXR5XG4gICAgICAgIFdIRVJFIGRhdG5hbWUgPSAnJHt0ZGJDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBgKTtcbiAgICAgIGF3YWl0IHRkYi5yYXcoYENSRUFURSBEQVRBQkFTRSAke3NoYWRvd0RhdGFiYXNlfSBURU1QTEFURSAke3RkYkNvbm4uZGF0YWJhc2V9YCk7XG5cbiAgICAgIC8vIFNoYWRvdyBEQuyXkCDsl7DqsrBcbiAgICAgIGNvbnN0IHNkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAgIC4uLlNvbmFtdS5kYkNvbmZpZy50ZXN0LFxuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4udGRiQ29ubixcbiAgICAgICAgICBkYXRhYmFzZTogc2hhZG93RGF0YWJhc2UsXG4gICAgICAgICAgcGFzc3dvcmQ6IHRkYkNvbm4ucGFzc3dvcmQsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLy8gc2hhZG93IERCIO2FjOyKpO2KuCDsp4TtlolcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKFwic2hhZG93XCIsIFwic2hhZG93XCIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpO1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlNoYWRvdyBEQiDthYzsiqTtirjsl5Ag7ISx6rO17ZaI7Iq164uI64ukIVwiKSwge1xuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywge1xuICAgICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgICAgYWN0aW9uOiBcInNoYWRvd1wiLFxuICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICBmaWxlczogYXBwbGllZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25uS2V5OiBcInNoYWRvd1wiLFxuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIFwic2hhZG93XCIsXG4gICAgICAgICAgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zaGFkb3dEYlRlc3RGYWlsZWRcIikpLFxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgc2RiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gU2hhZG93IERCIOyCreygnFxuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRkYi5yYXcoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7c2hhZG93RGF0YWJhc2V9YCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTaGFkb3cgREIg7KCV66asIOyLpO2MqDpcIiwgZSk7IC8vIOydtOqyjCDsl4bsnLzrqbQg7KGw7Jqp7Z6IIOuIhOyImFxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgdGRiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJDQSxTQUFTLFlBQVksUUFBZ0IsT0FBZSxHQUFXO0NBQzdELE9BQU8sT0FBTyxTQUFTLENBQUMsQ0FBQyxTQUFTLE1BQU0sR0FBRztBQUM3Qzs7Ozs7QUFzQkEsU0FBUyxZQUFlLFNBQXFCLElBQVksV0FBb0M7Q0FDM0YsT0FBTyxJQUFJLFNBQVksU0FBUyxXQUFXO0VBQ3pDLE1BQU0sUUFBUSxpQkFBaUIsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFO0VBQ3RELFFBQVEsTUFDTCxVQUFVO0dBQ1QsYUFBYSxLQUFLO0dBQ2xCLFFBQVEsS0FBSztFQUNmLElBQ0MsVUFBVTtHQUNULGFBQWEsS0FBSztHQUNsQixPQUFPLEtBQUs7RUFDZCxDQUNGO0NBQ0YsQ0FBQztBQUNIOzs7YUF6RXNDO1NBQ0g7V0FFa0I7U0FDdEI7cUJBQ3lCO1VB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
565
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgR2VuTWlncmF0aW9uQ29kZSwgdHlwZSBNaWdyYXRpb25TZXQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzTG9jYWwsIGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbHRlckNvZGUsIGdlbmVyYXRlQ3JlYXRlQ29kZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHsgZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSB9IGZyb20gXCIuL21pZ3JhdGlvbi1zZXRcIjtcbmltcG9ydCB7IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgfSBmcm9tIFwiLi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmltcG9ydCB7IFNsYWNrQ29uZmlybSB9IGZyb20gXCIuL3NsYWNrLWNvbmZpcm1cIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ublN0cmluZyxcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uTWV0YSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzLFxuICB0eXBlIE1pZ3JhdGlvblByb2dyZXNzRXZlbnQsXG4gIHR5cGUgTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgdHlwZSBNaWdyYXRpb25TdGF0dXMsXG4gIHR5cGUgTWlncmF0aW9uVGFyZ2V0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBNaWdyYXRpb25SZXN1bHQgPSB7XG4gIGNvbm5LZXk6IHN0cmluZztcbiAgYmF0Y2hObzogbnVtYmVyO1xuICBhcHBsaWVkOiBzdHJpbmdbXTtcbn1bXTtcblxudHlwZSBTaGFkb3dNaWdyYXRpb25UYXJnZXQgPSBFeHRyYWN0PE1pZ3JhdGlvblRhcmdldCwgXCJmaXh0dXJlXCIgfCBcInRlc3RcIj47XG5cbmZ1bmN0aW9uIHBhZERhdGVQYXJ0KG51bWJlcjogbnVtYmVyLCBzaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnBhZFN0YXJ0KHNpemUsIFwiMFwiKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29ubktleTogTWlncmF0aW9uVGFyZ2V0IHwgXCJzaGFkb3dcIixcbiAgICBjYXVzZTogdW5rbm93bixcbiAgKSB7XG4gICAgc3VwZXIoY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8g66eI7J206re466CI7J207IWYIOyDge2DnCDsobDtmowg7IucIERCIOyXsOqysCDtmZXsnbgg7YOA7J6E7JWE7JuDKG1zKS5cbi8vIGNyZWF0ZUtuZXhJbnN0YW5jZeydmCDsu6TrhKXshZgg7ZqN65OdIO2DgOyehOyVhOybgygzMOy0iCnsl5Agc3RhdHVzL2xpc3QvY3VycmVudFZlcnNpb27snbRcbi8vIOqwgeqwgSDqsbjrpqzrqbQgQ0xJL1VJ6rCAIOy1nOuMgCDsiJjsi60g7LSIIGhhbmftlZzri6QuIOygleyDgSDsnZHri7XsnYAg7IiY67CxIG1z7J2066+A66GcIDXstIjrqbQg7Lap67aE7ZWY64ukLlxuY29uc3QgTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyA9IDUwMDA7XG5jb25zdCBMT0NBTF9EQl9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5cbi8qKlxuICog7KO87Ja07KeEIFByb21pc2XqsIAgbXMg7JWI7JeQIOyZhOujjOuQmOyngCDslYrsnLzrqbQgb25UaW1lb3V0IOyXkOufrOuhnCByZWplY3TtlZzri6QuXG4gKiDsm5Drs7ggUHJvbWlzZSDsnpDssrTripQg6rOE7IaNIOynhO2WieuQmOuvgOuhnCwg7Zi47Lac7Lih7JeQ7IScIOy7pOuEpeyFmCDsoJXrpqwoZGVzdHJveSnrpbwg7LGF7J6E7KeE64ukLlxuICovXG5mdW5jdGlvbiB3aXRoVGltZW91dDxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyLCBvblRpbWVvdXQ6ICgpID0+IEVycm9yKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChvblRpbWVvdXQoKSksIG1zKTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE5vdGUgMjAyNi0wOC0yNiwg67OR7KSAXG4gKiDsnbQg7YG0656Y7Iqk7JeQ7IScIGRlcHJlY2F0ZWQg67aZ7Ja07J6I64qUIOy5nOq1rOuTpOydgCDtmIQgQ0xJ66W8IOychO2VnCDtlZjsnIQg7Zi47ZmY7J2064uILFxuICogQ0xJIOumrO2Mqe2GoOungSDsi5zsoJDsl5DshJwg7KCc6rGw7ZW07KO87IWU64+EIOustOuwqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1pZ3JhdG9yIHtcbiAgcHJpdmF0ZSBpc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yPFZhbHVlPihlcnJvcjogVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzT2JqZWN0VmFsdWUoZXJyb3IpIHx8IGVycm9yID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbWF5YmVQb3N0Z3Jlc0Vycm9yID1cbiAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZXJyb3IgYXMge1xuICAgICAgICBjb2RlPzogdW5rbm93bjtcbiAgICAgIH07XG4gICAgLy8gUG9zdGdyZVNRTCB1bmRlZmluZWRfdGFibGUg7L2U65Oc64qUIOyCrOyaqeyekCDsp4DsoJUgbWlncmF0aW9uIHRhYmxl7JeQ64+EIOuPmeydvO2VmOqyjCDsoIHsmqnrkKnri4jri6QuXG4gICAgcmV0dXJuIG1heWJlUG9zdGdyZXNFcnJvci5jb2RlID09PSBcIjQyUDAxXCI7XG4gIH1cblxuICAvKiog7ZiE7J6sIOyLpO2WiSDtmZjqsr3sl5DshJwg7ZeI7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDrjIDsg4Eg7YKk66W8IOuwmO2ZmO2VqeuLiOuLpC4gKi9cbiAgZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpOiBNaWdyYXRpb25UYXJnZXRbXSB7XG4gICAgY29uc3QgY29ubktleXMgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBPYmplY3Qua2V5cyhcbiAgICAgICAgU29uYW11LmRiQ29uZmlnLFxuICAgICAgKS5maWx0ZXIoKGtleSkgPT4gIWtleS5lbmRzV2l0aChcIl9yZWFkb25seVwiKSkgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgcmV0dXJuIGNvbm5LZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gY29ubktleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KFxuICAgIGNvbm5zOiB7IGNvbm5LZXk6IGtleW9mIFNvbmFtdURCQ29uZmlnOyBrbmV4OiBLbmV4IH1bXSxcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyBjb25uS2V5LCBrbmV4IH0gb2YgY29ubnMpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKGFjdGlvbiwgY29ubktleSwgb3B0aW9ucyk7XG4gICAgICBsZXQgbWlncmF0aW9uUmVzdWx0OiBbbnVtYmVyLCBzdHJpbmdbXV07XG4gICAgICB0cnkge1xuICAgICAgICBtaWdyYXRpb25SZXN1bHQgPVxuICAgICAgICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiXG4gICAgICAgICAgICA/IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpXG4gICAgICAgICAgICA6IGF3YWl0IGtuZXgubWlncmF0ZS5yb2xsYmFjayhwcm9ncmVzcyk7XG4gICAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgICAgLy8gbGlmZWN5Y2xlIGhvb2sg7J207KCE7J2YIOyXsOqysMK3bG9ja8K366qp66GdIOyhsO2ajCDsi6TtjKjrj4Qg7Iuk7KCcIOuMgOyDgSBEQuyXkCDqt4Dsho3tlanri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25UYXJnZXRFeGVjdXRpb25FcnJvcihjb25uS2V5LCBjYXVnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gbWlncmF0aW9uUmVzdWx0O1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBjb25uS2V5LFxuICAgICAgICBiYXRjaE5vLFxuICAgICAgICBhcHBsaWVkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgZmlsZXM6IGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgbWlncmF0aW9uTmFtZTxWYWx1ZT4obWlncmF0aW9uOiBWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGlzU3RyaW5nVmFsdWUobWlncmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUobWlncmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUobWlncmF0aW9uKSAmJiBtaWdyYXRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbWlncmF0aW9uIGFzIHtcbiAgICAgICAgICBmaWxlPzogdW5rbm93bjtcbiAgICAgICAgICBuYW1lPzogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNhbmRpZGF0ZS5maWxlKSkge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjYW5kaWRhdGUuZmlsZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShjYW5kaWRhdGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoY2FuZGlkYXRlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG1pZ3JhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm9ncmVzcyhvcHRpb25zOiBNaWdyYXRpb25SdW5PcHRpb25zIHwgdW5kZWZpbmVkLCBldmVudDogTWlncmF0aW9uUHJvZ3Jlc3NFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zPy5vblByb2dyZXNzPy4oZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDsp4TtlonrpaAg7IaM67mE7J6Q7J2YIOyLpO2MqOqwgCDsnbTrr7gg7Iuc7J6R7ZWcIERCIOyekeyXheqzvCDsoJXrpqzrpbwg67Cp7ZW07ZWY66m0IOyViCDrkKnri4jri6QuXG4gICAgICBjb25zb2xlLndhcm4oXCJNaWdyYXRpb24gcHJvZ3Jlc3Mgb2JzZXJ2ZXIgZmFpbGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQcm9ncmVzc0hvb2tzKFxuICAgIGFjdGlvbjogTWlncmF0aW9uQWN0aW9uLFxuICAgIGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCB8IFwic2hhZG93XCIsXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IEtuZXguTWlncmF0b3JDb25maWdXaXRoTGlmZWN5Y2xlSG9va3Mge1xuICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbWl0RmlsZSA9IDxWYWx1ZT4odHlwZTogXCJmaWxlLXN0YXJ0XCIgfCBcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uOiBWYWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMubWlncmF0aW9uTmFtZShtaWdyYXRpb24pO1xuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLm1heChmaWxlcy5pbmRleE9mKGZpbGUpLCAwKTtcbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb25uS2V5LFxuICAgICAgICBmaWxlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdG90YWw6IGZpbGVzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlQWxsOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgZmlsZXMgPSBtaWdyYXRpb25zLm1hcCgobWlncmF0aW9uKSA9PiB0aGlzLm1pZ3JhdGlvbk5hbWUobWlncmF0aW9uKSk7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHsgdHlwZTogXCJ0YXJnZXQtc3RhcnRcIiwgYWN0aW9uLCBjb25uS2V5LCBmaWxlcyB9KTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVFYWNoOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgbWlncmF0aW9ucy5mb3JFYWNoKChtaWdyYXRpb24pID0+IGVtaXRGaWxlKFwiZmlsZS1zdGFydFwiLCBtaWdyYXRpb24pKTtcbiAgICAgIH0sXG4gICAgICBhZnRlckVhY2g6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBtaWdyYXRpb25zLmZvckVhY2goKG1pZ3JhdGlvbikgPT4gZW1pdEZpbGUoXCJmaWxlLWV4ZWN1dGVkXCIsIG1pZ3JhdGlvbikpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5pbmNsdWRlcyhjb25uS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIHRhcmdldCBpcyBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke1N0cmluZyhjb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuMgOyDgSDsu6TrhKXshZjsnZgg7KCV7KCBIOuplO2DgOuNsOydtO2EsOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIERC7JeQIOyXsOqysO2VmOyngCDslYrsnLzrr4DroZwgQ0xJ7JmAIFdlYuydtCDsg4Htg5wg7KGw7ZqMIOyghOyXkCDsponsi5wg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvbnMoKTogTWlncmF0aW9uQ29ubmVjdGlvbk1ldGFbXSB7XG4gICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgIHJldHVybiB0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5tYXAoKGNvbm5LZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uS2V5XG4gICAgICAgIF0uY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIGNvbnN0IGhvc3QgPSBjb25uZWN0aW9uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIG5hbWU6IFN0cmluZyhjb25uS2V5KSxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydDogY29ubmVjdGlvbi5wb3J0ID8/IDU0MzIsXG4gICAgICAgIGRhdGFiYXNlOiBjb25uZWN0aW9uLmRhdGFiYXNlID8/IFwiXCIsXG4gICAgICAgIHJlbW90ZTogIUxPQ0FMX0RCX0hPU1RTLmhhcyhob3N0LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsOiBzbGFja0NvbmZpcm0uaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKGNvbm5LZXkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshozsiqTsl5Ag7KG07J6s7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDtjIzsnbwg66qp66Gd7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7Luk64Sl7IWYIO2VmOuCmOydmCDtmITsnqwg67KE7KCE6rO8IHBlbmRpbmcg66qp66Gd7J2EIOuPheumveyggeycvOuhnCDsobDtmoztlanri4jri6QuXG4gICAqIOyXrOufrCDrjIDsg4HsnYAg7Zi47Lac7J6Q6rCAIOuzkeugrOuhnCDsobDrpr3tlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8TWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cz4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIC8vIFNBRkVUWTogS25leOqwgCDsoJzqs7XtlZwgUG9zdGdyZVNRTCDsl7DqsrAg6rWs7ISx7J2EIOuzteyCrO2VtCB0aW1lb3V0IO2VhOuTnOunjCDrja7slrTsk7Tri6QuXG4gICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5lY3Rpb24sXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHtcbiAgICAgICAgLi4ua25leE9wdGlvbnMucG9vbCxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgY3JlYXRlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgcHJvcGFnYXRlQ3JlYXRlRXJyb3I6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KHRDb25uLnJhdyhcInNlbGVjdCAxXCIpLCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgICAgYERCIOyXsOqysCDsi5zqsIQg7LSI6rO8ICgke01JR1JBVElPTl9DT05OX1RJTUVPVVRfTVN9bXMpIOKAlCAke2Nvbm5lY3Rpb24uaG9zdH06JHtjb25uZWN0aW9uLnBvcnR9LyR7Y29ubmVjdGlvbi5kYXRhYmFzZX1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc3RhdHVzOiBudW1iZXIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlLnN0YXR1cygpLmNhdGNoKChjYXVnaHQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihjYXVnaHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvZGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvciA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgICAgcmV0dXJuIFwiZXJyb3JcIiBhcyBjb25zdDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGVuZGluZzogc3RyaW5nW10gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKS50aGVuKFxuICAgICAgICAoWywgZmlsZXNdOiBbdW5rbm93bltdLCB7IGZpbGU6IHN0cmluZyB9W11dKSA9PlxuICAgICAgICAgIGZpbGVzLm1hcCgoeyBmaWxlIH0pID0+IGZpbGUucmVwbGFjZSgvXFwudHMkLywgXCJcIikpLFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVzLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgXCJub25lXCIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlXG4gICAgICAgIC5jdXJyZW50VmVyc2lvbigpXG4gICAgICAgIC5jYXRjaCgoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwibm9uZVwiIGFzIGNvbnN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBcImVycm9yXCIgYXMgY29uc3Q7XG4gICAgICAgIH0pO1xuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpzdGF0dXNcIiwgc3RhdHVzKTtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25TdGF0dXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXMgPSB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHBlbmRpbmcsXG4gICAgICAgIGxhdGVuY3lNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIGNvbm5lY3Rpb25TdGF0dXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIHJldHVybiBjb25uZWN0aW9uU3RhdHVzO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBjYXVnaHQgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodC5tZXNzYWdlIDogU3RyaW5nKGNhdWdodCk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgJHtTdHJpbmcoY29ubktleSl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuXFxuJHtlcnJvcn1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBcImVycm9yXCIsXG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBwZW5kaW5nOiBbXSxcbiAgICAgICAgbGF0ZW5jeU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB3aXRoVGltZW91dCh0Q29ubi5kZXN0cm95KCksIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZGVzdHJveSB0aW1lb3V0XCIpO1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vOyXkCDsoIHsmqnrkJwgbWlncmF0aW9uIGJhdGNo66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RBcHBsaWVkQmF0Y2goXG4gICAgY29ubktleTogTWlncmF0aW9uVGFyZ2V0LFxuICApOiBQcm9taXNlPHsgYmF0Y2hObzogbnVtYmVyOyBmaWxlczogc3RyaW5nW10gfT4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHRDb25uID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgIC4uLmtuZXhPcHRpb25zLFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5jb25uZWN0aW9uLFxuICAgICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgIH0sXG4gICAgICBwb29sOiB7XG4gICAgICAgIC4uLmtuZXhPcHRpb25zLnBvb2wsXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgYWNxdWlyZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgIGNyZWF0ZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgIHByb3BhZ2F0ZUNyZWF0ZUVycm9yOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBrbmV4T3B0aW9ucy5taWdyYXRpb25zPy50YWJsZU5hbWUgPz8gXCJrbmV4X21pZ3JhdGlvbnNcIjtcbiAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBrbmV4T3B0aW9ucy5taWdyYXRpb25zPy5zY2hlbWFOYW1lO1xuICAgICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID1cbiAgICAgICAgc2NoZW1hTmFtZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0Q29ubjx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgYmF0Y2g6IG51bWJlciB9Pih0YWJsZU5hbWUpXG4gICAgICAgICAgOiB0Q29ubjx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgYmF0Y2g6IG51bWJlciB9Pih0YWJsZU5hbWUpLndpdGhTY2hlbWEoc2NoZW1hTmFtZSk7XG4gICAgICBjb25zdCBsYXRlc3QgPSBhd2FpdCBtaWdyYXRpb25zVGFibGUuY2xvbmUoKS5zZWxlY3QoXCJiYXRjaFwiKS5vcmRlckJ5KFwiYmF0Y2hcIiwgXCJkZXNjXCIpLmZpcnN0KCk7XG4gICAgICBpZiAobGF0ZXN0ID09PSB1bmRlZmluZWQpIHJldHVybiB7IGJhdGNoTm86IDAsIGZpbGVzOiBbXSB9O1xuXG4gICAgICAvLyDqsJnsnYAgYmF0Y2gg7JWI7JeQ7ISc64qUIEtuZXgg7Iuk7ZaJIOyInOyEnOuMgOuhnCDroaTrsLEg6rOE7ZqN7J2EIOqzoOygle2VnOuLpC5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBtaWdyYXRpb25zVGFibGVcbiAgICAgICAgLmNsb25lKClcbiAgICAgICAgLnNlbGVjdChcIm5hbWVcIilcbiAgICAgICAgLndoZXJlKFwiYmF0Y2hcIiwgbGF0ZXN0LmJhdGNoKVxuICAgICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmF0Y2hObzogbGF0ZXN0LmJhdGNoLFxuICAgICAgICBmaWxlczogcm93cy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdWdodCkpIHJldHVybiB7IGJhdGNoTm86IDAsIGZpbGVzOiBbXSB9O1xuICAgICAgdGhyb3cgY2F1Z2h0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0Q29ubi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOy1nOyLoCDsg4Htg5zsnbgg6riw7KSAIERC7JmAIOyXlO2LsO2LsCDsoJXsnZjrpbwg67mE6rWQ7ZW0IOyDneyEsSDsmIjsoJUg7L2U65Oc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvblN0YXR1cyhjb21wYXJlQ29ubktleSk7XG4gICAgaWYgKHN0YXR1cy5zdGF0dXMgIT09IDAgfHwgc3RhdHVzLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiBjb21wYXJpc29uIHJlcXVpcmVzIGFuIHVwLXRvLWRhdGUgZGF0YWJhc2U6ICR7U3RyaW5nKGNvbXBhcmVDb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm5LZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCkge1xuICAgIGNvbnN0IGNvbXBhcmVEQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbY29tcGFyZUNvbm5LZXldKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY29tcGFyZURCLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQg7Iug6recIFVJ7JeQ7ISc64qUIOy7pOuEpeyFmOuzhCDsobDtmowgQVBJ66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgICog6riw7KG0IENMSeyZgCDsiqTtgazrpr3tirgg7Zi47ZmY7J2EIOychO2VtCDsoITssrQg7IOB7YOc66W8IOyhsOumve2VqeuLiOuLpC5cbiAgICogQGNhdGVnb3J5IO2YuO2ZmOyaqSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRTdGF0dXMoKTogUHJvbWlzZTxNaWdyYXRpb25TdGF0dXM+IHtcbiAgICBjb25zdCBbY29kZXMsIGNvbm5lY3Rpb25zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZ2V0TWlncmF0aW9uQ29kZXMoKSxcbiAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLmdldENvbm5lY3Rpb25zKCkpLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29kZXNcIiwgY29kZXMpO1xuXG4gICAgY29uc3QgY29ubmVjdGlvblN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25uZWN0aW9ucy5tYXAoKHsgY29ubktleSB9KSA9PiB0aGlzLmdldENvbm5lY3Rpb25TdGF0dXMoY29ubktleSkpLFxuICAgICk7XG4gICAgY29uc3QgY29ubnMgPSBjb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjb25uZWN0aW9uU3RhdHVzZXNbaW5kZXhdO1xuICAgICAgYXNzZXJ0KHN0YXR1cyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWQgPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uZWN0aW9uLmNvbm5LZXlcbiAgICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogY29ubmVjdGlvbi5uYW1lLFxuICAgICAgICBjb25uS2V5OiBjb25uZWN0aW9uLmNvbm5LZXksXG4gICAgICAgIGNvbm5TdHJpbmc6XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBgcGc6Ly8ke2NvbmZpZ3VyZWQudXNlciA/PyBcIlwifUAke2NvbmZpZ3VyZWQuaG9zdH06JHtjb25maWd1cmVkLnBvcnR9LyR7Y29uZmlndXJlZC5kYXRhYmFzZX1gIGFzIENvbm5TdHJpbmcsXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBzdGF0dXMuY3VycmVudFZlcnNpb24sXG4gICAgICAgIHN0YXR1czogc3RhdHVzLnN0YXR1cyxcbiAgICAgICAgcGVuZGluZzogc3RhdHVzLnBlbmRpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29ubnNcIiwgY29ubnMpO1xuXG4gICAgY29uc3QgY29tcGFyZUNvbm4gPSBjb25uZWN0aW9uU3RhdHVzZXMuZmluZChcbiAgICAgICh7IHN0YXR1cywgZXJyb3IgfSkgPT4gc3RhdHVzID09PSAwICYmIGVycm9yID09PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBjb25zdCBwcmVwYXJlZENvZGVzID1cbiAgICAgIGNvbXBhcmVDb25uID09PSB1bmRlZmluZWQgPyBbXSA6IGF3YWl0IHRoaXMuY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uLmNvbm5LZXkpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb25ucyxcbiAgICAgIGNvZGVzLFxuICAgICAgcHJlcGFyZWRDb2RlcyxcbiAgICAgIGVycm9yOiBjb25uZWN0aW9uU3RhdHVzZXMuZmluZCgoeyBlcnJvciB9KSA9PiBlcnJvciAhPT0gdW5kZWZpbmVkKT8uZXJyb3IsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5AgcGVuZGluZyDrp4jsnbTqt7jroIjsnbTshZjsnYQg7KCB7Jqp7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgYXBwbHkodGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5BY3Rpb25XaXRoUHJvZ3Jlc3MoXCJhcHBseVwiLCB0YXJnZXRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vCBtaWdyYXRpb24gYmF0Y2jrpbwg66Gk67Cx7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcm9sbGJhY2soXG4gICAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQWN0aW9uV2l0aFByb2dyZXNzKFwicm9sbGJhY2tcIiwgdGFyZ2V0cywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYWN0aW9uIOusuOyekOyXtCDrjIDsi6Age0BsaW5rIGFwcGx5fSDrmJDripQge0BsaW5rIHJvbGxiYWNrfeydhCDsp4HsoJEg7IKs7Jqp7ZWp64uI64ukLlxuICAgKiDquLDsobQg7Jm467aAIO2YuOy2nOydmCDtlZjsnIQg7Zi47ZmY66eM7J2EIOychO2VtCDsnKDsp4Dtlanri4jri6QuXG4gICAqIEBjYXRlZ29yeSDtmLjtmZjsmqkg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcnVuQWN0aW9uKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gYWN0aW9uID09PSBcImFwcGx5XCIgPyB0aGlzLmFwcGx5KHRhcmdldHMpIDogdGhpcy5yb2xsYmFjayh0YXJnZXRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWN0aW9uV2l0aFByb2dyZXNzKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246YWN0aW9uXCIsIGFjdGlvbik7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjp0YXJnZXRzXCIsIHRhcmdldHMpO1xuXG4gICAgY29uc3QgYWxsb3dlZFRhcmdldHMgPSBuZXcgU2V0KHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpKTtcbiAgICBjb25zdCBkaXNhbGxvd2VkVGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkVGFyZ2V0cy5oYXModGFyZ2V0KSk7XG4gICAgaWYgKGRpc2FsbG93ZWRUYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiB0YXJnZXRzIGFyZSBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke2Rpc2FsbG93ZWRUYXJnZXRzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdW5pcSBrbmV4IGNvbmZpZ3NcbiAgICBjb25zdCBjb25maWdzID0gdW5pcXVlKFxuICAgICAgdGFyZ2V0c1xuICAgICAgICAubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgICAgY29ubktleTogdGFyZ2V0LFxuICAgICAgICAgIG9wdGlvbnM6IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXRdLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5vcHRpb25zICE9PSB1bmRlZmluZWQpLFxuICAgICAgKHsgb3B0aW9uczogZGJPcHRpb25zIH0pID0+XG4gICAgICAgIGAkey8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGRiT3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5ob3N0fToke1xuICAgICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWdcbiAgICAgICAgICApLnBvcnQgPz8gNTQzMlxuICAgICAgICB9LyR7LyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlfWAsXG4gICAgKTtcblxuICAgIC8vIGdldCBjb25uZWN0aW9uc1xuICAgIGNvbnN0IGNvbm5zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25maWdzLm1hcChhc3luYyAoY29uZmlnKSA9PiAoe1xuICAgICAgICBjb25uS2V5OiBjb25maWcuY29ubktleSxcbiAgICAgICAga25leDogY3JlYXRlS25leEluc3RhbmNlKGNvbmZpZy5vcHRpb25zKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuTWlncmF0aW9uc1NlcXVlbnRpYWxseShjb25ucywgYWN0aW9uLCBvcHRpb25zKTtcblxuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjpyZXN1bHRcIiwgcmVzdWx0KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNvbm5zLm1hcCgoeyBrbmV4IH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ga25leC5kZXN0cm95KCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbkRhdGVUYWcoaW5kZXg6IG51bWJlciwgYmFzZURhdGU6IERhdGUgPSBuZXcgRGF0ZSgpKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYmFzZURhdGUuZ2V0VGltZSgpICsgaW5kZXggKiAxMDAwKTtcbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXREYXRlKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0SG91cnMoKSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0U2Vjb25kcygpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg6rCc7IiYXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVByZXBhcmVkQ29kZXMoY29tcGFyZUNvbm5LZXk/OiBNaWdyYXRpb25UYXJnZXQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHByZXBhcmVkQ29kZXMgPVxuICAgICAgY29tcGFyZUNvbm5LZXkgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChhd2FpdCB0aGlzLmdldFN0YXR1cygpKS5wcmVwYXJlZENvZGVzXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5KTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVQcmVwYXJlZENvZGVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG4gICAgaWYgKHByZXBhcmVkQ29kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlxcbu2YhOyerCDrqqjrkZAg7Iux7YGs65CcIOyDge2DnOyeheuLiOuLpC5cIikpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8g7Iuk7KCcIOy9lOuTnCDsg53shLFcbiAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvbWlncmF0aW9uc2A7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGNvZGVdIG9mIHByZXBhcmVkQ29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGNvZGUuZm9ybWF0dGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGVUYWcgPSB0aGlzLmdlbkRhdGVUYWcoaW5kZXgpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke21pZ3JhdGlvbnNEaXJ9LyR7ZGF0ZVRhZ31fJHtwY29kZS50aXRsZX0udHNgO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIHBjb2RlLmZvcm1hdHRlZCk7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgTUlHUkFUSU9OIENSRUFURUQgJHtmaWxlUGF0aH1gKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXBhcmVkQ29kZXMubGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCOiBLbmV4KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgICAvLyBFbnRpdHkg7Iic7ZqM7ZWY7JesIOyLse2BrFxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIEVudGl0eeyXkOyEnCBNaWdyYXRpb25TZXQg7LaU7LacXG4gICAgY29uc3QgZW50aXR5U2V0c1dpdGhKb2luVGFibGUgPSBlbnRpdHlJZHNcbiAgICAgIC5maWx0ZXIoKGVudGl0eUlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKGVudGl0eUlkKSA9PiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKSkpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iU66eMIOy2lOy2nFxuICAgIGNvbnN0IGpvaW5UYWJsZXNXaXRoRHVwID0gZW50aXR5U2V0c1dpdGhKb2luVGFibGUuZmxhdE1hcCgoZW50aXR5U2V0KSA9PiBlbnRpdHlTZXQuam9pblRhYmxlcyk7XG4gICAgLy8g7KSR67O1IOygnOqxsCAo7KSR67O17J24IOqyveyasCBpbmRleGVz66W8IOuzke2VqSlcbiAgICBjb25zdCBqb2luVGFibGVzID0gT2JqZWN0LnZhbHVlcyhncm91cChqb2luVGFibGVzV2l0aER1cCwgKGp0KSA9PiBqdC50YWJsZSkpLm1hcCgodGFibGVzKSA9PiB7XG4gICAgICBhc3NlcnQodGFibGVzICE9PSB1bmRlZmluZWQsIFwidGFibGVzIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGlmICh0YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0YWJsZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YWJsZXNbMF0sXG4gICAgICAgIGluZGV4ZXM6IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodCkgPT4gdC5pbmRleGVzKSxcbiAgICAgICAgICAoaW5kZXgpID0+IFtpbmRleC50eXBlLCAuLi5pbmRleC5jb2x1bW5zXS5qb2luKFwiLVwiKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIE1pZ3JhdGlvblNldCDrsLDsl7RcbiAgICBjb25zdCBlbnRpdHlTZXRzOiBNaWdyYXRpb25TZXRbXSA9IFsuLi5lbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSwgLi4uam9pblRhYmxlc107XG5cbiAgICBjb25zdCBjb2RlczogR2VuTWlncmF0aW9uQ29kZVtdID0gW107XG4gICAgY29uc3QgYmF0Y2hTaXplID0gNDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50aXR5U2V0cy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICBjb25zdCBiYXRjaENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGVudGl0eVNldHMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSkubWFwKGFzeW5jIChlbnRpdHlTZXQpID0+IHtcbiAgICAgICAgICBjb25zdCBkYlNldCA9IGF3YWl0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIuZ2V0TWlncmF0aW9uU2V0RnJvbURCKFxuICAgICAgICAgICAgY29tcGFyZURCLFxuICAgICAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZW50aXR5U2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGVudGl0eVNldCk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZGJTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZGJTZXQpO1xuXG4gICAgICAgICAgaWYgKGRiU2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyXhuydjCwg7IOI66GcIO2FjOydtOu4lCDsg53shLFcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsobTsnqztlZjripQg7LyA7J207IqkXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGUoZW50aXR5U2V0LCBkYlNldCwgY29tcGFyZURCKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgY29kZXMucHVzaCguLi5iYXRjaENvZGVzLmZsYXQoKSk7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsIO2DgOyeheydtCDslZ7snLzroZwsIGZvcmVpZ27snbQg65Kk66GcXG4gICAgY29kZXMuc29ydCgoY29kZUEsIGNvZGVCKSA9PiB7XG4gICAgICBpZiAoY29kZUEudHlwZSA9PT0gXCJmb3JlaWduXCIgJiYgY29kZUIudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZUEudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBjb2RlQi50eXBlID09PSBcImZvcmVpZ25cIikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiB0ZXN0IERC7J2YIHNuYXBzaG907Jy866GcIOyehOyLnCBTaGFkb3cgRELrpbwg66eM65Ok6rOgIOyghOyytCDrp4jsnbTqt7jroIjsnbTshZjsnYQg6rKA7Kad7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIGBvblByb2dyZXNzYCDsnKDrrLTrp4wg64us66as7ZW0IOqwmeydgCDsi6Ttlokg7J2Y66+466W8IOqzteycoO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIHJ1blNoYWRvd1Rlc3QoXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMgJiB7IHRhcmdldD86IE1pZ3JhdGlvblRhcmdldCB9LFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnM/LnRhcmdldCA/PyBcInRlc3RcIjtcbiAgICBpZiAodGFyZ2V0ICE9PSBcInRlc3RcIiAmJiB0YXJnZXQgIT09IFwiZml4dHVyZVwiKSB7XG4gICAgICAvLyDsmrTsmIEg6rOE7Je0IERC64qUIOyEpOyglSDsobDtmozrgpgg7Jew6rKwIOyDneyEseuztOuLpCDrqLzsoIAg7LCo64uo7ZWc64ukLlxuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYOyngOybkO2VmOyngCDslYrripQgU2hhZG93IOuniOydtOq3uOugiOydtOyFmCDrjIDsg4HsnoXri4jri6Q6ICR7dGFyZ2V0fWApLCB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9TSEFET1dfTUlHUkFUSU9OX1RBUkdFVFwiLFxuICAgICAgICB0YXJnZXQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhZG93VGFyZ2V0OiBTaGFkb3dNaWdyYXRpb25UYXJnZXQgPSB0YXJnZXQ7XG4gICAgY29uc3QgYmFzZVRhcmdldENvbm4gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXUuZGJDb25maWdbXG4gICAgICAgIHNoYWRvd1RhcmdldFxuICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWREYXRhYmFzZSA9IGJhc2VUYXJnZXRDb25uLmRhdGFiYXNlO1xuICAgIGlmICghY29uZmlndXJlZERhdGFiYXNlKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU2hhZG93IOuMgOyDgSBEQiDsnbTrpoTsnbQg7JeG7Iq164uI64ukOiAke3NoYWRvd1RhcmdldH1gKSwge1xuICAgICAgICBjb2RlOiBcIklOVkFMSURfU0hBRE9XX0RBVEFCQVNFX0NPTkZJR1wiLFxuICAgICAgICB0YXJnZXQ6IHNoYWRvd1RhcmdldCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJJZCA9XG4gICAgICBzaGFkb3dUYXJnZXQgPT09IFwidGVzdFwiICYmIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiXG4gICAgICAgID8gcHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSURcbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHRlbXBsYXRlRGF0YWJhc2UgPVxuICAgICAgd29ya2VySWQgIT09IG51bGwgPyBgJHtjb25maWd1cmVkRGF0YWJhc2V9XyR7d29ya2VySWQgPz8gXCIxXCJ9YCA6IGNvbmZpZ3VyZWREYXRhYmFzZTtcbiAgICBjb25zdCBzaGFkb3dEYXRhYmFzZSA9IGAke3RlbXBsYXRlRGF0YWJhc2V9X19taWdyYXRpb25fc2hhZG93YDtcbiAgICBjb25zdCBjcmVhdGVTaGFkb3dDb25uZWN0aW9uID0gKGRhdGFiYXNlOiBzdHJpbmcpID0+XG4gICAgICBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgICAuLi5Tb25hbXUuZGJDb25maWdbc2hhZG93VGFyZ2V0XSxcbiAgICAgICAgY29ubmVjdGlvbjogeyAuLi5iYXNlVGFyZ2V0Q29ubiwgZGF0YWJhc2UgfSxcbiAgICAgIH0pO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IOyDge2ZqeyXkOyEnOuKlCDtirjrnpzsnq3shZjsnYQg7LSI6riw7ZmU7ZWY6rOgLCDsg4gg642w7J207YSw67Kg7J207IqkIOy7pOuEpeyFmOydhCDqsIDsoLjsmYDslbwg7ZWoXG4gICAgaWYgKGlzVGVzdCgpKSB7XG4gICAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuICAgICAgYXdhaXQgREIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIOq4sOyhtCBTaGFkb3cgREIg7IKt7KCcIO2bhCBTaGFkb3cgREIg7IOd7ISxXG4gICAgY29uc3QgdGRiID0gY3JlYXRlU2hhZG93Q29ubmVjdGlvbihcInBvc3RncmVzXCIpO1xuICAgIHRyeSB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgYXdhaXQgdGRiLnJhdyhcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTID8/XCIsIFtzaGFkb3dEYXRhYmFzZV0pO1xuICAgICAgYXdhaXQgdGRiLnJhdyhcbiAgICAgICAgYFxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gP1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIGAsXG4gICAgICAgIFt0ZW1wbGF0ZURhdGFiYXNlXSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0ZGIucmF3KFwiQ1JFQVRFIERBVEFCQVNFID8/IFRFTVBMQVRFID8/XCIsIFtzaGFkb3dEYXRhYmFzZSwgdGVtcGxhdGVEYXRhYmFzZV0pO1xuXG4gICAgICAvLyBTaGFkb3cgRELsl5Ag7Jew6rKwXG4gICAgICBjb25zdCBzZGIgPSBjcmVhdGVTaGFkb3dDb25uZWN0aW9uKHNoYWRvd0RhdGFiYXNlKTtcblxuICAgICAgLy8gc2hhZG93IERCIO2FjOyKpO2KuCDsp4TtlolcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKFwic2hhZG93XCIsIFwic2hhZG93XCIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpO1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlNoYWRvdyBEQiDthYzsiqTtirjsl5Ag7ISx6rO17ZaI7Iq164uI64ukIVwiKSwge1xuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywge1xuICAgICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgICAgYWN0aW9uOiBcInNoYWRvd1wiLFxuICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICBmaWxlczogYXBwbGllZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25uS2V5OiBcInNoYWRvd1wiLFxuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIFwic2hhZG93XCIsXG4gICAgICAgICAgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zaGFkb3dEYlRlc3RGYWlsZWRcIikpLFxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgc2RiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gU2hhZG93IERCIOyCreygnFxuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRkYi5yYXcoXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyA/P1wiLCBbc2hhZG93RGF0YWJhc2VdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNoYWRvdyBEQiDsoJXrpqwg7Iuk7YyoOlwiLCBlKTsgLy8g7J206rKMIOyXhuycvOuptCDsobDsmqntnogg64iE7IiYXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0ZGIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNBLFNBQVMsWUFBWSxRQUFnQixPQUFlLEdBQVc7Q0FDN0QsT0FBTyxPQUFPLFNBQVMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxHQUFHO0FBQzdDOzs7OztBQXNCQSxTQUFTLFlBQWUsU0FBcUIsSUFBWSxXQUFvQztDQUMzRixPQUFPLElBQUksU0FBWSxTQUFTLFdBQVc7RUFDekMsTUFBTSxRQUFRLGlCQUFp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
@@ -1 +1 @@
1
- {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"slack-confirm.d.ts","sourceRoot":"","sources":["../../src/migration/slack-confirm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,YAAY,IAAI,OAAO;IAKvB;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,cAAc,GAAG,OAAO;IAK/D;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAK/C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAgB/F;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnF;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAuC3C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IA2CF;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyChB;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,eAAe,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CAmCjB"}
1
+ {"version":3,"file":"slack-confirm.d.ts","sourceRoot":"","sources":["../../src/migration/slack-confirm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,YAAY,IAAI,OAAO,CAGtB;IAED;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,cAAc,GAAG,OAAO,CAG9D;IAED;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAG9C;IAED;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAc9F;IAED;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlF;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAqC1C;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAyCD;IAED;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAuCf;IAED;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,eAAe,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAkCf;CACF"}
@@ -1,4 +1,3 @@
1
-
2
1
  /**
3
2
  * Sonamu extension과 공유하는 Naite 메시징 관련 타입 정의들입니다.
4
3
  * 이 파일은 cartanova-ai/sonamu와 cartanova-ai/vscode-sonamu에서 공통으로 사용됩니다.
@@ -1 +1 @@
1
- {"version":3,"file":"messaging-types.d.ts","sourceRoot":"","sources":["../../src/naite/messaging-types.ts"],"names":[],"mappings":";AAEA;;;GAGG;AACH,yBAAiB,mBAAmB,CAAC;IACnC,KAAY,oBAAoB,GAAG;QACjC,IAAI,EAAE,WAAW,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,KAAY,sBAAsB,GAAG;QACnC,IAAI,EAAE,aAAa,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,UAAU,CAAC;IAEf,KAAY,kBAAkB,GAAG;QAC/B,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,KAAY,YAAY,GAAG,oBAAoB,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;IAE9F,KAAY,UAAU,GAAG;QACvB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IAEF,KAAY,SAAS,GAAG;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,KAAY,UAAU,GAAG;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,SAAS,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH"}
1
+ {"version":3,"file":"messaging-types.d.ts","sourceRoot":"","sources":["../../src/naite/messaging-types.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,yBAAiB,mBAAmB,CAAC;IACnC,KAAY,oBAAoB,GAAG;QACjC,IAAI,EAAE,WAAW,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,KAAY,sBAAsB,GAAG;QACnC,IAAI,EAAE,aAAa,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,UAAU,CAAC;IAEf,KAAY,kBAAkB,GAAG;QAC/B,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAEF,KAAY,YAAY,GAAG,oBAAoB,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;IAE9F,KAAY,UAAU,GAAG;QACvB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,GAAG,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IAEF,KAAY,SAAS,GAAG;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,KAAY,UAAU,GAAG;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,SAAS,CAAC;QAClB,MAAM,EAAE,UAAU,EAAE,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH"}
@@ -13,7 +13,6 @@
13
13
  *
14
14
  * fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
15
15
  */
16
-
17
16
  import { type NaiteMessagingTypes } from "./messaging-types";
18
17
  declare class NaiteReporterClass {
19
18
  private socketPath;
@@ -1 +1 @@
1
- {"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;;AAUH,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA+B7D,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAE9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,IAAI;IAgBlB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC;IAYhB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBlC;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
1
+ {"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA+B7D,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAE9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,IAAI;IAgBlB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlC;IAED;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC,CAUf;IAED;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBhC;CACF;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}