obsidian-dev-utils 76.1.0 → 77.1.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 (63) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/dev/main.js +268 -50
  3. package/dist/lib/cjs/library.cjs +1 -1
  4. package/dist/lib/cjs/obsidian/attachment-path.cjs +2 -2
  5. package/dist/lib/cjs/obsidian/attachment-path.d.cts +11 -4
  6. package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +238 -0
  7. package/dist/lib/cjs/obsidian/case-insensitive-file-index.d.cts +92 -0
  8. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +173 -0
  9. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.d.cts +29 -0
  10. package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +167 -0
  11. package/dist/lib/cjs/obsidian/components/embed-extensions-component.d.cts +38 -0
  12. package/dist/lib/cjs/obsidian/components/index.cjs +7 -1
  13. package/dist/lib/cjs/obsidian/components/index.d.cts +2 -0
  14. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +17 -15
  15. package/dist/lib/cjs/obsidian/file-change.cjs +2 -2
  16. package/dist/lib/cjs/obsidian/file-manager.cjs +4 -4
  17. package/dist/lib/cjs/obsidian/file-system.cjs +20 -19
  18. package/dist/lib/cjs/obsidian/file-system.d.cts +6 -12
  19. package/dist/lib/cjs/obsidian/index.cjs +7 -1
  20. package/dist/lib/cjs/obsidian/index.d.cts +2 -0
  21. package/dist/lib/cjs/obsidian/link.cjs +8 -9
  22. package/dist/lib/cjs/obsidian/vault.cjs +3 -3
  23. package/dist/lib/cjs/obsidian/view-registrar.cjs +156 -0
  24. package/dist/lib/cjs/obsidian/view-registrar.d.cts +39 -0
  25. package/dist/lib/cjs/script-utils/linters/index.cjs +6 -3
  26. package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
  27. package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +458 -0
  28. package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +216 -0
  29. package/dist/lib/cjs/script-utils/nano-staged-config.cjs +10 -2
  30. package/dist/lib/esm/library.mjs +1 -1
  31. package/dist/lib/esm/obsidian/attachment-path.d.mts +11 -4
  32. package/dist/lib/esm/obsidian/attachment-path.mjs +2 -2
  33. package/dist/lib/esm/obsidian/case-insensitive-file-index.d.mts +92 -0
  34. package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +127 -0
  35. package/dist/lib/esm/obsidian/components/case-insensitive-file-index-component.d.mts +29 -0
  36. package/dist/lib/esm/obsidian/components/case-insensitive-file-index-component.mjs +69 -0
  37. package/dist/lib/esm/obsidian/components/embed-extensions-component.d.mts +38 -0
  38. package/dist/lib/esm/obsidian/components/embed-extensions-component.mjs +59 -0
  39. package/dist/lib/esm/obsidian/components/index.d.mts +2 -0
  40. package/dist/lib/esm/obsidian/components/index.mjs +5 -1
  41. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +17 -15
  42. package/dist/lib/esm/obsidian/file-change.mjs +2 -2
  43. package/dist/lib/esm/obsidian/file-manager.mjs +4 -4
  44. package/dist/lib/esm/obsidian/file-system.d.mts +6 -12
  45. package/dist/lib/esm/obsidian/file-system.mjs +20 -19
  46. package/dist/lib/esm/obsidian/index.d.mts +2 -0
  47. package/dist/lib/esm/obsidian/index.mjs +5 -1
  48. package/dist/lib/esm/obsidian/link.mjs +8 -9
  49. package/dist/lib/esm/obsidian/vault.mjs +3 -3
  50. package/dist/lib/esm/obsidian/view-registrar.d.mts +39 -0
  51. package/dist/lib/esm/obsidian/view-registrar.mjs +48 -0
  52. package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
  53. package/dist/lib/esm/script-utils/linters/index.mjs +4 -2
  54. package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +216 -0
  55. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +370 -0
  56. package/dist/lib/esm/script-utils/nano-staged-config.mjs +10 -2
  57. package/dist/scripts/linters/over-exposure/find-overexposed.ts +12 -0
  58. package/obsidian/Components/case-insensitive-file-index-component/package.json +6 -0
  59. package/obsidian/Components/embed-extensions-component/package.json +6 -0
  60. package/obsidian/case-insensitive-file-index/package.json +6 -0
  61. package/obsidian/view-registrar/package.json +6 -0
  62. package/package.json +15 -15
  63. package/script-utils/linters/over-exposure/package.json +6 -0
