sliftutils 1.7.67 → 1.7.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/test.ts.cache +3 -3
  2. package/index.d.ts +68 -14
  3. package/package.json +1 -1
  4. package/storage/ArchivesDisk.d.ts +2 -2
  5. package/storage/ArchivesDisk.ts +8 -4
  6. package/storage/IArchives.d.ts +15 -2
  7. package/storage/IArchives.ts +19 -3
  8. package/storage/backblaze.d.ts +2 -2
  9. package/storage/backblaze.ts +20 -3
  10. package/storage/dist/ArchivesDisk.ts.cache +2 -2
  11. package/storage/dist/IArchives.ts.cache +3 -3
  12. package/storage/dist/backblaze.ts.cache +2 -2
  13. package/storage/remoteStorage/ArchivesRemote.d.ts +2 -2
  14. package/storage/remoteStorage/ArchivesRemote.ts +3 -3
  15. package/storage/remoteStorage/accessStats.d.ts +25 -0
  16. package/storage/remoteStorage/accessStats.ts +86 -0
  17. package/storage/remoteStorage/blobStore.d.ts +1 -0
  18. package/storage/remoteStorage/blobStore.ts +31 -12
  19. package/storage/remoteStorage/createArchives.d.ts +2 -2
  20. package/storage/remoteStorage/createArchives.ts +6 -3
  21. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +2 -2
  22. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +2 -2
  23. package/storage/remoteStorage/dist/accessStats.ts.cache +78 -0
  24. package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
  25. package/storage/remoteStorage/dist/createArchives.ts.cache +2 -2
  26. package/storage/remoteStorage/dist/storageController.ts.cache +51 -14
  27. package/storage/remoteStorage/dist/storageServerState.ts.cache +25 -74
  28. package/storage/remoteStorage/storageController.d.ts +9 -1
  29. package/storage/remoteStorage/storageController.ts +52 -11
  30. package/storage/remoteStorage/storageServerState.d.ts +6 -3
  31. package/storage/remoteStorage/storageServerState.ts +46 -73
  32. package/test.ts +1 -1
  33. package/treeSummary.d.ts +31 -0
@@ -1,4 +1,4 @@
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";
1
+ "use strict";
2
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
@@ -86,78 +86,34 @@ exports.getRequests = getRequests;
86
86
  function emptyWriteStats() {
87
87
  return { originalWrites: 0, originalBytes: 0, flushedWrites: 0, flushedBytes: 0 };
88
88
  }
