sonamu 0.8.26 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (684) hide show
  1. package/bin/cli.js +60 -13
  2. package/dist/_virtual/rolldown_runtime.js +39 -0
  3. package/dist/ai/agents/agent.d.ts +3 -3
  4. package/dist/ai/agents/agent.d.ts.map +1 -1
  5. package/dist/ai/agents/agent.js +76 -73
  6. package/dist/ai/agents/index.js +3 -3
  7. package/dist/ai/agents/types.d.ts +3 -3
  8. package/dist/ai/agents/types.d.ts.map +1 -1
  9. package/dist/ai/agents/types.js +1 -3
  10. package/dist/ai/index.js +3 -2
  11. package/dist/ai/providers/rtzr/api.js +25 -25
  12. package/dist/ai/providers/rtzr/error.js +25 -26
  13. package/dist/ai/providers/rtzr/index.js +5 -5
  14. package/dist/ai/providers/rtzr/model.d.ts +1 -1
  15. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/model.js +117 -133
  17. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  18. package/dist/ai/providers/rtzr/options.js +35 -41
  19. package/dist/ai/providers/rtzr/provider.d.ts +1 -1
  20. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  21. package/dist/ai/providers/rtzr/provider.js +53 -51
  22. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  23. package/dist/ai/providers/rtzr/utils.js +84 -84
  24. package/dist/api/base-frame.d.ts +2 -2
  25. package/dist/api/base-frame.d.ts.map +1 -1
  26. package/dist/api/base-frame.js +29 -19
  27. package/dist/api/caster.d.ts +1 -1
  28. package/dist/api/caster.d.ts.map +1 -1
  29. package/dist/api/caster.js +51 -61
  30. package/dist/api/code-converters.d.ts +4 -3
  31. package/dist/api/code-converters.d.ts.map +1 -1
  32. package/dist/api/code-converters.js +226 -249
  33. package/dist/api/config.d.ts +17 -17
  34. package/dist/api/config.d.ts.map +1 -1
  35. package/dist/api/config.js +37 -30
  36. package/dist/api/context.d.ts +10 -10
  37. package/dist/api/context.d.ts.map +1 -1
  38. package/dist/api/context.js +8 -2
  39. package/dist/api/decorators.d.ts +8 -8
  40. package/dist/api/decorators.d.ts.map +1 -1
  41. package/dist/api/decorators.js +245 -268
  42. package/dist/api/index.js +39 -7
  43. package/dist/api/secret.js +22 -15
  44. package/dist/api/sonamu.d.ts +15 -15
  45. package/dist/api/sonamu.d.ts.map +1 -1
  46. package/dist/api/sonamu.js +1012 -1131
  47. package/dist/api/validator.js +88 -79
  48. package/dist/auth/auth-generator.d.ts.map +1 -1
  49. package/dist/auth/auth-generator.js +203 -200
  50. package/dist/auth/better-auth-entities.d.ts +2 -2
  51. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  52. package/dist/auth/better-auth-entities.js +369 -429
  53. package/dist/auth/index.js +21 -6
  54. package/dist/auth/knex-adapter.d.ts +2 -2
  55. package/dist/auth/knex-adapter.d.ts.map +1 -1
  56. package/dist/auth/knex-adapter.js +153 -157
  57. package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
  58. package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
  59. package/dist/auth/plugins/entity-definitions/admin.js +58 -56
  60. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
  61. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
  62. package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
  63. package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
  64. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
  65. package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
  66. package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
  67. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  68. package/dist/auth/plugins/entity-definitions/index.js +26 -29
  69. package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
  70. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
  71. package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
  72. package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
  73. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
  74. package/dist/auth/plugins/entity-definitions/organization.js +362 -421
  75. package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
  76. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
  77. package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
  78. package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
  79. package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
  80. package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
  81. package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
  82. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
  83. package/dist/auth/plugins/entity-definitions/sso.js +94 -107
  84. package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
  85. package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
  86. package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
  87. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  88. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  89. package/dist/auth/plugins/entity-definitions/types.js +1 -10
  90. package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
  91. package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
  92. package/dist/auth/plugins/entity-definitions/username.js +31 -40
  93. package/dist/auth/plugins/index.js +12 -3
  94. package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
  95. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  96. package/dist/auth/plugins/wrappers/admin.js +28 -29
  97. package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
  98. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
  99. package/dist/auth/plugins/wrappers/anonymous.js +23 -22
  100. package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
  101. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
  102. package/dist/auth/plugins/wrappers/api-key.js +39 -34
  103. package/dist/auth/plugins/wrappers/index.js +11 -11
  104. package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
  105. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
  106. package/dist/auth/plugins/wrappers/jwt.js +31 -26
  107. package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
  108. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
  109. package/dist/auth/plugins/wrappers/organization.js +65 -62
  110. package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
  111. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
  112. package/dist/auth/plugins/wrappers/passkey.js +33 -28
  113. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  114. package/dist/auth/plugins/wrappers/phone-number.js +26 -23
  115. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  116. package/dist/auth/plugins/wrappers/sso.js +37 -31
  117. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  118. package/dist/auth/plugins/wrappers/two-factor.js +31 -28
  119. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  120. package/dist/auth/plugins/wrappers/username.js +23 -23
  121. package/dist/bin/build-config.js +31 -31
  122. package/dist/bin/cli.js +1063 -1204
  123. package/dist/bin/fixture.d.ts.map +1 -1
  124. package/dist/bin/fixture.js +266 -259
  125. package/dist/bin/hmr-hook-register.d.ts.map +1 -1
  126. package/dist/bin/hmr-hook-register.js +19 -18
  127. package/dist/bin/test-command.d.ts.map +1 -1
  128. package/dist/bin/test-command.js +180 -177
  129. package/dist/bin/ts-loader-register.js +13 -6
  130. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  131. package/dist/bin/ts-loader-registration.js +28 -38
  132. package/dist/cache/cache-manager.d.ts +1 -1
  133. package/dist/cache/cache-manager.d.ts.map +1 -1
  134. package/dist/cache/cache-manager.js +20 -15
  135. package/dist/cache/decorator.d.ts +1 -1
  136. package/dist/cache/decorator.d.ts.map +1 -1
  137. package/dist/cache/decorator.js +84 -76
  138. package/dist/cache/drivers.js +21 -34
  139. package/dist/cache/index.js +10 -7
  140. package/dist/cache/types.d.ts +2 -2
  141. package/dist/cache/types.d.ts.map +1 -1
  142. package/dist/cache/types.js +1 -6
  143. package/dist/cache-control/cache-control.d.ts +2 -2
  144. package/dist/cache-control/cache-control.d.ts.map +1 -1
  145. package/dist/cache-control/cache-control.js +106 -122
  146. package/dist/cache-control/types.d.ts +2 -2
  147. package/dist/cache-control/types.d.ts.map +1 -1
  148. package/dist/cache-control/types.js +1 -19
  149. package/dist/compress/compress.d.ts +1 -1
  150. package/dist/compress/compress.d.ts.map +1 -1
  151. package/dist/compress/compress.js +58 -56
  152. package/dist/compress/index.js +7 -2
  153. package/dist/compress/types.js +1 -11
  154. package/dist/cone/cone-generator.d.ts +1 -1
  155. package/dist/cone/cone-generator.d.ts.map +1 -1
  156. package/dist/cone/cone-generator.js +216 -219
  157. package/dist/database/_batch_update.d.ts +1 -1
  158. package/dist/database/_batch_update.d.ts.map +1 -1
  159. package/dist/database/_batch_update.js +107 -102
  160. package/dist/database/base-model.d.ts +8 -9
  161. package/dist/database/base-model.d.ts.map +1 -1
  162. package/dist/database/base-model.js +371 -392
  163. package/dist/database/base-model.types.d.ts +5 -5
  164. package/dist/database/base-model.types.d.ts.map +1 -1
  165. package/dist/database/base-model.types.js +1 -20
  166. package/dist/database/db.d.ts +5 -2
  167. package/dist/database/db.d.ts.map +1 -1
  168. package/dist/database/db.js +185 -171
  169. package/dist/database/knex.d.ts +1 -1
  170. package/dist/database/knex.d.ts.map +1 -1
  171. package/dist/database/knex.js +48 -42
  172. package/dist/database/puri-subset.types.d.ts +6 -7
  173. package/dist/database/puri-subset.types.d.ts.map +1 -1
  174. package/dist/database/puri-subset.types.js +1 -16
  175. package/dist/database/puri-wrapper.d.ts +6 -6
  176. package/dist/database/puri-wrapper.d.ts.map +1 -1
  177. package/dist/database/puri-wrapper.js +99 -101
  178. package/dist/database/puri.d.ts +4 -5
  179. package/dist/database/puri.d.ts.map +1 -1
  180. package/dist/database/puri.js +1021 -1227
  181. package/dist/database/puri.types.d.ts +6 -6
  182. package/dist/database/puri.types.d.ts.map +1 -1
  183. package/dist/database/puri.types.js +15 -6
  184. package/dist/database/transaction-context.d.ts +2 -2
  185. package/dist/database/transaction-context.d.ts.map +1 -1
  186. package/dist/database/transaction-context.js +22 -13
  187. package/dist/database/upsert-builder.d.ts +3 -3
  188. package/dist/database/upsert-builder.d.ts.map +1 -1
  189. package/dist/database/upsert-builder.js +405 -465
  190. package/dist/dict/en.js +72 -74
  191. package/dist/dict/index.js +13 -13
  192. package/dist/dict/ko.js +72 -74
  193. package/dist/dict/rc-keys.js +150 -168
  194. package/dist/dict/sd.d.ts +3 -1
  195. package/dist/dict/sd.d.ts.map +1 -1
  196. package/dist/dict/sd.js +54 -40
  197. package/dist/dict/sonamu-dictionary.d.ts +1 -1
  198. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  199. package/dist/dict/sonamu-dictionary.js +887 -955
  200. package/dist/dict/types.js +1 -7
  201. package/dist/dict/utils.js +26 -24
  202. package/dist/entity/entity-manager.d.ts +9 -9
  203. package/dist/entity/entity-manager.d.ts.map +1 -1
  204. package/dist/entity/entity-manager.js +226 -223
  205. package/dist/entity/entity-template-cone.d.ts +1 -1
  206. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  207. package/dist/entity/entity-template-cone.js +152 -151
  208. package/dist/entity/entity.d.ts.map +1 -1
  209. package/dist/entity/entity.js +952 -1089
  210. package/dist/exceptions/error-handler.d.ts +1 -1
  211. package/dist/exceptions/error-handler.d.ts.map +1 -1
  212. package/dist/exceptions/error-handler.js +32 -27
  213. package/dist/exceptions/so-exceptions.d.ts +1 -1
  214. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  215. package/dist/exceptions/so-exceptions.js +61 -68
  216. package/dist/filter/index.js +9 -3
  217. package/dist/filter/types.js +92 -88
  218. package/dist/filter/utils.d.ts +1 -1
  219. package/dist/filter/utils.d.ts.map +1 -1
  220. package/dist/filter/utils.js +147 -161
  221. package/dist/index.js +87 -40
  222. package/dist/logger/category.d.ts.map +1 -1
  223. package/dist/logger/category.js +30 -29
  224. package/dist/logger/configure.d.ts.map +1 -1
  225. package/dist/logger/configure.js +83 -107
  226. package/dist/migration/code-generation.d.ts +2 -2
  227. package/dist/migration/code-generation.d.ts.map +1 -1
  228. package/dist/migration/code-generation.js +1385 -1578
  229. package/dist/migration/migration-set.d.ts +1 -1
  230. package/dist/migration/migration-set.d.ts.map +1 -1
  231. package/dist/migration/migration-set.js +177 -227
  232. package/dist/migration/migrator.d.ts +4 -3
  233. package/dist/migration/migrator.d.ts.map +1 -1
  234. package/dist/migration/migrator.js +340 -345
  235. package/dist/migration/postgresql-schema-reader.d.ts +2 -2
  236. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  237. package/dist/migration/postgresql-schema-reader.js +506 -564
  238. package/dist/migration/slack-confirm.d.ts +2 -2
  239. package/dist/migration/slack-confirm.d.ts.map +1 -1
  240. package/dist/migration/slack-confirm.js +205 -193
  241. package/dist/migration/types.d.ts +2 -2
  242. package/dist/migration/types.d.ts.map +1 -1
  243. package/dist/migration/types.js +1 -3
  244. package/dist/naite/messaging-types.d.ts +1 -0
  245. package/dist/naite/messaging-types.d.ts.map +1 -1
  246. package/dist/naite/messaging-types.js +1 -7
  247. package/dist/naite/naite-reporter.d.ts +2 -2
  248. package/dist/naite/naite-reporter.d.ts.map +1 -1
  249. package/dist/naite/naite-reporter.js +127 -120
  250. package/dist/naite/naite.d.ts +3 -2
  251. package/dist/naite/naite.d.ts.map +1 -1
  252. package/dist/naite/naite.js +266 -300
  253. package/dist/ssr/index.d.ts +2 -2
  254. package/dist/ssr/index.d.ts.map +1 -1
  255. package/dist/ssr/index.js +13 -3
  256. package/dist/ssr/registry.d.ts +1 -1
  257. package/dist/ssr/registry.d.ts.map +1 -1
  258. package/dist/ssr/registry.js +45 -37
  259. package/dist/ssr/renderer.d.ts +4 -4
  260. package/dist/ssr/renderer.d.ts.map +1 -1
  261. package/dist/ssr/renderer.js +84 -91
  262. package/dist/ssr/types.d.ts +2 -2
  263. package/dist/ssr/types.d.ts.map +1 -1
  264. package/dist/ssr/types.js +1 -3
  265. package/dist/storage/base-file.js +54 -41
  266. package/dist/storage/buffered-file.d.ts +2 -2
  267. package/dist/storage/buffered-file.d.ts.map +1 -1
  268. package/dist/storage/buffered-file.js +51 -44
  269. package/dist/storage/drivers.d.ts +2 -2
  270. package/dist/storage/drivers.d.ts.map +1 -1
  271. package/dist/storage/drivers.js +12 -7
  272. package/dist/storage/index.js +14 -7
  273. package/dist/storage/s3-driver.d.ts +2 -2
  274. package/dist/storage/s3-driver.d.ts.map +1 -1
  275. package/dist/storage/s3-driver.js +52 -48
  276. package/dist/storage/storage-manager.d.ts +2 -2
  277. package/dist/storage/storage-manager.d.ts.map +1 -1
  278. package/dist/storage/storage-manager.js +33 -25
  279. package/dist/storage/types.d.ts +2 -2
  280. package/dist/storage/types.d.ts.map +1 -1
  281. package/dist/storage/types.js +1 -5
  282. package/dist/storage/uploaded-file.d.ts +1 -1
  283. package/dist/storage/uploaded-file.d.ts.map +1 -1
  284. package/dist/storage/uploaded-file.js +45 -35
  285. package/dist/stream/index.js +7 -2
  286. package/dist/stream/sse.d.ts +2 -2
  287. package/dist/stream/sse.d.ts.map +1 -1
  288. package/dist/stream/sse.js +72 -67
  289. package/dist/syncer/api-parser.d.ts +1 -1
  290. package/dist/syncer/api-parser.d.ts.map +1 -1
  291. package/dist/syncer/api-parser.js +224 -245
  292. package/dist/syncer/checksum.d.ts +1 -1
  293. package/dist/syncer/checksum.d.ts.map +1 -1
  294. package/dist/syncer/checksum.js +86 -72
  295. package/dist/syncer/code-generator.d.ts +2 -2
  296. package/dist/syncer/code-generator.d.ts.map +1 -1
  297. package/dist/syncer/code-generator.js +154 -160
  298. package/dist/syncer/entity-operations.d.ts +1 -1
  299. package/dist/syncer/entity-operations.d.ts.map +1 -1
  300. package/dist/syncer/entity-operations.js +63 -54
  301. package/dist/syncer/file-patterns.d.ts +1 -1
  302. package/dist/syncer/file-patterns.d.ts.map +1 -1
  303. package/dist/syncer/file-patterns.js +38 -38
  304. package/dist/syncer/index.js +19 -8
  305. package/dist/syncer/module-loader.d.ts +5 -5
  306. package/dist/syncer/module-loader.d.ts.map +1 -1
  307. package/dist/syncer/module-loader.js +83 -78
  308. package/dist/syncer/syncer-actions.d.ts +2 -2
  309. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  310. package/dist/syncer/syncer-actions.js +76 -91
  311. package/dist/syncer/syncer.d.ts +7 -6
  312. package/dist/syncer/syncer.d.ts.map +1 -1
  313. package/dist/syncer/syncer.js +426 -492
  314. package/dist/tasks/decorator.d.ts +3 -3
  315. package/dist/tasks/decorator.d.ts.map +1 -1
  316. package/dist/tasks/decorator.js +32 -28
  317. package/dist/tasks/step-wrapper.d.ts +1 -1
  318. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  319. package/dist/tasks/step-wrapper.js +42 -41
  320. package/dist/tasks/workflow-manager.d.ts +2 -2
  321. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  322. package/dist/tasks/workflow-manager.js +192 -221
  323. package/dist/template/entity-converter.d.ts +1 -1
  324. package/dist/template/entity-converter.d.ts.map +1 -1
  325. package/dist/template/entity-converter.js +103 -103
  326. package/dist/template/helpers.d.ts.map +1 -1
  327. package/dist/template/helpers.js +163 -163
  328. package/dist/template/implementations/entity.template.d.ts +1 -1
  329. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  330. package/dist/template/implementations/entity.template.js +76 -85
  331. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  332. package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
  333. package/dist/template/implementations/entry-server.template.js +32 -27
  334. package/dist/template/implementations/generated.template.d.ts +1 -1
  335. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  336. package/dist/template/implementations/generated.template.js +254 -275
  337. package/dist/template/implementations/generated_http.template.d.ts +2 -2
  338. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  339. package/dist/template/implementations/generated_http.template.js +114 -133
  340. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  341. package/dist/template/implementations/generated_sso.template.js +249 -275
  342. package/dist/template/implementations/init_types.template.d.ts +1 -1
  343. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  344. package/dist/template/implementations/init_types.template.js +40 -34
  345. package/dist/template/implementations/model.template.d.ts +1 -1
  346. package/dist/template/implementations/model.template.d.ts.map +1 -1
  347. package/dist/template/implementations/model.template.js +56 -53
  348. package/dist/template/implementations/model_test.template.d.ts +1 -1
  349. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  350. package/dist/template/implementations/model_test.template.js +32 -24
  351. package/dist/template/implementations/queries.template.d.ts +1 -1
  352. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  353. package/dist/template/implementations/queries.template.js +84 -89
  354. package/dist/template/implementations/sd.template.d.ts +1 -1
  355. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  356. package/dist/template/implementations/sd.template.js +137 -144
  357. package/dist/template/implementations/services.template.d.ts +1 -1
  358. package/dist/template/implementations/services.template.d.ts.map +1 -1
  359. package/dist/template/implementations/services.template.js +164 -189
  360. package/dist/template/implementations/view_form.template.d.ts +1 -1
  361. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  362. package/dist/template/implementations/view_form.template.js +258 -285
  363. package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
  364. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  365. package/dist/template/implementations/view_id_all_select.template.js +31 -25
  366. package/dist/template/implementations/view_list.template.d.ts +1 -1
  367. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  368. package/dist/template/implementations/view_list.template.js +304 -355
  369. package/dist/template/implementations/view_search_input.template.d.ts +1 -1
  370. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  371. package/dist/template/implementations/view_search_input.template.js +31 -27
  372. package/dist/template/index.js +21 -7
  373. package/dist/template/template-manager.d.ts +1 -1
  374. package/dist/template/template-manager.d.ts.map +1 -1
  375. package/dist/template/template-manager.js +132 -123
  376. package/dist/template/template-types.js +8 -6
  377. package/dist/template/template.d.ts +2 -2
  378. package/dist/template/template.d.ts.map +1 -1
  379. package/dist/template/template.js +73 -68
  380. package/dist/template/zod-converter.d.ts.map +1 -1
  381. package/dist/template/zod-converter.js +603 -657
  382. package/dist/testing/_relation-graph.d.ts +1 -1
  383. package/dist/testing/_relation-graph.d.ts.map +1 -1
  384. package/dist/testing/_relation-graph.js +93 -88
  385. package/dist/testing/bootstrap.d.ts +22 -13
  386. package/dist/testing/bootstrap.d.ts.map +1 -1
  387. package/dist/testing/bootstrap.js +114 -114
  388. package/dist/testing/data-explorer.d.ts +3 -3
  389. package/dist/testing/data-explorer.d.ts.map +1 -1
  390. package/dist/testing/data-explorer.js +237 -265
  391. package/dist/testing/dev-test-routes.d.ts +2 -2
  392. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  393. package/dist/testing/dev-test-routes.js +258 -249
  394. package/dist/testing/dev-vitest-manager.d.ts +1 -1
  395. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  396. package/dist/testing/dev-vitest-manager.js +514 -539
  397. package/dist/testing/faker-mappings.js +422 -420
  398. package/dist/testing/fixture-generator.d.ts +3 -3
  399. package/dist/testing/fixture-generator.d.ts.map +1 -1
  400. package/dist/testing/fixture-generator.js +1216 -1346
  401. package/dist/testing/fixture-loader.js +26 -25
  402. package/dist/testing/fixture-manager.d.ts +3 -3
  403. package/dist/testing/fixture-manager.d.ts.map +1 -1
  404. package/dist/testing/fixture-manager.js +706 -776
  405. package/dist/testing/global-setup.js +53 -49
  406. package/dist/testing/index.js +19 -11
  407. package/dist/testing/naite-vitest-reporter.js +18 -13
  408. package/dist/testing/parallel-db-manager.d.ts +1 -1
  409. package/dist/testing/parallel-db-manager.d.ts.map +1 -1
  410. package/dist/testing/parallel-db-manager.js +63 -78
  411. package/dist/testing/vitest-helpers.d.ts +1 -1
  412. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  413. package/dist/testing/vitest-helpers.js +37 -33
  414. package/dist/types/types.d.ts +28 -28
  415. package/dist/types/types.d.ts.map +1 -1
  416. package/dist/types/types.js +764 -890
  417. package/dist/ui/ai-api.d.ts +1 -1
  418. package/dist/ui/ai-api.d.ts.map +1 -1
  419. package/dist/ui/ai-api.js +52 -42
  420. package/dist/ui/ai-client.d.ts +1 -2
  421. package/dist/ui/ai-client.d.ts.map +1 -1
  422. package/dist/ui/ai-client.js +353 -388
  423. package/dist/ui/api.d.ts +1 -1
  424. package/dist/ui/api.d.ts.map +1 -1
  425. package/dist/ui/api.js +903 -1145
  426. package/dist/ui/cdd-service.d.ts +1 -1
  427. package/dist/ui/cdd-service.d.ts.map +1 -1
  428. package/dist/ui/cdd-service.js +406 -407
  429. package/dist/ui/cdd-types.js +1 -3
  430. package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
  431. package/dist/ui-web/assets/index-DejDON8K.js +238 -0
  432. package/dist/ui-web/index.html +3 -3
  433. package/dist/utils/async-utils.js +57 -45
  434. package/dist/utils/console-util.d.ts.map +1 -1
  435. package/dist/utils/console-util.js +104 -87
  436. package/dist/utils/controller.js +26 -19
  437. package/dist/utils/esm-utils.js +49 -38
  438. package/dist/utils/formatter.d.ts +1 -2
  439. package/dist/utils/formatter.d.ts.map +1 -1
  440. package/dist/utils/formatter.js +89 -115
  441. package/dist/utils/fs-utils.d.ts.map +1 -1
  442. package/dist/utils/fs-utils.js +68 -65
  443. package/dist/utils/lodash-able.js +11 -4
  444. package/dist/utils/model.d.ts +1 -1
  445. package/dist/utils/model.d.ts.map +1 -1
  446. package/dist/utils/model.js +21 -19
  447. package/dist/utils/object-utils.js +148 -186
  448. package/dist/utils/path-utils.js +67 -57
  449. package/dist/utils/process-utils.d.ts.map +1 -1
  450. package/dist/utils/process-utils.js +37 -31
  451. package/dist/utils/sql-parser.d.ts +1 -1
  452. package/dist/utils/sql-parser.d.ts.map +1 -1
  453. package/dist/utils/sql-parser.js +40 -40
  454. package/dist/utils/type-utils.js +44 -43
  455. package/dist/utils/utils.d.ts +2 -3
  456. package/dist/utils/utils.d.ts.map +1 -1
  457. package/dist/utils/utils.js +81 -93
  458. package/dist/utils/zod-error.d.ts +1 -1
  459. package/dist/utils/zod-error.d.ts.map +1 -1
  460. package/dist/utils/zod-error.js +24 -17
  461. package/dist/vector/chunking.d.ts +1 -1
  462. package/dist/vector/chunking.d.ts.map +1 -1
  463. package/dist/vector/chunking.js +100 -94
  464. package/dist/vector/config.d.ts +1 -1
  465. package/dist/vector/config.d.ts.map +1 -1
  466. package/dist/vector/config.js +76 -78
  467. package/dist/vector/embedding.d.ts +1 -1
  468. package/dist/vector/embedding.d.ts.map +1 -1
  469. package/dist/vector/embedding.js +128 -125
  470. package/dist/vector/index.js +5 -5
  471. package/dist/vector/types.js +1 -5
  472. package/package.json +31 -36
  473. package/src/ai/agents/agent.ts +12 -5
  474. package/src/ai/agents/types.ts +5 -5
  475. package/src/ai/providers/rtzr/model.ts +8 -10
  476. package/src/ai/providers/rtzr/options.ts +2 -1
  477. package/src/ai/providers/rtzr/provider.ts +5 -3
  478. package/src/ai/providers/rtzr/utils.ts +2 -7
  479. package/src/api/__tests__/config.test.ts +15 -8
  480. package/src/api/base-frame.ts +5 -3
  481. package/src/api/caster.ts +7 -6
  482. package/src/api/code-converters.ts +23 -26
  483. package/src/api/config.ts +23 -17
  484. package/src/api/context.ts +18 -11
  485. package/src/api/decorators.ts +17 -18
  486. package/src/api/sonamu.ts +44 -49
  487. package/src/auth/auth-generator.ts +4 -6
  488. package/src/auth/better-auth-entities.ts +3 -2
  489. package/src/auth/knex-adapter.ts +6 -5
  490. package/src/auth/plugins/entity-definitions/admin.ts +1 -1
  491. package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
  492. package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
  493. package/src/auth/plugins/entity-definitions/index.ts +1 -1
  494. package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
  495. package/src/auth/plugins/entity-definitions/organization.ts +1 -1
  496. package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
  497. package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
  498. package/src/auth/plugins/entity-definitions/sso.ts +1 -1
  499. package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
  500. package/src/auth/plugins/entity-definitions/types.ts +1 -1
  501. package/src/auth/plugins/entity-definitions/username.ts +1 -1
  502. package/src/auth/plugins/wrappers/admin.ts +3 -1
  503. package/src/auth/plugins/wrappers/anonymous.ts +3 -1
  504. package/src/auth/plugins/wrappers/api-key.ts +3 -1
  505. package/src/auth/plugins/wrappers/jwt.ts +3 -1
  506. package/src/auth/plugins/wrappers/organization.ts +3 -1
  507. package/src/auth/plugins/wrappers/passkey.ts +3 -1
  508. package/src/auth/plugins/wrappers/phone-number.ts +3 -1
  509. package/src/auth/plugins/wrappers/sso.ts +2 -1
  510. package/src/auth/plugins/wrappers/two-factor.ts +3 -1
  511. package/src/auth/plugins/wrappers/username.ts +3 -1
  512. package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
  513. package/src/bin/build-config.ts +3 -3
  514. package/src/bin/cli.ts +27 -25
  515. package/src/bin/fixture.ts +4 -2
  516. package/src/bin/hmr-hook-register.ts +1 -0
  517. package/src/bin/test-command.ts +4 -2
  518. package/src/bin/ts-loader-registration.ts +6 -22
  519. package/src/cache/cache-manager.ts +2 -1
  520. package/src/cache/decorator.ts +2 -2
  521. package/src/cache/types.ts +3 -3
  522. package/src/cache-control/cache-control.ts +3 -2
  523. package/src/cache-control/types.ts +2 -2
  524. package/src/compress/compress.ts +1 -1
  525. package/src/cone/cone-generator.ts +5 -3
  526. package/src/database/_batch_update.ts +1 -1
  527. package/src/database/base-model.ts +20 -14
  528. package/src/database/base-model.types.ts +12 -11
  529. package/src/database/db.ts +56 -21
  530. package/src/database/knex.ts +2 -2
  531. package/src/database/puri-subset.test-d.ts +33 -32
  532. package/src/database/puri-subset.types.ts +6 -7
  533. package/src/database/puri-wrapper.ts +29 -26
  534. package/src/database/puri.ts +36 -34
  535. package/src/database/puri.types.test-d.ts +6 -5
  536. package/src/database/puri.types.ts +9 -12
  537. package/src/database/transaction-context.ts +2 -2
  538. package/src/database/upsert-builder.ts +17 -10
  539. package/src/dict/sd.ts +17 -4
  540. package/src/dict/sonamu-dictionary.ts +23 -17
  541. package/src/entity/entity-manager.ts +9 -7
  542. package/src/entity/entity-template-cone.ts +10 -3
  543. package/src/entity/entity.ts +20 -16
  544. package/src/exceptions/error-handler.ts +2 -1
  545. package/src/exceptions/so-exceptions.ts +1 -1
  546. package/src/filter/utils.ts +3 -2
  547. package/src/logger/category.ts +1 -0
  548. package/src/logger/configure.ts +5 -5
  549. package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
  550. package/src/migration/code-generation.ts +26 -25
  551. package/src/migration/migration-set.ts +16 -18
  552. package/src/migration/migrator.ts +38 -33
  553. package/src/migration/postgresql-schema-reader.ts +12 -12
  554. package/src/migration/slack-confirm.ts +5 -4
  555. package/src/migration/types.ts +2 -2
  556. package/src/naite/messaging-types.ts +1 -1
  557. package/src/naite/naite-reporter.ts +5 -3
  558. package/src/naite/naite.ts +12 -7
  559. package/src/shared/app.shared.ts.txt +2 -2
  560. package/src/shared/web.shared.ts.txt +2 -2
  561. package/src/skills/AGENTS.md +19 -18
  562. package/src/skills/commands/sonamu-skills.md +9 -9
  563. package/src/skills/sonamu/SKILL.md +111 -104
  564. package/src/skills/sonamu/ai-agents.md +27 -26
  565. package/src/skills/sonamu/api.md +81 -69
  566. package/src/skills/sonamu/auth-migration.md +13 -27
  567. package/src/skills/sonamu/auth-plugins.md +41 -31
  568. package/src/skills/sonamu/auth.md +30 -24
  569. package/src/skills/sonamu/cdd.md +26 -17
  570. package/src/skills/sonamu/cone.md +50 -50
  571. package/src/skills/sonamu/config.md +74 -51
  572. package/src/skills/sonamu/create-sonamu.md +31 -19
  573. package/src/skills/sonamu/database.md +43 -26
  574. package/src/skills/sonamu/entity-basic.md +61 -61
  575. package/src/skills/sonamu/entity-relations.md +84 -80
  576. package/src/skills/sonamu/entity-validation-checklist.md +19 -15
  577. package/src/skills/sonamu/fixture-cli.md +52 -30
  578. package/src/skills/sonamu/framework-change.md +9 -7
  579. package/src/skills/sonamu/frontend.md +64 -82
  580. package/src/skills/sonamu/i18n.md +45 -37
  581. package/src/skills/sonamu/migration.md +54 -31
  582. package/src/skills/sonamu/model.md +98 -66
  583. package/src/skills/sonamu/naite.md +34 -32
  584. package/src/skills/sonamu/project-init.md +28 -8
  585. package/src/skills/sonamu/puri.md +82 -91
  586. package/src/skills/sonamu/scaffolding.md +44 -32
  587. package/src/skills/sonamu/skill-contribution.md +50 -45
  588. package/src/skills/sonamu/subset.md +13 -13
  589. package/src/skills/sonamu/tasks.md +73 -58
  590. package/src/skills/sonamu/testing-devrunner.md +56 -36
  591. package/src/skills/sonamu/testing.md +23 -58
  592. package/src/skills/sonamu/upsert.md +32 -31
  593. package/src/skills/sonamu/vector.md +37 -36
  594. package/src/ssr/index.ts +2 -12
  595. package/src/ssr/registry.ts +1 -1
  596. package/src/ssr/renderer.ts +7 -5
  597. package/src/ssr/types.ts +2 -2
  598. package/src/storage/buffered-file.ts +4 -2
  599. package/src/storage/drivers.ts +3 -2
  600. package/src/storage/s3-driver.ts +7 -4
  601. package/src/storage/storage-manager.ts +3 -2
  602. package/src/storage/types.ts +3 -2
  603. package/src/storage/uploaded-file.ts +1 -1
  604. package/src/stream/sse.ts +2 -2
  605. package/src/syncer/api-parser.ts +8 -5
  606. package/src/syncer/checksum.ts +9 -5
  607. package/src/syncer/code-generator.ts +16 -8
  608. package/src/syncer/entity-operations.ts +5 -3
  609. package/src/syncer/file-patterns.ts +2 -1
  610. package/src/syncer/module-loader.ts +9 -6
  611. package/src/syncer/syncer-actions.ts +5 -3
  612. package/src/syncer/syncer.ts +18 -24
  613. package/src/tasks/decorator.ts +10 -8
  614. package/src/tasks/step-wrapper.ts +1 -1
  615. package/src/tasks/workflow-manager.ts +18 -15
  616. package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
  617. package/src/template/entity-converter.ts +4 -2
  618. package/src/template/generated.template.test-d.ts +2 -1
  619. package/src/template/helpers.ts +5 -2
  620. package/src/template/implementations/entity.template.ts +9 -8
  621. package/src/template/implementations/entry-server.template.ts +1 -1
  622. package/src/template/implementations/generated.template.ts +21 -29
  623. package/src/template/implementations/generated_http.template.ts +9 -6
  624. package/src/template/implementations/generated_sso.template.ts +6 -4
  625. package/src/template/implementations/init_types.template.ts +3 -2
  626. package/src/template/implementations/model.template.ts +4 -2
  627. package/src/template/implementations/model_test.template.ts +3 -2
  628. package/src/template/implementations/queries.template.ts +6 -14
  629. package/src/template/implementations/sd.template.ts +4 -2
  630. package/src/template/implementations/services.template.ts +7 -11
  631. package/src/template/implementations/view_form.template.ts +5 -3
  632. package/src/template/implementations/view_id_all_select.template.ts +3 -2
  633. package/src/template/implementations/view_list.template.ts +7 -5
  634. package/src/template/implementations/view_search_input.template.ts +3 -2
  635. package/src/template/template-manager.ts +4 -3
  636. package/src/template/template.ts +4 -3
  637. package/src/template/zod-converter.ts +10 -7
  638. package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
  639. package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
  640. package/src/testing/_relation-graph.ts +2 -2
  641. package/src/testing/bootstrap.ts +55 -27
  642. package/src/testing/data-explorer.ts +5 -4
  643. package/src/testing/dev-test-routes.ts +8 -5
  644. package/src/testing/dev-vitest-manager.ts +13 -12
  645. package/src/testing/fixture-generator.ts +11 -17
  646. package/src/testing/fixture-manager.ts +21 -17
  647. package/src/testing/parallel-db-manager.ts +2 -1
  648. package/src/testing/vitest-helpers.ts +2 -1
  649. package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
  650. package/src/types/types.ts +8 -8
  651. package/src/typings/knex.d.ts +4 -4
  652. package/src/ui/ai-api.ts +5 -3
  653. package/src/ui/ai-client.ts +6 -5
  654. package/src/ui/api.ts +25 -23
  655. package/src/ui/cdd-service.ts +12 -11
  656. package/src/utils/console-util.ts +3 -1
  657. package/src/utils/formatter.ts +94 -102
  658. package/src/utils/fs-utils.ts +2 -1
  659. package/src/utils/model.ts +2 -2
  660. package/src/utils/object-utils.ts +3 -3
  661. package/src/utils/process-utils.ts +2 -1
  662. package/src/utils/sql-parser.ts +10 -1
  663. package/src/utils/type-utils.ts +3 -3
  664. package/src/utils/utils.ts +9 -7
  665. package/src/utils/zod-error.ts +1 -1
  666. package/src/vector/chunking.ts +1 -1
  667. package/src/vector/config.ts +1 -1
  668. package/src/vector/embedding.ts +11 -9
  669. package/tsdown.api.config.ts +50 -0
  670. package/.swcrc.project-default +0 -18
  671. package/dist/api/__tests__/config.test.js +0 -189
  672. package/dist/bin/__tests__/test-command.test.js +0 -112
  673. package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
  674. package/dist/database/puri-subset.test-d.js +0 -89
  675. package/dist/database/puri.types.test-d.js +0 -129
  676. package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
  677. package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
  678. package/dist/template/generated.template.test-d.js +0 -24
  679. package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
  680. package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
  681. package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
  682. package/dist/typings/knex.d.js +0 -3
  683. package/dist/ui-web/assets/index-CKo0Z2Iu.css +0 -1
  684. package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
