@mnaoumov/obsidian-lib 10.11.0 → 11.0.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 (460) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/worker-component/package.json +6 -0
  5. package/components/worker-pool-component/package.json +6 -0
  6. package/components/workspace-layout-state-component/package.json +6 -0
  7. package/dist/lib/cjs/__merged.cjs +477 -285
  8. package/dist/lib/cjs/__merged.d.cts +26 -10
  9. package/dist/lib/cjs/anchored-suggest.cjs +1 -1
  10. package/dist/lib/cjs/app.cjs +2 -2
  11. package/dist/lib/cjs/async-with-notice.cjs +4 -4
  12. package/dist/lib/cjs/attachment-path.cjs +9 -9
  13. package/dist/lib/cjs/attachment-path.d.cts +3 -3
  14. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
  15. package/dist/lib/cjs/backlink-index.cjs +5 -5
  16. package/dist/lib/cjs/backlink.cjs +7 -7
  17. package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
  18. package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
  19. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  20. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  21. package/dist/lib/cjs/bug-report.cjs +38 -12
  22. package/dist/lib/cjs/bug-report.d.cts +65 -0
  23. package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
  24. package/dist/lib/cjs/bulk-operation.cjs +2 -2
  25. package/dist/lib/cjs/callout.cjs +6 -6
  26. package/dist/lib/cjs/canvas.cjs +11 -9
  27. package/dist/lib/cjs/canvas.d.cts +13 -0
  28. package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
  29. package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
  30. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
  31. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
  32. package/dist/lib/cjs/codemirror/index.cjs +7 -7
  33. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
  34. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
  35. package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
  36. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
  37. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
  38. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
  39. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
  40. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
  41. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
  42. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
  43. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
  44. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
  45. package/dist/lib/cjs/command-handlers/index.cjs +15 -15
  46. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +95 -4
  47. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  48. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
  49. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
  50. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
  51. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
  52. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
  53. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
  54. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
  55. package/dist/lib/cjs/community-plugins.cjs +3 -3
  56. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
  57. package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
  58. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  59. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  60. package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
  61. package/dist/lib/cjs/components/async-events-component.cjs +1 -1
  62. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
  63. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
  64. package/dist/lib/cjs/components/component-ex.cjs +21 -11
  65. package/dist/lib/cjs/components/component-ex.d.cts +11 -0
  66. package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
  67. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
  68. package/dist/lib/cjs/components/disposable-component.cjs +2 -2
  69. package/dist/lib/cjs/components/embed-extensions-component.cjs +21 -4
  70. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  71. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +24 -10
  72. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  73. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
  74. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
  75. package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
  76. package/dist/lib/cjs/components/index.cjs +54 -39
  77. package/dist/lib/cjs/components/index.d.cts +5 -0
  78. package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
  79. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
  80. package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
  81. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
  82. package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
  83. package/dist/lib/cjs/components/plugin-gate-component.cjs +69 -36
  84. package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
  85. package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
  86. package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
  87. package/dist/lib/cjs/components/plugin-settings-component.cjs +119 -18
  88. package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
  89. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
  90. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
  91. package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
  92. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
  93. package/dist/lib/cjs/components/registry-component.cjs +2 -2
  94. package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
  95. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
  96. package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
  97. package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
  98. package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
  99. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  100. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  101. package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
  102. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
  103. package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
  104. package/dist/lib/cjs/components/worker-component.cjs +363 -0
  105. package/dist/lib/cjs/components/worker-component.d.cts +156 -0
  106. package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
  107. package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
  108. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  109. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  110. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
  111. package/dist/lib/cjs/constructors/index.cjs +1 -1
  112. package/dist/lib/cjs/css-class.cjs +5 -1
  113. package/dist/lib/cjs/css-class.d.cts +16 -0
  114. package/dist/lib/cjs/data-handler.cjs +264 -6
  115. package/dist/lib/cjs/data-handler.d.cts +219 -2
  116. package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
  117. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
  118. package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
  119. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
  120. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
  121. package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
  122. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
  123. package/dist/lib/cjs/data-stores/index.cjs +6 -6
  124. package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
  125. package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
  126. package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
  127. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
  128. package/dist/lib/cjs/dataview-link.cjs +2 -2
  129. package/dist/lib/cjs/dataview.cjs +27 -7
  130. package/dist/lib/cjs/dataview.d.cts +14 -0
  131. package/dist/lib/cjs/debug.cjs +3 -3
  132. package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
  133. package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
  134. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
  135. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
  136. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  137. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  138. package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
  139. package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
  140. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
  141. package/dist/lib/cjs/disposable.cjs +150 -0
  142. package/dist/lib/cjs/disposable.d.cts +39 -0
  143. package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
  144. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
  145. package/dist/lib/cjs/editor-suggest.cjs +1 -1
  146. package/dist/lib/cjs/editor.cjs +6 -6
  147. package/dist/lib/cjs/events.cjs +2 -2
  148. package/dist/lib/cjs/extensions-registrar.cjs +1 -1
  149. package/dist/lib/cjs/feature-request.cjs +1 -1
  150. package/dist/lib/cjs/file-change.cjs +10 -10
  151. package/dist/lib/cjs/file-explorer.cjs +2 -2
  152. package/dist/lib/cjs/file-manager.cjs +5 -5
  153. package/dist/lib/cjs/file-system.cjs +10 -10
  154. package/dist/lib/cjs/folder-note.cjs +4 -4
  155. package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
  156. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
  157. package/dist/lib/cjs/frontmatter.cjs +5 -5
  158. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  159. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  160. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  161. package/dist/lib/cjs/hotkey.cjs +1 -1
  162. package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
  163. package/dist/lib/cjs/html-element.cjs +2 -2
  164. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
  165. package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
  166. package/dist/lib/cjs/i18n/i18n.cjs +7 -7
  167. package/dist/lib/cjs/i18n/index.cjs +4 -4
  168. package/dist/lib/cjs/i18n/locales/en.cjs +27 -1
  169. package/dist/lib/cjs/i18n/locales/en.d.cts +26 -0
  170. package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
  171. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
  172. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +26 -0
  173. package/dist/lib/cjs/index.cjs +147 -126
  174. package/dist/lib/cjs/index.d.cts +7 -0
  175. package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
  176. package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
  177. package/dist/lib/cjs/library-styles.cjs +3 -3
  178. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
  179. package/dist/lib/cjs/link.cjs +76 -56
  180. package/dist/lib/cjs/link.d.cts +20 -14
  181. package/dist/lib/cjs/logger.cjs +4 -4
  182. package/dist/lib/cjs/loop.cjs +10 -16
  183. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
  184. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
  185. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
  186. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
  187. package/dist/lib/cjs/markdown-view.cjs +191 -3
  188. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  189. package/dist/lib/cjs/markdown.cjs +12 -12
  190. package/dist/lib/cjs/metadata-cache.cjs +23 -23
  191. package/dist/lib/cjs/metadata-cache.d.cts +5 -4
  192. package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
  193. package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
  194. package/dist/lib/cjs/mobile-app-info.cjs +1 -1
  195. package/dist/lib/cjs/modals/alert.cjs +4 -4
  196. package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
  197. package/dist/lib/cjs/modals/confirm.cjs +4 -4
  198. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  199. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  200. package/dist/lib/cjs/modals/index.cjs +17 -11
  201. package/dist/lib/cjs/modals/index.d.cts +2 -0
  202. package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
  203. package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
  204. package/dist/lib/cjs/modals/modal.cjs +3 -3
  205. package/dist/lib/cjs/modals/prompt.cjs +10 -10
  206. package/dist/lib/cjs/modals/prompt.d.cts +1 -1
  207. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  208. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  209. package/dist/lib/cjs/modals/select-item.cjs +6 -6
  210. package/dist/lib/cjs/modals/select-option.cjs +3 -3
  211. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  212. package/dist/lib/cjs/note-priority.cjs +2 -2
  213. package/dist/lib/cjs/notebook-navigator.cjs +12 -2
  214. package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
  215. package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
  216. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
  217. package/dist/lib/cjs/obsidian-settings.cjs +1 -1
  218. package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
  219. package/dist/lib/cjs/parse-link.cjs +14 -14
  220. package/dist/lib/cjs/path-compatibility.cjs +368 -0
  221. package/dist/lib/cjs/path-compatibility.d.cts +263 -0
  222. package/dist/lib/cjs/path-settings.cjs +3 -3
  223. package/dist/lib/cjs/pdf.cjs +2 -2
  224. package/dist/lib/cjs/plugin/index.cjs +18 -12
  225. package/dist/lib/cjs/plugin/index.d.cts +2 -0
  226. package/dist/lib/cjs/plugin/plugin-api.cjs +21 -12
  227. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  228. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
  229. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
  230. package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
  231. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
  232. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
  233. package/dist/lib/cjs/plugin/plugin-install-state.cjs +49 -4
  234. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  235. package/dist/lib/cjs/plugin/plugin-instance.cjs +450 -0
  236. package/dist/lib/cjs/plugin/plugin-instance.d.cts +258 -0
  237. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
  238. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
  239. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
  240. package/dist/lib/cjs/plugin/plugin.cjs +133 -34
  241. package/dist/lib/cjs/plugin/plugin.d.cts +35 -5
  242. package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
  243. package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
  244. package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
  245. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
  246. package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
  247. package/dist/lib/cjs/popovers/index.cjs +3 -3
  248. package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
  249. package/dist/lib/cjs/popovers/popover.cjs +5 -5
  250. package/dist/lib/cjs/queue.cjs +8 -8
  251. package/dist/lib/cjs/react/app-context.cjs +3 -3
  252. package/dist/lib/cjs/react/index.cjs +1 -1
  253. package/dist/lib/cjs/reference-definition.cjs +1 -1
  254. package/dist/lib/cjs/reference.cjs +3 -3
  255. package/dist/lib/cjs/release-asset.cjs +5 -5
  256. package/dist/lib/cjs/rendered-markdown.cjs +4 -4
  257. package/dist/lib/cjs/request-url.cjs +4 -4
  258. package/dist/lib/cjs/resource-lock.cjs +46 -42
  259. package/dist/lib/cjs/resource-lock.d.cts +8 -7
  260. package/dist/lib/cjs/resource-url.cjs +3 -3
  261. package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
  262. package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
  263. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
  264. package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
  265. package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
  266. package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
  267. package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
  268. package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
  269. package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
  270. package/dist/lib/cjs/setting-components/index.cjs +30 -30
  271. package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
  272. package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
  273. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
  274. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
  275. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
  276. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
  277. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
  278. package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
  279. package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
  280. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
  281. package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
  282. package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
  283. package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
  284. package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
  285. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
  286. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
  287. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
  288. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
  289. package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
  290. package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
  291. package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
  292. package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
  293. package/dist/lib/cjs/setting-ex.cjs +26 -26
  294. package/dist/lib/cjs/setting-group-ex.cjs +2 -2
  295. package/dist/lib/cjs/settings-recovery.cjs +217 -0
  296. package/dist/lib/cjs/settings-recovery.d.cts +178 -0
  297. package/dist/lib/cjs/settings-tabs.cjs +5 -5
  298. package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
  299. package/dist/lib/cjs/templater.cjs +14 -4
  300. package/dist/lib/cjs/templater.d.cts +6 -0
  301. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
  302. package/dist/lib/cjs/transformers/index.cjs +1 -1
  303. package/dist/lib/cjs/trusted-input.cjs +1 -1
  304. package/dist/lib/cjs/validation.cjs +4 -4
  305. package/dist/lib/cjs/vault-delete.cjs +6 -6
  306. package/dist/lib/cjs/vault-transaction.cjs +5 -5
  307. package/dist/lib/cjs/vault.cjs +12 -12
  308. package/dist/lib/cjs/view-registrar.cjs +1 -1
  309. package/dist/lib/cjs/virtual-file.cjs +16 -14
  310. package/dist/lib/cjs/virtual-file.d.cts +2 -1
  311. package/dist/lib/cjs/wasm.cjs +119 -0
  312. package/dist/lib/cjs/wasm.d.cts +54 -0
  313. package/dist/lib/cjs/worker-protocol.cjs +209 -0
  314. package/dist/lib/cjs/worker-protocol.d.cts +282 -0
  315. package/dist/lib/cjs/workspace.cjs +1 -1
  316. package/dist/lib/esm/__merged.d.mts +26 -10
  317. package/dist/lib/esm/__merged.mjs +215 -5
  318. package/dist/lib/esm/app.mjs +2 -2
  319. package/dist/lib/esm/attachment-path.d.mts +3 -3
  320. package/dist/lib/esm/attachment-path.mjs +2 -2
  321. package/dist/lib/esm/backlink-index.mjs +2 -2
  322. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  323. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  324. package/dist/lib/esm/bug-report.d.mts +65 -0
  325. package/dist/lib/esm/bug-report.mjs +33 -10
  326. package/dist/lib/esm/canvas.d.mts +13 -0
  327. package/dist/lib/esm/canvas.mjs +6 -5
  328. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
  329. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
  330. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
  331. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
  332. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  333. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  334. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  335. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  336. package/dist/lib/esm/components/component-ex.d.mts +11 -0
  337. package/dist/lib/esm/components/component-ex.mjs +19 -6
  338. package/dist/lib/esm/components/disposable-component.mjs +1 -1
  339. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  340. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  341. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  342. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  343. package/dist/lib/esm/components/index.d.mts +5 -0
  344. package/dist/lib/esm/components/index.mjs +12 -2
  345. package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
  346. package/dist/lib/esm/components/plugin-gate-component.mjs +61 -26
  347. package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
  348. package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
  349. package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
  350. package/dist/lib/esm/components/plugin-settings-component.mjs +105 -4
  351. package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
  352. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  353. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  354. package/dist/lib/esm/components/worker-component.d.mts +156 -0
  355. package/dist/lib/esm/components/worker-component.mjs +279 -0
  356. package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
  357. package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
  358. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  359. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  360. package/dist/lib/esm/css-class.d.mts +16 -0
  361. package/dist/lib/esm/css-class.mjs +5 -1
  362. package/dist/lib/esm/data-handler.d.mts +219 -2
  363. package/dist/lib/esm/data-handler.mjs +262 -5
  364. package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
  365. package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
  366. package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
  367. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
  368. package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
  369. package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
  370. package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
  371. package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
  372. package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
  373. package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
  374. package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
  375. package/dist/lib/esm/dataview.d.mts +14 -0
  376. package/dist/lib/esm/dataview.mjs +19 -1
  377. package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
  378. package/dist/lib/esm/demo-vault-helper.mjs +29 -1
  379. package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
  380. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  381. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  382. package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
  383. package/dist/lib/esm/disposable.d.mts +39 -0
  384. package/dist/lib/esm/disposable.mjs +64 -0
  385. package/dist/lib/esm/file-system.mjs +2 -2
  386. package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
  387. package/dist/lib/esm/generated-during-build.mjs +2 -2
  388. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  389. package/dist/lib/esm/git-rename-history.mjs +1 -1
  390. package/dist/lib/esm/i18n/locales/en.d.mts +26 -0
  391. package/dist/lib/esm/i18n/locales/en.mjs +27 -1
  392. package/dist/lib/esm/i18n/locales/translations-map.d.mts +26 -0
  393. package/dist/lib/esm/index.d.mts +7 -0
  394. package/dist/lib/esm/index.mjs +15 -1
  395. package/dist/lib/esm/link.d.mts +20 -14
  396. package/dist/lib/esm/link.mjs +57 -38
  397. package/dist/lib/esm/loop.mjs +2 -8
  398. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
  399. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
  400. package/dist/lib/esm/markdown-view.d.mts +48 -1
  401. package/dist/lib/esm/markdown-view.mjs +192 -2
  402. package/dist/lib/esm/metadata-cache.d.mts +5 -4
  403. package/dist/lib/esm/metadata-cache.mjs +6 -6
  404. package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
  405. package/dist/lib/esm/misplaced-attachment.mjs +212 -0
  406. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  407. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  408. package/dist/lib/esm/modals/index.d.mts +2 -0
  409. package/dist/lib/esm/modals/index.mjs +5 -1
  410. package/dist/lib/esm/modals/prompt.d.mts +1 -1
  411. package/dist/lib/esm/modals/prompt.mjs +1 -1
  412. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  413. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  414. package/dist/lib/esm/notebook-navigator.d.mts +6 -0
  415. package/dist/lib/esm/notebook-navigator.mjs +11 -2
  416. package/dist/lib/esm/parse-link.mjs +4 -4
  417. package/dist/lib/esm/path-compatibility.d.mts +263 -0
  418. package/dist/lib/esm/path-compatibility.mjs +277 -0
  419. package/dist/lib/esm/plugin/index.d.mts +2 -0
  420. package/dist/lib/esm/plugin/index.mjs +6 -2
  421. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  422. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  423. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
  424. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
  425. package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
  426. package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
  427. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
  428. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  429. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  430. package/dist/lib/esm/plugin/plugin-instance.d.mts +258 -0
  431. package/dist/lib/esm/plugin/plugin-instance.mjs +367 -0
  432. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
  433. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
  434. package/dist/lib/esm/plugin/plugin.d.mts +35 -5
  435. package/dist/lib/esm/plugin/plugin.mjs +118 -9
  436. package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
  437. package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
  438. package/dist/lib/esm/release-asset.mjs +1 -1
  439. package/dist/lib/esm/resource-lock.d.mts +8 -7
  440. package/dist/lib/esm/resource-lock.mjs +31 -26
  441. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
  442. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
  443. package/dist/lib/esm/settings-recovery.d.mts +178 -0
  444. package/dist/lib/esm/settings-recovery.mjs +125 -0
  445. package/dist/lib/esm/settings-tabs.mjs +2 -2
  446. package/dist/lib/esm/templater.d.mts +6 -0
  447. package/dist/lib/esm/templater.mjs +11 -2
  448. package/dist/lib/esm/vault.mjs +1 -1
  449. package/dist/lib/esm/virtual-file.d.mts +2 -1
  450. package/dist/lib/esm/virtual-file.mjs +7 -5
  451. package/dist/lib/esm/wasm.d.mts +54 -0
  452. package/dist/lib/esm/wasm.mjs +30 -0
  453. package/dist/lib/esm/worker-protocol.d.mts +282 -0
  454. package/dist/lib/esm/worker-protocol.mjs +113 -0
  455. package/dist/styles.css +16 -1
  456. package/modals/copy-text-manually/package.json +6 -0
  457. package/modals/review-bug-report-diagnostics/package.json +6 -0
  458. package/package.json +10 -8
  459. package/plugin/plugin-instance/package.json +6 -0
  460. package/plugin/third-party-plugin/package.json +6 -0
@@ -169,29 +169,29 @@ __export(rename_delete_handler_component_exports, {
169
169
  RenameDeleteHandlerComponent: () => RenameDeleteHandlerComponent
170
170
  });
171
171
  module.exports = __toCommonJS(rename_delete_handler_component_exports);
172
- var import_array = require('@mnaoumov/typescript-lib/array');
173
- var import_error = require('@mnaoumov/typescript-lib/error');
174
- var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
175
- var import_path = require('@mnaoumov/typescript-lib/path');
176
- var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
177
- var import_i18next = require('i18next');
178
- var import_obsidian = require('obsidian');
179
- var import_attachment_path = require('../attachment-path.cjs');
180
- var import_backlink_index = require('../backlink-index.cjs');
181
- var import_canvas = require('../canvas.cjs');
182
- var import_debug = require('../debug.cjs');
183
- var import_file_manager = require('../file-manager.cjs');
184
- var import_file_system = require('../file-system.cjs');
185
- var import_link = require('../link.cjs');
186
- var import_metadata_cache = require('../metadata-cache.cjs');
187
- var import_obsidian_lib_state = require('../obsidian-lib-state.cjs');
188
- var import_queue = require('../queue.cjs');
189
- var import_resource_lock = require('../resource-lock.cjs');
190
- var import_vault_delete = require('../vault-delete.cjs');
191
- var import_vault = require('../vault.cjs');
192
- var import_component_ex = require('./component-ex.cjs');
193
- var import_monkey_around_component = require('./monkey-around-component.cjs');
194
- var import_vault2 = require('../vault.cjs');
172
+ var import_array = require("@mnaoumov/typescript-lib/array");
173
+ var import_error = require("@mnaoumov/typescript-lib/error");
174
+ var import_object_utils = require("@mnaoumov/typescript-lib/object-utils");
175
+ var import_path = require("@mnaoumov/typescript-lib/path");
176
+ var import_implementations = require("@obsidian-typings/obsidian-public-latest/implementations");
177
+ var import_i18next = require("i18next");
178
+ var import_obsidian = require("obsidian");
179
+ var import_attachment_path = require("../attachment-path.cjs");
180
+ var import_backlink_index = require("../backlink-index.cjs");
181
+ var import_canvas = require("../canvas.cjs");
182
+ var import_debug = require("../debug.cjs");
183
+ var import_file_manager = require("../file-manager.cjs");
184
+ var import_file_system = require("../file-system.cjs");
185
+ var import_link = require("../link.cjs");
186
+ var import_metadata_cache = require("../metadata-cache.cjs");
187
+ var import_obsidian_lib_state = require("../obsidian-lib-state.cjs");
188
+ var import_queue = require("../queue.cjs");
189
+ var import_resource_lock = require("../resource-lock.cjs");
190
+ var import_vault_delete = require("../vault-delete.cjs");
191
+ var import_vault = require("../vault.cjs");
192
+ var import_component_ex = require("./component-ex.cjs");
193
+ var import_monkey_around_component = require("./monkey-around-component.cjs");
194
+ var import_vault2 = require("../vault.cjs");
195
195
  const PATCH_TOKEN = /* @__PURE__ */ Symbol.for("renameDeleteHandler");
196
196
  class DeleteHandler {
197
197
  abortSignal;
@@ -1080,7 +1080,7 @@ class RenameMap {
1080
1080
  }
1081
1081
  }
1082
1082
  get(oldPath) {
1083
- return this.map.get(oldPath);
1083
+ return this.map.get(oldPath) ?? null;
1084
1084
  }
