@mnaoumov/obsidian-lib 10.10.0 → 10.12.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 (133) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/workspace-layout-state-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +90 -1
  6. package/dist/lib/cjs/__merged.d.cts +13 -4
  7. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  8. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  9. package/dist/lib/cjs/bug-report.cjs +36 -10
  10. package/dist/lib/cjs/bug-report.d.cts +65 -0
  11. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +93 -2
  12. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  13. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  14. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  15. package/dist/lib/cjs/components/embed-extensions-component.cjs +20 -3
  16. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  17. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +16 -2
  18. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  19. package/dist/lib/cjs/components/index.cjs +12 -3
  20. package/dist/lib/cjs/components/index.d.cts +3 -0
  21. package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -9
  22. package/dist/lib/cjs/components/plugin-settings-component.cjs +7 -2
  23. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  24. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  25. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  26. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  27. package/dist/lib/cjs/css-class.cjs +5 -1
  28. package/dist/lib/cjs/css-class.d.cts +16 -0
  29. package/dist/lib/cjs/data-handler.cjs +156 -5
  30. package/dist/lib/cjs/data-handler.d.cts +128 -2
  31. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  32. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  33. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  34. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  35. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  36. package/dist/lib/cjs/i18n/locales/en.cjs +29 -1
  37. package/dist/lib/cjs/i18n/locales/en.d.cts +28 -0
  38. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +28 -0
  39. package/dist/lib/cjs/index.cjs +10 -1
  40. package/dist/lib/cjs/index.d.cts +3 -0
  41. package/dist/lib/cjs/link.cjs +40 -1
  42. package/dist/lib/cjs/link.d.cts +37 -1
  43. package/dist/lib/cjs/markdown-view.cjs +191 -3
  44. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  45. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  46. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  47. package/dist/lib/cjs/modals/index.cjs +7 -1
  48. package/dist/lib/cjs/modals/index.d.cts +2 -0
  49. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  50. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  51. package/dist/lib/cjs/plugin/index.cjs +4 -1
  52. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  53. package/dist/lib/cjs/plugin/plugin-api.cjs +13 -4
  54. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  55. package/dist/lib/cjs/plugin/plugin-install-state.cjs +46 -1
  56. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  57. package/dist/lib/cjs/plugin/plugin-instance.cjs +448 -0
  58. package/dist/lib/cjs/plugin/plugin-instance.d.cts +251 -0
  59. package/dist/lib/cjs/plugin/plugin.cjs +16 -1
  60. package/dist/lib/cjs/plugin/plugin.d.cts +7 -0
  61. package/dist/lib/cjs/reference-definition.cjs +234 -0
  62. package/dist/lib/cjs/reference-definition.d.cts +47 -0
  63. package/dist/lib/cjs/release-asset.cjs +279 -0
  64. package/dist/lib/cjs/release-asset.d.cts +190 -0
  65. package/dist/lib/cjs/workspace.cjs +3 -2
  66. package/dist/lib/cjs/workspace.d.cts +6 -0
  67. package/dist/lib/esm/__merged.d.mts +13 -4
  68. package/dist/lib/esm/__merged.mjs +97 -3
  69. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  70. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  71. package/dist/lib/esm/bug-report.d.mts +65 -0
  72. package/dist/lib/esm/bug-report.mjs +33 -10
  73. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  74. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  75. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  76. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  77. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  78. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  79. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  80. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  81. package/dist/lib/esm/components/index.d.mts +3 -0
  82. package/dist/lib/esm/components/index.mjs +8 -2
  83. package/dist/lib/esm/components/plugin-gate-component.mjs +5 -13
  84. package/dist/lib/esm/components/plugin-settings-component.mjs +7 -2
  85. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  86. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  87. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  88. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  89. package/dist/lib/esm/css-class.d.mts +16 -0
  90. package/dist/lib/esm/css-class.mjs +5 -1
  91. package/dist/lib/esm/data-handler.d.mts +128 -2
  92. package/dist/lib/esm/data-handler.mjs +152 -4
  93. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  94. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  95. package/dist/lib/esm/generated-during-build.mjs +2 -2
  96. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  97. package/dist/lib/esm/git-rename-history.mjs +1 -1
  98. package/dist/lib/esm/i18n/locales/en.d.mts +28 -0
  99. package/dist/lib/esm/i18n/locales/en.mjs +29 -1
  100. package/dist/lib/esm/i18n/locales/translations-map.d.mts +28 -0
  101. package/dist/lib/esm/index.d.mts +3 -0
  102. package/dist/lib/esm/index.mjs +7 -1
  103. package/dist/lib/esm/link.d.mts +37 -1
  104. package/dist/lib/esm/link.mjs +40 -1
  105. package/dist/lib/esm/markdown-view.d.mts +48 -1
  106. package/dist/lib/esm/markdown-view.mjs +192 -2
  107. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  108. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  109. package/dist/lib/esm/modals/index.d.mts +2 -0
  110. package/dist/lib/esm/modals/index.mjs +5 -1
  111. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  112. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  113. package/dist/lib/esm/plugin/index.d.mts +1 -0
  114. package/dist/lib/esm/plugin/index.mjs +3 -1
  115. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  116. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  117. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  118. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  119. package/dist/lib/esm/plugin/plugin-instance.d.mts +251 -0
  120. package/dist/lib/esm/plugin/plugin-instance.mjs +366 -0
  121. package/dist/lib/esm/plugin/plugin.d.mts +7 -0
  122. package/dist/lib/esm/plugin/plugin.mjs +16 -1
  123. package/dist/lib/esm/reference-definition.d.mts +47 -0
  124. package/dist/lib/esm/reference-definition.mjs +146 -0
  125. package/dist/lib/esm/release-asset.d.mts +190 -0
  126. package/dist/lib/esm/release-asset.mjs +187 -0
  127. package/dist/lib/esm/workspace.d.mts +6 -0
  128. package/dist/lib/esm/workspace.mjs +3 -2
  129. package/dist/styles.css +16 -1
  130. package/modals/copy-text-manually/package.json +6 -0
  131. package/modals/review-bug-report-diagnostics/package.json +6 -0
  132. package/package.json +2 -1
  133. package/plugin/plugin-instance/package.json +6 -0