@@ -0,0 +1,370 @@
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
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ if (globalThis.process) {
9
+ return;
10
+ }
11
+
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return '/';
16
+ },
17
+ env: {},
18
+ platform: 'android'
19
+ };
20
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
21
+ globalThis.process = browserProcess;
22
+ })();
23
+
24
+ import {
25
+ canHaveModifiers,
26
+ createDocumentRegistry,
27
+ createLanguageService,
28
+ getDefaultLibFilePath,
29
+ getModifiers,
30
+ isClassDeclaration,
31
+ isClassLike,
32
+ isEnumDeclaration,
33
+ isFunctionDeclaration,
34
+ isGetAccessorDeclaration,
35
+ isIdentifier,
36
+ isInterfaceDeclaration,
37
+ isMethodDeclaration,
38
+ isPropertyDeclaration,
39
+ isSetAccessorDeclaration,
40
+ isSourceFile,
41
+ isTypeAliasDeclaration,
42
+ isVariableStatement,
43
+ ScriptSnapshot,
44
+ SyntaxKind,
45
+ sys
46
+ } from "typescript";
47
+ import { assertNonNullable } from "../../type-guards.mjs";
48
+ import {
49
+ parseTsConfig,
50
+ toCanonical
51
+ } from "../check-project-types.mjs";
52
+ const LIFECYCLE_ALLOWLIST = /* @__PURE__ */ new Set([
53
+ "display",
54
+ "hide",
55
+ "onExternalSettingsChange",
56
+ "onLayoutReady",
57
+ "onload",
58
+ "onloadImpl",
59
+ "onLoadSettings",
60
+ "onSaveSettings",
61
+ "onunload",
62
+ "onunloadImpl"
63
+ ]);
64
+ const MEMBER_EXPOSURE_ORDER = ["private", "protected", "public"];
65
+ const SCOPE_DESCRIPTION = {
66
+ "file-local": "within its own file",
67
+ "private": "inside its own class",
68
+ "protected": "inside its class + subclasses"
69
+ };
70
+ function analyzeOverExposure(params) {
71
+ const { languageService, onProgress, srcFolder } = params;
72
+ const program = languageService.getProgram();
73
+ if (!program) {
74
+ return [];
75
+ }
76
+ const context = {
77
+ checker: program.getTypeChecker(),
78
+ findings: [],
79
+ languageService,
80
+ program
81
+ };
82
+ const sourceFilesToAnalyze = program.getSourceFiles().filter((sourceFile) => {
83
+ const filePath = toCanonical(sourceFile.fileName);
84
+ return isOwnSourceFile(filePath, srcFolder) && !isTestFile(filePath);
85
+ });
86
+ for (const [analyzedFileCount, sourceFile] of sourceFilesToAnalyze.entries()) {
87
+ onProgress?.({
88
+ analyzedFileCount,
89
+ currentFilePath: toCanonical(sourceFile.fileName),
90
+ totalFileCount: sourceFilesToAnalyze.length
91
+ });
92
+ visit(sourceFile);
93
+ }
94
+ return context.findings;
95
+ function visit(node) {
96
+ analyzeMember(node, context);
97
+ analyzeExport(node, context);
98
+ node.forEachChild(visit);
99
+ }
100
+ }
101
+ function createLanguageServiceHost(params) {
102
+ const { compilerOptions, fileNames, fileSystem } = params;
103
+ return {
104
+ directoryExists: (directory) => fileSystem.directoryExists(directory),
105
+ fileExists: (file) => fileSystem.fileExists(file),
106
+ getCompilationSettings: () => compilerOptions,
107
+ getCurrentDirectory: () => fileSystem.getCurrentDirectory(),
108
+ getDefaultLibFileName: (libOptions) => getDefaultLibFilePath(libOptions),
109
+ getDirectories: (directory) => fileSystem.getDirectories(directory),
110
+ getScriptFileNames: () => [...fileNames],
111
+ getScriptSnapshot: (fileName) => {
112
+ const text = fileSystem.readFile(fileName);
113
+ return text === void 0 ? void 0 : ScriptSnapshot.fromString(text);
114
+ },
115
+ getScriptVersion: () => "0",
116
+ readDirectory: (path, extensions, exclude, include, depth) => fileSystem.readDirectory(path, extensions, exclude, include, depth),
117
+ readFile: (file) => fileSystem.readFile(file)
118
+ };
119
+ }
120
+ function createProjectLanguageService(params) {
121
+ const { fileNames, options } = parseTsConfig(params.tsConfigPath);
122
+ return createLanguageService(createLanguageServiceHost({ compilerOptions: options, fileNames, fileSystem: sys }), createDocumentRegistry());
123
+ }
124
+ function findOverExposure(params) {
125
+ const projectFolder = toCanonical(params.projectFolder);
126
+ const languageService = createProjectLanguageService({ tsConfigPath: `${projectFolder}/tsconfig.json` });
127
+ return analyzeOverExposure({
128
+ languageService,
129
+ srcFolder: `${projectFolder}/src`,
130
+ ...params.onProgress ? { onProgress: params.onProgress } : {}
131
+ });
132
+ }
133
+ function formatOverExposureFindings(findings, options) {
134
+ if (findings.length === 0) {
135
+ return "No over-exposed declarations found.\n";
136
+ }
137
+ const baseFolder = options?.baseFolder === void 0 ? void 0 : toCanonical(options.baseFolder);
138
+ const byFile = /* @__PURE__ */ new Map();
139
+ for (const finding of findings) {
140
+ const list = byFile.get(finding.filePath) ?? [];
141
+ list.push(finding);
142
+ byFile.set(finding.filePath, list);
143
+ }
144
+ const lines = [];
145
+ for (const [filePath, list] of byFile) {
146
+ const displayPath = toDisplayPath(filePath, baseFolder);
147
+ for (const finding of [...list].sort((a, b) => a.line - b.line)) {
148
+ const location = `${displayPath}:${String(finding.line)}:${String(finding.column)}`;
149
+ const change = `${finding.currentExposure} ${finding.name} -> ${finding.suggestedExposure}`;
150
+ lines.push(location, `${change} -- ${describeReason(finding)}`, "");
151
+ }
152
+ }
153
+ lines.push(`${String(findings.length)} finding(s).`);
154
+ return `${lines.join("\n")}
155
+ `;
156
+ }
157
+ function analyzeExport(node, context) {
158
+ const sourceFile = node.getSourceFile();
159
+ if (node.parent !== sourceFile || !getModifierKinds(node).has(SyntaxKind.ExportKeyword)) {
160
+ return;
161
+ }
162
+ const declFilePath = toCanonical(sourceFile.fileName);
163
+ for (const nameNode of getExportedNameNodes(node)) {
164
+ const references = collectReferences(context.languageService.findReferences(sourceFile.fileName, nameNode.getStart())).filter((reference) => !isDeclarationItself(reference, nameNode));
165
+ const otherFileReferences = references.filter((reference) => toCanonical(reference.fileName) !== declFilePath);
166
+ if (otherFileReferences.length === 0) {
167
+ context.findings.push(buildFinding(node, nameNode, "export", "file-local", { hasNoReferences: references.length === 0, isForcedByTestOnly: false }));
168
+ continue;
169
+ }
170
+ const nonTestReferences = otherFileReferences.filter((reference) => !isTestFile(toCanonical(reference.fileName)));
171
+ if (nonTestReferences.length === 0) {
172
+ context.findings.push(buildFinding(node, nameNode, "export", "file-local", { hasNoReferences: false, isForcedByTestOnly: true }));
173
+ }
174
+ }
175
+ }
176
+ function analyzeMember(node, context) {
177
+ const nameNode = getMemberNameNode(node);
178
+ if (!nameNode || !isClassLike(node.parent)) {
179
+ return;
180
+ }
181
+ const declaringClass = node.parent;
182
+ const modifierKinds = getModifierKinds(node);
183
+ if (modifierKinds.has(SyntaxKind.StaticKeyword) || modifierKinds.has(SyntaxKind.OverrideKeyword) || LIFECYCLE_ALLOWLIST.has(nameNode.getText())) {
184
+ return;
185
+ }
186
+ const currentExposure = getCurrentMemberExposure(modifierKinds);
187
+ if (currentExposure === "private") {
188
+ return;
189
+ }
190
+ const sourceFile = node.getSourceFile();
191
+ const references = collectReferences(context.languageService.findReferences(sourceFile.fileName, nameNode.getStart())).filter((reference) => !isDeclarationItself(reference, nameNode));
192
+ const nonTestReferences = references.filter((reference) => !isTestFile(toCanonical(reference.fileName)));
193
+ const neededForSrc = computeNeededExposure(nonTestReferences, declaringClass, context);
194
+ const neededWithTests = computeNeededExposure(references, declaringClass, context);
195
+ if (neededForSrc === "public") {
196
+ return;
197
+ }
198
+ if (rankExposure(neededForSrc) >= rankExposure(currentExposure)) {
199
+ return;
200
+ }
201
+ context.findings.push(buildFinding(node, nameNode, currentExposure, neededForSrc, {
202
+ hasNoReferences: references.length === 0,
203
+ isForcedByTestOnly: rankExposure(neededWithTests) > rankExposure(neededForSrc)
204
+ }));
205
+ }
206
+ function buildFinding(node, nameNode, currentExposure, suggestedExposure, flags) {
207
+ const sourceFile = node.getSourceFile();
208
+ const { character, line } = sourceFile.getLineAndCharacterOfPosition(nameNode.getStart());
209
+ return {
210
+ column: character + 1,
211
+ currentExposure,
212
+ filePath: toCanonical(sourceFile.fileName),
213
+ hasNoReferences: flags.hasNoReferences,
214
+ isForcedByTestOnly: flags.isForcedByTestOnly,
215
+ isMember: currentExposure !== "export",
216
+ line: line + 1,
217
+ name: nameNode.getText(),
218
+ suggestedExposure
219
+ };
220
+ }
221
+ function collectReferences(referencedSymbols) {
222
+ const references = [];
223
+ for (const referencedSymbol of referencedSymbols ?? []) {
224
+ for (const reference of referencedSymbol.references) {
225
+ references.push({ fileName: reference.fileName, start: reference.textSpan.start });
226
+ }
227
+ }
228
+ return references;
229
+ }
230
+ function computeNeededExposure(references, declaringClass, context) {
231
+ if (references.length === 0) {
232
+ return "private";
233
+ }
234
+ let needed = "private";
235
+ for (const reference of references) {
236
+ const referenceClass = getClassAtPosition(context.program, reference.fileName, reference.start);
237
+ if (referenceClass === declaringClass) {
238
+ continue;
239
+ }
240
+ if (referenceClass && isDerivedFrom(referenceClass, declaringClass, context.checker)) {
241
+ needed = "protected";
242
+ continue;
243
+ }
244
+ return "public";
245
+ }
246
+ return needed;
247
+ }
248
+ function describeReason(finding) {
249
+ const base = `referenced only ${SCOPE_DESCRIPTION[finding.suggestedExposure]}`;
250
+ if (finding.isForcedByTestOnly) {
251
+ return `${base} (exposed only for tests)`;
252
+ }
253
+ if (finding.hasNoReferences) {
254
+ return `${base} (no references at all)`;
255
+ }
256
+ return base;
257
+ }
258
+ function findNodeAtPosition(node, position) {
259
+ if (position < node.getStart() || position >= node.getEnd()) {
260
+ return void 0;
261
+ }
262
+ let result = node;
263
+ node.forEachChild((child) => {
264
+ const found = findNodeAtPosition(child, position);
265
+ if (found) {
266
+ result = found;
267
+ }
268
+ });
269
+ return result;
270
+ }
271
+ function getClassAtPosition(program, fileName, position) {
272
+ const sourceFile = program.getSourceFile(fileName);
273
+ assertNonNullable(sourceFile, `Source file not found in program: ${fileName}`);
274
+ const node = findNodeAtPosition(sourceFile, position);
275
+ assertNonNullable(node, `No node found at position ${String(position)} in ${fileName}`);
276
+ return getEnclosingClass(node);
277
+ }
278
+ function getCurrentMemberExposure(modifierKinds) {
279
+ if (modifierKinds.has(SyntaxKind.PrivateKeyword)) {
280
+ return "private";
281
+ }
282
+ if (modifierKinds.has(SyntaxKind.ProtectedKeyword)) {
283
+ return "protected";
284
+ }
285
+ return "public";
286
+ }
287
+ function getEnclosingClass(node) {
288
+ let current = node;
289
+ while (!isSourceFile(current)) {
290
+ if (isClassLike(current)) {
291
+ return current;
292
+ }
293
+ current = current.parent;
294
+ }
295
+ return void 0;
296
+ }
297
+ function getExportedNameNodes(node) {
298
+ if (isFunctionDeclaration(node) || isClassDeclaration(node) || isInterfaceDeclaration(node) || isTypeAliasDeclaration(node) || isEnumDeclaration(node)) {
299
+ return node.name ? [node.name] : [];
300
+ }
301
+ if (isVariableStatement(node)) {
302
+ return node.declarationList.declarations.map((declaration) => declaration.name).filter(isIdentifier);
303
+ }
304
+ return [];
305
+ }
306
+ function getMemberNameNode(node) {
307
+ if (isMethodDeclaration(node) || isPropertyDeclaration(node) || isGetAccessorDeclaration(node) || isSetAccessorDeclaration(node)) {
308
+ return node.name;
309
+ }
310
+ return void 0;
311
+ }
312
+ function getModifierKinds(node) {
313
+ const kinds = /* @__PURE__ */ new Set();
314
+ if (canHaveModifiers(node)) {
315
+ for (const modifier of getModifiers(node) ?? []) {
316
+ kinds.add(modifier.kind);
317
+ }
318
+ }
319
+ return kinds;
320
+ }
321
+ function isDeclarationItself(reference, nameNode) {
322
+ return toCanonical(reference.fileName) === toCanonical(nameNode.getSourceFile().fileName) && reference.start === nameNode.getStart();
323
+ }
324
+ function isDerivedFrom(derived, base, checker) {
325
+ const baseSymbol = base.name ? checker.getSymbolAtLocation(base.name) : void 0;
326
+ if (!baseSymbol) {
327
+ return false;
328
+ }
329
+ for (const clause of derived.heritageClauses ?? []) {
330
+ if (clause.token !== SyntaxKind.ExtendsKeyword) {
331
+ continue;
332
+ }
333
+ for (const typeExpression of clause.types) {
334
+ const symbol = checker.getTypeAtLocation(typeExpression.expression).getSymbol();
335
+ if (symbol === baseSymbol) {
336
+ return true;
337
+ }
338
+ for (const declaration of symbol?.declarations ?? []) {
339
+ if (isClassLike(declaration) && isDerivedFrom(declaration, base, checker)) {
340
+ return true;
341
+ }
342
+ }
343
+ }
344
+ }
345
+ return false;
346
+ }
347
+ function isOwnSourceFile(filePath, srcFolder) {
348
+ return filePath.startsWith(`${srcFolder}/`) && filePath.endsWith(".ts") && !filePath.endsWith(".d.ts");
349
+ }
350
+ function isTestFile(filePath) {
351
+ return filePath.includes(".test.") || filePath.includes(".integration.");
352
+ }
353
+ function rankExposure(exposure) {
354
+ return MEMBER_EXPOSURE_ORDER.indexOf(exposure);
355
+ }
356
+ function toDisplayPath(filePath, baseFolder) {
357
+ if (baseFolder !== void 0 && filePath.startsWith(`${baseFolder}/`)) {
358
+ return filePath.slice(baseFolder.length + 1);
359
+ }
360
+ return filePath;
361
+ }
362
+ export {
363
+ LIFECYCLE_ALLOWLIST,
364
+ analyzeOverExposure,
365
+ createLanguageServiceHost,
366
+ createProjectLanguageService,
367
+ findOverExposure,
368
+ formatOverExposureFindings
369
+ };
370
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi5cbiAqXG4gKiBBIG1lbWJlciByZWZlcmVuY2VkIG9ubHkgZnJvbSB0ZXN0IGZpbGVzIGlzIHJlcG9ydGVkIHdpdGgge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5fVxuICogc2V0LCBzdXJmYWNpbmcgbWVtYmVycyB3aWRlbmVkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkgXHUyMDE0IHRoZSBjYW5vbmljYWwgY2FzZSBmb3IgZXh0cmFjdGluZyBsb2dpY1xuICogaW50byBhbiBpbmRlcGVuZGVudGx5IHRlc3RhYmxlIGNvbXBvbmVudCBpbnN0ZWFkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIENvbXBpbGVyT3B0aW9ucyxcbiAgSVNjcmlwdFNuYXBzaG90LFxuICBMYW5ndWFnZVNlcnZpY2UsXG4gIExhbmd1YWdlU2VydmljZUhvc3QsXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFR5cGVDaGVja2VyXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TW9kaWZpZXJzLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzQ2xhc3NMaWtlLFxuICBpc0VudW1EZWNsYXJhdGlvbixcbiAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzSWRlbnRpZmllcixcbiAgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzU291cmNlRmlsZSxcbiAgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgaXNWYXJpYWJsZVN0YXRlbWVudCxcbiAgU2NyaXB0U25hcHNob3QsXG4gIFN5bnRheEtpbmQsXG4gIHN5c1xufSBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBwYXJzZVRzQ29uZmlnLFxuICB0b0Nhbm9uaWNhbFxufSBmcm9tICcuLi9jaGVjay1wcm9qZWN0LXR5cGVzLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyB7XG4gIC8qKiBUaGUgbGFuZ3VhZ2Ugc2VydmljZSB0byBxdWVyeSBmb3IgcmVmZXJlbmNlcyBhbmQgdHlwZXMuICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIG9uY2UgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLCBiZWZvcmUgdGhhdCBmaWxlIGlzIHByb2Nlc3NlZC4gVGhlXG4gICAqIHdob2xlLXByb2dyYW0gcmVmZXJlbmNlIGFuYWx5c2lzIGlzIHNsb3csIHNvIHRoaXMgbGV0cyBjYWxsZXJzIHJlcG9ydCBsaXZlIHByb2dyZXNzIGluc3RlYWQgb2ZcbiAgICogYXBwZWFyaW5nIHRvIGhhbmcuXG4gICAqL1xuICBvblByb2dyZXNzPyh0aGlzOiB2b2lkLCBwcm9ncmVzczogT3ZlckV4cG9zdXJlUHJvZ3Jlc3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBwcm9qZWN0J3MgYHNyY2AgZm9sZGVyLiBPbmx5IGRlY2xhcmF0aW9ucyBpbiBub24tdGVzdCBmaWxlc1xuICAgKiB1bmRlciB0aGlzIGZvbGRlciBhcmUgYW5hbHl6ZWQ7IGRlY2xhcmF0aW9ucyBlbHNld2hlcmUgKHRlc3QgZmlsZXMsIGRlcGVuZGVuY2llcykgYXJlIGlnbm9yZWRcbiAgICogYnV0IHN0aWxsIGNvdW50ZWQgYXMgcmVmZXJlbmNlIHNpdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnMge1xuICAvKipcbiAgICogV2hlbiBzZXQsIGZpbGUgcGF0aHMgaW4gdGhlIHJlcG9ydCBhcmUgcmVuZGVyZWQgcmVsYXRpdmUgdG8gdGhpcyBmb2xkZXIgKHR5cGljYWxseSB0aGUgY3VycmVudFxuICAgKiB3b3JraW5nIGRpcmVjdG9yeSkgaW5zdGVhZCBvZiBhcyBhYnNvbHV0ZSBwYXRocy4gUGF0aHMgb3V0c2lkZSB0aGUgZm9sZGVyIHN0YXkgYWJzb2x1dGUuXG4gICAqL1xuICByZWFkb25seSBiYXNlRm9sZGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgZmlsZS1zeXN0ZW0gb3BlcmF0aW9ucyB0aGUgbGFuZ3VhZ2Utc2VydmljZSBob3N0IG5lZWRzLiBJbmplY3RpbmcgdGhpcyAocmF0aGVyIHRoYW5cbiAqIGFsd2F5cyB1c2luZyBgdHlwZXNjcmlwdGAncyBgc3lzYCkgbGV0cyB0ZXN0cyBkcml2ZSB0aGUgYW5hbHl6ZXIgYWdhaW5zdCBpbi1tZW1vcnkgc291cmNlcyB3aXRoIG5vXG4gKiByZWFsIGZpbGUtc3lzdGVtIGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVGaWxlU3lzdGVtIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBkaXJlY3RvcnkgZXhpc3RzLlxuICAgKi9cbiAgZGlyZWN0b3J5RXhpc3RzKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZmlsZSBleGlzdHMuXG4gICAqL1xuICBmaWxlRXhpc3RzKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKi9cbiAgZ2V0Q3VycmVudERpcmVjdG9yeSh0aGlzOiB2b2lkKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgaW1tZWRpYXRlIHN1YmRpcmVjdG9yeSBuYW1lcy5cbiAgICovXG4gIGdldERpcmVjdG9yaWVzKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJvb3QgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gZXh0ZW5zaW9ucyAtIEV4dGVuc2lvbnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGV4Y2x1ZGUgLSBQYXR0ZXJucyB0byBleGNsdWRlLlxuICAgKiBAcGFyYW0gaW5jbHVkZSAtIFBhdHRlcm5zIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSBkZXB0aCAtIE1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgZmlsZSBwYXRocy5cbiAgICovXG4gIHJlYWREaXJlY3RvcnkodGhpczogdm9pZCwgcGF0aDogc3RyaW5nLCBleHRlbnNpb25zPzogcmVhZG9ubHkgc3RyaW5nW10sIGV4Y2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSwgaW5jbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBkZXB0aD86IG51bWJlcik6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGZpbGUgY29udGVudHMsIG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LlxuICAgKi9cbiAgcmVhZEZpbGUodGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgLyoqIDEtYmFzZWQgY29sdW1uIG9mIHRoZSBkZWNsYXJhdGlvbidzIG5hbWUuICovXG4gIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyO1xuXG4gIC8qKiBUaGUgY3VycmVudCBleHBvc3VyZSBsZXZlbC4gKi9cbiAgcmVhZG9ubHkgY3VycmVudEV4cG9zdXJlOiBDdXJyZW50RXhwb3N1cmU7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgZGVjbGFyaW5nIHRoZSBzeW1ib2wuICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiBoYXMgbm8gcmVmZXJlbmNlcyBhdCBhbGwgKGJlc2lkZXMgaXRzZWxmKS4gKi9cbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBgdHJ1ZWAgd2hlbiB0aGUgZGVjbGFyYXRpb24gd291bGQgcXVhbGlmeSBmb3IgYSB0aWdodGVyIGV4cG9zdXJlIGlmIG5vdCBmb3IgcmVmZXJlbmNlcyBjb21pbmdcbiAgICogZXhjbHVzaXZlbHkgZnJvbSB0ZXN0IGZpbGVzIFx1MjAxNCBpLmUuIGl0IGlzIGV4cG9zZWQgcHVyZWx5IGZvciB0ZXN0YWJpbGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRm9yY2VkQnlUZXN0T25seTogYm9vbGVhbjtcblxuICAvKiogYHRydWVgIGZvciBhIGNsYXNzIG1lbWJlciwgYGZhbHNlYCBmb3IgYSB0b3AtbGV2ZWwgZXhwb3J0LiAqL1xuICByZWFkb25seSBpc01lbWJlcjogYm9vbGVhbjtcblxuICAvKiogMS1iYXNlZCBsaW5lIG9mIHRoZSBkZWNsYXJhdGlvbidzIG5hbWUuICovXG4gIHJlYWRvbmx5IGxpbmU6IG51bWJlcjtcblxuICAvKiogVGhlIGRlY2xhcmVkIG5hbWUuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKiogVGhlIGV4cG9zdXJlIHRoZSBkZWNsYXJhdGlvbiBjb3VsZCBiZSB0aWdodGVuZWQgdG8uICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZEV4cG9zdXJlOiBTdWdnZXN0ZWRFeHBvc3VyZTtcbn1cblxuLyoqXG4gKiBQcm9ncmVzcyByZXBvcnRlZCB3aGlsZSBhbmFseXppbmcgYSBwcm9qZWN0LCBvbmUgZXZlbnQgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVByb2dyZXNzIHtcbiAgLyoqIE51bWJlciBvZiBzb3VyY2UgZmlsZXMgZnVsbHkgYW5hbHl6ZWQgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSAoMC1iYXNlZCkuICovXG4gIHJlYWRvbmx5IGFuYWx5emVkRmlsZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlIGFib3V0IHRvIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSBjdXJyZW50RmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogVG90YWwgbnVtYmVyIG9mIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgYW5hbHl6ZWQuICovXG4gIHJlYWRvbmx5IHRvdGFsRmlsZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlICh0aWdodGVyKSBleHBvc3VyZSBsZXZlbCBhIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHJlZHVjZWQgdG8uXG4gKi9cbmV4cG9ydCB0eXBlIFN1Z2dlc3RlZEV4cG9zdXJlID0gJ2ZpbGUtbG9jYWwnIHwgJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCc7XG5cbi8qKlxuICogTGlmZWN5Y2xlIGFuZCBmcmFtZXdvcmsgbWVtYmVycyBpbnZva2VkIGJ5IE9ic2lkaWFuIG9yIGEgYmFzZSBjbGFzcyB2aWEgcmVnaXN0cmF0aW9uIHJhdGhlciB0aGFuXG4gKiBieSByZWZlcmVuY2VzIHRoZSBsYW5ndWFnZSBzZXJ2aWNlIGNhbiBzZWUuIFRpZ2h0ZW5pbmcgdGhlc2Ugd291bGQgYnJlYWsgdGhlIGZyYW1ld29yayBjb250cmFjdCxcbiAqIHNvIHRoZXkgYXJlIG5ldmVyIHJlcG9ydGVkLlxuICovXG5leHBvcnQgY29uc3QgTElGRUNZQ0xFX0FMTE9XTElTVDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICdkaXNwbGF5JyxcbiAgJ2hpZGUnLFxuICAnb25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlJyxcbiAgJ29uTGF5b3V0UmVhZHknLFxuICAnb25sb2FkJyxcbiAgJ29ubG9hZEltcGwnLFxuICAnb25Mb2FkU2V0dGluZ3MnLFxuICAnb25TYXZlU2V0dGluZ3MnLFxuICAnb251bmxvYWQnLFxuICAnb251bmxvYWRJbXBsJ1xuXSk7XG5cbmludGVyZmFjZSBBbmFseXNpc0NvbnRleHQge1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG59XG5cbmludGVyZmFjZSBGaW5kaW5nRmxhZ3Mge1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzRm9yY2VkQnlUZXN0T25seTogYm9vbGVhbjtcbn1cblxudHlwZSBNZW1iZXJFeHBvc3VyZSA9ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnIHwgJ3B1YmxpYyc7XG5cbmludGVyZmFjZSBSZWZlcmVuY2VMb2NhdGlvbiB7XG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG59XG5cbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLCBpbiBkaXNjb3Zlcnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplT3ZlckV4cG9zdXJlKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHsgbGFuZ3VhZ2VTZXJ2aWNlLCBvblByb2dyZXNzLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgcHJvZ3JhbSA9IGxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCk7XG4gIGlmICghcHJvZ3JhbSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZmluZGluZ3M6IFtdLFxuICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICBwcm9ncmFtXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKGZpbGVQYXRoLCBzcmNGb2xkZXIpICYmICFpc1Rlc3RGaWxlKGZpbGVQYXRoKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbYW5hbHl6ZWRGaWxlQ291bnQsIHNvdXJjZUZpbGVdIG9mIHNvdXJjZUZpbGVzVG9BbmFseXplLmVudHJpZXMoKSkge1xuICAgIG9uUHJvZ3Jlc3M/Lih7XG4gICAgICBhbmFseXplZEZpbGVDb3VudCxcbiAgICAgIGN1cnJlbnRGaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgICB0b3RhbEZpbGVDb3VudDogc291cmNlRmlsZXNUb0FuYWx5emUubGVuZ3RoXG4gICAgfSk7XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQuZmluZGluZ3M7XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGFuYWx5emVNZW1iZXIobm9kZSwgY29udGV4dCk7XG4gICAgYW5hbHl6ZUV4cG9ydChub2RlLCBjb250ZXh0KTtcbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB7QGxpbmsgTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0gYmFja2VkIGJ5IGFuIGV4cGxpY2l0IGZpbGUgbGlzdCBhbmQgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgbGFuZ3VhZ2Utc2VydmljZSBob3N0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdChwYXJhbXM6IENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMpOiBMYW5ndWFnZVNlcnZpY2VIb3N0IHtcbiAgY29uc3QgeyBjb21waWxlck9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbSB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIGRpcmVjdG9yeUV4aXN0czogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5kaXJlY3RvcnlFeGlzdHMoZGlyZWN0b3J5KSxcbiAgICBmaWxlRXhpc3RzOiAoZmlsZSkgPT4gZmlsZVN5c3RlbS5maWxlRXhpc3RzKGZpbGUpLFxuICAgIGdldENvbXBpbGF0aW9uU2V0dGluZ3M6ICgpID0+IGNvbXBpbGVyT3B0aW9ucyxcbiAgICBnZXRDdXJyZW50RGlyZWN0b3J5OiAoKSA9PiBmaWxlU3lzdGVtLmdldEN1cnJlbnREaXJlY3RvcnkoKSxcbiAgICBnZXREZWZhdWx0TGliRmlsZU5hbWU6IChsaWJPcHRpb25zKSA9PiBnZXREZWZhdWx0TGliRmlsZVBhdGgobGliT3B0aW9ucyksXG4gICAgZ2V0RGlyZWN0b3JpZXM6IChkaXJlY3RvcnkpID0+IGZpbGVTeXN0ZW0uZ2V0RGlyZWN0b3JpZXMoZGlyZWN0b3J5KSxcbiAgICBnZXRTY3JpcHRGaWxlTmFtZXM6ICgpID0+IFsuLi5maWxlTmFtZXNdLFxuICAgIGdldFNjcmlwdFNuYXBzaG90OiAoZmlsZU5hbWUpOiBJU2NyaXB0U25hcHNob3QgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IGZpbGVTeXN0ZW0ucmVhZEZpbGUoZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRleHQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFNjcmlwdFNuYXBzaG90LmZyb21TdHJpbmcodGV4dCk7XG4gICAgfSxcbiAgICBnZXRTY3JpcHRWZXJzaW9uOiAoKSA9PiAnMCcsXG4gICAgcmVhZERpcmVjdG9yeTogKHBhdGgsIGV4dGVuc2lvbnMsIGV4Y2x1ZGUsIGluY2x1ZGUsIGRlcHRoKSA9PiBmaWxlU3lzdGVtLnJlYWREaXJlY3RvcnkocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpLFxuICAgIHJlYWRGaWxlOiAoZmlsZSkgPT4gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlKVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGxhbmd1YWdlIHNlcnZpY2Ugb3ZlciBldmVyeSBmaWxlIGluIGEgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEgbGFuZ3VhZ2Ugc2VydmljZSByZWFkeSBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZShwYXJhbXM6IENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMpOiBMYW5ndWFnZVNlcnZpY2Uge1xuICBjb25zdCB7IGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhwYXJhbXMudHNDb25maWdQYXRoKTtcbiAgcmV0dXJuIGNyZWF0ZUxhbmd1YWdlU2VydmljZShjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHsgY29tcGlsZXJPcHRpb25zOiBvcHRpb25zLCBmaWxlTmFtZXMsIGZpbGVTeXN0ZW06IHN5cyB9KSwgY3JlYXRlRG9jdW1lbnRSZWdpc3RyeSgpKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGluIGEgcHJvamVjdCBvbiBkaXNrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICAuLi5wYXJhbXMub25Qcm9ncmVzcyA/IHsgb25Qcm9ncmVzczogcGFyYW1zLm9uUHJvZ3Jlc3MgfSA6IHt9XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgb3Zlci1leHBvc3VyZSBmaW5kaW5ncyBhcyBhIGh1bWFuLXJlYWRhYmxlIHJlcG9ydC4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkXG4gKiBieSBsaW5lLiBFYWNoIGZpbmRpbmcgc3BhbnMgdHdvIGxpbmVzIFx1MjAxNCBhIGBwYXRoOmxpbmU6Y29sdW1uYCBsb2NhdGlvbiAod2hpY2ggdGVybWluYWxzIHN1Y2ggYXMgVlNcbiAqIENvZGUgcmVuZGVyIGFzIGEgY2xpY2thYmxlIGxpbmsgdGhhdCBqdW1wcyB0byB0aGUgZGVjbGFyYXRpb24pIGZvbGxvd2VkIGJ5IHRoZSBzdWdnZXN0ZWQgY2hhbmdlIGFuZFxuICogaXRzIHJlYXNvbiBcdTIwMTQgc2VwYXJhdGVkIGZyb20gdGhlIG5leHQgZmluZGluZyBieSBhIGJsYW5rIGxpbmUuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnN9LlxuICogQHJldHVybnMgVGhlIHJlcG9ydCB0ZXh0LiBFbXB0eS1maW5kaW5nIGlucHV0IHlpZWxkcyBhIHNpbmdsZSBcIm5vIGZpbmRpbmdzXCIgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIG9wdGlvbnM/OiBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdObyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGZvdW5kLlxcbic7XG4gIH1cblxuICBjb25zdCBiYXNlRm9sZGVyID0gb3B0aW9ucz8uYmFzZUZvbGRlciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdG9DYW5vbmljYWwob3B0aW9ucy5iYXNlRm9sZGVyKTtcblxuICBjb25zdCBieUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlRmluZGluZ1tdPigpO1xuICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICBjb25zdCBsaXN0ID0gYnlGaWxlLmdldChmaW5kaW5nLmZpbGVQYXRoKSA/PyBbXTtcbiAgICBsaXN0LnB1c2goZmluZGluZyk7XG4gICAgYnlGaWxlLnNldChmaW5kaW5nLmZpbGVQYXRoLCBsaXN0KTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgbGlzdF0gb2YgYnlGaWxlKSB7XG4gICAgY29uc3QgZGlzcGxheVBhdGggPSB0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoLCBiYXNlRm9sZGVyKTtcbiAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgWy4uLmxpc3RdLnNvcnQoKGEsIGIpID0+IGEubGluZSAtIGIubGluZSkpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gYCR7ZGlzcGxheVBhdGh9OiR7U3RyaW5nKGZpbmRpbmcubGluZSl9OiR7U3RyaW5nKGZpbmRpbmcuY29sdW1uKX1gO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2gobG9jYXRpb24sIGAke2NoYW5nZX0gLS0gJHtkZXNjcmliZVJlYXNvbihmaW5kaW5nKX1gLCAnJyk7XG4gICAgfVxuICB9XG4gIGxpbmVzLnB1c2goYCR7U3RyaW5nKGZpbmRpbmdzLmxlbmd0aCl9IGZpbmRpbmcocykuYCk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuXG5mdW5jdGlvbiBhbmFseXplRXhwb3J0KG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGlmIChub2RlLnBhcmVudCAhPT0gc291cmNlRmlsZSB8fCAhZ2V0TW9kaWZpZXJLaW5kcyhub2RlKS5oYXMoU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xGaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICBmb3IgKGNvbnN0IG5hbWVOb2RlIG9mIGdldEV4cG9ydGVkTmFtZU5vZGVzKG5vZGUpKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSk7XG4gICAgY29uc3Qgb3RoZXJGaWxlUmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+IHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgIT09IGRlY2xGaWxlUGF0aCk7XG5cbiAgICBpZiAob3RoZXJGaWxlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRleHQuZmluZGluZ3MucHVzaChidWlsZEZpbmRpbmcobm9kZSwgbmFtZU5vZGUsICdleHBvcnQnLCAnZmlsZS1sb2NhbCcsIHsgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCwgaXNGb3JjZWRCeVRlc3RPbmx5OiBmYWxzZSB9KSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IG90aGVyRmlsZVJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcbiAgICBpZiAobm9uVGVzdFJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZXh0LmZpbmRpbmdzLnB1c2goYnVpbGRGaW5kaW5nKG5vZGUsIG5hbWVOb2RlLCAnZXhwb3J0JywgJ2ZpbGUtbG9jYWwnLCB7IGhhc05vUmVmZXJlbmNlczogZmFsc2UsIGlzRm9yY2VkQnlUZXN0T25seTogdHJ1ZSB9KSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVNZW1iZXIobm9kZTogTm9kZSwgY29udGV4dDogQW5hbHlzaXNDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IG5hbWVOb2RlID0gZ2V0TWVtYmVyTmFtZU5vZGUobm9kZSk7XG4gIGlmICghbmFtZU5vZGUgfHwgIWlzQ2xhc3NMaWtlKG5vZGUucGFyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBkZWNsYXJpbmdDbGFzcyA9IG5vZGUucGFyZW50O1xuXG4gIGNvbnN0IG1vZGlmaWVyS2luZHMgPSBnZXRNb2RpZmllcktpbmRzKG5vZGUpO1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSB8fCBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLk92ZXJyaWRlS2V5d29yZCkgfHwgTElGRUNZQ0xFX0FMTE9XTElTVC5oYXMobmFtZU5vZGUuZ2V0VGV4dCgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRFeHBvc3VyZSA9IGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzKTtcbiAgaWYgKGN1cnJlbnRFeHBvc3VyZSA9PT0gJ3ByaXZhdGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSk7XG4gIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuXG4gIGNvbnN0IG5lZWRlZEZvclNyYyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZShub25UZXN0UmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuICBjb25zdCBuZWVkZWRXaXRoVGVzdHMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUocmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuXG4gIGlmIChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpID49IHJhbmtFeHBvc3VyZShjdXJyZW50RXhwb3N1cmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGJ1aWxkRmluZGluZyhub2RlLCBuYW1lTm9kZSwgY3VycmVudEV4cG9zdXJlLCBuZWVkZWRGb3JTcmMsIHtcbiAgICBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRmluZGluZyhcbiAgbm9kZTogTm9kZSxcbiAgbmFtZU5vZGU6IE5vZGUsXG4gIGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlLFxuICBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmUsXG4gIGZsYWdzOiBGaW5kaW5nRmxhZ3Ncbik6IE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IHsgY2hhcmFjdGVyLCBsaW5lIH0gPSBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKG5hbWVOb2RlLmdldFN0YXJ0KCkpO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbjogY2hhcmFjdGVyICsgMSxcbiAgICBjdXJyZW50RXhwb3N1cmUsXG4gICAgZmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGhhc05vUmVmZXJlbmNlczogZmxhZ3MuaGFzTm9SZWZlcmVuY2VzLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogZmxhZ3MuaXNGb3JjZWRCeVRlc3RPbmx5LFxuICAgIGlzTWVtYmVyOiBjdXJyZW50RXhwb3N1cmUgIT09ICdleHBvcnQnLFxuICAgIGxpbmU6IGxpbmUgKyAxLFxuICAgIG5hbWU6IG5hbWVOb2RlLmdldFRleHQoKSxcbiAgICBzdWdnZXN0ZWRFeHBvc3VyZVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0UmVmZXJlbmNlcyhyZWZlcmVuY2VkU3ltYm9sczogUmVmZXJlbmNlZFN5bWJvbFtdIHwgdW5kZWZpbmVkKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkU3ltYm9sIG9mIHJlZmVyZW5jZWRTeW1ib2xzID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlZFN5bWJvbC5yZWZlcmVuY2VzKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBzdGFydDogcmVmZXJlbmNlLnRleHRTcGFuLnN0YXJ0IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKFxuICByZWZlcmVuY2VzOiByZWFkb25seSBSZWZlcmVuY2VMb2NhdGlvbltdLFxuICBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dFxuKTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbihjb250ZXh0LnByb2dyYW0sIHJlZmVyZW5jZS5maWxlTmFtZSwgcmVmZXJlbmNlLnN0YXJ0KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20ocmVmZXJlbmNlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICBuZWVkZWQgPSAncHJvdGVjdGVkJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuIG5lZWRlZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBgcmVmZXJlbmNlZCBvbmx5ICR7U0NPUEVfREVTQ1JJUFRJT05bZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZV19YDtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5KSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChleHBvc2VkIG9ubHkgZm9yIHRlc3RzKWA7XG4gIH1cbiAgaWYgKGZpbmRpbmcuaGFzTm9SZWZlcmVuY2VzKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChubyByZWZlcmVuY2VzIGF0IGFsbClgO1xuICB9XG4gIHJldHVybiBiYXNlO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocHJvZ3JhbTogUHJvZ3JhbSwgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kczogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4pOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJpdmF0ZSc7XG4gIH1cbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3Byb3RlY3RlZCc7XG4gIH1cbiAgcmV0dXJuICdwdWJsaWMnO1xufVxuXG5mdW5jdGlvbiBnZXRFbmNsb3NpbmdDbGFzcyhub2RlOiBOb2RlKTogQ2xhc3NMaWtlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogTm9kZSA9IG5vZGU7XG4gIHdoaWxlICghaXNTb3VyY2VGaWxlKGN1cnJlbnQpKSB7XG4gICAgaWYgKGlzQ2xhc3NMaWtlKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydGVkTmFtZU5vZGVzKG5vZGU6IE5vZGUpOiBOb2RlW10ge1xuICBpZiAoaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSB8fCBpc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpIHx8IGlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSkgfHwgaXNFbnVtRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZS5uYW1lID8gW25vZGUubmFtZV0gOiBbXTtcbiAgfVxuICBpZiAoaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKSkge1xuICAgIHJldHVybiBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSkuZmlsdGVyKGlzSWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBnZXRNZW1iZXJOYW1lTm9kZShub2RlOiBOb2RlKTogTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKSB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkgfHwgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGUubmFtZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRNb2RpZmllcktpbmRzKG5vZGU6IE5vZGUpOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiB7XG4gIGNvbnN0IGtpbmRzID0gbmV3IFNldDxTeW50YXhLaW5kPigpO1xuICBpZiAoY2FuSGF2ZU1vZGlmaWVycyhub2RlKSkge1xuICAgIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgZ2V0TW9kaWZpZXJzKG5vZGUpID8/IFtdKSB7XG4gICAgICBraW5kcy5hZGQobW9kaWZpZXIua2luZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBraW5kcztcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2U6IFJlZmVyZW5jZUxvY2F0aW9uLCBuYW1lTm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSA9PT0gdG9DYW5vbmljYWwobmFtZU5vZGUuZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lKSAmJiByZWZlcmVuY2Uuc3RhcnQgPT09IG5hbWVOb2RlLmdldFN0YXJ0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGVyaXZlZEZyb20oZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlU3ltYm9sID0gYmFzZS5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGJhc2UubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGlmICghYmFzZVN5bWJvbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2xhdXNlIG9mIGRlcml2ZWQuaGVyaXRhZ2VDbGF1c2VzID8/IFtdKSB7XG4gICAgaWYgKGNsYXVzZS50b2tlbiAhPT0gU3ludGF4S2luZC5FeHRlbmRzS2V5d29yZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZUV4cHJlc3Npb24gb2YgY2xhdXNlLnR5cGVzKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sPy5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGlzQ2xhc3NMaWtlKGRlY2xhcmF0aW9uKSAmJiBpc0Rlcml2ZWRGcm9tKGRlY2xhcmF0aW9uLCBiYXNlLCBjaGVja2VyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNPd25Tb3VyY2VGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIHNyY0ZvbGRlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3NyY0ZvbGRlcn0vYCkgJiYgZmlsZVBhdGguZW5kc1dpdGgoJy50cycpICYmICFmaWxlUGF0aC5lbmRzV2l0aCgnLmQudHMnKTtcbn1cblxuZnVuY3Rpb24gaXNUZXN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlUGF0aC5pbmNsdWRlcygnLnRlc3QuJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy5pbnRlZ3JhdGlvbi4nKTtcbn1cblxuZnVuY3Rpb24gcmFua0V4cG9zdXJlKGV4cG9zdXJlOiBNZW1iZXJFeHBvc3VyZSk6IG51bWJlciB7XG4gIHJldHVybiBNRU1CRVJfRVhQT1NVUkVfT1JERVIuaW5kZXhPZihleHBvc3VyZSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzcGxheVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKGJhc2VGb2xkZXIgIT09IHVuZGVmaW5lZCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKGAke2Jhc2VGb2xkZXJ9L2ApKSB7XG4gICAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKGJhc2VGb2xkZXIubGVuZ3RoICsgMSk7XG4g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
@@ -22,11 +22,19 @@ if you want to view the source, please visit the github repository of this plugi
22
22
  })();
