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,282 +1,256 @@
1
- import assert from "assert";
1
+ import { Sonamu } from "../../api/sonamu.js";
2
+ import { init_types, isBelongsToOneRelationProp, isManyToManyRelationProp, isOneToOneRelationProp } from "../../types/types.js";
3
+ import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
4
+ import { init_api } from "../../api/index.js";
5
+ import { Template, init_template } from "../template.js";
2
6
  import inflection from "inflection";
3
7
  import { unique } from "radashi";
4
- import { Sonamu } from "../../api/index.js";
5
- import { EntityManager } from "../../entity/entity-manager.js";
6
- import { isBelongsToOneRelationProp, isManyToManyRelationProp, isOneToOneRelationProp } from "../../types/types.js";
7
- import { Template } from "../template.js";
8
+ import assert from "assert";
9
+
10
+ //#region src/template/implementations/generated_sso.template.ts
11
+ init_api();
12
+ init_entity_manager();
13
+ init_types();
14
+ init_template();
8
15
  /**
9
- * better-auth additionalFields의 type 값을 TypeScript 타입 문자열로 변환합니다.
10
- */ function mapBetterAuthFieldType(type) {
11
- switch(type){
12
- case "string":
13
- return "string";
14
- case "number":
15
- return "number";
16
- case "boolean":
17
- return "boolean";
18
- case "date":
19
- return "Date";
20
- case "string[]":
21
- return "string[]";
22
- case "number[]":
23
- return "number[]";
24
- default:
25
- return "unknown";
26
- }
16
+ * better-auth additionalFields의 type 값을 TypeScript 타입 문자열로 변환합니다.
17
+ */
18
+ function mapBetterAuthFieldType(type) {
19
+ switch (type) {
20
+ case "string": return "string";
21
+ case "number": return "number";
22
+ case "boolean": return "boolean";
23
+ case "date": return "Date";
24
+ case "string[]": return "string[]";
25
+ case "number[]": return "number[]";
26
+ default: return "unknown";
27
+ }
27
28
  }
28
- export class Template__generated_sso extends Template {
29
- constructor(){
30
- super("generated_sso");
31
- }
32
- getTargetAndPath() {
33
- const { dir } = Sonamu.config.api;
34
- return {
35
- target: `${dir}/src/application`,
36
- path: `sonamu.generated.sso.ts`
37
- };
38
- }
39
- render() {
40
- const entityIds = EntityManager.getAllIds();
41
- const entities = entityIds.map((id)=>EntityManager.get(id));
42
- // SubsetQueries 생성 대상: 부모 엔티티가 없고 서브셋이 존재
43
- const targetEntities = entities.filter((entity)=>entity.parentId === undefined && Object.keys(entity.subsets).length > 0);
44
- // SubsetQueries 생성
45
- const sourceCodes = targetEntities.flatMap((entity)=>{
46
- const subsetKeys = Object.keys(entity.subsets);
47
- const subsetKeyTypeName = `${entity.names.module}SubsetKey`;
48
- const entityCamelName = inflection.camelize(entity.id, true);
49
- // Puri 기반 SubsetQuery
50
- const puriSubsetQuery = {
51
- label: `SubsetQuery: ${entity.id}`,
52
- lines: [
53
- `export const ${entityCamelName}SubsetQueries = {`,
54
- ...subsetKeys.map((subsetKey)=>`${subsetKey}: (qbWrapper: PuriWrapper<DatabaseSchemaExtend>) => {
29
+ var Template__generated_sso = class extends Template {
30
+ constructor() {
31
+ super("generated_sso");
32
+ }
33
+ getTargetAndPath() {
34
+ const { dir } = Sonamu.config.api;
35
+ return {
36
+ target: `${dir}/src/application`,
37
+ path: `sonamu.generated.sso.ts`
38
+ };
39
+ }
40
+ render() {
41
+ const entityIds = EntityManager.getAllIds();
42
+ const entities = entityIds.map((id) => EntityManager.get(id));
43
+ const targetEntities = entities.filter((entity) => entity.parentId === undefined && Object.keys(entity.subsets).length > 0);
44
+ const sourceCodes = targetEntities.flatMap((entity) => {
45
+ const subsetKeys = Object.keys(entity.subsets);
46
+ const subsetKeyTypeName = `${entity.names.module}SubsetKey`;
47
+ const entityCamelName = inflection.camelize(entity.id, true);
48
+ const puriSubsetQuery = {
49
+ label: `SubsetQuery: ${entity.id}`,
50
+ lines: [
51
+ `export const ${entityCamelName}SubsetQueries = {`,
52
+ ...subsetKeys.map((subsetKey) => `${subsetKey}: (qbWrapper: PuriWrapper<DatabaseSchemaExtend>) => {
55
53
  ${entity.getPuriSubsetQuery(subsetKey)};
56
54
  },`),
57
- `};`,
58
- ""
59
- ],
60
- importKeys: []
61
- };
62
- // Puri 기반 SubsetLoadersQuery
63
- const puriLoaderQuery = {
64
- label: `LoaderQuery: ${entity.id}`,
65
- lines: [
66
- `export const ${entityCamelName}LoaderQueries = {`,
67
- ...subsetKeys.map((subsetKey)=>{
68
- return `${subsetKey}: ${entity.getPuriLoaderQuery(subsetKey)},`;
69
- }),
70
- `} as const satisfies PuriLoaderQueries<${subsetKeyTypeName}>;`,
71
- ""
72
- ],
73
- importKeys: [
74
- subsetKeyTypeName
75
- ]
76
- };
77
- return [
78
- puriSubsetQuery,
79
- puriLoaderQuery
80
- ];
81
- });
82
- // ForeignKey 타입 생성
83
- const fkTypeSourceCode = this.getForeignKeyTypeSourceCode(entities);
84
- if (fkTypeSourceCode) {
85
- sourceCodes.push(fkTypeSourceCode);
86
- }
87
- // DatabaseSchema 생성
88
- const dbSchemaSourceCode = this.getDatabaseSchemaSourceCode(entities);
89
- if (dbSchemaSourceCode) {
90
- sourceCodes.push(dbSchemaSourceCode);
91
- }
92
- // Auth User 타입 생성
93
- const authUserTypeSourceCode = this.getAuthUserTypeSourceCode();
94
- if (authUserTypeSourceCode) {
95
- sourceCodes.push(authUserTypeSourceCode);
96
- }
97
- const sourceCode = sourceCodes.reduce((result, ts)=>{
98
- if (ts === null) {
99
- return result;
100
- }
101
- assert(result);
102
- return {
103
- lines: [
104
- ...result.lines,
105
- `// ${ts.label}`,
106
- ...ts.lines,
107
- ""
108
- ],
109
- importKeys: unique([
110
- ...result.importKeys,
111
- ...ts.importKeys
112
- ])
113
- };
114
- }, {
115
- lines: [],
116
- importKeys: []
117
- });
118
- const body = sourceCode.lines.join("\n");
119
- const isUsingManyToManyBaseSchema = body.includes("ManyToManyBaseSchema");
120
- const sonamuImports = [
121
- "PuriWrapper",
122
- "DatabaseSchemaExtend",
123
- "PuriLoaderQueries",
124
- isUsingManyToManyBaseSchema ? "ManyToManyBaseSchema" : ""
125
- ].filter(Boolean).join(", ");
126
- // customHeaders 구성
127
- const customHeaders = [
128
- "/**",
129
- " * @generated",
130
- " * 직접 수정하지 마세요.",
131
- " */",
132
- `import { ${sonamuImports} } from "sonamu";`
133
- ];
134
- if (this.hasAuthConfig()) {
135
- customHeaders.push(`import type { User } from "better-auth";`);
136
- }
137
- return {
138
- ...this.getTargetAndPath(),
139
- body: sourceCode.lines.join("\n"),
140
- importKeys: sourceCode.importKeys,
141
- customHeaders
142
- };
143
- }
144
- //===============================================
145
- // private Helper Methods
146
- //===============================================
147
- getDatabaseSchemaSourceCode(entities) {
148
- if (entities.length === 0) {
149
- return null;
150
- }
151
- // DatabaseSchemaExtend - 테이블 스키마 타입 정의
152
- const entitySchemaLines = entities.map((entity)=>`${entity.table}: ${entity.id}BaseSchema;`);
153
- const joinTables = unique(entities.flatMap((entity)=>entity.props.filter(isManyToManyRelationProp).map((prop)=>{
154
- const fromTableKey = inflection.singularize(entity.table);
155
- const toEntity = EntityManager.get(prop.with);
156
- const toTableKey = inflection.singularize(toEntity.table);
157
- return {
158
- table: prop.joinTable,
159
- fromTableKey,
160
- toTableKey,
161
- fromEntityId: entity.id,
162
- toEntityId: toEntity.id
163
- };
164
- })), (joinTable)=>joinTable.table);
165
- // DatabaseForeignKeys - FK 컬럼을 가진 테이블만 정의
166
- const entitiesWithFk = entities.filter((entity)=>this.getForeignKeyColumns(entity).length > 0);
167
- const fkMetadataLines = entitiesWithFk.map((entity)=>`${entity.table}: ${entity.id}ForeignKeys;`);
168
- // ContextExtend - auth 설정이 있을 때만 user 타입 추가
169
- const contextExtendLines = [];
170
- if (this.hasAuthConfig()) {
171
- contextExtendLines.push(``, ` export interface ContextExtend {`, ` user: SonamuUser | null;`, ` }`);
172
- }
173
- return {
174
- label: `DatabaseSchema`,
175
- lines: [
176
- `declare module "sonamu" {`,
177
- ` export interface DatabaseSchemaExtend {`,
178
- ...entitySchemaLines,
179
- ...joinTables.map((joinTable)=>{
180
- const fromEntity = EntityManager.get(joinTable.fromEntityId);
181
- const toEntity = EntityManager.get(joinTable.toEntityId);
182
- const fromPkType = fromEntity.getPkType() === "integer" ? "number" : "string";
183
- const toPkType = toEntity.getPkType() === "integer" ? "number" : "string";
184
- return `${joinTable.table}: ManyToManyBaseSchema<"${joinTable.fromTableKey}", "${joinTable.toTableKey}", ${fromPkType}, ${toPkType}>;`;
185
- }),
186
- ` }`,
187
- ``,
188
- ` export interface DatabaseForeignKeys {`,
189
- ...fkMetadataLines,
190
- ` }`,
191
- ...contextExtendLines,
192
- `}`
193
- ],
194
- importKeys: entities.map((entity)=>`${entity.id}BaseSchema`)
195
- };
196
- }
197
- // FK 관계를 컬럼명으로 변환 (예: company → company_id)
198
- getForeignKeyColumns(entity) {
199
- return entity.props.filter((prop)=>{
200
- if (isBelongsToOneRelationProp(prop)) {
201
- return true;
202
- }
203
- if (isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
204
- return true;
205
- }
206
- return false;
207
- }).map((prop)=>`${prop.name}_id`);
208
- }
209
- getForeignKeyTypeSourceCode(entities) {
210
- if (entities.length === 0) {
211
- return null;
212
- }
213
- // FK가 있는 엔티티만 타입 생성
214
- const entitiesWithFk = entities.filter((entity)=>this.getForeignKeyColumns(entity).length > 0);
215
- if (entitiesWithFk.length === 0) {
216
- return null;
217
- }
218
- const fkTypeLines = entitiesWithFk.map((entity)=>{
219
- const fkColumns = this.getForeignKeyColumns(entity);
220
- const fkTypeValue = fkColumns.map((col)=>`"${col}"`).join(" | ");
221
- return `export type ${entity.id}ForeignKeys = ${fkTypeValue};`;
222
- });
223
- return {
224
- label: `ForeignKey Types`,
225
- lines: fkTypeLines,
226
- importKeys: []
227
- };
228
- }
229
- /**
230
- * sonamu.config.ts의 auth.user.additionalFields에서 SonamuUser 타입을 생성합니다.
231
- * @returns SourceCode | null - auth 설정이 없으면 null 반환
232
- */ getAuthUserTypeSourceCode() {
233
- const authConfig = Sonamu.config.server?.auth;
234
- if (!authConfig) {
235
- return null;
236
- }
237
- // biome-ignore lint/suspicious/noExplicitAny: additionalFields 타입이 동적임
238
- const additionalFields = authConfig?.user?.additionalFields;
239
- if (!additionalFields || Object.keys(additionalFields).length === 0) {
240
- // additionalFields가 없으면 기본 User 타입만 사용
241
- return {
242
- label: "Auth User Type",
243
- lines: [
244
- "export type SonamuUser = User;"
245
- ],
246
- importKeys: []
247
- };
248
- }
249
- const importKeys = [];
250
- // additionalFields를 TypeScript 타입으로 변환
251
- const fieldLines = Object.entries(additionalFields).map(([key, value])=>{
252
- // biome-ignore lint/suspicious/noExplicitAny: better-auth additionalFields 구조
253
- const fieldConfig = value;
254
- const isRequired = fieldConfig.required !== false;
255
- let fieldType;
256
- // sonamuType이 있으면 description을 타입명으로 사용
257
- if (fieldConfig.sonamuType) {
258
- fieldType = fieldConfig.sonamuType;
259
- importKeys.push(fieldType);
260
- } else {
261
- fieldType = mapBetterAuthFieldType(fieldConfig.type);
262
- }
263
- return ` ${key}${isRequired ? "" : "?"}: ${fieldType};`;
264
- });
265
- return {
266
- label: "Auth User Type",
267
- lines: [
268
- "export type SonamuUser = User & {",
269
- ...fieldLines,
270
- "};"
271
- ],
272
- importKeys
273
- };
274
- }
275
- /**
276
- * auth 설정이 있는지 확인합니다.
277
- */ hasAuthConfig() {
278
- return !!Sonamu.config.server?.auth;
279
- }
280
- }
55
+ `};`,
56
+ ""
57
+ ],
58
+ importKeys: []
59
+ };
60
+ const puriLoaderQuery = {
61
+ label: `LoaderQuery: ${entity.id}`,
62
+ lines: [
63
+ `export const ${entityCamelName}LoaderQueries = {`,
64
+ ...subsetKeys.map((subsetKey) => {
65
+ return `${subsetKey}: ${entity.getPuriLoaderQuery(subsetKey)},`;
66
+ }),
67
+ `} as const satisfies PuriLoaderQueries<${subsetKeyTypeName}>;`,
68
+ ""
69
+ ],
70
+ importKeys: [subsetKeyTypeName]
71
+ };
72
+ return [puriSubsetQuery, puriLoaderQuery];
73
+ });
74
+ const fkTypeSourceCode = this.getForeignKeyTypeSourceCode(entities);
75
+ if (fkTypeSourceCode) {
76
+ sourceCodes.push(fkTypeSourceCode);
77
+ }
78
+ const dbSchemaSourceCode = this.getDatabaseSchemaSourceCode(entities);
79
+ if (dbSchemaSourceCode) {
80
+ sourceCodes.push(dbSchemaSourceCode);
81
+ }
82
+ const authUserTypeSourceCode = this.getAuthUserTypeSourceCode();
83
+ if (authUserTypeSourceCode) {
84
+ sourceCodes.push(authUserTypeSourceCode);
85
+ }
86
+ const sourceCode = sourceCodes.reduce((result, ts) => {
87
+ if (ts === null) {
88
+ return result;
89
+ }
90
+ assert(result);
91
+ return {
92
+ lines: [
93
+ ...result.lines,
94
+ `// ${ts.label}`,
95
+ ...ts.lines,
96
+ ""
97
+ ],
98
+ importKeys: unique([...result.importKeys, ...ts.importKeys])
99
+ };
100
+ }, {
101
+ lines: [],
102
+ importKeys: []
103
+ });
104
+ const body = sourceCode.lines.join("\n");
105
+ const isUsingManyToManyBaseSchema = body.includes("ManyToManyBaseSchema");
106
+ const sonamuImports = [
107
+ "PuriWrapper",
108
+ "DatabaseSchemaExtend",
109
+ "PuriLoaderQueries",
110
+ isUsingManyToManyBaseSchema ? "ManyToManyBaseSchema" : ""
111
+ ].filter(Boolean).join(", ");
112
+ const customHeaders = [
113
+ "/**",
114
+ " * @generated",
115
+ " * 직접 수정하지 마세요.",
116
+ " */",
117
+ `import { ${sonamuImports} } from "sonamu";`
118
+ ];
119
+ if (this.hasAuthConfig()) {
120
+ customHeaders.push(`import type { User } from "better-auth";`);
121
+ }
122
+ return {
123
+ ...this.getTargetAndPath(),
124
+ body: sourceCode.lines.join("\n"),
125
+ importKeys: sourceCode.importKeys,
126
+ customHeaders
127
+ };
128
+ }
129
+ getDatabaseSchemaSourceCode(entities) {
130
+ if (entities.length === 0) {
131
+ return null;
132
+ }
133
+ const entitySchemaLines = entities.map((entity) => `${entity.table}: ${entity.id}BaseSchema;`);
134
+ const joinTables = unique(entities.flatMap((entity) => entity.props.filter(isManyToManyRelationProp).map((prop) => {
135
+ const fromTableKey = inflection.singularize(entity.table);
136
+ const toEntity = EntityManager.get(prop.with);
137
+ const toTableKey = inflection.singularize(toEntity.table);
138
+ return {
139
+ table: prop.joinTable,
140
+ fromTableKey,
141
+ toTableKey,
142
+ fromEntityId: entity.id,
143
+ toEntityId: toEntity.id
144
+ };
145
+ })), (joinTable) => joinTable.table);
146
+ const entitiesWithFk = entities.filter((entity) => this.getForeignKeyColumns(entity).length > 0);
147
+ const fkMetadataLines = entitiesWithFk.map((entity) => `${entity.table}: ${entity.id}ForeignKeys;`);
148
+ const contextExtendLines = [];
149
+ if (this.hasAuthConfig()) {
150
+ contextExtendLines.push(``, ` export interface ContextExtend {`, ` user: SonamuUser | null;`, ` }`);
151
+ }
152
+ return {
153
+ label: `DatabaseSchema`,
154
+ lines: [
155
+ `declare module "sonamu" {`,
156
+ ` export interface DatabaseSchemaExtend {`,
157
+ ...entitySchemaLines,
158
+ ...joinTables.map((joinTable) => {
159
+ const fromEntity = EntityManager.get(joinTable.fromEntityId);
160
+ const toEntity = EntityManager.get(joinTable.toEntityId);
161
+ const fromPkType = fromEntity.getPkType() === "integer" ? "number" : "string";
162
+ const toPkType = toEntity.getPkType() === "integer" ? "number" : "string";
163
+ return `${joinTable.table}: ManyToManyBaseSchema<"${joinTable.fromTableKey}", "${joinTable.toTableKey}", ${fromPkType}, ${toPkType}>;`;
164
+ }),
165
+ ` }`,
166
+ ``,
167
+ ` export interface DatabaseForeignKeys {`,
168
+ ...fkMetadataLines,
169
+ ` }`,
170
+ ...contextExtendLines,
171
+ `}`
172
+ ],
173
+ importKeys: entities.map((entity) => `${entity.id}BaseSchema`)
174
+ };
175
+ }
176
+ getForeignKeyColumns(entity) {
177
+ return entity.props.filter((prop) => {
178
+ if (isBelongsToOneRelationProp(prop)) {
179
+ return true;
180
+ }
181
+ if (isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
182
+ return true;
183
+ }
184
+ return false;
185
+ }).map((prop) => `${prop.name}_id`);
186
+ }
187
+ getForeignKeyTypeSourceCode(entities) {
188
+ if (entities.length === 0) {
189
+ return null;
190
+ }
191
+ const entitiesWithFk = entities.filter((entity) => this.getForeignKeyColumns(entity).length > 0);
192
+ if (entitiesWithFk.length === 0) {
193
+ return null;
194
+ }
195
+ const fkTypeLines = entitiesWithFk.map((entity) => {
196
+ const fkColumns = this.getForeignKeyColumns(entity);
197
+ const fkTypeValue = fkColumns.map((col) => `"${col}"`).join(" | ");
198
+ return `export type ${entity.id}ForeignKeys = ${fkTypeValue};`;
199
+ });
200
+ return {
201
+ label: `ForeignKey Types`,
202
+ lines: fkTypeLines,
203
+ importKeys: []
204
+ };
205
+ }
206
+ /**
207
+ * sonamu.config.ts의 auth.user.additionalFields에서 SonamuUser 타입을 생성합니다.
208
+ * @returns SourceCode | null - auth 설정이 없으면 null 반환
209
+ */
210
+ getAuthUserTypeSourceCode() {
211
+ const authConfig = Sonamu.config.server?.auth;
212
+ if (!authConfig) {
213
+ return null;
214
+ }
215
+ const additionalFields = authConfig?.user?.additionalFields;
216
+ if (!additionalFields || Object.keys(additionalFields).length === 0) {
217
+ return {
218
+ label: "Auth User Type",
219
+ lines: ["export type SonamuUser = User;"],
220
+ importKeys: []
221
+ };
222
+ }
223
+ const importKeys = [];
224
+ const fieldLines = Object.entries(additionalFields).map(([key, value]) => {
225
+ const fieldConfig = value;
226
+ const isRequired = fieldConfig.required !== false;
227
+ let fieldType;
228
+ if (fieldConfig.sonamuType) {
229
+ fieldType = fieldConfig.sonamuType;
230
+ importKeys.push(fieldType);
231
+ } else {
232
+ fieldType = mapBetterAuthFieldType(fieldConfig.type);
233
+ }
234
+ return ` ${key}${isRequired ? "" : "?"}: ${fieldType};`;
235
+ });
236
+ return {
237
+ label: "Auth User Type",
238
+ lines: [
239
+ "export type SonamuUser = User & {",
240
+ ...fieldLines,
241
+ "};"
242
+ ],
243
+ importKeys
244
+ };
245
+ }
246
+ /**
247
+ * auth 설정이 있는지 확인합니다.
248
+ */
249
+ hasAuthConfig() {
250
+ return !!Sonamu.config.server?.auth;
251
+ }
252
+ };
281
253
 
