sonamu 0.7.53 → 0.8.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 (271) hide show
  1. package/dist/api/config.d.ts +9 -1
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +21 -1
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +159 -65
  7. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +10 -0
  8. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -0
  9. package/dist/auth/plugins/entity-definitions/anonymous.js +23 -0
  10. package/dist/auth/plugins/entity-definitions/api-key.d.ts +9 -0
  11. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -0
  12. package/dist/auth/plugins/entity-definitions/api-key.js +199 -0
  13. package/dist/auth/plugins/entity-definitions/index.d.ts +6 -0
  14. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  15. package/dist/auth/plugins/entity-definitions/index.js +20 -2
  16. package/dist/auth/plugins/entity-definitions/jwt.d.ts +9 -0
  17. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -0
  18. package/dist/auth/plugins/entity-definitions/jwt.js +67 -0
  19. package/dist/auth/plugins/entity-definitions/organization.d.ts +9 -0
  20. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -0
  21. package/dist/auth/plugins/entity-definitions/organization.js +424 -0
  22. package/dist/auth/plugins/entity-definitions/passkey.d.ts +10 -0
  23. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -0
  24. package/dist/auth/plugins/entity-definitions/passkey.js +129 -0
  25. package/dist/auth/plugins/entity-definitions/sso.d.ts +10 -0
  26. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -0
  27. package/dist/auth/plugins/entity-definitions/sso.js +110 -0
  28. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  29. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  30. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  31. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  32. package/dist/auth/plugins/wrappers/admin.js +2 -4
  33. package/dist/auth/plugins/wrappers/anonymous.d.ts +18 -0
  34. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -0
  35. package/dist/auth/plugins/wrappers/anonymous.js +26 -0
  36. package/dist/auth/plugins/wrappers/api-key.d.ts +18 -0
  37. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -0
  38. package/dist/auth/plugins/wrappers/api-key.js +38 -0
  39. package/dist/auth/plugins/wrappers/index.d.ts +6 -0
  40. package/dist/auth/plugins/wrappers/index.d.ts.map +1 -1
  41. package/dist/auth/plugins/wrappers/index.js +7 -1
  42. package/dist/auth/plugins/wrappers/jwt.d.ts +18 -0
  43. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -0
  44. package/dist/auth/plugins/wrappers/jwt.js +30 -0
  45. package/dist/auth/plugins/wrappers/organization.d.ts +18 -0
  46. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -0
  47. package/dist/auth/plugins/wrappers/organization.js +67 -0
  48. package/dist/auth/plugins/wrappers/passkey.d.ts +18 -0
  49. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -0
  50. package/dist/auth/plugins/wrappers/passkey.js +32 -0
  51. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  52. package/dist/auth/plugins/wrappers/phone-number.js +2 -4
  53. package/dist/auth/plugins/wrappers/sso.d.ts +853 -0
  54. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -0
  55. package/dist/auth/plugins/wrappers/sso.js +36 -0
  56. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  57. package/dist/auth/plugins/wrappers/two-factor.js +2 -4
  58. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  59. package/dist/auth/plugins/wrappers/username.js +2 -4
  60. package/dist/bin/build-config.d.ts +2 -2
  61. package/dist/bin/build-config.js +6 -7
  62. package/dist/bin/cli.js +417 -32
  63. package/dist/bin/fixture.d.ts +27 -0
  64. package/dist/bin/fixture.d.ts.map +1 -0
  65. package/dist/bin/fixture.js +245 -0
  66. package/dist/cache/decorator.d.ts +4 -3
  67. package/dist/cache/decorator.d.ts.map +1 -1
  68. package/dist/cache/decorator.js +5 -4
  69. package/dist/cone/cone-generator.d.ts +33 -0
  70. package/dist/cone/cone-generator.d.ts.map +1 -0
  71. package/dist/cone/cone-generator.js +286 -0
  72. package/dist/database/_batch_update.d.ts.map +1 -1
  73. package/dist/database/_batch_update.js +16 -2
  74. package/dist/database/puri-subset.test-d.js +1 -1
  75. package/dist/database/puri-subset.types.d.ts +1 -1
  76. package/dist/database/puri-subset.types.d.ts.map +1 -1
  77. package/dist/database/puri-subset.types.js +1 -1
  78. package/dist/database/puri.d.ts +4 -0
  79. package/dist/database/puri.d.ts.map +1 -1
  80. package/dist/database/puri.js +20 -2
  81. package/dist/database/upsert-builder.d.ts.map +1 -1
  82. package/dist/database/upsert-builder.js +19 -3
  83. package/dist/dict/en.d.ts +15 -0
  84. package/dist/dict/en.d.ts.map +1 -1
  85. package/dist/dict/en.js +2 -1
  86. package/dist/dict/ko.d.ts +15 -0
  87. package/dist/dict/ko.d.ts.map +1 -1
  88. package/dist/dict/ko.js +2 -1
  89. package/dist/dict/rc-keys.d.ts +28 -0
  90. package/dist/dict/rc-keys.d.ts.map +1 -1
  91. package/dist/dict/rc-keys.js +31 -1
  92. package/dist/dict/sd.d.ts.map +1 -1
  93. package/dist/dict/sd.js +20 -4
  94. package/dist/entity/entity-manager.d.ts +298 -2
  95. package/dist/entity/entity-manager.d.ts.map +1 -1
  96. package/dist/entity/entity-manager.js +4 -1
  97. package/dist/entity/entity-template-cone.d.ts +14 -0
  98. package/dist/entity/entity-template-cone.d.ts.map +1 -0
  99. package/dist/entity/entity-template-cone.js +222 -0
  100. package/dist/entity/entity.d.ts +47 -2
  101. package/dist/entity/entity.d.ts.map +1 -1
  102. package/dist/entity/entity.js +161 -14
  103. package/dist/ssr/renderer.js +3 -3
  104. package/dist/syncer/api-parser.js +12 -1
  105. package/dist/syncer/checksum.d.ts +0 -14
  106. package/dist/syncer/checksum.d.ts.map +1 -1
  107. package/dist/syncer/checksum.js +1 -23
  108. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  109. package/dist/syncer/syncer-actions.js +8 -2
  110. package/dist/syncer/syncer.d.ts +1 -1
  111. package/dist/syncer/syncer.d.ts.map +1 -1
  112. package/dist/syncer/syncer.js +17 -10
  113. package/dist/tasks/workflow-manager.d.ts +13 -1
  114. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  115. package/dist/tasks/workflow-manager.js +18 -1
  116. package/dist/template/entity-converter.js +4 -4
  117. package/dist/template/helpers.d.ts +10 -0
  118. package/dist/template/helpers.d.ts.map +1 -1
  119. package/dist/template/helpers.js +48 -1
  120. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  121. package/dist/template/implementations/entry-server.template.js +7 -2
  122. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  123. package/dist/template/implementations/generated.template.js +5 -1
  124. package/dist/template/implementations/generated_http.template.d.ts +1 -0
  125. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  126. package/dist/template/implementations/generated_http.template.js +6 -2
  127. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  128. package/dist/template/implementations/generated_sso.template.js +29 -8
  129. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  130. package/dist/template/implementations/queries.template.js +9 -1
  131. package/dist/template/implementations/sd.template.d.ts +1 -1
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +28 -4
  134. package/dist/template/implementations/services.template.d.ts.map +1 -1
  135. package/dist/template/implementations/services.template.js +12 -12
  136. package/dist/template/implementations/view_form.template.d.ts +11 -7
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_form.template.js +97 -87
  139. package/dist/template/implementations/view_list.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  141. package/dist/template/implementations/view_list.template.js +115 -109
  142. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  143. package/dist/template/implementations/view_search_input.template.js +18 -14
  144. package/dist/template/zod-converter.d.ts.map +1 -1
  145. package/dist/template/zod-converter.js +95 -7
  146. package/dist/testing/_relation-graph.js +1 -1
  147. package/dist/testing/data-explorer.d.ts +61 -0
  148. package/dist/testing/data-explorer.d.ts.map +1 -0
  149. package/dist/testing/data-explorer.js +274 -0
  150. package/dist/testing/faker-mappings.d.ts +20 -0
  151. package/dist/testing/faker-mappings.d.ts.map +1 -0
  152. package/dist/testing/faker-mappings.js +421 -0
  153. package/dist/testing/fixture-generator.d.ts +161 -0
  154. package/dist/testing/fixture-generator.d.ts.map +1 -0
  155. package/dist/testing/fixture-generator.js +954 -0
  156. package/dist/testing/fixture-manager.d.ts +6 -1
  157. package/dist/testing/fixture-manager.d.ts.map +1 -1
  158. package/dist/testing/fixture-manager.js +72 -4
  159. package/dist/testing/index.d.ts +3 -0
  160. package/dist/testing/index.d.ts.map +1 -1
  161. package/dist/testing/index.js +4 -1
  162. package/dist/types/types.d.ts +1520 -26
  163. package/dist/types/types.d.ts.map +1 -1
  164. package/dist/types/types.js +136 -22
  165. package/dist/ui/ai-client.d.ts.map +1 -1
  166. package/dist/ui/ai-client.js +9 -4
  167. package/dist/ui/api.d.ts.map +1 -1
  168. package/dist/ui/api.js +303 -24
  169. package/dist/ui-web/assets/index-CsUr-_pV.js +254 -0
  170. package/dist/ui-web/assets/index-T42zzs1K.css +1 -0
  171. package/dist/ui-web/index.html +2 -2
  172. package/dist/utils/fs-utils.d.ts +2 -1
  173. package/dist/utils/fs-utils.d.ts.map +1 -1
  174. package/dist/utils/fs-utils.js +14 -3
  175. package/package.json +19 -11
  176. package/src/api/config.ts +12 -1
  177. package/src/api/sonamu.ts +179 -65
  178. package/src/auth/plugins/entity-definitions/anonymous.ts +17 -0
  179. package/src/auth/plugins/entity-definitions/api-key.ts +93 -0
  180. package/src/auth/plugins/entity-definitions/index.ts +18 -0
  181. package/src/auth/plugins/entity-definitions/jwt.ts +35 -0
  182. package/src/auth/plugins/entity-definitions/organization.ts +215 -0
  183. package/src/auth/plugins/entity-definitions/passkey.ts +64 -0
  184. package/src/auth/plugins/entity-definitions/sso.ts +62 -0
  185. package/src/auth/plugins/entity-definitions/types.ts +11 -1
  186. package/src/auth/plugins/wrappers/admin.ts +1 -3
  187. package/src/auth/plugins/wrappers/anonymous.ts +30 -0
  188. package/src/auth/plugins/wrappers/api-key.ts +42 -0
  189. package/src/auth/plugins/wrappers/index.ts +6 -0
  190. package/src/auth/plugins/wrappers/jwt.ts +34 -0
  191. package/src/auth/plugins/wrappers/organization.ts +73 -0
  192. package/src/auth/plugins/wrappers/passkey.ts +36 -0
  193. package/src/auth/plugins/wrappers/phone-number.ts +1 -3
  194. package/src/auth/plugins/wrappers/sso.ts +40 -0
  195. package/src/auth/plugins/wrappers/two-factor.ts +1 -3
  196. package/src/auth/plugins/wrappers/username.ts +1 -3
  197. package/src/bin/build-config.ts +6 -6
  198. package/src/bin/cli.ts +452 -31
  199. package/src/bin/fixture.ts +302 -0
  200. package/src/cache/decorator.ts +4 -3
  201. package/src/cone/cone-generator.ts +363 -0
  202. package/src/database/_batch_update.ts +11 -0
  203. package/src/database/puri-subset.test-d.ts +13 -13
  204. package/src/database/puri-subset.types.ts +1 -1
  205. package/src/database/puri.ts +43 -1
  206. package/src/database/upsert-builder.ts +16 -2
  207. package/src/dict/en.ts +1 -0
  208. package/src/dict/ko.ts +1 -0
  209. package/src/dict/rc-keys.ts +32 -0
  210. package/src/dict/sd.ts +23 -3
  211. package/src/entity/entity-manager.ts +4 -0
  212. package/src/entity/entity-template-cone.ts +298 -0
  213. package/src/entity/entity.ts +189 -13
  214. package/src/shared/app.shared.ts.txt +5 -0
  215. package/src/shared/web.shared.ts.txt +9 -5
  216. package/src/skills/project/README.md +21 -0
  217. package/src/skills/project/architecture.md +373 -0
  218. package/src/skills/project/business-logic.md +270 -0
  219. package/src/skills/project/requirements.md +160 -0
  220. package/src/skills/sonamu/SKILL.md +168 -3
  221. package/src/skills/sonamu/api.md +102 -0
  222. package/src/skills/sonamu/database.md +220 -1
  223. package/src/skills/sonamu/entity-relations.md +89 -1
  224. package/src/skills/sonamu/fixture-cli.md +501 -0
  225. package/src/skills/sonamu/frontend.md +214 -0
  226. package/src/skills/sonamu/i18n.md +95 -0
  227. package/src/skills/sonamu/model.md +153 -0
  228. package/src/skills/sonamu/project-init.md +178 -8
  229. package/src/skills/sonamu/scaffolding.md +112 -0
  230. package/src/skills/sonamu/subset.md +9 -3
  231. package/src/skills/sonamu/testing.md +287 -2
  232. package/src/skills/sonamu/workflow.md +70 -5
  233. package/src/ssr/renderer.ts +2 -2
  234. package/src/syncer/api-parser.ts +12 -0
  235. package/src/syncer/checksum.ts +0 -38
  236. package/src/syncer/syncer-actions.ts +7 -1
  237. package/src/syncer/syncer.ts +16 -5
  238. package/src/tasks/workflow-manager.ts +29 -8
  239. package/src/template/entity-converter.ts +3 -3
  240. package/src/template/helpers.ts +49 -0
  241. package/src/template/implementations/entry-server.template.ts +1 -1
  242. package/src/template/implementations/generated.template.ts +4 -0
  243. package/src/template/implementations/generated_http.template.ts +1 -0
  244. package/src/template/implementations/generated_sso.template.ts +40 -11
  245. package/src/template/implementations/queries.template.ts +8 -0
  246. package/src/template/implementations/sd.template.ts +22 -3
  247. package/src/template/implementations/services.template.ts +11 -10
  248. package/src/template/implementations/view_form.template.ts +111 -101
  249. package/src/template/implementations/view_list.template.ts +120 -119
  250. package/src/template/implementations/view_search_input.template.ts +17 -13
  251. package/src/template/zod-converter.ts +103 -6
  252. package/src/testing/_relation-graph.ts +1 -1
  253. package/src/testing/data-explorer.ts +427 -0
  254. package/src/testing/faker-mappings.ts +434 -0
  255. package/src/testing/fixture-generator.ts +1166 -0
  256. package/src/testing/fixture-manager.ts +91 -6
  257. package/src/testing/index.ts +3 -0
  258. package/src/types/types.ts +222 -26
  259. package/src/ui/ai-client.ts +9 -1
  260. package/src/ui/api.ts +429 -23
  261. package/src/utils/fs-utils.ts +14 -1
  262. package/dist/template/implementations/view_enums_select.template.d.ts +0 -17
  263. package/dist/template/implementations/view_enums_select.template.d.ts.map +0 -1
  264. package/dist/template/implementations/view_enums_select.template.js +0 -62
  265. package/dist/template/implementations/view_id_async_select.template.d.ts +0 -17
  266. package/dist/template/implementations/view_id_async_select.template.d.ts.map +0 -1
  267. package/dist/template/implementations/view_id_async_select.template.js +0 -125
  268. package/dist/ui-web/assets/index-Bd_2AkLb.css +0 -1
  269. package/dist/ui-web/assets/index-BpSbhQWo.js +0 -225
  270. package/src/template/implementations/view_enums_select.template.ts +0 -65
  271. package/src/template/implementations/view_id_async_select.template.ts +0 -139
