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
@@ -19,7 +19,7 @@ import { centerText } from "../utils/console-util.js";
19
19
  import { isTest } from "../utils/controller.js";
20
20
  import { copyFileWithReplaceCoreToShared, exists } from "../utils/fs-utils.js";
21
21
  import { runWithGracefulShutdown } from "../utils/process-utils.js";
22
- import { areFilesSame, findChangedFilesUsingChecksums, renewChecksums } from "./checksum.js";
22
+ import { findChangedFilesUsingChecksums, renewChecksums } from "./checksum.js";
23
23
  import { generateTemplate, renderTemplate } from "./code-generator.js";
24
24
  import { createEntity, delEntity } from "./entity-operations.js";
25
25
  import { checksumPatternGroup, getChecksumPatternGroupInAbsolutePath } from "./file-patterns.js";
@@ -33,11 +33,11 @@ export class Syncer {
33
33
  eventEmitter = new EventEmitter();
34
34
  /**
35
35
  * 체크섬이 변경된 부분에 대해 싱크를 진행합니다.
36
- * 다만 sonamu.shared.ts는 체크섬 비교 없이 무조건 싱크(복사)합니다.
36
+ * sonamu.shared.ts는 파일이 없을 때만 1회 생성하고, 이후에는 덮어쓰지 않습니다.
37
37
  * @returns
38
38
  */ async sync() {
39
39
  const { targets } = Sonamu.config.sync;
40
- // sonamu.shared.ts는 무조건 싱크(복사)합니다.
40
+ // sonamu.shared.ts는 파일이 없을 때만 1회 생성합니다.
41
41
  await this.copySharedToTargets(targets);
42
42
  // 그 다음부터는 변경된 파일을 찾아서 동기화 작업을 실행합니다.
43
43
  const changedFiles = await findChangedFilesUsingChecksums();
@@ -174,11 +174,12 @@ export class Syncer {
174
174
  });
175
175
  console.warn(`Created directory '${path.dirname(destPath)}' because it did not exist.`);
176
176
  }
177
- if (await areFilesSame({
178
- data: convertedText
179
- }, {
180
- path: destPath
181
- })) {
177
+ // 파일이 이미 존재하면 건너뜁니다.
178
+ // sonamu.shared.ts는 프로젝트에서 자유롭게 커스터마이징할 수 있어야 하므로,
179
+ // 최초 1회만 생성하고 이후에는 덮어쓰지 않습니다.
180
+ // 템플릿 내용($[[dictUtils]] 등)이 변경되었을 때 반영이 필요하면,
181
+ // 해당 파일을 삭제한 뒤 `pnpm sonamu sync`로 재생성하면 됩니다.
182
+ if (await exists(destPath)) {
182
183
  continue;
183
184
  }
184
185
  await writeFile(destPath, convertedText);
@@ -469,10 +470,16 @@ export class Syncer {
469
470
  for (const locale of locales){
470
471
  const sourceFile = path.join(apiI18nDir, `${locale}.ts`);
471
472
  const targetFile = path.join(targetI18nDir, `${locale}.ts`);
472
- await copyFileWithReplaceCoreToShared(sourceFile, targetFile);
473
+ const syncHeader = [
474
+ "/**",
475
+ " * @generated",
476
+ " * API에서 동기화된 파일입니다. 직접 수정하지 마세요.",
477
+ " */"
478
+ ].join("\n");
479
+ await copyFileWithReplaceCoreToShared(sourceFile, targetFile, syncHeader);
473
480
  !isTest() && console.log(chalk.bold("Copied: ") + chalk.cyan(`${target}/src/i18n/${locale}.ts`));
474
481
  }
475
482
  }
476
483
  }
477
484
 