@@ -0,0 +1,190 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Downloads an optional data asset of a plugin release on demand: it asks the user first, verifies an expected SHA-256
7
+ * before anything is written or exposed, keeps the verified file in a local cache folder and hands back the adapter
8
+ * resource URL.
9
+ *
10
+ * It uses only cross-platform APIs ({@link requestUrlEx}, the vault adapter and `crypto.subtle`), so it works on desktop
11
+ * and mobile alike.
12
+ *
13
+ * Behavior that is part of the contract:
14
+ *
15
+ * - A cached file is hashed on every call. When its hash matches, it is reused without asking or downloading. When it
16
+ * does not, it is removed and treated as missing, so a corrupt or truncated cache recovers by itself.
17
+ * - The user is asked only when a download is needed. Declining resolves with `null` and writes nothing.
18
+ * - Downloaded bytes are verified before they are written. A mismatch throws {@link ReleaseAssetChecksumError} and
19
+ * writes nothing.
20
+ * - The file is written to a temporary sibling and then renamed into place, so an interrupted write never leaves a
21
+ * partial file under the cached name.
22
+ * - An abort (pass the plugin's abort signal, so a plugin unload counts) rejects with the signal's reason. Once the
23
+ * download has finished, the signal is checked again before writing, so nothing is written after an unload.
24
+ * - Concurrent calls for the same cache path share one operation, so the user is asked once.
25
+ */
26
+ import type { App } from 'obsidian';
27
+ /**
28
+ * Parameters for {@link ensureReleaseAsset}.
29
+ */
30
+ export interface EnsureReleaseAssetParams {
31
+ /**
32
+ * Aborts the operation. Pass the plugin's abort signal, so an unload stops it.
33
+ */
34
+ readonly abortSignal?: AbortSignal | undefined;
35
+ /**
36
+ * The Obsidian application instance.
37
+ */
38
+ readonly app: App;
39
+ /**
40
+ * The vault-relative folder that holds the cached file, typically `${plugin.manifest.dir}/assets`.
41
+ *
42
+ * A folder inside the config folder is not synced, so each device downloads the asset once.
43
+ */
44
+ readonly cacheFolderPath: string;
45
+ /**
46
+ * The name of the cached file. It must not contain a path separator.
47
+ */
48
+ readonly fileName: string;
49
+ /**
50
+ * The expected SHA-256 of the asset, as 64 hexadecimal digits.
51
+ */
52
+ readonly sha256: string;
53
+ /**
54
+ * Asks the user whether to download the asset. Defaults to a confirmation modal.
55
+ *
56
+ * Pass `() => Promise.resolve(true)` when the user has already agreed, for example through a setting.
57
+ */
58
+ readonly shouldDownload?: ((request: ReleaseAssetConsentRequest) => Promise<boolean>) | undefined;
59
+ /**
60
+ * The size of the asset in bytes, shown to the user when asking.
61
+ */
62
+ readonly sizeInBytes?: number | undefined;
63
+ /**
64
+ * The download timeout in milliseconds.
65
+ */
66
+ readonly timeoutInMilliseconds?: number | undefined;
67
+ /**
68
+ * The URL to download the asset from. Only `http:` and `https:` URLs are accepted.
69
+ */
70
+ readonly url: string;
71
+ }
72
+ /**
73
+ * Parameters for {@link getGitHubReleaseAssetUrl}.
74
+ */
75
+ export interface GetGitHubReleaseAssetUrlParams {
76
+ /**
77
+ * The name of the release asset.
78
+ */
79
+ readonly fileName: string;
80
+ /**
81
+ * The repository, as `<owner>/<name>`.
82
+ */
83
+ readonly repository: string;
84
+ /**
85
+ * The release tag, typically the plugin version.
86
+ */
87
+ readonly tag: string;
88
+ }
89
+ /**
90
+ * A verified release asset.
91
+ */
92
+ export interface ReleaseAsset {
93
+ /**
94
+ * The vault-relative path of the cached file.
95
+ */
96
+ readonly path: string;
97
+ /**
98
+ * The resource URL of the cached file, from the adapter's `getResourcePath`.
99
+ */
100
+ readonly resourceUrl: string;
101
+ /**
102
+ * Whether the file was already cached, so nothing was downloaded.
103
+ */
104
+ readonly wasCached: boolean;
105
+ }
106
+ /**
107
+ * Parameters for {@link ReleaseAssetChecksumError}.
108
+ */
109
+ export interface ReleaseAssetChecksumErrorConstructorParams {
110
+ /**
111
+ * The SHA-256 of the downloaded bytes.
112
+ */
113
+ readonly actualSha256: string;
114
+ /**
115
+ * The expected SHA-256.
116
+ */
117
+ readonly expectedSha256: string;
118
+ /**
119
+ * The URL the asset was downloaded from.
120
+ */
121
+ readonly url: string;
122
+ }
123
+ /**
124
+ * What the user is asked to agree to.
125
+ */
126
+ export interface ReleaseAssetConsentRequest {
127
+ /**
128
+ * The name of the asset.
129
+ */
130
+ readonly fileName: string;
131
+ /**
132
+ * The size of the asset in bytes, when known.
133
+ */
134
+ readonly sizeInBytes?: number | undefined;
135
+ /**
136
+ * The URL the asset is downloaded from.
137
+ */
138
+ readonly url: string;
139
+ }
140
+ /**
141
+ * Thrown when downloaded bytes do not match the expected SHA-256. Nothing was written.
142
+ */
143
+ export declare class ReleaseAssetChecksumError extends Error {
144
+ /**
145
+ * The SHA-256 of the downloaded bytes.
146
+ */
147
+ readonly actualSha256: string;
148
+ /**
149
+ * The expected SHA-256.
150
+ */
151
+ readonly expectedSha256: string;
152
+ /**
153
+ * The URL the asset was downloaded from.
154
+ */
155
+ readonly url: string;
156
+ /**
157
+ * Creates the error.
158
+ *
159
+ * @param params - The parameters.
160
+ */
161
+ constructor(params: ReleaseAssetChecksumErrorConstructorParams);
162
+ }
163
+ /**
164
+ * Computes the SHA-256 of the given bytes.
165
+ *
166
+ * @param data - The bytes.
167
+ * @returns The SHA-256 as 64 lowercase hexadecimal digits.
168
+ */
169
+ export declare function computeSha256(data: ArrayBuffer): Promise<string>;
170
+ /**
171
+ * Returns the cached, verified asset, downloading it first, with the user's consent, when it is missing or corrupt.
172
+ *
173
+ * @param params - The parameters.
174
+ * @returns The verified asset, or `null` when the user declined the download.
175
+ */
176
+ export declare function ensureReleaseAsset(params: EnsureReleaseAssetParams): Promise<null | ReleaseAsset>;
177
+ /**
178
+ * Formats a byte size for a person to read.
179
+ *
180
+ * @param sizeInBytes - The size in bytes.
181
+ * @returns The formatted size, such as `12.3 MB`.
182
+ */
183
+ export declare function formatByteSize(sizeInBytes: number): string;
184
+ /**
185
+ * Builds the download URL of a GitHub release asset.
186
+ *
187
+ * @param params - The parameters.
188
+ * @returns The URL.
189
+ */
190
+ export declare function getGitHubReleaseAssetUrl(params: GetGitHubReleaseAssetUrlParams): string;
@@ -0,0 +1,187 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { join } from "@mnaoumov/typescript-lib/path";
34
+ import { t } from "./i18n/i18n.mjs";
35
+ import { confirm } from "./modals/confirm.mjs";
36
+ import { requestUrlEx } from "./request-url.mjs";
37
+ const BYTES_IN_KILOBYTE = 1024;
38
+ const HEX_BYTE_LENGTH = 2;
39
+ const HEX_RADIX = 16;
40
+ const SHA_256_HEX_REG_EXP = /^[0-9a-f]{64}$/i;
41
+ const TEMPORARY_FILE_SUFFIX = ".download";
42
+ class ReleaseAssetChecksumError extends Error {
43
+ /**
44
+ * The SHA-256 of the downloaded bytes.
45
+ */
46
+ actualSha256;
47
+ /**
48
+ * The expected SHA-256.
49
+ */
50
+ expectedSha256;
51
+ /**
52
+ * The URL the asset was downloaded from.
53
+ */
54
+ url;
55
+ /**
56
+ * Creates the error.
57
+ *
58
+ * @param params - The parameters.
59
+ */
60
+ constructor(params) {
61
+ super(`The asset downloaded from ${params.url} has SHA-256 ${params.actualSha256}, expected ${params.expectedSha256}.`);
62
+ this.name = "ReleaseAssetChecksumError";
63
+ this.actualSha256 = params.actualSha256;
64
+ this.expectedSha256 = params.expectedSha256;
65
+ this.url = params.url;
66
+ }
67
+ }
68
+ const inFlightOperations = /* @__PURE__ */ new Map();
69
+ async function computeSha256(data) {
70
+ const hash = await window.crypto.subtle.digest("SHA-256", data);
71
+ return [...new Uint8Array(hash)].map((byte) => byte.toString(HEX_RADIX).padStart(HEX_BYTE_LENGTH, "0")).join("");
72
+ }
73
+ async function ensureReleaseAsset(params) {
74
+ if (!SHA_256_HEX_REG_EXP.test(params.sha256)) {
75
+ throw new Error(`Invalid SHA-256: ${params.sha256}`);
76
+ }
77
+ if (!params.fileName || /[/\\]/.test(params.fileName) || params.fileName === "." || params.fileName === "..") {
78
+ throw new Error(`Invalid asset file name: ${params.fileName}`);
79
+ }
80
+ const path = join(params.cacheFolderPath, params.fileName);
81
+ const inFlightOperation = inFlightOperations.get(path);
82
+ if (inFlightOperation) {
83
+ return await inFlightOperation;
84
+ }
85
+ const operation = ensureReleaseAssetImpl(params, path);
86
+ inFlightOperations.set(path, operation);
87
+ try {
88
+ return await operation;
89
+ } finally {
90
+ inFlightOperations.delete(path);
91
+ }
92
+ }
93
+ function formatByteSize(sizeInBytes) {
94
+ if (sizeInBytes < BYTES_IN_KILOBYTE) {
95
+ return `${String(sizeInBytes)} B`;
96
+ }
97
+ let size = sizeInBytes / BYTES_IN_KILOBYTE;
98
+ let unit = "KB";
99
+ for (const largerUnit of ["MB", "GB"]) {
100
+ if (size < BYTES_IN_KILOBYTE) {
101
+ break;
102
+ }
103
+ size /= BYTES_IN_KILOBYTE;
104
+ unit = largerUnit;
105
+ }
106
+ return `${size.toFixed(1)} ${unit}`;
107
+ }
108
+ function getGitHubReleaseAssetUrl(params) {
109
+ return `https://github.com/${params.repository}/releases/download/${encodeURIComponent(params.tag)}/${encodeURIComponent(params.fileName)}`;
110
+ }
111
+ async function ensureReleaseAssetImpl(params, path) {
112
+ const { abortSignal, app } = params;
113
+ const adapter = app.vault.adapter;
114
+ const expectedSha256 = params.sha256.toLowerCase();
115
+ abortSignal?.throwIfAborted();
116
+ if (await adapter.exists(path)) {
117
+ const cachedBytes = await adapter.readBinary(path);
118
+ if (await computeSha256(cachedBytes) === expectedSha256) {
119
+ return {
120
+ path,
121
+ resourceUrl: adapter.getResourcePath(path),
122
+ wasCached: true
123
+ };
124
+ }
125
+ await adapter.remove(path);
126
+ }
127
+ const consentRequest = {
128
+ fileName: params.fileName,
129
+ sizeInBytes: params.sizeInBytes,
130
+ url: params.url
131
+ };
132
+ const isDownloadAllowed = params.shouldDownload ? await params.shouldDownload(consentRequest) : await shouldDownloadWithModal(app, consentRequest);
133
+ if (!isDownloadAllowed) {
134
+ return null;
135
+ }
136
+ abortSignal?.throwIfAborted();
137
+ const response = await requestUrlEx({
138
+ abortSignal,
139
+ timeoutInMilliseconds: params.timeoutInMilliseconds,
140
+ url: params.url
141
+ });
142
+ const bytes = response.arrayBuffer;
143
+ const actualSha256 = await computeSha256(bytes);
144
+ if (actualSha256 !== expectedSha256) {
145
+ throw new ReleaseAssetChecksumError({ actualSha256, expectedSha256, url: params.url });
146
+ }
147
+ abortSignal?.throwIfAborted();
148
+ if (!await adapter.exists(params.cacheFolderPath)) {
149
+ await adapter.mkdir(params.cacheFolderPath);
150
+ }
151
+ const temporaryPath = `${path}${TEMPORARY_FILE_SUFFIX}`;
152
+ try {
153
+ await adapter.writeBinary(temporaryPath, bytes);
154
+ if (await adapter.exists(path)) {
155
+ await adapter.remove(path);
156
+ }
157
+ await adapter.rename(temporaryPath, path);
158
+ } catch (error) {
159
+ if (await adapter.exists(temporaryPath)) {
160
+ await adapter.remove(temporaryPath);
161
+ }
162
+ throw error;
163
+ }
164
+ return {
165
+ path,
166
+ resourceUrl: adapter.getResourcePath(path),
167
+ wasCached: false
168
+ };
169
+ }
170
+ async function shouldDownloadWithModal(app, request) {
171
+ const host = new URL(request.url).host;
172
+ const message = request.sizeInBytes === void 0 ? t(($) => $.obsidianLib.releaseAsset.consentMessageUnknownSize, { fileName: request.fileName, host }) : t(($) => $.obsidianLib.releaseAsset.consentMessage, { fileName: request.fileName, host, size: formatByteSize(request.sizeInBytes) });
173
+ return await confirm({
174
+ app,
175
+ message,
176
+ okButtonText: t(($) => $.obsidianLib.releaseAsset.download),
177
+ title: t(($) => $.obsidianLib.releaseAsset.consentTitle, { fileName: request.fileName })
178
+ });
179
+ }
180
+ export {
181
+ ReleaseAssetChecksumError,
182
+ computeSha256,
183
+ ensureReleaseAsset,
184
+ formatByteSize,
185
+ getGitHubReleaseAssetUrl
186
+ };
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWxlYXNlLWFzc2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW4gb3B0aW9uYWwgZGF0YSBhc3NldCBvZiBhIHBsdWdpbiByZWxlYXNlIG9uIGRlbWFuZDogaXQgYXNrcyB0aGUgdXNlciBmaXJzdCwgdmVyaWZpZXMgYW4gZXhwZWN0ZWQgU0hBLTI1NlxuICogYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4gb3IgZXhwb3NlZCwga2VlcHMgdGhlIHZlcmlmaWVkIGZpbGUgaW4gYSBsb2NhbCBjYWNoZSBmb2xkZXIgYW5kIGhhbmRzIGJhY2sgdGhlIGFkYXB0ZXJcbiAqIHJlc291cmNlIFVSTC5cbiAqXG4gKiBJdCB1c2VzIG9ubHkgY3Jvc3MtcGxhdGZvcm0gQVBJcyAoe0BsaW5rIHJlcXVlc3RVcmxFeH0sIHRoZSB2YXVsdCBhZGFwdGVyIGFuZCBgY3J5cHRvLnN1YnRsZWApLCBzbyBpdCB3b3JrcyBvbiBkZXNrdG9wXG4gKiBhbmQgbW9iaWxlIGFsaWtlLlxuICpcbiAqIEJlaGF2aW9yIHRoYXQgaXMgcGFydCBvZiB0aGUgY29udHJhY3Q6XG4gKlxuICogLSBBIGNhY2hlZCBmaWxlIGlzIGhhc2hlZCBvbiBldmVyeSBjYWxsLiBXaGVuIGl0cyBoYXNoIG1hdGNoZXMsIGl0IGlzIHJldXNlZCB3aXRob3V0IGFza2luZyBvciBkb3dubG9hZGluZy4gV2hlbiBpdFxuICogICBkb2VzIG5vdCwgaXQgaXMgcmVtb3ZlZCBhbmQgdHJlYXRlZCBhcyBtaXNzaW5nLCBzbyBhIGNvcnJ1cHQgb3IgdHJ1bmNhdGVkIGNhY2hlIHJlY292ZXJzIGJ5IGl0c2VsZi5cbiAqIC0gVGhlIHVzZXIgaXMgYXNrZWQgb25seSB3aGVuIGEgZG93bmxvYWQgaXMgbmVlZGVkLiBEZWNsaW5pbmcgcmVzb2x2ZXMgd2l0aCBgbnVsbGAgYW5kIHdyaXRlcyBub3RoaW5nLlxuICogLSBEb3dubG9hZGVkIGJ5dGVzIGFyZSB2ZXJpZmllZCBiZWZvcmUgdGhleSBhcmUgd3JpdHRlbi4gQSBtaXNtYXRjaCB0aHJvd3Mge0BsaW5rIFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3J9IGFuZFxuICogICB3cml0ZXMgbm90aGluZy5cbiAqIC0gVGhlIGZpbGUgaXMgd3JpdHRlbiB0byBhIHRlbXBvcmFyeSBzaWJsaW5nIGFuZCB0aGVuIHJlbmFtZWQgaW50byBwbGFjZSwgc28gYW4gaW50ZXJydXB0ZWQgd3JpdGUgbmV2ZXIgbGVhdmVzIGFcbiAqICAgcGFydGlhbCBmaWxlIHVuZGVyIHRoZSBjYWNoZWQgbmFtZS5cbiAqIC0gQW4gYWJvcnQgKHBhc3MgdGhlIHBsdWdpbidzIGFib3J0IHNpZ25hbCwgc28gYSBwbHVnaW4gdW5sb2FkIGNvdW50cykgcmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24uIE9uY2UgdGhlXG4gKiAgIGRvd25sb2FkIGhhcyBmaW5pc2hlZCwgdGhlIHNpZ25hbCBpcyBjaGVja2VkIGFnYWluIGJlZm9yZSB3cml0aW5nLCBzbyBub3RoaW5nIGlzIHdyaXR0ZW4gYWZ0ZXIgYW4gdW5sb2FkLlxuICogLSBDb25jdXJyZW50IGNhbGxzIGZvciB0aGUgc2FtZSBjYWNoZSBwYXRoIHNoYXJlIG9uZSBvcGVyYXRpb24sIHNvIHRoZSB1c2VyIGlzIGFza2VkIG9uY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5cbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQgeyByZXF1ZXN0VXJsRXggfSBmcm9tICcuL3JlcXVlc3QtdXJsLnRzJztcblxuY29uc3QgQllURVNfSU5fS0lMT0JZVEUgPSAxMDI0O1xuY29uc3QgSEVYX0JZVEVfTEVOR1RIID0gMjtcbmNvbnN0IEhFWF9SQURJWCA9IDE2O1xuY29uc3QgU0hBXzI1Nl9IRVhfUkVHX0VYUCA9IC9eWzAtOWEtZl17NjR9JC9pO1xuY29uc3QgVEVNUE9SQVJZX0ZJTEVfU1VGRklYID0gJy5kb3dubG9hZCc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVuc3VyZVJlbGVhc2VBc3NldH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5zdXJlUmVsZWFzZUFzc2V0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFib3J0cyB0aGUgb3BlcmF0aW9uLiBQYXNzIHRoZSBwbHVnaW4ncyBhYm9ydCBzaWduYWwsIHNvIGFuIHVubG9hZCBzdG9wcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQtcmVsYXRpdmUgZm9sZGVyIHRoYXQgaG9sZHMgdGhlIGNhY2hlZCBmaWxlLCB0eXBpY2FsbHkgYCR7cGx1Z2luLm1hbmlmZXN0LmRpcn0vYXNzZXRzYC5cbiAgICpcbiAgICogQSBmb2xkZXIgaW5zaWRlIHRoZSBjb25maWcgZm9sZGVyIGlzIG5vdCBzeW5jZWQsIHNvIGVhY2ggZGV2aWNlIGRvd25sb2FkcyB0aGUgYXNzZXQgb25jZS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRm9sZGVyUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FjaGVkIGZpbGUuIEl0IG11c3Qgbm90IGNvbnRhaW4gYSBwYXRoIHNlcGFyYXRvci5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleHBlY3RlZCBTSEEtMjU2IG9mIHRoZSBhc3NldCwgYXMgNjQgaGV4YWRlY2ltYWwgZGlnaXRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhMjU2OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFza3MgdGhlIHVzZXIgd2hldGhlciB0byBkb3dubG9hZCB0aGUgYXNzZXQuIERlZmF1bHRzIHRvIGEgY29uZmlybWF0aW9uIG1vZGFsLlxuICAgKlxuICAgKiBQYXNzIGAoKSA9PiBQcm9taXNlLnJlc29sdmUodHJ1ZSlgIHdoZW4gdGhlIHVzZXIgaGFzIGFscmVhZHkgYWdyZWVkLCBmb3IgZXhhbXBsZSB0aHJvdWdoIGEgc2V0dGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZERvd25sb2FkPzogKChyZXF1ZXN0OiBSZWxlYXNlQXNzZXRDb25zZW50UmVxdWVzdCkgPT4gUHJvbWlzZTxib29sZWFuPikgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBhc3NldCBpbiBieXRlcywgc2hvd24gdG8gdGhlIHVzZXIgd2hlbiBhc2tpbmcuXG4gICAqL1xuICByZWFkb25seSBzaXplSW5CeXRlcz86IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGRvd25sb2FkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIGRvd25sb2FkIHRoZSBhc3NldCBmcm9tLiBPbmx5IGBodHRwOmAgYW5kIGBodHRwczpgIFVSTHMgYXJlIGFjY2VwdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEdpdEh1YlJlbGVhc2VBc3NldFVybH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0R2l0SHViUmVsZWFzZUFzc2V0VXJsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSByZWxlYXNlIGFzc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlcG9zaXRvcnksIGFzIGA8b3duZXI+LzxuYW1lPmAuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZywgdHlwaWNhbGx5IHRoZSBwbHVnaW4gdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRhZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgdmVyaWZpZWQgcmVsZWFzZSBhc3NldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWxlYXNlQXNzZXQge1xuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggb2YgdGhlIGNhY2hlZCBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgVVJMIG9mIHRoZSBjYWNoZWQgZmlsZSwgZnJvbSB0aGUgYWRhcHRlcidzIGBnZXRSZXNvdXJjZVBhdGhgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VVcmw6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZmlsZSB3YXMgYWxyZWFkeSBjYWNoZWQsIHNvIG5vdGhpbmcgd2FzIGRvd25sb2FkZWQuXG4gICAqL1xuICByZWFkb25seSB3YXNDYWNoZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3J9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgU0hBLTI1NiBvZiB0aGUgZG93bmxvYWRlZCBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IGFjdHVhbFNoYTI1Njogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwZWN0ZWQgU0hBLTI1Ni5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkU2hhMjU2OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgdGhlIGFzc2V0IHdhcyBkb3dubG9hZGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSB1c2VyIGlzIGFza2VkIHRvIGFncmVlIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2VBc3NldENvbnNlbnRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhc3NldC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBhc3NldCBpbiBieXRlcywgd2hlbiBrbm93bi5cbiAgICovXG4gIHJlYWRvbmx5IHNpemVJbkJ5dGVzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRoZSBhc3NldCBpcyBkb3dubG9hZGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBkb3dubG9hZGVkIGJ5dGVzIGRvIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgU0hBLTI1Ni4gTm90aGluZyB3YXMgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgU0hBLTI1NiBvZiB0aGUgZG93bmxvYWRlZCBieXRlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhY3R1YWxTaGEyNTY6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGV4cGVjdGVkIFNIQS0yNTYuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXhwZWN0ZWRTaGEyNTY6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCB0aGUgYXNzZXQgd2FzIGRvd25sb2FkZWQgZnJvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKGBUaGUgYXNzZXQgZG93bmxvYWRlZCBmcm9tICR7cGFyYW1zLnVybH0gaGFzIFNIQS0yNTYgJHtwYXJhbXMuYWN0dWFsU2hhMjU2fSwgZXhwZWN0ZWQgJHtwYXJhbXMuZXhwZWN0ZWRTaGEyNTZ9LmApO1xuICAgIHRoaXMubmFtZSA9ICdSZWxlYXNlQXNzZXRDaGVja3N1bUVycm9yJztcbiAgICB0aGlzLmFjdHVhbFNoYTI1NiA9IHBhcmFtcy5hY3R1YWxTaGEyNTY7XG4gICAgdGhpcy5leHBlY3RlZFNoYTI1NiA9IHBhcmFtcy5leHBlY3RlZFNoYTI1NjtcbiAgICB0aGlzLnVybCA9IHBhcmFtcy51cmw7XG4gIH1cbn1cblxuY29uc3QgaW5GbGlnaHRPcGVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8bnVsbCB8IFJlbGVhc2VBc3NldD4+KCk7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIFNIQS0yNTYgb2YgdGhlIGdpdmVuIGJ5dGVzLlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGJ5dGVzLlxuICogQHJldHVybnMgVGhlIFNIQS0yNTYgYXMgNjQgbG93ZXJjYXNlIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaGEyNTYoZGF0YTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoaXMgaXMgdGhlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUEksIG5vdCBhIE5vZGUgYnVpbHRpbi5cbiAgY29uc3QgaGFzaCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGRhdGEpO1xuICByZXR1cm4gWy4uLm5ldyBVaW50OEFycmF5KGhhc2gpXS5tYXAoKGJ5dGUpID0+IGJ5dGUudG9TdHJpbmcoSEVYX1JBRElYKS5wYWRTdGFydChIRVhfQllURV9MRU5HVEgsICcwJykpLmpvaW4oJycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlZCwgdmVyaWZpZWQgYXNzZXQsIGRvd25sb2FkaW5nIGl0IGZpcnN0LCB3aXRoIHRoZSB1c2VyJ3MgY29uc2VudCwgd2hlbiBpdCBpcyBtaXNzaW5nIG9yIGNvcnJ1cHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHZlcmlmaWVkIGFzc2V0LCBvciBgbnVsbGAgd2hlbiB0aGUgdXNlciBkZWNsaW5lZCB0aGUgZG93bmxvYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVSZWxlYXNlQXNzZXQocGFyYW1zOiBFbnN1cmVSZWxlYXNlQXNzZXRQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBSZWxlYXNlQXNzZXQ+IHtcbiAgaWYgKCFTSEFfMjU2X0hFWF9SRUdfRVhQLnRlc3QocGFyYW1zLnNoYTI1NikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgU0hBLTI1NjogJHtwYXJhbXMuc2hhMjU2fWApO1xuICB9XG5cbiAgaWYgKCFwYXJhbXMuZmlsZU5hbWUgfHwgL1svXFxcXF0vLnRlc3QocGFyYW1zLmZpbGVOYW1lKSB8fCBwYXJhbXMuZmlsZU5hbWUgPT09ICcuJyB8fCBwYXJhbXMuZmlsZU5hbWUgPT09ICcuLicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXNzZXQgZmlsZSBuYW1lOiAke3BhcmFtcy5maWxlTmFtZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBqb2luKHBhcmFtcy5jYWNoZUZvbGRlclBhdGgsIHBhcmFtcy5maWxlTmFtZSk7XG4gIGNvbnN0IGluRmxpZ2h0T3BlcmF0aW9uID0gaW5GbGlnaHRPcGVyYXRpb25zLmdldChwYXRoKTtcbiAgaWYgKGluRmxpZ2h0T3BlcmF0aW9uKSB7XG4gICAgcmV0dXJuIGF3YWl0IGluRmxpZ2h0T3BlcmF0aW9uO1xuICB9XG5cbiAgY29uc3Qgb3BlcmF0aW9uID0gZW5zdXJlUmVsZWFzZUFzc2V0SW1wbChwYXJhbXMsIHBhdGgpO1xuICBpbkZsaWdodE9wZXJhdGlvbnMuc2V0KHBhdGgsIG9wZXJhdGlvbik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbjtcbiAgfSBmaW5hbGx5IHtcbiAgICBpbkZsaWdodE9wZXJhdGlvbnMuZGVsZXRlKHBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIGJ5dGUgc2l6ZSBmb3IgYSBwZXJzb24gdG8gcmVhZC5cbiAqXG4gKiBAcGFyYW0gc2l6ZUluQnl0ZXMgLSBUaGUgc2l6ZSBpbiBieXRlcy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgc2l6ZSwgc3VjaCBhcyBgMTIuMyBNQmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlU2l6ZShzaXplSW5CeXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHNpemVJbkJ5dGVzIDwgQllURVNfSU5fS0lMT0JZVEUpIHtcbiAgICByZXR1cm4gYCR7U3RyaW5nKHNpemVJbkJ5dGVzKX0gQmA7XG4gIH1cbiAgbGV0IHNpemUgPSBzaXplSW5CeXRlcyAvIEJZVEVTX0lOX0tJTE9CWVRFO1xuICBsZXQgdW5pdCA9ICdLQic7XG4gIGZvciAoY29uc3QgbGFyZ2VyVW5pdCBvZiBbJ01CJywgJ0dCJ10pIHtcbiAgICBpZiAoc2l6ZSA8IEJZVEVTX0lOX0tJTE9CWVRFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2l6ZSAvPSBCWVRFU19JTl9LSUxPQllURTtcbiAgICB1bml0ID0gbGFyZ2VyVW5pdDtcbiAgfVxuICByZXR1cm4gYCR7c2l6ZS50b0ZpeGVkKDEpfSAke3VuaXR9YDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGRvd25sb2FkIFVSTCBvZiBhIEdpdEh1YiByZWxlYXNlIGFzc2V0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHaXRIdWJSZWxlYXNlQXNzZXRVcmwocGFyYW1zOiBHZXRHaXRIdWJSZWxlYXNlQXNzZXRVcmxQYXJhbXMpOiBzdHJpbmcge1xuICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3BhcmFtcy5yZXBvc2l0b3J5fS9yZWxlYXNlcy9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMudGFnKX0vJHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmZpbGVOYW1lKX1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVSZWxlYXNlQXNzZXRJbXBsKHBhcmFtczogRW5zdXJlUmVsZWFzZUFzc2V0UGFyYW1zLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBSZWxlYXNlQXNzZXQ+IHtcbiAgY29uc3QgeyBhYm9ydFNpZ25hbCwgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGFkYXB0ZXIgPSBhcHAudmF1bHQuYWRhcHRlcjtcbiAgY29uc3QgZXhwZWN0ZWRTaGEyNTYgPSBwYXJhbXMuc2hhMjU2LnRvTG93ZXJDYXNlKCk7XG4gIGFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmIChhd2FpdCBhZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgIGNvbnN0IGNhY2hlZEJ5dGVzID0gYXdhaXQgYWRhcHRlci5yZWFkQmluYXJ5KHBhdGgpO1xuICAgIGlmIChhd2FpdCBjb21wdXRlU2hhMjU2KGNhY2hlZEJ5dGVzKSA9PT0gZXhwZWN0ZWRTaGEyNTYpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIHJlc291cmNlVXJsOiBhZGFwdGVyLmdldFJlc291cmNlUGF0aChwYXRoKSxcbiAgICAgICAgd2FzQ2FjaGVkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBhd2FpdCBhZGFwdGVyLnJlbW92ZShwYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnNlbnRSZXF1ZXN0OiBSZWxlYXNlQXNzZXRDb25zZW50UmVxdWVzdCA9IHtcbiAgICBmaWxlTmFtZTogcGFyYW1zLmZpbGVOYW1lLFxuICAgIHNpemVJbkJ5dGVzOiBwYXJhbXMuc2l6ZUluQnl0ZXMsXG4gICAgdXJsOiBwYXJhbXMudXJsXG4gIH07XG4gIGNvbnN0IGlzRG93bmxvYWRBbGxvd2VkID0gcGFyYW1zLnNob3VsZERvd25sb2FkID8gYXdhaXQgcGFyYW1zLnNob3VsZERvd25sb2FkKGNvbnNlbnRSZXF1ZXN0KSA6IGF3YWl0IHNob3VsZERvd25sb2FkV2l0aE1vZGFsKGFwcCwgY29uc2VudFJlcXVlc3QpO1xuICBpZiAoIWlzRG93bmxvYWRBbGxvd2VkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsRXgoe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogcGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICB1cmw6IHBhcmFtcy51cmxcbiAgfSk7XG4gIGNvbnN0IGJ5dGVzID0gcmVzcG9uc2UuYXJyYXlCdWZmZXI7XG4gIGNvbnN0IGFjdHVhbFNoYTI1NiA9IGF3YWl0IGNvbXB1dGVTaGEyNTYoYnl0ZXMpO1xuICBpZiAoYWN0dWFsU2hhMjU2ICE9PSBleHBlY3RlZFNoYTI1Nikge1xuICAgIHRocm93IG5ldyBSZWxlYXNlQXNzZXRDaGVja3N1bUVycm9yKHsgYWN0dWFsU2hhMjU2LCBleHBlY3RlZFNoYTI1NiwgdXJsOiBwYXJhbXMudXJsIH0pO1xuICB9XG4gIGFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghYXdhaXQgYWRhcHRlci5leGlzdHMocGFyYW1zLmNhY2hlRm9sZGVyUGF0aCkpIHtcbiAgICBhd2FpdCBhZGFwdGVyLm1rZGlyKHBhcmFtcy5jYWNoZUZvbGRlclBhdGgpO1xuICB9XG5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke3BhdGh9JHtURU1QT1JBUllfRklMRV9TVUZGSVh9YDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGFwdGVyLndyaXRlQmluYXJ5KHRlbXBvcmFyeVBhdGgsIGJ5dGVzKTtcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIucmVtb3ZlKHBhdGgpO1xuICAgIH1cbiAgICBhd2FpdCBhZGFwdGVyLnJlbmFtZSh0ZW1wb3JhcnlQYXRoLCBwYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHModGVtcG9yYXJ5UGF0aCkpIHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIucmVtb3ZlKHRlbXBvcmFyeVBhdGgpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aCxcbiAgICByZXNvdXJjZVVybDogYWRhcHRlci5nZXRSZXNvdXJjZVBhdGgocGF0aCksXG4gICAgd2FzQ2FjaGVkOiBmYWxzZVxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaG91bGREb3dubG9hZFdpdGhNb2RhbChhcHA6IEFwcCwgcmVxdWVzdDogUmVsZWFzZUFzc2V0Q29uc2VudFJlcXVlc3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgaG9zdCA9IG5ldyBVUkwocmVxdWVzdC51cmwpLmhvc3Q7XG4gIGNvbnN0IG1lc3NhZ2UgPSByZXF1ZXN0LnNpemVJbkJ5dGVzID09PSB1bmRlZmluZWRcbiAgICA/IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVsZWFzZUFzc2V0LmNvbnNlbnRNZXNzYWdlVW5rbm93blNpemUsIHsgZmlsZU5hbWU6IHJlcXVlc3QuZmlsZU5hbWUsIGhvc3QgfSlcbiAgICA6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVsZWFzZUFzc2V0LmNvbnNlbnRNZXNzYWdlLCB7IGZpbGVOYW1lOiByZXF1ZXN0LmZpbGVOYW1lLCBob3N0LCBzaXplOiBmb3JtYXRCeXRlU2l6ZShyZXF1ZXN0LnNpemVJbkJ5dGVzKSB9KTtcbiAgcmV0dXJuIGF3YWl0IGNvbmZpcm0oe1xuICAgIGFwcCxcbiAgICBtZXNzYWdlLFxuICAgIG9rQnV0dG9uVGV4dDogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZWxlYXNlQXNzZXQuZG93bmxvYWQpLFxuICAgIHRpdGxlOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlbGVhc2VBc3NldC5jb25zZW50VGl0bGUsIHsgZmlsZU5hbWU6IHJlcXVlc3QuZmlsZU5hbWUgfSlcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJBLFNBQVMsWUFBWTtBQUVyQixTQUFTLFNBQVM7QUFDbEIsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsb0JBQW9CO0FBRTdCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sWUFBWTtBQUNsQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHdCQUF3QjtBQTJJdkIsTUFBTSxrQ0FBa0MsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSW5DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLFFBQW9EO0FBQ3JFLFVBQU0sNkJBQTZCLE9BQU8sR0FBRyxnQkFBZ0IsT0FBTyxZQUFZLGNBQWMsT0FBTyxjQUFjLEdBQUc7QUFDdEgsU0FBSyxPQUFPO0FBQ1osU0FBSyxlQUFlLE9BQU87QUFDM0IsU0FB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
@@ -38,6 +38,12 @@ export declare function getAllDomWindows(app: App): Window[];
38
38
  * (every popout is a {@link WorkspaceWindow} under `floatingSplit`). Prefer this over the global
39
39
  * `window`, which only happens to be the main window because plugin code runs in its context.
40
40
  *
41
+ * Before the workspace layout loads, there is no root split yet: Obsidian `1.15.1` loads community
42
+ * plugins (`app.plugins.initialize()`) before `workspace.loadLayout()` builds `rootSplit`, so a plugin
43
+ * enabled at startup runs its `onload` while `rootSplit` is still `null`. No popout exists at that
44
+ * point either, so the global `window`, the window plugin code runs in, is the main window, and that
45
+ * is what is returned then. `WorkspaceRoot` itself is built with that same `window`.
46
+ *
41
47
  * @param app - The Obsidian app.
42
48
  * @returns The app's main window.
43
49
  */
@@ -47,7 +47,8 @@ function getAllDomWindows(app) {
47
47
  return getAllContainers(app).map((container) => container.win);
48
48
  }
49
49
  function getMainWindow(app) {
50
- return app.workspace.rootSplit.win;
50
+ const rootSplit = app.workspace.rootSplit;
51
+ return rootSplit?.win ?? window;
51
52
  }
52
53
  function switchToMainWindow(app) {
53
54
  return switchToWindow(getMainWindow(app));
@@ -72,4 +73,4 @@ export {
72
73
  switchToMainWindow,
73
74
  switchToWindow
74
75
  };
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93b3Jrc3BhY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFkZGl0aW9uYWwgdXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggdGhlIE9ic2lkaWFuIHtAbGluayBXb3Jrc3BhY2V9LlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGlzcG9zYWJsZUV4IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Rpc3Bvc2FibGUnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgLS0gV2UgbmVlZCB0byBpbXBvcnQgYFdvcmtzcGFjZWAgdG8gdXNlIGl0IGluIHRoZSB0c2RvY3MuXG4gIFdvcmtzcGFjZSxcbiAgV29ya3NwYWNlQ29udGFpbmVyLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzIC0tIFdlIG5lZWQgdG8gaW1wb3J0IGBXb3Jrc3BhY2VXaW5kb3dgIHRvIHVzZSBpdCBpbiB0aGUgdHNkb2NzLlxuICBXb3Jrc3BhY2VXaW5kb3dcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5cbi8qKlxuICogV2FpdHMgdW50aWwgdGhlIHdvcmtzcGFjZSBsYXlvdXQgaXMgcmVhZHkuXG4gKlxuICogUmVzb2x2ZXMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IGlzIGFscmVhZHkgcmVhZHk7IG90aGVyd2lzZSByZXNvbHZlcyBvbmNlIE9ic2lkaWFuIGZpcmVzIHRoZVxuICogbGF5b3V0LXJlYWR5IGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB3b3Jrc3BhY2UgbGF5b3V0IGlzIHJlYWR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTGF5b3V0UmVhZHkoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBhcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkocmVzb2x2ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHdvcmtzcGFjZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcC5cbiAqIEByZXR1cm5zIEFsbCBjb250YWluZXJzIGluIHRoZSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxDb250YWluZXJzKGFwcDogQXBwKTogV29ya3NwYWNlQ29udGFpbmVyW10ge1xuICBjb25zdCBjb250YWluZXJzID0gbmV3IFNldDxXb3Jrc3BhY2VDb250YWluZXI+KCk7XG4gIGFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcygobGVhZikgPT4ge1xuICAgIGNvbnRhaW5lcnMuYWRkKGxlYWYuZ2V0Q29udGFpbmVyKCkpO1xuICB9KTtcbiAgcmV0dXJuIFsuLi5jb250YWluZXJzXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBET00gd2luZG93cyBpbiB0aGUgd29ya3NwYWNlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwLlxuICogQHJldHVybnMgQWxsIERPTSB3aW5kb3dzIGluIHRoZSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxEb21XaW5kb3dzKGFwcDogQXBwKTogV2luZG93W10ge1xuICByZXR1cm4gZ2V0QWxsQ29udGFpbmVycyhhcHApLm1hcCgoY29udGFpbmVyKSA9PiBjb250YWluZXIud2luKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcHAncyBtYWluIHdpbmRvdyDigJQgdGhlIG9uZSB0aGUgdmF1bHQgb3BlbmVkIGluLCBhcyBvcHBvc2VkIHRvIGFueSBwb3BvdXQgd2luZG93LlxuICpcbiAqIFJlYWQgZnJvbSB0aGUgcm9vdCBzcGxpdCwgd2hpY2ggaXMgdGhlIG9uZSB3b3Jrc3BhY2UgY29udGFpbmVyIHRoYXQgYWx3YXlzIGxpdmVzIGluIHRoZSBtYWluIHdpbmRvd1xuICogKGV2ZXJ5IHBvcG91dCBpcyBhIHtAbGluayBXb3Jrc3BhY2VXaW5kb3d9IHVuZGVyIGBmbG9hdGluZ1NwbGl0YCkuIFByZWZlciB0aGlzIG92ZXIgdGhlIGdsb2JhbFxuICogYHdpbmRvd2AsIHdoaWNoIG9ubHkgaGFwcGVucyB0byBiZSB0aGUgbWFpbiB3aW5kb3cgYmVjYXVzZSBwbHVnaW4gY29kZSBydW5zIGluIGl0cyBjb250ZXh0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwLlxuICogQHJldHVybnMgVGhlIGFwcCdzIG1haW4gd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbldpbmRvdyhhcHA6IEFwcCk6IFdpbmRvdyB7XG4gIHJldHVybiBhcHAud29ya3NwYWNlLnJvb3RTcGxpdC53aW47XG59XG5cbi8qKlxuICogTWFrZXMgdGhlIGFwcCdzIG1haW4gd2luZG93IHRoZSBhY3RpdmUgb25lIHVudGlsIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZUV4fSBpcyBkaXNwb3NlZC5cbiAqXG4gKiBTZWUge0BsaW5rIHN3aXRjaFRvV2luZG93fSBmb3Igd2h5IHRoaXMgaXMgbmVlZGVkIGFuZCB3aGF0IGl0IGNoYW5nZXMsIGFuZCB7QGxpbmsgZ2V0TWFpbldpbmRvd30gZm9yXG4gKiB3aGF0IGNvdW50cyBhcyB0aGUgbWFpbiB3aW5kb3cuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlRXh9IHRoYXQgcmVzdG9yZXMgdGhlIHByZXZpb3VzbHkgYWN0aXZlIHdpbmRvdyB3aGVuIGRpc3Bvc2VkLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBSYWlzZSBhIG5vdGljZSBpbiB0aGUgbWFpbiB3aW5kb3cgZXZlbiB3aGlsZSB0aGUgc2V0dGluZ3Mgd2luZG93IGlzIG9wZW4uXG4gKiB1c2luZyBfbWFpbldpbmRvd1N3aXRjaCA9IHN3aXRjaFRvTWFpbldpbmRvdyhhcHApO1xuICogbmV3IE5vdGljZSgnVGhpcyB2YXVsdCBpcyBhIHRlbXBvcmFyeSBzYW5kYm94LicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzd2l0Y2hUb01haW5XaW5kb3coYXBwOiBBcHApOiBEaXNwb3NhYmxlRXgge1xuICByZXR1cm4gc3dpdGNoVG9XaW5kb3coZ2V0TWFpbldpbmRvdyhhcHApKTtcbn1cblxuLyoqXG4gKiBNYWtlcyB0aGUgZ2l2ZW4gd2luZG93IHRoZSBhY3RpdmUgb25lIHVudGlsIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZUV4fSBpcyBkaXNwb3NlZC5cbiAqXG4gKiBPYnNpZGlhbiB0cmFja3MgdGhlIGZvY3VzZWQgd2luZG93IGluIHRoZSBgYWN0aXZlV2luZG93YCAvIGBhY3RpdmVEb2N1bWVudGAgZ2xvYmFscyBhbmQgdXBkYXRlcyB0aGVtXG4gKiB3aGVuZXZlciBhIHdpbmRvdyB0YWtlcyBmb2N1cyDigJQgaW5jbHVkaW5nIHdoZW4gYSBwb3BvdXQgc3VjaCBhcyB0aGUgc2V0dGluZ3Mgd2luZG93IG9wZW5zLiBVSSBpdFxuICogY3JlYXRlcyBmb3IgXCJ0aGUgY3VycmVudCB3aW5kb3dcIiByZWFkcyB0aG9zZSBnbG9iYWxzIGF0IGNyZWF0aW9uIHRpbWUgYW5kIG9mZmVycyBubyB3YXkgdG8gbmFtZSBhXG4gKiB3aW5kb3c6IGBuZXcgTm90aWNlKC4uLilgLCBmb3IgaW5zdGFuY2UsIGlzIGJ1aWx0IGluc2lkZSB3aGF0ZXZlciB3aW5kb3cgYGFjdGl2ZVdpbmRvd2AgcG9pbnRzIGF0LFxuICogYW5kIGNhbm5vdCBiZSBtb3ZlZCBhZnRlcndhcmRzLiBQb2ludGluZyB0aGUgZ2xvYmFscyBhdCB0aGUgd2FudGVkIHdpbmRvdyBmb3IgZXhhY3RseSB0aGF0IGNyZWF0aW9uLFxuICogdGhlbiBwdXR0aW5nIHRoZW0gYmFjaywgaXMgd2hhdCB0aGlzIGRvZXMuXG4gKlxuICogUmVzdG9yZSBpcyB3aGF0IG1ha2VzIGl0IHNhZmUsIHNvIGFsd2F5cyBiaW5kIGl0IHdpdGggYHVzaW5nYCAob3IgZGlzcG9zZSBpdCBpbiBhIGBmaW5hbGx5YCk6IGxlYXZpbmdcbiAqIHRoZSBnbG9iYWxzIHBvaW50ZWQgYXQgdGhlIHdyb25nIHdpbmRvdyB3b3VsZCBtaXNwbGFjZSBldmVyeSBsYXRlciB3aW5kb3ctc2Vuc2l0aXZlIE9ic2lkaWFuIGNhbGwuXG4gKlxuICogQHBhcmFtIHdpbiAtIFRoZSB3aW5kb3cgdG8gbWFrZSBhY3RpdmUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlRXh9IHRoYXQgcmVzdG9yZXMgdGhlIHByZXZpb3VzbHkgYWN0aXZlIHdpbmRvdyB3aGVuIGRpc3Bvc2VkLlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB1c2luZyBfd2luZG93U3dpdGNoID0gc3dpdGNoVG9XaW5kb3cob3RoZXJXaW5kb3cpO1xuICogbmV3IE5vdGljZSgnVGhpcyBub3RpY2UgYmVsb25ncyB0byB0aGUgb3RoZXIgd2luZG93LicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzd2l0Y2hUb1dpbmRvdyh3aW46IFdpbmRvdyk6IERpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IHByZXZpb3VzQWN0aXZlV2luZG93ID0gYWN0aXZlV2luZG93O1xuICBjb25zdCBwcmV2aW91c0FjdGl2ZURvY3VtZW50ID0gYWN0aXZlRG9jdW1lbnQ7XG4gIHdpbmRvdy5hY3RpdmVXaW5kb3cgPSB3aW47XG4gIHdpbmRvdy5hY3RpdmVEb2N1bWVudCA9IHdpbi5kb2N1bWVudDtcblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHdpbmRvdy5hY3RpdmVXaW5kb3cgPSBwcmV2aW91c0FjdGl2ZVdpbmRvdztcbiAgICAgIHdpbmRvdy5hY3RpdmVEb2N1bWVudCA9IHByZXZpb3VzQWN0aXZlRG9jdW1lbnQ7XG4gICAgfVxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsU0FBUywwQkFBMEI7QUFXbkMsZUFBc0Isa0JBQWtCLEtBQXlCO0FBQy9ELFFBQU0sSUFBSSxRQUFjLENBQUMsWUFBWTtBQUNuQyxRQUFJLFVBQVUsY0FBYyxPQUFPO0FBQUEsRUFDckMsQ0FBQztBQUNIO0FBUU8sU0FBUyxpQkFBaUIsS0FBZ0M7QUFDL0QsUUFBTSxhQUFhLG9CQUFJLElBQXdCO0FBQy9DLE1BQUksVUFBVSxpQkFBaUIsQ0FBQyxTQUFTO0FBQ3ZDLGVBQVcsSUFBSSxLQUFLLGFBQWEsQ0FBQztBQUFBLEVBQ3BDLENBQUM7QUFDRCxTQUFPLENBQUMsR0FBRyxVQUFVO0FBQ3ZCO0FBUU8sU0FBUyxpQkFBaUIsS0FBb0I7QUFDbkQsU0FBTyxpQkFBaUIsR0FBRyxFQUFFLElBQUksQ0FBQyxjQUFjLFVBQVUsR0FBRztBQUMvRDtBQVlPLFNBQVMsY0FBYyxLQUFrQjtBQUM5QyxTQUFPLElBQUksVUFBVSxVQUFVO0FBQ2pDO0FBaUJPLFNBQVMsbUJBQW1CLEtBQXdCO0FBQ3pELFNBQU8sZUFBZSxjQUFjLEdBQUcsQ0FBQztBQUMxQztBQXVCTyxTQUFTLGVBQWUsS0FBMkI7QUFDeEQsUUFBTSx1QkFBdUI7QUFDN0IsUUFBTSx5QkFBeUI7QUFDL0IsU0FBTyxlQUFlO0FBQ3RCLFNBQU8saUJBQWlCLElBQUk7QUFFNUIsU0FBTyxJQUFJLG1CQUFtQjtBQUFBLElBQzVCLFVBQVUsTUFBWTtBQUNwQixhQUFPLGVBQWU7QUFDdEIsYUFBTyxpQkFBaUI7QUFBQSxJQUMxQjtBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsIm5hbWVzIjpbXX0=
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93b3Jrc3BhY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFkZGl0aW9uYWwgdXRpbGl0aWVzIGZvciB3b3JraW5nIHdpdGggdGhlIE9ic2lkaWFuIHtAbGluayBXb3Jrc3BhY2V9LlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGlzcG9zYWJsZUV4IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Rpc3Bvc2FibGUnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgLS0gV2UgbmVlZCB0byBpbXBvcnQgYFdvcmtzcGFjZWAgdG8gdXNlIGl0IGluIHRoZSB0c2RvY3MuXG4gIFdvcmtzcGFjZSxcbiAgV29ya3NwYWNlQ29udGFpbmVyLFxuICBXb3Jrc3BhY2VSb290LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzIC0tIFdlIG5lZWQgdG8gaW1wb3J0IGBXb3Jrc3BhY2VXaW5kb3dgIHRvIHVzZSBpdCBpbiB0aGUgdHNkb2NzLlxuICBXb3Jrc3BhY2VXaW5kb3dcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5cbi8qKlxuICogV2FpdHMgdW50aWwgdGhlIHdvcmtzcGFjZSBsYXlvdXQgaXMgcmVhZHkuXG4gKlxuICogUmVzb2x2ZXMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgbGF5b3V0IGlzIGFscmVhZHkgcmVhZHk7IG90aGVyd2lzZSByZXNvbHZlcyBvbmNlIE9ic2lkaWFuIGZpcmVzIHRoZVxuICogbGF5b3V0LXJlYWR5IGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB3b3Jrc3BhY2UgbGF5b3V0IGlzIHJlYWR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTGF5b3V0UmVhZHkoYXBwOiBBcHApOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBhcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkocmVzb2x2ZSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYWxsIGNvbnRhaW5lcnMgaW4gdGhlIHdvcmtzcGFjZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcC5cbiAqIEByZXR1cm5zIEFsbCBjb250YWluZXJzIGluIHRoZSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxDb250YWluZXJzKGFwcDogQXBwKTogV29ya3NwYWNlQ29udGFpbmVyW10ge1xuICBjb25zdCBjb250YWluZXJzID0gbmV3IFNldDxXb3Jrc3BhY2VDb250YWluZXI+KCk7XG4gIGFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcygobGVhZikgPT4ge1xuICAgIGNvbnRhaW5lcnMuYWRkKGxlYWYuZ2V0Q29udGFpbmVyKCkpO1xuICB9KTtcbiAgcmV0dXJuIFsuLi5jb250YWluZXJzXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBET00gd2luZG93cyBpbiB0aGUgd29ya3NwYWNlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwLlxuICogQHJldHVybnMgQWxsIERPTSB3aW5kb3dzIGluIHRoZSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxEb21XaW5kb3dzKGFwcDogQXBwKTogV2luZG93W10ge1xuICByZXR1cm4gZ2V0QWxsQ29udGFpbmVycyhhcHApLm1hcCgoY29udGFpbmVyKSA9PiBjb250YWluZXIud2luKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcHAncyBtYWluIHdpbmRvdyDigJQgdGhlIG9uZSB0aGUgdmF1bHQgb3BlbmVkIGluLCBhcyBvcHBvc2VkIHRvIGFueSBwb3BvdXQgd2luZG93LlxuICpcbiAqIFJlYWQgZnJvbSB0aGUgcm9vdCBzcGxpdCwgd2hpY2ggaXMgdGhlIG9uZSB3b3Jrc3BhY2UgY29udGFpbmVyIHRoYXQgYWx3YXlzIGxpdmVzIGluIHRoZSBtYWluIHdpbmRvd1xuICogKGV2ZXJ5IHBvcG91dCBpcyBhIHtAbGluayBXb3Jrc3BhY2VXaW5kb3d9IHVuZGVyIGBmbG9hdGluZ1NwbGl0YCkuIFByZWZlciB0aGlzIG92ZXIgdGhlIGdsb2JhbFxuICogYHdpbmRvd2AsIHdoaWNoIG9ubHkgaGFwcGVucyB0byBiZSB0aGUgbWFpbiB3aW5kb3cgYmVjYXVzZSBwbHVnaW4gY29kZSBydW5zIGluIGl0cyBjb250ZXh0LlxuICpcbiAqIEJlZm9yZSB0aGUgd29ya3NwYWNlIGxheW91dCBsb2FkcywgdGhlcmUgaXMgbm8gcm9vdCBzcGxpdCB5ZXQ6IE9ic2lkaWFuIGAxLjE1LjFgIGxvYWRzIGNvbW11bml0eVxuICogcGx1Z2lucyAoYGFwcC5wbHVnaW5zLmluaXRpYWxpemUoKWApIGJlZm9yZSBgd29ya3NwYWNlLmxvYWRMYXlvdXQoKWAgYnVpbGRzIGByb290U3BsaXRgLCBzbyBhIHBsdWdpblxuICogZW5hYmxlZCBhdCBzdGFydHVwIHJ1bnMgaXRzIGBvbmxvYWRgIHdoaWxlIGByb290U3BsaXRgIGlzIHN0aWxsIGBudWxsYC4gTm8gcG9wb3V0IGV4aXN0cyBhdCB0aGF0XG4gKiBwb2ludCBlaXRoZXIsIHNvIHRoZSBnbG9iYWwgYHdpbmRvd2AsIHRoZSB3aW5kb3cgcGx1Z2luIGNvZGUgcnVucyBpbiwgaXMgdGhlIG1haW4gd2luZG93LCBhbmQgdGhhdFxuICogaXMgd2hhdCBpcyByZXR1cm5lZCB0aGVuLiBgV29ya3NwYWNlUm9vdGAgaXRzZWxmIGlzIGJ1aWx0IHdpdGggdGhhdCBzYW1lIGB3aW5kb3dgLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwLlxuICogQHJldHVybnMgVGhlIGFwcCdzIG1haW4gd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbldpbmRvdyhhcHA6IEFwcCk6IFdpbmRvdyB7XG4gIC8vIGBvYnNpZGlhbi5kLnRzYCBkZWNsYXJlcyBgcm9vdFNwbGl0YCBub24tbnVsbCwgd2hpY2ggaXMgbm90IHRydWUgYmVmb3JlIHRoZSBsYXlvdXQgbG9hZHMuXG4gIGNvbnN0IHJvb3RTcGxpdCA9IGFwcC53b3Jrc3BhY2Uucm9vdFNwbGl0IGFzIG51bGwgfCBXb3Jrc3BhY2VSb290O1xuICByZXR1cm4gcm9vdFNwbGl0Py53aW4gPz8gd2luZG93O1xufVxuXG4vKipcbiAqIE1ha2VzIHRoZSBhcHAncyBtYWluIHdpbmRvdyB0aGUgYWN0aXZlIG9uZSB1bnRpbCB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGVFeH0gaXMgZGlzcG9zZWQuXG4gKlxuICogU2VlIHtAbGluayBzd2l0Y2hUb1dpbmRvd30gZm9yIHdoeSB0aGlzIGlzIG5lZWRlZCBhbmQgd2hhdCBpdCBjaGFuZ2VzLCBhbmQge0BsaW5rIGdldE1haW5XaW5kb3d9IGZvclxuICogd2hhdCBjb3VudHMgYXMgdGhlIG1haW4gd2luZG93LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB0aGF0IHJlc3RvcmVzIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSB3aW5kb3cgd2hlbiBkaXNwb3NlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gUmFpc2UgYSBub3RpY2UgaW4gdGhlIG1haW4gd2luZG93IGV2ZW4gd2hpbGUgdGhlIHNldHRpbmdzIHdpbmRvdyBpcyBvcGVuLlxuICogdXNpbmcgX21haW5XaW5kb3dTd2l0Y2ggPSBzd2l0Y2hUb01haW5XaW5kb3coYXBwKTtcbiAqIG5ldyBOb3RpY2UoJ1RoaXMgdmF1bHQgaXMgYSB0ZW1wb3Jhcnkgc2FuZGJveC4nKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3dpdGNoVG9NYWluV2luZG93KGFwcDogQXBwKTogRGlzcG9zYWJsZUV4IHtcbiAgcmV0dXJuIHN3aXRjaFRvV2luZG93KGdldE1haW5XaW5kb3coYXBwKSk7XG59XG5cbi8qKlxuICogTWFrZXMgdGhlIGdpdmVuIHdpbmRvdyB0aGUgYWN0aXZlIG9uZSB1bnRpbCB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGVFeH0gaXMgZGlzcG9zZWQuXG4gKlxuICogT2JzaWRpYW4gdHJhY2tzIHRoZSBmb2N1c2VkIHdpbmRvdyBpbiB0aGUgYGFjdGl2ZVdpbmRvd2AgLyBgYWN0aXZlRG9jdW1lbnRgIGdsb2JhbHMgYW5kIHVwZGF0ZXMgdGhlbVxuICogd2hlbmV2ZXIgYSB3aW5kb3cgdGFrZXMgZm9jdXMg4oCUIGluY2x1ZGluZyB3aGVuIGEgcG9wb3V0IHN1Y2ggYXMgdGhlIHNldHRpbmdzIHdpbmRvdyBvcGVucy4gVUkgaXRcbiAqIGNyZWF0ZXMgZm9yIFwidGhlIGN1cnJlbnQgd2luZG93XCIgcmVhZHMgdGhvc2UgZ2xvYmFscyBhdCBjcmVhdGlvbiB0aW1lIGFuZCBvZmZlcnMgbm8gd2F5IHRvIG5hbWUgYVxuICogd2luZG93OiBgbmV3IE5vdGljZSguLi4pYCwgZm9yIGluc3RhbmNlLCBpcyBidWlsdCBpbnNpZGUgd2hhdGV2ZXIgd2luZG93IGBhY3RpdmVXaW5kb3dgIHBvaW50cyBhdCxcbiAqIGFuZCBjYW5ub3QgYmUgbW92ZWQgYWZ0ZXJ3YXJkcy4gUG9pbnRpbmcgdGhlIGdsb2JhbHMgYXQgdGhlIHdhbnRlZCB3aW5kb3cgZm9yIGV4YWN0bHkgdGhhdCBjcmVhdGlvbixcbiAqIHRoZW4gcHV0dGluZyB0aGVtIGJhY2ssIGlzIHdoYXQgdGhpcyBkb2VzLlxuICpcbiAqIFJlc3RvcmUgaXMgd2hhdCBtYWtlcyBpdCBzYWZlLCBzbyBhbHdheXMgYmluZCBpdCB3aXRoIGB1c2luZ2AgKG9yIGRpc3Bvc2UgaXQgaW4gYSBgZmluYWxseWApOiBsZWF2aW5nXG4gKiB0aGUgZ2xvYmFscyBwb2ludGVkIGF0IHRoZSB3cm9uZyB3aW5kb3cgd291bGQgbWlzcGxhY2UgZXZlcnkgbGF0ZXIgd2luZG93LXNlbnNpdGl2ZSBPYnNpZGlhbiBjYWxsLlxuICpcbiAqIEBwYXJhbSB3aW4gLSBUaGUgd2luZG93IHRvIG1ha2UgYWN0aXZlLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB0aGF0IHJlc3RvcmVzIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSB3aW5kb3cgd2hlbiBkaXNwb3NlZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdXNpbmcgX3dpbmRvd1N3aXRjaCA9IHN3aXRjaFRvV2luZG93KG90aGVyV2luZG93KTtcbiAqIG5ldyBOb3RpY2UoJ1RoaXMgbm90aWNlIGJlbG9uZ3MgdG8gdGhlIG90aGVyIHdpbmRvdy4nKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3dpdGNoVG9XaW5kb3cod2luOiBXaW5kb3cpOiBEaXNwb3NhYmxlRXgge1xuICBjb25zdCBwcmV2aW91c0FjdGl2ZVdpbmRvdyA9IGFjdGl2ZVdpbmRvdztcbiAgY29uc3QgcHJldmlvdXNBY3RpdmVEb2N1bWVudCA9IGFjdGl2ZURvY3VtZW50O1xuICB3aW5kb3cuYWN0aXZlV2luZG93ID0gd2luO1xuICB3aW5kb3cuYWN0aXZlRG9jdW1lbnQgPSB3aW4uZG9jdW1lbnQ7XG5cbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICB3aW5kb3cuYWN0aXZlV2luZG93ID0gcHJldmlvdXNBY3RpdmVXaW5kb3c7XG4gICAgICB3aW5kb3cuYWN0aXZlRG9jdW1lbnQgPSBwcmV2aW91c0FjdGl2ZURvY3VtZW50O1xuICAgIH1cbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBLFNBQVMsMEJBQTBCO0FBV25DLGVBQXNCLGtCQUFrQixLQUF5QjtBQUMvRCxRQUFNLElBQUksUUFBYyxDQUFDLFlBQVk7QUFDbkMsUUFBSSxVQUFVLGNBQWMsT0FBTztBQUFBLEVBQ3JDLENBQUM7QUFDSDtBQVFPLFNBQVMsaUJBQWlCLEtBQWdDO0FBQy9ELFFBQU0sYUFBYSxvQkFBSSxJQUF3QjtBQUMvQyxNQUFJLFVBQVUsaUJBQWlCLENBQUMsU0FBUztBQUN2QyxlQUFXLElBQUksS0FBSyxhQUFhLENBQUM7QUFBQSxFQUNwQyxDQUFDO0FBQ0QsU0FBTyxDQUFDLEdBQUcsVUFBVTtBQUN2QjtBQVFPLFNBQVMsaUJBQWlCLEtBQW9CO0FBQ25ELFNBQU8saUJBQWlCLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYyxVQUFVLEdBQUc7QUFDL0Q7QUFrQk8sU0FBUyxjQUFjLEtBQWtCO0FBRTlDLFFBQU0sWUFBWSxJQUFJLFVBQVU7QUFDaEMsU0FBTyxXQUFXLE9BQU87QUFDM0I7QUFpQk8sU0FBUyxtQkFBbUIsS0FBd0I7QUFDekQsU0FBTyxlQUFlLGNBQWMsR0FBRyxDQUFDO0FBQzFDO0FBdUJPLFNBQVMsZUFBZSxLQUEyQjtBQUN4RCxRQUFNLHVCQUF1QjtBQUM3QixRQUFNLHlCQUF5QjtBQUMvQixTQUFPLGVBQWU7QUFDdEIsU0FBTyxpQkFBaUIsSUFBSTtBQUU1QixTQUFPLElBQUksbUJBQW1CO0FBQUEsSUFDNUIsVUFBVSxNQUFZO0FBQ3BCLGFBQU8sZUFBZTtBQUN0QixhQUFPLGlCQUFpQjtBQUFBLElBQzFCO0FBQUEsRUFDRixDQUFDO0FBQ0g7IiwibmFtZXMiOltdfQ==