@mnaoumov/obsidian-lib 3.2.0 → 3.3.1

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 (775) hide show
  1. package/dist/lib/cjs/@types/i18next.d.cts +1 -1
  2. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +3 -3
  3. package/dist/lib/cjs/@types/original-fs.d.cts +2 -1
  4. package/dist/lib/cjs/__merged.cjs +31 -24
  5. package/dist/lib/cjs/__merged.d.cts +3 -3
  6. package/dist/lib/cjs/active-file-provider.cjs +1 -47
  7. package/dist/lib/cjs/active-file-provider.d.cts +1 -1
  8. package/dist/lib/cjs/app.cjs +1 -47
  9. package/dist/lib/cjs/app.d.cts +1 -1
  10. package/dist/lib/cjs/async-with-notice.cjs +2 -21
  11. package/dist/lib/cjs/async-with-notice.d.cts +2 -1
  12. package/dist/lib/cjs/attachment-path.cjs +7 -26
  13. package/dist/lib/cjs/attachment-path.d.cts +1 -1
  14. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -21
  15. package/dist/lib/cjs/attachment-unit-folder.d.cts +1 -1
  16. package/dist/lib/cjs/backlink-index.cjs +2 -21
  17. package/dist/lib/cjs/backlink-index.d.cts +1 -1
  18. package/dist/lib/cjs/backlink.cjs +2 -21
  19. package/dist/lib/cjs/backlink.d.cts +1 -1
  20. package/dist/lib/cjs/bases-view-registrar.cjs +2 -21
  21. package/dist/lib/cjs/bases-view-registrar.d.cts +1 -1
  22. package/dist/lib/cjs/callout.cjs +2 -21
  23. package/dist/lib/cjs/callout.d.cts +2 -1
  24. package/dist/lib/cjs/canvas.cjs +2 -21
  25. package/dist/lib/cjs/canvas.d.cts +1 -1
  26. package/dist/lib/cjs/case-insensitive-file-index.cjs +2 -21
  27. package/dist/lib/cjs/case-insensitive-file-index.d.cts +1 -1
  28. package/dist/lib/cjs/code-block-markdown-information.cjs +1 -47
  29. package/dist/lib/cjs/code-block-markdown-information.d.cts +1 -1
  30. package/dist/lib/cjs/code-block-reg-exp.cjs +1 -47
  31. package/dist/lib/cjs/code-block-reg-exp.d.cts +1 -1
  32. package/dist/lib/cjs/codemirror/index.cjs +2 -48
  33. package/dist/lib/cjs/codemirror/index.d.cts +1 -1
  34. package/dist/lib/cjs/codemirror/state-field-spec.cjs +1 -47
  35. package/dist/lib/cjs/codemirror/state-field-spec.d.cts +1 -1
  36. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +2 -21
  37. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +1 -1
  38. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -21
  39. package/dist/lib/cjs/command-handlers/command-handler-component.d.cts +1 -1
  40. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -21
  41. package/dist/lib/cjs/command-handlers/command-handler.d.cts +1 -1
  42. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +2 -21
  43. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +1 -1
  44. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +5 -24
  45. package/dist/lib/cjs/command-handlers/file-command-handler.d.cts +1 -1
  46. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +5 -24
  47. package/dist/lib/cjs/command-handlers/folder-command-handler.d.cts +1 -1
  48. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +3 -22
  49. package/dist/lib/cjs/command-handlers/global-command-handler.d.cts +1 -1
  50. package/dist/lib/cjs/command-handlers/index.cjs +11 -57
  51. package/dist/lib/cjs/command-handlers/index.d.cts +1 -1
  52. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -21
  53. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.d.cts +1 -1
  54. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +1 -47
  55. package/dist/lib/cjs/command-handlers/open-settings-command-handler.d.cts +1 -1
  56. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -47
  57. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.d.cts +1 -1
  58. package/dist/lib/cjs/command-registrar.cjs +1 -47
  59. package/dist/lib/cjs/command-registrar.d.cts +1 -1
  60. package/dist/lib/cjs/community-plugins.cjs +2 -21
  61. package/dist/lib/cjs/community-plugins.d.cts +1 -1
  62. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -21
  63. package/dist/lib/cjs/components/abort-signal-component.d.cts +2 -1
  64. package/dist/lib/cjs/components/all-windows-event-component.cjs +1 -47
  65. package/dist/lib/cjs/components/all-windows-event-component.d.cts +2 -1
  66. package/dist/lib/cjs/components/async-error-handler-component.cjs +2 -21
  67. package/dist/lib/cjs/components/async-error-handler-component.d.cts +1 -1
  68. package/dist/lib/cjs/components/async-events-component.cjs +2 -21
  69. package/dist/lib/cjs/components/async-events-component.d.cts +1 -1
  70. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +1 -47
  71. package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +1 -1
  72. package/dist/lib/cjs/components/component-ex.cjs +3 -16
  73. package/dist/lib/cjs/components/component-ex.d.cts +1 -1
  74. package/dist/lib/cjs/components/console-debug-component.cjs +2 -21
  75. package/dist/lib/cjs/components/console-debug-component.d.cts +1 -1
  76. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -21
  77. package/dist/lib/cjs/components/core-plugin-toggle-component.d.cts +1 -1
  78. package/dist/lib/cjs/components/disposable-component.cjs +3 -16
  79. package/dist/lib/cjs/components/disposable-component.d.cts +1 -1
  80. package/dist/lib/cjs/components/embed-extensions-component.cjs +1 -47
  81. package/dist/lib/cjs/components/embed-extensions-component.d.cts +1 -1
  82. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +1 -47
  83. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.d.cts +1 -1
  84. package/dist/lib/cjs/components/index.cjs +30 -76
  85. package/dist/lib/cjs/components/index.d.cts +1 -1
  86. package/dist/lib/cjs/components/layout-ready-component.cjs +2 -21
  87. package/dist/lib/cjs/components/layout-ready-component.d.cts +1 -1
  88. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +1 -47
  89. package/dist/lib/cjs/components/menu-event-registrar-component.d.cts +1 -1
  90. package/dist/lib/cjs/components/monkey-around-component.cjs +2 -21
  91. package/dist/lib/cjs/components/monkey-around-component.d.cts +1 -1
  92. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +2 -21
  93. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.d.cts +1 -1
  94. package/dist/lib/cjs/components/plugin-context-component.cjs +2 -21
  95. package/dist/lib/cjs/components/plugin-context-component.d.cts +1 -1
  96. package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -21
  97. package/dist/lib/cjs/components/plugin-gate-component.d.cts +2 -1
  98. package/dist/lib/cjs/components/plugin-notice-component.cjs +3 -16
  99. package/dist/lib/cjs/components/plugin-notice-component.d.cts +2 -1
  100. package/dist/lib/cjs/components/plugin-settings-component.cjs +2 -21
  101. package/dist/lib/cjs/components/plugin-settings-component.d.cts +1 -1
  102. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -21
  103. package/dist/lib/cjs/components/plugin-settings-tab-component.d.cts +1 -1
  104. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +2 -21
  105. package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +2 -1
  106. package/dist/lib/cjs/components/pointer-position-component.cjs +1 -47
  107. package/dist/lib/cjs/components/pointer-position-component.d.cts +1 -1
  108. package/dist/lib/cjs/components/registry-component.cjs +2 -21
  109. package/dist/lib/cjs/components/registry-component.d.cts +1 -1
  110. package/dist/lib/cjs/components/release-notes-component.cjs +2 -21
  111. package/dist/lib/cjs/components/release-notes-component.d.cts +2 -1
  112. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +3 -16
  113. package/dist/lib/cjs/components/rename-delete-handler-component.d.cts +1 -1
  114. package/dist/lib/cjs/components/rmdir-guard-component.cjs +1 -47
  115. package/dist/lib/cjs/components/rmdir-guard-component.d.cts +1 -1
  116. package/dist/lib/cjs/components/settings-migration-component.cjs +2 -21
  117. package/dist/lib/cjs/components/settings-migration-component.d.cts +3 -3
  118. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +2 -21
  119. package/dist/lib/cjs/components/syntax-highlighting-component.d.cts +1 -1
  120. package/dist/lib/cjs/components/templates-language-component.cjs +3 -49
  121. package/dist/lib/cjs/components/templates-language-component.d.cts +1 -1
  122. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +3 -16
  123. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.d.cts +1 -1
  124. package/dist/lib/cjs/constructors/index.cjs +2 -48
  125. package/dist/lib/cjs/constructors/index.d.cts +1 -1
  126. package/dist/lib/cjs/css-class.cjs +1 -47
  127. package/dist/lib/cjs/css-class.d.cts +1 -1
  128. package/dist/lib/cjs/data-handler.cjs +1 -47
  129. package/dist/lib/cjs/data-handler.d.cts +1 -1
  130. package/dist/lib/cjs/dataview-link.cjs +2 -21
  131. package/dist/lib/cjs/dataview-link.d.cts +1 -1
  132. package/dist/lib/cjs/dataview.cjs +2 -21
  133. package/dist/lib/cjs/dataview.d.cts +2 -1
  134. package/dist/lib/cjs/debug.cjs +2 -21
  135. package/dist/lib/cjs/debug.d.cts +1 -1
  136. package/dist/lib/cjs/demo-vault-helper-settings.cjs +1 -47
  137. package/dist/lib/cjs/demo-vault-helper-settings.d.cts +1 -1
  138. package/dist/lib/cjs/demo-vault-helper.cjs +2 -21
  139. package/dist/lib/cjs/demo-vault-helper.d.cts +1 -1
  140. package/dist/lib/cjs/demo-vault-naming.cjs +1 -47
  141. package/dist/lib/cjs/demo-vault-naming.d.cts +1 -1
  142. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +3 -16
  143. package/dist/lib/cjs/desktop-demo-vault-opener.d.cts +1 -1
  144. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -21
  145. package/dist/lib/cjs/desktop-trusted-input.d.cts +2 -1
  146. package/dist/lib/cjs/editor-extension-registrar.cjs +2 -21
  147. package/dist/lib/cjs/editor-extension-registrar.d.cts +1 -1
  148. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -21
  149. package/dist/lib/cjs/editor-suggest-registrar.d.cts +1 -1
  150. package/dist/lib/cjs/editor.cjs +2 -21
  151. package/dist/lib/cjs/editor.d.cts +1 -1
  152. package/dist/lib/cjs/events.cjs +2 -21
  153. package/dist/lib/cjs/events.d.cts +1 -1
  154. package/dist/lib/cjs/extensions-registrar.cjs +2 -21
  155. package/dist/lib/cjs/extensions-registrar.d.cts +1 -1
  156. package/dist/lib/cjs/file-change.cjs +2 -21
  157. package/dist/lib/cjs/file-change.d.cts +2 -1
  158. package/dist/lib/cjs/file-explorer.cjs +2 -21
  159. package/dist/lib/cjs/file-explorer.d.cts +1 -1
  160. package/dist/lib/cjs/file-manager.cjs +2 -21
  161. package/dist/lib/cjs/file-manager.d.cts +2 -1
  162. package/dist/lib/cjs/file-system.cjs +2 -21
  163. package/dist/lib/cjs/file-system.d.cts +1 -1
  164. package/dist/lib/cjs/folder-note.cjs +2 -21
  165. package/dist/lib/cjs/folder-note.d.cts +1 -1
  166. package/dist/lib/cjs/frontmatter-formatting.cjs +2 -21
  167. package/dist/lib/cjs/frontmatter-formatting.d.cts +1 -1
  168. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +2 -21
  169. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.d.cts +1 -1
  170. package/dist/lib/cjs/frontmatter.cjs +2 -21
  171. package/dist/lib/cjs/frontmatter.d.cts +1 -1
  172. package/dist/lib/cjs/generated-during-build.cjs +2 -48
  173. package/dist/lib/cjs/generated-during-build.d.cts +1 -1
  174. package/dist/lib/cjs/hover-link-source-registrar.cjs +2 -21
  175. package/dist/lib/cjs/hover-link-source-registrar.d.cts +1 -1
  176. package/dist/lib/cjs/html-element.cjs +1 -47
  177. package/dist/lib/cjs/html-element.d.cts +2 -1
  178. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -47
  179. package/dist/lib/cjs/i18n/custom-type-options.d.cts +1 -1
  180. package/dist/lib/cjs/i18n/default-translations.cjs +1 -47
  181. package/dist/lib/cjs/i18n/default-translations.d.cts +1 -1
  182. package/dist/lib/cjs/i18n/i18n.cjs +3 -22
  183. package/dist/lib/cjs/i18n/i18n.d.cts +1 -1
  184. package/dist/lib/cjs/i18n/index.cjs +5 -51
  185. package/dist/lib/cjs/i18n/index.d.cts +1 -1
  186. package/dist/lib/cjs/i18n/locales/en.cjs +1 -47
  187. package/dist/lib/cjs/i18n/locales/en.d.cts +1 -1
  188. package/dist/lib/cjs/i18n/locales/index.cjs +3 -49
  189. package/dist/lib/cjs/i18n/locales/index.d.cts +1 -1
  190. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -47
  191. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +1 -1
  192. package/dist/lib/cjs/index.cjs +96 -142
  193. package/dist/lib/cjs/index.d.cts +1 -1
  194. package/dist/lib/cjs/is-in-obsidian.cjs +1 -47
  195. package/dist/lib/cjs/is-in-obsidian.d.cts +1 -1
  196. package/dist/lib/cjs/library-references.d.cts +2 -0
  197. package/dist/lib/cjs/library-styles.cjs +2 -21
  198. package/dist/lib/cjs/library-styles.d.cts +2 -1
  199. package/dist/lib/cjs/library.cjs +1 -47
  200. package/dist/lib/cjs/link-name.cjs +1 -47
  201. package/dist/lib/cjs/link-name.d.cts +1 -1
  202. package/dist/lib/cjs/link-update-progress.cjs +1 -47
  203. package/dist/lib/cjs/link-update-progress.d.cts +1 -1
  204. package/dist/lib/cjs/link.cjs +3 -16
  205. package/dist/lib/cjs/link.d.cts +2 -1
  206. package/dist/lib/cjs/logger.cjs +2 -21
  207. package/dist/lib/cjs/logger.d.cts +2 -1
  208. package/dist/lib/cjs/loop.cjs +3 -16
  209. package/dist/lib/cjs/loop.d.cts +2 -1
  210. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +2 -21
  211. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +2 -1
  212. package/dist/lib/cjs/markdown-code-block-processor.cjs +2 -21
  213. package/dist/lib/cjs/markdown-code-block-processor.d.cts +2 -1
  214. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -21
  215. package/dist/lib/cjs/markdown-post-processor-registrar.d.cts +2 -1
  216. package/dist/lib/cjs/markdown-view.cjs +1 -47
  217. package/dist/lib/cjs/markdown-view.d.cts +1 -1
  218. package/dist/lib/cjs/markdown.cjs +3 -16
  219. package/dist/lib/cjs/markdown.d.cts +2 -1
  220. package/dist/lib/cjs/menu-event-registrar.cjs +1 -47
  221. package/dist/lib/cjs/menu-event-registrar.d.cts +1 -1
  222. package/dist/lib/cjs/metadata-cache.cjs +6 -19
  223. package/dist/lib/cjs/metadata-cache.d.cts +1 -1
  224. package/dist/lib/cjs/mobile-trusted-input.cjs +1 -47
  225. package/dist/lib/cjs/mobile-trusted-input.d.cts +1 -1
  226. package/dist/lib/cjs/modals/alert.cjs +2 -21
  227. package/dist/lib/cjs/modals/alert.d.cts +2 -1
  228. package/dist/lib/cjs/modals/confirm.cjs +2 -21
  229. package/dist/lib/cjs/modals/confirm.d.cts +2 -1
  230. package/dist/lib/cjs/modals/index.cjs +10 -56
  231. package/dist/lib/cjs/modals/index.d.cts +1 -1
  232. package/dist/lib/cjs/modals/minimizable-modal.cjs +2 -21
  233. package/dist/lib/cjs/modals/minimizable-modal.d.cts +1 -1
  234. package/dist/lib/cjs/modals/modal-command-builder.cjs +2 -21
  235. package/dist/lib/cjs/modals/modal-command-builder.d.cts +2 -1
  236. package/dist/lib/cjs/modals/modal.cjs +2 -21
  237. package/dist/lib/cjs/modals/modal.d.cts +1 -1
  238. package/dist/lib/cjs/modals/prompt.cjs +2 -21
  239. package/dist/lib/cjs/modals/prompt.d.cts +2 -1
  240. package/dist/lib/cjs/modals/select-item.cjs +2 -21
  241. package/dist/lib/cjs/modals/select-item.d.cts +1 -1
  242. package/dist/lib/cjs/modals/select-option.cjs +2 -21
  243. package/dist/lib/cjs/modals/select-option.d.cts +2 -1
  244. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -47
  245. package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +1 -1
  246. package/dist/lib/cjs/note-priority.cjs +2 -21
  247. package/dist/lib/cjs/note-priority.d.cts +1 -1
  248. package/dist/lib/cjs/notebook-navigator.cjs +1 -47
  249. package/dist/lib/cjs/notebook-navigator.d.cts +1 -1
  250. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +2 -21
  251. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +1 -1
  252. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +2 -21
  253. package/dist/lib/cjs/obsidian-protocol-handler-registrar.d.cts +1 -1
  254. package/dist/lib/cjs/obsidian-settings.cjs +2 -21
  255. package/dist/lib/cjs/obsidian-settings.d.cts +1 -1
  256. package/dist/lib/cjs/parse-link.cjs +3 -22
  257. package/dist/lib/cjs/parse-link.d.cts +1 -1
  258. package/dist/lib/cjs/path-settings.cjs +2 -21
  259. package/dist/lib/cjs/path-settings.d.cts +1 -1
  260. package/dist/lib/cjs/pdf.cjs +2 -21
  261. package/dist/lib/cjs/pdf.d.cts +2 -1
  262. package/dist/lib/cjs/plugin/index.cjs +10 -56
  263. package/dist/lib/cjs/plugin/index.d.cts +1 -1
  264. package/dist/lib/cjs/plugin/plugin-api-schema.cjs +5 -50
  265. package/dist/lib/cjs/plugin/plugin-api-schema.d.cts +19 -41
  266. package/dist/lib/cjs/plugin/plugin-api.cjs +2 -21
  267. package/dist/lib/cjs/plugin/plugin-api.d.cts +35 -50
  268. package/dist/lib/cjs/plugin/plugin-context.cjs +2 -21
  269. package/dist/lib/cjs/plugin/plugin-context.d.cts +2 -1
  270. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -47
  271. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +1 -1
  272. package/dist/lib/cjs/plugin/plugin-install-state.cjs +1 -47
  273. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +1 -1
  274. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -47
  275. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +1 -1
  276. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +2 -21
  277. package/dist/lib/cjs/plugin/plugin-settings-tab.d.cts +2 -1
  278. package/dist/lib/cjs/plugin/plugin.cjs +2 -21
  279. package/dist/lib/cjs/plugin/plugin.d.cts +1 -1
  280. package/dist/lib/cjs/plugin/settings-migration-api.cjs +5 -24
  281. package/dist/lib/cjs/plugin/settings-migration-api.d.cts +3 -3
  282. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -21
  283. package/dist/lib/cjs/plugin-cli-handler-registrar.d.cts +1 -1
  284. package/dist/lib/cjs/popovers/field-popover.cjs +2 -21
  285. package/dist/lib/cjs/popovers/field-popover.d.cts +1 -1
  286. package/dist/lib/cjs/popovers/index.cjs +4 -50
  287. package/dist/lib/cjs/popovers/index.d.cts +1 -1
  288. package/dist/lib/cjs/popovers/popover-anchor.cjs +2 -21
  289. package/dist/lib/cjs/popovers/popover-anchor.d.cts +2 -1
  290. package/dist/lib/cjs/popovers/popover.cjs +2 -21
  291. package/dist/lib/cjs/popovers/popover.d.cts +2 -1
  292. package/dist/lib/cjs/property-entry.cjs +1 -47
  293. package/dist/lib/cjs/property-entry.d.cts +1 -1
  294. package/dist/lib/cjs/queue.cjs +2 -21
  295. package/dist/lib/cjs/queue.d.cts +2 -1
  296. package/dist/lib/cjs/react/app-context.cjs +2 -21
  297. package/dist/lib/cjs/react/app-context.d.cts +1 -1
  298. package/dist/lib/cjs/react/index.cjs +2 -48
  299. package/dist/lib/cjs/react/index.d.cts +1 -1
  300. package/dist/lib/cjs/reference.cjs +2 -21
  301. package/dist/lib/cjs/reference.d.cts +1 -1
  302. package/dist/lib/cjs/resource-lock.cjs +2 -21
  303. package/dist/lib/cjs/resource-lock.d.cts +2 -1
  304. package/dist/lib/cjs/resource-url.cjs +2 -21
  305. package/dist/lib/cjs/resource-url.d.cts +1 -1
  306. package/dist/lib/cjs/ribbon-icon-registrar.cjs +2 -21
  307. package/dist/lib/cjs/ribbon-icon-registrar.d.cts +2 -1
  308. package/dist/lib/cjs/setting-components/checkbox-component.cjs +2 -21
  309. package/dist/lib/cjs/setting-components/checkbox-component.d.cts +2 -1
  310. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +2 -21
  311. package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +2 -1
  312. package/dist/lib/cjs/setting-components/date-component.cjs +2 -21
  313. package/dist/lib/cjs/setting-components/date-component.d.cts +2 -1
  314. package/dist/lib/cjs/setting-components/date-time-component.cjs +2 -21
  315. package/dist/lib/cjs/setting-components/date-time-component.d.cts +2 -1
  316. package/dist/lib/cjs/setting-components/email-component.cjs +1 -47
  317. package/dist/lib/cjs/setting-components/email-component.d.cts +2 -1
  318. package/dist/lib/cjs/setting-components/file-component.cjs +1 -47
  319. package/dist/lib/cjs/setting-components/file-component.d.cts +2 -1
  320. package/dist/lib/cjs/setting-components/index.cjs +27 -73
  321. package/dist/lib/cjs/setting-components/index.d.cts +1 -1
  322. package/dist/lib/cjs/setting-components/month-component.cjs +2 -21
  323. package/dist/lib/cjs/setting-components/month-component.d.cts +2 -1
  324. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +2 -21
  325. package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +3 -1
  326. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +1 -47
  327. package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +2 -1
  328. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +2 -21
  329. package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +2 -1
  330. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +2 -21
  331. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +2 -1
  332. package/dist/lib/cjs/setting-components/number-component.cjs +1 -47
  333. package/dist/lib/cjs/setting-components/number-component.d.cts +2 -1
  334. package/dist/lib/cjs/setting-components/password-component.cjs +1 -47
  335. package/dist/lib/cjs/setting-components/password-component.d.cts +2 -1
  336. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +2 -21
  337. package/dist/lib/cjs/setting-components/setting-component-wrapper.d.cts +2 -1
  338. package/dist/lib/cjs/setting-components/telephone-component.cjs +1 -47
  339. package/dist/lib/cjs/setting-components/telephone-component.d.cts +2 -1
  340. package/dist/lib/cjs/setting-components/text-based-component.cjs +2 -21
  341. package/dist/lib/cjs/setting-components/text-based-component.d.cts +1 -1
  342. package/dist/lib/cjs/setting-components/time-component.cjs +2 -21
  343. package/dist/lib/cjs/setting-components/time-component.d.cts +2 -1
  344. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +2 -21
  345. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +2 -1
  346. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +2 -21
  347. package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +3 -1
  348. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +2 -21
  349. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +3 -1
  350. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -47
  351. package/dist/lib/cjs/setting-components/typed-range-text-component.d.cts +1 -1
  352. package/dist/lib/cjs/setting-components/typed-text-component.cjs +2 -21
  353. package/dist/lib/cjs/setting-components/typed-text-component.d.cts +2 -1
  354. package/dist/lib/cjs/setting-components/url-component.cjs +1 -47
  355. package/dist/lib/cjs/setting-components/url-component.d.cts +2 -1
  356. package/dist/lib/cjs/setting-components/validator-component.cjs +2 -21
  357. package/dist/lib/cjs/setting-components/validator-component.d.cts +1 -1
  358. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +1 -47
  359. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.d.cts +1 -1
  360. package/dist/lib/cjs/setting-components/week-component.cjs +2 -21
  361. package/dist/lib/cjs/setting-components/week-component.d.cts +2 -1
  362. package/dist/lib/cjs/setting-ex.cjs +2 -21
  363. package/dist/lib/cjs/setting-ex.d.cts +2 -1
  364. package/dist/lib/cjs/setting-group-ex.cjs +2 -21
  365. package/dist/lib/cjs/setting-group-ex.d.cts +2 -1
  366. package/dist/lib/cjs/status-bar-item-registrar.cjs +2 -21
  367. package/dist/lib/cjs/status-bar-item-registrar.d.cts +2 -1
  368. package/dist/lib/cjs/templater.cjs +1 -47
  369. package/dist/lib/cjs/templater.d.cts +1 -1
  370. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -21
  371. package/dist/lib/cjs/transformers/duration-transformer.d.cts +1 -1
  372. package/dist/lib/cjs/transformers/index.cjs +2 -48
  373. package/dist/lib/cjs/transformers/index.d.cts +1 -1
  374. package/dist/lib/cjs/trusted-input.cjs +2 -21
  375. package/dist/lib/cjs/trusted-input.d.cts +1 -1
  376. package/dist/lib/cjs/validation.cjs +2 -21
  377. package/dist/lib/cjs/validation.d.cts +1 -1
  378. package/dist/lib/cjs/vault-delete.cjs +2 -21
  379. package/dist/lib/cjs/vault-delete.d.cts +1 -1
  380. package/dist/lib/cjs/vault-transaction.cjs +3 -16
  381. package/dist/lib/cjs/vault-transaction.d.cts +1 -1
  382. package/dist/lib/cjs/vault.cjs +3 -16
  383. package/dist/lib/cjs/vault.d.cts +1 -1
  384. package/dist/lib/cjs/view-registrar.cjs +2 -21
  385. package/dist/lib/cjs/view-registrar.d.cts +1 -1
  386. package/dist/lib/cjs/workspace.cjs +2 -21
  387. package/dist/lib/cjs/workspace.d.cts +2 -1
  388. package/dist/lib/esm/@types/i18next.d.mts +1 -1
  389. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +3 -3
  390. package/dist/lib/esm/@types/original-fs.d.mts +2 -1
  391. package/dist/lib/esm/__merged.d.mts +3 -3
  392. package/dist/lib/esm/__merged.mjs +33 -16
  393. package/dist/lib/esm/active-file-provider.d.mts +1 -1
  394. package/dist/lib/esm/active-file-provider.mjs +1 -37
  395. package/dist/lib/esm/app.d.mts +1 -1
  396. package/dist/lib/esm/app.mjs +1 -37
  397. package/dist/lib/esm/async-with-notice.d.mts +2 -1
  398. package/dist/lib/esm/async-with-notice.mjs +2 -11
  399. package/dist/lib/esm/attachment-path.d.mts +1 -1
  400. package/dist/lib/esm/attachment-path.mjs +6 -15
  401. package/dist/lib/esm/attachment-unit-folder.d.mts +1 -1
  402. package/dist/lib/esm/attachment-unit-folder.mjs +2 -11
  403. package/dist/lib/esm/backlink-index.d.mts +1 -1
  404. package/dist/lib/esm/backlink-index.mjs +2 -11
  405. package/dist/lib/esm/backlink.d.mts +1 -1
  406. package/dist/lib/esm/backlink.mjs +2 -11
  407. package/dist/lib/esm/bases-view-registrar.d.mts +1 -1
  408. package/dist/lib/esm/bases-view-registrar.mjs +2 -11
  409. package/dist/lib/esm/callout.d.mts +2 -1
  410. package/dist/lib/esm/callout.mjs +2 -11
  411. package/dist/lib/esm/canvas.d.mts +1 -1
  412. package/dist/lib/esm/canvas.mjs +2 -11
  413. package/dist/lib/esm/case-insensitive-file-index.d.mts +1 -1
  414. package/dist/lib/esm/case-insensitive-file-index.mjs +2 -11
  415. package/dist/lib/esm/code-block-markdown-information.d.mts +1 -1
  416. package/dist/lib/esm/code-block-markdown-information.mjs +0 -36
  417. package/dist/lib/esm/code-block-reg-exp.d.mts +1 -1
  418. package/dist/lib/esm/code-block-reg-exp.mjs +1 -37
  419. package/dist/lib/esm/codemirror/index.d.mts +1 -1
  420. package/dist/lib/esm/codemirror/index.mjs +1 -37
  421. package/dist/lib/esm/codemirror/state-field-spec.d.mts +1 -1
  422. package/dist/lib/esm/codemirror/state-field-spec.mjs +0 -36
  423. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +1 -1
  424. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +2 -11
  425. package/dist/lib/esm/command-handlers/command-handler-component.d.mts +1 -1
  426. package/dist/lib/esm/command-handlers/command-handler-component.mjs +2 -11
  427. package/dist/lib/esm/command-handlers/command-handler.d.mts +1 -1
  428. package/dist/lib/esm/command-handlers/command-handler.mjs +2 -11
  429. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +1 -1
  430. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +2 -11
  431. package/dist/lib/esm/command-handlers/file-command-handler.d.mts +1 -1
  432. package/dist/lib/esm/command-handlers/file-command-handler.mjs +5 -14
  433. package/dist/lib/esm/command-handlers/folder-command-handler.d.mts +1 -1
  434. package/dist/lib/esm/command-handlers/folder-command-handler.mjs +5 -14
  435. package/dist/lib/esm/command-handlers/global-command-handler.d.mts +1 -1
  436. package/dist/lib/esm/command-handlers/global-command-handler.mjs +3 -12
  437. package/dist/lib/esm/command-handlers/index.d.mts +1 -1
  438. package/dist/lib/esm/command-handlers/index.mjs +1 -37
  439. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.d.mts +1 -1
  440. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +2 -11
  441. package/dist/lib/esm/command-handlers/open-settings-command-handler.d.mts +1 -1
  442. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +1 -37
  443. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.d.mts +1 -1
  444. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +1 -37
  445. package/dist/lib/esm/command-registrar.d.mts +1 -1
  446. package/dist/lib/esm/command-registrar.mjs +1 -37
  447. package/dist/lib/esm/community-plugins.d.mts +1 -1
  448. package/dist/lib/esm/community-plugins.mjs +2 -11
  449. package/dist/lib/esm/components/abort-signal-component.d.mts +2 -1
  450. package/dist/lib/esm/components/abort-signal-component.mjs +2 -11
  451. package/dist/lib/esm/components/all-windows-event-component.d.mts +2 -1
  452. package/dist/lib/esm/components/all-windows-event-component.mjs +1 -37
  453. package/dist/lib/esm/components/async-error-handler-component.d.mts +1 -1
  454. package/dist/lib/esm/components/async-error-handler-component.mjs +2 -11
  455. package/dist/lib/esm/components/async-events-component.d.mts +1 -1
  456. package/dist/lib/esm/components/async-events-component.mjs +2 -11
  457. package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +1 -1
  458. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +1 -37
  459. package/dist/lib/esm/components/component-ex.d.mts +1 -1
  460. package/dist/lib/esm/components/component-ex.mjs +3 -6
  461. package/dist/lib/esm/components/console-debug-component.d.mts +1 -1
  462. package/dist/lib/esm/components/console-debug-component.mjs +2 -11
  463. package/dist/lib/esm/components/core-plugin-toggle-component.d.mts +1 -1
  464. package/dist/lib/esm/components/core-plugin-toggle-component.mjs +2 -11
  465. package/dist/lib/esm/components/disposable-component.d.mts +1 -1
  466. package/dist/lib/esm/components/disposable-component.mjs +3 -6
  467. package/dist/lib/esm/components/embed-extensions-component.d.mts +1 -1
  468. package/dist/lib/esm/components/embed-extensions-component.mjs +1 -37
  469. package/dist/lib/esm/components/generate-markdown-link-default-params-component.d.mts +1 -1
  470. package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +1 -37
  471. package/dist/lib/esm/components/index.d.mts +1 -1
  472. package/dist/lib/esm/components/index.mjs +1 -37
  473. package/dist/lib/esm/components/layout-ready-component.d.mts +1 -1
  474. package/dist/lib/esm/components/layout-ready-component.mjs +2 -11
  475. package/dist/lib/esm/components/menu-event-registrar-component.d.mts +1 -1
  476. package/dist/lib/esm/components/menu-event-registrar-component.mjs +1 -37
  477. package/dist/lib/esm/components/monkey-around-component.d.mts +1 -1
  478. package/dist/lib/esm/components/monkey-around-component.mjs +2 -11
  479. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.d.mts +1 -1
  480. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +2 -11
  481. package/dist/lib/esm/components/plugin-context-component.d.mts +1 -1
  482. package/dist/lib/esm/components/plugin-context-component.mjs +2 -11
  483. package/dist/lib/esm/components/plugin-gate-component.d.mts +2 -1
  484. package/dist/lib/esm/components/plugin-gate-component.mjs +2 -11
  485. package/dist/lib/esm/components/plugin-notice-component.d.mts +2 -1
  486. package/dist/lib/esm/components/plugin-notice-component.mjs +3 -6
  487. package/dist/lib/esm/components/plugin-settings-component.d.mts +1 -1
  488. package/dist/lib/esm/components/plugin-settings-component.mjs +2 -11
  489. package/dist/lib/esm/components/plugin-settings-tab-component.d.mts +1 -1
  490. package/dist/lib/esm/components/plugin-settings-tab-component.mjs +2 -11
  491. package/dist/lib/esm/components/plugin-suggestion-component.d.mts +2 -1
  492. package/dist/lib/esm/components/plugin-suggestion-component.mjs +2 -11
  493. package/dist/lib/esm/components/pointer-position-component.d.mts +1 -1
  494. package/dist/lib/esm/components/pointer-position-component.mjs +1 -37
  495. package/dist/lib/esm/components/registry-component.d.mts +1 -1
  496. package/dist/lib/esm/components/registry-component.mjs +2 -11
  497. package/dist/lib/esm/components/release-notes-component.d.mts +2 -1
  498. package/dist/lib/esm/components/release-notes-component.mjs +2 -11
  499. package/dist/lib/esm/components/rename-delete-handler-component.d.mts +1 -1
  500. package/dist/lib/esm/components/rename-delete-handler-component.mjs +3 -6
  501. package/dist/lib/esm/components/rmdir-guard-component.d.mts +1 -1
  502. package/dist/lib/esm/components/rmdir-guard-component.mjs +1 -37
  503. package/dist/lib/esm/components/settings-migration-component.d.mts +3 -3
  504. package/dist/lib/esm/components/settings-migration-component.mjs +2 -11
  505. package/dist/lib/esm/components/syntax-highlighting-component.d.mts +1 -1
  506. package/dist/lib/esm/components/syntax-highlighting-component.mjs +2 -11
  507. package/dist/lib/esm/components/templates-language-component.d.mts +1 -1
  508. package/dist/lib/esm/components/templates-language-component.mjs +3 -39
  509. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.d.mts +1 -1
  510. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +3 -6
  511. package/dist/lib/esm/constructors/index.d.mts +1 -1
  512. package/dist/lib/esm/constructors/index.mjs +1 -37
  513. package/dist/lib/esm/css-class.d.mts +1 -1
  514. package/dist/lib/esm/css-class.mjs +1 -37
  515. package/dist/lib/esm/data-handler.d.mts +1 -1
  516. package/dist/lib/esm/data-handler.mjs +1 -37
  517. package/dist/lib/esm/dataview-link.d.mts +1 -1
  518. package/dist/lib/esm/dataview-link.mjs +2 -11
  519. package/dist/lib/esm/dataview.d.mts +2 -1
  520. package/dist/lib/esm/dataview.mjs +2 -11
  521. package/dist/lib/esm/debug.d.mts +1 -1
  522. package/dist/lib/esm/debug.mjs +2 -11
  523. package/dist/lib/esm/demo-vault-helper-settings.d.mts +1 -1
  524. package/dist/lib/esm/demo-vault-helper-settings.mjs +0 -36
  525. package/dist/lib/esm/demo-vault-helper.d.mts +1 -1
  526. package/dist/lib/esm/demo-vault-helper.mjs +2 -11
  527. package/dist/lib/esm/demo-vault-naming.d.mts +1 -1
  528. package/dist/lib/esm/demo-vault-naming.mjs +1 -37
  529. package/dist/lib/esm/desktop-demo-vault-opener.d.mts +1 -1
  530. package/dist/lib/esm/desktop-demo-vault-opener.mjs +3 -6
  531. package/dist/lib/esm/desktop-trusted-input.d.mts +2 -1
  532. package/dist/lib/esm/desktop-trusted-input.mjs +2 -11
  533. package/dist/lib/esm/editor-extension-registrar.d.mts +1 -1
  534. package/dist/lib/esm/editor-extension-registrar.mjs +2 -11
  535. package/dist/lib/esm/editor-suggest-registrar.d.mts +1 -1
  536. package/dist/lib/esm/editor-suggest-registrar.mjs +2 -11
  537. package/dist/lib/esm/editor.d.mts +1 -1
  538. package/dist/lib/esm/editor.mjs +2 -11
  539. package/dist/lib/esm/events.d.mts +1 -1
  540. package/dist/lib/esm/events.mjs +2 -11
  541. package/dist/lib/esm/extensions-registrar.d.mts +1 -1
  542. package/dist/lib/esm/extensions-registrar.mjs +2 -11
  543. package/dist/lib/esm/file-change.d.mts +2 -1
  544. package/dist/lib/esm/file-change.mjs +2 -11
  545. package/dist/lib/esm/file-explorer.d.mts +1 -1
  546. package/dist/lib/esm/file-explorer.mjs +2 -11
  547. package/dist/lib/esm/file-manager.d.mts +2 -1
  548. package/dist/lib/esm/file-manager.mjs +2 -11
  549. package/dist/lib/esm/file-system.d.mts +1 -1
  550. package/dist/lib/esm/file-system.mjs +2 -11
  551. package/dist/lib/esm/folder-note.d.mts +1 -1
  552. package/dist/lib/esm/folder-note.mjs +2 -11
  553. package/dist/lib/esm/frontmatter-formatting.d.mts +1 -1
  554. package/dist/lib/esm/frontmatter-formatting.mjs +2 -11
  555. package/dist/lib/esm/frontmatter-link-cache-with-offsets.d.mts +1 -1
  556. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +2 -11
  557. package/dist/lib/esm/frontmatter.d.mts +1 -1
  558. package/dist/lib/esm/frontmatter.mjs +2 -11
  559. package/dist/lib/esm/generated-during-build.d.mts +1 -1
  560. package/dist/lib/esm/generated-during-build.mjs +2 -38
  561. package/dist/lib/esm/hover-link-source-registrar.d.mts +1 -1
  562. package/dist/lib/esm/hover-link-source-registrar.mjs +2 -11
  563. package/dist/lib/esm/html-element.d.mts +2 -1
  564. package/dist/lib/esm/html-element.mjs +1 -37
  565. package/dist/lib/esm/i18n/custom-type-options.d.mts +1 -1
  566. package/dist/lib/esm/i18n/custom-type-options.mjs +1 -37
  567. package/dist/lib/esm/i18n/default-translations.d.mts +1 -1
  568. package/dist/lib/esm/i18n/default-translations.mjs +1 -37
  569. package/dist/lib/esm/i18n/i18n.d.mts +1 -1
  570. package/dist/lib/esm/i18n/i18n.mjs +2 -11
  571. package/dist/lib/esm/i18n/index.d.mts +1 -1
  572. package/dist/lib/esm/i18n/index.mjs +1 -37
  573. package/dist/lib/esm/i18n/locales/en.d.mts +1 -1
  574. package/dist/lib/esm/i18n/locales/en.mjs +1 -37
  575. package/dist/lib/esm/i18n/locales/index.d.mts +1 -1
  576. package/dist/lib/esm/i18n/locales/index.mjs +1 -37
  577. package/dist/lib/esm/i18n/locales/translations-map.d.mts +1 -1
  578. package/dist/lib/esm/i18n/locales/translations-map.mjs +1 -37
  579. package/dist/lib/esm/index.d.mts +1 -1
  580. package/dist/lib/esm/index.mjs +1 -37
  581. package/dist/lib/esm/is-in-obsidian.d.mts +1 -1
  582. package/dist/lib/esm/is-in-obsidian.mjs +1 -37
  583. package/dist/lib/esm/library-references.d.mts +2 -0
  584. package/dist/lib/esm/library-styles.d.mts +2 -1
  585. package/dist/lib/esm/library-styles.mjs +2 -11
  586. package/dist/lib/esm/library.mjs +1 -37
  587. package/dist/lib/esm/link-name.d.mts +1 -1
  588. package/dist/lib/esm/link-name.mjs +1 -37
  589. package/dist/lib/esm/link-update-progress.d.mts +1 -1
  590. package/dist/lib/esm/link-update-progress.mjs +0 -36
  591. package/dist/lib/esm/link.d.mts +2 -1
  592. package/dist/lib/esm/link.mjs +3 -6
  593. package/dist/lib/esm/logger.d.mts +2 -1
  594. package/dist/lib/esm/logger.mjs +2 -11
  595. package/dist/lib/esm/loop.d.mts +2 -1
  596. package/dist/lib/esm/loop.mjs +3 -6
  597. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +2 -1
  598. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +2 -11
  599. package/dist/lib/esm/markdown-code-block-processor.d.mts +2 -1
  600. package/dist/lib/esm/markdown-code-block-processor.mjs +2 -11
  601. package/dist/lib/esm/markdown-post-processor-registrar.d.mts +2 -1
  602. package/dist/lib/esm/markdown-post-processor-registrar.mjs +2 -11
  603. package/dist/lib/esm/markdown-view.d.mts +1 -1
  604. package/dist/lib/esm/markdown-view.mjs +1 -37
  605. package/dist/lib/esm/markdown.d.mts +2 -1
  606. package/dist/lib/esm/markdown.mjs +3 -6
  607. package/dist/lib/esm/menu-event-registrar.d.mts +1 -1
  608. package/dist/lib/esm/menu-event-registrar.mjs +0 -36
  609. package/dist/lib/esm/metadata-cache.d.mts +1 -1
  610. package/dist/lib/esm/metadata-cache.mjs +7 -10
  611. package/dist/lib/esm/mobile-trusted-input.d.mts +1 -1
  612. package/dist/lib/esm/mobile-trusted-input.mjs +1 -37
  613. package/dist/lib/esm/modals/alert.d.mts +2 -1
  614. package/dist/lib/esm/modals/alert.mjs +2 -11
  615. package/dist/lib/esm/modals/confirm.d.mts +2 -1
  616. package/dist/lib/esm/modals/confirm.mjs +2 -11
  617. package/dist/lib/esm/modals/index.d.mts +1 -1
  618. package/dist/lib/esm/modals/index.mjs +1 -37
  619. package/dist/lib/esm/modals/minimizable-modal.d.mts +1 -1
  620. package/dist/lib/esm/modals/minimizable-modal.mjs +2 -11
  621. package/dist/lib/esm/modals/modal-command-builder.d.mts +2 -1
  622. package/dist/lib/esm/modals/modal-command-builder.mjs +2 -11
  623. package/dist/lib/esm/modals/modal.d.mts +1 -1
  624. package/dist/lib/esm/modals/modal.mjs +2 -11
  625. package/dist/lib/esm/modals/prompt.d.mts +2 -1
  626. package/dist/lib/esm/modals/prompt.mjs +2 -11
  627. package/dist/lib/esm/modals/select-item.d.mts +1 -1
  628. package/dist/lib/esm/modals/select-item.mjs +2 -11
  629. package/dist/lib/esm/modals/select-option.d.mts +2 -1
  630. package/dist/lib/esm/modals/select-option.mjs +2 -11
  631. package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +1 -1
  632. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +1 -37
  633. package/dist/lib/esm/note-priority.d.mts +1 -1
  634. package/dist/lib/esm/note-priority.mjs +2 -11
  635. package/dist/lib/esm/notebook-navigator.d.mts +1 -1
  636. package/dist/lib/esm/notebook-navigator.mjs +1 -37
  637. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +1 -1
  638. package/dist/lib/esm/obsidian-dev-utils-state.mjs +2 -11
  639. package/dist/lib/esm/obsidian-protocol-handler-registrar.d.mts +1 -1
  640. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +2 -11
  641. package/dist/lib/esm/obsidian-settings.d.mts +1 -1
  642. package/dist/lib/esm/obsidian-settings.mjs +2 -11
  643. package/dist/lib/esm/parse-link.d.mts +1 -1
  644. package/dist/lib/esm/parse-link.mjs +2 -11
  645. package/dist/lib/esm/path-settings.d.mts +1 -1
  646. package/dist/lib/esm/path-settings.mjs +2 -11
  647. package/dist/lib/esm/pdf.d.mts +2 -1
  648. package/dist/lib/esm/pdf.mjs +2 -11
  649. package/dist/lib/esm/plugin/index.d.mts +1 -1
  650. package/dist/lib/esm/plugin/index.mjs +1 -37
  651. package/dist/lib/esm/plugin/plugin-api-schema.d.mts +19 -41
  652. package/dist/lib/esm/plugin/plugin-api-schema.mjs +6 -38
  653. package/dist/lib/esm/plugin/plugin-api.d.mts +35 -50
  654. package/dist/lib/esm/plugin/plugin-api.mjs +2 -11
  655. package/dist/lib/esm/plugin/plugin-context.d.mts +2 -1
  656. package/dist/lib/esm/plugin/plugin-context.mjs +2 -11
  657. package/dist/lib/esm/plugin/plugin-event-source.d.mts +1 -1
  658. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -37
  659. package/dist/lib/esm/plugin/plugin-install-state.d.mts +1 -1
  660. package/dist/lib/esm/plugin/plugin-install-state.mjs +1 -37
  661. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +1 -1
  662. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -37
  663. package/dist/lib/esm/plugin/plugin-settings-tab.d.mts +2 -1
  664. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +2 -11
  665. package/dist/lib/esm/plugin/plugin.d.mts +1 -1
  666. package/dist/lib/esm/plugin/plugin.mjs +2 -11
  667. package/dist/lib/esm/plugin/settings-migration-api.d.mts +3 -3
  668. package/dist/lib/esm/plugin/settings-migration-api.mjs +3 -12
  669. package/dist/lib/esm/plugin-cli-handler-registrar.d.mts +1 -1
  670. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +2 -11
  671. package/dist/lib/esm/popovers/field-popover.d.mts +1 -1
  672. package/dist/lib/esm/popovers/field-popover.mjs +2 -11
  673. package/dist/lib/esm/popovers/index.d.mts +1 -1
  674. package/dist/lib/esm/popovers/index.mjs +1 -37
  675. package/dist/lib/esm/popovers/popover-anchor.d.mts +2 -1
  676. package/dist/lib/esm/popovers/popover-anchor.mjs +2 -11
  677. package/dist/lib/esm/popovers/popover.d.mts +2 -1
  678. package/dist/lib/esm/popovers/popover.mjs +2 -11
  679. package/dist/lib/esm/property-entry.d.mts +1 -1
  680. package/dist/lib/esm/property-entry.mjs +1 -37
  681. package/dist/lib/esm/queue.d.mts +2 -1
  682. package/dist/lib/esm/queue.mjs +2 -11
  683. package/dist/lib/esm/react/app-context.d.mts +1 -1
  684. package/dist/lib/esm/react/app-context.mjs +2 -11
  685. package/dist/lib/esm/react/index.d.mts +1 -1
  686. package/dist/lib/esm/react/index.mjs +1 -37
  687. package/dist/lib/esm/reference.d.mts +1 -1
  688. package/dist/lib/esm/reference.mjs +2 -11
  689. package/dist/lib/esm/resource-lock.d.mts +2 -1
  690. package/dist/lib/esm/resource-lock.mjs +2 -11
  691. package/dist/lib/esm/resource-url.d.mts +1 -1
  692. package/dist/lib/esm/resource-url.mjs +2 -11
  693. package/dist/lib/esm/ribbon-icon-registrar.d.mts +2 -1
  694. package/dist/lib/esm/ribbon-icon-registrar.mjs +2 -11
  695. package/dist/lib/esm/setting-components/checkbox-component.d.mts +2 -1
  696. package/dist/lib/esm/setting-components/checkbox-component.mjs +2 -11
  697. package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +2 -1
  698. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +2 -11
  699. package/dist/lib/esm/setting-components/date-component.d.mts +2 -1
  700. package/dist/lib/esm/setting-components/date-component.mjs +2 -11
  701. package/dist/lib/esm/setting-components/date-time-component.d.mts +2 -1
  702. package/dist/lib/esm/setting-components/date-time-component.mjs +2 -11
  703. package/dist/lib/esm/setting-components/email-component.d.mts +2 -1
  704. package/dist/lib/esm/setting-components/email-component.mjs +1 -37
  705. package/dist/lib/esm/setting-components/file-component.d.mts +2 -1
  706. package/dist/lib/esm/setting-components/file-component.mjs +1 -37
  707. package/dist/lib/esm/setting-components/index.d.mts +1 -1
  708. package/dist/lib/esm/setting-components/index.mjs +1 -37
  709. package/dist/lib/esm/setting-components/month-component.d.mts +2 -1
  710. package/dist/lib/esm/setting-components/month-component.mjs +2 -11
  711. package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +3 -1
  712. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +2 -11
  713. package/dist/lib/esm/setting-components/multiple-email-component.d.mts +2 -1
  714. package/dist/lib/esm/setting-components/multiple-email-component.mjs +1 -37
  715. package/dist/lib/esm/setting-components/multiple-file-component.d.mts +2 -1
  716. package/dist/lib/esm/setting-components/multiple-file-component.mjs +2 -11
  717. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +2 -1
  718. package/dist/lib/esm/setting-components/multiple-text-component.mjs +2 -11
  719. package/dist/lib/esm/setting-components/number-component.d.mts +2 -1
  720. package/dist/lib/esm/setting-components/number-component.mjs +1 -37
  721. package/dist/lib/esm/setting-components/password-component.d.mts +2 -1
  722. package/dist/lib/esm/setting-components/password-component.mjs +1 -37
  723. package/dist/lib/esm/setting-components/setting-component-wrapper.d.mts +2 -1
  724. package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +2 -11
  725. package/dist/lib/esm/setting-components/telephone-component.d.mts +2 -1
  726. package/dist/lib/esm/setting-components/telephone-component.mjs +1 -37
  727. package/dist/lib/esm/setting-components/text-based-component.d.mts +1 -1
  728. package/dist/lib/esm/setting-components/text-based-component.mjs +2 -11
  729. package/dist/lib/esm/setting-components/time-component.d.mts +2 -1
  730. package/dist/lib/esm/setting-components/time-component.mjs +2 -11
  731. package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +2 -1
  732. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +2 -11
  733. package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +3 -1
  734. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +2 -11
  735. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +3 -1
  736. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +2 -11
  737. package/dist/lib/esm/setting-components/typed-range-text-component.d.mts +1 -1
  738. package/dist/lib/esm/setting-components/typed-range-text-component.mjs +1 -37
  739. package/dist/lib/esm/setting-components/typed-text-component.d.mts +2 -1
  740. package/dist/lib/esm/setting-components/typed-text-component.mjs +2 -11
  741. package/dist/lib/esm/setting-components/url-component.d.mts +2 -1
  742. package/dist/lib/esm/setting-components/url-component.mjs +1 -37
  743. package/dist/lib/esm/setting-components/validator-component.d.mts +1 -1
  744. package/dist/lib/esm/setting-components/validator-component.mjs +2 -11
  745. package/dist/lib/esm/setting-components/value-component-with-change-tracking.d.mts +1 -1
  746. package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +0 -36
  747. package/dist/lib/esm/setting-components/week-component.d.mts +2 -1
  748. package/dist/lib/esm/setting-components/week-component.mjs +2 -11
  749. package/dist/lib/esm/setting-ex.d.mts +2 -1
  750. package/dist/lib/esm/setting-ex.mjs +2 -11
  751. package/dist/lib/esm/setting-group-ex.d.mts +2 -1
  752. package/dist/lib/esm/setting-group-ex.mjs +2 -11
  753. package/dist/lib/esm/status-bar-item-registrar.d.mts +2 -1
  754. package/dist/lib/esm/status-bar-item-registrar.mjs +2 -11
  755. package/dist/lib/esm/templater.d.mts +1 -1
  756. package/dist/lib/esm/templater.mjs +1 -37
  757. package/dist/lib/esm/transformers/duration-transformer.d.mts +1 -1
  758. package/dist/lib/esm/transformers/duration-transformer.mjs +2 -11
  759. package/dist/lib/esm/transformers/index.d.mts +1 -1
  760. package/dist/lib/esm/transformers/index.mjs +1 -37
  761. package/dist/lib/esm/trusted-input.d.mts +1 -1
  762. package/dist/lib/esm/trusted-input.mjs +2 -11
  763. package/dist/lib/esm/validation.d.mts +1 -1
  764. package/dist/lib/esm/validation.mjs +2 -11
  765. package/dist/lib/esm/vault-delete.d.mts +1 -1
  766. package/dist/lib/esm/vault-delete.mjs +2 -11
  767. package/dist/lib/esm/vault-transaction.d.mts +1 -1
  768. package/dist/lib/esm/vault-transaction.mjs +3 -6
  769. package/dist/lib/esm/vault.d.mts +1 -1
  770. package/dist/lib/esm/vault.mjs +3 -6
  771. package/dist/lib/esm/view-registrar.d.mts +1 -1
  772. package/dist/lib/esm/view-registrar.mjs +2 -11
  773. package/dist/lib/esm/workspace.d.mts +2 -1
  774. package/dist/lib/esm/workspace.mjs +2 -11
  775. package/package.json +16 -5
