sliftutils 1.7.33 → 1.7.34

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.
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
- //exports.getLocalArchives = exports.deleteBucketFile = exports.listAccountBuckets = exports.startIntermediateMaintenance = exports.rebuildAllLoadedBuckets = exports.getBucketConfig = exports.writeBucketFile = exports.assertMutable = exports.getLoadedBucket = exports.removeExtraListenPort = exports.addExtraListenPort = exports.setTrustedMachines = exports.clearAccountWriteStats = exports.getRequests = exports.getTrust = exports.assertWritesAllowed = exports.getWritesRejectedReason = exports.setWritesRejectedReason = exports.getStorageServerConfigOptional = exports.getStorageServerConfig = exports.setStorageServerConfig = void 0;
6
+ //exports.getLocalArchives = exports.deleteBucketFile = exports.listAccountBuckets = exports.activateBucket = exports.getActiveBucket = exports.startIntermediateMaintenance = exports.rebuildAllLoadedBuckets = exports.getBucketConfig = exports.writeBucketFile = exports.assertMutable = exports.getLoadedBucket = exports.removeExtraListenPort = exports.addExtraListenPort = exports.setTrustedMachines = exports.clearAccountWriteStats = exports.getRequests = exports.getTrust = exports.assertWritesAllowed = exports.getWritesRejectedReason = exports.setWritesRejectedReason = exports.getStorageServerConfigOptional = exports.getStorageServerConfig = exports.setStorageServerConfig = void 0;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const caching_1 = require("socket-function/src/caching");
@@ -799,53 +799,123 @@ async function getDiskInfo(folder) {
799
799
  usedBytes: totalBytes - Number(stats.bfree) * blockSize,
800
800
  };
801
801
  }
802
+ /** The live in-memory state of ONE bucket, answered without touching the disk (no routing file read, no statfs, no stored write stats). Returns an error string when the bucket is not loaded here, which is the normal state for a bucket nothing has accessed since startup. */
803
+ async function getActiveBucket(account, bucketName) {
804
+ var _a;
805
+ let key = `${account}/${bucketName}`;
806
+ let loadedPromise = buckets.get(key);
807
+ if (!loadedPromise) {
808
+ return `Bucket ${key} is not loaded on this server, so it has no live state (it loads on first access)`;
809
+ }
810
+ let loaded;
811
+ try {
812
+ loaded = await loadedPromise;
813
+ }
814
+ catch (e) {
815
+ return `Bucket ${key} failed to load on this server: ${String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 500)}`;
816
+ }
817
+ if (!loaded) {
818
+ return `Bucket ${key} does not exist on this server`;
819
+ }
820
+ return toActiveBucketInfo(loaded);
821
+ }
822
+ exports.getActiveBucket = getActiveBucket;
823
+ function toActiveBucketInfo(loaded) {
824
+ return {
825
+ folder: getBucketFolder(loaded.account, loaded.bucketName),
826
+ routing: loaded.routing,
827
+ selfEntries: loaded.selfEntries,
828
+ self: loaded.self,
829
+ config: getBucketConfig(loaded),
830
+ };
831
+ }
832
+ /** Loads a bucket that exists on this server's disk into memory, which starts its synchronization and window timers, and returns its live state. Nothing is written and no other server is contacted - unlike building an ArchivesChain for it, which would probe every source and could write the routing config. Already-loaded buckets just return their state. */
833
+ async function activateBucket(account, bucketName) {
834
+ var _a;
835
+ let key = `${account}/${bucketName}`;
836
+ let wasLoaded = buckets.has(key);
837
+ let loaded;
838
+ try {
839
+ loaded = await getLoadedBucket(account, bucketName);
840
+ }
841
+ catch (e) {
842
+ return `Bucket ${key} failed to load on this server: ${String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 500)}`;
843
+ }
844
+ if (!loaded) {
845
+ return `Bucket ${key} does not exist on this server (no routing file in ${getBucketFolder(account, bucketName)})`;
846
+ }
847
+ if (!wasLoaded) {
848
+ console.log(`Activated bucket ${key} on request: it is now loaded and synchronizing`);
849
+ }
850
+ return toActiveBucketInfo(loaded);
851
+ }
852
+ exports.activateBucket = activateBucket;
802
853
  async function listAccountBuckets(account) {
854
+ let start = Date.now();
855
+ let timings = new Map();
856
+ async function timed(name, run) {
857
+ let began = Date.now();
858
+ try {
859
+ return await run();
860
+ }
861
+ finally {
862
+ timings.set(name, (timings.get(name) || 0) + (Date.now() - began));
863
+ }
864
+ }
803
865
  let accountFolder = path_1.default.join(getStorageServerConfig().folder, "buckets2", account);
804
866
  let names;
805
867
  try {
806
- names = await fs_1.default.promises.readdir(accountFolder);
868
+ names = await timed("readdir", () => fs_1.default.promises.readdir(accountFolder));
807
869
  }
808
870
  catch (_a) {
809
871
  return [];
810
872
  }
811
- return await Promise.all(names.map(async (bucketName) => {
812
- var _a, _b;
813
- let key = `${account}/${bucketName}`;
814
- let folder = getBucketFolder(account, bucketName);
815
- let base = { bucketName, active: false, folder };
816
- let [disk, writeStats] = await Promise.all([
817
- getDiskInfo(folder).catch((e) => {
818
- var _a;
819
- base.diskError = String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 500);
820
- return undefined;
821
- }),
822
- getBucketWriteStats(key),
823
- ]);
824
- base.disk = disk;
825
- base.writeStats = writeStats;
826
- let loadedPromise = buckets.get(key);
827
- if (loadedPromise) {
873
+ try {
874
+ return await Promise.all(names.map(async (bucketName) => {
875
+ var _a, _b;
876
+ let key = `${account}/${bucketName}`;
877
+ let folder = getBucketFolder(account, bucketName);
878
+ let base = { bucketName, active: false, folder };
879
+ let [disk, writeStats] = await Promise.all([
880
+ timed("statfs", () => getDiskInfo(folder)).catch((e) => {
881
+ var _a;
882
+ base.diskError = String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 500);
883
+ return undefined;
884
+ }),
885
+ timed("writeStats", () => getBucketWriteStats(key)),
886
+ ]);
887
+ base.disk = disk;
888
+ base.writeStats = writeStats;
889
+ const loadedPromise = buckets.get(key);
890
+ if (loadedPromise) {
891
+ try {
892
+ let loaded = await timed("awaitLoaded", () => loadedPromise);
893
+ if (loaded) {
894
+ return { ...base, active: true, config: getBucketConfig(loaded) };
895
+ }
896
+ }
897
+ catch (e) {
898
+ return { ...base, active: true, error: String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 500) };
899
+ }
900
+ }
828
901
  try {
829
- let loaded = await loadedPromise;
830
- if (loaded) {
831
- return { ...base, active: true, config: getBucketConfig(loaded) };
902
+ const data = await timed("readRoutingFile", () => readRoutingFile(folder));
903
+ if (!data) {
904
+ return { ...base, error: `No routing file (${remoteConfig_1.ROUTING_FILE})` };
832
905
  }
906
+ let parsed = await timed("parseRouting", async () => (0, remoteConfig_1.parseRoutingData)(data));
907
+ return { ...base, config: { remoteConfig: parsed } };
833
908
  }
834
909
  catch (e) {
835
- return { ...base, active: true, error: String((_a = e.stack) !== null && _a !== void 0 ? _a : e).slice(0, 500) };
836
- }
837
- }
838
- try {
839
- let data = await readRoutingFile(folder);
840
- if (!data) {
841
- return { ...base, error: `No routing file (${remoteConfig_1.ROUTING_FILE})` };
910
+ return { ...base, error: String((_b = e.stack) !== null && _b !== void 0 ? _b : e).slice(0, 500) };
842
911
  }
843
- return { ...base, config: { remoteConfig: (0, remoteConfig_1.parseRoutingData)(data) } };
844
- }
845
- catch (e) {
846
- return { ...base, error: String((_b = e.stack) !== null && _b !== void 0 ? _b : e).slice(0, 500) };
847
- }
848
- }));
912
+ }));
913
+ }
914
+ finally {
915
+ // The parts run concurrently, so these are summed wall times per part, not a breakdown of the total
916
+ let parts = [...timings].map(([name, ms]) => `${name} ${ms}ms`).join(", ");
917
+ console.log(`listAccountBuckets(${account}) took ${Date.now() - start}ms for ${names.length} buckets: ${parts}`);
918
+ }
849
919
  }
850
920
  exports.listAccountBuckets = listAccountBuckets;
