sliftutils 1.7.112 → 1.7.113
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/dist/treeSummary.ts.cache +2 -2
- package/index.d.ts +2 -1
- package/misc/dist/environment.ts.cache +2 -2
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/dist/zip.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/package.json +1 -1
- package/render-utils/dist/observer.tsx.cache +2 -2
- package/storage/ArchivesDisk.ts +8 -7
- package/storage/IArchives.d.ts +1 -0
- package/storage/IArchives.ts +2 -1
- package/storage/TransactionFile.d.ts +1 -1
- package/storage/TransactionFile.ts +13 -2
- package/storage/archiveHelpers.ts +11 -9
- package/storage/dist/ArchivesDisk.ts.cache +10 -9
- package/storage/dist/FileFolderAPI.tsx.cache +2 -2
- package/storage/dist/IArchives.ts.cache +3 -3
- package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
- package/storage/dist/JSONStorage.ts.cache +2 -2
- package/storage/dist/PendingManager.tsx.cache +2 -2
- package/storage/dist/StreamingLogs.ts.cache +2 -2
- package/storage/dist/TransactionFile.ts.cache +16 -5
- package/storage/dist/TransactionStorage.ts.cache +2 -2
- package/storage/dist/archiveHelpers.ts.cache +13 -11
- package/storage/dist/backblaze.ts.cache +2 -2
- package/storage/dist/fileSystemPointer.ts.cache +2 -2
- package/storage/dist/remoteFileStorage.ts.cache +2 -2
- package/storage/remoteStorage/ArchivesDelayed.ts +3 -3
- package/storage/remoteStorage/ArchivesRemote.ts +2 -2
- package/storage/remoteStorage/blobStore.ts +15 -15
- package/storage/remoteStorage/bucketDisk.ts +2 -1
- package/storage/remoteStorage/chainStartup.ts +2 -2
- package/storage/remoteStorage/createArchives.ts +13 -13
- package/storage/remoteStorage/deployTakeover.ts +1 -1
- package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +6 -6
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +5 -5
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
- package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
- package/storage/remoteStorage/dist/blobStore.ts.cache +17 -17
- package/storage/remoteStorage/dist/bucketDisk.ts.cache +5 -4
- package/storage/remoteStorage/dist/certTrustModal.tsx.cache +2 -2
- package/storage/remoteStorage/dist/chainStartup.ts.cache +5 -5
- package/storage/remoteStorage/dist/cliArgs.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +14 -14
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +4 -4
- package/storage/remoteStorage/dist/intermediateManagement.ts.cache +2 -2
- package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +4 -4
- package/storage/remoteStorage/dist/serverConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +6 -6
- package/storage/remoteStorage/dist/sourcesList.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
- package/storage/remoteStorage/dist/storageController.ts.cache +7 -7
- package/storage/remoteStorage/dist/storageServerState.ts.cache +4 -4
- package/storage/remoteStorage/dist/storeConfig.ts.cache +2 -2
- package/storage/remoteStorage/dist/storePlan.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSources.ts.cache +2 -2
- package/storage/remoteStorage/dist/storeSync.ts.cache +8 -8
- package/storage/remoteStorage/dist/validation.ts.cache +2 -2
- package/storage/remoteStorage/remoteConfig.ts +1 -1
- package/storage/remoteStorage/sourceWrapper.ts +3 -3
- package/storage/remoteStorage/storageController.ts +4 -4
- package/storage/remoteStorage/storageServerState.ts +1 -1
- package/storage/remoteStorage/storeSync.ts +7 -7
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -107,8 +107,9 @@ class TransactionFile {
|
|
|
107
107
|
deletedEntries() {
|
|
108
108
|
return this.deleted.entries();
|
|
109
109
|
}
|
|
110
|
-
/** Stores a value as of `time
|
|
110
|
+
/** Stores a value as of `time` (floored to whole milliseconds - see applySet). Returns false when something at least as new is already here, in which case nothing changed - an out-of-order write is not an error, it is just late. */
|
|
111
111
|
set(key, value, time) {
|
|
112
|
+
time = Math.floor(time);
|
|
112
113
|
if (!this.applySet(key, value, time, Date.now()))
|
|
113
114
|
return false;
|
|
114
115
|
this.append({ k: key, t: time, v: value });
|
|
@@ -116,6 +117,7 @@ class TransactionFile {
|
|
|
116
117
|
}
|
|
117
118
|
/** Deletes as of `time`, keeping the tombstone. A key that had a live value keeps it in the tombstone as MARKED for deletion (readable and restorable until dropValue). Returns false when something at least as new is already here. */
|
|
118
119
|
delete(key, time) {
|
|
120
|
+
time = Math.floor(time);
|
|
119
121
|
let live = this.values.get(key);
|
|
120
122
|
if (!this.applyDelete(key, time, Date.now(), live === null || live === void 0 ? void 0 : live.value, live === null || live === void 0 ? void 0 : live.time))
|
|
121
123
|
return false;
|
|
@@ -129,6 +131,7 @@ class TransactionFile {
|
|
|
129
131
|
}
|
|
130
132
|
/** Undoes a marked deletion: the kept value becomes live again, as of `time` (a fresh time, so the restore outranks the deletion everywhere it propagated). Returns false when there is no marked value to restore, or something at least as new is already here. */
|
|
131
133
|
unmark(key, time) {
|
|
134
|
+
time = Math.floor(time);
|
|
132
135
|
let tombstone = this.deleted.get(key);
|
|
133
136
|
if (!tombstone || tombstone.value === undefined)
|
|
134
137
|
return false;
|
|
@@ -151,9 +154,12 @@ class TransactionFile {
|
|
|
151
154
|
had = this.deleted.delete(key) || had;
|
|
152
155
|
if (!had)
|
|
153
156
|
return;
|
|
154
|
-
this.append({ k: key, t: Date.now(), p: 1 });
|
|
157
|
+
this.append({ k: key, t: Math.floor(Date.now()), p: 1 });
|
|
155
158
|
}
|
|
159
|
+
// Times are floored to whole milliseconds on every path into the maps (load replays through here too, so fractional times persisted by older code heal on startup). Disk mtimes carry fractional milliseconds but utimes round-trips only whole ones, so a fractional time can never be reproduced by propagation - every copy of the value would compare "older" than the original forever, and the same write would be re-pushed and re-copied every round.
|
|
156
160
|
applySet(key, value, time, changedAt) {
|
|
161
|
+
time = Math.floor(time);
|
|
162
|
+
changedAt = Math.floor(changedAt);
|
|
157
163
|
if (time < this.timeOf(key))
|
|
158
164
|
return false;
|
|
159
165
|
this.deleted.delete(key);
|
|
@@ -161,6 +167,11 @@ class TransactionFile {
|
|
|
161
167
|
return true;
|
|
162
168
|
}
|
|
163
169
|
applyDelete(key, time, changedAt, value, valueTime) {
|
|
170
|
+
time = Math.floor(time);
|
|
171
|
+
changedAt = Math.floor(changedAt);
|
|
172
|
+
if (valueTime !== undefined) {
|
|
173
|
+
valueTime = Math.floor(valueTime);
|
|
174
|
+
}
|
|
164
175
|
if (time < this.timeOf(key))
|
|
165
176
|
return false;
|
|
166
177
|
this.values.delete(key);
|
|
@@ -240,5 +251,5 @@ class TransactionFile {
|
|
|
240
251
|
}
|
|
241
252
|
}
|
|
242
253
|
exports.TransactionFile = TransactionFile;
|
|
243
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25GaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiVHJhbnNhY3Rpb25GaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBRW5ELG9iQUFvYjtBQUNwYixFQUFFO0FBQ0Ysb0tBQW9LO0FBRXBLLCtJQUErSTtBQUMvSSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIsOEZBQThGO0FBQzlGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLHNMQUFzTDtBQUN0TCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUF5QnhCLE1BQWEsZUFBZTtJQUN4QixZQUFvQixRQUFnQjtRQUFoQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBRTVCLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUN4QyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7UUFDckQsNEdBQTRHO1FBQ3BHLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBRS9CLGdHQUFnRztRQUN4RixlQUFVLEdBQWtCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV0RCw4RkFBOEY7UUFDdkYsU0FBSSxHQUFHLElBQUEsY0FBSSxFQUFDLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksSUFBWSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDRCxJQUFJLEdBQUcsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULElBQUssQ0FBdUIsQ0FBQyxJQUFJLEtBQUssUUFBUTtvQkFBRSxPQUFPO2dCQUN2RCxNQUFNLENBQUMsQ0FBQztZQUNaLENBQUM7WUFDRCxJQUFJLE9BQU8sR0FBRyxD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QUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBeUIsQ0FBQyxDQUFDLENBQUM7WUFDN0YsQ0FBQztRQUNMLENBQUM7UUFDRCxtTkFBbU47UUFDbk4sSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxJQUFJLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLGFBQWEsQ0FBQztRQUM3QyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN2QixNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLG9HQUFvRztRQUNwRyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLFdBQVcsb0JBQW9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQztRQUN2SSxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0o7QUF4TkQsMENBd05DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5cbi8vIEEgcGVyc2lzdGVudCBNYXAgdGhhdCBrbm93cyBhYm91dCB0aW1lIGFuZCBhYm91dCBkZWxldGlvbnMuIEV2ZXJ5IHZhbHVlIGNhcnJpZXMgdGhlIHRpbWUgaXQgd2FzIHdyaXR0ZW4sIHNvIGEgd3JpdGUgdGhhdCBhcnJpdmVzIG91dCBvZiBvcmRlciBpcyBzaW1wbHkgbm90IGFwcGxpZWQgLSB0aGUgbWFwIGNhbm5vdCBiZSBtYWRlIHRvIGdvIGJhY2t3YXJkcy4gQSBkZWxldGVkIGtleSBrZWVwcyBpdHMgdGltZSB0b28sIGFzIGEgdG9tYnN0b25lIGluIGEgc2Vjb25kIG1hcCwgc28gXCJ3YXMgdGhpcyBkZWxldGVkLCBhbmQgd2hlblwiIGlzIGFzIGNoZWFwIHRvIGFzayBhcyBcImRvZXMgdGhpcyBleGlzdFwiLCBhbmQgZXhwaXJpbmcgb2xkIHRvbWJzdG9uZXMgaXMgYSB3YWxrIG9mIHRoZSB0b21ic3RvbmVzIGFsb25lIHJhdGhlciB0aGFuIG9mIGV2ZXJ5dGhpbmcuXG4vL1xuLy8gT24gZGlzayBpdCBpcyBvbmUgYXBwZW5kLW9ubHkgbG9nIG9mIHRoZSBzZXRzLCBkZWxldGVzIGFuZCBwdXJnZXMgdGhhdCBwcm9kdWNlZCBib3RoIG1hcHMsIHJld3JpdHRlbiBmcm9tIHRoZW0gd2hlbmV2ZXIgaXQgaGFzIGdyb3duIHRvIHNldmVyYWwgdGltZXMgdGhlaXIgc2l6ZS5cblxuLy8gVGhlIGxvZyBpcyByZXdyaXR0ZW4gb25jZSBpdCBob2xkcyB0aGlzIG1hbnkgdGltZXMgbW9yZSByZWNvcmRzIHRoYW4gdGhlcmUgYXJlIGtleXMgKGEgbG9nIG9mIDMgcmVjb3JkcyBwZXIgc3Vydml2aW5nIGtleSBpcyBtb3N0bHkgaGlzdG9yeSlcbmNvbnN0IENPTVBBQ1RfUkFUSU8gPSAzO1xuLy8gLi4uYnV0IG5ldmVyIGZvciBhIHNtYWxsIGxvZywgd2hlcmUgdGhlIHJld3JpdGUgd291bGQgY29zdCBtb3JlIHRoYW4gdGhlIGhpc3RvcnkgaXQgcmVtb3Zlc1xuY29uc3QgTUlOX0NPTVBBQ1RfUkVDT1JEUyA9IDEwMDA7XG4vLyBBcHBlbmRzIGFyZSBjb2FsZXNjZWQgZm9yIHRoaXMgbG9uZy4gQSBjcmFzaCBsb3NlcyBhdCBtb3N0IHRoaXMgbXVjaCAtIHRoZSBjYWxsZXJzIG9mIHRoaXMgY2xhc3MgdHJlYXQgdGhlaXIgZGF0YSBhcyByZWNvbnN0cnVjdGlibGUgLSBhbmQgdGhlIGFsdGVybmF0aXZlIGlzIGEgZmlsZSB3cml0ZSBwZXIgc2V0LlxuY29uc3QgRkxVU0hfREVMQVkgPSA1MDA7XG5cbi8qKiBBIGxpdmUgdmFsdWU6IHdoYXQgd2FzIHN0b3JlZCwgd2hlbiBpdCB3YXMgd3JpdHRlbiAodGhlIGNhbGxlcidzIG9yZGVyaW5nKSwgYW5kIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0IChvdXJzKS4gKi9cbmV4cG9ydCB0eXBlIExvZ0VudHJ5PFQ+ID0geyB2YWx1ZTogVDsgdGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9O1xuLyoqIEEgZGVsZXRlZCBrZXk6IHdoZW4gaXQgd2FzIGRlbGV0ZWQsIGFuZCB3aGVuIHdlIGxlYXJuZWQuIFdoZW4gdGhlIGtleSBoYWQgYSBsaXZlIHZhbHVlIGF0IGRlbGV0aW9uIHRpbWUgaXQgaXMgTUFSS0VEIHJhdGhlciB0aGFuIGdvbmUgLSB0aGUgdmFsdWUgKGFuZCBpdHMgb3JpZ2luYWwgd3JpdGUgdGltZSkgcmlkZXMgYWxvbmcsIHNvIHRoZSB1bmRlcmx5aW5nIGRhdGEgY2FuIHN0aWxsIGJlIHJlYWQgYW5kIHRoZSBkZWxldGlvbiBjYW4gYmUgdW5kb25lIChzZWUgdW5tYXJrKSB1bnRpbCB0aGUgaGlzdG9yeSBpcyBkcm9wcGVkIChzZWUgZHJvcFZhbHVlKS4gKi9cbmV4cG9ydCB0eXBlIExvZ1RvbWJzdG9uZTxUPiA9IHsgdGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlcjsgdmFsdWU/OiBUOyB2YWx1ZVRpbWU/OiBudW1iZXIgfTtcblxuLy8gT25lIGxpbmUgb2YgdGhlIGxvZywgd2l0aCBzaW5nbGUtbGV0dGVyIGZpZWxkIG5hbWVzIGJlY2F1c2UgdGhlcmUgaXMgb25lIHJlY29yZCBwZXIgc2V0L2RlbGV0ZS9wdXJnZSBldmVyIG1hZGUgYW5kIHRoZSBmaWVsZCBuYW1lcyBhcmUgbW9zdCBvZiBhIHJlY29yZCdzIG92ZXJoZWFkLiBKU09OLnN0cmluZ2lmeSBlc2NhcGVzIG5ld2xpbmVzIGluc2lkZSBrZXlzIGFuZCB2YWx1ZXMsIHNvIGEgcmVjb3JkIGNhbiBuZXZlciBjb250YWluIHRoZSBzZXBhcmF0b3IuXG50eXBlIExvZ1JlY29yZDxUPiA9IHtcbiAgICAvLyBrZXlcbiAgICBrOiBzdHJpbmc7XG4gICAgLy8gdGltZSwgbGFzdE1vZGlmaWVkIHRpbWUgb2YgdGhlIGZpbGUsIG9yIHRoZSBkZWxldGUgdGltZSwgb3IgdGhlIHB1cmdlIHRpbWVcbiAgICB0OiBudW1iZXI7XG4gICAgLy8gdmFsdWVcbiAgICB2PzogVDtcbiAgICAvLyBkZWxldGVkLCB0aGUgZmlsZSBvbiBkaXNrIGlzIGRlbGV0ZWQsIHByZXNlcnZlZCB3aGVuIHdlIGNvbXBhY3RcbiAgICBkPzogMTtcbiAgICAvLyBtYXJrZWQgZm9yIGRlbGV0aW9uOiBkZWxldGVkLCBidXQgdGhlIHZhbHVlICh2KSBhbmQgaXRzIG9yaWdpbmFsIHdyaXRlIHRpbWUgKHcpIGFyZSBrZXB0LCBzbyB0aGUgZGF0YSBpcyBzdGlsbCByZWFkYWJsZSBhbmQgcmVzdG9yYWJsZS4gUHJlc2VydmVkIHdoZW4gd2UgY29tcGFjdC5cbiAgICBtPzogMTtcbiAgICAvLyB3cml0ZVRpbWUsIHRoZSBvcmlnaW5hbCB3cml0ZSB0aW1lIG9mIGEgbWFya2VkLWZvci1kZWxldGlvbiB2YWx1ZSAodCBpcyB0aGUgREVMRVRFIHRpbWUgb24gdGhvc2UgcmVjb3JkcylcbiAgICB3PzogbnVtYmVyO1xuICAgIC8vIHB1cmdlZCwgdGhlIGZpbGUgb24gZGlzayBpcyBkZWxldGVkLCBub3QgcHJlc2VydmVkIHdoZW4gd2UgY29tcGFjdFxuICAgIHA/OiAxO1xufTtcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uRmlsZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWxlUGF0aDogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgdmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIExvZ0VudHJ5PFQ+PigpO1xuICAgIHByaXZhdGUgZGVsZXRlZCA9IG5ldyBNYXA8c3RyaW5nLCBMb2dUb21ic3RvbmU8VD4+KCk7XG4gICAgLy8gUmVjb3JkcyB0aGUgbG9nIGhvbGRzICh3cml0dGVuIHBsdXMgcGVuZGluZykgLSB3aGF0IGNvbXBhY3Rpb24gaXMgZGVjaWRlZCBhZ2FpbnN0LCBOT1QgdGhlIG51bWJlciBvZiBrZXlzXG4gICAgcHJpdmF0ZSBsb2dSZWNvcmRzID0gMDtcbiAgICBwcml2YXRlIHBlbmRpbmc6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICAvLyBTZXJpYWxpemVzIGV2ZXJ5dGhpbmcgdGhhdCB0b3VjaGVzIHRoZSBmaWxlLCBzbyBhbiBhcHBlbmQgY2FuIG5ldmVyIGludGVybGVhdmUgd2l0aCBhIHJld3JpdGVcbiAgICBwcml2YXRlIHdyaXRlQ2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIC8qKiBSZWFkcyB0aGUgbG9nIGFuZCByZXBsYXlzIGl0IGludG8gbWVtb3J5LiBFdmVyeSBvdGhlciBtZXRob2QgYXNzdW1lcyB0aGlzIGhhcyBmaW5pc2hlZC4gKi9cbiAgICBwdWJsaWMgbG9hZCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgZGF0YTogc3RyaW5nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHRoaXMuZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKChlIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcHBsaWVkID0gMDtcbiAgICAgICAgbGV0IGRhbWFnZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGRhdGEuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgICAgICAgIGlmICghbGluZSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgcmVjb3JkOiBMb2dSZWNvcmQ8VD4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlY29yZCA9IEpTT04ucGFyc2UobGluZSkgYXMgTG9nUmVjb3JkPFQ+O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gQSBjcmFzaCBtaWQtYXBwZW5kIGxlYXZlcyBhIHRvcm4gZmluYWwgbGluZTsgYW55dGhpbmcgZWFybGllciBtZWFucyByZWFsIGRhbWFnZS4gRWl0aGVyIHdheSB0aGUgcmVzdCBvZiB0aGUgbG9nIGlzIHN0aWxsIHdvcnRoIGhhdmluZyAtIHRoaXMgaXMgYW4gaW5kZXgsIGFuZCBzY2FubmluZyByZWJ1aWxkcyB3aGF0ZXZlciB3ZSBsb3NlLlxuICAgICAgICAgICAgICAgIGRhbWFnZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGxpZWQrKztcbiAgICAgICAgICAgIC8vIFJlcGxheWVkIHRocm91Z2ggdGhlIHNhbWUgb3JkZXJpbmcgcnVsZXMgdGhhdCBwcm9kdWNlZCBpdCwgc28gYSBsb2cgd3JpdHRlbiBvdXQgb2Ygb3JkZXIgc3RpbGwgbGFuZHMgb24gdGhlIHNhbWUgc3RhdGVcbiAgICAgICAgICAgIGlmIChyZWNvcmQucCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLmRlbGV0ZShyZWNvcmQuayk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkLmRlbGV0ZShyZWNvcmQuayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC5tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseURlbGV0ZShyZWNvcmQuaywgcmVjb3JkLnQsIHJlY29yZC50LCByZWNvcmQudiwgcmVjb3JkLncpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlEZWxldGUocmVjb3JkLmssIHJlY29yZC50LCByZWNvcmQudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC52ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2V0KHJlY29yZC5rLCByZWNvcmQudiwgcmVjb3JkLnQsIHJlY29yZC50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ1JlY29yZHMgPSBhcHBsaWVkO1xuICAgICAgICBpZiAoZGFtYWdlZCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtkYW1hZ2VkfSBkYW1hZ2VkIHJlY29yZChzKSBpbiAke3RoaXMuZmlsZVBhdGh9IHdlcmUgc2tpcHBlZDsgJHthcHBsaWVkfSBhcHBsaWVkLCBsZWF2aW5nICR7dGhpcy52YWx1ZXMuc2l6ZX0gdmFsdWVzIGFuZCAke3RoaXMuZGVsZXRlZC5zaXplfSB0b21ic3RvbmVzYCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKiBUaGUgbGl2ZSB2YWx1ZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGtleSBkb2VzIG5vdCBleGlzdCBoZXJlIChkZWxldGVkIGluY2x1ZGVkIC0gYSBkZWxldGlvbiBpcyBhbiBhYnNlbmNlLCBzZWUgZ2V0RGVsZXRlZCBmb3IgaXRzIHRpbWUpLiAqL1xuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBMb2dFbnRyeTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5nZXQoa2V5KTtcbiAgICB9XG4gICAgLyoqIFdoZW4gdGhlIGtleSB3YXMgZGVsZXRlZCwgaWYgaXQgd2FzICh2YWx1ZSBpbmNsdWRlZCB3aGVuIHRoZSBkZWxldGlvbiBpcyBzdGlsbCBtYXJrZWQgLSBzZWUgTG9nVG9tYnN0b25lKS4gQWJzZW50IGJvdGggaGVyZSBhbmQgaW4gZ2V0IG1lYW5zIHdlIGhhdmUgbmV2ZXIgaGVhcmQgb2YgaXQuICovXG4gICAgcHVibGljIGdldERlbGV0ZWQoa2V5OiBzdHJpbmcpOiBMb2dUb21ic3RvbmU8VD4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVkLmdldChrZXkpO1xuICAgIH1cbiAgICAvKiogVGhlIHRpbWUgdGhlIGtleSBsYXN0IGNoYW5nZWQgZWl0aGVyIHdheSwgb3IgMCBpZiB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIGl0IC0gd2hhdCBhIG5ldyB3cml0ZSBoYXMgdG8gYmVhdC4gKi9cbiAgICBwdWJsaWMgdGltZU9mKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGxpdmUgPSB0aGlzLnZhbHVlcy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGxpdmUpIHJldHVybiBsaXZlLnRpbWU7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZWQuZ2V0KGtleSk/LnRpbWUgfHwgMDtcbiAgICB9XG5cbiAgICAvKiogTygxKSwgYW5kIGNvdW50cyBvbmx5IHdoYXQgZXhpc3RzLiAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuc2l6ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBkZWxldGVkU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVkLnNpemU7XG4gICAgfVxuICAgIC8qKiBMaXZlIHZhbHVlcyBvbmx5LiBMaXZlLCBpbiBpbnNlcnRpb24gb3JkZXIgLSBkZWxldGluZyBkdXJpbmcgaXRlcmF0aW9uIGlzIHNhZmUgKEpTIHNraXBzIGVudHJpZXMgcmVtb3ZlZCBiZWZvcmUgdGhleSBhcmUgcmVhY2hlZCksIHdoaWNoIGlzIHdoYXQgdGhlIHBhc3NlcyB0aGF0IHdhbGsgZXZlcnl0aGluZyBhbmQgcHJ1bmUgYXMgdGhleSBnbyByZWx5IG9uLiAqL1xuICAgIHB1YmxpYyBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgTG9nRW50cnk8VD5dPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5lbnRyaWVzKCk7XG4gICAgfVxuICAgIC8qKiBUaGUgdG9tYnN0b25lcywgd2hpY2ggaXMgYSBtdWNoIHNtYWxsZXIgd2FsayB0aGFuIHRoZSB2YWx1ZXMgLSBzbyBleHBpcmluZyB0aGVtLCBvciBsaXN0aW5nIHdoYXQgd2FzIGRlbGV0ZWQgc2luY2Ugc29tZSB0aW1lLCBjb3N0cyB3aGF0IGl0IHNob3VsZC4gKi9cbiAgICBwdWJsaWMgZGVsZXRlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBMb2dUb21ic3RvbmU8VD5dPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZWQuZW50cmllcygpO1xuICAgIH1cblxuICAgIC8qKiBTdG9yZXMgYSB2YWx1ZSBhcyBvZiBgdGltZWAuIFJldHVybnMgZmFsc2Ugd2hlbiBzb21ldGhpbmcgYXQgbGVhc3QgYXMgbmV3IGlzIGFscmVhZHkgaGVyZSwgaW4gd2hpY2ggY2FzZSBub3RoaW5nIGNoYW5nZWQgLSBhbiBvdXQtb2Ytb3JkZXIgd3JpdGUgaXMgbm90IGFuIGVycm9yLCBpdCBpcyBqdXN0IGxhdGUuICovXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFQsIHRpbWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuYXBwbHlTZXQoa2V5LCB2YWx1ZSwgdGltZSwgRGF0ZS5ub3coKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5hcHBlbmQoeyBrOiBrZXksIHQ6IHRpbWUsIHY6IHZhbHVlIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogRGVsZXRlcyBhcyBvZiBgdGltZWAsIGtlZXBpbmcgdGhlIHRvbWJzdG9uZS4gQSBrZXkgdGhhdCBoYWQgYSBsaXZlIHZhbHVlIGtlZXBzIGl0IGluIHRoZSB0b21ic3RvbmUgYXMgTUFSS0VEIGZvciBkZWxldGlvbiAocmVhZGFibGUgYW5kIHJlc3RvcmFibGUgdW50aWwgZHJvcFZhbHVlKS4gUmV0dXJucyBmYWxzZSB3aGVuIHNvbWV0aGluZyBhdCBsZWFzdCBhcyBuZXcgaXMgYWxyZWFkeSBoZXJlLiAqL1xuICAgIHB1YmxpYyBkZWxldGUoa2V5OiBzdHJpbmcsIHRpbWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgbGl2ZSA9IHRoaXMudmFsdWVzLmdldChrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuYXBwbHlEZWxldGUoa2V5LCB0aW1lLCBEYXRlLm5vdygpLCBsaXZlPy52YWx1ZSwgbGl2ZT8udGltZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGxpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHsgazoga2V5LCB0OiB0aW1lLCBtOiAxLCB2OiBsaXZlLnZhbHVlLCB3OiBsaXZlLnRpbWUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh7IGs6IGtleSwgdDogdGltZSwgZDogMSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogVW5kb2VzIGEgbWFya2VkIGRlbGV0aW9uOiB0aGUga2VwdCB2YWx1ZSBiZWNvbWVzIGxpdmUgYWdhaW4sIGFzIG9mIGB0aW1lYCAoYSBmcmVzaCB0aW1lLCBzbyB0aGUgcmVzdG9yZSBvdXRyYW5rcyB0aGUgZGVsZXRpb24gZXZlcnl3aGVyZSBpdCBwcm9wYWdhdGVkKS4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZXJlIGlzIG5vIG1hcmtlZCB2YWx1ZSB0byByZXN0b3JlLCBvciBzb21ldGhpbmcgYXQgbGVhc3QgYXMgbmV3IGlzIGFscmVhZHkgaGVyZS4gKi9cbiAgICBwdWJsaWMgdW5tYXJrKGtleTogc3RyaW5nLCB0aW1lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHRvbWJzdG9uZSA9IHRoaXMuZGVsZXRlZC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCF0b21ic3RvbmUgfHwgdG9tYnN0b25lLnZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLmFwcGx5U2V0KGtleSwgdG9tYnN0b25lLnZhbHVlLCB0aW1lLCBEYXRlLm5vdygpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLmFwcGVuZCh7IGs6IGtleSwgdDogdGltZSwgdjogdG9tYnN0b25lLnZhbHVlIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogRHJvcHMgYSBtYXJrZWQgZGVsZXRpb24ncyBrZXB0IHZhbHVlIChpdHMgaGlzdG9yeSBoYXMgYmVlbiBwaHlzaWNhbGx5IHJlbW92ZWQpLCBsZWF2aW5nIGEgcGxhaW4gdG9tYnN0b25lIHdpdGggdGhlIHNhbWUgZGVsZXRlIHRpbWUuICovXG4gICAgcHVibGljIGRyb3BWYWx1ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5kZWxldGVkLmdldChrZXkpO1xuICAgICAgICBpZiAoIXRvbWJzdG9uZSB8fCB0b21ic3RvbmUudmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmRlbGV0ZWQuc2V0KGtleSwgeyB0aW1lOiB0b21ic3RvbmUudGltZSwgY2hhbmdlZEF0OiBEYXRlLm5vdygpIH0pO1xuICAgICAgICB0aGlzLmFwcGVuZCh7IGs6IGtleSwgdDogdG9tYnN0b25lLnRpbWUsIGQ6IDEgfSk7XG4gICAgfVxuXG4gICAgLyoqIEZvcmdldHMgdGhlIGtleSBlbnRpcmVseSwgdG9tYnN0b25lIGluY2x1ZGVkIC0gZm9yIGEgdG9tYnN0b25lIG9sZCBlbm91Z2ggdGhhdCBub2JvZHkgbmVlZHMgdG8gaGVhciBhYm91dCB0aGUgZGVsZXRpb24gYW55IG1vcmUsIGFuZCBmb3IgYW4gZW50cnkgdGhhdCB0dXJuZWQgb3V0IG5ldmVyIHRvIGhhdmUgZXhpc3RlZC4gTm90IGEgZGVsZXRpb246IGl0IGxlYXZlcyBub3RoaW5nIGJlaGluZCB0byBwcm9wYWdhdGUuICovXG4gICAgcHVibGljIHB1cmdlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGxldCBoYWQgPSB0aGlzLnZhbHVlcy5kZWxldGUoa2V5KTtcbiAgICAgICAgaGFkID0gdGhpcy5kZWxldGVkLmRlbGV0ZShrZXkpIHx8IGhhZDtcbiAgICAgICAgaWYgKCFoYWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5hcHBlbmQoeyBrOiBrZXksIHQ6IERhdGUubm93KCksIHA6IDEgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseVNldChrZXk6IHN0cmluZywgdmFsdWU6IFQsIHRpbWU6IG51bWJlciwgY2hhbmdlZEF0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRpbWUgPCB0aGlzLnRpbWVPZihrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVsZXRlZC5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhpcy52YWx1ZXMuc2V0KGtleSwgeyB2YWx1ZSwgdGltZSwgY2hhbmdlZEF0IH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5RGVsZXRlKGtleTogc3RyaW5nLCB0aW1lOiBudW1iZXIsIGNoYW5nZWRBdDogbnVtYmVyLCB2YWx1ZT86IFQsIHZhbHVlVGltZT86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGltZSA8IHRoaXMudGltZU9mKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMuZGVsZXRlZC5zZXQoa2V5LCB7IHRpbWUsIGNoYW5nZWRBdCwgdmFsdWUsIHZhbHVlVGltZSB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmQocmVjb3JkOiBMb2dSZWNvcmQ8VD4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nLnB1c2goSlNPTi5zdHJpbmdpZnkocmVjb3JkKSk7XG4gICAgICAgIHRoaXMubG9nUmVjb3JkcysrO1xuICAgICAgICB0aGlzLnNjaGVkdWxlRmx1c2goKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjaGVkdWxlRmx1c2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoVGltZXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5mbHVzaCgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRmx1c2hpbmcgJHt0aGlzLmZpbGVQYXRofSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfSwgRkxVU0hfREVMQVkpO1xuICAgICAgICAodGhpcy5mbHVzaFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGV2ZXJ5dGhpbmcgcGVuZGluZyAocmV3cml0aW5nIHRoZSBsb2cgZmlyc3QgaWYgaXQgaGFzIGdyb3duIHRvbyBmYXIgcGFzdCB3aGF0IGl0IGRlc2NyaWJlcykuICovXG4gICAgcHVibGljIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy53cml0ZUNoYWluLnRoZW4oKCkgPT4gdGhpcy53cml0ZSgpKTtcbiAgICAgICAgLy8gVGhlIGNoYWluIG9ubHkgZXhpc3RzIHRvIHNlcmlhbGl6ZSB3cml0ZXMsIHNvIGl0IG11c3Qgbm90IHN0YXkgcmVqZWN0ZWQ6IGEgZmFpbHVyZSBiZWxvbmdzIHRvIHRoZSBjYWxsZXIgdGhhdCBhc2tlZCBmb3IgdGhpcyBmbHVzaCwgbm90IHRvIGV2ZXJ5IGZsdXNoIGFmdGVyIGl0XG4gICAgICAgIHRoaXMud3JpdGVDaGFpbiA9IHJlc3VsdC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICBhd2FpdCByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXJlY3RvcnkgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKHRoaXMuZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmxvZ1JlY29yZHMgPiBNYXRoLm1heChNSU5fQ09NUEFDVF9SRUNPUkRTLCAodGhpcy52YWx1ZXMuc2l6ZSArIHRoaXMuZGVsZXRlZC5zaXplKSAqIENPTVBBQ1RfUkFUSU8pKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbXBhY3QoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZFBlbmRpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFwcGVuZFBlbmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVjb3JkcyA9IHRoaXMucGVuZGluZztcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gW107XG4gICAgICAgIGF3YWl0IHRoaXMuZGlyZWN0b3J5KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5hcHBlbmRGaWxlKHRoaXMuZmlsZVBhdGgsIHJlY29yZHMuam9pbihcIlxcblwiKSArIFwiXFxuXCIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBQdXQgdGhlbSBiYWNrIHJhdGhlciB0aGFuIGxvc2UgdGhlbTogdGhlIHZhbHVlcyBhcmUgc3RpbGwgaW4gbWVtb3J5LCBzbyBhbGwgdGhhdCBpcyBhdCByaXNrIGlzIGhhdmluZyB0byByZWJ1aWxkIHRoZW0gYnkgc2Nhbm5pbmdcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IHJlY29yZHMuY29uY2F0KHRoaXMucGVuZGluZyk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXdyaXRlcyB0aGUgbG9nIGFzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIGJvdGggbWFwcy4gVGhleSBhcmUgdGhlIHRydXRoIC0gdGhlIGxvZyBvbmx5IGV4aXN0cyB0byByZWJ1aWxkIHRoZW0gLSBzbyB0aGUgc25hcHNob3QgSVMgdGhlIG5ldyBsb2cuXG4gICAgcHJpdmF0ZSBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVjb3Jkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMudmFsdWVzKSB7XG4gICAgICAgICAgICByZWNvcmRzLnB1c2goSlNPTi5zdHJpbmdpZnkoeyBrOiBrZXksIHQ6IGVudHJ5LnRpbWUsIHY6IGVudHJ5LnZhbHVlIH0gc2F0aXNmaWVzIExvZ1JlY29yZDxUPikpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5kZWxldGVkKSB7XG4gICAgICAgICAgICBpZiAodG9tYnN0b25lLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZWNvcmRzLnB1c2goSlNPTi5zdHJpbmdpZnkoeyBrOiBrZXksIHQ6IHRvbWJzdG9uZS50aW1lLCBtOiAxLCB2OiB0b21ic3RvbmUudmFsdWUsIHc6IHRvbWJzdG9uZS52YWx1ZVRpbWUgfSBzYXRpc2ZpZXMgTG9nUmVjb3JkPFQ+KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29yZHMucHVzaChKU09OLnN0cmluZ2lmeSh7IGs6IGtleSwgdDogdG9tYnN0b25lLnRpbWUsIGQ6IDEgfSBzYXRpc2ZpZXMgTG9nUmVjb3JkPFQ+KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXJlZCB3aXRoIHRoZSBzbmFwc2hvdDogZXZlcnkgcGVuZGluZyByZWNvcmQgaXMgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIG1hcHMsIHNvIHRoZSBzbmFwc2hvdCBjb250YWlucyBpdC4gQW55dGhpbmcgYXBwZW5kZWQgZnJvbSBoZXJlIG9uIGlzIE5PVCBpbiB0aGUgc25hcHNob3QsIGFuZCBsYW5kcyBpbiB0aGUgbmV3IGxvZyBhZnRlciB0aGUgcmVuYW1lLlxuICAgICAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICAgICAgbGV0IHN0YXJ0ZWRXaXRoID0gdGhpcy5sb2dSZWNvcmRzO1xuICAgICAgICBsZXQgdGVtcFBhdGggPSBgJHt0aGlzLmZpbGVQYXRofS5jb21wYWN0aW5nYDtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXJlY3RvcnkoKTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHRlbXBQYXRoLCByZWNvcmRzLmxlbmd0aCAmJiBgJHtyZWNvcmRzLmpvaW4oXCJcXG5cIil9XFxuYCB8fCBcIlwiKTtcbiAgICAgICAgLy8gUmVwbGFjZXMgdGhlIG9sZCBsb2cgaW4gb25lIHN0ZXAsIHNvIGEgY3Jhc2ggbGVhdmVzIGVpdGhlciB0aGUgd2hvbGUgb2xkIGxvZyBvciB0aGUgd2hvbGUgbmV3IG9uZVxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUodGVtcFBhdGgsIHRoaXMuZmlsZVBhdGgpO1xuICAgICAgICB0aGlzLmxvZ1JlY29yZHMgPSByZWNvcmRzLmxlbmd0aCArIHRoaXMucGVuZGluZy5sZW5ndGg7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZXdyb3RlICR7dGhpcy5maWxlUGF0aH06ICR7c3RhcnRlZFdpdGh9IGxvZyByZWNvcmRzIGZvciAke3RoaXMudmFsdWVzLnNpemV9IHZhbHVlcyBhbmQgJHt0aGlzLmRlbGV0ZWQuc2l6ZX0gdG9tYnN0b25lc2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZFBlbmRpbmcoKTtcbiAgICB9XG59XG4iXX0=
|
|
244
|
-
/* _JS_SOURCE_HASH = "
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25GaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiVHJhbnNhY3Rpb25GaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIseURBQW1EO0FBRW5ELG9iQUFvYjtBQUNwYixFQUFFO0FBQ0Ysb0tBQW9LO0FBRXBLLCtJQUErSTtBQUMvSSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIsOEZBQThGO0FBQzlGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQ2pDLHNMQUFzTDtBQUN0TCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUF5QnhCLE1BQWEsZUFBZTtJQUN4QixZQUFvQixRQUFnQjtRQUFoQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBRTVCLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUN4QyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7UUFDckQsNEdBQTRHO1FBQ3BHLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBRS9CLGdHQUFnRztRQUN4RixlQUFVLEdBQWtCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV0RCw4RkFBOEY7UUFDdkYsU0FBSSxHQUFHLElBQUEsY0FBSSxFQUFDLEtBQUssSUFBSSxFQUFFO1lBQzFCLElBQUksSUFBWSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDRCxJQUFJLEdBQUcsTUFBTSxZQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdELENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNULElBQUssQ0FBdUIsQ0FBQyxJQUFJLEtBQUssUUFBUTtvQkFBRSxPQUFPO2dCQUN2RCxNQUFNLENBQUMsQ0FBQztZQUNaLENBQUM7WUFDRCxJQUFJLE9BQU8sR0FBRyxD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Q0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pGLG9HQUFvRztRQUNwRyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsUUFBUSxLQUFLLFdBQVcsb0JBQW9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQztRQUN2SSxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMvQixDQUFDO0NBQ0o7QUFuT0QsMENBbU9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9jYWNoaW5nXCI7XG5cbi8vIEEgcGVyc2lzdGVudCBNYXAgdGhhdCBrbm93cyBhYm91dCB0aW1lIGFuZCBhYm91dCBkZWxldGlvbnMuIEV2ZXJ5IHZhbHVlIGNhcnJpZXMgdGhlIHRpbWUgaXQgd2FzIHdyaXR0ZW4sIHNvIGEgd3JpdGUgdGhhdCBhcnJpdmVzIG91dCBvZiBvcmRlciBpcyBzaW1wbHkgbm90IGFwcGxpZWQgLSB0aGUgbWFwIGNhbm5vdCBiZSBtYWRlIHRvIGdvIGJhY2t3YXJkcy4gQSBkZWxldGVkIGtleSBrZWVwcyBpdHMgdGltZSB0b28sIGFzIGEgdG9tYnN0b25lIGluIGEgc2Vjb25kIG1hcCwgc28gXCJ3YXMgdGhpcyBkZWxldGVkLCBhbmQgd2hlblwiIGlzIGFzIGNoZWFwIHRvIGFzayBhcyBcImRvZXMgdGhpcyBleGlzdFwiLCBhbmQgZXhwaXJpbmcgb2xkIHRvbWJzdG9uZXMgaXMgYSB3YWxrIG9mIHRoZSB0b21ic3RvbmVzIGFsb25lIHJhdGhlciB0aGFuIG9mIGV2ZXJ5dGhpbmcuXG4vL1xuLy8gT24gZGlzayBpdCBpcyBvbmUgYXBwZW5kLW9ubHkgbG9nIG9mIHRoZSBzZXRzLCBkZWxldGVzIGFuZCBwdXJnZXMgdGhhdCBwcm9kdWNlZCBib3RoIG1hcHMsIHJld3JpdHRlbiBmcm9tIHRoZW0gd2hlbmV2ZXIgaXQgaGFzIGdyb3duIHRvIHNldmVyYWwgdGltZXMgdGhlaXIgc2l6ZS5cblxuLy8gVGhlIGxvZyBpcyByZXdyaXR0ZW4gb25jZSBpdCBob2xkcyB0aGlzIG1hbnkgdGltZXMgbW9yZSByZWNvcmRzIHRoYW4gdGhlcmUgYXJlIGtleXMgKGEgbG9nIG9mIDMgcmVjb3JkcyBwZXIgc3Vydml2aW5nIGtleSBpcyBtb3N0bHkgaGlzdG9yeSlcbmNvbnN0IENPTVBBQ1RfUkFUSU8gPSAzO1xuLy8gLi4uYnV0IG5ldmVyIGZvciBhIHNtYWxsIGxvZywgd2hlcmUgdGhlIHJld3JpdGUgd291bGQgY29zdCBtb3JlIHRoYW4gdGhlIGhpc3RvcnkgaXQgcmVtb3Zlc1xuY29uc3QgTUlOX0NPTVBBQ1RfUkVDT1JEUyA9IDEwMDA7XG4vLyBBcHBlbmRzIGFyZSBjb2FsZXNjZWQgZm9yIHRoaXMgbG9uZy4gQSBjcmFzaCBsb3NlcyBhdCBtb3N0IHRoaXMgbXVjaCAtIHRoZSBjYWxsZXJzIG9mIHRoaXMgY2xhc3MgdHJlYXQgdGhlaXIgZGF0YSBhcyByZWNvbnN0cnVjdGlibGUgLSBhbmQgdGhlIGFsdGVybmF0aXZlIGlzIGEgZmlsZSB3cml0ZSBwZXIgc2V0LlxuY29uc3QgRkxVU0hfREVMQVkgPSA1MDA7XG5cbi8qKiBBIGxpdmUgdmFsdWU6IHdoYXQgd2FzIHN0b3JlZCwgd2hlbiBpdCB3YXMgd3JpdHRlbiAodGhlIGNhbGxlcidzIG9yZGVyaW5nKSwgYW5kIHdoZW4gd2UgbGFzdCBjaGFuZ2VkIGl0IChvdXJzKS4gKi9cbmV4cG9ydCB0eXBlIExvZ0VudHJ5PFQ+ID0geyB2YWx1ZTogVDsgdGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlciB9O1xuLyoqIEEgZGVsZXRlZCBrZXk6IHdoZW4gaXQgd2FzIGRlbGV0ZWQsIGFuZCB3aGVuIHdlIGxlYXJuZWQuIFdoZW4gdGhlIGtleSBoYWQgYSBsaXZlIHZhbHVlIGF0IGRlbGV0aW9uIHRpbWUgaXQgaXMgTUFSS0VEIHJhdGhlciB0aGFuIGdvbmUgLSB0aGUgdmFsdWUgKGFuZCBpdHMgb3JpZ2luYWwgd3JpdGUgdGltZSkgcmlkZXMgYWxvbmcsIHNvIHRoZSB1bmRlcmx5aW5nIGRhdGEgY2FuIHN0aWxsIGJlIHJlYWQgYW5kIHRoZSBkZWxldGlvbiBjYW4gYmUgdW5kb25lIChzZWUgdW5tYXJrKSB1bnRpbCB0aGUgaGlzdG9yeSBpcyBkcm9wcGVkIChzZWUgZHJvcFZhbHVlKS4gKi9cbmV4cG9ydCB0eXBlIExvZ1RvbWJzdG9uZTxUPiA9IHsgdGltZTogbnVtYmVyOyBjaGFuZ2VkQXQ6IG51bWJlcjsgdmFsdWU/OiBUOyB2YWx1ZVRpbWU/OiBudW1iZXIgfTtcblxuLy8gT25lIGxpbmUgb2YgdGhlIGxvZywgd2l0aCBzaW5nbGUtbGV0dGVyIGZpZWxkIG5hbWVzIGJlY2F1c2UgdGhlcmUgaXMgb25lIHJlY29yZCBwZXIgc2V0L2RlbGV0ZS9wdXJnZSBldmVyIG1hZGUgYW5kIHRoZSBmaWVsZCBuYW1lcyBhcmUgbW9zdCBvZiBhIHJlY29yZCdzIG92ZXJoZWFkLiBKU09OLnN0cmluZ2lmeSBlc2NhcGVzIG5ld2xpbmVzIGluc2lkZSBrZXlzIGFuZCB2YWx1ZXMsIHNvIGEgcmVjb3JkIGNhbiBuZXZlciBjb250YWluIHRoZSBzZXBhcmF0b3IuXG50eXBlIExvZ1JlY29yZDxUPiA9IHtcbiAgICAvLyBrZXlcbiAgICBrOiBzdHJpbmc7XG4gICAgLy8gdGltZSwgbGFzdE1vZGlmaWVkIHRpbWUgb2YgdGhlIGZpbGUsIG9yIHRoZSBkZWxldGUgdGltZSwgb3IgdGhlIHB1cmdlIHRpbWVcbiAgICB0OiBudW1iZXI7XG4gICAgLy8gdmFsdWVcbiAgICB2PzogVDtcbiAgICAvLyBkZWxldGVkLCB0aGUgZmlsZSBvbiBkaXNrIGlzIGRlbGV0ZWQsIHByZXNlcnZlZCB3aGVuIHdlIGNvbXBhY3RcbiAgICBkPzogMTtcbiAgICAvLyBtYXJrZWQgZm9yIGRlbGV0aW9uOiBkZWxldGVkLCBidXQgdGhlIHZhbHVlICh2KSBhbmQgaXRzIG9yaWdpbmFsIHdyaXRlIHRpbWUgKHcpIGFyZSBrZXB0LCBzbyB0aGUgZGF0YSBpcyBzdGlsbCByZWFkYWJsZSBhbmQgcmVzdG9yYWJsZS4gUHJlc2VydmVkIHdoZW4gd2UgY29tcGFjdC5cbiAgICBtPzogMTtcbiAgICAvLyB3cml0ZVRpbWUsIHRoZSBvcmlnaW5hbCB3cml0ZSB0aW1lIG9mIGEgbWFya2VkLWZvci1kZWxldGlvbiB2YWx1ZSAodCBpcyB0aGUgREVMRVRFIHRpbWUgb24gdGhvc2UgcmVjb3JkcylcbiAgICB3PzogbnVtYmVyO1xuICAgIC8vIHB1cmdlZCwgdGhlIGZpbGUgb24gZGlzayBpcyBkZWxldGVkLCBub3QgcHJlc2VydmVkIHdoZW4gd2UgY29tcGFjdFxuICAgIHA/OiAxO1xufTtcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uRmlsZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWxlUGF0aDogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgdmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIExvZ0VudHJ5PFQ+PigpO1xuICAgIHByaXZhdGUgZGVsZXRlZCA9IG5ldyBNYXA8c3RyaW5nLCBMb2dUb21ic3RvbmU8VD4+KCk7XG4gICAgLy8gUmVjb3JkcyB0aGUgbG9nIGhvbGRzICh3cml0dGVuIHBsdXMgcGVuZGluZykgLSB3aGF0IGNvbXBhY3Rpb24gaXMgZGVjaWRlZCBhZ2FpbnN0LCBOT1QgdGhlIG51bWJlciBvZiBrZXlzXG4gICAgcHJpdmF0ZSBsb2dSZWNvcmRzID0gMDtcbiAgICBwcml2YXRlIHBlbmRpbmc6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICAvLyBTZXJpYWxpemVzIGV2ZXJ5dGhpbmcgdGhhdCB0b3VjaGVzIHRoZSBmaWxlLCBzbyBhbiBhcHBlbmQgY2FuIG5ldmVyIGludGVybGVhdmUgd2l0aCBhIHJld3JpdGVcbiAgICBwcml2YXRlIHdyaXRlQ2hhaW46IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIC8qKiBSZWFkcyB0aGUgbG9nIGFuZCByZXBsYXlzIGl0IGludG8gbWVtb3J5LiBFdmVyeSBvdGhlciBtZXRob2QgYXNzdW1lcyB0aGlzIGhhcyBmaW5pc2hlZC4gKi9cbiAgICBwdWJsaWMgbG9hZCA9IGxhenkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgZGF0YTogc3RyaW5nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHRoaXMuZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKChlIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlID09PSBcIkVOT0VOVFwiKSByZXR1cm47XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcHBsaWVkID0gMDtcbiAgICAgICAgbGV0IGRhbWFnZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGRhdGEuc3BsaXQoXCJcXG5cIikpIHtcbiAgICAgICAgICAgIGlmICghbGluZSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgcmVjb3JkOiBMb2dSZWNvcmQ8VD4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlY29yZCA9IEpTT04ucGFyc2UobGluZSkgYXMgTG9nUmVjb3JkPFQ+O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gQSBjcmFzaCBtaWQtYXBwZW5kIGxlYXZlcyBhIHRvcm4gZmluYWwgbGluZTsgYW55dGhpbmcgZWFybGllciBtZWFucyByZWFsIGRhbWFnZS4gRWl0aGVyIHdheSB0aGUgcmVzdCBvZiB0aGUgbG9nIGlzIHN0aWxsIHdvcnRoIGhhdmluZyAtIHRoaXMgaXMgYW4gaW5kZXgsIGFuZCBzY2FubmluZyByZWJ1aWxkcyB3aGF0ZXZlciB3ZSBsb3NlLlxuICAgICAgICAgICAgICAgIGRhbWFnZWQrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFwcGxpZWQrKztcbiAgICAgICAgICAgIC8vIFJlcGxheWVkIHRocm91Z2ggdGhlIHNhbWUgb3JkZXJpbmcgcnVsZXMgdGhhdCBwcm9kdWNlZCBpdCwgc28gYSBsb2cgd3JpdHRlbiBvdXQgb2Ygb3JkZXIgc3RpbGwgbGFuZHMgb24gdGhlIHNhbWUgc3RhdGVcbiAgICAgICAgICAgIGlmIChyZWNvcmQucCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLmRlbGV0ZShyZWNvcmQuayk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkLmRlbGV0ZShyZWNvcmQuayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC5tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseURlbGV0ZShyZWNvcmQuaywgcmVjb3JkLnQsIHJlY29yZC50LCByZWNvcmQudiwgcmVjb3JkLncpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlEZWxldGUocmVjb3JkLmssIHJlY29yZC50LCByZWNvcmQudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC52ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2V0KHJlY29yZC5rLCByZWNvcmQudiwgcmVjb3JkLnQsIHJlY29yZC50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ1JlY29yZHMgPSBhcHBsaWVkO1xuICAgICAgICBpZiAoZGFtYWdlZCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgJHtkYW1hZ2VkfSBkYW1hZ2VkIHJlY29yZChzKSBpbiAke3RoaXMuZmlsZVBhdGh9IHdlcmUgc2tpcHBlZDsgJHthcHBsaWVkfSBhcHBsaWVkLCBsZWF2aW5nICR7dGhpcy52YWx1ZXMuc2l6ZX0gdmFsdWVzIGFuZCAke3RoaXMuZGVsZXRlZC5zaXplfSB0b21ic3RvbmVzYCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qKiBUaGUgbGl2ZSB2YWx1ZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGtleSBkb2VzIG5vdCBleGlzdCBoZXJlIChkZWxldGVkIGluY2x1ZGVkIC0gYSBkZWxldGlvbiBpcyBhbiBhYnNlbmNlLCBzZWUgZ2V0RGVsZXRlZCBmb3IgaXRzIHRpbWUpLiAqL1xuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBMb2dFbnRyeTxUPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5nZXQoa2V5KTtcbiAgICB9XG4gICAgLyoqIFdoZW4gdGhlIGtleSB3YXMgZGVsZXRlZCwgaWYgaXQgd2FzICh2YWx1ZSBpbmNsdWRlZCB3aGVuIHRoZSBkZWxldGlvbiBpcyBzdGlsbCBtYXJrZWQgLSBzZWUgTG9nVG9tYnN0b25lKS4gQWJzZW50IGJvdGggaGVyZSBhbmQgaW4gZ2V0IG1lYW5zIHdlIGhhdmUgbmV2ZXIgaGVhcmQgb2YgaXQuICovXG4gICAgcHVibGljIGdldERlbGV0ZWQoa2V5OiBzdHJpbmcpOiBMb2dUb21ic3RvbmU8VD4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVkLmdldChrZXkpO1xuICAgIH1cbiAgICAvKiogVGhlIHRpbWUgdGhlIGtleSBsYXN0IGNoYW5nZWQgZWl0aGVyIHdheSwgb3IgMCBpZiB3ZSBoYXZlIG5ldmVyIGhlYXJkIG9mIGl0IC0gd2hhdCBhIG5ldyB3cml0ZSBoYXMgdG8gYmVhdC4gKi9cbiAgICBwdWJsaWMgdGltZU9mKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGxpdmUgPSB0aGlzLnZhbHVlcy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGxpdmUpIHJldHVybiBsaXZlLnRpbWU7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZWQuZ2V0KGtleSk/LnRpbWUgfHwgMDtcbiAgICB9XG5cbiAgICAvKiogTygxKSwgYW5kIGNvdW50cyBvbmx5IHdoYXQgZXhpc3RzLiAqL1xuICAgIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZXMuc2l6ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBkZWxldGVkU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxldGVkLnNpemU7XG4gICAgfVxuICAgIC8qKiBMaXZlIHZhbHVlcyBvbmx5LiBMaXZlLCBpbiBpbnNlcnRpb24gb3JkZXIgLSBkZWxldGluZyBkdXJpbmcgaXRlcmF0aW9uIGlzIHNhZmUgKEpTIHNraXBzIGVudHJpZXMgcmVtb3ZlZCBiZWZvcmUgdGhleSBhcmUgcmVhY2hlZCksIHdoaWNoIGlzIHdoYXQgdGhlIHBhc3NlcyB0aGF0IHdhbGsgZXZlcnl0aGluZyBhbmQgcHJ1bmUgYXMgdGhleSBnbyByZWx5IG9uLiAqL1xuICAgIHB1YmxpYyBlbnRyaWVzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgTG9nRW50cnk8VD5dPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlcy5lbnRyaWVzKCk7XG4gICAgfVxuICAgIC8qKiBUaGUgdG9tYnN0b25lcywgd2hpY2ggaXMgYSBtdWNoIHNtYWxsZXIgd2FsayB0aGFuIHRoZSB2YWx1ZXMgLSBzbyBleHBpcmluZyB0aGVtLCBvciBsaXN0aW5nIHdoYXQgd2FzIGRlbGV0ZWQgc2luY2Ugc29tZSB0aW1lLCBjb3N0cyB3aGF0IGl0IHNob3VsZC4gKi9cbiAgICBwdWJsaWMgZGVsZXRlZEVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBMb2dUb21ic3RvbmU8VD5dPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZWQuZW50cmllcygpO1xuICAgIH1cblxuICAgIC8qKiBTdG9yZXMgYSB2YWx1ZSBhcyBvZiBgdGltZWAgKGZsb29yZWQgdG8gd2hvbGUgbWlsbGlzZWNvbmRzIC0gc2VlIGFwcGx5U2V0KS4gUmV0dXJucyBmYWxzZSB3aGVuIHNvbWV0aGluZyBhdCBsZWFzdCBhcyBuZXcgaXMgYWxyZWFkeSBoZXJlLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgY2hhbmdlZCAtIGFuIG91dC1vZi1vcmRlciB3cml0ZSBpcyBub3QgYW4gZXJyb3IsIGl0IGlzIGp1c3QgbGF0ZS4gKi9cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgdGltZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHRpbWUgPSBNYXRoLmZsb29yKHRpbWUpO1xuICAgICAgICBpZiAoIXRoaXMuYXBwbHlTZXQoa2V5LCB2YWx1ZSwgdGltZSwgRGF0ZS5ub3coKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5hcHBlbmQoeyBrOiBrZXksIHQ6IHRpbWUsIHY6IHZhbHVlIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogRGVsZXRlcyBhcyBvZiBgdGltZWAsIGtlZXBpbmcgdGhlIHRvbWJzdG9uZS4gQSBrZXkgdGhhdCBoYWQgYSBsaXZlIHZhbHVlIGtlZXBzIGl0IGluIHRoZSB0b21ic3RvbmUgYXMgTUFSS0VEIGZvciBkZWxldGlvbiAocmVhZGFibGUgYW5kIHJlc3RvcmFibGUgdW50aWwgZHJvcFZhbHVlKS4gUmV0dXJucyBmYWxzZSB3aGVuIHNvbWV0aGluZyBhdCBsZWFzdCBhcyBuZXcgaXMgYWxyZWFkeSBoZXJlLiAqL1xuICAgIHB1YmxpYyBkZWxldGUoa2V5OiBzdHJpbmcsIHRpbWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICB0aW1lID0gTWF0aC5mbG9vcih0aW1lKTtcbiAgICAgICAgbGV0IGxpdmUgPSB0aGlzLnZhbHVlcy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCF0aGlzLmFwcGx5RGVsZXRlKGtleSwgdGltZSwgRGF0ZS5ub3coKSwgbGl2ZT8udmFsdWUsIGxpdmU/LnRpbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChsaXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh7IGs6IGtleSwgdDogdGltZSwgbTogMSwgdjogbGl2ZS52YWx1ZSwgdzogbGl2ZS50aW1lIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoeyBrOiBrZXksIHQ6IHRpbWUsIGQ6IDEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqIFVuZG9lcyBhIG1hcmtlZCBkZWxldGlvbjogdGhlIGtlcHQgdmFsdWUgYmVjb21lcyBsaXZlIGFnYWluLCBhcyBvZiBgdGltZWAgKGEgZnJlc2ggdGltZSwgc28gdGhlIHJlc3RvcmUgb3V0cmFua3MgdGhlIGRlbGV0aW9uIGV2ZXJ5d2hlcmUgaXQgcHJvcGFnYXRlZCkuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVyZSBpcyBubyBtYXJrZWQgdmFsdWUgdG8gcmVzdG9yZSwgb3Igc29tZXRoaW5nIGF0IGxlYXN0IGFzIG5ldyBpcyBhbHJlYWR5IGhlcmUuICovXG4gICAgcHVibGljIHVubWFyayhrZXk6IHN0cmluZywgdGltZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHRpbWUgPSBNYXRoLmZsb29yKHRpbWUpO1xuICAgICAgICBsZXQgdG9tYnN0b25lID0gdGhpcy5kZWxldGVkLmdldChrZXkpO1xuICAgICAgICBpZiAoIXRvbWJzdG9uZSB8fCB0b21ic3RvbmUudmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMuYXBwbHlTZXQoa2V5LCB0b21ic3RvbmUudmFsdWUsIHRpbWUsIERhdGUubm93KCkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuYXBwZW5kKHsgazoga2V5LCB0OiB0aW1lLCB2OiB0b21ic3RvbmUudmFsdWUgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKiBEcm9wcyBhIG1hcmtlZCBkZWxldGlvbidzIGtlcHQgdmFsdWUgKGl0cyBoaXN0b3J5IGhhcyBiZWVuIHBoeXNpY2FsbHkgcmVtb3ZlZCksIGxlYXZpbmcgYSBwbGFpbiB0b21ic3RvbmUgd2l0aCB0aGUgc2FtZSBkZWxldGUgdGltZS4gKi9cbiAgICBwdWJsaWMgZHJvcFZhbHVlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGxldCB0b21ic3RvbmUgPSB0aGlzLmRlbGV0ZWQuZ2V0KGtleSk7XG4gICAgICAgIGlmICghdG9tYnN0b25lIHx8IHRvbWJzdG9uZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuZGVsZXRlZC5zZXQoa2V5LCB7IHRpbWU6IHRvbWJzdG9uZS50aW1lLCBjaGFuZ2VkQXQ6IERhdGUubm93KCkgfSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKHsgazoga2V5LCB0OiB0b21ic3RvbmUudGltZSwgZDogMSB9KTtcbiAgICB9XG5cbiAgICAvKiogRm9yZ2V0cyB0aGUga2V5IGVudGlyZWx5LCB0b21ic3RvbmUgaW5jbHVkZWQgLSBmb3IgYSB0b21ic3RvbmUgb2xkIGVub3VnaCB0aGF0IG5vYm9keSBuZWVkcyB0byBoZWFyIGFib3V0IHRoZSBkZWxldGlvbiBhbnkgbW9yZSwgYW5kIGZvciBhbiBlbnRyeSB0aGF0IHR1cm5lZCBvdXQgbmV2ZXIgdG8gaGF2ZSBleGlzdGVkLiBOb3QgYSBkZWxldGlvbjogaXQgbGVhdmVzIG5vdGhpbmcgYmVoaW5kIHRvIHByb3BhZ2F0ZS4gKi9cbiAgICBwdWJsaWMgcHVyZ2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgbGV0IGhhZCA9IHRoaXMudmFsdWVzLmRlbGV0ZShrZXkpO1xuICAgICAgICBoYWQgPSB0aGlzLmRlbGV0ZWQuZGVsZXRlKGtleSkgfHwgaGFkO1xuICAgICAgICBpZiAoIWhhZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmFwcGVuZCh7IGs6IGtleSwgdDogTWF0aC5mbG9vcihEYXRlLm5vdygpKSwgcDogMSB9KTtcbiAgICB9XG5cbiAgICAvLyBUaW1lcyBhcmUgZmxvb3JlZCB0byB3aG9sZSBtaWxsaXNlY29uZHMgb24gZXZlcnkgcGF0aCBpbnRvIHRoZSBtYXBzIChsb2FkIHJlcGxheXMgdGhyb3VnaCBoZXJlIHRvbywgc28gZnJhY3Rpb25hbCB0aW1lcyBwZXJzaXN0ZWQgYnkgb2xkZXIgY29kZSBoZWFsIG9uIHN0YXJ0dXApLiBEaXNrIG10aW1lcyBjYXJyeSBmcmFjdGlvbmFsIG1pbGxpc2Vjb25kcyBidXQgdXRpbWVzIHJvdW5kLXRyaXBzIG9ubHkgd2hvbGUgb25lcywgc28gYSBmcmFjdGlvbmFsIHRpbWUgY2FuIG5ldmVyIGJlIHJlcHJvZHVjZWQgYnkgcHJvcGFnYXRpb24gLSBldmVyeSBjb3B5IG9mIHRoZSB2YWx1ZSB3b3VsZCBjb21wYXJlIFwib2xkZXJcIiB0aGFuIHRoZSBvcmlnaW5hbCBmb3JldmVyLCBhbmQgdGhlIHNhbWUgd3JpdGUgd291bGQgYmUgcmUtcHVzaGVkIGFuZCByZS1jb3BpZWQgZXZlcnkgcm91bmQuXG4gICAgcHJpdmF0ZSBhcHBseVNldChrZXk6IHN0cmluZywgdmFsdWU6IFQsIHRpbWU6IG51bWJlciwgY2hhbmdlZEF0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgdGltZSA9IE1hdGguZmxvb3IodGltZSk7XG4gICAgICAgIGNoYW5nZWRBdCA9IE1hdGguZmxvb3IoY2hhbmdlZEF0KTtcbiAgICAgICAgaWYgKHRpbWUgPCB0aGlzLnRpbWVPZihrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVsZXRlZC5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhpcy52YWx1ZXMuc2V0KGtleSwgeyB2YWx1ZSwgdGltZSwgY2hhbmdlZEF0IH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5RGVsZXRlKGtleTogc3RyaW5nLCB0aW1lOiBudW1iZXIsIGNoYW5nZWRBdDogbnVtYmVyLCB2YWx1ZT86IFQsIHZhbHVlVGltZT86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICB0aW1lID0gTWF0aC5mbG9vcih0aW1lKTtcbiAgICAgICAgY2hhbmdlZEF0ID0gTWF0aC5mbG9vcihjaGFuZ2VkQXQpO1xuICAgICAgICBpZiAodmFsdWVUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlVGltZSA9IE1hdGguZmxvb3IodmFsdWVUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZSA8IHRoaXMudGltZU9mKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy52YWx1ZXMuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMuZGVsZXRlZC5zZXQoa2V5LCB7IHRpbWUsIGNoYW5nZWRBdCwgdmFsdWUsIHZhbHVlVGltZSB9KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBlbmQocmVjb3JkOiBMb2dSZWNvcmQ8VD4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nLnB1c2goSlNPTi5zdHJpbmdpZnkocmVjb3JkKSk7XG4gICAgICAgIHRoaXMubG9nUmVjb3JkcysrO1xuICAgICAgICB0aGlzLnNjaGVkdWxlRmx1c2goKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjaGVkdWxlRmx1c2goKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZsdXNoVGltZXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5mbHVzaCgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRmx1c2hpbmcgJHt0aGlzLmZpbGVQYXRofSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfSwgRkxVU0hfREVMQVkpO1xuICAgICAgICAodGhpcy5mbHVzaFRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGV2ZXJ5dGhpbmcgcGVuZGluZyAocmV3cml0aW5nIHRoZSBsb2cgZmlyc3QgaWYgaXQgaGFzIGdyb3duIHRvbyBmYXIgcGFzdCB3aGF0IGl0IGRlc2NyaWJlcykuICovXG4gICAgcHVibGljIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy53cml0ZUNoYWluLnRoZW4oKCkgPT4gdGhpcy53cml0ZSgpKTtcbiAgICAgICAgLy8gVGhlIGNoYWluIG9ubHkgZXhpc3RzIHRvIHNlcmlhbGl6ZSB3cml0ZXMsIHNvIGl0IG11c3Qgbm90IHN0YXkgcmVqZWN0ZWQ6IGEgZmFpbHVyZSBiZWxvbmdzIHRvIHRoZSBjYWxsZXIgdGhhdCBhc2tlZCBmb3IgdGhpcyBmbHVzaCwgbm90IHRvIGV2ZXJ5IGZsdXNoIGFmdGVyIGl0XG4gICAgICAgIHRoaXMud3JpdGVDaGFpbiA9IHJlc3VsdC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgICAgICBhd2FpdCByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXJlY3RvcnkgPSBsYXp5KGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKHRoaXMuZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmxvZ1JlY29yZHMgPiBNYXRoLm1heChNSU5fQ09NUEFDVF9SRUNPUkRTLCAodGhpcy52YWx1ZXMuc2l6ZSArIHRoaXMuZGVsZXRlZC5zaXplKSAqIENPTVBBQ1RfUkFUSU8pKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbXBhY3QoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZFBlbmRpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFwcGVuZFBlbmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5wZW5kaW5nLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVjb3JkcyA9IHRoaXMucGVuZGluZztcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gW107XG4gICAgICAgIGF3YWl0IHRoaXMuZGlyZWN0b3J5KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5hcHBlbmRGaWxlKHRoaXMuZmlsZVBhdGgsIHJlY29yZHMuam9pbihcIlxcblwiKSArIFwiXFxuXCIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBQdXQgdGhlbSBiYWNrIHJhdGhlciB0aGFuIGxvc2UgdGhlbTogdGhlIHZhbHVlcyBhcmUgc3RpbGwgaW4gbWVtb3J5LCBzbyBhbGwgdGhhdCBpcyBhdCByaXNrIGlzIGhhdmluZyB0byByZWJ1aWxkIHRoZW0gYnkgc2Nhbm5pbmdcbiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IHJlY29yZHMuY29uY2F0KHRoaXMucGVuZGluZyk7XG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlRmx1c2goKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXdyaXRlcyB0aGUgbG9nIGFzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIGJvdGggbWFwcy4gVGhleSBhcmUgdGhlIHRydXRoIC0gdGhlIGxvZyBvbmx5IGV4aXN0cyB0byByZWJ1aWxkIHRoZW0gLSBzbyB0aGUgc25hcHNob3QgSVMgdGhlIG5ldyBsb2cuXG4gICAgcHJpdmF0ZSBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcmVjb3Jkczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgW2tleSwgZW50cnldIG9mIHRoaXMudmFsdWVzKSB7XG4gICAgICAgICAgICByZWNvcmRzLnB1c2goSlNPTi5zdHJpbmdpZnkoeyBrOiBrZXksIHQ6IGVudHJ5LnRpbWUsIHY6IGVudHJ5LnZhbHVlIH0gc2F0aXNmaWVzIExvZ1JlY29yZDxUPikpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IFtrZXksIHRvbWJzdG9uZV0gb2YgdGhpcy5kZWxldGVkKSB7XG4gICAgICAgICAgICBpZiAodG9tYnN0b25lLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZWNvcmRzLnB1c2goSlNPTi5zdHJpbmdpZnkoeyBrOiBrZXksIHQ6IHRvbWJzdG9uZS50aW1lLCBtOiAxLCB2OiB0b21ic3RvbmUudmFsdWUsIHc6IHRvbWJzdG9uZS52YWx1ZVRpbWUgfSBzYXRpc2ZpZXMgTG9nUmVjb3JkPFQ+KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlY29yZHMucHVzaChKU09OLnN0cmluZ2lmeSh7IGs6IGtleSwgdDogdG9tYnN0b25lLnRpbWUsIGQ6IDEgfSBzYXRpc2ZpZXMgTG9nUmVjb3JkPFQ+KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2xlYXJlZCB3aXRoIHRoZSBzbmFwc2hvdDogZXZlcnkgcGVuZGluZyByZWNvcmQgaXMgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIG1hcHMsIHNvIHRoZSBzbmFwc2hvdCBjb250YWlucyBpdC4gQW55dGhpbmcgYXBwZW5kZWQgZnJvbSBoZXJlIG9uIGlzIE5PVCBpbiB0aGUgc25hcHNob3QsIGFuZCBsYW5kcyBpbiB0aGUgbmV3IGxvZyBhZnRlciB0aGUgcmVuYW1lLlxuICAgICAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICAgICAgbGV0IHN0YXJ0ZWRXaXRoID0gdGhpcy5sb2dSZWNvcmRzO1xuICAgICAgICBsZXQgdGVtcFBhdGggPSBgJHt0aGlzLmZpbGVQYXRofS5jb21wYWN0aW5nYDtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXJlY3RvcnkoKTtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHRlbXBQYXRoLCByZWNvcmRzLmxlbmd0aCAmJiBgJHtyZWNvcmRzLmpvaW4oXCJcXG5cIil9XFxuYCB8fCBcIlwiKTtcbiAgICAgICAgLy8gUmVwbGFjZXMgdGhlIG9sZCBsb2cgaW4gb25lIHN0ZXAsIHNvIGEgY3Jhc2ggbGVhdmVzIGVpdGhlciB0aGUgd2hvbGUgb2xkIGxvZyBvciB0aGUgd2hvbGUgbmV3IG9uZVxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUodGVtcFBhdGgsIHRoaXMuZmlsZVBhdGgpO1xuICAgICAgICB0aGlzLmxvZ1JlY29yZHMgPSByZWNvcmRzLmxlbmd0aCArIHRoaXMucGVuZGluZy5sZW5ndGg7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZXdyb3RlICR7dGhpcy5maWxlUGF0aH06ICR7c3RhcnRlZFdpdGh9IGxvZyByZWNvcmRzIGZvciAke3RoaXMudmFsdWVzLnNpemV9IHZhbHVlcyBhbmQgJHt0aGlzLmRlbGV0ZWQuc2l6ZX0gdG9tYnN0b25lc2ApO1xuICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZFBlbmRpbmcoKTtcbiAgICB9XG59XG4iXX0=
|
|
255
|
+
/* _JS_SOURCE_HASH = "d824e43ae5e10d911177de31b9bb2e17c6e004ec48884b0d208f143f8b5c643e"; */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.TransactionStorage = void 0;
|
|
4
4
|
const misc_1 = require("socket-function/src/misc");
|
|
@@ -544,4 +544,4 @@ class TransactionStorage {
|
|
|
544
544
|
exports.TransactionStorage = TransactionStorage;
|
|
545
545
|
TransactionStorage.allStorage = [];
|
|
546
546
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25TdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiVHJhbnNhY3Rpb25TdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUEwRztBQUUxRyxxQ0FBa0M7QUFDbEMsMkRBQWtFO0FBQ2xFLGtFQUFpRjtBQUNqRixxREFBOEM7QUFDOUMscURBQWdEO0FBRWhELDJEQUErRDtBQUUvRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1QkU7QUFFRixNQUFNLG1CQUFtQixHQUFHLG1CQUFZLEdBQUcsQ0FBQyxDQUFDO0FBRTdDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxtQkFBWSxHQUFHLEVBQUUsQ0FBQztBQUU1QyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRTVDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2RSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEUsNkRBQTZEO0FBQzdELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQztBQWN4QixNQUFNLGVBQWUsR0FBRyxJQUFBLHNCQUFXLEVBQUMsS0FBSyxFQUFFLEdBQXdCLEVBQUUsRUFBRTtJQUNuRSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDO0FBQzNCLE1BQU0sS0FBSyxH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QUFDLFdBQU0sQ0FBQyxDQUFDLENBQUM7WUFFWCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztBQS9oQkwsZ0RBZ2lCQztBQXJoQmtCLDZCQUFVLEdBQXlCLEVBQUUsQUFBM0IsQ0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9taXNlT2JqLCBjb21wYXJlQXJyYXksIHNvcnQsIHRocm90dGxlRnVuY3Rpb24sIHRpbWVJbk1pbnV0ZSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IElTdG9yYWdlLCBJU3RvcmFnZVJhdyB9IGZyb20gXCIuL0lTdG9yYWdlXCI7XG5pbXBvcnQgeyBaaXAgfSBmcm9tIFwiLi4vbWlzYy96aXBcIjtcbmltcG9ydCB7IGRlbGF5LCBydW5JblNlcmlhbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIsIGZvcm1hdFRpbWUgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgc2V0UGVuZGluZyB9IGZyb20gXCIuL1BlbmRpbmdNYW5hZ2VyXCI7XG5pbXBvcnQgeyBpc0luQnVpbGQgfSBmcm9tIFwiLi4vbWlzYy9lbnZpcm9ubWVudFwiO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcInR5cGVzYWZlY3NzXCI7XG5pbXBvcnQgeyBydW5JbmZpbml0ZVBvbGwgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuXG4vKlxuLy8gU3BlYzpcbi8vICAgICAgLSBaaXAgaW5kaXZpZHVhbCBsYXJnZSB2YWx1ZXNcbi8vICAgICAgLSBTdG9yZXMgYSB0cmFuc2FjdGlvbiBsb2dcbi8vICAgICAgICAgIC0gVHJhbnNhY3Rpb24gbG9nIGhhcyBhIGhlYWRlciwgd2hpY2ggaXMgSlNPTiwgZm9yIHRoaW5ncyBzdWNoIGFzIFwiemlwcGVkXCJcbi8vICAgICAgICAgIC0gVHJhbnNhY3Rpb24gbG9nIHVzZXMgbGVuZ3RoIHByZWZpeGVkIHZhbHVlcywgd2l0aCBhIHNwZWNpYWwgOCBieXRlcyB0byBkZW5vdGUgdGhlIGVuZCwgYW5kIDggZm9yIHRoZSBzdGFydC5cbi8vICAgICAgICAgIC0gV2hlbiB0cmFuc2FjdGlvbiBsb2cgaXMgaXRlcmF0ZWQgb24sIGlmIHRoZSBieXRlcyBhdCB0aGUgZW5kICh1c2luZyB0aGUgbGVuZ3RoIHByZWZpeCkgZG9uJ3QgbWF0Y2ggdGhlIGVuZCBieXRlcyBPUiB0aGUgc3RhcnQgYnl0ZXMgYXJlIHdyb25nLCB3ZSBza2lwIHRoZSBzdGFydCBieXRlcywgYW5kIGl0ZXJhdGluZyB1bnRpbCB3ZSBmaW5kIG5ldyBzdGFydCBieXRlcyB0aGF0IG1hdGNoIG91ciBzcGVjaWFsIGJ5dGVzLiBUaGVuIHdlIHRyeSB0byByZWFkIHRoZXNlIHZhbHVlcy5cbi8vICAgICAgICAgIC0gRWFjaCB0cmFuc2FjdGlvbiBlbnRyeSBoYXMgYSBieXRlIGZvciBmbGFncywgb25lIGJpdCB3aGljaCBkZW5vdGVzIGlmIHRoZSB2YWx1ZSBpcyB6aXBwZWQgb3Igbm90LlxuLy8gICAgICAtIENvbXByZXNzZXMgdGhlIGxvZyBhZnRlciB0aGVyZSBhcmUgM1ggZW50cmllcyB0aGFuIGtleXMgKGFuZCA+IDEwMClcbi8vICAgICAgICAgIC0gQm90aCBkZWR1cGUga2V5cywgYW5kIHppcFxuLy8gICAgICAtIEFzc3VtZXMgYWxsIGZpbGVzIGluIHJhd1N0b3JhZ2UgZW5kaW5nIHdpdGggLnR4IGFyZSB0cmFuc2FjdGlvbiBsb2dzXG4vLyAgICAgIC0gTmFtZXMgZmlsZXMgbGlrZSBgJHtnZW5lcmF0aW9ufS50eGBcbi8vICAgICAgICAgIC0gV2hlbiBjb21wcmVzc2luZywgd2UgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uLCBhbmQgd3JpdGUgdG8gYSBuZXcgZmlsZSwgYW5kIGRlbGV0ZSBhbnkgZ2VuZXJhdGlvbnMgdGhhdCBhcmUgb2xkZXIgdGhhbiB0aGUgbmV3IG9uZVxuLy8gICAgICAgICAgLSBPbiByZWFkaW5nLCB3ZSByZWFkIGZyb20gYWxsIGdlbmVyYXRpb24gZmlsZXMgdGhhdCBleGlzdCwgaW4gY2FzZSBzb21lIGFyZSBjb3JydXB0ZWRcbi8vICAgICAgLSBPbiBsb2FkLCBsb2FkcyBpbiBhbGwgdHJhbnNhY3Rpb24gbG9ncywgYW5kIHN0b3JlcyBhbGwgdmFsdWVzIGluIGEgTWFwPHN0cmluZywgQnVmZmVyPlxuLy8gICAgICAtIE9uIHdyaXRlcyBpbW1lZGlhdGVseSB1cGRhdGVzIHRoZSBpbiBtZW1vcnkgTWFwLCBhbmQgdGhlbiB3cml0ZXMgdG8gdGhlIHRyYW5zYWN0aW9uIGxvZ1xuLy8gICAgICAtIENhY2hlcyB0aGUgbGFzdCB0cmFuc2FjdGlvbiBmaWxlIG5hbWUgaW4gbWVtb3J5XG4vLyAgICAgIC0gTWFrZXMgc3VyZSBhbGwgZmlsZSBzeXN0ZW0gd3JpdGVzIChidXQgbm90IE1hcCB1cGRhdGVzKSBhcmUgZG9uZSB3aXRoIGZpbGVMb2NrU2VjdGlvbiwgc28gdGhleSBuZXZlciBvdmVybGFwLlxuLy8gICAgICAtIEJ1ZmZlcnMgcGVuZGluZyBhcHBlbmRzIGluIG1lbW9yeSwgc28gdGhleSBjYW4gd3JpdHRlbiBhbGwgYXQgb25jZSAoYWZ0ZXIgdGhlIGZpcnN0IG9uZSBpcyBibG9ja2luZyBpbiBmaWxlTG9ja1NlY3Rpb24pLlxuXG5VUERBVEUgbm93IHdlIHVzZSBjaHVua3MsIGJlY2F1c2UgYXBwZW5kIGlzIHRvbyBzbG93LlxuXG5JTVBPUlRBTlQhIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB3cml0ZXJzLCB3ZSBjbG9iYmVyIHdyaXRlcyBmcm9tIG90aGVyIHdyaXRlcnMgd2hlbiB3ZSBjb21wcmVzc1xuKi9cblxuY29uc3QgRElTS19DSEVDS19JTlRFUlZBTCA9IHRpbWVJbk1pbnV0ZSAqIDU7XG5cbmNvbnN0IEZJTEVfQ0hVTktfU0laRSA9IDEwMjQgKiAxMDI0O1xuY29uc3QgRklMRV9NQVhfTElGRVRJTUUgPSB0aW1lSW5NaW51dGUgKiAzMDtcblxuY29uc3QgRklMRV9aSVBfVEhSRVNIT0xEID0gMTYgKiAxMDI0ICogMTAyNDtcblxuY29uc3QgU1RBUlRfQllURVMgPSBCdWZmZXIuZnJvbShbMjM2LCA0OSwgMTEyLCAxMjEsIDI3LCAxMjcsIDIyNywgNjNdKTtcbmNvbnN0IEVORF9CWVRFUyA9IEJ1ZmZlci5mcm9tKFsyMjAsIDExMSwgMjQzLCAyMDIsIDIwMCwgNzksIDIxMywgNjNdKTtcbi8vIERlbGF5IHdyaXRlcywgc28gd2UgYmF0Y2ggYmV0dGVyLCBhbmQgdGhyYXNoIHRoZSBkaXNrIGxlc3NcbmNvbnN0IFdSSVRFX0RFTEFZID0gNTAwO1xuXG5pbnRlcmZhY2UgVHJhbnNhY3Rpb25FbnRyeSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IEJ1ZmZlciB8IHVuZGVmaW5lZDtcbiAgICAvLyBOT1RFOiBXZSBkaXNhYmxlZCBwZXItZW50cnkgemlwcGluZy4gRWl0aGVyIHVzZSBhIHJhdyBjb2xsZWN0aW9uIHNvIHlvdSBkb24ndCBoYXZlIHRvIGxvYWQgYWxsIG9mIHRoZW0gaW50byBtZW1vcnkgb3Igc2hhcmQgeW91ciBjb2xsZWN0aW9uLiBaaXBwaW5nIGlzIG9ubHkgYSBiYW5kLWFpZCBzb2x1dGlvbiBmb3IgbWVtb3J5IGlzc3Vlcy4gQUxTTywgaXQgbWFrZXMgbG9hZGluZyBzbG93ZXIsIHdoaWNoIG1ha2VzIGFsbCBvdGhlciBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBuZWVkIHppcHBpbmcgd29yc2UuXG4gICAgaXNaaXBwZWQ6IGJvb2xlYW47XG4gICAgdGltZTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVHJhbnNhY3Rpb25IZWFkZXIge1xuICAgIHppcHBlZDogYm9vbGVhbjtcbn1cblxuY29uc3QgZmlsZUxvY2tTZWN0aW9uID0gcnVuSW5TZXJpYWwoYXN5bmMgKGZuYzogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4ge1xuICAgIGF3YWl0IGZuYygpO1xufSk7XG5cbmNvbnN0IENIVU5LX0VYVCA9IFwiLmNodW5rXCI7XG5jb25zdCBvdXJJZCA9IERhdGUubm93KCkgKyBNYXRoLnJhbmRvbSgpO1xubGV0IHNlcU51bSA9IDA7XG5cbmZ1bmN0aW9uIGdldE5leHRDaHVua1BhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7RGF0ZS5ub3coKX1fJHtzZXFOdW0rK31fJHtvdXJJZH0uY2h1bmtgO1xufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25TdG9yYWdlIGltcGxlbWVudHMgSVN0b3JhZ2U8QnVmZmVyPiB7XG4gICAgcHVibGljIGNhY2hlOiBNYXA8c3RyaW5nLCBUcmFuc2FjdGlvbkVudHJ5PiA9IG5ldyBNYXAoKTtcbiAgICAvLyBNYXBzIGZpbGUgbmFtZSB0byBvdXIgbGFzdCBrbm93biB3cml0ZSB0aW1lc3RhbXBcbiAgICBwcml2YXRlIGRpc2tGaWxlczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIGN1cnJlbnRDaHVuazoge1xuICAgICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgICAgdGltZUNyZWF0ZWQ6IG51bWJlcjtcbiAgICB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgZW50cnlDb3VudCA9IDA7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhbGxTdG9yYWdlOiBUcmFuc2FjdGlvblN0b3JhZ2VbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmF3U3RvcmFnZTogSVN0b3JhZ2VSYXcsXG4gICAgICAgIHByaXZhdGUgZGVidWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgd3JpdGVEZWxheSA9IFdSSVRFX0RFTEFZLFxuICAgICAgICAvLyBXaGVuIHNldCwgd2UgcG9sbCB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGFuZCByZWxvYWQgaWYgYW5vdGhlciBwcm9jZXNzL3RhYiB3cml0ZXMgbmV3IGNodW5rIGZpbGVzLiBPZmYgYnkgZGVmYXVsdCwgYXMgaXQgY29zdHMgYSBwZXJpb2RpYyBkaXNrIHNjYW4gYW5kIG1vc3QgY29sbGVjdGlvbnMgYXJlIG9ubHkgd3JpdHRlbiBieSBhIHNpbmdsZSBwcm9jZXNzLlxuICAgICAgICBwcml2YXRlIHJlc3luY0Zyb21EaXNrID0gZmFsc2VcbiAgICApIHtcbiAgICAgICAgVHJhbnNhY3Rpb25TdG9yYWdlLmFsbFN0b3JhZ2UucHVzaCh0aGlzKTtcbiAgICAgICAgLy8gVkVSWSB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KVtgdHgke3RoaXMuZGVidWdOYW1lfWBdID0gdGhpcztcbiAgICB9XG4gICAgLy8gSGVscHMgZ2V0IHJpZCBvZiBwYXJzZSBlcnJvcnMgd2hpY2ggY29uc3RhbnRseSBsb2cuIEFsc28sIHVzZXMgbGVzcyBzcGFjZVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY29tcHJlc3NBbGwoKSB7XG4gICAgICAgIGF3YWl0IGZpbGVMb2NrU2VjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBzdG9yYWdlIG9mIFRyYW5zYWN0aW9uU3RvcmFnZS5hbGxTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5jb21wcmVzc1RyYW5zYWN0aW9uTG9nKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3luY0NhbGxiYWNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcbiAgICBwdWJsaWMgd2F0Y2hSZXN5bmMoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZXN5bmNDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0OiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5sb2FkQWxsVHJhbnNhY3Rpb25zKHRydWUpO1xuXG4gICAgcHJpdmF0ZSBnZXRDdXJyZW50Q2h1bmsoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudENodW5rICYmIHRoaXMuY3VycmVudENodW5rLnRpbWVDcmVhdGVkIDwgRGF0ZS5ub3coKSAtIEZJTEVfTUFYX0xJRkVUSU1FKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDaHVuayA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudENodW5rKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDaHVuayA9IHtcbiAgICAgICAgICAgICAgICBwYXRoOiBnZXROZXh0Q2h1bmtQYXRoKCksXG4gICAgICAgICAgICAgICAgc2l6ZTogMCxcbiAgICAgICAgICAgICAgICB0aW1lQ3JlYXRlZDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFRpbWVzdGFtcCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgYWN0dWFsIHdyaXRlXG4gICAgICAgICAgICB0aGlzLmRpc2tGaWxlcy5zZXQodGhpcy5jdXJyZW50Q2h1bmsucGF0aCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENodW5rLnBhdGg7XG4gICAgfVxuICAgIHByaXZhdGUgdXBkYXRlRGlza0ZpbGVUaW1lc3RhbXAoZmlsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlza0ZpbGVzLnNldChmaWxlLCBEYXRlLm5vdygpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBvbkFkZFRvQ2h1bmsoc2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50Q2h1bmspIHJldHVybjtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmsuc2l6ZSArPSBzaXplO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q2h1bmsuc2l6ZSA+PSBGSUxFX0NIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENodW5rID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUuaXNaaXBwZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb25zIHNob3VsZCBiZSB1bnppcHBlZCBvbiBmaWxlIHJlYWR5LCBzbyB0aGlzIHN0YXRlIHNob3VsZCBiZSBpbXBvc3NpYmxlLiBLZXk6ICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZT8udmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbml0KSBhd2FpdCB0aGlzLmluaXQ7XG5cbiAgICAgICAgLy8gVGltZSBpcyBzZXQgb24gZGlzayB3cml0ZSwgYXMgRGF0ZS5ub3coKSBpcyB0b28gc2xvd1xuICAgICAgICBsZXQgZW50cnk6IFRyYW5zYWN0aW9uRW50cnkgPSB7IGtleSwgdmFsdWUsIGlzWmlwcGVkOiBmYWxzZSwgdGltZTogMCB9O1xuICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIGVudHJ5KTtcblxuICAgICAgICBhd2FpdCB0aGlzLnB1c2hBcHBlbmQoZW50cnkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdCkgYXdhaXQgdGhpcy5pbml0O1xuICAgICAgICB0aGlzLmNhY2hlLmRlbGV0ZShrZXkpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucHVzaEFwcGVuZCh7IGtleSwgdmFsdWU6IHVuZGVmaW5lZCwgaXNaaXBwZWQ6IGZhbHNlLCB0aW1lOiAwIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKTogUHJvbWlzZTx7IHNpemU6IG51bWJlcjsgbGFzdE1vZGlmaWVkOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCF2YWx1ZT8udmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7IHNpemU6IHZhbHVlLnZhbHVlLmxlbmd0aCwgbGFzdE1vZGlmaWVkOiB2YWx1ZS50aW1lIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwZW5kaW5nQXBwZW5kczogVHJhbnNhY3Rpb25FbnRyeVtdID0gW107XG4gICAgcHJpdmF0ZSBleHRyYUFwcGVuZHMgPSAwO1xuICAgIHByaXZhdGUgcGVuZGluZ1dyaXRlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICAgIGFzeW5jIHB1c2hBcHBlbmQoZW50cnk6IFRyYW5zYWN0aW9uRW50cnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnRyeUNvdW50Kys7XG4gICAgICAgIHRoaXMucGVuZGluZ0FwcGVuZHMucHVzaChlbnRyeSk7XG4gICAgICAgIHZvaWQgdGhpcy51cGRhdGVQZW5kaW5nQXBwZW5kcygpO1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nV3JpdGUpIHJldHVybiB0aGlzLnBlbmRpbmdXcml0ZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nV3JpdGUgPSBmaWxlTG9ja1NlY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRGVsYXkgdG8gYWxsb3cgYmF0Y2hpbmcsIGFuZCBkZWR1cGluZ1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRoaXMud3JpdGVEZWxheSkpO1xuICAgICAgICAgICAgbGV0IGN1ckFwcGVuZHMgPSB0aGlzLnBlbmRpbmdBcHBlbmRzO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQXBwZW5kcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nV3JpdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IGFwcGVuZHNEZWR1cGVkOiBNYXA8c3RyaW5nLCBUcmFuc2FjdGlvbkVudHJ5PiA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGN1ckFwcGVuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kc0RlZHVwZWQuc2V0KGVudHJ5LmtleSwgZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJBcHBlbmRzID0gQXJyYXkuZnJvbShhcHBlbmRzRGVkdXBlZC52YWx1ZXMoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmV4dHJhQXBwZW5kcyArPSBjdXJBcHBlbmRzLmxlbmd0aDtcbiAgICAgICAgICAgIHZvaWQgdGhpcy51cGRhdGVQZW5kaW5nQXBwZW5kcygpO1xuICAgICAgICAgICAgaWYgKGN1ckFwcGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGN1ckFwcGVuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgZW50cnkudGltZSA9IHRpbWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG5ld1N1bSA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBjdXJBcHBlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBidWZmZXIgPSB0aGlzLnNlcmlhbGl6ZVRyYW5zYWN0aW9uRW50cnkoZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3U3VtICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG5ld0NodW5rcyA9IHRoaXMuY2h1bmtCdWZmZXJzKGJ1ZmZlcnMpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGNodW5rIG9mIG5ld0NodW5rcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IHRoaXMuZ2V0Q3VycmVudENodW5rKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5yYXdTdG9yYWdlLmdldChmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHsgaGVhZGVyLCBoZWFkZXJCdWZmZXIgfSA9IHRoaXMuZ2V0SGVhZGVyKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmF3U3RvcmFnZS5zZXQoZmlsZSwgaGVhZGVyQnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGNodW5rLmJ1ZmZlcjtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yYXdTdG9yYWdlLmFwcGVuZChmaWxlLCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNrRmlsZVRpbWVzdGFtcChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkFkZFRvQ2h1bmsoY29udGVudC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcHJlc3NUcmFuc2FjdGlvbkxvZygpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4dHJhQXBwZW5kcyAtPSBjdXJBcHBlbmRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMudXBkYXRlUGVuZGluZ0FwcGVuZHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucGVuZGluZ1dyaXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUGVuZGluZ0FwcGVuZHMgPSB0aHJvdHRsZUZ1bmN0aW9uKDEwMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgYXBwZW5kQ291bnQgPSB0aGlzLnBlbmRpbmdBcHBlbmRzLmxlbmd0aCArIHRoaXMuZXh0cmFBcHBlbmRzO1xuICAgICAgICBsZXQgZ3JvdXAgPSBgVHJhbnNhY3Rpb24gKCR7dGhpcy5kZWJ1Z05hbWV9KWA7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBVcGRhdGUgcGVuZGluZyBhcHBlbmRzICR7Z3JvdXB9OiAke2FwcGVuZENvdW50fWApO1xuICAgICAgICBpZiAoIWFwcGVuZENvdW50KSB7XG4gICAgICAgICAgICBzZXRQZW5kaW5nKGdyb3VwLCBcIlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXRQZW5kaW5nKGdyb3VwLCBgUGVuZGluZyBhcHBlbmRzOiAke2FwcGVuZENvdW50fWApO1xuICAgIH0pO1xuXG4gICAgcHVibGljIGFzeW5jIGdldEtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0KSBhd2FpdCB0aGlzLmluaXQ7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2FjaGUua2V5cygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2hlY2tEaXNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbml0KSBhd2FpdCB0aGlzLmluaXQ7XG4gICAgICAgIGNvbnN0IGFueUNoYW5nZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQga2V5cyA9IGF3YWl0IHRoaXMucmF3U3RvcmFnZS5nZXRLZXlzKCk7XG4gICAgICAgICAgICBsZXQgZGlza0ZpbGVzID0ga2V5cy5maWx0ZXIoa2V5ID0+IGtleS5lbmRzV2l0aChDSFVOS19FWFQpKTtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGFueSBrbm93biBmaWxlcyBoYXZlIGJlZW4gbW9kaWZpZWQgZXh0ZXJuYWxseSAoZGlzayB0aW1lc3RhbXAgbmV3ZXIgdGhhbiBvdXJzKVxuICAgICAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBkaXNrRmlsZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3VyVGltZXN0YW1wID0gdGhpcy5kaXNrRmlsZXMuZ2V0KGZpbGUpO1xuICAgICAgICAgICAgICAgIGlmIChvdXJUaW1lc3RhbXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLnJhd1N0b3JhZ2UuZ2V0SW5mbyhmaWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLmxhc3RNb2RpZmllZCA+IG91clRpbWVzdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghYXdhaXQgYW55Q2hhbmdlcygpKSByZXR1cm47XG5cbiAgICAgICAgYXdhaXQgZmlsZUxvY2tTZWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICghYXdhaXQgYW55Q2hhbmdlcygpKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgbmV3IGNoYW5nZXMgaW4gY29sbGVjdGlvbiBmcm9tIG90aGVyIHRhYi4gTG9hZGluZyB0aGVtIG5vdy4gJHt0aGlzLmRlYnVnTmFtZX1gKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEFsbFRyYW5zYWN0aW9ucygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8vIE5PVEU6IFRoaXMgaXMgZWl0aGVyIGNhbGxlZCBpbiBpbml0ICh3aGljaCBibG9ja3MgYWxsIG90aGVyIGNhbGxzKSwgb3IgaW5zaWRlIG9mIHRoZSBnbG9iYWwgZmlsZSBsb2NrLCBzbyBpdCBpcyBzYWZlIHRvIGxvYWQuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkQWxsVHJhbnNhY3Rpb25zKGluaXRpYWxMb2FkPzogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgaWYgKGlzSW5CdWlsZCgpKSByZXR1cm4gW107XG5cbiAgICAgICAgaWYgKGluaXRpYWxMb2FkICYmIHRoaXMucmVzeW5jRnJvbURpc2spIHtcbiAgICAgICAgICAgIHJ1bkluZmluaXRlUG9sbChESVNLX0NIRUNLX0lOVEVSVkFMLCAoKSA9PiB0aGlzLmNoZWNrRGlzaygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMucmF3U3RvcmFnZS5nZXRLZXlzKCk7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uRmlsZXMgPSBrZXlzLmZpbHRlcihrZXkgPT4ga2V5LmVuZHNXaXRoKENIVU5LX0VYVCkpO1xuICAgICAgICAvLyBQb3B1bGF0ZSBkaXNrRmlsZXMgd2l0aCBhY3R1YWwgdGltZXN0YW1wcyBmcm9tIGRpc2tcbiAgICAgICAgdGhpcy5kaXNrRmlsZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZvciAobGV0IGZpbGUgb2YgdHJhbnNhY3Rpb25GaWxlcykge1xuICAgICAgICAgICAgbGV0IGluZm8gPSBhd2FpdCB0aGlzLnJhd1N0b3JhZ2UuZ2V0SW5mbyhmaWxlKTtcbiAgICAgICAgICAgIHRoaXMuZGlza0ZpbGVzLnNldChmaWxlLCBpbmZvPy5sYXN0TW9kaWZpZWQgPz8gRGF0ZS5ub3coKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2l6ZSA9IHsgdmFsdWU6IDAgfTtcbiAgICAgICAgbGV0IGVudHJ5TGlzdDogVHJhbnNhY3Rpb25FbnRyeVtdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiB0cmFuc2FjdGlvbkZpbGVzKSB7XG4gICAgICAgICAgICBlbnRyeUxpc3QucHVzaChhd2FpdCB0aGlzLnBhcnNlVHJhbnNhY3Rpb25GaWxlKGZpbGUsIHNpemUpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZW50cmllcyA9IGVudHJ5TGlzdC5mbGF0KCk7XG4gICAgICAgIHRoaXMuYXBwbHlUcmFuc2FjdGlvbkVudHJpZXMoZW50cmllcywgaW5pdGlhbExvYWQpO1xuXG4gICAgICAgIHRpbWUgPSBEYXRlLm5vdygpIC0gdGltZTtcbiAgICAgICAgaWYgKHRpbWUgPiA1MCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYExvYWRlZCAke3RoaXMuZGVidWdOYW1lfSBpbiAke2Zvcm1hdFRpbWUodGltZSl9LCAke2Zvcm1hdE51bWJlcih0aGlzLmNhY2hlLnNpemUpfSBrZXlzLCBmcm9tICR7Zm9ybWF0TnVtYmVyKHRyYW5zYWN0aW9uRmlsZXMubGVuZ3RoKX0gZmlsZXMsIGVudHJpZXMgJHtmb3JtYXROdW1iZXIoZW50cmllcy5sZW5ndGgpfSwgdG90YWwgc2l6ZSAke2Zvcm1hdE51bWJlcihzaXplLnZhbHVlKX1CYCwgdHJhbnNhY3Rpb25GaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0cmFuc2FjdGlvbkZpbGVzO1xuICAgIH1cblxuICAgIC8vIE9OTFkgY2FsbCB0aGlzIGluc2lkZSBvZiBsb2FkQWxsVHJhbnNhY3Rpb25zXG4gICAgcHJpdmF0ZSBhc3luYyBwYXJzZVRyYW5zYWN0aW9uRmlsZShmaWxlbmFtZTogc3RyaW5nLCBzaXplOiB7IHZhbHVlOiBudW1iZXIgfSk6IFByb21pc2U8VHJhbnNhY3Rpb25FbnRyeVtdPiB7XG4gICAgICAgIGNvbnN0IGZ1bGxGaWxlID0gYXdhaXQgdGhpcy5yYXdTdG9yYWdlLmdldChmaWxlbmFtZSk7XG4gICAgICAgIGlmICghZnVsbEZpbGUpIHJldHVybiBbXTtcbiAgICAgICAgaWYgKGZ1bGxGaWxlLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoYFRyYW5zYWN0aW9uIGluICR7dGhpcy5kZWJ1Z05hbWV9IGZpbGUgJHtmaWxlbmFtZX0gaXMgdG9vIHNtYWxsLCBza2lwcGluZ2ApO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHNpemUudmFsdWUgKz0gZnVsbEZpbGUubGVuZ3RoO1xuICAgICAgICBsZXQgaGVhZGVyU2l6ZSA9IGZ1bGxGaWxlLnJlYWRVSW50MzJMRSgwKTtcbiAgICAgICAgbGV0IGhlYWRlckJ1ZmZlciA9IGZ1bGxGaWxlLnNsaWNlKDQsIDQgKyBoZWFkZXJTaXplKTtcbiAgICAgICAgbGV0IGhlYWRlcjogVHJhbnNhY3Rpb25IZWFkZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBoZWFkZXIgPSBKU09OLnBhcnNlKGhlYWRlckJ1ZmZlci50b1N0cmluZygpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIGhlYWRlciBvZiB0cmFuc2FjdGlvbiBmaWxlIGluICR7dGhpcy5kZWJ1Z05hbWV9LCAke2ZpbGVuYW1lfWApO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb250ZW50ID0gZnVsbEZpbGUuc2xpY2UoNCArIGhlYWRlclNpemUpO1xuICAgICAgICBpZiAoaGVhZGVyLnppcHBlZCkge1xuICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IFppcC5ndW56aXAoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgbGV0IGVudHJpZXM6IFRyYW5zYWN0aW9uRW50cnlbXSA9IFtdO1xuICAgICAgICB3aGlsZSAob2Zmc2V0IDwgY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghY29udGVudC5zbGljZShvZmZzZXQsIG9mZnNldCArIFNUQVJUX0JZVEVTLmxlbmd0aCkuZXF1YWxzKFNUQVJUX0JZVEVTKSkge1xuICAgICAgICAgICAgICAgIGxldCBzID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBjb250ZW50Lmxlbmd0aCAmJiAhY29udGVudC5zbGljZShvZmZzZXQsIG9mZnNldCArIFNUQVJUX0JZVEVTLmxlbmd0aCkuZXF1YWxzKFNUQVJUX0JZVEVTKSkge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IG9mZnNldCAtIHM7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGb3VuZCBiYWQgYnl0ZXMgaW4gJHtmaWxlbmFtZX0sIHNraXBwaW5nICR7bGVufSBieXRlcyBhdCBvZmZzZXQgJHtzfS4gVG90YWwgZmlsZSBieXRlcyAke2NvbnRlbnQubGVuZ3RofSwgcmVhZCAke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzYCk7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBjb250ZW50Lmxlbmd0aCkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZW50cnlPYmo6IHsgZW50cnk6IFRyYW5zYWN0aW9uRW50cnksIG9mZnNldDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVudHJ5T2JqID0gdGhpcy5yZWFkVHJhbnNhY3Rpb25FbnRyeShjb250ZW50LCBvZmZzZXQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcIlJlYWQgcGFzdCBlbmQgb2YgYnVmZmVyXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZW50cnlPYmopIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byByZWFkIHRyYW5zYWN0aW9uIGVudHJ5IGluIGluICR7dGhpcy5kZWJ1Z05hbWV9LCBmaWxlICR7ZmlsZW5hbWV9IGF0IG9mZnNldCAke29mZnNldH0sIHNraXBwaW5nIGJhZCBieXRlcywgcmVhZGluZyByZW1haW5kZXIgb2YgZmlsZWApO1xuICAgICAgICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmVudHJ5Q291bnQrKztcbiAgICAgICAgICAgIGxldCB7IGVudHJ5IH0gPSBlbnRyeU9iajtcbiAgICAgICAgICAgIG9mZnNldCA9IGVudHJ5T2JqLm9mZnNldDtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfVxuICAgIHByaXZhdGUgYXBwbHlUcmFuc2FjdGlvbkVudHJpZXMoZW50cmllczogVHJhbnNhY3Rpb25FbnRyeVtdLCBpbml0aWFsTG9hZD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgbGV0IHBlbmRpbmdXcml0ZVRpbWVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLnBlbmRpbmdBcHBlbmRzKSB7XG4gICAgICAgICAgICBsZXQgcHJldlRpbWUgPSBwZW5kaW5nV3JpdGVUaW1lcy5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICAgIGlmIChwcmV2VGltZSAmJiBwcmV2VGltZSA+IGVudHJ5LnRpbWUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBlbmRpbmdXcml0ZVRpbWVzLnNldChlbnRyeS5rZXksIGVudHJ5LnRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXRlc3QgPSBuZXcgTWFwPHN0cmluZywgVHJhbnNhY3Rpb25FbnRyeT4oKTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBsZXQgcGVuZGluZ1RpbWUgPSBwZW5kaW5nV3JpdGVUaW1lcy5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nVGltZSAmJiBwZW5kaW5nVGltZSA+IGVudHJ5LnRpbWUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwcmV2ID0gbGF0ZXN0LmdldChlbnRyeS5rZXkpO1xuICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldi50aW1lID4gZW50cnkudGltZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF0ZXN0LnNldChlbnRyeS5rZXksIGVudHJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhbnlDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGxhdGVzdC52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGVudHJ5LnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FjaGUuaGFzKGVudHJ5LmtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGFueUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGVudHJ5LmtleSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghYW55Q2hhbmdlZCAmJiAhaW5pdGlhbExvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5jYWNoZS5nZXQoZW50cnkua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEhcHJldi52YWx1ZSAhPT0gISFlbnRyeS52YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldi52YWx1ZSAmJiBlbnRyeS52YWx1ZSAmJiAhcHJldi52YWx1ZS5lcXVhbHMoZW50cnkudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGFueUNoYW5nZWQgPSBoYXNDaGFuZ2VkKCkgfHwgYW55Q2hhbmdlZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlLnNldChlbnRyeS5rZXksIGVudHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbnlDaGFuZ2VkICYmICFpbml0aWFsTG9hZCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBUcmFuc2FjdGlvbiBzdG9yYWdlICR7dGhpcy5kZWJ1Z05hbWV9IGNoYW5nZWQgb24gZGlzaywgdHJpZ2dlcmluZyBmdWxsIGRvd25sb2FkIGZyb20gZGlza2ApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLnJlc3luY0NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkVHJhbnNhY3Rpb25FbnRyeShidWZmZXI6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiB7XG4gICAgICAgIGVudHJ5OiBUcmFuc2FjdGlvbkVudHJ5O1xuICAgICAgICBvZmZzZXQ6IG51bWJlcjtcbiAgICB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgZnVuY3Rpb24gcmVhZFNsaWNlKGNvdW50OiBudW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsaWNlID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgY291bnQpO1xuICAgICAgICAgICAgaWYgKHNsaWNlLmxlbmd0aCA8IGNvdW50KSB0aHJvdyBuZXcgRXJyb3IoYFJlYWQgcGFzdCBlbmQgb2YgYnVmZmVyIGF0IG9mZnNldCAke29mZnNldH0vJHtidWZmZXIubGVuZ3RofWApO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IGNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHNsaWNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVhZFNsaWNlKFNUQVJUX0JZVEVTLmxlbmd0aCkuZXF1YWxzKFNUQVJUX0JZVEVTKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBrZXlMZW5ndGggPSByZWFkU2xpY2UoNCkucmVhZFVJbnQzMkxFKDApO1xuICAgICAgICBjb25zdCB2YWx1ZUxlbmd0aCA9IHJlYWRTbGljZSg0KS5yZWFkVUludDMyTEUoMCk7XG4gICAgICAgIGNvbnN0IHRpbWUgPSByZWFkU2xpY2UoOCkucmVhZERvdWJsZUxFKDApO1xuICAgICAgICBjb25zdCBmbGFncyA9IHJlYWRTbGljZSgxKS5yZWFkVUludDgoMCk7XG5cbiAgICAgICAgY29uc3Qga2V5ID0gcmVhZFNsaWNlKGtleUxlbmd0aCkudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IHZhbHVlID0gcmVhZFNsaWNlKHZhbHVlTGVuZ3RoKTtcblxuICAgICAgICBpZiAoIXJlYWRTbGljZShFTkRfQllURVMubGVuZ3RoKS5lcXVhbHMoRU5EX0JZVEVTKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgaXNaaXBwZWQgPSAoZmxhZ3MgJiAxKSA9PT0gMTtcbiAgICAgICAgbGV0IGlzRGVsZXRlID0gKGZsYWdzICYgMikgPT09IDI7XG5cbiAgICAgICAgaWYgKGlzWmlwcGVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IFppcC5ndW56aXBTeW5jKHZhbHVlKTtcbiAgICAgICAgICAgIGlzWmlwcGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW50cnk6IFRyYW5zYWN0aW9uRW50cnkgPSB7IGtleSwgdmFsdWUsIGlzWmlwcGVkLCB0aW1lIH07XG4gICAgICAgIGlmIChpc0RlbGV0ZSkge1xuICAgICAgICAgICAgZW50cnkudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZW50cnksIG9mZnNldCB9O1xuICAgIH1cblxuICAgIC8vIFRPRE86IE1ha2UgdGhpcyBkaXJlY3RseSBnbyBmcm9tIFRyYW5zYWN0aW9uRW50cnlbXSB0byBCdWZmZXIsIGJ5IHByZS1hbGxvY2F0aW5nLCBzbyBpdCBpcyBtb3JlIGVmZmljaWVudFxuICAgIHByaXZhdGUgc2VyaWFsaXplVHJhbnNhY3Rpb25FbnRyeShlbnRyeTogVHJhbnNhY3Rpb25FbnRyeSk6IEJ1ZmZlciB7XG4gICAgICAgIGxldCBrZXlCdWZmZXIgPSBCdWZmZXIuZnJvbShlbnRyeS5rZXkpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoXG4gICAgICAgICAgICBTVEFSVF9CWVRFUy5sZW5ndGggKyA0ICsgNCArIDggKyAxICsga2V5QnVmZmVyLmxlbmd0aCArIChlbnRyeS52YWx1ZT8ubGVuZ3RoIHx8IDApICsgRU5EX0JZVEVTLmxlbmd0aFxuICAgICAgICApO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcblxuICAgICAgICBTVEFSVF9CWVRFUy5jb3B5KGJ1ZmZlciwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IFNUQVJUX0JZVEVTLmxlbmd0aDtcblxuICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRShrZXlCdWZmZXIubGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gNDtcblxuICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRShlbnRyeS52YWx1ZSA/IGVudHJ5LnZhbHVlLmxlbmd0aCA6IDAsIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSA0O1xuXG4gICAgICAgIGJ1ZmZlci53cml0ZURvdWJsZUxFKGVudHJ5LnRpbWUsIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSA4O1xuXG4gICAgICAgIGxldCBmbGFncyA9IDA7XG4gICAgICAgIGlmIChlbnRyeS5pc1ppcHBlZCkgZmxhZ3MgfD0gMTtcbiAgICAgICAgaWYgKGVudHJ5LnZhbHVlID09PSB1bmRlZmluZWQpIGZsYWdzIHw9IDI7XG4gICAgICAgIGJ1ZmZlci53cml0ZVVJbnQ4KGZsYWdzLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gMTtcblxuICAgICAgICBrZXlCdWZmZXIuY29weShidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBrZXlCdWZmZXIubGVuZ3RoO1xuXG4gICAgICAgIGlmIChlbnRyeS52YWx1ZSkge1xuICAgICAgICAgICAgZW50cnkudmFsdWUuY29weShidWZmZXIsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gZW50cnkudmFsdWUubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgRU5EX0JZVEVTLmNvcHkoYnVmZmVyLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gRU5EX0JZVEVTLmxlbmd0aDtcblxuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SGVhZGVyKHppcDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBoZWFkZXI6IFRyYW5zYWN0aW9uSGVhZGVyID0geyB6aXBwZWQ6IHppcCB9O1xuICAgICAgICBsZXQgaGVhZGVyQnVmZmVyID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoaGVhZGVyKSk7XG4gICAgICAgIGxldCBoZWFkZXJTaXplID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgICAgICBoZWFkZXJTaXplLndyaXRlVUludDMyTEUoaGVhZGVyQnVmZmVyLmxlbmd0aCwgMCk7XG4gICAgICAgIHJldHVybiB7IGhlYWRlciwgaGVhZGVyQnVmZmVyOiBCdWZmZXIuY29uY2F0KFtoZWFkZXJTaXplLCBoZWFkZXJCdWZmZXJdKSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY2h1bmtCdWZmZXJzKGJ1ZmZlcnM6IEJ1ZmZlcltdKSB7XG4gICAgICAgIGxldCBuZXdDaHVua3M6IHtcbiAgICAgICAgICAgIGJ1ZmZlcnM6IEJ1ZmZlcltdO1xuICAgICAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgbmV3Q2h1bmtzLnB1c2goeyBidWZmZXJzOiBbXSwgc2l6ZTogMCB9KTtcbiAgICAgICAgZm9yIChjb25zdCBidWZmZXIgb2YgYnVmZmVycykge1xuICAgICAgICAgICAgaWYgKG5ld0NodW5rc1tuZXdDaHVua3MubGVuZ3RoIC0gMV0uc2l6ZSArIGJ1ZmZlci5sZW5ndGggPj0gRklMRV9DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICAgICAgbmV3Q2h1bmtzLnB1c2goeyBidWZmZXJzOiBbXSwgc2l6ZTogMCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0NodW5rc1tuZXdDaHVua3MubGVuZ3RoIC0gMV0uYnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgICAgICAgICBuZXdDaHVua3NbbmV3Q2h1bmtzLmxlbmd0aCAtIDFdLnNpemUgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3Q2h1bmtzLm1hcCh4ID0+ICh7IGJ1ZmZlcjogQnVmZmVyLmNvbmNhdCh4LmJ1ZmZlcnMpLCBzaXplOiB4LnNpemUgfSkpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBjb21wcmVzc2luZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgYXN5bmMgY29tcHJlc3NUcmFuc2FjdGlvbkxvZyhmb3JjZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NpbmcpIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmdEaXNrRW50cmllcyA9IGF3YWl0IHRoaXMucmF3U3RvcmFnZS5nZXRLZXlzKCk7XG4gICAgICAgICAgICBleGlzdGluZ0Rpc2tFbnRyaWVzID0gZXhpc3RpbmdEaXNrRW50cmllcy5maWx0ZXIoeCA9PiB4LmVuZHNXaXRoKENIVU5LX0VYVCkpO1xuICAgICAgICAgICAgbGV0IGNvbXByZXNzTm93ID0gZm9yY2UgfHwgKFxuICAgICAgICAgICAgICAgIHRoaXMuZW50cnlDb3VudCA+IDEwMCAmJiB0aGlzLmVudHJ5Q291bnQgPiB0aGlzLmNhY2hlLnNpemUgKiAzXG4gICAgICAgICAgICAgICAgLy8gTk9URTogVGhpcyBjb21wcmVzcyBjaGVjayBicmVha3MgZG93biBpZiB3ZSBvbmx5IGhhdmUgdmVyeSBsYXJnZSB2YWx1ZXMsIGJ1dC4uLiB0aG9zZSBkb24ndCB3b3JrIEFOWVdBWVMgKGl0IGlzIGJldHRlciB0byB1c2Ugb25lIGZpbGUgcGVyIHZhbHVlIGluc3RlYWQpLlxuICAgICAgICAgICAgICAgIC8vICAtIE1heWJlIHdlIHNob3VsZCB0aHJvdywgb3IgYXQgbGVhc3Qgd2Fybiwgb24gc2V0cyBvZiB2YWx1ZSA+IDFNQixcbiAgICAgICAgICAgICAgICAvLyAgICAgIGF0IHdoaWNoIHBvaW50IHRoZXkgc2hvdWxkIGp1c3QgdXNlIGEgZmlsZSBwZXIgdmFsdWVcbiAgICAgICAgICAgICAgICB8fCBleGlzdGluZ0Rpc2tFbnRyaWVzLmxlbmd0aCA+IE1hdGgubWF4KDEwLCBNYXRoLmNlaWwodGhpcy5lbnRyeUNvdW50IC8gMTAwMCkpXG4gICAgICAgICAgICAgICAgfHwgZXhpc3RpbmdEaXNrRW50cmllcy5sZW5ndGggPiAxMDAwICogMTBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWNvbXByZXNzTm93KSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29tcHJlc3NpbmcgJHt0aGlzLmRlYnVnTmFtZX0gdHJhbnNhY3Rpb24gbG9nLCAke3RoaXMuZW50cnlDb3VudH0gZW50cmllcywgJHt0aGlzLmNhY2hlLnNpemV9IGtleXNgKTtcblxuICAgICAgICAgICAgLy8gTG9hZCBvZmYgZGlzaywgaW4gY2FzZSB0aGVyZSBhcmUgb3RoZXIgd3JpdGVzLiBXZSBzdGlsbCByYWNlIHdpdGggdGhlbSwgYnV0IGF0IGxlYXN0IHRoaXMgcmVkdWNlcyB0aGUgcmFjZSBjb25kaXRpb24gY29uc2lkZXJhYmx5XG4gICAgICAgICAgICBleGlzdGluZ0Rpc2tFbnRyaWVzID0gYXdhaXQgdGhpcy5sb2FkQWxsVHJhbnNhY3Rpb25zKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZW50cnlDb3VudCA9IHRoaXMuY2FjaGUuc2l6ZTtcblxuXG4gICAgICAgICAgICBsZXQgYnVmZmVyczogQnVmZmVyW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5jYWNoZS52YWx1ZXMoKSkge1xuICAgICAgICAgICAgICAgIGxldCBidWZmZXIgPSB0aGlzLnNlcmlhbGl6ZVRyYW5zYWN0aW9uRW50cnkoZW50cnkpO1xuICAgICAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChidWZmZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbmV3Q2h1bmtzID0gdGhpcy5jaHVua0J1ZmZlcnMoYnVmZmVycyk7XG5cbiAgICAgICAgICAgIGxldCBuZXdGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNodW5rIG9mIG5ld0NodW5rcykge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgcHJldmlvdXMgY3VycmVudCBjaHVuayBmb3IgdGhlIG5ldyBmaWxlLiBBbHNvIGNsZWFyIGl0IGFmdGVyd2FyZHMgc28gaXQncyBub3QgcmV1c2VkIGZvciBhbnkgZnV0dXJlIHJpZ2h0cy4gXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2h1bmsgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSB0aGlzLmdldEN1cnJlbnRDaHVuaygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENodW5rID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG5ld0ZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBjaHVuay5idWZmZXI7XG4gICAgICAgICAgICAgICAgbGV0IHsgaGVhZGVyLCBoZWFkZXJCdWZmZXIgfSA9IHRoaXMuZ2V0SGVhZGVyKFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Lmxlbmd0aCA+PSBGSUxFX1pJUF9USFJFU0hPTERcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuemlwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBhd2FpdCBaaXAuZ3ppcChjb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2hlYWRlckJ1ZmZlciwgY29udGVudF0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmF3U3RvcmFnZS5zZXQoZmlsZSwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURpc2tGaWxlVGltZXN0YW1wKGZpbGUpO1xuICAgICAgICAgICAgICAgIGxldCB2ZXJpZmllZCA9IGF3YWl0IHRoaXMucmF3U3RvcmFnZS5nZXQoZmlsZSk7XG4gICAgICAgICAgICAgICAgaWYgKCF2ZXJpZmllZD8uZXF1YWxzKGJ1ZmZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbiBmaWxlICR7ZmlsZX0gaW4gJHt0aGlzLmRlYnVnTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIGZpbGUgJHtmaWxlfSBpbiAke3RoaXMuZGVidWdOYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgT05MWSB0aW1lIHdlIGNhbiBkZWxldGUgb2xkIGZpbGVzLCBhcyB3ZSBrbm93IGZvciBzdXJlIHRoZSBuZXcgZmlsZSBoYXMgYWxsIG9mIG91ciBkYXRhLiBBbnkgZnV0dXJlIHJlYWRlcnMgd29uJ3Qga25vdyB0aGlzLCB1bmxlc3MgdGhleSB3cml0ZSBpdCB0aGVtc2VsdmVzIChvciB1bmxlc3MgdGhleSBhdWRpdCBpdCBhZ2FpbnN0IHRoZSBvdGhlciBnZW5lcmF0aW9ucywgd2hpY2ggaXMgYW5ub3lpbmcpLlxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGV4aXN0aW5nRGlza0VudHJpZXMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJhd1N0b3JhZ2UucmVtb3ZlKGZpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlza0ZpbGVzLmRlbGV0ZShmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXNldCgpIHtcbiAgICAgICAgYXdhaXQgZmlsZUxvY2tTZWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBleGlzdGluZ0Rpc2tFbnRyaWVzID0gYXdhaXQgdGhpcy5yYXdTdG9yYWdlLmdldEtleXMoKTtcbiAgICAgICAgICAgIGV4aXN0aW5nRGlza0VudHJpZXMgPSBleGlzdGluZ0Rpc2tFbnRyaWVzLmZpbHRlcih4ID0+IHguZW5kc1dpdGgoQ0hVTktfRVhUKSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGV4aXN0aW5nRGlza0VudHJpZXMubWFwKHggPT4gdGhpcy5yYXdTdG9yYWdlLnJlbW92ZSh4KSkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cblxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQXBwZW5kcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jYWNoZS5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5kaXNrRmlsZXMuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENodW5rID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5lbnRyeUNvdW50ID0gMDtcbiAgICAgICAgfSk7XG4gICAgfVxufSJdfQ==
|
|
547
|
-
/* _JS_SOURCE_HASH = "
|
|
547
|
+
/* _JS_SOURCE_HASH = "d3e36cc62c47500f4ba9918b90652351548b609e3829d8077a2c42e47bd0a214"; */
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
//exports.moveArchiveFile = exports.copyArchiveFile = void 0;
|
|
4
|
+
const format_1 = require("socket-function/src/formatting/format");
|
|
4
5
|
const storageLogs_1 = require("./remoteStorage/storageLogs");
|
|
5
6
|
// Cross-archive file operations built ON TOP of IArchives (copy, move) - helpers over the interface, not part of it, so they live beside it rather than in it.
|
|
6
7
|
const LARGE_COPY_THRESHOLD = 64 * 1024 * 1024;
|
|
@@ -14,11 +15,12 @@ async function copyArchiveFile(config) {
|
|
|
14
15
|
return undefined;
|
|
15
16
|
let size = info.size;
|
|
16
17
|
// internal (synchronization between replicas of the same key) preserves the source's write time, so ordering survives propagation. A plain copy is a NEW write and is stamped now: the source's old stamp would make it LOSE to any newer write or tombstone at the destination, silently - move a file back to a folder it was deleted from and the copy is dropped, then the caller deletes the source, and the file is gone entirely.
|
|
17
|
-
let writeTime = config.internal && info.writeTime || Date.now();
|
|
18
|
+
let writeTime = Math.floor(config.internal && info.writeTime || Date.now());
|
|
18
19
|
// A destination that already holds a NEWER file must not be overwritten with our older one - and the destination's own only-take-latest would drop the write SILENTLY, leaving the caller believing the copy happened. Refusing here, loudly, is what turns "the remote has something we missed" from a masked bug into a log line the caller can act on.
|
|
19
20
|
let destInfo = await to.getInfo(toPath, { noFallbacks: config.noFallbacks });
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
// Compared at whole-millisecond precision, here and at the confirm below: disk mtimes carry fractional milliseconds, but utimes round-trips only whole ones, so sub-millisecond differences are storage artifacts of the SAME time, not ordering
|
|
22
|
+
if (destInfo && Math.floor(destInfo.writeTime) > Math.floor(writeTime)) {
|
|
23
|
+
(0, storageLogs_1.logStorageError)(`Copy refused - a newer file exists at the destination. Refusing to copy ${JSON.stringify(path)} from ${from.getDebugName()} to ${to.getDebugName()}${toPath !== path && ` (as ${JSON.stringify(toPath)})` || ""}: ours ${size} bytes at ${(0, format_1.formatDateTimeDetailed)(writeTime)}, theirs ${destInfo.size} bytes at ${(0, format_1.formatDateTimeDetailed)(destInfo.writeTime)} - copying would roll it back`);
|
|
22
24
|
return undefined;
|
|
23
25
|
}
|
|
24
26
|
let copiedSize;
|
|
@@ -49,7 +51,7 @@ async function copyArchiveFile(config) {
|
|
|
49
51
|
let end = Math.min(offset + LARGE_COPY_CHUNK, totalSize);
|
|
50
52
|
let data = await from.get(path, { range: { start: offset, end }, internal: config.internal, noFallbacks: config.noFallbacks });
|
|
51
53
|
if (!data || !data.length) {
|
|
52
|
-
throw new Error(`Ranged read
|
|
54
|
+
throw new Error(`Ranged read returned nothing mid-copy. Reading ${JSON.stringify(path)} from ${from.getDebugName()} returned ${data && data.length || "nothing"} at ${offset}-${end} (expected ${end - offset} bytes of a ${totalSize} byte file - it changed or vanished mid-copy)`);
|
|
53
55
|
}
|
|
54
56
|
offset += data.length;
|
|
55
57
|
return data;
|
|
@@ -59,8 +61,8 @@ async function copyArchiveFile(config) {
|
|
|
59
61
|
}
|
|
60
62
|
// Every backend drops a superseded write SILENTLY (its only-take-latest is the last line of defense against races the up-front check can't see), so a returned set is not proof the copy landed - only the destination reporting the file at OUR time or newer is. Newer also counts as landed: the destination is at least as new as what we pushed (and b2 always stamps its own, later, upload time).
|
|
61
63
|
let confirmed = await to.getInfo(toPath, { noFallbacks: config.noFallbacks });
|
|
62
|
-
if (!confirmed || confirmed.writeTime < writeTime) {
|
|
63
|
-
(0, storageLogs_1.logStorageError)(`Copy of ${JSON.stringify(path)} from ${from.getDebugName()} to ${to.getDebugName()}${toPath !== path && ` (as ${JSON.stringify(toPath)})` || ""}
|
|
64
|
+
if (!confirmed || Math.floor(confirmed.writeTime) < Math.floor(writeTime)) {
|
|
65
|
+
(0, storageLogs_1.logStorageError)(`Copy was silently dropped by the destination. Copy of ${JSON.stringify(path)} from ${from.getDebugName()} to ${to.getDebugName()}${toPath !== path && ` (as ${JSON.stringify(toPath)})` || ""}: our copy was ${copiedSize} bytes at ${(0, format_1.formatDateTimeDetailed)(writeTime)}, but the destination reports ${confirmed && `${confirmed.size} bytes at ${(0, format_1.formatDateTimeDetailed)(confirmed.writeTime)}` || "nothing"} (a newer write or deletion won the race)`);
|
|
64
66
|
return undefined;
|
|
65
67
|
}
|
|
66
68
|
return { writeTime, size: copiedSize };
|
|
@@ -91,16 +93,16 @@ async function moveArchiveFile(config) {
|
|
|
91
93
|
// Undefined is two cases (see copyArchiveFile) - asking the source which one keeps the error honest
|
|
92
94
|
let sourceInfo = await from.getInfo(path, { noFallbacks: config.noFallbacks });
|
|
93
95
|
if (sourceInfo) {
|
|
94
|
-
throw new Error(`Cannot move ${JSON.stringify(path)} (${sourceInfo.size} bytes at ${
|
|
96
|
+
throw new Error(`Move refused - a newer file exists at the destination. Cannot move ${JSON.stringify(path)} (${sourceInfo.size} bytes at ${(0, format_1.formatDateTimeDetailed)(sourceInfo.writeTime)}) from ${from.getDebugName()}: ${to.getDebugName()} holds something newer at ${JSON.stringify(toPath)}, and the copy was refused rather than roll it back - the source is left untouched`);
|
|
95
97
|
}
|
|
96
|
-
throw new Error(`Cannot move ${JSON.stringify(path)}: ${from.getDebugName()} does not have it`);
|
|
98
|
+
throw new Error(`Move source does not exist. Cannot move ${JSON.stringify(path)}: ${from.getDebugName()} does not have it`);
|
|
97
99
|
}
|
|
98
100
|
let confirmed = await to.getInfo(toPath, { noFallbacks: config.noFallbacks });
|
|
99
101
|
if (!confirmed) {
|
|
100
|
-
throw new Error(`Not deleting ${JSON.stringify(path)} from ${from.getDebugName()} after copying it: ${to.getDebugName()} does not report ${JSON.stringify(toPath)} (the copy claimed to succeed, so something is wrong
|
|
102
|
+
throw new Error(`Move copy could not be confirmed - the source is kept. Not deleting ${JSON.stringify(path)} from ${from.getDebugName()} after copying it: ${to.getDebugName()} does not report ${JSON.stringify(toPath)} (the copy claimed to succeed, so something is wrong)`);
|
|
101
103
|
}
|
|
102
104
|
await from.del(path);
|
|
103
105
|
}
|
|
104
106
|
exports.moveArchiveFile = moveArchiveFile;
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcmNoaXZlSGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw2REFBOEQ7QUFFOUQsK0pBQStKO0FBRS9KLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUxQyx1OEJBQXU4QjtBQUNoOEIsS0FBSyxVQUFVLGVBQWUsQ0FBQyxNQVVyQztJQUNHLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztJQUNuQyxJQUFJLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDNUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQix5YUFBeWE7SUFDemEsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNoRSwwVkFBMFY7SUFDMVYsSUFBSSxRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM3RSxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQzdDLElBQUEsNkJBQWUsRUFBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMs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QUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsd0ZBQXdGLENBQUMsQ0FBQztJQUMvUCxDQUFDO0lBQ0QsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUEvQkQsMENBK0JDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVHlwZS1vbmx5OiBJQXJjaGl2ZXMudHMgcmUtZXhwb3J0cyBvdXIgZnVuY3Rpb25zLCBzbyBhIHZhbHVlIGltcG9ydCBiYWNrIGF0IGl0IHdvdWxkIGJlIGEgcmVxdWlyZSBjeWNsZVxuaW1wb3J0IHR5cGUgeyBJQXJjaGl2ZXMgfSBmcm9tIFwiLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGxvZ1N0b3JhZ2VFcnJvciB9IGZyb20gXCIuL3JlbW90ZVN0b3JhZ2Uvc3RvcmFnZUxvZ3NcIjtcblxuLy8gQ3Jvc3MtYXJjaGl2ZSBmaWxlIG9wZXJhdGlvbnMgYnVpbHQgT04gVE9QIG9mIElBcmNoaXZlcyAoY29weSwgbW92ZSkgLSBoZWxwZXJzIG92ZXIgdGhlIGludGVyZmFjZSwgbm90IHBhcnQgb2YgaXQsIHNvIHRoZXkgbGl2ZSBiZXNpZGUgaXQgcmF0aGVyIHRoYW4gaW4gaXQuXG5cbmNvbnN0IExBUkdFX0NPUFlfVEhSRVNIT0xEID0gNjQgKiAxMDI0ICogMTAyNDtcbmNvbnN0IExBUkdFX0NPUFlfQ0hVTksgPSAzMiAqIDEwMjQgKiAxMDI0O1xuXG4vKiogQ29waWVzIG9uZSBmaWxlIGJldHdlZW4gdHdvIGFyY2hpdmVzLiBUaGUgc291cmNlJ3MgQ1VSUkVOVCBzaXplIGFuZCB3cml0ZSB0aW1lIGFsd2F5cyBjb21lIGZyb20gZ2V0SW5mbyByaWdodCBoZXJlIC0gY2FsbGVycyBuZXZlciBzdXBwbHkgdGhlbSwgYmVjYXVzZSBhIHN0YWxlIHNpemUgdHVybnMgaW50byByYW5nZWQgcmVhZHMgb2YgYSBmaWxlIHRoYXQgaGFzIGNoYW5nZWQgKGZhaWxpbmcgZm9yZXZlciksIGFuZCBhIHN0YWxlIHdyaXRlIHRpbWUgcmUtb3JkZXJzIGhpc3RvcnkuIFNtYWxsIGZpbGVzIGdvIGFzIGEgc2luZ2xlIGdldDIrc2V0OyBwYXN0IExBUkdFX0NPUFlfVEhSRVNIT0xEIHRoZSBjb3B5IHN0cmVhbXMgdGhyb3VnaCBzZXRMYXJnZUZpbGUgaW4gTEFSR0VfQ09QWV9DSFVOSyByYW5nZWQgcmVhZHMsIHNvIHRoZSB3aG9sZSBmaWxlIGlzIG5ldmVyIGluIG1lbW9yeS4gUmV0dXJucyB0aGUgY29waWVkIGZpbGUncyBpbmZvLCBhbmQgdW5kZWZpbmVkIGZvciBldmVyeSB3YXkgdGhlIGNvcHkgZGlkIE5PVCBsYW5kOiB0aGUgc291cmNlIGRvZXNuJ3QgaGF2ZSB0aGUgZmlsZSwgdGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgaGFkIGEgTkVXRVIgZmlsZSAocmVmdXNlZCB1cCBmcm9udCByYXRoZXIgdGhhbiByb2xsIGl0IGJhY2spLCBvciB0aGUgZGVzdGluYXRpb24gc2lsZW50bHkgZHJvcHBlZCB0aGUgd3JpdGUgKGl0cyBvd24gb25seS10YWtlLWxhdGVzdCB3b24gYSByYWNlIHdlIGxvc3QgLSBjYXVnaHQgYnkgY29uZmlybWluZyB3aXRoIGdldEluZm8gYWZ0ZXJ3YXJkKS4gVGhlIHJlZnVzZWQvZHJvcHBlZCBjYXNlcyBhcmUgbG9nZ2VkIGFzIGVycm9yczsgYSBjYWxsZXIgdGhhdCB0cmVhdHMgdW5kZWZpbmVkIGFzIFwibWlzc2luZyBhdCB0aGUgc291cmNlXCIgbXVzdCBnZXRJbmZvIHRoZSBkZXN0aW5hdGlvbiB0byBsZWFybiB0aGUgYWN0dWFsIGxhdGVzdCB2YWx1ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5QXJjaGl2ZUZpbGUoY29uZmlnOiB7XG4gICAgZnJvbTogSUFyY2hpdmVzO1xuICAgIHRvOiBJQXJjaGl2ZXM7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIC8qKiBUaGUgcGF0aCBhdCB0aGUgZGVzdGluYXRpb24gLSBkZWZhdWx0cyB0byBwYXRoICh0aGUgY29tbW9uIGNhc2U6IHRoZSBzYW1lIGtleSBtb3ZpbmcgYmV0d2VlbiB0d28gYXJjaGl2ZXMpLiAqL1xuICAgIHRvUGF0aD86IHN0cmluZztcbiAgICBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47XG4gICAgbm9DaGVja3M/OiBib29sZWFuO1xuICAgIGludGVybmFsPzogYm9vbGVhbjtcbiAgICBub0ZhbGxiYWNrcz86IGJvb2xlYW47XG59KTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCB7IGZyb20sIHRvLCBwYXRoIH0gPSBjb25maWc7XG4gICAgbGV0IHRvUGF0aCA9IGNvbmZpZy50b1BhdGggfHwgcGF0aDtcbiAgICBsZXQgaW5mbyA9IGF3YWl0IGZyb20uZ2V0SW5mbyhwYXRoLCB7IG5vRmFsbGJhY2tzOiBjb25maWcubm9GYWxsYmFja3MgfSk7XG4gICAgaWYgKCFpbmZvKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxldCBzaXplID0gaW5mby5zaXplO1xuICAgIC8vIGludGVybmFsIChzeW5jaHJvbml6YXRpb24gYmV0d2VlbiByZXBsaWNhcyBvZiB0aGUgc2FtZSBrZXkpIHByZXNlcnZlcyB0aGUgc291cmNlJ3Mgd3JpdGUgdGltZSwgc28gb3JkZXJpbmcgc3Vydml2ZXMgcHJvcGFnYXRpb24uIEEgcGxhaW4gY29weSBpcyBhIE5FVyB3cml0ZSBhbmQgaXMgc3RhbXBlZCBub3c6IHRoZSBzb3VyY2UncyBvbGQgc3RhbXAgd291bGQgbWFrZSBpdCBMT1NFIHRvIGFueSBuZXdlciB3cml0ZSBvciB0b21ic3RvbmUgYXQgdGhlIGRlc3RpbmF0aW9uLCBzaWxlbnRseSAtIG1vdmUgYSBmaWxlIGJhY2sgdG8gYSBmb2xkZXIgaXQgd2FzIGRlbGV0ZWQgZnJvbSBhbmQgdGhlIGNvcHkgaXMgZHJvcHBlZCwgdGhlbiB0aGUgY2FsbGVyIGRlbGV0ZXMgdGhlIHNvdXJjZSwgYW5kIHRoZSBmaWxlIGlzIGdvbmUgZW50aXJlbHkuXG4gICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZy5pbnRlcm5hbCAmJiBpbmZvLndyaXRlVGltZSB8fCBEYXRlLm5vdygpO1xuICAgIC8vIEEgZGVzdGluYXRpb24gdGhhdCBhbHJlYWR5IGhvbGRzIGEgTkVXRVIgZmlsZSBtdXN0IG5vdCBiZSBvdmVyd3JpdHRlbiB3aXRoIG91ciBvbGRlciBvbmUgLSBhbmQgdGhlIGRlc3RpbmF0aW9uJ3Mgb3duIG9ubHktdGFrZS1sYXRlc3Qgd291bGQgZHJvcCB0aGUgd3JpdGUgU0lMRU5UTFksIGxlYXZpbmcgdGhlIGNhbGxlciBiZWxpZXZpbmcgdGhlIGNvcHkgaGFwcGVuZWQuIFJlZnVzaW5nIGhlcmUsIGxvdWRseSwgaXMgd2hhdCB0dXJucyBcInRoZSByZW1vdGUgaGFzIHNvbWV0aGluZyB3ZSBtaXNzZWRcIiBmcm9tIGEgbWFza2VkIGJ1ZyBpbnRvIGEgbG9nIGxpbmUgdGhlIGNhbGxlciBjYW4gYWN0IG9uLlxuICAgIGxldCBkZXN0SW5mbyA9IGF3YWl0IHRvLmdldEluZm8odG9QYXRoLCB7IG5vRmFsbGJhY2tzOiBjb25maWcubm9GYWxsYmFja3MgfSk7XG4gICAgaWYgKGRlc3RJbmZvICYmIGRlc3RJbmZvLndyaXRlVGltZSA+IHdyaXRlVGltZSkge1xuICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYFJlZnVzaW5nIHRvIGNvcHkgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gZnJvbSAke2Zyb20uZ2V0RGVidWdOYW1lKCl9IHRvICR7dG8uZ2V0RGVidWdOYW1lKCl9JHt0b1BhdGggIT09IHBhdGggJiYgYCAoYXMgJHtKU09OLnN0cmluZ2lmeSh0b1BhdGgpfSlgIHx8IFwiXCJ9OiB0aGUgZGVzdGluYXRpb24gYWxyZWFkeSBoYXMgYSBORVdFUiBmaWxlIChvdXJzOiAke3NpemV9IGJ5dGVzIGF0ICR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSwgdGhlaXJzOiAke2Rlc3RJbmZvLnNpemV9IGJ5dGVzIGF0ICR7bmV3IERhdGUoZGVzdEluZm8ud3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgLSBjb3B5aW5nIHdvdWxkIHJvbGwgaXQgYmFja2ApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgY29waWVkU2l6ZTogbnVtYmVyO1xuICAgIGlmIChzaXplIDw9IExBUkdFX0NPUFlfVEhSRVNIT0xEKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBmcm9tLmdldDIocGF0aCwgeyBpbnRlcm5hbDogY29uZmlnLmludGVybmFsLCBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgICAgICAvLyBFbXB0eSBjb3VudHMgYXMgYWJzZW50LCBuZXZlciBhcyBjb250ZW50IHRvIGNvcHk6IGFuIGVtcHR5IGZpbGUgSVMgYSBkZWxldGlvbiwgc2V0IHJlZnVzZXMgZW1wdHkgYnVmZmVycywgYW5kIGRlbGV0aW9ucyB0cmF2ZWwgdGhyb3VnaCB0aGVpciBvd24gcGF0aCAoZGVsIC8gc2NhbiB0b21ic3RvbmVzKVxuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0LmRhdGEgfHwgIXJlc3VsdC5kYXRhLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXdhaXQgdG8uc2V0KHRvUGF0aCwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsIGZvcmNlU2V0SW1tdXRhYmxlOiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUsIG5vQ2hlY2tzOiBjb25maWcubm9DaGVja3MsIGludGVybmFsOiBjb25maWcuaW50ZXJuYWwgfSk7XG4gICAgICAgIGNvcGllZFNpemUgPSByZXN1bHQuZGF0YS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ29uc3Qgc28gdGhlIGNsb3N1cmUga2VlcHMgdGhlIG5hcnJvd2VkIHR5cGVcbiAgICAgICAgY29uc3QgdG90YWxTaXplID0gc2l6ZTtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGF3YWl0IHRvLnNldExhcmdlRmlsZSh7XG4gICAgICAgICAgICBwYXRoOiB0b1BhdGgsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSxcbiAgICAgICAgICAgIGZvcmNlU2V0SW1tdXRhYmxlOiBjb25maWcuZm9yY2VTZXRJbW11dGFibGUsXG4gICAgICAgICAgICBub0NoZWNrczogY29uZmlnLm5vQ2hlY2tzLFxuICAgICAgICAgICAgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCxcbiAgICAgICAgICAgIHJlc3RhcnRTdHJlYW06ICgpID0+IHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldE5leHREYXRhOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSB0b3RhbFNpemUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGVuZCA9IE1hdGgubWluKG9mZnNldCArIExBUkdFX0NPUFlfQ0hVTkssIHRvdGFsU2l6ZSk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBmcm9tLmdldChwYXRoLCB7IHJhbmdlOiB7IHN0YXJ0OiBvZmZzZXQsIGVuZCB9LCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsLCBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZWQgcmVhZCBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBmcm9tICR7ZnJvbS5nZXREZWJ1Z05hbWUoKX0gcmV0dXJuZWQgJHtkYXRhICYmIGRhdGEubGVuZ3RoIHx8IFwibm90aGluZ1wifSBhdCAke29mZnNldH0tJHtlbmR9IChleHBlY3RlZCAke2VuZCAtIG9mZnNldH0gYnl0ZXMgb2YgYSAke3RvdGFsU2l6ZX0gYnl0ZSBmaWxlIC0gaXQgY2hhbmdlZCBvciB2YW5pc2hlZCBtaWQtY29weSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvcGllZFNpemUgPSB0b3RhbFNpemU7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGJhY2tlbmQgZHJvcHMgYSBzdXBlcnNlZGVkIHdyaXRlIFNJTEVOVExZIChpdHMgb25seS10YWtlLWxhdGVzdCBpcyB0aGUgbGFzdCBsaW5lIG9mIGRlZmVuc2UgYWdhaW5zdCByYWNlcyB0aGUgdXAtZnJvbnQgY2hlY2sgY2FuJ3Qgc2VlKSwgc28gYSByZXR1cm5lZCBzZXQgaXMgbm90IHByb29mIHRoZSBjb3B5IGxhbmRlZCAtIG9ubHkgdGhlIGRlc3RpbmF0aW9uIHJlcG9ydGluZyB0aGUgZmlsZSBhdCBPVVIgdGltZSBvciBuZXdlciBpcy4gTmV3ZXIgYWxzbyBjb3VudHMgYXMgbGFuZGVkOiB0aGUgZGVzdGluYXRpb24gaXMgYXQgbGVhc3QgYXMgbmV3IGFzIHdoYXQgd2UgcHVzaGVkIChhbmQgYjIgYWx3YXlzIHN0YW1wcyBpdHMgb3duLCBsYXRlciwgdXBsb2FkIHRpbWUpLlxuICAgIGxldCBjb25maXJtZWQgPSBhd2FpdCB0by5nZXRJbmZvKHRvUGF0aCwgeyBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgIGlmICghY29uZmlybWVkIHx8IGNvbmZpcm1lZC53cml0ZVRpbWUgPCB3cml0ZVRpbWUpIHtcbiAgICAgICAgbG9nU3RvcmFnZUVycm9yKGBDb3B5IG9mICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGZyb20gJHtmcm9tLmdldERlYnVnTmFtZSgpfSB0byAke3RvLmdldERlYnVnTmFtZSgpfSR7dG9QYXRoICE9PSBwYXRoICYmIGAgKGFzICR7SlNPTi5zdHJpbmdpZnkodG9QYXRoKX0pYCB8fCBcIlwifSBkaWQgbm90IGxhbmQ6IHdlIHdyb3RlICR7Y29waWVkU2l6ZX0gYnl0ZXMgYXQgJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9LCBidXQgdGhlIGRlc3RpbmF0aW9uIHJlcG9ydHMgJHtjb25maXJtZWQgJiYgYCR7Y29uZmlybWVkLnNpemV9IGJ5dGVzIGF0ICR7bmV3IERhdGUoY29uZmlybWVkLndyaXRlVGltZSkudG9JU09TdHJpbmcoKX1gIHx8IFwibm90aGluZ1wifSAtIGl0IGRyb3BwZWQgdGhlIHdyaXRlIChhIG5ld2VyIHdyaXRlIG9yIGRlbGV0aW9uIHdvbiB0aGUgcmFjZSlgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgd3JpdGVUaW1lLCBzaXplOiBjb3BpZWRTaXplIH07XG59XG5cbi8qKlxuICogTW92ZXMgb25lIGZpbGUgLSBiZXR3ZWVuIHR3byBhcmNoaXZlcywgb3IgYmV0d2VlbiB0d28gcGF0aHMgb2Ygb25lLiBXaGVuIGZyb20gYW5kIHRvIGFyZSB0aGUgU0FNRVxuICogYXJjaGl2ZXMgaW5zdGFuY2UgYW5kIGl0IGltcGxlbWVudHMgbW92ZSwgdGhlIGJhY2tlbmQgbW92ZXMgdGhlIGZpbGUgaXRzZWxmIChiYWNrYmxhemUgY29waWVzXG4gKiBzZXJ2ZXItc2lkZSwgZGlzayByZW5hbWVzLCB0aGUgc3RvcmFnZSBzZXJ2ZXIgcmVsb2NhdGVzIGl0IG5vZGUtc2lkZSkgYW5kIHRoZSBieXRlcyBuZXZlciB0cmF2ZWxcbiAqIHRocm91Z2ggdXMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyB0aGUgc2FmZSBmYWxsYmFjazogY29weSwgdGhlbiBDT05GSVJNIHRoZSBkZXN0aW5hdGlvbiBhY3R1YWxseVxuICogcmVwb3J0cyB0aGUgZmlsZSAoZ2V0SW5mbyksIGFuZCBvbmx5IHRoZW4gZGVsZXRlIHRoZSBzb3VyY2UgLSB0aGUgb25lIG9yZGVyIGluIHdoaWNoIG5vIGZhaWx1cmVcbiAqIGNhbiBsb3NlIHRoZSBmaWxlLCBvbmx5IGF0IHdvcnN0IGxlYXZlIGl0IGluIGJvdGggcGxhY2VzLiBUaHJvd3Mgd2hlbiB0aGUgc291cmNlIGRvZXNuJ3QgaGF2ZSB0aGVcbiAqIGZpbGUsIG9yIHdoZW4gdGhlIGNvcHkgY2Fubm90IGJlIGNvbmZpcm1lZCAodGhlIHNvdXJjZSBpcyB0aGVuIGxlZnQgdW50b3VjaGVkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1vdmVBcmNoaXZlRmlsZShjb25maWc6IHtcbiAgICBmcm9tOiBJQXJjaGl2ZXM7XG4gICAgdG86IElBcmNoaXZlcztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYXRoIGF0IHRoZSBkZXN0aW5hdGlvbiAtIGRlZmF1bHRzIHRvIHBhdGggKG1vdmluZyBiZXR3ZWVuIHR3byBhcmNoaXZlcykuIFJlcXVpcmVkIGluIHByYWN0aWNlIHdoZW4gZnJvbSBhbmQgdG8gYXJlIHRoZSBzYW1lIGFyY2hpdmVzLCB3aGVyZSB0aGUgc2FtZSBwYXRoIHdvdWxkIGJlIGEgbm8tb3AuICovXG4gICAgdG9QYXRoPzogc3RyaW5nO1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBmcm9tLCB0bywgcGF0aCB9ID0gY29uZmlnO1xuICAgIGxldCB0b1BhdGggPSBjb25maWcudG9QYXRoIHx8IHBhdGg7XG4gICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgIGlmIChwYXRoID09PSB0b1BhdGgpIHJldHVybjtcbiAgICAgICAgaWYgKGZyb20ubW92ZSkge1xuICAgICAgICAgICAgYXdhaXQgZnJvbS5tb3ZlKHsgZnJvbVBhdGg6IHBhdGgsIHRvUGF0aCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29waWVkID0gYXdhaXQgY29weUFyY2hpdmVGaWxlKHsgZnJvbSwgdG8sIHBhdGgsIHRvUGF0aCwgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICBpZiAoIWNvcGllZCkge1xuICAgICAgICAvLyBVbmRlZmluZWQgaXMgdHdvIGNhc2VzIChzZWUgY29weUFyY2hpdmVGaWxlKSAtIGFza2luZyB0aGUgc291cmNlIHdoaWNoIG9uZSBrZWVwcyB0aGUgZXJyb3IgaG9uZXN0XG4gICAgICAgIGxldCBzb3VyY2VJbmZvID0gYXdhaXQgZnJvbS5nZXRJbmZvKHBhdGgsIHsgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICAgICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gKCR7c291cmNlSW5mby5zaXplfSBieXRlcyBhdCAke25ldyBEYXRlKHNvdXJjZUluZm8ud3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgZnJvbSAke2Zyb20uZ2V0RGVidWdOYW1lKCl9OiAke3RvLmdldERlYnVnTmFtZSgpfSBhbHJlYWR5IGhhcyBhIG5ld2VyIGZpbGUgYXQgJHtKU09OLnN0cmluZ2lmeSh0b1BhdGgpfSwgYW5kIHRoZSBjb3B5IHdhcyByZWZ1c2VkIHJhdGhlciB0aGFuIHJvbGwgaXQgYmFjayAtIHRoZSBzb3VyY2UgaXMgbGVmdCB1bnRvdWNoZWRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtb3ZlICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9OiAke2Zyb20uZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IGhhdmUgaXRgKTtcbiAgICB9XG4gICAgbGV0IGNvbmZpcm1lZCA9IGF3YWl0IHRvLmdldEluZm8odG9QYXRoLCB7IG5vRmFsbGJhY2tzOiBjb25maWcubm9GYWxsYmFja3MgfSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgZGVsZXRpbmcgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gZnJvbSAke2Zyb20uZ2V0RGVidWdOYW1lKCl9IGFmdGVyIGNvcHlpbmcgaXQ6ICR7dG8uZ2V0RGVidWdOYW1lKCl9IGRvZXMgbm90IHJlcG9ydCAke0pTT04uc3RyaW5naWZ5KHRvUGF0aCl9ICh0aGUgY29weSBjbGFpbWVkIHRvIHN1Y2NlZWQsIHNvIHNvbWV0aGluZyBpcyB3cm9uZyAtIHRoZSBmaWxlIGlzIGxlZnQgYXQgdGhlIHNvdXJjZSlgKTtcbiAgICB9XG4gICAgYXdhaXQgZnJvbS5kZWwocGF0aCk7XG59XG4iXX0=
|
|
106
|
-
/* _JS_SOURCE_HASH = "
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZUhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhcmNoaXZlSGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxrRUFBK0U7QUFDL0UsNkRBQThEO0FBRTlELCtKQUErSjtBQUUvSixNQUFNLG9CQUFvQixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFMUMsdThCQUF1OEI7QUFDaDhCLEtBQUssVUFBVSxlQUFlLENBQUMsTUFVckM7SUFDRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDaEMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7SUFDbkMsSUFBSSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN6RSxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIseWFBQXlhO0lBQ3phLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLDBWQUEwVjtJQUMxVixJQUFJLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLGlQQUFpUDtJQUNqUCxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FB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LENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2hJLENBQUM7SUFDRCxJQUFJLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsdUVBQXVFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUNyUixDQUFDO0lBQ0QsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUEvQkQsMENBK0JDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVHlwZS1vbmx5OiBJQXJjaGl2ZXMudHMgcmUtZXhwb3J0cyBvdXIgZnVuY3Rpb25zLCBzbyBhIHZhbHVlIGltcG9ydCBiYWNrIGF0IGl0IHdvdWxkIGJlIGEgcmVxdWlyZSBjeWNsZVxuaW1wb3J0IHR5cGUgeyBJQXJjaGl2ZXMgfSBmcm9tIFwiLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IGZvcm1hdERhdGVUaW1lRGV0YWlsZWQgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgbG9nU3RvcmFnZUVycm9yIH0gZnJvbSBcIi4vcmVtb3RlU3RvcmFnZS9zdG9yYWdlTG9nc1wiO1xuXG4vLyBDcm9zcy1hcmNoaXZlIGZpbGUgb3BlcmF0aW9ucyBidWlsdCBPTiBUT1Agb2YgSUFyY2hpdmVzIChjb3B5LCBtb3ZlKSAtIGhlbHBlcnMgb3ZlciB0aGUgaW50ZXJmYWNlLCBub3QgcGFydCBvZiBpdCwgc28gdGhleSBsaXZlIGJlc2lkZSBpdCByYXRoZXIgdGhhbiBpbiBpdC5cblxuY29uc3QgTEFSR0VfQ09QWV9USFJFU0hPTEQgPSA2NCAqIDEwMjQgKiAxMDI0O1xuY29uc3QgTEFSR0VfQ09QWV9DSFVOSyA9IDMyICogMTAyNCAqIDEwMjQ7XG5cbi8qKiBDb3BpZXMgb25lIGZpbGUgYmV0d2VlbiB0d28gYXJjaGl2ZXMuIFRoZSBzb3VyY2UncyBDVVJSRU5UIHNpemUgYW5kIHdyaXRlIHRpbWUgYWx3YXlzIGNvbWUgZnJvbSBnZXRJbmZvIHJpZ2h0IGhlcmUgLSBjYWxsZXJzIG5ldmVyIHN1cHBseSB0aGVtLCBiZWNhdXNlIGEgc3RhbGUgc2l6ZSB0dXJucyBpbnRvIHJhbmdlZCByZWFkcyBvZiBhIGZpbGUgdGhhdCBoYXMgY2hhbmdlZCAoZmFpbGluZyBmb3JldmVyKSwgYW5kIGEgc3RhbGUgd3JpdGUgdGltZSByZS1vcmRlcnMgaGlzdG9yeS4gU21hbGwgZmlsZXMgZ28gYXMgYSBzaW5nbGUgZ2V0MitzZXQ7IHBhc3QgTEFSR0VfQ09QWV9USFJFU0hPTEQgdGhlIGNvcHkgc3RyZWFtcyB0aHJvdWdoIHNldExhcmdlRmlsZSBpbiBMQVJHRV9DT1BZX0NIVU5LIHJhbmdlZCByZWFkcywgc28gdGhlIHdob2xlIGZpbGUgaXMgbmV2ZXIgaW4gbWVtb3J5LiBSZXR1cm5zIHRoZSBjb3BpZWQgZmlsZSdzIGluZm8sIGFuZCB1bmRlZmluZWQgZm9yIGV2ZXJ5IHdheSB0aGUgY29weSBkaWQgTk9UIGxhbmQ6IHRoZSBzb3VyY2UgZG9lc24ndCBoYXZlIHRoZSBmaWxlLCB0aGUgZGVzdGluYXRpb24gYWxyZWFkeSBoYWQgYSBORVdFUiBmaWxlIChyZWZ1c2VkIHVwIGZyb250IHJhdGhlciB0aGFuIHJvbGwgaXQgYmFjayksIG9yIHRoZSBkZXN0aW5hdGlvbiBzaWxlbnRseSBkcm9wcGVkIHRoZSB3cml0ZSAoaXRzIG93biBvbmx5LXRha2UtbGF0ZXN0IHdvbiBhIHJhY2Ugd2UgbG9zdCAtIGNhdWdodCBieSBjb25maXJtaW5nIHdpdGggZ2V0SW5mbyBhZnRlcndhcmQpLiBUaGUgcmVmdXNlZC9kcm9wcGVkIGNhc2VzIGFyZSBsb2dnZWQgYXMgZXJyb3JzOyBhIGNhbGxlciB0aGF0IHRyZWF0cyB1bmRlZmluZWQgYXMgXCJtaXNzaW5nIGF0IHRoZSBzb3VyY2VcIiBtdXN0IGdldEluZm8gdGhlIGRlc3RpbmF0aW9uIHRvIGxlYXJuIHRoZSBhY3R1YWwgbGF0ZXN0IHZhbHVlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlBcmNoaXZlRmlsZShjb25maWc6IHtcbiAgICBmcm9tOiBJQXJjaGl2ZXM7XG4gICAgdG86IElBcmNoaXZlcztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYXRoIGF0IHRoZSBkZXN0aW5hdGlvbiAtIGRlZmF1bHRzIHRvIHBhdGggKHRoZSBjb21tb24gY2FzZTogdGhlIHNhbWUga2V5IG1vdmluZyBiZXR3ZWVuIHR3byBhcmNoaXZlcykuICovXG4gICAgdG9QYXRoPzogc3RyaW5nO1xuICAgIGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICBub0NoZWNrcz86IGJvb2xlYW47XG4gICAgaW50ZXJuYWw/OiBib29sZWFuO1xuICAgIG5vRmFsbGJhY2tzPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHsgZnJvbSwgdG8sIHBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgdG9QYXRoID0gY29uZmlnLnRvUGF0aCB8fCBwYXRoO1xuICAgIGxldCBpbmZvID0gYXdhaXQgZnJvbS5nZXRJbmZvKHBhdGgsIHsgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICBpZiAoIWluZm8pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbGV0IHNpemUgPSBpbmZvLnNpemU7XG4gICAgLy8gaW50ZXJuYWwgKHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHJlcGxpY2FzIG9mIHRoZSBzYW1lIGtleSkgcHJlc2VydmVzIHRoZSBzb3VyY2UncyB3cml0ZSB0aW1lLCBzbyBvcmRlcmluZyBzdXJ2aXZlcyBwcm9wYWdhdGlvbi4gQSBwbGFpbiBjb3B5IGlzIGEgTkVXIHdyaXRlIGFuZCBpcyBzdGFtcGVkIG5vdzogdGhlIHNvdXJjZSdzIG9sZCBzdGFtcCB3b3VsZCBtYWtlIGl0IExPU0UgdG8gYW55IG5ld2VyIHdyaXRlIG9yIHRvbWJzdG9uZSBhdCB0aGUgZGVzdGluYXRpb24sIHNpbGVudGx5IC0gbW92ZSBhIGZpbGUgYmFjayB0byBhIGZvbGRlciBpdCB3YXMgZGVsZXRlZCBmcm9tIGFuZCB0aGUgY29weSBpcyBkcm9wcGVkLCB0aGVuIHRoZSBjYWxsZXIgZGVsZXRlcyB0aGUgc291cmNlLCBhbmQgdGhlIGZpbGUgaXMgZ29uZSBlbnRpcmVseS5cbiAgICBsZXQgd3JpdGVUaW1lID0gTWF0aC5mbG9vcihjb25maWcuaW50ZXJuYWwgJiYgaW5mby53cml0ZVRpbWUgfHwgRGF0ZS5ub3coKSk7XG4gICAgLy8gQSBkZXN0aW5hdGlvbiB0aGF0IGFscmVhZHkgaG9sZHMgYSBORVdFUiBmaWxlIG11c3Qgbm90IGJlIG92ZXJ3cml0dGVuIHdpdGggb3VyIG9sZGVyIG9uZSAtIGFuZCB0aGUgZGVzdGluYXRpb24ncyBvd24gb25seS10YWtlLWxhdGVzdCB3b3VsZCBkcm9wIHRoZSB3cml0ZSBTSUxFTlRMWSwgbGVhdmluZyB0aGUgY2FsbGVyIGJlbGlldmluZyB0aGUgY29weSBoYXBwZW5lZC4gUmVmdXNpbmcgaGVyZSwgbG91ZGx5LCBpcyB3aGF0IHR1cm5zIFwidGhlIHJlbW90ZSBoYXMgc29tZXRoaW5nIHdlIG1pc3NlZFwiIGZyb20gYSBtYXNrZWQgYnVnIGludG8gYSBsb2cgbGluZSB0aGUgY2FsbGVyIGNhbiBhY3Qgb24uXG4gICAgbGV0IGRlc3RJbmZvID0gYXdhaXQgdG8uZ2V0SW5mbyh0b1BhdGgsIHsgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICAvLyBDb21wYXJlZCBhdCB3aG9sZS1taWxsaXNlY29uZCBwcmVjaXNpb24sIGhlcmUgYW5kIGF0IHRoZSBjb25maXJtIGJlbG93OiBkaXNrIG10aW1lcyBjYXJyeSBmcmFjdGlvbmFsIG1pbGxpc2Vjb25kcywgYnV0IHV0aW1lcyByb3VuZC10cmlwcyBvbmx5IHdob2xlIG9uZXMsIHNvIHN1Yi1taWxsaXNlY29uZCBkaWZmZXJlbmNlcyBhcmUgc3RvcmFnZSBhcnRpZmFjdHMgb2YgdGhlIFNBTUUgdGltZSwgbm90IG9yZGVyaW5nXG4gICAgaWYgKGRlc3RJbmZvICYmIE1hdGguZmxvb3IoZGVzdEluZm8ud3JpdGVUaW1lKSA+IE1hdGguZmxvb3Iod3JpdGVUaW1lKSkge1xuICAgICAgICBsb2dTdG9yYWdlRXJyb3IoYENvcHkgcmVmdXNlZCAtIGEgbmV3ZXIgZmlsZSBleGlzdHMgYXQgdGhlIGRlc3RpbmF0aW9uLiBSZWZ1c2luZyB0byBjb3B5ICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGZyb20gJHtmcm9tLmdldERlYnVnTmFtZSgpfSB0byAke3RvLmdldERlYnVnTmFtZSgpfSR7dG9QYXRoICE9PSBwYXRoICYmIGAgKGFzICR7SlNPTi5zdHJpbmdpZnkodG9QYXRoKX0pYCB8fCBcIlwifTogb3VycyAke3NpemV9IGJ5dGVzIGF0ICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSwgdGhlaXJzICR7ZGVzdEluZm8uc2l6ZX0gYnl0ZXMgYXQgJHtmb3JtYXREYXRlVGltZURldGFpbGVkKGRlc3RJbmZvLndyaXRlVGltZSl9IC0gY29weWluZyB3b3VsZCByb2xsIGl0IGJhY2tgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV0IGNvcGllZFNpemU6IG51bWJlcjtcbiAgICBpZiAoc2l6ZSA8PSBMQVJHRV9DT1BZX1RIUkVTSE9MRCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZnJvbS5nZXQyKHBhdGgsIHsgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCwgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICAgICAgLy8gRW1wdHkgY291bnRzIGFzIGFic2VudCwgbmV2ZXIgYXMgY29udGVudCB0byBjb3B5OiBhbiBlbXB0eSBmaWxlIElTIGEgZGVsZXRpb24sIHNldCByZWZ1c2VzIGVtcHR5IGJ1ZmZlcnMsIGFuZCBkZWxldGlvbnMgdHJhdmVsIHRocm91Z2ggdGhlaXIgb3duIHBhdGggKGRlbCAvIHNjYW4gdG9tYnN0b25lcylcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5kYXRhIHx8ICFyZXN1bHQuZGF0YS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGF3YWl0IHRvLnNldCh0b1BhdGgsIHJlc3VsdC5kYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlLCBub0NoZWNrczogY29uZmlnLm5vQ2hlY2tzLCBpbnRlcm5hbDogY29uZmlnLmludGVybmFsIH0pO1xuICAgICAgICBjb3BpZWRTaXplID0gcmVzdWx0LmRhdGEubGVuZ3RoO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENvbnN0IHNvIHRoZSBjbG9zdXJlIGtlZXBzIHRoZSBuYXJyb3dlZCB0eXBlXG4gICAgICAgIGNvbnN0IHRvdGFsU2l6ZSA9IHNpemU7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBhd2FpdCB0by5zZXRMYXJnZUZpbGUoe1xuICAgICAgICAgICAgcGF0aDogdG9QYXRoLFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUsXG4gICAgICAgICAgICBmb3JjZVNldEltbXV0YWJsZTogY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlLFxuICAgICAgICAgICAgbm9DaGVja3M6IGNvbmZpZy5ub0NoZWNrcyxcbiAgICAgICAgICAgIGludGVybmFsOiBjb25maWcuaW50ZXJuYWwsXG4gICAgICAgICAgICByZXN0YXJ0U3RyZWFtOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXROZXh0RGF0YTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gdG90YWxTaXplKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBNYXRoLm1pbihvZmZzZXQgKyBMQVJHRV9DT1BZX0NIVU5LLCB0b3RhbFNpemUpO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZnJvbS5nZXQocGF0aCwgeyByYW5nZTogeyBzdGFydDogb2Zmc2V0LCBlbmQgfSwgaW50ZXJuYWw6IGNvbmZpZy5pbnRlcm5hbCwgbm9GYWxsYmFja3M6IGNvbmZpZy5ub0ZhbGxiYWNrcyB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2VkIHJlYWQgcmV0dXJuZWQgbm90aGluZyBtaWQtY29weS4gUmVhZGluZyAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBmcm9tICR7ZnJvbS5nZXREZWJ1Z05hbWUoKX0gcmV0dXJuZWQgJHtkYXRhICYmIGRhdGEubGVuZ3RoIHx8IFwibm90aGluZ1wifSBhdCAke29mZnNldH0tJHtlbmR9IChleHBlY3RlZCAke2VuZCAtIG9mZnNldH0gYnl0ZXMgb2YgYSAke3RvdGFsU2l6ZX0gYnl0ZSBmaWxlIC0gaXQgY2hhbmdlZCBvciB2YW5pc2hlZCBtaWQtY29weSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvcGllZFNpemUgPSB0b3RhbFNpemU7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGJhY2tlbmQgZHJvcHMgYSBzdXBlcnNlZGVkIHdyaXRlIFNJTEVOVExZIChpdHMgb25seS10YWtlLWxhdGVzdCBpcyB0aGUgbGFzdCBsaW5lIG9mIGRlZmVuc2UgYWdhaW5zdCByYWNlcyB0aGUgdXAtZnJvbnQgY2hlY2sgY2FuJ3Qgc2VlKSwgc28gYSByZXR1cm5lZCBzZXQgaXMgbm90IHByb29mIHRoZSBjb3B5IGxhbmRlZCAtIG9ubHkgdGhlIGRlc3RpbmF0aW9uIHJlcG9ydGluZyB0aGUgZmlsZSBhdCBPVVIgdGltZSBvciBuZXdlciBpcy4gTmV3ZXIgYWxzbyBjb3VudHMgYXMgbGFuZGVkOiB0aGUgZGVzdGluYXRpb24gaXMgYXQgbGVhc3QgYXMgbmV3IGFzIHdoYXQgd2UgcHVzaGVkIChhbmQgYjIgYWx3YXlzIHN0YW1wcyBpdHMgb3duLCBsYXRlciwgdXBsb2FkIHRpbWUpLlxuICAgIGxldCBjb25maXJtZWQgPSBhd2FpdCB0by5nZXRJbmZvKHRvUGF0aCwgeyBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgIGlmICghY29uZmlybWVkIHx8IE1hdGguZmxvb3IoY29uZmlybWVkLndyaXRlVGltZSkgPCBNYXRoLmZsb29yKHdyaXRlVGltZSkpIHtcbiAgICAgICAgbG9nU3RvcmFnZUVycm9yKGBDb3B5IHdhcyBzaWxlbnRseSBkcm9wcGVkIGJ5IHRoZSBkZXN0aW5hdGlvbi4gQ29weSBvZiAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBmcm9tICR7ZnJvbS5nZXREZWJ1Z05hbWUoKX0gdG8gJHt0by5nZXREZWJ1Z05hbWUoKX0ke3RvUGF0aCAhPT0gcGF0aCAmJiBgIChhcyAke0pTT04uc3RyaW5naWZ5KHRvUGF0aCl9KWAgfHwgXCJcIn06IG91ciBjb3B5IHdhcyAke2NvcGllZFNpemV9IGJ5dGVzIGF0ICR7Zm9ybWF0RGF0ZVRpbWVEZXRhaWxlZCh3cml0ZVRpbWUpfSwgYnV0IHRoZSBkZXN0aW5hdGlvbiByZXBvcnRzICR7Y29uZmlybWVkICYmIGAke2NvbmZpcm1lZC5zaXplfSBieXRlcyBhdCAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQoY29uZmlybWVkLndyaXRlVGltZSl9YCB8fCBcIm5vdGhpbmdcIn0gKGEgbmV3ZXIgd3JpdGUgb3IgZGVsZXRpb24gd29uIHRoZSByYWNlKWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4geyB3cml0ZVRpbWUsIHNpemU6IGNvcGllZFNpemUgfTtcbn1cblxuLyoqXG4gKiBNb3ZlcyBvbmUgZmlsZSAtIGJldHdlZW4gdHdvIGFyY2hpdmVzLCBvciBiZXR3ZWVuIHR3byBwYXRocyBvZiBvbmUuIFdoZW4gZnJvbSBhbmQgdG8gYXJlIHRoZSBTQU1FXG4gKiBhcmNoaXZlcyBpbnN0YW5jZSBhbmQgaXQgaW1wbGVtZW50cyBtb3ZlLCB0aGUgYmFja2VuZCBtb3ZlcyB0aGUgZmlsZSBpdHNlbGYgKGJhY2tibGF6ZSBjb3BpZXNcbiAqIHNlcnZlci1zaWRlLCBkaXNrIHJlbmFtZXMsIHRoZSBzdG9yYWdlIHNlcnZlciByZWxvY2F0ZXMgaXQgbm9kZS1zaWRlKSBhbmQgdGhlIGJ5dGVzIG5ldmVyIHRyYXZlbFxuICogdGhyb3VnaCB1cy4gRXZlcnl0aGluZyBlbHNlIGlzIHRoZSBzYWZlIGZhbGxiYWNrOiBjb3B5LCB0aGVuIENPTkZJUk0gdGhlIGRlc3RpbmF0aW9uIGFjdHVhbGx5XG4gKiByZXBvcnRzIHRoZSBmaWxlIChnZXRJbmZvKSwgYW5kIG9ubHkgdGhlbiBkZWxldGUgdGhlIHNvdXJjZSAtIHRoZSBvbmUgb3JkZXIgaW4gd2hpY2ggbm8gZmFpbHVyZVxuICogY2FuIGxvc2UgdGhlIGZpbGUsIG9ubHkgYXQgd29yc3QgbGVhdmUgaXQgaW4gYm90aCBwbGFjZXMuIFRocm93cyB3aGVuIHRoZSBzb3VyY2UgZG9lc24ndCBoYXZlIHRoZVxuICogZmlsZSwgb3Igd2hlbiB0aGUgY29weSBjYW5ub3QgYmUgY29uZmlybWVkICh0aGUgc291cmNlIGlzIHRoZW4gbGVmdCB1bnRvdWNoZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbW92ZUFyY2hpdmVGaWxlKGNvbmZpZzoge1xuICAgIGZyb206IElBcmNoaXZlcztcbiAgICB0bzogSUFyY2hpdmVzO1xuICAgIHBhdGg6IHN0cmluZztcbiAgICAvKiogVGhlIHBhdGggYXQgdGhlIGRlc3RpbmF0aW9uIC0gZGVmYXVsdHMgdG8gcGF0aCAobW92aW5nIGJldHdlZW4gdHdvIGFyY2hpdmVzKS4gUmVxdWlyZWQgaW4gcHJhY3RpY2Ugd2hlbiBmcm9tIGFuZCB0byBhcmUgdGhlIHNhbWUgYXJjaGl2ZXMsIHdoZXJlIHRoZSBzYW1lIHBhdGggd291bGQgYmUgYSBuby1vcC4gKi9cbiAgICB0b1BhdGg/OiBzdHJpbmc7XG4gICAgbm9GYWxsYmFja3M/OiBib29sZWFuO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB7IGZyb20sIHRvLCBwYXRoIH0gPSBjb25maWc7XG4gICAgbGV0IHRvUGF0aCA9IGNvbmZpZy50b1BhdGggfHwgcGF0aDtcbiAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgaWYgKHBhdGggPT09IHRvUGF0aCkgcmV0dXJuO1xuICAgICAgICBpZiAoZnJvbS5tb3ZlKSB7XG4gICAgICAgICAgICBhd2FpdCBmcm9tLm1vdmUoeyBmcm9tUGF0aDogcGF0aCwgdG9QYXRoIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb3BpZWQgPSBhd2FpdCBjb3B5QXJjaGl2ZUZpbGUoeyBmcm9tLCB0bywgcGF0aCwgdG9QYXRoLCBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgIGlmICghY29waWVkKSB7XG4gICAgICAgIC8vIFVuZGVmaW5lZCBpcyB0d28gY2FzZXMgKHNlZSBjb3B5QXJjaGl2ZUZpbGUpIC0gYXNraW5nIHRoZSBzb3VyY2Ugd2hpY2ggb25lIGtlZXBzIHRoZSBlcnJvciBob25lc3RcbiAgICAgICAgbGV0IHNvdXJjZUluZm8gPSBhd2FpdCBmcm9tLmdldEluZm8ocGF0aCwgeyBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgICAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3ZlIHJlZnVzZWQgLSBhIG5ld2VyIGZpbGUgZXhpc3RzIGF0IHRoZSBkZXN0aW5hdGlvbi4gQ2Fubm90IG1vdmUgJHtKU09OLnN0cmluZ2lmeShwYXRoKX0gKCR7c291cmNlSW5mby5zaXplfSBieXRlcyBhdCAke2Zvcm1hdERhdGVUaW1lRGV0YWlsZWQoc291cmNlSW5mby53cml0ZVRpbWUpfSkgZnJvbSAke2Zyb20uZ2V0RGVidWdOYW1lKCl9OiAke3RvLmdldERlYnVnTmFtZSgpfSBob2xkcyBzb21ldGhpbmcgbmV3ZXIgYXQgJHtKU09OLnN0cmluZ2lmeSh0b1BhdGgpfSwgYW5kIHRoZSBjb3B5IHdhcyByZWZ1c2VkIHJhdGhlciB0aGFuIHJvbGwgaXQgYmFjayAtIHRoZSBzb3VyY2UgaXMgbGVmdCB1bnRvdWNoZWRgKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vdmUgc291cmNlIGRvZXMgbm90IGV4aXN0LiBDYW5ub3QgbW92ZSAke0pTT04uc3RyaW5naWZ5KHBhdGgpfTogJHtmcm9tLmdldERlYnVnTmFtZSgpfSBkb2VzIG5vdCBoYXZlIGl0YCk7XG4gICAgfVxuICAgIGxldCBjb25maXJtZWQgPSBhd2FpdCB0by5nZXRJbmZvKHRvUGF0aCwgeyBub0ZhbGxiYWNrczogY29uZmlnLm5vRmFsbGJhY2tzIH0pO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW92ZSBjb3B5IGNvdWxkIG5vdCBiZSBjb25maXJtZWQgLSB0aGUgc291cmNlIGlzIGtlcHQuIE5vdCBkZWxldGluZyAke0pTT04uc3RyaW5naWZ5KHBhdGgpfSBmcm9tICR7ZnJvbS5nZXREZWJ1Z05hbWUoKX0gYWZ0ZXIgY29weWluZyBpdDogJHt0by5nZXREZWJ1Z05hbWUoKX0gZG9lcyBub3QgcmVwb3J0ICR7SlNPTi5zdHJpbmdpZnkodG9QYXRoKX0gKHRoZSBjb3B5IGNsYWltZWQgdG8gc3VjY2VlZCwgc28gc29tZXRoaW5nIGlzIHdyb25nKWApO1xuICAgIH1cbiAgICBhd2FpdCBmcm9tLmRlbChwYXRoKTtcbn1cbiJdfQ==
|
|
108
|
+
/* _JS_SOURCE_HASH = "277836fc71ac37c02353ae0fba3d85636b575e4b47c024e0905a1979795b465e"; */
|