@@ -2,7 +2,6 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
-
6
5
  (function () {
7
6
  function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
7
  symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
@@ -33,10 +32,8 @@ function ensureBrowserProcess() {
33
32
  existingProcessRecord["browser"] = true;
34
33
  }
35
34
 
36
- (function initEsm() {
37
- ensureDisposeSymbols();
38
- ensureBrowserProcess();
39
- })();
35
+ ensureDisposeSymbols();
36
+ ensureBrowserProcess();
40
37
  })();
41
38
 
42
39
  import { snapshot } from "@mnaoumov/typescript-lib/array";
@@ -537,4 +534,4 @@ export {
537
534
  PluginNoticeComponent,
538
535
  PluginNoticeMode
539
536
  };
540
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VTX1NUQVRFX0tFWSA9ICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudDpwZXJtYW5lbnQtbm90aWNlcyc7XG5jb25zdCBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA9IDA7XG5jb25zdCBERUZBVUxUX0RFTEFZX0JFRk9SRV9TSE9XX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbi8vIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQgbm90aWNlIGR1cmF0aW9uLCBhcHBsaWVkIGJ5IHRoZSBgTm90aWNlYCBjb25zdHJ1Y3RvciB3aGVuIG5vbmUgaXMgZ2l2ZW4uIEl0IGlzXG4vLyByZXBlYXRlZCBoZXJlIGJlY2F1c2UgcmVzdGFydGluZyB0aGUgY291bnRkb3duIG9uIGFuIGFwcGVuZCBnb2VzIHRocm91Z2ggYHNldEF1dG9IaWRlYCwgd2hpY2ggdGFrZXMgYW5cbi8vIGV4cGxpY2l0IGR1cmF0aW9uIGFuZCBzbyBjYW5ub3QgZmFsbCBiYWNrIHRvIHRoYXQgZGVmYXVsdCBpdHNlbGYuXG5jb25zdCBPQlNJRElBTl9ERUZBVUxUX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSA0MDAwO1xuXG4vLyBFbGVtZW50cyBhIHVzZXIgY2xpY2tzIHRvIGFjdCBvbiB0aGVtIHJhdGhlciB0aGFuIHRvIGRpc21pc3MgdGhlIG5vdGljZS4gQSBjbGljayBsYW5kaW5nIG9uIChvclxuLy8gaW5zaWRlKSBvbmUgb2YgdGhlc2UgaXMga2VwdCBmcm9tIGJ1YmJsaW5nIHRvIHRoZSBub3RpY2UsIHNvIHRoZSBub3RpY2Ugc3RheXMgb3Blbi5cbmNvbnN0IElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IgPSAnYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbGFiZWwsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbcm9sZT1cImJ1dHRvblwiXSwgW3JvbGU9XCJsaW5rXCJdLCBbcm9sZT1cImNoZWNrYm94XCJdLCBbcm9sZT1cInRhYlwiXSwgW3JvbGU9XCJtZW51aXRlbVwiXSc7XG5cbi8qKlxuICogSG93IGEgbmV3IG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSBcdTIwMTQgdGhlIG9uZSBvY2N1cHlpbmcgdGhlIHNpbmdsZSBwZXItcGx1Z2luXG4gKiBzbG90IHRoaXMgY29tcG9uZW50IGtlZXBzLlxuICpcbiAqIFJhdyBgbmV3IE5vdGljZSguLi4pYCBjYWxscyBhbHdheXMgcGlsZSB1cCwgd2hpY2ggaXMgcmFyZWx5IHdoYXQgYSBwbHVnaW4gd2FudHM6IHVzdWFsbHkgb25seSB0aGVcbiAqIGxhdGVzdCBtZXNzYWdlIG1hdHRlcnMuIFNvIHRoZSBzbG90IGV4aXN0cywgYW5kIHRoaXMgY2hvb3NlcyB3aGF0IGEgbmV3IG1lc3NhZ2UgZG9lcyB3aXRoIGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Ob3RpY2VNb2RlIHtcbiAgLyoqXG4gICAqIEFkZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIGN1cnJlbnQgbm90aWNlLCBzbyBib3RoIG1lc3NhZ2VzIHN0YXkgdmlzaWJsZSBpbiBhIHNpbmdsZSBub3RpY2UgXHUyMDE0IGZvciBhXG4gICAqIHJ1bm5pbmcgYWNjb3VudCBvZiBhbiBvcGVyYXRpb24uIFRoZSBjb3VudGRvd24gcmVzdGFydHMsIHNvIGFuIGFwcGVuZGVkIG1lc3NhZ2UgaXMgcmVhZGFibGUgZm9yIGFcbiAgICogZnVsbCBkdXJhdGlvbiByYXRoZXIgdGhhbiBpbmhlcml0aW5nIHRoZSByZW1haW5zIG9mIHRoZSBjdXJyZW50IG9uZS5cbiAgICpcbiAgICogRmFsbHMgYmFjayB0byB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgbm90aWNlIG9uIHNjcmVlbiAoaXQgd2FzXG4gICAqIG5ldmVyIHNob3duLCBvciBpdCBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWQpLlxuICAgKi9cbiAgQXBwZW5kID0gJ2FwcGVuZCcsXG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBhbmQgc2hvd3MgdGhpcyBvbmUgaW4gaXRzIHBsYWNlLCBzbyBvbmx5IHRoZSBsYXRlc3QgbWVzc2FnZSBpcyBvbiBzY3JlZW4uXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGFuZCB0aGUgcmVhc29uIHRoZSBzbG90IGV4aXN0cy5cbiAgICovXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBtZXNzYWdlIGFzIGl0cyBvd24gbm90aWNlLCBsZWF2aW5nIHRoZSBjdXJyZW50IG9uZSBhbG9uZTogYm90aCBhcmUgb24gc2NyZWVuLCBwaWxlZCB1cFxuICAgKiBsaWtlIHBsYWluIGBuZXcgTm90aWNlKC4uLilgIGNhbGxzLiBBIHNlcGFyYXRlIG5vdGljZSBuZXZlciByZXBsYWNlcywgYW5kIGlzIG5ldmVyIHJlcGxhY2VkIGJ5LCBhXG4gICAqIHNsb3Qgbm90aWNlOyBhbnkgbnVtYmVyIG9mIHRoZW0gY29leGlzdC4gVGhleSBhcmUgc3RpbGwgaGlkZGVuIHRvZ2V0aGVyIG9uIHVubG9hZC5cbiAgICovXG4gIFNlcGFyYXRlID0gJ3NlcGFyYXRlJ1xufVxuXG4vKipcbiAqIFRoZSBldmVudCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30gd2hlbiB0aGUgbm90aWNlJ3NcbiAqIGNsb3NlIChYKSBidXR0b24gaXMgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQge1xuICAvKipcbiAgICogQ2FuY2VscyB0aGUgY2xvc2UsIGxlYXZpbmcgdGhlIG5vdGljZSBvcGVuLlxuICAgKi9cbiAgY2FuY2VsOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgZGVsYXllZCBub3RpY2UgY3JlYXRlZCBieSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS4gSXQgaXMgYVxuICoge0BsaW5rIERpc3Bvc2FibGV9IChzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGB1c2luZ2ApIHRoYXQgYWxzbyBsZXRzIHRoZSBjb250ZW50IGJlIHVwZGF0ZWQgd2hpbGUgdGhlXG4gKiBub3RpY2UgaXMgc2hvd24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSBleHRlbmRzIERpc3Bvc2FibGUge1xuICAvKipcbiAgICogUmVwbGFjZXMgdGhpcyBoYW5kbGUncyBtZXNzYWdlLCByZS1hcHBseWluZyB0aGUgcGx1Z2luLW5hbWUgcHJlZml4LCB0aGUgaW50ZXJhY3RpdmUtY2xpY2sgZ3VhcmQsIGFuZFxuICAgKiB0aGUgQ2FuY2VsIGJ1dHRvbi4gVXNlZnVsIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MuIElmIHRoZSBkZWxheSBoYXMgbm90IGVsYXBzZWQgeWV0LCB0aGUgbmV3IGNvbnRlbnRcbiAgICogYmVjb21lcyB3aGF0IGlzIHNob3duIG9uY2UgaXQgZG9lcy5cbiAgICpcbiAgICogT25seSB0aGlzIGhhbmRsZSdzIG93biBtZXNzYWdlIGlzIHJld3JpdHRlbjogd2hlbiB0aGUgbm90aWNlIHdhcyBqb2luZWQgcmF0aGVyIHRoYW4gb3BlbmVkIChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLm1vZGV9KSwgdGhlIG1lc3NhZ2VzIGFscmVhZHkgaW4gaXQgYXJlIGxlZnRcbiAgICogYWxvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIG5ldyBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHNldENvbnRlbnQ6IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGEgQ2FuY2VsIGJ1dHRvbiBpcyBhcHBlbmRlZCB0byB0aGUgbm90aWNlOyBjbGlja2luZyBpdCBhYm9ydHMgdGhpcyBjb250cm9sbGVyLiBXaGVuXG4gICAqIG9taXR0ZWQsIG5vIENhbmNlbCBidXR0b24gaXMgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBDYW5jZWwgYnV0dG9uIHNob3duIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogaXMgcHJvdmlkZWQuIFdoZW4gb21pdHRlZCwgdGhlIGxvY2FsaXplZCBgQ2FuY2VsYCBsYWJlbCBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb250ZW50LCByZXNvbHZlZCBsYXppbHkgb25seSBpZiB0aGUgZGVsYXkgZWxhcHNlcyBcdTIwMTQgc28gYW4gb3BlcmF0aW9uIHRoYXQgZmluaXNoZXNcbiAgICogc29vbmVyIG5ldmVyIGJ1aWxkcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBvcGVyYXRpb24gbXVzdCBydW4gYmVmb3JlIHRoZSBub3RpY2UgaXMgc2hvd24uIE9wZXJhdGlvbnMgdGhhdCBmaW5pc2ggc29vbmVyIG5ldmVyXG4gICAqIHNob3cgYSBub3RpY2UsIGF2b2lkaW5nIGEgZGlzdHJhY3RpbmcgZmxhc2guXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2UgXHUyMDE0IHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSBpcyB3b3J0aCBjb25zaWRlcmluZyBmb3IgYSBsb25nIG9wZXJhdGlvbjogb24gdGhlIGRlZmF1bHRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gdGhlIHByb2dyZXNzIG5vdGljZSB0YWtlcyB0aGUgc2hhcmVkIHNsb3QsIHNvIGFueSBvcmRpbmFyeSBub3RpY2VcbiAgICogcmFpc2VkIHdoaWxlIHRoZSBvcGVyYXRpb24gcnVucyBoaWRlcyBpdCwgYW5kIHRoZSBwcm9ncmVzcyB0aGUgdXNlciB3YXMgd2F0Y2hpbmcgZG9lcyBub3QgY29tZSBiYWNrLlxuICAgKlxuICAgKiBXaGljaGV2ZXIgbW9kZSBpcyB1c2VkLCB0aGUgcmV0dXJuZWQgaGFuZGxlIG93bnMgb25seSBJVFMgbWVzc2FnZTogdXBkYXRpbmcgdGhlIGNvbnRlbnQgcmV3cml0ZXNcbiAgICogdGhhdCBtZXNzYWdlIGFsb25lLCBhbmQgZGlzcG9zaW5nIHRha2VzIGF3YXkgb25seSB0aGF0IG1lc3NhZ2Ugd2hlbiB0aGUgbm90aWNlIHdhcyBhbHJlYWR5IG9uXG4gICAqIHNjcmVlbiAoYSBub3RpY2UgdGhpcyBoYW5kbGUgb3BlbmVkIGlzIGhpZGRlbiBhcyBhIHdob2xlKS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX1cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHNob3VsZCBzdGF5IHVudGlsIGl0IGlzIHJlcGxhY2VkLCB0aGUgcGx1Z2luIGlzIHJlbG9hZGVkLCBvciB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBpcyBub3QgaGlkZGVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzLCBzbyBpdCBjYW5cbiAgICogY29tbXVuaWNhdGUgc3RhdGUgdGhhdCBvdXRsaXZlcyB0aGUgcGx1Z2luIChlLmcuIGEgY2xlYW51cCB0aGF0IHJlcXVpcmVzIGEgcmVsb2FkKS4gVGhlcmUgaXMgYXQgbW9zdCBvbmUgcGVybWFuZW50XG4gICAqIG5vdGljZSBwZXIgcGx1Z2luOiBpdCBpcyBoaWRkZW4gYnkgdGhlIG5leHQge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfSBjYWxsIGFuZCBkaXNtaXNzZWRcbiAgICogYXV0b21hdGljYWxseSB0aGUgbmV4dCB0aW1lIHRoZSBjb21wb25lbnQgbG9hZHMgKGkuZS4gd2hlbiB0aGUgcGx1Z2luIGlzIHJlLWVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1Blcm1hbmVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyB0aGlzIG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSBcdTIwMTQgc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAgICpcbiAgICogQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKGl0IG5lZWRzIHRoZSBzaGFyZWQgc2xvdCBpdCBpc1xuICAgKiB0cmFja2VkIGluKSwgYW5kIGEgbm90aWNlIHRoYXQgZG9lcyBub3QgaGlkZSBvbiBjbGljayBtdXN0IGJlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSAoc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQpOyBlaXRoZXJcbiAgICogY29udHJhZGljdGlvbiB0aHJvd3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9LCBvciB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gd2hlblxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGlzIGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNsb3NlIChYKSBidXR0b24sIGJlZm9yZSB0aGUgbm90aWNlIGlzIGhpZGRlbi4gQ2FsbFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50LmNhbmNlbH0gb24gdGhlIGV2ZW50IHRvIGNhbmNlbCB0aGUgY2xvc2UgYW5kIGtlZXAgdGhlIG5vdGljZVxuICAgKiBvcGVuIFx1MjAxNCBmb3IgZXhhbXBsZSBhZnRlciB5b3VyIG93biBjb25maXJtYXRpb24gZGVjbGluZXMuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIGF3YWl0ZWQgYmVmb3JlIHRoZVxuICAgKiBub3RpY2UgaXMgaGlkZGVuLiBSdW5zIG9ubHkgd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93biAoYm90aFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYXJlIHNldCkuXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIG5vdGljZSBpcyBoaWRkZW4gXHUyMDE0IHdoZXRoZXIgYnkgdGhlIHVzZXIgY2xvc2luZyBpdCwgYnkgYSBsYXRlciByZXVzYWJsZVxuICAgKiBub3RpY2UgcmVwbGFjaW5nIGl0LCBieSBpdHMgZHVyYXRpb24gZWxhcHNpbmcsIG9yIG9uIGNvbXBvbmVudCB1bmxvYWQuIEl0IHJ1bnMgYXQgbW9zdCBvbmNlIHBlclxuICAgKiBub3RpY2UuIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm99IGFyZ3VtZW50IGRpc3Rpbmd1aXNoZXMgYSB1c2VyIGNsb3NlICh0aGUgY2xvc2UgYnV0dG9uKSBmcm9tXG4gICAqIGEgcHJvZ3JhbW1hdGljIGhpZGUuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIHJ1biBmaXJlLWFuZC1mb3JnZXQgKGl0cyByZWplY3Rpb24gc3VyZmFjZXMgdGhyb3VnaCB0aGVcbiAgICogYXN5bmMtZXJyb3IgcGlwZWxpbmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIHRoZSBub3RpY2UgaGlkZXMgaXQuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBub3RpY2UgZGlzbWlzc2VzIG9uIGNsaWNrIGxpa2VcbiAgICogYSBub3JtYWwgT2JzaWRpYW4gbm90aWNlLiBXaGVuIGBmYWxzZWAsIHRoZSBub3RpY2UgaXMgaGFyZCB0byBjbG9zZTogaXQgZG9lcyBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXlcbiAgICogY2xpY2ssIGFuZCBpbnN0ZWFkIHNob3dzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0aGF0IGhpZGVzIGl0IGRpcmVjdGx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9KS5cbiAgICpcbiAgICogQSBgc2hvdWxkSGlkZU9uQ2xpY2s6IGZhbHNlYCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgc3RhbmRzIG9uIGl0cyBvd25cbiAgICogKGltcGxpZXMge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9KSwgc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQ7IHBhc3NpbmdcbiAgICogYW55IG90aGVyIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSB0b2dldGhlciB3aXRoIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgXG4gICAqIHRocm93cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIaWRlT25DbGljaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsb3NlIChYKSBidXR0b24gaXMgc2hvd24gb24gYSBoYXJkLXRvLWNsb3NlIG5vdGljZVxuICAgKiAoe0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWApLiBXaGVuIGBmYWxzZWAsIG5vIGNsb3NlXG4gICAqIGJ1dHRvbiBpcyByZW5kZXJlZCBhbmQgdGhlIG5vdGljZSBjYW4gb25seSBiZSBoaWRkZW4gcHJvZ3JhbW1hdGljYWxseS4gSWdub3JlZCB1bmxlc3NcbiAgICogYHNob3VsZEhpZGVPbkNsaWNrYCBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHdoeSBhIG5vdGljZSB3YXMgaGlkZGVuLCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlSGlkZUluZm8ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHdhcyBoaWRkZW4gYnkgdGhlIHVzZXIgY2xpY2tpbmcgaXRzIGNsb3NlIChYKSBidXR0b24gc3BlY2lmaWNhbGx5LiBBbHdheXMgaW1wbGllc1xuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm8uaXNVc2VyQWN0aW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2xvc2VCdXR0b25DbGlja2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSBhIHVzZXIgYWN0aW9uIFx1MjAxNCBjbGlja2luZyB0aGUgY2xvc2UgKFgpIGJ1dHRvbiwgb3IgY2xpY2tpbmcgYVxuICAgKiBkaXNtaXNzaWJsZSBub3RpY2UgdG8gZGlzbWlzcyBpdCBcdTIwMTQgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWF0aWNhbGx5IChhIGxhdGVyIHJldXNhYmxlIG5vdGljZSByZXBsYWNpbmdcbiAgICogaXQsIGFuIGV4cGxpY2l0IGBoaWRlKClgLCB0aGUgZHVyYXRpb24gZWxhcHNpbmcsIG9yIGNvbXBvbmVudCB1bmxvYWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNVc2VyQWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMge1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBnZXROb3RpY2U6ICgpID0+IE5vdGljZSB8IG51bGw7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljaz86IChldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIGlzIGhhcmQgdG8gY2xvc2U6IHN0b3BzIGV2ZXJ5IGNsaWNrIGZyb20gZGlzbWlzc2luZyBpdCBhbmQsIHVubGVzcyBzdXBwcmVzc2VkIGJ5XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSwgYWRkcyBhIGNsb3NlIGJ1dHRvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNFeHBsaWNpdENsb3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWVzc2FnZSBpcyBwcmVmaXhlZCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gT25seSBhIG1lc3NhZ2UgdGhhdCBvcGVucyBhIG5vdGljZSBpc1xuICAgKiBwcmVmaXhlZDsgYSBtZXNzYWdlIGFwcGVuZGVkIHRvIG9uZSBhbHJlYWR5IHNob3dpbmcgaXQgaXMgbm90LCBzbyB0aGUgbmFtZSBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnlcbiAgICogbGluZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBjbG9zZSBidXR0b24gd2hlbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnJlcXVpcmVzRXhwbGljaXRDbG9zZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJ1aWx0IG1lc3NhZ2U6IHRoZSB3cmFwcGVyIGVsZW1lbnQgaG9sZGluZyBpdCwgYW5kIHRoZSBmcmFnbWVudCB0aGF0IGVsZW1lbnQgc2l0cyBpbi5cbiAqXG4gKiBUaGUgZWxlbWVudCBpcyBoYW5kZWQgYmFjayBiZWNhdXNlIGEgbm90aWNlIGNhbiBob2xkIHNldmVyYWwgb2YgdGhlbSAoc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZH0pLFxuICogc28gd2hvZXZlciBvd25zIG9uZSBtZXNzYWdlIGhhcyB0byBiZSBhYmxlIHRvIHVwZGF0ZSBvciByZW1vdmUgZXhhY3RseSB0aGF0IG1lc3NhZ2UuIFRoZSByZWZlcmVuY2VcbiAqIHN0YXlzIHZhbGlkIG9uY2UgdGhlIGZyYWdtZW50IGlzIGhhbmRlZCB0byBgTm90aWNlYDogYXBwZW5kaW5nIGEgZnJhZ21lbnQgbW92ZXMgaXRzIGNoaWxkcmVuIHJhdGhlclxuICogdGhhbiBjb3B5aW5nIHRoZW0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHdyYXBwaW5nIHRoaXMgbWVzc2FnZSBhbG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFnbWVudCBob2xkaW5nIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50LmNvbnRlbnRFbH0sIHJlYWR5IHRvIGhhbmQgdG8gYE5vdGljZWBcbiAgICogb3IgdG8gYXBwZW5kIGludG8gb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcHV0IG9uIHNjcmVlbiwgYW5kIHdoZXJlIGl0IGVuZGVkIHVwLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgaG9sZGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUsIGluc2lkZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uubm90aWNlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBtZXNzYWdlIGNyZWF0ZWQgdGhlIG5vdGljZSwgYXMgb3Bwb3NlZCB0byBqb2luaW5nIG9uZSB0aGF0IHdhcyBhbHJlYWR5IG9uIHNjcmVlbi5cbiAgICogT25seSB0aGUgY3JlYXRvciBtYXkgaGlkZSBpdDsgYSBqb2luZWQgbWVzc2FnZSBjYW4gbWVyZWx5IHJlbW92ZSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBpc05vdGljZU93bmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWNlOiBOb3RpY2U7XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlV2l0aER1cmF0aW9uUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZTogUGx1Z2luTm90aWNlTW9kZTtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrOiAoKGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvbkhpZGU6ICgoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbjogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIHNob3dpbmcgcGx1Z2luIG5vdGljZXMuIEJ5IGRlZmF1bHQgYSBuZXcgbm90aWNlIGhpZGVzIHRoZSBwcmV2aW91cyBvbmUsIHNvIG9ubHkgdGhlIGxhdGVzdFxuICogbWVzc2FnZSBpcyBvbiBzY3JlZW47IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSBjaG9vc2VzIG90aGVyd2lzZSBcdTIwMTQgc2VlXG4gKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIG5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZGFsb25lTm90aWNlcyA9IG5ldyBTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDbGlja2VkTm90aWNlcyA9IG5ldyBXZWFrU2V0PE5vdGljZT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIHBlcm1hbmVudCBub3RpY2UgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBsb2FkIChlLmcuIGEgcHJldmlvdXMgcGx1Z2luIHNlc3Npb24pIG9uIGxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHBlcm1hbmVudE5vdGljZSA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlKCk7XG4gICAgcGVybWFuZW50Tm90aWNlPy5oaWRlKCk7XG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIG9uIHVubG9hZCwgdW5sZXNzIGl0IGlzIHRoZSBwZXJtYW5lbnQgbm90aWNlICh3aGljaCBpcyBtZWFudCB0byBvdXRsaXZlIHRoZSBwbHVnaW4pLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIC8vIENhbmNlbCBhbnkgZGVsYXllZCBub3RpY2Ugd2hvc2UgdGltZXIgaGFzIG5vdCBmaXJlZCB5ZXQsIHNvIGl0IG5ldmVyIGFwcGVhcnMgYWZ0ZXIgdW5sb2FkLlxuICAgIGZvciAoY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyIG9mIHNuYXBzaG90KHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucykpIHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKSAhPT0gdGhpcy5ub3RpY2UpIHtcbiAgICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhbmRhbG9uZU5vdGljZSBvZiB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzKSB7XG4gICAgICBzdGFuZGFsb25lTm90aWNlLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlID8/IChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlIDogUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlKTtcblxuICAgIGlmIChvcHRpb25zPy5tb2RlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5tb2RlICE9PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gaXNQZXJtYW5lbnQgfHwgcmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBtb2RlLFxuICAgICAgb25DbG9zZUNsaWNrOiBvcHRpb25zPy5vbkNsb3NlQ2xpY2ssXG4gICAgICBvbkhpZGU6IG9wdGlvbnM/Lm9uSGlkZSxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGlzUGVybWFuZW50LFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBvcHRpb25zPy5zaG91bGRTaG93Q2xvc2VCdXR0b24gPz8gdHJ1ZVxuICAgIH0pLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSBcdTIwMTQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpc1xuICAgKiBkaXNwb3NlZCAod2hpY2ggYWxzbyBjYW5jZWxzIHRoZSBwZW5kaW5nIHRpbWVyIGlmIGl0IGhhcyBub3QgZmlyZWQgeWV0KSwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiBgdXNpbmdgLiBXaGVuIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGdpdmVuLCBhXG4gICAqIENhbmNlbCBidXR0b24gdGhhdCBhYm9ydHMgaXQgaXMgYXBwZW5kZWQgKGFuZCwgYmVpbmcgaW50ZXJhY3RpdmUsIGRvZXMgbm90IGRpc21pc3MgdGhlIG5vdGljZSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ub3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgKiAgIGFib3J0Q29udHJvbGxlcixcbiAgICogICBjb250ZW50OiAoKSA9PiBidWlsZFByb2dyZXNzRnJhZ21lbnQoKVxuICAgKiB9KTtcbiAgICogYXdhaXQgcnVuT3BlcmF0aW9uKGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlfSB0aGF0IGhpZGVzIHRoZSBub3RpY2UgKG9yIGNhbmNlbHMgdGhlIHBlbmRpbmdcbiAgICogdGltZXIpIHdoZW4gZGlzcG9zZWQgYW5kIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSBpdCBpcyBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlQWZ0ZXJEZWxheShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSB7XG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5tb2RlID8/IFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZTtcbiAgICAvLyBXaGVyZSB0aGlzIG1lc3NhZ2UgZW5kZWQgdXA6IGEgbm90aWNlIG9mIGl0cyBvd24sIG9yIGEgY2h1bmsgaW5zaWRlIG9uZSB0aGF0IHdhcyBhbHJlYWR5IHVwLiBJdFxuICAgIC8vIGRlY2lkZXMgd2hhdCBgc2V0Q29udGVudGAgcmV3cml0ZXMgYW5kIHdoYXQgZGlzcG9zaW5nIHRha2VzIGF3YXkuXG4gICAgbGV0IHNob3duOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2UgPSBudWxsO1xuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQgPSAwO1xuICAgIGxldCBjdXJyZW50Q29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPiA9IHBhcmFtcy5jb250ZW50O1xuXG4gICAgY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5kZWxldGUoY2FuY2VsUGVuZGluZ1RpbWVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGREZWxheWVkTWVzc2FnZSA9IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCA9PlxuICAgICAgdGhpcy5idWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zPih7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogcGFyYW1zLmNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0pKTtcblxuICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmVzb2x2aW5nIHRoZSBjb250ZW50IGlzIGFzeW5jaHJvbm91cywgYW5kIHRoZSBvcGVyYXRpb24gdGhlIG5vdGljZSBkZXNjcmliZXMga2VlcHMgcnVubmluZ1xuICAgICAgICAvLyB3aGlsZSBpdCBoYXBwZW5zIFx1MjAxNCBzbyBgc2V0Q29udGVudGAgY2FuIGxhbmQgaW4gYmV0d2Vlbi4gSXQgY2Fubm90IHJld3JpdGUgYSBub3RpY2UgdGhhdCBkb2VzXG4gICAgICAgIC8vIG5vdCBleGlzdCB5ZXQsIHNvIHJlc29sdmUgYWdhaW4gd2hlbmV2ZXIgdGhhdCBoYXBwZW5zOiB0aGUgbm90aWNlIG11c3Qgb3BlbiB3aXRoIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoZSBjYWxsZXIgbGFzdCBhc2tlZCBmb3IsIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiByZXNvbHV0aW9uIHN0YXJ0ZWQuXG4gICAgICAgIGxldCByZXF1ZXN0ZWRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuICAgICAgICBsZXQgcmVzb2x2ZWRDb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcmVxdWVzdGVkQ29udGVudCA9IGN1cnJlbnRDb250ZW50O1xuICAgICAgICAgIHJlc29sdmVkQ29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShyZXF1ZXN0ZWRDb250ZW50LCB7fSk7XG4gICAgICAgICAgLy8gVGhlIGhhbmRsZSBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkIHdoaWxlIHRoZSBjb250ZW50IHdhcyBiZWluZyByZXNvbHZlZDsgZG9uJ3Qgc2hvdyBhIHN0YWxlIG5vdGljZS5cbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocmVxdWVzdGVkQ29udGVudCAhPT0gY3VycmVudENvbnRlbnQpO1xuXG4gICAgICAgIHNob3duID0gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKHJlc29sdmVkQ29udGVudCksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBvbkNsb3NlQ2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvbkhpZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5hZGQoY2FuY2VsUGVuZGluZ1RpbWVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dhcHMgVEhJUyBtZXNzYWdlJ3MgZWxlbWVudCBmb3IgYSBmcmVzaGx5IGJ1aWx0IG9uZSwgcmF0aGVyIHRoYW4gcmV3cml0aW5nIHRoZSB3aG9sZSBub3RpY2U6XG4gICAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSBqb2luZWQgYSBub3RpY2UgdGhhdCB3YXMgYWxyZWFkeSB1cCwgdGhlIG90aGVyIG1lc3NhZ2VzIGluIGl0IGFyZSBub3QgaXRzIHRvXG4gICAgICAgIC8vIG92ZXJ3cml0ZS4gUmVidWlsZGluZyBhbHNvIHJlLWFwcGxpZXMgdGhlIHByZWZpeCwgdGhlIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgdGhlIENhbmNlbCBidXR0b24uXG4gICAgICAgIGNvbnN0IHJlYnVpbHQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7XG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSxcbiAgICAgICAgICBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogc2hvd24uaXNOb3RpY2VPd25lZFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvd24uY29udGVudEVsLnJlcGxhY2VXaXRoKHJlYnVpbHQuZnJhZ21lbnQpO1xuICAgICAgICBzaG93biA9IHsgLi4uc2hvd24sIGNvbnRlbnRFbDogcmVidWlsdC5jb250ZW50RWwgfTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgICAgaWYgKCFzaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIG5vdGljZSB0aGlzIGhhbmRsZSBvcGVuZWQgZ29lcyBhd2F5IHdpdGggaXQ7IGEgbm90aWNlIGl0IG1lcmVseSBqb2luZWQgYmVsb25ncyB0byB3aG9ldmVyXG4gICAgICAgIC8vIG9wZW5lZCBpdCwgc28gb25seSB0aGlzIG1lc3NhZ2UgaXMgdGFrZW4gb3V0IG9mIGl0LlxuICAgICAgICBpZiAoc2hvd24uaXNOb3RpY2VPd25lZCkge1xuICAgICAgICAgIHNob3duLm5vdGljZS5oaWRlKCk7XG4gICAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUoc2hvd24ubm90aWNlKTtcbiAgICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duLm5vdGljZSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93bi5jb250ZW50RWwucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjbG9zZSAoWCkgYnV0dG9uIHRvIHRoZSBub3RpY2UgY29udGVudC4gQ2xpY2tpbmcgaXQgZmlyZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zLm9uQ2xvc2VDbGlja30gKHdoaWNoIG1heSBjYW5jZWwgdGhlIGNsb3NlKTsgaWZcbiAgICogbm90IGNhbmNlbGxlZCwgaXQgaGlkZXMgdGhlIG5vdGljZSBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgc3RhbmRhbG9uZS1ub3RpY2UgdHJhY2tpbmcgc2V0LiBUaGUgaGlkZSBpc1xuICAgKiBtYXJrZWQgYXMgYSBjbG9zZS1idXR0b24gY2xpY2sgc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuXG4gICAqIGRpc3Rpbmd1aXNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZENsb3NlQnV0dG9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2sgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjbG9zZUJ1dHRvbkVsID0gY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBhdHRyOiB7ICdhcmlhLWxhYmVsJzogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm5vdGljZXMuY2xvc2VBcmlhTGFiZWwpIH1cbiAgICB9KTtcbiAgICAvLyBSZXVzZSBPYnNpZGlhbidzIG1vZGFsIGNsb3NlLWJ1dHRvbiBjbGFzc2VzIHNvIHRoaXMgYnV0dG9uIG1hdGNoZXMgdGhlIG5hdGl2ZSBtb2RhbCBjbG9zZSBidXR0b25cbiAgICAvLyAobG9vayBhbmQgaG92ZXIpOyB0aGUgc3R5bGVzaGVldCBvbmx5IHBvc2l0aW9ucyBpdCBpbiB0aGUgbm90aWNlIGNvcm5lci5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNsb3NlQnV0dG9uRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNsb3NlQnV0dG9uKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZENsYXNzZXMoW0Nzc0NsYXNzLkNsaWNrYWJsZUljb24sIENzc0NsYXNzLk1vZGFsSGVhZGVyQnV0dG9uXSk7XG4gICAgc2V0SWNvbihjbG9zZUJ1dHRvbkVsLCAneCcpO1xuICAgIGNsb3NlQnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBpc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICBhd2FpdCBvbkNsb3NlQ2xpY2s/Lih7XG4gICAgICAgICAgY2FuY2VsOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gQ2FuIGJlIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGljZSA9IGVuc3VyZU5vbk51bGxhYmxlKGdldE5vdGljZSgpKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgICBub3RpY2UuaGlkZSgpO1xuICAgICAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmRlbGV0ZShub3RpY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG1lc3NhZ2UgdG8gdGhlIG5vdGljZSBjdXJyZW50bHkgaW4gdGhlIHBlci1wbHVnaW4gc2xvdCwgc28gYm90aCBtZXNzYWdlcyBzdGF5IG9uIHNjcmVlbiBpbiBhXG4gICAqIHNpbmdsZSBub3RpY2UuXG4gICAqXG4gICAqIFRoZSBhcHBlbmRlZCBtZXNzYWdlIGNhcnJpZXMgbm8gcGx1Z2luLW5hbWUgcHJlZml4IFx1MjAxNCB0aGUgbm90aWNlIGFscmVhZHkgb3BlbnMgd2l0aCBvbmUsIGFuZFxuICAgKiByZXBlYXRpbmcgaXQgb24gZXZlcnkgbGluZSByZWFkcyBhcyBub2lzZS4gSXQgaXMgd3JhcHBlZCBsaWtlIGFueSBvdGhlciBub3RpY2UgY29udGVudCwgc28gYSBsaW5rIG9yXG4gICAqIGJ1dHRvbiBpbnNpZGUgaXQgc3RpbGwga2VlcHMgdGhlIG5vdGljZSBvcGVuIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQXBwZW5kaW5nIHJlc3RhcnRzIHRoZSBub3RpY2UncyBjb3VudGRvd24gKHtAbGluayBOb3RpY2Uuc2V0QXV0b0hpZGV9KSwgc28gdGhlIG5ldyBtZXNzYWdlIGdldHMgYVxuICAgKiBmdWxsIGR1cmF0aW9uIGluc3RlYWQgb2YgaW5oZXJpdGluZyB3aGF0IHdhcyBsZWZ0IG9mIHRoZSBjdXJyZW50IG9uZSBcdTIwMTQgYSBsaW5lIGFwcGVuZGVkIGEgbW9tZW50XG4gICAqIGJlZm9yZSB0aGUgbm90aWNlIGV4cGlyZXMgd291bGQgb3RoZXJ3aXNlIGZsYXNoIGFuZCB2YW5pc2guXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB0aGUgam9pbmVkIG5vdGljZSwgb3IgYG51bGxgIHdoZW5cbiAgICogdGhlcmUgaXMgbm90aGluZyBvbiBzY3JlZW4gdG8gYXBwZW5kIHRvIFx1MjAxNCB0aGUgc2xvdCBpcyBlbXB0eSwgb3IgaXRzIG5vdGljZSBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWRcbiAgICogXHUyMDE0IGFuZCB0aGUgY2FsbGVyIHNob3VsZCBzaG93IGEgbmV3IG5vdGljZSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRUb0N1cnJlbnROb3RpY2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRUb0N1cnJlbnROb3RpY2VQYXJhbXMpOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAgIGNvbnN0IHsgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcywgbWVzc2FnZSwgb25IaWRlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgY3VycmVudE5vdGljZSA9IHRoaXMubm90aWNlO1xuICAgIC8vIGBpc1Nob3duYCBpcyB0aGUgc2FtZSBjaGVjayBPYnNpZGlhbidzIG93biBgTm90aWNlLmhpZGVgIG1ha2VzIGJlZm9yZSBhbmltYXRpbmcgYSBub3RpY2UgYXdheSwgc29cbiAgICAvLyBpdCBpcyBleGFjdGx5IFwic3RpbGwgb24gc2NyZWVuXCI6IGEgbm90aWNlIHRoYXQgZXhwaXJlZCBvciB3YXMgZGlzbWlzc2VkIGhhcyBiZWVuIGRldGFjaGVkLlxuICAgIGlmICghY3VycmVudE5vdGljZT8uY29udGFpbmVyRWwuaXNTaG93bigpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfSA9IHRoaXMuYnVpbGROb3RpY2VDb250ZW50KHsgbWVzc2FnZSwgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU6IGZhbHNlIH0pO1xuICAgIGN1cnJlbnROb3RpY2UubWVzc2FnZUVsLmFwcGVuZChmcmFnbWVudCk7XG4gICAgLy8gQSBgbnVsbGAgZHVyYXRpb24gbWVhbnMgXCJPYnNpZGlhbidzIG93biBkZWZhdWx0XCIsIHdoaWNoIG9ubHkgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZXMgXHUyMDE0IHNvIHJlc3RhcnRcbiAgICAvLyB0aGUgY291bnRkb3duIHdpdGggdGhhdCBzYW1lIGRlZmF1bHQgcmF0aGVyIHRoYW4gbGVhdmluZyB0aGUgY3VycmVudCBvbmUgcnVubmluZy5cbiAgICBjdXJyZW50Tm90aWNlLnNldEF1dG9IaWRlKGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPz8gT0JTSURJQU5fREVGQVVMVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTKTtcbiAgICB0aGlzLndpcmVPbkhpZGUoY3VycmVudE5vdGljZSwgb25IaWRlKTtcbiAgICAvLyBPbmx5IGV2ZXIgcmVnaXN0ZXJzLCBuZXZlciBjbGVhcnM6IHRoZSBub3RpY2UgYmVpbmcgYXBwZW5kZWQgdG8gbWF5IGFscmVhZHkgYmUgdGhpcyBwbHVnaW4nc1xuICAgIC8vIHBlcm1hbmVudCBub3RpY2UsIGFuZCBhIGxhdGVyIGFwcGVuZGVkIG1lc3NhZ2UgaXMgbm8gcmVhc29uIHRvIGZvcmdldCB0aGF0LlxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShjdXJyZW50Tm90aWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiBmYWxzZSwgbm90aWNlOiBjdXJyZW50Tm90aWNlIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBtZXNzYWdlIGZvciBhIGRlbGF5ZWQgbm90aWNlOiB0aGUgcmVzb2x2ZWQgY29udGVudCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIENhbmNlbFxuICAgKiBidXR0b24gdGhhdCBhYm9ydHMgdGhlIHByb3ZpZGVkIGNvbnRyb2xsZXIgd2hlbiBjbGlja2VkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IGhvbGRpbmcgdGhlIGNvbnRlbnQgYW5kLCBpZiByZXF1ZXN0ZWQsIGEgQ2FuY2VsIGJ1dHRvbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGREZWxheWVkTm90aWNlTWVzc2FnZShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXMpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCB7IGFib3J0Q29udHJvbGxlciwgY2FuY2VsQnV0dG9uVGV4dCwgY29udGVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY29udGVudCk7XG4gICAgfVxuXG4gICAgaWYgKGFib3J0Q29udHJvbGxlcikge1xuICAgICAgLy8gYEJ1dHRvbkNvbXBvbmVudGAgcmVxdWlyZXMgYW4gYEhUTUxFbGVtZW50YCBwYXJlbnQsIHNvIGJ1aWxkIGl0IG9uIGEgdGhyb3dhd2F5XG4gICAgICAvLyBkZXRhY2hlZCBlbGVtZW50IGFuZCBtb3ZlIGl0cyBgYnV0dG9uRWxgIGludG8gdGhlIGZyYWdtZW50LlxuICAgICAgY29uc3QgY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbkNvbXBvbmVudChjcmVhdGVEaXYoKSk7XG4gICAgICBjYW5jZWxCdXR0b24uc2V0QnV0dG9uVGV4dChjYW5jZWxCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLmNhbmNlbCkpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjYW5jZWxCdXR0b24uYnV0dG9uRWwsIENzc0NsYXNzLkNhbmNlbEJ1dHRvbik7XG4gICAgICAvLyBUaGUgY2xpY2sgaXMgd2lyZWQgdmlhIGBhZGRFdmVudExpc3RlbmVyYCByYXRoZXIgdGhhbiBgQnV0dG9uQ29tcG9uZW50Lm9uQ2xpY2tgIHNvIGl0XG4gICAgICAvLyBidWJibGVzIHRocm91Z2ggdGhlIGludGVyYWN0aXZlLWVsZW1lbnQgZ3VhcmQgKGtlZXBpbmcgdGhlIG5vdGljZSBvcGVuKSBhbmQgc3RheXNcbiAgICAgIC8vIGRpcmVjdGx5IGV4ZXJjaXNhYmxlIHZpYSBhIGRpc3BhdGNoZWQgRE9NIGV2ZW50IGluIHVuaXQgdGVzdHMuXG4gICAgICBjYW5jZWxCdXR0b24uYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSk7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGFuIGludGVyYWN0aXZlXG4gICAqIGVsZW1lbnQgaW5zaWRlIGl0IGlzIGNsaWNrZWQuIE9ic2lkaWFuIGRpc21pc3NlcyBhIG5vdGljZSBvbiBhbnkgY2xpY2sgdGhhdCBidWJibGVzIHVwIHRvIGl0c1xuICAgKiBlbGVtZW50OyB0aGUgY29udGFpbmVyIGludGVyY2VwdHMgY2xpY2tzIG9yaWdpbmF0aW5nIG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGEgbGluaywgYnV0dG9uLFxuICAgKiBpbnB1dCwgZXRjLikgYW5kIHN0b3BzIHRoZW0gdGhlcmUsIHNvIHRoZSBlbGVtZW50J3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyBidXQgdGhlIG5vdGljZSBzdGF5cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnR9IGhvbGRpbmcgdGhlIHdyYXBwZWQgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm90aWNlQ29udGVudChwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnQge1xuICAgIGNvbnN0IHsgZ2V0Tm90aWNlLCBtZXNzYWdlLCBvbkNsb3NlQ2xpY2ssIHJlcXVpcmVzRXhwbGljaXRDbG9zZSA9IGZhbHNlLCBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSA9IHRydWUsIHNob3VsZFNob3dDbG9zZUJ1dHRvbiA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgY29udGVudEVsID0gZnJhZ21lbnQuY3JlYXRlRGl2KCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhjb250ZW50RWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNvbnRlbnQpO1xuICAgIGlmIChzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSkge1xuICAgICAgY29udGVudEVsLmFwcGVuZCh0aGlzLmJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGVudEVsLmFwcGVuZFRleHQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgIC8vIEEgaGFyZC10by1jbG9zZSBub3RpY2UgbXVzdCBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXkgY2xpY2s7IG9ubHkgaXRzIGNsb3NlIGJ1dHRvbiBtYXkgaGlkZSBpdC5cbiAgICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uKSB7XG4gICAgICB0aGlzLmFwcGVuZENsb3NlQnV0dG9uKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcz4oe1xuICAgICAgICBjb250ZW50RWwsXG4gICAgICAgIGdldE5vdGljZTogZW5zdXJlTm9uTnVsbGFibGUoZ2V0Tm90aWNlKSxcbiAgICAgICAgb25DbG9zZUNsaWNrXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50LCBwcmVmaXhpbmcgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gYSBzdHlsZWQgZWxlbWVudCBzbyBpdCBpc1xuICAgKiB2aXN1YWxseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICpcbiAgICogVGhlIG5hbWUgaXMgcmVuZGVyZWQgYXMgaW5saW5lIGNvZGUsIHRoZSB3YXkgZXZlcnkgcGx1Z2luIG5hbWUgaW4gdGhlIFVJIGlzLCBpbnNpZGUgYSBzcGFuIHRoYXQga2VlcHNcbiAgICogdGhlIHByZWZpeCdzIG93biBsYXlvdXQgYW5kIGFjY2VudCBjb2xvci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHdpdGggdGhlIHN0eWxlZCBwbHVnaW4gbmFtZSBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgbmFtZUVsID0gY3JlYXRlU3BhbigpO1xuICAgIGFwcGVuZENvZGVCbG9jayhuYW1lRWwsIHRoaXMucGx1Z2luTmFtZSk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhuYW1lRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZU5hbWUpO1xuICAgIGZyYWdtZW50LmFwcGVuZChuYW1lRWwpO1xuICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCcgKHVubG9hZGVkKScpO1xuICAgIH1cbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCdcXG4nKTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIG5vdGljZSBoYXJkIHRvIGNsb3NlOiBtYXJrcyBpdHMgb3V0ZXIgZWxlbWVudCAoc28gdGhlIENTUyBuZXV0cmFsaXplcyBpdHMgcGFkZGluZykgYW5kXG4gICAqIGluc3RhbGxzIGEgY2FwdHVyZS1waGFzZSBjbGljayBndWFyZCB0aGF0IHN0b3BzIGV2ZXJ5IGNsaWNrIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhXG4gICAqIGJ1dHRvbiwgbGluaywgdGhlIGNsb3NlIGJ1dHRvbiwgZXRjLikgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzIG93biBkaXNtaXNzIGhhbmRsZXIgXHUyMDE0IHNvIGFuXG4gICAqIGludGVyYWN0aXZlIGNoaWxkJ3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyB3aGlsZSBhIHN0cmF5IGNsaWNrIGNhbm5vdCBkaXNtaXNzIHRoZSBub3RpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIGd1YXJkLlxuICAgKiBAcGFyYW0gcmVxdWlyZXNFeHBsaWNpdENsb3NlIC0gV2hldGhlciB0aGUgbm90aWNlIHJlcXVpcmVzIGV4cGxpY2l0IGNsb3NlOyB3aGVuIGBmYWxzZWAsIG5vdGhpbmcgaXNcbiAgICogaW5zdGFsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhub3RpY2U6IE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG91dGVyIGAubm90aWNlYCBlbGVtZW50IChgY29udGFpbmVyRWxgKSBjYXJyaWVzIE9ic2lkaWFuJ3MgZGlzbWlzcy1vbi1jbGljayBoYW5kbGVyIGFuZCB0aGVcbiAgICAvLyBwYWRkaW5nIGEgc3RyYXkgY2xpY2sgY291bGQgbGFuZCBvbjsgbWFyayBpdCBzbyB0aGUgc3R5bGVzaGVldCBkcm9wcyB0aGF0IHBhZGRpbmcuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhub3RpY2UuY29udGFpbmVyRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZVJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgLy8gU3RvcCBldmVyeSBjbGljayBvbiB0aGUgbm90aWNlIFx1MjAxNCBleGNlcHQgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCBcdTIwMTQgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzXG4gICAgLy8gZGlzbWlzcyBoYW5kbGVyLiBSZWdpc3RlcmVkIGluIHRoZSBjYXB0dXJlIHBoYXNlIG9uIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBzbyBpdCBhbHdheXMgcnVucyBmaXJzdC5cbiAgICAvLyBMZXR0aW5nIGEgY2xpY2sgcmVhY2ggYW4gaW50ZXJhY3RpdmUgY2hpbGQgKGEgYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBpcyB3aGF0IGtlZXBzXG4gICAgLy8gaXRzIG93biBoYW5kbGVyIHdvcmtpbmc7IHRoZSBidWJibGUtcGhhc2UgZ3VhcmQgb24gdGhlIGNvbnRlbnQgd3JhcHBlciB0aGVuIHN0b3BzIHRoYXQgY2xpY2sgZnJvbVxuICAgIC8vIGJ1YmJsaW5nIHVwIHRvIE9ic2lkaWFuJ3MgZGlzbWlzcyBoYW5kbGVyLCBzbyB0aGUgbm90aWNlIHN0aWxsIHN0YXlzIG9wZW4uXG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmICRldmVudC50YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIGNsaWNrIG9uIHRoZSBub3RpY2Ugc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuIHJlcG9ydCBhXG4gICAqIHVzZXIgZGlzbWlzc2FsLiBPYnNpZGlhbiBoaWRlcyBhIGRpc21pc3NpYmxlIG5vdGljZSBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgY2xpY2ssIHNvIGFcbiAgICogY2FwdHVyZS1waGFzZSBsaXN0ZW5lciBtYXJrcyB0aGUgbm90aWNlIGJlZm9yZSB0aGF0IGhpZGUgcnVuczsgdGhlIG1hcmsgaXMgY2xlYXJlZCBhZnRlciB0aGUgZXZlbnRcbiAgICogc28gYSBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSBpcyBub3QgbWlzYXR0cmlidXRlZC4gQSBjbG9zZS1idXR0b24gY2xpY2sgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5hcHBlbmRDbG9zZUJ1dHRvbn0pLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB0byB0cmFjay5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKG5vdGljZTogTm90aWNlKTogdm9pZCB7XG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgLy8gT2JzaWRpYW4gZGlzbWlzc2VzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoaXMgY2xpY2ssIHNvIG1hcmsgaXQgbm93IChiZWZvcmVcbiAgICAgIC8vIHRoYXQgaGlkZSBydW5zKSBhbmQgY2xlYXIgaXQgb24gdGhlIG5leHQgbWljcm90YXNrIFx1MjAxNCBhZnRlciBhbnkgc3luY2hyb25vdXMgZGlzbWlzcywgYnV0IGJlZm9yZSBhXG4gICAgICAvLyBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSwgc28gdGhhdCBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkIGFzIGEgdXNlciBhY3Rpb24uXG4gICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuZGVsZXRlKG5vdGljZSk7XG4gICAgICB9KTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBlcm1hbmVudE5vdGljZShub3RpY2U6IE5vdGljZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKTtcbiAgICBpZiAobm90aWNlKSB7XG4gICAgICBtYXAuc2V0KHRoaXMucGx1Z2luTmFtZSwgbm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwLmRlbGV0ZSh0aGlzLnBsdWdpbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSB3aXRoIHRoZSBnaXZlbiBkdXJhdGlvbiwgcGxhY2luZyBpdCBhY2NvcmRpbmcgdG8gaXRzIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfTogYVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSBub3RpY2UgdGFrZXMgdGhlIHBlci1wbHVnaW4gc2xvdCAoaGlkaW5nIHdoYXRldmVyIHdhcyBpbiBpdCwgYW5kXG4gICAqIG9wdGlvbmFsbHkgcmVnaXN0ZXJpbmcgYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlKSwgYW4ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuQXBwZW5kfSBvbmVcbiAgICogam9pbnMgdGhlIG5vdGljZSBhbHJlYWR5IGluIHRoZSBzbG90LCBhbmQgYSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gb25lIGlzIHRyYWNrZWQgb24gaXRzXG4gICAqIG93biwgbGVhdmluZyB0aGUgc2xvdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB3aGVyZSB0aGUgbWVzc2FnZSBlbmRlZCB1cC5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gICAgY29uc3QgeyBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLCBtZXNzYWdlLCBtb2RlLCBvbkNsb3NlQ2xpY2ssIG9uSGlkZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50LCBzaG91bGRTaG93Q2xvc2VCdXR0b24gfSA9IHBhcmFtcztcbiAgICAvLyBPYnNpZGlhbidzIGBOb3RpY2VgIHRyZWF0cyBhbiBvbWl0dGVkIGR1cmF0aW9uIGFzIGl0cyBkZWZhdWx0LCBzbyBtYXAgdGhlIGBudWxsYCBcIm5vIGV4cGxpY2l0XG4gICAgLy8gZHVyYXRpb25cIiB2YWx1ZSB0byBgdW5kZWZpbmVkYC5cbiAgICBjb25zdCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW9kZSA9PT0gUGx1Z2luTm90aWNlTW9kZS5BcHBlbmQpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGVkTm90aWNlID0gdGhpcy5hcHBlbmRUb0N1cnJlbnROb3RpY2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZFRvQ3VycmVudE5vdGljZVBhcmFtcz4oe1xuICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBvbkhpZGUsXG4gICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnRcbiAgICAgIH0pKTtcbiAgICAgIGlmIChhcHBlbmRlZE5vdGljZSkge1xuICAgICAgICByZXR1cm4gYXBwZW5kZWROb3RpY2U7XG4gICAgICB9XG4gICAgICAvLyBOb3RoaW5nIG9uIHNjcmVlbiB0byBhcHBlbmQgdG8sIHNvIHRoaXMgbWVzc2FnZSBiZWNvbWVzIHRoZSBzbG90J3Mgbm90aWNlIGluc3RlYWQuXG4gICAgfVxuXG4gICAgY29uc3QgaGFzQ2xvc2VCdXR0b24gPSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uO1xuICAgIC8vIFRoZSBjbG9zZSBidXR0b24ncyBjbGljayBoYW5kbGVyIG5lZWRzIHRoZSBgTm90aWNlYCwgd2hpY2ggZG9lcyBub3QgZXhpc3QgdW50aWwgaXQgaXMgYnVpbHQgZnJvbVxuICAgIC8vIHRoaXMgY29udGVudDsgY2FwdHVyZSBpdCBsYXppbHkgdmlhIGEgaG9sZGVyIHJlc29sdmVkIGF0IGNsaWNrIHRpbWUuIFRoZSBnZXR0ZXIgaXMgY3JlYXRlZCBvbmx5XG4gICAgLy8gd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICBsZXQgYnVpbHROb3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHsgY29udGVudEVsLCBmcmFnbWVudCB9ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcz4oe1xuICAgICAgZ2V0Tm90aWNlOiBoYXNDbG9zZUJ1dHRvbiA/ICgpOiBOb3RpY2UgfCBudWxsID0+IGJ1aWx0Tm90aWNlIDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG9uQ2xvc2VDbGljayxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvblxuICAgIH0pKTtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlKSB7XG4gICAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAgIHRoaXMuaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcbiAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuYWRkKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogdHJ1ZSwgbm90aWNlOiBidWlsdE5vdGljZSB9O1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGZyYWdtZW50LCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzKTtcbiAgICB0aGlzLm5vdGljZSA9IGJ1aWx0Tm90aWNlO1xuICAgIHRoaXMuaW5zdGFsbEV4cGxpY2l0Q2xvc2VHdWFyZHMoYnVpbHROb3RpY2UsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcblxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShidWlsdE5vdGljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGlzTm90aWNlT3duZWQ6IHRydWUsIG5vdGljZTogYnVpbHROb3RpY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBhIG5vdGljZSdzIGBoaWRlYCBzbyB0aGUgZ2l2ZW4gY2FsbGJhY2sgcnVucyB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbiBcdTIwMTQgYnkgdGhlXG4gICAqIHVzZXIsIGJ5IGEgcmVwbGFjaW5nIG5vdGljZSwgYnkgaXRzIGR1cmF0aW9uIGVsYXBzaW5nLCBvciBvbiB1bmxvYWQuIERvZXMgbm90aGluZyB3aGVuIG5vIGNhbGxiYWNrXG4gICAqIGlzIGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB3aG9zZSBgaGlkZWAgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9uSGlkZSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugb24gdGhlIGZpcnN0IGhpZGUsIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgd3JhcHBpbmcuXG4gICAqL1xuICBwcml2YXRlIHdpcmVPbkhpZGUobm90aWNlOiBOb3RpY2UsIG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIW9uSGlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSdW4gYG9uSGlkZWAgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIEEgYG9uY2VgIHBhdGNoIG9uIGBoaWRlYCBpbnRlcmNlcHRzIGV4YWN0bHkgb25lXG4gICAgLy8gY2FsbCB0aGVuIHVuaW5zdGFsbHMgaXRzZWxmICh1bmxvYWRpbmcgdGhpcyBkZWRpY2F0ZWQgY29tcG9uZW50KSwgc28gdGhlcmUgaXMgbm8gbWFudWFsXG4gICAgLy8gc2luZ2xlLWZpcmUgYm9va2tlZXBpbmcgYW5kIG5vIGxpbmdlcmluZyBwYXRjaCBvbiB0aGUgdHJhbnNpZW50IG5vdGljZS4gVGhlIHVzZXItY2xvc2UgZmxhZ3Mgd2VyZVxuICAgIC8vIHNldCBiZWZvcmUgYGhpZGUoKWAgd2FzIGludm9rZWQgKHNlZSBgYXBwZW5kQ2xvc2VCdXR0b25gIC8gYGluc3RhbGxVc2VyQ2xpY2tUcmFja2luZ2ApLCBzbyB0aGV5XG4gICAgLy8gc3RpbGwgaG9sZCB3aGVuIHJlYWQgaGVyZSBhZnRlciBgZmFsbGJhY2soKWAuXG4gICAgY29uc3QgcGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gICAgcGF0Y2hDb21wb25lbnQubG9hZCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogbm90aWNlLFxuICAgICAgbWV0aG9kTmFtZTogJ2hpZGUnLFxuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2sgfSkgPT4ge1xuICAgICAgICBmYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCA9IHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgY29uc3QgaXNVc2VyQWN0aW9uID0gaXNDbG9zZUJ1dHRvbkNsaWNrZWQgfHwgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBvbkhpZGUoeyBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCwgaXNVc2VyQWN0aW9uIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9CQUFv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
537
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VTX1NUQVRFX0tFWSA9ICdwbHVnaW4tbm90aWNlLWNvbXBvbmVudDpwZXJtYW5lbnQtbm90aWNlcyc7XG5jb25zdCBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA9IDA7XG5jb25zdCBERUZBVUxUX0RFTEFZX0JFRk9SRV9TSE9XX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbi8vIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQgbm90aWNlIGR1cmF0aW9uLCBhcHBsaWVkIGJ5IHRoZSBgTm90aWNlYCBjb25zdHJ1Y3RvciB3aGVuIG5vbmUgaXMgZ2l2ZW4uIEl0IGlzXG4vLyByZXBlYXRlZCBoZXJlIGJlY2F1c2UgcmVzdGFydGluZyB0aGUgY291bnRkb3duIG9uIGFuIGFwcGVuZCBnb2VzIHRocm91Z2ggYHNldEF1dG9IaWRlYCwgd2hpY2ggdGFrZXMgYW5cbi8vIGV4cGxpY2l0IGR1cmF0aW9uIGFuZCBzbyBjYW5ub3QgZmFsbCBiYWNrIHRvIHRoYXQgZGVmYXVsdCBpdHNlbGYuXG5jb25zdCBPQlNJRElBTl9ERUZBVUxUX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSA0MDAwO1xuXG4vLyBFbGVtZW50cyBhIHVzZXIgY2xpY2tzIHRvIGFjdCBvbiB0aGVtIHJhdGhlciB0aGFuIHRvIGRpc21pc3MgdGhlIG5vdGljZS4gQSBjbGljayBsYW5kaW5nIG9uIChvclxuLy8gaW5zaWRlKSBvbmUgb2YgdGhlc2UgaXMga2VwdCBmcm9tIGJ1YmJsaW5nIHRvIHRoZSBub3RpY2UsIHNvIHRoZSBub3RpY2Ugc3RheXMgb3Blbi5cbmNvbnN0IElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IgPSAnYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbGFiZWwsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbcm9sZT1cImJ1dHRvblwiXSwgW3JvbGU9XCJsaW5rXCJdLCBbcm9sZT1cImNoZWNrYm94XCJdLCBbcm9sZT1cInRhYlwiXSwgW3JvbGU9XCJtZW51aXRlbVwiXSc7XG5cbi8qKlxuICogSG93IGEgbmV3IG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSDigJQgdGhlIG9uZSBvY2N1cHlpbmcgdGhlIHNpbmdsZSBwZXItcGx1Z2luXG4gKiBzbG90IHRoaXMgY29tcG9uZW50IGtlZXBzLlxuICpcbiAqIFJhdyBgbmV3IE5vdGljZSguLi4pYCBjYWxscyBhbHdheXMgcGlsZSB1cCwgd2hpY2ggaXMgcmFyZWx5IHdoYXQgYSBwbHVnaW4gd2FudHM6IHVzdWFsbHkgb25seSB0aGVcbiAqIGxhdGVzdCBtZXNzYWdlIG1hdHRlcnMuIFNvIHRoZSBzbG90IGV4aXN0cywgYW5kIHRoaXMgY2hvb3NlcyB3aGF0IGEgbmV3IG1lc3NhZ2UgZG9lcyB3aXRoIGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Ob3RpY2VNb2RlIHtcbiAgLyoqXG4gICAqIEFkZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIGN1cnJlbnQgbm90aWNlLCBzbyBib3RoIG1lc3NhZ2VzIHN0YXkgdmlzaWJsZSBpbiBhIHNpbmdsZSBub3RpY2Ug4oCUIGZvciBhXG4gICAqIHJ1bm5pbmcgYWNjb3VudCBvZiBhbiBvcGVyYXRpb24uIFRoZSBjb3VudGRvd24gcmVzdGFydHMsIHNvIGFuIGFwcGVuZGVkIG1lc3NhZ2UgaXMgcmVhZGFibGUgZm9yIGFcbiAgICogZnVsbCBkdXJhdGlvbiByYXRoZXIgdGhhbiBpbmhlcml0aW5nIHRoZSByZW1haW5zIG9mIHRoZSBjdXJyZW50IG9uZS5cbiAgICpcbiAgICogRmFsbHMgYmFjayB0byB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSB3aGVuIHRoZXJlIGlzIG5vIGN1cnJlbnQgbm90aWNlIG9uIHNjcmVlbiAoaXQgd2FzXG4gICAqIG5ldmVyIHNob3duLCBvciBpdCBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWQpLlxuICAgKi9cbiAgQXBwZW5kID0gJ2FwcGVuZCcsXG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBhbmQgc2hvd3MgdGhpcyBvbmUgaW4gaXRzIHBsYWNlLCBzbyBvbmx5IHRoZSBsYXRlc3QgbWVzc2FnZSBpcyBvbiBzY3JlZW4uXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGFuZCB0aGUgcmVhc29uIHRoZSBzbG90IGV4aXN0cy5cbiAgICovXG4gIFJlcGxhY2UgPSAncmVwbGFjZScsXG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBtZXNzYWdlIGFzIGl0cyBvd24gbm90aWNlLCBsZWF2aW5nIHRoZSBjdXJyZW50IG9uZSBhbG9uZTogYm90aCBhcmUgb24gc2NyZWVuLCBwaWxlZCB1cFxuICAgKiBsaWtlIHBsYWluIGBuZXcgTm90aWNlKC4uLilgIGNhbGxzLiBBIHNlcGFyYXRlIG5vdGljZSBuZXZlciByZXBsYWNlcywgYW5kIGlzIG5ldmVyIHJlcGxhY2VkIGJ5LCBhXG4gICAqIHNsb3Qgbm90aWNlOyBhbnkgbnVtYmVyIG9mIHRoZW0gY29leGlzdC4gVGhleSBhcmUgc3RpbGwgaGlkZGVuIHRvZ2V0aGVyIG9uIHVubG9hZC5cbiAgICovXG4gIFNlcGFyYXRlID0gJ3NlcGFyYXRlJ1xufVxuXG4vKipcbiAqIFRoZSBldmVudCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30gd2hlbiB0aGUgbm90aWNlJ3NcbiAqIGNsb3NlIChYKSBidXR0b24gaXMgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQge1xuICAvKipcbiAgICogQ2FuY2VscyB0aGUgY2xvc2UsIGxlYXZpbmcgdGhlIG5vdGljZSBvcGVuLlxuICAgKi9cbiAgY2FuY2VsOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIHRvIGEgZGVsYXllZCBub3RpY2UgY3JlYXRlZCBieSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS4gSXQgaXMgYVxuICoge0BsaW5rIERpc3Bvc2FibGV9IChzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIGB1c2luZ2ApIHRoYXQgYWxzbyBsZXRzIHRoZSBjb250ZW50IGJlIHVwZGF0ZWQgd2hpbGUgdGhlXG4gKiBub3RpY2UgaXMgc2hvd24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSBleHRlbmRzIERpc3Bvc2FibGUge1xuICAvKipcbiAgICogUmVwbGFjZXMgdGhpcyBoYW5kbGUncyBtZXNzYWdlLCByZS1hcHBseWluZyB0aGUgcGx1Z2luLW5hbWUgcHJlZml4LCB0aGUgaW50ZXJhY3RpdmUtY2xpY2sgZ3VhcmQsIGFuZFxuICAgKiB0aGUgQ2FuY2VsIGJ1dHRvbi4gVXNlZnVsIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MuIElmIHRoZSBkZWxheSBoYXMgbm90IGVsYXBzZWQgeWV0LCB0aGUgbmV3IGNvbnRlbnRcbiAgICogYmVjb21lcyB3aGF0IGlzIHNob3duIG9uY2UgaXQgZG9lcy5cbiAgICpcbiAgICogT25seSB0aGlzIGhhbmRsZSdzIG93biBtZXNzYWdlIGlzIHJld3JpdHRlbjogd2hlbiB0aGUgbm90aWNlIHdhcyBqb2luZWQgcmF0aGVyIHRoYW4gb3BlbmVkIChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLm1vZGV9KSwgdGhlIG1lc3NhZ2VzIGFscmVhZHkgaW4gaXQgYXJlIGxlZnRcbiAgICogYWxvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIG5ldyBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHNldENvbnRlbnQ6IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGEgQ2FuY2VsIGJ1dHRvbiBpcyBhcHBlbmRlZCB0byB0aGUgbm90aWNlOyBjbGlja2luZyBpdCBhYm9ydHMgdGhpcyBjb250cm9sbGVyLiBXaGVuXG4gICAqIG9taXR0ZWQsIG5vIENhbmNlbCBidXR0b24gaXMgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBDYW5jZWwgYnV0dG9uIHNob3duIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogaXMgcHJvdmlkZWQuIFdoZW4gb21pdHRlZCwgdGhlIGxvY2FsaXplZCBgQ2FuY2VsYCBsYWJlbCBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb250ZW50LCByZXNvbHZlZCBsYXppbHkgb25seSBpZiB0aGUgZGVsYXkgZWxhcHNlcyDigJQgc28gYW4gb3BlcmF0aW9uIHRoYXQgZmluaXNoZXNcbiAgICogc29vbmVyIG5ldmVyIGJ1aWxkcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBvcGVyYXRpb24gbXVzdCBydW4gYmVmb3JlIHRoZSBub3RpY2UgaXMgc2hvd24uIE9wZXJhdGlvbnMgdGhhdCBmaW5pc2ggc29vbmVyIG5ldmVyXG4gICAqIHNob3cgYSBub3RpY2UsIGF2b2lkaW5nIGEgZGlzdHJhY3RpbmcgZmxhc2guXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSBpcyB3b3J0aCBjb25zaWRlcmluZyBmb3IgYSBsb25nIG9wZXJhdGlvbjogb24gdGhlIGRlZmF1bHRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gdGhlIHByb2dyZXNzIG5vdGljZSB0YWtlcyB0aGUgc2hhcmVkIHNsb3QsIHNvIGFueSBvcmRpbmFyeSBub3RpY2VcbiAgICogcmFpc2VkIHdoaWxlIHRoZSBvcGVyYXRpb24gcnVucyBoaWRlcyBpdCwgYW5kIHRoZSBwcm9ncmVzcyB0aGUgdXNlciB3YXMgd2F0Y2hpbmcgZG9lcyBub3QgY29tZSBiYWNrLlxuICAgKlxuICAgKiBXaGljaGV2ZXIgbW9kZSBpcyB1c2VkLCB0aGUgcmV0dXJuZWQgaGFuZGxlIG93bnMgb25seSBJVFMgbWVzc2FnZTogdXBkYXRpbmcgdGhlIGNvbnRlbnQgcmV3cml0ZXNcbiAgICogdGhhdCBtZXNzYWdlIGFsb25lLCBhbmQgZGlzcG9zaW5nIHRha2VzIGF3YXkgb25seSB0aGF0IG1lc3NhZ2Ugd2hlbiB0aGUgbm90aWNlIHdhcyBhbHJlYWR5IG9uXG4gICAqIHNjcmVlbiAoYSBub3RpY2UgdGhpcyBoYW5kbGUgb3BlbmVkIGlzIGhpZGRlbiBhcyBhIHdob2xlKS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX1cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHNob3VsZCBzdGF5IHVudGlsIGl0IGlzIHJlcGxhY2VkLCB0aGUgcGx1Z2luIGlzIHJlbG9hZGVkLCBvciB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBpcyBub3QgaGlkZGVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzLCBzbyBpdCBjYW5cbiAgICogY29tbXVuaWNhdGUgc3RhdGUgdGhhdCBvdXRsaXZlcyB0aGUgcGx1Z2luIChlLmcuIGEgY2xlYW51cCB0aGF0IHJlcXVpcmVzIGEgcmVsb2FkKS4gVGhlcmUgaXMgYXQgbW9zdCBvbmUgcGVybWFuZW50XG4gICAqIG5vdGljZSBwZXIgcGx1Z2luOiBpdCBpcyBoaWRkZW4gYnkgdGhlIG5leHQge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfSBjYWxsIGFuZCBkaXNtaXNzZWRcbiAgICogYXV0b21hdGljYWxseSB0aGUgbmV4dCB0aW1lIHRoZSBjb21wb25lbnQgbG9hZHMgKGkuZS4gd2hlbiB0aGUgcGx1Z2luIGlzIHJlLWVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1Blcm1hbmVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyB0aGlzIG5vdGljZSByZWxhdGVzIHRvIHRoZSBwbHVnaW4ncyBjdXJyZW50IG5vdGljZSDigJQgc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAgICpcbiAgICogQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKGl0IG5lZWRzIHRoZSBzaGFyZWQgc2xvdCBpdCBpc1xuICAgKiB0cmFja2VkIGluKSwgYW5kIGEgbm90aWNlIHRoYXQgZG9lcyBub3QgaGlkZSBvbiBjbGljayBtdXN0IGJlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSAoc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQpOyBlaXRoZXJcbiAgICogY29udHJhZGljdGlvbiB0aHJvd3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9LCBvciB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gd2hlblxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGlzIGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBQbHVnaW5Ob3RpY2VNb2RlO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNsb3NlIChYKSBidXR0b24sIGJlZm9yZSB0aGUgbm90aWNlIGlzIGhpZGRlbi4gQ2FsbFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50LmNhbmNlbH0gb24gdGhlIGV2ZW50IHRvIGNhbmNlbCB0aGUgY2xvc2UgYW5kIGtlZXAgdGhlIG5vdGljZVxuICAgKiBvcGVuIOKAlCBmb3IgZXhhbXBsZSBhZnRlciB5b3VyIG93biBjb25maXJtYXRpb24gZGVjbGluZXMuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIGF3YWl0ZWQgYmVmb3JlIHRoZVxuICAgKiBub3RpY2UgaXMgaGlkZGVuLiBSdW5zIG9ubHkgd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93biAoYm90aFxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYXJlIHNldCkuXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIG5vdGljZSBpcyBoaWRkZW4g4oCUIHdoZXRoZXIgYnkgdGhlIHVzZXIgY2xvc2luZyBpdCwgYnkgYSBsYXRlciByZXVzYWJsZVxuICAgKiBub3RpY2UgcmVwbGFjaW5nIGl0LCBieSBpdHMgZHVyYXRpb24gZWxhcHNpbmcsIG9yIG9uIGNvbXBvbmVudCB1bmxvYWQuIEl0IHJ1bnMgYXQgbW9zdCBvbmNlIHBlclxuICAgKiBub3RpY2UuIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm99IGFyZ3VtZW50IGRpc3Rpbmd1aXNoZXMgYSB1c2VyIGNsb3NlICh0aGUgY2xvc2UgYnV0dG9uKSBmcm9tXG4gICAqIGEgcHJvZ3JhbW1hdGljIGhpZGUuIEFuIGFzeW5jIGNhbGxiYWNrIGlzIHJ1biBmaXJlLWFuZC1mb3JnZXQgKGl0cyByZWplY3Rpb24gc3VyZmFjZXMgdGhyb3VnaCB0aGVcbiAgICogYXN5bmMtZXJyb3IgcGlwZWxpbmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIHRoZSBub3RpY2UgaGlkZXMgaXQuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBub3RpY2UgZGlzbWlzc2VzIG9uIGNsaWNrIGxpa2VcbiAgICogYSBub3JtYWwgT2JzaWRpYW4gbm90aWNlLiBXaGVuIGBmYWxzZWAsIHRoZSBub3RpY2UgaXMgaGFyZCB0byBjbG9zZTogaXQgZG9lcyBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXlcbiAgICogY2xpY2ssIGFuZCBpbnN0ZWFkIHNob3dzIGEgY2xvc2UgKFgpIGJ1dHRvbiB0aGF0IGhpZGVzIGl0IGRpcmVjdGx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0gYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9KS5cbiAgICpcbiAgICogQSBgc2hvdWxkSGlkZU9uQ2xpY2s6IGZhbHNlYCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgc3RhbmRzIG9uIGl0cyBvd25cbiAgICogKGltcGxpZXMge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9KSwgc28gYSBsYXRlciBub3RpY2UgbmV2ZXIgc2lsZW50bHkgcmVwbGFjZXMgaXQ7IHBhc3NpbmdcbiAgICogYW55IG90aGVyIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSB0b2dldGhlciB3aXRoIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgXG4gICAqIHRocm93cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRIaWRlT25DbGljaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNsb3NlIChYKSBidXR0b24gaXMgc2hvd24gb24gYSBoYXJkLXRvLWNsb3NlIG5vdGljZVxuICAgKiAoe0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWApLiBXaGVuIGBmYWxzZWAsIG5vIGNsb3NlXG4gICAqIGJ1dHRvbiBpcyByZW5kZXJlZCBhbmQgdGhlIG5vdGljZSBjYW4gb25seSBiZSBoaWRkZW4gcHJvZ3JhbW1hdGljYWxseS4gSWdub3JlZCB1bmxlc3NcbiAgICogYHNob3VsZEhpZGVPbkNsaWNrYCBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHdoeSBhIG5vdGljZSB3YXMgaGlkZGVuLCBwYXNzZWQgdG8ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlSGlkZUluZm8ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHdhcyBoaWRkZW4gYnkgdGhlIHVzZXIgY2xpY2tpbmcgaXRzIGNsb3NlIChYKSBidXR0b24gc3BlY2lmaWNhbGx5LiBBbHdheXMgaW1wbGllc1xuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlSGlkZUluZm8uaXNVc2VyQWN0aW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2xvc2VCdXR0b25DbGlja2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSBhIHVzZXIgYWN0aW9uIOKAlCBjbGlja2luZyB0aGUgY2xvc2UgKFgpIGJ1dHRvbiwgb3IgY2xpY2tpbmcgYVxuICAgKiBkaXNtaXNzaWJsZSBub3RpY2UgdG8gZGlzbWlzcyBpdCDigJQgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWF0aWNhbGx5IChhIGxhdGVyIHJldXNhYmxlIG5vdGljZSByZXBsYWNpbmdcbiAgICogaXQsIGFuIGV4cGxpY2l0IGBoaWRlKClgLCB0aGUgZHVyYXRpb24gZWxhcHNpbmcsIG9yIGNvbXBvbmVudCB1bmxvYWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNVc2VyQWN0aW9uOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMge1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuICByZWFkb25seSBnZXROb3RpY2U6ICgpID0+IE5vdGljZSB8IG51bGw7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljaz86IChldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIGlzIGhhcmQgdG8gY2xvc2U6IHN0b3BzIGV2ZXJ5IGNsaWNrIGZyb20gZGlzbWlzc2luZyBpdCBhbmQsIHVubGVzcyBzdXBwcmVzc2VkIGJ5XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZE5vdGljZUNvbnRlbnRQYXJhbXMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSwgYWRkcyBhIGNsb3NlIGJ1dHRvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXNFeHBsaWNpdENsb3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWVzc2FnZSBpcyBwcmVmaXhlZCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gT25seSBhIG1lc3NhZ2UgdGhhdCBvcGVucyBhIG5vdGljZSBpc1xuICAgKiBwcmVmaXhlZDsgYSBtZXNzYWdlIGFwcGVuZGVkIHRvIG9uZSBhbHJlYWR5IHNob3dpbmcgaXQgaXMgbm90LCBzbyB0aGUgbmFtZSBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnlcbiAgICogbGluZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBjbG9zZSBidXR0b24gd2hlbiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnJlcXVpcmVzRXhwbGljaXRDbG9zZX0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJ1aWx0IG1lc3NhZ2U6IHRoZSB3cmFwcGVyIGVsZW1lbnQgaG9sZGluZyBpdCwgYW5kIHRoZSBmcmFnbWVudCB0aGF0IGVsZW1lbnQgc2l0cyBpbi5cbiAqXG4gKiBUaGUgZWxlbWVudCBpcyBoYW5kZWQgYmFjayBiZWNhdXNlIGEgbm90aWNlIGNhbiBob2xkIHNldmVyYWwgb2YgdGhlbSAoc2VlIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZH0pLFxuICogc28gd2hvZXZlciBvd25zIG9uZSBtZXNzYWdlIGhhcyB0byBiZSBhYmxlIHRvIHVwZGF0ZSBvciByZW1vdmUgZXhhY3RseSB0aGF0IG1lc3NhZ2UuIFRoZSByZWZlcmVuY2VcbiAqIHN0YXlzIHZhbGlkIG9uY2UgdGhlIGZyYWdtZW50IGlzIGhhbmRlZCB0byBgTm90aWNlYDogYXBwZW5kaW5nIGEgZnJhZ21lbnQgbW92ZXMgaXRzIGNoaWxkcmVuIHJhdGhlclxuICogdGhhbiBjb3B5aW5nIHRoZW0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50IHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHdyYXBwaW5nIHRoaXMgbWVzc2FnZSBhbG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFnbWVudCBob2xkaW5nIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnROb3RpY2VDb250ZW50LmNvbnRlbnRFbH0sIHJlYWR5IHRvIGhhbmQgdG8gYE5vdGljZWBcbiAgICogb3IgdG8gYXBwZW5kIGludG8gb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG59XG5cbi8qKlxuICogQSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcHV0IG9uIHNjcmVlbiwgYW5kIHdoZXJlIGl0IGVuZGVkIHVwLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgaG9sZGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUsIGluc2lkZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uubm90aWNlfS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBtZXNzYWdlIGNyZWF0ZWQgdGhlIG5vdGljZSwgYXMgb3Bwb3NlZCB0byBqb2luaW5nIG9uZSB0aGF0IHdhcyBhbHJlYWR5IG9uIHNjcmVlbi5cbiAgICogT25seSB0aGUgY3JlYXRvciBtYXkgaGlkZSBpdDsgYSBqb2luZWQgbWVzc2FnZSBjYW4gbWVyZWx5IHJlbW92ZSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBpc05vdGljZU93bmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90aWNlOiBOb3RpY2U7XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlV2l0aER1cmF0aW9uUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZTogUGx1Z2luTm90aWNlTW9kZTtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrOiAoKGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvbkhpZGU6ICgoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbjogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIHNob3dpbmcgcGx1Z2luIG5vdGljZXMuIEJ5IGRlZmF1bHQgYSBuZXcgbm90aWNlIGhpZGVzIHRoZSBwcmV2aW91cyBvbmUsIHNvIG9ubHkgdGhlIGxhdGVzdFxuICogbWVzc2FnZSBpcyBvbiBzY3JlZW47IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5tb2RlfSBjaG9vc2VzIG90aGVyd2lzZSDigJQgc2VlXG4gKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIG5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFuZGFsb25lTm90aWNlcyA9IG5ldyBTZXQ8Tm90aWNlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJDbGlja2VkTm90aWNlcyA9IG5ldyBXZWFrU2V0PE5vdGljZT4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnBsdWdpbk5hbWUgPSBwYXJhbXMucGx1Z2luTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIHBlcm1hbmVudCBub3RpY2UgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBsb2FkIChlLmcuIGEgcHJldmlvdXMgcGx1Z2luIHNlc3Npb24pIG9uIGxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHBlcm1hbmVudE5vdGljZSA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlKCk7XG4gICAgcGVybWFuZW50Tm90aWNlPy5oaWRlKCk7XG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIG9uIHVubG9hZCwgdW5sZXNzIGl0IGlzIHRoZSBwZXJtYW5lbnQgbm90aWNlICh3aGljaCBpcyBtZWFudCB0byBvdXRsaXZlIHRoZSBwbHVnaW4pLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIC8vIENhbmNlbCBhbnkgZGVsYXllZCBub3RpY2Ugd2hvc2UgdGltZXIgaGFzIG5vdCBmaXJlZCB5ZXQsIHNvIGl0IG5ldmVyIGFwcGVhcnMgYWZ0ZXIgdW5sb2FkLlxuICAgIGZvciAoY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyIG9mIHNuYXBzaG90KHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucykpIHtcbiAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKSAhPT0gdGhpcy5ub3RpY2UpIHtcbiAgICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3RhbmRhbG9uZU5vdGljZSBvZiB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzKSB7XG4gICAgICBzdGFuZGFsb25lTm90aWNlLmhpZGUoKTtcbiAgICB9XG4gICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlID8/IChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlIDogUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlKTtcblxuICAgIGlmIChvcHRpb25zPy5tb2RlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5tb2RlICE9PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gaXNQZXJtYW5lbnQgfHwgcmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBtb2RlLFxuICAgICAgb25DbG9zZUNsaWNrOiBvcHRpb25zPy5vbkNsb3NlQ2xpY2ssXG4gICAgICBvbkhpZGU6IG9wdGlvbnM/Lm9uSGlkZSxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGlzUGVybWFuZW50LFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBvcHRpb25zPy5zaG91bGRTaG93Q2xvc2VCdXR0b24gPz8gdHJ1ZVxuICAgIH0pLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSDigJQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpc1xuICAgKiBkaXNwb3NlZCAod2hpY2ggYWxzbyBjYW5jZWxzIHRoZSBwZW5kaW5nIHRpbWVyIGlmIGl0IGhhcyBub3QgZmlyZWQgeWV0KSwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiBgdXNpbmdgLiBXaGVuIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGdpdmVuLCBhXG4gICAqIENhbmNlbCBidXR0b24gdGhhdCBhYm9ydHMgaXQgaXMgYXBwZW5kZWQgKGFuZCwgYmVpbmcgaW50ZXJhY3RpdmUsIGRvZXMgbm90IGRpc21pc3MgdGhlIG5vdGljZSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ub3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgKiAgIGFib3J0Q29udHJvbGxlcixcbiAgICogICBjb250ZW50OiAoKSA9PiBidWlsZFByb2dyZXNzRnJhZ21lbnQoKVxuICAgKiB9KTtcbiAgICogYXdhaXQgcnVuT3BlcmF0aW9uKGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlfSB0aGF0IGhpZGVzIHRoZSBub3RpY2UgKG9yIGNhbmNlbHMgdGhlIHBlbmRpbmdcbiAgICogdGltZXIpIHdoZW4gZGlzcG9zZWQgYW5kIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSBpdCBpcyBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlQWZ0ZXJEZWxheShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSB7XG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5tb2RlID8/IFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZTtcbiAgICAvLyBXaGVyZSB0aGlzIG1lc3NhZ2UgZW5kZWQgdXA6IGEgbm90aWNlIG9mIGl0cyBvd24sIG9yIGEgY2h1bmsgaW5zaWRlIG9uZSB0aGF0IHdhcyBhbHJlYWR5IHVwLiBJdFxuICAgIC8vIGRlY2lkZXMgd2hhdCBgc2V0Q29udGVudGAgcmV3cml0ZXMgYW5kIHdoYXQgZGlzcG9zaW5nIHRha2VzIGF3YXkuXG4gICAgbGV0IHNob3duOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2UgPSBudWxsO1xuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQgPSAwO1xuICAgIGxldCBjdXJyZW50Q29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPiA9IHBhcmFtcy5jb250ZW50O1xuXG4gICAgY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5kZWxldGUoY2FuY2VsUGVuZGluZ1RpbWVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGREZWxheWVkTWVzc2FnZSA9IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCA9PlxuICAgICAgdGhpcy5idWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zPih7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogcGFyYW1zLmNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0pKTtcblxuICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmVzb2x2aW5nIHRoZSBjb250ZW50IGlzIGFzeW5jaHJvbm91cywgYW5kIHRoZSBvcGVyYXRpb24gdGhlIG5vdGljZSBkZXNjcmliZXMga2VlcHMgcnVubmluZ1xuICAgICAgICAvLyB3aGlsZSBpdCBoYXBwZW5zIOKAlCBzbyBgc2V0Q29udGVudGAgY2FuIGxhbmQgaW4gYmV0d2Vlbi4gSXQgY2Fubm90IHJld3JpdGUgYSBub3RpY2UgdGhhdCBkb2VzXG4gICAgICAgIC8vIG5vdCBleGlzdCB5ZXQsIHNvIHJlc29sdmUgYWdhaW4gd2hlbmV2ZXIgdGhhdCBoYXBwZW5zOiB0aGUgbm90aWNlIG11c3Qgb3BlbiB3aXRoIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoZSBjYWxsZXIgbGFzdCBhc2tlZCBmb3IsIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiByZXNvbHV0aW9uIHN0YXJ0ZWQuXG4gICAgICAgIGxldCByZXF1ZXN0ZWRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuICAgICAgICBsZXQgcmVzb2x2ZWRDb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcmVxdWVzdGVkQ29udGVudCA9IGN1cnJlbnRDb250ZW50O1xuICAgICAgICAgIHJlc29sdmVkQ29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShyZXF1ZXN0ZWRDb250ZW50LCB7fSk7XG4gICAgICAgICAgLy8gVGhlIGhhbmRsZSBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkIHdoaWxlIHRoZSBjb250ZW50IHdhcyBiZWluZyByZXNvbHZlZDsgZG9uJ3Qgc2hvdyBhIHN0YWxlIG5vdGljZS5cbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocmVxdWVzdGVkQ29udGVudCAhPT0gY3VycmVudENvbnRlbnQpO1xuXG4gICAgICAgIHNob3duID0gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKHJlc29sdmVkQ29udGVudCksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBvbkNsb3NlQ2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvbkhpZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5hZGQoY2FuY2VsUGVuZGluZ1RpbWVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dhcHMgVEhJUyBtZXNzYWdlJ3MgZWxlbWVudCBmb3IgYSBmcmVzaGx5IGJ1aWx0IG9uZSwgcmF0aGVyIHRoYW4gcmV3cml0aW5nIHRoZSB3aG9sZSBub3RpY2U6XG4gICAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSBqb2luZWQgYSBub3RpY2UgdGhhdCB3YXMgYWxyZWFkeSB1cCwgdGhlIG90aGVyIG1lc3NhZ2VzIGluIGl0IGFyZSBub3QgaXRzIHRvXG4gICAgICAgIC8vIG92ZXJ3cml0ZS4gUmVidWlsZGluZyBhbHNvIHJlLWFwcGxpZXMgdGhlIHByZWZpeCwgdGhlIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgdGhlIENhbmNlbCBidXR0b24uXG4gICAgICAgIGNvbnN0IHJlYnVpbHQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7XG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSxcbiAgICAgICAgICBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogc2hvd24uaXNOb3RpY2VPd25lZFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvd24uY29udGVudEVsLnJlcGxhY2VXaXRoKHJlYnVpbHQuZnJhZ21lbnQpO1xuICAgICAgICBzaG93biA9IHsgLi4uc2hvd24sIGNvbnRlbnRFbDogcmVidWlsdC5jb250ZW50RWwgfTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgICAgaWYgKCFzaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIG5vdGljZSB0aGlzIGhhbmRsZSBvcGVuZWQgZ29lcyBhd2F5IHdpdGggaXQ7IGEgbm90aWNlIGl0IG1lcmVseSBqb2luZWQgYmVsb25ncyB0byB3aG9ldmVyXG4gICAgICAgIC8vIG9wZW5lZCBpdCwgc28gb25seSB0aGlzIG1lc3NhZ2UgaXMgdGFrZW4gb3V0IG9mIGl0LlxuICAgICAgICBpZiAoc2hvd24uaXNOb3RpY2VPd25lZCkge1xuICAgICAgICAgIHNob3duLm5vdGljZS5oaWRlKCk7XG4gICAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUoc2hvd24ubm90aWNlKTtcbiAgICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duLm5vdGljZSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93bi5jb250ZW50RWwucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjbG9zZSAoWCkgYnV0dG9uIHRvIHRoZSBub3RpY2UgY29udGVudC4gQ2xpY2tpbmcgaXQgZmlyZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zLm9uQ2xvc2VDbGlja30gKHdoaWNoIG1heSBjYW5jZWwgdGhlIGNsb3NlKTsgaWZcbiAgICogbm90IGNhbmNlbGxlZCwgaXQgaGlkZXMgdGhlIG5vdGljZSBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgc3RhbmRhbG9uZS1ub3RpY2UgdHJhY2tpbmcgc2V0LiBUaGUgaGlkZSBpc1xuICAgKiBtYXJrZWQgYXMgYSBjbG9zZS1idXR0b24gY2xpY2sgc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuXG4gICAqIGRpc3Rpbmd1aXNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZENsb3NlQnV0dG9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2sgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjbG9zZUJ1dHRvbkVsID0gY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBhdHRyOiB7ICdhcmlhLWxhYmVsJzogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm5vdGljZXMuY2xvc2VBcmlhTGFiZWwpIH1cbiAgICB9KTtcbiAgICAvLyBSZXVzZSBPYnNpZGlhbidzIG1vZGFsIGNsb3NlLWJ1dHRvbiBjbGFzc2VzIHNvIHRoaXMgYnV0dG9uIG1hdGNoZXMgdGhlIG5hdGl2ZSBtb2RhbCBjbG9zZSBidXR0b25cbiAgICAvLyAobG9vayBhbmQgaG92ZXIpOyB0aGUgc3R5bGVzaGVldCBvbmx5IHBvc2l0aW9ucyBpdCBpbiB0aGUgbm90aWNlIGNvcm5lci5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNsb3NlQnV0dG9uRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNsb3NlQnV0dG9uKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZENsYXNzZXMoW0Nzc0NsYXNzLkNsaWNrYWJsZUljb24sIENzc0NsYXNzLk1vZGFsSGVhZGVyQnV0dG9uXSk7XG4gICAgc2V0SWNvbihjbG9zZUJ1dHRvbkVsLCAneCcpO1xuICAgIGNsb3NlQnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBpc0NhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICBhd2FpdCBvbkNsb3NlQ2xpY2s/Lih7XG4gICAgICAgICAgY2FuY2VsOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gQ2FuIGJlIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGljZSA9IGVuc3VyZU5vbk51bGxhYmxlKGdldE5vdGljZSgpKTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgICBub3RpY2UuaGlkZSgpO1xuICAgICAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmRlbGV0ZShub3RpY2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG1lc3NhZ2UgdG8gdGhlIG5vdGljZSBjdXJyZW50bHkgaW4gdGhlIHBlci1wbHVnaW4gc2xvdCwgc28gYm90aCBtZXNzYWdlcyBzdGF5IG9uIHNjcmVlbiBpbiBhXG4gICAqIHNpbmdsZSBub3RpY2UuXG4gICAqXG4gICAqIFRoZSBhcHBlbmRlZCBtZXNzYWdlIGNhcnJpZXMgbm8gcGx1Z2luLW5hbWUgcHJlZml4IOKAlCB0aGUgbm90aWNlIGFscmVhZHkgb3BlbnMgd2l0aCBvbmUsIGFuZFxuICAgKiByZXBlYXRpbmcgaXQgb24gZXZlcnkgbGluZSByZWFkcyBhcyBub2lzZS4gSXQgaXMgd3JhcHBlZCBsaWtlIGFueSBvdGhlciBub3RpY2UgY29udGVudCwgc28gYSBsaW5rIG9yXG4gICAqIGJ1dHRvbiBpbnNpZGUgaXQgc3RpbGwga2VlcHMgdGhlIG5vdGljZSBvcGVuIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQXBwZW5kaW5nIHJlc3RhcnRzIHRoZSBub3RpY2UncyBjb3VudGRvd24gKHtAbGluayBOb3RpY2Uuc2V0QXV0b0hpZGV9KSwgc28gdGhlIG5ldyBtZXNzYWdlIGdldHMgYVxuICAgKiBmdWxsIGR1cmF0aW9uIGluc3RlYWQgb2YgaW5oZXJpdGluZyB3aGF0IHdhcyBsZWZ0IG9mIHRoZSBjdXJyZW50IG9uZSDigJQgYSBsaW5lIGFwcGVuZGVkIGEgbW9tZW50XG4gICAqIGJlZm9yZSB0aGUgbm90aWNlIGV4cGlyZXMgd291bGQgb3RoZXJ3aXNlIGZsYXNoIGFuZCB2YW5pc2guXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB0aGUgam9pbmVkIG5vdGljZSwgb3IgYG51bGxgIHdoZW5cbiAgICogdGhlcmUgaXMgbm90aGluZyBvbiBzY3JlZW4gdG8gYXBwZW5kIHRvIOKAlCB0aGUgc2xvdCBpcyBlbXB0eSwgb3IgaXRzIG5vdGljZSBoYXMgc2luY2UgYmVlbiBkaXNtaXNzZWRcbiAgICog4oCUIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBzaG93IGEgbmV3IG5vdGljZSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRUb0N1cnJlbnROb3RpY2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRUb0N1cnJlbnROb3RpY2VQYXJhbXMpOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2Uge1xuICAgIGNvbnN0IHsgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcywgbWVzc2FnZSwgb25IaWRlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgY3VycmVudE5vdGljZSA9IHRoaXMubm90aWNlO1xuICAgIC8vIGBpc1Nob3duYCBpcyB0aGUgc2FtZSBjaGVjayBPYnNpZGlhbidzIG93biBgTm90aWNlLmhpZGVgIG1ha2VzIGJlZm9yZSBhbmltYXRpbmcgYSBub3RpY2UgYXdheSwgc29cbiAgICAvLyBpdCBpcyBleGFjdGx5IFwic3RpbGwgb24gc2NyZWVuXCI6IGEgbm90aWNlIHRoYXQgZXhwaXJlZCBvciB3YXMgZGlzbWlzc2VkIGhhcyBiZWVuIGRldGFjaGVkLlxuICAgIGlmICghY3VycmVudE5vdGljZT8uY29udGFpbmVyRWwuaXNTaG93bigpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfSA9IHRoaXMuYnVpbGROb3RpY2VDb250ZW50KHsgbWVzc2FnZSwgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU6IGZhbHNlIH0pO1xuICAgIGN1cnJlbnROb3RpY2UubWVzc2FnZUVsLmFwcGVuZChmcmFnbWVudCk7XG4gICAgLy8gQSBgbnVsbGAgZHVyYXRpb24gbWVhbnMgXCJPYnNpZGlhbidzIG93biBkZWZhdWx0XCIsIHdoaWNoIG9ubHkgdGhlIGNvbnN0cnVjdG9yIGFwcGxpZXMg4oCUIHNvIHJlc3RhcnRcbiAgICAvLyB0aGUgY291bnRkb3duIHdpdGggdGhhdCBzYW1lIGRlZmF1bHQgcmF0aGVyIHRoYW4gbGVhdmluZyB0aGUgY3VycmVudCBvbmUgcnVubmluZy5cbiAgICBjdXJyZW50Tm90aWNlLnNldEF1dG9IaWRlKGR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPz8gT0JTSURJQU5fREVGQVVMVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTKTtcbiAgICB0aGlzLndpcmVPbkhpZGUoY3VycmVudE5vdGljZSwgb25IaWRlKTtcbiAgICAvLyBPbmx5IGV2ZXIgcmVnaXN0ZXJzLCBuZXZlciBjbGVhcnM6IHRoZSBub3RpY2UgYmVpbmcgYXBwZW5kZWQgdG8gbWF5IGFscmVhZHkgYmUgdGhpcyBwbHVnaW4nc1xuICAgIC8vIHBlcm1hbmVudCBub3RpY2UsIGFuZCBhIGxhdGVyIGFwcGVuZGVkIG1lc3NhZ2UgaXMgbm8gcmVhc29uIHRvIGZvcmdldCB0aGF0LlxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShjdXJyZW50Tm90aWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiBmYWxzZSwgbm90aWNlOiBjdXJyZW50Tm90aWNlIH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBtZXNzYWdlIGZvciBhIGRlbGF5ZWQgbm90aWNlOiB0aGUgcmVzb2x2ZWQgY29udGVudCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIENhbmNlbFxuICAgKiBidXR0b24gdGhhdCBhYm9ydHMgdGhlIHByb3ZpZGVkIGNvbnRyb2xsZXIgd2hlbiBjbGlja2VkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IGhvbGRpbmcgdGhlIGNvbnRlbnQgYW5kLCBpZiByZXF1ZXN0ZWQsIGEgQ2FuY2VsIGJ1dHRvbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGREZWxheWVkTm90aWNlTWVzc2FnZShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2VQYXJhbXMpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCB7IGFib3J0Q29udHJvbGxlciwgY2FuY2VsQnV0dG9uVGV4dCwgY29udGVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY29udGVudCk7XG4gICAgfVxuXG4gICAgaWYgKGFib3J0Q29udHJvbGxlcikge1xuICAgICAgLy8gYEJ1dHRvbkNvbXBvbmVudGAgcmVxdWlyZXMgYW4gYEhUTUxFbGVtZW50YCBwYXJlbnQsIHNvIGJ1aWxkIGl0IG9uIGEgdGhyb3dhd2F5XG4gICAgICAvLyBkZXRhY2hlZCBlbGVtZW50IGFuZCBtb3ZlIGl0cyBgYnV0dG9uRWxgIGludG8gdGhlIGZyYWdtZW50LlxuICAgICAgY29uc3QgY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbkNvbXBvbmVudChjcmVhdGVEaXYoKSk7XG4gICAgICBjYW5jZWxCdXR0b24uc2V0QnV0dG9uVGV4dChjYW5jZWxCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLmNhbmNlbCkpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjYW5jZWxCdXR0b24uYnV0dG9uRWwsIENzc0NsYXNzLkNhbmNlbEJ1dHRvbik7XG4gICAgICAvLyBUaGUgY2xpY2sgaXMgd2lyZWQgdmlhIGBhZGRFdmVudExpc3RlbmVyYCByYXRoZXIgdGhhbiBgQnV0dG9uQ29tcG9uZW50Lm9uQ2xpY2tgIHNvIGl0XG4gICAgICAvLyBidWJibGVzIHRocm91Z2ggdGhlIGludGVyYWN0aXZlLWVsZW1lbnQgZ3VhcmQgKGtlZXBpbmcgdGhlIG5vdGljZSBvcGVuKSBhbmQgc3RheXNcbiAgICAgIC8vIGRpcmVjdGx5IGV4ZXJjaXNhYmxlIHZpYSBhIGRpc3BhdGNoZWQgRE9NIGV2ZW50IGluIHVuaXQgdGVzdHMuXG4gICAgICBjYW5jZWxCdXR0b24uYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgfSk7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGFuIGludGVyYWN0aXZlXG4gICAqIGVsZW1lbnQgaW5zaWRlIGl0IGlzIGNsaWNrZWQuIE9ic2lkaWFuIGRpc21pc3NlcyBhIG5vdGljZSBvbiBhbnkgY2xpY2sgdGhhdCBidWJibGVzIHVwIHRvIGl0c1xuICAgKiBlbGVtZW50OyB0aGUgY29udGFpbmVyIGludGVyY2VwdHMgY2xpY2tzIG9yaWdpbmF0aW5nIG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGEgbGluaywgYnV0dG9uLFxuICAgKiBpbnB1dCwgZXRjLikgYW5kIHN0b3BzIHRoZW0gdGhlcmUsIHNvIHRoZSBlbGVtZW50J3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyBidXQgdGhlIG5vdGljZSBzdGF5cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnR9IGhvbGRpbmcgdGhlIHdyYXBwZWQgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm90aWNlQ29udGVudChwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudE5vdGljZUNvbnRlbnQge1xuICAgIGNvbnN0IHsgZ2V0Tm90aWNlLCBtZXNzYWdlLCBvbkNsb3NlQ2xpY2ssIHJlcXVpcmVzRXhwbGljaXRDbG9zZSA9IGZhbHNlLCBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSA9IHRydWUsIHNob3VsZFNob3dDbG9zZUJ1dHRvbiA9IHRydWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgY29udGVudEVsID0gZnJhZ21lbnQuY3JlYXRlRGl2KCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhjb250ZW50RWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZUNvbnRlbnQpO1xuICAgIGlmIChzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZSkge1xuICAgICAgY29udGVudEVsLmFwcGVuZCh0aGlzLmJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2UpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGVudEVsLmFwcGVuZFRleHQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgIC8vIEEgaGFyZC10by1jbG9zZSBub3RpY2UgbXVzdCBub3QgZGlzbWlzcyBvbiBhbnkgc3RyYXkgY2xpY2s7IG9ubHkgaXRzIGNsb3NlIGJ1dHRvbiBtYXkgaGlkZSBpdC5cbiAgICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uKSB7XG4gICAgICB0aGlzLmFwcGVuZENsb3NlQnV0dG9uKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcz4oe1xuICAgICAgICBjb250ZW50RWwsXG4gICAgICAgIGdldE5vdGljZTogZW5zdXJlTm9uTnVsbGFibGUoZ2V0Tm90aWNlKSxcbiAgICAgICAgb25DbG9zZUNsaWNrXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgZnJhZ21lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50LCBwcmVmaXhpbmcgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gYSBzdHlsZWQgZWxlbWVudCBzbyBpdCBpc1xuICAgKiB2aXN1YWxseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICpcbiAgICogVGhlIG5hbWUgaXMgcmVuZGVyZWQgYXMgaW5saW5lIGNvZGUsIHRoZSB3YXkgZXZlcnkgcGx1Z2luIG5hbWUgaW4gdGhlIFVJIGlzLCBpbnNpZGUgYSBzcGFuIHRoYXQga2VlcHNcbiAgICogdGhlIHByZWZpeCdzIG93biBsYXlvdXQgYW5kIGFjY2VudCBjb2xvci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHdpdGggdGhlIHN0eWxlZCBwbHVnaW4gbmFtZSBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgbmFtZUVsID0gY3JlYXRlU3BhbigpO1xuICAgIGFwcGVuZENvZGVCbG9jayhuYW1lRWwsIHRoaXMucGx1Z2luTmFtZSk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhuYW1lRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZU5hbWUpO1xuICAgIGZyYWdtZW50LmFwcGVuZChuYW1lRWwpO1xuICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCcgKHVubG9hZGVkKScpO1xuICAgIH1cbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KCdcXG4nKTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIG5vdGljZSBoYXJkIHRvIGNsb3NlOiBtYXJrcyBpdHMgb3V0ZXIgZWxlbWVudCAoc28gdGhlIENTUyBuZXV0cmFsaXplcyBpdHMgcGFkZGluZykgYW5kXG4gICAqIGluc3RhbGxzIGEgY2FwdHVyZS1waGFzZSBjbGljayBndWFyZCB0aGF0IHN0b3BzIGV2ZXJ5IGNsaWNrIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IChhXG4gICAqIGJ1dHRvbiwgbGluaywgdGhlIGNsb3NlIGJ1dHRvbiwgZXRjLikgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzIG93biBkaXNtaXNzIGhhbmRsZXIg4oCUIHNvIGFuXG4gICAqIGludGVyYWN0aXZlIGNoaWxkJ3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyB3aGlsZSBhIHN0cmF5IGNsaWNrIGNhbm5vdCBkaXNtaXNzIHRoZSBub3RpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIGd1YXJkLlxuICAgKiBAcGFyYW0gcmVxdWlyZXNFeHBsaWNpdENsb3NlIC0gV2hldGhlciB0aGUgbm90aWNlIHJlcXVpcmVzIGV4cGxpY2l0IGNsb3NlOyB3aGVuIGBmYWxzZWAsIG5vdGhpbmcgaXNcbiAgICogaW5zdGFsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhub3RpY2U6IE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFyZXF1aXJlc0V4cGxpY2l0Q2xvc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gVGhlIG91dGVyIGAubm90aWNlYCBlbGVtZW50IChgY29udGFpbmVyRWxgKSBjYXJyaWVzIE9ic2lkaWFuJ3MgZGlzbWlzcy1vbi1jbGljayBoYW5kbGVyIGFuZCB0aGVcbiAgICAvLyBwYWRkaW5nIGEgc3RyYXkgY2xpY2sgY291bGQgbGFuZCBvbjsgbWFyayBpdCBzbyB0aGUgc3R5bGVzaGVldCBkcm9wcyB0aGF0IHBhZGRpbmcuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhub3RpY2UuY29udGFpbmVyRWwsIENzc0NsYXNzLlBsdWdpbk5vdGljZVJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgLy8gU3RvcCBldmVyeSBjbGljayBvbiB0aGUgbm90aWNlIOKAlCBleGNlcHQgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCDigJQgZnJvbSByZWFjaGluZyBPYnNpZGlhbidzXG4gICAgLy8gZGlzbWlzcyBoYW5kbGVyLiBSZWdpc3RlcmVkIGluIHRoZSBjYXB0dXJlIHBoYXNlIG9uIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBzbyBpdCBhbHdheXMgcnVucyBmaXJzdC5cbiAgICAvLyBMZXR0aW5nIGEgY2xpY2sgcmVhY2ggYW4gaW50ZXJhY3RpdmUgY2hpbGQgKGEgYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBpcyB3aGF0IGtlZXBzXG4gICAgLy8gaXRzIG93biBoYW5kbGVyIHdvcmtpbmc7IHRoZSBidWJibGUtcGhhc2UgZ3VhcmQgb24gdGhlIGNvbnRlbnQgd3JhcHBlciB0aGVuIHN0b3BzIHRoYXQgY2xpY2sgZnJvbVxuICAgIC8vIGJ1YmJsaW5nIHVwIHRvIE9ic2lkaWFuJ3MgZGlzbWlzcyBoYW5kbGVyLCBzbyB0aGUgbm90aWNlIHN0aWxsIHN0YXlzIG9wZW4uXG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgaWYgKCRldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmICRldmVudC50YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIGNsaWNrIG9uIHRoZSBub3RpY2Ugc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuIHJlcG9ydCBhXG4gICAqIHVzZXIgZGlzbWlzc2FsLiBPYnNpZGlhbiBoaWRlcyBhIGRpc21pc3NpYmxlIG5vdGljZSBzeW5jaHJvbm91c2x5IGR1cmluZyB0aGUgY2xpY2ssIHNvIGFcbiAgICogY2FwdHVyZS1waGFzZSBsaXN0ZW5lciBtYXJrcyB0aGUgbm90aWNlIGJlZm9yZSB0aGF0IGhpZGUgcnVuczsgdGhlIG1hcmsgaXMgY2xlYXJlZCBhZnRlciB0aGUgZXZlbnRcbiAgICogc28gYSBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSBpcyBub3QgbWlzYXR0cmlidXRlZC4gQSBjbG9zZS1idXR0b24gY2xpY2sgaXMgdHJhY2tlZCBzZXBhcmF0ZWx5IChzZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5hcHBlbmRDbG9zZUJ1dHRvbn0pLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB0byB0cmFjay5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKG5vdGljZTogTm90aWNlKTogdm9pZCB7XG4gICAgbm90aWNlLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgLy8gT2JzaWRpYW4gZGlzbWlzc2VzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoaXMgY2xpY2ssIHNvIG1hcmsgaXQgbm93IChiZWZvcmVcbiAgICAgIC8vIHRoYXQgaGlkZSBydW5zKSBhbmQgY2xlYXIgaXQgb24gdGhlIG5leHQgbWljcm90YXNrIOKAlCBhZnRlciBhbnkgc3luY2hyb25vdXMgZGlzbWlzcywgYnV0IGJlZm9yZSBhXG4gICAgICAvLyBsYXRlciBwcm9ncmFtbWF0aWMgaGlkZSwgc28gdGhhdCBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkIGFzIGEgdXNlciBhY3Rpb24uXG4gICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuZGVsZXRlKG5vdGljZSk7XG4gICAgICB9KTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFBlcm1hbmVudE5vdGljZShub3RpY2U6IE5vdGljZSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKTtcbiAgICBpZiAobm90aWNlKSB7XG4gICAgICBtYXAuc2V0KHRoaXMucGx1Z2luTmFtZSwgbm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFwLmRlbGV0ZSh0aGlzLnBsdWdpbk5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSB3aXRoIHRoZSBnaXZlbiBkdXJhdGlvbiwgcGxhY2luZyBpdCBhY2NvcmRpbmcgdG8gaXRzIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfTogYVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSBub3RpY2UgdGFrZXMgdGhlIHBlci1wbHVnaW4gc2xvdCAoaGlkaW5nIHdoYXRldmVyIHdhcyBpbiBpdCwgYW5kXG4gICAqIG9wdGlvbmFsbHkgcmVnaXN0ZXJpbmcgYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlKSwgYW4ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuQXBwZW5kfSBvbmVcbiAgICogam9pbnMgdGhlIG5vdGljZSBhbHJlYWR5IGluIHRoZSBzbG90LCBhbmQgYSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gb25lIGlzIHRyYWNrZWQgb24gaXRzXG4gICAqIG93biwgbGVhdmluZyB0aGUgc2xvdCB1bnRvdWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZX0gZGVzY3JpYmluZyB3aGVyZSB0aGUgbWVzc2FnZSBlbmRlZCB1cC5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VXaXRoRHVyYXRpb25QYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93bk5vdGljZSB7XG4gICAgY29uc3QgeyBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLCBtZXNzYWdlLCBtb2RlLCBvbkNsb3NlQ2xpY2ssIG9uSGlkZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlLCBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50LCBzaG91bGRTaG93Q2xvc2VCdXR0b24gfSA9IHBhcmFtcztcbiAgICAvLyBPYnNpZGlhbidzIGBOb3RpY2VgIHRyZWF0cyBhbiBvbWl0dGVkIGR1cmF0aW9uIGFzIGl0cyBkZWZhdWx0LCBzbyBtYXAgdGhlIGBudWxsYCBcIm5vIGV4cGxpY2l0XG4gICAgLy8gZHVyYXRpb25cIiB2YWx1ZSB0byBgdW5kZWZpbmVkYC5cbiAgICBjb25zdCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAobW9kZSA9PT0gUGx1Z2luTm90aWNlTW9kZS5BcHBlbmQpIHtcbiAgICAgIGNvbnN0IGFwcGVuZGVkTm90aWNlID0gdGhpcy5hcHBlbmRUb0N1cnJlbnROb3RpY2Uobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZFRvQ3VycmVudE5vdGljZVBhcmFtcz4oe1xuICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBvbkhpZGUsXG4gICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnRcbiAgICAgIH0pKTtcbiAgICAgIGlmIChhcHBlbmRlZE5vdGljZSkge1xuICAgICAgICByZXR1cm4gYXBwZW5kZWROb3RpY2U7XG4gICAgICB9XG4gICAgICAvLyBOb3RoaW5nIG9uIHNjcmVlbiB0byBhcHBlbmQgdG8sIHNvIHRoaXMgbWVzc2FnZSBiZWNvbWVzIHRoZSBzbG90J3Mgbm90aWNlIGluc3RlYWQuXG4gICAgfVxuXG4gICAgY29uc3QgaGFzQ2xvc2VCdXR0b24gPSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgJiYgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uO1xuICAgIC8vIFRoZSBjbG9zZSBidXR0b24ncyBjbGljayBoYW5kbGVyIG5lZWRzIHRoZSBgTm90aWNlYCwgd2hpY2ggZG9lcyBub3QgZXhpc3QgdW50aWwgaXQgaXMgYnVpbHQgZnJvbVxuICAgIC8vIHRoaXMgY29udGVudDsgY2FwdHVyZSBpdCBsYXppbHkgdmlhIGEgaG9sZGVyIHJlc29sdmVkIGF0IGNsaWNrIHRpbWUuIFRoZSBnZXR0ZXIgaXMgY3JlYXRlZCBvbmx5XG4gICAgLy8gd2hlbiBhIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICBsZXQgYnVpbHROb3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHsgY29udGVudEVsLCBmcmFnbWVudCB9ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcz4oe1xuICAgICAgZ2V0Tm90aWNlOiBoYXNDbG9zZUJ1dHRvbiA/ICgpOiBOb3RpY2UgfCBudWxsID0+IGJ1aWx0Tm90aWNlIDogdW5kZWZpbmVkLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIG9uQ2xvc2VDbGljayxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvblxuICAgIH0pKTtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlKSB7XG4gICAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAgIHRoaXMuaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcbiAgICAgIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMuYWRkKGJ1aWx0Tm90aWNlKTtcbiAgICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogdHJ1ZSwgbm90aWNlOiBidWlsdE5vdGljZSB9O1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgYnVpbHROb3RpY2UgPSBuZXcgTm90aWNlKGZyYWdtZW50LCBub3RpY2VEdXJhdGlvbkluTWlsbGlzZWNvbmRzKTtcbiAgICB0aGlzLm5vdGljZSA9IGJ1aWx0Tm90aWNlO1xuICAgIHRoaXMuaW5zdGFsbEV4cGxpY2l0Q2xvc2VHdWFyZHMoYnVpbHROb3RpY2UsIHJlcXVpcmVzRXhwbGljaXRDbG9zZSk7XG4gICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgIHRoaXMud2lyZU9uSGlkZShidWlsdE5vdGljZSwgb25IaWRlKTtcblxuICAgIGlmIChzaG91bGRSZWdpc3RlckFzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShidWlsdE5vdGljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGlzTm90aWNlT3duZWQ6IHRydWUsIG5vdGljZTogYnVpbHROb3RpY2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBhIG5vdGljZSdzIGBoaWRlYCBzbyB0aGUgZ2l2ZW4gY2FsbGJhY2sgcnVucyB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbiDigJQgYnkgdGhlXG4gICAqIHVzZXIsIGJ5IGEgcmVwbGFjaW5nIG5vdGljZSwgYnkgaXRzIGR1cmF0aW9uIGVsYXBzaW5nLCBvciBvbiB1bmxvYWQuIERvZXMgbm90aGluZyB3aGVuIG5vIGNhbGxiYWNrXG4gICAqIGlzIGdpdmVuLlxuICAgKlxuICAgKiBAcGFyYW0gbm90aWNlIC0gVGhlIG5vdGljZSB3aG9zZSBgaGlkZWAgdG8gd3JhcC5cbiAgICogQHBhcmFtIG9uSGlkZSAtIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugb24gdGhlIGZpcnN0IGhpZGUsIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgd3JhcHBpbmcuXG4gICAqL1xuICBwcml2YXRlIHdpcmVPbkhpZGUobm90aWNlOiBOb3RpY2UsIG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIW9uSGlkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSdW4gYG9uSGlkZWAgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIEEgYG9uY2VgIHBhdGNoIG9uIGBoaWRlYCBpbnRlcmNlcHRzIGV4YWN0bHkgb25lXG4gICAgLy8gY2FsbCB0aGVuIHVuaW5zdGFsbHMgaXRzZWxmICh1bmxvYWRpbmcgdGhpcyBkZWRpY2F0ZWQgY29tcG9uZW50KSwgc28gdGhlcmUgaXMgbm8gbWFudWFsXG4gICAgLy8gc2luZ2xlLWZpcmUgYm9va2tlZXBpbmcgYW5kIG5vIGxpbmdlcmluZyBwYXRjaCBvbiB0aGUgdHJhbnNpZW50IG5vdGljZS4gVGhlIHVzZXItY2xvc2UgZmxhZ3Mgd2VyZVxuICAgIC8vIHNldCBiZWZvcmUgYGhpZGUoKWAgd2FzIGludm9rZWQgKHNlZSBgYXBwZW5kQ2xvc2VCdXR0b25gIC8gYGluc3RhbGxVc2VyQ2xpY2tUcmFja2luZ2ApLCBzbyB0aGV5XG4gICAgLy8gc3RpbGwgaG9sZCB3aGVuIHJlYWQgaGVyZSBhZnRlciBgZmFsbGJhY2soKWAuXG4gICAgY29uc3QgcGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gICAgcGF0Y2hDb21wb25lbnQubG9hZCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogbm90aWNlLFxuICAgICAgbWV0aG9kTmFtZTogJ2hpZGUnLFxuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2sgfSkgPT4ge1xuICAgICAgICBmYWxsYmFjaygpO1xuICAgICAgICBjb25zdCBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCA9IHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgY29uc3QgaXNVc2VyQWN0aW9uID0gaXNDbG9zZUJ1dHRvbkNsaWNrZWQgfHwgdGhpcy51c2VyQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBvbkhpZGUoeyBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCwgaXNVc2VyQWN0aW9uIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsb0JBQW9CO0FBQzdCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsdUJBQXVCO0FB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
@@ -1,4 +1,4 @@
1
- /// <reference path="../library.d.mts" />
1
+ /// <reference path="../library-references.d.mts" />
2
2
  /**
3
3
  * @file
4
4
  *
@@ -2,13 +2,7 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
-
6
5
  (function () {
7
- function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
- symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
- symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
- }
11
-
12
6
  function ensureBrowserProcess() {
13
7
  const browserProcess = {
14
8
  browser: true,
@@ -33,10 +27,7 @@ function ensureBrowserProcess() {
33
27
  existingProcessRecord["browser"] = true;
34
28
  }
35
29
 
36
- (function initEsm() {
37
- ensureDisposeSymbols();
38
- ensureBrowserProcess();
39
- })();
30
+ ensureBrowserProcess();
40
31
  })();
41
32
 
42
33
  import { AsyncEvents } from "@mnaoumov/typescript-lib/async-events";
@@ -551,4 +542,4 @@ class PluginSettingsComponentBase extends ComponentEx {
551
542
  export {
552
543
  PluginSettingsComponentBase
553
544
  };
554
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbXBvbmVudCB0aGF0IG1hbmFnZXMgcGx1Z2luIHNldHRpbmdzOiBkYXRhLCBwZXJzaXN0ZW5jZSwgdmFsaWRhdGlvbiwgYW5kIGV2ZW50cy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgcHVibGljLWZhY2luZyBzZXR0aW5ncyBBUEkgZm9yIHBsdWdpbiBhdXRob3JzLlxuICogQWxsIHNldHRpbmdzIGxvZ2ljIChsb2FkLCBzYXZlLCB2YWxpZGF0ZSwgdHJhbnNmb3JtLCBjbG9uZSkgaXMgaGFuZGxlZCBkaXJlY3RseVxuICogYnkgdGhpcyBjb21wb25lbnQgXHUyMDE0IG5vIHNlcGFyYXRlIG1hbmFnZXIgY2xhc3MgaXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXN5bmNFdmVudFJlZixcbiAgQXN5bmNFdmVudFNvdXJjZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMtZXZlbnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHJhbnNmb3JtZXJzL3RyYW5zZm9ybWVyJztcbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBBc3luY0V2ZW50cyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYy1ldmVudHMnO1xuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQge1xuICBjYXN0VG8sXG4gIGdldEFsbEtleXMsXG4gIGlzRGVlcEVxdWFsXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3RyYW5zZm9ybWVycy9kYXRlLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IEdyb3VwVHJhbnNmb3JtZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHJhbnNmb3JtZXJzL2dyb3VwLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IE1hcFRyYW5zZm9ybWVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3RyYW5zZm9ybWVycy9tYXAtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgU2V0VHJhbnNmb3JtZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHJhbnNmb3JtZXJzL3NldC10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHJhbnNmb3JtZXJzL3NraXAtcHJpdmF0ZS1wcm9wZXJ0eS10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBUd29XYXlNYXBUcmFuc2Zvcm1lciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90cmFuc2Zvcm1lcnMvdHdvLXdheS1tYXAtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgVmFsdWVXcmFwcGVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3ZhbHVlLXdyYXBwZXInO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFIYW5kbGVyIH0gZnJvbSAnLi4vZGF0YS1oYW5kbGVyLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luRXZlbnRTb3VyY2UgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWV2ZW50LXNvdXJjZS50cyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vdHJhbnNmb3JtZXJzL2R1cmF0aW9uLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IHJlZ2lzdGVyQXN5bmNFdmVudCB9IGZyb20gJy4vYXN5bmMtZXZlbnRzLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuY29uc3QgZGVmYXVsdFRyYW5zZm9ybWVyID0gbmV3IEdyb3VwVHJhbnNmb3JtZXIoW1xuICBuZXcgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEYXRlVHJhbnNmb3JtZXIoKSxcbiAgbmV3IER1cmF0aW9uVHJhbnNmb3JtZXIoKSxcbiAgbmV3IE1hcFRyYW5zZm9ybWVyKCksXG4gIG5ldyBTZXRUcmFuc2Zvcm1lcigpLFxuICBuZXcgVHdvV2F5TWFwVHJhbnNmb3JtZXIoKVxuXSk7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+IHtcbiAgLyoqXG4gICAqIFRoZSBkYXRhIGhhbmRsZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBkYXRhSGFuZGxlcjogRGF0YUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZXZlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRXZlbnRTb3VyY2U6IFBsdWdpbkV2ZW50U291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHNldHRpbmdzIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luU2V0dGluZ3NDbGFzczogQ29uc3RydWN0b3I8UGx1Z2luU2V0dGluZ3MsIFtdPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLm9uU2F2ZVNldHRpbmdzfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIHNhdmUgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgc2V0dGluZ3Mgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG9sZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIEEgc25hcHNob3Qgb2YgcGx1Z2luIHNldHRpbmdzIHN0YXRlLCBpbmNsdWRpbmcgcmF3IGlucHV0IHZhbHVlcywgZWZmZWN0aXZlICh2YWxpZGF0ZWQpIHZhbHVlcyxcbiAqIGFuZCBwZXItcHJvcGVydHkgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgZWZmZWN0aXZlIHNldHRpbmdzIHZhbHVlcyB1c2VkIGJ5IHRoZSBwbHVnaW4uIEludmFsaWQgcHJvcGVydGllcyBhcmUgcmVwbGFjZWQgd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGVmZmVjdGl2ZVZhbHVlczogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFRoZSByYXcgaW5wdXQgdmFsdWVzIGFzIGVudGVyZWQgYnkgdGhlIHVzZXIuIE1heSBjb250YWluIGludmFsaWQgdmFsdWVzLlxuICAgKi9cbiAgaW5wdXRWYWx1ZXM6IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBQZXItcHJvcGVydHkgdmFsaWRhdGlvbiBtZXNzYWdlcy4gRW1wdHkgc3RyaW5nIG1lYW5zIHZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz47XG59XG5cbi8qKlxuICogUmVhZG9ubHkgdmVyc2lvbiBvZiB7QGxpbmsgUGx1Z2luU2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBSZWFkb25seVBsdWdpblNldHRpbmdzPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbi8qKlxuICogUmVhZG9ubHkgdmVyc2lvbiBvZiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NTdGF0ZX0gZm9yIHVzZSBpbiBldmVudCBjYWxsYmFja3MgYW5kIHB1YmxpYyBnZXR0ZXJzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+PjtcblxuLyoqXG4gKiBBIHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgYSBzZXR0aW5ncyBwcm9wZXJ0eS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2V0dGluZ3NWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+ID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+ID0gKFxuICB2YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSxcbiAgc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzXG4pID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICBsb2FkU2V0dGluZ3M6IFtcbiAgICBsb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBpc0luaXRpYWxMb2FkOiBib29sZWFuXG4gIF07XG4gIHNhdmVTZXR0aW5nczogW1xuICAgIG5ld1N0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIGNvbnRleHQ6IHVua25vd25cbiAgXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLnNldFByb3BlcnR5SW1wbH0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VTZXRQcm9wZXJ0eUltcGxQYXJhbXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlLiBFbXB0eSBvciB1bnNldCBtZWFucyB2YWxpZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRpb25NZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IFByb3BlcnR5VmFsdWVzPFBsdWdpblNldHRpbmdzPjtcbn1cblxudHlwZSBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+O1xuXG50eXBlIFByb3BlcnR5VmFsdWVzPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+XTtcblxudHlwZSBWYWxpZGF0aW9uUmVzdWx0PFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFBhcnRpYWw8UmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+PjtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50cy5cbiAqXG4gKiBNYW5hZ2VzIHNldHRpbmdzIGRhdGEsIHBlcnNpc3RlbmNlLCB2YWxpZGF0aW9uLCBhbmQgZXZlbnRzLlxuICogUGx1Z2luIGF1dGhvcnMgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHBhc3MgdGhlaXIgc2V0dGluZ3MgY2xhc3MgYXNcbiAqIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VDb25zdHJ1Y3RvclBhcmFtcy5wbHVnaW5TZXR0aW5nc0NsYXNzfSwgd2hvc2UgZGVmYXVsdC1jb25zdHJ1Y3RlZCBpbnN0YW5jZSBzdXBwbGllcyB0aGUgZGVmYXVsdHMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9yZXF1aXJlLWNvbXBvbmVudC1zdWZmaXggLS0gTm9uLWFic3RyYWN0IGJhc2UgY2xhc3M7IGNvbnN1bWVycyBleHRlbmQgaXQuXG5leHBvcnQgY2xhc3MgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIENvbXBvbmVudEV4IGltcGxlbWVudHMgQXN5bmNFdmVudFNvdXJjZTxQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4+IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlYWRvbmx5IGRlZmF1bHQgc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHNldHRpbmdzIChhcyBhIHJlYWRvbmx5IG9iamVjdCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFNldHRpbmdzOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWFkb25seSBlZmZlY3RpdmUgc2V0dGluZ3MgKHZhbGlkYXRlZCwgd2l0aCBkZWZhdWx0cyBzdWJzdGl0dXRlZCBmb3IgaW52YWxpZCB2YWx1ZXMpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVhZG9ubHkgZWZmZWN0aXZlIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1N0YXRlLmVmZmVjdGl2ZVZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHNldHRpbmdzIHN0YXRlIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3NTdGF0ZSgpOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBoYW5kbGVyIHVzZWQgdG8gbG9hZCBhbmQgc2F2ZSB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFIYW5kbGVyOiBEYXRhSGFuZGxlcjtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZXZlbnQgc291cmNlIHRoZSBjb21wb25lbnQgbGlzdGVucyB0byBmb3IgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5FdmVudFNvdXJjZTogUGx1Z2luRXZlbnRTb3VyY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gc2V0dGluZ3MgY2xhc3MgdXNlZCB0byBjb25zdHJ1Y3Qgc2V0dGluZ3MgaW5zdGFuY2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ2xhc3M6IENvbnN0cnVjdG9yPFBsdWdpblNldHRpbmdzLCBbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgYXN5bmNFdmVudHMgPSBuZXcgQXN5bmNFdmVudHM8UGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+PigpO1xuICBwcml2YXRlIGN1cnJlbnRTdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG5cbiAgcHJpdmF0ZSBpc0xvYWRlZEZyb21GaWxlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBsYXN0U2F2ZWRTdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBsZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnM6ICgocmVjb3JkOiBHZW5lcmljT2JqZWN0KSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9hZGVkRnJvbUZpbGVSZXNvbHZlcnM6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlOYW1lczogUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz5bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcnMgPSBuZXcgTWFwPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRhdGFIYW5kbGVyID0gcGFyYW1zLmRhdGFIYW5kbGVyO1xuICAgIHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcyA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc0NsYXNzO1xuICAgIHRoaXMucGx1Z2luRXZlbnRTb3VyY2UgPSBwYXJhbXMucGx1Z2luRXZlbnRTb3VyY2U7XG5cbiAgICB0aGlzLmRlZmF1bHRTZXR0aW5ncyA9IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKSBhcyBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLmxhc3RTYXZlZFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLnByb3BlcnR5TmFtZXMgPSBnZXRBbGxLZXlzKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICB0aGlzLnJlZ2lzdGVyVmFsaWRhdG9ycygpO1xuICAgIHRoaXMucmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgcGx1Z2luIHNldHRpbmdzIGFuZCBzYXZlcyB0aGVtLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3NFZGl0b3IgLSBUaGUgZWRpdG9yLlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlZGl0QW5kU2F2ZShzZXR0aW5nc0VkaXRvcjogKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncykgPT4gUHJvbWlzYWJsZTx2b2lkPiwgY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGF3YWl0IHRoaXMuZWRpdChzZXR0aW5nc0VkaXRvcik7XG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlKGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIHNldHRpbmdzIGFyZSBzYWZlLlxuICAgKlxuICAgKiBJdCBydW5zIHZhbGlkYXRpb24gZm9yIGVhY2ggcHJvcGVydHkgYW5kIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbGlkYXRpb24gZmFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2FmZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnN1cmVTYWZlKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHNldHRpbmdzKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tY29tcHV0ZWQtcHJvcGVydHktZXhpc3RlbmNlLWNoZWNrIC0tIFRoaXMgdGVzdHMgd2hldGhlciBhIHZhbGlkYXRpb24gbWVzc2FnZSBpcyBub24tZW1wdHksIG5vdCB3aGV0aGVyIHRoZSBrZXkgZXhpc3RzLlxuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gZGVmYXVsdHNbcHJvcGVydHlOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHNhZmUgY29weSBvZiB0aGUgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2FmZSBjb3B5IG9mIHRoZSBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTYWZlQ29weShzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2FmZVNldHRpbmdzID0gYXdhaXQgdGhpcy5jbG9uZVNldHRpbmdzKHNldHRpbmdzKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNhZmUoc2FmZVNldHRpbmdzKTtcbiAgICByZXR1cm4gc2FmZVNldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgZnJvbSB0aGUgZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIGlzSW5pdGlhbExvYWQgLSBXaGV0aGVyIHRoZSBzZXR0aW5ncyBhcmUgYmVpbmcgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZShpc0luaXRpYWxMb2FkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kYXRhSGFuZGxlci5sb2FkRGF0YSgpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgc2V0dGluZ3MgZnJvbSBkYXRhLmpzb24uIEV4cGVjdGVkIE9iamVjdCwgZ290OiAke3R5cGVvZiBkYXRhfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdGhpbmcgc3RvcmVkIGlzIHJlYWQgYXMgYW4gZW1wdHkgcmVjb3JkIHJhdGhlciB0aGFuIHNraXBwZWQsIHNvIHRoZSBzYXZlIGJlbG93IHdyaXRlcyB0aGUgZnVsbFxuICAgICAgLy8gZGVmYXVsdCByZWNvcmQuIFdpdGhvdXQgaXQgYSB1c2VyIHdobyBuZXZlciBjaGFuZ2VkIGEgc2V0dGluZyBoYXMgbm8gYGRhdGEuanNvbmAgYXQgYWxsLCBsb29rc1xuICAgICAgLy8gZXhhY3RseSBsaWtlIGEgZnJlc2ggaW5zdGFsbCwgYW5kIHNpbGVudGx5IHBpY2tzIHVwIGV2ZXJ5IGRlZmF1bHQgYSBsYXRlciByZWxlYXNlIGNoYW5nZXMuXG4gICAgICBjb25zdCByYXdSZWNvcmQgPSAoZGF0YSA/PyB7fSkgYXMgR2VuZXJpY09iamVjdDtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0gYXdhaXQgdGhpcy5yYXdSZWNvcmRUb1NldHRpbmdzKHJhd1JlY29yZCk7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZShwYXJzZWRTZXR0aW5ncyk7XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5SW1wbCh7XG4gICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHZhbGlkYXRpb25NZXNzYWdlOiB2YWxpZGF0aW9uUmVzdWx0W3Byb3BlcnR5TmFtZV0sXG4gICAgICAgICAgdmFsdWU6IHBhcnNlZFNldHRpbmdzW3Byb3BlcnR5TmFtZV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSBhd2FpdCB0aGlzLmNsb25lU3RhdGUodGhpcy5jdXJyZW50U3RhdGUpO1xuXG4gICAgICAvLyBBIGNvbXBvbmVudCB0aGF0IGtub3dzIG5vIHByb3BlcnR5IG5hbWVzIGNhbm5vdCBub3JtYWxpemUgYW55dGhpbmc6IGBzZXR0aW5nc1RvUmF3UmVjb3JkKClgIGNhblxuICAgICAgLy8gb25seSBldmVyIHJldHVybiBge31gLCBzbyB0aGUgc2F2ZSBiZWxvdyB3b3VsZCBub3QgcmV3cml0ZSBgZGF0YS5qc29uYCAtLSBpdCB3b3VsZCBlbXB0eSBpdC5cbiAgICAgIC8vIGBQbHVnaW5CYXNlYCBhZGRzIGEgcGxhY2Vob2xkZXIgYFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+YCBiZWZvcmUgYG9ubG9hZEltcGwoKWAgc3dhcHNcbiAgICAgIC8vIGluIHRoZSBwbHVnaW4ncyBvd24gY29tcG9uZW50LCBhbmQgdGhhdCBwbGFjZWhvbGRlciBpcyBleGFjdGx5IHRoaXMgY2FzZTogaXQgcmVhZCBldmVyeSByZWFsXG4gICAgICAvLyBzZXR0aW5nLCBrZXB0IG5vbmUgb2YgdGhlbSwgYW5kIHNhdmVkIHRoZSBkaWZmZXJlbmNlIGJhY2sgb3ZlciB0aGUgZmlsZS5cbiAgICAgIGlmICh0aGlzLnByb3BlcnR5TmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3UmVjb3JkID0gYXdhaXQgdGhpcy5zZXR0aW5nc1RvUmF3UmVjb3JkKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcblxuICAgICAgaWYgKCFpc0RlZXBFcXVhbChuZXdSZWNvcmQsIGRhdGEpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZUltcGwoKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrTG9hZGVkRnJvbUZpbGUoKTtcbiAgICAgIGF3YWl0IHRoaXMuYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKCdsb2FkU2V0dGluZ3MnLCB0aGlzLmN1cnJlbnRTdGF0ZSBhcyBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LCBpc0luaXRpYWxMb2FkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgb2ZmPFxuICAgIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICBBcmd1bWVudHMgZXh0ZW5kcyBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4gPyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz5bRXZlbnROYW1lXVxuICAgICAgOiB1bmtub3duW11cbiAgPihuYW1lOiBFdmVudE5hbWUsIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogdm9pZCB7XG4gICAgdGhpcy5hc3luY0V2ZW50cy5vZmYobmFtZSwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHVibGljIG9mZnJlZihldmVudFJlZjogQXN5bmNFdmVudFJlZik6IHZvaWQge1xuICAgIHRoaXMuYXN5bmNFdmVudHMub2ZmcmVmKGV2ZW50UmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKi9cbiAgcHVibGljIG9uPFxuICAgIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICBBcmd1bWVudHMgZXh0ZW5kcyBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4gPyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz5bRXZlbnROYW1lXVxuICAgICAgOiB1bmtub3duW11cbiAgPihuYW1lOiBFdmVudE5hbWUsIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LCB0aGlzQXJndW1lbnQ/OiB1bmtub3duKTogQXN5bmNFdmVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNFdmVudHMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmd1bWVudCk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKi9cbiAgcHVibGljIG9uY2U8XG4gICAgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgIEFyZ3VtZW50cyBleHRlbmRzIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPiA/IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPltFdmVudE5hbWVdXG4gICAgICA6IHVua25vd25bXVxuICA+KG5hbWU6IEV2ZW50TmFtZSwgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sIHRoaXNBcmd1bWVudD86IHVua25vd24pOiBBc3luY0V2ZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5hc3luY0V2ZW50cy5vbmNlKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJndW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBleHRlcm5hbCBzZXR0aW5ncyBjaGFuZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHJlbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGF3YWl0IHRoaXMubG9hZEZyb21GaWxlKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBzZXR0aW5ncyBmcm9tIGZpbGUgYW5kIHJlZ2lzdGVycyBldmVudCBoYW5kbGVycy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgdGhpcy5vbignbG9hZFNldHRpbmdzJywgdGhpcy5vbkxvYWRTZXR0aW5ncy5iaW5kKHRoaXMpKSk7XG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KHRoaXMsIHRoaXMub24oJ3NhdmVTZXR0aW5ncycsIChuZXdTdGF0ZSwgb2xkU3RhdGUsIGNvbnRleHQpID0+IHRoaXMub25TYXZlU2V0dGluZ3MoeyBjb250ZXh0LCBuZXdTdGF0ZSwgb2xkU3RhdGUgfSkpKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgdGhpcy5wbHVnaW5FdmVudFNvdXJjZS5vbignZXh0ZXJuYWxTZXR0aW5nc0NoYW5nZScsIHRoaXMub25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlLmJpbmQodGhpcykpKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRGcm9tRmlsZSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBsZWdhY3kgc2V0dGluZ3MgY29udmVydGVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIExlZ2FjeVNldHRpbmdzIC0gVGhlIGxlZ2FjeSBzZXR0aW5ncyBjbGFzcy5cbiAgICogQHBhcmFtIGxlZ2FjeVNldHRpbmdzQ2xhc3MgLSBUaGUgbGVnYWN5IHNldHRpbmdzIGNsYXNzLlxuICAgKiBAcGFyYW0gY29udmVydGVyIC0gVGhlIGNvbnZlcnRlci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckxlZ2FjeVNldHRpbmdzQ29udmVydGVyPExlZ2FjeVNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PihcbiAgICBsZWdhY3lTZXR0aW5nc0NsYXNzOiBuZXcgKCkgPT4gTGVnYWN5U2V0dGluZ3MsXG4gICAgY29udmVydGVyOiAobGVnYWN5U2V0dGluZ3M6IFBhcnRpYWw8TGVnYWN5U2V0dGluZ3M+ICYgUGFydGlhbDxQbHVnaW5TZXR0aW5ncz4pID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdGhpc1dyYXBwZXIgPSBWYWx1ZVdyYXBwZXIub2YodGhpcyk7XG4gICAgdGhpcy5sZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMucHVzaChsZWdhY3lTZXR0aW5nc0NvbnZlcnRlcik7XG5cbiAgICBmdW5jdGlvbiBsZWdhY3lTZXR0aW5nc0NvbnZlcnRlcihyZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGxlZ2FjeVNldHRpbmdzS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihPYmplY3Qua2V5cyhuZXcgbGVnYWN5U2V0dGluZ3NDbGFzcygpKSk7XG4gICAgICBjb25zdCBwbHVnaW5TZXR0aW5nS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPih0aGlzV3JhcHBlci52YWx1ZS5wcm9wZXJ0eU5hbWVzKTtcbiAgICAgIGNvbnN0IGxlZ2FjeVNldHRpbmdzID0gcmVjb3JkIGFzIFBhcnRpYWw8TGVnYWN5U2V0dGluZ3M+ICYgUGFydGlhbDxQbHVnaW5TZXR0aW5ncz47XG4gICAgICBjb252ZXJ0ZXIobGVnYWN5U2V0dGluZ3MpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobGVnYWN5U2V0dGluZ3MpKSB7XG4gICAgICAgIGlmIChwbHVnaW5TZXR0aW5nS2V5cy5oYXMoa2V5KSB8fCAhbGVnYWN5U2V0dGluZ3NLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFdlIGhhdmUgbm8gb3RoZXIgd2F5IHRvIGRlbGV0ZSB0aGUgcHJvcGVydHkuXG4gICAgICAgIGRlbGV0ZSByZWNvcmRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmFsaWRhdG9yIGZvciBhIHByb3BlcnR5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXR0aW5ncyBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHZhbGlkYXRvciAtIFRoZSB2YWxpZGF0b3IuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJWYWxpZGF0b3I8UHJvcGVydHlOYW1lIGV4dGVuZHMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbGlkYXRvcjogU2V0dGluZ3NWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3MsIFByb3BlcnR5TmFtZT5cbiAgKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0b3JzLnNldChwcm9wZXJ0eU5hbWUsIHZhbGlkYXRvciBhcyBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmFsaWRhdGVzIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmV2YWxpZGF0ZSgpOiBQcm9taXNlPFJlY29yZDxQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPj4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgYXdhaXQgdGhpcy5lZGl0KG5vb3ApO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXM7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgb2YgdGhlIHNhdmUgdG8gZmlsZSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGlmIChpc0RlZXBFcXVhbCh0aGlzLmxhc3RTYXZlZFN0YXRlLmlucHV0VmFsdWVzLCB0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgYXdhaXQgdGhpcy5hc3luY0V2ZW50cy50cmlnZ2VyQXN5bmMoXG4gICAgICAnc2F2ZVNldHRpbmdzJyxcbiAgICAgIHRoaXMuY3VycmVudFN0YXRlIGFzIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgICB0aGlzLmxhc3RTYXZlZFN0YXRlIGFzIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgICBjb250ZXh0XG4gICAgKTtcbiAgICB0aGlzLmxhc3RTYXZlZFN0YXRlID0gYXdhaXQgdGhpcy5jbG9uZVN0YXRlKHRoaXMuY3VycmVudFN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldFByb3BlcnR5PFByb3BlcnR5TmFtZSBleHRlbmRzIFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+PihcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICB2YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgYXdhaXQgdGhpcy5lZGl0KChzZXR0aW5ncykgPT4ge1xuICAgICAgc2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncz4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3M+ID0ge307XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWxpZGF0b3JdIG9mIHRoaXMudmFsaWRhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSBhd2FpdCB2YWxpZGF0b3Ioc2V0dGluZ3NbcHJvcGVydHlOYW1lXSwgc2V0dGluZ3MpO1xuICAgICAgaWYgKHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgc2V0dGluZ3MgaGF2ZSBiZWVuIHJlYWQgZnJvbSBgZGF0YS5qc29uYCBhdCBsZWFzdCBvbmNlLlxuICAgKlxuICAgKiBBbnl0aGluZyB0aGF0IHJlYWRzIGEgc2V0dGluZyBmcm9tIG91dHNpZGUgdGhpcyBjb21wb25lbnQgaGFzIHRvIHdhaXQgZm9yIHRoaXMsIGJlY2F1c2UgdW50aWwgdGhlIGZpcnN0XG4gICAqIHtAbGluayBsb2FkRnJvbUZpbGV9IGNvbXBsZXRlcyB7QGxpbmsgc2V0dGluZ3N9IHN0aWxsIGhvbGRzIHRoZSBERUZBVUxUUyBcdTIwMTQgcmVhZGluZyBpdCBlYXJsaWVyIGFuc3dlcnNcbiAgICogd2l0aCBhIGRlZmF1bHQgcmF0aGVyIHRoYW4gd2l0aCB3aGF0IHRoZSB1c2VyIGFjdHVhbGx5IHN0b3JlZC4gVGhhdCB3aW5kb3cgaXMgZWFzeSB0byBtaXNzLCBzaW5jZSBpdCBpc1xuICAgKiBlbXB0eSBvbiBhIGNvbGQgc3RhcnQgKHRoZSB3b3Jrc3BhY2UgbGF5b3V0IGlzIG5vdCByZWFkeSB5ZXQsIHNvIG5vdGhpbmcgaGFzIHJ1bikgYnV0IHdpZGUgb3BlbiBvbiBhXG4gICAqIHJ1bnRpbWUgZW5hYmxlIGZyb20gdGhlIENvbW11bml0eSBQbHVnaW5zIHRhYiBvciBhIHJlLWVuYWJsZSBhZnRlciBhbiB1cGRhdGUsIHdoZXJlIGEgbGF5b3V0LXJlYWR5XG4gICAqIGhhbmRsZXIgZmlyZXMgaW1tZWRpYXRlbHkgd2hpbGUgdGhpcyBjb21wb25lbnQncyBvd24gYXN5bmMgbG9hZCBpcyBzdGlsbCBpbiBmbGlnaHQuXG4gICAqXG4gICAqIFJlc29sdmVzIGltbWVkaWF0ZWx5IG9uY2UgdGhlIHNldHRpbmdzIGhhdmUgbG9hZGVkLCBzbyBhIGNhbGxlciB0aGF0IGFycml2ZXMgbGF0ZSBpcyBub3Qgc3RyYW5kZWRcbiAgICogd2FpdGluZyBmb3IgYW4gZXZlbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJhaXNlZC4gTGF0ZXIgcmVsb2FkcyAoYW4gZXh0ZXJuYWwgYGRhdGEuanNvbmAgY2hhbmdlKSBkb1xuICAgKiBub3QgcmVzZXQgaXQgXHUyMDE0IHRoZSBxdWVzdGlvbiBpdCBhbnN3ZXJzIGlzIHdoZXRoZXIgdGhlIHNldHRpbmdzIGhhdmUgRVZFUiBiZWVuIHJlYWQsIG5vdCB3aGV0aGVyIHRoZVxuICAgKiBtb3N0IHJlY2VudCByZWFkIGhhcyBmaW5pc2hlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzZXR0aW5ncyBoYXZlIGJlZW4gbG9hZGVkIGZyb20gdGhlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgd2hlbkxvYWRlZEZyb21GaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGVkRnJvbUZpbGVcbiAgICAgID8gbm9vcEFzeW5jKClcbiAgICAgIDogbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZWRGcm9tRmlsZVJlc29sdmVycy5wdXNoKHJlc29sdmUpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdHJhbnNmb3JtZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lci5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRUcmFuc2Zvcm1lcigpOiBUcmFuc2Zvcm1lciB7XG4gICAgcmV0dXJuIGRlZmF1bHRUcmFuc2Zvcm1lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIHJlY29yZCBpcyBsb2FkZWQgZnJvbSBkaXNrLlxuICAgKlxuICAgKiBAcGFyYW0gcmVjb3JkIC0gVGhlIHJlY29yZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkxvYWRSZWNvcmQocmVjb3JkOiBHZW5lcmljT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBjb252ZXJ0ZXIgb2YgdGhpcy5sZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnZlcnRlcihyZWNvcmQpO1xuICAgIH1cbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzZXR0aW5ncyBhcmUgbG9hZGVkIG9yIHJlbG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gX2xvYWRlZFN0YXRlIC0gVGhlIGxvYWRlZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICogQHBhcmFtIF9pc0luaXRpYWxMb2FkIC0gV2hldGhlciB0aGlzIGlzIHRoZSBpbml0aWFsIGxvYWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkU2V0dGluZ3MoXG4gICAgX2xvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIF9pc0luaXRpYWxMb2FkOiBib29sZWFuXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU2F2ZVNldHRpbmdzKHBhcmFtczogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlT25TYXZlU2V0dGluZ3NQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGV4dDogX2NvbnRleHQsXG4gICAgICBuZXdTdGF0ZTogX25ld1N0YXRlLFxuICAgICAgb2xkU3RhdGU6IF9vbGRTdGF0ZVxuICAgIH0gPSBwYXJhbXM7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyByZWNvcmQgaXMgYWJvdXQgdG8gYmUgc2F2ZWQgdG8gZGlzay5cbiAgICpcbiAgICogQHBhcmFtIF9yZWNvcmQgLSBUaGUgcmVjb3JkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU2F2aW5nUmVjb3JkKF9yZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGxlZ2FjeSBzZXR0aW5ncyBjb252ZXJ0ZXJzLlxuICAgKiBPdmVycmlkZSB0byByZWdpc3RlciBsZWdhY3kgc2V0dGluZ3MgY29udmVydGVycy5cbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlckxlZ2FjeVNldHRpbmdzQ29udmVydGVycygpOiB2b2lkIHtcbiAgICBub29wKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSB2YWxpZGF0b3JzLlxuICAgKiBPdmVycmlkZSB0byByZWdpc3RlciB2YWxpZGF0b3JzIGZvciBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyVmFsaWRhdG9ycygpOiB2b2lkIHtcbiAgICBub29wKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsb25lU2V0dGluZ3Moc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZChzZXR0aW5ncyk7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHJlY29yZCk7XG4gICAgY29uc3QgY2xvbmVSZWNvcmQgPSBKU09OLnBhcnNlKGpzb24pIGFzIEdlbmVyaWNPYmplY3Q7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmF3UmVjb3JkVG9TZXR0aW5ncyhjbG9uZVJlY29yZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsb25lU3RhdGUoXG4gICAgc3RhdGU6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+XG4gICk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWZmZWN0aXZlVmFsdWVzOiBhd2FpdCB0aGlzLmNsb25lU2V0dGluZ3Moc3RhdGUuZWZmZWN0aXZlVmFsdWVzKSxcbiAgICAgIGlucHV0VmFsdWVzOiBhd2FpdCB0aGlzLmNsb25lU2V0dGluZ3Moc3RhdGUuaW5wdXRWYWx1ZXMpLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VzOiB7IC4uLnN0YXRlLnZhbGlkYXRpb25NZXNzYWdlcyB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVmYXVsdFN0YXRlKCk6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWZmZWN0aXZlVmFsdWVzOiBuZXcgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzKCksXG4gICAgICBpbnB1dFZhbHVlczogbmV3IHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcygpLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VzOiBjYXN0VG88UmVjb3JkPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+Pih7fSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlZGl0KHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHRpbmdzRWRpdG9yKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvblJlc3VsdFtwcm9wZXJ0eU5hbWVdID8/ICcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lZmZlY3RpdmVWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlXG4gICAgICAgICAgPyBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgOiB0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZFByb3BlcnR5TmFtZShwcm9wZXJ0eTogdW5rbm93bik6IHByb3BlcnR5IGlzIFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdHlwZW9mIHByb3BlcnR5ID09PSAnc3RyaW5nJyAmJiAodGhpcy5wcm9wZXJ0eU5hbWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhwcm9wZXJ0eSk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtMb2FkZWRGcm9tRmlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTG9hZGVkRnJvbUZpbGUgPSB0cnVlO1xuICAgIC8vIERyYWluZWQgcmF0aGVyIHRoYW4gaXRlcmF0ZWQsIHNvIHRoZSBsaXN0IGRvZXMgbm90IGtlZXAgZXZlcnkgcGFzdCB3YWl0ZXIgYWxpdmUgYWNyb3NzIHJlbG9hZHMuXG4gICAgY29uc3QgcmVzb2x2ZXJzID0gdGhpcy5sb2FkZWRGcm9tRmlsZVJlc29sdmVycy5zcGxpY2UoMCk7XG4gICAgZm9yIChjb25zdCByZXNvbHZlIG9mIHJlc29sdmVycykge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmF3UmVjb3JkVG9TZXR0aW5ncyhyYXdSZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmF3UmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJhd1JlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmF3UmVjb3JkKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcygpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyYXdSZWNvcmQpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ1BsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTpyYXdSZWNvcmRUb1NldHRpbmdzJykoYFVua25vd24gcHJvcGVydHk6ICR7cHJvcGVydHlOYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSlNPTiBjYW5ub3QgaG9sZCBgdW5kZWZpbmVkYCwgc28gb25seSBhIGxlZ2FjeSBjb252ZXJ0ZXIgcHJvZHVjZXMgaXQuIEtlZXAgdGhlIGRlZmF1bHQgcmF0aGVyIHRoYW5cbiAgICAgIC8vIGxldHRpbmcgYSBjb252ZXJ0ZXIgdGhhdCBhc3NpZ25lZCBhIGtleSBpdCBoYWQgbm90aGluZyBmb3Igd2lwZSBpdCBvdXQuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIGRlZmF1bHRzW3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShcbiAgICAgICAgICAnUG9zc2libGUgaW52YWxpZCB2YWx1ZSB0eXBlLiBJdCBtaWdodCBsZWFkIHRvIGFuIHVuZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIHBsdWdpbi4gVGhlcmUgaXMgYWxzbyBhIGNoYW5jZSBpdCBpcyBhIGZhbHNlLW5lZ2F0aXZlIHdhcm5pbmcsIGFzIHdlIGFyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdCB0eXBlIG9mIHRoZSB2YWx1ZSBpbiBydW50aW1lLicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdLFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZSBhcyBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncz47XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlVG9GaWxlSW1wbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRhdGFIYW5kbGVyLnNhdmVEYXRhKGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZCh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0eUltcGwocGFyYW1zOiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VTZXRQcm9wZXJ0eUltcGxQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UsXG4gICAgICB2YWx1ZVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZSA/PyAnJztcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lZmZlY3RpdmVWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlID8gZGVmYXVsdHNbcHJvcGVydHlOYW1lXSA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR0aW5nc1RvUmF3UmVjb3JkKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8R2VuZXJpY09iamVjdD4ge1xuICAgIGNvbnN0IHJhd1JlY29yZDogR2VuZXJpY09iamVjdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICByYXdSZWNvcmRbcHJvcGVydHlOYW1lXSA9IHNldHRpbmdzW3Byb3BlcnR5TmFtZV07XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vblNhdmluZ1JlY29yZChyYXdSZWNvcmQpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm1PYmplY3RSZWN1cnNpdmVseShyYXdSZWNvcmQpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCQSxTQUFTLG1CQUFtQjtBQUM1QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsc0NBQXNDO0FBQy9DLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsb0JBQW9CO0FBSzdCLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsbUJBQW1CO0FB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
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbXBvbmVudCB0aGF0IG1hbmFnZXMgcGx1Z2luIHNldHRpbmdzOiBkYXRhLCBwZXJzaXN0ZW5jZSwgdmFsaWRhdGlvbiwgYW5kIGV2ZW50cy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgcHVibGljLWZhY2luZyBzZXR0aW5ncyBBUEkgZm9yIHBsdWdpbiBhdXRob3JzLlxuICogQWxsIHNldHRpbmdzIGxvZ2ljIChsb2FkLCBzYXZlLCB2YWxpZGF0ZSwgdHJhbnNmb3JtLCBjbG9uZSkgaXMgaGFuZGxlZCBkaXJlY3RseVxuICogYnkgdGhpcyBjb21wb25lbnQg4oCUIG5vIHNlcGFyYXRlIG1hbmFnZXIgY2xhc3MgaXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXN5bmNFdmVudFJlZixcbiAgQXN5bmNFdmVudFNvdXJjZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMtZXZlbnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHJhbnNmb3JtZXJzL3RyYW5zZm9ybWVyJztcbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBBc3luY0V2ZW50cyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYy1ldmVudHMnO1xuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQge1xuICBjYXN0VG8sXG4gIGdldEFsbEtleXMsXG4gIGlzRGVlcEVxdWFsXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3RyYW5zZm9ybWVycy9kYXRlLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IEdyb3VwVHJhbnNmb3JtZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHJhbnNmb3JtZXJzL2dyb3VwLXRyYW5zZm9ybWVyJztcbmltcG9ydCB7IE1hcFRyYW5zZm9ybWVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3RyYW5zZm9ybWVycy9tYXAtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgU2V0VHJhbnNmb3JtZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHJhbnNmb3JtZXJzL3NldC10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHJhbnNmb3JtZXJzL3NraXAtcHJpdmF0ZS1wcm9wZXJ0eS10cmFuc2Zvcm1lcic7XG5pbXBvcnQgeyBUd29XYXlNYXBUcmFuc2Zvcm1lciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90cmFuc2Zvcm1lcnMvdHdvLXdheS1tYXAtdHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgVmFsdWVXcmFwcGVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3ZhbHVlLXdyYXBwZXInO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFIYW5kbGVyIH0gZnJvbSAnLi4vZGF0YS1oYW5kbGVyLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luRXZlbnRTb3VyY2UgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWV2ZW50LXNvdXJjZS50cyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vdHJhbnNmb3JtZXJzL2R1cmF0aW9uLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IHJlZ2lzdGVyQXN5bmNFdmVudCB9IGZyb20gJy4vYXN5bmMtZXZlbnRzLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuY29uc3QgZGVmYXVsdFRyYW5zZm9ybWVyID0gbmV3IEdyb3VwVHJhbnNmb3JtZXIoW1xuICBuZXcgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEYXRlVHJhbnNmb3JtZXIoKSxcbiAgbmV3IER1cmF0aW9uVHJhbnNmb3JtZXIoKSxcbiAgbmV3IE1hcFRyYW5zZm9ybWVyKCksXG4gIG5ldyBTZXRUcmFuc2Zvcm1lcigpLFxuICBuZXcgVHdvV2F5TWFwVHJhbnNmb3JtZXIoKVxuXSk7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+IHtcbiAgLyoqXG4gICAqIFRoZSBkYXRhIGhhbmRsZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBkYXRhSGFuZGxlcjogRGF0YUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZXZlbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRXZlbnRTb3VyY2U6IFBsdWdpbkV2ZW50U291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHNldHRpbmdzIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luU2V0dGluZ3NDbGFzczogQ29uc3RydWN0b3I8UGx1Z2luU2V0dGluZ3MsIFtdPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLm9uU2F2ZVNldHRpbmdzfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIHNhdmUgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgc2V0dGluZ3Mgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG9sZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIEEgc25hcHNob3Qgb2YgcGx1Z2luIHNldHRpbmdzIHN0YXRlLCBpbmNsdWRpbmcgcmF3IGlucHV0IHZhbHVlcywgZWZmZWN0aXZlICh2YWxpZGF0ZWQpIHZhbHVlcyxcbiAqIGFuZCBwZXItcHJvcGVydHkgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgZWZmZWN0aXZlIHNldHRpbmdzIHZhbHVlcyB1c2VkIGJ5IHRoZSBwbHVnaW4uIEludmFsaWQgcHJvcGVydGllcyBhcmUgcmVwbGFjZWQgd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGVmZmVjdGl2ZVZhbHVlczogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFRoZSByYXcgaW5wdXQgdmFsdWVzIGFzIGVudGVyZWQgYnkgdGhlIHVzZXIuIE1heSBjb250YWluIGludmFsaWQgdmFsdWVzLlxuICAgKi9cbiAgaW5wdXRWYWx1ZXM6IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBQZXItcHJvcGVydHkgdmFsaWRhdGlvbiBtZXNzYWdlcy4gRW1wdHkgc3RyaW5nIG1lYW5zIHZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz47XG59XG5cbi8qKlxuICogUmVhZG9ubHkgdmVyc2lvbiBvZiB7QGxpbmsgUGx1Z2luU2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBSZWFkb25seVBsdWdpblNldHRpbmdzPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbi8qKlxuICogUmVhZG9ubHkgdmVyc2lvbiBvZiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NTdGF0ZX0gZm9yIHVzZSBpbiBldmVudCBjYWxsYmFja3MgYW5kIHB1YmxpYyBnZXR0ZXJzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgdHlwZSBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+PjtcblxuLyoqXG4gKiBBIHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgYSBzZXR0aW5ncyBwcm9wZXJ0eS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2V0dGluZ3NWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+ID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+ID0gKFxuICB2YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSxcbiAgc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzXG4pID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICBsb2FkU2V0dGluZ3M6IFtcbiAgICBsb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBpc0luaXRpYWxMb2FkOiBib29sZWFuXG4gIF07XG4gIHNhdmVTZXR0aW5nczogW1xuICAgIG5ld1N0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIGNvbnRleHQ6IHVua25vd25cbiAgXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLnNldFByb3BlcnR5SW1wbH0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VTZXRQcm9wZXJ0eUltcGxQYXJhbXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlLiBFbXB0eSBvciB1bnNldCBtZWFucyB2YWxpZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRpb25NZXNzYWdlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IFByb3BlcnR5VmFsdWVzPFBsdWdpblNldHRpbmdzPjtcbn1cblxudHlwZSBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+O1xuXG50eXBlIFByb3BlcnR5VmFsdWVzPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+XTtcblxudHlwZSBWYWxpZGF0aW9uUmVzdWx0PFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFBhcnRpYWw8UmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+PjtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50cy5cbiAqXG4gKiBNYW5hZ2VzIHNldHRpbmdzIGRhdGEsIHBlcnNpc3RlbmNlLCB2YWxpZGF0aW9uLCBhbmQgZXZlbnRzLlxuICogUGx1Z2luIGF1dGhvcnMgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHBhc3MgdGhlaXIgc2V0dGluZ3MgY2xhc3MgYXNcbiAqIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VDb25zdHJ1Y3RvclBhcmFtcy5wbHVnaW5TZXR0aW5nc0NsYXNzfSwgd2hvc2UgZGVmYXVsdC1jb25zdHJ1Y3RlZCBpbnN0YW5jZSBzdXBwbGllcyB0aGUgZGVmYXVsdHMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi10b29sa2l0L3JlcXVpcmUtY29tcG9uZW50LXN1ZmZpeCAtLSBOb24tYWJzdHJhY3QgYmFzZSBjbGFzczsgY29uc3VtZXJzIGV4dGVuZCBpdC5cbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQ29tcG9uZW50RXggaW1wbGVtZW50cyBBc3luY0V2ZW50U291cmNlPFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPj4ge1xuICAvKipcbiAgICogR2V0cyB0aGUgcmVhZG9ubHkgZGVmYXVsdCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlZmF1bHQgc2V0dGluZ3MgKGFzIGEgcmVhZG9ubHkgb2JqZWN0KS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0U2V0dGluZ3M6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlYWRvbmx5IGVmZmVjdGl2ZSBzZXR0aW5ncyAodmFsaWRhdGVkLCB3aXRoIGRlZmF1bHRzIHN1YnN0aXR1dGVkIGZvciBpbnZhbGlkIHZhbHVlcykuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWFkb25seSBlZmZlY3RpdmUgc2V0dGluZ3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzU3RhdGUuZWZmZWN0aXZlVmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc2V0dGluZ3Mgc3RhdGUgc25hcHNob3QuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHNldHRpbmdzIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXR0aW5nc1N0YXRlKCk6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSBhcyBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIGhhbmRsZXIgdXNlZCB0byBsb2FkIGFuZCBzYXZlIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YUhhbmRsZXI6IERhdGFIYW5kbGVyO1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBldmVudCBzb3VyY2UgdGhlIGNvbXBvbmVudCBsaXN0ZW5zIHRvIGZvciBleHRlcm5hbCBzZXR0aW5ncyBjaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbkV2ZW50U291cmNlOiBQbHVnaW5FdmVudFNvdXJjZTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBzZXR0aW5ncyBjbGFzcyB1c2VkIHRvIGNvbnN0cnVjdCBzZXR0aW5ncyBpbnN0YW5jZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luU2V0dGluZ3NDbGFzczogQ29uc3RydWN0b3I8UGx1Z2luU2V0dGluZ3MsIFtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBhc3luY0V2ZW50cyA9IG5ldyBBc3luY0V2ZW50czxQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4+KCk7XG4gIHByaXZhdGUgY3VycmVudFN0YXRlOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcblxuICBwcml2YXRlIGlzTG9hZGVkRnJvbUZpbGUgPSBmYWxzZTtcblxuICBwcml2YXRlIGxhc3RTYXZlZFN0YXRlOiBQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxlZ2FjeVNldHRpbmdzQ29udmVydGVyczogKChyZWNvcmQ6IEdlbmVyaWNPYmplY3QpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkZWRGcm9tRmlsZVJlc29sdmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWVzOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPltdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9ycyA9IG5ldyBNYXA8UHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4sIFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzPj4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gc2V0dGluZ3MgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VDb25zdHJ1Y3RvclBhcmFtczxQbHVnaW5TZXR0aW5ncz4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBwYXJhbXMuZGF0YUhhbmRsZXI7XG4gICAgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzID0gcGFyYW1zLnBsdWdpblNldHRpbmdzQ2xhc3M7XG4gICAgdGhpcy5wbHVnaW5FdmVudFNvdXJjZSA9IHBhcmFtcy5wbHVnaW5FdmVudFNvdXJjZTtcblxuICAgIHRoaXMuZGVmYXVsdFNldHRpbmdzID0gbmV3IHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcygpIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMucHJvcGVydHlOYW1lcyA9IGdldEFsbEtleXModGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG4gICAgdGhpcy5yZWdpc3RlckxlZ2FjeVNldHRpbmdzQ29udmVydGVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgYW5kIHNhdmVzIHRoZW0uXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nc0VkaXRvciAtIFRoZSBlZGl0b3IuXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVkaXRBbmRTYXZlKHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LCBjb250ZXh0PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgYXdhaXQgdGhpcy5lZGl0KHNldHRpbmdzRWRpdG9yKTtcbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGUoY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgc2V0dGluZ3MgYXJlIHNhZmUuXG4gICAqXG4gICAqIEl0IHJ1bnMgdmFsaWRhdGlvbiBmb3IgZWFjaCBwcm9wZXJ0eSBhbmQgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsaWRhdGlvbiBmYWlscy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYWZlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuc3VyZVNhZmUoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUoc2V0dGluZ3MpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1jb21wdXRlZC1wcm9wZXJ0eS1leGlzdGVuY2UtY2hlY2sgLS0gVGhpcyB0ZXN0cyB3aGV0aGVyIGEgdmFsaWRhdGlvbiBtZXNzYWdlIGlzIG5vbi1lbXB0eSwgbm90IHdoZXRoZXIgdGhlIGtleSBleGlzdHMuXG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdFtwcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgc2FmZSBjb3B5IG9mIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzYWZlIGNvcHkgb2YgdGhlIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFNhZmVDb3B5KHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICBjb25zdCBzYWZlU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmNsb25lU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU2FmZShzYWZlU2V0dGluZ3MpO1xuICAgIHJldHVybiBzYWZlU2V0dGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHBsdWdpbiBzZXR0aW5ncyBmcm9tIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhlIHNldHRpbmdzIGFyZSBiZWluZyBsb2FkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZEZyb21GaWxlKGlzSW5pdGlhbExvYWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmRhdGFIYW5kbGVyLmxvYWREYXRhKCk7XG4gICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFN0YXRlKCk7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBzZXR0aW5ncyBmcm9tIGRhdGEuanNvbi4gRXhwZWN0ZWQgT2JqZWN0LCBnb3Q6ICR7dHlwZW9mIGRhdGF9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTm90aGluZyBzdG9yZWQgaXMgcmVhZCBhcyBhbiBlbXB0eSByZWNvcmQgcmF0aGVyIHRoYW4gc2tpcHBlZCwgc28gdGhlIHNhdmUgYmVsb3cgd3JpdGVzIHRoZSBmdWxsXG4gICAgICAvLyBkZWZhdWx0IHJlY29yZC4gV2l0aG91dCBpdCBhIHVzZXIgd2hvIG5ldmVyIGNoYW5nZWQgYSBzZXR0aW5nIGhhcyBubyBgZGF0YS5qc29uYCBhdCBhbGwsIGxvb2tzXG4gICAgICAvLyBleGFjdGx5IGxpa2UgYSBmcmVzaCBpbnN0YWxsLCBhbmQgc2lsZW50bHkgcGlja3MgdXAgZXZlcnkgZGVmYXVsdCBhIGxhdGVyIHJlbGVhc2UgY2hhbmdlcy5cbiAgICAgIGNvbnN0IHJhd1JlY29yZCA9IChkYXRhID8/IHt9KSBhcyBHZW5lcmljT2JqZWN0O1xuICAgICAgY29uc3QgcGFyc2VkU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnJhd1JlY29yZFRvU2V0dGluZ3MocmF3UmVjb3JkKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHBhcnNlZFNldHRpbmdzKTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlJbXBsKHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSxcbiAgICAgICAgICB2YWx1ZTogcGFyc2VkU2V0dGluZ3NbcHJvcGVydHlOYW1lXVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IGF3YWl0IHRoaXMuY2xvbmVTdGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZSk7XG5cbiAgICAgIC8vIEEgY29tcG9uZW50IHRoYXQga25vd3Mgbm8gcHJvcGVydHkgbmFtZXMgY2Fubm90IG5vcm1hbGl6ZSBhbnl0aGluZzogYHNldHRpbmdzVG9SYXdSZWNvcmQoKWAgY2FuXG4gICAgICAvLyBvbmx5IGV2ZXIgcmV0dXJuIGB7fWAsIHNvIHRoZSBzYXZlIGJlbG93IHdvdWxkIG5vdCByZXdyaXRlIGBkYXRhLmpzb25gIC0tIGl0IHdvdWxkIGVtcHR5IGl0LlxuICAgICAgLy8gYFBsdWdpbkJhc2VgIGFkZHMgYSBwbGFjZWhvbGRlciBgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD5gIGJlZm9yZSBgb25sb2FkSW1wbCgpYCBzd2Fwc1xuICAgICAgLy8gaW4gdGhlIHBsdWdpbidzIG93biBjb21wb25lbnQsIGFuZCB0aGF0IHBsYWNlaG9sZGVyIGlzIGV4YWN0bHkgdGhpcyBjYXNlOiBpdCByZWFkIGV2ZXJ5IHJlYWxcbiAgICAgIC8vIHNldHRpbmcsIGtlcHQgbm9uZSBvZiB0aGVtLCBhbmQgc2F2ZWQgdGhlIGRpZmZlcmVuY2UgYmFjayBvdmVyIHRoZSBmaWxlLlxuICAgICAgaWYgKHRoaXMucHJvcGVydHlOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdSZWNvcmQgPSBhd2FpdCB0aGlzLnNldHRpbmdzVG9SYXdSZWNvcmQodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuXG4gICAgICBpZiAoIWlzRGVlcEVxdWFsKG5ld1JlY29yZCwgZGF0YSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtMb2FkZWRGcm9tRmlsZSgpO1xuICAgICAgYXdhaXQgdGhpcy5hc3luY0V2ZW50cy50cmlnZ2VyQXN5bmMoJ2xvYWRTZXR0aW5ncycsIHRoaXMuY3VycmVudFN0YXRlIGFzIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sIGlzSW5pdGlhbExvYWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyBvZmY8XG4gICAgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgIEFyZ3VtZW50cyBleHRlbmRzIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPiA/IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPltFdmVudE5hbWVdXG4gICAgICA6IHVua25vd25bXVxuICA+KG5hbWU6IEV2ZW50TmFtZSwgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLmFzeW5jRXZlbnRzLm9mZihuYW1lLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5hc3luY0V2ZW50cy5vZmZyZWYoZXZlbnRSZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJndW1lbnQgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50cyNvbn0gKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqL1xuICBwdWJsaWMgb248XG4gICAgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgIEFyZ3VtZW50cyBleHRlbmRzIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPiA/IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPltFdmVudE5hbWVdXG4gICAgICA6IHVua25vd25bXVxuICA+KG5hbWU6IEV2ZW50TmFtZSwgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sIHRoaXNBcmd1bWVudD86IHVua25vd24pOiBBc3luY0V2ZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5hc3luY0V2ZW50cy5vbihuYW1lLCBjYWxsYmFjaywgdGhpc0FyZ3VtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJndW1lbnQgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50cyNvbn0gKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqL1xuICBwdWJsaWMgb25jZTxcbiAgICBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gICAgQXJndW1lbnRzIGV4dGVuZHMgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+ID8gUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+W0V2ZW50TmFtZV1cbiAgICAgIDogdW5rbm93bltdXG4gID4obmFtZTogRXZlbnROYW1lLCBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPiwgdGhpc0FyZ3VtZW50PzogdW5rbm93bik6IEFzeW5jRXZlbnRSZWYge1xuICAgIHJldHVybiB0aGlzLmFzeW5jRXZlbnRzLm9uY2UobmFtZSwgY2FsbGJhY2ssIHRoaXNBcmd1bWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGV4dGVybmFsIHNldHRpbmdzIGNoYW5nZS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgcmVsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHNldHRpbmdzIGZyb20gZmlsZSBhbmQgcmVnaXN0ZXJzIGV2ZW50IGhhbmRsZXJzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9ubG9hZEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCB0aGlzLm9uKCdsb2FkU2V0dGluZ3MnLCB0aGlzLm9uTG9hZFNldHRpbmdzLmJpbmQodGhpcykpKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgdGhpcy5vbignc2F2ZVNldHRpbmdzJywgKG5ld1N0YXRlLCBvbGRTdGF0ZSwgY29udGV4dCkgPT4gdGhpcy5vblNhdmVTZXR0aW5ncyh7IGNvbnRleHQsIG5ld1N0YXRlLCBvbGRTdGF0ZSB9KSkpO1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCB0aGlzLnBsdWdpbkV2ZW50U291cmNlLm9uKCdleHRlcm5hbFNldHRpbmdzQ2hhbmdlJywgdGhpcy5vbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UuYmluZCh0aGlzKSkpO1xuICAgIGF3YWl0IHRoaXMubG9hZEZyb21GaWxlKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGxlZ2FjeSBzZXR0aW5ncyBjb252ZXJ0ZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gTGVnYWN5U2V0dGluZ3MgLSBUaGUgbGVnYWN5IHNldHRpbmdzIGNsYXNzLlxuICAgKiBAcGFyYW0gbGVnYWN5U2V0dGluZ3NDbGFzcyAtIFRoZSBsZWdhY3kgc2V0dGluZ3MgY2xhc3MuXG4gICAqIEBwYXJhbSBjb252ZXJ0ZXIgLSBUaGUgY29udmVydGVyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyTGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXI8TGVnYWN5U2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+KFxuICAgIGxlZ2FjeVNldHRpbmdzQ2xhc3M6IG5ldyAoKSA9PiBMZWdhY3lTZXR0aW5ncyxcbiAgICBjb252ZXJ0ZXI6IChsZWdhY3lTZXR0aW5nczogUGFydGlhbDxMZWdhY3lTZXR0aW5ncz4gJiBQYXJ0aWFsPFBsdWdpblNldHRpbmdzPikgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0aGlzV3JhcHBlciA9IFZhbHVlV3JhcHBlci5vZih0aGlzKTtcbiAgICB0aGlzLmxlZ2FjeVNldHRpbmdzQ29udmVydGVycy5wdXNoKGxlZ2FjeVNldHRpbmdzQ29udmVydGVyKTtcblxuICAgIGZ1bmN0aW9uIGxlZ2FjeVNldHRpbmdzQ29udmVydGVyKHJlY29yZDogR2VuZXJpY09iamVjdCk6IHZvaWQge1xuICAgICAgY29uc3QgbGVnYWN5U2V0dGluZ3NLZXlzID0gbmV3IFNldDxzdHJpbmc+KE9iamVjdC5rZXlzKG5ldyBsZWdhY3lTZXR0aW5nc0NsYXNzKCkpKTtcbiAgICAgIGNvbnN0IHBsdWdpblNldHRpbmdLZXlzID0gbmV3IFNldDxzdHJpbmc+KHRoaXNXcmFwcGVyLnZhbHVlLnByb3BlcnR5TmFtZXMpO1xuICAgICAgY29uc3QgbGVnYWN5U2V0dGluZ3MgPSByZWNvcmQgYXMgUGFydGlhbDxMZWdhY3lTZXR0aW5ncz4gJiBQYXJ0aWFsPFBsdWdpblNldHRpbmdzPjtcbiAgICAgIGNvbnZlcnRlcihsZWdhY3lTZXR0aW5ncyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhsZWdhY3lTZXR0aW5ncykpIHtcbiAgICAgICAgaWYgKHBsdWdpblNldHRpbmdLZXlzLmhhcyhrZXkpIHx8ICFsZWdhY3lTZXR0aW5nc0tleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIHJlY29yZFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YWxpZGF0b3IgZm9yIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNldHRpbmdzIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIHZhbGlkYXRvci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclZhbGlkYXRvcjxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsaWRhdG9yOiBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHlOYW1lPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KHByb3BlcnR5TmFtZSwgdmFsaWRhdG9yIGFzIFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzPik7XG4gIH1cblxuICAvKipcbiAgICogUmV2YWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZhbGlkYXRlKCk6IFByb21pc2U8UmVjb3JkPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+PiB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcbiAgICBhd2FpdCB0aGlzLmVkaXQobm9vcCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgbmV3IHBsdWdpbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgY29udGV4dCBvZiB0aGUgc2F2ZSB0byBmaWxlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZVRvRmlsZShjb250ZXh0PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG4gICAgaWYgKGlzRGVlcEVxdWFsKHRoaXMubGFzdFNhdmVkU3RhdGUuaW5wdXRWYWx1ZXMsIHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZUltcGwoKTtcbiAgICBhd2FpdCB0aGlzLmFzeW5jRXZlbnRzLnRyaWdnZXJBc3luYyhcbiAgICAgICdzYXZlU2V0dGluZ3MnLFxuICAgICAgdGhpcy5jdXJyZW50U3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSBhd2FpdCB0aGlzLmNsb25lU3RhdGUodGhpcy5jdXJyZW50U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0UHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5lbnN1cmVMb2FkZWQoKTtcbiAgICBhd2FpdCB0aGlzLmVkaXQoKHNldHRpbmdzKSA9PiB7XG4gICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlc1twcm9wZXJ0eU5hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWRhdGlvbiByZXN1bHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PFBsdWdpblNldHRpbmdzPj4ge1xuICAgIGNvbnN0IHJlc3VsdDogVmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHZhbGlkYXRvcl0gb2YgdGhpcy52YWxpZGF0b3JzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZSA9IGF3YWl0IHZhbGlkYXRvcihzZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCBzZXR0aW5ncyk7XG4gICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIHRoZSBzZXR0aW5ncyBoYXZlIGJlZW4gcmVhZCBmcm9tIGBkYXRhLmpzb25gIGF0IGxlYXN0IG9uY2UuXG4gICAqXG4gICAqIEFueXRoaW5nIHRoYXQgcmVhZHMgYSBzZXR0aW5nIGZyb20gb3V0c2lkZSB0aGlzIGNvbXBvbmVudCBoYXMgdG8gd2FpdCBmb3IgdGhpcywgYmVjYXVzZSB1bnRpbCB0aGUgZmlyc3RcbiAgICoge0BsaW5rIGxvYWRGcm9tRmlsZX0gY29tcGxldGVzIHtAbGluayBzZXR0aW5nc30gc3RpbGwgaG9sZHMgdGhlIERFRkFVTFRTIOKAlCByZWFkaW5nIGl0IGVhcmxpZXIgYW5zd2Vyc1xuICAgKiB3aXRoIGEgZGVmYXVsdCByYXRoZXIgdGhhbiB3aXRoIHdoYXQgdGhlIHVzZXIgYWN0dWFsbHkgc3RvcmVkLiBUaGF0IHdpbmRvdyBpcyBlYXN5IHRvIG1pc3MsIHNpbmNlIGl0IGlzXG4gICAqIGVtcHR5IG9uIGEgY29sZCBzdGFydCAodGhlIHdvcmtzcGFjZSBsYXlvdXQgaXMgbm90IHJlYWR5IHlldCwgc28gbm90aGluZyBoYXMgcnVuKSBidXQgd2lkZSBvcGVuIG9uIGFcbiAgICogcnVudGltZSBlbmFibGUgZnJvbSB0aGUgQ29tbXVuaXR5IFBsdWdpbnMgdGFiIG9yIGEgcmUtZW5hYmxlIGFmdGVyIGFuIHVwZGF0ZSwgd2hlcmUgYSBsYXlvdXQtcmVhZHlcbiAgICogaGFuZGxlciBmaXJlcyBpbW1lZGlhdGVseSB3aGlsZSB0aGlzIGNvbXBvbmVudCdzIG93biBhc3luYyBsb2FkIGlzIHN0aWxsIGluIGZsaWdodC5cbiAgICpcbiAgICogUmVzb2x2ZXMgaW1tZWRpYXRlbHkgb25jZSB0aGUgc2V0dGluZ3MgaGF2ZSBsb2FkZWQsIHNvIGEgY2FsbGVyIHRoYXQgYXJyaXZlcyBsYXRlIGlzIG5vdCBzdHJhbmRlZFxuICAgKiB3YWl0aW5nIGZvciBhbiBldmVudCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmFpc2VkLiBMYXRlciByZWxvYWRzIChhbiBleHRlcm5hbCBgZGF0YS5qc29uYCBjaGFuZ2UpIGRvXG4gICAqIG5vdCByZXNldCBpdCDigJQgdGhlIHF1ZXN0aW9uIGl0IGFuc3dlcnMgaXMgd2hldGhlciB0aGUgc2V0dGluZ3MgaGF2ZSBFVkVSIGJlZW4gcmVhZCwgbm90IHdoZXRoZXIgdGhlXG4gICAqIG1vc3QgcmVjZW50IHJlYWQgaGFzIGZpbmlzaGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHNldHRpbmdzIGhhdmUgYmVlbiBsb2FkZWQgZnJvbSB0aGUgZmlsZS5cbiAgICovXG4gIHB1YmxpYyB3aGVuTG9hZGVkRnJvbUZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkZWRGcm9tRmlsZVxuICAgICAgPyBub29wQXN5bmMoKVxuICAgICAgOiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlZEZyb21GaWxlUmVzb2x2ZXJzLnB1c2gocmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm1lci5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFRyYW5zZm9ybWVyKCk6IFRyYW5zZm9ybWVyIHtcbiAgICByZXR1cm4gZGVmYXVsdFRyYW5zZm9ybWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgcmVjb3JkIGlzIGxvYWRlZCBmcm9tIGRpc2suXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcmVjb3JkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uTG9hZFJlY29yZChyZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmxlZ2FjeVNldHRpbmdzQ29udmVydGVycykge1xuICAgICAgY29udmVydGVyKHJlY29yZCk7XG4gICAgfVxuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHNldHRpbmdzIGFyZSBsb2FkZWQgb3IgcmVsb2FkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBfbG9hZGVkU3RhdGUgLSBUaGUgbG9hZGVkIHNldHRpbmdzIHN0YXRlLlxuICAgKiBAcGFyYW0gX2lzSW5pdGlhbExvYWQgLSBXaGV0aGVyIHRoaXMgaXMgdGhlIGluaXRpYWwgbG9hZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkxvYWRTZXR0aW5ncyhcbiAgICBfbG9hZGVkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgX2lzSW5pdGlhbExvYWQ6IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25TYXZlU2V0dGluZ3MocGFyYW1zOiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0OiBfY29udGV4dCxcbiAgICAgIG5ld1N0YXRlOiBfbmV3U3RhdGUsXG4gICAgICBvbGRTdGF0ZTogX29sZFN0YXRlXG4gICAgfSA9IHBhcmFtcztcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIHJlY29yZCBpcyBhYm91dCB0byBiZSBzYXZlZCB0byBkaXNrLlxuICAgKlxuICAgKiBAcGFyYW0gX3JlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25TYXZpbmdSZWNvcmQoX3JlY29yZDogR2VuZXJpY09iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlcnMuXG4gICAqIE92ZXJyaWRlIHRvIHJlZ2lzdGVyIGxlZ2FjeSBzZXR0aW5ncyBjb252ZXJ0ZXJzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyTGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzKCk6IHZvaWQge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIHZhbGlkYXRvcnMuXG4gICAqIE92ZXJyaWRlIHRvIHJlZ2lzdGVyIHZhbGlkYXRvcnMgZm9yIHByb3BlcnRpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJWYWxpZGF0b3JzKCk6IHZvaWQge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xvbmVTZXR0aW5ncyhzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgdGhpcy5zZXR0aW5nc1RvUmF3UmVjb3JkKHNldHRpbmdzKTtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocmVjb3JkKTtcbiAgICBjb25zdCBjbG9uZVJlY29yZCA9IEpTT04ucGFyc2UoanNvbikgYXMgR2VuZXJpY09iamVjdDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yYXdSZWNvcmRUb1NldHRpbmdzKGNsb25lUmVjb3JkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xvbmVTdGF0ZShcbiAgICBzdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPj4ge1xuICAgIHJldHVybiB7XG4gICAgICBlZmZlY3RpdmVWYWx1ZXM6IGF3YWl0IHRoaXMuY2xvbmVTZXR0aW5ncyhzdGF0ZS5lZmZlY3RpdmVWYWx1ZXMpLFxuICAgICAgaW5wdXRWYWx1ZXM6IGF3YWl0IHRoaXMuY2xvbmVTZXR0aW5ncyhzdGF0ZS5pbnB1dFZhbHVlcyksXG4gICAgICB2YWxpZGF0aW9uTWVzc2FnZXM6IHsgLi4uc3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0U3RhdGUoKTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB7XG4gICAgICBlZmZlY3RpdmVWYWx1ZXM6IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKSxcbiAgICAgIGlucHV0VmFsdWVzOiBuZXcgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzKCksXG4gICAgICB2YWxpZGF0aW9uTWVzc2FnZXM6IGNhc3RUbzxSZWNvcmQ8UHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4+KHt9KVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVkaXQoc2V0dGluZ3NFZGl0b3I6IChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpID0+IFByb21pc2FibGU8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dGluZ3NFZGl0b3IodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcyk7XG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiB0aGlzLnByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0aW9uUmVzdWx0W3Byb3BlcnR5TmFtZV0gPz8gJyc7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmVmZmVjdGl2ZVZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2VcbiAgICAgICAgICA/IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV1cbiAgICAgICAgICA6IHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkUHJvcGVydHlOYW1lKHByb3BlcnR5OiB1bmtub3duKTogcHJvcGVydHkgaXMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0eXBlb2YgcHJvcGVydHkgPT09ICdzdHJpbmcnICYmICh0aGlzLnByb3BlcnR5TmFtZXMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0xvYWRlZEZyb21GaWxlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNMb2FkZWRGcm9tRmlsZSA9IHRydWU7XG4gICAgLy8gRHJhaW5lZCByYXRoZXIgdGhhbiBpdGVyYXRlZCwgc28gdGhlIGxpc3QgZG9lcyBub3Qga2VlcCBldmVyeSBwYXN0IHdhaXRlciBhbGl2ZSBhY3Jvc3MgcmVsb2Fkcy5cbiAgICBjb25zdCByZXNvbHZlcnMgPSB0aGlzLmxvYWRlZEZyb21GaWxlUmVzb2x2ZXJzLnNwbGljZSgwKTtcbiAgICBmb3IgKGNvbnN0IHJlc29sdmUgb2YgcmVzb2x2ZXJzKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByYXdSZWNvcmRUb1NldHRpbmdzKHJhd1JlY29yZDogR2VuZXJpY09iamVjdCk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByYXdSZWNvcmQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmF3UmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLm9uTG9hZFJlY29yZChyYXdSZWNvcmQpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzKCk7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcblxuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhd1JlY29yZCkpIHtcbiAgICAgIGlmICghdGhpcy5pc1ZhbGlkUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlOnJhd1JlY29yZFRvU2V0dGluZ3MnKShgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBKU09OIGNhbm5vdCBob2xkIGB1bmRlZmluZWRgLCBzbyBvbmx5IGEgbGVnYWN5IGNvbnZlcnRlciBwcm9kdWNlcyBpdC4gS2VlcCB0aGUgZGVmYXVsdCByYXRoZXIgdGhhblxuICAgICAgLy8gbGV0dGluZyBhIGNvbnZlcnRlciB0aGF0IGFzc2lnbmVkIGEga2V5IGl0IGhhZCBub3RoaW5nIGZvciB3aXBlIGl0IG91dC5cbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgZGVmYXVsdHNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U6cmF3UmVjb3JkVG9TZXR0aW5ncycpKFxuICAgICAgICAgICdQb3NzaWJsZSBpbnZhbGlkIHZhbHVlIHR5cGUuIEl0IG1pZ2h0IGxlYWQgdG8gYW4gdW5leHBlY3RlZCBiZWhhdmlvciBvZiB0aGUgcGx1Z2luLiBUaGVyZSBpcyBhbHNvIGEgY2hhbmNlIGl0IGlzIGEgZmFsc2UtbmVnYXRpdmUgd2FybmluZywgYXMgd2UgYXJlIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGV4YWN0IHR5cGUgb2YgdGhlIHZhbHVlIGluIHJ1bnRpbWUuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV0sXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IHZhbHVlIGFzIFByb3BlcnR5VmFsdWVzPFBsdWdpblNldHRpbmdzPjtcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0dGluZ3M7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVUb0ZpbGVJbXBsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGF0YUhhbmRsZXIuc2F2ZURhdGEoYXdhaXQgdGhpcy5zZXR0aW5nc1RvUmF3UmVjb3JkKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKSk7XG4gIH1cblxuICBwcml2YXRlIHNldFByb3BlcnR5SW1wbChwYXJhbXM6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZVNldFByb3BlcnR5SW1wbFBhcmFtczxQbHVnaW5TZXR0aW5ncz4pOiB2b2lkIHtcbiAgICBjb25zdCB7XG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICB2YWxpZGF0aW9uTWVzc2FnZSxcbiAgICAgIHZhbHVlXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlID8/ICcnO1xuICAgIHRoaXMuY3VycmVudFN0YXRlLmVmZmVjdGl2ZVZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2UgPyBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHRpbmdzVG9SYXdSZWNvcmQoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxHZW5lcmljT2JqZWN0PiB7XG4gICAgY29uc3QgcmF3UmVjb3JkOiBHZW5lcmljT2JqZWN0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiB0aGlzLnByb3BlcnR5TmFtZXMpIHtcbiAgICAgIHJhd1JlY29yZFtwcm9wZXJ0eU5hbWVdID0gc2V0dGluZ3NbcHJvcGVydHlOYW1lXTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9uU2F2aW5nUmVjb3JkKHJhd1JlY29yZCk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJhd1JlY29yZCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQkEsU0FBUyxtQkFBbUI7QUFDNUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHNDQUFzQztBQUMvQyxTQUFTLDRCQUE0QjtBQUNyQyxTQUFTLG9CQUFvQjtBQUs3QixTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLG1CQUFtQjtBQUU1QixNQUFNLHFCQUFxQixJQUFJLGlCQUFpQjtBQUFB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