851
921
  async function deleteBucketFile(account, bucketName, filePath) {
@@ -969,5 +1039,5 @@ function getLocalArchives(account, bucketName) {
969
1039
  return archives;
970
1040
  }
971
1041
  exports.getLocalArchives = getLocalArchives;
972
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxvREFBeUQ7QUFDekQsOERBQTJEO0FBQzNELGdEQUE2QztBQUM3QyxrREFBK0M7QUFDL0MsMkNBQXlHO0FBQ3pHLDRDQUlzQjtBQUN0QixpREFBeU07QUFDek0sK0RBQXNMO0FBQ3RMLHFEQUEyRDtBQUMzRCxxREFBcUQ7QUFFckQsMkRBQThEO0FBRTlELHVDQUFtQztBQVduQyxJQUFJLE1BQXVDLENBQUM7QUFDNUMsU0FBZ0Isc0JBQXNCLENBQUMsS0FBMEI7SUFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixDQUFDO0FBRkQsd0RBRUM7QUFDRCxTQUFnQixzQkFBc0I7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTEQsd0RBS0M7QUFDRCxTQUFnQiw4QkFBOEI7SUFDMUMsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUZELHdFQUVDO0FBRUQsSUFBSSxvQkFBd0MsQ0FBQztBQUM3QyxTQUFnQix1QkFBdUIsQ0FBQyxNQUEwQjtJQUM5RCxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsQ0FBQztBQUZELDBEQUVDO0FBQ0QsU0FBZ0IsdUJBQXVCO0lBQ25DLE9BQU8sb0JBQW9CLENBQUM7QUFDaEMsQ0FBQztBQUZELDBEQUVDO0FBQ0QsU0FBZ0IsbUJBQW1CO0lBQy9CLElBQUksb0JBQW9CO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFGRCxrREFF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QVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLDJFQUEyRSxDQUFDLENBQUM7UUFDMUksQ0FBQztRQUNELE9BQU8sTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzlDLENBQUM7Q0FDSjtBQUVELE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0FBQ25ELFNBQWdCLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUNoRSxJQUFJLEdBQUcsR0FBRyxHQUFHLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUNyQyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLElBQUksUUFBUSxHQUFHLElBQUksbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzVELGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFQRCw0Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgcnVuSW5maW5pdGVQb2xsIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGdldEZpbGVTdG9yYWdlTmVzdGVkMiB9IGZyb20gXCIuLi9GaWxlRm9sZGVyQVBJXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblN0b3JhZ2UgfSBmcm9tIFwiLi4vVHJhbnNhY3Rpb25TdG9yYWdlXCI7XG5pbXBvcnQgeyBKU09OU3RvcmFnZSB9IGZyb20gXCIuLi9KU09OU3RvcmFnZVwiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEaXNrIH0gZnJvbSBcIi4uL0FyY2hpdmVzRGlza1wiO1xuaW1wb3J0IHsgQmxvYlN0b3JlLCBJQnVja2V0U3RvcmUsIERFRkFVTFRfRkFTVF9XUklURV9ERUxBWSwgV0lORE9XX0VORF9GTFVTSF9NQVJHSU4gfSBmcm9tIFwiLi9ibG9iU3RvcmVcIjtcbmltcG9ydCB7XG4gICAgUmVtb3RlQ29uZmlnLCBIb3N0ZWRDb25maWcsIEJhY2tibGF6ZUNvbmZpZywgSUFyY2hpdmVzLCBBcmNoaXZlc1NvdXJjZSwgQXJjaGl2ZUZpbGVJbmZvLCBBcmNoaXZlc0NvbmZpZyxcbiAgICBBcmNoaXZlc1N5bmNTdGF0dXMsXG4gICAgU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1csIFNUT1JBR0VfV1JPTkdfUk9VVEUsIEZVTExfUk9VVEUsXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgcGFyc2VSb3V0aW5nRGF0YSwgc2VyaWFsaXplUmVtb3RlQ29uZmlnLCBwYXJzZUhvc3RlZFVybCwgcmVwbGFjZUhvc3RlZFVybFBvcnQsIGJ1aWxkRmlsZVVybCwgZ2V0Q29uZmlnVmVyc2lvbiwgZ2V0Um91dGUsIHJvdXRlQ29udGFpbnMsIHJvdXRlSW50ZXJzZWN0aW9uIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2UsIGV4cGlyZUludGVybWVkaWF0ZVNvdXJjZXMsIGdldEludGVybWVkaWF0ZVNvdXJjZXMsIGZpbmRTcGxpdFVybCwgbmV4dEludGVybWVkaWF0ZVZlcnNpb24sIElOVEVSTUVESUFURV9FWFBJUkVfR1JBQ0UgfSBmcm9tIFwiLi9pbnRlcm1lZGlhdGVTb3VyY2VzXCI7XG5pbXBvcnQgeyBnZXRUYWtlb3ZlckludGVybWVkaWF0ZSB9IGZyb20gXCIuL2RlcGxveVRha2VvdmVyXCI7XG5pbXBvcnQgeyBjcmVhdGVBcGlBcmNoaXZlcyB9IGZyb20gXCIuL2NyZWF0ZUFyY2hpdmVzXCI7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlIH0gZnJvbSBcIi4uL0lTdG9yYWdlXCI7XG5pbXBvcnQgeyBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSB7IEFjY2Vzc1JlcXVlc3QsIFRydXN0UmVjb3JkIH0gZnJvbSBcIi4vc3RvcmFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGdldEFyZyB9IGZyb20gXCIuL2NsaUFyZ3NcIjtcblxuZXhwb3J0IHR5cGUgU3RvcmFnZVNlcnZlckNvbmZpZyA9IHtcbiAgICBkb21haW46IHN0cmluZztcbiAgICBwb3J0OiBudW1iZXI7XG4gICAgcm9vdERvbWFpbjogc3RyaW5nO1xuICAgIHNzaFRhcmdldDogc3RyaW5nO1xuICAgIHNlcnZlckNvbW1hbmQ6IHN0cmluZztcbiAgICBmb2xkZXI6IHN0cmluZztcbn07XG5cbmxldCBjb25maWc6IFN0b3JhZ2VTZXJ2ZXJDb25maWcgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0U3RvcmFnZVNlcnZlckNvbmZpZyh2YWx1ZTogU3RvcmFnZVNlcnZlckNvbmZpZyk6IHZvaWQge1xuICAgIGNvbmZpZyA9IHZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTogU3RvcmFnZVNlcnZlckNvbmZpZyB7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgKHRoaXMgQVBJIG9ubHkgd29ya3Mgb24gdGhlIHN0b3JhZ2Ugc2VydmVyKWApO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpOiBTdG9yYWdlU2VydmVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY29uZmlnO1xufVxuXG5sZXQgd3JpdGVzUmVqZWN0ZWRSZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBzZXRXcml0ZXNSZWplY3RlZFJlYXNvbihyZWFzb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHdyaXRlc1JlamVjdGVkUmVhc29uID0gcmVhc29uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyaXRlc1JlamVjdGVkUmVhc29uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHdyaXRlc1JlamVjdGVkUmVhc29uO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFdyaXRlc0FsbG93ZWQoKTogdm9pZCB7XG4gICAgaWYgKHdyaXRlc1JlamVjdGVkUmVhc29uKSB0aHJvdyBuZXcgRXJyb3Iod3JpdGVzUmVqZWN0ZWRSZWFzb24pO1xufVxuXG5mdW5jdGlvbiBnZXRTdG9yYWdlRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgbGV0IGNvbmZpZyA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCgpO1xuICAgIGlmIChjb25maWcpIHJldHVybiBjb25maWcuZm9sZGVyO1xuICAgIGxldCBmb2xkZXIgPSBnZXRBcmcoXCJmb2xkZXJcIik7XG4gICAgaWYgKCFmb2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdG9yYWdlIHNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIHRoZXJlIGlzIG5vIC0tZm9sZGVyIGFyZywgc28gdGhlIHN0b3JhZ2UgZm9sZGVyIGlzIHVua25vd25gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShmb2xkZXIpO1xufVxuXG5jb25zdCBzeXN0ZW1TdG9yYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPElTdG9yYWdlPHVua25vd24+Pj4oKTtcbmZ1bmN0aW9uIGdldFN5c3RlbVN0b3JhZ2U8VD4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxJU3RvcmFnZTxUPj4ge1xuICAgIGxldCBzdG9yYWdlID0gc3lzdGVtU3RvcmFnZXMuZ2V0KG5hbWUpO1xuICAgIGlmICghc3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByb290ID0gYXdhaXQgZ2V0RmlsZVN0b3JhZ2VOZXN0ZWQyKGdldFN0b3JhZ2VGb2xkZXIoKSk7XG4gICAgICAgICAgICBsZXQgc3lzdGVtID0gYXdhaXQgcm9vdC5mb2xkZXIuZ2V0U3RvcmFnZShcInN5c3RlbTJcIik7XG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25OYW1lID0gXCJzdG9yYWdlXCIgKyBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OU3RvcmFnZTx1bmtub3duPihuZXcgVHJhbnNhY3Rpb25TdG9yYWdlKGF3YWl0IHN5c3RlbS5mb2xkZXIuZ2V0U3RvcmFnZShuYW1lKSwgdHJhbnNhY3Rpb25OYW1lKSk7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHN5c3RlbVN0b3JhZ2VzLnNldChuYW1lLCBzdG9yYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2UgYXMgUHJvbWlzZTxJU3RvcmFnZTxUPj47XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJ1c3QoKTogUHJvbWlzZTxJU3RvcmFnZTxUcnVzdFJlY29yZD4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxUcnVzdFJlY29yZD4oXCJ0cnVzdFwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXF1ZXN0cygpOiBQcm9taXNlPElTdG9yYWdlPEFjY2Vzc1JlcXVlc3RbXT4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+KFwicmVxdWVzdHNcIik7XG59XG5cbmV4cG9ydCB0eXBlIEJ1Y2tldFdyaXRlU3RhdHMgPSB7XG4gICAgLyoqIEV2ZXJ5IHNldCBjYWxsIHRoZSBidWNrZXQgYWNjZXB0ZWQgKi9cbiAgICBvcmlnaW5hbFdyaXRlczogbnVtYmVyO1xuICAgIG9yaWdpbmFsQnl0ZXM6IG51bWJlcjtcbiAgICAvKiogV2hhdCBhY3R1YWxseSByZWFjaGVkIHRoZSBzb3VyY2VzLiBGYXN0IHdyaXRlcyBjb2FsZXNjZSByZXBlYXRlZCB3cml0ZXMgdG8gdGhlIHNhbWUga2V5LCBzbyB0aGlzIGlzIGxvd2VyIHRoYW4gdGhlIG9yaWdpbmFsIGNvdW50cyAoYW5kIGlzIHdoYXQgdGhlIGRpc2sgYWN0dWFsbHkgZGlkKS4gKi9cbiAgICBmbHVzaGVkV3JpdGVzOiBudW1iZXI7XG4gICAgZmx1c2hlZEJ5dGVzOiBudW1iZXI7XG59O1xuZnVuY3Rpb24gZW1wdHlXcml0ZVN0YXRzKCk6IEJ1Y2tldFdyaXRlU3RhdHMge1xuICAgIHJldHVybiB7IG9yaWdpbmFsV3JpdGVzOiAwLCBvcmlnaW5hbEJ5dGVzOiAwLCBmbHVzaGVkV3JpdGVzOiAwLCBmbHVzaGVkQnl0ZXM6IDAgfTtcbn1cbmZ1bmN0aW9uIGFkZFdyaXRlU3RhdHMoYTogQnVja2V0V3JpdGVTdGF0cywgYjogQnVja2V0V3JpdGVTdGF0cyk6IEJ1Y2tldFdyaXRlU3RhdHMge1xuICAgIHJldHVybiB7XG4gICAgICAgIG9yaWdpbmFsV3JpdGVzOiBhLm9yaWdpbmFsV3JpdGVzICsgYi5vcmlnaW5hbFdyaXRlcyxcbiAgICAgICAgb3JpZ2luYWxCeXRlczogYS5vcmlnaW5hbEJ5dGVzICsgYi5vcmlnaW5hbEJ5dGVzLFxuICAgICAgICBmbHVzaGVkV3JpdGVzOiBhLmZsdXNoZWRXcml0ZXMgKyBiLmZsdXNoZWRXcml0ZXMsXG4gICAgICAgIGZsdXNoZWRCeXRlczogYS5mbHVzaGVkQnl0ZXMgKyBiLmZsdXNoZWRCeXRlcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0V3JpdGVTdGF0c1N0b3JhZ2UoKTogUHJvbWlzZTxJU3RvcmFnZTxCdWNrZXRXcml0ZVN0YXRzPj4ge1xuICAgIHJldHVybiBnZXRTeXN0ZW1TdG9yYWdlPEJ1Y2tldFdyaXRlU3RhdHM+KFwid3JpdGVTdGF0c1wiKTtcbn1cblxuLy8gQ291bnRlZCBpbiBtZW1vcnkgYXMgZGVsdGFzIHNpbmNlIHRoZSBsYXN0IGZsdXNoLCBzbyBjb3VudGluZyBhIHdyaXRlIG5ldmVyIHRvdWNoZXMgdGhlIGRpc2suIFRoZSBmbHVzaCByZWFkcyB0aGUgc3RvcmVkIHRvdGFscyBhbmQgYWRkcyB0aGUgZGVsdGEsIHdoaWNoIGFsc28gbWFrZXMgaXQgY29ycmVjdCBhY3Jvc3MgcmVzdGFydHMuXG5jb25zdCB3cml0ZVN0YXREZWx0YXMgPSBuZXcgTWFwPHN0cmluZywgQnVja2V0V3JpdGVTdGF0cz4oKTtcblxuYXN5bmMgZnVuY3Rpb24gZmx1c2hXcml0ZVN0YXRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghd3JpdGVTdGF0RGVsdGFzLnNpemUpIHJldHVybjtcbiAgICBsZXQgcGVuZGluZyA9IFsuLi53cml0ZVN0YXREZWx0YXNdO1xuICAgIHdyaXRlU3RhdERlbHRhcy5jbGVhcigpO1xuICAgIGxldCBzdG9yYWdlID0gYXdhaXQgZ2V0V3JpdGVTdGF0c1N0b3JhZ2UoKTtcbiAgICBmb3IgKGxldCBba2V5LCBkZWx0YV0gb2YgcGVuZGluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZXQoa2V5LCBhZGRXcml0ZVN0YXRzKGF3YWl0IHN0b3JhZ2UuZ2V0KGtleSkgfHwgZW1wdHlXcml0ZVN0YXRzKCksIGRlbHRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFB1dCB0aGUgZGVsdGEgYmFjaywgc28gYSBmYWlsZWQgZmx1c2ggbG9zZXMgbm90aGluZ1xuICAgICAgICAgICAgd3JpdGVTdGF0RGVsdGFzLnNldChrZXksIGFkZFdyaXRlU3RhdHMod3JpdGVTdGF0RGVsdGFzLmdldChrZXkpIHx8IGVtcHR5V3JpdGVTdGF0cygpLCBkZWx0YSkpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmx1c2hpbmcgd3JpdGUgc3RhdHMgZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBzdGFydFdyaXRlU3RhdHNGbHVzaGluZyA9IGxhenkoKCkgPT4ge1xuICAgIHJ1bkluZmluaXRlUG9sbChXUklURV9TVEFUU19GTFVTSF9JTlRFUlZBTCwgZmx1c2hXcml0ZVN0YXRzKTtcbn0pO1xuXG5mdW5jdGlvbiBjb3VudEJ1Y2tldFdyaXRlKGtleTogc3RyaW5nLCBraW5kOiBcIm9yaWdpbmFsXCIgfCBcImZsdXNoZWRcIiwgYnl0ZXM6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBkZWx0YSA9IHdyaXRlU3RhdERlbHRhcy5nZXQoa2V5KTtcbiAgICBpZiAoIWRlbHRhKSB7XG4gICAgICAgIGRlbHRhID0gZW1wdHlXcml0ZVN0YXRzKCk7XG4gICAgICAgIHdyaXRlU3RhdERlbHRhcy5zZXQoa2V5LCBkZWx0YSk7XG4gICAgfVxuICAgIGlmIChraW5kID09PSBcIm9yaWdpbmFsXCIpIHtcbiAgICAgICAgZGVsdGEub3JpZ2luYWxXcml0ZXMrKztcbiAgICAgICAgZGVsdGEub3JpZ2luYWxCeXRlcyArPSBieXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgICBkZWx0YS5mbHVzaGVkV3JpdGVzKys7XG4gICAgICAgIGRlbHRhLmZsdXNoZWRCeXRlcyArPSBieXRlcztcbiAgICB9XG4gICAgc3RhcnRXcml0ZVN0YXRzRmx1c2hpbmcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QnVja2V0V3JpdGVTdGF0cyhrZXk6IHN0cmluZyk6IFByb21pc2U8QnVja2V0V3JpdGVTdGF0cz4ge1xuICAgIGxldCBzdG9yYWdlID0gYXdhaXQgZ2V0V3JpdGVTdGF0c1N0b3JhZ2UoKTtcbiAgICBsZXQgc3RvcmVkID0gYXdhaXQgc3RvcmFnZS5nZXQoa2V5KSB8fCBlbXB0eVdyaXRlU3RhdHMoKTtcbiAgICBsZXQgZGVsdGEgPSB3cml0ZVN0YXREZWx0YXMuZ2V0KGtleSk7XG4gICAgcmV0dXJuIGRlbHRhICYmIGFkZFdyaXRlU3RhdHMoc3RvcmVkLCBkZWx0YSkgfHwgc3RvcmVkO1xufVxuXG4vKiogWmVyb2VzIHRoZSB3cml0ZSBzdGF0aXN0aWNzIG9mIGV2ZXJ5IGJ1Y2tldCBpbiB0aGUgYWNjb3VudCwgaW5jbHVkaW5nIGNvdW50cyBub3QgeWV0IGZsdXNoZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJBY2NvdW50V3JpdGVTdGF0cyhhY2NvdW50OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCBzdG9yYWdlID0gYXdhaXQgZ2V0V3JpdGVTdGF0c1N0b3JhZ2UoKTtcbiAgICBsZXQgcHJlZml4ID0gYCR7YWNjb3VudH0vYDtcbiAgICBsZXQgY2xlYXJlZCA9IDA7XG4gICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHN0b3JhZ2UuZ2V0S2V5cygpKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgIHdyaXRlU3RhdERlbHRhcy5kZWxldGUoa2V5KTtcbiAgICAgICAgYXdhaXQgc3RvcmFnZS5yZW1vdmUoa2V5KTtcbiAgICAgICAgY2xlYXJlZCsrO1xuICAgIH1cbiAgICBmb3IgKGxldCBrZXkgb2YgWy4uLndyaXRlU3RhdERlbHRhcy5rZXlzKCldKSB7XG4gICAgICAgIGlmICgha2V5LnN0YXJ0c1dpdGgocHJlZml4KSkgY29udGludWU7XG4gICAgICAgIHdyaXRlU3RhdERlbHRhcy5kZWxldGUoa2V5KTtcbiAgICAgICAgY2xlYXJlZCsrO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgQ2xlYXJlZCB0aGUgd3JpdGUgc3RhdGlzdGljcyBvZiAke2NsZWFyZWR9IGJ1Y2tldHMgaW4gYWNjb3VudCAke2FjY291bnR9YCk7XG4gICAgcmV0dXJuIGNsZWFyZWQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXRUcnVzdGVkTWFjaGluZXMoY29uZmlnOiB7IGFjY291bnQ6IHN0cmluZzsgbWFjaGluZUlkczogc3RyaW5nW10gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0cnVzdCA9IGF3YWl0IGdldFRydXN0KCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2NvbmZpZy5hY2NvdW50fXxgO1xuICAgIGxldCBkZXNpcmVkID0gbmV3IFNldChjb25maWcubWFjaGluZUlkcyk7XG4gICAgZm9yIChsZXQga2V5IG9mIGF3YWl0IHRydXN0LmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFjaGluZUlkID0ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGVzaXJlZC5oYXMobWFjaGluZUlkKSkge1xuICAgICAgICAgICAgZGVzaXJlZC5kZWxldGUobWFjaGluZUlkKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5yZW1vdmUoa2V5KTtcbiAgICB9XG4gICAgZm9yIChsZXQgbWFjaGluZUlkIG9mIGRlc2lyZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFkZGluZyB0cnVzdCBmb3IgbWFjaGluZSAke21hY2hpbmVJZH0gb24gYWNjb3VudCAke2NvbmZpZy5hY2NvdW50fWApO1xuICAgICAgICBhd2FpdCB0cnVzdC5zZXQoYCR7cHJlZml4fSR7bWFjaGluZUlkfWAsIHsgYWNjb3VudDogY29uZmlnLmFjY291bnQsIG1hY2hpbmVJZCwgaXA6IFwiXCIsIHRpbWU6IERhdGUubm93KCkgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBMb2FkZWRCdWNrZXQgPSB7XG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgcm91dGluZ0pTT046IHN0cmluZztcbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZjogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHN0b3JlOiBJQnVja2V0U3RvcmU7XG4gICAgc3RydWN0dXJlS2V5OiBzdHJpbmc7XG59O1xuXG5jb25zdCBidWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPj4oKTtcblxuY29uc3QgTUFYX1JFQlVJTERfVElNRVJfREVMQVkgPSAyICoqIDMxIC0gMTtcbmNvbnN0IFJFQlVJTERfQk9VTkRBUllfQlVGRkVSID0gMTAwMDtcbmNvbnN0IFdSSVRFX1NUQVRTX0ZMVVNIX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcblxuZnVuY3Rpb24gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbmNvbnN0IGV4dHJhTGlzdGVuUG9ydHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRFeHRyYUxpc3RlblBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXh0cmFMaXN0ZW5Qb3J0cy5hZGQocG9ydCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRXh0cmFMaXN0ZW5Qb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGV4dHJhTGlzdGVuUG9ydHMuZGVsZXRlKHBvcnQpO1xufVxuZnVuY3Rpb24gZmluZFNlbGZJbmRleGVzKHJvdXRpbmc6IFJlbW90ZUNvbmZpZywgYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgbGV0IGluZGV4ZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0aW5nLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHJvdXRpbmcuc291cmNlc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLnR5cGUgIT09IFwicmVtb3RlXCIpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIGlmIChwYXJzZWQuYWRkcmVzcyAhPT0gZG9tYWluIHx8IHBhcnNlZC5hY2NvdW50ICE9PSBhY2NvdW50IHx8IHBhcnNlZC5idWNrZXROYW1lICE9PSBidWNrZXROYW1lKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHBhcnNlZC5wb3J0ID09PSBwb3J0IHx8IGV4dHJhTGlzdGVuUG9ydHMuaGFzKHBhcnNlZC5wb3J0KSkge1xuICAgICAgICAgICAgaW5kZXhlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleGVzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3RFbnRyeUF0KGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCB0aW1lOiBudW1iZXIsIHJvdXRlPzogbnVtYmVyKTogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgY292ZXJpbmcgPSBlbnRyaWVzLmZpbHRlcih4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKGNvdmVyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgZW50cmllcyA9IGNvdmVyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb250YWluaW5nID0gZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA8PSB0aW1lICYmIHRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgbGV0IGJlc3Q6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMF0pLCBNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMV0pKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIGJlc3QgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkOiBMb2FkZWRCdWNrZXQpOiB2b2lkIHtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgYm91bmRhcmllcyA9IGxvYWRlZC5zZWxmRW50cmllcy5mbGF0TWFwKHggPT4geC52YWxpZFdpbmRvdykuZmlsdGVyKHQgPT4gdCA+IG5vdyk7XG4gICAgaWYgKCFib3VuZGFyaWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGxldCBuZXh0Qm91bmRhcnkgPSBNYXRoLm1pbiguLi5ib3VuZGFyaWVzKTtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IGxvYWRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBuZXh0Qm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUsIHsgZm9yY2U6IHRydWUsIHJlYXNvbjogXCJhIHZhbGlkIHdpbmRvdyBib3VuZGFyeSBwYXNzZWRcIiB9KTtcbiAgICAgICAgfSkoKTtcbiAgICB9LCBNYXRoLm1pbihuZXh0Qm91bmRhcnkgLSBub3cgKyBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiwgTUFYX1JFQlVJTERfVElNRVJfREVMQVkpKTtcbiAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG5jb25zdCBCT1VOREFSWV9TQ0FOX09GRlNFVFMgPSBbLTMwICogMTAwMCwgMiAqIDEwMDAsIDMwICogMTAwMF07XG5jb25zdCBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLID0gREVGQVVMVF9GQVNUX1dSSVRFX0RFTEFZICsgV0lORE9XX0VORF9GTFVTSF9NQVJHSU47XG5jb25zdCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVkgPSAzMCAqIDEwMDA7XG5cbmNvbnN0IHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmNvbnN0IGJvdW5kYXJ5U2NhbnNSdW5uaW5nID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQm91bmRhcnlTY2Fucyhsb2FkZWQ6IExvYWRlZEJ1Y2tldCk6IHZvaWQge1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBzdGFydHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBzZWxmIG9mIGxvYWRlZC5zZWxmRW50cmllcykge1xuICAgICAgICBsZXQgc3RhcnQgPSBzZWxmLnZhbGlkV2luZG93WzBdO1xuICAgICAgICBpZiAoc3RhcnQgPiBub3cgJiYgc3RhcnQgPCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgc3RhcnRzLmFkZChzdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgc2VsZiBvZiBsb2FkZWQuc2VsZkVudHJpZXMpIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNlbGYudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmICghKHN0YXJ0IDw9IG5vdyAmJiBub3cgPCBlbmQpIHx8IHN0YXJ0IDw9IDApIGNvbnRpbnVlO1xuICAgICAgICBpZiAobm93IC0gc3RhcnQgPiBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHNjaGVkdWxlS2V5ID0gYCR7a2V5fXwke3N0YXJ0fXxzdGFydHVwYDtcbiAgICAgICAgaWYgKHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuaGFzKHNjaGVkdWxlS2V5KSkgY29udGludWU7XG4gICAgICAgIHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuYWRkKHNjaGVkdWxlS2V5KTtcbiAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIHJ1bkJvdW5kYXJ5U2NhbihrZXksIHN0YXJ0LCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVksIFwic3RhcnR1cCszMHNcIikuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICB9LCBTVEFSVFVQX0JPVU5EQVJZX1NDQU5fREVMQVkpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBzdGFydCBvZiBzdGFydHMpIHtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0IG9mIEJPVU5EQVJZX1NDQU5fT0ZGU0VUUykge1xuICAgICAgICAgICAgbGV0IGF0ID0gc3RhcnQgKyBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoYXQgPD0gbm93KSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBzY2hlZHVsZUtleSA9IGAke2tleX18JHtzdGFydH18JHtvZmZzZXR9YDtcbiAgICAgICAgICAgIGlmIChzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmhhcyhzY2hlZHVsZUtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5hZGQoc2NoZWR1bGVLZXkpO1xuICAgICAgICAgICAgbGV0IGFybSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCBhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdm9pZCBydW5Cb3VuZGFyeVNjYW4oa2V5LCBzdGFydCwgb2Zmc2V0KS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgICAgICAgICAgICAgfSwgTWF0aC5taW4oYXQgLSBEYXRlLm5vdygpLCBNQVhfUkVCVUlMRF9USU1FUl9ERUxBWSkpO1xuICAgICAgICAgICAgICAgICh0aW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYXJtKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJvdW5kYXJ5U2NhbihidWNrZXRLZXk6IHN0cmluZywgd2luZG93U3RhcnQ6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIsIG9mZnNldExhYmVsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhYmVsID0gYGJ1Y2tldCAke2J1Y2tldEtleX0sIHdpbmRvdyBzdGFydGluZyAke25ldyBEYXRlKHdpbmRvd1N0YXJ0KS50b0lTT1N0cmluZygpfSwgb2Zmc2V0ICR7b2Zmc2V0TGFiZWwgfHwgYCR7b2Zmc2V0IC8gMTAwMH1zYH1gO1xuICAgIGlmIChib3VuZGFyeVNjYW5zUnVubmluZy5oYXMoYnVja2V0S2V5KSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgU2tpcHBpbmcgYm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pOiB0aGUgcHJldmlvdXMgYm91bmRhcnkgc2NhbiBpcyBzdGlsbCBydW5uaW5nYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuYWRkKGJ1Y2tldEtleSk7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IGJ1Y2tldHMuZ2V0KGJ1Y2tldEtleSk7XG4gICAgICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgICAgIGxldCBzdG9yZSA9IGxvYWRlZC5zdG9yZTtcbiAgICAgICAgaWYgKCEoc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpKSByZXR1cm47XG4gICAgICAgIGxldCBlZmZlY3RpdmUgPSBsb2FkZWQucm91dGluZztcbiAgICAgICAgbGV0IHNlbGZJbmRleGVzID0gZmluZFNlbGZJbmRleGVzKGVmZmVjdGl2ZSwgbG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lKTtcbiAgICAgICAgbGV0IHNlbGZJbmRleFNldCA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgICAgICBsZXQgc2VsdmVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gZWZmZWN0aXZlLnNvdXJjZXNbaV0gYXMgSG9zdGVkQ29uZmlnKS5maWx0ZXIoeCA9PiB4LnZhbGlkV2luZG93WzBdID09PSB3aW5kb3dTdGFydCk7XG4gICAgICAgIGlmICghc2VsdmVzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgcHJldlRpbWUgPSB3aW5kb3dTdGFydCAtIDE7XG4gICAgICAgIGxldCBuZWVkRGlza1NjYW4gPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlbW90ZU93bmVycyA9IG5ldyBNYXA8bnVtYmVyLCBbbnVtYmVyLCBudW1iZXJdPigpO1xuICAgICAgICBmb3IgKGxldCBzZWxmIG9mIHNlbHZlcykge1xuICAgICAgICAgICAgbGV0IHNlbGZSb3V0ZSA9IHNlbGYucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgIGxldCBpZHggPSBlZmZlY3RpdmUuc291cmNlcy5pbmRleE9mKHNlbGYpO1xuICAgICAgICAgICAgbGV0IHNoYWRvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGlkeDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gd2luZG93U3RhcnQgJiYgd2luZG93U3RhcnQgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBpZiAoclswXSA8PSBzZWxmUm91dGVbMF0gJiYgc2VsZlJvdXRlWzFdIDw9IHJbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhZG93ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hhZG93ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHVuY292ZXJlZDogW251bWJlciwgbnVtYmVyXVtdID0gW1tzZWxmUm91dGVbMF0sIHNlbGZSb3V0ZVsxXV1dO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlZmZlY3RpdmUuc291cmNlcy5sZW5ndGggJiYgdW5jb3ZlcmVkLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyID0gZWZmZWN0aXZlLnNvdXJjZXNbal07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGV0IFt3cywgd2VdID0gb3RoZXIudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKCEod3MgPD0gcHJldlRpbWUgJiYgcHJldlRpbWUgPCB3ZSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByID0gb3RoZXIucm91dGUgfHwgRlVMTF9ST1VURTtcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhaW1lZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IG9mIHVuY292ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW50ZXIgPSByb3V0ZUludGVyc2VjdGlvbih1LCByKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLnB1c2godSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFpbWVkID0gY2xhaW1lZCAmJiBbTWF0aC5taW4oY2xhaW1lZFswXSwgaW50ZXJbMF0pLCBNYXRoLm1heChjbGFpbWVkWzFdLCBpbnRlclsxXSldIGFzIFtudW1iZXIsIG51bWJlcl0gfHwgaW50ZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1WzBdIDwgaW50ZXJbMF0pIHJlbWFpbmluZy5wdXNoKFt1WzBdLCBpbnRlclswXV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJbMV0gPCB1WzFdKSByZW1haW5pbmcucHVzaChbaW50ZXJbMV0sIHVbMV1dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5jb3ZlcmVkID0gcmVtYWluaW5nO1xuICAgICAgICAgICAgICAgIGlmICghY2xhaW1lZCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGZJbmRleFNldC5oYXMoaikpIHtcbiAgICAgICAgICAgICAgICAgICAgbmVlZERpc2tTY2FuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSByZW1vdGVPd25lcnMuZ2V0KGopO1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVPd25lcnMuc2V0KGosIGV4aXN0aW5nICYmIFtNYXRoLm1pbihleGlzdGluZ1swXSwgY2xhaW1lZFswXSksIE1hdGgubWF4KGV4aXN0aW5nWzFdLCBjbGFpbWVkWzFdKV0gYXMgW251bWJlciwgbnVtYmVyXSB8fCBjbGFpbWVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZWVkRGlza1NjYW4gJiYgIXJlbW90ZU93bmVycy5zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUubG9nKGBCb3VuZGFyeSBzY2FuICgke2xhYmVsfSk6IGRpc2tTY2FuPSR7bmVlZERpc2tTY2FufSwgcmVtb3RlIHByZXZpb3VzLXdpbmRvdyBvd25lcnM6ICR7cmVtb3RlT3duZXJzLnNpemV9YCk7XG4gICAgICAgIGlmIChuZWVkRGlza1NjYW4pIHtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JlLnJlc2NhbkJhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2luY2UgPSB3aW5kb3dTdGFydCAtIEJPVU5EQVJZX1NDQU5fTE9PS0JBQ0s7XG4gICAgICAgIGZvciAobGV0IFtzb3VyY2VJbmRleCwgcm91dGVdIG9mIHJlbW90ZU93bmVycykge1xuICAgICAgICAgICAgbGV0IG93bmVyU291cmNlID0gZWZmZWN0aXZlLnNvdXJjZXNbc291cmNlSW5kZXhdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvd25lclNvdXJjZSA9PT0gXCJzdHJpbmdcIikgY29udGludWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHN0b3JlLmJvdW5kYXJ5U2NhblJlbW90ZShjcmVhdGVBcGlBcmNoaXZlcyhvd25lclNvdXJjZSksIHsgc2luY2UsIHJvdXRlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KSBvZiBwcmV2aW91cy13aW5kb3cgb3duZXIgKHNvdXJjZSBpbmRleCAke3NvdXJjZUluZGV4fSkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYm91bmRhcnlTY2Fuc1J1bm5pbmcuZGVsZXRlKGJ1Y2tldEtleSk7XG4gICAgfVxufVxuXG50eXBlIFN0b3JlUGxhbiA9IHtcbiAgICBzZWxmRW50cmllczogSG9zdGVkQ29uZmlnW107XG4gICAgc2VsZjogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIHJhd0Rpc2s6IGJvb2xlYW47XG4gICAgc291cmNlU3BlY3M6IHsgc291cmNlQ29uZmlnPzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnOyB2YWxpZFdpbmRvdzogW251bWJlciwgbnVtYmVyXTsgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdOyBub0Z1bGxTeW5jPzogYm9vbGVhbiB9W107XG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIHN0cnVjdHVyZUtleTogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gc291cmNlSWRlbnRpdHkoc291cmNlQ29uZmlnOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghc291cmNlQ29uZmlnKSByZXR1cm4gXCJkaXNrXCI7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgLi4uc291cmNlQ29uZmlnLCB2YWxpZFdpbmRvdzogdW5kZWZpbmVkLCByb3V0ZTogdW5kZWZpbmVkIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcpOiBTdG9yZVBsYW4ge1xuICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhyb3V0aW5nLCBhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgc2VsZkVudHJpZXMgPSBzZWxmSW5kZXhlcy5tYXAoaSA9PiByb3V0aW5nLnNvdXJjZXNbaV0gYXMgSG9zdGVkQ29uZmlnKTtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoc2VsZkVudHJpZXMsIERhdGUubm93KCkpO1xuICAgIGxldCBzZWxmSW5kZXggPSAtMTtcbiAgICBpZiAoc2VsZikge1xuICAgICAgICBzZWxmSW5kZXggPSByb3V0aW5nLnNvdXJjZXMuaW5kZXhPZihzZWxmKTtcbiAgICB9XG4gICAgbGV0IGRpc2tXaW5kb3c6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gICAgaWYgKHNlbGYpIHtcbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNlbGYudmFsaWRXaW5kb3c7XG4gICAgICAgIGxldCBtZXJnZWQgPSB0cnVlO1xuICAgICAgICB3aGlsZSAobWVyZ2VkKSB7XG4gICAgICAgICAgICBtZXJnZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHNlbGZFbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IFtlbnRyeVN0YXJ0LCBlbnRyeUVuZF0gPSBlbnRyeS52YWxpZFdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA+IGVuZCB8fCBlbnRyeUVuZCA8IHN0YXJ0KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA8IHN0YXJ0IHx8IGVudHJ5RW5kID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIGVudHJ5U3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBNYXRoLm1heChlbmQsIGVudHJ5RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGlza1dpbmRvdyA9IFtzdGFydCwgZW5kXTtcbiAgICB9XG4gICAgbGV0IG93bkluZGV4ZXMgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICBsZXQgc291cmNlU3BlY3M6IFN0b3JlUGxhbltcInNvdXJjZVNwZWNzXCJdID0gW3tcbiAgICAgICAgdmFsaWRXaW5kb3c6IGRpc2tXaW5kb3csXG4gICAgfV07XG4gICAgaWYgKHNlbGZJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNlbGZJbmRleCArIDE7IGkgPCByb3V0aW5nLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSByb3V0aW5nLnNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBvd25JbmRleGVzLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc2hhcmVkUm91dGUgPSByb3V0ZUludGVyc2VjdGlvbihzZWxmPy5yb3V0ZSwgc291cmNlLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkUm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc291cmNlU3BlY3MucHVzaCh7IHNvdXJjZUNvbmZpZzogc291cmNlLCB2YWxpZFdpbmRvdzogc291cmNlLnZhbGlkV2luZG93LCByb3V0ZTogc2hhcmVkUm91dGUsIG5vRnVsbFN5bmM6IHNvdXJjZS5ub0Z1bGxTeW5jIHx8IHNlbGY/Lm5vRnVsbFN5bmMgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHJhd0Rpc2sgPSAhIXNlbGY/LnJhd0Rpc2s7XG4gICAgbGV0IHN0cnVjdHVyZUtleSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcmF3RGlzayxcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0OiBzZWxmPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc2VsZkVudHJpZXMsIHNlbGYsIHJhd0Rpc2ssIHNvdXJjZVNwZWNzLCByZWFkZXJEaXNrTGltaXQ6IHNlbGY/LnJlYWRlckRpc2tMaW1pdCwgc3RydWN0dXJlS2V5IH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCByb3V0aW5nOiBSZW1vdGVDb25maWcsIHBsYW4/OiBTdG9yZVBsYW4pOiBMb2FkZWRCdWNrZXQge1xuICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFwbGFuKSB7XG4gICAgICAgIHBsYW4gPSBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpO1xuICAgIH1cbiAgICBsZXQgeyBzZWxmRW50cmllcywgc2VsZiB9ID0gcGxhbjtcbiAgICBsZXQgc3RvcmU6IElCdWNrZXRTdG9yZTtcbiAgICBpZiAocGxhbi5yYXdEaXNrKSB7XG4gICAgICAgIHN0b3JlID0gbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc2VsZikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFRoaXMgc2VydmVyIGlzIG5vdCBpbiB0aGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IG5vIGxvbmdlciBzeW5jaHJvbml6aW5nLCB2YWxpZCB3aW5kb3cgdHJlYXRlZCBhcyBbMCwgMF0gKGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5KSwgZGlzayBkYXRhIGtlcHQgYW5kIHNlcnZlZGApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzb3VyY2VzOiBBcmNoaXZlc1NvdXJjZVtdID0gcGxhbi5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiAoe1xuICAgICAgICAgICAgc291cmNlOiBzcGVjLnNvdXJjZUNvbmZpZyAmJiBjcmVhdGVBcGlBcmNoaXZlcyhzcGVjLnNvdXJjZUNvbmZpZykgfHwgbmV3IEFyY2hpdmVzRGlzayhmb2xkZXIpLFxuICAgICAgICAgICAgdmFsaWRXaW5kb3c6IHNwZWMudmFsaWRXaW5kb3csXG4gICAgICAgICAgICByb3V0ZTogc3BlYy5yb3V0ZSxcbiAgICAgICAgICAgIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYyxcbiAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzcGVjLnNvdXJjZUNvbmZpZyksXG4gICAgICAgIH0pKTtcbiAgICAgICAgc3RvcmUgPSBuZXcgQmxvYlN0b3JlKGZvbGRlciwgc291cmNlcywge1xuICAgICAgICAgICAgb25JbmRleENoYW5nZWQ6IGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gUk9VVElOR19GSUxFKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdm9pZCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVhZGVyRGlza0xpbWl0OiBwbGFuLnJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgICAgIG9uV3JpdGVDb3VudGVkOiAoa2luZCwgYnl0ZXMpID0+IGNvdW50QnVja2V0V3JpdGUoYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWAsIGtpbmQsIGJ5dGVzKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBsb2FkZWQ6IExvYWRlZEJ1Y2tldCA9IHsgYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZywgcm91dGluZ0pTT046IEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpLCBzZWxmRW50cmllcywgc2VsZiwgc3RvcmUsIHN0cnVjdHVyZUtleTogcGxhbi5zdHJ1Y3R1cmVLZXkgfTtcbiAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZChsb2FkZWQpO1xuICAgIHNjaGVkdWxlQm91bmRhcnlTY2Fucyhsb2FkZWQpO1xuICAgIHJldHVybiBsb2FkZWQ7XG59XG5cbi8qKiBUaGUgcm91dGluZyBmaWxlIGlzIG91cnMsIG9uIG91ciBvd24gZGlzaywgYXQgYSBwYXRoIHdlIGtub3cgLSBzbyBpdCBpcyByZWFkIGRpcmVjdGx5LiBHb2luZyB0aHJvdWdoIGFuIEFyY2hpdmVzRGlzayB3b3VsZCBjb25zdHJ1Y3QgYSB3aG9sZSBzdG9yZSAoaGFuZGxlIGNhY2hlIHN3ZWVwIGxvb3AsIHVwbG9hZHMtZm9sZGVyIGNsZWFudXApIGp1c3QgdG8gcmVhZCBvbmUgZmlsZS4gKi9cbmZ1bmN0aW9uIGdldFJvdXRpbmdGaWxlUGF0aChmb2xkZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihmb2xkZXIsIFwiZmlsZXNcIiwgUk9VVElOR19GSUxFKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSb3V0aW5nRmlsZShmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGdldFJvdXRpbmdGaWxlUGF0aChmb2xkZXIpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlbW90ZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBkYXRhID0gYXdhaXQgcmVhZFJvdXRpbmdGaWxlKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSk7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgcm91dGluZyA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFyb3V0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBidWlsZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGxvYWRlZCA9IGxvYWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgbG9hZGVkKTtcbiAgICAgICAgdm9pZCBsb2FkZWQudGhlbihidWNrZXQgPT4ge1xuICAgICAgICAgICAgaWYgKCFidWNrZXQgJiYgYnVja2V0cy5nZXQoa2V5KSA9PT0gbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0cy5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGJ1Y2tldHMuZ2V0KGtleSkgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldHMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbG9hZGVkO1xufVxuXG5cbmNvbnN0IHJvdXRpbmdSZWxvYWRzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5mdW5jdGlvbiBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbmV4dCA9IChyb3V0aW5nUmVsb2Fkcy5nZXQoa2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgICAgLnRoZW4oKCkgPT4gY2hlY2tSb3V0aW5nQ2hhbmdlZChhY2NvdW50LCBidWNrZXROYW1lLCBjb25maWcpKVxuICAgICAgICAuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKGBSZWxvYWRpbmcgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX0gZmFpbGVkOmAsIGUpKTtcbiAgICByb3V0aW5nUmVsb2Fkcy5zZXQoa2V5LCBuZXh0KTtcbiAgICByZXR1cm4gbmV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tSb3V0aW5nQ2hhbmdlZChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnPzogeyBmb3JjZT86IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghcm91dGluZykgcmV0dXJuO1xuICAgIGlmICghY29uZmlnPy5mb3JjZSAmJiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSA9PT0gbG9hZGVkLnJvdXRpbmdKU09OKSByZXR1cm47XG4gICAgbGV0IHJlYXNvbiA9IGNvbmZpZz8uZm9yY2UgJiYgKGNvbmZpZy5yZWFzb24gfHwgXCJmb3JjZWRcIikgfHwgXCJyb3V0aW5nIGNvbmZpZyBjaGFuZ2VkXCI7XG4gICAgbGV0IHBsYW4gPSBjb21wdXRlU3RvcmVQbGFuKGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcpO1xuICAgIGlmIChwbGFuLnN0cnVjdHVyZUtleSA9PT0gbG9hZGVkLnN0cnVjdHVyZUtleSAmJiBsb2FkZWQuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFwcGx5aW5nIHRoZSByb3V0aW5nIGNvbmZpZyB0byB0aGUgcnVubmluZyBzdG9yZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KWApO1xuICAgICAgICBsb2FkZWQuc3RvcmUudXBkYXRlU291cmNlcyhwbGFuLnNvdXJjZVNwZWNzLm1hcChzcGVjID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbmZpZyA9IHNwZWMuc291cmNlQ29uZmlnO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VDb25maWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBpZGVudGl0eTogc291cmNlSWRlbnRpdHkodW5kZWZpbmVkKSwgdmFsaWRXaW5kb3c6IHNwZWMudmFsaWRXaW5kb3csIGNyZWF0ZTogKCk6IElBcmNoaXZlcyA9PiBuZXcgQXJjaGl2ZXNEaXNrKGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKSkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpdHk6IHNvdXJjZUlkZW50aXR5KHNvdXJjZUNvbmZpZyksXG4gICAgICAgICAgICAgICAgdmFsaWRXaW5kb3c6IHNwZWMudmFsaWRXaW5kb3csXG4gICAgICAgICAgICAgICAgcm91dGU6IHNwZWMucm91dGUsXG4gICAgICAgICAgICAgICAgbm9GdWxsU3luYzogc3BlYy5ub0Z1bGxTeW5jLFxuICAgICAgICAgICAgICAgIGNyZWF0ZTogKCkgPT4gY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlQ29uZmlnKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICAgICAgbGV0IHVwZGF0ZWQ6IExvYWRlZEJ1Y2tldCA9IHsgLi4ubG9hZGVkLCByb3V0aW5nLCByb3V0aW5nSlNPTjogSlNPTi5zdHJpbmdpZnkocm91dGluZyksIHNlbGZFbnRyaWVzOiBwbGFuLnNlbGZFbnRyaWVzLCBzZWxmOiBwbGFuLnNlbGYgfTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUodXBkYXRlZCkpO1xuICAgICAgICBzY2hlZHVsZVdpbmRvd0JvdW5kYXJ5UmVidWlsZCh1cGRhdGVkKTtcbiAgICAgICAgc2NoZWR1bGVCb3VuZGFyeVNjYW5zKHVwZGF0ZWQpO1xuICAgICAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBSZWJ1aWxkaW5nIHRoZSBzdG9yZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KWApO1xuICAgIGlmIChsb2FkZWQuc3RvcmUgaW5zdGFuY2VvZiBCbG9iU3RvcmUpIHtcbiAgICAgICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZywgcGxhbikpKTtcbiAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xufVxuXG5mdW5jdGlvbiBnZXRXcml0ZUNvbmZpZyhidWNrZXQ6IExvYWRlZEJ1Y2tldCwgd3JpdGVUaW1lOiBudW1iZXIsIHJvdXRlOiBudW1iZXIpOiB7IGZhc3Q/OiBib29sZWFuOyB3cml0ZURlbGF5PzogbnVtYmVyIH0ge1xuICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChidWNrZXQuc2VsZkVudHJpZXMsIHdyaXRlVGltZSwgcm91dGUpO1xuICAgIHJldHVybiB7IGZhc3Q6IHNlbGY/LmZhc3QsIHdyaXRlRGVsYXk6IHNlbGY/LndyaXRlRGVsYXkgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydE11dGFibGUoYnVja2V0OiBMb2FkZWRCdWNrZXQsIGZpbGVQYXRoOiBzdHJpbmcsIHdyaXRlVGltZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KGJ1Y2tldC5zZWxmRW50cmllcywgd3JpdGVUaW1lLCBnZXRSb3V0ZShmaWxlUGF0aCkpO1xuICAgIGlmICghc2VsZj8uaW1tdXRhYmxlKSByZXR1cm47XG4gICAgaWYgKGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRJbmZvKGZpbGVQYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2J1Y2tldC5hY2NvdW50fS8ke2J1Y2tldC5idWNrZXROYW1lfSBpcyBpbW11dGFibGUgKGF0IHdyaXRlIHRpbWUgJHt3cml0ZVRpbWV9KSBhbmQgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IGFscmVhZHkgZXhpc3RzLCBzbyBpdCBjYW5ub3QgYmUgd3JpdHRlbiB0b2ApO1xuICAgIH1cbn1cblxuY29uc3QgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSA9IDYwICogMTAwMDtcbmxldCBsYXN0V3JvbmdUYXJnZXRMb2cgPSAwO1xuZnVuY3Rpb24gbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKERhdGUubm93KCkgLSBsYXN0V3JvbmdUYXJnZXRMb2cgPCBXUk9OR19UQVJHRVRfTE9HX1RIUk9UVExFKSByZXR1cm47XG4gICAgbGFzdFdyb25nVGFyZ2V0TG9nID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cblxuY29uc3Qgcm91dGluZ1dyaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgaW5jb21pbmcgPSBwYXJzZVJvdXRpbmdEYXRhKGRhdGEpO1xuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgYXdhaXQgbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpLnNldChST1VUSU5HX0ZJTEUsIGRhdGEsIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICAgICAgYnVja2V0cy5zZXQoa2V5LCBQcm9taXNlLnJlc29sdmUoYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgaW5jb21pbmcpKSk7XG4gICAgICAgIGJyb2FkY2FzdFJvdXRpbmdDaGFuZ2VkKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBDcmVhdGVkIGJ1Y2tldCAke2tleX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpICE9PSBsb2FkZWQucm91dGluZ0pTT04gJiYgZ2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZykgPD0gZ2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZykpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBgQ2Fubm90IHVwZGF0ZSByb3V0aW5nIGNvbmZpZyBmb3IgYnVja2V0ICR7a2V5fTogdGhlIG5ldyBjb25maWcgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IG9uZSBidXQgaXRzIHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZyl9KSBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24gKCR7Z2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZyl9KS4gSW5jcmVtZW50IHRoZSB2ZXJzaW9uIHRvIHVwZGF0ZSBpdC4gQ3VycmVudDogJHtsb2FkZWQucm91dGluZ0pTT059LiBBdHRlbXB0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpfWA7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgbGV0IHN0b3JlZCA9IGluY29taW5nO1xuICAgIGxldCByZWluamVjdGVkID0gMDtcbiAgICBmb3IgKGxldCBpbnRlcm1lZGlhdGUgb2YgZ2V0SW50ZXJtZWRpYXRlU291cmNlcyhleHBpcmVJbnRlcm1lZGlhdGVTb3VyY2VzKGxvYWRlZC5yb3V0aW5nLCBEYXRlLm5vdygpKSkpIHtcbiAgICAgICAgc3RvcmVkID0gaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlKHN0b3JlZCwge1xuICAgICAgICAgICAgc3BsaXRVcmw6IGZpbmRTcGxpdFVybChsb2FkZWQucm91dGluZywgaW50ZXJtZWRpYXRlKSB8fCBpbnRlcm1lZGlhdGUudXJsLFxuICAgICAgICAgICAgaW50ZXJtZWRpYXRlVXJsOiBpbnRlcm1lZGlhdGUudXJsLFxuICAgICAgICAgICAgc3RhcnQ6IGludGVybWVkaWF0ZS52YWxpZFdpbmRvd1swXSxcbiAgICAgICAgICAgIGVuZDogaW50ZXJtZWRpYXRlLnZhbGlkV2luZG93WzFdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVpbmplY3RlZCsrO1xuICAgIH1cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc3RvcmVkKSAhPT0gSlNPTi5zdHJpbmdpZnkoaW5jb21pbmcpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZS1pbmplY3RlZCAke3JlaW5qZWN0ZWR9IGluLWZsaWdodCBzd2l0Y2hvdmVyIHdpbmRvd3MgaW50byB0aGUgaW5jb21pbmcgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX0gKHZlcnNpb24gJHtnZXRDb25maWdWZXJzaW9uKGluY29taW5nKX0pYCk7XG4gICAgfVxuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoUk9VVElOR19GSUxFLCBCdWZmZXIuZnJvbShzZXJpYWxpemVSZW1vdGVDb25maWcoc3RvcmVkKSksIHsgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlciwgY29uZmlnPzogeyBsYXN0TW9kaWZpZWQ/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICBpZiAoZmlsZVBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgICAgIGxldCBydW4gPSAocm91dGluZ1dyaXRlcy5nZXQoa2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSkudGhlbigoKSA9PiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudCwgYnVja2V0TmFtZSwgZGF0YSwgY29uZmlnKSk7XG4gICAgICAgIHJvdXRpbmdXcml0ZXMuc2V0KGtleSwgcnVuLnRoZW4oKCkgPT4geyB9LCAoKSA9PiB7IH0pKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bjtcbiAgICB9XG4gICAgbGV0IGxvYWRlZCA9IGF3YWl0IGdldExvYWRlZEJ1Y2tldChhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gZG9lcyBub3QgZXhpc3QuIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICB9XG4gICAgbGV0IHdyaXRlVGltZSA9IGNvbmZpZz8ubGFzdE1vZGlmaWVkIHx8IERhdGUubm93KCk7XG4gICAgbGV0IHJvdXRlID0gZ2V0Um91dGUoZmlsZVBhdGgpO1xuICAgIGlmICghY29uZmlnPy5sYXN0TW9kaWZpZWQgJiYgbG9hZGVkLnNlbGZFbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICBsZXQgdGltZVZhbGlkID0gbG9hZGVkLnNlbGZFbnRyaWVzLmZpbHRlcih4ID0+IHdyaXRlVGltZSA+PSB4LnZhbGlkV2luZG93WzBdICYmIHdyaXRlVGltZSA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgICAgICBpZiAoIXRpbWVWYWxpZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IHdyaXRlVGltZSAke3dyaXRlVGltZX0gKCR7bmV3IERhdGUod3JpdGVUaW1lKS50b0lTT1N0cmluZygpfSkgaXMgb3V0c2lkZSBhbGwgb3VyIHZhbGlkIHdpbmRvd3MgJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSAoYSBzd2l0Y2hvdmVyIG1vdmVkIHRoZSB3cml0ZSB0YXJnZXQpYCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7U1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1d9IFRoaXMgc2VydmVyIGlzIG5vdCBhIHZhbGlkIHdyaXRlIHRhcmdldCBhdCAke3dyaXRlVGltZX0gZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gKG91ciB2YWxpZCB3aW5kb3dzOiAke0pTT04uc3RyaW5naWZ5KGxvYWRlZC5zZWxmRW50cmllcy5tYXAoeCA9PiB4LnZhbGlkV2luZG93KSl9KS4gUmUtcmVzb2x2ZSB0aGUgY3VycmVudGx5IHZhbGlkIHNvdXJjZSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aW1lVmFsaWQuc29tZSh4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKSkge1xuICAgICAgICAgICAgbG9nV3JvbmdUYXJnZXRSZWplY3Rpb24oYFJlamVjdGluZyBmcmVzaCB3cml0ZSBvZiAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0gdG8gYnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfTogcm91dGUgJHtyb3V0ZX0gaXMgb3V0c2lkZSBvdXIgcm91dGVzICR7SlNPTi5zdHJpbmdpZnkodGltZVZhbGlkLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSkpfSBhdCB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICh0aGUgY2xpZW50J3Mgc2hhcmQgY29uZmlnIGlzIHN0YWxlKWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfUk9VVEV9IFRoaXMgc2VydmVyIGRvZXMgbm90IGhhbmRsZSByb3V0ZSAke3JvdXRlfSAoa2V5ICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSkgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gKG91ciByb3V0ZXMgYXQgdGhpcyB0aW1lOiAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0pLiBSZS1yZXNvbHZlIHRoZSBzb3VyY2UgZm9yIHRoaXMga2V5IGFuZCByZXRyeS5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBhc3NlcnRNdXRhYmxlKGxvYWRlZCwgZmlsZVBhdGgsIHdyaXRlVGltZSk7XG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLnNldChmaWxlUGF0aCwgZGF0YSwgeyAuLi5nZXRXcml0ZUNvbmZpZyhsb2FkZWQsIHdyaXRlVGltZSwgcm91dGUpLCBsYXN0TW9kaWZpZWQ6IHdyaXRlVGltZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldENvbmZpZyhidWNrZXQ6IExvYWRlZEJ1Y2tldCk6IEFyY2hpdmVzQ29uZmlnIHtcbiAgICBsZXQgcHJvZ3Jlc3MgPSBidWNrZXQuc3RvcmUuZ2V0U3luY1Byb2dyZXNzPy4oKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogISFidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyLFxuICAgICAgICByZW1vdGVDb25maWc6IGJ1Y2tldC5yb3V0aW5nLFxuICAgICAgICBpbmRleDogcHJvZ3Jlc3M/LmluZGV4LFxuICAgICAgICBpbmRleFNvdXJjZXM6IHByb2dyZXNzPy5zb3VyY2VzLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IHByb2dyZXNzPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIHN5bmNpbmc6IHByb2dyZXNzPy5zeW5jaW5nLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWJ1aWxkQWxsTG9hZGVkQnVja2V0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBrZXkgb2YgWy4uLmJ1Y2tldHMua2V5cygpXSkge1xuICAgICAgICBsZXQgc2xhc2ggPSBrZXkuaW5kZXhPZihcIi9cIik7XG4gICAgICAgIGF3YWl0IHNjaGVkdWxlUm91dGluZ1JlbG9hZChrZXkuc2xpY2UoMCwgc2xhc2gpLCBrZXkuc2xpY2Uoc2xhc2ggKyAxKSwgeyBmb3JjZTogdHJ1ZSwgcmVhc29uOiBcImFsbCBsb2FkZWQgYnVja2V0cyB3ZXJlIGFza2VkIHRvIHJlYnVpbGRcIiB9KTtcbiAgICB9XG59XG5cbmNvbnN0IE9XTl9DT05GSUdfV1JJVEVfVEhST1RUTEUgPSAzMCAqIDEwMDA7XG5jb25zdCBJTlRFUk1FRElBVEVfTUFJTlRBSU5fSU5URVJWQUwgPSA2MCAqIDEwMDA7XG5sZXQgbGFzdE93bkNvbmZpZ1dyaXRlID0gMDtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVPd25Sb3V0aW5nQ29uZmlnKGxvYWRlZDogTG9hZGVkQnVja2V0LCB1cGRhdGVkOiBSZW1vdGVDb25maWcsIHJlYXNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IHNpbmNlTGFzdCA9IERhdGUubm93KCkgLSBsYXN0T3duQ29uZmlnV3JpdGU7XG4gICAgaWYgKHNpbmNlTGFzdCA8IE9XTl9DT05GSUdfV1JJVEVfVEhST1RUTEUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE5vdCB3cml0aW5nIG91ciBvd24gcm91dGluZyBjb25maWcgdXBkYXRlIGZvciBidWNrZXQgJHtrZXl9ICgke3JlYXNvbn0pOiB0aGUgbGFzdCBvbmUgd2FzICR7c2luY2VMYXN0fW1zIGFnbywgdW5kZXIgdGhlICR7T1dOX0NPTkZJR19XUklURV9USFJPVFRMRX1tcyB0aHJvdHRsZS4gUmV0cnlpbmcgb24gdGhlIG5leHQgbWFpbnRlbmFuY2UgcGFzcy4gV2FudGVkOiAke0pTT04uc3RyaW5naWZ5KHVwZGF0ZWQpfWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RPd25Db25maWdXcml0ZSA9IERhdGUubm93KCk7XG4gICAgbGV0IHZlcnNpb24gPSBuZXh0SW50ZXJtZWRpYXRlVmVyc2lvbihnZXRDb25maWdWZXJzaW9uKGxvYWRlZC5yb3V0aW5nKSk7XG4gICAgbGV0IG5leHQ6IFJlbW90ZUNvbmZpZyA9IHsgLi4udXBkYXRlZCwgdmVyc2lvbiB9O1xuICAgIGNvbnNvbGUubG9nKGBXcml0aW5nIG91ciBvd24gcm91dGluZyBjb25maWcgdXBkYXRlIGZvciBidWNrZXQgJHtrZXl9ICgke3JlYXNvbn0pLCB2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZyl9IC0+ICR7dmVyc2lvbn06ICR7SlNPTi5zdHJpbmdpZnkobmV4dCl9YCk7XG4gICAgbGV0IGRhdGEgPSBCdWZmZXIuZnJvbShzZXJpYWxpemVSZW1vdGVDb25maWcobmV4dCkpO1xuICAgIGF3YWl0IHdyaXRlQnVja2V0RmlsZShsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUsIFJPVVRJTkdfRklMRSwgZGF0YSk7XG4gICAgYXdhaXQgcHJvcGFnYXRlUm91dGluZ0NvbmZpZyhsb2FkZWQsIG5leHQsIGRhdGEpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9wYWdhdGVSb3V0aW5nQ29uZmlnKGxvYWRlZDogTG9hZGVkQnVja2V0LCBuZXh0OiBSZW1vdGVDb25maWcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0YXJnZXRzID0gbmV3IE1hcDxzdHJpbmcsIEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZz4oKTtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2YgWy4uLmxvYWRlZC5yb3V0aW5nLnNvdXJjZXMsIC4uLm5leHQuc291cmNlc10pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLmludGVybWVkaWF0ZSkgY29udGludWU7XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHNvdXJjZS51cmwpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZC5hY2NvdW50ICE9PSBsb2FkZWQuYWNjb3VudCB8fCBwYXJzZWQuYnVja2V0TmFtZSAhPT0gbG9hZGVkLmJ1Y2tldE5hbWUpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXRzLmhhcyhzb3VyY2UudXJsKSkgY29udGludWU7XG4gICAgICAgIHRhcmdldHMuc2V0KHNvdXJjZS51cmwsIHNvdXJjZSk7XG4gICAgfVxuICAgIGZvciAobGV0IFt1cmwsIHNvdXJjZV0gb2YgdGFyZ2V0cykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlKS5zZXQoUk9VVElOR19GSUxFLCBkYXRhKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBQcm9wYWdhdGVkIG91ciByb3V0aW5nIGNvbmZpZyB1cGRhdGUgdG8gJHt1cmx9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb3BhZ2F0aW5nIG91ciByb3V0aW5nIGNvbmZpZyB1cGRhdGUgdG8gJHt1cmx9IGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbnRhaW5JbnRlcm1lZGlhdGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIGxldCB0YWtlb3ZlciA9IGdldFRha2VvdmVySW50ZXJtZWRpYXRlKCk7XG4gICAgZm9yIChsZXQga2V5IG9mIFsuLi5idWNrZXRzLmtleXMoKV0pIHtcbiAgICAgICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICBpZiAoIWxvYWRlZFByb21pc2UpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoIWxvYWRlZCkgY29udGludWU7XG4gICAgICAgIGxldCBleHBpcmVkID0gZXhwaXJlSW50ZXJtZWRpYXRlU291cmNlcyhsb2FkZWQucm91dGluZywgRGF0ZS5ub3coKSk7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShleHBpcmVkKSAhPT0gSlNPTi5zdHJpbmdpZnkobG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZU93blJvdXRpbmdDb25maWcobG9hZGVkLCBleHBpcmVkLCBgc3dpdGNob3ZlciB3aW5kb3dzIGV4cGlyZWQgbW9yZSB0aGFuICR7SU5URVJNRURJQVRFX0VYUElSRV9HUkFDRSAvIDEwMDB9cyBhZ29gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGFrZW92ZXIpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgbWFpblVybCA9IGxvYWRlZC5yb3V0aW5nLnNvdXJjZXMuZmluZCh4ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiB8fCB4LnR5cGUgIT09IFwicmVtb3RlXCIgfHwgeC5pbnRlcm1lZGlhdGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybCh4LnVybCk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkLmFkZHJlc3MgPT09IGRvbWFpbiAmJiBwYXJzZWQucG9ydCA9PT0gcG9ydDtcbiAgICAgICAgfSkgYXMgSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIW1haW5VcmwpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgaW5qZWN0ZWQgPSBpbmplY3RJbnRlcm1lZGlhdGVTb3VyY2UobG9hZGVkLnJvdXRpbmcsIHtcbiAgICAgICAgICAgIHNwbGl0VXJsOiBtYWluVXJsLnVybCxcbiAgICAgICAgICAgIGludGVybWVkaWF0ZVVybDogcmVwbGFjZUhvc3RlZFVybFBvcnQobWFpblVybC51cmwsIHRha2VvdmVyLmFsdFBvcnQpLFxuICAgICAgICAgICAgc3RhcnQ6IHRha2VvdmVyLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiB0YWtlb3Zlci5lbmQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaW5qZWN0ZWQpID09PSBKU09OLnN0cmluZ2lmeShsb2FkZWQucm91dGluZykpIGNvbnRpbnVlO1xuICAgICAgICBhd2FpdCB3cml0ZU93blJvdXRpbmdDb25maWcobG9hZGVkLCBpbmplY3RlZCwgYHdlIGFyZSBhIGRlcGxveSBzdWNjZXNzb3I6IHdyaXRlcyByb3V0ZSB0byBvdXIgYWx0ZXJuYXRlIHBvcnQgJHt0YWtlb3Zlci5hbHRQb3J0fSBmcm9tICR7bmV3IERhdGUodGFrZW92ZXIuc3RhcnQpLnRvSVNPU3RyaW5nKCl9IHVudGlsIG91ciBwcmVkZWNlc3NvciBpcyBraWxsZWQgYXQgJHtuZXcgRGF0ZSh0YWtlb3Zlci5lbmQpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgfVxufVxuXG4vKiogU3RhcnRlZCBieSBkZXBsb3lUYWtlb3ZlciBvbmNlIHdlIGFyZSBhY3R1YWxseSBhIGRlcGxveSBzdWNjZXNzb3IgbGlzdGVuaW5nIG9uIGFuIGFsdGVybmF0ZSBwb3J0LiBVbnRpbCB0aGVuIHRoZXJlIGFyZSBubyBzd2l0Y2hvdmVyIHdpbmRvd3MgdG8gd3JpdGUgb3IgZXhwaXJlLCBzbyBub3RoaW5nIHBvbGxzLiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0SW50ZXJtZWRpYXRlTWFpbnRlbmFuY2UgPSBsYXp5KCgpID0+IHtcbiAgICB2b2lkIG1haW50YWluSW50ZXJtZWRpYXRlcygpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgTWFpbnRhaW5pbmcgc3dpdGNob3ZlciByb3V0aW5nIHdpbmRvd3MgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgcnVuSW5maW5pdGVQb2xsKElOVEVSTUVESUFURV9NQUlOVEFJTl9JTlRFUlZBTCwgbWFpbnRhaW5JbnRlcm1lZGlhdGVzKTtcbn0pO1xuXG5leHBvcnQgdHlwZSBCdWNrZXREaXNrSW5mbyA9IHtcbiAgICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gICAgZnJlZUJ5dGVzOiBudW1iZXI7XG4gICAgdXNlZEJ5dGVzOiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKiBXaGVyZSB0aGUgYnVja2V0J3MgZGF0YSBsaXZlcyBvbiB0aGlzIHNlcnZlciAqL1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgZHJpdmUgdGhhdCBmb2xkZXIgaXMgb24uIEJ1Y2tldHMgc2hhcmluZyBhIGRyaXZlIHJlcG9ydCB0aGUgc2FtZSBudW1iZXJzLiAqL1xuICAgIGRpc2s/OiBCdWNrZXREaXNrSW5mbztcbiAgICBkaXNrRXJyb3I/OiBzdHJpbmc7XG4gICAgd3JpdGVTdGF0cz86IEJ1Y2tldFdyaXRlU3RhdHM7XG4gICAgY29uZmlnPzogQXJjaGl2ZXNDb25maWc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBnZXREaXNrSW5mbyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8QnVja2V0RGlza0luZm8+IHtcbiAgICBsZXQgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0ZnMoZm9sZGVyKTtcbiAgICBsZXQgYmxvY2tTaXplID0gTnVtYmVyKHN0YXRzLmJzaXplKTtcbiAgICBsZXQgdG90YWxCeXRlcyA9IE51bWJlcihzdGF0cy5ibG9ja3MpICogYmxvY2tTaXplO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsQnl0ZXMsXG4gICAgICAgIC8vIE1hdGNoZXMgdGhlIHNlcnZlcidzIG93biBsb3ctc3BhY2UgY2hlY2s6IHdoYXQgYW4gdW5wcml2aWxlZ2VkIHByb2Nlc3MgY2FuIGFjdHVhbGx5IHVzZVxuICAgICAgICBmcmVlQnl0ZXM6IE51bWJlcihzdGF0cy5iYXZhaWwpICogYmxvY2tTaXplLFxuICAgICAgICB1c2VkQnl0ZXM6IHRvdGFsQnl0ZXMgLSBOdW1iZXIoc3RhdHMuYmZyZWUpICogYmxvY2tTaXplLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBsZXQgYWNjb3VudEZvbGRlciA9IHBhdGguam9pbihnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkuZm9sZGVyLCBcImJ1Y2tldHMyXCIsIGFjY291bnQpO1xuICAgIGxldCBuYW1lczogc3RyaW5nW107XG4gICAgdHJ5IHtcbiAgICAgICAgbmFtZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGFjY291bnRGb2xkZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChuYW1lcy5tYXAoYXN5bmMgYnVja2V0TmFtZSA9PiB7XG4gICAgICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICAgICAgbGV0IGZvbGRlciA9IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgbGV0IGJhc2U6IFNlcnZlckJ1Y2tldEluZm8gPSB7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogZmFsc2UsIGZvbGRlciB9O1xuICAgICAgICBsZXQgW2Rpc2ssIHdyaXRlU3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgZ2V0RGlza0luZm8oZm9sZGVyKS5jYXRjaCgoZTogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBiYXNlLmRpc2tFcnJvciA9IFN0cmluZyhlLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZ2V0QnVja2V0V3JpdGVTdGF0cyhrZXkpLFxuICAgICAgICBdKTtcbiAgICAgICAgYmFzZS5kaXNrID0gZGlzaztcbiAgICAgICAgYmFzZS53cml0ZVN0YXRzID0gd3JpdGVTdGF0cztcbiAgICAgICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChrZXkpO1xuICAgICAgICBpZiAobG9hZGVkUHJvbWlzZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZTtcbiAgICAgICAgICAgICAgICBpZiAobG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGFjdGl2ZTogdHJ1ZSwgY29uZmlnOiBnZXRCdWNrZXRDb25maWcobG9hZGVkKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBhY3RpdmU6IHRydWUsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCByZWFkUm91dGluZ0ZpbGUoZm9sZGVyKTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBgTm8gcm91dGluZyBmaWxlICgke1JPVVRJTkdfRklMRX0pYCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgY29uZmlnOiB7IHJlbW90ZUNvbmZpZzogcGFyc2VSb3V0aW5nRGF0YShkYXRhKSB9IH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUJ1Y2tldEZpbGUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZmlsZVBhdGggPT09IFJPVVRJTkdfRklMRSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByb3V0aW5nIGNvbmZpZyAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IGNhbm5vdCBiZSBkZWxldGVkIChvdmVyd3JpdGUgaXQgdG8gY2hhbmdlIHRoZSBidWNrZXQncyBjb25maWd1cmF0aW9uKWApO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSByZXR1cm47XG4gICAgYXdhaXQgbG9hZGVkLnN0b3JlLmRlbChmaWxlUGF0aCwgZ2V0V3JpdGVDb25maWcobG9hZGVkLCBEYXRlLm5vdygpLCBnZXRSb3V0ZShmaWxlUGF0aCkpKTtcbn1cblxuY29uc3QgTEFSR0VfRklMRV9QQVJUX1NJWkUgPSA4ICogMTAyNCAqIDEwMjQ7XG5cbmNsYXNzIEFyY2hpdmVzTG9jYWxCdWNrZXQgaW1wbGVtZW50cyBJQXJjaGl2ZXMge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYWNjb3VudDogc3RyaW5nLCBwcml2YXRlIGJ1Y2tldE5hbWU6IHN0cmluZykgeyB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1Y2tldCgpOiBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gYGxvY2FsQnVja2V0IGFjY291bnQgJHt0aGlzLmFjY291bnR9IGJ1Y2tldCAke3RoaXMuYnVja2V0TmFtZX1gO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXN1bHQgJiYgcmVzdWx0LmRhdGEgfHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiB7IHJhbmdlPzogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IH0pOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldDIoZmlsZU5hbWUsIGNvbmZpZyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXQoZmlsZU5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVCdWNrZXRGaWxlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSwgZGF0YSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZGVsKGZpbGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlQnVja2V0RmlsZSh0aGlzLmFjY291bnQsIHRoaXMuYnVja2V0TmFtZSwgZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGdldE5leHREYXRhKCk6IFByb21pc2U8QnVmZmVyIHwgdW5kZWZpbmVkPiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGFzc2VydFdyaXRlc0FsbG93ZWQoKTtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShidWNrZXQsIGNvbmZpZy5wYXRoLCBEYXRlLm5vdygpKTtcbiAgICAgICAgbGV0IGlkID0gYXdhaXQgYnVja2V0LnN0b3JlLnN0YXJ0TGFyZ2VVcGxvYWQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBjb25maWcuZ2V0TmV4dERhdGEoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGRhdGEubGVuZ3RoOyBvZmZzZXQgKz0gTEFSR0VfRklMRV9QQVJUX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmFwcGVuZExhcmdlVXBsb2FkKGlkLCBkYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgTEFSR0VfRklMRV9QQVJUX1NJWkUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuZmluaXNoTGFyZ2VVcGxvYWQoaWQsIGNvbmZpZy5wYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYXdhaXQgYnVja2V0LnN0b3JlLmNhbmNlbExhcmdlVXBsb2FkKGlkKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8eyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldEluZm8oZmlsZU5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpbmQocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5maW5kSW5mbyhwcmVmaXgsIGNvbmZpZykpLm1hcCh4ID0+IHgucGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRVUkwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgICAgICByZXR1cm4gYnVpbGRGaWxlVXJsKGBodHRwczovLyR7ZG9tYWlufToke3BvcnR9L2ZpbGUvJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5hY2NvdW50KX0vJHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5idWNrZXROYW1lKX1gLCBmaWxlUGF0aCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRDb25maWcoKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IHN1cHBvcnRzQ2hhbmdlc0FmdGVyOiB0cnVlIH07XG4gICAgICAgIHJldHVybiBnZXRCdWNrZXRDb25maWcoYnVja2V0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENoYW5nZXNBZnRlcih0aW1lOiBudW1iZXIpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoIWJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBnZXRDaGFuZ2VzQWZ0ZXIgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIGluZGV4KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0Q2hhbmdlc0FmdGVyKHRpbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3luY1N0YXR1cygpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB7IGFsbFNjYW5zQ29tcGxldGU6IHRydWUsIGluZGV4U2l6ZTogMCwgc291cmNlczogW10gfTtcbiAgICAgICAgaWYgKCFidWNrZXQuc3RvcmUuZ2V0U3luY1N0YXR1cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGdldFN5bmNTdGF0dXMgKHJhd0Rpc2sgYnVja2V0cyBoYXZlIG5vIHN5bmNocm9uaXphdGlvbilgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgYnVja2V0LnN0b3JlLmdldFN5bmNTdGF0dXMoKTtcbiAgICB9XG59XG5cbmNvbnN0IGxvY2FsQXJjaGl2ZXMgPSBuZXcgTWFwPHN0cmluZywgSUFyY2hpdmVzPigpO1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsQXJjaGl2ZXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBJQXJjaGl2ZXMge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgZXhpc3RpbmcgPSBsb2NhbEFyY2hpdmVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGxldCBhcmNoaXZlcyA9IG5ldyBBcmNoaXZlc0xvY2FsQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxvY2FsQXJjaGl2ZXMuc2V0KGtleSwgYXJjaGl2ZXMpO1xuICAgIHJldHVybiBhcmNoaXZlcztcbn1cbiJdfQ==
973
- /* _JS_SOURCE_HASH = "2489a05f93568a950763a289ff937f5c4e7ba23840b73b429c3614617f7e90a8"; */
1042
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIseURBQW1EO0FBQ25ELDJEQUErRDtBQUMvRCxvREFBeUQ7QUFDekQsOERBQTJEO0FBQzNELGdEQUE2QztBQUM3QyxrREFBK0M7QUFDL0MsMkNBQXlHO0FBQ3pHLDRDQUlzQjtBQUN0QixpREFBeU07QUFDek0sK0RBQXNMO0FBQ3RMLHFEQUEyRDtBQUMzRCxxREFBcUQ7QUFFckQsMkRBQThEO0FBRTlELHVDQUFtQztBQVduQyxJQUFJLE1BQXVDLENBQUM7QUFDNUMsU0FBZ0Isc0JBQXNCLENBQUMsS0FBMEI7SUFDN0QsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUNuQixDQUFDO0FBRkQsd0RBRUM7QUFDRCxTQUFnQixzQkFBc0I7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBTEQsd0RBS0M7QUFDRCxTQUFnQiw4QkFBOEI7SUFDMUMsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUZELHdFQUVDO0FBRUQsSUFBSSxvQkFBd0MsQ0FBQztBQUM3QyxTQUFnQix1QkFBdUIsQ0FBQyxNQUEwQjtJQUM5RCxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsQ0FBQztBQUZELDBEQUVDO0FBQ0QsU0FBZ0IsdUJBQXVCO0lBQ25DLE9BQU8sb0JBQW9CLENBQUM7QUFDaEMsQ0FBQztBQUZELDBEQUVDO0FBQ0QsU0FBZ0IsbUJBQW1CO0lBQy9CLElBQUksb0JBQW9CO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFGRCxrREFF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QVUsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSwyRUFBMkUsQ0FBQyxDQUFDO1FBQzFJLENBQUM7UUFDRCxPQUFPLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0NBQ0o7QUFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUNuRCxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFlLEVBQUUsVUFBa0I7SUFDaEUsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLElBQUksVUFBVSxFQUFFLENBQUM7SUFDckMsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM5QixJQUFJLFFBQVEsR0FBRyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1RCxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqQyxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBUEQsNENBT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgbGF6eSB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IHJ1bkluZmluaXRlUG9sbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRGaWxlU3RvcmFnZU5lc3RlZDIgfSBmcm9tIFwiLi4vRmlsZUZvbGRlckFQSVwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TdG9yYWdlIH0gZnJvbSBcIi4uL1RyYW5zYWN0aW9uU3RvcmFnZVwiO1xuaW1wb3J0IHsgSlNPTlN0b3JhZ2UgfSBmcm9tIFwiLi4vSlNPTlN0b3JhZ2VcIjtcbmltcG9ydCB7IEFyY2hpdmVzRGlzayB9IGZyb20gXCIuLi9BcmNoaXZlc0Rpc2tcIjtcbmltcG9ydCB7IEJsb2JTdG9yZSwgSUJ1Y2tldFN0b3JlLCBERUZBVUxUX0ZBU1RfV1JJVEVfREVMQVksIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgSG9zdGVkQ29uZmlnLCBCYWNrYmxhemVDb25maWcsIElBcmNoaXZlcywgQXJjaGl2ZXNTb3VyY2UsIEFyY2hpdmVGaWxlSW5mbywgQXJjaGl2ZXNDb25maWcsXG4gICAgQXJjaGl2ZXNTeW5jU3RhdHVzLFxuICAgIFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XLCBTVE9SQUdFX1dST05HX1JPVVRFLCBGVUxMX1JPVVRFLFxufSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBST1VUSU5HX0ZJTEUsIHBhcnNlUm91dGluZ0RhdGEsIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZywgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0LCBidWlsZEZpbGVVcmwsIGdldENvbmZpZ1ZlcnNpb24sIGdldFJvdXRlLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlLCBleHBpcmVJbnRlcm1lZGlhdGVTb3VyY2VzLCBnZXRJbnRlcm1lZGlhdGVTb3VyY2VzLCBmaW5kU3BsaXRVcmwsIG5leHRJbnRlcm1lZGlhdGVWZXJzaW9uLCBJTlRFUk1FRElBVEVfRVhQSVJFX0dSQUNFIH0gZnJvbSBcIi4vaW50ZXJtZWRpYXRlU291cmNlc1wiO1xuaW1wb3J0IHsgZ2V0VGFrZW92ZXJJbnRlcm1lZGlhdGUgfSBmcm9tIFwiLi9kZXBsb3lUYWtlb3ZlclwiO1xuaW1wb3J0IHsgY3JlYXRlQXBpQXJjaGl2ZXMgfSBmcm9tIFwiLi9jcmVhdGVBcmNoaXZlc1wiO1xuaW1wb3J0IHR5cGUgeyBJU3RvcmFnZSB9IGZyb20gXCIuLi9JU3RvcmFnZVwiO1xuaW1wb3J0IHsgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBBY2Nlc3NSZXF1ZXN0LCBUcnVzdFJlY29yZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBnZXRBcmcgfSBmcm9tIFwiLi9jbGlBcmdzXCI7XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VTZXJ2ZXJDb25maWcgPSB7XG4gICAgZG9tYWluOiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHJvb3REb21haW46IHN0cmluZztcbiAgICBzc2hUYXJnZXQ6IHN0cmluZztcbiAgICBzZXJ2ZXJDb21tYW5kOiBzdHJpbmc7XG4gICAgZm9sZGVyOiBzdHJpbmc7XG59O1xuXG5sZXQgY29uZmlnOiBTdG9yYWdlU2VydmVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIHNldFN0b3JhZ2VTZXJ2ZXJDb25maWcodmFsdWU6IFN0b3JhZ2VTZXJ2ZXJDb25maWcpOiB2b2lkIHtcbiAgICBjb25maWcgPSB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk6IFN0b3JhZ2VTZXJ2ZXJDb25maWcge1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkICh0aGlzIEFQSSBvbmx5IHdvcmtzIG9uIHRoZSBzdG9yYWdlIHNlcnZlcilgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTogU3RvcmFnZVNlcnZlckNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbmZpZztcbn1cblxubGV0IHdyaXRlc1JlamVjdGVkUmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gc2V0V3JpdGVzUmVqZWN0ZWRSZWFzb24ocmVhc29uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB3cml0ZXNSZWplY3RlZFJlYXNvbiA9IHJlYXNvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRXcml0ZXNSZWplY3RlZFJlYXNvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB3cml0ZXNSZWplY3RlZFJlYXNvbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRXcml0ZXNBbGxvd2VkKCk6IHZvaWQge1xuICAgIGlmICh3cml0ZXNSZWplY3RlZFJlYXNvbikgdGhyb3cgbmV3IEVycm9yKHdyaXRlc1JlamVjdGVkUmVhc29uKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RvcmFnZUZvbGRlcigpOiBzdHJpbmcge1xuICAgIGxldCBjb25maWcgPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKTtcbiAgICBpZiAoY29uZmlnKSByZXR1cm4gY29uZmlnLmZvbGRlcjtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QXJnKFwiZm9sZGVyXCIpO1xuICAgIGlmICghZm9sZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBzZXJ2ZXIgaXMgbm90IGluaXRpYWxpemVkIGFuZCB0aGVyZSBpcyBubyAtLWZvbGRlciBhcmcsIHNvIHRoZSBzdG9yYWdlIGZvbGRlciBpcyB1bmtub3duYCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoZm9sZGVyKTtcbn1cblxuY29uc3Qgc3lzdGVtU3RvcmFnZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxJU3RvcmFnZTx1bmtub3duPj4+KCk7XG5mdW5jdGlvbiBnZXRTeXN0ZW1TdG9yYWdlPFQ+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8SVN0b3JhZ2U8VD4+IHtcbiAgICBsZXQgc3RvcmFnZSA9IHN5c3RlbVN0b3JhZ2VzLmdldChuYW1lKTtcbiAgICBpZiAoIXN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcm9vdCA9IGF3YWl0IGdldEZpbGVTdG9yYWdlTmVzdGVkMihnZXRTdG9yYWdlRm9sZGVyKCkpO1xuICAgICAgICAgICAgbGV0IHN5c3RlbSA9IGF3YWl0IHJvb3QuZm9sZGVyLmdldFN0b3JhZ2UoXCJzeXN0ZW0yXCIpO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uTmFtZSA9IFwic3RvcmFnZVwiICsgbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlN0b3JhZ2U8dW5rbm93bj4obmV3IFRyYW5zYWN0aW9uU3RvcmFnZShhd2FpdCBzeXN0ZW0uZm9sZGVyLmdldFN0b3JhZ2UobmFtZSksIHRyYW5zYWN0aW9uTmFtZSkpO1xuICAgICAgICB9KSgpO1xuICAgICAgICBzeXN0ZW1TdG9yYWdlcy5zZXQobmFtZSwgc3RvcmFnZSk7XG4gICAgfVxuICAgIHJldHVybiBzdG9yYWdlIGFzIFByb21pc2U8SVN0b3JhZ2U8VD4+O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFRydXN0KCk6IFByb21pc2U8SVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8VHJ1c3RSZWNvcmQ+KFwidHJ1c3RcIik7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVxdWVzdHMoKTogUHJvbWlzZTxJU3RvcmFnZTxBY2Nlc3NSZXF1ZXN0W10+PiB7XG4gICAgcmV0dXJuIGdldFN5c3RlbVN0b3JhZ2U8QWNjZXNzUmVxdWVzdFtdPihcInJlcXVlc3RzXCIpO1xufVxuXG5leHBvcnQgdHlwZSBCdWNrZXRXcml0ZVN0YXRzID0ge1xuICAgIC8qKiBFdmVyeSBzZXQgY2FsbCB0aGUgYnVja2V0IGFjY2VwdGVkICovXG4gICAgb3JpZ2luYWxXcml0ZXM6IG51bWJlcjtcbiAgICBvcmlnaW5hbEJ5dGVzOiBudW1iZXI7XG4gICAgLyoqIFdoYXQgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc291cmNlcy4gRmFzdCB3cml0ZXMgY29hbGVzY2UgcmVwZWF0ZWQgd3JpdGVzIHRvIHRoZSBzYW1lIGtleSwgc28gdGhpcyBpcyBsb3dlciB0aGFuIHRoZSBvcmlnaW5hbCBjb3VudHMgKGFuZCBpcyB3aGF0IHRoZSBkaXNrIGFjdHVhbGx5IGRpZCkuICovXG4gICAgZmx1c2hlZFdyaXRlczogbnVtYmVyO1xuICAgIGZsdXNoZWRCeXRlczogbnVtYmVyO1xufTtcbmZ1bmN0aW9uIGVtcHR5V3JpdGVTdGF0cygpOiBCdWNrZXRXcml0ZVN0YXRzIHtcbiAgICByZXR1cm4geyBvcmlnaW5hbFdyaXRlczogMCwgb3JpZ2luYWxCeXRlczogMCwgZmx1c2hlZFdyaXRlczogMCwgZmx1c2hlZEJ5dGVzOiAwIH07XG59XG5mdW5jdGlvbiBhZGRXcml0ZVN0YXRzKGE6IEJ1Y2tldFdyaXRlU3RhdHMsIGI6IEJ1Y2tldFdyaXRlU3RhdHMpOiBCdWNrZXRXcml0ZVN0YXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbFdyaXRlczogYS5vcmlnaW5hbFdyaXRlcyArIGIub3JpZ2luYWxXcml0ZXMsXG4gICAgICAgIG9yaWdpbmFsQnl0ZXM6IGEub3JpZ2luYWxCeXRlcyArIGIub3JpZ2luYWxCeXRlcyxcbiAgICAgICAgZmx1c2hlZFdyaXRlczogYS5mbHVzaGVkV3JpdGVzICsgYi5mbHVzaGVkV3JpdGVzLFxuICAgICAgICBmbHVzaGVkQnl0ZXM6IGEuZmx1c2hlZEJ5dGVzICsgYi5mbHVzaGVkQnl0ZXMsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldFdyaXRlU3RhdHNTdG9yYWdlKCk6IFByb21pc2U8SVN0b3JhZ2U8QnVja2V0V3JpdGVTdGF0cz4+IHtcbiAgICByZXR1cm4gZ2V0U3lzdGVtU3RvcmFnZTxCdWNrZXRXcml0ZVN0YXRzPihcIndyaXRlU3RhdHNcIik7XG59XG5cbi8vIENvdW50ZWQgaW4gbWVtb3J5IGFzIGRlbHRhcyBzaW5jZSB0aGUgbGFzdCBmbHVzaCwgc28gY291bnRpbmcgYSB3cml0ZSBuZXZlciB0b3VjaGVzIHRoZSBkaXNrLiBUaGUgZmx1c2ggcmVhZHMgdGhlIHN0b3JlZCB0b3RhbHMgYW5kIGFkZHMgdGhlIGRlbHRhLCB3aGljaCBhbHNvIG1ha2VzIGl0IGNvcnJlY3QgYWNyb3NzIHJlc3RhcnRzLlxuY29uc3Qgd3JpdGVTdGF0RGVsdGFzID0gbmV3IE1hcDxzdHJpbmcsIEJ1Y2tldFdyaXRlU3RhdHM+KCk7XG5cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoV3JpdGVTdGF0cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXdyaXRlU3RhdERlbHRhcy5zaXplKSByZXR1cm47XG4gICAgbGV0IHBlbmRpbmcgPSBbLi4ud3JpdGVTdGF0RGVsdGFzXTtcbiAgICB3cml0ZVN0YXREZWx0YXMuY2xlYXIoKTtcbiAgICBsZXQgc3RvcmFnZSA9IGF3YWl0IGdldFdyaXRlU3RhdHNTdG9yYWdlKCk7XG4gICAgZm9yIChsZXQgW2tleSwgZGVsdGFdIG9mIHBlbmRpbmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0KGtleSwgYWRkV3JpdGVTdGF0cyhhd2FpdCBzdG9yYWdlLmdldChrZXkpIHx8IGVtcHR5V3JpdGVTdGF0cygpLCBkZWx0YSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBQdXQgdGhlIGRlbHRhIGJhY2ssIHNvIGEgZmFpbGVkIGZsdXNoIGxvc2VzIG5vdGhpbmdcbiAgICAgICAgICAgIHdyaXRlU3RhdERlbHRhcy5zZXQoa2V5LCBhZGRXcml0ZVN0YXRzKHdyaXRlU3RhdERlbHRhcy5nZXQoa2V5KSB8fCBlbXB0eVdyaXRlU3RhdHMoKSwgZGVsdGEpKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZsdXNoaW5nIHdyaXRlIHN0YXRzIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3Qgc3RhcnRXcml0ZVN0YXRzRmx1c2hpbmcgPSBsYXp5KCgpID0+IHtcbiAgICBydW5JbmZpbml0ZVBvbGwoV1JJVEVfU1RBVFNfRkxVU0hfSU5URVJWQUwsIGZsdXNoV3JpdGVTdGF0cyk7XG59KTtcblxuZnVuY3Rpb24gY291bnRCdWNrZXRXcml0ZShrZXk6IHN0cmluZywga2luZDogXCJvcmlnaW5hbFwiIHwgXCJmbHVzaGVkXCIsIGJ5dGVzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgZGVsdGEgPSB3cml0ZVN0YXREZWx0YXMuZ2V0KGtleSk7XG4gICAgaWYgKCFkZWx0YSkge1xuICAgICAgICBkZWx0YSA9IGVtcHR5V3JpdGVTdGF0cygpO1xuICAgICAgICB3cml0ZVN0YXREZWx0YXMuc2V0KGtleSwgZGVsdGEpO1xuICAgIH1cbiAgICBpZiAoa2luZCA9PT0gXCJvcmlnaW5hbFwiKSB7XG4gICAgICAgIGRlbHRhLm9yaWdpbmFsV3JpdGVzKys7XG4gICAgICAgIGRlbHRhLm9yaWdpbmFsQnl0ZXMgKz0gYnl0ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGVsdGEuZmx1c2hlZFdyaXRlcysrO1xuICAgICAgICBkZWx0YS5mbHVzaGVkQnl0ZXMgKz0gYnl0ZXM7XG4gICAgfVxuICAgIHN0YXJ0V3JpdGVTdGF0c0ZsdXNoaW5nKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldFdyaXRlU3RhdHMoa2V5OiBzdHJpbmcpOiBQcm9taXNlPEJ1Y2tldFdyaXRlU3RhdHM+IHtcbiAgICBsZXQgc3RvcmFnZSA9IGF3YWl0IGdldFdyaXRlU3RhdHNTdG9yYWdlKCk7XG4gICAgbGV0IHN0b3JlZCA9IGF3YWl0IHN0b3JhZ2UuZ2V0KGtleSkgfHwgZW1wdHlXcml0ZVN0YXRzKCk7XG4gICAgbGV0IGRlbHRhID0gd3JpdGVTdGF0RGVsdGFzLmdldChrZXkpO1xuICAgIHJldHVybiBkZWx0YSAmJiBhZGRXcml0ZVN0YXRzKHN0b3JlZCwgZGVsdGEpIHx8IHN0b3JlZDtcbn1cblxuLyoqIFplcm9lcyB0aGUgd3JpdGUgc3RhdGlzdGljcyBvZiBldmVyeSBidWNrZXQgaW4gdGhlIGFjY291bnQsIGluY2x1ZGluZyBjb3VudHMgbm90IHlldCBmbHVzaGVkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyQWNjb3VudFdyaXRlU3RhdHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgc3RvcmFnZSA9IGF3YWl0IGdldFdyaXRlU3RhdHNTdG9yYWdlKCk7XG4gICAgbGV0IHByZWZpeCA9IGAke2FjY291bnR9L2A7XG4gICAgbGV0IGNsZWFyZWQgPSAwO1xuICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCBzdG9yYWdlLmdldEtleXMoKSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICB3cml0ZVN0YXREZWx0YXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2UucmVtb3ZlKGtleSk7XG4gICAgICAgIGNsZWFyZWQrKztcbiAgICB9XG4gICAgZm9yIChsZXQga2V5IG9mIFsuLi53cml0ZVN0YXREZWx0YXMua2V5cygpXSkge1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICB3cml0ZVN0YXREZWx0YXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGNsZWFyZWQrKztcbiAgICB9XG4gICAgY29uc29sZS5sb2coYENsZWFyZWQgdGhlIHdyaXRlIHN0YXRpc3RpY3Mgb2YgJHtjbGVhcmVkfSBidWNrZXRzIGluIGFjY291bnQgJHthY2NvdW50fWApO1xuICAgIHJldHVybiBjbGVhcmVkO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VHJ1c3RlZE1hY2hpbmVzKGNvbmZpZzogeyBhY2NvdW50OiBzdHJpbmc7IG1hY2hpbmVJZHM6IHN0cmluZ1tdIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgdHJ1c3QgPSBhd2FpdCBnZXRUcnVzdCgpO1xuICAgIGxldCBwcmVmaXggPSBgJHtjb25maWcuYWNjb3VudH18YDtcbiAgICBsZXQgZGVzaXJlZCA9IG5ldyBTZXQoY29uZmlnLm1hY2hpbmVJZHMpO1xuICAgIGZvciAobGV0IGtleSBvZiBhd2FpdCB0cnVzdC5nZXRLZXlzKCkpIHtcbiAgICAgICAgaWYgKCFrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSBjb250aW51ZTtcbiAgICAgICAgbGV0IG1hY2hpbmVJZCA9IGtleS5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgaWYgKGRlc2lyZWQuaGFzKG1hY2hpbmVJZCkpIHtcbiAgICAgICAgICAgIGRlc2lyZWQuZGVsZXRlKG1hY2hpbmVJZCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZpbmcgdHJ1c3QgZm9yIG1hY2hpbmUgJHttYWNoaW5lSWR9IG9uIGFjY291bnQgJHtjb25maWcuYWNjb3VudH1gKTtcbiAgICAgICAgYXdhaXQgdHJ1c3QucmVtb3ZlKGtleSk7XG4gICAgfVxuICAgIGZvciAobGV0IG1hY2hpbmVJZCBvZiBkZXNpcmVkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBZGRpbmcgdHJ1c3QgZm9yIG1hY2hpbmUgJHttYWNoaW5lSWR9IG9uIGFjY291bnQgJHtjb25maWcuYWNjb3VudH1gKTtcbiAgICAgICAgYXdhaXQgdHJ1c3Quc2V0KGAke3ByZWZpeH0ke21hY2hpbmVJZH1gLCB7IGFjY291bnQ6IGNvbmZpZy5hY2NvdW50LCBtYWNoaW5lSWQsIGlwOiBcIlwiLCB0aW1lOiBEYXRlLm5vdygpIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTG9hZGVkQnVja2V0ID0ge1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgcm91dGluZzogUmVtb3RlQ29uZmlnO1xuICAgIHJvdXRpbmdKU09OOiBzdHJpbmc7XG4gICAgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdO1xuICAgIHNlbGY6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBzdG9yZTogSUJ1Y2tldFN0b3JlO1xuICAgIHN0cnVjdHVyZUtleTogc3RyaW5nO1xufTtcblxuY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4+KCk7XG5cbmNvbnN0IE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZID0gMiAqKiAzMSAtIDE7XG5jb25zdCBSRUJVSUxEX0JPVU5EQVJZX0JVRkZFUiA9IDEwMDA7XG5jb25zdCBXUklURV9TVEFUU19GTFVTSF9JTlRFUlZBTCA9IDUgKiA2MCAqIDEwMDA7XG5cbmZ1bmN0aW9uIGdldEJ1Y2tldEZvbGRlcihhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCkuZm9sZGVyLCBcImJ1Y2tldHMyXCIsIGFjY291bnQsIGJ1Y2tldE5hbWUpO1xufVxuXG5jb25zdCBleHRyYUxpc3RlblBvcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5leHBvcnQgZnVuY3Rpb24gYWRkRXh0cmFMaXN0ZW5Qb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGV4dHJhTGlzdGVuUG9ydHMuYWRkKHBvcnQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUV4dHJhTGlzdGVuUG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBleHRyYUxpc3RlblBvcnRzLmRlbGV0ZShwb3J0KTtcbn1cbmZ1bmN0aW9uIGZpbmRTZWxmSW5kZXhlcyhyb3V0aW5nOiBSZW1vdGVDb25maWcsIGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCB7IGRvbWFpbiwgcG9ydCB9ID0gZ2V0U3RvcmFnZVNlcnZlckNvbmZpZygpO1xuICAgIGxldCBpbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGluZy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSByb3V0aW5nLnNvdXJjZXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZS50eXBlICE9PSBcInJlbW90ZVwiKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHNvdXJjZS51cmwpO1xuICAgICAgICBpZiAocGFyc2VkLmFkZHJlc3MgIT09IGRvbWFpbiB8fCBwYXJzZWQuYWNjb3VudCAhPT0gYWNjb3VudCB8fCBwYXJzZWQuYnVja2V0TmFtZSAhPT0gYnVja2V0TmFtZSkgY29udGludWU7XG4gICAgICAgIGlmIChwYXJzZWQucG9ydCA9PT0gcG9ydCB8fCBleHRyYUxpc3RlblBvcnRzLmhhcyhwYXJzZWQucG9ydCkpIHtcbiAgICAgICAgICAgIGluZGV4ZXMucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXhlcztcbn1cblxuZnVuY3Rpb24gc2VsZWN0RW50cnlBdChlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSwgdGltZTogbnVtYmVyLCByb3V0ZT86IG51bWJlcik6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHJvdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGNvdmVyaW5nID0gZW50cmllcy5maWx0ZXIoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSk7XG4gICAgICAgIGlmIChjb3ZlcmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVudHJpZXMgPSBjb3ZlcmluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29udGFpbmluZyA9IGVudHJpZXMuZmluZCh4ID0+IHgudmFsaWRXaW5kb3dbMF0gPD0gdGltZSAmJiB0aW1lIDwgeC52YWxpZFdpbmRvd1sxXSk7XG4gICAgaWYgKGNvbnRhaW5pbmcpIHJldHVybiBjb250YWluaW5nO1xuICAgIGxldCBiZXN0OiBIb3N0ZWRDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgbGV0IGRpc3RhbmNlID0gTWF0aC5taW4oTWF0aC5hYnModGltZSAtIGVudHJ5LnZhbGlkV2luZG93WzBdKSwgTWF0aC5hYnModGltZSAtIGVudHJ5LnZhbGlkV2luZG93WzFdKSk7XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgICAgICBiZXN0ID0gZW50cnk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJlc3Q7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlV2luZG93Qm91bmRhcnlSZWJ1aWxkKGxvYWRlZDogTG9hZGVkQnVja2V0KTogdm9pZCB7XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IGJvdW5kYXJpZXMgPSBsb2FkZWQuc2VsZkVudHJpZXMuZmxhdE1hcCh4ID0+IHgudmFsaWRXaW5kb3cpLmZpbHRlcih0ID0+IHQgPiBub3cpO1xuICAgIGlmICghYm91bmRhcmllcy5sZW5ndGgpIHJldHVybjtcbiAgICBsZXQgbmV4dEJvdW5kYXJ5ID0gTWF0aC5taW4oLi4uYm91bmRhcmllcyk7XG4gICAgbGV0IGtleSA9IGAke2xvYWRlZC5hY2NvdW50fS8ke2xvYWRlZC5idWNrZXROYW1lfWA7XG4gICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBsb2FkZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIDwgbmV4dEJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQobG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lLCB7IGZvcmNlOiB0cnVlLCByZWFzb246IFwiYSB2YWxpZCB3aW5kb3cgYm91bmRhcnkgcGFzc2VkXCIgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgfSwgTWF0aC5taW4obmV4dEJvdW5kYXJ5IC0gbm93ICsgUkVCVUlMRF9CT1VOREFSWV9CVUZGRVIsIE1BWF9SRUJVSUxEX1RJTUVSX0RFTEFZKSk7XG4gICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbn1cblxuY29uc3QgQk9VTkRBUllfU0NBTl9PRkZTRVRTID0gWy0zMCAqIDEwMDAsIDIgKiAxMDAwLCAzMCAqIDEwMDBdO1xuY29uc3QgQk9VTkRBUllfU0NBTl9MT09LQkFDSyA9IERFRkFVTFRfRkFTVF9XUklURV9ERUxBWSArIFdJTkRPV19FTkRfRkxVU0hfTUFSR0lOO1xuY29uc3QgU1RBUlRVUF9CT1VOREFSWV9TQ0FOX0RFTEFZID0gMzAgKiAxMDAwO1xuXG5jb25zdCBzY2hlZHVsZWRCb3VuZGFyeVNjYW5zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5jb25zdCBib3VuZGFyeVNjYW5zUnVubmluZyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5mdW5jdGlvbiBzY2hlZHVsZUJvdW5kYXJ5U2NhbnMobG9hZGVkOiBMb2FkZWRCdWNrZXQpOiB2b2lkIHtcbiAgICBsZXQga2V5ID0gYCR7bG9hZGVkLmFjY291bnR9LyR7bG9hZGVkLmJ1Y2tldE5hbWV9YDtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc3RhcnRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgZm9yIChsZXQgc2VsZiBvZiBsb2FkZWQuc2VsZkVudHJpZXMpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gc2VsZi52YWxpZFdpbmRvd1swXTtcbiAgICAgICAgaWYgKHN0YXJ0ID4gbm93ICYmIHN0YXJ0IDwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHN0YXJ0cy5hZGQoc3RhcnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHNlbGYgb2YgbG9hZGVkLnNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzZWxmLnZhbGlkV2luZG93O1xuICAgICAgICBpZiAoIShzdGFydCA8PSBub3cgJiYgbm93IDwgZW5kKSB8fCBzdGFydCA8PSAwKSBjb250aW51ZTtcbiAgICAgICAgaWYgKG5vdyAtIHN0YXJ0ID4gQk9VTkRBUllfU0NBTl9MT09LQkFDSykgY29udGludWU7XG4gICAgICAgIGxldCBzY2hlZHVsZUtleSA9IGAke2tleX18JHtzdGFydH18c3RhcnR1cGA7XG4gICAgICAgIGlmIChzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmhhcyhzY2hlZHVsZUtleSkpIGNvbnRpbnVlO1xuICAgICAgICBzY2hlZHVsZWRCb3VuZGFyeVNjYW5zLmFkZChzY2hlZHVsZUtleSk7XG4gICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBydW5Cb3VuZGFyeVNjYW4oa2V5LCBzdGFydCwgU1RBUlRVUF9CT1VOREFSWV9TQ0FOX0RFTEFZLCBcInN0YXJ0dXArMzBzXCIpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgQm91bmRhcnkgc2NhbiBmb3IgYnVja2V0ICR7a2V5fSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICAgICAgfSwgU1RBUlRVUF9CT1VOREFSWV9TQ0FOX0RFTEFZKTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICB9XG4gICAgZm9yIChsZXQgc3RhcnQgb2Ygc3RhcnRzKSB7XG4gICAgICAgIGZvciAobGV0IG9mZnNldCBvZiBCT1VOREFSWV9TQ0FOX09GRlNFVFMpIHtcbiAgICAgICAgICAgIGxldCBhdCA9IHN0YXJ0ICsgb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGF0IDw9IG5vdykgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGVLZXkgPSBgJHtrZXl9fCR7c3RhcnR9fCR7b2Zmc2V0fWA7XG4gICAgICAgICAgICBpZiAoc2NoZWR1bGVkQm91bmRhcnlTY2Fucy5oYXMoc2NoZWR1bGVLZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNjaGVkdWxlZEJvdW5kYXJ5U2NhbnMuYWRkKHNjaGVkdWxlS2V5KTtcbiAgICAgICAgICAgIGxldCBhcm0gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIDwgYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFybSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZvaWQgcnVuQm91bmRhcnlTY2FuKGtleSwgc3RhcnQsIG9mZnNldCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgICAgICAgICAgICAgIH0sIE1hdGgubWluKGF0IC0gRGF0ZS5ub3coKSwgTUFYX1JFQlVJTERfVElNRVJfREVMQVkpKTtcbiAgICAgICAgICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFybSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Cb3VuZGFyeVNjYW4oYnVja2V0S2V5OiBzdHJpbmcsIHdpbmRvd1N0YXJ0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyLCBvZmZzZXRMYWJlbD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYWJlbCA9IGBidWNrZXQgJHtidWNrZXRLZXl9LCB3aW5kb3cgc3RhcnRpbmcgJHtuZXcgRGF0ZSh3aW5kb3dTdGFydCkudG9JU09TdHJpbmcoKX0sIG9mZnNldCAke29mZnNldExhYmVsIHx8IGAke29mZnNldCAvIDEwMDB9c2B9YDtcbiAgICBpZiAoYm91bmRhcnlTY2Fuc1J1bm5pbmcuaGFzKGJ1Y2tldEtleSkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFNraXBwaW5nIGJvdW5kYXJ5IHNjYW4gKCR7bGFiZWx9KTogdGhlIHByZXZpb3VzIGJvdW5kYXJ5IHNjYW4gaXMgc3RpbGwgcnVubmluZ2ApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmFkZChidWNrZXRLZXkpO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBsb2FkZWQgPSBhd2FpdCBidWNrZXRzLmdldChidWNrZXRLZXkpO1xuICAgICAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgc3RvcmUgPSBsb2FkZWQuc3RvcmU7XG4gICAgICAgIGlmICghKHN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSkgcmV0dXJuO1xuICAgICAgICBsZXQgZWZmZWN0aXZlID0gbG9hZGVkLnJvdXRpbmc7XG4gICAgICAgIGxldCBzZWxmSW5kZXhlcyA9IGZpbmRTZWxmSW5kZXhlcyhlZmZlY3RpdmUsIGxvYWRlZC5hY2NvdW50LCBsb2FkZWQuYnVja2V0TmFtZSk7XG4gICAgICAgIGxldCBzZWxmSW5kZXhTZXQgPSBuZXcgU2V0KHNlbGZJbmRleGVzKTtcbiAgICAgICAgbGV0IHNlbHZlcyA9IHNlbGZJbmRleGVzLm1hcChpID0+IGVmZmVjdGl2ZS5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZykuZmlsdGVyKHggPT4geC52YWxpZFdpbmRvd1swXSA9PT0gd2luZG93U3RhcnQpO1xuICAgICAgICBpZiAoIXNlbHZlcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgbGV0IHByZXZUaW1lID0gd2luZG93U3RhcnQgLSAxO1xuICAgICAgICBsZXQgbmVlZERpc2tTY2FuID0gZmFsc2U7XG4gICAgICAgIGxldCByZW1vdGVPd25lcnMgPSBuZXcgTWFwPG51bWJlciwgW251bWJlciwgbnVtYmVyXT4oKTtcbiAgICAgICAgZm9yIChsZXQgc2VsZiBvZiBzZWx2ZXMpIHtcbiAgICAgICAgICAgIGxldCBzZWxmUm91dGUgPSBzZWxmLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICBsZXQgaWR4ID0gZWZmZWN0aXZlLnNvdXJjZXMuaW5kZXhPZihzZWxmKTtcbiAgICAgICAgICAgIGxldCBzaGFkb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpZHg7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBvdGhlciA9IGVmZmVjdGl2ZS5zb3VyY2VzW2pdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBbd3MsIHdlXSA9IG90aGVyLnZhbGlkV2luZG93O1xuICAgICAgICAgICAgICAgIGlmICghKHdzIDw9IHdpbmRvd1N0YXJ0ICYmIHdpbmRvd1N0YXJ0IDwgd2UpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgciA9IG90aGVyLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICAgICAgaWYgKHJbMF0gPD0gc2VsZlJvdXRlWzBdICYmIHNlbGZSb3V0ZVsxXSA8PSByWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNoYWRvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNoYWRvd2VkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB1bmNvdmVyZWQ6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtbc2VsZlJvdXRlWzBdLCBzZWxmUm91dGVbMV1dXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWZmZWN0aXZlLnNvdXJjZXMubGVuZ3RoICYmIHVuY292ZXJlZC5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBvdGhlciA9IGVmZmVjdGl2ZS5zb3VyY2VzW2pdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBbd3MsIHdlXSA9IG90aGVyLnZhbGlkV2luZG93O1xuICAgICAgICAgICAgICAgIGlmICghKHdzIDw9IHByZXZUaW1lICYmIHByZXZUaW1lIDwgd2UpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgciA9IG90aGVyLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgICAgICAgICAgbGV0IHJlbWFpbmluZzogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgICAgICAgICAgICAgbGV0IGNsYWltZWQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgdSBvZiB1bmNvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyID0gcm91dGVJbnRlcnNlY3Rpb24odSwgcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5wdXNoKHUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhaW1lZCA9IGNsYWltZWQgJiYgW01hdGgubWluKGNsYWltZWRbMF0sIGludGVyWzBdKSwgTWF0aC5tYXgoY2xhaW1lZFsxXSwgaW50ZXJbMV0pXSBhcyBbbnVtYmVyLCBudW1iZXJdIHx8IGludGVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodVswXSA8IGludGVyWzBdKSByZW1haW5pbmcucHVzaChbdVswXSwgaW50ZXJbMF1dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyWzFdIDwgdVsxXSkgcmVtYWluaW5nLnB1c2goW2ludGVyWzFdLCB1WzFdXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuY292ZXJlZCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICBpZiAoIWNsYWltZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmSW5kZXhTZXQuaGFzKGopKSB7XG4gICAgICAgICAgICAgICAgICAgIG5lZWREaXNrU2NhbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gcmVtb3RlT3duZXJzLmdldChqKTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlT3duZXJzLnNldChqLCBleGlzdGluZyAmJiBbTWF0aC5taW4oZXhpc3RpbmdbMF0sIGNsYWltZWRbMF0pLCBNYXRoLm1heChleGlzdGluZ1sxXSwgY2xhaW1lZFsxXSldIGFzIFtudW1iZXIsIG51bWJlcl0gfHwgY2xhaW1lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbmVlZERpc2tTY2FuICYmICFyZW1vdGVPd25lcnMuc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmxvZyhgQm91bmRhcnkgc2NhbiAoJHtsYWJlbH0pOiBkaXNrU2Nhbj0ke25lZWREaXNrU2Nhbn0sIHJlbW90ZSBwcmV2aW91cy13aW5kb3cgb3duZXJzOiAke3JlbW90ZU93bmVycy5zaXplfWApO1xuICAgICAgICBpZiAobmVlZERpc2tTY2FuKSB7XG4gICAgICAgICAgICBhd2FpdCBzdG9yZS5yZXNjYW5CYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNpbmNlID0gd2luZG93U3RhcnQgLSBCT1VOREFSWV9TQ0FOX0xPT0tCQUNLO1xuICAgICAgICBmb3IgKGxldCBbc291cmNlSW5kZXgsIHJvdXRlXSBvZiByZW1vdGVPd25lcnMpIHtcbiAgICAgICAgICAgIGxldCBvd25lclNvdXJjZSA9IGVmZmVjdGl2ZS5zb3VyY2VzW3NvdXJjZUluZGV4XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3duZXJTb3VyY2UgPT09IFwic3RyaW5nXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBzdG9yZS5ib3VuZGFyeVNjYW5SZW1vdGUoY3JlYXRlQXBpQXJjaGl2ZXMob3duZXJTb3VyY2UpLCB7IHNpbmNlLCByb3V0ZSB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBCb3VuZGFyeSBzY2FuICgke2xhYmVsfSkgb2YgcHJldmlvdXMtd2luZG93IG93bmVyIChzb3VyY2UgaW5kZXggJHtzb3VyY2VJbmRleH0pIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGJvdW5kYXJ5U2NhbnNSdW5uaW5nLmRlbGV0ZShidWNrZXRLZXkpO1xuICAgIH1cbn1cblxudHlwZSBTdG9yZVBsYW4gPSB7XG4gICAgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdO1xuICAgIHNlbGY6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICByYXdEaXNrOiBib29sZWFuO1xuICAgIHNvdXJjZVNwZWNzOiB7IHNvdXJjZUNvbmZpZz86IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZzsgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07IHJvdXRlPzogW251bWJlciwgbnVtYmVyXTsgbm9GdWxsU3luYz86IGJvb2xlYW4gfVtdO1xuICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICBzdHJ1Y3R1cmVLZXk6IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIHNvdXJjZUlkZW50aXR5KHNvdXJjZUNvbmZpZzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIXNvdXJjZUNvbmZpZykgcmV0dXJuIFwiZGlza1wiO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IC4uLnNvdXJjZUNvbmZpZywgdmFsaWRXaW5kb3c6IHVuZGVmaW5lZCwgcm91dGU6IHVuZGVmaW5lZCB9KTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0b3JlUGxhbihhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcm91dGluZzogUmVtb3RlQ29uZmlnKTogU3RvcmVQbGFuIHtcbiAgICBsZXQgc2VsZkluZGV4ZXMgPSBmaW5kU2VsZkluZGV4ZXMocm91dGluZywgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHNlbGZFbnRyaWVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gcm91dGluZy5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZyk7XG4gICAgbGV0IHNlbGYgPSBzZWxlY3RFbnRyeUF0KHNlbGZFbnRyaWVzLCBEYXRlLm5vdygpKTtcbiAgICBsZXQgc2VsZkluZGV4ID0gLTE7XG4gICAgaWYgKHNlbGYpIHtcbiAgICAgICAgc2VsZkluZGV4ID0gcm91dGluZy5zb3VyY2VzLmluZGV4T2Yoc2VsZik7XG4gICAgfVxuICAgIGxldCBkaXNrV2luZG93OiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgIGlmIChzZWxmKSB7XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzZWxmLnZhbGlkV2luZG93O1xuICAgICAgICBsZXQgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKG1lcmdlZCkge1xuICAgICAgICAgICAgbWVyZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBzZWxmRW50cmllcykge1xuICAgICAgICAgICAgICAgIGxldCBbZW50cnlTdGFydCwgZW50cnlFbmRdID0gZW50cnkudmFsaWRXaW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5U3RhcnQgPiBlbmQgfHwgZW50cnlFbmQgPCBzdGFydCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5U3RhcnQgPCBzdGFydCB8fCBlbnRyeUVuZCA+IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IE1hdGgubWluKHN0YXJ0LCBlbnRyeVN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gTWF0aC5tYXgoZW5kLCBlbnRyeUVuZCk7XG4gICAgICAgICAgICAgICAgICAgIG1lcmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRpc2tXaW5kb3cgPSBbc3RhcnQsIGVuZF07XG4gICAgfVxuICAgIGxldCBvd25JbmRleGVzID0gbmV3IFNldChzZWxmSW5kZXhlcyk7XG4gICAgbGV0IHNvdXJjZVNwZWNzOiBTdG9yZVBsYW5bXCJzb3VyY2VTcGVjc1wiXSA9IFt7XG4gICAgICAgIHZhbGlkV2luZG93OiBkaXNrV2luZG93LFxuICAgIH1dO1xuICAgIGlmIChzZWxmSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzZWxmSW5kZXggKyAxOyBpIDwgcm91dGluZy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlID0gcm91dGluZy5zb3VyY2VzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgb3duSW5kZXhlcy5oYXMoaSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHNoYXJlZFJvdXRlID0gcm91dGVJbnRlcnNlY3Rpb24oc2VsZj8ucm91dGUsIHNvdXJjZS5yb3V0ZSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFJvdXRlKSBjb250aW51ZTtcbiAgICAgICAgICAgIHNvdXJjZVNwZWNzLnB1c2goeyBzb3VyY2VDb25maWc6IHNvdXJjZSwgdmFsaWRXaW5kb3c6IHNvdXJjZS52YWxpZFdpbmRvdywgcm91dGU6IHNoYXJlZFJvdXRlLCBub0Z1bGxTeW5jOiBzb3VyY2Uubm9GdWxsU3luYyB8fCBzZWxmPy5ub0Z1bGxTeW5jIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCByYXdEaXNrID0gISFzZWxmPy5yYXdEaXNrO1xuICAgIGxldCBzdHJ1Y3R1cmVLZXkgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHJhd0Rpc2ssXG4gICAgICAgIHJlYWRlckRpc2tMaW1pdDogc2VsZj8ucmVhZGVyRGlza0xpbWl0LFxuICAgIH0pO1xuICAgIHJldHVybiB7IHNlbGZFbnRyaWVzLCBzZWxmLCByYXdEaXNrLCBzb3VyY2VTcGVjcywgcmVhZGVyRGlza0xpbWl0OiBzZWxmPy5yZWFkZXJEaXNrTGltaXQsIHN0cnVjdHVyZUtleSB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcm91dGluZzogUmVtb3RlQ29uZmlnLCBwbGFuPzogU3RvcmVQbGFuKTogTG9hZGVkQnVja2V0IHtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghcGxhbikge1xuICAgICAgICBwbGFuID0gY29tcHV0ZVN0b3JlUGxhbihhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKTtcbiAgICB9XG4gICAgbGV0IHsgc2VsZkVudHJpZXMsIHNlbGYgfSA9IHBsYW47XG4gICAgbGV0IHN0b3JlOiBJQnVja2V0U3RvcmU7XG4gICAgaWYgKHBsYW4ucmF3RGlzaykge1xuICAgICAgICBzdG9yZSA9IG5ldyBBcmNoaXZlc0Rpc2soZm9sZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXNlbGYpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaGlzIHNlcnZlciBpcyBub3QgaW4gdGhlIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiBubyBsb25nZXIgc3luY2hyb25pemluZywgdmFsaWQgd2luZG93IHRyZWF0ZWQgYXMgWzAsIDBdIChmYXN0IHdyaXRlcyBmbHVzaCBpbW1lZGlhdGVseSksIGRpc2sgZGF0YSBrZXB0IGFuZCBzZXJ2ZWRgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc291cmNlczogQXJjaGl2ZXNTb3VyY2VbXSA9IHBsYW4uc291cmNlU3BlY3MubWFwKHNwZWMgPT4gKHtcbiAgICAgICAgICAgIHNvdXJjZTogc3BlYy5zb3VyY2VDb25maWcgJiYgY3JlYXRlQXBpQXJjaGl2ZXMoc3BlYy5zb3VyY2VDb25maWcpIHx8IG5ldyBBcmNoaXZlc0Rpc2soZm9sZGVyKSxcbiAgICAgICAgICAgIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LFxuICAgICAgICAgICAgcm91dGU6IHNwZWMucm91dGUsXG4gICAgICAgICAgICBub0Z1bGxTeW5jOiBzcGVjLm5vRnVsbFN5bmMsXG4gICAgICAgICAgICBpZGVudGl0eTogc291cmNlSWRlbnRpdHkoc3BlYy5zb3VyY2VDb25maWcpLFxuICAgICAgICB9KSk7XG4gICAgICAgIHN0b3JlID0gbmV3IEJsb2JTdG9yZShmb2xkZXIsIHNvdXJjZXMsIHtcbiAgICAgICAgICAgIG9uSW5kZXhDaGFuZ2VkOiBrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09IFJPVVRJTkdfRklMRSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHZvaWQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogcGxhbi5yZWFkZXJEaXNrTGltaXQsXG4gICAgICAgICAgICBvbldyaXRlQ291bnRlZDogKGtpbmQsIGJ5dGVzKSA9PiBjb3VudEJ1Y2tldFdyaXRlKGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gLCBraW5kLCBieXRlcyksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkOiBMb2FkZWRCdWNrZXQgPSB7IGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHJvdXRpbmdKU09OOiBKU09OLnN0cmluZ2lmeShyb3V0aW5nKSwgc2VsZkVudHJpZXMsIHNlbGYsIHN0b3JlLCBzdHJ1Y3R1cmVLZXk6IHBsYW4uc3RydWN0dXJlS2V5IH07XG4gICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQobG9hZGVkKTtcbiAgICBzY2hlZHVsZUJvdW5kYXJ5U2NhbnMobG9hZGVkKTtcbiAgICByZXR1cm4gbG9hZGVkO1xufVxuXG4vKiogVGhlIHJvdXRpbmcgZmlsZSBpcyBvdXJzLCBvbiBvdXIgb3duIGRpc2ssIGF0IGEgcGF0aCB3ZSBrbm93IC0gc28gaXQgaXMgcmVhZCBkaXJlY3RseS4gR29pbmcgdGhyb3VnaCBhbiBBcmNoaXZlc0Rpc2sgd291bGQgY29uc3RydWN0IGEgd2hvbGUgc3RvcmUgKGhhbmRsZSBjYWNoZSBzd2VlcCBsb29wLCB1cGxvYWRzLWZvbGRlciBjbGVhbnVwKSBqdXN0IHRvIHJlYWQgb25lIGZpbGUuICovXG5mdW5jdGlvbiBnZXRSb3V0aW5nRmlsZVBhdGgoZm9sZGVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oZm9sZGVyLCBcImZpbGVzXCIsIFJPVVRJTkdfRklMRSk7XG59XG5hc3luYyBmdW5jdGlvbiByZWFkUm91dGluZ0ZpbGUoZm9sZGVyOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShnZXRSb3V0aW5nRmlsZVBhdGgoZm9sZGVyKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoKGUgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPT09IFwiRU5PRU5UXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZW1vdGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgZGF0YSA9IGF3YWl0IHJlYWRSb3V0aW5nRmlsZShnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpO1xuICAgIGlmICghZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghcm91dGluZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYnVpbGRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbG9hZGVkID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZCkge1xuICAgICAgICBsb2FkZWQgPSBsb2FkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICBidWNrZXRzLnNldChrZXksIGxvYWRlZCk7XG4gICAgICAgIHZvaWQgbG9hZGVkLnRoZW4oYnVja2V0ID0+IHtcbiAgICAgICAgICAgIGlmICghYnVja2V0ICYmIGJ1Y2tldHMuZ2V0KGtleSkgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldHMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIGlmIChidWNrZXRzLmdldChrZXkpID09PSBsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGxvYWRlZDtcbn1cblxuXG5jb25zdCByb3V0aW5nUmVsb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuZnVuY3Rpb24gc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBjb25maWc/OiB7IGZvcmNlPzogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IG5leHQgPSAocm91dGluZ1JlbG9hZHMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpXG4gICAgICAgIC50aGVuKCgpID0+IGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudCwgYnVja2V0TmFtZSwgY29uZmlnKSlcbiAgICAgICAgLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcihgUmVsb2FkaW5nIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHtrZXl9IGZhaWxlZDpgLCBlKSk7XG4gICAgcm91dGluZ1JlbG9hZHMuc2V0KGtleSwgbmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrUm91dGluZ0NoYW5nZWQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgZm9yY2U/OiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgYnVja2V0cy5nZXQoa2V5KTtcbiAgICBpZiAoIWxvYWRlZCkgcmV0dXJuO1xuICAgIGxldCByb3V0aW5nID0gYXdhaXQgcmVhZFJvdXRpbmdGcm9tRGlzayhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIXJvdXRpbmcpIHJldHVybjtcbiAgICBpZiAoIWNvbmZpZz8uZm9yY2UgJiYgSlNPTi5zdHJpbmdpZnkocm91dGluZykgPT09IGxvYWRlZC5yb3V0aW5nSlNPTikgcmV0dXJuO1xuICAgIGxldCByZWFzb24gPSBjb25maWc/LmZvcmNlICYmIChjb25maWcucmVhc29uIHx8IFwiZm9yY2VkXCIpIHx8IFwicm91dGluZyBjb25maWcgY2hhbmdlZFwiO1xuICAgIGxldCBwbGFuID0gY29tcHV0ZVN0b3JlUGxhbihhY2NvdW50LCBidWNrZXROYW1lLCByb3V0aW5nKTtcbiAgICBpZiAocGxhbi5zdHJ1Y3R1cmVLZXkgPT09IGxvYWRlZC5zdHJ1Y3R1cmVLZXkgJiYgbG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBBcHBseWluZyB0aGUgcm91dGluZyBjb25maWcgdG8gdGhlIHJ1bm5pbmcgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSlgKTtcbiAgICAgICAgbG9hZGVkLnN0b3JlLnVwZGF0ZVNvdXJjZXMocGxhbi5zb3VyY2VTcGVjcy5tYXAoc3BlYyA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDb25maWcgPSBzcGVjLnNvdXJjZUNvbmZpZztcbiAgICAgICAgICAgIGlmICghc291cmNlQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaWRlbnRpdHk6IHNvdXJjZUlkZW50aXR5KHVuZGVmaW5lZCksIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LCBjcmVhdGU6ICgpOiBJQXJjaGl2ZXMgPT4gbmV3IEFyY2hpdmVzRGlzayhnZXRCdWNrZXRGb2xkZXIoYWNjb3VudCwgYnVja2V0TmFtZSkpIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aXR5OiBzb3VyY2VJZGVudGl0eShzb3VyY2VDb25maWcpLFxuICAgICAgICAgICAgICAgIHZhbGlkV2luZG93OiBzcGVjLnZhbGlkV2luZG93LFxuICAgICAgICAgICAgICAgIHJvdXRlOiBzcGVjLnJvdXRlLFxuICAgICAgICAgICAgICAgIG5vRnVsbFN5bmM6IHNwZWMubm9GdWxsU3luYyxcbiAgICAgICAgICAgICAgICBjcmVhdGU6ICgpID0+IGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZUNvbmZpZyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIGxldCB1cGRhdGVkOiBMb2FkZWRCdWNrZXQgPSB7IC4uLmxvYWRlZCwgcm91dGluZywgcm91dGluZ0pTT046IEpTT04uc3RyaW5naWZ5KHJvdXRpbmcpLCBzZWxmRW50cmllczogcGxhbi5zZWxmRW50cmllcywgc2VsZjogcGxhbi5zZWxmIH07XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKHVwZGF0ZWQpKTtcbiAgICAgICAgc2NoZWR1bGVXaW5kb3dCb3VuZGFyeVJlYnVpbGQodXBkYXRlZCk7XG4gICAgICAgIHNjaGVkdWxlQm91bmRhcnlTY2Fucyh1cGRhdGVkKTtcbiAgICAgICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhgUmVidWlsZGluZyB0aGUgc3RvcmUgZm9yIGJ1Y2tldCAke2tleX0gKCR7cmVhc29ufSlgKTtcbiAgICBpZiAobG9hZGVkLnN0b3JlIGluc3RhbmNlb2YgQmxvYlN0b3JlKSB7XG4gICAgICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIHJvdXRpbmcsIHBsYW4pKSk7XG4gICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0V3JpdGVDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQsIHdyaXRlVGltZTogbnVtYmVyLCByb3V0ZTogbnVtYmVyKTogeyBmYXN0PzogYm9vbGVhbjsgd3JpdGVEZWxheT86IG51bWJlciB9IHtcbiAgICBsZXQgc2VsZiA9IHNlbGVjdEVudHJ5QXQoYnVja2V0LnNlbGZFbnRyaWVzLCB3cml0ZVRpbWUsIHJvdXRlKTtcbiAgICByZXR1cm4geyBmYXN0OiBzZWxmPy5mYXN0LCB3cml0ZURlbGF5OiBzZWxmPy53cml0ZURlbGF5IH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRNdXRhYmxlKGJ1Y2tldDogTG9hZGVkQnVja2V0LCBmaWxlUGF0aDogc3RyaW5nLCB3cml0ZVRpbWU6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBzZWxmID0gc2VsZWN0RW50cnlBdChidWNrZXQuc2VsZkVudHJpZXMsIHdyaXRlVGltZSwgZ2V0Um91dGUoZmlsZVBhdGgpKTtcbiAgICBpZiAoIXNlbGY/LmltbXV0YWJsZSkgcmV0dXJuO1xuICAgIGlmIChhd2FpdCBidWNrZXQuc3RvcmUuZ2V0SW5mbyhmaWxlUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHtidWNrZXQuYWNjb3VudH0vJHtidWNrZXQuYnVja2V0TmFtZX0gaXMgaW1tdXRhYmxlIChhdCB3cml0ZSB0aW1lICR7d3JpdGVUaW1lfSkgYW5kICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSBhbHJlYWR5IGV4aXN0cywgc28gaXQgY2Fubm90IGJlIHdyaXR0ZW4gdG9gKTtcbiAgICB9XG59XG5cbmNvbnN0IFdST05HX1RBUkdFVF9MT0dfVEhST1RUTEUgPSA2MCAqIDEwMDA7XG5sZXQgbGFzdFdyb25nVGFyZ2V0TG9nID0gMDtcbmZ1bmN0aW9uIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFdyb25nVGFyZ2V0TG9nIDwgV1JPTkdfVEFSR0VUX0xPR19USFJPVFRMRSkgcmV0dXJuO1xuICAgIGxhc3RXcm9uZ1RhcmdldExvZyA9IERhdGUubm93KCk7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG59XG5cbmNvbnN0IHJvdXRpbmdXcml0ZXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGluY29taW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICBsZXQgbG9hZGVkID0gYXdhaXQgZ2V0TG9hZGVkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIGF3YWl0IG5ldyBBcmNoaXZlc0Rpc2soZ2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpKS5zZXQoUk9VVElOR19GSUxFLCBkYXRhLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgICAgIGJ1Y2tldHMuc2V0KGtleSwgUHJvbWlzZS5yZXNvbHZlKGJ1aWxkQnVja2V0KGFjY291bnQsIGJ1Y2tldE5hbWUsIGluY29taW5nKSkpO1xuICAgICAgICBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhgQ3JlYXRlZCBidWNrZXQgJHtrZXl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KGluY29taW5nKSAhPT0gbG9hZGVkLnJvdXRpbmdKU09OICYmIGdldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpIDw9IGdldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gYENhbm5vdCB1cGRhdGUgcm91dGluZyBjb25maWcgZm9yIGJ1Y2tldCAke2tleX06IHRoZSBuZXcgY29uZmlnIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCBvbmUgYnV0IGl0cyB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24oaW5jb21pbmcpfSkgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uICgke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSkuIEluY3JlbWVudCB0aGUgdmVyc2lvbiB0byB1cGRhdGUgaXQuIEN1cnJlbnQ6ICR7bG9hZGVkLnJvdXRpbmdKU09OfS4gQXR0ZW1wdGVkOiAke0pTT04uc3RyaW5naWZ5KGluY29taW5nKX1gO1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIGxldCBzdG9yZWQgPSBpbmNvbWluZztcbiAgICBsZXQgcmVpbmplY3RlZCA9IDA7XG4gICAgZm9yIChsZXQgaW50ZXJtZWRpYXRlIG9mIGdldEludGVybWVkaWF0ZVNvdXJjZXMoZXhwaXJlSW50ZXJtZWRpYXRlU291cmNlcyhsb2FkZWQucm91dGluZywgRGF0ZS5ub3coKSkpKSB7XG4gICAgICAgIHN0b3JlZCA9IGluamVjdEludGVybWVkaWF0ZVNvdXJjZShzdG9yZWQsIHtcbiAgICAgICAgICAgIHNwbGl0VXJsOiBmaW5kU3BsaXRVcmwobG9hZGVkLnJvdXRpbmcsIGludGVybWVkaWF0ZSkgfHwgaW50ZXJtZWRpYXRlLnVybCxcbiAgICAgICAgICAgIGludGVybWVkaWF0ZVVybDogaW50ZXJtZWRpYXRlLnVybCxcbiAgICAgICAgICAgIHN0YXJ0OiBpbnRlcm1lZGlhdGUudmFsaWRXaW5kb3dbMF0sXG4gICAgICAgICAgICBlbmQ6IGludGVybWVkaWF0ZS52YWxpZFdpbmRvd1sxXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlaW5qZWN0ZWQrKztcbiAgICB9XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHN0b3JlZCkgIT09IEpTT04uc3RyaW5naWZ5KGluY29taW5nKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmUtaW5qZWN0ZWQgJHtyZWluamVjdGVkfSBpbi1mbGlnaHQgc3dpdGNob3ZlciB3aW5kb3dzIGludG8gdGhlIGluY29taW5nIHJvdXRpbmcgY29uZmlnIGZvciBidWNrZXQgJHtrZXl9ICh2ZXJzaW9uICR7Z2V0Q29uZmlnVmVyc2lvbihpbmNvbWluZyl9KWApO1xuICAgIH1cbiAgICBhd2FpdCBsb2FkZWQuc3RvcmUuc2V0KFJPVVRJTkdfRklMRSwgQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHN0b3JlZCkpLCB7IGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgYXdhaXQgc2NoZWR1bGVSb3V0aW5nUmVsb2FkKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVCdWNrZXRGaWxlKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgaWYgKGZpbGVQYXRoID09PSBST1VUSU5HX0ZJTEUpIHtcbiAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICBsZXQgcnVuID0gKHJvdXRpbmdXcml0ZXMuZ2V0KGtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oKCkgPT4gd3JpdGVSb3V0aW5nQ29uZmlnKGFjY291bnQsIGJ1Y2tldE5hbWUsIGRhdGEsIGNvbmZpZykpO1xuICAgICAgICByb3V0aW5nV3JpdGVzLnNldChrZXksIHJ1bi50aGVuKCgpID0+IHsgfSwgKCkgPT4geyB9KSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBydW47XG4gICAgfVxuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGRvZXMgbm90IGV4aXN0LiBXcml0ZSBpdHMgcm91dGluZyBjb25maWcgdG8gJHtKU09OLnN0cmluZ2lmeShST1VUSU5HX0ZJTEUpfSB0byBjcmVhdGUgaXQuYCk7XG4gICAgfVxuICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWc/Lmxhc3RNb2RpZmllZCB8fCBEYXRlLm5vdygpO1xuICAgIGxldCByb3V0ZSA9IGdldFJvdXRlKGZpbGVQYXRoKTtcbiAgICBpZiAoIWNvbmZpZz8ubGFzdE1vZGlmaWVkICYmIGxvYWRlZC5zZWxmRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IHRpbWVWYWxpZCA9IGxvYWRlZC5zZWxmRW50cmllcy5maWx0ZXIoeCA9PiB3cml0ZVRpbWUgPj0geC52YWxpZFdpbmRvd1swXSAmJiB3cml0ZVRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICAgICAgaWYgKCF0aW1lVmFsaWQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dXcm9uZ1RhcmdldFJlamVjdGlvbihgUmVqZWN0aW5nIGZyZXNoIHdyaXRlIG9mICR7SlNPTi5zdHJpbmdpZnkoZmlsZVBhdGgpfSB0byBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9OiB3cml0ZVRpbWUgJHt3cml0ZVRpbWV9ICgke25ldyBEYXRlKHdyaXRlVGltZSkudG9JU09TdHJpbmcoKX0pIGlzIG91dHNpZGUgYWxsIG91ciB2YWxpZCB3aW5kb3dzICR7SlNPTi5zdHJpbmdpZnkobG9hZGVkLnNlbGZFbnRyaWVzLm1hcCh4ID0+IHgudmFsaWRXaW5kb3cpKX0gKGEgc3dpdGNob3ZlciBtb3ZlZCB0aGUgd3JpdGUgdGFyZ2V0KWApO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke1NUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XfSBUaGlzIHNlcnZlciBpcyBub3QgYSB2YWxpZCB3cml0ZSB0YXJnZXQgYXQgJHt3cml0ZVRpbWV9IGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgdmFsaWQgd2luZG93czogJHtKU09OLnN0cmluZ2lmeShsb2FkZWQuc2VsZkVudHJpZXMubWFwKHggPT4geC52YWxpZFdpbmRvdykpfSkuIFJlLXJlc29sdmUgdGhlIGN1cnJlbnRseSB2YWxpZCBzb3VyY2UgYW5kIHJldHJ5LmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGltZVZhbGlkLnNvbWUoeCA9PiByb3V0ZUNvbnRhaW5zKHgucm91dGUsIHJvdXRlKSkpIHtcbiAgICAgICAgICAgIGxvZ1dyb25nVGFyZ2V0UmVqZWN0aW9uKGBSZWplY3RpbmcgZnJlc2ggd3JpdGUgb2YgJHtKU09OLnN0cmluZ2lmeShmaWxlUGF0aCl9IHRvIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IHJvdXRlICR7cm91dGV9IGlzIG91dHNpZGUgb3VyIHJvdXRlcyAke0pTT04uc3RyaW5naWZ5KHRpbWVWYWxpZC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpKX0gYXQgd3JpdGVUaW1lICR7d3JpdGVUaW1lfSAodGhlIGNsaWVudCdzIHNoYXJkIGNvbmZpZyBpcyBzdGFsZSlgKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtTVE9SQUdFX1dST05HX1JPVVRFfSBUaGlzIHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcm91dGUgJHtyb3V0ZX0gKGtleSAke0pTT04uc3RyaW5naWZ5KGZpbGVQYXRoKX0pIGZvciBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChvdXIgcm91dGVzIGF0IHRoaXMgdGltZTogJHtKU09OLnN0cmluZ2lmeSh0aW1lVmFsaWQubWFwKHggPT4geC5yb3V0ZSB8fCBGVUxMX1JPVVRFKSl9KS4gUmUtcmVzb2x2ZSB0aGUgc291cmNlIGZvciB0aGlzIGtleSBhbmQgcmV0cnkuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgYXNzZXJ0TXV0YWJsZShsb2FkZWQsIGZpbGVQYXRoLCB3cml0ZVRpbWUpO1xuICAgIGF3YWl0IGxvYWRlZC5zdG9yZS5zZXQoZmlsZVBhdGgsIGRhdGEsIHsgLi4uZ2V0V3JpdGVDb25maWcobG9hZGVkLCB3cml0ZVRpbWUsIHJvdXRlKSwgbGFzdE1vZGlmaWVkOiB3cml0ZVRpbWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWNrZXRDb25maWcoYnVja2V0OiBMb2FkZWRCdWNrZXQpOiBBcmNoaXZlc0NvbmZpZyB7XG4gICAgbGV0IHByb2dyZXNzID0gYnVja2V0LnN0b3JlLmdldFN5bmNQcm9ncmVzcz8uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6ICEhYnVja2V0LnN0b3JlLmdldENoYW5nZXNBZnRlcixcbiAgICAgICAgcmVtb3RlQ29uZmlnOiBidWNrZXQucm91dGluZyxcbiAgICAgICAgaW5kZXg6IHByb2dyZXNzPy5pbmRleCxcbiAgICAgICAgaW5kZXhTb3VyY2VzOiBwcm9ncmVzcz8uc291cmNlcyxcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0OiBwcm9ncmVzcz8ucmVhZGVyRGlza0xpbWl0LFxuICAgICAgICBzeW5jaW5nOiBwcm9ncmVzcz8uc3luY2luZyxcbiAgICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVidWlsZEFsbExvYWRlZEJ1Y2tldHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChsZXQga2V5IG9mIFsuLi5idWNrZXRzLmtleXMoKV0pIHtcbiAgICAgICAgbGV0IHNsYXNoID0ga2V5LmluZGV4T2YoXCIvXCIpO1xuICAgICAgICBhd2FpdCBzY2hlZHVsZVJvdXRpbmdSZWxvYWQoa2V5LnNsaWNlKDAsIHNsYXNoKSwga2V5LnNsaWNlKHNsYXNoICsgMSksIHsgZm9yY2U6IHRydWUsIHJlYXNvbjogXCJhbGwgbG9hZGVkIGJ1Y2tldHMgd2VyZSBhc2tlZCB0byByZWJ1aWxkXCIgfSk7XG4gICAgfVxufVxuXG5jb25zdCBPV05fQ09ORklHX1dSSVRFX1RIUk9UVExFID0gMzAgKiAxMDAwO1xuY29uc3QgSU5URVJNRURJQVRFX01BSU5UQUlOX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xubGV0IGxhc3RPd25Db25maWdXcml0ZSA9IDA7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlT3duUm91dGluZ0NvbmZpZyhsb2FkZWQ6IExvYWRlZEJ1Y2tldCwgdXBkYXRlZDogUmVtb3RlQ29uZmlnLCByZWFzb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBrZXkgPSBgJHtsb2FkZWQuYWNjb3VudH0vJHtsb2FkZWQuYnVja2V0TmFtZX1gO1xuICAgIGxldCBzaW5jZUxhc3QgPSBEYXRlLm5vdygpIC0gbGFzdE93bkNvbmZpZ1dyaXRlO1xuICAgIGlmIChzaW5jZUxhc3QgPCBPV05fQ09ORklHX1dSSVRFX1RIUk9UVExFKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBOb3Qgd3JpdGluZyBvdXIgb3duIHJvdXRpbmcgY29uZmlnIHVwZGF0ZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KTogdGhlIGxhc3Qgb25lIHdhcyAke3NpbmNlTGFzdH1tcyBhZ28sIHVuZGVyIHRoZSAke09XTl9DT05GSUdfV1JJVEVfVEhST1RUTEV9bXMgdGhyb3R0bGUuIFJldHJ5aW5nIG9uIHRoZSBuZXh0IG1haW50ZW5hbmNlIHBhc3MuIFdhbnRlZDogJHtKU09OLnN0cmluZ2lmeSh1cGRhdGVkKX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0T3duQ29uZmlnV3JpdGUgPSBEYXRlLm5vdygpO1xuICAgIGxldCB2ZXJzaW9uID0gbmV4dEludGVybWVkaWF0ZVZlcnNpb24oZ2V0Q29uZmlnVmVyc2lvbihsb2FkZWQucm91dGluZykpO1xuICAgIGxldCBuZXh0OiBSZW1vdGVDb25maWcgPSB7IC4uLnVwZGF0ZWQsIHZlcnNpb24gfTtcbiAgICBjb25zb2xlLmxvZyhgV3JpdGluZyBvdXIgb3duIHJvdXRpbmcgY29uZmlnIHVwZGF0ZSBmb3IgYnVja2V0ICR7a2V5fSAoJHtyZWFzb259KSwgdmVyc2lvbiAke2dldENvbmZpZ1ZlcnNpb24obG9hZGVkLnJvdXRpbmcpfSAtPiAke3ZlcnNpb259OiAke0pTT04uc3RyaW5naWZ5KG5leHQpfWApO1xuICAgIGxldCBkYXRhID0gQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKG5leHQpKTtcbiAgICBhd2FpdCB3cml0ZUJ1Y2tldEZpbGUobG9hZGVkLmFjY291bnQsIGxvYWRlZC5idWNrZXROYW1lLCBST1VUSU5HX0ZJTEUsIGRhdGEpO1xuICAgIGF3YWl0IHByb3BhZ2F0ZVJvdXRpbmdDb25maWcobG9hZGVkLCBuZXh0LCBkYXRhKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvcGFnYXRlUm91dGluZ0NvbmZpZyhsb2FkZWQ6IExvYWRlZEJ1Y2tldCwgbmV4dDogUmVtb3RlQ29uZmlnLCBkYXRhOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgdGFyZ2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWc+KCk7XG4gICAgZm9yIChsZXQgc291cmNlIG9mIFsuLi5sb2FkZWQucm91dGluZy5zb3VyY2VzLCAuLi5uZXh0LnNvdXJjZXNdKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiIHx8IHNvdXJjZS5pbnRlcm1lZGlhdGUpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQuYWNjb3VudCAhPT0gbG9hZGVkLmFjY291bnQgfHwgcGFyc2VkLmJ1Y2tldE5hbWUgIT09IGxvYWRlZC5idWNrZXROYW1lKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0cy5oYXMoc291cmNlLnVybCkpIGNvbnRpbnVlO1xuICAgICAgICB0YXJnZXRzLnNldChzb3VyY2UudXJsLCBzb3VyY2UpO1xuICAgIH1cbiAgICBmb3IgKGxldCBbdXJsLCBzb3VyY2VdIG9mIHRhcmdldHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNyZWF0ZUFwaUFyY2hpdmVzKHNvdXJjZSkuc2V0KFJPVVRJTkdfRklMRSwgZGF0YSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgUHJvcGFnYXRlZCBvdXIgcm91dGluZyBjb25maWcgdXBkYXRlIHRvICR7dXJsfWApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBQcm9wYWdhdGluZyBvdXIgcm91dGluZyBjb25maWcgdXBkYXRlIHRvICR7dXJsfSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW50YWluSW50ZXJtZWRpYXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeyBkb21haW4sIHBvcnQgfSA9IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKTtcbiAgICBsZXQgdGFrZW92ZXIgPSBnZXRUYWtlb3ZlckludGVybWVkaWF0ZSgpO1xuICAgIGZvciAobGV0IGtleSBvZiBbLi4uYnVja2V0cy5rZXlzKCldKSB7XG4gICAgICAgIGxldCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFsb2FkZWRQcm9taXNlKSBjb250aW51ZTtcbiAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IGxvYWRlZFByb21pc2UuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKCFsb2FkZWQpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgZXhwaXJlZCA9IGV4cGlyZUludGVybWVkaWF0ZVNvdXJjZXMobG9hZGVkLnJvdXRpbmcsIERhdGUubm93KCkpO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZXhwaXJlZCkgIT09IEpTT04uc3RyaW5naWZ5KGxvYWRlZC5yb3V0aW5nKSkge1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVPd25Sb3V0aW5nQ29uZmlnKGxvYWRlZCwgZXhwaXJlZCwgYHN3aXRjaG92ZXIgd2luZG93cyBleHBpcmVkIG1vcmUgdGhhbiAke0lOVEVSTUVESUFURV9FWFBJUkVfR1JBQ0UgLyAxMDAwfXMgYWdvYCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRha2VvdmVyKSBjb250aW51ZTtcbiAgICAgICAgbGV0IG1haW5VcmwgPSBsb2FkZWQucm91dGluZy5zb3VyY2VzLmZpbmQoeCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIgfHwgeC50eXBlICE9PSBcInJlbW90ZVwiIHx8IHguaW50ZXJtZWRpYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoeC51cmwpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlZC5hZGRyZXNzID09PSBkb21haW4gJiYgcGFyc2VkLnBvcnQgPT09IHBvcnQ7XG4gICAgICAgIH0pIGFzIEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFtYWluVXJsKSBjb250aW51ZTtcbiAgICAgICAgbGV0IGluamVjdGVkID0gaW5qZWN0SW50ZXJtZWRpYXRlU291cmNlKGxvYWRlZC5yb3V0aW5nLCB7XG4gICAgICAgICAgICBzcGxpdFVybDogbWFpblVybC51cmwsXG4gICAgICAgICAgICBpbnRlcm1lZGlhdGVVcmw6IHJlcGxhY2VIb3N0ZWRVcmxQb3J0KG1haW5VcmwudXJsLCB0YWtlb3Zlci5hbHRQb3J0KSxcbiAgICAgICAgICAgIHN0YXJ0OiB0YWtlb3Zlci5zdGFydCxcbiAgICAgICAgICAgIGVuZDogdGFrZW92ZXIuZW5kLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGluamVjdGVkKSA9PT0gSlNPTi5zdHJpbmdpZnkobG9hZGVkLnJvdXRpbmcpKSBjb250aW51ZTtcbiAgICAgICAgYXdhaXQgd3JpdGVPd25Sb3V0aW5nQ29uZmlnKGxvYWRlZCwgaW5qZWN0ZWQsIGB3ZSBhcmUgYSBkZXBsb3kgc3VjY2Vzc29yOiB3cml0ZXMgcm91dGUgdG8gb3VyIGFsdGVybmF0ZSBwb3J0ICR7dGFrZW92ZXIuYWx0UG9ydH0gZnJvbSAke25ldyBEYXRlKHRha2VvdmVyLnN0YXJ0KS50b0lTT1N0cmluZygpfSB1bnRpbCBvdXIgcHJlZGVjZXNzb3IgaXMga2lsbGVkIGF0ICR7bmV3IERhdGUodGFrZW92ZXIuZW5kKS50b0lTT1N0cmluZygpfWApO1xuICAgIH1cbn1cblxuLyoqIFN0YXJ0ZWQgYnkgZGVwbG95VGFrZW92ZXIgb25jZSB3ZSBhcmUgYWN0dWFsbHkgYSBkZXBsb3kgc3VjY2Vzc29yIGxpc3RlbmluZyBvbiBhbiBhbHRlcm5hdGUgcG9ydC4gVW50aWwgdGhlbiB0aGVyZSBhcmUgbm8gc3dpdGNob3ZlciB3aW5kb3dzIHRvIHdyaXRlIG9yIGV4cGlyZSwgc28gbm90aGluZyBwb2xscy4gKi9cbmV4cG9ydCBjb25zdCBzdGFydEludGVybWVkaWF0ZU1haW50ZW5hbmNlID0gbGF6eSgoKSA9PiB7XG4gICAgdm9pZCBtYWludGFpbkludGVybWVkaWF0ZXMoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYE1haW50YWluaW5nIHN3aXRjaG92ZXIgcm91dGluZyB3aW5kb3dzIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgIHJ1bkluZmluaXRlUG9sbChJTlRFUk1FRElBVEVfTUFJTlRBSU5fSU5URVJWQUwsIG1haW50YWluSW50ZXJtZWRpYXRlcyk7XG59KTtcblxuZXhwb3J0IHR5cGUgQnVja2V0RGlza0luZm8gPSB7XG4gICAgdG90YWxCeXRlczogbnVtYmVyO1xuICAgIGZyZWVCeXRlczogbnVtYmVyO1xuICAgIHVzZWRCeXRlczogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIFNlcnZlckJ1Y2tldEluZm8gPSB7XG4gICAgYnVja2V0TmFtZTogc3RyaW5nO1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICAvKiogV2hlcmUgdGhlIGJ1Y2tldCdzIGRhdGEgbGl2ZXMgb24gdGhpcyBzZXJ2ZXIgKi9cbiAgICBmb2xkZXI6IHN0cmluZztcbiAgICAvKiogVGhlIGRyaXZlIHRoYXQgZm9sZGVyIGlzIG9uLiBCdWNrZXRzIHNoYXJpbmcgYSBkcml2ZSByZXBvcnQgdGhlIHNhbWUgbnVtYmVycy4gKi9cbiAgICBkaXNrPzogQnVja2V0RGlza0luZm87XG4gICAgZGlza0Vycm9yPzogc3RyaW5nO1xuICAgIHdyaXRlU3RhdHM/OiBCdWNrZXRXcml0ZVN0YXRzO1xuICAgIGNvbmZpZz86IEFyY2hpdmVzQ29uZmlnO1xuICAgIGVycm9yPzogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGlza0luZm8oZm9sZGVyOiBzdHJpbmcpOiBQcm9taXNlPEJ1Y2tldERpc2tJbmZvPiB7XG4gICAgbGV0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdGZzKGZvbGRlcik7XG4gICAgbGV0IGJsb2NrU2l6ZSA9IE51bWJlcihzdGF0cy5ic2l6ZSk7XG4gICAgbGV0IHRvdGFsQnl0ZXMgPSBOdW1iZXIoc3RhdHMuYmxvY2tzKSAqIGJsb2NrU2l6ZTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0b3RhbEJ5dGVzLFxuICAgICAgICAvLyBNYXRjaGVzIHRoZSBzZXJ2ZXIncyBvd24gbG93LXNwYWNlIGNoZWNrOiB3aGF0IGFuIHVucHJpdmlsZWdlZCBwcm9jZXNzIGNhbiBhY3R1YWxseSB1c2VcbiAgICAgICAgZnJlZUJ5dGVzOiBOdW1iZXIoc3RhdHMuYmF2YWlsKSAqIGJsb2NrU2l6ZSxcbiAgICAgICAgdXNlZEJ5dGVzOiB0b3RhbEJ5dGVzIC0gTnVtYmVyKHN0YXRzLmJmcmVlKSAqIGJsb2NrU2l6ZSxcbiAgICB9O1xufVxuXG5leHBvcnQgdHlwZSBBY3RpdmVCdWNrZXRJbmZvID0ge1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgcm91dGluZyBjb25maWcgdGhlIGJ1Y2tldCBpcyBSVU5OSU5HIG9uLCBzdHJhaWdodCBmcm9tIG1lbW9yeSAtIGluY2x1ZGluZyBzd2l0Y2hvdmVyIHdpbmRvd3Mgd3JpdHRlbiBzaW5jZSBpdCBsb2FkZWQgKi9cbiAgICByb3V0aW5nOiBSZW1vdGVDb25maWc7XG4gICAgLyoqIE91ciBvd24gZW50cmllcyBpbiB0aGF0IGNvbmZpZywgYW5kIHRoZSBvbmUgY3VycmVudGx5IHZhbGlkICovXG4gICAgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdO1xuICAgIHNlbGY/OiBIb3N0ZWRDb25maWc7XG4gICAgY29uZmlnOiBBcmNoaXZlc0NvbmZpZztcbn07XG5cbi8qKiBUaGUgbGl2ZSBpbi1tZW1vcnkgc3RhdGUgb2YgT05FIGJ1Y2tldCwgYW5zd2VyZWQgd2l0aG91dCB0b3VjaGluZyB0aGUgZGlzayAobm8gcm91dGluZyBmaWxlIHJlYWQsIG5vIHN0YXRmcywgbm8gc3RvcmVkIHdyaXRlIHN0YXRzKS4gUmV0dXJucyBhbiBlcnJvciBzdHJpbmcgd2hlbiB0aGUgYnVja2V0IGlzIG5vdCBsb2FkZWQgaGVyZSwgd2hpY2ggaXMgdGhlIG5vcm1hbCBzdGF0ZSBmb3IgYSBidWNrZXQgbm90aGluZyBoYXMgYWNjZXNzZWQgc2luY2Ugc3RhcnR1cC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBY3RpdmVCdWNrZXQoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFjdGl2ZUJ1Y2tldEluZm8gfCBzdHJpbmc+IHtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGxvYWRlZFByb21pc2UgPSBidWNrZXRzLmdldChrZXkpO1xuICAgIGlmICghbG9hZGVkUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gaXMgbm90IGxvYWRlZCBvbiB0aGlzIHNlcnZlciwgc28gaXQgaGFzIG5vIGxpdmUgc3RhdGUgKGl0IGxvYWRzIG9uIGZpcnN0IGFjY2VzcylgO1xuICAgIH1cbiAgICBsZXQgbG9hZGVkOiBMb2FkZWRCdWNrZXQgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgbG9hZGVkID0gYXdhaXQgbG9hZGVkUHJvbWlzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBmYWlsZWQgdG8gbG9hZCBvbiB0aGlzIHNlcnZlcjogJHtTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCl9YDtcbiAgICB9XG4gICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgcmV0dXJuIGBCdWNrZXQgJHtrZXl9IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgc2VydmVyYDtcbiAgICB9XG4gICAgcmV0dXJuIHRvQWN0aXZlQnVja2V0SW5mbyhsb2FkZWQpO1xufVxuXG5mdW5jdGlvbiB0b0FjdGl2ZUJ1Y2tldEluZm8obG9hZGVkOiBMb2FkZWRCdWNrZXQpOiBBY3RpdmVCdWNrZXRJbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmb2xkZXI6IGdldEJ1Y2tldEZvbGRlcihsb2FkZWQuYWNjb3VudCwgbG9hZGVkLmJ1Y2tldE5hbWUpLFxuICAgICAgICByb3V0aW5nOiBsb2FkZWQucm91dGluZyxcbiAgICAgICAgc2VsZkVudHJpZXM6IGxvYWRlZC5zZWxmRW50cmllcyxcbiAgICAgICAgc2VsZjogbG9hZGVkLnNlbGYsXG4gICAgICAgIGNvbmZpZzogZ2V0QnVja2V0Q29uZmlnKGxvYWRlZCksXG4gICAgfTtcbn1cblxuLyoqIExvYWRzIGEgYnVja2V0IHRoYXQgZXhpc3RzIG9uIHRoaXMgc2VydmVyJ3MgZGlzayBpbnRvIG1lbW9yeSwgd2hpY2ggc3RhcnRzIGl0cyBzeW5jaHJvbml6YXRpb24gYW5kIHdpbmRvdyB0aW1lcnMsIGFuZCByZXR1cm5zIGl0cyBsaXZlIHN0YXRlLiBOb3RoaW5nIGlzIHdyaXR0ZW4gYW5kIG5vIG90aGVyIHNlcnZlciBpcyBjb250YWN0ZWQgLSB1bmxpa2UgYnVpbGRpbmcgYW4gQXJjaGl2ZXNDaGFpbiBmb3IgaXQsIHdoaWNoIHdvdWxkIHByb2JlIGV2ZXJ5IHNvdXJjZSBhbmQgY291bGQgd3JpdGUgdGhlIHJvdXRpbmcgY29uZmlnLiBBbHJlYWR5LWxvYWRlZCBidWNrZXRzIGp1c3QgcmV0dXJuIHRoZWlyIHN0YXRlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlQnVja2V0KGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVCdWNrZXRJbmZvIHwgc3RyaW5nPiB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCB3YXNMb2FkZWQgPSBidWNrZXRzLmhhcyhrZXkpO1xuICAgIGxldCBsb2FkZWQ6IExvYWRlZEJ1Y2tldCB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgICBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gZmFpbGVkIHRvIGxvYWQgb24gdGhpcyBzZXJ2ZXI6ICR7U3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApfWA7XG4gICAgfVxuICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlciAobm8gcm91dGluZyBmaWxlIGluICR7Z2V0QnVja2V0Rm9sZGVyKGFjY291bnQsIGJ1Y2tldE5hbWUpfSlgO1xuICAgIH1cbiAgICBpZiAoIXdhc0xvYWRlZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgQWN0aXZhdGVkIGJ1Y2tldCAke2tleX0gb24gcmVxdWVzdDogaXQgaXMgbm93IGxvYWRlZCBhbmQgc3luY2hyb25pemluZ2ApO1xuICAgIH1cbiAgICByZXR1cm4gdG9BY3RpdmVCdWNrZXRJbmZvKGxvYWRlZCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGxldCB0aW1pbmdzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICBhc3luYyBmdW5jdGlvbiB0aW1lZDxUPihuYW1lOiBzdHJpbmcsIHJ1bjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBsZXQgYmVnYW4gPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGltaW5ncy5zZXQobmFtZSwgKHRpbWluZ3MuZ2V0KG5hbWUpIHx8IDApICsgKERhdGUubm93KCkgLSBiZWdhbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBhY2NvdW50Rm9sZGVyID0gcGF0aC5qb2luKGdldFN0b3JhZ2VTZXJ2ZXJDb25maWcoKS5mb2xkZXIsIFwiYnVja2V0czJcIiwgYWNjb3VudCk7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICB0cnkge1xuICAgICAgICBuYW1lcyA9IGF3YWl0IHRpbWVkKFwicmVhZGRpclwiLCAoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKGFjY291bnRGb2xkZXIpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwobmFtZXMubWFwKGFzeW5jIGJ1Y2tldE5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICAgICAgbGV0IGZvbGRlciA9IGdldEJ1Y2tldEZvbGRlcihhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICAgICAgICAgIGxldCBiYXNlOiBTZXJ2ZXJCdWNrZXRJbmZvID0geyBidWNrZXROYW1lLCBhY3RpdmU6IGZhbHNlLCBmb2xkZXIgfTtcbiAgICAgICAgICAgIGxldCBbZGlzaywgd3JpdGVTdGF0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGltZWQoXCJzdGF0ZnNcIiwgKCkgPT4gZ2V0RGlza0luZm8oZm9sZGVyKSkuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJhc2UuZGlza0Vycm9yID0gU3RyaW5nKGUuc3RhY2sgPz8gZSkuc2xpY2UoMCwgNTAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aW1lZChcIndyaXRlU3RhdHNcIiwgKCkgPT4gZ2V0QnVja2V0V3JpdGVTdGF0cyhrZXkpKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgYmFzZS5kaXNrID0gZGlzaztcbiAgICAgICAgICAgIGJhc2Uud3JpdGVTdGF0cyA9IHdyaXRlU3RhdHM7XG4gICAgICAgICAgICBjb25zdCBsb2FkZWRQcm9taXNlID0gYnVja2V0cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2FkZWRQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvYWRlZCA9IGF3YWl0IHRpbWVkKFwiYXdhaXRMb2FkZWRcIiwgKCkgPT4gbG9hZGVkUHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGFjdGl2ZTogdHJ1ZSwgY29uZmlnOiBnZXRCdWNrZXRDb25maWcobG9hZGVkKSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBhY3RpdmU6IHRydWUsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aW1lZChcInJlYWRSb3V0aW5nRmlsZVwiLCAoKSA9PiByZWFkUm91dGluZ0ZpbGUoZm9sZGVyKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBgTm8gcm91dGluZyBmaWxlICgke1JPVVRJTkdfRklMRX0pYCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gYXdhaXQgdGltZWQoXCJwYXJzZVJvdXRpbmdcIiwgYXN5bmMgKCkgPT4gcGFyc2VSb3V0aW5nRGF0YShkYXRhKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgY29uZmlnOiB7IHJlbW90ZUNvbmZpZzogcGFyc2VkIH0gfTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iYXNlLCBlcnJvcjogU3RyaW5nKChlIGFzIEVycm9yKS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBUaGUgcGFydHMgcnVuIGNvbmN1cnJlbnRseSwgc28gdGhlc2UgYXJlIHN1bW1lZCB3YWxsIHRpbWVzIHBlciBwYXJ0LCBub3QgYSBicmVha2Rvd24gb2YgdGhlIHRvdGFsXG4gICAgICAgIGxldCBwYXJ0cyA9IFsuLi50aW1pbmdzXS5tYXAoKFtuYW1lLCBtc10pID0+IGAke25hbWV9ICR7bXN9bXNgKS5qb2luKFwiLCBcIik7XG4gICAgICAgIGNvbnNvbGUubG9nKGBsaXN0QWNjb3VudEJ1Y2tldHMoJHthY2NvdW50fSkgdG9vayAke0RhdGUubm93KCkgLSBzdGFydH1tcyBmb3IgJHtuYW1lcy5sZW5ndGh9IGJ1Y2tldHM6ICR7cGFydHN9YCk7XG4gICAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQnVja2V0RmlsZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChmaWxlUGF0aCA9PT0gUk9VVElOR19GSUxFKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJvdXRpbmcgY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gY2Fubm90IGJlIGRlbGV0ZWQgKG92ZXJ3cml0ZSBpdCB0byBjaGFuZ2UgdGhlIGJ1Y2tldCdzIGNvbmZpZ3VyYXRpb24pYCk7XG4gICAgfVxuICAgIGxldCBsb2FkZWQgPSBhd2FpdCBnZXRMb2FkZWRCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFsb2FkZWQpIHJldHVybjtcbiAgICBhd2FpdCBsb2FkZWQuc3RvcmUuZGVsKGZpbGVQYXRoLCBnZXRXcml0ZUNvbmZpZyhsb2FkZWQsIERhdGUubm93KCksIGdldFJvdXRlKGZpbGVQYXRoKSkpO1xufVxuXG5jb25zdCBMQVJHRV9GSUxFX1BBUlRfU0laRSA9IDggKiAxMDI0ICogMTAyNDtcblxuY2xhc3MgQXJjaGl2ZXNMb2NhbEJ1Y2tldCBpbXBsZW1lbnRzIElBcmNoaXZlcyB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhY2NvdW50OiBzdHJpbmcsIHByaXZhdGUgYnVja2V0TmFtZTogc3RyaW5nKSB7IH1cblxuICAgIHByaXZhdGUgYXN5bmMgZ2V0QnVja2V0KCk6IFByb21pc2U8TG9hZGVkQnVja2V0IHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRMb2FkZWRCdWNrZXQodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKSB7XG4gICAgICAgIHJldHVybiBgbG9jYWxCdWNrZXQgYWNjb3VudCAke3RoaXMuYWNjb3VudH0gYnVja2V0ICR7dGhpcy5idWNrZXROYW1lfWA7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQoZmlsZU5hbWU6IHN0cmluZywgY29uZmlnPzogeyByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB9KTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZGF0YSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXQyKGZpbGVOYW1lOiBzdHJpbmcsIGNvbmZpZz86IHsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0gfSk6IFByb21pc2U8eyBkYXRhOiBCdWZmZXI7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0MihmaWxlTmFtZSwgY29uZmlnKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBhd2FpdCB3cml0ZUJ1Y2tldEZpbGUodGhpcy5hY2NvdW50LCB0aGlzLmJ1Y2tldE5hbWUsIGZpbGVOYW1lLCBkYXRhLCBjb25maWcpO1xuICAgICAgICByZXR1cm4gZmlsZU5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBkZWxldGVCdWNrZXRGaWxlKHRoaXMuYWNjb3VudCwgdGhpcy5idWNrZXROYW1lLCBmaWxlTmFtZSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBzZXRMYXJnZUZpbGUoY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7dGhpcy5hY2NvdW50fS8ke3RoaXMuYnVja2V0TmFtZX0gZG9lcyBub3QgZXhpc3QuIFdyaXRlIGl0cyByb3V0aW5nIGNvbmZpZyB0byAke0pTT04uc3RyaW5naWZ5KFJPVVRJTkdfRklMRSl9IHRvIGNyZWF0ZSBpdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBhc3NlcnRNdXRhYmxlKGJ1Y2tldCwgY29uZmlnLnBhdGgsIERhdGUubm93KCkpO1xuICAgICAgICBsZXQgaWQgPSBhd2FpdCBidWNrZXQuc3RvcmUuc3RhcnRMYXJnZVVwbG9hZCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGNvbmZpZy5nZXROZXh0RGF0YSgpO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGF0YS5sZW5ndGg7IG9mZnNldCArPSBMQVJHRV9GSUxFX1BBUlRfU0laRSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuYXBwZW5kTGFyZ2VVcGxvYWQoaWQsIGRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBMQVJHRV9GSUxFX1BBUlRfU0laRSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGJ1Y2tldC5zdG9yZS5maW5pc2hMYXJnZVVwbG9hZChpZCwgY29uZmlnLnBhdGgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBhd2FpdCBidWNrZXQuc3RvcmUuY2FuY2VsTGFyZ2VVcGxvYWQoaWQpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBsZXQgYnVja2V0ID0gYXdhaXQgdGhpcy5nZXRCdWNrZXQoKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0SW5mbyhmaWxlTmFtZSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaW5kSW5mbyhwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gW107XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZmluZEluZm8ocHJlZml4LCBjb25maWcpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZmluZChwcmVmaXg6IHN0cmluZywgY29uZmlnPzogeyBzaGFsbG93PzogYm9vbGVhbjsgdHlwZTogXCJmaWxlc1wiIHwgXCJmb2xkZXJzXCIgfSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmZpbmRJbmZvKHByZWZpeCwgY29uZmlnKSkubWFwKHggPT4geC5wYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldFVSTChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IHsgZG9tYWluLCBwb3J0IH0gPSBnZXRTdG9yYWdlU2VydmVyQ29uZmlnKCk7XG4gICAgICAgIHJldHVybiBidWlsZEZpbGVVcmwoYGh0dHBzOi8vJHtkb21haW59OiR7cG9ydH0vZmlsZS8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmFjY291bnQpfS8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmJ1Y2tldE5hbWUpfWAsIGZpbGVQYXRoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldENvbmZpZygpOiBQcm9taXNlPEFyY2hpdmVzQ29uZmlnPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHsgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IHRydWUgfTtcbiAgICAgICAgcmV0dXJuIGdldEJ1Y2tldENvbmZpZyhidWNrZXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2hhbmdlc0FmdGVyKHRpbWU6IG51bWJlcik6IFByb21pc2U8QXJjaGl2ZUZpbGVJbmZvW10+IHtcbiAgICAgICAgbGV0IGJ1Y2tldCA9IGF3YWl0IHRoaXMuZ2V0QnVja2V0KCk7XG4gICAgICAgIGlmICghYnVja2V0KSByZXR1cm4gW107XG4gICAgICAgIGlmICghYnVja2V0LnN0b3JlLmdldENoYW5nZXNBZnRlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWNrZXQgJHt0aGlzLmFjY291bnR9LyR7dGhpcy5idWNrZXROYW1lfSBkb2VzIG5vdCBzdXBwb3J0IGdldENoYW5nZXNBZnRlciAocmF3RGlzayBidWNrZXRzIGhhdmUgbm8gaW5kZXgpYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1Y2tldC5zdG9yZS5nZXRDaGFuZ2VzQWZ0ZXIodGltZSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRTeW5jU3RhdHVzKCk6IFByb21pc2U8QXJjaGl2ZXNTeW5jU3RhdHVzPiB7XG4gICAgICAgIGxldCBidWNrZXQgPSBhd2FpdCB0aGlzLmdldEJ1Y2tldCgpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgcmV0dXJuIHsgYWxsU2NhbnNDb21wbGV0ZTogdHJ1ZSwgaW5kZXhTaXplOiAwLCBzb3VyY2VzOiBbXSB9O1xuICAgICAgICBpZiAoIWJ1Y2tldC5zdG9yZS5nZXRTeW5jU3RhdHVzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1Y2tldCAke3RoaXMuYWNjb3VudH0vJHt0aGlzLmJ1Y2tldE5hbWV9IGRvZXMgbm90IHN1cHBvcnQgZ2V0U3luY1N0YXR1cyAocmF3RGlzayBidWNrZXRzIGhhdmUgbm8gc3luY2hyb25pemF0aW9uKWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBidWNrZXQuc3RvcmUuZ2V0U3luY1N0YXR1cygpO1xuICAgIH1cbn1cblxuY29uc3QgbG9jYWxBcmNoaXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBJQXJjaGl2ZXM+KCk7XG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxBcmNoaXZlcyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IElBcmNoaXZlcyB7XG4gICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgIGxldCBleGlzdGluZyA9IGxvY2FsQXJjaGl2ZXMuZ2V0KGtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgbGV0IGFyY2hpdmVzID0gbmV3IEFyY2hpdmVzTG9jYWxCdWNrZXQoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbG9jYWxBcmNoaXZlcy5zZXQoa2V5LCBhcmNoaXZlcyk7XG4gICAgcmV0dXJuIGFyY2hpdmVzO1xufVxuIl19
1043
+ /* _JS_SOURCE_HASH = "dba045cf4ff38fdcf81bba56faca67da475efaf50b95ff6835503d872c461af0"; */