23
23
 
24
24
  const obsidianDevUtilsConfig = {
25
+ /*
26
+ * Lint everything except the `static/` consumer templates: ESLint globally ignores them, and they
27
+ * ship their own consumer-facing `eslint.config` that cannot resolve in-repo, so linting one by
28
+ * explicit path crashes config loading. The `!(static)` negation drops any path that begins with
29
+ * `static`. Formatting and spellchecking still cover `static/` via the entries above and below.
30
+ */
31
+ "!(static)*.{ts,tsx,mts}": [
32
+ "npm run lint:fix --"
33
+ ],
25
34
  "*": [
26
35
  "npm run spellcheck --"
27
36
  ],
28
37
  "*.{ts,tsx,mts}": [
29
- "npm run lint:fix --",
30
38
  "npm run format --"
31
39
  ],
32
40
  "*.md": [
@@ -36,4 +44,4 @@ const obsidianDevUtilsConfig = {
36
44
  export {
37
45
  obsidianDevUtilsConfig
38
46
  };
39
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9uYW5vLXN0YWdlZC1jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiBmb3IgcHJlLWNvbW1pdCBob29rcy5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVjbGFyYXRpdmUgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbjsgY29ycmVjdG5lc3MgaXMgdmVyaWZpZWQgYnkgcnVubmluZyBuYW5vLXN0YWdlZCwgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogTmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0aGF0IHJ1bnMgZmlsZS1iYXNlZCBsaW50LCBmb3JtYXQsIGFuZCBzcGVsbGNoZWNrIG9uIHN0YWdlZCBmaWxlcy5cbiAqXG4gKiBPbmx5IGluY2x1ZGVzIHRvb2xzIHRoYXQgY2FuIG9wZXJhdGUgb24gaW5kaXZpZHVhbCBmaWxlcy4gV2hvbGUtcHJvamVjdCBjaGVja3NcbiAqIChUeXBlU2NyaXB0IGNvbXBpbGF0aW9uLCB1bml0IHRlc3RzKSBhcmUgbGVmdCB0byBDSS5cbiAqXG4gKiBDb21tYW5kcyB1c2UgYG5wbSBydW4gLi4uIC0tYCBzbyBuYW5vLXN0YWdlZCBmaWxlIHBhdGhzIGFyZSBmb3J3YXJkZWQgYXMgQ0xJIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGNvbnN0IG9ic2lkaWFuRGV2VXRpbHNDb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgJyonOiBbXG4gICAgJ25wbSBydW4gc3BlbGxjaGVjayAtLSdcbiAgXSxcbiAgJyoue3RzLHRzeCxtdHN9JzogW1xuICAgICducG0gcnVuIGxpbnQ6Zml4IC0tJyxcbiAgICAnbnBtIHJ1biBmb3JtYXQgLS0nXG4gIF0sXG4gICcqLm1kJzogW1xuICAgICducG0gcnVuIGxpbnQ6bWQ6Zml4IC0tJ1xuICBdXG59O1xuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQk8sTUFBTSx5QkFBbUQ7QUFBQSxFQUM5RCxLQUFLO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFBQSxFQUNBLGtCQUFrQjtBQUFBLElBQ2hCO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFFBQVE7QUFBQSxJQUNOO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
47
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9uYW5vLXN0YWdlZC1jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiBmb3IgcHJlLWNvbW1pdCBob29rcy5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVjbGFyYXRpdmUgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbjsgY29ycmVjdG5lc3MgaXMgdmVyaWZpZWQgYnkgcnVubmluZyBuYW5vLXN0YWdlZCwgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogTmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0aGF0IHJ1bnMgZmlsZS1iYXNlZCBsaW50LCBmb3JtYXQsIGFuZCBzcGVsbGNoZWNrIG9uIHN0YWdlZCBmaWxlcy5cbiAqXG4gKiBPbmx5IGluY2x1ZGVzIHRvb2xzIHRoYXQgY2FuIG9wZXJhdGUgb24gaW5kaXZpZHVhbCBmaWxlcy4gV2hvbGUtcHJvamVjdCBjaGVja3NcbiAqIChUeXBlU2NyaXB0IGNvbXBpbGF0aW9uLCB1bml0IHRlc3RzKSBhcmUgbGVmdCB0byBDSS5cbiAqXG4gKiBDb21tYW5kcyB1c2UgYG5wbSBydW4gLi4uIC0tYCBzbyBuYW5vLXN0YWdlZCBmaWxlIHBhdGhzIGFyZSBmb3J3YXJkZWQgYXMgQ0xJIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGNvbnN0IG9ic2lkaWFuRGV2VXRpbHNDb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgLypcbiAgICogTGludCBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgYHN0YXRpYy9gIGNvbnN1bWVyIHRlbXBsYXRlczogRVNMaW50IGdsb2JhbGx5IGlnbm9yZXMgdGhlbSwgYW5kIHRoZXlcbiAgICogc2hpcCB0aGVpciBvd24gY29uc3VtZXItZmFjaW5nIGBlc2xpbnQuY29uZmlnYCB0aGF0IGNhbm5vdCByZXNvbHZlIGluLXJlcG8sIHNvIGxpbnRpbmcgb25lIGJ5XG4gICAqIGV4cGxpY2l0IHBhdGggY3Jhc2hlcyBjb25maWcgbG9hZGluZy4gVGhlIGAhKHN0YXRpYylgIG5lZ2F0aW9uIGRyb3BzIGFueSBwYXRoIHRoYXQgYmVnaW5zIHdpdGhcbiAgICogYHN0YXRpY2AuIEZvcm1hdHRpbmcgYW5kIHNwZWxsY2hlY2tpbmcgc3RpbGwgY292ZXIgYHN0YXRpYy9gIHZpYSB0aGUgZW50cmllcyBhYm92ZSBhbmQgYmVsb3cuXG4gICAqL1xuICAnIShzdGF0aWMpKi57dHMsdHN4LG10c30nOiBbXG4gICAgJ25wbSBydW4gbGludDpmaXggLS0nXG4gIF0sXG4gICcqJzogW1xuICAgICducG0gcnVuIHNwZWxsY2hlY2sgLS0nXG4gIF0sXG4gICcqLnt0cyx0c3gsbXRzfSc6IFtcbiAgICAnbnBtIHJ1biBmb3JtYXQgLS0nXG4gIF0sXG4gICcqLm1kJzogW1xuICAgICducG0gcnVuIGxpbnQ6bWQ6Zml4IC0tJ1xuICBdXG59O1xuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQk8sTUFBTSx5QkFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU85RCwyQkFBMkI7QUFBQSxJQUN6QjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLEtBQUs7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUFBLEVBQ0Esa0JBQWtCO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBQUEsRUFDQSxRQUFRO0FBQUEsSUFDTjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,12 @@
1
+ import process from 'node:process';
2
+
3
+ import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils';
4
+ import {
5
+ findOverExposure,
6
+ formatOverExposureFindings
7
+ } from 'obsidian-dev-utils/script-utils/linters/over-exposure';
8
+
9
+ await wrapCliTask(() => {
10
+ const findings = findOverExposure({ projectFolder: process.cwd() });
11
+ process.stdout.write(formatOverExposureFindings(findings, { baseFolder: process.cwd() }));
12
+ });
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../../dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs",
3
+ "module": "../../../dist/lib/esm/obsidian/components/case-insensitive-file-index-component.mjs",
4
+ "type": "module",
5
+ "types": "../../../dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.d.cts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../../dist/lib/cjs/obsidian/components/embed-extensions-component.cjs",
3
+ "module": "../../../dist/lib/esm/obsidian/components/embed-extensions-component.mjs",
4
+ "type": "module",
5
+ "types": "../../../dist/lib/cjs/obsidian/components/embed-extensions-component.d.cts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/obsidian/case-insensitive-file-index.cjs",
3
+ "module": "../../dist/lib/esm/obsidian/case-insensitive-file-index.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/obsidian/case-insensitive-file-index.d.cts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/obsidian/view-registrar.cjs",
3
+ "module": "../../dist/lib/esm/obsidian/view-registrar.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/obsidian/view-registrar.d.cts"
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "76.1.0",
3
+ "version": "77.1.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"
@@ -656,7 +656,7 @@
656
656
  "@eslint/config-helpers": "^0.6.0",
657
657
  "@eslint/js": "^10.0.1",
658
658
  "@lezer/common": "1.2.3",
659
- "@obsidian-typings/obsidian-public-latest": "^6.15.0",
659
+ "@obsidian-typings/obsidian-public-latest": "^6.18.0",
660
660
  "@stylistic/eslint-plugin": "^5.10.0",
661
661
  "@tsconfig/strictest": "^2.0.8",
662
662
  "@types/babel__core": "^7.20.5",
@@ -671,8 +671,8 @@
671
671
  "@types/react": "^19.2.17",
672
672
  "@types/semver": "^7.7.1",
673
673
  "@types/shell-quote": "^1.7.5",
674
- "@typescript-eslint/eslint-plugin": "^8.61.1",
675
- "@typescript-eslint/parser": "^8.61.1",
674
+ "@typescript-eslint/eslint-plugin": "^8.62.0",
675
+ "@typescript-eslint/parser": "^8.62.0",
676
676
  "commander": "^15.0.0",
677
677
  "compare-versions": "^6.1.1",
678
678
  "cspell": "^10.0.1",
@@ -684,13 +684,13 @@
684
684
  "esbuild-svelte": "^0.9.5",
685
685
  "eslint": "^10.5.0",
686
686
  "eslint-import-resolver-typescript": "^4.4.5",
687
- "eslint-plugin-import-x": "^4.16.2",
688
- "eslint-plugin-jsdoc": "^63.0.6",
687
+ "eslint-plugin-import-x": "^4.17.0",
688
+ "eslint-plugin-jsdoc": "^63.0.7",
689
689
  "eslint-plugin-no-unsanitized": "^4.1.5",
690
690
  "eslint-plugin-obsidianmd": "^0.3.0",
691
691
  "eslint-plugin-perfectionist": "^5.9.1",
692
692
  "eslint-plugin-tsdoc": "^0.5.2",
693
- "globals": "^17.6.0",
693
+ "globals": "^17.7.0",
694
694
  "i18next": "^26.3.1",
695
695
  "jiti": "^2.7.0",
696
696
  "linkinator": "^7.6.1",
@@ -712,20 +712,20 @@
712
712
  "sass": "^1.101.0",
713
713
  "semver": "^7.8.5",
714
714
  "shell-quote": "^1.8.4",
715
- "svelte-check": "^4.6.0",
715
+ "svelte-check": "^4.7.0",
716
716
  "svelte-preprocess": "^6.0.5",
717
717
  "type-fest": "^5.7.0",
718
718
  "typescript": "^6.0.3",
719
- "typescript-eslint": "^8.61.1",
719
+ "typescript-eslint": "^8.62.0",
720
720
  "unist-util-visit": "^5.1.0"
721
721
  },
722
722
  "devDependencies": {
723
- "@commitlint/cli": "^21.0.2",
724
- "@commitlint/config-conventional": "^21.0.2",
725
- "@commitlint/types": "^21.0.1",
723
+ "@commitlint/cli": "^21.1.0",
724
+ "@commitlint/config-conventional": "^21.1.0",
725
+ "@commitlint/types": "^21.1.0",
726
726
  "@jest/globals": "^30.4.1",
727
727
  "@total-typescript/ts-reset": "^0.6.1",
728
- "@typescript-eslint/rule-tester": "^8.61.1",
728
+ "@typescript-eslint/rule-tester": "^8.62.0",
729
729
  "@vitest/coverage-v8": "^4.1.9",
730
730
  "@vitest/runner": "^4.1.9",
731
731
  "better-typescript-lib": "^2.12.0",
@@ -736,8 +736,8 @@
736
736
  "jsdom": "^29.1.1",
737
737
  "moment": "^2.30.1",
738
738
  "nano-staged": "^1.0.2",
739
- "obsidian-integration-testing": "^4.2.6",
740
- "obsidian-test-mocks": "^3.1.1",
739
+ "obsidian-integration-testing": "^4.4.0",
740
+ "obsidian-test-mocks": "^3.3.0",
741
741
  "ts-declaration-location": "^1.0.7",
742
742
  "vitest": "^4.1.9",
743
743
  "yaml": "^2.9.0"
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../../dist/lib/cjs/script-utils/linters/over-exposure.cjs",
3
+ "module": "../../../dist/lib/esm/script-utils/linters/over-exposure.mjs",
4
+ "type": "module",
5
+ "types": "../../../dist/lib/cjs/script-utils/linters/over-exposure.d.cts"
6
+ }