@mnaoumov/obsidian-lib 10.3.0 → 10.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/command-handlers/undo-bulk-operation-command-handler/package.json +6 -0
  2. package/components/bulk-operation-commit-component/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +42 -1
  4. package/dist/lib/cjs/__merged.d.cts +5 -0
  5. package/dist/lib/cjs/bulk-operation-progress.cjs +120 -0
  6. package/dist/lib/cjs/bulk-operation-progress.d.cts +33 -0
  7. package/dist/lib/cjs/bulk-operation.cjs +220 -0
  8. package/dist/lib/cjs/bulk-operation.d.cts +237 -0
  9. package/dist/lib/cjs/command-handlers/index.cjs +4 -1
  10. package/dist/lib/cjs/command-handlers/index.d.cts +1 -0
  11. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +164 -0
  12. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.d.cts +51 -0
  13. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +337 -0
  14. package/dist/lib/cjs/components/bulk-operation-commit-component.d.cts +152 -0
  15. package/dist/lib/cjs/components/index.cjs +4 -1
  16. package/dist/lib/cjs/components/index.d.cts +1 -0
  17. package/dist/lib/cjs/data-stores/local-data-store.cjs +2 -3
  18. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +534 -0
  19. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +196 -0
  20. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  21. package/dist/lib/cjs/i18n/locales/en.cjs +10 -1
  22. package/dist/lib/cjs/i18n/locales/en.d.cts +9 -0
  23. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +9 -0
  24. package/dist/lib/cjs/index.cjs +10 -1
  25. package/dist/lib/cjs/index.d.cts +3 -0
  26. package/dist/lib/cjs/loop.cjs +3 -1
  27. package/dist/lib/esm/__merged.d.mts +5 -0
  28. package/dist/lib/esm/__merged.mjs +43 -1
  29. package/dist/lib/esm/bulk-operation-progress.d.mts +33 -0
  30. package/dist/lib/esm/bulk-operation-progress.mjs +31 -0
  31. package/dist/lib/esm/bulk-operation.d.mts +237 -0
  32. package/dist/lib/esm/bulk-operation.mjs +125 -0
  33. package/dist/lib/esm/command-handlers/index.d.mts +1 -0
  34. package/dist/lib/esm/command-handlers/index.mjs +3 -1
  35. package/dist/lib/esm/command-handlers/undo-bulk-operation-command-handler.d.mts +51 -0
  36. package/dist/lib/esm/command-handlers/undo-bulk-operation-command-handler.mjs +76 -0
  37. package/dist/lib/esm/components/bulk-operation-commit-component.d.mts +152 -0
  38. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +245 -0
  39. package/dist/lib/esm/components/index.d.mts +1 -0
  40. package/dist/lib/esm/components/index.mjs +3 -1
  41. package/dist/lib/esm/data-stores/local-data-store.mjs +2 -3
  42. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +196 -0
  43. package/dist/lib/esm/desktop-bulk-operation-git.mjs +463 -0
  44. package/dist/lib/esm/generated-during-build.mjs +1 -1
  45. package/dist/lib/esm/i18n/locales/en.d.mts +9 -0
  46. package/dist/lib/esm/i18n/locales/en.mjs +10 -1
  47. package/dist/lib/esm/i18n/locales/translations-map.d.mts +9 -0
  48. package/dist/lib/esm/index.d.mts +3 -0
  49. package/dist/lib/esm/index.mjs +7 -1
  50. package/dist/lib/esm/loop.mjs +3 -1
  51. package/package.json +2 -1
