@mnaoumov/obsidian-lib 10.8.0 → 10.9.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 (50) hide show
  1. package/README.md +4 -0
  2. package/dist/lib/cjs/__merged.cjs +15 -1
  3. package/dist/lib/cjs/__merged.d.cts +3 -1
  4. package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
  5. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
  6. package/dist/lib/cjs/community-plugins.cjs +2 -2
  7. package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
  8. package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
  9. package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
  10. package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
  11. package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
  12. package/dist/lib/cjs/data-stores/shared-data-store.cjs +15 -4
  13. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
  14. package/dist/lib/cjs/folder-note.cjs +5 -5
  15. package/dist/lib/cjs/formula-function.cjs +152 -0
  16. package/dist/lib/cjs/formula-function.d.cts +98 -0
  17. package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
  18. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  19. package/dist/lib/cjs/index.cjs +7 -1
  20. package/dist/lib/cjs/index.d.cts +2 -0
  21. package/dist/lib/cjs/link.cjs +12 -12
  22. package/dist/lib/cjs/markdown.cjs +7 -7
  23. package/dist/lib/cjs/vault.cjs +2 -2
  24. package/dist/lib/cjs/virtual-file.cjs +340 -0
  25. package/dist/lib/cjs/virtual-file.d.cts +48 -0
  26. package/dist/lib/esm/__merged.d.mts +3 -1
  27. package/dist/lib/esm/__merged.mjs +18 -2
  28. package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
  29. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
  30. package/dist/lib/esm/community-plugins.mjs +2 -2
  31. package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
  32. package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
  33. package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
  34. package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
  35. package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
  36. package/dist/lib/esm/data-stores/shared-data-store.mjs +15 -4
  37. package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
  38. package/dist/lib/esm/folder-note.mjs +5 -5
  39. package/dist/lib/esm/formula-function.d.mts +98 -0
  40. package/dist/lib/esm/formula-function.mjs +62 -0
  41. package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
  42. package/dist/lib/esm/generated-during-build.mjs +1 -1
  43. package/dist/lib/esm/index.d.mts +2 -0
  44. package/dist/lib/esm/index.mjs +5 -1
  45. package/dist/lib/esm/link.mjs +12 -12
  46. package/dist/lib/esm/markdown.mjs +7 -7
  47. package/dist/lib/esm/vault.mjs +2 -2
  48. package/dist/lib/esm/virtual-file.d.mts +48 -0
  49. package/dist/lib/esm/virtual-file.mjs +264 -0
  50. package/package.json +5 -5
