obsidian-dev-utils 36.0.0 → 36.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/lib/cjs/AbortController.cjs +1 -1
  3. package/dist/lib/cjs/Array.cjs +1 -1
  4. package/dist/lib/cjs/Async.cjs +2 -2
  5. package/dist/lib/cjs/Async.d.cts +3 -3
  6. package/dist/lib/cjs/AsyncEvents.cjs +2 -2
  7. package/dist/lib/cjs/AsyncEvents.d.cts +4 -4
  8. package/dist/lib/cjs/Blob.cjs +1 -1
  9. package/dist/lib/cjs/CssClass.cjs +2 -2
  10. package/dist/lib/cjs/CssClass.d.cts +35 -35
  11. package/dist/lib/cjs/Debug.cjs +2 -2
  12. package/dist/lib/cjs/DebugController.cjs +1 -1
  13. package/dist/lib/cjs/Enum.cjs +1 -1
  14. package/dist/lib/cjs/Error.cjs +2 -2
  15. package/dist/lib/cjs/Error.d.cts +1 -1
  16. package/dist/lib/cjs/Function.cjs +1 -1
  17. package/dist/lib/cjs/HTMLElement.cjs +2 -2
  18. package/dist/lib/cjs/HTMLElement.d.cts +1 -1
  19. package/dist/lib/cjs/Library.cjs +3 -3
  20. package/dist/lib/cjs/Library.d.cts +3 -3
  21. package/dist/lib/cjs/ObjectUtils.cjs +2 -2
  22. package/dist/lib/cjs/Path.cjs +2 -2
  23. package/dist/lib/cjs/Path.d.cts +2 -2
  24. package/dist/lib/cjs/RegExp.cjs +2 -2
  25. package/dist/lib/cjs/RegExp.d.cts +3 -3
  26. package/dist/lib/cjs/ScriptUtils/CliUtils.cjs +2 -2
  27. package/dist/lib/cjs/ScriptUtils/CodeGenerator.cjs +1 -1
  28. package/dist/lib/cjs/ScriptUtils/ESLint/ESLint.cjs +1 -1
  29. package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.cjs +2 -2
  30. package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.d.cts +1 -1
  31. package/dist/lib/cjs/ScriptUtils/ESLint/index.cjs +1 -1
  32. package/dist/lib/cjs/ScriptUtils/Exec.cjs +2 -2
  33. package/dist/lib/cjs/ScriptUtils/Exec.d.cts +8 -8
  34. package/dist/lib/cjs/ScriptUtils/Fs.cjs +1 -1
  35. package/dist/lib/cjs/ScriptUtils/JSON.cjs +1 -1
  36. package/dist/lib/cjs/ScriptUtils/NodeModules.cjs +1 -1
  37. package/dist/lib/cjs/ScriptUtils/Npm.cjs +2 -2
  38. package/dist/lib/cjs/ScriptUtils/Npm.d.cts +4 -4
  39. package/dist/lib/cjs/ScriptUtils/NpmPublish.cjs +1 -1
  40. package/dist/lib/cjs/ScriptUtils/NpmRun.cjs +1 -1
  41. package/dist/lib/cjs/ScriptUtils/ObsidianDevUtilsRepoPaths.cjs +2 -2
  42. package/dist/lib/cjs/ScriptUtils/ObsidianDevUtilsRepoPaths.d.cts +1 -1
  43. package/dist/lib/cjs/ScriptUtils/Root.cjs +1 -1
  44. package/dist/lib/cjs/ScriptUtils/build.cjs +1 -1
  45. package/dist/lib/cjs/ScriptUtils/cli.cjs +2 -2
  46. package/dist/lib/cjs/ScriptUtils/esbuild/Dependency.cjs +1 -1
  47. package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.cjs +2 -2
  48. package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.d.cts +3 -3
  49. package/dist/lib/cjs/ScriptUtils/esbuild/changeExtensionPlugin.cjs +1 -1
  50. package/dist/lib/cjs/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.cjs +1 -1
  51. package/dist/lib/cjs/ScriptUtils/esbuild/customEsbuildOptionsPlugin.cjs +1 -1
  52. package/dist/lib/cjs/ScriptUtils/esbuild/fixEsmPlugin.cjs +1 -1
  53. package/dist/lib/cjs/ScriptUtils/esbuild/fixSourceMapsPlugin.cjs +2 -2
  54. package/dist/lib/cjs/ScriptUtils/esbuild/fixSourceMapsPlugin.d.cts +1 -1
  55. package/dist/lib/cjs/ScriptUtils/esbuild/index.cjs +1 -1
  56. package/dist/lib/cjs/ScriptUtils/esbuild/preprocessPlugin.cjs +12 -6
  57. package/dist/lib/cjs/ScriptUtils/esbuild/preprocessPlugin.d.cts +0 -3
  58. package/dist/lib/cjs/ScriptUtils/esbuild/renameCssPlugin.cjs +1 -1
  59. package/dist/lib/cjs/ScriptUtils/esbuild/svelteWrapperPlugin.cjs +1 -1
  60. package/dist/lib/cjs/ScriptUtils/format.cjs +1 -1
  61. package/dist/lib/cjs/ScriptUtils/index.cjs +1 -1
  62. package/dist/lib/cjs/ScriptUtils/spellcheck.cjs +2 -2
  63. package/dist/lib/cjs/ScriptUtils/spellcheck.d.cts +1 -1
  64. package/dist/lib/cjs/ScriptUtils/version.cjs +2 -2
  65. package/dist/lib/cjs/ScriptUtils/version.d.cts +3 -8
  66. package/dist/lib/cjs/String.cjs +2 -2
  67. package/dist/lib/cjs/String.d.cts +5 -5
  68. package/dist/lib/cjs/Transformers/DateTransformer.cjs +3 -3
  69. package/dist/lib/cjs/Transformers/DateTransformer.d.cts +1 -1
  70. package/dist/lib/cjs/Transformers/DurationTransformer.cjs +4 -4
  71. package/dist/lib/cjs/Transformers/DurationTransformer.d.cts +2 -2
  72. package/dist/lib/cjs/Transformers/GroupTransformer.cjs +4 -4
  73. package/dist/lib/cjs/Transformers/GroupTransformer.d.cts +2 -2
  74. package/dist/lib/cjs/Transformers/MapTransformer.cjs +3 -3
  75. package/dist/lib/cjs/Transformers/MapTransformer.d.cts +1 -1
  76. package/dist/lib/cjs/Transformers/SetTransformer.cjs +3 -3
  77. package/dist/lib/cjs/Transformers/SetTransformer.d.cts +1 -1
  78. package/dist/lib/cjs/Transformers/SkipPrivatePropertyTransformer.cjs +3 -3
  79. package/dist/lib/cjs/Transformers/SkipPrivatePropertyTransformer.d.cts +1 -1
  80. package/dist/lib/cjs/Transformers/Transformer.cjs +2 -2
  81. package/dist/lib/cjs/Transformers/Transformer.d.cts +1 -1
  82. package/dist/lib/cjs/Transformers/TwoWayMapTransformer.cjs +1 -1
  83. package/dist/lib/cjs/Transformers/TypedTransformer.cjs +1 -1
  84. package/dist/lib/cjs/Transformers/index.cjs +1 -1
  85. package/dist/lib/cjs/TwoWayMap.cjs +1 -1
  86. package/dist/lib/cjs/Type.cjs +2 -2
  87. package/dist/lib/cjs/Type.d.cts +1 -1
  88. package/dist/lib/cjs/ValueProvider.cjs +2 -2
  89. package/dist/lib/cjs/codemirror/StateFieldSpec.cjs +2 -2
  90. package/dist/lib/cjs/codemirror/StateFieldSpec.d.cts +2 -2
  91. package/dist/lib/cjs/codemirror/index.cjs +1 -1
  92. package/dist/lib/cjs/index.cjs +1 -1
  93. package/dist/lib/cjs/obsidian/App.cjs +1 -1
  94. package/dist/lib/cjs/obsidian/AttachmentPath.cjs +1 -1
  95. package/dist/lib/cjs/obsidian/Backlink.cjs +2 -2
  96. package/dist/lib/cjs/obsidian/Backlink.d.cts +5 -5
  97. package/dist/lib/cjs/obsidian/Callout.cjs +2 -2
  98. package/dist/lib/cjs/obsidian/Callout.d.cts +5 -5
  99. package/dist/lib/cjs/obsidian/CodeBlockMarkdownInformation.cjs +2 -2
  100. package/dist/lib/cjs/obsidian/CodeBlockMarkdownInformation.d.cts +9 -9
  101. package/dist/lib/cjs/obsidian/Components/AsyncEventsComponent.cjs +1 -1
  102. package/dist/lib/cjs/obsidian/Components/SettingComponents/CheckboxComponent.cjs +4 -4
  103. package/dist/lib/cjs/obsidian/Components/SettingComponents/CheckboxComponent.d.cts +2 -2
  104. package/dist/lib/cjs/obsidian/Components/SettingComponents/CodeHighlighterComponent.cjs +3 -3
  105. package/dist/lib/cjs/obsidian/Components/SettingComponents/CodeHighlighterComponent.d.cts +1 -1
  106. package/dist/lib/cjs/obsidian/Components/SettingComponents/DateComponent.cjs +1 -1
  107. package/dist/lib/cjs/obsidian/Components/SettingComponents/DateTimeComponent.cjs +1 -1
  108. package/dist/lib/cjs/obsidian/Components/SettingComponents/EmailComponent.cjs +1 -1
  109. package/dist/lib/cjs/obsidian/Components/SettingComponents/FileComponent.cjs +1 -1
  110. package/dist/lib/cjs/obsidian/Components/SettingComponents/MonthComponent.cjs +2 -2
  111. package/dist/lib/cjs/obsidian/Components/SettingComponents/MonthComponent.d.cts +2 -2
  112. package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleDropdownComponent.cjs +4 -4
  113. package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleDropdownComponent.d.cts +2 -2
  114. package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleEmailComponent.cjs +1 -1
  115. package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleFileComponent.cjs +1 -1
  116. package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleTextComponent.cjs +3 -3
  117. package/dist/lib/cjs/obsidian/Components/SettingComponents/MultipleTextComponent.d.cts +1 -1
  118. package/dist/lib/cjs/obsidian/Components/SettingComponents/NumberComponent.cjs +1 -1
  119. package/dist/lib/cjs/obsidian/Components/SettingComponents/PasswordComponent.cjs +1 -1
  120. package/dist/lib/cjs/obsidian/Components/SettingComponents/SettingComponentWrapper.cjs +1 -1
  121. package/dist/lib/cjs/obsidian/Components/SettingComponents/TelephoneComponent.cjs +1 -1
  122. package/dist/lib/cjs/obsidian/Components/SettingComponents/TextBasedComponent.cjs +1 -1
  123. package/dist/lib/cjs/obsidian/Components/SettingComponents/TimeComponent.cjs +1 -1
  124. package/dist/lib/cjs/obsidian/Components/SettingComponents/TriStateCheckboxComponent.cjs +4 -4
  125. package/dist/lib/cjs/obsidian/Components/SettingComponents/TriStateCheckboxComponent.d.cts +2 -2
  126. package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedDropdownComponent.cjs +4 -4
  127. package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedDropdownComponent.d.cts +2 -2
  128. package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedMultipleDropdownComponent.cjs +4 -4
  129. package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedMultipleDropdownComponent.d.cts +2 -2
  130. package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedRangeTextComponent.cjs +1 -1
  131. package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedTextComponent.cjs +4 -4
  132. package/dist/lib/cjs/obsidian/Components/SettingComponents/TypedTextComponent.d.cts +2 -2
  133. package/dist/lib/cjs/obsidian/Components/SettingComponents/UrlComponent.cjs +1 -1
  134. package/dist/lib/cjs/obsidian/Components/SettingComponents/ValidatorComponent.cjs +2 -2
  135. package/dist/lib/cjs/obsidian/Components/SettingComponents/ValidatorComponent.d.cts +1 -1
  136. package/dist/lib/cjs/obsidian/Components/SettingComponents/ValueComponentWithChangeTracking.cjs +1 -1
  137. package/dist/lib/cjs/obsidian/Components/SettingComponents/WeekComponent.cjs +2 -2
  138. package/dist/lib/cjs/obsidian/Components/SettingComponents/WeekComponent.d.cts +2 -2
  139. package/dist/lib/cjs/obsidian/Components/SettingComponents/index.cjs +1 -1
  140. package/dist/lib/cjs/obsidian/Components/index.cjs +1 -1
  141. package/dist/lib/cjs/obsidian/Dataview.cjs +3 -4
  142. package/dist/lib/cjs/obsidian/Dataview.d.cts +16 -16
  143. package/dist/lib/cjs/obsidian/DataviewLink.cjs +1 -1
  144. package/dist/lib/cjs/obsidian/FileChange.cjs +2 -2
  145. package/dist/lib/cjs/obsidian/FileChange.d.cts +3 -3
  146. package/dist/lib/cjs/obsidian/FileManager.cjs +1 -1
  147. package/dist/lib/cjs/obsidian/FileSystem.cjs +2 -2
  148. package/dist/lib/cjs/obsidian/FileSystem.d.cts +1 -1
  149. package/dist/lib/cjs/obsidian/Frontmatter.cjs +2 -2
  150. package/dist/lib/cjs/obsidian/Frontmatter.d.cts +4 -4
  151. package/dist/lib/cjs/obsidian/FrontmatterLinkCacheWithOffsets.cjs +2 -2
  152. package/dist/lib/cjs/obsidian/FrontmatterLinkCacheWithOffsets.d.cts +2 -2
  153. package/dist/lib/cjs/obsidian/Link.cjs +2 -2
  154. package/dist/lib/cjs/obsidian/Link.d.cts +44 -43
  155. package/dist/lib/cjs/obsidian/Logger.cjs +2 -2
  156. package/dist/lib/cjs/obsidian/Loop.cjs +2 -2
  157. package/dist/lib/cjs/obsidian/Loop.d.cts +12 -6
  158. package/dist/lib/cjs/obsidian/Markdown.cjs +1 -1
  159. package/dist/lib/cjs/obsidian/MarkdownCodeBlockProcessor.cjs +9 -3
  160. package/dist/lib/cjs/obsidian/MarkdownCodeBlockProcessor.d.cts +9 -9
  161. package/dist/lib/cjs/obsidian/MarkdownView.cjs +1 -1
  162. package/dist/lib/cjs/obsidian/MetadataCache.cjs +4 -16
  163. package/dist/lib/cjs/obsidian/Modals/Alert.cjs +2 -2
  164. package/dist/lib/cjs/obsidian/Modals/Alert.d.cts +6 -6
  165. package/dist/lib/cjs/obsidian/Modals/Confirm.cjs +2 -2
  166. package/dist/lib/cjs/obsidian/Modals/Confirm.d.cts +7 -7
  167. package/dist/lib/cjs/obsidian/Modals/ModalBase.cjs +2 -2
  168. package/dist/lib/cjs/obsidian/Modals/ModalBase.d.cts +3 -3
  169. package/dist/lib/cjs/obsidian/Modals/Prompt.cjs +2 -2
  170. package/dist/lib/cjs/obsidian/Modals/Prompt.d.cts +7 -7
  171. package/dist/lib/cjs/obsidian/Modals/SelectItem.cjs +2 -2
  172. package/dist/lib/cjs/obsidian/Modals/SelectItem.d.cts +7 -7
  173. package/dist/lib/cjs/obsidian/Modals/index.cjs +1 -1
  174. package/dist/lib/cjs/obsidian/MonkeyAround.cjs +2 -2
  175. package/dist/lib/cjs/obsidian/MonkeyAround.d.cts +3 -3
  176. package/dist/lib/cjs/obsidian/ObsidianSettings.cjs +1 -1
  177. package/dist/lib/cjs/obsidian/Pdf.cjs +1 -1
  178. package/dist/lib/cjs/obsidian/Plugin/ObsidianPluginRepoPaths.cjs +1 -1
  179. package/dist/lib/cjs/obsidian/Plugin/Plugin.cjs +1 -1
  180. package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +1 -1
  181. package/dist/lib/cjs/obsidian/Plugin/PluginContext.cjs +1 -1
  182. package/dist/lib/cjs/obsidian/Plugin/PluginId.cjs +2 -2
  183. package/dist/lib/cjs/obsidian/Plugin/PluginId.d.cts +1 -1
  184. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs +1 -1
  185. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +3 -3
  186. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.d.cts +4 -4
  187. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsWrapper.cjs +2 -2
  188. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsWrapper.d.cts +3 -3
  189. package/dist/lib/cjs/obsidian/Plugin/PluginTypesBase.cjs +2 -2
  190. package/dist/lib/cjs/obsidian/Plugin/PluginTypesBase.d.cts +6 -6
  191. package/dist/lib/cjs/obsidian/Plugin/index.cjs +1 -1
  192. package/dist/lib/cjs/obsidian/Queue.cjs +1 -1
  193. package/dist/lib/cjs/obsidian/React/AppContext.cjs +2 -2
  194. package/dist/lib/cjs/obsidian/React/AppContext.d.cts +2 -2
  195. package/dist/lib/cjs/obsidian/React/index.cjs +1 -1
  196. package/dist/lib/cjs/obsidian/Reference.cjs +2 -2
  197. package/dist/lib/cjs/obsidian/Reference.d.cts +5 -5
  198. package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +2 -2
  199. package/dist/lib/cjs/obsidian/RenameDeleteHandler.d.cts +2 -2
  200. package/dist/lib/cjs/obsidian/ResourceUrl.cjs +1 -1
  201. package/dist/lib/cjs/obsidian/SettingEx.cjs +1 -1
  202. package/dist/lib/cjs/obsidian/Validation.cjs +2 -2
  203. package/dist/lib/cjs/obsidian/Validation.d.cts +1 -1
  204. package/dist/lib/cjs/obsidian/Vault.cjs +18 -4
  205. package/dist/lib/cjs/obsidian/Vault.d.cts +8 -0
  206. package/dist/lib/cjs/obsidian/VaultEx.cjs +1 -1
  207. package/dist/lib/cjs/obsidian/index.cjs +1 -1
  208. package/dist/lib/cjs/url.cjs +1 -1
  209. package/dist/lib/esm/AbortController.mjs +1 -1
  210. package/dist/lib/esm/Array.mjs +1 -1
  211. package/dist/lib/esm/Async.d.mts +3 -3
  212. package/dist/lib/esm/Async.mjs +2 -2
  213. package/dist/lib/esm/AsyncEvents.d.mts +4 -4
  214. package/dist/lib/esm/AsyncEvents.mjs +2 -2
  215. package/dist/lib/esm/Blob.mjs +1 -1
  216. package/dist/lib/esm/CssClass.d.mts +35 -35
  217. package/dist/lib/esm/CssClass.mjs +2 -2
  218. package/dist/lib/esm/Debug.mjs +2 -2
  219. package/dist/lib/esm/DebugController.mjs +1 -1
  220. package/dist/lib/esm/Enum.mjs +1 -1
  221. package/dist/lib/esm/Error.d.mts +1 -1
  222. package/dist/lib/esm/Error.mjs +2 -2
  223. package/dist/lib/esm/Function.mjs +1 -1
  224. package/dist/lib/esm/HTMLElement.d.mts +1 -1
  225. package/dist/lib/esm/HTMLElement.mjs +2 -2
  226. package/dist/lib/esm/Library.d.mts +3 -3
  227. package/dist/lib/esm/Library.mjs +3 -3
  228. package/dist/lib/esm/ObjectUtils.mjs +2 -2
  229. package/dist/lib/esm/Path.d.mts +2 -2
  230. package/dist/lib/esm/Path.mjs +2 -2
  231. package/dist/lib/esm/RegExp.d.mts +3 -3
  232. package/dist/lib/esm/RegExp.mjs +2 -2
  233. package/dist/lib/esm/ScriptUtils/CliUtils.mjs +2 -2
  234. package/dist/lib/esm/ScriptUtils/CodeGenerator.mjs +1 -1
  235. package/dist/lib/esm/ScriptUtils/ESLint/ESLint.mjs +1 -1
  236. package/dist/lib/esm/ScriptUtils/ESLint/eslint.config.d.mts +1 -1
  237. package/dist/lib/esm/ScriptUtils/ESLint/eslint.config.mjs +2 -2
  238. package/dist/lib/esm/ScriptUtils/ESLint/index.mjs +1 -1
  239. package/dist/lib/esm/ScriptUtils/Exec.d.mts +8 -8
  240. package/dist/lib/esm/ScriptUtils/Exec.mjs +2 -2
  241. package/dist/lib/esm/ScriptUtils/Fs.mjs +1 -1
  242. package/dist/lib/esm/ScriptUtils/JSON.mjs +1 -1
  243. package/dist/lib/esm/ScriptUtils/NodeModules.mjs +1 -1
  244. package/dist/lib/esm/ScriptUtils/Npm.d.mts +4 -4
  245. package/dist/lib/esm/ScriptUtils/Npm.mjs +2 -2
  246. package/dist/lib/esm/ScriptUtils/NpmPublish.mjs +1 -1
  247. package/dist/lib/esm/ScriptUtils/NpmRun.mjs +1 -1
  248. package/dist/lib/esm/ScriptUtils/ObsidianDevUtilsRepoPaths.d.mts +1 -1
  249. package/dist/lib/esm/ScriptUtils/ObsidianDevUtilsRepoPaths.mjs +2 -2
  250. package/dist/lib/esm/ScriptUtils/Root.mjs +1 -1
  251. package/dist/lib/esm/ScriptUtils/build.mjs +1 -1
  252. package/dist/lib/esm/ScriptUtils/cli.mjs +2 -2
  253. package/dist/lib/esm/ScriptUtils/esbuild/Dependency.mjs +1 -1
  254. package/dist/lib/esm/ScriptUtils/esbuild/ObsidianPluginBuilder.d.mts +3 -3
  255. package/dist/lib/esm/ScriptUtils/esbuild/ObsidianPluginBuilder.mjs +2 -2
  256. package/dist/lib/esm/ScriptUtils/esbuild/changeExtensionPlugin.mjs +1 -1
  257. package/dist/lib/esm/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.mjs +1 -1
  258. package/dist/lib/esm/ScriptUtils/esbuild/customEsbuildOptionsPlugin.mjs +1 -1
  259. package/dist/lib/esm/ScriptUtils/esbuild/fixEsmPlugin.mjs +1 -1
  260. package/dist/lib/esm/ScriptUtils/esbuild/fixSourceMapsPlugin.d.mts +1 -1
  261. package/dist/lib/esm/ScriptUtils/esbuild/fixSourceMapsPlugin.mjs +2 -2
  262. package/dist/lib/esm/ScriptUtils/esbuild/index.mjs +1 -1
  263. package/dist/lib/esm/ScriptUtils/esbuild/preprocessPlugin.d.mts +0 -3
  264. package/dist/lib/esm/ScriptUtils/esbuild/preprocessPlugin.mjs +12 -6
  265. package/dist/lib/esm/ScriptUtils/esbuild/renameCssPlugin.mjs +1 -1
  266. package/dist/lib/esm/ScriptUtils/esbuild/svelteWrapperPlugin.mjs +1 -1
  267. package/dist/lib/esm/ScriptUtils/format.mjs +1 -1
  268. package/dist/lib/esm/ScriptUtils/index.mjs +1 -1
  269. package/dist/lib/esm/ScriptUtils/spellcheck.d.mts +1 -1
  270. package/dist/lib/esm/ScriptUtils/spellcheck.mjs +2 -2
  271. package/dist/lib/esm/ScriptUtils/version.d.mts +3 -8
  272. package/dist/lib/esm/ScriptUtils/version.mjs +2 -2
  273. package/dist/lib/esm/String.d.mts +5 -5
  274. package/dist/lib/esm/String.mjs +2 -2
  275. package/dist/lib/esm/Transformers/DateTransformer.d.mts +1 -1
  276. package/dist/lib/esm/Transformers/DateTransformer.mjs +3 -3
  277. package/dist/lib/esm/Transformers/DurationTransformer.d.mts +2 -2
  278. package/dist/lib/esm/Transformers/DurationTransformer.mjs +4 -4
  279. package/dist/lib/esm/Transformers/GroupTransformer.d.mts +2 -2
  280. package/dist/lib/esm/Transformers/GroupTransformer.mjs +4 -4
  281. package/dist/lib/esm/Transformers/MapTransformer.d.mts +1 -1
  282. package/dist/lib/esm/Transformers/MapTransformer.mjs +3 -3
  283. package/dist/lib/esm/Transformers/SetTransformer.d.mts +1 -1
  284. package/dist/lib/esm/Transformers/SetTransformer.mjs +3 -3
  285. package/dist/lib/esm/Transformers/SkipPrivatePropertyTransformer.d.mts +1 -1
  286. package/dist/lib/esm/Transformers/SkipPrivatePropertyTransformer.mjs +3 -3
  287. package/dist/lib/esm/Transformers/Transformer.d.mts +1 -1
  288. package/dist/lib/esm/Transformers/Transformer.mjs +2 -2
  289. package/dist/lib/esm/Transformers/TwoWayMapTransformer.mjs +1 -1
  290. package/dist/lib/esm/Transformers/TypedTransformer.mjs +1 -1
  291. package/dist/lib/esm/Transformers/index.mjs +1 -1
  292. package/dist/lib/esm/TwoWayMap.mjs +1 -1
  293. package/dist/lib/esm/Type.d.mts +1 -1
  294. package/dist/lib/esm/Type.mjs +2 -2
  295. package/dist/lib/esm/ValueProvider.mjs +2 -2
  296. package/dist/lib/esm/codemirror/StateFieldSpec.d.mts +2 -2
  297. package/dist/lib/esm/codemirror/StateFieldSpec.mjs +1 -1
  298. package/dist/lib/esm/codemirror/index.mjs +1 -1
  299. package/dist/lib/esm/index.mjs +1 -1
  300. package/dist/lib/esm/obsidian/App.mjs +1 -1
  301. package/dist/lib/esm/obsidian/AttachmentPath.mjs +1 -1
  302. package/dist/lib/esm/obsidian/Backlink.d.mts +5 -5
  303. package/dist/lib/esm/obsidian/Backlink.mjs +2 -2
  304. package/dist/lib/esm/obsidian/Callout.d.mts +5 -5
  305. package/dist/lib/esm/obsidian/Callout.mjs +2 -2
  306. package/dist/lib/esm/obsidian/CodeBlockMarkdownInformation.d.mts +9 -9
  307. package/dist/lib/esm/obsidian/CodeBlockMarkdownInformation.mjs +1 -1
  308. package/dist/lib/esm/obsidian/Components/AsyncEventsComponent.mjs +1 -1
  309. package/dist/lib/esm/obsidian/Components/SettingComponents/CheckboxComponent.d.mts +2 -2
  310. package/dist/lib/esm/obsidian/Components/SettingComponents/CheckboxComponent.mjs +4 -4
  311. package/dist/lib/esm/obsidian/Components/SettingComponents/CodeHighlighterComponent.d.mts +1 -1
  312. package/dist/lib/esm/obsidian/Components/SettingComponents/CodeHighlighterComponent.mjs +3 -3
  313. package/dist/lib/esm/obsidian/Components/SettingComponents/DateComponent.mjs +1 -1
  314. package/dist/lib/esm/obsidian/Components/SettingComponents/DateTimeComponent.mjs +1 -1
  315. package/dist/lib/esm/obsidian/Components/SettingComponents/EmailComponent.mjs +1 -1
  316. package/dist/lib/esm/obsidian/Components/SettingComponents/FileComponent.mjs +1 -1
  317. package/dist/lib/esm/obsidian/Components/SettingComponents/MonthComponent.d.mts +2 -2
  318. package/dist/lib/esm/obsidian/Components/SettingComponents/MonthComponent.mjs +2 -2
  319. package/dist/lib/esm/obsidian/Components/SettingComponents/MultipleDropdownComponent.d.mts +2 -2
  320. package/dist/lib/esm/obsidian/Components/SettingComponents/MultipleDropdownComponent.mjs +4 -4
  321. package/dist/lib/esm/obsidian/Components/SettingComponents/MultipleEmailComponent.mjs +1 -1
  322. package/dist/lib/esm/obsidian/Components/SettingComponents/MultipleFileComponent.mjs +1 -1
  323. package/dist/lib/esm/obsidian/Components/SettingComponents/MultipleTextComponent.d.mts +1 -1
  324. package/dist/lib/esm/obsidian/Components/SettingComponents/MultipleTextComponent.mjs +3 -3
  325. package/dist/lib/esm/obsidian/Components/SettingComponents/NumberComponent.mjs +1 -1
  326. package/dist/lib/esm/obsidian/Components/SettingComponents/PasswordComponent.mjs +1 -1
  327. package/dist/lib/esm/obsidian/Components/SettingComponents/SettingComponentWrapper.mjs +1 -1
  328. package/dist/lib/esm/obsidian/Components/SettingComponents/TelephoneComponent.mjs +1 -1
  329. package/dist/lib/esm/obsidian/Components/SettingComponents/TextBasedComponent.mjs +1 -1
  330. package/dist/lib/esm/obsidian/Components/SettingComponents/TimeComponent.mjs +1 -1
  331. package/dist/lib/esm/obsidian/Components/SettingComponents/TriStateCheckboxComponent.d.mts +2 -2
  332. package/dist/lib/esm/obsidian/Components/SettingComponents/TriStateCheckboxComponent.mjs +4 -4
  333. package/dist/lib/esm/obsidian/Components/SettingComponents/TypedDropdownComponent.d.mts +2 -2
  334. package/dist/lib/esm/obsidian/Components/SettingComponents/TypedDropdownComponent.mjs +4 -4
  335. package/dist/lib/esm/obsidian/Components/SettingComponents/TypedMultipleDropdownComponent.d.mts +2 -2
  336. package/dist/lib/esm/obsidian/Components/SettingComponents/TypedMultipleDropdownComponent.mjs +4 -4
  337. package/dist/lib/esm/obsidian/Components/SettingComponents/TypedRangeTextComponent.mjs +1 -1
  338. package/dist/lib/esm/obsidian/Components/SettingComponents/TypedTextComponent.d.mts +2 -2
  339. package/dist/lib/esm/obsidian/Components/SettingComponents/TypedTextComponent.mjs +4 -4
  340. package/dist/lib/esm/obsidian/Components/SettingComponents/UrlComponent.mjs +1 -1
  341. package/dist/lib/esm/obsidian/Components/SettingComponents/ValidatorComponent.d.mts +1 -1
  342. package/dist/lib/esm/obsidian/Components/SettingComponents/ValidatorComponent.mjs +2 -2
  343. package/dist/lib/esm/obsidian/Components/SettingComponents/ValueComponentWithChangeTracking.mjs +1 -1
  344. package/dist/lib/esm/obsidian/Components/SettingComponents/WeekComponent.d.mts +2 -2
  345. package/dist/lib/esm/obsidian/Components/SettingComponents/WeekComponent.mjs +2 -2
  346. package/dist/lib/esm/obsidian/Components/SettingComponents/index.mjs +1 -1
  347. package/dist/lib/esm/obsidian/Components/index.mjs +1 -1
  348. package/dist/lib/esm/obsidian/Dataview.d.mts +16 -16
  349. package/dist/lib/esm/obsidian/Dataview.mjs +3 -4
  350. package/dist/lib/esm/obsidian/DataviewLink.mjs +1 -1
  351. package/dist/lib/esm/obsidian/FileChange.d.mts +3 -3
  352. package/dist/lib/esm/obsidian/FileChange.mjs +2 -2
  353. package/dist/lib/esm/obsidian/FileManager.mjs +1 -1
  354. package/dist/lib/esm/obsidian/FileSystem.d.mts +1 -1
  355. package/dist/lib/esm/obsidian/FileSystem.mjs +2 -2
  356. package/dist/lib/esm/obsidian/Frontmatter.d.mts +4 -4
  357. package/dist/lib/esm/obsidian/Frontmatter.mjs +2 -2
  358. package/dist/lib/esm/obsidian/FrontmatterLinkCacheWithOffsets.d.mts +2 -2
  359. package/dist/lib/esm/obsidian/FrontmatterLinkCacheWithOffsets.mjs +2 -2
  360. package/dist/lib/esm/obsidian/Link.d.mts +44 -43
  361. package/dist/lib/esm/obsidian/Link.mjs +2 -2
  362. package/dist/lib/esm/obsidian/Logger.mjs +2 -2
  363. package/dist/lib/esm/obsidian/Loop.d.mts +12 -6
  364. package/dist/lib/esm/obsidian/Loop.mjs +2 -2
  365. package/dist/lib/esm/obsidian/Markdown.mjs +1 -1
  366. package/dist/lib/esm/obsidian/MarkdownCodeBlockProcessor.d.mts +9 -9
  367. package/dist/lib/esm/obsidian/MarkdownCodeBlockProcessor.mjs +13 -4
  368. package/dist/lib/esm/obsidian/MarkdownView.mjs +1 -1
  369. package/dist/lib/esm/obsidian/MetadataCache.mjs +8 -20
  370. package/dist/lib/esm/obsidian/Modals/Alert.d.mts +6 -6
  371. package/dist/lib/esm/obsidian/Modals/Alert.mjs +2 -2
  372. package/dist/lib/esm/obsidian/Modals/Confirm.d.mts +7 -7
  373. package/dist/lib/esm/obsidian/Modals/Confirm.mjs +2 -2
  374. package/dist/lib/esm/obsidian/Modals/ModalBase.d.mts +3 -3
  375. package/dist/lib/esm/obsidian/Modals/ModalBase.mjs +2 -2
  376. package/dist/lib/esm/obsidian/Modals/Prompt.d.mts +7 -7
  377. package/dist/lib/esm/obsidian/Modals/Prompt.mjs +2 -2
  378. package/dist/lib/esm/obsidian/Modals/SelectItem.d.mts +7 -7
  379. package/dist/lib/esm/obsidian/Modals/SelectItem.mjs +2 -2
  380. package/dist/lib/esm/obsidian/Modals/index.mjs +1 -1
  381. package/dist/lib/esm/obsidian/MonkeyAround.d.mts +3 -3
  382. package/dist/lib/esm/obsidian/MonkeyAround.mjs +2 -2
  383. package/dist/lib/esm/obsidian/ObsidianSettings.mjs +1 -1
  384. package/dist/lib/esm/obsidian/Pdf.mjs +1 -1
  385. package/dist/lib/esm/obsidian/Plugin/ObsidianPluginRepoPaths.mjs +1 -1
  386. package/dist/lib/esm/obsidian/Plugin/Plugin.mjs +1 -1
  387. package/dist/lib/esm/obsidian/Plugin/PluginBase.mjs +1 -1
  388. package/dist/lib/esm/obsidian/Plugin/PluginContext.mjs +1 -1
  389. package/dist/lib/esm/obsidian/Plugin/PluginId.d.mts +1 -1
  390. package/dist/lib/esm/obsidian/Plugin/PluginId.mjs +2 -2
  391. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +1 -1
  392. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.d.mts +4 -4
  393. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +3 -3
  394. package/dist/lib/esm/obsidian/Plugin/PluginSettingsWrapper.d.mts +3 -3
  395. package/dist/lib/esm/obsidian/Plugin/PluginSettingsWrapper.mjs +1 -1
  396. package/dist/lib/esm/obsidian/Plugin/PluginTypesBase.d.mts +6 -6
  397. package/dist/lib/esm/obsidian/Plugin/PluginTypesBase.mjs +1 -1
  398. package/dist/lib/esm/obsidian/Plugin/index.mjs +1 -1
  399. package/dist/lib/esm/obsidian/Queue.mjs +1 -1
  400. package/dist/lib/esm/obsidian/React/AppContext.d.mts +2 -2
  401. package/dist/lib/esm/obsidian/React/AppContext.mjs +2 -2
  402. package/dist/lib/esm/obsidian/React/index.mjs +1 -1
  403. package/dist/lib/esm/obsidian/Reference.d.mts +5 -5
  404. package/dist/lib/esm/obsidian/Reference.mjs +2 -2
  405. package/dist/lib/esm/obsidian/RenameDeleteHandler.d.mts +2 -2
  406. package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +2 -2
  407. package/dist/lib/esm/obsidian/ResourceUrl.mjs +1 -1
  408. package/dist/lib/esm/obsidian/SettingEx.mjs +1 -1
  409. package/dist/lib/esm/obsidian/Validation.d.mts +1 -1
  410. package/dist/lib/esm/obsidian/Validation.mjs +2 -2
  411. package/dist/lib/esm/obsidian/Vault.d.mts +8 -0
  412. package/dist/lib/esm/obsidian/Vault.mjs +21 -4
  413. package/dist/lib/esm/obsidian/VaultEx.mjs +1 -1
  414. package/dist/lib/esm/obsidian/index.mjs +1 -1
  415. package/dist/lib/esm/url.mjs +1 -1
  416. package/package.json +1 -1
