sonamu 0.11.16 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/ai/agents/agent.js +2 -3
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/index.js +1 -2
  5. package/dist/ai/providers/rtzr/api.js +1 -2
  6. package/dist/ai/providers/rtzr/error.js +2 -3
  7. package/dist/ai/providers/rtzr/model.js +1 -2
  8. package/dist/ai/providers/rtzr/options.js +1 -2
  9. package/dist/ai/providers/rtzr/provider.js +1 -2
  10. package/dist/ai/providers/rtzr/utils.js +1 -2
  11. package/dist/api/base-frame.js +4 -4
  12. package/dist/api/caster.d.ts +1 -1
  13. package/dist/api/caster.d.ts.map +1 -1
  14. package/dist/api/caster.js +9 -9
  15. package/dist/api/code-converters.js +6 -5
  16. package/dist/api/config.d.ts +1 -1
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +2 -3
  19. package/dist/api/context.d.ts +2 -3
  20. package/dist/api/context.d.ts.map +1 -1
  21. package/dist/api/context.js +2 -3
  22. package/dist/api/decorators.js +2 -3
  23. package/dist/api/http-validator.js +2 -3
  24. package/dist/api/index.js +8 -3
  25. package/dist/api/secret.js +1 -2
  26. package/dist/api/sonamu.d.ts +3 -5
  27. package/dist/api/sonamu.d.ts.map +1 -1
  28. package/dist/api/sonamu.js +30 -24
  29. package/dist/api/validator.js +1 -2
  30. package/dist/api/websocket-helpers.js +2 -3
  31. package/dist/auth/audit-log/builders.js +1 -2
  32. package/dist/auth/audit-log/client-ip.js +2 -3
  33. package/dist/auth/audit-log/events.js +1 -2
  34. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  35. package/dist/auth/audit-log/plugin.js +2 -3
  36. package/dist/auth/audit-log-ingestor.js +2 -3
  37. package/dist/auth/auth-generator.js +2 -3
  38. package/dist/auth/better-auth-entities.js +1 -2
  39. package/dist/auth/better-auth-request.js +2 -3
  40. package/dist/auth/index.js +2 -3
  41. package/dist/auth/knex-adapter.js +2 -3
  42. package/dist/auth/plugins/entity-definitions/admin.js +1 -2
  43. package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
  44. package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
  45. package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
  46. package/dist/auth/plugins/entity-definitions/index.js +1 -2
  47. package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
  48. package/dist/auth/plugins/entity-definitions/organization.js +1 -2
  49. package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
  50. package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
  51. package/dist/auth/plugins/entity-definitions/sso.js +1 -2
  52. package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
  53. package/dist/auth/plugins/entity-definitions/username.js +1 -2
  54. package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
  55. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  56. package/dist/auth/plugins/wrappers/admin.js +2 -3
  57. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  58. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  59. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  60. package/dist/auth/plugins/wrappers/organization.js +2 -3
  61. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  62. package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
  63. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  64. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  65. package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
  66. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  67. package/dist/auth/plugins/wrappers/sso.js +1 -2
  68. package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
  69. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  70. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  71. package/dist/auth/plugins/wrappers/username.d.ts +39 -5
  72. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  73. package/dist/auth/plugins/wrappers/username.js +2 -3
  74. package/dist/bin/build-config.js +5 -5
  75. package/dist/bin/compiler-policy.js +2 -3
  76. package/dist/bin/fixture.js +7 -5
  77. package/dist/bin/hmr-hook-register.js +1 -2
  78. package/dist/bin/migrate-targets.js +2 -3
  79. package/dist/bin/test-command.js +2 -3
  80. package/dist/bin/ts-loader-register.js +2 -3
  81. package/dist/bin/ts-loader-registration.js +2 -3
  82. package/dist/bin/typecheck-web.js +2 -3
  83. package/dist/cache/cache-manager.js +1 -2
  84. package/dist/cache/decorator.js +2 -3
  85. package/dist/cache/drivers.js +1 -2
  86. package/dist/cache/index.js +2 -3
  87. package/dist/cache-control/cache-control.js +1 -2
  88. package/dist/code-formatting/index.js +2 -3
  89. package/dist/code-formatting/oxfmt.js +2 -3
  90. package/dist/code-formatting/oxlint.js +2 -3
  91. package/dist/compress/compress.js +1 -2
  92. package/dist/compress/index.js +2 -2
  93. package/dist/compress/types.d.ts +1 -1
  94. package/dist/compress/types.d.ts.map +1 -1
  95. package/dist/cone/cone-generator.js +2 -3
  96. package/dist/database/_batch_update.js +1 -2
  97. package/dist/database/base-model.js +4 -4
  98. package/dist/database/db.js +4 -4
  99. package/dist/database/knex.js +2 -3
  100. package/dist/database/puri-wrapper.js +2 -3
  101. package/dist/database/puri.js +23 -22
  102. package/dist/database/puri.types.js +1 -2
  103. package/dist/database/transaction-context.js +1 -2
  104. package/dist/database/upsert-builder.js +2 -3
  105. package/dist/dict/en.js +2 -3
  106. package/dist/dict/index.js +3 -3
  107. package/dist/dict/ko.js +2 -3
  108. package/dist/dict/rc-keys.js +1 -2
  109. package/dist/dict/sd.js +2 -3
  110. package/dist/dict/sonamu-dictionary.js +7 -6
  111. package/dist/dict/utils.js +2 -3
  112. package/dist/entity/entity-manager.d.ts +66 -66
  113. package/dist/entity/entity-manager.js +4 -4
  114. package/dist/entity/entity-template-cone.js +2 -3
  115. package/dist/entity/entity.js +21 -18
  116. package/dist/env.js +1 -2
  117. package/dist/exceptions/error-handler.d.ts.map +1 -1
  118. package/dist/exceptions/error-handler.js +2 -3
  119. package/dist/exceptions/so-exceptions.js +2 -3
  120. package/dist/filter/index.js +3 -2
  121. package/dist/filter/types.js +1 -2
  122. package/dist/filter/utils.js +7 -6
  123. package/dist/index.d.ts +1 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +42 -6
  126. package/dist/logger/category.js +2 -3
  127. package/dist/logger/configure.js +5 -5
  128. package/dist/migration/code-generation.js +23 -16
  129. package/dist/migration/index-where-predicate.js +2 -3
  130. package/dist/migration/migration-set.js +2 -3
  131. package/dist/migration/migrator.js +2 -3
  132. package/dist/migration/postgresql-schema-reader.js +6 -9
  133. package/dist/migration/slack-confirm.js +2 -3
  134. package/dist/naite/naite-reporter.js +2 -3
  135. package/dist/naite/naite.js +10 -8
  136. package/dist/runtime-type.js +2 -3
  137. package/dist/ssr/hmr-opt-out.js +1 -2
  138. package/dist/ssr/index.js +7 -4
  139. package/dist/ssr/registry.js +1 -2
  140. package/dist/ssr/renderer.js +2 -3
  141. package/dist/storage/base-file.js +1 -2
  142. package/dist/storage/buffered-file.js +2 -3
  143. package/dist/storage/drivers.js +1 -2
  144. package/dist/storage/index.js +2 -3
  145. package/dist/storage/s3-driver.js +1 -2
  146. package/dist/storage/storage-manager.js +2 -3
  147. package/dist/storage/uploaded-file.js +2 -3
  148. package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
  149. package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
  150. package/dist/stream/__tests__/ws-test-helpers.js +259 -0
  151. package/dist/stream/index.d.ts +1 -0
  152. package/dist/stream/index.d.ts.map +1 -1
  153. package/dist/stream/index.js +15 -4
  154. package/dist/stream/sse.js +1 -2
  155. package/dist/stream/ws-audience-resolver.d.ts +8 -5
  156. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  157. package/dist/stream/ws-audience-resolver.js +17 -15
  158. package/dist/stream/ws-audience.js +1 -2
  159. package/dist/stream/ws-cluster-bus.d.ts +9 -4
  160. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  161. package/dist/stream/ws-cluster-bus.js +2 -3
  162. package/dist/stream/ws-core.d.ts +10 -0
  163. package/dist/stream/ws-core.d.ts.map +1 -1
  164. package/dist/stream/ws-delivery.d.ts +30 -4
  165. package/dist/stream/ws-delivery.d.ts.map +1 -1
  166. package/dist/stream/ws-delivery.js +200 -54
  167. package/dist/stream/ws-frame.d.ts +15 -0
  168. package/dist/stream/ws-frame.d.ts.map +1 -0
  169. package/dist/stream/ws-frame.js +28 -0
  170. package/dist/stream/ws-local-connection-store.d.ts +4 -4
  171. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  172. package/dist/stream/ws-local-connection-store.js +3 -4
  173. package/dist/stream/ws-presence-index.d.ts +36 -0
  174. package/dist/stream/ws-presence-index.d.ts.map +1 -0
  175. package/dist/stream/ws-presence-index.js +176 -0
  176. package/dist/stream/ws-presence-store.d.ts +39 -39
  177. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  178. package/dist/stream/ws-presence-store.js +23 -154
  179. package/dist/stream/ws-registry.d.ts +45 -17
  180. package/dist/stream/ws-registry.d.ts.map +1 -1
  181. package/dist/stream/ws-registry.js +170 -62
  182. package/dist/stream/ws-session-id.d.ts +14 -0
  183. package/dist/stream/ws-session-id.d.ts.map +1 -0
  184. package/dist/stream/ws-session-id.js +36 -0
  185. package/dist/stream/ws-telemetry-memory.js +3 -4
  186. package/dist/stream/ws-telemetry-trace.js +1 -2
  187. package/dist/stream/ws-telemetry.js +2 -3
  188. package/dist/stream/ws.d.ts +20 -10
  189. package/dist/stream/ws.d.ts.map +1 -1
  190. package/dist/stream/ws.js +60 -38
  191. package/dist/syncer/api-parser.js +2 -3
  192. package/dist/syncer/checksum.js +4 -4
  193. package/dist/syncer/code-generator.js +4 -4
  194. package/dist/syncer/entity-operations.js +2 -3
  195. package/dist/syncer/event-batcher.js +1 -2
  196. package/dist/syncer/file-copy.js +2 -3
  197. package/dist/syncer/file-patterns.js +2 -3
  198. package/dist/syncer/file-tracking.js +2 -3
  199. package/dist/syncer/filesystem-dependencies.js +1 -2
  200. package/dist/syncer/index.js +8 -2
  201. package/dist/syncer/module-loader.js +8 -6
  202. package/dist/syncer/syncer-actions.js +8 -7
  203. package/dist/syncer/syncer.js +13 -8
  204. package/dist/syncer/watcher.js +2 -3
  205. package/dist/tasks/decorator.js +1 -2
  206. package/dist/tasks/step-wrapper.js +2 -3
  207. package/dist/tasks/workflow-manager.js +2 -3
  208. package/dist/template/entity-converter.js +17 -16
  209. package/dist/template/helpers.js +2 -3
  210. package/dist/template/implementations/entity.template.js +2 -3
  211. package/dist/template/implementations/entry-server.template.js +2 -3
  212. package/dist/template/implementations/generated.template.js +2 -3
  213. package/dist/template/implementations/generated_http.template.js +6 -6
  214. package/dist/template/implementations/generated_sso.template.js +2 -3
  215. package/dist/template/implementations/http_validators.template.js +2 -3
  216. package/dist/template/implementations/init_types.template.js +2 -3
  217. package/dist/template/implementations/model.template.js +4 -4
  218. package/dist/template/implementations/model_test.template.js +2 -3
  219. package/dist/template/implementations/queries.template.js +2 -3
  220. package/dist/template/implementations/sd.template.js +2 -3
  221. package/dist/template/implementations/services.template.js +2 -3
  222. package/dist/template/implementations/view_form.template.js +12 -9
  223. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  224. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  225. package/dist/template/implementations/view_list.template.js +19 -17
  226. package/dist/template/implementations/view_search_input.template.js +2 -3
  227. package/dist/template/index.js +9 -3
  228. package/dist/template/template-manager.js +2 -3
  229. package/dist/template/template-types.js +1 -2
  230. package/dist/template/template.js +2 -3
  231. package/dist/template/zod-converter.js +54 -47
  232. package/dist/testing/_relation-graph.js +2 -3
  233. package/dist/testing/bootstrap.js +2 -3
  234. package/dist/testing/data-explorer.js +2 -3
  235. package/dist/testing/dev-test-routes.js +2 -3
  236. package/dist/testing/dev-vitest-manager.js +15 -12
  237. package/dist/testing/faker-mappings.js +1 -2
  238. package/dist/testing/filesystem.js +2 -3
  239. package/dist/testing/fixture-generator.js +2 -3
  240. package/dist/testing/fixture-loader.js +1 -2
  241. package/dist/testing/fixture-manager.js +12 -9
  242. package/dist/testing/global-setup.js +5 -5
  243. package/dist/testing/index.js +6 -3
  244. package/dist/testing/naite-vitest-reporter.js +1 -2
  245. package/dist/testing/parallel-db-manager.js +2 -3
  246. package/dist/testing/vitest-helpers.js +2 -3
  247. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
  248. package/dist/tooling/cdd-service.js +1 -2
  249. package/dist/tooling/cli-tooling.js +1 -2
  250. package/dist/tooling/fixture-service.js +1 -2
  251. package/dist/tooling/index.js +1 -2
  252. package/dist/tooling/test-run-client.js +2 -3
  253. package/dist/tsdown.api.config.js +1 -2
  254. package/dist/types/types.js +2 -3
  255. package/dist/ui/ai-api.d.ts.map +1 -1
  256. package/dist/ui/ai-api.js +4 -5
  257. package/dist/ui/ai-client.d.ts +2 -2
  258. package/dist/ui/ai-client.d.ts.map +1 -1
  259. package/dist/ui/ai-client.js +9 -8
  260. package/dist/ui/api.d.ts.map +1 -1
  261. package/dist/ui/api.js +11 -8
  262. package/dist/ui/async-route.js +1 -2
  263. package/dist/ui/cdd-service.js +22 -21
  264. package/dist/ui/migrations-api.js +6 -5
  265. package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
  266. package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
  267. package/dist/ui-web/index.html +2 -2
  268. package/dist/utils/async-utils.js +1 -2
  269. package/dist/utils/class-name.js +1 -2
  270. package/dist/utils/console-util.js +1 -2
  271. package/dist/utils/controller.js +2 -3
  272. package/dist/utils/esm-utils.js +1 -2
  273. package/dist/utils/fs-utils.js +2 -3
  274. package/dist/utils/lodash-able.js +1 -2
  275. package/dist/utils/model.js +1 -2
  276. package/dist/utils/object-utils.js +2 -3
  277. package/dist/utils/path-utils.js +2 -3
  278. package/dist/utils/process-utils.js +2 -3
  279. package/dist/utils/runtime-value.js +1 -2
  280. package/dist/utils/sql-parser.js +2 -3
  281. package/dist/utils/type-utils.js +8 -8
  282. package/dist/utils/utils.js +2 -3
  283. package/dist/utils/zod-error.js +2 -3
  284. package/dist/vector/chunking.js +1 -2
  285. package/dist/vector/config.js +1 -2
  286. package/dist/vector/embedding.js +4 -4
  287. package/package.json +63 -63
  288. package/src/ai/agents/agent.ts +1 -1
  289. package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
  290. package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
  291. package/src/api/__tests__/sonamu.websocket.test.ts +241 -24
  292. package/src/api/config.ts +1 -1
  293. package/src/api/context.ts +2 -8
  294. package/src/api/sonamu.ts +46 -28
  295. package/src/auth/audit-log/plugin.ts +2 -0
  296. package/src/compress/types.ts +1 -1
  297. package/src/exceptions/error-handler.ts +3 -2
  298. package/src/index.ts +1 -0
  299. package/src/stream/__tests__/ws-contracts.test.ts +483 -265
  300. package/src/stream/__tests__/ws-multinode.test.ts +326 -0
  301. package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
  302. package/src/stream/__tests__/ws-test-helpers.ts +360 -0
  303. package/src/stream/__tests__/ws.test.ts +342 -145
  304. package/src/stream/index.ts +1 -0
  305. package/src/stream/ws-audience-resolver.ts +21 -19
  306. package/src/stream/ws-cluster-bus.ts +12 -4
  307. package/src/stream/ws-core.ts +14 -0
  308. package/src/stream/ws-delivery.ts +321 -97
  309. package/src/stream/ws-frame.ts +39 -0
  310. package/src/stream/ws-local-connection-store.ts +10 -9
  311. package/src/stream/ws-presence-index.ts +273 -0
  312. package/src/stream/ws-presence-store.ts +64 -284
  313. package/src/stream/ws-registry.ts +272 -85
  314. package/src/stream/ws-session-id.ts +39 -0
  315. package/src/stream/ws.ts +91 -50
  316. package/src/template/implementations/model.template.ts +3 -3
  317. package/src/template/implementations/view_list.template.ts +12 -13
  318. package/src/ui/ai-api.ts +4 -2
  319. package/src/ui/ai-client.ts +2 -2
  320. package/src/ui/api.ts +58 -62
  321. package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
  322. package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
