@mnaoumov/obsidian-lib 10.5.0 → 10.6.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 (160) hide show
  1. package/README.md +6 -0
  2. package/codemirror/inline-token-widgets/package.json +6 -0
  3. package/codemirror/settings-facet/package.json +6 -0
  4. package/components/settings-facet-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +104 -1
  6. package/dist/lib/cjs/__merged.d.cts +20 -3
  7. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  8. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  9. package/dist/lib/cjs/backlink-index.cjs +44 -8
  10. package/dist/lib/cjs/backlink-index.d.cts +23 -0
  11. package/dist/lib/cjs/bug-report.cjs +4 -2
  12. package/dist/lib/cjs/bug-report.d.cts +1 -1
  13. package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
  14. package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
  15. package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
  16. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  17. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  18. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  19. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  20. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  21. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  22. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  23. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  24. package/dist/lib/cjs/community-plugins.cjs +19 -2
  25. package/dist/lib/cjs/community-plugins.d.cts +14 -0
  26. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
  27. package/dist/lib/cjs/components/index.cjs +4 -1
  28. package/dist/lib/cjs/components/index.d.cts +1 -0
  29. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
  30. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  31. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  32. package/dist/lib/cjs/css-class.cjs +8 -1
  33. package/dist/lib/cjs/css-class.d.cts +28 -0
  34. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
  35. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
  36. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  37. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  38. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  39. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  40. package/dist/lib/cjs/editor-suggest.cjs +198 -0
  41. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  42. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  43. package/dist/lib/cjs/hotkey.cjs +185 -0
  44. package/dist/lib/cjs/hotkey.d.cts +59 -0
  45. package/dist/lib/cjs/i18n/locales/en.cjs +14 -1
  46. package/dist/lib/cjs/i18n/locales/en.d.cts +13 -0
  47. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +13 -0
  48. package/dist/lib/cjs/index.cjs +31 -1
  49. package/dist/lib/cjs/index.d.cts +10 -0
  50. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  51. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  52. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  53. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  54. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  55. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  56. package/dist/lib/cjs/markdown.cjs +6 -1
  57. package/dist/lib/cjs/markdown.d.cts +10 -1
  58. package/dist/lib/cjs/modals/modal.cjs +8 -5
  59. package/dist/lib/cjs/modals/modal.d.cts +4 -0
  60. package/dist/lib/cjs/plugin/plugin.cjs +5 -2
  61. package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
  62. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  63. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  64. package/dist/lib/cjs/request-url.cjs +523 -0
  65. package/dist/lib/cjs/request-url.d.cts +233 -0
  66. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  67. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  68. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  69. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  70. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  71. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  72. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  73. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  74. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  75. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  76. package/dist/lib/cjs/setting-ex.cjs +51 -1
  77. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  78. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  79. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  80. package/dist/lib/esm/__merged.d.mts +20 -3
  81. package/dist/lib/esm/__merged.mjs +110 -2
  82. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  83. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  84. package/dist/lib/esm/backlink-index.d.mts +23 -0
  85. package/dist/lib/esm/backlink-index.mjs +42 -7
  86. package/dist/lib/esm/bug-report.d.mts +1 -1
  87. package/dist/lib/esm/bug-report.mjs +4 -2
  88. package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
  89. package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
  90. package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
  91. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  92. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  93. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  94. package/dist/lib/esm/codemirror/index.mjs +5 -1
  95. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  96. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  97. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  98. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  99. package/dist/lib/esm/community-plugins.d.mts +14 -0
  100. package/dist/lib/esm/community-plugins.mjs +18 -2
  101. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
  102. package/dist/lib/esm/components/index.d.mts +1 -0
  103. package/dist/lib/esm/components/index.mjs +3 -1
  104. package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
  105. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  106. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  107. package/dist/lib/esm/css-class.d.mts +28 -0
  108. package/dist/lib/esm/css-class.mjs +8 -1
  109. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
  110. package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
  111. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  112. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  113. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  114. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  115. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  116. package/dist/lib/esm/editor-suggest.mjs +109 -0
  117. package/dist/lib/esm/generated-during-build.mjs +2 -2
  118. package/dist/lib/esm/hotkey.d.mts +59 -0
  119. package/dist/lib/esm/hotkey.mjs +95 -0
  120. package/dist/lib/esm/i18n/locales/en.d.mts +13 -0
  121. package/dist/lib/esm/i18n/locales/en.mjs +14 -1
  122. package/dist/lib/esm/i18n/locales/translations-map.d.mts +13 -0
  123. package/dist/lib/esm/index.d.mts +10 -0
  124. package/dist/lib/esm/index.mjs +21 -1
  125. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  126. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  127. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  128. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  129. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  130. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  131. package/dist/lib/esm/markdown.d.mts +10 -1
  132. package/dist/lib/esm/markdown.mjs +9 -1
  133. package/dist/lib/esm/modals/modal.d.mts +4 -0
  134. package/dist/lib/esm/modals/modal.mjs +8 -5
  135. package/dist/lib/esm/plugin/plugin.d.mts +2 -0
  136. package/dist/lib/esm/plugin/plugin.mjs +5 -2
  137. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  138. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  139. package/dist/lib/esm/request-url.d.mts +233 -0
  140. package/dist/lib/esm/request-url.mjs +428 -0
  141. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  142. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  143. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  144. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  145. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  146. package/dist/lib/esm/setting-components/index.mjs +9 -1
  147. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  148. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  149. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  150. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  151. package/dist/lib/esm/setting-ex.d.mts +35 -1
  152. package/dist/lib/esm/setting-ex.mjs +51 -1
  153. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  154. package/dist/lib/esm/settings-tabs.mjs +170 -0
  155. package/dist/styles.css +83 -1
  156. package/package.json +3 -3
  157. package/setting-components/folder-list-component/package.json +6 -0
  158. package/setting-components/hotkey-component/package.json +6 -0
  159. package/setting-components/list-component/package.json +6 -0
  160. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,116 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * A suggest popover opened at an element or a rectangle, with no input behind it.
