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
@@ -4,7 +4,7 @@ import path from "path";
4
4
  import { z } from "zod";
5
5
  import { Sonamu } from "../api/index.js";
6
6
  import { EntityManager } from "../entity/entity-manager.js";
7
- import { isInternalSubsetField, normalizeSubsetField, TemplateOptions } from "../types/types.js";
7
+ import { getEnumDefValues, isInternalSubsetField, normalizeSubsetField, TemplateOptions } from "../types/types.js";
8
8
  import { nonNullable } from "../utils/utils.js";
9
9
  class AIClient {
10
10
  model = null;
@@ -346,6 +346,7 @@ updateEntity({ entityId: "Project", updates: { props: [{ name: "priority", type:
346
346
  if (updates.parentId !== undefined) entity.parentId = updates.parentId;
347
347
  if (updates.title !== undefined) entity.title = updates.title;
348
348
  if (updates.table !== undefined) entity.table = updates.table;
349
+ if (updates.cone !== undefined) entity.cone = updates.cone;
349
350
  // props: merge 시 이름 기준 병합, replace 시 교체
350
351
  if (updates.props !== undefined) {
351
352
  if (mode === "replace") {
@@ -388,9 +389,13 @@ updateEntity({ entityId: "Project", updates: { props: [{ name: "priority", type:
388
389
  };
389
390
  }
390
391
  if (updates.enums !== undefined) {
391
- entity.enumLabels = mode === "replace" ? updates.enums : {
392
+ const convertedEnums = Object.fromEntries(Object.entries(updates.enums).map(([key, enumDef])=>[
393
+ key,
394
+ getEnumDefValues(enumDef)
395
+ ]));
396
+ entity.enumLabels = mode === "replace" ? convertedEnums : {
392
397
  ...entity.enumLabels,
393
- ...updates.enums
398
+ ...convertedEnums
394
399
  };
395
400
  }
396
401
  // 저장 전 검증
@@ -474,4 +479,4 @@ updateEntity({ entityId: "Project", updates: { props: [{ name: "priority", type:
474
479
  }
475
480
  export const aiClient = new AIClient();
476
481
 
477
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9haS1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIGJpb21lLWlnbm9yZS1hbGwgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEFJIFNES+ydmCDtg4DsnoXsnbQg66qF7ZmV7ZWY7KeAIOyViuyVhCBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlTW9kZWwsIE1vZGVsTWVzc2FnZSwgU3RyZWFtVGV4dFJlc3VsdCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbiAgVGVtcGxhdGVPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbnR5cGUgVmFsaWRhdGlvbkVycm9yID0ge1xuICBmaWVsZDogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5jbGFzcyBBSUNsaWVudCB7XG4gIHByaXZhdGUgbW9kZWw6IExhbmd1YWdlTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhaVNkazpcbiAgICB8ICh0eXBlb2YgaW1wb3J0KFwiYWlcIikgJiB7XG4gICAgICAgIGFudGhyb3BpYz86IHR5cGVvZiBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKS5hbnRocm9waWM7XG4gICAgICB9KVxuICAgIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgICAgY29uc3QgYWlNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJhaVwiKTtcbiAgICAgIHRoaXMuYWlTZGsgPSB7IC4uLmFpTW9kdWxlLCBhbnRocm9waWMgfTtcbiAgICAgIHRoaXMubW9kZWwgPSBhbnRocm9waWMoXCJjbGF1ZGUtc29ubmV0LTQtNVwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkFJIFNESyBwYWNrYWdlcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsIEBhaS1zZGsvYW50aHJvcGljIGFuZCBhaSB0byB1c2UgQUkgZmVhdHVyZXMuXCIsXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRml4dHVyZShcbiAgICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW10sXG4gICAgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogU3RyZWFtVGV4dFJlc3VsdDxhbnksIGFueT4ge1xuICAgIGlmICghdGhpcy5haVNkayB8fCAhdGhpcy5tb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQUkgU0RLIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cblxuICAgIC8vIO2YhOyerCBmaXh0dXJlUmVjb3Jkc+yXkOyEnCDsgqzsmqnrkJwg7JeU7Yuw7Yuw65Ok7J2YIOq1rOyhsCDsoJXrs7Qg7IiY7KeRXG4gICAgY29uc3QgdXNlZEVudGl0eUlkcyA9IFsuLi5uZXcgU2V0KGZpeHR1cmVSZWNvcmRzLm1hcCgocikgPT4gci5lbnRpdHlJZCkpXTtcbiAgICBjb25zdCBlbnRpdHlTdHJ1Y3R1cmVzID0gdXNlZEVudGl0eUlkcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIHRhYmxlOiBlbnRpdHkudGFibGUsXG4gICAgICAgIHByb3BzOiBlbnRpdHkucHJvcHMsXG4gICAgICAgIHJlbGF0aW9uczogZW50aXR5LnJlbGF0aW9ucyxcbiAgICAgICAgZW51bUxhYmVsczogZW50aXR5LmVudW1MYWJlbHMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3lzdGVtTWVzc2FnZSA9IGBcbiAgICAgICAg64u57Iug7J2AIO2UveyKpOyzkCDroIjsvZTrk5zrpbwg7IiY7KCV7ZWY6rOgIOyDneyEse2VoCDsiJgg7J6I64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuICAgICAgICDtmITsnqwg7ZS97Iqk7LOQIOugiOy9lOuTnDpcbiAgICAgICAgJHtKU09OLnN0cmluZ2lmeShmaXh0dXJlUmVjb3JkcywgbnVsbCwgMil9XG5cbiAgICAgICAg7JeU7Yuw7YuwIOq1rOyhsCDsoJXrs7Q6XG4gICAgICAgICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5U3RydWN0dXJlcywgbnVsbCwgMil9XG5cbiAgICAgICAgIyMg7ZS97Iqk7LOQIOyImOyglVxuICAgICAgICDsgqzsmqnsnpDqsIAg7ZS97Iqk7LOQIOqwkiDsiJjsoJXsnYQg7JqU7LKt7ZWY66m0IHVwZGF0ZUZpeHR1cmVzIOuPhOq1rOulvCDsgqzsmqntlZjsl6wg67OA6rK97IKs7ZWt7J2EIOyggeyaqe2VmOyEuOyalC5cbiAgICAgICAgLSBmaXh0dXJlSWQ6IOyImOygle2VoCDtlL3siqTss5AgSUQgKO2YleyLnTogXCJFbnRpdHlJZCNpZFwiKVxuICAgICAgICAtIHVwZGF0ZXM6IOy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcblxuICAgICAgICDsmIjsi5w6IFwiVXNlciMxXCIg7ZS97Iqk7LOQ7J2YIFwibmFtZVwiIOy7rOufvOydhCBcIu2Zjeq4uOuPmVwi7Jy866GcIOuzgOqyve2VmOugpOuptDpcbiAgICAgICAgdXBkYXRlRml4dHVyZXMoeyB1cGRhdGVzOiBbeyBmaXh0dXJlSWQ6IFwiVXNlciMxXCIsIHVwZGF0ZXM6IHsgbmFtZTogXCLtmY3quLjrj5lcIiB9IH1dIH0pXG5cbiAgICAgICAg67OA6rK965CgIOy7rOufvOydmCB0eXBl7J20IHJlbGF0aW9u7J24IOqyveyasCwg6rSA66CoIOyXlO2LsO2LsOyXkOuPhCDrsJjsmIHrkJjslrTslbwg7ZWgIOy7rOufvOydtCDsnojripTsp4Ag7ZmV7J247ZWY7IS47JqULlxuXG4gICAgICAgICMjIO2UveyKpOyzkCDsg53shLFcbiAgICAgICAg7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDtlL3siqTss5Ag7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVGaXh0dXJlcyDrj4Tqtazrpbwg7IKs7Jqp7ZWY7IS47JqULlxuICAgICAgICAtIGVudGl0eUlkOiDsg53shLHtlaAg7JeU7Yuw7YuwIElEXG4gICAgICAgIC0gaWQ6IOyDiCDroIjsvZTrk5zsnZggSUQgKOq4sOyhtCDtlL3siqTss5DsmYAg7KSR67O165CY7KeAIOyViuuKlCDsnYzsiJgg7IKs7JqpIOq2jOyepSwg7JiIOiAtMSwgLTIpXG4gICAgICAgIC0gY29sdW1uczog7Lus65+866qF7J2EIO2CpOuhnCwg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0ICjsl5Tti7Dti7Ag6rWs7KGwIOywuOqzoClcblxuICAgICAgICDsmIjsi5w6IOyDiOuhnOyatCBVc2VyIO2UveyKpOyzkOulvCDsg53shLHtlZjroKTrqbQ6XG4gICAgICAgIGNyZWF0ZUZpeHR1cmVzKHsgZml4dHVyZXM6IFt7IGVudGl0eUlkOiBcIlVzZXJcIiwgaWQ6IC0xLCBjb2x1bW5zOiB7IG5hbWU6IFwi7ZmN6ri464+ZXCIsIGVtYWlsOiBcImhvbmdAZXhhbXBsZS5jb21cIiB9IH1dIH0pXG4gICAgICBgO1xuXG4gICAgY29uc3QgeyBzdHJlYW1UZXh0LCB0b29sIH0gPSB0aGlzLmFpU2RrO1xuXG4gICAgcmV0dXJuIHN0cmVhbVRleHQoe1xuICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICBzeXN0ZW06IHN5c3RlbU1lc3NhZ2UsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIHRvb2xzOiB7XG4gICAgICAgIHVwZGF0ZUZpeHR1cmVzOiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7ZS97Iqk7LOQIOugiOy9lOuTnOydmCDqsJLsnYQg7IiY7KCV7ZWp64uI64ukLiDsgqzsmqnsnpDqsIAg7Yq57KCVIOy7rOufvOydtOuCmCDqsJLsnYQg67OA6rK97ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICB1cGRhdGVzOiB6LmFycmF5KFxuICAgICAgICAgICAgICB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgZml4dHVyZUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2UveyKpOyzkCBJRCAo7ZiV7IudOiBFbnRpdHlJZCNpZClcIiksXG4gICAgICAgICAgICAgICAgdXBkYXRlczogelxuICAgICAgICAgICAgICAgICAgLnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSlcbiAgICAgICAgICAgICAgICAgIC5kZXNjcmliZShcIuy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcIiksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICB1cGRhdGVzOiBBcnJheTx7IGZpeHR1cmVJZDogc3RyaW5nOyB1cGRhdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PjtcbiAgICAgICAgICB9KTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IHVwZGF0ZWRSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gfT4gPT4ge1xuICAgICAgICAgICAgLy8gZml4dHVyZVJlY29yZHPrpbwg67O17IKs7ZWY6rOgIOyXheuNsOydtO2KuCDsoIHsmqlcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBmaXh0dXJlUmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1cGRhdGUgPSB1cGRhdGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHU6IHsgZml4dHVyZUlkOiBzdHJpbmcgfSkgPT4gdS5maXh0dXJlSWQgPT09IHJlY29yZC5maXh0dXJlSWQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBjb2x1bW5z7J2YIHZhbHVl66W8IOyXheuNsOydtO2KuFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIG5ld1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGUudXBkYXRlcykpIHtcbiAgICAgICAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW2NvbHVtbk5hbWVdLnZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgYXMgRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB1cGRhdGVkUmVjb3JkcyB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBjcmVhdGVGaXh0dXJlczogdG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIuyDiOuhnOyatCDtlL3siqTss5Ag66CI7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC4g7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDrjbDsnbTthLDrpbwg7LaU6rCA7ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICBmaXh0dXJlczogei5hcnJheShcbiAgICAgICAgICAgICAgei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IOd7ISx7ZWgIOyXlO2LsO2LsCBJRFwiKSxcbiAgICAgICAgICAgICAgICBpZDogei5udW1iZXIoKS5kZXNjcmliZShcIuyDiCDroIjsvZTrk5zsnZggSUQgKOydjOyImCDqtozsnqUsIOyYiDogLTEsIC0yKVwiKSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB6XG4gICAgICAgICAgICAgICAgICAucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKVxuICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKFwi7Lus65+866qF7J2EIO2CpOuhnCwg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0XCIpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgICAgIGZpeHR1cmVzLFxuICAgICAgICAgIH06IHtcbiAgICAgICAgICAgIGZpeHR1cmVzOiBBcnJheTx7IGVudGl0eUlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+O1xuICAgICAgICAgIH0pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgdXBkYXRlZFJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSB9PiA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBmaXh0dXJlcy5tYXAoXG4gICAgICAgICAgICAgIChmaXh0dXJlOiB7IGVudGl0eUlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgICAgICAgIC8vIOyXlO2LsO2LsCBwcm9wc+ulvCDquLDrsJjsnLzroZwgY29sdW1ucyDqtazshLFcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwidmlydHVhbFwiKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW3Byb3AubmFtZV0gPz8gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZSA9PT0gXCJjcmVhdGVkX2F0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7ZiE7J6sIOyLnOqwhOycvOuhnCDshKTsoJVcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiIHx8IHByb3AucmVsYXRpb25UeXBlID09PSBcIk1hbnlUb01hbnlcIilcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyDrsLDsl7TroZwg67OA7ZmYXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0uZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29sdW1uc1twcm9wLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUgYXMgRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgZml4dHVyZUlkOiBgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9YCxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgaWQ6IGZpeHR1cmUuaWQsXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgYmVsb25nc1JlY29yZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyDsg4gg66CI7L2U65Oc65Ok7J2YIHJlbGF0aW9uIOy7rOufvOydhCDtmZXsnbjtlZjsl6wg6riw7KG0IOugiOy9lOuTnOuTpOydmCDsl63rsKntlqUgcmVsYXRpb24g7JeF642w7J207Yq4XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5ld1JlY29yZCBvZiBuZXdSZWNvcmRzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW19jb2xOYW1lLCBjb2xdIG9mIE9iamVjdC5lbnRyaWVzKG5ld1JlY29yZC5jb2x1bW5zKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb2wucHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgY29sLnZhbHVlID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHlJZCA9IGNvbC5wcm9wLndpdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IEFycmF5LmlzQXJyYXkoY29sLnZhbHVlKSA/IGNvbC52YWx1ZSA6IFtjb2wudmFsdWVdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3JlbGF0ZWRFbnRpdHlJZH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWNvcmQgPSBuZXdSZWNvcmRzLmZpbmQoKHIpID0+IHIuZml4dHVyZUlkID09PSByZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9uIOywvuq4sFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlQ29sID0gT2JqZWN0LmVudHJpZXMocmVsYXRlZFJlY29yZC5jb2x1bW5zKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgIChbLCBjXSkgPT4gYy5wcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJiBjLnByb3Aud2l0aCA9PT0gbmV3UmVjb3JkLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlQ29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3JldmVyc2VDb2xOYW1lLCByZXZlcnNlQ29sVmFsdWVdID0gcmV2ZXJzZUNvbDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSByZXZlcnNlQ29sVmFsdWUudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyDsl63rsKntlqXsnbQg67Cw7Je07J24IOqyveyasCAoSGFzTWFueSwgTWFueVRvTWFueSlcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlQ29sVmFsdWUucHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXZlcnNlQ29sVmFsdWUucHJvcC5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VDb2xWYWx1ZS5wcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJNYW55VG9NYW55XCIpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpLCBcImN1cnJlbnRWYWx1ZSBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUuaW5jbHVkZXMobmV3UmVjb3JkLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkUmVjb3JkLmNvbHVtbnNbcmV2ZXJzZUNvbE5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJldmVyc2VDb2xWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWy4uLmN1cnJlbnRWYWx1ZSwgbmV3UmVjb3JkLmlkXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7Zal7J20IOuLqOydvCDqsJLsnbgg6rK97JqwIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFJlY29yZC5jb2x1bW5zW3JldmVyc2VDb2xOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmV2ZXJzZUNvbFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3UmVjb3JkLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdXBkYXRlZFJlY29yZHM6IG5ld1JlY29yZHMgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVFbnRpdHkobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogU3RyZWFtVGV4dFJlc3VsdDxhbnksIGFueT4ge1xuICAgIGlmICghdGhpcy5haVNkayB8fCAhdGhpcy5tb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQUkgU0RLIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cblxuICAgIC8vIGVudGl0eS5pbnN0cnVjdGlvbnMubWQg7YyM7J28IOydveq4sCAoZGlzdC91aSDrmJDripQgc3JjL3Vp7JeQ7IScIOyLpO2WieuQmOuvgOuhnCDtjKjtgqTsp4Ag66Oo7Yq4IOq4sOykgOycvOuhnCDsoJHqt7wpXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgICBcIi4uXCIsXG4gICAgICBcIi4uXCIsXG4gICAgICBcInNyY1wiLFxuICAgICAgXCJ1aVwiLFxuICAgICAgXCJlbnRpdHkuaW5zdHJ1Y3Rpb25zLm1kXCIsXG4gICAgKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIO2YhOyerCDrk7HroZ3rkJwg7JeU7Yuw7YuwIOygleuztCDsiJjsp5FcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGV4aXN0aW5nRW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGVudGl0eS5pZCxcbiAgICAgICAgdGl0bGU6IGVudGl0eS50aXRsZSxcbiAgICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgICAgcHJvcHM6IGVudGl0eS5wcm9wcy5tYXAoKHApID0+ICh7XG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgICAgICBkZXNjOiBwLmRlc2MsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzeXN0ZW1NZXNzYWdlID0gYFxu64u57Iug7J2AIFNvbmFtdSDtlITroIjsnoTsm4ztgazsl5DshJwgRW50aXR57JmAIEVudW3snYQg7IOd7ISx7ZWY64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuJHtpbnN0cnVjdGlvbnN9XG5cbiMjIO2YhOyerCDrk7HroZ3rkJwgRW50aXR5IOuqqeuhnVxu64uk66W4IOyXlO2LsO2LsOyZgCDqtIDqs4QocmVsYXRpb24p66W8IOunuuqxsOuCmCBzdWJzZXTsl5DshJwg7LC47KGw7ZWgIOuVjCDrsJjrk5zsi5wg7JWE656YIOygleuztOulvCDtmZXsnbjtlZjshLjsmpQuXG5cbiR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdFbnRpdGllcywgbnVsbCwgMil9XG5cbiMjIFRvb2wg7IKs7JqpIOqwgOydtOuTnFxuXG4jIyMgRW50aXR5IOyDneyEsSAoY3JlYXRlRW50aXR5KVxu7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCBFbnRpdHkg7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC5cbi0gZW50aXR5SWQ6IFBhc2NhbENhc2XroZwg65CcIEVudGl0eSBJRCAo7JiIOiBcIlVzZXJcIiwgXCJQcm9kdWN0Q2F0ZWdvcnlcIilcbi0gdGl0bGU6IO2VnOq4gCDsoJzrqqkgKOyYiDogXCLsgqzsmqnsnpBcIiwgXCLsg4Htkogg7Lm07YWM6rOg66asXCIpXG4tIHRhYmxlOiBzbmFrZV9jYXNl66GcIOuQnCDthYzsnbTruJTrqoUgKOyYiDogXCJ1c2Vyc1wiLCBcInByb2R1Y3RfY2F0ZWdvcmllc1wiKVxuLSBwYXJlbnRJZDog67aA66qoIEVudGl0eSBJRCAo7ISg7YOd7IKs7ZWtKVxuLSBwcm9wczogRW50aXR57J2YIO2UhOuhnO2NvO2LsCDrsLDsl7QgKOychCDrrLjshJzsnZggUHJvcGVydHkgVHlwZXMg7LC46rOgKVxuLSBpbmRleGVzOiDsnbjrjbHsiqQg67Cw7Je0XG4tIHN1YnNldHM6IOyEnOu4jOyFiyDsoJXsnZggKOq4sOuzuOqwkjogeyBBOiBbXCJpZFwiXSB9KVxuLSBlbnVtczogRW51bSDsoJXsnZhcblxuIyMjIEVudGl0eSDsiJjsoJUgKHVwZGF0ZUVudGl0eSlcbuq4sOyhtCBFbnRpdHnrpbwg7IiY7KCV7ZWgIOuVjCB1cGRhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC4gRW51bSDstpTqsIAsIHByb3BzIOy2lOqwgC/siJjsoJUsIGluZGV4ZXMg7IiY7KCVIOuTsSDrqqjrk6Ag7IiY7KCVIOyekeyXheyXkCDsgqzsmqntlanri4jri6QuXG4tIGVudGl0eUlkOiDsiJjsoJXtlaAgRW50aXR5IElEXG4tIHVwZGF0ZXM6IOyImOygle2VoCDtlYTrk5zrk6QgKOu2gOu2hCDsl4XrjbDsnbTtirgpXG4gIC0gdGl0bGU6IOyXlO2LsO2LsCDtlZzquIAg7KCc66qpXG4gIC0gdGFibGU6IO2FjOydtOu4lOuqhVxuICAtIHByb3BzOiDstpTqsIDtlaAg7ZSE66Gc7Y287YuwIOuwsOyXtCAo6riw7KG0IHByb3Bz7JeQIOy2lOqwgCwg6rCZ7J2AIOydtOumhOydtOuptCDqtZDssrQpXG4gIC0gaW5kZXhlczog7LaU6rCA7ZWgIOyduOuNseyKpCDrsLDsl7QgKOq4sOyhtCBpbmRleGVz7JeQIOy2lOqwgClcbiAgLSBzdWJzZXRzOiDshJzruIzshYsg7KCV7J2YICjquLDsobQgc3Vic2V0c+yXkCDrs5HtlakpXG4gIC0gZW51bUxhYmVsczogRW51bSDsoJXsnZggKOq4sOyhtCBlbnVtTGFiZWxz7JeQIOuzke2VqSlcbi0gbW9kZTogXCJtZXJnZVwiKOq4sOuzuOqwkikg65iQ64qUIFwicmVwbGFjZVwiXG4gIC0gbWVyZ2U6IOq4sOyhtCDqsJLsl5Ag67OR7ZWpXG4gIC0gcmVwbGFjZTog7ZW064u5IO2VhOuTnCDsoITssrQg6rWQ7LK0XG5cbuyYiOyLnDogRW1wbG95ZWXsl5Ag7IOIIEVudW0g7LaU6rCAXG51cGRhdGVFbnRpdHkoeyBlbnRpdHlJZDogXCJFbXBsb3llZVwiLCB1cGRhdGVzOiB7IGVudW1MYWJlbHM6IHsgXCJFbXBsb3llZVJvbGVcIjogeyBcImFkbWluXCI6IFwi6rSA66as7J6QXCIsIFwidXNlclwiOiBcIuydvOuwmFwiIH0gfSB9IH0pXG5cbuyYiOyLnDogUHJvamVjdOyXkCDsg4gg7ZSE66Gc7Y287YuwIOy2lOqwgFxudXBkYXRlRW50aXR5KHsgZW50aXR5SWQ6IFwiUHJvamVjdFwiLCB1cGRhdGVzOiB7IHByb3BzOiBbeyBuYW1lOiBcInByaW9yaXR5XCIsIHR5cGU6IFwiaW50ZWdlclwiLCBkZXNjOiBcIuyasOyEoOyInOychFwiIH1dIH0gfSlcblxuIyMg7ZWE7IiYIOyCrO2VrVxuLSBFbnRpdHnsnZggcHJvcHPsl5DripQg7LWc7IaM7ZWcIGlkKGludGVnZXIsIHVuc2lnbmVkKSwgY3JlYXRlZF9hdCh0aW1lc3RhbXAp6rCAIO2PrO2VqOuQmOyWtOyVvCDtlanri4jri6QuXG4tIHJlbGF0aW9uIO2VhOuTnOuKlCBvblVwZGF0ZSwgb25EZWxldGXqsIAg7ZWE7IiY7J6F64uI64ukLiAo7JiI7Jm4OiBPbmVUb09uZeyXkOyEnCBoYXNKb2luQ29sdW1u7J20IGZhbHNl7J24IOqyveyasClcbi0gRW51bSBJROuKlCDrs7TthrUgRW50aXR5SWQgKyDsho3shLHrqoUg7ZiV7YOc7J6F64uI64ukICjsmIg6IFVzZXJTdGF0dXMsIFByb2R1Y3RUeXBlKVxuLSBzdWJzZXTsl5DshJwg64uk66W4IOyXlO2LsO2LsOydmCDtlITroZztjbzti7Drpbwg7LC47KGw7ZWgIOuVjOuKlCDrsJjrk5zsi5wg7ZW064u5IOyXlO2LsO2LsOydmCDsi6TsoJwg7ZSE66Gc7Y287Yuw66qF7J2EIOyCrOyaqe2VmOyEuOyalC5cblxuIyMg6rKA7KadIOyYpOulmCDsspjrpqxcbuuPhOq1rCDtmLjstpwg6rKw6rO866GcIOqygOymnSDsmKTrpZgodmFsaWRhdGlvbkVycm9ycynqsIAg67CY7ZmY65CY66m0OlxuMS4g7Jik66WYIOuplOyLnOyngOulvCDrtoTshJ3tlZjsl6wg66y47KCc7KCQ7J2EIO2MjOyVhe2VmOyEuOyalC5cbjIuIOyYpOulmOulvCDsiJjsoJXtlZwg642w7J207YSw66GcIGNyZWF0ZUVudGl0eeulvCDri6Tsi5wg7Zi47Lac7ZWY7IS47JqULlxuMy4g7IKs7Jqp7J6Q7JeQ6rKMIOyYpOulmOulvCDqt7jrjIDroZwg7KCE64us7ZWY7KeAIOunkOqzoCwg7IiY7KCVIO2bhCDsnqzsi5zrj4TtlZjshLjsmpQuXG5cbiMjIyDsnbzrsJjsoIHsnbgg6rKA7KadIOyYpOulmOyZgCDsiJjsoJUg67Cp67KVXG58IOyYpOulmCDrqZTsi5zsp4AgfCDsiJjsoJUg67Cp67KVIHxcbnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLXxcbnwgXCJpZCDtlITroZztjbzti7DqsIAg7ZWE7IiYXCIgfCBwcm9wc+yXkCB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIsIHVuc2lnbmVkOiB0cnVlIH0g7LaU6rCAIHxcbnwgXCJjcmVhdGVkX2F0IO2UhOuhnO2NvO2LsOqwgCDtlYTsiJhcIiB8IHByb3Bz7JeQIHsgbmFtZTogXCJjcmVhdGVkX2F0XCIsIHR5cGU6IFwidGltZXN0YW1wXCIsIGRiRGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiIH0g7LaU6rCAIHxcbnwgXCJYeHhPcmRlckJ5IGVudW3snbQg7ZWE7IiYXCIgfCBlbnVtc+yXkCB7IFwiWHh4T3JkZXJCeVwiOiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSB9IOy2lOqwgCB8XG58IFwiWHh4U2VhcmNoRmllbGQgZW51beydtCDtlYTsiJhcIiB8IGVudW1z7JeQIHsgXCJYeHhTZWFyY2hGaWVsZFwiOiB7IFwiaWRcIjogXCJJRFwiIH0gfSDstpTqsIAgfFxufCBcInN0cmluZyDtg4DsnoXsnYAgbGVuZ3Ro6rCAIO2VhOyImFwiIHwg7ZW064u5IHByb3Dsl5AgbGVuZ3RoIOy2lOqwgCAo7JiIOiAyNTUpIHxcbnwgXCJ0ZXh0IO2DgOyeheydgCB0ZXh0VHlwZeydtCDtlYTsiJhcIiB8IO2VtOuLuSBwcm9w7JeQIHRleHRUeXBlIOy2lOqwgCAoXCJ0ZXh0XCIsIFwibWVkaXVtdGV4dFwiLCBcImxvbmd0ZXh0XCIpIHxcbnwgXCJvblVwZGF0ZeqwgCDtlYTsiJhcIiB8IO2VtOuLuSByZWxhdGlvbiBwcm9w7JeQIG9uVXBkYXRlLCBvbkRlbGV0ZSDstpTqsIAgKFwiQ0FTQ0FERVwiKSB8XG4gICAgICBgO1xuXG4gICAgY29uc3QgeyBzdHJlYW1UZXh0LCB0b29sLCBzdGVwQ291bnRJcyB9ID0gdGhpcy5haVNkaztcblxuICAgIHJldHVybiBzdHJlYW1UZXh0KHtcbiAgICAgIG1vZGVsOiB0aGlzLm1vZGVsIGFzIHVua25vd24gYXMgTGFuZ3VhZ2VNb2RlbCxcbiAgICAgIHN5c3RlbTogc3lzdGVtTWVzc2FnZSxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDIpLFxuICAgICAgdG9vbHM6IHtcbiAgICAgICAgY3JlYXRlRW50aXR5OiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7IOI66Gc7Jq0IEVudGl0eeulvCDsg53shLHtlanri4jri6QuIOyCrOyaqeyekOqwgCDsg4jroZzsmrQg7JeU7Yuw7Yuw64KYIO2FjOydtOu4lCDsg53shLHsnYQg7JqU7LKt7ZWgIOuVjCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IFRlbXBsYXRlT3B0aW9ucy5zaGFwZS5lbnRpdHksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKFxuICAgICAgICAgICAgZW50aXR5OiB6LmluZmVyPHR5cGVvZiBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5PixcbiAgICAgICAgICApOiBQcm9taXNlPHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzPzogVmFsaWRhdGlvbkVycm9yW107XG4gICAgICAgICAgfT4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g7J6F66ClIOqygOymnVxuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVFbnRpdHlKc29uKGVudGl0eSk7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBlbnRpdHkuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgICBlcnJvcjogYOqygOymnSDsmKTrpZg6ICR7dmFsaWRhdGlvbkVycm9ycy5tYXAoKGUpID0+IGBbJHtlLmZpZWxkfV0gJHtlLm1lc3NhZ2V9YCkuam9pbihcIiwgXCIpfWAsXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBhd2FpdCBTb25hbXUuc3luY2VyLmNyZWF0ZUVudGl0eSh7XG4gICAgICAgICAgICAgICAgc3Vic2V0czogeyBBOiBbXCJpZFwiXSB9LFxuICAgICAgICAgICAgICAgIGVudW1zOiB7fSxcbiAgICAgICAgICAgICAgICAuLi5lbnRpdHksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEVudGl0eU1hbmFnZXIg66as66Gc65OcXG4gICAgICAgICAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZW50aXR5SWQ6IGVudGl0eS5lbnRpdHlJZCB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZW50aXR5SWQ6IGVudGl0eS5lbnRpdHlJZCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgdXBkYXRlRW50aXR5OiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi6riw7KG0IEVudGl0eeulvCDsiJjsoJXtlanri4jri6QuIEVudW0g7LaU6rCALCBwcm9wcyDstpTqsIAv7IiY7KCVLCBpbmRleGVzIOyImOyglSwgc3Vic2V0cyDsiJjsoJUg65OxIOuqqOuToCDsl5Tti7Dti7Ag7IiY7KCVIOyekeyXheyXkCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIEVudGl0eSBJRFwiKSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IFRlbXBsYXRlT3B0aW9ucy5zaGFwZS5lbnRpdHkucGFydGlhbCgpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2VhOuTnOuTpFwiKSxcbiAgICAgICAgICAgIG1vZGU6IHpcbiAgICAgICAgICAgICAgLmVudW0oW1wibWVyZ2VcIiwgXCJyZXBsYWNlXCJdKVxuICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAuZGVzY3JpYmUoXCLsiJjsoJUg66qo65OcOiBtZXJnZSjquLDrs7jqsJIsIOq4sOyhtCDqsJLsl5Ag67OR7ZWpKSDrmJDripQgcmVwbGFjZSjsoITssrQg6rWQ7LK0KVwiKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICB1cGRhdGVzLFxuICAgICAgICAgICAgbW9kZSA9IFwibWVyZ2VcIixcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBkYXRlczogUGFydGlhbDx6LmluZmVyPHR5cGVvZiBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5Pj47XG4gICAgICAgICAgICBtb2RlPzogXCJtZXJnZVwiIHwgXCJyZXBsYWNlXCI7XG4gICAgICAgICAgfSk6IFByb21pc2U8e1xuICAgICAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnM/OiBWYWxpZGF0aW9uRXJyb3JbXTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGJhc2ljIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuZW50aXR5SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LmlkID0gdXBkYXRlcy5lbnRpdHlJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucGFyZW50SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LnBhcmVudElkID0gdXBkYXRlcy5wYXJlbnRJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGl0bGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRpdGxlID0gdXBkYXRlcy50aXRsZTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGFibGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRhYmxlID0gdXBkYXRlcy50YWJsZTtcblxuICAgICAgICAgICAgICAvLyBwcm9wczogbWVyZ2Ug7IucIOydtOumhCDquLDspIAg67OR7ZWpLCByZXBsYWNlIOyLnCDqtZDssrRcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInJlcGxhY2VcIikge1xuICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzID0gdXBkYXRlcy5wcm9wcyBhcyBFbnRpdHlQcm9wW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmV3UHJvcCBvZiB1cGRhdGVzLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IG5ld1Byb3AubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkucHJvcHNbZXhpc3RpbmdJbmRleF0gPSBuZXdQcm9wIGFzIEVudGl0eVByb3A7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzLnB1c2gobmV3UHJvcCBhcyBFbnRpdHlQcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGluZGV4ZXM6IG1lcmdlIOyLnCDstpTqsIAsIHJlcGxhY2Ug7IucIOq1kOyytFxuICAgICAgICAgICAgICBpZiAodXBkYXRlcy5pbmRleGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkuaW5kZXhlcyA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIiA/IHVwZGF0ZXMuaW5kZXhlcyA6IFsuLi5lbnRpdHkuaW5kZXhlcywgLi4udXBkYXRlcy5pbmRleGVzXTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbDogYXNzaWdu7Jy866GcIOuzke2VqSDrmJDripQg6rWQ7LK0XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLnN1YnNldHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBzdWJzZXQgZmllbGRzOiBzZXBhcmF0ZSBpbnRvIHN1YnNldHMgKG5vcm1hbCkgYW5kIHN1YnNldHNJbnRlcm5hbCAoaW50ZXJuYWwpXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWw6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZXMuc3Vic2V0cykpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkQXJyYXkgPSBmaWVsZHMgYXMgc3RyaW5nW107XG4gICAgICAgICAgICAgICAgICBub3JtYWxpemVkU3Vic2V0c1trZXldID0gZmllbGRBcnJheVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChmOiBzdHJpbmcpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRBcnJheVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHMgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBub3JtYWxpemVkU3Vic2V0c1xuICAgICAgICAgICAgICAgICAgICA6IHsgLi4uZW50aXR5LnN1YnNldHMsIC4uLm5vcm1hbGl6ZWRTdWJzZXRzIH07XG4gICAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHNJbnRlcm5hbCA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIlxuICAgICAgICAgICAgICAgICAgICA/IG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmVudGl0eS5zdWJzZXRzSW50ZXJuYWwsIC4uLm5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWwgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLmVudW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscyA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIiA/IHVwZGF0ZXMuZW51bXMgOiB7IC4uLmVudGl0eS5lbnVtTGFiZWxzLCAuLi51cGRhdGVzLmVudW1zIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyDsoIDsnqUg7KCEIOqygOymnVxuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVFbnRpdHlKc29uKHtcbiAgICAgICAgICAgICAgICAuLi5lbnRpdHksXG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgICAgICBlbnVtczogZW50aXR5LmVudW1MYWJlbHMsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBg6rKA7KadIOyYpOulmDogJHt2YWxpZGF0aW9uRXJyb3JzLm1hcCgoZSkgPT4gYFske2UuZmllbGR9XSAke2UubWVzc2FnZX1gKS5qb2luKFwiLCBcIil9YCxcbiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnMsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZW50aXR5SWQgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIjtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVudGl0eUlkLCBlcnJvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEVudGl0eSBKU09O7J20IGVudGl0eS5pbnN0cnVjdGlvbnMubWTsnZgg6rec7LmZ7J2EIOuUsOultOuKlOyngCDqsoDspp3tlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRW50aXR5SnNvbihpbnB1dDogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKTogVmFsaWRhdGlvbkVycm9yW10ge1xuICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG4gIGNvbnN0IHsgZW50aXR5SWQsIHByb3BzLCBlbnVtcyB9ID0gaW5wdXQ7XG5cbiAgLy8gMS4gaWQsIGNyZWF0ZWRfYXQgcHJvcCDtlYTsiJhcbiAgY29uc3QgaGFzSWRQcm9wID0gcHJvcHM/LnNvbWUoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgaWYgKCFoYXNJZFByb3ApIHtcbiAgICBlcnJvcnMucHVzaCh7IGZpZWxkOiBcInByb3BzXCIsIG1lc3NhZ2U6IFwiaWQg7ZSE66Gc7Y287Yuw6rCAIO2VhOyImOyeheuLiOuLpC5cIiB9KTtcbiAgfVxuICBjb25zdCBoYXNDcmVhdGVkQXRQcm9wID0gcHJvcHM/LnNvbWUoKHApID0+IHAubmFtZSA9PT0gXCJjcmVhdGVkX2F0XCIpO1xuICBpZiAoIWhhc0NyZWF0ZWRBdFByb3ApIHtcbiAgICBlcnJvcnMucHVzaCh7IGZpZWxkOiBcInByb3BzXCIsIG1lc3NhZ2U6IFwiY3JlYXRlZF9hdCDtlITroZztjbzti7DqsIAg7ZWE7IiY7J6F64uI64ukLlwiIH0pO1xuICB9XG5cbiAgLy8gMi4g7ZWE7IiYIGVudW0g6rKA7KadOiBFbnRpdHlOYW1lT3JkZXJCeSwgRW50aXR5TmFtZVNlYXJjaEZpZWxkXG4gIGNvbnN0IG9yZGVyQnlFbnVtSWQgPSBgJHtlbnRpdHlJZH1PcmRlckJ5YDtcbiAgY29uc3Qgc2VhcmNoRmllbGRFbnVtSWQgPSBgJHtlbnRpdHlJZH1TZWFyY2hGaWVsZGA7XG5cbiAgaWYgKCFlbnVtcz8uW29yZGVyQnlFbnVtSWRdKSB7XG4gICAgZXJyb3JzLnB1c2goe1xuICAgICAgZmllbGQ6IFwiZW51bXNcIixcbiAgICAgIG1lc3NhZ2U6IGAke29yZGVyQnlFbnVtSWR9IGVudW3snbQg7ZWE7IiY7J6F64uI64ukLiAo7JiIOiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSlgLFxuICAgIH0pO1xuICB9XG4gIGlmICghZW51bXM/LltzZWFyY2hGaWVsZEVudW1JZF0pIHtcbiAgICBlcnJvcnMucHVzaCh7XG4gICAgICBmaWVsZDogXCJlbnVtc1wiLFxuICAgICAgbWVzc2FnZTogYCR7c2VhcmNoRmllbGRFbnVtSWR9IGVudW3snbQg7ZWE7IiY7J6F64uI64ukLiAo7JiIOiB7IFwiaWRcIjogXCJJRFwiIH0pYCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIDMuIGVudW0gcHJvcOydmCBpZOqwgCBlbnVtc+yXkCDsoJXsnZjrkJjslrQg7J6I64qU7KeAIO2ZleyduCAoY3Jvc3MtZmllbGQg6rKA7KadKVxuICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMgPz8gW10pIHtcbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIiAmJiAhZW51bXM/Lltwcm9wLmlkXSkge1xuICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogYHByb3BzLiR7cHJvcC5uYW1lfWAsXG4gICAgICAgIG1lc3NhZ2U6IGBlbnVtIGlkIFwiJHtwcm9wLmlkfVwi6rCAIGVudW1z7JeQIOygleydmOuQmOyWtCDsnojsp4Ag7JWK7Iq164uI64ukLmAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyb3JzO1xufVxuXG5leHBvcnQgY29uc3QgYWlDbGllbnQgPSBuZXcgQUlDbGllbnQoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJmcyIsInBhdGgiLCJ6IiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsImlzSW50ZXJuYWxTdWJzZXRGaWVsZCIsIm5vcm1hbGl6ZVN1YnNldEZpZWxkIiwiVGVtcGxhdGVPcHRpb25zIiwibm9uTnVsbGFibGUiLCJBSUNsaWVudCIsIm1vZGVsIiwiYWlTZGsiLCJpbml0IiwiYW50aHJvcGljIiwiYWlNb2R1bGUiLCJlcnJvciIsImNvbnNvbGUiLCJ3YXJuIiwiaGFuZGxlRml4dHVyZSIsIm1lc3NhZ2VzIiwiZml4dHVyZVJlY29yZHMiLCJFcnJvciIsInVzZWRFbnRpdHlJZHMiLCJTZXQiLCJtYXAiLCJyIiwiZW50aXR5SWQiLCJlbnRpdHlTdHJ1Y3R1cmVzIiwiZW50aXR5IiwiZ2V0IiwiaWQiLCJ0YWJsZSIsInByb3BzIiwicmVsYXRpb25zIiwiZW51bUxhYmVscyIsInN5c3RlbU1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RyZWFtVGV4dCIsInRvb2wiLCJzeXN0ZW0iLCJ0b29scyIsInVwZGF0ZUZpeHR1cmVzIiwiZGVzY3JpcHRpb24iLCJpbnB1dFNjaGVtYSIsIm9iamVjdCIsInVwZGF0ZXMiLCJhcnJheSIsImZpeHR1cmVJZCIsInN0cmluZyIsImRlc2NyaWJlIiwicmVjb3JkIiwidW5rbm93biIsImV4ZWN1dGUiLCJ1cGRhdGVkUmVjb3JkcyIsInVwZGF0ZSIsImZpbmQiLCJ1IiwiY29sdW1uTmFtZSIsIm5ld1ZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsImNvbHVtbnMiLCJ2YWx1ZSIsInN1Y2Nlc3MiLCJjcmVhdGVGaXh0dXJlcyIsImZpeHR1cmVzIiwibnVtYmVyIiwibmV3UmVjb3JkcyIsImZpeHR1cmUiLCJwcm9wIiwidHlwZSIsIm5hbWUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJyZWxhdGlvblR5cGUiLCJBcnJheSIsImlzQXJyYXkiLCJmaWx0ZXIiLCJmZXRjaGVkUmVjb3JkcyIsImJlbG9uZ3NSZWNvcmRzIiwib3ZlcnJpZGUiLCJuZXdSZWNvcmQiLCJfY29sTmFtZSIsImNvbCIsInJlbGF0ZWRFbnRpdHlJZCIsIndpdGgiLCJyZWxhdGVkSWRzIiwicmVsYXRlZElkIiwicmVsYXRlZEZpeHR1cmVJZCIsInJlbGF0ZWRSZWNvcmQiLCJyZXZlcnNlQ29sIiwiYyIsInJldmVyc2VDb2xOYW1lIiwicmV2ZXJzZUNvbFZhbHVlIiwiY3VycmVudFZhbHVlIiwiaW5jbHVkZXMiLCJoYW5kbGVFbnRpdHkiLCJpbnN0cnVjdGlvbnNQYXRoIiwiam9pbiIsImRpcm5hbWUiLCJpbnN0cnVjdGlvbnMiLCJyZWFkRmlsZVN5bmMiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJleGlzdGluZ0VudGl0aWVzIiwidGl0bGUiLCJwIiwiZGVzYyIsInN0ZXBDb3VudElzIiwic3RvcFdoZW4iLCJjcmVhdGVFbnRpdHkiLCJzaGFwZSIsInZhbGlkYXRpb25FcnJvcnMiLCJ2YWxpZGF0ZUVudGl0eUpzb24iLCJsZW5ndGgiLCJlIiwiZmllbGQiLCJtZXNzYWdlIiwic3luY2VyIiwic3Vic2V0cyIsIkEiLCJlbnVtcyIsInJlbG9hZCIsInVwZGF0ZUVudGl0eSIsInBhcnRpYWwiLCJtb2RlIiwiZW51bSIsIm9wdGlvbmFsIiwidW5kZWZpbmVkIiwicGFyZW50SWQiLCJuZXdQcm9wIiwiZXhpc3RpbmdJbmRleCIsImZpbmRJbmRleCIsInB1c2giLCJpbmRleGVzIiwibm9ybWFsaXplZFN1YnNldHMiLCJub3JtYWxpemVkU3Vic2V0c0ludGVybmFsIiwia2V5IiwiZmllbGRzIiwiZmllbGRBcnJheSIsImYiLCJzdWJzZXRzSW50ZXJuYWwiLCJzYXZlIiwiaW5wdXQiLCJlcnJvcnMiLCJoYXNJZFByb3AiLCJzb21lIiwiaGFzQ3JlYXRlZEF0UHJvcCIsIm9yZGVyQnlFbnVtSWQiLCJzZWFyY2hGaWVsZEVudW1JZCIsImFpQ2xpZW50Il0sIm1hcHBpbmdzIjoiQUFBQSxpRkFBaUYsR0FFakYsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsQ0FBQyxRQUFRLE1BQU07QUFDeEIsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FHRUMscUJBQXFCLEVBQ3JCQyxvQkFBb0IsRUFDcEJDLGVBQWUsUUFDVixvQkFBaUI7QUFDeEIsU0FBU0MsV0FBVyxRQUFRLG9CQUFpQjtBQU83QyxNQUFNQztJQUNJQyxRQUE4QixLQUFLO0lBQ25DQyxRQUlHLEtBQUs7SUFFaEIsTUFBTUMsT0FBTztRQUNYLElBQUk7WUFDRixNQUFNLEVBQUVDLFNBQVMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDO1lBQ25DLE1BQU1DLFdBQVcsTUFBTSxNQUFNLENBQUM7WUFDOUIsSUFBSSxDQUFDSCxLQUFLLEdBQUc7Z0JBQUUsR0FBR0csUUFBUTtnQkFBRUQ7WUFBVTtZQUN0QyxJQUFJLENBQUNILEtBQUssR0FBR0csVUFBVTtRQUN6QixFQUFFLE9BQU9FLE9BQU87WUFDZEMsUUFBUUMsSUFBSSxDQUNWO1lBRUYsTUFBTUY7UUFD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
482
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9haS1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIGJpb21lLWlnbm9yZS1hbGwgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IEFJIFNES+ydmCDtg4DsnoXsnbQg66qF7ZmV7ZWY7KeAIOyViuyVhCBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5pbXBvcnQgdHlwZSB7IExhbmd1YWdlTW9kZWwsIE1vZGVsTWVzc2FnZSwgU3RyZWFtVGV4dFJlc3VsdCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRml4dHVyZVJlY29yZCxcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbiAgVGVtcGxhdGVPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbnR5cGUgVmFsaWRhdGlvbkVycm9yID0ge1xuICBmaWVsZDogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59O1xuXG5jbGFzcyBBSUNsaWVudCB7XG4gIHByaXZhdGUgbW9kZWw6IExhbmd1YWdlTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhaVNkazpcbiAgICB8ICh0eXBlb2YgaW1wb3J0KFwiYWlcIikgJiB7XG4gICAgICAgIGFudGhyb3BpYz86IHR5cGVvZiBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKS5hbnRocm9waWM7XG4gICAgICB9KVxuICAgIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgICAgY29uc3QgYWlNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJhaVwiKTtcbiAgICAgIHRoaXMuYWlTZGsgPSB7IC4uLmFpTW9kdWxlLCBhbnRocm9waWMgfTtcbiAgICAgIHRoaXMubW9kZWwgPSBhbnRocm9waWMoXCJjbGF1ZGUtc29ubmV0LTQtNVwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkFJIFNESyBwYWNrYWdlcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsIEBhaS1zZGsvYW50aHJvcGljIGFuZCBhaSB0byB1c2UgQUkgZmVhdHVyZXMuXCIsXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRml4dHVyZShcbiAgICBtZXNzYWdlczogTW9kZWxNZXNzYWdlW10sXG4gICAgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogU3RyZWFtVGV4dFJlc3VsdDxhbnksIGFueT4ge1xuICAgIGlmICghdGhpcy5haVNkayB8fCAhdGhpcy5tb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQUkgU0RLIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cblxuICAgIC8vIO2YhOyerCBmaXh0dXJlUmVjb3Jkc+yXkOyEnCDsgqzsmqnrkJwg7JeU7Yuw7Yuw65Ok7J2YIOq1rOyhsCDsoJXrs7Qg7IiY7KeRXG4gICAgY29uc3QgdXNlZEVudGl0eUlkcyA9IFsuLi5uZXcgU2V0KGZpeHR1cmVSZWNvcmRzLm1hcCgocikgPT4gci5lbnRpdHlJZCkpXTtcbiAgICBjb25zdCBlbnRpdHlTdHJ1Y3R1cmVzID0gdXNlZEVudGl0eUlkcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIHRhYmxlOiBlbnRpdHkudGFibGUsXG4gICAgICAgIHByb3BzOiBlbnRpdHkucHJvcHMsXG4gICAgICAgIHJlbGF0aW9uczogZW50aXR5LnJlbGF0aW9ucyxcbiAgICAgICAgZW51bUxhYmVsczogZW50aXR5LmVudW1MYWJlbHMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3lzdGVtTWVzc2FnZSA9IGBcbiAgICAgICAg64u57Iug7J2AIO2UveyKpOyzkCDroIjsvZTrk5zrpbwg7IiY7KCV7ZWY6rOgIOyDneyEse2VoCDsiJgg7J6I64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuICAgICAgICDtmITsnqwg7ZS97Iqk7LOQIOugiOy9lOuTnDpcbiAgICAgICAgJHtKU09OLnN0cmluZ2lmeShmaXh0dXJlUmVjb3JkcywgbnVsbCwgMil9XG5cbiAgICAgICAg7JeU7Yuw7YuwIOq1rOyhsCDsoJXrs7Q6XG4gICAgICAgICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5U3RydWN0dXJlcywgbnVsbCwgMil9XG5cbiAgICAgICAgIyMg7ZS97Iqk7LOQIOyImOyglVxuICAgICAgICDsgqzsmqnsnpDqsIAg7ZS97Iqk7LOQIOqwkiDsiJjsoJXsnYQg7JqU7LKt7ZWY66m0IHVwZGF0ZUZpeHR1cmVzIOuPhOq1rOulvCDsgqzsmqntlZjsl6wg67OA6rK97IKs7ZWt7J2EIOyggeyaqe2VmOyEuOyalC5cbiAgICAgICAgLSBmaXh0dXJlSWQ6IOyImOygle2VoCDtlL3siqTss5AgSUQgKO2YleyLnTogXCJFbnRpdHlJZCNpZFwiKVxuICAgICAgICAtIHVwZGF0ZXM6IOy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcblxuICAgICAgICDsmIjsi5w6IFwiVXNlciMxXCIg7ZS97Iqk7LOQ7J2YIFwibmFtZVwiIOy7rOufvOydhCBcIu2Zjeq4uOuPmVwi7Jy866GcIOuzgOqyve2VmOugpOuptDpcbiAgICAgICAgdXBkYXRlRml4dHVyZXMoeyB1cGRhdGVzOiBbeyBmaXh0dXJlSWQ6IFwiVXNlciMxXCIsIHVwZGF0ZXM6IHsgbmFtZTogXCLtmY3quLjrj5lcIiB9IH1dIH0pXG5cbiAgICAgICAg67OA6rK965CgIOy7rOufvOydmCB0eXBl7J20IHJlbGF0aW9u7J24IOqyveyasCwg6rSA66CoIOyXlO2LsO2LsOyXkOuPhCDrsJjsmIHrkJjslrTslbwg7ZWgIOy7rOufvOydtCDsnojripTsp4Ag7ZmV7J247ZWY7IS47JqULlxuXG4gICAgICAgICMjIO2UveyKpOyzkCDsg53shLFcbiAgICAgICAg7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDtlL3siqTss5Ag7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVGaXh0dXJlcyDrj4Tqtazrpbwg7IKs7Jqp7ZWY7IS47JqULlxuICAgICAgICAtIGVudGl0eUlkOiDsg53shLHtlaAg7JeU7Yuw7YuwIElEXG4gICAgICAgIC0gaWQ6IOyDiCDroIjsvZTrk5zsnZggSUQgKOq4sOyhtCDtlL3siqTss5DsmYAg7KSR67O165CY7KeAIOyViuuKlCDsnYzsiJgg7IKs7JqpIOq2jOyepSwg7JiIOiAtMSwgLTIpXG4gICAgICAgIC0gY29sdW1uczog7Lus65+866qF7J2EIO2CpOuhnCwg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0ICjsl5Tti7Dti7Ag6rWs7KGwIOywuOqzoClcblxuICAgICAgICDsmIjsi5w6IOyDiOuhnOyatCBVc2VyIO2UveyKpOyzkOulvCDsg53shLHtlZjroKTrqbQ6XG4gICAgICAgIGNyZWF0ZUZpeHR1cmVzKHsgZml4dHVyZXM6IFt7IGVudGl0eUlkOiBcIlVzZXJcIiwgaWQ6IC0xLCBjb2x1bW5zOiB7IG5hbWU6IFwi7ZmN6ri464+ZXCIsIGVtYWlsOiBcImhvbmdAZXhhbXBsZS5jb21cIiB9IH1dIH0pXG4gICAgICBgO1xuXG4gICAgY29uc3QgeyBzdHJlYW1UZXh0LCB0b29sIH0gPSB0aGlzLmFpU2RrO1xuXG4gICAgcmV0dXJuIHN0cmVhbVRleHQoe1xuICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICBzeXN0ZW06IHN5c3RlbU1lc3NhZ2UsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIHRvb2xzOiB7XG4gICAgICAgIHVwZGF0ZUZpeHR1cmVzOiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7ZS97Iqk7LOQIOugiOy9lOuTnOydmCDqsJLsnYQg7IiY7KCV7ZWp64uI64ukLiDsgqzsmqnsnpDqsIAg7Yq57KCVIOy7rOufvOydtOuCmCDqsJLsnYQg67OA6rK97ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICB1cGRhdGVzOiB6LmFycmF5KFxuICAgICAgICAgICAgICB6Lm9iamVjdCh7XG4gICAgICAgICAgICAgICAgZml4dHVyZUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2UveyKpOyzkCBJRCAo7ZiV7IudOiBFbnRpdHlJZCNpZClcIiksXG4gICAgICAgICAgICAgICAgdXBkYXRlczogelxuICAgICAgICAgICAgICAgICAgLnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSlcbiAgICAgICAgICAgICAgICAgIC5kZXNjcmliZShcIuy7rOufvOuqheydhCDtgqTroZwsIOyDiCDqsJLsnYQg6rCS7Jy866GcIO2VmOuKlCDqsJ3ssrRcIiksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICB1cGRhdGVzOiBBcnJheTx7IGZpeHR1cmVJZDogc3RyaW5nOyB1cGRhdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PjtcbiAgICAgICAgICB9KTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IHVwZGF0ZWRSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gfT4gPT4ge1xuICAgICAgICAgICAgLy8gZml4dHVyZVJlY29yZHPrpbwg67O17IKs7ZWY6rOgIOyXheuNsOydtO2KuCDsoIHsmqlcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBmaXh0dXJlUmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1cGRhdGUgPSB1cGRhdGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgKHU6IHsgZml4dHVyZUlkOiBzdHJpbmcgfSkgPT4gdS5maXh0dXJlSWQgPT09IHJlY29yZC5maXh0dXJlSWQsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBjb2x1bW5z7J2YIHZhbHVl66W8IOyXheuNsOydtO2KuFxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIG5ld1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh1cGRhdGUudXBkYXRlcykpIHtcbiAgICAgICAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW2NvbHVtbk5hbWVdLnZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUgYXMgRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCB1cGRhdGVkUmVjb3JkcyB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBjcmVhdGVGaXh0dXJlczogdG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICBcIuyDiOuhnOyatCDtlL3siqTss5Ag66CI7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC4g7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCDrjbDsnbTthLDrpbwg7LaU6rCA7ZW064us65286rOgIOyalOyyre2VoCDrlYwg7IKs7Jqp7ZWY7IS47JqULlwiLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICAgICAgICBmaXh0dXJlczogei5hcnJheShcbiAgICAgICAgICAgICAgei5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IOd7ISx7ZWgIOyXlO2LsO2LsCBJRFwiKSxcbiAgICAgICAgICAgICAgICBpZDogei5udW1iZXIoKS5kZXNjcmliZShcIuyDiCDroIjsvZTrk5zsnZggSUQgKOydjOyImCDqtozsnqUsIOyYiDogLTEsIC0yKVwiKSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB6XG4gICAgICAgICAgICAgICAgICAucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKVxuICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlKFwi7Lus65+866qF7J2EIO2CpOuhnCwg6rCS7J2EIOqwkuycvOuhnCDtlZjripQg6rCd7LK0XCIpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHtcbiAgICAgICAgICAgIGZpeHR1cmVzLFxuICAgICAgICAgIH06IHtcbiAgICAgICAgICAgIGZpeHR1cmVzOiBBcnJheTx7IGVudGl0eUlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+O1xuICAgICAgICAgIH0pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgdXBkYXRlZFJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSB9PiA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBmaXh0dXJlcy5tYXAoXG4gICAgICAgICAgICAgIChmaXh0dXJlOiB7IGVudGl0eUlkOiBzdHJpbmc7IGlkOiBudW1iZXI7IGNvbHVtbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgICAgICAgIC8vIOyXlO2LsO2LsCBwcm9wc+ulvCDquLDrsJjsnLzroZwgY29sdW1ucyDqtazshLFcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBGaXh0dXJlUmVjb3JkW1wiY29sdW1uc1wiXSA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwidmlydHVhbFwiKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW3Byb3AubmFtZV0gPz8gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZSA9PT0gXCJjcmVhdGVkX2F0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7ZiE7J6sIOyLnOqwhOycvOuhnCDshKTsoJVcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiIHx8IHByb3AucmVsYXRpb25UeXBlID09PSBcIk1hbnlUb01hbnlcIilcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyDrsLDsl7TroZwg67OA7ZmYXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0uZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29sdW1uc1twcm9wLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBwcm9wLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUgYXMgRml4dHVyZVJlY29yZFtcImNvbHVtbnNcIl1bc3RyaW5nXVtcInZhbHVlXCJdLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgZml4dHVyZUlkOiBgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9YCxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgaWQ6IGZpeHR1cmUuaWQsXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgYmVsb25nc1JlY29yZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyDsg4gg66CI7L2U65Oc65Ok7J2YIHJlbGF0aW9uIOy7rOufvOydhCDtmZXsnbjtlZjsl6wg6riw7KG0IOugiOy9lOuTnOuTpOydmCDsl63rsKntlqUgcmVsYXRpb24g7JeF642w7J207Yq4XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5ld1JlY29yZCBvZiBuZXdSZWNvcmRzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW19jb2xOYW1lLCBjb2xdIG9mIE9iamVjdC5lbnRyaWVzKG5ld1JlY29yZC5jb2x1bW5zKSkge1xuICAgICAgICAgICAgICAgIGlmIChjb2wucHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgY29sLnZhbHVlID09PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHlJZCA9IGNvbC5wcm9wLndpdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IEFycmF5LmlzQXJyYXkoY29sLnZhbHVlKSA/IGNvbC52YWx1ZSA6IFtjb2wudmFsdWVdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3JlbGF0ZWRFbnRpdHlJZH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWNvcmQgPSBuZXdSZWNvcmRzLmZpbmQoKHIpID0+IHIuZml4dHVyZUlkID09PSByZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWNvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9uIOywvuq4sFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXZlcnNlQ29sID0gT2JqZWN0LmVudHJpZXMocmVsYXRlZFJlY29yZC5jb2x1bW5zKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgIChbLCBjXSkgPT4gYy5wcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJiBjLnByb3Aud2l0aCA9PT0gbmV3UmVjb3JkLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlQ29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgW3JldmVyc2VDb2xOYW1lLCByZXZlcnNlQ29sVmFsdWVdID0gcmV2ZXJzZUNvbDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSByZXZlcnNlQ29sVmFsdWUudmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAvLyDsl63rsKntlqXsnbQg67Cw7Je07J24IOqyveyasCAoSGFzTWFueSwgTWFueVRvTWFueSlcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlQ29sVmFsdWUucHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXZlcnNlQ29sVmFsdWUucHJvcC5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VDb2xWYWx1ZS5wcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJNYW55VG9NYW55XCIpXG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpLCBcImN1cnJlbnRWYWx1ZSBtdXN0IGJlIGFuIGFycmF5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUuaW5jbHVkZXMobmV3UmVjb3JkLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkUmVjb3JkLmNvbHVtbnNbcmV2ZXJzZUNvbE5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJldmVyc2VDb2xWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWy4uLmN1cnJlbnRWYWx1ZSwgbmV3UmVjb3JkLmlkXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g7Jet67Cp7Zal7J20IOuLqOydvCDqsJLsnbgg6rK97JqwIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZFJlY29yZC5jb2x1bW5zW3JldmVyc2VDb2xOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmV2ZXJzZUNvbFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3UmVjb3JkLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgdXBkYXRlZFJlY29yZHM6IG5ld1JlY29yZHMgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVFbnRpdHkobWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdKTogU3RyZWFtVGV4dFJlc3VsdDxhbnksIGFueT4ge1xuICAgIGlmICghdGhpcy5haVNkayB8fCAhdGhpcy5tb2RlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQUkgU0RLIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuXCIpO1xuICAgIH1cblxuICAgIC8vIGVudGl0eS5pbnN0cnVjdGlvbnMubWQg7YyM7J28IOydveq4sCAoZGlzdC91aSDrmJDripQgc3JjL3Vp7JeQ7IScIOyLpO2WieuQmOuvgOuhnCDtjKjtgqTsp4Ag66Oo7Yq4IOq4sOykgOycvOuhnCDsoJHqt7wpXG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgICBcIi4uXCIsXG4gICAgICBcIi4uXCIsXG4gICAgICBcInNyY1wiLFxuICAgICAgXCJ1aVwiLFxuICAgICAgXCJlbnRpdHkuaW5zdHJ1Y3Rpb25zLm1kXCIsXG4gICAgKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBmcy5yZWFkRmlsZVN5bmMoaW5zdHJ1Y3Rpb25zUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIO2YhOyerCDrk7HroZ3rkJwg7JeU7Yuw7YuwIOygleuztCDsiJjsp5FcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGV4aXN0aW5nRW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IGVudGl0eS5pZCxcbiAgICAgICAgdGl0bGU6IGVudGl0eS50aXRsZSxcbiAgICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgICAgcHJvcHM6IGVudGl0eS5wcm9wcy5tYXAoKHApID0+ICh7XG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIHR5cGU6IHAudHlwZSxcbiAgICAgICAgICBkZXNjOiBwLmRlc2MsXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzeXN0ZW1NZXNzYWdlID0gYFxu64u57Iug7J2AIFNvbmFtdSDtlITroIjsnoTsm4ztgazsl5DshJwgRW50aXR57JmAIEVudW3snYQg7IOd7ISx7ZWY64qUIOuPhOyasOuvuOyeheuLiOuLpC5cblxuJHtpbnN0cnVjdGlvbnN9XG5cbiMjIO2YhOyerCDrk7HroZ3rkJwgRW50aXR5IOuqqeuhnVxu64uk66W4IOyXlO2LsO2LsOyZgCDqtIDqs4QocmVsYXRpb24p66W8IOunuuqxsOuCmCBzdWJzZXTsl5DshJwg7LC47KGw7ZWgIOuVjCDrsJjrk5zsi5wg7JWE656YIOygleuztOulvCDtmZXsnbjtlZjshLjsmpQuXG5cbiR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdFbnRpdGllcywgbnVsbCwgMil9XG5cbiMjIFRvb2wg7IKs7JqpIOqwgOydtOuTnFxuXG4jIyMgRW50aXR5IOyDneyEsSAoY3JlYXRlRW50aXR5KVxu7IKs7Jqp7J6Q6rCAIOyDiOuhnOyatCBFbnRpdHkg7IOd7ISx7J2EIOyalOyyre2VmOuptCBjcmVhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC5cbi0gZW50aXR5SWQ6IFBhc2NhbENhc2XroZwg65CcIEVudGl0eSBJRCAo7JiIOiBcIlVzZXJcIiwgXCJQcm9kdWN0Q2F0ZWdvcnlcIilcbi0gdGl0bGU6IO2VnOq4gCDsoJzrqqkgKOyYiDogXCLsgqzsmqnsnpBcIiwgXCLsg4Htkogg7Lm07YWM6rOg66asXCIpXG4tIHRhYmxlOiBzbmFrZV9jYXNl66GcIOuQnCDthYzsnbTruJTrqoUgKOyYiDogXCJ1c2Vyc1wiLCBcInByb2R1Y3RfY2F0ZWdvcmllc1wiKVxuLSBwYXJlbnRJZDog67aA66qoIEVudGl0eSBJRCAo7ISg7YOd7IKs7ZWtKVxuLSBwcm9wczogRW50aXR57J2YIO2UhOuhnO2NvO2LsCDrsLDsl7QgKOychCDrrLjshJzsnZggUHJvcGVydHkgVHlwZXMg7LC46rOgKVxuLSBpbmRleGVzOiDsnbjrjbHsiqQg67Cw7Je0XG4tIHN1YnNldHM6IOyEnOu4jOyFiyDsoJXsnZggKOq4sOuzuOqwkjogeyBBOiBbXCJpZFwiXSB9KVxuLSBlbnVtczogRW51bSDsoJXsnZhcblxuIyMjIEVudGl0eSDsiJjsoJUgKHVwZGF0ZUVudGl0eSlcbuq4sOyhtCBFbnRpdHnrpbwg7IiY7KCV7ZWgIOuVjCB1cGRhdGVFbnRpdHkg64+E6rWs66W8IOyCrOyaqe2VmOyEuOyalC4gRW51bSDstpTqsIAsIHByb3BzIOy2lOqwgC/siJjsoJUsIGluZGV4ZXMg7IiY7KCVIOuTsSDrqqjrk6Ag7IiY7KCVIOyekeyXheyXkCDsgqzsmqntlanri4jri6QuXG4tIGVudGl0eUlkOiDsiJjsoJXtlaAgRW50aXR5IElEXG4tIHVwZGF0ZXM6IOyImOygle2VoCDtlYTrk5zrk6QgKOu2gOu2hCDsl4XrjbDsnbTtirgpXG4gIC0gdGl0bGU6IOyXlO2LsO2LsCDtlZzquIAg7KCc66qpXG4gIC0gdGFibGU6IO2FjOydtOu4lOuqhVxuICAtIHByb3BzOiDstpTqsIDtlaAg7ZSE66Gc7Y287YuwIOuwsOyXtCAo6riw7KG0IHByb3Bz7JeQIOy2lOqwgCwg6rCZ7J2AIOydtOumhOydtOuptCDqtZDssrQpXG4gIC0gaW5kZXhlczog7LaU6rCA7ZWgIOyduOuNseyKpCDrsLDsl7QgKOq4sOyhtCBpbmRleGVz7JeQIOy2lOqwgClcbiAgLSBzdWJzZXRzOiDshJzruIzshYsg7KCV7J2YICjquLDsobQgc3Vic2V0c+yXkCDrs5HtlakpXG4gIC0gZW51bUxhYmVsczogRW51bSDsoJXsnZggKOq4sOyhtCBlbnVtTGFiZWxz7JeQIOuzke2VqSlcbi0gbW9kZTogXCJtZXJnZVwiKOq4sOuzuOqwkikg65iQ64qUIFwicmVwbGFjZVwiXG4gIC0gbWVyZ2U6IOq4sOyhtCDqsJLsl5Ag67OR7ZWpXG4gIC0gcmVwbGFjZTog7ZW064u5IO2VhOuTnCDsoITssrQg6rWQ7LK0XG5cbuyYiOyLnDogRW1wbG95ZWXsl5Ag7IOIIEVudW0g7LaU6rCAXG51cGRhdGVFbnRpdHkoeyBlbnRpdHlJZDogXCJFbXBsb3llZVwiLCB1cGRhdGVzOiB7IGVudW1MYWJlbHM6IHsgXCJFbXBsb3llZVJvbGVcIjogeyBcImFkbWluXCI6IFwi6rSA66as7J6QXCIsIFwidXNlclwiOiBcIuydvOuwmFwiIH0gfSB9IH0pXG5cbuyYiOyLnDogUHJvamVjdOyXkCDsg4gg7ZSE66Gc7Y287YuwIOy2lOqwgFxudXBkYXRlRW50aXR5KHsgZW50aXR5SWQ6IFwiUHJvamVjdFwiLCB1cGRhdGVzOiB7IHByb3BzOiBbeyBuYW1lOiBcInByaW9yaXR5XCIsIHR5cGU6IFwiaW50ZWdlclwiLCBkZXNjOiBcIuyasOyEoOyInOychFwiIH1dIH0gfSlcblxuIyMg7ZWE7IiYIOyCrO2VrVxuLSBFbnRpdHnsnZggcHJvcHPsl5DripQg7LWc7IaM7ZWcIGlkKGludGVnZXIsIHVuc2lnbmVkKSwgY3JlYXRlZF9hdCh0aW1lc3RhbXAp6rCAIO2PrO2VqOuQmOyWtOyVvCDtlanri4jri6QuXG4tIHJlbGF0aW9uIO2VhOuTnOuKlCBvblVwZGF0ZSwgb25EZWxldGXqsIAg7ZWE7IiY7J6F64uI64ukLiAo7JiI7Jm4OiBPbmVUb09uZeyXkOyEnCBoYXNKb2luQ29sdW1u7J20IGZhbHNl7J24IOqyveyasClcbi0gRW51bSBJROuKlCDrs7TthrUgRW50aXR5SWQgKyDsho3shLHrqoUg7ZiV7YOc7J6F64uI64ukICjsmIg6IFVzZXJTdGF0dXMsIFByb2R1Y3RUeXBlKVxuLSBzdWJzZXTsl5DshJwg64uk66W4IOyXlO2LsO2LsOydmCDtlITroZztjbzti7Drpbwg7LC47KGw7ZWgIOuVjOuKlCDrsJjrk5zsi5wg7ZW064u5IOyXlO2LsO2LsOydmCDsi6TsoJwg7ZSE66Gc7Y287Yuw66qF7J2EIOyCrOyaqe2VmOyEuOyalC5cblxuIyMg6rKA7KadIOyYpOulmCDsspjrpqxcbuuPhOq1rCDtmLjstpwg6rKw6rO866GcIOqygOymnSDsmKTrpZgodmFsaWRhdGlvbkVycm9ycynqsIAg67CY7ZmY65CY66m0OlxuMS4g7Jik66WYIOuplOyLnOyngOulvCDrtoTshJ3tlZjsl6wg66y47KCc7KCQ7J2EIO2MjOyVhe2VmOyEuOyalC5cbjIuIOyYpOulmOulvCDsiJjsoJXtlZwg642w7J207YSw66GcIGNyZWF0ZUVudGl0eeulvCDri6Tsi5wg7Zi47Lac7ZWY7IS47JqULlxuMy4g7IKs7Jqp7J6Q7JeQ6rKMIOyYpOulmOulvCDqt7jrjIDroZwg7KCE64us7ZWY7KeAIOunkOqzoCwg7IiY7KCVIO2bhCDsnqzsi5zrj4TtlZjshLjsmpQuXG5cbiMjIyDsnbzrsJjsoIHsnbgg6rKA7KadIOyYpOulmOyZgCDsiJjsoJUg67Cp67KVXG58IOyYpOulmCDrqZTsi5zsp4AgfCDsiJjsoJUg67Cp67KVIHxcbnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLXxcbnwgXCJpZCDtlITroZztjbzti7DqsIAg7ZWE7IiYXCIgfCBwcm9wc+yXkCB7IG5hbWU6IFwiaWRcIiwgdHlwZTogXCJpbnRlZ2VyXCIsIHVuc2lnbmVkOiB0cnVlIH0g7LaU6rCAIHxcbnwgXCJjcmVhdGVkX2F0IO2UhOuhnO2NvO2LsOqwgCDtlYTsiJhcIiB8IHByb3Bz7JeQIHsgbmFtZTogXCJjcmVhdGVkX2F0XCIsIHR5cGU6IFwidGltZXN0YW1wXCIsIGRiRGVmYXVsdDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiIH0g7LaU6rCAIHxcbnwgXCJYeHhPcmRlckJ5IGVudW3snbQg7ZWE7IiYXCIgfCBlbnVtc+yXkCB7IFwiWHh4T3JkZXJCeVwiOiB7IFwiaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIgfSB9IOy2lOqwgCB8XG58IFwiWHh4U2VhcmNoRmllbGQgZW51beydtCDtlYTsiJhcIiB8IGVudW1z7JeQIHsgXCJYeHhTZWFyY2hGaWVsZFwiOiB7IFwiaWRcIjogXCJJRFwiIH0gfSDstpTqsIAgfFxufCBcInN0cmluZyDtg4DsnoXsnYAgbGVuZ3Ro6rCAIO2VhOyImFwiIHwg7ZW064u5IHByb3Dsl5AgbGVuZ3RoIOy2lOqwgCAo7JiIOiAyNTUpIHxcbnwgXCJ0ZXh0IO2DgOyeheydgCB0ZXh0VHlwZeydtCDtlYTsiJhcIiB8IO2VtOuLuSBwcm9w7JeQIHRleHRUeXBlIOy2lOqwgCAoXCJ0ZXh0XCIsIFwibWVkaXVtdGV4dFwiLCBcImxvbmd0ZXh0XCIpIHxcbnwgXCJvblVwZGF0ZeqwgCDtlYTsiJhcIiB8IO2VtOuLuSByZWxhdGlvbiBwcm9w7JeQIG9uVXBkYXRlLCBvbkRlbGV0ZSDstpTqsIAgKFwiQ0FTQ0FERVwiKSB8XG4gICAgICBgO1xuXG4gICAgY29uc3QgeyBzdHJlYW1UZXh0LCB0b29sLCBzdGVwQ291bnRJcyB9ID0gdGhpcy5haVNkaztcblxuICAgIHJldHVybiBzdHJlYW1UZXh0KHtcbiAgICAgIG1vZGVsOiB0aGlzLm1vZGVsIGFzIHVua25vd24gYXMgTGFuZ3VhZ2VNb2RlbCxcbiAgICAgIHN5c3RlbTogc3lzdGVtTWVzc2FnZSxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgc3RvcFdoZW46IHN0ZXBDb3VudElzKDIpLFxuICAgICAgdG9vbHM6IHtcbiAgICAgICAgY3JlYXRlRW50aXR5OiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi7IOI66Gc7Jq0IEVudGl0eeulvCDsg53shLHtlanri4jri6QuIOyCrOyaqeyekOqwgCDsg4jroZzsmrQg7JeU7Yuw7Yuw64KYIO2FjOydtOu4lCDsg53shLHsnYQg7JqU7LKt7ZWgIOuVjCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IFRlbXBsYXRlT3B0aW9ucy5zaGFwZS5lbnRpdHksXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKFxuICAgICAgICAgICAgZW50aXR5OiB6LmluZmVyPHR5cGVvZiBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5PixcbiAgICAgICAgICApOiBQcm9taXNlPHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzPzogVmFsaWRhdGlvbkVycm9yW107XG4gICAgICAgICAgfT4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g7J6F66ClIOqygOymnVxuICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uRXJyb3JzID0gdmFsaWRhdGVFbnRpdHlKc29uKGVudGl0eSk7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBlbnRpdHkuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgICBlcnJvcjogYOqygOymnSDsmKTrpZg6ICR7dmFsaWRhdGlvbkVycm9ycy5tYXAoKGUpID0+IGBbJHtlLmZpZWxkfV0gJHtlLm1lc3NhZ2V9YCkuam9pbihcIiwgXCIpfWAsXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBhd2FpdCBTb25hbXUuc3luY2VyLmNyZWF0ZUVudGl0eSh7XG4gICAgICAgICAgICAgICAgc3Vic2V0czogeyBBOiBbXCJpZFwiXSB9LFxuICAgICAgICAgICAgICAgIGVudW1zOiB7fSxcbiAgICAgICAgICAgICAgICAuLi5lbnRpdHksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEVudGl0eU1hbmFnZXIg66as66Gc65OcXG4gICAgICAgICAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZW50aXR5SWQ6IGVudGl0eS5lbnRpdHlJZCB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZW50aXR5SWQ6IGVudGl0eS5lbnRpdHlJZCwgZXJyb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgdXBkYXRlRW50aXR5OiB0b29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwi6riw7KG0IEVudGl0eeulvCDsiJjsoJXtlanri4jri6QuIEVudW0g7LaU6rCALCBwcm9wcyDstpTqsIAv7IiY7KCVLCBpbmRleGVzIOyImOyglSwgc3Vic2V0cyDsiJjsoJUg65OxIOuqqOuToCDsl5Tti7Dti7Ag7IiY7KCVIOyekeyXheyXkCDsgqzsmqntlZjshLjsmpQuXCIsXG4gICAgICAgICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgICAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIEVudGl0eSBJRFwiKSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IFRlbXBsYXRlT3B0aW9ucy5zaGFwZS5lbnRpdHkucGFydGlhbCgpLmRlc2NyaWJlKFwi7IiY7KCV7ZWgIO2VhOuTnOuTpFwiKSxcbiAgICAgICAgICAgIG1vZGU6IHpcbiAgICAgICAgICAgICAgLmVudW0oW1wibWVyZ2VcIiwgXCJyZXBsYWNlXCJdKVxuICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAuZGVzY3JpYmUoXCLsiJjsoJUg66qo65OcOiBtZXJnZSjquLDrs7jqsJIsIOq4sOyhtCDqsJLsl5Ag67OR7ZWpKSDrmJDripQgcmVwbGFjZSjsoITssrQg6rWQ7LK0KVwiKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoe1xuICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICB1cGRhdGVzLFxuICAgICAgICAgICAgbW9kZSA9IFwibWVyZ2VcIixcbiAgICAgICAgICB9OiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdXBkYXRlczogUGFydGlhbDx6LmluZmVyPHR5cGVvZiBUZW1wbGF0ZU9wdGlvbnMuc2hhcGUuZW50aXR5Pj47XG4gICAgICAgICAgICBtb2RlPzogXCJtZXJnZVwiIHwgXCJyZXBsYWNlXCI7XG4gICAgICAgICAgfSk6IFByb21pc2U8e1xuICAgICAgICAgICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvcnM/OiBWYWxpZGF0aW9uRXJyb3JbXTtcbiAgICAgICAgICB9PiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICAgICAgLy8gVXBkYXRlIGJhc2ljIHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuZW50aXR5SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LmlkID0gdXBkYXRlcy5lbnRpdHlJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucGFyZW50SWQgIT09IHVuZGVmaW5lZCkgZW50aXR5LnBhcmVudElkID0gdXBkYXRlcy5wYXJlbnRJZDtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGl0bGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRpdGxlID0gdXBkYXRlcy50aXRsZTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMudGFibGUgIT09IHVuZGVmaW5lZCkgZW50aXR5LnRhYmxlID0gdXBkYXRlcy50YWJsZTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMuY29uZSAhPT0gdW5kZWZpbmVkKSBlbnRpdHkuY29uZSA9IHVwZGF0ZXMuY29uZTtcblxuICAgICAgICAgICAgICAvLyBwcm9wczogbWVyZ2Ug7IucIOydtOumhCDquLDspIAg67OR7ZWpLCByZXBsYWNlIOyLnCDqtZDssrRcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInJlcGxhY2VcIikge1xuICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzID0gdXBkYXRlcy5wcm9wcyBhcyBFbnRpdHlQcm9wW107XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmV3UHJvcCBvZiB1cGRhdGVzLnByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBlbnRpdHkucHJvcHMuZmluZEluZGV4KChwKSA9PiBwLm5hbWUgPT09IG5ld1Byb3AubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkucHJvcHNbZXhpc3RpbmdJbmRleF0gPSBuZXdQcm9wIGFzIEVudGl0eVByb3A7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgZW50aXR5LnByb3BzLnB1c2gobmV3UHJvcCBhcyBFbnRpdHlQcm9wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGluZGV4ZXM6IG1lcmdlIOyLnCDstpTqsIAsIHJlcGxhY2Ug7IucIOq1kOyytFxuICAgICAgICAgICAgICBpZiAodXBkYXRlcy5pbmRleGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHkuaW5kZXhlcyA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIiA/IHVwZGF0ZXMuaW5kZXhlcyA6IFsuLi5lbnRpdHkuaW5kZXhlcywgLi4udXBkYXRlcy5pbmRleGVzXTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbDogYXNzaWdu7Jy866GcIOuzke2VqSDrmJDripQg6rWQ7LK0XG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLnN1YnNldHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBzdWJzZXQgZmllbGRzOiBzZXBhcmF0ZSBpbnRvIHN1YnNldHMgKG5vcm1hbCkgYW5kIHN1YnNldHNJbnRlcm5hbCAoaW50ZXJuYWwpXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWw6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHVwZGF0ZXMuc3Vic2V0cykpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkQXJyYXkgPSBmaWVsZHMgYXMgc3RyaW5nW107XG4gICAgICAgICAgICAgICAgICBub3JtYWxpemVkU3Vic2V0c1trZXldID0gZmllbGRBcnJheVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChmOiBzdHJpbmcpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRBcnJheVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZClcbiAgICAgICAgICAgICAgICAgICAgLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHMgPVxuICAgICAgICAgICAgICAgICAgbW9kZSA9PT0gXCJyZXBsYWNlXCJcbiAgICAgICAgICAgICAgICAgICAgPyBub3JtYWxpemVkU3Vic2V0c1xuICAgICAgICAgICAgICAgICAgICA6IHsgLi4uZW50aXR5LnN1YnNldHMsIC4uLm5vcm1hbGl6ZWRTdWJzZXRzIH07XG4gICAgICAgICAgICAgICAgZW50aXR5LnN1YnNldHNJbnRlcm5hbCA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIlxuICAgICAgICAgICAgICAgICAgICA/IG5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgOiB7IC4uLmVudGl0eS5zdWJzZXRzSW50ZXJuYWwsIC4uLm5vcm1hbGl6ZWRTdWJzZXRzSW50ZXJuYWwgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh1cGRhdGVzLmVudW1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRFbnVtcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHVwZGF0ZXMuZW51bXMpLm1hcCgoW2tleSwgZW51bURlZl0pID0+IFtcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBnZXRFbnVtRGVmVmFsdWVzKGVudW1EZWYpLFxuICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscyA9XG4gICAgICAgICAgICAgICAgICBtb2RlID09PSBcInJlcGxhY2VcIiA/IGNvbnZlcnRlZEVudW1zIDogeyAuLi5lbnRpdHkuZW51bUxhYmVscywgLi4uY29udmVydGVkRW51bXMgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIOyggOyepSDsoIQg6rKA7KadXG4gICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0ZUVudGl0eUpzb24oe1xuICAgICAgICAgICAgICAgIC4uLmVudGl0eSxcbiAgICAgICAgICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICAgICAgICAgIGVudW1zOiBlbnRpdHkuZW51bUxhYmVscyxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb25FcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGDqsoDspp0g7Jik66WYOiAke3ZhbGlkYXRpb25FcnJvcnMubWFwKChlKSA9PiBgWyR7ZS5maWVsZH1dICR7ZS5tZXNzYWdlfWApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBlbnRpdHlJZCB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSwgZW50aXR5SWQsIGVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRW50aXR5IEpTT07snbQgZW50aXR5Lmluc3RydWN0aW9ucy5tZOydmCDqt5zsuZnsnYQg65Sw66W064qU7KeAIOqygOymne2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFbnRpdHlKc29uKGlucHV0OiBUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0pOiBWYWxpZGF0aW9uRXJyb3JbXSB7XG4gIGNvbnN0IGVycm9yczogVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgY29uc3QgeyBlbnRpdHlJZCwgcHJvcHMsIGVudW1zIH0gPSBpbnB1dDtcblxuICAvLyAxLiBpZCwgY3JlYXRlZF9hdCBwcm9wIO2VhOyImFxuICBjb25zdCBoYXNJZFByb3AgPSBwcm9wcz8uc29tZSgocCkgPT4gcC5uYW1lID09PSBcImlkXCIpO1xuICBpZiAoIWhhc0lkUHJvcCkge1xuICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6IFwicHJvcHNcIiwgbWVzc2FnZTogXCJpZCDtlITroZztjbzti7DqsIAg7ZWE7IiY7J6F64uI64ukLlwiIH0pO1xuICB9XG4gIGNvbnN0IGhhc0NyZWF0ZWRBdFByb3AgPSBwcm9wcz8uc29tZSgocCkgPT4gcC5uYW1lID09PSBcImNyZWF0ZWRfYXRcIik7XG4gIGlmICghaGFzQ3JlYXRlZEF0UHJvcCkge1xuICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6IFwicHJvcHNcIiwgbWVzc2FnZTogXCJjcmVhdGVkX2F0IO2UhOuhnO2NvO2LsOqwgCDtlYTsiJjsnoXri4jri6QuXCIgfSk7XG4gIH1cblxuICAvLyAyLiDtlYTsiJggZW51bSDqsoDspp06IEVudGl0eU5hbWVPcmRlckJ5LCBFbnRpdHlOYW1lU2VhcmNoRmllbGRcbiAgY29uc3Qgb3JkZXJCeUVudW1JZCA9IGAke2VudGl0eUlkfU9yZGVyQnlgO1xuICBjb25zdCBzZWFyY2hGaWVsZEVudW1JZCA9IGAke2VudGl0eUlkfVNlYXJjaEZpZWxkYDtcblxuICBpZiAoIWVudW1zPy5bb3JkZXJCeUVudW1JZF0pIHtcbiAgICBlcnJvcnMucHVzaCh7XG4gICAgICBmaWVsZDogXCJlbnVtc1wiLFxuICAgICAgbWVzc2FnZTogYCR7b3JkZXJCeUVudW1JZH0gZW51beydtCDtlYTsiJjsnoXri4jri6QuICjsmIg6IHsgXCJpZC1kZXNjXCI6IFwiSUTstZzsi6DsiJxcIiB9KWAsXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFlbnVtcz8uW3NlYXJjaEZpZWxkRW51bUlkXSkge1xuICAgIGVycm9ycy5wdXNoKHtcbiAgICAgIGZpZWxkOiBcImVudW1zXCIsXG4gICAgICBtZXNzYWdlOiBgJHtzZWFyY2hGaWVsZEVudW1JZH0gZW51beydtCDtlYTsiJjsnoXri4jri6QuICjsmIg6IHsgXCJpZFwiOiBcIklEXCIgfSlgLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gMy4gZW51bSBwcm9w7J2YIGlk6rCAIGVudW1z7JeQIOygleydmOuQmOyWtCDsnojripTsp4Ag7ZmV7J24IChjcm9zcy1maWVsZCDqsoDspp0pXG4gIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcyA/PyBbXSkge1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiICYmICFlbnVtcz8uW3Byb3AuaWRdKSB7XG4gICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiBgcHJvcHMuJHtwcm9wLm5hbWV9YCxcbiAgICAgICAgbWVzc2FnZTogYGVudW0gaWQgXCIke3Byb3AuaWR9XCLqsIAgZW51bXPsl5Ag7KCV7J2Y65CY7Ja0IOyeiOyngCDslYrsirXri4jri6QuYCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbmV4cG9ydCBjb25zdCBhaUNsaWVudCA9IG5ldyBBSUNsaWVudCgpO1xuIl0sIm5hbWVzIjpbImFzc2VydCIsImZzIiwicGF0aCIsInoiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiZ2V0RW51bURlZlZhbHVlcyIsImlzSW50ZXJuYWxTdWJzZXRGaWVsZCIsIm5vcm1hbGl6ZVN1YnNldEZpZWxkIiwiVGVtcGxhdGVPcHRpb25zIiwibm9uTnVsbGFibGUiLCJBSUNsaWVudCIsIm1vZGVsIiwiYWlTZGsiLCJpbml0IiwiYW50aHJvcGljIiwiYWlNb2R1bGUiLCJlcnJvciIsImNvbnNvbGUiLCJ3YXJuIiwiaGFuZGxlRml4dHVyZSIsIm1lc3NhZ2VzIiwiZml4dHVyZVJlY29yZHMiLCJFcnJvciIsInVzZWRFbnRpdHlJZHMiLCJTZXQiLCJtYXAiLCJyIiwiZW50aXR5SWQiLCJlbnRpdHlTdHJ1Y3R1cmVzIiwiZW50aXR5IiwiZ2V0IiwiaWQiLCJ0YWJsZSIsInByb3BzIiwicmVsYXRpb25zIiwiZW51bUxhYmVscyIsInN5c3RlbU1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RyZWFtVGV4dCIsInRvb2wiLCJzeXN0ZW0iLCJ0b29scyIsInVwZGF0ZUZpeHR1cmVzIiwiZGVzY3JpcHRpb24iLCJpbnB1dFNjaGVtYSIsIm9iamVjdCIsInVwZGF0ZXMiLCJhcnJheSIsImZpeHR1cmVJZCIsInN0cmluZyIsImRlc2NyaWJlIiwicmVjb3JkIiwidW5rbm93biIsImV4ZWN1dGUiLCJ1cGRhdGVkUmVjb3JkcyIsInVwZGF0ZSIsImZpbmQiLCJ1IiwiY29sdW1uTmFtZSIsIm5ld1ZhbHVlIiwiT2JqZWN0IiwiZW50cmllcyIsImNvbHVtbnMiLCJ2YWx1ZSIsInN1Y2Nlc3MiLCJjcmVhdGVGaXh0dXJlcyIsImZpeHR1cmVzIiwibnVtYmVyIiwibmV3UmVjb3JkcyIsImZpeHR1cmUiLCJwcm9wIiwidHlwZSIsIm5hbWUiLCJEYXRlIiwidG9JU09TdHJpbmciLCJyZWxhdGlvblR5cGUiLCJBcnJheSIsImlzQXJyYXkiLCJmaWx0ZXIiLCJmZXRjaGVkUmVjb3JkcyIsImJlbG9uZ3NSZWNvcmRzIiwib3ZlcnJpZGUiLCJuZXdSZWNvcmQiLCJfY29sTmFtZSIsImNvbCIsInJlbGF0ZWRFbnRpdHlJZCIsIndpdGgiLCJyZWxhdGVkSWRzIiwicmVsYXRlZElkIiwicmVsYXRlZEZpeHR1cmVJZCIsInJlbGF0ZWRSZWNvcmQiLCJyZXZlcnNlQ29sIiwiYyIsInJldmVyc2VDb2xOYW1lIiwicmV2ZXJzZUNvbFZhbHVlIiwiY3VycmVudFZhbHVlIiwiaW5jbHVkZXMiLCJoYW5kbGVFbnRpdHkiLCJpbnN0cnVjdGlvbnNQYXRoIiwiam9pbiIsImRpcm5hbWUiLCJpbnN0cnVjdGlvbnMiLCJyZWFkRmlsZVN5bmMiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJleGlzdGluZ0VudGl0aWVzIiwidGl0bGUiLCJwIiwiZGVzYyIsInN0ZXBDb3VudElzIiwic3RvcFdoZW4iLCJjcmVhdGVFbnRpdHkiLCJzaGFwZSIsInZhbGlkYXRpb25FcnJvcnMiLCJ2YWxpZGF0ZUVudGl0eUpzb24iLCJsZW5ndGgiLCJlIiwiZmllbGQiLCJtZXNzYWdlIiwic3luY2VyIiwic3Vic2V0cyIsIkEiLCJlbnVtcyIsInJlbG9hZCIsInVwZGF0ZUVudGl0eSIsInBhcnRpYWwiLCJtb2RlIiwiZW51bSIsIm9wdGlvbmFsIiwidW5kZWZpbmVkIiwicGFyZW50SWQiLCJjb25lIiwibmV3UHJvcCIsImV4aXN0aW5nSW5kZXgiLCJmaW5kSW5kZXgiLCJwdXNoIiwiaW5kZXhlcyIsIm5vcm1hbGl6ZWRTdWJzZXRzIiwibm9ybWFsaXplZFN1YnNldHNJbnRlcm5hbCIsImtleSIsImZpZWxkcyIsImZpZWxkQXJyYXkiLCJmIiwic3Vic2V0c0ludGVybmFsIiwiY29udmVydGVkRW51bXMiLCJmcm9tRW50cmllcyIsImVudW1EZWYiLCJzYXZlIiwiaW5wdXQiLCJlcnJvcnMiLCJoYXNJZFByb3AiLCJzb21lIiwiaGFzQ3JlYXRlZEF0UHJvcCIsIm9yZGVyQnlFbnVtSWQiLCJzZWFyY2hGaWVsZEVudW1JZCIsImFpQ2xpZW50Il0sIm1hcHBpbmdzIjoiQUFBQSxpRkFBaUYsR0FFakYsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsQ0FBQyxRQUFRLE1BQU07QUFDeEIsU0FBU0MsTUFBTSxRQUFRLGtC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
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAkC/C,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAo9B/D"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAuC/C,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAq2C/D"}