@@ -0,0 +1,237 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The platform-neutral half of bulk-operation git commits: the lease-lock record, the `OP<n>` ids and the commit
6
+ * messages that carry them.
7
+ *
8
+ * A bulk operation wrapped by `BulkOperationCommitComponent` lands in the vault's git repo as one commit whose
9
+ * subject is `OP<n>: <summary>`, preceded (when the tree was dirty) by a `chore: before OP<n>` commit holding
10
+ * whatever was pending, so `git revert` of the `OP<n>` commit undoes exactly that operation. Everything in this
11
+ * module is pure, so it is shared by the desktop git layer and by the scheduled autocommit that reads the same lock.
12
+ *
13
+ * The lock record and the commit message trailers are a wire format between plugins built on different copies of
14
+ * this library and the vault autocommit script: fields may be added, never renamed or reinterpreted.
15
+ */
16
+ /**
17
+ * The name of the lease-lock file, created inside the repo's git directory so it is never committed or
18
+ * synced.
19
+ */
20
+ export declare const BULK_OPERATION_LOCK_FILE_NAME = "obsidian-bulk-operation.json";
21
+ /**
22
+ * How long a lock may go without a heartbeat before it counts as stale.
23
+ *
24
+ * It errs long on purpose: holding a dead lock too long only makes an autocommit skip a tick, while declaring a
25
+ * live one stale splits its operation across two commits.
26
+ */
27
+ export declare const BULK_OPERATION_LOCK_STALE_AFTER_IN_MILLISECONDS = 120000;
28
+ /**
29
+ * The trailer key naming the operation id in a bulk-operation commit body.
30
+ */
31
+ export declare const OPERATION_TRAILER_KEY = "Obsidian-Bulk-Operation";
32
+ /**
33
+ * The trailer key naming the plugin in a bulk-operation commit body.
34
+ */
35
+ export declare const PLUGIN_TRAILER_KEY = "Obsidian-Plugin";
36
+ /**
37
+ * Parameters for {@link buildOperationCommitMessage}.
38
+ */
39
+ export interface BuildOperationCommitMessageParams {
40
+ /**
41
+ * The number of files the commit changes.
42
+ */
43
+ readonly changedFileCount: number;
44
+ /**
45
+ * Whether the operation was interrupted.
46
+ */
47
+ readonly isInterrupted?: boolean;
48
+ /**
49
+ * The operation id, such as `OP12`.
50
+ */
51
+ readonly operationId: string;
52
+ /**
53
+ * The id of the plugin that ran the operation.
54
+ */
55
+ readonly pluginId: string;
56
+ /**
57
+ * A one-line description of the operation. Ignored for an interrupted operation.
58
+ */
59
+ readonly summary?: string;
60
+ /**
61
+ * When the operation ran.
62
+ */
63
+ readonly timestamp: Date;
64
+ }
65
+ /**
66
+ * A bulk-operation commit found in the repo history.
67
+ */
68
+ export interface BulkOperationCommit {
69
+ /**
70
+ * The commit date, as an ISO 8601 string.
71
+ */
72
+ readonly date: string;
73
+ /**
74
+ * Whether the commit records an interrupted operation rather than a completed one.
75
+ */
76
+ readonly isInterrupted: boolean;
77
+ /**
78
+ * The operation id, such as `OP12`.
79
+ */
80
+ readonly operationId: string;
81
+ /**
82
+ * The full commit hash.
83
+ */
84
+ readonly sha: string;
85
+ /**
86
+ * The commit subject.
87
+ */
88
+ readonly subject: string;
89
+ }
90
+ /**
91
+ * The lease-lock record stored in `.git/obsidian-bulk-operation.json` while a bulk operation runs.
92
+ */
93
+ export interface BulkOperationLock {
94
+ /**
95
+ * When the lock was last refreshed by the operation's progress, as epoch milliseconds.
96
+ */
97
+ readonly heartbeatAt: number;
98
+ /**
99
+ * The host name of the machine running the operation.
100
+ */
101
+ readonly host: string;
102
+ /**
103
+ * The operation id, such as `OP12`.
104
+ */
105
+ readonly operationId: string;
106
+ /**
107
+ * The id of the plugin running the operation.
108
+ */
109
+ readonly pluginId: string;
110
+ /**
111
+ * The id of the process running Obsidian. Only a fast path for an app crash; staleness never depends on it.
112
+ */
113
+ readonly processId: number;
114
+ /**
115
+ * When the process running Obsidian started, as epoch milliseconds, so a recycled process id is not mistaken for
116
+ * the original one.
117
+ */
118
+ readonly processStartedAt: number;
119
+ /**
120
+ * When the operation started, as epoch milliseconds.
121
+ */
122
+ readonly startedAt: number;
123
+ }
124
+ /**
125
+ * The facts {@link isBulkOperationLockStale} weighs besides the heartbeat.
126
+ */
127
+ export interface BulkOperationLockStalenessContext {
128
+ /**
129
+ * When this machine last booted, as epoch milliseconds, or `null` when unknown.
130
+ */
131
+ readonly bootedAt: null | number;
132
+ /**
133
+ * The host name of this machine.
134
+ */
135
+ readonly host: string;
136
+ /**
137
+ * Whether the process recorded in the lock is still running on this machine, or `null` when it cannot be told.
138
+ */
139
+ readonly isProcessAlive: (processId: number) => boolean | null;
140
+ /**
141
+ * The current time, as epoch milliseconds.
142
+ */
143
+ readonly now: number;
144
+ }
145
+ /**
146
+ * The commit message of one bulk-operation commit.
147
+ */
148
+ export interface OperationCommitMessage {
149
+ /**
150
+ * The commit body: the timestamp, the plugin and the counts, as git trailers.
151
+ */
152
+ readonly body: string;
153
+ /**
154
+ * The commit subject.
155
+ */
156
+ readonly subject: string;
157
+ }
158
+ /**
159
+ * Parameters for {@link parseBulkOperationCommit}.
160
+ */
161
+ export interface ParseBulkOperationCommitParams {
162
+ /**
163
+ * The commit date, as an ISO 8601 string.
164
+ */
165
+ readonly date: string;
166
+ /**
167
+ * The full commit hash.
168
+ */
169
+ readonly sha: string;
170
+ /**
171
+ * The commit subject.
172
+ */
173
+ readonly subject: string;
174
+ }
175
+ /**
176
+ * Builds the subject of the commit that saves whatever was pending before an operation.
177
+ *
178
+ * @param operationId - The operation id, such as `OP12`.
179
+ * @returns The commit subject.
180
+ */
181
+ export declare function buildBeforeOperationCommitSubject(operationId: string): string;
182
+ /**
183
+ * Builds the message of the commit recording a bulk operation, or an interrupted one.
184
+ *
185
+ * @param params - The parameters.
186
+ * @returns The commit subject and body.
187
+ */
188
+ export declare function buildOperationCommitMessage(params: BuildOperationCommitMessageParams): OperationCommitMessage;
189
+ /**
190
+ * Formats an operation id from its number.
191
+ *
192
+ * @param operationNumber - The operation number.
193
+ * @returns The operation id, such as `OP12`.
194
+ */
195
+ export declare function formatOperationId(operationNumber: number): string;
196
+ /**
197
+ * Finds the next operation id from the subjects of the bulk-operation commits already in the history.
198
+ *
199
+ * @param subjects - Commit subjects; anything that is not a bulk-operation subject is ignored.
200
+ * @returns `OP<n>` with n one past the highest number found, or `OP1` when there is none.
201
+ */
202
+ export declare function getNextOperationId(subjects: readonly string[]): string;
203
+ /**
204
+ * Checks whether a value has the shape of a {@link BulkOperationLock}.
205
+ *
206
+ * @param value - The value read from the lock file.
207
+ * @returns Whether it is a lock record.
208
+ */
209
+ export declare function isBulkOperationLock(value: unknown): value is BulkOperationLock;
210
+ /**
211
+ * Decides whether a lease lock is stale, so whoever finds it may commit the leftovers and remove it.
212
+ *
213
+ * The heartbeat is the rule; the reboot and crashed-process checks are only fast paths that shorten the wait, and
214
+ * neither can make a lock with a fresh heartbeat on another machine stale.
215
+ *
216
+ * @param lock - The lock record.
217
+ * @param context - The facts about this machine.
218
+ * @returns Whether the lock is stale.
219
+ */
220
+ export declare function isBulkOperationLockStale(lock: BulkOperationLock, context: BulkOperationLockStalenessContext): boolean;
221
+ /**
222
+ * Parses a bulk-operation commit subject into the commit it describes, skipping the `chore: before` commits, which
223
+ * are not operations.
224
+ *
225
+ * @param params - The commit's hash, date and subject.
226
+ * @returns The bulk-operation commit, or `null` when the subject is not one.
227
+ */
228
+ export declare function parseBulkOperationCommit(params: ParseBulkOperationCommitParams): BulkOperationCommit | null;
229
+ /**
230
+ * Parses the operation number out of a bulk-operation commit subject.
231
+ *
232
+ * Recognizes `OP<n>: <summary>`, `OP<n> interrupted` and `chore: before OP<n>`.
233
+ *
234
+ * @param subject - The commit subject.
235
+ * @returns The operation number, or `null` when the subject is not a bulk-operation subject.
236
+ */
237
+ export declare function parseOperationNumber(subject: string): null | number;
@@ -0,0 +1,125 @@
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 { getMandatoryNamedGroup } from "@mnaoumov/typescript-lib/reg-exp";
34
+ import {
35
+ isNumber,
36
+ isString,
37
+ objectTypeGuard
38
+ } from "@mnaoumov/typescript-lib/type-guards";
39
+ const BULK_OPERATION_LOCK_FILE_NAME = "obsidian-bulk-operation.json";
40
+ const BULK_OPERATION_LOCK_STALE_AFTER_IN_MILLISECONDS = 12e4;
41
+ const OPERATION_TRAILER_KEY = "Obsidian-Bulk-Operation";
42
+ const PLUGIN_TRAILER_KEY = "Obsidian-Plugin";
43
+ const OPERATION_ID_PREFIX = "OP";
44
+ const isBulkOperationLockImpl = objectTypeGuard({
45
+ heartbeatAt: isNumber,
46
+ host: isString,
47
+ operationId: isString,
48
+ pluginId: isString,
49
+ processId: isNumber,
50
+ processStartedAt: isNumber,
51
+ startedAt: isNumber
52
+ });
53
+ function buildBeforeOperationCommitSubject(operationId) {
54
+ return `chore: before ${operationId}`;
55
+ }
56
+ function buildOperationCommitMessage(params) {
57
+ const subject = params.isInterrupted ? `${params.operationId} interrupted` : `${params.operationId}: ${normalizeSummary(params.summary ?? "")}`;
58
+ const body = `Timestamp: ${params.timestamp.toISOString()}
59
+ Changed-Files: ${String(params.changedFileCount)}
60
+ ${PLUGIN_TRAILER_KEY}: ${params.pluginId}
61
+ ${OPERATION_TRAILER_KEY}: ${params.operationId}`;
62
+ return { body, subject };
63
+ }
64
+ function formatOperationId(operationNumber) {
65
+ return `${OPERATION_ID_PREFIX}${String(operationNumber)}`;
66
+ }
67
+ function getNextOperationId(subjects) {
68
+ let maxOperationNumber = 0;
69
+ for (const subject of subjects) {
70
+ const operationNumber = parseOperationNumber(subject);
71
+ if (operationNumber !== null && operationNumber > maxOperationNumber) {
72
+ maxOperationNumber = operationNumber;
73
+ }
74
+ }
75
+ return formatOperationId(maxOperationNumber + 1);
76
+ }
77
+ function isBulkOperationLock(value) {
78
+ return isBulkOperationLockImpl(value);
79
+ }
80
+ function isBulkOperationLockStale(lock, context) {
81
+ if (context.now - lock.heartbeatAt >= BULK_OPERATION_LOCK_STALE_AFTER_IN_MILLISECONDS) {
82
+ return true;
83
+ }
84
+ if (lock.host !== context.host) {
85
+ return false;
86
+ }
87
+ const wasHeartbeatBeforeBoot = context.bootedAt !== null && lock.heartbeatAt < context.bootedAt;
88
+ return wasHeartbeatBeforeBoot || context.isProcessAlive(lock.processId) === false;
89
+ }
90
+ function parseBulkOperationCommit(params) {
91
+ const match = /^OP(?<operationNumber>\d+)(?<kind>:| interrupted$)/.exec(params.subject);
92
+ if (!match) {
93
+ return null;
94
+ }
95
+ return {
96
+ date: params.date,
97
+ isInterrupted: getMandatoryNamedGroup(match, "kind") !== ":",
98
+ operationId: formatOperationId(Number(getMandatoryNamedGroup(match, "operationNumber"))),
99
+ sha: params.sha,
100
+ subject: params.subject
101
+ };
102
+ }
103
+ function parseOperationNumber(subject) {
104
+ const match = /^(?:chore: before )?OP(?<operationNumber>\d+)(?::| interrupted$|$)/.exec(subject);
105
+ return match ? Number(getMandatoryNamedGroup(match, "operationNumber")) : null;
106
+ }
107
+ function normalizeSummary(summary) {
108
+ const normalized = summary.replaceAll(/\s+/g, " ").trim();
109
+ return normalized || "bulk operation";
110
+ }
111
+ export {
112
+ BULK_OPERATION_LOCK_FILE_NAME,
113
+ BULK_OPERATION_LOCK_STALE_AFTER_IN_MILLISECONDS,
114
+ OPERATION_TRAILER_KEY,
115
+ PLUGIN_TRAILER_KEY,
116
+ buildBeforeOperationCommitSubject,
117
+ buildOperationCommitMessage,
118
+ formatOperationId,
119
+ getNextOperationId,
120
+ isBulkOperationLock,
121
+ isBulkOperationLockStale,
122
+ parseBulkOperationCommit,
123
+ parseOperationNumber
124
+ };
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWxrLW9wZXJhdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBsYXRmb3JtLW5ldXRyYWwgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogdGhlIGxlYXNlLWxvY2sgcmVjb3JkLCB0aGUgYE9QPG4+YCBpZHMgYW5kIHRoZSBjb21taXRcbiAqIG1lc3NhZ2VzIHRoYXQgY2FycnkgdGhlbS5cbiAqXG4gKiBBIGJ1bGsgb3BlcmF0aW9uIHdyYXBwZWQgYnkgYEJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnRgIGxhbmRzIGluIHRoZSB2YXVsdCdzIGdpdCByZXBvIGFzIG9uZSBjb21taXQgd2hvc2VcbiAqIHN1YmplY3QgaXMgYE9QPG4+OiA8c3VtbWFyeT5gLCBwcmVjZWRlZCAod2hlbiB0aGUgdHJlZSB3YXMgZGlydHkpIGJ5IGEgYGNob3JlOiBiZWZvcmUgT1A8bj5gIGNvbW1pdCBob2xkaW5nXG4gKiB3aGF0ZXZlciB3YXMgcGVuZGluZywgc28gYGdpdCByZXZlcnRgIG9mIHRoZSBgT1A8bj5gIGNvbW1pdCB1bmRvZXMgZXhhY3RseSB0aGF0IG9wZXJhdGlvbi4gRXZlcnl0aGluZyBpbiB0aGlzXG4gKiBtb2R1bGUgaXMgcHVyZSwgc28gaXQgaXMgc2hhcmVkIGJ5IHRoZSBkZXNrdG9wIGdpdCBsYXllciBhbmQgYnkgdGhlIHNjaGVkdWxlZCBhdXRvY29tbWl0IHRoYXQgcmVhZHMgdGhlIHNhbWUgbG9jay5cbiAqXG4gKiBUaGUgbG9jayByZWNvcmQgYW5kIHRoZSBjb21taXQgbWVzc2FnZSB0cmFpbGVycyBhcmUgYSB3aXJlIGZvcm1hdCBiZXR3ZWVuIHBsdWdpbnMgYnVpbHQgb24gZGlmZmVyZW50IGNvcGllcyBvZlxuICogdGhpcyBsaWJyYXJ5IGFuZCB0aGUgdmF1bHQgYXV0b2NvbW1pdCBzY3JpcHQ6IGZpZWxkcyBtYXkgYmUgYWRkZWQsIG5ldmVyIHJlbmFtZWQgb3IgcmVpbnRlcnByZXRlZC5cbiAqL1xuXG5pbXBvcnQgeyBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3JlZy1leHAnO1xuaW1wb3J0IHtcbiAgaXNOdW1iZXIsXG4gIGlzU3RyaW5nLFxuICBvYmplY3RUeXBlR3VhcmRcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgbGVhc2UtbG9jayBmaWxlLCBjcmVhdGVkIGluc2lkZSB0aGUgcmVwbydzIGdpdCBkaXJlY3Rvcnkgc28gaXQgaXMgbmV2ZXIgY29tbWl0dGVkIG9yXG4gKiBzeW5jZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBCVUxLX09QRVJBVElPTl9MT0NLX0ZJTEVfTkFNRSA9ICdvYnNpZGlhbi1idWxrLW9wZXJhdGlvbi5qc29uJztcblxuLyoqXG4gKiBIb3cgbG9uZyBhIGxvY2sgbWF5IGdvIHdpdGhvdXQgYSBoZWFydGJlYXQgYmVmb3JlIGl0IGNvdW50cyBhcyBzdGFsZS5cbiAqXG4gKiBJdCBlcnJzIGxvbmcgb24gcHVycG9zZTogaG9sZGluZyBhIGRlYWQgbG9jayB0b28gbG9uZyBvbmx5IG1ha2VzIGFuIGF1dG9jb21taXQgc2tpcCBhIHRpY2ssIHdoaWxlIGRlY2xhcmluZyBhXG4gKiBsaXZlIG9uZSBzdGFsZSBzcGxpdHMgaXRzIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIGNvbW1pdHMuXG4gKi9cbmV4cG9ydCBjb25zdCBCVUxLX09QRVJBVElPTl9MT0NLX1NUQUxFX0FGVEVSX0lOX01JTExJU0VDT05EUyA9IDEyMF8wMDA7XG5cbi8qKlxuICogVGhlIHRyYWlsZXIga2V5IG5hbWluZyB0aGUgb3BlcmF0aW9uIGlkIGluIGEgYnVsay1vcGVyYXRpb24gY29tbWl0IGJvZHkuXG4gKi9cbmV4cG9ydCBjb25zdCBPUEVSQVRJT05fVFJBSUxFUl9LRVkgPSAnT2JzaWRpYW4tQnVsay1PcGVyYXRpb24nO1xuXG4vKipcbiAqIFRoZSB0cmFpbGVyIGtleSBuYW1pbmcgdGhlIHBsdWdpbiBpbiBhIGJ1bGstb3BlcmF0aW9uIGNvbW1pdCBib2R5LlxuICovXG5leHBvcnQgY29uc3QgUExVR0lOX1RSQUlMRVJfS0VZID0gJ09ic2lkaWFuLVBsdWdpbic7XG5cbmNvbnN0IE9QRVJBVElPTl9JRF9QUkVGSVggPSAnT1AnO1xuXG5jb25zdCBpc0J1bGtPcGVyYXRpb25Mb2NrSW1wbCA9IG9iamVjdFR5cGVHdWFyZDxCdWxrT3BlcmF0aW9uTG9jaz4oe1xuICBoZWFydGJlYXRBdDogaXNOdW1iZXIsXG4gIGhvc3Q6IGlzU3RyaW5nLFxuICBvcGVyYXRpb25JZDogaXNTdHJpbmcsXG4gIHBsdWdpbklkOiBpc1N0cmluZyxcbiAgcHJvY2Vzc0lkOiBpc051bWJlcixcbiAgcHJvY2Vzc1N0YXJ0ZWRBdDogaXNOdW1iZXIsXG4gIHN0YXJ0ZWRBdDogaXNOdW1iZXJcbn0pO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoZSBjb21taXQgY2hhbmdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWRGaWxlQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBpbnRlcnJ1cHRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJydXB0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgcmFuIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBvcGVyYXRpb24uIElnbm9yZWQgZm9yIGFuIGludGVycnVwdGVkIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN1bW1hcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIG9wZXJhdGlvbiByYW4uXG4gICAqL1xuICByZWFkb25seSB0aW1lc3RhbXA6IERhdGU7XG59XG5cbi8qKlxuICogQSBidWxrLW9wZXJhdGlvbiBjb21taXQgZm91bmQgaW4gdGhlIHJlcG8gaGlzdG9yeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uQ29tbWl0IHtcbiAgLyoqXG4gICAqIFRoZSBjb21taXQgZGF0ZSwgYXMgYW4gSVNPIDg2MDEgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb21taXQgcmVjb3JkcyBhbiBpbnRlcnJ1cHRlZCBvcGVyYXRpb24gcmF0aGVyIHRoYW4gYSBjb21wbGV0ZWQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcnJ1cHRlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbiBpZCwgc3VjaCBhcyBgT1AxMmAuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVsbCBjb21taXQgaGFzaC5cbiAgICovXG4gIHJlYWRvbmx5IHNoYTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdWJqZWN0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGxlYXNlLWxvY2sgcmVjb3JkIHN0b3JlZCBpbiBgLmdpdC9vYnNpZGlhbi1idWxrLW9wZXJhdGlvbi5qc29uYCB3aGlsZSBhIGJ1bGsgb3BlcmF0aW9uIHJ1bnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa09wZXJhdGlvbkxvY2sge1xuICAvKipcbiAgICogV2hlbiB0aGUgbG9jayB3YXMgbGFzdCByZWZyZXNoZWQgYnkgdGhlIG9wZXJhdGlvbidzIHByb2dyZXNzLCBhcyBlcG9jaCBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBoZWFydGJlYXRBdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBuYW1lIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbiBpZCwgc3VjaCBhcyBgT1AxMmAuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHBsdWdpbiBydW5uaW5nIHRoZSBvcGVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHByb2Nlc3MgcnVubmluZyBPYnNpZGlhbi4gT25seSBhIGZhc3QgcGF0aCBmb3IgYW4gYXBwIGNyYXNoOyBzdGFsZW5lc3MgbmV2ZXIgZGVwZW5kcyBvbiBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3NJZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBwcm9jZXNzIHJ1bm5pbmcgT2JzaWRpYW4gc3RhcnRlZCwgYXMgZXBvY2ggbWlsbGlzZWNvbmRzLCBzbyBhIHJlY3ljbGVkIHByb2Nlc3MgaWQgaXMgbm90IG1pc3Rha2VuIGZvclxuICAgKiB0aGUgb3JpZ2luYWwgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc1N0YXJ0ZWRBdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBvcGVyYXRpb24gc3RhcnRlZCwgYXMgZXBvY2ggbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRlZEF0OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGZhY3RzIHtAbGluayBpc0J1bGtPcGVyYXRpb25Mb2NrU3RhbGV9IHdlaWdocyBiZXNpZGVzIHRoZSBoZWFydGJlYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa09wZXJhdGlvbkxvY2tTdGFsZW5lc3NDb250ZXh0IHtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBtYWNoaW5lIGxhc3QgYm9vdGVkLCBhcyBlcG9jaCBtaWxsaXNlY29uZHMsIG9yIGBudWxsYCB3aGVuIHVua25vd24uXG4gICAqL1xuICByZWFkb25seSBib290ZWRBdDogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgbmFtZSBvZiB0aGlzIG1hY2hpbmUuXG4gICAqL1xuICByZWFkb25seSBob3N0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHByb2Nlc3MgcmVjb3JkZWQgaW4gdGhlIGxvY2sgaXMgc3RpbGwgcnVubmluZyBvbiB0aGlzIG1hY2hpbmUsIG9yIGBudWxsYCB3aGVuIGl0IGNhbm5vdCBiZSB0b2xkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9jZXNzQWxpdmU6IChwcm9jZXNzSWQ6IG51bWJlcikgPT4gYm9vbGVhbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHRpbWUsIGFzIGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IG5vdzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBjb21taXQgbWVzc2FnZSBvZiBvbmUgYnVsay1vcGVyYXRpb24gY29tbWl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGNvbW1pdCBib2R5OiB0aGUgdGltZXN0YW1wLCB0aGUgcGx1Z2luIGFuZCB0aGUgY291bnRzLCBhcyBnaXQgdHJhaWxlcnMuXG4gICAqL1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgc3ViamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUJ1bGtPcGVyYXRpb25Db21taXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1pdCBkYXRlLCBhcyBhbiBJU08gODYwMSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBkYXRlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIGNvbW1pdCBoYXNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXQgc3ViamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN1YmplY3Qgb2YgdGhlIGNvbW1pdCB0aGF0IHNhdmVzIHdoYXRldmVyIHdhcyBwZW5kaW5nIGJlZm9yZSBhbiBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbklkIC0gVGhlIG9wZXJhdGlvbiBpZCwgc3VjaCBhcyBgT1AxMmAuXG4gKiBAcmV0dXJucyBUaGUgY29tbWl0IHN1YmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEJlZm9yZU9wZXJhdGlvbkNvbW1pdFN1YmplY3Qob3BlcmF0aW9uSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgY2hvcmU6IGJlZm9yZSAke29wZXJhdGlvbklkfWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBtZXNzYWdlIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIGEgYnVsayBvcGVyYXRpb24sIG9yIGFuIGludGVycnVwdGVkIG9uZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgY29tbWl0IHN1YmplY3QgYW5kIGJvZHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UocGFyYW1zOiBCdWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2VQYXJhbXMpOiBPcGVyYXRpb25Db21taXRNZXNzYWdlIHtcbiAgY29uc3Qgc3ViamVjdCA9IHBhcmFtcy5pc0ludGVycnVwdGVkXG4gICAgPyBgJHtwYXJhbXMub3BlcmF0aW9uSWR9IGludGVycnVwdGVkYFxuICAgIDogYCR7cGFyYW1zLm9wZXJhdGlvbklkfTogJHtub3JtYWxpemVTdW1tYXJ5KHBhcmFtcy5zdW1tYXJ5ID8/ICcnKX1gO1xuICAvLyBHaXQgdHJhaWxlcnMsIG9uZSBwZXIgbGluZSwgc28gYGdpdCBsb2cgLS1ncmVwYCBhbmQgYGdpdCBpbnRlcnByZXQtdHJhaWxlcnNgIGJvdGggcmVhZCB0aGVtLlxuICBjb25zdCBib2R5ID0gYFRpbWVzdGFtcDogJHtwYXJhbXMudGltZXN0YW1wLnRvSVNPU3RyaW5nKCl9XFxuQ2hhbmdlZC1GaWxlczogJHtTdHJpbmcocGFyYW1zLmNoYW5nZWRGaWxlQ291bnQpfVxcbmBcbiAgICArIGAke1BMVUdJTl9UUkFJTEVSX0tFWX06ICR7cGFyYW1zLnBsdWdpbklkfVxcbiR7T1BFUkFUSU9OX1RSQUlMRVJfS0VZfTogJHtwYXJhbXMub3BlcmF0aW9uSWR9YDtcbiAgcmV0dXJuIHsgYm9keSwgc3ViamVjdCB9O1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYW4gb3BlcmF0aW9uIGlkIGZyb20gaXRzIG51bWJlci5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9uTnVtYmVyIC0gVGhlIG9wZXJhdGlvbiBudW1iZXIuXG4gKiBAcmV0dXJucyBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE9wZXJhdGlvbklkKG9wZXJhdGlvbk51bWJlcjogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke09QRVJBVElPTl9JRF9QUkVGSVh9JHtTdHJpbmcob3BlcmF0aW9uTnVtYmVyKX1gO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBuZXh0IG9wZXJhdGlvbiBpZCBmcm9tIHRoZSBzdWJqZWN0cyBvZiB0aGUgYnVsay1vcGVyYXRpb24gY29tbWl0cyBhbHJlYWR5IGluIHRoZSBoaXN0b3J5LlxuICpcbiAqIEBwYXJhbSBzdWJqZWN0cyAtIENvbW1pdCBzdWJqZWN0czsgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBidWxrLW9wZXJhdGlvbiBzdWJqZWN0IGlzIGlnbm9yZWQuXG4gKiBAcmV0dXJucyBgT1A8bj5gIHdpdGggbiBvbmUgcGFzdCB0aGUgaGlnaGVzdCBudW1iZXIgZm91bmQsIG9yIGBPUDFgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRPcGVyYXRpb25JZChzdWJqZWN0czogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgbWF4T3BlcmF0aW9uTnVtYmVyID0gMDtcbiAgZm9yIChjb25zdCBzdWJqZWN0IG9mIHN1YmplY3RzKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uTnVtYmVyID0gcGFyc2VPcGVyYXRpb25OdW1iZXIoc3ViamVjdCk7XG4gICAgaWYgKG9wZXJhdGlvbk51bWJlciAhPT0gbnVsbCAmJiBvcGVyYXRpb25OdW1iZXIgPiBtYXhPcGVyYXRpb25OdW1iZXIpIHtcbiAgICAgIG1heE9wZXJhdGlvbk51bWJlciA9IG9wZXJhdGlvbk51bWJlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZvcm1hdE9wZXJhdGlvbklkKG1heE9wZXJhdGlvbk51bWJlciArIDEpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaGFzIHRoZSBzaGFwZSBvZiBhIHtAbGluayBCdWxrT3BlcmF0aW9uTG9ja30uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHJlYWQgZnJvbSB0aGUgbG9jayBmaWxlLlxuICogQHJldHVybnMgV2hldGhlciBpdCBpcyBhIGxvY2sgcmVjb3JkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCdWxrT3BlcmF0aW9uTG9jayh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJ1bGtPcGVyYXRpb25Mb2NrIHtcbiAgcmV0dXJuIGlzQnVsa09wZXJhdGlvbkxvY2tJbXBsKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgYSBsZWFzZSBsb2NrIGlzIHN0YWxlLCBzbyB3aG9ldmVyIGZpbmRzIGl0IG1heSBjb21taXQgdGhlIGxlZnRvdmVycyBhbmQgcmVtb3ZlIGl0LlxuICpcbiAqIFRoZSBoZWFydGJlYXQgaXMgdGhlIHJ1bGU7IHRoZSByZWJvb3QgYW5kIGNyYXNoZWQtcHJvY2VzcyBjaGVja3MgYXJlIG9ubHkgZmFzdCBwYXRocyB0aGF0IHNob3J0ZW4gdGhlIHdhaXQsIGFuZFxuICogbmVpdGhlciBjYW4gbWFrZSBhIGxvY2sgd2l0aCBhIGZyZXNoIGhlYXJ0YmVhdCBvbiBhbm90aGVyIG1hY2hpbmUgc3RhbGUuXG4gKlxuICogQHBhcmFtIGxvY2sgLSBUaGUgbG9jayByZWNvcmQuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBmYWN0cyBhYm91dCB0aGlzIG1hY2hpbmUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsb2NrIGlzIHN0YWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCdWxrT3BlcmF0aW9uTG9ja1N0YWxlKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrLCBjb250ZXh0OiBCdWxrT3BlcmF0aW9uTG9ja1N0YWxlbmVzc0NvbnRleHQpOiBib29sZWFuIHtcbiAgaWYgKGNvbnRleHQubm93IC0gbG9jay5oZWFydGJlYXRBdCA+PSBCVUxLX09QRVJBVElPTl9MT0NLX1NUQUxFX0FGVEVSX0lOX01JTExJU0VDT05EUykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGxvY2suaG9zdCAhPT0gY29udGV4dC5ob3N0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgd2FzSGVhcnRiZWF0QmVmb3JlQm9vdCA9IGNvbnRleHQuYm9vdGVkQXQgIT09IG51bGwgJiYgbG9jay5oZWFydGJlYXRBdCA8IGNvbnRleHQuYm9vdGVkQXQ7XG4gIHJldHVybiB3YXNIZWFydGJlYXRCZWZvcmVCb290IHx8IGNvbnRleHQuaXNQcm9jZXNzQWxpdmUobG9jay5wcm9jZXNzSWQpID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBidWxrLW9wZXJhdGlvbiBjb21taXQgc3ViamVjdCBpbnRvIHRoZSBjb21taXQgaXQgZGVzY3JpYmVzLCBza2lwcGluZyB0aGUgYGNob3JlOiBiZWZvcmVgIGNvbW1pdHMsIHdoaWNoXG4gKiBhcmUgbm90IG9wZXJhdGlvbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb21taXQncyBoYXNoLCBkYXRlIGFuZCBzdWJqZWN0LlxuICogQHJldHVybnMgVGhlIGJ1bGstb3BlcmF0aW9uIGNvbW1pdCwgb3IgYG51bGxgIHdoZW4gdGhlIHN1YmplY3QgaXMgbm90IG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQnVsa09wZXJhdGlvbkNvbW1pdChwYXJhbXM6IFBhcnNlQnVsa09wZXJhdGlvbkNvbW1pdFBhcmFtcyk6IEJ1bGtPcGVyYXRpb25Db21taXQgfCBudWxsIHtcbiAgY29uc3QgbWF0Y2ggPSAvXk9QKD88b3BlcmF0aW9uTnVtYmVyPlxcZCspKD88a2luZD46fCBpbnRlcnJ1cHRlZCQpLy5leGVjKHBhcmFtcy5zdWJqZWN0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGF0ZTogcGFyYW1zLmRhdGUsXG4gICAgaXNJbnRlcnJ1cHRlZDogZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2tpbmQnKSAhPT0gJzonLFxuICAgIG9wZXJhdGlvbklkOiBmb3JtYXRPcGVyYXRpb25JZChOdW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ29wZXJhdGlvbk51bWJlcicpKSksXG4gICAgc2hhOiBwYXJhbXMuc2hhLFxuICAgIHN1YmplY3Q6IHBhcmFtcy5zdWJqZWN0XG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBvcGVyYXRpb24gbnVtYmVyIG91dCBvZiBhIGJ1bGstb3BlcmF0aW9uIGNvbW1pdCBzdWJqZWN0LlxuICpcbiAqIFJlY29nbml6ZXMgYE9QPG4+OiA8c3VtbWFyeT5gLCBgT1A8bj4gaW50ZXJydXB0ZWRgIGFuZCBgY2hvcmU6IGJlZm9yZSBPUDxuPmAuXG4gKlxuICogQHBhcmFtIHN1YmplY3QgLSBUaGUgY29tbWl0IHN1YmplY3QuXG4gKiBAcmV0dXJucyBUaGUgb3BlcmF0aW9uIG51bWJlciwgb3IgYG51bGxgIHdoZW4gdGhlIHN1YmplY3QgaXMgbm90IGEgYnVsay1vcGVyYXRpb24gc3ViamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3BlcmF0aW9uTnVtYmVyKHN1YmplY3Q6IHN0cmluZyk6IG51bGwgfCBudW1iZXIge1xuICBjb25zdCBtYXRjaCA9IC9eKD86Y2hvcmU6IGJlZm9yZSApP09QKD88b3BlcmF0aW9uTnVtYmVyPlxcZCspKD86OnwgaW50ZXJydXB0ZWQkfCQpLy5leGVjKHN1YmplY3QpO1xuICByZXR1cm4gbWF0Y2ggPyBOdW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ29wZXJhdGlvbk51bWJlcicpKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN1bW1hcnkoc3VtbWFyeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHN1bW1hcnkucmVwbGFjZUFsbCgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgfHwgJ2J1bGsgb3BlcmF0aW9uJztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQSxTQUFTLDhC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
@@ -8,4 +8,5 @@ export * as 'folder-command-handler' from './folder-command-handler.mjs';
8
8
  export * as 'global-command-handler' from './global-command-handler.mjs';