@@ -0,0 +1,264 @@
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 ensureDisposeSymbols(symbolConstructor = Symbol) {
7
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
8
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
9
+ }
10
+
11
+ function ensureBrowserProcess() {
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return "/";
16
+ },
17
+ env: {},
18
+ platform: "android"
19
+ };
20
+ const existingProcess = globalThis.process;
21
+ if (!existingProcess) {
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+ if (existingProcess.versions?.node) {
26
+ return;
27
+ }
28
+ const existingProcessRecord = existingProcess;
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+ existingProcessRecord["browser"] = true;
33
+ }
34
+
35
+ ensureDisposeSymbols();
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ import {
40
+ EditorState,
41
+ StateEffect
42
+ } from "@codemirror/state";
43
+ import {
44
+ CallbackDisposable,
45
+ MultipleDisposeBehavior
46
+ } from "@mnaoumov/typescript-lib/disposable";
47
+ import { parentFolderPath } from "@obsidian-typings/obsidian-public-latest/implementations";
48
+ import {
49
+ MarkdownView,
50
+ normalizePath
51
+ } from "obsidian";
52
+ import { MonkeyAroundComponent } from "./components/monkey-around-component.mjs";
53
+ import { toggleEditorReadOnly } from "./editor.mjs";
54
+ import { getFile } from "./file-system.mjs";
55
+ import {
56
+ parseMetadata,
57
+ registerFileCacheForNonExistingFile
58
+ } from "./metadata-cache.mjs";
59
+ import { getObsidianLibState } from "./obsidian-lib-state.mjs";
60
+ async function registerVirtualFile(params) {
61
+ const { app, content } = params;
62
+ const path = normalizePath(params.path);
63
+ if (!path || path === "/" || params.path.split(/[\\/]/).some((part) => part === "." || part === "..") || /^[\\/]|:/.test(params.path)) {
64
+ throw new Error("A virtual file requires a vault-relative file path");
65
+ }
66
+ const reservations = getObsidianLibState("virtualFilePathsV1", /* @__PURE__ */ new Set()).value;
67
+ const key = path.toLowerCase();
68
+ if (reservations.has(key) || app.vault.getAbstractFileByPathInsensitive(path)) {
69
+ throw new Error(`File already exists: ${path}`);
70
+ }
71
+ const parent = parentFolderPath(path);
72
+ if (parent && parent !== "/" && !app.vault.getFolderByPath(parent)) {
73
+ throw new Error(`Parent folder does not exist: ${parent}`);
74
+ }
75
+ reservations.add(key);
76
+ try {
77
+ if (await app.vault.adapter.exists(path)) {
78
+ throw new Error(`File already exists: ${path}`);
79
+ }
80
+ const cache = path.endsWith(".md") ? await parseMetadata(app, content) : {};
81
+ if (app.vault.getAbstractFileByPathInsensitive(path)) {
82
+ throw new Error(`File already exists: ${path}`);
83
+ }
84
+ return installVirtualFile({ app, cache, content, path, reservations });
85
+ } catch (error) {
86
+ reservations.delete(key);
87
+ throw error;
88
+ }
89
+ }
90
+ function installVirtualFile(params) {
91
+ const { app, cache, content, path, reservations } = params;
92
+ const file = getFile({ app, pathOrFile: path, shouldIncludeNonExisting: true });
93
+ const bytes = new TextEncoder().encode(content);
94
+ file.stat = { ctime: Date.now(), mtime: Date.now(), size: bytes.byteLength };
95
+ const url = window.URL.createObjectURL(new Blob([bytes], { type: path.endsWith(".md") ? "text/markdown;charset=utf-8" : "text/plain;charset=utf-8" }));
96
+ const patches = new MonkeyAroundComponent();
97
+ patches.load();
98
+ const metadata = registerFileCacheForNonExistingFile({ app, cache, pathOrFile: file });
99
+ app.vault.fileMap[path] = file;
100
+ app.metadataCache.uniqueFileLookup.add(file.name.toLowerCase(), file);
101
+ patches.registerMethodPatch({ $object: app.vault, methodName: "read", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(content) : fallback() });
102
+ patches.registerMethodPatch({ $object: app.vault, methodName: "cachedRead", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(content) : fallback() });
103
+ patches.registerMethodPatch({ $object: app.vault, methodName: "readBinary", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? Promise.resolve(new Uint8Array(bytes).buffer) : fallback() });
104
+ patches.registerMethodPatch({ $object: app.vault, methodName: "getResourcePath", patchHandler: ({ fallback, originalArguments: [target] }) => target === file ? url : fallback() });
105
+ patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "read", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? Promise.resolve(content) : fallback() });
106
+ patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "readBinary", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? Promise.resolve(new Uint8Array(bytes).buffer) : fallback() });
107
+ patches.registerMethodPatch({ $object: app.vault.adapter, methodName: "getResourcePath", patchHandler: ({ fallback, originalArguments: [target] }) => isMatching(target) ? url : fallback() });
108
+ for (const methodName of ["append", "appendBinary", "modify", "modifyBinary", "process", "delete", "trash"]) {
109
+ patches.registerMethodPatch({
110
+ $object: app.vault,
111
+ methodName,
112
+ patchHandler: ({ fallback, originalArguments: [target] }) => {
113
+ assertWritable(target.path);
114
+ return fallback();
115
+ }
116
+ });
117
+ }
118
+ patches.registerMethodPatch({
119
+ $object: app.vault,
120
+ methodName: "rename",
121
+ patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
122
+ assertWritable(target.path);
123
+ assertWritable(destination);
124
+ return fallback();
125
+ }
126
+ });
127
+ for (const methodName of ["create", "createBinary", "createFolder"]) {
128
+ patches.registerMethodPatch({
129
+ $object: app.vault,
130
+ methodName,
131
+ patchHandler: ({ fallback, originalArguments: [target] }) => {
132
+ assertWritable(target);
133
+ return fallback();
134
+ }
135
+ });
136
+ }
137
+ patches.registerMethodPatch({
138
+ $object: app.vault,
139
+ methodName: "copy",
140
+ patchHandler: ({ fallback, originalArguments: [, destination] }) => {
141
+ assertWritable(destination);
142
+ return fallback();
143
+ }
144
+ });
145
+ for (const methodName of ["write", "writeBinary", "append", "appendBinary", "process", "remove", "rmdir", "trashLocal", "trashSystem", "mkdir"]) {
146
+ patches.registerMethodPatch({
147
+ $object: app.vault.adapter,
148
+ methodName,
149
+ patchHandler: ({ fallback, originalArguments: [target] }) => {
150
+ assertWritable(target);
151
+ return fallback();
152
+ }
153
+ });
154
+ }
155
+ patches.registerMethodPatch({
156
+ $object: app.vault.adapter,
157
+ methodName: "rename",
158
+ patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
159
+ assertWritable(target);
160
+ assertWritable(destination);
161
+ return fallback();
162
+ }
163
+ });
164
+ patches.registerMethodPatch({
165
+ $object: app.vault.adapter,
166
+ methodName: "copy",
167
+ patchHandler: ({ fallback, originalArguments: [, destination] }) => {
168
+ assertWritable(destination);
169
+ return fallback();
170
+ }
171
+ });
172
+ patches.registerMethodPatch({
173
+ $object: app.fileManager,
174
+ methodName: "renameFile",
175
+ patchHandler: ({ fallback, originalArguments: [target, destination] }) => {
176
+ assertWritable(target.path);
177
+ assertWritable(destination);
178
+ return fallback();
179
+ }
180
+ });
181
+ patches.registerMethodPatch({
182
+ $object: app.fileManager,
183
+ methodName: "trashFile",
184
+ patchHandler: ({ fallback, originalArguments: [target] }) => {
185
+ assertWritable(target.path);
186
+ return fallback();
187
+ }
188
+ });
189
+ patches.registerMethodPatch({
190
+ $object: MarkdownView.prototype,
191
+ methodName: "setViewData",
192
+ patchHandler: ({ fallback, originalThis }) => {
193
+ fallback();
194
+ if (originalThis.file === file) {
195
+ protectEditor(originalThis);
196
+ }
197
+ }
198
+ });
199
+ patches.registerMethodPatch({
200
+ $object: MarkdownView.prototype,
201
+ methodName: "onLoadFile",
202
+ patchHandler: async ({ fallback, originalThis }) => {
203
+ await fallback();
204
+ if (originalThis.file === file) {
205
+ protectEditor(originalThis);
206
+ }
207
+ }
208
+ });
209
+ patches.registerMethodPatch({
210
+ $object: MarkdownView.prototype,
211
+ methodName: "setMode",
212
+ patchHandler: async ({ fallback, originalThis }) => {
213
+ const result = await fallback();
214
+ if (originalThis.file === file) {
215
+ protectEditor(originalThis);
216
+ }
217
+ return result;
218
+ }
219
+ });
220
+ const disposable = new CallbackDisposable({
221
+ callback: () => {
222
+ app.workspace.iterateAllLeaves((leaf) => {
223
+ if ("file" in leaf.view && leaf.view.file === file) {
224
+ leaf.detach();
225
+ }
226
+ });
227
+ app.metadataCache.uniqueFileLookup.remove(file.name.toLowerCase(), file);
228
+ if (app.vault.fileMap[path] === file) {
229
+ Reflect.deleteProperty(app.vault.fileMap, path);
230
+ metadata[Symbol.dispose]();
231
+ }
232
+ patches.unload();
233
+ window.URL.revokeObjectURL(url);
234
+ reservations.delete(path.toLowerCase());
235
+ },
236
+ multipleDisposeBehavior: MultipleDisposeBehavior.Ignore
237
+ });
238
+ return {
239
+ content,
240
+ file,
241
+ [Symbol.dispose]: () => {
242
+ disposable[Symbol.dispose]();
243
+ }
244
+ };
245
+ function isMatching(target) {
246
+ return normalizePath(target).toLowerCase() === path.toLowerCase();
247
+ }
248
+ function protectEditor(view) {
249
+ toggleEditorReadOnly(view.editor, true);
250
+ view.editor.cm.dispatch({
251
+ effects: StateEffect.appendConfig.of(EditorState.changeFilter.of(() => view.file !== file))
252
+ });
253
+ }
254
+ function assertWritable(target) {
255
+ const normalized = normalizePath(target).toLowerCase();
256
+ if (isMatching(target) || path.toLowerCase().startsWith(`${normalized}/`) || normalized === "/") {
257
+ throw new Error(`Virtual file is read-only: ${path}`);
258
+ }
259
+ }
260
+ }
261
+ export {
262
+ registerVirtualFile
263
+ };
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92aXJ0dWFsLWZpbGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICogRGlzcG9zYWJsZSwgcmVhZC1vbmx5IGZpbGVzIGJhY2tlZCBieSBtZW1vcnkgaW5zdGVhZCBvZiB0aGUgdmF1bHQgYWRhcHRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBFZGl0b3JTdGF0ZSxcbiAgU3RhdGVFZmZlY3Rcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwYXJlbnRGb2xkZXJQYXRoIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBub3JtYWxpemVQYXRoXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHRvZ2dsZUVkaXRvclJlYWRPbmx5IH0gZnJvbSAnLi9lZGl0b3IudHMnO1xuaW1wb3J0IHsgZ2V0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VNZXRhZGF0YSxcbiAgcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGVcbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYlN0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuXG4vKipcblBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlclZpcnR1YWxGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclZpcnR1YWxGaWxlUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBhcHAgd2hvc2UgcmVzb2x2ZXIgYW5kIHJlYWQgbWV0aG9kcyBzZXJ2ZSB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgSW1tdXRhYmxlIFVURi04IHRleHQsIGFsc28gYXZhaWxhYmxlIHN5bmNocm9ub3VzbHkgb24gdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcbiAgLyoqXG4gIFVub2NjdXBpZWQgdmF1bHQtcmVsYXRpdmUgZmlsZSBwYXRoIGluIGFuIGV4aXN0aW5nIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG5BIG1lbW9yeSBmaWxlIGFuZCBpdHMgbGlmZXRpbWUuIERpc3Bvc2UgaXQgYmVmb3JlIGl0cyBvd25pbmcgcGx1Z2luIHVubG9hZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlydHVhbEZpbGUgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gIFRoZSBpbW11dGFibGUgdGV4dDsgYWNjZXNzaW5nIGl0IHJlcXVpcmVzIG5vIGFzeW5jaHJvbm91cyByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICAvKipcbiAgVGhlIGZpbGUgYWNjZXB0ZWQgYnkgT2JzaWRpYW4ncyBsaW5rIHJlc29sdmVyIGFuZCBmaWxlIHZpZXdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogVEZpbGU7XG59XG5cbmludGVyZmFjZSBJbnN0YWxsVmlydHVhbEZpbGVQYXJhbXMgZXh0ZW5kcyBSZWdpc3RlclZpcnR1YWxGaWxlUGFyYW1zIHtcbiAgcmVhZG9ubHkgY2FjaGU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcGFyc2VNZXRhZGF0YT4+IHwgUmVjb3JkPHN0cmluZywgbmV2ZXI+O1xuICByZWFkb25seSByZXNlcnZhdGlvbnM6IFNldDxzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBpbW11dGFibGUgdGV4dCBhcyBhIGZpbGUgd2l0aG91dCB3cml0aW5nIHRvIHRoZSBhZGFwdGVyLlxuICpcbiAqIFRoZSBwYXJlbnQgZm9sZGVyIG11c3QgZXhpc3QuIE1hcmtkb3duIHZpZXdzIGFyZSByZWFkLW9ubHk7IHZhdWx0IGFuZCBhZGFwdGVyIG11dGF0aW9ucyBvZiB0aGVcbiAqIHBhdGggb3IgaXRzIGFuY2VzdG9ycyB0aHJvdy4gUmF3IGZpbGVzeXN0ZW0gYWNjZXNzIGFuZCB0aGlyZC1wYXJ0eSB2aWV3cyBhcmUgb3V0c2lkZSB0aGlzIGNvbnRyYWN0LlxuICogUmVzb3VyY2UgVVJMcyB1c2UgVVRGLTggYmxvYnMuIERpc3Bvc2luZyBjbG9zZXMgdmlld3Mgb2YgdGhpcyBmaWxlIGFuZCByZXZva2VzIGl0cyBVUkwuIE5vIGNyZWF0ZVxuICogb3IgZGVsZXRlIGV2ZW50cyBhcmUgZW1pdHRlZCwgc28gaW5kZXhlcnMgYW5kIHN5bmNocm9uaXphdGlvbiBuZXZlciB0cmVhdCBpdCBhcyBhIHBlcnNpc3RlZCBmaWxlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgYXBwLCBwYXRoIGFuZCBpbW11dGFibGUgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIGZpbGUsIHN5bmNocm9ub3VzIGNvbnRlbnQgYW5kIGlkZW1wb3RlbnQgZGlzcG9zYWwgY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlclZpcnR1YWxGaWxlKHBhcmFtczogUmVnaXN0ZXJWaXJ0dWFsRmlsZVBhcmFtcyk6IFByb21pc2U8VmlydHVhbEZpbGU+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgY29uc3QgcGF0aCA9IG5vcm1hbGl6ZVBhdGgocGFyYW1zLnBhdGgpO1xuICBpZiAoIXBhdGggfHwgcGF0aCA9PT0gJy8nIHx8IHBhcmFtcy5wYXRoLnNwbGl0KC9bXFxcXC9dLykuc29tZSgocGFydCkgPT4gcGFydCA9PT0gJy4nIHx8IHBhcnQgPT09ICcuLicpIHx8IC9eW1xcXFwvXXw6Ly50ZXN0KHBhcmFtcy5wYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQSB2aXJ0dWFsIGZpbGUgcmVxdWlyZXMgYSB2YXVsdC1yZWxhdGl2ZSBmaWxlIHBhdGgnKTtcbiAgfVxuICBjb25zdCByZXNlcnZhdGlvbnMgPSBnZXRPYnNpZGlhbkxpYlN0YXRlKCd2aXJ0dWFsRmlsZVBhdGhzVjEnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gIGNvbnN0IGtleSA9IHBhdGgudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJlc2VydmF0aW9ucy5oYXMoa2V5KSB8fCBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoSW5zZW5zaXRpdmUocGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgfVxuICBjb25zdCBwYXJlbnQgPSBwYXJlbnRGb2xkZXJQYXRoKHBhdGgpO1xuICBpZiAocGFyZW50ICYmIHBhcmVudCAhPT0gJy8nICYmICFhcHAudmF1bHQuZ2V0Rm9sZGVyQnlQYXRoKHBhcmVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBmb2xkZXIgZG9lcyBub3QgZXhpc3Q6ICR7cGFyZW50fWApO1xuICB9XG4gIHJlc2VydmF0aW9ucy5hZGQoa2V5KTtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSBwYXRoLmVuZHNXaXRoKCcubWQnKSA/IGF3YWl0IHBhcnNlTWV0YWRhdGEoYXBwLCBjb250ZW50KSA6IHt9O1xuICAgIC8vIFJlY2hlY2sgYWZ0ZXIgYXN5bmNocm9ub3VzIHdvcmssIGJlZm9yZSBwdWJsaXNoaW5nIGFueXRoaW5nIHRvIHRoZSByZXNvbHZlci5cbiAgICBpZiAoYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aEluc2Vuc2l0aXZlKHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgYWxyZWFkeSBleGlzdHM6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbGxWaXJ0dWFsRmlsZSh7IGFwcCwgY2FjaGUsIGNvbnRlbnQsIHBhdGgsIHJlc2VydmF0aW9ucyB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXNlcnZhdGlvbnMuZGVsZXRlKGtleSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbFZpcnR1YWxGaWxlKHBhcmFtczogSW5zdGFsbFZpcnR1YWxGaWxlUGFyYW1zKTogVmlydHVhbEZpbGUge1xuICBjb25zdCB7IGFwcCwgY2FjaGUsIGNvbnRlbnQsIHBhdGgsIHJlc2VydmF0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjb250ZW50KTtcbiAgZmlsZS5zdGF0ID0geyBjdGltZTogRGF0ZS5ub3coKSwgbXRpbWU6IERhdGUubm93KCksIHNpemU6IGJ5dGVzLmJ5dGVMZW5ndGggfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGlzIGlzIHRoZSBicm93c2VyJ3MgQmxvYiBVUkwgQVBJIGluIE9ic2lkaWFuLCBub3QgTm9kZSdzIGltcGxlbWVudGF0aW9uLlxuICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYnl0ZXNdLCB7IHR5cGU6IHBhdGguZW5kc1dpdGgoJy5tZCcpID8gJ3RleHQvbWFya2Rvd247Y2hhcnNldD11dGYtOCcgOiAndGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04JyB9KSk7XG4gIGNvbnN0IHBhdGNoZXMgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gIHBhdGNoZXMubG9hZCgpO1xuICBjb25zdCBtZXRhZGF0YSA9IHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZTogZmlsZSB9KTtcbiAgYXBwLnZhdWx0LmZpbGVNYXBbcGF0aF0gPSBmaWxlO1xuICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG5cbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LCBtZXRob2ROYW1lOiAncmVhZCcsIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB0YXJnZXQgPT09IGZpbGUgPyBQcm9taXNlLnJlc29sdmUoY29udGVudCkgOiBmYWxsYmFjaygpIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goeyAkb2JqZWN0OiBhcHAudmF1bHQsIG1ldGhvZE5hbWU6ICdjYWNoZWRSZWFkJywgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHRhcmdldCA9PT0gZmlsZSA/IFByb21pc2UucmVzb2x2ZShjb250ZW50KSA6IGZhbGxiYWNrKCkgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7ICRvYmplY3Q6IGFwcC52YXVsdCwgbWV0aG9kTmFtZTogJ3JlYWRCaW5hcnknLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gdGFyZ2V0ID09PSBmaWxlID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXIpIDogZmFsbGJhY2soKSB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LCBtZXRob2ROYW1lOiAnZ2V0UmVzb3VyY2VQYXRoJywgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHRhcmdldCA9PT0gZmlsZSA/IHVybCA6IGZhbGxiYWNrKCkgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7ICRvYmplY3Q6IGFwcC52YXVsdC5hZGFwdGVyLCBtZXRob2ROYW1lOiAncmVhZCcsIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiBpc01hdGNoaW5nKHRhcmdldCkgPyBQcm9taXNlLnJlc29sdmUoY29udGVudCkgOiBmYWxsYmFjaygpIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goeyAkb2JqZWN0OiBhcHAudmF1bHQuYWRhcHRlciwgbWV0aG9kTmFtZTogJ3JlYWRCaW5hcnknLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gaXNNYXRjaGluZyh0YXJnZXQpID8gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXIpIDogZmFsbGJhY2soKSB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHsgJG9iamVjdDogYXBwLnZhdWx0LmFkYXB0ZXIsIG1ldGhvZE5hbWU6ICdnZXRSZXNvdXJjZVBhdGgnLCBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4gaXNNYXRjaGluZyh0YXJnZXQpID8gdXJsIDogZmFsbGJhY2soKSB9KTtcblxuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgb2YgWydhcHBlbmQnLCAnYXBwZW5kQmluYXJ5JywgJ21vZGlmeScsICdtb2RpZnlCaW5hcnknLCAncHJvY2VzcycsICdkZWxldGUnLCAndHJhc2gnXSBhcyBjb25zdCkge1xuICAgIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiBhcHAudmF1bHQsXG4gICAgICBtZXRob2ROYW1lLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXRdIH0pID0+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGFibGUodGFyZ2V0LnBhdGgpO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC52YXVsdCxcbiAgICBtZXRob2ROYW1lOiAncmVuYW1lJyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldCwgZGVzdGluYXRpb25dIH0pID0+IHtcbiAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldC5wYXRoKTtcbiAgICAgIGFzc2VydFdyaXRhYmxlKGRlc3RpbmF0aW9uKTtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBbJ2NyZWF0ZScsICdjcmVhdGVCaW5hcnknLCAnY3JlYXRlRm9sZGVyJ10gYXMgY29uc3QpIHtcbiAgICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICAgJG9iamVjdDogYXBwLnZhdWx0LFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogYXBwLnZhdWx0LFxuICAgIG1ldGhvZE5hbWU6ICdjb3B5JyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogWywgZGVzdGluYXRpb25dIH0pID0+IHtcbiAgICAgIGFzc2VydFdyaXRhYmxlKGRlc3RpbmF0aW9uKTtcbiAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgIH1cbiAgfSk7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBbJ3dyaXRlJywgJ3dyaXRlQmluYXJ5JywgJ2FwcGVuZCcsICdhcHBlbmRCaW5hcnknLCAncHJvY2VzcycsICdyZW1vdmUnLCAncm1kaXInLCAndHJhc2hMb2NhbCcsICd0cmFzaFN5c3RlbScsICdta2RpciddIGFzIGNvbnN0KSB7XG4gICAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IGFwcC52YXVsdC5hZGFwdGVyLFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbdGFyZ2V0XSB9KSA9PiB7XG4gICAgICAgIGFzc2VydFdyaXRhYmxlKHRhcmdldCk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogYXBwLnZhdWx0LmFkYXB0ZXIsXG4gICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXQsIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZSh0YXJnZXQpO1xuICAgICAgYXNzZXJ0V3JpdGFibGUoZGVzdGluYXRpb24pO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAkb2JqZWN0OiBhcHAudmF1bHQuYWRhcHRlcixcbiAgICBtZXRob2ROYW1lOiAnY29weScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFssIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZShkZXN0aW5hdGlvbik7XG4gICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC5maWxlTWFuYWdlcixcbiAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFt0YXJnZXQsIGRlc3RpbmF0aW9uXSB9KSA9PiB7XG4gICAgICBhc3NlcnRXcml0YWJsZSh0YXJnZXQucGF0aCk7XG4gICAgICBhc3NlcnRXcml0YWJsZShkZXN0aW5hdGlvbik7XG4gICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICB9XG4gIH0pO1xuICBwYXRjaGVzLnJlZ2lzdGVyTWV0aG9kUGF0Y2goe1xuICAgICRvYmplY3Q6IGFwcC5maWxlTWFuYWdlcixcbiAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3RhcmdldF0gfSkgPT4ge1xuICAgICAgYXNzZXJ0V3JpdGFibGUodGFyZ2V0LnBhdGgpO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgfVxuICB9KTtcbiAgcGF0Y2hlcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAkb2JqZWN0OiBNYXJrZG93blZpZXcucHJvdG90eXBlLFxuICAgIG1ldGhvZE5hbWU6ICdzZXRWaWV3RGF0YScsXG4gICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogTWFya2Rvd25WaWV3LnByb3RvdHlwZSxcbiAgICBtZXRob2ROYW1lOiAnb25Mb2FkRmlsZScsXG4gICAgcGF0Y2hIYW5kbGVyOiBhc3luYyAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHBhdGNoZXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgJG9iamVjdDogTWFya2Rvd25WaWV3LnByb3RvdHlwZSxcbiAgICBtZXRob2ROYW1lOiAnc2V0TW9kZScsXG4gICAgcGF0Y2hIYW5kbGVyOiBhc3luYyAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiAtLSBPYnNpZGlhbiByZXR1cm5zIGEgYm9vbGVhbiBkZXNwaXRlIGl0cyB2b2lkIGRlY2xhcmF0aW9uOyBzZXRTdGF0ZSBjb25zdW1lcyB0aGF0IHJlc3VsdC5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZhbGxiYWNrKCk7XG4gICAgICBpZiAob3JpZ2luYWxUaGlzLmZpbGUgPT09IGZpbGUpIHtcbiAgICAgICAgcHJvdGVjdEVkaXRvcihvcmlnaW5hbFRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGRpc3Bvc2FibGUgPSBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgYXBwLndvcmtzcGFjZS5pdGVyYXRlQWxsTGVhdmVzKChsZWFmKSA9PiB7XG4gICAgICAgIGlmICgnZmlsZScgaW4gbGVhZi52aWV3ICYmIGxlYWYudmlldy5maWxlID09PSBmaWxlKSB7XG4gICAgICAgICAgbGVhZi5kZXRhY2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLnJlbW92ZShmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICBpZiAoYXBwLnZhdWx0LmZpbGVNYXBbcGF0aF0gPT09IGZpbGUpIHtcbiAgICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShhcHAudmF1bHQuZmlsZU1hcCwgcGF0aCk7XG4gICAgICAgIG1ldGFkYXRhW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgICAgfVxuICAgICAgcGF0Y2hlcy51bmxvYWQoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlIFVSTCBiZWxvbmdzIHRvIHRoZSBicm93c2VyIHJlYWxtIHRoYXQgY3JlYXRlZCBpdC5cbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICByZXNlcnZhdGlvbnMuZGVsZXRlKHBhdGgudG9Mb3dlckNhc2UoKSk7XG4gICAgfSxcbiAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQsXG4gICAgZmlsZSxcbiAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICBkaXNwb3NhYmxlW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBpc01hdGNoaW5nKHRhcmdldDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgodGFyZ2V0KS50b0xvd2VyQ2FzZSgpID09PSBwYXRoLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBmdW5jdGlvbiBwcm90ZWN0RWRpdG9yKHZpZXc6IE1hcmtkb3duVmlldyk6IHZvaWQge1xuICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAvLyBBIHZpcnR1YWwgZmlsZSBpcyBpbW11dGFibGUgZXZlbiB0byBwcm9ncmFtbWF0aWMgZWRpdG9yIHRyYW5zYWN0aW9ucy4gVGhlIG9yZGluYXJ5IHJlc291cmNlXG4gICAgLy8gbG9jayBwZXJtaXRzIHRob3NlIGZvciByb2xsYmFjazsgdGhpcyByZWdpc3RyYXRpb24gaGFzIG5vIHdyaXRhYmxlIGJ1ZmZlciB0byByb2xsIGJhY2suXG4gICAgdmlldy5lZGl0b3IuY20uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogU3RhdGVFZmZlY3QuYXBwZW5kQ29uZmlnLm9mKEVkaXRvclN0YXRlLmNoYW5nZUZpbHRlci5vZigoKSA9PiB2aWV3LmZpbGUgIT09IGZpbGUpKVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gYXNzZXJ0V3JpdGFibGUodGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUGF0aCh0YXJnZXQpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGlzTWF0Y2hpbmcodGFyZ2V0KSB8fCBwYXRoLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChgJHtub3JtYWxpemVkfS9gKSB8fCBub3JtYWxpemVkID09PSAnLycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVmlydHVhbCBmaWxlIGlzIHJlYWQtb25seTogJHtwYXRofWApO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHdCQUF3QjtBQUNqQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsZUFBZTtBQUN4QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMkJBQTJCO0FBa0RwQyxlQUFzQixvQkFBb0IsUUFBeUQ7QUFDakcsUUFBTSxFQUFFLEtBQUssUUFBUSxJQUFJO0FBQ3pCLFFBQU0sT0FBTyxjQUFjLE9BQU8sSUFBSTtBQUN0QyxNQUFJLENBQUMsUUFBUSxTQUFTLE9BQU8sT0FBTyxLQUFLLE1BQU0sT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLFNBQVMsT0FBTyxTQUFTLElBQUksS0FBSyxXQUFXLEtBQUssT0FBTyxJQUFJLEdBQUc7QUFDckksVUFBTSxJQUFJLE1BQU0sb0RBQW9EO0FBQUEsRUFDdEU7QUFDQSxRQUFNLGVBQWUsb0JBQW9CLHNCQUFzQixvQkFBSSxJQUFZLENBQUMsRUFBRTtBQUNsRixRQUFNLE1BQU0sS0FBSyxZQUFZO0FBQzdCLE1BQUksYUFBYSxJQUFJLEdBQUcsS0FBSyxJQUFJLE1BQU0saUNBQWlDLElBQUksR0FBRztBQUM3RSxVQUFNLElBQUksTUFBTSx3QkFBd0IsSUFBSSxFQUFFO0FBQUEsRUFDaEQ7QUFDQSxRQUFNLFNBQVMsaUJBQWlCLElBQUk7QUFDcEMsTUFBSSxVQUFVLFdBQVcsT0FBTyxDQUFDLElBQUksTUFBTSxnQkFBZ0IsTUFBTSxHQUFHO0FBQ2xFLFVBQU0sSUFBSSxNQUFNLGlDQUFpQyxNQUFNLEVBQUU7QUFBQSxFQUMzRDtBQUNBLGVBQWEsSUFBSSxHQUFHO0FBQ3BCLE1BQUk7QUFDRixRQUFJLE1BQU0sSUFBSSxNQUFNLFFBQVEsT0FBTyxJQUFJLEdBQUc7QUFDeEMsWUFBTSxJQUFJLE1BQU0sd0JBQXdCLElBQUksRUFBRTtBQUFBLElBQ2hEO0FBQ0EsVUFBTSxRQUFRLEtBQUssU0FBUyxLQUFLLElBQUksTUFBTSxjQUFjLEtBQUssT0FBTyxJQUFJLENBQUM7QUFFMUUsUUFBSSxJQUFJLE1BQU0saUNBQWlDLElBQUksR0FBRztBQUNwRCxZQUFNLElBQUksTUFBTSx3QkFBd0IsSUFBSSxFQUFFO0FBQUEsSUFDaEQ7QUFDQSxXQUFPLG1CQUFtQixFQUFFLEtBQUssT0FBTyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQUEsRUFDdkUsU0FBUyxPQUFPO0FBQ2QsaUJBQWEsT0FBTyxHQUFHO0FBQ3ZCLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFFQSxTQUFTLG1CQUFtQixRQUErQztBQUN6RSxRQUFNLEVBQUUsS0FBSyxPQUFPLFNBQVMsTUFBTSxhQUFhLElBQUk7QUFDcEQsUUFBTSxPQUFPLFFBQVEsRUFBRSxLQUFLLFlBQVksTUFBTSwwQkFBMEIsS0FBSyxDQUFDO0FBQzlFLFFBQU0sUUFBUSxJQUFJLFlBQVksRUFBRSxPQUFPLE9BQU87QUFDOUMsT0FBSyxPQUFPLEVBQUUsT0FBTyxLQUFLLElBQUksR0FBRyxPQUFPLEtBQUssSUFBSSxHQUFHLE1BQU0sTUFBTSxXQUFXO0FBRTNFLFFBQU0sTUFBTSxPQUFPLElBQUksZ0JBQWdCLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLE1BQU0sS0FBSyxTQUFTLEtBQUssSUFBSSxnQ0FBZ0MsMkJBQTJCLENBQUMsQ0FBQztBQUNySixRQUFNLFVBQVUsSUFBSSxzQkFBc0I7QUFDMUMsVUFBUSxLQUFLO0FBQ2IsUUFBTSxXQUFXLG9DQUFvQyxFQUFFLEtBQUssT0FBTyxZQUFZLEtBQUssQ0FBQztBQUNyRixNQUFJLE1BQU0sUUFBUSxJQUFJLElBQUk7QUFDMUIsTUFBSSxjQUFjLGlCQUFpQixJQUFJLEtBQUssS0FBSyxZQUFZLEdBQUcsSUFBSTtBQUVwRSxVQUFRLG9CQUFvQixFQUFFLFNBQVMsSUFBSSxPQUFPLFlBQVksUUFBUSxjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLFdBQVcsT0FBTyxRQUFRLFFBQVEsT0FBTyxJQUFJLFNBQVMsRUFBRSxDQUFDO0FBQzVMLFVBQVEsb0JBQW9CLEVBQUUsU0FBUyxJQUFJLE9BQU8sWUFBWSxjQUFjLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU0sV0FBVyxPQUFPLFFBQVEsUUFBUSxPQUFPLElBQUksU0FBUyxFQUFFLENBQUM7QUFDbE0sVUFBUSxvQkFBb0IsRUFBRSxTQUFTLElBQUksT0FBTyxZQUFZLGNBQWMsY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxXQUFXLE9BQU8sUUFBUSxRQUFRLElBQUksV0FBVyxLQUFLLEVBQUUsTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO0FBQ3ZOLFVBQVEsb0JBQW9CLEVBQUUsU0FBUyxJQUFJLE9BQU8sWUFBWSxtQkFBbUIsY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxXQUFXLE9BQU8sTUFBTSxTQUFTLEVBQUUsQ0FBQztBQUNsTCxVQUFRLG9CQUFvQixFQUFFLFNBQVMsSUFBSSxNQUFNLFNBQVMsWUFBWSxRQUFRLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU0sV0FBVyxNQUFNLElBQUksUUFBUSxRQUFRLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUN2TSxVQUFRLG9CQUFvQixFQUFFLFNBQVMsSUFBSSxNQUFNLFNBQVMsWUFBWSxjQUFjLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU0sV0FBVyxNQUFNLElBQUksUUFBUSxRQUFRLElBQUksV0FBVyxLQUFLLEVBQUUsTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDO0FBQ2xPLFVBQVEsb0JBQW9CLEVBQUUsU0FBUyxJQUFJLE1BQU0sU0FBUyxZQUFZLG1CQUFtQixjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLFdBQVcsTUFBTSxJQUFJLE1BQU0sU0FBUyxFQUFFLENBQUM7QUFFN0wsYUFBVyxjQUFjLENBQUMsVUFBVSxnQkFBZ0IsVUFBVSxnQkFBZ0IsV0FBVyxVQUFVLE9BQU8sR0FBWTtBQUNwSCxZQUFRLG9CQUFvQjtBQUFBLE1BQzFCLFNBQVMsSUFBSTtBQUFBLE1BQ2I7QUFBQSxNQUNBLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU07QUFDM0QsdUJBQWUsT0FBTyxJQUFJO0FBQzFCLGVBQU8sU0FBUztBQUFBLE1BQ2xCO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUNBLFVBQVEsb0JBQW9CO0FBQUEsSUFDMUIsU0FBUyxJQUFJO0FBQUEsSUFDYixZQUFZO0FBQUEsSUFDWixjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLFFBQVEsV0FBVyxFQUFFLE1BQU07QUFDeEUscUJBQWUsT0FBTyxJQUFJO0FBQzFCLHFCQUFlLFdBQVc7QUFDMUIsYUFBTyxTQUFTO0FBQUEsSUFDbEI7QUFBQSxFQUNGLENBQUM7QUFDRCxhQUFXLGNBQWMsQ0FBQyxVQUFVLGdCQUFnQixjQUFjLEdBQVk7QUFDNUUsWUFBUSxvQkFBb0I7QUFBQSxNQUMxQixTQUFTLElBQUk7QUFBQSxNQUNiO0FBQUEsTUFDQSxjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNO0FBQzNELHVCQUFlLE1BQU07QUFDckIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0EsVUFBUSxvQkFBb0I7QUFBQSxJQUMxQixTQUFTLElBQUk7QUFBQSxJQUNiLFlBQVk7QUFBQSxJQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTTtBQUNsRSxxQkFBZSxXQUFXO0FBQzFCLGFBQU8sU0FBUztBQUFBLElBQ2xCO0FBQUEsRUFDRixDQUFDO0FBQ0QsYUFBVyxjQUFjLENBQUMsU0FBUyxlQUFlLFVBQVUsZ0JBQWdCLFdBQVcsVUFBVSxTQUFTLGNBQWMsZUFBZSxPQUFPLEdBQVk7QUFDeEosWUFBUSxvQkFBb0I7QUFBQSxNQUMxQixTQUFTLElBQUksTUFBTTtBQUFBLE1BQ25CO0FBQUEsTUFDQSxjQUFjLENBQUMsRUFBRSxVQUFVLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNO0FBQzNELHVCQUFlLE1BQU07QUFDckIsZUFBTyxTQUFTO0FBQUEsTUFDbEI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0EsVUFBUSxvQkFBb0I7QUFBQSxJQUMxQixTQUFTLElBQUksTUFBTTtBQUFBLElBQ25CLFlBQVk7QUFBQSxJQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsUUFBUSxXQUFXLEVBQUUsTUFBTTtBQUN4RSxxQkFBZSxNQUFNO0FBQ3JCLHFCQUFlLFdBQVc7QUFDMUIsYUFBTyxTQUFTO0FBQUEsSUFDbEI7QUFBQSxFQUNGLENBQUM7QUFDRCxVQUFRLG9CQUFvQjtBQUFBLElBQzFCLFNBQVMsSUFBSSxNQUFNO0FBQUEsSUFDbkIsWUFBWTtBQUFBLElBQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNO0FBQ2xFLHFCQUFlLFdBQVc7QUFDMUIsYUFBTyxTQUFTO0FBQUEsSUFDbEI7QUFBQSxFQUNGLENBQUM7QUFDRCxVQUFRLG9CQUFvQjtBQUFBLElBQzFCLFNBQVMsSUFBSTtBQUFBLElBQ2IsWUFBWTtBQUFBLElBQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxtQkFBbUIsQ0FBQyxRQUFRLFdBQVcsRUFBRSxNQUFNO0FBQ3hFLHFCQUFlLE9BQU8sSUFBSTtBQUMxQixxQkFBZSxXQUFXO0FBQzFCLGFBQU8sU0FBUztBQUFBLElBQ2xCO0FBQUEsRUFDRixDQUFDO0FBQ0QsVUFBUSxvQkFBb0I7QUFBQSxJQUMxQixTQUFTLElBQUk7QUFBQSxJQUNiLFlBQVk7QUFBQSxJQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU07QUFDM0QscUJBQWUsT0FBTyxJQUFJO0FBQzFCLGFBQU8sU0FBUztBQUFBLElBQ2xCO0FBQUEsRUFDRixDQUFDO0FBQ0QsVUFBUSxvQkFBb0I7QUFBQSxJQUMxQixTQUFTLGFBQWE7QUFBQSxJQUN0QixZQUFZO0FBQUEsSUFDWixjQUFjLENBQUMsRUFBRSxVQUFVLGFBQWEsTUFBTTtBQUM1QyxlQUFTO0FBQ1QsVUFBSSxhQUFhLFNBQVMsTUFBTTtBQUM5QixzQkFBYyxZQUFZO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBQ0QsVUFBUSxvQkFBb0I7QUFBQSxJQUMxQixTQUFTLGFBQWE7QUFBQSxJQUN0QixZQUFZO0FBQUEsSUFDWixjQUFjLE9BQU8sRUFBRSxVQUFVLGFBQWEsTUFBTTtBQUNsRCxZQUFNLFNBQVM7QUFDZixVQUFJLGFBQWEsU0FBUyxNQUFNO0FBQzlCLHNCQUFjLFlBQVk7QUFBQSxNQUM1QjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDRCxVQUFRLG9CQUFvQjtBQUFBLElBQzFCLFNBQVMsYUFBYTtBQUFBLElBQ3RCLFlBQVk7QUFBQSxJQUNaLGNBQWMsT0FBTyxFQUFFLFVBQVUsYUFBYSxNQUFNO0FBRWxELFlBQU0sU0FBUyxNQUFNLFNBQVM7QUFDOUIsVUFBSSxhQUFhLFNBQVMsTUFBTTtBQUM5QixzQkFBYyxZQUFZO0FBQUEsTUFDNUI7QUFDQSxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0YsQ0FBQztBQUVELFFBQU0sYUFBYSxJQUFJLG1CQUFtQjtBQUFBLElBQ3hDLFVBQVUsTUFBWTtBQUNwQixVQUFJLFVBQVUsaUJBQWlCLENBQUMsU0FBUztBQUN2QyxZQUFJLFVBQVUsS0FBSyxRQUFRLEtBQUssS0FBSyxTQUFTLE1BQU07QUFDbEQsZUFBSyxPQUFPO0FBQUEsUUFDZDtBQUFBLE1BQ0YsQ0FBQztBQUNELFVBQUksY0FBYyxpQkFBaUIsT0FBTyxLQUFLLEtBQUssWUFBWSxHQUFHLElBQUk7QUFDdkUsVUFBSSxJQUFJLE1BQU0sUUFBUSxJQUFJLE1BQU0sTUFBTTtBQUNwQyxnQkFBUSxlQUFlLElBQUksTUFBTSxTQUFTLElBQUk7QUFDOUMsaUJBQVMsT0FBTyxPQUFPLEVBQUU7QUFBQSxNQUMzQjtBQUNBLGNBQVEsT0FBTztBQUVmLGFBQU8sSUFBSSxnQkFBZ0IsR0FBRztBQUM5QixtQkFBYSxPQUFPLEtBQUssWUFBWSxDQUFDO0FBQUEsSUFDeEM7QUFBQSxJQUNBLHlCQUF5Qix3QkFBd0I7QUFBQSxFQUNuRCxDQUFDO0FBQ0QsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQSxDQUFDLE9BQU8sT0FBTyxHQUFHLE1BQVk7QUFDNUIsaUJBQVcsT0FBTyxPQUFPLEVBQUU7QUFBQSxJQUM3QjtBQUFBLEVBQ0Y7QUFFQSxXQUFTLFdBQVcsUUFBeUI7QUFDM0MsV0FBTyxjQUFjLE1BQU0sRUFBRSxZQUFZLE1BQU0sS0FBSyxZQUFZO0FBQUEsRUFDbEU7QUFFQSxXQUFTLGNBQWMsTUFBMEI7QUFDL0MseUJBQXFCLEtBQUssUUFBUSxJQUFJO0FBR3RDLFNBQUssT0FBTyxHQUFHLFNBQVM7QUFBQSxNQUN0QixTQUFTLFlBQVksYUFBYSxHQUFHLFlBQVksYUFBYSxHQUFHLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQztBQUFBLElBQzVGLENBQUM7QUFBQSxFQUNIO0FBRUEsV0FBUyxlQUFlLFFBQXNCO0FBQzVDLFVBQU0sYUFBYSxjQUFjLE1BQU0sRUFBRSxZQUFZO0FBQ3JELFFBQUksV0FBVyxNQUFNLEtBQUssS0FBSyxZQUFZLEVBQUUsV0FBVyxHQUFHLFVBQVUsR0FBRyxLQUFLLGVBQWUsS0FBSztBQUMvRixZQUFNLElBQUksTUFBTSw4QkFBOEIsSUFBSSxFQUFFO0FBQUEsSUFDdEQ7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOltdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/obsidian-lib",
3
- "version": "10.8.0",
3
+ "version": "10.9.0",
4
4
  "description": "Runtime library for Obsidian plugin development: plugin base classes, components, settings, modals, vault and metadata helpers.",
