obsidian-dev-utils 22.1.1-beta.8 → 23.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/dist/eslint.config.mts +2 -0
  3. package/dist/lib/cjs/@types/debug.d.cts +1 -0
  4. package/dist/lib/cjs/{obsidian/Components/PlaceholderComponent.cjs → Array.cjs} +18 -8
  5. package/dist/lib/cjs/Array.d.cts +12 -0
  6. package/dist/lib/cjs/Async.cjs +6 -1
  7. package/dist/lib/cjs/Async.d.cts +26 -18
  8. package/dist/lib/cjs/AsyncEvents.cjs +216 -0
  9. package/dist/lib/cjs/AsyncEvents.d.cts +144 -0
  10. package/dist/lib/cjs/Blob.cjs +1 -1
  11. package/dist/lib/cjs/Blob.d.cts +9 -8
  12. package/dist/lib/cjs/CssClass.cjs +5 -1
  13. package/dist/lib/cjs/CssClass.d.cts +18 -1
  14. package/dist/lib/cjs/Debug.cjs +1 -1
  15. package/dist/lib/cjs/Debug.d.cts +2 -1
  16. package/dist/lib/cjs/DebugController.cjs +1 -1
  17. package/dist/lib/cjs/DebugController.d.cts +1 -0
  18. package/dist/lib/cjs/Enum.cjs +1 -1
  19. package/dist/lib/cjs/Enum.d.cts +2 -1
  20. package/dist/lib/cjs/Error.cjs +8 -6
  21. package/dist/lib/cjs/Error.d.cts +3 -2
  22. package/dist/lib/cjs/Function.cjs +1 -1
  23. package/dist/lib/cjs/Function.d.cts +2 -1
  24. package/dist/lib/cjs/HTMLElement.cjs +1 -1
  25. package/dist/lib/cjs/HTMLElement.d.cts +4 -2
  26. package/dist/lib/cjs/Library.cjs +2 -2
  27. package/dist/lib/cjs/Library.d.cts +2 -1
  28. package/dist/lib/cjs/Object.cjs +38 -3
  29. package/dist/lib/cjs/Object.d.cts +18 -13
  30. package/dist/lib/cjs/Path.cjs +2 -2
  31. package/dist/lib/cjs/Path.d.cts +2 -1
  32. package/dist/lib/cjs/RegExp.cjs +1 -1
  33. package/dist/lib/cjs/RegExp.d.cts +2 -1
  34. package/dist/lib/cjs/ScriptUtils/CliUtils.cjs +7 -7
  35. package/dist/lib/cjs/ScriptUtils/CliUtils.d.cts +12 -11
  36. package/dist/lib/cjs/ScriptUtils/CodeGenerator.cjs +1 -1
  37. package/dist/lib/cjs/ScriptUtils/CodeGenerator.d.cts +3 -2
  38. package/dist/lib/cjs/ScriptUtils/ESLint/@types/@guardian__eslint-plugin-tsdoc-required.d.cts +1 -0
  39. package/dist/lib/cjs/ScriptUtils/ESLint/@types/eslint-plugin-modules-newlines.d.cts +1 -0
  40. package/dist/lib/cjs/ScriptUtils/ESLint/@types/eslint-plugin-verify-tsdoc.d.cts +1 -0
  41. package/dist/lib/cjs/ScriptUtils/ESLint/ESLint.cjs +1 -1
  42. package/dist/lib/cjs/ScriptUtils/ESLint/ESLint.d.cts +2 -1
  43. package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.cjs +13 -10
  44. package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.d.cts +2 -3
  45. package/dist/lib/cjs/ScriptUtils/Exec.cjs +1 -1
  46. package/dist/lib/cjs/ScriptUtils/Exec.d.cts +4 -3
  47. package/dist/lib/cjs/ScriptUtils/Fs.cjs +1 -1
  48. package/dist/lib/cjs/ScriptUtils/Fs.d.cts +5 -4
  49. package/dist/lib/cjs/ScriptUtils/JSON.cjs +1 -1
  50. package/dist/lib/cjs/ScriptUtils/JSON.d.cts +5 -4
  51. package/dist/lib/cjs/ScriptUtils/NodeModules.cjs +1 -1
  52. package/dist/lib/cjs/ScriptUtils/NodeModules.d.cts +2 -1
  53. package/dist/lib/cjs/ScriptUtils/Npm.cjs +1 -1
  54. package/dist/lib/cjs/ScriptUtils/Npm.d.cts +9 -10
  55. package/dist/lib/cjs/ScriptUtils/NpmPublish.cjs +1 -1
  56. package/dist/lib/cjs/ScriptUtils/NpmPublish.d.cts +3 -1
  57. package/dist/lib/cjs/ScriptUtils/NpmRun.cjs +1 -1
  58. package/dist/lib/cjs/ScriptUtils/NpmRun.d.cts +5 -0
  59. package/dist/lib/cjs/ScriptUtils/ObsidianDevUtilsRepoPaths.cjs +1 -10
  60. package/dist/lib/cjs/ScriptUtils/ObsidianDevUtilsRepoPaths.d.cts +45 -61
  61. package/dist/lib/cjs/ScriptUtils/Root.cjs +1 -1
  62. package/dist/lib/cjs/ScriptUtils/Root.d.cts +4 -3
  63. package/dist/lib/cjs/ScriptUtils/build.cjs +1 -1
  64. package/dist/lib/cjs/ScriptUtils/build.d.cts +7 -6
  65. package/dist/lib/cjs/ScriptUtils/cli.cjs +1 -1
  66. package/dist/lib/cjs/ScriptUtils/cli.d.cts +2 -1
  67. package/dist/lib/cjs/ScriptUtils/esbuild/Dependency.cjs +1 -1
  68. package/dist/lib/cjs/ScriptUtils/esbuild/Dependency.d.cts +4 -3
  69. package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.cjs +1 -1
  70. package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.d.cts +4 -3
  71. package/dist/lib/cjs/ScriptUtils/esbuild/changeExtensionPlugin.cjs +1 -1
  72. package/dist/lib/cjs/ScriptUtils/esbuild/changeExtensionPlugin.d.cts +2 -1
  73. package/dist/lib/cjs/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.cjs +1 -1
  74. package/dist/lib/cjs/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.d.cts +2 -1
  75. package/dist/lib/cjs/ScriptUtils/esbuild/customEsbuildOptionsPlugin.cjs +1 -1
  76. package/dist/lib/cjs/ScriptUtils/esbuild/customEsbuildOptionsPlugin.d.cts +2 -1
  77. package/dist/lib/cjs/ScriptUtils/esbuild/fixEsmPlugin.cjs +1 -1
  78. package/dist/lib/cjs/ScriptUtils/esbuild/fixEsmPlugin.d.cts +2 -1
  79. package/dist/lib/cjs/ScriptUtils/esbuild/fixSourceMapsPlugin.cjs +1 -1
  80. package/dist/lib/cjs/ScriptUtils/esbuild/fixSourceMapsPlugin.d.cts +2 -1
  81. package/dist/lib/cjs/ScriptUtils/esbuild/preprocessPlugin.cjs +1 -1
  82. package/dist/lib/cjs/ScriptUtils/esbuild/preprocessPlugin.d.cts +2 -1
  83. package/dist/lib/cjs/ScriptUtils/esbuild/renameCssPlugin.cjs +1 -1
  84. package/dist/lib/cjs/ScriptUtils/esbuild/renameCssPlugin.d.cts +5 -0
  85. package/dist/lib/cjs/ScriptUtils/esbuild/svelteWrapperPlugin.cjs +1 -1
  86. package/dist/lib/cjs/ScriptUtils/esbuild/svelteWrapperPlugin.d.cts +5 -0
  87. package/dist/lib/cjs/ScriptUtils/format.cjs +1 -1
  88. package/dist/lib/cjs/ScriptUtils/format.d.cts +4 -2
  89. package/dist/lib/cjs/ScriptUtils/spellcheck.cjs +1 -1
  90. package/dist/lib/cjs/ScriptUtils/spellcheck.d.cts +4 -3
  91. package/dist/lib/cjs/ScriptUtils/version.cjs +1 -1
  92. package/dist/lib/cjs/ScriptUtils/version.d.cts +12 -11
  93. package/dist/lib/cjs/String.cjs +1 -1
  94. package/dist/lib/cjs/String.d.cts +4 -3
  95. package/dist/lib/cjs/Transformers/DateTransformer.cjs +3 -1
  96. package/dist/lib/cjs/Transformers/DateTransformer.d.cts +4 -1
  97. package/dist/lib/cjs/Transformers/DurationTransformer.cjs +5 -1
  98. package/dist/lib/cjs/Transformers/DurationTransformer.d.cts +6 -1
  99. package/dist/lib/cjs/Transformers/GroupTransformer.cjs +7 -4
  100. package/dist/lib/cjs/Transformers/GroupTransformer.d.cts +9 -5
  101. package/dist/lib/cjs/Transformers/SkipPrivatePropertyTransformer.cjs +3 -1
  102. package/dist/lib/cjs/Transformers/SkipPrivatePropertyTransformer.d.cts +4 -1
  103. package/dist/lib/cjs/Transformers/Transformer.cjs +9 -2
  104. package/dist/lib/cjs/Transformers/Transformer.d.cts +2 -1
  105. package/dist/lib/cjs/Transformers/TypedTransformer.cjs +1 -1
  106. package/dist/lib/cjs/Transformers/TypedTransformer.d.cts +2 -1
  107. package/dist/lib/cjs/Type.cjs +24 -0
  108. package/dist/lib/cjs/Type.d.cts +17 -0
  109. package/dist/lib/cjs/ValueProvider.cjs +1 -1
  110. package/dist/lib/cjs/ValueProvider.d.cts +3 -2
  111. package/dist/lib/cjs/codemirror/StateFieldSpec.cjs +1 -1
  112. package/dist/lib/cjs/codemirror/StateFieldSpec.d.cts +2 -1
  113. package/dist/lib/cjs/index.cjs +10 -1
  114. package/dist/lib/cjs/index.d.cts +3 -0
  115. package/dist/lib/cjs/obsidian/App.cjs +1 -1
  116. package/dist/lib/cjs/obsidian/App.d.cts +2 -1
  117. package/dist/lib/cjs/obsidian/AttachmentPath.cjs +1 -1
  118. package/dist/lib/cjs/obsidian/AttachmentPath.d.cts +7 -5
  119. package/dist/lib/cjs/obsidian/Backlink.cjs +1 -1
  120. package/dist/lib/cjs/obsidian/Backlink.d.cts +3 -2
  121. package/dist/lib/cjs/obsidian/Callout.cjs +1 -1
  122. package/dist/lib/cjs/obsidian/Callout.d.cts +3 -2
  123. package/dist/lib/cjs/obsidian/Components/CheckboxComponent.cjs +99 -0
  124. package/dist/lib/cjs/obsidian/Components/CheckboxComponent.d.cts +59 -0
  125. package/dist/lib/cjs/obsidian/Components/DateComponent.cjs +1 -1
  126. package/dist/lib/cjs/obsidian/Components/DateComponent.d.cts +2 -1
  127. package/dist/lib/cjs/obsidian/Components/DateTimeComponent.cjs +1 -1
  128. package/dist/lib/cjs/obsidian/Components/DateTimeComponent.d.cts +2 -1
  129. package/dist/lib/cjs/obsidian/Components/EmailComponent.cjs +1 -1
  130. package/dist/lib/cjs/obsidian/Components/EmailComponent.d.cts +2 -1
  131. package/dist/lib/cjs/obsidian/Components/FileComponent.cjs +1 -1
  132. package/dist/lib/cjs/obsidian/Components/FileComponent.d.cts +2 -1
  133. package/dist/lib/cjs/obsidian/Components/MonthComponent.cjs +1 -1
  134. package/dist/lib/cjs/obsidian/Components/MonthComponent.d.cts +2 -1
  135. package/dist/lib/cjs/obsidian/Components/MultipleDropdownComponent.cjs +4 -2
  136. package/dist/lib/cjs/obsidian/Components/MultipleDropdownComponent.d.cts +4 -1
  137. package/dist/lib/cjs/obsidian/Components/MultipleEmailComponent.cjs +1 -1
  138. package/dist/lib/cjs/obsidian/Components/MultipleEmailComponent.d.cts +2 -1
  139. package/dist/lib/cjs/obsidian/Components/MultipleFileComponent.cjs +1 -1
  140. package/dist/lib/cjs/obsidian/Components/MultipleFileComponent.d.cts +2 -1
  141. package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.cjs +30 -3
  142. package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.d.cts +22 -3
  143. package/dist/lib/cjs/obsidian/Components/NumberComponent.cjs +1 -1
  144. package/dist/lib/cjs/obsidian/Components/NumberComponent.d.cts +2 -1
  145. package/dist/lib/cjs/obsidian/Components/TextBasedComponent.cjs +65 -0
  146. package/dist/lib/cjs/obsidian/Components/TextBasedComponent.d.cts +37 -0
  147. package/dist/lib/cjs/obsidian/Components/TimeComponent.cjs +1 -1
  148. package/dist/lib/cjs/obsidian/Components/TimeComponent.d.cts +2 -1
  149. package/dist/lib/cjs/obsidian/Components/TriStateCheckboxComponent.cjs +100 -0
  150. package/dist/lib/cjs/obsidian/Components/TriStateCheckboxComponent.d.cts +59 -0
  151. package/dist/lib/cjs/obsidian/Components/TypedDropdownComponent.cjs +129 -0
  152. package/dist/lib/cjs/obsidian/Components/TypedDropdownComponent.d.cts +78 -0
  153. package/dist/lib/cjs/obsidian/Components/TypedMultipleDropdownComponent.cjs +131 -0
  154. package/dist/lib/cjs/obsidian/Components/TypedMultipleDropdownComponent.d.cts +79 -0
  155. package/dist/lib/cjs/obsidian/Components/TypedRangeTextComponent.cjs +1 -1
  156. package/dist/lib/cjs/obsidian/Components/TypedRangeTextComponent.d.cts +4 -1
  157. package/dist/lib/cjs/obsidian/Components/TypedTextComponent.cjs +30 -4
  158. package/dist/lib/cjs/obsidian/Components/TypedTextComponent.d.cts +25 -3
  159. package/dist/lib/cjs/obsidian/Components/UrlComponent.cjs +1 -1
  160. package/dist/lib/cjs/obsidian/Components/UrlComponent.d.cts +2 -1
  161. package/dist/lib/cjs/obsidian/Components/ValidatorComponent.cjs +23 -29
  162. package/dist/lib/cjs/obsidian/Components/ValidatorComponent.d.cts +6 -6
  163. package/dist/lib/cjs/obsidian/Components/ValueComponentWithChangeTracking.cjs +1 -1
  164. package/dist/lib/cjs/obsidian/Components/ValueComponentWithChangeTracking.d.cts +4 -1
  165. package/dist/lib/cjs/obsidian/Components/WeekComponent.cjs +1 -1
  166. package/dist/lib/cjs/obsidian/Components/WeekComponent.d.cts +2 -1
  167. package/dist/lib/cjs/obsidian/Components/index.cjs +16 -4
  168. package/dist/lib/cjs/obsidian/Components/index.d.cts +5 -1
  169. package/dist/lib/cjs/obsidian/Dataview.cjs +1 -1
  170. package/dist/lib/cjs/obsidian/Dataview.d.cts +11 -12
  171. package/dist/lib/cjs/obsidian/DataviewLink.cjs +1 -1
  172. package/dist/lib/cjs/obsidian/DataviewLink.d.cts +4 -3
  173. package/dist/lib/cjs/obsidian/FileChange.cjs +1 -1
  174. package/dist/lib/cjs/obsidian/FileChange.d.cts +4 -3
  175. package/dist/lib/cjs/obsidian/FileManager.cjs +1 -1
  176. package/dist/lib/cjs/obsidian/FileManager.d.cts +6 -5
  177. package/dist/lib/cjs/obsidian/FileSystem.cjs +1 -1
  178. package/dist/lib/cjs/obsidian/FileSystem.d.cts +3 -1
  179. package/dist/lib/cjs/obsidian/Frontmatter.cjs +1 -1
  180. package/dist/lib/cjs/obsidian/Frontmatter.d.cts +5 -1
  181. package/dist/lib/cjs/obsidian/Link.cjs +1 -1
  182. package/dist/lib/cjs/obsidian/Link.d.cts +7 -6
  183. package/dist/lib/cjs/obsidian/Logger.cjs +1 -1
  184. package/dist/lib/cjs/obsidian/Logger.d.cts +2 -1
  185. package/dist/lib/cjs/obsidian/Loop.cjs +1 -1
  186. package/dist/lib/cjs/obsidian/Loop.d.cts +2 -1
  187. package/dist/lib/cjs/obsidian/Markdown.cjs +5 -8
  188. package/dist/lib/cjs/obsidian/Markdown.d.cts +2 -1
  189. package/dist/lib/cjs/obsidian/MarkdownCodeBlockProcessor.cjs +1 -1
  190. package/dist/lib/cjs/obsidian/MarkdownCodeBlockProcessor.d.cts +2 -1
  191. package/dist/lib/cjs/obsidian/MarkdownView.cjs +1 -1
  192. package/dist/lib/cjs/obsidian/MarkdownView.d.cts +2 -1
  193. package/dist/lib/cjs/obsidian/MetadataCache.cjs +1 -1
  194. package/dist/lib/cjs/obsidian/MetadataCache.d.cts +7 -5
  195. package/dist/lib/cjs/obsidian/Modals/Alert.cjs +3 -1
  196. package/dist/lib/cjs/obsidian/Modals/Alert.d.cts +3 -2
  197. package/dist/lib/cjs/obsidian/Modals/Confirm.cjs +3 -1
  198. package/dist/lib/cjs/obsidian/Modals/Confirm.d.cts +3 -2
  199. package/dist/lib/cjs/obsidian/Modals/ModalBase.cjs +1 -1
  200. package/dist/lib/cjs/obsidian/Modals/ModalBase.d.cts +2 -2
  201. package/dist/lib/cjs/obsidian/Modals/Prompt.cjs +3 -1
  202. package/dist/lib/cjs/obsidian/Modals/Prompt.d.cts +5 -3
  203. package/dist/lib/cjs/obsidian/Modals/SelectItem.cjs +2 -1
  204. package/dist/lib/cjs/obsidian/Modals/SelectItem.d.cts +4 -2
  205. package/dist/lib/cjs/obsidian/MonkeyAround.cjs +1 -1
  206. package/dist/lib/cjs/obsidian/MonkeyAround.d.cts +5 -3
  207. package/dist/lib/cjs/obsidian/ObsidianSettings.cjs +1 -1
  208. package/dist/lib/cjs/obsidian/ObsidianSettings.d.cts +3 -0
  209. package/dist/lib/cjs/obsidian/Pdf.cjs +1 -1
  210. package/dist/lib/cjs/obsidian/Pdf.d.cts +2 -1
  211. package/dist/lib/cjs/obsidian/Plugin/ObsidianPluginRepoPaths.cjs +6 -2
  212. package/dist/lib/cjs/obsidian/Plugin/ObsidianPluginRepoPaths.d.cts +38 -29
  213. package/dist/lib/cjs/obsidian/Plugin/Plugin.cjs +1 -1
  214. package/dist/lib/cjs/obsidian/Plugin/Plugin.d.cts +4 -3
  215. package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +121 -32
  216. package/dist/lib/cjs/obsidian/Plugin/PluginBase.d.cts +52 -21
  217. package/dist/lib/cjs/obsidian/Plugin/PluginContext.cjs +1 -1
  218. package/dist/lib/cjs/obsidian/Plugin/PluginContext.d.cts +2 -1
  219. package/dist/lib/cjs/obsidian/Plugin/PluginId.cjs +1 -1
  220. package/dist/lib/cjs/obsidian/Plugin/PluginId.d.cts +2 -1
  221. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs +88 -55
  222. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts +42 -22
  223. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +29 -13
  224. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.d.cts +18 -11
  225. package/dist/lib/cjs/obsidian/Plugin/PluginTypesBase.cjs +24 -0
  226. package/dist/lib/cjs/obsidian/Plugin/PluginTypesBase.d.cts +55 -0
  227. package/dist/lib/cjs/obsidian/Plugin/index.cjs +6 -3
  228. package/dist/lib/cjs/obsidian/Plugin/index.d.cts +1 -0
  229. package/dist/lib/cjs/obsidian/Queue.cjs +1 -1
  230. package/dist/lib/cjs/obsidian/Queue.d.cts +3 -2
  231. package/dist/lib/cjs/obsidian/React/AppContext.cjs +3 -3
  232. package/dist/lib/cjs/obsidian/React/AppContext.d.cts +8 -1
  233. package/dist/lib/cjs/obsidian/Reference.cjs +1 -1
  234. package/dist/lib/cjs/obsidian/Reference.d.cts +2 -1
  235. package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +75 -75
  236. package/dist/lib/cjs/obsidian/RenameDeleteHandler.d.cts +3 -2
  237. package/dist/lib/cjs/obsidian/ResourceUrl.cjs +1 -1
  238. package/dist/lib/cjs/obsidian/ResourceUrl.d.cts +2 -1
  239. package/dist/lib/cjs/obsidian/SettingEx.cjs +41 -1
  240. package/dist/lib/cjs/obsidian/SettingEx.d.cts +35 -2
  241. package/dist/lib/cjs/obsidian/ValidationMessage.cjs +1 -1
  242. package/dist/lib/cjs/obsidian/ValidationMessage.d.cts +5 -0
  243. package/dist/lib/cjs/obsidian/Vault.cjs +1 -1
  244. package/dist/lib/cjs/obsidian/Vault.d.cts +15 -10
  245. package/dist/lib/cjs/obsidian/VaultEx.cjs +1 -1
  246. package/dist/lib/cjs/obsidian/VaultEx.d.cts +4 -3
  247. package/dist/lib/cjs/url.cjs +1 -1
  248. package/dist/lib/cjs/url.d.cts +2 -1
  249. package/dist/lib/esm/@types/debug.d.mts +1 -0
  250. package/dist/lib/esm/Array.d.mts +12 -0
  251. package/dist/lib/esm/Array.mjs +24 -0
  252. package/dist/lib/esm/Async.d.mts +26 -18
  253. package/dist/lib/esm/Async.mjs +5 -1
  254. package/dist/lib/esm/AsyncEvents.d.mts +144 -0
  255. package/dist/lib/esm/AsyncEvents.mjs +192 -0
  256. package/dist/lib/esm/Blob.d.mts +9 -8
  257. package/dist/lib/esm/Blob.mjs +1 -1
  258. package/dist/lib/esm/CssClass.d.mts +18 -1
  259. package/dist/lib/esm/CssClass.mjs +5 -1
  260. package/dist/lib/esm/Debug.d.mts +2 -1
  261. package/dist/lib/esm/Debug.mjs +1 -1
  262. package/dist/lib/esm/DebugController.d.mts +1 -0
  263. package/dist/lib/esm/Enum.d.mts +2 -1
  264. package/dist/lib/esm/Enum.mjs +1 -1
  265. package/dist/lib/esm/Error.d.mts +3 -2
  266. package/dist/lib/esm/Error.mjs +8 -6
  267. package/dist/lib/esm/Function.d.mts +2 -1
  268. package/dist/lib/esm/Function.mjs +1 -1
  269. package/dist/lib/esm/HTMLElement.d.mts +4 -2
  270. package/dist/lib/esm/HTMLElement.mjs +1 -1
  271. package/dist/lib/esm/Library.d.mts +2 -1
  272. package/dist/lib/esm/Library.mjs +2 -2
  273. package/dist/lib/esm/Object.d.mts +18 -13
  274. package/dist/lib/esm/Object.mjs +36 -3
  275. package/dist/lib/esm/Path.d.mts +2 -1
  276. package/dist/lib/esm/Path.mjs +2 -2
  277. package/dist/lib/esm/RegExp.d.mts +2 -1
  278. package/dist/lib/esm/RegExp.mjs +1 -1
  279. package/dist/lib/esm/ScriptUtils/CliUtils.d.mts +12 -11
  280. package/dist/lib/esm/ScriptUtils/CliUtils.mjs +7 -7
  281. package/dist/lib/esm/ScriptUtils/CodeGenerator.d.mts +3 -2
  282. package/dist/lib/esm/ScriptUtils/CodeGenerator.mjs +1 -1
  283. package/dist/lib/esm/ScriptUtils/ESLint/@types/@guardian__eslint-plugin-tsdoc-required.d.mts +1 -0
  284. package/dist/lib/esm/ScriptUtils/ESLint/@types/eslint-plugin-modules-newlines.d.mts +1 -0
  285. package/dist/lib/esm/ScriptUtils/ESLint/@types/eslint-plugin-verify-tsdoc.d.mts +1 -0
  286. package/dist/lib/esm/ScriptUtils/ESLint/ESLint.d.mts +2 -1
  287. package/dist/lib/esm/ScriptUtils/ESLint/ESLint.mjs +1 -1
  288. package/dist/lib/esm/ScriptUtils/ESLint/eslint.config.d.mts +2 -3
  289. package/dist/lib/esm/ScriptUtils/ESLint/eslint.config.mjs +13 -10
  290. package/dist/lib/esm/ScriptUtils/Exec.d.mts +4 -3
  291. package/dist/lib/esm/ScriptUtils/Exec.mjs +1 -1
  292. package/dist/lib/esm/ScriptUtils/Fs.d.mts +5 -4
  293. package/dist/lib/esm/ScriptUtils/Fs.mjs +1 -1
  294. package/dist/lib/esm/ScriptUtils/JSON.d.mts +5 -4
  295. package/dist/lib/esm/ScriptUtils/JSON.mjs +1 -1
  296. package/dist/lib/esm/ScriptUtils/NodeModules.d.mts +2 -1
  297. package/dist/lib/esm/ScriptUtils/NodeModules.mjs +1 -1
  298. package/dist/lib/esm/ScriptUtils/Npm.d.mts +9 -10
  299. package/dist/lib/esm/ScriptUtils/Npm.mjs +1 -1
  300. package/dist/lib/esm/ScriptUtils/NpmPublish.d.mts +3 -1
  301. package/dist/lib/esm/ScriptUtils/NpmPublish.mjs +1 -1
  302. package/dist/lib/esm/ScriptUtils/NpmRun.d.mts +5 -0
  303. package/dist/lib/esm/ScriptUtils/NpmRun.mjs +1 -1
  304. package/dist/lib/esm/ScriptUtils/ObsidianDevUtilsRepoPaths.d.mts +45 -61
  305. package/dist/lib/esm/ScriptUtils/ObsidianDevUtilsRepoPaths.mjs +1 -10
  306. package/dist/lib/esm/ScriptUtils/Root.d.mts +4 -3
  307. package/dist/lib/esm/ScriptUtils/Root.mjs +1 -1
  308. package/dist/lib/esm/ScriptUtils/build.d.mts +7 -6
  309. package/dist/lib/esm/ScriptUtils/build.mjs +1 -1
  310. package/dist/lib/esm/ScriptUtils/cli.d.mts +2 -1
  311. package/dist/lib/esm/ScriptUtils/cli.mjs +1 -1
  312. package/dist/lib/esm/ScriptUtils/esbuild/Dependency.d.mts +4 -3
  313. package/dist/lib/esm/ScriptUtils/esbuild/Dependency.mjs +1 -1
  314. package/dist/lib/esm/ScriptUtils/esbuild/ObsidianPluginBuilder.d.mts +4 -3
  315. package/dist/lib/esm/ScriptUtils/esbuild/ObsidianPluginBuilder.mjs +1 -1
  316. package/dist/lib/esm/ScriptUtils/esbuild/changeExtensionPlugin.d.mts +2 -1
  317. package/dist/lib/esm/ScriptUtils/esbuild/changeExtensionPlugin.mjs +1 -1
  318. package/dist/lib/esm/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.d.mts +2 -1
  319. package/dist/lib/esm/ScriptUtils/esbuild/copyToObsidianPluginsFolderPlugin.mjs +1 -1
  320. package/dist/lib/esm/ScriptUtils/esbuild/customEsbuildOptionsPlugin.d.mts +2 -1
  321. package/dist/lib/esm/ScriptUtils/esbuild/customEsbuildOptionsPlugin.mjs +1 -1
  322. package/dist/lib/esm/ScriptUtils/esbuild/fixEsmPlugin.d.mts +2 -1
  323. package/dist/lib/esm/ScriptUtils/esbuild/fixEsmPlugin.mjs +1 -1
  324. package/dist/lib/esm/ScriptUtils/esbuild/fixSourceMapsPlugin.d.mts +2 -1
  325. package/dist/lib/esm/ScriptUtils/esbuild/fixSourceMapsPlugin.mjs +1 -1
  326. package/dist/lib/esm/ScriptUtils/esbuild/preprocessPlugin.d.mts +2 -1
  327. package/dist/lib/esm/ScriptUtils/esbuild/preprocessPlugin.mjs +1 -1
  328. package/dist/lib/esm/ScriptUtils/esbuild/renameCssPlugin.d.mts +5 -0
  329. package/dist/lib/esm/ScriptUtils/esbuild/renameCssPlugin.mjs +1 -1
  330. package/dist/lib/esm/ScriptUtils/esbuild/svelteWrapperPlugin.d.mts +5 -0
  331. package/dist/lib/esm/ScriptUtils/esbuild/svelteWrapperPlugin.mjs +1 -1
  332. package/dist/lib/esm/ScriptUtils/format.d.mts +4 -2
  333. package/dist/lib/esm/ScriptUtils/format.mjs +1 -1
  334. package/dist/lib/esm/ScriptUtils/spellcheck.d.mts +4 -3
  335. package/dist/lib/esm/ScriptUtils/spellcheck.mjs +1 -1
  336. package/dist/lib/esm/ScriptUtils/version.d.mts +12 -11
  337. package/dist/lib/esm/ScriptUtils/version.mjs +1 -1
  338. package/dist/lib/esm/String.d.mts +4 -3
  339. package/dist/lib/esm/String.mjs +1 -1
  340. package/dist/lib/esm/Transformers/DateTransformer.d.mts +4 -1
  341. package/dist/lib/esm/Transformers/DateTransformer.mjs +3 -1
  342. package/dist/lib/esm/Transformers/DurationTransformer.d.mts +6 -1
  343. package/dist/lib/esm/Transformers/DurationTransformer.mjs +5 -1
  344. package/dist/lib/esm/Transformers/GroupTransformer.d.mts +9 -5
  345. package/dist/lib/esm/Transformers/GroupTransformer.mjs +7 -4
  346. package/dist/lib/esm/Transformers/SkipPrivatePropertyTransformer.d.mts +4 -1
  347. package/dist/lib/esm/Transformers/SkipPrivatePropertyTransformer.mjs +3 -1
  348. package/dist/lib/esm/Transformers/Transformer.d.mts +2 -1
  349. package/dist/lib/esm/Transformers/Transformer.mjs +9 -2
  350. package/dist/lib/esm/Transformers/TypedTransformer.d.mts +2 -1
  351. package/dist/lib/esm/Transformers/TypedTransformer.mjs +1 -1
  352. package/dist/lib/esm/Type.d.mts +17 -0
  353. package/dist/lib/esm/Type.mjs +8 -0
  354. package/dist/lib/esm/ValueProvider.d.mts +3 -2
  355. package/dist/lib/esm/ValueProvider.mjs +1 -1
  356. package/dist/lib/esm/codemirror/StateFieldSpec.d.mts +2 -1
  357. package/dist/lib/esm/index.d.mts +3 -0
  358. package/dist/lib/esm/index.mjs +7 -1
  359. package/dist/lib/esm/obsidian/App.d.mts +2 -1
  360. package/dist/lib/esm/obsidian/App.mjs +1 -1
  361. package/dist/lib/esm/obsidian/AttachmentPath.d.mts +7 -5
  362. package/dist/lib/esm/obsidian/AttachmentPath.mjs +1 -1
  363. package/dist/lib/esm/obsidian/Backlink.d.mts +3 -2
  364. package/dist/lib/esm/obsidian/Backlink.mjs +1 -1
  365. package/dist/lib/esm/obsidian/Callout.d.mts +3 -2
  366. package/dist/lib/esm/obsidian/Callout.mjs +1 -1
  367. package/dist/lib/esm/obsidian/Components/CheckboxComponent.d.mts +59 -0
  368. package/dist/lib/esm/obsidian/Components/CheckboxComponent.mjs +75 -0
  369. package/dist/lib/esm/obsidian/Components/DateComponent.d.mts +2 -1
  370. package/dist/lib/esm/obsidian/Components/DateComponent.mjs +1 -1
  371. package/dist/lib/esm/obsidian/Components/DateTimeComponent.d.mts +2 -1
  372. package/dist/lib/esm/obsidian/Components/DateTimeComponent.mjs +1 -1
  373. package/dist/lib/esm/obsidian/Components/EmailComponent.d.mts +2 -1
  374. package/dist/lib/esm/obsidian/Components/EmailComponent.mjs +1 -1
  375. package/dist/lib/esm/obsidian/Components/FileComponent.d.mts +2 -1
  376. package/dist/lib/esm/obsidian/Components/FileComponent.mjs +1 -1
  377. package/dist/lib/esm/obsidian/Components/MonthComponent.d.mts +2 -1
  378. package/dist/lib/esm/obsidian/Components/MonthComponent.mjs +1 -1
  379. package/dist/lib/esm/obsidian/Components/MultipleDropdownComponent.d.mts +4 -1
  380. package/dist/lib/esm/obsidian/Components/MultipleDropdownComponent.mjs +4 -2
  381. package/dist/lib/esm/obsidian/Components/MultipleEmailComponent.d.mts +2 -1
  382. package/dist/lib/esm/obsidian/Components/MultipleEmailComponent.mjs +1 -1
  383. package/dist/lib/esm/obsidian/Components/MultipleFileComponent.d.mts +2 -1
  384. package/dist/lib/esm/obsidian/Components/MultipleFileComponent.mjs +1 -1
  385. package/dist/lib/esm/obsidian/Components/MultipleTextComponent.d.mts +22 -3
  386. package/dist/lib/esm/obsidian/Components/MultipleTextComponent.mjs +30 -3
  387. package/dist/lib/esm/obsidian/Components/NumberComponent.d.mts +2 -1
  388. package/dist/lib/esm/obsidian/Components/NumberComponent.mjs +1 -1
  389. package/dist/lib/esm/obsidian/Components/TextBasedComponent.d.mts +37 -0
  390. package/dist/lib/esm/obsidian/Components/TextBasedComponent.mjs +41 -0
  391. package/dist/lib/esm/obsidian/Components/TimeComponent.d.mts +2 -1
  392. package/dist/lib/esm/obsidian/Components/TimeComponent.mjs +1 -1
  393. package/dist/lib/esm/obsidian/Components/TriStateCheckboxComponent.d.mts +59 -0
  394. package/dist/lib/esm/obsidian/Components/TriStateCheckboxComponent.mjs +76 -0
  395. package/dist/lib/esm/obsidian/Components/TypedDropdownComponent.d.mts +78 -0
  396. package/dist/lib/esm/obsidian/Components/TypedDropdownComponent.mjs +108 -0
  397. package/dist/lib/esm/obsidian/Components/TypedMultipleDropdownComponent.d.mts +79 -0
  398. package/dist/lib/esm/obsidian/Components/TypedMultipleDropdownComponent.mjs +110 -0
  399. package/dist/lib/esm/obsidian/Components/TypedRangeTextComponent.d.mts +4 -1
  400. package/dist/lib/esm/obsidian/Components/TypedRangeTextComponent.mjs +1 -1
  401. package/dist/lib/esm/obsidian/Components/TypedTextComponent.d.mts +25 -3
  402. package/dist/lib/esm/obsidian/Components/TypedTextComponent.mjs +30 -4
  403. package/dist/lib/esm/obsidian/Components/UrlComponent.d.mts +2 -1
  404. package/dist/lib/esm/obsidian/Components/UrlComponent.mjs +1 -1
  405. package/dist/lib/esm/obsidian/Components/ValidatorComponent.d.mts +6 -6
  406. package/dist/lib/esm/obsidian/Components/ValidatorComponent.mjs +25 -30
  407. package/dist/lib/esm/obsidian/Components/ValueComponentWithChangeTracking.d.mts +4 -1
  408. package/dist/lib/esm/obsidian/Components/WeekComponent.d.mts +2 -1
  409. package/dist/lib/esm/obsidian/Components/WeekComponent.mjs +1 -1
  410. package/dist/lib/esm/obsidian/Components/index.d.mts +5 -1
  411. package/dist/lib/esm/obsidian/Components/index.mjs +11 -3
  412. package/dist/lib/esm/obsidian/Dataview.d.mts +11 -12
  413. package/dist/lib/esm/obsidian/Dataview.mjs +1 -1
  414. package/dist/lib/esm/obsidian/DataviewLink.d.mts +4 -3
  415. package/dist/lib/esm/obsidian/DataviewLink.mjs +1 -1
  416. package/dist/lib/esm/obsidian/FileChange.d.mts +4 -3
  417. package/dist/lib/esm/obsidian/FileChange.mjs +1 -1
  418. package/dist/lib/esm/obsidian/FileManager.d.mts +6 -5
  419. package/dist/lib/esm/obsidian/FileManager.mjs +1 -1
  420. package/dist/lib/esm/obsidian/FileSystem.d.mts +3 -1
  421. package/dist/lib/esm/obsidian/FileSystem.mjs +1 -1
  422. package/dist/lib/esm/obsidian/Frontmatter.d.mts +5 -1
  423. package/dist/lib/esm/obsidian/Frontmatter.mjs +1 -1
  424. package/dist/lib/esm/obsidian/Link.d.mts +7 -6
  425. package/dist/lib/esm/obsidian/Link.mjs +1 -1
  426. package/dist/lib/esm/obsidian/Logger.d.mts +2 -1
  427. package/dist/lib/esm/obsidian/Logger.mjs +1 -1
  428. package/dist/lib/esm/obsidian/Loop.d.mts +2 -1
  429. package/dist/lib/esm/obsidian/Loop.mjs +1 -1
  430. package/dist/lib/esm/obsidian/Markdown.d.mts +2 -1
  431. package/dist/lib/esm/obsidian/Markdown.mjs +5 -8
  432. package/dist/lib/esm/obsidian/MarkdownCodeBlockProcessor.d.mts +2 -1
  433. package/dist/lib/esm/obsidian/MarkdownCodeBlockProcessor.mjs +1 -1
  434. package/dist/lib/esm/obsidian/MarkdownView.d.mts +2 -1
  435. package/dist/lib/esm/obsidian/MarkdownView.mjs +1 -1
  436. package/dist/lib/esm/obsidian/MetadataCache.d.mts +7 -5
  437. package/dist/lib/esm/obsidian/MetadataCache.mjs +1 -1
  438. package/dist/lib/esm/obsidian/Modals/Alert.d.mts +3 -2
  439. package/dist/lib/esm/obsidian/Modals/Alert.mjs +3 -1
  440. package/dist/lib/esm/obsidian/Modals/Confirm.d.mts +3 -2
  441. package/dist/lib/esm/obsidian/Modals/Confirm.mjs +3 -1
  442. package/dist/lib/esm/obsidian/Modals/ModalBase.d.mts +2 -2
  443. package/dist/lib/esm/obsidian/Modals/ModalBase.mjs +1 -1
  444. package/dist/lib/esm/obsidian/Modals/Prompt.d.mts +5 -3
  445. package/dist/lib/esm/obsidian/Modals/Prompt.mjs +3 -1
  446. package/dist/lib/esm/obsidian/Modals/SelectItem.d.mts +4 -2
  447. package/dist/lib/esm/obsidian/Modals/SelectItem.mjs +2 -1
  448. package/dist/lib/esm/obsidian/MonkeyAround.d.mts +5 -3
  449. package/dist/lib/esm/obsidian/MonkeyAround.mjs +1 -1
  450. package/dist/lib/esm/obsidian/ObsidianSettings.d.mts +3 -0
  451. package/dist/lib/esm/obsidian/ObsidianSettings.mjs +1 -1
  452. package/dist/lib/esm/obsidian/Pdf.d.mts +2 -1
  453. package/dist/lib/esm/obsidian/Pdf.mjs +1 -1
  454. package/dist/lib/esm/obsidian/Plugin/ObsidianPluginRepoPaths.d.mts +38 -29
  455. package/dist/lib/esm/obsidian/Plugin/ObsidianPluginRepoPaths.mjs +6 -2
  456. package/dist/lib/esm/obsidian/Plugin/Plugin.d.mts +4 -3
  457. package/dist/lib/esm/obsidian/Plugin/Plugin.mjs +1 -1
  458. package/dist/lib/esm/obsidian/Plugin/PluginBase.d.mts +52 -21
  459. package/dist/lib/esm/obsidian/Plugin/PluginBase.mjs +128 -38
  460. package/dist/lib/esm/obsidian/Plugin/PluginContext.d.mts +2 -1
  461. package/dist/lib/esm/obsidian/Plugin/PluginContext.mjs +1 -1
  462. package/dist/lib/esm/obsidian/Plugin/PluginId.d.mts +2 -1
  463. package/dist/lib/esm/obsidian/Plugin/PluginId.mjs +1 -1
  464. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.d.mts +42 -22
  465. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +92 -56
  466. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.d.mts +18 -11
  467. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +33 -14
  468. package/dist/lib/esm/obsidian/Plugin/PluginTypesBase.d.mts +55 -0
  469. package/dist/lib/esm/obsidian/Plugin/PluginTypesBase.mjs +8 -0
  470. package/dist/lib/esm/obsidian/Plugin/index.d.mts +1 -0
  471. package/dist/lib/esm/obsidian/Plugin/index.mjs +4 -2
  472. package/dist/lib/esm/obsidian/Queue.d.mts +3 -2
  473. package/dist/lib/esm/obsidian/Queue.mjs +1 -1
  474. package/dist/lib/esm/obsidian/React/AppContext.d.mts +8 -1
  475. package/dist/lib/esm/obsidian/React/AppContext.mjs +3 -3
  476. package/dist/lib/esm/obsidian/Reference.d.mts +2 -1
  477. package/dist/lib/esm/obsidian/Reference.mjs +1 -1
  478. package/dist/lib/esm/obsidian/RenameDeleteHandler.d.mts +3 -2
  479. package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +75 -75
  480. package/dist/lib/esm/obsidian/ResourceUrl.d.mts +2 -1
  481. package/dist/lib/esm/obsidian/ResourceUrl.mjs +1 -1
  482. package/dist/lib/esm/obsidian/SettingEx.d.mts +35 -2
  483. package/dist/lib/esm/obsidian/SettingEx.mjs +41 -1
  484. package/dist/lib/esm/obsidian/ValidationMessage.d.mts +5 -0
  485. package/dist/lib/esm/obsidian/ValidationMessage.mjs +1 -1
  486. package/dist/lib/esm/obsidian/Vault.d.mts +15 -10
  487. package/dist/lib/esm/obsidian/Vault.mjs +1 -1
  488. package/dist/lib/esm/obsidian/VaultEx.d.mts +4 -3
  489. package/dist/lib/esm/obsidian/VaultEx.mjs +1 -1
  490. package/dist/lib/esm/url.d.mts +2 -1
  491. package/dist/lib/esm/url.mjs +1 -1
  492. package/obsidian/Components/CheckboxComponent/package.json +6 -0
  493. package/obsidian/Components/TextBasedComponent/package.json +6 -0
  494. package/obsidian/Components/TriStateCheckboxComponent/package.json +6 -0
  495. package/obsidian/Components/TypedDropdownComponent/package.json +6 -0
  496. package/obsidian/Components/TypedMultipleDropdownComponent/package.json +6 -0
  497. package/obsidian/Plugin/PluginTypesBase/package.json +6 -0
  498. package/package.json +5 -6
  499. package/dist/lib/cjs/obsidian/Components/PlaceholderComponent.d.cts +0 -19
  500. package/dist/lib/esm/obsidian/Components/PlaceholderComponent.d.mts +0 -19
  501. package/dist/lib/esm/obsidian/Components/PlaceholderComponent.mjs +0 -14
  502. package/obsidian/Components/PlaceholderComponent/package.json +0 -6
