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.
Files changed (77) 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/builders/generateIndexDts.ts +1 -1
  31. package/bundler/dist/bundleEntry.ts.cache +48 -0
  32. package/bundler/dist/bundleEntryCaller.ts.cache +18 -0
  33. package/bundler/dist/bundleRequire.ts.cache +246 -0
  34. package/bundler/dist/bundleWrapper.ts.cache +101 -0
  35. package/bundler/dist/bundler.ts.cache +66 -0
  36. package/bundler/dist/sourceMaps.ts.cache +210 -0
  37. package/dist/electronMain.ts.cache +27 -0
  38. package/dist/electronRenderer.tsx.cache +62 -0
  39. package/electron/dist/electronMain.ts.cache +26 -0
  40. package/electron/dist/electronRenderer.tsx.cache +64 -0
  41. package/extension/dist/extBackground.ts.cache +20 -0
  42. package/extension/dist/extContentScript.ts.cache +17 -0
  43. package/index.d.ts +478 -0
  44. package/misc/dist/environment.ts.cache +50 -0
  45. package/misc/dist/fs.ts.cache +29 -0
  46. package/nodejs/dist/exampleFile.ts.cache +11 -0
  47. package/nodejs/dist/server.ts.cache +15 -0
  48. package/package.json +5 -1
  49. package/render-utils/dist/observer.tsx.cache +33 -0
  50. package/storage/CachedStorage.d.ts +2 -0
  51. package/storage/DelayedStorage.d.ts +14 -0
  52. package/storage/DiskCollection.d.ts +99 -0
  53. package/storage/FileFolderAPI.d.ts +71 -0
  54. package/storage/IStorage.d.ts +38 -0
  55. package/storage/IndexedDBFileFolderAPI.d.ts +6 -0
  56. package/storage/JSONStorage.d.ts +16 -0
  57. package/storage/PendingManager.d.ts +6 -0
  58. package/storage/PendingStorage.d.ts +18 -0
  59. package/storage/PrivateFileSystemStorage.d.ts +23 -0
  60. package/storage/StorageObservable.d.ts +32 -0
  61. package/storage/TransactionStorage.d.ts +46 -0
  62. package/storage/dist/CachedStorage.ts.cache +31 -0
  63. package/storage/dist/DelayedStorage.ts.cache +35 -0
  64. package/storage/dist/DiskCollection.ts.cache +241 -0
  65. package/storage/dist/FileFolderAPI.tsx.cache +345 -0
  66. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +142 -0
  67. package/storage/dist/JSONStorage.ts.cache +38 -0
  68. package/storage/dist/PendingManager.tsx.cache +73 -0
  69. package/storage/dist/PendingStorage.ts.cache +49 -0
  70. package/storage/dist/PrivateFileSystemStorage.ts.cache +178 -0
  71. package/storage/dist/StorageObservable.ts.cache +120 -0
  72. package/storage/dist/TransactionStorage.ts.cache +421 -0
  73. package/storage/dist/fileSystemPointer.ts.cache +77 -0
  74. package/storage/fileSystemPointer.d.ts +11 -0
  75. package/tsconfig.declarations.json +3 -1
  76. package/web/dist/browser.tsx.cache +66 -0
  77. package/yarn.lock +1752 -0
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.newFileStorageJSONSyncer = exports.newFileStorageBufferSyncer = exports.DiskCollectionRawBrowser = exports.DiskCollectionRaw = exports.DiskCollectionPromise = exports.DiskCollectionBrowser = exports.DiskCollection = void 0;
4
+ const typesafecss_1 = require("typesafecss");
5
+ const DelayedStorage_1 = require("./DelayedStorage");
6
+ const FileFolderAPI_1 = require("./FileFolderAPI");
7
+ const JSONStorage_1 = require("./JSONStorage");
8
+ const StorageObservable_1 = require("./StorageObservable");
9
+ const TransactionStorage_1 = require("./TransactionStorage");
10
+ const PendingStorage_1 = require("./PendingStorage");
11
+ const types_1 = require("../misc/types");
12
+ const PrivateFileSystemStorage_1 = require("./PrivateFileSystemStorage");
13
+ const context_1 = require("../../context");
14
+ class DiskCollection {
15
+ constructor(collectionName, writeDelay) {
16
+ this.collectionName = collectionName;
17
+ this.writeDelay = writeDelay;
18
+ this.baseStorage = this.initStorage();
19
+ this.synced = new StorageObservable_1.StorageSync(new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.baseStorage)));
20
+ }
21
+ async initStorage() {
22
+ // If a Chrome extension, just return null.
23
+ if ((0, context_1.isInChromeExtension)())
24
+ return null;
25
+ let fileStorage = await (0, FileFolderAPI_1.getFileStorage)();
26
+ let collections = await fileStorage.folder.getStorage("collections");
27
+ let curCollection = await collections.folder.getStorage(this.collectionName);
28
+ let baseStorage = new TransactionStorage_1.TransactionStorage(curCollection, this.collectionName, this.writeDelay);
29
+ this.transactionStorage = baseStorage;
30
+ return new JSONStorage_1.JSONStorage(baseStorage);
31
+ }
32
+ get(key) {
33
+ return this.synced.get(key);
34
+ }
35
+ async getPromise(key) {
36
+ let base = await this.baseStorage;
37
+ return base.get(key);
38
+ }
39
+ set(key, value) {
40
+ this.synced.set(key, value);
41
+ }
42
+ remove(key) {
43
+ this.synced.remove(key);
44
+ }
45
+ getKeys() {
46
+ return this.synced.getKeys();
47
+ }
48
+ getKeysPromise() {
49
+ return this.synced.getKeysPromise();
50
+ }
51
+ getEntries() {
52
+ let keys = this.getKeys();
53
+ return keys.map(key => [key, this.get(key)]).filter(([_, value]) => (0, types_1.isDefined)(value));
54
+ }
55
+ getValues() {
56
+ let keys = this.getKeys();
57
+ return keys.map(key => this.get(key)).filter(types_1.isDefined);
58
+ }
59
+ async getValuesPromise() {
60
+ let keys = await this.getKeysPromise();
61
+ let values = [];
62
+ for (let key of keys) {
63
+ let value = await this.getPromise(key);
64
+ if ((0, types_1.isDefined)(value)) {
65
+ values.push(value);
66
+ }
67
+ }
68
+ return values;
69
+ }
70
+ getInfo(key) {
71
+ return this.synced.getInfo(key);
72
+ }
73
+ async reset() {
74
+ await this.synced.reset();
75
+ }
76
+ }
77
+ exports.DiskCollection = DiskCollection;
78
+ class DiskCollectionBrowser {
79
+ constructor(collectionName, writeDelay) {
80
+ this.collectionName = collectionName;
81
+ this.writeDelay = writeDelay;
82
+ this.baseStorage = this.initStorage();
83
+ this.synced = new StorageObservable_1.StorageSync(new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.baseStorage)));
84
+ }
85
+ async initStorage() {
86
+ if ((0, typesafecss_1.isNode)())
87
+ return undefined;
88
+ let curCollection = await new PrivateFileSystemStorage_1.PrivateFileSystemStorage(`collections/${this.collectionName}`);
89
+ let baseStorage = new TransactionStorage_1.TransactionStorage(curCollection, this.collectionName);
90
+ return new JSONStorage_1.JSONStorage(baseStorage);
91
+ }
92
+ get(key) {
93
+ return this.synced.get(key);
94
+ }
95
+ async getPromise(key) {
96
+ let base = await this.baseStorage;
97
+ return base.get(key);
98
+ }
99
+ set(key, value) {
100
+ this.synced.set(key, value);
101
+ }
102
+ remove(key) {
103
+ this.synced.remove(key);
104
+ }
105
+ getKeys() {
106
+ return this.synced.getKeys();
107
+ }
108
+ getKeysPromise() {
109
+ return this.synced.getKeysPromise();
110
+ }
111
+ getEntries() {
112
+ let keys = this.getKeys();
113
+ return keys.map(key => [key, this.get(key)]).filter(([_, value]) => (0, types_1.isDefined)(value));
114
+ }
115
+ getValues() {
116
+ let keys = this.getKeys();
117
+ return keys.map(key => this.get(key)).filter(types_1.isDefined);
118
+ }
119
+ async getValuesPromise() {
120
+ let keys = await this.getKeysPromise();
121
+ let values = [];
122
+ for (let key of keys) {
123
+ let value = await this.getPromise(key);
124
+ if ((0, types_1.isDefined)(value)) {
125
+ values.push(value);
126
+ }
127
+ }
128
+ return values;
129
+ }
130
+ getInfo(key) {
131
+ return this.synced.getInfo(key);
132
+ }
133
+ async reset() {
134
+ await this.synced.reset();
135
+ }
136
+ }
137
+ exports.DiskCollectionBrowser = DiskCollectionBrowser;
138
+ class DiskCollectionPromise {
139
+ constructor(collectionName, writeDelay) {
140
+ this.collectionName = collectionName;
141
+ this.writeDelay = writeDelay;
142
+ this.synced = (new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.initStorage())));
143
+ }
144
+ async initStorage() {
145
+ let fileStorage = await (0, FileFolderAPI_1.getFileStorage)();
146
+ let collections = await fileStorage.folder.getStorage("collections");
147
+ let curCollection = await collections.folder.getStorage(this.collectionName);
148
+ let baseStorage = new TransactionStorage_1.TransactionStorage(curCollection, this.collectionName, this.writeDelay);
149
+ return new JSONStorage_1.JSONStorage(baseStorage);
150
+ }
151
+ async get(key) {
152
+ return await this.synced.get(key);
153
+ }
154
+ async set(key, value) {
155
+ await this.synced.set(key, value);
156
+ }
157
+ async remove(key) {
158
+ await this.synced.remove(key);
159
+ }
160
+ async getKeys() {
161
+ return await this.synced.getKeys();
162
+ }
163
+ async getInfo(key) {
164
+ return await this.synced.getInfo(key);
165
+ }
166
+ async reset() {
167
+ await this.synced.reset();
168
+ }
169
+ }
170
+ exports.DiskCollectionPromise = DiskCollectionPromise;
171
+ class DiskCollectionRaw {
172
+ constructor(collectionName) {
173
+ this.collectionName = collectionName;
174
+ this.synced = (new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.initStorage())));
175
+ }
176
+ async initStorage() {
177
+ let fileStorage = await (0, FileFolderAPI_1.getFileStorage)();
178
+ let collections = await fileStorage.folder.getStorage("collections");
179
+ let baseStorage = await collections.folder.getStorage(this.collectionName);
180
+ return baseStorage;
181
+ }
182
+ async get(key) {
183
+ return await this.synced.get(key);
184
+ }
185
+ async set(key, value) {
186
+ await this.synced.set(key, value);
187
+ }
188
+ async remove(key) {
189
+ await this.synced.remove(key);
190
+ }
191
+ async getKeys() {
192
+ return await this.synced.getKeys();
193
+ }
194
+ async getInfo(key) {
195
+ return await this.synced.getInfo(key);
196
+ }
197
+ async reset() {
198
+ await this.synced.reset();
199
+ }
200
+ }
201
+ exports.DiskCollectionRaw = DiskCollectionRaw;
202
+ class DiskCollectionRawBrowser {
203
+ constructor(collectionName) {
204
+ this.collectionName = collectionName;
205
+ this.synced = new StorageObservable_1.StorageSync(new PendingStorage_1.PendingStorage(`Collection (${this.collectionName})`, new DelayedStorage_1.DelayedStorage(this.initStorage())));
206
+ }
207
+ async initStorage() {
208
+ return await new PrivateFileSystemStorage_1.PrivateFileSystemStorage(`collections/${this.collectionName}`);
209
+ }
210
+ get(key) {
211
+ return this.synced.get(key);
212
+ }
213
+ async getPromise(key) {
214
+ return await this.synced.get(key);
215
+ }
216
+ set(key, value) {
217
+ this.synced.set(key, value);
218
+ }
219
+ async getKeys() {
220
+ return await this.synced.getKeys();
221
+ }
222
+ async getInfo(key) {
223
+ return await this.synced.getInfo(key);
224
+ }
225
+ async reset() {
226
+ await this.synced.reset();
227
+ }
228
+ }
229
+ exports.DiskCollectionRawBrowser = DiskCollectionRawBrowser;
230
+ function newFileStorageBufferSyncer(folder = "") {
231
+ let base = new PendingStorage_1.PendingStorage(`FileStorageBufferSyncer`, new DelayedStorage_1.DelayedStorage((0, FileFolderAPI_1.getFileStorageNested)(folder)));
232
+ return new StorageObservable_1.StorageSync(base);
233
+ }
234
+ exports.newFileStorageBufferSyncer = newFileStorageBufferSyncer;
235
+ function newFileStorageJSONSyncer(folder = "") {
236
+ let base = new PendingStorage_1.PendingStorage(`FileStorageJSONSyncer`, new DelayedStorage_1.DelayedStorage((0, FileFolderAPI_1.getFileStorageNested)(folder)));
237
+ return new StorageObservable_1.StorageSync(new JSONStorage_1.JSONStorage(base));
238
+ }
239
+ exports.newFileStorageJSONSyncer = newFileStorageJSONSyncer;
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlza0NvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJEaXNrQ29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBcUM7QUFDckMscURBQWtEO0FBQ2xELG1EQUFvRjtBQUVwRiwrQ0FBNEM7QUFDNUMsMkRBQWtEO0FBQ2xELDZEQUEwRDtBQUMxRCxxREFBa0Q7QUFFbEQseUNBQTBDO0FBQzFDLHlFQUFzRTtBQUN0RSwyQ0FBb0Q7QUFFcEQsTUFBYSxjQUFjO0lBQ3ZCLFlBQ1ksY0FBc0IsRUFDdEIsVUFBbUI7UUFEbkIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBUztRQWN4QixnQkFBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxXQUFNLEdBQUcsSUFBSSwrQkFBVyxDQUM1QixJQUFJLCtCQUFjLENBQUMsZUFBZSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQ3BELElBQUksK0JBQWMsQ0FBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQzFDLENBQ0osQ0FBQztJQWpCRixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDYiw0Q0FBNEM7UUFDNUMsSUFBSSxJQUFBLDZCQUFtQixHQUFFO1lBQUUsT0FBTyxJQUFXLENBQUM7UUFDOUMsSUFBSSxXQUFXLEdBQUcsTUFBTSxJQUFBLDhCQUFjLEdBQUUsQ0FBQztRQUN6QyxJQUFJLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLElBQUksYUFBYSxHQUFHLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdFLElBQUksV0FBVyxHQUFHLElBQUksdUNBQWtCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FB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QUFDLENBQUM7QUFDckQsQ0FBQztBQUxELDREQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcInR5cGVzYWZlY3NzXCI7XG5pbXBvcnQgeyBEZWxheWVkU3RvcmFnZSB9IGZyb20gXCIuL0RlbGF5ZWRTdG9yYWdlXCI7XG5pbXBvcnQgeyBGaWxlU3RvcmFnZSwgZ2V0RmlsZVN0b3JhZ2UsIGdldEZpbGVTdG9yYWdlTmVzdGVkIH0gZnJvbSBcIi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgSVN0b3JhZ2UsIElTdG9yYWdlU3luYyB9IGZyb20gXCIuL0lTdG9yYWdlXCI7XG5pbXBvcnQgeyBKU09OU3RvcmFnZSB9IGZyb20gXCIuL0pTT05TdG9yYWdlXCI7XG5pbXBvcnQgeyBTdG9yYWdlU3luYyB9IGZyb20gXCIuL1N0b3JhZ2VPYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0b3JhZ2UgfSBmcm9tIFwiLi9UcmFuc2FjdGlvblN0b3JhZ2VcIjtcbmltcG9ydCB7IFBlbmRpbmdTdG9yYWdlIH0gZnJvbSBcIi4vUGVuZGluZ1N0b3JhZ2VcIjtcbmltcG9ydCB7IG9ic2VydmFibGUgfSBmcm9tIFwiLi4vbWlzYy9tb2J4VHlwZWRcIjtcbmltcG9ydCB7IGlzRGVmaW5lZCB9IGZyb20gXCIuLi9taXNjL3R5cGVzXCI7XG5pbXBvcnQgeyBQcml2YXRlRmlsZVN5c3RlbVN0b3JhZ2UgfSBmcm9tIFwiLi9Qcml2YXRlRmlsZVN5c3RlbVN0b3JhZ2VcIjtcbmltcG9ydCB7IGlzSW5DaHJvbWVFeHRlbnNpb24gfSBmcm9tIFwiLi4vLi4vY29udGV4dFwiO1xuXG5leHBvcnQgY2xhc3MgRGlza0NvbGxlY3Rpb248VD4gaW1wbGVtZW50cyBJU3RvcmFnZVN5bmM8VD4ge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgd3JpdGVEZWxheT86IG51bWJlcixcbiAgICApIHtcbiAgICB9XG4gICAgcHVibGljIHRyYW5zYWN0aW9uU3RvcmFnZTogVHJhbnNhY3Rpb25TdG9yYWdlIHwgdW5kZWZpbmVkO1xuICAgIGFzeW5jIGluaXRTdG9yYWdlKCk6IFByb21pc2U8SVN0b3JhZ2U8VD4+IHtcbiAgICAgICAgLy8gSWYgYSBDaHJvbWUgZXh0ZW5zaW9uLCBqdXN0IHJldHVybiBudWxsLiBcbiAgICAgICAgaWYgKGlzSW5DaHJvbWVFeHRlbnNpb24oKSkgcmV0dXJuIG51bGwgYXMgYW55O1xuICAgICAgICBsZXQgZmlsZVN0b3JhZ2UgPSBhd2FpdCBnZXRGaWxlU3RvcmFnZSgpO1xuICAgICAgICBsZXQgY29sbGVjdGlvbnMgPSBhd2FpdCBmaWxlU3RvcmFnZS5mb2xkZXIuZ2V0U3RvcmFnZShcImNvbGxlY3Rpb25zXCIpO1xuICAgICAgICBsZXQgY3VyQ29sbGVjdGlvbiA9IGF3YWl0IGNvbGxlY3Rpb25zLmZvbGRlci5nZXRTdG9yYWdlKHRoaXMuY29sbGVjdGlvbk5hbWUpO1xuICAgICAgICBsZXQgYmFzZVN0b3JhZ2UgPSBuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGN1ckNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbk5hbWUsIHRoaXMud3JpdGVEZWxheSk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25TdG9yYWdlID0gYmFzZVN0b3JhZ2U7XG4gICAgICAgIHJldHVybiBuZXcgSlNPTlN0b3JhZ2U8VD4oYmFzZVN0b3JhZ2UpO1xuICAgIH1cbiAgICBwdWJsaWMgYmFzZVN0b3JhZ2UgPSB0aGlzLmluaXRTdG9yYWdlKCk7XG4gICAgcHJpdmF0ZSBzeW5jZWQgPSBuZXcgU3RvcmFnZVN5bmMoXG4gICAgICAgIG5ldyBQZW5kaW5nU3RvcmFnZShgQ29sbGVjdGlvbiAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSlgLFxuICAgICAgICAgICAgbmV3IERlbGF5ZWRTdG9yYWdlPFQ+KHRoaXMuYmFzZVN0b3JhZ2UpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWQuZ2V0KGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRQcm9taXNlKGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBiYXNlID0gYXdhaXQgdGhpcy5iYXNlU3RvcmFnZTtcbiAgICAgICAgcmV0dXJuIGJhc2UuZ2V0KGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3luY2VkLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIHJlbW92ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnN5bmNlZC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgcHVibGljIGdldEtleXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWQuZ2V0S2V5cygpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0S2V5c1Byb21pc2UoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWQuZ2V0S2V5c1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW50cmllcygpOiBbc3RyaW5nLCBUXVtdIHtcbiAgICAgICAgbGV0IGtleXMgPSB0aGlzLmdldEtleXMoKTtcbiAgICAgICAgcmV0dXJuIGtleXMubWFwKGtleSA9PiBba2V5LCB0aGlzLmdldChrZXkpXSkuZmlsdGVyKChbXywgdmFsdWVdKSA9PiBpc0RlZmluZWQodmFsdWUpKSBhcyBbc3RyaW5nLCBUXVtdO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0VmFsdWVzKCk6IFRbXSB7XG4gICAgICAgIGxldCBrZXlzID0gdGhpcy5nZXRLZXlzKCk7XG4gICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4gdGhpcy5nZXQoa2V5KSkuZmlsdGVyKGlzRGVmaW5lZCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRWYWx1ZXNQcm9taXNlKCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBrZXlzID0gYXdhaXQgdGhpcy5nZXRLZXlzUHJvbWlzZSgpO1xuICAgICAgICBsZXQgdmFsdWVzOiBUW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGF3YWl0IHRoaXMuZ2V0UHJvbWlzZShrZXkpO1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG4gICAgcHVibGljIGdldEluZm8oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VkLmdldEluZm8oa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY2VkLnJlc2V0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlza0NvbGxlY3Rpb25Ccm93c2VyPFQ+IGltcGxlbWVudHMgSVN0b3JhZ2VTeW5jPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHdyaXRlRGVsYXk/OiBudW1iZXIsXG4gICAgKSB7XG4gICAgfVxuICAgIHB1YmxpYyB0cmFuc2FjdGlvblN0b3JhZ2U6IFRyYW5zYWN0aW9uU3RvcmFnZSB8IHVuZGVmaW5lZDtcbiAgICBhc3luYyBpbml0U3RvcmFnZSgpOiBQcm9taXNlPElTdG9yYWdlPFQ+PiB7XG4gICAgICAgIGlmIChpc05vZGUoKSkgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgICAgIGxldCBjdXJDb2xsZWN0aW9uID0gYXdhaXQgbmV3IFByaXZhdGVGaWxlU3lzdGVtU3RvcmFnZShgY29sbGVjdGlvbnMvJHt0aGlzLmNvbGxlY3Rpb25OYW1lfWApO1xuICAgICAgICBsZXQgYmFzZVN0b3JhZ2UgPSBuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGN1ckNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbk5hbWUpO1xuICAgICAgICByZXR1cm4gbmV3IEpTT05TdG9yYWdlPFQ+KGJhc2VTdG9yYWdlKTtcbiAgICB9XG4gICAgcHVibGljIGJhc2VTdG9yYWdlID0gdGhpcy5pbml0U3RvcmFnZSgpO1xuICAgIHByaXZhdGUgc3luY2VkID0gbmV3IFN0b3JhZ2VTeW5jKFxuICAgICAgICBuZXcgUGVuZGluZ1N0b3JhZ2UoYENvbGxlY3Rpb24gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0pYCxcbiAgICAgICAgICAgIG5ldyBEZWxheWVkU3RvcmFnZTxUPih0aGlzLmJhc2VTdG9yYWdlKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VkLmdldChrZXkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0UHJvbWlzZShrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgYmFzZSA9IGF3YWl0IHRoaXMuYmFzZVN0b3JhZ2U7XG4gICAgICAgIHJldHVybiBiYXNlLmdldChrZXkpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN5bmNlZC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zeW5jZWQucmVtb3ZlKGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VkLmdldEtleXMoKTtcbiAgICB9XG4gICAgcHVibGljIGdldEtleXNQcm9taXNlKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VkLmdldEtleXNQcm9taXNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVudHJpZXMoKTogW3N0cmluZywgVF1bXSB7XG4gICAgICAgIGxldCBrZXlzID0gdGhpcy5nZXRLZXlzKCk7XG4gICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4gW2tleSwgdGhpcy5nZXQoa2V5KV0pLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gaXNEZWZpbmVkKHZhbHVlKSkgYXMgW3N0cmluZywgVF1bXTtcbiAgICB9XG4gICAgcHVibGljIGdldFZhbHVlcygpOiBUW10ge1xuICAgICAgICBsZXQga2V5cyA9IHRoaXMuZ2V0S2V5cygpO1xuICAgICAgICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IHRoaXMuZ2V0KGtleSkpLmZpbHRlcihpc0RlZmluZWQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VmFsdWVzUHJvbWlzZSgpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHRoaXMuZ2V0S2V5c1Byb21pc2UoKTtcbiAgICAgICAgbGV0IHZhbHVlczogVFtdID0gW107XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCB0aGlzLmdldFByb21pc2Uoa2V5KTtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRJbmZvKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlZC5nZXRJbmZvKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc2V0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNlZC5yZXNldCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2tDb2xsZWN0aW9uUHJvbWlzZTxUPiBpbXBsZW1lbnRzIElTdG9yYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHdyaXRlRGVsYXk/OiBudW1iZXIsXG4gICAgKSB7IH1cbiAgICBhc3luYyBpbml0U3RvcmFnZSgpOiBQcm9taXNlPElTdG9yYWdlPFQ+PiB7XG4gICAgICAgIGxldCBmaWxlU3RvcmFnZSA9IGF3YWl0IGdldEZpbGVTdG9yYWdlKCk7XG4gICAgICAgIGxldCBjb2xsZWN0aW9ucyA9IGF3YWl0IGZpbGVTdG9yYWdlLmZvbGRlci5nZXRTdG9yYWdlKFwiY29sbGVjdGlvbnNcIik7XG4gICAgICAgIGxldCBjdXJDb2xsZWN0aW9uID0gYXdhaXQgY29sbGVjdGlvbnMuZm9sZGVyLmdldFN0b3JhZ2UodGhpcy5jb2xsZWN0aW9uTmFtZSk7XG4gICAgICAgIGxldCBiYXNlU3RvcmFnZSA9IG5ldyBUcmFuc2FjdGlvblN0b3JhZ2UoY3VyQ29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uTmFtZSwgdGhpcy53cml0ZURlbGF5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBKU09OU3RvcmFnZTxUPihiYXNlU3RvcmFnZSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3luY2VkID0gKFxuICAgICAgICBuZXcgUGVuZGluZ1N0b3JhZ2UoYENvbGxlY3Rpb24gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0pYCxcbiAgICAgICAgICAgIG5ldyBEZWxheWVkU3RvcmFnZTxUPih0aGlzLmluaXRTdG9yYWdlKCkpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jZWQuZ2V0KGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY2VkLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNlZC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jZWQuZ2V0S2V5cygpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jZWQuZ2V0SW5mbyhrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXNldCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jZWQucmVzZXQoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNrQ29sbGVjdGlvblJhdyBpbXBsZW1lbnRzIElTdG9yYWdlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29sbGVjdGlvbk5hbWU6IHN0cmluZykgeyB9XG4gICAgYXN5bmMgaW5pdFN0b3JhZ2UoKTogUHJvbWlzZTxJU3RvcmFnZTxCdWZmZXI+PiB7XG4gICAgICAgIGxldCBmaWxlU3RvcmFnZSA9IGF3YWl0IGdldEZpbGVTdG9yYWdlKCk7XG4gICAgICAgIGxldCBjb2xsZWN0aW9ucyA9IGF3YWl0IGZpbGVTdG9yYWdlLmZvbGRlci5nZXRTdG9yYWdlKFwiY29sbGVjdGlvbnNcIik7XG4gICAgICAgIGxldCBiYXNlU3RvcmFnZSA9IGF3YWl0IGNvbGxlY3Rpb25zLmZvbGRlci5nZXRTdG9yYWdlKHRoaXMuY29sbGVjdGlvbk5hbWUpO1xuICAgICAgICByZXR1cm4gYmFzZVN0b3JhZ2U7XG4gICAgfVxuICAgIHByaXZhdGUgc3luY2VkID0gKFxuICAgICAgICBuZXcgUGVuZGluZ1N0b3JhZ2UoYENvbGxlY3Rpb24gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0pYCxcbiAgICAgICAgICAgIG5ldyBEZWxheWVkU3RvcmFnZSh0aGlzLmluaXRTdG9yYWdlKCkpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN5bmNlZC5nZXQoa2V5KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNlZC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zeW5jZWQucmVtb3ZlKGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3luY2VkLmdldEtleXMoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3luY2VkLmdldEluZm8oa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVzZXQoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3luY2VkLnJlc2V0KCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlza0NvbGxlY3Rpb25SYXdCcm93c2VyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcpIHsgfVxuICAgIGFzeW5jIGluaXRTdG9yYWdlKCk6IFByb21pc2U8SVN0b3JhZ2U8QnVmZmVyPj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByaXZhdGVGaWxlU3lzdGVtU3RvcmFnZShgY29sbGVjdGlvbnMvJHt0aGlzLmNvbGxlY3Rpb25OYW1lfWApO1xuICAgIH1cbiAgICBwcml2YXRlIHN5bmNlZCA9IG5ldyBTdG9yYWdlU3luYyhcbiAgICAgICAgbmV3IFBlbmRpbmdTdG9yYWdlKGBDb2xsZWN0aW9uICgke3RoaXMuY29sbGVjdGlvbk5hbWV9KWAsXG4gICAgICAgICAgICBuZXcgRGVsYXllZFN0b3JhZ2UodGhpcy5pbml0U3RvcmFnZSgpKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBCdWZmZXIgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZWQuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldFByb21pc2Uoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zeW5jZWQuZ2V0KGtleSk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpIHtcbiAgICAgICAgdGhpcy5zeW5jZWQuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN5bmNlZC5nZXRLZXlzKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN5bmNlZC5nZXRJbmZvKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlc2V0KCkge1xuICAgICAgICBhd2FpdCB0aGlzLnN5bmNlZC5yZXNldCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0ZpbGVTdG9yYWdlQnVmZmVyU3luY2VyKGZvbGRlciA9IFwiXCIpIHtcbiAgICBsZXQgYmFzZSA9IG5ldyBQZW5kaW5nU3RvcmFnZShgRmlsZVN0b3JhZ2VCdWZmZXJTeW5jZXJgLFxuICAgICAgICBuZXcgRGVsYXllZFN0b3JhZ2UoZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQoZm9sZGVyKSlcbiAgICApO1xuICAgIHJldHVybiBuZXcgU3RvcmFnZVN5bmMoYmFzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdGaWxlU3RvcmFnZUpTT05TeW5jZXI8VD4oZm9sZGVyID0gXCJcIikge1xuICAgIGxldCBiYXNlID0gbmV3IFBlbmRpbmdTdG9yYWdlKGBGaWxlU3RvcmFnZUpTT05TeW5jZXJgLFxuICAgICAgICBuZXcgRGVsYXllZFN0b3JhZ2UoZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQoZm9sZGVyKSlcbiAgICApO1xuICAgIHJldHVybiBuZXcgU3RvcmFnZVN5bmMobmV3IEpTT05TdG9yYWdlPFQ+KGJhc2UpKTtcbn0iXX0=
241
+ /* _JS_SOURCE_HASH = "9040948c89cb52116d4a857fc8dc90924b8e12c2aeb4e436d3dfd0091470df55"; */