@mnaoumov/obsidian-lib 10.4.1 → 10.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +6 -0
  2. package/codemirror/incremental-parse-state-field/package.json +6 -0
  3. package/codemirror/markdown-editor-views/package.json +6 -0
  4. package/codemirror/range-set/package.json +6 -0
  5. package/command-handlers/open-bug-report-command-handler/package.json +6 -0
  6. package/components/embeddable-markdown-editor-component/package.json +6 -0
  7. package/components/reconfigurable-editor-extension-component/package.json +6 -0
  8. package/dist/lib/cjs/__merged.cjs +54 -1
  9. package/dist/lib/cjs/__merged.d.cts +14 -3
  10. package/dist/lib/cjs/attachment-path.cjs +3 -2
  11. package/dist/lib/cjs/backlink-index.cjs +44 -8
  12. package/dist/lib/cjs/backlink-index.d.cts +23 -0
  13. package/dist/lib/cjs/bug-report.cjs +241 -0
  14. package/dist/lib/cjs/bug-report.d.cts +161 -0
  15. package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
  16. package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
  17. package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
  18. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +162 -0
  19. package/dist/lib/cjs/codemirror/incremental-parse-state-field.d.cts +37 -0
  20. package/dist/lib/cjs/codemirror/index.cjs +10 -1
  21. package/dist/lib/cjs/codemirror/index.d.cts +3 -0
  22. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +142 -0
  23. package/dist/lib/cjs/codemirror/markdown-editor-views.d.cts +34 -0
  24. package/dist/lib/cjs/codemirror/range-set.cjs +106 -0
  25. package/dist/lib/cjs/codemirror/range-set.d.cts +35 -0
  26. package/dist/lib/cjs/command-handlers/index.cjs +4 -1
  27. package/dist/lib/cjs/command-handlers/index.d.cts +1 -0
  28. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +139 -0
  29. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +53 -0
  30. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +6 -3
  31. package/dist/lib/cjs/community-plugins.cjs +19 -2
  32. package/dist/lib/cjs/community-plugins.d.cts +14 -0
  33. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
  34. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +374 -0
  35. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +221 -0
  36. package/dist/lib/cjs/components/index.cjs +7 -1
  37. package/dist/lib/cjs/components/index.d.cts +2 -0
  38. package/dist/lib/cjs/components/plugin-gate-component.cjs +6 -3
  39. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +200 -0
  40. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.d.cts +96 -0
  41. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
  42. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
  43. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
  44. package/dist/lib/cjs/desktop-operating-system.cjs +101 -0
  45. package/dist/lib/cjs/desktop-operating-system.d.cts +15 -0
  46. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  47. package/dist/lib/cjs/i18n/locales/en.cjs +2 -1
  48. package/dist/lib/cjs/i18n/locales/en.d.cts +1 -0
  49. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +1 -0
  50. package/dist/lib/cjs/index.cjs +16 -1
  51. package/dist/lib/cjs/index.d.cts +5 -0
  52. package/dist/lib/cjs/menu.cjs +118 -0
  53. package/dist/lib/cjs/menu.d.cts +65 -0
  54. package/dist/lib/cjs/mobile-app-info.cjs +167 -0
  55. package/dist/lib/cjs/mobile-app-info.d.cts +32 -0
  56. package/dist/lib/cjs/modals/modal.cjs +8 -5
  57. package/dist/lib/cjs/modals/modal.d.cts +4 -0
  58. package/dist/lib/cjs/obsidian-settings.cjs +2 -2
  59. package/dist/lib/cjs/plugin/plugin.cjs +5 -2
  60. package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
  61. package/dist/lib/cjs/settings-modal.cjs +103 -0
  62. package/dist/lib/cjs/settings-modal.d.cts +33 -0
  63. package/dist/lib/esm/__merged.d.mts +14 -3
  64. package/dist/lib/esm/__merged.mjs +50 -2
  65. package/dist/lib/esm/attachment-path.mjs +3 -2
  66. package/dist/lib/esm/backlink-index.d.mts +23 -0
  67. package/dist/lib/esm/backlink-index.mjs +42 -7
  68. package/dist/lib/esm/bug-report.d.mts +161 -0
  69. package/dist/lib/esm/bug-report.mjs +141 -0
  70. package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
  71. package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
  72. package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
  73. package/dist/lib/esm/codemirror/incremental-parse-state-field.d.mts +37 -0
  74. package/dist/lib/esm/codemirror/incremental-parse-state-field.mjs +74 -0
  75. package/dist/lib/esm/codemirror/index.d.mts +3 -0
  76. package/dist/lib/esm/codemirror/index.mjs +7 -1
  77. package/dist/lib/esm/codemirror/markdown-editor-views.d.mts +34 -0
  78. package/dist/lib/esm/codemirror/markdown-editor-views.mjs +53 -0
  79. package/dist/lib/esm/codemirror/range-set.d.mts +35 -0
  80. package/dist/lib/esm/codemirror/range-set.mjs +18 -0
  81. package/dist/lib/esm/command-handlers/index.d.mts +1 -0
  82. package/dist/lib/esm/command-handlers/index.mjs +3 -1
  83. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +53 -0
  84. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +51 -0
  85. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +6 -3
  86. package/dist/lib/esm/community-plugins.d.mts +14 -0
  87. package/dist/lib/esm/community-plugins.mjs +18 -2
  88. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
  89. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +221 -0
  90. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +293 -0
  91. package/dist/lib/esm/components/index.d.mts +2 -0
  92. package/dist/lib/esm/components/index.mjs +5 -1
  93. package/dist/lib/esm/components/plugin-gate-component.mjs +6 -3
  94. package/dist/lib/esm/components/reconfigurable-editor-extension-component.d.mts +96 -0
  95. package/dist/lib/esm/components/reconfigurable-editor-extension-component.mjs +112 -0
  96. package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
  97. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
  98. package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
  99. package/dist/lib/esm/desktop-operating-system.d.mts +15 -0
  100. package/dist/lib/esm/desktop-operating-system.mjs +16 -0
  101. package/dist/lib/esm/generated-during-build.mjs +1 -1
  102. package/dist/lib/esm/i18n/locales/en.d.mts +1 -0
  103. package/dist/lib/esm/i18n/locales/en.mjs +2 -1
  104. package/dist/lib/esm/i18n/locales/translations-map.d.mts +1 -0
  105. package/dist/lib/esm/index.d.mts +5 -0
  106. package/dist/lib/esm/index.mjs +11 -1
  107. package/dist/lib/esm/menu.d.mts +65 -0
  108. package/dist/lib/esm/menu.mjs +30 -0
  109. package/dist/lib/esm/mobile-app-info.d.mts +32 -0
  110. package/dist/lib/esm/mobile-app-info.mjs +84 -0
  111. package/dist/lib/esm/modals/modal.d.mts +4 -0
  112. package/dist/lib/esm/modals/modal.mjs +8 -5
  113. package/dist/lib/esm/obsidian-settings.mjs +6 -3
  114. package/dist/lib/esm/plugin/plugin.d.mts +2 -0
  115. package/dist/lib/esm/plugin/plugin.mjs +5 -2
  116. package/dist/lib/esm/settings-modal.d.mts +33 -0
  117. package/dist/lib/esm/settings-modal.mjs +15 -0
  118. package/package.json +9 -8