478
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJlZEFwaXMgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkLCBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQge1xuICBjaGVja3N1bVBhdHRlcm5Hcm91cCxcbiAgdHlwZSBGaWxlVHlwZSxcbiAgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCxcbn0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbiAgbG9hZFdvcmtmbG93cyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuaW1wb3J0ICogYXMgU3luY2VyQWN0aW9ucyBmcm9tIFwiLi9zeW5jZXItYWN0aW9uc1wiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiDssrTtgazshKzsnbQg67OA6rK965CcIOu2gOu2hOyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog64uk66eMIHNvbmFtdS5zaGFyZWQudHPripQg7LK07YGs7ISsIOu5hOq1kCDsl4bsnbQg66y07KGw6rG0IOyLse2BrCjrs7Xsgqwp7ZWp64uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcblxuICAgIC8vIHNvbmFtdS5zaGFyZWQudHPripQg66y07KGw6rG0IOyLse2BrCjrs7Xsgqwp7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzKTtcblxuICAgIC8vIOq3uCDri6TsnYzrtoDthLDripQg67OA6rK965CcIO2MjOydvOydhCDssL7slYTshJwg64+Z6riw7ZmUIOyekeyXheydhCDsi6Ttlontlanri4jri6QuXG4gICAgY29uc3QgY2hhbmdlZEZpbGVzID0gYXdhaXQgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk7XG4gICAgaWYgKGNoYW5nZWRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChcIkFsbCBmaWxlcyBhcmUgc3luY2VkIVwiKSkpO1xuXG4gICAgICAvLyDrs4Dqsr3sgqztla3snbQg7JeG7Ja064+EIFNTUiDthZztlIzrpr/snYAg7IOd7ISxICjstIjquLAg7ISk7KCVIOyLnCwg7J2066+4IOyhtOyerO2VmOuptCDsiqTtgrUpXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwicXVlcmllc1wiLCB7fSwgeyBvdmVyd3JpdGU6IGZhbHNlIH0pO1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiZW50cnlfc2VydmVyXCIsIHt9LCB7IG92ZXJ3cml0ZTogZmFsc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIO2MjOydvOydtCDsnbTrr7gg7KG07J6s7ZWY66m0IOustOyLnFxuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbikpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIGdlbmVyYXRlIFNTUiB0ZW1wbGF0ZXM6XCIsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTU1Ig7ISk7KCVIO2MjOydvCDrs4Dqsr0g6rCQ7KeAXG4gICAgaWYgKGRpZmZGaWxlUGF0aC5pbmNsdWRlcyhcIi9zcmMvc3NyL1wiKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZC55ZWxsb3coXCJTU1IgY29uZmlnIGNoYW5nZWQgLSByZWxvYWRpbmcuLi5cIikpO1xuICAgICAgLy8gU1NSIO2MjOydvOuPhCBpbnZhbGlkYXRlIO2bhCByZWxvYWRcbiAgICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgICAgYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKGRpZmZGaWxlUGF0aCwgZXZlbnQpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hdXRvbG9hZFNTUlJvdXRlcygpO1xuICAgICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOydvOuLqCDrs4Dqsr3rkJwg7YyM7J286rO8IGRlcGVuZGVudCDtjIzsnbzrk6TsnYQgaW52YWxpZGF0ZSDtlanri4jri6QuXG4gICAgLy8g7ZWcIOuyiCDsnbTsg4EgaW1wb3J065CcIOy5nOq1rOuTpOyXkCDrjIDtlbTshJzrp4wg7Iuk7KCcIOyekeyXheydtCDsnbzslrTrgqnri4jri6QuXG4gICAgLy8g6re465+s64uIIOyViOyLrO2VmOqzoCBpbnZhbGlkYXRlIO2VtOuPhCDrkKnri4jri6QuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnOuKlCBob3QuaW52YWxpZGF0ZUZpbGXsi5wg7LSI6riwIOyXkOufrOqwgCDrsJzsg53tlZjquLAg65WM66y47JeQIGludmFsaWRhdGUg7ZWY7KeAIOyViuyKteuLiOuLpC5cbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBjb25zdCBpbnZhbGlkYXRlZFBhdGhzID0gKGF3YWl0IGhvdC5pbnZhbGlkYXRlRmlsZShkaWZmRmlsZVBhdGgsIGV2ZW50KSkgYXMgQWJzb2x1dGVQYXRoW107XG5cbiAgICAgIGlmIChpbnZhbGlkYXRlZFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChg8J+UhCBJbnZhbGlkYXRlZDpgKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpbnZhbGlkYXRlZFBhdGggb2YgaW52YWxpZGF0ZWRQYXRocykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgICAgLy8gcmVnaXN0ZXJlZEFwaXPripQg7Ya17Jy866GcIOuLpCDrgqDroKTrsoTrprQg7IiYIOyXhuyKteuLiOuLpC4gcmVnaXN0ZXJlZEFwaXPsl5Ag7Jis65287Jik64qUIOy5nOq1rOuTpOydgCDstIjquLAg66Gc65Oc7IucIOuYkOuKlCBITVLsi5zsl5Drp4wg65Ox66Gd65CY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICAgICAgICAgIC8vIOuUsOudvOyEnCBtb2RlbC50cyDtjIzsnbzsnZgg67OA6rK97Jy866GcIOuLpOydjOuyiCDsg4jroZzsmrQgZXZhbOydtCDsmIjsg4HrkJjripQg7J20IOyLnOygkOyXkOyEnOunjCwg7J20IOuqqOuNuOyXkOyEnCDrgpjsmKggcmVnaXN0ZXJlZEFwaXPrk6TsnYQg7KeA7JuM7KSEIOyImCDsnojsirXri4jri6QuXG4gICAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWRBcGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICAgIGNoYWxrLmdyYXkoYCh3aXRoICR7cmVtb3ZlZEFwaXMubGVuZ3RofSBBUElzKWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgY2hhbGsucmVkKGBGYWlsZWQgdG8gcmVtb3ZlIGludmFsaWRhdGVkIHJlZ2lzdGVyZWQgQVBJcyBmb3IgJHtpbnZhbGlkYXRlZFBhdGh9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgpKS5zb21lKFxuICAgICAgKHBhdHRlcm4pID0+IG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICk7XG5cbiAgICAvLyDtlaAg7J28KHN5bmMp7J20IOyeiOycvOuptCDtlanri4jri6QuXG4gICAgaWYgKGlzSW5DaGVja1BhdHRlcm5Hcm91cCkge1xuICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKFtkaWZmRmlsZVBhdGhdKTtcbiAgICB9XG5cbiAgICAvLyDsi7Htgawg7J6R7JeF7J20IOuBneuCmOuptCDrqqjrk6Ag66qo65OI7J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAgICAvLyBobXItaG9va+yXkCDsnZjtlbQgaW52YWxpZGF0ZeuQnCDrtoDrtoTrk6TsnbQg7JWE64uI652866m0IOy6kOyLnCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcblxuICAgIHRoaXMuZXZlbnRFbWl0dGVyLmVtaXQoXCJvbkhNUkNvbXBsZXRlZFwiKTtcbiAgfVxuXG4gIHJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoXG4gICAgaW52YWxpZGF0ZWRQYXRoOiBBYnNvbHV0ZVBhdGgsXG4gICk6ICh0eXBlb2YgcmVnaXN0ZXJlZEFwaXMpW251bWJlcl1bXSB7XG4gICAgaWYgKCFpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIiAvKuyGjOyKpCDsvZTrk5zrpbwg64uk66Oo64qUIOyDge2ZqeydtOuLiCAudHMg6rK966Gc66GcIOu0heuLiOuLpC4qLykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChpbnZhbGlkYXRlZFBhdGgpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IGAke2VudGl0eUlkfU1vZGVsYCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgdG9SZW1vdmUpIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnNwbGljZShyZWdpc3RlcmVkQXBpcy5pbmRleE9mKGFwaSksIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0b1JlbW92ZTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBwbHVyYWwudHMg64K07Jqp7J2EIOydveyWtOyEnCBzaGFyZWQg7YyM7J287JeQIOyCveyehe2VqeuLiOuLpC5cbiAgICBjb25zdCBkaWN0VXRpbHNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICBcIi4uL2RpY3QvdXRpbHMudHNcIixcbiAgICApO1xuICAgIGNvbnN0IGRpY3RVdGlsc0NvZGUgPSAoYXdhaXQgZXhpc3RzKGRpY3RVdGlsc1BhdGgpKVxuICAgICAgPyBhd2FpdCByZWFkRmlsZShkaWN0VXRpbHNQYXRoLCBcInV0Zi04XCIpXG4gICAgICA6IFwiXCI7XG5cbiAgICAvLyDtirnsoJUg67OA7IiYIOy5mO2ZmOydhCDsnITtlbTshJwg7IKs7Jqp7ZWp64uI64ukLlxuICAgIGNvbnN0IGNvbnZlcnRNYXAgPSB7XG4gICAgICBiYXNlVXJsOlxuICAgICAgICBTb25hbXUuY29uZmlnLnNlcnZlci5iYXNlVXJsID8/XG4gICAgICAgIGBodHRwOi8vJHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIn06JHtTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4/LnBvcnQgPz8gMzAwMH1gLFxuICAgICAgZGljdFV0aWxzOiBkaWN0VXRpbHNDb2RlLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAvLyDsp4DquIgg6rCA7KC46rCA66Ck64qUIOydtCDtjIzsnbzsnYAgU29uYW11IOy9lOuTnOuyoOydtOyKpOydmCDsnbzrtoDsnoXri4jri6QuXG4gICAgICAvLyDqt7jrn7DrjbAgZGlzdCDsho0g67mM65Oc65CcIOyGjOyKpCDsvZTrk5wg7YyM7J287J20IO2VhOyalO2VnCDqsoPsnbQg7JWE64uI6rOgLCBzcmPsl5Drp4wg7J6I64qUIO2FjeyKpO2KuCDtjIzsnbzsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUucmVwbGFjZShcIi9kaXN0L1wiLCBcIi9zcmMvXCIpLFxuICAgICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICAgICk7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMoc3JjUGF0aCkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCkpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnVsbFRleHQgPSBhd2FpdCByZWFkRmlsZShzcmNQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgY29udmVydGVkVGV4dCA9IE9iamVjdC5lbnRyaWVzKGNvbnZlcnRNYXApLnJlZHVjZShcbiAgICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiBhY2MucmVwbGFjZShgJFtbJHtrZXl9XV1gLCB2YWx1ZSksXG4gICAgICAgIGZ1bGxUZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCJzcmMvc2VydmljZXMvc29uYW11LnNoYXJlZC50c1wiKTtcblxuICAgICAgLy8g7KCV66eQIO2YueyLnOuCmOyngOunjCB0YXJnZXQg65SU66CJ7Yag66as64qUIOyeiOyWtOuPhCBzcmMvc2VydmljZXMg65SU66CJ7Yag66as64qUIOyXhuydhCDsiJgg7J6I7Jy866+A66GcIOuvuOumrCDsg53shLHtlbTspI3ri4jri6QuXG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSkpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZShkZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLndhcm4oYENyZWF0ZWQgZGlyZWN0b3J5ICcke3BhdGguZGlybmFtZShkZXN0UGF0aCl9JyBiZWNhdXNlIGl0IGRpZCBub3QgZXhpc3QuYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBhcmVGaWxlc1NhbWUoeyBkYXRhOiBjb252ZXJ0ZWRUZXh0IH0sIHsgcGF0aDogZGVzdFBhdGggfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShkZXN0UGF0aCwgY29udmVydGVkVGV4dCk7XG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZGVzdFBhdGgpKSxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFdvcmtmbG93cygpIHtcbiAgICB0aGlzLndvcmtmbG93cyA9IGF3YWl0IGxvYWRXb3JrZmxvd3MoKTtcbiAgICBhd2FpdCBTb25hbXUud29ya2Zsb3dzLnN5bmNocm9uaXplKHRoaXMud29ya2Zsb3dzKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkU1NSUm91dGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNzckNvbmZpZ1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9zc3JcIik7XG5cbiAgICAvLyDquLDsobQgcm91dGVzIOy0iOq4sO2ZlFxuICAgIGNvbnN0IHsgY2xlYXJTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICBjbGVhclNTUlJvdXRlcygpO1xuXG4gICAgLy8gc3NyIO2PtOuNlCDsl4bsnLzrqbQg7Iqk7YK1XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNzckNvbmZpZ1BhdGgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNzciDtj7TrjZQg7JWI7J2YIOuqqOuToCAudHMg7YyM7J28IOuhnOuTnFxuICAgIGNvbnN0IHsgZ2xvYkFzeW5jIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9hc3luYy11dGlsc1wiKTtcbiAgICBjb25zdCB7IGltcG9ydE1lbWJlcnMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2VzbS11dGlsc1wiKTtcbiAgICBjb25zdCB7IHJ1bnRpbWVQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9wYXRoLXV0aWxzXCIpO1xuXG4gICAgLy8gcnVudGltZVBhdGjrpbwg7IKs7Jqp7ZWY7JesIOqwnOuwnC/tlITroZzrjZXshZgg7ZmY6rK97JeQIOunnuuKlCDtmZXsnqXsnpAg7LKY66asXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBnbG9iQXN5bmMocGF0aC5qb2luKHNzckNvbmZpZ1BhdGgsIHJ1bnRpbWVQYXRoKFwiKiovKi50c1wiKSkpO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpbXBvcnRNZW1iZXJz66W8IOyCrOyaqe2VmOuptCDtjIzsnbzsnZggc2lkZSBlZmZlY3QocmVnaXN0ZXJTU1Ig7Zi47LacKeqwgCDsi6TtlonrkKhcbiAgICAgICAgYXdhaXQgaW1wb3J0TWVtYmVycyhmaWxlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvYWQgU1NSIHJvdXRlOiAke2ZpbGV9YCwgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPSBPYmplY3Qua2V5cyhkaWZmR3JvdXBzKTtcblxuICAgIC8vIFNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGjqsIAg67OA6rK965CcIOqyveyasFxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikgfHwgZGlmZlR5cGVzLmluY2x1ZGVzKFwidHlwZXNcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHMsIGRpZmZUeXBlcyk7XG4gICAgfVxuXG4gICAgLy8g7YOA6rKf7Jy866GcIOuzteyCrOunjCDtlZjrqbQg65CY64qUIO2MjOydvOydtCDrs4Dqsr3rkJwg6rK97JqwXG4gICAgaWYgKFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwidHlwZXNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImZ1bmN0aW9uc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZ2VuZXJhdGVkXCIpXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZVN5bmNhYmxlRmlsZUNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g66qo6424L+2UhOugiOyehCDqtaztmITssrTqsIAg67OA6rK965CcIOqyveyasFxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJtb2RlbFwiKSB8fCBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7ISk7KCVIO2MjOydvOydtCDrs4Dqsr3rkJwg6rK97JqwXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLy8g7JuM7YGs7ZSM66Gc7JqwIO2MjOydvOydtCDrs4Dqsr3rkJwg6rK97JqwXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIndvcmtmbG93XCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgfVxuXG4gICAgLy8gaTE4biDqtIDroKgg7YyM7J287J20IOuzgOqyveuQnCDqsr3smrBcbiAgICAvLyAtIGkxOG4vKi50czogbG9jYWxlIOuyiOyXrSDtjIzsnbxcbiAgICAvLyAtIGVudGl0eS5qc29uOiBlbnRpdHkgbGFiZWxzXG4gICAgLy8gLSBzb25hbXUuY29uZmlnLnRzOiBpMThuIOyEpOyglSAoZGVmYXVsdExvY2FsZSwgc3VwcG9ydGVkTG9jYWxlcylcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJpMThuXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jU0QoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pOiBEaWZmR3JvdXBzIHtcbiAgICBjb25zdCBmaWxlVHlwZXMgPSBPYmplY3Qua2V5cyhjaGVja3N1bVBhdHRlcm5Hcm91cCkgYXMgRmlsZVR5cGVbXTtcblxuICAgIHJldHVybiBncm91cChkaWZmRmlsZXMsIChmaWxlUGF0aCkgPT4ge1xuICAgICAgLy8g7KCI64yAIOqyveuhnOyXkOyEnCBzcmMv66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966GcIOu2gOu2hOydhCDstpTstpztlanri4jri6QuXG4gICAgICBjb25zdCBzcmNJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIvc3JjL1wiKTtcbiAgICAgIGlmIChzcmNJbmRleCA9PT0gLTEpIHJldHVybiBcInVua25vd25cIjtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnNsaWNlKHNyY0luZGV4ICsgMSk7IC8vIFwic3JjLy4uLlwiIO2Yle2DnFxuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVUeXBlIG9mIGZpbGVUeXBlcykge1xuICAgICAgICBpZiAobWluaW1hdGNoKHJlbGF0aXZlUGF0aCwgY2hlY2tzdW1QYXR0ZXJuR3JvdXBbZmlsZVR5cGVdKSkge1xuICAgICAgICAgIHJldHVybiBmaWxlVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVRydXRoU291cmNlQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZVRydXRoU291cmNlQ2hhbmdlc1wiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlQYXRoID0gZGlmZkdyb3Vwcy5lbnRpdHk/LmF0KDApO1xuICAgIGlmIChlbnRpdHlQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGVudGl0eVBhdGgpO1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlU3luY2FibGVGaWxlQ2hhbmdlcyhkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTxGaWxlVHlwZVtdPiB7XG4gICAgY29uc3QgdHNQYXRocyA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy50eXBlcyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5mdW5jdGlvbnMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICBdKTtcbiAgICBOYWl0ZS50KFwiaGFuZGxlU3luY2FibGVGaWxlQ2hhbmdlc1wiLCB7IGRpZmZHcm91cHMgfSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgdHlwZXMvZnVuY3Rpb25zL2dlbmVyYXRlZCBjaGFuZ2VzOiAke3RzUGF0aHMubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlSW1wbGVtZW50YXRpb25DaGFuZ2VzKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlSW1wbGVtZW50YXRpb25DaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCBtZXJnZWRHcm91cCA9IFsuLi4oZGlmZkdyb3Vwcy5tb2RlbCA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZyYW1lID8/IFtdKV07XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgbW9kZWwvZnJhbWUgY2hhbmdlczogJHttZXJnZWRHcm91cC5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKG1vZGVsUGF0aCk7XG4gICAgICAgIGFzc2VydChlbnRpdHlJZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5mcmFtZS50c1wiKSkge1xuICAgICAgICBjb25zdCBbLCBmcmFtZU5hbWVdID0gbW9kZWxQYXRoLm1hdGNoKC8uK1xcLyguKylcXC5mcmFtZVxcLnRzJC8pID8/IFtdO1xuICAgICAgICBhc3NlcnQoZnJhbWVOYW1lKTtcbiAgICAgICAgLy8gZnJhbWVOYW1l7J2EIFBhc2NhbENhc2XroZwg67OA7ZmYIChkYXNoYm9hcmQgLT4gRGFzaGJvYXJkKVxuICAgICAgICBjb25zdCBmcmFtZUlkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShmcmFtZU5hbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGZyYW1lSWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHJlYWNoYWJsZVwiKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhwYXJhbXMpO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVIdHRwcygpO1xuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTc3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIO2FnO2UjOumvyDtgqTsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIHRlbXBsYXRlS2V5IO2FnO2UjOumvyDtgqRcbiAgICogQHBhcmFtIGVudW1JZCDsl7TqsbDtmJUgSURcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZUtleTogVGVtcGxhdGVLZXksXG4gICAgZW51bUlkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgc3ViUGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nOyBpc0V4aXN0czogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGdlblBhdGggfSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpLmdldFRhcmdldEFuZFBhdGgoXG4gICAgICBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgIGVudW1JZCxcbiAgICApO1xuXG4gICAgY29uc3Qgc3ViUGF0aCA9IHBhdGguam9pbih0YXJnZXQsIGdlblBhdGgpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgc3ViUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YlBhdGgsXG4gICAgICBmdWxsUGF0aCxcbiAgICAgIGlzRXhpc3RzOiBhd2FpdCBleGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4+PjtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTRChTb25hbXUgRGljdGlvbmFyeSkg7YWc7ZSM66a/7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHN5bmNTRCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICBjb25zdCBpMThuQ29uZmlnID0gU29uYW11LmNvbmZpZy5pMThuO1xuXG4gICAgY29uc3QgdGFyZ2V0TGlzdCA9IFtcImFwaVwiLCAuLi50YXJnZXRzXSBhcyAoXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKVtdO1xuXG4gICAgY29uc3QgYXBpSTE4bkRpciA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIFNvbmFtdS5jb25maWcuYXBpLmRpciwgXCJzcmMvaTE4blwiKTtcblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldExpc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHdlYi9hcHDsnZgg6rK97JqwIGxvY2FsZSDtjIzsnbzrk6TsnYQgYXBp7JeQ7IScIOuzteyCrFxuICAgICAgICBpZiAodGFyZ2V0ICE9PSBcImFwaVwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zeW5jTG9jYWxlRmlsZXModGFyZ2V0LCBhcGlJMThuRGlyLCBpMThuQ29uZmlnLnN1cHBvcnRlZExvY2FsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcInNkXCIsIHsgdGFyZ2V0IH0sIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZ2VuZXJhdGUgU0QgdGVtcGxhdGUgZm9yICR7dGFyZ2V0fTpgLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYXBp7J2YIGxvY2FsZSDtjIzsnbzsnYQgd2ViL2FwcOycvOuhnCDrs7Xsgqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN5bmNMb2NhbGVGaWxlcyhcbiAgICB0YXJnZXQ6IHN0cmluZyxcbiAgICBhcGlJMThuRGlyOiBzdHJpbmcsXG4gICAgbG9jYWxlczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRhcmdldEkxOG5EaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwic3JjL2kxOG5cIik7XG5cbiAgICAvLyDrlJTroInthqDrpqzqsIAg7JeG7Jy866m0IOyDneyEsVxuICAgIGF3YWl0IG1rZGlyKHRhcmdldEkxOG5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBsb2NhbGUgb2YgbG9jYWxlcykge1xuICAgICAgY29uc3Qgc291cmNlRmlsZSA9IHBhdGguam9pbihhcGlJMThuRGlyLCBgJHtsb2NhbGV9LnRzYCk7XG4gICAgICBjb25zdCB0YXJnZXRGaWxlID0gcGF0aC5qb2luKHRhcmdldEkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcblxuICAgICAgYXdhaXQgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChzb3VyY2VGaWxlLCB0YXJnZXRGaWxlKTtcbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5jeWFuKGAke3RhcmdldH0vc3JjL2kxOG4vJHtsb2NhbGV9LnRzYCkpO1xuICAgIH1cbiAgfVxufVxuIl0sIm5hbWVzIjpbImhvdCIsImFzc2VydCIsImNoYWxrIiwiRXZlbnRFbWl0dGVyIiwibWtkaXIiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImluZmxlY3Rpb24iLCJtaW5pbWF0Y2giLCJwYXRoIiwiZ3JvdXAiLCJ1bmlxdWUiLCJyZWdpc3RlcmVkQXBpcyIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uIiwiTmFpdGUiLCJUZW1wbGF0ZU1hbmFnZXIiLCJUZW1wbGF0ZUtleSIsIm1hcEFzeW5jIiwicmVkdWNlQXN5bmMiLCJjZW50ZXJUZXh0IiwiaXNUZXN0IiwiY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZCIsImV4aXN0cyIsInJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIiwiYXJlRmlsZXNTYW1lIiwiZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zIiwicmVuZXdDaGVja3N1bXMiLCJnZW5lcmF0ZVRlbXBsYXRlIiwicmVuZGVyVGVtcGxhdGUiLCJjcmVhdGVFbnRpdHkiLCJkZWxFbnRpdHkiLCJjaGVja3N1bVBhdHRlcm5Hcm91cCIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJsb2FkQXBpcyIsImxvYWRNb2RlbHMiLCJsb2FkVHlwZXMiLCJsb2FkV29ya2Zsb3dzIiwiU3luY2VyQWN0aW9ucyIsIlN5bmNlciIsImFwaXMiLCJ0eXBlcyIsIm1vZGVscyIsIndvcmtmbG93cyIsIk1hcCIsImV2ZW50RW1pdHRlciIsInN5bmMiLCJ0YXJnZXRzIiwiY29uZmlnIiwiY29weVNoYXJlZFRvVGFyZ2V0cyIsImNoYW5nZWRGaWxlcyIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJibGFjayIsImJnR3JlZW4iLCJvdmVyd3JpdGUiLCJlIiwiZXJyb3IiLCJkb1N5bmNBY3Rpb25zIiwid2hlblRoaXNIYXBwZW5zIiwid2FpdEZvclVwVG8iLCJzeW5jRnJvbVdhdGNoZXIiLCJldmVudCIsImRpZmZGaWxlUGF0aCIsImluY2x1ZGVzIiwiYm9sZCIsInllbGxvdyIsImludmFsaWRhdGVGaWxlIiwiYXV0b2xvYWRTU1JSb3V0ZXMiLCJlbWl0IiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsInJlZCIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwiYXV0b2xvYWRXb3JrZmxvd3MiLCJlbmRzV2l0aCIsImVudGl0eUlkIiwiZ2V0RW50aXR5SWRGcm9tUGF0aCIsInRvUmVtb3ZlIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwic3BsaWNlIiwiaW5kZXhPZiIsImRpY3RVdGlsc1BhdGgiLCJqb2luIiwiZGlybmFtZSIsInJlcGxhY2UiLCJkaWN0VXRpbHNDb2RlIiwiY29udmVydE1hcCIsImJhc2VVcmwiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJob3N0IiwicG9ydCIsImRpY3RVdGlscyIsInRhcmdldCIsInNyY1BhdGgiLCJhcHBSb290UGF0aCIsIkVycm9yIiwiZnVsbFRleHQiLCJjb252ZXJ0ZWRUZXh0IiwiZW50cmllcyIsInJlZHVjZSIsImFjYyIsImtleSIsInZhbHVlIiwiZGVzdFBhdGgiLCJyZWN1cnNpdmUiLCJ3YXJuIiwiZGF0YSIsInN5bmNocm9uaXplIiwic3NyQ29uZmlnUGF0aCIsImNsZWFyU1NSUm91dGVzIiwiZ2xvYkFzeW5jIiwiaW1wb3J0TWVtYmVycyIsInJ1bnRpbWVQYXRoIiwiZmlsZXMiLCJmaWxlIiwiZGlmZkZpbGVQYXRocyIsImRpZmZHcm91cHMiLCJjYWxjdWxhdGVEaWZmR3JvdXBzIiwiZGlmZlR5cGVzIiwia2V5cyIsImhhbmRsZVRydXRoU291cmNlQ2hhbmdlcyIsImhhbmRsZVN5bmNhYmxlRmlsZUNoYW5nZXMiLCJoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMiLCJhY3Rpb25TeW5jQ29uZmlnIiwic3luY1NEIiwiZGlmZkZpbGVzIiwiZmlsZVR5cGVzIiwiZmlsZVBhdGgiLCJzcmNJbmRleCIsInJlbGF0aXZlUGF0aCIsInNsaWNlIiwiZmlsZVR5cGUiLCJ0IiwicmVsb2FkIiwiZW50aXR5UGF0aCIsImVudGl0eSIsImF0IiwidW5kZWZpbmVkIiwiZ2V0IiwidHlwZUZpbGVQYXRoIiwibmFtZXMiLCJmcyIsInBhcmVudElkIiwiYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiZ2VuZXJhdGVkIiwicHVzaCIsInRzUGF0aHMiLCJmdW5jdGlvbnMiLCJhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMiLCJtZXJnZWRHcm91cCIsIm1vZGVsIiwiZnJhbWUiLCJwYXJhbXMiLCJtYXAiLCJtb2RlbFBhdGgiLCJuYW1lc1JlY29yZCIsImdldE5hbWVzRnJvbUlkIiwiZnJhbWVOYW1lIiwibWF0Y2giLCJmcmFtZUlkIiwiY2FtZWxpemUiLCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiYWN0aW9uR2VuZXJhdGVIdHRwcyIsImFjdGlvbkdlbmVyYXRlU3NyIiwiY2hlY2tFeGlzdHNHZW5Db2RlIiwidGVtcGxhdGVLZXkiLCJlbnVtSWQiLCJnZW5QYXRoIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsInN1YlBhdGgiLCJmdWxsUGF0aCIsImlzRXhpc3RzIiwiY2hlY2tFeGlzdHMiLCJlbnVtcyIsIm9wdGlvbnMiLCJlbnVtc0tleXMiLCJuYW1lIiwiY29uc3RhbnQiLCJyZXN1bHQiLCJ0cGwiLCJzdGFydHNXaXRoIiwiY29tcG9uZW50SWQiLCJwIiwiZm9ybSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiLCJpMThuQ29uZmlnIiwiaTE4biIsInRhcmdldExpc3QiLCJhcGlJMThuRGlyIiwiZGlyIiwic3luY0xvY2FsZUZpbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsImxvY2FsZXMiLCJ0YXJnZXRJMThuRGlyIiwibG9jYWxlIiwic291cmNlRmlsZSIsInRhcmdldEZpbGUiLCJjeWFuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsWUFBWSxRQUFRLFNBQVM7QUFDdEMsU0FBU0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUN6RCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxTQUFTLFFBQVEsWUFBWTtBQUN0QyxPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsS0FBSyxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUd4QyxTQUFTQyxjQUFjLFFBQVEsdUJBQW9CO0FBQ25ELFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFnQyw4QkFBMkI7QUFDakYsU0FBU0MseUJBQXlCLFFBQVEsaUNBQThCO0FBQ3hFLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0MsZUFBZSxRQUFRLGtDQUErQjtBQUUvRCxTQUFTQyxXQUFXLFFBQThCLG9CQUFpQjtBQUNuRSxTQUFTQyxRQUFRLEVBQUVDLFdBQVcsUUFBUSwwQkFBdUI7QUFDN0QsU0FBU0MsVUFBVSxRQUFRLDJCQUF3QjtBQUNuRCxTQUFTQyxNQUFNLFFBQVEseUJBQXNCO0FBQzdDLFNBQVNDLCtCQUErQixFQUFFQyxNQUFNLFFBQVEsdUJBQW9CO0FBRTVFLFNBQVNDLHVCQUF1QixRQUFRLDRCQUF5QjtBQUNqRSxT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
485
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJlZEFwaXMgfSBmcm9tIFwiLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkLCBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgY2hlY2tzdW1QYXR0ZXJuR3JvdXAsXG4gIHR5cGUgRmlsZVR5cGUsXG4gIGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgsXG59IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTG9hZGVkQXBpcyxcbiAgdHlwZSBMb2FkZWRNb2RlbHMsXG4gIHR5cGUgTG9hZGVkVHlwZXMsXG4gIGxvYWRBcGlzLFxuICBsb2FkTW9kZWxzLFxuICBsb2FkVHlwZXMsXG4gIGxvYWRXb3JrZmxvd3MsXG59IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCAqIGFzIFN5bmNlckFjdGlvbnMgZnJvbSBcIi4vc3luY2VyLWFjdGlvbnNcIjtcblxudHlwZSBEaWZmR3JvdXBzID0ge1xuICBba2V5IGluIEZpbGVUeXBlXTogQWJzb2x1dGVQYXRoW107XG59O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIHNvbmFtdS5zaGFyZWQudHPripQg7YyM7J287J20IOyXhuydhCDrlYzrp4wgMe2ajCDsg53shLHtlZjqs6AsIOydtO2bhOyXkOuKlCDrja7slrTsk7Dsp4Ag7JWK7Iq164uI64ukLlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcblxuICAgIC8vIHNvbmFtdS5zaGFyZWQudHPripQg7YyM7J287J20IOyXhuydhCDrlYzrp4wgMe2ajCDsg53shLHtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5jb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHMpO1xuXG4gICAgLy8g6re4IOuLpOydjOu2gO2EsOuKlCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyVhOyEnCDrj5nquLDtmZQg7J6R7JeF7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTtcbiAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KFwiQWxsIGZpbGVzIGFyZSBzeW5jZWQhXCIpKSk7XG5cbiAgICAgIC8vIOuzgOqyveyCrO2VreydtCDsl4bslrTrj4QgU1NSIO2FnO2UjOumv+ydgCDsg53shLEgKOy0iOq4sCDshKTsoJUg7IucLCDsnbTrr7gg7KG07J6s7ZWY66m0IOyKpO2CtSlcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJxdWVyaWVzXCIsIHt9LCB7IG92ZXJ3cml0ZTogZmFsc2UgfSk7XG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJlbnRyeV9zZXJ2ZXJcIiwge30sIHsgb3ZlcndyaXRlOiBmYWxzZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8g7YyM7J287J20IOydtOuvuCDsobTsnqztlZjrqbQg66y07IucXG4gICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZ2VuZXJhdGUgU1NSIHRlbXBsYXRlczpcIiwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOunjOyVvSDsi7Htgawg7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73snLzrqbQg6rys7Jes67KE66as6riwIOuVjOusuOyXkCxcbiAgICAvLyDsi5zqt7jrhJDsl5Drj4Qg7J6g7IucIOuyhO2LuCDsiJgg7J6I64qUIO2ZmOqyvSDsho3sl5DshJwg7Iux7YGs66W8IOyLpO2Wie2VqeuLiOuLpC5cbiAgICBhd2FpdCBydW5XaXRoR3JhY2VmdWxTaHV0ZG93bihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g7JaY6rCAIOyLse2BrCDsnpHsl4Ug7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKGNoYW5nZWRGaWxlcyk7XG5cbiAgICAgICAgLy8g7Iux7YGsIOyVoeyFmOydtCDrgZ3rgpjrqbQg7ZWt7IOBIOyytO2BrOyErOydhCDri6Tsi5wg6rCx7Iug7ZWp64uI64ukLlxuICAgICAgICBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICAgICAgfSxcbiAgICAgIHsgd2hlblRoaXNIYXBwZW5zOiBcIlNJR1VTUjJcIiwgd2FpdEZvclVwVG86IDIwMDAwIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIOqwkOyngO2VnCDtjIzsnbwg67OA6rK9IOyCrO2VreyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog7KO87Ja07KeEIOuzgOqyvSDtjIzsnbzrk6Qg7KSRIOyytO2BrOyErCDqtIDrpqwg64yA7IOB7J24IOqyg+uTpOunjCDqsIDsoLjri6TqsIAg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog7LK07YGs7ISsIO2MjOydvCDsl4XrjbDsnbTtirjripQg7Jes6riw7JeQ7IScIO2VmOyngCDslYrsirXri4jri6QuIO2YuOy2nOyekOqwgCDtlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGggLSDrs4Dqsr0g7YyM7J2865OkLiDtlITroZzsoJ3tirgg66Oo7Yq467aA7YSwIFwic3JjL1wiIOuYkOuKlCBcImRpc3QvXCLroZwg7Iuc7J6R7ZWY64qUIOyDgeuMgCDqsr3roZzsnoXri4jri6QuIOyYiOyLnDogXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAgICovXG4gIGFzeW5jIHN5bmNGcm9tV2F0Y2hlcihldmVudDogc3RyaW5nLCBkaWZmRmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChldmVudCAhPT0gXCJjaGFuZ2VcIiAmJiBldmVudCAhPT0gXCJhZGRcIiAmJiBldmVudCAhPT0gXCJ1bmxpbmtcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNTUiDshKTsoJUg7YyM7J28IOuzgOqyvSDqsJDsp4BcbiAgICBpZiAoZGlmZkZpbGVQYXRoLmluY2x1ZGVzKFwiL3NyYy9zc3IvXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLnllbGxvdyhcIlNTUiBjb25maWcgY2hhbmdlZCAtIHJlbG9hZGluZy4uLlwiKSk7XG4gICAgICAvLyBTU1Ig7YyM7J2864+EIGludmFsaWRhdGUg7ZuEIHJlbG9hZFxuICAgICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgICBhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmF1dG9sb2FkU1NSUm91dGVzKCk7XG4gICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7J2864uoIOuzgOqyveuQnCDtjIzsnbzqs7wgZGVwZW5kZW50IO2MjOydvOuTpOydhCBpbnZhbGlkYXRlIO2VqeuLiOuLpC5cbiAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAvLyDqt7jrn6zri4gg7JWI7Ius7ZWY6rOgIGludmFsaWRhdGUg7ZW064+EIOuQqeuLiOuLpC5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGhvdC5pbnZhbGlkYXRlRmlsZeyLnCDstIjquLAg7JeQ65+s6rCAIOuwnOyDne2VmOq4sCDrlYzrrLjsl5AgaW52YWxpZGF0ZSDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGNvbnN0IGludmFsaWRhdGVkUGF0aHMgPSAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKGRpZmZGaWxlUGF0aCwgZXZlbnQpKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICAgICAgaWYgKGludmFsaWRhdGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGDwn5SEIEludmFsaWRhdGVkOmApKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGludmFsaWRhdGVkUGF0aCBvZiBpbnZhbGlkYXRlZFBhdGhzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOunjOyVvSBtb2RlbC50cyDtjIzsnbzsnbQg67OA6rK9KGludmFsaWRhdGUp65CY7JeI64ukPyDqt7jrn6zrqbQgcmVnaXN0ZXJlZEFwaXMg7KSR7JeQ7IScIOydtCDrqqjrjbjsl5Ag7ZW064u57ZWY64qUIGFwaeuTpOydgCDsp4Dsm4zspJjsmpQuXG4gICAgICAgICAgICAvLyByZWdpc3RlcmVkQXBpc+uKlCDthrXsnLzroZwg64ukIOuCoOugpOuyhOumtCDsiJgg7JeG7Iq164uI64ukLiByZWdpc3RlcmVkQXBpc+yXkCDsmKzrnbzsmKTripQg7Lmc6rWs65Ok7J2AIOy0iOq4sCDroZzrk5zsi5wg65iQ64qUIEhNUuyLnOyXkOunjCDrk7HroZ3rkJjquLAg65WM66y47J6F64uI64ukLlxuICAgICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRBcGlzID0gdGhpcy5yZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKGludmFsaWRhdGVkUGF0aCk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZEFwaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCksXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JheShgKHdpdGggJHtyZW1vdmVkQXBpcy5sZW5ndGh9IEFQSXMpYCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byByZW1vdmUgaW52YWxpZGF0ZWQgcmVnaXN0ZXJlZCBBUElzIGZvciAke2ludmFsaWRhdGVkUGF0aH1gKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNJbkNoZWNrUGF0dGVybkdyb3VwID0gT2JqZWN0LnZhbHVlcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLnNvbWUoXG4gICAgICAocGF0dGVybikgPT4gbWluaW1hdGNoKGRpZmZGaWxlUGF0aCwgcGF0dGVybiksXG4gICAgKTtcblxuICAgIC8vIO2VoCDsnbwoc3luYynsnbQg7J6I7Jy866m0IO2VqeuLiOuLpC5cbiAgICBpZiAoaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoW2RpZmZGaWxlUGF0aF0pO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64KY66m0IOuqqOuToCDrqqjrk4jsnYQg66Gc65Oc7ZWp64uI64ukLlxuICAgIC8vIGhtci1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFdvcmtmbG93cygpO1xuXG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICBpZiAoIWludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiIC8q7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLiovKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7ZW50aXR5SWR9TW9kZWxgKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHBsdXJhbC50cyDrgrTsmqnsnYQg7J297Ja07IScIHNoYXJlZCDtjIzsnbzsl5Ag7IK97J6F7ZWp64uI64ukLlxuICAgIGNvbnN0IGRpY3RVdGlsc1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICBpbXBvcnQubWV0YS5kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKSxcbiAgICAgIFwiLi4vZGljdC91dGlscy50c1wiLFxuICAgICk7XG4gICAgY29uc3QgZGljdFV0aWxzQ29kZSA9IChhd2FpdCBleGlzdHMoZGljdFV0aWxzUGF0aCkpXG4gICAgICA/IGF3YWl0IHJlYWRGaWxlKGRpY3RVdGlsc1BhdGgsIFwidXRmLThcIilcbiAgICAgIDogXCJcIjtcblxuICAgIC8vIO2KueyglSDrs4DsiJgg7LmY7ZmY7J2EIOychO2VtOyEnCDsgqzsmqntlanri4jri6QuXG4gICAgY29uc3QgY29udmVydE1hcCA9IHtcbiAgICAgIGJhc2VVcmw6XG4gICAgICAgIFNvbmFtdS5jb25maWcuc2VydmVyLmJhc2VVcmwgPz9cbiAgICAgICAgYGh0dHA6Ly8ke1NvbmFtdS5jb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke1NvbmFtdS5jb25maWcuc2VydmVyLmxpc3Rlbj8ucG9ydCA/PyAzMDAwfWAsXG4gICAgICBkaWN0VXRpbHM6IGRpY3RVdGlsc0NvZGUsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIOyngOq4iCDqsIDsoLjqsIDroKTripQg7J20IO2MjOydvOydgCBTb25hbXUg7L2U65Oc67Kg7J207Iqk7J2YIOydvOu2gOyeheuLiOuLpC5cbiAgICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgL3NyYy/sl5DshJwg7LC+7Iq164uI64ukLlxuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICAgIGAuLi9zaGFyZWQvJHt0YXJnZXR9LnNoYXJlZC50cy50eHRgLFxuICAgICAgKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0KSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVHJpZWQgdG8gY29weSBzb25hbXUuc2hhcmVkLnRzIHRvIHRhcmdldCAnJHt0YXJnZXR9JyBidXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjaGVjayB5b3VyIHByb2plY3QgZGlyZWN0b3J5IHN0cnVjdHVyZS5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmdWxsVGV4dCA9IGF3YWl0IHJlYWRGaWxlKHNyY1BhdGgsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRUZXh0ID0gT2JqZWN0LmVudHJpZXMoY29udmVydE1hcCkucmVkdWNlKFxuICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IGFjYy5yZXBsYWNlKGAkW1ske2tleX1dXWAsIHZhbHVlKSxcbiAgICAgICAgZnVsbFRleHQsXG4gICAgICApO1xuXG4gICAgICAvLyDsnbTqsbQg7ZSE66Gc7KCd7Yq47JeQIC50cyDshozsiqQg7L2U65OcIO2MjOydvOydhCDsg53shLHtlZjripQg6rKD7J2066+A66GcIHNyY+ydmCAudHMg6rK966Gc66GcIOqwkeuLiOuLpC5cbiAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRzXCIpO1xuXG4gICAgICAvLyDsoJXrp5Ag7Zi57Iuc64KY7KeA66eMIHRhcmdldCDrlJTroInthqDrpqzripQg7J6I7Ja064+EIHNyYy9zZXJ2aWNlcyDrlJTroInthqDrpqzripQg7JeG7J2EIOyImCDsnojsnLzrr4DroZwg66+466asIOyDneyEse2VtOykjeuLiOuLpC5cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmRpcm5hbWUoZGVzdFBhdGgpKSkpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ3JlYXRlZCBkaXJlY3RvcnkgJyR7cGF0aC5kaXJuYW1lKGRlc3RQYXRoKX0nIGJlY2F1c2UgaXQgZGlkIG5vdCBleGlzdC5gKTtcbiAgICAgIH1cblxuICAgICAgLy8g7YyM7J287J20IOydtOuvuCDsobTsnqztlZjrqbQg6rG064SI65yB64uI64ukLlxuICAgICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDtlITroZzsoJ3tirjsl5DshJwg7J6Q7Jyg66Gt6rKMIOy7pOyKpO2EsOuniOydtOynle2VoCDsiJgg7J6I7Ja07JW8IO2VmOuvgOuhnCxcbiAgICAgIC8vIOy1nOy0iCAx7ZqM66eMIOyDneyEse2VmOqzoCDsnbTtm4Tsl5DripQg642u7Ja07JOw7KeAIOyViuyKteuLiOuLpC5cbiAgICAgIC8vIO2FnO2UjOumvyDrgrTsmqkoJFtbZGljdFV0aWxzXV0g65OxKeydtCDrs4Dqsr3rkJjsl4jsnYQg65WMIOuwmOyYgeydtCDtlYTsmpTtlZjrqbQsXG4gICAgICAvLyDtlbTri7kg7YyM7J287J2EIOyCreygnO2VnCDrkqQgYHBucG0gc29uYW11IHN5bmNg66GcIOyerOyDneyEse2VmOuptCDrkKnri4jri6QuXG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKGRlc3RQYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKGRlc3RQYXRoLCBjb252ZXJ0ZWRUZXh0KTtcbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBkZXN0UGF0aCkpLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkVHlwZXMoKSB7XG4gICAgdGhpcy50eXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRNb2RlbHMoKSB7XG4gICAgdGhpcy5tb2RlbHMgPSBhd2FpdCBsb2FkTW9kZWxzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZEFwaXMoKSB7XG4gICAgdGhpcy5hcGlzID0gYXdhaXQgbG9hZEFwaXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkV29ya2Zsb3dzKCkge1xuICAgIHRoaXMud29ya2Zsb3dzID0gYXdhaXQgbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IFNvbmFtdS53b3JrZmxvd3Muc3luY2hyb25pemUodGhpcy53b3JrZmxvd3MpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRTU1JSb3V0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3NyQ29uZmlnUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL3NzclwiKTtcblxuICAgIC8vIOq4sOyhtCByb3V0ZXMg7LSI6riw7ZmUXG4gICAgY29uc3QgeyBjbGVhclNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgIGNsZWFyU1NSUm91dGVzKCk7XG5cbiAgICAvLyBzc3Ig7Y+0642UIOyXhuycvOuptCDsiqTtgrVcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoc3NyQ29uZmlnUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3NyIO2PtOuNlCDslYjsnZgg66qo65OgIC50cyDtjIzsnbwg66Gc65OcXG4gICAgY29uc3QgeyBnbG9iQXN5bmMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgaW1wb3J0TWVtYmVycyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZXNtLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgcnVudGltZVBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIik7XG5cbiAgICAvLyBydW50aW1lUGF0aOulvCDsgqzsmqntlZjsl6wg6rCc67CcL+2UhOuhnOuNleyFmCDtmZjqsr3sl5Ag66ee64qUIO2ZleyepeyekCDsspjrpqxcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhwYXRoLmpvaW4oc3NyQ29uZmlnUGF0aCwgcnVudGltZVBhdGgoXCIqKi8qLnRzXCIpKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZWY66m0IO2MjOydvOydmCBzaWRlIGVmZmVjdChyZWdpc3RlclNTUiDtmLjstpwp6rCAIOyLpO2WieuQqFxuICAgICAgICBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTU1Igcm91dGU6ICR7ZmlsZX1gLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IHN0cmluZ1tdIH0+IHtcbiAgICBjb25zdCBkaWZmR3JvdXBzID0gdGhpcy5jYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlUGF0aHMpO1xuICAgIGNvbnN0IGRpZmZUeXBlcyA9IE9iamVjdC5rZXlzKGRpZmZHcm91cHMpO1xuXG4gICAgLy8gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aOqwgCDrs4Dqsr3rkJwg6rK97JqwXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImVudGl0eVwiKSB8fCBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMoZGlmZkdyb3VwcywgZGlmZlR5cGVzKTtcbiAgICB9XG5cbiAgICAvLyDtg4Dqsp/snLzroZwg67O17IKs66eMIO2VmOuptCDrkJjripQg7YyM7J287J20IOuzgOqyveuQnCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnVuY3Rpb25zXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZWRcIilcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU3luY2FibGVGaWxlQ2hhbmdlcyhkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDrqqjrjbgv7ZSE66CI7J6EIOq1rO2YhOyytOqwgCDrs4Dqsr3rkJwg6rK97JqwXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIm1vZGVsXCIpIHx8IGRpZmZUeXBlcy5pbmNsdWRlcyhcImZyYW1lXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmhhbmRsZUltcGxlbWVudGF0aW9uQ2hhbmdlcyhkaWZmR3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyDshKTsoJUg7YyM7J287J20IOuzgOqyveuQnCDqsr3smrBcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCBTeW5jZXJBY3Rpb25zLmFjdGlvblN5bmNDb25maWcoKTtcbiAgICB9XG5cbiAgICAvLyDsm4ztgaztlIzroZzsmrAg7YyM7J287J20IOuzgOqyveuQnCDqsr3smrBcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwid29ya2Zsb3dcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICB9XG5cbiAgICAvLyBpMThuIOq0gOugqCDtjIzsnbzsnbQg67OA6rK965CcIOqyveyasFxuICAgIC8vIC0gaTE4bi8qLnRzOiBsb2NhbGUg67KI7JetIO2MjOydvFxuICAgIC8vIC0gZW50aXR5Lmpzb246IGVudGl0eSBsYWJlbHNcbiAgICAvLyAtIHNvbmFtdS5jb25maWcudHM6IGkxOG4g7ISk7KCVIChkZWZhdWx0TG9jYWxlLCBzdXBwb3J0ZWRMb2NhbGVzKVxuICAgIGlmIChcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImkxOG5cIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImVudGl0eVwiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiY29uZmlnXCIpXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNTRCgpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaWZmVHlwZXMsXG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVzOiBBYnNvbHV0ZVBhdGhbXSk6IERpZmZHcm91cHMge1xuICAgIGNvbnN0IGZpbGVUeXBlcyA9IE9iamVjdC5rZXlzKGNoZWNrc3VtUGF0dGVybkdyb3VwKSBhcyBGaWxlVHlwZVtdO1xuXG4gICAgcmV0dXJuIGdyb3VwKGRpZmZGaWxlcywgKGZpbGVQYXRoKSA9PiB7XG4gICAgICAvLyDsoIjrjIAg6rK966Gc7JeQ7IScIHNyYy/roZwg7Iuc7J6R7ZWY64qUIOyDgeuMgCDqsr3roZwg67aA67aE7J2EIOy2lOy2nO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHNyY0luZGV4ID0gZmlsZVBhdGguaW5kZXhPZihcIi9zcmMvXCIpO1xuICAgICAgaWYgKHNyY0luZGV4ID09PSAtMSkgcmV0dXJuIFwidW5rbm93blwiO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGguc2xpY2Uoc3JjSW5kZXggKyAxKTsgLy8gXCJzcmMvLi4uXCIg7ZiV7YOcXG5cbiAgICAgIGZvciAoY29uc3QgZmlsZVR5cGUgb2YgZmlsZVR5cGVzKSB7XG4gICAgICAgIGlmIChtaW5pbWF0Y2gocmVsYXRpdmVQYXRoLCBjaGVja3N1bVBhdHRlcm5Hcm91cFtmaWxlVHlwZV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZpbGVUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgfSkgYXMgdW5rbm93biBhcyBEaWZmR3JvdXBzO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzKGRpZmZHcm91cHM6IERpZmZHcm91cHMsIGRpZmZUeXBlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlVHJ1dGhTb3VyY2VDaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcywgZGlmZlR5cGVzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eVBhdGggPSBkaWZmR3JvdXBzLmVudGl0eT8uYXQoMCk7XG4gICAgaWYgKGVudGl0eVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZW50aXR5UGF0aCk7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAvLyDtlITroZzsoJ3tirjsl5Ag7IOd7ISx65CY7Ja07JW8IO2VmOuKlCAudHMg7YyM7J287J2YIOqyveuhnOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IHR5cGVGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLmZzfS8ke2VudGl0eS5uYW1lcy5mc30udHlwZXMudHNgLFxuICAgICAgKTtcbiAgICAgIGlmIChlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiAhKGF3YWl0IGV4aXN0cyh0eXBlRmlsZVBhdGgpKSkge1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiaW5pdF90eXBlc1wiLCB7IGVudGl0eUlkIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IFN5bmNlckFjdGlvbnMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk7XG5cbiAgICBkaWZmR3JvdXBzLmdlbmVyYXRlZCA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvYXBwbGljYXRpb24vc29uYW11LmdlbmVyYXRlZC50c1wiKSBhcyBBYnNvbHV0ZVBhdGgsXG4gICAgXSk7XG4gICAgZGlmZlR5cGVzLnB1c2goXCJnZW5lcmF0ZWRcIik7XG4gIH1cblxuICBhc3luYyBoYW5kbGVTeW5jYWJsZUZpbGVDaGFuZ2VzKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVTeW5jYWJsZUZpbGVDaGFuZ2VzXCIsIHsgZGlmZkdyb3VwcyB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyB0eXBlcy9mdW5jdGlvbnMvZ2VuZXJhdGVkIGNoYW5nZXM6ICR7dHNQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRocyk7XG5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhc3luYyBoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXMoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVJbXBsZW1lbnRhdGlvbkNoYW5nZXNcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IG1lcmdlZEdyb3VwID0gWy4uLihkaWZmR3JvdXBzLm1vZGVsID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnJhbWUgPz8gW10pXTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyBtb2RlbC9mcmFtZSBjaGFuZ2VzOiAke21lcmdlZEdyb3VwLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICAvLyBnZW5lcmF0ZWRfaHR0cC50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIudHlwZXPrpbwg7JSB64uI64ukLlxuICAgIC8vIHNlcnZpY2UudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLmFwaXPrpbwg7JSB64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgY29uc3QgcGFyYW1zOiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdID0gbWVyZ2VkR3JvdXAubWFwKChtb2RlbFBhdGgpID0+IHtcbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIikpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgobW9kZWxQYXRoKTtcbiAgICAgICAgYXNzZXJ0KGVudGl0eUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IFssIGZyYW1lTmFtZV0gPSBtb2RlbFBhdGgubWF0Y2goLy4rXFwvKC4rKVxcLmZyYW1lXFwudHMkLykgPz8gW107XG4gICAgICAgIGFzc2VydChmcmFtZU5hbWUpO1xuICAgICAgICAvLyBmcmFtZU5hbWXsnYQgUGFzY2FsQ2FzZeuhnCDrs4DtmZggKGRhc2hib2FyZCAtPiBEYXNoYm9hcmQpXG4gICAgICAgIGNvbnN0IGZyYW1lSWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGZyYW1lTmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZnJhbWVJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG4gICAgYXdhaXQgU3luY2VyQWN0aW9ucy5hY3Rpb25HZW5lcmF0ZVNzcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IGV4aXN0cyhmdWxsUGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIOyXtOqxsO2YleyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gZW51bXMg7Je06rGw7ZiVIOugiOydtOu4lFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgZW51bXM6IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB6LlpvZEVudW08UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPj4+O1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKTtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGlmICh0YXJnZXQuaW5jbHVkZXMoXCI6dGFyZ2V0XCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmModGFyZ2V0cywgYXN5bmMgKHQpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke3R9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldC5yZXBsYWNlKFwiOnRhcmdldFwiLCB0KSwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVudGl0eShmb3JtOiBUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0pIHtcbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlRW50aXR5KGZvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZGVsRW50aXR5KGVudGl0eUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVsUGF0aHM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4gYXdhaXQgZGVsRW50aXR5KGVudGl0eUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVGVtcGxhdGU8VCBleHRlbmRzIFRlbXBsYXRlS2V5PihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICAgX2dlbmVyYXRlT3B0aW9ucz86IEdlbmVyYXRlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zLCBfZ2VuZXJhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgKTogUHJvbWlzZTxQYXRoQW5kQ29kZVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNEKFNvbmFtdSBEaWN0aW9uYXJ5KSDthZztlIzrpr/snYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgc3luY1NEKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB0YXJnZXRMaXN0ID0gW1wiYXBpXCIsIC4uLnRhcmdldHNdIGFzIChcImFwaVwiIHwgXCJ3ZWJcIiB8IFwiYXBwXCIpW107XG5cbiAgICBjb25zdCBhcGlJMThuRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgU29uYW11LmNvbmZpZy5hcGkuZGlyLCBcInNyYy9pMThuXCIpO1xuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0TGlzdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gd2ViL2FwcOydmCDqsr3smrAgbG9jYWxlIO2MjOydvOuTpOydhCBhcGnsl5DshJwg67O17IKsXG4gICAgICAgIGlmICh0YXJnZXQgIT09IFwiYXBpXCIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNMb2NhbGVGaWxlcyh0YXJnZXQsIGFwaUkxOG5EaXIsIGkxOG5Db25maWcuc3VwcG9ydGVkTG9jYWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwic2RcIiwgeyB0YXJnZXQgfSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBnZW5lcmF0ZSBTRCB0ZW1wbGF0ZSBmb3IgJHt0YXJnZXR9OmAsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBhcGnsnZggbG9jYWxlIO2MjOydvOydhCB3ZWIvYXBw7Jy866GcIOuzteyCrO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc3luY0xvY2FsZUZpbGVzKFxuICAgIHRhcmdldDogc3RyaW5nLFxuICAgIGFwaUkxOG5EaXI6IHN0cmluZyxcbiAgICBsb2NhbGVzOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFyZ2V0STE4bkRpciA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCJzcmMvaTE4blwiKTtcblxuICAgIC8vIOuUlOugie2GoOumrOqwgCDsl4bsnLzrqbQg7IOd7ISxXG4gICAgYXdhaXQgbWtkaXIodGFyZ2V0STE4bkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2VGaWxlID0gcGF0aC5qb2luKGFwaUkxOG5EaXIsIGAke2xvY2FsZX0udHNgKTtcbiAgICAgIGNvbnN0IHRhcmdldEZpbGUgPSBwYXRoLmpvaW4odGFyZ2V0STE4bkRpciwgYCR7bG9jYWxlfS50c2ApO1xuXG4gICAgICBjb25zdCBzeW5jSGVhZGVyID0gW1xuICAgICAgICBcIi8qKlwiLFxuICAgICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgICAgXCIgKiBBUEnsl5DshJwg64+Z6riw7ZmU65CcIO2MjOydvOyeheuLiOuLpC4g7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICAgIFwiICovXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICBhd2FpdCBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKHNvdXJjZUZpbGUsIHRhcmdldEZpbGUsIHN5bmNIZWFkZXIpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmN5YW4oYCR7dGFyZ2V0fS9zcmMvaTE4bi8ke2xvY2FsZX0udHNgKSk7XG4gICAgfVxuICB9XG59XG4iXSwibmFtZXMiOlsiaG90IiwiYXNzZXJ0IiwiY2hhbGsiLCJFdmVudEVtaXR0ZXIiLCJta2RpciIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwiaW5mbGVjdGlvbiIsIm1pbmltYXRjaCIsInBhdGgiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIkFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24iLCJOYWl0ZSIsIlRlbXBsYXRlTWFuYWdlciIsIlRlbXBsYXRlS2V5IiwibWFwQXN5bmMiLCJyZWR1Y2VBc3luYyIsImNlbnRlclRleHQiLCJpc1Rlc3QiLCJjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIiwiZXhpc3RzIiwicnVuV2l0aEdyYWNlZnVsU2h1dGRvd24iLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJyZW5ld0NoZWNrc3VtcyIsImdlbmVyYXRlVGVtcGxhdGUiLCJyZW5kZXJUZW1wbGF0ZSIsImNyZWF0ZUVudGl0eSIsImRlbEVudGl0eSIsImNoZWNrc3VtUGF0dGVybkdyb3VwIiwiZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCIsImxvYWRBcGlzIiwibG9hZE1vZGVscyIsImxvYWRUeXBlcyIsImxvYWRXb3JrZmxvd3MiLCJTeW5jZXJBY3Rpb25zIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwid29ya2Zsb3dzIiwiTWFwIiwiZXZlbnRFbWl0dGVyIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsIm92ZXJ3cml0ZSIsImUiLCJlcnJvciIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW5jbHVkZXMiLCJib2xkIiwieWVsbG93IiwiaW52YWxpZGF0ZUZpbGUiLCJhdXRvbG9hZFNTUlJvdXRlcyIsImVtaXQiLCJpbnZhbGlkYXRlZFBhdGhzIiwiaW52YWxpZGF0ZWRQYXRoIiwicmVtb3ZlZEFwaXMiLCJyZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzIiwiYmx1ZSIsInJlbGF0aXZlIiwiYXBpUm9vdFBhdGgiLCJncmF5IiwicmVkIiwiaXNJbkNoZWNrUGF0dGVybkdyb3VwIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsInBhdHRlcm4iLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJhdXRvbG9hZFdvcmtmbG93cyIsImVuZHNXaXRoIiwiZW50aXR5SWQiLCJnZXRFbnRpdHlJZEZyb21QYXRoIiwidG9SZW1vdmUiLCJmaWx0ZXIiLCJhcGkiLCJtb2RlbE5hbWUiLCJzcGxpY2UiLCJpbmRleE9mIiwiZGljdFV0aWxzUGF0aCIsImpvaW4iLCJkaXJuYW1lIiwicmVwbGFjZSIsImRpY3RVdGlsc0NvZGUiLCJjb252ZXJ0TWFwIiwiYmFzZVVybCIsInNlcnZlciIsImxpc3RlbiIsImhvc3QiLCJwb3J0IiwiZGljdFV0aWxzIiwidGFyZ2V0Iiwic3JjUGF0aCIsImFwcFJvb3RQYXRoIiwiRXJyb3IiLCJmdWxsVGV4dCIsImNvbnZlcnRlZFRleHQiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwia2V5IiwidmFsdWUiLCJkZXN0UGF0aCIsInJlY3Vyc2l2ZSIsIndhcm4iLCJzeW5jaHJvbml6ZSIsInNzckNvbmZpZ1BhdGgiLCJjbGVhclNTUlJvdXRlcyIsImdsb2JBc3luYyIsImltcG9ydE1lbWJlcnMiLCJydW50aW1lUGF0aCIsImZpbGVzIiwiZmlsZSIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJoYW5kbGVUcnV0aFNvdXJjZUNoYW5nZXMiLCJoYW5kbGVTeW5jYWJsZUZpbGVDaGFuZ2VzIiwiaGFuZGxlSW1wbGVtZW50YXRpb25DaGFuZ2VzIiwiYWN0aW9uU3luY0NvbmZpZyIsInN5bmNTRCIsImRpZmZGaWxlcyIsImZpbGVUeXBlcyIsImZpbGVQYXRoIiwic3JjSW5kZXgiLCJyZWxhdGl2ZVBhdGgiLCJzbGljZSIsImZpbGVUeXBlIiwidCIsInJlbG9hZCIsImVudGl0eVBhdGgiLCJlbnRpdHkiLCJhdCIsInVuZGVmaW5lZCIsImdldCIsInR5cGVGaWxlUGF0aCIsIm5hbWVzIiwiZnMiLCJwYXJlbnRJZCIsImFjdGlvbkdlbmVyYXRlU2NoZW1hcyIsImdlbmVyYXRlZCIsInB1c2giLCJ0c1BhdGhzIiwiZnVuY3Rpb25zIiwiYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwibWVyZ2VkR3JvdXAiLCJtb2RlbCIsImZyYW1lIiwicGFyYW1zIiwibWFwIiwibW9kZWxQYXRoIiwibmFtZXNSZWNvcmQiLCJnZXROYW1lc0Zyb21JZCIsImZyYW1lTmFtZSIsIm1hdGNoIiwiZnJhbWVJZCIsImNhbWVsaXplIiwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyIsImFjdGlvbkdlbmVyYXRlSHR0cHMiLCJhY3Rpb25HZW5lcmF0ZVNzciIsImNoZWNrRXhpc3RzR2VuQ29kZSIsInRlbXBsYXRlS2V5IiwiZW51bUlkIiwiZ2VuUGF0aCIsImdldFRhcmdldEFuZFBhdGgiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJpc0V4aXN0cyIsImNoZWNrRXhpc3RzIiwiZW51bXMiLCJvcHRpb25zIiwiZW51bXNLZXlzIiwibmFtZSIsImNvbnN0YW50IiwicmVzdWx0IiwidHBsIiwic3RhcnRzV2l0aCIsImNvbXBvbmVudElkIiwicCIsImZvcm0iLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIiwiaTE4bkNvbmZpZyIsImkxOG4iLCJ0YXJnZXRMaXN0IiwiYXBpSTE4bkRpciIsImRpciIsInN5bmNMb2NhbGVGaWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJsb2NhbGVzIiwidGFyZ2V0STE4bkRpciIsImxvY2FsZSIsInNvdXJjZUZpbGUiLCJ0YXJnZXRGaWxlIiwic3luY0hlYWRlciIsImN5YW4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEdBQUcsUUFBUSx1QkFBdUI7QUFDM0MsT0FB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
@@ -1,5 +1,6 @@
1
1
  import { type Logger } from "@logtape/logtape";
