obsidian-dev-utils 80.1.0 → 81.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 (213) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/dev/main.js +30208 -0
  3. package/dist/dev/manifest.json +9 -0
  4. package/dist/lib/cjs/async-events.cjs +9 -1
  5. package/dist/lib/cjs/async-events.d.cts +8 -0
  6. package/dist/lib/cjs/async.cjs +89 -34
  7. package/dist/lib/cjs/async.d.cts +67 -15
  8. package/dist/lib/cjs/debug.cjs +26 -9
  9. package/dist/lib/cjs/debug.d.cts +23 -5
  10. package/dist/lib/cjs/error.cjs +4 -5
  11. package/dist/lib/cjs/error.d.cts +19 -4
  12. package/dist/lib/cjs/html-element.cjs +1 -1
  13. package/dist/lib/cjs/html-element.d.cts +2 -0
  14. package/dist/lib/cjs/library.cjs +2 -2
  15. package/dist/lib/cjs/object-utils.cjs +233 -128
  16. package/dist/lib/cjs/object-utils.d.cts +19 -4
  17. package/dist/lib/cjs/obsidian/async-with-notice.cjs +9 -6
  18. package/dist/lib/cjs/obsidian/async-with-notice.d.cts +9 -0
  19. package/dist/lib/cjs/obsidian/attachment-path.cjs +45 -13
  20. package/dist/lib/cjs/obsidian/attachment-path.d.cts +38 -8
  21. package/dist/lib/cjs/obsidian/backlink.cjs +6 -6
  22. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +53 -16
  23. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +81 -9
  24. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +25 -5
  25. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +35 -1
  26. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +33 -19
  27. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.d.cts +43 -17
  28. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +33 -19
  29. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.d.cts +43 -17
  30. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +17 -9
  31. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +48 -8
  32. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +24 -8
  33. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +25 -4
  34. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +144 -65
  35. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +3 -0
  36. package/dist/lib/cjs/obsidian/dataview-link.cjs +7 -2
  37. package/dist/lib/cjs/obsidian/dataview-link.d.cts +20 -5
  38. package/dist/lib/cjs/obsidian/dataview.cjs +27 -10
  39. package/dist/lib/cjs/obsidian/dataview.d.cts +19 -4
  40. package/dist/lib/cjs/obsidian/file-change.cjs +103 -27
  41. package/dist/lib/cjs/obsidian/file-change.d.cts +50 -13
  42. package/dist/lib/cjs/obsidian/file-manager.cjs +61 -32
  43. package/dist/lib/cjs/obsidian/file-manager.d.cts +63 -13
  44. package/dist/lib/cjs/obsidian/file-system.cjs +122 -23
  45. package/dist/lib/cjs/obsidian/file-system.d.cts +168 -39
  46. package/dist/lib/cjs/obsidian/frontmatter.cjs +7 -2
  47. package/dist/lib/cjs/obsidian/link.cjs +266 -122
  48. package/dist/lib/cjs/obsidian/link.d.cts +84 -20
  49. package/dist/lib/cjs/obsidian/logger.cjs +48 -22
  50. package/dist/lib/cjs/obsidian/logger.d.cts +26 -5
  51. package/dist/lib/cjs/obsidian/loop.cjs +14 -4
  52. package/dist/lib/cjs/obsidian/loop.d.cts +5 -0
  53. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +155 -107
  54. package/dist/lib/cjs/obsidian/markdown.cjs +40 -11
  55. package/dist/lib/cjs/obsidian/markdown.d.cts +76 -16
  56. package/dist/lib/cjs/obsidian/metadata-cache.cjs +28 -14
  57. package/dist/lib/cjs/obsidian/metadata-cache.d.cts +76 -16
  58. package/dist/lib/cjs/obsidian/path-settings.cjs +5 -2
  59. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +5 -1
  60. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +4 -0
  61. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +15 -7
  62. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +39 -8
  63. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +3 -2
  64. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +4 -4
  65. package/dist/lib/cjs/obsidian/queue.cjs +9 -7
  66. package/dist/lib/cjs/obsidian/resource-url.cjs +7 -2
  67. package/dist/lib/cjs/obsidian/resource-url.d.cts +19 -4
  68. package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +4 -2
  69. package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +6 -2
  70. package/dist/lib/cjs/obsidian/vault-delete.cjs +19 -15
  71. package/dist/lib/cjs/obsidian/vault-delete.d.cts +11 -6
  72. package/dist/lib/cjs/obsidian/vault.cjs +116 -59
  73. package/dist/lib/cjs/obsidian/vault.d.cts +178 -41
  74. package/dist/lib/cjs/path.cjs +12 -5
  75. package/dist/lib/cjs/path.d.cts +15 -3
  76. package/dist/lib/cjs/reg-exp.cjs +101 -78
  77. package/dist/lib/cjs/script-utils/build.cjs +9 -5
  78. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +34 -14
  79. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +20 -5
  80. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +23 -5
  81. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +11 -4
  82. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +6 -2
  83. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +31 -12
  84. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +19 -4
  85. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +7 -7
  86. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +12 -3
  87. package/dist/lib/cjs/script-utils/cli-utils.cjs +6 -2
  88. package/dist/lib/cjs/script-utils/exec.cjs +47 -12
  89. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -3
  90. package/dist/lib/cjs/script-utils/json.cjs +9 -5
  91. package/dist/lib/cjs/script-utils/json.d.cts +38 -8
  92. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +8 -3
  93. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +27 -7
  94. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +7 -3
  95. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +8 -3
  96. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -3
  97. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +3 -3
  98. package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +72 -30
  99. package/dist/lib/cjs/script-utils/npm-publish.cjs +2 -2
  100. package/dist/lib/cjs/script-utils/npm.cjs +18 -9
  101. package/dist/lib/cjs/script-utils/root.cjs +20 -5
  102. package/dist/lib/cjs/script-utils/root.d.cts +45 -9
  103. package/dist/lib/cjs/script-utils/validate-declarations.cjs +4 -3
  104. package/dist/lib/cjs/script-utils/version.cjs +36 -19
  105. package/dist/lib/cjs/strict-proxy.cjs +10 -1
  106. package/dist/lib/cjs/string.cjs +63 -22
  107. package/dist/lib/cjs/string.d.cts +188 -40
  108. package/dist/lib/esm/async-events.d.mts +8 -0
  109. package/dist/lib/esm/async-events.mjs +9 -1
  110. package/dist/lib/esm/async.d.mts +67 -15
  111. package/dist/lib/esm/async.mjs +89 -34
  112. package/dist/lib/esm/debug.d.mts +23 -5
  113. package/dist/lib/esm/debug.mjs +26 -9
  114. package/dist/lib/esm/error.d.mts +19 -4
  115. package/dist/lib/esm/error.mjs +4 -5
  116. package/dist/lib/esm/html-element.d.mts +2 -0
  117. package/dist/lib/esm/html-element.mjs +1 -1
  118. package/dist/lib/esm/library.mjs +2 -2
  119. package/dist/lib/esm/object-utils.d.mts +19 -4
  120. package/dist/lib/esm/object-utils.mjs +233 -128
  121. package/dist/lib/esm/obsidian/async-with-notice.d.mts +9 -0
  122. package/dist/lib/esm/obsidian/async-with-notice.mjs +9 -6
  123. package/dist/lib/esm/obsidian/attachment-path.d.mts +38 -8
  124. package/dist/lib/esm/obsidian/attachment-path.mjs +45 -13
  125. package/dist/lib/esm/obsidian/backlink.mjs +6 -6
  126. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +81 -9
  127. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +53 -16
  128. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +35 -1
  129. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +25 -5
  130. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.d.mts +43 -17
  131. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +33 -19
  132. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.d.mts +43 -17
  133. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +33 -19
  134. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +48 -8
  135. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +17 -9
  136. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +25 -4
  137. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +24 -8
  138. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +3 -0
  139. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +145 -69
  140. package/dist/lib/esm/obsidian/dataview-link.d.mts +20 -5
  141. package/dist/lib/esm/obsidian/dataview-link.mjs +7 -2
  142. package/dist/lib/esm/obsidian/dataview.d.mts +19 -4
  143. package/dist/lib/esm/obsidian/dataview.mjs +27 -10
  144. package/dist/lib/esm/obsidian/file-change.d.mts +50 -13
  145. package/dist/lib/esm/obsidian/file-change.mjs +104 -27
  146. package/dist/lib/esm/obsidian/file-manager.d.mts +63 -13
  147. package/dist/lib/esm/obsidian/file-manager.mjs +65 -33
  148. package/dist/lib/esm/obsidian/file-system.d.mts +168 -39
  149. package/dist/lib/esm/obsidian/file-system.mjs +122 -23
  150. package/dist/lib/esm/obsidian/frontmatter.mjs +7 -2
  151. package/dist/lib/esm/obsidian/link.d.mts +84 -20
  152. package/dist/lib/esm/obsidian/link.mjs +266 -122
  153. package/dist/lib/esm/obsidian/logger.d.mts +26 -5
  154. package/dist/lib/esm/obsidian/logger.mjs +48 -22
  155. package/dist/lib/esm/obsidian/loop.d.mts +5 -0
  156. package/dist/lib/esm/obsidian/loop.mjs +14 -4
  157. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +155 -107
  158. package/dist/lib/esm/obsidian/markdown.d.mts +76 -16
  159. package/dist/lib/esm/obsidian/markdown.mjs +40 -11
  160. package/dist/lib/esm/obsidian/metadata-cache.d.mts +76 -16
  161. package/dist/lib/esm/obsidian/metadata-cache.mjs +28 -14
  162. package/dist/lib/esm/obsidian/path-settings.mjs +5 -2
  163. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +4 -0
  164. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +5 -1
  165. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +39 -8
  166. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +15 -7
  167. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +4 -4
  168. package/dist/lib/esm/obsidian/plugin/plugin.mjs +5 -7
  169. package/dist/lib/esm/obsidian/queue.mjs +9 -7
  170. package/dist/lib/esm/obsidian/resource-url.d.mts +19 -4
  171. package/dist/lib/esm/obsidian/resource-url.mjs +7 -2
  172. package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +6 -2
  173. package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +4 -2
  174. package/dist/lib/esm/obsidian/vault-delete.d.mts +11 -6
  175. package/dist/lib/esm/obsidian/vault-delete.mjs +19 -15
  176. package/dist/lib/esm/obsidian/vault.d.mts +178 -41
  177. package/dist/lib/esm/obsidian/vault.mjs +116 -59
  178. package/dist/lib/esm/path.d.mts +15 -3
  179. package/dist/lib/esm/path.mjs +12 -5
  180. package/dist/lib/esm/reg-exp.mjs +101 -78
  181. package/dist/lib/esm/script-utils/build.mjs +9 -5
  182. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +34 -14
  183. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +23 -5
  184. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +20 -5
  185. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +11 -4
  186. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +6 -2
  187. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +19 -4
  188. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +31 -12
  189. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +7 -7
  190. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +12 -3
  191. package/dist/lib/esm/script-utils/cli-utils.mjs +6 -2
  192. package/dist/lib/esm/script-utils/exec.mjs +47 -12
  193. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -3
  194. package/dist/lib/esm/script-utils/json.d.mts +38 -8
  195. package/dist/lib/esm/script-utils/json.mjs +9 -5
  196. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +8 -3
  197. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +27 -7
  198. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +7 -3
  199. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +8 -3
  200. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -3
  201. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +3 -3
  202. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +72 -30
  203. package/dist/lib/esm/script-utils/npm-publish.mjs +2 -2
  204. package/dist/lib/esm/script-utils/npm.mjs +18 -9
  205. package/dist/lib/esm/script-utils/root.d.mts +45 -9
  206. package/dist/lib/esm/script-utils/root.mjs +20 -5
  207. package/dist/lib/esm/script-utils/validate-declarations.mjs +4 -3
  208. package/dist/lib/esm/script-utils/version.mjs +36 -19
  209. package/dist/lib/esm/strict-proxy.mjs +10 -1
  210. package/dist/lib/esm/string.d.mts +188 -40
  211. package/dist/lib/esm/string.mjs +63 -22
  212. package/dist/styles.css +5 -1
  213. package/package.json +9 -9