@@ -212,18 +212,13 @@ ${functions.join("\n\n")}
212
212
  // resourceName에서 hook 이름 생성 (기존 로직과 동일)
213
213
  const hookName = inflection.camelize(assertDefined(listApi.options.resourceName), true);
214
214
  const useHookName = `use${inflection.camelize(hookName)}`;
215
+ // ListParams 타입명 구성
216
+ const listParamsType = `${names.capital}ListParams`;
215
217
  asyncIdConfigs.push(`
216
218
  // AsyncIdConfig: ${names.capital}
217
- export const ${names.capital}AsyncIdConfig = {
218
- useList: ${names.capital}Service.${useHookName} as (
219
- subset: string,
220
- params?: Record<string, unknown>,
221
- options?: { enabled?: boolean }
222
- ) => {
223
- data?: { rows: Record<string, unknown>[] };
224
- isLoading: boolean;
225
- error?: Error;
226
- },
219
+ export const ${names.capital}AsyncIdConfig: AsyncIdConfig<${names.capital}SubsetKey, ${names.capital}SubsetMapping, ${listParamsType}> = {
220
+ placeholderKey: "entity.${names.capital}",
221
+ useList: ${names.capital}Service.${useHookName},
227
222
  };
228
223
  `.trim());
229
224
  }
@@ -255,16 +250,21 @@ export const ${names.capital}AsyncIdConfig = {
255
250
  ...Object.keys(BUILT_IN_TYPES)
256
251
  ]),
