sonamu 0.10.12 → 0.10.13

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 (513) hide show
  1. package/dist/ai/agents/agent.d.ts +1 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +5 -6
  4. package/dist/ai/agents/types.d.ts +1 -1
  5. package/dist/ai/agents/types.d.ts.map +1 -1
  6. package/dist/ai/providers/rtzr/api.js +18 -18
  7. package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
  8. package/dist/ai/providers/rtzr/error.js +17 -15
  9. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  10. package/dist/ai/providers/rtzr/model.js +3 -2
  11. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  12. package/dist/ai/providers/rtzr/options.js +16 -16
  13. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  14. package/dist/ai/providers/rtzr/provider.js +9 -9
  15. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/utils.js +1 -1
  17. package/dist/api/caster.d.ts.map +1 -1
  18. package/dist/api/caster.js +17 -17
  19. package/dist/api/code-converters.d.ts +4 -2
  20. package/dist/api/code-converters.d.ts.map +1 -1
  21. package/dist/api/code-converters.js +100 -19
  22. package/dist/api/config.d.ts +16 -1
  23. package/dist/api/config.d.ts.map +1 -1
  24. package/dist/api/config.js +28 -21
  25. package/dist/api/context.d.ts +2 -2
  26. package/dist/api/context.d.ts.map +1 -1
  27. package/dist/api/context.js +1 -1
  28. package/dist/api/decorators.d.ts.map +1 -1
  29. package/dist/api/decorators.js +18 -11
  30. package/dist/api/http-validator.d.ts +36 -0
  31. package/dist/api/http-validator.d.ts.map +1 -0
  32. package/dist/api/http-validator.js +72 -0
  33. package/dist/api/index.js +6 -4
  34. package/dist/api/sonamu.d.ts +59 -20
  35. package/dist/api/sonamu.d.ts.map +1 -1
  36. package/dist/api/sonamu.js +250 -106
  37. package/dist/api/websocket-helpers.d.ts +7 -5
  38. package/dist/api/websocket-helpers.d.ts.map +1 -1
  39. package/dist/api/websocket-helpers.js +6 -6
  40. package/dist/auth/audit-log/builders.d.ts.map +1 -1
  41. package/dist/auth/audit-log/builders.js +1 -1
  42. package/dist/auth/audit-log/client-ip.d.ts +1 -1
  43. package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
  44. package/dist/auth/audit-log/client-ip.js +4 -2
  45. package/dist/auth/audit-log/events.d.ts +5 -1
  46. package/dist/auth/audit-log/events.d.ts.map +1 -1
  47. package/dist/auth/audit-log/events.js +1 -1
  48. package/dist/auth/audit-log/plugin.d.ts +0 -8
  49. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  50. package/dist/auth/audit-log/plugin.js +48 -52
  51. package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
  52. package/dist/auth/audit-log-ingestor.js +16 -12
  53. package/dist/auth/auth-generator.d.ts.map +1 -1
  54. package/dist/auth/auth-generator.js +1 -1
  55. package/dist/auth/better-auth-request.d.ts.map +1 -1
  56. package/dist/auth/better-auth-request.js +6 -5
  57. package/dist/auth/knex-adapter.js +1 -1
  58. package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
  59. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  60. package/dist/auth/plugins/entity-definitions/index.js +1 -1
  61. package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
  62. package/dist/bin/build-config.d.ts +25 -0
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +105 -2
  65. package/dist/bin/cli.js +131 -27
  66. package/dist/bin/compiler-policy.d.ts +3 -0
  67. package/dist/bin/compiler-policy.d.ts.map +1 -0
  68. package/dist/bin/compiler-policy.js +24 -0
  69. package/dist/bin/fixture.d.ts.map +1 -1
  70. package/dist/bin/fixture.js +5 -3
  71. package/dist/bin/test-command.d.ts +22 -1
  72. package/dist/bin/test-command.d.ts.map +1 -1
  73. package/dist/bin/test-command.js +18 -10
  74. package/dist/bin/ts-loader-registration.d.ts +7 -1
  75. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  76. package/dist/bin/ts-loader-registration.js +13 -4
  77. package/dist/cache/decorator.d.ts.map +1 -1
  78. package/dist/cache/decorator.js +11 -4
  79. package/dist/compress/compress.d.ts.map +1 -1
  80. package/dist/compress/compress.js +1 -1
  81. package/dist/cone/cone-generator.d.ts +14 -1
  82. package/dist/cone/cone-generator.d.ts.map +1 -1
  83. package/dist/cone/cone-generator.js +13 -9
  84. package/dist/database/_batch_update.js +1 -1
  85. package/dist/database/base-model.d.ts +22 -10
  86. package/dist/database/base-model.d.ts.map +1 -1
  87. package/dist/database/base-model.js +26 -16
  88. package/dist/database/base-model.types.d.ts +15 -3
  89. package/dist/database/base-model.types.d.ts.map +1 -1
  90. package/dist/database/db.d.ts +12 -2
  91. package/dist/database/db.d.ts.map +1 -1
  92. package/dist/database/db.js +10 -7
  93. package/dist/database/knex.d.ts.map +1 -1
  94. package/dist/database/knex.js +17 -14
  95. package/dist/database/puri.d.ts +11 -9
  96. package/dist/database/puri.d.ts.map +1 -1
  97. package/dist/database/puri.js +93 -79
  98. package/dist/database/puri.types.d.ts +21 -21
  99. package/dist/database/puri.types.d.ts.map +1 -1
  100. package/dist/database/puri.types.js +1 -1
  101. package/dist/database/upsert-builder.d.ts +12 -10
  102. package/dist/database/upsert-builder.d.ts.map +1 -1
  103. package/dist/database/upsert-builder.js +20 -12
  104. package/dist/dict/sd.d.ts.map +1 -1
  105. package/dist/dict/sd.js +1 -1
  106. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  107. package/dist/dict/sonamu-dictionary.js +1 -1
  108. package/dist/dict/utils.d.ts.map +1 -1
  109. package/dist/dict/utils.js +7 -2
  110. package/dist/entity/entity-manager.d.ts +13 -4
  111. package/dist/entity/entity-manager.d.ts.map +1 -1
  112. package/dist/entity/entity-manager.js +19 -11
  113. package/dist/entity/entity-template-cone.d.ts +73 -5
  114. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  115. package/dist/entity/entity-template-cone.js +4 -2
  116. package/dist/entity/entity.d.ts +6 -2
  117. package/dist/entity/entity.d.ts.map +1 -1
  118. package/dist/entity/entity.js +30 -28
  119. package/dist/env.d.ts +3 -1
  120. package/dist/env.d.ts.map +1 -1
  121. package/dist/env.js +1 -1
  122. package/dist/exceptions/error-handler.d.ts.map +1 -1
  123. package/dist/exceptions/error-handler.js +7 -2
  124. package/dist/exceptions/so-exceptions.d.ts +24 -20
  125. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  126. package/dist/exceptions/so-exceptions.js +4 -2
  127. package/dist/filter/utils.d.ts +7 -2
  128. package/dist/filter/utils.d.ts.map +1 -1
  129. package/dist/filter/utils.js +8 -6
  130. package/dist/index.d.ts +3 -0
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +12 -6
  133. package/dist/logger/configure.d.ts.map +1 -1
  134. package/dist/logger/configure.js +10 -10
  135. package/dist/migration/code-generation.d.ts.map +1 -1
  136. package/dist/migration/code-generation.js +50 -46
  137. package/dist/migration/index-where-predicate.d.ts.map +1 -1
  138. package/dist/migration/index-where-predicate.js +22 -8
  139. package/dist/migration/migration-set.d.ts.map +1 -1
  140. package/dist/migration/migration-set.js +1 -1
  141. package/dist/migration/migrator.d.ts +3 -2
  142. package/dist/migration/migrator.d.ts.map +1 -1
  143. package/dist/migration/migrator.js +27 -21
  144. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  145. package/dist/migration/postgresql-schema-reader.js +51 -36
  146. package/dist/migration/slack-confirm.d.ts.map +1 -1
  147. package/dist/migration/slack-confirm.js +1 -1
  148. package/dist/naite/naite-reporter.js +2 -2
  149. package/dist/naite/naite.d.ts +74 -15
  150. package/dist/naite/naite.d.ts.map +1 -1
  151. package/dist/naite/naite.js +5 -19
  152. package/dist/runtime-type.d.ts +6 -0
  153. package/dist/runtime-type.d.ts.map +1 -0
  154. package/dist/runtime-type.js +26 -0
  155. package/dist/ssr/hmr-opt-out.d.ts +26 -0
  156. package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
  157. package/dist/ssr/hmr-opt-out.js +59 -0
  158. package/dist/ssr/renderer.d.ts.map +1 -1
  159. package/dist/ssr/renderer.js +4 -1
  160. package/dist/storage/base-file.js +14 -14
  161. package/dist/storage/buffered-file.d.ts +2 -2
  162. package/dist/storage/buffered-file.d.ts.map +1 -1
  163. package/dist/storage/buffered-file.js +12 -12
  164. package/dist/storage/s3-driver.d.ts.map +1 -1
  165. package/dist/storage/s3-driver.js +1 -1
  166. package/dist/storage/uploaded-file.d.ts +2 -2
  167. package/dist/storage/uploaded-file.d.ts.map +1 -1
  168. package/dist/storage/uploaded-file.js +8 -8
  169. package/dist/stream/sse.js +11 -11
  170. package/dist/stream/ws-core.d.ts +1 -1
  171. package/dist/stream/ws-core.d.ts.map +1 -1
  172. package/dist/stream/ws-delivery.d.ts +1 -1
  173. package/dist/stream/ws-delivery.d.ts.map +1 -1
  174. package/dist/stream/ws-delivery.js +6 -4
  175. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  176. package/dist/stream/ws-local-connection-store.js +4 -2
  177. package/dist/stream/ws-presence-store.js +1 -1
  178. package/dist/stream/ws-registry.d.ts +4 -4
  179. package/dist/stream/ws-registry.d.ts.map +1 -1
  180. package/dist/stream/ws-registry.js +4 -2
  181. package/dist/stream/ws-telemetry.d.ts +16 -12
  182. package/dist/stream/ws-telemetry.d.ts.map +1 -1
  183. package/dist/stream/ws-telemetry.js +22 -18
  184. package/dist/stream/ws.d.ts +18 -12
  185. package/dist/stream/ws.d.ts.map +1 -1
  186. package/dist/stream/ws.js +26 -22
  187. package/dist/syncer/api-parser.js +1 -1
  188. package/dist/syncer/checksum.d.ts.map +1 -1
  189. package/dist/syncer/checksum.js +7 -8
  190. package/dist/syncer/code-generator.d.ts.map +1 -1
  191. package/dist/syncer/code-generator.js +13 -14
  192. package/dist/syncer/entity-operations.d.ts.map +1 -1
  193. package/dist/syncer/entity-operations.js +5 -6
  194. package/dist/syncer/file-copy.d.ts +5 -0
  195. package/dist/syncer/file-copy.d.ts.map +1 -0
  196. package/dist/syncer/file-copy.js +36 -0
  197. package/dist/syncer/file-patterns.d.ts +1 -0
  198. package/dist/syncer/file-patterns.d.ts.map +1 -1
  199. package/dist/syncer/file-patterns.js +5 -2
  200. package/dist/syncer/file-tracking.d.ts.map +1 -1
  201. package/dist/syncer/file-tracking.js +5 -4
  202. package/dist/syncer/filesystem-dependencies.d.ts +15 -0
  203. package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
  204. package/dist/syncer/filesystem-dependencies.js +53 -0
  205. package/dist/syncer/module-loader.d.ts +1 -1
  206. package/dist/syncer/module-loader.d.ts.map +1 -1
  207. package/dist/syncer/module-loader.js +6 -4
  208. package/dist/syncer/syncer-actions.d.ts +4 -0
  209. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  210. package/dist/syncer/syncer-actions.js +34 -17
  211. package/dist/syncer/syncer.d.ts +17 -6
  212. package/dist/syncer/syncer.d.ts.map +1 -1
  213. package/dist/syncer/syncer.js +71 -29
  214. package/dist/syncer/watcher.d.ts.map +1 -1
  215. package/dist/syncer/watcher.js +3 -3
  216. package/dist/tasks/decorator.d.ts +6 -6
  217. package/dist/tasks/decorator.d.ts.map +1 -1
  218. package/dist/tasks/decorator.js +4 -4
  219. package/dist/tasks/step-wrapper.d.ts +6 -4
  220. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  221. package/dist/tasks/step-wrapper.js +5 -5
  222. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  223. package/dist/tasks/workflow-manager.js +13 -7
  224. package/dist/template/entity-converter.d.ts +1 -1
  225. package/dist/template/entity-converter.d.ts.map +1 -1
  226. package/dist/template/entity-converter.js +2 -2
  227. package/dist/template/helpers.d.ts +8 -6
  228. package/dist/template/helpers.d.ts.map +1 -1
  229. package/dist/template/helpers.js +1 -1
  230. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  231. package/dist/template/implementations/generated.template.js +4 -4
  232. package/dist/template/implementations/generated_http.template.d.ts +7 -4
  233. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  234. package/dist/template/implementations/generated_http.template.js +21 -21
  235. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  236. package/dist/template/implementations/generated_sso.template.js +6 -3
  237. package/dist/template/implementations/http_validators.template.d.ts +18 -0
  238. package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
  239. package/dist/template/implementations/http_validators.template.js +127 -0
  240. package/dist/template/implementations/model.template.d.ts.map +1 -1
  241. package/dist/template/implementations/model.template.js +1 -1
  242. package/dist/template/implementations/queries.template.js +1 -1
  243. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  244. package/dist/template/implementations/sd.template.js +79 -39
  245. package/dist/template/implementations/services.template.d.ts.map +1 -1
  246. package/dist/template/implementations/services.template.js +6 -4
  247. package/dist/template/implementations/view_form.template.d.ts +6 -1
  248. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  249. package/dist/template/implementations/view_form.template.js +23 -15
  250. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  251. package/dist/template/implementations/view_list.template.js +11 -6
  252. package/dist/template/template-manager.d.ts.map +1 -1
  253. package/dist/template/template-manager.js +9 -7
  254. package/dist/template/template-types.d.ts +12 -5
  255. package/dist/template/template-types.d.ts.map +1 -1
  256. package/dist/template/template-types.js +1 -1
  257. package/dist/template/template.d.ts +2 -2
  258. package/dist/template/template.d.ts.map +1 -1
  259. package/dist/template/template.js +6 -4
  260. package/dist/template/zod-converter.d.ts +0 -19
  261. package/dist/template/zod-converter.d.ts.map +1 -1
  262. package/dist/template/zod-converter.js +100 -84
  263. package/dist/testing/_relation-graph.d.ts.map +1 -1
  264. package/dist/testing/_relation-graph.js +2 -1
  265. package/dist/testing/bootstrap.d.ts.map +1 -1
  266. package/dist/testing/bootstrap.js +9 -6
  267. package/dist/testing/data-explorer.d.ts +32 -7
  268. package/dist/testing/data-explorer.d.ts.map +1 -1
  269. package/dist/testing/data-explorer.js +77 -31
  270. package/dist/testing/dev-test-routes.d.ts +8 -1
  271. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  272. package/dist/testing/dev-test-routes.js +125 -108
  273. package/dist/testing/dev-vitest-manager.d.ts +54 -8
  274. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  275. package/dist/testing/dev-vitest-manager.js +24 -9
  276. package/dist/testing/faker-mappings.d.ts +412 -1
  277. package/dist/testing/faker-mappings.d.ts.map +1 -1
  278. package/dist/testing/faker-mappings.js +1 -1
  279. package/dist/testing/filesystem.d.ts +2 -0
  280. package/dist/testing/filesystem.d.ts.map +1 -0
  281. package/dist/testing/filesystem.js +7 -0
  282. package/dist/testing/fixture-generator.d.ts +25 -8
  283. package/dist/testing/fixture-generator.d.ts.map +1 -1
  284. package/dist/testing/fixture-generator.js +132 -73
  285. package/dist/testing/fixture-loader.d.ts +3 -1
  286. package/dist/testing/fixture-loader.d.ts.map +1 -1
  287. package/dist/testing/fixture-loader.js +1 -20
  288. package/dist/testing/fixture-manager.d.ts +8 -7
  289. package/dist/testing/fixture-manager.d.ts.map +1 -1
  290. package/dist/testing/fixture-manager.js +91 -59
  291. package/dist/testing/global-setup.d.ts.map +1 -1
  292. package/dist/testing/global-setup.js +5 -2
  293. package/dist/testing/index.d.ts +2 -0
  294. package/dist/testing/index.d.ts.map +1 -1
  295. package/dist/testing/index.js +6 -3
  296. package/dist/types/types.d.ts +101 -99
  297. package/dist/types/types.d.ts.map +1 -1
  298. package/dist/types/types.js +234 -225
  299. package/dist/ui/ai-api.d.ts.map +1 -1
  300. package/dist/ui/ai-api.js +1 -1
  301. package/dist/ui/ai-client.d.ts.map +1 -1
  302. package/dist/ui/ai-client.js +28 -18
  303. package/dist/ui/api.d.ts.map +1 -1
  304. package/dist/ui/api.js +135 -128
  305. package/dist/ui/async-route.d.ts +3 -0
  306. package/dist/ui/async-route.d.ts.map +1 -0
  307. package/dist/ui/async-route.js +12 -0
  308. package/dist/ui/cdd-service.d.ts +9 -7
  309. package/dist/ui/cdd-service.d.ts.map +1 -1
  310. package/dist/ui/cdd-service.js +7 -5
  311. package/dist/ui/migrations-api.d.ts.map +1 -1
  312. package/dist/ui/migrations-api.js +17 -15
  313. package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
  314. package/dist/ui-web/index.html +1 -1
  315. package/dist/utils/formatter.d.ts.map +1 -1
  316. package/dist/utils/formatter.js +7 -5
  317. package/dist/utils/fs-utils.d.ts +3 -3
  318. package/dist/utils/fs-utils.d.ts.map +1 -1
  319. package/dist/utils/fs-utils.js +6 -6
  320. package/dist/utils/model.d.ts +3 -5
  321. package/dist/utils/model.d.ts.map +1 -1
  322. package/dist/utils/model.js +1 -1
  323. package/dist/utils/object-utils.d.ts +1 -1
  324. package/dist/utils/object-utils.d.ts.map +1 -1
  325. package/dist/utils/object-utils.js +17 -16
  326. package/dist/utils/process-utils.d.ts.map +1 -1
  327. package/dist/utils/process-utils.js +4 -2
  328. package/dist/utils/runtime-value.d.ts +13 -0
  329. package/dist/utils/runtime-value.d.ts.map +1 -0
  330. package/dist/utils/runtime-value.js +40 -0
  331. package/dist/utils/sql-parser.d.ts +8 -1
  332. package/dist/utils/sql-parser.d.ts.map +1 -1
  333. package/dist/utils/sql-parser.js +6 -3
  334. package/dist/utils/type-utils.d.ts.map +1 -1
  335. package/dist/utils/type-utils.js +10 -8
  336. package/dist/utils/utils.d.ts +2 -2
  337. package/dist/utils/utils.d.ts.map +1 -1
  338. package/dist/utils/utils.js +11 -8
  339. package/dist/utils/zod-error.d.ts.map +1 -1
  340. package/dist/utils/zod-error.js +7 -4
  341. package/dist/vector/chunking.d.ts.map +1 -1
  342. package/dist/vector/chunking.js +1 -1
  343. package/dist/vector/embedding.d.ts.map +1 -1
  344. package/dist/vector/embedding.js +1 -1
  345. package/dist/vector/types.d.ts +3 -2
  346. package/dist/vector/types.d.ts.map +1 -1
  347. package/package.json +5 -3
  348. package/src/ai/agents/agent.ts +5 -5
  349. package/src/ai/agents/types.ts +1 -1
  350. package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
  351. package/src/ai/providers/rtzr/error.ts +5 -3
  352. package/src/ai/providers/rtzr/model.ts +3 -2
  353. package/src/ai/providers/rtzr/options.ts +10 -5
  354. package/src/ai/providers/rtzr/provider.ts +10 -10
  355. package/src/ai/providers/rtzr/utils.ts +3 -1
  356. package/src/api/__tests__/config.test.ts +11 -21
  357. package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
  358. package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
  359. package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
  360. package/src/api/caster.ts +6 -8
  361. package/src/api/code-converters.ts +136 -36
  362. package/src/api/config.ts +62 -4
  363. package/src/api/context.ts +3 -3
  364. package/src/api/decorators.ts +28 -17
  365. package/src/api/http-validator.ts +149 -0
  366. package/src/api/sonamu.ts +459 -152
  367. package/src/api/websocket-helpers.ts +24 -17
  368. package/src/auth/audit-log/builders.ts +3 -2
  369. package/src/auth/audit-log/client-ip.ts +4 -2
  370. package/src/auth/audit-log/events.ts +15 -1
  371. package/src/auth/audit-log/plugin.ts +129 -200
  372. package/src/auth/audit-log-ingestor.ts +19 -15
  373. package/src/auth/auth-generator.ts +10 -5
  374. package/src/auth/better-auth-request.ts +4 -3
  375. package/src/auth/knex-adapter.ts +8 -2
  376. package/src/auth/plugins/entity-definitions/index.ts +6 -5
  377. package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
  378. package/src/bin/__tests__/test-command.test.ts +9 -15
  379. package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
  380. package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
  381. package/src/bin/build-config.ts +167 -0
  382. package/src/bin/cli.ts +153 -36
  383. package/src/bin/compiler-policy.ts +35 -0
  384. package/src/bin/fixture.ts +14 -3
  385. package/src/bin/test-command.ts +74 -29
  386. package/src/bin/ts-loader-registration.ts +22 -4
  387. package/src/cache/decorator.ts +10 -3
  388. package/src/compress/compress.ts +17 -4
  389. package/src/cone/cone-generator.ts +34 -6
  390. package/src/database/__tests__/db.test.ts +1 -0
  391. package/src/database/__tests__/puri.test.ts +16 -15
  392. package/src/database/__tests__/transaction-scope.test.ts +5 -0
  393. package/src/database/_batch_update.ts +1 -0
  394. package/src/database/base-model.ts +81 -50
  395. package/src/database/base-model.types.ts +6 -6
  396. package/src/database/db.ts +29 -19
  397. package/src/database/knex.ts +30 -17
  398. package/src/database/puri-subset.test-d.ts +17 -0
  399. package/src/database/puri.ts +181 -143
  400. package/src/database/puri.types.test-d.ts +31 -1
  401. package/src/database/puri.types.ts +23 -21
  402. package/src/database/upsert-builder.ts +75 -53
  403. package/src/dict/sd.ts +15 -5
  404. package/src/dict/sonamu-dictionary.ts +6 -6
  405. package/src/dict/utils.ts +9 -1
  406. package/src/entity/entity-manager.ts +26 -9
  407. package/src/entity/entity-template-cone.ts +5 -10
  408. package/src/entity/entity.ts +50 -34
  409. package/src/env.ts +7 -3
  410. package/src/exceptions/error-handler.ts +17 -2
  411. package/src/exceptions/so-exceptions.ts +26 -20
  412. package/src/filter/utils.ts +21 -11
  413. package/src/index.ts +3 -0
  414. package/src/logger/configure.ts +26 -18
  415. package/src/migration/__tests__/migrator.test.ts +50 -57
  416. package/src/migration/code-generation.ts +132 -104
  417. package/src/migration/index-where-predicate.ts +51 -24
  418. package/src/migration/migration-set.ts +11 -5
  419. package/src/migration/migrator.ts +68 -41
  420. package/src/migration/postgresql-schema-reader.ts +52 -47
  421. package/src/migration/slack-confirm.ts +17 -15
  422. package/src/naite/naite-reporter.ts +1 -1
  423. package/src/naite/naite.ts +97 -24
  424. package/src/runtime-type.ts +34 -0
  425. package/src/ssr/hmr-opt-out.ts +78 -0
  426. package/src/ssr/renderer.ts +6 -0
  427. package/src/storage/base-file.ts +13 -13
  428. package/src/storage/buffered-file.ts +11 -11
  429. package/src/storage/s3-driver.ts +4 -1
  430. package/src/storage/uploaded-file.ts +8 -8
  431. package/src/stream/__tests__/ws-contracts.test.ts +4 -2
  432. package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
  433. package/src/stream/__tests__/ws.test.ts +30 -6
  434. package/src/stream/sse.ts +12 -11
  435. package/src/stream/ws-core.ts +1 -1
  436. package/src/stream/ws-delivery.ts +16 -7
  437. package/src/stream/ws-local-connection-store.ts +2 -3
  438. package/src/stream/ws-presence-store.ts +6 -1
  439. package/src/stream/ws-registry.ts +16 -7
  440. package/src/stream/ws-telemetry.ts +66 -43
  441. package/src/stream/ws.ts +73 -39
  442. package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
  443. package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
  444. package/src/syncer/api-parser.ts +67 -27
  445. package/src/syncer/checksum.ts +17 -11
  446. package/src/syncer/code-generator.ts +25 -17
  447. package/src/syncer/entity-operations.ts +3 -5
  448. package/src/syncer/file-copy.ts +46 -0
  449. package/src/syncer/file-patterns.ts +11 -8
  450. package/src/syncer/file-tracking.ts +3 -4
  451. package/src/syncer/filesystem-dependencies.ts +73 -0
  452. package/src/syncer/module-loader.ts +8 -4
  453. package/src/syncer/syncer-actions.ts +56 -18
  454. package/src/syncer/syncer.ts +116 -43
  455. package/src/syncer/watcher.ts +8 -4
  456. package/src/tasks/decorator.ts +20 -12
  457. package/src/tasks/step-wrapper.ts +19 -9
  458. package/src/tasks/workflow-manager.ts +15 -9
  459. package/src/template/__tests__/http_validators.template.test.ts +160 -0
  460. package/src/template/__tests__/services.template.mutation.test.ts +24 -23
  461. package/src/template/__tests__/services.template.websocket.test.ts +21 -25
  462. package/src/template/entity-converter.ts +5 -2
  463. package/src/template/helpers.ts +8 -9
  464. package/src/template/implementations/generated.template.ts +5 -4
  465. package/src/template/implementations/generated_http.template.ts +61 -15
  466. package/src/template/implementations/generated_sso.template.ts +15 -4
  467. package/src/template/implementations/http_validators.template.ts +175 -0
  468. package/src/template/implementations/model.template.ts +3 -1
  469. package/src/template/implementations/sd.template.ts +81 -41
  470. package/src/template/implementations/services.template.ts +2 -2
  471. package/src/template/implementations/view_form.template.ts +56 -39
  472. package/src/template/implementations/view_list.template.ts +31 -23
  473. package/src/template/template-manager.ts +15 -13
  474. package/src/template/template-types.ts +13 -5
  475. package/src/template/template.ts +4 -3
  476. package/src/template/zod-converter.ts +206 -91
  477. package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
  478. package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
  479. package/src/testing/_relation-graph.ts +4 -1
  480. package/src/testing/bootstrap.ts +12 -5
  481. package/src/testing/data-explorer.ts +102 -53
  482. package/src/testing/dev-test-routes.ts +87 -50
  483. package/src/testing/dev-vitest-manager.ts +88 -32
  484. package/src/testing/faker-mappings.ts +2 -2
  485. package/src/testing/filesystem.ts +1 -0
  486. package/src/testing/fixture-generator.ts +191 -131
  487. package/src/testing/fixture-loader.ts +5 -1
  488. package/src/testing/fixture-manager.ts +129 -90
  489. package/src/testing/global-setup.ts +7 -3
  490. package/src/testing/index.ts +5 -0
  491. package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
  492. package/src/types/types.ts +184 -158
  493. package/src/ui/ai-api.ts +9 -7
  494. package/src/ui/ai-client.ts +61 -56
  495. package/src/ui/api.ts +727 -616
  496. package/src/ui/async-route.ts +4 -0
  497. package/src/ui/cdd-service.ts +35 -12
  498. package/src/ui/migrations-api.ts +63 -51
  499. package/src/utils/formatter.ts +7 -3
  500. package/src/utils/fs-utils.ts +5 -5
  501. package/src/utils/model.ts +4 -5
  502. package/src/utils/object-utils.ts +32 -22
  503. package/src/utils/process-utils.ts +4 -1
  504. package/src/utils/runtime-value.ts +43 -0
  505. package/src/utils/sql-parser.ts +13 -6
  506. package/src/utils/type-utils.ts +9 -7
  507. package/src/utils/utils.ts +19 -21
  508. package/src/utils/zod-error.ts +4 -2
  509. package/src/vector/chunking.ts +6 -1
  510. package/src/vector/embedding.ts +2 -1
  511. package/src/vector/types.ts +4 -2
  512. package/tsdown.api.config.ts +5 -2
  513. package/dist/ui-web/assets/index-C0m1pk6K.js +0 -177