@@ -10,36 +10,86 @@ import type { MaybeReturn } from '../type.cjs';
10
10
  import type { PathOrFile } from './file-system.cjs';
11
11
  import type { CombinedFrontmatter } from './frontmatter.cjs';
12
12
  import type { ProcessOptions } from './vault.cjs';
13
+ /**
14
+ * Parameters for {@link addAlias}.
15
+ */
16
+ export interface AddAliasParams {
17
+ /**
18
+ * The alias to add.
19
+ */
20
+ readonly alias?: string;
21
+ /**
22
+ * The Obsidian app instance.
23
+ */
24
+ readonly app: App;
25
+ /**
26
+ * The path or TFile object representing the note.
27
+ */
28
+ readonly pathOrFile: PathOrFile;
29
+ }
30
+ /**
31
+ * Parameters for {@link deleteAlias}.
32
+ */
33
+ export interface DeleteAliasParams {
34
+ /**
35
+ * The alias to delete.
36
+ */
37
+ readonly alias?: string;
38
+ /**
39
+ * The Obsidian app instance.
40
+ */
41
+ readonly app: App;
42
+ /**
43
+ * The path or TFile object representing the note.
44
+ */
45
+ readonly pathOrFile: PathOrFile;
46
+ }
13
47
  /**
14
48
  * Options for {@link processFrontmatter}.
15
49
  */
16
50
  export type ProcessFrontmatterOptions = ProcessOptions;
51
+ /**
52
+ * Parameters for {@link processFrontmatter}.
53
+ *
54
+ * @typeParam CustomFrontmatter - The type of custom front matter.
55
+ */
56
+ export interface ProcessFrontmatterParams<CustomFrontmatter = unknown> extends ProcessFrontmatterOptions {
57
+ /**
58
+ * The Obsidian app instance.
59
+ */
60
+ readonly app: App;
61
+ /**
62
+ * A function that modifies the front matter.
63
+ *
64
+ * @param frontmatter - The front matter to modify.
65
+ * @param abortSignal - The abort signal to listen to.
66
+ * @returns A value that may be `null` to abort the process.
67
+ */
68
+ frontmatterFn(this: void, frontmatter: CombinedFrontmatter<CustomFrontmatter>, abortSignal: AbortSignal): Promisable<MaybeReturn<null>>;
69
+ /**
70
+ * The path or TFile object representing the note.
71
+ */
72
+ readonly pathOrFile: PathOrFile;
73
+ }
17
74
  /**
18
75
  * Adds an alias to the front matter of a given file if it does not already exist.
19
76
  *
20
- * @param app - The Obsidian app instance.
21
- * @param pathOrFile - The path or TFile object representing the note.
22
- * @param alias - The alias to add.
77
+ * @param params - The parameters for adding the alias.
23
78
  * @returns A {@link Promise} that resolves when the alias has been added.
24
79
  */
25
- export declare function addAlias(app: App, pathOrFile: PathOrFile, alias?: string): Promise<void>;
80
+ export declare function addAlias(params: AddAliasParams): Promise<void>;
26
81
  /**
27
82
  * Deletes an alias from the front matter of a given file if it exists.
28
83
  *
29
- * @param app - The Obsidian app instance.
30
- * @param pathOrFile - The path or TFile object representing the note.
31
- * @param alias - The alias to delete.
84
+ * @param params - The parameters for deleting the alias.
32
85
  * @returns A {@link Promise} that resolves when the alias has been deleted.
33
86
  */
34
- export declare function deleteAlias(app: App, pathOrFile: PathOrFile, alias?: string): Promise<void>;
87
+ export declare function deleteAlias(params: DeleteAliasParams): Promise<void>;
35
88
  /**
36
89
  * Processes the front matter of a given file, allowing modifications via a provided function.
37
90
  *
38
91
  * @typeParam CustomFrontmatter - The type of custom front matter.
39
- * @param app - The Obsidian app instance.
40
- * @param pathOrFile - The path or TFile object representing the note.
41
- * @param frontmatterFn - A function that modifies the front matter.
42
- * @param options - Optional. Configuration options for retrying the process. If not provided, default options will be used.
92
+ * @param params - The parameters for processing the front matter.
43
93
  * @returns A {@link Promise} that resolves when the front matter has been processed and saved.
44
94
  */
