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
@@ -7,14 +7,15 @@ import { init_path_utils, runtimePath } from "../utils/path-utils.js";
7
7
  import { init_api_parser, readApisFromFile } from "./api-parser.js";
8
8
  import { z } from "zod";
9
9
  import path from "path";
10
- //#region src/syncer/module-loader.ts
10
+ // src/syncer/module-loader.ts
11
11
  /**
12
12
  * *.model.ts와 *.frame.ts 파일들에서 API 메소드를 파싱하여 로드합니다.
13
13
  * registeredApis에 API가 등록되어 있어야 하기 때문에, *.model.ts 파일들을 먼저 import해야 합니다.
14
14
  * 따라서 loadModels()를 먼저 호출해야 합니다.
15
15
  */
16
16
  async function loadApis() {
17
- const modelPaths = await globAsync(path.join(Sonamu.apiRootPath, "src/application/**/*.{model,frame}.ts"));
17
+ const modelPathsPattern = path.join(Sonamu.apiRootPath, "src/application/**/*.{model,frame}.ts");
18
+ const modelPaths = await globAsync(modelPathsPattern);
18
19
  const apis = [];
19
20
  for (const filePath of modelPaths) {
20
21
  const parsedApis = await readApisFromFile(filePath);
@@ -27,7 +28,8 @@ async function loadApis() {
27
28
  * *.model.ts와 *.frame.ts 파일들에서 Model/Frame 클래스 인스턴스를 로드합니다.
28
29
  */
29
30
  async function loadModels() {
30
- const modelPaths = await globAsync(path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.{model,frame}.ts")));
31
+ const modelPathsPattern = path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.{model,frame}.ts"));
32
+ const modelPaths = await globAsync(modelPathsPattern);
31
33
  const models = {};
32
34
  for (const filePath of modelPaths) {
33
35
  const importedMembers = await importMembers(filePath);
@@ -52,7 +54,8 @@ async function loadTypes() {
52
54
  * *.workflow.ts 파일들에서 Workflow 메타데이터를 로드합니다.
53
55
  */
54
56
  async function loadWorkflows() {
55
- const workflowPaths = await globAsync(path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.workflow.ts")));
57
+ const workflowPathsPattern = path.join(Sonamu.apiRootPath, runtimePath("src/application/**/*.workflow.ts"));
58
+ const workflowPaths = await globAsync(workflowPathsPattern);
56
59
  const workflows = /* @__PURE__ */ new Map();
57
60
  for (const filePath of workflowPaths) {
58
61
  const importedMembers = await importMembers(filePath);
@@ -72,8 +75,7 @@ var init_module_loader = __esmMin((() => {
72
75
  init_runtime_value();
73
76
  init_api_parser();
74
77
  }));
75
- //#endregion
76
78
  init_module_loader();
77
79
  export { init_module_loader, loadApis, loadModels, loadTypes, loadWorkflows };
78
80
 
79
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLWxvYWRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL21vZHVsZS1sb2FkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBCYXNlRnJhbWVDbGFzcyB9IGZyb20gXCIuLi9hcGkvYmFzZS1mcmFtZVwiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgQmFzZU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgZ2xvYkFzeW5jIH0gZnJvbSBcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgcnVudGltZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgaXNGdW5jdGlvblZhbHVlLCBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IHJlYWRBcGlzRnJvbUZpbGUgfSBmcm9tIFwiLi9hcGktcGFyc2VyXCI7XG5cbmV4cG9ydCB0eXBlIExvYWRlZEFwaXMgPSBFeHRlbmRlZEFwaVtdO1xuXG5leHBvcnQgdHlwZSBMb2FkZWRUeXBlcyA9IHsgW3R5cGVOYW1lOiBzdHJpbmddOiB6LlpvZFR5cGUgfTtcblxuZXhwb3J0IHR5cGUgTG9hZGVkTW9kZWxzID0ge1xuICBbbW9kZWxOYW1lOiBzdHJpbmddOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzO1xufTtcblxuLyoqXG4gKiAqLm1vZGVsLnRz7JmAICouZnJhbWUudHMg7YyM7J2865Ok7JeQ7IScIEFQSSDrqZTshozrk5zrpbwg7YyM7Iux7ZWY7JesIOuhnOuTnO2VqeuLiOuLpC5cbiAqIHJlZ2lzdGVyZWRBcGlz7JeQIEFQSeqwgCDrk7HroZ3rkJjslrQg7J6I7Ja07JW8IO2VmOq4sCDrlYzrrLjsl5AsICoubW9kZWwudHMg7YyM7J2865Ok7J2EIOuovOyggCBpbXBvcnTtlbTslbwg7ZWp64uI64ukLlxuICog65Sw65287IScIGxvYWRNb2RlbHMoKeulvCDrqLzsoIAg7Zi47Lac7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRBcGlzKCk6IFByb21pc2U8TG9hZGVkQXBpcz4ge1xuICAvLyDslpjripQg7Yq57J207ZWY6rKM64+EIO2ZmOqyveyXkCDrlLDrnbwgLnRz64KYIC5qc+ulvCBpbXBvcnTtlZjripQg6rK97Jqw6rCAIOyVhOuLiOqzoCxcbiAgLy8g7YOA7J6F7J20IOyCtOyVhOyeiOuKlCAudHMg7IaM7IqkIOy9lOuTnOunjOydhCDsnb3slrTslbwg7ZWp64uI64ukLlxuICAvLyDsnbTqsoPsnYAgZGV27ISc67KEKGhvdCByZWxvYWQp6rCAIOyVhOuLjCBwcm9kdWN0aW9uIO2ZmOqyveyXkOyEnOuPhCDrj5nsnbztlanri4jri6QuXG4gIC8vIOuqqOuNuOuTpOydmCAudHMg7YyM7J287J20IOyeiOyWtOyVvCDsnbTrpbwg7J297Ja07IScIOudvOyasO2KuOulvCDrk7HroZ3tlaAg7IiYIOyeiOyWtOyalCFcbiAgY29uc3QgbW9kZWxQYXRoc1BhdHRlcm4gPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIFwic3JjL2FwcGxpY2F0aW9uLyoqLyoue21vZGVsLGZyYW1lfS50c1wiLCAvLyAhISBydW50aW1lUGF0aCDslYgg7JSAIOyjvOydmCAhIVxuICApO1xuICBjb25zdCBtb2RlbFBhdGhzID1cbiAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBnbG9iQXN5bmMoXG4gICAgICBtb2RlbFBhdGhzUGF0dGVybixcbiAgICApKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICBjb25zdCBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgbW9kZWxQYXRocykge1xuICAgIGNvbnN0IHBhcnNlZEFwaXMgPSBhd2FpdCByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoKTtcbiAgICBhcGlzLnB1c2goLi4ucGFyc2VkQXBpcyk7XG4gIH1cbiAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgY2hhbGsuZ3JheShgW0xvYWRpbmddIExvYWRlZCBBUElzIGZyb20gXCIqLm1vZGVsLnRzXCIgZmlsZXM6ICR7Y291bnR9IGZpbGVzLmApXG4gIC8vICk7XG5cbiAgZm9yIChjb25zdCBhcGkgb2YgYXBpcykge1xuICAgIGlmIChhcGkucGF0aCA9PT0gXCJcIikge1xuICAgICAgLy8gYXBp7J2YIOqyveuhnChwYXRoKeqwgCBcIu2FhSDruYTslrTsnojsnYxcIuyduCDsg4Htg5zsnoXri4jri6QuXG4gICAgICAvLyDsnbTripQgQGFwaeyZgCDtlajqu5gg7IKs7Jqp7ZW07JW8IO2VmOuKlCDrjbDsvZTroIjsnbTthLDqsIAgQGFwaSDsl4bsnbQg67aZ7J2AIOyDge2ZqeyeheuLiOuLpC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFQSSAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9IGhhcyBubyBwYXRoLiBQbGVhc2UgYXR0YWNoIEBhcGkgZGVjb3JhdG9yIHRvIHRoZSBtZXRob2QuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFwaXM7XG59XG5cbi8qKlxuICogKi5tb2RlbC50c+yZgCAqLmZyYW1lLnRzIO2MjOydvOuTpOyXkOyEnCBNb2RlbC9GcmFtZSDtgbTrnpjsiqQg7J247Iqk7YS07Iqk66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRNb2RlbHMoKTogUHJvbWlzZTxMb2FkZWRNb2RlbHM+IHtcbiAgY29uc3QgbW9kZWxQYXRoc1BhdHRlcm4gPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKFwic3JjL2FwcGxpY2F0aW9uLyoqLyoue21vZGVsLGZyYW1lfS50c1wiKSxcbiAgKTtcbiAgY29uc3QgbW9kZWxQYXRocyA9IGF3YWl0IGdsb2JBc3luYyhtb2RlbFBhdGhzUGF0dGVybik7XG5cbiAgY29uc3QgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBtb2RlbFBhdGhzKSB7XG4gICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczxCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzPihmaWxlUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBpbXBvcnRlZE1lbWJlcnMpIHtcbiAgICAgIGlmIChuYW1lLmVuZHNXaXRoKFwiTW9kZWxcIikgfHwgbmFtZS5lbmRzV2l0aChcIkZyYW1lXCIpKSB7XG4gICAgICAgIG1vZGVsc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb2RlbHM7XG59XG5cbi8qKlxuICogKi50eXBlcy50c+yZgCAqLmdlbmVyYXRlZC50cyDtjIzsnbzrk6Tsl5DshJwgWm9kIOyKpO2CpOuniOulvCDroZzrk5ztlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVHlwZXMoKTogUHJvbWlzZTxMb2FkZWRUeXBlcz4ge1xuICBjb25zdCB0eXBlUGF0aHNQYXR0ZXJucyA9IFtcbiAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLnR5cGVzLnRzXCIpKSxcbiAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLmdlbmVyYXRlZC50c1wiKSksXG4gIF07XG4gIGNvbnN0IHR5cGVQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0eXBlUGF0aHNQYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IGdsb2JBc3luYyhwYXR0ZXJuKSkpXG4gICkuZmxhdCgpO1xuXG4gIGNvbnN0IHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHR5cGVQYXRocykge1xuICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RUeXBlPihmaWxlUGF0aCk7XG4gICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgaW1wb3J0ZWRNZW1iZXJzKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiB6LlpvZFR5cGUpIHtcbiAgICAgICAgdHlwZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHlwZXM7XG59XG5cbi8qKlxuICogKi53b3JrZmxvdy50cyDtjIzsnbzrk6Tsl5DshJwgV29ya2Zsb3cg66mU7YOA642w7J207YSw66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXb3JrZmxvd3MoKSB7XG4gIGNvbnN0IHdvcmtmbG93UGF0aHNQYXR0ZXJuID0gcGF0aC5qb2luKFxuICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLndvcmtmbG93LnRzXCIpLFxuICApO1xuICBjb25zdCB3b3JrZmxvd1BhdGhzID0gYXdhaXQgZ2xvYkFzeW5jKHdvcmtmbG93UGF0aHNQYXR0ZXJuKTtcbiAgY29uc3Qgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHdvcmtmbG93UGF0aHMpIHtcbiAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGVQYXRoKTtcbiAgICB3b3JrZmxvd3Muc2V0KFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBpbXBvcnRlZE1lbWJlcnNcbiAgICAgICAgLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzT2JqZWN0VmFsdWUodmFsdWUpICYmXG4gICAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgXCJ0eXBlXCIgaW4gdmFsdWUgJiZcbiAgICAgICAgICAgIHZhbHVlLnR5cGUgPT09IFwid29ya2Zsb3dcIiAmJlxuICAgICAgICAgICAgXCJmblwiIGluIHZhbHVlICYmXG4gICAgICAgICAgICBpc0Z1bmN0aW9uVmFsdWUodmFsdWUuZm4pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoeyB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gdmFsdWUgYXMgV29ya2Zsb3dNZXRhZGF0YTtcbiAgICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd3M7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxlQUFzQixXQUFnQztDQVNwRCxNQUFNLGFBQ3dELE1BQU0sVUFMMUMsS0FBSyxLQUM3QixPQUFPLGFBQ1AsdUNBSUUsQ0FDRjtDQUVGLE1BQU0sT0FBbUIsQ0FBQztDQUMxQixLQUFLLE1BQU0sWUFBWSxZQUFZO0VBQ2pDLE1BQU0sYUFBYSxNQUFNLGlCQUFpQixRQUFRO0VBQ2xELEtBQUssS0FBSyxHQUFHLFVBQVU7Q0FDekI7Q0FLQSxLQUFLLE1BQU0sT0FBTyxNQUNoQixJQUFJLElBQUksU0FBUyxJQUdmLE1BQU0sSUFBSSxNQUNSLE9BQU8sSUFBSSxVQUFVLEdBQUcsSUFBSSxXQUFXLDBEQUN6QztDQUlKLE9BQU87QUFDVDs7OztBQUtBLGVBQXNCLGFBQW9DO0NBS3hELE1BQU0sYUFBYSxNQUFNLFVBSkMsS0FBSyxLQUM3QixPQUFPLGFBQ1AsWUFBWSx1Q0FBdUMsQ0FFbEIsQ0FBaUI7Q0FFcEQsTUFBTSxTQUF1QixDQUFDO0NBQzlCLEtBQUssTUFBTSxZQUFZLFlBQVk7RUFDakMsTUFBTSxrQkFBa0IsTUFBTSxjQUErQyxRQUFRO0VBRXJGLEtBQUssTUFBTSxFQUFFLE1BQU0sV0FBVyxpQkFDNUIsSUFBSSxLQUFLLFNBQVMsT0FBTyxLQUFLLEtBQUssU0FBUyxPQUFPLEdBQ2pELE9BQU8sUUFBUTtDQUdyQjtDQUVBLE9BQU87QUFDVDs7OztBQUtBLGVBQXNCLFlBQWtDO0NBQ3RELE1BQU0sb0JBQW9CLENBQ3hCLEtBQUssS0FBSyxPQUFPLGFBQWEsWUFBWSwrQkFBK0IsQ0FBQyxHQUMxRSxLQUFLLEtBQUssT0FBTyxhQUFhLFlBQVksbUNBQW1DLENBQUMsQ0FDaEY7Q0FDQSxNQUFNLGFBQ0osTUFBTSxRQUFRLElBQUksa0JBQWtCLEtBQUssWUFBWSxVQUFVLE9BQU8sQ0FBQyxDQUFDLEVBQUEsQ0FDeEUsS0FBSztDQUVQLE1BQU0sUUFBcUIsQ0FBQztDQUM1QixLQUFLLE1BQU0sWUFBWSxXQUFXO0VBQ2hDLE1BQU0sa0JBQWtCLE1BQU0sY0FBeUIsUUFBUTtFQUMvRCxLQUFLLE1BQU0sRUFBRSxNQUFNLFdBQVcsaUJBQzVCLElBQUksaUJBQWlCLEVBQUUsU0FDckIsTUFBTSxRQUFRO0NBR3BCO0NBRUEsT0FBTztBQUNUOzs7O0FBS0EsZUFBc0IsZ0JBQWdCO0NBS3BDLE1BQU0sZ0JBQWdCLE1BQU0sVUFKQyxLQUFLLEtBQ2hDLE9BQU8sYUFDUCxZQUFZLGtDQUFrQyxDQUVWLENBQW9CO0NBQzFELE1BQU0sNEJBQTZDLElBQUksSUFBSTtDQUMzRCxLQUFLLE1BQU0sWUFBWSxlQUFlO0VBQ3BDLE1BQU0sa0JBQWtCLE1BQU0sY0FBYyxRQUFRO0VBQ3BELFVBQVUsSUFDUixVQUNBLGdCQUNHLFFBQVEsRUFBRSxZQUFZO0dBQ3JCLE9BQ0UsY0FBYyxLQUFLLEtBQ25CLFVBQVUsUUFDVixVQUFVLFNBQ1YsTUFBTSxTQUFTLGNBQ2YsUUFBUSxTQUNSLGdCQUFnQixNQUFNLEVBQUU7RUFFNUIsQ0FBQyxDQUFDLENBQ0QsS0FBSyxFQUFFLFlBQVk7R0FDbEIsT0FBa0U7RUFDcEUsQ0FBQyxDQUNMO0NBQ0Y7Q0FFQSxPQUFPO0FBQ1Q7O2FBNUlzQztrQkFHVTtnQkFDRTtpQkFDRDtvQkFFc0I7aUJBQ3hCIn0=
81
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLWxvYWRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL21vZHVsZS1sb2FkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBCYXNlRnJhbWVDbGFzcyB9IGZyb20gXCIuLi9hcGkvYmFzZS1mcmFtZVwiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgQmFzZU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgZ2xvYkFzeW5jIH0gZnJvbSBcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgcnVudGltZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHsgaXNGdW5jdGlvblZhbHVlLCBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IHJlYWRBcGlzRnJvbUZpbGUgfSBmcm9tIFwiLi9hcGktcGFyc2VyXCI7XG5cbmV4cG9ydCB0eXBlIExvYWRlZEFwaXMgPSBFeHRlbmRlZEFwaVtdO1xuXG5leHBvcnQgdHlwZSBMb2FkZWRUeXBlcyA9IHsgW3R5cGVOYW1lOiBzdHJpbmddOiB6LlpvZFR5cGUgfTtcblxuZXhwb3J0IHR5cGUgTG9hZGVkTW9kZWxzID0ge1xuICBbbW9kZWxOYW1lOiBzdHJpbmddOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzO1xufTtcblxuLyoqXG4gKiAqLm1vZGVsLnRz7JmAICouZnJhbWUudHMg7YyM7J2865Ok7JeQ7IScIEFQSSDrqZTshozrk5zrpbwg7YyM7Iux7ZWY7JesIOuhnOuTnO2VqeuLiOuLpC5cbiAqIHJlZ2lzdGVyZWRBcGlz7JeQIEFQSeqwgCDrk7HroZ3rkJjslrQg7J6I7Ja07JW8IO2VmOq4sCDrlYzrrLjsl5AsICoubW9kZWwudHMg7YyM7J2865Ok7J2EIOuovOyggCBpbXBvcnTtlbTslbwg7ZWp64uI64ukLlxuICog65Sw65287IScIGxvYWRNb2RlbHMoKeulvCDrqLzsoIAg7Zi47Lac7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRBcGlzKCk6IFByb21pc2U8TG9hZGVkQXBpcz4ge1xuICAvLyDslpjripQg7Yq57J207ZWY6rKM64+EIO2ZmOqyveyXkCDrlLDrnbwgLnRz64KYIC5qc+ulvCBpbXBvcnTtlZjripQg6rK97Jqw6rCAIOyVhOuLiOqzoCxcbiAgLy8g7YOA7J6F7J20IOyCtOyVhOyeiOuKlCAudHMg7IaM7IqkIOy9lOuTnOunjOydhCDsnb3slrTslbwg7ZWp64uI64ukLlxuICAvLyDsnbTqsoPsnYAgZGV27ISc67KEKGhvdCByZWxvYWQp6rCAIOyVhOuLjCBwcm9kdWN0aW9uIO2ZmOqyveyXkOyEnOuPhCDrj5nsnbztlanri4jri6QuXG4gIC8vIOuqqOuNuOuTpOydmCAudHMg7YyM7J287J20IOyeiOyWtOyVvCDsnbTrpbwg7J297Ja07IScIOudvOyasO2KuOulvCDrk7HroZ3tlaAg7IiYIOyeiOyWtOyalCFcbiAgY29uc3QgbW9kZWxQYXRoc1BhdHRlcm4gPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIFwic3JjL2FwcGxpY2F0aW9uLyoqLyoue21vZGVsLGZyYW1lfS50c1wiLCAvLyAhISBydW50aW1lUGF0aCDslYgg7JSAIOyjvOydmCAhIVxuICApO1xuICBjb25zdCBtb2RlbFBhdGhzID1cbiAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBnbG9iQXN5bmMoXG4gICAgICBtb2RlbFBhdGhzUGF0dGVybixcbiAgICApKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICBjb25zdCBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgbW9kZWxQYXRocykge1xuICAgIGNvbnN0IHBhcnNlZEFwaXMgPSBhd2FpdCByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoKTtcbiAgICBhcGlzLnB1c2goLi4ucGFyc2VkQXBpcyk7XG4gIH1cbiAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgY2hhbGsuZ3JheShgW0xvYWRpbmddIExvYWRlZCBBUElzIGZyb20gXCIqLm1vZGVsLnRzXCIgZmlsZXM6ICR7Y291bnR9IGZpbGVzLmApXG4gIC8vICk7XG5cbiAgZm9yIChjb25zdCBhcGkgb2YgYXBpcykge1xuICAgIGlmIChhcGkucGF0aCA9PT0gXCJcIikge1xuICAgICAgLy8gYXBp7J2YIOqyveuhnChwYXRoKeqwgCBcIu2FhSDruYTslrTsnojsnYxcIuyduCDsg4Htg5zsnoXri4jri6QuXG4gICAgICAvLyDsnbTripQgQGFwaeyZgCDtlajqu5gg7IKs7Jqp7ZW07JW8IO2VmOuKlCDrjbDsvZTroIjsnbTthLDqsIAgQGFwaSDsl4bsnbQg67aZ7J2AIOyDge2ZqeyeheuLiOuLpC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFQSSAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9IGhhcyBubyBwYXRoLiBQbGVhc2UgYXR0YWNoIEBhcGkgZGVjb3JhdG9yIHRvIHRoZSBtZXRob2QuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFwaXM7XG59XG5cbi8qKlxuICogKi5tb2RlbC50c+yZgCAqLmZyYW1lLnRzIO2MjOydvOuTpOyXkOyEnCBNb2RlbC9GcmFtZSDtgbTrnpjsiqQg7J247Iqk7YS07Iqk66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRNb2RlbHMoKTogUHJvbWlzZTxMb2FkZWRNb2RlbHM+IHtcbiAgY29uc3QgbW9kZWxQYXRoc1BhdHRlcm4gPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKFwic3JjL2FwcGxpY2F0aW9uLyoqLyoue21vZGVsLGZyYW1lfS50c1wiKSxcbiAgKTtcbiAgY29uc3QgbW9kZWxQYXRocyA9IGF3YWl0IGdsb2JBc3luYyhtb2RlbFBhdGhzUGF0dGVybik7XG5cbiAgY29uc3QgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBtb2RlbFBhdGhzKSB7XG4gICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczxCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzPihmaWxlUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBpbXBvcnRlZE1lbWJlcnMpIHtcbiAgICAgIGlmIChuYW1lLmVuZHNXaXRoKFwiTW9kZWxcIikgfHwgbmFtZS5lbmRzV2l0aChcIkZyYW1lXCIpKSB7XG4gICAgICAgIG1vZGVsc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb2RlbHM7XG59XG5cbi8qKlxuICogKi50eXBlcy50c+yZgCAqLmdlbmVyYXRlZC50cyDtjIzsnbzrk6Tsl5DshJwgWm9kIOyKpO2CpOuniOulvCDroZzrk5ztlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVHlwZXMoKTogUHJvbWlzZTxMb2FkZWRUeXBlcz4ge1xuICBjb25zdCB0eXBlUGF0aHNQYXR0ZXJucyA9IFtcbiAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLnR5cGVzLnRzXCIpKSxcbiAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLmdlbmVyYXRlZC50c1wiKSksXG4gIF07XG4gIGNvbnN0IHR5cGVQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0eXBlUGF0aHNQYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+IGdsb2JBc3luYyhwYXR0ZXJuKSkpXG4gICkuZmxhdCgpO1xuXG4gIGNvbnN0IHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHR5cGVQYXRocykge1xuICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RUeXBlPihmaWxlUGF0aCk7XG4gICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgaW1wb3J0ZWRNZW1iZXJzKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiB6LlpvZFR5cGUpIHtcbiAgICAgICAgdHlwZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHlwZXM7XG59XG5cbi8qKlxuICogKi53b3JrZmxvdy50cyDtjIzsnbzrk6Tsl5DshJwgV29ya2Zsb3cg66mU7YOA642w7J207YSw66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRXb3JrZmxvd3MoKSB7XG4gIGNvbnN0IHdvcmtmbG93UGF0aHNQYXR0ZXJuID0gcGF0aC5qb2luKFxuICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICBydW50aW1lUGF0aChcInNyYy9hcHBsaWNhdGlvbi8qKi8qLndvcmtmbG93LnRzXCIpLFxuICApO1xuICBjb25zdCB3b3JrZmxvd1BhdGhzID0gYXdhaXQgZ2xvYkFzeW5jKHdvcmtmbG93UGF0aHNQYXR0ZXJuKTtcbiAgY29uc3Qgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHdvcmtmbG93UGF0aHMpIHtcbiAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGVQYXRoKTtcbiAgICB3b3JrZmxvd3Muc2V0KFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBpbXBvcnRlZE1lbWJlcnNcbiAgICAgICAgLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzT2JqZWN0VmFsdWUodmFsdWUpICYmXG4gICAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgXCJ0eXBlXCIgaW4gdmFsdWUgJiZcbiAgICAgICAgICAgIHZhbHVlLnR5cGUgPT09IFwid29ya2Zsb3dcIiAmJlxuICAgICAgICAgICAgXCJmblwiIGluIHZhbHVlICYmXG4gICAgICAgICAgICBpc0Z1bmN0aW9uVmFsdWUodmFsdWUuZm4pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcCgoeyB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gdmFsdWUgYXMgV29ya2Zsb3dNZXRhZGF0YTtcbiAgICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZmxvd3M7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7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
@@ -12,7 +12,7 @@ import { copyFileWithReplaceCoreToShared, init_file_copy } from "./file-copy.js"
12
12
  import assert from "assert";
13
13
  import path, { dirname } from "path";
14
14
  import chalk from "chalk";
15
- //#region src/syncer/syncer-actions.ts
15
+ // src/syncer/syncer-actions.ts
16
16
  async function actionSyncConfig() {
17
17
  const { host, port } = Sonamu.config.server.listen ?? {};
18
18
  const content = `API_HOST=${host ?? "localhost"}\nAPI_PORT=${port ?? 3e3}`;
@@ -104,12 +104,13 @@ async function actionSyncFilesToTargets(tsPaths) {
104
104
  const dst = realSrc.replace(`/${apiDir}/`, `/${target}/`).replace("/application/", "/services/");
105
105
  const dir = dirname(dst);
106
106
  if (!await syncerFileExists(dir)) await syncerFilesystem.mkdir(dir, { recursive: true });
107
- await copyFileWithReplaceCoreToShared(realSrc, dst, [
107
+ const syncHeader = [
108
108
  "/**",
109
109
  " * @generated",
110
110
  " * API에서 동기화된 파일입니다. 직접 수정하지 마세요.",
111
111
  " */"
112
- ].join("\n"));
112
+ ].join("\n");
113
+ await copyFileWithReplaceCoreToShared(realSrc, dst, syncHeader);
113
114
  await trackWritten(dst);
114
115
  !isTest() && console.log(chalk.bold("Copied: ") + chalk.blue(dst.replace(`${Sonamu.appRootPath}/`, "")));
115
116
  return dst;
@@ -175,12 +176,13 @@ async function syncLocaleFiles(target, apiI18nDir, locales) {
175
176
  for (const locale of locales) {
176
177
  const sourceFile = path.join(apiI18nDir, `${locale}.ts`);
177
178
  const targetFile = path.join(targetI18nDir, `${locale}.ts`);
178
- await copyFileWithReplaceCoreToShared(sourceFile, targetFile, [
179
+ const syncHeader = [
179
180
  "/**",
180
181
  " * @generated",
181
182
  " * API에서 동기화된 파일입니다. 직접 수정하지 마세요.",
182
183
  " */"
183
- ].join("\n"));
184
+ ].join("\n");
185
+ await copyFileWithReplaceCoreToShared(sourceFile, targetFile, syncHeader);
184
186
  await trackWritten(targetFile);
185
187
  !isTest() && console.log(chalk.bold("Copied: ") + chalk.cyan(`${target}/src/i18n/${locale}.ts`));
186
188
  }
@@ -197,8 +199,7 @@ var init_syncer_actions = __esmMin((() => {
197
199
  init_file_tracking();
198
200
  init_filesystem_dependencies();
199
201
  }));
200
- //#endregion
201
202
  init_syncer_actions();
202
203
  export { actionCopySharedToTargetsIfNotExists, actionGenerateHttpValidators, actionGenerateHttps, actionGenerateInitialTypes, actionGenerateSchemas, actionGenerateServices, actionGenerateSsrEntryServerIfNotExists, actionGenerateSsrQueries, actionSyncConfig, actionSyncFilesToTargets, actionSyncSonamuDictionary, init_syncer_actions };
203
204
 
204
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLWFjdGlvbnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXItYWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBmb3JtYXRDb2RlIH0gZnJvbSBcIi4uL2NvZGUtZm9ybWF0dGluZ1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIH0gZnJvbSBcIi4vZmlsZS1jb3B5XCI7XG5pbXBvcnQgeyB0cmFja1dyaXR0ZW4gfSBmcm9tIFwiLi9maWxlLXRyYWNraW5nXCI7XG5pbXBvcnQgeyBzeW5jZXJGaWxlRXhpc3RzLCBzeW5jZXJGaWxlc3lzdGVtIH0gZnJvbSBcIi4vZmlsZXN5c3RlbS1kZXBlbmRlbmNpZXNcIjtcblxuLy8gd2ViLy5zb25hbXUuZW52IOyXkCDtmITsnqwg7ISk7KCV6rCSIOyggOyepVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvblN5bmNDb25maWcoKSB7XG4gIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuID8/IHt9O1xuICBjb25zdCBjb250ZW50ID0gYEFQSV9IT1NUPSR7aG9zdCA/PyBcImxvY2FsaG9zdFwifVxcbkFQSV9QT1JUPSR7cG9ydCA/PyAzMDAwfWA7XG5cbiAgTmFpdGUudChcImFjdGlvblN5bmNDb25maWdcIiwgeyBjb250ZW50IH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICAgIHJldHVybiBzeW5jZXJGaWxlc3lzdGVtLndyaXRlRmlsZShcbiAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcIi5zb25hbXUuZW52XCIpLFxuICAgICAgICBjb250ZW50LFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gIF0pO1xufVxuXG4vKipcbiAqIHNlcnZpY2VzLmdlbmVyYXRlZC50c+ulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gcGFyYW1zQXJyYXlcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlU2VydmljZXMoXG4gIHBhcmFtc0FycmF5OiB7XG4gICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICB9W10sXG4pOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIE5haXRlLnQoXCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzXCIsIHBhcmFtc0FycmF5KTtcblxuICAvLyBzZXJ2aWNlcy5nZW5lcmF0ZWQudHMg7Ya17ZWpIO2MjOydvCDsg53shLFcbiAgY29uc3Qgc2VydmljZXNGaWxlID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICBcInNlcnZpY2VzXCIsXG4gICAge30sXG4gICAge1xuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIFsuLi5zZXJ2aWNlc0ZpbGVdO1xufVxuXG4vKipcbiAqIEVudGl0eeyXkCDrlLjrprAg7LSI6riwIHR5cGVzLnRz66W8IOunjOuTpOyWtOykjeuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHlJZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgcmV0dXJuIGdlbmVyYXRlVGVtcGxhdGUoXCJpbml0X3R5cGVzXCIsIHsgZW50aXR5SWQgfSk7XG59XG5cbi8qKlxuICogc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+ulvCDsg53shLHtlanri4jri6QuXG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRfc3NvXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgIF0pXG4gICkuZmxhdCgpO1xufVxuXG4vKipcbiAqIHNvbmFtdS5nZW5lcmF0ZWQuaHR0cOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlSHR0cHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgY29uc3QgW3Jlc10gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgIFwiZ2VuZXJhdGVkX2h0dHBcIixcbiAgICB7IGVudGl0eUlkOiBcImR1bW15XCIgfSxcbiAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICApO1xuICBhc3NlcnQocmVzKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuLyoqXG4gKiDstZzsooUgUkVTVCBjYXN0ZXLrpbwg64u064qUIEFQSSDsoITsmqkgdmFsaWRhdG9yIHJlZ2lzdHJ566W8IOyerOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlSHR0cFZhbGlkYXRvcnMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgY29uc3QgcmVnaXN0cnlQYXRoID1cbiAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZC50c1wiLFxuICAgICkgYXMgQWJzb2x1dGVQYXRoO1xuICBjb25zdCBwb2xpY3kgPSBTb25hbXUuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyO1xuICBjb25zdCBpc0FvdCA9IGlzT2JqZWN0VmFsdWUocG9saWN5KSAmJiBwb2xpY3kgIT09IG51bGwgJiYgcG9saWN5LmFwaSA9PT0gXCJhb3RcIjtcbiAgaWYgKCFpc0FvdCkge1xuICAgIC8vIG9wdC1vdXQvSklUIOyghO2ZmCDrkqQgQU9UIGNvbXBpbGUgaW1wb3J06rCAIOyVoO2UjOumrOy8gOydtOyFmOyXkCDrgqjsp4Ag7JWK64+E66GdIOyCsOy2nOusvOuPhCDtlajqu5gg7KCV66as7ZWp64uI64ukLlxuICAgIGlmIChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHJlZ2lzdHJ5UGF0aCkpIHtcbiAgICAgIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0udW5saW5rKHJlZ2lzdHJ5UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeVBhdGg7XG4gIH1cblxuICBjb25zdCBbZ2VuZXJhdGVkUGF0aF0gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiaHR0cF92YWxpZGF0b3JzXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgYXNzZXJ0KGdlbmVyYXRlZFBhdGgpO1xuICByZXR1cm4gZ2VuZXJhdGVkUGF0aDtcbn1cblxuLyoqXG4gKiBxdWVyaWVzLmdlbmVyYXRlZC50cyDsnqzsg53shLHtlanri4jri6QuXG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICByZXR1cm4gZ2VuZXJhdGVUZW1wbGF0ZShcInF1ZXJpZXNcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIGVudHJ5LXNlcnZlci5nZW5lcmF0ZWQudHN466W8IOyDneyEse2VqeuLiOuLpC5cbiAqIOuLpOuluCDslaHshZjrk6Tqs7wg64us66asLCDsnbTrr7gg7YyM7J287J20IOyeiOycvOuptCDqt7jrg6Ug64aU65Gh64uI64ukLiDqt7jrnpjshJwg7ZWo7IiYIOydtOumhCDrgZ3sl5Ag7I2o64ao7Ja07JqUIOOFjlxuICog7J6F66ClIOydmOyhtCDsl4bripQg7KCV7KCBIOy9lOuTnOudvCDrp6Trsoggb3ZlcndyaXRl64qUIG10aW1l66eMIOqwseyLoO2VmOuKlCDsnZjrr7gg7JeG64qUIOuPmeyekS5cbiAqIO2FnO2UjOumvyDsnpDssrTqsIAg67OA6rK965CcIOqyveyasChTb25hbXUg7JeF6re466CI7J2065OcKeyXkOuKlCDsgqzsmqnsnpDqsIAg7YyM7J287J2EIOyCreygnO2VnCDrkqQgc3luY+uhnCDsnqzsg53shLEuXG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QgKOydtOuvuCDsnojsnLzrqbQg67mIIOuwsOyXtCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZVNzckVudHJ5U2VydmVySWZOb3RFeGlzdHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiZW50cnlfc2VydmVyXCIsIHt9LCB7IG92ZXJ3cml0ZTogZmFsc2UgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBnZW5lcmF0ZVRlbXBsYXRl7J2AIG92ZXJ3cml0ZTogZmFsc2Xsl5DshJwg7YyM7J287J20IOydtOuvuCDsnojsnLzrqbQg7JiI7Jm466W8IOuNmOynkeuLiOuLpC5cbiAgICAvLyBJZk5vdEV4aXN0cyDsnZjrr7jsg4EgXCLqt7jrg6Ug64aU65GU64ukXCLqsIAg7KCV7IOB7J2066+A66GcIOu5iCDrsLDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgIGlmIChlIGluc3RhbmNlb2YgQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qKlxuICog7KO87Ja07KeEIC50cyDtjIzsnbzrk6QoYXBp7JeQIOyeiOuLpOqzoCDqsIDsoJUp7J2EIOuqqOuToCDtg4Dqsp8g65SU66CJ7Yag66as7J2YIHNlcnZpY2Vz7JeQIOqwluuLpCDrkaHri4jri6QuXG4gKiDsnbTrlYwg64K067aA7J2YIHNvbmFtdSBpbXBvcnTripQgc29uYW11LnNoYXJlZC50cyBpbXBvcnTroZwg7LmY7ZmY65CY6rOgLFxuICog6rK966Gc7J2YIC9hcHBsaWNhdGlvbi/snYAgL3NlcnZpY2VzL+uhnCDsuZjtmZjrkKnri4jri6QuXG4gKlxuICogQHBhcmFtIHRzUGF0aHMg67O17IKs7ZWgIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcXG4gKiBAcmV0dXJucyDqsIEg7YOA6rKf7JeQIOuzteyCrOuQnCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnCDrsLDsl7QgKGZsYXQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgeyBkaXI6IGFwaURpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgcmV0dXJuIChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+XG4gICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgIHRzUGF0aHMubWFwKGFzeW5jIChyZWFsU3JjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkc3QgPSByZWFsU3JjXG4gICAgICAgICAgICAgIC5yZXBsYWNlKGAvJHthcGlEaXJ9L2AsIGAvJHt0YXJnZXR9L2ApXG4gICAgICAgICAgICAgIC5yZXBsYWNlKFwiL2FwcGxpY2F0aW9uL1wiLCBcIi9zZXJ2aWNlcy9cIik7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGRzdCk7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0ubWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN5bmNIZWFkZXIgPSBbXG4gICAgICAgICAgICAgIFwiLyoqXCIsXG4gICAgICAgICAgICAgIFwiICogQGdlbmVyYXRlZFwiLFxuICAgICAgICAgICAgICBcIiAqIEFQSeyXkOyEnCDrj5nquLDtmZTrkJwg7YyM7J287J6F64uI64ukLiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgICAgICAgICAgXCIgKi9cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQocmVhbFNyYywgZHN0LCBzeW5jSGVhZGVyKTtcbiAgICAgICAgICAgIGF3YWl0IHRyYWNrV3JpdHRlbihcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBkc3QgYXMgQWJzb2x1dGVQYXRoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKGRzdC5yZXBsYWNlKGAke1NvbmFtdS5hcHBSb290UGF0aH0vYCwgXCJcIikpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGRzdDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuICApLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBzaGFyZWQg7YWc7ZSM66a/7Jy866Gc67aA7YSwIHNvbmFtdS5zaGFyZWQudHMg7YyM7J287J2EIOunjOuTpOyWtOyEnCDrqqjrk6Ag7YOA6rKfIOuUlOugie2GoOumrOyXkCDqsJbri6Qg65Gh64uI64ukLlxuICog7YyM7J287J2EIOunjOuTnOuKlCDqs7zsoJXsl5DshJwg7Jes65+sIOy5mO2ZmCDqsIDqs7XsnbQg7J287Ja064Kp64uI64ukLlxuICpcbiAqIOuLpOuluCDslaHshZjrk6Tqs7wg64us66asLCDsnbTrr7gg7YyM7J287J20IOyeiOycvOuptCDqt7jrg6Ug64aU65Gh64uI64ukLiDqt7jrnpjshJwg7ZWo7IiYIOydtOumhCDrgZ3sl5Ag7I2o64ao7Ja07JqUIOOFjlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uQ29weVNoYXJlZFRvVGFyZ2V0c0lmTm90RXhpc3RzKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcblxuICAvLyBwbHVyYWwudHMg64K07Jqp7J2EIOydveyWtOyEnCBzaGFyZWQg7YyM7J287JeQIOyCveyehe2VqeuLiOuLpC5cbiAgY29uc3QgZGljdFV0aWxzUGF0aCA9IHBhdGguam9pbihcbiAgICBpbXBvcnQubWV0YS5kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKSxcbiAgICBcIi4uL2RpY3QvdXRpbHMudHNcIixcbiAgKTtcbiAgY29uc3QgZGljdFV0aWxzQ29kZSA9IChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGRpY3RVdGlsc1BhdGgpKVxuICAgID8gYXdhaXQgc3luY2VyRmlsZXN5c3RlbS5yZWFkRmlsZShkaWN0VXRpbHNQYXRoLCBcInV0Zi04XCIpXG4gICAgOiBcIlwiO1xuXG4gIC8vIO2KueyglSDrs4DsiJgg7LmY7ZmY7J2EIOychO2VtOyEnCDsgqzsmqntlanri4jri6QuXG4gIGNvbnN0IGNvbnZlcnRNYXAgPSB7XG4gICAgYmFzZVVybDpcbiAgICAgIFNvbmFtdS5jb25maWcuc2VydmVyLmJhc2VVcmwgPz9cbiAgICAgIGBodHRwOi8vJHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/LnBvcnQgPz8gMzAwMH1gLFxuICAgIGRpY3RVdGlsczogZGljdFV0aWxzQ29kZSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICApO1xuICAgIGlmICghKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoc3JjUGF0aCkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQpKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFRleHQgPSBhd2FpdCBzeW5jZXJGaWxlc3lzdGVtLnJlYWRGaWxlKHNyY1BhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgY29udmVydGVkVGV4dCA9IE9iamVjdC5lbnRyaWVzKGNvbnZlcnRNYXApLnJlZHVjZShcbiAgICAgIChhY2MsIFtrZXksIHZhbHVlXSkgPT4gYWNjLnJlcGxhY2UoYCRbWyR7a2V5fV1dYCwgdmFsdWUpLFxuICAgICAgZnVsbFRleHQsXG4gICAgKTtcblxuICAgIC8vIOydtOqxtCDtlITroZzsoJ3tirjsl5AgLnRzIOyGjOyKpCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VmOuKlCDqsoPsnbTrr4DroZwgc3Jj7J2YIC50cyDqsr3roZzroZwg6rCR64uI64ukLlxuICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRzXCIpO1xuXG4gICAgLy8g7KCV66eQIO2YueyLnOuCmOyngOunjCB0YXJnZXQg65SU66CJ7Yag66as64qUIOyeiOyWtOuPhCBzcmMvc2VydmljZXMg65SU66CJ7Yag66as64qUIOyXhuydhCDsiJgg7J6I7Jy866+A66GcIOuvuOumrCDsg53shLHtlbTspI3ri4jri6QuXG4gICAgaWYgKCEoYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhwYXRoLmRpcm5hbWUoZGVzdFBhdGgpKSkpIHtcbiAgICAgIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0ubWtkaXIocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBjb25zb2xlLndhcm4oYENyZWF0ZWQgZGlyZWN0b3J5ICcke3BhdGguZGlybmFtZShkZXN0UGF0aCl9JyBiZWNhdXNlIGl0IGRpZCBub3QgZXhpc3QuYCk7XG4gICAgfVxuXG4gICAgLy8g7YyM7J287J20IOydtOuvuCDsobTsnqztlZjrqbQg6rG064SI65yB64uI64ukLlxuICAgIC8vIHNvbmFtdS5zaGFyZWQudHPripQg7ZSE66Gc7KCd7Yq47JeQ7IScIOyekOycoOuhreqyjCDsu6TsiqTthLDrp4jsnbTsp5XtlaAg7IiYIOyeiOyWtOyVvCDtlZjrr4DroZwsXG4gICAgLy8g7LWc7LSIIDHtmozrp4wg7IOd7ISx7ZWY6rOgIOydtO2bhOyXkOuKlCDrja7slrTsk7Dsp4Ag7JWK7Iq164uI64ukLlxuICAgIC8vIO2FnO2UjOumvyDrgrTsmqkoJFtbZGljdFV0aWxzXV0g65OxKeydtCDrs4Dqsr3rkJjsl4jsnYQg65WMIOuwmOyYgeydtCDtlYTsmpTtlZjrqbQsXG4gICAgLy8g7ZW064u5IO2MjOydvOydhCDsgq3soJztlZwg65KkIGBwbnBtIHNvbmFtdSBzeW5jYOuhnCDsnqzsg53shLHtlZjrqbQg65Cp64uI64ukLlxuICAgIGlmIChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGRlc3RQYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgc3luY2VyRmlsZXN5c3RlbS53cml0ZUZpbGUoZGVzdFBhdGgsIGF3YWl0IGZvcm1hdENvZGUoY29udmVydGVkVGV4dCwgZGVzdFBhdGgpKTtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSkpO1xuICB9XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkoU0Qp66W8IOuqqOuToCDtg4Dqsp8oYXBpICsgd2ViL2FwcCDrk7Ep7JeQIOuPmeq4sO2ZlO2VqeuLiOuLpC5cbiAqXG4gKiDqsIEg7YOA6rKf7JeQIOuMgO2VtDpcbiAqIC0gdGFyZ2V07J20IGFwaeqwgCDslYTri4jrqbQg7IKs7Jqp7J6QIOyekeyEsSBsb2NhbGUg7YyM7J28KGtvLnRzL2VuLnRzLy4uLinsnYQgYXBpIOKGkiB0YXJnZXTsnLzroZwg67O17IKsXG4gKiAtIHNkIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlbTshJwgc2QuZ2VuZXJhdGVkLnRzIOyDneyEsSAob3ZlcndyaXRlKVxuICpcbiAqIO2VnCDtg4Dqsp/sl5DshJwg7Iuk7Yyo7ZW064+EIOuLpOuluCDtg4Dqsp/snYAg6rOE7IaNIOynhO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgaTE4bkNvbmZpZyA9IFNvbmFtdS5jb25maWcuaTE4bjtcblxuICBjb25zdCB0YXJnZXRMaXN0ID1cbiAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtcbiAgICAgIFwiYXBpXCIsXG4gICAgICAuLi50YXJnZXRzLFxuICAgIF0gYXMgKFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIilbXTtcblxuICBjb25zdCBhcGlJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgU29uYW11LmNvbmZpZy5hcGkuZGlyLCBcInNyYy9pMThuXCIpO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldExpc3QpIHtcbiAgICB0cnkge1xuICAgICAgLy8gd2ViL2FwcOydmCDqsr3smrAgbG9jYWxlIO2MjOydvOuTpOydhCBhcGnsl5DshJwg67O17IKsXG4gICAgICBpZiAodGFyZ2V0ICE9PSBcImFwaVwiKSB7XG4gICAgICAgIGF3YWl0IHN5bmNMb2NhbGVGaWxlcyh0YXJnZXQsIGFwaUkxOG5EaXIsIGkxOG5Db25maWcuc3VwcG9ydGVkTG9jYWxlcyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJzZFwiLCB7IHRhcmdldCB9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2VuZXJhdGUgU0QgdGVtcGxhdGUgZm9yICR7dGFyZ2V0fTpgLCBlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBhcGnsnZggbG9jYWxlIO2MjOydvOydhCB3ZWIvYXBw7Jy866GcIOuzteyCrO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY0xvY2FsZUZpbGVzKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgYXBpSTE4bkRpcjogc3RyaW5nLFxuICBsb2NhbGVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0YXJnZXRJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9pMThuXCIpO1xuXG4gIC8vIOuUlOugie2GoOumrOqwgCDsl4bsnLzrqbQg7IOd7ISxXG4gIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0ubWtkaXIodGFyZ2V0STE4bkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBwYXRoLmpvaW4oYXBpSTE4bkRpciwgYCR7bG9jYWxlfS50c2ApO1xuICAgIGNvbnN0IHRhcmdldEZpbGUgPSBwYXRoLmpvaW4odGFyZ2V0STE4bkRpciwgYCR7bG9jYWxlfS50c2ApO1xuXG4gICAgY29uc3Qgc3luY0hlYWRlciA9IFtcbiAgICAgIFwiLyoqXCIsXG4gICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgIFwiICogQVBJ7JeQ7IScIOuPmeq4sO2ZlOuQnCDtjIzsnbzsnoXri4jri6QuIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgXCIgKi9cIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgYXdhaXQgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChzb3VyY2VGaWxlLCB0YXJnZXRGaWxlLCBzeW5jSGVhZGVyKTtcbiAgICBhd2FpdCB0cmFja1dyaXR0ZW4oXG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRhcmdldEZpbGUgYXMgQWJzb2x1dGVQYXRoLFxuICAgICk7XG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5jeWFuKGAke3RhcmdldH0vc3JjL2kxOG4vJHtsb2NhbGV9LnRzYCkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxlQUFzQixtQkFBbUI7Q0FDdkMsTUFBTSxFQUFFLE1BQU0sU0FBUyxPQUFPLE9BQU8sT0FBTyxVQUFVLENBQUM7Q0FDdkQsTUFBTSxVQUFVLFlBQVksUUFBUSxZQUFZLGFBQWEsUUFBUTtDQUVyRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxDQUFDO0NBQ3ZDLE1BQU0sUUFBUSxJQUFJLENBQ2hCLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxLQUFLLFdBQVc7RUFDNUMsT0FBTyxpQkFBaUIsVUFDdEIsS0FBSyxLQUFLLE9BQU8sYUFBYSxRQUFRLGFBQWEsR0FDbkQsT0FDRjtDQUNGLENBQUMsR0FDRCxpQkFBaUIsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDLENBQzNELENBQUM7QUFDSDs7Ozs7O0FBT0EsZUFBc0IsdUJBQ3BCLGFBR3lCO0NBQ3pCLE1BQU0sRUFBRSwwQkFBMEIsV0FBVztDQVc3QyxPQUFPLENBQUMsR0FBRyxNQVJnQixpQkFDekIsWUFDQSxDQUFDLEdBQ0QsRUFDRSxXQUFXLEtBQ2IsQ0FDRixDQUV1QjtBQUN6Qjs7Ozs7QUFNQSxlQUFzQiwyQkFBMkIsVUFBMkM7Q0FDMUYsT0FBTyxpQkFBaUIsY0FBYyxFQUFFLFNBQVMsQ0FBQztBQUNwRDs7Ozs7QUFN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
205
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLWFjdGlvbnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXItYWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBmb3JtYXRDb2RlIH0gZnJvbSBcIi4uL2NvZGUtZm9ybWF0dGluZ1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIH0gZnJvbSBcIi4vZmlsZS1jb3B5XCI7XG5pbXBvcnQgeyB0cmFja1dyaXR0ZW4gfSBmcm9tIFwiLi9maWxlLXRyYWNraW5nXCI7XG5pbXBvcnQgeyBzeW5jZXJGaWxlRXhpc3RzLCBzeW5jZXJGaWxlc3lzdGVtIH0gZnJvbSBcIi4vZmlsZXN5c3RlbS1kZXBlbmRlbmNpZXNcIjtcblxuLy8gd2ViLy5zb25hbXUuZW52IOyXkCDtmITsnqwg7ISk7KCV6rCSIOyggOyepVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvblN5bmNDb25maWcoKSB7XG4gIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuID8/IHt9O1xuICBjb25zdCBjb250ZW50ID0gYEFQSV9IT1NUPSR7aG9zdCA/PyBcImxvY2FsaG9zdFwifVxcbkFQSV9QT1JUPSR7cG9ydCA/PyAzMDAwfWA7XG5cbiAgTmFpdGUudChcImFjdGlvblN5bmNDb25maWdcIiwgeyBjb250ZW50IH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKCh0YXJnZXQpID0+IHtcbiAgICAgIHJldHVybiBzeW5jZXJGaWxlc3lzdGVtLndyaXRlRmlsZShcbiAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcIi5zb25hbXUuZW52XCIpLFxuICAgICAgICBjb250ZW50LFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gIF0pO1xufVxuXG4vKipcbiAqIHNlcnZpY2VzLmdlbmVyYXRlZC50c+ulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gcGFyYW1zQXJyYXlcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlU2VydmljZXMoXG4gIHBhcmFtc0FycmF5OiB7XG4gICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICB9W10sXG4pOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gIE5haXRlLnQoXCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzXCIsIHBhcmFtc0FycmF5KTtcblxuICAvLyBzZXJ2aWNlcy5nZW5lcmF0ZWQudHMg7Ya17ZWpIO2MjOydvCDsg53shLFcbiAgY29uc3Qgc2VydmljZXNGaWxlID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICBcInNlcnZpY2VzXCIsXG4gICAge30sXG4gICAge1xuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIFsuLi5zZXJ2aWNlc0ZpbGVdO1xufVxuXG4vKipcbiAqIEVudGl0eeyXkCDrlLjrprAg7LSI6riwIHR5cGVzLnRz66W8IOunjOuTpOyWtOykjeuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHlJZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgcmV0dXJuIGdlbmVyYXRlVGVtcGxhdGUoXCJpbml0X3R5cGVzXCIsIHsgZW50aXR5SWQgfSk7XG59XG5cbi8qKlxuICogc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+ulvCDsg53shLHtlanri4jri6QuXG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICByZXR1cm4gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRfc3NvXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgIF0pXG4gICkuZmxhdCgpO1xufVxuXG4vKipcbiAqIHNvbmFtdS5nZW5lcmF0ZWQuaHR0cOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlSHR0cHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgY29uc3QgW3Jlc10gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgIFwiZ2VuZXJhdGVkX2h0dHBcIixcbiAgICB7IGVudGl0eUlkOiBcImR1bW15XCIgfSxcbiAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICApO1xuICBhc3NlcnQocmVzKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuLyoqXG4gKiDstZzsooUgUkVTVCBjYXN0ZXLrpbwg64u064qUIEFQSSDsoITsmqkgdmFsaWRhdG9yIHJlZ2lzdHJ566W8IOyerOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvbkdlbmVyYXRlSHR0cFZhbGlkYXRvcnMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgY29uc3QgcmVnaXN0cnlQYXRoID1cbiAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZC50c1wiLFxuICAgICkgYXMgQWJzb2x1dGVQYXRoO1xuICBjb25zdCBwb2xpY3kgPSBTb25hbXUuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyO1xuICBjb25zdCBpc0FvdCA9IGlzT2JqZWN0VmFsdWUocG9saWN5KSAmJiBwb2xpY3kgIT09IG51bGwgJiYgcG9saWN5LmFwaSA9PT0gXCJhb3RcIjtcbiAgaWYgKCFpc0FvdCkge1xuICAgIC8vIG9wdC1vdXQvSklUIOyghO2ZmCDrkqQgQU9UIGNvbXBpbGUgaW1wb3J06rCAIOyVoO2UjOumrOy8gOydtOyFmOyXkCDrgqjsp4Ag7JWK64+E66GdIOyCsOy2nOusvOuPhCDtlajqu5gg7KCV66as7ZWp64uI64ukLlxuICAgIGlmIChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHJlZ2lzdHJ5UGF0aCkpIHtcbiAgICAgIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0udW5saW5rKHJlZ2lzdHJ5UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeVBhdGg7XG4gIH1cblxuICBjb25zdCBbZ2VuZXJhdGVkUGF0aF0gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiaHR0cF92YWxpZGF0b3JzXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgYXNzZXJ0KGdlbmVyYXRlZFBhdGgpO1xuICByZXR1cm4gZ2VuZXJhdGVkUGF0aDtcbn1cblxuLyoqXG4gKiBxdWVyaWVzLmdlbmVyYXRlZC50cyDsnqzsg53shLHtlanri4jri6QuXG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICByZXR1cm4gZ2VuZXJhdGVUZW1wbGF0ZShcInF1ZXJpZXNcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIGVudHJ5LXNlcnZlci5nZW5lcmF0ZWQudHN466W8IOyDneyEse2VqeuLiOuLpC5cbiAqIOuLpOuluCDslaHshZjrk6Tqs7wg64us66asLCDsnbTrr7gg7YyM7J287J20IOyeiOycvOuptCDqt7jrg6Ug64aU65Gh64uI64ukLiDqt7jrnpjshJwg7ZWo7IiYIOydtOumhCDrgZ3sl5Ag7I2o64ao7Ja07JqUIOOFjlxuICog7J6F66ClIOydmOyhtCDsl4bripQg7KCV7KCBIOy9lOuTnOudvCDrp6Trsoggb3ZlcndyaXRl64qUIG10aW1l66eMIOqwseyLoO2VmOuKlCDsnZjrr7gg7JeG64qUIOuPmeyekS5cbiAqIO2FnO2UjOumvyDsnpDssrTqsIAg67OA6rK965CcIOqyveyasChTb25hbXUg7JeF6re466CI7J2065OcKeyXkOuKlCDsgqzsmqnsnpDqsIAg7YyM7J287J2EIOyCreygnO2VnCDrkqQgc3luY+uhnCDsnqzsg53shLEuXG4gKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QgKOydtOuvuCDsnojsnLzrqbQg67mIIOuwsOyXtCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZVNzckVudHJ5U2VydmVySWZOb3RFeGlzdHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiZW50cnlfc2VydmVyXCIsIHt9LCB7IG92ZXJ3cml0ZTogZmFsc2UgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBnZW5lcmF0ZVRlbXBsYXRl7J2AIG92ZXJ3cml0ZTogZmFsc2Xsl5DshJwg7YyM7J287J20IOydtOuvuCDsnojsnLzrqbQg7JiI7Jm466W8IOuNmOynkeuLiOuLpC5cbiAgICAvLyBJZk5vdEV4aXN0cyDsnZjrr7jsg4EgXCLqt7jrg6Ug64aU65GU64ukXCLqsIAg7KCV7IOB7J2066+A66GcIOu5iCDrsLDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgIGlmIChlIGluc3RhbmNlb2YgQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qKlxuICog7KO87Ja07KeEIC50cyDtjIzsnbzrk6QoYXBp7JeQIOyeiOuLpOqzoCDqsIDsoJUp7J2EIOuqqOuToCDtg4Dqsp8g65SU66CJ7Yag66as7J2YIHNlcnZpY2Vz7JeQIOqwluuLpCDrkaHri4jri6QuXG4gKiDsnbTrlYwg64K067aA7J2YIHNvbmFtdSBpbXBvcnTripQgc29uYW11LnNoYXJlZC50cyBpbXBvcnTroZwg7LmY7ZmY65CY6rOgLFxuICog6rK966Gc7J2YIC9hcHBsaWNhdGlvbi/snYAgL3NlcnZpY2VzL+uhnCDsuZjtmZjrkKnri4jri6QuXG4gKlxuICogQHBhcmFtIHRzUGF0aHMg67O17IKs7ZWgIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcXG4gKiBAcmV0dXJucyDqsIEg7YOA6rKf7JeQIOuzteyCrOuQnCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnCDrsLDsl7QgKGZsYXQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgeyBkaXI6IGFwaURpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgcmV0dXJuIChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+XG4gICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgIHRzUGF0aHMubWFwKGFzeW5jIChyZWFsU3JjKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkc3QgPSByZWFsU3JjXG4gICAgICAgICAgICAgIC5yZXBsYWNlKGAvJHthcGlEaXJ9L2AsIGAvJHt0YXJnZXR9L2ApXG4gICAgICAgICAgICAgIC5yZXBsYWNlKFwiL2FwcGxpY2F0aW9uL1wiLCBcIi9zZXJ2aWNlcy9cIik7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGRzdCk7XG4gICAgICAgICAgICBpZiAoIShhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0ubWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN5bmNIZWFkZXIgPSBbXG4gICAgICAgICAgICAgIFwiLyoqXCIsXG4gICAgICAgICAgICAgIFwiICogQGdlbmVyYXRlZFwiLFxuICAgICAgICAgICAgICBcIiAqIEFQSeyXkOyEnCDrj5nquLDtmZTrkJwg7YyM7J287J6F64uI64ukLiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgICAgICAgICAgXCIgKi9cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQocmVhbFNyYywgZHN0LCBzeW5jSGVhZGVyKTtcbiAgICAgICAgICAgIGF3YWl0IHRyYWNrV3JpdHRlbihcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBkc3QgYXMgQWJzb2x1dGVQYXRoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKGRzdC5yZXBsYWNlKGAke1NvbmFtdS5hcHBSb290UGF0aH0vYCwgXCJcIikpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGRzdDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuICApLmZsYXQoKTtcbn1cblxuLyoqXG4gKiBzaGFyZWQg7YWc7ZSM66a/7Jy866Gc67aA7YSwIHNvbmFtdS5zaGFyZWQudHMg7YyM7J287J2EIOunjOuTpOyWtOyEnCDrqqjrk6Ag7YOA6rKfIOuUlOugie2GoOumrOyXkCDqsJbri6Qg65Gh64uI64ukLlxuICog7YyM7J287J2EIOunjOuTnOuKlCDqs7zsoJXsl5DshJwg7Jes65+sIOy5mO2ZmCDqsIDqs7XsnbQg7J287Ja064Kp64uI64ukLlxuICpcbiAqIOuLpOuluCDslaHshZjrk6Tqs7wg64us66asLCDsnbTrr7gg7YyM7J287J20IOyeiOycvOuptCDqt7jrg6Ug64aU65Gh64uI64ukLiDqt7jrnpjshJwg7ZWo7IiYIOydtOumhCDrgZ3sl5Ag7I2o64ao7Ja07JqUIOOFjlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aW9uQ29weVNoYXJlZFRvVGFyZ2V0c0lmTm90RXhpc3RzKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcblxuICAvLyBwbHVyYWwudHMg64K07Jqp7J2EIOydveyWtOyEnCBzaGFyZWQg7YyM7J287JeQIOyCveyehe2VqeuLiOuLpC5cbiAgY29uc3QgZGljdFV0aWxzUGF0aCA9IHBhdGguam9pbihcbiAgICBpbXBvcnQubWV0YS5kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKSxcbiAgICBcIi4uL2RpY3QvdXRpbHMudHNcIixcbiAgKTtcbiAgY29uc3QgZGljdFV0aWxzQ29kZSA9IChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGRpY3RVdGlsc1BhdGgpKVxuICAgID8gYXdhaXQgc3luY2VyRmlsZXN5c3RlbS5yZWFkRmlsZShkaWN0VXRpbHNQYXRoLCBcInV0Zi04XCIpXG4gICAgOiBcIlwiO1xuXG4gIC8vIO2KueyglSDrs4DsiJgg7LmY7ZmY7J2EIOychO2VtOyEnCDsgqzsmqntlanri4jri6QuXG4gIGNvbnN0IGNvbnZlcnRNYXAgPSB7XG4gICAgYmFzZVVybDpcbiAgICAgIFNvbmFtdS5jb25maWcuc2VydmVyLmJhc2VVcmwgPz9cbiAgICAgIGBodHRwOi8vJHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/LnBvcnQgPz8gMzAwMH1gLFxuICAgIGRpY3RVdGlsczogZGljdFV0aWxzQ29kZSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICApO1xuICAgIGlmICghKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoc3JjUGF0aCkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQpKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFRleHQgPSBhd2FpdCBzeW5jZXJGaWxlc3lzdGVtLnJlYWRGaWxlKHNyY1BhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgY29udmVydGVkVGV4dCA9IE9iamVjdC5lbnRyaWVzKGNvbnZlcnRNYXApLnJlZHVjZShcbiAgICAgIChhY2MsIFtrZXksIHZhbHVlXSkgPT4gYWNjLnJlcGxhY2UoYCRbWyR7a2V5fV1dYCwgdmFsdWUpLFxuICAgICAgZnVsbFRleHQsXG4gICAgKTtcblxuICAgIC8vIOydtOqxtCDtlITroZzsoJ3tirjsl5AgLnRzIOyGjOyKpCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VmOuKlCDqsoPsnbTrr4DroZwgc3Jj7J2YIC50cyDqsr3roZzroZwg6rCR64uI64ukLlxuICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRzXCIpO1xuXG4gICAgLy8g7KCV66eQIO2YueyLnOuCmOyngOunjCB0YXJnZXQg65SU66CJ7Yag66as64qUIOyeiOyWtOuPhCBzcmMvc2VydmljZXMg65SU66CJ7Yag66as64qUIOyXhuydhCDsiJgg7J6I7Jy866+A66GcIOuvuOumrCDsg53shLHtlbTspI3ri4jri6QuXG4gICAgaWYgKCEoYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhwYXRoLmRpcm5hbWUoZGVzdFBhdGgpKSkpIHtcbiAgICAgIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0ubWtkaXIocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBjb25zb2xlLndhcm4oYENyZWF0ZWQgZGlyZWN0b3J5ICcke3BhdGguZGlybmFtZShkZXN0UGF0aCl9JyBiZWNhdXNlIGl0IGRpZCBub3QgZXhpc3QuYCk7XG4gICAgfVxuXG4gICAgLy8g7YyM7J287J20IOydtOuvuCDsobTsnqztlZjrqbQg6rG064SI65yB64uI64ukLlxuICAgIC8vIHNvbmFtdS5zaGFyZWQudHPripQg7ZSE66Gc7KCd7Yq47JeQ7IScIOyekOycoOuhreqyjCDsu6TsiqTthLDrp4jsnbTsp5XtlaAg7IiYIOyeiOyWtOyVvCDtlZjrr4DroZwsXG4gICAgLy8g7LWc7LSIIDHtmozrp4wg7IOd7ISx7ZWY6rOgIOydtO2bhOyXkOuKlCDrja7slrTsk7Dsp4Ag7JWK7Iq164uI64ukLlxuICAgIC8vIO2FnO2UjOumvyDrgrTsmqkoJFtbZGljdFV0aWxzXV0g65OxKeydtCDrs4Dqsr3rkJjsl4jsnYQg65WMIOuwmOyYgeydtCDtlYTsmpTtlZjrqbQsXG4gICAgLy8g7ZW064u5IO2MjOydvOydhCDsgq3soJztlZwg65KkIGBwbnBtIHNvbmFtdSBzeW5jYOuhnCDsnqzsg53shLHtlZjrqbQg65Cp64uI64ukLlxuICAgIGlmIChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGRlc3RQYXRoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgc3luY2VyRmlsZXN5c3RlbS53cml0ZUZpbGUoZGVzdFBhdGgsIGF3YWl0IGZvcm1hdENvZGUoY29udmVydGVkVGV4dCwgZGVzdFBhdGgpKTtcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSkpO1xuICB9XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkoU0Qp66W8IOuqqOuToCDtg4Dqsp8oYXBpICsgd2ViL2FwcCDrk7Ep7JeQIOuPmeq4sO2ZlO2VqeuLiOuLpC5cbiAqXG4gKiDqsIEg7YOA6rKf7JeQIOuMgO2VtDpcbiAqIC0gdGFyZ2V07J20IGFwaeqwgCDslYTri4jrqbQg7IKs7Jqp7J6QIOyekeyEsSBsb2NhbGUg7YyM7J28KGtvLnRzL2VuLnRzLy4uLinsnYQgYXBpIOKGkiB0YXJnZXTsnLzroZwg67O17IKsXG4gKiAtIHNkIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlbTshJwgc2QuZ2VuZXJhdGVkLnRzIOyDneyEsSAob3ZlcndyaXRlKVxuICpcbiAqIO2VnCDtg4Dqsp/sl5DshJwg7Iuk7Yyo7ZW064+EIOuLpOuluCDtg4Dqsp/snYAg6rOE7IaNIOynhO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgaTE4bkNvbmZpZyA9IFNvbmFtdS5jb25maWcuaTE4bjtcblxuICBjb25zdCB0YXJnZXRMaXN0ID1cbiAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtcbiAgICAgIFwiYXBpXCIsXG4gICAgICAuLi50YXJnZXRzLFxuICAgIF0gYXMgKFwiYXBpXCIgfCBcIndlYlwiIHwgXCJhcHBcIilbXTtcblxuICBjb25zdCBhcGlJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgU29uYW11LmNvbmZpZy5hcGkuZGlyLCBcInNyYy9pMThuXCIpO1xuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldExpc3QpIHtcbiAgICB0cnkge1xuICAgICAgLy8gd2ViL2FwcOydmCDqsr3smrAgbG9jYWxlIO2MjOydvOuTpOydhCBhcGnsl5DshJwg67O17IKsXG4gICAgICBpZiAodGFyZ2V0ICE9PSBcImFwaVwiKSB7XG4gICAgICAgIGF3YWl0IHN5bmNMb2NhbGVGaWxlcyh0YXJnZXQsIGFwaUkxOG5EaXIsIGkxOG5Db25maWcuc3VwcG9ydGVkTG9jYWxlcyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJzZFwiLCB7IHRhcmdldCB9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2VuZXJhdGUgU0QgdGVtcGxhdGUgZm9yICR7dGFyZ2V0fTpgLCBlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBhcGnsnZggbG9jYWxlIO2MjOydvOydhCB3ZWIvYXBw7Jy866GcIOuzteyCrO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luY0xvY2FsZUZpbGVzKFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgYXBpSTE4bkRpcjogc3RyaW5nLFxuICBsb2NhbGVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0YXJnZXRJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9pMThuXCIpO1xuXG4gIC8vIOuUlOugie2GoOumrOqwgCDsl4bsnLzrqbQg7IOd7ISxXG4gIGF3YWl0IHN5bmNlckZpbGVzeXN0ZW0ubWtkaXIodGFyZ2V0STE4bkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBwYXRoLmpvaW4oYXBpSTE4bkRpciwgYCR7bG9jYWxlfS50c2ApO1xuICAgIGNvbnN0IHRhcmdldEZpbGUgPSBwYXRoLmpvaW4odGFyZ2V0STE4bkRpciwgYCR7bG9jYWxlfS50c2ApO1xuXG4gICAgY29uc3Qgc3luY0hlYWRlciA9IFtcbiAgICAgIFwiLyoqXCIsXG4gICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgIFwiICogQVBJ7JeQ7IScIOuPmeq4sO2ZlOuQnCDtjIzsnbzsnoXri4jri6QuIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgXCIgKi9cIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgYXdhaXQgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChzb3VyY2VGaWxlLCB0YXJnZXRGaWxlLCBzeW5jSGVhZGVyKTtcbiAgICBhd2FpdCB0cmFja1dyaXR0ZW4oXG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRhcmdldEZpbGUgYXMgQWJzb2x1dGVQYXRoLFxuICAgICk7XG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5jeWFuKGAke3RhcmdldH0vc3JjL2kxOG4vJHtsb2NhbGV9LnRzYCkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxlQUFzQixtQkFBbUI7Q0FDdkMsTUFBTSxFQUFFLE1BQU0sU0FBUyxPQUFPLE9BQU8sT0FBTyxVQUFVLENBQUM7Q0FDdkQsTUFBTSxVQUFVLFlBQVksUUFBUSxZQUFZLGFBQWEsUUFBUTtDQUVyRSxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxDQUFDO0NBQ3ZDLE1BQU0sUUFBUSxJQUFJLENBQ2hCLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxLQUFLLFdBQVc7RUFDNUMsT0FBTyxpQkFBaUIsVUFDdEIsS0FBSyxLQUFLLE9BQU8sYUFBYSxRQUFRLGFBQWEsR0FDbkQsT0FDRjtDQUNGLENBQUMsR0FDRCxpQkFBaUIsaUJBQWlCLENBQUMsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDLENBQzNELENBQUM7QUFDSDs7Ozs7O0FBT0EsZUFBc0IsdUJBQ3BCLGFBR3lCO0NBQ3pCLE1BQU0sRUFBRSwwQkFBMEIsV0FBVztDQVc3QyxPQUFPLENBQUMsR0FBRyxNQVJnQixpQkFDekIsWUFDQSxDQUFDLEdBQ0QsRUFDRSxXQUFXLEtBQ2IsQ0FDRixDQUV1QjtBQUN6Qjs7Ozs7QUFNQSxlQUFzQiwyQkFBMkIsVUFBMkM7Q0FDMUYsT0FBTyxpQkFBaUIsY0FBYyxFQUFFLFNBQVMsQ0FBQztBQUNwRDs7Ozs7QUFN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
@@ -24,7 +24,7 @@ import chalk from "chalk";
24
24
  import { minimatch } from "minimatch";
25
25
  import { EventEmitter } from "events";
26
26
  import { hot } from "@sonamu-kit/hmr-hook";
27
- //#region src/syncer/syncer.ts
27
+ // src/syncer/syncer.ts
28
28
  var Syncer;
29
29
  var init_syncer = __esmMin((() => {
30
30
  init_decorators();
@@ -268,9 +268,13 @@ var init_syncer = __esmMin((() => {
268
268
  const entityId = EntityManager.getEntityIdFromPath(entityPath);
269
269
  const entity = EntityManager.get(entityId);
270
270
  const typeFilePath = path.join(Sonamu.apiRootPath, `src/application/${entity.names.fs}/${entity.names.fs}.types.ts`);
271
- if (entity.parentId === void 0 && !await syncerFileExists(typeFilePath)) await actionSyncFilesToTargets(await actionGenerateInitialTypes(entityId));
271
+ if (entity.parentId === void 0 && !await syncerFileExists(typeFilePath)) {
272
+ const types = await actionGenerateInitialTypes(entityId);
273
+ await actionSyncFilesToTargets(types);
274
+ }
272
275
  }
273
- await actionSyncFilesToTargets((await actionGenerateSchemas()).filter((p) => !p.endsWith(".sso.ts")));
276
+ const distributable = (await actionGenerateSchemas()).filter((p) => !p.endsWith(".sso.ts"));
277
+ await actionSyncFilesToTargets(distributable);
274
278
  }
275
279
  async handleImplementationChanges(diffGroups) {
276
280
  Naite.t("handleImplementationChanges", { diffGroups });
@@ -278,20 +282,22 @@ var init_syncer = __esmMin((() => {
278
282
  await this.autoloadModels();
279
283
  await this.autoloadTypes();
280
284
  await this.autoloadApis();
281
- await actionGenerateServices(mergedGroup.map((modelPath) => {
285
+ const params = mergedGroup.map((modelPath) => {
282
286
  if (modelPath.endsWith(".model.ts") || modelPath.endsWith(".frame.ts")) {
283
287
  const entityId = EntityManager.getEntityIdFromPath(modelPath);
284
288
  assert(entityId);
285
289
  return { namesRecord: EntityManager.getNamesFromId(entityId) };
286
290
  }
287
291
  throw new Error("not reachable");
288
- }));
292
+ });
293
+ await actionGenerateServices(params);
289
294
  await actionGenerateHttps();
290
295
  await actionGenerateSsrQueries();
291
296
  }
292
297
  async handleAuxiliarySymbolChanges(diffGroups) {
293
298
  Naite.t("handleAuxiliarySymbolChanges", { diffGroups });
294
- await actionSyncFilesToTargets(unique([...diffGroups.types ?? [], ...diffGroups.functions ?? []]));
299
+ const tsPaths = unique([...diffGroups.types ?? [], ...diffGroups.functions ?? []]);
300
+ await actionSyncFilesToTargets(tsPaths);
295
301
  }
296
302
  async handleConfigChanges() {
297
303
  if (process.env.HOT === "yes") {
@@ -392,8 +398,7 @@ var init_syncer = __esmMin((() => {
392
398
  }
393
399
  };
394
400
  }));
395
- //#endregion
396
401
  init_syncer();
397
402
  export { Syncer, init_syncer };
398
403
 
399
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwibmFtZXMiOlsiU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVIdHRwVmFsaWRhdG9ycyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWciLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBob3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvaG1yLWhvb2tcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgR2VuZXJhdGVPcHRpb25zLCB0eXBlIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXAsIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgc3luY2VyRmlsZUV4aXN0cywgc3luY2VyRmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0tZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBsb2FkQXBpcywgbG9hZE1vZGVscywgbG9hZFR5cGVzLCBsb2FkV29ya2Zsb3dzIH0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuaW1wb3J0IHsgdHlwZSBMb2FkZWRBcGlzLCB0eXBlIExvYWRlZE1vZGVscywgdHlwZSBMb2FkZWRUeXBlcyB9IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCAqIGFzIFN5bmNlckFjdGlvbnMgZnJvbSBcIi4vc3luY2VyLWFjdGlvbnNcIjtcblxudHlwZSBEaWZmR3JvdXBLZXkgPSBGaWxlVHlwZSB8IFwidW5rbm93blwiO1xudHlwZSBEaWZmR3JvdXBzID0gUGFydGlhbDxSZWNvcmQ8RGlmZkdyb3VwS2V5LCBBYnNvbHV0ZVBhdGhbXT4+O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIGRldiDshJzrsoTqsIAg7LKY7J2MIOuWtOydhCDrlYwsIHNvbmFtdSBzeW5jIO2VoCDrlYwg7Iuk7ZaJ65Cp64uI64ukLiDsnbTtm4Tsl5DripQgaG1yQW5kU3luYyDqsr3roZzrpbwg7YOA7JqULlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDstIjquLAg67aA7Yq47Iqk7Yq4656pISDslpjrhKTrk6TsnYAgaWRlbXBvdGVudO2VmOqzoCDqsIDrs43quLAg65WM66y47JeQIOustOyngOyEsSDsi6TtlontlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIOyWmOuEpOuTpOydgCBzb25hbXUubG9ja+yXkCDrk6TslrTqsIDsp4Drj4Qg7JWK6rOgIOuUsOudvOyEnCBITVIg6rK966Gc66W8IO2DgOyngOuPhCDslYrripQg7Lmc6rWs65Ok7J6F64uI64ukLlxuICAgIC8vIOq3uOuemOyEnCDslYTrrLQg65WM64KYIOq3uOuDpSDrj4zroKTso7zrqbQg65CY64qU642wLCBobXJBbmRTeW5j7JeQ7IScIOunpOuyiCDtlZjripQg6rKD7J2AIOuCreu5hOydtOuLiCDsl6zquLDshJwg7ZWcIOuyiOunjCDtlanri4jri6QuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMoKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cygpO1xuXG4gICAgLy8g67CU64CQIOqyg+ydtCDsl4bsnLzrqbQg6re464OlIOuEmOyWtOqwgOyalC5cbiAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTtcbiAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMucmVjb25jaWxlSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KCkpIHtcbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyXrOq4sOyEnCDsi6TsoJwg7Iux7YGsIOuPmeyekeydhCDsiJjtlontlanri4jri6QuXG4gICAgLy8g64uk66eMIOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvbmNpbGVIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVnaXN0cnlQYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgXCJzcmMvYXBwbGljYXRpb24vc29uYW11LnZhbGlkYXRvcnMuZ2VuZXJhdGVkLnRzXCIsXG4gICAgKTtcbiAgICBjb25zdCBwb2xpY3kgPSBTb25hbXUuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyO1xuICAgIGNvbnN0IGlzQW90ID0gaXNPYmplY3RWYWx1ZShwb2xpY3kpICYmIHBvbGljeSAhPT0gbnVsbCAmJiBwb2xpY3kuYXBpID09PSBcImFvdFwiO1xuICAgIGlmIChpc0FvdCA9PT0gKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyDrs4Dqsr0g66qp66Gd7J20IHJlZ2lzdHJ5IOyCreygnOulvCDrhpPss5Drj4QgY2hlY2tzdW0g6rCx7IugIOyghOyXkCDsoJXssYXqs7wg7IKw7Lac66y87J2EIOuLpOyLnCDrp57stqXri4jri6QuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICog6rCV7KCcIO2SgC3si7Htgaw6IGxvY2vsnYQg66y07Iuc7ZWY6rOgIOyymOydjOu2gO2EsCDri6Tsi5wg7Iux7YGs7ZWp64uI64ukLlxuICAgKlxuICAgKiAqKuyCrOyaqeyymCoqOiBnaXQgcG9zdC1tZXJnZSBob29rLCBDSSwgZGV2IOyEnOuyhOydmCBgZmAg7ZWr7YKkLlxuICAgKiAqKuyLpO2MqCDslYjsoITshLEqKjog64+E7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73slrQgbG9jayDsl4bripQg7IOB7YOc66GcIOuCqOyVhOuPhCDrrLTtlbQg4oCUIOuLpOydjCBzeW5j7JeQ7IScXG4gICAqIGxvY2sg7JeG7Jy866m0IOyekOyXsOyKpOufveqyjCDtkoAt7Iux7YGs6rCAIO2KuOumrOqxsOuQmOyWtCDsg4ggbG9ja+ydtCDsnpHshLHrkKguXG4gICAqL1xuICBhc3luYyBmb3JjZVN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9ja1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNvbmFtdS5sb2NrXCIpO1xuICAgIGlmIChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGxvY2tQYXRoKSkge1xuICAgICAgYXdhaXQgc3luY2VyRmlsZXN5c3RlbS51bmxpbmsobG9ja1BhdGgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIGJhdGNo66GcIOuqqOydgCDrs4Dqsr0g7YyM7J2865Ok7JeQIOuMgO2VtCDtlZwg67KI7J2YIEhNUi9zeW5jIOyCrOydtO2BtOydhCDrj5Xri4jri6QuXG4gICAqXG4gICAqIEhNUuydgCBhcGkvc3JjIOyViOyXkOyEnCDsnbzslrTrgpjripQg66qo65OgIO2MjOydvOuTpOyXkCDrjIDtlbTshJwg7IiY7ZaJ7ZWp64uI64ukLlxuICAgKiBjaGVja3N1bVBhdHRlcm5Hcm91cCDrp6Tsua0g7Jes67aA7JmAIOustOq0gO2VmOqyjCBhcGkvc3JjIOyghOyytCDrjIDsg4HsnoXri4jri6QuXG4gICAqIOqwgOuguSBhcGkvc3JjL3V0aWxzL3N1YnNldC1sb2FkZXJzLnRzIOqwmeydgCDtjIzsnbzrj4Qg67OA6rK965CY66m0IEhNUuydgCDtlbTspI3ri4jri6QuXG4gICAqXG4gICAqIFN5bmPripQgY2hlY2tzdW1QYXR0ZXJuR3JvdXDsnLzroZwg66ek7Lmt65CY64qUIO2MjOydvOuTpOyXkCDrjIDtlbTshJzrp4wg7IiY7ZaJ7ZWp64uI64ukLlxuICAgKiDsl6zquLDsl5DripQgd2ViL3NyY+uCmCBhcHAvc3JjIOqwmeydgCDri6TrpbggdGFyZ2V07J2YIO2MjOydvOydtCDtj6ztlajrkKAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7J2065+wIG5vbi1hcGkg6rK966Gc7J2YIO2MjOydvOuTpOydgCBITVLqs7zripQg7JWE66y0IOyDgeq0gOydtCDsl4bsnLzrr4DroZwsIGludmFsaWRhdGXsnYQg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVFdmVudHMgLSBwYXRoIOKGkiBldmVudCDrp7UuIGV2ZW5064qUIFwiY2hhbmdlXCIgfCBcImFkZFwiLlxuICAgKi9cbiAgYXN5bmMgaG1yQW5kU3luYyhmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBobXJBY3Rpb25SZXF1aXJlZEV2ZW50cyA9IHRoaXMuZXh0cmFjdEhtckFjdGlvblJlcXVpcmVkRmlsZUV2ZW50cyhmaWxlRXZlbnRzKTtcbiAgICBjb25zdCBzeW5jVHJpZ2dlcmluZ1BhdGhzID0gYXdhaXQgdGhpcy5leHRyYWN0U3luY1RyaWdnZXJpbmdGaWxlRXZlbnRQYXRocyhmaWxlRXZlbnRzKTtcblxuICAgIC8vIEhNUiDsmIHsl606IO2MjOydvCDsnbTrsqTtirgg7KSRIGFwaeydmCDrqqjrk4gg6re4656Y7ZSE7JeQIOyeiOuKlCDtjIzsnbzrk6Tsl5Ag64yA7ZWcIOuzgOuPmeydgCBobXJBY3Rpb25SZXF1aXJlZEV2ZW50c+uhnCDsnqHtnpnri4jri6QuXG4gICAgLy8g7J20IOy5nOq1rOuTpOydgCBpbnZhbGlkYXRlIOyymOumrO2VtOykjeuLiOuLpC5cbiAgICAvLyDsnbQg7Zi47Lac7J2AIOyVhOuemCBzeW5j67O064ukIOustOyhsOqxtCDrqLzsoIAg7J287Ja064KY7JW8IO2VqeuLiOuLpCFcbiAgICAvLyDsmZzrg5DtlZjrqbQgc3luY+yXkOyEnOuKlCDrs4Dqsr3rkJwgbW9kZWwg7L2U65Oc66W8IOyDiOuhnCBpbXBvcnTtlbTshJwg7LKY66as7ZW07JW8IO2VmOuKlCDqsr3smrDrj4Qg7J6I6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVEZXBlbmRlbnRzQWZmZWN0ZWRCeUZpbGVFdmVudHMoaG1yQWN0aW9uUmVxdWlyZWRFdmVudHMpO1xuXG4gICAgLy8gU3luYyDsmIHsl606IGNoZWNrc3VtUGF0dGVybkdyb3Vw7JeQIOuqheyLnOuQnCDtjIzsnbzrk6Tsl5Ag64yA7ZWcIOuzgOuPmeydgCBzeW5jVHJpZ2dlcmluZ1BhdGhz66GcIOyeoe2emeuLiOuLpC5cbiAgICAvLyDsnbQg7Lmc6rWs65Ok7J2AIOyggeygiO2VnCBzeW5jIOyekeyXheycvOuhnCDrjIDsnZHtlanri4jri6QuXG4gICAgaWYgKHN5bmNUcmlnZ2VyaW5nUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKHN5bmNUcmlnZ2VyaW5nUGF0aHMpO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64Ks7Jy866m0IOustOyngOyEsSDroZzrk5zrpbwg7IiY7ZaJ7ZWp64uI64ukLlxuICAgIC8vIOyLse2BrOulvCDslYgg7ZWcIOqyveyasOyXkOuPhCDroZzrk5zripQg7ZW07JW8IO2VtOyalC4g7JyE7JeQ7IScIOq0gOugqOyeiOuKlCDsuZzqtazrk6TsnYAg64ukIGludmFsaWRhdGUg65CY7JeI6rGw65Og7JqUIVxuICAgIC8vXG4gICAgLy8g67OA6rK965CcIO2MjOydvOuTpOyXkCDrjIDtlbTshJwg7IOI66Gt6rKMIOuLueqyqOyYpOuKlChsb2FkKSDtlonsnITripQgZG9TeW5jQWN0aW9uc+yXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgIC8vIGRvU3luY0FjdGlvbnPsl5DshJzripQg7YyM7J287J2EIOydveqzoCDrp4zrk5zripQg7Iux7YGsIO2WieychOunjCDtlanri4jri6QuXG4gICAgLy8g6rGw6riw7IScIOuUsSDrs4Dqsr3rkJwg67aA67aE7JeQIOyYge2Wpeuwm+uKlCBhdXRvbG9hZOunjCDshKDrs4TtlbTshJwg7IiY7ZaJ7ZWY66Ck66m0IOuEiOustCDsp4DsoIDrtoTtlZjqs6Ag67O17J6h7ZW07KeR64uI64ukLlxuICAgIC8vXG4gICAgLy8g7Y287Y+s66i87IqkIOyYge2WpeydgCDrrLTsi5ztlbTrj4Qg7KKL7Iq164uI64ukLlxuICAgIC8vIOyWtOywqO2UvCBobXItaG9va+yXkCDsnZjtlbQgaW52YWxpZGF0ZeuQnCDrtoDrtoTrk6TsnbQg7JWE64uI652866m0IOy6kOyLnCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkU3NyUm91dGVzKCk7XG4gICAgYXdhaXQgU29uYW11LnJlZnJlc2hIdHRwVmFsaWRhdG9ycygpO1xuXG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG1yQWN0aW9uUmVxdWlyZWRGaWxlRXZlbnRzKFxuICAgIGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPixcbiAgKTogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+IHtcbiAgICBjb25zdCBhcGlTcmMgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBpZiAoIWZpbGVQYXRoLnN0YXJ0c1dpdGgoYXBpU3JjKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5zZXQoZmlsZVBhdGgsIGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdFN5bmNUcmlnZ2VyaW5nRmlsZUV2ZW50UGF0aHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gICAgY29uc3Qgc3luY1RyaWdnZXJpbmdQYXRoczogQWJzb2x1dGVQYXRoW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGhdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoY2hlY2tQYXR0ZXJuR3JvdXApLnNvbWUoKHBhdHRlcm4pID0+XG4gICAgICAgIG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICAgKTtcbiAgICAgIGlmICghaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc3luY1RyaWdnZXJpbmdQYXRocy5wdXNoKGRpZmZGaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bmNUcmlnZ2VyaW5nUGF0aHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGludmFsaWRhdGVEZXBlbmRlbnRzQWZmZWN0ZWRCeUZpbGVFdmVudHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApIHtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAvLyDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9XG4gICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKFxuICAgICAgICAgICAgZGlmZkZpbGVQYXRoLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgKSkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgICAgICAgaWYgKGludmFsaWRhdGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBpbnZhbGlkYXRlZFBhdGggb2YgaW52YWxpZGF0ZWRQYXRocykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAgICAgLy8gcmVnaXN0ZXJlZEFwaXPripQg7Ya17Jy866GcIOuLpCDrgqDroKTrsoTrprQg7IiYIOyXhuyKteuLiOuLpC4gcmVnaXN0ZXJlZEFwaXPsl5Ag7Jis65287Jik64qUIOy5nOq1rOuTpOydgCDstIjquLAg66Gc65Oc7IucIOuYkOuKlCBITVLsi5zsl5Drp4wg65Ox66Gd65CY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICAgICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICAgICAgaWYgKHJlbW92ZWRBcGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoYCh3aXRoICR7cmVtb3ZlZEFwaXMubGVuZ3RofSBBUElzKWApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlbW92ZSBpbnZhbGlkYXRlZCByZWdpc3RlcmVkIEFQSXMgZm9yICR7aW52YWxpZGF0ZWRQYXRofWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkZXZSdW5uZXIg7Zmc7ISx7ZmUIOyLnCwg67OA6rK965CcIOyGjOyKpCDtjIzsnbzsnYQgVml0ZXN0IOuqqOuTiCDqt7jrnpjtlITsl5DshJzrj4Qg66y07Zqo7ZmU7ZWp64uI64ukLlxuICAgICAgLy8gVml0ZeydmCBtb2R1bGVHcmFwaC5pbnZhbGlkYXRlTW9kdWxlKCnsnbQgaW1wb3J0ZXIg67Cp7Zal7Jy866GcIOyerOq3gOyggSBjYXNjYWRl7ZWY66+A66GcLFxuICAgICAgLy8g7IaM7IqkIO2MjOydvCDtlZjrgpjrp4wg66y07Zqo7ZmU7ZWY66m0IOydtOulvCBpbXBvcnTtlZjripQg7YWM7Iqk7Yq4IO2MjOydvOuPhCDsnpDrj5nsnLzroZwg66y07Zqo7ZmU65Cp64uI64ukLlxuICAgICAgaWYgKCFpc1Rlc3QoKSAmJiBTb25hbXUuY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCAmJiBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlcikge1xuICAgICAgICBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlci5pbnZhbGlkYXRlRmlsZXMoW2RpZmZGaWxlUGF0aF0pO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5kaW0oYFRlc3QgaW52YWxpZGF0ZWQ6ICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGRpZmZGaWxlUGF0aCl9YCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICAvLyDshozsiqQg7L2U65Oc66W8IOuLpOujqOuKlCDsg4HtmansnbTri4ggLnRzIOqyveuhnOuhnCDrtIXri4jri6QuXG4gICAgY29uc3QgaXNNb2RlbCA9IGludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKTtcbiAgICBjb25zdCBpc0ZyYW1lID0gaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpO1xuICAgIGlmICghaXNNb2RlbCAmJiAhaXNGcmFtZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdGFyZ2V0TW9kZWxOYW1lID0gYCR7ZW50aXR5SWR9JHtpc01vZGVsID8gXCJNb2RlbFwiIDogXCJGcmFtZVwifWA7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gdGFyZ2V0TW9kZWxOYW1lKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgY29uc3QgaWR4ID0gcmVnaXN0ZXJlZEFwaXMuaW5kZXhPZihhcGkpO1xuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRXb3JrZmxvd3MoKSB7XG4gICAgdGhpcy53b3JrZmxvd3MgPSBhd2FpdCBsb2FkV29ya2Zsb3dzKCk7XG4gICAgYXdhaXQgU29uYW11LndvcmtmbG93cy5zeW5jaHJvbml6ZSh0aGlzLndvcmtmbG93cyk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFNzclJvdXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzc3JDb25maWdQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvc3NyXCIpO1xuXG4gICAgLy8g6riw7KG0IHJvdXRlcyDstIjquLDtmZRcbiAgICBjb25zdCB7IGNsZWFyU1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgY2xlYXJTU1JSb3V0ZXMoKTtcblxuICAgIC8vIHNzciDtj7TrjZQg7JeG7Jy866m0IOyKpO2CtVxuICAgIGlmICghKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoc3NyQ29uZmlnUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3NyIO2PtOuNlCDslYjsnZgg66qo65OgIC50cyDtjIzsnbwg66Gc65OcXG4gICAgY29uc3QgeyBnbG9iQXN5bmMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgaW1wb3J0TWVtYmVycyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZXNtLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgcnVudGltZVBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIik7XG5cbiAgICAvLyBydW50aW1lUGF0aOulvCDsgqzsmqntlZjsl6wg6rCc67CcL+2UhOuhnOuNleyFmCDtmZjqsr3sl5Ag66ee64qUIO2ZleyepeyekCDsspjrpqxcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhwYXRoLmpvaW4oc3NyQ29uZmlnUGF0aCwgcnVudGltZVBhdGgoXCIqKi8qLnRzXCIpKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZWY66m0IO2MjOydvOydmCBzaWRlIGVmZmVjdChyZWdpc3RlclNTUiDtmLjstpwp6rCAIOyLpO2WieuQqFxuICAgICAgICBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTU1Igcm91dGU6ICR7ZmlsZX1gLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IEZpbGVUeXBlW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID1cbiAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gT2JqZWN0LmtleXMoXG4gICAgICAgIGRpZmZHcm91cHMsXG4gICAgICApIGFzIEZpbGVUeXBlW107XG5cbiAgICAvLyDsl6zquLDripQg67OE66GcIOykkeyalO2VnCDtjIztirjripQg7JWE64uZ64uI64ukLlxuICAgIC8vIOyVhOuemOydmCBpZiDsoITqsJzrpbwg6rmU64GU7ZWY6rKMIO2VmOugpOqzoCDrp4zrk6AgRFNMIOqwmeydgCDqsbDrnbzshJwsIOustOyLnO2VmOyFlOuPhCDrkKnri4jri6QuXG4gICAgY29uc3QgeyBjaGFuZ2VNYXRjaGVzLCB1bmhhbmRsZWRQYXRocywgdW5oYW5kbGVkQ2hhbmdlc0xlZnQgfSA9IHRoaXMuY2hhbmdlTWF0Y2hlcihcbiAgICAgIGRpZmZUeXBlcyxcbiAgICAgIGRpZmZHcm91cHMsXG4gICAgKTtcblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiZW50aXR5XCIsIFwidHlwZXNcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwibW9kZWxcIiwgXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJ0eXBlc1wiLCBcImZ1bmN0aW9uc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVBdXhpbGlhcnlTeW1ib2xDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbmZpZ0NoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcIndvcmtmbG93XCIpKSB7XG4gICAgICAvLyDrrZAg65Sx7Z6IIOyViCDtlbTsmpQuIOq3uOuemOuPhCDsnbQgaWYg7KGw6rG07J2AIGV2YWzrkJjslrTslbwg7ZWY6riwIOuVjOusuOyXkCDrgqjqsqjrkaHri4jri6Qg44WO44WOXG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJpMThuXCIsIFwiZW50aXR5XCIgLyrroIjsnbTruJQqLywgXCJjb25maWdcIiAvKmRlZmF1bHRMb2NhbGXrk7EqLykpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU29uYW11RGljdGlvbmFyeVJlbGF0ZWRDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJlbnRpdHlcIiwgXCJ0eXBlc1wiLCBcIm1vZGVsXCIsIFwiZnJhbWVcIiwgXCJjb25maWdcIiwgXCJodHRwVmFsaWRhdG9yc0dlbmVyYXRlZFwiKSkge1xuICAgICAgLy8g7IOd7ISx66y8KGh0dHBWYWxpZGF0b3JzR2VuZXJhdGVkKeyXkCDrk5zrpqztlITtirjqsIAg7IOd6ri0IOqyveyasOuPhCDsspjrpqztlanri4jri6QuXG4gICAgICAvLyDri6Trpbgg6rKDIOyViCDrsJTrgIzqs6Ag65SxIGh0dHBWYWxpZGF0b3JzR2VuZXJhdGVk66eMIOuwlOuAkCDqsr3smrDsl5Drj4Qg64+Z65Ox7ZWcIOyymOumrCg966y07KeA7ISxIOyYpO2GoOuhnOuTnCnrpbwg7ZWp64uI64ukLiDqt7jrg6Ug7J2067uQ7ISc7JqUIOOFi1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVIdHRwVmFsaWRhdG9yUmVsYXRlZENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvLyDsnITsl5DshJwg7LKY66asIOyViCDrkJwg67OA6rK965Ok7J20IOyeiOuLpD9cbiAgICAvLyDssrTtgazshKwg6rSA66asIOuMgOyDgeydtOq4tCDtlZzrjbAg7JyE7JeQ7IScIO2VuOuTpOungeydtCDslYgg65CcIOqyg+ydtOudvOuptCDqsrDqta0g7IOd7ISx66y87J6F64uI64ukLlxuICAgIC8vIOydtCDsuZzqtazrk6TsnbQg67OA6rK965CcIOqyg+ydgCBkcmlmdOuhnCDqsITso7ztlbTrj4Qg66eI65WF7ZWp64uI64ukLlxuICAgIGlmICh1bmhhbmRsZWRDaGFuZ2VzTGVmdCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZURyaWZ0cyh1bmhhbmRsZWRQYXRocygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pIHtcbiAgICBjb25zdCBwYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cCgpO1xuICAgIGNvbnN0IGZpbGVUeXBlcyA9XG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICBwYXR0ZXJuR3JvdXAsXG4gICAgICApIGFzIEZpbGVUeXBlW107XG5cbiAgICBjb25zdCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzID0ge307XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBkaWZmRmlsZXMpIHtcbiAgICAgIC8vIOygiOuMgCDqsr3roZzrpbwgYXBwUm9vdCDquLDspIAg7IOB64yAIOqyveuhnOuhnCDrsJTqv5Qg7LK07YGs7ISsIO2MqO2EtOqzvCDruYTqtZDtlZzri6QuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlVHlwZXMuZmluZCgoY2FuZGlkYXRlKSA9PlxuICAgICAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBwYXR0ZXJuR3JvdXBbY2FuZGlkYXRlXSksXG4gICAgICApO1xuICAgICAgY29uc3QgZ3JvdXBLZXk6IERpZmZHcm91cEtleSA9IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi5cIilcbiAgICAgICAgPyBcInVua25vd25cIlxuICAgICAgICA6IChmaWxlVHlwZSA/PyBcInVua25vd25cIik7XG4gICAgICAoZGlmZkdyb3Vwc1tncm91cEtleV0gPz89IFtdKS5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmZHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZU1hdGNoZXIoZGlmZlR5cGVzOiBGaWxlVHlwZVtdLCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKSB7XG4gICAgY29uc3QgaGFuZGxlZCA9IG5ldyBTZXQ8RmlsZVR5cGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiDrs4Dqsr0g7IKs7ZWt7J20IOyduOyekOuhnCDrsJvsnYAgRmlsZVR5cGXrk6Qg7KSRIO2VmOuCmCDsnbTsg4HsnYQg7Y+s7ZWo7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICAgKiDqsIDroLkgW1wiZW50aXR5XCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImVudGl0eVwiKeuKlCB0cnll66W8IOuwmO2ZmO2VmOupsCxcbiAgICAgKiBbXCJ0eXBlc1wiLCBcImkxOG5cIl3snbQg67OA6rK965CcIO2YuOy2nOyXkOyEnCBjaGFuZ2VNYXRjaGVzKFwidHlwZXNcIiwgXCJmdW5jdGlvbnNcIinrj4QgdHJ1ZeulvCDrsJjtmZjtlZjsp4Drp4wsXG4gICAgICogW1wiZnVuY3Rpb25zXCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImZyYW1lXCIp7J2AIGZhbHNl66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiBAcGFyYW0gdHlwZXNcbiAgICAgKi9cbiAgICBjb25zdCBjaGFuZ2VNYXRjaGVzID0gKC4uLnR5cGVzOiBGaWxlVHlwZVtdKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IHR5cGVzLmZpbHRlcigodCkgPT4gZGlmZlR5cGVzLmluY2x1ZGVzKHQpKTtcbiAgICAgIG1hdGNoaW5nLmZvckVhY2goKHQpID0+IGhhbmRsZWQuYWRkKHQpKTtcbiAgICAgIHJldHVybiBtYXRjaGluZy5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiDslrTrlqQgY2hhbmdlTWF0Y2hlcyDtmLjstpzsl5Drj4Qg6rG466as7KeAIOyViuydgCBGaWxlVHlwZeuTpOydmCDsi6TsoJwg7YyM7J28IOqyveuhnOulvCDrqqjslYTshJwg67CY7ZmY7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IHVuaGFuZGxlZFBhdGhzID0gKCk6IEFic29sdXRlUGF0aFtdID0+XG4gICAgICBkaWZmVHlwZXMuZmlsdGVyKCh0KSA9PiAhaGFuZGxlZC5oYXModCkpLmZsYXRNYXAoKHQpID0+IGRpZmZHcm91cHNbdF0gPz8gW10pO1xuXG4gICAgLyoqXG4gICAgICogY2hhbmdlTWF0Y2hlcyDtmLjstpzsl5Drj4Qg6rG466as7KeAIOyViuydgCBGaWxlVHlwZeuTpOydtCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IHVuaGFuZGxlZENoYW5nZXNMZWZ0ID0gKCkgPT4gdW5oYW5kbGVkUGF0aHMoKS5sZW5ndGggPiAwO1xuXG4gICAgcmV0dXJuIHsgY2hhbmdlTWF0Y2hlcywgdW5oYW5kbGVkUGF0aHMsIHVuaGFuZGxlZENoYW5nZXNMZWZ0IH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eVBhdGggPSBkaWZmR3JvdXBzLmVudGl0eT8uYXQoMCk7XG4gICAgaWYgKGVudGl0eVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZW50aXR5UGF0aCk7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIO2UhOuhnOygne2KuOyXkCDsg53shLHrkJjslrTslbwg7ZWY64qUIC50cyDtjIzsnbzsnZgg6rK966Gc7J6F64uI64ukLlxuICAgICAgY29uc3QgdHlwZUZpbGVQYXRoID1cbiAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXRoLmpvaW4oXG4gICAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICAgIGBzcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgICAgICkgYXMgQWJzb2x1dGVQYXRoO1xuXG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHR5cGVGaWxlUGF0aCkpKSB7XG4gICAgICAgIC8vICoudHlwZXMudHPqsIAg66eM65Ok7Ja07KeR64uI64ukLlxuICAgICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMoZW50aXR5SWQpO1xuXG4gICAgICAgIC8vIOq3uOqxuCDtg4Dqsp/sl5Ag6rCW64uk65Gs7JqULlxuICAgICAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0eXBlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+qwgCDrp4zrk6TslrTsp5Hri4jri6QuXG4gICAgY29uc3QgZ2VuZXJhdGVkID0gYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTtcblxuICAgIC8vIOuqqOuToCDqsoPrk6TsnYQgdGFyZ2V07JeQIOuztOuCtOyngOuKlCDslYrsirXri4jri6QuXG4gICAgLy8gc29uYW11LmdlbmVyYXRlZC5zc28udHPripQgc2VydmljZS1zaWRlLW9ubHnri4jquYwg67Cw7KCc7ZWp64uI64ukLlxuICAgIC8vIFRPRE8o67OR7KSAKTog7J20IO2VmOuTnOy9lOuTnOulvCDriITqsIAg7ZW06rKwIOyigCDtlbTso7zshLjsmpQuIOydvOuLqOydgCDqsJDri7kg6rCA64ql7ZWY64uIIOuGlOuRkOqyoOyKteuLiOuLpC4uLlxuICAgIGNvbnN0IGRpc3RyaWJ1dGFibGUgPSBnZW5lcmF0ZWQuZmlsdGVyKChwKSA9PiAhcC5lbmRzV2l0aChcIi5zc28udHNcIikpO1xuXG4gICAgLy8g7J207KCcIOuztOuCvCDqsoPrk6Trp4wgdGFyZ2V07JeQIOuztOuCtOyalC5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyhkaXN0cmlidXRhYmxlKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlc1wiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpIHx8IG1vZGVsUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyUXVlcmllcygpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQXV4aWxpYXJ5U3ltYm9sQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IHRzUGF0aHMgPSB1bmlxdWUoWy4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnVuY3Rpb25zID8/IFtdKV0pO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQ29uZmlnQ2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuSE9UID09PSBcInllc1wiKSB7XG4gICAgICBjb25zdCB7IGxvYWRDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9jb25maWdcIik7XG4gICAgICBTb25hbXUuY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhTb25hbXUuYXBpUm9vdFBhdGgpO1xuICAgIH1cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVNvbmFtdURpY3Rpb25hcnlSZWxhdGVkQ2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5KCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVIdHRwVmFsaWRhdG9yUmVsYXRlZENoYW5nZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzKCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEcmlmdHMoZHJpZnRzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkcmlmdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBcIuKaoO+4jyBTb25hbXXqsIAg7J6Q64+ZIOyDneyEse2VnCDtjIzsnbzsl5Ag64yA7ZWcIOuzgOqyveydtCDqsJDsp4DrkJjsl4jsirXri4jri6QuIO2MjOydvOydtCBTb25hbXUgd2F0Y2hlciDsmbjrtoDsl5DshJwg67OA6rK965CcIOqyg+ycvOuhnCDstpTsoJXrkKnri4jri6QuXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBwIG9mIGRyaWZ0cykge1xuICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgICAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIHApfWApKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGNoYWxrLmRpbShcIiAg4oaSIGBwbnBtIHNvbmFtdSBzeW5jIC0tZm9yY2Vg66W8IOq2jOyepe2VqeuLiOuLpC5cIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtO1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHt9IGFzIFJlY29yZDxcbiAgICAgICAgYCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCxcbiAgICAgICAgYm9vbGVhblxuICAgICAgPixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBVWtEO2FBQ1o7cUJBQ2tCO1lBRWxCO3VCQUV3QjtZQUVsQjtrQkFFZ0I7bUJBQ1Y7aUJBQ047b0JBRW9CO29CQUNWO2VBQ3FCO3FCQUNSO3dCQUNOO29CQUNtQzs4QkFFbEI7b0JBQ0U7cUJBRS9CO0NBS3BDLFNBQWIsTUFBb0I7RUFDbEIsT0FBbUIsQ0FBQztFQUNwQixRQUFxQixDQUFDO0VBQ3RCLFNBQXVCLENBQUM7RUFDeEIsNEJBQTZDLElBQUksSUFBSTtFQUNyRCxlQUE2QixJQUFJLGFBQWE7Ozs7OztFQU85QyxNQUFNLE9BQXNCO0dBSTFCLE1BQU1BLHFDQUFtRDtHQUN6RCxNQUFNQyx3Q0FBc0Q7R0FHNUQsTUFBTSxlQUFlLE1BQU0sK0JBQStCO0dBQzFELElBQUksYUFBYSxXQUFXLEdBQUc7SUFDN0IsSUFBSSxNQUFNLEtBQUssK0JBQStCLEdBQzVDLE1BQU0sZUFBZTtJQUV2QixRQUFRLElBQUksTUFBTSxNQUFNLFFBQVEsV0FBVyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3BFO0dBQ0Y7R0FLQSxNQUFNLHdCQUNKLFlBQVk7SUFFVixNQUFNLEtBQUssY0FBYyxZQUFZO0lBQ3JDLE1BQU0sS0FBSywrQkFBK0I7SUFHMUMsTUFBTSxlQUFlO0dBQ3ZCLEdBQ0E7SUFBRSxpQkFBaUI7SUFBVyxhQUFhO0dBQU0sQ0FDbkQ7RUFDRjtFQUVBLE1BQWMsaUNBQW1EO0dBQy9ELE1BQU0sZUFBZSxLQUFLLEtBQ3hCLE9BQU8sYUFDUCxnREFDRjtHQUNBLE1BQU0sU0FBUyxPQUFPLE9B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
404
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwibmFtZXMiOlsiU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVIdHRwVmFsaWRhdG9ycyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWciLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBob3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvaG1yLWhvb2tcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgR2VuZXJhdGVPcHRpb25zLCB0eXBlIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXAsIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgc3luY2VyRmlsZUV4aXN0cywgc3luY2VyRmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0tZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBsb2FkQXBpcywgbG9hZE1vZGVscywgbG9hZFR5cGVzLCBsb2FkV29ya2Zsb3dzIH0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuaW1wb3J0IHsgdHlwZSBMb2FkZWRBcGlzLCB0eXBlIExvYWRlZE1vZGVscywgdHlwZSBMb2FkZWRUeXBlcyB9IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCAqIGFzIFN5bmNlckFjdGlvbnMgZnJvbSBcIi4vc3luY2VyLWFjdGlvbnNcIjtcblxudHlwZSBEaWZmR3JvdXBLZXkgPSBGaWxlVHlwZSB8IFwidW5rbm93blwiO1xudHlwZSBEaWZmR3JvdXBzID0gUGFydGlhbDxSZWNvcmQ8RGlmZkdyb3VwS2V5LCBBYnNvbHV0ZVBhdGhbXT4+O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIGRldiDshJzrsoTqsIAg7LKY7J2MIOuWtOydhCDrlYwsIHNvbmFtdSBzeW5jIO2VoCDrlYwg7Iuk7ZaJ65Cp64uI64ukLiDsnbTtm4Tsl5DripQgaG1yQW5kU3luYyDqsr3roZzrpbwg7YOA7JqULlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDstIjquLAg67aA7Yq47Iqk7Yq4656pISDslpjrhKTrk6TsnYAgaWRlbXBvdGVudO2VmOqzoCDqsIDrs43quLAg65WM66y47JeQIOustOyngOyEsSDsi6TtlontlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIOyWmOuEpOuTpOydgCBzb25hbXUubG9ja+yXkCDrk6TslrTqsIDsp4Drj4Qg7JWK6rOgIOuUsOudvOyEnCBITVIg6rK966Gc66W8IO2DgOyngOuPhCDslYrripQg7Lmc6rWs65Ok7J6F64uI64ukLlxuICAgIC8vIOq3uOuemOyEnCDslYTrrLQg65WM64KYIOq3uOuDpSDrj4zroKTso7zrqbQg65CY64qU642wLCBobXJBbmRTeW5j7JeQ7IScIOunpOuyiCDtlZjripQg6rKD7J2AIOuCreu5hOydtOuLiCDsl6zquLDshJwg7ZWcIOuyiOunjCDtlanri4jri6QuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMoKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cygpO1xuXG4gICAgLy8g67CU64CQIOqyg+ydtCDsl4bsnLzrqbQg6re464OlIOuEmOyWtOqwgOyalC5cbiAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTtcbiAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGF3YWl0IHRoaXMucmVjb25jaWxlSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KCkpIHtcbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyXrOq4sOyEnCDsi6TsoJwg7Iux7YGsIOuPmeyekeydhCDsiJjtlontlanri4jri6QuXG4gICAgLy8g64uk66eMIOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWNvbmNpbGVIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvbmNpbGVIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVnaXN0cnlQYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgXCJzcmMvYXBwbGljYXRpb24vc29uYW11LnZhbGlkYXRvcnMuZ2VuZXJhdGVkLnRzXCIsXG4gICAgKTtcbiAgICBjb25zdCBwb2xpY3kgPSBTb25hbXUuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyO1xuICAgIGNvbnN0IGlzQW90ID0gaXNPYmplY3RWYWx1ZShwb2xpY3kpICYmIHBvbGljeSAhPT0gbnVsbCAmJiBwb2xpY3kuYXBpID09PSBcImFvdFwiO1xuICAgIGlmIChpc0FvdCA9PT0gKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyDrs4Dqsr0g66qp66Gd7J20IHJlZ2lzdHJ5IOyCreygnOulvCDrhpPss5Drj4QgY2hlY2tzdW0g6rCx7IugIOyghOyXkCDsoJXssYXqs7wg7IKw7Lac66y87J2EIOuLpOyLnCDrp57stqXri4jri6QuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICog6rCV7KCcIO2SgC3si7Htgaw6IGxvY2vsnYQg66y07Iuc7ZWY6rOgIOyymOydjOu2gO2EsCDri6Tsi5wg7Iux7YGs7ZWp64uI64ukLlxuICAgKlxuICAgKiAqKuyCrOyaqeyymCoqOiBnaXQgcG9zdC1tZXJnZSBob29rLCBDSSwgZGV2IOyEnOuyhOydmCBgZmAg7ZWr7YKkLlxuICAgKiAqKuyLpO2MqCDslYjsoITshLEqKjog64+E7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73slrQgbG9jayDsl4bripQg7IOB7YOc66GcIOuCqOyVhOuPhCDrrLTtlbQg4oCUIOuLpOydjCBzeW5j7JeQ7IScXG4gICAqIGxvY2sg7JeG7Jy866m0IOyekOyXsOyKpOufveqyjCDtkoAt7Iux7YGs6rCAIO2KuOumrOqxsOuQmOyWtCDsg4ggbG9ja+ydtCDsnpHshLHrkKguXG4gICAqL1xuICBhc3luYyBmb3JjZVN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9ja1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNvbmFtdS5sb2NrXCIpO1xuICAgIGlmIChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKGxvY2tQYXRoKSkge1xuICAgICAgYXdhaXQgc3luY2VyRmlsZXN5c3RlbS51bmxpbmsobG9ja1BhdGgpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIGJhdGNo66GcIOuqqOydgCDrs4Dqsr0g7YyM7J2865Ok7JeQIOuMgO2VtCDtlZwg67KI7J2YIEhNUi9zeW5jIOyCrOydtO2BtOydhCDrj5Xri4jri6QuXG4gICAqXG4gICAqIEhNUuydgCBhcGkvc3JjIOyViOyXkOyEnCDsnbzslrTrgpjripQg66qo65OgIO2MjOydvOuTpOyXkCDrjIDtlbTshJwg7IiY7ZaJ7ZWp64uI64ukLlxuICAgKiBjaGVja3N1bVBhdHRlcm5Hcm91cCDrp6Tsua0g7Jes67aA7JmAIOustOq0gO2VmOqyjCBhcGkvc3JjIOyghOyytCDrjIDsg4HsnoXri4jri6QuXG4gICAqIOqwgOuguSBhcGkvc3JjL3V0aWxzL3N1YnNldC1sb2FkZXJzLnRzIOqwmeydgCDtjIzsnbzrj4Qg67OA6rK965CY66m0IEhNUuydgCDtlbTspI3ri4jri6QuXG4gICAqXG4gICAqIFN5bmPripQgY2hlY2tzdW1QYXR0ZXJuR3JvdXDsnLzroZwg66ek7Lmt65CY64qUIO2MjOydvOuTpOyXkCDrjIDtlbTshJzrp4wg7IiY7ZaJ7ZWp64uI64ukLlxuICAgKiDsl6zquLDsl5DripQgd2ViL3NyY+uCmCBhcHAvc3JjIOqwmeydgCDri6TrpbggdGFyZ2V07J2YIO2MjOydvOydtCDtj6ztlajrkKAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7J2065+wIG5vbi1hcGkg6rK966Gc7J2YIO2MjOydvOuTpOydgCBITVLqs7zripQg7JWE66y0IOyDgeq0gOydtCDsl4bsnLzrr4DroZwsIGludmFsaWRhdGXsnYQg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVFdmVudHMgLSBwYXRoIOKGkiBldmVudCDrp7UuIGV2ZW5064qUIFwiY2hhbmdlXCIgfCBcImFkZFwiLlxuICAgKi9cbiAgYXN5bmMgaG1yQW5kU3luYyhmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBobXJBY3Rpb25SZXF1aXJlZEV2ZW50cyA9IHRoaXMuZXh0cmFjdEhtckFjdGlvblJlcXVpcmVkRmlsZUV2ZW50cyhmaWxlRXZlbnRzKTtcbiAgICBjb25zdCBzeW5jVHJpZ2dlcmluZ1BhdGhzID0gYXdhaXQgdGhpcy5leHRyYWN0U3luY1RyaWdnZXJpbmdGaWxlRXZlbnRQYXRocyhmaWxlRXZlbnRzKTtcblxuICAgIC8vIEhNUiDsmIHsl606IO2MjOydvCDsnbTrsqTtirgg7KSRIGFwaeydmCDrqqjrk4gg6re4656Y7ZSE7JeQIOyeiOuKlCDtjIzsnbzrk6Tsl5Ag64yA7ZWcIOuzgOuPmeydgCBobXJBY3Rpb25SZXF1aXJlZEV2ZW50c+uhnCDsnqHtnpnri4jri6QuXG4gICAgLy8g7J20IOy5nOq1rOuTpOydgCBpbnZhbGlkYXRlIOyymOumrO2VtOykjeuLiOuLpC5cbiAgICAvLyDsnbQg7Zi47Lac7J2AIOyVhOuemCBzeW5j67O064ukIOustOyhsOqxtCDrqLzsoIAg7J287Ja064KY7JW8IO2VqeuLiOuLpCFcbiAgICAvLyDsmZzrg5DtlZjrqbQgc3luY+yXkOyEnOuKlCDrs4Dqsr3rkJwgbW9kZWwg7L2U65Oc66W8IOyDiOuhnCBpbXBvcnTtlbTshJwg7LKY66as7ZW07JW8IO2VmOuKlCDqsr3smrDrj4Qg7J6I6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVEZXBlbmRlbnRzQWZmZWN0ZWRCeUZpbGVFdmVudHMoaG1yQWN0aW9uUmVxdWlyZWRFdmVudHMpO1xuXG4gICAgLy8gU3luYyDsmIHsl606IGNoZWNrc3VtUGF0dGVybkdyb3Vw7JeQIOuqheyLnOuQnCDtjIzsnbzrk6Tsl5Ag64yA7ZWcIOuzgOuPmeydgCBzeW5jVHJpZ2dlcmluZ1BhdGhz66GcIOyeoe2emeuLiOuLpC5cbiAgICAvLyDsnbQg7Lmc6rWs65Ok7J2AIOyggeygiO2VnCBzeW5jIOyekeyXheycvOuhnCDrjIDsnZHtlanri4jri6QuXG4gICAgaWYgKHN5bmNUcmlnZ2VyaW5nUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKHN5bmNUcmlnZ2VyaW5nUGF0aHMpO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64Ks7Jy866m0IOustOyngOyEsSDroZzrk5zrpbwg7IiY7ZaJ7ZWp64uI64ukLlxuICAgIC8vIOyLse2BrOulvCDslYgg7ZWcIOqyveyasOyXkOuPhCDroZzrk5zripQg7ZW07JW8IO2VtOyalC4g7JyE7JeQ7IScIOq0gOugqOyeiOuKlCDsuZzqtazrk6TsnYAg64ukIGludmFsaWRhdGUg65CY7JeI6rGw65Og7JqUIVxuICAgIC8vXG4gICAgLy8g67OA6rK965CcIO2MjOydvOuTpOyXkCDrjIDtlbTshJwg7IOI66Gt6rKMIOuLueqyqOyYpOuKlChsb2FkKSDtlonsnITripQgZG9TeW5jQWN0aW9uc+yXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgIC8vIGRvU3luY0FjdGlvbnPsl5DshJzripQg7YyM7J287J2EIOydveqzoCDrp4zrk5zripQg7Iux7YGsIO2WieychOunjCDtlanri4jri6QuXG4gICAgLy8g6rGw6riw7IScIOuUsSDrs4Dqsr3rkJwg67aA67aE7JeQIOyYge2Wpeuwm+uKlCBhdXRvbG9hZOunjCDshKDrs4TtlbTshJwg7IiY7ZaJ7ZWY66Ck66m0IOuEiOustCDsp4DsoIDrtoTtlZjqs6Ag67O17J6h7ZW07KeR64uI64ukLlxuICAgIC8vXG4gICAgLy8g7Y287Y+s66i87IqkIOyYge2WpeydgCDrrLTsi5ztlbTrj4Qg7KKL7Iq164uI64ukLlxuICAgIC8vIOyWtOywqO2UvCBobXItaG9va+yXkCDsnZjtlbQgaW52YWxpZGF0ZeuQnCDrtoDrtoTrk6TsnbQg7JWE64uI652866m0IOy6kOyLnCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkU3NyUm91dGVzKCk7XG4gICAgYXdhaXQgU29uYW11LnJlZnJlc2hIdHRwVmFsaWRhdG9ycygpO1xuXG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG1yQWN0aW9uUmVxdWlyZWRGaWxlRXZlbnRzKFxuICAgIGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPixcbiAgKTogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+IHtcbiAgICBjb25zdCBhcGlTcmMgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBpZiAoIWZpbGVQYXRoLnN0YXJ0c1dpdGgoYXBpU3JjKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5zZXQoZmlsZVBhdGgsIGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdFN5bmNUcmlnZ2VyaW5nRmlsZUV2ZW50UGF0aHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gICAgY29uc3Qgc3luY1RyaWdnZXJpbmdQYXRoczogQWJzb2x1dGVQYXRoW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGhdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoY2hlY2tQYXR0ZXJuR3JvdXApLnNvbWUoKHBhdHRlcm4pID0+XG4gICAgICAgIG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICAgKTtcbiAgICAgIGlmICghaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc3luY1RyaWdnZXJpbmdQYXRocy5wdXNoKGRpZmZGaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bmNUcmlnZ2VyaW5nUGF0aHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGludmFsaWRhdGVEZXBlbmRlbnRzQWZmZWN0ZWRCeUZpbGVFdmVudHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApIHtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAvLyDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9XG4gICAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKFxuICAgICAgICAgICAgZGlmZkZpbGVQYXRoLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgKSkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgICAgICAgaWYgKGludmFsaWRhdGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBpbnZhbGlkYXRlZFBhdGggb2YgaW52YWxpZGF0ZWRQYXRocykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAgICAgLy8gcmVnaXN0ZXJlZEFwaXPripQg7Ya17Jy866GcIOuLpCDrgqDroKTrsoTrprQg7IiYIOyXhuyKteuLiOuLpC4gcmVnaXN0ZXJlZEFwaXPsl5Ag7Jis65287Jik64qUIOy5nOq1rOuTpOydgCDstIjquLAg66Gc65Oc7IucIOuYkOuKlCBITVLsi5zsl5Drp4wg65Ox66Gd65CY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICAgICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICAgICAgaWYgKHJlbW92ZWRBcGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoYCh3aXRoICR7cmVtb3ZlZEFwaXMubGVuZ3RofSBBUElzKWApLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlbW92ZSBpbnZhbGlkYXRlZCByZWdpc3RlcmVkIEFQSXMgZm9yICR7aW52YWxpZGF0ZWRQYXRofWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkZXZSdW5uZXIg7Zmc7ISx7ZmUIOyLnCwg67OA6rK965CcIOyGjOyKpCDtjIzsnbzsnYQgVml0ZXN0IOuqqOuTiCDqt7jrnpjtlITsl5DshJzrj4Qg66y07Zqo7ZmU7ZWp64uI64ukLlxuICAgICAgLy8gVml0ZeydmCBtb2R1bGVHcmFwaC5pbnZhbGlkYXRlTW9kdWxlKCnsnbQgaW1wb3J0ZXIg67Cp7Zal7Jy866GcIOyerOq3gOyggSBjYXNjYWRl7ZWY66+A66GcLFxuICAgICAgLy8g7IaM7IqkIO2MjOydvCDtlZjrgpjrp4wg66y07Zqo7ZmU7ZWY66m0IOydtOulvCBpbXBvcnTtlZjripQg7YWM7Iqk7Yq4IO2MjOydvOuPhCDsnpDrj5nsnLzroZwg66y07Zqo7ZmU65Cp64uI64ukLlxuICAgICAgaWYgKCFpc1Rlc3QoKSAmJiBTb25hbXUuY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCAmJiBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlcikge1xuICAgICAgICBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlci5pbnZhbGlkYXRlRmlsZXMoW2RpZmZGaWxlUGF0aF0pO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5kaW0oYFRlc3QgaW52YWxpZGF0ZWQ6ICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGRpZmZGaWxlUGF0aCl9YCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICAvLyDshozsiqQg7L2U65Oc66W8IOuLpOujqOuKlCDsg4HtmansnbTri4ggLnRzIOqyveuhnOuhnCDrtIXri4jri6QuXG4gICAgY29uc3QgaXNNb2RlbCA9IGludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKTtcbiAgICBjb25zdCBpc0ZyYW1lID0gaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpO1xuICAgIGlmICghaXNNb2RlbCAmJiAhaXNGcmFtZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdGFyZ2V0TW9kZWxOYW1lID0gYCR7ZW50aXR5SWR9JHtpc01vZGVsID8gXCJNb2RlbFwiIDogXCJGcmFtZVwifWA7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gdGFyZ2V0TW9kZWxOYW1lKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgY29uc3QgaWR4ID0gcmVnaXN0ZXJlZEFwaXMuaW5kZXhPZihhcGkpO1xuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRXb3JrZmxvd3MoKSB7XG4gICAgdGhpcy53b3JrZmxvd3MgPSBhd2FpdCBsb2FkV29ya2Zsb3dzKCk7XG4gICAgYXdhaXQgU29uYW11LndvcmtmbG93cy5zeW5jaHJvbml6ZSh0aGlzLndvcmtmbG93cyk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFNzclJvdXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzc3JDb25maWdQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvc3NyXCIpO1xuXG4gICAgLy8g6riw7KG0IHJvdXRlcyDstIjquLDtmZRcbiAgICBjb25zdCB7IGNsZWFyU1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgY2xlYXJTU1JSb3V0ZXMoKTtcblxuICAgIC8vIHNzciDtj7TrjZQg7JeG7Jy866m0IOyKpO2CtVxuICAgIGlmICghKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoc3NyQ29uZmlnUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3NyIO2PtOuNlCDslYjsnZgg66qo65OgIC50cyDtjIzsnbwg66Gc65OcXG4gICAgY29uc3QgeyBnbG9iQXN5bmMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgaW1wb3J0TWVtYmVycyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZXNtLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgcnVudGltZVBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIik7XG5cbiAgICAvLyBydW50aW1lUGF0aOulvCDsgqzsmqntlZjsl6wg6rCc67CcL+2UhOuhnOuNleyFmCDtmZjqsr3sl5Ag66ee64qUIO2ZleyepeyekCDsspjrpqxcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhwYXRoLmpvaW4oc3NyQ29uZmlnUGF0aCwgcnVudGltZVBhdGgoXCIqKi8qLnRzXCIpKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZWY66m0IO2MjOydvOydmCBzaWRlIGVmZmVjdChyZWdpc3RlclNTUiDtmLjstpwp6rCAIOyLpO2WieuQqFxuICAgICAgICBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTU1Igcm91dGU6ICR7ZmlsZX1gLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IEZpbGVUeXBlW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID1cbiAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gT2JqZWN0LmtleXMoXG4gICAgICAgIGRpZmZHcm91cHMsXG4gICAgICApIGFzIEZpbGVUeXBlW107XG5cbiAgICAvLyDsl6zquLDripQg67OE66GcIOykkeyalO2VnCDtjIztirjripQg7JWE64uZ64uI64ukLlxuICAgIC8vIOyVhOuemOydmCBpZiDsoITqsJzrpbwg6rmU64GU7ZWY6rKMIO2VmOugpOqzoCDrp4zrk6AgRFNMIOqwmeydgCDqsbDrnbzshJwsIOustOyLnO2VmOyFlOuPhCDrkKnri4jri6QuXG4gICAgY29uc3QgeyBjaGFuZ2VNYXRjaGVzLCB1bmhhbmRsZWRQYXRocywgdW5oYW5kbGVkQ2hhbmdlc0xlZnQgfSA9IHRoaXMuY2hhbmdlTWF0Y2hlcihcbiAgICAgIGRpZmZUeXBlcyxcbiAgICAgIGRpZmZHcm91cHMsXG4gICAgKTtcblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiZW50aXR5XCIsIFwidHlwZXNcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwibW9kZWxcIiwgXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJ0eXBlc1wiLCBcImZ1bmN0aW9uc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVBdXhpbGlhcnlTeW1ib2xDaGFuZ2VzKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUNvbmZpZ0NoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcIndvcmtmbG93XCIpKSB7XG4gICAgICAvLyDrrZAg65Sx7Z6IIOyViCDtlbTsmpQuIOq3uOuemOuPhCDsnbQgaWYg7KGw6rG07J2AIGV2YWzrkJjslrTslbwg7ZWY6riwIOuVjOusuOyXkCDrgqjqsqjrkaHri4jri6Qg44WO44WOXG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJpMThuXCIsIFwiZW50aXR5XCIgLyrroIjsnbTruJQqLywgXCJjb25maWdcIiAvKmRlZmF1bHRMb2NhbGXrk7EqLykpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU29uYW11RGljdGlvbmFyeVJlbGF0ZWRDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJlbnRpdHlcIiwgXCJ0eXBlc1wiLCBcIm1vZGVsXCIsIFwiZnJhbWVcIiwgXCJjb25maWdcIiwgXCJodHRwVmFsaWRhdG9yc0dlbmVyYXRlZFwiKSkge1xuICAgICAgLy8g7IOd7ISx66y8KGh0dHBWYWxpZGF0b3JzR2VuZXJhdGVkKeyXkCDrk5zrpqztlITtirjqsIAg7IOd6ri0IOqyveyasOuPhCDsspjrpqztlanri4jri6QuXG4gICAgICAvLyDri6Trpbgg6rKDIOyViCDrsJTrgIzqs6Ag65SxIGh0dHBWYWxpZGF0b3JzR2VuZXJhdGVk66eMIOuwlOuAkCDqsr3smrDsl5Drj4Qg64+Z65Ox7ZWcIOyymOumrCg966y07KeA7ISxIOyYpO2GoOuhnOuTnCnrpbwg7ZWp64uI64ukLiDqt7jrg6Ug7J2067uQ7ISc7JqUIOOFi1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVIdHRwVmFsaWRhdG9yUmVsYXRlZENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvLyDsnITsl5DshJwg7LKY66asIOyViCDrkJwg67OA6rK965Ok7J20IOyeiOuLpD9cbiAgICAvLyDssrTtgazshKwg6rSA66asIOuMgOyDgeydtOq4tCDtlZzrjbAg7JyE7JeQ7IScIO2VuOuTpOungeydtCDslYgg65CcIOqyg+ydtOudvOuptCDqsrDqta0g7IOd7ISx66y87J6F64uI64ukLlxuICAgIC8vIOydtCDsuZzqtazrk6TsnbQg67OA6rK965CcIOqyg+ydgCBkcmlmdOuhnCDqsITso7ztlbTrj4Qg66eI65WF7ZWp64uI64ukLlxuICAgIGlmICh1bmhhbmRsZWRDaGFuZ2VzTGVmdCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZURyaWZ0cyh1bmhhbmRsZWRQYXRocygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pIHtcbiAgICBjb25zdCBwYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cCgpO1xuICAgIGNvbnN0IGZpbGVUeXBlcyA9XG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICBwYXR0ZXJuR3JvdXAsXG4gICAgICApIGFzIEZpbGVUeXBlW107XG5cbiAgICBjb25zdCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzID0ge307XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBkaWZmRmlsZXMpIHtcbiAgICAgIC8vIOygiOuMgCDqsr3roZzrpbwgYXBwUm9vdCDquLDspIAg7IOB64yAIOqyveuhnOuhnCDrsJTqv5Qg7LK07YGs7ISsIO2MqO2EtOqzvCDruYTqtZDtlZzri6QuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlVHlwZXMuZmluZCgoY2FuZGlkYXRlKSA9PlxuICAgICAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBwYXR0ZXJuR3JvdXBbY2FuZGlkYXRlXSksXG4gICAgICApO1xuICAgICAgY29uc3QgZ3JvdXBLZXk6IERpZmZHcm91cEtleSA9IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi5cIilcbiAgICAgICAgPyBcInVua25vd25cIlxuICAgICAgICA6IChmaWxlVHlwZSA/PyBcInVua25vd25cIik7XG4gICAgICAoZGlmZkdyb3Vwc1tncm91cEtleV0gPz89IFtdKS5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmZHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZU1hdGNoZXIoZGlmZlR5cGVzOiBGaWxlVHlwZVtdLCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKSB7XG4gICAgY29uc3QgaGFuZGxlZCA9IG5ldyBTZXQ8RmlsZVR5cGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiDrs4Dqsr0g7IKs7ZWt7J20IOyduOyekOuhnCDrsJvsnYAgRmlsZVR5cGXrk6Qg7KSRIO2VmOuCmCDsnbTsg4HsnYQg7Y+s7ZWo7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICAgKiDqsIDroLkgW1wiZW50aXR5XCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImVudGl0eVwiKeuKlCB0cnll66W8IOuwmO2ZmO2VmOupsCxcbiAgICAgKiBbXCJ0eXBlc1wiLCBcImkxOG5cIl3snbQg67OA6rK965CcIO2YuOy2nOyXkOyEnCBjaGFuZ2VNYXRjaGVzKFwidHlwZXNcIiwgXCJmdW5jdGlvbnNcIinrj4QgdHJ1ZeulvCDrsJjtmZjtlZjsp4Drp4wsXG4gICAgICogW1wiZnVuY3Rpb25zXCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImZyYW1lXCIp7J2AIGZhbHNl66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiBAcGFyYW0gdHlwZXNcbiAgICAgKi9cbiAgICBjb25zdCBjaGFuZ2VNYXRjaGVzID0gKC4uLnR5cGVzOiBGaWxlVHlwZVtdKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IHR5cGVzLmZpbHRlcigodCkgPT4gZGlmZlR5cGVzLmluY2x1ZGVzKHQpKTtcbiAgICAgIG1hdGNoaW5nLmZvckVhY2goKHQpID0+IGhhbmRsZWQuYWRkKHQpKTtcbiAgICAgIHJldHVybiBtYXRjaGluZy5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiDslrTrlqQgY2hhbmdlTWF0Y2hlcyDtmLjstpzsl5Drj4Qg6rG466as7KeAIOyViuydgCBGaWxlVHlwZeuTpOydmCDsi6TsoJwg7YyM7J28IOqyveuhnOulvCDrqqjslYTshJwg67CY7ZmY7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IHVuaGFuZGxlZFBhdGhzID0gKCk6IEFic29sdXRlUGF0aFtdID0+XG4gICAgICBkaWZmVHlwZXMuZmlsdGVyKCh0KSA9PiAhaGFuZGxlZC5oYXModCkpLmZsYXRNYXAoKHQpID0+IGRpZmZHcm91cHNbdF0gPz8gW10pO1xuXG4gICAgLyoqXG4gICAgICogY2hhbmdlTWF0Y2hlcyDtmLjstpzsl5Drj4Qg6rG466as7KeAIOyViuydgCBGaWxlVHlwZeuTpOydtCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IHVuaGFuZGxlZENoYW5nZXNMZWZ0ID0gKCkgPT4gdW5oYW5kbGVkUGF0aHMoKS5sZW5ndGggPiAwO1xuXG4gICAgcmV0dXJuIHsgY2hhbmdlTWF0Y2hlcywgdW5oYW5kbGVkUGF0aHMsIHVuaGFuZGxlZENoYW5nZXNMZWZ0IH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eVBhdGggPSBkaWZmR3JvdXBzLmVudGl0eT8uYXQoMCk7XG4gICAgaWYgKGVudGl0eVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZW50aXR5UGF0aCk7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIO2UhOuhnOygne2KuOyXkCDsg53shLHrkJjslrTslbwg7ZWY64qUIC50cyDtjIzsnbzsnZgg6rK966Gc7J6F64uI64ukLlxuICAgICAgY29uc3QgdHlwZUZpbGVQYXRoID1cbiAgICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXRoLmpvaW4oXG4gICAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICAgIGBzcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgICAgICkgYXMgQWJzb2x1dGVQYXRoO1xuXG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHR5cGVGaWxlUGF0aCkpKSB7XG4gICAgICAgIC8vICoudHlwZXMudHPqsIAg66eM65Ok7Ja07KeR64uI64ukLlxuICAgICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMoZW50aXR5SWQpO1xuXG4gICAgICAgIC8vIOq3uOqxuCDtg4Dqsp/sl5Ag6rCW64uk65Gs7JqULlxuICAgICAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0eXBlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+qwgCDrp4zrk6TslrTsp5Hri4jri6QuXG4gICAgY29uc3QgZ2VuZXJhdGVkID0gYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTtcblxuICAgIC8vIOuqqOuToCDqsoPrk6TsnYQgdGFyZ2V07JeQIOuztOuCtOyngOuKlCDslYrsirXri4jri6QuXG4gICAgLy8gc29uYW11LmdlbmVyYXRlZC5zc28udHPripQgc2VydmljZS1zaWRlLW9ubHnri4jquYwg67Cw7KCc7ZWp64uI64ukLlxuICAgIC8vIFRPRE8o67OR7KSAKTog7J20IO2VmOuTnOy9lOuTnOulvCDriITqsIAg7ZW06rKwIOyigCDtlbTso7zshLjsmpQuIOydvOuLqOydgCDqsJDri7kg6rCA64ql7ZWY64uIIOuGlOuRkOqyoOyKteuLiOuLpC4uLlxuICAgIGNvbnN0IGRpc3RyaWJ1dGFibGUgPSBnZW5lcmF0ZWQuZmlsdGVyKChwKSA9PiAhcC5lbmRzV2l0aChcIi5zc28udHNcIikpO1xuXG4gICAgLy8g7J207KCcIOuztOuCvCDqsoPrk6Trp4wgdGFyZ2V07JeQIOuztOuCtOyalC5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyhkaXN0cmlidXRhYmxlKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlc1wiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpIHx8IG1vZGVsUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyUXVlcmllcygpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQXV4aWxpYXJ5U3ltYm9sQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IHRzUGF0aHMgPSB1bmlxdWUoWy4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnVuY3Rpb25zID8/IFtdKV0pO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQ29uZmlnQ2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuSE9UID09PSBcInllc1wiKSB7XG4gICAgICBjb25zdCB7IGxvYWRDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9jb25maWdcIik7XG4gICAgICBTb25hbXUuY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhTb25hbXUuYXBpUm9vdFBhdGgpO1xuICAgIH1cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVNvbmFtdURpY3Rpb25hcnlSZWxhdGVkQ2hhbmdlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5KCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVIdHRwVmFsaWRhdG9yUmVsYXRlZENoYW5nZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzKCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEcmlmdHMoZHJpZnRzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkcmlmdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBcIuKaoO+4jyBTb25hbXXqsIAg7J6Q64+ZIOyDneyEse2VnCDtjIzsnbzsl5Ag64yA7ZWcIOuzgOqyveydtCDqsJDsp4DrkJjsl4jsirXri4jri6QuIO2MjOydvOydtCBTb25hbXUgd2F0Y2hlciDsmbjrtoDsl5DshJwg67OA6rK965CcIOqyg+ycvOuhnCDstpTsoJXrkKnri4jri6QuXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgZm9yIChjb25zdCBwIG9mIGRyaWZ0cykge1xuICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgICAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIHApfWApKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGNoYWxrLmRpbShcIiAg4oaSIGBwbnBtIHNvbmFtdSBzeW5jIC0tZm9yY2Vg66W8IOq2jOyepe2VqeuLiOuLpC5cIikpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtO1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHt9IGFzIFJlY29yZDxcbiAgICAgICAgYCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCxcbiAgICAgICAgYm9vbGVhblxuICAgICAgPixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FVa0QsZ0JBQUE7Q0FDWixZQUFBO0NBQ2tCLG9CQUFBO0NBRWxCLFdBQUE7Q0FFd0Isc0JBQUE7Q0FFbEIsV0FBQTtDQUVnQixpQkFBQTtDQUNWLGtCQUFBO0NBQ04sZ0JBQUE7Q0FFb0IsbUJBQUE7Q0FDVixtQkFBQTtDQUNxQixjQUFBO0NBQ1Isb0JBQUE7Q0FDTix1QkFBQTtDQUNtQyxtQkFBQTtDQUVsQiw2QkFBQTtDQUNFLG1CQUFBO0NBRS9CLG9CQUFBO0NBS3BDLFNBQWIsTUFBb0I7RUFDbEIsT0FBbUIsQ0FBQztFQUNwQixRQUFxQixDQUFDO0VBQ3RCLFNBQXVCLENBQUM7RUFDeEIsNEJBQTZDLElBQUksSUFBSTtFQUNyRCxlQUE2QixJQUFJLGFBQWE7Ozs7OztFQU85QyxNQUFNLE9BQXNCO0dBSTFCLE1BQU1BLHFDQUFtRDtHQUN6RCxNQUFNQyx3Q0FBc0Q7R0FHNUQsTUFBTSxlQUFlLE1BQU0sK0JBQStCO0dBQzFELElBQUksYUFBYSxXQUFXLEdBQUc7SUFDN0IsSUFBSSxNQUFNLEtBQUssK0JBQStCLEdBQzVDLE1BQU0sZUFBZTtJQUV2QixRQUFRLElBQUksTUFBTSxNQUFNLFFBQVEsV0FBVyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3BFO0dBQ0Y7R0FLQSxNQUFNLHdCQUNKLFlBQVk7SUFFVixNQUFNLEtBQUssY0FBYyxZQUFZO0lBQ3JDLE1BQU0sS0FBSywrQkFBK0I7SUFHMUMsTUFBTSxlQUFlO0dBQ3ZCLEdBQ0E7SUFBRSxpQkFBaUI7SUFBVyxhQUFhO0dBQU0sQ0FD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
@@ -9,7 +9,7 @@ import path from "path";
9
9
  import chalk from "chalk";
10
10
  import { minimatch } from "minimatch";
11
11
  import { watch } from "chokidar";
12
- //#region src/syncer/watcher.ts
12
+ // src/syncer/watcher.ts
13
13
  /**
14
14
  * Watcher를 설정합니다.
15
15
  * 이 친구는 진짜로 syncer가 받아야 할 변경 이벤트들만 추려서 batch로 전달해줍니다.
@@ -79,7 +79,6 @@ function isOutOfScope(filePath) {
79
79
  const checkPatternGroup = getChecksumPatternGroupInAbsolutePath();
80
80
  return !Object.values(checkPatternGroup).some((pattern) => minimatch(filePath, pattern));
81
81
  }
82
- //#endregion
83
82
  __esmMin((() => {
84
83
  init_api();
85
84
  init_event_batcher();
@@ -88,4 +87,4 @@ __esmMin((() => {
88
87
  }))();
89
88
  export { setupWatcher };
90
89
 
91
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL3dhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHR5cGUgU3RhdHMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBGU1dhdGNoZXIsIHdhdGNoIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tIFwibWluaW1hdGNoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVFdmVudEJhdGNoZXIgfSBmcm9tIFwiLi9ldmVudC1iYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgaXNMYXN0Q2hhbmdlZEJ5TWUgfSBmcm9tIFwiLi9maWxlLXRyYWNraW5nXCI7XG5cbi8qKlxuICogV2F0Y2hlcuulvCDshKTsoJXtlanri4jri6QuXG4gKiDsnbQg7Lmc6rWs64qUIOynhOynnOuhnCBzeW5jZXLqsIAg67Cb7JWE7JW8IO2VoCDrs4Dqsr0g7J2067Kk7Yq465Ok66eMIOy2lOugpOyEnCBiYXRjaOuhnCDsoITri6ztlbTspI3ri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFdhdGNoZXIoXG4gIG9uRmlsZUV2ZW50czogKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPikgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8RlNXYXRjaGVyPiB7XG4gIC8vIGFwaSDrs7jsnbjrv5Ag7JWE64uI6528IHN5bmMgdGFyZ2V065Ok7J2YIHNyY+uPhCDrtIXri4jri6QuXG4gIC8vIHRhcmdldCDsgrDstpzrrLwoc29uYW11LmdlbmVyYXRlZCwgc2VydmljZXMuZ2VuZXJhdGVkLCBpMThuIGNvcHkg65OxKeydtCDsmbjrtoDsl5DshJxcbiAgLy8g67OA6rK965CY64qUIOqyveyasOulvCBkcmlmdOuhnCDsnqHslYQg7JuM64ud7J2EIOudhOyasOq4sCDsnITtlajsnoXri4jri6QuXG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaChhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSwge1xuICAgIGlnbm9yZWQ6IGlnbm9yZUlmRXh0ZW5zaW9uSXNOb3RPbmVPZihcIi50c1wiLCBcIi5qc29uXCIsIFwiLmh0dHBcIiksXG4gICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICB9KTtcblxuICAvLyAxMDBtcyDslYjsl5Ag65Ok7Ja07JioIOuzgOqyveuTpOydhCDtlZwgYmF0Y2jroZwg66qo7JWEIO2VnCDsgqzsnbTtgbTroZwg7LKY66as7ZWp64uI64ukLlxuICBjb25zdCBwdXNoRmlsZUV2ZW50ID0gY3JlYXRlRmlsZUV2ZW50QmF0Y2hlcjxcImNoYW5nZVwiIHwgXCJhZGRcIj4oe1xuICAgIGRlbGF5TXM6IDEwMCxcbiAgICBvbkZsdXNoOiBhc3luYyAoZmlsZUV2ZW50cykgPT4ge1xuICAgICAgY29uc3QgcmVhbENoYW5nZXMgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgICBmb3IgKGNvbnN0IFtwLCBlXSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAgIC8vIHNlbGYtd3JpdGUgZWNob+uKlCBmbHVzaCDsi5zsoJDsl5Ag6rGw66aF64uI64ukLlxuICAgICAgICAvLyB3YXRjaGVyLm9u7JeQ7IScIOymieyLnCDqsbDrpbTrqbQg64SI66y0IOydtOumheuLiOuLpC5cbiAgICAgICAgLy8g7Jes6riw7JeQ7ISc64qUIO2MjOydvOydtCDrlJTsiqTtgazsl5Ag7JOw7J206rOgIOuCmOyEnCDslb3qsITsnZgg65Sc66CI7J206rCAIOyeiOq4sCDrlYzrrLjsl5BcbiAgICAgICAgLy8gXCLrlJTsiqTtgazsl5Ag7I287KeA66eMIOyVhOyngSB0cmFja1dyaXR0ZW7snbQg7JmE66OM65CY6riwIOyghCDsg4Htg5xcIiDqsJnsnYAg66y47KCc6rCAIOyCrOudvOynkeuLiOuLpC5cbiAgICAgICAgaWYgKCEoYXdhaXQgaXNMYXN0Q2hhbmdlZEJ5TWUocCkpKSB7XG4gICAgICAgICAgcmVhbENoYW5nZXMuc2V0KHAsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVhbENoYW5nZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgYXdhaXQgb25GaWxlRXZlbnRzKHJlYWxDaGFuZ2VzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICB3YXRjaGVyLm9uKFwiYWxsXCIsIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID1cbiAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgIGFzc2VydChcbiAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFNvbmFtdS5hcHBSb290UGF0aCksXG4gICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBhcHAgcm9vdCBwYXRoXCIsXG4gICAgKTtcblxuICAgIGlmICghaXNXYW50ZWRFdmVudChldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNDb25maWdDaGFuZ2UoYWJzb2x1dGVQYXRoKSkge1xuICAgICAgdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50LCBmaWxlUGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT3V0T2ZTY29wZShhYnNvbHV0ZVBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7Jes6riw6rmM7KeAIOyZlOuLpOuptCBzeW5jZXLqsIAg7KeE7Kec66GcIOyymOumrO2VtOyVvCDtlaAg67OA6rK97IKs7ZWt7J2065286rOgIOuztOuptCDrkKnri4jri6QuXG4gICAgLy8g7J20IO2YuOy2nOydgCDsnbTrsqTtirjrpbwgYmF0Y2hlcuyXkCDsjJPsirXri4jri6QuXG4gICAgLy8g7J207ZuEIOuVjOqwgCDrkJjrqbQg7J2066CH6rKMIOyMk+yduCDsnbTrsqTtirjrpbwg65Ok6rOgIG9uRmlsZUV2ZW50cyDsvZzrsLHsnbQg7Zi47Lac65Cp64uI64ukLlxuICAgIHB1c2hGaWxlRXZlbnQoYWJzb2x1dGVQYXRoLCBldmVudCk7XG4gIH0pO1xuXG4gIHJldHVybiB3YXRjaGVyO1xufVxuXG5mdW5jdGlvbiBhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSB7XG4gIHJldHVybiBbXG4gICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiksXG4gICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKCh0KSA9PiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0LCBcInNyY1wiKSksXG4gIF07XG59XG5cbi8qKlxuICogY2hva2lkYXLsnZggYGlnbm9yZWRgIOyYteyFmOyXkCDrsJXripQg7Zes7Y28LlxuICog7KO87Ja07KeEIO2ZleyepeyekOqwgCAq7JWE64uMKiDtjIzsnbzsnYAg66y07Iuc7ZWp64uI64ukIOKAlCDspokg7KO87Ja07KeEIO2ZleyepeyekOunjCB3YXRjaCDrjIDsg4EuXG4gKlxuICogY2hva2lkYXIgYGlnbm9yZWRg64qUIGB0cnVlYOulvCDrsJjtmZjtlZjrqbQg7ZW064u5IOqyveuhnOulvCDrrLTsi5ztlanri4jri6QuXG4gKiDrlLDrnbzshJwgXCLsnbQg7ZmV7J6l7J6Q66eMIO2XiOyaqVwi7J2EIO2RnO2YhO2VmOugpOuptCAq64uk66W4IO2ZleyepeyekOyXkCDrjIDtlbQgdHJ1ZSrrpbwg67CY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaWdub3JlSWZFeHRlbnNpb25Jc05vdE9uZU9mKC4uLmFsbG93ZWRFeHRlbnNpb25zOiBgLiR7c3RyaW5nfWBbXSkge1xuICBjb25zdCBpc0FsbG93ZWQgPSAoZXh0OiBzdHJpbmcpID0+XG4gICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBhbGxvd2VkRXh0ZW5zaW9ucyBhcyBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoZXh0KTtcblxuICByZXR1cm4gKHA6IHN0cmluZywgc3RhdHM/OiBTdGF0cykgPT4gISFzdGF0cz8uaXNGaWxlKCkgJiYgIWlzQWxsb3dlZChwYXRoLmV4dG5hbWUocCkpO1xufVxuXG5mdW5jdGlvbiBpc1dhbnRlZEV2ZW50KGV2ZW50OiBzdHJpbmcpOiBldmVudCBpcyBcImNoYW5nZVwiIHwgXCJhZGRcIiB7XG4gIHJldHVybiBldmVudCA9PT0gXCJjaGFuZ2VcIiB8fCBldmVudCA9PT0gXCJhZGRcIjtcbn1cblxuZnVuY3Rpb24gaXNDb25maWdDaGFuZ2UoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGggPT09IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbn1cblxuZnVuY3Rpb24gdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGgucmVwbGFjZShTb25hbXUuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSk7XG4gIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xufVxuXG4vKipcbiAqIOyKpOy9lO2UhCDsoJXsnZg6XG4gKiAtIGFwaS9zcmMg7JWI7J2YIOuqqOuToCDrs4Dqsr3snYAg7Iqk7L2U7ZSEIOyViCAoSE1SIOuMgOyDgeydtCDrkKAg7IiYIOyeiOycvOuvgOuhnClcbiAqIC0gYXBpL3NyYyDrsJbsnbTrnbzrqbQgY2hlY2tzdW1QYXR0ZXJuR3JvdXAg7Yyo7YS07JeQIOunpOy5reuQmOuKlCDqsr3roZzrp4wg7Iqk7L2U7ZSEIOyViFxuICpcbiAqIOq3uCDsmbgo7JiIOiB3ZWIvc3JjL0FwcC50c3gg6rCZ7J2AIHRhcmdldOydmCDruYTstpTsoIEg7YyM7J28KeuKlCDsiqTsvZTtlIQg67CW7J206528IOustOyLnO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaXNPdXRPZlNjb3BlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBib29sZWFuIHtcbiAgY29uc3QgYXBpU3JjID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIik7XG4gIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKGFwaVNyYykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gIHJldHVybiAhT2JqZWN0LnZhbHVlcyhjaGVja1BhdHRlcm5Hcm91cCkuc29tZSgocGF0dGVybikgPT4gbWluaW1hdGNoKGZpbGVQYXRoLCBwYXR0ZXJuKSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsZUFBc0IsYUFDcEIsY0FDb0I7Q0FJcEIsTUFBTSxVQUFVLE1BQU0sc0JBQXNCLEdBQUc7RUFDN0MsU0FBUyw0QkFBNEIsT0FBTyxTQUFTLE9BQU87RUFDNUQsWUFBWTtFQUNaLGVBQWU7Q0FDakIsQ0FBQztDQUdELE1BQU0sZ0JBQWdCLHVCQUF5QztFQUM3RCxTQUFTO0VBQ1QsU0FBUyxPQUFPLGVBQWU7R0FDN0IsTUFBTSw4QkFBYyxJQUFJLElBQW9DO0dBQzVELEtBQUssTUFBTSxDQUFDLEdBQUcsTUFBTSxZQUtuQixJQUFJLENBQUUsTUFBTSxrQkFBa0IsQ0FBQyxHQUM3QixZQUFZLElBQUksR0FBRyxDQUFDO0dBR3hCLElBQUksWUFBWSxPQUFPLEdBQ3JCLE1BQU0sYUFBYSxXQUFXO0VBRWxDO0NBQ0YsQ0FBQztDQUVELFFBQVEsR0FBRyxRQUFRLE9BQWUsYUFBcUI7RUFDckQsTUFBTSxlQUN1RDtFQUM3RCxPQUNFLGFBQWEsV0FBVyxPQUFPLFdBQVcsR0FDMUMsMkNBQ0Y7RUFFQSxJQUFJLENBQUMsY0FBYyxLQUFLLEdBQ3RCO0VBR0YsSUFBSSxlQUFlLFlBQVksR0FBRztHQUNoQyxtQkFBbUIsT0FBTyxRQUFRO0dBQ2xDO0VBQ0Y7RUFFQSxJQUFJLGFBQWEsWUFBWSxHQUMzQjtFQU1GLGNBQWMsY0FBYyxLQUFLO0NBQ25DLENBQUM7Q0FFRCxPQUFPO0FBQ1Q7QUFFQSxTQUFTLHdCQUF3QjtDQUMvQixPQUFPLENBQ0wsS0FBSyxLQUFLLE9BQU8sYUFBYSxLQUFLLEdBQ25DLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxLQUFLLE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUNsRjtBQUNGOzs7Ozs7OztBQVNBLFNBQVMsNEJBQTRCLEdBQUcsbUJBQW1DO0NBQ3pFLE1BQU0sYUFBYSxRQUVmLGtCQUNBLFNBQVMsR0FBRztDQUVoQixRQUFRLEdBQVcsVUFBa0IsQ0FBQyxDQUFDLE9BQU8sT0FBTyxLQUFLLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ3RGO0FBRUEsU0FBUyxjQUFjLE9BQTBDO0NBQy9ELE9BQU8sVUFBVSxZQUFZLFVBQVU7QUFDekM7QUFFQSxTQUFTLGVBQWUsVUFBaUM7Q0FDdkQsT0FBTyxhQUFhLEtBQUssS0FBSyxPQUFPLGFBQWEsT0FBTyxrQkFBa0I7QUFDN0U7QUFFQSxTQUFTLG1CQUFtQixPQUFlLFVBQXdCO0NBQ2pFLE1BQU0sZUFBZSxTQUFTLFFBQVEsT0FBTyxhQUFhLEtBQUs7Q0FDL0QsUUFBUSxJQUFJLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxNQUFNLEtBQUssWUFBWSxFQUFFLGlCQUFpQixDQUFDO0NBQ3pGLFFBQVEsS0FBSyxRQUFRLEtBQUssU0FBUztBQUNyQzs7Ozs7Ozs7QUFTQSxTQUFTLGFBQWEsVUFBaUM7Q0FDckQsTUFBTSxTQUFTLEtBQUssS0FBSyxPQUFPLGFBQWEsS0FBSztDQUNsRCxJQUFJLFNBQVMsV0FBVyxNQUFNLEdBQzVCLE9BQU87Q0FFVCxNQUFNLG9CQUFvQixzQ0FBc0M7Q0FDaEUsT0FBTyxDQUFDLE9BQU8sT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sWUFBWSxVQUFVLFVBQVUsT0FBTyxDQUFDO0FBQ3pGOzs7VUEzSCtCO29CQUV5QjtvQkFDZTtvQkFDcEIifQ==
90
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL3dhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHR5cGUgU3RhdHMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBGU1dhdGNoZXIsIHdhdGNoIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tIFwibWluaW1hdGNoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVFdmVudEJhdGNoZXIgfSBmcm9tIFwiLi9ldmVudC1iYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgaXNMYXN0Q2hhbmdlZEJ5TWUgfSBmcm9tIFwiLi9maWxlLXRyYWNraW5nXCI7XG5cbi8qKlxuICogV2F0Y2hlcuulvCDshKTsoJXtlanri4jri6QuXG4gKiDsnbQg7Lmc6rWs64qUIOynhOynnOuhnCBzeW5jZXLqsIAg67Cb7JWE7JW8IO2VoCDrs4Dqsr0g7J2067Kk7Yq465Ok66eMIOy2lOugpOyEnCBiYXRjaOuhnCDsoITri6ztlbTspI3ri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFdhdGNoZXIoXG4gIG9uRmlsZUV2ZW50czogKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPikgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8RlNXYXRjaGVyPiB7XG4gIC8vIGFwaSDrs7jsnbjrv5Ag7JWE64uI6528IHN5bmMgdGFyZ2V065Ok7J2YIHNyY+uPhCDrtIXri4jri6QuXG4gIC8vIHRhcmdldCDsgrDstpzrrLwoc29uYW11LmdlbmVyYXRlZCwgc2VydmljZXMuZ2VuZXJhdGVkLCBpMThuIGNvcHkg65OxKeydtCDsmbjrtoDsl5DshJxcbiAgLy8g67OA6rK965CY64qUIOqyveyasOulvCBkcmlmdOuhnCDsnqHslYQg7JuM64ud7J2EIOudhOyasOq4sCDsnITtlajsnoXri4jri6QuXG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaChhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSwge1xuICAgIGlnbm9yZWQ6IGlnbm9yZUlmRXh0ZW5zaW9uSXNOb3RPbmVPZihcIi50c1wiLCBcIi5qc29uXCIsIFwiLmh0dHBcIiksXG4gICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICB9KTtcblxuICAvLyAxMDBtcyDslYjsl5Ag65Ok7Ja07JioIOuzgOqyveuTpOydhCDtlZwgYmF0Y2jroZwg66qo7JWEIO2VnCDsgqzsnbTtgbTroZwg7LKY66as7ZWp64uI64ukLlxuICBjb25zdCBwdXNoRmlsZUV2ZW50ID0gY3JlYXRlRmlsZUV2ZW50QmF0Y2hlcjxcImNoYW5nZVwiIHwgXCJhZGRcIj4oe1xuICAgIGRlbGF5TXM6IDEwMCxcbiAgICBvbkZsdXNoOiBhc3luYyAoZmlsZUV2ZW50cykgPT4ge1xuICAgICAgY29uc3QgcmVhbENoYW5nZXMgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgICBmb3IgKGNvbnN0IFtwLCBlXSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAgIC8vIHNlbGYtd3JpdGUgZWNob+uKlCBmbHVzaCDsi5zsoJDsl5Ag6rGw66aF64uI64ukLlxuICAgICAgICAvLyB3YXRjaGVyLm9u7JeQ7IScIOymieyLnCDqsbDrpbTrqbQg64SI66y0IOydtOumheuLiOuLpC5cbiAgICAgICAgLy8g7Jes6riw7JeQ7ISc64qUIO2MjOydvOydtCDrlJTsiqTtgazsl5Ag7JOw7J206rOgIOuCmOyEnCDslb3qsITsnZgg65Sc66CI7J206rCAIOyeiOq4sCDrlYzrrLjsl5BcbiAgICAgICAgLy8gXCLrlJTsiqTtgazsl5Ag7I287KeA66eMIOyVhOyngSB0cmFja1dyaXR0ZW7snbQg7JmE66OM65CY6riwIOyghCDsg4Htg5xcIiDqsJnsnYAg66y47KCc6rCAIOyCrOudvOynkeuLiOuLpC5cbiAgICAgICAgaWYgKCEoYXdhaXQgaXNMYXN0Q2hhbmdlZEJ5TWUocCkpKSB7XG4gICAgICAgICAgcmVhbENoYW5nZXMuc2V0KHAsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVhbENoYW5nZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgYXdhaXQgb25GaWxlRXZlbnRzKHJlYWxDaGFuZ2VzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICB3YXRjaGVyLm9uKFwiYWxsXCIsIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID1cbiAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgIGFzc2VydChcbiAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFNvbmFtdS5hcHBSb290UGF0aCksXG4gICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBhcHAgcm9vdCBwYXRoXCIsXG4gICAgKTtcblxuICAgIGlmICghaXNXYW50ZWRFdmVudChldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNDb25maWdDaGFuZ2UoYWJzb2x1dGVQYXRoKSkge1xuICAgICAgdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50LCBmaWxlUGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT3V0T2ZTY29wZShhYnNvbHV0ZVBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7Jes6riw6rmM7KeAIOyZlOuLpOuptCBzeW5jZXLqsIAg7KeE7Kec66GcIOyymOumrO2VtOyVvCDtlaAg67OA6rK97IKs7ZWt7J2065286rOgIOuztOuptCDrkKnri4jri6QuXG4gICAgLy8g7J20IO2YuOy2nOydgCDsnbTrsqTtirjrpbwgYmF0Y2hlcuyXkCDsjJPsirXri4jri6QuXG4gICAgLy8g7J207ZuEIOuVjOqwgCDrkJjrqbQg7J2066CH6rKMIOyMk+yduCDsnbTrsqTtirjrpbwg65Ok6rOgIG9uRmlsZUV2ZW50cyDsvZzrsLHsnbQg7Zi47Lac65Cp64uI64ukLlxuICAgIHB1c2hGaWxlRXZlbnQoYWJzb2x1dGVQYXRoLCBldmVudCk7XG4gIH0pO1xuXG4gIHJldHVybiB3YXRjaGVyO1xufVxuXG5mdW5jdGlvbiBhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSB7XG4gIHJldHVybiBbXG4gICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiksXG4gICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKCh0KSA9PiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0LCBcInNyY1wiKSksXG4gIF07XG59XG5cbi8qKlxuICogY2hva2lkYXLsnZggYGlnbm9yZWRgIOyYteyFmOyXkCDrsJXripQg7Zes7Y28LlxuICog7KO87Ja07KeEIO2ZleyepeyekOqwgCAq7JWE64uMKiDtjIzsnbzsnYAg66y07Iuc7ZWp64uI64ukIOKAlCDspokg7KO87Ja07KeEIO2ZleyepeyekOunjCB3YXRjaCDrjIDsg4EuXG4gKlxuICogY2hva2lkYXIgYGlnbm9yZWRg64qUIGB0cnVlYOulvCDrsJjtmZjtlZjrqbQg7ZW064u5IOqyveuhnOulvCDrrLTsi5ztlanri4jri6QuXG4gKiDrlLDrnbzshJwgXCLsnbQg7ZmV7J6l7J6Q66eMIO2XiOyaqVwi7J2EIO2RnO2YhO2VmOugpOuptCAq64uk66W4IO2ZleyepeyekOyXkCDrjIDtlbQgdHJ1ZSrrpbwg67CY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaWdub3JlSWZFeHRlbnNpb25Jc05vdE9uZU9mKC4uLmFsbG93ZWRFeHRlbnNpb25zOiBgLiR7c3RyaW5nfWBbXSkge1xuICBjb25zdCBpc0FsbG93ZWQgPSAoZXh0OiBzdHJpbmcpID0+XG4gICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBhbGxvd2VkRXh0ZW5zaW9ucyBhcyBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoZXh0KTtcblxuICByZXR1cm4gKHA6IHN0cmluZywgc3RhdHM/OiBTdGF0cykgPT4gISFzdGF0cz8uaXNGaWxlKCkgJiYgIWlzQWxsb3dlZChwYXRoLmV4dG5hbWUocCkpO1xufVxuXG5mdW5jdGlvbiBpc1dhbnRlZEV2ZW50KGV2ZW50OiBzdHJpbmcpOiBldmVudCBpcyBcImNoYW5nZVwiIHwgXCJhZGRcIiB7XG4gIHJldHVybiBldmVudCA9PT0gXCJjaGFuZ2VcIiB8fCBldmVudCA9PT0gXCJhZGRcIjtcbn1cblxuZnVuY3Rpb24gaXNDb25maWdDaGFuZ2UoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGggPT09IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbn1cblxuZnVuY3Rpb24gdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGgucmVwbGFjZShTb25hbXUuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSk7XG4gIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xufVxuXG4vKipcbiAqIOyKpOy9lO2UhCDsoJXsnZg6XG4gKiAtIGFwaS9zcmMg7JWI7J2YIOuqqOuToCDrs4Dqsr3snYAg7Iqk7L2U7ZSEIOyViCAoSE1SIOuMgOyDgeydtCDrkKAg7IiYIOyeiOycvOuvgOuhnClcbiAqIC0gYXBpL3NyYyDrsJbsnbTrnbzrqbQgY2hlY2tzdW1QYXR0ZXJuR3JvdXAg7Yyo7YS07JeQIOunpOy5reuQmOuKlCDqsr3roZzrp4wg7Iqk7L2U7ZSEIOyViFxuICpcbiAqIOq3uCDsmbgo7JiIOiB3ZWIvc3JjL0FwcC50c3gg6rCZ7J2AIHRhcmdldOydmCDruYTstpTsoIEg7YyM7J28KeuKlCDsiqTsvZTtlIQg67CW7J206528IOustOyLnO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaXNPdXRPZlNjb3BlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBib29sZWFuIHtcbiAgY29uc3QgYXBpU3JjID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIik7XG4gIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKGFwaVNyYykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gIHJldHVybiAhT2JqZWN0LnZhbHVlcyhjaGVja1BhdHRlcm5Hcm91cCkuc29tZSgocGF0dGVybikgPT4gbWluaW1hdGNoKGZpbGVQYXRoLCBwYXR0ZXJuKSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsZUFBc0IsYUFDcEIsY0FDb0I7Q0FJcEIsTUFBTSxVQUFVLE1BQU0sc0JBQXNCLEdBQUc7RUFDN0MsU0FBUyw0QkFBNEIsT0FBTyxTQUFTLE9BQU87RUFDNUQsWUFBWTtFQUNaLGVBQWU7Q0FDakIsQ0FBQztDQUdELE1BQU0sZ0JBQWdCLHVCQUF5QztFQUM3RCxTQUFTO0VBQ1QsU0FBUyxPQUFPLGVBQWU7R0FDN0IsTUFBTSw4QkFBYyxJQUFJLElBQW9DO0dBQzVELEtBQUssTUFBTSxDQUFDLEdBQUcsTUFBTSxZQUtuQixJQUFJLENBQUUsTUFBTSxrQkFBa0IsQ0FBQyxHQUM3QixZQUFZLElBQUksR0FBRyxDQUFDO0dBR3hCLElBQUksWUFBWSxPQUFPLEdBQ3JCLE1BQU0sYUFBYSxXQUFXO0VBRWxDO0NBQ0YsQ0FBQztDQUVELFFBQVEsR0FBRyxRQUFRLE9BQWUsYUFBcUI7RUFDckQsTUFBTSxlQUN1RDtFQUM3RCxPQUNFLGFBQWEsV0FBVyxPQUFPLFdBQVcsR0FDMUMsMkNBQ0Y7RUFFQSxJQUFJLENBQUMsY0FBYyxLQUFLLEdBQ3RCO0VBR0YsSUFBSSxlQUFlLFlBQVksR0FBRztHQUNoQyxtQkFBbUIsT0FBTyxRQUFRO0dBQ2xDO0VBQ0Y7RUFFQSxJQUFJLGFBQWEsWUFBWSxHQUMzQjtFQU1GLGNBQWMsY0FBYyxLQUFLO0NBQ25DLENBQUM7Q0FFRCxPQUFPO0FBQ1Q7QUFFQSxTQUFTLHdCQUF3QjtDQUMvQixPQUFPLENBQ0wsS0FBSyxLQUFLLE9BQU8sYUFBYSxLQUFLLEdBQ25DLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxLQUFLLE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUNsRjtBQUNGOzs7Ozs7OztBQVNBLFNBQVMsNEJBQTRCLEdBQUcsbUJBQW1DO0NBQ3pFLE1BQU0sYUFBYSxRQUVmLGtCQUNBLFNBQVMsR0FBRztDQUVoQixRQUFRLEdBQVcsVUFBa0IsQ0FBQyxDQUFDLE9BQU8sT0FBTyxLQUFLLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ3RGO0FBRUEsU0FBUyxjQUFjLE9BQTBDO0NBQy9ELE9BQU8sVUFBVSxZQUFZLFVBQVU7QUFDekM7QUFFQSxTQUFTLGVBQWUsVUFBaUM7Q0FDdkQsT0FBTyxhQUFhLEtBQUssS0FBSyxPQUFPLGFBQWEsT0FBTyxrQkFBa0I7QUFDN0U7QUFFQSxTQUFTLG1CQUFtQixPQUFlLFVBQXdCO0NBQ2pFLE1BQU0sZUFBZSxTQUFTLFFBQVEsT0FBTyxhQUFhLEtBQUs7Q0FDL0QsUUFBUSxJQUFJLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxNQUFNLEtBQUssWUFBWSxFQUFFLGlCQUFpQixDQUFDO0NBQ3pGLFFBQVEsS0FBSyxRQUFRLEtBQUssU0FBUztBQUNyQzs7Ozs7Ozs7QUFTQSxTQUFTLGFBQWEsVUFBaUM7Q0FDckQsTUFBTSxTQUFTLEtBQUssS0FBSyxPQUFPLGFBQWEsS0FBSztDQUNsRCxJQUFJLFNBQVMsV0FBVyxNQUFNLEdBQzVCLE9BQU87Q0FFVCxNQUFNLG9CQUFvQixzQ0FBc0M7Q0FDaEUsT0FBTyxDQUFDLE9BQU8sT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sWUFBWSxVQUFVLFVBQVUsT0FBTyxDQUFDO0FBQ3pGOztDQTNIK0IsU0FBQTtDQUV5QixtQkFBQTtDQUNlLG1CQUFBO0NBQ3BCLG1CQUFBIn0=