7
+ */
8
+ import type { App, Scope } from 'obsidian';
9
+ import { PopoverSuggest } from 'obsidian';
10
+ /**
11
+ * Parameters for {@link AnchoredSuggest.openAt}.
12
+ */
13
+ export interface AnchoredSuggestOpenAtParams {
14
+ /**
15
+ * The element or the viewport rectangle the popover is placed against. When an element is given, the popover closes
16
+ * once the element leaves the DOM, and a pointer-down on it does not count as an outside click.
17
+ */
18
+ readonly anchor: DOMRectReadOnly | HTMLElement;
19
+ /**
20
+ * The query handed to {@link AnchoredSuggest.getSuggestions}. Defaults to `''`.
21
+ */
22
+ readonly query?: string;
23
+ }
24
+ /**
25
+ * A suggest popover opened at an anchor, for a picker that has no text input: a toolbar button, a context-menu action,
26
+ * a decoration in the editor.
27
+ *
28
+ * Obsidian's `AbstractInputSuggest` opens only from an input and `EditorSuggest` only from the editor. This one is
29
+ * opened by {@link AnchoredSuggest.openAt} and closes on Escape, on a pointer-down outside it, and when its anchor
30
+ * element leaves the DOM. The keyboard works as in Obsidian's own popovers: arrows move, Enter picks.
31
+ *
32
+ * ```ts
33
+ * class ColorSuggest extends AnchoredSuggest<string> {
34
+ * protected getSuggestions(): string[] {
35
+ * return ['red', 'green', 'blue'];
36
+ * }
37
+ *
38
+ * public renderSuggestion(color: string, el: HTMLElement): void {
39
+ * el.setText(color);
40
+ * }
41
+ *
42
+ * protected onChooseSuggestion(color: string): void {
43
+ * console.log(color);
44
+ * }
45
+ * }
46
+ *
47
+ * await new ColorSuggest(this.app).openAt({ anchor: buttonEl });
48
+ * ```
49
+ *
50
+ * It relies on `PopoverSuggest` members that `obsidian.d.ts` does not declare (`suggestions`, `reposition`,
51
+ * `setAutoDestroy`, `suggestEl`), read from Obsidian `1.15.0`.
52
+ *
53
+ * @typeParam T - The type of a suggestion.
54
+ */
55
+ export declare abstract class AnchoredSuggest<T> extends PopoverSuggest<T> {
56
+ /**
57
+ * The maximum number of suggestions shown. `0` disables the limit. Defaults to `100`.
58
+ */
59
+ limit: number;
60
+ private anchorEl;
61
+ private anchorRect;
62
+ private outsidePointerDownDocument;
63
+ private readonly outsidePointerDownHandler;
64
+ private requestCount;
65
+ /**
66
+ * Creates a new anchored suggest.
67
+ *
68
+ * @param app - The Obsidian app.
69
+ * @param scope - The parent keymap scope.
70
+ */
71
+ constructor(app: App, scope?: Scope);
72
+ /**
73
+ * Closes the popover.
74
+ */
75
+ close(): void;
76
+ /**
77
+ * Opens the popover at an anchor, or moves it there when it is already open.
78
+ *
79
+ * @param params - The parameters.
80
+ * @returns Whether the popover is open: `false` when there is nothing to suggest, or when it was closed or reopened
81
+ * while the suggestions were computed.
82
+ */
83
+ openAt(params: AnchoredSuggestOpenAtParams): Promise<boolean>;
84
+ /**
85
+ * Picks a suggestion: closes the popover, then hands the suggestion to {@link AnchoredSuggest.onChooseSuggestion}.
86
+ *
87
+ * @param value - The suggestion.
88
+ * @param $event - The event that picked it.
89
+ */
90
+ selectSuggestion(value: T, $event: KeyboardEvent | MouseEvent): void;
91
+ /**
92
+ * Recomputes the suggestions for a new query at the current anchor.
93
+ *
94
+ * @param query - The query.
95
+ * @returns Whether the popover is open afterwards.
96
+ */
97
+ setQuery(query: string): Promise<boolean>;
98
+ /**
99
+ * Gets the suggestions for a query.
100
+ *
101
+ * @param query - The query passed to {@link AnchoredSuggest.openAt} or {@link AnchoredSuggest.setQuery}.
102
+ * @returns The suggestions, directly or as a promise.
103
+ */
104
+ protected abstract getSuggestions(query: string): Promise<T[]> | T[];
105
+ /**
106
+ * Called with the suggestion the user picked, after the popover closed.
107
+ *
108
+ * @param value - The suggestion.
109
+ * @param $event - The event that picked it.
110
+ */
111
+ protected abstract onChooseSuggestion(value: T, $event: KeyboardEvent | MouseEvent): void;
112
+ private addOutsidePointerDownHandler;
113
+ private onOutsidePointerDown;
114
+ private refresh;
115
+ private removeOutsidePointerDownHandler;
116
+ }
@@ -0,0 +1,144 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { PopoverSuggest } from "obsidian";
34
+ const DEFAULT_LIMIT = 100;
35
+ class AnchoredSuggest extends PopoverSuggest {
36
+ /**
37
+ * The maximum number of suggestions shown. `0` disables the limit. Defaults to `100`.
38
+ */
39
+ limit = DEFAULT_LIMIT;
40
+ anchorEl = null;
41
+ anchorRect = null;
42
+ outsidePointerDownDocument = null;
43
+ outsidePointerDownHandler = this.onOutsidePointerDown.bind(this);
44
+ requestCount = 0;
45
+ /**
46
+ * Creates a new anchored suggest.
47
+ *
48
+ * @param app - The Obsidian app.
49
+ * @param scope - The parent keymap scope.
50
+ */
51
+ constructor(app, scope) {
52
+ super(app, scope);
53
+ }
54
+ /**
55
+ * Closes the popover.
56
+ */
57
+ close() {
58
+ this.requestCount++;
59
+ this.removeOutsidePointerDownHandler();
60
+ super.close();
61
+ }
62
+ /**
63
+ * Opens the popover at an anchor, or moves it there when it is already open.
64
+ *
65
+ * @param params - The parameters.
66
+ * @returns Whether the popover is open: `false` when there is nothing to suggest, or when it was closed or reopened
67
+ * while the suggestions were computed.
68
+ */
69
+ async openAt(params) {
70
+ const { anchor } = params;
71
+ if (isElement(anchor)) {
72
+ this.anchorEl = anchor;
73
+ this.anchorRect = anchor.getBoundingClientRect();
74
+ } else {
75
+ this.anchorEl = null;
76
+ this.anchorRect = anchor;
77
+ }
78
+ return await this.refresh(params.query ?? "", this.anchorRect);
79
+ }
80
+ /**
81
+ * Picks a suggestion: closes the popover, then hands the suggestion to {@link AnchoredSuggest.onChooseSuggestion}.
82
+ *
83
+ * @param value - The suggestion.
84
+ * @param $event - The event that picked it.
85
+ */
86
+ selectSuggestion(value, $event) {
87
+ this.close();
88
+ this.onChooseSuggestion(value, $event);
89
+ }
90
+ /**
91
+ * Recomputes the suggestions for a new query at the current anchor.
92
+ *
93
+ * @param query - The query.
94
+ * @returns Whether the popover is open afterwards.
95
+ */
96
+ async setQuery(query) {
97
+ return this.anchorRect ? await this.refresh(query, this.anchorRect) : false;
98
+ }
99
+ addOutsidePointerDownHandler() {
100
+ this.removeOutsidePointerDownHandler();
101
+ this.outsidePointerDownDocument = this.suggestEl.ownerDocument;
102
+ this.outsidePointerDownDocument.addEventListener("pointerdown", this.outsidePointerDownHandler, { capture: true });
103
+ }
104
+ onOutsidePointerDown(event_) {
105
+ const path = event_.composedPath();
106
+ if (path.includes(this.suggestEl) || this.anchorEl && path.includes(this.anchorEl)) {
107
+ return;
108
+ }
109
+ this.close();
110
+ }
111
+ async refresh(query, anchorRect) {
112
+ const requestId = ++this.requestCount;
113
+ let suggestions = await this.getSuggestions(query);
114
+ if (requestId !== this.requestCount) {
115
+ return false;
116
+ }
117
+ if (suggestions.length === 0) {
118
+ this.close();
119
+ return false;
120
+ }
121
+ if (this.limit > 0) {
122
+ suggestions = suggestions.slice(0, this.limit);
123
+ }
124
+ this.suggestions.setSuggestions(suggestions);
125
+ this.open();
126
+ this.reposition(DOMRect.fromRect(anchorRect));
127
+ if (this.anchorEl) {
128
+ this.setAutoDestroy(this.anchorEl);
129
+ }
130
+ this.addOutsidePointerDownHandler();
131
+ return true;
132
+ }
133
+ removeOutsidePointerDownHandler() {
134
+ this.outsidePointerDownDocument?.removeEventListener("pointerdown", this.outsidePointerDownHandler, { capture: true });
135
+ this.outsidePointerDownDocument = null;
136
+ }
137
+ }
138
+ function isElement(anchor) {
139
+ return "getBoundingClientRect" in anchor;
140
+ }
141
+ export {
142
+ AnchoredSuggest
143
+ };
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmNob3JlZC1zdWdnZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHN1Z2dlc3QgcG9wb3ZlciBvcGVuZWQgYXQgYW4gZWxlbWVudCBvciBhIHJlY3RhbmdsZSwgd2l0aCBubyBpbnB1dCBiZWhpbmQgaXQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFNjb3BlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgUG9wb3ZlclN1Z2dlc3QgfSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IERFRkFVTFRfTElNSVQgPSAxMDA7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5vcGVuQXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuY2hvcmVkU3VnZ2VzdE9wZW5BdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBvciB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIHRoZSBwb3BvdmVyIGlzIHBsYWNlZCBhZ2FpbnN0LiBXaGVuIGFuIGVsZW1lbnQgaXMgZ2l2ZW4sIHRoZSBwb3BvdmVyIGNsb3Nlc1xuICAgKiBvbmNlIHRoZSBlbGVtZW50IGxlYXZlcyB0aGUgRE9NLCBhbmQgYSBwb2ludGVyLWRvd24gb24gaXQgZG9lcyBub3QgY291bnQgYXMgYW4gb3V0c2lkZSBjbGljay5cbiAgICovXG4gIHJlYWRvbmx5IGFuY2hvcjogRE9NUmVjdFJlYWRPbmx5IHwgSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBoYW5kZWQgdG8ge0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5nZXRTdWdnZXN0aW9uc30uIERlZmF1bHRzIHRvIGAnJ2AuXG4gICAqL1xuICByZWFkb25seSBxdWVyeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHN1Z2dlc3QgcG9wb3ZlciBvcGVuZWQgYXQgYW4gYW5jaG9yLCBmb3IgYSBwaWNrZXIgdGhhdCBoYXMgbm8gdGV4dCBpbnB1dDogYSB0b29sYmFyIGJ1dHRvbiwgYSBjb250ZXh0LW1lbnUgYWN0aW9uLFxuICogYSBkZWNvcmF0aW9uIGluIHRoZSBlZGl0b3IuXG4gKlxuICogT2JzaWRpYW4ncyBgQWJzdHJhY3RJbnB1dFN1Z2dlc3RgIG9wZW5zIG9ubHkgZnJvbSBhbiBpbnB1dCBhbmQgYEVkaXRvclN1Z2dlc3RgIG9ubHkgZnJvbSB0aGUgZWRpdG9yLiBUaGlzIG9uZSBpc1xuICogb3BlbmVkIGJ5IHtAbGluayBBbmNob3JlZFN1Z2dlc3Qub3BlbkF0fSBhbmQgY2xvc2VzIG9uIEVzY2FwZSwgb24gYSBwb2ludGVyLWRvd24gb3V0c2lkZSBpdCwgYW5kIHdoZW4gaXRzIGFuY2hvclxuICogZWxlbWVudCBsZWF2ZXMgdGhlIERPTS4gVGhlIGtleWJvYXJkIHdvcmtzIGFzIGluIE9ic2lkaWFuJ3Mgb3duIHBvcG92ZXJzOiBhcnJvd3MgbW92ZSwgRW50ZXIgcGlja3MuXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIENvbG9yU3VnZ2VzdCBleHRlbmRzIEFuY2hvcmVkU3VnZ2VzdDxzdHJpbmc+IHtcbiAqICAgcHJvdGVjdGVkIGdldFN1Z2dlc3Rpb25zKCk6IHN0cmluZ1tdIHtcbiAqICAgICByZXR1cm4gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgcmVuZGVyU3VnZ2VzdGlvbihjb2xvcjogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAqICAgICBlbC5zZXRUZXh0KGNvbG9yKTtcbiAqICAgfVxuICpcbiAqICAgcHJvdGVjdGVkIG9uQ2hvb3NlU3VnZ2VzdGlvbihjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gKiAgICAgY29uc29sZS5sb2coY29sb3IpO1xuICogICB9XG4gKiB9XG4gKlxuICogYXdhaXQgbmV3IENvbG9yU3VnZ2VzdCh0aGlzLmFwcCkub3BlbkF0KHsgYW5jaG9yOiBidXR0b25FbCB9KTtcbiAqIGBgYFxuICpcbiAqIEl0IHJlbGllcyBvbiBgUG9wb3ZlclN1Z2dlc3RgIG1lbWJlcnMgdGhhdCBgb2JzaWRpYW4uZC50c2AgZG9lcyBub3QgZGVjbGFyZSAoYHN1Z2dlc3Rpb25zYCwgYHJlcG9zaXRpb25gLFxuICogYHNldEF1dG9EZXN0cm95YCwgYHN1Z2dlc3RFbGApLCByZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYSBzdWdnZXN0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQW5jaG9yZWRTdWdnZXN0PFQ+IGV4dGVuZHMgUG9wb3ZlclN1Z2dlc3Q8VD4ge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHNob3duLiBgMGAgZGlzYWJsZXMgdGhlIGxpbWl0LiBEZWZhdWx0cyB0byBgMTAwYC5cbiAgICovXG4gIHB1YmxpYyBsaW1pdCA9IERFRkFVTFRfTElNSVQ7XG5cbiAgcHJpdmF0ZSBhbmNob3JFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhbmNob3JSZWN0OiBET01SZWN0UmVhZE9ubHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudDogRG9jdW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyID0gdGhpcy5vbk91dHNpZGVQb2ludGVyRG93bi5iaW5kKHRoaXMpO1xuICBwcml2YXRlIHJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYW5jaG9yZWQgc3VnZ2VzdC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAuXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBwYXJlbnQga2V5bWFwIHNjb3BlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBzY29wZT86IFNjb3BlKSB7XG4gICAgc3VwZXIoYXBwLCBzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBwb3BvdmVyLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdENvdW50Kys7XG4gICAgdGhpcy5yZW1vdmVPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgc3VwZXIuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgcG9wb3ZlciBhdCBhbiBhbmNob3IsIG9yIG1vdmVzIGl0IHRoZXJlIHdoZW4gaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgb3BlbjogYGZhbHNlYCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gc3VnZ2VzdCwgb3Igd2hlbiBpdCB3YXMgY2xvc2VkIG9yIHJlb3BlbmVkXG4gICAqICAgd2hpbGUgdGhlIHN1Z2dlc3Rpb25zIHdlcmUgY29tcHV0ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb3BlbkF0KHBhcmFtczogQW5jaG9yZWRTdWdnZXN0T3BlbkF0UGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhbmNob3IgfSA9IHBhcmFtcztcbiAgICBpZiAoaXNFbGVtZW50KGFuY2hvcikpIHtcbiAgICAgIHRoaXMuYW5jaG9yRWwgPSBhbmNob3I7XG4gICAgICB0aGlzLmFuY2hvclJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYW5jaG9yRWwgPSBudWxsO1xuICAgICAgdGhpcy5hbmNob3JSZWN0ID0gYW5jaG9yO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoKHBhcmFtcy5xdWVyeSA/PyAnJywgdGhpcy5hbmNob3JSZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyBhIHN1Z2dlc3Rpb246IGNsb3NlcyB0aGUgcG9wb3ZlciwgdGhlbiBoYW5kcyB0aGUgc3VnZ2VzdGlvbiB0byB7QGxpbmsgQW5jaG9yZWRTdWdnZXN0Lm9uQ2hvb3NlU3VnZ2VzdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzdWdnZXN0aW9uLlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgcGlja2VkIGl0LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNlbGVjdFN1Z2dlc3Rpb24odmFsdWU6IFQsICRldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gICAgdGhpcy5vbkNob29zZVN1Z2dlc3Rpb24odmFsdWUsICRldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb21wdXRlcyB0aGUgc3VnZ2VzdGlvbnMgZm9yIGEgbmV3IHF1ZXJ5IGF0IHRoZSBjdXJyZW50IGFuY2hvci5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIG9wZW4gYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRRdWVyeShxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYW5jaG9yUmVjdCA/IChhd2FpdCB0aGlzLnJlZnJlc2gocXVlcnksIHRoaXMuYW5jaG9yUmVjdCkpIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3VnZ2VzdGlvbnMgZm9yIGEgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeSAtIFRoZSBxdWVyeSBwYXNzZWQgdG8ge0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5vcGVuQXR9IG9yIHtAbGluayBBbmNob3JlZFN1Z2dlc3Quc2V0UXVlcnl9LlxuICAgKiBAcmV0dXJucyBUaGUgc3VnZ2VzdGlvbnMsIGRpcmVjdGx5IG9yIGFzIGEgcHJvbWlzZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTdWdnZXN0aW9ucyhxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxUW10+IHwgVFtdO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2l0aCB0aGUgc3VnZ2VzdGlvbiB0aGUgdXNlciBwaWNrZWQsIGFmdGVyIHRoZSBwb3BvdmVyIGNsb3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN1Z2dlc3Rpb24uXG4gICAqIEBwYXJhbSAkZXZlbnQgLSBUaGUgZXZlbnQgdGhhdCBwaWNrZWQgaXQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25DaG9vc2VTdWdnZXN0aW9uKHZhbHVlOiBULCAkZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZDtcblxuICBwcml2YXRlIGFkZE91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudCA9IHRoaXMuc3VnZ2VzdEVsLm93bmVyRG9jdW1lbnQ7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub3V0c2lkZVBvaW50ZXJEb3duSGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk91dHNpZGVQb2ludGVyRG93bihldmVudF86IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBldmVudF8uY29tcG9zZWRQYXRoKCk7XG4gICAgaWYgKHBhdGguaW5jbHVkZXModGhpcy5zdWdnZXN0RWwpIHx8ICh0aGlzLmFuY2hvckVsICYmIHBhdGguaW5jbHVkZXModGhpcy5hbmNob3JFbCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaChxdWVyeTogc3RyaW5nLCBhbmNob3JSZWN0OiBET01SZWN0UmVhZE9ubHkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSArK3RoaXMucmVxdWVzdENvdW50O1xuICAgIGxldCBzdWdnZXN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0U3VnZ2VzdGlvbnMocXVlcnkpO1xuICAgIGlmIChyZXF1ZXN0SWQgIT09IHRoaXMucmVxdWVzdENvdW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGltaXQgPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuICAgIH1cblxuICAgIHRoaXMuc3VnZ2VzdGlvbnMuc2V0U3VnZ2VzdGlvbnMoc3VnZ2VzdGlvbnMpO1xuICAgIHRoaXMub3BlbigpO1xuICAgIHRoaXMucmVwb3NpdGlvbihET01SZWN0LmZyb21SZWN0KGFuY2hvclJlY3QpKTtcbiAgICBpZiAodGhpcy5hbmNob3JFbCkge1xuICAgICAgdGhpcy5zZXRBdXRvRGVzdHJveSh0aGlzLmFuY2hvckVsKTtcbiAgICB9XG4gICAgdGhpcy5hZGRPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB0aGlzLm91dHNpZGVQb2ludGVyRG93bkRvY3VtZW50ID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQoYW5jaG9yOiBET01SZWN0UmVhZE9ubHkgfCBIVE1MRWxlbWVudCk6IGFuY2hvciBpcyBIVE1MRWxlbWVudCB7XG4gIHJldHVybiAnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JyBpbiBhbmNob3I7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0EsU0FBUyxzQkFBc0I7QUFFL0IsTUFBTSxnQkFBZ0I7QUFpRGYsTUFBZSx3QkFBMkIsZUFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUkxRCxRQUFRO0FBQUEsRUFFUCxXQUErQjtBQUFBLEVBQy9CLGFBQXFDO0FBQUEsRUFDckMsNkJBQThDO0FBQUEsRUFDckMsNEJBQTRCLEtBQUsscUJBQXFCLEtBQUssSUFBSTtBQUFBLEVBQ3hFLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFoQixZQUFZLEtBQVUsT0FBZTtBQUMxQyxVQUFNLEtBQUssS0FBSztBQUFBLEVBQ2xCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsUUFBYztBQUM1QixTQUFLO0FBQ0wsU0FBSyxnQ0FBZ0M7QUFDckMsVUFBTSxNQUFNO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxNQUFhLE9BQU8sUUFBdUQ7QUFDekUsVUFBTSxFQUFFLE9BQU8sSUFBSTtBQUNuQixRQUFJLFVBQVUsTUFBTSxHQUFHO0FBQ3JCLFdBQUssV0FBVztBQUNoQixXQUFLLGFBQWEsT0FBTyxzQkFBc0I7QUFBQSxJQUNqRCxPQUFPO0FBQ0wsV0FBSyxXQUFXO0FBQ2hCLFdBQUssYUFBYTtBQUFBLElBQ3BCO0FBQ0EsV0FBTyxNQUFNLEtBQUssUUFBUSxPQUFPLFNBQVMsSUFBSSxLQUFLLFVBQVU7QUFBQSxFQUMvRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUWdCLGlCQUFpQixPQUFVLFFBQTBDO0FBQ25GLFNBQUssTUFBTTtBQUNYLFNBQUssbUJBQW1CLE9BQU8sTUFBTTtBQUFBLEVBQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLFNBQVMsT0FBaUM7QUFDckQsV0FBTyxLQUFLLGFBQWMsTUFBTSxLQUFLLFFBQVEsT0FBTyxLQUFLLFVBQVUsSUFBSztBQUFBLEVBQzFFO0FBQUEsRUFrQlEsK0JBQXFDO0FBQzNDLFNBQUssZ0NBQWdDO0FBQ3JDLFNBQUssNkJBQTZCLEtBQUssVUFBVTtBQUNqRCxTQUFLLDJCQUEyQixpQkFBaUIsZUFBZSxLQUFLLDJCQUEyQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsRUFDbkg7QUFBQSxFQUVRLHFCQUFxQixRQUE0QjtBQUN2RCxVQUFNLE9BQU8sT0FBTyxhQUFhO0FBQ2pDLFFBQUksS0FBSyxTQUFTLEtBQUssU0FBUyxLQUFNLEtBQUssWUFBWSxLQUFLLFNBQVMsS0FBSyxRQUFRLEdBQUk7QUFDcEY7QUFBQSxJQUNGO0FBQ0EsU0FBSyxNQUFNO0FBQUEsRUFDYjtBQUFBLEVBRUEsTUFBYyxRQUFRLE9BQWUsWUFBK0M7QUFDbEYsVUFBTSxZQUFZLEVBQUUsS0FBSztBQUN6QixRQUFJLGNBQWMsTUFBTSxLQUFLLGVBQWUsS0FBSztBQUNqRCxRQUFJLGNBQWMsS0FBSyxjQUFjO0FBQ25DLGFBQU87QUFBQSxJQUNUO0FBQ0EsUUFBSSxZQUFZLFdBQVcsR0FBRztBQUM1QixXQUFLLE1BQU07QUFDWCxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksS0FBSyxRQUFRLEdBQUc7QUFDbEIsb0JBQWMsWUFBWSxNQUFNLEdBQUcsS0FBSyxLQUFLO0FBQUEsSUFDL0M7QUFFQSxTQUFLLFlBQVksZUFBZSxXQUFXO0FBQzNDLFNBQUssS0FBSztBQUNWLFNBQUssV0FBVyxRQUFRLFNBQVMsVUFBVSxDQUFDO0FBQzVDLFFBQUksS0FBSyxVQUFVO0FBQ2pCLFdBQUssZUFBZSxLQUFLLFFBQVE7QUFBQSxJQUNuQztBQUNBLFNBQUssNkJBQTZCO0FBQ2xDLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFUSxrQ0FBd0M7QUFDOUMsU0FBSyw0QkFBNEIsb0JBQW9CLGVBQWUsS0FBSywyQkFBMkIsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNySCxTQUFLLDZCQUE2QjtBQUFBLEVBQ3BDO0FBQ0Y7QUFFQSxTQUFTLFVBQVUsUUFBOEQ7QUFDL0UsU0FBTywyQkFBMkI7QUFDcEM7IiwibmFtZXMiOltdfQ==
@@ -40,6 +40,10 @@
40
40
  */
41
41
  import type { CustomArrayDict } from '@obsidian-typings/obsidian-public-latest';
42
42
  import type { App, Reference, TFile } from 'obsidian';
43
+ /**
44
+ * The callback Obsidian's `metadataCache.iterateAllRefs` takes.
45
+ */
46
+ export type IterateReferencesCallback = Parameters<App['metadataCache']['iterateAllRefs']>[0];
43
47
  /**
44
48
  * The same answer as `app.metadataCache.getBacklinksForFile(file)` (Obsidian's own, unpatched), from the candidate
45
49
  * notes only. See the file header for why the answer is exact.
@@ -49,3 +53,22 @@ import type { App, Reference, TFile } from 'obsidian';
49
53
  * @returns The references that resolve to `file`, keyed by the path of the note or canvas holding them.
50
54
  */
51
55
  export declare function getIndexedBacklinksForFile(app: App, file: TFile): CustomArrayDict<Reference>;
56
+ /**
57
+ * Visits the references `app.metadataCache.iterateAllRefs` would visit, minus every reference whose resolution
58
+ * cannot change when `file` is renamed to `newPath`.
59
+ *
60
+ * Obsidian's `FileManager.runAsyncLinkUpdate` resolves EVERY reference in the vault before each rename, to diff
61
+ * the resolutions afterwards in `updateAllLinks`; that is the whole cost of a rename in a large vault. A reference
62
+ * can resolve to `file` only if its linkpath's last segment matches `file`'s name before the rename or its name
63
+ * after it (see the file header), and a reference that resolves to neither keeps resolving to whatever it did. So
64
+ * the references that can change are those of the index's candidates for both names, plus the references held by
65
+ * `file` itself, whose relative links resolve from its new folder afterwards. `linkUpdaters` references are walked
66
+ * in full, as in {@link getIndexedBacklinksForFile}.
67
+ *
68
+ * @param app - The Obsidian app instance.
69
+ * @param file - The file being renamed, still at its old path.
70
+ * @param newPath - The path it is being renamed to.
71
+ * @param callback - Called with each reference and the path of the note holding it. Returning `true` stops the
72
+ * walk over that note's references, as in Obsidian's own walk.
73
+ */
74
+ export declare function iterateReferencesAffectedByRename(app: App, file: TFile, newPath: string, callback: IterateReferencesCallback): void;
@@ -60,6 +60,27 @@ function getIndexedBacklinksForFile(app, file) {
60
60
  }
61
61
  }
62
62
  }
