sliftutils 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitignore +38 -0
- package/assets/icon128.png +0 -0
- package/assets/icon16.png +0 -0
- package/assets/icon48.png +0 -0
- package/build-electron/assets/icon128.png +0 -0
- package/build-electron/assets/icon16.png +0 -0
- package/build-electron/assets/icon48.png +0 -0
- package/build-electron/electron/electronIndex.html +12 -0
- package/build-electron/electronMain.js +5185 -0
- package/build-electron/electronRenderer.js +20852 -0
- package/build-extension/assets/icon128.png +0 -0
- package/build-extension/assets/icon16.png +0 -0
- package/build-extension/assets/icon48.png +0 -0
- package/build-extension/extBackground.js +5246 -0
- package/build-extension/extContentScript.js +5243 -0
- package/build-extension/manifest.json +29 -0
- package/build-nodejs/server.js +198610 -0
- package/build-web/assets/icon128.png +0 -0
- package/build-web/assets/icon16.png +0 -0
- package/build-web/assets/icon48.png +0 -0
- package/build-web/browser.js +199266 -0
- package/build-web/web/index.html +32 -0
- package/builders/dist/electronBuild.ts.cache +105 -0
- package/builders/dist/extensionBuild.ts.cache +146 -0
- package/builders/dist/generateIndexDts.ts.cache +74 -0
- package/builders/dist/hotReload.ts.cache +93 -0
- package/builders/dist/nodeJSBuild.ts.cache +29 -0
- package/builders/dist/watch.ts.cache +163 -0
- package/builders/dist/webBuild.ts.cache +81 -0
- package/builders/generateIndexDts.ts +1 -1
- package/bundler/dist/bundleEntry.ts.cache +48 -0
- package/bundler/dist/bundleEntryCaller.ts.cache +18 -0
- package/bundler/dist/bundleRequire.ts.cache +246 -0
- package/bundler/dist/bundleWrapper.ts.cache +101 -0
- package/bundler/dist/bundler.ts.cache +66 -0
- package/bundler/dist/sourceMaps.ts.cache +210 -0
- package/dist/electronMain.ts.cache +27 -0
- package/dist/electronRenderer.tsx.cache +62 -0
- package/electron/dist/electronMain.ts.cache +26 -0
- package/electron/dist/electronRenderer.tsx.cache +64 -0
- package/extension/dist/extBackground.ts.cache +20 -0
- package/extension/dist/extContentScript.ts.cache +17 -0
- package/index.d.ts +478 -0
- package/misc/dist/environment.ts.cache +50 -0
- package/misc/dist/fs.ts.cache +29 -0
- package/nodejs/dist/exampleFile.ts.cache +11 -0
- package/nodejs/dist/server.ts.cache +15 -0
- package/package.json +5 -1
- package/render-utils/dist/observer.tsx.cache +33 -0
- package/storage/CachedStorage.d.ts +2 -0
- package/storage/DelayedStorage.d.ts +14 -0
- package/storage/DiskCollection.d.ts +99 -0
- package/storage/FileFolderAPI.d.ts +71 -0
- package/storage/IStorage.d.ts +38 -0
- package/storage/IndexedDBFileFolderAPI.d.ts +6 -0
- package/storage/JSONStorage.d.ts +16 -0
- package/storage/PendingManager.d.ts +6 -0
- package/storage/PendingStorage.d.ts +18 -0
- package/storage/PrivateFileSystemStorage.d.ts +23 -0
- package/storage/StorageObservable.d.ts +32 -0
- package/storage/TransactionStorage.d.ts +46 -0
- package/storage/dist/CachedStorage.ts.cache +31 -0
- package/storage/dist/DelayedStorage.ts.cache +35 -0
- package/storage/dist/DiskCollection.ts.cache +241 -0
- package/storage/dist/FileFolderAPI.tsx.cache +345 -0
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +142 -0
- package/storage/dist/JSONStorage.ts.cache +38 -0
- package/storage/dist/PendingManager.tsx.cache +73 -0
- package/storage/dist/PendingStorage.ts.cache +49 -0
- package/storage/dist/PrivateFileSystemStorage.ts.cache +178 -0
- package/storage/dist/StorageObservable.ts.cache +120 -0
- package/storage/dist/TransactionStorage.ts.cache +421 -0
- package/storage/dist/fileSystemPointer.ts.cache +77 -0
- package/storage/fileSystemPointer.d.ts +11 -0
- package/tsconfig.declarations.json +3 -1
- package/web/dist/browser.tsx.cache +66 -0
- package/yarn.lock +1752 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
12
|
+
//exports.resetStorageLocation = exports.getFileStorage = exports.getFileStorageNested = exports.getDirectoryHandle = void 0;
|
|
13
|
+
const preact_1 = __importDefault(require("preact"));
|
|
14
|
+
const fileSystemPointer_1 = require("./fileSystemPointer");
|
|
15
|
+
const mobxTyped_1 = require("../misc/mobxTyped");
|
|
16
|
+
const observer_1 = require("../misc/observer");
|
|
17
|
+
const caching_1 = require("socket-function/src/caching");
|
|
18
|
+
const typesafecss_1 = require("typesafecss");
|
|
19
|
+
const batching_1 = require("socket-function/src/batching");
|
|
20
|
+
const IndexedDBFileFolderAPI_1 = require("./IndexedDBFileFolderAPI");
|
|
21
|
+
const fs_1 = __importDefault(require("fs"));
|
|
22
|
+
const path_1 = __importDefault(require("path"));
|
|
23
|
+
// NOTE: IndexedDB is required for iOS, at least. We MIGHT want to make
|
|
24
|
+
// this a user supported toggle too, so they can choose during runtime if they want it.
|
|
25
|
+
// DO NOT enable this is isNode
|
|
26
|
+
const USE_INDEXED_DB = false;
|
|
27
|
+
let displayData = (0, mobxTyped_1.observable)({
|
|
28
|
+
ui: undefined,
|
|
29
|
+
}, undefined, { deep: false });
|
|
30
|
+
const storageKey = "syncFileSystemCamera3";
|
|
31
|
+
let DirectoryPrompter = class DirectoryPrompter extends preact_1.default.Component {
|
|
32
|
+
render() {
|
|
33
|
+
if (!displayData.ui)
|
|
34
|
+
return undefined;
|
|
35
|
+
return (preact_1.default.createElement("div", { className: typesafecss_1.css.position("fixed").pos(0, 0).size("100vw", "100vh")
|
|
36
|
+
.zIndex(1)
|
|
37
|
+
.background("white")
|
|
38
|
+
.center
|
|
39
|
+
.fontSize(40) }, displayData.ui));
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
DirectoryPrompter = __decorate([
|
|
43
|
+
observer_1.observer
|
|
44
|
+
], DirectoryPrompter);
|
|
45
|
+
class NodeJSFileHandleWrapper {
|
|
46
|
+
constructor(filePath) {
|
|
47
|
+
this.filePath = filePath;
|
|
48
|
+
}
|
|
49
|
+
async getFile() {
|
|
50
|
+
const stats = await fs_1.default.promises.stat(this.filePath);
|
|
51
|
+
return {
|
|
52
|
+
size: stats.size,
|
|
53
|
+
lastModified: stats.mtimeMs,
|
|
54
|
+
arrayBuffer: async () => {
|
|
55
|
+
const buffer = await fs_1.default.promises.readFile(this.filePath);
|
|
56
|
+
return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async createWritable(config) {
|
|
61
|
+
let fileHandle;
|
|
62
|
+
const flags = (config === null || config === void 0 ? void 0 : config.keepExistingData) ? "r+" : "w";
|
|
63
|
+
// Ensure the directory exists
|
|
64
|
+
await fs_1.default.promises.mkdir(path_1.default.dirname(this.filePath), { recursive: true });
|
|
65
|
+
// Open or create the file
|
|
66
|
+
if ((config === null || config === void 0 ? void 0 : config.keepExistingData) && await fs_1.default.promises.access(this.filePath).then(() => true).catch(() => false)) {
|
|
67
|
+
fileHandle = await fs_1.default.promises.open(this.filePath, flags);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
fileHandle = await fs_1.default.promises.open(this.filePath, "w");
|
|
71
|
+
}
|
|
72
|
+
let position = 0;
|
|
73
|
+
return {
|
|
74
|
+
seek: async (offset) => {
|
|
75
|
+
position = offset;
|
|
76
|
+
},
|
|
77
|
+
write: async (value) => {
|
|
78
|
+
await fileHandle.write(value, 0, value.length, position);
|
|
79
|
+
position += value.length;
|
|
80
|
+
},
|
|
81
|
+
close: async () => {
|
|
82
|
+
await fileHandle.close();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
class NodeJSDirectoryHandleWrapper {
|
|
88
|
+
constructor(rootPath) {
|
|
89
|
+
this.rootPath = rootPath;
|
|
90
|
+
}
|
|
91
|
+
async removeEntry(key, options) {
|
|
92
|
+
const entryPath = path_1.default.join(this.rootPath, key);
|
|
93
|
+
if (options === null || options === void 0 ? void 0 : options.recursive) {
|
|
94
|
+
await fs_1.default.promises.rm(entryPath, { recursive: true, force: true });
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
await fs_1.default.promises.unlink(entryPath);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async getFileHandle(key, options) {
|
|
101
|
+
const filePath = path_1.default.join(this.rootPath, key);
|
|
102
|
+
const exists = await fs_1.default.promises.access(filePath).then(() => true).catch(() => false);
|
|
103
|
+
if (!exists && (options === null || options === void 0 ? void 0 : options.create)) {
|
|
104
|
+
// Ensure the directory exists
|
|
105
|
+
await fs_1.default.promises.mkdir(path_1.default.dirname(filePath), { recursive: true });
|
|
106
|
+
// Create the file
|
|
107
|
+
await fs_1.default.promises.writeFile(filePath, Buffer.alloc(0));
|
|
108
|
+
}
|
|
109
|
+
else if (!exists) {
|
|
110
|
+
throw new Error(`File not found: ${filePath}`);
|
|
111
|
+
}
|
|
112
|
+
return new NodeJSFileHandleWrapper(filePath);
|
|
113
|
+
}
|
|
114
|
+
async getDirectoryHandle(key, options) {
|
|
115
|
+
const dirPath = path_1.default.join(this.rootPath, key);
|
|
116
|
+
if (options === null || options === void 0 ? void 0 : options.create) {
|
|
117
|
+
await fs_1.default.promises.mkdir(dirPath, { recursive: true });
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const exists = await fs_1.default.promises.access(dirPath).then(() => true).catch(() => false);
|
|
121
|
+
if (!exists) {
|
|
122
|
+
throw new Error(`Directory not found: ${dirPath}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return new NodeJSDirectoryHandleWrapper(dirPath);
|
|
126
|
+
}
|
|
127
|
+
async *[Symbol.asyncIterator]() {
|
|
128
|
+
// Ensure directory exists
|
|
129
|
+
await fs_1.default.promises.mkdir(this.rootPath, { recursive: true });
|
|
130
|
+
const entries = await fs_1.default.promises.readdir(this.rootPath, { withFileTypes: true });
|
|
131
|
+
for (const entry of entries) {
|
|
132
|
+
if (entry.isFile()) {
|
|
133
|
+
yield [entry.name, {
|
|
134
|
+
kind: "file",
|
|
135
|
+
name: entry.name,
|
|
136
|
+
getFile: async () => new NodeJSFileHandleWrapper(path_1.default.join(this.rootPath, entry.name))
|
|
137
|
+
}];
|
|
138
|
+
}
|
|
139
|
+
else if (entry.isDirectory()) {
|
|
140
|
+
const dirPath = path_1.default.join(this.rootPath, entry.name);
|
|
141
|
+
yield [entry.name, {
|
|
142
|
+
kind: "directory",
|
|
143
|
+
name: entry.name,
|
|
144
|
+
getDirectoryHandle: async (key, options) => {
|
|
145
|
+
return new NodeJSDirectoryHandleWrapper(dirPath).getDirectoryHandle(key, options);
|
|
146
|
+
}
|
|
147
|
+
}];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// NOTE: Blocks until the user provides a directory
|
|
153
|
+
exports.getDirectoryHandle = (0, caching_1.lazy)(async function getDirectoryHandle() {
|
|
154
|
+
if ((0, typesafecss_1.isNode)()) {
|
|
155
|
+
return new NodeJSDirectoryHandleWrapper(path_1.default.resolve("./data/"));
|
|
156
|
+
}
|
|
157
|
+
let root = document.createElement("div");
|
|
158
|
+
document.body.appendChild(root);
|
|
159
|
+
preact_1.default.render(preact_1.default.createElement(DirectoryPrompter, null), root);
|
|
160
|
+
try {
|
|
161
|
+
let handle;
|
|
162
|
+
let storedId = localStorage.getItem(storageKey);
|
|
163
|
+
if (storedId) {
|
|
164
|
+
let doneLoad = false;
|
|
165
|
+
setTimeout(() => {
|
|
166
|
+
if (doneLoad)
|
|
167
|
+
return;
|
|
168
|
+
console.log("Waiting for user to click");
|
|
169
|
+
displayData.ui = "Click anywhere to allow file system access";
|
|
170
|
+
}, 500);
|
|
171
|
+
try {
|
|
172
|
+
handle = await tryToLoadPointer(storedId);
|
|
173
|
+
}
|
|
174
|
+
catch (_a) { }
|
|
175
|
+
doneLoad = true;
|
|
176
|
+
if (handle) {
|
|
177
|
+
return handle;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
let fileCallback;
|
|
181
|
+
let promise = new Promise(resolve => {
|
|
182
|
+
fileCallback = resolve;
|
|
183
|
+
});
|
|
184
|
+
displayData.ui = (preact_1.default.createElement("button", { className: typesafecss_1.css.fontSize(40).pad2(80, 40), onClick: async () => {
|
|
185
|
+
console.log("Waiting for user to give permission");
|
|
186
|
+
const handle = await window.showDirectoryPicker();
|
|
187
|
+
await handle.requestPermission({ mode: "readwrite" });
|
|
188
|
+
let storedId = await (0, fileSystemPointer_1.storeFileSystemPointer)({ mode: "readwrite", handle });
|
|
189
|
+
localStorage.setItem(storageKey, storedId);
|
|
190
|
+
fileCallback(handle);
|
|
191
|
+
} }, "Pick Media Directory"));
|
|
192
|
+
return await promise;
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
preact_1.default.render(null, root);
|
|
196
|
+
root.remove();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
exports.getFileStorageNested = (0, caching_1.cache)(async function getFileStorage(path) {
|
|
200
|
+
let base = await (0, exports.getDirectoryHandle)();
|
|
201
|
+
for (let part of path.split("/")) {
|
|
202
|
+
if (!part)
|
|
203
|
+
continue;
|
|
204
|
+
base = await base.getDirectoryHandle(part, { create: true });
|
|
205
|
+
}
|
|
206
|
+
return wrapHandle(base);
|
|
207
|
+
});
|
|
208
|
+
exports.getFileStorage = (0, caching_1.lazy)(async function getFileStorage() {
|
|
209
|
+
if (USE_INDEXED_DB) {
|
|
210
|
+
return await (0, IndexedDBFileFolderAPI_1.getFileStorageIndexDB)();
|
|
211
|
+
}
|
|
212
|
+
let handle = await (0, exports.getDirectoryHandle)();
|
|
213
|
+
return wrapHandle(handle);
|
|
214
|
+
});
|
|
215
|
+
function resetStorageLocation() {
|
|
216
|
+
localStorage.removeItem(storageKey);
|
|
217
|
+
window.location.reload();
|
|
218
|
+
}
|
|
219
|
+
exports.resetStorageLocation = resetStorageLocation;
|
|
220
|
+
let appendQueue = (0, caching_1.cache)((key) => {
|
|
221
|
+
return (0, batching_1.runInSerial)((fnc) => fnc());
|
|
222
|
+
});
|
|
223
|
+
async function fixedGetFileHandle(config) {
|
|
224
|
+
if (config.key.includes("/")) {
|
|
225
|
+
throw new Error(`Cannot use folders directly in file system read / writes. Use a wrapper which handles the folder navigation. Path was ${JSON.stringify(config.key)}`);
|
|
226
|
+
}
|
|
227
|
+
// ALWAYS try without create, because the sshfs-win sucks and doesn't support `create: true`? Wtf...
|
|
228
|
+
try {
|
|
229
|
+
return await config.handle.getFileHandle(config.key);
|
|
230
|
+
}
|
|
231
|
+
catch (_a) {
|
|
232
|
+
if (!config.create)
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
return await config.handle.getFileHandle(config.key, { create: true });
|
|
236
|
+
}
|
|
237
|
+
function wrapHandleFiles(handle) {
|
|
238
|
+
return {
|
|
239
|
+
async getInfo(key) {
|
|
240
|
+
try {
|
|
241
|
+
const file = await handle.getFileHandle(key);
|
|
242
|
+
const fileContent = await file.getFile();
|
|
243
|
+
return {
|
|
244
|
+
size: fileContent.size,
|
|
245
|
+
lastModified: fileContent.lastModified,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
async get(key) {
|
|
253
|
+
try {
|
|
254
|
+
const file = await handle.getFileHandle(key);
|
|
255
|
+
const fileContent = await file.getFile();
|
|
256
|
+
const arrayBuffer = await fileContent.arrayBuffer();
|
|
257
|
+
return Buffer.from(arrayBuffer);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
return undefined;
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
async append(key, value) {
|
|
264
|
+
await appendQueue(key)(async () => {
|
|
265
|
+
// NOTE: Interesting point. Chrome doesn't optimize this to be an append, and instead
|
|
266
|
+
// rewrites the entire file.
|
|
267
|
+
const file = await fixedGetFileHandle({ handle, key, create: true });
|
|
268
|
+
const writable = await file.createWritable({ keepExistingData: true });
|
|
269
|
+
let offset = (await file.getFile()).size;
|
|
270
|
+
await writable.seek(offset);
|
|
271
|
+
await writable.write(value);
|
|
272
|
+
await writable.close();
|
|
273
|
+
});
|
|
274
|
+
},
|
|
275
|
+
async set(key, value) {
|
|
276
|
+
const file = await fixedGetFileHandle({ handle, key, create: true });
|
|
277
|
+
const writable = await file.createWritable();
|
|
278
|
+
await writable.write(value);
|
|
279
|
+
await writable.close();
|
|
280
|
+
},
|
|
281
|
+
async remove(key) {
|
|
282
|
+
await handle.removeEntry(key);
|
|
283
|
+
},
|
|
284
|
+
async getKeys() {
|
|
285
|
+
const keys = [];
|
|
286
|
+
for await (const [name, entry] of handle) {
|
|
287
|
+
if (entry.kind === "file") {
|
|
288
|
+
keys.push(entry.name);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return keys;
|
|
292
|
+
},
|
|
293
|
+
async reset() {
|
|
294
|
+
for await (const [name, entry] of handle) {
|
|
295
|
+
await handle.removeEntry(entry.name, { recursive: true });
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function wrapHandleNested(handle) {
|
|
301
|
+
return {
|
|
302
|
+
async hasKey(key) {
|
|
303
|
+
try {
|
|
304
|
+
await handle.getDirectoryHandle(key);
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
async getStorage(key) {
|
|
312
|
+
const subDirectory = await handle.getDirectoryHandle(key, { create: true });
|
|
313
|
+
return wrapHandle(subDirectory);
|
|
314
|
+
},
|
|
315
|
+
async removeStorage(key) {
|
|
316
|
+
await handle.removeEntry(key, { recursive: true });
|
|
317
|
+
},
|
|
318
|
+
async getKeys() {
|
|
319
|
+
const keys = [];
|
|
320
|
+
for await (const [name, entry] of handle) {
|
|
321
|
+
if (entry.kind === "directory") {
|
|
322
|
+
keys.push(entry.name);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return keys;
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
function wrapHandle(handle) {
|
|
330
|
+
return {
|
|
331
|
+
...wrapHandleFiles(handle),
|
|
332
|
+
folder: wrapHandleNested(handle),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
async function tryToLoadPointer(pointer) {
|
|
336
|
+
let result = await (0, fileSystemPointer_1.getFileSystemPointer)({ pointer });
|
|
337
|
+
if (!result)
|
|
338
|
+
return;
|
|
339
|
+
let handle = await (result === null || result === void 0 ? void 0 : result.onUserActivation());
|
|
340
|
+
if (!handle)
|
|
341
|
+
return;
|
|
342
|
+
return handle;
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUZvbGRlckFQSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkZpbGVGb2xkZXJBUEkudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QiwyREFBbUY7QUFDbkYsaURBQStDO0FBQy9DLCtDQUE0QztBQUM1Qyx5REFBMEQ7QUFDMUQsNkNBQTBDO0FBRTFDLDJEQUEyRDtBQUMzRCxxRUFBaUU7QUFDakUsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUV4Qix1RUFBdUU7QUFDdkUsd0ZBQXdGO0FBQ3hGLCtCQUErQjtBQUMvQixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUM7QUE2QjdCLElBQUksV0FBVyxHQUFHLElBQUEsc0JBQVUsRUFBQztJQUN6QixFQUFFLEVBQUUsU0FBaUQ7Q0FDeEQsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUUvQixNQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQztBQUczQyxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLGdCQUFNLENBQUMsU0FBUztJQUM1QyxNQUFNO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdEMsT0FBTyxDQUNILHdDQUFLLFNBQVMsRUFDVixpQkFBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDO2lCQUNqRCxNQUFNLENBQUMsQ0FBQyxDQUFDO2lCQUNULFVBQVUsQ0FBQyxPQUFPLENBQUM7aUJBQ25CLE1BQU07aUJBQ04sUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUVoQixXQUFXLENBQUMsRUFBRSxDQUNiLENBQ1QsQ0FBQztJQUNOLENBQUM7Q0FDSixDQUFBO0FBZkssaUJBQWlCO0lBRHRCLG1CQUFRO0dBQ0gsaUJB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VztZQUMzQixNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELEtBQUssQ0FBQyxPQUFPO1lBQ1QsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO1lBQzFCLElBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztLQUNKLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsTUFBd0I7SUFDeEMsT0FBTztRQUNILEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUMxQixNQUFNLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO0tBQ25DLENBQUM7QUFDTixDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUFDLE9BQWU7SUFDM0MsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFBLHdDQUFvQixFQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU87SUFDcEIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxnQkFBZ0IsRUFBRSxDQUFBLENBQUM7SUFDOUMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPO0lBQ3BCLE9BQU8sTUFBaUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHByZWFjdCBmcm9tIFwicHJlYWN0XCI7XG5pbXBvcnQgeyBnZXRGaWxlU3lzdGVtUG9pbnRlciwgc3RvcmVGaWxlU3lzdGVtUG9pbnRlciB9IGZyb20gXCIuL2ZpbGVTeXN0ZW1Qb2ludGVyXCI7XG5pbXBvcnQgeyBvYnNlcnZhYmxlIH0gZnJvbSBcIi4uL21pc2MvbW9ieFR5cGVkXCI7XG5pbXBvcnQgeyBvYnNlcnZlciB9IGZyb20gXCIuLi9taXNjL29ic2VydmVyXCI7XG5pbXBvcnQgeyBjYWNoZSwgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGNzcywgaXNOb2RlIH0gZnJvbSBcInR5cGVzYWZlY3NzXCI7XG5pbXBvcnQgeyBJU3RvcmFnZVJhdyB9IGZyb20gXCIuL0lTdG9yYWdlXCI7XG5pbXBvcnQgeyBydW5JblNlcmlhbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRGaWxlU3RvcmFnZUluZGV4REIgfSBmcm9tIFwiLi9JbmRleGVkREJGaWxlRm9sZGVyQVBJXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG4vLyBOT1RFOiBJbmRleGVkREIgaXMgcmVxdWlyZWQgZm9yIGlPUywgYXQgbGVhc3QuIFdlIE1JR0hUIHdhbnQgdG8gbWFrZVxuLy8gIHRoaXMgYSB1c2VyIHN1cHBvcnRlZCB0b2dnbGUgdG9vLCBzbyB0aGV5IGNhbiBjaG9vc2UgZHVyaW5nIHJ1bnRpbWUgaWYgdGhleSB3YW50IGl0LlxuLy8gRE8gTk9UIGVuYWJsZSB0aGlzIGlzIGlzTm9kZVxuY29uc3QgVVNFX0lOREVYRURfREIgPSBmYWxzZTtcblxudHlwZSBGaWxlV3JhcHBlciA9IHtcbiAgICBnZXRGaWxlKCk6IFByb21pc2U8e1xuICAgICAgICBzaXplOiBudW1iZXI7XG4gICAgICAgIGxhc3RNb2RpZmllZDogbnVtYmVyO1xuICAgICAgICBhcnJheUJ1ZmZlcigpOiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICB9PjtcbiAgICBjcmVhdGVXcml0YWJsZShjb25maWc/OiB7IGtlZXBFeGlzdGluZ0RhdGE/OiBib29sZWFuIH0pOiBQcm9taXNlPHtcbiAgICAgICAgc2VlayhvZmZzZXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG4gICAgICAgIHdyaXRlKHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuICAgIH0+O1xufTtcbnR5cGUgRGlyZWN0b3J5V3JhcHBlciA9IHtcbiAgICByZW1vdmVFbnRyeShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRGaWxlSGFuZGxlKGtleTogc3RyaW5nLCBvcHRpb25zPzogeyBjcmVhdGU/OiBib29sZWFuIH0pOiBQcm9taXNlPEZpbGVXcmFwcGVyPjtcbiAgICBnZXREaXJlY3RvcnlIYW5kbGUoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNyZWF0ZT86IGJvb2xlYW4gfSk6IFByb21pc2U8RGlyZWN0b3J5V3JhcHBlcj47XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywge1xuICAgICAgICBraW5kOiBcImZpbGVcIjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBnZXRGaWxlKCk6IFByb21pc2U8RmlsZVdyYXBwZXI+O1xuICAgIH0gfCB7XG4gICAgICAgIGtpbmQ6IFwiZGlyZWN0b3J5XCI7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZ2V0RGlyZWN0b3J5SGFuZGxlKGtleTogc3RyaW5nLCBvcHRpb25zPzogeyBjcmVhdGU/OiBib29sZWFuIH0pOiBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+O1xuICAgIH1dPjtcbn07XG5cbmxldCBkaXNwbGF5RGF0YSA9IG9ic2VydmFibGUoe1xuICAgIHVpOiB1bmRlZmluZWQgYXMgdW5kZWZpbmVkIHwgcHJlYWN0LkNvbXBvbmVudENoaWxkcmVuLFxufSwgdW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pO1xuXG5jb25zdCBzdG9yYWdlS2V5ID0gXCJzeW5jRmlsZVN5c3RlbUNhbWVyYTNcIjtcblxuQG9ic2VydmVyXG5jbGFzcyBEaXJlY3RvcnlQcm9tcHRlciBleHRlbmRzIHByZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKCFkaXNwbGF5RGF0YS51aSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICBjc3MucG9zaXRpb24oXCJmaXhlZFwiKS5wb3MoMCwgMCkuc2l6ZShcIjEwMHZ3XCIsIFwiMTAwdmhcIilcbiAgICAgICAgICAgICAgICAgICAgLnpJbmRleCgxKVxuICAgICAgICAgICAgICAgICAgICAuYmFja2dyb3VuZChcIndoaXRlXCIpXG4gICAgICAgICAgICAgICAgICAgIC5jZW50ZXJcbiAgICAgICAgICAgICAgICAgICAgLmZvbnRTaXplKDQwKVxuICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgICB7ZGlzcGxheURhdGEudWl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmNsYXNzIE5vZGVKU0ZpbGVIYW5kbGVXcmFwcGVyIGltcGxlbWVudHMgRmlsZVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsZVBhdGg6IHN0cmluZykge1xuICAgIH1cblxuICAgIGFzeW5jIGdldEZpbGUoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdCh0aGlzLmZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNpemU6IHN0YXRzLnNpemUsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHN0YXRzLm10aW1lTXMsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHRoaXMuZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIuYnVmZmVyLnNsaWNlKGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZU9mZnNldCArIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGVXcml0YWJsZShjb25maWc/OiB7IGtlZXBFeGlzdGluZ0RhdGE/OiBib29sZWFuIH0pIHtcbiAgICAgICAgbGV0IGZpbGVIYW5kbGU6IGZzLnByb21pc2VzLkZpbGVIYW5kbGU7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gY29uZmlnPy5rZWVwRXhpc3RpbmdEYXRhID8gXCJyK1wiIDogXCJ3XCI7XG5cbiAgICAgICAgLy8gRW5zdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZSh0aGlzLmZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gT3BlbiBvciBjcmVhdGUgdGhlIGZpbGVcbiAgICAgICAgaWYgKGNvbmZpZz8ua2VlcEV4aXN0aW5nRGF0YSAmJiBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3ModGhpcy5maWxlUGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSkpIHtcbiAgICAgICAgICAgIGZpbGVIYW5kbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKHRoaXMuZmlsZVBhdGgsIGZsYWdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbGVIYW5kbGUgPSBhd2FpdCBmcy5wcm9taXNlcy5vcGVuKHRoaXMuZmlsZVBhdGgsIFwid1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3NpdGlvbiA9IDA7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlZWs6IGFzeW5jIChvZmZzZXQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gb2Zmc2V0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRlOiBhc3luYyAodmFsdWU6IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZpbGVIYW5kbGUud3JpdGUodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbG9zZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZpbGVIYW5kbGUuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmNsYXNzIE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIgaW1wbGVtZW50cyBEaXJlY3RvcnlXcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvb3RQYXRoOiBzdHJpbmcpIHtcbiAgICB9XG5cbiAgICBhc3luYyByZW1vdmVFbnRyeShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHBhdGguam9pbih0aGlzLnJvb3RQYXRoLCBrZXkpO1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVjdXJzaXZlKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShlbnRyeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhlbnRyeVBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0RmlsZUhhbmRsZShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxGaWxlV3JhcHBlcj4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnJvb3RQYXRoLCBrZXkpO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IGZzLnByb21pc2VzLmFjY2VzcyhmaWxlUGF0aCkudGhlbigoKSA9PiB0cnVlKS5jYXRjaCgoKSA9PiBmYWxzZSk7XG5cbiAgICAgICAgaWYgKCFleGlzdHMgJiYgb3B0aW9ucz8uY3JlYXRlKSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIEJ1ZmZlci5hbGxvYygwKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTm9kZUpTRmlsZUhhbmRsZVdyYXBwZXIoZmlsZVBhdGgpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldERpcmVjdG9yeUhhbmRsZShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxEaXJlY3RvcnlXcmFwcGVyPiB7XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290UGF0aCwga2V5KTtcblxuICAgICAgICBpZiAob3B0aW9ucz8uY3JlYXRlKSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IGZzLnByb21pc2VzLmFjY2VzcyhkaXJQYXRoKS50aGVuKCgpID0+IHRydWUpLmNhdGNoKCgpID0+IGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXJlY3Rvcnkgbm90IGZvdW5kOiAke2RpclBhdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE5vZGVKU0RpcmVjdG9yeUhhbmRsZVdyYXBwZXIoZGlyUGF0aCk7XG4gICAgfVxuXG4gICAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHtcbiAgICAgICAga2luZDogXCJmaWxlXCI7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgZ2V0RmlsZSgpOiBQcm9taXNlPEZpbGVXcmFwcGVyPjtcbiAgICB9IHwge1xuICAgICAgICBraW5kOiBcImRpcmVjdG9yeVwiO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGdldERpcmVjdG9yeUhhbmRsZShrZXk6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxEaXJlY3RvcnlXcmFwcGVyPjtcbiAgICB9XT4ge1xuICAgICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih0aGlzLnJvb3RQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aGlzLnJvb3RQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbZW50cnkubmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBraW5kOiBcImZpbGVcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZTogYXN5bmMgKCkgPT4gbmV3IE5vZGVKU0ZpbGVIYW5kbGVXcmFwcGVyKHBhdGguam9pbih0aGlzLnJvb3RQYXRoLCBlbnRyeS5uYW1lKSlcbiAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4odGhpcy5yb290UGF0aCwgZW50cnkubmFtZSk7XG4gICAgICAgICAgICAgICAgeWllbGQgW2VudHJ5Lm5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAga2luZDogXCJkaXJlY3RvcnlcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RGlyZWN0b3J5SGFuZGxlOiBhc3luYyAoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGNyZWF0ZT86IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlSlNEaXJlY3RvcnlIYW5kbGVXcmFwcGVyKGRpclBhdGgpLmdldERpcmVjdG9yeUhhbmRsZShrZXksIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gTk9URTogQmxvY2tzIHVudGlsIHRoZSB1c2VyIHByb3ZpZGVzIGEgZGlyZWN0b3J5XG5leHBvcnQgY29uc3QgZ2V0RGlyZWN0b3J5SGFuZGxlID0gbGF6eShhc3luYyBmdW5jdGlvbiBnZXREaXJlY3RvcnlIYW5kbGUoKTogUHJvbWlzZTxEaXJlY3RvcnlXcmFwcGVyPiB7XG4gICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9kZUpTRGlyZWN0b3J5SGFuZGxlV3JhcHBlcihwYXRoLnJlc29sdmUoXCIuL2RhdGEvXCIpKTtcbiAgICB9XG4gICAgbGV0IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocm9vdCk7XG4gICAgcHJlYWN0LnJlbmRlcig8RGlyZWN0b3J5UHJvbXB0ZXIgLz4sIHJvb3QpO1xuICAgIHRyeSB7XG5cbiAgICAgICAgbGV0IGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlciB8IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgc3RvcmVkSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgaWYgKHN0b3JlZElkKSB7XG4gICAgICAgICAgICBsZXQgZG9uZUxvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkb25lTG9hZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV2FpdGluZyBmb3IgdXNlciB0byBjbGlja1wiKTtcbiAgICAgICAgICAgICAgICBkaXNwbGF5RGF0YS51aSA9IFwiQ2xpY2sgYW55d2hlcmUgdG8gYWxsb3cgZmlsZSBzeXN0ZW0gYWNjZXNzXCI7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgPSBhd2FpdCB0cnlUb0xvYWRQb2ludGVyKHN0b3JlZElkKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICBkb25lTG9hZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlsZUNhbGxiYWNrOiAoaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyKSA9PiB2b2lkO1xuICAgICAgICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlPERpcmVjdG9yeVdyYXBwZXI+KHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgZmlsZUNhbGxiYWNrID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRpc3BsYXlEYXRhLnVpID0gKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3NzLmZvbnRTaXplKDQwKS5wYWQyKDgwLCA0MCl9XG4gICAgICAgICAgICAgICAgb25DbGljaz17YXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIldhaXRpbmcgZm9yIHVzZXIgdG8gZ2l2ZSBwZXJtaXNzaW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB3aW5kb3cuc2hvd0RpcmVjdG9yeVBpY2tlcigpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUucmVxdWVzdFBlcm1pc3Npb24oeyBtb2RlOiBcInJlYWR3cml0ZVwiIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RvcmVkSWQgPSBhd2FpdCBzdG9yZUZpbGVTeXN0ZW1Qb2ludGVyKHsgbW9kZTogXCJyZWFkd3JpdGVcIiwgaGFuZGxlIH0pO1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBzdG9yZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVDYWxsYmFjayhoYW5kbGUgYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFBpY2sgTWVkaWEgRGlyZWN0b3J5XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcHJlYWN0LnJlbmRlcihudWxsLCByb290KTtcbiAgICAgICAgcm9vdC5yZW1vdmUoKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVTdG9yYWdlTmVzdGVkID0gY2FjaGUoYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZVN0b3JhZ2UocGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlU3RvcmFnZT4ge1xuICAgIGxldCBiYXNlID0gYXdhaXQgZ2V0RGlyZWN0b3J5SGFuZGxlKCk7XG4gICAgZm9yIChsZXQgcGFydCBvZiBwYXRoLnNwbGl0KFwiL1wiKSkge1xuICAgICAgICBpZiAoIXBhcnQpIGNvbnRpbnVlO1xuICAgICAgICBiYXNlID0gYXdhaXQgYmFzZS5nZXREaXJlY3RvcnlIYW5kbGUocGFydCwgeyBjcmVhdGU6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwSGFuZGxlKGJhc2UpO1xufSk7XG5leHBvcnQgY29uc3QgZ2V0RmlsZVN0b3JhZ2UgPSBsYXp5KGFzeW5jIGZ1bmN0aW9uIGdldEZpbGVTdG9yYWdlKCk6IFByb21pc2U8RmlsZVN0b3JhZ2U+IHtcbiAgICBpZiAoVVNFX0lOREVYRURfREIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldEZpbGVTdG9yYWdlSW5kZXhEQigpO1xuICAgIH1cblxuICAgIGxldCBoYW5kbGUgPSBhd2FpdCBnZXREaXJlY3RvcnlIYW5kbGUoKTtcbiAgICByZXR1cm4gd3JhcEhhbmRsZShoYW5kbGUpO1xufSk7XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRTdG9yYWdlTG9jYXRpb24oKSB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSk7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRGaWxlU3RvcmFnZSA9IHtcbiAgICBoYXNLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGdldFN0b3JhZ2Uoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEZpbGVTdG9yYWdlPjtcbiAgICByZW1vdmVTdG9yYWdlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgICBnZXRLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+O1xufTtcblxuZXhwb3J0IHR5cGUgRmlsZVN0b3JhZ2UgPSBJU3RvcmFnZVJhdyAmIHtcbiAgICBmb2xkZXI6IE5lc3RlZEZpbGVTdG9yYWdlO1xufTtcblxubGV0IGFwcGVuZFF1ZXVlID0gY2FjaGUoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgcmV0dXJuIHJ1bkluU2VyaWFsKChmbmM6ICgpID0+IFByb21pc2U8dm9pZD4pID0+IGZuYygpKTtcbn0pO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIGZpeGVkR2V0RmlsZUhhbmRsZShjb25maWc6IHtcbiAgICBoYW5kbGU6IERpcmVjdG9yeVdyYXBwZXI7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgY3JlYXRlOiB0cnVlO1xufSk6IFByb21pc2U8RmlsZVdyYXBwZXI+O1xuYXN5bmMgZnVuY3Rpb24gZml4ZWRHZXRGaWxlSGFuZGxlKGNvbmZpZzoge1xuICAgIGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlcjtcbiAgICBrZXk6IHN0cmluZztcbiAgICBjcmVhdGU/OiBib29sZWFuO1xufSk6IFByb21pc2U8RmlsZVdyYXBwZXIgfCB1bmRlZmluZWQ+O1xuYXN5bmMgZnVuY3Rpb24gZml4ZWRHZXRGaWxlSGFuZGxlKGNvbmZpZzoge1xuICAgIGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlcjtcbiAgICBrZXk6IHN0cmluZztcbiAgICBjcmVhdGU/OiBib29sZWFuO1xufSk6IFByb21pc2U8RmlsZVdyYXBwZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoY29uZmlnLmtleS5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlIGZvbGRlcnMgZGlyZWN0bHkgaW4gZmlsZSBzeXN0ZW0gcmVhZCAvIHdyaXRlcy4gVXNlIGEgd3JhcHBlciB3aGljaCBoYW5kbGVzIHRoZSBmb2xkZXIgbmF2aWdhdGlvbi4gUGF0aCB3YXMgJHtKU09OLnN0cmluZ2lmeShjb25maWcua2V5KX1gKTtcbiAgICB9XG4gICAgLy8gQUxXQVlTIHRyeSB3aXRob3V0IGNyZWF0ZSwgYmVjYXVzZSB0aGUgc3NoZnMtd2luIHN1Y2tzIGFuZCBkb2Vzbid0IHN1cHBvcnQgYGNyZWF0ZTogdHJ1ZWA/IFd0Zi4uLlxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb25maWcuaGFuZGxlLmdldEZpbGVIYW5kbGUoY29uZmlnLmtleSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGlmICghY29uZmlnLmNyZWF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGNvbmZpZy5oYW5kbGUuZ2V0RmlsZUhhbmRsZShjb25maWcua2V5LCB7IGNyZWF0ZTogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gd3JhcEhhbmRsZUZpbGVzKGhhbmRsZTogRGlyZWN0b3J5V3JhcHBlcik6IElTdG9yYWdlUmF3IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBoYW5kbGUuZ2V0RmlsZUhhbmRsZShrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgZmlsZS5nZXRGaWxlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogZmlsZUNvbnRlbnQuc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBmaWxlQ29udGVudC5sYXN0TW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGhhbmRsZS5nZXRGaWxlSGFuZGxlKGtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBmaWxlLmdldEZpbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGVDb250ZW50LmFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBhcHBlbmQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGF3YWl0IGFwcGVuZFF1ZXVlKGtleSkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IEludGVyZXN0aW5nIHBvaW50LiBDaHJvbWUgZG9lc24ndCBvcHRpbWl6ZSB0aGlzIHRvIGJlIGFuIGFwcGVuZCwgYW5kIGluc3RlYWRcbiAgICAgICAgICAgICAgICAvLyAgcmV3cml0ZXMgdGhlIGVudGlyZSBmaWxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBmaXhlZEdldEZpbGVIYW5kbGUoeyBoYW5kbGUsIGtleSwgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgZmlsZS5jcmVhdGVXcml0YWJsZSh7IGtlZXBFeGlzdGluZ0RhdGE6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IChhd2FpdCBmaWxlLmdldEZpbGUoKSkuc2l6ZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0YWJsZS5zZWVrKG9mZnNldCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUud3JpdGUodmFsdWUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBmaXhlZEdldEZpbGVIYW5kbGUoeyBoYW5kbGUsIGtleSwgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2FpdCBmaWxlLmNyZWF0ZVdyaXRhYmxlKCk7XG4gICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53cml0ZSh2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHJlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnJlbW92ZUVudHJ5KGtleSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0S2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgICAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBbbmFtZSwgZW50cnldIG9mIGhhbmRsZSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5raW5kID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goZW50cnkubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlLnJlbW92ZUVudHJ5KGVudHJ5Lm5hbWUsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHdyYXBIYW5kbGVOZXN0ZWQoaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyKTogTmVzdGVkRmlsZVN0b3JhZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIGFzeW5jIGhhc0tleShrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGUuZ2V0RGlyZWN0b3J5SGFuZGxlKGtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXRTdG9yYWdlKGtleTogc3RyaW5nKTogUHJvbWlzZTxGaWxlU3RvcmFnZT4ge1xuICAgICAgICAgICAgY29uc3Qgc3ViRGlyZWN0b3J5ID0gYXdhaXQgaGFuZGxlLmdldERpcmVjdG9yeUhhbmRsZShrZXksIHsgY3JlYXRlOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBIYW5kbGUoc3ViRGlyZWN0b3J5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyByZW1vdmVTdG9yYWdlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGUucmVtb3ZlRW50cnkoa2V5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXRLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmtpbmQgPT09IFwiZGlyZWN0b3J5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGVudHJ5Lm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHdyYXBIYW5kbGUoaGFuZGxlOiBEaXJlY3RvcnlXcmFwcGVyKTogRmlsZVN0b3JhZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLndyYXBIYW5kbGVGaWxlcyhoYW5kbGUpLFxuICAgICAgICBmb2xkZXI6IHdyYXBIYW5kbGVOZXN0ZWQoaGFuZGxlKSxcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiB0cnlUb0xvYWRQb2ludGVyKHBvaW50ZXI6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSBhd2FpdCBnZXRGaWxlU3lzdGVtUG9pbnRlcih7IHBvaW50ZXIgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybjtcbiAgICBsZXQgaGFuZGxlID0gYXdhaXQgcmVzdWx0Py5vblVzZXJBY3RpdmF0aW9uKCk7XG4gICAgaWYgKCFoYW5kbGUpIHJldHVybjtcbiAgICByZXR1cm4gaGFuZGxlIGFzIGFueSBhcyBEaXJlY3RvcnlXcmFwcGVyO1xufSJdfQ==
|
|
345
|
+
/* _JS_SOURCE_HASH = "2c171fd06df7fe1cfb75e04ee9f78c65385c23788b53f9fe0775b27670622e69"; */
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
+
//exports.getFileStorageIndexDB = void 0;
|
|
4
|
+
const caching_1 = require("socket-function/src/caching");
|
|
5
|
+
const DB_NAME = "FileStorage";
|
|
6
|
+
const STORE_NAME = "files";
|
|
7
|
+
const DB_VERSION = 1;
|
|
8
|
+
class VirtualFileStorage {
|
|
9
|
+
constructor(db, id) {
|
|
10
|
+
this.id = id;
|
|
11
|
+
// NestedFileStorage implementation
|
|
12
|
+
this.folder = {
|
|
13
|
+
hasKey: async (key) => {
|
|
14
|
+
const folderPath = this.id + key + "/";
|
|
15
|
+
const keys = await this.getKeysWithPrefix(folderPath);
|
|
16
|
+
return keys.length > 0;
|
|
17
|
+
},
|
|
18
|
+
getStorage: async (key) => {
|
|
19
|
+
const newPath = this.id + key + "/";
|
|
20
|
+
return new VirtualFileStorage(this.db, newPath);
|
|
21
|
+
},
|
|
22
|
+
removeStorage: async (key) => {
|
|
23
|
+
let nested = new VirtualFileStorage(this.db, this.id + key + "/");
|
|
24
|
+
await nested.reset();
|
|
25
|
+
},
|
|
26
|
+
getKeys: async () => {
|
|
27
|
+
let keys = await this.getKeysWithPrefix(this.id);
|
|
28
|
+
let folderKeys = new Set();
|
|
29
|
+
for (let key of keys) {
|
|
30
|
+
if (!key.includes("/"))
|
|
31
|
+
continue;
|
|
32
|
+
let parts = key.split("/");
|
|
33
|
+
folderKeys.add(parts[0]);
|
|
34
|
+
}
|
|
35
|
+
return Array.from(folderKeys);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
if (!db)
|
|
39
|
+
debugger;
|
|
40
|
+
this.db = db;
|
|
41
|
+
}
|
|
42
|
+
getStore(mode = "readonly") {
|
|
43
|
+
const transaction = this.db.transaction(STORE_NAME, mode);
|
|
44
|
+
return transaction.objectStore(STORE_NAME);
|
|
45
|
+
}
|
|
46
|
+
request(request) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
request.onsuccess = () => resolve(request.result);
|
|
49
|
+
request.onerror = () => reject(request.error);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// IStorageRaw implementation
|
|
53
|
+
async get(key) {
|
|
54
|
+
const store = this.getStore();
|
|
55
|
+
const result = await this.request(store.get(this.id + key));
|
|
56
|
+
let badBuffer = result === null || result === void 0 ? void 0 : result.data;
|
|
57
|
+
if (badBuffer)
|
|
58
|
+
badBuffer = Buffer.from(badBuffer);
|
|
59
|
+
return badBuffer;
|
|
60
|
+
}
|
|
61
|
+
async append(key, value) {
|
|
62
|
+
const store = this.getStore("readwrite");
|
|
63
|
+
const fullPath = this.id + key;
|
|
64
|
+
const existing = await this.request(store.get(fullPath));
|
|
65
|
+
const newRecord = {
|
|
66
|
+
data: existing
|
|
67
|
+
? Buffer.concat([existing.data, value])
|
|
68
|
+
: value,
|
|
69
|
+
lastModified: Date.now()
|
|
70
|
+
};
|
|
71
|
+
await this.request(store.put(newRecord, fullPath));
|
|
72
|
+
}
|
|
73
|
+
async set(key, value) {
|
|
74
|
+
const store = this.getStore("readwrite");
|
|
75
|
+
const record = {
|
|
76
|
+
data: value,
|
|
77
|
+
lastModified: Date.now()
|
|
78
|
+
};
|
|
79
|
+
await this.request(store.put(record, this.id + key));
|
|
80
|
+
}
|
|
81
|
+
async remove(key) {
|
|
82
|
+
const store = this.getStore("readwrite");
|
|
83
|
+
await this.request(store.delete(this.id + key));
|
|
84
|
+
}
|
|
85
|
+
async getKeysWithPrefix(prefix) {
|
|
86
|
+
const store = this.getStore();
|
|
87
|
+
const range = IDBKeyRange.bound(prefix, prefix + "\uffff", false, true);
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
const keys = [];
|
|
90
|
+
const request = store.openCursor(range);
|
|
91
|
+
request.onerror = () => reject(request.error);
|
|
92
|
+
request.onsuccess = () => {
|
|
93
|
+
const cursor = request.result;
|
|
94
|
+
if (cursor) {
|
|
95
|
+
let newKey = cursor.key;
|
|
96
|
+
newKey = newKey.slice(this.id.length);
|
|
97
|
+
keys.push(newKey);
|
|
98
|
+
cursor.continue();
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
resolve(keys);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async getKeys() {
|
|
107
|
+
let keys = await this.getKeysWithPrefix(this.id);
|
|
108
|
+
return keys.filter(x => !x.includes("/"));
|
|
109
|
+
}
|
|
110
|
+
async getInfo(key) {
|
|
111
|
+
const store = this.getStore();
|
|
112
|
+
const result = await this.request(store.get(this.id + key));
|
|
113
|
+
if (!result)
|
|
114
|
+
return undefined;
|
|
115
|
+
return {
|
|
116
|
+
size: result.data.length,
|
|
117
|
+
lastModified: result.lastModified
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async reset() {
|
|
121
|
+
let keys = await this.getKeysWithPrefix(this.id);
|
|
122
|
+
for (let key of keys) {
|
|
123
|
+
await this.remove(key);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.getFileStorageIndexDB = (0, caching_1.lazy)(async () => {
|
|
128
|
+
const db = await new Promise((resolve, reject) => {
|
|
129
|
+
const request = indexedDB.open(DB_NAME, DB_VERSION);
|
|
130
|
+
request.onerror = () => reject(request.error);
|
|
131
|
+
request.onsuccess = () => resolve(request.result);
|
|
132
|
+
request.onupgradeneeded = (event) => {
|
|
133
|
+
const db = event.target.result;
|
|
134
|
+
if (!db.objectStoreNames.contains(STORE_NAME)) {
|
|
135
|
+
db.createObjectStore(STORE_NAME);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
return new VirtualFileStorage(db, "/");
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5kZXhlZERCRmlsZUZvbGRlckFQSS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkluZGV4ZWREQkZpbGVGb2xkZXJBUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseURBQW1EO0FBSW5ELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztBQUM5QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBT3JCLE1BQU0sa0JBQWtCO0lBR3BCLFlBQ0ksRUFBZSxFQUNDLEVBQVU7UUFBVixPQUFFLEdBQUYsRUFBRSxDQUFRO1FBd0c5QixtQ0FBbUM7UUFDbkMsV0FBTSxHQUFHO1lBQ0wsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFXLEVBQW9CLEVBQUU7Z0JBQzVDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RELE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUVELFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBVyxFQUF3QixFQUFFO2dCQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7Z0JBQ3BDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFFRCxhQUFhLEVBQUUsS0FBSyxFQUFFLEdBQVcsRUFBaUIsRUFBRTtnQkFDaEQsSUFBSSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUNsRSxNQUFNLE1BQU0sQ0FBQyxL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LENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IElTdG9yYWdlUmF3IH0gZnJvbSBcIi4vSVN0b3JhZ2VcIjtcbmltcG9ydCB7IEZpbGVTdG9yYWdlIH0gZnJvbSBcIi4vRmlsZUZvbGRlckFQSVwiO1xuXG5jb25zdCBEQl9OQU1FID0gXCJGaWxlU3RvcmFnZVwiO1xuY29uc3QgU1RPUkVfTkFNRSA9IFwiZmlsZXNcIjtcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuXG5pbnRlcmZhY2UgRmlsZVJlY29yZCB7XG4gICAgZGF0YTogQnVmZmVyO1xuICAgIGxhc3RNb2RpZmllZDogbnVtYmVyO1xufVxuXG5jbGFzcyBWaXJ0dWFsRmlsZVN0b3JhZ2UgaW1wbGVtZW50cyBGaWxlU3RvcmFnZSB7XG4gICAgcHJpdmF0ZSBkYjogSURCRGF0YWJhc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZGI6IElEQkRhdGFiYXNlLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICAgICkge1xuICAgICAgICBpZiAoIWRiKSBkZWJ1Z2dlcjtcbiAgICAgICAgdGhpcy5kYiA9IGRiO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3RvcmUobW9kZTogSURCVHJhbnNhY3Rpb25Nb2RlID0gXCJyZWFkb25seVwiKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYi50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCBtb2RlKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVxdWVzdDxUPihyZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8vIElTdG9yYWdlUmF3IGltcGxlbWVudGF0aW9uXG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmdldFN0b3JlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdDxGaWxlUmVjb3JkIHwgdW5kZWZpbmVkPihzdG9yZS5nZXQodGhpcy5pZCArIGtleSkpO1xuICAgICAgICBsZXQgYmFkQnVmZmVyID0gcmVzdWx0Py5kYXRhO1xuICAgICAgICBpZiAoYmFkQnVmZmVyKSBiYWRCdWZmZXIgPSBCdWZmZXIuZnJvbShiYWRCdWZmZXIpO1xuICAgICAgICByZXR1cm4gYmFkQnVmZmVyO1xuICAgIH1cblxuICAgIGFzeW5jIGFwcGVuZChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuZ2V0U3RvcmUoXCJyZWFkd3JpdGVcIik7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5pZCArIGtleTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnJlcXVlc3Q8RmlsZVJlY29yZCB8IHVuZGVmaW5lZD4oc3RvcmUuZ2V0KGZ1bGxQYXRoKSk7XG5cbiAgICAgICAgY29uc3QgbmV3UmVjb3JkOiBGaWxlUmVjb3JkID0ge1xuICAgICAgICAgICAgZGF0YTogZXhpc3RpbmdcbiAgICAgICAgICAgICAgICA/IEJ1ZmZlci5jb25jYXQoW2V4aXN0aW5nLmRhdGEsIHZhbHVlXSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHN0b3JlLnB1dChuZXdSZWNvcmQsIGZ1bGxQYXRoKSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5nZXRTdG9yZShcInJlYWR3cml0ZVwiKTtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBGaWxlUmVjb3JkID0ge1xuICAgICAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IERhdGUubm93KClcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KHN0b3JlLnB1dChyZWNvcmQsIHRoaXMuaWQgKyBrZXkpKTtcbiAgICB9XG5cbiAgICBhc3luYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmdldFN0b3JlKFwicmVhZHdyaXRlXCIpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3Qoc3RvcmUuZGVsZXRlKHRoaXMuaWQgKyBrZXkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEtleXNXaXRoUHJlZml4KHByZWZpeDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuZ2V0U3RvcmUoKTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBJREJLZXlSYW5nZS5ib3VuZChwcmVmaXgsIHByZWZpeCArIFwiXFx1ZmZmZlwiLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUub3BlbkN1cnNvcihyYW5nZSk7XG5cbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnNvciA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0tleSA9IGN1cnNvci5rZXkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBuZXdLZXkgPSBuZXdLZXkuc2xpY2UodGhpcy5pZC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2gobmV3S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShrZXlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgbGV0IGtleXMgPSBhd2FpdCB0aGlzLmdldEtleXNXaXRoUHJlZml4KHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4ga2V5cy5maWx0ZXIoeCA9PiAheC5pbmNsdWRlcyhcIi9cIikpO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgc2l6ZTogbnVtYmVyOyBsYXN0TW9kaWZpZWQ6IG51bWJlcjsgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuZ2V0U3RvcmUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0PEZpbGVSZWNvcmQgfCB1bmRlZmluZWQ+KHN0b3JlLmdldCh0aGlzLmlkICsga2V5KSk7XG5cbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogcmVzdWx0Lmxhc3RNb2RpZmllZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFzeW5jIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHRoaXMuZ2V0S2V5c1dpdGhQcmVmaXgodGhpcy5pZCk7XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZShrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmVzdGVkRmlsZVN0b3JhZ2UgaW1wbGVtZW50YXRpb25cbiAgICBmb2xkZXIgPSB7XG4gICAgICAgIGhhc0tleTogYXN5bmMgKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb2xkZXJQYXRoID0gdGhpcy5pZCArIGtleSArIFwiL1wiO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMuZ2V0S2V5c1dpdGhQcmVmaXgoZm9sZGVyUGF0aCk7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGggPiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFN0b3JhZ2U6IGFzeW5jIChrZXk6IHN0cmluZyk6IFByb21pc2U8RmlsZVN0b3JhZ2U+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSB0aGlzLmlkICsga2V5ICsgXCIvXCI7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFZpcnR1YWxGaWxlU3RvcmFnZSh0aGlzLmRiLCBuZXdQYXRoKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmVTdG9yYWdlOiBhc3luYyAoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGxldCBuZXN0ZWQgPSBuZXcgVmlydHVhbEZpbGVTdG9yYWdlKHRoaXMuZGIsIHRoaXMuaWQgKyBrZXkgKyBcIi9cIik7XG4gICAgICAgICAgICBhd2FpdCBuZXN0ZWQucmVzZXQoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRLZXlzOiBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgICAgICAgICAgbGV0IGtleXMgPSBhd2FpdCB0aGlzLmdldEtleXNXaXRoUHJlZml4KHRoaXMuaWQpO1xuICAgICAgICAgICAgbGV0IGZvbGRlcktleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoXCIvXCIpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgcGFydHMgPSBrZXkuc3BsaXQoXCIvXCIpO1xuICAgICAgICAgICAgICAgIGZvbGRlcktleXMuYWRkKHBhcnRzWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZvbGRlcktleXMpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpbGVTdG9yYWdlSW5kZXhEQiA9IGxhenkoYXN5bmMgKCk6IFByb21pc2U8RmlsZVN0b3JhZ2U+ID0+IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IG5ldyBQcm9taXNlPElEQkRhdGFiYXNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTtcblxuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7XG5cbiAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gKGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0KS5yZXN1bHQ7XG4gICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU1RPUkVfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgVmlydHVhbEZpbGVTdG9yYWdlKGRiLCBcIi9cIik7XG59KTsiXX0=
|
|
142
|
+
/* _JS_SOURCE_HASH = "fcaf403302186bb428bbd7c05d2bb7882b4e5b2efc380c304cecc1090621cb0e"; */
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
+
//exports.JSONStorage = void 0;
|
|
4
|
+
class JSONStorage {
|
|
5
|
+
constructor(storage) {
|
|
6
|
+
this.storage = storage;
|
|
7
|
+
}
|
|
8
|
+
async get(key) {
|
|
9
|
+
let buffer = await this.storage.get(key);
|
|
10
|
+
if (buffer === undefined) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(buffer.toString());
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
console.warn(`Failed to parse JSON for key: ${key}`, buffer.toString(), e);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async set(key, value) {
|
|
21
|
+
await this.storage.set(key, Buffer.from(JSON.stringify(value)));
|
|
22
|
+
}
|
|
23
|
+
async remove(key) {
|
|
24
|
+
await this.storage.remove(key);
|
|
25
|
+
}
|
|
26
|
+
async getKeys() {
|
|
27
|
+
return await this.storage.getKeys();
|
|
28
|
+
}
|
|
29
|
+
async getInfo(key) {
|
|
30
|
+
return await this.storage.getInfo(key);
|
|
31
|
+
}
|
|
32
|
+
async reset() {
|
|
33
|
+
await this.storage.reset();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.JSONStorage = JSONStorage;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSlNPTlN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJKU09OU3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFhLFdBQVc7SUFDcEIsWUFBb0IsT0FBeUI7UUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7SUFBSSxDQUFDO0lBQzNDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVztRQUN4QixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0UsQ0FBQztJQUNMLENBQUM7SUFDTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFRO1FBQ2xDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNNLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBVztRQUMzQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDTSxLQUFLLENBQUMsT0FBTztRQUNoQixPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBQ00sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFXO1FBQzVCLE9BQU8sTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBS00sS0FBSyxDQUFDLEtBQUs7UUFDZCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNKO0FBaENELGtDQWdDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElTdG9yYWdlIH0gZnJvbSBcIi4vSVN0b3JhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEpTT05TdG9yYWdlPFQ+IGltcGxlbWVudHMgSVN0b3JhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RvcmFnZTogSVN0b3JhZ2U8QnVmZmVyPikgeyB9XG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgYnVmZmVyID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChrZXkpO1xuICAgICAgICBpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGJ1ZmZlci50b1N0cmluZygpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcGFyc2UgSlNPTiBmb3Iga2V5OiAke2tleX1gLCBidWZmZXIudG9TdHJpbmcoKSwgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnNldChrZXksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZS5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlLmdldEtleXMoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RvcmFnZS5nZXRJbmZvKGtleSk7XG4gICAgfVxuXG5cblxuXG4gICAgcHVibGljIGFzeW5jIHJlc2V0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2UucmVzZXQoKTtcbiAgICB9XG59Il19
|
|
38
|
+
/* _JS_SOURCE_HASH = "6e2e6e8b1179c3970ad66f8dee16186e8445262a0ae235abc02a62a332d0db8c"; */
|