@@ -1,31 +1,31 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
+ import { init_runtime_value, isObjectValue } from "../utils/runtime-value.js";
2
3
  import { centerText, init_console_util } from "../utils/console-util.js";
3
4
  import { init_controller, isTest } from "../utils/controller.js";
4
5
  import { init_async_utils, mapAsync, reduceAsync } from "../utils/async-utils.js";
5
6
  import { init_process_utils, runWithGracefulShutdown } from "../utils/process-utils.js";
6
- import { exists, init_fs_utils } from "../utils/fs-utils.js";
7
- import { Sonamu, init_sonamu } from "../api/sonamu.js";
8
7
  import { TemplateKey, init_types } from "../types/types.js";
8
+ import { Sonamu, init_sonamu } from "../api/sonamu.js";
9
9
  import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
10
10
  import { Naite, init_naite } from "../naite/naite.js";
11
11
  import { init_decorators, registeredApis } from "../api/decorators.js";
12
12
  import { TemplateManager, init_template_manager } from "../template/template-manager.js";
13
13
  import { getChecksumPatternGroup, getChecksumPatternGroupInAbsolutePath, init_file_patterns } from "./file-patterns.js";
14
+ import { init_filesystem_dependencies, syncerFileExists, syncerFilesystem } from "./filesystem-dependencies.js";
14
15
  import { findChangedFilesUsingChecksums, init_checksum, renewChecksums } from "./checksum.js";
15
16
  import { generateTemplate, init_code_generator, renderTemplate } from "./code-generator.js";
16
17
  import { createEntity, delEntity, init_entity_operations } from "./entity-operations.js";
17
18
  import { init_module_loader, loadApis, loadModels, loadTypes, loadWorkflows } from "./module-loader.js";
18
- import { actionCopySharedToTargetsIfNotExists, actionGenerateHttps, actionGenerateInitialTypes, actionGenerateSchemas, actionGenerateServices, actionGenerateSsrEntryServerIfNotExists, actionGenerateSsrQueries, actionSyncConfig, actionSyncFilesToTargets, actionSyncSonamuDictionary, init_syncer_actions } from "./syncer-actions.js";
19
- import { group, unique } from "radashi";
19
+ import { actionCopySharedToTargetsIfNotExists, actionGenerateHttpValidators, actionGenerateHttps, actionGenerateInitialTypes, actionGenerateSchemas, actionGenerateServices, actionGenerateSsrEntryServerIfNotExists, actionGenerateSsrQueries, actionSyncConfig, actionSyncFilesToTargets, actionSyncSonamuDictionary, init_syncer_actions } from "./syncer-actions.js";
20
+ import { unique } from "radashi";
20
21
  import assert from "assert";
21
22
  import path from "path";
22
23
  import chalk from "chalk";
23
- import { unlink } from "fs/promises";
24
24
  import { minimatch } from "minimatch";
25
25
  import { EventEmitter } from "events";
26
26
  import { hot } from "@sonamu-kit/hmr-hook";
27
27
  //#region src/syncer/syncer.ts