89
- function addWriteStats(a, b) {
90
- return {
91
- originalWrites: a.originalWrites + b.originalWrites,
92
- originalBytes: a.originalBytes + b.originalBytes,
93
- flushedWrites: a.flushedWrites + b.flushedWrites,
94
- flushedBytes: a.flushedBytes + b.flushedBytes,
95
- };
96
- }
97
- function getWriteStatsStorage() {
98
- return getSystemStorage("writeStats");
99
- }
100
- // Counted in memory as deltas since the last flush, so counting a write never touches the disk. The flush reads the stored totals and adds the delta, which also makes it correct across restarts.
101
- const writeStatDeltas = new Map();
102
- async function flushWriteStats() {
103
- var _a;
104
- if (!writeStatDeltas.size)
105
- return;
106
- let pending = [...writeStatDeltas];
107
- writeStatDeltas.clear();
108
- let storage = await getWriteStatsStorage();
109
- for (let [key, delta] of pending) {
110
- try {
111
- await storage.set(key, addWriteStats(await storage.get(key) || emptyWriteStats(), delta));
112
- }
113
- catch (e) {
114
- // Put the delta back, so a failed flush loses nothing
115
- writeStatDeltas.set(key, addWriteStats(writeStatDeltas.get(key) || emptyWriteStats(), delta));
116
- console.error(`Flushing write stats for bucket ${key} failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
117
- }
118
- }
119
- }
120
- const startWriteStatsFlushing = (0, caching_1.lazy)(() => {
121
- (0, batching_1.runInfinitePoll)(WRITE_STATS_FLUSH_INTERVAL, flushWriteStats);
122
- });
89
+ // In memory only: totals since this process started (or the last clearWriteStats). Persisting them to disk was more machinery than the numbers were worth.
90
+ const writeStats = new Map();
123
91
  function countBucketWrite(key, kind, bytes) {
124
- let delta = writeStatDeltas.get(key);
125
- if (!delta) {
126
- delta = emptyWriteStats();
127
- writeStatDeltas.set(key, delta);
92
+ let stats = writeStats.get(key);
93
+ if (!stats) {
94
+ stats = emptyWriteStats();
95
+ writeStats.set(key, stats);
128
96
  }
129
97
  if (kind === "original") {
130
- delta.originalWrites++;
131
- delta.originalBytes += bytes;
98
+ stats.originalWrites++;
99
+ stats.originalBytes += bytes;
132
100
  }
133
101
  else {
134
- delta.flushedWrites++;
135
- delta.flushedBytes += bytes;
102
+ stats.flushedWrites++;
103
+ stats.flushedBytes += bytes;
136
104
  }
137
- startWriteStatsFlushing();
138
105
  }
139
- async function getBucketWriteStats(key) {
140
- let storage = await getWriteStatsStorage();
141
- let stored = await storage.get(key) || emptyWriteStats();
142
- let delta = writeStatDeltas.get(key);
143
- return delta && addWriteStats(stored, delta) || stored;
106
+ function getBucketWriteStats(key) {
107
+ return writeStats.get(key) || emptyWriteStats();
144
108
  }
145
- /** Zeroes the write statistics of every bucket in the account, including counts not yet flushed. */
146
- async function clearAccountWriteStats(account) {
147
- let storage = await getWriteStatsStorage();
109
+ /** Zeroes the write statistics of every bucket in the account. */
110
+ function clearAccountWriteStats(account) {
148
111
  let prefix = `${account}/`;
149
112
  let cleared = 0;
150
- for (let key of await storage.getKeys()) {
113
+ for (let key of [...writeStats.keys()]) {
151
114
  if (!key.startsWith(prefix))
152
115
  continue;
153
- writeStatDeltas.delete(key);
154
- await storage.remove(key);
155
- cleared++;
156
- }
157
- for (let key of [...writeStatDeltas.keys()]) {
158
- if (!key.startsWith(prefix))
159
- continue;
160
- writeStatDeltas.delete(key);
116
+ writeStats.delete(key);
161
117
  cleared++;
162
118
  }
163
119
  console.log(`Cleared the write statistics of ${cleared} buckets in account ${account}`);
@@ -188,7 +144,6 @@ exports.setTrustedMachines = setTrustedMachines;
188
144
  const buckets = new Map();
189
145
  const MAX_REBUILD_TIMER_DELAY = 2 ** 31 - 1;
190
146
  const REBUILD_BOUNDARY_BUFFER = 1000;
191
- const WRITE_STATS_FLUSH_INTERVAL = 5 * 60 * 1000;
192
147
  function getBucketFolder(account, bucketName) {
193
148
  return path_1.default.join(getStorageServerConfig().folder, "buckets2", account, bucketName);
194
149
  }
@@ -1045,16 +1000,12 @@ async function listAccountBuckets(account) {
1045
1000
  let key = `${account}/${bucketName}`;
1046
1001
  let folder = getBucketFolder(account, bucketName);
1047
1002
  let base = { bucketName, active: false, folder };
1048
- let [disk, writeStats] = await Promise.all([
1049
- timed("statfs", () => getDiskInfo(folder)).catch((e) => {
1050
- var _a;
1051
- base.diskError = String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 500);
1052
- return undefined;
1053
- }),
1054
- timed("writeStats", () => getBucketWriteStats(key)),
1055
- ]);
1056
- base.disk = disk;
1057
- base.writeStats = writeStats;
1003
+ base.disk = await timed("statfs", () => getDiskInfo(folder)).catch((e) => {
1004
+ var _a;
1005
+ base.diskError = String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 500);
1006
+ return undefined;
1007
+ });
1008
+ base.writeStats = getBucketWriteStats(key);
1058
1009
  const loadedPromise = buckets.get(key);
1059
1010
  if (loadedPromise) {
1060
1011
  try {
@@ -1208,5 +1159,5 @@ function getLocalArchives(account, bucketName) {
1208
1159
  return archives;
1209
1160
  }
1210
1161
  exports.getLocalArchives = getLocalArchives;
1211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIseURBQW1EO0FBQ25ELG1EQUFnRDtBQUNoRCwyREFBK0Q7QUFDL0Qsb0RBQXlEO0FBQ3pELDhEQUEyRDtBQUMzRCxnREFBNkM7QUFDN0Msa0RBQStDO0FBQy9DLDJDQUF5RztBQUN6Ryw0Q0FJc0I7QUFDdEIsaURBQTBOO0FBQzFOLCtEQUFzTDtBQUN0TCxxREFBMkQ7QUFDM0QscURBQWlGO0FBRWpGLDJEQUE4RDtBQUU5RCx1Q0FBbUM7QUFXbkMsSUFBSSxNQUF1QyxDQUFDO0FBQzVDLFNBQWdCLHNCQUFzQixDQUFDLEtBQTBCO0lBQzdELE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDbkIsQ0FBQztBQUZELHdEQUVDO0FBQ0QsU0FBZ0Isc0JBQXNCO0lBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUxELHdEQUtDO0FBQ0QsU0FBZ0IsOEJBQThCO0lBQzFDLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFGRCx3RUFFQztBQUVELElBQUksb0JBQXdDLENBQUM7QUFDN0MsU0FBZ0IsdUJBQXVCLENBQUMsTUFBMEI7SUFDOUQsb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ2xDLENBQUM7QUFGRCwwREFFQztBQUNELFNBQWdCLHVCQUF1QjtJQUNuQyxPQUFPLG9CQUFvQixDQUFDO0FBQ2hDLENBQUM7QUFGRCwwREFFQztBQUNELFNBQWdCLG1CQUFtQjtJQUMvQixJQUFJLG9CQUFvQjtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNwRSxD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QUFDLE9BQWUsRUFBRSxVQUFrQjtJQUNoRSxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLElBQUksUUFBUSxHQUFHLElBQUksbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVELGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFQRCw0Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdG9yYWdlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uU3RvcmFnZVwiO1xuaW1wb3J0IHsgSlNPTlN0b3JhZ2UgfSBmcm9tIFwiLi4vSlNPTlN0b3JhZ2VcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzayB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IEJsb2JTdG9yZSwgSUJ1Y2tldFN0b3JlLCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVksIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgSG9zdGVkQ29uZmlnLCBCYWNrYmxhemVDb25maWcsIElBcmNoaXZlcywgQXJjaGl2ZXNTb3VyY2UsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsXG4gICAgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZywgU2V0Q29uZmlnLFxuICAgIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBGVUxMX1JPVVRFLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIHBhcnNlUm91dGluZ0RhdGEsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZywgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0LCBidWlsZEZpbGVVcmwsIGdldENvbmZpZ1ZlcnNpb24sIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiwgbm9ybWFsaXplU291cmNlIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2UsIGV4cGlyZUludGVybWVkaWF0ZVNvdXJjZXMsIGdldEludGVybWVkaWF0ZVNvdXJjZXMsIGZpbmRTcGxpdFVybCwgbmV4dEludGVybWVkaWF0ZVZlcnNpb24sIElOVEVSTUVESUFURV9FWFBJUkVfR1JBQ0UgfSBmcm9tIFwiLi9pbnRlcm1lZGlhdGVTb3VyY2VzXCI7XG5pbXBvcnQgeyBnZXRUYWtlb3ZlckludGVybWVkaWF0ZSB9IGZyb20gXCIuL2RlcGxveVRha2VvdmVyXCI7XG5pbXBvcnQgeyBjcmVhdGVBcGlBcmNoaXZlcywgbGlzdFNlcnZlckFjdGl2ZUJ1Y2tldEtleXMgfSBmcm9tIFwiLi9jcmVhdGVBcmNoaXZlc1wiO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZSB9IGZyb20gXCIuLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHsgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NSZXF1ZXN0LCBUcnVzdFJlY29yZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRBcmcgfSBmcm9tIFwiLi9jbGlBcmdzXCI7XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VTZXJ2ZXJDb25maWcgPSB7XG4gICAgZG9tYWluOiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHJvb3REb21haW46IHN0cmluZztcbiAgICBzc2hUYXJnZXQ6IHN0cmluZztcbiAgICBzZXJ2ZXJDb21tYW5kOiBzdHJpbmc7XG4gICAgZm9sZGVyOiBzdHJpbmc7XG59O1xuXG5sZXQgY29uZmlnOiBTdG9yYWdlU2VydmVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFN0b3JhZ2VTZXJ2ZXJDb25maWcodmFsdWU6IFN0b3JhZ2VTZXJ2ZXJDb25maWcpOiB2b2lkIHtcbiAgICBjb25maWcgPSB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkICh0aGlzIEFQSSBvbmx5IHdvcmtzIG9uIHRoZSBzdG9yYWdlIHNlcnZlcilgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTogU3RvcmFnZVNlcnZlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cblxubGV0IHdyaXRlc1JlamVjdGVkUmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24ocmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB3cml0ZXNSZWplY3RlZFJlYXNvbiA9IHJlYXNvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0ZXNSZWplY3RlZFJlYXNvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB3cml0ZXNSZWplY3RlZFJlYXNvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRXcml0ZXNBbGxvd2VkKCk6IHZvaWQge1xuICAgIGlmICh3cml0ZXNSZWplY3RlZFJlYXNvbikgdGhyb3cgbmV3IEVycm9yKHdyaXRlc1JlamVjdGVkUmVhc29uKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RvcmFnZUZvbGRlcigpOiBzdHJpbmcge1xuICAgIGxldCBjb25maWcgPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTtcbiAgICBpZiAoY29uZmlnKSByZXR1cm4gY29uZmlnLmZvbGRlcjtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QXJnKFwiZm9sZGVyXCIpO1xuICAgIGlmICghZm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkIGFuZCB0aGVyZSBpcyBubyAtLWZvbGRlciBhcmcsIHNvIHRoZSBzdG9yYWdlIGZvbGRlciBpcyB1bmtub3duYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoZm9sZGVyKTtcbn1cblxuY29uc3Qgc3lzdGVtU3RvcmFnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxJU3RvcmFnZTx1bmtub3duPj4+KCk7XG5mdW5jdGlvbiBnZXRTeXN0ZW1TdG9yYWdlPFQ+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8SVN0b3JhZ2U8VD4+IHtcbiAgICBsZXQgc3RvcmFnZSA9IHN5c3RlbVN0b3JhZ2VzLmdldChuYW1lKTtcbiAgICBpZiAoIXN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcm9vdCA9IGF3YWl0IGdldEZpbGVTdG9yYWdlTmVzdGVkMihnZXRTdG9yYWdlRm9sZGVyKCkpO1xuICAgICAgICAgICAgbGV0IHN5c3RlbSA9IGF3YWl0IHJvb3QuZm9sZGVyLmdldFN0b3JhZ2UoXCJzeXN0ZW0yXCIpO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uTmFtZSA9IFwic3RvcmFnZVwiICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlN0b3JhZ2U8dW5rbm93bj4obmV3IFRyYW5zYWN0aW9uU3RvcmFnZShhd2FpdCBzeXN0ZW0uZm9sZGVyLmdldFN0b3JhZ2UobmFtZSksIHRyYW5zYWN0aW9uTmFtZSkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICBzeXN0ZW1TdG9yYWdlcy5zZXQobmFtZSwgc3RvcmFnZSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlIGFzIFByb21pc2U8SVN0b3JhZ2U8VD4+O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRydXN0KCk6IFByb21pc2U8SVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+KFwidHJ1c3RcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWVzdHMoKTogUHJvbWlzZTxJU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8QWNjZXNzUmVxdWVzdFtdPihcInJlcXVlc3RzXCIpO1xufVxuXG5leHBvcnQgdHlwZSBCdWNrZXRXcml0ZVN0YXRzID0ge1xuICAgIC8qKiBFdmVyeSBzZXQgY2FsbCB0aGUgYnVja2V0IGFjY2VwdGVkICovXG4gICAgb3JpZ2luYWxXcml0ZXM6IG51bWJlcjtcbiAgICBvcmlnaW5hbEJ5dGVzOiBudW1iZXI7XG4gICAgLyoqIFdoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcy4gRmFzdCB3cml0ZXMgY29hbGVzY2UgcmVwZWF0ZWQgd3JpdGVzIHRvIHRoZSBzYW1lIGtleSwgc28gdGhpcyBpcyBsb3dlciB0aGFuIHRoZSBvcmlnaW5hbCBjb3VudHMgKGFuZCBpcyB3aGF0IHRoZSBkaXNrIGFjdHVhbGx5IGRpZCkuICovXG4gICAgZmx1c2hlZFdyaXRlczogbnVtYmVyO1xuICAgIGZsdXNoZWRCeXRlczogbnVtYmVyO1xufTtcbmZ1bmN0aW9uIGVtcHR5V3JpdGVTdGF0cygpOiBCdWNrZXRXcml0ZVN0YXRzIHtcbiAgICByZXR1cm4geyBvcmlnaW5hbFdyaXRlczogMCwgb3JpZ2luYWxCeXRlczogMCwgZmx1c2hlZFdyaXRlczogMCwgZmx1c2hlZEJ5dGVzOiAwIH07XG59XG5mdW5jdGlvbiBhZGRXcml0ZVN0YXRzKGE6IEJ1Y2tldFdyaXRlU3RhdHMsIGI6IEJ1Y2tldFdyaXRlU3RhdHMpOiBCdWNrZXRXcml0ZVN0YXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbFdyaXRlczogYS5vcmlnaW5hbFdyaXRlcyArIGIub3JpZ2luYWxXcml0ZXMsXG4gICAgICAgIG9yaWdpbmFsQnl0ZXM6IGEub3JpZ2luYWxCeXRlcyArIGIub3JpZ2luYWxCeXRlcyxcbiAgICAgICAgZmx1c2hlZFdyaXRlczogYS5mbHVzaGVkV3JpdGVzICsgYi5mbHVzaGVkV3JpdGVzLFxuICAgICAgICBmbHVzaGVkQnl0ZXM6IGEuZmx1c2hlZEJ5dGVzICsgYi5mbHVzaGVkQnl0ZXMsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldFdyaXRlU3RhdHNTdG9yYWdlKCk6IFByb21pc2U8SVN0b3JhZ2U8QnVja2V0V3JpdGVTdGF0cz4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxCdWNrZXRXcml0ZVN0YXRzPihcIndyaXRlU3RhdHNcIik7XG59XG5cbi8vIENvdW50ZWQgaW4gbWVtb3J5IGFzIGRlbHRhcyBzaW5jZSB0aGUgbGFzdCBmbHVzaCwgc28gY291bnRpbmcgYSB3cml0ZSBuZXZlciB0b3VjaGVzIHRoZSBkaXNrLiBUaGUgZmx1c2ggcmVhZHMgdGhlIHN0b3JlZCB0b3RhbHMgYW5kIGFkZHMgdGhlIGRlbHRhLCB3aGljaCBhbHNvIG1ha2VzIGl0IGNvcnJlY3QgYWNyb3NzIHJlc3RhcnRzLlxuY29uc3Qgd3JpdGVTdGF0RGVsdGFzID0gbmV3IE1hcDxzdHJpbmcsIEJ1Y2tldFdyaXRlU3RhdHM+KCk7XG5cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoV3JpdGVTdGF0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXdyaXRlU3RhdERlbHRhcy5zaXplKSByZXR1cm47XG4gICAgbGV0IHBlbmRpbmcgPSBbLi4ud3JpdGVTdGF0RGVsdGFzXTtcbiAgICB3cml0ZVN0YXREZWx0YXMuY2xlYXIoKTtcbiAgICBsZXQgc3RvcmFnZSA9IGF3YWl0IGdldFdyaXRlU3RhdHNTdG9yYWdlKCk7XG4gICAgZm9yIChsZXQgW2tleSwgZGVsdGFdIG9mIHBlbmRpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KGtleSwgYWRkV3JpdGVTdGF0cyhhd2FpdCBzdG9yYWdlLmdldChrZXkpIHx8IGVtcHR5V3JpdGVTdGF0cygpLCBkZWx0YSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBQdXQgdGhlIGRlbHRhIGJhY2ssIHNvIGEgZmFpbGVkIGZsdXNoIGxvc2VzIG5vdGhpbmdcbiAgICAgICAgICAgIHdyaXRlU3RhdERlbHRhcy5zZXQoa2V5LCBhZGRXcml0ZVN0YXRzKHdyaXRlU3RhdERlbHRhcy5nZXQoa2V5KSB8fCBlbXB0eVdyaXRlU3RhdHMoKSwgZGVsdGEpKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZsdXNoaW5nIHdyaXRlIHN0YXRzIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3Qgc3RhcnRXcml0ZVN0YXRzRmx1c2hpbmcgPSBsYXp5KCgpID0+IHtcbiAgICBydW5JbmZpbml0ZVBvbGwoV1JJVEVfU1RBVFNfRkxVU0hfSU5URVJWQUwsIGZsdXNoV3JpdGVTdGF0cyk7XG59KTtcblxuZnVuY3Rpb24gY291bnRCdWNrZXRXcml0ZShrZXk6IHN0cmluZywga2luZDogXCJvcmlnaW5hbFwiIHwgXCJmbHVzaGVkXCIsIGJ5dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgZGVsdGEgPSB3cml0ZVN0YXREZWx0YXMuZ2V0KGtleSk7XG4gICAgaWYgKCFkZWx0YSkge1xuICAgICAgICBkZWx0YSA9IGVtcHR5V3JpdGVTdGF0cygpO1xuICAgICAgICB3cml0ZVN0YXREZWx0YXMuc2V0KGtleSwgZGVsdGEpO1xuICAgIH1cbiAgICBpZiAoa2luZCA9PT0gXCJvcmlnaW5hbFwiKSB7XG4gICAgICAgIGRlbHRhLm9yaWdpbmFsV3JpdGVzKys7XG4gICAgICAgIGRlbHRhLm9yaWdpbmFsQnl0ZXMgKz0gYnl0ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGVsdGEuZmx1c2hlZFdyaXRlcysrO1xuICAgICAgICBkZWx0YS5mbHVzaGVkQnl0ZXMgKz0gYnl0ZXM7XG4gICAgfVxuICAgIHN0YXJ0V3JpdGVTdGF0c0ZsdXNoaW5nKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldFdyaXRlU3RhdHMoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEJ1Y2tldFdyaXRlU3RhdHM+IHtcbiAgICBsZXQgc3RvcmFnZSA9IGF3YWl0IGdldFdyaXRlU3RhdHNTdG9yYWdlKCk7XG4gICAgbGV0IHN0b3JlZCA9IGF3YWl0IHN0b3JhZ2UuZ2V0KGtleSkgfHwgZW1wdHlXcml0ZVN0YXRzKCk7XG4gICAgbGV0IGRlbHRhID0gd3JpdGVTdGF0RGVsdGFzLmdldChrZXkpO1xuICAgIHJldHVybiBkZWx0YSAmJiBhZGRXcml0ZVN0YXRzKHN0b3JlZCwgZGVsdGEpIHx8IHN0b3JlZDtcbn1cblxuLyoqIFplcm9lcyB0aGUgd3JpdGUgc3RhdGlzdGljcyBvZiBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQsIGluY2x1ZGluZyBjb3VudHMgbm90IHlldCBmbHVzaGVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyQWNjb3VudFdyaXRlU3RhdHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgc3RvcmFnZSA9IGF3YWl0IGdldFdyaXRlU3RhdHNTdG9yYWdlKCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2FjY291bnR9L2A7XG4gICAgbGV0IGNsZWFyZWQgPSAwO1xuICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCBzdG9yYWdlLmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICB3cml0ZVN0YXREZWx0YXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2UucmVtb3ZlKGtleSk7XG4gICAgICAgIGNsZWFyZWQrKztcbiAgICB9XG4gICAgZm9yIChsZXQga2V5IG9mIFsuLi53cml0ZVN0YXREZWx0YXMua2V5cygpXSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICB3cml0ZVN0YXREZWx0YXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGNsZWFyZWQrKztcbiAgICB9XG4gICAgY29uc29sZS5sb2coYENsZWFyZWQgdGhlIHdyaXRlIHN0YXRpc3RpY3Mgb2YgJHtjbGVhcmVkfSBidWNrZXRzIGluIGFjY291bnQgJHthY2NvdW50fWApO1xuICAgIHJldHVybiBjbGVhcmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VHJ1c3RlZE1hY2hpbmVzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IG1hY2hpbmVJZHM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgdHJ1c3QgPSBhd2FpdCBnZXRUcnVzdCgpO1xuICAgIGxldCBwcmVmaXggPSBgJHtjb25maWcuYWNjb3VudH18YDtcbiAgICBsZXQgZGVzaXJlZCA9IG5ldyBTZXQoY29uZmlnLm1hY2hpbmVJZHMpO1xuICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCB0cnVzdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGtleS5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgaWYgKGRlc2lyZWQuaGFzKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgICAgIGRlc2lyZWQuZGVsZXRlKG1hY2hpbmVJZCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZpbmcgdHJ1c3QgZm9yIG1hY2hpbmUgJHttYWNoaW5lSWR9IG9uIGFjY291bnQgJHtjb25maWcuYWNjb3VudH1gKTtcbiAgICAgICAgYXdhaXQgdHJ1c3QucmVtb3ZlKGtleSk7XG4gICAgfVxuICAgIGZvciAobGV0IG1hY2hpbmVJZCBvZiBkZXNpcmVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBZGRpbmcgdHJ1c3QgZm9yIG1hY2hpbmUgJHttYWNoaW5lSWR9IG9uIGFjY291bnQgJHtjb25maWcuYWNjb3VudH1gKTtcbiAgICAgICAgYXdhaXQgdHJ1c3Quc2V0KGAke3ByZWZpeH0ke21hY2hpbmVJZH1gLCB7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50LCBtYWNoaW5lSWQsIGlwOiBcIlwiLCB0aW1lOiBEYXRlLm5vdygpIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTG9hZGVkQnVja2V0ID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgcm91dGluZzogUmVtb3RlQ29uZmlnO1xuICAgIHJvdXRpbmdKU09OOiBzdHJpbmc7XG4gICAgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdO1xuICAgIHNlbGY6IFNlbGZTdW1tYXJ5IHwgdW5kZWZpbmVkO1xuICAgIHN0b3JlOiBJQnVja2V0U3RvcmU7XG4gICAgc3RydWN0dXJlS2V5OiBzdHJpbmc7XG59O1xuXG5jb25zdCBidWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPj4oKTtcblxuY29uc3QgTUFYX1JFQlVJTERfVElNRVJfREVMQVkgPSAyICoqIDMxIC0gMTtcbmNvbnN0IFJFQlVJTERfQk9VTkRBUllfQlVGRkVSID0gMTAwMDtcbmNvbnN0IFdSSVRFX1NUQVRTX0ZMVVNIX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcblxuZnVuY3Rpb24gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbmNvbnN0IGV4dHJhTGlzdGVuUG9ydHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRFeHRyYUxpc3RlblBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXh0cmFMaXN0ZW5Qb3J0cy5hZGQocG9ydCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRXh0cmFMaXN0ZW5Qb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGV4dHJhTGlzdGVuUG9ydHMuZGVsZXRlKHBvcnQpO1xufVxuLyoqIFdoZXRoZXIgYWRkcmVzczpwb3J0IGlzIHRoaXMgc2VydmVyIHByb2Nlc3MuIFRoZSBPTkUgc2VsZiB0ZXN0IC0gZmluZFNlbGZJbmRleGVzLCBjcmVhdGVBcGlBcmNoaXZlcywgYW5kIFNvdXJjZVdyYXBwZXIgYWxsIGNvbnN1bHQgaXQsIHNvIFwiaXMgdGhpcyBtZVwiIGNhbm5vdCBkaXNhZ3JlZSBiZXR3ZWVuIHRoZSByb3V0aW5nIHBsYW4gYW5kIGNvbm5lY3Rpb24gYnVpbGRpbmc6IGEgVVJMIHRoYXQgaXMgdXMgb24gYW4gZXh0cmEgbGlzdGVuIHBvcnQgbXVzdCBuZXZlciBiZWNvbWUgYSBuZXR3b3JrIGNsaWVudCB0byBvdXJzZWx2ZXMsIHdoaWNoIGlzIGhvdyBpbmZpbml0ZSBzZWxmLXJlcXVlc3QgbG9vcHMgZm9ybS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc093bkFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBsZXQgY29uZmlnID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYWRkcmVzcyAhPT0gY29uZmlnLmRvbWFpbikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBwb3J0ID09PSBjb25maWcucG9ydCB8fCBleHRyYUxpc3RlblBvcnRzLmhhcyhwb3J0KTtcbn1cblxuZnVuY3Rpb24gZmluZFNlbGZJbmRleGVzKHJvdXRpbmc6IFJlbW90ZUNvbmZpZywgYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gICAgbGV0IGluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0aW5nLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHJvdXRpbmcuc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLnR5cGUgIT09IFwicmVtb3RlXCIpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIGlmIChwYXJzZWQuYWNjb3VudCAhPT0gYWNjb3VudCB8fCBwYXJzZWQuYnVja2V0TmFtZSAhPT0gYnVja2V0TmFtZSkgY29udGludWU7XG4gICAgICAgIGlmIChpc093bkFkZHJlc3MocGFyc2VkLmFkZHJlc3MsIHBhcnNlZC5wb3J0KSkge1xuICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleGVzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RFbnRyeUF0KGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCB0aW1lOiBudW1iZXIsIHJvdXRlPzogbnVtYmVyKTogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgY292ZXJpbmcgPSBlbnRyaWVzLmZpbHRlcih4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKGNvdmVyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgZW50cmllcyA9IGNvdmVyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb250YWluaW5nID0gZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA8PSB0aW1lICYmIHRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgbGV0IGJlc3Q6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMF0pLCBNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMV0pKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIGJlc3QgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkOiBMb2FkZWRCdWNrZXQpOiB2b2lkIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgYm91bmRhcmllcyA9IGxvYWRlZC5zZWxmRW50cmllcy5mbGF0TWFwKHggPT4geC52YWxpZFdpbmRvdykuZmlsdGVyKHQgPT4gdCA+IG5vdyk7XG4gICAgaWYgKCFib3VuZGFyaWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGxldCBuZXh0Qm91bmRhcnkgPSBNYXRoLm1pbiguLi5ib3VuZGFyaWVzKTtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IGxvYWRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBuZXh0Qm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUsIHsgZm9yY2U6IHRydWUsIHJlYXNvbjogXCJhIHZhbGlkIHdpbmRvdyBib3VuZGFyeSBwYXNzZWRcIiB9KTtcbiAgICAgICAgfSkoKTtcbiAgICB9LCBNYXRoLm1pbihuZXh0Qm91bmRhcnkgLSBub3cgKyBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiwgTUFYX1JFQlVJTERfVElNRVJfREVMQVkpKTtcbiAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG5jb25zdCBCT1VOREFSWV9TQ0FOX09GRlNFVFMgPSBbLTMwICogMTAwMCwgMiAqIDEwMDAsIDMwICogMTAwMF07XG5jb25zdCBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLID0gREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZICsgV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG5jb25zdCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVkgPSAzMCAqIDEwMDA7XG5cbmNvbnN0IHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmNvbnN0IGJvdW5kYXJ5U2NhbnNSdW5uaW5nID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQm91bmRhcnlTY2Fucyhsb2FkZWQ6IExvYWRlZEJ1Y2tldCk6IHZvaWQge1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBzdGFydHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBzZWxmIG9mIGxvYWRlZC5zZWxmRW50cmllcykge1xuICAgICAgICBsZXQgc3RhcnQgPSBzZWxmLnZhbGlkV2luZG93WzBdO1xuICAgICAgICBpZiAoc3RhcnQgPiBub3cgJiYgc3RhcnQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgc3RhcnRzLmFkZChzdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgc2VsZiBvZiBsb2FkZWQuc2VsZkVudHJpZXMpIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNlbGYudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmICghKHN0YXJ0IDw9IG5vdyAmJiBub3cgPCBlbmQpIHx8IHN0YXJ0IDw9IDApIGNvbnRpbnVlO1xuICAgICAgICBpZiAobm93IC0gc3RhcnQgPiBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHNjaGVkdWxlS2V5ID0gYCR7a2V5fXwke3N0YXJ0fXxzdGFydHVwYDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuaGFzKHNjaGVkdWxlS2V5KSkgY29udGludWU7XG4gICAgICAgIHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuYWRkKHNjaGVkdWxlS2V5KTtcbiAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHJ1bkJvdW5kYXJ5U2NhbihrZXksIHN0YXJ0LCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVksIFwic3RhcnR1cCszMHNcIikuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9LCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVkpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBzdGFydCBvZiBzdGFydHMpIHtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0IG9mIEJPVU5EQVJZX1NDQU5fT0ZGU0VUUykge1xuICAgICAgICAgICAgbGV0IGF0ID0gc3RhcnQgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYXQgPD0gbm93KSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzY2hlZHVsZUtleSA9IGAke2tleX18JHtzdGFydH18JHtvZmZzZXR9YDtcbiAgICAgICAgICAgIGlmIChzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmhhcyhzY2hlZHVsZUtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5hZGQoc2NoZWR1bGVLZXkpO1xuICAgICAgICAgICAgbGV0IGFybSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdm9pZCBydW5Cb3VuZGFyeVNjYW4oa2V5LCBzdGFydCwgb2Zmc2V0KS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgICAgICAgICAgfSwgTWF0aC5taW4oYXQgLSBEYXRlLm5vdygpLCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSkpO1xuICAgICAgICAgICAgICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJvdW5kYXJ5U2NhbihidWNrZXRLZXk6IHN0cmluZywgd2luZG93U3RhcnQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIsIG9mZnNldExhYmVsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhYmVsID0gYGJ1Y2tldCAke2J1Y2tldEtleX0sIHdpbmRvdyBzdGFydGluZyAke25ldyBEYXRlKHdpbmRvd1N0YXJ0KS50b0lTT1N0cmluZygpfSwgb2Zmc2V0ICR7b2Zmc2V0TGFiZWwgfHwgYCR7b2Zmc2V0IC8gMTAwMH1zYH1gO1xuICAgIGlmIChib3VuZGFyeVNjYW5zUnVubmluZy5oYXMoYnVja2V0S2V5KSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBpbmcgYm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pOiB0aGUgcHJldmlvdXMgYm91bmRhcnkgc2NhbiBpcyBzdGlsbCBydW5uaW5nYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuYWRkKGJ1Y2tldEtleSk7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGJ1Y2tldEtleSk7XG4gICAgICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgICAgIGxldCBzdG9yZSA9IGxvYWRlZC5zdG9yZTtcbiAgICAgICAgaWYgKCEoc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpKSByZXR1cm47XG4gICAgICAgIGxldCBlZmZlY3RpdmUgPSBsb2FkZWQucm91dGluZztcbiAgICAgICAgbGV0IHNlbGZJbmRleGVzID0gZmluZFNlbGZJbmRleGVzKGVmZmVjdGl2ZSwgbG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lKTtcbiAgICAgICAgbGV0IHNlbGZJbmRleFNldCA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgICAgICBsZXQgc2VsdmVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gZWZmZWN0aXZlLnNvdXJjZXNbaV0gYXMgSG9zdGVkQ29uZmlnKS5maWx0ZXIoeCA9PiB4LnZhbGlkV2luZG93WzBdID09PSB3aW5kb3dTdGFydCk7XG4gICAgICAgIGlmICghc2VsdmVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgcHJldlRpbWUgPSB3aW5kb3dTdGFydCAtIDE7XG4gICAgICAgIGxldCBuZWVkRGlza1NjYW4gPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlbW90ZU93bmVycyA9IG5ldyBNYXA8bnVtYmVyLCBbbnVtYmVyLCBudW1iZXJdPigpO1xuICAgICAgICBmb3IgKGxldCBzZWxmIG9mIHNlbHZlcykge1xuICAgICAgICAgICAgbGV0IHNlbGZSb3V0ZSA9IHNlbGYucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgIGxldCBpZHggPSBlZmZlY3RpdmUuc291cmNlcy5pbmRleE9mKHNlbGYpO1xuICAgICAgICAgICAgbGV0IHNoYWRvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlkeDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gd2luZG93U3RhcnQgJiYgd2luZG93U3RhcnQgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBpZiAoclswXSA8PSBzZWxmUm91dGVbMF0gJiYgc2VsZlJvdXRlWzFdIDw9IHJbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhZG93ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHVuY292ZXJlZDogW251bWJlciwgbnVtYmVyXVtdID0gW1tzZWxmUm91dGVbMF0sIHNlbGZSb3V0ZVsxXV1dO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlZmZlY3RpdmUuc291cmNlcy5sZW5ndGggJiYgdW5jb3ZlcmVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gcHJldlRpbWUgJiYgcHJldlRpbWUgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhaW1lZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IG9mIHVuY292ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW50ZXIgPSByb3V0ZUludGVyc2VjdGlvbih1LCByKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLnB1c2godSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFpbWVkID0gY2xhaW1lZCAmJiBbTWF0aC5taW4oY2xhaW1lZFswXSwgaW50ZXJbMF0pLCBNYXRoLm1heChjbGFpbWVkWzFdLCBpbnRlclsxXSldIGFzIFtudW1iZXIsIG51bWJlcl0gfHwgaW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1WzBdIDwgaW50ZXJbMF0pIHJlbWFpbmluZy5wdXNoKFt1WzBdLCBpbnRlclswXV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJbMV0gPCB1WzFdKSByZW1haW5pbmcucHVzaChbaW50ZXJbMV0sIHVbMV1dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5jb3ZlcmVkID0gcmVtYWluaW5nO1xuICAgICAgICAgICAgICAgIGlmICghY2xhaW1lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGZJbmRleFNldC5oYXMoaikpIHtcbiAgICAgICAgICAgICAgICAgICAgbmVlZERpc2tTY2FuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSByZW1vdGVPd25lcnMuZ2V0KGopO1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVPd25lcnMuc2V0KGosIGV4aXN0aW5nICYmIFtNYXRoLm1pbihleGlzdGluZ1swXSwgY2xhaW1lZFswXSksIE1hdGgubWF4KGV4aXN0aW5nWzFdLCBjbGFpbWVkWzFdKV0gYXMgW251bWJlciwgbnVtYmVyXSB8fCBjbGFpbWVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZWVkRGlza1NjYW4gJiYgIXJlbW90ZU93bmVycy5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuICgke2xhYmVsfSk6IGRpc2tTY2FuPSR7bmVlZERpc2tTY2FufSwgcmVtb3RlIHByZXZpb3VzLXdpbmRvdyBvd25lcnM6ICR7cmVtb3RlT3duZXJzLnNpemV9YCk7XG4gICAgICAgIGlmIChuZWVkRGlza1NjYW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JlLnJlc2NhbkJhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2luY2UgPSB3aW5kb3dTdGFydCAtIEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0s7XG4gICAgICAgIGZvciAobGV0IFtzb3VyY2VJbmRleCwgcm91dGVdIG9mIHJlbW90ZU93bmVycykge1xuICAgICAgICAgICAgbGV0IG93bmVyU291cmNlID0gZWZmZWN0aXZlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvd25lclNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlLmJvdW5kYXJ5U2NhblJlbW90ZShjcmVhdGVBcGlBcmNoaXZlcyhvd25lclNvdXJjZSksIHsgc2luY2UsIHJvdXRlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KSBvZiBwcmV2aW91cy13aW5kb3cgb3duZXIgKHNvdXJjZSBpbmRleCAke3NvdXJjZUluZGV4fSkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuZGVsZXRlKGJ1Y2tldEtleSk7XG4gICAgfVxufVxuXG50eXBlIFN0b3JlUGxhbiA9IHtcbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZjogU2VsZlN1bW1hcnkgfCB1bmRlZmluZWQ7XG4gICAgcmF3RGlzazogYm9vbGVhbjtcbiAgICBzb3VyY2VTcGVjczogeyBzb3VyY2VDb25maWc/OiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWc7IHZhbGlkV2luZG93OiBbbnVtYmVyLCBudW1iZXJdOyByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07IG5vRnVsbFN5bmM/OiBib29sZWFuIH1bXTtcbiAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG4gICAgc3RydWN0dXJlS2V5OiBzdHJpbmc7XG59O1xuXG5jb25zdCByZXNvbHZlZFNvdXJjZUFyY2hpdmVzID0gbmV3IE1hcDxzdHJpbmcsIElBcmNoaXZlcz4oKTtcbi8qKiBBIGNhY2hlZCBJQXJjaGl2ZXMgZm9yIGEgcGVyc2lzdGVkIHNvdXJjZSBpZGVudGl0eTogYSByb3V0aW5nIFVSTCAoaG9zdGVkL2JhY2tibGF6ZSkgb3IgYSBkaXNrIGZvbGRlciBwYXRoIC0gdGhlIGZvcm0gQmxvYlN0b3JlJ3Mgc291cmNlcyBsaXN0IHN0b3Jlcy4gQ29uZmlndXJhdGlvbiAodmFsaWQgd2luZG93cywgcm91dGVzKSBkZWNpZGVzIFdIRU4gYSBzb3VyY2Ugc2hvdWxkIGJlIHVzZWQ7IGZvciByZWFkaW5nIGJ5dGVzIHRoZSBpbmRleCBzYXlzIGEgc291cmNlIGhvbGRzLCB0aGUgVVJMIGFsb25lIGlzIGVub3VnaCAtIGV2ZW4gZm9yIHNvdXJjZXMgbm8gbG9uZ2VyIGluIGFueSBjb25maWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNvdXJjZUFyY2hpdmVzKHVybDogc3RyaW5nKTogSUFyY2hpdmVzIHtcbiAgICBsZXQgZXhpc3RpbmcgPSByZXNvbHZlZFNvdXJjZUFyY2hpdmVzLmdldCh1cmwpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGxldCBhcmNoaXZlczogSUFyY2hpdmVzO1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgIGFyY2hpdmVzID0gY3JlYXRlQXBpQXJjaGl2ZXMobm9ybWFsaXplU291cmNlKHVybCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFyY2hpdmVzID0gbmV3IEFyY2hpdmVzRGlzayh1cmwpO1xuICAgIH1cbiAgICByZXNvbHZlZFNvdXJjZUFyY2hpdmVzLnNldCh1cmwsIGFyY2hpdmVzKTtcbiAgICByZXR1cm4gYXJjaGl2ZXM7XG59XG5cbmZ1bmN0aW9uIHNvdXJjZUlkZW50aXR5KHNvdXJjZUNvbmZpZzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIXNvdXJjZUNvbmZpZykgcmV0dXJuIFwiZGlza1wiO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IC4uLnNvdXJjZUNvbmZpZywgdmFsaWRXaW5kb3c6IHVuZGVmaW5lZCwgcm91dGU6IHVuZGVmaW5lZCB9KTtcbn1cblxuLyoqIE91ciByb2xlIGluIGEgYnVja2V0J3Mgcm91dGluZyBjb25maWcsIHN1bW1hcml6ZWQgYWNyb3NzIEFMTCBjdXJyZW50bHktdmFsaWQgc2VsZiBlbnRyaWVzLiBTdG9yZWQgaW5zdGVhZCBvZiBhIHNpbmdsZSByZXByZXNlbnRhdGl2ZSBIb3N0ZWRDb25maWcsIHNvIG5vdGhpbmcgY2FuIGFjY2lkZW50YWxseSB1c2Ugb25lIGVudHJ5J3Mgcm91dGUgb3IgZmxhZ3Mgd2hlcmUgdGhlIHVuaW9uIGlzIHJlcXVpcmVkIC0gdGhlIHN0YW5kYXJkIGNvbmZpZyBoYXMgdGhlIHNhbWUgVVJMIHR3aWNlOiBhIHJvdXRlZCB3cml0ZS1zaGFyZCBlbnRyeSBwbHVzIGFuIHVucm91dGVkIHJlYWQtZXZlcnl0aGluZyBlbnRyeS4gKi9cbmV4cG9ydCB0eXBlIFNlbGZTdW1tYXJ5ID0ge1xuICAgIC8qKiBUaGUgdW5pb24gb2YgdGhlIGN1cnJlbnQgZW50cmllcycgcm91dGVzLCB3aXRoIG92ZXJsYXBwaW5nL2FkamFjZW50IHJhbmdlcyBjb21iaW5lZCAtIHdoaWNoIGNvbW1vbmx5IGNvbGxhcHNlcyB0byBhIHNpbmdsZSBmdWxsIHJhbmdlLCBtYWtpbmcgbWF0Y2hpbmcgdHJpdmlhbC4gKi9cbiAgICByb3V0ZXM6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICBwdWJsaWM6IGJvb2xlYW47XG4gICAgaW1tdXRhYmxlOiBib29sZWFuO1xuICAgIG5vRnVsbFN5bmM6IGJvb2xlYW47XG4gICAgcmF3RGlzazogYm9vbGVhbjtcbiAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBtZXJnZVJvdXRlcyhyb3V0ZXM6IChbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkKVtdKTogW251bWJlciwgbnVtYmVyXVtdIHtcbiAgICBsZXQgbGlzdCA9IHJvdXRlcy5tYXAoeCA9PiB4IHx8IEZVTExfUk9VVEUpLm1hcCh4ID0+IFt4WzBdLCB4WzFdXSBhcyBbbnVtYmVyLCBudW1iZXJdKTtcbiAgICBzb3J0KGxpc3QsIHggPT4geFswXSk7XG4gICAgbGV0IG1lcmdlZDogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgZm9yIChsZXQgcm91dGUgb2YgbGlzdCkge1xuICAgICAgICBsZXQgbGFzdCA9IG1lcmdlZFttZXJnZWQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0ICYmIHJvdXRlWzBdIDw9IGxhc3RbMV0pIHtcbiAgICAgICAgICAgIGxhc3RbMV0gPSBNYXRoLm1heChsYXN0WzFdLCByb3V0ZVsxXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZWQucHVzaChyb3V0ZSk7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbi8qKiBhbmNob3IgaXMgdGhlIGZpcnN0IGN1cnJlbnRseS12YWxpZCBlbnRyeSAobmVhcmVzdC13aW5kb3cgd2hlbiBub25lIGNvbnRhaW5zIG5vdywgbWF0Y2hpbmcgc2VsZWN0RW50cnlBdCkgLSB0aGUgZGV0ZXJtaW5pc3RpYyByZXByZXNlbnRhdGl2ZSB1c2VkIG9ubHkgZm9yIHBvc2l0aW9uYWwgdGhpbmdzOiB0aGUgc3luYy10b3BvbG9neSBjdXQgKHNlbGZJbmRleCkgYW5kIHRoZSBkaXNrV2luZG93IHNlZWQuIEV2ZXJ5dGhpbmcgYmVoYXZpb3JhbCBjb21lcyBmcm9tIHRoZSBzdW1tYXJ5LCB3aGljaCBzcGFucyBldmVyeSBlbnRyeSB0aGUgYW5jaG9yJ3MgZ3JvdXAgcmVwcmVzZW50cy4gKi9cbmZ1bmN0aW9uIHN1bW1hcml6ZVNlbGYoc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCBub3c6IG51bWJlcik6IHsgc3VtbWFyeTogU2VsZlN1bW1hcnkgfCB1bmRlZmluZWQ7IGFuY2hvcjogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkIH0ge1xuICAgIGxldCBjdXJyZW50ID0gc2VsZkVudHJpZXMuZmlsdGVyKHggPT4geC52YWxpZFdpbmRvd1swXSA8PSBub3cgJiYgbm93IDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgaWYgKCFjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgICBsZXQgbmVhcmVzdCA9IHNlbGVjdEVudHJ5QXQoc2VsZkVudHJpZXMsIG5vdyk7XG4gICAgICAgIGN1cnJlbnQgPSBuZWFyZXN0ICYmIFtuZWFyZXN0XSB8fCBbXTtcbiAgICB9XG4gICAgaWYgKCFjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4geyBzdW1tYXJ5OiB1bmRlZmluZWQsIGFuY2hvcjogdW5kZWZpbmVkIH07XG4gICAgfVxuICAgIGxldCBzdW1tYXJ5OiBTZWxmU3VtbWFyeSA9IHtcbiAgICAgICAgcm91dGVzOiBtZXJnZVJvdXRlcyhjdXJyZW50Lm1hcCh4ID0+IHgucm91dGUpKSxcbiAgICAgICAgcHVibGljOiBjdXJyZW50LnNvbWUoeCA9PiB4LnB1YmxpYyksXG4gICAgICAgIGltbXV0YWJsZTogY3VycmVudC5zb21lKHggPT4geC5pbW11dGFibGUpLFxuICAgICAgICBub0Z1bGxTeW5jOiBjdXJyZW50LnNvbWUoeCA9PiB4Lm5vRnVsbFN5bmMpLFxuICAgICAgICByYXdEaXNrOiBjdXJyZW50LnNvbWUoeCA9PiB4LnJhd0Rpc2spLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IGN1cnJlbnQuZmluZCh4ID0+IHgucmVhZGVyRGlza0xpbWl0ICE9PSB1bmRlZmluZWQpPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgfTtcbiAgICByZXR1cm4geyBzdW1tYXJ5LCBhbmNob3I6IGN1cnJlbnRbMF0gfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0b3JlUGxhbihhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcm91dGluZzogUmVtb3RlQ29uZmlnKTogU3RvcmVQbGFuIHtcbiAgICBsZXQgc2VsZkluZGV4ZXMgPSBmaW5kU2VsZkluZGV4ZXMocm91dGluZywgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHNlbGZFbnRyaWVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gcm91dGluZy5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZyk7XG4gICAgbGV0IHsgc3VtbWFyeTogc2VsZiwgYW5jaG9yIH0gPSBzdW1tYXJpemVTZWxmKHNlbGZFbnRyaWVzLCBEYXRlLm5vdygpKTtcbiAgICBsZXQgc2VsZkluZGV4ID0gLTE7XG4gICAgaWYgKGFuY2hvcikge1xuICAgICAgICBzZWxmSW5kZXggPSByb3V0aW5nLnNvdXJjZXMuaW5kZXhPZihhbmNob3IpO1xuICAgIH1cbiAgICBsZXQgZGlza1dpbmRvdzogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBhbmNob3IudmFsaWRXaW5kb3c7XG4gICAgICAgIGxldCBtZXJnZWQgPSB0cnVlO1xuICAgICAgICB3aGlsZSAobWVyZ2VkKSB7XG4gICAgICAgICAgICBtZXJnZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHNlbGZFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtlbnRyeVN0YXJ0LCBlbnRyeUVuZF0gPSBlbnRyeS52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA+IGVuZCB8fCBlbnRyeUVuZCA8IHN0YXJ0KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA8IHN0YXJ0IHx8IGVudHJ5RW5kID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIGVudHJ5U3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBNYXRoLm1heChlbmQsIGVudHJ5RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGlza1dpbmRvdyA9IFtzdGFydCwgZW5kXTtcbiAgICB9XG4gICAgbGV0IG93bkluZGV4ZXMgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICBsZXQgc291cmNlU3BlY3M6IFN0b3JlUGxhbltcInNvdXJjZVNwZWNzXCJdID0gW3tcbiAgICAgICAgdmFsaWRXaW5kb3c6IGRpc2tXaW5kb3csXG4gICAgfV07XG4gICAgaWYgKHNlbGYgJiYgc2VsZkluZGV4ICE9PSAtMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gc2VsZkluZGV4ICsgMTsgaSA8IHJvdXRpbmcuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHJvdXRpbmcuc291cmNlc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IG93bkluZGV4ZXMuaGFzKGkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIC8vIE9uZSBzcGVjIHBlciBpbnRlcnNlY3Rpb24gc2VnbWVudDogYSBwZWVyJ3Mgcm91dGUgY2FuIG92ZXJsYXAgc2V2ZXJhbCBvZiBvdXIgKGRpc2pvaW50KSByb3V0ZSBzbGljZXMsIGFuZCBlYWNoIHNsaWNlIGJlY29tZXMgaXRzIG93biBzeW5jLXNvdXJjZSBzbG90IChzYW1lLVVSTCBtdWx0aS1zbG90IGlzIGFscmVhZHkgdGhlIHN1cHBvcnRlZCBzaGFwZSlcbiAgICAgICAgICAgIGZvciAobGV0IHNlbGZSb3V0ZSBvZiBzZWxmLnJvdXRlcykge1xuICAgICAgICAgICAgICAgIGxldCBzaGFyZWRSb3V0ZSA9IHJvdXRlSW50ZXJzZWN0aW9uKHNlbGZSb3V0ZSwgc291cmNlLnJvdXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXJlZFJvdXRlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzb3VyY2VTcGVjcy5wdXNoKHsgc291cmNlQ29uZmlnOiBzb3VyY2UsIHZhbGlkV2luZG93OiBzb3VyY2UudmFsaWRXaW5kb3csIHJvdXRlOiBzaGFyZWRSb3V0ZSwgbm9GdWxsU3luYzogc291cmNlLm5vRnVsbFN5bmMgfHwgc2VsZi5ub0Z1bGxTeW5jIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxldCByYXdEaXNrID0gISFzZWxmPy5yYXdEaXNrO1xuICAgIGxldCBzdHJ1Y3R1cmVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHJhd0Rpc2ssXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdDogc2VsZj8ucmVhZGVyRGlza0xpbWl0LFxuICAgIH0pO1xuICAgIHJldHVybiB7IHNlbGZFbnRyaWVzLCBzZWxmLCByYXdEaXNrLCBzb3VyY2VTcGVjcywgcmVhZGVyRGlza0xpbWl0OiBzZWxmPy5yZWFkZXJEaXNrTGltaXQsIHN0cnVjdHVyZUtleSB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcm91dGluZzogUmVtb3RlQ29uZmlnLCBwbGFuPzogU3RvcmVQbGFuKTogTG9hZGVkQnVja2V0IHtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghcGxhbikge1xuICAgICAgICBwbGFuID0gY29tcHV0ZVN0b3JlUGxhbihhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKTtcbiAgICB9XG4gICAgbGV0IHsgc2VsZkVudHJpZXMsIHNlbGYgfSA9IHBsYW47XG4gICAgbGV0IHN0b3JlOiBJQnVja2V0U3RvcmU7XG4gICAgaWYgKHBsYW4ucmF3RGlzaykge1xuICAgICAgICBzdG9yZSA9IG5ldyBBcmNoaXZlc0Rpc2soZm9sZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNlbGYpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaGlzIHNlcnZlciBpcyBub3QgaW4gdGhlIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiBubyBsb25nZXIgc3luY2hyb25pemluZywgdmFsaWQgd2luZG93IHRyZWF0ZWQgYXMgWzAsIDBdIChmYXN0IHdyaXRlcyBmbHVzaCBpbW1lZGlhdGVseSksIGRpc2sgZGF0YSBrZXB0IGFuZCBzZXJ2ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSA9IHBsYW4uc291cmNlU3BlY3MubWFwKHNwZWMgPT4gKHtcbiAgICAgICAgICAgIHNvdXJjZTogc3BlYy5zb3VyY2VDb25maWcgJiYgY3JlYXRlQXBpQXJjaGl2ZXMoc3BlYy5zb3VyY2VDb25maWcpIHx8IG5ldyBBcmNoaXZlc0Rpc2soZm9sZGVyKSxcbiAgICAgICAgICAgIHVybDogc3BlYy5zb3VyY2VDb25maWc/LnVybCB8fCBmb2xkZXIsXG4gICAgICAgICAgICB2YWxpZFdpbmRvdzogc3BlYy52YWxpZFdpbmRvdyxcbiAgICAgICAgICAgIHJvdXRlOiBzcGVjLnJvdXRlLFxuICAgICAgICAgICAgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlOiBzcGVjLnNvdXJjZUNvbmZpZz8uaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgaWRlbnRpdHk6IHNvdXJjZUlkZW50aXR5KHNwZWMuc291cmNlQ29uZmlnKSxcbiAgICAgICAgfSkpO1xuICAgICAgICBzdG9yZSA9IG5ldyBCbG9iU3RvcmUoZm9sZGVyLCBzb3VyY2VzLCB7XG4gICAgICAgICAgICBvbkluZGV4Q2hhbmdlZDoga2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSBST1VUSU5HX0ZJTEUpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2b2lkIHNjaGVkdWxlUm91dGluZ1JlbG9hZChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHBsYW4ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICAgICAgb25Xcml0ZUNvdW50ZWQ6IChraW5kLCBieXRlcykgPT4gY291bnRCdWNrZXRXcml0ZShgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YCwga2luZCwgYnl0ZXMpLFxuICAgICAgICAgICAgcmVzb2x2ZVNvdXJjZVVybDogcmVzb2x2ZVNvdXJjZUFyY2hpdmVzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGxvYWRlZDogTG9hZGVkQnVja2V0ID0geyBhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nLCByb3V0aW5nSlNPTjogSlNPTi5zdHJpbmdpZnkocm91dGluZyksIHNlbGZFbnRyaWVzLCBzZWxmLCBzdG9yZSwgc3RydWN0dXJlS2V5OiBwbGFuLnN0cnVjdHVyZUtleSB9O1xuICAgIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZCk7XG4gICAgc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZCk7XG4gICAgLy8gQSBsb2FkZWQgYnVja2V0IG11c3QgYWN0dWFsbHkgYmUgcnVubmluZzogdGhlIHN0b3JlJ3MgaW5pdCBsb2FkcyBpdHMgaW5kZXggYW5kIHN0YXJ0cyBpdHMgc291cmNlIHN5bmNocm9uaXphdGlvbiwgYW5kIGl0IGlzIGxhenksIHNvIHdpdGhvdXQgdGhpcyBhIGJ1Y2tldCBub3RoaW5nIGhhcyByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBzaXRzIGluZXJ0IC0gcmVwb3J0aW5nIG5vIGRhdGEgYW5kIG5vIHN5bmNpbmcgd2hpbGUgaXRzIGRpc2sgaXMgZnVsbCBvZiBmaWxlcy5cbiAgICBpZiAoc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgdm9pZCBzdG9yZS5pbml0KCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBJbml0aWFsaXppbmcgdGhlIHN0b3JlIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZGVkO1xufVxuXG4vKiogVGhlIHJvdXRpbmcgZmlsZSBpcyBvdXJzLCBvbiBvdXIgb3duIGRpc2ssIGF0IGEgcGF0aCB3ZSBrbm93IC0gc28gaXQgaXMgcmVhZCBkaXJlY3RseS4gR29pbmcgdGhyb3VnaCBhbiBBcmNoaXZlc0Rpc2sgd291bGQgY29uc3RydWN0IGEgd2hvbGUgc3RvcmUgKGhhbmRsZSBjYWNoZSBzd2VlcCBsb29wLCB1cGxvYWRzLWZvbGRlciBjbGVhbnVwKSBqdXN0IHRvIHJlYWQgb25lIGZpbGUuICovXG5mdW5jdGlvbiBnZXRSb3V0aW5nRmlsZVBhdGgoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oZm9sZGVyLCBcImZpbGVzXCIsIFJPVVRJTkdfRklMRSk7XG59XG5hc3luYyBmdW5jdGlvbiByZWFkUm91dGluZ0ZpbGUoZm9sZGVyOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShnZXRSb3V0aW5nRmlsZVBhdGgoZm9sZGVyKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoKGUgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgZGF0YSA9IGF3YWl0IHJlYWRSb3V0aW5nRmlsZShnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpO1xuICAgIGlmICghZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghcm91dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbG9hZGVkID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICBsb2FkZWQgPSBsb2FkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICBidWNrZXRzLnNldChrZXksIGxvYWRlZCk7XG4gICAgICAgIHZvaWQgbG9hZGVkLnRoZW4oYnVja2V0ID0+IHtcbiAgICAgICAgICAgIGlmICghYnVja2V0ICYmIGJ1Y2tldHMuZ2V0KGtleSkgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldHMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIGlmIChidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuXG5jb25zdCByb3V0aW5nUmVsb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuZnVuY3Rpb24gc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc/OiB7IGZvcmNlPzogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IG5leHQgPSAocm91dGluZ1JlbG9hZHMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICAgIC50aGVuKCgpID0+IGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudCwgYnVja2V0TmFtZSwgY29uZmlnKSlcbiAgICAgICAgLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcihgUmVsb2FkaW5nIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDpgLCBlKSk7XG4gICAgcm91dGluZ1JlbG9hZHMuc2V0KGtleSwgbmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIGxldCByb3V0aW5nID0gYXdhaXQgcmVhZFJvdXRpbmdGcm9tRGlzayhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIXJvdXRpbmcpIHJldHVybjtcbiAgICBpZiAoIWNvbmZpZz8uZm9yY2UgJiYgSlNPTi5zdHJpbmdpZnkocm91dGluZykgPT09IGxvYWRlZC5yb3V0aW5nSlNPTikgcmV0dXJuO1xuICAgIGxldCByZWFzb24gPSBjb25maWc/LmZvcmNlICYmIChjb25maWcucmVhc29uIHx8IFwiZm9yY2VkXCIpIHx8IFwicm91dGluZyBjb25maWcgY2hhbmdlZFwiO1xuICAgIGxldCBwbGFuID0gY29tcHV0ZVN0b3JlUGxhbihhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKTtcbiAgICBpZiAocGxhbi5zdHJ1Y3R1cmVLZXkgPT09IGxvYWRlZC5zdHJ1Y3R1cmVLZXkgJiYgbG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBcHBseWluZyB0aGUgcm91dGluZyBjb25maWcgdG8gdGhlIHJ1bm5pbmcgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSlgKTtcbiAgICAgICAgbG9hZGVkLnN0b3JlLnVwZGF0ZVNvdXJjZXMocGxhbi5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDb25maWcgPSBzcGVjLnNvdXJjZUNvbmZpZztcbiAgICAgICAgICAgIGlmICghc291cmNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaWRlbnRpdHk6IHNvdXJjZUlkZW50aXR5KHVuZGVmaW5lZCksIHVybDogZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpLCB2YWxpZFdpbmRvdzogc3BlYy52YWxpZFdpbmRvdywgY3JlYXRlOiAoKTogSUFyY2hpdmVzID0+IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZGVudGl0eTogc291cmNlSWRlbnRpdHkoc291cmNlQ29uZmlnKSxcbiAgICAgICAgICAgICAgICB1cmw6IHNvdXJjZUNvbmZpZy51cmwsXG4gICAgICAgICAgICAgICAgdmFsaWRXaW5kb3c6IHNwZWMudmFsaWRXaW5kb3csXG4gICAgICAgICAgICAgICAgcm91dGU6IHNwZWMucm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLFxuICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZTogc291cmNlQ29uZmlnLmludGVybWVkaWF0ZSxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZUNvbmZpZyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIGxldCB1cGRhdGVkOiBMb2FkZWRCdWNrZXQgPSB7IC4uLmxvYWRlZCwgcm91dGluZywgcm91dGluZ0pTT046IEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpLCBzZWxmRW50cmllczogcGxhbi5zZWxmRW50cmllcywgc2VsZjogcGxhbi5zZWxmIH07XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKHVwZGF0ZWQpKTtcbiAgICAgICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQodXBkYXRlZCk7XG4gICAgICAgIHNjaGVkdWxlQm91bmRhcnlTY2Fucyh1cGRhdGVkKTtcbiAgICAgICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgUmVidWlsZGluZyB0aGUgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSlgKTtcbiAgICBpZiAobG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHBsYW4pKSk7XG4gICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V3JpdGVDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogeyBmYXN0PzogYm9vbGVhbjsgd3JpdGVEZWxheT86IG51bWJlciB9IHtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoYnVja2V0LnNlbGZFbnRyaWVzLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICByZXR1cm4geyBmYXN0OiBzZWxmPy5mYXN0LCB3cml0ZURlbGF5OiBzZWxmPy53cml0ZURlbGF5IH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRNdXRhYmxlKGJ1Y2tldDogTG9hZGVkQnVja2V0LCBmaWxlUGF0aDogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChidWNrZXQuc2VsZkVudHJpZXMsIHdyaXRlVGltZSwgZ2V0Um91dGUoZmlsZVBhdGgpKTtcbiAgICBpZiAoIXNlbGY/LmltbXV0YWJsZSkgcmV0dXJuO1xuICAgIGlmIChhd2FpdCBidWNrZXQuc3RvcmUuZ2V0SW5mbyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHtidWNrZXQuYWNjb3VudH0vJHtidWNrZXQuYnVja2V0TmFtZX0gaXMgaW1tdXRhYmxlIChhdCB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSkgYW5kICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSBhbHJlYWR5IGV4aXN0cywgc28gaXQgY2Fubm90IGJlIHdyaXR0ZW4gdG9gKTtcbiAgICB9XG59XG5cbmNvbnN0IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUgPSA2MCAqIDEwMDA7XG5sZXQgbGFzdFdyb25nVGFyZ2V0TG9nID0gMDtcbmZ1bmN0aW9uIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFdyb25nVGFyZ2V0TG9nIDwgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSkgcmV0dXJuO1xuICAgIGxhc3RXcm9uZ1RhcmdldExvZyA9IERhdGUubm93KCk7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG59XG5cbmNvbnN0IHJvdXRpbmdXcml0ZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGluY29taW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIGluY29taW5nKSkpO1xuICAgICAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ3JlYXRlZCBidWNrZXQgJHtrZXl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KGluY29taW5nKSAhPT0gbG9hZGVkLnJvdXRpbmdKU09OICYmIGdldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpIDw9IGdldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gYENhbm5vdCB1cGRhdGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX06IHRoZSBuZXcgY29uZmlnIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBvbmUgYnV0IGl0cyB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpfSkgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuIEN1cnJlbnQ6ICR7bG9hZGVkLnJvdXRpbmdKU09OfS4gQXR0ZW1wdGVkOiAke0pTT04uc3RyaW5naWZ5KGluY29taW5nKX1gO1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIGxldCBzdG9yZWQgPSBpbmNvbWluZztcbiAgICBsZXQgcmVpbmplY3RlZCA9IDA7XG4gICAgZm9yIChsZXQgaW50ZXJtZWRpYXRlIG9mIGdldEludGVybWVkaWF0ZVNvdXJjZXMoZXhwaXJlSW50ZXJtZWRpYXRlU291cmNlcyhsb2FkZWQucm91dGluZywgRGF0ZS5ub3coKSkpKSB7XG4gICAgICAgIHN0b3JlZCA9IGluamVjdEludGVybWVkaWF0ZVNvdXJjZShzdG9yZWQsIHtcbiAgICAgICAgICAgIHNwbGl0VXJsOiBmaW5kU3BsaXRVcmwobG9hZGVkLnJvdXRpbmcsIGludGVybWVkaWF0ZSkgfHwgaW50ZXJtZWRpYXRlLnVybCxcbiAgICAgICAgICAgIGludGVybWVkaWF0ZVVybDogaW50ZXJtZWRpYXRlLnVybCxcbiAgICAgICAgICAgIHN0YXJ0OiBpbnRlcm1lZGlhdGUudmFsaWRXaW5kb3dbMF0sXG4gICAgICAgICAgICBlbmQ6IGludGVybWVkaWF0ZS52YWxpZFdpbmRvd1sxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlaW5qZWN0ZWQrKztcbiAgICB9XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHN0b3JlZCkgIT09IEpTT04uc3RyaW5naWZ5KGluY29taW5nKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmUtaW5qZWN0ZWQgJHtyZWluamVjdGVkfSBpbi1mbGlnaHQgc3dpdGNob3ZlciB3aW5kb3dzIGludG8gdGhlIGluY29taW5nIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHtrZXl9ICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZyl9KWApO1xuICAgIH1cbiAgICBhd2FpdCBsb2FkZWQuc3RvcmUuc2V0KFJPVVRJTkdfRklMRSwgQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHN0b3JlZCkpLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWNrZXRGaWxlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyOyBmb3JjZVNldEltbXV0YWJsZT86IGJvb2xlYW47IGludGVybmFsPzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgIGlmIChmaWxlUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICAgICAgbGV0IHJ1biA9IChyb3V0aW5nV3JpdGVzLmdldChrZXkpIHx8IFByb21pc2UucmVzb2x2ZSgpKS50aGVuKCgpID0+IHdyaXRlUm91dGluZ0NvbmZpZyhhY2NvdW50LCBidWNrZXROYW1lLCBkYXRhLCBjb25maWcpKTtcbiAgICAgICAgcm91dGluZ1dyaXRlcy5zZXQoa2V5LCBydW4udGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSkpO1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVuO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSBkb2VzIG5vdCBleGlzdC4gV3JpdGUgaXRzIHJvdXRpbmcgY29uZmlnIHRvICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gdG8gY3JlYXRlIGl0LmApO1xuICAgIH1cbiAgICBsZXQgd3JpdGVUaW1lID0gY29uZmlnPy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKTtcbiAgICBsZXQgcm91dGUgPSBnZXRSb3V0ZShmaWxlUGF0aCk7XG4gICAgaWYgKCFjb25maWc/Lmxhc3RNb2RpZmllZCAmJiBsb2FkZWQuc2VsZkVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIGxldCB0aW1lVmFsaWQgPSBsb2FkZWQuc2VsZkVudHJpZXMuZmlsdGVyKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgICAgIGlmICghdGltZVZhbGlkLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBpcyBvdXRzaWRlIGFsbCBvdXIgdmFsaWQgd2luZG93cyAke0pTT04uc3RyaW5naWZ5KGxvYWRlZC5zZWxmRW50cmllcy5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9IChhIHN3aXRjaG92ZXIgbW92ZWQgdGhlIHdyaXRlIHRhcmdldClgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1ZBTElEX1dJTkRPV30gVGhpcyBzZXJ2ZXIgaXMgbm90IGEgdmFsaWQgd3JpdGUgdGFyZ2V0IGF0ICR7d3JpdGVUaW1lfSBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAob3VyIHZhbGlkIHdpbmRvd3M6ICR7SlNPTi5zdHJpbmdpZnkobG9hZGVkLnNlbGZFbnRyaWVzLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0pLiBSZS1yZXNvbHZlIHRoZSBjdXJyZW50bHkgdmFsaWQgc291cmNlIGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRpbWVWYWxpZC5zb21lKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSB0byBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIG91ciByb3V0ZXMgJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9IGF0IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKHRoZSBjbGllbnQncyBzaGFyZCBjb25maWcgaXMgc3RhbGUpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19ST1VURX0gVGhpcyBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHJvdXRlICR7cm91dGV9IChrZXkgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9KSBmb3IgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAob3VyIHJvdXRlcyBhdCB0aGlzIHRpbWU6ICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSkuIFJlLXJlc29sdmUgdGhlIHNvdXJjZSBmb3IgdGhpcyBrZXkgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb25maWc/LmZvcmNlU2V0SW1tdXRhYmxlKSB7XG4gICAgICAgIGlmICghY29uZmlnLmxhc3RNb2RpZmllZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JjZVNldEltbXV0YWJsZSByZXF1aXJlcyBsYXN0TW9kaWZpZWQgKHN5bmNocm9uaXphdGlvbiB3cml0ZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgd3JpdGUgdGltZSksIHdyaXRpbmcgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbW11dGFiaWxpdHkgd2luczogYW4gZXhpc3RpbmcgcGF0aCBpcyBrZXB0IGluc3RlYWQgb2YgdGhlIHB1c2ggdGhyb3dpbmcgKHNlZSBTZXRDb25maWcuZm9yY2VTZXRJbW11dGFibGUpXG4gICAgICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChsb2FkZWQuc2VsZkVudHJpZXMsIHdyaXRlVGltZSwgcm91dGUpO1xuICAgICAgICBpZiAoc2VsZj8uaW1tdXRhYmxlICYmIGF3YWl0IGxvYWRlZC5zdG9yZS5nZXRJbmZvKGZpbGVQYXRoKSkgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGFzc2VydE11dGFibGUobG9hZGVkLCBmaWxlUGF0aCwgd3JpdGVUaW1lKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uaW50ZXJuYWwpIHtcbiAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlcyBtdXN0IGNhcnJ5IGxhc3RNb2RpZmllZCAodGhleSBhcmUgc3luY2hyb25pemF0aW9uIHB1c2hlcywgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlZSBTZXRDb25maWcuaW50ZXJuYWw6IHRoZSBzdGFtcCBtdXN0IGxhbmQgaW5zaWRlIFNPTUUgd2luZG93K3JvdXRlIHRoaXMgc2VydmVyIGlzIGNvbmZpZ3VyZWQgZm9yIChhbnkgd2luZG93LCBpbmNsdWRpbmcgcGFzdCBvbmVzIC0gc3luY2hyb25pemF0aW9uIG1vdmVzIG9sZCBkYXRhKSwgc28gYSBjb25mdXNlZCBwZWVyIGNhbid0IHN0dWZmIGRhdGEgb250byBhIG5vZGUgdGhhdCB3YXMgbmV2ZXIgbWVhbnQgdG8gaG9sZCBpdFxuICAgICAgICBsZXQgY292ZXJlZCA9IGxvYWRlZC5zZWxmRW50cmllcy5zb21lKHggPT4gd3JpdGVUaW1lID49IHgudmFsaWRXaW5kb3dbMF0gJiYgd3JpdGVUaW1lIDwgeC52YWxpZFdpbmRvd1sxXSAmJiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmICghY292ZXJlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSByZWplY3RlZDogd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAoJHtuZXcgRGF0ZSh3cml0ZVRpbWUpLnRvSVNPU3RyaW5nKCl9KSBhdCByb3V0ZSAke3JvdXRlfSBpcyBvdXRzaWRlIGV2ZXJ5IHdpbmRvdy9yb3V0ZSB0aGlzIHNlcnZlciBpcyBjb25maWd1cmVkIGZvcjogJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4gKHsgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9hZGVkLnN0b3JlLnNldEludGVybmFsKSB7XG4gICAgICAgICAgICBhd2FpdCBsb2FkZWQuc3RvcmUuc2V0SW50ZXJuYWwoZmlsZVBhdGgsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmF3RGlzayBzdG9yZXM6IHRoZSBub3JtYWwgc2V0IGFscmVhZHkgSVMgdGhlIGRpc2tcbiAgICAgICAgYXdhaXQgbG9hZGVkLnN0b3JlLnNldChmaWxlUGF0aCwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBsb2FkZWQuc3RvcmUuc2V0KGZpbGVQYXRoLCBkYXRhLCB7IC4uLmdldFdyaXRlQ29uZmlnKGxvYWRlZCwgd3JpdGVUaW1lLCByb3V0ZSksIGxhc3RNb2RpZmllZDogd3JpdGVUaW1lIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVja2V0Q29uZmlnKGJ1Y2tldDogTG9hZGVkQnVja2V0KTogQXJjaGl2ZXNDb25maWcge1xuICAgIGxldCBwcm9ncmVzcyA9IGJ1Y2tldC5zdG9yZS5nZXRTeW5jUHJvZ3Jlc3M/LigpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC8vIE5hdGl2ZSBjaGFuZ2UtZmVlZCBzdXBwb3J0ID0gdGhlIHN0b3JlIGtlZXBzIGFuIGluZGV4IChyYXdEaXNrIGJ1Y2tldHMgZW11bGF0ZSBnZXRDaGFuZ2VzQWZ0ZXIyIHdpdGggYSBmdWxsIGxpc3RpbmcpIC0gY2xpZW50cyB1c2UgdGhpcyB0byBwaWNrIHRoZWlyIHNjYW4gY2FkZW5jZVxuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogYnVja2V0LnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlLFxuICAgICAgICByZW1vdGVDb25maWc6IGJ1Y2tldC5yb3V0aW5nLFxuICAgICAgICBpbmRleDogcHJvZ3Jlc3M/LmluZGV4LFxuICAgICAgICBpbmRleFNvdXJjZXM6IHByb2dyZXNzPy5zb3VyY2VzLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHByb2dyZXNzPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIHN5bmNpbmc6IHByb2dyZXNzPy5zeW5jaW5nLFxuICAgIH07XG59XG5cbi8qKiBXaGljaCBidWNrZXRzIHRoaXMgcHJvY2VzcyBjdXJyZW50bHkgaGFzIGxvYWRlZCAtIHdoYXQgYSBkZXBsb3kgc3VjY2Vzc29yIGFza3MgaXRzIHByZWRlY2Vzc29yIGZvciwgc28gaXQgYWN0aXZhdGVzIGV4YWN0bHkgdGhlIGJ1Y2tldHMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZUJ1Y2tldEtleXMoKTogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiBbLi4uYnVja2V0cy5rZXlzKCldLm1hcChrZXkgPT4ge1xuICAgICAgICBsZXQgc2xhc2ggPSBrZXkuaW5kZXhPZihcIi9cIik7XG4gICAgICAgIHJldHVybiB7IGFjY291bnQ6IGtleS5zbGljZSgwLCBzbGFzaCksIGJ1Y2tldE5hbWU6IGtleS5zbGljZShzbGFzaCArIDEpIH07XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkQWxsTG9hZGVkQnVja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBrZXkgb2YgWy4uLmJ1Y2tldHMua2V5cygpXSkge1xuICAgICAgICBsZXQgc2xhc2ggPSBrZXkuaW5kZXhPZihcIi9cIik7XG4gICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChrZXkuc2xpY2UoMCwgc2xhc2gpLCBrZXkuc2xpY2Uoc2xhc2ggKyAxKSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImFsbCBsb2FkZWQgYnVja2V0cyB3ZXJlIGFza2VkIHRvIHJlYnVpbGRcIiB9KTtcbiAgICB9XG59XG5cbmNvbnN0IE9XTl9DT05GSUdfV1JJVEVfVEhST1RUTEUgPSAzMCAqIDEwMDA7XG5jb25zdCBJTlRFUk1FRElBVEVfTUFJTlRBSU5fSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBQZXIgYnVja2V0LCBub3QgZ2xvYmFsOiBhIHN3aXRjaG92ZXIgaGFzIHRvIHdyaXRlIGV2ZXJ5IGJ1Y2tldCdzIHdpbmRvd3MgYXQgb25jZSwgYW5kIGEgc2hhcmVkIHRocm90dGxlIHdvdWxkIGxldCBvbmx5IG9uZSBidWNrZXQgdGhyb3VnaCBwZXIgaW50ZXJ2YWxcbmNvbnN0IGxhc3RPd25Db25maWdXcml0ZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlT3duUm91dGluZ0NvbmZpZyhsb2FkZWQ6IExvYWRlZEJ1Y2tldCwgdXBkYXRlZDogUmVtb3RlQ29uZmlnLCByZWFzb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCBzaW5jZUxhc3QgPSBEYXRlLm5vdygpIC0gKGxhc3RPd25Db25maWdXcml0ZS5nZXQoa2V5KSB8fCAwKTtcbiAgICBpZiAoc2luY2VMYXN0IDwgT1dOX0NPTkZJR19XUklURV9USFJPVFRMRSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgTm90IHdyaXRpbmcgb3VyIG93biByb3V0aW5nIGNvbmZpZyB1cGRhdGUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSk6IHRoZSBsYXN0IG9uZSB3YXMgJHtzaW5jZUxhc3R9bXMgYWdvLCB1bmRlciB0aGUgJHtPV05fQ09ORklHX1dSSVRFX1RIUk9UVExFfW1zIHRocm90dGxlLiBSZXRyeWluZyBvbiB0aGUgbmV4dCBtYWludGVuYW5jZSBwYXNzLiBXYW50ZWQ6ICR7SlNPTi5zdHJpbmdpZnkodXBkYXRlZCl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdE93bkNvbmZpZ1dyaXRlLnNldChrZXksIERhdGUubm93KCkpO1xuICAgIGxldCB2ZXJzaW9uID0gbmV4dEludGVybWVkaWF0ZVZlcnNpb24oZ2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZykpO1xuICAgIGxldCBuZXh0OiBSZW1vdGVDb25maWcgPSB7IC4uLnVwZGF0ZWQsIHZlcnNpb24gfTtcbiAgICBjb25zb2xlLmxvZyhgV3JpdGluZyAke1JPVVRJTkdfRklMRX0gZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSksIHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKGxvYWRlZC5yb3V0aW5nKX0gLT4gJHt2ZXJzaW9ufTogJHtKU09OLnN0cmluZ2lmeShuZXh0KX1gKTtcbiAgICBsZXQgZGF0YSA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhuZXh0KSk7XG4gICAgYXdhaXQgd3JpdGVCdWNrZXRGaWxlKGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSwgUk9VVElOR19GSUxFLCBkYXRhKTtcbiAgICBhd2FpdCBwcm9wYWdhdGVSb3V0aW5nQ29uZmlnKGxvYWRlZCwgbmV4dCwgZGF0YSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb3BhZ2F0ZVJvdXRpbmdDb25maWcobG9hZGVkOiBMb2FkZWRCdWNrZXQsIG5leHQ6IFJlbW90ZUNvbmZpZywgZGF0YTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHRhcmdldHMgPSBuZXcgTWFwPHN0cmluZywgSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnPigpO1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiBbLi4ubG9hZGVkLnJvdXRpbmcuc291cmNlcywgLi4ubmV4dC5zb3VyY2VzXSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UuaW50ZXJtZWRpYXRlKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSBcInJlbW90ZVwiKSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgICAgICBpZiAocGFyc2VkLmFjY291bnQgIT09IGxvYWRlZC5hY2NvdW50IHx8IHBhcnNlZC5idWNrZXROYW1lICE9PSBsb2FkZWQuYnVja2V0TmFtZSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldHMuaGFzKHNvdXJjZS51cmwpKSBjb250aW51ZTtcbiAgICAgICAgdGFyZ2V0cy5zZXQoc291cmNlLnVybCwgc291cmNlKTtcbiAgICB9XG4gICAgZm9yIChsZXQgW3VybCwgc291cmNlXSBvZiB0YXJnZXRzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjcmVhdGVBcGlBcmNoaXZlcyhzb3VyY2UpLnNldChST1VUSU5HX0ZJTEUsIGRhdGEpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFdyb3RlICR7Uk9VVElOR19GSUxFfSBmb3IgYnVja2V0ICR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9IHRvICR7dXJsfWApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcm9wYWdhdGluZyBvdXIgcm91dGluZyBjb25maWcgdXBkYXRlIHRvICR7dXJsfSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW50YWluSW50ZXJtZWRpYXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICBsZXQgdGFrZW92ZXIgPSBnZXRUYWtlb3ZlckludGVybWVkaWF0ZSgpO1xuICAgIGxldCB3cml0dGVuOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBhbHJlYWR5Q29ycmVjdDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgbm90T3Vyczogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBPTkxZIGJ1Y2tldHMgYWxyZWFkeSBpbiBtZW1vcnkuIEEgc3dpdGNob3ZlciBtdXN0IG5ldmVyIGxvYWQgYSBidWNrZXQ6IGxvYWRpbmcgc3RhcnRzIGl0cyBzeW5jaHJvbml6YXRpb24sIGFuZCBidWNrZXRzIG5vdGhpbmcgaGFzIHRvdWNoZWQgKGxlZ2FjeSBvbmVzIGVzcGVjaWFsbHkpIGhhdmUgbm8gd3JpdGVzIHRvIGhhbmQgb2ZmIGluIHRoZSBmaXJzdCBwbGFjZS4gT25lIHRoYXQgZG9lcyBnZXQgdXNlZCBtaWQtc3dpdGNob3ZlciBsb2FkcyBvbiB0aGF0IGFjY2VzcywgYW5kIHRoZSBuZXh0IHBhc3MgZ2l2ZXMgaXQgaXRzIHdpbmRvdy5cbiAgICBsZXQga2V5cyA9IFsuLi5idWNrZXRzLmtleXMoKV07XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICBpZiAoIWxvYWRlZFByb21pc2UpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoIWxvYWRlZCkgY29udGludWU7XG4gICAgICAgIGxldCBleHBpcmVkID0gZXhwaXJlSW50ZXJtZWRpYXRlU291cmNlcyhsb2FkZWQucm91dGluZywgRGF0ZS5ub3coKSk7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleHBpcmVkKSAhPT0gSlNPTi5zdHJpbmdpZnkobG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZU93blJvdXRpbmdDb25maWcobG9hZGVkLCBleHBpcmVkLCBgc3dpdGNob3ZlciB3aW5kb3dzIGV4cGlyZWQgbW9yZSB0aGFuICR7SU5URVJNRURJQVRFX0VYUElSRV9HUkFDRSAvIDEwMDB9cyBhZ29gKTtcbiAgICAgICAgICAgIHdyaXR0ZW4ucHVzaChrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0YWtlb3ZlcikgY29udGludWU7XG4gICAgICAgIGxldCBtYWluVXJsID0gbG9hZGVkLnJvdXRpbmcuc291cmNlcy5maW5kKHggPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB4ID09PSBcInN0cmluZ1wiIHx8IHgudHlwZSAhPT0gXCJyZW1vdGVcIiB8fCB4LmludGVybWVkaWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHgudXJsKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZWQuYWRkcmVzcyA9PT0gZG9tYWluICYmIHBhcnNlZC5wb3J0ID09PSBwb3J0O1xuICAgICAgICB9KSBhcyBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghbWFpblVybCkge1xuICAgICAgICAgICAgbm90T3Vycy5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5qZWN0ZWQgPSBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2UobG9hZGVkLnJvdXRpbmcsIHtcbiAgICAgICAgICAgIHNwbGl0VXJsOiBtYWluVXJsLnVybCxcbiAgICAgICAgICAgIGludGVybWVkaWF0ZVVybDogcmVwbGFjZUhvc3RlZFVybFBvcnQobWFpblVybC51cmwsIHRha2VvdmVyLmFsdFBvcnQpLFxuICAgICAgICAgICAgc3RhcnQ6IHRha2VvdmVyLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiB0YWtlb3Zlci5lbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaW5qZWN0ZWQpID09PSBKU09OLnN0cmluZ2lmeShsb2FkZWQucm91dGluZykpIHtcbiAgICAgICAgICAgIGFscmVhZHlDb3JyZWN0LnB1c2goa2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHdyaXRlT3duUm91dGluZ0NvbmZpZyhsb2FkZWQsIGluamVjdGVkLCBgd2UgYXJlIGEgZGVwbG95IHN1Y2Nlc3Nvcjogd3JpdGVzIHJvdXRlIHRvIG91ciBhbHRlcm5hdGUgcG9ydCAke3Rha2VvdmVyLmFsdFBvcnR9IGZyb20gJHtuZXcgRGF0ZSh0YWtlb3Zlci5zdGFydCkudG9JU09TdHJpbmcoKX0gdW50aWwgb3VyIHByZWRlY2Vzc29yIGlzIGtpbGxlZCBhdCAke25ldyBEYXRlKHRha2VvdmVyLmVuZCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgd3JpdHRlbi5wdXNoKGtleSk7XG4gICAgfVxuICAgIGlmICghdGFrZW92ZXIpIHJldHVybjtcbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBObyBhY3RpdmUgYnVja2V0cywgc28gbm8gY29uZmlnIGZpbGVzIHRvIHdyaXRlIHRoZSBpbnRlcm1lZGlhdGUgaW50byAoYSBidWNrZXQgaXMgb25seSBhY3RpdmUgb25jZSBzb21ldGhpbmcgdXNlcyBpdClgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXdyaXR0ZW4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXcm90ZSBubyBjb25maWcgZmlsZXM6IG9mICR7a2V5cy5sZW5ndGh9IGFjdGl2ZSBidWNrZXRzLCAke2FscmVhZHlDb3JyZWN0Lmxlbmd0aH0gYWxyZWFkeSBjb250YWluIHRoZSBpbnRlcm1lZGlhdGUgYW5kICR7bm90T3Vycy5sZW5ndGh9IGFyZSBub3QgaG9zdGVkIGJ5IHVzYCk7XG4gICAgfVxufVxuXG4vKiogT3VyIHByZWRlY2Vzc29yIHN0aWxsIGhvbGRzIHRoZSBtYWluIHBvcnQgYW5kIGhhcyBiZWVuIHNlcnZpbmcgYWxsIGFsb25nLCBzbyBpdCAtIG5vdCB1cyAtIGtub3dzIHdoaWNoIGJ1Y2tldHMgYXJlIGluIHVzZS4gV2UgYWN0aXZhdGUgZXhhY3RseSB0aG9zZSwgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGVpciBjb25maWcgZmlsZXMgZ2V0IHRoZSBpbnRlcm1lZGlhdGU7IG5vdGhpbmcgZWxzZSBvbiBkaXNrIGlzIHRvdWNoZWQuICovXG5hc3luYyBmdW5jdGlvbiBhY3RpdmF0ZVByZWRlY2Vzc29yQnVja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICBsZXQgdXJsID0gYGh0dHBzOi8vJHtkb21haW59OiR7cG9ydH1gO1xuICAgIGxldCBrZXlzOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXTtcbiAgICB0cnkge1xuICAgICAgICBrZXlzID0gYXdhaXQgbGlzdFNlcnZlckFjdGl2ZUJ1Y2tldEtleXMoeyB1cmwgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgYXNrIG91ciBwcmVkZWNlc3NvciBvbiAke3VybH0gd2hpY2ggYnVja2V0cyBhcmUgYWN0aXZlLCBzbyBvbmx5IGJ1Y2tldHMgdXNlZCBvbiB0aGlzIHByb2Nlc3MgZ2V0IHRoZSBpbnRlcm1lZGlhdGU6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgT3VyIHByZWRlY2Vzc29yIG9uICR7dXJsfSBoYXMgbm8gYWN0aXZlIGJ1Y2tldHMsIHNvIHRoZXJlIGFyZSBubyBjb25maWcgZmlsZXMgdG8gd3JpdGUgdGhlIGludGVybWVkaWF0ZSBpbnRvYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYE91ciBwcmVkZWNlc3NvciBvbiAke3VybH0gaGFzICR7a2V5cy5sZW5ndGh9IGFjdGl2ZSBidWNrZXRzLCBhY3RpdmF0aW5nIHRoZW0gaGVyZSBzbyB0aGVpciBjb25maWcgZmlsZXMgZ2V0IHRoZSBpbnRlcm1lZGlhdGU6ICR7a2V5cy5tYXAoeCA9PiBgJHt4LmFjY291bnR9LyR7eC5idWNrZXROYW1lfWApLmpvaW4oXCIsIFwiKX1gKTtcbiAgICBmb3IgKGxldCB7IGFjY291bnQsIGJ1Y2tldE5hbWUgfSBvZiBrZXlzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFjdGl2YXRpbmcgYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSAoYWN0aXZlIG9uIG91ciBwcmVkZWNlc3NvcikgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKiogU3RhcnRlZCBieSBkZXBsb3lUYWtlb3ZlciBvbmNlIHdlIGFyZSBhY3R1YWxseSBhIGRlcGxveSBzdWNjZXNzb3IgbGlzdGVuaW5nIG9uIGFuIGFsdGVybmF0ZSBwb3J0LiBVbnRpbCB0aGVuIHRoZXJlIGFyZSBubyBzd2l0Y2hvdmVyIHdpbmRvd3MgdG8gd3JpdGUgb3IgZXhwaXJlLCBzbyBub3RoaW5nIHBvbGxzLiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0SW50ZXJtZWRpYXRlTWFpbnRlbmFuY2UgPSBsYXp5KCgpID0+IHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGFjdGl2YXRlUHJlZGVjZXNzb3JCdWNrZXRzKCk7XG4gICAgICAgIGF3YWl0IG1haW50YWluSW50ZXJtZWRpYXRlcygpO1xuICAgIH0pKCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBXcml0aW5nIHRoZSBpbnRlcm1lZGlhdGUgaW50byB0aGUgY29uZmlnIGZpbGVzIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgIHJ1bkluZmluaXRlUG9sbChJTlRFUk1FRElBVEVfTUFJTlRBSU5fSU5URVJWQUwsIG1haW50YWluSW50ZXJtZWRpYXRlcyk7XG59KTtcblxuZXhwb3J0IHR5cGUgQnVja2V0RGlza0luZm8gPSB7XG4gICAgdG90YWxCeXRlczogbnVtYmVyO1xuICAgIGZyZWVCeXRlczogbnVtYmVyO1xuICAgIHVzZWRCeXRlczogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIFNlcnZlckJ1Y2tldEluZm8gPSB7XG4gICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICAvKiogV2hlcmUgdGhlIGJ1Y2tldCdzIGRhdGEgbGl2ZXMgb24gdGhpcyBzZXJ2ZXIgKi9cbiAgICBmb2xkZXI6IHN0cmluZztcbiAgICAvKiogVGhlIGRyaXZlIHRoYXQgZm9sZGVyIGlzIG9uLiBCdWNrZXRzIHNoYXJpbmcgYSBkcml2ZSByZXBvcnQgdGhlIHNhbWUgbnVtYmVycy4gKi9cbiAgICBkaXNrPzogQnVja2V0RGlza0luZm87XG4gICAgZGlza0Vycm9yPzogc3RyaW5nO1xuICAgIHdyaXRlU3RhdHM/OiBCdWNrZXRXcml0ZVN0YXRzO1xuICAgIGNvbmZpZz86IEFyY2hpdmVzQ29uZmlnO1xuICAgIGVycm9yPzogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGlza0luZm8oZm9sZGVyOiBzdHJpbmcpOiBQcm9taXNlPEJ1Y2tldERpc2tJbmZvPiB7XG4gICAgbGV0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdGZzKGZvbGRlcik7XG4gICAgbGV0IGJsb2NrU2l6ZSA9IE51bWJlcihzdGF0cy5ic2l6ZSk7XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSBOdW1iZXIoc3RhdHMuYmxvY2tzKSAqIGJsb2NrU2l6ZTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICAvLyBNYXRjaGVzIHRoZSBzZXJ2ZXIncyBvd24gbG93LXNwYWNlIGNoZWNrOiB3aGF0IGFuIHVucHJpdmlsZWdlZCBwcm9jZXNzIGNhbiBhY3R1YWxseSB1c2VcbiAgICAgICAgZnJlZUJ5dGVzOiBOdW1iZXIoc3RhdHMuYmF2YWlsKSAqIGJsb2NrU2l6ZSxcbiAgICAgICAgdXNlZEJ5dGVzOiB0b3RhbEJ5dGVzIC0gTnVtYmVyKHN0YXRzLmJmcmVlKSAqIGJsb2NrU2l6ZSxcbiAgICB9O1xufVxuXG5leHBvcnQgdHlwZSBBY3RpdmVCdWNrZXRJbmZvID0ge1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgcm91dGluZyBjb25maWcgdGhlIGJ1Y2tldCBpcyBSVU5OSU5HIG9uLCBzdHJhaWdodCBmcm9tIG1lbW9yeSAtIGluY2x1ZGluZyBzd2l0Y2hvdmVyIHdpbmRvd3Mgd3JpdHRlbiBzaW5jZSBpdCBsb2FkZWQgKi9cbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgLyoqIE91ciBvd24gZW50cmllcyBpbiB0aGF0IGNvbmZpZywgYW5kIHRoZWlyIHN1bW1hcml6ZWQgY3VycmVudCByb2xlIChyb3V0ZXMgdW5pb24gKyBmbGFncykgKi9cbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZj86IFNlbGZTdW1tYXJ5O1xuICAgIGNvbmZpZzogQXJjaGl2ZXNDb25maWc7XG59O1xuXG4vKiogVGhlIGxpdmUgaW4tbWVtb3J5IHN0YXRlIG9mIE9ORSBidWNrZXQsIGFuc3dlcmVkIHdpdGhvdXQgdG91Y2hpbmcgdGhlIGRpc2sgKG5vIHJvdXRpbmcgZmlsZSByZWFkLCBubyBzdGF0ZnMsIG5vIHN0b3JlZCB3cml0ZSBzdGF0cykuIFJldHVybnMgYW4gZXJyb3Igc3RyaW5nIHdoZW4gdGhlIGJ1Y2tldCBpcyBub3QgbG9hZGVkIGhlcmUsIHdoaWNoIGlzIHRoZSBub3JtYWwgc3RhdGUgZm9yIGEgYnVja2V0IG5vdGhpbmcgaGFzIGFjY2Vzc2VkIHNpbmNlIHN0YXJ0dXAuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWN0aXZlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGlzIG5vdCBsb2FkZWQgb24gdGhpcyBzZXJ2ZXIsIHNvIGl0IGhhcyBubyBsaXZlIHN0YXRlIChpdCBsb2FkcyBvbiBmaXJzdCBhY2Nlc3MpYDtcbiAgICB9XG4gICAgbGV0IGxvYWRlZDogTG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAgIGxvYWRlZCA9IGF3YWl0IGxvYWRlZFByb21pc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gZmFpbGVkIHRvIGxvYWQgb24gdGhpcyBzZXJ2ZXI6ICR7U3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApfWA7XG4gICAgfVxuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlcmA7XG4gICAgfVxuICAgIHJldHVybiB0b0FjdGl2ZUJ1Y2tldEluZm8obG9hZGVkKTtcbn1cblxuZnVuY3Rpb24gdG9BY3RpdmVCdWNrZXRJbmZvKGxvYWRlZDogTG9hZGVkQnVja2V0KTogQWN0aXZlQnVja2V0SW5mbyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZm9sZGVyOiBnZXRCdWNrZXRGb2xkZXIobG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lKSxcbiAgICAgICAgcm91dGluZzogbG9hZGVkLnJvdXRpbmcsXG4gICAgICAgIHNlbGZFbnRyaWVzOiBsb2FkZWQuc2VsZkVudHJpZXMsXG4gICAgICAgIHNlbGY6IGxvYWRlZC5zZWxmLFxuICAgICAgICBjb25maWc6IGdldEJ1Y2tldENvbmZpZyhsb2FkZWQpLFxuICAgIH07XG59XG5cbi8qKiBMb2FkcyBhIGJ1Y2tldCB0aGF0IGV4aXN0cyBvbiB0aGlzIHNlcnZlcidzIGRpc2sgaW50byBtZW1vcnksIHdoaWNoIHN0YXJ0cyBpdHMgc3luY2hyb25pemF0aW9uIGFuZCB3aW5kb3cgdGltZXJzLCBhbmQgcmV0dXJucyBpdHMgbGl2ZSBzdGF0ZS4gTm90aGluZyBpcyB3cml0dGVuIGFuZCBubyBvdGhlciBzZXJ2ZXIgaXMgY29udGFjdGVkIC0gdW5saWtlIGJ1aWxkaW5nIGFuIEFyY2hpdmVzQ2hhaW4gZm9yIGl0LCB3aGljaCB3b3VsZCBwcm9iZSBldmVyeSBzb3VyY2UgYW5kIGNvdWxkIHdyaXRlIHRoZSByb3V0aW5nIGNvbmZpZy4gQWxyZWFkeS1sb2FkZWQgYnVja2V0cyBqdXN0IHJldHVybiB0aGVpciBzdGF0ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgd2FzTG9hZGVkID0gYnVja2V0cy5oYXMoa2V5KTtcbiAgICBsZXQgbG9hZGVkOiBMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGZhaWxlZCB0byBsb2FkIG9uIHRoaXMgc2VydmVyOiAke1N0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKX1gO1xuICAgIH1cbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBzZXJ2ZXIgKG5vIHJvdXRpbmcgZmlsZSBpbiAke2dldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKX0pYDtcbiAgICB9XG4gICAgLy8gV2FpdCBmb3IgdGhlIGluZGV4IHRvIGxvYWQsIHNvIHRoZSB0b3RhbHMgd2UgcmV0dXJuIGFyZSB0aGUgcmVhbCBvbmVzIHJhdGhlciB0aGFuIHplcm9lcyBmcm9tIGEgc3RvcmUgdGhhdCBoYXMgbm90IHJlYWQgaXRzIGluZGV4IHlldC4gVGhlIHNvdXJjZSBzY2FucyBrZWVwIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQuXG4gICAgaWYgKGxvYWRlZC5zdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkge1xuICAgICAgICBhd2FpdCBsb2FkZWQuc3RvcmUuaW5pdCgpO1xuICAgIH1cbiAgICBpZiAoIXdhc0xvYWRlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWN0aXZhdGVkIGJ1Y2tldCAke2tleX0gb24gcmVxdWVzdDogaXQgaXMgbm93IGxvYWRlZCBhbmQgc3luY2hyb25pemluZ2ApO1xuICAgIH1cbiAgICByZXR1cm4gdG9BY3RpdmVCdWNrZXRJbmZvKGxvYWRlZCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCB0aW1pbmdzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBhc3luYyBmdW5jdGlvbiB0aW1lZDxUPihuYW1lOiBzdHJpbmcsIHJ1bjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgYmVnYW4gPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGltaW5ncy5zZXQobmFtZSwgKHRpbWluZ3MuZ2V0KG5hbWUpIHx8IDApICsgKERhdGUubm93KCkgLSBiZWdhbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBhY2NvdW50Rm9sZGVyID0gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCk7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgICBuYW1lcyA9IGF3YWl0IHRpbWVkKFwicmVhZGRpclwiLCAoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKGFjY291bnRGb2xkZXIpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwobmFtZXMubWFwKGFzeW5jIGJ1Y2tldE5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICAgICAgbGV0IGZvbGRlciA9IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIGxldCBiYXNlOiBTZXJ2ZXJCdWNrZXRJbmZvID0geyBidWNrZXROYW1lLCBhY3RpdmU6IGZhbHNlLCBmb2xkZXIgfTtcbiAgICAgICAgICAgIGxldCBbZGlzaywgd3JpdGVTdGF0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGltZWQoXCJzdGF0ZnNcIiwgKCkgPT4gZ2V0RGlza0luZm8oZm9sZGVyKSkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2UuZGlza0Vycm9yID0gU3RyaW5nKGUuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aW1lZChcIndyaXRlU3RhdHNcIiwgKCkgPT4gZ2V0QnVja2V0V3JpdGVTdGF0cyhrZXkpKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYmFzZS5kaXNrID0gZGlzaztcbiAgICAgICAgICAgIGJhc2Uud3JpdGVTdGF0cyA9IHdyaXRlU3RhdHM7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2FkZWRQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IHRpbWVkKFwiYXdhaXRMb2FkZWRcIiwgKCkgPT4gbG9hZGVkUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGFjdGl2ZTogdHJ1ZSwgY29uZmlnOiBnZXRCdWNrZXRDb25maWcobG9hZGVkKSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBhY3RpdmU6IHRydWUsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aW1lZChcInJlYWRSb3V0aW5nRmlsZVwiLCAoKSA9PiByZWFkUm91dGluZ0ZpbGUoZm9sZGVyKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBgTm8gcm91dGluZyBmaWxlICgke1JPVVRJTkdfRklMRX0pYCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gYXdhaXQgdGltZWQoXCJwYXJzZVJvdXRpbmdcIiwgYXN5bmMgKCkgPT4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgY29uZmlnOiB7IHJlbW90ZUNvbmZpZzogcGFyc2VkIH0gfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBUaGUgcGFydHMgcnVuIGNvbmN1cnJlbnRseSwgc28gdGhlc2UgYXJlIHN1bW1lZCB3YWxsIHRpbWVzIHBlciBwYXJ0LCBub3QgYSBicmVha2Rvd24gb2YgdGhlIHRvdGFsXG4gICAgICAgIGxldCBwYXJ0cyA9IFsuLi50aW1pbmdzXS5tYXAoKFtuYW1lLCBtc10pID0+IGAke25hbWV9ICR7bXN9bXNgKS5qb2luKFwiLCBcIik7XG4gICAgICAgIGNvbnNvbGUubG9nKGBsaXN0QWNjb3VudEJ1Y2tldHMoJHthY2NvdW50fSkgdG9vayAke0RhdGUubm93KCkgLSBzdGFydH1tcyBmb3IgJHtuYW1lcy5sZW5ndGh9IGJ1Y2tldHM6ICR7cGFydHN9YCk7XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQnVja2V0RmlsZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChmaWxlUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIGRlbGV0ZWQgKG92ZXJ3cml0ZSBpdCB0byBjaGFuZ2UgdGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24pYCk7XG4gICAgfVxuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICBhd2FpdCBsb2FkZWQuc3RvcmUuZGVsKGZpbGVQYXRoLCBnZXRXcml0ZUNvbmZpZyhsb2FkZWQsIERhdGUubm93KCksIGdldFJvdXRlKGZpbGVQYXRoKSkpO1xufVxuXG5jb25zdCBMQVJHRV9GSUxFX1BBUlRfU0laRSA9IDggKiAxMDI0ICogMTAyNDtcblxuY2xhc3MgQXJjaGl2ZXNMb2NhbEJ1Y2tldCBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhY2NvdW50OiBzdHJpbmcsIHByaXZhdGUgYnVja2V0TmFtZTogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0QnVja2V0KCk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRMb2FkZWRCdWNrZXQodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgbG9jYWxCdWNrZXQgYWNjb3VudCAke3RoaXMuYWNjb3VudH0gYnVja2V0ICR7dGhpcy5idWNrZXROYW1lfWA7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldENvbmZpZyk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjb25maWc/LmludGVybmFsICYmIGJ1Y2tldC5zdG9yZS5nZXRJbnRlcm5hbDIpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0SW50ZXJuYWwyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGF3YWl0IHdyaXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUsIGRhdGEsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGRlbChmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGRlbGV0ZUJ1Y2tldEZpbGUodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldExhcmdlRmlsZShjb25maWc6IHsgcGF0aDogc3RyaW5nOyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShidWNrZXQsIGNvbmZpZy5wYXRoLCBjb25maWcubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCkpO1xuICAgICAgICBsZXQgaWQgPSBhd2FpdCBidWNrZXQuc3RvcmUuc3RhcnRMYXJnZVVwbG9hZCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGNvbmZpZy5nZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGF0YS5sZW5ndGg7IG9mZnNldCArPSBMQVJHRV9GSUxFX1BBUlRfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuYXBwZW5kTGFyZ2VVcGxvYWQoaWQsIGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBMQVJHRV9GSUxFX1BBUlRfU0laRSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGJ1Y2tldC5zdG9yZS5maW5pc2hMYXJnZVVwbG9hZChpZCwgY29uZmlnLnBhdGgsIGNvbmZpZy5sYXN0TW9kaWZpZWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuY2FuY2VsTGFyZ2VVcGxvYWQoaWQpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRJbmZvQ29uZmlnKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0SW5mbyhmaWxlTmFtZSwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmRJbmZvKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZmluZEluZm8ocHJlZml4LCBjb25maWcpKS5tYXAoeCA9PiB4LnBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VVJMKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkRmlsZVVybChgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fS9maWxlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYWNjb3VudCl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuYnVja2V0TmFtZSl9YCwgZmlsZVBhdGgpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4geyBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdHJ1ZSB9O1xuICAgICAgICByZXR1cm4gZ2V0QnVja2V0Q29uZmlnKGJ1Y2tldCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZzogQ2hhbmdlc0FmdGVyQ29uZmlnKTogUHJvbWlzZTxBcmNoaXZlRmlsZUluZm9bXT4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIyKGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHsgYWxsU2NhbnNDb21wbGV0ZTogdHJ1ZSwgaW5kZXhTaXplOiAwLCBzb3VyY2VzOiBbXSB9O1xuICAgICAgICBpZiAoIWJ1Y2tldC5zdG9yZS5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IHN1cHBvcnQgZ2V0U3luY1N0YXR1cyAocmF3RGlzayBidWNrZXRzIGhhdmUgbm8gc3luY2hyb25pemF0aW9uKWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0U3luY1N0YXR1cygpO1xuICAgIH1cbn1cblxuY29uc3QgbG9jYWxBcmNoaXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBJQXJjaGl2ZXM+KCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxBcmNoaXZlcyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IElBcmNoaXZlcyB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBleGlzdGluZyA9IGxvY2FsQXJjaGl2ZXMuZ2V0KGtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgbGV0IGFyY2hpdmVzID0gbmV3IEFyY2hpdmVzTG9jYWxCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbG9jYWxBcmNoaXZlcy5zZXQoa2V5LCBhcmNoaXZlcyk7XG4gICAgcmV0dXJuIGFyY2hpdmVzO1xufVxuIl19
1212
- /* _JS_SOURCE_HASH = "239c97d253ad57861c9d0fc1e552195728e5192fe30359436cf315ebaa004bfd"; */
1162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIseURBQW1EO0FBQ25ELG1EQUFnRDtBQUNoRCwyREFBK0Q7QUFDL0Qsb0RBQXlEO0FBQ3pELDhEQUEyRDtBQUMzRCxnREFBNkM7QUFDN0Msa0RBQStDO0FBQy9DLDJDQUF5RztBQUN6Ryw0Q0FJc0I7QUFDdEIsaURBQTBOO0FBQzFOLCtEQUFzTDtBQUN0TCxxREFBMkQ7QUFDM0QscURBQWlGO0FBRWpGLDJEQUE4RDtBQUU5RCx1Q0FBbUM7QUFXbkMsSUFBSSxNQUF1QyxDQUFDO0FBQzVDLFNBQWdCLHNCQUFzQixDQUFDLEtBQTBCO0lBQzdELE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDbkIsQ0FBQztBQUZELHdEQUVDO0FBQ0QsU0FBZ0Isc0JBQXNCO0lBQ2xDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUxELHdEQUtDO0FBQ0QsU0FBZ0IsOEJBQThCO0lBQzFDLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFGRCx3RUFFQztBQUVELElBQUksb0JBQXdDLENBQUM7QUFDN0MsU0FBZ0IsdUJBQXVCLENBQUMsTUFBMEI7SUFDOUQsb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBQ2xDLENBQUM7QUFGRCwwREFFQztBQUNELFNBQWdCLHVCQUF1QjtJQUNuQyxPQUFPLG9CQUFvQixDQUFDO0FBQ2hDLENBQUM7QUFGRCwwREFFQztBQUNELFNBQWdCLG1CQUFtQjtJQUMvQixJQUFJLG9CQUFvQjtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNwRSxD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RUFBRSxVQUFrQjtJQUNoRSxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLElBQUksUUFBUSxHQUFHLElBQUksbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVELGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFQRCw0Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdG9yYWdlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uU3RvcmFnZVwiO1xuaW1wb3J0IHsgSlNPTlN0b3JhZ2UgfSBmcm9tIFwiLi4vSlNPTlN0b3JhZ2VcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzayB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IEJsb2JTdG9yZSwgSUJ1Y2tldFN0b3JlLCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVksIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgSG9zdGVkQ29uZmlnLCBCYWNrYmxhemVDb25maWcsIElBcmNoaXZlcywgQXJjaGl2ZXNTb3VyY2UsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsXG4gICAgQXJjaGl2ZXNTeW5jU3RhdHVzLCBDaGFuZ2VzQWZ0ZXJDb25maWcsIEdldENvbmZpZywgR2V0SW5mb0NvbmZpZywgU2V0Q29uZmlnLFxuICAgIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBGVUxMX1JPVVRFLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIHBhcnNlUm91dGluZ0RhdGEsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZywgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0LCBidWlsZEZpbGVVcmwsIGdldENvbmZpZ1ZlcnNpb24sIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiwgbm9ybWFsaXplU291cmNlIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2UsIGV4cGlyZUludGVybWVkaWF0ZVNvdXJjZXMsIGdldEludGVybWVkaWF0ZVNvdXJjZXMsIGZpbmRTcGxpdFVybCwgbmV4dEludGVybWVkaWF0ZVZlcnNpb24sIElOVEVSTUVESUFURV9FWFBJUkVfR1JBQ0UgfSBmcm9tIFwiLi9pbnRlcm1lZGlhdGVTb3VyY2VzXCI7XG5pbXBvcnQgeyBnZXRUYWtlb3ZlckludGVybWVkaWF0ZSB9IGZyb20gXCIuL2RlcGxveVRha2VvdmVyXCI7XG5pbXBvcnQgeyBjcmVhdGVBcGlBcmNoaXZlcywgbGlzdFNlcnZlckFjdGl2ZUJ1Y2tldEtleXMgfSBmcm9tIFwiLi9jcmVhdGVBcmNoaXZlc1wiO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZSB9IGZyb20gXCIuLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHsgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NSZXF1ZXN0LCBUcnVzdFJlY29yZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRBcmcgfSBmcm9tIFwiLi9jbGlBcmdzXCI7XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VTZXJ2ZXJDb25maWcgPSB7XG4gICAgZG9tYWluOiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHJvb3REb21haW46IHN0cmluZztcbiAgICBzc2hUYXJnZXQ6IHN0cmluZztcbiAgICBzZXJ2ZXJDb21tYW5kOiBzdHJpbmc7XG4gICAgZm9sZGVyOiBzdHJpbmc7XG59O1xuXG5sZXQgY29uZmlnOiBTdG9yYWdlU2VydmVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFN0b3JhZ2VTZXJ2ZXJDb25maWcodmFsdWU6IFN0b3JhZ2VTZXJ2ZXJDb25maWcpOiB2b2lkIHtcbiAgICBjb25maWcgPSB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkICh0aGlzIEFQSSBvbmx5IHdvcmtzIG9uIHRoZSBzdG9yYWdlIHNlcnZlcilgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTogU3RvcmFnZVNlcnZlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cblxubGV0IHdyaXRlc1JlamVjdGVkUmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24ocmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB3cml0ZXNSZWplY3RlZFJlYXNvbiA9IHJlYXNvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0ZXNSZWplY3RlZFJlYXNvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB3cml0ZXNSZWplY3RlZFJlYXNvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRXcml0ZXNBbGxvd2VkKCk6IHZvaWQge1xuICAgIGlmICh3cml0ZXNSZWplY3RlZFJlYXNvbikgdGhyb3cgbmV3IEVycm9yKHdyaXRlc1JlamVjdGVkUmVhc29uKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RvcmFnZUZvbGRlcigpOiBzdHJpbmcge1xuICAgIGxldCBjb25maWcgPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTtcbiAgICBpZiAoY29uZmlnKSByZXR1cm4gY29uZmlnLmZvbGRlcjtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QXJnKFwiZm9sZGVyXCIpO1xuICAgIGlmICghZm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkIGFuZCB0aGVyZSBpcyBubyAtLWZvbGRlciBhcmcsIHNvIHRoZSBzdG9yYWdlIGZvbGRlciBpcyB1bmtub3duYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoZm9sZGVyKTtcbn1cblxuY29uc3Qgc3lzdGVtU3RvcmFnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxJU3RvcmFnZTx1bmtub3duPj4+KCk7XG5mdW5jdGlvbiBnZXRTeXN0ZW1TdG9yYWdlPFQ+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8SVN0b3JhZ2U8VD4+IHtcbiAgICBsZXQgc3RvcmFnZSA9IHN5c3RlbVN0b3JhZ2VzLmdldChuYW1lKTtcbiAgICBpZiAoIXN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcm9vdCA9IGF3YWl0IGdldEZpbGVTdG9yYWdlTmVzdGVkMihnZXRTdG9yYWdlRm9sZGVyKCkpO1xuICAgICAgICAgICAgbGV0IHN5c3RlbSA9IGF3YWl0IHJvb3QuZm9sZGVyLmdldFN0b3JhZ2UoXCJzeXN0ZW0yXCIpO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uTmFtZSA9IFwic3RvcmFnZVwiICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlN0b3JhZ2U8dW5rbm93bj4obmV3IFRyYW5zYWN0aW9uU3RvcmFnZShhd2FpdCBzeXN0ZW0uZm9sZGVyLmdldFN0b3JhZ2UobmFtZSksIHRyYW5zYWN0aW9uTmFtZSkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICBzeXN0ZW1TdG9yYWdlcy5zZXQobmFtZSwgc3RvcmFnZSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlIGFzIFByb21pc2U8SVN0b3JhZ2U8VD4+O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRydXN0KCk6IFByb21pc2U8SVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+KFwidHJ1c3RcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWVzdHMoKTogUHJvbWlzZTxJU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8QWNjZXNzUmVxdWVzdFtdPihcInJlcXVlc3RzXCIpO1xufVxuXG5leHBvcnQgdHlwZSBCdWNrZXRXcml0ZVN0YXRzID0ge1xuICAgIC8qKiBFdmVyeSBzZXQgY2FsbCB0aGUgYnVja2V0IGFjY2VwdGVkICovXG4gICAgb3JpZ2luYWxXcml0ZXM6IG51bWJlcjtcbiAgICBvcmlnaW5hbEJ5dGVzOiBudW1iZXI7XG4gICAgLyoqIFdoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcy4gRmFzdCB3cml0ZXMgY29hbGVzY2UgcmVwZWF0ZWQgd3JpdGVzIHRvIHRoZSBzYW1lIGtleSwgc28gdGhpcyBpcyBsb3dlciB0aGFuIHRoZSBvcmlnaW5hbCBjb3VudHMgKGFuZCBpcyB3aGF0IHRoZSBkaXNrIGFjdHVhbGx5IGRpZCkuICovXG4gICAgZmx1c2hlZFdyaXRlczogbnVtYmVyO1xuICAgIGZsdXNoZWRCeXRlczogbnVtYmVyO1xufTtcbmZ1bmN0aW9uIGVtcHR5V3JpdGVTdGF0cygpOiBCdWNrZXRXcml0ZVN0YXRzIHtcbiAgICByZXR1cm4geyBvcmlnaW5hbFdyaXRlczogMCwgb3JpZ2luYWxCeXRlczogMCwgZmx1c2hlZFdyaXRlczogMCwgZmx1c2hlZEJ5dGVzOiAwIH07XG59XG5cbi8vIEluIG1lbW9yeSBvbmx5OiB0b3RhbHMgc2luY2UgdGhpcyBwcm9jZXNzIHN0YXJ0ZWQgKG9yIHRoZSBsYXN0IGNsZWFyV3JpdGVTdGF0cykuIFBlcnNpc3RpbmcgdGhlbSB0byBkaXNrIHdhcyBtb3JlIG1hY2hpbmVyeSB0aGFuIHRoZSBudW1iZXJzIHdlcmUgd29ydGguXG5jb25zdCB3cml0ZVN0YXRzID0gbmV3IE1hcDxzdHJpbmcsIEJ1Y2tldFdyaXRlU3RhdHM+KCk7XG5cbmZ1bmN0aW9uIGNvdW50QnVja2V0V3JpdGUoa2V5OiBzdHJpbmcsIGtpbmQ6IFwib3JpZ2luYWxcIiB8IFwiZmx1c2hlZFwiLCBieXRlczogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IHN0YXRzID0gd3JpdGVTdGF0cy5nZXQoa2V5KTtcbiAgICBpZiAoIXN0YXRzKSB7XG4gICAgICAgIHN0YXRzID0gZW1wdHlXcml0ZVN0YXRzKCk7XG4gICAgICAgIHdyaXRlU3RhdHMuc2V0KGtleSwgc3RhdHMpO1xuICAgIH1cbiAgICBpZiAoa2luZCA9PT0gXCJvcmlnaW5hbFwiKSB7XG4gICAgICAgIHN0YXRzLm9yaWdpbmFsV3JpdGVzKys7XG4gICAgICAgIHN0YXRzLm9yaWdpbmFsQnl0ZXMgKz0gYnl0ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHMuZmx1c2hlZFdyaXRlcysrO1xuICAgICAgICBzdGF0cy5mbHVzaGVkQnl0ZXMgKz0gYnl0ZXM7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRCdWNrZXRXcml0ZVN0YXRzKGtleTogc3RyaW5nKTogQnVja2V0V3JpdGVTdGF0cyB7XG4gICAgcmV0dXJuIHdyaXRlU3RhdHMuZ2V0KGtleSkgfHwgZW1wdHlXcml0ZVN0YXRzKCk7XG59XG5cbi8qKiBaZXJvZXMgdGhlIHdyaXRlIHN0YXRpc3RpY3Mgb2YgZXZlcnkgYnVja2V0IGluIHRoZSBhY2NvdW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQWNjb3VudFdyaXRlU3RhdHMoYWNjb3VudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgcHJlZml4ID0gYCR7YWNjb3VudH0vYDtcbiAgICBsZXQgY2xlYXJlZCA9IDA7XG4gICAgZm9yIChsZXQga2V5IG9mIFsuLi53cml0ZVN0YXRzLmtleXMoKV0pIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgd3JpdGVTdGF0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgY2xlYXJlZCsrO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgQ2xlYXJlZCB0aGUgd3JpdGUgc3RhdGlzdGljcyBvZiAke2NsZWFyZWR9IGJ1Y2tldHMgaW4gYWNjb3VudCAke2FjY291bnR9YCk7XG4gICAgcmV0dXJuIGNsZWFyZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRUcnVzdGVkTWFjaGluZXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgbWFjaGluZUlkczogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2NvbmZpZy5hY2NvdW50fXxgO1xuICAgIGxldCBkZXNpcmVkID0gbmV3IFNldChjb25maWcubWFjaGluZUlkcyk7XG4gICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHRydXN0LmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzaXJlZC5oYXMobWFjaGluZUlkKSkge1xuICAgICAgICAgICAgZGVzaXJlZC5kZWxldGUobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGRlc2lyZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFkZGluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cHJlZml4fSR7bWFjaGluZUlkfWAsIHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG1hY2hpbmVJZCwgaXA6IFwiXCIsIHRpbWU6IERhdGUubm93KCkgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBMb2FkZWRCdWNrZXQgPSB7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgcm91dGluZ0pTT046IHN0cmluZztcbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZjogU2VsZlN1bW1hcnkgfCB1bmRlZmluZWQ7XG4gICAgc3RvcmU6IElCdWNrZXRTdG9yZTtcbiAgICBzdHJ1Y3R1cmVLZXk6IHN0cmluZztcbn07XG5cbmNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+PigpO1xuXG5jb25zdCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSA9IDIgKiogMzEgLSAxO1xuY29uc3QgUkVCVUlMRF9CT1VOREFSWV9CVUZGRVIgPSAxMDAwO1xuXG5mdW5jdGlvbiBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpLmZvbGRlciwgXCJidWNrZXRzMlwiLCBhY2NvdW50LCBidWNrZXROYW1lKTtcbn1cblxuY29uc3QgZXh0cmFMaXN0ZW5Qb3J0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV4dHJhTGlzdGVuUG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBleHRyYUxpc3RlblBvcnRzLmFkZChwb3J0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFeHRyYUxpc3RlblBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXh0cmFMaXN0ZW5Qb3J0cy5kZWxldGUocG9ydCk7XG59XG4vKiogV2hldGhlciBhZGRyZXNzOnBvcnQgaXMgdGhpcyBzZXJ2ZXIgcHJvY2Vzcy4gVGhlIE9ORSBzZWxmIHRlc3QgLSBmaW5kU2VsZkluZGV4ZXMsIGNyZWF0ZUFwaUFyY2hpdmVzLCBhbmQgU291cmNlV3JhcHBlciBhbGwgY29uc3VsdCBpdCwgc28gXCJpcyB0aGlzIG1lXCIgY2Fubm90IGRpc2FncmVlIGJldHdlZW4gdGhlIHJvdXRpbmcgcGxhbiBhbmQgY29ubmVjdGlvbiBidWlsZGluZzogYSBVUkwgdGhhdCBpcyB1cyBvbiBhbiBleHRyYSBsaXN0ZW4gcG9ydCBtdXN0IG5ldmVyIGJlY29tZSBhIG5ldHdvcmsgY2xpZW50IHRvIG91cnNlbHZlcywgd2hpY2ggaXMgaG93IGluZmluaXRlIHNlbGYtcmVxdWVzdCBsb29wcyBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3duQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGxldCBjb25maWcgPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChhZGRyZXNzICE9PSBjb25maWcuZG9tYWluKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHBvcnQgPT09IGNvbmZpZy5wb3J0IHx8IGV4dHJhTGlzdGVuUG9ydHMuaGFzKHBvcnQpO1xufVxuXG5mdW5jdGlvbiBmaW5kU2VsZkluZGV4ZXMocm91dGluZzogUmVtb3RlQ29uZmlnLCBhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgICBsZXQgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRpbmcuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc291cmNlID0gcm91dGluZy5zb3VyY2VzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UudHlwZSAhPT0gXCJyZW1vdGVcIikgY29udGludWU7XG4gICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgaWYgKHBhcnNlZC5hY2NvdW50ICE9PSBhY2NvdW50IHx8IHBhcnNlZC5idWNrZXROYW1lICE9PSBidWNrZXROYW1lKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGlzT3duQWRkcmVzcyhwYXJzZWQuYWRkcmVzcywgcGFyc2VkLnBvcnQpKSB7XG4gICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdEVudHJ5QXQoZW50cmllczogSG9zdGVkQ29uZmlnW10sIHRpbWU6IG51bWJlciwgcm91dGU/OiBudW1iZXIpOiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQge1xuICAgIGlmIChyb3V0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBjb3ZlcmluZyA9IGVudHJpZXMuZmlsdGVyKHggPT4gcm91dGVDb250YWlucyh4LnJvdXRlLCByb3V0ZSkpO1xuICAgICAgICBpZiAoY292ZXJpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnRyaWVzID0gY292ZXJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGNvbnRhaW5pbmcgPSBlbnRyaWVzLmZpbmQoeCA9PiB4LnZhbGlkV2luZG93WzBdIDw9IHRpbWUgJiYgdGltZSA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgIGlmIChjb250YWluaW5nKSByZXR1cm4gY29udGFpbmluZztcbiAgICBsZXQgYmVzdDogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGxldCBkaXN0YW5jZSA9IE1hdGgubWluKE1hdGguYWJzKHRpbWUgLSBlbnRyeS52YWxpZFdpbmRvd1swXSksIE1hdGguYWJzKHRpbWUgLSBlbnRyeS52YWxpZFdpbmRvd1sxXSkpO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgYmVzdCA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0O1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQ6IExvYWRlZEJ1Y2tldCk6IHZvaWQge1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBib3VuZGFyaWVzID0gbG9hZGVkLnNlbGZFbnRyaWVzLmZsYXRNYXAoeCA9PiB4LnZhbGlkV2luZG93KS5maWx0ZXIodCA9PiB0ID4gbm93KTtcbiAgICBpZiAoIWJvdW5kYXJpZXMubGVuZ3RoKSByZXR1cm47XG4gICAgbGV0IG5leHRCb3VuZGFyeSA9IE1hdGgubWluKC4uLmJvdW5kYXJpZXMpO1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbG9hZGVkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA8IG5leHRCb3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImEgdmFsaWQgd2luZG93IGJvdW5kYXJ5IHBhc3NlZFwiIH0pO1xuICAgICAgICB9KSgpO1xuICAgIH0sIE1hdGgubWluKG5leHRCb3VuZGFyeSAtIG5vdyArIFJFQlVJTERfQk9VTkRBUllfQlVGRkVSLCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSkpO1xuICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG59XG5cbmNvbnN0IEJPVU5EQVJZX1NDQU5fT0ZGU0VUUyA9IFstMzAgKiAxMDAwLCAyICogMTAwMCwgMzAgKiAxMDAwXTtcbmNvbnN0IEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0sgPSBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVkgKyBXSU5ET1dfRU5EX0ZMVVNIX01BUkdJTjtcbmNvbnN0IFNUQVJUVVBfQk9VTkRBUllfU0NBTl9ERUxBWSA9IDMwICogMTAwMDtcblxuY29uc3Qgc2NoZWR1bGVkQm91bmRhcnlTY2FucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgYm91bmRhcnlTY2Fuc1J1bm5pbmcgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuZnVuY3Rpb24gc2NoZWR1bGVCb3VuZGFyeVNjYW5zKGxvYWRlZDogTG9hZGVkQnVja2V0KTogdm9pZCB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IHN0YXJ0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAobGV0IHNlbGYgb2YgbG9hZGVkLnNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHNlbGYudmFsaWRXaW5kb3dbMF07XG4gICAgICAgIGlmIChzdGFydCA+IG5vdyAmJiBzdGFydCA8IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICBzdGFydHMuYWRkKHN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBzZWxmIG9mIGxvYWRlZC5zZWxmRW50cmllcykge1xuICAgICAgICBsZXQgW3N0YXJ0LCBlbmRdID0gc2VsZi52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKCEoc3RhcnQgPD0gbm93ICYmIG5vdyA8IGVuZCkgfHwgc3RhcnQgPD0gMCkgY29udGludWU7XG4gICAgICAgIGlmIChub3cgLSBzdGFydCA+IEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0spIGNvbnRpbnVlO1xuICAgICAgICBsZXQgc2NoZWR1bGVLZXkgPSBgJHtrZXl9fCR7c3RhcnR9fHN0YXJ0dXBgO1xuICAgICAgICBpZiAoc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5oYXMoc2NoZWR1bGVLZXkpKSBjb250aW51ZTtcbiAgICAgICAgc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5hZGQoc2NoZWR1bGVLZXkpO1xuICAgICAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZvaWQgcnVuQm91bmRhcnlTY2FuKGtleSwgc3RhcnQsIFNUQVJUVVBfQk9VTkRBUllfU0NBTl9ERUxBWSwgXCJzdGFydHVwKzMwc1wiKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgIH0sIFNUQVJUVVBfQk9VTkRBUllfU0NBTl9ERUxBWSk7XG4gICAgICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgfVxuICAgIGZvciAobGV0IHN0YXJ0IG9mIHN0YXJ0cykge1xuICAgICAgICBmb3IgKGxldCBvZmZzZXQgb2YgQk9VTkRBUllfU0NBTl9PRkZTRVRTKSB7XG4gICAgICAgICAgICBsZXQgYXQgPSBzdGFydCArIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChhdCA8PSBub3cpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHNjaGVkdWxlS2V5ID0gYCR7a2V5fXwke3N0YXJ0fXwke29mZnNldH1gO1xuICAgICAgICAgICAgaWYgKHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuaGFzKHNjaGVkdWxlS2V5KSkgY29udGludWU7XG4gICAgICAgICAgICBzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmFkZChzY2hlZHVsZUtleSk7XG4gICAgICAgICAgICBsZXQgYXJtID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSA8IGF0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2b2lkIHJ1bkJvdW5kYXJ5U2NhbihrZXksIHN0YXJ0LCBvZmZzZXQpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgICAgICAgICB9LCBNYXRoLm1pbihhdCAtIERhdGUubm93KCksIE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZKSk7XG4gICAgICAgICAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQm91bmRhcnlTY2FuKGJ1Y2tldEtleTogc3RyaW5nLCB3aW5kb3dTdGFydDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlciwgb2Zmc2V0TGFiZWw/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFiZWwgPSBgYnVja2V0ICR7YnVja2V0S2V5fSwgd2luZG93IHN0YXJ0aW5nICR7bmV3IERhdGUod2luZG93U3RhcnQpLnRvSVNPU3RyaW5nKCl9LCBvZmZzZXQgJHtvZmZzZXRMYWJlbCB8fCBgJHtvZmZzZXQgLyAxMDAwfXNgfWA7XG4gICAgaWYgKGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmhhcyhidWNrZXRLZXkpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTa2lwcGluZyBib3VuZGFyeSBzY2FuICgke2xhYmVsfSk6IHRoZSBwcmV2aW91cyBib3VuZGFyeSBzY2FuIGlzIHN0aWxsIHJ1bm5pbmdgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBib3VuZGFyeVNjYW5zUnVubmluZy5hZGQoYnVja2V0S2V5KTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgYnVja2V0cy5nZXQoYnVja2V0S2V5KTtcbiAgICAgICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICAgICAgbGV0IHN0b3JlID0gbG9hZGVkLnN0b3JlO1xuICAgICAgICBpZiAoIShzdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkpIHJldHVybjtcbiAgICAgICAgbGV0IGVmZmVjdGl2ZSA9IGxvYWRlZC5yb3V0aW5nO1xuICAgICAgICBsZXQgc2VsZkluZGV4ZXMgPSBmaW5kU2VsZkluZGV4ZXMoZWZmZWN0aXZlLCBsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUpO1xuICAgICAgICBsZXQgc2VsZkluZGV4U2V0ID0gbmV3IFNldChzZWxmSW5kZXhlcyk7XG4gICAgICAgIGxldCBzZWx2ZXMgPSBzZWxmSW5kZXhlcy5tYXAoaSA9PiBlZmZlY3RpdmUuc291cmNlc1tpXSBhcyBIb3N0ZWRDb25maWcpLmZpbHRlcih4ID0+IHgudmFsaWRXaW5kb3dbMF0gPT09IHdpbmRvd1N0YXJ0KTtcbiAgICAgICAgaWYgKCFzZWx2ZXMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIGxldCBwcmV2VGltZSA9IHdpbmRvd1N0YXJ0IC0gMTtcbiAgICAgICAgbGV0IG5lZWREaXNrU2NhbiA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVtb3RlT3duZXJzID0gbmV3IE1hcDxudW1iZXIsIFtudW1iZXIsIG51bWJlcl0+KCk7XG4gICAgICAgIGZvciAobGV0IHNlbGYgb2Ygc2VsdmVzKSB7XG4gICAgICAgICAgICBsZXQgc2VsZlJvdXRlID0gc2VsZi5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgbGV0IGlkeCA9IGVmZmVjdGl2ZS5zb3VyY2VzLmluZGV4T2Yoc2VsZik7XG4gICAgICAgICAgICBsZXQgc2hhZG93ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaWR4OyBqKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSBlZmZlY3RpdmUuc291cmNlc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG90aGVyID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgW3dzLCB3ZV0gPSBvdGhlci52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoISh3cyA8PSB3aW5kb3dTdGFydCAmJiB3aW5kb3dTdGFydCA8IHdlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHIgPSBvdGhlci5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgICAgIGlmIChyWzBdIDw9IHNlbGZSb3V0ZVswXSAmJiBzZWxmUm91dGVbMV0gPD0gclsxXSkge1xuICAgICAgICAgICAgICAgICAgICBzaGFkb3dlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaGFkb3dlZCkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgdW5jb3ZlcmVkOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbW3NlbGZSb3V0ZVswXSwgc2VsZlJvdXRlWzFdXV07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGVmZmVjdGl2ZS5zb3VyY2VzLmxlbmd0aCAmJiB1bmNvdmVyZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXIgPSBlZmZlY3RpdmUuc291cmNlc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG90aGVyID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgW3dzLCB3ZV0gPSBvdGhlci52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoISh3cyA8PSBwcmV2VGltZSAmJiBwcmV2VGltZSA8IHdlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IHIgPSBvdGhlci5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmc6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjbGFpbWVkOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHUgb2YgdW5jb3ZlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlciA9IHJvdXRlSW50ZXJzZWN0aW9uKHUsIHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWludGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcucHVzaCh1KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYWltZWQgPSBjbGFpbWVkICYmIFtNYXRoLm1pbihjbGFpbWVkWzBdLCBpbnRlclswXSksIE1hdGgubWF4KGNsYWltZWRbMV0sIGludGVyWzFdKV0gYXMgW251bWJlciwgbnVtYmVyXSB8fCBpbnRlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVbMF0gPCBpbnRlclswXSkgcmVtYWluaW5nLnB1c2goW3VbMF0sIGludGVyWzBdXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlclsxXSA8IHVbMV0pIHJlbWFpbmluZy5wdXNoKFtpbnRlclsxXSwgdVsxXV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1bmNvdmVyZWQgPSByZW1haW5pbmc7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZkluZGV4U2V0LmhhcyhqKSkge1xuICAgICAgICAgICAgICAgICAgICBuZWVkRGlza1NjYW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IHJlbW90ZU93bmVycy5nZXQoaik7XG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZU93bmVycy5zZXQoaiwgZXhpc3RpbmcgJiYgW01hdGgubWluKGV4aXN0aW5nWzBdLCBjbGFpbWVkWzBdKSwgTWF0aC5tYXgoZXhpc3RpbmdbMV0sIGNsYWltZWRbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IGNsYWltZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5lZWREaXNrU2NhbiAmJiAhcmVtb3RlT3duZXJzLnNpemUpIHJldHVybjtcbiAgICAgICAgY29uc29sZS5sb2coYEJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KTogZGlza1NjYW49JHtuZWVkRGlza1NjYW59LCByZW1vdGUgcHJldmlvdXMtd2luZG93IG93bmVyczogJHtyZW1vdGVPd25lcnMuc2l6ZX1gKTtcbiAgICAgICAgaWYgKG5lZWREaXNrU2Nhbikge1xuICAgICAgICAgICAgYXdhaXQgc3RvcmUucmVzY2FuQmFzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzaW5jZSA9IHdpbmRvd1N0YXJ0IC0gQk9VTkRBUllfU0NBTl9MT09LQkFDSztcbiAgICAgICAgZm9yIChsZXQgW3NvdXJjZUluZGV4LCByb3V0ZV0gb2YgcmVtb3RlT3duZXJzKSB7XG4gICAgICAgICAgICBsZXQgb3duZXJTb3VyY2UgPSBlZmZlY3RpdmUuc291cmNlc1tzb3VyY2VJbmRleF07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG93bmVyU291cmNlID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgc3RvcmUuYm91bmRhcnlTY2FuUmVtb3RlKGNyZWF0ZUFwaUFyY2hpdmVzKG93bmVyU291cmNlKSwgeyBzaW5jZSwgcm91dGUgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pIG9mIHByZXZpb3VzLXdpbmRvdyBvd25lciAoc291cmNlIGluZGV4ICR7c291cmNlSW5kZXh9KSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBib3VuZGFyeVNjYW5zUnVubmluZy5kZWxldGUoYnVja2V0S2V5KTtcbiAgICB9XG59XG5cbnR5cGUgU3RvcmVQbGFuID0ge1xuICAgIHNlbGZFbnRyaWVzOiBIb3N0ZWRDb25maWdbXTtcbiAgICBzZWxmOiBTZWxmU3VtbWFyeSB8IHVuZGVmaW5lZDtcbiAgICByYXdEaXNrOiBib29sZWFuO1xuICAgIHNvdXJjZVNwZWNzOiB7IHNvdXJjZUNvbmZpZz86IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZzsgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07IHJvdXRlPzogW251bWJlciwgbnVtYmVyXTsgbm9GdWxsU3luYz86IGJvb2xlYW4gfVtdO1xuICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICBzdHJ1Y3R1cmVLZXk6IHN0cmluZztcbn07XG5cbmNvbnN0IHJlc29sdmVkU291cmNlQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuLyoqIEEgY2FjaGVkIElBcmNoaXZlcyBmb3IgYSBwZXJzaXN0ZWQgc291cmNlIGlkZW50aXR5OiBhIHJvdXRpbmcgVVJMIChob3N0ZWQvYmFja2JsYXplKSBvciBhIGRpc2sgZm9sZGVyIHBhdGggLSB0aGUgZm9ybSBCbG9iU3RvcmUncyBzb3VyY2VzIGxpc3Qgc3RvcmVzLiBDb25maWd1cmF0aW9uICh2YWxpZCB3aW5kb3dzLCByb3V0ZXMpIGRlY2lkZXMgV0hFTiBhIHNvdXJjZSBzaG91bGQgYmUgdXNlZDsgZm9yIHJlYWRpbmcgYnl0ZXMgdGhlIGluZGV4IHNheXMgYSBzb3VyY2UgaG9sZHMsIHRoZSBVUkwgYWxvbmUgaXMgZW5vdWdoIC0gZXZlbiBmb3Igc291cmNlcyBubyBsb25nZXIgaW4gYW55IGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU291cmNlQXJjaGl2ZXModXJsOiBzdHJpbmcpOiBJQXJjaGl2ZXMge1xuICAgIGxldCBleGlzdGluZyA9IHJlc29sdmVkU291cmNlQXJjaGl2ZXMuZ2V0KHVybCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgbGV0IGFyY2hpdmVzOiBJQXJjaGl2ZXM7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgYXJjaGl2ZXMgPSBjcmVhdGVBcGlBcmNoaXZlcyhub3JtYWxpemVTb3VyY2UodXJsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJjaGl2ZXMgPSBuZXcgQXJjaGl2ZXNEaXNrKHVybCk7XG4gICAgfVxuICAgIHJlc29sdmVkU291cmNlQXJjaGl2ZXMuc2V0KHVybCwgYXJjaGl2ZXMpO1xuICAgIHJldHVybiBhcmNoaXZlcztcbn1cblxuZnVuY3Rpb24gc291cmNlSWRlbnRpdHkoc291cmNlQ29uZmlnOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghc291cmNlQ29uZmlnKSByZXR1cm4gXCJkaXNrXCI7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgLi4uc291cmNlQ29uZmlnLCB2YWxpZFdpbmRvdzogdW5kZWZpbmVkLCByb3V0ZTogdW5kZWZpbmVkIH0pO1xufVxuXG4vKiogT3VyIHJvbGUgaW4gYSBidWNrZXQncyByb3V0aW5nIGNvbmZpZywgc3VtbWFyaXplZCBhY3Jvc3MgQUxMIGN1cnJlbnRseS12YWxpZCBzZWxmIGVudHJpZXMuIFN0b3JlZCBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJlcHJlc2VudGF0aXZlIEhvc3RlZENvbmZpZywgc28gbm90aGluZyBjYW4gYWNjaWRlbnRhbGx5IHVzZSBvbmUgZW50cnkncyByb3V0ZSBvciBmbGFncyB3aGVyZSB0aGUgdW5pb24gaXMgcmVxdWlyZWQgLSB0aGUgc3RhbmRhcmQgY29uZmlnIGhhcyB0aGUgc2FtZSBVUkwgdHdpY2U6IGEgcm91dGVkIHdyaXRlLXNoYXJkIGVudHJ5IHBsdXMgYW4gdW5yb3V0ZWQgcmVhZC1ldmVyeXRoaW5nIGVudHJ5LiAqL1xuZXhwb3J0IHR5cGUgU2VsZlN1bW1hcnkgPSB7XG4gICAgLyoqIFRoZSB1bmlvbiBvZiB0aGUgY3VycmVudCBlbnRyaWVzJyByb3V0ZXMsIHdpdGggb3ZlcmxhcHBpbmcvYWRqYWNlbnQgcmFuZ2VzIGNvbWJpbmVkIC0gd2hpY2ggY29tbW9ubHkgY29sbGFwc2VzIHRvIGEgc2luZ2xlIGZ1bGwgcmFuZ2UsIG1ha2luZyBtYXRjaGluZyB0cml2aWFsLiAqL1xuICAgIHJvdXRlczogW251bWJlciwgbnVtYmVyXVtdO1xuICAgIHB1YmxpYzogYm9vbGVhbjtcbiAgICBpbW11dGFibGU6IGJvb2xlYW47XG4gICAgbm9GdWxsU3luYzogYm9vbGVhbjtcbiAgICByYXdEaXNrOiBib29sZWFuO1xuICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbn07XG5cbmZ1bmN0aW9uIG1lcmdlUm91dGVzKHJvdXRlczogKFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQpW10pOiBbbnVtYmVyLCBudW1iZXJdW10ge1xuICAgIGxldCBsaXN0ID0gcm91dGVzLm1hcCh4ID0+IHggfHwgRlVMTF9ST1VURSkubWFwKHggPT4gW3hbMF0sIHhbMV1dIGFzIFtudW1iZXIsIG51bWJlcl0pO1xuICAgIHNvcnQobGlzdCwgeCA9PiB4WzBdKTtcbiAgICBsZXQgbWVyZ2VkOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICBmb3IgKGxldCByb3V0ZSBvZiBsaXN0KSB7XG4gICAgICAgIGxldCBsYXN0ID0gbWVyZ2VkW21lcmdlZC5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGxhc3QgJiYgcm91dGVbMF0gPD0gbGFzdFsxXSkge1xuICAgICAgICAgICAgbGFzdFsxXSA9IE1hdGgubWF4KGxhc3RbMV0sIHJvdXRlWzFdKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1lcmdlZC5wdXNoKHJvdXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyoqIGFuY2hvciBpcyB0aGUgZmlyc3QgY3VycmVudGx5LXZhbGlkIGVudHJ5IChuZWFyZXN0LXdpbmRvdyB3aGVuIG5vbmUgY29udGFpbnMgbm93LCBtYXRjaGluZyBzZWxlY3RFbnRyeUF0KSAtIHRoZSBkZXRlcm1pbmlzdGljIHJlcHJlc2VudGF0aXZlIHVzZWQgb25seSBmb3IgcG9zaXRpb25hbCB0aGluZ3M6IHRoZSBzeW5jLXRvcG9sb2d5IGN1dCAoc2VsZkluZGV4KSBhbmQgdGhlIGRpc2tXaW5kb3cgc2VlZC4gRXZlcnl0aGluZyBiZWhhdmlvcmFsIGNvbWVzIGZyb20gdGhlIHN1bW1hcnksIHdoaWNoIHNwYW5zIGV2ZXJ5IGVudHJ5IHRoZSBhbmNob3IncyBncm91cCByZXByZXNlbnRzLiAqL1xuZnVuY3Rpb24gc3VtbWFyaXplU2VsZihzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW10sIG5vdzogbnVtYmVyKTogeyBzdW1tYXJ5OiBTZWxmU3VtbWFyeSB8IHVuZGVmaW5lZDsgYW5jaG9yOiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQgfSB7XG4gICAgbGV0IGN1cnJlbnQgPSBzZWxmRW50cmllcy5maWx0ZXIoeCA9PiB4LnZhbGlkV2luZG93WzBdIDw9IG5vdyAmJiBub3cgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoIWN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICAgIGxldCBuZWFyZXN0ID0gc2VsZWN0RW50cnlBdChzZWxmRW50cmllcywgbm93KTtcbiAgICAgICAgY3VycmVudCA9IG5lYXJlc3QgJiYgW25lYXJlc3RdIHx8IFtdO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7IHN1bW1hcnk6IHVuZGVmaW5lZCwgYW5jaG9yOiB1bmRlZmluZWQgfTtcbiAgICB9XG4gICAgbGV0IHN1bW1hcnk6IFNlbGZTdW1tYXJ5ID0ge1xuICAgICAgICByb3V0ZXM6IG1lcmdlUm91dGVzKGN1cnJlbnQubWFwKHggPT4geC5yb3V0ZSkpLFxuICAgICAgICBwdWJsaWM6IGN1cnJlbnQuc29tZSh4ID0+IHgucHVibGljKSxcbiAgICAgICAgaW1tdXRhYmxlOiBjdXJyZW50LnNvbWUoeCA9PiB4LmltbXV0YWJsZSksXG4gICAgICAgIG5vRnVsbFN5bmM6IGN1cnJlbnQuc29tZSh4ID0+IHgubm9GdWxsU3luYyksXG4gICAgICAgIHJhd0Rpc2s6IGN1cnJlbnQuc29tZSh4ID0+IHgucmF3RGlzayksXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdDogY3VycmVudC5maW5kKHggPT4geC5yZWFkZXJEaXNrTGltaXQgIT09IHVuZGVmaW5lZCk/LnJlYWRlckRpc2tMaW1pdCxcbiAgICB9O1xuICAgIHJldHVybiB7IHN1bW1hcnksIGFuY2hvcjogY3VycmVudFswXSB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcpOiBTdG9yZVBsYW4ge1xuICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhyb3V0aW5nLCBhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgc2VsZkVudHJpZXMgPSBzZWxmSW5kZXhlcy5tYXAoaSA9PiByb3V0aW5nLnNvdXJjZXNbaV0gYXMgSG9zdGVkQ29uZmlnKTtcbiAgICBsZXQgeyBzdW1tYXJ5OiBzZWxmLCBhbmNob3IgfSA9IHN1bW1hcml6ZVNlbGYoc2VsZkVudHJpZXMsIERhdGUubm93KCkpO1xuICAgIGxldCBzZWxmSW5kZXggPSAtMTtcbiAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgIHNlbGZJbmRleCA9IHJvdXRpbmcuc291cmNlcy5pbmRleE9mKGFuY2hvcik7XG4gICAgfVxuICAgIGxldCBkaXNrV2luZG93OiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IGFuY2hvci52YWxpZFdpbmRvdztcbiAgICAgICAgbGV0IG1lcmdlZCA9IHRydWU7XG4gICAgICAgIHdoaWxlIChtZXJnZWQpIHtcbiAgICAgICAgICAgIG1lcmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2Ygc2VsZkVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgW2VudHJ5U3RhcnQsIGVudHJ5RW5kXSA9IGVudHJ5LnZhbGlkV2luZG93O1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeVN0YXJ0ID4gZW5kIHx8IGVudHJ5RW5kIDwgc3RhcnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeVN0YXJ0IDwgc3RhcnQgfHwgZW50cnlFbmQgPiBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgZW50cnlTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IE1hdGgubWF4KGVuZCwgZW50cnlFbmQpO1xuICAgICAgICAgICAgICAgICAgICBtZXJnZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkaXNrV2luZG93ID0gW3N0YXJ0LCBlbmRdO1xuICAgIH1cbiAgICBsZXQgb3duSW5kZXhlcyA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgIGxldCBzb3VyY2VTcGVjczogU3RvcmVQbGFuW1wic291cmNlU3BlY3NcIl0gPSBbe1xuICAgICAgICB2YWxpZFdpbmRvdzogZGlza1dpbmRvdyxcbiAgICB9XTtcbiAgICBpZiAoc2VsZiAmJiBzZWxmSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzZWxmSW5kZXggKyAxOyBpIDwgcm91dGluZy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gcm91dGluZy5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgb3duSW5kZXhlcy5oYXMoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gT25lIHNwZWMgcGVyIGludGVyc2VjdGlvbiBzZWdtZW50OiBhIHBlZXIncyByb3V0ZSBjYW4gb3ZlcmxhcCBzZXZlcmFsIG9mIG91ciAoZGlzam9pbnQpIHJvdXRlIHNsaWNlcywgYW5kIGVhY2ggc2xpY2UgYmVjb21lcyBpdHMgb3duIHN5bmMtc291cmNlIHNsb3QgKHNhbWUtVVJMIG11bHRpLXNsb3QgaXMgYWxyZWFkeSB0aGUgc3VwcG9ydGVkIHNoYXBlKVxuICAgICAgICAgICAgZm9yIChsZXQgc2VsZlJvdXRlIG9mIHNlbGYucm91dGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoYXJlZFJvdXRlID0gcm91dGVJbnRlcnNlY3Rpb24oc2VsZlJvdXRlLCBzb3VyY2Uucm91dGUpO1xuICAgICAgICAgICAgICAgIGlmICghc2hhcmVkUm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNvdXJjZVNwZWNzLnB1c2goeyBzb3VyY2VDb25maWc6IHNvdXJjZSwgdmFsaWRXaW5kb3c6IHNvdXJjZS52YWxpZFdpbmRvdywgcm91dGU6IHNoYXJlZFJvdXRlLCBub0Z1bGxTeW5jOiBzb3VyY2Uubm9GdWxsU3luYyB8fCBzZWxmLm5vRnVsbFN5bmMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJhd0Rpc2sgPSAhIXNlbGY/LnJhd0Rpc2s7XG4gICAgbGV0IHN0cnVjdHVyZUtleSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcmF3RGlzayxcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0OiBzZWxmPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc2VsZkVudHJpZXMsIHNlbGYsIHJhd0Rpc2ssIHNvdXJjZVNwZWNzLCByZWFkZXJEaXNrTGltaXQ6IHNlbGY/LnJlYWRlckRpc2tMaW1pdCwgc3RydWN0dXJlS2V5IH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcsIHBsYW4/OiBTdG9yZVBsYW4pOiBMb2FkZWRCdWNrZXQge1xuICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFwbGFuKSB7XG4gICAgICAgIHBsYW4gPSBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpO1xuICAgIH1cbiAgICBsZXQgeyBzZWxmRW50cmllcywgc2VsZiB9ID0gcGxhbjtcbiAgICBsZXQgc3RvcmU6IElCdWNrZXRTdG9yZTtcbiAgICBpZiAocGxhbi5yYXdEaXNrKSB7XG4gICAgICAgIHN0b3JlID0gbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc2VsZikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFRoaXMgc2VydmVyIGlzIG5vdCBpbiB0aGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IG5vIGxvbmdlciBzeW5jaHJvbml6aW5nLCB2YWxpZCB3aW5kb3cgdHJlYXRlZCBhcyBbMCwgMF0gKGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5KSwgZGlzayBkYXRhIGtlcHQgYW5kIHNlcnZlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gcGxhbi5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiAoe1xuICAgICAgICAgICAgc291cmNlOiBzcGVjLnNvdXJjZUNvbmZpZyAmJiBjcmVhdGVBcGlBcmNoaXZlcyhzcGVjLnNvdXJjZUNvbmZpZykgfHwgbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpLFxuICAgICAgICAgICAgdXJsOiBzcGVjLnNvdXJjZUNvbmZpZz8udXJsIHx8IGZvbGRlcixcbiAgICAgICAgICAgIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LFxuICAgICAgICAgICAgcm91dGU6IHNwZWMucm91dGUsXG4gICAgICAgICAgICBub0Z1bGxTeW5jOiBzcGVjLm5vRnVsbFN5bmMsXG4gICAgICAgICAgICBpbnRlcm1lZGlhdGU6IHNwZWMuc291cmNlQ29uZmlnPy5pbnRlcm1lZGlhdGUsXG4gICAgICAgICAgICBpZGVudGl0eTogc291cmNlSWRlbnRpdHkoc3BlYy5zb3VyY2VDb25maWcpLFxuICAgICAgICB9KSk7XG4gICAgICAgIHN0b3JlID0gbmV3IEJsb2JTdG9yZShmb2xkZXIsIHNvdXJjZXMsIHtcbiAgICAgICAgICAgIG9uSW5kZXhDaGFuZ2VkOiBrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHZvaWQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogcGxhbi5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgICAgICBvbldyaXRlQ291bnRlZDogKGtpbmQsIGJ5dGVzKSA9PiBjb3VudEJ1Y2tldFdyaXRlKGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gLCBraW5kLCBieXRlcyksXG4gICAgICAgICAgICByZXNvbHZlU291cmNlVXJsOiByZXNvbHZlU291cmNlQXJjaGl2ZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkOiBMb2FkZWRCdWNrZXQgPSB7IGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHJvdXRpbmdKU09OOiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSwgc2VsZkVudHJpZXMsIHNlbGYsIHN0b3JlLCBzdHJ1Y3R1cmVLZXk6IHBsYW4uc3RydWN0dXJlS2V5IH07XG4gICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICBzY2hlZHVsZUJvdW5kYXJ5U2NhbnMobG9hZGVkKTtcbiAgICAvLyBBIGxvYWRlZCBidWNrZXQgbXVzdCBhY3R1YWxseSBiZSBydW5uaW5nOiB0aGUgc3RvcmUncyBpbml0IGxvYWRzIGl0cyBpbmRleCBhbmQgc3RhcnRzIGl0cyBzb3VyY2Ugc3luY2hyb25pemF0aW9uLCBhbmQgaXQgaXMgbGF6eSwgc28gd2l0aG91dCB0aGlzIGEgYnVja2V0IG5vdGhpbmcgaGFzIHJlYWQgZnJvbSBvciB3cml0dGVuIHRvIHNpdHMgaW5lcnQgLSByZXBvcnRpbmcgbm8gZGF0YSBhbmQgbm8gc3luY2luZyB3aGlsZSBpdHMgZGlzayBpcyBmdWxsIG9mIGZpbGVzLlxuICAgIGlmIChzdG9yZSBpbnN0YW5jZW9mIEJsb2JTdG9yZSkge1xuICAgICAgICB2b2lkIHN0b3JlLmluaXQoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEluaXRpYWxpemluZyB0aGUgc3RvcmUgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgfVxuICAgIHJldHVybiBsb2FkZWQ7XG59XG5cbi8qKiBUaGUgcm91dGluZyBmaWxlIGlzIG91cnMsIG9uIG91ciBvd24gZGlzaywgYXQgYSBwYXRoIHdlIGtub3cgLSBzbyBpdCBpcyByZWFkIGRpcmVjdGx5LiBHb2luZyB0aHJvdWdoIGFuIEFyY2hpdmVzRGlzayB3b3VsZCBjb25zdHJ1Y3QgYSB3aG9sZSBzdG9yZSAoaGFuZGxlIGNhY2hlIHN3ZWVwIGxvb3AsIHVwbG9hZHMtZm9sZGVyIGNsZWFudXApIGp1c3QgdG8gcmVhZCBvbmUgZmlsZS4gKi9cbmZ1bmN0aW9uIGdldFJvdXRpbmdGaWxlUGF0aChmb2xkZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihmb2xkZXIsIFwiZmlsZXNcIiwgUk9VVElOR19GSUxFKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSb3V0aW5nRmlsZShmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGdldFJvdXRpbmdGaWxlUGF0aChmb2xkZXIpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBkYXRhID0gYXdhaXQgcmVhZFJvdXRpbmdGaWxlKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSk7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgcm91dGluZyA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFyb3V0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGxvYWRlZCA9IGxvYWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgbG9hZGVkKTtcbiAgICAgICAgdm9pZCBsb2FkZWQudGhlbihidWNrZXQgPT4ge1xuICAgICAgICAgICAgaWYgKCFidWNrZXQgJiYgYnVja2V0cy5nZXQoa2V5KSA9PT0gbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGJ1Y2tldHMuZ2V0KGtleSkgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldHMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZGVkO1xufVxuXG5cbmNvbnN0IHJvdXRpbmdSZWxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5mdW5jdGlvbiBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbmV4dCA9IChyb3V0aW5nUmVsb2Fkcy5nZXQoa2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgICAgLnRoZW4oKCkgPT4gY2hlY2tSb3V0aW5nQ2hhbmdlZChhY2NvdW50LCBidWNrZXROYW1lLCBjb25maWcpKVxuICAgICAgICAuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKGBSZWxvYWRpbmcgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOmAsIGUpKTtcbiAgICByb3V0aW5nUmVsb2Fkcy5zZXQoa2V5LCBuZXh0KTtcbiAgICByZXR1cm4gbmV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tSb3V0aW5nQ2hhbmdlZChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnPzogeyBmb3JjZT86IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghcm91dGluZykgcmV0dXJuO1xuICAgIGlmICghY29uZmlnPy5mb3JjZSAmJiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSA9PT0gbG9hZGVkLnJvdXRpbmdKU09OKSByZXR1cm47XG4gICAgbGV0IHJlYXNvbiA9IGNvbmZpZz8uZm9yY2UgJiYgKGNvbmZpZy5yZWFzb24gfHwgXCJmb3JjZWRcIikgfHwgXCJyb3V0aW5nIGNvbmZpZyBjaGFuZ2VkXCI7XG4gICAgbGV0IHBsYW4gPSBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpO1xuICAgIGlmIChwbGFuLnN0cnVjdHVyZUtleSA9PT0gbG9hZGVkLnN0cnVjdHVyZUtleSAmJiBsb2FkZWQuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFwcGx5aW5nIHRoZSByb3V0aW5nIGNvbmZpZyB0byB0aGUgcnVubmluZyBzdG9yZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KWApO1xuICAgICAgICBsb2FkZWQuc3RvcmUudXBkYXRlU291cmNlcyhwbGFuLnNvdXJjZVNwZWNzLm1hcChzcGVjID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbmZpZyA9IHNwZWMuc291cmNlQ29uZmlnO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VDb25maWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBpZGVudGl0eTogc291cmNlSWRlbnRpdHkodW5kZWZpbmVkKSwgdXJsOiBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSksIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LCBjcmVhdGU6ICgpOiBJQXJjaGl2ZXMgPT4gbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHVybDogc291cmNlQ29uZmlnLnVybCxcbiAgICAgICAgICAgICAgICB2YWxpZFdpbmRvdzogc3BlYy52YWxpZFdpbmRvdyxcbiAgICAgICAgICAgICAgICByb3V0ZTogc3BlYy5yb3V0ZSxcbiAgICAgICAgICAgICAgICBub0Z1bGxTeW5jOiBzcGVjLm5vRnVsbFN5bmMsXG4gICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlOiBzb3VyY2VDb25maWcuaW50ZXJtZWRpYXRlLFxuICAgICAgICAgICAgICAgIGNyZWF0ZTogKCkgPT4gY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlQ29uZmlnKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQ6IExvYWRlZEJ1Y2tldCA9IHsgLi4ubG9hZGVkLCByb3V0aW5nLCByb3V0aW5nSlNPTjogSlNPTi5zdHJpbmdpZnkocm91dGluZyksIHNlbGZFbnRyaWVzOiBwbGFuLnNlbGZFbnRyaWVzLCBzZWxmOiBwbGFuLnNlbGYgfTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUodXBkYXRlZCkpO1xuICAgICAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZCh1cGRhdGVkKTtcbiAgICAgICAgc2NoZWR1bGVCb3VuZGFyeVNjYW5zKHVwZGF0ZWQpO1xuICAgICAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBSZWJ1aWxkaW5nIHRoZSBzdG9yZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KWApO1xuICAgIGlmIChsb2FkZWQuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZywgcGxhbikpKTtcbiAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xufVxuXG5mdW5jdGlvbiBnZXRXcml0ZUNvbmZpZyhidWNrZXQ6IExvYWRlZEJ1Y2tldCwgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB7IGZhc3Q/OiBib29sZWFuOyB3cml0ZURlbGF5PzogbnVtYmVyIH0ge1xuICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChidWNrZXQuc2VsZkVudHJpZXMsIHdyaXRlVGltZSwgcm91dGUpO1xuICAgIHJldHVybiB7IGZhc3Q6IHNlbGY/LmZhc3QsIHdyaXRlRGVsYXk6IHNlbGY/LndyaXRlRGVsYXkgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydE11dGFibGUoYnVja2V0OiBMb2FkZWRCdWNrZXQsIGZpbGVQYXRoOiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KGJ1Y2tldC5zZWxmRW50cmllcywgd3JpdGVUaW1lLCBnZXRSb3V0ZShmaWxlUGF0aCkpO1xuICAgIGlmICghc2VsZj8uaW1tdXRhYmxlKSByZXR1cm47XG4gICAgaWYgKGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRJbmZvKGZpbGVQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2J1Y2tldC5hY2NvdW50fS8ke2J1Y2tldC5idWNrZXROYW1lfSBpcyBpbW11dGFibGUgKGF0IHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9KSBhbmQgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IGFscmVhZHkgZXhpc3RzLCBzbyBpdCBjYW5ub3QgYmUgd3JpdHRlbiB0b2ApO1xuICAgIH1cbn1cblxuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbmxldCBsYXN0V3JvbmdUYXJnZXRMb2cgPSAwO1xuZnVuY3Rpb24gbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0V3JvbmdUYXJnZXRMb2cgPCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFKSByZXR1cm47XG4gICAgbGFzdFdyb25nVGFyZ2V0TG9nID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cblxuY29uc3Qgcm91dGluZ1dyaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgaW5jb21pbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgYXdhaXQgbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgaW5jb21pbmcpKSk7XG4gICAgICAgIGJyb2FkY2FzdFJvdXRpbmdDaGFuZ2VkKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkIGJ1Y2tldCAke2tleX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpICE9PSBsb2FkZWQucm91dGluZ0pTT04gJiYgZ2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZykgPD0gZ2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZykpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBgQ2Fubm90IHVwZGF0ZSByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fTogdGhlIG5ldyBjb25maWcgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IG9uZSBidXQgaXRzIHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZyl9KSBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZyl9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC4gQ3VycmVudDogJHtsb2FkZWQucm91dGluZ0pTT059LiBBdHRlbXB0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpfWA7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgbGV0IHN0b3JlZCA9IGluY29taW5nO1xuICAgIGxldCByZWluamVjdGVkID0gMDtcbiAgICBmb3IgKGxldCBpbnRlcm1lZGlhdGUgb2YgZ2V0SW50ZXJtZWRpYXRlU291cmNlcyhleHBpcmVJbnRlcm1lZGlhdGVTb3VyY2VzKGxvYWRlZC5yb3V0aW5nLCBEYXRlLm5vdygpKSkpIHtcbiAgICAgICAgc3RvcmVkID0gaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlKHN0b3JlZCwge1xuICAgICAgICAgICAgc3BsaXRVcmw6IGZpbmRTcGxpdFVybChsb2FkZWQucm91dGluZywgaW50ZXJtZWRpYXRlKSB8fCBpbnRlcm1lZGlhdGUudXJsLFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlVXJsOiBpbnRlcm1lZGlhdGUudXJsLFxuICAgICAgICAgICAgc3RhcnQ6IGludGVybWVkaWF0ZS52YWxpZFdpbmRvd1swXSxcbiAgICAgICAgICAgIGVuZDogaW50ZXJtZWRpYXRlLnZhbGlkV2luZG93WzFdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVpbmplY3RlZCsrO1xuICAgIH1cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSAhPT0gSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZS1pbmplY3RlZCAke3JlaW5qZWN0ZWR9IGluLWZsaWdodCBzd2l0Y2hvdmVyIHdpbmRvd3MgaW50byB0aGUgaW5jb21pbmcgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKGluY29taW5nKX0pYCk7XG4gICAgfVxuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoUk9VVElOR19GSUxFLCBCdWZmZXIuZnJvbShzZXJpYWxpemVSZW1vdGVDb25maWcoc3RvcmVkKSksIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7IGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjsgaW50ZXJuYWw/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgaWYgKGZpbGVQYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICBsZXQgcnVuID0gKHJvdXRpbmdXcml0ZXMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oKCkgPT4gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQsIGJ1Y2tldE5hbWUsIGRhdGEsIGNvbmZpZykpO1xuICAgICAgICByb3V0aW5nV3JpdGVzLnNldChrZXksIHJ1bi50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBydW47XG4gICAgfVxuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgfVxuICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWc/Lmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpO1xuICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVQYXRoKTtcbiAgICBpZiAoIWNvbmZpZz8ubGFzdE1vZGlmaWVkICYmIGxvYWRlZC5zZWxmRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IGxvYWRlZC5zZWxmRW50cmllcy5maWx0ZXIoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICAgICAgaWYgKCF0aW1lVmFsaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSB0byBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgYWxsIG91ciB2YWxpZCB3aW5kb3dzICR7SlNPTi5zdHJpbmdpZnkobG9hZGVkLnNlbGZFbnRyaWVzLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0gKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBUaGlzIHNlcnZlciBpcyBub3QgYSB2YWxpZCB3cml0ZSB0YXJnZXQgYXQgJHt3cml0ZVRpbWV9IGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgdmFsaWQgd2luZG93czogJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSkuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBUaGlzIHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0pIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbmZpZz8uZm9yY2VTZXRJbW11dGFibGUpIHtcbiAgICAgICAgaWYgKCFjb25maWcubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcmNlU2V0SW1tdXRhYmxlIHJlcXVpcmVzIGxhc3RNb2RpZmllZCAoc3luY2hyb25pemF0aW9uIHdyaXRlcyBhcmUgb3JkZXJlZCBieSB0aGVpciB3cml0ZSB0aW1lKSwgd3JpdGluZyAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIEltbXV0YWJpbGl0eSB3aW5zOiBhbiBleGlzdGluZyBwYXRoIGlzIGtlcHQgaW5zdGVhZCBvZiB0aGUgcHVzaCB0aHJvd2luZyAoc2VlIFNldENvbmZpZy5mb3JjZVNldEltbXV0YWJsZSlcbiAgICAgICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KGxvYWRlZC5zZWxmRW50cmllcywgd3JpdGVUaW1lLCByb3V0ZSk7XG4gICAgICAgIGlmIChzZWxmPy5pbW11dGFibGUgJiYgYXdhaXQgbG9hZGVkLnN0b3JlLmdldEluZm8oZmlsZVBhdGgpKSByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShsb2FkZWQsIGZpbGVQYXRoLCB3cml0ZVRpbWUpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnPy5pbnRlcm5hbCkge1xuICAgICAgICBpZiAoIWNvbmZpZy5sYXN0TW9kaWZpZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgd3JpdGVzIG11c3QgY2FycnkgbGFzdE1vZGlmaWVkICh0aGV5IGFyZSBzeW5jaHJvbml6YXRpb24gcHVzaGVzLCBvcmRlcmVkIGJ5IHRoZWlyIHdyaXRlIHRpbWUpLCB3cml0aW5nICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSB0byBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VlIFNldENvbmZpZy5pbnRlcm5hbDogdGhlIHN0YW1wIG11c3QgbGFuZCBpbnNpZGUgU09NRSB3aW5kb3crcm91dGUgdGhpcyBzZXJ2ZXIgaXMgY29uZmlndXJlZCBmb3IgKGFueSB3aW5kb3csIGluY2x1ZGluZyBwYXN0IG9uZXMgLSBzeW5jaHJvbml6YXRpb24gbW92ZXMgb2xkIGRhdGEpLCBzbyBhIGNvbmZ1c2VkIHBlZXIgY2FuJ3Qgc3R1ZmYgZGF0YSBvbnRvIGEgbm9kZSB0aGF0IHdhcyBuZXZlciBtZWFudCB0byBob2xkIGl0XG4gICAgICAgIGxldCBjb3ZlcmVkID0gbG9hZGVkLnNlbGZFbnRyaWVzLnNvbWUoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdICYmIHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKCFjb3ZlcmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSB0byBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IHJlamVjdGVkOiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGF0IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgZXZlcnkgd2luZG93L3JvdXRlIHRoaXMgc2VydmVyIGlzIGNvbmZpZ3VyZWQgZm9yOiAke0pTT04uc3RyaW5naWZ5KGxvYWRlZC5zZWxmRW50cmllcy5tYXAoeCA9PiAoeyB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2FkZWQuc3RvcmUuc2V0SW50ZXJuYWwpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXRJbnRlcm5hbChmaWxlUGF0aCwgZGF0YSwgeyBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyByYXdEaXNrIHN0b3JlczogdGhlIG5vcm1hbCBzZXQgYWxyZWFkeSBJUyB0aGUgZGlza1xuICAgICAgICBhd2FpdCBsb2FkZWQuc3RvcmUuc2V0KGZpbGVQYXRoLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogd3JpdGVUaW1lIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoZmlsZVBhdGgsIGRhdGEsIHsgLi4uZ2V0V3JpdGVDb25maWcobG9hZGVkLCB3cml0ZVRpbWUsIHJvdXRlKSwgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWNrZXRDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQpOiBBcmNoaXZlc0NvbmZpZyB7XG4gICAgbGV0IHByb2dyZXNzID0gYnVja2V0LnN0b3JlLmdldFN5bmNQcm9ncmVzcz8uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gTmF0aXZlIGNoYW5nZS1mZWVkIHN1cHBvcnQgPSB0aGUgc3RvcmUga2VlcHMgYW4gaW5kZXggKHJhd0Rpc2sgYnVja2V0cyBlbXVsYXRlIGdldENoYW5nZXNBZnRlcjIgd2l0aCBhIGZ1bGwgbGlzdGluZykgLSBjbGllbnRzIHVzZSB0aGlzIHRvIHBpY2sgdGhlaXIgc2NhbiBjYWRlbmNlXG4gICAgICAgIHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiBidWNrZXQuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUsXG4gICAgICAgIHJlbW90ZUNvbmZpZzogYnVja2V0LnJvdXRpbmcsXG4gICAgICAgIGluZGV4OiBwcm9ncmVzcz8uaW5kZXgsXG4gICAgICAgIGluZGV4U291cmNlczogcHJvZ3Jlc3M/LnNvdXJjZXMsXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdDogcHJvZ3Jlc3M/LnJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgc3luY2luZzogcHJvZ3Jlc3M/LnN5bmNpbmcsXG4gICAgfTtcbn1cblxuLyoqIFdoaWNoIGJ1Y2tldHMgdGhpcyBwcm9jZXNzIGN1cnJlbnRseSBoYXMgbG9hZGVkIC0gd2hhdCBhIGRlcGxveSBzdWNjZXNzb3IgYXNrcyBpdHMgcHJlZGVjZXNzb3IgZm9yLCBzbyBpdCBhY3RpdmF0ZXMgZXhhY3RseSB0aGUgYnVja2V0cyB0aGF0IGFyZSBhY3R1YWxseSBpbiB1c2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlQnVja2V0S2V5cygpOiB7IGFjY291bnQ6IHN0cmluZzsgYnVja2V0TmFtZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIFsuLi5idWNrZXRzLmtleXMoKV0ubWFwKGtleSA9PiB7XG4gICAgICAgIGxldCBzbGFzaCA9IGtleS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgcmV0dXJuIHsgYWNjb3VudDoga2V5LnNsaWNlKDAsIHNsYXNoKSwgYnVja2V0TmFtZToga2V5LnNsaWNlKHNsYXNoICsgMSkgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYnVpbGRBbGxMb2FkZWRCdWNrZXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IGtleSBvZiBbLi4uYnVja2V0cy5rZXlzKCldKSB7XG4gICAgICAgIGxldCBzbGFzaCA9IGtleS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGtleS5zbGljZSgwLCBzbGFzaCksIGtleS5zbGljZShzbGFzaCArIDEpLCB7IGZvcmNlOiB0cnVlLCByZWFzb246IFwiYWxsIGxvYWRlZCBidWNrZXRzIHdlcmUgYXNrZWQgdG8gcmVidWlsZFwiIH0pO1xuICAgIH1cbn1cblxuY29uc3QgT1dOX0NPTkZJR19XUklURV9USFJPVFRMRSA9IDMwICogMTAwMDtcbmNvbnN0IElOVEVSTUVESUFURV9NQUlOVEFJTl9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIFBlciBidWNrZXQsIG5vdCBnbG9iYWw6IGEgc3dpdGNob3ZlciBoYXMgdG8gd3JpdGUgZXZlcnkgYnVja2V0J3Mgd2luZG93cyBhdCBvbmNlLCBhbmQgYSBzaGFyZWQgdGhyb3R0bGUgd291bGQgbGV0IG9ubHkgb25lIGJ1Y2tldCB0aHJvdWdoIHBlciBpbnRlcnZhbFxuY29uc3QgbGFzdE93bkNvbmZpZ1dyaXRlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVPd25Sb3V0aW5nQ29uZmlnKGxvYWRlZDogTG9hZGVkQnVja2V0LCB1cGRhdGVkOiBSZW1vdGVDb25maWcsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IHNpbmNlTGFzdCA9IERhdGUubm93KCkgLSAobGFzdE93bkNvbmZpZ1dyaXRlLmdldChrZXkpIHx8IDApO1xuICAgIGlmIChzaW5jZUxhc3QgPCBPV05fQ09ORklHX1dSSVRFX1RIUk9UVExFKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBOb3Qgd3JpdGluZyBvdXIgb3duIHJvdXRpbmcgY29uZmlnIHVwZGF0ZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KTogdGhlIGxhc3Qgb25lIHdhcyAke3NpbmNlTGFzdH1tcyBhZ28sIHVuZGVyIHRoZSAke09XTl9DT05GSUdfV1JJVEVfVEhST1RUTEV9bXMgdGhyb3R0bGUuIFJldHJ5aW5nIG9uIHRoZSBuZXh0IG1haW50ZW5hbmNlIHBhc3MuIFdhbnRlZDogJHtKU09OLnN0cmluZ2lmeSh1cGRhdGVkKX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0T3duQ29uZmlnV3JpdGUuc2V0KGtleSwgRGF0ZS5ub3coKSk7XG4gICAgbGV0IHZlcnNpb24gPSBuZXh0SW50ZXJtZWRpYXRlVmVyc2lvbihnZXRDb25maWdWZXJzaW9uKGxvYWRlZC5yb3V0aW5nKSk7XG4gICAgbGV0IG5leHQ6IFJlbW90ZUNvbmZpZyA9IHsgLi4udXBkYXRlZCwgdmVyc2lvbiB9O1xuICAgIGNvbnNvbGUubG9nKGBXcml0aW5nICR7Uk9VVElOR19GSUxFfSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KSwgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSAtPiAke3ZlcnNpb259OiAke0pTT04uc3RyaW5naWZ5KG5leHQpfWApO1xuICAgIGxldCBkYXRhID0gQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKG5leHQpKTtcbiAgICBhd2FpdCB3cml0ZUJ1Y2tldEZpbGUobG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lLCBST1VUSU5HX0ZJTEUsIGRhdGEpO1xuICAgIGF3YWl0IHByb3BhZ2F0ZVJvdXRpbmdDb25maWcobG9hZGVkLCBuZXh0LCBkYXRhKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvcGFnYXRlUm91dGluZ0NvbmZpZyhsb2FkZWQ6IExvYWRlZEJ1Y2tldCwgbmV4dDogUmVtb3RlQ29uZmlnLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgdGFyZ2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWc+KCk7XG4gICAgZm9yIChsZXQgc291cmNlIG9mIFsuLi5sb2FkZWQucm91dGluZy5zb3VyY2VzLCAuLi5uZXh0LnNvdXJjZXNdKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZS5pbnRlcm1lZGlhdGUpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQuYWNjb3VudCAhPT0gbG9hZGVkLmFjY291bnQgfHwgcGFyc2VkLmJ1Y2tldE5hbWUgIT09IGxvYWRlZC5idWNrZXROYW1lKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0cy5oYXMoc291cmNlLnVybCkpIGNvbnRpbnVlO1xuICAgICAgICB0YXJnZXRzLnNldChzb3VyY2UudXJsLCBzb3VyY2UpO1xuICAgIH1cbiAgICBmb3IgKGxldCBbdXJsLCBzb3VyY2VdIG9mIHRhcmdldHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZSkuc2V0KFJPVVRJTkdfRklMRSwgZGF0YSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgV3JvdGUgJHtST1VUSU5HX0ZJTEV9IGZvciBidWNrZXQgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX0gdG8gJHt1cmx9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb3BhZ2F0aW5nIG91ciByb3V0aW5nIGNvbmZpZyB1cGRhdGUgdG8gJHt1cmx9IGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbnRhaW5JbnRlcm1lZGlhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIGxldCB0YWtlb3ZlciA9IGdldFRha2VvdmVySW50ZXJtZWRpYXRlKCk7XG4gICAgbGV0IHdyaXR0ZW46IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGFscmVhZHlDb3JyZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBub3RPdXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgIC8vIE9OTFkgYnVja2V0cyBhbHJlYWR5IGluIG1lbW9yeS4gQSBzd2l0Y2hvdmVyIG11c3QgbmV2ZXIgbG9hZCBhIGJ1Y2tldDogbG9hZGluZyBzdGFydHMgaXRzIHN5bmNocm9uaXphdGlvbiwgYW5kIGJ1Y2tldHMgbm90aGluZyBoYXMgdG91Y2hlZCAobGVnYWN5IG9uZXMgZXNwZWNpYWxseSkgaGF2ZSBubyB3cml0ZXMgdG8gaGFuZCBvZmYgaW4gdGhlIGZpcnN0IHBsYWNlLiBPbmUgdGhhdCBkb2VzIGdldCB1c2VkIG1pZC1zd2l0Y2hvdmVyIGxvYWRzIG9uIHRoYXQgYWNjZXNzLCBhbmQgdGhlIG5leHQgcGFzcyBnaXZlcyBpdCBpdHMgd2luZG93LlxuICAgIGxldCBrZXlzID0gWy4uLmJ1Y2tldHMua2V5cygpXTtcbiAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgICBsZXQgbG9hZGVkUHJvbWlzZSA9IGJ1Y2tldHMuZ2V0KGtleSk7XG4gICAgICAgIGlmICghbG9hZGVkUHJvbWlzZSkgY29udGludWU7XG4gICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBsb2FkZWRQcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICghbG9hZGVkKSBjb250aW51ZTtcbiAgICAgICAgbGV0IGV4cGlyZWQgPSBleHBpcmVJbnRlcm1lZGlhdGVTb3VyY2VzKGxvYWRlZC5yb3V0aW5nLCBEYXRlLm5vdygpKTtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGV4cGlyZWQpICE9PSBKU09OLnN0cmluZ2lmeShsb2FkZWQucm91dGluZykpIHtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlT3duUm91dGluZ0NvbmZpZyhsb2FkZWQsIGV4cGlyZWQsIGBzd2l0Y2hvdmVyIHdpbmRvd3MgZXhwaXJlZCBtb3JlIHRoYW4gJHtJTlRFUk1FRElBVEVfRVhQSVJFX0dSQUNFIC8gMTAwMH1zIGFnb2ApO1xuICAgICAgICAgICAgd3JpdHRlbi5wdXNoKGtleSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRha2VvdmVyKSBjb250aW51ZTtcbiAgICAgICAgbGV0IG1haW5VcmwgPSBsb2FkZWQucm91dGluZy5zb3VyY2VzLmZpbmQoeCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIgfHwgeC50eXBlICE9PSBcInJlbW90ZVwiIHx8IHguaW50ZXJtZWRpYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoeC51cmwpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZC5hZGRyZXNzID09PSBkb21haW4gJiYgcGFyc2VkLnBvcnQgPT09IHBvcnQ7XG4gICAgICAgIH0pIGFzIEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFtYWluVXJsKSB7XG4gICAgICAgICAgICBub3RPdXJzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbmplY3RlZCA9IGluamVjdEludGVybWVkaWF0ZVNvdXJjZShsb2FkZWQucm91dGluZywge1xuICAgICAgICAgICAgc3BsaXRVcmw6IG1haW5VcmwudXJsLFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlVXJsOiByZXBsYWNlSG9zdGVkVXJsUG9ydChtYWluVXJsLnVybCwgdGFrZW92ZXIuYWx0UG9ydCksXG4gICAgICAgICAgICBzdGFydDogdGFrZW92ZXIuc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHRha2VvdmVyLmVuZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShpbmplY3RlZCkgPT09IEpTT04uc3RyaW5naWZ5KGxvYWRlZC5yb3V0aW5nKSkge1xuICAgICAgICAgICAgYWxyZWFkeUNvcnJlY3QucHVzaChrZXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd3JpdGVPd25Sb3V0aW5nQ29uZmlnKGxvYWRlZCwgaW5qZWN0ZWQsIGB3ZSBhcmUgYSBkZXBsb3kgc3VjY2Vzc29yOiB3cml0ZXMgcm91dGUgdG8gb3VyIGFsdGVybmF0ZSBwb3J0ICR7dGFrZW92ZXIuYWx0UG9ydH0gZnJvbSAke25ldyBEYXRlKHRha2VvdmVyLnN0YXJ0KS50b0lTT1N0cmluZygpfSB1bnRpbCBvdXIgcHJlZGVjZXNzb3IgaXMga2lsbGVkIGF0ICR7bmV3IERhdGUodGFrZW92ZXIuZW5kKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICB3cml0dGVuLnB1c2goa2V5KTtcbiAgICB9XG4gICAgaWYgKCF0YWtlb3ZlcikgcmV0dXJuO1xuICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE5vIGFjdGl2ZSBidWNrZXRzLCBzbyBubyBjb25maWcgZmlsZXMgdG8gd3JpdGUgdGhlIGludGVybWVkaWF0ZSBpbnRvIChhIGJ1Y2tldCBpcyBvbmx5IGFjdGl2ZSBvbmNlIHNvbWV0aGluZyB1c2VzIGl0KWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghd3JpdHRlbi5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFdyb3RlIG5vIGNvbmZpZyBmaWxlczogb2YgJHtrZXlzLmxlbmd0aH0gYWN0aXZlIGJ1Y2tldHMsICR7YWxyZWFkeUNvcnJlY3QubGVuZ3RofSBhbHJlYWR5IGNvbnRhaW4gdGhlIGludGVybWVkaWF0ZSBhbmQgJHtub3RPdXJzLmxlbmd0aH0gYXJlIG5vdCBob3N0ZWQgYnkgdXNgKTtcbiAgICB9XG59XG5cbi8qKiBPdXIgcHJlZGVjZXNzb3Igc3RpbGwgaG9sZHMgdGhlIG1haW4gcG9ydCBhbmQgaGFzIGJlZW4gc2VydmluZyBhbGwgYWxvbmcsIHNvIGl0IC0gbm90IHVzIC0ga25vd3Mgd2hpY2ggYnVja2V0cyBhcmUgaW4gdXNlLiBXZSBhY3RpdmF0ZSBleGFjdGx5IHRob3NlLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZWlyIGNvbmZpZyBmaWxlcyBnZXQgdGhlIGludGVybWVkaWF0ZTsgbm90aGluZyBlbHNlIG9uIGRpc2sgaXMgdG91Y2hlZC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlUHJlZGVjZXNzb3JCdWNrZXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIGxldCB1cmwgPSBgaHR0cHM6Ly8ke2RvbWFpbn06JHtwb3J0fWA7XG4gICAgbGV0IGtleXM6IHsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfVtdO1xuICAgIHRyeSB7XG4gICAgICAgIGtleXMgPSBhd2FpdCBsaXN0U2VydmVyQWN0aXZlQnVja2V0S2V5cyh7IHVybCB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBhc2sgb3VyIHByZWRlY2Vzc29yIG9uICR7dXJsfSB3aGljaCBidWNrZXRzIGFyZSBhY3RpdmUsIHNvIG9ubHkgYnVja2V0cyB1c2VkIG9uIHRoaXMgcHJvY2VzcyBnZXQgdGhlIGludGVybWVkaWF0ZTogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBPdXIgcHJlZGVjZXNzb3Igb24gJHt1cmx9IGhhcyBubyBhY3RpdmUgYnVja2V0cywgc28gdGhlcmUgYXJlIG5vIGNvbmZpZyBmaWxlcyB0byB3cml0ZSB0aGUgaW50ZXJtZWRpYXRlIGludG9gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgT3VyIHByZWRlY2Vzc29yIG9uICR7dXJsfSBoYXMgJHtrZXlzLmxlbmd0aH0gYWN0aXZlIGJ1Y2tldHMsIGFjdGl2YXRpbmcgdGhlbSBoZXJlIHNvIHRoZWlyIGNvbmZpZyBmaWxlcyBnZXQgdGhlIGludGVybWVkaWF0ZTogJHtrZXlzLm1hcCh4ID0+IGAke3guYWNjb3VudH0vJHt4LmJ1Y2tldE5hbWV9YCkuam9pbihcIiwgXCIpfWApO1xuICAgIGZvciAobGV0IHsgYWNjb3VudCwgYnVja2V0TmFtZSB9IG9mIGtleXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQWN0aXZhdGluZyBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChhY3RpdmUgb24gb3VyIHByZWRlY2Vzc29yKSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKiBTdGFydGVkIGJ5IGRlcGxveVRha2VvdmVyIG9uY2Ugd2UgYXJlIGFjdHVhbGx5IGEgZGVwbG95IHN1Y2Nlc3NvciBsaXN0ZW5pbmcgb24gYW4gYWx0ZXJuYXRlIHBvcnQuIFVudGlsIHRoZW4gdGhlcmUgYXJlIG5vIHN3aXRjaG92ZXIgd2luZG93cyB0byB3cml0ZSBvciBleHBpcmUsIHNvIG5vdGhpbmcgcG9sbHMuICovXG5leHBvcnQgY29uc3Qgc3RhcnRJbnRlcm1lZGlhdGVNYWludGVuYW5jZSA9IGxhenkoKCkgPT4ge1xuICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgYWN0aXZhdGVQcmVkZWNlc3NvckJ1Y2tldHMoKTtcbiAgICAgICAgYXdhaXQgbWFpbnRhaW5JbnRlcm1lZGlhdGVzKCk7XG4gICAgfSkoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYFdyaXRpbmcgdGhlIGludGVybWVkaWF0ZSBpbnRvIHRoZSBjb25maWcgZmlsZXMgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgcnVuSW5maW5pdGVQb2xsKElOVEVSTUVESUFURV9NQUlOVEFJTl9JTlRFUlZBTCwgbWFpbnRhaW5JbnRlcm1lZGlhdGVzKTtcbn0pO1xuXG5leHBvcnQgdHlwZSBCdWNrZXREaXNrSW5mbyA9IHtcbiAgICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gICAgZnJlZUJ5dGVzOiBudW1iZXI7XG4gICAgdXNlZEJ5dGVzOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKiBXaGVyZSB0aGUgYnVja2V0J3MgZGF0YSBsaXZlcyBvbiB0aGlzIHNlcnZlciAqL1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgZHJpdmUgdGhhdCBmb2xkZXIgaXMgb24uIEJ1Y2tldHMgc2hhcmluZyBhIGRyaXZlIHJlcG9ydCB0aGUgc2FtZSBudW1iZXJzLiAqL1xuICAgIGRpc2s/OiBCdWNrZXREaXNrSW5mbztcbiAgICBkaXNrRXJyb3I/OiBzdHJpbmc7XG4gICAgd3JpdGVTdGF0cz86IEJ1Y2tldFdyaXRlU3RhdHM7XG4gICAgY29uZmlnPzogQXJjaGl2ZXNDb25maWc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBnZXREaXNrSW5mbyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8QnVja2V0RGlza0luZm8+IHtcbiAgICBsZXQgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0ZnMoZm9sZGVyKTtcbiAgICBsZXQgYmxvY2tTaXplID0gTnVtYmVyKHN0YXRzLmJzaXplKTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IE51bWJlcihzdGF0cy5ibG9ja3MpICogYmxvY2tTaXplO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIC8vIE1hdGNoZXMgdGhlIHNlcnZlcidzIG93biBsb3ctc3BhY2UgY2hlY2s6IHdoYXQgYW4gdW5wcml2aWxlZ2VkIHByb2Nlc3MgY2FuIGFjdHVhbGx5IHVzZVxuICAgICAgICBmcmVlQnl0ZXM6IE51bWJlcihzdGF0cy5iYXZhaWwpICogYmxvY2tTaXplLFxuICAgICAgICB1c2VkQnl0ZXM6IHRvdGFsQnl0ZXMgLSBOdW1iZXIoc3RhdHMuYmZyZWUpICogYmxvY2tTaXplLFxuICAgIH07XG59XG5cbmV4cG9ydCB0eXBlIEFjdGl2ZUJ1Y2tldEluZm8gPSB7XG4gICAgZm9sZGVyOiBzdHJpbmc7XG4gICAgLyoqIFRoZSByb3V0aW5nIGNvbmZpZyB0aGUgYnVja2V0IGlzIFJVTk5JTkcgb24sIHN0cmFpZ2h0IGZyb20gbWVtb3J5IC0gaW5jbHVkaW5nIHN3aXRjaG92ZXIgd2luZG93cyB3cml0dGVuIHNpbmNlIGl0IGxvYWRlZCAqL1xuICAgIHJvdXRpbmc6IFJlbW90ZUNvbmZpZztcbiAgICAvKiogT3VyIG93biBlbnRyaWVzIGluIHRoYXQgY29uZmlnLCBhbmQgdGhlaXIgc3VtbWFyaXplZCBjdXJyZW50IHJvbGUgKHJvdXRlcyB1bmlvbiArIGZsYWdzKSAqL1xuICAgIHNlbGZFbnRyaWVzOiBIb3N0ZWRDb25maWdbXTtcbiAgICBzZWxmPzogU2VsZlN1bW1hcnk7XG4gICAgY29uZmlnOiBBcmNoaXZlc0NvbmZpZztcbn07XG5cbi8qKiBUaGUgbGl2ZSBpbi1tZW1vcnkgc3RhdGUgb2YgT05FIGJ1Y2tldCwgYW5zd2VyZWQgd2l0aG91dCB0b3VjaGluZyB0aGUgZGlzayAobm8gcm91dGluZyBmaWxlIHJlYWQsIG5vIHN0YXRmcywgbm8gc3RvcmVkIHdyaXRlIHN0YXRzKS4gUmV0dXJucyBhbiBlcnJvciBzdHJpbmcgd2hlbiB0aGUgYnVja2V0IGlzIG5vdCBsb2FkZWQgaGVyZSwgd2hpY2ggaXMgdGhlIG5vcm1hbCBzdGF0ZSBmb3IgYSBidWNrZXQgbm90aGluZyBoYXMgYWNjZXNzZWQgc2luY2Ugc3RhcnR1cC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY3RpdmVCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gaXMgbm90IGxvYWRlZCBvbiB0aGlzIHNlcnZlciwgc28gaXQgaGFzIG5vIGxpdmUgc3RhdGUgKGl0IGxvYWRzIG9uIGZpcnN0IGFjY2VzcylgO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkOiBMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBmYWlsZWQgdG8gbG9hZCBvbiB0aGlzIHNlcnZlcjogJHtTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCl9YDtcbiAgICB9XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgc2VydmVyYDtcbiAgICB9XG4gICAgcmV0dXJuIHRvQWN0aXZlQnVja2V0SW5mbyhsb2FkZWQpO1xufVxuXG5mdW5jdGlvbiB0b0FjdGl2ZUJ1Y2tldEluZm8obG9hZGVkOiBMb2FkZWRCdWNrZXQpOiBBY3RpdmVCdWNrZXRJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb2xkZXI6IGdldEJ1Y2tldEZvbGRlcihsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUpLFxuICAgICAgICByb3V0aW5nOiBsb2FkZWQucm91dGluZyxcbiAgICAgICAgc2VsZkVudHJpZXM6IGxvYWRlZC5zZWxmRW50cmllcyxcbiAgICAgICAgc2VsZjogbG9hZGVkLnNlbGYsXG4gICAgICAgIGNvbmZpZzogZ2V0QnVja2V0Q29uZmlnKGxvYWRlZCksXG4gICAgfTtcbn1cblxuLyoqIExvYWRzIGEgYnVja2V0IHRoYXQgZXhpc3RzIG9uIHRoaXMgc2VydmVyJ3MgZGlzayBpbnRvIG1lbW9yeSwgd2hpY2ggc3RhcnRzIGl0cyBzeW5jaHJvbml6YXRpb24gYW5kIHdpbmRvdyB0aW1lcnMsIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLiBOb3RoaW5nIGlzIHdyaXR0ZW4gYW5kIG5vIG90aGVyIHNlcnZlciBpcyBjb250YWN0ZWQgLSB1bmxpa2UgYnVpbGRpbmcgYW4gQXJjaGl2ZXNDaGFpbiBmb3IgaXQsIHdoaWNoIHdvdWxkIHByb2JlIGV2ZXJ5IHNvdXJjZSBhbmQgY291bGQgd3JpdGUgdGhlIHJvdXRpbmcgY29uZmlnLiBBbHJlYWR5LWxvYWRlZCBidWNrZXRzIGp1c3QgcmV0dXJuIHRoZWlyIHN0YXRlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCB3YXNMb2FkZWQgPSBidWNrZXRzLmhhcyhrZXkpO1xuICAgIGxldCBsb2FkZWQ6IExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgICBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gZmFpbGVkIHRvIGxvYWQgb24gdGhpcyBzZXJ2ZXI6ICR7U3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApfWA7XG4gICAgfVxuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlciAobm8gcm91dGluZyBmaWxlIGluICR7Z2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpfSlgO1xuICAgIH1cbiAgICAvLyBXYWl0IGZvciB0aGUgaW5kZXggdG8gbG9hZCwgc28gdGhlIHRvdGFscyB3ZSByZXR1cm4gYXJlIHRoZSByZWFsIG9uZXMgcmF0aGVyIHRoYW4gemVyb2VzIGZyb20gYSBzdG9yZSB0aGF0IGhhcyBub3QgcmVhZCBpdHMgaW5kZXggeWV0LiBUaGUgc291cmNlIHNjYW5zIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICBpZiAobG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5pbml0KCk7XG4gICAgfVxuICAgIGlmICghd2FzTG9hZGVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBY3RpdmF0ZWQgYnVja2V0ICR7a2V5fSBvbiByZXF1ZXN0OiBpdCBpcyBub3cgbG9hZGVkIGFuZCBzeW5jaHJvbml6aW5nYCk7XG4gICAgfVxuICAgIHJldHVybiB0b0FjdGl2ZUJ1Y2tldEluZm8obG9hZGVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RBY2NvdW50QnVja2V0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPFNlcnZlckJ1Y2tldEluZm9bXT4ge1xuICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgbGV0IHRpbWluZ3MgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHRpbWVkPFQ+KG5hbWU6IHN0cmluZywgcnVuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGxldCBiZWdhbiA9IERhdGUubm93KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aW1pbmdzLnNldChuYW1lLCAodGltaW5ncy5nZXQobmFtZSkgfHwgMCkgKyAoRGF0ZS5ub3coKSAtIGJlZ2FuKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGFjY291bnRGb2xkZXIgPSBwYXRoLmpvaW4oZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpLmZvbGRlciwgXCJidWNrZXRzMlwiLCBhY2NvdW50KTtcbiAgICBsZXQgbmFtZXM6IHN0cmluZ1tdO1xuICAgIHRyeSB7XG4gICAgICAgIG5hbWVzID0gYXdhaXQgdGltZWQoXCJyZWFkZGlyXCIsICgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIoYWNjb3VudEZvbGRlcikpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChuYW1lcy5tYXAoYXN5bmMgYnVja2V0TmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgICAgICAgICBsZXQgZm9sZGVyID0gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgbGV0IGJhc2U6IFNlcnZlckJ1Y2tldEluZm8gPSB7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGZvbGRlciB9O1xuICAgICAgICAgICAgYmFzZS5kaXNrID0gYXdhaXQgdGltZWQoXCJzdGF0ZnNcIiwgKCkgPT4gZ2V0RGlza0luZm8oZm9sZGVyKSkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFzZS5kaXNrRXJyb3IgPSBTdHJpbmcoZS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJhc2Uud3JpdGVTdGF0cyA9IGdldEJ1Y2tldFdyaXRlU3RhdHMoa2V5KTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGxvYWRlZFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgdGltZWQoXCJhd2FpdExvYWRlZFwiLCAoKSA9PiBsb2FkZWRQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgYWN0aXZlOiB0cnVlLCBjb25maWc6IGdldEJ1Y2tldENvbmZpZyhsb2FkZWQpIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGFjdGl2ZTogdHJ1ZSwgZXJyb3I6IFN0cmluZygoZSBhcyBFcnJvcikuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRpbWVkKFwicmVhZFJvdXRpbmdGaWxlXCIsICgpID0+IHJlYWRSb3V0aW5nRmlsZShmb2xkZXIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgZXJyb3I6IGBObyByb3V0aW5nIGZpbGUgKCR7Uk9VVElOR19GSUxFfSlgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBhd2FpdCB0aW1lZChcInBhcnNlUm91dGluZ1wiLCBhc3luYyAoKSA9PiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBjb25maWc6IHsgcmVtb3RlQ29uZmlnOiBwYXJzZWQgfSB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIFRoZSBwYXJ0cyBydW4gY29uY3VycmVudGx5LCBzbyB0aGVzZSBhcmUgc3VtbWVkIHdhbGwgdGltZXMgcGVyIHBhcnQsIG5vdCBhIGJyZWFrZG93biBvZiB0aGUgdG90YWxcbiAgICAgICAgbGV0IHBhcnRzID0gWy4uLnRpbWluZ3NdLm1hcCgoW25hbWUsIG1zXSkgPT4gYCR7bmFtZX0gJHttc31tc2ApLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgY29uc29sZS5sb2coYGxpc3RBY2NvdW50QnVja2V0cygke2FjY291bnR9KSB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIGZvciAke25hbWVzLmxlbmd0aH0gYnVja2V0czogJHtwYXJ0c31gKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVCdWNrZXRGaWxlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZpbGVQYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm91dGluZyBjb25maWcgJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSBjYW5ub3QgYmUgZGVsZXRlZCAob3ZlcndyaXRlIGl0IHRvIGNoYW5nZSB0aGUgYnVja2V0J3MgY29uZmlndXJhdGlvbilgKTtcbiAgICB9XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5kZWwoZmlsZVBhdGgsIGdldFdyaXRlQ29uZmlnKGxvYWRlZCwgRGF0ZS5ub3coKSwgZ2V0Um91dGUoZmlsZVBhdGgpKSk7XG59XG5cbmNvbnN0IExBUkdFX0ZJTEVfUEFSVF9TSVpFID0gOCAqIDEwMjQgKiAxMDI0O1xuXG5jbGFzcyBBcmNoaXZlc0xvY2FsQnVja2V0IGltcGxlbWVudHMgSUFyY2hpdmVzIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjY291bnQ6IHN0cmluZywgcHJpdmF0ZSBidWNrZXROYW1lOiBzdHJpbmcpIHsgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCdWNrZXQoKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldExvYWRlZEJ1Y2tldCh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlYnVnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIGBsb2NhbEJ1Y2tldCBhY2NvdW50ICR7dGhpcy5hY2NvdW50fSBidWNrZXQgJHt0aGlzLmJ1Y2tldE5hbWV9YDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5kYXRhIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldDIoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogR2V0Q29uZmlnKTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNvbmZpZz8uaW50ZXJuYWwgJiYgYnVja2V0LnN0b3JlLmdldEludGVybmFsMikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRJbnRlcm5hbDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXQyKGZpbGVOYW1lLCBjb25maWcpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGZpbGVOYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogU2V0Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVCdWNrZXRGaWxlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3QgZXhpc3QuIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBhc3NlcnRNdXRhYmxlKGJ1Y2tldCwgY29uZmlnLnBhdGgsIGNvbmZpZy5sYXN0TW9kaWZpZWQgfHwgRGF0ZS5ub3coKSk7XG4gICAgICAgIGxldCBpZCA9IGF3YWl0IGJ1Y2tldC5zdG9yZS5zdGFydExhcmdlVXBsb2FkKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgY29uZmlnLmdldE5leHREYXRhKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSBicmVhaztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBkYXRhLmxlbmd0aDsgb2Zmc2V0ICs9IExBUkdFX0ZJTEVfUEFSVF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1Y2tldC5zdG9yZS5hcHBlbmRMYXJnZVVwbG9hZChpZCwgZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIExBUkdFX0ZJTEVfUEFSVF9TSVpFKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmZpbmlzaExhcmdlVXBsb2FkKGlkLCBjb25maWcucGF0aCwgY29uZmlnLmxhc3RNb2RpZmllZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGF3YWl0IGJ1Y2tldC5zdG9yZS5jYW5jZWxMYXJnZVVwbG9hZChpZCk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IEdldEluZm9Db25maWcpOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRJbmZvKGZpbGVOYW1lLCBjb25maWcpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGBodHRwczovLyR7ZG9tYWlufToke3BvcnR9L2ZpbGUvJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5hY2NvdW50KX0vJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5idWNrZXROYW1lKX1gLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0cnVlIH07XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYnVja2V0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldENoYW5nZXNBZnRlcjIoY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFN5bmNTdGF0dXMoKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4geyBhbGxTY2Fuc0NvbXBsZXRlOiB0cnVlLCBpbmRleFNpemU6IDAsIHNvdXJjZXM6IFtdIH07XG4gICAgICAgIGlmICghYnVja2V0LnN0b3JlLmdldFN5bmNTdGF0dXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRTeW5jU3RhdHVzIChyYXdEaXNrIGJ1Y2tldHMgaGF2ZSBubyBzeW5jaHJvbml6YXRpb24pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRTeW5jU3RhdHVzKCk7XG4gICAgfVxufVxuXG5jb25zdCBsb2NhbEFyY2hpdmVzID0gbmV3IE1hcDxzdHJpbmcsIElBcmNoaXZlcz4oKTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbEFyY2hpdmVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogSUFyY2hpdmVzIHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGV4aXN0aW5nID0gbG9jYWxBcmNoaXZlcy5nZXQoa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBsZXQgYXJjaGl2ZXMgPSBuZXcgQXJjaGl2ZXNMb2NhbEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsb2NhbEFyY2hpdmVzLnNldChrZXksIGFyY2hpdmVzKTtcbiAgICByZXR1cm4gYXJjaGl2ZXM7XG59XG4iXX0=
1163
+ /* _JS_SOURCE_HASH = "a42106b94167103f4ac2843d155eeba04cc828fa89edde3e9282c273b020a891"; */