@@ -3,7 +3,6 @@
3
3
  *
4
4
  * This module provides utilities for handling and updating links within Obsidian vaults. It includes
5
5
  * functions to split paths, update links in files, and generate markdown links with various options.
6
- * The functions integrate with Obsidian's API to ensure that links are managed correctly within the vault.
7
6
  */
8
7
  import type { App, CachedMetadata, Reference, TFile } from 'obsidian';
9
8
  import type { Promisable } from 'type-fest';
@@ -15,19 +14,19 @@ import type { ProcessOptions } from './Vault.mjs';
15
14
  */
16
15
  export interface ConvertLinkOptions {
17
16
  /**
18
- * The Obsidian app instance.
17
+ * An Obsidian app instance.
19
18
  */
20
19
  app: App;
21
20
  /**
22
- * The reference for the link.
21
+ * A reference for the link.
23
22
  */
24
23
  link: Reference;
25
24
  /**
26
- * The source file containing the link.
25
+ * A source file containing the link.
27
26
  */
28
27
  newSourcePathOrFile: PathOrFile;
29
28
  /**
30
- * The old path of the link.
29
+ * An old path of the link.
31
30
  */
32
31
  oldSourcePathOrFile?: PathOrFile;
33
32
  /**
@@ -44,20 +43,22 @@ export interface ConvertLinkOptions {
44
43
  */
45
44
  export interface GenerateMarkdownLinkDefaultOptionsWrapper {
46
45
  /**
47
- * The default options for generating markdown links.
46
+ * A default options for generating markdown links.
47
+ *
48
+ * @returns A default options for generating markdown links.
48
49
  */
49
- defaultOptionsFn: () => Partial<GenerateMarkdownLinkOptions>;
50
+ defaultOptionsFn(): Partial<GenerateMarkdownLinkOptions>;
50
51
  }
51
52
  /**
52
53
  * Options for generating a markdown link.
53
54
  */
54
55
  export interface GenerateMarkdownLinkOptions {
55
56
  /**
56
- * The alias for the link.
57
+ * An alias for the link.
57
58
  */
58
59
  alias?: string;
59
60
  /**
60
- * The Obsidian app instance.
61
+ * An Obsidian app instance.
61
62
  */
62
63
  app: App;
63
64
  /**
@@ -77,7 +78,7 @@ export interface GenerateMarkdownLinkOptions {
77
78
  */
78
79
  isWikilink?: boolean;
79
80
  /**
80
- * The original link text. If provided, it will be used to infer the values of `isEmbed`, `isWikilink`, `useLeadingDot`, and `useAngleBrackets`.
81
+ * An original link text. If provided, it will be used to infer the values of `isEmbed`, `isWikilink`, `useLeadingDot`, and `useAngleBrackets`.
81
82
  * These inferred values will be overridden by corresponding settings if specified.
82
83
  */
83
84
  originalLink?: string;
@@ -98,32 +99,32 @@ export interface GenerateMarkdownLinkOptions {
98
99
  */
99
100
  shouldUseLeadingDot?: boolean;
100
101
  /**
101
- * The source path of the link.
102
+ * A source path of the link.
102
103
  */
103
104
  sourcePathOrFile: PathOrFile;
104
105
  /**
105
- * The subpath of the link.
106
+ * A subpath of the link.
106
107
  */
107
108
  subpath?: string;
108
109
  /**
109
- * The target path or file.
110
+ * A target path or file.
110
111
  */
111
112
  targetPathOrFile: PathOrFile;
112
113
  }
113
114
  /**
114
- * The result of parsing a link.
115
+ * A result of parsing a link.
115
116
  */
116
117
  export interface ParseLinkResult {
117
118
  /**
118
- * The alias of the link.
119
+ * An alias of the link.
119
120
  */
120
121
  alias?: string;
121
122
  /**
122
- * The encoded URL of the link.
123
+ * An encoded URL of the link.
123
124
  */
124
125
  encodedUrl?: string;
125
126
  /**
126
- * The end offset of the link in the original text.
127
+ * An end offset of the link in the original text.
127
128
  */
128
129
  endOffset: number;
129
130
  /**
@@ -143,19 +144,19 @@ export interface ParseLinkResult {
143
144
  */
144
145
  isWikilink: boolean;
145
146
  /**
146
- * The raw link text.
147
+ * A raw link text.
147
148
  */
148
149
  raw: string;
149
150
  /**
150
- * The start offset of the link in the original text.
151
+ * A start offset of the link in the original text.
151
152
  */
152
153
  startOffset: number;
153
154
  /**
154
- * The title of the link.
155
+ * A title of the link.
155
156
  */
156
157
  title?: string;
157
158
  /**
158
- * The URL of the link.
159
+ * An URL of the link.
159
160
  */
160
161
  url: string;
161
162
  }
@@ -164,11 +165,11 @@ export interface ParseLinkResult {
164
165
  */
165
166
  export interface ShouldResetAliasOptions {
166
167
  /**
167
- * The Obsidian app instance.
168
+ * An Obsidian app instance.
168
169
  */
169
170
  app: App;
170
171
  /**
171
- * The display text of the link.
172
+ * A display text of the link.
172
173
  */
173
174
  displayText: string | undefined;
174
175
  /**
@@ -176,19 +177,19 @@ export interface ShouldResetAliasOptions {
176
177
  */
177
178
  isWikilink?: boolean;
178
179
  /**
179
- * The source path of the link.
180
+ * A source path of the link.
180
181
  */
181
182
  newSourcePathOrFile: PathOrFile;
182
183
  /**
183
- * The old source file containing the link.
184
+ * An old source file containing the link.
184
185
  */
185
186
  oldSourcePathOrFile?: PathOrFile;
186
187
  /**
187
- * The old target path of the link.
188
+ * An old target path of the link.
188
189
  */
189
190
  oldTargetPath: PathOrFile;
190
191
  /**
191
- * The target path or file.
192
+ * A target path or file.
192
193
  */
193
194
  targetPathOrFile: PathOrFile;
194
195
  }
@@ -197,11 +198,11 @@ export interface ShouldResetAliasOptions {
197
198
  */
198
199
  export interface SplitSubpathResult {
199
200
  /**
200
- * The link path.
201
+ * A link path.
201
202
  */
202
203
  linkPath: string;
203
204
  /**
204
- * The subpath.
205
+ * A subpath.
205
206
  */
206
207
  subpath: string;
207
208
  }
@@ -210,27 +211,27 @@ export interface SplitSubpathResult {
210
211
  */
211
212
  export interface UpdateLinkOptions {
212
213
  /**
213
- * The Obsidian app instance.
214
+ * An Obsidian app instance.
214
215
  */
215
216
  app: App;
216
217
  /**
217
- * The reference for the link.
218
+ * A reference for the link.
218
219
  */
219
220
  link: Reference;
220
221
  /**
221
- * The source file containing the link.
222
+ * A source file containing the link.
222
223
  */
223
224
  newSourcePathOrFile: PathOrFile;
224
225
  /**
225
- * The file associated with the link.
226
+ * A file associated with the link.
226
227
  */
227
228
  newTargetPathOrFile: PathOrFile;
228
229
  /**
229
- * The old source file containing the link.
230
+ * An old source file containing the link.
230
231
  */
231
232
  oldSourcePathOrFile?: PathOrFile;
232
233
  /**
233
- * The old path of the file.
234
+ * An old path of the file.
234
235
  */
235
236
  oldTargetPathOrFile?: PathOrFile;
236
237
  /**
@@ -247,15 +248,15 @@ export interface UpdateLinkOptions {
247
248
  */
248
249
  export interface UpdateLinksInFileOptions extends ProcessOptions {
249
250
  /**
250
- * The obsidian app instance.
251
+ * An Obsidian app instance.
251
252
  */
252
253
  app: App;
253
254
  /**
254
- * The file to update the links in.
255
+ * A file to update the links in.
255
256
  */
256
257
  newSourcePathOrFile: PathOrFile;
257
258
  /**
258
- * The old path of the file.
259
+ * An old path of the file.
259
260
  */
260
261
  oldSourcePathOrFile?: PathOrFile;
261
262
  /**
@@ -272,23 +273,23 @@ export interface UpdateLinksInFileOptions extends ProcessOptions {
272
273
  shouldUpdateFileNameAlias?: boolean;
273
274
  }
274
275
  /**
275
- * The options for updating the links in a content string.
276
+ * Options for updating the links in a content string.
276
277
  */
277
278
  interface UpdateLinksInContentOptions {
278
279
  /**
279
- * The Obsidian application instance.
280
+ * An Obsidian app instance.
280
281
  */
281
282
  app: App;
282
283
  /**
283
- * The content to update the links in.
284
+ * A content to update the links in.
284
285
  */
285
286
  content: string;
286
287
  /**
287
- * The new source path or file.
288
+ * A new source path or file.
288
289
  */
289
290
  newSourcePathOrFile: PathOrFile;
290
291
  /**
291
- * The old source path or file.
292
+ * An old source path or file.
292
293
  */
293
294
  oldSourcePathOrFile?: PathOrFile;
294
295
  /**
@@ -3,7 +3,7 @@ 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
5
 
6
- (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
6
+ (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd(){return"/"},env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
8
  import {
9
9
  normalizePath,
@@ -602,4 +602,4 @@ export {
602
602
  updateLinksInContent,
603
603
  updateLinksInFile
604
604
  };
605
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBoYW5kbGluZyBhbmQgdXBkYXRpbmcgbGlua3Mgd2l0aGluIE9ic2lkaWFuIHZhdWx0cy4gSXQgaW5jbHVkZXNcbiAqIGZ1bmN0aW9ucyB0byBzcGxpdCBwYXRocywgdXBkYXRlIGxpbmtzIGluIGZpbGVzLCBhbmQgZ2VuZXJhdGUgbWFya2Rvd24gbGlua3Mgd2l0aCB2YXJpb3VzIG9wdGlvbnMuXG4gKiBUaGUgZnVuY3Rpb25zIGludGVncmF0ZSB3aXRoIE9ic2lkaWFuJ3MgQVBJIHRvIGVuc3VyZSB0aGF0IGxpbmtzIGFyZSBtYW5hZ2VkIGNvcnJlY3RseSB3aXRoaW4gdGhlIHZhdWx0LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgTGluayxcbiAgVGV4dFxufSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gJ3VuaXN0JztcblxuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyBJbnRlcm5hbFBsdWdpbk5hbWUgfSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vT2JqZWN0VXRpbHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVJldHVybiB9IGZyb20gJy4uL1R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlQ2hhbmdlIH0gZnJvbSAnLi9GaWxlQ2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICcuLi9BYm9ydENvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnLi4vT2JqZWN0VXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL1BhdGgudHMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplLFxuICByZXBsYWNlQWxsXG59IGZyb20gJy4uL1N0cmluZy50cyc7XG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uL3VybC50cyc7XG5pbXBvcnQge1xuICBhcHBseUNvbnRlbnRDaGFuZ2VzLFxuICBhcHBseUZpbGVDaGFuZ2VzLFxuICBpc0NhbnZhc0NoYW5nZSxcbiAgaXNDb250ZW50Q2hhbmdlXG59IGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICB0cmltTWFya2Rvd25FeHRlbnNpb25cbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0Q2FjaGVTYWZlLFxuICBwYXJzZU1ldGFkYXRhLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1blxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgc2hvdWxkVXNlUmVsYXRpdmVMaW5rcyxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vT2JzaWRpYW5TZXR0aW5ncy50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9SZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSAnXFxcXHwnO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBsaW5rIHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG5jb25zdCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAgPSAvW1xcXFxcXHgwMFxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGIF0vZztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbWFya2Rvd24gbGluayBzeW1ib2xzLlxuICovXG5jb25zdCBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWCA9IC9bXFxcXFtcXF08Pl8qfj1gJF0vZztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHVuZXNjYXBlZCBwaXBlcy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/PCFcXFxcKVxcfC9nO1xuXG5jb25zdCBXSUtJTElOS19ESVZJREVSID0gJ3wnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnZlcnRpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBXcmFwcGVyIGZvciBkZWZhdWx0IG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgbWFya2Rvd24gbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0T3B0aW9uc1dyYXBwZXIge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIGRlZmF1bHRPcHRpb25zRm46ICgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBnZW5lcmF0aW5nIGEgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKi9cbiAgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuIElmIGBmYWxzZWAgYW5kIGBwYXRoT3JGaWxlYCBpcyBhIG5vbi1leGlzdGluZyBmaWxlLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgbGluayB0ZXh0LiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2YgYGlzRW1iZWRgLCBgaXNXaWtpbGlua2AsIGB1c2VMZWFkaW5nRG90YCwgYW5kIGB1c2VBbmdsZUJyYWNrZXRzYC5cbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSByZWxhdGl2ZS4gSWYgbm90IHByb3ZpZGVkIG9yIGBmYWxzZWAsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy4gSGFzIG5vIGVmZmVjdCBpZiBgYWxsb3dFbXB0eUVtYmVkQWxpYXNgIGlzIGB0cnVlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuIERlZmF1bHRzIHRvIGBmYWxzZWAuIEhhcyBubyBlZmZlY3QgaWYgYGlzV2lraWxpbmtgIGlzIGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuIERlZmF1bHRzIHRvIGBmYWxzZWAuIEhhcyBubyBlZmZlY3QgaWYgYGlzV2lraWxpbmtgIGlzIGB0cnVlYCBvciBgaXNSZWxhdGl2ZWAgaXMgYGZhbHNlYC5cbiAgICovXG4gIHNob3VsZFVzZUxlYWRpbmdEb3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHN1YnBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuY29kZWQgVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgZW5jb2RlZFVybD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGhhcyBhbmdsZSBicmFja2V0cy5cbiAgICovXG4gIGhhc0FuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICovXG4gIGlzRXh0ZXJuYWw6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHJhdyBsaW5rIHRleHQuXG4gICAqL1xuICByYXc6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgb3JpZ2luYWwgdGV4dC5cbiAgICovXG4gIHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHRpdGxlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBvZiBhIGxpbmsgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3VsZFJlc2V0QWxpYXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgbGluayBwYXRoLlxuICAgKi9cbiAgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN1YnBhdGguXG4gICAqL1xuICBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdXBkYXRpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIG9sZFRhcmdldFBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgc2hvdWxkRm9yY2VNYXJrZG93bkxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB1cGRhdGluZyBsaW5rcyBpbiBhIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua3NJbkZpbGVPcHRpb25zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgdGhlIGxpbmtzIHRvIGJlIGluIE1hcmtkb3duIGZvcm1hdC5cbiAgICovXG4gIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMaW5rQ29uZmlnIHtcbiAgaXNFbWJlZDogYm9vbGVhbjtcbiAgaXNXaWtpbGluazogYm9vbGVhbjtcbiAgc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGg6IGJvb2xlYW47XG4gIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHNob3VsZFVzZUxlYWRpbmdEb3Q6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBUYWJsZVBvc2l0aW9uIHtcbiAgZW5kOiBudW1iZXI7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICovXG5pbnRlcmZhY2UgVXBkYXRlTGlua3NJbkNvbnRlbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlIGV4dGVuZHMgTm9kZSB7XG4gIGRhdGE6IHtcbiAgICBhbGlhczogc3RyaW5nO1xuICB9O1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGluayB0byBhIG5ldyBwYXRoLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGNvbnZlcnRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TGluayhvcHRpb25zOiBDb252ZXJ0TGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRGaWxlID0gZXh0cmFjdExpbmtGaWxlKG9wdGlvbnMuYXBwLCBvcHRpb25zLmxpbmssIG9wdGlvbnMub2xkU291cmNlUGF0aE9yRmlsZSA/PyBvcHRpb25zLm5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBpZiAoIXRhcmdldEZpbGUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5saW5rLm9yaWdpbmFsO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtPcHRpb25zPih7XG4gICAgYXBwOiBvcHRpb25zLmFwcCxcbiAgICBsaW5rOiBvcHRpb25zLmxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZTogb3B0aW9ucy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZTogb3B0aW9ucy5vbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rczogb3B0aW9ucy5zaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogb3B0aW9ucy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gKiBAcGFyYW0gbGlua0NvbnZlcnRlciAtIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAqIEBwYXJhbSBwcm9jZXNzT3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgZm9yIHJldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIHByb2Nlc3NPcHRpb25zOiBQcm9jZXNzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwLCBwYXRoT3JGaWxlLCBwcm9jZXNzT3B0aW9ucyk7XG4gIGZvciAoY29uc3QgYmFja2xpbmtOb3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgY3VycmVudExpbmtzID0gYmFja2xpbmtzLmdldChiYWNrbGlua05vdGVQYXRoKSA/PyBbXTtcbiAgICBjb25zdCBsaW5rSnNvbnMgPSBuZXcgU2V0PHN0cmluZz4oY3VycmVudExpbmtzLm1hcCgobGluaykgPT4gdG9Kc29uKGxpbmspKSk7XG4gICAgYXdhaXQgZWRpdExpbmtzKGFwcCwgYmFja2xpbmtOb3RlUGF0aCwgKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGxpbmtKc29uID0gdG9Kc29uKGxpbmspO1xuICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgIH0sIHByb2Nlc3NPcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGlzQ2FudmFzRmlsZShhcHAsIHBhdGhPckZpbGUpLCBsaW5rQ29udmVydGVyKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQoXG4gIGFwcDogQXBwLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsICcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGZhbHNlLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG5ld0NvbnRlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuICB9XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBlbmNvZGUuXG4gKiBAcmV0dXJucyBUaGUgZW5jb2RlZCBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbCh1cmwsIFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCwgKHsgc3Vic3RyaW5nOiBzcGVjaWFsTGlua1N5bWJvbCB9KSA9PiBlbmNvZGVVUklDb21wb25lbnQoc3BlY2lhbExpbmtTeW1ib2wpKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSAtIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaW5rRmlsZShhcHA6IEFwcCwgbGluazogUmVmZXJlbmNlLCBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSA9IGZhbHNlKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rUGF0aCwgc291cmNlUGF0aCk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBpZiAoIXNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlua1BhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGdldEZpbGUoYXBwLCBsaW5rUGF0aCwgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCBmdWxsTGlua1BhdGggPSBqb2luKGRpcm5hbWUoc291cmNlUGF0aCksIGAuLyR7bGlua1BhdGh9YCk7XG5cbiAgaWYgKGZ1bGxMaW5rUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldEZpbGUoYXBwLCBmdWxsTGlua1BhdGgsIHRydWUpO1xufVxuXG4vKipcbiAqIEZpeGVzIHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbiB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgY2FjaGUuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIG1ldGFkYXRhIGNhY2hlIHRvIGZpeCB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3MgaW4uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyB3ZXJlIGZpeGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzKGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IGJvb2xlYW4ge1xuICByZXR1cm4gX2ZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rcyhjYWNoZS5mcm9udG1hdHRlciwgJycsIGNhY2hlKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGluayhvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcblxuICBjb25zdCBjb25maWd1cmFibGVEZWZhdWx0T3B0aW9uc0ZuID0gKGFwcC5maWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayBhcyBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNXcmFwcGVyPikuZGVmYXVsdE9wdGlvbnNGblxuICAgID8/ICgoKTogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+ID0+ICh7fSkpO1xuICBjb25zdCBjb25maWd1cmFibGVEZWZhdWx0T3B0aW9ucyA9IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4oKTtcblxuICBjb25zdCBERUZBVUxUX09QVElPTlM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBvcHRpb25zID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLmNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH07XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBvcHRpb25zLnRhcmdldFBhdGhPckZpbGUsIG9wdGlvbnMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkKTtcblxuICByZXR1cm4gdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW4oYXBwLCBbdGFyZ2V0RmlsZV0sICgpID0+IGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChvcHRpb25zKSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgbGluayB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGluayhzdHI6IHN0cmluZyk6IG51bGwgfCBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBsaW5rcyA9IHBhcnNlTGlua3Moc3RyKTtcbiAgcmV0dXJuIGxpbmtzWzBdPy5yYXcgPT09IHN0ciA/IGxpbmtzWzBdIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYWxsIGxpbmtzIGluIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmtzKHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0W10ge1xuICBjb25zdCBlbWJlZFN5bWJvbE9mZnNldHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdCBFTUJFRF9MSU5LX1BSRUZJWCA9ICchWyc7XG4gIGNvbnN0IE5PX0VNQkVEX0xJTktfUFJFRklYID0gJyBbJztcblxuICBjb25zdCBub0VtYmVkU3RyID0gcmVwbGFjZUFsbChzdHIsIEVNQkVEX0xJTktfUFJFRklYLCAoYXJncykgPT4ge1xuICAgIGVtYmVkU3ltYm9sT2Zmc2V0cy5hZGQoYXJncy5vZmZzZXQpO1xuICAgIHJldHVybiBOT19FTUJFRF9MSU5LX1BSRUZJWDtcbiAgfSk7XG5cbiAgY29uc3QgcHJvY2Vzc29yID0gcmVtYXJrKCkudXNlKHJlbWFya1BhcnNlKS51c2Uod2lraUxpbmtQbHVnaW4sIHsgYWxpYXNEaXZpZGVyOiBXSUtJTElOS19ESVZJREVSIH0pO1xuICBjb25zdCByb290ID0gcHJvY2Vzc29yLnBhcnNlKG5vRW1iZWRTdHIpO1xuXG4gIGNvbnN0IGxpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuICBjb25zdCB0ZXh0TGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG5cbiAgdmlzaXQocm9vdCwgKG5vZGU6IE5vZGUpID0+IHtcbiAgICBsZXQgbGluazogUGFyc2VMaW5rUmVzdWx0O1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlTGlua05vZGUobm9kZSBhcyBMaW5rLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dpa2lMaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlV2lraWxpbmtOb2RlKG5vZGUgYXMgV2lraUxpbmtOb2RlLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZW1iZWRTeW1ib2xPZmZzZXRzLmhhcyhsaW5rLnN0YXJ0T2Zmc2V0IC0gMSkpIHtcbiAgICAgIGxpbmsuaXNFbWJlZCA9IHRydWU7XG4gICAgICBsaW5rLnN0YXJ0T2Zmc2V0LS07XG4gICAgICBsaW5rLnJhdyA9IGAhJHtsaW5rLnJhd31gO1xuICAgIH1cbiAgICBsaW5rcy5wdXNoKGxpbmspO1xuICB9KTtcblxuICBsaW5rcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgbGV0IHRleHRTdGFydE9mZnNldCA9IDA7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgZXh0cmFjdFRleHRMaW5rcyhzdHIsIHRleHRTdGFydE9mZnNldCwgbGluay5zdGFydE9mZnNldCAtIDEsIHRleHRMaW5rcyk7XG4gICAgdGV4dFN0YXJ0T2Zmc2V0ID0gbGluay5lbmRPZmZzZXQgKyAxO1xuICB9XG5cbiAgZXh0cmFjdFRleHRMaW5rcyhzdHIsIHRleHRTdGFydE9mZnNldCwgc3RyLmxlbmd0aCAtIDEsIHRleHRMaW5rcyk7XG5cbiAgbGlua3MucHVzaCguLi50ZXh0TGlua3MpO1xuICBsaW5rcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgcmV0dXJuIGxpbmtzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMob3B0aW9uczogU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IG9wdGlvbnM7XG4gIGlmIChpc1dpa2lsaW5rID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgdGFyZ2V0UGF0aE9yRmlsZSwgdHJ1ZSk7XG4gIGNvbnN0IG5ld1NvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgbmV3U291cmNlRm9sZGVyID0gZGlybmFtZShuZXdTb3VyY2VQYXRoKTtcbiAgY29uc3Qgb2xkU291cmNlRm9sZGVyID0gZGlybmFtZShvbGRTb3VyY2VQYXRoKTtcbiAgY29uc3QgYWxpYXNlc1RvUmVzZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHBhdGhPckZpbGUgb2YgW3RhcmdldEZpbGUucGF0aCwgb2xkVGFyZ2V0UGF0aF0pIHtcbiAgICBpZiAoIXBhdGhPckZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHBhdGgpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChiYXNlbmFtZShwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG5ld1NvdXJjZUZvbGRlciwgcGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShvbGRTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBbb2xkU291cmNlUGF0aCwgbmV3U291cmNlUGF0aF0pIHtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcbiAgfVxuXG4gIGNvbnN0IGNsZWFuRGlzcGxheVRleHQgPSByZXBsYWNlQWxsKG5vcm1hbGl6ZVBhdGgoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcpWzBdID8/ICcnKSwgL15cXC5cXC8vZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZShsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW3RpdGxlXSg8bGluaz4pYCwgYCFbdGl0bGVdKDxsaW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RFbWJlZChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ0RvdChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLi8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RXaWtpbGluayhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmsob3B0aW9uczogVXBkYXRlTGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcbiAgaWYgKCFuZXdUYXJnZXRQYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIGxpbmsub3JpZ2luYWw7XG4gIH1cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBuZXdUYXJnZXRQYXRoT3JGaWxlLCB0cnVlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gdGVzdFdpa2lsaW5rKGxpbmsub3JpZ2luYWwpICYmIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyAhPT0gdHJ1ZTtcbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgbGV0IHNob3VsZEtlZXBBbGlhcyA9ICFzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKSkge1xuICAgIGlmIChpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0RmlsZS5wYXRoICsgc3VicGF0aDtcbiAgICB9XG4gIH1cblxuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluaykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rLm9yaWdpbmFsKTtcbiAgICBpZiAocGFyc2VMaW5rUmVzdWx0Py5hbGlhcykge1xuICAgICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgICBzaG91bGRLZWVwQWxpYXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGFsaWFzID8/PSBzaG91bGRSZXNldEFsaWFzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRSZXNldEFsaWFzT3B0aW9ucz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgICBpc1dpa2lsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRUYXJnZXRQYXRoLFxuICAgICAgdGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZVxuICAgIH0pKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBsaW5rLmRpc3BsYXlUZXh0O1xuXG4gIGlmICghc2hvdWxkS2VlcEFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSB0YXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IHRhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXdMaW5rID0gZ2VuZXJhdGVNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucz4oe1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MgPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWwsXG4gICAgc291cmNlUGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGVcbiAgfSkpO1xuICByZXR1cm4gbmV3TGluaztcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCB1cGRhdGVkIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkNvbnRlbnQob3B0aW9uczogVXBkYXRlTGlua3NJbkNvbnRlbnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KGFwcCwgY29udGVudCwgKGxpbmspID0+IHtcbiAgICBjb25zdCBpc0VtYmVkTGluayA9IHRlc3RFbWJlZChsaW5rLm9yaWdpbmFsKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua09wdGlvbnM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUob3B0aW9uczogVXBkYXRlTGlua3NJbkZpbGVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiAhYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGVkaXRMaW5rcyhhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUsIChsaW5rKSA9PiB7XG4gICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtPcHRpb25zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgfSkpO1xuICB9LCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gX2ZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rcyh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcsIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayh2YWx1ZSk7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQgfHwgcGFyc2VMaW5rUmVzdWx0LmlzV2lraWxpbmsgfHwgcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzID8/PSBbXTtcbiAgICBsZXQgbGluayA9IGNhY2hlLmZyb250bWF0dGVyTGlua3MuZmluZCgoZnJvbnRtYXR0ZXJMaW5rKSA9PiBmcm9udG1hdHRlckxpbmsua2V5ID09PSBrZXkpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIGxpbms6ICcnLFxuICAgICAgICBvcmlnaW5hbDogJydcbiAgICAgIH07XG4gICAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgbGluay5saW5rID0gcGFyc2VMaW5rUmVzdWx0LnVybDtcbiAgICBsaW5rLm9yaWdpbmFsID0gdmFsdWU7XG4gICAgaWYgKHBhcnNlTGlua1Jlc3VsdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5rLmRpc3BsYXlUZXh0ID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaGFzRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgIGNvbnN0IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcyA9IF9maXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2hpbGRWYWx1ZSwga2V5ID8gYCR7a2V5fS4ke2NoaWxkS2V5fWAgOiBjaGlsZEtleSwgY2FjaGUpO1xuICAgIGhhc0Zyb250bWF0dGVyTGlua3MgfHw9IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcztcbiAgfVxuXG4gIHJldHVybiBoYXNGcm9udG1hdHRlckxpbmtzO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VGV4dExpbmtzKHN0cjogc3RyaW5nLCBzdGFydE9mZnNldDogbnVtYmVyLCBlbmRPZmZzZXQ6IG51bWJlciwgdGV4dExpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSk6IHZvaWQge1xuICBpZiAoc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ZXh0UGFydCA9IHN0ci5zbGljZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0ICsgMSk7XG4gIHJlcGxhY2VBbGwodGV4dFBhcnQsIC8oPzxVcmw+XFxTKykvZywgKGFyZ3MsIHVybCkgPT4ge1xuICAgIGlmICghaXNVcmwodXJsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRMaW5rcy5wdXNoKHtcbiAgICAgIGVuY29kZWRVcmw6IGVuY29kZVVybCh1cmwpLFxuICAgICAgZW5kT2Zmc2V0OiBzdGFydE9mZnNldCArIGFyZ3Mub2Zmc2V0ICsgdXJsLmxlbmd0aCxcbiAgICAgIGhhc0FuZ2xlQnJhY2tldHM6IGZhbHNlLFxuICAgICAgaXNFbWJlZDogZmFsc2UsXG4gICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgICByYXc6IHVybCxcbiAgICAgIHN0YXJ0T2Zmc2V0OiBzdGFydE9mZnNldCArIGFyZ3Mub2Zmc2V0LFxuICAgICAgdXJsXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUxpbmtUZXh0KGFwcDogQXBwLCB0YXJnZXRGaWxlOiBURmlsZSwgc291cmNlUGF0aDogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcsIGNvbmZpZzogTGlua0NvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChzb3VyY2VQYXRoID09PSAnLycpIHtcbiAgICBzb3VyY2VQYXRoID0gJyc7XG4gIH1cblxuICBsZXQgbGlua1RleHQ6IHN0cmluZztcblxuICBpZiAodGFyZ2V0RmlsZS5wYXRoID09PSBzb3VyY2VQYXRoICYmIHN1YnBhdGgpIHtcbiAgICBsaW5rVGV4dCA9IHN1YnBhdGg7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnNob3VsZEZvcmNlUmVsYXRpdmVQYXRoKSB7XG4gICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCBjb25maWcuaXNXaWtpbGluayA/IHRyaW1NYXJrZG93bkV4dGVuc2lvbihhcHAsIHRhcmdldEZpbGUpIDogdGFyZ2V0RmlsZS5wYXRoKSArIHN1YnBhdGg7XG4gIH0gZWxzZSB7XG4gICAgbGlua1RleHQgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dCh0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBjb25maWcuaXNXaWtpbGluaykgKyBzdWJwYXRoO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zaG91bGRGb3JjZVJlbGF0aXZlUGF0aCAmJiBjb25maWcuc2hvdWxkVXNlTGVhZGluZ0RvdCAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnLicpICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcjJykpIHtcbiAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgfVxuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKG9wdGlvbnM6IEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIG9wdGlvbnMudGFyZ2V0UGF0aE9yRmlsZSwgb3B0aW9ucy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9wdGlvbnMuc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHN1YnBhdGggPSBvcHRpb25zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcob3B0aW9ucywgdGFyZ2V0RmlsZSk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dChhcHAsIHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIHN1YnBhdGgsIGxpbmtDb25maWcpO1xuXG4gIHJldHVybiBsaW5rQ29uZmlnLmlzV2lraWxpbmtcbiAgICA/IGdlbmVyYXRlV2lraUxpbmsobGlua1RleHQsIG9wdGlvbnMuYWxpYXMsIGxpbmtDb25maWcuaXNFbWJlZClcbiAgICA6IGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsobGlua1RleHQsIHRhcmdldEZpbGUsIG9wdGlvbnMsIGxpbmtDb25maWcpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0OiBzdHJpbmcsIHRhcmdldEZpbGU6IFRGaWxlLCBvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMsIGNvbmZpZzogTGlua0NvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbWJlZFByZWZpeCA9IGNvbmZpZy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgY29uc3QgcHJvY2Vzc2VkTGlua1RleHQgPSBjb25maWcuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke2xpbmtUZXh0fT5gXG4gICAgOiBlbmNvZGVVcmwobGlua1RleHQpO1xuXG4gIGxldCBhbGlhcyA9IG9wdGlvbnMuYWxpYXMgPz8gJyc7XG4gIGlmICghYWxpYXMgJiYgKCFjb25maWcuaXNFbWJlZCB8fCAhb3B0aW9ucy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQpKSB7XG4gICAgYWxpYXMgPSAhb3B0aW9ucy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICB9XG5cbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7cHJvY2Vzc2VkTGlua1RleHR9KWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsobGlua1RleHQ6IHN0cmluZywgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCwgaXNFbWJlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGVtYmVkUHJlZml4ID0gaXNFbWJlZCA/ICchJyA6ICcnO1xuICBjb25zdCBub3JtYWxpemVkQWxpYXMgPSBhbGlhcyA/PyAnJztcblxuICBpZiAobm9ybWFsaXplZEFsaWFzICYmIG5vcm1hbGl6ZWRBbGlhcy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtub3JtYWxpemVkQWxpYXN9XV1gO1xuICB9XG5cbiAgY29uc3QgYWxpYXNQYXJ0ID0gbm9ybWFsaXplZEFsaWFzID8gYHwke25vcm1hbGl6ZWRBbGlhc31gIDogJyc7XG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7bGlua1RleHR9JHthbGlhc1BhcnR9XV1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhcbiAgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCxcbiAgaXNDYW52YXNGaWxlQ2FjaGU6IGJvb2xlYW4sXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PixcbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlczogRmlsZUNoYW5nZVtdID0gW107XG5cbiAgY29uc3QgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSA9IChjYWNoZS5zZWN0aW9ucyA/PyBbXSkuZmlsdGVyKChzZWN0aW9uKSA9PiBzZWN0aW9uLnR5cGUgPT09ICd0YWJsZScpLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICBlbmQ6IHNlY3Rpb24ucG9zaXRpb24uZW5kLm9mZnNldCxcbiAgICBzdGFydDogc2VjdGlvbi5wb3NpdGlvbi5zdGFydC5vZmZzZXRcbiAgfSkpO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBnZXRBbGxMaW5rcyhjYWNoZSkpIHtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBsaW5rQ29udmVydGVyKGxpbmssIGFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDaGFuZ2UgPSByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgbmV3Q29udGVudCk7XG5cbiAgICBpZiAoaXNDYW52YXNGaWxlQ2FjaGUpIHtcbiAgICAgIGlmIChpc0NhbnZhc0NoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1Vuc3VwcG9ydGVkIGZpbGUgY2hhbmdlJywgZmlsZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMsIHRhcmdldEZpbGU6IFRGaWxlKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuICByZXR1cm4ge1xuICAgIGlzRW1iZWQ6IG9wdGlvbnMuaXNFbWJlZCA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyAhaXNNYXJrZG93bkZpbGUoYXBwLCB0YXJnZXRGaWxlKSxcbiAgICBpc1dpa2lsaW5rOiBvcHRpb25zLmlzV2lraWxpbmsgPz8gKG9wdGlvbnMub3JpZ2luYWxMaW5rID8gdGVzdFdpa2lsaW5rKG9wdGlvbnMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCksXG4gICAgc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGg6IG9wdGlvbnMuc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGggPz8gc2hvdWxkVXNlUmVsYXRpdmVMaW5rcyhhcHApLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IG9wdGlvbnMuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0QW5nbGVCcmFja2V0cyhvcHRpb25zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3Q6IG9wdGlvbnMuc2hvdWxkVXNlTGVhZGluZ0RvdCA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0TGVhZGluZ0RvdChvcHRpb25zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJhd0xpbmsobm9kZTogTm9kZSwgc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyLnNsaWNlKG5vZGUucG9zaXRpb24/LnN0YXJ0Lm9mZnNldCA/PyAwLCBub2RlLnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpbmtOb2RlKG5vZGU6IExpbmssIHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICBjb25zdCBMSU5LX0FMSUFTX1NVRkZJWCA9ICddKCc7XG4gIGNvbnN0IExJTktfU1VGRklYID0gJyknO1xuICBjb25zdCByYXcgPSBnZXRSYXdMaW5rKG5vZGUsIHN0cik7XG4gIGNvbnN0IGFsaWFzTm9kZSA9IG5vZGUuY2hpbGRyZW5bMF0gYXMgVGV4dCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3VXJsID0gc3RyLnNsaWNlKChhbGlhc05vZGU/LnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDEpICsgTElOS19BTElBU19TVUZGSVgubGVuZ3RoLCAobm9kZS5wb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAwKSAtIExJTktfU1VGRklYLmxlbmd0aCk7XG4gIGNvbnN0IGhhc0FuZ2xlQnJhY2tldHMgPSByYXcuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpIHx8IHJhd1VybC5zdGFydHNXaXRoKE9QRU5fQU5HTEVfQlJBQ0tFVCk7XG4gIGNvbnN0IGlzRXh0ZXJuYWwgPSBpc1VybChub2RlLnVybCk7XG4gIGxldCB1cmwgPSBub2RlLnVybDtcbiAgaWYgKCFpc0V4dGVybmFsICYmICFoYXNBbmdsZUJyYWNrZXRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHVybCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IGFsaWFzTm9kZT8udmFsdWUsXG4gICAgZW5jb2RlZFVybDogaXNFeHRlcm5hbCA/IGVuY29kZVVybCh1cmwpIDogdW5kZWZpbmVkLFxuICAgIGVuZE9mZnNldDogbm9kZS5wb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAwLFxuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICByYXcsXG4gICAgc3RhcnRPZmZzZXQ6IG5vZGUucG9zaXRpb24/LnN0YXJ0Lm9mZnNldCA/PyAwLFxuICAgIHRpdGxlOiBub2RlLnRpdGxlID8/IHVuZGVmaW5lZCxcbiAgICB1cmxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lraWxpbmtOb2RlKG5vZGU6IFdpa2lMaW5rTm9kZSwgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzOiBzdHIuaW5jbHVkZXMoV0lLSUxJTktfRElWSURFUikgPyBub2RlLmRhdGEuYWxpYXMgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBub2RlLnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDAsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbDogZmFsc2UsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICByYXc6IGdldFJhd0xpbmsobm9kZSwgc3RyKSxcbiAgICBzdGFydE9mZnNldDogbm9kZS5wb3NpdGlvbj8uc3RhcnQub2Zmc2V0ID8/IDAsXG4gICAgdXJsOiBub2RlLnZhbHVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSk6IGJvb2xlYW4ge1xuICBpZiAoIWlzQ29udGVudENoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLnRlc3QoZmlsZUNoYW5nZS5uZXdDb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZVBvc2l0aW9ucy5zb21lKCh0YWJsZVBvc2l0aW9uKSA9PlxuICAgIHRhYmxlUG9zaXRpb24uc3RhcnQgPD0gZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0ICYmIGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gdGFibGVQb3NpdGlvbi5lbmRcbiAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFxQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGNBQWM7QUFDdkIsT0FBTyxpQkFBaUI7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxhQUFhO0FBUXRCLFNBQVMsd0JBQXdCO0FBQ2pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsYUFBYTtBQUN0QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxNQUFNLDJCQUEyQjtBQU1qQyxNQUFNLDhCQUE4QjtBQUtwQyxNQUFNLHNDQUFzQztBQUs1QyxNQUFNLG9DQUFvQztBQUUxQyxNQUFNLG1CQUFtQjtBQStYbEIsU0FBUyxZQUFZLFNBQXFDO0FBQy9ELFFBQU0sYUFBYSxnQkFBZ0IsUUFBUSxLQUFLLFFBQVEsTUFBTSxRQUFRLHVCQUF1QixRQUFRLG1CQUFtQjtBQUN4SCxNQUFJLENBQUMsWUFBWTtBQUNmLFdBQU8sUUFBUSxLQUFLO0FBQUEsRUFDdEI7QUFFQSxTQUFPLFdBQVcsNEJBQStDO0FBQUEsSUFDL0QsS0FBSyxRQUFRO0FBQUEsSUFDYixNQUFNLFFBQVE7QUFBQSxJQUNkLHFCQUFxQixRQUFRO0FBQUEsSUFDN0IscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCLFFBQVE7QUFBQSxJQUM3QiwwQkFBMEIsUUFBUTtBQUFBLElBQ2xDLDJCQUEyQixRQUFRO0FBQUEsRUFDckMsQ0FBQyxDQUFDO0FBQ0o7QUFXQSxlQUFzQixjQUNwQixLQUNBLFlBQ0EsZUFDQSxpQkFBaUMsQ0FBQyxHQUNuQjtBQUNmLFFBQU0sWUFBWSxNQUFNLHdCQUF3QixLQUFLLFlBQVksY0FBYztBQUMvRSxhQUFXLG9CQUFvQixVQUFVLEtBQUssR0FBRztBQUMvQyxVQUFNLGVBQWUsVUFBVSxJQUFJLGdCQUFnQixLQUFLLENBQUM7QUFDekQsVUFBTSxZQUFZLElBQUksSUFBWSxhQUFhLElBQUksQ0FBQyxTQUFTLE9BQU8sSUFBSSxDQUFDLENBQUM7QUFDMUUsVUFBTSxVQUFVLEtBQUssa0JBQWtCLENBQUMsU0FBUztBQUMvQyxZQUFNLFdBQVcsT0FBTyxJQUFJO0FBQzVCLFVBQUksQ0FBQyxVQUFVLElBQUksUUFBUSxHQUFHO0FBQzVCO0FBQUEsTUFDRjtBQUVBLGFBQU8sY0FBYyxJQUFJO0FBQUEsSUFDM0IsR0FBRyxjQUFjO0FBQUEsRUFDbkI7QUFDRjtBQVdBLGVBQXNCLFVBQ3BCLEtBQ0EsWUFDQSxlQUNBLGlCQUFpQyxDQUFDLEdBQ25CO0FBQ2YsUUFBTSxpQkFBaUIsS0FBSyxZQUFZLFlBQVk7QUFDbEQsVUFBTSxRQUFRLE1BQU0sYUFBYSxLQUFLLFVBQVU7QUFDaEQsV0FBTyxNQUFNLGVBQWUsT0FBTyxhQUFhLEtBQUssVUFBVSxHQUFHLGFBQWE7QUFBQSxFQUNqRixHQUFHLGNBQWM7QUFDbkI7QUFXQSxlQUFzQixtQkFDcEIsS0FDQSxTQUNBLGVBQ0EsYUFDaUI7QUFDakIsa0JBQWdCLGlCQUFpQjtBQUNqQyxjQUFZLGVBQWU7QUFFM0IsUUFBTSxhQUFhLE1BQU0sb0JBQW9CLGFBQWEsU0FBUyxJQUFJLFlBQVk7QUFDakYsVUFBTSxRQUFRLE1BQU0sY0FBYyxLQUFLLE9BQU87QUFDOUMsZ0JBQVksZUFBZTtBQUMzQixVQUFNLFVBQVUsTUFBTSxlQUFlLE9BQU8sT0FBTyxlQUFlLFdBQVc7QUFDN0UsZ0JBQVksZUFBZTtBQUMzQixXQUFPO0FBQUEsRUFDVCxDQUFDO0FBQ0QsY0FBWSxlQUFlO0FBRTNCLE1BQUksZUFBZSxNQUFNO0FBQ3ZCLFVBQU0sSUFBSSxNQUFNLG1DQUFtQztBQUFBLEVBQ3JEO0FBRUEsU0FBTztBQUNUO0FBUU8sU0FBUyxVQUFVLEtBQXFCO0FBQzdDLFNBQU8sV0FBVyxLQUFLLDZCQUE2QixDQUFDLEVBQUUsV0FBVyxrQkFBa0IsTUFBTSxtQkFBbUIsaUJBQWlCLENBQUM7QUFDakk7QUFXTyxTQUFTLGdCQUFnQixLQUFVLE1BQWlCLGtCQUE4Qiw2QkFBNkIsT0FBcUI7QUFDekksUUFBTSxFQUFFLFNBQVMsSUFBSSxhQUFhLEtBQUssSUFBSTtBQUMzQyxRQUFNLGFBQWEsUUFBUSxLQUFLLGdCQUFnQjtBQUNoRCxRQUFNLE9BQU8sSUFBSSxjQUFjLHFCQUFxQixVQUFVLFVBQVU7QUFDeEUsTUFBSSxNQUFNO0FBQ1IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLENBQUMsNEJBQTRCO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxTQUFTLFdBQVcsR0FBRyxHQUFHO0FBQzVCLFdBQU8sUUFBUSxLQUFLLFVBQVUsSUFBSTtBQUFBLEVBQ3BDO0FBRUEsUUFBTSxlQUFlLEtBQUssUUFBUSxVQUFVLEdBQUcsS0FBSyxRQUFRLEVBQUU7QUFFOUQsTUFBSSxhQUFhLFdBQVcsS0FBSyxHQUFHO0FBQ2xDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxRQUFRLEtBQUssY0FBYyxJQUFJO0FBQ3hDO0FBUU8sU0FBUyw0QkFBNEIsT0FBZ0M7QUFDMUUsU0FBTyw2QkFBNkIsTUFBTSxhQUFhLElBQUksS0FBSztBQUNsRTtBQVFPLFNBQVMscUJBQXFCLFNBQThDO0FBQ2pGLFFBQU0sRUFBRSxJQUFJLElBQUk7QUFFaEIsUUFBTSwrQkFBZ0MsSUFBSSxZQUFZLHFCQUE0RSxxQkFDNUgsT0FBNkMsQ0FBQztBQUNwRCxRQUFNLDZCQUE2Qiw2QkFBNkI7QUFFaEUsUUFBTSxrQkFBd0Q7QUFBQSxJQUM1RCwwQkFBMEI7QUFBQSxFQUM1QjtBQUVBLFlBQVUsRUFBRSxHQUFHLGlCQUFpQixHQUFHLDRCQUE0QixHQUFHLFFBQVE7QUFFMUUsUUFBTSxhQUFhLFFBQVEsS0FBSyxRQUFRLGtCQUFrQixRQUFRLHdCQUF3QjtBQUUxRixTQUFPLHdCQUF3QixLQUFLLENBQUMsVUFBVSxHQUFHLE1BQU0seUJBQXlCLE9BQU8sQ0FBQztBQUMzRjtBQVFPLFNBQVMsVUFBVSxLQUFxQztBQUM3RCxRQUFNLFFBQVEsV0FBVyxHQUFHO0FBQzVCLFNBQU8sTUFBTSxDQUFDLEdBQUcsUUFBUSxNQUFNLE1BQU0sQ0FBQyxJQUFJO0FBQzVDO0FBUU8sU0FBUyxXQUFXLEtBQWdDO0FBQ3pELFFBQU0scUJBQXFCLG9CQUFJLElBQVk7QUFFM0MsUUFBTSxvQkFBb0I7QUFDMUIsUUFBTSx1QkFBdUI7QUFFN0IsUUFBTSxhQUFhLFdBQVcsS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO0FBQzlELHVCQUFtQixJQUFJLEtBQUssTUFBTTtBQUNsQyxXQUFPO0FBQUEsRUFDVCxDQUFDO0FBRUQsUUFBTSxZQUFZLE9BQU8sRUFBRSxJQUFJLFdBQVcsRUFBRSxJQUFJLGdCQUFnQixFQUFFLGNBQWMsaUJBQWlCLENBQUM7QUFDbEcsUUFBTSxPQUFPLFVBQVUsTUFBTSxVQUFVO0FBRXZDLFFBQU0sUUFBMkIsQ0FBQztBQUNsQyxRQUFNLFlBQStCLENBQUM7QUFFdEMsUUFBTSxNQUFNLENBQUMsU0FBZTtBQUMxQixRQUFJO0FBQ0osWUFBUSxLQUFLLE1BQU07QUFBQSxNQUNqQixLQUFLO0FBQ0gsZUFBTyxjQUFjLE1BQWMsR0FBRztBQUN0QztBQUFBLE1BQ0YsS0FBSztBQUNILGVBQU8sa0JBQWtCLE1BQXNCLEdBQUc7QUFDbEQ7QUFBQSxNQUNGO0FBQ0U7QUFBQSxJQUNKO0FBRUEsUUFBSSxtQkFBbUIsSUFBSSxLQUFLLGNBQWMsQ0FBQyxHQUFHO0FBQ2hELFdBQUssVUFBVTtBQUNmLFdBQUs7QUFDTCxXQUFLLE1BQU0sSUFBSSxLQUFLLEdBQUc7QUFBQSxJQUN6QjtBQUNBLFVBQU0sS0FBSyxJQUFJO0FBQUEsRUFDakIsQ0FBQztBQUVELFFBQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXO0FBRWxELE1BQUksa0JBQWtCO0FBRXRCLGFBQVcsUUFBUSxPQUFPO0FBQ3hCLHFCQUFpQixLQUFLLGlCQUFpQixLQUFLLGNBQWMsR0FBRyxTQUFTO0FBQ3RFLHNCQUFrQixLQUFLLFlBQVk7QUFBQSxFQUNyQztBQUVBLG1CQUFpQixLQUFLLGlCQUFpQixJQUFJLFNBQVMsR0FBRyxTQUFTO0FBRWhFLFFBQU0sS0FBSyxHQUFHLFNBQVM7QUFDdkIsUUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxFQUFFLFdBQVc7QUFFbEQsU0FBTztBQUNUO0FBUU8sU0FBUyxpQkFBaUIsU0FBMkM7QUFDMUUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLGVBQWUsT0FBTztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyxhQUFhO0FBQ2hCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxhQUFhLFFBQVEsS0FBSyxrQkFBa0IsSUFBSTtBQUN0RCxRQUFNLGdCQUFnQixRQUFRLEtBQUssbUJBQW1CO0FBQ3RELFFBQU0sZ0JBQWdCLFFBQVEsS0FBSyx1QkFBdUIsbUJBQW1CO0FBQzdFLFFBQU0sa0JBQWtCLFFBQVEsYUFBYTtBQUM3QyxRQUFNLGtCQUFrQixRQUFRLGFBQWE7QUFDN0MsUUFBTSxpQkFBaUIsb0JBQUksSUFBWTtBQUV2QyxhQUFXLGNBQWMsQ0FBQyxXQUFXLE1BQU0sYUFBYSxHQUFHO0FBQ3pELFFBQUksQ0FBQyxZQUFZO0FBQ2Y7QUFBQSxJQUNGO0FBRUEsVUFBTSxPQUFPLFFBQVEsS0FBSyxVQUFVO0FBQ3BDLG1CQUFlLElBQUksSUFBSTtBQUN2QixtQkFBZSxJQUFJLFNBQVMsSUFBSSxDQUFDO0FBQ2pDLG1CQUFlLElBQUksU0FBUyxpQkFBaUIsSUFBSSxDQUFDO0FBQ2xELG1CQUFlLElBQUksU0FBUyxpQkFBaUIsSUFBSSxDQUFDO0FBQUEsRUFDcEQ7QUFFQSxhQUFXLGNBQWMsQ0FBQyxlQUFlLGFBQWEsR0FBRztBQUN2RCxtQkFBZSxJQUFJLElBQUksY0FBYyxlQUFlLFlBQVksWUFBWSxLQUFLLENBQUM7QUFBQSxFQUNwRjtBQUVBLFFBQU0sbUJBQW1CLFdBQVcsY0FBYyxZQUFZLE1BQU0sS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsWUFBWTtBQUVoSCxhQUFXLFNBQVMsZ0JBQWdCO0FBQ2xDLFFBQUksTUFBTSxZQUFZLE1BQU0sa0JBQWtCO0FBQzVDLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxTQUFTLFFBQVEsS0FBSztBQUM1QixVQUFNLE9BQU8sU0FBUyxPQUFPLFFBQVEsS0FBSyxDQUFDO0FBQzNDLFFBQUksS0FBSyxRQUFRLElBQUksRUFBRSxZQUFZLE1BQU0sa0JBQWtCO0FBQ3pELGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVFPLFNBQVMsYUFBYSxNQUFrQztBQUM3RCxRQUFNLFNBQVMsY0FBYyxVQUFVLElBQUksQ0FBQztBQUM1QyxTQUFPO0FBQUEsSUFDTCxVQUFVLE9BQU87QUFBQSxJQUNqQixTQUFTLE9BQU87QUFBQSxFQUNsQjtBQUNGO0FBU08sU0FBUyxrQkFBa0IsTUFBdUI7QUFDdkQsUUFBTSxrQkFBa0IsVUFBVSxJQUFJO0FBQ3RDLFNBQU8saUJBQWlCLG9CQUFvQjtBQUM5QztBQVNPLFNBQVMsVUFBVSxNQUF1QjtBQUMvQyxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsV0FBVztBQUNyQztBQVVPLFNBQVMsZUFBZSxNQUF1QjtBQUNwRCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsSUFBSSxXQUFXLElBQUksS0FBSztBQUNsRDtBQVNPLFNBQVMsYUFBYSxNQUF1QjtBQUNsRCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsY0FBYztBQUN4QztBQVFPLFNBQVMsV0FBVyxTQUFvQztBQUM3RCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLENBQUMscUJBQXFCO0FBQ3hCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDQSxRQUFNLGFBQWEsUUFBUSxLQUFLLHFCQUFxQixJQUFJO0FBQ3pELFFBQU0sZ0JBQWdCLFFBQVEsS0FBSyx1QkFBdUIsbUJBQW1CO0FBQzdFLFFBQU0sYUFBYSxhQUFhLEtBQUssUUFBUSxLQUFLLDZCQUE2QjtBQUMvRSxRQUFNLEVBQUUsUUFBUSxJQUFJLGFBQWEsS0FBSyxJQUFJO0FBQzFDLE1BQUksa0JBQWtCLENBQUM7QUFFdkIsTUFBSSxhQUFhLEtBQUssbUJBQW1CLEdBQUc7QUFDMUMsUUFBSSwwQkFBMEIsSUFBSSxHQUFHO0FBQ25DLGFBQU8sV0FBVyxPQUFPO0FBQUEsSUFDM0I7QUFBQSxFQUNGO0FBRUEsTUFBSTtBQUVKLE1BQUksWUFBWTtBQUNkLFVBQU0sa0JBQWtCLFVBQVUsS0FBSyxRQUFRO0FBQy9DLFFBQUksaUJBQWlCLE9BQU87QUFDMUIsY0FBUSxnQkFBZ0I7QUFDeEIsd0JBQWtCO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBRUEsWUFBVSxpQkFBaUIsNEJBQXFEO0FBQUEsSUFDNUU7QUFBQSxJQUNBLGFBQWEsS0FBSztBQUFBLElBQ2xCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxrQkFBa0I7QUFBQSxFQUNwQixDQUFDLENBQUMsSUFDQSxTQUNBLEtBQUs7QUFFVCxNQUFJLENBQUMsaUJBQWlCO0FBQ3BCLFFBQUksVUFBVSxTQUFTLGVBQWUsUUFBUSxhQUFhLENBQUMsR0FBRztBQUM3RCxjQUFRLFdBQVc7QUFBQSxJQUNyQixXQUFXLFVBQVUsU0FBUyxhQUFhLEdBQUc7QUFDNUMsY0FBUSxXQUFXO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBRUEsUUFBTSxVQUFVLHFCQUFxQiw0QkFBeUQ7QUFBQSxJQUM1RjtBQUFBLElBQ0E7QUFBQSxJQUNBLFlBQVksMkJBQTJCLFFBQVE7QUFBQSxJQUMvQyxjQUFjLEtBQUs7QUFBQSxJQUNuQixrQkFBa0I7QUFBQSxJQUNsQjtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsRUFDcEIsQ0FBQyxDQUFDO0FBQ0YsU0FBTztBQUNUO0FBUUEsZUFBc0IscUJBQXFCLFNBQXVEO0FBQ2hHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosU0FBTyxNQUFNLG1CQUFtQixLQUFLLFNBQVMsQ0FBQyxTQUFTO0FBQ3RELFVBQU0sY0FBYyxVQUFVLEtBQUssUUFBUTtBQUMzQyxRQUFJLCtCQUErQixVQUFhLCtCQUErQixhQUFhO0FBQzFGO0FBQUEsSUFDRjtBQUNBLFdBQU8sWUFBWSw0QkFBZ0Q7QUFBQSxNQUNqRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDLENBQUM7QUFBQSxFQUNKLENBQUM7QUFDSDtBQVFBLGVBQXNCLGtCQUFrQixTQUFrRDtBQUN4RixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosTUFBSSxhQUFhLEtBQUssbUJBQW1CLEtBQUssQ0FBQyxJQUFJLGdCQUFnQixxQkFBcUIsbUJBQW1CLE1BQU0sR0FBRztBQUNsSDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQVUsS0FBSyxxQkFBcUIsQ0FBQyxTQUFTO0FBQ2xELFVBQU0sY0FBYyxVQUFVLEtBQUssUUFBUTtBQUMzQyxRQUFJLCtCQUErQixVQUFhLCtCQUErQixhQUFhO0FBQzFGO0FBQUEsSUFDRjtBQUNBLFdBQU8sWUFBWSw0QkFBZ0Q7QUFBQSxNQUNqRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDLENBQUM7QUFBQSxFQUNKLEdBQUcsT0FBTztBQUNaO0FBRUEsU0FBUyw2QkFBNkIsT0FBZ0IsS0FBYSxPQUFnQztBQUNqRyxNQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLFVBQU0sa0JBQWtCLFVBQVUsS0FBSztBQUN2QyxRQUFJLENBQUMsbUJBQW1CLGdCQUFnQixjQUFjLGdCQUFnQixZQUFZO0FBQ2hGLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxxQkFBcUIsQ0FBQztBQUM1QixRQUFJLE9BQU8sTUFBTSxpQkFBaUIsS0FBSyxDQUFDLG9CQUFvQixnQkFBZ0IsUUFBUSxHQUFHO0FBRXZGLFFBQUksQ0FBQyxNQUFNO0FBQ1QsYUFBTztBQUFBLFFBQ0w7QUFBQSxRQUNBLE1BQU07QUFBQSxRQUNOLFVBQVU7QUFBQSxNQUNaO0FBQ0EsWUFBTSxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsSUFDbEM7QUFFQSxTQUFLLE9BQU8sZ0JBQWdCO0FBQzVCLFNBQUssV0FBVztBQUNoQixRQUFJLGdCQUFnQixVQUFVLFFBQVc7QUFDdkMsV0FBSyxjQUFjLGdCQUFnQjtBQUFBLElBQ3JDO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFBTTtBQUMvQyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksc0JBQXNCO0FBRTFCLGFBQVcsQ0FBQyxVQUFVLFVBQVUsS0FBSyxPQUFPLFFBQVEsS0FBc0IsR0FBRztBQUMzRSxVQUFNLDJCQUEyQiw2QkFBNkIsWUFBWSxNQUFNLEdBQUcsR0FBRyxJQUFJLFFBQVEsS0FBSyxVQUFVLEtBQUs7QUFDdEgsNEJBQXdCO0FBQUEsRUFDMUI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGlCQUFpQixLQUFhLGFBQXFCLFdBQW1CLFdBQW9DO0FBQ2pILE1BQUksY0FBYyxXQUFXO0FBQzNCO0FBQUEsRUFDRjtBQUVBLFFBQU0sV0FBVyxJQUFJLE1BQU0sYUFBYSxZQUFZLENBQUM7QUFDckQsYUFBVyxVQUFVLGdCQUFnQixDQUFDLE1BQU0sUUFBUTtBQUNsRCxRQUFJLENBQUMsTUFBTSxHQUFHLEdBQUc7QUFDZjtBQUFBLElBQ0Y7QUFFQSxjQUFVLEtBQUs7QUFBQSxNQUNiLFlBQVksVUFBVSxHQUFHO0FBQUEsTUFDekIsV0FBVyxjQUFjLEtBQUssU0FBUyxJQUFJO0FBQUEsTUFDM0Msa0JBQWtCO0FBQUEsTUFDbEIsU0FBUztBQUFBLE1BQ1QsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osS0FBSztBQUFBLE1BQ0wsYUFBYSxjQUFjLEtBQUs7QUFBQSxNQUNoQztBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBRUEsU0FBUyxpQkFBaUIsS0FBVSxZQUFtQixZQUFvQixTQUFpQixRQUE0QjtBQUN0SCxNQUFJLGVBQWUsS0FBSztBQUN0QixpQkFBYTtBQUFBLEVBQ2Y7QUFFQSxNQUFJO0FBRUosTUFBSSxXQUFXLFNBQVMsY0FBYyxTQUFTO0FBQzdDLGVBQVc7QUFBQSxFQUNiLFdBQVcsT0FBTyx5QkFBeUI7QUFDekMsZUFBVyxTQUFTLFFBQVEsVUFBVSxHQUFHLE9BQU8sYUFBYSxzQkFBc0IsS0FBSyxVQUFVLElBQUksV0FBVyxJQUFJLElBQUk7QUFBQSxFQUMzSCxPQUFPO0FBQ0wsZUFBVyxJQUFJLGNBQWMsZUFBZSxZQUFZLFlBQVksT0FBTyxVQUFVLElBQUk7QUFBQSxFQUMzRjtBQUVBLE1BQUksT0FBTywyQkFBMkIsT0FBTyx1QkFBdUIsQ0FBQyxTQUFTLFdBQVcsR0FBRyxLQUFLLENBQUMsU0FBUyxXQUFXLEdBQUcsR0FBRztBQUMxSCxlQUFXLEtBQUssUUFBUTtBQUFBLEVBQzFCO0FBRUEsU0FBTztBQUNUO0FBRUEsU0FBUyx5QkFBeUIsU0FBOEM7QUFDOUUsUUFBTSxFQUFFLElBQUksSUFBSTtBQUNoQixRQUFNLGFBQWEsUUFBUSxLQUFLLFFBQVEsa0JBQWtCLFFBQVEsd0JBQXdCO0FBQzFGLFFBQU0sYUFBYSxRQUFRLEtBQUssUUFBUSxnQkFBZ0I7QUFDeEQsUUFBTSxVQUFVLFFBQVEsV0FBVztBQUVuQyxRQUFNLGFBQWEsY0FBYyxTQUFTLFVBQVU7QUFDcEQsUUFBTSxXQUFXLGlCQUFpQixLQUFLLFlBQVksWUFBWSxTQUFTLFVBQVU7QUFFbEYsU0FBTyxXQUFXLGFBQ2QsaUJBQWlCLFVBQVUsUUFBUSxPQUFPLFdBQVcsT0FBTyxJQUM1RCwwQkFBMEIsVUFBVSxZQUFZLFNBQVMsVUFBVTtBQUN6RTtBQUVBLFNBQVMsMEJBQTBCLFVBQWtCLFlBQW1CLFNBQXNDLFFBQTRCO0FBQ3hJLFFBQU0sRUFBRSxJQUFJLElBQUk7QUFDaEIsUUFBTSxjQUFjLE9BQU8sVUFBVSxNQUFNO0FBRTNDLFFBQU0sb0JBQW9CLE9BQU8seUJBQzdCLElBQUksUUFBUSxNQUNaLFVBQVUsUUFBUTtBQUV0QixNQUFJLFFBQVEsUUFBUSxTQUFTO0FBQzdCLE1BQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxXQUFXLENBQUMsUUFBUSwyQkFBMkI7QUFDcEUsWUFBUSxDQUFDLFFBQVEsZ0RBQWdELGVBQWUsS0FBSyxVQUFVLElBQzNGLFdBQVcsV0FDWCxXQUFXO0FBQUEsRUFDakI7QUFFQSxRQUFNLGVBQWUsV0FBVyxPQUFPLHFDQUFxQyxNQUFNO0FBQ2xGLFNBQU8sR0FBRyxXQUFXLElBQUksWUFBWSxLQUFLLGlCQUFpQjtBQUM3RDtBQUVBLFNBQVMsaUJBQWlCLFVBQWtCLE9BQTJCLFNBQTBCO0FBQy9GLFFBQU0sY0FBYyxVQUFVLE1BQU07QUFDcEMsUUFBTSxrQkFBa0IsU0FBUztBQUVqQyxNQUFJLG1CQUFtQixnQkFBZ0IsWUFBWSxNQUFNLFNBQVMsWUFBWSxHQUFHO0FBQy9FLFdBQU8sR0FBRyxXQUFXLEtBQUssZUFBZTtBQUFBLEVBQzNDO0FBRUEsUUFBTSxZQUFZLGtCQUFrQixJQUFJLGVBQWUsS0FBSztBQUM1RCxTQUFPLEdBQUcsV0FBVyxLQUFLLFFBQVEsR0FBRyxTQUFTO0FBQ2hEO0FBRUEsZUFBZSxlQUNiLE9BQ0EsbUJBQ0EsZUFDQSxhQUN1QjtBQUN2QixrQkFBZ0IsaUJBQWlCO0FBQ2pDLGNBQVksZUFBZTtBQUUzQixNQUFJLENBQUMsT0FBTztBQUNWLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFVBQXdCLENBQUM7QUFFL0IsUUFBTSxrQkFBbUMsTUFBTSxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxRQUFRLFNBQVMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhO0FBQUEsSUFDN0gsS0FBSyxRQUFRLFNBQVMsSUFBSTtBQUFBLElBQzFCLE9BQU8sUUFBUSxTQUFTLE1BQU07QUFBQSxFQUNoQyxFQUFFO0FBRUYsYUFBVyxRQUFRLFlBQVksS0FBSyxHQUFHO0FBQ3JDLGdCQUFZLGVBQWU7QUFDM0IsVUFBTSxhQUFhLE1BQU0sY0FBYyxNQUFNLFdBQVc7QUFDeEQsZ0JBQVksZUFBZTtBQUMzQixRQUFJLGVBQWUsUUFBVztBQUM1QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLGFBQWEsc0JBQXNCLE1BQU0sVUFBVTtBQUV6RCxRQUFJLG1CQUFtQjtBQUNyQixVQUFJLGVBQWUsVUFBVSxHQUFHO0FBQzlCLGdCQUFRLEtBQUssVUFBVTtBQUFBLE1BQ3pCLE9BQU87QUFDTCxnQkFBUSxLQUFLLDJCQUEyQixVQUFVO0FBQUEsTUFDcEQ7QUFBQSxJQUNGLE9BQU87QUFDTCxVQUFJLDRCQUE0QixZQUFZLGNBQWMsR0FBRztBQUMzRCxtQkFBVyxhQUFhLFdBQVcsV0FBVyxXQUFXLG1DQUFtQyx3QkFBd0I7QUFBQSxNQUN0SDtBQUVBLGNBQVEsS0FBSyxVQUFVO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyxjQUFjLFNBQXNDLFlBQStCO0FBQzFGLFFBQU0sRUFBRSxJQUFJLElBQUk7QUFDaEIsU0FBTztBQUFBLElBQ0wsU0FBUyxRQUFRLFlBQVksUUFBUSxlQUFlLFVBQVUsUUFBUSxZQUFZLElBQUksV0FBYyxDQUFDLGVBQWUsS0FBSyxVQUFVO0FBQUEsSUFDbkksWUFBWSxRQUFRLGVBQWUsUUFBUSxlQUFlLGFBQWEsUUFBUSxZQUFZLElBQUksV0FBYyxtQkFBbUIsR0FBRztBQUFBLElBQ25JLHlCQUF5QixRQUFRLDJCQUEyQix1QkFBdUIsR0FBRztBQUFBLElBQ3RGLHdCQUF3QixRQUFRLDJCQUEyQixRQUFRLGVBQWUsa0JBQWtCLFFBQVEsWUFBWSxJQUFJLFdBQWM7QUFBQSxJQUMxSSxxQkFBcUIsUUFBUSx3QkFBd0IsUUFBUSxlQUFlLGVBQWUsUUFBUSxZQUFZLElBQUksV0FBYztBQUFBLEVBQ25JO0FBQ0Y7QUFFQSxTQUFTLFdBQVcsTUFBWSxLQUFxQjtBQUNuRCxTQUFPLElBQUksTUFBTSxLQUFLLFVBQVUsTUFBTSxVQUFVLEdBQUcsS0FBSyxVQUFVLElBQUksVUFBVSxDQUFDO0FBQ25GO0FBRUEsU0FBUyxjQUFjLE1BQVksS0FBOEI7QUFDL0QsUUFBTSxxQkFBcUI7QUFDM0IsUUFBTSxvQkFBb0I7QUFDMUIsUUFBTSxjQUFjO0FBQ3BCLFFBQU0sTUFBTSxXQUFXLE1BQU0sR0FBRztBQUNoQyxRQUFNLFlBQVksS0FBSyxTQUFTLENBQUM7QUFDakMsUUFBTSxTQUFTLElBQUksT0FBTyxXQUFXLFVBQVUsSUFBSSxVQUFVLEtBQUssa0JBQWtCLFNBQVMsS0FBSyxVQUFVLElBQUksVUFBVSxLQUFLLFlBQVksTUFBTTtBQUNqSixRQUFNLG1CQUFtQixJQUFJLFdBQVcsa0JBQWtCLEtBQUssT0FBTyxXQUFXLGtCQUFrQjtBQUNuRyxRQUFNLGFBQWEsTUFBTSxLQUFLLEdBQUc7QUFDakMsTUFBSSxNQUFNLEtBQUs7QUFDZixNQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQjtBQUNwQyxRQUFJO0FBQ0YsWUFBTSxtQkFBbUIsR0FBRztBQUFBLElBQzlCLFNBQVMsT0FBTztBQUNkLGNBQVEsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLEtBQUs7QUFBQSxJQUNwRDtBQUFBLEVBQ0Y7QUFDQSxTQUFPLDRCQUE2QztBQUFBLElBQ2xELE9BQU8sV0FBVztBQUFBLElBQ2xCLFlBQVksYUFBYSxVQUFVLEdBQUcsSUFBSTtBQUFBLElBQzFDLFdBQVcsS0FBSyxVQUFVLElBQUksVUFBVTtBQUFBLElBQ3hDO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0EsWUFBWTtBQUFBLElBQ1o7QUFBQSxJQUNBLGFBQWEsS0FBSyxVQUFVLE1BQU0sVUFBVTtBQUFBLElBQzVDLE9BQU8sS0FBSyxTQUFTO0FBQUEsSUFDckI7QUFBQSxFQUNGLENBQUM7QUFDSDtBQUVBLFNBQVMsa0JBQWtCLE1BQW9CLEtBQThCO0FBQzNFLFNBQU8sNEJBQTZDO0FBQUEsSUFDbEQsT0FBTyxJQUFJLFNBQVMsZ0JBQWdCLElBQUksS0FBSyxLQUFLLFFBQVE7QUFBQSxJQUMxRCxXQUFXLEtBQUssVUFBVSxJQUFJLFVBQVU7QUFBQSxJQUN4QyxTQUFTO0FBQUEsSUFDVCxZQUFZO0FBQUEsSUFDWixZQUFZO0FBQUEsSUFDWixLQUFLLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDekIsYUFBYSxLQUFLLFVBQVUsTUFBTSxVQUFVO0FBQUEsSUFDNUMsS0FBSyxLQUFLO0FBQUEsRUFDWixDQUFDO0FBQ0g7QUFFQSxTQUFTLDRCQUE0QixZQUF3QixnQkFBMEM7QUFDckcsTUFBSSxDQUFDLGdCQUFnQixVQUFVLEdBQUc7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLENBQUMsa0NBQWtDLEtBQUssV0FBVyxVQUFVLEdBQUc7QUFDbEUsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWU7QUFBQSxJQUFLLENBQUMsa0JBQzFCLGNBQWMsU0FBUyxXQUFXLFVBQVUsU0FBUyxNQUFNLFVBQVUsV0FBVyxVQUFVLFNBQVMsSUFBSSxVQUFVLGNBQWM7QUFBQSxFQUNqSTtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
605
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBoYW5kbGluZyBhbmQgdXBkYXRpbmcgbGlua3Mgd2l0aGluIE9ic2lkaWFuIHZhdWx0cy4gSXQgaW5jbHVkZXNcbiAqIGZ1bmN0aW9ucyB0byBzcGxpdCBwYXRocywgdXBkYXRlIGxpbmtzIGluIGZpbGVzLCBhbmQgZ2VuZXJhdGUgbWFya2Rvd24gbGlua3Mgd2l0aCB2YXJpb3VzIG9wdGlvbnMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rLFxuICBUZXh0XG59IGZyb20gJ21kYXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBOb2RlIH0gZnJvbSAndW5pc3QnO1xuXG5pbXBvcnQge1xuICBub3JtYWxpemVQYXRoLFxuICBwYXJzZUxpbmt0ZXh0XG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IEludGVybmFsUGx1Z2luTmFtZSB9IGZyb20gJ29ic2lkaWFuLXR5cGluZ3MvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHJlbWFyayB9IGZyb20gJ3JlbWFyayc7XG5pbXBvcnQgcmVtYXJrUGFyc2UgZnJvbSAncmVtYXJrLXBhcnNlJztcbmltcG9ydCB7IHdpa2lMaW5rUGx1Z2luIH0gZnJvbSAncmVtYXJrLXdpa2ktbGluayc7XG5pbXBvcnQgeyB2aXNpdCB9IGZyb20gJ3VuaXN0LXV0aWwtdmlzaXQnO1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICcuLi9PYmplY3RVdGlscy50cyc7XG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnLi4vVHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL0ZpbGVDaGFuZ2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc09wdGlvbnMgfSBmcm9tICcuL1ZhdWx0LnRzJztcblxuaW1wb3J0IHsgYWJvcnRTaWduYWxOZXZlciB9IGZyb20gJy4uL0Fib3J0Q29udHJvbGxlci50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi9PYmplY3RVdGlscy50cyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemUsXG4gIHJlcGxhY2VBbGxcbn0gZnJvbSAnLi4vU3RyaW5nLnRzJztcbmltcG9ydCB7IGlzVXJsIH0gZnJvbSAnLi4vdXJsLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9GaWxlQ2hhbmdlLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIHRyaW1NYXJrZG93bkV4dGVuc2lvblxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIHBhcnNlTWV0YWRhdGEsXG4gIHRlbXBSZWdpc3RlckZpbGVzQW5kUnVuXG59IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQge1xuICBzaG91bGRVc2VSZWxhdGl2ZUxpbmtzLFxuICBzaG91bGRVc2VXaWtpbGlua3Ncbn0gZnJvbSAnLi9PYnNpZGlhblNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UsXG4gIHJlZmVyZW5jZVRvRmlsZUNoYW5nZVxufSBmcm9tICcuL1JlZmVyZW5jZS50cyc7XG5cbmNvbnN0IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUiA9ICdcXFxcfCc7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIGxpbmsgc3ltYm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdW5lc2NhcGVkIHBpcGVzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29udmVydGluZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydExpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdyYXBwZXIgZm9yIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBtYXJrZG93biBsaW5rcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRPcHRpb25zV3JhcHBlciB7XG4gIC8qKlxuICAgKiBBIGRlZmF1bHQgb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyBtYXJrZG93biBsaW5rcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBkZWZhdWx0IG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICBkZWZhdWx0T3B0aW9uc0ZuKCk6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBnZW5lcmF0aW5nIGEgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMge1xuICAvKipcbiAgICogQW4gYWxpYXMgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGVtYmVkZGVkLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS5cbiAgICovXG4gIGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBJZiBgZmFsc2VgIGFuZCBgcGF0aE9yRmlsZWAgaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2YgYGlzRW1iZWRgLCBgaXNXaWtpbGlua2AsIGB1c2VMZWFkaW5nRG90YCwgYW5kIGB1c2VBbmdsZUJyYWNrZXRzYC5cbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSByZWxhdGl2ZS4gSWYgbm90IHByb3ZpZGVkIG9yIGBmYWxzZWAsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy4gSGFzIG5vIGVmZmVjdCBpZiBgYWxsb3dFbXB0eUVtYmVkQWxpYXNgIGlzIGB0cnVlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuIERlZmF1bHRzIHRvIGBmYWxzZWAuIEhhcyBubyBlZmZlY3QgaWYgYGlzV2lraWxpbmtgIGlzIGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuIERlZmF1bHRzIHRvIGBmYWxzZWAuIEhhcyBubyBlZmZlY3QgaWYgYGlzV2lraWxpbmtgIGlzIGB0cnVlYCBvciBgaXNSZWxhdGl2ZWAgaXMgYGZhbHNlYC5cbiAgICovXG4gIHNob3VsZFVzZUxlYWRpbmdEb3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBzdWJwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgc3VicGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiBwYXJzaW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUxpbmtSZXN1bHQge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZW5jb2RlZCBVUkwgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqL1xuICBoYXNBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmsuXG4gICAqL1xuICBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgZXh0ZXJuYWwuXG4gICAqL1xuICBpc0V4dGVybmFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcmF3IGxpbmsgdGV4dC5cbiAgICovXG4gIHJhdzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgb3JpZ2luYWwgdGV4dC5cbiAgICovXG4gIHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCB0YXJnZXQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG9sZFRhcmdldFBhdGg6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgLyoqXG4gICAqIEEgbGluayBwYXRoLlxuICAgKi9cbiAgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJwYXRoLlxuICAgKi9cbiAgc3VicGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHVwZGF0aW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdXBkYXRpbmcgbGlua3MgaW4gYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlT3B0aW9ucyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgdGhlIGxpbmtzIHRvIGJlIGluIE1hcmtkb3duIGZvcm1hdC5cbiAgICovXG4gIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMaW5rQ29uZmlnIHtcbiAgaXNFbWJlZDogYm9vbGVhbjtcbiAgaXNXaWtpbGluazogYm9vbGVhbjtcbiAgc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGg6IGJvb2xlYW47XG4gIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHNob3VsZFVzZUxlYWRpbmdEb3Q6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBUYWJsZVBvc2l0aW9uIHtcbiAgZW5kOiBudW1iZXI7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcuXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudE9wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgY29udGVudCB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlIGV4dGVuZHMgTm9kZSB7XG4gIGRhdGE6IHtcbiAgICBhbGlhczogc3RyaW5nO1xuICB9O1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGluayB0byBhIG5ldyBwYXRoLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGNvbnZlcnRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0TGluayhvcHRpb25zOiBDb252ZXJ0TGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRGaWxlID0gZXh0cmFjdExpbmtGaWxlKG9wdGlvbnMuYXBwLCBvcHRpb25zLmxpbmssIG9wdGlvbnMub2xkU291cmNlUGF0aE9yRmlsZSA/PyBvcHRpb25zLm5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBpZiAoIXRhcmdldEZpbGUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5saW5rLm9yaWdpbmFsO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtPcHRpb25zPih7XG4gICAgYXBwOiBvcHRpb25zLmFwcCxcbiAgICBsaW5rOiBvcHRpb25zLmxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZTogb3B0aW9ucy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZTogb3B0aW9ucy5vbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rczogb3B0aW9ucy5zaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogb3B0aW9ucy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gKiBAcGFyYW0gbGlua0NvbnZlcnRlciAtIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAqIEBwYXJhbSBwcm9jZXNzT3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgZm9yIHJldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIHByb2Nlc3NPcHRpb25zOiBQcm9jZXNzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwLCBwYXRoT3JGaWxlLCBwcm9jZXNzT3B0aW9ucyk7XG4gIGZvciAoY29uc3QgYmFja2xpbmtOb3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgY3VycmVudExpbmtzID0gYmFja2xpbmtzLmdldChiYWNrbGlua05vdGVQYXRoKSA/PyBbXTtcbiAgICBjb25zdCBsaW5rSnNvbnMgPSBuZXcgU2V0PHN0cmluZz4oY3VycmVudExpbmtzLm1hcCgobGluaykgPT4gdG9Kc29uKGxpbmspKSk7XG4gICAgYXdhaXQgZWRpdExpbmtzKGFwcCwgYmFja2xpbmtOb3RlUGF0aCwgKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGxpbmtKc29uID0gdG9Kc29uKGxpbmspO1xuICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgIH0sIHByb2Nlc3NPcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIHByb2Nlc3NPcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBwcm9jZXNzT3B0aW9uczogUHJvY2Vzc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICByZXR1cm4gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGlzQ2FudmFzRmlsZShhcHAsIHBhdGhPckZpbGUpLCBsaW5rQ29udmVydGVyKTtcbiAgfSwgcHJvY2Vzc09wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQoXG4gIGFwcDogQXBwLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsICcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGZhbHNlLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG5ld0NvbnRlbnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuICB9XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBlbmNvZGUuXG4gKiBAcmV0dXJucyBUaGUgZW5jb2RlZCBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbCh1cmwsIFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCwgKHsgc3Vic3RyaW5nOiBzcGVjaWFsTGlua1N5bWJvbCB9KSA9PiBlbmNvZGVVUklDb21wb25lbnQoc3BlY2lhbExpbmtTeW1ib2wpKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSAtIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaW5rRmlsZShhcHA6IEFwcCwgbGluazogUmVmZXJlbmNlLCBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSA9IGZhbHNlKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rUGF0aCwgc291cmNlUGF0aCk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBpZiAoIXNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlua1BhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGdldEZpbGUoYXBwLCBsaW5rUGF0aCwgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCBmdWxsTGlua1BhdGggPSBqb2luKGRpcm5hbWUoc291cmNlUGF0aCksIGAuLyR7bGlua1BhdGh9YCk7XG5cbiAgaWYgKGZ1bGxMaW5rUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldEZpbGUoYXBwLCBmdWxsTGlua1BhdGgsIHRydWUpO1xufVxuXG4vKipcbiAqIEZpeGVzIHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbiB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgY2FjaGUuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIG1ldGFkYXRhIGNhY2hlIHRvIGZpeCB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3MgaW4uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyB3ZXJlIGZpeGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzKGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IGJvb2xlYW4ge1xuICByZXR1cm4gX2ZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rcyhjYWNoZS5mcm9udG1hdHRlciwgJycsIGNhY2hlKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGluayhvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gb3B0aW9ucztcblxuICBjb25zdCBjb25maWd1cmFibGVEZWZhdWx0T3B0aW9uc0ZuID0gKGFwcC5maWxlTWFuYWdlci5nZW5lcmF0ZU1hcmtkb3duTGluayBhcyBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdE9wdGlvbnNXcmFwcGVyPikuZGVmYXVsdE9wdGlvbnNGblxuICAgID8/ICgoKTogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnM+ID0+ICh7fSkpO1xuICBjb25zdCBjb25maWd1cmFibGVEZWZhdWx0T3B0aW9ucyA9IGNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zRm4oKTtcblxuICBjb25zdCBERUZBVUxUX09QVElPTlM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBvcHRpb25zID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLmNvbmZpZ3VyYWJsZURlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zIH07XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBvcHRpb25zLnRhcmdldFBhdGhPckZpbGUsIG9wdGlvbnMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkKTtcblxuICByZXR1cm4gdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW4oYXBwLCBbdGFyZ2V0RmlsZV0sICgpID0+IGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChvcHRpb25zKSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgbGluayBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgbGluayB0byBwYXJzZS5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGluayhzdHI6IHN0cmluZyk6IG51bGwgfCBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBsaW5rcyA9IHBhcnNlTGlua3Moc3RyKTtcbiAgcmV0dXJuIGxpbmtzWzBdPy5yYXcgPT09IHN0ciA/IGxpbmtzWzBdIDogbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYWxsIGxpbmtzIGluIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBzdHIgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmtzKHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0W10ge1xuICBjb25zdCBlbWJlZFN5bWJvbE9mZnNldHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICBjb25zdCBFTUJFRF9MSU5LX1BSRUZJWCA9ICchWyc7XG4gIGNvbnN0IE5PX0VNQkVEX0xJTktfUFJFRklYID0gJyBbJztcblxuICBjb25zdCBub0VtYmVkU3RyID0gcmVwbGFjZUFsbChzdHIsIEVNQkVEX0xJTktfUFJFRklYLCAoYXJncykgPT4ge1xuICAgIGVtYmVkU3ltYm9sT2Zmc2V0cy5hZGQoYXJncy5vZmZzZXQpO1xuICAgIHJldHVybiBOT19FTUJFRF9MSU5LX1BSRUZJWDtcbiAgfSk7XG5cbiAgY29uc3QgcHJvY2Vzc29yID0gcmVtYXJrKCkudXNlKHJlbWFya1BhcnNlKS51c2Uod2lraUxpbmtQbHVnaW4sIHsgYWxpYXNEaXZpZGVyOiBXSUtJTElOS19ESVZJREVSIH0pO1xuICBjb25zdCByb290ID0gcHJvY2Vzc29yLnBhcnNlKG5vRW1iZWRTdHIpO1xuXG4gIGNvbnN0IGxpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuICBjb25zdCB0ZXh0TGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG5cbiAgdmlzaXQocm9vdCwgKG5vZGU6IE5vZGUpID0+IHtcbiAgICBsZXQgbGluazogUGFyc2VMaW5rUmVzdWx0O1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlTGlua05vZGUobm9kZSBhcyBMaW5rLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dpa2lMaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlV2lraWxpbmtOb2RlKG5vZGUgYXMgV2lraUxpbmtOb2RlLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZW1iZWRTeW1ib2xPZmZzZXRzLmhhcyhsaW5rLnN0YXJ0T2Zmc2V0IC0gMSkpIHtcbiAgICAgIGxpbmsuaXNFbWJlZCA9IHRydWU7XG4gICAgICBsaW5rLnN0YXJ0T2Zmc2V0LS07XG4gICAgICBsaW5rLnJhdyA9IGAhJHtsaW5rLnJhd31gO1xuICAgIH1cbiAgICBsaW5rcy5wdXNoKGxpbmspO1xuICB9KTtcblxuICBsaW5rcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgbGV0IHRleHRTdGFydE9mZnNldCA9IDA7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgZXh0cmFjdFRleHRMaW5rcyhzdHIsIHRleHRTdGFydE9mZnNldCwgbGluay5zdGFydE9mZnNldCAtIDEsIHRleHRMaW5rcyk7XG4gICAgdGV4dFN0YXJ0T2Zmc2V0ID0gbGluay5lbmRPZmZzZXQgKyAxO1xuICB9XG5cbiAgZXh0cmFjdFRleHRMaW5rcyhzdHIsIHRleHRTdGFydE9mZnNldCwgc3RyLmxlbmd0aCAtIDEsIHRleHRMaW5rcyk7XG5cbiAgbGlua3MucHVzaCguLi50ZXh0TGlua3MpO1xuICBsaW5rcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgcmV0dXJuIGxpbmtzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMob3B0aW9uczogU2hvdWxkUmVzZXRBbGlhc09wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IG9wdGlvbnM7XG4gIGlmIChpc1dpa2lsaW5rID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgdGFyZ2V0UGF0aE9yRmlsZSwgdHJ1ZSk7XG4gIGNvbnN0IG5ld1NvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgbmV3U291cmNlRm9sZGVyID0gZGlybmFtZShuZXdTb3VyY2VQYXRoKTtcbiAgY29uc3Qgb2xkU291cmNlRm9sZGVyID0gZGlybmFtZShvbGRTb3VyY2VQYXRoKTtcbiAgY29uc3QgYWxpYXNlc1RvUmVzZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHBhdGhPckZpbGUgb2YgW3RhcmdldEZpbGUucGF0aCwgb2xkVGFyZ2V0UGF0aF0pIHtcbiAgICBpZiAoIXBhdGhPckZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHBhdGgpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChiYXNlbmFtZShwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG5ld1NvdXJjZUZvbGRlciwgcGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShvbGRTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBbb2xkU291cmNlUGF0aCwgbmV3U291cmNlUGF0aF0pIHtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcbiAgfVxuXG4gIGNvbnN0IGNsZWFuRGlzcGxheVRleHQgPSByZXBsYWNlQWxsKG5vcm1hbGl6ZVBhdGgoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcpWzBdID8/ICcnKSwgL15cXC5cXC8vZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZShsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW3RpdGxlXSg8bGluaz4pYCwgYCFbdGl0bGVdKDxsaW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RFbWJlZChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ0RvdChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLi8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RXaWtpbGluayhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmsob3B0aW9uczogVXBkYXRlTGlua09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcbiAgaWYgKCFuZXdUYXJnZXRQYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIGxpbmsub3JpZ2luYWw7XG4gIH1cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBuZXdUYXJnZXRQYXRoT3JGaWxlLCB0cnVlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gdGVzdFdpa2lsaW5rKGxpbmsub3JpZ2luYWwpICYmIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyAhPT0gdHJ1ZTtcbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgbGV0IHNob3VsZEtlZXBBbGlhcyA9ICFzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKSkge1xuICAgIGlmIChpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0RmlsZS5wYXRoICsgc3VicGF0aDtcbiAgICB9XG4gIH1cblxuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluaykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rLm9yaWdpbmFsKTtcbiAgICBpZiAocGFyc2VMaW5rUmVzdWx0Py5hbGlhcykge1xuICAgICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgICBzaG91bGRLZWVwQWxpYXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGFsaWFzID8/PSBzaG91bGRSZXNldEFsaWFzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRSZXNldEFsaWFzT3B0aW9ucz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgICBpc1dpa2lsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRUYXJnZXRQYXRoLFxuICAgICAgdGFyZ2V0UGF0aE9yRmlsZTogdGFyZ2V0RmlsZVxuICAgIH0pKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBsaW5rLmRpc3BsYXlUZXh0O1xuXG4gIGlmICghc2hvdWxkS2VlcEFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSB0YXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IHRhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXdMaW5rID0gZ2VuZXJhdGVNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucz4oe1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MgPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWwsXG4gICAgc291cmNlUGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGVcbiAgfSkpO1xuICByZXR1cm4gbmV3TGluaztcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCB1cGRhdGVkIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkNvbnRlbnQob3B0aW9uczogVXBkYXRlTGlua3NJbkNvbnRlbnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KGFwcCwgY29udGVudCwgKGxpbmspID0+IHtcbiAgICBjb25zdCBpc0VtYmVkTGluayA9IHRlc3RFbWJlZChsaW5rLm9yaWdpbmFsKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua09wdGlvbnM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUob3B0aW9uczogVXBkYXRlTGlua3NJbkZpbGVPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEZvcmNlTWFya2Rvd25MaW5rcyxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiAhYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGVkaXRMaW5rcyhhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUsIChsaW5rKSA9PiB7XG4gICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtPcHRpb25zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBzaG91bGRGb3JjZU1hcmtkb3duTGlua3MsXG4gICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgfSkpO1xuICB9LCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gX2ZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rcyh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcsIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayh2YWx1ZSk7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQgfHwgcGFyc2VMaW5rUmVzdWx0LmlzV2lraWxpbmsgfHwgcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzID8/PSBbXTtcbiAgICBsZXQgbGluayA9IGNhY2hlLmZyb250bWF0dGVyTGlua3MuZmluZCgoZnJvbnRtYXR0ZXJMaW5rKSA9PiBmcm9udG1hdHRlckxpbmsua2V5ID09PSBrZXkpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIGxpbms6ICcnLFxuICAgICAgICBvcmlnaW5hbDogJydcbiAgICAgIH07XG4gICAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgbGluay5saW5rID0gcGFyc2VMaW5rUmVzdWx0LnVybDtcbiAgICBsaW5rLm9yaWdpbmFsID0gdmFsdWU7XG4gICAgaWYgKHBhcnNlTGlua1Jlc3VsdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5rLmRpc3BsYXlUZXh0ID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaGFzRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgIGNvbnN0IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcyA9IF9maXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2hpbGRWYWx1ZSwga2V5ID8gYCR7a2V5fS4ke2NoaWxkS2V5fWAgOiBjaGlsZEtleSwgY2FjaGUpO1xuICAgIGhhc0Zyb250bWF0dGVyTGlua3MgfHw9IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcztcbiAgfVxuXG4gIHJldHVybiBoYXNGcm9udG1hdHRlckxpbmtzO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0VGV4dExpbmtzKHN0cjogc3RyaW5nLCBzdGFydE9mZnNldDogbnVtYmVyLCBlbmRPZmZzZXQ6IG51bWJlciwgdGV4dExpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSk6IHZvaWQge1xuICBpZiAoc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ZXh0UGFydCA9IHN0ci5zbGljZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0ICsgMSk7XG4gIHJlcGxhY2VBbGwodGV4dFBhcnQsIC8oPzxVcmw+XFxTKykvZywgKGFyZ3MsIHVybCkgPT4ge1xuICAgIGlmICghaXNVcmwodXJsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRMaW5rcy5wdXNoKHtcbiAgICAgIGVuY29kZWRVcmw6IGVuY29kZVVybCh1cmwpLFxuICAgICAgZW5kT2Zmc2V0OiBzdGFydE9mZnNldCArIGFyZ3Mub2Zmc2V0ICsgdXJsLmxlbmd0aCxcbiAgICAgIGhhc0FuZ2xlQnJhY2tldHM6IGZhbHNlLFxuICAgICAgaXNFbWJlZDogZmFsc2UsXG4gICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgICByYXc6IHVybCxcbiAgICAgIHN0YXJ0T2Zmc2V0OiBzdGFydE9mZnNldCArIGFyZ3Mub2Zmc2V0LFxuICAgICAgdXJsXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUxpbmtUZXh0KGFwcDogQXBwLCB0YXJnZXRGaWxlOiBURmlsZSwgc291cmNlUGF0aDogc3RyaW5nLCBzdWJwYXRoOiBzdHJpbmcsIGNvbmZpZzogTGlua0NvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChzb3VyY2VQYXRoID09PSAnLycpIHtcbiAgICBzb3VyY2VQYXRoID0gJyc7XG4gIH1cblxuICBsZXQgbGlua1RleHQ6IHN0cmluZztcblxuICBpZiAodGFyZ2V0RmlsZS5wYXRoID09PSBzb3VyY2VQYXRoICYmIHN1YnBhdGgpIHtcbiAgICBsaW5rVGV4dCA9IHN1YnBhdGg7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnNob3VsZEZvcmNlUmVsYXRpdmVQYXRoKSB7XG4gICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCBjb25maWcuaXNXaWtpbGluayA/IHRyaW1NYXJrZG93bkV4dGVuc2lvbihhcHAsIHRhcmdldEZpbGUpIDogdGFyZ2V0RmlsZS5wYXRoKSArIHN1YnBhdGg7XG4gIH0gZWxzZSB7XG4gICAgbGlua1RleHQgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dCh0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBjb25maWcuaXNXaWtpbGluaykgKyBzdWJwYXRoO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5zaG91bGRGb3JjZVJlbGF0aXZlUGF0aCAmJiBjb25maWcuc2hvdWxkVXNlTGVhZGluZ0RvdCAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnLicpICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcjJykpIHtcbiAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgfVxuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKG9wdGlvbnM6IEdlbmVyYXRlTWFya2Rvd25MaW5rT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIG9wdGlvbnMudGFyZ2V0UGF0aE9yRmlsZSwgb3B0aW9ucy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9wdGlvbnMuc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHN1YnBhdGggPSBvcHRpb25zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcob3B0aW9ucywgdGFyZ2V0RmlsZSk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dChhcHAsIHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIHN1YnBhdGgsIGxpbmtDb25maWcpO1xuXG4gIHJldHVybiBsaW5rQ29uZmlnLmlzV2lraWxpbmtcbiAgICA/IGdlbmVyYXRlV2lraUxpbmsobGlua1RleHQsIG9wdGlvbnMuYWxpYXMsIGxpbmtDb25maWcuaXNFbWJlZClcbiAgICA6IGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsobGlua1RleHQsIHRhcmdldEZpbGUsIG9wdGlvbnMsIGxpbmtDb25maWcpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKGxpbmtUZXh0OiBzdHJpbmcsIHRhcmdldEZpbGU6IFRGaWxlLCBvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMsIGNvbmZpZzogTGlua0NvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbWJlZFByZWZpeCA9IGNvbmZpZy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgY29uc3QgcHJvY2Vzc2VkTGlua1RleHQgPSBjb25maWcuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke2xpbmtUZXh0fT5gXG4gICAgOiBlbmNvZGVVcmwobGlua1RleHQpO1xuXG4gIGxldCBhbGlhcyA9IG9wdGlvbnMuYWxpYXMgPz8gJyc7XG4gIGlmICghYWxpYXMgJiYgKCFjb25maWcuaXNFbWJlZCB8fCAhb3B0aW9ucy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQpKSB7XG4gICAgYWxpYXMgPSAhb3B0aW9ucy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZShhcHAsIHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICB9XG5cbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7cHJvY2Vzc2VkTGlua1RleHR9KWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsobGlua1RleHQ6IHN0cmluZywgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZCwgaXNFbWJlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGVtYmVkUHJlZml4ID0gaXNFbWJlZCA/ICchJyA6ICcnO1xuICBjb25zdCBub3JtYWxpemVkQWxpYXMgPSBhbGlhcyA/PyAnJztcblxuICBpZiAobm9ybWFsaXplZEFsaWFzICYmIG5vcm1hbGl6ZWRBbGlhcy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtub3JtYWxpemVkQWxpYXN9XV1gO1xuICB9XG5cbiAgY29uc3QgYWxpYXNQYXJ0ID0gbm9ybWFsaXplZEFsaWFzID8gYHwke25vcm1hbGl6ZWRBbGlhc31gIDogJyc7XG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7bGlua1RleHR9JHthbGlhc1BhcnR9XV1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhcbiAgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCxcbiAgaXNDYW52YXNGaWxlQ2FjaGU6IGJvb2xlYW4sXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PixcbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlczogRmlsZUNoYW5nZVtdID0gW107XG5cbiAgY29uc3QgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSA9IChjYWNoZS5zZWN0aW9ucyA/PyBbXSkuZmlsdGVyKChzZWN0aW9uKSA9PiBzZWN0aW9uLnR5cGUgPT09ICd0YWJsZScpLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICBlbmQ6IHNlY3Rpb24ucG9zaXRpb24uZW5kLm9mZnNldCxcbiAgICBzdGFydDogc2VjdGlvbi5wb3NpdGlvbi5zdGFydC5vZmZzZXRcbiAgfSkpO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBnZXRBbGxMaW5rcyhjYWNoZSkpIHtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBsaW5rQ29udmVydGVyKGxpbmssIGFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDaGFuZ2UgPSByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgbmV3Q29udGVudCk7XG5cbiAgICBpZiAoaXNDYW52YXNGaWxlQ2FjaGUpIHtcbiAgICAgIGlmIChpc0NhbnZhc0NoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1Vuc3VwcG9ydGVkIGZpbGUgY2hhbmdlJywgZmlsZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhvcHRpb25zOiBHZW5lcmF0ZU1hcmtkb3duTGlua09wdGlvbnMsIHRhcmdldEZpbGU6IFRGaWxlKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBvcHRpb25zO1xuICByZXR1cm4ge1xuICAgIGlzRW1iZWQ6IG9wdGlvbnMuaXNFbWJlZCA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQob3B0aW9ucy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyAhaXNNYXJrZG93bkZpbGUoYXBwLCB0YXJnZXRGaWxlKSxcbiAgICBpc1dpa2lsaW5rOiBvcHRpb25zLmlzV2lraWxpbmsgPz8gKG9wdGlvbnMub3JpZ2luYWxMaW5rID8gdGVzdFdpa2lsaW5rKG9wdGlvbnMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCksXG4gICAgc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGg6IG9wdGlvbnMuc2hvdWxkRm9yY2VSZWxhdGl2ZVBhdGggPz8gc2hvdWxkVXNlUmVsYXRpdmVMaW5rcyhhcHApLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IG9wdGlvbnMuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0QW5nbGVCcmFja2V0cyhvcHRpb25zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3Q6IG9wdGlvbnMuc2hvdWxkVXNlTGVhZGluZ0RvdCA/PyAob3B0aW9ucy5vcmlnaW5hbExpbmsgPyB0ZXN0TGVhZGluZ0RvdChvcHRpb25zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJhd0xpbmsobm9kZTogTm9kZSwgc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3RyLnNsaWNlKG5vZGUucG9zaXRpb24/LnN0YXJ0Lm9mZnNldCA/PyAwLCBub2RlLnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpbmtOb2RlKG5vZGU6IExpbmssIHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICBjb25zdCBMSU5LX0FMSUFTX1NVRkZJWCA9ICddKCc7XG4gIGNvbnN0IExJTktfU1VGRklYID0gJyknO1xuICBjb25zdCByYXcgPSBnZXRSYXdMaW5rKG5vZGUsIHN0cik7XG4gIGNvbnN0IGFsaWFzTm9kZSA9IG5vZGUuY2hpbGRyZW5bMF0gYXMgVGV4dCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3VXJsID0gc3RyLnNsaWNlKChhbGlhc05vZGU/LnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDEpICsgTElOS19BTElBU19TVUZGSVgubGVuZ3RoLCAobm9kZS5wb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAwKSAtIExJTktfU1VGRklYLmxlbmd0aCk7XG4gIGNvbnN0IGhhc0FuZ2xlQnJhY2tldHMgPSByYXcuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpIHx8IHJhd1VybC5zdGFydHNXaXRoKE9QRU5fQU5HTEVfQlJBQ0tFVCk7XG4gIGNvbnN0IGlzRXh0ZXJuYWwgPSBpc1VybChub2RlLnVybCk7XG4gIGxldCB1cmwgPSBub2RlLnVybDtcbiAgaWYgKCFpc0V4dGVybmFsICYmICFoYXNBbmdsZUJyYWNrZXRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHVybCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIFVSTCAke3VybH1gLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IGFsaWFzTm9kZT8udmFsdWUsXG4gICAgZW5jb2RlZFVybDogaXNFeHRlcm5hbCA/IGVuY29kZVVybCh1cmwpIDogdW5kZWZpbmVkLFxuICAgIGVuZE9mZnNldDogbm9kZS5wb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAwLFxuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICByYXcsXG4gICAgc3RhcnRPZmZzZXQ6IG5vZGUucG9zaXRpb24/LnN0YXJ0Lm9mZnNldCA/PyAwLFxuICAgIHRpdGxlOiBub2RlLnRpdGxlID8/IHVuZGVmaW5lZCxcbiAgICB1cmxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lraWxpbmtOb2RlKG5vZGU6IFdpa2lMaW5rTm9kZSwgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzOiBzdHIuaW5jbHVkZXMoV0lLSUxJTktfRElWSURFUikgPyBub2RlLmRhdGEuYWxpYXMgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBub2RlLnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDAsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbDogZmFsc2UsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICByYXc6IGdldFJhd0xpbmsobm9kZSwgc3RyKSxcbiAgICBzdGFydE9mZnNldDogbm9kZS5wb3NpdGlvbj8uc3RhcnQub2Zmc2V0ID8/IDAsXG4gICAgdXJsOiBub2RlLnZhbHVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSk6IGJvb2xlYW4ge1xuICBpZiAoIWlzQ29udGVudENoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLnRlc3QoZmlsZUNoYW5nZS5uZXdDb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZVBvc2l0aW9ucy5zb21lKCh0YWJsZVBvc2l0aW9uKSA9PlxuICAgIHRhYmxlUG9zaXRpb24uc3RhcnQgPD0gZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0ICYmIGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gdGFibGVQb3NpdGlvbi5lbmRcbiAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFvQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLGNBQWM7QUFDdkIsT0FBTyxpQkFBaUI7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxhQUFhO0FBUXRCLFNBQVMsd0JBQXdCO0FBQ2pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsYUFBYTtBQUN0QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxNQUFNLDJCQUEyQjtBQU1qQyxNQUFNLDhCQUE4QjtBQUtwQyxNQUFNLHND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
@@ -3,7 +3,7 @@ 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
5
 
6
- (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
6
+ (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd(){return"/"},env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
8
  import {
9
9
  getLibDebugger,
@@ -54,4 +54,4 @@ async function invokeAsyncAndLog(title, fn, abortSignal, stackTrace) {
54
54
  export {
55
55
  invokeAsyncAndLog
56
56
  };
57
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xvZ2dlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgbG9nZ2luZyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBnZXRMaWJEZWJ1Z2dlcixcbiAgcHJpbnRXaXRoU3RhY2tUcmFjZVxufSBmcm9tICcuLi9EZWJ1Zy50cyc7XG5pbXBvcnQgeyBnZXRTdGFja1RyYWNlIH0gZnJvbSAnLi4vRXJyb3IudHMnO1xuLyoqXG4gKiBJbnZva2VzIGEgZnVuY3Rpb24gYW5kIGxvZ3MgdGhlIHN0YXJ0LCBlbmQsIGFuZCBkdXJhdGlvbiBvZiB0aGUgaW52b2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gdGl0bGUgLSBUaGUgdGl0bGUgb2YgdGhlIGxvZy5cbiAqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52b2tlQXN5bmNBbmRMb2coXG4gIHRpdGxlOiBzdHJpbmcsXG4gIGZuOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwsXG4gIHN0YWNrVHJhY2U/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBjb25zdCBpbnZva2VBc3luY0FuZExvZ0RlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0xvZ2dlcjppbnZva2VBc3luY0FuZExvZycpO1xuICBjb25zdCB0aW1lc3RhbXBTdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICBwcmludFdpdGhTdGFja1RyYWNlKGludm9rZUFzeW5jQW5kTG9nRGVidWdnZXIsIHN0YWNrVHJhY2UsIGAke3RpdGxlfTpzdGFydGAsIHtcbiAgICBmbixcbiAgICB0aW1lc3RhbXBTdGFydFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmbihhYm9ydFNpZ25hbCk7XG4gICAgY29uc3QgdGltZXN0YW1wRW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aW1lc3RhbXBFbmQgLSB0aW1lc3RhbXBTdGFydDtcbiAgICBpZiAoYWJvcnRTaWduYWwuYWJvcnRlZCkge1xuICAgICAgcHJpbnRXaXRoU3RhY2tUcmFjZShpbnZva2VBc3luY0FuZExvZ0RlYnVnZ2VyLCBzdGFja1RyYWNlLCBgJHt0aXRsZX06YWJvcnRlZGAsIHtcbiAgICAgICAgYWJvcnRSZWFzb246IGFib3J0U2lnbmFsLnJlYXNvbiBhcyB1bmtub3duLFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgZm4sXG4gICAgICAgIHRpbWVzdGFtcEVuZCxcbiAgICAgICAgdGltZXN0YW1wU3RhcnRcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB9XG4gICAgcHJpbnRXaXRoU3RhY2tUcmFjZShpbnZva2VBc3luY0FuZExvZ0RlYnVnZ2VyLCBzdGFja1RyYWNlLCBgJHt0aXRsZX06ZW5kYCwge1xuICAgICAgZHVyYXRpb24sXG4gICAgICBmbixcbiAgICAgIHRpbWVzdGFtcEVuZCxcbiAgICAgIHRpbWVzdGFtcFN0YXJ0XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgdGltZXN0YW1wRW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgcHJpbnRXaXRoU3RhY2tUcmFjZShpbnZva2VBc3luY0FuZExvZ0RlYnVnZ2VyLCBzdGFja1RyYWNlLCBgJHt0aXRsZX06ZXJyb3JgLCB7XG4gICAgICBkdXJhdGlvbjogdGltZXN0YW1wRW5kIC0gdGltZXN0YW1wU3RhcnQsXG4gICAgICBlcnJvcixcbiAgICAgIGZuLFxuICAgICAgdGltZXN0YW1wRW5kLFxuICAgICAgdGltZXN0YW1wU3RhcnRcbiAgICB9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxxQkFBcUI7QUFTOUIsZUFBc0Isa0JBQ3BCLE9BQ0EsSUFDQSxhQUNBLFlBQ2U7QUFDZixjQUFZLGVBQWU7QUFDM0IsUUFBTSw0QkFBNEIsZUFBZSwwQkFBMEI7QUFDM0UsUUFBTSxpQkFBaUIsWUFBWSxJQUFJO0FBQ3ZDLGlCQUFlLGNBQWMsQ0FBQztBQUM5QixzQkFBb0IsMkJBQTJCLFlBQVksR0FBRyxLQUFLLFVBQVU7QUFBQSxJQUMzRTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDRCxNQUFJO0FBQ0YsVUFBTSxHQUFHLFdBQVc7QUFDcEIsVUFBTSxlQUFlLFlBQVksSUFBSTtBQUNyQyxVQUFNLFdBQVcsZUFBZTtBQUNoQyxRQUFJLFlBQVksU0FBUztBQUN2QiwwQkFBb0IsMkJBQTJCLFlBQVksR0FBRyxLQUFLLFlBQVk7QUFBQSxRQUM3RSxhQUFhLFlBQVk7QUFBQSxRQUN6QjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQztBQUNELGtCQUFZLGVBQWU7QUFBQSxJQUM3QjtBQUNBLHdCQUFvQiwyQkFBMkIsWUFBWSxHQUFHLEtBQUssUUFBUTtBQUFBLE1BQ3pFO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSCxTQUFTLE9BQU87QUFDZCxVQUFNLGVBQWUsWUFBWSxJQUFJO0FBQ3JDLHdCQUFvQiwyQkFBMkIsWUFBWSxHQUFHLEtBQUssVUFBVTtBQUFBLE1BQzNFLFVBQVUsZUFBZTtBQUFBLE1BQ3pCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBQ0QsVUFBTTtBQUFBLEVBQ1I7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
57
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xvZ2dlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgbG9nZ2luZyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBnZXRMaWJEZWJ1Z2dlcixcbiAgcHJpbnRXaXRoU3RhY2tUcmFjZVxufSBmcm9tICcuLi9EZWJ1Zy50cyc7XG5pbXBvcnQgeyBnZXRTdGFja1RyYWNlIH0gZnJvbSAnLi4vRXJyb3IudHMnO1xuXG4vKipcbiAqIEludm9rZXMgYSBmdW5jdGlvbiBhbmQgbG9ncyB0aGUgc3RhcnQsIGVuZCwgYW5kIGR1cmF0aW9uIG9mIHRoZSBpbnZvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB0aXRsZSAtIFRoZSB0aXRsZSBvZiB0aGUgbG9nLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSBhYm9ydFNpZ25hbCAtIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gT3B0aW9uYWwgc3RhY2sgdHJhY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZva2VBc3luY0FuZExvZyhcbiAgdGl0bGU6IHN0cmluZyxcbiAgZm46IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8dm9pZD4sXG4gIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgc3RhY2tUcmFjZT86IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gIGNvbnN0IGludm9rZUFzeW5jQW5kTG9nRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignTG9nZ2VyOmludm9rZUFzeW5jQW5kTG9nJyk7XG4gIGNvbnN0IHRpbWVzdGFtcFN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIHByaW50V2l0aFN0YWNrVHJhY2UoaW52b2tlQXN5bmNBbmRMb2dEZWJ1Z2dlciwgc3RhY2tUcmFjZSwgYCR7dGl0bGV9OnN0YXJ0YCwge1xuICAgIGZuLFxuICAgIHRpbWVzdGFtcFN0YXJ0XG4gIH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZuKGFib3J0U2lnbmFsKTtcbiAgICBjb25zdCB0aW1lc3RhbXBFbmQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBkdXJhdGlvbiA9IHRpbWVzdGFtcEVuZCAtIHRpbWVzdGFtcFN0YXJ0O1xuICAgIGlmIChhYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBwcmludFdpdGhTdGFja1RyYWNlKGludm9rZUFzeW5jQW5kTG9nRGVidWdnZXIsIHN0YWNrVHJhY2UsIGAke3RpdGxlfTphYm9ydGVkYCwge1xuICAgICAgICBhYm9ydFJlYXNvbjogYWJvcnRTaWduYWwucmVhc29uIGFzIHVua25vd24sXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBmbixcbiAgICAgICAgdGltZXN0YW1wRW5kLFxuICAgICAgICB0aW1lc3RhbXBTdGFydFxuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIH1cbiAgICBwcmludFdpdGhTdGFja1RyYWNlKGludm9rZUFzeW5jQW5kTG9nRGVidWdnZXIsIHN0YWNrVHJhY2UsIGAke3RpdGxlfTplbmRgLCB7XG4gICAgICBkdXJhdGlvbixcbiAgICAgIGZuLFxuICAgICAgdGltZXN0YW1wRW5kLFxuICAgICAgdGltZXN0YW1wU3RhcnRcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCB0aW1lc3RhbXBFbmQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBwcmludFdpdGhTdGFja1RyYWNlKGludm9rZUFzeW5jQW5kTG9nRGVidWdnZXIsIHN0YWNrVHJhY2UsIGAke3RpdGxlfTplcnJvcmAsIHtcbiAgICAgIGR1cmF0aW9uOiB0aW1lc3RhbXBFbmQgLSB0aW1lc3RhbXBTdGFydCxcbiAgICAgIGVycm9yLFxuICAgICAgZm4sXG4gICAgICB0aW1lc3RhbXBFbmQsXG4gICAgICB0aW1lc3RhbXBTdGFydFxuICAgIH0pO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBUUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHFCQUFxQjtBQVU5QixlQUFzQixrQkFDcEIsT0FDQSxJQUNBLGFBQ0EsWUFDZTtBQUNmLGNBQVksZUFBZTtBQUMzQixRQUFNLDRCQUE0QixlQUFlLDBCQUEwQjtBQUMzRSxRQUFNLGlCQUFpQixZQUFZLElBQUk7QUFDdkMsaUJBQWUsY0FBYyxDQUFDO0FBQzlCLHNCQUFvQiwyQkFBMkIsWUFBWSxHQUFHLEtBQUssVUFBVTtBQUFBLElBQzNFO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUNELE1BQUk7QUFDRixVQUFNLEdBQUcsV0FBVztBQUNwQixVQUFNLGVBQWUsWUFBWSxJQUFJO0FBQ3JDLFVBQU0sV0FBVyxlQUFlO0FBQ2hDLFFBQUksWUFBWSxTQUFTO0FBQ3ZCLDBCQUFvQiwyQkFBMkIsWUFBWSxHQUFHLEtBQUssWUFBWTtBQUFBLFFBQzdFLGFBQWEsWUFBWTtBQUFBLFFBQ3pCO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDO0FBQ0Qsa0JBQVksZUFBZTtBQUFBLElBQzdCO0FBQ0Esd0JBQW9CLDJCQUEyQixZQUFZLEdBQUcsS0FBSyxRQUFRO0FBQUEsTUFDekU7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNILFNBQVMsT0FBTztBQUNkLFVBQU0sZUFBZSxZQUFZLElBQUk7QUFDckMsd0JBQW9CLDJCQUEyQixZQUFZLEdBQUcsS0FBSyxVQUFVO0FBQUEsTUFDM0UsVUFBVSxlQUFlO0FBQUEsTUFDekI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFDRCxVQUFNO0FBQUEsRUFDUjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=