1085
1085
  initBacklinksMap(params) {
1086
1086
  const {
@@ -1363,4 +1363,4 @@ function restoreProperty($object, key, descriptor) {
1363
1363
  EmptyFolderBehavior,
1364
1364
  RenameDeleteHandlerComponent
1365
1365
  });
1366
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIH0gZnJvbSAnLi4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMsXG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZVJlZmVyZW5jZXNJbkZpbGVQYXJhbXNcbn0gZnJvbSAnLi4vbGluay50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zIH0gZnJvbSAnLi4vdmF1bHQtZGVsZXRlLnRzJztcbmltcG9ydCB0eXBlIHsgQWJvcnRTaWduYWxDb21wb25lbnQgfSBmcm9tICcuL2Fib3J0LXNpZ25hbC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHtcbiAgQXR0YWNobWVudFBhdGhDb250ZXh0LFxuICBnZXRBdHRhY2htZW50RmlsZVBhdGgsXG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4uL2F0dGFjaG1lbnQtcGF0aC50cyc7XG5pbXBvcnQgeyBpdGVyYXRlUmVmZXJlbmNlc0FmZmVjdGVkQnlSZW5hbWUgfSBmcm9tICcuLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQgeyBnZXRDYW52YXNSZWZlcmVuY2VzIH0gZnJvbSAnLi4vY2FudmFzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzRmlsZSxcbiAgaXNGb2xkZXIsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCYWNrbGlua3NTbmFwc2hvdCxcbiAgZWRpdEJhY2tsaW5rc1NuYXBzaG90LFxuICBleHRyYWN0UmVmZXJlbmNlRmlsZSxcbiAgdXBkYXRlTGluayxcbiAgdXBkYXRlUmVmZXJlbmNlc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRSZWZlcmVuY2VzLFxuICBoYXNCYWNrbGlua0NhY2hlUGx1Z2luLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tbGliLXN0YXRlLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgaXNDaGlsZE9yU2VsZixcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVzY3VlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudCB0aGF0IGlzIGFib3V0IHRvIGJlIHN0cmFuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSB0aGUgYXR0YWNobWVudCBvbmNlIHRoZSBkZWxldGlvbiBpcyBkb25lLiBOZXZlciBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHN1cnZpdmluZ05vdGVQYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICByZWFkb25seSBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBtb3ZlIGFuIGF0dGFjaG1lbnQgdGhhdCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQg4oCUIG9uZSB0aGF0IHN1cnZpdmVzIGJlY2F1c2UgYW5vdGhlclxuICAgKiBub3RlIHN0aWxsIHJlZmVyZW5jZXMgaXQsIGJ1dCBpcyBsZWZ0IHNpdHRpbmcgaW4gYSBmb2xkZXIgd2hvc2Ugb3duaW5nIG5vdGUgaXMgZ29uZS5cbiAgICpcbiAgICogRGVjaWRpbmcgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBwbHVnaW4ncyBhdHRhY2htZW50LXBhdGggcG9saWN5LCB3aGljaCBpcyB3aHkgdGhlIGhhbmRsZXIgYXNrcyByYXRoZXJcbiAgICogdGhhbiBndWVzc2VzLiBSZXR1cm5pbmcgYG51bGxgIOKAlCBvciBub3QgaW1wbGVtZW50aW5nIHRoaXMgYXQgYWxsIOKAlCBrZWVwcyB0aGUgYXR0YWNobWVudCB3aGVyZSBpdCBpcyxcbiAgICogd2hpY2ggaXMgdGhlIGJlaGF2aW9yIGV2ZXJ5IGNvbnN1bWVyIGhhZCBiZWZvcmUgdGhpcyBtZW1iZXIgZXhpc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdldFJlc2N1ZVBhdGg/OiAocGFyYW1zOiBHZXRSZXNjdWVQYXRoUGFyYW1zKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzTm90ZTogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICByZWFkb25seSBpc1BhdGhJZ25vcmVkOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBIYW5kbGVkUmVuYW1lS2V5IHtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcnJ1cHRlZFJlbmFtZSB7XG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21iaW5lZCBiYWNrbGlua3MgbWFwLCBrZXllZCBieSBuZXcgYmFja2xpbmsgcGF0aCwgYWNjdW11bGF0aW5nIGxpbmstSlNPTiB0byBzb3VyY2UtcGF0aCBtYXBwaW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggd2hvc2UgYmFja2xpbmtzIGFyZSBiZWluZyByZWNvcmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhY2tsaW5rcyBtYXAgZm9yIGEgc2luZ2xlIGZpbGUsIGtleWVkIGJ5IGJhY2tsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbn1cblxuY29uc3QgUEFUQ0hfVE9LRU4gPSBTeW1ib2wuZm9yKCdyZW5hbWVEZWxldGVIYW5kbGVyJyk7XG5cbmludGVyZmFjZSBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50UGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXM7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUGVuZGluZ1JlbmFtZSB7XG4gIHJlYWRvbmx5IGZpbGU6IFRGaWxlO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj86IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcbn1cblxuY2xhc3MgRGVsZXRlSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7dGhpcy5maWxlLnBhdGh9YCk7XG4gICAgaWYgKCFpc05vdGUodGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoXG4gICAgICAgIGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgZmlsZSBzdGlsbCBleGlzdHMgb24gZGlzayAoaW5kZXgtb25seSByZW1vdmFsLCBub3QgYSByZWFsIGRlbGV0aW9uKS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFtkaXJuYW1lKHRoaXMuZmlsZS5wYXRoKV0pO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldCh0aGlzLmZpbGUucGF0aCk7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmRlbGV0ZSh0aGlzLmZpbGUucGF0aCk7XG4gICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IGdldFJlZmVyZW5jZXMoeyBjYWNoZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0UmVmZXJlbmNlRmlsZSh7IGFwcDogdGhpcy5hcHAsIHJlZmVyZW5jZSwgc291cmNlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGggfSk7XG4gICAgICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSB8fCB0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChhdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGF0dGFjaG1lbnRGaWxlLnBhcmVudD8ucGF0aCA/PyAnJyk7XG4gICAgICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBkZWxldGVkTm90ZVBhdGg6IHRoaXMuZmlsZS5wYXRoLFxuICAgICAgICAgICAgcGF0aE9yRmlsZTogYXR0YWNobWVudEZpbGUsXG4gICAgICAgICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyZW50Rm9sZGVyUGF0aHMuZGVsZXRlKCcnKTtcbiAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCxcbiAgICAgIGZvbGRlclBhdGhzOiBbLi4ucGFyZW50Rm9sZGVyUGF0aHNdXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aFxuICAgIH0pO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IGF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKFxuICAgICAgIWF0dGFjaG1lbnRGb2xkZXIgfHwgIWF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5maWxlLnBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBkZWxldGVkTm90ZVBhdGg6IHRoaXMuZmlsZS5wYXRoLFxuICAgICAgcGF0aE9yRmlsZTogYXR0YWNobWVudEZvbGRlcixcbiAgICAgIHJlc2N1ZVN0aWxsVXNlZEZpbGU6IHRoaXMucmVzY3VlU3RpbGxVc2VkRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBcbiAgICB9KTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2N1ZVN0aWxsVXNlZEZpbGUocmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNjdWVQYXJhbXMsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBLZWVwcyBhIGZvbGRlciBkZWxldGlvbiBmcm9tIGRlc3Ryb3lpbmcgYW4gYXR0YWNobWVudCBhIG5vdGUgb3V0c2lkZSB0aGF0IGZvbGRlciBzdGlsbCByZWZlcmVuY2VzLlxuICpcbiAqIERlbGV0aW5nIGEgTk9URSBpcyBhbHJlYWR5IHNhZmU6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGRpc2NvdW50cyB0aGUgZGVsZXRlZCBub3RlJ3Mgb3duIGJhY2tsaW5rcywgc2Vlc1xuICogYW5vdGhlciBub3RlIHN0aWxsIHJlZmVyZW5jaW5nIHRoZSBhdHRhY2htZW50LCBhbmQga2VlcHMgaXQuIERlbGV0aW5nIGEgRk9MREVSIHdhcyBub3QsIGJlY2F1c2VcbiAqIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50fSBvbmx5IGxpc3RlbnMgKGB2YXVsdC5vbignZGVsZXRlJylgKSBhbmQgYnkgdGhlIHRpbWUgYSBmb2xkZXIgZGVsZXRpb25cbiAqIGlzIHJlcG9ydGVkIGl0cyBjaGlsZHJlbiBhcmUgYWxyZWFkeSBnb25lLiBOb3RoaW5nIHJlYWN0aXZlIGNhbiBoZWxwLCBzbyB0aGlzIGNvbXBvbmVudCBpbnRlcmNlcHRzIHRoZVxuICogZGVsZXRpb24gcHJpbWl0aXZlcyBpbnN0ZWFkOiBgRmlsZU1hbmFnZXIudHJhc2hGaWxlYCAod2hhdCB0aGUgZmlsZS1leHBsb3JlciBEZWxldGUgZmxvdyByZWFjaGVzIHRocm91Z2hcbiAqIGBwcm9tcHRGb3JEZWxldGlvbmApIHBsdXMgdGhlIHJhdyBgVmF1bHQuZGVsZXRlYCAvIGBWYXVsdC50cmFzaGAgYSBwbHVnaW4gbWF5IGNhbGwgZGlyZWN0bHkuXG4gKlxuICogQSBmb2xkZXIgZGVsZXRpb24gaXMgc2Nhbm5lZCBmaXJzdC4gV2hlbiBub3RoaW5nIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZSDigJQgdGhlXG4gKiBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgb2YgZGVsZXRpb25zIOKAlCB0aGUgb3JpZ2luYWwgcnVucyB1bnRvdWNoZWQsIHNvIHRoZSBuYXRpdmUgYmVoYXZpb3IgaXMgcHJlc2VydmVkXG4gKiBleGFjdGx5LiBPbmx5IHdoZW4gc29tZXRoaW5nIHdvdWxkIGJlIGxvc3QgZG9lcyB0aGlzIHRha2Ugb3ZlciwgcmVwbGF5aW5nIHRoZSBkZWxldGlvbiB0aHJvdWdoXG4gKiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfTogZXZlcnl0aGluZyBlbHNlIGluIHRoZSBmb2xkZXIgZ29lcywgdGhlIHN0aWxsLXJlZmVyZW5jZWQgYXR0YWNobWVudHMgYW5kIHRoZVxuICogZm9sZGVycyBob2xkaW5nIHRoZW0gc3RheSwgYW5kIHRoZSBgYXR0YWNobWVudElzU3RpbGxVc2VkYCBub3RpY2UgZmlyZXMsIG1pcnJvcmluZyB0aGUgbm90ZSBjYXNlLlxuICpcbiAqIEZpbGVzIGFyZSBuZXZlciBpbnRlcmNlcHRlZCDigJQgZGVsZXRpbmcgYSBmaWxlIGlzIHRoZSB1c2VyIG5hbWluZyB0aGF0IGZpbGUgZXhwbGljaXRseS5cbiAqL1xuY2xhc3MgRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUm9vdHMgb2YgdGhlIGZvbGRlciBkZWxldGlvbnMgY3VycmVudGx5IGJlaW5nIHJlcGxheWVkLiBUaGUgcmVwbGF5IGRlbGV0ZXMgdGhyb3VnaCB0aGUgVU5QQVRDSEVEXG4gICAqIG9yaWdpbmFsLCBzbyBpdCBjYW5ub3QgcmUtZW50ZXIgdGhpcyBjb21wb25lbnQgZGlyZWN0bHkg4oCUIGJ1dCBgRmlsZU1hbmFnZXIudHJhc2hGaWxlYCBpdHNlbGYgY2FsbHMgZG93blxuICAgKiBpbnRvIGBWYXVsdC50cmFzaGAgLyBgVmF1bHQuZGVsZXRlYCwgd2hpY2ggYXJlIHBhdGNoZWQgdG9vLCBhbmQgcmUtc2Nhbm5pbmcgYSBzdWJ0cmVlIGFscmVhZHkgYmVpbmdcbiAgICogd2Fsa2VkIGlzIHB1cmUgd2FzdGUuIFNjb3BlZCBieSBwYXRoIHJhdGhlciB0aGFuIGJ5IGEgZmxhZyBzbyB0aGF0IGFuIHVucmVsYXRlZCBmb2xkZXIgZGVsZXRpb25cbiAgICogaW50ZXJsZWF2aW5nIG9uIGFuIGBhd2FpdGAgaXMgc3RpbGwgcHJvdGVjdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXBsYXllZEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3RyYXNoRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaEZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBmb3JjZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlLCBmb3JjZSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBzeXN0ZW1dLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgc3lzdGVtKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgcGF0aHMgb2YgZXZlcnkgbm90ZSBpbnNpZGUgdGhlIGZvbGRlci4gVGhleSBhcmUgdGhlIGxpbmsgc291cmNlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoXG4gICAqIHRoZSBmb2xkZXIsIHNvIHRoZWlyIGJhY2tsaW5rcyBtdXN0IG5vdCBrZWVwIGFuIGF0dGFjaG1lbnQgYWxpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBub3RlcyBpbnNpZGUgdGhlIGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyOiBURm9sZGVyLCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IGRlbGV0ZWROb3RlUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUoY2hpbGQpICYmIChzZXR0aW5ncy5pc05vdGU/LihjaGlsZC5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgICAgZGVsZXRlZE5vdGVQYXRocy5hZGQoY2hpbGQucGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbGV0ZWROb3RlUGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGF0dGFjaG1lbnRzIGluc2lkZSB0aGUgZm9sZGVyIHRoYXQgYSBub3RlIG91dHNpZGUgaXQgc3RpbGwgcmVmZXJlbmNlcywgYW5kIHdvdWxkIHRoZXJlZm9yZSBiZVxuICAgKiBkZXN0cm95ZWQgYnkgZGVsZXRpbmcgdGhlIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGRlbGV0ZWROb3RlUGF0aHMgLSBUaGUgcGF0aHMgb2YgdGhlIG5vdGVzIHRoYXQgZGlzYXBwZWFyIGFsb25nIHdpdGggdGhlIGZvbGRlci5cbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aHMgb2YgdGhlIGF0dGFjaG1lbnRzIHRoYXQgbXVzdCBzdXJ2aXZlIHRoZSBkZWxldGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZFN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyhcbiAgICBmb2xkZXI6IFRGb2xkZXIsXG4gICAgZGVsZXRlZE5vdGVQYXRoczogU2V0PHN0cmluZz4sXG4gICAgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPlxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgY2FuZGlkYXRlRmlsZXM6IFRGaWxlW10gPSBbXTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUoY2hpbGQpICYmICEoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGNhbmRpZGF0ZUZpbGVzLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVGaWxlIG9mIGNhbmRpZGF0ZUZpbGVzKSB7XG4gICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGNhbmRpZGF0ZUZpbGUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGRlbGV0ZWROb3RlUGF0aCBvZiBkZWxldGVkTm90ZVBhdGhzKSB7XG4gICAgICAgIGJhY2tsaW5rcy5jbGVhcihkZWxldGVkTm90ZVBhdGgpO1xuICAgICAgfVxuICAgICAgaWYgKGJhY2tsaW5rcy5jb3VudCgpICE9PSAwKSB7XG4gICAgICAgIHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5wdXNoKGNhbmRpZGF0ZUZpbGUucGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZWxldGlvbiBuZWVkcyBwcm90ZWN0aW5nIGFuZCwgaWYgc28sIHJlcGxhY2VzIGl0IHdpdGggYSBwcm90ZWN0ZWQgcmVwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIEludm9rZXMgdGhlIGludGVyY2VwdGVkIG1ldGhvZCB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSBkZWxldGVBYnN0cmFjdEZpbGUgLSBEZWxldGVzIGEgc2luZ2xlIGFic3RyYWN0IGZpbGUgdGhyb3VnaCB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kJ3MgdW5wYXRjaGVkIG9yaWdpbmFsLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlbGV0aW9uIGlzIGRvbmUuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURlbGV0aW9uKFxuICAgIGZpbGU6IFRBYnN0cmFjdEZpbGUsXG4gICAgZmFsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZGVsZXRlQWJzdHJhY3RGaWxlOiAoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNob3VsZENvbnNpZGVyRm9sZGVyKGZpbGUpID8gdGhpcy5yZXBsYXlGb2xkZXJEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgZGVsZXRlQWJzdHJhY3RGaWxlKSA6IGZhbGxiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZm9sZGVyIHdoaWxlIGtlZXBpbmcgd2hhdGV2ZXIgaW5zaWRlIGl0IGlzIHN0aWxsIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXBsYXlGb2xkZXJEZWxldGlvbihcbiAgICBmb2xkZXI6IFRGb2xkZXIsXG4gICAgZmFsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZGVsZXRlQWJzdHJhY3RGaWxlOiAoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gdGhpcy5jb2xsZWN0RGVsZXRlZE5vdGVQYXRocyhmb2xkZXIsIHNldHRpbmdzKTtcbiAgICBjb25zdCBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMgPSBhd2FpdCB0aGlzLmZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoZm9sZGVyLCBkZWxldGVkTm90ZVBhdGhzLCBzZXR0aW5ncyk7XG5cbiAgICBpZiAoc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkZWxldGVQcm90ZWN0aW9uJykoYE5vdGhpbmcgdG8gcHJvdGVjdCBpbiAke2ZvbGRlci5wYXRofTsgZGVsZXRpbmcgaXQgYXMgdXN1YWwuYCk7XG4gICAgICBhd2FpdCBmYWxsYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKFxuICAgICAgYFByb3RlY3RpbmcgJHtzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMubGVuZ3RoLnRvU3RyaW5nKCl9IHN0aWxsLXJlZmVyZW5jZWQgYXR0YWNobWVudChzKSBmcm9tIHRoZSBkZWxldGlvbiBvZiAke2ZvbGRlci5wYXRofTogJHt0b0pzb24oc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKX1gXG4gICAgKTtcblxuICAgIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocy5hZGQoZm9sZGVyLnBhdGgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBkZWxldGVBYnN0cmFjdEZpbGUsXG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHM6IFsuLi5kZWxldGVkTm90ZVBhdGhzXSxcbiAgICAgICAgcGF0aE9yRmlsZTogZm9sZGVyLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHVzZXIgbmFtZWQgVEhJUyBmb2xkZXIsIHNvIGl0IGdvZXMgZXZlbiB1bmRlciBgRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwYCDigJQgdGhhdCBzZXR0aW5nXG4gICAgICAgICAqIGdvdmVybnMgZm9sZGVycyBlbXB0aWVkIGluY2lkZW50YWxseSwgbm90IHRoZSBvbmUgZXhwbGljaXRseSBkZWxldGVkLiBgZGVsZXRlSWZOb3RVc2VkYCBzdGlsbFxuICAgICAgICAgKiByZWZ1c2VzIHRvIHJlbW92ZSBhbnkgZm9sZGVyIHdob3NlIGNoaWxkIGhhZCB0byBiZSBrZXB0LCB3aGljaCBpcyB0aGUgcHJvdGVjdGlvbiB3YW50ZWQgaGVyZS5cbiAgICAgICAgICovXG4gICAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogdHJ1ZSxcbiAgICAgICAgLypcbiAgICAgICAgICogQSBub3RlIHRoYXQgb3RoZXJzIGxpbmsgdG8gaXMgZGVsZXRlZCBhcyBub3JtYWw7IE9ic2lkaWFuIGxlYXZlcyB0aGUgZGFuZ2xpbmcgbGluay4gUHJvdGVjdGluZ1xuICAgICAgICAgKiBub3RlcyB0b28gd291bGQgbWFrZSBkZWxldGluZyBhIGZvbGRlciBvZiBsaW5rZWQtdG8gbm90ZXMgaW1wb3NzaWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHNob3VsZFByb3RlY3RJZlN0aWxsVXNlZDogKGNhbmRpZGF0ZUZpbGUpID0+ICEoc2V0dGluZ3MuaXNOb3RlPy4oY2FuZGlkYXRlRmlsZS5wYXRoKSA/PyBmYWxzZSlcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuZGVsZXRlKGZvbGRlci5wYXRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2N1ZVN0aWxsVXNlZEZpbGUocmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNjdWVQYXJhbXMsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBkZWxldGlvbiBpcyBhIGZvbGRlciBkZWxldGlvbiB0aGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3RlY3RpbmcuXG4gICAqXG4gICAqIEV2ZXJ5IGNoZWNrIGhlcmUgaXMgc3luY2hyb25vdXMgYW5kIGNoZWFwLCBzbyBhIGZpbGUgZGVsZXRpb24g4oCUIHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHkg4oCUIGNvc3RzIG9uZVxuICAgKiB7QGxpbmsgaXNGb2xkZXJ9IGNhbGwgYW5kIHJlYWNoZXMgdGhlIG9yaWdpbmFsIHVudG91Y2hlZC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGVsZXRpb24gc2hvdWxkIGJlIHNjYW5uZWQgYmVmb3JlIGl0IHJ1bnMuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZENvbnNpZGVyRm9sZGVyKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiBmaWxlIGlzIFRGb2xkZXIge1xuICAgIGlmICghaXNGb2xkZXIoZmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgfHwgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihmaWxlLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVwbGF5ZWRGb2xkZXJQYXRoIG9mIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocykge1xuICAgICAgaWYgKGlzQ2hpbGRPclNlbGYoeyBhcHA6IHRoaXMuYXBwLCBjaGlsZFBhdGhPckZpbGU6IGZpbGUucGF0aCwgcGFyZW50UGF0aE9yRmlsZTogcmVwbGF5ZWRGb2xkZXJQYXRoIH0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5jbGFzcyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSByZW5hbWUgd2hvc2UgYHJ1bkFzeW5jTGlua1VwZGF0ZWAgc25hcHNob3QgaXMgYWJvdXQgdG8gYmUgdGFrZW46IHNldCB3aGVuIE9ic2lkaWFuJ3MgYG9uQ2xlYW5DYWNoZWBcbiAgICogY2FsbGJhY2sgZm9yIHRoYXQgc25hcHNob3QgZmlyZXMsIGNvbnN1bWVkIGJ5IHRoZSB2ZXJ5IG5leHQgYGl0ZXJhdGVBbGxSZWZzYCBjYWxsLCB3aGljaCBpcyB0aGUgc25hcHNob3QuXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVNuYXBzaG90UmVuYW1lOiBudWxsIHwgUGVuZGluZ1JlbmFtZSA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICAvKipcbiAgICogVGhlIHJlbmFtZSBgZmlsZU1hbmFnZXIucmVuYW1lRmlsZWAgaXMgcGVyZm9ybWluZywgcmVjb3JkZWQgZm9yIHRoZSBgcnVuQXN5bmNMaW5rVXBkYXRlYCBjYWxsIGl0IG1ha2VzXG4gICAqIHN5bmNocm9ub3VzbHksIHdoaWNoIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGNhbm5vdCBvdGhlcndpc2UgdGVsbCB3aGF0IGlzIGJlaW5nIHJlbmFtZWQuXG4gICAqL1xuICBwcml2YXRlIHBlbmRpbmdSZW5hbWU6IG51bGwgfCBQZW5kaW5nUmVuYW1lID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGVNYW5hZ2VyID0gcGFyYW1zLmZpbGVNYW5hZ2VyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IHRoaXMuZmlsZU1hbmFnZXIsXG4gICAgICBtZXRob2ROYW1lOiAncnVuQXN5bmNMaW5rVXBkYXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHtcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIG9yaWdpbmFsQXJndW1lbnRzOiBbbGlua1VwZGF0ZXNIYW5kbGVyXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyID0gKGxpbmtVcGRhdGVzKSA9PiB0aGlzLndyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMsIGxpbmtVcGRhdGVzSGFuZGxlcik7XG4gICAgICAgIGNvbnN0IHJlbmFtZSA9IHRoaXMucGVuZGluZ1JlbmFtZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVuYW1lID0gbnVsbDtcbiAgICAgICAgLy8gV2l0aCBgaW5Qcm9ncmVzc1VwZGF0ZXNgIHNldCwgT2JzaWRpYW4gcXVldWVzIHRoZSBoYW5kbGVyIG9udG8gdGhlIHJ1bm5pbmcgdXBkYXRlIGFuZCB0YWtlcyBubyBzbmFwc2hvdC5cbiAgICAgICAgcmV0dXJuICFyZW5hbWUgfHwgdGhpcy5maWxlTWFuYWdlci5pblByb2dyZXNzVXBkYXRlcyA/IG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcikgOiB0aGlzLndpdGhOYXJyb3dlZFNuYXBzaG90KHJlbmFtZSwgKCkgPT4gb3JpZ2luYWxNZXRob2RCb3VuZChuZXdIYW5kbGVyKSk7XG4gICAgICB9LFxuICAgICAgLypcbiAgICAgICAqIFN1cHByZXNzaW5nIE9ic2lkaWFuJ3Mgb3duIGxpbmsgdXBkYXRlcyBpcyBOT1QgaWRlbXBvdGVudCwgc28gdHdvIGxpdmUgY29waWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgKiB3b3VsZCBmaWdodCBvdmVyIHRoZSBzYW1lIG1ldGhvZC4gYFBBVENIX1RPS0VOYCBpcyBhIGBTeW1ib2wuZm9yYCBhbmQgdGhlIHRva2VuIHJlZ2lzdHJ5IGlzXG4gICAgICAgKiBgZ2V0T2JzaWRpYW5MaWJTdGF0ZWAtYmFja2VkLCBzbyB0aGUgYXJiaXRyYXRpb24gc3BhbnMgaW5kZXBlbmRlbnRseSBidW5kbGVkIGNvcGllcyBvZiB0aGlzXG4gICAgICAgKiBsaWJyYXJ5OiB0aGUgZmlyc3QgcGF0Y2hlciBzdGF5cyBsaXZlLCBhIGNvcHkgdGhhdCBwYXRjaGVzIGFmdGVyd2FyZHMgc2VlcyB0aGUgdG9rZW4gb24gaXRzIG93blxuICAgICAgICogYG9yaWdpbmFsTWV0aG9kYCBhbmQgZGVmZXJzIHZpYSB0aGUgZ3VhcmQgYWJvdmUsIGFuZCBpdCB0YWtlcyBvdmVyIG9uIGl0cyBuZXh0IGNhbGwgb25jZSB0aGVcbiAgICAgICAqIGxlYWRlciB1bmxvYWRzIGFuZCB0aGUgdG9rZW4gaXMgZHJvcHBlZC5cbiAgICAgICAqXG4gICAgICAgKiBUaGlzIGFyYml0cmF0ZXMgdGhlIFBBVENIIG9ubHkuIFRoZSBjb21wb25lbnQncyBgdmF1bHQub24oJ3JlbmFtZScgfCAnZGVsZXRlJylgIGFuZFxuICAgICAgICogYG1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnKWAgbGlzdGVuZXJzIGhhdmUgbm8gZXF1aXZhbGVudCBndWFyZCDigJQgdGhlIHBsdWdpbi1yZWdpc3RyeSBlbGVjdGlvblxuICAgICAgICogdGhhdCB1c2VkIHRvIHByb3ZpZGUgb25lIHdlbnQgd2l0aCB0aGUgbXVsdGktcGx1Z2luIG1hY2hpbmVyeSDigJQgc28gdHdvIGxpdmUgY29waWVzIHdvdWxkIGJvdGhcbiAgICAgICAqIGhhbmRsZSBhbiBldmVudC4gV2l0aCBvbmUgb3duZXIgdGhhdCBjYW5ub3QgYXJpc2U7IGEgY29uc3VtZXIgdGhhdCBtdXN0IGd1YXJhbnRlZSBpdCByZWZ1c2VzIHRvXG4gICAgICAgKiBsb2FkIGJlc2lkZSBhIGNvbmZsaWN0aW5nIHZlcnNpb24uXG4gICAgICAgKlxuICAgICAgICogVGhhdCByZWZ1c2FsIHVzZWQgdG8gYmUgZGVzY3JpYmVkIGhlcmUgYXMgXCJhIHBsdWdpbidzIGpvYiByYXRoZXIgdGhhbiBhIGxpYnJhcnknc1wiLCB3aGljaCBpcyBub1xuICAgICAgICogbG9uZ2VyIHRydWUg4oCUIGBQbHVnaW5CYXNlLmdldFBsdWdpbkRlcGVuZGVuY2llc2AgaXMgd2hlcmUgYSBjb25zdW1lciBkZWNsYXJlcyBpdCwgYW5kIHRoZVxuICAgICAgICogYGFwaVZlcnNpb25SYW5nZWAgaXQgbmFtZXMgaXMgZXhhY3RseSB0aGUgY29uZmxpY3RpbmctdmVyc2lvbiBndWFyZC4gVGhlIGxpYnJhcnkgb3ducyB0aGVcbiAgICAgICAqIG1lY2hhbmlzbTsgdGhlIHBsdWdpbiBzdGlsbCBvd25zIHRoZSBkZWNpc2lvbiB0byB1c2UgaXQuXG4gICAgICAgKi9cbiAgICAgIHBhdGNoVG9rZW46IFBBVENIX1RPS0VOXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWVGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHtcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgbmV3UGF0aF0sXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZEJvdW5kXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmIChoYXNQYXRjaFRva2VuKG9yaWdpbmFsTWV0aG9kLCBQQVRDSF9UT0tFTikgfHwgIWlzRmlsZShmaWxlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYHJlbmFtZUZpbGVgIGNhbGxzIGBydW5Bc3luY0xpbmtVcGRhdGVgIHN5bmNocm9ub3VzbHksIHdoaWNoIHBpY2tzIHRoaXMgdXAgYW5kIGNsZWFycyBpdC5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVuYW1lID0geyBmaWxlLCBuZXdQYXRoIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQoZmlsZSwgbmV3UGF0aCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVuYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBhdGNoVG9rZW46IFBBVENIX1RPS0VOXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5hcHAubWV0YWRhdGFDYWNoZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdpdGVyYXRlQWxsUmVmcycsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7XG4gICAgICAgIGZhbGxiYWNrLFxuICAgICAgICBvcmlnaW5hbEFyZ3VtZW50czogW2NhbGxiYWNrXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RcbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3QgcmVuYW1lID0gdGhpcy5hY3RpdmVTbmFwc2hvdFJlbmFtZTtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSB8fCAhcmVuYW1lKSB7XG4gICAgICAgICAgZmFsbGJhY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZVNuYXBzaG90UmVuYW1lID0gbnVsbDtcbiAgICAgICAgaXRlcmF0ZVJlZmVyZW5jZXNBZmZlY3RlZEJ5UmVuYW1lKHRoaXMuYXBwLCByZW5hbWUuZmlsZSwgcmVuYW1lLm5ld1BhdGgsIGNhbGxiYWNrKTtcbiAgICAgIH0sXG4gICAgICBwYXRjaFRva2VuOiBQQVRDSF9UT0tFTlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYHJ1bkFzeW5jTGlua1VwZGF0ZWAgc28gdGhhdCBpdHMgc25hcHNob3Qgb2YgcmVzb2x2ZWQgcmVmZXJlbmNlcyBjb3ZlcnMgb25seSB0aGUgcmVmZXJlbmNlcyB0aGUgcmVuYW1lXG4gICAqIGNhbiBhZmZlY3QgKHtAbGluayBpdGVyYXRlUmVmZXJlbmNlc0FmZmVjdGVkQnlSZW5hbWV9KSBpbnN0ZWFkIG9mIGV2ZXJ5IHJlZmVyZW5jZSBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIE9ic2lkaWFuJ3MgYHJ1bkFzeW5jTGlua1VwZGF0ZWAgcXVldWVzIGEgdGFzayBvbiBgZmlsZU1hbmFnZXIudXBkYXRlUXVldWVgLiBUaGUgdGFzayB3YWl0cyBmb3JcbiAgICogYG1ldGFkYXRhQ2FjaGUub25DbGVhbkNhY2hlYCwgdGhlbiBjYWxscyBgbWV0YWRhdGFDYWNoZS5pdGVyYXRlQWxsUmVmc2Agb25jZSB0byB0YWtlIHRoZSBzbmFwc2hvdCwgdGhlbiBydW5zIHRoZVxuICAgKiBoYW5kbGVyIHRoYXQgcmVuYW1lcy4gVGhlIHF1ZXVlZCB0YXNrIGlzIHdyYXBwZWQgc28gdGhhdCB0aGUgYG9uQ2xlYW5DYWNoZWAgY2FsbGJhY2sgaXQgcmVnaXN0ZXJzLCBhbmQgb25seVxuICAgKiB0aGF0IG9uZSwgYXJtcyB0aGUgbmFycm93aW5nLCB3aGljaCB0aGUgYGl0ZXJhdGVBbGxSZWZzYCBwYXRjaCBjb25zdW1lcyBvbiB0aGUgbmV4dCBjYWxsLiBCb3RoIHRlbXBvcmFyeSBzd2Fwc1xuICAgKiBhcmUgdW5kb25lIHN5bmNocm9ub3VzbHksIGJlZm9yZSBhbnl0aGluZyBlbHNlIGNhbiBjYWxsIGVpdGhlciBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSByZW5hbWUgLSBUaGUgcmVuYW1lIGJlaW5nIHBlcmZvcm1lZC5cbiAgICogQHBhcmFtIGNhbGxPcmlnaW5hbCAtIENhbGxzIE9ic2lkaWFuJ3MgYHJ1bkFzeW5jTGlua1VwZGF0ZWAuXG4gICAqIEByZXR1cm5zIFdoYXQgYHJ1bkFzeW5jTGlua1VwZGF0ZWAgcmV0dXJucy5cbiAgICovXG4gIHByaXZhdGUgd2l0aE5hcnJvd2VkU25hcHNob3QocmVuYW1lOiBQZW5kaW5nUmVuYW1lLCBjYWxsT3JpZ2luYWw6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cGRhdGVRdWV1ZSA9IHRoaXMuZmlsZU1hbmFnZXIudXBkYXRlUXVldWU7XG4gICAgY29uc3QgbWV0YWRhdGFDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGU7XG4gICAgY29uc3Qgb3JpZ2luYWxRdWV1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodXBkYXRlUXVldWUsICdxdWV1ZScpO1xuICAgIGNvbnN0IHF1ZXVlID0gdXBkYXRlUXVldWUucXVldWUuYmluZCh1cGRhdGVRdWV1ZSk7XG5cbiAgICB1cGRhdGVRdWV1ZS5xdWV1ZSA9IDxUPih0YXNrOiAoKSA9PiBQcm9taXNlPFQ+IHwgVCk6IFByb21pc2U8VD4gPT5cbiAgICAgIHF1ZXVlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxPbkNsZWFuQ2FjaGUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1ldGFkYXRhQ2FjaGUsICdvbkNsZWFuQ2FjaGUnKTtcbiAgICAgICAgY29uc3Qgb25DbGVhbkNhY2hlID0gbWV0YWRhdGFDYWNoZS5vbkNsZWFuQ2FjaGUuYmluZChtZXRhZGF0YUNhY2hlKTtcbiAgICAgICAgbWV0YWRhdGFDYWNoZS5vbkNsZWFuQ2FjaGUgPSAob25DbGVhbkNhY2hlQ2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkID0+IHtcbiAgICAgICAgICBvbkNsZWFuQ2FjaGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTbmFwc2hvdFJlbmFtZSA9IHJlbmFtZTtcbiAgICAgICAgICAgIG9uQ2xlYW5DYWNoZUNhbGxiYWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXN1bHQ6IFByb21pc2U8VD4gfCBUO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IHRhc2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZXN0b3JlUHJvcGVydHkobWV0YWRhdGFDYWNoZSwgJ29uQ2xlYW5DYWNoZScsIG9yaWdpbmFsT25DbGVhbkNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTbmFwc2hvdFJlbmFtZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxPcmlnaW5hbCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXN0b3JlUHJvcGVydHkodXBkYXRlUXVldWUsICdxdWV1ZScsIG9yaWdpbmFsUXVldWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGxldCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBldmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCkgPT4ge1xuICAgICAgaXNSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgLypcbiAgICAgICAqIEEgcmVuYW1lIHBlcmZvcm1lZCBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gYEFkdmFuY2VkIE5vdGUgQ29tcG9zZXJgJ3MgZm9sZGVyIG1lcmdlKSBpcyBvd25lZCBieSB0aGF0XG4gICAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gVGhpcyBoYW5kbGVyIGRlbGliZXJhdGVseSBkb2VzXG4gICAgICAgKiBOT1QgcmV3cml0ZSBsaW5rcyBmb3IgaXQsIHNvIHN1cHByZXNzaW5nIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIGJlbG93IHdvdWxkIGxlYXZlIHRoZVxuICAgICAgICogbGlua3MgZGFuZ2xpbmcuIExldCB0aGUgbmF0aXZlIHVwZGF0ZSBwcm9jZWVkIHVudG91Y2hlZC4gU2VlXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAgICovXG4gICAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBmaWxlLnBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkpIHtcbiAgICAgICAgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHNvdXJjZSBmaWxlICR7bGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiByZXNvbHZlZCBmaWxlICR7bGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykgIT09IG51bGwgJiYgIWhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4odGhpcy5hcHApXG4gICAgICAgICAgJiYgKGxpbmtVcGRhdGUuc291cmNlRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTiB8fCBsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5jbGFzcyBIYW5kbGVkUmVuYW1lcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZWRSZW5hbWVLZXk+KCk7XG5cbiAgcHVibGljIGFkZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldCh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpLCB7IG5ld1BhdGgsIG9sZFBhdGggfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuZGVsZXRlKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGhhcyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXModGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPEhhbmRsZWRSZW5hbWVLZXk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIGtleVRvU3RyaW5nKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWA7XG4gIH1cbn1cblxuY2xhc3MgTWV0YWRhdGFEZWxldGVkSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXZpb3VzQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMucHJldmlvdXNDYWNoZSA9IHBhcmFtcy5wcmV2aW91c0NhY2hlO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZpb3VzQ2FjaGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KHRoaXMuZmlsZS5wYXRoLCB0aGlzLnByZXZpb3VzQ2FjaGUpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9sZFBhdGggPT09IHRoaXMubmV3UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvKlxuICAgICAqIFRoZSByZW5hbWUgdGhhdCB0cmlnZ2VyZWQgdGhpcyBoYW5kbGVyIGlzIHZlcnkgbGlrZWx5IHN0aWxsIGluc2lkZSBPYnNpZGlhbidzIG93blxuICAgICAqIGBGaWxlTWFuYWdlci5ydW5Bc3luY0xpbmtVcGRhdGVgIGN5Y2xlLCB3aGljaCBpcyBhYm91dCB0byBkZWNpZGUg4oCUIHN5bmNocm9ub3VzbHkg4oCUIHdoaWNoIGxpbmtzIHRvXG4gICAgICogcmV3cml0ZSwgYnkgcmUtcmVzb2x2aW5nIGVhY2ggb25lLiBFdmVyeXRoaW5nIGJlbG93IHRlbXBvcmFyaWx5IHJlZ2lzdGVycyBhIHBoYW50b20gZmlsZSBhdCB0aGVcbiAgICAgKiBvbGQgcGF0aCAoYHJlZ2lzdGVyRmlsZXNgLCBkaXJlY3RseSBoZXJlIGFuZCBpbnNpZGUgYFJlbmFtZU1hcGApIGFuZCBob2xkcyBpdCBhY3Jvc3MgYW4gYGF3YWl0YDtcbiAgICAgKiBzZWVuIG1pZC1kZWNpc2lvbiwgdGhhdCBwaGFudG9tIG1ha2VzIHRoZSBvbGQgcGF0aCBzdGlsbCByZXNvbHZlLCBzbyBPYnNpZGlhbiBjb25jbHVkZXMgbm90aGluZ1xuICAgICAqIGNoYW5nZWQgYW5kIHJld3JpdGVzIG5vdGhpbmcuIFN0YW5kaW5nIGludmFyaWFudDogbmV2ZXIgdG91Y2ggdGhlIHZhdWx0IGluZGV4IHdoaWxlIE9ic2lkaWFuIGlzXG4gICAgICogbWlkLWRlY2lzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy80Ny5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHRoaXMuYXBwKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCB0aGlzLmNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLy8gVGhlIHJlZnJlc2hlZCBiYWNrbGlua3MgZmVlZCBgb2xkUGF0aEJhY2tsaW5rc01hcGAsIHdoaWNoIG9ubHkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdyByZWFkLCBhbmQgdGhvc2UgYXJlIGdhdGVkIG9uIHRoZSBzYW1lIGZsYWcuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCkuc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDYXNlQ29sbGlzaW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkxpYlN0YXRlKCdyZW5hbWVkRmlsZVBhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuICAgIGNvbnN0IHJlbmFtZWRMaW5rcyA9IGdldE9ic2lkaWFuTGliU3RhdGUoJ3JlbmFtZWRMaW5rUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVuYW1lTWFwID0gbmV3IFJlbmFtZU1hcCh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBuZXdQYXRoOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVuYW1lTWFwLmZpbGwoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4gICAgICAvLyBCYWNrbGlua3MgYXJlIG9ubHkgY29uc3VtZWQgYnkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdywgd2hpY2ggYXJlIGdhdGVkIG9uXG4gICAgICAvLyBgc2hvdWxkSGFuZGxlUmVuYW1lc2AuIFNraXAgZ2F0aGVyaW5nIHRoZW0gKGEgYmFja2xpbmsgZmV0Y2ggcGVyIGF0dGFjaG1lbnQpIG9uIGEgbW92ZS1vbmx5IHJlbmFtZS5cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcCk7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICAgICAgaWYgKGF0dGFjaG1lbnRPbGRQYXRoID09PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudE9sZFBhdGggfSk7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAgPSBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcy5kYXRhO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICAgIHBhdGg6IGF0dGFjaG1lbnRPbGRQYXRoLFxuICAgICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgW29sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aF0gb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAob2xkQXR0YWNobWVudFBhdGggIT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGZpeGVkTmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQob2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50UGF0aCwgZml4ZWROZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50UGF0aCkpIHtcbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoZGlybmFtZShvbGRBdHRhY2htZW50UGF0aCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCxcbiAgICAgICAgZm9sZGVyUGF0aHM6IFsuLi5wYXJlbnRGb2xkZXJQYXRoc11cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgbW92ZSBhYm92ZSBydW5zIHJlZ2FyZGxlc3Mgb2YgYHNob3VsZEhhbmRsZVJlbmFtZXNgICh0aGF0IGlzIHRoZSBwb2ludCBvZiBkZWNvdXBsaW5nXG4gICAgICAgKiBcIk1vdmUgYXR0YWNobWVudHMgd2l0aCBub3RlXCIgZnJvbSBcIlVwZGF0ZSBsaW5rc1wiKS4gVGhlIHJlbWFpbmluZyBzdGVwcyBvbmx5IHJld3JpdGUgbGlua3MsIHNvIHNraXBcbiAgICAgICAqIHRoZW0gd2hlbiBsaW5rIHVwZGF0ZXMgYXJlIGRpc2FibGVkOyB0aGUgYGZpbmFsbHlgIGJsb2NrIGJlbG93IHN0aWxsIHJ1bnMuXG4gICAgICAgKi9cbiAgICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qXG4gICAgICAgKiBBIHJlc3VtZWQgcmVuYW1lIGJyaW5ncyBpdHMgb3duIHNuYXBzaG90IGFsb25nLiBNZXJnZSBpdCBJTlRPIHRoZSBjdXJyZW50IG9uZSByYXRoZXIgdGhhblxuICAgICAgICogY29uY2F0ZW5hdGluZyB0aGUgdHdvOiBhIGZpbGUgbmFtZWQgYnkgYm90aCB3b3VsZCBvdGhlcndpc2UgYmUgb3BlbmVkIGFuZCByZXdyaXR0ZW4gdHdpY2UsIHdoaWNoIGlzXG4gICAgICAgKiB0aGUgdmVyeSB0aGluZyBhIGNvbWJpbmVkIHNuYXBzaG90IGV4aXN0cyB0byBhdm9pZC4gVGhlIGN1cnJlbnQgcmVuYW1lJ3MgZW50cnkgd2lucyBhIGtleSBjb2xsaXNpb24sXG4gICAgICAgKiBiZWNhdXNlIGl0IGRlc2NyaWJlcyB3aGVyZSB0aGUgdGFyZ2V0IGlzIG5vdy5cbiAgICAgICAqL1xuICAgICAgZm9yIChjb25zdCBbaW50ZXJydXB0ZWRCYWNrbGlua1BhdGgsIGludGVycnVwdGVkTGlua0tleVRvUGF0aE1hcF0gb2YgdGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwKSB7XG4gICAgICAgIGNvbnN0IGxpbmtLZXlUb1BhdGhNYXAgPSBjb21iaW5lZEJhY2tsaW5rc01hcC5nZXQoaW50ZXJydXB0ZWRCYWNrbGlua1BhdGgpO1xuICAgICAgICBpZiAoIWxpbmtLZXlUb1BhdGhNYXApIHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcC5zZXQoaW50ZXJydXB0ZWRCYWNrbGlua1BhdGgsIGludGVycnVwdGVkTGlua0tleVRvUGF0aE1hcCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtsaW5rS2V5LCBvbGRUYXJnZXRQYXRoXSBvZiBpbnRlcnJ1cHRlZExpbmtLZXlUb1BhdGhNYXApIHtcbiAgICAgICAgICBpZiAoIWxpbmtLZXlUb1BhdGhNYXAuaGFzKGxpbmtLZXkpKSB7XG4gICAgICAgICAgICBsaW5rS2V5VG9QYXRoTWFwLnNldChsaW5rS2V5LCBvbGRUYXJnZXRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbGlua0luZGV4ZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgYXdhaXQgZWRpdEJhY2tsaW5rc1NuYXBzaG90KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXM8c3RyaW5nPj4oe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHJlZmVyZW5jZUNvbnZlcnRlcjogKHsgcGF5bG9hZDogb2xkQXR0YWNobWVudFBhdGgsIHJlZmVyZW5jZSwgc291cmNlUGF0aDogbmV3QmFja2xpbmtQYXRoIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaW5rSW5kZXggPSAobGlua0luZGV4ZXMuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gMCkgKyAxO1xuICAgICAgICAgIGxpbmtJbmRleGVzLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtJbmRleCk7XG5cbiAgICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogQSBsaW5rIHRoYXQgaXMgbm90IGluIHRoZSBzbmFwc2hvdCB3YXMgZWl0aGVyIG5ldmVyIG91cnMgdG8gcmV3cml0ZSwgb3Igd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAqIHJld3JpdHRlbiBieSBzb21lb25lIGVsc2UgKGxlYXZpbmcgaXQgY29ycmVjdCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0byBkbyAtXG4gICAgICAgICAgICAgKiBidXQgbG9nIGl0LCBiZWNhdXNlIGEgc2lsZW50IHNraXAgaGVyZSBpcyBleGFjdGx5IGhvd1xuICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy82MCBzdGF5ZWRcbiAgICAgICAgICAgICAqIGludmlzaWJsZTogZXZlcnkgc2tpcHBlZCBsaW5rIGxlZnQgYSBicm9rZW4gZW1iZWQgYW5kIHJlcG9ydGVkIG5vdGhpbmcuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6dXBkYXRlQmFja2xpbmtzJykoXG4gICAgICAgICAgICAgIGBObyBzbmFwc2hvdCBlbnRyeSBmb3IgbGluayAke3RvSnNvbihyZWZlcmVuY2UpfSBpbiAke25ld0JhY2tsaW5rUGF0aH07IGxlYXZpbmcgaXQgdW5jaGFuZ2VkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSByZW5hbWVNYXAuZ2V0KG9sZEF0dGFjaG1lbnRQYXRoKSA/PyBvbGRBdHRhY2htZW50UGF0aDtcblxuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmFkZChgJHtuZXdCYWNrbGlua1BhdGh9Ly8ke1N0cmluZyhsaW5rSW5kZXgpfWApO1xuXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgIC8vIFRoZSBjb252ZXJ0ZXIgbG9ncyBldmVyeSBsaW5rIGl0IGRlY2xpbmVzLCBzbyBpdCBoYXMgdG8gYmUgc2hvd24gdGhlIG9uZXMgdGhlIHNuYXBzaG90IGRvZXMgbm90IG5hbWUuXG4gICAgICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkUmVmZXJlbmNlczogdHJ1ZSxcbiAgICAgICAgc25hcHNob3Q6IGNvbWJpbmVkQmFja2xpbmtzTWFwXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGlmIChpc05vdGUodGhpcy5uZXdQYXRoKSkge1xuICAgICAgICBhd2FpdCB1cGRhdGVSZWZlcmVuY2VzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVSZWZlcmVuY2VzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gWy4uLnRoaXMuaGFuZGxlZFJlbmFtZXMua2V5cygpXTtcbiAgICAgIGFkZFRvUXVldWUoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9ycGhhbktleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvcnBoYW5LZXkub2xkUGF0aCwgb3JwaGFuS2V5Lm5ld1BhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5hbWVkTGlua3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZU9ycGhhbmVkUmVuYW1lcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMub2xkUGF0aCk7XG4gICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogaW50ZXJydXB0ZWRSZW5hbWUub2xkUGF0aCxcbiAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KS5oYW5kbGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNhc2VDb2xsaXNpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFnZXREYXRhQWRhcHRlckV4KHRoaXMuYXBwKS5pbnNlbnNpdGl2ZSB8fCB0aGlzLm9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gam9pbihkaXJuYW1lKHRoaXMubmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUodGhpcy5uZXdQYXRoKX1gKTtcbiAgICBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQodGhpcy5uZXdQYXRoLCB0ZW1wb3JhcnlQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgbmV3UGF0aDogdGVtcG9yYXJ5UGF0aCxcbiAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0ZW1wb3JhcnlQYXRoIH0pLCB0aGlzLm5ld1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQ6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgICB7XG4gICAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSk7XG4gICAgICBjb25zdCBmYWtlT2xkRmlsZUJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogZmFrZU9sZEZpbGUgfSk7XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gZmFrZU9sZEZpbGVCYWNrbGlua3MuZGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZFJlZmVyZW5jZXNdIG9mIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQpIHtcbiAgICAgIGxldCBvbGRSZWZlcmVuY2VzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRSZWZlcmVuY2VzKSB7XG4gICAgICAgIG9sZFJlZmVyZW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZFJlZmVyZW5jZXMpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZyZXNoZWRSZWZlcmVuY2VzKSB7XG4gICAgICAgIGlmIChvbGRSZWZlcmVuY2VzLmluY2x1ZGVzKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBvbGRSZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICBpZiAob2xkUGF0aCA9PT0gbmV3UGF0aCkge1xuICAgICAgcmV0dXJuIG5ld1BhdGg7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuYWRkKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG59XG5cbmNsYXNzIFJlbmFtZU1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhSZWZlcmVuY2VzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aFJlZmVyZW5jZXMgPSB0aGlzLm9sZENhY2hlID8gZ2V0UmVmZXJlbmNlcyh7IGNhY2hlOiB0aGlzLm9sZENhY2hlIH0pIDogW107XG4gIH1cblxuICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZW50cmllcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRoaXMubWFwLnNldCh0aGlzLm9sZFBhdGgsIHRoaXMubmV3UGF0aCk7XG5cbiAgICBpZiAoIWlzTm90ZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2JzaWRpYW4gZG9lcyBub3QgaW5kZXggYSBjYW52YXMgZmlsZSBpbnRvIHRoZSBtZXRhZGF0YSBjYWNoZS5cbiAgICAvLyBUaGUgY2FjaGUtZGVyaXZlZCBgb2xkUGF0aFJlZmVyZW5jZXNgIGlzIGVtcHR5IGZvciBhIGNhbnZhcywgaGlkaW5nIGl0cyBlbWJlZGRlZCBhdHRhY2htZW50cy5cbiAgICAvLyBSZWFkaW5nIHRoZSBjYW52YXMgcmVmZXJlbmNlcyBkaXJlY3RseSBtb3ZlcyB0aGVtIHdpdGggdGhlIGNhbnZhcyAobWlycm9yaW5nIG5vdGUgYmVoYXZpb3IpLlxuICAgIC8vIFRoZSBmaWxlIGFscmVhZHkgbGl2ZXMgYXQgdGhlIG5ldyBwYXRoIGFmdGVyIHRoZSByZW5hbWUsIHNvIHJlYWQgdGhlIHJlZmVyZW5jZXMgZnJvbSB0aGVyZS5cbiAgICBpZiAoaXNDYW52YXNGaWxlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNhbnZhc1JlZmVyZW5jZXMgPSBhd2FpdCBnZXRDYW52YXNSZWZlcmVuY2VzKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgpO1xuICAgICAgdGhpcy5vbGRQYXRoUmVmZXJlbmNlcy5wdXNoKC4uLmNhbnZhc1JlZmVyZW5jZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IG9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCB0aGlzLmdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGUpO1xuXG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGhcbiAgICAgIH0pXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyIHx8IChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICAgIGlmIChcbiAgICAgIGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChvbGRBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBvbGRQYXRoUmVmZXJlbmNlIG9mIHRoaXMub2xkUGF0aFJlZmVyZW5jZXMpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RSZWZlcmVuY2VGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcmVmZXJlbmNlOiBvbGRQYXRoUmVmZXJlbmNlLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUgfHwgKCFpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgJiYgIW9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZmlsbFJlbmFtZU1hcCcpKGBSZW1vdmluZyBjb25mbGljdGluZyBhdHRhY2htZW50ICR7bmV3QXR0YWNobWVudEZpbGUucGF0aH0uYCk7XG4gICAgICAgICAgYXdhaXQgdHJhc2hTYWZlKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSBkaXJuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBiYXNlbmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgsIGV4dGVuc2lvbik7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJlY3RvcnksIGJhc2VOYW1lKSwgZXh0ZW5zaW9uLnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQob2xkUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG9sZFBhdGgpO1xuICB9XG5cbiAgcHVibGljIGluaXRCYWNrbGlua3NNYXAocGFyYW1zOiBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoLFxuICAgICAgc2luZ2xlQmFja2xpbmtzTWFwXG4gICAgfSA9IHBhcmFtcztcbiAgICBidWlsZEJhY2tsaW5rc1NuYXBzaG90PHN0cmluZz4oe1xuICAgICAgYmFja2xpbmtzOiBzaW5nbGVCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoUmVtYXBwZXI6IChiYWNrbGlua1BhdGgpID0+IHRoaXMubWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aCxcbiAgICAgIHBheWxvYWRQcm92aWRlcjogKCkgPT4gcGF0aCxcbiAgICAgIHJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXI6IGdldFJlZmVyZW5jZUlkZW50aXR5S2V5LFxuICAgICAgdGFyZ2V0OiBjb21iaW5lZEJhY2tsaW5rc01hcFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aFJlZmVyZW5jZSBvZiB0aGlzLm9sZFBhdGhSZWZlcmVuY2VzKSB7XG4gICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RSZWZlcmVuY2VGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcmVmZXJlbmNlOiBvbGRQYXRoUmVmZXJlbmNlLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPihbW3RoaXMubmV3UGF0aCwgW29sZFBhdGhSZWZlcmVuY2VdXV0pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzZXR0aW5ncyB0aGUgaGFuZGxlciBydW5zIHdpdGguXG4gKlxuICogVGhlcmUgaXMgZXhhY3RseSBvbmUgY29udHJpYnV0b3I6IHRoZSBjb21wb25lbnQncyBvd24gYHNldHRpbmdzQnVpbGRlcmAuIEVhcmxpZXIgdmVyc2lvbnMgYWdncmVnYXRlZCBhXG4gKiByZWdpc3RyeSBvZiBjb250cmlidXRvcnMgYW5kIE9SLW1lcmdlZCB0aGVpciBhbnN3ZXJzLCBiZWNhdXNlIHNldmVyYWwgcGx1Z2lucyBjb3VsZCBlYWNoIHJlZ2lzdGVyIGFcbiAqIGhhbmRsZXIgYWdhaW5zdCB0aGUgb25lIHNoYXJlZCB2YXVsdC4gVGhleSBubyBsb25nZXIgZG8sIHNvIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgcXVlc3Rpb24gb2Ygd2hvc2VcbiAqIHNldHRpbmcgd2lucy5cbiAqXG4gKiBXaGF0IHJlbWFpbnMgaXMgZGVmYXVsdGluZzogdGhlIGJ1aWxkZXIgcmV0dXJucyBhIGBQYXJ0aWFsYCwgc28gdGhlIHR3byBwcmVkaWNhdGVzIGFuZCB0aGUgZW1wdHktZm9sZGVyXG4gKiBiZWhhdmlvciBuZWVkIGEgdmFsdWUgd2hlbiBpdCBkb2VzIG5vdCBzdXBwbHkgb25lLlxuICovXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gc2V0dGluZ3NCdWlsZGVyO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3QgYnVpbHRTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJ1aWx0U2V0dGluZ3MsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBidWlsdFNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgaXNOb3RlOiAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBidWlsdFNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGlzTm90ZShwYXRoKSxcbiAgICAgIGlzUGF0aElnbm9yZWQ6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgdXBkYXRlZCBsaW5rcyB0byB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBsb2NrIGNvbXBvbmVudCB1c2VkIHRvIGd1YXJkIGxpbmsgdXBkYXRlcywgb3IgYG51bGxgIGlmIG5vbmUgaXMgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGlzIHBsdWdpbidzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG1hbmFnZXIgdGhhdCBhZ2dyZWdhdGVzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncyBhY3Jvc3MgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lcyA9IG5ldyBIYW5kbGVkUmVuYW1lcygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHBhcmFtcy5hYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA/PyBudWxsO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcih0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVEZWxldGUsIHsgZmlsZVBhdGg6IGZpbGUucGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gICAgbmV3IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIoe1xuICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICBmaWxlLFxuICAgICAgcHJldmlvdXNDYWNoZSxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVuYW1lKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNGaWxlKGZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcblxuICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgcmVuYW1lIG9jY3VycmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIGBBZHZhbmNlZCBOb3RlIENvbXBvc2VyYCdzIGZvbGRlciBtZXJnZSkgaXMgb3JjaGVzdHJhdGVkIGJ5IHRoYXRcbiAgICAgKiB0cmFuc2FjdGlvbidzIG93bmVyLCB3aGljaCB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBSZWFjdGluZyB0byBpdFxuICAgICAqIGhlcmUgd291bGQgKGEpIHBlcnR1cmIgT2JzaWRpYW4ncyBuYXRpdmUgcG9zdC1yZW5hbWUgbGluayB1cGRhdGUgYW5kIGxlYXZlIGxpbmtzIGRhbmdsaW5nLCBhbmRcbiAgICAgKiAoYikgY29sbGlkZSB3aXRoIHRoZSBmb3JlaWduIHRyYW5zYWN0aW9uIOKAlCBhbiBhc3luYyBhYm9ydCBmcm9tIHRoaXMgaGFuZGxlciBhYm9ydHMgYW5cbiAgICAgKiBhbHJlYWR5LWNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgdGhyb3dpbmcgXCJDYW5ub3Qgcm9sbCBiYWNrIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uXCIuIFRoaXNcbiAgICAgKiBoYW5kbGVyJ3Mgb3duIGF0dGFjaG1lbnQgbW92ZXMgYXJlIGFscmVhZHkgZXhjbHVkZWQgYWJvdmUgdmlhIGBoYW5kbGVkUmVuYW1lc2AsIHNvIGEgbG9jayBzdGlsbFxuICAgICAqIGhlbGQgaGVyZSBhbHdheXMgYmVsb25ncyB0byBhIGZvcmVpZ24gb3BlcmF0aW9uOyBzdGF5IG91dCBvZiBpdHMgd2F5LiBTZWVcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAqL1xuICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgb2NjdXJzIGluc2lkZSBhIGZvcmVpZ24gbG9ja2VkIHRyYW5zYWN0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOb09wUmVuYW1lKHNldHRpbmdzLCBvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2Ygb2xkIHBhdGggJHtvbGRQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG5ldyBwYXRoICR7bmV3UGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoQmFja2xpbmtzTWFwID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCkuZGF0YTtcbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50LmFib3J0U2lnbmFsLFxuICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgICBuZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUsIHsgbmV3UGF0aCwgb2xkUGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpdGggbGluayByZXdyaXRpbmcgb2ZmLCB0aGUgaGFuZGxlcidzIG9ubHkgcmVtYWluaW5nIGpvYnMgYXJlIG1vdmluZyBhIE5PVEUncyBhdHRhY2htZW50cyBhbmQgcHJ1bmluZ1xuICAgKiB0aGUgZm9sZGVyIGEgbW92ZWQgZmlsZSB2YWNhdGVkLiBBIG5vbi1ub3RlIHJlbmFtZSBuZWVkcyBuZWl0aGVyIHdoZW4gZW1wdHkgZm9sZGVycyBhcmUga2VwdCwgc28gdGhlcmVcbiAgICogaXMgbm90aGluZyB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIGZyb20uXG4gICAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgdG8uXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBoYW5kbGVyIHdvdWxkIGRvIG5vIHdvcmsgZm9yIHRoaXMgcmVuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc05vT3BSZW5hbWUoc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXNcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4ob2xkUGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG5ld1BhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgKHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKSA9PT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICB9XG59XG5cbi8qKlxuICogTW92ZXMgYW4gYXR0YWNobWVudCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgdG8gd2hlcmV2ZXIgdGhlIGNvbnN1bWluZyBwbHVnaW4gc2F5cyBpdCBiZWxvbmdzLlxuICpcbiAqIFNoYXJlZCBieSBib3RoIGRlbGV0ZSBwYXRocyDigJQgdGhlIG5vdGUgZGVsZXRlIGluIHtAbGluayBEZWxldGVIYW5kbGVyfSBhbmQgdGhlIGZvbGRlciBkZWxldGUgcmVwbGF5ZWQgYnlcbiAqIHtAbGluayBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnR9IOKAlCBiZWNhdXNlIGJvdGggcmVhY2ggdGhlIHNhbWUgcG9pbnQ6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGhhc1xuICogZGVjaWRlZCB0aGUgYXR0YWNobWVudCBtdXN0IHN1cnZpdmUsIGFuZCB3aXRob3V0IHRoaXMgaXQgd291bGQgc3Vydml2ZSBpbiBhIGZvbGRlciBub3RoaW5nIG93bnMgYW55IG1vcmUuXG4gKlxuICogQSBjb25zdW1lciB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LCBvciB0aGF0IGFuc3dlcnNcbiAqIGBudWxsYCwgZ2V0cyBleGFjdGx5IHRoZSBiZWhhdmlvciBpdCBoYWQgYmVmb3JlIHRoaXMgZXhpc3RlZDogdGhlIGF0dGFjaG1lbnQgc3RheXMgcHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGV0aGVyIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudChwYXJhbXM6IERpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gIGlmICghc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlLnBhdGg7XG4gIGNvbnN0IHJlc2N1ZVBhdGggPSBhd2FpdCBzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKHtcbiAgICBhdHRhY2htZW50UGF0aCxcbiAgICBzdXJ2aXZpbmdOb3RlUGF0aHM6IHBhcmFtcy5yZXNjdWVQYXJhbXMuc3Vydml2aW5nTm90ZVBhdGhzXG4gIH0pO1xuXG4gIGlmIChyZXNjdWVQYXRoID09PSBudWxsKSB7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYE5vIHJlc2N1ZSBwYXRoIGZvciAke2F0dGFjaG1lbnRQYXRofTsga2VlcGluZyBpdCB3aGVyZSBpdCBpcy5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIC8qXG4gICAgICogYHJlbmFtZVNhZmVgIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciwgcmVzb2x2ZXMgYSBjb2xsaXNpb24gdmlhIGBnZXRTYWZlUmVuYW1lUGF0aGAsIGFuZCBtb3Zlc1xuICAgICAqIHRocm91Z2ggYGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlYCwgc28gdGhlIHN1cnZpdmluZyBub3RlcycgbGlua3MgZm9sbG93IHRoZSBhdHRhY2htZW50LlxuICAgICAqL1xuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBuZXdQYXRoOiByZXNjdWVQYXRoLFxuICAgICAgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBwYXJhbXMucmVzY3VlUGFyYW1zLmZpbGVcbiAgICB9KTtcblxuICAgIGlmIChuZXdBdHRhY2htZW50UGF0aCA9PT0gYXR0YWNobWVudFBhdGgpIHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBpcyBhbHJlYWR5IHdoZXJlIGl0IGJlbG9uZ3MuIFRoaXMgaXMgdGhlIG5vcm1hbCBzZWNvbmQgbG9vayBhdCBhIGZpbGUgdGhlIGZvbGRlclxuICAgICAgICogZGVsZXRlIGp1c3QgcmVzY3VlZDogdGhlIG93bmluZyBub3RlJ3Mgb3duIGRlbGV0aW9uIGlzIHJlcG9ydGVkIGFmdGVyd2FyZHMgYW5kIHdhbGtzIGl0cyBsaW5rc1xuICAgICAgICogYWdhaW4uIE5vdGhpbmcgbW92ZWQsIHNvIG5vdGhpbmcgaXMgY2xhaW1lZCDigJQgdGhlIGNhbGxlciBrZWVwcyBpdCBpbiBwbGFjZSwgd2hpY2ggaXMgdGhlIHRydXRoLlxuICAgICAgICovXG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgJHthdHRhY2htZW50UGF0aH0gYWxyZWFkeSBzaXRzIGF0IGl0cyByZXNjdWUgcGF0aDsgbm90aGluZyB0byBtb3ZlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhlIG1vdmUgZmlyZXMgYHZhdWx0Lm9uKCdyZW5hbWUnKWAsIHNvIHRoaXMgaGFuZGxlcidzIG93biBgUmVuYW1lSGFuZGxlcmAgcGlja3MgaXQgdXAgbGlrZSBhbnkgb3RoZXJcbiAgICAgKiBhdHRhY2htZW50IG1vdmUuIEl0IGlzIGRlbGliZXJhdGVseSBOT1QgcmVnaXN0ZXJlZCBpbiBgaGFuZGxlZFJlbmFtZXNgOlxuICAgICAqIGBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50YCBhbHJlYWR5IGRpc2NhcmRzIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIHdoaWxlXG4gICAgICogYHNob3VsZEhhbmRsZVJlbmFtZXNgIGlzIG9uLCBzbyBzdXBwcmVzc2luZyB0aGUgaGFuZGxlciBhcyB3ZWxsIHdvdWxkIGxlYXZlIGRhbmdsaW5nIGV4YWN0bHkgdGhlIGxpbmtzXG4gICAgICogdGhpcyByZXNjdWUgZXhpc3RzIHRvIHByZXNlcnZlLiBMZXQgdGhlIHJld3JpdGUgc2V0dGxlIGJlZm9yZSB0aGUgZGVsZXRlIHdhbGsgY2FycmllcyBvbi5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHBhcmFtcy5hcHApO1xuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYFJlc2N1ZWQgJHthdHRhY2htZW50UGF0aH0gdG8gJHtuZXdBdHRhY2htZW50UGF0aH0uYCk7XG4gICAgcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIubm90aWNlcy5hdHRhY2htZW50UmVzY3VlZCwgeyBhdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGggfSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8qXG4gICAgICogQSByZXNjdWUgdGhhdCBoYWxmIGhhcHBlbmVkIG11c3Qgbm90IHJlYWQgYXMgc3VjY2VzcyDigJQgcmVwb3J0aW5nIGBmYWxzZWAgZmFsbHMgYmFjayB0byBrZWVwaW5nIHRoZVxuICAgICAqIGF0dGFjaG1lbnQgaW4gcGxhY2Ugd2l0aCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlLCB3aGljaCBpcyBzdGlsbCBzYWZlLlxuICAgICAqL1xuICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzY3VlICR7YXR0YWNobWVudFBhdGh9IHRvICR7cmVzY3VlUGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBrZXkgdW5kZXIgd2hpY2ggYSBsaW5rIGlzIHJlbWVtYmVyZWQgd2hpbGUgYSByZW5hbWUgaXMgaW4gZmxpZ2h0LlxuICpcbiAqIFRoZSByZXdyaXRlIGhhcyB0byBtYXRjaCBsaW5rcyBjYXB0dXJlZCBCRUZPUkUgdGhlIGF0dGFjaG1lbnRzIG1vdmVkIGFnYWluc3QgdGhlIGxpbmtzIHRoZSBtZXRhZGF0YSBjYWNoZVxuICogcmVwb3J0cyBBRlRFUiB0aGV5IG1vdmVkLCBhbmQgdGhlIG9ubHkgdGhpbmcgdGhhdCByZWxpYWJseSBzdXJ2aXZlcyB0aGF0IGdhcCBpcyB0aGUgbGluaydzIFRFWFQuXG4gKiBEZWxpYmVyYXRlbHkgZXhjbHVkZXMgYHBvc2l0aW9uYDoga2V5aW5nIG9uIHRoZSB3aG9sZSB7QGxpbmsgUmVmZXJlbmNlfSBtZWFudCB0aGF0IGFzIHNvb24gYXMgYW55dGhpbmdcbiAqIGVkaXRlZCB0aGUgZmlsZSBpbiBiZXR3ZWVuIOKAlCBhIGNvLWluc3RhbGxlZCBwbHVnaW4gcmV3cml0aW5nIGl0cyBvd24gbGlua3MsIG1vc3Qgb2Z0ZW4g4oCUIGV2ZXJ5IGxpbmsgYmVsb3dcbiAqIHRoZSBlZGl0IHNoaWZ0ZWQgaXRzIG9mZnNldHMsIG1pc3NlZCBpdHMga2V5LCBhbmQgd2FzIHNraXBwZWQgaW4gc2lsZW5jZSwgbGVhdmluZyB0aGUgbm90ZSB3aXRoIHNvbWUgZW1iZWRzXG4gKiByZXdyaXR0ZW4gYW5kIHRoZSByZXN0IGJyb2tlbi4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwLlxuICpcbiAqIFR3byBsaW5rcyB3aXRoIGlkZW50aWNhbCB0ZXh0IGluIG9uZSBmaWxlIG5lY2Vzc2FyaWx5IHJlc29sdmUgdG8gdGhlIHNhbWUgdGFyZ2V0LCBzbyBjb2xsYXBzaW5nIHRoZW0gb250b1xuICogb25lIGtleSBsb3NlcyBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGJ1aWxkIHRoZSBrZXkgZm9yLlxuICogQHJldHVybnMgVGhlIGtleSBpZGVudGlmeWluZyB0aGUgbGluayBieSBpdHMgdGV4dCBhbG9uZS5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVmZXJlbmNlSWRlbnRpdHlLZXkocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiByZWZlcmVuY2UubGluayxcbiAgICBvcmlnaW5hbDogcmVmZXJlbmNlLm9yaWdpbmFsXG4gIH0pO1xufVxuXG4vKipcbiAqIFB1dHMgYmFjayBhIHByb3BlcnR5IHN3YXBwZWQgb3V0IGZvciBhIG1vbWVudDogdGhlIG93biBwcm9wZXJ0eSBpdCBoYWQsIG9yIG5vbmUsIHNvIGEgbWV0aG9kIGluaGVyaXRlZCBmcm9tIHRoZVxuICogcHJvdG90eXBlIGlzIGluaGVyaXRlZCBhZ2Fpbi5cbiAqXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdGhlIHByb3BlcnR5IHdhcyBzd2FwcGVkIG9uLlxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSdzIGtleS5cbiAqIEBwYXJhbSBkZXNjcmlwdG9yIC0gSXRzIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGJlZm9yZSB0aGUgc3dhcCwgYHVuZGVmaW5lZGAgd2hlbiBpdCBoYWQgbm9uZS5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVByb3BlcnR5KCRvYmplY3Q6IG9iamVjdCwga2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoZGVzY3JpcHRvcikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkb2JqZWN0LCBrZXksIGRlc2NyaXB0b3IpO1xuICB9IGVsc2Uge1xuICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoJG9iamVjdCwga2V5KTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG5leHBvcnQgeyBFbXB0eUZvbGRlckJlaGF2aW9yIH0gZnJvbSAnLi4vdmF1bHQudHMnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQkEsbUJBQThCO0FBQzlCLG1CQUEyQjtBQUMzQiwwQkFHTztBQUNQLGtCQU1PO0FBRVAsNkJB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Q0FBb0IsVUFBVSxpQ0FBb0I7QUFBQSxFQUMxRjtBQUNGO0FBZUEsZUFBZSw2QkFBNkIsUUFBOEQ7QUFDeEcsUUFBTSxXQUFXLE9BQU8sZ0JBQWdCLFlBQVk7QUFDcEQsTUFBSSxDQUFDLFNBQVMsZUFBZTtBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0saUJBQWlCLE9BQU8sYUFBYSxLQUFLO0FBQ2hELFFBQU0sYUFBYSxNQUFNLFNBQVMsY0FBYztBQUFBLElBQzlDO0FBQUEsSUFDQSxvQkFBb0IsT0FBTyxhQUFhO0FBQUEsRUFDMUMsQ0FBQztBQUVELE1BQUksZUFBZSxNQUFNO0FBQ3ZCLDZDQUF1QixrREFBa0QsRUFBRSxzQkFBc0IsY0FBYywyQkFBMkI7QUFDMUksV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBS0YsVUFBTSxvQkFBb0IsVUFBTSx5QkFBVztBQUFBLE1BQ3pDLEtBQUssT0FBTztBQUFBLE1BQ1osU0FBUztBQUFBLE1BQ1QsdUJBQXVCLE9BQU8sYUFBYTtBQUFBLElBQzdDLENBQUM7QUFFRCxRQUFJLHNCQUFzQixnQkFBZ0I7QUFNeEMsK0NBQXVCLGtEQUFrRCxFQUFFLEdBQUcsY0FBYyxvREFBb0Q7QUFDaEosYUFBTztBQUFBLElBQ1Q7QUFTQSxjQUFNLCtDQUEwQixPQUFPLEdBQUc7QUFFMUMsNkNBQXVCLGtEQUFrRCxFQUFFLFdBQVcsY0FBYyxPQUFPLGlCQUFpQixHQUFHO0FBQy9ILFdBQU8sc0JBQXNCLGVBQVcsa0JBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxRQUFRLG1CQUFtQixFQUFFLGdCQUFnQixrQkFBa0IsQ0FBQyxDQUFDO0FBQ2hJLFdBQU87QUFBQSxFQUNULFNBQVMsT0FBTztBQUtkLGlDQUFXLElBQUksTUFBTSxvQkFBb0IsY0FBYyxPQUFPLFVBQVUsSUFBSSxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDN0YsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQW1CQSxTQUFTLHdCQUF3QixXQUE4QjtBQUM3RCxhQUFPLDRCQUFPO0FBQUEsSUFDWixNQUFNLFVBQVU7QUFBQSxJQUNoQixVQUFVLFVBQVU7QUFBQSxFQUN0QixDQUFDO0FBQ0g7QUFVQSxTQUFTLGdCQUFnQixTQUFpQixLQUFhLFlBQWtEO0FBQ3ZHLE1BQUksWUFBWTtBQUNkLFdBQU8sZUFBZSxTQUFTLEtBQUssVUFBVTtBQUFBLEVBQ2hELE9BQU87QUFDTCxZQUFRLGVBQWUsU0FBUyxHQUFHO0FBQUEsRUFDckM7QUFDRjsiLCJuYW1lcyI6WyJpbXBvcnRfdmF1bHQiXX0=
1366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FycmF5JztcbmltcG9ydCB7IHByaW50RXJyb3IgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIH0gZnJvbSAnLi4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXMsXG4gIFVwZGF0ZUxpbmtQYXJhbXMsXG4gIFVwZGF0ZVJlZmVyZW5jZXNJbkZpbGVQYXJhbXNcbn0gZnJvbSAnLi4vbGluay50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHR5cGUgeyBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zIH0gZnJvbSAnLi4vdmF1bHQtZGVsZXRlLnRzJztcbmltcG9ydCB0eXBlIHsgQWJvcnRTaWduYWxDb21wb25lbnQgfSBmcm9tICcuL2Fib3J0LXNpZ25hbC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHtcbiAgQXR0YWNobWVudFBhdGhDb250ZXh0LFxuICBnZXRBdHRhY2htZW50RmlsZVBhdGgsXG4gIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICBoYXNPd25BdHRhY2htZW50Rm9sZGVyXG59IGZyb20gJy4uL2F0dGFjaG1lbnQtcGF0aC50cyc7XG5pbXBvcnQgeyBpdGVyYXRlUmVmZXJlbmNlc0FmZmVjdGVkQnlSZW5hbWUgfSBmcm9tICcuLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQgeyBnZXRDYW52YXNSZWZlcmVuY2VzIH0gZnJvbSAnLi4vY2FudmFzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzRmlsZSxcbiAgaXNGb2xkZXIsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCYWNrbGlua3NTbmFwc2hvdCxcbiAgZWRpdEJhY2tsaW5rc1NuYXBzaG90LFxuICBleHRyYWN0UmVmZXJlbmNlRmlsZSxcbiAgdXBkYXRlTGluayxcbiAgdXBkYXRlUmVmZXJlbmNlc0luRmlsZVxufSBmcm9tICcuLi9saW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRSZWZlcmVuY2VzLFxuICBoYXNCYWNrbGlua0NhY2hlUGx1Z2luLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tbGliLXN0YXRlLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgaXNDaGlsZE9yU2VsZixcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MuZ2V0UmVzY3VlUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVzY3VlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudCB0aGF0IGlzIGFib3V0IHRvIGJlIHN0cmFuZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGhzIG9mIHRoZSBub3RlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSB0aGUgYXR0YWNobWVudCBvbmNlIHRoZSBkZWxldGlvbiBpcyBkb25lLiBOZXZlciBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHN1cnZpdmluZ05vdGVQYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogU2V0dGluZ3MgZm9yIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb2YgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlciB3aGVuIGRlbGV0aW5nIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICByZWFkb25seSBlbXB0eUZvbGRlckJlaGF2aW9yOiBFbXB0eUZvbGRlckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBtb3ZlIGFuIGF0dGFjaG1lbnQgdGhhdCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQg4oCUIG9uZSB0aGF0IHN1cnZpdmVzIGJlY2F1c2UgYW5vdGhlclxuICAgKiBub3RlIHN0aWxsIHJlZmVyZW5jZXMgaXQsIGJ1dCBpcyBsZWZ0IHNpdHRpbmcgaW4gYSBmb2xkZXIgd2hvc2Ugb3duaW5nIG5vdGUgaXMgZ29uZS5cbiAgICpcbiAgICogRGVjaWRpbmcgdGhlIGRlc3RpbmF0aW9uIGlzIHRoZSBwbHVnaW4ncyBhdHRhY2htZW50LXBhdGggcG9saWN5LCB3aGljaCBpcyB3aHkgdGhlIGhhbmRsZXIgYXNrcyByYXRoZXJcbiAgICogdGhhbiBndWVzc2VzLiBSZXR1cm5pbmcgYG51bGxgIOKAlCBvciBub3QgaW1wbGVtZW50aW5nIHRoaXMgYXQgYWxsIOKAlCBrZWVwcyB0aGUgYXR0YWNobWVudCB3aGVyZSBpdCBpcyxcbiAgICogd2hpY2ggaXMgdGhlIGJlaGF2aW9yIGV2ZXJ5IGNvbnN1bWVyIGhhZCBiZWZvcmUgdGhpcyBtZW1iZXIgZXhpc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdldFJlc2N1ZVBhdGg/OiAocGFyYW1zOiBHZXRSZXNjdWVQYXRoUGFyYW1zKSA9PiBQcm9taXNlPG51bGwgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwYXRoIGlzIGEgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzTm90ZTogKHBhdGg6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICByZWFkb25seSBpc1BhdGhJZ25vcmVkOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaGFuZGxlIGRlbGV0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhhbmRsZURlbGV0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgcmVuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhhbmRsZVJlbmFtZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuYW1lIGF0dGFjaG1lbnQgZmlsZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBIYW5kbGVkUmVuYW1lS2V5IHtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJbnRlcnJ1cHRlZFJlbmFtZSB7XG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPzogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21iaW5lZCBiYWNrbGlua3MgbWFwLCBrZXllZCBieSBuZXcgYmFja2xpbmsgcGF0aCwgYWNjdW11bGF0aW5nIGxpbmstSlNPTiB0byBzb3VyY2UtcGF0aCBtYXBwaW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggd2hvc2UgYmFja2xpbmtzIGFyZSBiZWluZyByZWNvcmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhY2tsaW5rcyBtYXAgZm9yIGEgc2luZ2xlIGZpbGUsIGtleWVkIGJ5IGJhY2tsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBzaW5nbGVCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbn1cblxuY29uc3QgUEFUQ0hfVE9LRU4gPSBTeW1ib2wuZm9yKCdyZW5hbWVEZWxldGVIYW5kbGVyJyk7XG5cbmludGVyZmFjZSBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBEaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50UGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSByZXNjdWVQYXJhbXM6IFJlc2N1ZVN0aWxsVXNlZEZpbGVQYXJhbXM7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUGVuZGluZ1JlbmFtZSB7XG4gIHJlYWRvbmx5IGZpbGU6IFRGaWxlO1xuICByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj86IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcbn1cblxuY2xhc3MgRGVsZXRlSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7dGhpcy5maWxlLnBhdGh9YCk7XG4gICAgaWYgKCFpc05vdGUodGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoXG4gICAgICAgIGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgZmlsZSBzdGlsbCBleGlzdHMgb24gZGlzayAoaW5kZXgtb25seSByZW1vdmFsLCBub3QgYSByZWFsIGRlbGV0aW9uKS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFtkaXJuYW1lKHRoaXMuZmlsZS5wYXRoKV0pO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldCh0aGlzLmZpbGUucGF0aCk7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmRlbGV0ZSh0aGlzLmZpbGUucGF0aCk7XG4gICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IGdldFJlZmVyZW5jZXMoeyBjYWNoZSB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0UmVmZXJlbmNlRmlsZSh7IGFwcDogdGhpcy5hcHAsIHJlZmVyZW5jZSwgc291cmNlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGggfSk7XG4gICAgICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSB8fCB0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChhdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGF0dGFjaG1lbnRGaWxlLnBhcmVudD8ucGF0aCA/PyAnJyk7XG4gICAgICAgICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBkZWxldGVkTm90ZVBhdGg6IHRoaXMuZmlsZS5wYXRoLFxuICAgICAgICAgICAgcGF0aE9yRmlsZTogYXR0YWNobWVudEZpbGUsXG4gICAgICAgICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyZW50Rm9sZGVyUGF0aHMuZGVsZXRlKCcnKTtcbiAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCxcbiAgICAgIGZvbGRlclBhdGhzOiBbLi4ucGFyZW50Rm9sZGVyUGF0aHNdXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aFxuICAgIH0pO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IGF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKFxuICAgICAgIWF0dGFjaG1lbnRGb2xkZXIgfHwgIWF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5maWxlLnBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBkZWxldGVkTm90ZVBhdGg6IHRoaXMuZmlsZS5wYXRoLFxuICAgICAgcGF0aE9yRmlsZTogYXR0YWNobWVudEZvbGRlcixcbiAgICAgIHJlc2N1ZVN0aWxsVXNlZEZpbGU6IHRoaXMucmVzY3VlU3RpbGxVc2VkRmlsZS5iaW5kKHRoaXMpLFxuICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBcbiAgICB9KTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2N1ZVN0aWxsVXNlZEZpbGUocmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNjdWVQYXJhbXMsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBLZWVwcyBhIGZvbGRlciBkZWxldGlvbiBmcm9tIGRlc3Ryb3lpbmcgYW4gYXR0YWNobWVudCBhIG5vdGUgb3V0c2lkZSB0aGF0IGZvbGRlciBzdGlsbCByZWZlcmVuY2VzLlxuICpcbiAqIERlbGV0aW5nIGEgTk9URSBpcyBhbHJlYWR5IHNhZmU6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGRpc2NvdW50cyB0aGUgZGVsZXRlZCBub3RlJ3Mgb3duIGJhY2tsaW5rcywgc2Vlc1xuICogYW5vdGhlciBub3RlIHN0aWxsIHJlZmVyZW5jaW5nIHRoZSBhdHRhY2htZW50LCBhbmQga2VlcHMgaXQuIERlbGV0aW5nIGEgRk9MREVSIHdhcyBub3QsIGJlY2F1c2VcbiAqIHtAbGluayBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50fSBvbmx5IGxpc3RlbnMgKGB2YXVsdC5vbignZGVsZXRlJylgKSBhbmQgYnkgdGhlIHRpbWUgYSBmb2xkZXIgZGVsZXRpb25cbiAqIGlzIHJlcG9ydGVkIGl0cyBjaGlsZHJlbiBhcmUgYWxyZWFkeSBnb25lLiBOb3RoaW5nIHJlYWN0aXZlIGNhbiBoZWxwLCBzbyB0aGlzIGNvbXBvbmVudCBpbnRlcmNlcHRzIHRoZVxuICogZGVsZXRpb24gcHJpbWl0aXZlcyBpbnN0ZWFkOiBgRmlsZU1hbmFnZXIudHJhc2hGaWxlYCAod2hhdCB0aGUgZmlsZS1leHBsb3JlciBEZWxldGUgZmxvdyByZWFjaGVzIHRocm91Z2hcbiAqIGBwcm9tcHRGb3JEZWxldGlvbmApIHBsdXMgdGhlIHJhdyBgVmF1bHQuZGVsZXRlYCAvIGBWYXVsdC50cmFzaGAgYSBwbHVnaW4gbWF5IGNhbGwgZGlyZWN0bHkuXG4gKlxuICogQSBmb2xkZXIgZGVsZXRpb24gaXMgc2Nhbm5lZCBmaXJzdC4gV2hlbiBub3RoaW5nIGluc2lkZSBpdCBpcyBzdGlsbCByZWZlcmVuY2VkIGZyb20gb3V0c2lkZSDigJQgdGhlXG4gKiBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgb2YgZGVsZXRpb25zIOKAlCB0aGUgb3JpZ2luYWwgcnVucyB1bnRvdWNoZWQsIHNvIHRoZSBuYXRpdmUgYmVoYXZpb3IgaXMgcHJlc2VydmVkXG4gKiBleGFjdGx5LiBPbmx5IHdoZW4gc29tZXRoaW5nIHdvdWxkIGJlIGxvc3QgZG9lcyB0aGlzIHRha2Ugb3ZlciwgcmVwbGF5aW5nIHRoZSBkZWxldGlvbiB0aHJvdWdoXG4gKiB7QGxpbmsgZGVsZXRlSWZOb3RVc2VkfTogZXZlcnl0aGluZyBlbHNlIGluIHRoZSBmb2xkZXIgZ29lcywgdGhlIHN0aWxsLXJlZmVyZW5jZWQgYXR0YWNobWVudHMgYW5kIHRoZVxuICogZm9sZGVycyBob2xkaW5nIHRoZW0gc3RheSwgYW5kIHRoZSBgYXR0YWNobWVudElzU3RpbGxVc2VkYCBub3RpY2UgZmlyZXMsIG1pcnJvcmluZyB0aGUgbm90ZSBjYXNlLlxuICpcbiAqIEZpbGVzIGFyZSBuZXZlciBpbnRlcmNlcHRlZCDigJQgZGVsZXRpbmcgYSBmaWxlIGlzIHRoZSB1c2VyIG5hbWluZyB0aGF0IGZpbGUgZXhwbGljaXRseS5cbiAqL1xuY2xhc3MgRGVsZXRlUHJvdGVjdGlvblBhdGNoQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUm9vdHMgb2YgdGhlIGZvbGRlciBkZWxldGlvbnMgY3VycmVudGx5IGJlaW5nIHJlcGxheWVkLiBUaGUgcmVwbGF5IGRlbGV0ZXMgdGhyb3VnaCB0aGUgVU5QQVRDSEVEXG4gICAqIG9yaWdpbmFsLCBzbyBpdCBjYW5ub3QgcmUtZW50ZXIgdGhpcyBjb21wb25lbnQgZGlyZWN0bHkg4oCUIGJ1dCBgRmlsZU1hbmFnZXIudHJhc2hGaWxlYCBpdHNlbGYgY2FsbHMgZG93blxuICAgKiBpbnRvIGBWYXVsdC50cmFzaGAgLyBgVmF1bHQuZGVsZXRlYCwgd2hpY2ggYXJlIHBhdGNoZWQgdG9vLCBhbmQgcmUtc2Nhbm5pbmcgYSBzdWJ0cmVlIGFscmVhZHkgYmVpbmdcbiAgICogd2Fsa2VkIGlzIHB1cmUgd2FzdGUuIFNjb3BlZCBieSBwYXRoIHJhdGhlciB0aGFuIGJ5IGEgZmxhZyBzbyB0aGF0IGFuIHVucmVsYXRlZCBmb2xkZXIgZGVsZXRpb25cbiAgICogaW50ZXJsZWF2aW5nIG9uIGFuIGBhd2FpdGAgaXMgc3RpbGwgcHJvdGVjdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXBsYXllZEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3RyYXNoRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaEZpbGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSwgb3JpZ2luYWxNZXRob2RCb3VuZCB9KSA9PlxuICAgICAgICB0aGlzLmhhbmRsZURlbGV0aW9uKGZpbGUsIGZhbGxiYWNrLCBhc3luYyAoYWJzdHJhY3RGaWxlKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxNZXRob2RCb3VuZChhYnN0cmFjdEZpbGUpO1xuICAgICAgICB9KVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBmb3JjZV0sIG9yaWdpbmFsTWV0aG9kQm91bmQgfSkgPT5cbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgYXN5bmMgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsTWV0aG9kQm91bmQoYWJzdHJhY3RGaWxlLCBmb3JjZSk7XG4gICAgICAgIH0pXG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlLCBzeXN0ZW1dLCBvcmlnaW5hbE1ldGhvZEJvdW5kIH0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRpb24oZmlsZSwgZmFsbGJhY2ssIGFzeW5jIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbE1ldGhvZEJvdW5kKGFic3RyYWN0RmlsZSwgc3lzdGVtKTtcbiAgICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyB0aGUgcGF0aHMgb2YgZXZlcnkgbm90ZSBpbnNpZGUgdGhlIGZvbGRlci4gVGhleSBhcmUgdGhlIGxpbmsgc291cmNlcyB0aGF0IGRpc2FwcGVhciBhbG9uZyB3aXRoXG4gICAqIHRoZSBmb2xkZXIsIHNvIHRoZWlyIGJhY2tsaW5rcyBtdXN0IG5vdCBrZWVwIGFuIGF0dGFjaG1lbnQgYWxpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBmb2xkZXIgLSBUaGUgZm9sZGVyIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBhZ2dyZWdhdGVkIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHBhdGhzIG9mIHRoZSBub3RlcyBpbnNpZGUgdGhlIGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgY29sbGVjdERlbGV0ZWROb3RlUGF0aHMoZm9sZGVyOiBURm9sZGVyLCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogU2V0PHN0cmluZz4ge1xuICAgIGNvbnN0IGRlbGV0ZWROb3RlUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUoY2hpbGQpICYmIChzZXR0aW5ncy5pc05vdGU/LihjaGlsZC5wYXRoKSA/PyBmYWxzZSkpIHtcbiAgICAgICAgZGVsZXRlZE5vdGVQYXRocy5hZGQoY2hpbGQucGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlbGV0ZWROb3RlUGF0aHM7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGF0dGFjaG1lbnRzIGluc2lkZSB0aGUgZm9sZGVyIHRoYXQgYSBub3RlIG91dHNpZGUgaXQgc3RpbGwgcmVmZXJlbmNlcywgYW5kIHdvdWxkIHRoZXJlZm9yZSBiZVxuICAgKiBkZXN0cm95ZWQgYnkgZGVsZXRpbmcgdGhlIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgYmVpbmcgZGVsZXRlZC5cbiAgICogQHBhcmFtIGRlbGV0ZWROb3RlUGF0aHMgLSBUaGUgcGF0aHMgb2YgdGhlIG5vdGVzIHRoYXQgZGlzYXBwZWFyIGFsb25nIHdpdGggdGhlIGZvbGRlci5cbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgcGF0aHMgb2YgdGhlIGF0dGFjaG1lbnRzIHRoYXQgbXVzdCBzdXJ2aXZlIHRoZSBkZWxldGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZFN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocyhcbiAgICBmb2xkZXI6IFRGb2xkZXIsXG4gICAgZGVsZXRlZE5vdGVQYXRoczogU2V0PHN0cmluZz4sXG4gICAgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPlxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgY2FuZGlkYXRlRmlsZXM6IFRGaWxlW10gPSBbXTtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4oZm9sZGVyLCAoY2hpbGQpID0+IHtcbiAgICAgIGlmIChpc0ZpbGUoY2hpbGQpICYmICEoc2V0dGluZ3MuaXNOb3RlPy4oY2hpbGQucGF0aCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIGNhbmRpZGF0ZUZpbGVzLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVGaWxlIG9mIGNhbmRpZGF0ZUZpbGVzKSB7XG4gICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGNhbmRpZGF0ZUZpbGUgfSk7XG4gICAgICBmb3IgKGNvbnN0IGRlbGV0ZWROb3RlUGF0aCBvZiBkZWxldGVkTm90ZVBhdGhzKSB7XG4gICAgICAgIGJhY2tsaW5rcy5jbGVhcihkZWxldGVkTm90ZVBhdGgpO1xuICAgICAgfVxuICAgICAgaWYgKGJhY2tsaW5rcy5jb3VudCgpICE9PSAwKSB7XG4gICAgICAgIHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocy5wdXNoKGNhbmRpZGF0ZUZpbGUucGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0aWxsVXNlZEF0dGFjaG1lbnRQYXRocztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZWxldGlvbiBuZWVkcyBwcm90ZWN0aW5nIGFuZCwgaWYgc28sIHJlcGxhY2VzIGl0IHdpdGggYSBwcm90ZWN0ZWQgcmVwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIGJlaW5nIGRlbGV0ZWQuXG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIEludm9rZXMgdGhlIGludGVyY2VwdGVkIG1ldGhvZCB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSBkZWxldGVBYnN0cmFjdEZpbGUgLSBEZWxldGVzIGEgc2luZ2xlIGFic3RyYWN0IGZpbGUgdGhyb3VnaCB0aGUgaW50ZXJjZXB0ZWQgbWV0aG9kJ3MgdW5wYXRjaGVkIG9yaWdpbmFsLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRlbGV0aW9uIGlzIGRvbmUuXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZURlbGV0aW9uKFxuICAgIGZpbGU6IFRBYnN0cmFjdEZpbGUsXG4gICAgZmFsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZGVsZXRlQWJzdHJhY3RGaWxlOiAoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNob3VsZENvbnNpZGVyRm9sZGVyKGZpbGUpID8gdGhpcy5yZXBsYXlGb2xkZXJEZWxldGlvbihmaWxlLCBmYWxsYmFjaywgZGVsZXRlQWJzdHJhY3RGaWxlKSA6IGZhbGxiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgZm9sZGVyIHdoaWxlIGtlZXBpbmcgd2hhdGV2ZXIgaW5zaWRlIGl0IGlzIHN0aWxsIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciBiZWluZyBkZWxldGVkLlxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBJbnZva2VzIHRoZSBpbnRlcmNlcHRlZCBtZXRob2QgdW5jaGFuZ2VkLlxuICAgKiBAcGFyYW0gZGVsZXRlQWJzdHJhY3RGaWxlIC0gRGVsZXRlcyBhIHNpbmdsZSBhYnN0cmFjdCBmaWxlIHRocm91Z2ggdGhlIGludGVyY2VwdGVkIG1ldGhvZCdzIHVucGF0Y2hlZCBvcmlnaW5hbC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWxldGlvbiBpcyBkb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXBsYXlGb2xkZXJEZWxldGlvbihcbiAgICBmb2xkZXI6IFRGb2xkZXIsXG4gICAgZmFsbGJhY2s6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICAgZGVsZXRlQWJzdHJhY3RGaWxlOiAoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKSA9PiBQcm9taXNlPHZvaWQ+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBjb25zdCBkZWxldGVkTm90ZVBhdGhzID0gdGhpcy5jb2xsZWN0RGVsZXRlZE5vdGVQYXRocyhmb2xkZXIsIHNldHRpbmdzKTtcbiAgICBjb25zdCBzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMgPSBhd2FpdCB0aGlzLmZpbmRTdGlsbFVzZWRBdHRhY2htZW50UGF0aHMoZm9sZGVyLCBkZWxldGVkTm90ZVBhdGhzLCBzZXR0aW5ncyk7XG5cbiAgICBpZiAoc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkZWxldGVQcm90ZWN0aW9uJykoYE5vdGhpbmcgdG8gcHJvdGVjdCBpbiAke2ZvbGRlci5wYXRofTsgZGVsZXRpbmcgaXQgYXMgdXN1YWwuYCk7XG4gICAgICBhd2FpdCBmYWxsYmFjaygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZGVsZXRlUHJvdGVjdGlvbicpKFxuICAgICAgYFByb3RlY3RpbmcgJHtzdGlsbFVzZWRBdHRhY2htZW50UGF0aHMubGVuZ3RoLnRvU3RyaW5nKCl9IHN0aWxsLXJlZmVyZW5jZWQgYXR0YWNobWVudChzKSBmcm9tIHRoZSBkZWxldGlvbiBvZiAke2ZvbGRlci5wYXRofTogJHt0b0pzb24oc3RpbGxVc2VkQXR0YWNobWVudFBhdGhzKX1gXG4gICAgKTtcblxuICAgIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocy5hZGQoZm9sZGVyLnBhdGgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBkZWxldGVBYnN0cmFjdEZpbGUsXG4gICAgICAgIGRlbGV0ZWROb3RlUGF0aHM6IFsuLi5kZWxldGVkTm90ZVBhdGhzXSxcbiAgICAgICAgcGF0aE9yRmlsZTogZm9sZGVyLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNjdWVTdGlsbFVzZWRGaWxlOiB0aGlzLnJlc2N1ZVN0aWxsVXNlZEZpbGUuYmluZCh0aGlzKSxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHVzZXIgbmFtZWQgVEhJUyBmb2xkZXIsIHNvIGl0IGdvZXMgZXZlbiB1bmRlciBgRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwYCDigJQgdGhhdCBzZXR0aW5nXG4gICAgICAgICAqIGdvdmVybnMgZm9sZGVycyBlbXB0aWVkIGluY2lkZW50YWxseSwgbm90IHRoZSBvbmUgZXhwbGljaXRseSBkZWxldGVkLiBgZGVsZXRlSWZOb3RVc2VkYCBzdGlsbFxuICAgICAgICAgKiByZWZ1c2VzIHRvIHJlbW92ZSBhbnkgZm9sZGVyIHdob3NlIGNoaWxkIGhhZCB0byBiZSBrZXB0LCB3aGljaCBpcyB0aGUgcHJvdGVjdGlvbiB3YW50ZWQgaGVyZS5cbiAgICAgICAgICovXG4gICAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogdHJ1ZSxcbiAgICAgICAgLypcbiAgICAgICAgICogQSBub3RlIHRoYXQgb3RoZXJzIGxpbmsgdG8gaXMgZGVsZXRlZCBhcyBub3JtYWw7IE9ic2lkaWFuIGxlYXZlcyB0aGUgZGFuZ2xpbmcgbGluay4gUHJvdGVjdGluZ1xuICAgICAgICAgKiBub3RlcyB0b28gd291bGQgbWFrZSBkZWxldGluZyBhIGZvbGRlciBvZiBsaW5rZWQtdG8gbm90ZXMgaW1wb3NzaWJsZS5cbiAgICAgICAgICovXG4gICAgICAgIHNob3VsZFByb3RlY3RJZlN0aWxsVXNlZDogKGNhbmRpZGF0ZUZpbGUpID0+ICEoc2V0dGluZ3MuaXNOb3RlPy4oY2FuZGlkYXRlRmlsZS5wYXRoKSA/PyBmYWxzZSlcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnJlcGxheWVkRm9sZGVyUGF0aHMuZGVsZXRlKGZvbGRlci5wYXRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2N1ZVN0aWxsVXNlZEZpbGUocmVzY3VlUGFyYW1zOiBSZXNjdWVTdGlsbFVzZWRGaWxlUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNjdWVQYXJhbXMsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBkZWxldGlvbiBpcyBhIGZvbGRlciBkZWxldGlvbiB0aGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHByb3RlY3RpbmcuXG4gICAqXG4gICAqIEV2ZXJ5IGNoZWNrIGhlcmUgaXMgc3luY2hyb25vdXMgYW5kIGNoZWFwLCBzbyBhIGZpbGUgZGVsZXRpb24g4oCUIHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHkg4oCUIGNvc3RzIG9uZVxuICAgKiB7QGxpbmsgaXNGb2xkZXJ9IGNhbGwgYW5kIHJlYWNoZXMgdGhlIG9yaWdpbmFsIHVudG91Y2hlZC5cbiAgICpcbiAgICogQHBhcmFtIGZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSBiZWluZyBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGVsZXRpb24gc2hvdWxkIGJlIHNjYW5uZWQgYmVmb3JlIGl0IHJ1bnMuXG4gICAqL1xuICBwcml2YXRlIHNob3VsZENvbnNpZGVyRm9sZGVyKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiBmaWxlIGlzIFRGb2xkZXIge1xuICAgIGlmICghaXNGb2xkZXIoZmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgfHwgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihmaWxlLnBhdGgpID8/IGZhbHNlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVwbGF5ZWRGb2xkZXJQYXRoIG9mIHRoaXMucmVwbGF5ZWRGb2xkZXJQYXRocykge1xuICAgICAgaWYgKGlzQ2hpbGRPclNlbGYoeyBhcHA6IHRoaXMuYXBwLCBjaGlsZFBhdGhPckZpbGU6IGZpbGUucGF0aCwgcGFyZW50UGF0aE9yRmlsZTogcmVwbGF5ZWRGb2xkZXJQYXRoIH0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5jbGFzcyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSByZW5hbWUgd2hvc2UgYHJ1bkFzeW5jTGlua1VwZGF0ZWAgc25hcHNob3QgaXMgYWJvdXQgdG8gYmUgdGFrZW46IHNldCB3aGVuIE9ic2lkaWFuJ3MgYG9uQ2xlYW5DYWNoZWBcbiAgICogY2FsbGJhY2sgZm9yIHRoYXQgc25hcHNob3QgZmlyZXMsIGNvbnN1bWVkIGJ5IHRoZSB2ZXJ5IG5leHQgYGl0ZXJhdGVBbGxSZWZzYCBjYWxsLCB3aGljaCBpcyB0aGUgc25hcHNob3QuXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVNuYXBzaG90UmVuYW1lOiBudWxsIHwgUGVuZGluZ1JlbmFtZSA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU1hbmFnZXI6IEZpbGVNYW5hZ2VyO1xuICAvKipcbiAgICogVGhlIHJlbmFtZSBgZmlsZU1hbmFnZXIucmVuYW1lRmlsZWAgaXMgcGVyZm9ybWluZywgcmVjb3JkZWQgZm9yIHRoZSBgcnVuQXN5bmNMaW5rVXBkYXRlYCBjYWxsIGl0IG1ha2VzXG4gICAqIHN5bmNocm9ub3VzbHksIHdoaWNoIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGNhbm5vdCBvdGhlcndpc2UgdGVsbCB3aGF0IGlzIGJlaW5nIHJlbmFtZWQuXG4gICAqL1xuICBwcml2YXRlIHBlbmRpbmdSZW5hbWU6IG51bGwgfCBQZW5kaW5nUmVuYW1lID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGVNYW5hZ2VyID0gcGFyYW1zLmZpbGVNYW5hZ2VyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IHRoaXMuZmlsZU1hbmFnZXIsXG4gICAgICBtZXRob2ROYW1lOiAncnVuQXN5bmNMaW5rVXBkYXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHtcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIG9yaWdpbmFsQXJndW1lbnRzOiBbbGlua1VwZGF0ZXNIYW5kbGVyXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyID0gKGxpbmtVcGRhdGVzKSA9PiB0aGlzLndyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMsIGxpbmtVcGRhdGVzSGFuZGxlcik7XG4gICAgICAgIGNvbnN0IHJlbmFtZSA9IHRoaXMucGVuZGluZ1JlbmFtZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVuYW1lID0gbnVsbDtcbiAgICAgICAgLy8gV2l0aCBgaW5Qcm9ncmVzc1VwZGF0ZXNgIHNldCwgT2JzaWRpYW4gcXVldWVzIHRoZSBoYW5kbGVyIG9udG8gdGhlIHJ1bm5pbmcgdXBkYXRlIGFuZCB0YWtlcyBubyBzbmFwc2hvdC5cbiAgICAgICAgcmV0dXJuICFyZW5hbWUgfHwgdGhpcy5maWxlTWFuYWdlci5pblByb2dyZXNzVXBkYXRlcyA/IG9yaWdpbmFsTWV0aG9kQm91bmQobmV3SGFuZGxlcikgOiB0aGlzLndpdGhOYXJyb3dlZFNuYXBzaG90KHJlbmFtZSwgKCkgPT4gb3JpZ2luYWxNZXRob2RCb3VuZChuZXdIYW5kbGVyKSk7XG4gICAgICB9LFxuICAgICAgLypcbiAgICAgICAqIFN1cHByZXNzaW5nIE9ic2lkaWFuJ3Mgb3duIGxpbmsgdXBkYXRlcyBpcyBOT1QgaWRlbXBvdGVudCwgc28gdHdvIGxpdmUgY29waWVzIG9mIHRoaXMgY29tcG9uZW50XG4gICAgICAgKiB3b3VsZCBmaWdodCBvdmVyIHRoZSBzYW1lIG1ldGhvZC4gYFBBVENIX1RPS0VOYCBpcyBhIGBTeW1ib2wuZm9yYCBhbmQgdGhlIHRva2VuIHJlZ2lzdHJ5IGlzXG4gICAgICAgKiBgZ2V0T2JzaWRpYW5MaWJTdGF0ZWAtYmFja2VkLCBzbyB0aGUgYXJiaXRyYXRpb24gc3BhbnMgaW5kZXBlbmRlbnRseSBidW5kbGVkIGNvcGllcyBvZiB0aGlzXG4gICAgICAgKiBsaWJyYXJ5OiB0aGUgZmlyc3QgcGF0Y2hlciBzdGF5cyBsaXZlLCBhIGNvcHkgdGhhdCBwYXRjaGVzIGFmdGVyd2FyZHMgc2VlcyB0aGUgdG9rZW4gb24gaXRzIG93blxuICAgICAgICogYG9yaWdpbmFsTWV0aG9kYCBhbmQgZGVmZXJzIHZpYSB0aGUgZ3VhcmQgYWJvdmUsIGFuZCBpdCB0YWtlcyBvdmVyIG9uIGl0cyBuZXh0IGNhbGwgb25jZSB0aGVcbiAgICAgICAqIGxlYWRlciB1bmxvYWRzIGFuZCB0aGUgdG9rZW4gaXMgZHJvcHBlZC5cbiAgICAgICAqXG4gICAgICAgKiBUaGlzIGFyYml0cmF0ZXMgdGhlIFBBVENIIG9ubHkuIFRoZSBjb21wb25lbnQncyBgdmF1bHQub24oJ3JlbmFtZScgfCAnZGVsZXRlJylgIGFuZFxuICAgICAgICogYG1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnKWAgbGlzdGVuZXJzIGhhdmUgbm8gZXF1aXZhbGVudCBndWFyZCDigJQgdGhlIHBsdWdpbi1yZWdpc3RyeSBlbGVjdGlvblxuICAgICAgICogdGhhdCB1c2VkIHRvIHByb3ZpZGUgb25lIHdlbnQgd2l0aCB0aGUgbXVsdGktcGx1Z2luIG1hY2hpbmVyeSDigJQgc28gdHdvIGxpdmUgY29waWVzIHdvdWxkIGJvdGhcbiAgICAgICAqIGhhbmRsZSBhbiBldmVudC4gV2l0aCBvbmUgb3duZXIgdGhhdCBjYW5ub3QgYXJpc2U7IGEgY29uc3VtZXIgdGhhdCBtdXN0IGd1YXJhbnRlZSBpdCByZWZ1c2VzIHRvXG4gICAgICAgKiBsb2FkIGJlc2lkZSBhIGNvbmZsaWN0aW5nIHZlcnNpb24uXG4gICAgICAgKlxuICAgICAgICogVGhhdCByZWZ1c2FsIHVzZWQgdG8gYmUgZGVzY3JpYmVkIGhlcmUgYXMgXCJhIHBsdWdpbidzIGpvYiByYXRoZXIgdGhhbiBhIGxpYnJhcnknc1wiLCB3aGljaCBpcyBub1xuICAgICAgICogbG9uZ2VyIHRydWUg4oCUIGBQbHVnaW5CYXNlLmdldFBsdWdpbkRlcGVuZGVuY2llc2AgaXMgd2hlcmUgYSBjb25zdW1lciBkZWNsYXJlcyBpdCwgYW5kIHRoZVxuICAgICAgICogYGFwaVZlcnNpb25SYW5nZWAgaXQgbmFtZXMgaXMgZXhhY3RseSB0aGUgY29uZmxpY3RpbmctdmVyc2lvbiBndWFyZC4gVGhlIGxpYnJhcnkgb3ducyB0aGVcbiAgICAgICAqIG1lY2hhbmlzbTsgdGhlIHBsdWdpbiBzdGlsbCBvd25zIHRoZSBkZWNpc2lvbiB0byB1c2UgaXQuXG4gICAgICAgKi9cbiAgICAgIHBhdGNoVG9rZW46IFBBVENIX1RPS0VOXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5maWxlTWFuYWdlcixcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWVGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHtcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgbmV3UGF0aF0sXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kLFxuICAgICAgICBvcmlnaW5hbE1ldGhvZEJvdW5kXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGlmIChoYXNQYXRjaFRva2VuKG9yaWdpbmFsTWV0aG9kLCBQQVRDSF9UT0tFTikgfHwgIWlzRmlsZShmaWxlKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYHJlbmFtZUZpbGVgIGNhbGxzIGBydW5Bc3luY0xpbmtVcGRhdGVgIHN5bmNocm9ub3VzbHksIHdoaWNoIHBpY2tzIHRoaXMgdXAgYW5kIGNsZWFycyBpdC5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVuYW1lID0geyBmaWxlLCBuZXdQYXRoIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kQm91bmQoZmlsZSwgbmV3UGF0aCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nUmVuYW1lID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBhdGNoVG9rZW46IFBBVENIX1RPS0VOXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogdGhpcy5hcHAubWV0YWRhdGFDYWNoZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdpdGVyYXRlQWxsUmVmcycsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7XG4gICAgICAgIGZhbGxiYWNrLFxuICAgICAgICBvcmlnaW5hbEFyZ3VtZW50czogW2NhbGxiYWNrXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2RcbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3QgcmVuYW1lID0gdGhpcy5hY3RpdmVTbmFwc2hvdFJlbmFtZTtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSB8fCAhcmVuYW1lKSB7XG4gICAgICAgICAgZmFsbGJhY2soKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZVNuYXBzaG90UmVuYW1lID0gbnVsbDtcbiAgICAgICAgaXRlcmF0ZVJlZmVyZW5jZXNBZmZlY3RlZEJ5UmVuYW1lKHRoaXMuYXBwLCByZW5hbWUuZmlsZSwgcmVuYW1lLm5ld1BhdGgsIGNhbGxiYWNrKTtcbiAgICAgIH0sXG4gICAgICBwYXRjaFRva2VuOiBQQVRDSF9UT0tFTlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYHJ1bkFzeW5jTGlua1VwZGF0ZWAgc28gdGhhdCBpdHMgc25hcHNob3Qgb2YgcmVzb2x2ZWQgcmVmZXJlbmNlcyBjb3ZlcnMgb25seSB0aGUgcmVmZXJlbmNlcyB0aGUgcmVuYW1lXG4gICAqIGNhbiBhZmZlY3QgKHtAbGluayBpdGVyYXRlUmVmZXJlbmNlc0FmZmVjdGVkQnlSZW5hbWV9KSBpbnN0ZWFkIG9mIGV2ZXJ5IHJlZmVyZW5jZSBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIE9ic2lkaWFuJ3MgYHJ1bkFzeW5jTGlua1VwZGF0ZWAgcXVldWVzIGEgdGFzayBvbiBgZmlsZU1hbmFnZXIudXBkYXRlUXVldWVgLiBUaGUgdGFzayB3YWl0cyBmb3JcbiAgICogYG1ldGFkYXRhQ2FjaGUub25DbGVhbkNhY2hlYCwgdGhlbiBjYWxscyBgbWV0YWRhdGFDYWNoZS5pdGVyYXRlQWxsUmVmc2Agb25jZSB0byB0YWtlIHRoZSBzbmFwc2hvdCwgdGhlbiBydW5zIHRoZVxuICAgKiBoYW5kbGVyIHRoYXQgcmVuYW1lcy4gVGhlIHF1ZXVlZCB0YXNrIGlzIHdyYXBwZWQgc28gdGhhdCB0aGUgYG9uQ2xlYW5DYWNoZWAgY2FsbGJhY2sgaXQgcmVnaXN0ZXJzLCBhbmQgb25seVxuICAgKiB0aGF0IG9uZSwgYXJtcyB0aGUgbmFycm93aW5nLCB3aGljaCB0aGUgYGl0ZXJhdGVBbGxSZWZzYCBwYXRjaCBjb25zdW1lcyBvbiB0aGUgbmV4dCBjYWxsLiBCb3RoIHRlbXBvcmFyeSBzd2Fwc1xuICAgKiBhcmUgdW5kb25lIHN5bmNocm9ub3VzbHksIGJlZm9yZSBhbnl0aGluZyBlbHNlIGNhbiBjYWxsIGVpdGhlciBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSByZW5hbWUgLSBUaGUgcmVuYW1lIGJlaW5nIHBlcmZvcm1lZC5cbiAgICogQHBhcmFtIGNhbGxPcmlnaW5hbCAtIENhbGxzIE9ic2lkaWFuJ3MgYHJ1bkFzeW5jTGlua1VwZGF0ZWAuXG4gICAqIEByZXR1cm5zIFdoYXQgYHJ1bkFzeW5jTGlua1VwZGF0ZWAgcmV0dXJucy5cbiAgICovXG4gIHByaXZhdGUgd2l0aE5hcnJvd2VkU25hcHNob3QocmVuYW1lOiBQZW5kaW5nUmVuYW1lLCBjYWxsT3JpZ2luYWw6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cGRhdGVRdWV1ZSA9IHRoaXMuZmlsZU1hbmFnZXIudXBkYXRlUXVldWU7XG4gICAgY29uc3QgbWV0YWRhdGFDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGU7XG4gICAgY29uc3Qgb3JpZ2luYWxRdWV1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodXBkYXRlUXVldWUsICdxdWV1ZScpO1xuICAgIGNvbnN0IHF1ZXVlID0gdXBkYXRlUXVldWUucXVldWUuYmluZCh1cGRhdGVRdWV1ZSk7XG5cbiAgICB1cGRhdGVRdWV1ZS5xdWV1ZSA9IDxUPih0YXNrOiAoKSA9PiBQcm9taXNlPFQ+IHwgVCk6IFByb21pc2U8VD4gPT5cbiAgICAgIHF1ZXVlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxPbkNsZWFuQ2FjaGUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1ldGFkYXRhQ2FjaGUsICdvbkNsZWFuQ2FjaGUnKTtcbiAgICAgICAgY29uc3Qgb25DbGVhbkNhY2hlID0gbWV0YWRhdGFDYWNoZS5vbkNsZWFuQ2FjaGUuYmluZChtZXRhZGF0YUNhY2hlKTtcbiAgICAgICAgbWV0YWRhdGFDYWNoZS5vbkNsZWFuQ2FjaGUgPSAob25DbGVhbkNhY2hlQ2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkID0+IHtcbiAgICAgICAgICBvbkNsZWFuQ2FjaGUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTbmFwc2hvdFJlbmFtZSA9IHJlbmFtZTtcbiAgICAgICAgICAgIG9uQ2xlYW5DYWNoZUNhbGxiYWNrKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCByZXN1bHQ6IFByb21pc2U8VD4gfCBUO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IHRhc2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZXN0b3JlUHJvcGVydHkobWV0YWRhdGFDYWNoZSwgJ29uQ2xlYW5DYWNoZScsIG9yaWdpbmFsT25DbGVhbkNhY2hlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVTbmFwc2hvdFJlbmFtZSA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxPcmlnaW5hbCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXN0b3JlUHJvcGVydHkodXBkYXRlUXVldWUsICdxdWV1ZScsIG9yaWdpbmFsUXVldWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JhcExpbmtVcGRhdGVzSGFuZGxlcihsaW5rVXBkYXRlczogTGlua1VwZGF0ZVtdLCBsaW5rVXBkYXRlc0hhbmRsZXI6IExpbmtVcGRhdGVzSGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpc1JlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGxldCBpc0ZvcmVpZ25Mb2NrZWRSZW5hbWVDYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBldmVudFJlZiA9IHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCAoZmlsZSwgb2xkUGF0aCkgPT4ge1xuICAgICAgaXNSZW5hbWVDYWxsZWQgPSB0cnVlO1xuICAgICAgLypcbiAgICAgICAqIEEgcmVuYW1lIHBlcmZvcm1lZCBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gYEFkdmFuY2VkIE5vdGUgQ29tcG9zZXJgJ3MgZm9sZGVyIG1lcmdlKSBpcyBvd25lZCBieSB0aGF0XG4gICAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gVGhpcyBoYW5kbGVyIGRlbGliZXJhdGVseSBkb2VzXG4gICAgICAgKiBOT1QgcmV3cml0ZSBsaW5rcyBmb3IgaXQsIHNvIHN1cHByZXNzaW5nIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIGJlbG93IHdvdWxkIGxlYXZlIHRoZVxuICAgICAgICogbGlua3MgZGFuZ2xpbmcuIExldCB0aGUgbmF0aXZlIHVwZGF0ZSBwcm9jZWVkIHVudG91Y2hlZC4gU2VlXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAgICovXG4gICAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBmaWxlLnBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkpIHtcbiAgICAgICAgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHNvdXJjZSBmaWxlICR7bGlua1VwZGF0ZS5zb3VyY2VGaWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKGxpbmtVcGRhdGUucmVzb2x2ZWRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiByZXNvbHZlZCBmaWxlICR7bGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykgIT09IG51bGwgJiYgIWhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4odGhpcy5hcHApXG4gICAgICAgICAgJiYgKGxpbmtVcGRhdGUuc291cmNlRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTiB8fCBsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5leHRlbnNpb24gPT09IENBTlZBU19GSUxFX0VYVEVOU0lPTik7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5jbGFzcyBIYW5kbGVkUmVuYW1lcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIEhhbmRsZWRSZW5hbWVLZXk+KCk7XG5cbiAgcHVibGljIGFkZChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldCh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpLCB7IG5ld1BhdGgsIG9sZFBhdGggfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuZGVsZXRlKHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCkpO1xuICB9XG5cbiAgcHVibGljIGhhcyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXModGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPEhhbmRsZWRSZW5hbWVLZXk+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAudmFsdWVzKCk7XG4gIH1cblxuICBwcml2YXRlIGtleVRvU3RyaW5nKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWA7XG4gIH1cbn1cblxuY2xhc3MgTWV0YWRhdGFEZWxldGVkSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXZpb3VzQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gcGFyYW1zLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMucHJldmlvdXNDYWNoZSA9IHBhcmFtcy5wcmV2aW91c0NhY2hlO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGUoKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZpb3VzQ2FjaGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KHRoaXMuZmlsZS5wYXRoLCB0aGlzLnByZXZpb3VzQ2FjaGUpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9sZFBhdGggPT09IHRoaXMubmV3UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvKlxuICAgICAqIFRoZSByZW5hbWUgdGhhdCB0cmlnZ2VyZWQgdGhpcyBoYW5kbGVyIGlzIHZlcnkgbGlrZWx5IHN0aWxsIGluc2lkZSBPYnNpZGlhbidzIG93blxuICAgICAqIGBGaWxlTWFuYWdlci5ydW5Bc3luY0xpbmtVcGRhdGVgIGN5Y2xlLCB3aGljaCBpcyBhYm91dCB0byBkZWNpZGUg4oCUIHN5bmNocm9ub3VzbHkg4oCUIHdoaWNoIGxpbmtzIHRvXG4gICAgICogcmV3cml0ZSwgYnkgcmUtcmVzb2x2aW5nIGVhY2ggb25lLiBFdmVyeXRoaW5nIGJlbG93IHRlbXBvcmFyaWx5IHJlZ2lzdGVycyBhIHBoYW50b20gZmlsZSBhdCB0aGVcbiAgICAgKiBvbGQgcGF0aCAoYHJlZ2lzdGVyRmlsZXNgLCBkaXJlY3RseSBoZXJlIGFuZCBpbnNpZGUgYFJlbmFtZU1hcGApIGFuZCBob2xkcyBpdCBhY3Jvc3MgYW4gYGF3YWl0YDtcbiAgICAgKiBzZWVuIG1pZC1kZWNpc2lvbiwgdGhhdCBwaGFudG9tIG1ha2VzIHRoZSBvbGQgcGF0aCBzdGlsbCByZXNvbHZlLCBzbyBPYnNpZGlhbiBjb25jbHVkZXMgbm90aGluZ1xuICAgICAqIGNoYW5nZWQgYW5kIHJld3JpdGVzIG5vdGhpbmcuIFN0YW5kaW5nIGludmFyaWFudDogbmV2ZXIgdG91Y2ggdGhlIHZhdWx0IGluZGV4IHdoaWxlIE9ic2lkaWFuIGlzXG4gICAgICogbWlkLWRlY2lzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy80Ny5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHRoaXMuYXBwKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCB0aGlzLmNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLy8gVGhlIHJlZnJlc2hlZCBiYWNrbGlua3MgZmVlZCBgb2xkUGF0aEJhY2tsaW5rc01hcGAsIHdoaWNoIG9ubHkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdyByZWFkLCBhbmQgdGhvc2UgYXJlIGdhdGVkIG9uIHRoZSBzYW1lIGZsYWcuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCkuc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDYXNlQ29sbGlzaW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkxpYlN0YXRlKCdyZW5hbWVkRmlsZVBhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuICAgIGNvbnN0IHJlbmFtZWRMaW5rcyA9IGdldE9ic2lkaWFuTGliU3RhdGUoJ3JlbmFtZWRMaW5rUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVuYW1lTWFwID0gbmV3IFJlbmFtZU1hcCh7XG4gICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBuZXdQYXRoOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcmVuYW1lTWFwLmZpbGwoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG4gICAgICAvLyBCYWNrbGlua3MgYXJlIG9ubHkgY29uc3VtZWQgYnkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdywgd2hpY2ggYXJlIGdhdGVkIG9uXG4gICAgICAvLyBgc2hvdWxkSGFuZGxlUmVuYW1lc2AuIFNraXAgZ2F0aGVyaW5nIHRoZW0gKGEgYmFja2xpbmsgZmV0Y2ggcGVyIGF0dGFjaG1lbnQpIG9uIGEgbW92ZS1vbmx5IHJlbmFtZS5cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzKSB7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcCk7XG4gICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50T2xkUGF0aCBvZiByZW5hbWVNYXAua2V5cygpKSB7XG4gICAgICAgICAgaWYgKGF0dGFjaG1lbnRPbGRQYXRoID09PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudE9sZFBhdGggfSk7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXAgPSBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rcy5kYXRhO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgICAgIHBhdGg6IGF0dGFjaG1lbnRPbGRQYXRoLFxuICAgICAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgW29sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aF0gb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAob2xkQXR0YWNobWVudFBhdGggIT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgIGNvbnN0IGZpeGVkTmV3QXR0YWNobWVudFBhdGggPSBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQob2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50UGF0aCwgZml4ZWROZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50UGF0aCkpIHtcbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoZGlybmFtZShvbGRBdHRhY2htZW50UGF0aCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCxcbiAgICAgICAgZm9sZGVyUGF0aHM6IFsuLi5wYXJlbnRGb2xkZXJQYXRoc11cbiAgICAgIH0pO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgbW92ZSBhYm92ZSBydW5zIHJlZ2FyZGxlc3Mgb2YgYHNob3VsZEhhbmRsZVJlbmFtZXNgICh0aGF0IGlzIHRoZSBwb2ludCBvZiBkZWNvdXBsaW5nXG4gICAgICAgKiBcIk1vdmUgYXR0YWNobWVudHMgd2l0aCBub3RlXCIgZnJvbSBcIlVwZGF0ZSBsaW5rc1wiKS4gVGhlIHJlbWFpbmluZyBzdGVwcyBvbmx5IHJld3JpdGUgbGlua3MsIHNvIHNraXBcbiAgICAgICAqIHRoZW0gd2hlbiBsaW5rIHVwZGF0ZXMgYXJlIGRpc2FibGVkOyB0aGUgYGZpbmFsbHlgIGJsb2NrIGJlbG93IHN0aWxsIHJ1bnMuXG4gICAgICAgKi9cbiAgICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qXG4gICAgICAgKiBBIHJlc3VtZWQgcmVuYW1lIGJyaW5ncyBpdHMgb3duIHNuYXBzaG90IGFsb25nLiBNZXJnZSBpdCBJTlRPIHRoZSBjdXJyZW50IG9uZSByYXRoZXIgdGhhblxuICAgICAgICogY29uY2F0ZW5hdGluZyB0aGUgdHdvOiBhIGZpbGUgbmFtZWQgYnkgYm90aCB3b3VsZCBvdGhlcndpc2UgYmUgb3BlbmVkIGFuZCByZXdyaXR0ZW4gdHdpY2UsIHdoaWNoIGlzXG4gICAgICAgKiB0aGUgdmVyeSB0aGluZyBhIGNvbWJpbmVkIHNuYXBzaG90IGV4aXN0cyB0byBhdm9pZC4gVGhlIGN1cnJlbnQgcmVuYW1lJ3MgZW50cnkgd2lucyBhIGtleSBjb2xsaXNpb24sXG4gICAgICAgKiBiZWNhdXNlIGl0IGRlc2NyaWJlcyB3aGVyZSB0aGUgdGFyZ2V0IGlzIG5vdy5cbiAgICAgICAqL1xuICAgICAgZm9yIChjb25zdCBbaW50ZXJydXB0ZWRCYWNrbGlua1BhdGgsIGludGVycnVwdGVkTGlua0tleVRvUGF0aE1hcF0gb2YgdGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwKSB7XG4gICAgICAgIGNvbnN0IGxpbmtLZXlUb1BhdGhNYXAgPSBjb21iaW5lZEJhY2tsaW5rc01hcC5nZXQoaW50ZXJydXB0ZWRCYWNrbGlua1BhdGgpO1xuICAgICAgICBpZiAoIWxpbmtLZXlUb1BhdGhNYXApIHtcbiAgICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcC5zZXQoaW50ZXJydXB0ZWRCYWNrbGlua1BhdGgsIGludGVycnVwdGVkTGlua0tleVRvUGF0aE1hcCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtsaW5rS2V5LCBvbGRUYXJnZXRQYXRoXSBvZiBpbnRlcnJ1cHRlZExpbmtLZXlUb1BhdGhNYXApIHtcbiAgICAgICAgICBpZiAoIWxpbmtLZXlUb1BhdGhNYXAuaGFzKGxpbmtLZXkpKSB7XG4gICAgICAgICAgICBsaW5rS2V5VG9QYXRoTWFwLnNldChsaW5rS2V5LCBvbGRUYXJnZXRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbGlua0luZGV4ZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgYXdhaXQgZWRpdEJhY2tsaW5rc1NuYXBzaG90KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXM8c3RyaW5nPj4oe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHJlZmVyZW5jZUNvbnZlcnRlcjogKHsgcGF5bG9hZDogb2xkQXR0YWNobWVudFBhdGgsIHJlZmVyZW5jZSwgc291cmNlUGF0aDogbmV3QmFja2xpbmtQYXRoIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaW5rSW5kZXggPSAobGlua0luZGV4ZXMuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gMCkgKyAxO1xuICAgICAgICAgIGxpbmtJbmRleGVzLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtJbmRleCk7XG5cbiAgICAgICAgICBpZiAoIW9sZEF0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogQSBsaW5rIHRoYXQgaXMgbm90IGluIHRoZSBzbmFwc2hvdCB3YXMgZWl0aGVyIG5ldmVyIG91cnMgdG8gcmV3cml0ZSwgb3Igd2FzIGFscmVhZHlcbiAgICAgICAgICAgICAqIHJld3JpdHRlbiBieSBzb21lb25lIGVsc2UgKGxlYXZpbmcgaXQgY29ycmVjdCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0byBkbyAtXG4gICAgICAgICAgICAgKiBidXQgbG9nIGl0LCBiZWNhdXNlIGEgc2lsZW50IHNraXAgaGVyZSBpcyBleGFjdGx5IGhvd1xuICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy82MCBzdGF5ZWRcbiAgICAgICAgICAgICAqIGludmlzaWJsZTogZXZlcnkgc2tpcHBlZCBsaW5rIGxlZnQgYSBicm9rZW4gZW1iZWQgYW5kIHJlcG9ydGVkIG5vdGhpbmcuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6dXBkYXRlQmFja2xpbmtzJykoXG4gICAgICAgICAgICAgIGBObyBzbmFwc2hvdCBlbnRyeSBmb3IgbGluayAke3RvSnNvbihyZWZlcmVuY2UpfSBpbiAke25ld0JhY2tsaW5rUGF0aH07IGxlYXZpbmcgaXQgdW5jaGFuZ2VkLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbmV3QXR0YWNobWVudFBhdGggPSByZW5hbWVNYXAuZ2V0KG9sZEF0dGFjaG1lbnRQYXRoKSA/PyBvbGRBdHRhY2htZW50UGF0aDtcblxuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgcmVuYW1lZExpbmtzLmFkZChgJHtuZXdCYWNrbGlua1BhdGh9Ly8ke1N0cmluZyhsaW5rSW5kZXgpfWApO1xuXG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50UGF0aCxcbiAgICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2UsXG4gICAgICAgIC8vIFRoZSBjb252ZXJ0ZXIgbG9ncyBldmVyeSBsaW5rIGl0IGRlY2xpbmVzLCBzbyBpdCBoYXMgdG8gYmUgc2hvd24gdGhlIG9uZXMgdGhlIHNuYXBzaG90IGRvZXMgbm90IG5hbWUuXG4gICAgICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkUmVmZXJlbmNlczogdHJ1ZSxcbiAgICAgICAgc25hcHNob3Q6IGNvbWJpbmVkQmFja2xpbmtzTWFwXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGlmIChpc05vdGUodGhpcy5uZXdQYXRoKSkge1xuICAgICAgICBhd2FpdCB1cGRhdGVSZWZlcmVuY2VzSW5GaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVSZWZlcmVuY2VzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gWy4uLnRoaXMuaGFuZGxlZFJlbmFtZXMua2V5cygpXTtcbiAgICAgIGFkZFRvUXVldWUoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9ycGhhbktleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvcnBoYW5LZXkub2xkUGF0aCwgb3JwaGFuS2V5Lm5ld1BhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5hbWVkTGlua3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZU9ycGhhbmVkUmVuYW1lcylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMub2xkUGF0aCk7XG4gICAgaWYgKCFpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGludGVycnVwdGVkUmVuYW1lIG9mIGludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogaW50ZXJydXB0ZWRSZW5hbWUub2xkUGF0aCxcbiAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KS5oYW5kbGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZUNhc2VDb2xsaXNpb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCFnZXREYXRhQWRhcHRlckV4KHRoaXMuYXBwKS5pbnNlbnNpdGl2ZSB8fCB0aGlzLm9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gdGhpcy5uZXdQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gam9pbihkaXJuYW1lKHRoaXMubmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUodGhpcy5uZXdQYXRoKX1gKTtcbiAgICBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQodGhpcy5uZXdQYXRoLCB0ZW1wb3JhcnlQYXRoKTtcblxuICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgbmV3UGF0aDogdGVtcG9yYXJ5UGF0aCxcbiAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgfSkuaGFuZGxlKCk7XG5cbiAgICBhd2FpdCB0aGlzLmFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlKGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0ZW1wb3JhcnlQYXRoIH0pLCB0aGlzLm5ld1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmFrZU9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgbGV0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQ6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgICB7XG4gICAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW2Zha2VPbGRGaWxlXSk7XG4gICAgICBjb25zdCBmYWtlT2xkRmlsZUJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogZmFrZU9sZEZpbGUgfSk7XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkID0gZmFrZU9sZEZpbGVCYWNrbGlua3MuZGF0YTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIHJlZnJlc2hlZFJlZmVyZW5jZXNdIG9mIG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQpIHtcbiAgICAgIGxldCBvbGRSZWZlcmVuY2VzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRSZWZlcmVuY2VzKSB7XG4gICAgICAgIG9sZFJlZmVyZW5jZXMgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZFJlZmVyZW5jZXMpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZyZXNoZWRSZWZlcmVuY2VzKSB7XG4gICAgICAgIGlmIChvbGRSZWZlcmVuY2VzLmluY2x1ZGVzKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBvbGRSZWZlcmVuY2VzLnB1c2gocmVmZXJlbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICBpZiAob2xkUGF0aCA9PT0gbmV3UGF0aCkge1xuICAgICAgcmV0dXJuIG5ld1BhdGg7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuYWRkKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG59XG5cbmNsYXNzIFJlbmFtZU1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhSZWZlcmVuY2VzOiBSZWZlcmVuY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMubmV3UGF0aCA9IHBhcmFtcy5uZXdQYXRoO1xuICAgIHRoaXMub2xkUGF0aFJlZmVyZW5jZXMgPSB0aGlzLm9sZENhY2hlID8gZ2V0UmVmZXJlbmNlcyh7IGNhY2hlOiB0aGlzLm9sZENhY2hlIH0pIDogW107XG4gIH1cblxuICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZW50cmllcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRoaXMubWFwLnNldCh0aGlzLm9sZFBhdGgsIHRoaXMubmV3UGF0aCk7XG5cbiAgICBpZiAoIWlzTm90ZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2JzaWRpYW4gZG9lcyBub3QgaW5kZXggYSBjYW52YXMgZmlsZSBpbnRvIHRoZSBtZXRhZGF0YSBjYWNoZS5cbiAgICAvLyBUaGUgY2FjaGUtZGVyaXZlZCBgb2xkUGF0aFJlZmVyZW5jZXNgIGlzIGVtcHR5IGZvciBhIGNhbnZhcywgaGlkaW5nIGl0cyBlbWJlZGRlZCBhdHRhY2htZW50cy5cbiAgICAvLyBSZWFkaW5nIHRoZSBjYW52YXMgcmVmZXJlbmNlcyBkaXJlY3RseSBtb3ZlcyB0aGVtIHdpdGggdGhlIGNhbnZhcyAobWlycm9yaW5nIG5vdGUgYmVoYXZpb3IpLlxuICAgIC8vIFRoZSBmaWxlIGFscmVhZHkgbGl2ZXMgYXQgdGhlIG5ldyBwYXRoIGFmdGVyIHRoZSByZW5hbWUsIHNvIHJlYWQgdGhlIHJlZmVyZW5jZXMgZnJvbSB0aGVyZS5cbiAgICBpZiAoaXNDYW52YXNGaWxlKHRoaXMub2xkUGF0aCkpIHtcbiAgICAgIGNvbnN0IGNhbnZhc1JlZmVyZW5jZXMgPSBhd2FpdCBnZXRDYW52YXNSZWZlcmVuY2VzKHRoaXMuYXBwLCB0aGlzLm5ld1BhdGgpO1xuICAgICAgdGhpcy5vbGRQYXRoUmVmZXJlbmNlcy5wdXNoKC4uLmNhbnZhc1JlZmVyZW5jZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IG9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCB0aGlzLmdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGUpO1xuXG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGhcbiAgICAgIH0pXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyIHx8IChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICAgIGlmIChcbiAgICAgIGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChvbGRBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBvbGRQYXRoUmVmZXJlbmNlIG9mIHRoaXMub2xkUGF0aFJlZmVyZW5jZXMpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RSZWZlcmVuY2VGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcmVmZXJlbmNlOiBvbGRQYXRoUmVmZXJlbmNlLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUgfHwgKCFpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgJiYgIW9sZEF0dGFjaG1lbnRGaWxlLnBhdGguc3RhcnRzV2l0aChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50QmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBvbGRBdHRhY2htZW50RmlsZSB9KTtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgICAga2V5cy5kZWxldGUodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZmlsbFJlbmFtZU1hcCcpKGBSZW1vdmluZyBjb25mbGljdGluZyBhdHRhY2htZW50ICR7bmV3QXR0YWNobWVudEZpbGUucGF0aH0uYCk7XG4gICAgICAgICAgYXdhaXQgdHJhc2hTYWZlKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSBkaXJuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBiYXNlbmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgsIGV4dGVuc2lvbik7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJlY3RvcnksIGJhc2VOYW1lKSwgZXh0ZW5zaW9uLnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQob2xkUGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChvbGRQYXRoKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGluaXRCYWNrbGlua3NNYXAocGFyYW1zOiBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoLFxuICAgICAgc2luZ2xlQmFja2xpbmtzTWFwXG4gICAgfSA9IHBhcmFtcztcbiAgICBidWlsZEJhY2tsaW5rc1NuYXBzaG90PHN0cmluZz4oe1xuICAgICAgYmFja2xpbmtzOiBzaW5nbGVCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoUmVtYXBwZXI6IChiYWNrbGlua1BhdGgpID0+IHRoaXMubWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aCxcbiAgICAgIHBheWxvYWRQcm92aWRlcjogKCkgPT4gcGF0aCxcbiAgICAgIHJlZmVyZW5jZUlkZW50aXR5S2V5UHJvdmlkZXI6IGdldFJlZmVyZW5jZUlkZW50aXR5S2V5LFxuICAgICAgdGFyZ2V0OiBjb21iaW5lZEJhY2tsaW5rc01hcFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aFJlZmVyZW5jZSBvZiB0aGlzLm9sZFBhdGhSZWZlcmVuY2VzKSB7XG4gICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RSZWZlcmVuY2VGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcmVmZXJlbmNlOiBvbGRQYXRoUmVmZXJlbmNlLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPihbW3RoaXMubmV3UGF0aCwgW29sZFBhdGhSZWZlcmVuY2VdXV0pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzZXR0aW5ncyB0aGUgaGFuZGxlciBydW5zIHdpdGguXG4gKlxuICogVGhlcmUgaXMgZXhhY3RseSBvbmUgY29udHJpYnV0b3I6IHRoZSBjb21wb25lbnQncyBvd24gYHNldHRpbmdzQnVpbGRlcmAuIEVhcmxpZXIgdmVyc2lvbnMgYWdncmVnYXRlZCBhXG4gKiByZWdpc3RyeSBvZiBjb250cmlidXRvcnMgYW5kIE9SLW1lcmdlZCB0aGVpciBhbnN3ZXJzLCBiZWNhdXNlIHNldmVyYWwgcGx1Z2lucyBjb3VsZCBlYWNoIHJlZ2lzdGVyIGFcbiAqIGhhbmRsZXIgYWdhaW5zdCB0aGUgb25lIHNoYXJlZCB2YXVsdC4gVGhleSBubyBsb25nZXIgZG8sIHNvIHRoZXJlIGlzIG5vIGxvbmdlciBhbnkgcXVlc3Rpb24gb2Ygd2hvc2VcbiAqIHNldHRpbmcgd2lucy5cbiAqXG4gKiBXaGF0IHJlbWFpbnMgaXMgZGVmYXVsdGluZzogdGhlIGJ1aWxkZXIgcmV0dXJucyBhIGBQYXJ0aWFsYCwgc28gdGhlIHR3byBwcmVkaWNhdGVzIGFuZCB0aGUgZW1wdHktZm9sZGVyXG4gKiBiZWhhdmlvciBuZWVkIGEgdmFsdWUgd2hlbiBpdCBkb2VzIG5vdCBzdXBwbHkgb25lLlxuICovXG5jbGFzcyBTZXR0aW5nc01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3NCdWlsZGVyID0gc2V0dGluZ3NCdWlsZGVyO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3QgYnVpbHRTZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJ1aWx0U2V0dGluZ3MsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBidWlsdFNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgaXNOb3RlOiAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBidWlsdFNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGlzTm90ZShwYXRoKSxcbiAgICAgIGlzUGF0aElnbm9yZWQ6IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGJ1aWx0U2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21wb25lbnQgdGhhdCBoYW5kbGVzIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBpbiBPYnNpZGlhbi5cbiAqIEl0IGxpc3RlbnMgdG8gcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGFuZCB1cGRhdGVzIGxpbmtzIGFjY29yZGluZ2x5LlxuICogSXQgYWxzbyBoYW5kbGVzIGVkZ2UgY2FzZXMgc3VjaCBhcyBjYXNlLW9ubHkgcmVuYW1lcyBhbmQgY29sbGlzaW9ucyB3aXRoIGV4aXN0aW5nIGZpbGVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgY29tcG9uZW50IHdob3NlIHNpZ25hbCBjYW5jZWxzIGluLWZsaWdodCByZW5hbWUgb3BlcmF0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgd2hvc2UgbGlua3MgYXJlIHVwZGF0ZWQgZHVyaW5nIGEgcmVuYW1lL21vdmUsXG4gICAqIHdpdGggdGhlIHJ1bm5pbmcgY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gYG51bGxgLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgdXBkYXRlZCBsaW5rcyB0byB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBsb2NrIGNvbXBvbmVudCB1c2VkIHRvIGd1YXJkIGxpbmsgdXBkYXRlcywgb3IgYG51bGxgIGlmIG5vbmUgaXMgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGlzIHBsdWdpbidzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG1hbmFnZXIgdGhhdCBhZ2dyZWdhdGVzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncyBhY3Jvc3MgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lcyA9IG5ldyBIYW5kbGVkUmVuYW1lcygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHBhcmFtcy5hYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA/PyBudWxsO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcih0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ2RlbGV0ZScsIHRoaXMuaGFuZGxlRGVsZXRlLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIHRoaXMuaGFuZGxlUmVuYW1lLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWV0YWRhdGFEZWxldGVkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudCh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGZpbGVNYW5hZ2VyOiB0aGlzLmFwcC5maWxlTWFuYWdlcixcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBvcGVyYXRpb25GdW5jdGlvbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgRGVsZXRlSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVEZWxldGUsIHsgZmlsZVBhdGg6IGZpbGUucGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoZmlsZTogVEFic3RyYWN0RmlsZSwgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gICAgbmV3IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIoe1xuICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICBmaWxlLFxuICAgICAgcHJldmlvdXNDYWNoZSxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVuYW1lKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNGaWxlKGZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcblxuICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG4gICAgaWYgKHRoaXMuaGFuZGxlZFJlbmFtZXMuaGFzKG9sZFBhdGgsIG5ld1BhdGgpKSB7XG4gICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgcmVuYW1lIG9jY3VycmluZyBpbnNpZGUgYSBmb3JlaWduIHBsdWdpbidzIGluLWZsaWdodCBsb2NrZWQgdHJhbnNhY3Rpb24gKHdoaWNoIGxvY2tzIHRoZVxuICAgICAqIGFmZmVjdGVkIGZvbGRlciBzdWJ0cmVlLCBlLmcuIGBBZHZhbmNlZCBOb3RlIENvbXBvc2VyYCdzIGZvbGRlciBtZXJnZSkgaXMgb3JjaGVzdHJhdGVkIGJ5IHRoYXRcbiAgICAgKiB0cmFuc2FjdGlvbidzIG93bmVyLCB3aGljaCB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBSZWFjdGluZyB0byBpdFxuICAgICAqIGhlcmUgd291bGQgKGEpIHBlcnR1cmIgT2JzaWRpYW4ncyBuYXRpdmUgcG9zdC1yZW5hbWUgbGluayB1cGRhdGUgYW5kIGxlYXZlIGxpbmtzIGRhbmdsaW5nLCBhbmRcbiAgICAgKiAoYikgY29sbGlkZSB3aXRoIHRoZSBmb3JlaWduIHRyYW5zYWN0aW9uIOKAlCBhbiBhc3luYyBhYm9ydCBmcm9tIHRoaXMgaGFuZGxlciBhYm9ydHMgYW5cbiAgICAgKiBhbHJlYWR5LWNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgdGhyb3dpbmcgXCJDYW5ub3Qgcm9sbCBiYWNrIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uXCIuIFRoaXNcbiAgICAgKiBoYW5kbGVyJ3Mgb3duIGF0dGFjaG1lbnQgbW92ZXMgYXJlIGFscmVhZHkgZXhjbHVkZWQgYWJvdmUgdmlhIGBoYW5kbGVkUmVuYW1lc2AsIHNvIGEgbG9jayBzdGlsbFxuICAgICAqIGhlbGQgaGVyZSBhbHdheXMgYmVsb25ncyB0byBhIGZvcmVpZ24gb3BlcmF0aW9uOyBzdGF5IG91dCBvZiBpdHMgd2F5LiBTZWVcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAqL1xuICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgb2NjdXJzIGluc2lkZSBhIGZvcmVpZ24gbG9ja2VkIHRyYW5zYWN0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNOb09wUmVuYW1lKHNldHRpbmdzLCBvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShcbiAgICAgICAgYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofSBhcyBpdCBpcyBub3QgYSBub3RlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIHdpdGggbGluayB1cGRhdGVzIGRpc2FibGVkLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2Ygb2xkIHBhdGggJHtvbGRQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG5ldyBwYXRoICR7bmV3UGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRDYWNoZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShuZXdQYXRoKTtcbiAgICBjb25zdCBvbGRQYXRoQmFja2xpbmtzTWFwID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCh0aGlzLmFwcCwgb2xkUGF0aCkuZGF0YTtcbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50LmFib3J0U2lnbmFsLFxuICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgICBuZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUsIHsgbmV3UGF0aCwgb2xkUGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpdGggbGluayByZXdyaXRpbmcgb2ZmLCB0aGUgaGFuZGxlcidzIG9ubHkgcmVtYWluaW5nIGpvYnMgYXJlIG1vdmluZyBhIE5PVEUncyBhdHRhY2htZW50cyBhbmQgcHJ1bmluZ1xuICAgKiB0aGUgZm9sZGVyIGEgbW92ZWQgZmlsZSB2YWNhdGVkLiBBIG5vbi1ub3RlIHJlbmFtZSBuZWVkcyBuZWl0aGVyIHdoZW4gZW1wdHkgZm9sZGVycyBhcmUga2VwdCwgc28gdGhlcmVcbiAgICogaXMgbm90aGluZyB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIGZyb20uXG4gICAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgdG8uXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBoYW5kbGVyIHdvdWxkIGRvIG5vIHdvcmsgZm9yIHRoaXMgcmVuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc05vT3BSZW5hbWUoc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXNcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4ob2xkUGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG5ld1BhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgKHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKSA9PT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICB9XG59XG5cbi8qKlxuICogTW92ZXMgYW4gYXR0YWNobWVudCBhIGRlbGV0aW9uIHdvdWxkIG90aGVyd2lzZSBzdHJhbmQgdG8gd2hlcmV2ZXIgdGhlIGNvbnN1bWluZyBwbHVnaW4gc2F5cyBpdCBiZWxvbmdzLlxuICpcbiAqIFNoYXJlZCBieSBib3RoIGRlbGV0ZSBwYXRocyDigJQgdGhlIG5vdGUgZGVsZXRlIGluIHtAbGluayBEZWxldGVIYW5kbGVyfSBhbmQgdGhlIGZvbGRlciBkZWxldGUgcmVwbGF5ZWQgYnlcbiAqIHtAbGluayBEZWxldGVQcm90ZWN0aW9uUGF0Y2hDb21wb25lbnR9IOKAlCBiZWNhdXNlIGJvdGggcmVhY2ggdGhlIHNhbWUgcG9pbnQ6IHtAbGluayBkZWxldGVJZk5vdFVzZWR9IGhhc1xuICogZGVjaWRlZCB0aGUgYXR0YWNobWVudCBtdXN0IHN1cnZpdmUsIGFuZCB3aXRob3V0IHRoaXMgaXQgd291bGQgc3Vydml2ZSBpbiBhIGZvbGRlciBub3RoaW5nIG93bnMgYW55IG1vcmUuXG4gKlxuICogQSBjb25zdW1lciB0aGF0IGRvZXMgbm90IGltcGxlbWVudCB7QGxpbmsgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLmdldFJlc2N1ZVBhdGh9LCBvciB0aGF0IGFuc3dlcnNcbiAqIGBudWxsYCwgZ2V0cyBleGFjdGx5IHRoZSBiZWhhdmlvciBpdCBoYWQgYmVmb3JlIHRoaXMgZXhpc3RlZDogdGhlIGF0dGFjaG1lbnQgc3RheXMgcHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB3aGV0aGVyIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGlkUmVzY3VlU3RpbGxVc2VkQXR0YWNobWVudChwYXJhbXM6IERpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnRQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG4gIGlmICghc2V0dGluZ3MuZ2V0UmVzY3VlUGF0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gcGFyYW1zLnJlc2N1ZVBhcmFtcy5maWxlLnBhdGg7XG4gIGNvbnN0IHJlc2N1ZVBhdGggPSBhd2FpdCBzZXR0aW5ncy5nZXRSZXNjdWVQYXRoKHtcbiAgICBhdHRhY2htZW50UGF0aCxcbiAgICBzdXJ2aXZpbmdOb3RlUGF0aHM6IHBhcmFtcy5yZXNjdWVQYXJhbXMuc3Vydml2aW5nTm90ZVBhdGhzXG4gIH0pO1xuXG4gIGlmIChyZXNjdWVQYXRoID09PSBudWxsKSB7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYE5vIHJlc2N1ZSBwYXRoIGZvciAke2F0dGFjaG1lbnRQYXRofTsga2VlcGluZyBpdCB3aGVyZSBpdCBpcy5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIC8qXG4gICAgICogYHJlbmFtZVNhZmVgIGNyZWF0ZXMgdGhlIGRlc3RpbmF0aW9uIGZvbGRlciwgcmVzb2x2ZXMgYSBjb2xsaXNpb24gdmlhIGBnZXRTYWZlUmVuYW1lUGF0aGAsIGFuZCBtb3Zlc1xuICAgICAqIHRocm91Z2ggYGFwcC5maWxlTWFuYWdlci5yZW5hbWVGaWxlYCwgc28gdGhlIHN1cnZpdmluZyBub3RlcycgbGlua3MgZm9sbG93IHRoZSBhdHRhY2htZW50LlxuICAgICAqL1xuICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBuZXdQYXRoOiByZXNjdWVQYXRoLFxuICAgICAgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBwYXJhbXMucmVzY3VlUGFyYW1zLmZpbGVcbiAgICB9KTtcblxuICAgIGlmIChuZXdBdHRhY2htZW50UGF0aCA9PT0gYXR0YWNobWVudFBhdGgpIHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGUgYXR0YWNobWVudCBpcyBhbHJlYWR5IHdoZXJlIGl0IGJlbG9uZ3MuIFRoaXMgaXMgdGhlIG5vcm1hbCBzZWNvbmQgbG9vayBhdCBhIGZpbGUgdGhlIGZvbGRlclxuICAgICAgICogZGVsZXRlIGp1c3QgcmVzY3VlZDogdGhlIG93bmluZyBub3RlJ3Mgb3duIGRlbGV0aW9uIGlzIHJlcG9ydGVkIGFmdGVyd2FyZHMgYW5kIHdhbGtzIGl0cyBsaW5rc1xuICAgICAgICogYWdhaW4uIE5vdGhpbmcgbW92ZWQsIHNvIG5vdGhpbmcgaXMgY2xhaW1lZCDigJQgdGhlIGNhbGxlciBrZWVwcyBpdCBpbiBwbGFjZSwgd2hpY2ggaXMgdGhlIHRydXRoLlxuICAgICAgICovXG4gICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmRpZFJlc2N1ZVN0aWxsVXNlZEF0dGFjaG1lbnQnKShgJHthdHRhY2htZW50UGF0aH0gYWxyZWFkeSBzaXRzIGF0IGl0cyByZXNjdWUgcGF0aDsgbm90aGluZyB0byBtb3ZlLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhlIG1vdmUgZmlyZXMgYHZhdWx0Lm9uKCdyZW5hbWUnKWAsIHNvIHRoaXMgaGFuZGxlcidzIG93biBgUmVuYW1lSGFuZGxlcmAgcGlja3MgaXQgdXAgbGlrZSBhbnkgb3RoZXJcbiAgICAgKiBhdHRhY2htZW50IG1vdmUuIEl0IGlzIGRlbGliZXJhdGVseSBOT1QgcmVnaXN0ZXJlZCBpbiBgaGFuZGxlZFJlbmFtZXNgOlxuICAgICAqIGBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50YCBhbHJlYWR5IGRpc2NhcmRzIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIHdoaWxlXG4gICAgICogYHNob3VsZEhhbmRsZVJlbmFtZXNgIGlzIG9uLCBzbyBzdXBwcmVzc2luZyB0aGUgaGFuZGxlciBhcyB3ZWxsIHdvdWxkIGxlYXZlIGRhbmdsaW5nIGV4YWN0bHkgdGhlIGxpbmtzXG4gICAgICogdGhpcyByZXNjdWUgZXhpc3RzIHRvIHByZXNlcnZlLiBMZXQgdGhlIHJld3JpdGUgc2V0dGxlIGJlZm9yZSB0aGUgZGVsZXRlIHdhbGsgY2FycmllcyBvbi5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHBhcmFtcy5hcHApO1xuXG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpkaWRSZXNjdWVTdGlsbFVzZWRBdHRhY2htZW50JykoYFJlc2N1ZWQgJHthdHRhY2htZW50UGF0aH0gdG8gJHtuZXdBdHRhY2htZW50UGF0aH0uYCk7XG4gICAgcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHQoKCQpID0+ICQub2JzaWRpYW5MaWIubm90aWNlcy5hdHRhY2htZW50UmVzY3VlZCwgeyBhdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGggfSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8qXG4gICAgICogQSByZXNjdWUgdGhhdCBoYWxmIGhhcHBlbmVkIG11c3Qgbm90IHJlYWQgYXMgc3VjY2VzcyDigJQgcmVwb3J0aW5nIGBmYWxzZWAgZmFsbHMgYmFjayB0byBrZWVwaW5nIHRoZVxuICAgICAqIGF0dGFjaG1lbnQgaW4gcGxhY2Ugd2l0aCB0aGUgYGF0dGFjaG1lbnRJc1N0aWxsVXNlZGAgbm90aWNlLCB3aGljaCBpcyBzdGlsbCBzYWZlLlxuICAgICAqL1xuICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzY3VlICR7YXR0YWNobWVudFBhdGh9IHRvICR7cmVzY3VlUGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBrZXkgdW5kZXIgd2hpY2ggYSBsaW5rIGlzIHJlbWVtYmVyZWQgd2hpbGUgYSByZW5hbWUgaXMgaW4gZmxpZ2h0LlxuICpcbiAqIFRoZSByZXdyaXRlIGhhcyB0byBtYXRjaCBsaW5rcyBjYXB0dXJlZCBCRUZPUkUgdGhlIGF0dGFjaG1lbnRzIG1vdmVkIGFnYWluc3QgdGhlIGxpbmtzIHRoZSBtZXRhZGF0YSBjYWNoZVxuICogcmVwb3J0cyBBRlRFUiB0aGV5IG1vdmVkLCBhbmQgdGhlIG9ubHkgdGhpbmcgdGhhdCByZWxpYWJseSBzdXJ2aXZlcyB0aGF0IGdhcCBpcyB0aGUgbGluaydzIFRFWFQuXG4gKiBEZWxpYmVyYXRlbHkgZXhjbHVkZXMgYHBvc2l0aW9uYDoga2V5aW5nIG9uIHRoZSB3aG9sZSB7QGxpbmsgUmVmZXJlbmNlfSBtZWFudCB0aGF0IGFzIHNvb24gYXMgYW55dGhpbmdcbiAqIGVkaXRlZCB0aGUgZmlsZSBpbiBiZXR3ZWVuIOKAlCBhIGNvLWluc3RhbGxlZCBwbHVnaW4gcmV3cml0aW5nIGl0cyBvd24gbGlua3MsIG1vc3Qgb2Z0ZW4g4oCUIGV2ZXJ5IGxpbmsgYmVsb3dcbiAqIHRoZSBlZGl0IHNoaWZ0ZWQgaXRzIG9mZnNldHMsIG1pc3NlZCBpdHMga2V5LCBhbmQgd2FzIHNraXBwZWQgaW4gc2lsZW5jZSwgbGVhdmluZyB0aGUgbm90ZSB3aXRoIHNvbWUgZW1iZWRzXG4gKiByZXdyaXR0ZW4gYW5kIHRoZSByZXN0IGJyb2tlbi4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY3VzdG9tLWF0dGFjaG1lbnQtbG9jYXRpb24vaXNzdWVzLzYwLlxuICpcbiAqIFR3byBsaW5rcyB3aXRoIGlkZW50aWNhbCB0ZXh0IGluIG9uZSBmaWxlIG5lY2Vzc2FyaWx5IHJlc29sdmUgdG8gdGhlIHNhbWUgdGFyZ2V0LCBzbyBjb2xsYXBzaW5nIHRoZW0gb250b1xuICogb25lIGtleSBsb3NlcyBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIHRvIGJ1aWxkIHRoZSBrZXkgZm9yLlxuICogQHJldHVybnMgVGhlIGtleSBpZGVudGlmeWluZyB0aGUgbGluayBieSBpdHMgdGV4dCBhbG9uZS5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVmZXJlbmNlSWRlbnRpdHlLZXkocmVmZXJlbmNlOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Kc29uKHtcbiAgICBsaW5rOiByZWZlcmVuY2UubGluayxcbiAgICBvcmlnaW5hbDogcmVmZXJlbmNlLm9yaWdpbmFsXG4gIH0pO1xufVxuXG4vKipcbiAqIFB1dHMgYmFjayBhIHByb3BlcnR5IHN3YXBwZWQgb3V0IGZvciBhIG1vbWVudDogdGhlIG93biBwcm9wZXJ0eSBpdCBoYWQsIG9yIG5vbmUsIHNvIGEgbWV0aG9kIGluaGVyaXRlZCBmcm9tIHRoZVxuICogcHJvdG90eXBlIGlzIGluaGVyaXRlZCBhZ2Fpbi5cbiAqXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSBvYmplY3QgdGhlIHByb3BlcnR5IHdhcyBzd2FwcGVkIG9uLlxuICogQHBhcmFtIGtleSAtIFRoZSBwcm9wZXJ0eSdzIGtleS5cbiAqIEBwYXJhbSBkZXNjcmlwdG9yIC0gSXRzIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGJlZm9yZSB0aGUgc3dhcCwgYHVuZGVmaW5lZGAgd2hlbiBpdCBoYWQgbm9uZS5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVByb3BlcnR5KCRvYmplY3Q6IG9iamVjdCwga2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoZGVzY3JpcHRvcikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkb2JqZWN0LCBrZXksIGRlc2NyaXB0b3IpO1xuICB9IGVsc2Uge1xuICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoJG9iamVjdCwga2V5KTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG5leHBvcnQgeyBFbXB0eUZvbGRlckJlaGF2aW9yIH0gZnJvbSAnLi4vdmF1bHQudHMnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQkEsbUJBQThCO0FBQzlCLG1CQUEyQjtBQUMzQiwwQkFHTztBQUNQLGtCQU1PO0FBRVAs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dUJBQXVCLGlDQUFvQixVQUFVLGlDQUFvQjtBQUFBLEVBQzFGO0FBQ0Y7QUFlQSxlQUFlLDZCQUE2QixRQUE4RDtBQUN4RyxRQUFNLFdBQVcsT0FBTyxnQkFBZ0IsWUFBWTtBQUNwRCxNQUFJLENBQUMsU0FBUyxlQUFlO0FBQzNCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxpQkFBaUIsT0FBTyxhQUFhLEtBQUs7QUFDaEQsUUFBTSxhQUFhLE1BQU0sU0FBUyxjQUFjO0FBQUEsSUFDOUM7QUFBQSxJQUNBLG9CQUFvQixPQUFPLGFBQWE7QUFBQSxFQUMxQyxDQUFDO0FBRUQsTUFBSSxlQUFlLE1BQU07QUFDdkIsNkNBQXVCLGtEQUFrRCxFQUFFLHNCQUFzQixjQUFjLDJCQUEyQjtBQUMxSSxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFLRixVQUFNLG9CQUFvQixVQUFNLHlCQUFXO0FBQUEsTUFDekMsS0FBSyxPQUFPO0FBQUEsTUFDWixTQUFTO0FBQUEsTUFDVCx1QkFBdUIsT0FBTyxhQUFhO0FBQUEsSUFDN0MsQ0FBQztBQUVELFFBQUksc0JBQXNCLGdCQUFnQjtBQU14QywrQ0FBdUIsa0RBQWtELEVBQUUsR0FBRyxjQUFjLG9EQUFvRDtBQUNoSixhQUFPO0FBQUEsSUFDVDtBQVNBLGNBQU0sK0NBQTBCLE9BQU8sR0FBRztBQUUxQyw2Q0FBdUIsa0RBQWtELEVBQUUsV0FBVyxjQUFjLE9BQU8saUJBQWlCLEdBQUc7QUFDL0gsV0FBTyxzQkFBc0IsZUFBVyxrQkFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLFFBQVEsbUJBQW1CLEVBQUUsZ0JBQWdCLGtCQUFrQixDQUFDLENBQUM7QUFDaEksV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFPO0FBS2QsaUNBQVcsSUFBSSxNQUFNLG9CQUFvQixjQUFjLE9BQU8sVUFBVSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUM3RixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBbUJBLFNBQVMsd0JBQXdCLFdBQThCO0FBQzdELGFBQU8sNEJBQU87QUFBQSxJQUNaLE1BQU0sVUFBVTtBQUFBLElBQ2hCLFVBQVUsVUFBVTtBQUFBLEVBQ3RCLENBQUM7QUFDSDtBQVVBLFNBQVMsZ0JBQWdCLFNBQWlCLEtBQWEsWUFBa0Q7QUFDdkcsTUFBSSxZQUFZO0FBQ2QsV0FBTyxlQUFlLFNBQVMsS0FBSyxVQUFVO0FBQUEsRUFDaEQsT0FBTztBQUNMLFlBQVEsZUFBZSxTQUFTLEdBQUc7QUFBQSxFQUNyQztBQUNGOyIsIm5hbWVzIjpbImltcG9ydF92YXVsdCJdfQ==