sliftutils 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/.gitignore +38 -0
  2. package/assets/icon128.png +0 -0
  3. package/assets/icon16.png +0 -0
  4. package/assets/icon48.png +0 -0
  5. package/build-electron/assets/icon128.png +0 -0
  6. package/build-electron/assets/icon16.png +0 -0
  7. package/build-electron/assets/icon48.png +0 -0
  8. package/build-electron/electron/electronIndex.html +12 -0
  9. package/build-electron/electronMain.js +5185 -0
  10. package/build-electron/electronRenderer.js +20852 -0
  11. package/build-extension/assets/icon128.png +0 -0
  12. package/build-extension/assets/icon16.png +0 -0
  13. package/build-extension/assets/icon48.png +0 -0
  14. package/build-extension/extBackground.js +5246 -0
  15. package/build-extension/extContentScript.js +5243 -0
  16. package/build-extension/manifest.json +29 -0
  17. package/build-nodejs/server.js +198610 -0
  18. package/build-web/assets/icon128.png +0 -0
  19. package/build-web/assets/icon16.png +0 -0
  20. package/build-web/assets/icon48.png +0 -0
  21. package/build-web/browser.js +199266 -0
  22. package/build-web/web/index.html +32 -0
  23. package/builders/dist/electronBuild.ts.cache +105 -0
  24. package/builders/dist/extensionBuild.ts.cache +146 -0
  25. package/builders/dist/generateIndexDts.ts.cache +74 -0
  26. package/builders/dist/hotReload.ts.cache +93 -0
  27. package/builders/dist/nodeJSBuild.ts.cache +29 -0
  28. package/builders/dist/watch.ts.cache +163 -0
  29. package/builders/dist/webBuild.ts.cache +81 -0
  30. package/bundler/dist/bundleEntry.ts.cache +48 -0
  31. package/bundler/dist/bundleEntryCaller.ts.cache +18 -0
  32. package/bundler/dist/bundleRequire.ts.cache +246 -0
  33. package/bundler/dist/bundleWrapper.ts.cache +101 -0
  34. package/bundler/dist/bundler.ts.cache +66 -0
  35. package/bundler/dist/sourceMaps.ts.cache +210 -0
  36. package/dist/electronMain.ts.cache +27 -0
  37. package/dist/electronRenderer.tsx.cache +62 -0
  38. package/electron/dist/electronMain.ts.cache +26 -0
  39. package/electron/dist/electronRenderer.tsx.cache +64 -0
  40. package/extension/dist/extBackground.ts.cache +20 -0
  41. package/extension/dist/extContentScript.ts.cache +17 -0
  42. package/misc/dist/environment.ts.cache +50 -0
  43. package/misc/dist/fs.ts.cache +29 -0
  44. package/nodejs/dist/exampleFile.ts.cache +11 -0
  45. package/nodejs/dist/server.ts.cache +15 -0
  46. package/package.json +5 -1
  47. package/render-utils/dist/observer.tsx.cache +33 -0
  48. package/storage/dist/CachedStorage.ts.cache +31 -0
  49. package/storage/dist/DelayedStorage.ts.cache +35 -0
  50. package/storage/dist/DiskCollection.ts.cache +241 -0
  51. package/storage/dist/FileFolderAPI.tsx.cache +345 -0
  52. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +142 -0
  53. package/storage/dist/JSONStorage.ts.cache +38 -0
  54. package/storage/dist/PendingManager.tsx.cache +73 -0
  55. package/storage/dist/PendingStorage.ts.cache +49 -0
  56. package/storage/dist/PrivateFileSystemStorage.ts.cache +178 -0
  57. package/storage/dist/StorageObservable.ts.cache +120 -0
  58. package/storage/dist/TransactionStorage.ts.cache +421 -0
  59. package/storage/dist/fileSystemPointer.ts.cache +77 -0
  60. package/web/dist/browser.tsx.cache +66 -0
  61. 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"; */