5
5
  "keywords": [
6
6
  "obsidian",
@@ -390,10 +390,10 @@
390
390
  "@commitlint/cli": "^21.2.2",
391
391
  "@commitlint/config-conventional": "^21.2.2",
392
392
  "@lezer/common": "1.5.2",
393
- "@mnaoumov/obsidian-dev-toolkit": "^7.4.0",
394
- "@mnaoumov/typescript-dev-toolkit": "^5.4.1",
393
+ "@mnaoumov/obsidian-dev-toolkit": "^8.2.1",
394
+ "@mnaoumov/typescript-dev-toolkit": "^6.1.0",
395
395
  "@mnaoumov/typescript-test-toolkit": "^1.0.3",
396
- "@obsidian-typings/obsidian-public-latest": "^6.57.0",
396
+ "@obsidian-typings/obsidian-public-latest": "^6.59.0",
397
397
  "@resvg/resvg-js": "^2.6.2",
398
398
  "@stryker-mutator/core": "^10.1.1",
399
399
  "@stryker-mutator/vitest-runner": "^10.1.1",
@@ -437,7 +437,7 @@
437
437
  "@codemirror/state": "^6.7.6",
438
438
  "@codemirror/view": "^6.43.13",
439
439
  "@lezer/common": "^1.5.2",
440
- "@obsidian-typings/obsidian-public-latest": "^6.55.0",
440
+ "@obsidian-typings/obsidian-public-latest": "^6.58.0",
441
441
  "obsidian": "^1.14.4",
442
442
  "obsidian-integration-testing": "^17.7.4"
443
443
  },