@mnaoumov/obsidian-lib 6.2.1 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/file-explorer-root-menu-component/package.json +6 -0
- package/data-stores/data-store-replica/package.json +6 -0
- package/data-stores/data-store-seeds/package.json +6 -0
- package/data-stores/data-store-transport/package.json +6 -0
- package/data-stores/index/package.json +6 -0
- package/data-stores/local-data-store/package.json +6 -0
- package/data-stores/package.json +6 -0
- package/data-stores/shared-data-store/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +29 -1
- package/dist/lib/cjs/__merged.d.cts +6 -0
- package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +343 -0
- package/dist/lib/cjs/components/file-explorer-root-menu-component.d.cts +125 -0
- package/dist/lib/cjs/components/index.cjs +4 -1
- package/dist/lib/cjs/components/index.d.cts +1 -0
- package/dist/lib/cjs/data-stores/data-store-replica.cjs +263 -0
- package/dist/lib/cjs/data-stores/data-store-replica.d.cts +112 -0
- package/dist/lib/cjs/data-stores/data-store-seeds.cjs +204 -0
- package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +133 -0
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +347 -0
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +125 -0
- package/dist/lib/cjs/data-stores/index.cjs +120 -0
- package/dist/lib/cjs/data-stores/index.d.cts +6 -0
- package/dist/lib/cjs/data-stores/local-data-store.cjs +258 -0
- package/dist/lib/cjs/data-stores/local-data-store.d.cts +119 -0
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +431 -0
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +137 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/esm/__merged.d.mts +6 -0
- package/dist/lib/esm/__merged.mjs +29 -1
- package/dist/lib/esm/components/file-explorer-root-menu-component.d.mts +125 -0
- package/dist/lib/esm/components/file-explorer-root-menu-component.mjs +257 -0
- package/dist/lib/esm/components/index.d.mts +1 -0
- package/dist/lib/esm/components/index.mjs +3 -1
- package/dist/lib/esm/data-stores/data-store-replica.d.mts +112 -0
- package/dist/lib/esm/data-stores/data-store-replica.mjs +173 -0
- package/dist/lib/esm/data-stores/data-store-seeds.d.mts +133 -0
- package/dist/lib/esm/data-stores/data-store-seeds.mjs +115 -0
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +125 -0
- package/dist/lib/esm/data-stores/data-store-transport.mjs +259 -0
- package/dist/lib/esm/data-stores/index.d.mts +6 -0
- package/dist/lib/esm/data-stores/index.mjs +18 -0
- package/dist/lib/esm/data-stores/local-data-store.d.mts +119 -0
- package/dist/lib/esm/data-stores/local-data-store.mjs +170 -0
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +137 -0
- package/dist/lib/esm/data-stores/shared-data-store.mjs +346 -0
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/package.json +38 -17
|
@@ -0,0 +1,263 @@
|
|
|
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 patchObsidianRequire() {
|
|
6
|
+
const originalRequire = require;
|
|
7
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
require = Object.assign(
|
|
11
|
+
(id) => requirePatched(id),
|
|
12
|
+
originalRequire,
|
|
13
|
+
{
|
|
14
|
+
__isPatched: true
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
function extractDefault(module) {
|
|
18
|
+
return module && module.__esModule && "default" in module ? module.default : module;
|
|
19
|
+
}
|
|
20
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
21
|
+
"@codemirror/autocomplete",
|
|
22
|
+
"@codemirror/collab",
|
|
23
|
+
"@codemirror/commands",
|
|
24
|
+
"@codemirror/language",
|
|
25
|
+
"@codemirror/lint",
|
|
26
|
+
"@codemirror/search",
|
|
27
|
+
"@codemirror/state",
|
|
28
|
+
"@codemirror/text",
|
|
29
|
+
"@codemirror/view",
|
|
30
|
+
"@lezer/common",
|
|
31
|
+
"@lezer/highlight",
|
|
32
|
+
"@lezer/lr",
|
|
33
|
+
"obsidian"
|
|
34
|
+
]);
|
|
35
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
36
|
+
"@codemirror/closebrackets",
|
|
37
|
+
"@codemirror/comment",
|
|
38
|
+
"@codemirror/fold",
|
|
39
|
+
"@codemirror/gutter",
|
|
40
|
+
"@codemirror/highlight",
|
|
41
|
+
"@codemirror/history",
|
|
42
|
+
"@codemirror/matchbrackets",
|
|
43
|
+
"@codemirror/panel",
|
|
44
|
+
"@codemirror/rangeset",
|
|
45
|
+
"@codemirror/rectangular-selection",
|
|
46
|
+
"@codemirror/stream-parser",
|
|
47
|
+
"@codemirror/tooltip"
|
|
48
|
+
]);
|
|
49
|
+
function requirePatched(id) {
|
|
50
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
51
|
+
return originalRequire?.(id);
|
|
52
|
+
}
|
|
53
|
+
const app = globalThis.app;
|
|
54
|
+
if (app?.isMobile) {
|
|
55
|
+
if (id === "process" || id === "node:process") {
|
|
56
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
57
|
+
return process;
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
const module = originalRequire?.(id);
|
|
61
|
+
if (module) {
|
|
62
|
+
return extractDefault(module);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
})();
|
|
69
|
+
|
|
70
|
+
"use strict";
|
|
71
|
+
var __defProp = Object.defineProperty;
|
|
72
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
73
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
74
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
75
|
+
var __export = (target, all) => {
|
|
76
|
+
for (var name in all)
|
|
77
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
78
|
+
};
|
|
79
|
+
var __copyProps = (to, from, except, desc) => {
|
|
80
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
81
|
+
for (let key of __getOwnPropNames(from))
|
|
82
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
83
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
84
|
+
}
|
|
85
|
+
return to;
|
|
86
|
+
};
|
|
87
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
88
|
+
var data_store_replica_exports = {};
|
|
89
|
+
__export(data_store_replica_exports, {
|
|
90
|
+
DataStoreReplica: () => DataStoreReplica,
|
|
91
|
+
isDataStoreJsonValue: () => isDataStoreJsonValue,
|
|
92
|
+
isDataStoreOperation: () => isDataStoreOperation
|
|
93
|
+
});
|
|
94
|
+
module.exports = __toCommonJS(data_store_replica_exports);
|
|
95
|
+
class DataStoreReplica {
|
|
96
|
+
/**
|
|
97
|
+
* Creates an empty replica.
|
|
98
|
+
*
|
|
99
|
+
* @param kind - Immutable merge rule for the store.
|
|
100
|
+
*/
|
|
101
|
+
constructor(kind) {
|
|
102
|
+
this.kind = kind;
|
|
103
|
+
}
|
|
104
|
+
kind;
|
|
105
|
+
additions = /* @__PURE__ */ new Map();
|
|
106
|
+
registers = /* @__PURE__ */ new Map();
|
|
107
|
+
removals = /* @__PURE__ */ new Map();
|
|
108
|
+
/**
|
|
109
|
+
* Validates and joins one journal or snapshot operation.
|
|
110
|
+
*
|
|
111
|
+
* @param value - Untrusted parsed operation.
|
|
112
|
+
*/
|
|
113
|
+
apply(value) {
|
|
114
|
+
if (!isDataStoreOperation(value)) {
|
|
115
|
+
throw new Error("Invalid data-store operation");
|
|
116
|
+
}
|
|
117
|
+
const operation = window.structuredClone(value);
|
|
118
|
+
if (this.kind === "observed-remove-set") {
|
|
119
|
+
this.applySet(operation);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const previous = this.registers.get(operation.key);
|
|
123
|
+
if (this.kind !== "last-write-wins" && (operation.deleted || rankOf(operation.value) === void 0)) {
|
|
124
|
+
throw new Error("Min/max stores accept finite numbers or ranked JSON values and do not support deletion");
|
|
125
|
+
}
|
|
126
|
+
if (!previous || this.wins(operation, previous)) {
|
|
127
|
+
this.registers.set(operation.key, operation);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Reads visible records, detached from internal state.
|
|
132
|
+
*
|
|
133
|
+
* @returns Pairs in deterministic key order.
|
|
134
|
+
*/
|
|
135
|
+
entries() {
|
|
136
|
+
if (this.kind === "observed-remove-set") {
|
|
137
|
+
const keys = new Set(this.activeAdditions().map((operation) => operation.key));
|
|
138
|
+
return [...keys].sort().map((key) => [key, true]);
|
|
139
|
+
}
|
|
140
|
+
return [...this.registers.values()].filter((operation) => !operation.deleted).sort((first, second) => first.key.localeCompare(second.key)).map((operation) => [operation.key, window.structuredClone(operation.value)]);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Exports mergeable state, retaining tombstones for late or retired replicas.
|
|
144
|
+
*
|
|
145
|
+
* @returns Deterministically ordered operations sufficient to reconstruct this state.
|
|
146
|
+
*/
|
|
147
|
+
export() {
|
|
148
|
+
return [...this.registers.values(), ...this.activeAdditions(), ...this.removals.values()].sort((first, second) => tag(first).localeCompare(tag(second))).map((operation) => window.structuredClone(operation));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Reads a register or set membership without enumerating register keys.
|
|
152
|
+
*
|
|
153
|
+
* @param key - Record key or set member.
|
|
154
|
+
* @returns A detached value, or `undefined` when absent or deleted.
|
|
155
|
+
*/
|
|
156
|
+
get(key) {
|
|
157
|
+
if (this.kind === "observed-remove-set") {
|
|
158
|
+
return this.activeAdditions().some((operation2) => operation2.key === key) || void 0;
|
|
159
|
+
}
|
|
160
|
+
const operation = this.registers.get(key);
|
|
161
|
+
return operation && !operation.deleted ? window.structuredClone(operation.value) : void 0;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Finds additions observed for a set member, for an observed removal.
|
|
165
|
+
*
|
|
166
|
+
* @param key - Set member.
|
|
167
|
+
* @returns Addition identities. Concurrent unseen additions survive removal.
|
|
168
|
+
*/
|
|
169
|
+
observedTags(key) {
|
|
170
|
+
return [...this.additions.values()].filter((operation) => operation.key === key).map((operation) => tag(operation)).sort();
|
|
171
|
+
}
|
|
172
|
+
activeAdditions() {
|
|
173
|
+
return [...this.additions.values()].filter((operation) => {
|
|
174
|
+
const removed = tagVector(this.removals.get(operation.key)?.tags ?? []);
|
|
175
|
+
return operation.sequence > (removed.get(operation.device) ?? 0);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
applySet(operation) {
|
|
179
|
+
if (operation.deleted) {
|
|
180
|
+
const previous = this.removals.get(operation.key);
|
|
181
|
+
const vector = tagVector([...previous?.tags ?? [], ...operation.tags ?? []]);
|
|
182
|
+
const winner = previous && this.wins(previous, operation) ? previous : operation;
|
|
183
|
+
this.removals.set(operation.key, { ...winner, tags: [...vector].sort(([first], [second]) => first.localeCompare(second)).map(([device, sequence]) => `${device}:${String(sequence)}`) });
|
|
184
|
+
} else {
|
|
185
|
+
if (operation.value !== true) {
|
|
186
|
+
throw new Error("Set additions use true as their value");
|
|
187
|
+
}
|
|
188
|
+
const key = `${operation.key}:${operation.device}`;
|
|
189
|
+
const previous = this.additions.get(key);
|
|
190
|
+
if (!previous || operation.sequence > previous.sequence) {
|
|
191
|
+
this.additions.set(key, operation);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
wins(next, previous) {
|
|
196
|
+
const nextRank = rankOf(next.value);
|
|
197
|
+
const previousRank = rankOf(previous.value);
|
|
198
|
+
if (this.kind === "minimum" && nextRank !== previousRank) {
|
|
199
|
+
return Number(nextRank) < Number(previousRank);
|
|
200
|
+
}
|
|
201
|
+
return this.kind === "maximum" && nextRank !== previousRank ? Number(nextRank) > Number(previousRank) : next.time > previous.time || next.time === previous.time && (next.counter > previous.counter || next.counter === previous.counter && next.device > previous.device);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function isDataStoreJsonValue(value) {
|
|
205
|
+
return isJsonValue(value, /* @__PURE__ */ new Set());
|
|
206
|
+
}
|
|
207
|
+
function isDataStoreOperation(value) {
|
|
208
|
+
return typeof value === "object" && value !== null && "key" in value && typeof value.key === "string" && "device" in value && typeof value.device === "string" && /^[\w-]+$/.test(value.device) && "sequence" in value && isPositiveInteger(value.sequence) && "time" in value && isNonNegativeInteger(value.time) && "counter" in value && isNonNegativeInteger(value.counter) && "deleted" in value && typeof value.deleted === "boolean" && "value" in value && isDataStoreJsonValue(value.value) && (!("tags" in value) || Array.isArray(value.tags) && value.tags.every((item) => typeof item === "string"));
|
|
209
|
+
}
|
|
210
|
+
function isJsonValue(value, ancestors) {
|
|
211
|
+
if (value === null || typeof value === "string" || typeof value === "boolean") {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
if (typeof value === "number") {
|
|
215
|
+
return Number.isFinite(value);
|
|
216
|
+
}
|
|
217
|
+
if (typeof value !== "object" || ancestors.has(value)) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
if (!Array.isArray(value) && Object.prototype.toString.call(value) !== "[object Object]") {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
ancestors.add(value);
|
|
224
|
+
const values = Array.isArray(value) ? [...value] : Object.values(value);
|
|
225
|
+
const isValid = values.every((child) => isJsonValue(child, ancestors));
|
|
226
|
+
ancestors.delete(value);
|
|
227
|
+
return isValid;
|
|
228
|
+
}
|
|
229
|
+
function isNonNegativeInteger(value) {
|
|
230
|
+
return Number.isSafeInteger(value) && Number(value) >= 0;
|
|
231
|
+
}
|
|
232
|
+
function isPositiveInteger(value) {
|
|
233
|
+
return Number.isSafeInteger(value) && Number(value) > 0;
|
|
234
|
+
}
|
|
235
|
+
function rankOf(value) {
|
|
236
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
237
|
+
return value;
|
|
238
|
+
}
|
|
239
|
+
return typeof value === "object" && value !== null && "rank" in value && "value" in value && typeof value.rank === "number" && Number.isFinite(value.rank) ? value.rank : void 0;
|
|
240
|
+
}
|
|
241
|
+
function tag(operation) {
|
|
242
|
+
return `${operation.device}:${String(operation.sequence)}`;
|
|
243
|
+
}
|
|
244
|
+
function tagVector(tags) {
|
|
245
|
+
const vector = /* @__PURE__ */ new Map();
|
|
246
|
+
for (const value of tags) {
|
|
247
|
+
const separator = value.lastIndexOf(":");
|
|
248
|
+
const device = value.slice(0, separator);
|
|
249
|
+
const sequence = Number(value.slice(separator + 1));
|
|
250
|
+
if (!device || !Number.isSafeInteger(sequence) || sequence <= 0) {
|
|
251
|
+
throw new Error("Invalid observed-remove tag");
|
|
252
|
+
}
|
|
253
|
+
vector.set(device, Math.max(sequence, vector.get(device) ?? 0));
|
|
254
|
+
}
|
|
255
|
+
return vector;
|
|
256
|
+
}
|
|
257
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
258
|
+
0 && (module.exports = {
|
|
259
|
+
DataStoreReplica,
|
|
260
|
+
isDataStoreJsonValue,
|
|
261
|
+
isDataStoreOperation
|
|
262
|
+
});
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXJlcGxpY2EudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoZXNlIGFyZSBPYnNpZGlhbiByZW5kZXJlciBXZWIgQVBJcywgbm90IE5vZGUgYnVpbHRpbnMuICovXG4vKipcbiAqIEBmaWxlXG4gKlxuICogTWVyZ2Utc2FmZSByZWdpc3RlcnMgYW5kIG9ic2VydmVkLXJlbW92ZSBzZXRzIHVzZWQgYnkgc2hhcmVkIGRhdGEgc3RvcmVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBBIHN0b3JlIGZpeGVzIGl0cyBtZXJnZSBydWxlIGZvciBpdHMgZW50aXJlIGxpZmV0aW1lIGFuZCBzY2hlbWEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRGF0YVN0b3JlTWVyZ2VLaW5kID0gJ2xhc3Qtd3JpdGUtd2lucycgfCAnbWF4aW11bScgfCAnbWluaW11bScgfCAnb2JzZXJ2ZWQtcmVtb3ZlLXNldCc7XG5cbi8qKlxuICogQSB2ZXJzaW9uLW9uZSBqb3VybmFsIG9wZXJhdGlvbi4gVGhlc2UgZmllbGRzIGZvcm0gYSBwdWJsaXNoZWQgd2lyZSBmb3JtYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlT3BlcmF0aW9uIHtcbiAgLyoqXG4gICAqIExvZ2ljYWwgY291bnRlciB3aXRoaW4gdGhlIHdhbGwtY2xvY2sgbWlsbGlzZWNvbmQuXG4gICAqL1xuICByZWFkb25seSBjb3VudGVyOiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSByZW1vdmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFVuaXF1ZSB3cml0ZXIgaW5jYXJuYXRpb24sIHN0b3JlZCBsb2NhbGx5IHJhdGhlciB0aGFuIGluIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZTogc3RyaW5nO1xuICAvKipcbiAgICogUmVjb3JkIGtleSwgb3Igc2V0IG1lbWJlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKipcbiAgICogU3RyaWN0bHkgaW5jcmVhc2luZyB3cml0ZXIgc2VxdWVuY2UsIHN0YXJ0aW5nIGF0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcXVlbmNlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPYnNlcnZlZCBhZGRpdGlvbiB0YWdzIHJlbW92ZWQgYnkgYSBzZXQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogSHlicmlkIGxvZ2ljYWwgY2xvY2sgd2FsbCB0aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZTogbnVtYmVyO1xuICAvKipcbiAgICogSlNPTi1jb21wYXRpYmxlIHZhbHVlOyBzZXQgbWVtYmVycyB1c2UgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSW4tbWVtb3J5IENSRFQgc3RhdGUuIEV4cG9ydGVkIG9wZXJhdGlvbnMgY2FuIGJlIGpvaW5lZCBpbiBhbnkgb3JkZXIsIHJlcGVhdGVkbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhU3RvcmVSZXBsaWNhIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRpdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbHMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHJlcGxpY2EuXG4gICAqXG4gICAqIEBwYXJhbSBraW5kIC0gSW1tdXRhYmxlIG1lcmdlIHJ1bGUgZm9yIHRoZSBzdG9yZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kKSB7fVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGpvaW5zIG9uZSBqb3VybmFsIG9yIHNuYXBzaG90IG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVW50cnVzdGVkIHBhcnNlZCBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgYXBwbHkodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIWlzRGF0YVN0b3JlT3BlcmF0aW9uKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgb3BlcmF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHdpbmRvdy5zdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0Jykge1xuICAgICAgdGhpcy5hcHBseVNldChvcGVyYXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucmVnaXN0ZXJzLmdldChvcGVyYXRpb24ua2V5KTtcbiAgICBpZiAodGhpcy5raW5kICE9PSAnbGFzdC13cml0ZS13aW5zJyAmJiAob3BlcmF0aW9uLmRlbGV0ZWQgfHwgcmFua09mKG9wZXJhdGlvbi52YWx1ZSkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWluL21heCBzdG9yZXMgYWNjZXB0IGZpbml0ZSBudW1iZXJzIG9yIHJhbmtlZCBKU09OIHZhbHVlcyBhbmQgZG8gbm90IHN1cHBvcnQgZGVsZXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFwcmV2aW91cyB8fCB0aGlzLndpbnMob3BlcmF0aW9uLCBwcmV2aW91cykpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJzLnNldChvcGVyYXRpb24ua2V5LCBvcGVyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB2aXNpYmxlIHJlY29yZHMsIGRldGFjaGVkIGZyb20gaW50ZXJuYWwgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFBhaXJzIGluIGRldGVybWluaXN0aWMga2V5IG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGVudHJpZXMoKTogW3N0cmluZywgdW5rbm93bl1bXSB7XG4gICAgaWYgKHRoaXMua2luZCA9PT0gJ29ic2VydmVkLXJlbW92ZS1zZXQnKSB7XG4gICAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLmFjdGl2ZUFkZGl0aW9ucygpLm1hcCgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24ua2V5KSk7XG4gICAgICByZXR1cm4gWy4uLmtleXNdLnNvcnQoKS5tYXAoKGtleSkgPT4gW2tleSwgdHJ1ZV0pO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLnRoaXMucmVnaXN0ZXJzLnZhbHVlcygpXS5maWx0ZXIoKG9wZXJhdGlvbikgPT4gIW9wZXJhdGlvbi5kZWxldGVkKVxuICAgICAgLnNvcnQoKGZpcnN0LCBzZWNvbmQpID0+IGZpcnN0LmtleS5sb2NhbGVDb21wYXJlKHNlY29uZC5rZXkpKVxuICAgICAgLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmtleSwgd2luZG93LnN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24udmFsdWUpXSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyBtZXJnZWFibGUgc3RhdGUsIHJldGFpbmluZyB0b21ic3RvbmVzIGZvciBsYXRlIG9yIHJldGlyZWQgcmVwbGljYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIERldGVybWluaXN0aWNhbGx5IG9yZGVyZWQgb3BlcmF0aW9ucyBzdWZmaWNpZW50IHRvIHJlY29uc3RydWN0IHRoaXMgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZXhwb3J0KCk6IERhdGFTdG9yZU9wZXJhdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMucmVnaXN0ZXJzLnZhbHVlcygpLCAuLi50aGlzLmFjdGl2ZUFkZGl0aW9ucygpLCAuLi50aGlzLnJlbW92YWxzLnZhbHVlcygpXVxuICAgICAgLnNvcnQoKGZpcnN0LCBzZWNvbmQpID0+IHRhZyhmaXJzdCkubG9jYWxlQ29tcGFyZSh0YWcoc2Vjb25kKSkpLm1hcCgob3BlcmF0aW9uKSA9PiB3aW5kb3cuc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgcmVnaXN0ZXIgb3Igc2V0IG1lbWJlcnNoaXAgd2l0aG91dCBlbnVtZXJhdGluZyByZWdpc3RlciBrZXlzLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLlxuICAgKiBAcmV0dXJucyBBIGRldGFjaGVkIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudCBvciBkZWxldGVkLlxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlQWRkaXRpb25zKCkuc29tZSgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24ua2V5ID09PSBrZXkpIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy5yZWdpc3RlcnMuZ2V0KGtleSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbiAmJiAhb3BlcmF0aW9uLmRlbGV0ZWQgPyB3aW5kb3cuc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbi52YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWRkaXRpb25zIG9ic2VydmVkIGZvciBhIHNldCBtZW1iZXIsIGZvciBhbiBvYnNlcnZlZCByZW1vdmFsLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gU2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQWRkaXRpb24gaWRlbnRpdGllcy4gQ29uY3VycmVudCB1bnNlZW4gYWRkaXRpb25zIHN1cnZpdmUgcmVtb3ZhbC5cbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlZFRhZ3Moa2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmFkZGl0aW9ucy52YWx1ZXMoKV0uZmlsdGVyKChvcGVyYXRpb24pID0+IG9wZXJhdGlvbi5rZXkgPT09IGtleSkubWFwKChvcGVyYXRpb24pID0+IHRhZyhvcGVyYXRpb24pKS5zb3J0KCk7XG4gIH1cblxuICBwcml2YXRlIGFjdGl2ZUFkZGl0aW9ucygpOiBEYXRhU3RvcmVPcGVyYXRpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmFkZGl0aW9ucy52YWx1ZXMoKV0uZmlsdGVyKChvcGVyYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0YWdWZWN0b3IodGhpcy5yZW1vdmFscy5nZXQob3BlcmF0aW9uLmtleSk/LnRhZ3MgPz8gW10pO1xuICAgICAgcmV0dXJuIG9wZXJhdGlvbi5zZXF1ZW5jZSA+IChyZW1vdmVkLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTZXQob3BlcmF0aW9uOiBEYXRhU3RvcmVPcGVyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAob3BlcmF0aW9uLmRlbGV0ZWQpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5yZW1vdmFscy5nZXQob3BlcmF0aW9uLmtleSk7XG4gICAgICBjb25zdCB2ZWN0b3IgPSB0YWdWZWN0b3IoWy4uLihwcmV2aW91cz8udGFncyA/PyBbXSksIC4uLihvcGVyYXRpb24udGFncyA/PyBbXSldKTtcbiAgICAgIGNvbnN0IHdpbm5lciA9IHByZXZpb3VzICYmIHRoaXMud2lucyhwcmV2aW91cywgb3BlcmF0aW9uKSA/IHByZXZpb3VzIDogb3BlcmF0aW9uO1xuICAgICAgdGhpcy5yZW1vdmFscy5zZXQob3BlcmF0aW9uLmtleSwgeyAuLi53aW5uZXIsIHRhZ3M6IFsuLi52ZWN0b3JdLnNvcnQoKFtmaXJzdF0sIFtzZWNvbmRdKSA9PiBmaXJzdC5sb2NhbGVDb21wYXJlKHNlY29uZCkpLm1hcCgoW2RldmljZSwgc2VxdWVuY2VdKSA9PiBgJHtkZXZpY2V9OiR7U3RyaW5nKHNlcXVlbmNlKX1gKSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wZXJhdGlvbi52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldCBhZGRpdGlvbnMgdXNlIHRydWUgYXMgdGhlaXIgdmFsdWUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IGAke29wZXJhdGlvbi5rZXl9OiR7b3BlcmF0aW9uLmRldmljZX1gO1xuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmFkZGl0aW9ucy5nZXQoa2V5KTtcbiAgICAgIGlmICghcHJldmlvdXMgfHwgb3BlcmF0aW9uLnNlcXVlbmNlID4gcHJldmlvdXMuc2VxdWVuY2UpIHtcbiAgICAgICAgdGhpcy5hZGRpdGlvbnMuc2V0KGtleSwgb3BlcmF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdpbnMobmV4dDogRGF0YVN0b3JlT3BlcmF0aW9uLCBwcmV2aW91czogRGF0YVN0b3JlT3BlcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmV4dFJhbmsgPSByYW5rT2YobmV4dC52YWx1ZSk7XG4gICAgY29uc3QgcHJldmlvdXNSYW5rID0gcmFua09mKHByZXZpb3VzLnZhbHVlKTtcbiAgICBpZiAodGhpcy5raW5kID09PSAnbWluaW11bScgJiYgbmV4dFJhbmsgIT09IHByZXZpb3VzUmFuaykge1xuICAgICAgcmV0dXJuIE51bWJlcihuZXh0UmFuaykgPCBOdW1iZXIocHJldmlvdXNSYW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2luZCA9PT0gJ21heGltdW0nICYmIG5leHRSYW5rICE9PSBwcmV2aW91c1JhbmsgPyBOdW1iZXIobmV4dFJhbmspID4gTnVtYmVyKHByZXZpb3VzUmFuaykgOiBuZXh0LnRpbWUgPiBwcmV2aW91cy50aW1lIHx8IChuZXh0LnRpbWUgPT09IHByZXZpb3VzLnRpbWUgJiYgKG5leHQuY291bnRlciA+IHByZXZpb3VzLmNvdW50ZXJcbiAgICAgIHx8IChuZXh0LmNvdW50ZXIgPT09IHByZXZpb3VzLmNvdW50ZXIgJiYgbmV4dC5kZXZpY2UgPiBwcmV2aW91cy5kZXZpY2UpKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhIHZhbHVlIHN1cnZpdmVzIEpTT04gdHJhbnNwb3J0IHdpdGhvdXQgY2hhbmdpbmcgaXRzIG1lYW5pbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQ2FuZGlkYXRlIGRhdGEtc3RvcmUgdmFsdWUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGl0IGlzIGZpbml0ZSwgYWN5Y2xpYyBKU09OIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFTdG9yZUpzb25WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpzb25WYWx1ZSB7XG4gIHJldHVybiBpc0pzb25WYWx1ZSh2YWx1ZSwgbmV3IFNldCgpKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIHZlcnNpb24tb25lIG9wZXJhdGlvbiB3aXJlIHNoYXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFBhcnNlZCBKU09OLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgb3BlcmF0aW9uIGhhcyB2YWxpZCBpZGVudGl0eSBhbmQgY2xvY2sgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhU3RvcmVPcGVyYXRpb24odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRhU3RvcmVPcGVyYXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAna2V5JyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUua2V5ID09PSAnc3RyaW5nJ1xuICAgICYmICdkZXZpY2UnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5kZXZpY2UgPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QodmFsdWUuZGV2aWNlKVxuICAgICYmICdzZXF1ZW5jZScgaW4gdmFsdWUgJiYgaXNQb3NpdGl2ZUludGVnZXIodmFsdWUuc2VxdWVuY2UpXG4gICAgJiYgJ3RpbWUnIGluIHZhbHVlICYmIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlLnRpbWUpXG4gICAgJiYgJ2NvdW50ZXInIGluIHZhbHVlICYmIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlLmNvdW50ZXIpXG4gICAgJiYgJ2RlbGV0ZWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5kZWxldGVkID09PSAnYm9vbGVhbicgJiYgJ3ZhbHVlJyBpbiB2YWx1ZSAmJiBpc0RhdGFTdG9yZUpzb25WYWx1ZSh2YWx1ZS52YWx1ZSlcbiAgICAmJiAoISgndGFncycgaW4gdmFsdWUpIHx8IChBcnJheS5pc0FycmF5KHZhbHVlLnRhZ3MpICYmIHZhbHVlLnRhZ3MuZXZlcnkoKGl0ZW06IHVua25vd24pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykpKTtcbn1cblxuZnVuY3Rpb24gaXNKc29uVmFsdWUodmFsdWU6IHVua25vd24sIGFuY2VzdG9yczogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IGFuY2VzdG9ycy5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogT2JqZWN0LnZhbHVlcyh2YWx1ZSk7XG4gIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZXMuZXZlcnkoKGNoaWxkKSA9PiBpc0pzb25WYWx1ZShjaGlsZCwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gaXNWYWxpZDtcbn1cblxuZnVuY3Rpb24gaXNOb25OZWdhdGl2ZUludGVnZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSAmJiBOdW1iZXIodmFsdWUpID49IDA7XG59XG5cbmZ1bmN0aW9uIGlzUG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgJiYgTnVtYmVyKHZhbHVlKSA+IDA7XG59XG5cbmZ1bmN0aW9uIHJhbmtPZih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ3JhbmsnIGluIHZhbHVlICYmICd2YWx1ZScgaW4gdmFsdWVcbiAgICAgICYmIHR5cGVvZiB2YWx1ZS5yYW5rID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUucmFuaylcbiAgICA/IHZhbHVlLnJhbmtcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdGFnKG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YDtcbn1cblxuZnVuY3Rpb24gdGFnVmVjdG9yKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IHZlY3RvciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdGFncykge1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IHZhbHVlLmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgY29uc3QgZGV2aWNlID0gdmFsdWUuc2xpY2UoMCwgc2VwYXJhdG9yKTtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IE51bWJlcih2YWx1ZS5zbGljZShzZXBhcmF0b3IgKyAxKSk7XG4gICAgaWYgKCFkZXZpY2UgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHNlcXVlbmNlKSB8fCBzZXF1ZW5jZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgb2JzZXJ2ZWQtcmVtb3ZlIHRhZycpO1xuICAgIH1cbiAgICB2ZWN0b3Iuc2V0KGRldmljZSwgTWF0aC5tYXgoc2VxdWVuY2UsIHZlY3Rvci5nZXQoZGV2aWNlKSA/PyAwKSk7XG4gIH1cbiAgcmV0dXJuIHZlY3Rvcjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7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
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Merge-safe registers and observed-remove sets used by shared data stores.
|
|
6
|
+
*/
|
|
7
|
+
import type { JsonValue } from 'type-fest' with { 'resolution-mode': 'import' };
|
|
8
|
+
/**
|
|
9
|
+
* A store fixes its merge rule for its entire lifetime and schema version.
|
|
10
|
+
*/
|
|
11
|
+
export type DataStoreMergeKind = 'last-write-wins' | 'maximum' | 'minimum' | 'observed-remove-set';
|
|
12
|
+
/**
|
|
13
|
+
* A version-one journal operation. These fields form a published wire format.
|
|
14
|
+
*/
|
|
15
|
+
export interface DataStoreOperation {
|
|
16
|
+
/**
|
|
17
|
+
* Logical counter within the wall-clock millisecond.
|
|
18
|
+
*/
|
|
19
|
+
readonly counter: number;
|
|
20
|
+
/**
|
|
21
|
+
* Whether this is a removal.
|
|
22
|
+
*/
|
|
23
|
+
readonly deleted: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Unique writer incarnation, stored locally rather than in plugin settings.
|
|
26
|
+
*/
|
|
27
|
+
readonly device: string;
|
|
28
|
+
/**
|
|
29
|
+
* Record key, or set member.
|
|
30
|
+
*/
|
|
31
|
+
readonly key: string;
|
|
32
|
+
/**
|
|
33
|
+
* Strictly increasing writer sequence, starting at one.
|
|
34
|
+
*/
|
|
35
|
+
readonly sequence: number;
|
|
36
|
+
/**
|
|
37
|
+
* Observed addition tags removed by a set operation.
|
|
38
|
+
*/
|
|
39
|
+
readonly tags?: readonly string[];
|
|
40
|
+
/**
|
|
41
|
+
* Hybrid logical clock wall time.
|
|
42
|
+
*/
|
|
43
|
+
readonly time: number;
|
|
44
|
+
/**
|
|
45
|
+
* JSON-compatible value; set members use `true`.
|
|
46
|
+
*/
|
|
47
|
+
readonly value: unknown;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* In-memory CRDT state. Exported operations can be joined in any order, repeatedly.
|
|
51
|
+
*/
|
|
52
|
+
export declare class DataStoreReplica {
|
|
53
|
+
protected readonly kind: DataStoreMergeKind;
|
|
54
|
+
private readonly additions;
|
|
55
|
+
private readonly registers;
|
|
56
|
+
private readonly removals;
|
|
57
|
+
/**
|
|
58
|
+
* Creates an empty replica.
|
|
59
|
+
*
|
|
60
|
+
* @param kind - Immutable merge rule for the store.
|
|
61
|
+
*/
|
|
62
|
+
constructor(kind: DataStoreMergeKind);
|
|
63
|
+
/**
|
|
64
|
+
* Validates and joins one journal or snapshot operation.
|
|
65
|
+
*
|
|
66
|
+
* @param value - Untrusted parsed operation.
|
|
67
|
+
*/
|
|
68
|
+
apply(value: unknown): void;
|
|
69
|
+
/**
|
|
70
|
+
* Reads visible records, detached from internal state.
|
|
71
|
+
*
|
|
72
|
+
* @returns Pairs in deterministic key order.
|
|
73
|
+
*/
|
|
74
|
+
entries(): [string, unknown][];
|
|
75
|
+
/**
|
|
76
|
+
* Exports mergeable state, retaining tombstones for late or retired replicas.
|
|
77
|
+
*
|
|
78
|
+
* @returns Deterministically ordered operations sufficient to reconstruct this state.
|
|
79
|
+
*/
|
|
80
|
+
export(): DataStoreOperation[];
|
|
81
|
+
/**
|
|
82
|
+
* Reads a register or set membership without enumerating register keys.
|
|
83
|
+
*
|
|
84
|
+
* @param key - Record key or set member.
|
|
85
|
+
* @returns A detached value, or `undefined` when absent or deleted.
|
|
86
|
+
*/
|
|
87
|
+
get(key: string): unknown;
|
|
88
|
+
/**
|
|
89
|
+
* Finds additions observed for a set member, for an observed removal.
|
|
90
|
+
*
|
|
91
|
+
* @param key - Set member.
|
|
92
|
+
* @returns Addition identities. Concurrent unseen additions survive removal.
|
|
93
|
+
*/
|
|
94
|
+
observedTags(key: string): string[];
|
|
95
|
+
private activeAdditions;
|
|
96
|
+
private applySet;
|
|
97
|
+
private wins;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Checks that a value survives JSON transport without changing its meaning.
|
|
101
|
+
*
|
|
102
|
+
* @param value - Candidate data-store value.
|
|
103
|
+
* @returns Whether it is finite, acyclic JSON data.
|
|
104
|
+
*/
|
|
105
|
+
export declare function isDataStoreJsonValue(value: unknown): value is JsonValue;
|
|
106
|
+
/**
|
|
107
|
+
* Checks the version-one operation wire shape.
|
|
108
|
+
*
|
|
109
|
+
* @param value - Parsed JSON.
|
|
110
|
+
* @returns Whether the operation has valid identity and clock fields.
|
|
111
|
+
*/
|
|
112
|
+
export declare function isDataStoreOperation(value: unknown): value is DataStoreOperation;
|
|
@@ -0,0 +1,204 @@
|
|
|
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 patchObsidianRequire() {
|
|
6
|
+
const originalRequire = require;
|
|
7
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
require = Object.assign(
|
|
11
|
+
(id) => requirePatched(id),
|
|
12
|
+
originalRequire,
|
|
13
|
+
{
|
|
14
|
+
__isPatched: true
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
function extractDefault(module) {
|
|
18
|
+
return module && module.__esModule && "default" in module ? module.default : module;
|
|
19
|
+
}
|
|
20
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
21
|
+
"@codemirror/autocomplete",
|
|
22
|
+
"@codemirror/collab",
|
|
23
|
+
"@codemirror/commands",
|
|
24
|
+
"@codemirror/language",
|
|
25
|
+
"@codemirror/lint",
|
|
26
|
+
"@codemirror/search",
|
|
27
|
+
"@codemirror/state",
|
|
28
|
+
"@codemirror/text",
|
|
29
|
+
"@codemirror/view",
|
|
30
|
+
"@lezer/common",
|
|
31
|
+
"@lezer/highlight",
|
|
32
|
+
"@lezer/lr",
|
|
33
|
+
"obsidian"
|
|
34
|
+
]);
|
|
35
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
36
|
+
"@codemirror/closebrackets",
|
|
37
|
+
"@codemirror/comment",
|
|
38
|
+
"@codemirror/fold",
|
|
39
|
+
"@codemirror/gutter",
|
|
40
|
+
"@codemirror/highlight",
|
|
41
|
+
"@codemirror/history",
|
|
42
|
+
"@codemirror/matchbrackets",
|
|
43
|
+
"@codemirror/panel",
|
|
44
|
+
"@codemirror/rangeset",
|
|
45
|
+
"@codemirror/rectangular-selection",
|
|
46
|
+
"@codemirror/stream-parser",
|
|
47
|
+
"@codemirror/tooltip"
|
|
48
|
+
]);
|
|
49
|
+
function requirePatched(id) {
|
|
50
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
51
|
+
return originalRequire?.(id);
|
|
52
|
+
}
|
|
53
|
+
const app = globalThis.app;
|
|
54
|
+
if (app?.isMobile) {
|
|
55
|
+
if (id === "process" || id === "node:process") {
|
|
56
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
57
|
+
return process;
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
const module = originalRequire?.(id);
|
|
61
|
+
if (module) {
|
|
62
|
+
return extractDefault(module);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
})();
|
|
69
|
+
|
|
70
|
+
"use strict";
|
|
71
|
+
var __defProp = Object.defineProperty;
|
|
72
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
73
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
74
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
75
|
+
var __export = (target, all) => {
|
|
76
|
+
for (var name in all)
|
|
77
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
78
|
+
};
|
|
79
|
+
var __copyProps = (to, from, except, desc) => {
|
|
80
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
81
|
+
for (let key of __getOwnPropNames(from))
|
|
82
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
83
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
84
|
+
}
|
|
85
|
+
return to;
|
|
86
|
+
};
|
|
87
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
88
|
+
var data_store_seeds_exports = {};
|
|
89
|
+
__export(data_store_seeds_exports, {
|
|
90
|
+
DataStoreSeeds: () => DataStoreSeeds,
|
|
91
|
+
validateDataStoreSeed: () => validateDataStoreSeed
|
|
92
|
+
});
|
|
93
|
+
module.exports = __toCommonJS(data_store_seeds_exports);
|
|
94
|
+
var import_data_store_replica = require('./data-store-replica.cjs');
|
|
95
|
+
var import_data_store_transport = require('./data-store-transport.cjs');
|
|
96
|
+
class DataStoreSeeds {
|
|
97
|
+
/**
|
|
98
|
+
* Device-local identity and serialization boundary.
|
|
99
|
+
*/
|
|
100
|
+
local;
|
|
101
|
+
/**
|
|
102
|
+
* Whether this store shares cache seeds.
|
|
103
|
+
*/
|
|
104
|
+
share;
|
|
105
|
+
/**
|
|
106
|
+
* Store-scoped snapshot transport.
|
|
107
|
+
*/
|
|
108
|
+
transport;
|
|
109
|
+
/**
|
|
110
|
+
* Creates a cache-seed publisher and reader.
|
|
111
|
+
*
|
|
112
|
+
* @param params - Local identity, transport and the per-store sharing setting.
|
|
113
|
+
*/
|
|
114
|
+
constructor(params) {
|
|
115
|
+
this.local = params.local;
|
|
116
|
+
this.share = params.share;
|
|
117
|
+
this.transport = params.transport;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Publishes a bounded seed, replacing only this device's earlier publications.
|
|
121
|
+
*
|
|
122
|
+
* @param entries - Derived records with file statistics and hashes.
|
|
123
|
+
* @returns Whether sharing was enabled and the seed was published.
|
|
124
|
+
*/
|
|
125
|
+
async publish(entries) {
|
|
126
|
+
if (!this.share) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
return await this.local.exclusive(async () => {
|
|
130
|
+
const device = await this.local.getOrCreate("seed-device-v1", window.crypto.randomUUID());
|
|
131
|
+
if (typeof device !== "string" || !/^[\w-]+$/.test(device)) {
|
|
132
|
+
throw new Error("Invalid local seed identity");
|
|
133
|
+
}
|
|
134
|
+
const root = `${this.transport.root}/seeds/${device}`;
|
|
135
|
+
const files = await this.transport.list();
|
|
136
|
+
const base = `${root}/seed-${window.crypto.randomUUID()}-manifest`;
|
|
137
|
+
await this.transport.writeSnapshot({ base, payload: { entries, format: 1, time: Date.now() } });
|
|
138
|
+
for (const path of files) {
|
|
139
|
+
if (path.startsWith(`${root}/seed-`)) {
|
|
140
|
+
await this.transport.remove(path);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return true;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Reads the newest complete seed for this transport's schema.
|
|
148
|
+
*
|
|
149
|
+
* @returns Seed records, or `undefined` if sharing is disabled or no complete seed is available yet.
|
|
150
|
+
*/
|
|
151
|
+
async readLatest() {
|
|
152
|
+
if (!this.share) {
|
|
153
|
+
return void 0;
|
|
154
|
+
}
|
|
155
|
+
const files = await this.transport.list();
|
|
156
|
+
let newest = -Infinity;
|
|
157
|
+
let entries;
|
|
158
|
+
for (const path of files) {
|
|
159
|
+
if (!/\/seed-[\w-]+-manifest\.md$/.test(path)) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
let seed;
|
|
163
|
+
try {
|
|
164
|
+
seed = await this.transport.readSnapshot(path);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
if (error instanceof SyntaxError) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
if (!(isSeed(seed) && seed.time > newest)) {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
newest = seed.time;
|
|
175
|
+
entries = seed.entries;
|
|
176
|
+
}
|
|
177
|
+
return entries;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function validateDataStoreSeed(params) {
|
|
181
|
+
const seed = new Map(params.entries.map((entry) => [entry.path, entry]));
|
|
182
|
+
const reusable = [];
|
|
183
|
+
const rebuild = [];
|
|
184
|
+
for (const file of params.files) {
|
|
185
|
+
const entry = seed.get(file.path);
|
|
186
|
+
if (entry?.size === file.size && (entry.mtime === file.mtime || entry.hash === await params.hashFile(file.path))) {
|
|
187
|
+
reusable.push({ ...entry, ...file });
|
|
188
|
+
} else {
|
|
189
|
+
rebuild.push(file.path);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return { rebuild, reusable };
|
|
193
|
+
}
|
|
194
|
+
function isSeed(value) {
|
|
195
|
+
return typeof value === "object" && value !== null && "format" in value && value.format === 1 && "time" in value && typeof value.time === "number" && Number.isFinite(value.time) && "entries" in value && Array.isArray(value.entries) && value.entries.every(
|
|
196
|
+
(entry) => typeof entry === "object" && entry !== null && "path" in entry && typeof entry.path === "string" && "mtime" in entry && typeof entry.mtime === "number" && Number.isFinite(entry.mtime) && "size" in entry && typeof entry.size === "number" && Number.isFinite(entry.size) && "hash" in entry && typeof entry.hash === "string" && "value" in entry && (0, import_data_store_replica.isDataStoreJsonValue)(entry.value)
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
200
|
+
0 && (module.exports = {
|
|
201
|
+
DataStoreSeeds,
|
|
202
|
+
validateDataStoreSeed
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXNlZWRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIE9wdGlvbmFsIGNodW5rZWQgc2VlZHMgZm9yIGV4cGVuc2l2ZSBkZXJpdmVkIGNhY2hlcywgd2l0aCBwZXItZmlsZSB2YWxpZGF0aW9uIGJlZm9yZSByZXVzZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQgeyBpc0RhdGFTdG9yZUpzb25WYWx1ZSB9IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG4vKipcbiAqIEEgZGVyaXZlZCByZWNvcmQgdGFnZ2VkIHdpdGggYm90aCBjaGVhcCBzdGF0aXN0aWNzIGFuZCBhIGNvbnRlbnQgaGFzaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVTZWVkRW50cnkgZXh0ZW5kcyBEYXRhU3RvcmVTZWVkRmlsZSB7XG4gIC8qKlxuICAgKiBDb250ZW50IGhhc2gsIHVzaW5nIHRoZSBzYW1lIGFsZ29yaXRobSBvbiBldmVyeSBkZXZpY2UuXG4gICAqL1xuICByZWFkb25seSBoYXNoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb25zdW1lci1kZWZpbmVkIEpTT04gY2FjaGUgcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTtcbn1cblxuLyoqXG4gKiBDaGVhcCBmaWxlIGlkZW50aXR5IGFscmVhZHkgYXZhaWxhYmxlIGZyb20gdGhlIHZhdWx0J3MgZmlsZSB0cmVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZVNlZWRGaWxlIHtcbiAgLyoqXG4gICAqIExhc3QgbW9kaWZpY2F0aW9uIHRpbWUuXG4gICAqL1xuICByZWFkb25seSBtdGltZTogbnVtYmVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEZpbGUgc2l6ZSBpbiBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcHRpb25hbCBjYWNoZS1zZWVkIHNoYXJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlU2VlZHNDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgZGV2aWNlLWxvY2FsIHN0b3JlIHRoYXQgb3ducyB0aGUgc2VlZCBwdWJsaXNoZXIgaWRlbnRpdHkuXG4gICAqL1xuICByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBQZXItc3RvcmUgdXNlciBzZXR0aW5nLiBEaXNhYmxlZCBtZWFucyBuZWl0aGVyIHB1Ymxpc2hpbmcgbm9yIGFkb3B0aW5nIHNlZWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdG9yZS1zY29wZWQsIGJvdW5kZWQgTWFya2Rvd24gdHJhbnNwb3J0LiBJbmNsdWRlIHRoZSBjb25zdW1lciBzY2hlbWEgdmVyc2lvbiBpbiBpdHMgc3RvcmUgaWQuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IERhdGFTdG9yZVRyYW5zcG9ydDtcbn1cblxuLyoqXG4gKiBSZXN1bHRzIG9mIHZhbGlkYXRpbmcgYSBzaGFyZWQgY2FjaGUgc2VlZCBhZ2FpbnN0IHRoZSBsb2NhbCB2YXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVTZWVkVmFsaWRhdGlvbiB7XG4gIC8qKlxuICAgKiBGaWxlcyBhYnNlbnQgZnJvbSB0aGUgc2VlZCwgb3Igd2l0aCBkaWZmZXJlbnQgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYnVpbGQ6IHN0cmluZ1tdO1xuICAvKipcbiAgICogVmFsaWRhdGVkIHNlZWQgcmVjb3Jkcywgd2l0aCBsb2NhbCBmaWxlIHN0YXRpc3RpY3MuXG4gICAqL1xuICByZWFkb25seSByZXVzYWJsZTogRGF0YVN0b3JlU2VlZEVudHJ5W107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcGVyLWZpbGUgc2VlZCB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRlRGF0YVN0b3JlU2VlZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBTZWVkIGVudHJpZXMgZnJvbSBhIHJlY29nbml6ZWQgY29uc3VtZXIgc2NoZW1hLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cmllczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEVudHJ5W107XG4gIC8qKlxuICAgKiBDdXJyZW50IGZpbGUgdHJlZSwgYXZhaWxhYmxlIHdpdGhvdXQgcmVhZGluZyBub3RlIHRleHQuXG4gICAqL1xuICByZWFkb25seSBmaWxlczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEZpbGVbXTtcbiAgLyoqXG4gICAqIEhhc2hlcyB0ZXh0IG9ubHkgd2hlbiBzaXplIG1hdGNoZXMgYnV0IG10aW1lIGRpZmZlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSByZXF1aXJpbmcgdmFsaWRhdGlvbi5cbiAgICogQHJldHVybnMgSXRzIGNvbnRlbnQgaGFzaC5cbiAgICovXG4gIHJlYWRvbmx5IGhhc2hGaWxlOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz47XG59XG5cbmludGVyZmFjZSBTZWVkIHtcbiAgZW50cmllczogRGF0YVN0b3JlU2VlZEVudHJ5W107XG4gIGZvcm1hdDogMTtcbiAgdGltZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbmFsIHBlcmZvcm1hbmNlIGhpbnRzLiBTZWVkcyBhcmUgbmV2ZXIgYXV0aG9yaXRhdGl2ZSBzdGF0ZSBhbmQgbXVzdCBiZSB2YWxpZGF0ZWQgYmVmb3JlIHJldXNlLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlU2VlZHMge1xuICAvKipcbiAgICogRGV2aWNlLWxvY2FsIGlkZW50aXR5IGFuZCBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvY2FsOiBMb2NhbERhdGFTdG9yZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdG9yZSBzaGFyZXMgY2FjaGUgc2VlZHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hhcmU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdG9yZS1zY29wZWQgc25hcHNob3QgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zcG9ydDogRGF0YVN0b3JlVHJhbnNwb3J0O1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNhY2hlLXNlZWQgcHVibGlzaGVyIGFuZCByZWFkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBMb2NhbCBpZGVudGl0eSwgdHJhbnNwb3J0IGFuZCB0aGUgcGVyLXN0b3JlIHNoYXJpbmcgc2V0dGluZy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERhdGFTdG9yZVNlZWRzQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmxvY2FsID0gcGFyYW1zLmxvY2FsO1xuICAgIHRoaXMuc2hhcmUgPSBwYXJhbXMuc2hhcmU7XG4gICAgdGhpcy50cmFuc3BvcnQgPSBwYXJhbXMudHJhbnNwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGJvdW5kZWQgc2VlZCwgcmVwbGFjaW5nIG9ubHkgdGhpcyBkZXZpY2UncyBlYXJsaWVyIHB1YmxpY2F0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGVudHJpZXMgLSBEZXJpdmVkIHJlY29yZHMgd2l0aCBmaWxlIHN0YXRpc3RpY3MgYW5kIGhhc2hlcy5cbiAgICogQHJldHVybnMgV2hldGhlciBzaGFyaW5nIHdhcyBlbmFibGVkIGFuZCB0aGUgc2VlZCB3YXMgcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2goZW50cmllczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEVudHJ5W10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuc2hhcmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRldmljZSA9IGF3YWl0IHRoaXMubG9jYWwuZ2V0T3JDcmVhdGUoJ3NlZWQtZGV2aWNlLXYxJywgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKCkpO1xuICAgICAgaWYgKHR5cGVvZiBkZXZpY2UgIT09ICdzdHJpbmcnIHx8ICEvXltcXHctXSskLy50ZXN0KGRldmljZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvY2FsIHNlZWQgaWRlbnRpdHknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvb3QgPSBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9zZWVkcy8ke2RldmljZX1gO1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgICBjb25zdCBiYXNlID0gYCR7cm9vdH0vc2VlZC0ke3dpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpfS1tYW5pZmVzdGA7XG4gICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZVNuYXBzaG90KHsgYmFzZSwgcGF5bG9hZDogeyBlbnRyaWVzLCBmb3JtYXQ6IDEsIHRpbWU6IERhdGUubm93KCkgfSB9KTtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke3Jvb3R9L3NlZWQtYCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBuZXdlc3QgY29tcGxldGUgc2VlZCBmb3IgdGhpcyB0cmFuc3BvcnQncyBzY2hlbWEuXG4gICAqXG4gICAqIEByZXR1cm5zIFNlZWQgcmVjb3Jkcywgb3IgYHVuZGVmaW5lZGAgaWYgc2hhcmluZyBpcyBkaXNhYmxlZCBvciBubyBjb21wbGV0ZSBzZWVkIGlzIGF2YWlsYWJsZSB5ZXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVhZExhdGVzdCgpOiBQcm9taXNlPERhdGFTdG9yZVNlZWRFbnRyeVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLnNoYXJlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmxpc3QoKTtcbiAgICBsZXQgbmV3ZXN0ID0gLUluZmluaXR5O1xuICAgIGxldCBlbnRyaWVzOiBEYXRhU3RvcmVTZWVkRW50cnlbXSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmICghL1xcL3NlZWQtW1xcdy1dKy1tYW5pZmVzdFxcLm1kJC8udGVzdChwYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBzZWVkOiB1bmtub3duO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VlZCA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWRTbmFwc2hvdChwYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoIShpc1NlZWQoc2VlZCkgJiYgc2VlZC50aW1lID4gbmV3ZXN0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbmV3ZXN0ID0gc2VlZC50aW1lO1xuICAgICAgZW50cmllcyA9IHNlZWQuZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzZWVkIHVzaW5nIGZyZWUgZmlsZSBzdGF0aXN0aWNzIGZpcnN0LCBoYXNoaW5nIG9ubHkgc2l6ZS1lcXVhbCBtdGltZSBtaXNtYXRjaGVzLlxuICogRmlsZXMgYWJzZW50IGxvY2FsbHkgYXJlIGRpc2NhcmRlZC4gQ29uc3VtZXJzIGluZGV4IG9ubHkgdGhlIHJldHVybmVkIHJlYnVpbGQgcGF0aHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNlZWQsIGN1cnJlbnQgZmlsZSB0cmVlIGFuZCBjb250ZW50LWhhc2ggcmVhZGVyLlxuICogQHJldHVybnMgUmV1c2FibGUgcmVjb3JkcyBhbmQgdGhlIHBhdGhzIHRoYXQgc3RpbGwgbmVlZCBpbmRleGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YVN0b3JlU2VlZChwYXJhbXM6IFZhbGlkYXRlRGF0YVN0b3JlU2VlZFBhcmFtcyk6IFByb21pc2U8RGF0YVN0b3JlU2VlZFZhbGlkYXRpb24+IHtcbiAgY29uc3Qgc2VlZCA9IG5ldyBNYXAocGFyYW1zLmVudHJpZXMubWFwKChlbnRyeSkgPT4gW2VudHJ5LnBhdGgsIGVudHJ5XSkpO1xuICBjb25zdCByZXVzYWJsZTogRGF0YVN0b3JlU2VlZEVudHJ5W10gPSBbXTtcbiAgY29uc3QgcmVidWlsZDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIHBhcmFtcy5maWxlcykge1xuICAgIGNvbnN0IGVudHJ5ID0gc2VlZC5nZXQoZmlsZS5wYXRoKTtcbiAgICBpZiAoZW50cnk/LnNpemUgPT09IGZpbGUuc2l6ZSAmJiAoZW50cnkubXRpbWUgPT09IGZpbGUubXRpbWUgfHwgZW50cnkuaGFzaCA9PT0gYXdhaXQgcGFyYW1zLmhhc2hGaWxlKGZpbGUucGF0aCkpKSB7XG4gICAgICByZXVzYWJsZS5wdXNoKHsgLi4uZW50cnksIC4uLmZpbGUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYnVpbGQucHVzaChmaWxlLnBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByZWJ1aWxkLCByZXVzYWJsZSB9O1xufVxuXG5mdW5jdGlvbiBpc1NlZWQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTZWVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2Zvcm1hdCcgaW4gdmFsdWUgJiYgdmFsdWUuZm9ybWF0ID09PSAxXG4gICAgJiYgJ3RpbWUnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aW1lID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUudGltZSlcbiAgICAmJiAnZW50cmllcycgaW4gdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5lbnRyaWVzKSAmJiB2YWx1ZS5lbnRyaWVzLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICAgIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3BhdGgnIGluIGVudHJ5ICYmIHR5cGVvZiBlbnRyeS5wYXRoID09PSAnc3RyaW5nJ1xuICAgICAgJiYgJ210aW1lJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkubXRpbWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShlbnRyeS5tdGltZSlcbiAgICAgICYmICdzaXplJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkuc2l6ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGVudHJ5LnNpemUpXG4gICAgICAmJiAnaGFzaCcgaW4gZW50cnkgJiYgdHlwZW9mIGVudHJ5Lmhhc2ggPT09ICdzdHJpbmcnICYmICd2YWx1ZScgaW4gZW50cnkgJiYgaXNEYXRhU3RvcmVKc29uVmFsdWUoZW50cnkudmFsdWUpXG4gICAgKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBV0EsZ0NBQXFDO0FBQ3JDLGtDQUFtQztBQWdHNUIsTUFBTSxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVosWUFBWSxRQUF5QztBQUMxRCxTQUFLLFFBQVEsT0FBTztBQUNwQixTQUFLLFFBQVEsT0FBTztBQUNwQixTQUFLLFlBQVksT0FBTztBQUFBLEVBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLFFBQVEsU0FBMEQ7QUFDN0UsUUFBSSxDQUFDLEtBQUssT0FBTztBQUNmLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTyxNQUFNLEtBQUssTUFBTSxVQUFVLFlBQVk7QUFDNUMsWUFBTSxTQUFTLE1BQU0sS0FBSyxNQUFNLFlBQVksa0JBQWtCLE9BQU8sT0FBTyxXQUFXLENBQUM7QUFD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
|