@@ -1,263 +1,240 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+ import { ApiParamType, init_types } from "../types/types.js";
3
+ import { z as z$1 } from "zod";
4
+
5
+ //#region src/api/code-converters.ts
1
6
  /**
2
- * code-converters는 API 타입 정의들을 Zod 객체나 TypeScript 코드로 변환하는 함수들을 제공합니다.
3
- *
4
- * 1. API 시리즈들:
5
- * - ExtendedApi, ApiParam, ApiParamType
6
- * - API 메타데이터를 표현하는 타입 정의들
7
- *
8
- * 2. ZodObject 변환
9
- * - API 타입 정의 → Zod 타입 인스턴스 (런타임 밸리데이션용)
10
- * - getZodTypeFromApiParamType → getZodObjectFromApiParams → getZodObjectFromApi
11
- *
12
- * 3. TsTypeDef 변환
13
- * - API 타입 정의 → TypeScript 타입 코드 문자열 (코드 생성용)
14
- * - apiParamTypeToTsType → apiParamToTsCode, apiParamToTsCodeAsObject
15
- *
16
- * 참고:
17
- * - ZodTypeDef 생성 (Zod 코드 문자열): zod-converter.ts의 zodTypeToZodCode 사용
18
- * - EntityProp 변환: zod-converter.ts 참조
19
- */ import { z } from "zod";
20
- import { ApiParamType } from "../types/types.js";
7
+ * code-converters는 API 타입 정의들을 Zod 객체나 TypeScript 코드로 변환하는 함수들을 제공합니다.
8
+ *
9
+ * 1. API 시리즈들:
10
+ * - ExtendedApi, ApiParam, ApiParamType
11
+ * - API 메타데이터를 표현하는 타입 정의들
12
+ *
13
+ * 2. ZodObject 변환
14
+ * - API 타입 정의 → Zod 타입 인스턴스 (런타임 밸리데이션용)
15
+ * - getZodTypeFromApiParamType → getZodObjectFromApiParams → getZodObjectFromApi
16
+ *
17
+ * 3. TsTypeDef 변환
18
+ * - API 타입 정의 → TypeScript 타입 코드 문자열 (코드 생성용)
19
+ * - apiParamTypeToTsType → apiParamToTsCode, apiParamToTsCodeAsObject
20
+ *
21
+ * 참고:
22
+ * - ZodTypeDef 생성 (Zod 코드 문자열): zod-converter.ts의 zodTypeToZodCode 사용
23
+ * - EntityProp 변환: zod-converter.ts 참조
24
+ */
21
25
  /**
22
- * Promise 타입을 한 번 언래핑하여 내부 타입을 반환합니다.
23
- * Promise가 아닌 경우 원본 타입을 그대로 반환합니다.
24
- */ export function unwrapPromiseOnce(paramType) {
25
- if (ApiParamType.isPromise(paramType)) {
26
- return paramType.args?.[0];
27
- } else {
28
- return paramType;
29
- }
26
+ * Promise 타입을 한 번 언래핑하여 내부 타입을 반환합니다.
27
+ * Promise가 아닌 경우 원본 타입을 그대로 반환합니다.
28
+ */
29
+ function unwrapPromiseOnce(paramType) {
30
+ if (ApiParamType.isPromise(paramType)) {
31
+ return paramType.args?.[0];
32
+ } else {
33
+ return paramType;
34
+ }
30
35
  }
31
- /*
32
- * API를 구성하는 요소들을 ZodObject로 변환하기 위한 함수들입니다.
33
- */ /**
34
- * ApiParamType을 Zod 타입 인스턴스로 변환합니다.
35
- * string, number, array, union 등 모든 ApiParamType을 처리하며,
36
- * 순환참조가 발생하는 경우 z.unknown()으로 fallback합니다.
37
- */ export function getZodTypeFromApiParamType(paramType, references) {
38
- switch(paramType){
39
- case "string":
40
- return z.string();
41
- case "number":
42
- return z.number();
43
- case "boolean":
44
- return z.boolean();
45
- default:
46
- {
47
- const advType = paramType;
48
- switch(advType.t){
49
- case "string-literal":
50
- case "numeric-literal":
51
- return z.literal(advType.value);
52
- case "object":
53
- {
54
- const objType = paramType;
55
- return getZodObjectFromApiParams(objType.props);
56
- }
57
- case "array":
58
- {
59
- const arrType = paramType;
60
- return z.array(getZodTypeFromApiParamType(arrType.elementsType, references));
61
- }
62
- case "ref":
63
- {
64
- const refType = paramType;
65
- // Date 타입 처리
66
- if (refType.id === "Date") {
67
- return z.date();
68
- }
69
- // 객체 키 관리 유틸리티
70
- if ([
71
- "Pick",
72
- "Omit"
73
- ].includes(refType.id)) {
74
- if (refType.args?.length !== 2) {
75
- throw new Error(`잘못된 ${refType.id}`);
76
- }
77
- const [obj, literalOrUnion] = refType.args.map((arg)=>getZodTypeFromApiParamType(arg, references));
78
- let keys = [];
79
- if (literalOrUnion instanceof z.ZodUnion) {
80
- keys = literalOrUnion.def.options.map((option)=>option.def.values[0]);
81
- } else {
82
- keys = literalOrUnion.def.values;
83
- }
84
- const keyRecord = Object.fromEntries(keys.map((key)=>[
85
- key,
86
- true
87
- ]));
88
- if (refType.id === "Pick") {
89
- if (obj.pick) {
90
- // biome-ignore lint/suspicious/noExplicitAny: Zod 4.3.6 pick 타입 호환성
91
- return obj.pick(keyRecord);
92
- }
93
- } else {
94
- if (obj.omit) {
95
- // biome-ignore lint/suspicious/noExplicitAny: Zod 4.3.6 omit 타입 호환성
96
- return obj.omit(keyRecord);
97
- }
98
- }
99
- }
100
- if ([
101
- "Partial"
102
- ].includes(refType.id)) {
103
- if (refType.args?.length !== 1) {
104
- throw new Error(`잘못된 ${refType.id}`);
105
- }
106
- const obj = getZodTypeFromApiParamType(refType.args[0], references);
107
- // biome-ignore lint/suspicious/noExplicitAny: Partial 인수 타입 캐스팅
108
- return obj.partial();
109
- }
110
- const reference = references[refType.id];
111
- if (reference === undefined) {
112
- return z.unknown();
113
- // throw new Error(`ref 참조 불가 ${refType.id}`);
114
- }
115
- return reference;
116
- }
117
- case "union":
118
- {
119
- const unionType = paramType;
120
- // nullable 유니온
121
- if (unionType.types.length === 2 && unionType.types.some((type)=>type === "null")) {
122
- if (unionType.types[0] === "null") {
123
- return getZodTypeFromApiParamType(unionType.types[1], references).nullable();
124
- } else {
125
- return getZodTypeFromApiParamType(unionType.types[0], references).nullable();
126
- }
127
- }
128
- // 일반 유니온
129
- return z.union(unionType.types.map((type)=>getZodTypeFromApiParamType(type, references)));
130
- }
131
- case "intersection":
132
- {
133
- const intersectionType = paramType;
134
- return intersectionType.types.reduce((result, type, index)=>{
135
- const resolvedType = getZodTypeFromApiParamType(type, references);
136
- if (index === 0) {
137
- return resolvedType;
138
- } else {
139
- return z.intersection(result, resolvedType);
140
- }
141
- }, z.unknown());
142
- }
143
- case "tuple-type":
144
- {
145
- const tupleType = paramType;
146
- return z.tuple(// biome-ignore lint/suspicious/noExplicitAny: 생성되는 ZodTuple의 타입을 추적하기 어려움
147
- tupleType.elements.map((elem)=>getZodTypeFromApiParamType(elem, references)));
148
- }
149
- }
150
- return z.unknown();
151
- }
152
- }
36
+ /**
37
+ * ApiParamType을 Zod 타입 인스턴스로 변환합니다.
38
+ * string, number, array, union 등 모든 ApiParamType을 처리하며,
39
+ * 순환참조가 발생하는 경우 z.unknown()으로 fallback합니다.
40
+ */
41
+ function getZodTypeFromApiParamType(paramType, references) {
42
+ switch (paramType) {
43
+ case "string": return z$1.string();
44
+ case "number": return z$1.number();
45
+ case "boolean": return z$1.boolean();
46
+ default: {
47
+ const advType = paramType;
48
+ switch (advType.t) {
49
+ case "string-literal":
50
+ case "numeric-literal": return z$1.literal(advType.value);
51
+ case "object": {
52
+ const objType = paramType;
53
+ return getZodObjectFromApiParams(objType.props);
54
+ }
55
+ case "array": {
56
+ const arrType = paramType;
57
+ return z$1.array(getZodTypeFromApiParamType(arrType.elementsType, references));
58
+ }
59
+ case "ref": {
60
+ const refType = paramType;
61
+ if (refType.id === "Date") {
62
+ return z$1.date();
63
+ }
64
+ if (["Pick", "Omit"].includes(refType.id)) {
65
+ if (refType.args?.length !== 2) {
66
+ throw new Error(`잘못된 ${refType.id}`);
67
+ }
68
+ const [obj, literalOrUnion] = refType.args.map((arg) => getZodTypeFromApiParamType(arg, references));
69
+ let keys = [];
70
+ if (literalOrUnion instanceof z$1.ZodUnion) {
71
+ keys = literalOrUnion.def.options.map((option) => option.def.values[0]);
72
+ } else {
73
+ keys = literalOrUnion.def.values;
74
+ }
75
+ const keyRecord = Object.fromEntries(keys.map((key) => [key, true]));
76
+ if (refType.id === "Pick") {
77
+ if (obj.pick) {
78
+ return obj.pick(keyRecord);
79
+ }
80
+ } else {
81
+ if (obj.omit) {
82
+ return obj.omit(keyRecord);
83
+ }
84
+ }
85
+ }
86
+ if (["Partial"].includes(refType.id)) {
87
+ if (refType.args?.length !== 1) {
88
+ throw new Error(`잘못된 ${refType.id}`);
89
+ }
90
+ const obj = getZodTypeFromApiParamType(refType.args[0], references);
91
+ return obj.partial();
92
+ }
93
+ const reference = references[refType.id];
94
+ if (reference === undefined) {
95
+ return z$1.unknown();
96
+ }
97
+ return reference;
98
+ }
99
+ case "union": {
100
+ const unionType = paramType;
101
+ if (unionType.types.length === 2 && unionType.types.some((type) => type === "null")) {
102
+ if (unionType.types[0] === "null") {
103
+ return getZodTypeFromApiParamType(unionType.types[1], references).nullable();
104
+ } else {
105
+ return getZodTypeFromApiParamType(unionType.types[0], references).nullable();
106
+ }
107
+ }
108
+ return z$1.union(unionType.types.map((type) => getZodTypeFromApiParamType(type, references)));
109
+ }
110
+ case "intersection": {
111
+ const intersectionType = paramType;
112
+ return intersectionType.types.reduce((result, type, index) => {
113
+ const resolvedType = getZodTypeFromApiParamType(type, references);
114
+ if (index === 0) {
115
+ return resolvedType;
116
+ } else {
117
+ return z$1.intersection(result, resolvedType);
118
+ }
119
+ }, z$1.unknown());
120
+ }
121
+ case "tuple-type": {
122
+ const tupleType = paramType;
123
+ return z$1.tuple(tupleType.elements.map((elem) => getZodTypeFromApiParamType(elem, references)));
124
+ }
125
+ }
126
+ return z$1.unknown();
127
+ }
128
+ }
153
129
  }
154
130
  /**
155
- * ApiParam 배열을 ZodObject로 변환합니다.
156
- * 각 파라미터의 optional 여부를 반영하여 Zod 스키마를 생성합니다.
157
- */ export function getZodObjectFromApiParams(apiParams, references = {}) {
158
- return z.object(Object.fromEntries(apiParams.map((param)=>{
159
- let zodType = getZodTypeFromApiParamType(param.type, references);
160
- if (param.optional) {
161
- zodType = zodType.optional();
162
- }
163
- return [
164
- param.name,
165
- zodType
166
- ];
167
- })));
131
+ * ApiParam 배열을 ZodObject로 변환합니다.
132
+ * 각 파라미터의 optional 여부를 반영하여 Zod 스키마를 생성합니다.
133
+ */
134
+ function getZodObjectFromApiParams(apiParams, references = {}) {
135
+ return z$1.object(Object.fromEntries(apiParams.map((param) => {
136
+ let zodType = getZodTypeFromApiParamType(param.type, references);
137
+ if (param.optional) {
138
+ zodType = zodType.optional();
139
+ }
140
+ return [param.name, zodType];
141
+ })));
168
142
  }
169
143
  /**
170
- * ExtendedApi를 ZodObject로 변환합니다.
171
- * TypeParameter와 일반 파라미터를 처리하며,
172
- * Context, RefKnex, _로 시작하는 optional 파라미터는 제외합니다.
173
- */ export function getZodObjectFromApi(api, references = {}) {
174
- if (api.typeParameters?.length > 0) {
175
- for (const typeParam of api.typeParameters){
176
- if (typeParam.constraint) {
177
- const zodType = getZodTypeFromApiParamType(typeParam.constraint, references);
178
- // FIXME: references는 글로벌 오브젝트로, typeParam.id("T" )를 key로 이렇게 덮어씌워버리면 loadedTypes가 오염됨.
179
- // biome-ignore lint/suspicious/noExplicitAny: 레퍼런스 타입 캐스팅
180
- references[typeParam.id] = zodType;
181
- }
182
- }
183
- }
184
- const ReqType = getZodObjectFromApiParams(// api parsing한 결과가 api params
185
- api.parameters.filter((param)=>!ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional === true && param.name.startsWith("_"))), references);
186
- return ReqType;
144
+ * ExtendedApi를 ZodObject로 변환합니다.
145
+ * TypeParameter와 일반 파라미터를 처리하며,
146
+ * Context, RefKnex, _로 시작하는 optional 파라미터는 제외합니다.
147
+ */
148
+ function getZodObjectFromApi(api, references = {}) {
149
+ if (api.typeParameters?.length > 0) {
150
+ for (const typeParam of api.typeParameters) {
151
+ if (typeParam.constraint) {
152
+ const zodType = getZodTypeFromApiParamType(typeParam.constraint, references);
153
+ references[typeParam.id] = zodType;
154
+ }
155
+ }
156
+ }
157
+ const ReqType = getZodObjectFromApiParams(api.parameters.filter((param) => !ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional && param.name.startsWith("_"))), references);
158
+ return ReqType;
187
159
  }
188
- /*
189
- * API 타입 정의를 TypeScript 코드 문자열로 변환하기 위한 함수들입니다.
190
- */ /**
191
- * ApiParamType을 TypeScript 타입 문자열로 변환합니다.
192
- * union, intersection, array, ref 등 모든 타입을 TS 문법으로 표현하며,
193
- * import가 필요한 타입 ID는 injectImportKeys 수집합니다.
194
- */ export function apiParamTypeToTsType(paramType, injectImportKeys) {
195
- if ([
196
- "string",
197
- "number",
198
- "boolean",
199
- "true",
200
- "false",
201
- "null",
202
- "undefined",
203
- "void",
204
- "any",
205
- "unknown"
206
- ].includes(paramType)) {
207
- return paramType;
208
- } else if (ApiParamType.isObject(paramType)) {
209
- return `{ ${apiParamToTsCode(paramType.props, injectImportKeys)} }`;
210
- } else if (ApiParamType.isStringLiteral(paramType)) {
211
- return `"${paramType.value}"`;
212
- } else if (ApiParamType.isNumericLiteral(paramType)) {
213
- return String(paramType.value);
214
- } else if (ApiParamType.isUnion(paramType)) {
215
- return paramType.types.map((type)=>apiParamTypeToTsType(type, injectImportKeys)).join(" | ");
216
- } else if (ApiParamType.isIntersection(paramType)) {
217
- return paramType.types.map((type)=>apiParamTypeToTsType(type, injectImportKeys)).join(" & ");
218
- } else if (ApiParamType.isArray(paramType)) {
219
- // intersection이나 union인 경우 괄호로 감싸기
220
- const elementsType = apiParamTypeToTsType(paramType.elementsType, injectImportKeys);
221
- return ApiParamType.isIntersection(paramType.elementsType) || ApiParamType.isUnion(paramType.elementsType) ? `(${elementsType})[]` : `${elementsType}[]`;
222
- } else if (ApiParamType.isRef(paramType)) {
223
- if ([
224
- "Pick",
225
- "Omit",
226
- "Promise",
227
- "Partial",
228
- "Date"
229
- ].includes(paramType.id) === false) {
230
- // importKeys 인젝션
231
- injectImportKeys.push(paramType.id);
232
- }
233
- if (paramType.args === undefined || paramType.args.length === 0) {
234
- return paramType.id;
235
- } else {
236
- return `${paramType.id}<${paramType.args.map((arg)=>apiParamTypeToTsType(arg, injectImportKeys)).join(",")}>`;
237
- }
238
- } else if (ApiParamType.isIndexedAccess(paramType)) {
239
- return `${apiParamTypeToTsType(paramType.object, injectImportKeys)}[${apiParamTypeToTsType(paramType.index, injectImportKeys)}]`;
240
- } else if (ApiParamType.isTupleType(paramType)) {
241
- return `[ ${paramType.elements.map((elem)=>apiParamTypeToTsType(elem, injectImportKeys))} ]`;
242
- } else if (ApiParamType.isTypeParam(paramType)) {
243
- return `${paramType.id}${paramType.constraint ? ` extends ${apiParamTypeToTsType(paramType.constraint, injectImportKeys)}` : ""}`;
244
- } else {
245
- throw new Error(`resolve 불가 ApiParamType ${paramType}`);
246
- }
160
+ /**
161
+ * ApiParamType을 TypeScript 타입 문자열로 변환합니다.
162
+ * union, intersection, array, ref 등 모든 타입을 TS 문법으로 표현하며,
163
+ * import가 필요한 타입 ID는 injectImportKeys에 수집합니다.
164
+ */
165
+ function apiParamTypeToTsType(paramType, injectImportKeys) {
166
+ if ([
167
+ "string",
168
+ "number",
169
+ "boolean",
170
+ "true",
171
+ "false",
172
+ "null",
173
+ "undefined",
174
+ "void",
175
+ "any",
176
+ "unknown"
177
+ ].includes(paramType)) {
178
+ return paramType;
179
+ } else if (ApiParamType.isObject(paramType)) {
180
+ return `{ ${apiParamToTsCode(paramType.props, injectImportKeys)} }`;
181
+ } else if (ApiParamType.isStringLiteral(paramType)) {
182
+ return `"${paramType.value}"`;
183
+ } else if (ApiParamType.isNumericLiteral(paramType)) {
184
+ return String(paramType.value);
185
+ } else if (ApiParamType.isUnion(paramType)) {
186
+ return paramType.types.map((type) => apiParamTypeToTsType(type, injectImportKeys)).join(" | ");
187
+ } else if (ApiParamType.isIntersection(paramType)) {
188
+ return paramType.types.map((type) => apiParamTypeToTsType(type, injectImportKeys)).join(" & ");
189
+ } else if (ApiParamType.isArray(paramType)) {
190
+ const elementsType = apiParamTypeToTsType(paramType.elementsType, injectImportKeys);
191
+ return ApiParamType.isIntersection(paramType.elementsType) || ApiParamType.isUnion(paramType.elementsType) ? `(${elementsType})[]` : `${elementsType}[]`;
192
+ } else if (ApiParamType.isRef(paramType)) {
193
+ if (![
194
+ "Pick",
195
+ "Omit",
196
+ "Promise",
197
+ "Partial",
198
+ "Date"
199
+ ].includes(paramType.id)) {
200
+ injectImportKeys.push(paramType.id);
201
+ }
202
+ if (paramType.args === undefined || paramType.args.length === 0) {
203
+ return paramType.id;
204
+ } else {
205
+ return `${paramType.id}<${paramType.args.map((arg) => apiParamTypeToTsType(arg, injectImportKeys)).join(",")}>`;
206
+ }
207
+ } else if (ApiParamType.isIndexedAccess(paramType)) {
208
+ return `${apiParamTypeToTsType(paramType.object, injectImportKeys)}[${apiParamTypeToTsType(paramType.index, injectImportKeys)}]`;
209
+ } else if (ApiParamType.isTupleType(paramType)) {
210
+ return `[ ${paramType.elements.map((elem) => apiParamTypeToTsType(elem, injectImportKeys))} ]`;
211
+ } else if (ApiParamType.isTypeParam(paramType)) {
212
+ return `${paramType.id}${paramType.constraint ? ` extends ${apiParamTypeToTsType(paramType.constraint, injectImportKeys)}` : ""}`;
213
+ } else {
214
+ throw new Error(`resolve 불가 ApiParamType ${paramType}`);
215
+ }
247
216
  }
248
217
  /**
249
- * ApiParam 배열을 TypeScript 함수 파라미터 코드로 변환합니다.
250
- * 예: "name: string, age?: number, active: boolean = true"
251
- */ export function apiParamToTsCode(params, injectImportKeys) {
252
- return params.map((param)=>{
253
- return `${param.name}${param.optional && !param.defaultDef ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`;
254
- }).join(", ");
218
+ * ApiParam 배열을 TypeScript 함수 파라미터 코드로 변환합니다.
219
+ * 예: "name: string, age?: number, active: boolean = true"
220
+ */
221
+ function apiParamToTsCode(params, injectImportKeys) {
222
+ return params.map((param) => {
223
+ return `${param.name}${param.optional && !param.defaultDef ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`;
224
+ }).join(", ");
255
225
  }
256
226
  /**
257
- * ApiParam 배열을 TypeScript 객체 타입 코드로 변환합니다.
258
- * 예: "{ name: string, age?: number, active: boolean = true }"
259
- */ export function apiParamToTsCodeAsObject(params, injectImportKeys) {
260
- return `{ ${params.map((param)=>`${param.name}${param.optional ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`).join(", ")} }`;
227
+ * ApiParam 배열을 TypeScript 객체 타입 코드로 변환합니다.
228
+ * 예: "{ name: string, age?: number, active: boolean = true }"
229
+ */
230
+ function apiParamToTsCodeAsObject(params, injectImportKeys) {
231
+ return `{ ${params.map((param) => `${param.name}${param.optional ? "?" : ""}: ${apiParamTypeToTsType(param.type, injectImportKeys)}${param.defaultDef ? `= ${param.defaultDef}` : ""}`).join(", ")} }`;
261
232
  }
233
+ var init_code_converters = __esmMin((() => {
234
+ init_types();
235
+ }));
262
236
 
263
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29kZS1jb252ZXJ0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogY29kZS1jb252ZXJ0ZXJz64qUIEFQSSDtg4DsnoUg7KCV7J2Y65Ok7J2EIFpvZCDqsJ3ssrTrgpggVHlwZVNjcmlwdCDsvZTrk5zroZwg67OA7ZmY7ZWY64qUIO2VqOyImOuTpOydhCDsoJzqs7Xtlanri4jri6QuXG4gKlxuICogMS4gQVBJIOyLnOumrOymiOuTpDpcbiAqIC0gRXh0ZW5kZWRBcGksIEFwaVBhcmFtLCBBcGlQYXJhbVR5cGVcbiAqIC0gQVBJIOuplO2DgOuNsOydtO2EsOulvCDtkZztmITtlZjripQg7YOA7J6FIOygleydmOuTpFxuICpcbiAqIDIuIFpvZE9iamVjdCDrs4DtmZhcbiAqIC0gQVBJIO2DgOyehSDsoJXsnZgg4oaSIFpvZCDtg4DsnoUg7J247Iqk7YS07IqkICjrn7Dtg4DsnoQg67C466as642w7J207IWY7JqpKVxuICogLSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSDihpIgZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyDihpIgZ2V0Wm9kT2JqZWN0RnJvbUFwaVxuICpcbiAqIDMuIFRzVHlwZURlZiDrs4DtmZhcbiAqIC0gQVBJIO2DgOyehSDsoJXsnZgg4oaSIFR5cGVTY3JpcHQg7YOA7J6FIOy9lOuTnCDrrLjsnpDsl7QgKOy9lOuTnCDsg53shLHsmqkpXG4gKiAtIGFwaVBhcmFtVHlwZVRvVHNUeXBlIOKGkiBhcGlQYXJhbVRvVHNDb2RlLCBhcGlQYXJhbVRvVHNDb2RlQXNPYmplY3RcbiAqXG4gKiDssLjqs6A6XG4gKiAtIFpvZFR5cGVEZWYg7IOd7ISxIChab2Qg7L2U65OcIOusuOyekOyXtCk6IHpvZC1jb252ZXJ0ZXIudHPsnZggem9kVHlwZVRvWm9kQ29kZSDsgqzsmqlcbiAqIC0gRW50aXR5UHJvcCDrs4DtmZg6IHpvZC1jb252ZXJ0ZXIudHMg7LC47KGwXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgY29yZSB9IGZyb20gXCJ6b2QvdjRcIjtcbmltcG9ydCB0eXBlIHsgJFpvZExvb3NlU2hhcGUgfSBmcm9tIFwiem9kL3Y0L2NvcmVcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuLy8gPGFueT7rpbwg7J6Q7KCc7ZWY6rOgLCBab2Tsl5DshJwg7KCc7JW97ZWY64qUIOq4sOuzuOyggeyduCBHZW5lcmljIFR5cGUgUGFyYW1ldGVy66W8IOyCrOyaqe2VqC5cbnR5cGUgQW55Wm9kT2JqZWN0ID0gei5ab2RPYmplY3Q8JFpvZExvb3NlU2hhcGU+O1xudHlwZSBBbnlab2RMaXRlcmFsID0gei5ab2RMaXRlcmFsPGNvcmUudXRpbC5MaXRlcmFsPjtcblxuLyoqXG4gKiBQcm9taXNlIO2DgOyeheydhCDtlZwg67KIIOyWuOuemO2Vke2VmOyXrCDrgrTrtoAg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIFByb21pc2XqsIAg7JWE64uMIOqyveyasCDsm5Drs7gg7YOA7J6F7J2EIOq3uOuMgOuhnCDrsJjtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBQcm9taXNlT25jZShwYXJhbVR5cGU6IEFwaVBhcmFtVHlwZSkge1xuICBpZiAoQXBpUGFyYW1UeXBlLmlzUHJvbWlzZShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS5hcmdzPy5bMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZTtcbiAgfVxufVxuXG4vKlxuICogQVBJ66W8IOq1rOyEse2VmOuKlCDsmpTshozrk6TsnYQgWm9kT2JqZWN066GcIOuzgO2ZmO2VmOq4sCDsnITtlZwg7ZWo7IiY65Ok7J6F64uI64ukLlxuICovXG5cbi8qKlxuICogQXBpUGFyYW1UeXBl7J2EIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHN0cmluZywgbnVtYmVyLCBhcnJheSwgdW5pb24g65OxIOuqqOuToCBBcGlQYXJhbVR5cGXsnYQg7LKY66as7ZWY66mwLFxuICog7Iic7ZmY7LC47KGw6rCAIOuwnOyDne2VmOuKlCDqsr3smrAgei51bmtub3duKCnsnLzroZwgZmFsbGJhY2vtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShcbiAgcGFyYW1UeXBlOiBBcGlQYXJhbVR5cGUsXG4gIHJlZmVyZW5jZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IHouWm9kVHlwZTtcbiAgfSxcbik6IHouWm9kVHlwZTx1bmtub3duPiB7XG4gIHN3aXRjaCAocGFyYW1UeXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIHouc3RyaW5nKCk7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIHoubnVtYmVyKCk7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiB6LmJvb2xlYW4oKTtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBhZHZUeXBlID0gcGFyYW1UeXBlIGFzIHsgdDogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB8IG51bWJlciB9O1xuICAgICAgc3dpdGNoIChhZHZUeXBlLnQpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZy1saXRlcmFsXCI6XG4gICAgICAgIGNhc2UgXCJudW1lcmljLWxpdGVyYWxcIjpcbiAgICAgICAgICByZXR1cm4gei5saXRlcmFsKGFkdlR5cGUudmFsdWUpO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgICAgICBjb25zdCBvYmpUeXBlID0gcGFyYW1UeXBlIGFzIHsgdDogc3RyaW5nOyBwcm9wczogQXBpUGFyYW1bXSB9O1xuICAgICAgICAgIHJldHVybiBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zKG9ialR5cGUucHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJhcnJheVwiOiB7XG4gICAgICAgICAgY29uc3QgYXJyVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICBlbGVtZW50c1R5cGU6IEFwaVBhcmFtVHlwZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiB6LmFycmF5KGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyclR5cGUuZWxlbWVudHNUeXBlLCByZWZlcmVuY2VzKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJlZlwiOiB7XG4gICAgICAgICAgY29uc3QgcmVmVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgYXJncz86IEFwaVBhcmFtVHlwZVtdO1xuICAgICAgICAgIH07XG4gICAgICAgICAgLy8gRGF0ZSDtg4DsnoUg7LKY66asXG4gICAgICAgICAgaWYgKHJlZlR5cGUuaWQgPT09IFwiRGF0ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gei5kYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOqwneyytCDtgqQg6rSA66asIOycoO2LuOumrO2LsFxuICAgICAgICAgIGlmIChbXCJQaWNrXCIsIFwiT21pdFwiXS5pbmNsdWRlcyhyZWZUeXBlLmlkKSkge1xuICAgICAgICAgICAgaWYgKHJlZlR5cGUuYXJncz8ubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFtvYmosIGxpdGVyYWxPclVuaW9uXSA9IHJlZlR5cGUuYXJncy5tYXAoXG4gICAgICAgICAgICAgIChhcmcpID0+IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGFyZywgcmVmZXJlbmNlcyksXG4gICAgICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7IOd7ISx65CY64qUIFpvZFVuaW9u7J2YIO2DgOyeheydhCDstpTsoIHtlZjquLAg7Ja066Ck7JuAXG4gICAgICAgICAgICApIGFzIFtBbnlab2RPYmplY3QsIHouWm9kVW5pb248YW55PiB8IEFueVpvZExpdGVyYWxdO1xuXG4gICAgICAgICAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsT3JVbmlvbiBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICAgICAgICAgICAga2V5cyA9IGxpdGVyYWxPclVuaW9uLmRlZi5vcHRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAob3B0aW9uOiB7IGRlZjogeyB2YWx1ZXM6IHN0cmluZ1tdIH0gfSkgPT4gb3B0aW9uLmRlZi52YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBrZXlzID0gKGxpdGVyYWxPclVuaW9uIGFzIHouWm9kTGl0ZXJhbDxzdHJpbmc+KS5kZWYudmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5UmVjb3JkID0gT2JqZWN0LmZyb21FbnRyaWVzKGtleXMubWFwKChrZXkpID0+IFtrZXksIHRydWUgYXMgY29uc3RdKSk7XG4gICAgICAgICAgICBpZiAocmVmVHlwZS5pZCA9PT0gXCJQaWNrXCIpIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5waWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBab2QgNC4zLjYgcGljayDtg4DsnoUg7Zi47ZmY7ISxXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai5waWNrKGtleVJlY29yZCBhcyBhbnkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAob2JqLm9taXQpIHtcbiAgICAgICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFpvZCA0LjMuNiBvbWl0IO2DgOyehSDtmLjtmZjshLFcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLm9taXQoa2V5UmVjb3JkIGFzIGFueSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFtcIlBhcnRpYWxcIl0uaW5jbHVkZXMocmVmVHlwZS5pZCkpIHtcbiAgICAgICAgICAgIGlmIChyZWZUeXBlLmFyZ3M/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCAke3JlZlR5cGUuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvYmogPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShyZWZUeXBlLmFyZ3NbMF0sIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQYXJ0aWFsIOyduOyImCDtg4DsnoUg7LqQ7Iqk7YyFXG4gICAgICAgICAgICByZXR1cm4gKG9iaiBhcyB6LlpvZE9iamVjdDxhbnk+KS5wYXJ0aWFsKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbcmVmVHlwZS5pZF07XG4gICAgICAgICAgaWYgKHJlZmVyZW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gei51bmtub3duKCk7XG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoYHJlZiDssLjsobAg67aI6rCAICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwidW5pb25cIjoge1xuICAgICAgICAgIGNvbnN0IHVuaW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBudWxsYWJsZSDsnKDri4jsmKhcbiAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzLmxlbmd0aCA9PT0gMiAmJiB1bmlvblR5cGUudHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJudWxsXCIpKSB7XG4gICAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzWzBdID09PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodW5pb25UeXBlLnR5cGVzWzFdLCByZWZlcmVuY2VzKS5udWxsYWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHVuaW9uVHlwZS50eXBlc1swXSwgcmVmZXJlbmNlcykubnVsbGFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7J2867CYIOycoOuLiOyYqFxuICAgICAgICAgIHJldHVybiB6LnVuaW9uKFxuICAgICAgICAgICAgdW5pb25UeXBlLnR5cGVzLm1hcCgodHlwZSkgPT4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodHlwZSwgcmVmZXJlbmNlcykpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uVHlwZS50eXBlcy5yZWR1Y2UoXG4gICAgICAgICAgICAocmVzdWx0LCB0eXBlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFR5cGUgPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSh0eXBlLCByZWZlcmVuY2VzKTtcbiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkVHlwZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gei5pbnRlcnNlY3Rpb24ocmVzdWx0LCByZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgei51bmtub3duKCkgYXMgei5ab2RUeXBlPHVua25vd24+LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInR1cGxlLXR5cGVcIjoge1xuICAgICAgICAgIGNvbnN0IHR1cGxlVHlwZSA9IHBhcmFtVHlwZSBhcyBBcGlQYXJhbVR5cGUuVHVwbGVUeXBlO1xuICAgICAgICAgIHJldHVybiB6LnR1cGxlKFxuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiDsg53shLHrkJjripQgWm9kVHVwbGXsnZgg7YOA7J6F7J2EIOy2lOygge2VmOq4sCDslrTroKTsm4BcbiAgICAgICAgICAgIHR1cGxlVHlwZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKGVsZW0sIHJlZmVyZW5jZXMpKSBhcyBhbnksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHoudW5rbm93bigpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFwaVBhcmFtIOuwsOyXtOydhCBab2RPYmplY3TroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIO2MjOudvOuvuO2EsOydmCBvcHRpb25hbCDsl6zrtoDrpbwg67CY7JiB7ZWY7JesIFpvZCDsiqTtgqTrp4jrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyhcbiAgYXBpUGFyYW1zOiBBcGlQYXJhbVtdLFxuICByZWZlcmVuY2VzOiB7XG4gICAgW2lkOiBzdHJpbmddOiB6LlpvZFR5cGU7XG4gIH0gPSB7fSxcbik6IHouWm9kT2JqZWN0IHtcbiAgcmV0dXJuIHoub2JqZWN0KFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGFwaVBhcmFtcy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGxldCB6b2RUeXBlID0gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUocGFyYW0udHlwZSwgcmVmZXJlbmNlcyk7XG4gICAgICAgIGlmIChwYXJhbS5vcHRpb25hbCkge1xuICAgICAgICAgIHpvZFR5cGUgPSB6b2RUeXBlLm9wdGlvbmFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtwYXJhbS5uYW1lLCB6b2RUeXBlXTtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59XG5cbi8qKlxuICogRXh0ZW5kZWRBcGnrpbwgWm9kT2JqZWN066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFR5cGVQYXJhbWV0ZXLsmYAg7J2867CYIO2MjOudvOuvuO2EsOulvCDsspjrpqztlZjrqbAsXG4gKiBDb250ZXh0LCBSZWZLbmV4LCBf66GcIOyLnOyeke2VmOuKlCBvcHRpb25hbCDtjIzrnbzrr7jthLDripQg7KCc7Jm47ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Wm9kT2JqZWN0RnJvbUFwaShcbiAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogei5ab2RUeXBlO1xuICB9ID0ge30sXG4pIHtcbiAgaWYgKGFwaS50eXBlUGFyYW1ldGVycz8ubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgdHlwZVBhcmFtIG9mIGFwaS50eXBlUGFyYW1ldGVycykge1xuICAgICAgaWYgKHR5cGVQYXJhbS5jb25zdHJhaW50KSB7XG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSh0eXBlUGFyYW0uY29uc3RyYWludCwgcmVmZXJlbmNlcyk7XG5cbiAgICAgICAgLy8gRklYTUU6IHJlZmVyZW5jZXPripQg6riA66Gc67KMIOyYpOu4jOygne2KuOuhnCwgdHlwZVBhcmFtLmlkKFwiVFwiIOuTsSnrpbwga2V566GcIOydtOugh+qyjCDrja7slrTslIzsm4zrsoTrpqzrqbQgbG9hZGVkVHlwZXPqsIAg7Jik7Je865CoLlxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IOugiO2NvOufsOyKpCDtg4DsnoUg7LqQ7Iqk7YyFXG4gICAgICAgIChyZWZlcmVuY2VzW3R5cGVQYXJhbS5pZF0gYXMgei5ab2RUeXBlPGFueT4pID0gem9kVHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMoXG4gICAgLy8gYXBpIHBhcnNpbmftlZwg6rKw6rO86rCAIGFwaSBwYXJhbXNcbiAgICBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAocGFyYW0pID0+XG4gICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICEocGFyYW0ub3B0aW9uYWwgPT09IHRydWUgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksIC8vIF/roZwg7Iuc7J6R7ZWY64qUIO2MjOudvOuvuO2EsOuKlCDsoJzsmbhcbiAgICApLFxuICAgIHJlZmVyZW5jZXMsXG4gICk7XG4gIHJldHVybiBSZXFUeXBlO1xufVxuXG4vKlxuICogQVBJIO2DgOyehSDsoJXsnZjrpbwgVHlwZVNjcmlwdCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VmOq4sCDsnITtlZwg7ZWo7IiY65Ok7J6F64uI64ukLlxuICovXG5cbi8qKlxuICogQXBpUGFyYW1UeXBl7J2EIFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiB1bmlvbiwgaW50ZXJzZWN0aW9uLCBhcnJheSwgcmVmIOuTsSDrqqjrk6Ag7YOA7J6F7J2EIFRTIOusuOuyleycvOuhnCDtkZztmITtlZjrqbAsXG4gKiBpbXBvcnTqsIAg7ZWE7JqU7ZWcIO2DgOyehSBJROuKlCBpbmplY3RJbXBvcnRLZXlz7JeQIOyImOynke2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZTogQXBpUGFyYW1UeXBlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmIChcbiAgICBbXG4gICAgICBcInN0cmluZ1wiLFxuICAgICAgXCJudW1iZXJcIixcbiAgICAgIFwiYm9vbGVhblwiLFxuICAgICAgXCJ0cnVlXCIsXG4gICAgICBcImZhbHNlXCIsXG4gICAgICBcIm51bGxcIixcbiAgICAgIFwidW5kZWZpbmVkXCIsXG4gICAgICBcInZvaWRcIixcbiAgICAgIFwiYW55XCIsXG4gICAgICBcInVua25vd25cIixcbiAgICBdLmluY2x1ZGVzKHBhcmFtVHlwZSBhcyBzdHJpbmcpXG4gICkge1xuICAgIHJldHVybiBwYXJhbVR5cGUgYXMgc3RyaW5nO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc09iamVjdChwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGB7ICR7YXBpUGFyYW1Ub1RzQ29kZShwYXJhbVR5cGUucHJvcHMsIGluamVjdEltcG9ydEtleXMpfSB9YDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNTdHJpbmdMaXRlcmFsKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYFwiJHtwYXJhbVR5cGUudmFsdWV9XCJgO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc051bWVyaWNMaXRlcmFsKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gU3RyaW5nKHBhcmFtVHlwZS52YWx1ZSk7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVW5pb24ocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBwYXJhbVR5cGUudHlwZXMubWFwKCh0eXBlKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlLCBpbmplY3RJbXBvcnRLZXlzKSkuam9pbihcIiB8IFwiKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNJbnRlcnNlY3Rpb24ocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBwYXJhbVR5cGUudHlwZXMubWFwKCh0eXBlKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlLCBpbmplY3RJbXBvcnRLZXlzKSkuam9pbihcIiAmIFwiKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNBcnJheShwYXJhbVR5cGUpKSB7XG4gICAgLy8gaW50ZXJzZWN0aW9u7J2064KYIHVuaW9u7J24IOqyveyasCDqtITtmLjroZwg6rCQ7Iu46riwXG4gICAgY29uc3QgZWxlbWVudHNUeXBlID0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW1UeXBlLmVsZW1lbnRzVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyk7XG4gICAgcmV0dXJuIEFwaVBhcmFtVHlwZS5pc0ludGVyc2VjdGlvbihwYXJhbVR5cGUuZWxlbWVudHNUeXBlKSB8fFxuICAgICAgQXBpUGFyYW1UeXBlLmlzVW5pb24ocGFyYW1UeXBlLmVsZW1lbnRzVHlwZSlcbiAgICAgID8gYCgke2VsZW1lbnRzVHlwZX0pW11gXG4gICAgICA6IGAke2VsZW1lbnRzVHlwZX1bXWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzUmVmKHBhcmFtVHlwZSkpIHtcbiAgICBpZiAoW1wiUGlja1wiLCBcIk9taXRcIiwgXCJQcm9taXNlXCIsIFwiUGFydGlhbFwiLCBcIkRhdGVcIl0uaW5jbHVkZXMocGFyYW1UeXBlLmlkKSA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIGltcG9ydEtleXMg7J247KCd7IWYXG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocGFyYW1UeXBlLmlkKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtVHlwZS5hcmdzID09PSB1bmRlZmluZWQgfHwgcGFyYW1UeXBlLmFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcGFyYW1UeXBlLmlkO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7cGFyYW1UeXBlLmlkfTwke3BhcmFtVHlwZS5hcmdzXG4gICAgICAgIC5tYXAoKGFyZykgPT4gYXBpUGFyYW1UeXBlVG9Uc1R5cGUoYXJnLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCIsXCIpfT5gO1xuICAgIH1cbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNJbmRleGVkQWNjZXNzKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYCR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUoXG4gICAgICBwYXJhbVR5cGUub2JqZWN0LFxuICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICApfVske2FwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZS5pbmRleCwgaW5qZWN0SW1wb3J0S2V5cyl9XWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVHVwbGVUeXBlKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYFsgJHtwYXJhbVR5cGUuZWxlbWVudHMubWFwKChlbGVtKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZShlbGVtLCBpbmplY3RJbXBvcnRLZXlzKSl9IF1gO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc1R5cGVQYXJhbShwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIGAke3BhcmFtVHlwZS5pZH0ke1xuICAgICAgcGFyYW1UeXBlLmNvbnN0cmFpbnRcbiAgICAgICAgPyBgIGV4dGVuZHMgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbVR5cGUuY29uc3RyYWludCwgaW5qZWN0SW1wb3J0S2V5cyl9YFxuICAgICAgICA6IFwiXCJcbiAgICB9YDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlc29sdmUg67aI6rCAIEFwaVBhcmFtVHlwZSAke3BhcmFtVHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEFwaVBhcmFtIOuwsOyXtOydhCBUeXBlU2NyaXB0IO2VqOyImCDtjIzrnbzrr7jthLAg7L2U65Oc66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyYiDogXCJuYW1lOiBzdHJpbmcsIGFnZT86IG51bWJlciwgYWN0aXZlOiBib29sZWFuID0gdHJ1ZVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtczogQXBpUGFyYW1bXSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gcGFyYW1zXG4gICAgLm1hcCgocGFyYW0pID0+IHtcbiAgICAgIHJldHVybiBgJHtwYXJhbS5uYW1lfSR7XG4gICAgICAgIHBhcmFtLm9wdGlvbmFsICYmICFwYXJhbS5kZWZhdWx0RGVmID8gXCI/XCIgOiBcIlwiXG4gICAgICB9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtLnR5cGUsIGluamVjdEltcG9ydEtleXMpfSR7XG4gICAgICAgIHBhcmFtLmRlZmF1bHREZWYgPyBgPSAke3BhcmFtLmRlZmF1bHREZWZ9YCA6IFwiXCJcbiAgICAgIH1gO1xuICAgIH0pXG4gICAgLmpvaW4oXCIsIFwiKTtcbn1cblxuLyoqXG4gKiBBcGlQYXJhbSDrsLDsl7TsnYQgVHlwZVNjcmlwdCDqsJ3ssrQg7YOA7J6FIOy9lOuTnOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDsmIg6IFwieyBuYW1lOiBzdHJpbmcsIGFnZT86IG51bWJlciwgYWN0aXZlOiBib29sZWFuID0gdHJ1ZSB9XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaVBhcmFtVG9Uc0NvZGVBc09iamVjdChwYXJhbXM6IEFwaVBhcmFtW10sIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGB7ICR7cGFyYW1zXG4gICAgLm1hcChcbiAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgYCR7cGFyYW0ubmFtZX0ke3BhcmFtLm9wdGlvbmFsID8gXCI/XCIgOiBcIlwifTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICBwYXJhbS50eXBlLFxuICAgICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICAgICl9JHtwYXJhbS5kZWZhdWx0RGVmID8gYD0gJHtwYXJhbS5kZWZhdWx0RGVmfWAgOiBcIlwifWAsXG4gICAgKVxuICAgIC5qb2luKFwiLCBcIil9IH1gO1xufVxuIl0sIm5hbWVzIjpbInoiLCJBcGlQYXJhbVR5cGUiLCJ1bndyYXBQcm9taXNlT25jZSIsInBhcmFtVHlwZSIsImlzUHJvbWlzZSIsImFyZ3MiLCJnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZSIsInJlZmVyZW5jZXMiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwiYWR2VHlwZSIsInQiLCJsaXRlcmFsIiwidmFsdWUiLCJvYmpUeXBlIiwiZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyIsInByb3BzIiwiYXJyVHlwZSIsImFycmF5IiwiZWxlbWVudHNUeXBlIiwicmVmVHlwZSIsImlkIiwiZGF0ZSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiRXJyb3IiLCJvYmoiLCJsaXRlcmFsT3JVbmlvbiIsIm1hcCIsImFyZyIsImtleXMiLCJab2RVbmlvbiIsImRlZiIsIm9wdGlvbnMiLCJvcHRpb24iLCJ2YWx1ZXMiLCJrZXlSZWNvcmQiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImtleSIsInBpY2siLCJvbWl0IiwicGFydGlhbCIsInJlZmVyZW5jZSIsInVuZGVmaW5lZCIsInVua25vd24iLCJ1bmlvblR5cGUiLCJ0eXBlcyIsInNvbWUiLCJ0eXBlIiwibnVsbGFibGUiLCJ1bmlvbiIsImludGVyc2VjdGlvblR5cGUiLCJyZWR1Y2UiLCJyZXN1bHQiLCJpbmRleCIsInJlc29sdmVkVHlwZSIsImludGVyc2VjdGlvbiIsInR1cGxlVHlwZSIsInR1cGxlIiwiZWxlbWVudHMiLCJlbGVtIiwiYXBpUGFyYW1zIiwib2JqZWN0IiwicGFyYW0iLCJ6b2RUeXBlIiwib3B0aW9uYWwiLCJuYW1lIiwiZ2V0Wm9kT2JqZWN0RnJvbUFwaSIsImFwaSIsInR5cGVQYXJhbWV0ZXJzIiwidHlwZVBhcmFtIiwiY29uc3RyYWludCIsIlJlcVR5cGUiLCJwYXJhbWV0ZXJzIiwiZmlsdGVyIiwiaXNDb250ZXh0IiwiaXNSZWZLbmV4Iiwic3RhcnRzV2l0aCIsImFwaVBhcmFtVHlwZVRvVHNUeXBlIiwiaW5qZWN0SW1wb3J0S2V5cyIsImlzT2JqZWN0IiwiYXBpUGFyYW1Ub1RzQ29kZSIsImlzU3RyaW5nTGl0ZXJhbCIsImlzTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmciLCJpc1VuaW9uIiwiam9pbiIsImlzSW50ZXJzZWN0aW9uIiwiaXNBcnJheSIsImlzUmVmIiwicHVzaCIsImlzSW5kZXhlZEFjY2VzcyIsImlzVHVwbGVUeXBlIiwiaXNUeXBlUGFyYW0iLCJwYXJhbXMiLCJkZWZhdWx0RGVmIiwiYXBpUGFyYW1Ub1RzQ29kZUFzT2JqZWN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsU0FBU0EsQ0FBQyxRQUFRLE1BQU07QUFHeEIsU0FBd0JDLFlBQVksUUFBUSxvQkFBaUI7QUFPN0Q7OztDQUdDLEdBQ0QsT0FBTyxTQUFTQyxrQkFBa0JDLFNBQXVCO0lBQ3ZELElBQUlGLGFBQWFHLFNBQVMsQ0FBQ0QsWUFBWTtRQUNyQyxPQUFPQSxVQUFVRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0lBQzVCLE9BQU87UUFDTCxPQUFPRjtJQUNUO0FBQ0Y7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
237
+ //#endregion
238
+ init_code_converters();
239
+ export { apiParamToTsCode, apiParamToTsCodeAsObject, apiParamTypeToTsType, getZodObjectFromApi, getZodObjectFromApiParams, getZodTypeFromApiParamType, init_code_converters, unwrapPromiseOnce };
240
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1jb252ZXJ0ZXJzLmpzIiwibmFtZXMiOlsieiIsImtleXM6IHN0cmluZ1tdIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jb2RlLWNvbnZlcnRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb2RlLWNvbnZlcnRlcnPripQgQVBJIO2DgOyehSDsoJXsnZjrk6TsnYQgWm9kIOqwneyytOuCmCBUeXBlU2NyaXB0IOy9lOuTnOuhnCDrs4DtmZjtlZjripQg7ZWo7IiY65Ok7J2EIOygnOqzte2VqeuLiOuLpC5cbiAqXG4gKiAxLiBBUEkg7Iuc66as7KaI65OkOlxuICogLSBFeHRlbmRlZEFwaSwgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZVxuICogLSBBUEkg66mU7YOA642w7J207YSw66W8IO2RnO2YhO2VmOuKlCDtg4DsnoUg7KCV7J2Y65OkXG4gKlxuICogMi4gWm9kT2JqZWN0IOuzgO2ZmFxuICogLSBBUEkg7YOA7J6FIOygleydmCDihpIgWm9kIO2DgOyehSDsnbjsiqTthLTsiqQgKOufsO2DgOyehCDrsLjrpqzrjbDsnbTshZjsmqkpXG4gKiAtIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlIOKGkiBnZXRab2RPYmplY3RGcm9tQXBpUGFyYW1zIOKGkiBnZXRab2RPYmplY3RGcm9tQXBpXG4gKlxuICogMy4gVHNUeXBlRGVmIOuzgO2ZmFxuICogLSBBUEkg7YOA7J6FIOygleydmCDihpIgVHlwZVNjcmlwdCDtg4DsnoUg7L2U65OcIOusuOyekOyXtCAo7L2U65OcIOyDneyEseyaqSlcbiAqIC0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUg4oaSIGFwaVBhcmFtVG9Uc0NvZGUsIGFwaVBhcmFtVG9Uc0NvZGVBc09iamVjdFxuICpcbiAqIOywuOqzoDpcbiAqIC0gWm9kVHlwZURlZiDsg53shLEgKFpvZCDsvZTrk5wg66y47J6Q7Je0KTogem9kLWNvbnZlcnRlci50c+ydmCB6b2RUeXBlVG9ab2RDb2RlIOyCrOyaqVxuICogLSBFbnRpdHlQcm9wIOuzgO2ZmDogem9kLWNvbnZlcnRlci50cyDssLjsobBcbiAqL1xuXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0gfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8vIDxhbnk+66W8IOyekOygnO2VmOqzoCwgWm9k7JeQ7IScIOygnOyVve2VmOuKlCDquLDrs7jsoIHsnbggR2VuZXJpYyBUeXBlIFBhcmFtZXRlcuulvCDsgqzsmqntlaguXG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2RMaXRlcmFsID0gei5ab2RMaXRlcmFsO1xuXG4vKipcbiAqIFByb21pc2Ug7YOA7J6F7J2EIO2VnCDrsogg7Ja4656Y7ZWR7ZWY7JesIOuCtOu2gCDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogUHJvbWlzZeqwgCDslYTri4wg6rK97JqwIOybkOuzuCDtg4DsnoXsnYQg6re464yA66GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcFByb21pc2VPbmNlKHBhcmFtVHlwZTogQXBpUGFyYW1UeXBlKSB7XG4gIGlmIChBcGlQYXJhbVR5cGUuaXNQcm9taXNlKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlLmFyZ3M/LlswXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcGFyYW1UeXBlO1xuICB9XG59XG5cbi8qXG4gKiBBUEnrpbwg6rWs7ISx7ZWY64qUIOyalOyGjOuTpOydhCBab2RPYmplY3TroZwg67OA7ZmY7ZWY6riwIOychO2VnCDtlajsiJjrk6TsnoXri4jri6QuXG4gKi9cblxuLyoqXG4gKiBBcGlQYXJhbVR5cGXsnYQgWm9kIO2DgOyehSDsnbjsiqTthLTsiqTroZwg67OA7ZmY7ZWp64uI64ukLlxuICogc3RyaW5nLCBudW1iZXIsIGFycmF5LCB1bmlvbiDrk7Eg66qo65OgIEFwaVBhcmFtVHlwZeydhCDsspjrpqztlZjrqbAsXG4gKiDsiJztmZjssLjsobDqsIAg67Cc7IOd7ZWY64qUIOqyveyasCB6LnVua25vd24oKeycvOuhnCBmYWxsYmFja+2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKFxuICBwYXJhbVR5cGU6IEFwaVBhcmFtVHlwZSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogei5ab2RUeXBlO1xuICB9LFxuKTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChwYXJhbVR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gei5zdHJpbmcoKTtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gei5udW1iZXIoKTtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIHouYm9vbGVhbigpO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IGFkdlR5cGUgPSBwYXJhbVR5cGUgYXMgeyB0OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyIH07XG4gICAgICBzd2l0Y2ggKGFkdlR5cGUudCkge1xuICAgICAgICBjYXNlIFwic3RyaW5nLWxpdGVyYWxcIjpcbiAgICAgICAgY2FzZSBcIm51bWVyaWMtbGl0ZXJhbFwiOlxuICAgICAgICAgIHJldHVybiB6LmxpdGVyYWwoYWR2VHlwZS52YWx1ZSk7XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgICAgIGNvbnN0IG9ialR5cGUgPSBwYXJhbVR5cGUgYXMgeyB0OiBzdHJpbmc7IHByb3BzOiBBcGlQYXJhbVtdIH07XG4gICAgICAgICAgcmV0dXJuIGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMob2JqVHlwZS5wcm9wcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFycmF5XCI6IHtcbiAgICAgICAgICBjb25zdCBhcnJUeXBlID0gcGFyYW1UeXBlIGFzIHtcbiAgICAgICAgICAgIHQ6IHN0cmluZztcbiAgICAgICAgICAgIGVsZW1lbnRzVHlwZTogQXBpUGFyYW1UeXBlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIHouYXJyYXkoZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUoYXJyVHlwZS5lbGVtZW50c1R5cGUsIHJlZmVyZW5jZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVmXCI6IHtcbiAgICAgICAgICBjb25zdCByZWZUeXBlID0gcGFyYW1UeXBlIGFzIHtcbiAgICAgICAgICAgIHQ6IHN0cmluZztcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBhcmdzPzogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBEYXRlIO2DgOyehSDsspjrpqxcbiAgICAgICAgICBpZiAocmVmVHlwZS5pZCA9PT0gXCJEYXRlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB6LmRhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g6rCd7LK0IO2CpCDqtIDrpqwg7Jyg7Yu466as7YuwXG4gICAgICAgICAgaWYgKFtcIlBpY2tcIiwgXCJPbWl0XCJdLmluY2x1ZGVzKHJlZlR5cGUuaWQpKSB7XG4gICAgICAgICAgICBpZiAocmVmVHlwZS5hcmdzPy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgJHtyZWZUeXBlLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgW29iaiwgbGl0ZXJhbE9yVW5pb25dID0gcmVmVHlwZS5hcmdzLm1hcChcbiAgICAgICAgICAgICAgKGFyZykgPT4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUoYXJnLCByZWZlcmVuY2VzKSxcbiAgICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0g7IOd7ISx65CY64qUIFpvZFVuaW9u7J2YIO2DgOyeheydhCDstpTsoIHtlZjquLAg7Ja066Ck7JuAXG4gICAgICAgICAgICApIGFzIFtBbnlab2RPYmplY3QsIHouWm9kVW5pb248YW55PiB8IEFueVpvZExpdGVyYWxdO1xuXG4gICAgICAgICAgICBsZXQga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGlmIChsaXRlcmFsT3JVbmlvbiBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICAgICAgICAgICAga2V5cyA9IGxpdGVyYWxPclVuaW9uLmRlZi5vcHRpb25zLm1hcChcbiAgICAgICAgICAgICAgICAob3B0aW9uOiB7IGRlZjogeyB2YWx1ZXM6IHN0cmluZ1tdIH0gfSkgPT4gb3B0aW9uLmRlZi52YWx1ZXNbMF0sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBrZXlzID0gKGxpdGVyYWxPclVuaW9uIGFzIHouWm9kTGl0ZXJhbDxzdHJpbmc+KS5kZWYudmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5UmVjb3JkID0gT2JqZWN0LmZyb21FbnRyaWVzKGtleXMubWFwKChrZXkpID0+IFtrZXksIHRydWUgYXMgY29uc3RdKSk7XG4gICAgICAgICAgICBpZiAocmVmVHlwZS5pZCA9PT0gXCJQaWNrXCIpIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5waWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gWm9kIDQuMy42IHBpY2sg7YOA7J6FIO2YuO2ZmOyEsVxuICAgICAgICAgICAgICAgIHJldHVybiBvYmoucGljayhrZXlSZWNvcmQgYXMgYW55KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKG9iai5vbWl0KSB7XG4gICAgICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gWm9kIDQuMy42IG9taXQg7YOA7J6FIO2YuO2ZmOyEsVxuICAgICAgICAgICAgICAgIHJldHVybiBvYmoub21pdChrZXlSZWNvcmQgYXMgYW55KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoW1wiUGFydGlhbFwiXS5pbmNsdWRlcyhyZWZUeXBlLmlkKSkge1xuICAgICAgICAgICAgaWYgKHJlZlR5cGUuYXJncz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHJlZlR5cGUuYXJnc1swXSwgcmVmZXJlbmNlcyk7XG4gICAgICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBQYXJ0aWFsIOyduOyImCDtg4DsnoUg7LqQ7Iqk7YyFXG4gICAgICAgICAgICByZXR1cm4gKG9iaiBhcyB6LlpvZE9iamVjdDxhbnk+KS5wYXJ0aWFsKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbcmVmVHlwZS5pZF07XG4gICAgICAgICAgaWYgKHJlZmVyZW5jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gei51bmtub3duKCk7XG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoYHJlZiDssLjsobAg67aI6rCAICR7cmVmVHlwZS5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwidW5pb25cIjoge1xuICAgICAgICAgIGNvbnN0IHVuaW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBudWxsYWJsZSDsnKDri4jsmKhcbiAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzLmxlbmd0aCA9PT0gMiAmJiB1bmlvblR5cGUudHlwZXMuc29tZSgodHlwZSkgPT4gdHlwZSA9PT0gXCJudWxsXCIpKSB7XG4gICAgICAgICAgICBpZiAodW5pb25UeXBlLnR5cGVzWzBdID09PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodW5pb25UeXBlLnR5cGVzWzFdLCByZWZlcmVuY2VzKS5udWxsYWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHVuaW9uVHlwZS50eXBlc1swXSwgcmVmZXJlbmNlcykubnVsbGFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7J2867CYIOycoOuLiOyYqFxuICAgICAgICAgIHJldHVybiB6LnVuaW9uKFxuICAgICAgICAgICAgdW5pb25UeXBlLnR5cGVzLm1hcCgodHlwZSkgPT4gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodHlwZSwgcmVmZXJlbmNlcykpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImludGVyc2VjdGlvblwiOiB7XG4gICAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IHBhcmFtVHlwZSBhcyB7XG4gICAgICAgICAgICB0OiBzdHJpbmc7XG4gICAgICAgICAgICB0eXBlczogQXBpUGFyYW1UeXBlW107XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uVHlwZS50eXBlcy5yZWR1Y2UoKHJlc3VsdCwgdHlwZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHR5cGUsIHJlZmVyZW5jZXMpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFR5cGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gei5pbnRlcnNlY3Rpb24ocmVzdWx0LCByZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHoudW5rbm93bigpIGFzIHouWm9kVHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInR1cGxlLXR5cGVcIjoge1xuICAgICAgICAgIGNvbnN0IHR1cGxlVHlwZSA9IHBhcmFtVHlwZSBhcyBBcGlQYXJhbVR5cGUuVHVwbGVUeXBlO1xuICAgICAgICAgIHJldHVybiB6LnR1cGxlKFxuICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0g7IOd7ISx65CY64qUIFpvZFR1cGxl7J2YIO2DgOyeheydhCDstpTsoIHtlZjquLAg7Ja066Ck7JuAXG4gICAgICAgICAgICB0dXBsZVR5cGUuZWxlbWVudHMubWFwKChlbGVtKSA9PiBnZXRab2RUeXBlRnJvbUFwaVBhcmFtVHlwZShlbGVtLCByZWZlcmVuY2VzKSkgYXMgYW55LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB6LnVua25vd24oKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcGlQYXJhbSDrsLDsl7TsnYQgWm9kT2JqZWN066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOqwgSDtjIzrnbzrr7jthLDsnZggb3B0aW9uYWwg7Jes67aA66W8IOuwmOyYge2VmOyXrCBab2Qg7Iqk7YKk66eI66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZE9iamVjdEZyb21BcGlQYXJhbXMoXG4gIGFwaVBhcmFtczogQXBpUGFyYW1bXSxcbiAgcmVmZXJlbmNlczoge1xuICAgIFtpZDogc3RyaW5nXTogei5ab2RUeXBlO1xuICB9ID0ge30sXG4pOiB6LlpvZE9iamVjdCB7XG4gIHJldHVybiB6Lm9iamVjdChcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBhcGlQYXJhbXMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBsZXQgem9kVHlwZSA9IGdldFpvZFR5cGVGcm9tQXBpUGFyYW1UeXBlKHBhcmFtLnR5cGUsIHJlZmVyZW5jZXMpO1xuICAgICAgICBpZiAocGFyYW0ub3B0aW9uYWwpIHtcbiAgICAgICAgICB6b2RUeXBlID0gem9kVHlwZS5vcHRpb25hbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcGFyYW0ubmFtZSwgem9kVHlwZV07XG4gICAgICB9KSxcbiAgICApLFxuICApO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkQXBp66W8IFpvZE9iamVjdOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBUeXBlUGFyYW1ldGVy7JmAIOydvOuwmCDtjIzrnbzrr7jthLDrpbwg7LKY66as7ZWY66mwLFxuICogQ29udGV4dCwgUmVmS25leCwgX+uhnCDsi5zsnpHtlZjripQgb3B0aW9uYWwg7YyM652866+47YSw64qUIOygnOyZuO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFpvZE9iamVjdEZyb21BcGkoXG4gIGFwaTogRXh0ZW5kZWRBcGksXG4gIHJlZmVyZW5jZXM6IHtcbiAgICBbaWQ6IHN0cmluZ106IHouWm9kVHlwZTtcbiAgfSA9IHt9LFxuKSB7XG4gIGlmIChhcGkudHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHR5cGVQYXJhbSBvZiBhcGkudHlwZVBhcmFtZXRlcnMpIHtcbiAgICAgIGlmICh0eXBlUGFyYW0uY29uc3RyYWludCkge1xuICAgICAgICBjb25zdCB6b2RUeXBlID0gZ2V0Wm9kVHlwZUZyb21BcGlQYXJhbVR5cGUodHlwZVBhcmFtLmNvbnN0cmFpbnQsIHJlZmVyZW5jZXMpO1xuXG4gICAgICAgIC8vIEZJWE1FOiByZWZlcmVuY2Vz64qUIOq4gOuhnOuyjCDsmKTruIzsoJ3tirjroZwsIHR5cGVQYXJhbS5pZChcIlRcIiDrk7Ep66W8IGtleeuhnCDsnbTroIfqsowg642u7Ja07JSM7JuM67KE66as66m0IGxvYWRlZFR5cGVz6rCAIOyYpOyXvOuQqC5cbiAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0g66CI7Y2865+w7IqkIO2DgOyehSDsupDsiqTtjIVcbiAgICAgICAgKHJlZmVyZW5jZXNbdHlwZVBhcmFtLmlkXSBhcyB6LlpvZFR5cGU8YW55PikgPSB6b2RUeXBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaVBhcmFtcyhcbiAgICAvLyBhcGkgcGFyc2luZ+2VnCDqsrDqs7zqsIAgYXBpIHBhcmFtc1xuICAgIGFwaS5wYXJhbWV0ZXJzLmZpbHRlcihcbiAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgIUFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkgJiZcbiAgICAgICAgIUFwaVBhcmFtVHlwZS5pc1JlZktuZXgocGFyYW0udHlwZSkgJiZcbiAgICAgICAgIShwYXJhbS5vcHRpb25hbCAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSwgLy8gX+uhnCDsi5zsnpHtlZjripQg7YyM652866+47YSw64qUIOygnOyZuFxuICAgICksXG4gICAgcmVmZXJlbmNlcyxcbiAgKTtcbiAgcmV0dXJuIFJlcVR5cGU7XG59XG5cbi8qXG4gKiBBUEkg7YOA7J6FIOygleydmOulvCBUeXBlU2NyaXB0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWY6riwIOychO2VnCDtlajsiJjrk6TsnoXri4jri6QuXG4gKi9cblxuLyoqXG4gKiBBcGlQYXJhbVR5cGXsnYQgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHVuaW9uLCBpbnRlcnNlY3Rpb24sIGFycmF5LCByZWYg65OxIOuqqOuToCDtg4DsnoXsnYQgVFMg66y467KV7Jy866GcIO2RnO2YhO2VmOupsCxcbiAqIGltcG9ydOqwgCDtlYTsmpTtlZwg7YOA7J6FIElE64qUIGluamVjdEltcG9ydEtleXPsl5Ag7IiY7KeR7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW1UeXBlOiBBcGlQYXJhbVR5cGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKFxuICAgIFtcbiAgICAgIFwic3RyaW5nXCIsXG4gICAgICBcIm51bWJlclwiLFxuICAgICAgXCJib29sZWFuXCIsXG4gICAgICBcInRydWVcIixcbiAgICAgIFwiZmFsc2VcIixcbiAgICAgIFwibnVsbFwiLFxuICAgICAgXCJ1bmRlZmluZWRcIixcbiAgICAgIFwidm9pZFwiLFxuICAgICAgXCJhbnlcIixcbiAgICAgIFwidW5rbm93blwiLFxuICAgIF0uaW5jbHVkZXMocGFyYW1UeXBlIGFzIHN0cmluZylcbiAgKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZSBhcyBzdHJpbmc7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzT2JqZWN0KHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYHsgJHthcGlQYXJhbVRvVHNDb2RlKHBhcmFtVHlwZS5wcm9wcywgaW5qZWN0SW1wb3J0S2V5cyl9IH1gO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc1N0cmluZ0xpdGVyYWwocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgXCIke3BhcmFtVHlwZS52YWx1ZX1cImA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzTnVtZXJpY0xpdGVyYWwocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBTdHJpbmcocGFyYW1UeXBlLnZhbHVlKTtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNVbmlvbihwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS50eXBlcy5tYXAoKHR5cGUpID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGUsIGluamVjdEltcG9ydEtleXMpKS5qb2luKFwiIHwgXCIpO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0ludGVyc2VjdGlvbihwYXJhbVR5cGUpKSB7XG4gICAgcmV0dXJuIHBhcmFtVHlwZS50eXBlcy5tYXAoKHR5cGUpID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGUsIGluamVjdEltcG9ydEtleXMpKS5qb2luKFwiICYgXCIpO1xuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0FycmF5KHBhcmFtVHlwZSkpIHtcbiAgICAvLyBpbnRlcnNlY3Rpb27snbTrgpggdW5pb27snbgg6rK97JqwIOq0hO2YuOuhnCDqsJDsi7jquLBcbiAgICBjb25zdCBlbGVtZW50c1R5cGUgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZShwYXJhbVR5cGUuZWxlbWVudHNUeXBlLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgICByZXR1cm4gQXBpUGFyYW1UeXBlLmlzSW50ZXJzZWN0aW9uKHBhcmFtVHlwZS5lbGVtZW50c1R5cGUpIHx8XG4gICAgICBBcGlQYXJhbVR5cGUuaXNVbmlvbihwYXJhbVR5cGUuZWxlbWVudHNUeXBlKVxuICAgICAgPyBgKCR7ZWxlbWVudHNUeXBlfSlbXWBcbiAgICAgIDogYCR7ZWxlbWVudHNUeXBlfVtdYDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNSZWYocGFyYW1UeXBlKSkge1xuICAgIGlmICghW1wiUGlja1wiLCBcIk9taXRcIiwgXCJQcm9taXNlXCIsIFwiUGFydGlhbFwiLCBcIkRhdGVcIl0uaW5jbHVkZXMocGFyYW1UeXBlLmlkKSkge1xuICAgICAgLy8gaW1wb3J0S2V5cyDsnbjsoJ3shZhcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwYXJhbVR5cGUuaWQpO1xuICAgIH1cbiAgICBpZiAocGFyYW1UeXBlLmFyZ3MgPT09IHVuZGVmaW5lZCB8fCBwYXJhbVR5cGUuYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBwYXJhbVR5cGUuaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtwYXJhbVR5cGUuaWR9PCR7cGFyYW1UeXBlLmFyZ3NcbiAgICAgICAgLm1hcCgoYXJnKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZShhcmcsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIixcIil9PmA7XG4gICAgfVxuICB9IGVsc2UgaWYgKEFwaVBhcmFtVHlwZS5pc0luZGV4ZWRBY2Nlc3MocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgJHthcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgIHBhcmFtVHlwZS5vYmplY3QsXG4gICAgICBpbmplY3RJbXBvcnRLZXlzLFxuICAgICl9WyR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW1UeXBlLmluZGV4LCBpbmplY3RJbXBvcnRLZXlzKX1dYDtcbiAgfSBlbHNlIGlmIChBcGlQYXJhbVR5cGUuaXNUdXBsZVR5cGUocGFyYW1UeXBlKSkge1xuICAgIHJldHVybiBgWyAke3BhcmFtVHlwZS5lbGVtZW50cy5tYXAoKGVsZW0pID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKGVsZW0sIGluamVjdEltcG9ydEtleXMpKX0gXWA7XG4gIH0gZWxzZSBpZiAoQXBpUGFyYW1UeXBlLmlzVHlwZVBhcmFtKHBhcmFtVHlwZSkpIHtcbiAgICByZXR1cm4gYCR7cGFyYW1UeXBlLmlkfSR7XG4gICAgICBwYXJhbVR5cGUuY29uc3RyYWludFxuICAgICAgICA/IGAgZXh0ZW5kcyAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHBhcmFtVHlwZS5jb25zdHJhaW50LCBpbmplY3RJbXBvcnRLZXlzKX1gXG4gICAgICAgIDogXCJcIlxuICAgIH1gO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmVzb2x2ZSDrtojqsIAgQXBpUGFyYW1UeXBlICR7cGFyYW1UeXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogQXBpUGFyYW0g67Cw7Je07J2EIFR5cGVTY3JpcHQg7ZWo7IiYIO2MjOudvOuvuO2EsCDsvZTrk5zroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7JiIOiBcIm5hbWU6IHN0cmluZywgYWdlPzogbnVtYmVyLCBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaVBhcmFtVG9Uc0NvZGUocGFyYW1zOiBBcGlQYXJhbVtdLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwYXJhbXNcbiAgICAubWFwKChwYXJhbSkgPT4ge1xuICAgICAgcmV0dXJuIGAke3BhcmFtLm5hbWV9JHtcbiAgICAgICAgcGFyYW0ub3B0aW9uYWwgJiYgIXBhcmFtLmRlZmF1bHREZWYgPyBcIj9cIiA6IFwiXCJcbiAgICAgIH06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocGFyYW0udHlwZSwgaW5qZWN0SW1wb3J0S2V5cyl9JHtcbiAgICAgICAgcGFyYW0uZGVmYXVsdERlZiA/IGA9ICR7cGFyYW0uZGVmYXVsdERlZn1gIDogXCJcIlxuICAgICAgfWA7XG4gICAgfSlcbiAgICAuam9pbihcIiwgXCIpO1xufVxuXG4vKipcbiAqIEFwaVBhcmFtIOuwsOyXtOydhCBUeXBlU2NyaXB0IOqwneyytCDtg4DsnoUg7L2U65Oc66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyYiDogXCJ7IG5hbWU6IHN0cmluZywgYWdlPzogbnVtYmVyLCBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlIH1cIlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpUGFyYW1Ub1RzQ29kZUFzT2JqZWN0KHBhcmFtczogQXBpUGFyYW1bXSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYHsgJHtwYXJhbXNcbiAgICAubWFwKFxuICAgICAgKHBhcmFtKSA9PlxuICAgICAgICBgJHtwYXJhbS5uYW1lfSR7cGFyYW0ub3B0aW9uYWwgPyBcIj9cIiA6IFwiXCJ9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKFxuICAgICAgICAgIHBhcmFtLnR5cGUsXG4gICAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICAgKX0ke3BhcmFtLmRlZmF1bHREZWYgPyBgPSAke3BhcmFtLmRlZmF1bHREZWZ9YCA6IFwiXCJ9YCxcbiAgICApXG4gICAgLmpvaW4oXCIsIFwiKX0gfWA7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQ0EsU0FBZ0Isa0JBQWtCLFdBQXlCO0FBQ3pELEtBQUksYUFBYSxVQUFVLFVBQVUsRUFBRTtBQUNyQyxTQUFPLFVBQVUsT0FBTztRQUNuQjtBQUNMLFNBQU87Ozs7Ozs7O0FBYVgsU0FBZ0IsMkJBQ2QsV0FDQSxZQUdXO0FBQ1gsU0FBUSxXQUFSO0VBQ0UsS0FBSyxTQUNILFFBQU9BLElBQUUsUUFBUTtFQUNuQixLQUFLLFNBQ0gsUUFBT0EsSUFBRSxRQUFRO0VBQ25CLEtBQUssVUFDSCxRQUFPQSxJQUFFLFNBQVM7RUFDcEIsU0FBUztHQUNQLE1BQU0sVUFBVTtBQUNoQixXQUFRLFFBQVEsR0FBaEI7SUFDRSxLQUFLO0lBQ0wsS0FBSyxrQkFDSCxRQUFPQSxJQUFFLFFBQVEsUUFBUSxNQUFNO0lBQ2pDLEtBQUssVUFBVTtLQUNiLE1BQU0sVUFBVTtBQUNoQixZQUFPLDBCQUEwQixRQUFRLE1BQU07O0lBRWpELEtBQUssU0FBUztLQUNaLE1BQU0sVUFBVTtBQUloQixZQUFPQSxJ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