28
- var Syncer;
28
+ var defaultSyncerDependencies, Syncer;
29
29
  var init_syncer = __esmMin((() => {
30
30
  init_decorators();
31
31
  init_sonamu();
@@ -36,41 +36,62 @@ var init_syncer = __esmMin((() => {
36
36
  init_async_utils();
37
37
  init_console_util();
38
38
  init_controller();
39
- init_fs_utils();
40
39
  init_process_utils();
40
+ init_runtime_value();
41
41
  init_checksum();
42
42
  init_code_generator();
43
43
  init_entity_operations();
44
44
  init_file_patterns();
45
+ init_filesystem_dependencies();
45
46
  init_module_loader();
46
47
  init_syncer_actions();
48
+ defaultSyncerDependencies = {
49
+ actionCopySharedToTargetsIfNotExists,
50
+ actionGenerateHttpValidators,
51
+ actionGenerateSsrEntryServerIfNotExists,
52
+ findChangedFilesUsingChecksums,
53
+ renewChecksums
54
+ };
47
55
  Syncer = class {
56
+ dependencies;
48
57
  apis = [];
49
58
  types = {};
50
59
  models = {};
51
60
  workflows = /* @__PURE__ */ new Map();
52
61
  eventEmitter = new EventEmitter();
62
+ constructor(dependencies = defaultSyncerDependencies) {
63
+ this.dependencies = dependencies;
64
+ }
53
65
  /**
54
66
  * 체크섬이 변경된 부분에 대해 싱크를 진행합니다.
55
67
  * dev 서버가 처음 떴을 때, sonamu sync 할 때 실행됩니다. 이후에는 hmrAndSync 경로를 타요.
56
68
  * @returns
57
69
  */
58
70
  async sync() {
59
- await actionCopySharedToTargetsIfNotExists();
60
- await actionGenerateSsrEntryServerIfNotExists();
61
- const changedFiles = await findChangedFilesUsingChecksums();
71
+ await this.dependencies.actionCopySharedToTargetsIfNotExists();
72
+ await this.dependencies.actionGenerateSsrEntryServerIfNotExists();
73
+ const changedFiles = await this.dependencies.findChangedFilesUsingChecksums();
62
74
  if (changedFiles.length === 0) {
75
+ if (await this.reconcileHttpValidatorRegistry()) await this.dependencies.renewChecksums();
63
76
  console.log(chalk.black.bgGreen(centerText("All files are synced!")));
64
77
  return;
65
78
  }
66
79
  await runWithGracefulShutdown(async () => {
67
80
  await this.doSyncActions(changedFiles);
68
- await renewChecksums();
81
+ await this.reconcileHttpValidatorRegistry();
82
+ await this.dependencies.renewChecksums();
69
83
  }, {
70
84
  whenThisHappens: "SIGUSR2",
71
85
  waitForUpTo: 2e4
72
86
  });
73
87
  }
88
+ async reconcileHttpValidatorRegistry() {
89
+ const registryPath = path.join(Sonamu.apiRootPath, "src/application/sonamu.validators.generated.ts");
90
+ const policy = Sonamu.config.validation?.zodCompiler;
91
+ if ((isObjectValue(policy) && policy !== null && policy.api === "aot") === await syncerFileExists(registryPath)) return false;
92
+ await this.dependencies.actionGenerateHttpValidators();
93
+ return true;
94
+ }
74
95
  /**
75
96
  * 강제 풀-싱크: lock을 무시하고 처음부터 다시 싱크합니다.
76
97
  *
@@ -80,7 +101,7 @@ var init_syncer = __esmMin((() => {
80
101
  */
81
102
  async forceSync() {
82
103
  const lockPath = path.join(Sonamu.apiRootPath, "sonamu.lock");
83
- if (await exists(lockPath)) await unlink(lockPath);
104
+ if (await syncerFileExists(lockPath)) await syncerFilesystem.unlink(lockPath);
84
105
  await this.sync();
85
106
  }
86
107
  /**
@@ -106,6 +127,7 @@ var init_syncer = __esmMin((() => {
106
127
  await this.autoloadApis();
107
128
  await this.autoloadWorkflows();
108
129
  await this.autoloadSsrRoutes();
130
+ await Sonamu.refreshHttpValidators();
109
131
  this.eventEmitter.emit("onHMRCompleted");
110
132
  }
111
133
  extractHmrActionRequiredFileEvents(fileEvents) {
@@ -177,7 +199,7 @@ var init_syncer = __esmMin((() => {
177
199
  const ssrConfigPath = path.join(Sonamu.apiRootPath, "src/ssr");
178
200
  const { clearSSRRoutes } = await import("../ssr/index.js");
179
201
  clearSSRRoutes();
180
- if (!await exists(ssrConfigPath)) return;
202
+ if (!await syncerFileExists(ssrConfigPath)) return;
181
203
  const { globAsync } = await import("../utils/async-utils.js");
182
204
  const { importMembers } = await import("../utils/esm-utils.js");
183
205
  const { runtimePath } = await import("../utils/path-utils.js");
@@ -202,20 +224,36 @@ var init_syncer = __esmMin((() => {
202
224
  if (changeMatches("entity", "types")) await this.handleTruthSourceChanges(diffGroups);
203
225
  if (changeMatches("model", "frame")) await this.handleImplementationChanges(diffGroups);
204
226
  if (changeMatches("types", "functions")) await this.handleAuxiliarySymbolChanges(diffGroups);
205
- if (changeMatches("config")) await this.handleConfigChanges(diffGroups);
206
- if (changeMatches("i18n", "entity", "config")) await this.handleSonamuDictionaryRelatedChanges(diffGroups);
227
+ if (changeMatches("config")) await this.handleConfigChanges();
228
+ if (changeMatches("i18n", "entity", "config")) await this.handleSonamuDictionaryRelatedChanges();
229
+ const metadataChanged = diffTypes.some((type) => [
230
+ "entity",
231
+ "types",
232
+ "model",
233
+ "frame",
234
+ "config"
235
+ ].includes(type));
236
+ if (changeMatches("httpValidatorsGenerated") && !metadataChanged) await this.dependencies.actionGenerateHttpValidators();
237
+ if (metadataChanged) {
238
+ await this.autoloadTypes();
239
+ await this.autoloadModels();
240
+ await this.autoloadApis();
241
+ await this.dependencies.actionGenerateHttpValidators();
242
+ }
207
243
  if (nothingMatches()) await this.handleDrifts(unhandledPaths());
208
244
  return { diffTypes };
209
245
  }
210
246
  calculateDiffGroups(diffFiles) {
211
247
  const patternGroup = getChecksumPatternGroup();
212
248
  const fileTypes = Object.keys(patternGroup);
213
- return group(diffFiles, (filePath) => {
249
+ const diffGroups = {};
250
+ for (const filePath of diffFiles) {
214
251
  const relativePath = path.relative(Sonamu.appRootPath, filePath);
215
- if (relativePath.startsWith("..")) return "unknown";
216
- for (const fileType of fileTypes) if (minimatch(relativePath, patternGroup[fileType])) return fileType;
217
- return "unknown";
218
- });
252
+ const fileType = fileTypes.find((candidate) => minimatch(relativePath, patternGroup[candidate]));
253
+ const groupKey = relativePath.startsWith("..") ? "unknown" : fileType ?? "unknown";
254
+ (diffGroups[groupKey] ??= []).push(filePath);
255
+ }
256
+ return diffGroups;
219
257
  }
220
258
  changeMatcher(diffTypes, diffGroups) {
221
259
  const handled = /* @__PURE__ */ new Set();
@@ -253,7 +291,7 @@ var init_syncer = __esmMin((() => {
253
291
  const entityId = EntityManager.getEntityIdFromPath(entityPath);
254
292
  const entity = EntityManager.get(entityId);
255
293
  const typeFilePath = path.join(Sonamu.apiRootPath, `src/application/${entity.names.fs}/${entity.names.fs}.types.ts`);
256
- if (entity.parentId === void 0 && !await exists(typeFilePath)) await actionSyncFilesToTargets(await actionGenerateInitialTypes(entityId));
294
+ if (entity.parentId === void 0 && !await syncerFileExists(typeFilePath)) await actionSyncFilesToTargets(await actionGenerateInitialTypes(entityId));
257
295
  }
258
296
  await actionSyncFilesToTargets((await actionGenerateSchemas()).filter((p) => !p.endsWith(".sso.ts")));
259
297
  }
@@ -278,10 +316,14 @@ var init_syncer = __esmMin((() => {
278
316
  Naite.t("handleAuxiliarySymbolChanges", { diffGroups });
279
317
  await actionSyncFilesToTargets(unique([...diffGroups.types ?? [], ...diffGroups.functions ?? []]));
280
318
  }
281
- async handleConfigChanges(_) {
319
+ async handleConfigChanges() {
320
+ if (process.env.HOT === "yes") {
321
+ const { loadConfig } = await import("../api/config.js");
322
+ Sonamu.config = await loadConfig(Sonamu.apiRootPath);
323
+ }
282
324
  await actionSyncConfig();
283
325
  }
284
- async handleSonamuDictionaryRelatedChanges(_) {
326
+ async handleSonamuDictionaryRelatedChanges() {
285
327
  await actionSyncSonamuDictionary();
286
328
  }
287
329
  async handleDrifts(drifts) {
@@ -305,7 +347,7 @@ var init_syncer = __esmMin((() => {
305
347
  return {
306
348
  subPath,
307
349
  fullPath,
308
- isExists: await exists(fullPath)
350
+ isExists: await syncerFileExists(fullPath)
309
351
  };
310
352
  }
311
353
  /**
@@ -323,16 +365,16 @@ var init_syncer = __esmMin((() => {
323
365
  if (key.startsWith("view_enums")) {
324
366
  await mapAsync(enumsKeys, async (componentId) => {
325
367
  const { target, path: p } = tpl.getTargetAndPath(names, componentId);
326
- result[`${key}__${componentId}`] = await exists(path.join(Sonamu.appRootPath, target, p));
368
+ result[`${key}__${componentId}`] = await syncerFileExists(path.join(Sonamu.appRootPath, target, p));
327
369
  });
328
370
  return result;
329
371
  }
330
372
  const { target, path: p } = tpl.getTargetAndPath(names);
331
373
  const { targets } = Sonamu.config.sync;
332
374
  if (target.includes(":target")) await mapAsync(targets, async (t) => {
333
- result[`${key}__${t}`] = await exists(path.join(Sonamu.appRootPath, target.replace(":target", t), p));
375
+ result[`${key}__${t}`] = await syncerFileExists(path.join(Sonamu.appRootPath, target.replace(":target", t), p));
334
376
  });
335
- else result[key] = await exists(path.join(Sonamu.appRootPath, target, p));
377
+ else result[key] = await syncerFileExists(path.join(Sonamu.appRootPath, target, p));
336
378
  return result;
337
379
  }, {});
338
380
  }
@@ -364,7 +406,7 @@ var init_syncer = __esmMin((() => {
364
406
  * 하위호환용 프록시 메소드입니다.
365
407
  */
366
408
  async renewChecksums() {
367
- return await renewChecksums();
409
+ return await this.dependencies.renewChecksums();
368
410
  }
369
411
  };
370
412
  }));
@@ -372,4 +414,4 @@ var init_syncer = __esmMin((() => {
372
414
  init_syncer();
373
415
  export { Syncer, init_syncer };
374
416
 
375
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwibmFtZXMiOlsiU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWciLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyB1bmxpbmsgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgR2VuZXJhdGVPcHRpb25zLCB0eXBlIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXAsIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgbG9hZEFwaXMsIGxvYWRNb2RlbHMsIGxvYWRUeXBlcywgbG9hZFdvcmtmbG93cyB9IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCB7IHR5cGUgTG9hZGVkQXBpcywgdHlwZSBMb2FkZWRNb2RlbHMsIHR5cGUgTG9hZGVkVHlwZXMgfSBmcm9tIFwiLi9tb2R1bGUtbG9hZGVyXCI7XG5pbXBvcnQgKiBhcyBTeW5jZXJBY3Rpb25zIGZyb20gXCIuL3N5bmNlci1hY3Rpb25zXCI7XG5cbnR5cGUgRGlmZkdyb3VwcyA9IHtcbiAgW2tleSBpbiBGaWxlVHlwZV06IEFic29sdXRlUGF0aFtdO1xufTtcblxuZXhwb3J0IGNsYXNzIFN5bmNlciB7XG4gIGFwaXM6IExvYWRlZEFwaXMgPSBbXTtcbiAgdHlwZXM6IExvYWRlZFR5cGVzID0ge307XG4gIG1vZGVsczogTG9hZGVkTW9kZWxzID0ge307XG4gIHdvcmtmbG93czogTWFwPHN0cmluZywgV29ya2Zsb3dNZXRhZGF0YVtdPiA9IG5ldyBNYXAoKTtcbiAgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIOyytO2BrOyErOydtCDrs4Dqsr3rkJwg67aA67aE7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiBkZXYg7ISc67KE6rCAIOyymOydjCDrlrTsnYQg65WMLCBzb25hbXUgc3luYyDtlaAg65WMIOyLpO2WieuQqeuLiOuLpC4g7J207ZuE7JeQ64qUIGhtckFuZFN5bmMg6rK966Gc66W8IO2DgOyalC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7LSI6riwIOu2gO2KuOyKpO2KuOueqSEg7JaY64Sk65Ok7J2AIGlkZW1wb3RlbnTtlZjqs6Ag6rCA67ON6riwIOuVjOusuOyXkCDrrLTsp4DshLEg7Iuk7ZaJ7ZW064+EIOuQqeuLiOuLpC5cbiAgICAvLyDslpjrhKTrk6TsnYAgc29uYW11LmxvY2vsl5Ag65Ok7Ja06rCA7KeA64+EIOyViuqzoCDrlLDrnbzshJwgSE1SIOqyveuhnOulvCDtg4Dsp4Drj4Qg7JWK64qUIOy5nOq1rOuTpOyeheuLiOuLpC5cbiAgICAvLyDqt7jrnpjshJwg7JWE66y0IOuVjOuCmCDqt7jrg6Ug64+M66Ck7KO866m0IOuQmOuKlOuNsCwgaG1yQW5kU3luY+yXkOyEnCDrp6Trsogg7ZWY64qUIOqyg+ydgCDrgq3ruYTsnbTri4gg7Jes6riw7IScIO2VnCDrsojrp4wg7ZWp64uI64ukLlxuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uQ29weVNoYXJlZFRvVGFyZ2V0c0lmTm90RXhpc3RzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzckVudHJ5U2VydmVySWZOb3RFeGlzdHMoKTtcblxuICAgIC8vIOuwlOuAkCDqsoPsnbQg7JeG7Jy866m0IOq3uOuDpSDrhJjslrTqsIDsmpQuXG4gICAgY29uc3QgY2hhbmdlZEZpbGVzID0gYXdhaXQgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk7XG4gICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyXrOq4sOyEnCDsi6TsoJwg7Iux7YGsIOuPmeyekeydhCDsiJjtlontlanri4jri6QuXG4gICAgLy8g64uk66eMIOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIOqwleygnCDtkoAt7Iux7YGsOiBsb2Nr7J2EIOustOyLnO2VmOqzoCDsspjsnYzrtoDthLAg64uk7IucIOyLse2BrO2VqeuLiOuLpC5cbiAgICpcbiAgICogKirsgqzsmqnsspgqKjogZ2l0IHBvc3QtbWVyZ2UgaG9vaywgQ0ksIGRldiDshJzrsoTsnZggYGZgIO2Vq+2CpC5cbiAgICogKirsi6TtjKgg7JWI7KCE7ISxKio6IOuPhOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Ja0IGxvY2sg7JeG64qUIOyDge2DnOuhnCDrgqjslYTrj4Qg66y07ZW0IOKAlCDri6TsnYwgc3luY+yXkOyEnFxuICAgKiBsb2NrIOyXhuycvOuptCDsnpDsl7DsiqTrn73qsowg7ZKALeyLse2BrOqwgCDtirjrpqzqsbDrkJjslrQg7IOIIGxvY2vsnbQg7J6R7ISx65CoLlxuICAgKi9cbiAgYXN5bmMgZm9yY2VTeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvY2tQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzb25hbXUubG9ja1wiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKGxvY2tQYXRoKSkge1xuICAgICAgYXdhaXQgdW5saW5rKGxvY2tQYXRoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCBiYXRjaOuhnCDrqqjsnYAg67OA6rK9IO2MjOydvOuTpOyXkCDrjIDtlbQg7ZWcIOuyiOydmCBITVIvc3luYyDsgqzsnbTtgbTsnYQg64+V64uI64ukLlxuICAgKlxuICAgKiBITVLsnYAgYXBpL3NyYyDslYjsl5DshJwg7J287Ja064KY64qUIOuqqOuToCDtjIzsnbzrk6Tsl5Ag64yA7ZW07IScIOyImO2Wie2VqeuLiOuLpC5cbiAgICogY2hlY2tzdW1QYXR0ZXJuR3JvdXAg66ek7LmtIOyXrOu2gOyZgCDrrLTqtIDtlZjqsowgYXBpL3NyYyDsoITssrQg64yA7IOB7J6F64uI64ukLlxuICAgKiDqsIDroLkgYXBpL3NyYy91dGlscy9zdWJzZXQtbG9hZGVycy50cyDqsJnsnYAg7YyM7J2864+EIOuzgOqyveuQmOuptCBITVLsnYAg7ZW07KSN64uI64ukLlxuICAgKlxuICAgKiBTeW5j64qUIGNoZWNrc3VtUGF0dGVybkdyb3Vw7Jy866GcIOunpOy5reuQmOuKlCDtjIzsnbzrk6Tsl5Ag64yA7ZW07ISc66eMIOyImO2Wie2VqeuLiOuLpC5cbiAgICog7Jes6riw7JeQ64qUIHdlYi9zcmPrgpggYXBwL3NyYyDqsJnsnYAg64uk66W4IHRhcmdldOydmCDtjIzsnbzsnbQg7Y+s7ZWo65CgIOyImCDsnojsirXri4jri6QuXG4gICAqIOydtOufsCBub24tYXBpIOqyveuhnOydmCDtjIzsnbzrk6TsnYAgSE1S6rO864qUIOyVhOustCDsg4HqtIDsnbQg7JeG7Jy866+A66GcLCBpbnZhbGlkYXRl7J2EIO2VmOyngCDslYrsirXri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlRXZlbnRzIC0gcGF0aCDihpIgZXZlbnQg66e1LiBldmVudOuKlCBcImNoYW5nZVwiIHwgXCJhZGRcIi5cbiAgICovXG4gIGFzeW5jIGhtckFuZFN5bmMoZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaG1yQWN0aW9uUmVxdWlyZWRFdmVudHMgPSB0aGlzLmV4dHJhY3RIbXJBY3Rpb25SZXF1aXJlZEZpbGVFdmVudHMoZmlsZUV2ZW50cyk7XG4gICAgY29uc3Qgc3luY1RyaWdnZXJpbmdQYXRocyA9IGF3YWl0IHRoaXMuZXh0cmFjdFN5bmNUcmlnZ2VyaW5nRmlsZUV2ZW50UGF0aHMoZmlsZUV2ZW50cyk7XG5cbiAgICAvLyBITVIg7JiB7JetOiDtjIzsnbwg7J2067Kk7Yq4IOykkSBhcGnsnZgg66qo65OIIOq3uOuemO2UhOyXkCDsnojripQg7YyM7J2865Ok7JeQIOuMgO2VnCDrs4Drj5nsnYAgaG1yQWN0aW9uUmVxdWlyZWRFdmVudHProZwg7J6h7Z6Z64uI64ukLlxuICAgIC8vIOydtCDsuZzqtazrk6TsnYAgaW52YWxpZGF0ZSDsspjrpqztlbTspI3ri4jri6QuXG4gICAgLy8g7J20IO2YuOy2nOydgCDslYTrnpggc3luY+uztOuLpCDrrLTsobDqsbQg66i87KCAIOydvOyWtOuCmOyVvCDtlanri4jri6QhXG4gICAgLy8g7Jmc64OQ7ZWY66m0IHN5bmPsl5DshJzripQg67OA6rK965CcIG1vZGVsIOy9lOuTnOulvCDsg4jroZwgaW1wb3J07ZW07IScIOyymOumrO2VtOyVvCDtlZjripQg6rK97Jqw64+EIOyeiOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgYXdhaXQgdGhpcy5pbnZhbGlkYXRlRGVwZW5kZW50c0FmZmVjdGVkQnlGaWxlRXZlbnRzKGhtckFjdGlvblJlcXVpcmVkRXZlbnRzKTtcblxuICAgIC8vIFN5bmMg7JiB7JetOiBjaGVja3N1bVBhdHRlcm5Hcm91cOyXkCDrqoXsi5zrkJwg7YyM7J2865Ok7JeQIOuMgO2VnCDrs4Drj5nsnYAgc3luY1RyaWdnZXJpbmdQYXRoc+uhnCDsnqHtnpnri4jri6QuXG4gICAgLy8g7J20IOy5nOq1rOuTpOydgCDsoIHsoIjtlZwgc3luYyDsnpHsl4XsnLzroZwg64yA7J2R7ZWp64uI64ukLlxuICAgIGlmIChzeW5jVHJpZ2dlcmluZ1BhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhzeW5jVHJpZ2dlcmluZ1BhdGhzKTtcbiAgICB9XG5cbiAgICAvLyDsi7Htgawg7J6R7JeF7J20IOuBneuCrOycvOuptCDrrLTsp4DshLEg66Gc65Oc66W8IOyImO2Wie2VqeuLiOuLpC5cbiAgICAvLyDsi7Htgazrpbwg7JWIIO2VnCDqsr3smrDsl5Drj4Qg66Gc65Oc64qUIO2VtOyVvCDtlbTsmpQuIOychOyXkOyEnCDqtIDroKjsnojripQg7Lmc6rWs65Ok7J2AIOuLpCBpbnZhbGlkYXRlIOuQmOyXiOqxsOuToOyalCFcbiAgICAvL1xuICAgIC8vIOuzgOqyveuQnCDtjIzsnbzrk6Tsl5Ag64yA7ZW07IScIOyDiOuhreqyjCDri7nqsqjsmKTripQobG9hZCkg7ZaJ7JyE64qUIGRvU3luY0FjdGlvbnPsl5DshJwg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAvLyBkb1N5bmNBY3Rpb25z7JeQ7ISc64qUIO2MjOydvOydhCDsnb3qs6Ag66eM65Oc64qUIOyLse2BrCDtlonsnITrp4wg7ZWp64uI64ukLlxuICAgIC8vIOqxsOq4sOyEnCDrlLEg67OA6rK965CcIOu2gOu2hOyXkCDsmIHtlqXrsJvripQgYXV0b2xvYWTrp4wg7ISg67OE7ZW07IScIOyImO2Wie2VmOugpOuptCDrhIjrrLQg7KeA7KCA67aE7ZWY6rOgIOuzteyeoe2VtOynkeuLiOuLpC5cbiAgICAvL1xuICAgIC8vIO2NvO2PrOuovOyKpCDsmIHtlqXsnYAg66y07Iuc7ZW064+EIOyii+yKteuLiOuLpC5cbiAgICAvLyDslrTssKjtlLwgaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFNzclJvdXRlcygpO1xuXG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SG1yQWN0aW9uUmVxdWlyZWRGaWxlRXZlbnRzKFxuICAgIGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPixcbiAgKTogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+IHtcbiAgICBjb25zdCBhcGlTcmMgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBpZiAoIWZpbGVQYXRoLnN0YXJ0c1dpdGgoYXBpU3JjKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5zZXQoZmlsZVBhdGgsIGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXh0cmFjdFN5bmNUcmlnZ2VyaW5nRmlsZUV2ZW50UGF0aHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gICAgY29uc3Qgc3luY1RyaWdnZXJpbmdQYXRoczogQWJzb2x1dGVQYXRoW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGhdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoY2hlY2tQYXR0ZXJuR3JvdXApLnNvbWUoKHBhdHRlcm4pID0+XG4gICAgICAgIG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICAgKTtcbiAgICAgIGlmICghaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgc3luY1RyaWdnZXJpbmdQYXRocy5wdXNoKGRpZmZGaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN5bmNUcmlnZ2VyaW5nUGF0aHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGludmFsaWRhdGVEZXBlbmRlbnRzQWZmZWN0ZWRCeUZpbGVFdmVudHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApIHtcbiAgICBmb3IgKGNvbnN0IFtkaWZmRmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAvLyDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICAgIGlmIChpbnZhbGlkYXRlZFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGDwn5SEIEludmFsaWRhdGVkOmApKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIOunjOyVvSBtb2RlbC50cyDtjIzsnbzsnbQg67OA6rK9KGludmFsaWRhdGUp65CY7JeI64ukPyDqt7jrn6zrqbQgcmVnaXN0ZXJlZEFwaXMg7KSR7JeQ7IScIOydtCDrqqjrjbjsl5Ag7ZW064u57ZWY64qUIGFwaeuTpOydgCDsp4Dsm4zspJjsmpQuXG4gICAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgICAgIC8vIOuUsOudvOyEnCBtb2RlbC50cyDtjIzsnbzsnZgg67OA6rK97Jy866GcIOuLpOydjOuyiCDsg4jroZzsmrQgZXZhbOydtCDsmIjsg4HrkJjripQg7J20IOyLnOygkOyXkOyEnOunjCwg7J20IOuqqOuNuOyXkOyEnCDrgpjsmKggcmVnaXN0ZXJlZEFwaXPrk6TsnYQg7KeA7JuM7KSEIOyImCDsnojsirXri4jri6QuXG4gICAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRBcGlzID0gdGhpcy5yZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKGludmFsaWRhdGVkUGF0aCk7XG4gICAgICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCksXG4gICAgICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byByZW1vdmUgaW52YWxpZGF0ZWQgcmVnaXN0ZXJlZCBBUElzIGZvciAke2ludmFsaWRhdGVkUGF0aH1gKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wsIOuzgOqyveuQnCDshozsiqQg7YyM7J287J2EIFZpdGVzdCDrqqjrk4gg6re4656Y7ZSE7JeQ7ISc64+EIOustO2aqO2ZlO2VqeuLiOuLpC5cbiAgICAgIC8vIFZpdGXsnZggbW9kdWxlR3JhcGguaW52YWxpZGF0ZU1vZHVsZSgp7J20IGltcG9ydGVyIOuwqe2WpeycvOuhnCDsnqzqt4DsoIEgY2FzY2FkZe2VmOuvgOuhnCxcbiAgICAgIC8vIOyGjOyKpCDtjIzsnbwg7ZWY64KY66eMIOustO2aqO2ZlO2VmOuptCDsnbTrpbwgaW1wb3J07ZWY64qUIO2FjOyKpO2KuCDtjIzsnbzrj4Qg7J6Q64+Z7Jy866GcIOustO2aqO2ZlOuQqeuLiOuLpC5cbiAgICAgIGlmICghaXNUZXN0KCkgJiYgU29uYW11LmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQgJiYgU29uYW11LmRldlZpdGVzdE1hbmFnZXIpIHtcbiAgICAgICAgU29uYW11LmRldlZpdGVzdE1hbmFnZXIuaW52YWxpZGF0ZUZpbGVzKFtkaWZmRmlsZVBhdGhdKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZGltKGBUZXN0IGludmFsaWRhdGVkOiAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBkaWZmRmlsZVBhdGgpfWApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoXG4gICAgaW52YWxpZGF0ZWRQYXRoOiBBYnNvbHV0ZVBhdGgsXG4gICk6ICh0eXBlb2YgcmVnaXN0ZXJlZEFwaXMpW251bWJlcl1bXSB7XG4gICAgLy8g7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLlxuICAgIGNvbnN0IGlzTW9kZWwgPSBpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIik7XG4gICAgY29uc3QgaXNGcmFtZSA9IGludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKTtcbiAgICBpZiAoIWlzTW9kZWwgJiYgIWlzRnJhbWUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChpbnZhbGlkYXRlZFBhdGgpO1xuICAgIGNvbnN0IHRhcmdldE1vZGVsTmFtZSA9IGAke2VudGl0eUlkfSR7aXNNb2RlbCA/IFwiTW9kZWxcIiA6IFwiRnJhbWVcIn1gO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IHRhcmdldE1vZGVsTmFtZSk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgdG9SZW1vdmUpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKTtcbiAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRBcGlzLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b1JlbW92ZTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkVHlwZXMoKSB7XG4gICAgdGhpcy50eXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRNb2RlbHMoKSB7XG4gICAgdGhpcy5tb2RlbHMgPSBhd2FpdCBsb2FkTW9kZWxzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZEFwaXMoKSB7XG4gICAgdGhpcy5hcGlzID0gYXdhaXQgbG9hZEFwaXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkV29ya2Zsb3dzKCkge1xuICAgIHRoaXMud29ya2Zsb3dzID0gYXdhaXQgbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IFNvbmFtdS53b3JrZmxvd3Muc3luY2hyb25pemUodGhpcy53b3JrZmxvd3MpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRTc3JSb3V0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3NyQ29uZmlnUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL3NzclwiKTtcblxuICAgIC8vIOq4sOyhtCByb3V0ZXMg7LSI6riw7ZmUXG4gICAgY29uc3QgeyBjbGVhclNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgIGNsZWFyU1NSUm91dGVzKCk7XG5cbiAgICAvLyBzc3Ig7Y+0642UIOyXhuycvOuptCDsiqTtgrVcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoc3NyQ29uZmlnUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3NyIO2PtOuNlCDslYjsnZgg66qo65OgIC50cyDtjIzsnbwg66Gc65OcXG4gICAgY29uc3QgeyBnbG9iQXN5bmMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgaW1wb3J0TWVtYmVycyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZXNtLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgcnVudGltZVBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIik7XG5cbiAgICAvLyBydW50aW1lUGF0aOulvCDsgqzsmqntlZjsl6wg6rCc67CcL+2UhOuhnOuNleyFmCDtmZjqsr3sl5Ag66ee64qUIO2ZleyepeyekCDsspjrpqxcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhwYXRoLmpvaW4oc3NyQ29uZmlnUGF0aCwgcnVudGltZVBhdGgoXCIqKi8qLnRzXCIpKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZWY66m0IO2MjOydvOydmCBzaWRlIGVmZmVjdChyZWdpc3RlclNTUiDtmLjstpwp6rCAIOyLpO2WieuQqFxuICAgICAgICBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTU1Igcm91dGU6ICR7ZmlsZX1gLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IEZpbGVUeXBlW10gfT4ge1xuICAgIGNvbnN0IGRpZmZHcm91cHMgPSB0aGlzLmNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVQYXRocyk7XG4gICAgY29uc3QgZGlmZlR5cGVzID0gT2JqZWN0LmtleXMoZGlmZkdyb3VwcykgYXMgRmlsZVR5cGVbXTtcblxuICAgIC8vIOyXrOq4sOuKlCDrs4TroZwg7KSR7JqU7ZWcIO2MjO2KuOuKlCDslYTri5nri4jri6QuXG4gICAgLy8g7JWE656Y7J2YIGlmIOyghOqwnOulvCDquZTrgZTtlZjqsowg7ZWY66Ck6rOgIOunjOuToCBEU0wg6rCZ7J2AIOqxsOudvOyEnCwg66y07Iuc7ZWY7IWU64+EIOuQqeuLiOuLpC5cbiAgICBjb25zdCB7IGNoYW5nZU1hdGNoZXMsIG5vdGhpbmdNYXRjaGVzLCB1bmhhbmRsZWRQYXRocyB9ID0gdGhpcy5jaGFuZ2VNYXRjaGVyKFxuICAgICAgZGlmZlR5cGVzLFxuICAgICAgZGlmZkdyb3VwcyxcbiAgICApO1xuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJlbnRpdHlcIiwgXCJ0eXBlc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJtb2RlbFwiLCBcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcInR5cGVzXCIsIFwiZnVuY3Rpb25zXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJjb25maWdcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29uZmlnQ2hhbmdlcyhkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcImkxOG5cIiwgXCJlbnRpdHlcIiAvKuugiOydtOu4lCovLCBcImNvbmZpZ1wiIC8qZGVmYXVsdExvY2FsZeuTsSovKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVTb25hbXVEaWN0aW9uYXJ5UmVsYXRlZENoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKG5vdGhpbmdNYXRjaGVzKCkpIHtcbiAgICAgIC8vIO2MjOydvCDrs4Dqsr3snYAg6rCQ7KeA65CY7JeI7Jy864KYIOyggCDsnIQg7Ja064qQIGNoYW5nZU1hdGNoZXPsl5Drj4Qg6rG466as7KeAIOyViuydgCDtjIzsnbzrk6TsnbQgZHJpZnRz7J6F64uI64ukLlxuICAgICAgLy8gc3luY2Vy64qUIOyGjOyKpOydmCDrs4Dqsr3sl5DripQg67CY7J2R7ZWY7KeA66eMIOyCsOy2nOusvOydmCDrs4Dqsr0oZHJpZnQp7JeQ64qUIOyngeygkeyggeycvOuhnCDrsJjsnZHtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgICAgLy8g64yA7IugIOydtCBkcmlmdOyXkCDrjIDtlbQg6rK96rOgIOygleuPhOunjCDstpzroKXtlbTspI3ri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZURyaWZ0cyh1bmhhbmRsZWRQYXRocygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pOiBEaWZmR3JvdXBzIHtcbiAgICBjb25zdCBwYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cCgpO1xuICAgIGNvbnN0IGZpbGVUeXBlcyA9IE9iamVjdC5rZXlzKHBhdHRlcm5Hcm91cCkgYXMgRmlsZVR5cGVbXTtcblxuICAgIHJldHVybiBncm91cChkaWZmRmlsZXMsIChmaWxlUGF0aCkgPT4ge1xuICAgICAgLy8g7KCI64yAIOqyveuhnCDihpIgYXBwUm9vdCDquLDspIAg7IOB64yAIOqyveuhnCAo7JiIOiBcImFwaS9zcmMvLi4uXCIsIFwid2ViL3NyYy8uLi5cIilcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIuLlwiKSkgcmV0dXJuIFwidW5rbm93blwiO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVUeXBlIG9mIGZpbGVUeXBlcykge1xuICAgICAgICBpZiAobWluaW1hdGNoKHJlbGF0aXZlUGF0aCwgcGF0dGVybkdyb3VwW2ZpbGVUeXBlXSkpIHtcbiAgICAgICAgICByZXR1cm4gZmlsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgICB9KSBhcyB1bmtub3duIGFzIERpZmZHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZU1hdGNoZXIoZGlmZlR5cGVzOiBGaWxlVHlwZVtdLCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKSB7XG4gICAgY29uc3QgaGFuZGxlZCA9IG5ldyBTZXQ8RmlsZVR5cGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiDrs4Dqsr0g7IKs7ZWt7J20IOyduOyekOuhnCDrsJvsnYAgRmlsZVR5cGXrk6Qg7KSRIO2VmOuCmCDsnbTsg4HsnYQg7Y+s7ZWo7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICAgKiDqsIDroLkgW1wiZW50aXR5XCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImVudGl0eVwiKeuKlCB0cnll66W8IOuwmO2ZmO2VmOupsCxcbiAgICAgKiBbXCJ0eXBlc1wiLCBcImkxOG5cIl3snbQg67OA6rK965CcIO2YuOy2nOyXkOyEnCBjaGFuZ2VNYXRjaGVzKFwidHlwZXNcIiwgXCJmdW5jdGlvbnNcIinrj4QgdHJ1ZeulvCDrsJjtmZjtlZjsp4Drp4wsXG4gICAgICogW1wiZnVuY3Rpb25zXCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImZyYW1lXCIp7J2AIGZhbHNl66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiBAcGFyYW0gdHlwZXNcbiAgICAgKi9cbiAgICBjb25zdCBjaGFuZ2VNYXRjaGVzID0gKC4uLnR5cGVzOiBGaWxlVHlwZVtdKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IHR5cGVzLmZpbHRlcigodCkgPT4gZGlmZlR5cGVzLmluY2x1ZGVzKHQpKTtcbiAgICAgIG1hdGNoaW5nLmZvckVhY2goKHQpID0+IGhhbmRsZWQuYWRkKHQpKTtcbiAgICAgIHJldHVybiBtYXRjaGluZy5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBjaGFuZ2VNYXRjaGVz66GcIOunpOy5reuQnCDqsoPsnbQg7ZWY64KY64+EIOyXhuuKlOyngCDsl6zrtoDrpbwg6rCA7KC47Ji164uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IG5vdGhpbmdNYXRjaGVzID0gKCkgPT4gaGFuZGxlZC5zaXplID09PSAwO1xuXG4gICAgLyoqXG4gICAgICog7Ja065akIGNoYW5nZU1hdGNoZXMg7Zi47Lac7JeQ64+EIOqxuOumrOyngCDslYrsnYAgRmlsZVR5cGXrk6TsnZgg7Iuk7KCcIO2MjOydvCDqsr3roZzrpbwg66qo7JWE7IScIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBjb25zdCB1bmhhbmRsZWRQYXRocyA9ICgpOiBBYnNvbHV0ZVBhdGhbXSA9PlxuICAgICAgZGlmZlR5cGVzLmZpbHRlcigodCkgPT4gIWhhbmRsZWQuaGFzKHQpKS5mbGF0TWFwKCh0KSA9PiBkaWZmR3JvdXBzW3RdID8/IFtdKTtcblxuICAgIHJldHVybiB7IGNoYW5nZU1hdGNoZXMsIG5vdGhpbmdNYXRjaGVzLCB1bmhhbmRsZWRQYXRocyB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlQYXRoID0gZGlmZkdyb3Vwcy5lbnRpdHk/LmF0KDApO1xuICAgIGlmIChlbnRpdHlQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGVudGl0eVBhdGgpO1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAvLyDtlITroZzsoJ3tirjsl5Ag7IOd7ISx65CY7Ja07JW8IO2VmOuKlCAudHMg7YyM7J287J2YIOqyveuhnOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IHR5cGVGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLmZzfS8ke2VudGl0eS5uYW1lcy5mc30udHlwZXMudHNgLFxuICAgICAgKSBhcyBBYnNvbHV0ZVBhdGg7XG5cbiAgICAgIGlmIChlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiAhKGF3YWl0IGV4aXN0cyh0eXBlRmlsZVBhdGgpKSkge1xuICAgICAgICAvLyAqLnR5cGVzLnRz6rCAIOunjOuTpOyWtOynkeuLiOuLpC5cbiAgICAgICAgY29uc3QgdHlwZXMgPSBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSW5pdGlhbFR5cGVzKGVudGl0eUlkKTtcblxuICAgICAgICAvLyDqt7jqsbgg7YOA6rKf7JeQIOqwluuLpOuRrOyalC5cbiAgICAgICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHlwZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPqsIAg66eM65Ok7Ja07KeR64uI64ukLlxuICAgIGNvbnN0IGdlbmVyYXRlZCA9IGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk7XG5cbiAgICAvLyDrqqjrk6Ag6rKD65Ok7J2EIHRhcmdldOyXkCDrs7TrgrTsp4DripQg7JWK7Iq164uI64ukLlxuICAgIC8vIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz64qUIHNlcnZpY2Utc2lkZS1vbmx564uI6rmMIOuwsOygnO2VqeuLiOuLpC5cbiAgICAvLyBUT0RPKOuzkeykgCk6IOydtCDtlZjrk5zsvZTrk5zrpbwg64iE6rCAIO2VtOqysCDsooAg7ZW07KO87IS47JqULiDsnbzri6jsnYAg6rCQ64u5IOqwgOuKpe2VmOuLiCDrhpTrkZDqsqDsirXri4jri6QuLi5cbiAgICBjb25zdCBkaXN0cmlidXRhYmxlID0gZ2VuZXJhdGVkLmZpbHRlcigocCkgPT4gIXAuZW5kc1dpdGgoXCIuc3NvLnRzXCIpKTtcblxuICAgIC8vIOydtOygnCDrs7Trgrwg6rKD65Ok66eMIHRhcmdldOyXkCDrs7TrgrTsmpQuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMoZGlzdHJpYnV0YWJsZSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IG1lcmdlZEdyb3VwID0gWy4uLihkaWZmR3JvdXBzLm1vZGVsID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnJhbWUgPz8gW10pXTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSB8fCBtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgobW9kZWxQYXRoKTtcbiAgICAgICAgYXNzZXJ0KGVudGl0eUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVBdXhpbGlhcnlTeW1ib2xDaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFsuLi4oZGlmZkdyb3Vwcy50eXBlcyA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSldKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUNvbmZpZ0NoYW5nZXMoXzogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0NvbmZpZygpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlU29uYW11RGljdGlvbmFyeVJlbGF0ZWRDaGFuZ2VzKF86IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5KCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEcmlmdHMoZHJpZnRzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkcmlmdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgXCLimqDvuI8gU29uYW116rCAIOyekOuPmSDsg53shLHtlZwg7YyM7J287JeQIOuMgO2VnCDrs4Dqsr3snbQg6rCQ7KeA65CY7JeI7Iq164uI64ukLiDtjIzsnbzsnbQgU29uYW11IHdhdGNoZXIg7Jm467aA7JeQ7IScIOuzgOqyveuQnCDqsoPsnLzroZwg7LaU7KCV65Cp64uI64ukLlwiLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBkcmlmdHMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgICAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIHApfWApKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2FybihjaGFsay5kaW0oXCIgIOKGkiBgcG5wbSBzb25hbXUgc3luYyAtLWZvcmNlYOulvCDqtozsnqXtlanri4jri6QuXCIpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDthZztlIzrpr8g7YKk7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUtleSDthZztlIzrpr8g7YKkXG4gICAqIEBwYXJhbSBlbnVtSWQg7Je06rGw7ZiVIElEXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVLZXk6IFRlbXBsYXRlS2V5LFxuICAgIGVudW1JZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHN1YlBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZzsgaXNFeGlzdHM6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBnZW5QYXRoIH0gPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRUYXJnZXRBbmRQYXRoKFxuICAgICAgRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICBlbnVtSWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4odGFyZ2V0LCBnZW5QYXRoKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHN1YlBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJQYXRoLFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBpc0V4aXN0czogYXdhaXQgZXhpc3RzKGZ1bGxQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7Je06rGw7ZiV7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSBlbnVtcyDsl7TqsbDtmJUg66CI7J2067iUXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHMoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBlbnVtczoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHouWm9kRW51bTtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQkFXa0Q7YUFDWjtxQkFDa0I7WUFFbEI7dUJBRXdCO1lBRWxCO2tCQUVnQjttQkFDVjtpQkFDTjtlQUNGO29CQUVzQjtlQUNXO3FCQUNSO3dCQUNOO29CQUNtQztvQkFFaEI7cUJBRS9CO0NBTXBDLFNBQWIsTUFBb0I7RUFDbEIsT0FBbUIsQ0FBQztFQUNwQixRQUFxQixDQUFDO0VBQ3RCLFNBQXVCLENBQUM7RUFDeEIsNEJBQTZDLElBQUksSUFBSTtFQUNyRCxlQUE2QixJQUFJLGFBQWE7Ozs7OztFQU85QyxNQUFNLE9BQXNCO0dBSTFCLE1BQU1BLHFDQUFtRDtHQUN6RCxNQUFNQyx3Q0FBc0Q7R0FHNUQsTUFBTSxlQUFlLE1BQU0sK0JBQStCO0dBQzFELElBQUksYUFBYSxXQUFXLEdBQUc7SUFDN0IsUUFBUSxJQUFJLE1BQU0sTUFBTSxRQUFRLFdBQVcsdUJBQXVCLENBQUMsQ0FBQztJQUNwRTtHQUNGO0dBS0EsTUFBTSx3QkFDSixZQUFZO0lBRVYsTUFBTSxLQUFLLGNBQWMsWUFBWTtJQUdyQyxNQUFNLGVBQWU7R0FDdkIsR0FDQTtJQUFFLGlCQUFpQjtJQUFXLGFBQWE7R0FBTSxDQUNuRDtFQUNGOzs7Ozs7OztFQVNBLE1BQU0sWUFBMkI7R0FDL0IsTUFBTSxXQUFXLEtBQUssS0FBSyxPQUFPLGFBQWEsYUFBYTtHQUM1RCxJQUFJLE1BQU0sT0FBTyxRQUFRLEdBQ3ZCLE1BQU0sT0FBTyxRQUFRO0dBRXZCLE1BQU0sS0FBSyxLQUFLO0VBQ2xCOzs7Ozs7Ozs7Ozs7OztFQWVBLE1BQU0sV0FBVyxZ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
417
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2VyLmpzIiwibmFtZXMiOlsiU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSHR0cFZhbGlkYXRvcnMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVJbml0aWFsVHlwZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIlN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzIiwiU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMiLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWciLCJTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNTb25hbXVEaWN0aW9uYXJ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNlci9zeW5jZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBob3QgfSBmcm9tIFwiQHNvbmFtdS1raXQvaG1yLWhvb2tcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB0eXBlIHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4uL3Rhc2tzL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgR2VuZXJhdGVPcHRpb25zLCB0eXBlIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXAsIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgc3luY2VyRmlsZUV4aXN0cywgc3luY2VyRmlsZXN5c3RlbSB9IGZyb20gXCIuL2ZpbGVzeXN0ZW0tZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBsb2FkQXBpcywgbG9hZE1vZGVscywgbG9hZFR5cGVzLCBsb2FkV29ya2Zsb3dzIH0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuaW1wb3J0IHsgdHlwZSBMb2FkZWRBcGlzLCB0eXBlIExvYWRlZE1vZGVscywgdHlwZSBMb2FkZWRUeXBlcyB9IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCAqIGFzIFN5bmNlckFjdGlvbnMgZnJvbSBcIi4vc3luY2VyLWFjdGlvbnNcIjtcblxudHlwZSBEaWZmR3JvdXBLZXkgPSBGaWxlVHlwZSB8IFwidW5rbm93blwiO1xudHlwZSBEaWZmR3JvdXBzID0gUGFydGlhbDxSZWNvcmQ8RGlmZkdyb3VwS2V5LCBBYnNvbHV0ZVBhdGhbXT4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN5bmNlckRlcGVuZGVuY2llcyB7XG4gIGFjdGlvbkNvcHlTaGFyZWRUb1RhcmdldHNJZk5vdEV4aXN0czogdHlwZW9mIFN5bmNlckFjdGlvbnMuYWN0aW9uQ29weVNoYXJlZFRvVGFyZ2V0c0lmTm90RXhpc3RzO1xuICBhY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzOiB0eXBlb2YgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzO1xuICBhY3Rpb25HZW5lcmF0ZVNzckVudHJ5U2VydmVySWZOb3RFeGlzdHM6IHR5cGVvZiBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cztcbiAgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zOiB0eXBlb2YgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zO1xuICByZW5ld0NoZWNrc3VtczogdHlwZW9mIHJlbmV3Q2hlY2tzdW1zO1xufVxuXG5jb25zdCBkZWZhdWx0U3luY2VyRGVwZW5kZW5jaWVzOiBTeW5jZXJEZXBlbmRlbmNpZXMgPSB7XG4gIGFjdGlvbkNvcHlTaGFyZWRUb1RhcmdldHNJZk5vdEV4aXN0czogU3luY2VyQWN0aW9ucy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMsXG4gIGFjdGlvbkdlbmVyYXRlSHR0cFZhbGlkYXRvcnM6IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVIdHRwVmFsaWRhdG9ycyxcbiAgYWN0aW9uR2VuZXJhdGVTc3JFbnRyeVNlcnZlcklmTm90RXhpc3RzOiBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU3NyRW50cnlTZXJ2ZXJJZk5vdEV4aXN0cyxcbiAgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLFxuICByZW5ld0NoZWNrc3Vtcyxcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiBTeW5jZXJEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U3luY2VyRGVwZW5kZW5jaWVzKSB7fVxuXG4gIC8qKlxuICAgKiDssrTtgazshKzsnbQg67OA6rK965CcIOu2gOu2hOyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICogZGV2IOyEnOuyhOqwgCDsspjsnYwg65a07J2EIOuVjCwgc29uYW11IHN5bmMg7ZWgIOuVjCDsi6TtlonrkKnri4jri6QuIOydtO2bhOyXkOuKlCBobXJBbmRTeW5jIOqyveuhnOulvCDtg4DsmpQuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOy0iOq4sCDrtoDtirjsiqTtirjrnqkhIOyWmOuEpOuTpOydgCBpZGVtcG90ZW507ZWY6rOgIOqwgOuzjeq4sCDrlYzrrLjsl5Ag66y07KeA7ISxIOyLpO2Wie2VtOuPhCDrkKnri4jri6QuXG4gICAgLy8g7JaY64Sk65Ok7J2AIHNvbmFtdS5sb2Nr7JeQIOuTpOyWtOqwgOyngOuPhCDslYrqs6Ag65Sw65287IScIEhNUiDqsr3roZzrpbwg7YOA7KeA64+EIOyViuuKlCDsuZzqtazrk6TsnoXri4jri6QuXG4gICAgLy8g6re4656Y7IScIOyVhOustCDrlYzrgpgg6re464OlIOuPjOugpOyjvOuptCDrkJjripTrjbAsIGhtckFuZFN5bmPsl5DshJwg66ek67KIIO2VmOuKlCDqsoPsnYAg64Kt67mE7J2064uIIOyXrOq4sOyEnCDtlZwg67KI66eMIO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmRlcGVuZGVuY2llcy5hY3Rpb25Db3B5U2hhcmVkVG9UYXJnZXRzSWZOb3RFeGlzdHMoKTtcbiAgICBhd2FpdCB0aGlzLmRlcGVuZGVuY2llcy5hY3Rpb25HZW5lcmF0ZVNzckVudHJ5U2VydmVySWZOb3RFeGlzdHMoKTtcblxuICAgIC8vIOuwlOuAkCDqsoPsnbQg7JeG7Jy866m0IOq3uOuDpSDrhJjslrTqsIDsmpQuXG4gICAgY29uc3QgY2hhbmdlZEZpbGVzID0gYXdhaXQgdGhpcy5kZXBlbmRlbmNpZXMuZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk7XG4gICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnJlY29uY2lsZUh0dHBWYWxpZGF0b3JSZWdpc3RyeSgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVwZW5kZW5jaWVzLnJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsl6zquLDshJwg7Iuk7KCcIOyLse2BrCDrj5nsnpHsnYQg7IiY7ZaJ7ZWp64uI64ukLlxuICAgIC8vIOuLpOunjCDsi7Htgawg7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73snLzrqbQg6rys7Jes67KE66as6riwIOuVjOusuOyXkCxcbiAgICAvLyDsi5zqt7jrhJDsl5Drj4Qg7J6g7IucIOuyhO2LuCDsiJgg7J6I64qUIO2ZmOqyvSDsho3sl5DshJwg7Iux7YGs66W8IOyLpO2Wie2VqeuLiOuLpC5cbiAgICBhd2FpdCBydW5XaXRoR3JhY2VmdWxTaHV0ZG93bihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g7JaY6rCAIOyLse2BrCDsnpHsl4Ug7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKGNoYW5nZWRGaWxlcyk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb25jaWxlSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KCk7XG5cbiAgICAgICAgLy8g7Iux7YGsIOyVoeyFmOydtCDrgZ3rgpjrqbQg7ZWt7IOBIOyytO2BrOyErOydhCDri6Tsi5wg6rCx7Iug7ZWp64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRlcGVuZGVuY2llcy5yZW5ld0NoZWNrc3VtcygpO1xuICAgICAgfSxcbiAgICAgIHsgd2hlblRoaXNIYXBwZW5zOiBcIlNJR1VTUjJcIiwgd2FpdEZvclVwVG86IDIwMDAwIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb25jaWxlSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHJlZ2lzdHJ5UGF0aCA9IHBhdGguam9pbihcbiAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZC50c1wiLFxuICAgICk7XG4gICAgY29uc3QgcG9saWN5ID0gU29uYW11LmNvbmZpZy52YWxpZGF0aW9uPy56b2RDb21waWxlcjtcbiAgICBjb25zdCBpc0FvdCA9IGlzT2JqZWN0VmFsdWUocG9saWN5KSAmJiBwb2xpY3kgIT09IG51bGwgJiYgcG9saWN5LmFwaSA9PT0gXCJhb3RcIjtcbiAgICBpZiAoaXNBb3QgPT09IChhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHJlZ2lzdHJ5UGF0aCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8g67OA6rK9IOuqqeuhneydtCByZWdpc3RyeSDsgq3soJzrpbwg64aT7LOQ64+EIGNoZWNrc3VtIOqwseyLoCDsoITsl5Ag7KCV7LGF6rO8IOyCsOy2nOusvOydhCDri6Tsi5wg66ee7Lal64uI64ukLlxuICAgIGF3YWl0IHRoaXMuZGVwZW5kZW5jaWVzLmFjdGlvbkdlbmVyYXRlSHR0cFZhbGlkYXRvcnMoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDqsJXsoJwg7ZKALeyLse2BrDogbG9ja+ydhCDrrLTsi5ztlZjqs6Ag7LKY7J2M67aA7YSwIOuLpOyLnCDsi7Htgaztlanri4jri6QuXG4gICAqXG4gICAqICoq7IKs7Jqp7LKYKio6IGdpdCBwb3N0LW1lcmdlIGhvb2ssIENJLCBkZXYg7ISc67KE7J2YIGBmYCDtlavtgqQuXG4gICAqICoq7Iuk7YyoIOyViOyghOyEsSoqOiDrj4TspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveyWtCBsb2NrIOyXhuuKlCDsg4Htg5zroZwg64Ko7JWE64+EIOustO2VtCDigJQg64uk7J2MIHN5bmPsl5DshJxcbiAgICogbG9jayDsl4bsnLzrqbQg7J6Q7Jew7Iqk65+96rKMIO2SgC3si7HtgazqsIAg7Yq466as6rGw65CY7Ja0IOyDiCBsb2Nr7J20IOyekeyEseuQqC5cbiAgICovXG4gIGFzeW5jIGZvcmNlU3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic29uYW11LmxvY2tcIik7XG4gICAgaWYgKGF3YWl0IHN5bmNlckZpbGVFeGlzdHMobG9ja1BhdGgpKSB7XG4gICAgICBhd2FpdCBzeW5jZXJGaWxlc3lzdGVtLnVubGluayhsb2NrUGF0aCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAgYmF0Y2jroZwg66qo7J2AIOuzgOqyvSDtjIzsnbzrk6Tsl5Ag64yA7ZW0IO2VnCDrsojsnZggSE1SL3N5bmMg7IKs7J207YG07J2EIOuPleuLiOuLpC5cbiAgICpcbiAgICogSE1S7J2AIGFwaS9zcmMg7JWI7JeQ7IScIOydvOyWtOuCmOuKlCDrqqjrk6Ag7YyM7J2865Ok7JeQIOuMgO2VtOyEnCDsiJjtlontlanri4jri6QuXG4gICAqIGNoZWNrc3VtUGF0dGVybkdyb3VwIOunpOy5rSDsl6zrtoDsmYAg66y06rSA7ZWY6rKMIGFwaS9zcmMg7KCE7LK0IOuMgOyDgeyeheuLiOuLpC5cbiAgICog6rCA66C5IGFwaS9zcmMvdXRpbHMvc3Vic2V0LWxvYWRlcnMudHMg6rCZ7J2AIO2MjOydvOuPhCDrs4Dqsr3rkJjrqbQgSE1S7J2AIO2VtOykjeuLiOuLpC5cbiAgICpcbiAgICogU3luY+uKlCBjaGVja3N1bVBhdHRlcm5Hcm91cOycvOuhnCDrp6Tsua3rkJjripQg7YyM7J2865Ok7JeQIOuMgO2VtOyEnOunjCDsiJjtlontlanri4jri6QuXG4gICAqIOyXrOq4sOyXkOuKlCB3ZWIvc3Jj64KYIGFwcC9zcmMg6rCZ7J2AIOuLpOuluCB0YXJnZXTsnZgg7YyM7J287J20IO2PrO2VqOuQoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDsnbTrn7Agbm9uLWFwaSDqsr3roZzsnZgg7YyM7J2865Ok7J2AIEhNUuqzvOuKlCDslYTrrLQg7IOB6rSA7J20IOyXhuycvOuvgOuhnCwgaW52YWxpZGF0ZeydhCDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZUV2ZW50cyAtIHBhdGgg4oaSIGV2ZW50IOuntS4gZXZlbnTripQgXCJjaGFuZ2VcIiB8IFwiYWRkXCIuXG4gICAqL1xuICBhc3luYyBobXJBbmRTeW5jKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhtckFjdGlvblJlcXVpcmVkRXZlbnRzID0gdGhpcy5leHRyYWN0SG1yQWN0aW9uUmVxdWlyZWRGaWxlRXZlbnRzKGZpbGVFdmVudHMpO1xuICAgIGNvbnN0IHN5bmNUcmlnZ2VyaW5nUGF0aHMgPSBhd2FpdCB0aGlzLmV4dHJhY3RTeW5jVHJpZ2dlcmluZ0ZpbGVFdmVudFBhdGhzKGZpbGVFdmVudHMpO1xuXG4gICAgLy8gSE1SIOyYgeyXrTog7YyM7J28IOydtOuypO2KuCDspJEgYXBp7J2YIOuqqOuTiCDqt7jrnpjtlITsl5Ag7J6I64qUIO2MjOydvOuTpOyXkCDrjIDtlZwg67OA64+Z7J2AIGhtckFjdGlvblJlcXVpcmVkRXZlbnRz66GcIOyeoe2emeuLiOuLpC5cbiAgICAvLyDsnbQg7Lmc6rWs65Ok7J2AIGludmFsaWRhdGUg7LKY66as7ZW07KSN64uI64ukLlxuICAgIC8vIOydtCDtmLjstpzsnYAg7JWE656YIHN5bmPrs7Tri6Qg66y07KGw6rG0IOuovOyggCDsnbzslrTrgpjslbwg7ZWp64uI64ukIVxuICAgIC8vIOyZnOuDkO2VmOuptCBzeW5j7JeQ7ISc64qUIOuzgOqyveuQnCBtb2RlbCDsvZTrk5zrpbwg7IOI66GcIGltcG9ydO2VtOyEnCDsspjrpqztlbTslbwg7ZWY64qUIOqyveyasOuPhCDsnojquLAg65WM66y47J6F64uI64ukLlxuICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZURlcGVuZGVudHNBZmZlY3RlZEJ5RmlsZUV2ZW50cyhobXJBY3Rpb25SZXF1aXJlZEV2ZW50cyk7XG5cbiAgICAvLyBTeW5jIOyYgeyXrTogY2hlY2tzdW1QYXR0ZXJuR3JvdXDsl5Ag66qF7Iuc65CcIO2MjOydvOuTpOyXkCDrjIDtlZwg67OA64+Z7J2AIHN5bmNUcmlnZ2VyaW5nUGF0aHProZwg7J6h7Z6Z64uI64ukLlxuICAgIC8vIOydtCDsuZzqtazrk6TsnYAg7KCB7KCI7ZWcIHN5bmMg7J6R7JeF7Jy866GcIOuMgOydke2VqeuLiOuLpC5cbiAgICBpZiAoc3luY1RyaWdnZXJpbmdQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoc3luY1RyaWdnZXJpbmdQYXRocyk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgqzsnLzrqbQg66y07KeA7ISxIOuhnOuTnOulvCDsiJjtlontlanri4jri6QuXG4gICAgLy8g7Iux7YGs66W8IOyViCDtlZwg6rK97Jqw7JeQ64+EIOuhnOuTnOuKlCDtlbTslbwg7ZW07JqULiDsnITsl5DshJwg6rSA66Co7J6I64qUIOy5nOq1rOuTpOydgCDri6QgaW52YWxpZGF0ZSDrkJjsl4jqsbDrk6DsmpQhXG4gICAgLy9cbiAgICAvLyDrs4Dqsr3rkJwg7YyM7J2865Ok7JeQIOuMgO2VtOyEnCDsg4jroa3qsowg64u56rKo7Jik64qUKGxvYWQpIO2WieychOuKlCBkb1N5bmNBY3Rpb25z7JeQ7IScIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgLy8gZG9TeW5jQWN0aW9uc+yXkOyEnOuKlCDtjIzsnbzsnYQg7J296rOgIOunjOuTnOuKlCDsi7Htgawg7ZaJ7JyE66eMIO2VqeuLiOuLpC5cbiAgICAvLyDqsbDquLDshJwg65SxIOuzgOqyveuQnCDrtoDrtoTsl5Ag7JiB7Zal67Cb64qUIGF1dG9sb2Fk66eMIOyEoOuzhO2VtOyEnCDsiJjtlontlZjroKTrqbQg64SI66y0IOyngOyggOu2hO2VmOqzoCDrs7XsnqHtlbTsp5Hri4jri6QuXG4gICAgLy9cbiAgICAvLyDtjbztj6zrqLzsiqQg7JiB7Zal7J2AIOustOyLnO2VtOuPhCDsoovsirXri4jri6QuXG4gICAgLy8g7Ja07LCo7ZS8IGhtci1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRTc3JSb3V0ZXMoKTtcbiAgICBhd2FpdCBTb25hbXUucmVmcmVzaEh0dHBWYWxpZGF0b3JzKCk7XG5cbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RIbXJBY3Rpb25SZXF1aXJlZEZpbGVFdmVudHMoXG4gICAgZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+LFxuICApOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4ge1xuICAgIGNvbnN0IGFwaVNyYyA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4oKTtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZXZlbnRdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGlmICghZmlsZVBhdGguc3RhcnRzV2l0aChhcGlTcmMpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnNldChmaWxlUGF0aCwgZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleHRyYWN0U3luY1RyaWdnZXJpbmdGaWxlRXZlbnRQYXRocyhcbiAgICBmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4sXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICBjb25zdCBjaGVja1BhdHRlcm5Hcm91cCA9IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKTtcbiAgICBjb25zdCBzeW5jVHJpZ2dlcmluZ1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2RpZmZGaWxlUGF0aF0gb2YgZmlsZUV2ZW50cykge1xuICAgICAgY29uc3QgaXNJbkNoZWNrUGF0dGVybkdyb3VwID0gT2JqZWN0LnZhbHVlcyhjaGVja1BhdHRlcm5Hcm91cCkuc29tZSgocGF0dGVybikgPT5cbiAgICAgICAgbWluaW1hdGNoKGRpZmZGaWxlUGF0aCwgcGF0dGVybiksXG4gICAgICApO1xuICAgICAgaWYgKCFpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzeW5jVHJpZ2dlcmluZ1BhdGhzLnB1c2goZGlmZkZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY1RyaWdnZXJpbmdQYXRocztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW52YWxpZGF0ZURlcGVuZGVudHNBZmZlY3RlZEJ5RmlsZUV2ZW50cyhcbiAgICBmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4sXG4gICkge1xuICAgIGZvciAoY29uc3QgW2RpZmZGaWxlUGF0aCwgZXZlbnRdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIC8vIOuzgOqyveuQnCDtjIzsnbzqs7wgZGVwZW5kZW50IO2MjOydvOuTpOydhCBpbnZhbGlkYXRlIO2VqeuLiOuLpC5cbiAgICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgICAgLy8g6re465+s64uIIOyViOyLrO2VmOqzoCBpbnZhbGlkYXRlIO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGhvdC5pbnZhbGlkYXRlRmlsZeyLnCDstIjquLAg7JeQ65+s6rCAIOuwnOyDne2VmOq4sCDrlYzrrLjsl5AgaW52YWxpZGF0ZSDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgICBjb25zdCBpbnZhbGlkYXRlZFBhdGhzID1cbiAgICAgICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoXG4gICAgICAgICAgICBkaWZmRmlsZVBhdGgsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICApKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICAgICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChg8J+UhCBJbnZhbGlkYXRlZDpgKSk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGludmFsaWRhdGVkUGF0aCBvZiBpbnZhbGlkYXRlZFBhdGhzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgICAgICAvLyByZWdpc3RlcmVkQXBpc+uKlCDthrXsnLzroZwg64ukIOuCoOugpOuyhOumtCDsiJgg7JeG7Iq164uI64ukLiByZWdpc3RlcmVkQXBpc+yXkCDsmKzrnbzsmKTripQg7Lmc6rWs65Ok7J2AIOy0iOq4sCDroZzrk5zsi5wg65iQ64qUIEhNUuyLnOyXkOunjCDrk7HroZ3rkJjquLAg65WM66y47J6F64uI64ukLlxuICAgICAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgICAgICBpZiAocmVtb3ZlZEFwaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICAgICAgY2hhbGsuZ3JheShgKHdpdGggJHtyZW1vdmVkQXBpcy5sZW5ndGh9IEFQSXMpYCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVtb3ZlIGludmFsaWRhdGVkIHJlZ2lzdGVyZWQgQVBJcyBmb3IgJHtpbnZhbGlkYXRlZFBhdGh9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGRldlJ1bm5lciDtmZzshLHtmZQg7IucLCDrs4Dqsr3rkJwg7IaM7IqkIO2MjOydvOydhCBWaXRlc3Qg66qo65OIIOq3uOuemO2UhOyXkOyEnOuPhCDrrLTtmqjtmZTtlanri4jri6QuXG4gICAgICAvLyBWaXRl7J2YIG1vZHVsZUdyYXBoLmludmFsaWRhdGVNb2R1bGUoKeydtCBpbXBvcnRlciDrsKntlqXsnLzroZwg7J6s6reA7KCBIGNhc2NhZGXtlZjrr4DroZwsXG4gICAgICAvLyDshozsiqQg7YyM7J28IO2VmOuCmOunjCDrrLTtmqjtmZTtlZjrqbQg7J2066W8IGltcG9ydO2VmOuKlCDthYzsiqTtirgg7YyM7J2864+EIOyekOuPmeycvOuhnCDrrLTtmqjtmZTrkKnri4jri6QuXG4gICAgICBpZiAoIWlzVGVzdCgpICYmIFNvbmFtdS5jb25maWcudGVzdD8uZGV2UnVubmVyPy5lbmFibGVkICYmIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyKSB7XG4gICAgICAgIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyLmludmFsaWRhdGVGaWxlcyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmRpbShgVGVzdCBpbnZhbGlkYXRlZDogJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgZGlmZkZpbGVQYXRoKX1gKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKFxuICAgIGludmFsaWRhdGVkUGF0aDogQWJzb2x1dGVQYXRoLFxuICApOiAodHlwZW9mIHJlZ2lzdGVyZWRBcGlzKVtudW1iZXJdW10ge1xuICAgIC8vIOyGjOyKpCDsvZTrk5zrpbwg64uk66Oo64qUIOyDge2ZqeydtOuLiCAudHMg6rK966Gc66GcIOu0heuLiOuLpC5cbiAgICBjb25zdCBpc01vZGVsID0gaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpO1xuICAgIGNvbnN0IGlzRnJhbWUgPSBpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIik7XG4gICAgaWYgKCFpc01vZGVsICYmICFpc0ZyYW1lKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICBjb25zdCB0YXJnZXRNb2RlbE5hbWUgPSBgJHtlbnRpdHlJZH0ke2lzTW9kZWwgPyBcIk1vZGVsXCIgOiBcIkZyYW1lXCJ9YDtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSB0YXJnZXRNb2RlbE5hbWUpO1xuICAgIGZvciAoY29uc3QgYXBpIG9mIHRvUmVtb3ZlKSB7XG4gICAgICBjb25zdCBpZHggPSByZWdpc3RlcmVkQXBpcy5pbmRleE9mKGFwaSk7XG4gICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICByZWdpc3RlcmVkQXBpcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZW1vdmU7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFdvcmtmbG93cygpIHtcbiAgICB0aGlzLndvcmtmbG93cyA9IGF3YWl0IGxvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCBTb25hbXUud29ya2Zsb3dzLnN5bmNocm9uaXplKHRoaXMud29ya2Zsb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkU3NyUm91dGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNzckNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9zc3JcIik7XG5cbiAgICAvLyDquLDsobQgcm91dGVzIOy0iOq4sO2ZlFxuICAgIGNvbnN0IHsgY2xlYXJTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICBjbGVhclNTUlJvdXRlcygpO1xuXG4gICAgLy8gc3NyIO2PtOuNlCDsl4bsnLzrqbQg7Iqk7YK1XG4gICAgaWYgKCEoYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhzc3JDb25maWdQYXRoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzc3Ig7Y+0642UIOyViOydmCDrqqjrk6AgLnRzIO2MjOydvCDroZzrk5xcbiAgICBjb25zdCB7IGdsb2JBc3luYyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIik7XG4gICAgY29uc3QgeyBpbXBvcnRNZW1iZXJzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9lc20tdXRpbHNcIik7XG4gICAgY29uc3QgeyBydW50aW1lUGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiKTtcblxuICAgIC8vIHJ1bnRpbWVQYXRo66W8IOyCrOyaqe2VmOyXrCDqsJzrsJwv7ZSE66Gc642V7IWYIO2ZmOqyveyXkCDrp57ripQg7ZmV7J6l7J6QIOyymOumrFxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYkFzeW5jKHBhdGguam9pbihzc3JDb25maWdQYXRoLCBydW50aW1lUGF0aChcIioqLyoudHNcIikpKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlZjrqbQg7YyM7J287J2YIHNpZGUgZWZmZWN0KHJlZ2lzdGVyU1NSIO2YuOy2nCnqsIAg7Iuk7ZaJ65CoXG4gICAgICAgIGF3YWl0IGltcG9ydE1lbWJlcnMoZmlsZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIFNTUiByb3V0ZTogJHtmaWxlfWAsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDsi6TsoJwg7Iux7YGs66W8IOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAqIOuzgOqyveuQnCDtjIzsnbzrk6TsnYQg7YOA7J6F67OE66GcIOu2hOulmO2VmOqzoCDqsIEg7YOA7J6F7JeQIOunnuuKlCDslaHshZjsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRocyAtIOuzgOqyveuQnCDtjIzsnbzrk6TsnZgg7KCI64yAIOqyveuhnCDrqqnroZ1cbiAgICogQHJldHVybnMgZGlmZlR5cGVzIC0g67OA6rK965CcIO2MjOydvOydmCDtg4DsnoUg66qp66GdIChlbnRpdHksIHR5cGVzLCBtb2RlbCDrk7EpXG4gICAqL1xuICBhc3luYyBkb1N5bmNBY3Rpb25zKGRpZmZGaWxlUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTx7IGRpZmZUeXBlczogRmlsZVR5cGVbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPVxuICAgICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBPYmplY3Qua2V5cyhcbiAgICAgICAgZGlmZkdyb3VwcyxcbiAgICAgICkgYXMgRmlsZVR5cGVbXTtcblxuICAgIC8vIOyXrOq4sOuKlCDrs4TroZwg7KSR7JqU7ZWcIO2MjO2KuOuKlCDslYTri5nri4jri6QuXG4gICAgLy8g7JWE656Y7J2YIGlmIOyghOqwnOulvCDquZTrgZTtlZjqsowg7ZWY66Ck6rOgIOunjOuToCBEU0wg6rCZ7J2AIOqxsOudvOyEnCwg66y07Iuc7ZWY7IWU64+EIOuQqeuLiOuLpC5cbiAgICBjb25zdCB7IGNoYW5nZU1hdGNoZXMsIG5vdGhpbmdNYXRjaGVzLCB1bmhhbmRsZWRQYXRocyB9ID0gdGhpcy5jaGFuZ2VNYXRjaGVyKFxuICAgICAgZGlmZlR5cGVzLFxuICAgICAgZGlmZkdyb3VwcyxcbiAgICApO1xuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJlbnRpdHlcIiwgXCJ0eXBlc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJtb2RlbFwiLCBcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlTWF0Y2hlcyhcInR5cGVzXCIsIFwiZnVuY3Rpb25zXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJjb25maWdcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29uZmlnQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VNYXRjaGVzKFwiaTE4blwiLCBcImVudGl0eVwiIC8q66CI7J2067iUKi8sIFwiY29uZmlnXCIgLypkZWZhdWx0TG9jYWxl65OxKi8pKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVNvbmFtdURpY3Rpb25hcnlSZWxhdGVkQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGFkYXRhQ2hhbmdlZCA9IGRpZmZUeXBlcy5zb21lKCh0eXBlKSA9PlxuICAgICAgW1wiZW50aXR5XCIsIFwidHlwZXNcIiwgXCJtb2RlbFwiLCBcImZyYW1lXCIsIFwiY29uZmlnXCJdLmluY2x1ZGVzKHR5cGUpLFxuICAgICk7XG4gICAgaWYgKGNoYW5nZU1hdGNoZXMoXCJodHRwVmFsaWRhdG9yc0dlbmVyYXRlZFwiKSAmJiAhbWV0YWRhdGFDaGFuZ2VkKSB7XG4gICAgICAvLyByZWdpc3RyeSDsnpDssrQgZHJpZnTripQg7LWc7IugIGluLW1lbW9yeSBtZXRhZGF0YeuhnCDsponsi5wg642u7Ja07I2oIGxvY2sg6rCx7IugIOyghOyXkCDsoJXtlanshLHsnYQg67O16rWs7ZWp64uI64ukLlxuICAgICAgYXdhaXQgdGhpcy5kZXBlbmRlbmNpZXMuYWN0aW9uR2VuZXJhdGVIdHRwVmFsaWRhdG9ycygpO1xuICAgIH1cblxuICAgIGlmIChtZXRhZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIOuqqOuToCDsg53shLEv67O17IKsIOyVoeyFmCDrkqQg7LWc7IugIG1ldGFkYXRh66W8IOuLpOyLnCDsnb3slrQgcmVnaXN0cnnrpbwg7ZWcIOuyiOunjCDtmZXsoJXtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgICBhd2FpdCB0aGlzLmRlcGVuZGVuY2llcy5hY3Rpb25HZW5lcmF0ZUh0dHBWYWxpZGF0b3JzKCk7XG4gICAgfVxuXG4gICAgaWYgKG5vdGhpbmdNYXRjaGVzKCkpIHtcbiAgICAgIC8vIO2MjOydvCDrs4Dqsr3snYAg6rCQ7KeA65CY7JeI7Jy864KYIOyggCDsnIQg7Ja064qQIGNoYW5nZU1hdGNoZXPsl5Drj4Qg6rG466as7KeAIOyViuydgCDtjIzsnbzrk6TsnbQgZHJpZnRz7J6F64uI64ukLlxuICAgICAgLy8gc3luY2Vy64qUIOyGjOyKpOydmCDrs4Dqsr3sl5DripQg67CY7J2R7ZWY7KeA66eMIOyCsOy2nOusvOydmCDrs4Dqsr0oZHJpZnQp7JeQ64qUIOyngeygkeyggeycvOuhnCDrsJjsnZHtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgICAgLy8g64yA7IugIOydtCBkcmlmdOyXkCDrjIDtlbQg6rK96rOgIOygleuPhOunjCDstpzroKXtlbTspI3ri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZURyaWZ0cyh1bmhhbmRsZWRQYXRocygpKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pIHtcbiAgICBjb25zdCBwYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cCgpO1xuICAgIGNvbnN0IGZpbGVUeXBlcyA9XG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICBwYXR0ZXJuR3JvdXAsXG4gICAgICApIGFzIEZpbGVUeXBlW107XG5cbiAgICBjb25zdCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzID0ge307XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBkaWZmRmlsZXMpIHtcbiAgICAgIC8vIOygiOuMgCDqsr3roZzrpbwgYXBwUm9vdCDquLDspIAg7IOB64yAIOqyveuhnOuhnCDrsJTqv5Qg7LK07YGs7ISsIO2MqO2EtOqzvCDruYTqtZDtlZzri6QuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgY29uc3QgZmlsZVR5cGUgPSBmaWxlVHlwZXMuZmluZCgoY2FuZGlkYXRlKSA9PlxuICAgICAgICBtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBwYXR0ZXJuR3JvdXBbY2FuZGlkYXRlXSksXG4gICAgICApO1xuICAgICAgY29uc3QgZ3JvdXBLZXk6IERpZmZHcm91cEtleSA9IHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi5cIilcbiAgICAgICAgPyBcInVua25vd25cIlxuICAgICAgICA6IChmaWxlVHlwZSA/PyBcInVua25vd25cIik7XG4gICAgICAoZGlmZkdyb3Vwc1tncm91cEtleV0gPz89IFtdKS5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpZmZHcm91cHM7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZU1hdGNoZXIoZGlmZlR5cGVzOiBGaWxlVHlwZVtdLCBkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKSB7XG4gICAgY29uc3QgaGFuZGxlZCA9IG5ldyBTZXQ8RmlsZVR5cGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiDrs4Dqsr0g7IKs7ZWt7J20IOyduOyekOuhnCDrsJvsnYAgRmlsZVR5cGXrk6Qg7KSRIO2VmOuCmCDsnbTsg4HsnYQg7Y+s7ZWo7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICAgKiDqsIDroLkgW1wiZW50aXR5XCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImVudGl0eVwiKeuKlCB0cnll66W8IOuwmO2ZmO2VmOupsCxcbiAgICAgKiBbXCJ0eXBlc1wiLCBcImkxOG5cIl3snbQg67OA6rK965CcIO2YuOy2nOyXkOyEnCBjaGFuZ2VNYXRjaGVzKFwidHlwZXNcIiwgXCJmdW5jdGlvbnNcIinrj4QgdHJ1ZeulvCDrsJjtmZjtlZjsp4Drp4wsXG4gICAgICogW1wiZnVuY3Rpb25zXCJd6rCAIOuzgOqyveuQnCDtmLjstpzsl5DshJwgY2hhbmdlTWF0Y2hlcyhcImZyYW1lXCIp7J2AIGZhbHNl66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKiBAcGFyYW0gdHlwZXNcbiAgICAgKi9cbiAgICBjb25zdCBjaGFuZ2VNYXRjaGVzID0gKC4uLnR5cGVzOiBGaWxlVHlwZVtdKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGluZyA9IHR5cGVzLmZpbHRlcigodCkgPT4gZGlmZlR5cGVzLmluY2x1ZGVzKHQpKTtcbiAgICAgIG1hdGNoaW5nLmZvckVhY2goKHQpID0+IGhhbmRsZWQuYWRkKHQpKTtcbiAgICAgIHJldHVybiBtYXRjaGluZy5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBjaGFuZ2VNYXRjaGVz66GcIOunpOy5reuQnCDqsoPsnbQg7ZWY64KY64+EIOyXhuuKlOyngCDsl6zrtoDrpbwg6rCA7KC47Ji164uI64ukLlxuICAgICAqL1xuICAgIGNvbnN0IG5vdGhpbmdNYXRjaGVzID0gKCkgPT4gaGFuZGxlZC5zaXplID09PSAwO1xuXG4gICAgLyoqXG4gICAgICog7Ja065akIGNoYW5nZU1hdGNoZXMg7Zi47Lac7JeQ64+EIOqxuOumrOyngCDslYrsnYAgRmlsZVR5cGXrk6TsnZgg7Iuk7KCcIO2MjOydvCDqsr3roZzrpbwg66qo7JWE7IScIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBjb25zdCB1bmhhbmRsZWRQYXRocyA9ICgpOiBBYnNvbHV0ZVBhdGhbXSA9PlxuICAgICAgZGlmZlR5cGVzLmZpbHRlcigodCkgPT4gIWhhbmRsZWQuaGFzKHQpKS5mbGF0TWFwKCh0KSA9PiBkaWZmR3JvdXBzW3RdID8/IFtdKTtcblxuICAgIHJldHVybiB7IGNoYW5nZU1hdGNoZXMsIG5vdGhpbmdNYXRjaGVzLCB1bmhhbmRsZWRQYXRocyB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlQYXRoID0gZGlmZkdyb3Vwcy5lbnRpdHk/LmF0KDApO1xuICAgIGlmIChlbnRpdHlQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGVudGl0eVBhdGgpO1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAvLyDtlITroZzsoJ3tirjsl5Ag7IOd7ISx65CY7Ja07JW8IO2VmOuKlCAudHMg7YyM7J287J2YIOqyveuhnOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IHR5cGVGaWxlUGF0aCA9XG4gICAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcGF0aC5qb2luKFxuICAgICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLmZzfS8ke2VudGl0eS5uYW1lcy5mc30udHlwZXMudHNgLFxuICAgICAgICApIGFzIEFic29sdXRlUGF0aDtcblxuICAgICAgaWYgKGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkICYmICEoYXdhaXQgc3luY2VyRmlsZUV4aXN0cyh0eXBlRmlsZVBhdGgpKSkge1xuICAgICAgICAvLyAqLnR5cGVzLnRz6rCAIOunjOuTpOyWtOynkeuLiOuLpC5cbiAgICAgICAgY29uc3QgdHlwZXMgPSBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlSW5pdGlhbFR5cGVzKGVudGl0eUlkKTtcblxuICAgICAgICAvLyDqt7jqsbgg7YOA6rKf7JeQIOqwluuLpOuRrOyalC5cbiAgICAgICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHlwZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPqsIAg66eM65Ok7Ja07KeR64uI64ukLlxuICAgIGNvbnN0IGdlbmVyYXRlZCA9IGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk7XG5cbiAgICAvLyDrqqjrk6Ag6rKD65Ok7J2EIHRhcmdldOyXkCDrs7TrgrTsp4DripQg7JWK7Iq164uI64ukLlxuICAgIC8vIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz64qUIHNlcnZpY2Utc2lkZS1vbmx564uI6rmMIOuwsOygnO2VqeuLiOuLpC5cbiAgICAvLyBUT0RPKOuzkeykgCk6IOydtCDtlZjrk5zsvZTrk5zrpbwg64iE6rCAIO2VtOqysCDsooAg7ZW07KO87IS47JqULiDsnbzri6jsnYAg6rCQ64u5IOqwgOuKpe2VmOuLiCDrhpTrkZDqsqDsirXri4jri6QuLi5cbiAgICBjb25zdCBkaXN0cmlidXRhYmxlID0gZ2VuZXJhdGVkLmZpbHRlcigocCkgPT4gIXAuZW5kc1dpdGgoXCIuc3NvLnRzXCIpKTtcblxuICAgIC8vIOydtOygnCDrs7Trgrwg6rKD65Ok66eMIHRhcmdldOyXkCDrs7TrgrTsmpQuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMoZGlzdHJpYnV0YWJsZSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IG1lcmdlZEdyb3VwID0gWy4uLihkaWZmR3JvdXBzLm1vZGVsID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnJhbWUgPz8gW10pXTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSB8fCBtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgobW9kZWxQYXRoKTtcbiAgICAgICAgYXNzZXJ0KGVudGl0eUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzclF1ZXJpZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUF1eGlsaWFyeVN5bWJvbENoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVBdXhpbGlhcnlTeW1ib2xDaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFsuLi4oZGlmZkdyb3Vwcy50eXBlcyA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSldKTtcbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUNvbmZpZ0NoYW5nZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIikge1xuICAgICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvY29uZmlnXCIpO1xuICAgICAgU29uYW11LmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoU29uYW11LmFwaVJvb3RQYXRoKTtcbiAgICB9XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVTb25hbXVEaWN0aW9uYXJ5UmVsYXRlZENoYW5nZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jU29uYW11RGljdGlvbmFyeSgpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRHJpZnRzKGRyaWZ0czogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZHJpZnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgIFwi4pqg77iPIFNvbmFtdeqwgCDsnpDrj5kg7IOd7ISx7ZWcIO2MjOydvOyXkCDrjIDtlZwg67OA6rK97J20IOqwkOyngOuQmOyXiOyKteuLiOuLpC4g7YyM7J287J20IFNvbmFtdSB3YXRjaGVyIOyZuOu2gOyXkOyEnCDrs4Dqsr3rkJwg6rKD7Jy866GcIOy2lOygleuQqeuLiOuLpC5cIixcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHAgb2YgZHJpZnRzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coYCAgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBwKX1gKSk7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oY2hhbGsuZGltKFwiICDihpIgYHBucG0gc29uYW11IHN5bmMgLS1mb3JjZWDrpbwg6raM7J6l7ZWp64uI64ukLlwiKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IHN5bmNlckZpbGVFeGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtO1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgc3luY2VyRmlsZUV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBzeW5jZXJGaWxlRXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvKiBTQUZFVFk6IFR5cGVTY3JpcHQgQVNUIO2MjOyLseqzvCDrj5nquLDtmZQg7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHt9IGFzIFJlY29yZDxcbiAgICAgICAgYCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCxcbiAgICAgICAgYm9vbGVhblxuICAgICAgPixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZGVwZW5kZW5jaWVzLnJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBVWtEO2FBQ1o7cUJBQ2tCO1lBRWxCO3VCQUV3QjtZQUVsQjtrQkFFZ0I7bUJBQ1Y7aUJBQ047b0JBRW9CO29CQUNWO2VBQ3FCO3FCQUNSO3dCQUNOO29CQUNtQzs4QkFFbEI7b0JBQ0U7cUJBRS9CO0NBYTNDLDRCQUFnRDtFQUNkQTtFQUNSQztFQUNXQztFQUN6QztFQUNBO0NBQ0Y7Q0FFYSxTQUFiLE1BQW9CO0VBT1c7RUFON0IsT0FBbUIsQ0FBQztFQUNwQixRQUFxQixDQUFDO0VBQ3RCLFNBQXVCLENBQUM7RUFDeEIsNEJBQTZDLElBQUksSUFBSTtFQUNyRCxlQUE2QixJQUFJLGFBQWE7RUFFOUMsWUFBWSxlQUFvRCwyQkFBMkI7R0FBOUQsS0FBQSxlQUFBO0VBQStEOzs7Ozs7RUFPNUYsTUFBTSxPQUFzQjtHQUkxQixNQUFNLEtBQUssYUFBYSxxQ0FBcUM7R0FDN0QsTUFBTSxLQUFLLGFBQWEsd0NBQXdDO0dBR2hFLE1BQU0sZUFBZSxNQUFNLEtBQUssYUFBYSwrQkFBK0I7R0FDNUUsSUFBSSxhQUFhLFdBQVcsR0FBRztJQUM3QixJQUFJLE1BQU0sS0FBSywrQkFBK0IsR0FDNUMsTUFBTSxLQUFLLGFBQWEsZUFBZTtJQUV6QyxRQUFRLElBQUksTUFBTSxNQUFNLFFBQVEsV0FBVyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3BFO0dBQ0Y7R0FLQSxNQUFN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
@@ -1 +1 @@
1
- {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/syncer/watcher.ts"],"names":[],"mappings":"AAKA,OAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAIpD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,GAAG,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAC/E,OAAO,CAAC,SAAS,CAAC,CAyDpB"}
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/syncer/watcher.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAS,MAAM,UAAU,CAAC;AAIjD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,GAAG,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAC/E,OAAO,CAAC,SAAS,CAAC,CA0DpB"}
@@ -8,14 +8,14 @@ import { strict } from "assert";
8
8
  import path from "path";
9
9
  import chalk from "chalk";
10
10
  import { minimatch } from "minimatch";
11
- import chokidar from "chokidar";
11
+ import { watch } from "chokidar";
12
12
  //#region src/syncer/watcher.ts
13
13
  /**
14
14
  * Watcher를 설정합니다.
15
15
  * 이 친구는 진짜로 syncer가 받아야 할 변경 이벤트들만 추려서 batch로 전달해줍니다.
16
16
  */
17
17
  async function setupWatcher(onFileEvents) {
18
- const watcher = chokidar.watch(apiAndTargetsSrcPaths(), {
18
+ const watcher = watch(apiAndTargetsSrcPaths(), {
19
19
  ignored: ignoreIfExtensionIsNotOneOf(".ts", ".json", ".http"),
20
20
  persistent: true,
21
21
  ignoreInitial: true
@@ -88,4 +88,4 @@ __esmMin((() => {
88
88
  }))();
89
89
  export { setupWatcher };
90
90
 
91
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL3dhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHR5cGUgU3RhdHMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IGNob2tpZGFyLCB7IHR5cGUgRlNXYXRjaGVyIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tIFwibWluaW1hdGNoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVFdmVudEJhdGNoZXIgfSBmcm9tIFwiLi9ldmVudC1iYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgaXNMYXN0Q2hhbmdlZEJ5TWUgfSBmcm9tIFwiLi9maWxlLXRyYWNraW5nXCI7XG5cbi8qKlxuICogV2F0Y2hlcuulvCDshKTsoJXtlanri4jri6QuXG4gKiDsnbQg7Lmc6rWs64qUIOynhOynnOuhnCBzeW5jZXLqsIAg67Cb7JWE7JW8IO2VoCDrs4Dqsr0g7J2067Kk7Yq465Ok66eMIOy2lOugpOyEnCBiYXRjaOuhnCDsoITri6ztlbTspI3ri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFdhdGNoZXIoXG4gIG9uRmlsZUV2ZW50czogKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPikgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8RlNXYXRjaGVyPiB7XG4gIC8vIGFwaSDrs7jsnbjrv5Ag7JWE64uI6528IHN5bmMgdGFyZ2V065Ok7J2YIHNyY+uPhCDrtIXri4jri6QuXG4gIC8vIHRhcmdldCDsgrDstpzrrLwoc29uYW11LmdlbmVyYXRlZCwgc2VydmljZXMuZ2VuZXJhdGVkLCBpMThuIGNvcHkg65OxKeydtCDsmbjrtoDsl5DshJxcbiAgLy8g67OA6rK965CY64qUIOqyveyasOulvCBkcmlmdOuhnCDsnqHslYQg7JuM64ud7J2EIOudhOyasOq4sCDsnITtlajsnoXri4jri6QuXG4gIGNvbnN0IHdhdGNoZXIgPSBjaG9raWRhci53YXRjaChhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSwge1xuICAgIGlnbm9yZWQ6IGlnbm9yZUlmRXh0ZW5zaW9uSXNOb3RPbmVPZihcIi50c1wiLCBcIi5qc29uXCIsIFwiLmh0dHBcIiksXG4gICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICB9KTtcblxuICAvLyAxMDBtcyDslYjsl5Ag65Ok7Ja07JioIOuzgOqyveuTpOydhCDtlZwgYmF0Y2jroZwg66qo7JWEIO2VnCDsgqzsnbTtgbTroZwg7LKY66as7ZWp64uI64ukLlxuICBjb25zdCBwdXNoRmlsZUV2ZW50ID0gY3JlYXRlRmlsZUV2ZW50QmF0Y2hlcjxcImNoYW5nZVwiIHwgXCJhZGRcIj4oe1xuICAgIGRlbGF5TXM6IDEwMCxcbiAgICBvbkZsdXNoOiBhc3luYyAoZmlsZUV2ZW50cykgPT4ge1xuICAgICAgY29uc3QgcmVhbENoYW5nZXMgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgICBmb3IgKGNvbnN0IFtwLCBlXSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAgIC8vIHNlbGYtd3JpdGUgZWNob+uKlCBmbHVzaCDsi5zsoJDsl5Ag6rGw66aF64uI64ukLlxuICAgICAgICAvLyB3YXRjaGVyLm9u7JeQ7IScIOymieyLnCDqsbDrpbTrqbQg64SI66y0IOydtOumheuLiOuLpC5cbiAgICAgICAgLy8g7Jes6riw7JeQ7ISc64qUIO2MjOydvOydtCDrlJTsiqTtgazsl5Ag7JOw7J206rOgIOuCmOyEnCDslb3qsITsnZgg65Sc66CI7J206rCAIOyeiOq4sCDrlYzrrLjsl5BcbiAgICAgICAgLy8gXCLrlJTsiqTtgazsl5Ag7I287KeA66eMIOyVhOyngSB0cmFja1dyaXR0ZW7snbQg7JmE66OM65CY6riwIOyghCDsg4Htg5xcIiDqsJnsnYAg66y47KCc6rCAIOyCrOudvOynkeuLiOuLpC5cbiAgICAgICAgaWYgKCEoYXdhaXQgaXNMYXN0Q2hhbmdlZEJ5TWUocCkpKSB7XG4gICAgICAgICAgcmVhbENoYW5nZXMuc2V0KHAsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVhbENoYW5nZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgYXdhaXQgb25GaWxlRXZlbnRzKHJlYWxDaGFuZ2VzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICB3YXRjaGVyLm9uKFwiYWxsXCIsIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgIGFzc2VydChcbiAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFNvbmFtdS5hcHBSb290UGF0aCksXG4gICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBhcHAgcm9vdCBwYXRoXCIsXG4gICAgKTtcblxuICAgIGlmICghaXNXYW50ZWRFdmVudChldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNDb25maWdDaGFuZ2UoYWJzb2x1dGVQYXRoKSkge1xuICAgICAgdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50LCBmaWxlUGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT3V0T2ZTY29wZShhYnNvbHV0ZVBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7Jes6riw6rmM7KeAIOyZlOuLpOuptCBzeW5jZXLqsIAg7KeE7Kec66GcIOyymOumrO2VtOyVvCDtlaAg67OA6rK97IKs7ZWt7J2065286rOgIOuztOuptCDrkKnri4jri6QuXG4gICAgLy8g7J20IO2YuOy2nOydgCDsnbTrsqTtirjrpbwgYmF0Y2hlcuyXkCDsjJPsirXri4jri6QuXG4gICAgLy8g7J207ZuEIOuVjOqwgCDrkJjrqbQg7J2066CH6rKMIOyMk+yduCDsnbTrsqTtirjrpbwg65Ok6rOgIG9uRmlsZUV2ZW50cyDsvZzrsLHsnbQg7Zi47Lac65Cp64uI64ukLlxuICAgIHB1c2hGaWxlRXZlbnQoYWJzb2x1dGVQYXRoLCBldmVudCk7XG4gIH0pO1xuXG4gIHJldHVybiB3YXRjaGVyO1xufVxuXG5mdW5jdGlvbiBhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSB7XG4gIHJldHVybiBbXG4gICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiksXG4gICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKCh0KSA9PiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0LCBcInNyY1wiKSksXG4gIF07XG59XG5cbi8qKlxuICogY2hva2lkYXLsnZggYGlnbm9yZWRgIOyYteyFmOyXkCDrsJXripQg7Zes7Y28LlxuICog7KO87Ja07KeEIO2ZleyepeyekOqwgCAq7JWE64uMKiDtjIzsnbzsnYAg66y07Iuc7ZWp64uI64ukIOKAlCDspokg7KO87Ja07KeEIO2ZleyepeyekOunjCB3YXRjaCDrjIDsg4EuXG4gKlxuICogY2hva2lkYXIgYGlnbm9yZWRg64qUIGB0cnVlYOulvCDrsJjtmZjtlZjrqbQg7ZW064u5IOqyveuhnOulvCDrrLTsi5ztlanri4jri6QuXG4gKiDrlLDrnbzshJwgXCLsnbQg7ZmV7J6l7J6Q66eMIO2XiOyaqVwi7J2EIO2RnO2YhO2VmOugpOuptCAq64uk66W4IO2ZleyepeyekOyXkCDrjIDtlbQgdHJ1ZSrrpbwg67CY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaWdub3JlSWZFeHRlbnNpb25Jc05vdE9uZU9mKC4uLmFsbG93ZWRFeHRlbnNpb25zOiBgLiR7c3RyaW5nfWBbXSkge1xuICBjb25zdCBpc0FsbG93ZWQgPSAoZXh0OiBzdHJpbmcpID0+IChhbGxvd2VkRXh0ZW5zaW9ucyBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoZXh0KTtcblxuICByZXR1cm4gKHA6IHN0cmluZywgc3RhdHM/OiBTdGF0cykgPT4gISFzdGF0cz8uaXNGaWxlKCkgJiYgIWlzQWxsb3dlZChwYXRoLmV4dG5hbWUocCkpO1xufVxuXG5mdW5jdGlvbiBpc1dhbnRlZEV2ZW50KGV2ZW50OiBzdHJpbmcpOiBldmVudCBpcyBcImNoYW5nZVwiIHwgXCJhZGRcIiB7XG4gIHJldHVybiBldmVudCA9PT0gXCJjaGFuZ2VcIiB8fCBldmVudCA9PT0gXCJhZGRcIjtcbn1cblxuZnVuY3Rpb24gaXNDb25maWdDaGFuZ2UoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGggPT09IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbn1cblxuZnVuY3Rpb24gdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGgucmVwbGFjZShTb25hbXUuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSk7XG4gIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xufVxuXG4vKipcbiAqIOyKpOy9lO2UhCDsoJXsnZg6XG4gKiAtIGFwaS9zcmMg7JWI7J2YIOuqqOuToCDrs4Dqsr3snYAg7Iqk7L2U7ZSEIOyViCAoSE1SIOuMgOyDgeydtCDrkKAg7IiYIOyeiOycvOuvgOuhnClcbiAqIC0gYXBpL3NyYyDrsJbsnbTrnbzrqbQgY2hlY2tzdW1QYXR0ZXJuR3JvdXAg7Yyo7YS07JeQIOunpOy5reuQmOuKlCDqsr3roZzrp4wg7Iqk7L2U7ZSEIOyViFxuICpcbiAqIOq3uCDsmbgo7JiIOiB3ZWIvc3JjL0FwcC50c3gg6rCZ7J2AIHRhcmdldOydmCDruYTstpTsoIEg7YyM7J28KeuKlCDsiqTsvZTtlIQg67CW7J206528IOustOyLnO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaXNPdXRPZlNjb3BlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBib29sZWFuIHtcbiAgY29uc3QgYXBpU3JjID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIik7XG4gIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKGFwaVNyYykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gIHJldHVybiAhT2JqZWN0LnZhbHVlcyhjaGVja1BhdHRlcm5Hcm91cCkuc29tZSgocGF0dGVybikgPT4gbWluaW1hdGNoKGZpbGVQYXRoLCBwYXR0ZXJuKSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsZUFBc0IsYUFDcEIsY0FDb0I7Q0FJcEIsTUFBTSxVQUFVLFNBQVMsTUFBTSxzQkFBc0IsR0FBRztFQUN0RCxTQUFTLDRCQUE0QixPQUFPLFNBQVMsT0FBTztFQUM1RCxZQUFZO0VBQ1osZUFBZTtDQUNqQixDQUFDO0NBR0QsTUFBTSxnQkFBZ0IsdUJBQXlDO0VBQzdELFNBQVM7RUFDVCxTQUFTLE9BQU8sZUFBZTtHQUM3QixNQUFNLDhCQUFjLElBQUksSUFBb0M7R0FDNUQsS0FBSyxNQUFNLENBQUMsR0FBRyxNQUFNLFlBS25CLElBQUksQ0FBRSxNQUFNLGtCQUFrQixDQUFDLEdBQzdCLFlBQVksSUFBSSxHQUFHLENBQUM7R0FHeEIsSUFBSSxZQUFZLE9BQU8sR0FDckIsTUFBTSxhQUFhLFdBQVc7RUFFbEM7Q0FDRixDQUFDO0NBRUQsUUFBUSxHQUFHLFFBQVEsT0FBZSxhQUFxQjtFQUNyRCxNQUFNLGVBQWU7RUFDckIsT0FDRSxhQUFhLFdBQVcsT0FBTyxXQUFXLEdBQzFDLDJDQUNGO0VBRUEsSUFBSSxDQUFDLGNBQWMsS0FBSyxHQUN0QjtFQUdGLElBQUksZUFBZSxZQUFZLEdBQUc7R0FDaEMsbUJBQW1CLE9BQU8sUUFBUTtHQUNsQztFQUNGO0VBRUEsSUFBSSxhQUFhLFlBQVksR0FDM0I7RUFNRixjQUFjLGNBQWMsS0FBSztDQUNuQyxDQUFDO0NBRUQsT0FBTztBQUNUO0FBRUEsU0FBUyx3QkFBd0I7Q0FDL0IsT0FBTyxDQUNMLEtBQUssS0FBSyxPQUFPLGFBQWEsS0FBSyxHQUNuQyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsS0FBSyxNQUFNLEtBQUssS0FBSyxPQUFPLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FDbEY7QUFDRjs7Ozs7Ozs7QUFTQSxTQUFTLDRCQUE0QixHQUFHLG1CQUFtQztDQUN6RSxNQUFNLGFBQWEsUUFBaUIsa0JBQStCLFNBQVMsR0FBRztDQUUvRSxRQUFRLEdBQVcsVUFBa0IsQ0FBQyxDQUFDLE9BQU8sT0FBTyxLQUFLLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ3RGO0FBRUEsU0FBUyxjQUFjLE9BQTBDO0NBQy9ELE9BQU8sVUFBVSxZQUFZLFVBQVU7QUFDekM7QUFFQSxTQUFTLGVBQWUsVUFBaUM7Q0FDdkQsT0FBTyxhQUFhLEtBQUssS0FBSyxPQUFPLGFBQWEsT0FBTyxrQkFBa0I7QUFDN0U7QUFFQSxTQUFTLG1CQUFtQixPQUFlLFVBQXdCO0NBQ2pFLE1BQU0sZUFBZSxTQUFTLFFBQVEsT0FBTyxhQUFhLEtBQUs7Q0FDL0QsUUFBUSxJQUFJLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxNQUFNLEtBQUssWUFBWSxFQUFFLGlCQUFpQixDQUFDO0NBQ3pGLFFBQVEsS0FBSyxRQUFRLEtBQUssU0FBUztBQUNyQzs7Ozs7Ozs7QUFTQSxTQUFTLGFBQWEsVUFBaUM7Q0FDckQsTUFBTSxTQUFTLEtBQUssS0FBSyxPQUFPLGFBQWEsS0FBSztDQUNsRCxJQUFJLFNBQVMsV0FBVyxNQUFNLEdBQzVCLE9BQU87Q0FFVCxNQUFNLG9CQUFvQixzQ0FBc0M7Q0FDaEUsT0FBTyxDQUFDLE9BQU8sT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sWUFBWSxVQUFVLFVBQVUsT0FBTyxDQUFDO0FBQ3pGOzs7VUF2SCtCO29CQUV5QjtvQkFDZTtvQkFDcEIifQ==
91
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2VyL3dhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3RyaWN0IGFzIGFzc2VydCB9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHR5cGUgU3RhdHMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBGU1dhdGNoZXIsIHdhdGNoIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgeyBtaW5pbWF0Y2ggfSBmcm9tIFwibWluaW1hdGNoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUZpbGVFdmVudEJhdGNoZXIgfSBmcm9tIFwiLi9ldmVudC1iYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHsgaXNMYXN0Q2hhbmdlZEJ5TWUgfSBmcm9tIFwiLi9maWxlLXRyYWNraW5nXCI7XG5cbi8qKlxuICogV2F0Y2hlcuulvCDshKTsoJXtlanri4jri6QuXG4gKiDsnbQg7Lmc6rWs64qUIOynhOynnOuhnCBzeW5jZXLqsIAg67Cb7JWE7JW8IO2VoCDrs4Dqsr0g7J2067Kk7Yq465Ok66eMIOy2lOugpOyEnCBiYXRjaOuhnCDsoITri6ztlbTspI3ri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFdhdGNoZXIoXG4gIG9uRmlsZUV2ZW50czogKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPikgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8RlNXYXRjaGVyPiB7XG4gIC8vIGFwaSDrs7jsnbjrv5Ag7JWE64uI6528IHN5bmMgdGFyZ2V065Ok7J2YIHNyY+uPhCDrtIXri4jri6QuXG4gIC8vIHRhcmdldCDsgrDstpzrrLwoc29uYW11LmdlbmVyYXRlZCwgc2VydmljZXMuZ2VuZXJhdGVkLCBpMThuIGNvcHkg65OxKeydtCDsmbjrtoDsl5DshJxcbiAgLy8g67OA6rK965CY64qUIOqyveyasOulvCBkcmlmdOuhnCDsnqHslYQg7JuM64ud7J2EIOudhOyasOq4sCDsnITtlajsnoXri4jri6QuXG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaChhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSwge1xuICAgIGlnbm9yZWQ6IGlnbm9yZUlmRXh0ZW5zaW9uSXNOb3RPbmVPZihcIi50c1wiLCBcIi5qc29uXCIsIFwiLmh0dHBcIiksXG4gICAgcGVyc2lzdGVudDogdHJ1ZSxcbiAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICB9KTtcblxuICAvLyAxMDBtcyDslYjsl5Ag65Ok7Ja07JioIOuzgOqyveuTpOydhCDtlZwgYmF0Y2jroZwg66qo7JWEIO2VnCDsgqzsnbTtgbTroZwg7LKY66as7ZWp64uI64ukLlxuICBjb25zdCBwdXNoRmlsZUV2ZW50ID0gY3JlYXRlRmlsZUV2ZW50QmF0Y2hlcjxcImNoYW5nZVwiIHwgXCJhZGRcIj4oe1xuICAgIGRlbGF5TXM6IDEwMCxcbiAgICBvbkZsdXNoOiBhc3luYyAoZmlsZUV2ZW50cykgPT4ge1xuICAgICAgY29uc3QgcmVhbENoYW5nZXMgPSBuZXcgTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KCk7XG4gICAgICBmb3IgKGNvbnN0IFtwLCBlXSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICAgIC8vIHNlbGYtd3JpdGUgZWNob+uKlCBmbHVzaCDsi5zsoJDsl5Ag6rGw66aF64uI64ukLlxuICAgICAgICAvLyB3YXRjaGVyLm9u7JeQ7IScIOymieyLnCDqsbDrpbTrqbQg64SI66y0IOydtOumheuLiOuLpC5cbiAgICAgICAgLy8g7Jes6riw7JeQ7ISc64qUIO2MjOydvOydtCDrlJTsiqTtgazsl5Ag7JOw7J206rOgIOuCmOyEnCDslb3qsITsnZgg65Sc66CI7J206rCAIOyeiOq4sCDrlYzrrLjsl5BcbiAgICAgICAgLy8gXCLrlJTsiqTtgazsl5Ag7I287KeA66eMIOyVhOyngSB0cmFja1dyaXR0ZW7snbQg7JmE66OM65CY6riwIOyghCDsg4Htg5xcIiDqsJnsnYAg66y47KCc6rCAIOyCrOudvOynkeuLiOuLpC5cbiAgICAgICAgaWYgKCEoYXdhaXQgaXNMYXN0Q2hhbmdlZEJ5TWUocCkpKSB7XG4gICAgICAgICAgcmVhbENoYW5nZXMuc2V0KHAsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVhbENoYW5nZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgYXdhaXQgb25GaWxlRXZlbnRzKHJlYWxDaGFuZ2VzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICB3YXRjaGVyLm9uKFwiYWxsXCIsIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID1cbiAgICAgIC8qIFNBRkVUWTogVHlwZVNjcmlwdCBBU1Qg7YyM7Iux6rO8IOuPmeq4sO2ZlCDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgIGFzc2VydChcbiAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFNvbmFtdS5hcHBSb290UGF0aCksXG4gICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBhcHAgcm9vdCBwYXRoXCIsXG4gICAgKTtcblxuICAgIGlmICghaXNXYW50ZWRFdmVudChldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNDb25maWdDaGFuZ2UoYWJzb2x1dGVQYXRoKSkge1xuICAgICAgdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50LCBmaWxlUGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT3V0T2ZTY29wZShhYnNvbHV0ZVBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7Jes6riw6rmM7KeAIOyZlOuLpOuptCBzeW5jZXLqsIAg7KeE7Kec66GcIOyymOumrO2VtOyVvCDtlaAg67OA6rK97IKs7ZWt7J2065286rOgIOuztOuptCDrkKnri4jri6QuXG4gICAgLy8g7J20IO2YuOy2nOydgCDsnbTrsqTtirjrpbwgYmF0Y2hlcuyXkCDsjJPsirXri4jri6QuXG4gICAgLy8g7J207ZuEIOuVjOqwgCDrkJjrqbQg7J2066CH6rKMIOyMk+yduCDsnbTrsqTtirjrpbwg65Ok6rOgIG9uRmlsZUV2ZW50cyDsvZzrsLHsnbQg7Zi47Lac65Cp64uI64ukLlxuICAgIHB1c2hGaWxlRXZlbnQoYWJzb2x1dGVQYXRoLCBldmVudCk7XG4gIH0pO1xuXG4gIHJldHVybiB3YXRjaGVyO1xufVxuXG5mdW5jdGlvbiBhcGlBbmRUYXJnZXRzU3JjUGF0aHMoKSB7XG4gIHJldHVybiBbXG4gICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiksXG4gICAgLi4uU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKCh0KSA9PiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0LCBcInNyY1wiKSksXG4gIF07XG59XG5cbi8qKlxuICogY2hva2lkYXLsnZggYGlnbm9yZWRgIOyYteyFmOyXkCDrsJXripQg7Zes7Y28LlxuICog7KO87Ja07KeEIO2ZleyepeyekOqwgCAq7JWE64uMKiDtjIzsnbzsnYAg66y07Iuc7ZWp64uI64ukIOKAlCDspokg7KO87Ja07KeEIO2ZleyepeyekOunjCB3YXRjaCDrjIDsg4EuXG4gKlxuICogY2hva2lkYXIgYGlnbm9yZWRg64qUIGB0cnVlYOulvCDrsJjtmZjtlZjrqbQg7ZW064u5IOqyveuhnOulvCDrrLTsi5ztlanri4jri6QuXG4gKiDrlLDrnbzshJwgXCLsnbQg7ZmV7J6l7J6Q66eMIO2XiOyaqVwi7J2EIO2RnO2YhO2VmOugpOuptCAq64uk66W4IO2ZleyepeyekOyXkCDrjIDtlbQgdHJ1ZSrrpbwg67CY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaWdub3JlSWZFeHRlbnNpb25Jc05vdE9uZU9mKC4uLmFsbG93ZWRFeHRlbnNpb25zOiBgLiR7c3RyaW5nfWBbXSkge1xuICBjb25zdCBpc0FsbG93ZWQgPSAoZXh0OiBzdHJpbmcpID0+XG4gICAgLyogU0FGRVRZOiBUeXBlU2NyaXB0IEFTVCDtjIzsi7Hqs7wg64+Z6riw7ZmUIOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBhbGxvd2VkRXh0ZW5zaW9ucyBhcyBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoZXh0KTtcblxuICByZXR1cm4gKHA6IHN0cmluZywgc3RhdHM/OiBTdGF0cykgPT4gISFzdGF0cz8uaXNGaWxlKCkgJiYgIWlzQWxsb3dlZChwYXRoLmV4dG5hbWUocCkpO1xufVxuXG5mdW5jdGlvbiBpc1dhbnRlZEV2ZW50KGV2ZW50OiBzdHJpbmcpOiBldmVudCBpcyBcImNoYW5nZVwiIHwgXCJhZGRcIiB7XG4gIHJldHVybiBldmVudCA9PT0gXCJjaGFuZ2VcIiB8fCBldmVudCA9PT0gXCJhZGRcIjtcbn1cblxuZnVuY3Rpb24gaXNDb25maWdDaGFuZ2UoZmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGggPT09IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbn1cblxuZnVuY3Rpb24gdHJpZ2dlclNlbGZSZXN0YXJ0KGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGgucmVwbGFjZShTb25hbXUuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSk7XG4gIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xufVxuXG4vKipcbiAqIOyKpOy9lO2UhCDsoJXsnZg6XG4gKiAtIGFwaS9zcmMg7JWI7J2YIOuqqOuToCDrs4Dqsr3snYAg7Iqk7L2U7ZSEIOyViCAoSE1SIOuMgOyDgeydtCDrkKAg7IiYIOyeiOycvOuvgOuhnClcbiAqIC0gYXBpL3NyYyDrsJbsnbTrnbzrqbQgY2hlY2tzdW1QYXR0ZXJuR3JvdXAg7Yyo7YS07JeQIOunpOy5reuQmOuKlCDqsr3roZzrp4wg7Iqk7L2U7ZSEIOyViFxuICpcbiAqIOq3uCDsmbgo7JiIOiB3ZWIvc3JjL0FwcC50c3gg6rCZ7J2AIHRhcmdldOydmCDruYTstpTsoIEg7YyM7J28KeuKlCDsiqTsvZTtlIQg67CW7J206528IOustOyLnO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gaXNPdXRPZlNjb3BlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBib29sZWFuIHtcbiAgY29uc3QgYXBpU3JjID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIik7XG4gIGlmIChmaWxlUGF0aC5zdGFydHNXaXRoKGFwaVNyYykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2hlY2tQYXR0ZXJuR3JvdXAgPSBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCk7XG4gIHJldHVybiAhT2JqZWN0LnZhbHVlcyhjaGVja1BhdHRlcm5Hcm91cCkuc29tZSgocGF0dGVybikgPT4gbWluaW1hdGNoKGZpbGVQYXRoLCBwYXR0ZXJuKSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsZUFBc0IsYUFDcEIsY0FDb0I7Q0FJcEIsTUFBTSxVQUFVLE1BQU0sc0JBQXNCLEdBQUc7RUFDN0MsU0FBUyw0QkFBNEIsT0FBTyxTQUFTLE9BQU87RUFDNUQsWUFBWTtFQUNaLGVBQWU7Q0FDakIsQ0FBQztDQUdELE1BQU0sZ0JBQWdCLHVCQUF5QztFQUM3RCxTQUFTO0VBQ1QsU0FBUyxPQUFPLGVBQWU7R0FDN0IsTUFBTSw4QkFBYyxJQUFJLElBQW9DO0dBQzVELEtBQUssTUFBTSxDQUFDLEdBQUcsTUFBTSxZQUtuQixJQUFJLENBQUUsTUFBTSxrQkFBa0IsQ0FBQyxHQUM3QixZQUFZLElBQUksR0FBRyxDQUFDO0dBR3hCLElBQUksWUFBWSxPQUFPLEdBQ3JCLE1BQU0sYUFBYSxXQUFXO0VBRWxDO0NBQ0YsQ0FBQztDQUVELFFBQVEsR0FBRyxRQUFRLE9BQWUsYUFBcUI7RUFDckQsTUFBTSxlQUN1RDtFQUM3RCxPQUNFLGFBQWEsV0FBVyxPQUFPLFdBQVcsR0FDMUMsMkNBQ0Y7RUFFQSxJQUFJLENBQUMsY0FBYyxLQUFLLEdBQ3RCO0VBR0YsSUFBSSxlQUFlLFlBQVksR0FBRztHQUNoQyxtQkFBbUIsT0FBTyxRQUFRO0dBQ2xDO0VBQ0Y7RUFFQSxJQUFJLGFBQWEsWUFBWSxHQUMzQjtFQU1GLGNBQWMsY0FBYyxLQUFLO0NBQ25DLENBQUM7Q0FFRCxPQUFPO0FBQ1Q7QUFFQSxTQUFTLHdCQUF3QjtDQUMvQixPQUFPLENBQ0wsS0FBSyxLQUFLLE9BQU8sYUFBYSxLQUFLLEdBQ25DLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxLQUFLLE1BQU0sS0FBSyxLQUFLLE9BQU8sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUNsRjtBQUNGOzs7Ozs7OztBQVNBLFNBQVMsNEJBQTRCLEdBQUcsbUJBQW1DO0NBQ3pFLE1BQU0sYUFBYSxRQUVmLGtCQUNBLFNBQVMsR0FBRztDQUVoQixRQUFRLEdBQVcsVUFBa0IsQ0FBQyxDQUFDLE9BQU8sT0FBTyxLQUFLLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0FBQ3RGO0FBRUEsU0FBUyxjQUFjLE9BQTBDO0NBQy9ELE9BQU8sVUFBVSxZQUFZLFVBQVU7QUFDekM7QUFFQSxTQUFTLGVBQWUsVUFBaUM7Q0FDdkQsT0FBTyxhQUFhLEtBQUssS0FBSyxPQUFPLGFBQWEsT0FBTyxrQkFBa0I7QUFDN0U7QUFFQSxTQUFTLG1CQUFtQixPQUFlLFVBQXdCO0NBQ2pFLE1BQU0sZUFBZSxTQUFTLFFBQVEsT0FBTyxhQUFhLEtBQUs7Q0FDL0QsUUFBUSxJQUFJLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxNQUFNLEtBQUssWUFBWSxFQUFFLGlCQUFpQixDQUFDO0NBQ3pGLFFBQVEsS0FBSyxRQUFRLEtBQUssU0FBUztBQUNyQzs7Ozs7Ozs7QUFTQSxTQUFTLGFBQWEsVUFBaUM7Q0FDckQsTUFBTSxTQUFTLEtBQUssS0FBSyxPQUFPLGFBQWEsS0FBSztDQUNsRCxJQUFJLFNBQVMsV0FBVyxNQUFNLEdBQzVCLE9BQU87Q0FFVCxNQUFNLG9CQUFvQixzQ0FBc0M7Q0FDaEUsT0FBTyxDQUFDLE9BQU8sT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sWUFBWSxVQUFVLFVBQVUsT0FBTyxDQUFDO0FBQ3pGOzs7VUEzSCtCO29CQUV5QjtvQkFDZTtvQkFDcEIifQ==
@@ -1,18 +1,18 @@
1
1
  import { type RetryPolicy, type SchemaInput, type SchemaOutput, type StandardSchemaV1, type WorkflowSpec } from "@sonamu-kit/tasks/internal";
2
2
  import { type Executable } from "../types/types";
3
3
  import { type WorkflowFunction } from "./workflow-manager";
4
- export interface WorkflowMetadata {
4
+ export interface WorkflowMetadata<RawInput = unknown, Input = unknown, Output = unknown> {
5
5
  type: "workflow";
6
6
  id: string;
7
7
  name: string;
8
8
  version: string | null;
9
- schema: StandardSchemaV1<unknown, unknown> | undefined;
9
+ schema: StandardSchemaV1<RawInput, Input> | undefined;
10
10
  schedules: {
11
11
  name: string;
12
12
  expression: string;
13
- input: Executable<SchemaInput<unknown, unknown> | undefined>;
13
+ input: Executable<RawInput | undefined>;
14
14
  }[];
15
- fn: WorkflowFunction<unknown, unknown>;
15
+ fn: WorkflowFunction<Input, Output>;
16
16
  retryPolicy?: RetryPolicy;
17
17
  }
18
18
  export type DefineWorkflowOptions<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined> = Omit<WorkflowSpec<SchemaOutput<TSchema, Input>, Output, SchemaInput<TSchema, Input>>, "name"> & {
@@ -24,6 +24,6 @@ export type DefineWorkflowOptions<Input, Output, TSchema extends StandardSchemaV
24
24
  }[];
25
25
  retryPolicy?: RetryPolicy;
26
26
  };
27
- export declare function workflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: DefineWorkflowOptions<Input, Output, TSchema>): (fn: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>) => WorkflowMetadata;
28
- export declare function workflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: DefineWorkflowOptions<Input, Output, TSchema>, fn: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>): WorkflowMetadata;
27
+ export declare function workflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: DefineWorkflowOptions<Input, Output, TSchema>): (fn: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>) => WorkflowMetadata<SchemaInput<TSchema, Input>, SchemaOutput<TSchema, Input>, Output>;
28
+ export declare function workflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: DefineWorkflowOptions<Input, Output, TSchema>, fn: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>): WorkflowMetadata<SchemaInput<TSchema, Input>, SchemaOutput<TSchema, Input>, Output>;
29
29
  //# sourceMappingURL=decorator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/tasks/decorator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;KAC9D,EAAE,CAAC;IACJ,EAAE,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAGD,MAAM,MAAM,qBAAqB,CAC/B,KAAK,EACL,MAAM,EACN,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,IACtD,IAAI,CACN,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC/E,MAAM,CACP,GAAG;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;KAC7D,EAAE,CAAC;IACJ,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAIF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAC9F,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GACrD,CAAC,EAAE,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,gBAAgB,CAAC;AACpF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAC9F,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EACtD,EAAE,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,GACzD,gBAAgB,CAAC"}
1
+ {"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/tasks/decorator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,gBAAgB,CAAC,QAAQ,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO;IACrF,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;IACtD,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,UAAU,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;KACzC,EAAE,CAAC;IACJ,EAAE,EAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAGD,MAAM,MAAM,qBAAqB,CAC/B,KAAK,EACL,MAAM,EACN,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,IACtD,IAAI,CACN,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC/E,MAAM,CACP,GAAG;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;KAC7D,EAAE,CAAC;IACJ,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAIF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAC9F,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GACrD,CACD,EAAE,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,KACvD,gBAAgB,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AACzF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAC9F,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EACtD,EAAE,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,GACzD,gBAAgB,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC"}
@@ -2,9 +2,9 @@ import inflection from "inflection";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/tasks/decorator.ts
4
4
  function workflow(options, fn) {
5
- const decorated = (fn) => {
5
+ const decorated = (workflowFunction) => {
6
6
  const id = randomUUID();
7
- const workflowName = options.name ?? inflection.underscore(fn.name);
7
+ const workflowName = options.name ?? inflection.underscore(workflowFunction.name);
8
8
  return {
9
9
  type: "workflow",
10
10
  id,
@@ -18,7 +18,7 @@ function workflow(options, fn) {
18
18
  input: schedule.input
19
19
  };
20
20
  }),
21
- fn,
21
+ fn: workflowFunction,
22
22
  retryPolicy: options.retryPolicy
23
23
  };
24
24
  };
@@ -28,4 +28,4 @@ function workflow(options, fn) {
28
28
  //#endregion
29
29
  export { workflow };
30
30
 
31
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQge1xuICB0eXBlIFJldHJ5UG9saWN5LFxuICB0eXBlIFNjaGVtYUlucHV0LFxuICB0eXBlIFNjaGVtYU91dHB1dCxcbiAgdHlwZSBTdGFuZGFyZFNjaGVtYVYxLFxuICB0eXBlIFdvcmtmbG93U3BlYyxcbn0gZnJvbSBcIkBzb25hbXUta2l0L3Rhc2tzL2ludGVybmFsXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuXG5pbXBvcnQgeyB0eXBlIEV4ZWN1dGFibGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgV29ya2Zsb3dGdW5jdGlvbiB9IGZyb20gXCIuL3dvcmtmbG93LW1hbmFnZXJcIjtcblxuLy8g7JuM7YGs7ZSM66Gc7Jqw7J2YIOuplO2DgOuNsOydtO2EsCDqsJ3ssrRcbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dNZXRhZGF0YSB7XG4gIHR5cGU6IFwid29ya2Zsb3dcIjtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsO1xuICBzY2hlbWE6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIHNjaGVkdWxlczoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHByZXNzaW9uOiBzdHJpbmc7XG4gICAgaW5wdXQ6IEV4ZWN1dGFibGU8U2NoZW1hSW5wdXQ8dW5rbm93biwgdW5rbm93bj4gfCB1bmRlZmluZWQ+O1xuICB9W107XG4gIGZuOiBXb3JrZmxvd0Z1bmN0aW9uPHVua25vd24sIHVua25vd24+O1xuICByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xufVxuXG4vLyDsm4ztgaztlIzroZzsmrAg7KCV7J2YIOqzvOygleyXkOyEnOydmCDsmLXshZhcbmV4cG9ydCB0eXBlIERlZmluZVdvcmtmbG93T3B0aW9uczxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVFNjaGVtYSBleHRlbmRzIFN0YW5kYXJkU2NoZW1hVjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4+ID0gT21pdDxcbiAgV29ya2Zsb3dTcGVjPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dCwgU2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+PixcbiAgXCJuYW1lXCJcbj4gJiB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNjaGVkdWxlcz86IHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGV4cHJlc3Npb246IHN0cmluZztcbiAgICBpbnB1dD86IEV4ZWN1dGFibGU8U2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+IHwgdW5kZWZpbmVkPjtcbiAgfVtdO1xuICByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xufTtcblxuLy8g7JuM7YGs7ZSM66Gc7JqwIOygleydmOulvCDsnITtlZwg642w7L2U66CI7J207YSwLFxuLy8g7J206rKD65Ok7J2AIHN5bmNlcuyXkOyEnCDtlZzrsojsl5AgbG9hZO2VnCDri6TsnYwsIFdvcmtmbG93TWFuYWdlcuyXkOyEnCBzeW5jaHJvbml6ZeulvCDthrXtlbQg65Ox66Gd65CoLlxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93PElucHV0LCBPdXRwdXQsIFRTY2hlbWEgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtYVYxIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgb3B0aW9uczogRGVmaW5lV29ya2Zsb3dPcHRpb25zPElucHV0LCBPdXRwdXQsIFRTY2hlbWE+LFxuKTogKGZuOiBXb3JrZmxvd0Z1bmN0aW9uPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dD4pID0+IFdvcmtmbG93TWV0YWRhdGE7XG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3c8SW5wdXQsIE91dHB1dCwgVFNjaGVtYSBleHRlbmRzIFN0YW5kYXJkU2NoZW1hVjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICBvcHRpb25zOiBEZWZpbmVXb3JrZmxvd09wdGlvbnM8SW5wdXQsIE91dHB1dCwgVFNjaGVtYT4sXG4gIGZuOiBXb3JrZmxvd0Z1bmN0aW9uPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dD4sXG4pOiBXb3JrZmxvd01ldGFkYXRhO1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93PElucHV0LCBPdXRwdXQsIFRTY2hlbWEgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtYVYxIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgb3B0aW9uczogRGVmaW5lV29ya2Zsb3dPcHRpb25zPElucHV0LCBPdXRwdXQsIFRTY2hlbWE+LFxuICBmbj86IFdvcmtmbG93RnVuY3Rpb248U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0Pixcbik6XG4gIHwgV29ya2Zsb3dNZXRhZGF0YVxuICB8ICgoZm46IFdvcmtmbG93RnVuY3Rpb248U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0PikgPT4gV29ya2Zsb3dNZXRhZGF0YSkge1xuICBjb25zdCBkZWNvcmF0ZWQgPSAoZm46IFdvcmtmbG93RnVuY3Rpb248U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0PikgPT4ge1xuICAgIGNvbnN0IGlkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHdvcmtmbG93TmFtZSA9IG9wdGlvbnMubmFtZSA/PyBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoZm4ubmFtZSk7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogV29ya2Zsb3dNZXRhZGF0YSA9IHtcbiAgICAgIHR5cGU6IFwid29ya2Zsb3dcIiBhcyBjb25zdCxcbiAgICAgIGlkLFxuICAgICAgbmFtZTogd29ya2Zsb3dOYW1lLFxuICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBudWxsLFxuICAgICAgc2NoZWR1bGVzOiAob3B0aW9ucy5zY2hlZHVsZXMgPz8gW10pLm1hcCgoc2NoZWR1bGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiBzY2hlZHVsZS5uYW1lID8/IGAke3dvcmtmbG93TmFtZX1bJHtzY2hlZHVsZS5leHByZXNzaW9ufV1gLFxuICAgICAgICAgIGV4cHJlc3Npb246IHNjaGVkdWxlLmV4cHJlc3Npb24sXG4gICAgICAgICAgaW5wdXQ6IHNjaGVkdWxlLmlucHV0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgICBmbjogZm4gYXMgV29ya2Zsb3dGdW5jdGlvbjx1bmtub3duLCB1bmtub3duPixcbiAgICAgIHJldHJ5UG9saWN5OiBvcHRpb25zLnJldHJ5UG9saWN5LFxuICAgIH07XG5cbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG5cbiAgaWYgKCFmbikge1xuICAgIHJldHVybiBkZWNvcmF0ZWQ7XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdGVkKGZuKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBeURBLFNBQWdCLFNBQ2QsU0FDQSxJQUdxRjtDQUNyRixNQUFNLGFBQWEsT0FBK0Q7RUFDaEYsTUFBTSxLQUFLLFdBQVc7RUFDdEIsTUFBTSxlQUFlLFFBQVEsUUFBUSxXQUFXLFdBQVcsR0FBRyxJQUFJO0VBbUJsRSxPQUFPO0dBaEJMLE1BQU07R0FDTjtHQUNBLE1BQU07R0FDTixRQUFRLFFBQVE7R0FDaEIsU0FBUyxRQUFRLFdBQVc7R0FDNUIsWUFBWSxRQUFRLGFBQWEsQ0FBQyxFQUFBLENBQUcsS0FBSyxhQUFhO0lBQ3JELE9BQU87S0FDTCxNQUFNLFNBQVMsUUFBUSxHQUFHLGFBQWEsR0FBRyxTQUFTLFdBQVc7S0FDOUQsWUFBWSxTQUFTO0tBQ3JCLE9BQU8sU0FBUztJQUNsQjtHQUNGLENBQUM7R0FDRztHQUNKLGFBQWEsUUFBUTtFQUdoQjtDQUNUO0NBRUEsSUFBSSxDQUFDLElBQ0gsT0FBTztDQUdULE9BQU8sVUFBVSxFQUFFO0FBQ3JCIn0=
31
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9yLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9kZWNvcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQge1xuICB0eXBlIFJldHJ5UG9saWN5LFxuICB0eXBlIFNjaGVtYUlucHV0LFxuICB0eXBlIFNjaGVtYU91dHB1dCxcbiAgdHlwZSBTdGFuZGFyZFNjaGVtYVYxLFxuICB0eXBlIFdvcmtmbG93U3BlYyxcbn0gZnJvbSBcIkBzb25hbXUta2l0L3Rhc2tzL2ludGVybmFsXCI7XG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuXG5pbXBvcnQgeyB0eXBlIEV4ZWN1dGFibGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgV29ya2Zsb3dGdW5jdGlvbiB9IGZyb20gXCIuL3dvcmtmbG93LW1hbmFnZXJcIjtcblxuLy8g7JuM7YGs7ZSM66Gc7Jqw7J2YIOuplO2DgOuNsOydtO2EsCDqsJ3ssrRcbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dNZXRhZGF0YTxSYXdJbnB1dCA9IHVua25vd24sIElucHV0ID0gdW5rbm93biwgT3V0cHV0ID0gdW5rbm93bj4ge1xuICB0eXBlOiBcIndvcmtmbG93XCI7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgc2NoZW1hOiBTdGFuZGFyZFNjaGVtYVYxPFJhd0lucHV0LCBJbnB1dD4gfCB1bmRlZmluZWQ7XG4gIHNjaGVkdWxlczoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHByZXNzaW9uOiBzdHJpbmc7XG4gICAgaW5wdXQ6IEV4ZWN1dGFibGU8UmF3SW5wdXQgfCB1bmRlZmluZWQ+O1xuICB9W107XG4gIGZuOiBXb3JrZmxvd0Z1bmN0aW9uPElucHV0LCBPdXRwdXQ+O1xuICByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xufVxuXG4vLyDsm4ztgaztlIzroZzsmrAg7KCV7J2YIOqzvOygleyXkOyEnOydmCDsmLXshZhcbmV4cG9ydCB0eXBlIERlZmluZVdvcmtmbG93T3B0aW9uczxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVFNjaGVtYSBleHRlbmRzIFN0YW5kYXJkU2NoZW1hVjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4+ID0gT21pdDxcbiAgV29ya2Zsb3dTcGVjPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dCwgU2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+PixcbiAgXCJuYW1lXCJcbj4gJiB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNjaGVkdWxlcz86IHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGV4cHJlc3Npb246IHN0cmluZztcbiAgICBpbnB1dD86IEV4ZWN1dGFibGU8U2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+IHwgdW5kZWZpbmVkPjtcbiAgfVtdO1xuICByZXRyeVBvbGljeT86IFJldHJ5UG9saWN5O1xufTtcblxuLy8g7JuM7YGs7ZSM66Gc7JqwIOygleydmOulvCDsnITtlZwg642w7L2U66CI7J207YSwLFxuLy8g7J206rKD65Ok7J2AIHN5bmNlcuyXkOyEnCDtlZzrsojsl5AgbG9hZO2VnCDri6TsnYwsIFdvcmtmbG93TWFuYWdlcuyXkOyEnCBzeW5jaHJvbml6ZeulvCDthrXtlbQg65Ox66Gd65CoLlxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93PElucHV0LCBPdXRwdXQsIFRTY2hlbWEgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtYVYxIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgb3B0aW9uczogRGVmaW5lV29ya2Zsb3dPcHRpb25zPElucHV0LCBPdXRwdXQsIFRTY2hlbWE+LFxuKTogKFxuICBmbjogV29ya2Zsb3dGdW5jdGlvbjxTY2hlbWFPdXRwdXQ8VFNjaGVtYSwgSW5wdXQ+LCBPdXRwdXQ+LFxuKSA9PiBXb3JrZmxvd01ldGFkYXRhPFNjaGVtYUlucHV0PFRTY2hlbWEsIElucHV0PiwgU2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0PjtcbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdzxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM6IERlZmluZVdvcmtmbG93T3B0aW9uczxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hPixcbiAgZm46IFdvcmtmbG93RnVuY3Rpb248U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0Pixcbik6IFdvcmtmbG93TWV0YWRhdGE8U2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+LCBTY2hlbWFPdXRwdXQ8VFNjaGVtYSwgSW5wdXQ+LCBPdXRwdXQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHdvcmtmbG93PElucHV0LCBPdXRwdXQsIFRTY2hlbWEgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtYVYxIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgb3B0aW9uczogRGVmaW5lV29ya2Zsb3dPcHRpb25zPElucHV0LCBPdXRwdXQsIFRTY2hlbWE+LFxuICBmbj86IFdvcmtmbG93RnVuY3Rpb248U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0Pixcbik6XG4gIHwgV29ya2Zsb3dNZXRhZGF0YTxTY2hlbWFJbnB1dDxUU2NoZW1hLCBJbnB1dD4sIFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dD5cbiAgfCAoKFxuICAgICAgZm46IFdvcmtmbG93RnVuY3Rpb248U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0PixcbiAgICApID0+IFdvcmtmbG93TWV0YWRhdGE8U2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+LCBTY2hlbWFPdXRwdXQ8VFNjaGVtYSwgSW5wdXQ+LCBPdXRwdXQ+KSB7XG4gIGNvbnN0IGRlY29yYXRlZCA9ICh3b3JrZmxvd0Z1bmN0aW9uOiBXb3JrZmxvd0Z1bmN0aW9uPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dD4pID0+IHtcbiAgICBjb25zdCBpZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBvcHRpb25zLm5hbWUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKHdvcmtmbG93RnVuY3Rpb24ubmFtZSk7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogV29ya2Zsb3dNZXRhZGF0YTxcbiAgICAgIFNjaGVtYUlucHV0PFRTY2hlbWEsIElucHV0PixcbiAgICAgIFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sXG4gICAgICBPdXRwdXRcbiAgICA+ID0ge1xuICAgICAgdHlwZTogXCJ3b3JrZmxvd1wiIGFzIGNvbnN0LFxuICAgICAgaWQsXG4gICAgICBuYW1lOiB3b3JrZmxvd05hbWUsXG4gICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IG51bGwsXG4gICAgICBzY2hlZHVsZXM6IChvcHRpb25zLnNjaGVkdWxlcyA/PyBbXSkubWFwKChzY2hlZHVsZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHNjaGVkdWxlLm5hbWUgPz8gYCR7d29ya2Zsb3dOYW1lfVske3NjaGVkdWxlLmV4cHJlc3Npb259XWAsXG4gICAgICAgICAgZXhwcmVzc2lvbjogc2NoZWR1bGUuZXhwcmVzc2lvbixcbiAgICAgICAgICBpbnB1dDogc2NoZWR1bGUuaW5wdXQsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIGZuOiB3b3JrZmxvd0Z1bmN0aW9uLFxuICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnlQb2xpY3ksXG4gICAgfTtcblxuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcblxuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuIGRlY29yYXRlZDtcbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0ZWQoZm4pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUEyREEsU0FBZ0IsU0FDZCxTQUNBLElBSzRGO0NBQzVGLE1BQU0sYUFBYSxxQkFBNkU7RUFDOUYsTUFBTSxLQUFLLFdBQVc7RUFDdEIsTUFBTSxlQUFlLFFBQVEsUUFBUSxXQUFXLFdBQVcsaUJBQWlCLElBQUk7RUF1QmhGLE9BQU87R0FoQkwsTUFBTTtHQUNOO0dBQ0EsTUFBTTtHQUNOLFFBQVEsUUFBUTtHQUNoQixTQUFTLFFBQVEsV0FBVztHQUM1QixZQUFZLFFBQVEsYUFBYSxDQUFDLEVBQUEsQ0FBRyxLQUFLLGFBQWE7SUFDckQsT0FBTztLQUNMLE1BQU0sU0FBUyxRQUFRLEdBQUcsYUFBYSxHQUFHLFNBQVMsV0FBVztLQUM5RCxZQUFZLFNBQVM7S0FDckIsT0FBTyxTQUFTO0lBQ2xCO0dBQ0YsQ0FBQztHQUNELElBQUk7R0FDSixhQUFhLFFBQVE7RUFHaEI7Q0FDVDtDQUVBLElBQUksQ0FBQyxJQUNILE9BQU87Q0FHVCxPQUFPLFVBQVUsRUFBRTtBQUNyQiJ9