@@ -5,13 +5,15 @@ if you want to view the source, please visit the github repository of this plugi
5
5
 
6
6
  (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
- import { Notice } from "obsidian";
9
- import { noop } from "../../Function.mjs";
8
+ import {
9
+ noop,
10
+ noopAsync
11
+ } from "../../Function.mjs";
12
+ import { getAllKeys } from "../../Object.mjs";
10
13
  import { DateTransformer } from "../../Transformers/DateTransformer.mjs";
11
14
  import { DurationTransformer } from "../../Transformers/DurationTransformer.mjs";
12
15
  import { GroupTransformer } from "../../Transformers/GroupTransformer.mjs";
13
16
  import { SkipPrivatePropertyTransformer } from "../../Transformers/SkipPrivatePropertyTransformer.mjs";
14
- import { isValidationMessageHolder } from "../ValidationMessage.mjs";
15
17
  const defaultTransformer = new GroupTransformer([
16
18
  new SkipPrivatePropertyTransformer(),
17
19
  new DateTransformer(),
@@ -46,12 +48,12 @@ class EditableSettingsProxyHandler extends ProxyHandlerBase {
46
48
  record[prop] = value;
47
49
  return true;
48
50
  }
49
- property.set(value);
50
- this.validationPromise = this.validationPromise.then(() => property.setAndValidate(value));
51
+ property.setValue(value);
52
+ this.validationPromise = this.validationPromise.then(() => property.setValueAndValidate(value));
51
53
  return true;
52
54
  }
53
55
  getPropertyValue(property) {
54
- return property.get();
56
+ return property.currentValue;
55
57
  }
56
58
  }
57
59
  class PropertiesMap extends Map {
@@ -68,16 +70,17 @@ class PropertiesMap extends Map {
68
70
  }
69
71
  class SafeSettingsProxyHandler extends ProxyHandlerBase {
70
72
  getPropertyValue(property) {
71
- return property.getSafe();
73
+ return property.safeValue;
72
74
  }
73
75
  }
74
76
  class PluginSettingsManagerBase {
75
77
  constructor(plugin) {
76
78
  this.plugin = plugin;
79
+ this.app = plugin.app;
77
80
  this.defaultSettings = this.createDefaultSettings();
78
- this.addValidators();
81
+ this.registerValidators();
79
82
  this.properties = new PropertiesMap();
80
- for (const propertyName of Object.keys(this.defaultSettings)) {
83
+ for (const propertyName of getAllKeys(this.defaultSettings)) {
81
84
  this.properties.set(
82
85
  propertyName,
83
86
  new PluginSettingsProperty(propertyName, this.defaultSettings[propertyName], this.validators.get(propertyName) ?? noop)
@@ -86,6 +89,7 @@ class PluginSettingsManagerBase {
86
89
  this.validators.clear();
87
90
  this.safeSettings = new Proxy(this.defaultSettings, new SafeSettingsProxyHandler(this.properties));
88
91
  }
92
+ app;
89
93
  safeSettings;
90
94
  defaultSettings;
91
95
  properties;
@@ -102,7 +106,7 @@ class PluginSettingsManagerBase {
102
106
  }
103
107
  async loadFromFile() {
104
108
  for (const property of this.properties.values()) {
105
- property.clear();
109
+ property.reset();
106
110
  }
107
111
  const data = await this.plugin.loadData();
108
112
  if (data === void 0 || data === null) {
@@ -116,7 +120,8 @@ class PluginSettingsManagerBase {
116
120
  let record = data;
117
121
  const originalJson = JSON.stringify(record);
118
122
  record = this.getTransformer().transformObjectRecursively(record);
119
- await this.prepareRecord(record);
123
+ await this.onLoadRecord(record);
124
+ const propertiesToSave = [];
120
125
  for (const [propertyName, value] of Object.entries(record)) {
121
126
  const property = this.properties.get(propertyName);
122
127
  if (!property) {
@@ -131,17 +136,23 @@ class PluginSettingsManagerBase {
131
136
  });
132
137
  continue;
133
138
  }
134
- await property.setAndValidate(value);
139
+ property.setValue(value);
140
+ propertiesToSave.push(property);
135
141
  }
136
- const newJson = JSON.stringify(this.prepareRecordToSave());
142
+ for (const property of propertiesToSave) {
143
+ await property.setValueAndValidate(property.currentValue);
144
+ property.save();
145
+ }
146
+ const newJson = JSON.stringify(await this.prepareRecordToSave());
137
147
  if (newJson !== originalJson) {
138
- await this.saveToFile();
148
+ await this.saveToFileImpl();
139
149
  }
150
+ await this.plugin.onLoadSettings(this.getSavedSettings());
140
151
  }
141
152
  /**
142
153
  * Saves the new plugin settings.
143
154
  *
144
- * @returns A promise that resolves when the settings are saved.
155
+ * @returns A {@link Promise} that resolves when the settings are saved.
145
156
  */
146
157
  async saveToFile() {
147
158
  const oldSettings = this.getSavedSettings();
@@ -152,89 +163,114 @@ class PluginSettingsManagerBase {
152
163
  if (!hasChanges) {
153
164
  return;
154
165
  }
155
- await this.plugin.saveData(this.prepareRecordToSave());
166
+ await this.saveToFileImpl();
156
167
  await this.plugin.onSaveSettings(this.getSavedSettings(), oldSettings);
157
168
  }
158
- addValidator(propertyName, validator) {
159
- this.validators.set(propertyName, validator);
160
- }
161
- addValidators() {
162
- noop();
163
- }
164
169
  getTransformer() {
165
170
  return defaultTransformer;
166
171
  }
167
- prepareRecord(_record) {
172
+ /**
173
+ * Called when the plugin settings are loaded.
174
+ *
175
+ * @param _record - The record.
176
+ */
177
+ async onLoadRecord(_record) {
178
+ await noopAsync();
179
+ }
180
+ /**
181
+ * Called when the plugin settings are saving.
182
+ *
183
+ * @param _record - The record.
184
+ */
185
+ async onSavingRecord(_record) {
186
+ await noopAsync();
187
+ }
188
+ registerValidator(propertyName, validator) {
189
+ this.validators.set(propertyName, validator);
190
+ }
191
+ registerValidators() {
168
192
  noop();
169
193
  }
170
194
  getSavedSettings() {
171
195
  const savedSettings = {};
172
196
  for (const [propertyName, property] of this.properties.entries()) {
173
- savedSettings[propertyName] = property.getSaved();
197
+ savedSettings[propertyName] = property.lastSavedValue;
174
198
  }
175
199
  const proto = Object.getPrototypeOf(this.defaultSettings);
176
200
  Object.setPrototypeOf(savedSettings, proto);
177
201
  return savedSettings;
178
202
  }
179
- prepareRecordToSave() {
203
+ async prepareRecordToSave() {
180
204
  const settings = {};
181
205
  for (const [propertyName, property] of this.properties.entries()) {
182
- settings[propertyName] = property.get();
206
+ settings[propertyName] = property.currentValue;
183
207
  }
208
+ await this.onSavingRecord(settings);
184
209
  return this.getTransformer().transformObjectRecursively(settings);
185
210
  }
211
+ async saveToFileImpl() {
212
+ await this.plugin.saveData(await this.prepareRecordToSave());
213
+ }
186
214
  }
187
215
  class PluginSettingsProperty {
188
216
  constructor(propertyName, defaultValue, validator) {
189
217
  this.propertyName = propertyName;
190
218
  this.defaultValue = defaultValue;
191
219
  this.validator = validator;
220
+ this._lastSavedValue = defaultValue;
221
+ this._currentValue = defaultValue;
222
+ }
223
+ get currentValue() {
224
+ return this._currentValue;
225
+ }
226
+ get lastSavedValue() {
227
+ return this._lastSavedValue;
228
+ }
229
+ get safeValue() {
230
+ return this._validationMessage ? this.defaultValue : this._currentValue;
192
231
  }
193
232
  get validationMessage() {
194
233
  return this._validationMessage;
195
234
  }
235
+ _currentValue;
236
+ _lastSavedValue;
196
237
  _validationMessage = "";
197
- savedValue;
198
- value;
199
- clear() {
200
- this.value = void 0;
238
+ reset() {
239
+ this._currentValue = this.defaultValue;
201
240
  this._validationMessage = "";
202
241
  }
203
- get() {
204
- return this.value ?? this.defaultValue;
205
- }
206
- getSafe() {
207
- return this._validationMessage ? this.defaultValue : this.get();
208
- }
209
- getSaved() {
210
- return this.savedValue;
211
- }
212
242
  save() {
213
- if (this.savedValue === this.value) {
243
+ if (this._lastSavedValue === this._currentValue) {
214
244
  return false;
215
245
  }
216
- this.savedValue = this.value;
246
+ this._lastSavedValue = this._currentValue;
217
247
  return true;
218
248
  }
219
- set(value) {
220
- if (isValidationMessageHolder(value)) {
221
- this._validationMessage = value.validationMessage;
222
- } else {
223
- this.value = value;
224
- }
249
+ setValidationMessage(validationMessage) {
250
+ this._validationMessage = validationMessage;
251
+ this.showWarning();
225
252
  }
226
- async setAndValidate(value) {
227
- this.set(value);
228
- if (this.value === void 0) {
229
- return;
253
+ setValue(value) {
254
+ this._currentValue = value;
255
+ }
256
+ async setValueAndValidate(value) {
257
+ this.setValue(value);
258
+ try {
259
+ this._validationMessage = await this.validator(this._currentValue) ?? "";
260
+ } catch (error) {
261
+ console.error("Validation failed", {
262
+ propertyName: this.propertyName,
263
+ value
264
+ }, error);
265
+ this._validationMessage = "Validation failed";
230
266
  }
231
- this._validationMessage = await this.validator(this.value) ?? "";
267
+ this.showWarning(value);
268
+ }
269
+ showWarning(value) {
232
270
  if (!this._validationMessage) {
233
271
  return;
234
272
  }
235
- const warningMessage = `Could not set plugin setting: ${this.propertyName}. Using default value instead.`;
236
- new Notice(warningMessage);
237
- console.warn(warningMessage, {
273
+ console.warn(`Could not set plugin setting: ${this.propertyName}. Using default value instead.`, {
238
274
  defaultValue: this.defaultValue,
239
275
  propertyName: this.propertyName,
240
276
  validationMessage: this._validationMessage,
@@ -246,4 +282,4 @@ export {
246
282
  PluginSettingsManagerBase,
247
283
  PluginSettingsProperty
248
284
  };
249
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnLi4vLi4vT2JqZWN0LnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB9IGZyb20gJy4uL1ZhbGlkYXRpb25NZXNzYWdlLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luQmFzZSB9IGZyb20gJy4vUGx1Z2luQmFzZS50cyc7XG5cbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi8uLi9GdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBEYXRlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvRGF0ZVRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IER1cmF0aW9uVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvRHVyYXRpb25UcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBHcm91cFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0dyb3VwVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL1NraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBpc1ZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vVmFsaWRhdGlvbk1lc3NhZ2UudHMnO1xuXG5jb25zdCBkZWZhdWx0VHJhbnNmb3JtZXIgPSBuZXcgR3JvdXBUcmFuc2Zvcm1lcihbXG4gIG5ldyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIoKSxcbiAgbmV3IERhdGVUcmFuc2Zvcm1lcigpLFxuICBuZXcgRHVyYXRpb25UcmFuc2Zvcm1lcigpXG5dKTtcblxudHlwZSBWYWxpZGF0b3I8VD4gPSAodmFsdWU6IFQpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmFic3RyYWN0IGNsYXNzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4pIHt9XG5cbiAgcHVibGljIGdldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgICBjb25zdCByZWNvcmQgPSB0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93bjtcbn1cblxuY2xhc3MgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByaXZhdGUgdmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIHNldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0eS5zZXQodmFsdWUpO1xuICAgIHRoaXMudmFsaWRhdGlvblByb21pc2UgPSB0aGlzLnZhbGlkYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gcHJvcGVydHkuc2V0QW5kVmFsaWRhdGUodmFsdWUpKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gcHJvcGVydHkuZ2V0KCk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNsYXNzIFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgTWFwPHN0cmluZywgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxhbnk+PiB7XG4gIHB1YmxpYyBnZXRUeXBlZDxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4ocHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUpOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHN1cGVyLmdldChwcm9wZXJ0eU5hbWUpO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlOYW1lKX0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BlcnR5IGFzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT47XG4gIH1cblxuICBwdWJsaWMgc2V0VHlwZWQ8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+XG4gICk6IHRoaXMge1xuICAgIHJldHVybiBzdXBlci5zZXQocHJvcGVydHlOYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuY2xhc3MgU2FmZVNldHRpbmdzUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldFByb3BlcnR5VmFsdWUocHJvcGVydHk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj4pOiB1bmtub3duIHtcbiAgICByZXR1cm4gcHJvcGVydHkuZ2V0U2FmZSgpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgbWFuYWdpbmcgcGx1Z2luIHNldHRpbmdzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSByZXByZXNlbnRpbmcgdGhlIHBsdWdpbiBzZXR0aW5ncyBvYmplY3QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHB1YmxpYyByZWFkb25seSBzYWZlU2V0dGluZ3M6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG5cbiAgcHJpdmF0ZSBkZWZhdWx0U2V0dGluZ3M6IFBsdWdpblNldHRpbmdzO1xuICBwcml2YXRlIHByb3BlcnRpZXM6IFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3M+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHZhbGlkYXRvcnM6IE1hcDxzdHJpbmcsIFZhbGlkYXRvcjxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBWYWxpZGF0b3I8YW55Pj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBwbHVnaW46IFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpO1xuXG4gICAgdGhpcy5hZGRWYWxpZGF0b3JzKCk7XG5cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4oKTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuZGVmYXVsdFNldHRpbmdzKSBhcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPltdKSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMuc2V0KFxuICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIG5ldyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgdGhpcy5kZWZhdWx0U2V0dGluZ3NbcHJvcGVydHlOYW1lXSwgdGhpcy52YWxpZGF0b3JzLmdldChwcm9wZXJ0eU5hbWUpID8/IG5vb3ApXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdG9ycy5jbGVhcigpO1xuXG4gICAgdGhpcy5zYWZlU2V0dGluZ3MgPSBuZXcgUHJveHkodGhpcy5kZWZhdWx0U2V0dGluZ3MsIG5ldyBTYWZlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3M+KHRoaXMucHJvcGVydGllcykpIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZWRpdEFuZFNhdmUoZWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZWRpdGFibGVTZXR0aW5ncyA9IG5ldyBQcm94eSh0aGlzLmRlZmF1bHRTZXR0aW5ncywgbmV3IEVkaXRhYmxlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3M+KHRoaXMucHJvcGVydGllcykpIGFzIHtcbiAgICAgIHZhbGlkYXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIH0gJiBQbHVnaW5TZXR0aW5ncztcbiAgICBhd2FpdCBlZGl0b3IoZWRpdGFibGVTZXR0aW5ncyk7XG4gICAgYXdhaXQgZWRpdGFibGVTZXR0aW5ncy52YWxpZGF0aW9uUHJvbWlzZTtcbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQcm9wZXJ0eTxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4ocHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUpOiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldFR5cGVkKHByb3BlcnR5TmFtZSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZEZyb21GaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdGhpcy5wcm9wZXJ0aWVzLnZhbHVlcygpKSB7XG4gICAgICBwcm9wZXJ0eS5jbGVhcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnBsdWdpbi5sb2FkRGF0YSgpIGFzIHVua25vd247XG5cbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gJ0FycmF5JyA6IHR5cGVvZiBkYXRhO1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBkYXRhIHR5cGUuIEV4cGVjdGVkIE9iamVjdCwgZ290OiAke3R5cGV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlY29yZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgb3JpZ2luYWxKc29uID0gSlNPTi5zdHJpbmdpZnkocmVjb3JkKTtcbiAgICByZWNvcmQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLnByZXBhcmVSZWNvcmQocmVjb3JkKTtcblxuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5wcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpO1xuICAgICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gcHJvcGVydHk6ICR7cHJvcGVydHlOYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIHByb3BlcnR5LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgdHlwZScsIHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgcHJvcGVydHlUeXBlOiB0eXBlb2YgcHJvcGVydHkuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcHJvcGVydHkuc2V0QW5kVmFsaWRhdGUodmFsdWUpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0pzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLnByZXBhcmVSZWNvcmRUb1NhdmUoKSk7XG5cbiAgICBpZiAobmV3SnNvbiAhPT0gb3JpZ2luYWxKc29uKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlVG9GaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0gdGhpcy5nZXRTYXZlZFNldHRpbmdzKCk7XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIGhhc0NoYW5nZXMgfHw9IHByb3BlcnR5LnNhdmUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YSh0aGlzLnByZXBhcmVSZWNvcmRUb1NhdmUoKSk7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4ub25TYXZlU2V0dGluZ3ModGhpcy5nZXRTYXZlZFNldHRpbmdzKCksIG9sZFNldHRpbmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRWYWxpZGF0b3I8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbGlkYXRvcjogVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+XG4gICk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9ycy5zZXQocHJvcGVydHlOYW1lLCB2YWxpZGF0b3IpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZFZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZURlZmF1bHRTZXR0aW5ncygpOiBQbHVnaW5TZXR0aW5ncztcblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJlcGFyZVJlY29yZChfcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2FibGU8dm9pZD4ge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2F2ZWRTZXR0aW5ncygpOiBQYXJ0aWFsPFBsdWdpblNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2F2ZWRTZXR0aW5nczogUGFydGlhbDxQbHVnaW5TZXR0aW5ncz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzYXZlZFNldHRpbmdzW3Byb3BlcnR5TmFtZSBhcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPl0gPSBwcm9wZXJ0eS5nZXRTYXZlZCgpIGFzIFBsdWdpblNldHRpbmdzW1N0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XSB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcy5kZWZhdWx0U2V0dGluZ3MpIGFzIG9iamVjdDtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc2F2ZWRTZXR0aW5ncywgcHJvdG8pO1xuICAgIHJldHVybiBzYXZlZFNldHRpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlUmVjb3JkVG9TYXZlKCk6IFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgdW5rbm93bj4ge1xuICAgIGNvbnN0IHNldHRpbmdzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHVua25vd24+ID0ge30gYXMgUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWUgYXMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5dID0gcHJvcGVydHkuZ2V0KCkgYXMgdW5rbm93bjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHNldHRpbmdzKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcHJvcGVydHkgb2YgYSBwbHVnaW4gc2V0dGluZ3MuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxUPiB7XG4gIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIF92YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuXG4gIHByaXZhdGUgc2F2ZWRWYWx1ZTogVCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHZhbHVlOiBUIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVCwgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3I6IFZhbGlkYXRvcjxUPikge31cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICB9XG5cbiAgcHVibGljIGdldCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSA/PyB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTYWZlKCk6IFQge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdGhpcy5nZXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTYXZlZCgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zYXZlZFZhbHVlO1xuICB9XG5cbiAgcHVibGljIHNhdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2F2ZWRWYWx1ZSA9PT0gdGhpcy52YWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2F2ZWRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2V0KHZhbHVlOiBUIHwgdW5kZWZpbmVkIHwgVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIpOiB2b2lkIHtcbiAgICBpZiAoaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcih2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gdmFsdWUudmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0QW5kVmFsaWRhdGUodmFsdWU6IFQgfCB1bmRlZmluZWQgfCBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy52YWxpZGF0b3IodGhpcy52YWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAnJztcblxuICAgIGlmICghdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IGBDb3VsZCBub3Qgc2V0IHBsdWdpbiBzZXR0aW5nOiAke3RoaXMucHJvcGVydHlOYW1lfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLmA7XG4gICAgbmV3IE5vdGljZSh3YXJuaW5nTWVzc2FnZSk7XG4gICAgY29uc29sZS53YXJuKHdhcm5pbmdNZXNzYWdlLCB7XG4gICAgICBkZWZhdWx0VmFsdWU6IHRoaXMuZGVmYXVsdFZhbHVlLFxuICAgICAgcHJvcGVydHlOYW1lOiB0aGlzLnByb3BlcnR5TmFtZSxcbiAgICAgIHZhbGlkYXRpb25NZXNzYWdlOiB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFLQSxTQUFTLGNBQWM7QUFVdkIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0NBQXNDO0FBQy9DLFNBQVMsaUNBQWlDO0FBRTFDLE1BQU0scUJBQXFCLElBQUksaUJBQWlCO0FBQUEsRUFDOUMsSUFBSSwrQkFBK0I7QUFBQSxFQUNuQyxJQUFJLGdCQUFnQjtBQUFBLEVBQ3BCLElBQUksb0JBQW9CO0FBQzFCLENBQUM7QUFJRCxNQUFlLGlCQUF3RjtBQUFBLEVBQzlGLFlBQStCLFlBQTJDO0FBQTNDO0FBQUEsRUFBNEM7QUFBQSxFQUUzRSxJQUFJLFFBQXdCLE1BQWdDO0FBQ2pFLFVBQU0sU0FBUztBQUNmLFFBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsYUFBTyxPQUFPLElBQUk7QUFBQSxJQUNwQjtBQUVBLFVBQU0sV0FBVyxLQUFLLFdBQVcsSUFBSSxJQUFJO0FBQ3pDLFFBQUksQ0FBQyxVQUFVO0FBQ2IsYUFBTyxPQUFPLElBQUk7QUFBQSxJQUNwQjtBQUVBLFdBQU8sS0FBSyxpQkFBaUIsUUFBUTtBQUFBLEVBQ3ZDO0FBR0Y7QUFFQSxNQUFNLHFDQUFvRSxpQkFBaUM7QUFBQSxFQUNqRyxvQkFBb0IsUUFBUSxRQUFRO0FBQUEsRUFDckMsSUFBSSxRQUF3QixNQUF1QixPQUF5QjtBQUNqRixVQUFNLFNBQVM7QUFFZixRQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGFBQU8sSUFBSSxJQUFJO0FBQ2YsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLFdBQVcsS0FBSyxXQUFXLElBQUksSUFBSTtBQUN6QyxRQUFJLENBQUMsVUFBVTtBQUNiLGFBQU8sSUFBSSxJQUFJO0FBQ2YsYUFB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
285
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFBsdWdpbiBzZXR0aW5ncyBtYW5hZ2VyIGJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL1RyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgTWF5YmVSZXR1cm4sXG4gIFN0cmluZ0tleXNcbn0gZnJvbSAnLi4vLi4vVHlwZS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RQbHVnaW4sXG4gIEV4dHJhY3RQbHVnaW5TZXR0aW5ncyxcbiAgUGx1Z2luVHlwZXNCYXNlXG59IGZyb20gJy4vUGx1Z2luVHlwZXNCYXNlLnRzJztcblxuaW1wb3J0IHtcbiAgbm9vcCxcbiAgbm9vcEFzeW5jXG59IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldEFsbEtleXMgfSBmcm9tICcuLi8uLi9PYmplY3QudHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0RhdGVUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0R1cmF0aW9uVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgR3JvdXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Hcm91cFRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Ta2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIudHMnO1xuXG5jb25zdCBkZWZhdWx0VHJhbnNmb3JtZXIgPSBuZXcgR3JvdXBUcmFuc2Zvcm1lcihbXG4gIG5ldyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIoKSxcbiAgbmV3IERhdGVUcmFuc2Zvcm1lcigpLFxuICBuZXcgRHVyYXRpb25UcmFuc2Zvcm1lcigpXG5dKTtcblxudHlwZSBWYWxpZGF0b3I8VD4gPSAodmFsdWU6IFQpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmFic3RyYWN0IGNsYXNzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4pIHt9XG5cbiAgcHVibGljIGdldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgICBjb25zdCByZWNvcmQgPSB0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93bjtcbn1cblxuY2xhc3MgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByaXZhdGUgdmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIHNldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy52YWxpZGF0aW9uUHJvbWlzZSA9IHRoaXMudmFsaWRhdGlvblByb21pc2UudGhlbigoKSA9PiBwcm9wZXJ0eS5zZXRWYWx1ZUFuZFZhbGlkYXRlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIHByb3BlcnR5LmN1cnJlbnRWYWx1ZTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY2xhc3MgUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBNYXA8c3RyaW5nLCBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PGFueT4+IHtcbiAgcHVibGljIGdldFR5cGVkPFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+Pihwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4ge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gc3VwZXIuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eU5hbWUpfSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVydHkgYXMgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlZDxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsdWU6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLnNldChwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBTYWZlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUHJveHlIYW5kbGVyQmFzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiBwcm9wZXJ0eS5zYWZlVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBtYW5hZ2luZyBwbHVnaW4gc2V0dGluZ3MuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2U8UGx1Z2luVHlwZXMgZXh0ZW5kcyBQbHVnaW5UeXBlc0Jhc2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2FmZVNldHRpbmdzOiBSZWFkb25seURlZXA8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj47XG5cbiAgcHJpdmF0ZSBkZWZhdWx0U2V0dGluZ3M6IEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz47XG4gIHByaXZhdGUgcHJvcGVydGllczogUHJvcGVydGllc01hcDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSB2YWxpZGF0b3JzOiBNYXA8c3RyaW5nLCBWYWxpZGF0b3I8YW55Pj4gPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdG9yPGFueT4+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbHVnaW46IEV4dHJhY3RQbHVnaW48UGx1Z2luVHlwZXM+KSB7XG4gICAgdGhpcy5hcHAgPSBwbHVnaW4uYXBwO1xuICAgIHRoaXMuZGVmYXVsdFNldHRpbmdzID0gdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTtcblxuICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG5cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc01hcDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+PigpO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgZ2V0QWxsS2V5cyh0aGlzLmRlZmF1bHRTZXR0aW5ncykpIHtcbiAgICAgIHRoaXMucHJvcGVydGllcy5zZXQoXG4gICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgbmV3IFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmRlZmF1bHRTZXR0aW5nc1twcm9wZXJ0eU5hbWVdLCB0aGlzLnZhbGlkYXRvcnMuZ2V0KHByb3BlcnR5TmFtZSkgPz8gbm9vcClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0b3JzLmNsZWFyKCk7XG5cbiAgICB0aGlzLnNhZmVTZXR0aW5ncyA9IG5ldyBQcm94eSh0aGlzLmRlZmF1bHRTZXR0aW5ncywgbmV3IFNhZmVTZXR0aW5nc1Byb3h5SGFuZGxlcjxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+Pih0aGlzLnByb3BlcnRpZXMpKSBhcyBSZWFkb25seURlZXA8XG4gICAgICBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+XG4gICAgPjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlZGl0QW5kU2F2ZShlZGl0b3I6IChzZXR0aW5nczogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPikgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVkaXRhYmxlU2V0dGluZ3MgPSBuZXcgUHJveHkodGhpcy5kZWZhdWx0U2V0dGluZ3MsIG5ldyBFZGl0YWJsZVNldHRpbmdzUHJveHlIYW5kbGVyPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+KHRoaXMucHJvcGVydGllcykpIGFzIHtcbiAgICAgIHZhbGlkYXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuICAgIH0gJiBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+O1xuICAgIGF3YWl0IGVkaXRvcihlZGl0YWJsZVNldHRpbmdzKTtcbiAgICBhd2FpdCBlZGl0YWJsZVNldHRpbmdzLnZhbGlkYXRpb25Qcm9taXNlO1xuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldFByb3BlcnR5PFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lXG4gICk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPltQcm9wZXJ0eU5hbWVdPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXRUeXBlZChwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHRoaXMucHJvcGVydGllcy52YWx1ZXMoKSkge1xuICAgICAgcHJvcGVydHkucmVzZXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5wbHVnaW4ubG9hZERhdGEoKSBhcyB1bmtub3duO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCB0eXBlID0gQXJyYXkuaXNBcnJheShkYXRhKSA/ICdBcnJheScgOiB0eXBlb2YgZGF0YTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgZGF0YSB0eXBlLiBFeHBlY3RlZCBPYmplY3QsIGdvdDogJHt0eXBlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG9yaWdpbmFsSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlY29yZCk7XG4gICAgcmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmVjb3JkKTtcblxuICAgIGNvbnN0IHByb3BlcnRpZXNUb1NhdmU6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8dW5rbm93bj5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgICBpZiAoIXByb3BlcnR5KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBwcm9wZXJ0eTogJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSB0eXBlb2YgcHJvcGVydHkuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2YWx1ZSB0eXBlJywge1xuICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBwcm9wZXJ0eVR5cGU6IHR5cGVvZiBwcm9wZXJ0eS5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICBwcm9wZXJ0aWVzVG9TYXZlLnB1c2gocHJvcGVydHkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllc1RvU2F2ZSkge1xuICAgICAgYXdhaXQgcHJvcGVydHkuc2V0VmFsdWVBbmRWYWxpZGF0ZShwcm9wZXJ0eS5jdXJyZW50VmFsdWUpO1xuICAgICAgcHJvcGVydHkuc2F2ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0pzb24gPSBKU09OLnN0cmluZ2lmeShhd2FpdCB0aGlzLnByZXBhcmVSZWNvcmRUb1NhdmUoKSk7XG5cbiAgICBpZiAobmV3SnNvbiAhPT0gb3JpZ2luYWxKc29uKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wbHVnaW4ub25Mb2FkU2V0dGluZ3ModGhpcy5nZXRTYXZlZFNldHRpbmdzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRoZSBuZXcgcGx1Z2luIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlVG9GaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0gdGhpcy5nZXRTYXZlZFNldHRpbmdzKCk7XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIGhhc0NoYW5nZXMgfHw9IHByb3BlcnR5LnNhdmUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4ub25TYXZlU2V0dGluZ3ModGhpcy5nZXRTYXZlZFNldHRpbmdzKCksIG9sZFNldHRpbmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPjtcblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gX3JlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkUmVjb3JkKF9yZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmUgc2F2aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gX3JlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25TYXZpbmdSZWNvcmQoX3JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlclZhbGlkYXRvcjxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz4+PihcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICB2YWxpZGF0b3I6IFZhbGlkYXRvcjxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+W1Byb3BlcnR5TmFtZV0+XG4gICk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9ycy5zZXQocHJvcGVydHlOYW1lLCB2YWxpZGF0b3IpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyVmFsaWRhdG9ycygpOiB2b2lkIHtcbiAgICBub29wKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNhdmVkU2V0dGluZ3MoKTogRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPiB7XG4gICAgY29uc3Qgc2F2ZWRTZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzYXZlZFNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS5sYXN0U2F2ZWRWYWx1ZSBhc1xuICAgICAgICB8IEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz5bU3RyaW5nS2V5czxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+Pl1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMuZGVmYXVsdFNldHRpbmdzKSBhcyBvYmplY3Q7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHNhdmVkU2V0dGluZ3MsIHByb3RvKTtcblxuICAgIHJldHVybiBzYXZlZFNldHRpbmdzIGFzIEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz47XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByZXBhcmVSZWNvcmRUb1NhdmUoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIGNvbnN0IHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgcHJvcGVydHldIG9mIHRoaXMucHJvcGVydGllcy5lbnRyaWVzKCkpIHtcbiAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS5jdXJyZW50VmFsdWUgYXMgdW5rbm93bjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9uU2F2aW5nUmVjb3JkKHNldHRpbmdzKTtcblxuICAgIHJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkoc2V0dGluZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzYXZlVG9GaWxlSW1wbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlRGF0YShhd2FpdCB0aGlzLnByZXBhcmVSZWNvcmRUb1NhdmUoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHByb3BlcnR5IG9mIGEgcGx1Z2luIHNldHRpbmdzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8VD4ge1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBsYXN0U2F2ZWRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fbGFzdFNhdmVkVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNhZmVWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPyB0aGlzLmRlZmF1bHRWYWx1ZSA6IHRoaXMuX2N1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsaWRhdGlvbk1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9jdXJyZW50VmFsdWU6IFQ7XG5cbiAgcHJpdmF0ZSBfbGFzdFNhdmVkVmFsdWU6IFQ7XG5cbiAgcHJpdmF0ZSBfdmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogVCwgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3I6IFZhbGlkYXRvcjxUPikge1xuICAgIHRoaXMuX2xhc3RTYXZlZFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIHRoaXMuX2N1cnJlbnRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICB9XG5cbiAgcHVibGljIHNhdmUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2xhc3RTYXZlZFZhbHVlID09PSB0aGlzLl9jdXJyZW50VmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9IHRoaXMuX2N1cnJlbnRWYWx1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYWxpZGF0aW9uTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB0aGlzLnNob3dXYXJuaW5nKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFsdWUodmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRWYWx1ZUFuZFZhbGlkYXRlKHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gKGF3YWl0IHRoaXMudmFsaWRhdG9yKHRoaXMuX2N1cnJlbnRWYWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAnJztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVmFsaWRhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogdGhpcy5wcm9wZXJ0eU5hbWUsXG4gICAgICAgIHZhbHVlXG4gICAgICB9LCBlcnJvcik7XG4gICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSA9ICdWYWxpZGF0aW9uIGZhaWxlZCc7XG4gICAgfVxuICAgIHRoaXMuc2hvd1dhcm5pbmcodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93V2FybmluZyh2YWx1ZT86IFQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKGBDb3VsZCBub3Qgc2V0IHBsdWdpbiBzZXR0aW5nOiAke3RoaXMucHJvcGVydHlOYW1lfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLmAsIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kZWZhdWx0VmFsdWUsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMucHJvcGVydHlOYW1lLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgdmFsdWVcbiAgICB9KTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQXVCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0NBQXNDO0FBRS9DLE1BQU0scUJBQXFCLElBQUksaUJBQWlCO0FBQUEsRUFDOUMsSUFB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
@@ -1,14 +1,15 @@
1
1
  /**
2
- * @packageDocumentation PluginSettingsTabBase
2
+ * @packageDocumentation
3
+ *
3
4
  * This module defines a base class for creating plugin setting tabs in Obsidian.
4
5
  * It provides a utility method to bind value components to plugin settings and handle changes.
5
6
  */
6
7
  import type { ConditionalKeys, Promisable } from 'type-fest';
7
8
  import { PluginSettingTab } from 'obsidian';
8
- import type { StringKeys } from '../../Object.mjs';
9
+ import type { StringKeys } from '../../Type.mjs';
9
10
  import type { ValueComponentWithChangeTracking } from '../Components/ValueComponentWithChangeTracking.mjs';
10
11
  import type { ValidationMessageHolder } from '../ValidationMessage.mjs';
11
- import type { PluginBase } from './PluginBase.mjs';
12
+ import type { ExtractPlugin, ExtractPluginSettings, PluginTypesBase } from './PluginTypesBase.mjs';
12
13
  /**
13
14
  * Options for binding a value component to a plugin setting.
14
15
  */
@@ -18,7 +19,12 @@ export interface BindOptions<T> {
18
19
  */
19
20
  onChanged?(newValue: T | undefined, oldValue: T): Promisable<void>;
20
21
  /**
21
- * If true, shows the validation message when the component value is invalid. Default is `true`.
22
+ * Whether to reset the setting when the component value is empty. Default is `true`.
23
+ * Applicable only to text-based components.
24
+ */
25
+ shouldResetSettingWhenComponentIsEmpty?: boolean;
26
+ /**
27
+ * Whether to show the validation message when the component value is invalid. Default is `true`.
22
28
  */
23
29
  shouldShowValidationMessage?: boolean;
24
30
  }
@@ -28,27 +34,28 @@ export interface BindOptions<T> {
28
34
  export interface BindOptionsExtended<PluginSettings extends object, UIValue, PropertyName extends StringKeys<PluginSettings>> extends BindOptions<PluginSettings[PropertyName]> {
29
35
  /**
30
36
  * Converts the UI component's value back to the plugin settings value.
37
+ *
31
38
  * @param uiValue - The value of the UI component.
32
39
  * @returns The value to set on the plugin settings.
33
40
  */
34
41
  componentToPluginSettingsValueConverter: (uiValue: UIValue) => PluginSettings[PropertyName] | ValidationMessageHolder;
35
42
  /**
36
43
  * Converts the plugin settings value to the value used by the UI component.
44
+ *
37
45
  * @param pluginSettingsValue - The value of the property in the plugin settings.
38
46
  * @returns The value to set on the UI component.
39
47
  */
40
48
  pluginSettingsToComponentValueConverter: (pluginSettingsValue: PluginSettings[PropertyName]) => UIValue;
41
49
  }
42
- type ExtractPluginSettings<Plugin extends PluginBase<any>> = Plugin extends PluginBase<infer PluginSettings> ? PluginSettings : never;
43
50
  /**
44
51
  * Base class for creating plugin settings tabs in Obsidian.
45
52
  * Provides a method for binding value components to plugin settings and handling changes.
46
53
  *
47
54
  * @typeParam TPlugin - The type of the plugin that extends PluginBase.
48
55
  */
49
- export declare abstract class PluginSettingsTabBase<TPlugin extends PluginBase<any>> extends PluginSettingTab {
50
- plugin: TPlugin;
51
- constructor(plugin: TPlugin);
56
+ export declare abstract class PluginSettingsTabBase<PluginTypes extends PluginTypesBase> extends PluginSettingTab {
57
+ plugin: ExtractPlugin<PluginTypes>;
58
+ constructor(plugin: ExtractPlugin<PluginTypes>);
52
59
  /**
53
60
  * Binds a value component to a plugin setting.
54
61
  *
@@ -59,7 +66,7 @@ export declare abstract class PluginSettingsTabBase<TPlugin extends PluginBase<a
59
66
  * @param options - The options for binding the value component.
60
67
  * @returns The value component.
61
68
  */
62
- bind<UIValue, TValueComponent>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, propertyName: ConditionalKeys<ExtractPluginSettings<TPlugin>, UIValue>, options?: BindOptions<UIValue>): TValueComponent;
69
+ bind<UIValue, TValueComponent>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, propertyName: ConditionalKeys<ExtractPluginSettings<PluginTypes>, UIValue>, options?: BindOptions<UIValue>): TValueComponent;
63
70
  /**
64
71
  * Binds a value component to a plugin setting.
65
72
  *
@@ -71,7 +78,7 @@ export declare abstract class PluginSettingsTabBase<TPlugin extends PluginBase<a
71
78
  * @param options - The options for binding the value component.
72
79
  * @returns The value component.
73
80
  */
74
- bind<UIValue, TValueComponent, PropertyName extends StringKeys<ExtractPluginSettings<TPlugin>>>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, propertyName: PropertyName, options: BindOptionsExtended<ExtractPluginSettings<TPlugin>, UIValue, PropertyName>): TValueComponent;
81
+ bind<UIValue, TValueComponent, PropertyName extends StringKeys<ExtractPluginSettings<PluginTypes>>>(valueComponent: TValueComponent & ValueComponentWithChangeTracking<UIValue>, propertyName: PropertyName, options: BindOptionsExtended<ExtractPluginSettings<PluginTypes>, UIValue, PropertyName>): TValueComponent;
75
82
  hide(): void;
83
+ show(): void;
76
84
  }
77
- export {};
@@ -5,11 +5,14 @@ if you want to view the source, please visit the github repository of this plugi
5
5
 
6
6
  (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
- import { PluginSettingTab } from "obsidian";
8
+ import {
9
+ PluginSettingTab,
10
+ setTooltip
11
+ } from "obsidian";
9
12
  import { invokeAsyncSafely } from "../../Async.mjs";
10
13
  import { CssClass } from "../../CssClass.mjs";
11
14
  import { noop } from "../../Function.mjs";
12
- import { isPlaceholderComponent } from "../Components/PlaceholderComponent.mjs";
15
+ import { getTextBasedComponentValue } from "../Components/TextBasedComponent.mjs";
13
16
  import { getValidatorComponent } from "../Components/ValidatorComponent.mjs";
14
17
  import { isValidationMessageHolder } from "../ValidationMessage.mjs";
15
18
  import { getPluginId } from "./PluginId.mjs";
@@ -32,25 +35,38 @@ class PluginSettingsTabBase extends PluginSettingTab {
32
35
  */
33
36
  bind(valueComponent, propertyName, options) {
34
37
  const DEFAULT_OPTIONS = {
35
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
36
- componentToPluginSettingsValueConverter: (value) => value,
38
+ componentToPluginSettingsValueConverter: (value2) => value2,
37
39
  onChanged: noop,
38
- pluginSettingsToComponentValueConverter: (value) => value,
40
+ pluginSettingsToComponentValueConverter: (value2) => value2,
41
+ shouldResetSettingWhenComponentIsEmpty: true,
39
42
  shouldShowValidationMessage: true
40
43
  };
41
44
  const optionsExt = { ...DEFAULT_OPTIONS, ...options };
42
45
  const validatorElement = getValidatorComponent(valueComponent)?.validatorEl;
43
46
  const property = this.plugin.settingsManager.getProperty(propertyName);
44
- valueComponent.setValue(optionsExt.pluginSettingsToComponentValueConverter(property.get())).onChange(async (uiValue) => {
45
- const oldValue = property.get();
47
+ const value = property.currentValue;
48
+ const textBasedComponent = getTextBasedComponentValue(valueComponent);
49
+ textBasedComponent?.setPlaceholderValue(optionsExt.pluginSettingsToComponentValueConverter(property.defaultValue));
50
+ if (property.currentValue === property.defaultValue && textBasedComponent && optionsExt.shouldResetSettingWhenComponentIsEmpty) {
51
+ textBasedComponent.empty();
52
+ } else {
53
+ valueComponent.setValue(optionsExt.pluginSettingsToComponentValueConverter(value));
54
+ }
55
+ valueComponent.onChange(async (uiValue) => {
56
+ if (textBasedComponent?.isEmpty() && optionsExt.shouldResetSettingWhenComponentIsEmpty) {
57
+ property.reset();
58
+ return;
59
+ }
60
+ const oldValue = property.currentValue;
46
61
  const convertedValue = optionsExt.componentToPluginSettingsValueConverter(uiValue);
47
- await property.setAndValidate(convertedValue);
62
+ if (isValidationMessageHolder(convertedValue)) {
63
+ property.setValidationMessage(convertedValue.validationMessage);
64
+ } else {
65
+ await property.setValueAndValidate(convertedValue);
66
+ }
48
67
  const newValue = isValidationMessageHolder(convertedValue) ? void 0 : convertedValue;
49
68
  await optionsExt.onChanged(newValue, oldValue);
50
69
  });
51
- if (isPlaceholderComponent(valueComponent)) {
52
- valueComponent.setPlaceholder(optionsExt.pluginSettingsToComponentValueConverter(property.defaultValue));
53
- }
54
70
  validatorElement?.addEventListener("focus", validate);
55
71
  validatorElement?.addEventListener("blur", validate);
56
72
  validate();
@@ -62,10 +78,10 @@ class PluginSettingsTabBase extends PluginSettingTab {
62
78
  if (!property.validationMessage) {
63
79
  validatorElement.setCustomValidity("");
64
80
  validatorElement.checkValidity();
65
- property.set(validatorElement);
81
+ property.setValidationMessage(validatorElement.validationMessage);
66
82
  }
67
83
  validatorElement.setCustomValidity(property.validationMessage);
68
- validatorElement.title = property.validationMessage;
84
+ setTooltip(validatorElement, property.validationMessage);
69
85
  if (validatorElement.isActiveElement() && optionsExt.shouldShowValidationMessage) {
70
86
  validatorElement.reportValidity();
71
87
  }
@@ -75,8 +91,11 @@ class PluginSettingsTabBase extends PluginSettingTab {
75
91
  super.hide();
76
92
  invokeAsyncSafely(() => this.plugin.settingsManager.saveToFile());
77
93
  }
94
+ show() {
95
+ this.app.setting.openTab(this);
96
+ }
78
97
  }
79
98
  export {
80
99
  PluginSettingsTabBase
81
100
  };
82
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIFBsdWdpblNldHRpbmdzVGFiQmFzZVxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uZGl0aW9uYWxLZXlzLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgU3RyaW5nS2V5cyB9IGZyb20gJy4uLy4uL09iamVjdC50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9WYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZy50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vVmFsaWRhdGlvbk1lc3NhZ2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5CYXNlIH0gZnJvbSAnLi9QbHVnaW5CYXNlLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eSB9IGZyb20gJy4vUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZS50cyc7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnLi4vLi4vQXN5bmMudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi8uLi9Dc3NDbGFzcy50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgaXNQbGFjZWhvbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL0NvbXBvbmVudHMvUGxhY2Vob2xkZXJDb21wb25lbnQudHMnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9WYWxpZGF0b3JDb21wb25lbnQudHMnO1xuaW1wb3J0IHsgaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB9IGZyb20gJy4uL1ZhbGlkYXRpb25NZXNzYWdlLnRzJztcbmltcG9ydCB7IGdldFBsdWdpbklkIH0gZnJvbSAnLi9QbHVnaW5JZC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zPFQ+IHtcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBjaGFuZ2VzLlxuICAgKi9cbiAgb25DaGFuZ2VkPyhuZXdWYWx1ZTogVCB8IHVuZGVmaW5lZCwgb2xkVmFsdWU6IFQpOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzaG93cyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBpcyBpbnZhbGlkLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgb3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zRXh0ZW5kZWQ8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPlxuPiBleHRlbmRzIEJpbmRPcHRpb25zPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZSBiYWNrIHRvIHRoZSBwbHVnaW4gc2V0dGluZ3MgdmFsdWUuXG4gICAqIEBwYXJhbSB1aVZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSB0byBzZXQgb24gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHVpVmFsdWU6IFVJVmFsdWUpID0+IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0gfCBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcjtcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZSB0byB0aGUgdmFsdWUgdXNlZCBieSB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gcGx1Z2luU2V0dGluZ3NWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgVUkgY29tcG9uZW50LlxuICAgKi9cbiAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyOiAocGx1Z2luU2V0dGluZ3NWYWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSkgPT4gVUlWYWx1ZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpbiBleHRlbmRzIFBsdWdpbkJhc2U8YW55Pj4gPSBQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPGluZmVyIFBsdWdpblNldHRpbmdzPiA/IFBsdWdpblNldHRpbmdzIDogbmV2ZXI7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgcGx1Z2luIHNldHRpbmdzIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBQcm92aWRlcyBhIG1ldGhvZCBmb3IgYmluZGluZyB2YWx1ZSBjb21wb25lbnRzIHRvIHBsdWdpbiBzZXR0aW5ncyBhbmQgaGFuZGxpbmcgY2hhbmdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHRoYXQgZXh0ZW5kcyBQbHVnaW5CYXNlLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luQmFzZTxhbnk+PiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG92ZXJyaWRlIHBsdWdpbjogVFBsdWdpbikge1xuICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG4gICAgdGhpcy5jb250YWluZXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgZ2V0UGx1Z2luSWQoKSwgQ3NzQ2xhc3MuUGx1Z2luU2V0dGluZ3NUYWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSB2YWx1ZUNvbXBvbmVudCAtIFRoZSB2YWx1ZSBjb21wb25lbnQgdG8gYmluZC5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50XG4gID4oXG4gICAgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+LFxuICAgIHByb3BlcnR5TmFtZTogQ29uZGl0aW9uYWxLZXlzPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPiwgVUlWYWx1ZT4sXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPFVJVmFsdWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFRQbHVnaW4+PlxuICA+KFxuICAgIHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQgJiBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxVSVZhbHVlPixcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICBvcHRpb25zOiBCaW5kT3B0aW9uc0V4dGVuZGVkPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPiwgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPlxuICApOiBUVmFsdWVDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFVJVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHZhbHVlQ29tcG9uZW50IC0gVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBiaW5kaW5nIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgYmluZDxcbiAgICBVSVZhbHVlLFxuICAgIFRWYWx1ZUNvbXBvbmVudCxcbiAgICBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPj5cbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPltQcm9wZXJ0eU5hbWVdPlxuICApOiBUVmFsdWVDb21wb25lbnQge1xuICAgIHR5cGUgUGx1Z2luU2V0dGluZ3MgPSBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8VFBsdWdpbj47XG4gICAgdHlwZSBQcm9wZXJ0eVR5cGUgPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdO1xuICAgIGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICAgIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHZhbHVlOiBVSVZhbHVlKTogUHJvcGVydHlUeXBlID0+IHZhbHVlIGFzIFByb3BlcnR5VHlwZSxcbiAgICAgIG9uQ2hhbmdlZDogbm9vcCxcbiAgICAgIHBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcjogKHZhbHVlOiBQcm9wZXJ0eVR5cGUpOiBVSVZhbHVlID0+IHZhbHVlIGFzIFVJVmFsdWUsXG4gICAgICBzaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2U6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uc0V4dDogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gICAgY29uc3QgdmFsaWRhdG9yRWxlbWVudCA9IGdldFZhbGlkYXRvckNvbXBvbmVudCh2YWx1ZUNvbXBvbmVudCk/LnZhbGlkYXRvckVsO1xuXG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnBsdWdpbi5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSBhcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFByb3BlcnR5VHlwZT47XG5cbiAgICB2YWx1ZUNvbXBvbmVudFxuICAgICAgLnNldFZhbHVlKG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHByb3BlcnR5LmdldCgpKSlcbiAgICAgIC5vbkNoYW5nZShhc3luYyAodWlWYWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHByb3BlcnR5LmdldCgpO1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9IG9wdGlvbnNFeHQuY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyKHVpVmFsdWUpO1xuICAgICAgICBhd2FpdCBwcm9wZXJ0eS5zZXRBbmRWYWxpZGF0ZShjb252ZXJ0ZWRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcihjb252ZXJ0ZWRWYWx1ZSkgPyB1bmRlZmluZWQgOiBjb252ZXJ0ZWRWYWx1ZTtcbiAgICAgICAgYXdhaXQgb3B0aW9uc0V4dC5vbkNoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKGlzUGxhY2Vob2xkZXJDb21wb25lbnQodmFsdWVDb21wb25lbnQpKSB7XG4gICAgICB2YWx1ZUNvbXBvbmVudC5zZXRQbGFjZWhvbGRlcihvcHRpb25zRXh0LnBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcihwcm9wZXJ0eS5kZWZhdWx0VmFsdWUpIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgdmFsaWRhdG9yRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB2YWxpZGF0ZSk7XG4gICAgdmFsaWRhdG9yRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHZhbGlkYXRlKTtcblxuICAgIHZhbGlkYXRlKCk7XG4gICAgcmV0dXJuIHZhbHVlQ29tcG9uZW50O1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgICBpZiAoIXZhbGlkYXRvckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3BlcnR5LnZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgcHJvcGVydHkuc2V0KHZhbGlkYXRvckVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0b3JFbGVtZW50LnNldEN1c3RvbVZhbGlkaXR5KHByb3BlcnR5LnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIHZhbGlkYXRvckVsZW1lbnQudGl0bGUgPSBwcm9wZXJ0eS52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgIGlmICh2YWxpZGF0b3JFbGVtZW50LmlzQWN0aXZlRWxlbWVudCgpICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgaGlkZSgpOiB2b2lkIHtcbiAgICBzdXBlci5oaWRlKCk7XG4gICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gdGhpcy5wbHVnaW4uc2V0dGluZ3NNYW5hZ2VyLnNhdmVUb0ZpbGUoKSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFXQSxTQUFTLHdCQUF3QjtBQVFqQyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLFlBQVk7QUFDckIsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxpQ0FBaUM7QUFDMUMsU0FBUyxtQkFBbUI7QUFrRHJCLE1BQWUsOEJBQStELGlCQUFpQjtBQUFBLEVBQzdGLFlBQTRCLFFBQWlCO0FBQ2xELFVBQU0sT0FBTyxLQUFLLE1BQU07QUFEUztBQUVqQyxTQUFLLFlBQVksU0FBUyxTQUFTLGFBQWEsWUFBWSxHQUFHLFNBQVMsaUJBQWlCO0FBQUEsRUFDM0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFtRE8sS0FLTCxnQkFDQSxjQUNBLFNBQ2lCO0FBR2pCLFVBQU0sa0JBQXdGO0FBQUE7QUFBQSxNQUU1Rix5Q0FBeUMsQ0FBQyxVQUFpQztBQUFBLE1BQzNFLFdBQVc7QUFBQSxNQUNYLHlDQUF5QyxDQUFDLFVBQWlDO0FBQUEsTUFDM0UsNkJBQTZCO0FBQUEsSUFDL0I7QUFFQSxVQUFNLGFBQW1GLEVBQUUsR0FBRyxpQkFBaUIsR0FBRyxRQUFRO0FBRTFILFVBQU0sbUJBQW1CLHNCQUFzQixjQUFjLEdBQUc7QUFFaEUsVUFBTSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsWUFBWSxZQUFZO0FBRXJFLG1CQUNHLFNBQVMsV0FBVyx3Q0FBd0MsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUMzRSxTQUFTLE9BQU8sWUFBWTtBQUMzQixZQUFNLFdBQVcsU0FBUyxJQUFJO0FBQzlCLFlBQU0saUJBQWlCLFdBQVcsd0NBQXdDLE9BQU87QUFDakYsWUFBTSxTQUFTLGVBQWUsY0FBYztBQUM1QyxZQUFNLFdBQVcsMEJBQTBCLGNBQWMsSUFBSSxTQUFZO0FBQ3pFLFlBQU0sV0FBVyxVQUFVLFVBQVUsUUFBUTtBQUFBLElBQy9DLENBQUM7QUFFSCxRQUFJLHVCQUF1QixjQUFjLEdBQUc7QUFDMUMscUJBQWUsZUFBZSxXQUFXLHdDQUF3QyxTQUFTLFlBQVksQ0FBVztBQUFBLElBQ25IO0FBRUEsc0JBQWtCLGlCQUFpQixTQUFTLFFBQVE7QUFDcEQsc0JBQWtCLGlCQUFpQixRQUFRLFFBQVE7QUFFbkQsYUFBUztBQUNULFdBQU87QUFFUCxhQUFTLFdBQWlCO0FBQ3hCLFVBQUksQ0FBQyxrQkFBa0I7QUFDckI7QUFBQSxNQUNGO0FBRUEsVUFBSSxDQUFDLFNBQVMsbUJBQW1CO0FBQy9CLHlCQUFpQixrQkFBa0IsRUFBRTtBQUNyQyx5QkFBaUIsY0FBYztBQUMvQixpQkFBUyxJQUFJLGdCQUFnQjtBQUFBLE1BQy9CO0FBRUEsdUJBQWlCLGtCQUFrQixTQUFTLGlCQUFpQjtBQUM3RCx1QkFBaUIsUUFBUSxTQUFTO0FBQ2xDLFVBQUksaUJBQWlCLGdCQUFnQixLQUFLLFdBQVcsNkJBQTZCO0FBQ2hGLHlCQUFpQixlQUFlO0FBQUEsTUFDbEM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRWdCLE9BQWE7QUFDM0IsVUFBTSxLQUFLO0FBQ1gsc0JBQWtCLE1BQU0sS0FBSyxPQUFPLGdCQUFnQixXQUFXLENBQUM7QUFBQSxFQUNsRTtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
101
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uZGl0aW9uYWxLZXlzLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIFBsdWdpblNldHRpbmdUYWIsXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFN0cmluZ0tleXMgfSBmcm9tICcuLi8uLi9UeXBlLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuLi9Db21wb25lbnRzL1ZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIgfSBmcm9tICcuLi9WYWxpZGF0aW9uTWVzc2FnZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNldHRpbmdzUHJvcGVydHkgfSBmcm9tICcuL1BsdWdpblNldHRpbmdzTWFuYWdlckJhc2UudHMnO1xuaW1wb3J0IHR5cGUge1xuICBFeHRyYWN0UGx1Z2luLFxuICBFeHRyYWN0UGx1Z2luU2V0dGluZ3MsXG4gIFBsdWdpblR5cGVzQmFzZVxufSBmcm9tICcuL1BsdWdpblR5cGVzQmFzZS50cyc7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnLi4vLi4vQXN5bmMudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi8uLi9Dc3NDbGFzcy50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0VGV4dEJhc2VkQ29tcG9uZW50VmFsdWUgfSBmcm9tICcuLi9Db21wb25lbnRzL1RleHRCYXNlZENvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9Db21wb25lbnRzL1ZhbGlkYXRvckNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBpc1ZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vVmFsaWRhdGlvbk1lc3NhZ2UudHMnO1xuaW1wb3J0IHsgZ2V0UGx1Z2luSWQgfSBmcm9tICcuL1BsdWdpbklkLnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBiaW5kaW5nIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluZE9wdGlvbnM8VD4ge1xuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGNoYW5nZXMuXG4gICAqL1xuICBvbkNoYW5nZWQ/KG5ld1ZhbHVlOiBUIHwgdW5kZWZpbmVkLCBvbGRWYWx1ZTogVCk6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVzZXQgdGhlIHNldHRpbmcgd2hlbiB0aGUgY29tcG9uZW50IHZhbHVlIGlzIGVtcHR5LiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICogQXBwbGljYWJsZSBvbmx5IHRvIHRleHQtYmFzZWQgY29tcG9uZW50cy5cbiAgICovXG4gIHNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2hlbiB0aGUgY29tcG9uZW50IHZhbHVlIGlzIGludmFsaWQuIERlZmF1bHQgaXMgYHRydWVgLlxuICAgKi9cbiAgc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBvcHRpb25zIGZvciBiaW5kaW5nIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluZE9wdGlvbnNFeHRlbmRlZDxcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsXG4gIFVJVmFsdWUsXG4gIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XG4+IGV4dGVuZHMgQmluZE9wdGlvbnM8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4ge1xuICAvKipcbiAgICogQ29udmVydHMgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlIGJhY2sgdG8gdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHVpVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyOiAodWlWYWx1ZTogVUlWYWx1ZSkgPT4gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSB8IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgcGx1Z2luIHNldHRpbmdzIHZhbHVlIHRvIHRoZSB2YWx1ZSB1c2VkIGJ5IHRoZSBVSSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5TZXR0aW5nc1ZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBVSSBjb21wb25lbnQuXG4gICAqL1xuICBwbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXI6IChwbHVnaW5TZXR0aW5nc1ZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdKSA9PiBVSVZhbHVlO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IGV4dGVuZHMgUGx1Z2luQmFzZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxQbHVnaW5UeXBlcyBleHRlbmRzIFBsdWdpblR5cGVzQmFzZT4gZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBvdmVycmlkZSBwbHVnaW46IEV4dHJhY3RQbHVnaW48UGx1Z2luVHlwZXM+KSB7XG4gICAgc3VwZXIocGx1Z2luLmFwcCwgcGx1Z2luKTtcbiAgICB0aGlzLmNvbnRhaW5lckVsLmFkZENsYXNzKENzc0NsYXNzLkxpYnJhcnlOYW1lLCBnZXRQbHVnaW5JZCgpLCBDc3NDbGFzcy5QbHVnaW5TZXR0aW5nc1RhYik7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHZhbHVlQ29tcG9uZW50IC0gVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnRcbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHlOYW1lOiBDb25kaXRpb25hbEtleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPiwgVUlWYWx1ZT4sXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPFVJVmFsdWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj5cbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgb3B0aW9uczogQmluZE9wdGlvbnNFeHRlbmRlZDxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8UGx1Z2luVHlwZXM+LCBVSVZhbHVlLCBQcm9wZXJ0eU5hbWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPj5cbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxQbHVnaW5UeXBlcz5bUHJvcGVydHlOYW1lXT5cbiAgKTogVFZhbHVlQ29tcG9uZW50IHtcbiAgICB0eXBlIFBsdWdpblNldHRpbmdzID0gRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpblR5cGVzPjtcbiAgICB0eXBlIFByb3BlcnR5VHlwZSA9IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV07XG4gICAgY29uc3QgREVGQVVMVF9PUFRJT05TOiBSZXF1aXJlZDxCaW5kT3B0aW9uc0V4dGVuZGVkPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBQcm9wZXJ0eU5hbWU+PiA9IHtcbiAgICAgIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHZhbHVlOiBVSVZhbHVlKTogUHJvcGVydHlUeXBlID0+IHZhbHVlIGFzIFByb3BlcnR5VHlwZSxcbiAgICAgIG9uQ2hhbmdlZDogbm9vcCxcbiAgICAgIHBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcjogKHZhbHVlOiBQcm9wZXJ0eVR5cGUpOiBVSVZhbHVlID0+IHZhbHVlIGFzIFVJVmFsdWUsXG4gICAgICBzaG91bGRSZXNldFNldHRpbmdXaGVuQ29tcG9uZW50SXNFbXB0eTogdHJ1ZSxcbiAgICAgIHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZTogdHJ1ZVxuICAgIH07XG5cbiAgICBjb25zdCBvcHRpb25zRXh0OiBSZXF1aXJlZDxCaW5kT3B0aW9uc0V4dGVuZGVkPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBQcm9wZXJ0eU5hbWU+PiA9IHsgLi4uREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XG5cbiAgICBjb25zdCB2YWxpZGF0b3JFbGVtZW50ID0gZ2V0VmFsaWRhdG9yQ29tcG9uZW50KHZhbHVlQ29tcG9uZW50KT8udmFsaWRhdG9yRWw7XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucGx1Z2luLnNldHRpbmdzTWFuYWdlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIGFzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8UHJvcGVydHlUeXBlPjtcblxuICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkuY3VycmVudFZhbHVlO1xuXG4gICAgY29uc3QgdGV4dEJhc2VkQ29tcG9uZW50ID0gZ2V0VGV4dEJhc2VkQ29tcG9uZW50VmFsdWUodmFsdWVDb21wb25lbnQpO1xuICAgIHRleHRCYXNlZENvbXBvbmVudD8uc2V0UGxhY2Vob2xkZXJWYWx1ZShvcHRpb25zRXh0LnBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcihwcm9wZXJ0eS5kZWZhdWx0VmFsdWUpKTtcblxuICAgIGlmIChwcm9wZXJ0eS5jdXJyZW50VmFsdWUgPT09IHByb3BlcnR5LmRlZmF1bHRWYWx1ZSAmJiB0ZXh0QmFzZWRDb21wb25lbnQgJiYgb3B0aW9uc0V4dC5zaG91bGRSZXNldFNldHRpbmdXaGVuQ29tcG9uZW50SXNFbXB0eSkge1xuICAgICAgdGV4dEJhc2VkQ29tcG9uZW50LmVtcHR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgdmFsdWVDb21wb25lbnQub25DaGFuZ2UoYXN5bmMgKHVpVmFsdWUpID0+IHtcbiAgICAgIGlmICh0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSAmJiBvcHRpb25zRXh0LnNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5KSB7XG4gICAgICAgIHByb3BlcnR5LnJlc2V0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSBwcm9wZXJ0eS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9IG9wdGlvbnNFeHQuY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyKHVpVmFsdWUpO1xuICAgICAgaWYgKGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIoY29udmVydGVkVmFsdWUpKSB7XG4gICAgICAgIHByb3BlcnR5LnNldFZhbGlkYXRpb25NZXNzYWdlKGNvbnZlcnRlZFZhbHVlLnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHByb3BlcnR5LnNldFZhbHVlQW5kVmFsaWRhdGUoY29udmVydGVkVmFsdWUpO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3VmFsdWUgPSBpc1ZhbGlkYXRpb25NZXNzYWdlSG9sZGVyKGNvbnZlcnRlZFZhbHVlKSA/IHVuZGVmaW5lZCA6IGNvbnZlcnRlZFZhbHVlO1xuICAgICAgYXdhaXQgb3B0aW9uc0V4dC5vbkNoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICB9KTtcblxuICAgIHZhbGlkYXRvckVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdmFsaWRhdGUpO1xuICAgIHZhbGlkYXRvckVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB2YWxpZGF0ZSk7XG5cbiAgICB2YWxpZGF0ZSgpO1xuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudDtcblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKCk6IHZvaWQge1xuICAgICAgaWYgKCF2YWxpZGF0b3JFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcm9wZXJ0eS52YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LnNldEN1c3RvbVZhbGlkaXR5KCcnKTtcbiAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICAgIHByb3BlcnR5LnNldFZhbGlkYXRpb25NZXNzYWdlKHZhbGlkYXRvckVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0b3JFbGVtZW50LnNldEN1c3RvbVZhbGlkaXR5KHByb3BlcnR5LnZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIHNldFRvb2x0aXAodmFsaWRhdG9yRWxlbWVudCwgcHJvcGVydHkudmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgaWYgKHZhbGlkYXRvckVsZW1lbnQuaXNBY3RpdmVFbGVtZW50KCkgJiYgb3B0aW9uc0V4dC5zaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBoaWRlKCk6IHZvaWQge1xuICAgIHN1cGVyLmhpZGUoKTtcbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLnBsdWdpbi5zZXR0aW5nc01hbmFnZXIuc2F2ZVRvRmlsZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93KCk6IHZvaWQge1xuICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYih0aGlzKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVlBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBWVAsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsbUJBQW1CO0FBc0RyQixNQUFlLDhCQUFtRSxpQkFBaUI7QUFBQSxFQUNqRyxZQUE0QixRQUFvQztBQUNyRSxVQUFNLE9BQU8sS0FBSyxNQUFNO0FBRFM7QUFFakMsU0FBSyxZQUFZLFNBQVMsU0FBUyxhQUFhLFlBQVksR0FBRyxTQUFTLGlCQUFpQjtBQUFBLEVBQzNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBbURPLEtBS0wsZ0JBQ0EsY0FDQSxTQUNpQjtBQUdqQixVQUFNLGtCQUF3RjtBQUFBLE1BQzVGLHlDQUF5QyxDQUFDQSxXQUFpQ0E7QUFBQSxNQUMzRSxXQUFXO0FBQUEsTUFDWCx5Q0FBeUMsQ0FBQ0EsV0FBaUNBO0FBQUEsTUFDM0Usd0NBQXdDO0FBQUEsTUFDeEMsNkJBQTZCO0FBQUEsSUFDL0I7QUFFQSxVQUFNLGFBQW1GLEVBQUUsR0FBRyxpQkFBaUIsR0FBRyxRQUFRO0FBRTFILFVBQU0sbUJBQW1CLHNCQUFzQixjQUFjLEdBQUc7QUFFaEUsVUFBTSxXQUFXLEtBQUssT0FBTyxnQkFBZ0IsWUFBWSxZQUFZO0FBRXJFLFVBQU0sUUFBUSxTQUFTO0FBRXZCLFVBQU0scUJBQXFCLDJCQUEyQixjQUFjO0FBQ3BFLHdCQUFvQixvQkFBb0IsV0FBVyx3Q0FBd0MsU0FBUyxZQUFZLENBQUM7QUFFakgsUUFBSSxTQUFTLGlCQUFpQixTQUFTLGdCQUFnQixzQkFBc0IsV0FBVyx3Q0FBd0M7QUFDOUgseUJBQW1CLE1BQU07QUFBQSxJQUMzQixPQUFPO0FBQ0wscUJBQWUsU0FBUyxXQUFXLHdDQUF3QyxLQUFLLENBQUM7QUFBQSxJQUNuRjtBQUVBLG1CQUFlLFNBQVMsT0FBTyxZQUFZO0FBQ3pDLFVBQUksb0JBQW9CLFFBQVEsS0FBSyxXQUFXLHdDQUF3QztBQUN0RixpQkFBUyxNQUFNO0FBQ2Y7QUFBQSxNQUNGO0FBRUEsWUFBTSxXQUFXLFNBQVM7QUFDMUIsWUFBTSxpQkFBaUIsV0FBVyx3Q0FBd0MsT0FBTztBQUNqRixVQUFJLDBCQUEwQixjQUFjLEdBQUc7QUFDN0MsaUJBQVMscUJBQXFCLGVBQWUsaUJBQWlCO0FBQUEsTUFDaEUsT0FBTztBQUNMLGNBQU0sU0FBUyxvQkFBb0IsY0FBYztBQUFBLE1BQ25EO0FBQ0EsWUFBTSxXQUFXLDBCQUEwQixjQUFjLElBQUksU0FBWTtBQUN6RSxZQUFNLFdBQVcsVUFBVSxVQUFVLFFBQVE7QUFBQSxJQUMvQyxDQUFDO0FBRUQsc0JBQWtCLGlCQUFpQixTQUFTLFFBQVE7QUFDcEQsc0JBQWtCLGlCQUFpQixRQUFRLFFBQVE7QUFFbkQsYUFBUztBQUNULFdBQU87QUFFUCxhQUFTLFdBQWlCO0FBQ3hCLFVBQUksQ0FBQyxrQkFBa0I7QUFDckI7QUFBQSxNQUNGO0FBRUEsVUFBSSxDQUFDLFNBQVMsbUJBQW1CO0FBQy9CLHlCQUFpQixrQkFBa0IsRUFBRTtBQUNyQyx5QkFBaUIsY0FBYztBQUMvQixpQkFBUyxxQkFBcUIsaUJBQWlCLGlCQUFpQjtBQUFBLE1BQ2xFO0FBRUEsdUJBQWlCLGtCQUFrQixTQUFTLGlCQUFpQjtBQUM3RCxpQkFBVyxrQkFBa0IsU0FBUyxpQkFBaUI7QUFDdkQsVUFBSSxpQkFBaUIsZ0JBQWdCLEtBQUssV0FBVyw2QkFBNkI7QUFDaEYseUJBQWlCLGVBQWU7QUFBQSxNQUNsQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFZ0IsT0FBYTtBQUMzQixVQUFNLEtBQUs7QUFDWCxzQkFBa0IsTUFBTSxLQUFLLE9BQU8sZ0JBQWdCLFdBQVcsQ0FBQztBQUFBLEVBQ2xFO0FBQUEsRUFFTyxPQUFhO0FBQ2xCLFNBQUssSUFBSSxRQUFRLFFBQVEsSUFBSTtBQUFBLEVBQy9CO0FBQ0Y7IiwKICAibmFtZXMiOiBbInZhbHVlIl0KfQo=