257
252
  customHeaders: [
253
+ "/**",
254
+ " * @generated",
255
+ " * 직접 수정하지 마세요.",
256
+ " */",
258
257
  "/** biome-ignore-all lint: generated는 무시 */",
259
258
  "/** biome-ignore-all assist: generated는 무시 */",
260
259
  "",
261
260
  `import { queryOptions, useQuery, useMutation, type UseMutationOptions } from '@tanstack/react-query';`,
262
261
  `import type { AxiosProgressEvent } from 'axios';`,
263
262
  `import qs from 'qs';`,
264
- `import { ${sonamuSharedImports} } from './sonamu.shared';`
263
+ `import { ${sonamuSharedImports} } from './sonamu.shared';`,
264
+ `import type { AsyncIdConfig } from '@sonamu-kit/react-components/components';`
265
265
  ]
266
266
  };
267
267
  }
268
268
  }
269
269
 
270
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvc2VydmljZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGRpZmYsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQge1xuICBhcGlQYXJhbVRvVHNDb2RlLFxuICBhcGlQYXJhbVR5cGVUb1RzVHlwZSxcbiAgdW53cmFwUHJvbWlzZU9uY2UsXG59IGZyb20gXCIuLi8uLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uLy4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9UWVBFUywgem9kVHlwZVRvVHNUeXBlRGVmIH0gZnJvbSBcIi4uL3pvZC1jb252ZXJ0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZXJ2aWNlcyBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZXJ2aWNlc1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogXCI6dGFyZ2V0L3NyYy9zZXJ2aWNlc1wiLFxuICAgICAgcGF0aDogYHNlcnZpY2VzLmdlbmVyYXRlZC50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7fTogVGVtcGxhdGVPcHRpb25zW1wic2VydmljZXNcIl0pIHtcbiAgICBjb25zdCB7IGFwaXMgfSA9IFNvbmFtdS5zeW5jZXI7XG5cbiAgICAvLyDrqqjrjbjrs4TroZwg6re466O57ZmUXG4gICAgY29uc3QgYXBpc0J5TW9kZWwgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5kZWRBcGlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiBhcGlzKSB7XG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSBhcGkubW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpO1xuICAgICAgaWYgKCFhcGlzQnlNb2RlbC5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgICBhcGlzQnlNb2RlbC5zZXQobW9kZWxOYW1lLCBbXSk7XG4gICAgICB9XG4gICAgICBhcGlzQnlNb2RlbC5nZXQobW9kZWxOYW1lKT8ucHVzaChhcGkpO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgdHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIG1vZGVsQXBpc10gb2YgYXBpc0J5TW9kZWwpIHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgbW9kZWxBcGlzKSB7XG4gICAgICAgIC8vIEBzdHJlYW0g642w7L2U66CI7J207YSw6rCAIOyeiOycvOuptCBTU0Ug7Iqk7Yq466a8IO2VqOyImCDsg53shLFcbiAgICAgICAgaWYgKGFwaS5zdHJlYW1PcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgPT09IHRydWUgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgICAgY29uc3QgbWV0aG9kTmFtZVN0cmVhbSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgICAgOiBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKX1gO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWVTdHJlYW0sIHRydWUpO1xuXG4gICAgICAgICAgY29uc3QgZXZlbnRzVHlwZURlZiA9IHpvZFR5cGVUb1RzVHlwZURlZihhcGkuc3RyZWFtT3B0aW9ucy5ldmVudHMpO1xuXG4gICAgICAgICAgLy8g7YyM652866+47YSw66W8IOqwneyytCDtmJXtg5zroZwg7KCV7J2YICjtg4DsnoXqs7wg7Iuk7KCcIOqwkiDrqqjrkZDsl5Ag7IKs7JqpKVxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIGltcG9ydEtleXMpfWApLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInt9XCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBmdW5jdGlvbiAke21ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWR9KFxuICBwYXJhbXM6ICR7cGFyYW1zRGVmQXNPYmplY3R9LFxuICBoYW5kbGVyczogRXZlbnRIYW5kbGVyczwke2V2ZW50c1R5cGVEZWZ9ICYgeyBlbmQ/OiAoKSA9PiB2b2lkIH0+LFxuICBvcHRpb25zOiBTU0VTdHJlYW1PcHRpb25zXG4pIHtcbiAgcmV0dXJuIHVzZVNTRVN0cmVhbTwke2V2ZW50c1R5cGVEZWZ9PihcXGAke2FwaUJhc2VVcmx9XFxgLCBwYXJhbXMsIGhhbmRsZXJzLCBvcHRpb25zKTtcbn1cbiAgICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZXh0IOygnOyZuO2VnCDtjIzrnbzrr7jthLBcbiAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgIUFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkgJiZcbiAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsID09PSB0cnVlICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIO2DgOyehSDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPSBhcGkudHlwZVBhcmFtZXRlcnNcbiAgICAgICAgICAubWFwKCh0eXBlUGFyYW0pID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGVQYXJhbSwgaW1wb3J0S2V5cykpXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtc0RlZiA9IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPyBgPCR7dHlwZVBhcmFtZXRlcnNBc1RzVHlwZX0+YCA6IFwiXCI7XG4gICAgICAgIHR5cGVQYXJhbU5hbWVzID0gdHlwZVBhcmFtTmFtZXMuY29uY2F0KGFwaS50eXBlUGFyYW1ldGVycy5tYXAoKHRwKSA9PiB0cC5pZCkpO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgcGFyYW1zRGVmID0gYXBpUGFyYW1Ub1RzQ29kZShwYXJhbXNXaXRob3V0Q29udGV4dCwgaW1wb3J0S2V5cyk7XG4gICAgICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vIOumrO2EtCDtg4DsnoUg7KCV7J2YXG4gICAgICAgIGNvbnN0IHJldHVyblR5cGVEZWYgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICBhc3NlcnREZWZpbmVkKHVud3JhcFByb21pc2VPbmNlKGFwaS5yZXR1cm5UeXBlKSksXG4gICAgICAgICAgaW1wb3J0S2V5cyxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDquLDrs7ggVVJMXG4gICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgIGNvbnN0IGNsaWVudHMgPSBhcGkub3B0aW9ucy5jbGllbnRzIHx8IFtdO1xuXG4gICAgICAgIC8vIDEuIGF4aW9zIO2VqOyImCDsg53shLFcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOyeiOycvOuptCBnZXQgKyByZXNvdXJjZU5hbWUg7ZiV7YOc66GcIO2VqOyImOuqhSDsg53shLFcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgID8gYGdldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICA6IGFwaS5tZXRob2ROYW1lO1xuXG4gICAgICAgIC8vIGF4aW9zLW11bHRpcGFydCDsspjrpqwgKO2MjOydvCDsl4XroZzrk5wpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwiYXhpb3MtbXVsdGlwYXJ0XCIpKSB7XG4gICAgICAgICAgY29uc3QgZm9ybURhdGFBcHBlbmQgPSBgZmlsZXMuZm9yRWFjaChmID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZik7IH0pO2A7XG5cbiAgICAgICAgICBjb25zdCBvdGhlclBhcmFtc0FwcGVuZCA9IHBhcmFtc1dpdGhvdXRDb250ZXh0XG4gICAgICAgICAgICAubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAvLyBwcmltaXRpdmUg7YOA7J6F7J247KeAIOyytO2BrFxuICAgICAgICAgICAgICBjb25zdCBpc1ByaW1pdGl2ZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHBhcmFtLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdLmluY2x1ZGVzKHBhcmFtLnR5cGUpO1xuXG4gICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSkge1xuICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZTog7KeB7KCRIGZvcm1EYXRhLmFwcGVuZFxuICAgICAgICAgICAgICAgIHJldHVybiBgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgU3RyaW5nKCR7cGFyYW0ubmFtZX0pKTtgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG9iamVjdDogdG9Gb3JtRGF0YSDsgqzsmqlcbiAgICAgICAgICAgICAgICByZXR1cm4gYHRvRm9ybURhdGEoJHtwYXJhbS5uYW1lfSwgZm9ybURhdGEsICcke3BhcmFtLm5hbWV9Jyk7YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXFxuICAgIFwiKTtcblxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkNvbW1hID0gcGFyYW1zRGVmICE9PSBcIlwiID8gXCIsIFwiIDogXCJcIjtcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWV9JHt0eXBlUGFyYW1zRGVmfShcbiAgJHtwYXJhbXNEZWZ9JHtwYXJhbXNEZWZDb21tYX1cbiAgZmlsZXM6IEZpbGVbXSxcbiAgb25VcGxvYWRQcm9ncmVzcz86IChwZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkXG4pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgJHtmb3JtRGF0YUFwcGVuZH1cbiAgJHtvdGhlclBhcmFtc0FwcGVuZH1cbiAgcmV0dXJuIGZldGNoKHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB1cmw6IFxcYCR7YXBpQmFzZVVybH1cXGAsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIsXG4gICAgfSxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgIGNvbnN0IGhhc1BhcmFtcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfSR7aGFzUGFyYW1zID8gYD9cXCR7cXMuc3RyaW5naWZ5KHsgJHtwYXJhbU5hbWVzfSB9KX1gIDogXCJcIn1cXGAsXG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBoYXNQYXJhbXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogXCIke2FwaS5vcHRpb25zLmh0dHBNZXRob2R9XCIsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgICR7aGFzUGFyYW1zID8gYGRhdGE6IHsgJHtwYXJhbU5hbWVzfSB9LGAgOiBcIlwifVxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBxdWVyeU9wdGlvbnMgKyB1c2VRdWVyeSAodGFuc3RhY2stcXVlcnkpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSwgdHJ1ZSlcbiAgICAgICAgICAgIDogaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBxdWVyeU9wdGlvbnNcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pID0+IHF1ZXJ5T3B0aW9ucyh7XG4gIHF1ZXJ5S2V5OiBbJyR7bW9kZWxOYW1lfScsICcke21ldGhvZE5hbWV9JyR7cGFyYW1OYW1lcyA/IGAsICR7cGFyYW1OYW1lc31gIDogXCJcIn1dLFxuICBxdWVyeUZuOiAoKSA9PiAke21ldGhvZE5hbWV9KCR7cGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXNlUXVlcnkgaG9va1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0IHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShob29rTmFtZSl9ID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0ke1xuICAgICAgICAgICAgICBwYXJhbXNEZWYgPyBcIiwgXCIgOiBcIlwiXG4gICAgICAgICAgICB9b3B0aW9ucz86IHsgZW5hYmxlZD86IGJvb2xlYW4gfSkgPT5cbiAgdXNlUXVlcnkoe1xuICAgIC4uLiR7bWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMoJHtwYXJhbU5hbWVzfSksXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gdXNlTXV0YXRpb24gKHRhbnN0YWNrLW11dGF0aW9uKVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLW11dGF0aW9uXCIpKSB7XG4gICAgICAgICAgY29uc3QgaG9va05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKTtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvblBhcmFtVHlwZSA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dFxuICAgICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIFtdKX1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInZvaWRcIjtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvblBhcmFtTmFtZXMgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IHBhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYHBhcmFtcy4ke3AubmFtZX1gKS5qb2luKFwiLCBcIilcbiAgICAgICAgICAgICAgOiBcIlwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgdXNlJHtob29rTmFtZX1NdXRhdGlvbiA9ICR7dHlwZVBhcmFtc0RlZn0oKSA9PiB1c2VNdXRhdGlvbih7XG4gIG11dGF0aW9uRm46IChwYXJhbXM6ICR7bXV0YXRpb25QYXJhbVR5cGV9KSA9PiAke21ldGhvZE5hbWV9KCR7bXV0YXRpb25QYXJhbU5hbWVzfSlcbn0pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiB1c2VNdXRhdGlvbiB3aXRoIG11bHRpcGFydCAodGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0KVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLW11dGF0aW9uLW11bHRpcGFydFwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSk7XG5cbiAgICAgICAgICAvLyDtjIzrnbzrr7jthLAg7YOA7J6FIOygleydmDogcGFyYW1zRGVm7JeQ7IScIO2DgOyeheunjCDstpTstpxcbiAgICAgICAgICAvLyBwYXJhbXNEZWYg7JiIOiBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgY29uc3QgcGFyYW1zVHlwZURlZiA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyYW1zRGVmXG4gICAgICAgICAgICAgICAgICAuc3BsaXQoXCI6XCIpXG4gICAgICAgICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiOlwiKVxuICAgICAgICAgICAgICAgICAgLnRyaW0oKSAvLyBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyBwYXJhbXM6ICR7cGFyYW1zVHlwZURlZn0sIGZpbGVzOiBGaWxlW10gfWBcbiAgICAgICAgICAgICAgOiBgeyBmaWxlczogRmlsZVtdIH1gO1xuXG4gICAgICAgICAgLy8gbXV0YXRpb25GbiDtmLjstpwg7YyM652866+47YSwXG4gICAgICAgICAgY29uc3QgbXV0YXRpb25GbkNhbGwgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGAke21ldGhvZE5hbWV9KHBhcmFtcy5wYXJhbXMsIHBhcmFtcy5maWxlcylgXG4gICAgICAgICAgICAgIDogYCR7bWV0aG9kTmFtZX0ocGFyYW1zLmZpbGVzKWA7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfShcbiAgb3B0aW9ucz86IFVzZU11dGF0aW9uT3B0aW9uczwke3JldHVyblR5cGVEZWZ9LCBFcnJvciwgJHttdXRhdGlvblBhcmFtVHlwZX0+ICYge1xuICAgIG9uVXBsb2FkUHJvZ3Jlc3M/OiAoZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuICB9XG4pID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bXV0YXRpb25GbkNhbGx9LFxuICByZXRyeTogZmFsc2UsXG4gIC4uLm9wdGlvbnMsXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hbWVzcGFjZXMucHVzaChcbiAgICAgICAgYFxuZXhwb3J0IG5hbWVzcGFjZSAke21vZGVsTmFtZX1TZXJ2aWNlIHtcbiR7ZnVuY3Rpb25zLmpvaW4oXCJcXG5cXG5cIil9XG59XG4gICAgICBgLnRyaW0oKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQXN5bmNJZENvbmZpZyDsg53shLEgKEVudGl0eeuzhOuhnClcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGFzeW5jSWRDb25maWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIHVzZUxpc3Qg66mU7ISc65Oc66W8IOqwgOynhCBBUEkg7LC+6riwICjrs7XsiJjtmJUgcmVzb3VyY2VOYW1l7J2EIOqwgOynhCDqsoMpXG4gICAgICBjb25zdCBsaXN0QXBpID0gYXBpc0J5TW9kZWwuZ2V0KG5hbWVzLmNhcGl0YWwpPy5maW5kKChhcGkpID0+IHtcbiAgICAgICAgaWYgKCFhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUgfHwgIWFwaS5vcHRpb25zLmNsaWVudHM/LmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleyduOyngCDtmZXsnbggKGxpc3QgQVBJ64qUIOuzteyImO2YlSDsgqzsmqkpXG4gICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZTtcbiAgICAgICAgcmV0dXJuIGluZmxlY3Rpb24ucGx1cmFsaXplKHJlc291cmNlTmFtZSkgPT09IHJlc291cmNlTmFtZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobGlzdEFwaSkge1xuICAgICAgICAvLyByZXNvdXJjZU5hbWXsl5DshJwgaG9vayDsnbTrpoQg7IOd7ISxICjquLDsobQg66Gc7KeB6rO8IOuPmeydvClcbiAgICAgICAgY29uc3QgaG9va05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFzc2VydERlZmluZWQobGlzdEFwaS5vcHRpb25zLnJlc291cmNlTmFtZSksIHRydWUpO1xuICAgICAgICBjb25zdCB1c2VIb29rTmFtZSA9IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfWA7XG5cbiAgICAgICAgYXN5bmNJZENvbmZpZ3MucHVzaChcbiAgICAgICAgICBgXG4vLyBBc3luY0lkQ29uZmlnOiAke25hbWVzLmNhcGl0YWx9XG5leHBvcnQgY29uc3QgJHtuYW1lcy5jYXBpdGFsfUFzeW5jSWRDb25maWcgPSB7XG4gIHVzZUxpc3Q6ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLiR7dXNlSG9va05hbWV9IGFzIChcbiAgICBzdWJzZXQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBvcHRpb25zPzogeyBlbmFibGVkPzogYm9vbGVhbiB9XG4gICkgPT4ge1xuICAgIGRhdGE/OiB7IHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gfTtcbiAgICBpc0xvYWRpbmc6IGJvb2xlYW47XG4gICAgZXJyb3I/OiBFcnJvcjtcbiAgfSxcbn07XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQlVJTFRfSU5fVFlQRVPsl5DshJwg7IKs7Jqp65CY64qUIO2DgOyeheuTpOydhCDtmZXsnbjtlZjsl6wg64+Z7KCB7Jy866GcIGltcG9ydCDqtazshLFcbiAgICBjb25zdCBidWlsdEluVHlwZUltcG9ydHMgPSBPYmplY3Qua2V5cyhCVUlMVF9JTl9UWVBFUylcbiAgICAgIC5maWx0ZXIoKHR5cGVLZXkpID0+IGltcG9ydEtleXMuaW5jbHVkZXModHlwZUtleSkpXG4gICAgICAubWFwKCh0eXBlS2V5KSA9PiBgdHlwZSAke3R5cGVLZXl9YCk7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVk7JeQ7IScIGltcG9ydO2VoCDtla3rqqnrk6TsnYQg64+Z7KCB7Jy866GcIOq1rOyEsVxuICAgIGNvbnN0IHNvbmFtdVNoYXJlZEltcG9ydHMgPSBbXG4gICAgICBcInR5cGUgTGlzdFJlc3VsdFwiLFxuICAgICAgXCJ0eXBlIEZpbHRlclF1ZXJ5XCIsXG4gICAgICAuLi5idWlsdEluVHlwZUltcG9ydHMsXG4gICAgICBcImZldGNoXCIsXG4gICAgICBcInR5cGUgRXZlbnRIYW5kbGVyc1wiLFxuICAgICAgXCJ0eXBlIFNTRVN0cmVhbU9wdGlvbnNcIixcbiAgICAgIFwidXNlU1NFU3RyZWFtXCIsXG4gICAgICBcInRvRm9ybURhdGFcIixcbiAgICBdLmpvaW4oXCIsIFwiKTtcblxuICAgIC8vIGJvZHkg6rWs7ISxOiBuYW1lc3BhY2VzICsgYXN5bmNJZENvbmZpZ3NcbiAgICBjb25zdCBib2R5UGFydHMgPSBbLi4ubmFtZXNwYWNlcywgLi4uYXN5bmNJZENvbmZpZ3NdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogYm9keVBhcnRzLmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICBpbXBvcnRLZXlzOiBkaWZmKHVuaXF1ZShpbXBvcnRLZXlzKSwgW1xuICAgICAgICAuLi50eXBlUGFyYW1OYW1lcyxcbiAgICAgICAgXCJMaXN0UmVzdWx0XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKEJVSUxUX0lOX1RZUEVTKSxcbiAgICAgIF0pLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCIvKiogYmlvbWUtaWdub3JlLWFsbCBhc3Npc3Q6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgYGltcG9ydCB7IHF1ZXJ5T3B0aW9ucywgdXNlUXVlcnksIHVzZU11dGF0aW9uLCB0eXBlIFVzZU11dGF0aW9uT3B0aW9ucyB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7YCxcbiAgICAgICAgYGltcG9ydCB0eXBlIHsgQXhpb3NQcm9ncmVzc0V2ZW50IH0gZnJvbSAnYXhpb3MnO2AsXG4gICAgICAgIGBpbXBvcnQgcXMgZnJvbSAncXMnO2AsXG4gICAgICAgIGBpbXBvcnQgeyAke3NvbmFtdVNoYXJlZEltcG9ydHN9IH0gZnJvbSAnLi9zb25hbXUuc2hhcmVkJztgLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsImRpZmYiLCJ1bmlxdWUiLCJhcGlQYXJhbVRvVHNDb2RlIiwiYXBpUGFyYW1UeXBlVG9Uc1R5cGUiLCJ1bndyYXBQcm9taXNlT25jZSIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJBcGlQYXJhbVR5cGUiLCJhc3NlcnREZWZpbmVkIiwiVGVtcGxhdGUiLCJCVUlMVF9JTl9UWVBFUyIsInpvZFR5cGVUb1RzVHlwZURlZiIsIlRlbXBsYXRlX19zZXJ2aWNlcyIsImdldFRhcmdldEFuZFBhdGgiLCJ0YXJnZXQiLCJwYXRoIiwicmVuZGVyIiwiYXBpcyIsInN5bmNlciIsImFwaXNCeU1vZGVsIiwiTWFwIiwiYXBpIiwibW9kZWxOYW1lIiwicmVwbGFjZSIsImhhcyIsInNldCIsImdldCIsInB1c2giLCJpbXBvcnRLZXlzIiwibmFtZXNwYWNlcyIsInR5cGVQYXJhbU5hbWVzIiwibW9kZWxBcGlzIiwiZnVuY3Rpb25zIiwic3RyZWFtT3B0aW9ucyIsInBhcmFtc1dpdGhvdXRDb250ZXh0IiwicGFyYW1ldGVycyIsImZpbHRlciIsInBhcmFtIiwiaXNDb250ZXh0IiwidHlwZSIsImlzUmVmS25leCIsIm9wdGlvbmFsIiwibmFtZSIsInN0YXJ0c1dpdGgiLCJhcGlCYXNlVXJsIiwiY29uZmlnIiwicm91dGUiLCJwcmVmaXgiLCJtZXRob2ROYW1lU3RyZWFtIiwib3B0aW9ucyIsInJlc291cmNlTmFtZSIsImNhbWVsaXplIiwibWV0aG9kTmFtZSIsIm1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQiLCJldmVudHNUeXBlRGVmIiwiZXZlbnRzIiwicGFyYW1zRGVmQXNPYmplY3QiLCJsZW5ndGgiLCJtYXAiLCJwIiwiam9pbiIsInRyaW0iLCJ0eXBlUGFyYW1ldGVyc0FzVHNUeXBlIiwidHlwZVBhcmFtZXRlcnMiLCJ0eXBlUGFyYW0iLCJ0eXBlUGFyYW1zRGVmIiwiY29uY2F0IiwidHAiLCJpZCIsInBhcmFtc0RlZiIsInBhcmFtTmFtZXMiLCJyZXR1cm5UeXBlRGVmIiwicmV0dXJuVHlwZSIsImNsaWVudHMiLCJpbmNsdWRlcyIsImZvcm1EYXRhQXBwZW5kIiwib3RoZXJQYXJhbXNBcHBlbmQiLCJpc1ByaW1pdGl2ZSIsInBhcmFtc0RlZkNvbW1hIiwidGltZW91dCIsImh0dHBNZXRob2QiLCJoYXNQYXJhbXMiLCJob29rTmFtZSIsIm11dGF0aW9uUGFyYW1UeXBlIiwibXV0YXRpb25QYXJhbU5hbWVzIiwicGFyYW1zVHlwZURlZiIsInNwbGl0Iiwic2xpY2UiLCJtdXRhdGlvbkZuQ2FsbCIsImVudGl0eUlkcyIsImdldEFsbElkcyIsImFzeW5jSWRDb25maWdzIiwiZW50aXR5SWQiLCJuYW1lcyIsImdldE5hbWVzRnJvbUlkIiwibGlzdEFwaSIsImNhcGl0YWwiLCJmaW5kIiwicGx1cmFsaXplIiwidXNlSG9va05hbWUiLCJidWlsdEluVHlwZUltcG9ydHMiLCJPYmplY3QiLCJrZXlzIiwidHlwZUtleSIsInNvbmFtdVNoYXJlZEltcG9ydHMiLCJib2R5UGFydHMiLCJib2R5IiwiY3VzdG9tSGVhZGVycyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsU0FBU0MsSUFB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
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvc2VydmljZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGRpZmYsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQge1xuICBhcGlQYXJhbVRvVHNDb2RlLFxuICBhcGlQYXJhbVR5cGVUb1RzVHlwZSxcbiAgdW53cmFwUHJvbWlzZU9uY2UsXG59IGZyb20gXCIuLi8uLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uLy4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9UWVBFUywgem9kVHlwZVRvVHNUeXBlRGVmIH0gZnJvbSBcIi4uL3pvZC1jb252ZXJ0ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZXJ2aWNlcyBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZXJ2aWNlc1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogXCI6dGFyZ2V0L3NyYy9zZXJ2aWNlc1wiLFxuICAgICAgcGF0aDogYHNlcnZpY2VzLmdlbmVyYXRlZC50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7fTogVGVtcGxhdGVPcHRpb25zW1wic2VydmljZXNcIl0pIHtcbiAgICBjb25zdCB7IGFwaXMgfSA9IFNvbmFtdS5zeW5jZXI7XG5cbiAgICAvLyDrqqjrjbjrs4TroZwg6re466O57ZmUXG4gICAgY29uc3QgYXBpc0J5TW9kZWwgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5kZWRBcGlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiBhcGlzKSB7XG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSBhcGkubW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpO1xuICAgICAgaWYgKCFhcGlzQnlNb2RlbC5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgICBhcGlzQnlNb2RlbC5zZXQobW9kZWxOYW1lLCBbXSk7XG4gICAgICB9XG4gICAgICBhcGlzQnlNb2RlbC5nZXQobW9kZWxOYW1lKT8ucHVzaChhcGkpO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgdHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIG1vZGVsQXBpc10gb2YgYXBpc0J5TW9kZWwpIHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgbW9kZWxBcGlzKSB7XG4gICAgICAgIC8vIEBzdHJlYW0g642w7L2U66CI7J207YSw6rCAIOyeiOycvOuptCBTU0Ug7Iqk7Yq466a8IO2VqOyImCDsg53shLFcbiAgICAgICAgaWYgKGFwaS5zdHJlYW1PcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgPT09IHRydWUgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgICAgY29uc3QgbWV0aG9kTmFtZVN0cmVhbSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgICAgOiBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKX1gO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWVTdHJlYW0sIHRydWUpO1xuXG4gICAgICAgICAgY29uc3QgZXZlbnRzVHlwZURlZiA9IHpvZFR5cGVUb1RzVHlwZURlZihhcGkuc3RyZWFtT3B0aW9ucy5ldmVudHMpO1xuXG4gICAgICAgICAgLy8g7YyM652866+47YSw66W8IOqwneyytCDtmJXtg5zroZwg7KCV7J2YICjtg4DsnoXqs7wg7Iuk7KCcIOqwkiDrqqjrkZDsl5Ag7IKs7JqpKVxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIGltcG9ydEtleXMpfWApLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInt9XCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBmdW5jdGlvbiAke21ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWR9KFxuICBwYXJhbXM6ICR7cGFyYW1zRGVmQXNPYmplY3R9LFxuICBoYW5kbGVyczogRXZlbnRIYW5kbGVyczwke2V2ZW50c1R5cGVEZWZ9ICYgeyBlbmQ/OiAoKSA9PiB2b2lkIH0+LFxuICBvcHRpb25zOiBTU0VTdHJlYW1PcHRpb25zXG4pIHtcbiAgcmV0dXJuIHVzZVNTRVN0cmVhbTwke2V2ZW50c1R5cGVEZWZ9PihcXGAke2FwaUJhc2VVcmx9XFxgLCBwYXJhbXMsIGhhbmRsZXJzLCBvcHRpb25zKTtcbn1cbiAgICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZXh0IOygnOyZuO2VnCDtjIzrnbzrr7jthLBcbiAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgIUFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkgJiZcbiAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsID09PSB0cnVlICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIO2DgOyehSDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPSBhcGkudHlwZVBhcmFtZXRlcnNcbiAgICAgICAgICAubWFwKCh0eXBlUGFyYW0pID0+IGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGVQYXJhbSwgaW1wb3J0S2V5cykpXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtc0RlZiA9IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPyBgPCR7dHlwZVBhcmFtZXRlcnNBc1RzVHlwZX0+YCA6IFwiXCI7XG4gICAgICAgIHR5cGVQYXJhbU5hbWVzID0gdHlwZVBhcmFtTmFtZXMuY29uY2F0KGFwaS50eXBlUGFyYW1ldGVycy5tYXAoKHRwKSA9PiB0cC5pZCkpO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgcGFyYW1zRGVmID0gYXBpUGFyYW1Ub1RzQ29kZShwYXJhbXNXaXRob3V0Q29udGV4dCwgaW1wb3J0S2V5cyk7XG4gICAgICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vIOumrO2EtCDtg4DsnoUg7KCV7J2YXG4gICAgICAgIGNvbnN0IHJldHVyblR5cGVEZWYgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICBhc3NlcnREZWZpbmVkKHVud3JhcFByb21pc2VPbmNlKGFwaS5yZXR1cm5UeXBlKSksXG4gICAgICAgICAgaW1wb3J0S2V5cyxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDquLDrs7ggVVJMXG4gICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgIGNvbnN0IGNsaWVudHMgPSBhcGkub3B0aW9ucy5jbGllbnRzIHx8IFtdO1xuXG4gICAgICAgIC8vIDEuIGF4aW9zIO2VqOyImCDsg53shLFcbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOyeiOycvOuptCBnZXQgKyByZXNvdXJjZU5hbWUg7ZiV7YOc66GcIO2VqOyImOuqhSDsg53shLFcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgID8gYGdldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICA6IGFwaS5tZXRob2ROYW1lO1xuXG4gICAgICAgIC8vIGF4aW9zLW11bHRpcGFydCDsspjrpqwgKO2MjOydvCDsl4XroZzrk5wpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwiYXhpb3MtbXVsdGlwYXJ0XCIpKSB7XG4gICAgICAgICAgY29uc3QgZm9ybURhdGFBcHBlbmQgPSBgZmlsZXMuZm9yRWFjaChmID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiZmlsZXNcIiwgZik7IH0pO2A7XG5cbiAgICAgICAgICBjb25zdCBvdGhlclBhcmFtc0FwcGVuZCA9IHBhcmFtc1dpdGhvdXRDb250ZXh0XG4gICAgICAgICAgICAubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAvLyBwcmltaXRpdmUg7YOA7J6F7J247KeAIOyytO2BrFxuICAgICAgICAgICAgICBjb25zdCBpc1ByaW1pdGl2ZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHBhcmFtLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdLmluY2x1ZGVzKHBhcmFtLnR5cGUpO1xuXG4gICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSkge1xuICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZTog7KeB7KCRIGZvcm1EYXRhLmFwcGVuZFxuICAgICAgICAgICAgICAgIHJldHVybiBgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgU3RyaW5nKCR7cGFyYW0ubmFtZX0pKTtgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG9iamVjdDogdG9Gb3JtRGF0YSDsgqzsmqlcbiAgICAgICAgICAgICAgICByZXR1cm4gYHRvRm9ybURhdGEoJHtwYXJhbS5uYW1lfSwgZm9ybURhdGEsICcke3BhcmFtLm5hbWV9Jyk7YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiXFxuICAgIFwiKTtcblxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkNvbW1hID0gcGFyYW1zRGVmICE9PSBcIlwiID8gXCIsIFwiIDogXCJcIjtcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWV9JHt0eXBlUGFyYW1zRGVmfShcbiAgJHtwYXJhbXNEZWZ9JHtwYXJhbXNEZWZDb21tYX1cbiAgZmlsZXM6IEZpbGVbXSxcbiAgb25VcGxvYWRQcm9ncmVzcz86IChwZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkXG4pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgJHtmb3JtRGF0YUFwcGVuZH1cbiAgJHtvdGhlclBhcmFtc0FwcGVuZH1cbiAgcmV0dXJuIGZldGNoKHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB1cmw6IFxcYCR7YXBpQmFzZVVybH1cXGAsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIsXG4gICAgfSxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgIGNvbnN0IGhhc1BhcmFtcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfSR7aGFzUGFyYW1zID8gYD9cXCR7cXMuc3RyaW5naWZ5KHsgJHtwYXJhbU5hbWVzfSB9KX1gIDogXCJcIn1cXGAsXG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBoYXNQYXJhbXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogXCIke2FwaS5vcHRpb25zLmh0dHBNZXRob2R9XCIsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgICR7aGFzUGFyYW1zID8gYGRhdGE6IHsgJHtwYXJhbU5hbWVzfSB9LGAgOiBcIlwifVxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBxdWVyeU9wdGlvbnMgKyB1c2VRdWVyeSAodGFuc3RhY2stcXVlcnkpXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgICAgICAgPyBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSwgdHJ1ZSlcbiAgICAgICAgICAgIDogaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBxdWVyeU9wdGlvbnNcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCAke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pID0+IHF1ZXJ5T3B0aW9ucyh7XG4gIHF1ZXJ5S2V5OiBbJyR7bW9kZWxOYW1lfScsICcke21ldGhvZE5hbWV9JyR7cGFyYW1OYW1lcyA/IGAsICR7cGFyYW1OYW1lc31gIDogXCJcIn1dLFxuICBxdWVyeUZuOiAoKSA9PiAke21ldGhvZE5hbWV9KCR7cGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXNlUXVlcnkgaG9va1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0IHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShob29rTmFtZSl9ID0gJHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0ke1xuICAgICAgICAgICAgICBwYXJhbXNEZWYgPyBcIiwgXCIgOiBcIlwiXG4gICAgICAgICAgICB9b3B0aW9ucz86IHsgZW5hYmxlZD86IGJvb2xlYW4gfSkgPT5cbiAgdXNlUXVlcnkoe1xuICAgIC4uLiR7bWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMoJHtwYXJhbU5hbWVzfSksXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gdXNlTXV0YXRpb24gKHRhbnN0YWNrLW11dGF0aW9uKVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLW11dGF0aW9uXCIpKSB7XG4gICAgICAgICAgY29uc3QgaG9va05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKTtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvblBhcmFtVHlwZSA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gYHsgJHtwYXJhbXNXaXRob3V0Q29udGV4dFxuICAgICAgICAgICAgICAgICAgLm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHthcGlQYXJhbVR5cGVUb1RzVHlwZShwLnR5cGUsIFtdKX1gKVxuICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX0gfWBcbiAgICAgICAgICAgICAgOiBcInZvaWRcIjtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvblBhcmFtTmFtZXMgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IHBhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gYHBhcmFtcy4ke3AubmFtZX1gKS5qb2luKFwiLCBcIilcbiAgICAgICAgICAgICAgOiBcIlwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgdXNlJHtob29rTmFtZX1NdXRhdGlvbiA9ICR7dHlwZVBhcmFtc0RlZn0oKSA9PiB1c2VNdXRhdGlvbih7XG4gIG11dGF0aW9uRm46IChwYXJhbXM6ICR7bXV0YXRpb25QYXJhbVR5cGV9KSA9PiAke21ldGhvZE5hbWV9KCR7bXV0YXRpb25QYXJhbU5hbWVzfSlcbn0pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LiB1c2VNdXRhdGlvbiB3aXRoIG11bHRpcGFydCAodGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0KVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLW11dGF0aW9uLW11bHRpcGFydFwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSk7XG5cbiAgICAgICAgICAvLyDtjIzrnbzrr7jthLAg7YOA7J6FIOygleydmDogcGFyYW1zRGVm7JeQ7IScIO2DgOyeheunjCDstpTstpxcbiAgICAgICAgICAvLyBwYXJhbXNEZWYg7JiIOiBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgY29uc3QgcGFyYW1zVHlwZURlZiA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyYW1zRGVmXG4gICAgICAgICAgICAgICAgICAuc3BsaXQoXCI6XCIpXG4gICAgICAgICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiOlwiKVxuICAgICAgICAgICAgICAgICAgLnRyaW0oKSAvLyBcInBhcmFtczogeyBjYXRlZ29yeTogc3RyaW5nIH1cIiDihpIgXCJ7IGNhdGVnb3J5OiBzdHJpbmcgfVwiXG4gICAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyBwYXJhbXM6ICR7cGFyYW1zVHlwZURlZn0sIGZpbGVzOiBGaWxlW10gfWBcbiAgICAgICAgICAgICAgOiBgeyBmaWxlczogRmlsZVtdIH1gO1xuXG4gICAgICAgICAgLy8gbXV0YXRpb25GbiDtmLjstpwg7YyM652866+47YSwXG4gICAgICAgICAgY29uc3QgbXV0YXRpb25GbkNhbGwgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGAke21ldGhvZE5hbWV9KHBhcmFtcy5wYXJhbXMsIHBhcmFtcy5maWxlcylgXG4gICAgICAgICAgICAgIDogYCR7bWV0aG9kTmFtZX0ocGFyYW1zLmZpbGVzKWA7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfShcbiAgb3B0aW9ucz86IFVzZU11dGF0aW9uT3B0aW9uczwke3JldHVyblR5cGVEZWZ9LCBFcnJvciwgJHttdXRhdGlvblBhcmFtVHlwZX0+ICYge1xuICAgIG9uVXBsb2FkUHJvZ3Jlc3M/OiAoZTogQXhpb3NQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuICB9XG4pID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bXV0YXRpb25GbkNhbGx9LFxuICByZXRyeTogZmFsc2UsXG4gIC4uLm9wdGlvbnMsXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hbWVzcGFjZXMucHVzaChcbiAgICAgICAgYFxuZXhwb3J0IG5hbWVzcGFjZSAke21vZGVsTmFtZX1TZXJ2aWNlIHtcbiR7ZnVuY3Rpb25zLmpvaW4oXCJcXG5cXG5cIil9XG59XG4gICAgICBgLnRyaW0oKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQXN5bmNJZENvbmZpZyDsg53shLEgKEVudGl0eeuzhOuhnClcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGFzeW5jSWRDb25maWdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdHlJZHMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIHVzZUxpc3Qg66mU7ISc65Oc66W8IOqwgOynhCBBUEkg7LC+6riwICjrs7XsiJjtmJUgcmVzb3VyY2VOYW1l7J2EIOqwgOynhCDqsoMpXG4gICAgICBjb25zdCBsaXN0QXBpID0gYXBpc0J5TW9kZWwuZ2V0KG5hbWVzLmNhcGl0YWwpPy5maW5kKChhcGkpID0+IHtcbiAgICAgICAgaWYgKCFhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUgfHwgIWFwaS5vcHRpb25zLmNsaWVudHM/LmluY2x1ZGVzKFwidGFuc3RhY2stcXVlcnlcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb3VyY2VOYW1l7J20IOuzteyImO2YleyduOyngCDtmZXsnbggKGxpc3QgQVBJ64qUIOuzteyImO2YlSDsgqzsmqkpXG4gICAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZTtcbiAgICAgICAgcmV0dXJuIGluZmxlY3Rpb24ucGx1cmFsaXplKHJlc291cmNlTmFtZSkgPT09IHJlc291cmNlTmFtZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobGlzdEFwaSkge1xuICAgICAgICAvLyByZXNvdXJjZU5hbWXsl5DshJwgaG9vayDsnbTrpoQg7IOd7ISxICjquLDsobQg66Gc7KeB6rO8IOuPmeydvClcbiAgICAgICAgY29uc3QgaG9va05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFzc2VydERlZmluZWQobGlzdEFwaS5vcHRpb25zLnJlc291cmNlTmFtZSksIHRydWUpO1xuICAgICAgICBjb25zdCB1c2VIb29rTmFtZSA9IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfWA7XG5cbiAgICAgICAgLy8gTGlzdFBhcmFtcyDtg4DsnoXrqoUg6rWs7ISxXG4gICAgICAgIGNvbnN0IGxpc3RQYXJhbXNUeXBlID0gYCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zYDtcblxuICAgICAgICBhc3luY0lkQ29uZmlncy5wdXNoKFxuICAgICAgICAgIGBcbi8vIEFzeW5jSWRDb25maWc6ICR7bmFtZXMuY2FwaXRhbH1cbmV4cG9ydCBjb25zdCAke25hbWVzLmNhcGl0YWx9QXN5bmNJZENvbmZpZzogQXN5bmNJZENvbmZpZzwke25hbWVzLmNhcGl0YWx9U3Vic2V0S2V5LCAke25hbWVzLmNhcGl0YWx9U3Vic2V0TWFwcGluZywgJHtsaXN0UGFyYW1zVHlwZX0+ID0ge1xuICBwbGFjZWhvbGRlcktleTogXCJlbnRpdHkuJHtuYW1lcy5jYXBpdGFsfVwiLFxuICB1c2VMaXN0OiAke25hbWVzLmNhcGl0YWx9U2VydmljZS4ke3VzZUhvb2tOYW1lfSxcbn07XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQlVJTFRfSU5fVFlQRVPsl5DshJwg7IKs7Jqp65CY64qUIO2DgOyeheuTpOydhCDtmZXsnbjtlZjsl6wg64+Z7KCB7Jy866GcIGltcG9ydCDqtazshLFcbiAgICBjb25zdCBidWlsdEluVHlwZUltcG9ydHMgPSBPYmplY3Qua2V5cyhCVUlMVF9JTl9UWVBFUylcbiAgICAgIC5maWx0ZXIoKHR5cGVLZXkpID0+IGltcG9ydEtleXMuaW5jbHVkZXModHlwZUtleSkpXG4gICAgICAubWFwKCh0eXBlS2V5KSA9PiBgdHlwZSAke3R5cGVLZXl9YCk7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVk7JeQ7IScIGltcG9ydO2VoCDtla3rqqnrk6TsnYQg64+Z7KCB7Jy866GcIOq1rOyEsVxuICAgIGNvbnN0IHNvbmFtdVNoYXJlZEltcG9ydHMgPSBbXG4gICAgICBcInR5cGUgTGlzdFJlc3VsdFwiLFxuICAgICAgXCJ0eXBlIEZpbHRlclF1ZXJ5XCIsXG4gICAgICAuLi5idWlsdEluVHlwZUltcG9ydHMsXG4gICAgICBcImZldGNoXCIsXG4gICAgICBcInR5cGUgRXZlbnRIYW5kbGVyc1wiLFxuICAgICAgXCJ0eXBlIFNTRVN0cmVhbU9wdGlvbnNcIixcbiAgICAgIFwidXNlU1NFU3RyZWFtXCIsXG4gICAgICBcInRvRm9ybURhdGFcIixcbiAgICBdLmpvaW4oXCIsIFwiKTtcblxuICAgIC8vIGJvZHkg6rWs7ISxOiBuYW1lc3BhY2VzICsgYXN5bmNJZENvbmZpZ3NcbiAgICBjb25zdCBib2R5UGFydHMgPSBbLi4ubmFtZXNwYWNlcywgLi4uYXN5bmNJZENvbmZpZ3NdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogYm9keVBhcnRzLmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICBpbXBvcnRLZXlzOiBkaWZmKHVuaXF1ZShpbXBvcnRLZXlzKSwgW1xuICAgICAgICAuLi50eXBlUGFyYW1OYW1lcyxcbiAgICAgICAgXCJMaXN0UmVzdWx0XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKEJVSUxUX0lOX1RZUEVTKSxcbiAgICAgIF0pLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKlwiLFxuICAgICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgICAgXCIgKiDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIixcbiAgICAgICAgXCIgKi9cIixcbiAgICAgICAgXCIvKiogYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWTripQg66y07IucICovXCIsXG4gICAgICAgIFwiLyoqIGJpb21lLWlnbm9yZS1hbGwgYXNzaXN0OiBnZW5lcmF0ZWTripQg66y07IucICovXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGBpbXBvcnQgeyBxdWVyeU9wdGlvbnMsIHVzZVF1ZXJ5LCB1c2VNdXRhdGlvbiwgdHlwZSBVc2VNdXRhdGlvbk9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO2AsXG4gICAgICAgIGBpbXBvcnQgdHlwZSB7IEF4aW9zUHJvZ3Jlc3NFdmVudCB9IGZyb20gJ2F4aW9zJztgLFxuICAgICAgICBgaW1wb3J0IHFzIGZyb20gJ3FzJztgLFxuICAgICAgICBgaW1wb3J0IHsgJHtzb25hbXVTaGFyZWRJbXBvcnRzfSB9IGZyb20gJy4vc29uYW11LnNoYXJlZCc7YCxcbiAgICAgICAgYGltcG9ydCB0eXBlIHsgQXN5bmNJZENvbmZpZyB9IGZyb20gJ0Bzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50cyc7YCxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImluZmxlY3Rpb24iLCJkaWZmIiwidW5pcXVlIiwiYXBpUGFyYW1Ub1RzQ29kZSIsImFwaVBhcmFtVHlwZVRvVHNUeXBlIiwidW53cmFwUHJvbWlzZU9uY2UiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiQXBpUGFyYW1UeXBlIiwiYXNzZXJ0RGVmaW5lZCIsIlRlbXBsYXRlIiwiQlVJTFRfSU5fVFlQRVMiLCJ6b2RUeXBlVG9Uc1R5cGVEZWYiLCJUZW1wbGF0ZV9fc2VydmljZXMiLCJnZXRUYXJnZXRBbmRQYXRoIiwidGFyZ2V0IiwicGF0aCIsInJlbmRlciIsImFwaXMiLCJzeW5jZXIiLCJhcGlzQnlNb2RlbCIsIk1hcCIsImFwaSIsIm1vZGVsTmFtZSIsInJlcGxhY2UiLCJoYXMiLCJzZXQiLCJnZXQiLCJwdXNoIiwiaW1wb3J0S2V5cyIsIm5hbWVzcGFjZXMiLCJ0eXBlUGFyYW1OYW1lcyIsIm1vZGVsQXBpcyIsImZ1bmN0aW9ucyIsInN0cmVhbU9wdGlvbnMiLCJwYXJhbXNXaXRob3V0Q29udGV4dCIsInBhcmFtZXRlcnMiLCJmaWx0ZXIiLCJwYXJhbSIsImlzQ29udGV4dCIsInR5cGUiLCJpc1JlZktuZXgiLCJvcHRpb25hbCIsIm5hbWUiLCJzdGFydHNXaXRoIiwiYXBpQmFzZVVybCIsImNvbmZpZyIsInJvdXRlIiwicHJlZml4IiwibWV0aG9kTmFtZVN0cmVhbSIsIm9wdGlvbnMiLCJyZXNvdXJjZU5hbWUiLCJjYW1lbGl6ZSIsIm1ldGhvZE5hbWUiLCJtZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkIiwiZXZlbnRzVHlwZURlZiIsImV2ZW50cyIsInBhcmFtc0RlZkFzT2JqZWN0IiwibGVuZ3RoIiwibWFwIiwicCIsImpvaW4iLCJ0cmltIiwidHlwZVBhcmFtZXRlcnNBc1RzVHlwZSIsInR5cGVQYXJhbWV0ZXJzIiwidHlwZVBhcmFtIiwidHlwZVBhcmFtc0RlZiIsImNvbmNhdCIsInRwIiwiaWQiLCJwYXJhbXNEZWYiLCJwYXJhbU5hbWVzIiwicmV0dXJuVHlwZURlZiIsInJldHVyblR5cGUiLCJjbGllbnRzIiwiaW5jbHVkZXMiLCJmb3JtRGF0YUFwcGVuZCIsIm90aGVyUGFyYW1zQXBwZW5kIiwiaXNQcmltaXRpdmUiLCJwYXJhbXNEZWZDb21tYSIsInRpbWVvdXQiLCJodHRwTWV0aG9kIiwiaGFzUGFyYW1zIiwiaG9va05hbWUiLCJtdXRhdGlvblBhcmFtVHlwZSIsIm11dGF0aW9uUGFyYW1OYW1lcyIsInBhcmFtc1R5cGVEZWYiLCJzcGxpdCIsInNsaWNlIiwibXV0YXRpb25GbkNhbGwiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJhc3luY0lkQ29uZmlncyIsImVudGl0eUlkIiwibmFtZXMiLCJnZXROYW1lc0Zyb21JZCIsImxpc3RBcGkiLCJjYXBpdGFsIiwiZmluZCIsInBsdXJhbGl6ZSIsInVzZUhvb2tOYW1lIiwibGlzdFBhcmFtc1R5cGUiLCJidWlsdEluVHlwZUltcG9ydHMiLCJPYmplY3QiLCJrZXlzIiwidHlwZUtleSIsInNvbmFtdVNoYXJlZEltcG9ydHMiLCJib2R5UGFydHMiLCJib2R5IiwiY3VzdG9tSGVhZGVycyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsU0FBU0MsSUFBSSxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUN2QyxTQUNFQyxnQkFBZ0IsRUFDaEJDLG9CQUFvQixFQUNwQkMsaUJBQWlCLFFBQ1osK0JBQTRCO0FBRW5DLFNBQVNDLE1BQU0sUUFBUSxzQkFBbUI7QUFDMUMsU0FBU0MsYUFBYSxRQUFRLGlDQUE4QjtBQUU1RCxTQUFTQyxZQUFZLFFBQVEsdUJBQW9CO0FBQ2pELFNBQVNDLGFBQWEsUUFBUSx1QkFBb0I7QUFDbEQsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLGNBQWMsRUFBRUMsa0JBQWtCLFFBQVEsc0JBQW1CO0FBRXRFLE9BQU8sTUFBTUMsMkJBQTJCSDtJQUN0QyxhQUFjO1FBQ1osS0FBSyxDQUFDO0lBQ1I7SUFFQUksbUJBQW1CO1FBQ2pCLE9BQU87WUFDTEMsUUFBUTtZQUNSQyxNQUFNLENBQUMscUJBQXFCLENBQUM7UUFDL0I7SUFDRjtJQUVBQyxPQUFPLEVBQStCLEVBQUU7UUFDdEMsTUFBTSxFQUFFQyxJQUFJLEVBQUUsR0FBR1osT0FBT2EsTUFBTTtRQUU5QixXQUFXO1FBQ1gsTUFBTUMsY0FBYyxJQUFJQztRQUN4QixLQUFLLE1BQU1DLE9BQU9KLEtBQU07WUFDdEIsTUFBTUssWUFBWUQsSUFBSUMsU0FBUyxDQUFDQyxPQUFPLENBQUMsVUFBVSxJQUFJQSxPQUFPLENBQUMsVUFBVTtZQUN4RSxJQUFJLENBQUNKLFlBQVlLLEdBQUcsQ0FBQ0YsWUFBWTtnQkFDL0JILFlBQVlN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
@@ -1,5 +1,5 @@
1
1
  import { type EntityNamesRecord } from "../../entity/entity-manager";