9
9
  export * as 'open-demo-vault-command-handler' from './open-demo-vault-command-handler.mjs';
10
10
  export * as 'open-settings-command-handler' from './open-settings-command-handler.mjs';
11
+ export * as 'undo-bulk-operation-command-handler' from './undo-bulk-operation-command-handler.mjs';
11
12
  export * as 'unlock-active-note-command-handler' from './unlock-active-note-command-handler.mjs';
@@ -12,6 +12,7 @@ import * as folder_command_handler from "./folder-command-handler.mjs";
12
12
  import * as global_command_handler from "./global-command-handler.mjs";
13
13
  import * as open_demo_vault_command_handler from "./open-demo-vault-command-handler.mjs";
14
14
  import * as open_settings_command_handler from "./open-settings-command-handler.mjs";
15
+ import * as undo_bulk_operation_command_handler from "./undo-bulk-operation-command-handler.mjs";
15
16
  import * as unlock_active_note_command_handler from "./unlock-active-note-command-handler.mjs";
16
17
  export {
17
18
  abstract_file_command_handler as "abstract-file-command-handler",
@@ -23,6 +24,7 @@ export {
23
24
  global_command_handler as "global-command-handler",
24
25
  open_demo_vault_command_handler as "open-demo-vault-command-handler",
25
26
  open_settings_command_handler as "open-settings-command-handler",
27
+ undo_bulk_operation_command_handler as "undo-bulk-operation-command-handler",
26
28
  unlock_active_note_command_handler as "unlock-active-note-command-handler"
27
29
  };
28
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmQtaGFuZGxlcnMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJzdHJhY3QtZmlsZS1jb21tYW5kLWhhbmRsZXInIGZyb20gJy4vYWJzdHJhY3QtZmlsZS1jb21tYW5kLWhhbmRsZXIudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1hbmQtaGFuZGxlci1jb21wb25lbnQnIGZyb20gJy4vY29tbWFuZC1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnY29tbWFuZC1oYW5kbGVyJyBmcm9tICcuL2NvbW1hbmQtaGFuZGxlci50cyc7XG5leHBvcnQgKiBhcyAnZWRpdG9yLWNvbW1hbmQtaGFuZGxlcicgZnJvbSAnLi9lZGl0b3ItY29tbWFuZC1oYW5kbGVyLnRzJztcbmV4cG9ydCAqIGFzICdmaWxlLWNvbW1hbmQtaGFuZGxlcicgZnJvbSAnLi9maWxlLWNvbW1hbmQtaGFuZGxlci50cyc7XG5leHBvcnQgKiBhcyAnZm9sZGVyLWNvbW1hbmQtaGFuZGxlcicgZnJvbSAnLi9mb2xkZXItY29tbWFuZC1oYW5kbGVyLnRzJztcbmV4cG9ydCAqIGFzICdnbG9iYWwtY29tbWFuZC1oYW5kbGVyJyBmcm9tICcuL2dsb2JhbC1jb21tYW5kLWhhbmRsZXIudHMnO1xuZXhwb3J0ICogYXMgJ29wZW4tZGVtby12YXVsdC1jb21tYW5kLWhhbmRsZXInIGZyb20gJy4vb3Blbi1kZW1vLXZhdWx0LWNvbW1hbmQtaGFuZGxlci50cyc7XG5leHBvcnQgKiBhcyAnb3Blbi1zZXR0aW5ncy1jb21tYW5kLWhhbmRsZXInIGZyb20gJy4vb3Blbi1zZXR0aW5ncy1jb21tYW5kLWhhbmRsZXIudHMnO1xuZXhwb3J0ICogYXMgJ3VubG9jay1hY3RpdmUtbm90ZS1jb21tYW5kLWhhbmRsZXInIGZyb20gJy4vdW5sb2NrLWFjdGl2ZS1ub3RlLWNvbW1hbmQtaGFuZGxlci50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQUVBLFlBQVlBLG1DQUFxQztBQUNqRCxZQUFZQywrQkFBaUM7QUFDN0MsWUFBWUMscUJBQXVCO0FBQ25DLFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQywwQkFBNEI7QUFDeEMsWUFBWUMsNEJBQThCO0FBQzFDLFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQyxxQ0FBdUM7QUFDbkQsWUFBWUMsbUNBQXFDO0FBQ2pELFlBQVlDLHdDQUEwQzsiLAogICJuYW1lcyI6IFsiYWJzdHJhY3QtZmlsZS1jb21tYW5kLWhhbmRsZXIiLCAiY29tbWFuZC1oYW5kbGVyLWNvbXBvbmVudCIsICJjb21tYW5kLWhhbmRsZXIiLCAiZWRpdG9yLWNvbW1hbmQtaGFuZGxlciIsICJmaWxlLWNvbW1hbmQtaGFuZGxlciIsICJmb2xkZXItY29tbWFuZC1oYW5kbGVyIiwgImdsb2JhbC1jb21tYW5kLWhhbmRsZXIiLCAib3Blbi1kZW1vLXZhdWx0LWNvbW1hbmQtaGFuZGxlciIsICJvcGVuLXNldHRpbmdzLWNvbW1hbmQtaGFuZGxlciIsICJ1bmxvY2stYWN0aXZlLW5vdGUtY29tbWFuZC1oYW5kbGVyIl0KfQo=
30
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmQtaGFuZGxlcnMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJzdHJhY3QtZmlsZS1jb21tYW5kLWhhbmRsZXInIGZyb20gJy4vYWJzdHJhY3QtZmlsZS1jb21tYW5kLWhhbmRsZXIudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1hbmQtaGFuZGxlci1jb21wb25lbnQnIGZyb20gJy4vY29tbWFuZC1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnY29tbWFuZC1oYW5kbGVyJyBmcm9tICcuL2NvbW1hbmQtaGFuZGxlci50cyc7XG5leHBvcnQgKiBhcyAnZWRpdG9yLWNvbW1hbmQtaGFuZGxlcicgZnJvbSAnLi9lZGl0b3ItY29tbWFuZC1oYW5kbGVyLnRzJztcbmV4cG9ydCAqIGFzICdmaWxlLWNvbW1hbmQtaGFuZGxlcicgZnJvbSAnLi9maWxlLWNvbW1hbmQtaGFuZGxlci50cyc7XG5leHBvcnQgKiBhcyAnZm9sZGVyLWNvbW1hbmQtaGFuZGxlcicgZnJvbSAnLi9mb2xkZXItY29tbWFuZC1oYW5kbGVyLnRzJztcbmV4cG9ydCAqIGFzICdnbG9iYWwtY29tbWFuZC1oYW5kbGVyJyBmcm9tICcuL2dsb2JhbC1jb21tYW5kLWhhbmRsZXIudHMnO1xuZXhwb3J0ICogYXMgJ29wZW4tZGVtby12YXVsdC1jb21tYW5kLWhhbmRsZXInIGZyb20gJy4vb3Blbi1kZW1vLXZhdWx0LWNvbW1hbmQtaGFuZGxlci50cyc7XG5leHBvcnQgKiBhcyAnb3Blbi1zZXR0aW5ncy1jb21tYW5kLWhhbmRsZXInIGZyb20gJy4vb3Blbi1zZXR0aW5ncy1jb21tYW5kLWhhbmRsZXIudHMnO1xuZXhwb3J0ICogYXMgJ3VuZG8tYnVsay1vcGVyYXRpb24tY29tbWFuZC1oYW5kbGVyJyBmcm9tICcuL3VuZG8tYnVsay1vcGVyYXRpb24tY29tbWFuZC1oYW5kbGVyLnRzJztcbmV4cG9ydCAqIGFzICd1bmxvY2stYWN0aXZlLW5vdGUtY29tbWFuZC1oYW5kbGVyJyBmcm9tICcuL3VubG9jay1hY3RpdmUtbm90ZS1jb21tYW5kLWhhbmRsZXIudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSxtQ0FBcUM7QUFDakQsWUFBWUMsK0JBQWlDO0FBQzdDLFlBQVlDLHFCQUF1QjtBQUNuQyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMscUNBQXVDO0FBQ25ELFlBQVlDLG1DQUFxQztBQUNqRCxZQUFZQyx5Q0FBMkM7QUFDdkQsWUFBWUMsd0NBQTBDOyIsCiAgIm5hbWVzIjogWyJhYnN0cmFjdC1maWxlLWNvbW1hbmQtaGFuZGxlciIsICJjb21tYW5kLWhhbmRsZXItY29tcG9uZW50IiwgImNvbW1hbmQtaGFuZGxlciIsICJlZGl0b3ItY29tbWFuZC1oYW5kbGVyIiwgImZpbGUtY29tbWFuZC1oYW5kbGVyIiwgImZvbGRlci1jb21tYW5kLWhhbmRsZXIiLCAiZ2xvYmFsLWNvbW1hbmQtaGFuZGxlciIsICJvcGVuLWRlbW8tdmF1bHQtY29tbWFuZC1oYW5kbGVyIiwgIm9wZW4tc2V0dGluZ3MtY29tbWFuZC1oYW5kbGVyIiwgInVuZG8tYnVsay1vcGVyYXRpb24tY29tbWFuZC1oYW5kbGVyIiwgInVubG9jay1hY3RpdmUtbm90ZS1jb21tYW5kLWhhbmRsZXIiXQp9Cg==
@@ -0,0 +1,51 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Handles the "Undo a bulk operation..." command.
6
+ */
7
+ import type { BulkOperationCommitComponent } from '../components/bulk-operation-commit-component.mjs';
8
+ import { GlobalCommandHandler } from './global-command-handler.mjs';
9
+ /**
10
+ * Constructor parameters for {@link UndoBulkOperationCommandHandler}.
11
+ */
12
+ export interface UndoBulkOperationCommandHandlerConstructorParams {
13
+ /**
14
+ * The component that commits the plugin's bulk operations.
15
+ */
16
+ readonly bulkOperationCommitComponent: BulkOperationCommitComponent;
17
+ /**
18
+ * Whether the plugin's opt-in setting for bulk-operation commits is on. The command is hidden while it is off.
19
+ */
20
+ readonly isEnabled: () => boolean;
21
+ }
22
+ /**
23
+ * A command handler that lists the plugin's bulk operations recorded in the vault repository and reverts the one
24
+ * the user picks. Available only on desktop, while the plugin's bulk-operation commits are enabled.
25
+ */
26
+ export declare class UndoBulkOperationCommandHandler extends GlobalCommandHandler {
27
+ /**
28
+ * The component that commits the plugin's bulk operations.
29
+ */
30
+ protected readonly bulkOperationCommitComponent: BulkOperationCommitComponent;
31
+ /**
32
+ * Whether the plugin's opt-in setting for bulk-operation commits is on.
33
+ */
34
+ protected readonly isEnabled: () => boolean;
35
+ /**
36
+ * Creates a new instance.
37
+ *
38
+ * @param params - Constructor parameters.
39
+ */
40
+ constructor(params: UndoBulkOperationCommandHandlerConstructorParams);
41
+ /**
42
+ * Executes the command, letting the user pick a bulk operation to revert.
43
+ */
44
+ execute(): Promise<void>;
45
+ /**
46
+ * Checks whether the command can currently execute: on desktop, with bulk-operation commits enabled.
47
+ *
48
+ * @returns Whether the command can execute.
49
+ */
50
+ protected canExecute(): boolean;
51
+ }
@@ -0,0 +1,76 @@
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 { Platform } from "obsidian";
34
+ import { GlobalCommandHandler } from "./global-command-handler.mjs";
35
+ class UndoBulkOperationCommandHandler extends GlobalCommandHandler {
36
+ /**
37
+ * The component that commits the plugin's bulk operations.
38
+ */
39
+ bulkOperationCommitComponent;
40
+ /**
41
+ * Whether the plugin's opt-in setting for bulk-operation commits is on.
42
+ */
43
+ isEnabled;
44
+ /**
45
+ * Creates a new instance.
46
+ *
47
+ * @param params - Constructor parameters.
48
+ */
49
+ constructor(params) {
50
+ super({
51
+ icon: "undo-2",
52
+ id: "undo-bulk-operation",
53
+ name: "Undo a bulk operation..."
54
+ });
55
+ this.bulkOperationCommitComponent = params.bulkOperationCommitComponent;
56
+ this.isEnabled = params.isEnabled;
57
+ }
58
+ /**
59
+ * Executes the command, letting the user pick a bulk operation to revert.
60
+ */
61
+ async execute() {
62
+ await this.bulkOperationCommitComponent.undoBulkOperation();
63
+ }
64
+ /**
65
+ * Checks whether the command can currently execute: on desktop, with bulk-operation commits enabled.
66
+ *
67
+ * @returns Whether the command can execute.
68
+ */
69
+ canExecute() {
70
+ return Platform.isDesktopApp && this.isEnabled();
71
+ }
72
+ }
73
+ export {
74
+ UndoBulkOperationCommandHandler
75
+ };
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tYW5kLWhhbmRsZXJzL3VuZG8tYnVsay1vcGVyYXRpb24tY29tbWFuZC1oYW5kbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIYW5kbGVzIHRoZSBcIlVuZG8gYSBidWxrIG9wZXJhdGlvbi4uLlwiIGNvbW1hbmQuXG4gKi9cblxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYnVsay1vcGVyYXRpb24tY29tbWl0LWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IEdsb2JhbENvbW1hbmRIYW5kbGVyIH0gZnJvbSAnLi9nbG9iYWwtY29tbWFuZC1oYW5kbGVyLnRzJztcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgVW5kb0J1bGtPcGVyYXRpb25Db21tYW5kSGFuZGxlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5kb0J1bGtPcGVyYXRpb25Db21tYW5kSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdGhhdCBjb21taXRzIHRoZSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBidWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50OiBCdWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4ncyBvcHQtaW4gc2V0dGluZyBmb3IgYnVsay1vcGVyYXRpb24gY29tbWl0cyBpcyBvbi4gVGhlIGNvbW1hbmQgaXMgaGlkZGVuIHdoaWxlIGl0IGlzIG9mZi5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogKCkgPT4gYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGNvbW1hbmQgaGFuZGxlciB0aGF0IGxpc3RzIHRoZSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMgcmVjb3JkZWQgaW4gdGhlIHZhdWx0IHJlcG9zaXRvcnkgYW5kIHJldmVydHMgdGhlIG9uZVxuICogdGhlIHVzZXIgcGlja3MuIEF2YWlsYWJsZSBvbmx5IG9uIGRlc2t0b3AsIHdoaWxlIHRoZSBwbHVnaW4ncyBidWxrLW9wZXJhdGlvbiBjb21taXRzIGFyZSBlbmFibGVkLlxuICovXG5leHBvcnQgY2xhc3MgVW5kb0J1bGtPcGVyYXRpb25Db21tYW5kSGFuZGxlciBleHRlbmRzIEdsb2JhbENvbW1hbmRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdGhhdCBjb21taXRzIHRoZSBwbHVnaW4ncyBidWxrIG9wZXJhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudDogQnVsa09wZXJhdGlvbkNvbW1pdENvbXBvbmVudDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luJ3Mgb3B0LWluIHNldHRpbmcgZm9yIGJ1bGstb3BlcmF0aW9uIGNvbW1pdHMgaXMgb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNFbmFibGVkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQ29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFVuZG9CdWxrT3BlcmF0aW9uQ29tbWFuZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHtcbiAgICAgIGljb246ICd1bmRvLTInLFxuICAgICAgaWQ6ICd1bmRvLWJ1bGstb3BlcmF0aW9uJyxcbiAgICAgIG5hbWU6ICdVbmRvIGEgYnVsayBvcGVyYXRpb24uLi4nXG4gICAgfSk7XG4gICAgdGhpcy5idWxrT3BlcmF0aW9uQ29tbWl0Q29tcG9uZW50ID0gcGFyYW1zLmJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQ7XG4gICAgdGhpcy5pc0VuYWJsZWQgPSBwYXJhbXMuaXNFbmFibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kLCBsZXR0aW5nIHRoZSB1c2VyIHBpY2sgYSBidWxrIG9wZXJhdGlvbiB0byByZXZlcnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmJ1bGtPcGVyYXRpb25Db21taXRDb21wb25lbnQudW5kb0J1bGtPcGVyYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY29tbWFuZCBjYW4gY3VycmVudGx5IGV4ZWN1dGU6IG9uIGRlc2t0b3AsIHdpdGggYnVsay1vcGVyYXRpb24gY29tbWl0cyBlbmFibGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjb21tYW5kIGNhbiBleGVjdXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNhbkV4ZWN1dGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFBsYXRmb3JtLmlzRGVza3RvcEFwcCAmJiB0aGlzLmlzRW5hYmxlZCgpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsU0FBUyxnQkFBZ0I7QUFJekIsU0FBUyw0QkFBNEI7QUFxQjlCLE1BQU0sd0NBQXdDLHFCQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXJEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9aLFlBQVksUUFBMEQ7QUFDM0UsVUFBTTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLElBQ1IsQ0FBQztBQUNELFNBQUssK0JBQStCLE9BQU87QUFDM0MsU0FBSyxZQUFZLE9BQU87QUFBQSxFQUMxQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsTUFBc0IsVUFBeUI7QUFDN0MsVUFBTSxLQUFLLDZCQUE2QixrQkFBa0I7QUFBQSxFQUM1RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9tQixhQUFzQjtBQUN2QyxXQUFPLFNBQVMsZ0JBQWdCLEtBQUssVUFBVTtBQUFBLEVBQ2pEO0FBQ0Y7IiwibmFtZXMiOltdfQ==