45
- export declare function processFrontmatter<CustomFrontmatter = unknown>(app: App, pathOrFile: PathOrFile, frontmatterFn: (frontmatter: CombinedFrontmatter<CustomFrontmatter>, abortSignal: AbortSignal) => Promisable<MaybeReturn<null>>, options?: ProcessFrontmatterOptions): Promise<void>;
95
+ export declare function processFrontmatter<CustomFrontmatter = unknown>(params: ProcessFrontmatterParams<CustomFrontmatter>): Promise<void>;
@@ -160,6 +160,7 @@ __export(file_system_exports, {
160
160
  module.exports = __toCommonJS(file_system_exports);
161
161
  var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
162
162
  var import_obsidian = require('obsidian');
163
+ var import_object_utils = require('../object-utils.cjs');
163
164
  var import_path = require('../path.cjs');
164
165
  var import_string = require('../string.cjs');
165
166
  var import_type_guards = require('../type-guards.cjs');
@@ -211,8 +212,18 @@ function checkExtension(pathOrFile, extension) {
211
212
  }
212
213
  return false;
213
214
  }
214
- function exists(app, path, type, isCaseInsensitive) {
215
- const abstractFile = getAbstractFileOrNull(app, path, isCaseInsensitive);
215
+ function exists(params) {
216
+ const {
217
+ app,
218
+ isCaseInsensitive,
219
+ path,
220
+ type
221
+ } = params;
222
+ const abstractFile = getAbstractFileOrNull((0, import_object_utils.normalizeOptionalProperties)({
223
+ app,
224
+ isCaseInsensitive,
225
+ pathOrFile: path
226
+ }));
216
227
  if (!abstractFile) {
217
228
  return false;
218
229
  }
@@ -221,10 +232,27 @@ function exists(app, path, type, isCaseInsensitive) {
221
232
  }
222
233
  return getFileSystemType(abstractFile) === type;
223
234
  }
224
- function getAbstractFile(app, pathOrFile, isCaseInsensitive) {
225
- return (0, import_type_guards.ensureNonNullable)(getAbstractFileOrNull(app, pathOrFile, isCaseInsensitive), `Abstract file not found: ${pathOrFile}`);
235
+ function getAbstractFile(params) {
236
+ const {
237
+ app,
238
+ isCaseInsensitive,
239
+ pathOrFile
240
+ } = params;
241
+ return (0, import_type_guards.ensureNonNullable)(
242
+ getAbstractFileOrNull((0, import_object_utils.normalizeOptionalProperties)({
243
+ app,
244
+ isCaseInsensitive,
245
+ pathOrFile
246
+ })),
247
+ `Abstract file not found: ${pathOrFile}`
248
+ );
226
249
  }
227
- function getAbstractFileOrNull(app, pathOrFile, isCaseInsensitive) {
250
+ function getAbstractFileOrNull(params) {
251
+ const {
252
+ app,
253
+ isCaseInsensitive,
254
+ pathOrFile
255
+ } = params;
228
256
  if (pathOrFile === null) {
229
257
  return null;
230
258
  }
@@ -237,7 +265,11 @@ function getAbstractFileOrNull(app, pathOrFile, isCaseInsensitive) {
237
265
  }
238
266
  return app.vault.getAbstractFileByPath(pathOrFile.path) ?? pathOrFile;
239
267
  }
240
- const file = getFileInternal(app, pathOrFile, isCaseInsensitive);
268
+ const file = getFileInternal((0, import_object_utils.normalizeOptionalProperties)({
269
+ app,
270
+ isCaseInsensitive,
271
+ path: pathOrFile
272
+ }));
241
273
  if (file) {
242
274
  return file;
243
275
  }
@@ -245,10 +277,24 @@ function getAbstractFileOrNull(app, pathOrFile, isCaseInsensitive) {
245
277
  if (resolvedPath === pathOrFile) {
246
278
  return null;
247
279
  }
248
- return getFileInternal(app, resolvedPath, isCaseInsensitive);
280
+ return getFileInternal((0, import_object_utils.normalizeOptionalProperties)({
281
+ app,
282
+ isCaseInsensitive,
283
+ path: resolvedPath
284
+ }));
249
285
  }
250
- function getFile(app, pathOrFile, shouldIncludeNonExisting, isCaseInsensitive) {
251
- let file = getFileOrNull(app, pathOrFile, isCaseInsensitive);
286
+ function getFile(params) {
287
+ const {
288
+ app,
289
+ isCaseInsensitive,
290
+ pathOrFile,
291
+ shouldIncludeNonExisting
292
+ } = params;
293
+ let file = getFileOrNull((0, import_object_utils.normalizeOptionalProperties)({
294
+ app,
295
+ isCaseInsensitive,
296
+ pathOrFile
297
+ }));
252
298
  if (!file) {
253
299
  if (shouldIncludeNonExisting) {
254
300
  file = (0, import_implementations.createTFileInstance)(app, pathOrFile);
@@ -258,8 +304,17 @@ function getFile(app, pathOrFile, shouldIncludeNonExisting, isCaseInsensitive) {
258
304
  }
259
305
  return file;
260
306
  }
261
- function getFileOrNull(app, pathOrFile, isCaseInsensitive) {
262
- const file = getAbstractFileOrNull(app, pathOrFile, isCaseInsensitive);
307
+ function getFileOrNull(params) {
308
+ const {
309
+ app,
310
+ isCaseInsensitive,
311
+ pathOrFile
312
+ } = params;
313
+ const file = getAbstractFileOrNull((0, import_object_utils.normalizeOptionalProperties)({
314
+ app,
315
+ isCaseInsensitive,
316
+ pathOrFile
317
+ }));
263
318
  if (isFile(file)) {
264
319
  return file;
265
320
  }
@@ -274,8 +329,18 @@ function getFileSystemType(abstractFile) {
274
329
  }
275
330
  throw new Error("Abstract file is not a file or a folder");
276
331
  }
277
- function getFolder(app, pathOrFolder, shouldIncludeNonExisting, isCaseInsensitive) {
278
- let folder = getFolderOrNull(app, pathOrFolder, isCaseInsensitive);
332
+ function getFolder(params) {
333
+ const {
334
+ app,
335
+ isCaseInsensitive,
336
+ pathOrFolder,
337
+ shouldIncludeNonExisting
338
+ } = params;
339
+ let folder = getFolderOrNull((0, import_object_utils.normalizeOptionalProperties)({
340
+ app,
341
+ isCaseInsensitive,
342
+ pathOrFolder
343
+ }));
279
344
  if (!folder) {
280
345
  if (shouldIncludeNonExisting) {
281
346
  folder = (0, import_implementations.createTFolderInstance)(app, pathOrFolder);
@@ -285,15 +350,32 @@ function getFolder(app, pathOrFolder, shouldIncludeNonExisting, isCaseInsensitiv
285
350
  }
286
351
  return folder;
287
352
  }
288
- function getFolderOrNull(app, pathOrFolder, isCaseInsensitive) {
289
- const folder = getAbstractFileOrNull(app, pathOrFolder, isCaseInsensitive);
353
+ function getFolderOrNull(params) {
354
+ const {
355
+ app,
356
+ isCaseInsensitive,
357
+ pathOrFolder
358
+ } = params;
359
+ const folder = getAbstractFileOrNull((0, import_object_utils.normalizeOptionalProperties)({
360
+ app,
361
+ isCaseInsensitive,
362
+ pathOrFile: pathOrFolder
363
+ }));
290
364
  if (isFolder(folder)) {
291
365
  return folder;
292
366
  }
293
367
  return null;
294
368
  }
295
- function getMarkdownFiles(app, pathOrFolder, isRecursive) {
296
- const folder = getFolder(app, pathOrFolder);
369
+ function getMarkdownFiles(params) {
370
+ const {
371
+ app,
372
+ isRecursive,
373
+ pathOrFolder
374
+ } = params;
375
+ const folder = getFolder({
376
+ app,
377
+ pathOrFolder
378
+ });
297
379
  let markdownFiles = [];
298
380
  if (isRecursive) {
299
381
  import_obsidian.Vault.recurseChildren(folder, (abstractFile) => {
@@ -308,7 +390,10 @@ function getMarkdownFiles(app, pathOrFolder, isRecursive) {
308
390
  return markdownFiles;
309
391
  }
310
392
  async function getOrCreateFile(app, path) {
311
- const file = getFileOrNull(app, path);
393
+ const file = getFileOrNull({
394
+ app,
395
+ pathOrFile: path
396
+ });
312
397
  if (file) {
313
398
  return file;
314
399
  }
@@ -317,7 +402,10 @@ async function getOrCreateFile(app, path) {
317
402
  return await app.vault.create(path, "");
318
403
  }
319
404
  async function getOrCreateFolder(app, path) {
320
- const folder = getFolderOrNull(app, path);
405
+ const folder = getFolderOrNull({
406
+ app,
407
+ pathOrFolder: path
408
+ });
321
409
  if (folder) {
322
410
  return folder;
323
411
  }
@@ -327,7 +415,10 @@ function getPath(app, pathOrFile) {
327
415
  if (isAbstractFile(pathOrFile)) {
328
416
  return pathOrFile.path;
329
417
  }
330
- const file = getAbstractFileOrNull(app, pathOrFile);
418
+ const file = getAbstractFileOrNull({
419
+ app,
420
+ pathOrFile
421
+ });
331
422
  if (file) {
332
423
  return file.path;
333
424
  }
@@ -358,9 +449,17 @@ function trimMarkdownExtension(file) {
358
449
  if (!isMarkdownFile(file)) {
359
450
  return file.path;
360
451
  }
361
- return (0, import_string.trimEnd)(file.path, `.${MARKDOWN_FILE_EXTENSION}`);
452
+ return (0, import_string.trimEnd)({
453
+ str: file.path,
454
+ suffix: `.${MARKDOWN_FILE_EXTENSION}`
455
+ });
362
456
  }
363
- function getFileInternal(app, path, isCaseInsensitive) {
457
+ function getFileInternal(params) {
458
+ const {
459
+ app,
460
+ path
461
+ } = params;
462
+ let { isCaseInsensitive } = params;
364
463
  isCaseInsensitive ??= (0, import_implementations.getDataAdapterEx)(app).insensitive;
365
464
  if (isCaseInsensitive) {
366
465
  const caseInsensitiveFileIndex = (0, import_case_insensitive_file_index.getCaseInsensitiveFileIndex)(app);
@@ -408,4 +507,4 @@ function getResolvedPath(path) {
408
507
  isNote,
409
508
  trimMarkdownExtension
410
509
  });
411
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2ZpbGUtc3lzdGVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgVEFic3RyYWN0RmlsZX0sIHtAbGluayBURmlsZX0sIGFuZCB7QGxpbmsgVEZvbGRlcn0gaW5zdGFuY2VzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjcmVhdGVURmlsZUluc3RhbmNlLFxuICBjcmVhdGVURm9sZGVySW5zdGFuY2UsXG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXIsXG4gIFZhdWx0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgZXh0bmFtZSxcbiAgcmVzb2x2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IHRyaW1FbmQgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBnZXRDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXggfSBmcm9tICcuL2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC50cyc7XG5cbi8qKlxuICogQSBmaWxlIGV4dGVuc2lvbiBmb3IgYGJhc2VgIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3QgQkFTRV9GSUxFX0VYVEVOU0lPTiA9ICdiYXNlJztcblxuLyoqXG4gKiBBIGZpbGUgZXh0ZW5zaW9uIGZvciBgY2FudmFzYCBmaWxlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IENBTlZBU19GSUxFX0VYVEVOU0lPTiA9ICdjYW52YXMnO1xuXG4vKipcbiAqIEEgZmlsZSBleHRlbnNpb24gZm9yIGBtYXJrZG93bmAgZmlsZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTiA9ICdtZCc7XG5cbi8qKlxuICogQSB0eXBlIG9mIGZpbGUgc3lzdGVtIG9iamVjdC5cbiAqL1xuZXhwb3J0IGVudW0gRmlsZVN5c3RlbVR5cGUge1xuICAvKipcbiAgICogQSBmaWxlLlxuICAgKi9cbiAgRmlsZSA9ICdmaWxlJyxcbiAgLyoqXG4gICAqIEEgZm9sZGVyLlxuICAgKi9cbiAgRm9sZGVyID0gJ2ZvbGRlcidcbn1cblxuLyoqXG4gKiBBIHBhdGggb3IgYW4gYWJzdHJhY3QgZmlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGF0aE9yQWJzdHJhY3RGaWxlID0gc3RyaW5nIHwgVEFic3RyYWN0RmlsZTtcblxuLyoqXG4gKiBBIHBhdGggb3IgYSBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT3JGaWxlID0gc3RyaW5nIHwgVEZpbGU7XG5cbi8qKlxuICogQSBwYXRoIG9yIGEgZm9sZGVyLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT3JGb2xkZXIgPSBzdHJpbmcgfCBURm9sZGVyO1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIGFic3RyYWN0IGZpbGVzIHRvIGFuIGFycmF5IG9mIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGVzIC0gVGhlIGFic3RyYWN0IGZpbGVzIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgZmlsZXMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFueSBvZiB0aGUgYWJzdHJhY3QgZmlsZXMgYXJlIG5vdCBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXlPZkZpbGVzKGFic3RyYWN0RmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IFRGaWxlW10ge1xuICByZXR1cm4gYWJzdHJhY3RGaWxlcy5tYXAoKGFic3RyYWN0RmlsZSkgPT4gYXNGaWxlKGFic3RyYWN0RmlsZSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIGFic3RyYWN0IGZpbGVzIHRvIGFuIGFycmF5IG9mIGZvbGRlcnMuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZXMgLSBUaGUgYWJzdHJhY3QgZmlsZXMgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBmb2xkZXJzLlxuICogQHRocm93cyBFcnJvciBpZiBhbnkgb2YgdGhlIGFic3RyYWN0IGZpbGVzIGFyZSBub3QgZm9sZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXlPZkZvbGRlcnMoYWJzdHJhY3RGaWxlczogVEFic3RyYWN0RmlsZVtdKTogVEZvbGRlcltdIHtcbiAgcmV0dXJuIGFic3RyYWN0RmlsZXMubWFwKChhYnN0cmFjdEZpbGUpID0+IGFzRm9sZGVyKGFic3RyYWN0RmlsZSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFic3RyYWN0IGZpbGUgdG8gYSBmaWxlLlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGZpbGUuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ZpbGUoYWJzdHJhY3RGaWxlOiBudWxsIHwgVEFic3RyYWN0RmlsZSk6IFRGaWxlIHtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKGFzRmlsZU9yTnVsbChhYnN0cmFjdEZpbGUpLCAnQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWJzdHJhY3QgZmlsZSB0byBhIGZpbGUgb3IgYG51bGxgLlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGZpbGUgb3IgYG51bGxgLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNGaWxlT3JOdWxsKGFic3RyYWN0RmlsZTogbnVsbCB8IFRBYnN0cmFjdEZpbGUpOiBudWxsIHwgVEZpbGUge1xuICBpZiAoYWJzdHJhY3RGaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgcmV0dXJuIGFic3RyYWN0RmlsZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0Fic3RyYWN0IGZpbGUgaXMgbm90IGEgZmlsZScpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFic3RyYWN0IGZpbGUgdG8gYSBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVyLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ZvbGRlcihhYnN0cmFjdEZpbGU6IG51bGwgfCBUQWJzdHJhY3RGaWxlKTogVEZvbGRlciB7XG4gIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShhc0ZvbGRlck9yTnVsbChhYnN0cmFjdEZpbGUpLCAnQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmb2xkZXInKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhYnN0cmFjdCBmaWxlIHRvIGEgZm9sZGVyIG9yIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0gYWJzdHJhY3RGaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgb3IgYG51bGxgLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ZvbGRlck9yTnVsbChhYnN0cmFjdEZpbGU6IG51bGwgfCBUQWJzdHJhY3RGaWxlKTogbnVsbCB8IFRGb2xkZXIge1xuICBpZiAoYWJzdHJhY3RGaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGb2xkZXIpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmb2xkZXInKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhdGggb3IgZmlsZSBoYXMgdGhlIHNwZWNpZmllZCBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlIHRvIGNoZWNrLlxuICogQHBhcmFtIGV4dGVuc2lvbiAtIFRoZSBleHRlbnNpb24gdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHJldHVybnMgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggb3IgZmlsZSBoYXMgdGhlIHNwZWNpZmllZCBleHRlbnNpb24sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFeHRlbnNpb24ocGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZSwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzRmlsZShwYXRoT3JGaWxlKSkge1xuICAgIHJldHVybiBwYXRoT3JGaWxlLmV4dGVuc2lvbiA9PT0gZXh0ZW5zaW9uO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXRoT3JGaWxlID09PSAnc3RyaW5nJykge1xuICAgIC8vIENvbXBhcmUgdGhlIHBhdGgncyBvd24gZXh0ZW5zaW9uIGluc3RlYWQgb2YgcmVzb2x2aW5nIHRoZSBmaWxlLlxuICAgIC8vIFJlc29sdmluZyBhIHN0cmluZyBwYXRoIGlzIE8odmF1bHQpIG9uIGEgbWlzcyBvbiBhIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbS5cbiAgICAvLyBUaGF0IG1pc3MgaXMgdGhlIGhvdCBwYXRoIGR1cmluZyBkZWxldGlvbiBjYXNjYWRlcy5cbiAgICAvLyBPYnNpZGlhbiBsb3dlcmNhc2VzIGEgZmlsZSdzIGNhbm9uaWNhbCBleHRlbnNpb24sIHNvIGNvbXBhcmUgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgIHJldHVybiBleHRuYW1lKHBhdGhPckZpbGUpLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkgPT09IGV4dGVuc2lvbjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhdGggZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCB0byBjaGVjay4gRGVmYXVsdCBpcyBgdW5kZWZpbmVkYC5cbiAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZSAtIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gRGVmYXVsdCBpcyBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBleGlzdHMsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcsIHR5cGU/OiBGaWxlU3lzdGVtVHlwZSwgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbChhcHAsIHBhdGgsIGlzQ2FzZUluc2Vuc2l0aXZlKTtcbiAgaWYgKCFhYnN0cmFjdEZpbGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZVN5c3RlbVR5cGUoYWJzdHJhY3RGaWxlKSA9PT0gdHlwZTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIFRBYnN0cmFjdEZpbGUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gcGF0aCBvciBhYnN0cmFjdCBmaWxlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlIHRvIHJldHJpZXZlIHRoZSBhYnN0cmFjdCBmaWxlIGZvci5cbiAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZSAtIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGFic3RyYWN0IGZpbGUuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFic3RyYWN0RmlsZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlLCBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4pOiBUQWJzdHJhY3RGaWxlIHtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKGdldEFic3RyYWN0RmlsZU9yTnVsbChhcHAsIHBhdGhPckZpbGUsIGlzQ2FzZUluc2Vuc2l0aXZlKSwgYEFic3RyYWN0IGZpbGUgbm90IGZvdW5kOiAke3BhdGhPckZpbGUgYXMgc3RyaW5nfWApO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhYnN0cmFjdCBmaWxlIG9yIGBudWxsYCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGF0aCBvciBhYnN0cmFjdCBmaWxlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmV0cmlldmUuXG4gKiBAcGFyYW0gaXNDYXNlSW5zZW5zaXRpdmUgLSBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEByZXR1cm5zIFRoZSBhYnN0cmFjdCBmaWxlIGlmIGZvdW5kLCBvdGhlcndpc2UgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yQWJzdHJhY3RGaWxlLCBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW4pOiBudWxsIHwgVEFic3RyYWN0RmlsZSB7XG4gIGlmIChwYXRoT3JGaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaXNBYnN0cmFjdEZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICBpZiAoaXNGaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgICByZXR1cm4gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgocGF0aE9yRmlsZS5wYXRoKSA/PyBwYXRoT3JGaWxlO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gVEFic3RyYWN0RmlsZSBpcyBhbHdheXMgVEZpbGUgb3IgVEZvbGRlciBpbiBPYnNpZGlhbjsgZGVmZW5zaXZlIGZhbGxiYWNrLiAqL1xuICAgIGlmIChpc0ZvbGRlcihwYXRoT3JGaWxlKSkge1xuICAgICAgcmV0dXJuIGFwcC52YXVsdC5nZXRGb2xkZXJCeVBhdGgocGF0aE9yRmlsZS5wYXRoKSA/PyBwYXRoT3JGaWxlO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBUQWJzdHJhY3RGaWxlIGlzIGFsd2F5cyBURmlsZSBvciBURm9sZGVyIGluIE9ic2lkaWFuOyBkZWZlbnNpdmUgZmFsbGJhY2suICovXG4gICAgcmV0dXJuIGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgocGF0aE9yRmlsZS5wYXRoKSA/PyBwYXRoT3JGaWxlO1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cblxuICBjb25zdCBmaWxlID0gZ2V0RmlsZUludGVybmFsKGFwcCwgcGF0aE9yRmlsZSwgaXNDYXNlSW5zZW5zaXRpdmUpO1xuXG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGggPSBnZXRSZXNvbHZlZFBhdGgocGF0aE9yRmlsZSk7XG5cbiAgaWYgKHJlc29sdmVkUGF0aCA9PT0gcGF0aE9yRmlsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldEZpbGVJbnRlcm5hbChhcHAsIHJlc29sdmVkUGF0aCwgaXNDYXNlSW5zZW5zaXRpdmUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhdGggb3IgZmlsZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byByZXRyaWV2ZSB0aGUgZmlsZSBmb3IuXG4gKiBAcGFyYW0gc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nIC0gV2hldGhlciB0byBpbmNsdWRlIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKiAgSWYgYHRydWVgLCBhIG5ldyBmaWxlIGlzIGNyZWF0ZWQgZm9yIHRoZSBwcm92aWRlZCBwYXRoLlxuICogIElmIGBmYWxzZWAsIGFuIGVycm9yIGlzIHRocm93biBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQuXG4gKiBAcGFyYW0gaXNDYXNlSW5zZW5zaXRpdmUgLSBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIHBhdGggb3IgZmlsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nPzogYm9vbGVhbiwgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuKTogVEZpbGUge1xuICBsZXQgZmlsZSA9IGdldEZpbGVPck51bGwoYXBwLCBwYXRoT3JGaWxlLCBpc0Nhc2VJbnNlbnNpdGl2ZSk7XG4gIGlmICghZmlsZSkge1xuICAgIGlmIChzaG91bGRJbmNsdWRlTm9uRXhpc3RpbmcpIHtcbiAgICAgIGZpbGUgPSBjcmVhdGVURmlsZUluc3RhbmNlKGFwcCwgcGF0aE9yRmlsZSBhcyBzdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke3BhdGhPckZpbGUgYXMgc3RyaW5nfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWxlO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGZpbGUgb3IgYG51bGxgIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXRoIG9yIGZpbGUuXG4gKiBJZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgYWxyZWFkeSBhIGZpbGUsIGl0IGlzIHJldHVybmVkIGFzIGlzLlxuICogT3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgYXBwJ3MgdmF1bHQgdG8gcmV0cmlldmUgdGhlIGZpbGUgYnkgaXRzIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUuXG4gKiBAcGFyYW0gaXNDYXNlSW5zZW5zaXRpdmUgLSBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGlmIGZvdW5kLCBvdGhlcndpc2UgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZU9yTnVsbChhcHA6IEFwcCwgcGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckZpbGUsIGlzQ2FzZUluc2Vuc2l0aXZlPzogYm9vbGVhbik6IG51bGwgfCBURmlsZSB7XG4gIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoYXBwLCBwYXRoT3JGaWxlLCBpc0Nhc2VJbnNlbnNpdGl2ZSk7XG4gIGlmIChpc0ZpbGUoZmlsZSkpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIG9mIGEgZmlsZSBzeXN0ZW0gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBnZXQgdGhlIHR5cGUgb2YuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgYWJzdHJhY3QgZmlsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFic3RyYWN0IGZpbGUgaXMgbm90IGEgZmlsZSBvciBhIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVTeXN0ZW1UeXBlKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSk6IEZpbGVTeXN0ZW1UeXBlIHtcbiAgaWYgKGlzRmlsZShhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIEZpbGVTeXN0ZW1UeXBlLkZpbGU7XG4gIH1cbiAgaWYgKGlzRm9sZGVyKGFic3RyYWN0RmlsZSkpIHtcbiAgICByZXR1cm4gRmlsZVN5c3RlbVR5cGUuRm9sZGVyO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlIG9yIGEgZm9sZGVyJyk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZm9sZGVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcHAgYW5kIHBhdGhPckZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgcGF0aCBvciBmb2xkZXIgaWRlbnRpZmllci5cbiAqIEBwYXJhbSBzaG91bGRJbmNsdWRlTm9uRXhpc3RpbmcgLSBXaGV0aGVyIHRvIGFsbG93IHRoZSBmb2xkZXIgdG8gbm90IGV4aXN0LlxuICogIElmIGB0cnVlYCwgYSBuZXcgZm9sZGVyIGlzIGNyZWF0ZWQgZm9yIHRoZSBwcm92aWRlZCBwYXRoLlxuICogIElmIGBmYWxzZWAsIGFuIGVycm9yIGlzIHRocm93biBpZiB0aGUgZm9sZGVyIGlzIG5vdCBmb3VuZC5cbiAqIEBwYXJhbSBpc0Nhc2VJbnNlbnNpdGl2ZSAtIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIHJldHJpZXZlZCBmb2xkZXIuXG4gKiBAdGhyb3dzIElmIHRoZSBmb2xkZXIgaXMgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9sZGVyKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IFBhdGhPckZvbGRlciwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nPzogYm9vbGVhbiwgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuKTogVEZvbGRlciB7XG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBwYXRoT3JGb2xkZXIsIGlzQ2FzZUluc2Vuc2l0aXZlKTtcbiAgaWYgKCFmb2xkZXIpIHtcbiAgICBpZiAoc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nKSB7XG4gICAgICBmb2xkZXIgPSBjcmVhdGVURm9sZGVySW5zdGFuY2UoYXBwLCBwYXRoT3JGb2xkZXIgYXMgc3RyaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb2xkZXIgbm90IGZvdW5kOiAke3BhdGhPckZvbGRlciBhcyBzdHJpbmd9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZvbGRlcjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBmb2xkZXIgb3IgYG51bGxgIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXRoIG9yIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBwYXRoIG9yIGZvbGRlciB0byByZXRyaWV2ZSB0aGUgZm9sZGVyIGZyb20uXG4gKiBAcGFyYW0gaXNDYXNlSW5zZW5zaXRpdmUgLSBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgaWYgZm91bmQsIG90aGVyd2lzZSBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJPck51bGwoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogbnVsbCB8IFBhdGhPckZvbGRlciwgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuKTogbnVsbCB8IFRGb2xkZXIge1xuICBjb25zdCBmb2xkZXIgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoYXBwLCBwYXRoT3JGb2xkZXIsIGlzQ2FzZUluc2Vuc2l0aXZlKTtcbiAgaWYgKGlzRm9sZGVyKGZvbGRlcikpIHtcbiAgICByZXR1cm4gZm9sZGVyO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBmaWxlcyByZXByZXNlbnRpbmcgdGhlIG1hcmtkb3duIGZpbGVzIHdpdGhpbiBhIHNwZWNpZmllZCBmb2xkZXIgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgcGF0aCBvciBmb2xkZXIgdG8gcmV0cmlldmUgdGhlIG1hcmtkb3duIGZpbGVzIGZyb20uXG4gKiBAcGFyYW0gaXNSZWN1cnNpdmUgLSBPcHRpb25hbC4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmVjdXJzaXZlbHkgc2VhcmNoIGZvciBtYXJrZG93biBmaWxlcyB3aXRoaW4gc3ViZm9sZGVycy4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBtYXJrZG93biBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtkb3duRmlsZXMoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyLCBpc1JlY3Vyc2l2ZT86IGJvb2xlYW4pOiBURmlsZVtdIHtcbiAgY29uc3QgZm9sZGVyID0gZ2V0Rm9sZGVyKGFwcCwgcGF0aE9yRm9sZGVyKTtcblxuICBsZXQgbWFya2Rvd25GaWxlczogVEZpbGVbXSA9IFtdO1xuXG4gIGlmIChpc1JlY3Vyc2l2ZSkge1xuICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihmb2xkZXIsIChhYnN0cmFjdEZpbGUpID0+IHtcbiAgICAgIGlmIChpc01hcmtkb3duRmlsZShhYnN0cmFjdEZpbGUpICYmIGFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICAgIG1hcmtkb3duRmlsZXMucHVzaChhYnN0cmFjdEZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG1hcmtkb3duRmlsZXMgPSBmb2xkZXIuY2hpbGRyZW4uZmlsdGVyKChmaWxlKSA9PiBpc01hcmtkb3duRmlsZShmaWxlKSkgYXMgVEZpbGVbXTtcbiAgfVxuXG4gIG1hcmtkb3duRmlsZXMgPSBtYXJrZG93bkZpbGVzLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpO1xuICByZXR1cm4gbWFya2Rvd25GaWxlcztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZpbGUgZm9yIHRoZSBnaXZlbiBwYXRoIG9yIGNyZWF0ZXMgYSBuZXcgb25lIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byByZXRyaWV2ZSBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSByZXByZXNlbnRpbmcgdGhlIGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlRmlsZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyUGF0aCA9IHBhcmVudEZvbGRlclBhdGgocGF0aCk7XG4gIGF3YWl0IGdldE9yQ3JlYXRlRm9sZGVyKGFwcCwgZm9sZGVyUGF0aCk7XG5cbiAgcmV0dXJuIGF3YWl0IGFwcC52YXVsdC5jcmVhdGUocGF0aCwgJycpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZm9sZGVyIGZvciB0aGUgZ2l2ZW4gcGF0aCBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBpdCBkb2VzIG5vdCBleGlzdC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byByZXRyaWV2ZSBvciBjcmVhdGUuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVyIHJlcHJlc2VudGluZyB0aGUgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGb2xkZXIoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8VEZvbGRlcj4ge1xuICBjb25zdCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBwYXRoKTtcbiAgaWYgKGZvbGRlcikge1xuICAgIHJldHVybiBmb2xkZXI7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBnaXZlbiBgcGF0aE9yRmlsZWAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgcGF0aCBvZiB0aGUgYHBhdGhPckZpbGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlKTogc3RyaW5nIHtcbiAgaWYgKGlzQWJzdHJhY3RGaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgcmV0dXJuIHBhdGhPckZpbGUucGF0aDtcbiAgfVxuXG4gIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoYXBwLCBwYXRoT3JGaWxlKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZS5wYXRoO1xuICB9XG5cbiAgcmV0dXJuIGdldFJlc29sdmVkUGF0aChwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYW4gaW5zdGFuY2Ugb2YgYWJzdHJhY3QgZmlsZS5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhbiBpbnN0YW5jZSBvZiBhYnN0cmFjdCBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBYnN0cmFjdEZpbGUoZmlsZTogdW5rbm93bik6IGZpbGUgaXMgVEFic3RyYWN0RmlsZSB7XG4gIHJldHVybiBmaWxlIGluc3RhbmNlb2YgVEFic3RyYWN0RmlsZTtcbn1cblxuLyoqXG4gKiAgIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIGJhc2UgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgYmFzZSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCYXNlRmlsZShwYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yQWJzdHJhY3RGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja0V4dGVuc2lvbihwYXRoT3JGaWxlLCBCQVNFX0ZJTEVfRVhURU5TSU9OKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBjYW52YXMgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgY2FudmFzIGZpbGUgb3Igbm90LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDYW52YXNGaWxlKHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrRXh0ZW5zaW9uKHBhdGhPckZpbGUsIENBTlZBU19GSUxFX0VYVEVOU0lPTik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGFuIGluc3RhbmNlIG9mIGZpbGUuXG4gKlxuICogQHBhcmFtIGZpbGUgLSBUaGUgZmlsZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaXMgYW4gaW5zdGFuY2Ugb2YgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRmlsZShmaWxlOiB1bmtub3duKTogZmlsZSBpcyBURmlsZSB7XG4gIHJldHVybiBmaWxlIGluc3RhbmNlb2YgVEZpbGU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZpbGUgaXMgYSBmb2xkZXIsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNGb2xkZXIoZmlsZTogdW5rbm93bik6IGZpbGUgaXMgVEZvbGRlciB7XG4gIHJldHVybiBmaWxlIGluc3RhbmNlb2YgVEZvbGRlcjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBNYXJrZG93biBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBNYXJrZG93biBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNYXJrZG93bkZpbGUocGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tFeHRlbnNpb24ocGF0aE9yRmlsZSwgTUFSS0RPV05fRklMRV9FWFRFTlNJT04pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhIG5vdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vdGUocGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNNYXJrZG93bkZpbGUocGF0aE9yRmlsZSkgfHwgaXNDYW52YXNGaWxlKHBhdGhPckZpbGUpIHx8IGlzQmFzZUZpbGUocGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogVHJpbXMgdGhlIG1hcmtkb3duIGV4dGVuc2lvbiBmcm9tIHRoZSBmaWxlIHBhdGggaWYgdGhlIGZpbGUgaXMgYSBtYXJrZG93biBmaWxlLlxuICogSWYgdGhlIGZpbGUgaXMgbm90IGEgbWFya2Rvd24gZmlsZSwgdGhlIG9yaWdpbmFsIGZpbGUgcGF0aCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIHRyaW0gdGhlIG1hcmtkb3duIGV4dGVuc2lvbiBmcm9tLlxuICogQHJldHVybnMgVGhlIGZpbGUgcGF0aCB3aXRoIHRoZSBtYXJrZG93biBleHRlbnNpb24gdHJpbW1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1NYXJrZG93bkV4dGVuc2lvbihmaWxlOiBUQWJzdHJhY3RGaWxlKTogc3RyaW5nIHtcbiAgaWYgKCFpc01hcmtkb3duRmlsZShmaWxlKSkge1xuICAgIHJldHVybiBmaWxlLnBhdGg7XG4gIH1cblxuICByZXR1cm4gdHJpbUVuZChmaWxlLnBhdGgsIGAuJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZUludGVybmFsKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcsIGlzQ2FzZUluc2Vuc2l0aXZlPzogYm9vbGVhbik6IG51bGwgfCBUQWJzdHJhY3RGaWxlIHtcbiAgaXNDYXNlSW5zZW5zaXRpdmUgPz89IGdldERhdGFBZGFwdGVyRXgoYXBwKS5pbnNlbnNpdGl2ZTtcbiAgaWYgKGlzQ2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgY29uc3QgY2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4ID0gZ2V0Q2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4KGFwcCk7XG4gICAgaWYgKGNhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleCkge1xuICAgICAgcmV0dXJuIGNhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleC5nZXQocGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoSW5zZW5zaXRpdmUocGF0aCk7XG4gIH1cblxuICByZXR1cm4gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVzb2x2ZWRQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVQYXRoKHJlc29sdmUoJy8nLCBwYXRoKSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSw2QkFLTztBQUNQLHNCQU1PO0FBRVAsa0JBR087QUFDUCxvQkFBd0I7QUFDeEIseUJBQWtDO0FBQ2xDLHlDQUE0QztBQUtyQyxNQUFNLHNCQUFzQjtBQUs1QixNQUFNLHdCQUF3QjtBQUs5QixNQUFNLDBCQUEwQjtBQUtoQyxJQUFLLGlCQUFMLGtCQUFLQSxvQkFBTDtBQUlMLEVBQUFBLGdCQUFBLFVBQU87QUFJUCxFQUFBQSxnQkFBQSxZQUFTO0FBUkMsU0FBQUE7QUFBQSxHQUFBO0FBaUNMLFNBQVMsZUFBZSxlQUF5QztBQUN0RSxTQUFPLGNBQWMsSUFBSSxDQUFDLGlCQUFpQixPQUFPLFlBQVksQ0FBQztBQUNqRTtBQVNPLFNBQVMsaUJBQWlCLGVBQTJDO0FBQzFFLFNBQU8sY0FBYyxJQUFJLENBQUMsaUJBQWlCLFNBQVMsWUFBWSxDQUFDO0FBQ25FO0FBU08sU0FBUyxPQUFPLGNBQTJDO0FBQ2hFLGFBQU8sc0NBQWtCLGFBQWEsWUFBWSxHQUFHLDZCQUE2QjtBQUNwRjtBQVNPLFNBQVMsYUFBYSxjQUFrRDtBQUM3RSxNQUFJLGlCQUFpQixNQUFNO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSx3QkFBd0IsdUJBQU87QUFDakMsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLElBQUksTUFBTSw2QkFBNkI7QUFDL0M7QUFTTyxTQUFTLFNBQVMsY0FBNkM7QUFDcEUsYUFBTyxzQ0FBa0IsZUFBZSxZQUFZLEdBQUcsK0JBQStCO0FBQ3hGO0FBU08sU0FBUyxlQUFlLGNBQW9EO0FBQ2pGLE1BQUksaUJBQWlCLE1BQU07QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLHdCQUF3Qix5QkFBUztBQUNuQyxXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sSUFBSSxNQUFNLCtCQUErQjtBQUNqRDtBQVNPLFNBQVMsZUFBZSxZQUF1QyxXQUE0QjtBQUNoRyxNQUFJLE9BQU8sVUFBVSxHQUFHO0FBQ3RCLFdBQU8sV0FBVyxjQUFjO0FBQUEsRUFDbEM7QUFFQSxNQUFJLE9BQU8sZUFBZSxVQUFVO0FBS2xDLGVBQU8scUJBQVEsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFlBQVksTUFBTTtBQUFBLEVBQ3hEO0FBRUEsU0FBTztBQUNUO0FBV08sU0FBUyxPQUFPLEtBQVUsTUFBYyxNQUF1QixtQkFBc0M7QUFDMUcsUUFBTSxlQUFlLHNCQUFzQixLQUFLLE1BQU0saUJBQWlCO0FBQ3ZFLE1BQUksQ0FBQyxjQUFjO0FBQ2pCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxTQUFTLFFBQVc7QUFDdEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGtCQUFrQixZQUFZLE1BQU07QUFDN0M7QUFXTyxTQUFTLGdCQUFnQixLQUFVLFlBQWdDLG1CQUE0QztBQUNwSCxhQUFPLHNDQUFrQixzQkFBc0IsS0FBSyxZQUFZLGlCQUFpQixHQUFHLDRCQUE0QixVQUFvQixFQUFFO0FBQ3hJO0FBVU8sU0FBUyxzQkFBc0IsS0FBVSxZQUF1QyxtQkFBbUQ7QUFDeEksTUFBSSxlQUFlLE1BQU07QUFDdkIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLGVBQWUsVUFBVSxHQUFHO0FBQzlCLFFBQUksT0FBTyxVQUFVLEdBQUc7QUFDdEIsYUFBTyxJQUFJLE1BQU0sY0FBYyxXQUFXLElBQUksS0FBSztBQUFBLElBQ3JEO0FBRUEsUUFBSSxTQUFTLFVBQVUsR0FBRztBQUN4QixhQUFPLElBQUksTUFBTSxnQkFBZ0IsV0FBVyxJQUFJLEtBQUs7QUFBQSxJQUN2RDtBQUdBLFdBQU8sSUFBSSxNQUFNLHNCQUFzQixXQUFXLElBQUksS0FBSztBQUFBLEVBRTdEO0FBRUEsUUFBTSxPQUFPLGdCQUFnQixLQUFLLFlBQVksaUJBQWlCO0FBRS9ELE1BQUksTUFBTTtBQUNSLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxlQUFlLGdCQUFnQixVQUFVO0FBRS9DLE1BQUksaUJBQWlCLFlBQVk7QUFDL0IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGdCQUFnQixLQUFLLGNBQWMsaUJBQWlCO0FBQzdEO0FBY08sU0FBUyxRQUFRLEtBQVUsWUFBd0IsMEJBQW9DLG1CQUFvQztBQUNoSSxNQUFJLE9BQU8sY0FBYyxLQUFLLFlBQVksaUJBQWlCO0FBQzNELE1BQUksQ0FBQyxNQUFNO0FBQ1QsUUFBSSwwQkFBMEI7QUFDNUIsaUJBQU8sNENBQW9CLEtBQUssVUFBb0I7QUFBQSxJQUN0RCxPQUFPO0FBQ0wsWUFBTSxJQUFJLE1BQU0sbUJBQW1CLFVBQW9CLEVBQUU7QUFBQSxJQUMzRDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFZTyxTQUFTLGNBQWMsS0FBVSxZQUErQixtQkFBMkM7QUFDaEgsUUFBTSxPQUFPLHNCQUFzQixLQUFLLFlBQVksaUJBQWlCO0FBQ3JFLE1BQUksT0FBTyxJQUFJLEdBQUc7QUFDaEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPO0FBQ1Q7QUFTTyxTQUFTLGtCQUFrQixjQUE2QztBQUM3RSxNQUFJLE9BQU8sWUFBWSxHQUFHO0FBQ3hCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFTLFlBQVksR0FBRztBQUMxQixXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sSUFBSSxNQUFNLHlDQUF5QztBQUMzRDtBQWNPLFNBQVMsVUFBVSxLQUFVLGNBQTRCLDBCQUFvQyxtQkFBc0M7QUFDeEksTUFBSSxTQUFTLGdCQUFnQixLQUFLLGNBQWMsaUJBQWlCO0FBQ2pFLE1BQUksQ0FBQyxRQUFRO0FBQ1gsUUFBSSwwQkFBMEI7QUFDNUIsbUJBQVMsOENBQXNCLEtBQUssWUFBc0I7QUFBQSxJQUM1RCxPQUFPO0FBQ0wsWUFBTSxJQUFJLE1BQU0scUJBQXFCLFlBQXNCLEVBQUU7QUFBQSxJQUMvRDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFVTyxTQUFTLGdCQUFnQixLQUFVLGNBQW1DLG1CQUE2QztBQUN4SCxRQUFNLFNBQVMsc0JBQXNCLEtBQUssY0FBYyxpQkFBaUI7QUFDekUsTUFBSSxTQUFTLE1BQU0sR0FBRztBQUNwQixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU87QUFDVDtBQVVPLFNBQVMsaUJBQWlCLEtBQVUsY0FBNEIsYUFBZ0M7QUFDckcsUUFBTSxTQUFTLFVBQVUsS0FBSyxZQUFZO0FBRTFDLE1BQUksZ0JBQXlCLENBQUM7QUFFOUIsTUFBSSxhQUFhO0FBQ2YsMEJBQU0sZ0JBQWdCLFFBQVEsQ0FBQyxpQkFBaUI7QUFDOUMsVUFBSSxlQUFlLFlBQVksS0FBSyx3QkFBd0IsdUJBQU87QUFDakUsc0JBQWMsS0FBSyxZQUFZO0FBQUEsTUFDakM7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNILE9BQU87QUFDTCxvQkFBZ0IsT0FBTyxTQUFTLE9BQU8sQ0FBQyxTQUFTLGVBQWUsSUFBSSxDQUFDO0FBQUEsRUFDdkU7QUFFQSxrQkFBZ0IsY0FBYyxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQUUsSUFBSSxDQUFDO0FBQ3pFLFNBQU87QUFDVDtBQVNBLGVBQXNCLGdCQUFnQixLQUFVLE1BQThCO0FBQzVFLFFBQU0sT0FBTyxjQUFjLEtBQUssSUFBSTtBQUNwQyxNQUFJLE1BQU07QUFDUixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0saUJBQWEseUNBQWlCLElBQUk7QUFDeEMsUUFBTSxrQkFBa0IsS0FBSyxVQUFVO0FBRXZDLFNBQU8sTUFBTSxJQUFJLE1BQU0sT0FBTyxNQUFNLEVBQUU7QUFDeEM7QUFTQSxlQUFzQixrQkFBa0IsS0FBVSxNQUFnQztBQUNoRixRQUFNLFNBQVMsZ0JBQWdCLEtBQUssSUFBSTtBQUN4QyxNQUFJLFFBQVE7QUFDVixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sTUFBTSxJQUFJLE1BQU0sYUFBYSxJQUFJO0FBQzFDO0FBU08sU0FBUyxRQUFRLEtBQVUsWUFBd0M7QUFDeEUsTUFBSSxlQUFlLFVBQVUsR0FBRztBQUM5QixXQUFPLFdBQVc7QUFBQSxFQUNwQjtBQUVBLFFBQU0sT0FBTyxzQkFBc0IsS0FBSyxVQUFVO0FBQ2xELE1BQUksTUFBTTtBQUNSLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFFQSxTQUFPLGdCQUFnQixVQUFVO0FBQ25DO0FBUU8sU0FBUyxlQUFlLE1BQXNDO0FBQ25FLFNBQU8sZ0JBQWdCO0FBQ3pCO0FBUU8sU0FBUyxXQUFXLFlBQWdEO0FBQ3pFLFNBQU8sZUFBZSxZQUFZLG1CQUFtQjtBQUN2RDtBQVFPLFNBQVMsYUFBYSxZQUFnRDtBQUMzRSxTQUFPLGVBQWUsWUFBWSxxQkFBcUI7QUFDekQ7QUFRTyxTQUFTLE9BQU8sTUFBOEI7QUFDbkQsU0FBTyxnQkFBZ0I7QUFDekI7QUFRTyxTQUFTLFNBQVMsTUFBZ0M7QUFDdkQsU0FBTyxnQkFBZ0I7QUFDekI7QUFRTyxTQUFTLGVBQWUsWUFBZ0Q7QUFDN0UsU0FBTyxlQUFlLFlBQVksdUJBQXVCO0FBQzNEO0FBUU8sU0FBUyxPQUFPLFlBQWdEO0FBQ3JFLFNBQU8sZUFBZSxVQUFVLEtBQUssYUFBYSxVQUFVLEtBQUssV0FBVyxVQUFVO0FBQ3hGO0FBU08sU0FBUyxzQkFBc0IsTUFBNkI7QUFDakUsTUFBSSxDQUFDLGVBQWUsSUFBSSxHQUFHO0FBQ3pCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFFQSxhQUFPLHVCQUFRLEtBQUssTUFBTSxJQUFJLHVCQUF1QixFQUFFO0FBQ3pEO0FBRUEsU0FBUyxnQkFBZ0IsS0FBVSxNQUFjLG1CQUFtRDtBQUNsRyw0QkFBc0IseUNBQWlCLEdBQUcsRUFBRTtBQUM1QyxNQUFJLG1CQUFtQjtBQUNyQixVQUFNLCtCQUEyQixnRUFBNEIsR0FBRztBQUNoRSxRQUFJLDBCQUEwQjtBQUM1QixhQUFPLHlCQUF5QixJQUFJLElBQUk7QUFBQSxJQUMxQztBQUNBLFdBQU8sSUFBSSxNQUFNLGlDQUFpQyxJQUFJO0FBQUEsRUFDeEQ7QUFFQSxTQUFPLElBQUksTUFBTSxzQkFBc0IsSUFBSTtBQUM3QztBQUVBLFNBQVMsZ0JBQWdCLE1BQXNCO0FBQzdDLGFBQU8sbUNBQWMscUJBQVEsS0FBSyxJQUFJLENBQUM7QUFDekM7IiwKICAibmFtZXMiOiBbIkZpbGVTeXN0ZW1UeXBlIl0KfQo=
510
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2ZpbGUtc3lzdGVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgVEFic3RyYWN0RmlsZX0sIHtAbGluayBURmlsZX0sIGFuZCB7QGxpbmsgVEZvbGRlcn0gaW5zdGFuY2VzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjcmVhdGVURmlsZUluc3RhbmNlLFxuICBjcmVhdGVURm9sZGVySW5zdGFuY2UsXG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgVEFic3RyYWN0RmlsZSxcbiAgVEZpbGUsXG4gIFRGb2xkZXIsXG4gIFZhdWx0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGV4dG5hbWUsXG4gIHJlc29sdmVcbn0gZnJvbSAnLi4vcGF0aC50cyc7XG5pbXBvcnQgeyB0cmltRW5kIH0gZnJvbSAnLi4vc3RyaW5nLnRzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgZ2V0Q2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4IH0gZnJvbSAnLi9jYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgudHMnO1xuXG4vKipcbiAqIEEgZmlsZSBleHRlbnNpb24gZm9yIGBiYXNlYCBmaWxlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEJBU0VfRklMRV9FWFRFTlNJT04gPSAnYmFzZSc7XG5cbi8qKlxuICogQSBmaWxlIGV4dGVuc2lvbiBmb3IgYGNhbnZhc2AgZmlsZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBDQU5WQVNfRklMRV9FWFRFTlNJT04gPSAnY2FudmFzJztcblxuLyoqXG4gKiBBIGZpbGUgZXh0ZW5zaW9uIGZvciBgbWFya2Rvd25gIGZpbGVzLlxuICovXG5leHBvcnQgY29uc3QgTUFSS0RPV05fRklMRV9FWFRFTlNJT04gPSAnbWQnO1xuXG4vKipcbiAqIEEgdHlwZSBvZiBmaWxlIHN5c3RlbSBvYmplY3QuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbGVTeXN0ZW1UeXBlIHtcbiAgLyoqXG4gICAqIEEgZmlsZS5cbiAgICovXG4gIEZpbGUgPSAnZmlsZScsXG4gIC8qKlxuICAgKiBBIGZvbGRlci5cbiAgICovXG4gIEZvbGRlciA9ICdmb2xkZXInXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV4aXN0c30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhpc3RzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBEZWZhdWx0IGlzIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCB0byBjaGVjay4gRGVmYXVsdCBpcyBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBGaWxlU3lzdGVtVHlwZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QWJzdHJhY3RGaWxlT3JOdWxsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBYnN0cmFjdEZpbGVPck51bGxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FzZUluc2Vuc2l0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byByZXRyaWV2ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEFic3RyYWN0RmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QWJzdHJhY3RGaWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmV0cmlldmUgdGhlIGFic3RyYWN0IGZpbGUgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGaWxlT3JOdWxsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRGaWxlT3JOdWxsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0RmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gQXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBlcmZvcm0gYSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaC4gRGVmYXVsdCBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYXNlSW5zZW5zaXRpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHJldHJpZXZlIHRoZSBmaWxlIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBhIG5vbi1leGlzdGluZyBmaWxlLlxuICAgKiAgSWYgYHRydWVgLCBhIG5ldyBmaWxlIGlzIGNyZWF0ZWQgZm9yIHRoZSBwcm92aWRlZCBwYXRoLlxuICAgKiAgSWYgYGZhbHNlYCwgYW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVOb25FeGlzdGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEZvbGRlck9yTnVsbH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Rm9sZGVyT3JOdWxsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZvbGRlciB0byByZXRyaWV2ZSB0aGUgZm9sZGVyIGZyb20uXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGb2xkZXI6IG51bGwgfCBQYXRoT3JGb2xkZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEZvbGRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0Rm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBpc0Nhc2VJbnNlbnNpdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZvbGRlciBpZGVudGlmaWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgdGhlIGZvbGRlciB0byBub3QgZXhpc3QuXG4gICAqICBJZiBgdHJ1ZWAsIGEgbmV3IGZvbGRlciBpcyBjcmVhdGVkIGZvciB0aGUgcHJvdmlkZWQgcGF0aC5cbiAgICogIElmIGBmYWxzZWAsIGFuIGVycm9yIGlzIHRocm93biBpZiB0aGUgZm9sZGVyIGlzIG5vdCBmb3VuZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVOb25FeGlzdGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldE1hcmtkb3duRmlsZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldE1hcmtkb3duRmlsZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byByZWN1cnNpdmVseSBzZWFyY2ggZm9yIG1hcmtkb3duIGZpbGVzIHdpdGhpbiBzdWJmb2xkZXJzLiBEZWZhdWx0IGlzIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBpc1JlY3Vyc2l2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZvbGRlciB0byByZXRyaWV2ZSB0aGUgbWFya2Rvd24gZmlsZXMgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyO1xufVxuXG4vKipcbiAqIEEgcGF0aCBvciBhbiBhYnN0cmFjdCBmaWxlLlxuICovXG5leHBvcnQgdHlwZSBQYXRoT3JBYnN0cmFjdEZpbGUgPSBzdHJpbmcgfCBUQWJzdHJhY3RGaWxlO1xuXG4vKipcbiAqIEEgcGF0aCBvciBhIGZpbGUuXG4gKi9cbmV4cG9ydCB0eXBlIFBhdGhPckZpbGUgPSBzdHJpbmcgfCBURmlsZTtcblxuLyoqXG4gKiBBIHBhdGggb3IgYSBmb2xkZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFBhdGhPckZvbGRlciA9IHN0cmluZyB8IFRGb2xkZXI7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEZpbGVJbnRlcm5hbH0uXG4gKi9cbmludGVyZmFjZSBHZXRGaWxlSW50ZXJuYWxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBwZXJmb3JtIGEgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2guIERlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FzZUluc2Vuc2l0aXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gcmV0cmlldmUgdGhlIGFic3RyYWN0IGZpbGUgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIGFic3RyYWN0IGZpbGVzIHRvIGFuIGFycmF5IG9mIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGVzIC0gVGhlIGFic3RyYWN0IGZpbGVzIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgYXJyYXkgb2YgZmlsZXMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFueSBvZiB0aGUgYWJzdHJhY3QgZmlsZXMgYXJlIG5vdCBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXlPZkZpbGVzKGFic3RyYWN0RmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IFRGaWxlW10ge1xuICByZXR1cm4gYWJzdHJhY3RGaWxlcy5tYXAoKGFic3RyYWN0RmlsZSkgPT4gYXNGaWxlKGFic3RyYWN0RmlsZSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIGFic3RyYWN0IGZpbGVzIHRvIGFuIGFycmF5IG9mIGZvbGRlcnMuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZXMgLSBUaGUgYWJzdHJhY3QgZmlsZXMgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBhcnJheSBvZiBmb2xkZXJzLlxuICogQHRocm93cyBFcnJvciBpZiBhbnkgb2YgdGhlIGFic3RyYWN0IGZpbGVzIGFyZSBub3QgZm9sZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXlPZkZvbGRlcnMoYWJzdHJhY3RGaWxlczogVEFic3RyYWN0RmlsZVtdKTogVEZvbGRlcltdIHtcbiAgcmV0dXJuIGFic3RyYWN0RmlsZXMubWFwKChhYnN0cmFjdEZpbGUpID0+IGFzRm9sZGVyKGFic3RyYWN0RmlsZSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFic3RyYWN0IGZpbGUgdG8gYSBmaWxlLlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGZpbGUuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ZpbGUoYWJzdHJhY3RGaWxlOiBudWxsIHwgVEFic3RyYWN0RmlsZSk6IFRGaWxlIHtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKGFzRmlsZU9yTnVsbChhYnN0cmFjdEZpbGUpLCAnQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYWJzdHJhY3QgZmlsZSB0byBhIGZpbGUgb3IgYG51bGxgLlxuICpcbiAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIGZpbGUgb3IgYG51bGxgLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNGaWxlT3JOdWxsKGFic3RyYWN0RmlsZTogbnVsbCB8IFRBYnN0cmFjdEZpbGUpOiBudWxsIHwgVEZpbGUge1xuICBpZiAoYWJzdHJhY3RGaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgcmV0dXJuIGFic3RyYWN0RmlsZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0Fic3RyYWN0IGZpbGUgaXMgbm90IGEgZmlsZScpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFic3RyYWN0IGZpbGUgdG8gYSBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVyLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ZvbGRlcihhYnN0cmFjdEZpbGU6IG51bGwgfCBUQWJzdHJhY3RGaWxlKTogVEZvbGRlciB7XG4gIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShhc0ZvbGRlck9yTnVsbChhYnN0cmFjdEZpbGUpLCAnQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmb2xkZXInKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhYnN0cmFjdCBmaWxlIHRvIGEgZm9sZGVyIG9yIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0gYWJzdHJhY3RGaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgb3IgYG51bGxgLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmb2xkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc0ZvbGRlck9yTnVsbChhYnN0cmFjdEZpbGU6IG51bGwgfCBUQWJzdHJhY3RGaWxlKTogbnVsbCB8IFRGb2xkZXIge1xuICBpZiAoYWJzdHJhY3RGaWxlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGFic3RyYWN0RmlsZSBpbnN0YW5jZW9mIFRGb2xkZXIpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RGaWxlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmb2xkZXInKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhdGggb3IgZmlsZSBoYXMgdGhlIHNwZWNpZmllZCBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBhYnN0cmFjdCBmaWxlIHRvIGNoZWNrLlxuICogQHBhcmFtIGV4dGVuc2lvbiAtIFRoZSBleHRlbnNpb24gdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHJldHVybnMgUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggb3IgZmlsZSBoYXMgdGhlIHNwZWNpZmllZCBleHRlbnNpb24sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tFeHRlbnNpb24ocGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZSwgZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlzRmlsZShwYXRoT3JGaWxlKSkge1xuICAgIHJldHVybiBwYXRoT3JGaWxlLmV4dGVuc2lvbiA9PT0gZXh0ZW5zaW9uO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXRoT3JGaWxlID09PSAnc3RyaW5nJykge1xuICAgIC8vIENvbXBhcmUgdGhlIHBhdGgncyBvd24gZXh0ZW5zaW9uIGluc3RlYWQgb2YgcmVzb2x2aW5nIHRoZSBmaWxlLlxuICAgIC8vIFJlc29sdmluZyBhIHN0cmluZyBwYXRoIGlzIE8odmF1bHQpIG9uIGEgbWlzcyBvbiBhIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbS5cbiAgICAvLyBUaGF0IG1pc3MgaXMgdGhlIGhvdCBwYXRoIGR1cmluZyBkZWxldGlvbiBjYXNjYWRlcy5cbiAgICAvLyBPYnNpZGlhbiBsb3dlcmNhc2VzIGEgZmlsZSdzIGNhbm9uaWNhbCBleHRlbnNpb24sIHNvIGNvbXBhcmUgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgIHJldHVybiBleHRuYW1lKHBhdGhPckZpbGUpLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCkgPT09IGV4dGVuc2lvbjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhdGggZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwYXRoIGV4aXN0cywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGlzdHMocGFyYW1zOiBFeGlzdHNQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoLFxuICAgIHR5cGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYWJzdHJhY3RGaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRBYnN0cmFjdEZpbGVPck51bGxQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZTogcGF0aFxuICB9KSk7XG4gIGlmICghYWJzdHJhY3RGaWxlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGdldEZpbGVTeXN0ZW1UeXBlKGFic3RyYWN0RmlsZSkgPT09IHR5cGU7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBUQWJzdHJhY3RGaWxlIG9iamVjdCBmb3IgdGhlIGdpdmVuIHBhdGggb3IgYWJzdHJhY3QgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgYWJzdHJhY3QgZmlsZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFic3RyYWN0IGZpbGUgaXMgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWJzdHJhY3RGaWxlKHBhcmFtczogR2V0QWJzdHJhY3RGaWxlUGFyYW1zKTogVEFic3RyYWN0RmlsZSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoXG4gICAgZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRBYnN0cmFjdEZpbGVPck51bGxQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgICAgcGF0aE9yRmlsZVxuICAgIH0pKSxcbiAgICBgQWJzdHJhY3QgZmlsZSBub3QgZm91bmQ6ICR7cGF0aE9yRmlsZSBhcyBzdHJpbmd9YFxuICApO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhYnN0cmFjdCBmaWxlIG9yIGBudWxsYCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGF0aCBvciBhYnN0cmFjdCBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHJldHJpZXZhbC5cbiAqIEByZXR1cm5zIFRoZSBhYnN0cmFjdCBmaWxlIGlmIGZvdW5kLCBvdGhlcndpc2UgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKHBhcmFtczogR2V0QWJzdHJhY3RGaWxlT3JOdWxsUGFyYW1zKTogbnVsbCB8IFRBYnN0cmFjdEZpbGUge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKHBhdGhPckZpbGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChpc0Fic3RyYWN0RmlsZShwYXRoT3JGaWxlKSkge1xuICAgIGlmIChpc0ZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICAgIHJldHVybiBhcHAudmF1bHQuZ2V0RmlsZUJ5UGF0aChwYXRoT3JGaWxlLnBhdGgpID8/IHBhdGhPckZpbGU7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBUQWJzdHJhY3RGaWxlIGlzIGFsd2F5cyBURmlsZSBvciBURm9sZGVyIGluIE9ic2lkaWFuOyBkZWZlbnNpdmUgZmFsbGJhY2suICovXG4gICAgaWYgKGlzRm9sZGVyKHBhdGhPckZpbGUpKSB7XG4gICAgICByZXR1cm4gYXBwLnZhdWx0LmdldEZvbGRlckJ5UGF0aChwYXRoT3JGaWxlLnBhdGgpID8/IHBhdGhPckZpbGU7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFRBYnN0cmFjdEZpbGUgaXMgYWx3YXlzIFRGaWxlIG9yIFRGb2xkZXIgaW4gT2JzaWRpYW47IGRlZmVuc2l2ZSBmYWxsYmFjay4gKi9cbiAgICByZXR1cm4gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChwYXRoT3JGaWxlLnBhdGgpID8/IHBhdGhPckZpbGU7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlSW50ZXJuYWwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVJbnRlcm5hbFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoOiBwYXRoT3JGaWxlXG4gIH0pKTtcblxuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gZ2V0UmVzb2x2ZWRQYXRoKHBhdGhPckZpbGUpO1xuXG4gIGlmIChyZXNvbHZlZFBhdGggPT09IHBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRGaWxlSW50ZXJuYWwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVJbnRlcm5hbFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoOiByZXNvbHZlZFBhdGhcbiAgfSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhdGggb3IgZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBwYXRoIG9yIGZpbGUuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBmaWxlIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGUocGFyYW1zOiBHZXRGaWxlUGFyYW1zKTogVEZpbGUge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nXG4gIH0gPSBwYXJhbXM7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZU9yTnVsbFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlXG4gIH0pKTtcbiAgaWYgKCFmaWxlKSB7XG4gICAgaWYgKHNob3VsZEluY2x1ZGVOb25FeGlzdGluZykge1xuICAgICAgZmlsZSA9IGNyZWF0ZVRGaWxlSW5zdGFuY2UoYXBwLCBwYXRoT3JGaWxlIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7cGF0aE9yRmlsZSBhcyBzdHJpbmd9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGU7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZmlsZSBvciBgbnVsbGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhdGggb3IgZmlsZS5cbiAqIElmIHRoZSBwcm92aWRlZCBhcmd1bWVudCBpcyBhbHJlYWR5IGEgZmlsZSwgaXQgaXMgcmV0dXJuZWQgYXMgaXMuXG4gKiBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSBhcHAncyB2YXVsdCB0byByZXRyaWV2ZSB0aGUgZmlsZSBieSBpdHMgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVPck51bGwocGFyYW1zOiBHZXRGaWxlT3JOdWxsUGFyYW1zKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEFic3RyYWN0RmlsZU9yTnVsbFBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGaWxlXG4gIH0pKTtcbiAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHR5cGUgb2YgYSBmaWxlIHN5c3RlbSBvYmplY3QuXG4gKlxuICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGdldCB0aGUgdHlwZSBvZi5cbiAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBhYnN0cmFjdCBmaWxlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgYWJzdHJhY3QgZmlsZSBpcyBub3QgYSBmaWxlIG9yIGEgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZVN5c3RlbVR5cGUoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlKTogRmlsZVN5c3RlbVR5cGUge1xuICBpZiAoaXNGaWxlKGFic3RyYWN0RmlsZSkpIHtcbiAgICByZXR1cm4gRmlsZVN5c3RlbVR5cGUuRmlsZTtcbiAgfVxuICBpZiAoaXNGb2xkZXIoYWJzdHJhY3RGaWxlKSkge1xuICAgIHJldHVybiBGaWxlU3lzdGVtVHlwZS5Gb2xkZXI7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdBYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZpbGUgb3IgYSBmb2xkZXInKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSBmb2xkZXIgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFwcCBhbmQgcGF0aE9yRm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHJldHJpZXZhbC5cbiAqIEByZXR1cm5zIFRoZSByZXRyaWV2ZWQgZm9sZGVyLlxuICogQHRocm93cyBJZiB0aGUgZm9sZGVyIGlzIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvbGRlcihwYXJhbXM6IEdldEZvbGRlclBhcmFtcyk6IFRGb2xkZXIge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGhPckZvbGRlcixcbiAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3RpbmdcbiAgfSA9IHBhcmFtcztcbiAgbGV0IGZvbGRlciA9IGdldEZvbGRlck9yTnVsbChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0Rm9sZGVyT3JOdWxsUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGlzQ2FzZUluc2Vuc2l0aXZlLFxuICAgIHBhdGhPckZvbGRlclxuICB9KSk7XG4gIGlmICghZm9sZGVyKSB7XG4gICAgaWYgKHNob3VsZEluY2x1ZGVOb25FeGlzdGluZykge1xuICAgICAgZm9sZGVyID0gY3JlYXRlVEZvbGRlckluc3RhbmNlKGFwcCwgcGF0aE9yRm9sZGVyIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRm9sZGVyIG5vdCBmb3VuZDogJHtwYXRoT3JGb2xkZXIgYXMgc3RyaW5nfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb2xkZXI7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgZm9sZGVyIG9yIGBudWxsYCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGF0aCBvciBmb2xkZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcmV0cmlldmFsLlxuICogQHJldHVybnMgVGhlIGZvbGRlciBpZiBmb3VuZCwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvbGRlck9yTnVsbChwYXJhbXM6IEdldEZvbGRlck9yTnVsbFBhcmFtcyk6IG51bGwgfCBURm9sZGVyIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc0Nhc2VJbnNlbnNpdGl2ZSxcbiAgICBwYXRoT3JGb2xkZXJcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgZm9sZGVyID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRBYnN0cmFjdEZpbGVPck51bGxQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgaXNDYXNlSW5zZW5zaXRpdmUsXG4gICAgcGF0aE9yRmlsZTogcGF0aE9yRm9sZGVyXG4gIH0pKTtcbiAgaWYgKGlzRm9sZGVyKGZvbGRlcikpIHtcbiAgICByZXR1cm4gZm9sZGVyO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBmaWxlcyByZXByZXNlbnRpbmcgdGhlIG1hcmtkb3duIGZpbGVzIHdpdGhpbiBhIHNwZWNpZmllZCBmb2xkZXIgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSByZXRyaWV2YWwuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBmaWxlcyByZXByZXNlbnRpbmcgdGhlIG1hcmtkb3duIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya2Rvd25GaWxlcyhwYXJhbXM6IEdldE1hcmtkb3duRmlsZXNQYXJhbXMpOiBURmlsZVtdIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBpc1JlY3Vyc2l2ZSxcbiAgICBwYXRoT3JGb2xkZXJcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgZm9sZGVyID0gZ2V0Rm9sZGVyKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRm9sZGVyXG4gIH0pO1xuXG4gIGxldCBtYXJrZG93bkZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgaWYgKGlzUmVjdXJzaXZlKSB7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZvbGRlciwgKGFic3RyYWN0RmlsZSkgPT4ge1xuICAgICAgaWYgKGlzTWFya2Rvd25GaWxlKGFic3RyYWN0RmlsZSkgJiYgYWJzdHJhY3RGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgbWFya2Rvd25GaWxlcy5wdXNoKGFic3RyYWN0RmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbWFya2Rvd25GaWxlcyA9IGZvbGRlci5jaGlsZHJlbi5maWx0ZXIoKGZpbGUpID0+IGlzTWFya2Rvd25GaWxlKGZpbGUpKSBhcyBURmlsZVtdO1xuICB9XG5cbiAgbWFya2Rvd25GaWxlcyA9IG1hcmtkb3duRmlsZXMuc29ydCgoYSwgYikgPT4gYS5wYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXRoKSk7XG4gIHJldHVybiBtYXJrZG93bkZpbGVzO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZmlsZSBmb3IgdGhlIGdpdmVuIHBhdGggb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHJldHJpZXZlIG9yIGNyZWF0ZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIHJlcHJlc2VudGluZyB0aGUgZmlsZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVGaWxlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGaWxlPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlT3JOdWxsKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZTogcGF0aFxuICB9KTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGNvbnN0IGZvbGRlclBhdGggPSBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpO1xuICBhd2FpdCBnZXRPckNyZWF0ZUZvbGRlcihhcHAsIGZvbGRlclBhdGgpO1xuXG4gIHJldHVybiBhd2FpdCBhcHAudmF1bHQuY3JlYXRlKHBhdGgsICcnKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZvbGRlciBmb3IgdGhlIGdpdmVuIHBhdGggb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBBcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gcmV0cmlldmUgb3IgY3JlYXRlLlxuICogQHJldHVybnMgVGhlIGZvbGRlciByZXByZXNlbnRpbmcgdGhlIGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlRm9sZGVyKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFRGb2xkZXI+IHtcbiAgY29uc3QgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRm9sZGVyOiBwYXRoXG4gIH0pO1xuICBpZiAoZm9sZGVyKSB7XG4gICAgcmV0dXJuIGZvbGRlcjtcbiAgfVxuXG4gIHJldHVybiBhd2FpdCBhcHAudmF1bHQuY3JlYXRlRm9sZGVyKHBhdGgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGdpdmVuIGBwYXRoT3JGaWxlYC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIEFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgYWJzdHJhY3QgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBwYXRoIG9mIHRoZSBgcGF0aE9yRmlsZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGUpOiBzdHJpbmcge1xuICBpZiAoaXNBYnN0cmFjdEZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICByZXR1cm4gcGF0aE9yRmlsZS5wYXRoO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGVcbiAgfSk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGUucGF0aDtcbiAgfVxuXG4gIHJldHVybiBnZXRSZXNvbHZlZFBhdGgocGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGFuIGluc3RhbmNlIG9mIGFic3RyYWN0IGZpbGUuXG4gKlxuICogQHBhcmFtIGZpbGUgLSBUaGUgZmlsZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaXMgYW4gaW5zdGFuY2Ugb2YgYWJzdHJhY3QgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJzdHJhY3RGaWxlKGZpbGU6IHVua25vd24pOiBmaWxlIGlzIFRBYnN0cmFjdEZpbGUge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRBYnN0cmFjdEZpbGU7XG59XG5cbi8qKlxuICogICBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBiYXNlIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhIGJhc2UgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmFzZUZpbGUocGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckFic3RyYWN0RmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tFeHRlbnNpb24ocGF0aE9yRmlsZSwgQkFTRV9GSUxFX0VYVEVOU0lPTik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgY2FudmFzIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhIGNhbnZhcyBmaWxlIG9yIG5vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yQWJzdHJhY3RGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja0V4dGVuc2lvbihwYXRoT3JGaWxlLCBDQU5WQVNfRklMRV9FWFRFTlNJT04pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhbiBpbnN0YW5jZSBvZiBmaWxlLlxuICpcbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGFuIGluc3RhbmNlIG9mIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpbGUoZmlsZTogdW5rbm93bik6IGZpbGUgaXMgVEZpbGUge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRGaWxlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBmaWxlIGlzIGEgZm9sZGVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRm9sZGVyKGZpbGU6IHVua25vd24pOiBmaWxlIGlzIFRGb2xkZXIge1xuICByZXR1cm4gZmlsZSBpbnN0YW5jZW9mIFRGb2xkZXI7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGEgTWFya2Rvd24gZmlsZS5cbiAqXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgTWFya2Rvd24gZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNoZWNrRXh0ZW5zaW9uKHBhdGhPckZpbGUsIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGZpbGUgaXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaXMgYSBub3RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RlKHBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JBYnN0cmFjdEZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGUpIHx8IGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlKSB8fCBpc0Jhc2VGaWxlKHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIFRyaW1zIHRoZSBtYXJrZG93biBleHRlbnNpb24gZnJvbSB0aGUgZmlsZSBwYXRoIGlmIHRoZSBmaWxlIGlzIGEgbWFya2Rvd24gZmlsZS5cbiAqIElmIHRoZSBmaWxlIGlzIG5vdCBhIG1hcmtkb3duIGZpbGUsIHRoZSBvcmlnaW5hbCBmaWxlIHBhdGggaXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGZpbGUgLSBUaGUgZmlsZSB0byB0cmltIHRoZSBtYXJrZG93biBleHRlbnNpb24gZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIHBhdGggd2l0aCB0aGUgbWFya2Rvd24gZXh0ZW5zaW9uIHRyaW1tZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltTWFya2Rvd25FeHRlbnNpb24oZmlsZTogVEFic3RyYWN0RmlsZSk6IHN0cmluZyB7XG4gIGlmICghaXNNYXJrZG93bkZpbGUoZmlsZSkpIHtcbiAgICByZXR1cm4gZmlsZS5wYXRoO1xuICB9XG5cbiAgcmV0dXJuIHRyaW1FbmQoe1xuICAgIHN0cjogZmlsZS5wYXRoLFxuICAgIHN1ZmZpeDogYC4ke01BUktET1dOX0ZJTEVfRVhURU5TSU9OfWBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVJbnRlcm5hbChwYXJhbXM6IEdldEZpbGVJbnRlcm5hbFBhcmFtcyk6IG51bGwgfCBUQWJzdHJhY3RGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoXG4gIH0gPSBwYXJhbXM7XG4gIGxldCB7IGlzQ2FzZUluc2Vuc2l0aXZlIH0gPSBwYXJhbXM7XG4gIGlzQ2FzZUluc2Vuc2l0aXZlID8/PSBnZXREYXRhQWRhcHRlckV4KGFwcCkuaW5zZW5zaXRpdmU7XG4gIGlmIChpc0Nhc2VJbnNlbnNpdGl2ZSkge1xuICAgIGNvbnN0IGNhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleCA9IGdldENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleChhcHApO1xuICAgIGlmIChjYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXgpIHtcbiAgICAgIHJldHVybiBjYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXguZ2V0KHBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aEluc2Vuc2l0aXZlKHBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIGFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgocGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldFJlc29sdmVkUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbm9ybWFsaXplUGF0aChyZXNvbHZlKCcvJywgcGF0aCkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsNkJBS087QUFDUCxzQkFNTztBQUVQLDBC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