2
- import type { RunnableWorkflow, SchemaInput, SchemaOutput, StandardSchemaV1, WorkflowRunHandle, WorkflowSpec } from "@sonamu-kit/tasks/internal";
2
+ import { BackendPostgres } from "@sonamu-kit/tasks";
3
+ import { type RunnableWorkflow, type SchemaInput, type SchemaOutput, type StandardSchemaV1, type WorkflowRunHandle, type WorkflowSpec } from "@sonamu-kit/tasks/internal";
3
4
  import type { Knex } from "knex";
4
5
  import type { WorkflowMetadata } from "./decorator";
5
6
  import { StepWrapper } from "./step-wrapper";
@@ -22,6 +23,17 @@ export type WorkflowCreateOptions<Input, Output, TSchema extends StandardSchemaV
22
23
  export declare class WorkflowManager {
23
24
  #private;
24
25
  constructor(dbConf: Knex.Config, runMigrations?: boolean);
26
+ get backend(): BackendPostgres;
27
+ get workflowDefinitions(): {
28
+ id: string;
29
+ name: string;
30
+ version: string | null;
31
+ schedules: {
32
+ name: string;
33
+ expression: string;
34
+ }[];
35
+ retryPolicy: import("@sonamu-kit/tasks/internal").SerializableRetryPolicy | undefined;
36
+ }[];
25
37
  /**
26
38
  * 정의된 워크플로우 및 워크플로우에 대한 scheduled tasks를 동기화합니다.
27
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-manager.d.ts","sourceRoot":"","sources":["../../src/tasks/workflow-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-manager.d.ts","sourceRoot":"","sources":["../../src/tasks/workflow-manager.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { getLogger } from "@logtape/logtape";
2
2
  import { BackendPostgres, OpenWorkflow } from "@sonamu-kit/tasks";
3
+ import { serializeRetryPolicy } from "@sonamu-kit/tasks/internal";
3
4
  import assert from "assert";
4
5
  import { schedule as cronSchedule } from "node-cron";
5
6
  import { Sonamu } from "../api/sonamu.js";
@@ -31,6 +32,22 @@ export class WorkflowManager {
31
32
  this.#workflowsMap = new Map();
32
33
  this.#scheduledTasks = new Map();
33
34
  }
35
+ // Sonamu UI API에서 워크플로우 실행 목록 조회, 취소 등에 사용합니다.
36
+ get backend() {
37
+ return this.#backend;
38
+ }
39
+ get workflowDefinitions() {
40
+ return Array.from(this.#workflowsMap.values()).flat().map((wf)=>({
41
+ id: wf.id,
42
+ name: wf.name,
43
+ version: wf.version,
44
+ schedules: wf.schedules.map((s)=>({
45
+ name: s.name,
46
+ expression: s.expression
47
+ })),
48
+ retryPolicy: wf.retryPolicy ? serializeRetryPolicy(wf.retryPolicy) : undefined
49
+ }));
50
+ }
34
51
  /**
35
52
  * 정의된 워크플로우 및 워크플로우에 대한 scheduled tasks를 동기화합니다.
36
53
  */ async synchronize(workflowMap) {
@@ -205,4 +222,4 @@ export class WorkflowManager {
205
222
  }
206
223
  }
207
224
 
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy93b3JrZmxvdy1tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQmFja2VuZFBvc3RncmVzLCBPcGVuV29ya2Zsb3csIHR5cGUgV29ya2VyIH0gZnJvbSBcIkBzb25hbXUta2l0L3Rhc2tzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFJ1bm5hYmxlV29ya2Zsb3csXG4gIFNjaGVtYUlucHV0LFxuICBTY2hlbWFPdXRwdXQsXG4gIFN0YW5kYXJkU2NoZW1hVjEsXG4gIFN0ZXBBcGksXG4gIFdvcmtmbG93UnVuSGFuZGxlLFxuICBXb3JrZmxvd1NwZWMsXG59IGZyb20gXCJAc29uYW11LWtpdC90YXNrcy9pbnRlcm5hbFwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgc2NoZWR1bGUgYXMgY3JvblNjaGVkdWxlLCB0eXBlIFNjaGVkdWxlZFRhc2sgfSBmcm9tIFwibm9kZS1jcm9uXCI7XG5pbXBvcnQgdHlwZSB7IFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gXCIuLi9hcGkvY29udGV4dFwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGNvbnZlcnREb21haW5Ub0NhdGVnb3J5IH0gZnJvbSBcIi4uL2xvZ2dlci9jYXRlZ29yeVwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB0eXBlIHsgRXhlY3V0YWJsZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSBcIi4vZGVjb3JhdG9yXCI7XG5pbXBvcnQgeyBTdGVwV3JhcHBlciB9IGZyb20gXCIuL3N0ZXAtd3JhcHBlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93T3B0aW9ucyB7XG4gIC8vIHdvcmtlcuyXkOyEnCDrj5nsi5wg7Iuk7ZaJ7ZWgIO2DnOyKpO2BrCDsiJgsIOq4sOuzuOydgCBDUFUg7L2U7Ja0IOyImCAtIDHqsJxcbiAgY29uY3VycmVuY3k/OiBudW1iZXI7XG5cbiAgLy8gd29ya2Vy7JeQ7IScIOyCrOyaqe2VoCBwdWIvc3ViIOyXrOu2gCwg6riw67O47J2AIHRydWVcbiAgdXNlUHViU3ViPzogYm9vbGVhbjtcblxuICAvLyBwdWIvc3Vi7Jy866GcIO2DnOyKpO2BrOulvCDsiJjsi6DtlojsnYQg65WMIOybjO2BrO2UjOuhnOyasCDsi6TtlonquYzsp4Ag7KeA7JewIOyLnOqwhCwg6riw67O47J2AIDUwMG1zXG4gIGxpc3RlbkRlbGF5PzogbnVtYmVyO1xufVxuXG4vLyBXb3JrZmxvdyDtlajsiJjsnZgg7YOA7J6FLCBAc29uYW11LWtpdC90YXNrc+yZgCDri6Trpbgg7KCQ7J2AIHN0ZXDsnYQg7ZWc67KIIOqwkOyLvCDtmJXtg5wuXG5leHBvcnQgdHlwZSBXb3JrZmxvd0Z1bmN0aW9uPElucHV0LCBPdXRwdXQ+ID0gKFxuICBwYXJhbXM6IFJlYWRvbmx5PHtcbiAgICBsb2dnZXI6IExvZ2dlcjtcbiAgICBpbnB1dDogSW5wdXQ7XG4gICAgc3RlcDogU3RlcFdyYXBwZXI7XG4gICAgdmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgfT4sXG4pID0+IFByb21pc2U8T3V0cHV0PiB8IE91dHB1dDtcblxuLy8gV29ya2Zsb3frpbwg65Ox66Gd7ZWgIOuVjOulvCDsnITtlZwg7YOA7J6FXG5leHBvcnQgdHlwZSBXb3JrZmxvd0NyZWF0ZU9wdGlvbnM8XG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFRTY2hlbWEgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtYVYxIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuPiA9IE9taXQ8XG4gIFdvcmtmbG93U3BlYzxTY2hlbWFPdXRwdXQ8VFNjaGVtYSwgSW5wdXQ+LCBPdXRwdXQsIFNjaGVtYUlucHV0PFRTY2hlbWEsIElucHV0Pj4sXG4gIFwidmVyc2lvblwiXG4+ICYge1xuICBpZDogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsO1xuICBmdW5jdGlvbjogV29ya2Zsb3dGdW5jdGlvbjxTY2hlbWFPdXRwdXQ8VFNjaGVtYSwgSW5wdXQ+LCBPdXRwdXQ+O1xufTtcblxuZXhwb3J0IGNsYXNzIFdvcmtmbG93TWFuYWdlciB7XG4gIC8vIGJhY2tlbmQg7J247Iqk7YS07IqkXG4gIHJlYWRvbmx5ICNiYWNrZW5kOiBCYWNrZW5kUG9zdGdyZXM7XG5cbiAgLy8gT3BlbldvcmtmbG93IOyduOyKpO2EtOyKpFxuICByZWFkb25seSAjb3c6IE9wZW5Xb3JrZmxvdztcblxuICAvLyBXb3JrZXIg7J247Iqk7YS07IqkICjsl4bsnYQg7IiYIOyeiOycvOupsCwg7J20IOuVjOuKlCDrtoTsgrDrkJwg7ISc67KEIO2ZmOqyveyXkOyEnCBEQuyXkCBwdWJsaXNo66eMIO2VnOuLpOqzoCDqsIDsoJXtlagpXG4gICN3b3JrZXI6IFdvcmtlciB8IG51bGw7XG5cbiAgLy8g7YyM7J28IOqyveuhnCAtPiDtjIzsnbzsl5Ag7KCV7J2Y65CcIOybjO2BrO2UjOuhnOyasCDrqZTtg4DrjbDsnbTthLAg66qp66GdXG4gICN3b3JrZmxvd3NNYXA6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT47XG5cbiAgLy8gVGFzayDsnbTrpoQgLT4gVGFzayDsoJXrs7Qg67CPIElucHV0IOqwkiwgV29ya2Zsb3cgSURcbiAgI3NjaGVkdWxlZFRhc2tzOiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgIHRhc2s6IFNjaGVkdWxlZFRhc2s7XG4gICAgICBpbnB1dEZuOiBFeGVjdXRhYmxlPFNjaGVtYUlucHV0PHVua25vd24sIHVua25vd24+PjtcbiAgICAgIHdvcmtmbG93SWQ6IHN0cmluZztcbiAgICB9XG4gID47XG5cbiAgLy8gQmFja2VuZFBvc3RncmVz7JeQ7IScIOyymOumrO2VmOuKlCDqsoPrk6TsnbQg7J6I7Ja07IScIEtuZXgg7Luk64Sl7IWY7J20IOyVhOuLiOudvCDshKTsoJXqsJLsnYQg64Sj7Ja07KSY7JW87ZWoLlxuICBjb25zdHJ1Y3RvcihkYkNvbmY6IEtuZXguQ29uZmlnLCBydW5NaWdyYXRpb25zOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IGJhY2tlbmQgPSBuZXcgQmFja2VuZFBvc3RncmVzKGRiQ29uZiwgeyBydW5NaWdyYXRpb25zIH0pO1xuXG4gICAgdGhpcy4jYmFja2VuZCA9IGJhY2tlbmQ7XG4gICAgdGhpcy4jb3cgPSBuZXcgT3BlbldvcmtmbG93KHsgYmFja2VuZCB9KTtcbiAgICB0aGlzLiN3b3JrZXIgPSBudWxsO1xuXG4gICAgdGhpcy4jd29ya2Zsb3dzTWFwID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuI3NjaGVkdWxlZFRhc2tzID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIOygleydmOuQnCDsm4ztgaztlIzroZzsmrAg67CPIOybjO2BrO2UjOuhnOyasOyXkCDrjIDtlZwgc2NoZWR1bGVkIHRhc2tz66W8IOuPmeq4sO2ZlO2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHN5bmNocm9uaXplKHdvcmtmbG93TWFwOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+KSB7XG4gICAgLy8gMS4g7IKt7KCc65CcIO2MjOydvOydgCDsnbzqtIQg7IKt7KCcXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh0aGlzLiN3b3JrZmxvd3NNYXAuZW50cmllcygpKVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIXdvcmtmbG93TWFwLmhhcyhrZXkpKVxuICAgICAgICAuZmxhdE1hcCgoW18sIHdvcmtmbG93c10pID0+XG4gICAgICAgICAgd29ya2Zsb3dzLm1hcCgod29ya2Zsb3cpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgICAuLi53b3JrZmxvdy5zY2hlZHVsZXMubWFwKChzY2hlZHVsZSkgPT4gdGhpcy51bnNjaGVkdWxlVGFzayhzY2hlZHVsZS5uYW1lKSksXG4gICAgICAgICAgICAgIHRoaXMudW5yZWdpc3RlcldvcmtmbG93KHdvcmtmbG93KSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICk7XG5cbiAgICAvLyAyLiDsg4jroZwg7LaU6rCA65CcIO2MjOydvOydgCDsnbzqtIQg65Ox66GdXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh3b3JrZmxvd01hcC5lbnRyaWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhdGhpcy4jd29ya2Zsb3dzTWFwLmhhcyhrZXkpKVxuICAgICAgICAuZmxhdE1hcCgoW18sIHdvcmtmbG93c10pID0+XG4gICAgICAgICAgd29ya2Zsb3dzLm1hcCgod29ya2Zsb3cpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJXb3JrZmxvdyh7XG4gICAgICAgICAgICAgIGlkOiB3b3JrZmxvdy5pZCxcbiAgICAgICAgICAgICAgbmFtZTogd29ya2Zsb3cubmFtZSxcbiAgICAgICAgICAgICAgdmVyc2lvbjogd29ya2Zsb3cudmVyc2lvbiA/PyBudWxsLFxuICAgICAgICAgICAgICBzY2hlbWE6IHdvcmtmbG93LnNjaGVtYSxcbiAgICAgICAgICAgICAgZnVuY3Rpb246IHdvcmtmbG93LmZuLFxuICAgICAgICAgICAgICByZXRyeVBvbGljeTogd29ya2Zsb3cucmV0cnlQb2xpY3ksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgICAgd29ya2Zsb3cuc2NoZWR1bGVzLm1hcCgoc2NoZWR1bGUpID0+IHRoaXMuc2NoZWR1bGVUYXNrKHdvcmtmbG93LCBzY2hlZHVsZSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gMy4g6riw7KG06rO8IOuLpOuluCDqsoPsnYQgZGlmZuy5nCDri6TsnYwsIOyCreygnCDtm4Qg7J6s65Ox66GdXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh3b3JrZmxvd01hcC5lbnRyaWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiB0aGlzLiN3b3JrZmxvd3NNYXAuaGFzKGtleSkpXG4gICAgICAgIC5tYXA8W3N0cmluZywgW1dvcmtmbG93TWV0YWRhdGFbXSwgV29ya2Zsb3dNZXRhZGF0YVtdXV0+KChba2V5LCBuZXdXb3JrZmxvd3NdKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNXb3JrZmxvd3MgPSB0aGlzLiN3b3JrZmxvd3NNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgYXNzZXJ0KHByZXZpb3VzV29ya2Zsb3dzLCBcInByZXZpb3VzIHdvcmtmbG93cyBub3QgZm91bmRcIik7XG4gICAgICAgICAgcmV0dXJuIFtrZXksIFtwcmV2aW91c1dvcmtmbG93cywgbmV3V29ya2Zsb3dzXV07XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoYXN5bmMgKFtfLCBbcHJldmlvdXNXb3JrZmxvd3MsIG5ld1dvcmtmbG93c11dKSA9PiB7XG4gICAgICAgICAgLy8g6riw7KG0IOqyg+uTpOydhCDsgq3soJzrtoDthLAg7ZW07JW87ZWoLlxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgIHByZXZpb3VzV29ya2Zsb3dzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHByZXZJdGVtKSA9PiAhbmV3V29ya2Zsb3dzLnNvbWUoKG5ld0l0ZW0pID0+IG5ld0l0ZW0uaWQgPT09IHByZXZJdGVtLmlkKSlcbiAgICAgICAgICAgICAgLm1hcCgocHJldkl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgICAgICAgICAgIC4uLnByZXZJdGVtLnNjaGVkdWxlcy5tYXAoKHNjaGVkdWxlKSA9PiB0aGlzLnVuc2NoZWR1bGVUYXNrKHNjaGVkdWxlLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMudW5yZWdpc3RlcldvcmtmbG93KHByZXZJdGVtKSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIOyDiOuhnCDstpTqsIDrkJwg6rKD65Ok7J2EIOuTseuhnVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgIG5ld1dvcmtmbG93c1xuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChuZXdJdGVtKSA9PiAhcHJldmlvdXNXb3JrZmxvd3Muc29tZSgocHJldkl0ZW0pID0+IHByZXZJdGVtLmlkID09PSBuZXdJdGVtLmlkKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAubWFwKGFzeW5jIChuZXdJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcldvcmtmbG93KHtcbiAgICAgICAgICAgICAgICAgIGlkOiBuZXdJdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogbmV3SXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogbmV3SXRlbS52ZXJzaW9uID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICBzY2hlbWE6IG5ld0l0ZW0uc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IG5ld0l0ZW0uZm4sXG4gICAgICAgICAgICAgICAgICByZXRyeVBvbGljeTogbmV3SXRlbS5yZXRyeVBvbGljeSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgICAgICAgICBuZXdJdGVtLnNjaGVkdWxlcy5tYXAoKHNjaGVkdWxlKSA9PiB0aGlzLnNjaGVkdWxlVGFzayhuZXdJdGVtLCBzY2hlZHVsZSkpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLiN3b3JrZmxvd3NNYXAgPSB3b3JrZmxvd01hcDtcbiAgfVxuXG4gIC8vIOybjO2BrO2UjOuhnOyasOulvCDsi6TtlolcbiAgcnVuPElucHV0LCBPdXRwdXQsIFRTY2hlbWEgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtYVYxIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgICBvcHRpb25zOiBPbWl0PFdvcmtmbG93Q3JlYXRlT3B0aW9uczxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hPiwgXCJmdW5jdGlvblwiIHwgXCJzY2hlbWFcIiB8IFwiaWRcIj4sXG4gICAgaW5wdXQ6IFNjaGVtYUlucHV0PFRTY2hlbWEsIElucHV0PixcbiAgKTogUHJvbWlzZTxXb3JrZmxvd1J1bkhhbmRsZTxPdXRwdXQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuI293LnJ1bldvcmtmbG93KFxuICAgICAge1xuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgaW5wdXQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIGNyb24gdGFza+ulvCDrk7HroZ1cbiAgYXN5bmMgc2NoZWR1bGVUYXNrKFxuICAgIHdvcmtmbG93OiBQaWNrPFdvcmtmbG93TWV0YWRhdGEsIFwiaWRcIiB8IFwibmFtZVwiIHwgXCJ2ZXJzaW9uXCI+LFxuICAgIHNjaGVkdWxlOiBXb3JrZmxvd01ldGFkYXRhW1wic2NoZWR1bGVzXCJdW251bWJlcl0sXG4gICkge1xuICAgIC8vIFdvcmtlcuqwgCDtmZzshLHtmZTrkJwg64W465Oc7JeQ7ISc66eMIOyymOumrFxuICAgIGlmICghdGhpcy4jd29ya2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFzayA9IGNyb25TY2hlZHVsZShcbiAgICAgIHNjaGVkdWxlLmV4cHJlc3Npb24sXG4gICAgICAoYXN5bmMgKFxuICAgICAgICB7IG5hbWUsIHZlcnNpb24gfTogUGljazxXb3JrZmxvd01ldGFkYXRhLCBcIm5hbWVcIiB8IFwidmVyc2lvblwiPixcbiAgICAgICAgeyBpbnB1dCB9OiBXb3JrZmxvd01ldGFkYXRhW1wic2NoZWR1bGVzXCJdW251bWJlcl0sXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXREYXRhID0gYXdhaXQgKHR5cGVvZiBpbnB1dCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBQcm9taXNlLnJlc29sdmUoaW5wdXQoKSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShpbnB1dCkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJ1bih7IG5hbWUsIHZlcnNpb246IHZlcnNpb24gPz8gbnVsbCB9LCBpbnB1dERhdGEpO1xuICAgICAgfSkuYmluZCh0aGlzLCB3b3JrZmxvdywgc2NoZWR1bGUpLFxuICAgICAge1xuICAgICAgICBuYW1lOiBzY2hlZHVsZS5uYW1lLFxuICAgICAgICB0aW1lem9uZTogU29uYW11LmNvbmZpZy5hcGkudGltZXpvbmUsXG4gICAgICAgIG5vT3ZlcmxhcDogZmFsc2UsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLiNzY2hlZHVsZWRUYXNrcy5zZXQoc2NoZWR1bGUubmFtZSwge1xuICAgICAgdGFzayxcbiAgICAgIGlucHV0Rm46IHNjaGVkdWxlLmlucHV0LFxuICAgICAgd29ya2Zsb3dJZDogd29ya2Zsb3cuaWQsXG4gICAgfSk7XG4gICAgYXdhaXQgdGFzay5zdGFydCgpO1xuICB9XG5cbiAgLy8gY3JvbiB0YXNr66W8IOykkeyngFxuICBhc3luYyB1bnNjaGVkdWxlVGFzayhuYW1lOiBzdHJpbmcpIHtcbiAgICAvLyBXb3JrZXLqsIAg7Zmc7ISx7ZmU65CcIOuFuOuTnOyXkOyEnOunjCDsspjrpqxcbiAgICBpZiAoIXRoaXMuI3dvcmtlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhc2tJdGVtID0gdGhpcy4jc2NoZWR1bGVkVGFza3MuZ2V0KG5hbWUpO1xuICAgIGlmICghdGFza0l0ZW0pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJzY2hlZHVsZWQgdGFzayBub3QgZm91bmRcIiwgbmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy4jc2NoZWR1bGVkVGFza3MuZGVsZXRlKG5hbWUpO1xuICAgIGF3YWl0IHRhc2tJdGVtLnRhc2suc3RvcCgpO1xuICAgIGF3YWl0IHRhc2tJdGVtLnRhc2suZGVzdHJveSgpO1xuICB9XG5cbiAgLy8g7JuM7YGs7ZSM66Gc7Jqw66W8IOuTseuhnSwg6rSA66Co65CcIOyKpOy8gOykhOydgCDrs4Trj4TroZwg65Ox66Gd7ZW07JW8IO2VqC5cbiAgcmVnaXN0ZXJXb3JrZmxvdzxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgb3B0aW9uczogV29ya2Zsb3dDcmVhdGVPcHRpb25zPElucHV0LCBPdXRwdXQsIFRTY2hlbWE+LFxuICApOiBSdW5uYWJsZVdvcmtmbG93PFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dCwgU2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+PiB7XG4gICAgY29uc3QgZm4gPSBhc3luYyAoXG4gICAgICBwYXJhbXM6IFJlYWRvbmx5PHtcbiAgICAgICAgaW5wdXQ6IFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD47XG4gICAgICAgIHN0ZXA6IFN0ZXBBcGk7XG4gICAgICAgIHZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gICAgICB9PixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGJhc2VDb250ZXh0ID0ge1xuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBwYXNzcG9ydDoge1xuICAgICAgICAgIGxvZ2luOiBhc3luYyAoKSA9PiB7fSxcbiAgICAgICAgICBsb2dvdXQ6ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cbiAgICAgIGNvbnN0IGNvbnRleHRQcm92aWRlciA9IFNvbmFtdS5jb25maWcudGFza3M/LmNvbnRleHRQcm92aWRlcjtcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBjb250ZXh0UHJvdmlkZXJcbiAgICAgICAgPyBhd2FpdCBQcm9taXNlLnJlc29sdmUoY29udGV4dFByb3ZpZGVyKGJhc2VDb250ZXh0KSlcbiAgICAgICAgOiBiYXNlQ29udGV4dDtcblxuICAgICAgY29uc3Qgc3RlcCA9IG5ldyBTdGVwV3JhcHBlcihwYXJhbXMuc3RlcCk7XG4gICAgICByZXR1cm4gU29uYW11LmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgKCkgPT5cbiAgICAgICAgb3B0aW9ucy5mdW5jdGlvbih7XG4gICAgICAgICAgaW5wdXQ6IHBhcmFtcy5pbnB1dCxcbiAgICAgICAgICBzdGVwLFxuICAgICAgICAgIHZlcnNpb246IHBhcmFtcy52ZXJzaW9uLFxuICAgICAgICAgIGxvZ2dlcjogZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KG9wdGlvbnMubmFtZSwgXCJ3b3JrZmxvd1wiKSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd29ya2Zsb3cgPSB0aGlzLiNvdy5kZWZpbmVXb3JrZmxvdyhcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hLFxuICAgICAgICByZXRyeVBvbGljeTogb3B0aW9ucy5yZXRyeVBvbGljeSxcbiAgICAgIH0sXG4gICAgICBmbixcbiAgICApO1xuICAgIHJldHVybiB3b3JrZmxvdztcbiAgfVxuXG4gIC8vIOybjO2BrO2UjOuhnOyasOulvCDrk7HroZ0g7ZW07KCcLCDqtIDroKjrkJwg7Iqk7LyA7KSE7J2AIOuzhOuPhOuhnCDtlbTsoJztlbTslbwg7ZWoLlxuICBhc3luYyB1bnJlZ2lzdGVyV29ya2Zsb3cod29ya2Zsb3c6IFBpY2s8V29ya2Zsb3dNZXRhZGF0YSwgXCJuYW1lXCIgfCBcInZlcnNpb25cIiB8IFwiaWRcIj4pIHtcbiAgICB0aGlzLiNvdy51bnJlZ2lzdGVyV29ya2Zsb3cod29ya2Zsb3cubmFtZSwgd29ya2Zsb3cudmVyc2lvbiA/PyBudWxsKTtcbiAgfVxuXG4gIC8vIFdvcmtlcuulvCDshKTsoJUg7ZuEIOyLnOyekVxuICBzZXR1cFdvcmtlcihvcHRpb25zOiBXb3JrZmxvd09wdGlvbnMpIHtcbiAgICB0aGlzLiN3b3JrZXIgPSB0aGlzLiNvdy5uZXdXb3JrZXIob3B0aW9ucyk7XG4gIH1cblxuICAvLyBXb3JrZXLqsIAg7J6I7Jy866m0IFdvcmtlcuq5jOyngCDstIjquLDtmZQsIOyVhOuLiOuptCDrsLHsl5Trk5zrp4wg7LSI6riw7ZmUXG4gIGFzeW5jIHN0YXJ0V29ya2VyKCkge1xuICAgIGF3YWl0IHRoaXMuI2JhY2tlbmQuaW5pdGlhbGl6ZSgpO1xuICAgIGF3YWl0IHRoaXMuI3dvcmtlcj8uc3RhcnQoKTtcbiAgfVxuXG4gIC8vIFdvcmtlcuulvCDspJHsp4BcbiAgYXN5bmMgc3RvcFdvcmtlcigpIHtcbiAgICBhd2FpdCB0aGlzLiN3b3JrZXI/LnN0b3AoKTtcbiAgfVxuXG4gIC8vIGNyb24gdGFza+uTpOydhCDrqqjrkZAg7KSR7KeAXG4gIGFzeW5jIHN0b3BTY2hlZHVsZXMoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh0aGlzLiNzY2hlZHVsZWRUYXNrcy52YWx1ZXMoKSkubWFwKCh7IHRhc2sgfSkgPT4gUHJvbWlzZS5yZXNvbHZlKHRhc2suc3RvcCgpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIGNyb24gdGFza+uTpOydhCDrqqjrkZAg7KCV66asXG4gIGFzeW5jIGRlc3Ryb3lTY2hlZHVsZXMoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh0aGlzLiNzY2hlZHVsZWRUYXNrcy52YWx1ZXMoKSkubWFwKCh7IHRhc2sgfSkgPT4gUHJvbWlzZS5yZXNvbHZlKHRhc2suZGVzdHJveSgpKSksXG4gICAgKTtcbiAgICB0aGlzLiNzY2hlZHVsZWRUYXNrcy5jbGVhcigpO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3BTY2hlZHVsZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN0b3BXb3JrZXIoKTtcbiAgICBhd2FpdCB0aGlzLmRlc3Ryb3lTY2hlZHVsZXMoKTtcbiAgICBhd2FpdCB0aGlzLiNiYWNrZW5kLnN0b3AoKTtcbiAgfVxuXG4gIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJnZXRMb2dnZXIiLCJCYWNrZW5kUG9zdGdyZXMiLCJPcGVuV29ya2Zsb3ciLCJhc3NlcnQiLCJzY2hlZHVsZSIsImNyb25TY2hlZHVsZSIsIlNvbmFtdSIsImNvbnZlcnREb21haW5Ub0NhdGVnb3J5IiwiTmFpdGUiLCJjcmVhdGVNb2NrU1NFRmFjdG9yeSIsIlN0ZXBXcmFwcGVyIiwiV29ya2Zsb3dNYW5hZ2VyIiwiZGJDb25mIiwicnVuTWlncmF0aW9ucyIsImJhY2tlbmQiLCJNYXAiLCJzeW5jaHJvbml6ZSIsIndvcmtmbG93TWFwIiwiUHJvbWlzZSIsImFsbFNldHRsZWQiLCJBcnJheSIsImZyb20iLCJlbnRyaWVzIiwiZmlsdGVyIiwia2V5IiwiaGFzIiwiZmxhdE1hcCIsIl8iLCJ3b3JrZmxvd3MiLCJtYXAiLCJ3b3JrZmxvdyIsInNjaGVkdWxlcyIsInVuc2NoZWR1bGVUYXNrIiwibmFtZSIsInVucmVnaXN0ZXJXb3JrZmxvdyIsInJlZ2lzdGVyV29ya2Zsb3ciLCJpZCIsInZlcnNpb24iLCJzY2hlbWEiLCJmdW5jdGlvbiIsImZuIiwicmV0cnlQb2xpY3kiLCJzY2hlZHVsZVRhc2siLCJuZXdXb3JrZmxvd3MiLCJwcmV2aW91c1dvcmtmbG93cyIsImdldCIsInByZXZJdGVtIiwic29tZSIsIm5ld0l0ZW0iLCJydW4iLCJvcHRpb25zIiwiaW5wdXQiLCJydW5Xb3JrZmxvdyIsInVuZGVmaW5lZCIsInRhc2siLCJleHByZXNzaW9uIiwiaW5wdXREYXRhIiwicmVzb2x2ZSIsImJpbmQiLCJ0aW1lem9uZSIsImNvbmZpZyIsImFwaSIsIm5vT3ZlcmxhcCIsInNldCIsImlucHV0Rm4iLCJ3b3JrZmxvd0lkIiwic3RhcnQiLCJ0YXNrSXRlbSIsImNvbnNvbGUiLCJlcnJvciIsImRlbGV0ZSIsInN0b3AiLCJkZXN0cm95IiwicGFyYW1zIiwiYmFzZUNvbnRleHQiLCJyZXF1ZXN0IiwicmVwbHkiLCJoZWFkZXJzIiwiY3JlYXRlU1NFIiwibmFpdGVTdG9yZSIsImNyZWF0ZVN0b3JlIiwidXNlciIsInBhc3Nwb3J0IiwibG9naW4iLCJsb2dvdXQiLCJjb250ZXh0UHJvdmlkZXIiLCJ0YXNrcyIsImNvbnRleHQiLCJzdGVwIiwiYXN5bmNMb2NhbFN0b3JhZ2UiLCJsb2dnZXIiLCJkZWZpbmVXb3JrZmxvdyIsInNldHVwV29ya2VyIiwibmV3V29ya2VyIiwic3RhcnRXb3JrZXIiLCJpbml0aWFsaXplIiwic3RvcFdvcmtlciIsInN0b3BTY2hlZHVsZXMiLCJ2YWx1ZXMiLCJkZXN0cm95U2NoZWR1bGVzIiwiY2xlYXIiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFNBQVMsUUFBcUIsbUJBQW1CO0FBQzFELFNBQVNDLGVBQWUsRUFBRUMsWUFBWSxRQUFxQixvQkFBb0I7QUFVL0UsT0FBT0MsWUFBWSxTQUFTO0FBRTVCLFNBQVNDLFlBQVlDLFlBQVksUUFBNEIsWUFBWTtBQUd6RSxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLHVCQUF1QixRQUFRLHdCQUFxQjtBQUM3RCxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBQ3ZDLFNBQVNDLG9CQUFvQixRQUFRLG1CQUFnQjtBQUdyRCxTQUFTQyxXQUFXLFFBQVEsb0JBQWlCO0FBcUM3QyxPQUFPLE1BQU1DO0lBQ1gsZUFBZTtJQUNOLENBQUEsT0FBUSxDQUFrQjtJQUVuQyxvQkFBb0I7SUFDWCxDQUFBLEVBQUcsQ0FBZTtJQUUzQixnRUFBZ0U7SUFDaEUsQ0FBQSxNQUFPLENBQWdCO0lBRXZCLGtDQUFrQztJQUNsQyxDQUFBLFlBQWEsQ0FBa0M7SUFFL0MsNENBQTRDO0lBQzVDLENBQUEsY0FBZSxDQU9iO0lBRUYsMkRBQTJEO0lBQzNELFlBQVlDLE1BQW1CLEVBQUVDLGdCQUF5QixJQUFJLENBQUU7UUFDOUQsTUFBTUMsVUFBVSxJQUFJYixnQkFBZ0JXLFFBQVE7WUFBRUM7UUFBYztRQUU1RCxJQUFJLENBQUMsQ0FBQSxPQUFRLEdBQUdDO1FBQ2hCLElBQUksQ0FBQyxDQUFBLEVBQUcsR0FBRyxJQUFJWixhQUFhO1lBQUVZO1FBQVE7UUFDdEMsSUFBSSxDQUFDLENBQUEsTUFBTyxHQUFHO1FBRWYsSUFBSSxDQUFDLENBQUEsWUFBYSxHQUFHLElBQUlDO1FBQ3pCLElBQUksQ0FBQyxDQUFBLGNBQWUsR0FBRyxJQUFJQTtJQUM3QjtJQUVBOztHQUVDLEdBQ0QsTUFBTUMsWUFBWUMsV0FBNEMsRUFBRTtRQUM5RCxtQkFBbUI7UUFDbkIsTUFBTUMsUUFBUUMsVUFBVSxDQUN0QkMsTUFBTUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBLFlBQWEsQ0FBQ0MsT0FBTyxJQUNsQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxHQUFLLENBQUNQLFlBQVlRLEdBQUcsQ0FBQ0QsTUFDbkNFLE9BQU8sQ0FBQyxDQUFDLENBQUNDLEdBQUdDLFVBQVUsR0FDdEJBLFVBQVVDLEdBQUcsQ0FBQyxDQUFDQztnQkFDYixPQUFPWixRQUFRQyxVQUFVLENBQUM7dUJBQ3JCVyxTQUFTQyxTQUFTLENBQUNGLEdBQUcsQ0FBQyxDQUFDekIsV0FBYSxJQUFJLENBQUM0QixjQUFjLENBQUM1QixTQUFTNkIsSUFBSTtvQkFDekUsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQ0o7aUJBQ3pCO1lBQ0g7UUFJTixzQkFBc0I7UUFDdEIsTUFBTVosUUFBUUMsVUFBVSxDQUN0QkMsTUFBTUMsSUFBSSxDQUFDSixZQUFZSyxPQUFPLElBQzNCQyxNQUFNLENBQUMsQ0FBQyxDQUFDQyxJQUFJLEdBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQSxZQUFhLENBQUNDLEdBQUcsQ0FBQ0QsTUFDMUNFLE9BQU8sQ0FBQyxDQUFDLENBQUNDLEdBQUdDLFVBQVUsR0FDdEJBLFVBQVVDLEdBQUcsQ0FBQyxDQUFDQztnQkFDYixJQUFJLENBQUNLLGdCQUFnQixDQUFDO29CQUNwQkMsSUFBSU4sU0FBU00sRUFBRTtvQkFDZkgsTUFBTUgsU0FBU0csSUFBSTtvQkFDbkJJLFNBQVNQLFNBQVNPLE9BQU8sSUFBSTtvQkFDN0JDLFFBQVFSLFNBQVNRLE1BQU07b0JBQ3ZCQyxVQUFVVCxTQUFTVSxFQUFFO29CQUNyQkMsYUFBYVgsU0FBU1csV0FBVztnQkFDbkM7Z0JBRUEsT0FBT3ZCLFFBQVFDLFVBQVUsQ0FDdkJXLFNBQVNDLFNBQVMsQ0FBQ0YsR0FBRyxDQUFDLENBQUN6QixXQUFhLElBQUksQ0FBQ3NDLFlBQVksQ0FBQ1osVUFBVTFCO1lBRXJFO1FBSU4sa0NBQWtDO1FBQ2xDLE1BQU1jLFFBQVFDLFVBQVUsQ0FDdEJDLE1BQU1DLElBQUksQ0FBQ0osWUFBWUssT0FBTyxJQUMzQkMsTUFBTSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxHQUFLLElBQUksQ0FBQyxDQUFBLFlBQWEsQ0FBQ0MsR0FBRyxDQUFDRCxNQUN6Q0ssR0FBRyxDQUFxRCxDQUFDLENBQUNMLEtBQUttQixhQUFhO1lBQzNFLE1BQU1DLG9CQUFvQixJQUFJLENBQUMsQ0FBQSxZQUFhLENBQUNDLEdBQUcsQ0FBQ3JCO1lBQ2pEckIsT0FBT3lDLG1CQUFtQjtZQUMxQixPQUFPO2dCQUFDcEI7Z0JBQUs7b0JBQUNvQjtvQkFBbUJEO2lCQUFhO2FBQUM7UUFDakQsR0FDQ2QsR0FBRyxDQUFDLE9BQU8sQ0FBQ0YsR0FBRyxDQUFDaUIsbUJBQW1CRCxhQUFhLENBQUM7WUFDaEQsbUJBQW1CO1lBQ25CLE1BQU16QixRQUFRQyxVQUFVLENBQ3RCeUIsa0JBQ0dyQixNQUFNLENBQUMsQ0FBQ3VCLFdBQWEsQ0FBQ0gsYUFBYUksSUFBSSxDQUFDLENBQUNDLFVBQVlBLFFBQVFaLEVBQUUsS0FBS1UsU0FBU1YsRUFBRSxHQUMvRVAsR0FBRyxDQUFDLENBQUNpQjtnQkFDSixPQUFPNUIsUUFBUUMsVUFBVSxDQUFDO3VCQUNyQjJCLFNBQVNmLFNBQVMsQ0FBQ0YsR0FBRyxDQUFDLENBQUN6QixXQUFhLElBQUksQ0FBQzRCLGNBQWMsQ0FBQzVCLFNBQVM2QixJQUFJO29CQUN6RSxJQUFJLENBQUNDLGtCQUFrQixDQUFDWTtpQkFDekI7WUFDSDtZQUdKLGdCQUFnQjtZQUNoQixNQUFNNUIsUUFBUUMsVUFBVSxDQUN0QndCLGFBQ0dwQixNQUFNLENBQ0wsQ0FBQ3lCLFVBQVksQ0FBQ0osa0JBQWtCRyxJQUFJLENBQUMsQ0FBQ0QsV0FBYUEsU0FBU1YsRUFBRSxLQUFLWSxRQUFRWixFQUFFLEdBRTlFUCxHQUFHLENBQUMsT0FBT21CO2dCQUNWLElBQUksQ0FBQ2IsZ0JBQWdCLENBQUM7b0JBQ3BCQyxJQUFJWSxRQUFRWixFQUFFO29CQUNkSCxNQUFNZSxRQUFRZixJQUFJO29CQUNsQkksU0FBU1csUUFBUVgsT0FBTyxJQUFJO29CQUM1QkMsUUFBUVUsUUFBUVYsTUFBTTtvQkFDdEJDLFVBQVVTLFFBQVFSLEVBQUU7b0JBQ3BCQyxhQUFhTyxRQUFRUCxXQUFXO2dCQUNsQztnQkFFQSxPQUFPdkIsUUFBUUMsVUFBVSxDQUN2QjZCLFFBQVFqQixTQUFTLENBQUNGLEdBQUcsQ0FBQyxDQUFDekIsV0FBYSxJQUFJLENBQUNzQyxZQUFZLENBQUNNLFNBQVM1QztZQUVuRTtRQUVOO1FBR0osSUFBSSxDQUFDLENBQUEsWUFBYSxHQUFHYTtJQUN2QjtJQUVBLFlBQVk7SUFDWmdDLElBQ0VDLE9BQTBGLEVBQzFGQyxLQUFrQyxFQUNFO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLENBQUEsRUFBRyxDQUFDQyxXQUFXLENBQ3pCO1lBQ0VuQixNQUFNaUIsUUFBUWpCLElBQUk7WUFDbEJJLFNBQVNhLFFBQVFiLE9BQU8sSUFBSWdCO1FBQzlCLEdBQ0FGO0lBRUo7SUFFQSxnQkFBZ0I7SUFDaEIsTUFBTVQsYUFDSlosUUFBMkQsRUFDM0QxQixRQUErQyxFQUMvQztRQUNBLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsTUFBTyxFQUFFO1lBQ2pCO1FBQ0Y7UUFFQSxNQUFNa0QsT0FBT2pELGFBQ1hELFNBQVNtRCxVQUFVLEVBQ25CLEFBQUMsQ0FBQSxPQUNDLEVBQUV0QixJQUFJLEVBQUVJLE9BQU8sRUFBOEMsRUFDN0QsRUFBRWMsS0FBSyxFQUF5QztZQUVoRCxNQUFNSyxZQUFZLE1BQU8sQ0FBQSxPQUFPTCxVQUFVLGFBQ3RDakMsUUFBUXVDLE9BQU8sQ0FBQ04sV0FDaEJqQyxRQUFRdUMsT0FBTyxDQUFDTixNQUFLO1lBRXpCLE9BQU8sSUFBSSxDQUFDRixHQUFHLENBQUM7Z0JBQUVoQjtnQkFBTUksU0FBU0EsV0FBVztZQUFLLEdBQUdtQjtRQUN0RCxDQUFBLEVBQUdFLElBQUksQ0FBQyxJQUFJLEVBQUU1QixVQUFVMUIsV0FDeEI7WUFDRTZCLE1BQU03QixTQUFTNkIsSUFBSTtZQUNuQjBCLFVBQVVyRCxPQUFPc0QsTUFBTSxDQUFDQyxHQUFHLENBQUNGLFFBQVE7WUFDcENHLFdBQVc7UUFDYjtRQUdGLElBQUksQ0FBQyxDQUFBLGNBQWUsQ0FBQ0MsR0FBRyxDQUFDM0QsU0FBUzZCLElBQUksRUFBRTtZQUN0Q3FCO1lBQ0FVLFNBQVM1RCxTQUFTK0MsS0FBSztZQUN2QmMsWUFBWW5DLFNBQVNNLEVBQUU7UUFDekI7UUFDQSxNQUFNa0IsS0FBS1ksS0FBSztJQUNsQjtJQUVBLGdCQUFnQjtJQUNoQixNQUFNbEMsZUFBZUMsSUFBWSxFQUFFO1FBQ2pDLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsTUFBTyxFQUFFO1lBQ2pCO1FBQ0Y7UUFFQSxNQUFNa0MsV0FBVyxJQUFJLENBQUMsQ0FBQSxjQUFlLENBQUN0QixHQUFHLENBQUNaO1FBQzFDLElBQUksQ0FBQ2tDLFVBQVU7WUFDYkMsUUFBUUMsS0FBSyxDQUFDLDRCQUE0QnBDO1lBQzFDO1FBQ0Y7UUFFQSxJQUFJLENBQUMsQ0FBQSxjQUFlLENBQUNxQyxNQUFNLENBQUNyQztRQUM1QixNQUFNa0MsU0FBU2IsSUFBSSxDQUFDaUIsSUFBSTtRQUN4QixNQUFNSixTQUFTYixJQUFJLENBQUNrQixPQUFPO0lBQzdCO0lBRUEsa0NBQWtDO0lBQ2xDckMsaUJBQ0VlLE9BQXNELEVBQytCO1FBQ3JGLE1BQU1WLEtBQUssT0FDVGlDO1lBTUEsTUFBTUMsY0FBYztnQkFDbEJDLFNBQVM7Z0JBQ1RDLE9BQU87Z0JBQ1BDLFNBQVMsQ0FBQztnQkFDVkMsV0FBVyxDQUFDeEMsU0FBc0I3QixxQkFBcUI2QjtnQkFDdkR5QyxZQUFZdkUsTUFBTXdFLFdBQVc7Z0JBQzdCQyxNQUFNO2dCQUNOQyxVQUFVO29CQUNSQyxPQUFPLFdBQWE7b0JBQ3BCQyxRQUFRLEtBQU87Z0JBQ2pCO1lBQ0Y7WUFFQSxNQUFNQyxrQkFBa0IvRSxPQUFPc0QsTUFBTSxDQUFDMEIsS0FBSyxFQUFFRDtZQUM3QyxNQUFNRSxVQUFtQkYsa0JBQ3JCLE1BQU1uRSxRQUFRdUMsT0FBTyxDQUFDNEIsZ0JBQWdCWCxnQkFDdENBO1lBRUosTUFBTWMsT0FBTyxJQUFJOUUsWUFBWStELE9BQU9lLElBQUk7WUFDeEMsT0FBT2xGLE9BQU9tRixpQkFBaUIsQ0FBQ3hDLEdBQUcsQ0FBQztnQkFBRXNDO1lBQVEsR0FBRyxJQUMvQ3JDLFFBQVFYLFFBQVEsQ0FBQztvQkFDZlksT0FBT3NCLE9BQU90QixLQUFLO29CQUNuQnFDO29CQUNBbkQsU0FBU29DLE9BQU9wQyxPQUFPO29CQUN2QnFELFFBQVExRixVQUFVTyx3QkFBd0IyQyxRQUFRakIsSUFBSSxFQUFFO2dCQUMxRDtRQUVKO1FBRUEsTUFBTUgsV0FBVyxJQUFJLENBQUMsQ0FBQSxFQUFHLENBQUM2RCxjQUFjLENBQ3RDO1lBQ0UxRCxNQUFNaUIsUUFBUWpCLElBQUk7WUFDbEJJLFNBQVNhLFFBQVFiLE9BQU8sSUFBSWdCO1lBQzVCZixRQUFRWSxRQUFRWixNQUFNO1lBQ3RCRyxhQUFhUyxRQUFRVCxXQUFXO1FBQ2xDLEdBQ0FEO1FBRUYsT0FBT1Y7SUFDVDtJQUVBLHFDQUFxQztJQUNyQyxNQUFNSSxtQkFBbUJKLFFBQTJELEVBQUU7UUFDcEYsSUFBSSxDQUFDLENBQUEsRUFBRyxDQUFDSSxrQkFBa0IsQ0FBQ0osU0FBU0csSUFBSSxFQUFFSCxTQUFTTyxPQUFPLElBQUk7SUFDakU7SUFFQSxrQkFBa0I7SUFDbEJ1RCxZQUFZMUMsT0FBd0IsRUFBRTtRQUNwQyxJQUFJLENBQUMsQ0FBQSxNQUFPLEdBQUcsSUFBSSxDQUFDLENBQUEsRUFBRyxDQUFDMkMsU0FBUyxDQUFDM0M7SUFDcEM7SUFFQSx5Q0FBeUM7SUFDekMsTUFBTTRDLGNBQWM7UUFDbEIsTUFBTSxJQUFJLENBQUMsQ0FBQSxPQUFRLENBQUNDLFVBQVU7UUFDOUIsTUFBTSxJQUFJLENBQUMsQ0FBQSxNQUFPLEVBQUU3QjtJQUN0QjtJQUVBLGFBQWE7SUFDYixNQUFNOEIsYUFBYTtRQUNqQixNQUFNLElBQUksQ0FBQyxDQUFBLE1BQU8sRUFBRXpCO0lBQ3RCO0lBRUEsb0JBQW9CO0lBQ3BCLE1BQU0wQixnQkFBZ0I7UUFDcEIsTUFBTS9FLFFBQVFDLFVBQVUsQ0FDdEJDLE1BQU1DLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxjQUFlLENBQUM2RSxNQUFNLElBQUlyRSxHQUFHLENBQUMsQ0FBQyxFQUFFeUIsSUFBSSxFQUFFLEdBQUtwQyxRQUFRdUMsT0FBTyxDQUFDSCxLQUFLaUIsSUFBSTtJQUV6RjtJQUVBLG9CQUFvQjtJQUNwQixNQUFNNEIsbUJBQW1CO1FBQ3ZCLE1BQU1qRixRQUFRQyxVQUFVLENBQ3RCQyxNQUFNQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsY0FBZSxDQUFDNkUsTUFBTSxJQUFJckUsR0FBRyxDQUFDLENBQUMsRUFBRXlCLElBQUksRUFBRSxHQUFLcEMsUUFBUXVDLE9BQU8sQ0FBQ0gsS0FBS2tCLE9BQU87UUFFMUYsSUFBSSxDQUFDLENBQUEsY0FBZSxDQUFDNEIsS0FBSztJQUM1QjtJQUVBLE1BQU01QixVQUFVO1FBQ2QsTUFBTSxJQUFJLENBQUN5QixhQUFhO1FBQ3hCLE1BQU0sSUFBSSxDQUFDRCxVQUFVO1FBQ3JCLE1BQU0sSUFBSSxDQUFDRyxnQkFBZ0I7UUFDM0IsTUFBTSxJQUFJLENBQUMsQ0FBQSxPQUFRLENBQUM1QixJQUFJO0lBQzFCO0lBRUEsQ0FBQzhCLE9BQU9DLFlBQVksQ0FBQyxHQUFHO1FBQ3RCLE9BQU8sSUFBSSxDQUFDOUIsT0FBTztJQUNyQjtBQUNGIn0=
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy93b3JrZmxvdy1tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciwgdHlwZSBMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQmFja2VuZFBvc3RncmVzLCBPcGVuV29ya2Zsb3csIHR5cGUgV29ya2VyIH0gZnJvbSBcIkBzb25hbXUta2l0L3Rhc2tzXCI7XG5pbXBvcnQge1xuICB0eXBlIFJ1bm5hYmxlV29ya2Zsb3csXG4gIHR5cGUgU2NoZW1hSW5wdXQsXG4gIHR5cGUgU2NoZW1hT3V0cHV0LFxuICB0eXBlIFN0YW5kYXJkU2NoZW1hVjEsXG4gIHR5cGUgU3RlcEFwaSxcbiAgc2VyaWFsaXplUmV0cnlQb2xpY3ksXG4gIHR5cGUgV29ya2Zsb3dSdW5IYW5kbGUsXG4gIHR5cGUgV29ya2Zsb3dTcGVjLFxufSBmcm9tIFwiQHNvbmFtdS1raXQvdGFza3MvaW50ZXJuYWxcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHNjaGVkdWxlIGFzIGNyb25TY2hlZHVsZSwgdHlwZSBTY2hlZHVsZWRUYXNrIH0gZnJvbSBcIm5vZGUtY3JvblwiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi4vYXBpL2NvbnRleHRcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBjcmVhdGVNb2NrU1NFRmFjdG9yeSB9IGZyb20gXCIuLi9zdHJlYW0vc3NlXCI7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGFibGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gXCIuL2RlY29yYXRvclwiO1xuaW1wb3J0IHsgU3RlcFdyYXBwZXIgfSBmcm9tIFwiLi9zdGVwLXdyYXBwZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd09wdGlvbnMge1xuICAvLyB3b3JrZXLsl5DshJwg64+Z7IucIOyLpO2Wie2VoCDtg5zsiqTtgawg7IiYLCDquLDrs7jsnYAgQ1BVIOy9lOyWtCDsiJggLSAx6rCcXG4gIGNvbmN1cnJlbmN5PzogbnVtYmVyO1xuXG4gIC8vIHdvcmtlcuyXkOyEnCDsgqzsmqntlaAgcHViL3N1YiDsl6zrtoAsIOq4sOuzuOydgCB0cnVlXG4gIHVzZVB1YlN1Yj86IGJvb2xlYW47XG5cbiAgLy8gcHViL3N1YuycvOuhnCDtg5zsiqTtgazrpbwg7IiY7Iug7ZaI7J2EIOuVjCDsm4ztgaztlIzroZzsmrAg7Iuk7ZaJ6rmM7KeAIOyngOyXsCDsi5zqsIQsIOq4sOuzuOydgCA1MDBtc1xuICBsaXN0ZW5EZWxheT86IG51bWJlcjtcbn1cblxuLy8gV29ya2Zsb3cg7ZWo7IiY7J2YIO2DgOyehSwgQHNvbmFtdS1raXQvdGFza3PsmYAg64uk66W4IOygkOydgCBzdGVw7J2EIO2VnOuyiCDqsJDsi7wg7ZiV7YOcLlxuZXhwb3J0IHR5cGUgV29ya2Zsb3dGdW5jdGlvbjxJbnB1dCwgT3V0cHV0PiA9IChcbiAgcGFyYW1zOiBSZWFkb25seTx7XG4gICAgbG9nZ2VyOiBMb2dnZXI7XG4gICAgaW5wdXQ6IElucHV0O1xuICAgIHN0ZXA6IFN0ZXBXcmFwcGVyO1xuICAgIHZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gIH0+LFxuKSA9PiBQcm9taXNlPE91dHB1dD4gfCBPdXRwdXQ7XG5cbi8vIFdvcmtmbG9366W8IOuTseuhne2VoCDrlYzrpbwg7JyE7ZWcIO2DgOyehVxuZXhwb3J0IHR5cGUgV29ya2Zsb3dDcmVhdGVPcHRpb25zPFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbj4gPSBPbWl0PFxuICBXb3JrZmxvd1NwZWM8U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0LCBTY2hlbWFJbnB1dDxUU2NoZW1hLCBJbnB1dD4+LFxuICBcInZlcnNpb25cIlxuPiAmIHtcbiAgaWQ6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgZnVuY3Rpb246IFdvcmtmbG93RnVuY3Rpb248U2NoZW1hT3V0cHV0PFRTY2hlbWEsIElucHV0PiwgT3V0cHV0Pjtcbn07XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd01hbmFnZXIge1xuICAvLyBiYWNrZW5kIOyduOyKpO2EtOyKpFxuICByZWFkb25seSAjYmFja2VuZDogQmFja2VuZFBvc3RncmVzO1xuXG4gIC8vIE9wZW5Xb3JrZmxvdyDsnbjsiqTthLTsiqRcbiAgcmVhZG9ubHkgI293OiBPcGVuV29ya2Zsb3c7XG5cbiAgLy8gV29ya2VyIOyduOyKpO2EtOyKpCAo7JeG7J2EIOyImCDsnojsnLzrqbAsIOydtCDrlYzripQg67aE7IKw65CcIOyEnOuyhCDtmZjqsr3sl5DshJwgRELsl5AgcHVibGlzaOunjCDtlZzri6Tqs6Ag6rCA7KCV7ZWoKVxuICAjd29ya2VyOiBXb3JrZXIgfCBudWxsO1xuXG4gIC8vIO2MjOydvCDqsr3roZwgLT4g7YyM7J287JeQIOygleydmOuQnCDsm4ztgaztlIzroZzsmrAg66mU7YOA642w7J207YSwIOuqqeuhnVxuICAjd29ya2Zsb3dzTWFwOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+O1xuXG4gIC8vIFRhc2sg7J2066aEIC0+IFRhc2sg7KCV67O0IOuwjyBJbnB1dCDqsJIsIFdvcmtmbG93IElEXG4gICNzY2hlZHVsZWRUYXNrczogTWFwPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICB0YXNrOiBTY2hlZHVsZWRUYXNrO1xuICAgICAgaW5wdXRGbjogRXhlY3V0YWJsZTxTY2hlbWFJbnB1dDx1bmtub3duLCB1bmtub3duPj47XG4gICAgICB3b3JrZmxvd0lkOiBzdHJpbmc7XG4gICAgfVxuICA+O1xuXG4gIC8vIEJhY2tlbmRQb3N0Z3Jlc+yXkOyEnCDsspjrpqztlZjripQg6rKD65Ok7J20IOyeiOyWtOyEnCBLbmV4IOy7pOuEpeyFmOydtCDslYTri4jrnbwg7ISk7KCV6rCS7J2EIOuEo+yWtOykmOyVvO2VqC5cbiAgY29uc3RydWN0b3IoZGJDb25mOiBLbmV4LkNvbmZpZywgcnVuTWlncmF0aW9uczogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBjb25zdCBiYWNrZW5kID0gbmV3IEJhY2tlbmRQb3N0Z3JlcyhkYkNvbmYsIHsgcnVuTWlncmF0aW9ucyB9KTtcblxuICAgIHRoaXMuI2JhY2tlbmQgPSBiYWNrZW5kO1xuICAgIHRoaXMuI293ID0gbmV3IE9wZW5Xb3JrZmxvdyh7IGJhY2tlbmQgfSk7XG4gICAgdGhpcy4jd29ya2VyID0gbnVsbDtcblxuICAgIHRoaXMuI3dvcmtmbG93c01hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLiNzY2hlZHVsZWRUYXNrcyA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIC8vIFNvbmFtdSBVSSBBUEnsl5DshJwg7JuM7YGs7ZSM66Gc7JqwIOyLpO2WiSDrqqnroZ0g7KGw7ZqMLCDst6jshowg65Ox7JeQIOyCrOyaqe2VqeuLiOuLpC5cbiAgZ2V0IGJhY2tlbmQoKTogQmFja2VuZFBvc3RncmVzIHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZDtcbiAgfVxuXG4gIGdldCB3b3JrZmxvd0RlZmluaXRpb25zKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuI3dvcmtmbG93c01hcC52YWx1ZXMoKSlcbiAgICAgIC5mbGF0KClcbiAgICAgIC5tYXAoKHdmKSA9PiAoe1xuICAgICAgICBpZDogd2YuaWQsXG4gICAgICAgIG5hbWU6IHdmLm5hbWUsXG4gICAgICAgIHZlcnNpb246IHdmLnZlcnNpb24sXG4gICAgICAgIHNjaGVkdWxlczogd2Yuc2NoZWR1bGVzLm1hcCgocykgPT4gKHtcbiAgICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogcy5leHByZXNzaW9uLFxuICAgICAgICB9KSksXG4gICAgICAgIHJldHJ5UG9saWN5OiB3Zi5yZXRyeVBvbGljeSA/IHNlcmlhbGl6ZVJldHJ5UG9saWN5KHdmLnJldHJ5UG9saWN5KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsoJXsnZjrkJwg7JuM7YGs7ZSM66Gc7JqwIOuwjyDsm4ztgaztlIzroZzsmrDsl5Ag64yA7ZWcIHNjaGVkdWxlZCB0YXNrc+ulvCDrj5nquLDtmZTtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBzeW5jaHJvbml6ZSh3b3JrZmxvd01hcDogTWFwPHN0cmluZywgV29ya2Zsb3dNZXRhZGF0YVtdPikge1xuICAgIC8vIDEuIOyCreygnOuQnCDtjIzsnbzsnYAg7J286rSEIOyCreygnFxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIEFycmF5LmZyb20odGhpcy4jd29ya2Zsb3dzTWFwLmVudHJpZXMoKSlcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+ICF3b3JrZmxvd01hcC5oYXMoa2V5KSlcbiAgICAgICAgLmZsYXRNYXAoKFtfLCB3b3JrZmxvd3NdKSA9PlxuICAgICAgICAgIHdvcmtmbG93cy5tYXAoKHdvcmtmbG93KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgICAgICAgLi4ud29ya2Zsb3cuc2NoZWR1bGVzLm1hcCgoc2NoZWR1bGUpID0+IHRoaXMudW5zY2hlZHVsZVRhc2soc2NoZWR1bGUubmFtZSkpLFxuICAgICAgICAgICAgICB0aGlzLnVucmVnaXN0ZXJXb3JrZmxvdyh3b3JrZmxvdyksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gMi4g7IOI66GcIOy2lOqwgOuQnCDtjIzsnbzsnYAg7J286rSEIOuTseuhnVxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIEFycmF5LmZyb20od29ya2Zsb3dNYXAuZW50cmllcygpKVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gIXRoaXMuI3dvcmtmbG93c01hcC5oYXMoa2V5KSlcbiAgICAgICAgLmZsYXRNYXAoKFtfLCB3b3JrZmxvd3NdKSA9PlxuICAgICAgICAgIHdvcmtmbG93cy5tYXAoKHdvcmtmbG93KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyV29ya2Zsb3coe1xuICAgICAgICAgICAgICBpZDogd29ya2Zsb3cuaWQsXG4gICAgICAgICAgICAgIG5hbWU6IHdvcmtmbG93Lm5hbWUsXG4gICAgICAgICAgICAgIHZlcnNpb246IHdvcmtmbG93LnZlcnNpb24gPz8gbnVsbCxcbiAgICAgICAgICAgICAgc2NoZW1hOiB3b3JrZmxvdy5zY2hlbWEsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uOiB3b3JrZmxvdy5mbixcbiAgICAgICAgICAgICAgcmV0cnlQb2xpY3k6IHdvcmtmbG93LnJldHJ5UG9saWN5LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgICAgIHdvcmtmbG93LnNjaGVkdWxlcy5tYXAoKHNjaGVkdWxlKSA9PiB0aGlzLnNjaGVkdWxlVGFzayh3b3JrZmxvdywgc2NoZWR1bGUpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIDMuIOq4sOyhtOqzvCDri6Trpbgg6rKD7J2EIGRpZmbsuZwg64uk7J2MLCDsgq3soJwg7ZuEIOyerOuTseuhnVxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIEFycmF5LmZyb20od29ya2Zsb3dNYXAuZW50cmllcygpKVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4gdGhpcy4jd29ya2Zsb3dzTWFwLmhhcyhrZXkpKVxuICAgICAgICAubWFwPFtzdHJpbmcsIFtXb3JrZmxvd01ldGFkYXRhW10sIFdvcmtmbG93TWV0YWRhdGFbXV1dPigoW2tleSwgbmV3V29ya2Zsb3dzXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzV29ya2Zsb3dzID0gdGhpcy4jd29ya2Zsb3dzTWFwLmdldChrZXkpO1xuICAgICAgICAgIGFzc2VydChwcmV2aW91c1dvcmtmbG93cywgXCJwcmV2aW91cyB3b3JrZmxvd3Mgbm90IGZvdW5kXCIpO1xuICAgICAgICAgIHJldHVybiBba2V5LCBbcHJldmlvdXNXb3JrZmxvd3MsIG5ld1dvcmtmbG93c11dO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKGFzeW5jIChbXywgW3ByZXZpb3VzV29ya2Zsb3dzLCBuZXdXb3JrZmxvd3NdXSkgPT4ge1xuICAgICAgICAgIC8vIOq4sOyhtCDqsoPrk6TsnYQg7IKt7KCc67aA7YSwIO2VtOyVvO2VqC5cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgICBwcmV2aW91c1dvcmtmbG93c1xuICAgICAgICAgICAgICAuZmlsdGVyKChwcmV2SXRlbSkgPT4gIW5ld1dvcmtmbG93cy5zb21lKChuZXdJdGVtKSA9PiBuZXdJdGVtLmlkID09PSBwcmV2SXRlbS5pZCkpXG4gICAgICAgICAgICAgIC5tYXAoKHByZXZJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICAgICAgICAuLi5wcmV2SXRlbS5zY2hlZHVsZXMubWFwKChzY2hlZHVsZSkgPT4gdGhpcy51bnNjaGVkdWxlVGFzayhzY2hlZHVsZS5uYW1lKSksXG4gICAgICAgICAgICAgICAgICB0aGlzLnVucmVnaXN0ZXJXb3JrZmxvdyhwcmV2SXRlbSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyDsg4jroZwg7LaU6rCA65CcIOqyg+uTpOydhCDrk7HroZ1cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICAgICAgICBuZXdXb3JrZmxvd3NcbiAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAobmV3SXRlbSkgPT4gIXByZXZpb3VzV29ya2Zsb3dzLnNvbWUoKHByZXZJdGVtKSA9PiBwcmV2SXRlbS5pZCA9PT0gbmV3SXRlbS5pZCksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLm1hcChhc3luYyAobmV3SXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJXb3JrZmxvdyh7XG4gICAgICAgICAgICAgICAgICBpZDogbmV3SXRlbS5pZCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IG5ld0l0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgIHZlcnNpb246IG5ld0l0ZW0udmVyc2lvbiA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiBuZXdJdGVtLnNjaGVtYSxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOiBuZXdJdGVtLmZuLFxuICAgICAgICAgICAgICAgICAgcmV0cnlQb2xpY3k6IG5ld0l0ZW0ucmV0cnlQb2xpY3ksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICAgICAgICAgICAgbmV3SXRlbS5zY2hlZHVsZXMubWFwKChzY2hlZHVsZSkgPT4gdGhpcy5zY2hlZHVsZVRhc2sobmV3SXRlbSwgc2NoZWR1bGUpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy4jd29ya2Zsb3dzTWFwID0gd29ya2Zsb3dNYXA7XG4gIH1cblxuICAvLyDsm4ztgaztlIzroZzsmrDrpbwg7Iuk7ZaJXG4gIHJ1bjxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgb3B0aW9uczogT21pdDxXb3JrZmxvd0NyZWF0ZU9wdGlvbnM8SW5wdXQsIE91dHB1dCwgVFNjaGVtYT4sIFwiZnVuY3Rpb25cIiB8IFwic2NoZW1hXCIgfCBcImlkXCI+LFxuICAgIGlucHV0OiBTY2hlbWFJbnB1dDxUU2NoZW1hLCBJbnB1dD4sXG4gICk6IFByb21pc2U8V29ya2Zsb3dSdW5IYW5kbGU8T3V0cHV0Pj4ge1xuICAgIHJldHVybiB0aGlzLiNvdy5ydW5Xb3JrZmxvdyhcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIGlucHV0LFxuICAgICk7XG4gIH1cblxuICAvLyBjcm9uIHRhc2vrpbwg65Ox66GdXG4gIGFzeW5jIHNjaGVkdWxlVGFzayhcbiAgICB3b3JrZmxvdzogUGljazxXb3JrZmxvd01ldGFkYXRhLCBcImlkXCIgfCBcIm5hbWVcIiB8IFwidmVyc2lvblwiPixcbiAgICBzY2hlZHVsZTogV29ya2Zsb3dNZXRhZGF0YVtcInNjaGVkdWxlc1wiXVtudW1iZXJdLFxuICApIHtcbiAgICAvLyBXb3JrZXLqsIAg7Zmc7ISx7ZmU65CcIOuFuOuTnOyXkOyEnOunjCDsspjrpqxcbiAgICBpZiAoIXRoaXMuI3dvcmtlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhc2sgPSBjcm9uU2NoZWR1bGUoXG4gICAgICBzY2hlZHVsZS5leHByZXNzaW9uLFxuICAgICAgKGFzeW5jIChcbiAgICAgICAgeyBuYW1lLCB2ZXJzaW9uIH06IFBpY2s8V29ya2Zsb3dNZXRhZGF0YSwgXCJuYW1lXCIgfCBcInZlcnNpb25cIj4sXG4gICAgICAgIHsgaW5wdXQgfTogV29ya2Zsb3dNZXRhZGF0YVtcInNjaGVkdWxlc1wiXVtudW1iZXJdLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0RGF0YSA9IGF3YWl0ICh0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gUHJvbWlzZS5yZXNvbHZlKGlucHV0KCkpXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoaW5wdXQpKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5ydW4oeyBuYW1lLCB2ZXJzaW9uOiB2ZXJzaW9uID8/IG51bGwgfSwgaW5wdXREYXRhKTtcbiAgICAgIH0pLmJpbmQodGhpcywgd29ya2Zsb3csIHNjaGVkdWxlKSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogc2NoZWR1bGUubmFtZSxcbiAgICAgICAgdGltZXpvbmU6IFNvbmFtdS5jb25maWcuYXBpLnRpbWV6b25lLFxuICAgICAgICBub092ZXJsYXA6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy4jc2NoZWR1bGVkVGFza3Muc2V0KHNjaGVkdWxlLm5hbWUsIHtcbiAgICAgIHRhc2ssXG4gICAgICBpbnB1dEZuOiBzY2hlZHVsZS5pbnB1dCxcbiAgICAgIHdvcmtmbG93SWQ6IHdvcmtmbG93LmlkLFxuICAgIH0pO1xuICAgIGF3YWl0IHRhc2suc3RhcnQoKTtcbiAgfVxuXG4gIC8vIGNyb24gdGFza+ulvCDspJHsp4BcbiAgYXN5bmMgdW5zY2hlZHVsZVRhc2sobmFtZTogc3RyaW5nKSB7XG4gICAgLy8gV29ya2Vy6rCAIO2ZnOyEse2ZlOuQnCDrhbjrk5zsl5DshJzrp4wg7LKY66asXG4gICAgaWYgKCF0aGlzLiN3b3JrZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXNrSXRlbSA9IHRoaXMuI3NjaGVkdWxlZFRhc2tzLmdldChuYW1lKTtcbiAgICBpZiAoIXRhc2tJdGVtKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwic2NoZWR1bGVkIHRhc2sgbm90IGZvdW5kXCIsIG5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuI3NjaGVkdWxlZFRhc2tzLmRlbGV0ZShuYW1lKTtcbiAgICBhd2FpdCB0YXNrSXRlbS50YXNrLnN0b3AoKTtcbiAgICBhd2FpdCB0YXNrSXRlbS50YXNrLmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8vIOybjO2BrO2UjOuhnOyasOulvCDrk7HroZ0sIOq0gOugqOuQnCDsiqTsvIDspITsnYAg67OE64+E66GcIOuTseuhne2VtOyVvCDtlaguXG4gIHJlZ2lzdGVyV29ya2Zsb3c8SW5wdXQsIE91dHB1dCwgVFNjaGVtYSBleHRlbmRzIFN0YW5kYXJkU2NoZW1hVjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICAgIG9wdGlvbnM6IFdvcmtmbG93Q3JlYXRlT3B0aW9uczxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hPixcbiAgKTogUnVubmFibGVXb3JrZmxvdzxTY2hlbWFPdXRwdXQ8VFNjaGVtYSwgSW5wdXQ+LCBPdXRwdXQsIFNjaGVtYUlucHV0PFRTY2hlbWEsIElucHV0Pj4ge1xuICAgIGNvbnN0IGZuID0gYXN5bmMgKFxuICAgICAgcGFyYW1zOiBSZWFkb25seTx7XG4gICAgICAgIGlucHV0OiBTY2hlbWFPdXRwdXQ8VFNjaGVtYSwgSW5wdXQ+O1xuICAgICAgICBzdGVwOiBTdGVwQXBpO1xuICAgICAgICB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgICAgfT4sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBiYXNlQ29udGV4dCA9IHtcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgbmFpdGVTdG9yZTogTmFpdGUuY3JlYXRlU3RvcmUoKSxcbiAgICAgICAgdXNlcjogbnVsbCxcbiAgICAgICAgcGFzc3BvcnQ6IHtcbiAgICAgICAgICBsb2dpbjogYXN5bmMgKCkgPT4ge30sXG4gICAgICAgICAgbG9nb3V0OiAoKSA9PiB7fSxcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuXG4gICAgICBjb25zdCBjb250ZXh0UHJvdmlkZXIgPSBTb25hbXUuY29uZmlnLnRhc2tzPy5jb250ZXh0UHJvdmlkZXI7XG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gY29udGV4dFByb3ZpZGVyXG4gICAgICAgID8gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGNvbnRleHRQcm92aWRlcihiYXNlQ29udGV4dCkpXG4gICAgICAgIDogYmFzZUNvbnRleHQ7XG5cbiAgICAgIGNvbnN0IHN0ZXAgPSBuZXcgU3RlcFdyYXBwZXIocGFyYW1zLnN0ZXApO1xuICAgICAgcmV0dXJuIFNvbmFtdS5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sICgpID0+XG4gICAgICAgIG9wdGlvbnMuZnVuY3Rpb24oe1xuICAgICAgICAgIGlucHV0OiBwYXJhbXMuaW5wdXQsXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICB2ZXJzaW9uOiBwYXJhbXMudmVyc2lvbixcbiAgICAgICAgICBsb2dnZXI6IGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeShvcHRpb25zLm5hbWUsIFwid29ya2Zsb3dcIikpLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IHdvcmtmbG93ID0gdGhpcy4jb3cuZGVmaW5lV29ya2Zsb3coXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSxcbiAgICAgICAgcmV0cnlQb2xpY3k6IG9wdGlvbnMucmV0cnlQb2xpY3ksXG4gICAgICB9LFxuICAgICAgZm4sXG4gICAgKTtcbiAgICByZXR1cm4gd29ya2Zsb3c7XG4gIH1cblxuICAvLyDsm4ztgaztlIzroZzsmrDrpbwg65Ox66GdIO2VtOygnCwg6rSA66Co65CcIOyKpOy8gOykhOydgCDrs4Trj4TroZwg7ZW07KCc7ZW07JW8IO2VqC5cbiAgYXN5bmMgdW5yZWdpc3RlcldvcmtmbG93KHdvcmtmbG93OiBQaWNrPFdvcmtmbG93TWV0YWRhdGEsIFwibmFtZVwiIHwgXCJ2ZXJzaW9uXCIgfCBcImlkXCI+KSB7XG4gICAgdGhpcy4jb3cudW5yZWdpc3RlcldvcmtmbG93KHdvcmtmbG93Lm5hbWUsIHdvcmtmbG93LnZlcnNpb24gPz8gbnVsbCk7XG4gIH1cblxuICAvLyBXb3JrZXLrpbwg7ISk7KCVIO2bhCDsi5zsnpFcbiAgc2V0dXBXb3JrZXIob3B0aW9uczogV29ya2Zsb3dPcHRpb25zKSB7XG4gICAgdGhpcy4jd29ya2VyID0gdGhpcy4jb3cubmV3V29ya2VyKG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gV29ya2Vy6rCAIOyeiOycvOuptCBXb3JrZXLquYzsp4Ag7LSI6riw7ZmULCDslYTri4jrqbQg67Cx7JeU65Oc66eMIOy0iOq4sO2ZlFxuICBhc3luYyBzdGFydFdvcmtlcigpIHtcbiAgICBhd2FpdCB0aGlzLiNiYWNrZW5kLmluaXRpYWxpemUoKTtcbiAgICBhd2FpdCB0aGlzLiN3b3JrZXI/LnN0YXJ0KCk7XG4gIH1cblxuICAvLyBXb3JrZXLrpbwg7KSR7KeAXG4gIGFzeW5jIHN0b3BXb3JrZXIoKSB7XG4gICAgYXdhaXQgdGhpcy4jd29ya2VyPy5zdG9wKCk7XG4gIH1cblxuICAvLyBjcm9uIHRhc2vrk6TsnYQg66qo65GQIOykkeyngFxuICBhc3luYyBzdG9wU2NoZWR1bGVzKCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIEFycmF5LmZyb20odGhpcy4jc2NoZWR1bGVkVGFza3MudmFsdWVzKCkpLm1hcCgoeyB0YXNrIH0pID0+IFByb21pc2UucmVzb2x2ZSh0YXNrLnN0b3AoKSkpLFxuICAgICk7XG4gIH1cblxuICAvLyBjcm9uIHRhc2vrk6TsnYQg66qo65GQIOygleumrFxuICBhc3luYyBkZXN0cm95U2NoZWR1bGVzKCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIEFycmF5LmZyb20odGhpcy4jc2NoZWR1bGVkVGFza3MudmFsdWVzKCkpLm1hcCgoeyB0YXNrIH0pID0+IFByb21pc2UucmVzb2x2ZSh0YXNrLmRlc3Ryb3koKSkpLFxuICAgICk7XG4gICAgdGhpcy4jc2NoZWR1bGVkVGFza3MuY2xlYXIoKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wU2NoZWR1bGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zdG9wV29ya2VyKCk7XG4gICAgYXdhaXQgdGhpcy5kZXN0cm95U2NoZWR1bGVzKCk7XG4gICAgYXdhaXQgdGhpcy4jYmFja2VuZC5zdG9wKCk7XG4gIH1cblxuICBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVzdHJveSgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiZ2V0TG9nZ2VyIiwiQmFja2VuZFBvc3RncmVzIiwiT3BlbldvcmtmbG93Iiwic2VyaWFsaXplUmV0cnlQb2xpY3kiLCJhc3NlcnQiLCJzY2hlZHVsZSIsImNyb25TY2hlZHVsZSIsIlNvbmFtdSIsImNvbnZlcnREb21haW5Ub0NhdGVnb3J5IiwiTmFpdGUiLCJjcmVhdGVNb2NrU1NFRmFjdG9yeSIsIlN0ZXBXcmFwcGVyIiwiV29ya2Zsb3dNYW5hZ2VyIiwiZGJDb25mIiwicnVuTWlncmF0aW9ucyIsImJhY2tlbmQiLCJNYXAiLCJ3b3JrZmxvd0RlZmluaXRpb25zIiwiQXJyYXkiLCJmcm9tIiwidmFsdWVzIiwiZmxhdCIsIm1hcCIsIndmIiwiaWQiLCJuYW1lIiwidmVyc2lvbiIsInNjaGVkdWxlcyIsInMiLCJleHByZXNzaW9uIiwicmV0cnlQb2xpY3kiLCJ1bmRlZmluZWQiLCJzeW5jaHJvbml6ZSIsIndvcmtmbG93TWFwIiwiUHJvbWlzZSIsImFsbFNldHRsZWQiLCJlbnRyaWVzIiwiZmlsdGVyIiwia2V5IiwiaGFzIiwiZmxhdE1hcCIsIl8iLCJ3b3JrZmxvd3MiLCJ3b3JrZmxvdyIsInVuc2NoZWR1bGVUYXNrIiwidW5yZWdpc3RlcldvcmtmbG93IiwicmVnaXN0ZXJXb3JrZmxvdyIsInNjaGVtYSIsImZ1bmN0aW9uIiwiZm4iLCJzY2hlZHVsZVRhc2siLCJuZXdXb3JrZmxvd3MiLCJwcmV2aW91c1dvcmtmbG93cyIsImdldCIsInByZXZJdGVtIiwic29tZSIsIm5ld0l0ZW0iLCJydW4iLCJvcHRpb25zIiwiaW5wdXQiLCJydW5Xb3JrZmxvdyIsInRhc2siLCJpbnB1dERhdGEiLCJyZXNvbHZlIiwiYmluZCIsInRpbWV6b25lIiwiY29uZmlnIiwiYXBpIiwibm9PdmVybGFwIiwic2V0IiwiaW5wdXRGbiIsIndvcmtmbG93SWQiLCJzdGFydCIsInRhc2tJdGVtIiwiY29uc29sZSIsImVycm9yIiwiZGVsZXRlIiwic3RvcCIsImRlc3Ryb3kiLCJwYXJhbXMiLCJiYXNlQ29udGV4dCIsInJlcXVlc3QiLCJyZXBseSIsImhlYWRlcnMiLCJjcmVhdGVTU0UiLCJuYWl0ZVN0b3JlIiwiY3JlYXRlU3RvcmUiLCJ1c2VyIiwicGFzc3BvcnQiLCJsb2dpbiIsImxvZ291dCIsImNvbnRleHRQcm92aWRlciIsInRhc2tzIiwiY29udGV4dCIsInN0ZXAiLCJhc3luY0xvY2FsU3RvcmFnZSIsImxvZ2dlciIsImRlZmluZVdvcmtmbG93Iiwic2V0dXBXb3JrZXIiLCJuZXdXb3JrZXIiLCJzdGFydFdvcmtlciIsImluaXRpYWxpemUiLCJzdG9wV29ya2VyIiwic3RvcFNjaGVkdWxlcyIsImRlc3Ryb3lTY2hlZHVsZXMiLCJjbGVhciIsIlN5bWJvbCIsImFzeW5jRGlzcG9zZSJdLCJtYXBw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
@@ -10,11 +10,11 @@ import { propToZodType, zodTypeToRenderingNode } from "./zod-converter.js";
10
10
  * object와 array의 경우 적절한 pick 필드를 자동으로 선택합니다.
11
11
  */ export async function getColumnsNode(entityId, subsetKey) {
12
12
  const entity = EntityManager.get(entityId);
13
- const subset = entity.subsets[subsetKey];
14
- if (subset === undefined) {
13
+ const subsetDef = entity.subsets[subsetKey];
14
+ if (subsetDef === undefined) {
15
15
  throw new ServiceUnavailableException(SD("sonamu.error.subsetNotFound")(subsetKey));
16
16
  }
17
- const propNodes = entity.fieldExprsToPropNodes(subset);
17
+ const propNodes = entity.fieldExprsToPropNodes(subsetDef);
18
18
  const rootPropNode = {
19
19
  nodeType: "object",
20
20
  children: propNodes
@@ -106,4 +106,4 @@ import { propToZodType, zodTypeToRenderingNode } from "./zod-converter.js";
106
106
  }
107
107
  }
108
108
 
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS9lbnRpdHktY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHogZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5UHJvcE5vZGUsIFJlbmRlcmluZ05vZGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHByb3BUb1pvZFR5cGUsIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUgfSBmcm9tIFwiLi96b2QtY29udmVydGVyXCI7XG5cbi8qKlxuICog7JeU7Yuw7Yuw7J2YIO2KueyglSBzdWJzZXTsnYQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBzdWJzZXTsnZgg7ZWE65Oc65Ok7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWcIO2bhCBVSSDroIzrjZTrp4Hsmqkg64W465Oc66GcIOunjOuTreuLiOuLpC5cbiAqIG9iamVjdOyZgCBhcnJheeydmCDqsr3smrAg7KCB7KCI7ZWcIHBpY2sg7ZWE65Oc66W8IOyekOuPmeycvOuhnCDshKDtg53tlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb2x1bW5zTm9kZShlbnRpdHlJZDogc3RyaW5nLCBzdWJzZXRLZXk6IHN0cmluZyk6IFByb21pc2U8UmVuZGVyaW5nTm9kZT4ge1xuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGNvbnN0IHN1YnNldCA9IGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG4gIGlmIChzdWJzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iuc3Vic2V0Tm90Rm91bmRcIikoc3Vic2V0S2V5KSk7XG4gIH1cbiAgY29uc3QgcHJvcE5vZGVzID0gZW50aXR5LmZpZWxkRXhwcnNUb1Byb3BOb2RlcyhzdWJzZXQpO1xuICBjb25zdCByb290UHJvcE5vZGU6IEVudGl0eVByb3BOb2RlID0ge1xuICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiLFxuICAgIGNoaWxkcmVuOiBwcm9wTm9kZXMsXG4gIH07XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiB6b2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VoCDrlYwg7IKs7Jqp7ZWY64qUIO2DgOyehVxuICBjb25zdCBjb2x1bW5zWm9kVHlwZSA9IChhd2FpdCBwcm9wTm9kZVRvWm9kVHlwZShyb290UHJvcE5vZGUpKSBhcyB6LlpvZE9iamVjdDxhbnk+O1xuXG4gIGNvbnN0IGNvbHVtbnNOb2RlID0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShjb2x1bW5zWm9kVHlwZSk7XG4gIGFzc2VydChjb2x1bW5zTm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkLCBcImNvbHVtbnNOb2RlLmNoaWxkcmVuIGlzIHVuZGVmaW5lZFwiKTtcbiAgY29sdW1uc05vZGUuY2hpbGRyZW4gPSBjb2x1bW5zTm9kZS5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgaWYgKGNoaWxkLnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGFzc2VydChjaGlsZC5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkLCBcImNoaWxkLmNoaWxkcmVuIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGNvbnN0IHBpY2tlZENvbCA9IGNoaWxkLmNoaWxkcmVuLmZpbmQoKGNjKSA9PiBbXCJ0aXRsZVwiLCBcIm5hbWVcIl0uaW5jbHVkZXMoY2MubmFtZSkpO1xuICAgICAgaWYgKHBpY2tlZENvbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0LXBpY2tcIixcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIHBpY2tlZDogcGlja2VkQ29sLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hpbGQucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmXG4gICAgICBjaGlsZC5lbGVtZW50ICYmXG4gICAgICBjaGlsZC5lbGVtZW50LnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHBpY2tlZENvbCA9IGNoaWxkLmVsZW1lbnQ/LmNoaWxkcmVuPy5maW5kKChjYykgPT4gW1widGl0bGVcIiwgXCJuYW1lXCJdLmluY2x1ZGVzKGNjLm5hbWUpKTtcbiAgICAgIGlmIChwaWNrZWRDb2wpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jaGlsZCxcbiAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAuLi5jaGlsZC5lbGVtZW50LFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3QtcGlja1wiLFxuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgIHBpY2tlZDogcGlja2VkQ29sLm5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZDtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbHVtbnNOb2RlO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3BOb2Rl66W8IFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICogcGxhaW4sIGFycmF5LCBvYmplY3Qg7IS4IOqwgOyngCBub2RlVHlwZeydhCDsnqzqt4DsoIHsnLzroZwg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcE5vZGVUb1pvZFR5cGUocHJvcE5vZGU6IEVudGl0eVByb3BOb2RlKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZShwcm9wTm9kZS5wcm9wKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgaWYgKHByb3BOb2RlLnByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfSBlbHNlIGlmIChwcm9wTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBhd2FpdCBwcm9wTm9kZVRvWm9kVHlwZSh7XG4gICAgICAgICAgLi4ucHJvcE5vZGUsXG4gICAgICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIH0pXG4gICAgICApLmFycmF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IGF3YWl0IHByb3BUb1pvZFR5cGUocHJvcE5vZGUucHJvcCk7XG4gICAgICBpZiAocHJvcE5vZGUucHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gei5hcnJheShpbm5lclR5cGUpLm51bGxhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gei5hcnJheShpbm5lclR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuLm1hcChhc3luYyAoY2hpbGRQcm9wTm9kZSkgPT4ge1xuICAgICAgICBhc3NlcnQoY2hpbGRQcm9wTm9kZS5wcm9wPy5uYW1lICE9PSB1bmRlZmluZWQsIFwiY2hpbGRQcm9wTm9kZS5wcm9wLm5hbWUgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgICByZXR1cm4gW2NoaWxkUHJvcE5vZGUucHJvcC5uYW1lLCBhd2FpdCBwcm9wTm9kZVRvWm9kVHlwZShjaGlsZFByb3BOb2RlKV0gYXMgY29uc3Q7XG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcblxuICAgIGlmIChwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHoub2JqZWN0KG9iaikubnVsbGFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHoub2JqZWN0KG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwieiIsIlNEIiwiRW50aXR5TWFuYWdlciIsIlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiIsInByb3BUb1pvZFR5cGUiLCJ6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIiwiZ2V0Q29sdW1uc05vZGUiLCJlbnRpdHlJZCIsInN1YnNldEtleSIsImVudGl0eSIsImdldCIsInN1YnNldCIsInN1YnNldHMiLCJ1bmRlZmluZWQiLCJwcm9wTm9kZXMiLCJmaWVsZEV4cHJzVG9Qcm9wTm9kZXMiLCJyb290UHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwiY29sdW1uc1pvZFR5cGUiLCJwcm9wTm9kZVRvWm9kVHlwZSIsImNvbHVtbnNOb2RlIiwibWFwIiwiY2hpbGQiLCJyZW5kZXJUeXBlIiwicGlja2VkQ29sIiwiZmluZCIsImNjIiwiaW5jbHVkZXMiLCJuYW1lIiwiY29uZmlnIiwicGlja2VkIiwiZWxlbWVudCIsInByb3BOb2RlIiwicHJvcCIsIkVycm9yIiwibGVuZ3RoIiwiYXJyYXkiLCJpbm5lclR5cGUiLCJudWxsYWJsZSIsImVudHJpZXMiLCJQcm9taXNlIiwiYWxsIiwiY2hpbGRQcm9wTm9kZSIsIm9iaiIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwib2JqZWN0Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsT0FBTyxNQUFNO0FBQ3BCLFNBQVNDLEVBQUUsUUFBUSxnQkFBYTtBQUNoQyxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FBQ3pELFNBQVNDLDJCQUEyQixRQUFRLGlDQUE4QjtBQUUxRSxTQUFTQyxhQUFhLEVBQUVDLHNCQUFzQixRQUFRLHFCQUFrQjtBQUV4RTs7OztDQUlDLEdBQ0QsT0FBTyxlQUFlQyxlQUFlQyxRQUFnQixFQUFFQyxTQUFpQjtJQUN0RSxNQUFNQyxTQUFTUCxjQUFjUSxHQUFHLENBQUNIO0lBQ2pDLE1BQU1JLFNBQVNGLE9BQU9HLE9BQU8sQ0FBQ0osVUFBVTtJQUN4QyxJQUFJRyxXQUFXRSxXQUFXO1FBQ3hCLE1BQU0sSUFBSVYsNEJBQTRCRixHQUFHLCtCQUErQk87SUFDMUU7SUFDQSxNQUFNTSxZQUFZTCxPQUFPTSxxQkFBcUIsQ0FBQ0o7SUFDL0MsTUFBTUssZUFBK0I7UUFDbkNDLFVBQVU7UUFDVkMsVUFBVUo7SUFDWjtJQUVBLHFFQUFxRTtJQUNyRSxNQUFNSyxpQkFBa0IsTUFBTUMsa0JBQWtCSjtJQUVoRCxNQUFNSyxjQUFjaEIsdUJBQXVCYztJQUMzQ3BCLE9BQU9zQixZQUFZSCxRQUFRLEtBQUtMLFdBQVc7SUFDM0NRLFlBQVlILFFBQVEsR0FBR0csWUFBWUgsUUFBUSxDQUFDSSxHQUFHLENBQUMsQ0FBQ0M7UUFDL0MsSUFBSUEsTUFBTUMsVUFBVSxLQUFLLFVBQVU7WUFDakN6QixPQUFPd0IsTUFBTUwsUUFBUSxLQUFLTCxXQUFXO1lBQ3JDLE1BQU1Z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
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS9lbnRpdHktY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHogZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5UHJvcE5vZGUsIFJlbmRlcmluZ05vZGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHByb3BUb1pvZFR5cGUsIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUgfSBmcm9tIFwiLi96b2QtY29udmVydGVyXCI7XG5cbi8qKlxuICog7JeU7Yuw7Yuw7J2YIO2KueyglSBzdWJzZXTsnYQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBzdWJzZXTsnZgg7ZWE65Oc65Ok7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWcIO2bhCBVSSDroIzrjZTrp4Hsmqkg64W465Oc66GcIOunjOuTreuLiOuLpC5cbiAqIG9iamVjdOyZgCBhcnJheeydmCDqsr3smrAg7KCB7KCI7ZWcIHBpY2sg7ZWE65Oc66W8IOyekOuPmeycvOuhnCDshKDtg53tlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb2x1bW5zTm9kZShlbnRpdHlJZDogc3RyaW5nLCBzdWJzZXRLZXk6IHN0cmluZyk6IFByb21pc2U8UmVuZGVyaW5nTm9kZT4ge1xuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGNvbnN0IHN1YnNldERlZiA9IGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV07XG4gIGlmIChzdWJzZXREZWYgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3Iuc3Vic2V0Tm90Rm91bmRcIikoc3Vic2V0S2V5KSk7XG4gIH1cbiAgY29uc3QgcHJvcE5vZGVzID0gZW50aXR5LmZpZWxkRXhwcnNUb1Byb3BOb2RlcyhzdWJzZXREZWYpO1xuICBjb25zdCByb290UHJvcE5vZGU6IEVudGl0eVByb3BOb2RlID0ge1xuICAgIG5vZGVUeXBlOiBcIm9iamVjdFwiLFxuICAgIGNoaWxkcmVuOiBwcm9wTm9kZXMsXG4gIH07XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiB6b2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VoCDrlYwg7IKs7Jqp7ZWY64qUIO2DgOyehVxuICBjb25zdCBjb2x1bW5zWm9kVHlwZSA9IChhd2FpdCBwcm9wTm9kZVRvWm9kVHlwZShyb290UHJvcE5vZGUpKSBhcyB6LlpvZE9iamVjdDxhbnk+O1xuXG4gIGNvbnN0IGNvbHVtbnNOb2RlID0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShjb2x1bW5zWm9kVHlwZSk7XG4gIGFzc2VydChjb2x1bW5zTm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkLCBcImNvbHVtbnNOb2RlLmNoaWxkcmVuIGlzIHVuZGVmaW5lZFwiKTtcbiAgY29sdW1uc05vZGUuY2hpbGRyZW4gPSBjb2x1bW5zTm9kZS5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgaWYgKGNoaWxkLnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGFzc2VydChjaGlsZC5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkLCBcImNoaWxkLmNoaWxkcmVuIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGNvbnN0IHBpY2tlZENvbCA9IGNoaWxkLmNoaWxkcmVuLmZpbmQoKGNjKSA9PiBbXCJ0aXRsZVwiLCBcIm5hbWVcIl0uaW5jbHVkZXMoY2MubmFtZSkpO1xuICAgICAgaWYgKHBpY2tlZENvbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0LXBpY2tcIixcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIHBpY2tlZDogcGlja2VkQ29sLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY2hpbGQucmVuZGVyVHlwZSA9PT0gXCJhcnJheVwiICYmXG4gICAgICBjaGlsZC5lbGVtZW50ICYmXG4gICAgICBjaGlsZC5lbGVtZW50LnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHBpY2tlZENvbCA9IGNoaWxkLmVsZW1lbnQ/LmNoaWxkcmVuPy5maW5kKChjYykgPT4gW1widGl0bGVcIiwgXCJuYW1lXCJdLmluY2x1ZGVzKGNjLm5hbWUpKTtcbiAgICAgIGlmIChwaWNrZWRDb2wpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jaGlsZCxcbiAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAuLi5jaGlsZC5lbGVtZW50LFxuICAgICAgICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3QtcGlja1wiLFxuICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgIHBpY2tlZDogcGlja2VkQ29sLm5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGlsZDtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbHVtbnNOb2RlO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3BOb2Rl66W8IFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICogcGxhaW4sIGFycmF5LCBvYmplY3Qg7IS4IOqwgOyngCBub2RlVHlwZeydhCDsnqzqt4DsoIHsnLzroZwg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvcE5vZGVUb1pvZFR5cGUocHJvcE5vZGU6IEVudGl0eVByb3BOb2RlKTogUHJvbWlzZTx6LlpvZFR5cGVBbnk+IHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZShwcm9wTm9kZS5wcm9wKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgaWYgKHByb3BOb2RlLnByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfSBlbHNlIGlmIChwcm9wTm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBhd2FpdCBwcm9wTm9kZVRvWm9kVHlwZSh7XG4gICAgICAgICAgLi4ucHJvcE5vZGUsXG4gICAgICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgIH0pXG4gICAgICApLmFycmF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IGF3YWl0IHByb3BUb1pvZFR5cGUocHJvcE5vZGUucHJvcCk7XG4gICAgICBpZiAocHJvcE5vZGUucHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gei5hcnJheShpbm5lclR5cGUpLm51bGxhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gei5hcnJheShpbm5lclR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuLm1hcChhc3luYyAoY2hpbGRQcm9wTm9kZSkgPT4ge1xuICAgICAgICBhc3NlcnQoY2hpbGRQcm9wTm9kZS5wcm9wPy5uYW1lICE9PSB1bmRlZmluZWQsIFwiY2hpbGRQcm9wTm9kZS5wcm9wLm5hbWUgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgICByZXR1cm4gW2NoaWxkUHJvcE5vZGUucHJvcC5uYW1lLCBhd2FpdCBwcm9wTm9kZVRvWm9kVHlwZShjaGlsZFByb3BOb2RlKV0gYXMgY29uc3Q7XG4gICAgICB9KSxcbiAgICApO1xuICAgIGNvbnN0IG9iaiA9IE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcblxuICAgIGlmIChwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHoub2JqZWN0KG9iaikubnVsbGFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHoub2JqZWN0KG9iaik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwieiIsIlNEIiwiRW50aXR5TWFuYWdlciIsIlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiIsInByb3BUb1pvZFR5cGUiLCJ6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIiwiZ2V0Q29sdW1uc05vZGUiLCJlbnRpdHlJZCIsInN1YnNldEtleSIsImVudGl0eSIsImdldCIsInN1YnNldERlZiIsInN1YnNldHMiLCJ1bmRlZmluZWQiLCJwcm9wTm9kZXMiLCJmaWVsZEV4cHJzVG9Qcm9wTm9kZXMiLCJyb290UHJvcE5vZGUiLCJub2RlVHlwZSIsImNoaWxkcmVuIiwiY29sdW1uc1pvZFR5cGUiLCJwcm9wTm9kZVRvWm9kVHlwZSIsImNvbHVtbnNOb2RlIiwibWFwIiwiY2hpbGQiLCJyZW5kZXJUeXBlIiwicGlja2VkQ29sIiwiZmluZCIsImNjIiwiaW5jbHVkZXMiLCJuYW1lIiwiY29uZmlnIiwicGlja2VkIiwiZWxlbWVudCIsInByb3BOb2RlIiwicHJvcCIsIkVycm9yIiwibGVuZ3RoIiwiYXJyYXkiLCJpbm5lclR5cGUiLCJudWxsYWJsZSIsImVudHJpZXMiLCJQcm9taXNlIiwiYWxsIiwiY2hpbGRQcm9wTm9kZSIsIm9iaiIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwib2JqZWN0Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsT0FBTyxNQUFNO0FBQ3BCLFNBQVNDLEVBQUUsUUFBUSxnQkFBYTtBQUNoQyxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FBQ3pELFNBQVNDLDJCQUEyQixRQUFRLGlDQUE4QjtBQUUxRSxTQUFTQyxhQUFhLEVBQUVDLHNCQUFzQixRQUFRLHFCQUFrQjtBQUV4RTs7OztDQUlDLEdBQ0QsT0FBTyxlQUFlQyxlQUFlQyxRQUFnQixFQUFFQyxTQUFpQjtJQUN0RSxNQUFNQyxTQUFTUCxjQUFjUSxHQUFHLENBQUNIO0lBQ2pDLE1BQU1JLFlBQVlGLE9BQU9HLE9BQU8sQ0FBQ0osVUFBVTtJQUMzQyxJQUFJRyxjQUFjRSxXQUFXO1FBQzNCLE1BQU0sSUFBSVYsNEJBQTRCRixHQUFHLCtCQUErQk87SUFDMUU7SUFDQSxNQUFNTSxZQUFZTCxPQUFPTSxxQkFBcUIsQ0FBQ0o7SUFDL0MsTUFBTUssZUFBK0I7UUFDbkNDLFVBQVU7UUFDVkMsVUFBVUo7SUFDWjtJQUVBLHFFQUFxRTtJQUNyRSxNQUFNSyxpQkFBa0IsTUFBTUMsa0JBQWtCSjtJQUVoRCxNQUFNSyxjQUFjaEIsdUJBQXVCYztJQUMzQ3BCLE9BQU9zQixZQUFZSCxRQUFRLEtBQUtMLFdBQVc7SUFDM0NRLFlBQVlILFFBQVEsR0FBR0csWUFBWUgsUUFBUSxDQUFDSSxHQUFHLENBQUMsQ0FBQ0M7UUFDL0MsSUFBSUEsTUFBTUMsVUFBVSxLQUFLLFVBQVU7WUFDakN6QixPQUFPd0IsTUFBTUwsUUFBUSxLQUFLTCxXQUFX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
@@ -20,6 +20,16 @@ export declare function getEnumInfoFromColName(entityId: string, colName: string
20
20
  * 관계형 prop이 아닌 경우 에러를 발생시킵니다.
21
21
  */
22
22
  export declare function getRelationPropFromColName(entityId: string, colName: string): RelationProp;
23
+ /**
24
+ * FK 컬럼명에서 실제 relation 이름을 추출합니다.
25
+ * BelongsToOne/OneToOne relation은 subset에서 FK 컬럼명(user_id)으로 생성되므로 변환이 필요하고,
26
+ * ManyToMany relation은 subset에서 relation명(employee)으로 생성되므로 변환이 불필요합니다.
27
+ *
28
+ * @example
29
+ * getRelationNameFromColumnName("Employee", "user_id") // "user"
30
+ * getRelationNameFromColumnName("Project", "tag_ids") // "tags"
31
+ */
32
+ export declare function getRelationNameFromColumnName(entityId: string, colName: string): string;
23
33
  /**
24
34
  * 소스 코드에서 객체 선언을 추출합니다.
25
35
  * 중괄호 카운팅 방식으로 중첩된 객체도 정확히 파싱합니다.
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/template/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAA8B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE/E;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAcjE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd;IACD,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,CAuBA;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAY1F;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA0EpF"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/template/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAA8B,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE/E;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAcjE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd;IACD,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,CAuBA;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAY1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAsCvF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA0EpF"}