@@ -0,0 +1,241 @@
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
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+ require = Object.assign(
38
+ (id) => requirePatched(id),
39
+ originalRequire,
40
+ {
41
+ __isPatched: true
42
+ }
43
+ );
44
+ function extractDefault($module) {
45
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
46
+ }
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
+ "@codemirror/autocomplete",
49
+ "@codemirror/collab",
50
+ "@codemirror/commands",
51
+ "@codemirror/language",
52
+ "@codemirror/lint",
53
+ "@codemirror/search",
54
+ "@codemirror/state",
55
+ "@codemirror/text",
56
+ "@codemirror/view",
57
+ "@lezer/common",
58
+ "@lezer/highlight",
59
+ "@lezer/lr",
60
+ "obsidian"
61
+ ]);
62
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
63
+ "@codemirror/closebrackets",
64
+ "@codemirror/comment",
65
+ "@codemirror/fold",
66
+ "@codemirror/gutter",
67
+ "@codemirror/highlight",
68
+ "@codemirror/history",
69
+ "@codemirror/matchbrackets",
70
+ "@codemirror/panel",
71
+ "@codemirror/rangeset",
72
+ "@codemirror/rectangular-selection",
73
+ "@codemirror/stream-parser",
74
+ "@codemirror/tooltip"
75
+ ]);
76
+ function requirePatched(id) {
77
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
78
+ return originalRequire?.(id);
79
+ }
80
+ const app = globalThis.app;
81
+ if (app?.isMobile) {
82
+ if (id === "process" || id === "node:process") {
83
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
84
+ return process;
85
+ }
86
+ } else {
87
+ const $module = originalRequire?.(id);
88
+ if ($module) {
89
+ return extractDefault($module);
90
+ }
91
+ }
92
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
93
+ return {};
94
+ }
95
+ })();
96
+
97
+ "use strict";
98
+ var __create = Object.create;
99
+ var __defProp = Object.defineProperty;
100
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
101
+ var __getOwnPropNames = Object.getOwnPropertyNames;
102
+ var __getProtoOf = Object.getPrototypeOf;
103
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
104
+ var __export = (target, all) => {
105
+ for (var name in all)
106
+ __defProp(target, name, { get: all[name], enumerable: true });
107
+ };
108
+ var __copyProps = (to, from, except, desc) => {
109
+ if (from && typeof from === "object" || typeof from === "function") {
110
+ for (let key of __getOwnPropNames(from))
111
+ if (!__hasOwnProp.call(to, key) && key !== except)
112
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
113
+ }
114
+ return to;
115
+ };
116
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
117
+ // If the importer is in node compatibility mode or this is not an ESM
118
+ // file that has been converted to a CommonJS file using a Babel-
119
+ // compatible transform (i.e. "__esModule" has not been set), then set
120
+ // "default" to the CommonJS "module.exports" for node compatibility.
121
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
122
+ mod
123
+ ));
124
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
125
+ var bug_report_exports = {};
126
+ __export(bug_report_exports, {
127
+ BUG_REPORT_ISSUE_FORM_TEMPLATE: () => BUG_REPORT_ISSUE_FORM_TEMPLATE,
128
+ BugReportIssueFormFieldId: () => BugReportIssueFormFieldId,
129
+ formatBugReportEnvironment: () => formatBugReportEnvironment,
130
+ getBugReportEnvironment: () => getBugReportEnvironment,
131
+ getBugReportIssueFormUrl: () => getBugReportIssueFormUrl,
132
+ getGitHubIssueFormUrl: () => getGitHubIssueFormUrl
133
+ });
134
+ module.exports = __toCommonJS(bug_report_exports);
135
+ var import_obsidian = require('obsidian');
136
+ var import_mobile_app_info = require('./mobile-app-info.cjs');
137
+ var BugReportIssueFormFieldId = /* @__PURE__ */ ((BugReportIssueFormFieldId2) => {
138
+ BugReportIssueFormFieldId2["Environment"] = "environment";
139
+ BugReportIssueFormFieldId2["ObsidianVersion"] = "obsidian-version";
140
+ BugReportIssueFormFieldId2["OperatingSystem"] = "operating-system";
141
+ BugReportIssueFormFieldId2["PluginVersion"] = "plugin-version";
142
+ return BugReportIssueFormFieldId2;
143
+ })(BugReportIssueFormFieldId || {});
144
+ const BUG_REPORT_ISSUE_FORM_TEMPLATE = "bug_report.yml";
145
+ const UNKNOWN = "unknown";
146
+ function formatBugReportEnvironment(environment) {
147
+ const enabledPlugins = environment.enabledPlugins.length === 0 ? "none" : environment.enabledPlugins.map((pluginInfo) => formatPluginInfo(pluginInfo)).join(", ");
148
+ return `- Plugin: ${formatPluginInfo(environment.plugin)}
149
+ - Obsidian: ${environment.obsidianVersion} (installer ${environment.installerVersion})
150
+ - Platform: ${environment.platform}
151
+ - Operating system: ${environment.operatingSystem}
152
+ - Other enabled plugins: ${enabledPlugins}`;
153
+ }
154
+ async function getBugReportEnvironment(params) {
155
+ const { app, pluginId } = params;
156
+ const { installerVersion, operatingSystem } = await getAppAndOperatingSystem();
157
+ return {
158
+ enabledPlugins: [...app.plugins.enabledPlugins].filter((id) => id !== pluginId).sort().map((id) => getPluginInfo(app, id)),
159
+ installerVersion,
160
+ obsidianVersion: import_obsidian.apiVersion,
161
+ operatingSystem,
162
+ platform: getPlatformName(),
163
+ plugin: getPluginInfo(app, pluginId)
164
+ };
165
+ }
166
+ async function getBugReportIssueFormUrl(params) {
167
+ const environment = await getBugReportEnvironment(params);
168
+ return getGitHubIssueFormUrl({
169
+ fields: {
170
+ ["environment" /* Environment */]: formatBugReportEnvironment(environment),
171
+ ["obsidian-version" /* ObsidianVersion */]: environment.obsidianVersion,
172
+ ["operating-system" /* OperatingSystem */]: environment.operatingSystem,
173
+ ["plugin-version" /* PluginVersion */]: environment.plugin.version ?? UNKNOWN
174
+ },
175
+ gitHubRepo: params.gitHubRepo,
176
+ template: BUG_REPORT_ISSUE_FORM_TEMPLATE,
177
+ ...params.title !== void 0 && { title: params.title }
178
+ });
179
+ }
180
+ function getGitHubIssueFormUrl(params) {
181
+ const searchParams = new URLSearchParams({ template: params.template });
182
+ if (params.title !== void 0) {
183
+ searchParams.set("title", params.title);
184
+ }
185
+ for (const [fieldId, value] of Object.entries(params.fields ?? {})) {
186
+ searchParams.set(fieldId, value);
187
+ }
188
+ return `https://github.com/${params.gitHubRepo}/issues/new?${searchParams.toString()}`;
189
+ }
190
+ function formatPluginInfo(pluginInfo) {
191
+ return `\`${pluginInfo.id}\` ${pluginInfo.version ?? UNKNOWN}`;
192
+ }
193
+ async function getAppAndOperatingSystem() {
194
+ if (import_obsidian.Platform.isMobileApp) {
195
+ const mobileAppInfo = await (0, import_mobile_app_info.getMobileAppInfo)();
196
+ return {
197
+ installerVersion: mobileAppInfo?.installerVersion ?? UNKNOWN,
198
+ operatingSystem: mobileAppInfo?.operatingSystem ?? UNKNOWN
199
+ };
200
+ }
201
+ if (!import_obsidian.Platform.isDesktopApp) {
202
+ return { installerVersion: UNKNOWN, operatingSystem: UNKNOWN };
203
+ }
204
+ const { getDesktopOperatingSystem } = await import("./desktop-operating-system.cjs");
205
+ const build = import_obsidian.Platform.build;
206
+ return {
207
+ installerVersion: typeof build === "string" ? build : UNKNOWN,
208
+ operatingSystem: getDesktopOperatingSystem()
209
+ };
210
+ }
211
+ function getPlatformName() {
212
+ if (import_obsidian.Platform.isAndroidApp) {
213
+ return "Android";
214
+ }
215
+ if (import_obsidian.Platform.isIosApp) {
216
+ return "iOS";
217
+ }
218
+ if (import_obsidian.Platform.isMacOS) {
219
+ return "macOS";
220
+ }
221
+ if (import_obsidian.Platform.isWin) {
222
+ return "Windows";
223
+ }
224
+ return import_obsidian.Platform.isLinux ? "Linux" : UNKNOWN;
225
+ }
226
+ function getPluginInfo(app, pluginId) {
227
+ return {
228
+ id: pluginId,
229
+ version: app.plugins.manifests[pluginId]?.version ?? null
230
+ };
231
+ }
232
+ // Annotate the CommonJS export names for ESM import in node:
233
+ 0 && (module.exports = {
234
+ BUG_REPORT_ISSUE_FORM_TEMPLATE,
235
+ BugReportIssueFormFieldId,
236
+ formatBugReportEnvironment,
237
+ getBugReportEnvironment,
238
+ getBugReportIssueFormUrl,
239
+ getGitHubIssueFormUrl
240
+ });
241
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWctcmVwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciBhIHBsdWdpbidzIGJ1ZyByZXBvcnRzOiB0aGUgZW52aXJvbm1lbnQgYSByZXBvcnQgbmVlZHMsIGFuZCBhIGxpbmsgdG8gYSBHaXRIdWIgaXNzdWUgZm9ybVxuICogcHJlZmlsbGVkIHdpdGggaXQuXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0tbG9hZGFibGU6IHRoZSBkZXNrdG9wIG9wZXJhdGluZy1zeXN0ZW0gbG9va3VwIHJlYWRzIGBub2RlOm9zYCwgc28gaXQgaXMgaW1wb3J0ZWRcbiAqIGR5bmFtaWNhbGx5LCBvbiBkZXNrdG9wIG9ubHkuXG4gKlxuICogVGhlIGRlc2t0b3AgaW5zdGFsbGVyIHZlcnNpb24gaXMgYFBsYXRmb3JtLmJ1aWxkYCwgd2hpY2ggbm8gcHVibGljIHR5cGluZyBkZWNsYXJlczogT2JzaWRpYW4ncyBkZXNrdG9wXG4gKiBzdGFydHVwIHNldHMgaXQgZnJvbSBFbGVjdHJvbidzIGBhcHAuZ2V0VmVyc2lvbigpYCAocmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjBgKSwgc28gaXQgaXMgcmVhZFxuICogc3RydWN0dXJhbGx5IGhlcmUsIGFuZCByZWFkcyBhcyBgdW5rbm93bmAgaWYgYSBsYXRlciB2ZXJzaW9uIGRyb3BzIGl0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBhcGlWZXJzaW9uLFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE1vYmlsZUFwcEluZm8gfSBmcm9tICcuL21vYmlsZS1hcHAtaW5mby50cyc7XG5cbi8qKlxuICogVGhlIGlkcyBvZiB0aGUgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtJ3MgZmllbGRzIHRoYXQge0BsaW5rIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybH0gcHJlZmlsbHMuIEdpdEh1YlxuICogcHJlZmlsbHMgYSBmaWVsZCBmcm9tIGEgcXVlcnkgcGFyYW1ldGVyIG5hbWVkIGFmdGVyIHRoZSBmaWVsZCdzIGBpZGAsIHNvIGEgZm9ybSBtdXN0IGdpdmUgaXRzIGZpZWxkc1xuICogdGhlc2UgaWRzIGZvciB0aGVtIHRvIGJlIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGVudW0gQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgZW52aXJvbm1lbnQsIGFzIHtAbGluayBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudH0gcmVuZGVycyBpdC5cbiAgICovXG4gIEVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyxcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICBPYnNpZGlhblZlcnNpb24gPSAnb2JzaWRpYW4tdmVyc2lvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKi9cbiAgT3BlcmF0aW5nU3lzdGVtID0gJ29wZXJhdGluZy1zeXN0ZW0nLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbidzIHZlcnNpb24uXG4gICAqL1xuICBQbHVnaW5WZXJzaW9uID0gJ3BsdWdpbi12ZXJzaW9uJ1xufVxuXG4vKipcbiAqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICovXG5leHBvcnQgY29uc3QgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFID0gJ2J1Z19yZXBvcnQueW1sJztcblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydEVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBvdGhlciBlbmFibGVkIHBsdWdpbnMsIHNvcnRlZCBieSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWRQbHVnaW5zOiByZWFkb25seSBCdWdSZXBvcnRQbHVnaW5JbmZvW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnN0YWxsZWQgYXBwJ3MgdmVyc2lvbiwgd2hpY2ggY2FuIGxhZyBiZWhpbmQge0BsaW5rIG9ic2lkaWFuVmVyc2lvbn0uXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgbmFtZSBhbmQgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGluZ1N5c3RlbTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm06IGBBbmRyb2lkYCwgYGlPU2AsIGBtYWNPU2AsIGBXaW5kb3dzYCwgYExpbnV4YCBvciBgdW5rbm93bmAuXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogQnVnUmVwb3J0UGx1Z2luSW5mbztcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiwgYXMgYSBidWcgcmVwb3J0IG5hbWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydFBsdWdpbkluZm8ge1xuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGluc3RhbGxlZCB2ZXJzaW9uLCBvciBgbnVsbGAgd2hlbiBpdHMgbWFuaWZlc3QgaXMgbm90IGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogbnVsbCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Z1JlcG9ydEVudmlyb25tZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSByZXBvcnRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCdWdSZXBvcnRJc3N1ZUZvcm1VcmxQYXJhbXMgZXh0ZW5kcyBHZXRCdWdSZXBvcnRFbnZpcm9ubWVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgR2l0SHViIHJlcG9zaXRvcnksIGFzIGBvd25lci9uYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IGdpdEh1YlJlcG86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlzc3VlJ3MgdGl0bGUuIExlYXZlIGl0IG91dCB0byBrZWVwIHRoZSBmb3JtJ3Mgb3duIGRlZmF1bHQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0R2l0SHViSXNzdWVGb3JtVXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRHaXRIdWJJc3N1ZUZvcm1VcmxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhbHVlcyB0byBwcmVmaWxsLCBrZXllZCBieSBmaWVsZCBgaWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZmllbGRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SHViUmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSdzIGZpbGUgbmFtZSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlzc3VlJ3MgdGl0bGUuIExlYXZlIGl0IG91dCB0byBrZWVwIHRoZSBmb3JtJ3Mgb3duIGRlZmF1bHQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFwcEFuZE9wZXJhdGluZ1N5c3RlbSB7XG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQbGF0Zm9ybVdpdGhCdWlsZCB7XG4gIHJlYWRvbmx5IGJ1aWxkPzogdW5rbm93bjtcbn1cblxuY29uc3QgVU5LTk9XTiA9ICd1bmtub3duJztcblxuLyoqXG4gKiBSZW5kZXJzIGEgYnVnIHJlcG9ydCdzIGVudmlyb25tZW50IGFzIGEgTWFya2Rvd24gbGlzdC5cbiAqXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgLSBUaGUgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyBUaGUgTWFya2Rvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudChlbnZpcm9ubWVudDogQnVnUmVwb3J0RW52aXJvbm1lbnQpOiBzdHJpbmcge1xuICBjb25zdCBlbmFibGVkUGx1Z2lucyA9IGVudmlyb25tZW50LmVuYWJsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMFxuICAgID8gJ25vbmUnXG4gICAgOiBlbnZpcm9ubWVudC5lbmFibGVkUGx1Z2lucy5tYXAoKHBsdWdpbkluZm8pID0+IGZvcm1hdFBsdWdpbkluZm8ocGx1Z2luSW5mbykpLmpvaW4oJywgJyk7XG5cbiAgcmV0dXJuIGAtIFBsdWdpbjogJHtmb3JtYXRQbHVnaW5JbmZvKGVudmlyb25tZW50LnBsdWdpbil9XFxuYFxuICAgICsgYC0gT2JzaWRpYW46ICR7ZW52aXJvbm1lbnQub2JzaWRpYW5WZXJzaW9ufSAoaW5zdGFsbGVyICR7ZW52aXJvbm1lbnQuaW5zdGFsbGVyVmVyc2lvbn0pXFxuYFxuICAgICsgYC0gUGxhdGZvcm06ICR7ZW52aXJvbm1lbnQucGxhdGZvcm19XFxuYFxuICAgICsgYC0gT3BlcmF0aW5nIHN5c3RlbTogJHtlbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW19XFxuYFxuICAgICsgYC0gT3RoZXIgZW5hYmxlZCBwbHVnaW5zOiAke2VuYWJsZWRQbHVnaW5zfWA7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzOiB0aGUgcGx1Z2luJ3MgdmVyc2lvbiwgdGhlIG90aGVyIGVuYWJsZWQgcGx1Z2lucywgdGhlXG4gKiBPYnNpZGlhbiBhbmQgaW5zdGFsbGVyIHZlcnNpb25zLCB0aGUgcGxhdGZvcm0gYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Z1JlcG9ydEVudmlyb25tZW50KHBhcmFtczogR2V0QnVnUmVwb3J0RW52aXJvbm1lbnRQYXJhbXMpOiBQcm9taXNlPEJ1Z1JlcG9ydEVudmlyb25tZW50PiB7XG4gIGNvbnN0IHsgYXBwLCBwbHVnaW5JZCB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGluc3RhbGxlclZlcnNpb24sIG9wZXJhdGluZ1N5c3RlbSB9ID0gYXdhaXQgZ2V0QXBwQW5kT3BlcmF0aW5nU3lzdGVtKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkUGx1Z2luczogWy4uLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zXVxuICAgICAgLmZpbHRlcigoaWQpID0+IGlkICE9PSBwbHVnaW5JZClcbiAgICAgIC5zb3J0KClcbiAgICAgIC5tYXAoKGlkKSA9PiBnZXRQbHVnaW5JbmZvKGFwcCwgaWQpKSxcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG9ic2lkaWFuVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICBvcGVyYXRpbmdTeXN0ZW0sXG4gICAgcGxhdGZvcm06IGdldFBsYXRmb3JtTmFtZSgpLFxuICAgIHBsdWdpbjogZ2V0UGx1Z2luSW5mbyhhcHAsIHBsdWdpbklkKVxuICB9O1xufVxuXG4vKipcbiAqIEdldHMgYSBsaW5rIHRvIGEgcGx1Z2luJ3MgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtICh7QGxpbmsgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFfSksIHByZWZpbGxlZCB3aXRoXG4gKiB0aGUgZW52aXJvbm1lbnQsIGluIHRoZSBmaWVsZHMge0BsaW5rIEJ1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWR9IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsKHBhcmFtczogR2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBhd2FpdCBnZXRCdWdSZXBvcnRFbnZpcm9ubWVudChwYXJhbXMpO1xuXG4gIHJldHVybiBnZXRHaXRIdWJJc3N1ZUZvcm1Vcmwoe1xuICAgIGZpZWxkczoge1xuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuRW52aXJvbm1lbnRdOiBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudChlbnZpcm9ubWVudCksXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5PYnNpZGlhblZlcnNpb25dOiBlbnZpcm9ubWVudC5vYnNpZGlhblZlcnNpb24sXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5PcGVyYXRpbmdTeXN0ZW1dOiBlbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW0sXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5QbHVnaW5WZXJzaW9uXTogZW52aXJvbm1lbnQucGx1Z2luLnZlcnNpb24gPz8gVU5LTk9XTlxuICAgIH0sXG4gICAgZ2l0SHViUmVwbzogcGFyYW1zLmdpdEh1YlJlcG8sXG4gICAgdGVtcGxhdGU6IEJVR19SRVBPUlRfSVNTVUVfRk9STV9URU1QTEFURSxcbiAgICAuLi5wYXJhbXMudGl0bGUgIT09IHVuZGVmaW5lZCAmJiB7IHRpdGxlOiBwYXJhbXMudGl0bGUgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbGluayB0aGF0IG9wZW5zIGEgR2l0SHViIGlzc3VlIGZvcm0gd2l0aCBmaWVsZHMgcHJlZmlsbGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2l0SHViSXNzdWVGb3JtVXJsKHBhcmFtczogR2V0R2l0SHViSXNzdWVGb3JtVXJsUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHRlbXBsYXRlOiBwYXJhbXMudGVtcGxhdGUgfSk7XG4gIGlmIChwYXJhbXMudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHNlYXJjaFBhcmFtcy5zZXQoJ3RpdGxlJywgcGFyYW1zLnRpdGxlKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2ZpZWxkSWQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMuZmllbGRzID8/IHt9KSkge1xuICAgIHNlYXJjaFBhcmFtcy5zZXQoZmllbGRJZCwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHtwYXJhbXMuZ2l0SHViUmVwb30vaXNzdWVzL25ldz8ke3NlYXJjaFBhcmFtcy50b1N0cmluZygpfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBsdWdpbkluZm8ocGx1Z2luSW5mbzogQnVnUmVwb3J0UGx1Z2luSW5mbyk6IHN0cmluZyB7XG4gIHJldHVybiBgXFxgJHtwbHVnaW5JbmZvLmlkfVxcYCAke3BsdWdpbkluZm8udmVyc2lvbiA/PyBVTktOT1dOfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwcEFuZE9wZXJhdGluZ1N5c3RlbSgpOiBQcm9taXNlPEFwcEFuZE9wZXJhdGluZ1N5c3RlbT4ge1xuICBpZiAoUGxhdGZvcm0uaXNNb2JpbGVBcHApIHtcbiAgICBjb25zdCBtb2JpbGVBcHBJbmZvID0gYXdhaXQgZ2V0TW9iaWxlQXBwSW5mbygpO1xuICAgIHJldHVybiB7XG4gICAgICBpbnN0YWxsZXJWZXJzaW9uOiBtb2JpbGVBcHBJbmZvPy5pbnN0YWxsZXJWZXJzaW9uID8/IFVOS05PV04sXG4gICAgICBvcGVyYXRpbmdTeXN0ZW06IG1vYmlsZUFwcEluZm8/Lm9wZXJhdGluZ1N5c3RlbSA/PyBVTktOT1dOXG4gICAgfTtcbiAgfVxuXG4gIGlmICghUGxhdGZvcm0uaXNEZXNrdG9wQXBwKSB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVyVmVyc2lvbjogVU5LTk9XTiwgb3BlcmF0aW5nU3lzdGVtOiBVTktOT1dOIH07XG4gIH1cblxuICAvLyBDb25kaXRpb25hbCBpbXBvcnQgb2YgdGhlIGRlc2t0b3Atb25seSBsb29rdXAsIHdoaWNoIHJlYWRzIGBub2RlOm9zYDsgdGhpcyBicmFuY2ggcnVucyBvbmx5IG9uIGRlc2t0b3AuXG4gIGNvbnN0IHsgZ2V0RGVza3RvcE9wZXJhdGluZ1N5c3RlbSB9ID0gYXdhaXQgaW1wb3J0KCcuL2Rlc2t0b3Atb3BlcmF0aW5nLXN5c3RlbS50cycpO1xuICBjb25zdCBidWlsZCA9IChQbGF0Zm9ybSBhcyBQbGF0Zm9ybVdpdGhCdWlsZCkuYnVpbGQ7XG4gIHJldHVybiB7XG4gICAgaW5zdGFsbGVyVmVyc2lvbjogdHlwZW9mIGJ1aWxkID09PSAnc3RyaW5nJyA/IGJ1aWxkIDogVU5LTk9XTixcbiAgICBvcGVyYXRpbmdTeXN0ZW06IGdldERlc2t0b3BPcGVyYXRpbmdTeXN0ZW0oKVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQbGF0Zm9ybU5hbWUoKTogc3RyaW5nIHtcbiAgaWYgKFBsYXRmb3JtLmlzQW5kcm9pZEFwcCkge1xuICAgIHJldHVybiAnQW5kcm9pZCc7XG4gIH1cbiAgaWYgKFBsYXRmb3JtLmlzSW9zQXBwKSB7XG4gICAgcmV0dXJuICdpT1MnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc01hY09TKSB7XG4gICAgcmV0dXJuICdtYWNPUyc7XG4gIH1cbiAgaWYgKFBsYXRmb3JtLmlzV2luKSB7XG4gICAgcmV0dXJuICdXaW5kb3dzJztcbiAgfVxuICByZXR1cm4gUGxhdGZvcm0uaXNMaW51eCA/ICdMaW51eCcgOiBVTktOT1dOO1xufVxuXG5mdW5jdGlvbiBnZXRQbHVnaW5JbmZvKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogQnVnUmVwb3J0UGx1Z2luSW5mbyB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHBsdWdpbklkLFxuICAgIHZlcnNpb246IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb24gPz8gbnVsbFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEsc0JBR087QUFFUCw2QkFBaUM7QUFPMUIsSUFBSyw0QkFBTCxrQkFBS0EsK0JBQUw7QUFJTCxFQUFBQSwyQkFBQSxpQkFBYztBQUtkLEVBQUFBLDJCQUFBLHFCQUFrQjtBQUtsQixFQUFBQSwyQkFBQSxxQkFBa0I7QUFLbEIsRUFBQUEsMkJBQUEsbUJBQWdCO0FBbkJOLFNBQUFBO0FBQUEsR0FBQTtBQXlCTCxNQUFNLGlDQUFpQztBQW9IOUMsTUFBTSxVQUFVO0FBUVQsU0FBUywyQkFBMkIsYUFBMkM7QUFDcEYsUUFBTSxpQkFBaUIsWUFBWSxlQUFlLFdBQVcsSUFDekQsU0FDQSxZQUFZLGVBQWUsSUFBSSxDQUFDLGVBQWUsaUJBQWlCLFVBQVUsQ0FBQyxFQUFFLEtBQUssSUFBSTtBQUUxRixTQUFPLGFBQWEsaUJBQWlCLFlBQVksTUFBTSxDQUFDO0FBQUEsY0FDckMsWUFBWSxlQUFlLGVBQWUsWUFBWSxnQkFBZ0I7QUFBQSxjQUN0RSxZQUFZLFFBQVE7QUFBQSxzQkFDWixZQUFZLGVBQWU7QUFBQSwyQkFDdEIsY0FBYztBQUNoRDtBQVNBLGVBQXNCLHdCQUF3QixRQUFzRTtBQUNsSCxRQUFNLEVBQUUsS0FBSyxTQUFTLElBQUk7QUFDMUIsUUFBTSxFQUFFLGtCQUFrQixnQkFBZ0IsSUFBSSxNQUFNLHlCQUF5QjtBQUU3RSxTQUFPO0FBQUEsSUFDTCxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksUUFBUSxjQUFjLEVBQzNDLE9BQU8sQ0FBQyxPQUFPLE9BQU8sUUFBUSxFQUM5QixLQUFLLEVBQ0wsSUFBSSxDQUFDLE9BQU8sY0FBYyxLQUFLLEVBQUUsQ0FBQztBQUFBLElBQ3JDO0FBQUEsSUFDQSxpQkFBaUI7QUFBQSxJQUNqQjtBQUFBLElBQ0EsVUFBVSxnQkFBZ0I7QUFBQSxJQUMxQixRQUFRLGNBQWMsS0FBSyxRQUFRO0FBQUEsRUFDckM7QUFDRjtBQVNBLGVBQXNCLHlCQUF5QixRQUF5RDtBQUN0RyxRQUFNLGNBQWMsTUFBTSx3QkFBd0IsTUFBTTtBQUV4RCxTQUFPLHNCQUFzQjtBQUFBLElBQzNCLFFBQVE7QUFBQSxNQUNOLENBQUMsK0JBQXFDLEdBQUcsMkJBQTJCLFdBQVc7QUFBQSxNQUMvRSxDQUFDLHdDQUF5QyxHQUFHLFlBQVk7QUFBQSxNQUN6RCxDQUFDLHdDQUF5QyxHQUFHLFlBQVk7QUFBQSxNQUN6RCxDQUFDLG9DQUF1QyxHQUFHLFlBQVksT0FBTyxXQUFXO0FBQUEsSUFDM0U7QUFBQSxJQUNBLFlBQVksT0FBTztBQUFBLElBQ25CLFVBQVU7QUFBQSxJQUNWLEdBQUcsT0FBTyxVQUFVLFVBQWEsRUFBRSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pELENBQUM7QUFDSDtBQVFPLFNBQVMsc0JBQXNCLFFBQTZDO0FBQ2pGLFFBQU0sZUFBZSxJQUFJLGdCQUFnQixFQUFFLFVBQVUsT0FBTyxTQUFTLENBQUM7QUFDdEUsTUFBSSxPQUFPLFVBQVUsUUFBVztBQUM5QixpQkFBYSxJQUFJLFNBQVMsT0FBTyxLQUFLO0FBQUEsRUFDeEM7QUFFQSxhQUFXLENBQUMsU0FBUyxLQUFLLEtBQUssT0FBTyxRQUFRLE9BQU8sVUFBVSxDQUFDLENBQUMsR0FBRztBQUNsRSxpQkFBYSxJQUFJLFNBQVMsS0FBSztBQUFBLEVBQ2pDO0FBRUEsU0FBTyxzQkFBc0IsT0FBTyxVQUFVLGVBQWUsYUFBYSxTQUFTLENBQUM7QUFDdEY7QUFFQSxTQUFTLGlCQUFpQixZQUF5QztBQUNqRSxTQUFPLEtBQUssV0FBVyxFQUFFLE1BQU0sV0FBVyxXQUFXLE9BQU87QUFDOUQ7QUFFQSxlQUFlLDJCQUEyRDtBQUN4RSxNQUFJLHlCQUFTLGFBQWE7QUFDeEIsVUFBTSxnQkFBZ0IsVUFBTSx5Q0FBaUI7QUFDN0MsV0FBTztBQUFBLE1BQ0wsa0JBQWtCLGVBQWUsb0JBQW9CO0FBQUEsTUFDckQsaUJBQWlCLGVBQWUsbUJBQW1CO0FBQUEsSUFDckQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLHlCQUFTLGNBQWM7QUFDMUIsV0FBTyxFQUFFLGtCQUFrQixTQUFTLGlCQUFpQixRQUFRO0FBQUEsRUFDL0Q7QUFHQSxRQUFNLEVBQUUsMEJBQTBCLElBQUksTUFBTSxPQUFPLCtCQUErQjtBQUNsRixRQUFNLFFBQVMseUJBQStCO0FBQzlDLFNBQU87QUFBQSxJQUNMLGtCQUFrQixPQUFPLFVBQVUsV0FBVyxRQUFRO0FBQUEsSUFDdEQsaUJBQWlCLDBCQUEwQjtBQUFBLEVBQzdDO0FBQ0Y7QUFFQSxTQUFTLGtCQUEwQjtBQUNqQyxNQUFJLHlCQUFTLGNBQWM7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLHlCQUFTLFVBQVU7QUFDckIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLHlCQUFTLFNBQVM7QUFDcEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLHlCQUFTLE9BQU87QUFDbEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLHlCQUFTLFVBQVUsVUFBVTtBQUN0QztBQUVBLFNBQVMsY0FBYyxLQUFVLFVBQXVDO0FBQ3RFLFNBQU87QUFBQSxJQUNMLElBQUk7QUFBQSxJQUNKLFNBQVMsSUFBSSxRQUFRLFVBQVUsUUFBUSxHQUFHLFdBQVc7QUFBQSxFQUN2RDtBQUNGOyIsIm5hbWVzIjpbIkJ1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQiXX0=
@@ -0,0 +1,161 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Helpers for a plugin's bug reports: the environment a report needs, and a link to a GitHub issue form
6
+ * prefilled with it.
7
+ *
8
+ * Cross-platform-loadable: the desktop operating-system lookup reads `node:os`, so it is imported
9
+ * dynamically, on desktop only.
10
+ *
11
+ * The desktop installer version is `Platform.build`, which no public typing declares: Obsidian's desktop
12
+ * startup sets it from Electron's `app.getVersion()` (read from Obsidian `1.15.0`), so it is read
13
+ * structurally here, and reads as `unknown` if a later version drops it.
14
+ */
15
+ import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
16
+ /**
17
+ * The ids of the bug-report issue form's fields that {@link getBugReportIssueFormUrl} prefills. GitHub
18
+ * prefills a field from a query parameter named after the field's `id`, so a form must give its fields
19
+ * these ids for them to be filled.
20
+ */
21
+ export declare enum BugReportIssueFormFieldId {
22
+ /**
23
+ * The whole environment, as {@link formatBugReportEnvironment} renders it.
24
+ */
25
+ Environment = "environment",
26
+ /**
27
+ * The Obsidian version.
28
+ */
29
+ ObsidianVersion = "obsidian-version",
30
+ /**
31
+ * The operating system.
32
+ */
33
+ OperatingSystem = "operating-system",
34
+ /**
35
+ * The reporting plugin's version.
36
+ */
37
+ PluginVersion = "plugin-version"
38
+ }
39
+ /**
40
+ * The file name of the bug-report issue form, under `.github/ISSUE_TEMPLATE`.
41
+ */
42
+ export declare const BUG_REPORT_ISSUE_FORM_TEMPLATE = "bug_report.yml";
43
+ /**
44
+ * The environment a bug report needs.
45
+ */
46
+ export interface BugReportEnvironment {
47
+ /**
48
+ * The other enabled plugins, sorted by id.
49
+ */
50
+ readonly enabledPlugins: readonly BugReportPluginInfo[];
51
+ /**
52
+ * The installed app's version, which can lag behind {@link obsidianVersion}.
53
+ */
54
+ readonly installerVersion: string;
55
+ /**
56
+ * The Obsidian version.
57
+ */
58
+ readonly obsidianVersion: string;
59
+ /**
60
+ * The operating system's name and version.
61
+ */
62
+ readonly operatingSystem: string;
63
+ /**
64
+ * The platform: `Android`, `iOS`, `macOS`, `Windows`, `Linux` or `unknown`.
65
+ */
66
+ readonly platform: string;
67
+ /**
68
+ * The reporting plugin.
69
+ */
70
+ readonly plugin: BugReportPluginInfo;
71
+ }
72
+ /**
73
+ * A plugin, as a bug report names it.
74
+ */
75
+ export interface BugReportPluginInfo {
76
+ /**
77
+ * The plugin's id.
78
+ */
79
+ readonly id: string;
80
+ /**
81
+ * The plugin's installed version, or `null` when its manifest is not known.
82
+ */
83
+ readonly version: null | string;
84
+ }
85
+ /**
86
+ * Parameters for {@link getBugReportEnvironment}.
87
+ */
88
+ export interface GetBugReportEnvironmentParams {
89
+ /**
90
+ * The Obsidian app instance.
91
+ */
92
+ readonly app: App;
93
+ /**
94
+ * The id of the reporting plugin.
95
+ */
96
+ readonly pluginId: string;
97
+ }
98
+ /**
99
+ * Parameters for {@link getBugReportIssueFormUrl}.
100
+ */
101
+ export interface GetBugReportIssueFormUrlParams extends GetBugReportEnvironmentParams {
102
+ /**
103
+ * The plugin's GitHub repository, as `owner/name`.
104
+ */
105
+ readonly gitHubRepo: string;
106
+ /**
107
+ * The issue's title. Leave it out to keep the form's own default title.
108
+ */
109
+ readonly title?: string;
110
+ }
111
+ /**
112
+ * Parameters for {@link getGitHubIssueFormUrl}.
113
+ */
114
+ export interface GetGitHubIssueFormUrlParams {
115
+ /**
116
+ * The values to prefill, keyed by field `id`.
117
+ */
118
+ readonly fields?: Readonly<Record<string, string>>;
119
+ /**
120
+ * The GitHub repository, as `owner/name`.
121
+ */
122
+ readonly gitHubRepo: string;
123
+ /**
124
+ * The form's file name, under `.github/ISSUE_TEMPLATE`.
125
+ */
126
+ readonly template: string;
127
+ /**
128
+ * The issue's title. Leave it out to keep the form's own default title.
129
+ */
130
+ readonly title?: string;
131
+ }
132
+ /**
133
+ * Renders a bug report's environment as a Markdown list.
134
+ *
135
+ * @param environment - The environment.
136
+ * @returns The Markdown.
137
+ */
138
+ export declare function formatBugReportEnvironment(environment: BugReportEnvironment): string;
139
+ /**
140
+ * Gets the environment a bug report needs: the plugin's version, the other enabled plugins, the
141
+ * Obsidian and installer versions, the platform and the operating system.
142
+ *
143
+ * @param params - The parameters.
144
+ * @returns The environment.
145
+ */
146
+ export declare function getBugReportEnvironment(params: GetBugReportEnvironmentParams): Promise<BugReportEnvironment>;
147
+ /**
148
+ * Gets a link to a plugin's bug-report issue form ({@link BUG_REPORT_ISSUE_FORM_TEMPLATE}), prefilled with
149
+ * the environment, in the fields {@link BugReportIssueFormFieldId} names.
150
+ *
151
+ * @param params - The parameters.
152
+ * @returns The link.
153
+ */
154
+ export declare function getBugReportIssueFormUrl(params: GetBugReportIssueFormUrlParams): Promise<string>;
155
+ /**
156
+ * Gets a link that opens a GitHub issue form with fields prefilled.
157
+ *
158
+ * @param params - The parameters.
159
+ * @returns The link.
160
+ */
161
+ export declare function getGitHubIssueFormUrl(params: GetGitHubIssueFormUrlParams): string;
@@ -87,12 +87,25 @@ var __copyProps = (to, from, except, desc) => {
87
87
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
88
88
  var bulk_operation_progress_exports = {};
89
89
  __export(bulk_operation_progress_exports, {
90
+ BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS: () => BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS,
91
+ holdBulkOperationWhile: () => holdBulkOperationWhile,
90
92
  registerBulkOperationProgressListener: () => registerBulkOperationProgressListener,
91
93
  reportBulkOperationProgress: () => reportBulkOperationProgress
92
94
  });
93
95
  module.exports = __toCommonJS(bulk_operation_progress_exports);
94
96
  var import_obsidian_lib_state = require('./obsidian-lib-state.cjs');
95
97
  const BULK_OPERATION_PROGRESS_STATE_KEY = "bulkOperationProgressV1";
98
+ const BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS = 1e4;
99
+ async function holdBulkOperationWhile(promise) {
100
+ reportBulkOperationProgress();
101
+ const intervalId = window.setInterval(reportBulkOperationProgress, BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS);
102
+ try {
103
+ return await promise;
104
+ } finally {
105
+ window.clearInterval(intervalId);
106
+ reportBulkOperationProgress();
107
+ }
108
+ }
96
109
  function registerBulkOperationProgressListener(listener) {
97
110
  const listeners = getListeners();
98
111
  listeners.add(listener);
@@ -114,7 +127,9 @@ function getListeners() {
114
127
  }
115
128
  // Annotate the CommonJS export names for ESM import in node:
116
129
  0 && (module.exports = {
130
+ BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS,
131
+ holdBulkOperationWhile,
117
132
  registerBulkOperationProgressListener,
118
133
  reportBulkOperationProgress
119
134
  });
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWxrLW9wZXJhdGlvbi1wcm9ncmVzcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSByZWFsbS13aWRlIHByb2dyZXNzIHNpZ25hbCBmb3IgYnVsayBvcGVyYXRpb25zLlxuICpcbiAqIEEgYnVsayBvcGVyYXRpb24gd3JhcHBlZCBpbiBnaXQgY29tbWl0cyBob2xkcyBhIGxlYXNlIGxvY2sgd2hvc2UgaGVhcnRiZWF0IG11c3QgYmUgcmVmcmVzaGVkIGJ5IHRoZSBvcGVyYXRpb24nc1xuICogb3duIHByb2dyZXNzLCBuZXZlciBieSBhIGZyZWUtcnVubmluZyB0aW1lciwgc28gYSBodW5nIG9wZXJhdGlvbiBnb2VzIHN0YWxlIGxpa2UgYSBjcmFzaGVkIG9uZS4gUmF0aGVyIHRoYW5cbiAqIHRocmVhZGluZyBhIGNhbGxiYWNrIHRocm91Z2ggZXZlcnkgcGx1Z2luJ3MgY2FsbCBjaGFpbiwgdGhlIHdyYXBwZXIgc3Vic2NyaWJlcyBoZXJlIHdoaWxlIGl0IHJ1bnMsIGFuZFxuICoge0BsaW5rIGxvb3B9IHJlcG9ydHMgYWZ0ZXIgZXZlcnkgaXRlbSBpdCBwcm9jZXNzZXMuIENvZGUgdGhhdCBkcml2ZXMgYSBidWxrIG9wZXJhdGlvbiB3aXRob3V0IGBsb29wKClgIGNhbGxzXG4gKiB7QGxpbmsgcmVwb3J0QnVsa09wZXJhdGlvblByb2dyZXNzfSBpdHNlbGYuXG4gKlxuICogVGhlIGxpc3RlbmVyIHNldCBsaXZlcyBpbiB0aGUgc2hhcmVkLXN0YXRlIGJhZyB1bmRlciBhIHZlcnNpb25lZCBrZXksIHNvIGEgYGxvb3AoKWAgYnVuZGxlZCBieSBvbmUgcGx1Z2luJ3MgY29weVxuICogb2YgdGhpcyBsaWJyYXJ5IHJlYWNoZXMgYSBsaXN0ZW5lciByZWdpc3RlcmVkIGJ5IGFub3RoZXIncy4gSXRzIHNoYXBlIGlzIGEgY3Jvc3MtY29weSB3aXJlIGZvcm1hdDogYSBgU2V0YCBvZlxuICogcGxhaW4gZnVuY3Rpb25zLCByZWFkIHN0cnVjdHVyYWxseS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuXG4vKipcbiAqIEEgbGlzdGVuZXIgbm90aWZpZWQgd2hlbmV2ZXIgYSBidWxrIG9wZXJhdGlvbiBtYWtlcyBwcm9ncmVzcy5cbiAqL1xuZXhwb3J0IHR5cGUgQnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXIgPSAoKSA9PiB2b2lkO1xuXG5jb25zdCBCVUxLX09QRVJBVElPTl9QUk9HUkVTU19TVEFURV9LRVkgPSAnYnVsa09wZXJhdGlvblByb2dyZXNzVjEnO1xuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gYnVsay1vcGVyYXRpb24gcHJvZ3Jlc3MuXG4gKlxuICogQHBhcmFtIGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIHRvIG5vdGlmeSBvbiBldmVyeSBwcm9ncmVzcyByZXBvcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdW5zdWJzY3JpYmVzIHRoZSBsaXN0ZW5lci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXI6IEJ1bGtPcGVyYXRpb25Qcm9ncmVzc0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpO1xuICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHRoYXQgYSBidWxrIG9wZXJhdGlvbiBoYXMgbWFkZSBwcm9ncmVzcywgc3VjaCBhcyBmaW5pc2hpbmcgb25lIGl0ZW0uXG4gKlxuICogQSBsaXN0ZW5lciB0aGF0IHRocm93cyBpcyBza2lwcGVkLCBzbyBhIHByb2dyZXNzIHJlcG9ydCBjYW4gbmV2ZXIgZmFpbCB0aGUgb3BlcmF0aW9uIHJlcG9ydGluZyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydEJ1bGtPcGVyYXRpb25Qcm9ncmVzcygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBnZXRMaXN0ZW5lcnMoKSkge1xuICAgIHRyeSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdCdWxrIG9wZXJhdGlvbiBwcm9ncmVzcyBsaXN0ZW5lciBmYWlsZWQnLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldExpc3RlbmVycygpOiBTZXQ8QnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXI+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGUoQlVMS19PUEVSQVRJT05fUFJPR1JFU1NfU1RBVEVfS0VZLCBuZXcgU2V0PEJ1bGtPcGVyYXRpb25Qcm9ncmVzc0xpc3RlbmVyPigpKS52YWx1ZTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBLGdDQUFvQztBQU9wQyxNQUFNLG9DQUFvQztBQVFuQyxTQUFTLHNDQUFzQyxVQUFxRDtBQUN6RyxRQUFNLFlBQVksYUFBYTtBQUMvQixZQUFVLElBQUksUUFBUTtBQUN0QixTQUFPLE1BQU07QUFDWCxjQUFVLE9BQU8sUUFBUTtBQUFBLEVBQzNCO0FBQ0Y7QUFPTyxTQUFTLDhCQUFvQztBQUNsRCxhQUFXLFlBQVksYUFBYSxHQUFHO0FBQ3JDLFFBQUk7QUFDRixlQUFTO0FBQUEsSUFDWCxTQUFTLE9BQU87QUFDZCxjQUFRLE1BQU0sMkNBQTJDLEtBQUs7QUFBQSxJQUNoRTtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsZUFBbUQ7QUFDMUQsYUFBTywrQ0FBb0IsbUNBQW1DLG9CQUFJLElBQW1DLENBQUMsRUFBRTtBQUMxRzsiLCJuYW1lcyI6W119
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWxrLW9wZXJhdGlvbi1wcm9ncmVzcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSByZWFsbS13aWRlIHByb2dyZXNzIHNpZ25hbCBmb3IgYnVsayBvcGVyYXRpb25zLlxuICpcbiAqIEEgYnVsayBvcGVyYXRpb24gd3JhcHBlZCBpbiBnaXQgY29tbWl0cyBob2xkcyBhIGxlYXNlIGxvY2sgd2hvc2UgaGVhcnRiZWF0IG11c3QgYmUgcmVmcmVzaGVkIGJ5IHRoZSBvcGVyYXRpb24nc1xuICogb3duIHByb2dyZXNzLCBuZXZlciBieSBhIGZyZWUtcnVubmluZyB0aW1lciwgc28gYSBodW5nIG9wZXJhdGlvbiBnb2VzIHN0YWxlIGxpa2UgYSBjcmFzaGVkIG9uZS4gUmF0aGVyIHRoYW5cbiAqIHRocmVhZGluZyBhIGNhbGxiYWNrIHRocm91Z2ggZXZlcnkgcGx1Z2luJ3MgY2FsbCBjaGFpbiwgdGhlIHdyYXBwZXIgc3Vic2NyaWJlcyBoZXJlIHdoaWxlIGl0IHJ1bnMsIGFuZFxuICoge0BsaW5rIGxvb3B9IHJlcG9ydHMgYWZ0ZXIgZXZlcnkgaXRlbSBpdCBwcm9jZXNzZXMuIENvZGUgdGhhdCBkcml2ZXMgYSBidWxrIG9wZXJhdGlvbiB3aXRob3V0IGBsb29wKClgIGNhbGxzXG4gKiB7QGxpbmsgcmVwb3J0QnVsa09wZXJhdGlvblByb2dyZXNzfSBpdHNlbGYuXG4gKlxuICogQW4gb3BlcmF0aW9uIHdhaXRpbmcgb24gdGhlIHVzZXIgKGEgY29uZmlybWF0aW9uLCBhIHBpY2tlcikgbWFrZXMgbm8gcHJvZ3Jlc3MsIHlldCBpdCBpcyBub3QgaHVuZy4gV2hpbGUgc3VjaCBhXG4gKiBkaWFsb2cgaXMgb3Blbiwge0BsaW5rIGhvbGRCdWxrT3BlcmF0aW9uV2hpbGV9IHJlcG9ydHMgb24gYW4gaW50ZXJ2YWwsIHNjb3BlZCB0byB0aGF0IG9uZSBwcm9taXNlOiB0aGUgdGltZXJcbiAqIHN0b3BzIHRoZSBtb21lbnQgdGhlIGRpYWxvZyBzZXR0bGVzLCBzbyBhIGh1bmcgb3BlcmF0aW9uIG91dHNpZGUgYSBkaWFsb2cgc3RpbGwgZ29lcyBzdGFsZS4gRXZlcnkgbW9kYWwgaGVscGVyIG9mXG4gKiB0aGlzIGxpYnJhcnkgYWxyZWFkeSBob2xkcyB0aHJvdWdoIGBzaG93TW9kYWxgLlxuICpcbiAqIFRoZSBsaXN0ZW5lciBzZXQgbGl2ZXMgaW4gdGhlIHNoYXJlZC1zdGF0ZSBiYWcgdW5kZXIgYSB2ZXJzaW9uZWQga2V5LCBzbyBhIGBsb29wKClgIGJ1bmRsZWQgYnkgb25lIHBsdWdpbidzIGNvcHlcbiAqIG9mIHRoaXMgbGlicmFyeSByZWFjaGVzIGEgbGlzdGVuZXIgcmVnaXN0ZXJlZCBieSBhbm90aGVyJ3MuIEl0cyBzaGFwZSBpcyBhIGNyb3NzLWNvcHkgd2lyZSBmb3JtYXQ6IGEgYFNldGAgb2ZcbiAqIHBsYWluIGZ1bmN0aW9ucywgcmVhZCBzdHJ1Y3R1cmFsbHkuXG4gKi9cblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4vb2JzaWRpYW4tbGliLXN0YXRlLnRzJztcblxuLyoqXG4gKiBBIGxpc3RlbmVyIG5vdGlmaWVkIHdoZW5ldmVyIGEgYnVsayBvcGVyYXRpb24gbWFrZXMgcHJvZ3Jlc3MuXG4gKi9cbmV4cG9ydCB0eXBlIEJ1bGtPcGVyYXRpb25Qcm9ncmVzc0xpc3RlbmVyID0gKCkgPT4gdm9pZDtcblxuY29uc3QgQlVMS19PUEVSQVRJT05fUFJPR1JFU1NfU1RBVEVfS0VZID0gJ2J1bGtPcGVyYXRpb25Qcm9ncmVzc1YxJztcblxuLyoqXG4gKiBIb3cgb2Z0ZW4ge0BsaW5rIGhvbGRCdWxrT3BlcmF0aW9uV2hpbGV9IHJlcG9ydHMgcHJvZ3Jlc3Mgd2hpbGUgaXRzIHByb21pc2UgaXMgcGVuZGluZywgd2VsbCBpbnNpZGUgdGhlIGxvY2snc1xuICogc3RhbGVuZXNzIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGNvbnN0IEJVTEtfT1BFUkFUSU9OX0hPTERfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIEtlZXBzIGEgYnVsayBvcGVyYXRpb24ncyBsZWFzZSBsb2NrIGZyZXNoIHdoaWxlIGl0IHdhaXRzIG9uIHNvbWV0aGluZyB0aGF0IGlzIG5vdCBwcm9ncmVzcyBidXQgbm90IGEgaGFuZyBlaXRoZXIsXG4gKiBzdWNoIGFzIGEgZGlhbG9nIHdhaXRpbmcgZm9yIHRoZSB1c2VyLlxuICpcbiAqIFJlcG9ydHMgcHJvZ3Jlc3MgYXQgb25jZSwgdGhlbiBldmVyeSB7QGxpbmsgQlVMS19PUEVSQVRJT05fSE9MRF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFN9IHdoaWxlIHRoZSBwcm9taXNlIGlzXG4gKiBwZW5kaW5nLCBhbmQgb25jZSBtb3JlIHdoZW4gaXQgc2V0dGxlcy4gT3V0c2lkZSBhIGJ1bGsgb3BlcmF0aW9uIGl0IGNvc3RzIG9uZSBpbnRlcnZhbCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBwcm9taXNlJ3MgdmFsdWUuXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIHdhaXQgZm9yLlxuICogQHJldHVybnMgVGhlIHByb21pc2UncyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhvbGRCdWxrT3BlcmF0aW9uV2hpbGU8VD4ocHJvbWlzZTogUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKTtcbiAgY29uc3QgaW50ZXJ2YWxJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbChyZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MsIEJVTEtfT1BFUkFUSU9OX0hPTERfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICByZXBvcnRCdWxrT3BlcmF0aW9uUHJvZ3Jlc3MoKTtcbiAgfVxufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gYnVsay1vcGVyYXRpb24gcHJvZ3Jlc3MuXG4gKlxuICogQHBhcmFtIGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIHRvIG5vdGlmeSBvbiBldmVyeSBwcm9ncmVzcyByZXBvcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdW5zdWJzY3JpYmVzIHRoZSBsaXN0ZW5lci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXIobGlzdGVuZXI6IEJ1bGtPcGVyYXRpb25Qcm9ncmVzc0xpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpO1xuICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHRoYXQgYSBidWxrIG9wZXJhdGlvbiBoYXMgbWFkZSBwcm9ncmVzcywgc3VjaCBhcyBmaW5pc2hpbmcgb25lIGl0ZW0uXG4gKlxuICogQSBsaXN0ZW5lciB0aGF0IHRocm93cyBpcyBza2lwcGVkLCBzbyBhIHByb2dyZXNzIHJlcG9ydCBjYW4gbmV2ZXIgZmFpbCB0aGUgb3BlcmF0aW9uIHJlcG9ydGluZyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9ydEJ1bGtPcGVyYXRpb25Qcm9ncmVzcygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBnZXRMaXN0ZW5lcnMoKSkge1xuICAgIHRyeSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdCdWxrIG9wZXJhdGlvbiBwcm9ncmVzcyBsaXN0ZW5lciBmYWlsZWQnLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldExpc3RlbmVycygpOiBTZXQ8QnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXI+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGUoQlVMS19PUEVSQVRJT05fUFJPR1JFU1NfU1RBVEVfS0VZLCBuZXcgU2V0PEJ1bGtPcGVyYXRpb25Qcm9ncmVzc0xpc3RlbmVyPigpKS52YWx1ZTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXFCQSxnQ0FBb0M7QUFPcEMsTUFBTSxvQ0FBb0M7QUFNbkMsTUFBTSwrQ0FBK0M7QUFhNUQsZUFBc0IsdUJBQTBCLFNBQWlDO0FBQy9FLDhCQUE0QjtBQUM1QixRQUFNLGFBQWEsT0FBTyxZQUFZLDZCQUE2Qiw0Q0FBNEM7QUFDL0csTUFBSTtBQUNGLFdBQU8sTUFBTTtBQUFBLEVBQ2YsVUFBRTtBQUNBLFdBQU8sY0FBYyxVQUFVO0FBQy9CLGdDQUE0QjtBQUFBLEVBQzlCO0FBQ0Y7QUFRTyxTQUFTLHNDQUFzQyxVQUFxRDtBQUN6RyxRQUFNLFlBQVksYUFBYTtBQUMvQixZQUFVLElBQUksUUFBUTtBQUN0QixTQUFPLE1BQU07QUFDWCxjQUFVLE9BQU8sUUFBUTtBQUFBLEVBQzNCO0FBQ0Y7QUFPTyxTQUFTLDhCQUFvQztBQUNsRCxhQUFXLFlBQVksYUFBYSxHQUFHO0FBQ3JDLFFBQUk7QUFDRixlQUFTO0FBQUEsSUFDWCxTQUFTLE9BQU87QUFDZCxjQUFRLE1BQU0sMkNBQTJDLEtBQUs7QUFBQSxJQUNoRTtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsZUFBbUQ7QUFDMUQsYUFBTywrQ0FBb0IsbUNBQW1DLG9CQUFJLElBQW1DLENBQUMsRUFBRTtBQUMxRzsiLCJuYW1lcyI6W119
@@ -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
  *
@@ -121,6 +121,7 @@ __export(case_insensitive_file_index_exports, {
121
121
  });
122
122
  module.exports = __toCommonJS(case_insensitive_file_index_exports);
123
123
  var import_array = require('@mnaoumov/typescript-lib/array');
124
+ var import_obsidian = require('obsidian');
124
125
  var import_obsidian_lib_state = require('./obsidian-lib-state.cjs');
125
126
  const STATE_KEY = "caseInsensitiveFileIndex";
126
127
  class CaseInsensitiveFileIndex {
@@ -150,7 +151,11 @@ class CaseInsensitiveFileIndex {
150
151
  */
151
152
  delete(path) {
152
153
  const key = path.toLowerCase();
154
+ const abstractFile = this.map.get(key);
153
155
  this.map.delete(key);
156
+ if (abstractFile && !(abstractFile instanceof import_obsidian.TFolder)) {
157
+ return;
158
+ }
154
159
  const descendantPrefix = `${key}/`;
155
160
  for (const existingKey of (0, import_array.snapshot)(this.map.keys())) {
156
161
  if (existingKey.startsWith(descendantPrefix)) {
@@ -192,6 +197,9 @@ class CaseInsensitiveFileIndex {
192
197
  const newKey = newAbstractFile.path.toLowerCase();
193
198
  this.map.delete(oldKey);
194
199
  this.map.set(newKey, newAbstractFile);
200
+ if (!(newAbstractFile instanceof import_obsidian.TFolder)) {
201
+ return;
202
+ }
195
203
  const oldDescendantPrefix = `${oldKey}/`;
196
204
  const newDescendantPrefix = `${newKey}/`;
197
205
  for (const [existingKey, existingValue] of (0, import_array.snapshot)(this.map)) {
@@ -223,4 +231,4 @@ function unsetCaseInsensitiveFileIndex(index) {
223
231
  setCaseInsensitiveFileIndex,
224
232
  unsetCaseInsensitiveFileIndex
225
233
  });
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIGFuIG9wdC1pbiBPKDEpIGNhc2UtaW5zZW5zaXRpdmUgcmVzb2x2ZXIgZm9yIE9ic2lkaWFuIHZhdWx0cy5cbiAqXG4gKiBPYnNpZGlhbidzIG5hdGl2ZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm9ic2lkaWFuLm1kL1JlZmVyZW5jZS9UeXBlU2NyaXB0K0FQSS9WYXVsdCB8IFZhdWx0fSByZXNvbHZlc1xuICogYSBzdHJpbmcgcGF0aCBjYXNlLWluc2Vuc2l0aXZlbHkgKHRoZSBXaW5kb3dzL21hY09TIGRlZmF1bHQpIGluIE8oMSkgb24gYSBoaXQgYnV0IHdpdGggYW5cbiAqIE8odmF1bHQpIHNjYW4gb24gYSBtaXNzLiBUaGUgbWlzcyBjYXNlIGlzIHRoZSBob3Qgb25lIGR1cmluZyBkZWxldGlvbiBjYXNjYWRlcywgd2hlcmUgZXh0ZW5zaW9uXG4gKiBjaGVja3MgYW5kIGNhY2hlIGxvb2t1cHMgYXJlIHBlcmZvcm1lZCBvbiBhbHJlYWR5LXJlbW92ZWQgcGF0aHMuIFRoaXMgbW9kdWxlIGJhY2tzIHRoZVxuICogY2FzZS1pbnNlbnNpdGl2ZSBsb29rdXAgd2l0aCBhIGBsb3dlcmNhc2UtcGF0aCDihpIgVEFic3RyYWN0RmlsZWAgaW5kZXggc28gbWlzc2VzIGFyZSBPKDEpIHRvby5cbiAqXG4gKiBUaGUgaW5kZXggaXMgZXhwbGljaXRseSBvcHQtaW46IGEgY29uc3VtZXIgaW5zdGFsbHMgaXQgYnkgbG9hZGluZyBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLm9ic2lkaWFuLm1kL1JlZmVyZW5jZS9UeXBlU2NyaXB0K0FQSS9Db21wb25lbnQgfCBDb21wb25lbnR9IHRoYXQga2VlcHMgaXQgaW5cbiAqIHN5bmMgd2l0aCBgY3JlYXRlYC9gZGVsZXRlYC9gcmVuYW1lYCBldmVudHMgKHNlZSBgQ2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4Q29tcG9uZW50YCkuIFVudGlsIHRoZW4sXG4gKiB0aGUgcmVzb2x1dGlvbiBsYXllciBmYWxscyBiYWNrIHRvIHRoZSBuYXRpdmUgKE8odmF1bHQpLW9uLW1pc3MpIGxvb2t1cCwgc28gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuXG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuXG5jb25zdCBTVEFURV9LRVkgPSAnY2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4JztcblxuLyoqXG4gKiBBbiBPKDEpIGNhc2UtaW5zZW5zaXRpdmUgaW5kZXggb2YgdGhlIGxvYWRlZCBmaWxlcyBhbmQgZm9sZGVycyBvZiBhIHNpbmdsZSB2YXVsdC5cbiAqXG4gKiBUaGUgaW5kZXggbWFwcyB0aGUgbG93ZXJjYXNlZCBwYXRoIG9mIGVhY2ggYWJzdHJhY3QgZmlsZSB0byB0aGUgYWJzdHJhY3QgZmlsZSBpdHNlbGYuIEl0IGlzIGtlcHRcbiAqIGluIHN5bmMgYnkgYW4gb3duaW5nIGNvbXBvbmVudCB0aGF0IGZvcndhcmRzIGBjcmVhdGVgL2BkZWxldGVgL2ByZW5hbWVgIHZhdWx0IGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFRBYnN0cmFjdEZpbGU+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY2FzZS1pbnNlbnNpdGl2ZSBmaWxlIGluZGV4LlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlIHdob3NlIHZhdWx0IHRoaXMgaW5kZXggbWlycm9ycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHApIHt9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gYWJzdHJhY3QgZmlsZSB0byB0aGUgaW5kZXguXG4gICAqXG4gICAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBhZGQuXG4gICAqL1xuICBwdWJsaWMgYWRkKGFic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIHRoaXMubWFwLnNldChhYnN0cmFjdEZpbGUucGF0aC50b0xvd2VyQ2FzZSgpLCBhYnN0cmFjdEZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGFic3RyYWN0IGZpbGUgYXQgdGhlIGdpdmVuIHBhdGggZnJvbSB0aGUgaW5kZXgsIGFsb25nIHdpdGggYWxsIG9mIGl0cyBkZXNjZW5kYW50c1xuICAgKiAoZm9yIGZvbGRlciBkZWxldGlvbnMsIHdoZXJlIE9ic2lkaWFuIHJlbW92ZXMgdGhlIHdob2xlIHN1YnRyZWUpLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBhYnN0cmFjdCBmaWxlIHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyBkZWxldGUocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gcGF0aC50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpO1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcmVmaXggPSBgJHtrZXl9L2A7XG4gICAgZm9yIChjb25zdCBleGlzdGluZ0tleSBvZiBzbmFwc2hvdCh0aGlzLm1hcC5rZXlzKCkpKSB7XG4gICAgICBpZiAoZXhpc3RpbmdLZXkuc3RhcnRzV2l0aChkZXNjZW5kYW50UHJlZml4KSkge1xuICAgICAgICB0aGlzLm1hcC5kZWxldGUoZXhpc3RpbmdLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBhYnN0cmFjdCBmaWxlIGJ5IGl0cyBwYXRoLCBjYXNlLWluc2Vuc2l0aXZlbHksIGluIE8oMSkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMgVGhlIGFic3RyYWN0IGZpbGUgaWYgZm91bmQsIG90aGVyd2lzZSBgbnVsbGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0KHBhdGg6IHN0cmluZyk6IG51bGwgfCBUQWJzdHJhY3RGaWxlIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KHBhdGgudG9Mb3dlckNhc2UoKSkgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGlzIGluZGV4IG1pcnJvcnMgdGhlIGdpdmVuIGFwcGxpY2F0aW9uJ3MgdmF1bHQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gY2hlY2sgYWdhaW5zdC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoaXMgaW5kZXggYmVsb25ncyB0byB0aGUgZ2l2ZW4gYXBwbGljYXRpb24sIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIG93bnNBcHAoYXBwOiBBcHApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcHAgPT09IGFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1rZXlzIGFuIGFic3RyYWN0IGZpbGUgKGFuZCwgZm9yIGZvbGRlcnMsIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMpIGFmdGVyIGEgcmVuYW1lLlxuICAgKlxuICAgKiBPYnNpZGlhbiBmaXJlcyBhIHNpbmdsZSBgcmVuYW1lYCBldmVudCBmb3IgdGhlIHJlbmFtZWQgYWJzdHJhY3QgZmlsZSBhbmQgdXBkYXRlcyBpdHNcbiAgICogZGVzY2VuZGFudHMnIHBhdGhzIGluIHBsYWNlIHdpdGhvdXQgZmlyaW5nIHBlci1kZXNjZW5kYW50IGV2ZW50cywgc28gZGVzY2VuZGFudCBrZXlzIGFyZVxuICAgKiByZWNvbXB1dGVkIGhlcmUgYnkgc3dhcHBpbmcgdGhlIG9sZCBwYXRoIHByZWZpeCBmb3IgdGhlIG5ldyBvbmUuIEhhbmRsZXMgY2FzZS1vbmx5IHJlbmFtZXMgKHRoZVxuICAgKiBvbGQgYW5kIG5ldyBrZXlzIGNvaW5jaWRlKS5cbiAgICpcbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgYWJzdHJhY3QgZmlsZSBoYWQgYmVmb3JlIHRoZSByZW5hbWUuXG4gICAqIEBwYXJhbSBuZXdBYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB3aXRoIGl0cyB1cGRhdGVkIChwb3N0LXJlbmFtZSkgcGF0aC5cbiAgICovXG4gIHB1YmxpYyByZW5hbWUob2xkUGF0aDogc3RyaW5nLCBuZXdBYnN0cmFjdEZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBjb25zdCBvbGRLZXkgPSBvbGRQYXRoLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbmV3S2V5ID0gbmV3QWJzdHJhY3RGaWxlLnBhdGgudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLm1hcC5kZWxldGUob2xkS2V5KTtcbiAgICB0aGlzLm1hcC5zZXQobmV3S2V5LCBuZXdBYnN0cmFjdEZpbGUpO1xuXG4gICAgY29uc3Qgb2xkRGVzY2VuZGFudFByZWZpeCA9IGAke29sZEtleX0vYDtcbiAgICBjb25zdCBuZXdEZXNjZW5kYW50UHJlZml4ID0gYCR7bmV3S2V5fS9gO1xuICAgIGZvciAoY29uc3QgW2V4aXN0aW5nS2V5LCBleGlzdGluZ1ZhbHVlXSBvZiBzbmFwc2hvdCh0aGlzLm1hcCkpIHtcbiAgICAgIGlmICghZXhpc3RpbmdLZXkuc3RhcnRzV2l0aChvbGREZXNjZW5kYW50UHJlZml4KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYXAuZGVsZXRlKGV4aXN0aW5nS2V5KTtcbiAgICAgIHRoaXMubWFwLnNldChuZXdEZXNjZW5kYW50UHJlZml4ICsgZXhpc3RpbmdLZXkuc2xpY2Uob2xkRGVzY2VuZGFudFByZWZpeC5sZW5ndGgpLCBleGlzdGluZ1ZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGluc3RhbGxlZCBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgaW5kZXggZm9yIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiwgaWYgYW55LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2Ugd2hvc2UgaW5kZXggdG8gcmV0cmlldmUuXG4gKiBAcmV0dXJucyBUaGUgaW5kZXggaWYgb25lIGlzIGluc3RhbGxlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgb3RoZXJ3aXNlIGBudWxsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleChhcHA6IEFwcCk6IENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleCB8IG51bGwge1xuICBjb25zdCBpbmRleCA9IGdldE9ic2lkaWFuTGliU3RhdGU8Q2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4IHwgbnVsbD4oU1RBVEVfS0VZLCBudWxsKS52YWx1ZTtcbiAgcmV0dXJuIGluZGV4Py5vd25zQXBwKGFwcCkgPyBpbmRleCA6IG51bGw7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgaW5kZXggYXMgdGhlIGFjdGl2ZSByZXNvbHZlci5cbiAqXG4gKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggdG8gaW5zdGFsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleChpbmRleDogQ2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4KTogdm9pZCB7XG4gIGdldE9ic2lkaWFuTGliU3RhdGU8Q2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4IHwgbnVsbD4oU1RBVEVfS0VZLCBudWxsKS52YWx1ZSA9IGluZGV4O1xufVxuXG4vKipcbiAqIFVuaW5zdGFsbHMgYSBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgaW5kZXgsIGJ1dCBvbmx5IGlmIGl0IGlzIHRoZSBjdXJyZW50bHktaW5zdGFsbGVkIG9uZS5cbiAqXG4gKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggdG8gdW5pbnN0YWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXgoaW5kZXg6IENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleCk6IHZvaWQge1xuICBjb25zdCB3cmFwcGVyID0gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXggfCBudWxsPihTVEFURV9LRVksIG51bGwpO1xuICBpZiAod3JhcHBlci52YWx1ZSA9PT0gaW5kZXgpIHtcbiAgICB3cmFwcGVyLnZhbHVlID0gbnVsbDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBc0JBLG1CQUF5QjtBQUV6QixnQ0FBb0M7QUFFcEMsTUFBTSxZQUFZO0FBUVgsTUFBTSx5QkFBeUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRN0IsWUFBK0IsS0FBVTtBQUFWO0FBQUEsRUFBVztBQUFBLEVBQVg7QUFBQSxFQVByQixNQUFNLG9CQUFJLElBQTJCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYy9DLElBQUksY0FBbUM7QUFDNUMsU0FBSyxJQUFJLElBQUksYUFBYSxLQUFLLFlBQVksR0FBRyxZQUFZO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLE9BQU8sTUFBb0I7QUFDaEMsVUFBTSxNQUFNLEtBQUssWUFBWTtBQUM3QixTQUFLLElBQUksT0FBTyxHQUFHO0FBQ25CLFVBQU0sbUJBQW1CLEdBQUcsR0FBRztBQUMvQixlQUFXLG1CQUFlLHVCQUFTLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRztBQUNuRCxVQUFJLFlBQVksV0FBVyxnQkFBZ0IsR0FBRztBQUM1QyxhQUFLLElBQUksT0FBTyxXQUFXO0FBQUEsTUFDN0I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sSUFBSSxNQUFvQztBQUM3QyxXQUFPLEtBQUssSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLEtBQUs7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sUUFBUSxLQUFtQjtBQUNoQyxXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYU8sT0FBTyxTQUFpQixpQkFBc0M7QUFDbkUsVUFBTSxTQUFTLFFBQVEsWUFBWTtBQUNuQyxVQUFNLFNBQVMsZ0JBQWdCLEtBQUssWUFBWTtBQUNoRCxTQUFLLElBQUksT0FBTyxNQUFNO0FBQ3RCLFNBQUssSUFBSSxJQUFJLFFBQVEsZUFBZTtBQUVwQyxVQUFNLHNCQUFzQixHQUFHLE1BQU07QUFDckMsVUFBTSxzQkFBc0IsR0FBRyxNQUFNO0FBQ3JDLGVBQVcsQ0FBQyxhQUFhLGFBQWEsU0FBSyx1QkFBUyxLQUFLLEdBQUcsR0FBRztBQUM3RCxVQUFJLENBQUMsWUFBWSxXQUFXLG1CQUFtQixHQUFHO0FBQ2hEO0FBQUEsTUFDRjtBQUVBLFdBQUssSUFBSSxPQUFPLFdBQVc7QUFDM0IsV0FBSyxJQUFJLElBQUksc0JBQXNCLFlBQVksTUFBTSxvQkFBb0IsTUFBTSxHQUFHLGFBQWE7QUFBQSxJQUNqRztBQUFBLEVBQ0Y7QUFDRjtBQVFPLFNBQVMsNEJBQTRCLEtBQTJDO0FBQ3JGLFFBQU0sWUFBUSwrQ0FBcUQsV0FBVyxJQUFJLEVBQUU7QUFDcEYsU0FBTyxPQUFPLFFBQVEsR0FBRyxJQUFJLFFBQVE7QUFDdkM7QUFPTyxTQUFTLDRCQUE0QixPQUF1QztBQUNqRixxREFBcUQsV0FBVyxJQUFJLEVBQUUsUUFBUTtBQUNoRjtBQU9PLFNBQVMsOEJBQThCLE9BQXVDO0FBQ25GLFFBQU0sY0FBVSwrQ0FBcUQsV0FBVyxJQUFJO0FBQ3BGLE1BQUksUUFBUSxVQUFVLE9BQU87QUFDM0IsWUFBUSxRQUFRO0FBQUEsRUFDbEI7QUFDRjsiLCJuYW1lcyI6W119
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIGFuIG9wdC1pbiBPKDEpIGNhc2UtaW5zZW5zaXRpdmUgcmVzb2x2ZXIgZm9yIE9ic2lkaWFuIHZhdWx0cy5cbiAqXG4gKiBPYnNpZGlhbidzIG5hdGl2ZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLm9ic2lkaWFuLm1kL1JlZmVyZW5jZS9UeXBlU2NyaXB0K0FQSS9WYXVsdCB8IFZhdWx0fSByZXNvbHZlc1xuICogYSBzdHJpbmcgcGF0aCBjYXNlLWluc2Vuc2l0aXZlbHkgKHRoZSBXaW5kb3dzL21hY09TIGRlZmF1bHQpIGluIE8oMSkgb24gYSBoaXQgYnV0IHdpdGggYW5cbiAqIE8odmF1bHQpIHNjYW4gb24gYSBtaXNzLiBUaGUgbWlzcyBjYXNlIGlzIHRoZSBob3Qgb25lIGR1cmluZyBkZWxldGlvbiBjYXNjYWRlcywgd2hlcmUgZXh0ZW5zaW9uXG4gKiBjaGVja3MgYW5kIGNhY2hlIGxvb2t1cHMgYXJlIHBlcmZvcm1lZCBvbiBhbHJlYWR5LXJlbW92ZWQgcGF0aHMuIFRoaXMgbW9kdWxlIGJhY2tzIHRoZVxuICogY2FzZS1pbnNlbnNpdGl2ZSBsb29rdXAgd2l0aCBhIGBsb3dlcmNhc2UtcGF0aCDihpIgVEFic3RyYWN0RmlsZWAgaW5kZXggc28gbWlzc2VzIGFyZSBPKDEpIHRvby5cbiAqXG4gKiBUaGUgaW5kZXggaXMgZXhwbGljaXRseSBvcHQtaW46IGEgY29uc3VtZXIgaW5zdGFsbHMgaXQgYnkgbG9hZGluZyBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLm9ic2lkaWFuLm1kL1JlZmVyZW5jZS9UeXBlU2NyaXB0K0FQSS9Db21wb25lbnQgfCBDb21wb25lbnR9IHRoYXQga2VlcHMgaXQgaW5cbiAqIHN5bmMgd2l0aCBgY3JlYXRlYC9gZGVsZXRlYC9gcmVuYW1lYCBldmVudHMgKHNlZSBgQ2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4Q29tcG9uZW50YCkuIFVudGlsIHRoZW4sXG4gKiB0aGUgcmVzb2x1dGlvbiBsYXllciBmYWxscyBiYWNrIHRvIHRoZSBuYXRpdmUgKE8odmF1bHQpLW9uLW1pc3MpIGxvb2t1cCwgc28gYmVoYXZpb3IgaXMgdW5jaGFuZ2VkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuaW1wb3J0IHsgVEZvbGRlciB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4vb2JzaWRpYW4tbGliLXN0YXRlLnRzJztcblxuY29uc3QgU1RBVEVfS0VZID0gJ2Nhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleCc7XG5cbi8qKlxuICogQW4gTygxKSBjYXNlLWluc2Vuc2l0aXZlIGluZGV4IG9mIHRoZSBsb2FkZWQgZmlsZXMgYW5kIGZvbGRlcnMgb2YgYSBzaW5nbGUgdmF1bHQuXG4gKlxuICogVGhlIGluZGV4IG1hcHMgdGhlIGxvd2VyY2FzZWQgcGF0aCBvZiBlYWNoIGFic3RyYWN0IGZpbGUgdG8gdGhlIGFic3RyYWN0IGZpbGUgaXRzZWxmLiBJdCBpcyBrZXB0XG4gKiBpbiBzeW5jIGJ5IGFuIG93bmluZyBjb21wb25lbnQgdGhhdCBmb3J3YXJkcyBgY3JlYXRlYC9gZGVsZXRlYC9gcmVuYW1lYCB2YXVsdCBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXgge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUQWJzdHJhY3RGaWxlPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZSB3aG9zZSB2YXVsdCB0aGlzIGluZGV4IG1pcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwKSB7fVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGFic3RyYWN0IGZpbGUgdG8gdGhlIGluZGV4LlxuICAgKlxuICAgKiBAcGFyYW0gYWJzdHJhY3RGaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgdG8gYWRkLlxuICAgKi9cbiAgcHVibGljIGFkZChhYnN0cmFjdEZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQoYWJzdHJhY3RGaWxlLnBhdGgudG9Mb3dlckNhc2UoKSwgYWJzdHJhY3RGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBhYnN0cmFjdCBmaWxlIGF0IHRoZSBnaXZlbiBwYXRoIGZyb20gdGhlIGluZGV4LCBhbG9uZyB3aXRoIGFsbCBvZiBpdHMgZGVzY2VuZGFudHNcbiAgICogKGZvciBmb2xkZXIgZGVsZXRpb25zLCB3aGVyZSBPYnNpZGlhbiByZW1vdmVzIHRoZSB3aG9sZSBzdWJ0cmVlKS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgYWJzdHJhY3QgZmlsZSB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBhYnN0cmFjdEZpbGUgPSB0aGlzLm1hcC5nZXQoa2V5KTtcbiAgICB0aGlzLm1hcC5kZWxldGUoa2V5KTtcbiAgICAvLyBPbmx5IGEgZm9sZGVyIGhhcyBkZXNjZW5kYW50czsgc2Nhbm5pbmcgdGhlIHdob2xlIGluZGV4IGZvciBhIGZpbGUncyBtYWRlIGV2ZXJ5IGRlbGV0ZSBPKHZhdWx0KS5cbiAgICBpZiAoYWJzdHJhY3RGaWxlICYmICEoYWJzdHJhY3RGaWxlIGluc3RhbmNlb2YgVEZvbGRlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGVzY2VuZGFudFByZWZpeCA9IGAke2tleX0vYDtcbiAgICBmb3IgKGNvbnN0IGV4aXN0aW5nS2V5IG9mIHNuYXBzaG90KHRoaXMubWFwLmtleXMoKSkpIHtcbiAgICAgIGlmIChleGlzdGluZ0tleS5zdGFydHNXaXRoKGRlc2NlbmRhbnRQcmVmaXgpKSB7XG4gICAgICAgIHRoaXMubWFwLmRlbGV0ZShleGlzdGluZ0tleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIGFic3RyYWN0IGZpbGUgYnkgaXRzIHBhdGgsIGNhc2UtaW5zZW5zaXRpdmVseSwgaW4gTygxKS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byByZXNvbHZlLlxuICAgKiBAcmV0dXJucyBUaGUgYWJzdHJhY3QgZmlsZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIGBudWxsYC5cbiAgICovXG4gIHB1YmxpYyBnZXQocGF0aDogc3RyaW5nKTogbnVsbCB8IFRBYnN0cmFjdEZpbGUge1xuICAgIHJldHVybiB0aGlzLm1hcC5nZXQocGF0aC50b0xvd2VyQ2FzZSgpKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgaW5kZXggbWlycm9ycyB0aGUgZ2l2ZW4gYXBwbGljYXRpb24ncyB2YXVsdC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB0byBjaGVjayBhZ2FpbnN0LlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhpcyBpbmRleCBiZWxvbmdzIHRvIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgb3duc0FwcChhcHA6IEFwcCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFwcCA9PT0gYXBwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLWtleXMgYW4gYWJzdHJhY3QgZmlsZSAoYW5kLCBmb3IgZm9sZGVycywgYWxsIG9mIGl0cyBkZXNjZW5kYW50cykgYWZ0ZXIgYSByZW5hbWUuXG4gICAqXG4gICAqIE9ic2lkaWFuIGZpcmVzIGEgc2luZ2xlIGByZW5hbWVgIGV2ZW50IGZvciB0aGUgcmVuYW1lZCBhYnN0cmFjdCBmaWxlIGFuZCB1cGRhdGVzIGl0c1xuICAgKiBkZXNjZW5kYW50cycgcGF0aHMgaW4gcGxhY2Ugd2l0aG91dCBmaXJpbmcgcGVyLWRlc2NlbmRhbnQgZXZlbnRzLCBzbyBkZXNjZW5kYW50IGtleXMgYXJlXG4gICAqIHJlY29tcHV0ZWQgaGVyZSBieSBzd2FwcGluZyB0aGUgb2xkIHBhdGggcHJlZml4IGZvciB0aGUgbmV3IG9uZS4gSGFuZGxlcyBjYXNlLW9ubHkgcmVuYW1lcyAodGhlXG4gICAqIG9sZCBhbmQgbmV3IGtleXMgY29pbmNpZGUpLlxuICAgKlxuICAgKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSBhYnN0cmFjdCBmaWxlIGhhZCBiZWZvcmUgdGhlIHJlbmFtZS5cbiAgICogQHBhcmFtIG5ld0Fic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHdpdGggaXRzIHVwZGF0ZWQgKHBvc3QtcmVuYW1lKSBwYXRoLlxuICAgKi9cbiAgcHVibGljIHJlbmFtZShvbGRQYXRoOiBzdHJpbmcsIG5ld0Fic3RyYWN0RmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IG9sZEtleSA9IG9sZFBhdGgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBuZXdLZXkgPSBuZXdBYnN0cmFjdEZpbGUucGF0aC50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMubWFwLmRlbGV0ZShvbGRLZXkpO1xuICAgIHRoaXMubWFwLnNldChuZXdLZXksIG5ld0Fic3RyYWN0RmlsZSk7XG4gICAgLy8gT25seSBhIGZvbGRlciBoYXMgZGVzY2VuZGFudHM7IHNjYW5uaW5nIHRoZSB3aG9sZSBpbmRleCBmb3IgYSBmaWxlJ3MgbWFkZSBldmVyeSByZW5hbWUgTyh2YXVsdCkuXG4gICAgaWYgKCEobmV3QWJzdHJhY3RGaWxlIGluc3RhbmNlb2YgVEZvbGRlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGREZXNjZW5kYW50UHJlZml4ID0gYCR7b2xkS2V5fS9gO1xuICAgIGNvbnN0IG5ld0Rlc2NlbmRhbnRQcmVmaXggPSBgJHtuZXdLZXl9L2A7XG4gICAgZm9yIChjb25zdCBbZXhpc3RpbmdLZXksIGV4aXN0aW5nVmFsdWVdIG9mIHNuYXBzaG90KHRoaXMubWFwKSkge1xuICAgICAgaWYgKCFleGlzdGluZ0tleS5zdGFydHNXaXRoKG9sZERlc2NlbmRhbnRQcmVmaXgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1hcC5kZWxldGUoZXhpc3RpbmdLZXkpO1xuICAgICAgdGhpcy5tYXAuc2V0KG5ld0Rlc2NlbmRhbnRQcmVmaXggKyBleGlzdGluZ0tleS5zbGljZShvbGREZXNjZW5kYW50UHJlZml4Lmxlbmd0aCksIGV4aXN0aW5nVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgaW5zdGFsbGVkIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBpbmRleCBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uLCBpZiBhbnkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZSB3aG9zZSBpbmRleCB0byByZXRyaWV2ZS5cbiAqIEByZXR1cm5zIFRoZSBpbmRleCBpZiBvbmUgaXMgaW5zdGFsbGVkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBvdGhlcndpc2UgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4KGFwcDogQXBwKTogQ2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4IHwgbnVsbCB7XG4gIGNvbnN0IGluZGV4ID0gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXggfCBudWxsPihTVEFURV9LRVksIG51bGwpLnZhbHVlO1xuICByZXR1cm4gaW5kZXg/Lm93bnNBcHAoYXBwKSA/IGluZGV4IDogbnVsbDtcbn1cblxuLyoqXG4gKiBJbnN0YWxscyBhIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBpbmRleCBhcyB0aGUgYWN0aXZlIHJlc29sdmVyLlxuICpcbiAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCB0byBpbnN0YWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4KGluZGV4OiBDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXgpOiB2b2lkIHtcbiAgZ2V0T2JzaWRpYW5MaWJTdGF0ZTxDYXNlSW5zZW5zaXRpdmVGaWxlSW5kZXggfCBudWxsPihTVEFURV9LRVksIG51bGwpLnZhbHVlID0gaW5kZXg7XG59XG5cbi8qKlxuICogVW5pbnN0YWxscyBhIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBpbmRleCwgYnV0IG9ubHkgaWYgaXQgaXMgdGhlIGN1cnJlbnRseS1pbnN0YWxsZWQgb25lLlxuICpcbiAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCB0byB1bmluc3RhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNldENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleChpbmRleDogQ2FzZUluc2Vuc2l0aXZlRmlsZUluZGV4KTogdm9pZCB7XG4gIGNvbnN0IHdyYXBwZXIgPSBnZXRPYnNpZGlhbkxpYlN0YXRlPENhc2VJbnNlbnNpdGl2ZUZpbGVJbmRleCB8IG51bGw+KFNUQVRFX0tFWSwgbnVsbCk7XG4gIGlmICh3cmFwcGVyLnZhbHVlID09PSBpbmRleCkge1xuICAgIHdyYXBwZXIudmFsdWUgPSBudWxsO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzQkEsbUJBQXlCO0FBQ3pCLHNCQUF3QjtBQUV4QixnQ0FBb0M7QUFFcEMsTUFBTSxZQUFZO0FBUVgsTUFBTSx5QkFBeUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRN0IsWUFBK0IsS0FBVTtBQUFWO0FBQUEsRUFBVztBQUFBLEVBQVg7QUFBQSxFQVByQixNQUFNLG9CQUFJLElBQTJCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYy9DLElBQUksY0FBbUM7QUFDNUMsU0FBSyxJQUFJLElBQUksYUFBYSxLQUFLLFlBQVksR0FBRyxZQUFZO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLE9BQU8sTUFBb0I7QUFDaEMsVUFBTSxNQUFNLEtBQUssWUFBWTtBQUM3QixVQUFNLGVBQWUsS0FBSyxJQUFJLElBQUksR0FBRztBQUNyQyxTQUFLLElBQUksT0FBTyxHQUFHO0FBRW5CLFFBQUksZ0JBQWdCLEVBQUUsd0JBQXdCLDBCQUFVO0FBQ3REO0FBQUEsSUFDRjtBQUNBLFVBQU0sbUJBQW1CLEdBQUcsR0FBRztBQUMvQixlQUFXLG1CQUFlLHVCQUFTLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBRztBQUNuRCxVQUFJLFlBQVksV0FBVyxnQkFBZ0IsR0FBRztBQUM1QyxhQUFLLElBQUksT0FBTyxXQUFXO0FBQUEsTUFDN0I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sSUFBSSxNQUFvQztBQUM3QyxXQUFPLEtBQUssSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLEtBQUs7QUFBQSxFQUM3QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sUUFBUSxLQUFtQjtBQUNoQyxXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYU8sT0FBTyxTQUFpQixpQkFBc0M7QUFDbkUsVUFBTSxTQUFTLFFBQVEsWUFBWTtBQUNuQyxVQUFNLFNBQVMsZ0JBQWdCLEtBQUssWUFBWTtBQUNoRCxTQUFLLElBQUksT0FBTyxNQUFNO0FBQ3RCLFNBQUssSUFBSSxJQUFJLFFBQVEsZUFBZTtBQUVwQyxRQUFJLEVBQUUsMkJBQTJCLDBCQUFVO0FBQ3pDO0FBQUEsSUFDRjtBQUVBLFVBQU0sc0JBQXNCLEdBQUcsTUFBTTtBQUNyQyxVQUFNLHNCQUFzQixHQUFHLE1BQU07QUFDckMsZUFBVyxDQUFDLGFBQWEsYUFBYSxTQUFLLHVCQUFTLEtBQUssR0FBRyxHQUFHO0FBQzdELFVBQUksQ0FBQyxZQUFZLFdBQVcsbUJBQW1CLEdBQUc7QUFDaEQ7QUFBQSxNQUNGO0FBRUEsV0FBSyxJQUFJLE9BQU8sV0FBVztBQUMzQixXQUFLLElBQUksSUFBSSxzQkFBc0IsWUFBWSxNQUFNLG9CQUFvQixNQUFNLEdBQUcsYUFBYTtBQUFBLElBQ2pHO0FBQUEsRUFDRjtBQUNGO0FBUU8sU0FBUyw0QkFBNEIsS0FBMkM7QUFDckYsUUFBTSxZQUFRLCtDQUFxRCxXQUFXLElBQUksRUFBRTtBQUNwRixTQUFPLE9BQU8sUUFBUSxHQUFHLElBQUksUUFBUTtBQUN2QztBQU9PLFNBQVMsNEJBQTRCLE9BQXVDO0FBQ2pGLHFEQUFxRCxXQUFXLElBQUksRUFBRSxRQUFRO0FBQ2hGO0FBT08sU0FBUyw4QkFBOEIsT0FBdUM7QUFDbkYsUUFBTSxjQUFVLCtDQUFxRCxXQUFXLElBQUk7QUFDcEYsTUFBSSxRQUFRLFVBQVUsT0FBTztBQUMzQixZQUFRLFFBQVE7QUFBQSxFQUNsQjtBQUNGOyIsIm5hbWVzIjpbXX0=