282
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkX3Nzby50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB0eXBlIHsgU291cmNlQ29kZSB9IGZyb20gXCIuL2dlbmVyYXRlZC50ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIGJldHRlci1hdXRoIGFkZGl0aW9uYWxGaWVsZHPsnZggdHlwZSDqsJLsnYQgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gbWFwQmV0dGVyQXV0aEZpZWxkVHlwZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJEYXRlXCI7XG4gICAgY2FzZSBcInN0cmluZ1tdXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdbXVwiO1xuICAgIGNhc2UgXCJudW1iZXJbXVwiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyW11cIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fZ2VuZXJhdGVkX3NzbyBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJnZW5lcmF0ZWRfc3NvXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9hcHBsaWNhdGlvbmAsXG4gICAgICBwYXRoOiBgc29uYW11LmdlbmVyYXRlZC5zc28udHNgLFxuICAgIH07XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IGVudGl0eUlkcy5tYXAoKGlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChpZCkpO1xuXG4gICAgLy8gU3Vic2V0UXVlcmllcyDsg53shLEg64yA7IOBOiDrtoDrqqgg7JeU7Yuw7Yuw6rCAIOyXhuqzoCDshJzruIzshYvsnbQg7KG07J6sXG4gICAgY29uc3QgdGFyZ2V0RW50aXRpZXMgPSBlbnRpdGllcy5maWx0ZXIoXG4gICAgICAoZW50aXR5KSA9PiBlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiBPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cykubGVuZ3RoID4gMCxcbiAgICApO1xuXG4gICAgLy8gU3Vic2V0UXVlcmllcyDsg53shLFcbiAgICBjb25zdCBzb3VyY2VDb2RlczogU291cmNlQ29kZVtdID0gdGFyZ2V0RW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PiB7XG4gICAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpO1xuXG4gICAgICBjb25zdCBzdWJzZXRLZXlUeXBlTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5YDtcbiAgICAgIGNvbnN0IGVudGl0eUNhbWVsTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoZW50aXR5LmlkLCB0cnVlKTtcblxuICAgICAgLy8gUHVyaSDquLDrsJggU3Vic2V0UXVlcnlcbiAgICAgIGNvbnN0IHB1cmlTdWJzZXRRdWVyeTogU291cmNlQ29kZSA9IHtcbiAgICAgICAgbGFiZWw6IGBTdWJzZXRRdWVyeTogJHtlbnRpdHkuaWR9YCxcbiAgICAgICAgbGluZXM6IFtcbiAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Q2FtZWxOYW1lfVN1YnNldFF1ZXJpZXMgPSB7YCxcbiAgICAgICAgICAuLi5zdWJzZXRLZXlzLm1hcChcbiAgICAgICAgICAgIChzdWJzZXRLZXkpID0+IGAke3N1YnNldEtleX06IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4ge1xuICAgICAgICAgICAgJHtlbnRpdHkuZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleSl9O1xuICAgICAgICAgIH0sYCxcbiAgICAgICAgICApLFxuICAgICAgICAgIGB9O2AsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgXSxcbiAgICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICB9O1xuXG4gICAgICAvLyBQdXJpIOq4sOuwmCBTdWJzZXRMb2FkZXJzUXVlcnlcbiAgICAgIGNvbnN0IHB1cmlMb2FkZXJRdWVyeTogU291cmNlQ29kZSA9IHtcbiAgICAgICAgbGFiZWw6IGBMb2FkZXJRdWVyeTogJHtlbnRpdHkuaWR9YCxcbiAgICAgICAgbGluZXM6IFtcbiAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Q2FtZWxOYW1lfUxvYWRlclF1ZXJpZXMgPSB7YCxcbiAgICAgICAgICAuLi5zdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYCR7c3Vic2V0S2V5fTogJHtlbnRpdHkuZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleSl9LGA7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgYH0gYXMgY29uc3Qgc2F0aXNmaWVzIFB1cmlMb2FkZXJRdWVyaWVzPCR7c3Vic2V0S2V5VHlwZU5hbWV9PjtgLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGltcG9ydEtleXM6IFtzdWJzZXRLZXlUeXBlTmFtZV0sXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gW3B1cmlTdWJzZXRRdWVyeSwgcHVyaUxvYWRlclF1ZXJ5XTtcbiAgICB9KTtcblxuICAgIC8vIEZvcmVpZ25LZXkg7YOA7J6FIOyDneyEsVxuICAgIGNvbnN0IGZrVHlwZVNvdXJjZUNvZGUgPSB0aGlzLmdldEZvcmVpZ25LZXlUeXBlU291cmNlQ29kZShlbnRpdGllcyk7XG4gICAgaWYgKGZrVHlwZVNvdXJjZUNvZGUpIHtcbiAgICAgIHNvdXJjZUNvZGVzLnB1c2goZmtUeXBlU291cmNlQ29kZSk7XG4gICAgfVxuXG4gICAgLy8gRGF0YWJhc2VTY2hlbWEg7IOd7ISxXG4gICAgY29uc3QgZGJTY2hlbWFTb3VyY2VDb2RlID0gdGhpcy5nZXREYXRhYmFzZVNjaGVtYVNvdXJjZUNvZGUoZW50aXRpZXMpO1xuICAgIGlmIChkYlNjaGVtYVNvdXJjZUNvZGUpIHtcbiAgICAgIHNvdXJjZUNvZGVzLnB1c2goZGJTY2hlbWFTb3VyY2VDb2RlKTtcbiAgICB9XG5cbiAgICAvLyBBdXRoIFVzZXIg7YOA7J6FIOyDneyEsVxuICAgIGNvbnN0IGF1dGhVc2VyVHlwZVNvdXJjZUNvZGUgPSB0aGlzLmdldEF1dGhVc2VyVHlwZVNvdXJjZUNvZGUoKTtcbiAgICBpZiAoYXV0aFVzZXJUeXBlU291cmNlQ29kZSkge1xuICAgICAgc291cmNlQ29kZXMucHVzaChhdXRoVXNlclR5cGVTb3VyY2VDb2RlKTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VDb2RlID0gc291cmNlQ29kZXMucmVkdWNlKFxuICAgICAgKHJlc3VsdCwgdHMpID0+IHtcbiAgICAgICAgaWYgKHRzID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lczogWy4uLnJlc3VsdC5saW5lcywgYC8vICR7dHMubGFiZWx9YCwgLi4udHMubGluZXMsIFwiXCJdLFxuICAgICAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShbLi4ucmVzdWx0LmltcG9ydEtleXMsIC4uLnRzLmltcG9ydEtleXNdKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxpbmVzOiBbXSxcbiAgICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICB9IGFzIE9taXQ8U291cmNlQ29kZSwgXCJsYWJlbFwiPixcbiAgICApO1xuXG4gICAgY29uc3QgYm9keSA9IHNvdXJjZUNvZGUubGluZXMuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBpc1VzaW5nTWFueVRvTWFueUJhc2VTY2hlbWEgPSBib2R5LmluY2x1ZGVzKFwiTWFueVRvTWFueUJhc2VTY2hlbWFcIik7XG5cbiAgICBjb25zdCBzb25hbXVJbXBvcnRzID0gW1xuICAgICAgXCJQdXJpV3JhcHBlclwiLFxuICAgICAgXCJEYXRhYmFzZVNjaGVtYUV4dGVuZFwiLFxuICAgICAgXCJQdXJpTG9hZGVyUXVlcmllc1wiLFxuICAgICAgaXNVc2luZ01hbnlUb01hbnlCYXNlU2NoZW1hID8gXCJNYW55VG9NYW55QmFzZVNjaGVtYVwiIDogXCJcIixcbiAgICBdXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAuam9pbihcIiwgXCIpO1xuXG4gICAgLy8gY3VzdG9tSGVhZGVycyDqtazshLFcbiAgICBjb25zdCBjdXN0b21IZWFkZXJzID0gW1xuICAgICAgXCIvKipcIixcbiAgICAgIFwiICogQGdlbmVyYXRlZFwiLFxuICAgICAgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgIFwiICovXCIsXG4gICAgICBgaW1wb3J0IHsgJHtzb25hbXVJbXBvcnRzfSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIF07XG4gICAgaWYgKHRoaXMuaGFzQXV0aENvbmZpZygpKSB7XG4gICAgICBjdXN0b21IZWFkZXJzLnB1c2goYGltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO2ApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgoKSxcbiAgICAgIGJvZHk6IHNvdXJjZUNvZGUubGluZXMuam9pbihcIlxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IHNvdXJjZUNvZGUuaW1wb3J0S2V5cyxcbiAgICAgIGN1c3RvbUhlYWRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHJpdmF0ZSBIZWxwZXIgTWV0aG9kc1xuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHByaXZhdGUgZ2V0RGF0YWJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0aWVzOiBFbnRpdHlbXSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBEYXRhYmFzZVNjaGVtYUV4dGVuZCAtIO2FjOydtOu4lCDsiqTtgqTrp4gg7YOA7J6FIOygleydmFxuICAgIGNvbnN0IGVudGl0eVNjaGVtYUxpbmVzID0gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGAke2VudGl0eS50YWJsZX06ICR7ZW50aXR5LmlkfUJhc2VTY2hlbWE7YCk7XG5cbiAgICBjb25zdCBqb2luVGFibGVzID0gdW5pcXVlKFxuICAgICAgZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PlxuICAgICAgICBlbnRpdHkucHJvcHMuZmlsdGVyKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCkubWFwKChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbVRhYmxlS2V5ID0gaW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpO1xuICAgICAgICAgIGNvbnN0IHRvRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCB0b1RhYmxlS2V5ID0gaW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0b0VudGl0eS50YWJsZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRhYmxlOiBwcm9wLmpvaW5UYWJsZSxcbiAgICAgICAgICAgIGZyb21UYWJsZUtleSxcbiAgICAgICAgICAgIHRvVGFibGVLZXksXG4gICAgICAgICAgICBmcm9tRW50aXR5SWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgIHRvRW50aXR5SWQ6IHRvRW50aXR5LmlkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIChqb2luVGFibGUpID0+IGpvaW5UYWJsZS50YWJsZSxcbiAgICApO1xuXG4gICAgLy8gRGF0YWJhc2VGb3JlaWduS2V5cyAtIEZLIOy7rOufvOydhCDqsIDsp4Qg7YWM7J2067iU66eMIOygleydmFxuICAgIGNvbnN0IGVudGl0aWVzV2l0aEZrID0gZW50aXRpZXMuZmlsdGVyKFxuICAgICAgKGVudGl0eSkgPT4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHkpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgICBjb25zdCBma01ldGFkYXRhTGluZXMgPSBlbnRpdGllc1dpdGhGay5tYXAoXG4gICAgICAoZW50aXR5KSA9PiBgJHtlbnRpdHkudGFibGV9OiAke2VudGl0eS5pZH1Gb3JlaWduS2V5cztgLFxuICAgICk7XG5cbiAgICAvLyBDb250ZXh0RXh0ZW5kIC0gYXV0aCDshKTsoJXsnbQg7J6I7J2EIOuVjOunjCB1c2VyIO2DgOyehSDstpTqsIBcbiAgICBjb25zdCBjb250ZXh0RXh0ZW5kTGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuaGFzQXV0aENvbmZpZygpKSB7XG4gICAgICBjb250ZXh0RXh0ZW5kTGluZXMucHVzaChcbiAgICAgICAgYGAsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dEV4dGVuZCB7YCxcbiAgICAgICAgYCAgICB1c2VyOiBTb25hbXVVc2VyIHwgbnVsbDtgLFxuICAgICAgICBgICB9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgRGF0YWJhc2VTY2hlbWFgLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgYGRlY2xhcmUgbW9kdWxlIFwic29uYW11XCIge2AsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VTY2hlbWFFeHRlbmQge2AsXG4gICAgICAgIC4uLmVudGl0eVNjaGVtYUxpbmVzLFxuICAgICAgICAuLi5qb2luVGFibGVzLm1hcCgoam9pblRhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGpvaW5UYWJsZS5mcm9tRW50aXR5SWQpO1xuICAgICAgICAgIGNvbnN0IHRvRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoam9pblRhYmxlLnRvRW50aXR5SWQpO1xuICAgICAgICAgIGNvbnN0IGZyb21Qa1R5cGUgPSBmcm9tRW50aXR5LmdldFBrVHlwZSgpID09PSBcImludGVnZXJcIiA/IFwibnVtYmVyXCIgOiBcInN0cmluZ1wiO1xuICAgICAgICAgIGNvbnN0IHRvUGtUeXBlID0gdG9FbnRpdHkuZ2V0UGtUeXBlKCkgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJcIiA6IFwic3RyaW5nXCI7XG5cbiAgICAgICAgICByZXR1cm4gYCR7am9pblRhYmxlLnRhYmxlfTogTWFueVRvTWFueUJhc2VTY2hlbWE8XCIke2pvaW5UYWJsZS5mcm9tVGFibGVLZXl9XCIsIFwiJHtqb2luVGFibGUudG9UYWJsZUtleX1cIiwgJHtmcm9tUGtUeXBlfSwgJHt0b1BrVHlwZX0+O2A7XG4gICAgICAgIH0pLFxuICAgICAgICBgICB9YCxcbiAgICAgICAgYGAsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VGb3JlaWduS2V5cyB7YCxcbiAgICAgICAgLi4uZmtNZXRhZGF0YUxpbmVzLFxuICAgICAgICBgICB9YCxcbiAgICAgICAgLi4uY29udGV4dEV4dGVuZExpbmVzLFxuICAgICAgICBgfWAsXG4gICAgICBdLFxuICAgICAgaW1wb3J0S2V5czogZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGAke2VudGl0eS5pZH1CYXNlU2NoZW1hYCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZLIOq0gOqzhOulvCDsu6zrn7zrqoXsnLzroZwg67OA7ZmYICjsmIg6IGNvbXBhbnkg4oaSIGNvbXBhbnlfaWQpXG4gIHByaXZhdGUgZ2V0Rm9yZWlnbktleUNvbHVtbnMoZW50aXR5OiBFbnRpdHkpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLm1hcCgocHJvcCkgPT4gYCR7cHJvcC5uYW1lfV9pZGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb3JlaWduS2V5VHlwZVNvdXJjZUNvZGUoZW50aXRpZXM6IEVudGl0eVtdKTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZL6rCAIOyeiOuKlCDsl5Tti7Dti7Drp4wg7YOA7J6FIOyDneyEsVxuICAgIGNvbnN0IGVudGl0aWVzV2l0aEZrID0gZW50aXRpZXMuZmlsdGVyKFxuICAgICAgKGVudGl0eSkgPT4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHkpLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIGlmIChlbnRpdGllc1dpdGhGay5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZrVHlwZUxpbmVzID0gZW50aXRpZXNXaXRoRmsubWFwKChlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IGZrQ29sdW1ucyA9IHRoaXMuZ2V0Rm9yZWlnbktleUNvbHVtbnMoZW50aXR5KTtcbiAgICAgIGNvbnN0IGZrVHlwZVZhbHVlID0gZmtDb2x1bW5zLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApLmpvaW4oXCIgfCBcIik7XG5cbiAgICAgIHJldHVybiBgZXhwb3J0IHR5cGUgJHtlbnRpdHkuaWR9Rm9yZWlnbktleXMgPSAke2ZrVHlwZVZhbHVlfTtgO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgRm9yZWlnbktleSBUeXBlc2AsXG4gICAgICBsaW5lczogZmtUeXBlTGluZXMsXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5jb25maWcudHPsnZggYXV0aC51c2VyLmFkZGl0aW9uYWxGaWVsZHPsl5DshJwgU29uYW11VXNlciDtg4DsnoXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyBTb3VyY2VDb2RlIHwgbnVsbCAtIGF1dGgg7ISk7KCV7J20IOyXhuycvOuptCBudWxsIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBdXRoVXNlclR5cGVTb3VyY2VDb2RlKCk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBjb25zdCBhdXRoQ29uZmlnID0gU29uYW11LmNvbmZpZy5zZXJ2ZXI/LmF1dGg7XG4gICAgaWYgKCFhdXRoQ29uZmlnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGFkZGl0aW9uYWxGaWVsZHMg7YOA7J6F7J20IOuPmeyggeyehFxuICAgIGNvbnN0IGFkZGl0aW9uYWxGaWVsZHMgPSAoYXV0aENvbmZpZyBhcyBhbnkpPy51c2VyPy5hZGRpdGlvbmFsRmllbGRzO1xuICAgIGlmICghYWRkaXRpb25hbEZpZWxkcyB8fCBPYmplY3Qua2V5cyhhZGRpdGlvbmFsRmllbGRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGFkZGl0aW9uYWxGaWVsZHPqsIAg7JeG7Jy866m0IOq4sOuzuCBVc2VyIO2DgOyeheunjCDsgqzsmqlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiBcIkF1dGggVXNlciBUeXBlXCIsXG4gICAgICAgIGxpbmVzOiBbXCJleHBvcnQgdHlwZSBTb25hbXVVc2VyID0gVXNlcjtcIl0sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gYWRkaXRpb25hbEZpZWxkc+ulvCBUeXBlU2NyaXB0IO2DgOyeheycvOuhnCDrs4DtmZhcbiAgICBjb25zdCBmaWVsZExpbmVzID0gT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbEZpZWxkcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogYmV0dGVyLWF1dGggYWRkaXRpb25hbEZpZWxkcyDqtazsobBcbiAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdmFsdWUgYXMgYW55O1xuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IGZpZWxkQ29uZmlnLnJlcXVpcmVkICE9PSBmYWxzZTtcblxuICAgICAgbGV0IGZpZWxkVHlwZTogc3RyaW5nO1xuXG4gICAgICAvLyBzb25hbXVUeXBl7J20IOyeiOycvOuptCBkZXNjcmlwdGlvbuydhCDtg4DsnoXrqoXsnLzroZwg7IKs7JqpXG4gICAgICBpZiAoZmllbGRDb25maWcuc29uYW11VHlwZSkge1xuICAgICAgICBmaWVsZFR5cGUgPSBmaWVsZENvbmZpZy5zb25hbXVUeXBlO1xuICAgICAgICBpbXBvcnRLZXlzLnB1c2goZmllbGRUeXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkVHlwZSA9IG1hcEJldHRlckF1dGhGaWVsZFR5cGUoZmllbGRDb25maWcudHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgICAke2tleX0ke2lzUmVxdWlyZWQgPyBcIlwiIDogXCI/XCJ9OiAke2ZpZWxkVHlwZX07YDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogXCJBdXRoIFVzZXIgVHlwZVwiLFxuICAgICAgbGluZXM6IFtcImV4cG9ydCB0eXBlIFNvbmFtdVVzZXIgPSBVc2VyICYge1wiLCAuLi5maWVsZExpbmVzLCBcIn07XCJdLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGF1dGgg7ISk7KCV7J20IOyeiOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGhhc0F1dGhDb25maWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhU29uYW11LmNvbmZpZy5zZXJ2ZXI/LmF1dGg7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJpbmZsZWN0aW9uIiwidW5pcXVlIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsIlRlbXBsYXRlIiwibWFwQmV0dGVyQXV0aEZpZWxkVHlwZSIsInR5cGUiLCJUZW1wbGF0ZV9fZ2VuZXJhdGVkX3NzbyIsImdldFRhcmdldEFuZFBhdGgiLCJkaXIiLCJjb25maWciLCJhcGkiLCJ0YXJnZXQiLCJwYXRoIiwicmVuZGVyIiwiZW50aXR5SWRzIiwiZ2V0QWxsSWRzIiwiZW50aXRpZXMiLCJtYXAiLCJpZCIsImdldCIsInRhcmdldEVudGl0aWVzIiwiZmlsdGVyIiwiZW50aXR5IiwicGFyZW50SWQiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJrZXlzIiwic3Vic2V0cyIsImxlbmd0aCIsInNvdXJjZUNvZGVzIiwiZmxhdE1hcCIsInN1YnNldEtleXMiLCJzdWJzZXRLZXlUeXBlTmFtZSIsIm5hbWVzIiwibW9kdWxlIiwiZW50aXR5Q2FtZWxOYW1lIiwiY2FtZWxpemUiLCJwdXJpU3Vic2V0UXVlcnkiLCJsYWJlbCIsImxpbmVzIiwic3Vic2V0S2V5IiwiZ2V0UHVyaVN1YnNldFF1ZXJ5IiwiaW1wb3J0S2V5cyIsInB1cmlMb2FkZXJRdWVyeSIsImdldFB1cmlMb2FkZXJRdWVyeSIsImZrVHlwZVNvdXJjZUNvZGUiLCJnZXRGb3JlaWduS2V5VHlwZVNvdXJjZUNvZGUiLCJwdXNoIiwiZGJTY2hlbWFTb3VyY2VDb2RlIiwiZ2V0RGF0YWJhc2VTY2hlbWFTb3VyY2VDb2RlIiwiYXV0aFVzZXJUeXBlU291cmNlQ29kZSIsImdldEF1dGhVc2VyVHlwZVNvdXJjZUNvZGUiLCJzb3VyY2VDb2RlIiwicmVkdWNlIiwicmVzdWx0IiwidHMiLCJib2R5Iiwiam9pbiIsImlzVXNpbmdNYW55VG9NYW55QmFzZVNjaGVtYSIsImluY2x1ZGVzIiwic29uYW11SW1wb3J0cyIsIkJvb2xlYW4iLCJjdXN0b21IZWFkZXJzIiwiaGFzQXV0aENvbmZpZyIsImVudGl0eVNjaGVtYUxpbmVzIiwidGFibGUiLCJqb2luVGFibGVzIiwicHJvcHMiLCJwcm9wIiwiZnJvbVRhYmxlS2V5Iiwic2luZ3VsYXJpemUiLCJ0b0VudGl0eSIsIndpdGgiLCJ0b1RhYmxlS2V5Iiwiam9pblRhYmxlIiwiZnJvbUVudGl0eUlkIiwidG9FbnRpdHlJZCIsImVudGl0aWVzV2l0aEZrIiwiZ2V0Rm9yZWlnbktleUNvbHVtbnMiLCJma01ldGFkYXRhTGluZXMiLCJjb250ZXh0RXh0ZW5kTGluZXMiLCJmcm9tRW50aXR5IiwiZnJvbVBrVHlwZSIsImdldFBrVHlwZSIsInRvUGtUeXBlIiwiaGFzSm9pbkNvbHVtbiIsIm5hbWUiLCJma1R5cGVMaW5lcyIsImZrQ29sdW1ucyIsImZrVHlwZVZhbHVlIiwiY29sIiwiYXV0aENvbmZpZyIsInNlcnZlciIsImF1dGgiLCJhZGRpdGlvbmFsRmllbGRzIiwidXNlciIsImZpZWxkTGluZXMiLCJlbnRyaWVzIiwia2V5IiwidmFsdWUiLCJmaWVsZENvbmZpZyIsImlzUmVxdWlyZWQiLCJyZXF1aXJlZCIsImZpZWxkVHlwZSIsInNvbmFtdVR5cGUiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxNQUFNLFFBQVEscUJBQVk7QUFFbkMsU0FBU0MsYUFBYSxRQUFRLGlDQUE4QjtBQUM1RCxTQUNFQywwQkFBMEIsRUFDMUJDLHdCQUF3QixFQUN4QkMsc0JBQXNCLFFBQ2pCLHVCQUFvQjtBQUMzQixTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFHdkM7O0NBRUMsR0FDRCxTQUFTQyx1QkFBdUJDLElBQVk7SUFDMUMsT0FB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
254
+ //#endregion
255
+ export { Template__generated_sso };
256
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkX3Nzby50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbInNvdXJjZUNvZGVzOiBTb3VyY2VDb2RlW10iLCJwdXJpU3Vic2V0UXVlcnk6IFNvdXJjZUNvZGUiLCJwdXJpTG9hZGVyUXVlcnk6IFNvdXJjZUNvZGUiLCJjb250ZXh0RXh0ZW5kTGluZXM6IHN0cmluZ1tdIiwiaW1wb3J0S2V5czogc3RyaW5nW10iLCJmaWVsZFR5cGU6IHN0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkX3Nzby50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyB0eXBlIFNvdXJjZUNvZGUgfSBmcm9tIFwiLi9nZW5lcmF0ZWQudGVtcGxhdGVcIjtcblxuLyoqXG4gKiBiZXR0ZXItYXV0aCBhZGRpdGlvbmFsRmllbGRz7J2YIHR5cGUg6rCS7J2EIFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIG1hcEJldHRlckF1dGhGaWVsZFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJzdHJpbmdbXVwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nW11cIjtcbiAgICBjYXNlIFwibnVtYmVyW11cIjpcbiAgICAgIHJldHVybiBcIm51bWJlcltdXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX2dlbmVyYXRlZF9zc28gZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiZ2VuZXJhdGVkX3Nzb1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgY29uc3QgeyBkaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRzYCxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChpZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoaWQpKTtcblxuICAgIC8vIFN1YnNldFF1ZXJpZXMg7IOd7ISxIOuMgOyDgTog67aA66qoIOyXlO2LsO2LsOqwgCDsl4bqs6Ag7ISc67iM7IWL7J20IOyhtOyerFxuICAgIGNvbnN0IHRhcmdldEVudGl0aWVzID0gZW50aXRpZXMuZmlsdGVyKFxuICAgICAgKGVudGl0eSkgPT4gZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIC8vIFN1YnNldFF1ZXJpZXMg7IOd7ISxXG4gICAgY29uc3Qgc291cmNlQ29kZXM6IFNvdXJjZUNvZGVbXSA9IHRhcmdldEVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKGVudGl0eS5zdWJzZXRzKTtcblxuICAgICAgY29uc3Qgc3Vic2V0S2V5VHlwZU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleWA7XG4gICAgICBjb25zdCBlbnRpdHlDYW1lbE5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eS5pZCwgdHJ1ZSk7XG5cbiAgICAgIC8vIFB1cmkg6riw67CYIFN1YnNldFF1ZXJ5XG4gICAgICBjb25zdCBwdXJpU3Vic2V0UXVlcnk6IFNvdXJjZUNvZGUgPSB7XG4gICAgICAgIGxhYmVsOiBgU3Vic2V0UXVlcnk6ICR7ZW50aXR5LmlkfWAsXG4gICAgICAgIGxpbmVzOiBbXG4gICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudGl0eUNhbWVsTmFtZX1TdWJzZXRRdWVyaWVzID0ge2AsXG4gICAgICAgICAgLi4uc3Vic2V0S2V5cy5tYXAoXG4gICAgICAgICAgICAoc3Vic2V0S2V5KSA9PiBgJHtzdWJzZXRLZXl9OiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IHtcbiAgICAgICAgICAgICR7ZW50aXR5LmdldFB1cmlTdWJzZXRRdWVyeShzdWJzZXRLZXkpfTtcbiAgICAgICAgICB9LGAsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBgfTtgLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfTtcblxuICAgICAgLy8gUHVyaSDquLDrsJggU3Vic2V0TG9hZGVyc1F1ZXJ5XG4gICAgICBjb25zdCBwdXJpTG9hZGVyUXVlcnk6IFNvdXJjZUNvZGUgPSB7XG4gICAgICAgIGxhYmVsOiBgTG9hZGVyUXVlcnk6ICR7ZW50aXR5LmlkfWAsXG4gICAgICAgIGxpbmVzOiBbXG4gICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudGl0eUNhbWVsTmFtZX1Mb2FkZXJRdWVyaWVzID0ge2AsXG4gICAgICAgICAgLi4uc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke3N1YnNldEtleX06ICR7ZW50aXR5LmdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXkpfSxgO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGB9IGFzIGNvbnN0IHNhdGlzZmllcyBQdXJpTG9hZGVyUXVlcmllczwke3N1YnNldEtleVR5cGVOYW1lfT47YCxcbiAgICAgICAgICBcIlwiLFxuICAgICAgICBdLFxuICAgICAgICBpbXBvcnRLZXlzOiBbc3Vic2V0S2V5VHlwZU5hbWVdLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFtwdXJpU3Vic2V0UXVlcnksIHB1cmlMb2FkZXJRdWVyeV07XG4gICAgfSk7XG5cbiAgICAvLyBGb3JlaWduS2V5IO2DgOyehSDsg53shLFcbiAgICBjb25zdCBma1R5cGVTb3VyY2VDb2RlID0gdGhpcy5nZXRGb3JlaWduS2V5VHlwZVNvdXJjZUNvZGUoZW50aXRpZXMpO1xuICAgIGlmIChma1R5cGVTb3VyY2VDb2RlKSB7XG4gICAgICBzb3VyY2VDb2Rlcy5wdXNoKGZrVHlwZVNvdXJjZUNvZGUpO1xuICAgIH1cblxuICAgIC8vIERhdGFiYXNlU2NoZW1hIOyDneyEsVxuICAgIGNvbnN0IGRiU2NoZW1hU291cmNlQ29kZSA9IHRoaXMuZ2V0RGF0YWJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0aWVzKTtcbiAgICBpZiAoZGJTY2hlbWFTb3VyY2VDb2RlKSB7XG4gICAgICBzb3VyY2VDb2Rlcy5wdXNoKGRiU2NoZW1hU291cmNlQ29kZSk7XG4gICAgfVxuXG4gICAgLy8gQXV0aCBVc2VyIO2DgOyehSDsg53shLFcbiAgICBjb25zdCBhdXRoVXNlclR5cGVTb3VyY2VDb2RlID0gdGhpcy5nZXRBdXRoVXNlclR5cGVTb3VyY2VDb2RlKCk7XG4gICAgaWYgKGF1dGhVc2VyVHlwZVNvdXJjZUNvZGUpIHtcbiAgICAgIHNvdXJjZUNvZGVzLnB1c2goYXV0aFVzZXJUeXBlU291cmNlQ29kZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQ29kZSA9IHNvdXJjZUNvZGVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIHRzKSA9PiB7XG4gICAgICAgIGlmICh0cyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHJlc3VsdCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZXM6IFsuLi5yZXN1bHQubGluZXMsIGAvLyAke3RzLmxhYmVsfWAsIC4uLnRzLmxpbmVzLCBcIlwiXSxcbiAgICAgICAgICBpbXBvcnRLZXlzOiB1bmlxdWUoWy4uLnJlc3VsdC5pbXBvcnRLZXlzLCAuLi50cy5pbXBvcnRLZXlzXSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2VDb2RlLmxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3QgaXNVc2luZ01hbnlUb01hbnlCYXNlU2NoZW1hID0gYm9keS5pbmNsdWRlcyhcIk1hbnlUb01hbnlCYXNlU2NoZW1hXCIpO1xuXG4gICAgY29uc3Qgc29uYW11SW1wb3J0cyA9IFtcbiAgICAgIFwiUHVyaVdyYXBwZXJcIixcbiAgICAgIFwiRGF0YWJhc2VTY2hlbWFFeHRlbmRcIixcbiAgICAgIFwiUHVyaUxvYWRlclF1ZXJpZXNcIixcbiAgICAgIGlzVXNpbmdNYW55VG9NYW55QmFzZVNjaGVtYSA/IFwiTWFueVRvTWFueUJhc2VTY2hlbWFcIiA6IFwiXCIsXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIC8vIGN1c3RvbUhlYWRlcnMg6rWs7ISxXG4gICAgY29uc3QgY3VzdG9tSGVhZGVycyA9IFtcbiAgICAgIFwiLyoqXCIsXG4gICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICBcIiAqL1wiLFxuICAgICAgYGltcG9ydCB7ICR7c29uYW11SW1wb3J0c30gfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBdO1xuICAgIGlmICh0aGlzLmhhc0F1dGhDb25maWcoKSkge1xuICAgICAgY3VzdG9tSGVhZGVycy5wdXNoKGBpbXBvcnQgdHlwZSB7IFVzZXIgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5OiBzb3VyY2VDb2RlLmxpbmVzLmpvaW4oXCJcXG5cIiksXG4gICAgICBpbXBvcnRLZXlzOiBzb3VyY2VDb2RlLmltcG9ydEtleXMsXG4gICAgICBjdXN0b21IZWFkZXJzLFxuICAgIH07XG4gIH1cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHByaXZhdGUgSGVscGVyIE1ldGhvZHNcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBwcml2YXRlIGdldERhdGFiYXNlU2NoZW1hU291cmNlQ29kZShlbnRpdGllczogRW50aXR5W10pOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKGVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRGF0YWJhc2VTY2hlbWFFeHRlbmQgLSDthYzsnbTruJQg7Iqk7YKk66eIIO2DgOyehSDsoJXsnZhcbiAgICBjb25zdCBlbnRpdHlTY2hlbWFMaW5lcyA9IGVudGl0aWVzLm1hcCgoZW50aXR5KSA9PiBgJHtlbnRpdHkudGFibGV9OiAke2VudGl0eS5pZH1CYXNlU2NoZW1hO2ApO1xuXG4gICAgY29uc3Qgam9pblRhYmxlcyA9IHVuaXF1ZShcbiAgICAgIGVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT5cbiAgICAgICAgZW50aXR5LnByb3BzLmZpbHRlcihpc01hbnlUb01hbnlSZWxhdGlvblByb3ApLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZyb21UYWJsZUtleSA9IGluZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICBjb25zdCB0b0VudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgdG9UYWJsZUtleSA9IGluZmxlY3Rpb24uc2luZ3VsYXJpemUodG9FbnRpdHkudGFibGUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWJsZTogcHJvcC5qb2luVGFibGUsXG4gICAgICAgICAgICBmcm9tVGFibGVLZXksXG4gICAgICAgICAgICB0b1RhYmxlS2V5LFxuICAgICAgICAgICAgZnJvbUVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgICAgICB0b0VudGl0eUlkOiB0b0VudGl0eS5pZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICAoam9pblRhYmxlKSA9PiBqb2luVGFibGUudGFibGUsXG4gICAgKTtcblxuICAgIC8vIERhdGFiYXNlRm9yZWlnbktleXMgLSBGSyDsu6zrn7zsnYQg6rCA7KeEIO2FjOydtOu4lOunjCDsoJXsnZhcbiAgICBjb25zdCBlbnRpdGllc1dpdGhGayA9IGVudGl0aWVzLmZpbHRlcihcbiAgICAgIChlbnRpdHkpID0+IHRoaXMuZ2V0Rm9yZWlnbktleUNvbHVtbnMoZW50aXR5KS5sZW5ndGggPiAwLFxuICAgICk7XG4gICAgY29uc3QgZmtNZXRhZGF0YUxpbmVzID0gZW50aXRpZXNXaXRoRmsubWFwKFxuICAgICAgKGVudGl0eSkgPT4gYCR7ZW50aXR5LnRhYmxlfTogJHtlbnRpdHkuaWR9Rm9yZWlnbktleXM7YCxcbiAgICApO1xuXG4gICAgLy8gQ29udGV4dEV4dGVuZCAtIGF1dGgg7ISk7KCV7J20IOyeiOydhCDrlYzrp4wgdXNlciDtg4DsnoUg7LaU6rCAXG4gICAgY29uc3QgY29udGV4dEV4dGVuZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLmhhc0F1dGhDb25maWcoKSkge1xuICAgICAgY29udGV4dEV4dGVuZExpbmVzLnB1c2goXG4gICAgICAgIGBgLFxuICAgICAgICBgICBleHBvcnQgaW50ZXJmYWNlIENvbnRleHRFeHRlbmQge2AsXG4gICAgICAgIGAgICAgdXNlcjogU29uYW11VXNlciB8IG51bGw7YCxcbiAgICAgICAgYCAgfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYERhdGFiYXNlU2NoZW1hYCxcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgIGBkZWNsYXJlIG1vZHVsZSBcInNvbmFtdVwiIHtgLFxuICAgICAgICBgICBleHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlU2NoZW1hRXh0ZW5kIHtgLFxuICAgICAgICAuLi5lbnRpdHlTY2hlbWFMaW5lcyxcbiAgICAgICAgLi4uam9pblRhYmxlcy5tYXAoKGpvaW5UYWJsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZyb21FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChqb2luVGFibGUuZnJvbUVudGl0eUlkKTtcbiAgICAgICAgICBjb25zdCB0b0VudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGpvaW5UYWJsZS50b0VudGl0eUlkKTtcbiAgICAgICAgICBjb25zdCBmcm9tUGtUeXBlID0gZnJvbUVudGl0eS5nZXRQa1R5cGUoKSA9PT0gXCJpbnRlZ2VyXCIgPyBcIm51bWJlclwiIDogXCJzdHJpbmdcIjtcbiAgICAgICAgICBjb25zdCB0b1BrVHlwZSA9IHRvRW50aXR5LmdldFBrVHlwZSgpID09PSBcImludGVnZXJcIiA/IFwibnVtYmVyXCIgOiBcInN0cmluZ1wiO1xuXG4gICAgICAgICAgcmV0dXJuIGAke2pvaW5UYWJsZS50YWJsZX06IE1hbnlUb01hbnlCYXNlU2NoZW1hPFwiJHtqb2luVGFibGUuZnJvbVRhYmxlS2V5fVwiLCBcIiR7am9pblRhYmxlLnRvVGFibGVLZXl9XCIsICR7ZnJvbVBrVHlwZX0sICR7dG9Qa1R5cGV9PjtgO1xuICAgICAgICB9KSxcbiAgICAgICAgYCAgfWAsXG4gICAgICAgIGBgLFxuICAgICAgICBgICBleHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlRm9yZWlnbktleXMge2AsXG4gICAgICAgIC4uLmZrTWV0YWRhdGFMaW5lcyxcbiAgICAgICAgYCAgfWAsXG4gICAgICAgIC4uLmNvbnRleHRFeHRlbmRMaW5lcyxcbiAgICAgICAgYH1gLFxuICAgICAgXSxcbiAgICAgIGltcG9ydEtleXM6IGVudGl0aWVzLm1hcCgoZW50aXR5KSA9PiBgJHtlbnRpdHkuaWR9QmFzZVNjaGVtYWApLFxuICAgIH07XG4gIH1cblxuICAvLyBGSyDqtIDqs4Trpbwg7Lus65+866qF7Jy866GcIOuzgO2ZmCAo7JiIOiBjb21wYW55IOKGkiBjb21wYW55X2lkKVxuICBwcml2YXRlIGdldEZvcmVpZ25LZXlDb2x1bW5zKGVudGl0eTogRW50aXR5KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKHByb3ApID0+IGAke3Byb3AubmFtZX1faWRgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9yZWlnbktleVR5cGVTb3VyY2VDb2RlKGVudGl0aWVzOiBFbnRpdHlbXSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBGS+qwgCDsnojripQg7JeU7Yuw7Yuw66eMIO2DgOyehSDsg53shLFcbiAgICBjb25zdCBlbnRpdGllc1dpdGhGayA9IGVudGl0aWVzLmZpbHRlcihcbiAgICAgIChlbnRpdHkpID0+IHRoaXMuZ2V0Rm9yZWlnbktleUNvbHVtbnMoZW50aXR5KS5sZW5ndGggPiAwLFxuICAgICk7XG5cbiAgICBpZiAoZW50aXRpZXNXaXRoRmsubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBma1R5cGVMaW5lcyA9IGVudGl0aWVzV2l0aEZrLm1hcCgoZW50aXR5KSA9PiB7XG4gICAgICBjb25zdCBma0NvbHVtbnMgPSB0aGlzLmdldEZvcmVpZ25LZXlDb2x1bW5zKGVudGl0eSk7XG4gICAgICBjb25zdCBma1R5cGVWYWx1ZSA9IGZrQ29sdW1ucy5tYXAoKGNvbCkgPT4gYFwiJHtjb2x9XCJgKS5qb2luKFwiIHwgXCIpO1xuXG4gICAgICByZXR1cm4gYGV4cG9ydCB0eXBlICR7ZW50aXR5LmlkfUZvcmVpZ25LZXlzID0gJHtma1R5cGVWYWx1ZX07YDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEZvcmVpZ25LZXkgVHlwZXNgLFxuICAgICAgbGluZXM6IGZrVHlwZUxpbmVzLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuY29uZmlnLnRz7J2YIGF1dGgudXNlci5hZGRpdGlvbmFsRmllbGRz7JeQ7IScIFNvbmFtdVVzZXIg7YOA7J6F7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMgU291cmNlQ29kZSB8IG51bGwgLSBhdXRoIOyEpOygleydtCDsl4bsnLzrqbQgbnVsbCDrsJjtmZhcbiAgICovXG4gIHByaXZhdGUgZ2V0QXV0aFVzZXJUeXBlU291cmNlQ29kZSgpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgY29uc3QgYXV0aENvbmZpZyA9IFNvbmFtdS5jb25maWcuc2VydmVyPy5hdXRoO1xuICAgIGlmICghYXV0aENvbmZpZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gYWRkaXRpb25hbEZpZWxkcyDtg4DsnoXsnbQg64+Z7KCB7J6EXG4gICAgY29uc3QgYWRkaXRpb25hbEZpZWxkcyA9IChhdXRoQ29uZmlnIGFzIGFueSk/LnVzZXI/LmFkZGl0aW9uYWxGaWVsZHM7XG4gICAgaWYgKCFhZGRpdGlvbmFsRmllbGRzIHx8IE9iamVjdC5rZXlzKGFkZGl0aW9uYWxGaWVsZHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gYWRkaXRpb25hbEZpZWxkc+qwgCDsl4bsnLzrqbQg6riw67O4IFVzZXIg7YOA7J6F66eMIOyCrOyaqVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IFwiQXV0aCBVc2VyIFR5cGVcIixcbiAgICAgICAgbGluZXM6IFtcImV4cG9ydCB0eXBlIFNvbmFtdVVzZXIgPSBVc2VyO1wiXSxcbiAgICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBhZGRpdGlvbmFsRmllbGRz66W8IFR5cGVTY3JpcHQg7YOA7J6F7Jy866GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpZWxkTGluZXMgPSBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsRmllbGRzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gYmV0dGVyLWF1dGggYWRkaXRpb25hbEZpZWxkcyDqtazsobBcbiAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdmFsdWUgYXMgYW55O1xuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IGZpZWxkQ29uZmlnLnJlcXVpcmVkICE9PSBmYWxzZTtcblxuICAgICAgbGV0IGZpZWxkVHlwZTogc3RyaW5nO1xuXG4gICAgICAvLyBzb25hbXVUeXBl7J20IOyeiOycvOuptCBkZXNjcmlwdGlvbuydhCDtg4DsnoXrqoXsnLzroZwg7IKs7JqpXG4gICAgICBpZiAoZmllbGRDb25maWcuc29uYW11VHlwZSkge1xuICAgICAgICBmaWVsZFR5cGUgPSBmaWVsZENvbmZpZy5zb25hbXVUeXBlO1xuICAgICAgICBpbXBvcnRLZXlzLnB1c2goZmllbGRUeXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkVHlwZSA9IG1hcEJldHRlckF1dGhGaWVsZFR5cGUoZmllbGRDb25maWcudHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgICAke2tleX0ke2lzUmVxdWlyZWQgPyBcIlwiIDogXCI/XCJ9OiAke2ZpZWxkVHlwZX07YDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogXCJBdXRoIFVzZXIgVHlwZVwiLFxuICAgICAgbGluZXM6IFtcImV4cG9ydCB0eXBlIFNvbmFtdVVzZXIgPSBVc2VyICYge1wiLCAuLi5maWVsZExpbmVzLCBcIn07XCJdLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGF1dGgg7ISk7KCV7J20IOyeiOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGhhc0F1dGhDb25maWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhU29uYW11LmNvbmZpZy5zZXJ2ZXI/LmF1dGg7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztVQUttQztxQkFFeUI7WUFLakM7ZUFDWTs7OztBQU12QyxTQUFTLHVCQUF1QixNQUFzQjtBQUNwRCxTQUFRLE1BQVI7RUFDRSxLQUFLLFNBQ0gsUUFBTztFQUNULEtBQUssU0FDSCxRQUFPO0VBQ1QsS0FBSyxVQUNILFFBQU87RUFDVCxLQUFLLE9BQ0gsUUFBTztFQUNULEtBQUssV0FDSCxRQUFPO0VBQ1QsS0FBSyxXQUNILFFBQU87RUFDVCxRQUNFLFFBQU87OztBQUliLElBQWEsMEJBQWIsY0FBNkMsU0FBUztDQUNwRCxjQUFjO0FBQ1osUUFBTSxnQkFBZ0I7O0NBR3hCLG1CQUFtQjtFQUNqQixNQUFNLEVBQUUsUUFBUSxPQUFPLE9BQU87QUFFOUIsU0FBTztHQUNMLFFBQVEsR0FBRyxJQUFJO0dBQ2YsTUFBTTtHQUNQOztDQUdILFNBQVM7RUFDUCxNQUFNLFlBQVksY0FBYyxXQUFXO0VBQzNDLE1BQU0sV0FBVyxVQUFVLEtBQUssT0FBTyxjQUFjLElBQUksR0FBRyxDQUFDO0VBRzdELE1BQU0saUJBQWlCLFNBQVMsUUFDN0IsV0FBVyxPQUFPLGFBQWEsYUFBYSxPQUFPLEtBQUssT0FBTyxRQUFRLENBQUMsU0FBUyxFQUNuRjtFQUdELE1BQU1BLGNBQTRCLGVBQWUsU0FBUyxXQUFXO0dBQ25FLE1BQU0sYUFB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