@@ -5,7 +5,7 @@ import fs from "fs";
5
5
  import path from "path";
6
6
  import os from "os";
7
7
  import { spawn } from "child_process";
8
- //#region src/ui/cdd-service.ts
8
+ // src/ui/cdd-service.ts
9
9
  /** contract/ 디렉터리 절대 경로 반환 (apiRootPath 기준) */
10
10
  function getContractDir() {
11
11
  return path.join(Sonamu.apiRootPath, "..", "..", "contract");
@@ -268,14 +268,26 @@ function parseAcEntries(content) {
268
268
  }
269
269
  }
270
270
  }
271
- } else if (pendingTestAs) if (!testAsNeedName) {
272
- for (const ch of trimmed) {
273
- if (ch === "{") testAsBraceDepth++;
274
- if (ch === "}") testAsBraceDepth--;
275
- }
276
- if (testAsBraceDepth <= 0) {
277
- testAsNeedName = true;
278
- const nameMatch = trimmed.match(/}\s*,\s*["'`](.+?)["'`]/);
271
+ } else if (pendingTestAs) {
272
+ if (!testAsNeedName) {
273
+ for (const ch of trimmed) {
274
+ if (ch === "{") testAsBraceDepth++;
275
+ if (ch === "}") testAsBraceDepth--;
276
+ }
277
+ if (testAsBraceDepth <= 0) {
278
+ testAsNeedName = true;
279
+ const nameMatch = trimmed.match(/}\s*,\s*["'`](.+?)["'`]/);
280
+ if (nameMatch) {
281
+ entries.push({
282
+ describe: currentDescribe,
283
+ test: nameMatch[1]
284
+ });
285
+ pendingTestAs = false;
286
+ testAsNeedName = false;
287
+ }
288
+ }
289
+ } else {
290
+ const nameMatch = trimmed.match(/^["'`](.+?)["'`]/);
279
291
  if (nameMatch) {
280
292
  entries.push({
281
293
  describe: currentDescribe,
@@ -285,16 +297,6 @@ function parseAcEntries(content) {
285
297
  testAsNeedName = false;
286
298
  }
287
299
  }
288
- } else {
289
- const nameMatch = trimmed.match(/^["'`](.+?)["'`]/);
290
- if (nameMatch) {
291
- entries.push({
292
- describe: currentDescribe,
293
- test: nameMatch[1]
294
- });
295
- pendingTestAs = false;
296
- testAsNeedName = false;
297
- }
298
300
  }
299
301
  for (const ch of trimmed) {
300
302
  if (ch === "{") braceDepth++;
@@ -369,8 +371,7 @@ var init_cdd_service = __esmMin((() => {
369
371
  }
370
372
  };
371
373
  }));
372
- //#endregion
373
374
  init_cdd_service();
374
375
  export { addRule, editContent, getAcList, getCddTree, init_cdd_service, listRules, openSourceFile, readContent, readRule };
375
376
 
376
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2NkZC1zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBpc1N0cmluZ1ZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2RkQWNFbnRyeSxcbiAgdHlwZSBDZGRBY0ZpbGUsXG4gIHR5cGUgQ2RkQWNMaXN0UmVzdWx0LFxuICB0eXBlIENkZEFkZFJ1bGVSZXF1ZXN0LFxuICB0eXBlIENkZENvbnRlbnRSZXN1bHQsXG4gIHR5cGUgQ2RkRmlsZVR5cGUsXG4gIHR5cGUgQ2RkUnVsZURldGFpbCxcbiAgdHlwZSBDZGRSdWxlRW50cnksXG4gIHR5cGUgQ2RkUnVsZVN1bW1hcnksXG4gIHR5cGUgQ2RkVHJlZU5vZGUsXG59IGZyb20gXCIuL2NkZC10eXBlc1wiO1xuXG5pbnRlcmZhY2UgQ2RkVHJlZVJlc3VsdCB7XG4gIGV4aXN0czogYm9vbGVhbjtcbiAgdHJlZTogQ2RkVHJlZU5vZGVbXTtcbn1cbmludGVyZmFjZSBFZGl0b3JDbGlDb25maWcge1xuICBjbGk6IHN0cmluZztcbiAgd2FpdEZsYWc6IHN0cmluZztcbn1cbmludGVyZmFjZSBFZGl0b3JDbGlSZXNvbHV0aW9uIHtcbiAgYmluOiBzdHJpbmc7XG4gIGFyZ3M6IHN0cmluZ1tdO1xufVxuaW50ZXJmYWNlIENkZFJ1bGVzUmVzdWx0IHtcbiAgcnVsZXM6IENkZFJ1bGVTdW1tYXJ5W107XG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ2RkQWNFbnRyeSxcbiAgQ2RkQWNGaWxlLFxuICBDZGRBY0xpc3RSZXN1bHQsXG4gIENkZEFkZFJ1bGVSZXF1ZXN0LFxuICBDZGRDb250ZW50UmVzdWx0LFxuICBDZGRGaWxlVHlwZSxcbiAgQ2RkUnVsZURldGFpbCxcbiAgQ2RkUnVsZUVudHJ5LFxuICBDZGRSdWxlU3VtbWFyeSxcbiAgQ2RkVHJlZU5vZGUsXG59IGZyb20gXCIuL2NkZC10eXBlc1wiO1xuXG4vKiogY29udHJhY3QvIOuUlOugie2EsOumrCDsoIjrjIAg6rK966GcIOuwmO2ZmCAoYXBpUm9vdFBhdGgg6riw7KSAKSAqL1xuZnVuY3Rpb24gZ2V0Q29udHJhY3REaXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwiLi5cIiwgXCIuLlwiLCBcImNvbnRyYWN0XCIpO1xufVxuXG4vKiog7ZSE66Gc7KCd7Yq4IOujqO2KuCDqsr3roZwg67CY7ZmYICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIpO1xufVxuXG4vKiog6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg64K067aA7J247KeAIOqygOymnSAqL1xuZnVuY3Rpb24gYXNzZXJ0SW5zaWRlQ29udHJhY3REaXIoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG4gIGlmICghcmVzb2x2ZWQuc3RhcnRzV2l0aChjb250cmFjdERpciArIHBhdGguc2VwKSAmJiByZXNvbHZlZCAhPT0gY29udHJhY3REaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOqyveuhnOqwgCBjb250cmFjdC8g65SU66CJ7YSw66asIOuwluydhCDssLjsobDtlanri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cbn1cblxuLyoqIO2MjOydvOuqheyXkOyEnCBDZGRGaWxlVHlwZSDtjJDrs4QgKi9cbmZ1bmN0aW9uIGRldGVjdEZpbGVUeXBlKGZpbGVOYW1lOiBzdHJpbmcpOiBDZGRGaWxlVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChmaWxlTmFtZS5lbmRzV2l0aChcIi5jb250cmFjdC5tZFwiKSkgcmV0dXJuIFwiY29udHJhY3RcIjtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLnJ1bGVzLmpzb25cIikpIHJldHVybiBcInJ1bGVzXCI7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiDrlJTroInthLDrpqzrpbwg7J6s6reAIO2DkOyDie2VmOyXrCBDZGRUcmVlTm9kZSDtirjrpqzrpbwg7IOd7ISxICovXG5mdW5jdGlvbiBzY2FuRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZywgcmVsYXRpdmVUbzogc3RyaW5nKTogQ2RkVHJlZU5vZGVbXSB7XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG5vZGVzOiBDZGRUcmVlTm9kZVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZW50cnkubmFtZSk7XG4gICAgY29uc3QgcmVsUGF0aCA9IHBhdGgucmVsYXRpdmUocmVsYXRpdmVUbywgZnVsbFBhdGgpO1xuXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGlmIChlbnRyeS5uYW1lID09PSBcInJ1bGVzXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCByZWxhdGl2ZVRvKTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgcGF0aDogcmVsUGF0aCxcbiAgICAgICAgICB0eXBlOiBcImRpcmVjdG9yeVwiLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZpbGVUeXBlKGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGZpbGVUeXBlICYmIGZpbGVUeXBlICE9PSBcInJ1bGVzXCIpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66as7J2YIO2KuOumrCDqtazsobDrpbwg67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RkVHJlZSgpOiBDZGRUcmVlUmVzdWx0IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgcmV0dXJuIHsgZXhpc3RzOiBmYWxzZSwgdHJlZTogW10gfTtcbiAgfVxuICBjb25zdCB0cmVlID0gc2NhbkRpcmVjdG9yeShjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWUgfTtcbn1cblxuLyoqIO2MjOydvCDrgrTsmqnsnYQg7J297Ja0IOuwmO2ZmCAoY29udHJhY3QubWQg4oaSIG1hcmtkb3duIOybkOusuCwgcnVsZXMuanNvbiDihpIgSlNPTiDrrLjsnpDsl7QpICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IENkZENvbnRlbnRSZXN1bHQge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUocGF0aC5iYXNlbmFtZShmaWxlUGF0aCkpO1xuXG4gIHJldHVybiB7XG4gICAgY29udGVudCxcbiAgICBmaWxlVHlwZTogZmlsZVR5cGUgPz8gXCJjb250cmFjdFwiLFxuICB9O1xufVxuXG4vKiog7YyM7J287J2EIOyZuOu2gCDsl5DrlJTthLDroZwg7KeB7KCRIO2OuOynkSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRDb250ZW50KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfT4ge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG4gIGF3YWl0IHJ1bkVkaXRvcihlZGl0b3IsIGFic1BhdGgpO1xuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGZpbGVQYXRoIH07XG59XG5cbi8qKiDsl5DrlJTthLDrs4Qg7JWxIOuyiOuTpCDrgrQgQ0xJIOqyveuhnCArIC0td2FpdCDtlIzrnpjqt7gg66ek7ZWRICovXG5jb25zdCBFRElUT1JfQ0xJX01BUCA9IHtcbiAgXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY29kZVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBaZWQ6IHsgY2xpOiBcIkNvbnRlbnRzL01hY09TL2NsaVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBDdXJzb3I6IHsgY2xpOiBcIkNvbnRlbnRzL1Jlc291cmNlcy9hcHAvYmluL2N1cnNvclwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxufSBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgRWRpdG9yQ2xpQ29uZmlnPjtcblxuLyoqIOyVsSDrsojrk6QgQ0xJIOqyveuhnOulvCByZXNvbHZlLiB3YWl0PWZhbHNl7J2066m0IC0td2FpdCDtlIzrnpjqt7jrpbwg7IOd6561ICovXG5mdW5jdGlvbiByZXNvbHZlRWRpdG9yQ2xpKG9wdGlvbnM/OiB7IHdhaXQ/OiBib29sZWFuIH0pOiBFZGl0b3JDbGlSZXNvbHV0aW9uIHtcbiAgY29uc3Qgd2FpdCA9IG9wdGlvbnM/LndhaXQgPz8gdHJ1ZTtcbiAgY29uc3QgYXBwTmFtZSA9IFNvbmFtdS5jb25maWcuZXh0ZXJuYWxFZGl0b3IgPz8gXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjtcbiAgY29uc3QgbWFwcGluZyA9IE9iamVjdC5lbnRyaWVzKEVESVRPUl9DTElfTUFQKS5maW5kKChbbmFtZV0pID0+IG5hbWUgPT09IGFwcE5hbWUpPy5bMV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGDsp4Dsm5DrkJjsp4Ag7JWK64qUIOyXkOuUlO2EsOyeheuLiOuLpDogJHthcHBOYW1lfSAo7KeA7JuQOiAke09iamVjdC5rZXlzKEVESVRPUl9DTElfTUFQKS5qb2luKFwiLCBcIil9KWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIGAvQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgICBgJHtvcy5ob21lZGlyKCl9L0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gIF07XG4gIGNvbnN0IGJ1bmRsZVBhdGggPSBzZWFyY2hQYXRocy5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgaWYgKCFidW5kbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDslbEg67KI65Ok7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2FwcE5hbWV9ICgvQXBwbGljYXRpb25zIO2ZleyduClgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaUJpbiA9IHBhdGguam9pbihidW5kbGVQYXRoLCBtYXBwaW5nLmNsaSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGlCaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsl5DrlJTthLAgQ0xJ66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2NsaUJpbn1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGJpbjogY2xpQmluLCBhcmdzOiB3YWl0ID8gW21hcHBpbmcud2FpdEZsYWddIDogW10gfTtcbn1cblxuLyoqIOyXkOuUlO2EsCBDTEnrpbwg7Iuk7ZaJ7ZWY6rOgIO2DreydtCDri6vtnpAg65WM6rmM7KeAIOuMgOq4sCAqL1xuZnVuY3Rpb24gcnVuRWRpdG9yKGVkaXRvcjogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBmaWxlUGF0aF0sIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSwIOyLpO2WiSDsi6TtjKggKCR7ZWRpdG9yLmJpbn0pOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsOqwgCDruYTsoJXsg4Eg7KKF66OM65CY7JeI7Iq164uI64ukIChleGl0IGNvZGU6ICR7Y29kZX0pYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIOyGjOyKpCDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsl7TquLAgKOuMgOq4sO2VmOyngCDslYrsnYwpICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFNvbmFtdS5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgZWRpdG9yID0gcmVzb2x2ZUVkaXRvckNsaSh7IHdhaXQ6IGZhbHNlIH0pO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgYWJzUGF0aF0sIHtcbiAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNoaWxkLnVucmVmKCk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUnVsZXMgQVBJXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGNvbnRyYWN0L3J1bGVzLyDrlJTroInthLDrpqwg64K0IC5ydWxlcy5qc29uIO2MjOydvCDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJ1bGVzKCk6IENkZFJ1bGVzUmVzdWx0IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJydWxlc1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHJ1bGVzRGlyKSkgcmV0dXJuIHsgcnVsZXM6IFtdIH07XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHJ1bGVzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IHJ1bGVzOiBDZGRSdWxlU3VtbWFyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aChcIi5ydWxlcy5qc29uXCIpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGtleSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXFwucnVsZXNcXC5qc29uJC8sIFwiXCIpO1xuICAgIGNvbnN0IHJlbFBhdGggPSBgcnVsZXMvJHtlbnRyeS5uYW1lfWA7XG4gICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgZW50cnkubmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBkb2MgPSAvKiBTQUZFVFk6IFVJIOuPhOq1rOydmCBab2Qg7J6F66ClIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIEpTT04ucGFyc2UoXG4gICAgICAgIHJhdyxcbiAgICAgICkgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiB1bmtub3duW10gfTtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpc1N0cmluZ1ZhbHVlKGRvYy5kZXNjcmlwdGlvbikgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgICAgICBydWxlQ291bnQ6IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcy5sZW5ndGggOiAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICAgICAgcnVsZUNvdW50OiAwLFxuICAgICAgICBwYXJzZUVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBydWxlcyB9O1xufVxuXG4vKiogcnVsZXMg7YyM7J28IOyDgeyEuCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUnVsZShydWxlS2V5OiBzdHJpbmcpOiBDZGRSdWxlRGV0YWlsIHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKGNvbnRyYWN0RGlyLCBcInJ1bGVzXCIsIGAke3J1bGVLZXl9LnJ1bGVzLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1bGVzIO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtydWxlS2V5fWApO1xuICB9XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGRvYyA9IC8qIFNBRkVUWTogVUkg64+E6rWs7J2YIFpvZCDsnoXroKUg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gSlNPTi5wYXJzZShcbiAgICByYXcsXG4gICkgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiBDZGRSdWxlRW50cnlbXSB9O1xuXG4gIHJldHVybiB7XG4gICAga2V5OiBydWxlS2V5LFxuICAgIHBhdGg6IGBydWxlcy8ke3J1bGVLZXl9LnJ1bGVzLmpzb25gLFxuICAgIGRlc2NyaXB0aW9uOiBpc1N0cmluZ1ZhbHVlKGRvYy5kZXNjcmlwdGlvbikgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgIHJ1bGVzOiBBcnJheS5pc0FycmF5KGRvYy5ydWxlcykgPyBkb2MucnVsZXMgOiBbXSxcbiAgfTtcbn1cblxuLyoqIHJ1bGVzIO2MjOydvOyXkCDqt5zsuZkg7LaU6rCAICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUnVsZShyZXE6IENkZEFkZFJ1bGVSZXF1ZXN0KTogQ2RkUnVsZURldGFpbCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIik7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGAke3JlcS5ydWxlS2V5fS5ydWxlcy5qc29uYCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSdWxlcyDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7cmVxLnJ1bGVLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZG9jID0gLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgIHJhdyxcbiAgKSBhcyB7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyBydWxlcz86IENkZFJ1bGVFbnRyeVtdIH07XG4gIGNvbnN0IHJ1bGVzOiBDZGRSdWxlRW50cnlbXSA9IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcyA6IFtdO1xuXG4gIGNvbnN0IG5leHRJZCA9IGdlbmVyYXRlTmV4dFJ1bGVJZChydWxlcyk7XG4gIGNvbnN0IG5ld0VudHJ5OiBDZGRSdWxlRW50cnkgPSB7XG4gICAgaWQ6IG5leHRJZCxcbiAgICB3aGVuOiByZXEud2hlbixcbiAgICBpbnN0cnVjdGlvbjogcmVxLmluc3RydWN0aW9uLFxuICB9O1xuICBpZiAocmVxLmV4YW1wbGVzICYmIHJlcS5leGFtcGxlcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3RW50cnkuZXhhbXBsZXMgPSByZXEuZXhhbXBsZXM7XG4gIH1cblxuICBydWxlcy5wdXNoKG5ld0VudHJ5KTtcbiAgZG9jLnJ1bGVzID0gcnVsZXM7XG5cbiAgZnMud3JpdGVGaWxlU3luYyhhYnNQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShkb2MsIG51bGwsIDIpfVxcbmAsIFwidXRmLThcIik7XG5cbiAgcmV0dXJuIHtcbiAgICBrZXk6IHJlcS5ydWxlS2V5LFxuICAgIHBhdGg6IGBydWxlcy8ke3JlcS5ydWxlS2V5fS5ydWxlcy5qc29uYCxcbiAgICBkZXNjcmlwdGlvbjogaXNTdHJpbmdWYWx1ZShkb2MuZGVzY3JpcHRpb24pID8gZG9jLmRlc2NyaXB0aW9uIDogXCJcIixcbiAgICBydWxlcyxcbiAgfTtcbn1cblxuLyoqIOq4sOyhtCBpZCDtjKjthLTsnYQg67aE7ISd7ZWY7JesIOuLpOydjCDsiJzrsoggaWQg7IOd7ISxICovXG5mdW5jdGlvbiBnZW5lcmF0ZU5leHRSdWxlSWQocnVsZXM6IENkZFJ1bGVFbnRyeVtdKTogc3RyaW5nIHtcbiAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiUi0wMDFcIjtcblxuICBjb25zdCBudW1lcmljUGF0dGVybiA9IC9eKC4rPykoXFxkKykkLztcbiAgbGV0IGJlc3RQcmVmaXggPSBcIlItXCI7XG4gIGxldCBtYXhOdW0gPSAwO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IG1hdGNoID0gbnVtZXJpY1BhdHRlcm4uZXhlYyhydWxlLmlkKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoWzFdO1xuICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gICAgICBpZiAobnVtID4gbWF4TnVtKSB7XG4gICAgICAgIGJlc3RQcmVmaXggPSBwcmVmaXg7XG4gICAgICAgIG1heE51bSA9IG51bTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXh0TnVtID0gbWF4TnVtICsgMTtcbiAgY29uc3QgcGFkTGVuID0gTWF0aC5tYXgoMywgU3RyaW5nKG1heE51bSkubGVuZ3RoKTtcbiAgcmV0dXJuIGAke2Jlc3RQcmVmaXh9JHtTdHJpbmcobmV4dE51bSkucGFkU3RhcnQocGFkTGVuLCBcIjBcIil9YDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBBQyBBUEkgKG1vZHVsZXMvY2RkIGFjLWxpc3Qg7YyM7IuxIOuhnOyngSDrs7XsgqwpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGRlc2NyaWJlL3Rlc3Qg7Yyo7YS0IO2MjOyLsSAqL1xuZnVuY3Rpb24gcGFyc2VBY0VudHJpZXMoY29udGVudDogc3RyaW5nKTogQ2RkQWNFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogQ2RkQWNFbnRyeVtdID0gW107XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcblxuICBsZXQgY3VycmVudERlc2NyaWJlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGRlc2NyaWJlRGVwdGggPSAwO1xuICBsZXQgYnJhY2VEZXB0aCA9IDA7XG4gIGxldCBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gIGxldCB0ZXN0QXNCcmFjZURlcHRoID0gMDtcbiAgbGV0IHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXG4gICAgY29uc3QgZGVzY3JpYmVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL15kZXNjcmliZVxcKFtcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgaWYgKGRlc2NyaWJlTWF0Y2gpIHtcbiAgICAgIGN1cnJlbnREZXNjcmliZSA9IGRlc2NyaWJlTWF0Y2hbMV07XG4gICAgICBkZXNjcmliZURlcHRoID0gYnJhY2VEZXB0aDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXN0TWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eKD86dGVzdHxpdClcXChbXCInYF0oLis/KVtcIidgXS8pO1xuICAgIGlmICh0ZXN0TWF0Y2gpIHtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsXG4gICAgICAgIHRlc3Q6IHRlc3RNYXRjaFsxXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghcGVuZGluZ1Rlc3RBcyAmJiB0cmltbWVkLm1hdGNoKC9edGVzdEFzXFxzKlxcKC8pKSB7XG4gICAgICBjb25zdCBpbmxpbmVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL150ZXN0QXNcXHMqXFwoXFxzKlxce1tefV0qXFx9XFxzKixcXHMqW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgIGlmIChpbmxpbmVNYXRjaCkge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBpbmxpbmVNYXRjaFsxXSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmdUZXN0QXMgPSB0cnVlO1xuICAgICAgICB0ZXN0QXNCcmFjZURlcHRoID0gMDtcbiAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0cmltbWVkKSB7XG4gICAgICAgICAgaWYgKGNoID09PSBcIntcIikgdGVzdEFzQnJhY2VEZXB0aCsrO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHRlc3RBc0JyYWNlRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVzdEFzQnJhY2VEZXB0aCA8PSAwKSB7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL31cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICAgIHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nVGVzdEFzKSB7XG4gICAgICBpZiAoIXRlc3RBc05lZWROYW1lKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdHJpbW1lZCkge1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ7XCIpIHRlc3RBc0JyYWNlRGVwdGgrKztcbiAgICAgICAgICBpZiAoY2ggPT09IFwifVwiKSB0ZXN0QXNCcmFjZURlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlc3RBc0JyYWNlRGVwdGggPD0gMCkge1xuICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSB0cmltbWVkLm1hdGNoKC99XFxzKixcXHMqW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgICAgICBpZiAobmFtZU1hdGNoKSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBuYW1lTWF0Y2hbMV0gfSk7XG4gICAgICAgICAgICBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gICAgICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXltcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBuYW1lTWF0Y2hbMV0gfSk7XG4gICAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IGZhbHNlO1xuICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoIG9mIHRyaW1tZWQpIHtcbiAgICAgIGlmIChjaCA9PT0gXCJ7XCIpIGJyYWNlRGVwdGgrKztcbiAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHtcbiAgICAgICAgYnJhY2VEZXB0aC0tO1xuICAgICAgICBpZiAoY3VycmVudERlc2NyaWJlICYmIGJyYWNlRGVwdGggPD0gZGVzY3JpYmVEZXB0aCkge1xuICAgICAgICAgIGN1cnJlbnREZXNjcmliZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cblxuLyoqIO2UhOuhnOygne2KuCDrgrQgKi50ZXN0LnRzIO2MjOydvOydhCDsiqTsupTtlZjsl6wgQUMg66qp66GdIOuwmO2ZmCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjTGlzdCgpOiBDZGRBY0xpc3RSZXN1bHQge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGdldFByb2plY3RSb290KCk7XG4gIGNvbnN0IGZpbGVzID0gZmluZFRlc3RGaWxlcyhwcm9qZWN0Um9vdCk7XG5cbiAgY29uc3QgYWNGaWxlczogQ2RkQWNGaWxlW10gPSBbXTtcbiAgZm9yIChjb25zdCBhYnNQYXRoIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZUFjRW50cmllcyhjb250ZW50KTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBhY0ZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBhYnNQYXRoKSxcbiAgICAgICAgZW50cmllcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0gYWNGaWxlcy5yZWR1Y2UoKHN1bSwgZikgPT4gc3VtICsgZi5lbnRyaWVzLmxlbmd0aCwgMCk7XG4gIHJldHVybiB7IGZpbGVzOiBhY0ZpbGVzLCB0b3RhbCB9O1xufVxuXG4vKiogKi50ZXN0LnRzIO2MjOydvOydhCDsnqzqt4Ag7YOQ7IOJIChub2RlX21vZHVsZXMsIGRpc3Qg7KCc7Jm4KSAqL1xuZnVuY3Rpb24gZmluZFRlc3RGaWxlcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgSUdOT1JFID0gbmV3IFNldChbXCJub2RlX21vZHVsZXNcIiwgXCJkaXN0XCIsIFwiLmdpdFwiLCBcImNvbnRyYWN0XCJdKTtcblxuICBmdW5jdGlvbiB3YWxrKGN1cnJlbnREaXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnREaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoSUdOT1JFLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHdhbGsoZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLnRlc3QudHNcIikpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3YWxrKGRpcik7XG4gIHJlc3VsdHMuc29ydCgpO1xuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBa0RBLFNBQVMsaUJBQXlCO0NBQ2hDLE9BQU8sS0FBSyxLQUFLLE9BQU8sYUFBYSxNQUFN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
377
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2NkZC1zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBpc1N0cmluZ1ZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ2RkQWNFbnRyeSxcbiAgdHlwZSBDZGRBY0ZpbGUsXG4gIHR5cGUgQ2RkQWNMaXN0UmVzdWx0LFxuICB0eXBlIENkZEFkZFJ1bGVSZXF1ZXN0LFxuICB0eXBlIENkZENvbnRlbnRSZXN1bHQsXG4gIHR5cGUgQ2RkRmlsZVR5cGUsXG4gIHR5cGUgQ2RkUnVsZURldGFpbCxcbiAgdHlwZSBDZGRSdWxlRW50cnksXG4gIHR5cGUgQ2RkUnVsZVN1bW1hcnksXG4gIHR5cGUgQ2RkVHJlZU5vZGUsXG59IGZyb20gXCIuL2NkZC10eXBlc1wiO1xuXG5pbnRlcmZhY2UgQ2RkVHJlZVJlc3VsdCB7XG4gIGV4aXN0czogYm9vbGVhbjtcbiAgdHJlZTogQ2RkVHJlZU5vZGVbXTtcbn1cbmludGVyZmFjZSBFZGl0b3JDbGlDb25maWcge1xuICBjbGk6IHN0cmluZztcbiAgd2FpdEZsYWc6IHN0cmluZztcbn1cbmludGVyZmFjZSBFZGl0b3JDbGlSZXNvbHV0aW9uIHtcbiAgYmluOiBzdHJpbmc7XG4gIGFyZ3M6IHN0cmluZ1tdO1xufVxuaW50ZXJmYWNlIENkZFJ1bGVzUmVzdWx0IHtcbiAgcnVsZXM6IENkZFJ1bGVTdW1tYXJ5W107XG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ2RkQWNFbnRyeSxcbiAgQ2RkQWNGaWxlLFxuICBDZGRBY0xpc3RSZXN1bHQsXG4gIENkZEFkZFJ1bGVSZXF1ZXN0LFxuICBDZGRDb250ZW50UmVzdWx0LFxuICBDZGRGaWxlVHlwZSxcbiAgQ2RkUnVsZURldGFpbCxcbiAgQ2RkUnVsZUVudHJ5LFxuICBDZGRSdWxlU3VtbWFyeSxcbiAgQ2RkVHJlZU5vZGUsXG59IGZyb20gXCIuL2NkZC10eXBlc1wiO1xuXG4vKiogY29udHJhY3QvIOuUlOugie2EsOumrCDsoIjrjIAg6rK966GcIOuwmO2ZmCAoYXBpUm9vdFBhdGgg6riw7KSAKSAqL1xuZnVuY3Rpb24gZ2V0Q29udHJhY3REaXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwiLi5cIiwgXCIuLlwiLCBcImNvbnRyYWN0XCIpO1xufVxuXG4vKiog7ZSE66Gc7KCd7Yq4IOujqO2KuCDqsr3roZwg67CY7ZmYICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIpO1xufVxuXG4vKiog6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg64K067aA7J247KeAIOqygOymnSAqL1xuZnVuY3Rpb24gYXNzZXJ0SW5zaWRlQ29udHJhY3REaXIoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG4gIGlmICghcmVzb2x2ZWQuc3RhcnRzV2l0aChjb250cmFjdERpciArIHBhdGguc2VwKSAmJiByZXNvbHZlZCAhPT0gY29udHJhY3REaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOqyveuhnOqwgCBjb250cmFjdC8g65SU66CJ7YSw66asIOuwluydhCDssLjsobDtlanri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cbn1cblxuLyoqIO2MjOydvOuqheyXkOyEnCBDZGRGaWxlVHlwZSDtjJDrs4QgKi9cbmZ1bmN0aW9uIGRldGVjdEZpbGVUeXBlKGZpbGVOYW1lOiBzdHJpbmcpOiBDZGRGaWxlVHlwZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChmaWxlTmFtZS5lbmRzV2l0aChcIi5jb250cmFjdC5tZFwiKSkgcmV0dXJuIFwiY29udHJhY3RcIjtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLnJ1bGVzLmpzb25cIikpIHJldHVybiBcInJ1bGVzXCI7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiDrlJTroInthLDrpqzrpbwg7J6s6reAIO2DkOyDie2VmOyXrCBDZGRUcmVlTm9kZSDtirjrpqzrpbwg7IOd7ISxICovXG5mdW5jdGlvbiBzY2FuRGlyZWN0b3J5KGRpclBhdGg6IHN0cmluZywgcmVsYXRpdmVUbzogc3RyaW5nKTogQ2RkVHJlZU5vZGVbXSB7XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG5vZGVzOiBDZGRUcmVlTm9kZVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZW50cnkubmFtZSk7XG4gICAgY29uc3QgcmVsUGF0aCA9IHBhdGgucmVsYXRpdmUocmVsYXRpdmVUbywgZnVsbFBhdGgpO1xuXG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGlmIChlbnRyeS5uYW1lID09PSBcInJ1bGVzXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCByZWxhdGl2ZVRvKTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgcGF0aDogcmVsUGF0aCxcbiAgICAgICAgICB0eXBlOiBcImRpcmVjdG9yeVwiLFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZpbGVUeXBlKGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGZpbGVUeXBlICYmIGZpbGVUeXBlICE9PSBcInJ1bGVzXCIpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66as7J2YIO2KuOumrCDqtazsobDrpbwg67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RkVHJlZSgpOiBDZGRUcmVlUmVzdWx0IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgcmV0dXJuIHsgZXhpc3RzOiBmYWxzZSwgdHJlZTogW10gfTtcbiAgfVxuICBjb25zdCB0cmVlID0gc2NhbkRpcmVjdG9yeShjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWUgfTtcbn1cblxuLyoqIO2MjOydvCDrgrTsmqnsnYQg7J297Ja0IOuwmO2ZmCAoY29udHJhY3QubWQg4oaSIG1hcmtkb3duIOybkOusuCwgcnVsZXMuanNvbiDihpIgSlNPTiDrrLjsnpDsl7QpICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IENkZENvbnRlbnRSZXN1bHQge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUocGF0aC5iYXNlbmFtZShmaWxlUGF0aCkpO1xuXG4gIHJldHVybiB7XG4gICAgY29udGVudCxcbiAgICBmaWxlVHlwZTogZmlsZVR5cGUgPz8gXCJjb250cmFjdFwiLFxuICB9O1xufVxuXG4vKiog7YyM7J287J2EIOyZuOu2gCDsl5DrlJTthLDroZwg7KeB7KCRIO2OuOynkSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRDb250ZW50KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfT4ge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG4gIGF3YWl0IHJ1bkVkaXRvcihlZGl0b3IsIGFic1BhdGgpO1xuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGZpbGVQYXRoIH07XG59XG5cbi8qKiDsl5DrlJTthLDrs4Qg7JWxIOuyiOuTpCDrgrQgQ0xJIOqyveuhnCArIC0td2FpdCDtlIzrnpjqt7gg66ek7ZWRICovXG5jb25zdCBFRElUT1JfQ0xJX01BUCA9IHtcbiAgXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY29kZVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBaZWQ6IHsgY2xpOiBcIkNvbnRlbnRzL01hY09TL2NsaVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBDdXJzb3I6IHsgY2xpOiBcIkNvbnRlbnRzL1Jlc291cmNlcy9hcHAvYmluL2N1cnNvclwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxufSBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgRWRpdG9yQ2xpQ29uZmlnPjtcblxuLyoqIOyVsSDrsojrk6QgQ0xJIOqyveuhnOulvCByZXNvbHZlLiB3YWl0PWZhbHNl7J2066m0IC0td2FpdCDtlIzrnpjqt7jrpbwg7IOd6561ICovXG5mdW5jdGlvbiByZXNvbHZlRWRpdG9yQ2xpKG9wdGlvbnM/OiB7IHdhaXQ/OiBib29sZWFuIH0pOiBFZGl0b3JDbGlSZXNvbHV0aW9uIHtcbiAgY29uc3Qgd2FpdCA9IG9wdGlvbnM/LndhaXQgPz8gdHJ1ZTtcbiAgY29uc3QgYXBwTmFtZSA9IFNvbmFtdS5jb25maWcuZXh0ZXJuYWxFZGl0b3IgPz8gXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjtcbiAgY29uc3QgbWFwcGluZyA9IE9iamVjdC5lbnRyaWVzKEVESVRPUl9DTElfTUFQKS5maW5kKChbbmFtZV0pID0+IG5hbWUgPT09IGFwcE5hbWUpPy5bMV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGDsp4Dsm5DrkJjsp4Ag7JWK64qUIOyXkOuUlO2EsOyeheuLiOuLpDogJHthcHBOYW1lfSAo7KeA7JuQOiAke09iamVjdC5rZXlzKEVESVRPUl9DTElfTUFQKS5qb2luKFwiLCBcIil9KWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIGAvQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgICBgJHtvcy5ob21lZGlyKCl9L0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gIF07XG4gIGNvbnN0IGJ1bmRsZVBhdGggPSBzZWFyY2hQYXRocy5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgaWYgKCFidW5kbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDslbEg67KI65Ok7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2FwcE5hbWV9ICgvQXBwbGljYXRpb25zIO2ZleyduClgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaUJpbiA9IHBhdGguam9pbihidW5kbGVQYXRoLCBtYXBwaW5nLmNsaSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGlCaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsl5DrlJTthLAgQ0xJ66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2NsaUJpbn1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGJpbjogY2xpQmluLCBhcmdzOiB3YWl0ID8gW21hcHBpbmcud2FpdEZsYWddIDogW10gfTtcbn1cblxuLyoqIOyXkOuUlO2EsCBDTEnrpbwg7Iuk7ZaJ7ZWY6rOgIO2DreydtCDri6vtnpAg65WM6rmM7KeAIOuMgOq4sCAqL1xuZnVuY3Rpb24gcnVuRWRpdG9yKGVkaXRvcjogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBmaWxlUGF0aF0sIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSwIOyLpO2WiSDsi6TtjKggKCR7ZWRpdG9yLmJpbn0pOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsOqwgCDruYTsoJXsg4Eg7KKF66OM65CY7JeI7Iq164uI64ukIChleGl0IGNvZGU6ICR7Y29kZX0pYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIOyGjOyKpCDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsl7TquLAgKOuMgOq4sO2VmOyngCDslYrsnYwpICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFNvbmFtdS5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgZWRpdG9yID0gcmVzb2x2ZUVkaXRvckNsaSh7IHdhaXQ6IGZhbHNlIH0pO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgYWJzUGF0aF0sIHtcbiAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNoaWxkLnVucmVmKCk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUnVsZXMgQVBJXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGNvbnRyYWN0L3J1bGVzLyDrlJTroInthLDrpqwg64K0IC5ydWxlcy5qc29uIO2MjOydvCDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJ1bGVzKCk6IENkZFJ1bGVzUmVzdWx0IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJydWxlc1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHJ1bGVzRGlyKSkgcmV0dXJuIHsgcnVsZXM6IFtdIH07XG5cbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHJ1bGVzRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IHJ1bGVzOiBDZGRSdWxlU3VtbWFyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aChcIi5ydWxlcy5qc29uXCIpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGtleSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXFwucnVsZXNcXC5qc29uJC8sIFwiXCIpO1xuICAgIGNvbnN0IHJlbFBhdGggPSBgcnVsZXMvJHtlbnRyeS5uYW1lfWA7XG4gICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgZW50cnkubmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBkb2MgPSAvKiBTQUZFVFk6IFVJIOuPhOq1rOydmCBab2Qg7J6F66ClIOyKpO2CpOuniOqwgCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIEpTT04ucGFyc2UoXG4gICAgICAgIHJhdyxcbiAgICAgICkgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiB1bmtub3duW10gfTtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpc1N0cmluZ1ZhbHVlKGRvYy5kZXNjcmlwdGlvbikgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgICAgICBydWxlQ291bnQ6IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcy5sZW5ndGggOiAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgICAgICAgcnVsZUNvdW50OiAwLFxuICAgICAgICBwYXJzZUVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBydWxlcyB9O1xufVxuXG4vKiogcnVsZXMg7YyM7J28IOyDgeyEuCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUnVsZShydWxlS2V5OiBzdHJpbmcpOiBDZGRSdWxlRGV0YWlsIHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKGNvbnRyYWN0RGlyLCBcInJ1bGVzXCIsIGAke3J1bGVLZXl9LnJ1bGVzLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1bGVzIO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtydWxlS2V5fWApO1xuICB9XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGRvYyA9IC8qIFNBRkVUWTogVUkg64+E6rWs7J2YIFpvZCDsnoXroKUg7Iqk7YKk66eI6rCAIOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gSlNPTi5wYXJzZShcbiAgICByYXcsXG4gICkgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiBDZGRSdWxlRW50cnlbXSB9O1xuXG4gIHJldHVybiB7XG4gICAga2V5OiBydWxlS2V5LFxuICAgIHBhdGg6IGBydWxlcy8ke3J1bGVLZXl9LnJ1bGVzLmpzb25gLFxuICAgIGRlc2NyaXB0aW9uOiBpc1N0cmluZ1ZhbHVlKGRvYy5kZXNjcmlwdGlvbikgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgIHJ1bGVzOiBBcnJheS5pc0FycmF5KGRvYy5ydWxlcykgPyBkb2MucnVsZXMgOiBbXSxcbiAgfTtcbn1cblxuLyoqIHJ1bGVzIO2MjOydvOyXkCDqt5zsuZkg7LaU6rCAICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUnVsZShyZXE6IENkZEFkZFJ1bGVSZXF1ZXN0KTogQ2RkUnVsZURldGFpbCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIik7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGAke3JlcS5ydWxlS2V5fS5ydWxlcy5qc29uYCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSdWxlcyDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7cmVxLnJ1bGVLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZG9jID0gLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBKU09OLnBhcnNlKFxuICAgIHJhdyxcbiAgKSBhcyB7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyBydWxlcz86IENkZFJ1bGVFbnRyeVtdIH07XG4gIGNvbnN0IHJ1bGVzOiBDZGRSdWxlRW50cnlbXSA9IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcyA6IFtdO1xuXG4gIGNvbnN0IG5leHRJZCA9IGdlbmVyYXRlTmV4dFJ1bGVJZChydWxlcyk7XG4gIGNvbnN0IG5ld0VudHJ5OiBDZGRSdWxlRW50cnkgPSB7XG4gICAgaWQ6IG5leHRJZCxcbiAgICB3aGVuOiByZXEud2hlbixcbiAgICBpbnN0cnVjdGlvbjogcmVxLmluc3RydWN0aW9uLFxuICB9O1xuICBpZiAocmVxLmV4YW1wbGVzICYmIHJlcS5leGFtcGxlcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3RW50cnkuZXhhbXBsZXMgPSByZXEuZXhhbXBsZXM7XG4gIH1cblxuICBydWxlcy5wdXNoKG5ld0VudHJ5KTtcbiAgZG9jLnJ1bGVzID0gcnVsZXM7XG5cbiAgZnMud3JpdGVGaWxlU3luYyhhYnNQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShkb2MsIG51bGwsIDIpfVxcbmAsIFwidXRmLThcIik7XG5cbiAgcmV0dXJuIHtcbiAgICBrZXk6IHJlcS5ydWxlS2V5LFxuICAgIHBhdGg6IGBydWxlcy8ke3JlcS5ydWxlS2V5fS5ydWxlcy5qc29uYCxcbiAgICBkZXNjcmlwdGlvbjogaXNTdHJpbmdWYWx1ZShkb2MuZGVzY3JpcHRpb24pID8gZG9jLmRlc2NyaXB0aW9uIDogXCJcIixcbiAgICBydWxlcyxcbiAgfTtcbn1cblxuLyoqIOq4sOyhtCBpZCDtjKjthLTsnYQg67aE7ISd7ZWY7JesIOuLpOydjCDsiJzrsoggaWQg7IOd7ISxICovXG5mdW5jdGlvbiBnZW5lcmF0ZU5leHRSdWxlSWQocnVsZXM6IENkZFJ1bGVFbnRyeVtdKTogc3RyaW5nIHtcbiAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiUi0wMDFcIjtcblxuICBjb25zdCBudW1lcmljUGF0dGVybiA9IC9eKC4rPykoXFxkKykkLztcbiAgbGV0IGJlc3RQcmVmaXggPSBcIlItXCI7XG4gIGxldCBtYXhOdW0gPSAwO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgIGNvbnN0IG1hdGNoID0gbnVtZXJpY1BhdHRlcm4uZXhlYyhydWxlLmlkKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoWzFdO1xuICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gICAgICBpZiAobnVtID4gbWF4TnVtKSB7XG4gICAgICAgIGJlc3RQcmVmaXggPSBwcmVmaXg7XG4gICAgICAgIG1heE51bSA9IG51bTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXh0TnVtID0gbWF4TnVtICsgMTtcbiAgY29uc3QgcGFkTGVuID0gTWF0aC5tYXgoMywgU3RyaW5nKG1heE51bSkubGVuZ3RoKTtcbiAgcmV0dXJuIGAke2Jlc3RQcmVmaXh9JHtTdHJpbmcobmV4dE51bSkucGFkU3RhcnQocGFkTGVuLCBcIjBcIil9YDtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBBQyBBUEkgKG1vZHVsZXMvY2RkIGFjLWxpc3Qg7YyM7IuxIOuhnOyngSDrs7XsgqwpXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGRlc2NyaWJlL3Rlc3Qg7Yyo7YS0IO2MjOyLsSAqL1xuZnVuY3Rpb24gcGFyc2VBY0VudHJpZXMoY29udGVudDogc3RyaW5nKTogQ2RkQWNFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogQ2RkQWNFbnRyeVtdID0gW107XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcblxuICBsZXQgY3VycmVudERlc2NyaWJlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGV0IGRlc2NyaWJlRGVwdGggPSAwO1xuICBsZXQgYnJhY2VEZXB0aCA9IDA7XG4gIGxldCBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gIGxldCB0ZXN0QXNCcmFjZURlcHRoID0gMDtcbiAgbGV0IHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuXG4gICAgY29uc3QgZGVzY3JpYmVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL15kZXNjcmliZVxcKFtcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgaWYgKGRlc2NyaWJlTWF0Y2gpIHtcbiAgICAgIGN1cnJlbnREZXNjcmliZSA9IGRlc2NyaWJlTWF0Y2hbMV07XG4gICAgICBkZXNjcmliZURlcHRoID0gYnJhY2VEZXB0aDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXN0TWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eKD86dGVzdHxpdClcXChbXCInYF0oLis/KVtcIidgXS8pO1xuICAgIGlmICh0ZXN0TWF0Y2gpIHtcbiAgICAgIGVudHJpZXMucHVzaCh7XG4gICAgICAgIGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsXG4gICAgICAgIHRlc3Q6IHRlc3RNYXRjaFsxXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghcGVuZGluZ1Rlc3RBcyAmJiB0cmltbWVkLm1hdGNoKC9edGVzdEFzXFxzKlxcKC8pKSB7XG4gICAgICBjb25zdCBpbmxpbmVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL150ZXN0QXNcXHMqXFwoXFxzKlxce1tefV0qXFx9XFxzKixcXHMqW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgIGlmIChpbmxpbmVNYXRjaCkge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBpbmxpbmVNYXRjaFsxXSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmdUZXN0QXMgPSB0cnVlO1xuICAgICAgICB0ZXN0QXNCcmFjZURlcHRoID0gMDtcbiAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0cmltbWVkKSB7XG4gICAgICAgICAgaWYgKGNoID09PSBcIntcIikgdGVzdEFzQnJhY2VEZXB0aCsrO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHRlc3RBc0JyYWNlRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVzdEFzQnJhY2VEZXB0aCA8PSAwKSB7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL31cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICAgIHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwZW5kaW5nVGVzdEFzKSB7XG4gICAgICBpZiAoIXRlc3RBc05lZWROYW1lKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdHJpbW1lZCkge1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ7XCIpIHRlc3RBc0JyYWNlRGVwdGgrKztcbiAgICAgICAgICBpZiAoY2ggPT09IFwifVwiKSB0ZXN0QXNCcmFjZURlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRlc3RBc0JyYWNlRGVwdGggPD0gMCkge1xuICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSB0cmltbWVkLm1hdGNoKC99XFxzKixcXHMqW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgICAgICBpZiAobmFtZU1hdGNoKSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBuYW1lTWF0Y2hbMV0gfSk7XG4gICAgICAgICAgICBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gICAgICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXltcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICBlbnRyaWVzLnB1c2goeyBkZXNjcmliZTogY3VycmVudERlc2NyaWJlLCB0ZXN0OiBuYW1lTWF0Y2hbMV0gfSk7XG4gICAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IGZhbHNlO1xuICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoIG9mIHRyaW1tZWQpIHtcbiAgICAgIGlmIChjaCA9PT0gXCJ7XCIpIGJyYWNlRGVwdGgrKztcbiAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHtcbiAgICAgICAgYnJhY2VEZXB0aC0tO1xuICAgICAgICBpZiAoY3VycmVudERlc2NyaWJlICYmIGJyYWNlRGVwdGggPD0gZGVzY3JpYmVEZXB0aCkge1xuICAgICAgICAgIGN1cnJlbnREZXNjcmliZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cblxuLyoqIO2UhOuhnOygne2KuCDrgrQgKi50ZXN0LnRzIO2MjOydvOydhCDsiqTsupTtlZjsl6wgQUMg66qp66GdIOuwmO2ZmCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjTGlzdCgpOiBDZGRBY0xpc3RSZXN1bHQge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGdldFByb2plY3RSb290KCk7XG4gIGNvbnN0IGZpbGVzID0gZmluZFRlc3RGaWxlcyhwcm9qZWN0Um9vdCk7XG5cbiAgY29uc3QgYWNGaWxlczogQ2RkQWNGaWxlW10gPSBbXTtcbiAgZm9yIChjb25zdCBhYnNQYXRoIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZUFjRW50cmllcyhjb250ZW50KTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBhY0ZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBhYnNQYXRoKSxcbiAgICAgICAgZW50cmllcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0gYWNGaWxlcy5yZWR1Y2UoKHN1bSwgZikgPT4gc3VtICsgZi5lbnRyaWVzLmxlbmd0aCwgMCk7XG4gIHJldHVybiB7IGZpbGVzOiBhY0ZpbGVzLCB0b3RhbCB9O1xufVxuXG4vKiogKi50ZXN0LnRzIO2MjOydvOydhCDsnqzqt4Ag7YOQ7IOJIChub2RlX21vZHVsZXMsIGRpc3Qg7KCc7Jm4KSAqL1xuZnVuY3Rpb24gZmluZFRlc3RGaWxlcyhkaXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgSUdOT1JFID0gbmV3IFNldChbXCJub2RlX21vZHVsZXNcIiwgXCJkaXN0XCIsIFwiLmdpdFwiLCBcImNvbnRyYWN0XCJdKTtcblxuICBmdW5jdGlvbiB3YWxrKGN1cnJlbnREaXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBlbnRyaWVzOiBmcy5EaXJlbnRbXTtcbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGN1cnJlbnREaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoSUdOT1JFLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHdhbGsoZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLnRlc3QudHNcIikpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3YWxrKGRpcik7XG4gIHJlc3VsdHMuc29ydCgpO1xuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBa0RBLFNBQVMsaUJBQXlCO0NBQ2hDLE9BQU8sS0FBSyxLQUFLLE9BQU8sYUFBYSxNQUFN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
@@ -7,7 +7,7 @@ import { MigrationTargetExecutionError, Migrator, init_migrator } from "../migra
7
7
  import { forwardAsyncErrors, init_async_route } from "./async-route.js";
8
8
  import { readFile } from "fs/promises";
9
9
  import { PassThrough } from "stream";
10
- //#region src/ui/migrations-api.ts
10
+ // src/ui/migrations-api.ts
11
11
  function assertTargets(migrator, targets) {
12
12
  const allowed = new Set(migrator.getConnections().map(({ connKey }) => connKey));
13
13
  const invalid = targets.filter((target) => !allowed.has(target));
@@ -119,11 +119,13 @@ function sendMigrationStream(reply, action, targets, run, afterComplete) {
119
119
  result
120
120
  });
121
121
  } catch (caught) {
122
+ const message = caught instanceof Error ? caught.message : String(caught);
123
+ const failedTarget = caught instanceof MigrationTargetExecutionError ? caught.connKey : current?.connKey;
122
124
  write({
123
125
  type: "error",
124
126
  action,
125
- message: caught instanceof Error ? caught.message : String(caught),
126
- connKey: caught instanceof MigrationTargetExecutionError ? caught.connKey : current?.connKey,
127
+ message,
128
+ connKey: failedTarget,
127
129
  file: current?.type === "file-start" || current?.type === "file-executed" ? current.file : void 0,
128
130
  completedTargets,
129
131
  pendingTargets: targets.filter((target) => !completedTargets.includes(target))
@@ -208,8 +210,7 @@ var init_migrations_api = __esmMin((() => {
208
210
  "::1"
209
211
  ]);
210
212
  }));
211
- //#endregion
212
213
  init_migrations_api();
213
214
  export { init_migrations_api, registerMigrationsApi };
214
215
 
215
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9ucy1hcGkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL21pZ3JhdGlvbnMtYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gXCJzdHJlYW1cIjtcblxuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQge1xuICBNaWdyYXRvcixcbiAgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IsXG4gIHR5cGUgTWlncmF0aW9uUmVzdWx0LFxufSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cyxcbiAgdHlwZSBNaWdyYXRpb25Qcm9ncmVzc0V2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblN0cmVhbUV2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblRhcmdldCxcbn0gZnJvbSBcIi4uL21pZ3JhdGlvbi90eXBlc1wiO1xuaW1wb3J0IHsgZm9yd2FyZEFzeW5jRXJyb3JzIH0gZnJvbSBcIi4vYXN5bmMtcm91dGVcIjtcblxudHlwZSBBcHByb3ZhbFJlYWR5ID0geyB0eXBlOiBcInJlYWR5XCIgfTtcbnR5cGUgQXBwcm92YWxSZXN1bHQgPSBBcHByb3ZhbFJlYWR5IHwgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdDtcbnR5cGUgQXBwbHlCb2R5ID0geyB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXTsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG50eXBlIExlZ2FjeUFwcGx5Qm9keSA9IEFwcGx5Qm9keSAmIHsgZm9yY2U/OiBib29sZWFuOyBmb3JjZVJlYXNvbj86IHN0cmluZyB9O1xuXG5jb25zdCBMT0NBTF9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5cbmZ1bmN0aW9uIGFzc2VydFRhcmdldHMobWlncmF0b3I6IE1pZ3JhdG9yLCB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSk6IHZvaWQge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpKTtcbiAgY29uc3QgaW52YWxpZCA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkLmhhcyh0YXJnZXQpKTtcbiAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwIHx8IGludmFsaWQubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogYEludmFsaWQgbWlncmF0aW9uIHRhcmdldHM6ICR7aW52YWxpZC5sZW5ndGggPT09IDAgPyBcIihlbXB0eSlcIiA6IGludmFsaWQuam9pbihcIiwgXCIpfWAsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjazogU2xhY2tDb25maXJtLCB0YXJnZXQ6IE1pZ3JhdGlvblRhcmdldCk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXVcbiAgICAuZGJDb25maWdbdGFyZ2V0XT8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3RlID0gIUxPQ0FMX0hPU1RTLmhhcygoY29ubmVjdGlvbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHJlbW90ZSAmJiBzbGFjay5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodGFyZ2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4pOiBQcm9taXNlPE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXT4ge1xuICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KSkpO1xuICBjb25zdCBmYWlsZWQgPSBzdGF0dXNlcy5maWx0ZXIoKHsgc3RhdHVzLCBlcnJvciB9KSA9PiBzdGF0dXMgPT09IFwiZXJyb3JcIiB8fCBlcnJvciAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpLCB7XG4gICAgICBtZXNzYWdlOiBgTWlncmF0aW9uIHN0YXR1cyBjb3VsZCBub3QgYmUgdmVyaWZpZWQ6ICR7ZmFpbGVkLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpLmpvaW4oXCIsIFwiKX1gLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXSkge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoc3RhdHVzZXMuZmxhdE1hcCgoeyBwZW5kaW5nIH0pID0+IHBlbmRpbmcpKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBcHByb3ZhbChcbiAgbWlncmF0b3I6IE1pZ3JhdG9yLFxuICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgcmVxdWVzdG9yPzogc3RyaW5nLFxuKTogUHJvbWlzZTxBcHByb3ZhbFJlc3VsdD4ge1xuICBhc3NlcnRUYXJnZXRzKG1pZ3JhdG9yLCB0YXJnZXRzKTtcbiAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBnZXRBdmFpbGFibGVUYXJnZXRTdGF0dXNlcyhtaWdyYXRvciwgdGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldFJlcXVpcmVzQXBwcm92YWwoc2xhY2ssIHRhcmdldCkpO1xuICBpZiAoIXJlcXVpcmVzQXBwcm92YWwgfHwgIXNsYWNrLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gIH1cblxuICBjb25zdCBwZW5kaW5nID0gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXMpO1xuICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlYWR5XCIgfTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2xhY2suZ2V0RXhpc3RpbmdSZXF1ZXN0KHBlbmRpbmcpO1xuICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIHtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHNsYWNrLmNoZWNrQXBwcm92YWwoZXhpc3RpbmcuY2hhbm5lbCwgZXhpc3RpbmcudHMpO1xuICAgIGlmIChhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gICAgfVxuICAgIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBcInBlbmRpbmdcIiwgLi4uZXhpc3RpbmcgfTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIHRhcmdldHMsIHJlcXVlc3Rvcik7XG4gIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gIHJldHVybiB7IHR5cGU6IFwicGVuZGluZ1wiLCAuLi5jcmVhdGVkIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZlZEFwcGx5KFxuICBib2R5OiBBcHBseUJvZHksXG4gIHN0YXR1c2VzOiBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzW10sXG4pOiBQcm9taXNlPHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfCBudWxsPiB7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogXCJTbGFjayBhcHByb3ZhbCBoYXMgbm90IGJlZW4gcmVxdWVzdGVkXCIsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXBwcm92YWwgPSBhd2FpdCBzbGFjay5jaGVja0FwcHJvdmFsKGV4aXN0aW5nLmNoYW5uZWwsIGV4aXN0aW5nLnRzKTtcbiAgaWYgKGFwcHJvdmFsLnJlamVjdGVkKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICB9XG4gIGlmICghYXBwcm92YWwuYXBwcm92ZWQpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLmJhZFJlcXVlc3RcIiksIHtcbiAgICAgIG1lc3NhZ2U6IFwiU2xhY2sgYXBwcm92YWwgaXMgc3RpbGwgcGVuZGluZ1wiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBleGlzdGluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTGVnYWN5QXBwbHkoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgYm9keTogTGVnYWN5QXBwbHlCb2R5LFxuKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0PiB7XG4gIGFzc2VydFRhcmdldHMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbWlncmF0b3IuYXBwbHkoYm9keS50YXJnZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBtaWdyYXRvci5hcHBseShib2R5LnRhcmdldHMpO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIGJvZHkudGFyZ2V0cywgYm9keS5yZXF1ZXN0b3IpO1xuICAgIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmNyZWF0ZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJvdmFsID0gYXdhaXQgc2xhY2suY2hlY2tBcHByb3ZhbChleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cyk7XG4gIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm1pZ3JhdGlvblJlamVjdGVkXCIpKTtcbiAgfVxuICBpZiAoIWFwcHJvdmFsLmFwcHJvdmVkICYmICFib2R5LmZvcmNlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmV4aXN0aW5nIH07XG4gIH1cbiAgaWYgKCFhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgZXhpc3RpbmcudHMsXG4gICAgICBib2R5LmZvcmNlUmVhc29uID8/IFwi7IKs7JygIOyXhuydjFwiLFxuICAgICAgYm9keS5yZXF1ZXN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLmFwcGx5KGJvZHkudGFyZ2V0cyk7XG4gIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IHNsYWNrLmxvZ0V4ZWN1dGlvbihleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cywgcmVzdWx0LCBib2R5LnJlcXVlc3Rvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2VuZE1pZ3JhdGlvblN0cmVhbShcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgYWN0aW9uOiBNaWdyYXRpb25BY3Rpb24sXG4gIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICBydW46IChvblByb2dyZXNzOiAoZXZlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQpID0+IHZvaWQpID0+IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PixcbiAgYWZ0ZXJDb21wbGV0ZT86IChyZXN1bHQ6IE1pZ3JhdGlvblJlc3VsdCkgPT4gUHJvbWlzZTx2b2lkPixcbikge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgbGV0IGNhbldyaXRlID0gdHJ1ZTtcbiAgbGV0IGN1cnJlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbXBsZXRlZFRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdID0gW107XG4gIGNvbnN0IHdyaXRlID0gKGV2ZW50OiBNaWdyYXRpb25TdHJlYW1FdmVudCkgPT4ge1xuICAgIGlmIChjYW5Xcml0ZSAmJiAhc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgc3RyZWFtLndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1cXG5gKTtcbiAgICB9XG4gIH07XG5cbiAgc3RyZWFtLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgIGNhbldyaXRlID0gZmFsc2U7XG4gIH0pO1xuICByZXBseVxuICAgIC5oZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LW5kanNvbjsgY2hhcnNldD11dGYtOFwiKVxuICAgIC5oZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGUsIG5vLXRyYW5zZm9ybVwiKVxuICAgIC5oZWFkZXIoXCJjb250ZW50LWVuY29kaW5nXCIsIFwiaWRlbnRpdHlcIilcbiAgICAuaGVhZGVyKFwieC1uby1jb21wcmVzc2lvblwiLCBcIjFcIik7XG5cbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4oKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInRhcmdldC1jb21wbGV0ZVwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmNvbm5LZXkgIT09IFwic2hhZG93XCIpIGNvbXBsZXRlZFRhcmdldHMucHVzaChldmVudC5jb25uS2V5KTtcbiAgICAgICAgICB3cml0ZShldmVudCk7XG4gICAgICAgICAgLy8g64uk7J2MIHRhcmdldOydmCBsaWZlY3ljbGXsnbQg7Iuc7J6R65CY6riwIOyghCDsmKTrpZjrpbwg7KeB7KCEIHRhcmdldOyXkCDsnpjrqrsg6reA7IaN7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgICAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gZXZlbnQ7XG4gICAgICAgIHdyaXRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJDb21wbGV0ZT8uKHJlc3VsdCk7XG4gICAgICB3cml0ZSh7IHR5cGU6IFwiY29tcGxldGVcIiwgcmVzdWx0IH0pO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgIGNvbnN0IGZhaWxlZFRhcmdldCA9XG4gICAgICAgIGNhdWdodCBpbnN0YW5jZW9mIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yID8gY2F1Z2h0LmNvbm5LZXkgOiBjdXJyZW50Py5jb25uS2V5O1xuICAgICAgd3JpdGUoe1xuICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgY29ubktleTogZmFpbGVkVGFyZ2V0LFxuICAgICAgICBmaWxlOlxuICAgICAgICAgIGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1zdGFydFwiIHx8IGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1leGVjdXRlZFwiXG4gICAgICAgICAgICA/IGN1cnJlbnQuZmlsZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbXBsZXRlZFRhcmdldHMsXG4gICAgICAgIHBlbmRpbmdUYXJnZXRzOiB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhY29tcGxldGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpKSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gcmVwbHkuc2VuZChzdHJlYW0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJNaWdyYXRpb25zQXBpKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSB7XG4gIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG5cbiAgc2VydmVyLmdldChcIi9hcGkvbWlncmF0aW9ucy9jb25uZWN0aW9uc1wiLCBhc3luYyAoKSA9PiAoe1xuICAgIGNvbm5lY3Rpb25zOiBtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLFxuICB9KSk7XG4gIHNlcnZlci5nZXQoXCIvYXBpL21pZ3JhdGlvbnMvY29kZXNcIiwgYXN5bmMgKCkgPT4gKHsgY29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldE1pZ3JhdGlvbkNvZGVzKCkgfSkpO1xuICBzZXJ2ZXIuZ2V0PHsgUXVlcnlzdHJpbmc6IHsgY29kZU5hbWU6IHN0cmluZyB9IH0+KFwiL2FwaS9taWdyYXRpb25zL2NvZGVcIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1pZ3JhdGlvbkNvZGUgPSAoYXdhaXQgbWlncmF0b3IuZ2V0TWlncmF0aW9uQ29kZXMoKSkuZmluZChcbiAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lID09PSByZXF1ZXN0LnF1ZXJ5LmNvZGVOYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChtaWdyYXRpb25Db2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGU6IGF3YWl0IHJlYWRGaWxlKG1pZ3JhdGlvbkNvZGUucGF0aCwgXCJ1dGY4XCIpIH07XG4gICAgfSksXG4gICk7XG4gIHNlcnZlci5nZXQ8eyBRdWVyeXN0cmluZzogeyBjb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXCIvYXBpL21pZ3JhdGlvbnMvc3RhdHVzXCIsIChyZXF1ZXN0KSA9PlxuICAgIGZvcndhcmRBc3luY0Vycm9ycyhhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5xdWVyeS5jb25uS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBhd2FpdCBtaWdyYXRvci5nZXRDb25uZWN0aW9uU3RhdHVzKHJlcXVlc3QucXVlcnkuY29ubktleSkgfTtcbiAgICB9KSxcbiAgKTtcbiAgc2VydmVyLmdldDx7IFF1ZXJ5c3RyaW5nOiB7IGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9wcmVwYXJlZC1jb2Rlc1wiLFxuICAgIChyZXF1ZXN0KSA9PlxuICAgICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+ICh7XG4gICAgICAgIHByZXBhcmVkQ29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldFByZXBhcmVkQ29kZXMocmVxdWVzdC5xdWVyeS5jb21wYXJlQ29ubktleSksXG4gICAgICB9KSksXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvcmVxdWVzdC1hcHByb3ZhbFwiLCAocmVxdWVzdCkgPT5cbiAgICBmb3J3YXJkQXN5bmNFcnJvcnMoYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIHJlcXVlc3RBcHByb3ZhbChtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMsIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IpO1xuICAgIH0pLFxuICApO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvY2hlY2tBcHByb3ZhbFwiLFxuICAgIChyZXF1ZXN0KSA9PlxuICAgICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2xhY2sgPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgICAgIHJldHVybiBzbGFjay5pc0NvbmZpZ3VyZWQoKVxuICAgICAgICAgID8gc2xhY2suY2hlY2tBcHByb3ZhbChyZXF1ZXN0LmJvZHkuY2hhbm5lbCwgcmVxdWVzdC5ib2R5LnRzKVxuICAgICAgICAgIDogeyBhcHByb3ZlZDogdHJ1ZSwgcmVqZWN0ZWQ6IGZhbHNlIH07XG4gICAgICB9KSxcbiAgKTtcbiAgc2VydmVyLnBvc3Q8e1xuICAgIEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nOyByZWFzb246IHN0cmluZzsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG4gIH0+KFwiL2FwaS9taWdyYXRpb25zL2ZvcmNlQXBwcm92YWxcIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgICAgaWYgKCFzbGFjay5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICAgIHJlcXVlc3QuYm9keS5jaGFubmVsLFxuICAgICAgICByZXF1ZXN0LmJvZHkudHMsXG4gICAgICAgIHJlcXVlc3QuYm9keS5yZWFzb24sXG4gICAgICAgIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH0pLFxuICApO1xuXG4gIHNlcnZlci5wb3N0KFwiL2FwaS9taWdyYXRpb25zL3NoYWRvd1wiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgcmV0dXJuIHNlbmRNaWdyYXRpb25TdHJlYW0ocmVwbHksIFwic2hhZG93XCIsIFtdLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoeyBvblByb2dyZXNzIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvYXBwbHlcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHJlcXVpcmVBcHByb3ZlZEFwcGx5KHJlcXVlc3QuYm9keSwgc3RhdHVzZXMpO1xuICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKFxuICAgICAgcmVwbHksXG4gICAgICBcImFwcGx5XCIsXG4gICAgICByZXF1ZXN0LmJvZHkudGFyZ2V0cyxcbiAgICAgIChvblByb2dyZXNzKSA9PiBtaWdyYXRvci5hcHBseShyZXF1ZXN0LmJvZHkudGFyZ2V0cywgeyBvblByb2dyZXNzIH0pLFxuICAgICAgYXBwcm92YWwgPT09IG51bGxcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgU2xhY2tDb25maXJtKCkubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICBhcHByb3ZhbC5jaGFubmVsLFxuICAgICAgICAgICAgICBhcHByb3ZhbC50cyxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkucmVxdWVzdG9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICk7XG4gIH0pO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10gfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9yb2xsYmFja1wiLFxuICAgIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgICAgYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKHJlcGx5LCBcInJvbGxiYWNrXCIsIHJlcXVlc3QuYm9keS50YXJnZXRzLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMsIHsgb25Qcm9ncmVzcyB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvZ2VuZXJhdGVQcmVwYXJlZENvZGVzXCIsXG4gICAgKHJlcXVlc3QpID0+XG4gICAgICBmb3J3YXJkQXN5bmNFcnJvcnMoYXN5bmMgKCkgPT4gbWlncmF0b3IuZ2VuZXJhdGVQcmVwYXJlZENvZGVzKHJlcXVlc3QuYm9keS5jb21wYXJlQ29ubktleSkpLFxuICApO1xuXG4gIC8vIOydtOyghCBVSSDrsojrk6Tqs7wg7Jm467aAIOyKpO2BrOumve2KuOqwgCDsg4gg7ISc67KE7JeQ7ISc64+EIO2VnCDrprTrpqzsiqQg64+Z7JWIIOuPmeyeke2VmOuPhOuhnSDsnKDsp4Dtlanri4jri6QuXG4gIHNlcnZlci5wb3N0PHtcbiAgICBCb2R5OiB7XG4gICAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIiB8IFwic2hhZG93XCI7XG4gICAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgICBmb3JjZT86IGJvb2xlYW47XG4gICAgICBmb3JjZVJlYXNvbj86IHN0cmluZztcbiAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICB9O1xuICB9PihcIi9hcGkvbWlncmF0aW9ucy9ydW5BY3Rpb25cIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LmJvZHkuYWN0aW9uID09PSBcInNoYWRvd1wiKSB7XG4gICAgICAgIHJldHVybiBtaWdyYXRvci5ydW5TaGFkb3dUZXN0KCk7XG4gICAgICB9XG4gICAgICBpZiAocmVxdWVzdC5ib2R5LmFjdGlvbiA9PT0gXCJhcHBseVwiKSB7XG4gICAgICAgIHJldHVybiBydW5MZWdhY3lBcHBseShtaWdyYXRvciwgcmVxdWVzdC5ib2R5KTtcbiAgICAgIH1cbiAgICAgIGFzc2VydFRhcmdldHMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIGF3YWl0IGdldEF2YWlsYWJsZVRhcmdldFN0YXR1c2VzKG1pZ3JhdG9yLCByZXF1ZXN0LmJvZHkudGFyZ2V0cyk7XG4gICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIH0pLFxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBK0JBLFNBQVMsY0FBYyxVQUFvQixTQUFrQztDQUMzRSxNQUFNLFVBQVUsSUFBSSxJQUFJLFNBQVMsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsT0FBTyxDQUFDO0NBQy9FLE1BQU0sVUFBVSxRQUFRLFFBQVEsV0FBVyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7Q0FDL0QsSUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLFNBQVMsR0FDM0MsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsOEJBQThCLFFB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
216
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9ucy1hcGkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL21pZ3JhdGlvbnMtYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gXCJzdHJlYW1cIjtcblxuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5IH0gZnJvbSBcImZhc3RpZnlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uL2RpY3Qvc2RcIjtcbmltcG9ydCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQge1xuICBNaWdyYXRvcixcbiAgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IsXG4gIHR5cGUgTWlncmF0aW9uUmVzdWx0LFxufSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cyxcbiAgdHlwZSBNaWdyYXRpb25Qcm9ncmVzc0V2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblN0cmVhbUV2ZW50LFxuICB0eXBlIE1pZ3JhdGlvblRhcmdldCxcbn0gZnJvbSBcIi4uL21pZ3JhdGlvbi90eXBlc1wiO1xuaW1wb3J0IHsgZm9yd2FyZEFzeW5jRXJyb3JzIH0gZnJvbSBcIi4vYXN5bmMtcm91dGVcIjtcblxudHlwZSBBcHByb3ZhbFJlYWR5ID0geyB0eXBlOiBcInJlYWR5XCIgfTtcbnR5cGUgQXBwcm92YWxSZXN1bHQgPSBBcHByb3ZhbFJlYWR5IHwgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdDtcbnR5cGUgQXBwbHlCb2R5ID0geyB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXTsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG50eXBlIExlZ2FjeUFwcGx5Qm9keSA9IEFwcGx5Qm9keSAmIHsgZm9yY2U/OiBib29sZWFuOyBmb3JjZVJlYXNvbj86IHN0cmluZyB9O1xuXG5jb25zdCBMT0NBTF9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5cbmZ1bmN0aW9uIGFzc2VydFRhcmdldHMobWlncmF0b3I6IE1pZ3JhdG9yLCB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSk6IHZvaWQge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpKTtcbiAgY29uc3QgaW52YWxpZCA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkLmhhcyh0YXJnZXQpKTtcbiAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwIHx8IGludmFsaWQubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogYEludmFsaWQgbWlncmF0aW9uIHRhcmdldHM6ICR7aW52YWxpZC5sZW5ndGggPT09IDAgPyBcIihlbXB0eSlcIiA6IGludmFsaWQuam9pbihcIiwgXCIpfWAsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjazogU2xhY2tDb25maXJtLCB0YXJnZXQ6IE1pZ3JhdGlvblRhcmdldCk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25uZWN0aW9uID0gLyogU0FGRVRZOiBVSSDrj4TqtazsnZggWm9kIOyeheugpSDsiqTtgqTrp4jqsIAg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXVcbiAgICAuZGJDb25maWdbdGFyZ2V0XT8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3RlID0gIUxPQ0FMX0hPU1RTLmhhcygoY29ubmVjdGlvbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiKS50b0xvd2VyQ2FzZSgpKTtcbiAgcmV0dXJuIHJlbW90ZSAmJiBzbGFjay5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodGFyZ2V0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4pOiBQcm9taXNlPE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXT4ge1xuICBjb25zdCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHRhcmdldHMubWFwKCh0YXJnZXQpID0+IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KSkpO1xuICBjb25zdCBmYWlsZWQgPSBzdGF0dXNlcy5maWx0ZXIoKHsgc3RhdHVzLCBlcnJvciB9KSA9PiBzdGF0dXMgPT09IFwiZXJyb3JcIiB8fCBlcnJvciAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpLCB7XG4gICAgICBtZXNzYWdlOiBgTWlncmF0aW9uIHN0YXR1cyBjb3VsZCBub3QgYmUgdmVyaWZpZWQ6ICR7ZmFpbGVkLm1hcCgoeyBjb25uS2V5IH0pID0+IGNvbm5LZXkpLmpvaW4oXCIsIFwiKX1gLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBzdGF0dXNlcztcbn1cblxuZnVuY3Rpb24gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXNbXSkge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoc3RhdHVzZXMuZmxhdE1hcCgoeyBwZW5kaW5nIH0pID0+IHBlbmRpbmcpKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RBcHByb3ZhbChcbiAgbWlncmF0b3I6IE1pZ3JhdG9yLFxuICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgcmVxdWVzdG9yPzogc3RyaW5nLFxuKTogUHJvbWlzZTxBcHByb3ZhbFJlc3VsdD4ge1xuICBhc3NlcnRUYXJnZXRzKG1pZ3JhdG9yLCB0YXJnZXRzKTtcbiAgY29uc3Qgc3RhdHVzZXMgPSBhd2FpdCBnZXRBdmFpbGFibGVUYXJnZXRTdGF0dXNlcyhtaWdyYXRvciwgdGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gdGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldFJlcXVpcmVzQXBwcm92YWwoc2xhY2ssIHRhcmdldCkpO1xuICBpZiAoIXJlcXVpcmVzQXBwcm92YWwgfHwgIXNsYWNrLmlzQ29uZmlndXJlZCgpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gIH1cblxuICBjb25zdCBwZW5kaW5nID0gZ2V0UGVuZGluZ01pZ3JhdGlvbnMoc3RhdHVzZXMpO1xuICBpZiAocGVuZGluZy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlYWR5XCIgfTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2xhY2suZ2V0RXhpc3RpbmdSZXF1ZXN0KHBlbmRpbmcpO1xuICBpZiAoZXhpc3RpbmcgIT09IG51bGwpIHtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHNsYWNrLmNoZWNrQXBwcm92YWwoZXhpc3RpbmcuY2hhbm5lbCwgZXhpc3RpbmcudHMpO1xuICAgIGlmIChhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJyZWFkeVwiIH07XG4gICAgfVxuICAgIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBcInBlbmRpbmdcIiwgLi4uZXhpc3RpbmcgfTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIHRhcmdldHMsIHJlcXVlc3Rvcik7XG4gIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gIHJldHVybiB7IHR5cGU6IFwicGVuZGluZ1wiLCAuLi5jcmVhdGVkIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZlZEFwcGx5KFxuICBib2R5OiBBcHBseUJvZHksXG4gIHN0YXR1c2VzOiBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzW10sXG4pOiBQcm9taXNlPHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfCBudWxsPiB7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IuYmFkUmVxdWVzdFwiKSwge1xuICAgICAgbWVzc2FnZTogXCJTbGFjayBhcHByb3ZhbCBoYXMgbm90IGJlZW4gcmVxdWVzdGVkXCIsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYXBwcm92YWwgPSBhd2FpdCBzbGFjay5jaGVja0FwcHJvdmFsKGV4aXN0aW5nLmNoYW5uZWwsIGV4aXN0aW5nLnRzKTtcbiAgaWYgKGFwcHJvdmFsLnJlamVjdGVkKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICB9XG4gIGlmICghYXBwcm92YWwuYXBwcm92ZWQpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLmJhZFJlcXVlc3RcIiksIHtcbiAgICAgIG1lc3NhZ2U6IFwiU2xhY2sgYXBwcm92YWwgaXMgc3RpbGwgcGVuZGluZ1wiLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBleGlzdGluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuTGVnYWN5QXBwbHkoXG4gIG1pZ3JhdG9yOiBNaWdyYXRvcixcbiAgYm9keTogTGVnYWN5QXBwbHlCb2R5LFxuKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0PiB7XG4gIGFzc2VydFRhcmdldHMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIGJvZHkudGFyZ2V0cyk7XG4gIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gYm9keS50YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0UmVxdWlyZXNBcHByb3ZhbChzbGFjaywgdGFyZ2V0KSk7XG4gIGlmICghcmVxdWlyZXNBcHByb3ZhbCB8fCAhc2xhY2suaXNDb25maWd1cmVkKCkpIHtcbiAgICByZXR1cm4gbWlncmF0b3IuYXBwbHkoYm9keS50YXJnZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmcgPSBnZXRQZW5kaW5nTWlncmF0aW9ucyhzdGF0dXNlcyk7XG4gIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBtaWdyYXRvci5hcHBseShib2R5LnRhcmdldHMpO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzbGFjay5nZXRFeGlzdGluZ1JlcXVlc3QocGVuZGluZyk7XG4gIGlmIChleGlzdGluZyA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzbGFjay5wb3N0QXBwcm92YWxSZXF1ZXN0KHBlbmRpbmcsIGJvZHkudGFyZ2V0cywgYm9keS5yZXF1ZXN0b3IpO1xuICAgIGF3YWl0IHNsYWNrLnNhdmVSZXF1ZXN0KHBlbmRpbmcsIGNyZWF0ZWQuY2hhbm5lbCwgY3JlYXRlZC50cyk7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmNyZWF0ZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJvdmFsID0gYXdhaXQgc2xhY2suY2hlY2tBcHByb3ZhbChleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cyk7XG4gIGlmIChhcHByb3ZhbC5yZWplY3RlZCkge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLm1pZ3JhdGlvblJlamVjdGVkXCIpKTtcbiAgfVxuICBpZiAoIWFwcHJvdmFsLmFwcHJvdmVkICYmICFib2R5LmZvcmNlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJwZW5kaW5nXCIsIC4uLmV4aXN0aW5nIH07XG4gIH1cbiAgaWYgKCFhcHByb3ZhbC5hcHByb3ZlZCkge1xuICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICBleGlzdGluZy5jaGFubmVsLFxuICAgICAgZXhpc3RpbmcudHMsXG4gICAgICBib2R5LmZvcmNlUmVhc29uID8/IFwi7IKs7JygIOyXhuydjFwiLFxuICAgICAgYm9keS5yZXF1ZXN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLmFwcGx5KGJvZHkudGFyZ2V0cyk7XG4gIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IHNsYWNrLmxvZ0V4ZWN1dGlvbihleGlzdGluZy5jaGFubmVsLCBleGlzdGluZy50cywgcmVzdWx0LCBib2R5LnJlcXVlc3Rvcik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2VuZE1pZ3JhdGlvblN0cmVhbShcbiAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgYWN0aW9uOiBNaWdyYXRpb25BY3Rpb24sXG4gIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICBydW46IChvblByb2dyZXNzOiAoZXZlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQpID0+IHZvaWQpID0+IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PixcbiAgYWZ0ZXJDb21wbGV0ZT86IChyZXN1bHQ6IE1pZ3JhdGlvblJlc3VsdCkgPT4gUHJvbWlzZTx2b2lkPixcbikge1xuICBjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgbGV0IGNhbldyaXRlID0gdHJ1ZTtcbiAgbGV0IGN1cnJlbnQ6IE1pZ3JhdGlvblByb2dyZXNzRXZlbnQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbXBsZXRlZFRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdID0gW107XG4gIGNvbnN0IHdyaXRlID0gKGV2ZW50OiBNaWdyYXRpb25TdHJlYW1FdmVudCkgPT4ge1xuICAgIGlmIChjYW5Xcml0ZSAmJiAhc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgc3RyZWFtLndyaXRlKGAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1cXG5gKTtcbiAgICB9XG4gIH07XG5cbiAgc3RyZWFtLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgIGNhbldyaXRlID0gZmFsc2U7XG4gIH0pO1xuICByZXBseVxuICAgIC5oZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LW5kanNvbjsgY2hhcnNldD11dGYtOFwiKVxuICAgIC5oZWFkZXIoXCJjYWNoZS1jb250cm9sXCIsIFwibm8tY2FjaGUsIG5vLXRyYW5zZm9ybVwiKVxuICAgIC5oZWFkZXIoXCJjb250ZW50LWVuY29kaW5nXCIsIFwiaWRlbnRpdHlcIilcbiAgICAuaGVhZGVyKFwieC1uby1jb21wcmVzc2lvblwiLCBcIjFcIik7XG5cbiAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW4oKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInRhcmdldC1jb21wbGV0ZVwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmNvbm5LZXkgIT09IFwic2hhZG93XCIpIGNvbXBsZXRlZFRhcmdldHMucHVzaChldmVudC5jb25uS2V5KTtcbiAgICAgICAgICB3cml0ZShldmVudCk7XG4gICAgICAgICAgLy8g64uk7J2MIHRhcmdldOydmCBsaWZlY3ljbGXsnbQg7Iuc7J6R65CY6riwIOyghCDsmKTrpZjrpbwg7KeB7KCEIHRhcmdldOyXkCDsnpjrqrsg6reA7IaN7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgICAgICBjdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gZXZlbnQ7XG4gICAgICAgIHdyaXRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJDb21wbGV0ZT8uKHJlc3VsdCk7XG4gICAgICB3cml0ZSh7IHR5cGU6IFwiY29tcGxldGVcIiwgcmVzdWx0IH0pO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgIGNvbnN0IGZhaWxlZFRhcmdldCA9XG4gICAgICAgIGNhdWdodCBpbnN0YW5jZW9mIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yID8gY2F1Z2h0LmNvbm5LZXkgOiBjdXJyZW50Py5jb25uS2V5O1xuICAgICAgd3JpdGUoe1xuICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgY29ubktleTogZmFpbGVkVGFyZ2V0LFxuICAgICAgICBmaWxlOlxuICAgICAgICAgIGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1zdGFydFwiIHx8IGN1cnJlbnQ/LnR5cGUgPT09IFwiZmlsZS1leGVjdXRlZFwiXG4gICAgICAgICAgICA/IGN1cnJlbnQuZmlsZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbXBsZXRlZFRhcmdldHMsXG4gICAgICAgIHBlbmRpbmdUYXJnZXRzOiB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiAhY29tcGxldGVkVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpKSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIXN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gcmVwbHkuc2VuZChzdHJlYW0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJNaWdyYXRpb25zQXBpKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlKSB7XG4gIGNvbnN0IG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG5cbiAgc2VydmVyLmdldChcIi9hcGkvbWlncmF0aW9ucy9jb25uZWN0aW9uc1wiLCBhc3luYyAoKSA9PiAoe1xuICAgIGNvbm5lY3Rpb25zOiBtaWdyYXRvci5nZXRDb25uZWN0aW9ucygpLFxuICB9KSk7XG4gIHNlcnZlci5nZXQoXCIvYXBpL21pZ3JhdGlvbnMvY29kZXNcIiwgYXN5bmMgKCkgPT4gKHsgY29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldE1pZ3JhdGlvbkNvZGVzKCkgfSkpO1xuICBzZXJ2ZXIuZ2V0PHsgUXVlcnlzdHJpbmc6IHsgY29kZU5hbWU6IHN0cmluZyB9IH0+KFwiL2FwaS9taWdyYXRpb25zL2NvZGVcIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1pZ3JhdGlvbkNvZGUgPSAoYXdhaXQgbWlncmF0b3IuZ2V0TWlncmF0aW9uQ29kZXMoKSkuZmluZChcbiAgICAgICAgKHsgbmFtZSB9KSA9PiBuYW1lID09PSByZXF1ZXN0LnF1ZXJ5LmNvZGVOYW1lLFxuICAgICAgKTtcbiAgICAgIGlmIChtaWdyYXRpb25Db2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci5iYWRSZXF1ZXN0XCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGNvZGU6IGF3YWl0IHJlYWRGaWxlKG1pZ3JhdGlvbkNvZGUucGF0aCwgXCJ1dGY4XCIpIH07XG4gICAgfSksXG4gICk7XG4gIHNlcnZlci5nZXQ8eyBRdWVyeXN0cmluZzogeyBjb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXCIvYXBpL21pZ3JhdGlvbnMvc3RhdHVzXCIsIChyZXF1ZXN0KSA9PlxuICAgIGZvcndhcmRBc3luY0Vycm9ycyhhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC5xdWVyeS5jb25uS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBhd2FpdCBtaWdyYXRvci5nZXRDb25uZWN0aW9uU3RhdHVzKHJlcXVlc3QucXVlcnkuY29ubktleSkgfTtcbiAgICB9KSxcbiAgKTtcbiAgc2VydmVyLmdldDx7IFF1ZXJ5c3RyaW5nOiB7IGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9wcmVwYXJlZC1jb2Rlc1wiLFxuICAgIChyZXF1ZXN0KSA9PlxuICAgICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+ICh7XG4gICAgICAgIHByZXBhcmVkQ29kZXM6IGF3YWl0IG1pZ3JhdG9yLmdldFByZXBhcmVkQ29kZXMocmVxdWVzdC5xdWVyeS5jb21wYXJlQ29ubktleSksXG4gICAgICB9KSksXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvcmVxdWVzdC1hcHByb3ZhbFwiLCAocmVxdWVzdCkgPT5cbiAgICBmb3J3YXJkQXN5bmNFcnJvcnMoYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIHJlcXVlc3RBcHByb3ZhbChtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMsIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IpO1xuICAgIH0pLFxuICApO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvY2hlY2tBcHByb3ZhbFwiLFxuICAgIChyZXF1ZXN0KSA9PlxuICAgICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2xhY2sgPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgICAgIHJldHVybiBzbGFjay5pc0NvbmZpZ3VyZWQoKVxuICAgICAgICAgID8gc2xhY2suY2hlY2tBcHByb3ZhbChyZXF1ZXN0LmJvZHkuY2hhbm5lbCwgcmVxdWVzdC5ib2R5LnRzKVxuICAgICAgICAgIDogeyBhcHByb3ZlZDogdHJ1ZSwgcmVqZWN0ZWQ6IGZhbHNlIH07XG4gICAgICB9KSxcbiAgKTtcbiAgc2VydmVyLnBvc3Q8e1xuICAgIEJvZHk6IHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nOyByZWFzb246IHN0cmluZzsgcmVxdWVzdG9yPzogc3RyaW5nIH07XG4gIH0+KFwiL2FwaS9taWdyYXRpb25zL2ZvcmNlQXBwcm92YWxcIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNsYWNrID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgICAgaWYgKCFzbGFjay5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsYWNrLmZvcmNlQXBwcm92YWwoXG4gICAgICAgIHJlcXVlc3QuYm9keS5jaGFubmVsLFxuICAgICAgICByZXF1ZXN0LmJvZHkudHMsXG4gICAgICAgIHJlcXVlc3QuYm9keS5yZWFzb24sXG4gICAgICAgIHJlcXVlc3QuYm9keS5yZXF1ZXN0b3IsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH0pLFxuICApO1xuXG4gIHNlcnZlci5wb3N0KFwiL2FwaS9taWdyYXRpb25zL3NoYWRvd1wiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgcmV0dXJuIHNlbmRNaWdyYXRpb25TdHJlYW0ocmVwbHksIFwic2hhZG93XCIsIFtdLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgcmV0dXJuIG1pZ3JhdG9yLnJ1blNoYWRvd1Rlc3QoeyBvblByb2dyZXNzIH0pO1xuICAgIH0pO1xuICB9KTtcbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiBBcHBseUJvZHkgfT4oXCIvYXBpL21pZ3JhdGlvbnMvYXBwbHlcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICBjb25zdCBhcHByb3ZhbCA9IGF3YWl0IHJlcXVpcmVBcHByb3ZlZEFwcGx5KHJlcXVlc3QuYm9keSwgc3RhdHVzZXMpO1xuICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKFxuICAgICAgcmVwbHksXG4gICAgICBcImFwcGx5XCIsXG4gICAgICByZXF1ZXN0LmJvZHkudGFyZ2V0cyxcbiAgICAgIChvblByb2dyZXNzKSA9PiBtaWdyYXRvci5hcHBseShyZXF1ZXN0LmJvZHkudGFyZ2V0cywgeyBvblByb2dyZXNzIH0pLFxuICAgICAgYXBwcm92YWwgPT09IG51bGxcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgU2xhY2tDb25maXJtKCkubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICBhcHByb3ZhbC5jaGFubmVsLFxuICAgICAgICAgICAgICBhcHByb3ZhbC50cyxcbiAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkucmVxdWVzdG9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICk7XG4gIH0pO1xuICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10gfSB9PihcbiAgICBcIi9hcGkvbWlncmF0aW9ucy9yb2xsYmFja1wiLFxuICAgIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgYXNzZXJ0VGFyZ2V0cyhtaWdyYXRvciwgcmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgICAgYXdhaXQgZ2V0QXZhaWxhYmxlVGFyZ2V0U3RhdHVzZXMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIHJldHVybiBzZW5kTWlncmF0aW9uU3RyZWFtKHJlcGx5LCBcInJvbGxiYWNrXCIsIHJlcXVlc3QuYm9keS50YXJnZXRzLCAob25Qcm9ncmVzcykgPT4ge1xuICAgICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMsIHsgb25Qcm9ncmVzcyB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGNvbXBhcmVDb25uS2V5PzogTWlncmF0aW9uVGFyZ2V0IH0gfT4oXG4gICAgXCIvYXBpL21pZ3JhdGlvbnMvZ2VuZXJhdGVQcmVwYXJlZENvZGVzXCIsXG4gICAgKHJlcXVlc3QpID0+XG4gICAgICBmb3J3YXJkQXN5bmNFcnJvcnMoYXN5bmMgKCkgPT4gbWlncmF0b3IuZ2VuZXJhdGVQcmVwYXJlZENvZGVzKHJlcXVlc3QuYm9keS5jb21wYXJlQ29ubktleSkpLFxuICApO1xuXG4gIC8vIOydtOyghCBVSSDrsojrk6Tqs7wg7Jm467aAIOyKpO2BrOumve2KuOqwgCDsg4gg7ISc67KE7JeQ7ISc64+EIO2VnCDrprTrpqzsiqQg64+Z7JWIIOuPmeyeke2VmOuPhOuhnSDsnKDsp4Dtlanri4jri6QuXG4gIHNlcnZlci5wb3N0PHtcbiAgICBCb2R5OiB7XG4gICAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIiB8IFwic2hhZG93XCI7XG4gICAgICB0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgICBmb3JjZT86IGJvb2xlYW47XG4gICAgICBmb3JjZVJlYXNvbj86IHN0cmluZztcbiAgICAgIHJlcXVlc3Rvcj86IHN0cmluZztcbiAgICB9O1xuICB9PihcIi9hcGkvbWlncmF0aW9ucy9ydW5BY3Rpb25cIiwgKHJlcXVlc3QpID0+XG4gICAgZm9yd2FyZEFzeW5jRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LmJvZHkuYWN0aW9uID09PSBcInNoYWRvd1wiKSB7XG4gICAgICAgIHJldHVybiBtaWdyYXRvci5ydW5TaGFkb3dUZXN0KCk7XG4gICAgICB9XG4gICAgICBpZiAocmVxdWVzdC5ib2R5LmFjdGlvbiA9PT0gXCJhcHBseVwiKSB7XG4gICAgICAgIHJldHVybiBydW5MZWdhY3lBcHBseShtaWdyYXRvciwgcmVxdWVzdC5ib2R5KTtcbiAgICAgIH1cbiAgICAgIGFzc2VydFRhcmdldHMobWlncmF0b3IsIHJlcXVlc3QuYm9keS50YXJnZXRzKTtcbiAgICAgIGF3YWl0IGdldEF2YWlsYWJsZVRhcmdldFN0YXR1c2VzKG1pZ3JhdG9yLCByZXF1ZXN0LmJvZHkudGFyZ2V0cyk7XG4gICAgICByZXR1cm4gbWlncmF0b3Iucm9sbGJhY2socmVxdWVzdC5ib2R5LnRhcmdldHMpO1xuICAgIH0pLFxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBK0JBLFNBQVMsY0FBYyxVQUFvQixTQUFrQztDQUMzRSxNQUFNLFVBQVUsSUFBSSxJQUFJLFNBQVMsZUFBZSxDQUFDLENBQUMsS0FBSyxFQUFFLGNBQWMsT0FBTyxDQUFDO0NBQy9FLE1BQU0sVUFBVSxRQUFRLFFBQVEsV0FBVyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUM7Q0FDL0QsSUFBSSxRQUFRLFdBQVcsS0FBSyxRQUFRLFNBQVMsR0FDM0MsTUFBTSxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixHQUFHLEVBQ3BELFNBQVMsOEJBQThCLFFB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