obsidian-dev-utils 49.0.2 → 50.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/lib/cjs/Library.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/ESLint/eslint.config.cjs +2 -2
- package/dist/lib/cjs/obsidian/FileChange.cjs +1 -1
- package/dist/lib/cjs/obsidian/Markdown.cjs +3 -2
- package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +7 -7
- package/dist/lib/cjs/obsidian/Vault.cjs +46 -5
- package/dist/lib/cjs/obsidian/Vault.d.cts +24 -0
- package/dist/lib/cjs/obsidian/VaultDelete.cjs +171 -0
- package/dist/lib/cjs/obsidian/VaultDelete.d.cts +18 -0
- package/dist/lib/cjs/obsidian/index.cjs +4 -4
- package/dist/lib/cjs/obsidian/index.d.cts +1 -1
- package/dist/lib/esm/Library.mjs +1 -1
- package/dist/lib/esm/ScriptUtils/ESLint/eslint.config.mjs +2 -2
- package/dist/lib/esm/obsidian/FileChange.mjs +1 -1
- package/dist/lib/esm/obsidian/Markdown.mjs +3 -2
- package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +9 -10
- package/dist/lib/esm/obsidian/Vault.d.mts +24 -0
- package/dist/lib/esm/obsidian/Vault.mjs +42 -4
- package/dist/lib/esm/obsidian/VaultDelete.d.mts +18 -0
- package/dist/lib/esm/obsidian/VaultDelete.mjs +73 -0
- package/dist/lib/esm/obsidian/index.d.mts +1 -1
- package/dist/lib/esm/obsidian/index.mjs +3 -3
- package/obsidian/VaultDelete/package.json +6 -0
- package/package.json +1 -1
- package/dist/lib/cjs/obsidian/VaultEx.cjs +0 -198
- package/dist/lib/cjs/obsidian/VaultEx.d.cts +0 -36
- package/dist/lib/esm/obsidian/VaultEx.d.mts +0 -36
- package/dist/lib/esm/obsidian/VaultEx.mjs +0 -98
- package/obsidian/VaultEx/package.json +0 -6
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* This module provides additional utilities for working with the Obsidian Vault.
|
|
5
|
-
*
|
|
6
|
-
* It has to be extracted from `Vault` because of circular dependencies.
|
|
7
|
-
*/
|
|
8
|
-
import type { App } from 'obsidian';
|
|
9
|
-
import type { PathOrAbstractFile, PathOrFolder } from './FileSystem.cjs';
|
|
10
|
-
/**
|
|
11
|
-
* Deletes an empty folder.
|
|
12
|
-
*
|
|
13
|
-
* @param app - The application instance.
|
|
14
|
-
* @param pathOrFolder - The folder to delete.
|
|
15
|
-
* @returns A {@link Promise} that resolves when the folder is deleted.
|
|
16
|
-
*/
|
|
17
|
-
export declare function deleteEmptyFolder(app: App, pathOrFolder: null | PathOrFolder): Promise<void>;
|
|
18
|
-
/**
|
|
19
|
-
* Removes empty folder hierarchy starting from the given folder.
|
|
20
|
-
*
|
|
21
|
-
* @param app - The application instance.
|
|
22
|
-
* @param pathOrFolder - The folder to start removing empty hierarchy from.
|
|
23
|
-
* @returns A {@link Promise} that resolves when the empty hierarchy is deleted.
|
|
24
|
-
*/
|
|
25
|
-
export declare function deleteEmptyFolderHierarchy(app: App, pathOrFolder: null | PathOrFolder): Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* Deletes abstract file safely from the vault.
|
|
28
|
-
*
|
|
29
|
-
* @param app - The Obsidian application instance.
|
|
30
|
-
* @param pathOrFile - The path or abstract file to delete.
|
|
31
|
-
* @param deletedNotePath - Optional. The path of the note that triggered the removal.
|
|
32
|
-
* @param shouldReportUsedAttachments - Optional. If `true`, a notice will be shown for each attachment that is still used by other notes.
|
|
33
|
-
* @param shouldDeleteEmptyFolders - Optional. If `true`, empty folders will be deleted.
|
|
34
|
-
* @returns A {@link Promise} that resolves to a boolean indicating whether the removal was successful.
|
|
35
|
-
*/
|
|
36
|
-
export declare function deleteSafe(app: App, pathOrFile: PathOrAbstractFile, deletedNotePath?: string, shouldReportUsedAttachments?: boolean, shouldDeleteEmptyFolders?: boolean): Promise<boolean>;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @packageDocumentation
|
|
3
|
-
*
|
|
4
|
-
* This module provides additional utilities for working with the Obsidian Vault.
|
|
5
|
-
*
|
|
6
|
-
* It has to be extracted from `Vault` because of circular dependencies.
|
|
7
|
-
*/
|
|
8
|
-
import type { App } from 'obsidian';
|
|
9
|
-
import type { PathOrAbstractFile, PathOrFolder } from './FileSystem.mjs';
|
|
10
|
-
/**
|
|
11
|
-
* Deletes an empty folder.
|
|
12
|
-
*
|
|
13
|
-
* @param app - The application instance.
|
|
14
|
-
* @param pathOrFolder - The folder to delete.
|
|
15
|
-
* @returns A {@link Promise} that resolves when the folder is deleted.
|
|
16
|
-
*/
|
|
17
|
-
export declare function deleteEmptyFolder(app: App, pathOrFolder: null | PathOrFolder): Promise<void>;
|
|
18
|
-
/**
|
|
19
|
-
* Removes empty folder hierarchy starting from the given folder.
|
|
20
|
-
*
|
|
21
|
-
* @param app - The application instance.
|
|
22
|
-
* @param pathOrFolder - The folder to start removing empty hierarchy from.
|
|
23
|
-
* @returns A {@link Promise} that resolves when the empty hierarchy is deleted.
|
|
24
|
-
*/
|
|
25
|
-
export declare function deleteEmptyFolderHierarchy(app: App, pathOrFolder: null | PathOrFolder): Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* Deletes abstract file safely from the vault.
|
|
28
|
-
*
|
|
29
|
-
* @param app - The Obsidian application instance.
|
|
30
|
-
* @param pathOrFile - The path or abstract file to delete.
|
|
31
|
-
* @param deletedNotePath - Optional. The path of the note that triggered the removal.
|
|
32
|
-
* @param shouldReportUsedAttachments - Optional. If `true`, a notice will be shown for each attachment that is still used by other notes.
|
|
33
|
-
* @param shouldDeleteEmptyFolders - Optional. If `true`, empty folders will be deleted.
|
|
34
|
-
* @returns A {@link Promise} that resolves to a boolean indicating whether the removal was successful.
|
|
35
|
-
*/
|
|
36
|
-
export declare function deleteSafe(app: App, pathOrFile: PathOrAbstractFile, deletedNotePath?: string, shouldReportUsedAttachments?: boolean, shouldDeleteEmptyFolders?: boolean): Promise<boolean>;
|
|
@@ -1,98 +0,0 @@
|
|
|
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
|
-
|
|
6
|
-
(function initEsm() {
|
|
7
|
-
if (globalThis.process) {
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const browserProcess = {
|
|
12
|
-
browser: true,
|
|
13
|
-
cwd() {
|
|
14
|
-
return '/';
|
|
15
|
-
},
|
|
16
|
-
env: {},
|
|
17
|
-
platform: 'android'
|
|
18
|
-
};
|
|
19
|
-
globalThis.process = browserProcess;
|
|
20
|
-
})();
|
|
21
|
-
|
|
22
|
-
import { Notice } from "obsidian";
|
|
23
|
-
import { printError } from "../Error.mjs";
|
|
24
|
-
import {
|
|
25
|
-
getAbstractFileOrNull,
|
|
26
|
-
getFolderOrNull,
|
|
27
|
-
isFile,
|
|
28
|
-
isFolder
|
|
29
|
-
} from "./FileSystem.mjs";
|
|
30
|
-
import { t } from "./i18n/i18n.mjs";
|
|
31
|
-
import { getBacklinksForFileSafe } from "./MetadataCache.mjs";
|
|
32
|
-
import {
|
|
33
|
-
isEmptyFolder,
|
|
34
|
-
listSafe
|
|
35
|
-
} from "./Vault.mjs";
|
|
36
|
-
async function deleteEmptyFolder(app, pathOrFolder) {
|
|
37
|
-
const folder = getFolderOrNull(app, pathOrFolder);
|
|
38
|
-
if (!folder) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (!await isEmptyFolder(app, folder)) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
await deleteSafe(app, folder);
|
|
45
|
-
}
|
|
46
|
-
async function deleteEmptyFolderHierarchy(app, pathOrFolder) {
|
|
47
|
-
let folder = getFolderOrNull(app, pathOrFolder);
|
|
48
|
-
while (folder) {
|
|
49
|
-
if (!await isEmptyFolder(app, folder)) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const parent = folder.parent;
|
|
53
|
-
await deleteEmptyFolder(app, folder);
|
|
54
|
-
folder = parent;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async function deleteSafe(app, pathOrFile, deletedNotePath, shouldReportUsedAttachments, shouldDeleteEmptyFolders) {
|
|
58
|
-
const file = getAbstractFileOrNull(app, pathOrFile);
|
|
59
|
-
if (!file) {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
let canDelete = isFile(file) || (shouldDeleteEmptyFolders ?? true);
|
|
63
|
-
if (isFile(file)) {
|
|
64
|
-
const backlinks = await getBacklinksForFileSafe(app, file);
|
|
65
|
-
if (deletedNotePath) {
|
|
66
|
-
backlinks.clear(deletedNotePath);
|
|
67
|
-
}
|
|
68
|
-
if (backlinks.count() !== 0) {
|
|
69
|
-
if (shouldReportUsedAttachments) {
|
|
70
|
-
new Notice(t(($) => $.obsidianDevUtils.notices.attachmentIsStillUsed, { attachmentPath: file.path }));
|
|
71
|
-
}
|
|
72
|
-
canDelete = false;
|
|
73
|
-
}
|
|
74
|
-
} else if (isFolder(file)) {
|
|
75
|
-
const listedFiles = await listSafe(app, file);
|
|
76
|
-
for (const child of [...listedFiles.files, ...listedFiles.folders]) {
|
|
77
|
-
canDelete &&= await deleteSafe(app, child, deletedNotePath, shouldReportUsedAttachments);
|
|
78
|
-
}
|
|
79
|
-
canDelete &&= await isEmptyFolder(app, file);
|
|
80
|
-
}
|
|
81
|
-
if (canDelete) {
|
|
82
|
-
try {
|
|
83
|
-
await app.fileManager.trashFile(file);
|
|
84
|
-
} catch (e) {
|
|
85
|
-
if (await app.vault.exists(file.path)) {
|
|
86
|
-
printError(new Error(`Failed to delete ${file.path}`, { cause: e }));
|
|
87
|
-
canDelete = false;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return canDelete;
|
|
92
|
-
}
|
|
93
|
-
export {
|
|
94
|
-
deleteEmptyFolder,
|
|
95
|
-
deleteEmptyFolderHierarchy,
|
|
96
|
-
deleteSafe
|
|
97
|
-
};
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1ZhdWx0RXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWRkaXRpb25hbCB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgT2JzaWRpYW4gVmF1bHQuXG4gKlxuICogSXQgaGFzIHRvIGJlIGV4dHJhY3RlZCBmcm9tIGBWYXVsdGAgYmVjYXVzZSBvZiBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBQYXRoT3JBYnN0cmFjdEZpbGUsXG4gIFBhdGhPckZvbGRlclxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnLi4vRXJyb3IudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWJzdHJhY3RGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXJPck51bGwsXG4gIGlzRmlsZSxcbiAgaXNGb2xkZXJcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSB9IGZyb20gJy4vTWV0YWRhdGFDYWNoZS50cyc7XG5pbXBvcnQge1xuICBpc0VtcHR5Rm9sZGVyLFxuICBsaXN0U2FmZVxufSBmcm9tICcuL1ZhdWx0LnRzJztcblxuLyoqXG4gKiBEZWxldGVzIGFuIGVtcHR5IGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZvbGRlciAtIFRoZSBmb2xkZXIgdG8gZGVsZXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb2xkZXIgaXMgZGVsZXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUVtcHR5Rm9sZGVyKGFwcDogQXBwLCBwYXRoT3JGb2xkZXI6IG51bGwgfCBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgcGF0aE9yRm9sZGVyKTtcbiAgaWYgKCFmb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFhd2FpdCBpc0VtcHR5Rm9sZGVyKGFwcCwgZm9sZGVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBkZWxldGVTYWZlKGFwcCwgZm9sZGVyKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGVtcHR5IGZvbGRlciBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIGZvbGRlciB0byBzdGFydCByZW1vdmluZyBlbXB0eSBoaWVyYXJjaHkgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZW1wdHkgaGllcmFyY2h5IGlzIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeShhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBudWxsIHwgUGF0aE9yRm9sZGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBwYXRoT3JGb2xkZXIpO1xuXG4gIHdoaWxlIChmb2xkZXIpIHtcbiAgICBpZiAoIWF3YWl0IGlzRW1wdHlGb2xkZXIoYXBwLCBmb2xkZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGZvbGRlci5wYXJlbnQ7XG4gICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXIoYXBwLCBmb2xkZXIpO1xuICAgIGZvbGRlciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIERlbGV0ZXMgYWJzdHJhY3QgZmlsZSBzYWZlbHkgZnJvbSB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgYWJzdHJhY3QgZmlsZSB0byBkZWxldGUuXG4gKiBAcGFyYW0gZGVsZXRlZE5vdGVQYXRoIC0gT3B0aW9uYWwuIFRoZSBwYXRoIG9mIHRoZSBub3RlIHRoYXQgdHJpZ2dlcmVkIHRoZSByZW1vdmFsLlxuICogQHBhcmFtIHNob3VsZFJlcG9ydFVzZWRBdHRhY2htZW50cyAtIE9wdGlvbmFsLiBJZiBgdHJ1ZWAsIGEgbm90aWNlIHdpbGwgYmUgc2hvd24gZm9yIGVhY2ggYXR0YWNobWVudCB0aGF0IGlzIHN0aWxsIHVzZWQgYnkgb3RoZXIgbm90ZXMuXG4gKiBAcGFyYW0gc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzIC0gT3B0aW9uYWwuIElmIGB0cnVlYCwgZW1wdHkgZm9sZGVycyB3aWxsIGJlIGRlbGV0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlbW92YWwgd2FzIHN1Y2Nlc3NmdWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVTYWZlKFxuICBhcHA6IEFwcCxcbiAgcGF0aE9yRmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlLFxuICBkZWxldGVkTm90ZVBhdGg/OiBzdHJpbmcsXG4gIHNob3VsZFJlcG9ydFVzZWRBdHRhY2htZW50cz86IGJvb2xlYW4sXG4gIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycz86IGJvb2xlYW5cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBmaWxlID0gZ2V0QWJzdHJhY3RGaWxlT3JOdWxsKGFwcCwgcGF0aE9yRmlsZSk7XG5cbiAgaWYgKCFmaWxlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGNhbkRlbGV0ZSA9IGlzRmlsZShmaWxlKSB8fCAoc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzID8/IHRydWUpO1xuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBUQWJzdHJhY3RGaWxlIGlzIGFsd2F5cyBURmlsZSBvciBURm9sZGVyIGluIE9ic2lkaWFuOyB0aGUgZmFsc2UgYnJhbmNoIG9mIGlzRmlsZSBsZWFkcyB0byBpc0ZvbGRlci4gKi9cbiAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwLCBmaWxlKTtcbiAgICBpZiAoZGVsZXRlZE5vdGVQYXRoKSB7XG4gICAgICBiYWNrbGlua3MuY2xlYXIoZGVsZXRlZE5vdGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKGJhY2tsaW5rcy5jb3VudCgpICE9PSAwKSB7XG4gICAgICBpZiAoc2hvdWxkUmVwb3J0VXNlZEF0dGFjaG1lbnRzKSB7XG4gICAgICAgIG5ldyBOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm5vdGljZXMuYXR0YWNobWVudElzU3RpbGxVc2VkLCB7IGF0dGFjaG1lbnRQYXRoOiBmaWxlLnBhdGggfSkpO1xuICAgICAgfVxuICAgICAgY2FuRGVsZXRlID0gZmFsc2U7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBUQWJzdHJhY3RGaWxlIGlzIGFsd2F5cyBURmlsZSBvciBURm9sZGVyIGluIE9ic2lkaWFuOyBkZWZlbnNpdmUgZmFsbGJhY2suICovXG4gIH0gZWxzZSBpZiAoaXNGb2xkZXIoZmlsZSkpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIGNvbnN0IGxpc3RlZEZpbGVzID0gYXdhaXQgbGlzdFNhZmUoYXBwLCBmaWxlKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIFsuLi5saXN0ZWRGaWxlcy5maWxlcywgLi4ubGlzdGVkRmlsZXMuZm9sZGVyc10pIHtcbiAgICAgIGNhbkRlbGV0ZSAmJj0gYXdhaXQgZGVsZXRlU2FmZShhcHAsIGNoaWxkLCBkZWxldGVkTm90ZVBhdGgsIHNob3VsZFJlcG9ydFVzZWRBdHRhY2htZW50cyk7XG4gICAgfVxuXG4gICAgY2FuRGVsZXRlICYmPSBhd2FpdCBpc0VtcHR5Rm9sZGVyKGFwcCwgZmlsZSk7XG4gIH1cblxuICBpZiAoY2FuRGVsZXRlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci50cmFzaEZpbGUoZmlsZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGF3YWl0IGFwcC52YXVsdC5leGlzdHMoZmlsZS5wYXRoKSkge1xuICAgICAgICBwcmludEVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSAke2ZpbGUucGF0aH1gLCB7IGNhdXNlOiBlIH0pKTtcbiAgICAgICAgY2FuRGVsZXRlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhbkRlbGV0ZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLFNBQVMsY0FBYztBQU92QixTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsK0JBQStCO0FBQ3hDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBU1AsZUFBc0Isa0JBQWtCLEtBQVUsY0FBa0Q7QUFDbEcsUUFBTSxTQUFTLGdCQUFnQixLQUFLLFlBQVk7QUFDaEQsTUFBSSxDQUFDLFFBQVE7QUFDWDtBQUFBLEVBQ0Y7QUFDQSxNQUFJLENBQUMsTUFBTSxjQUFjLEtBQUssTUFBTSxHQUFHO0FBQ3JDO0FBQUEsRUFDRjtBQUNBLFFBQU0sV0FBVyxLQUFLLE1BQU07QUFDOUI7QUFTQSxlQUFzQiwyQkFBMkIsS0FBVSxjQUFrRDtBQUMzRyxNQUFJLFNBQVMsZ0JBQWdCLEtBQUssWUFBWTtBQUU5QyxTQUFPLFFBQVE7QUFDYixRQUFJLENBQUMsTUFBTSxjQUFjLEtBQUssTUFBTSxHQUFHO0FBQ3JDO0FBQUEsSUFDRjtBQUNBLFVBQU0sU0FBUyxPQUFPO0FBQ3RCLFVBQU0sa0JBQWtCLEtBQUssTUFBTTtBQUNuQyxhQUFTO0FBQUEsRUFDWDtBQUNGO0FBWUEsZUFBc0IsV0FDcEIsS0FDQSxZQUNBLGlCQUNBLDZCQUNBLDBCQUNrQjtBQUNsQixRQUFNLE9BQU8sc0JBQXNCLEtBQUssVUFBVTtBQUVsRCxNQUFJLENBQUMsTUFBTTtBQUNULFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxZQUFZLE9BQU8sSUFBSSxNQUFNLDRCQUE0QjtBQUc3RCxNQUFJLE9BQU8sSUFBSSxHQUFHO0FBRWhCLFVBQU0sWUFBWSxNQUFNLHdCQUF3QixLQUFLLElBQUk7QUFDekQsUUFBSSxpQkFBaUI7QUFDbkIsZ0JBQVUsTUFBTSxlQUFlO0FBQUEsSUFDakM7QUFDQSxRQUFJLFVBQVUsTUFBTSxNQUFNLEdBQUc7QUFDM0IsVUFBSSw2QkFBNkI7QUFDL0IsWUFBSSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLFFBQVEsdUJBQXVCLEVBQUUsZ0JBQWdCLEtBQUssS0FBSyxDQUFDLENBQUM7QUFBQSxNQUN0RztBQUNBLGtCQUFZO0FBQUEsSUFDZDtBQUFBLEVBRUYsV0FBVyxTQUFTLElBQUksR0FBRztBQUV6QixVQUFNLGNBQWMsTUFBTSxTQUFTLEtBQUssSUFBSTtBQUM1QyxlQUFXLFNBQVMsQ0FBQyxHQUFHLFlBQVksT0FBTyxHQUFHLFlBQVksT0FBTyxHQUFHO0FBQ2xFLG9CQUFjLE1BQU0sV0FBVyxLQUFLLE9BQU8saUJBQWlCLDJCQUEyQjtBQUFBLElBQ3pGO0FBRUEsa0JBQWMsTUFBTSxjQUFjLEtBQUssSUFBSTtBQUFBLEVBQzdDO0FBRUEsTUFBSSxXQUFXO0FBQ2IsUUFBSTtBQUNGLFlBQU0sSUFBSSxZQUFZLFVBQVUsSUFBSTtBQUFBLElBQ3RDLFNBQVMsR0FBRztBQUNWLFVBQUksTUFBTSxJQUFJLE1BQU0sT0FBTyxLQUFLLElBQUksR0FBRztBQUNyQyxtQkFBVyxJQUFJLE1BQU0sb0JBQW9CLEtBQUssSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNuRSxvQkFBWTtBQUFBLE1BQ2Q7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
|