63
+ function iterateReferencesAffectedByRename(app, file, newPath, callback) {
64
+ const data = getBacklinkIndexData();
65
+ refresh(app, data);
66
+ const newName = newPath.slice(newPath.lastIndexOf("/") + 1);
67
+ const candidateSourcePaths = /* @__PURE__ */ new Set([file.path]);
68
+ for (const nameKey of [...getTargetNameKeys(file.name), ...getTargetNameKeys(newName)]) {
69
+ for (const sourcePath of data.nameKeySourcePaths.get(nameKey) ?? []) {
70
+ candidateSourcePaths.add(sourcePath);
71
+ }
72
+ }
73
+ for (const sourcePath of candidateSourcePaths) {
74
+ for (const reference of getCacheReferences(getCachedMetadata(app, sourcePath))) {
75
+ if (callback(sourcePath, reference) === true) {
76
+ break;
77
+ }
78
+ }
79
+ }
80
+ for (const linkUpdater of Object.values(app.metadataCache.linkUpdaters)) {
81
+ linkUpdater?.iterateReferences(callback);
82
+ }
83
+ }
63
84
  function getBacklinkIndexData() {
64
85
  return getObsidianLibState("backlinkIndexV1", {
65
86
  indexedHashes: /* @__PURE__ */ new Map(),
@@ -109,16 +130,29 @@ function indexSource(app, data, sourcePath, hash) {
109
130
  }
110
131
  function refresh(app, data) {
111
132
  const fileCache = app.metadataCache.fileCache;
133
+ const indexedCountBefore = data.indexedHashes.size;
134
+ let seenIndexedCount = 0;
135
+ for (const sourcePath in fileCache) {
136
+ const entry = Object.hasOwn(fileCache, sourcePath) ? fileCache[sourcePath] : void 0;
137
+ if (!entry) {
138
+ continue;
139
+ }
140
+ const indexedHash = data.indexedHashes.get(sourcePath);
141
+ if (indexedHash !== void 0) {
142
+ seenIndexedCount++;
143
+ }
144
+ if (indexedHash !== entry.hash) {
145
+ indexSource(app, data, sourcePath, entry.hash);
146
+ }
147
+ }
148
+ if (seenIndexedCount === indexedCountBefore) {
149
+ return;
150
+ }
112
151
  for (const sourcePath of data.sourcePathNameKeys.keys()) {
113
152
  if (!Object.hasOwn(fileCache, sourcePath)) {
114
153
  removeSource(data, sourcePath);
115
154
  }
116
155
  }
117
- for (const [sourcePath, { hash }] of Object.entries(fileCache)) {
118
- if (data.indexedHashes.get(sourcePath) !== hash) {
119
- indexSource(app, data, sourcePath, hash);
120
- }
121
- }
122
156
  }
123
157
  function removeSource(data, sourcePath) {
124
158
  for (const nameKey of data.sourcePathNameKeys.get(sourcePath) ?? []) {
@@ -132,6 +166,7 @@ function removeSource(data, sourcePath) {
132
166
  data.indexedHashes.delete(sourcePath);
133
167
  }
134
168
  export {
135
- getIndexedBacklinksForFile
169
+ getIndexedBacklinksForFile,
170
+ iterateReferencesAffectedByRename
136
171
  };
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrbGluay1pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQW5zd2VycyBcIndoaWNoIHJlZmVyZW5jZXMgcmVzb2x2ZSB0byB0aGlzIGZpbGU/XCIgYnkgbG9va2luZyBvbmx5IGF0IHRoZSBub3RlcyB0aGF0IENPVUxEIGhvbGQgb25lLCBpbnN0ZWFkIG9mXG4gKiByZXNvbHZpbmcgZXZlcnkgcmVmZXJlbmNlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBtZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSlgIGlzIG5vdCBhbiBpbmRleCBsb29rdXAuIFJlYWQgb3V0IG9mIHRoZSAxLjE0LjIgYnVuZGxlLCBpdCBpc1xuICogYGl0ZXJhdGVBbGxSZWZzYCDigJQgZXZlcnkgYGZyb250bWF0dGVyTGlua3NgLCBgbGlua3NgIGFuZCBgZW1iZWRzYCBlbnRyeSBvZiBldmVyeSBjYWNoZWQgbm90ZSwgcGx1cyBldmVyeVxuICogcmVmZXJlbmNlIGVhY2ggYGxpbmtVcGRhdGVyc2AgZW50cnkgKHRoZSBjYW52YXMgb25lKSByZXBvcnRzIOKAlCB3aXRoIG9uZSBgZ2V0Rmlyc3RMaW5rcGF0aERlc3RgIHBlciByZWZlcmVuY2UsXG4gKiBrZWVwaW5nIHRob3NlIHRoYXQgcmVzb2x2ZSB0byBgZmlsZWAuIFRoYXQgaXMgfjExNSBtcyBhdCAxMDBrIHJlZmVyZW5jZXMgYW5kIH4zMjAgbXMgYXQgMjUwaywgcGFpZCBvbmNlIHBlciBmaWxlXG4gKiBieSBldmVyeSBwZXItZmlsZSBiYWNrbGluayBsb29rdXAsIHNvIGEgMTAwMC1ub3RlIGZvbGRlciByZW5hbWUgaW4gYSA1MGstbm90ZSB2YXVsdCB0b29rIDkyNCBzLlxuICpcbiAqIFdoYXQgbWFrZXMgYSBuYXJyb3dlciBhbnN3ZXIgZXhhY3QgaXMgYSBwcm9wZXJ0eSBvZiBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aERlc3RgOiBldmVyeSBicmFuY2ggb2YgaXQgY2FuIG9ubHlcbiAqIHJldHVybiBhIGZpbGUgd2hvc2UgbG93ZXJjYXNlZCBuYW1lIGlzIHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgdGhlIGxpbmtwYXRoLCBvciB0aGF0IHNlZ21lbnQgcGx1c1xuICogYC5tZGAuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHRoZSBlbXB0eSBsaW5rcGF0aCAoYFtbI0hlYWRpbmddXWApLCB3aGljaCByZXR1cm5zIHRoZSBzb3VyY2Ugbm90ZSBpdHNlbGYuIFNvIGFcbiAqIG5vdGUgY2FuIGhvbGQgYSByZWZlcmVuY2UgdG8gYGZpbGVgIG9ubHkgaWYgaXQgaG9sZHMgYSByZWZlcmVuY2Ugd2hvc2UgbGFzdCBzZWdtZW50IG1hdGNoZXMgb25lIG9mIGBmaWxlYCdzXG4gKiBuYW1lIGtleXMsIG9yIGlmIGl0IElTIGBmaWxlYC4gVGhpcyBtb2R1bGUgaW5kZXhlcyBub3RlcyBieSB0aG9zZSBzZWdtZW50cywgdGFrZXMgdGhlIGNhbmRpZGF0ZXMgZm9yIGBmaWxlYCxcbiAqIGFuZCBydW5zIE9ic2lkaWFuJ3Mgb3duIHByZWRpY2F0ZSDigJQgYGdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtwYXRoLCBzb3VyY2UpID09PSBmaWxlYCDigJQgb3ZlciB0aGUgY2FuZGlkYXRlcydcbiAqIHJlZmVyZW5jZXMgb25seS4gVGhlIGNhbmRpZGF0ZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIHJlYWwgYmFja2xpbmtzIGFuZCB0aGUgcHJlZGljYXRlIGlzIHRoZSBzYW1lIG9uZSwgc29cbiAqIHRoZSBhbnN3ZXIgaXMgdGhlIG9uZSB0aGUgZnVsbCB3YWxrIGdpdmVzLCBhIGZpbGUgcmVnaXN0ZXJlZCBhdCBhIG5vbi1leGlzdGluZyBwYXRoIGluY2x1ZGVkLiBPbmx5IHRoZSBPUkRFUlxuICogb2YgdGhlIG5vdGVzIGluIHRoZSBhbnN3ZXIgZGlmZmVyczogdGhlIGZpbGUgaXRzZWxmIGZpcnN0LCB0aGVuIHRoZSBjYW5kaWRhdGVzIGluIGluZGV4IG9yZGVyLlxuICpcbiAqIFRoZSBpbmRleCBpcyBrZXB0IGZyZXNoIHdpdGhvdXQgbGlzdGVuaW5nIHRvIGFueXRoaW5nLiBgbWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVgIG1hcHMgYSBub3RlIHRvIHRoZSBoYXNoIG9mXG4gKiBpdHMgY29udGVudCwgYW5kIHRoZSByZWZlcmVuY2VzIGFyZSBhIGZ1bmN0aW9uIG9mIHRoYXQgaGFzaCwgc28gZWFjaCBxdWVyeSBjb21wYXJlcyBldmVyeSBub3RlJ3MgaGFzaFxuICogYWdhaW5zdCB0aGUgb25lIGl0IHdhcyBpbmRleGVkIGF0IGFuZCByZS1yZWFkcyBvbmx5IHRoZSBub3RlcyB0aGF0IGNoYW5nZWQuIFRoYXQgaXMgb25lIHByb3BlcnR5IGNvbXBhcmlzb25cbiAqIHBlciBub3RlIGFuZCBubyByZXNvbHV0aW9uIGF0IGFsbCwgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHNjYW4gT2JzaWRpYW4gaXRzZWxmIHJ1bnMgb24gZXZlcnkgcmVuYW1lXG4gKiAoYHVwZGF0ZVJlbGF0ZWRMaW5rc2ApLiBEZXBlbmRpbmcgb24gbm8gZXZlbnQgYWxzbyBtZWFucyBkZXBlbmRpbmcgb24gbm8gZXZlbnQgT1JERVIsIHdoaWNoIG1hdHRlcnMgYmVjYXVzZVxuICogcmVuYW1lIGhhbmRsZXJzIHF1ZXJ5IGZyb20gaW5zaWRlIHRoZSB2YXVsdCBgcmVuYW1lYCBldmVudC5cbiAqXG4gKiBUaGVyZSBpcyBvbmUgaW5kZXggcGVyIHJlbmRlcmVyIHJlYWxtLCBoZWxkIGluIHRoZSByZWFsbS1nbG9iYWwgc2hhcmVkLXN0YXRlIGJhZywgc28gZXZlcnkgcGx1Z2luIGJ1bmRsaW5nIHRoaXMgbGlicmFyeVxuICogc2hhcmVzIGl0IHJhdGhlciB0aGFuIGVhY2ggYnVpbGRpbmcgaXRzIG93bi4gV2hhdCBpcyBzdG9yZWQgdGhlcmUgaXMgcGxhaW4gZGF0YSByZWFkIHN0cnVjdHVyYWxseSAobWFwcyBhbmRcbiAqIHNldHMsIG5ldmVyIGEgY2xhc3MgaW5zdGFuY2UpLCBiZWNhdXNlIHRoZSBiYWcgY3Jvc3NlcyBjb3BpZXMgb2YgdGhpcyBsaWJyYXJ5IGF0IGRpZmZlcmVudCB2ZXJzaW9ucy4gVGhlIGtleVxuICogY2FycmllcyBhIHZlcnNpb246IGEgY2hhbmdlIHRvIHdoYXQgYSBrZXkgTUVBTlMgKGhvdyBhIG5hbWUga2V5IGlzIGRlcml2ZWQpIG11c3QgbW92ZSB0byBhIG5ldyBrZXksIHNvIGFuIG9sZGVyXG4gKiBjb3B5IG5ldmVyIHJlYWRzIGFuIGluZGV4IGJ1aWx0IGJ5IGRpZmZlcmVudCBydWxlcy5cbiAqXG4gKiBUaGUgYGxpbmtVcGRhdGVyc2Agc2lkZSBpcyBzdGlsbCB3YWxrZWQgaW4gZnVsbCBvbiBldmVyeSBxdWVyeS4gSW4gMS4xNC4yIHRoZSBvbmx5IHVwZGF0ZXIgaXMgdGhlIGNhbnZhc1xuICogb25lLCB3aG9zZSByZWZlcmVuY2VzIGxpdmUgaW4gdGhlIGNhbnZhcyBpbmRleCByYXRoZXIgdGhhbiBpbiBgZmlsZUNhY2hlYCwgc28gdGhlcmUgaXMgbm8gaGFzaCB0byBrZXkgdGhlbVxuICogYnk7IGEgdmF1bHQncyBjYW52YXNlcyBob2xkIGEgc21hbGwgZnJhY3Rpb24gb2YgaXRzIHJlZmVyZW5jZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IEN1c3RvbUFycmF5RGljdEltcGwgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbmludGVyZmFjZSBCYWNrbGlua0luZGV4RGF0YSB7XG4gIHJlYWRvbmx5IGluZGV4ZWRIYXNoZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IG5hbWVLZXlTb3VyY2VQYXRoczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+O1xuICByZWFkb25seSBzb3VyY2VQYXRoTmFtZUtleXM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pjtcbn1cblxuY29uc3QgTUFSS0RPV05fU1VGRklYID0gJy5tZCc7XG5cbi8qKlxuICogVGhlIHNhbWUgYW5zd2VyIGFzIGBhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpYCAoT2JzaWRpYW4ncyBvd24sIHVucGF0Y2hlZCksIGZyb20gdGhlIGNhbmRpZGF0ZVxuICogbm90ZXMgb25seS4gU2VlIHRoZSBmaWxlIGhlYWRlciBmb3Igd2h5IHRoZSBhbnN3ZXIgaXMgZXhhY3QuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHdob3NlIGJhY2tsaW5rcyB0byBmaW5kLiBJdCBtYXkgYmUgYSBub24tZXhpc3RpbmcgZmlsZSByZWdpc3RlcmVkIGZvciB0aGUgcXVlcnkuXG4gKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlcyB0aGF0IHJlc29sdmUgdG8gYGZpbGVgLCBrZXllZCBieSB0aGUgcGF0aCBvZiB0aGUgbm90ZSBvciBjYW52YXMgaG9sZGluZyB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG1ldGFkYXRhQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZTtcbiAgY29uc3QgYmFja2xpbmtzID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuXG4gIC8vIFRoZSBmaWxlIGl0c2VsZiBpcyBhIGNhbmRpZGF0ZSBmb3IgaXRzIG93biBgW1sjSGVhZGluZ11dYCByZWZlcmVuY2VzLCB3aG9zZSBlbXB0eSBsaW5rcGF0aCBuYW1lcyBubyBzZWdtZW50LlxuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlLm5hbWUpKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgY29sbGVjdChzb3VyY2VQYXRoLCByZWZlcmVuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbGlua1VwZGF0ZXIgb2YgT2JqZWN0LnZhbHVlcyhtZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY29sbGVjdCk7XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3Qoc291cmNlUGF0aDogc3RyaW5nLCByZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHZvaWQge1xuICAgIGlmIChtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGdldExpbmtwYXRoKHJlZmVyZW5jZS5saW5rKSwgc291cmNlUGF0aCkgPT09IGZpbGUpIHtcbiAgICAgIGJhY2tsaW5rcy5hZGQoc291cmNlUGF0aCwgcmVmZXJlbmNlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmFja2xpbmtJbmRleERhdGEoKTogQmFja2xpbmtJbmRleERhdGEge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxCYWNrbGlua0luZGV4RGF0YT4oJ2JhY2tsaW5rSW5kZXhWMScsIHtcbiAgICBpbmRleGVkSGFzaGVzOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIG5hbWVLZXlTb3VyY2VQYXRoczogbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpLFxuICAgIHNvdXJjZVBhdGhOYW1lS2V5czogbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpXG4gIH0pLnZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0Q2FjaGVkTWV0YWRhdGEoYXBwOiBBcHAsIHNvdXJjZVBhdGg6IHN0cmluZyk6IENhY2hlZE1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGFzaCA9IGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtzb3VyY2VQYXRoXT8uaGFzaDtcbiAgcmV0dXJuIGhhc2ggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbaGFzaF07XG59XG5cbi8qKlxuICogTGlzdHMgYSBjYWNoZWQgbm90ZSdzIHJlZmVyZW5jZXMgaW4gdGhlIG9yZGVyIE9ic2lkaWFuJ3Mgb3duIHdhbGsgdmlzaXRzIHRoZW06IGBmcm9udG1hdHRlckxpbmtzYCwgdGhlblxuICogYGxpbmtzYCwgdGhlbiBgZW1iZWRzYC5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbm90ZSdzIGNhY2hlZCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBub3RlJ3MgcmVmZXJlbmNlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2FjaGVSZWZlcmVuY2VzKGNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZVtdIHtcbiAgcmV0dXJuIGNhY2hlID8gWy4uLmNhY2hlLmZyb250bWF0dGVyTGlua3MgPz8gW10sIC4uLmNhY2hlLmxpbmtzID8/IFtdLCAuLi5jYWNoZS5lbWJlZHMgPz8gW11dIDogW107XG59XG5cbi8qKlxuICogU3RyaXBzIHRoZSBzdWJwYXRoIGZyb20gYSBsaW5rLCB0aGUgd2F5IE9ic2lkaWFuJ3MgYGdldExpbmtwYXRoYCBkb2VzLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdGV4dCwgc3VjaCBhcyBgZm9sZGVyL05vdGUjSGVhZGluZ2AuXG4gKiBAcmV0dXJucyBUaGUgbGlua3BhdGgsIHN1Y2ggYXMgYGZvbGRlci9Ob3RlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlua3BhdGgobGluazogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaEluZGV4ID0gbGluay5pbmRleE9mKCcjJyk7XG4gIHJldHVybiBoYXNoSW5kZXggPT09IC0xID8gbGluayA6IGxpbmsuc2xpY2UoMCwgaGFzaEluZGV4KTtcbn1cblxuLyoqXG4gKiBUaGUga2V5IGEgcmVmZXJlbmNlIGlzIGluZGV4ZWQgdW5kZXI6IHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgaXRzIGxpbmtwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIHJlZmVyZW5jZSdzIGxpbmsgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU5hbWVLZXkobGluazogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGlua3BhdGggPSBnZXRMaW5rcGF0aChsaW5rKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbGlua3BhdGguc2xpY2UobGlua3BhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xufVxuXG4vKipcbiAqIFRoZSBrZXlzIHVuZGVyIHdoaWNoIGEgcmVmZXJlbmNlIHRvIGEgZmlsZSB3aXRoIHRoaXMgbmFtZSBjYW4gYmUgaW5kZXhlZC4gYGdldExpbmtwYXRoRGVzdGAgbWF0Y2hlcyBhXG4gKiBzZWdtZW50IGFnYWluc3QgdGhlIGZpbGUncyBuYW1lLCBhbmQgYWdhaW5zdCB0aGUgbmFtZSB3aXRoIGAubWRgIGFwcGVuZGVkLCBzbyBhIG5vdGUgbmFtZWQgYE5vdGUubWRgIGlzXG4gKiByZWFjaGFibGUgZnJvbSBib3RoIGBub3RlLm1kYCBhbmQgYG5vdGVgLlxuICpcbiAqIEBwYXJhbSBmaWxlTmFtZSAtIFRoZSBmaWxlJ3MgbmFtZSwgZXh0ZW5zaW9uIGluY2x1ZGVkLlxuICogQHJldHVybnMgVGhlIGtleXMuXG4gKi9cbmZ1bmN0aW9uIGdldFRhcmdldE5hbWVLZXlzKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5hbWVLZXkgPSBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbmFtZUtleS5lbmRzV2l0aChNQVJLRE9XTl9TVUZGSVgpID8gW25hbWVLZXksIG5hbWVLZXkuc2xpY2UoMCwgLU1BUktET1dOX1NVRkZJWC5sZW5ndGgpXSA6IFtuYW1lS2V5XTtcbn1cblxuZnVuY3Rpb24gaW5kZXhTb3VyY2UoYXBwOiBBcHAsIGRhdGE6IEJhY2tsaW5rSW5kZXhEYXRhLCBzb3VyY2VQYXRoOiBzdHJpbmcsIGhhc2g6IHN0cmluZyk6IHZvaWQge1xuICByZW1vdmVTb3VyY2UoZGF0YSwgc291cmNlUGF0aCk7XG4gIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZVtoYXNoXTtcbiAgLypcbiAgICogQSBub3RlJ3MgYGZpbGVDYWNoZWAgZW50cnkgY2FuIGNhcnJ5IGl0cyBuZXcgaGFzaCBiZWZvcmUgdGhlIG1ldGFkYXRhIGZvciB0aGF0IGhhc2ggaXMgc3RvcmVkLiBSZWNvcmRpbmdcbiAgICogdGhlIGhhc2ggdGhlbiB3b3VsZCBwaW4gdGhlIG5vdGUgYXQgXCJubyByZWZlcmVuY2VzXCIgdW50aWwgaXRzIGNvbnRlbnQgY2hhbmdlZCBhZ2Fpbiwgc28gbGVhdmUgaXRcbiAgICogdW5yZWNvcmRlZCBhbmQgbGV0IHRoZSBuZXh0IHF1ZXJ5IGxvb2sgYWdhaW4uXG4gICAqL1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmFtZUtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgZ2V0Q2FjaGVSZWZlcmVuY2VzKGNhY2hlKSkge1xuICAgIG5hbWVLZXlzLmFkZChnZXRSZWZlcmVuY2VOYW1lS2V5KHJlZmVyZW5jZS5saW5rKSk7XG4gIH1cbiAgZm9yIChjb25zdCBuYW1lS2V5IG9mIG5hbWVLZXlzKSB7XG4gICAgbGV0IHNvdXJjZVBhdGhzID0gZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuZ2V0KG5hbWVLZXkpO1xuICAgIGlmICghc291cmNlUGF0aHMpIHtcbiAgICAgIHNvdXJjZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBkYXRhLm5hbWVLZXlTb3VyY2VQYXRocy5zZXQobmFtZUtleSwgc291cmNlUGF0aHMpO1xuICAgIH1cbiAgICBzb3VyY2VQYXRocy5hZGQoc291cmNlUGF0aCk7XG4gIH1cbiAgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMuc2V0KHNvdXJjZVBhdGgsIG5hbWVLZXlzKTtcbiAgZGF0YS5pbmRleGVkSGFzaGVzLnNldChzb3VyY2VQYXRoLCBoYXNoKTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaChhcHA6IEFwcCwgZGF0YTogQmFja2xpbmtJbmRleERhdGEpOiB2b2lkIHtcbiAgY29uc3QgZmlsZUNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlO1xuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBkYXRhLnNvdXJjZVBhdGhOYW1lS2V5cy5rZXlzKCkpIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24oZmlsZUNhY2hlLCBzb3VyY2VQYXRoKSkge1xuICAgICAgcmVtb3ZlU291cmNlKGRhdGEsIHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW3NvdXJjZVBhdGgsIHsgaGFzaCB9XSBvZiBPYmplY3QuZW50cmllcyhmaWxlQ2FjaGUpKSB7XG4gICAgaWYgKGRhdGEuaW5kZXhlZEhhc2hlcy5nZXQoc291cmNlUGF0aCkgIT09IGhhc2gpIHtcbiAgICAgIGluZGV4U291cmNlKGFwcCwgZGF0YSwgc291cmNlUGF0aCwgaGFzaCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZShkYXRhOiBCYWNrbGlua0luZGV4RGF0YSwgc291cmNlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBkYXRhLnNvdXJjZVBhdGhOYW1lS2V5cy5nZXQoc291cmNlUGF0aCkgPz8gW10pIHtcbiAgICBjb25zdCBzb3VyY2VQYXRocyA9IGVuc3VyZU5vbk51bGxhYmxlKGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSk7XG4gICAgc291cmNlUGF0aHMuZGVsZXRlKHNvdXJjZVBhdGgpO1xuICAgIGlmIChzb3VyY2VQYXRocy5zaXplID09PSAwKSB7XG4gICAgICBkYXRhLm5hbWVLZXlTb3VyY2VQYXRocy5kZWxldGUobmFtZUtleSk7XG4gICAgfVxuICB9XG4gIGRhdGEuc291cmNlUGF0aE5hbWVLZXlzLmRlbGV0ZShzb3VyY2VQYXRoKTtcbiAgZGF0YS5pbmRleGVkSGFzaGVzLmRlbGV0ZShzb3VyY2VQYXRoKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnREEsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUywyQkFBMkI7QUFFcEMsU0FBUywyQkFBMkI7QUFRcEMsTUFBTSxrQkFBa0I7QUFVakIsU0FBUywyQkFBMkIsS0FB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
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrbGluay1pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQW5zd2VycyBcIndoaWNoIHJlZmVyZW5jZXMgcmVzb2x2ZSB0byB0aGlzIGZpbGU/XCIgYnkgbG9va2luZyBvbmx5IGF0IHRoZSBub3RlcyB0aGF0IENPVUxEIGhvbGQgb25lLCBpbnN0ZWFkIG9mXG4gKiByZXNvbHZpbmcgZXZlcnkgcmVmZXJlbmNlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBtZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSlgIGlzIG5vdCBhbiBpbmRleCBsb29rdXAuIFJlYWQgb3V0IG9mIHRoZSAxLjE0LjIgYnVuZGxlLCBpdCBpc1xuICogYGl0ZXJhdGVBbGxSZWZzYCDigJQgZXZlcnkgYGZyb250bWF0dGVyTGlua3NgLCBgbGlua3NgIGFuZCBgZW1iZWRzYCBlbnRyeSBvZiBldmVyeSBjYWNoZWQgbm90ZSwgcGx1cyBldmVyeVxuICogcmVmZXJlbmNlIGVhY2ggYGxpbmtVcGRhdGVyc2AgZW50cnkgKHRoZSBjYW52YXMgb25lKSByZXBvcnRzIOKAlCB3aXRoIG9uZSBgZ2V0Rmlyc3RMaW5rcGF0aERlc3RgIHBlciByZWZlcmVuY2UsXG4gKiBrZWVwaW5nIHRob3NlIHRoYXQgcmVzb2x2ZSB0byBgZmlsZWAuIFRoYXQgaXMgfjExNSBtcyBhdCAxMDBrIHJlZmVyZW5jZXMgYW5kIH4zMjAgbXMgYXQgMjUwaywgcGFpZCBvbmNlIHBlciBmaWxlXG4gKiBieSBldmVyeSBwZXItZmlsZSBiYWNrbGluayBsb29rdXAsIHNvIGEgMTAwMC1ub3RlIGZvbGRlciByZW5hbWUgaW4gYSA1MGstbm90ZSB2YXVsdCB0b29rIDkyNCBzLlxuICpcbiAqIFdoYXQgbWFrZXMgYSBuYXJyb3dlciBhbnN3ZXIgZXhhY3QgaXMgYSBwcm9wZXJ0eSBvZiBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aERlc3RgOiBldmVyeSBicmFuY2ggb2YgaXQgY2FuIG9ubHlcbiAqIHJldHVybiBhIGZpbGUgd2hvc2UgbG93ZXJjYXNlZCBuYW1lIGlzIHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgdGhlIGxpbmtwYXRoLCBvciB0aGF0IHNlZ21lbnQgcGx1c1xuICogYC5tZGAuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHRoZSBlbXB0eSBsaW5rcGF0aCAoYFtbI0hlYWRpbmddXWApLCB3aGljaCByZXR1cm5zIHRoZSBzb3VyY2Ugbm90ZSBpdHNlbGYuIFNvIGFcbiAqIG5vdGUgY2FuIGhvbGQgYSByZWZlcmVuY2UgdG8gYGZpbGVgIG9ubHkgaWYgaXQgaG9sZHMgYSByZWZlcmVuY2Ugd2hvc2UgbGFzdCBzZWdtZW50IG1hdGNoZXMgb25lIG9mIGBmaWxlYCdzXG4gKiBuYW1lIGtleXMsIG9yIGlmIGl0IElTIGBmaWxlYC4gVGhpcyBtb2R1bGUgaW5kZXhlcyBub3RlcyBieSB0aG9zZSBzZWdtZW50cywgdGFrZXMgdGhlIGNhbmRpZGF0ZXMgZm9yIGBmaWxlYCxcbiAqIGFuZCBydW5zIE9ic2lkaWFuJ3Mgb3duIHByZWRpY2F0ZSDigJQgYGdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtwYXRoLCBzb3VyY2UpID09PSBmaWxlYCDigJQgb3ZlciB0aGUgY2FuZGlkYXRlcydcbiAqIHJlZmVyZW5jZXMgb25seS4gVGhlIGNhbmRpZGF0ZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIHJlYWwgYmFja2xpbmtzIGFuZCB0aGUgcHJlZGljYXRlIGlzIHRoZSBzYW1lIG9uZSwgc29cbiAqIHRoZSBhbnN3ZXIgaXMgdGhlIG9uZSB0aGUgZnVsbCB3YWxrIGdpdmVzLCBhIGZpbGUgcmVnaXN0ZXJlZCBhdCBhIG5vbi1leGlzdGluZyBwYXRoIGluY2x1ZGVkLiBPbmx5IHRoZSBPUkRFUlxuICogb2YgdGhlIG5vdGVzIGluIHRoZSBhbnN3ZXIgZGlmZmVyczogdGhlIGZpbGUgaXRzZWxmIGZpcnN0LCB0aGVuIHRoZSBjYW5kaWRhdGVzIGluIGluZGV4IG9yZGVyLlxuICpcbiAqIFRoZSBpbmRleCBpcyBrZXB0IGZyZXNoIHdpdGhvdXQgbGlzdGVuaW5nIHRvIGFueXRoaW5nLiBgbWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVgIG1hcHMgYSBub3RlIHRvIHRoZSBoYXNoIG9mXG4gKiBpdHMgY29udGVudCwgYW5kIHRoZSByZWZlcmVuY2VzIGFyZSBhIGZ1bmN0aW9uIG9mIHRoYXQgaGFzaCwgc28gZWFjaCBxdWVyeSBjb21wYXJlcyBldmVyeSBub3RlJ3MgaGFzaFxuICogYWdhaW5zdCB0aGUgb25lIGl0IHdhcyBpbmRleGVkIGF0IGFuZCByZS1yZWFkcyBvbmx5IHRoZSBub3RlcyB0aGF0IGNoYW5nZWQuIFRoYXQgaXMgb25lIHByb3BlcnR5IGNvbXBhcmlzb25cbiAqIHBlciBub3RlIGFuZCBubyByZXNvbHV0aW9uIGF0IGFsbCwgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHNjYW4gT2JzaWRpYW4gaXRzZWxmIHJ1bnMgb24gZXZlcnkgcmVuYW1lXG4gKiAoYHVwZGF0ZVJlbGF0ZWRMaW5rc2ApLiBEZXBlbmRpbmcgb24gbm8gZXZlbnQgYWxzbyBtZWFucyBkZXBlbmRpbmcgb24gbm8gZXZlbnQgT1JERVIsIHdoaWNoIG1hdHRlcnMgYmVjYXVzZVxuICogcmVuYW1lIGhhbmRsZXJzIHF1ZXJ5IGZyb20gaW5zaWRlIHRoZSB2YXVsdCBgcmVuYW1lYCBldmVudC5cbiAqXG4gKiBUaGVyZSBpcyBvbmUgaW5kZXggcGVyIHJlbmRlcmVyIHJlYWxtLCBoZWxkIGluIHRoZSByZWFsbS1nbG9iYWwgc2hhcmVkLXN0YXRlIGJhZywgc28gZXZlcnkgcGx1Z2luIGJ1bmRsaW5nIHRoaXMgbGlicmFyeVxuICogc2hhcmVzIGl0IHJhdGhlciB0aGFuIGVhY2ggYnVpbGRpbmcgaXRzIG93bi4gV2hhdCBpcyBzdG9yZWQgdGhlcmUgaXMgcGxhaW4gZGF0YSByZWFkIHN0cnVjdHVyYWxseSAobWFwcyBhbmRcbiAqIHNldHMsIG5ldmVyIGEgY2xhc3MgaW5zdGFuY2UpLCBiZWNhdXNlIHRoZSBiYWcgY3Jvc3NlcyBjb3BpZXMgb2YgdGhpcyBsaWJyYXJ5IGF0IGRpZmZlcmVudCB2ZXJzaW9ucy4gVGhlIGtleVxuICogY2FycmllcyBhIHZlcnNpb246IGEgY2hhbmdlIHRvIHdoYXQgYSBrZXkgTUVBTlMgKGhvdyBhIG5hbWUga2V5IGlzIGRlcml2ZWQpIG11c3QgbW92ZSB0byBhIG5ldyBrZXksIHNvIGFuIG9sZGVyXG4gKiBjb3B5IG5ldmVyIHJlYWRzIGFuIGluZGV4IGJ1aWx0IGJ5IGRpZmZlcmVudCBydWxlcy5cbiAqXG4gKiBUaGUgYGxpbmtVcGRhdGVyc2Agc2lkZSBpcyBzdGlsbCB3YWxrZWQgaW4gZnVsbCBvbiBldmVyeSBxdWVyeS4gSW4gMS4xNC4yIHRoZSBvbmx5IHVwZGF0ZXIgaXMgdGhlIGNhbnZhc1xuICogb25lLCB3aG9zZSByZWZlcmVuY2VzIGxpdmUgaW4gdGhlIGNhbnZhcyBpbmRleCByYXRoZXIgdGhhbiBpbiBgZmlsZUNhY2hlYCwgc28gdGhlcmUgaXMgbm8gaGFzaCB0byBrZXkgdGhlbVxuICogYnk7IGEgdmF1bHQncyBjYW52YXNlcyBob2xkIGEgc21hbGwgZnJhY3Rpb24gb2YgaXRzIHJlZmVyZW5jZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IEN1c3RvbUFycmF5RGljdEltcGwgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogVGhlIGNhbGxiYWNrIE9ic2lkaWFuJ3MgYG1ldGFkYXRhQ2FjaGUuaXRlcmF0ZUFsbFJlZnNgIHRha2VzLlxuICovXG5leHBvcnQgdHlwZSBJdGVyYXRlUmVmZXJlbmNlc0NhbGxiYWNrID0gUGFyYW1ldGVyczxBcHBbJ21ldGFkYXRhQ2FjaGUnXVsnaXRlcmF0ZUFsbFJlZnMnXT5bMF07XG5cbmludGVyZmFjZSBCYWNrbGlua0luZGV4RGF0YSB7XG4gIHJlYWRvbmx5IGluZGV4ZWRIYXNoZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IG5hbWVLZXlTb3VyY2VQYXRoczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+O1xuICByZWFkb25seSBzb3VyY2VQYXRoTmFtZUtleXM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pjtcbn1cblxuY29uc3QgTUFSS0RPV05fU1VGRklYID0gJy5tZCc7XG5cbi8qKlxuICogVGhlIHNhbWUgYW5zd2VyIGFzIGBhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpYCAoT2JzaWRpYW4ncyBvd24sIHVucGF0Y2hlZCksIGZyb20gdGhlIGNhbmRpZGF0ZVxuICogbm90ZXMgb25seS4gU2VlIHRoZSBmaWxlIGhlYWRlciBmb3Igd2h5IHRoZSBhbnN3ZXIgaXMgZXhhY3QuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHdob3NlIGJhY2tsaW5rcyB0byBmaW5kLiBJdCBtYXkgYmUgYSBub24tZXhpc3RpbmcgZmlsZSByZWdpc3RlcmVkIGZvciB0aGUgcXVlcnkuXG4gKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlcyB0aGF0IHJlc29sdmUgdG8gYGZpbGVgLCBrZXllZCBieSB0aGUgcGF0aCBvZiB0aGUgbm90ZSBvciBjYW52YXMgaG9sZGluZyB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG1ldGFkYXRhQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZTtcbiAgY29uc3QgYmFja2xpbmtzID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuXG4gIC8vIFRoZSBmaWxlIGl0c2VsZiBpcyBhIGNhbmRpZGF0ZSBmb3IgaXRzIG93biBgW1sjSGVhZGluZ11dYCByZWZlcmVuY2VzLCB3aG9zZSBlbXB0eSBsaW5rcGF0aCBuYW1lcyBubyBzZWdtZW50LlxuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlLm5hbWUpKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgY29sbGVjdChzb3VyY2VQYXRoLCByZWZlcmVuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbGlua1VwZGF0ZXIgb2YgT2JqZWN0LnZhbHVlcyhtZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY29sbGVjdCk7XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3Qoc291cmNlUGF0aDogc3RyaW5nLCByZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHZvaWQge1xuICAgIGlmIChtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGdldExpbmtwYXRoKHJlZmVyZW5jZS5saW5rKSwgc291cmNlUGF0aCkgPT09IGZpbGUpIHtcbiAgICAgIGJhY2tsaW5rcy5hZGQoc291cmNlUGF0aCwgcmVmZXJlbmNlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWaXNpdHMgdGhlIHJlZmVyZW5jZXMgYGFwcC5tZXRhZGF0YUNhY2hlLml0ZXJhdGVBbGxSZWZzYCB3b3VsZCB2aXNpdCwgbWludXMgZXZlcnkgcmVmZXJlbmNlIHdob3NlIHJlc29sdXRpb25cbiAqIGNhbm5vdCBjaGFuZ2Ugd2hlbiBgZmlsZWAgaXMgcmVuYW1lZCB0byBgbmV3UGF0aGAuXG4gKlxuICogT2JzaWRpYW4ncyBgRmlsZU1hbmFnZXIucnVuQXN5bmNMaW5rVXBkYXRlYCByZXNvbHZlcyBFVkVSWSByZWZlcmVuY2UgaW4gdGhlIHZhdWx0IGJlZm9yZSBlYWNoIHJlbmFtZSwgdG8gZGlmZlxuICogdGhlIHJlc29sdXRpb25zIGFmdGVyd2FyZHMgaW4gYHVwZGF0ZUFsbExpbmtzYDsgdGhhdCBpcyB0aGUgd2hvbGUgY29zdCBvZiBhIHJlbmFtZSBpbiBhIGxhcmdlIHZhdWx0LiBBIHJlZmVyZW5jZVxuICogY2FuIHJlc29sdmUgdG8gYGZpbGVgIG9ubHkgaWYgaXRzIGxpbmtwYXRoJ3MgbGFzdCBzZWdtZW50IG1hdGNoZXMgYGZpbGVgJ3MgbmFtZSBiZWZvcmUgdGhlIHJlbmFtZSBvciBpdHMgbmFtZVxuICogYWZ0ZXIgaXQgKHNlZSB0aGUgZmlsZSBoZWFkZXIpLCBhbmQgYSByZWZlcmVuY2UgdGhhdCByZXNvbHZlcyB0byBuZWl0aGVyIGtlZXBzIHJlc29sdmluZyB0byB3aGF0ZXZlciBpdCBkaWQuIFNvXG4gKiB0aGUgcmVmZXJlbmNlcyB0aGF0IGNhbiBjaGFuZ2UgYXJlIHRob3NlIG9mIHRoZSBpbmRleCdzIGNhbmRpZGF0ZXMgZm9yIGJvdGggbmFtZXMsIHBsdXMgdGhlIHJlZmVyZW5jZXMgaGVsZCBieVxuICogYGZpbGVgIGl0c2VsZiwgd2hvc2UgcmVsYXRpdmUgbGlua3MgcmVzb2x2ZSBmcm9tIGl0cyBuZXcgZm9sZGVyIGFmdGVyd2FyZHMuIGBsaW5rVXBkYXRlcnNgIHJlZmVyZW5jZXMgYXJlIHdhbGtlZFxuICogaW4gZnVsbCwgYXMgaW4ge0BsaW5rIGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlfS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgYmVpbmcgcmVuYW1lZCwgc3RpbGwgYXQgaXRzIG9sZCBwYXRoLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCBpdCBpcyBiZWluZyByZW5hbWVkIHRvLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHdpdGggZWFjaCByZWZlcmVuY2UgYW5kIHRoZSBwYXRoIG9mIHRoZSBub3RlIGhvbGRpbmcgaXQuIFJldHVybmluZyBgdHJ1ZWAgc3RvcHMgdGhlXG4gKiAgIHdhbGsgb3ZlciB0aGF0IG5vdGUncyByZWZlcmVuY2VzLCBhcyBpbiBPYnNpZGlhbidzIG93biB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVJlZmVyZW5jZXNBZmZlY3RlZEJ5UmVuYW1lKFxuICBhcHA6IEFwcCxcbiAgZmlsZTogVEZpbGUsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgY2FsbGJhY2s6IEl0ZXJhdGVSZWZlcmVuY2VzQ2FsbGJhY2tcbik6IHZvaWQge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG5ld05hbWUgPSBuZXdQYXRoLnNsaWNlKG5ld1BhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBbLi4uZ2V0VGFyZ2V0TmFtZUtleXMoZmlsZS5uYW1lKSwgLi4uZ2V0VGFyZ2V0TmFtZUtleXMobmV3TmFtZSldKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgaWYgKGNhbGxiYWNrKHNvdXJjZVBhdGgsIHJlZmVyZW5jZSkgPT09IHRydWUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBsaW5rVXBkYXRlciBvZiBPYmplY3QudmFsdWVzKGFwcC5tZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY2FsbGJhY2spO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJhY2tsaW5rSW5kZXhEYXRhKCk6IEJhY2tsaW5rSW5kZXhEYXRhIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8QmFja2xpbmtJbmRleERhdGE+KCdiYWNrbGlua0luZGV4VjEnLCB7XG4gICAgaW5kZXhlZEhhc2hlczogbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSxcbiAgICBuYW1lS2V5U291cmNlUGF0aHM6IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKSxcbiAgICBzb3VyY2VQYXRoTmFtZUtleXM6IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKVxuICB9KS52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENhY2hlZE1ldGFkYXRhKGFwcDogQXBwLCBzb3VyY2VQYXRoOiBzdHJpbmcpOiBDYWNoZWRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbc291cmNlUGF0aF0/Lmhhc2g7XG4gIHJldHVybiBoYXNoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2hhc2hdO1xufVxuXG4vKipcbiAqIExpc3RzIGEgY2FjaGVkIG5vdGUncyByZWZlcmVuY2VzIGluIHRoZSBvcmRlciBPYnNpZGlhbidzIG93biB3YWxrIHZpc2l0cyB0aGVtOiBgZnJvbnRtYXR0ZXJMaW5rc2AsIHRoZW5cbiAqIGBsaW5rc2AsIHRoZW4gYGVtYmVkc2AuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIG5vdGUncyBjYWNoZWQgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgbm90ZSdzIHJlZmVyZW5jZXMuXG4gKi9cbmZ1bmN0aW9uIGdldENhY2hlUmVmZXJlbmNlcyhjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCB1bmRlZmluZWQpOiBSZWZlcmVuY2VbXSB7XG4gIHJldHVybiBjYWNoZSA/IFsuLi5jYWNoZS5mcm9udG1hdHRlckxpbmtzID8/IFtdLCAuLi5jYWNoZS5saW5rcyA/PyBbXSwgLi4uY2FjaGUuZW1iZWRzID8/IFtdXSA6IFtdO1xufVxuXG4vKipcbiAqIFN0cmlwcyB0aGUgc3VicGF0aCBmcm9tIGEgbGluaywgdGhlIHdheSBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aGAgZG9lcy5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRleHQsIHN1Y2ggYXMgYGZvbGRlci9Ob3RlI0hlYWRpbmdgLlxuICogQHJldHVybnMgVGhlIGxpbmtwYXRoLCBzdWNoIGFzIGBmb2xkZXIvTm90ZWAuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtwYXRoKGxpbms6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2hJbmRleCA9IGxpbmsuaW5kZXhPZignIycpO1xuICByZXR1cm4gaGFzaEluZGV4ID09PSAtMSA/IGxpbmsgOiBsaW5rLnNsaWNlKDAsIGhhc2hJbmRleCk7XG59XG5cbi8qKlxuICogVGhlIGtleSBhIHJlZmVyZW5jZSBpcyBpbmRleGVkIHVuZGVyOiB0aGUgbG93ZXJjYXNlZCBsYXN0IGAvYCBzZWdtZW50IG9mIGl0cyBsaW5rcGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UncyBsaW5rIHRleHQuXG4gKiBAcmV0dXJucyBUaGUga2V5LlxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VOYW1lS2V5KGxpbms6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmtwYXRoID0gZ2V0TGlua3BhdGgobGluaykudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGxpbmtwYXRoLnNsaWNlKGxpbmtwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbn1cblxuLyoqXG4gKiBUaGUga2V5cyB1bmRlciB3aGljaCBhIHJlZmVyZW5jZSB0byBhIGZpbGUgd2l0aCB0aGlzIG5hbWUgY2FuIGJlIGluZGV4ZWQuIGBnZXRMaW5rcGF0aERlc3RgIG1hdGNoZXMgYVxuICogc2VnbWVudCBhZ2FpbnN0IHRoZSBmaWxlJ3MgbmFtZSwgYW5kIGFnYWluc3QgdGhlIG5hbWUgd2l0aCBgLm1kYCBhcHBlbmRlZCwgc28gYSBub3RlIG5hbWVkIGBOb3RlLm1kYCBpc1xuICogcmVhY2hhYmxlIGZyb20gYm90aCBgbm90ZS5tZGAgYW5kIGBub3RlYC5cbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWUgLSBUaGUgZmlsZSdzIG5hbWUsIGV4dGVuc2lvbiBpbmNsdWRlZC5cbiAqIEByZXR1cm5zIFRoZSBrZXlzLlxuICovXG5mdW5jdGlvbiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lS2V5ID0gZmlsZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5hbWVLZXkuZW5kc1dpdGgoTUFSS0RPV05fU1VGRklYKSA/IFtuYW1lS2V5LCBuYW1lS2V5LnNsaWNlKDAsIC1NQVJLRE9XTl9TVUZGSVgubGVuZ3RoKV0gOiBbbmFtZUtleV07XG59XG5cbmZ1bmN0aW9uIGluZGV4U291cmNlKGFwcDogQXBwLCBkYXRhOiBCYWNrbGlua0luZGV4RGF0YSwgc291cmNlUGF0aDogc3RyaW5nLCBoYXNoOiBzdHJpbmcpOiB2b2lkIHtcbiAgcmVtb3ZlU291cmNlKGRhdGEsIHNvdXJjZVBhdGgpO1xuICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbaGFzaF07XG4gIC8qXG4gICAqIEEgbm90ZSdzIGBmaWxlQ2FjaGVgIGVudHJ5IGNhbiBjYXJyeSBpdHMgbmV3IGhhc2ggYmVmb3JlIHRoZSBtZXRhZGF0YSBmb3IgdGhhdCBoYXNoIGlzIHN0b3JlZC4gUmVjb3JkaW5nXG4gICAqIHRoZSBoYXNoIHRoZW4gd291bGQgcGluIHRoZSBub3RlIGF0IFwibm8gcmVmZXJlbmNlc1wiIHVudGlsIGl0cyBjb250ZW50IGNoYW5nZWQgYWdhaW4sIHNvIGxlYXZlIGl0XG4gICAqIHVucmVjb3JkZWQgYW5kIGxldCB0aGUgbmV4dCBxdWVyeSBsb29rIGFnYWluLlxuICAgKi9cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5hbWVLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhjYWNoZSkpIHtcbiAgICBuYW1lS2V5cy5hZGQoZ2V0UmVmZXJlbmNlTmFtZUtleShyZWZlcmVuY2UubGluaykpO1xuICB9XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBuYW1lS2V5cykge1xuICAgIGxldCBzb3VyY2VQYXRocyA9IGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KTtcbiAgICBpZiAoIXNvdXJjZVBhdGhzKSB7XG4gICAgICBzb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuc2V0KG5hbWVLZXksIHNvdXJjZVBhdGhzKTtcbiAgICB9XG4gICAgc291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICB9XG4gIGRhdGEuc291cmNlUGF0aE5hbWVLZXlzLnNldChzb3VyY2VQYXRoLCBuYW1lS2V5cyk7XG4gIGRhdGEuaW5kZXhlZEhhc2hlcy5zZXQoc291cmNlUGF0aCwgaGFzaCk7XG59XG5cbi8qKlxuICogQnJpbmdzIHRoZSBpbmRleCBpbiBsaW5lIHdpdGggYG1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlYC4gSXQgcnVucyBvbiBldmVyeSBxdWVyeSwgc28gaXQgaXMgb25lIHBhc3Mgb3ZlclxuICogYGZpbGVDYWNoZWAgd2l0aCBubyBhbGxvY2F0aW9uIHBlciBub3RlIChhIHJlbmFtZSBpbiBhIGxhcmdlIHZhdWx0IHF1ZXJpZXMgc2V2ZXJhbCB0aW1lcyksIGFuZCB0aGUgcGFzcyBvdmVyIHRoZVxuICogaW5kZXggdGhhdCBmaW5kcyBub3RlcyBnb25lIGZyb20gYGZpbGVDYWNoZWAgcnVucyBvbmx5IHdoZW4gdGhhdCBmaXJzdCBwYXNzIGRpZCBub3Qgc2VlIGV2ZXJ5IGluZGV4ZWQgbm90ZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGluZGV4LlxuICovXG5mdW5jdGlvbiByZWZyZXNoKGFwcDogQXBwLCBkYXRhOiBCYWNrbGlua0luZGV4RGF0YSk6IHZvaWQge1xuICBjb25zdCBmaWxlQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGU7XG4gIGNvbnN0IGluZGV4ZWRDb3VudEJlZm9yZSA9IGRhdGEuaW5kZXhlZEhhc2hlcy5zaXplO1xuICBsZXQgc2VlbkluZGV4ZWRDb3VudCA9IDA7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pbiAtLSBgT2JqZWN0Lmhhc093bmAgYmVsb3cgaXMgdGhlIGd1YXJkOyBgZm9yLi4uaW5gIGF2b2lkcyBhbiBlbnRyeSBhcnJheSBwZXIgbm90ZS5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIGluIGZpbGVDYWNoZSkge1xuICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0Lmhhc093bihmaWxlQ2FjaGUsIHNvdXJjZVBhdGgpID8gZmlsZUNhY2hlW3NvdXJjZVBhdGhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpbmRleGVkSGFzaCA9IGRhdGEuaW5kZXhlZEhhc2hlcy5nZXQoc291cmNlUGF0aCk7XG4gICAgaWYgKGluZGV4ZWRIYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlZW5JbmRleGVkQ291bnQrKztcbiAgICB9XG4gICAgaWYgKGluZGV4ZWRIYXNoICE9PSBlbnRyeS5oYXNoKSB7XG4gICAgICBpbmRleFNvdXJjZShhcHAsIGRhdGEsIHNvdXJjZVBhdGgsIGVudHJ5Lmhhc2gpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzZWVuSW5kZXhlZENvdW50ID09PSBpbmRleGVkQ291bnRCZWZvcmUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMua2V5cygpKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGZpbGVDYWNoZSwgc291cmNlUGF0aCkpIHtcbiAgICAgIHJlbW92ZVNvdXJjZShkYXRhLCBzb3VyY2VQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlKGRhdGE6IEJhY2tsaW5rSW5kZXhEYXRhLCBzb3VyY2VQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lS2V5IG9mIGRhdGEuc291cmNlUGF0aE5hbWVLZXlzLmdldChzb3VyY2VQYXRoKSA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZVBhdGhzID0gZW5zdXJlTm9uTnVsbGFibGUoZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuZ2V0KG5hbWVLZXkpKTtcbiAgICBzb3VyY2VQYXRocy5kZWxldGUoc291cmNlUGF0aCk7XG4gICAgaWYgKHNvdXJjZVBhdGhzLnNpemUgPT09IDApIHtcbiAgICAgIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmRlbGV0ZShuYW1lS2V5KTtcbiAgICB9XG4gIH1cbiAgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMuZGVsZXRlKHNvdXJjZVBhdGgpO1xuICBkYXRhLmluZGV4ZWRIYXNoZXMuZGVsZXRlKHNvdXJjZVBhdGgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdEQSxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLDJCQUEyQjtBQUVwQyxTQUFTLDJCQUEyQjtBQWFwQyxNQUFNLGtCQUFrQjtBQVVqQixTQUFTLDJCQUEyQixLQUFVLE1BQXlDO0FBQzVGLFFBQU0sT0FBTyxxQkFBcUI7QUFDbEMsVUFBUSxLQUFLLElBQUk7QUFFakIsUUFBTSxnQkFBZ0IsSUFBSTtBQUMxQixRQUFNLFlBQVksSUFBSSxvQkFBK0I7QUFHckQsUUFBTSx1QkFBdUIsb0JBQUksSUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ3hELGFBQVcsV0FBVyxrQkFBa0IsS0FBSyxJQUFJLEdBQUc7QUFDbEQsZUFBVyxjQUFjLEtBQUssbUJBQW1CLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRztBQUNuRSwyQkFBcUIsSUFBSSxVQUFVO0FBQUEsSUFDckM7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
@@ -45,7 +45,7 @@ export declare const BUG_REPORT_ISSUE_FORM_TEMPLATE = "bug_report.yml";
45
45
  */
46
46
  export interface BugReportEnvironment {
47
47
  /**
48
- * The other enabled plugins, sorted by id.
48
+ * The other loaded plugins, sorted by id.
49
49
  */
50
50
  readonly enabledPlugins: readonly BugReportPluginInfo[];
51
51
  /**
@@ -56,7 +56,9 @@ async function getBugReportEnvironment(params) {
56
56
  const { app, pluginId } = params;
57
57
  const { installerVersion, operatingSystem } = await getAppAndOperatingSystem();
58
58
  return {
59
- enabledPlugins: [...app.plugins.enabledPlugins].filter((id) => id !== pluginId).sort().map((id) => getPluginInfo(app, id)),
59
+ // The loaded plugins, as Obsidian's Show debug info lists them: `enabledPlugins` also holds an id
60
+ // whose folder was deleted, or whose load failed.
61
+ enabledPlugins: Object.keys(app.plugins.plugins).filter((id) => id !== pluginId).sort().map((id) => getPluginInfo(app, id)),
60
62
  installerVersion,
61
63
  obsidianVersion: apiVersion,
62
64
  operatingSystem,
@@ -138,4 +140,4 @@ export {
138
140
  getBugReportIssueFormUrl,
139
141
  getGitHubIssueFormUrl
140
142
  };
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWctcmVwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciBhIHBsdWdpbidzIGJ1ZyByZXBvcnRzOiB0aGUgZW52aXJvbm1lbnQgYSByZXBvcnQgbmVlZHMsIGFuZCBhIGxpbmsgdG8gYSBHaXRIdWIgaXNzdWUgZm9ybVxuICogcHJlZmlsbGVkIHdpdGggaXQuXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0tbG9hZGFibGU6IHRoZSBkZXNrdG9wIG9wZXJhdGluZy1zeXN0ZW0gbG9va3VwIHJlYWRzIGBub2RlOm9zYCwgc28gaXQgaXMgaW1wb3J0ZWRcbiAqIGR5bmFtaWNhbGx5LCBvbiBkZXNrdG9wIG9ubHkuXG4gKlxuICogVGhlIGRlc2t0b3AgaW5zdGFsbGVyIHZlcnNpb24gaXMgYFBsYXRmb3JtLmJ1aWxkYCwgd2hpY2ggbm8gcHVibGljIHR5cGluZyBkZWNsYXJlczogT2JzaWRpYW4ncyBkZXNrdG9wXG4gKiBzdGFydHVwIHNldHMgaXQgZnJvbSBFbGVjdHJvbidzIGBhcHAuZ2V0VmVyc2lvbigpYCAocmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjBgKSwgc28gaXQgaXMgcmVhZFxuICogc3RydWN0dXJhbGx5IGhlcmUsIGFuZCByZWFkcyBhcyBgdW5rbm93bmAgaWYgYSBsYXRlciB2ZXJzaW9uIGRyb3BzIGl0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBhcGlWZXJzaW9uLFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE1vYmlsZUFwcEluZm8gfSBmcm9tICcuL21vYmlsZS1hcHAtaW5mby50cyc7XG5cbi8qKlxuICogVGhlIGlkcyBvZiB0aGUgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtJ3MgZmllbGRzIHRoYXQge0BsaW5rIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybH0gcHJlZmlsbHMuIEdpdEh1YlxuICogcHJlZmlsbHMgYSBmaWVsZCBmcm9tIGEgcXVlcnkgcGFyYW1ldGVyIG5hbWVkIGFmdGVyIHRoZSBmaWVsZCdzIGBpZGAsIHNvIGEgZm9ybSBtdXN0IGdpdmUgaXRzIGZpZWxkc1xuICogdGhlc2UgaWRzIGZvciB0aGVtIHRvIGJlIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGVudW0gQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgZW52aXJvbm1lbnQsIGFzIHtAbGluayBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudH0gcmVuZGVycyBpdC5cbiAgICovXG4gIEVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyxcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICBPYnNpZGlhblZlcnNpb24gPSAnb2JzaWRpYW4tdmVyc2lvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKi9cbiAgT3BlcmF0aW5nU3lzdGVtID0gJ29wZXJhdGluZy1zeXN0ZW0nLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbidzIHZlcnNpb24uXG4gICAqL1xuICBQbHVnaW5WZXJzaW9uID0gJ3BsdWdpbi12ZXJzaW9uJ1xufVxuXG4vKipcbiAqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICovXG5leHBvcnQgY29uc3QgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFID0gJ2J1Z19yZXBvcnQueW1sJztcblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydEVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBvdGhlciBlbmFibGVkIHBsdWdpbnMsIHNvcnRlZCBieSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWRQbHVnaW5zOiByZWFkb25seSBCdWdSZXBvcnRQbHVnaW5JbmZvW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnN0YWxsZWQgYXBwJ3MgdmVyc2lvbiwgd2hpY2ggY2FuIGxhZyBiZWhpbmQge0BsaW5rIG9ic2lkaWFuVmVyc2lvbn0uXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgbmFtZSBhbmQgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGluZ1N5c3RlbTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm06IGBBbmRyb2lkYCwgYGlPU2AsIGBtYWNPU2AsIGBXaW5kb3dzYCwgYExpbnV4YCBvciBgdW5rbm93bmAuXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogQnVnUmVwb3J0UGx1Z2luSW5mbztcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiwgYXMgYSBidWcgcmVwb3J0IG5hbWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydFBsdWdpbkluZm8ge1xuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGluc3RhbGxlZCB2ZXJzaW9uLCBvciBgbnVsbGAgd2hlbiBpdHMgbWFuaWZlc3QgaXMgbm90IGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogbnVsbCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Z1JlcG9ydEVudmlyb25tZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSByZXBvcnRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCdWdSZXBvcnRJc3N1ZUZvcm1VcmxQYXJhbXMgZXh0ZW5kcyBHZXRCdWdSZXBvcnRFbnZpcm9ubWVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgR2l0SHViIHJlcG9zaXRvcnksIGFzIGBvd25lci9uYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IGdpdEh1YlJlcG86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlzc3VlJ3MgdGl0bGUuIExlYXZlIGl0IG91dCB0byBrZWVwIHRoZSBmb3JtJ3Mgb3duIGRlZmF1bHQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0R2l0SHViSXNzdWVGb3JtVXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRHaXRIdWJJc3N1ZUZvcm1VcmxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhbHVlcyB0byBwcmVmaWxsLCBrZXllZCBieSBmaWVsZCBgaWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZmllbGRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SHViUmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSdzIGZpbGUgbmFtZSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlzc3VlJ3MgdGl0bGUuIExlYXZlIGl0IG91dCB0byBrZWVwIHRoZSBmb3JtJ3Mgb3duIGRlZmF1bHQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFwcEFuZE9wZXJhdGluZ1N5c3RlbSB7XG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQbGF0Zm9ybVdpdGhCdWlsZCB7XG4gIHJlYWRvbmx5IGJ1aWxkPzogdW5rbm93bjtcbn1cblxuY29uc3QgVU5LTk9XTiA9ICd1bmtub3duJztcblxuLyoqXG4gKiBSZW5kZXJzIGEgYnVnIHJlcG9ydCdzIGVudmlyb25tZW50IGFzIGEgTWFya2Rvd24gbGlzdC5cbiAqXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgLSBUaGUgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyBUaGUgTWFya2Rvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudChlbnZpcm9ubWVudDogQnVnUmVwb3J0RW52aXJvbm1lbnQpOiBzdHJpbmcge1xuICBjb25zdCBlbmFibGVkUGx1Z2lucyA9IGVudmlyb25tZW50LmVuYWJsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMFxuICAgID8gJ25vbmUnXG4gICAgOiBlbnZpcm9ubWVudC5lbmFibGVkUGx1Z2lucy5tYXAoKHBsdWdpbkluZm8pID0+IGZvcm1hdFBsdWdpbkluZm8ocGx1Z2luSW5mbykpLmpvaW4oJywgJyk7XG5cbiAgcmV0dXJuIGAtIFBsdWdpbjogJHtmb3JtYXRQbHVnaW5JbmZvKGVudmlyb25tZW50LnBsdWdpbil9XFxuYFxuICAgICsgYC0gT2JzaWRpYW46ICR7ZW52aXJvbm1lbnQub2JzaWRpYW5WZXJzaW9ufSAoaW5zdGFsbGVyICR7ZW52aXJvbm1lbnQuaW5zdGFsbGVyVmVyc2lvbn0pXFxuYFxuICAgICsgYC0gUGxhdGZvcm06ICR7ZW52aXJvbm1lbnQucGxhdGZvcm19XFxuYFxuICAgICsgYC0gT3BlcmF0aW5nIHN5c3RlbTogJHtlbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW19XFxuYFxuICAgICsgYC0gT3RoZXIgZW5hYmxlZCBwbHVnaW5zOiAke2VuYWJsZWRQbHVnaW5zfWA7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzOiB0aGUgcGx1Z2luJ3MgdmVyc2lvbiwgdGhlIG90aGVyIGVuYWJsZWQgcGx1Z2lucywgdGhlXG4gKiBPYnNpZGlhbiBhbmQgaW5zdGFsbGVyIHZlcnNpb25zLCB0aGUgcGxhdGZvcm0gYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Z1JlcG9ydEVudmlyb25tZW50KHBhcmFtczogR2V0QnVnUmVwb3J0RW52aXJvbm1lbnRQYXJhbXMpOiBQcm9taXNlPEJ1Z1JlcG9ydEVudmlyb25tZW50PiB7XG4gIGNvbnN0IHsgYXBwLCBwbHVnaW5JZCB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGluc3RhbGxlclZlcnNpb24sIG9wZXJhdGluZ1N5c3RlbSB9ID0gYXdhaXQgZ2V0QXBwQW5kT3BlcmF0aW5nU3lzdGVtKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkUGx1Z2luczogWy4uLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zXVxuICAgICAgLmZpbHRlcigoaWQpID0+IGlkICE9PSBwbHVnaW5JZClcbiAgICAgIC5zb3J0KClcbiAgICAgIC5tYXAoKGlkKSA9PiBnZXRQbHVnaW5JbmZvKGFwcCwgaWQpKSxcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG9ic2lkaWFuVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICBvcGVyYXRpbmdTeXN0ZW0sXG4gICAgcGxhdGZvcm06IGdldFBsYXRmb3JtTmFtZSgpLFxuICAgIHBsdWdpbjogZ2V0UGx1Z2luSW5mbyhhcHAsIHBsdWdpbklkKVxuICB9O1xufVxuXG4vKipcbiAqIEdldHMgYSBsaW5rIHRvIGEgcGx1Z2luJ3MgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtICh7QGxpbmsgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFfSksIHByZWZpbGxlZCB3aXRoXG4gKiB0aGUgZW52aXJvbm1lbnQsIGluIHRoZSBmaWVsZHMge0BsaW5rIEJ1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWR9IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsKHBhcmFtczogR2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBhd2FpdCBnZXRCdWdSZXBvcnRFbnZpcm9ubWVudChwYXJhbXMpO1xuXG4gIHJldHVybiBnZXRHaXRIdWJJc3N1ZUZvcm1Vcmwoe1xuICAgIGZpZWxkczoge1xuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuRW52aXJvbm1lbnRdOiBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudChlbnZpcm9ubWVudCksXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5PYnNpZGlhblZlcnNpb25dOiBlbnZpcm9ubWVudC5vYnNpZGlhblZlcnNpb24sXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5PcGVyYXRpbmdTeXN0ZW1dOiBlbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW0sXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5QbHVnaW5WZXJzaW9uXTogZW52aXJvbm1lbnQucGx1Z2luLnZlcnNpb24gPz8gVU5LTk9XTlxuICAgIH0sXG4gICAgZ2l0SHViUmVwbzogcGFyYW1zLmdpdEh1YlJlcG8sXG4gICAgdGVtcGxhdGU6IEJVR19SRVBPUlRfSVNTVUVfRk9STV9URU1QTEFURSxcbiAgICAuLi5wYXJhbXMudGl0bGUgIT09IHVuZGVmaW5lZCAmJiB7IHRpdGxlOiBwYXJhbXMudGl0bGUgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbGluayB0aGF0IG9wZW5zIGEgR2l0SHViIGlzc3VlIGZvcm0gd2l0aCBmaWVsZHMgcHJlZmlsbGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2l0SHViSXNzdWVGb3JtVXJsKHBhcmFtczogR2V0R2l0SHViSXNzdWVGb3JtVXJsUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHRlbXBsYXRlOiBwYXJhbXMudGVtcGxhdGUgfSk7XG4gIGlmIChwYXJhbXMudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHNlYXJjaFBhcmFtcy5zZXQoJ3RpdGxlJywgcGFyYW1zLnRpdGxlKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2ZpZWxkSWQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMuZmllbGRzID8/IHt9KSkge1xuICAgIHNlYXJjaFBhcmFtcy5zZXQoZmllbGRJZCwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHtwYXJhbXMuZ2l0SHViUmVwb30vaXNzdWVzL25ldz8ke3NlYXJjaFBhcmFtcy50b1N0cmluZygpfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBsdWdpbkluZm8ocGx1Z2luSW5mbzogQnVnUmVwb3J0UGx1Z2luSW5mbyk6IHN0cmluZyB7XG4gIHJldHVybiBgXFxgJHtwbHVnaW5JbmZvLmlkfVxcYCAke3BsdWdpbkluZm8udmVyc2lvbiA/PyBVTktOT1dOfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwcEFuZE9wZXJhdGluZ1N5c3RlbSgpOiBQcm9taXNlPEFwcEFuZE9wZXJhdGluZ1N5c3RlbT4ge1xuICBpZiAoUGxhdGZvcm0uaXNNb2JpbGVBcHApIHtcbiAgICBjb25zdCBtb2JpbGVBcHBJbmZvID0gYXdhaXQgZ2V0TW9iaWxlQXBwSW5mbygpO1xuICAgIHJldHVybiB7XG4gICAgICBpbnN0YWxsZXJWZXJzaW9uOiBtb2JpbGVBcHBJbmZvPy5pbnN0YWxsZXJWZXJzaW9uID8/IFVOS05PV04sXG4gICAgICBvcGVyYXRpbmdTeXN0ZW06IG1vYmlsZUFwcEluZm8/Lm9wZXJhdGluZ1N5c3RlbSA/PyBVTktOT1dOXG4gICAgfTtcbiAgfVxuXG4gIGlmICghUGxhdGZvcm0uaXNEZXNrdG9wQXBwKSB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVyVmVyc2lvbjogVU5LTk9XTiwgb3BlcmF0aW5nU3lzdGVtOiBVTktOT1dOIH07XG4gIH1cblxuICAvLyBDb25kaXRpb25hbCBpbXBvcnQgb2YgdGhlIGRlc2t0b3Atb25seSBsb29rdXAsIHdoaWNoIHJlYWRzIGBub2RlOm9zYDsgdGhpcyBicmFuY2ggcnVucyBvbmx5IG9uIGRlc2t0b3AuXG4gIGNvbnN0IHsgZ2V0RGVza3RvcE9wZXJhdGluZ1N5c3RlbSB9ID0gYXdhaXQgaW1wb3J0KCcuL2Rlc2t0b3Atb3BlcmF0aW5nLXN5c3RlbS50cycpO1xuICBjb25zdCBidWlsZCA9IChQbGF0Zm9ybSBhcyBQbGF0Zm9ybVdpdGhCdWlsZCkuYnVpbGQ7XG4gIHJldHVybiB7XG4gICAgaW5zdGFsbGVyVmVyc2lvbjogdHlwZW9mIGJ1aWxkID09PSAnc3RyaW5nJyA/IGJ1aWxkIDogVU5LTk9XTixcbiAgICBvcGVyYXRpbmdTeXN0ZW06IGdldERlc2t0b3BPcGVyYXRpbmdTeXN0ZW0oKVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQbGF0Zm9ybU5hbWUoKTogc3RyaW5nIHtcbiAgaWYgKFBsYXRmb3JtLmlzQW5kcm9pZEFwcCkge1xuICAgIHJldHVybiAnQW5kcm9pZCc7XG4gIH1cbiAgaWYgKFBsYXRmb3JtLmlzSW9zQXBwKSB7XG4gICAgcmV0dXJuICdpT1MnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc01hY09TKSB7XG4gICAgcmV0dXJuICdtYWNPUyc7XG4gIH1cbiAgaWYgKFBsYXRmb3JtLmlzV2luKSB7XG4gICAgcmV0dXJuICdXaW5kb3dzJztcbiAgfVxuICByZXR1cm4gUGxhdGZvcm0uaXNMaW51eCA/ICdMaW51eCcgOiBVTktOT1dOO1xufVxuXG5mdW5jdGlvbiBnZXRQbHVnaW5JbmZvKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogQnVnUmVwb3J0UGx1Z2luSW5mbyB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHBsdWdpbklkLFxuICAgIHZlcnNpb246IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb24gPz8gbnVsbFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsd0JBQXdCO0FBTzFCLElBQUssNEJBQUwsa0JBQUtBLCtCQUFMO0FBSUwsRUFBQUEsMkJBQUEsaUJBQWM7QUFLZCxFQUFBQSwyQkFBQSxxQkFBa0I7QUFLbEIsRUFBQUEsMkJBQUEscUJBQWtCO0FBS2xCLEVBQUFBLDJCQUFBLG1CQUFnQjtBQW5CTixTQUFBQTtBQUFBLEdBQUE7QUF5QkwsTUFBTSxpQ0FBaUM7QUFvSDlDLE1BQU0sVUFBVTtBQVFULFNBQVMsMkJBQTJCLGFBQTJDO0FBQ3BGLFFBQU0saUJBQWlCLFlBQVksZUFBZSxXQUFXLElBQ3pELFNBQ0EsWUFBWSxlQUFlLElBQUksQ0FBQyxlQUFlLGlCQUFpQixVQUFVLENBQUMsRUFBRSxLQUFLLElBQUk7QUFFMUYsU0FBTyxhQUFhLGlCQUFpQixZQUFZLE1BQU0sQ0FBQztBQUFBLGNBQ3JDLFlBQVksZUFBZSxlQUFlLFlBQVksZ0JBQWdCO0FBQUEsY0FDdEUsWUFBWSxRQUFRO0FBQUEsc0JBQ1osWUFBWSxlQUFlO0FBQUEsMkJBQ3RCLGNBQWM7QUFDaEQ7QUFTQSxlQUFzQix3QkFBd0IsUUFBc0U7QUFDbEgsUUFBTSxFQUFFLEtBQUssU0FBUyxJQUFJO0FBQzFCLFFBQU0sRUFBRSxrQkFBa0IsZ0JBQWdCLElBQUksTUFBTSx5QkFBeUI7QUFFN0UsU0FBTztBQUFBLElBQ0wsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLFFBQVEsY0FBYyxFQUMzQyxPQUFPLENBQUMsT0FBTyxPQUFPLFFBQVEsRUFDOUIsS0FBSyxFQUNMLElBQUksQ0FBQyxPQUFPLGNBQWMsS0FBSyxFQUFFLENBQUM7QUFBQSxJQUNyQztBQUFBLElBQ0EsaUJBQWlCO0FBQUEsSUFDakI7QUFBQSxJQUNBLFVBQVUsZ0JBQWdCO0FBQUEsSUFDMUIsUUFBUSxjQUFjLEtBQUssUUFBUTtBQUFBLEVBQ3JDO0FBQ0Y7QUFTQSxlQUFzQix5QkFBeUIsUUFBeUQ7QUFDdEcsUUFBTSxjQUFjLE1BQU0sd0JBQXdCLE1BQU07QUFFeEQsU0FBTyxzQkFBc0I7QUFBQSxJQUMzQixRQUFRO0FBQUEsTUFDTixDQUFDLCtCQUFxQyxHQUFHLDJCQUEyQixXQUFXO0FBQUEsTUFDL0UsQ0FBQyx3Q0FBeUMsR0FBRyxZQUFZO0FBQUEsTUFDekQsQ0FBQyx3Q0FBeUMsR0FBRyxZQUFZO0FBQUEsTUFDekQsQ0FBQyxvQ0FBdUMsR0FBRyxZQUFZLE9BQU8sV0FBVztBQUFBLElBQzNFO0FBQUEsSUFDQSxZQUFZLE9BQU87QUFBQSxJQUNuQixVQUFVO0FBQUEsSUFDVixHQUFHLE9BQU8sVUFBVSxVQUFhLEVBQUUsT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6RCxDQUFDO0FBQ0g7QUFRTyxTQUFTLHNCQUFzQixRQUE2QztBQUNqRixRQUFNLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxVQUFVLE9BQU8sU0FBUyxDQUFDO0FBQ3RFLE1BQUksT0FBTyxVQUFVLFFBQVc7QUFDOUIsaUJBQWEsSUFBSSxTQUFTLE9BQU8sS0FBSztBQUFBLEVBQ3hDO0FBRUEsYUFBVyxDQUFDLFNBQVMsS0FBSyxLQUFLLE9BQU8sUUFBUSxPQUFPLFVBQVUsQ0FBQyxDQUFDLEdBQUc7QUFDbEUsaUJBQWEsSUFBSSxTQUFTLEtBQUs7QUFBQSxFQUNqQztBQUVBLFNBQU8sc0JBQXNCLE9BQU8sVUFBVSxlQUFlLGFBQWEsU0FBUyxDQUFDO0FBQ3RGO0FBRUEsU0FBUyxpQkFBaUIsWUFBeUM7QUFDakUsU0FBTyxLQUFLLFdBQVcsRUFBRSxNQUFNLFdBQVcsV0FBVyxPQUFPO0FBQzlEO0FBRUEsZUFBZSwyQkFBMkQ7QUFDeEUsTUFBSSxTQUFTLGFBQWE7QUFDeEIsVUFBTSxnQkFBZ0IsTUFBTSxpQkFBaUI7QUFDN0MsV0FBTztBQUFBLE1BQ0wsa0JBQWtCLGVBQWUsb0JBQW9CO0FBQUEsTUFDckQsaUJBQWlCLGVBQWUsbUJBQW1CO0FBQUEsSUFDckQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLFNBQVMsY0FBYztBQUMxQixXQUFPLEVBQUUsa0JBQWtCLFNBQVMsaUJBQWlCLFFBQVE7QUFBQSxFQUMvRDtBQUdBLFFBQU0sRUFBRSwwQkFBMEIsSUFBSSxNQUFNLE9BQU8sK0JBQStCO0FBQ2xGLFFBQU0sUUFBUyxTQUErQjtBQUM5QyxTQUFPO0FBQUEsSUFDTCxrQkFBa0IsT0FBTyxVQUFVLFdBQVcsUUFBUTtBQUFBLElBQ3RELGlCQUFpQiwwQkFBMEI7QUFBQSxFQUM3QztBQUNGO0FBRUEsU0FBUyxrQkFBMEI7QUFDakMsTUFBSSxTQUFTLGNBQWM7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLFNBQVMsVUFBVTtBQUNyQixXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksU0FBUyxTQUFTO0FBQ3BCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFTLE9BQU87QUFDbEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLFNBQVMsVUFBVSxVQUFVO0FBQ3RDO0FBRUEsU0FBUyxjQUFjLEtBQVUsVUFBdUM7QUFDdEUsU0FBTztBQUFBLElBQ0wsSUFBSTtBQUFBLElBQ0osU0FBUyxJQUFJLFFBQVEsVUFBVSxRQUFRLEdBQUcsV0FBVztBQUFBLEVBQ3ZEO0FBQ0Y7IiwibmFtZXMiOlsiQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCJdfQ==
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWctcmVwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciBhIHBsdWdpbidzIGJ1ZyByZXBvcnRzOiB0aGUgZW52aXJvbm1lbnQgYSByZXBvcnQgbmVlZHMsIGFuZCBhIGxpbmsgdG8gYSBHaXRIdWIgaXNzdWUgZm9ybVxuICogcHJlZmlsbGVkIHdpdGggaXQuXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0tbG9hZGFibGU6IHRoZSBkZXNrdG9wIG9wZXJhdGluZy1zeXN0ZW0gbG9va3VwIHJlYWRzIGBub2RlOm9zYCwgc28gaXQgaXMgaW1wb3J0ZWRcbiAqIGR5bmFtaWNhbGx5LCBvbiBkZXNrdG9wIG9ubHkuXG4gKlxuICogVGhlIGRlc2t0b3AgaW5zdGFsbGVyIHZlcnNpb24gaXMgYFBsYXRmb3JtLmJ1aWxkYCwgd2hpY2ggbm8gcHVibGljIHR5cGluZyBkZWNsYXJlczogT2JzaWRpYW4ncyBkZXNrdG9wXG4gKiBzdGFydHVwIHNldHMgaXQgZnJvbSBFbGVjdHJvbidzIGBhcHAuZ2V0VmVyc2lvbigpYCAocmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjBgKSwgc28gaXQgaXMgcmVhZFxuICogc3RydWN0dXJhbGx5IGhlcmUsIGFuZCByZWFkcyBhcyBgdW5rbm93bmAgaWYgYSBsYXRlciB2ZXJzaW9uIGRyb3BzIGl0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBhcGlWZXJzaW9uLFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE1vYmlsZUFwcEluZm8gfSBmcm9tICcuL21vYmlsZS1hcHAtaW5mby50cyc7XG5cbi8qKlxuICogVGhlIGlkcyBvZiB0aGUgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtJ3MgZmllbGRzIHRoYXQge0BsaW5rIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybH0gcHJlZmlsbHMuIEdpdEh1YlxuICogcHJlZmlsbHMgYSBmaWVsZCBmcm9tIGEgcXVlcnkgcGFyYW1ldGVyIG5hbWVkIGFmdGVyIHRoZSBmaWVsZCdzIGBpZGAsIHNvIGEgZm9ybSBtdXN0IGdpdmUgaXRzIGZpZWxkc1xuICogdGhlc2UgaWRzIGZvciB0aGVtIHRvIGJlIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGVudW0gQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgZW52aXJvbm1lbnQsIGFzIHtAbGluayBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudH0gcmVuZGVycyBpdC5cbiAgICovXG4gIEVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyxcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICBPYnNpZGlhblZlcnNpb24gPSAnb2JzaWRpYW4tdmVyc2lvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKi9cbiAgT3BlcmF0aW5nU3lzdGVtID0gJ29wZXJhdGluZy1zeXN0ZW0nLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbidzIHZlcnNpb24uXG4gICAqL1xuICBQbHVnaW5WZXJzaW9uID0gJ3BsdWdpbi12ZXJzaW9uJ1xufVxuXG4vKipcbiAqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICovXG5leHBvcnQgY29uc3QgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFID0gJ2J1Z19yZXBvcnQueW1sJztcblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydEVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBvdGhlciBsb2FkZWQgcGx1Z2lucywgc29ydGVkIGJ5IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZFBsdWdpbnM6IHJlYWRvbmx5IEJ1Z1JlcG9ydFBsdWdpbkluZm9bXTtcblxuICAvKipcbiAgICogVGhlIGluc3RhbGxlZCBhcHAncyB2ZXJzaW9uLCB3aGljaCBjYW4gbGFnIGJlaGluZCB7QGxpbmsgb2JzaWRpYW5WZXJzaW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBuYW1lIGFuZCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF0Zm9ybTogYEFuZHJvaWRgLCBgaU9TYCwgYG1hY09TYCwgYFdpbmRvd3NgLCBgTGludXhgIG9yIGB1bmtub3duYC5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvcnRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBCdWdSZXBvcnRQbHVnaW5JbmZvO1xufVxuXG4vKipcbiAqIEEgcGx1Z2luLCBhcyBhIGJ1ZyByZXBvcnQgbmFtZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVnUmVwb3J0UGx1Z2luSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgaW5zdGFsbGVkIHZlcnNpb24sIG9yIGBudWxsYCB3aGVuIGl0cyBtYW5pZmVzdCBpcyBub3Qga25vd24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCdWdSZXBvcnRFbnZpcm9ubWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QnVnUmVwb3J0RW52aXJvbm1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHJlcG9ydGluZyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCdWdSZXBvcnRJc3N1ZUZvcm1Vcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybFBhcmFtcyBleHRlbmRzIEdldEJ1Z1JlcG9ydEVudmlyb25tZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4ncyBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SHViUmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaXNzdWUncyB0aXRsZS4gTGVhdmUgaXQgb3V0IHRvIGtlZXAgdGhlIGZvcm0ncyBvd24gZGVmYXVsdCB0aXRsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRHaXRIdWJJc3N1ZUZvcm1Vcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEdpdEh1Yklzc3VlRm9ybVVybFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWVzIHRvIHByZWZpbGwsIGtleWVkIGJ5IGZpZWxkIGBpZGAuXG4gICAqL1xuICByZWFkb25seSBmaWVsZHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiByZXBvc2l0b3J5LCBhcyBgb3duZXIvbmFtZWAuXG4gICAqL1xuICByZWFkb25seSBnaXRIdWJSZXBvOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtJ3MgZmlsZSBuYW1lLCB1bmRlciBgLmdpdGh1Yi9JU1NVRV9URU1QTEFURWAuXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaXNzdWUncyB0aXRsZS4gTGVhdmUgaXQgb3V0IHRvIGtlZXAgdGhlIGZvcm0ncyBvd24gZGVmYXVsdCB0aXRsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwQW5kT3BlcmF0aW5nU3lzdGVtIHtcbiAgcmVhZG9ubHkgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBvcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsYXRmb3JtV2l0aEJ1aWxkIHtcbiAgcmVhZG9ubHkgYnVpbGQ/OiB1bmtub3duO1xufVxuXG5jb25zdCBVTktOT1dOID0gJ3Vua25vd24nO1xuXG4vKipcbiAqIFJlbmRlcnMgYSBidWcgcmVwb3J0J3MgZW52aXJvbm1lbnQgYXMgYSBNYXJrZG93biBsaXN0LlxuICpcbiAqIEBwYXJhbSBlbnZpcm9ubWVudCAtIFRoZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIFRoZSBNYXJrZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ1Z1JlcG9ydEVudmlyb25tZW50KGVudmlyb25tZW50OiBCdWdSZXBvcnRFbnZpcm9ubWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IGVuYWJsZWRQbHVnaW5zID0gZW52aXJvbm1lbnQuZW5hYmxlZFBsdWdpbnMubGVuZ3RoID09PSAwXG4gICAgPyAnbm9uZSdcbiAgICA6IGVudmlyb25tZW50LmVuYWJsZWRQbHVnaW5zLm1hcCgocGx1Z2luSW5mbykgPT4gZm9ybWF0UGx1Z2luSW5mbyhwbHVnaW5JbmZvKSkuam9pbignLCAnKTtcblxuICByZXR1cm4gYC0gUGx1Z2luOiAke2Zvcm1hdFBsdWdpbkluZm8oZW52aXJvbm1lbnQucGx1Z2luKX1cXG5gXG4gICAgKyBgLSBPYnNpZGlhbjogJHtlbnZpcm9ubWVudC5vYnNpZGlhblZlcnNpb259IChpbnN0YWxsZXIgJHtlbnZpcm9ubWVudC5pbnN0YWxsZXJWZXJzaW9ufSlcXG5gXG4gICAgKyBgLSBQbGF0Zm9ybTogJHtlbnZpcm9ubWVudC5wbGF0Zm9ybX1cXG5gXG4gICAgKyBgLSBPcGVyYXRpbmcgc3lzdGVtOiAke2Vudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbX1cXG5gXG4gICAgKyBgLSBPdGhlciBlbmFibGVkIHBsdWdpbnM6ICR7ZW5hYmxlZFBsdWdpbnN9YDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBlbnZpcm9ubWVudCBhIGJ1ZyByZXBvcnQgbmVlZHM6IHRoZSBwbHVnaW4ncyB2ZXJzaW9uLCB0aGUgb3RoZXIgZW5hYmxlZCBwbHVnaW5zLCB0aGVcbiAqIE9ic2lkaWFuIGFuZCBpbnN0YWxsZXIgdmVyc2lvbnMsIHRoZSBwbGF0Zm9ybSBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnQocGFyYW1zOiBHZXRCdWdSZXBvcnRFbnZpcm9ubWVudFBhcmFtcyk6IFByb21pc2U8QnVnUmVwb3J0RW52aXJvbm1lbnQ+IHtcbiAgY29uc3QgeyBhcHAsIHBsdWdpbklkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgaW5zdGFsbGVyVmVyc2lvbiwgb3BlcmF0aW5nU3lzdGVtIH0gPSBhd2FpdCBnZXRBcHBBbmRPcGVyYXRpbmdTeXN0ZW0oKTtcblxuICByZXR1cm4ge1xuICAgIC8vIFRoZSBsb2FkZWQgcGx1Z2lucywgYXMgT2JzaWRpYW4ncyBTaG93IGRlYnVnIGluZm8gbGlzdHMgdGhlbTogYGVuYWJsZWRQbHVnaW5zYCBhbHNvIGhvbGRzIGFuIGlkXG4gICAgLy8gd2hvc2UgZm9sZGVyIHdhcyBkZWxldGVkLCBvciB3aG9zZSBsb2FkIGZhaWxlZC5cbiAgICBlbmFibGVkUGx1Z2luczogT2JqZWN0LmtleXMoYXBwLnBsdWdpbnMucGx1Z2lucylcbiAgICAgIC5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gcGx1Z2luSWQpXG4gICAgICAuc29ydCgpXG4gICAgICAubWFwKChpZCkgPT4gZ2V0UGx1Z2luSW5mbyhhcHAsIGlkKSksXG4gICAgaW5zdGFsbGVyVmVyc2lvbixcbiAgICBvYnNpZGlhblZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgb3BlcmF0aW5nU3lzdGVtLFxuICAgIHBsYXRmb3JtOiBnZXRQbGF0Zm9ybU5hbWUoKSxcbiAgICBwbHVnaW46IGdldFBsdWdpbkluZm8oYXBwLCBwbHVnaW5JZClcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbGluayB0byBhIHBsdWdpbidzIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSAoe0BsaW5rIEJVR19SRVBPUlRfSVNTVUVfRk9STV9URU1QTEFURX0pLCBwcmVmaWxsZWQgd2l0aFxuICogdGhlIGVudmlyb25tZW50LCBpbiB0aGUgZmllbGRzIHtAbGluayBCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkfSBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgbGluay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybChwYXJhbXM6IEdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gYXdhaXQgZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnQocGFyYW1zKTtcblxuICByZXR1cm4gZ2V0R2l0SHViSXNzdWVGb3JtVXJsKHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIFtCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkLkVudmlyb25tZW50XTogZm9ybWF0QnVnUmVwb3J0RW52aXJvbm1lbnQoZW52aXJvbm1lbnQpLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuT2JzaWRpYW5WZXJzaW9uXTogZW52aXJvbm1lbnQub2JzaWRpYW5WZXJzaW9uLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuT3BlcmF0aW5nU3lzdGVtXTogZW52aXJvbm1lbnQub3BlcmF0aW5nU3lzdGVtLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuUGx1Z2luVmVyc2lvbl06IGVudmlyb25tZW50LnBsdWdpbi52ZXJzaW9uID8/IFVOS05PV05cbiAgICB9LFxuICAgIGdpdEh1YlJlcG86IHBhcmFtcy5naXRIdWJSZXBvLFxuICAgIHRlbXBsYXRlOiBCVUdfUkVQT1JUX0lTU1VFX0ZPUk1fVEVNUExBVEUsXG4gICAgLi4ucGFyYW1zLnRpdGxlICE9PSB1bmRlZmluZWQgJiYgeyB0aXRsZTogcGFyYW1zLnRpdGxlIH1cbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyBhIGxpbmsgdGhhdCBvcGVucyBhIEdpdEh1YiBpc3N1ZSBmb3JtIHdpdGggZmllbGRzIHByZWZpbGxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdpdEh1Yklzc3VlRm9ybVVybChwYXJhbXM6IEdldEdpdEh1Yklzc3VlRm9ybVVybFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB0ZW1wbGF0ZTogcGFyYW1zLnRlbXBsYXRlIH0pO1xuICBpZiAocGFyYW1zLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZWFyY2hQYXJhbXMuc2V0KCd0aXRsZScsIHBhcmFtcy50aXRsZSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtmaWVsZElkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zLmZpZWxkcyA/PyB7fSkpIHtcbiAgICBzZWFyY2hQYXJhbXMuc2V0KGZpZWxkSWQsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBgaHR0cHM6Ly9naXRodWIuY29tLyR7cGFyYW1zLmdpdEh1YlJlcG99L2lzc3Vlcy9uZXc/JHtzZWFyY2hQYXJhbXMudG9TdHJpbmcoKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQbHVnaW5JbmZvKHBsdWdpbkluZm86IEJ1Z1JlcG9ydFBsdWdpbkluZm8pOiBzdHJpbmcge1xuICByZXR1cm4gYFxcYCR7cGx1Z2luSW5mby5pZH1cXGAgJHtwbHVnaW5JbmZvLnZlcnNpb24gPz8gVU5LTk9XTn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHBBbmRPcGVyYXRpbmdTeXN0ZW0oKTogUHJvbWlzZTxBcHBBbmRPcGVyYXRpbmdTeXN0ZW0+IHtcbiAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlQXBwKSB7XG4gICAgY29uc3QgbW9iaWxlQXBwSW5mbyA9IGF3YWl0IGdldE1vYmlsZUFwcEluZm8oKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogbW9iaWxlQXBwSW5mbz8uaW5zdGFsbGVyVmVyc2lvbiA/PyBVTktOT1dOLFxuICAgICAgb3BlcmF0aW5nU3lzdGVtOiBtb2JpbGVBcHBJbmZvPy5vcGVyYXRpbmdTeXN0ZW0gPz8gVU5LTk9XTlxuICAgIH07XG4gIH1cblxuICBpZiAoIVBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgIHJldHVybiB7IGluc3RhbGxlclZlcnNpb246IFVOS05PV04sIG9wZXJhdGluZ1N5c3RlbTogVU5LTk9XTiB9O1xuICB9XG5cbiAgLy8gQ29uZGl0aW9uYWwgaW1wb3J0IG9mIHRoZSBkZXNrdG9wLW9ubHkgbG9va3VwLCB3aGljaCByZWFkcyBgbm9kZTpvc2A7IHRoaXMgYnJhbmNoIHJ1bnMgb25seSBvbiBkZXNrdG9wLlxuICBjb25zdCB7IGdldERlc2t0b3BPcGVyYXRpbmdTeXN0ZW0gfSA9IGF3YWl0IGltcG9ydCgnLi9kZXNrdG9wLW9wZXJhdGluZy1zeXN0ZW0udHMnKTtcbiAgY29uc3QgYnVpbGQgPSAoUGxhdGZvcm0gYXMgUGxhdGZvcm1XaXRoQnVpbGQpLmJ1aWxkO1xuICByZXR1cm4ge1xuICAgIGluc3RhbGxlclZlcnNpb246IHR5cGVvZiBidWlsZCA9PT0gJ3N0cmluZycgPyBidWlsZCA6IFVOS05PV04sXG4gICAgb3BlcmF0aW5nU3lzdGVtOiBnZXREZXNrdG9wT3BlcmF0aW5nU3lzdGVtKClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UGxhdGZvcm1OYW1lKCk6IHN0cmluZyB7XG4gIGlmIChQbGF0Zm9ybS5pc0FuZHJvaWRBcHApIHtcbiAgICByZXR1cm4gJ0FuZHJvaWQnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc0lvc0FwcCkge1xuICAgIHJldHVybiAnaU9TJztcbiAgfVxuICBpZiAoUGxhdGZvcm0uaXNNYWNPUykge1xuICAgIHJldHVybiAnbWFjT1MnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc1dpbikge1xuICAgIHJldHVybiAnV2luZG93cyc7XG4gIH1cbiAgcmV0dXJuIFBsYXRmb3JtLmlzTGludXggPyAnTGludXgnIDogVU5LTk9XTjtcbn1cblxuZnVuY3Rpb24gZ2V0UGx1Z2luSW5mbyhhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyk6IEJ1Z1JlcG9ydFBsdWdpbkluZm8ge1xuICByZXR1cm4ge1xuICAgIGlkOiBwbHVnaW5JZCxcbiAgICB2ZXJzaW9uOiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy52ZXJzaW9uID8/IG51bGxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHdCQUF3QjtBQU8xQixJQUFLLDRCQUFMLGtCQUFLQSwrQkFBTDtBQUlMLEVBQUFBLDJCQUFBLGlCQUFjO0FBS2QsRUFBQUEsMkJBQUEscUJBQWtCO0FBS2xCLEVBQUFBLDJCQUFBLHFCQUFrQjtBQUtsQixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFuQk4sU0FBQUE7QUFBQSxHQUFBO0FBeUJMLE1BQU0saUNBQWlDO0FBb0g5QyxNQUFNLFVBQVU7QUFRVCxTQUFTLDJCQUEyQixhQUEyQztBQUNwRixRQUFNLGlCQUFpQixZQUFZLGVBQWUsV0FBVyxJQUN6RCxTQUNBLFlBQVksZUFBZSxJQUFJLENBQUMsZUFBZSxpQkFBaUIsVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJO0FBRTFGLFNBQU8sYUFBYSxpQkFBaUIsWUFBWSxNQUFNLENBQUM7QUFBQSxjQUNyQyxZQUFZLGVBQWUsZUFBZSxZQUFZLGdCQUFnQjtBQUFBLGNBQ3RFLFlBQVksUUFBUTtBQUFBLHNCQUNaLFlBQVksZUFBZTtBQUFBLDJCQUN0QixjQUFjO0FBQ2hEO0FBU0EsZUFBc0Isd0JBQXdCLFFBQXNFO0FBQ2xILFFBQU0sRUFBRSxLQUFLLFNBQVMsSUFBSTtBQUMxQixRQUFNLEVBQUUsa0JBQWtCLGdCQUFnQixJQUFJLE1BQU0seUJBQXlCO0FBRTdFLFNBQU87QUFBQTtBQUFBO0FBQUEsSUFHTCxnQkFBZ0IsT0FBTyxLQUFLLElBQUksUUFBUSxPQUFPLEVBQzVDLE9BQU8sQ0FBQyxPQUFPLE9BQU8sUUFBUSxFQUM5QixLQUFLLEVBQ0wsSUFBSSxDQUFDLE9BQU8sY0FBYyxLQUFLLEVBQUUsQ0FBQztBQUFBLElBQ3JDO0FBQUEsSUFDQSxpQkFBaUI7QUFBQSxJQUNqQjtBQUFBLElBQ0EsVUFBVSxnQkFBZ0I7QUFBQSxJQUMxQixRQUFRLGNBQWMsS0FBSyxRQUFRO0FBQUEsRUFDckM7QUFDRjtBQVNBLGVBQXNCLHlCQUF5QixRQUF5RDtBQUN0RyxRQUFNLGNBQWMsTUFBTSx3QkFBd0IsTUFBTTtBQUV4RCxTQUFPLHNCQUFzQjtBQUFBLElBQzNCLFFBQVE7QUFBQSxNQUNOLENBQUMsK0JBQXFDLEdBQUcsMkJBQTJCLFdBQVc7QUFBQSxNQUMvRSxDQUFDLHdDQUF5QyxHQUFHLFlBQVk7QUFBQSxNQUN6RCxDQUFDLHdDQUF5QyxHQUFHLFlBQVk7QUFBQSxNQUN6RCxDQUFDLG9DQUF1QyxHQUFHLFlBQVksT0FBTyxXQUFXO0FBQUEsSUFDM0U7QUFBQSxJQUNBLFlBQVksT0FBTztBQUFBLElBQ25CLFVBQVU7QUFBQSxJQUNWLEdBQUcsT0FBTyxVQUFVLFVBQWEsRUFBRSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pELENBQUM7QUFDSDtBQVFPLFNBQVMsc0JBQXNCLFFBQTZDO0FBQ2pGLFFBQU0sZUFBZSxJQUFJLGdCQUFnQixFQUFFLFVBQVUsT0FBTyxTQUFTLENBQUM7QUFDdEUsTUFBSSxPQUFPLFVBQVUsUUFBVztBQUM5QixpQkFBYSxJQUFJLFNBQVMsT0FBTyxLQUFLO0FBQUEsRUFDeEM7QUFFQSxhQUFXLENBQUMsU0FBUyxLQUFLLEtBQUssT0FBTyxRQUFRLE9BQU8sVUFBVSxDQUFDLENBQUMsR0FBRztBQUNsRSxpQkFBYSxJQUFJLFNBQVMsS0FBSztBQUFBLEVBQ2pDO0FBRUEsU0FBTyxzQkFBc0IsT0FBTyxVQUFVLGVBQWUsYUFBYSxTQUFTLENBQUM7QUFDdEY7QUFFQSxTQUFTLGlCQUFpQixZQUF5QztBQUNqRSxTQUFPLEtBQUssV0FBVyxFQUFFLE1BQU0sV0FBVyxXQUFXLE9BQU87QUFDOUQ7QUFFQSxlQUFlLDJCQUEyRDtBQUN4RSxNQUFJLFNBQVMsYUFBYTtBQUN4QixVQUFNLGdCQUFnQixNQUFNLGlCQUFpQjtBQUM3QyxXQUFPO0FBQUEsTUFDTCxrQkFBa0IsZUFBZSxvQkFBb0I7QUFBQSxNQUNyRCxpQkFBaUIsZUFBZSxtQkFBbUI7QUFBQSxJQUNyRDtBQUFBLEVBQ0Y7QUFFQSxNQUFJLENBQUMsU0FBUyxjQUFjO0FBQzFCLFdBQU8sRUFBRSxrQkFBa0IsU0FBUyxpQkFBaUIsUUFBUTtBQUFBLEVBQy9EO0FBR0EsUUFBTSxFQUFFLDBCQUEwQixJQUFJLE1BQU0sT0FBTywrQkFBK0I7QUFDbEYsUUFBTSxRQUFTLFNBQStCO0FBQzlDLFNBQU87QUFBQSxJQUNMLGtCQUFrQixPQUFPLFVBQVUsV0FBVyxRQUFRO0FBQUEsSUFDdEQsaUJBQWlCLDBCQUEwQjtBQUFBLEVBQzdDO0FBQ0Y7QUFFQSxTQUFTLGtCQUEwQjtBQUNqQyxNQUFJLFNBQVMsY0FBYztBQUN6QixXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksU0FBUyxVQUFVO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFTLFNBQVM7QUFDcEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLFNBQVMsT0FBTztBQUNsQixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sU0FBUyxVQUFVLFVBQVU7QUFDdEM7QUFFQSxTQUFTLGNBQWMsS0FBVSxVQUF1QztBQUN0RSxTQUFPO0FBQUEsSUFDTCxJQUFJO0FBQUEsSUFDSixTQUFTLElBQUksUUFBUSxVQUFVLFFBQVEsR0FBRyxXQUFXO0FBQUEsRUFDdkQ7QUFDRjsiLCJuYW1lcyI6WyJCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkIl19
@@ -10,6 +10,11 @@
10
10
  * {@link loop} reports after every item it processes. Code that drives a bulk operation without `loop()` calls
11
11
  * {@link reportBulkOperationProgress} itself.
12
12
  *
13
+ * An operation waiting on the user (a confirmation, a picker) makes no progress, yet it is not hung. While such a
14
+ * dialog is open, {@link holdBulkOperationWhile} reports on an interval, scoped to that one promise: the timer
15
+ * stops the moment the dialog settles, so a hung operation outside a dialog still goes stale. Every modal helper of
16
+ * this library already holds through `showModal`.
17
+ *
13
18
  * The listener set lives in the shared-state bag under a versioned key, so a `loop()` bundled by one plugin's copy
14
19
  * of this library reaches a listener registered by another's. Its shape is a cross-copy wire format: a `Set` of
15
20
  * plain functions, read structurally.
@@ -18,6 +23,23 @@
18
23
  * A listener notified whenever a bulk operation makes progress.
19
24
  */
20
25
  export type BulkOperationProgressListener = () => void;
26
+ /**
27
+ * How often {@link holdBulkOperationWhile} reports progress while its promise is pending, well inside the lock's
28
+ * staleness window.
29
+ */
30
+ export declare const BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS = 10000;
31
+ /**
32
+ * Keeps a bulk operation's lease lock fresh while it waits on something that is not progress but not a hang either,
33
+ * such as a dialog waiting for the user.
34
+ *
35
+ * Reports progress at once, then every {@link BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS} while the promise is
36
+ * pending, and once more when it settles. Outside a bulk operation it costs one interval and nothing else.
37
+ *
38
+ * @typeParam T - The type of the promise's value.
39
+ * @param promise - The promise to wait for.
40
+ * @returns The promise's value.
41
+ */
42
+ export declare function holdBulkOperationWhile<T>(promise: Promise<T>): Promise<T>;
21
43
  /**
22
44
  * Subscribes to bulk-operation progress.
23
45
  *