2
- import type { RenderingNode, TemplateKey, TemplateOptions } from "../../types/types";
2
+ import type { RenderingNode, TemplateOptions } from "../../types/types";
3
3
  import { Template } from "../template";
4
4
  export declare class Template__view_form extends Template {
5
5
  constructor();
@@ -10,16 +10,20 @@ export declare class Template__view_form extends Template {
10
10
  getRequiredDictKeys(): string[] | null;
11
11
  wrapFC(body: string, label?: string): string;
12
12
  wrapFG(body: string, label?: string): string;
13
- renderColumnImport(entityId: string, col: RenderingNode): string;
14
- renderColumn(entityId: string, col: RenderingNode, names: EntityNamesRecord): string;
13
+ renderColumnImport(entityId: string, col: RenderingNode): {
14
+ type: "enum";
15
+ enumId: string;
16
+ entityId?: undefined;
17
+ } | {
18
+ type: "fk";
19
+ entityId: string;
20
+ enumId?: undefined;
21
+ } | null;
22
+ renderColumn(entityId: string, col: RenderingNode): string;
15
23
  resolveDefaultValue(columns: RenderingNode[]): object;
16
24
  render({ entityId }: TemplateOptions["view_form"]): Promise<{
17
25
  body: string;
18
26
  importKeys: never[];
19
- preTemplates: {
20
- key: TemplateKey;
21
- options: TemplateOptions[TemplateKey];
22
- }[];
23
27
  target: string;
24
28
  path: string;
25
29
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"view_form.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_form.template.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGrF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOhC,mBAAmB,IAAI,MAAM,EAAE,GAAG,IAAI;IAI/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAO5C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAI5C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa;IAmBvD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAqEpF,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM;IAqC/C,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,WAAW,CAAC;;;;;;;;;;CA0WxD"}
1
+ {"version":3,"file":"view_form.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/view_form.template.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMxE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOhC,mBAAmB,IAAI,MAAM,EAAE,GAAG,IAAI;IAI/C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAO5C,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAI5C,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa;;;;;;;;;IAwBvD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM;IAuF1D,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM;IAqC/C,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,WAAW,CAAC;;;;;;CA2VxD"}